sliccy 6.178.1 → 6.178.2

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.
Files changed (170) hide show
  1. package/dist/ui/.vite/manifest.json +182 -182
  2. package/dist/ui/assets/{SKILL-BflWplWz.js → SKILL-B8Oawe6a.js} +1 -1
  3. package/dist/ui/assets/SKILL-CJrjPuRt.js +1 -0
  4. package/dist/ui/assets/{account-store-DoN97hFH.js → account-store-LwLxI7v1.js} +1 -1
  5. package/dist/ui/assets/{account-store-BBDgfG4U.js → account-store-SI8RQbm0.js} +1 -1
  6. package/dist/ui/assets/{adobe-C4jW1IJ9.js → adobe-BHZ-TF7E.js} +1 -1
  7. package/dist/ui/assets/{adobe-P1b-ZaUN.js → adobe-Cqd5wrqM.js} +1 -1
  8. package/dist/ui/assets/{agent-panels-DQYADvnv.js → agent-panels-DXCdmUkc.js} +1 -1
  9. package/dist/ui/assets/{almost-bash-shell-headless-BhD2J-Dp.js → almost-bash-shell-headless-B29ulBpN.js} +33 -33
  10. package/dist/ui/assets/{apply-layout-C_zdZ6xl.js → apply-layout-BiYaZGTe.js} +1 -1
  11. package/dist/ui/assets/{apps-bLwOJVZd.js → apps-BYK0eeEc.js} +1 -1
  12. package/dist/ui/assets/{azure-openai-BmcFJoe3.js → azure-openai-BgA0OxNa.js} +1 -1
  13. package/dist/ui/assets/{azure-openai-D8AzgKK4.js → azure-openai-DwxTKwka.js} +1 -1
  14. package/dist/ui/assets/{backend-hostfs-BnW9g7HV.js → backend-hostfs-CeXHlroV.js} +1 -1
  15. package/dist/ui/assets/{cdp-cC30x3hP.js → cdp-wm8vfA8s.js} +1 -1
  16. package/dist/ui/assets/{cerebras-9Karkto5.js → cerebras-BPlfZv3L.js} +1 -1
  17. package/dist/ui/assets/{cerebras-Cdeq-wOc.js → cerebras-wuHzITPY.js} +1 -1
  18. package/dist/ui/assets/{composer-speech-DIQr-H9-.js → composer-speech-DI9SI2lY.js} +1 -1
  19. package/dist/ui/assets/{connect-surface-DuYbMkUH.js → connect-surface-zTa8OfFh.js} +1 -1
  20. package/dist/ui/assets/{directed-approval-BeNZtGtW.js → directed-approval-DmDgVpiX.js} +1 -1
  21. package/dist/ui/assets/{dist-CTNUClOy.js → dist-TdFroLO3.js} +3 -3
  22. package/dist/ui/assets/{dist-BZsj6rXC.js → dist-b828m-Si.js} +3 -3
  23. package/dist/ui/assets/{ensure-speech-assets-B0cmVoSi.js → ensure-speech-assets-42E6KJDv.js} +1 -1
  24. package/dist/ui/assets/frame-bytes-BSmP8I94.js +1 -0
  25. package/dist/ui/assets/frames-C1gdZfee.js +1 -0
  26. package/dist/ui/assets/{frozen-archive-writer-Cy3vzyJG.js → frozen-archive-writer-C97kBlYw.js} +1 -1
  27. package/dist/ui/assets/{fs-Dn-aCLAC.js → fs-BKmepe3Q.js} +2 -2
  28. package/dist/ui/assets/{fs-DOdWw1HA.js → fs-DmgjBIs9.js} +1 -1
  29. package/dist/ui/assets/{gelatiere-store-D1RgK_hM.js → gelatiere-store-D1l9WE1j.js} +1 -1
  30. package/dist/ui/assets/{gelatiere-unit-BneJkqKO.js → gelatiere-unit-jlm5b-JJ.js} +1 -1
  31. package/dist/ui/assets/{github-xAZnQdoi.js → github-BB3M-XW1.js} +1 -1
  32. package/dist/ui/assets/{github-DZp51o66.js → github-C8jjATg2.js} +2 -2
  33. package/dist/ui/assets/{github-auth-HGX5QVxr.js → github-auth-CkC7qTEg.js} +1 -1
  34. package/dist/ui/assets/{github-copilot-CiV7De-T.js → github-copilot-D7QRCTDD.js} +1 -1
  35. package/dist/ui/assets/{github-copilot-BV7Bs27F.js → github-copilot-DuwasHAz.js} +1 -1
  36. package/dist/ui/assets/{github-install-DOUkGa0A.js → github-install-DT3Wys59.js} +1 -1
  37. package/dist/ui/assets/{github-zip-opx-enHp.js → github-zip-CX3GXBmW.js} +1 -1
  38. package/dist/ui/assets/{hear-DBOXlUyX.js → hear-pJ--prvx.js} +1 -1
  39. package/dist/ui/assets/{help-DnE-pjxe.js → help-gOzjZhgS.js} +1 -1
  40. package/dist/ui/assets/host-DDFasAvt.js +1 -0
  41. package/dist/ui/assets/{host-command-5ESITqj8.js → host-command-B0EUpLfV.js} +1 -1
  42. package/dist/ui/assets/{installer-D8xSJFrc.js → installer-DeqzzcvC.js} +1 -1
  43. package/dist/ui/assets/{js-realm-worker-zAQTsouB.js → js-realm-worker-QT2JnICz.js} +1 -1
  44. package/dist/ui/assets/{jsh-executor-Cl_ou7Bi.js → jsh-executor-BBZWMBxV.js} +3 -3
  45. package/dist/ui/assets/{kernel-worker-ObCC3bZ4.js → kernel-worker-B23YxkDH.js} +10 -10
  46. package/dist/ui/assets/{lick-ws-bridge-CBInAfdq.js → lick-ws-bridge-CpcUjLS6.js} +1 -1
  47. package/dist/ui/assets/{lick-ws-bridge-OTeiIxTR.js → lick-ws-bridge-DsoQWD5s.js} +1 -1
  48. package/dist/ui/assets/{live-session-curation-DqSHVqPm.js → live-session-curation-BWfx-Nu1.js} +1 -1
  49. package/dist/ui/assets/{live-session-snapshot-xXU1PTVt.js → live-session-snapshot-BSNfthJ2.js} +1 -1
  50. package/dist/ui/assets/{local-llm-KdRtPevo.js → local-llm-DGFPI_4T.js} +1 -1
  51. package/dist/ui/assets/{local-llm-9ub3AuvH.js → local-llm-vzP-uq7M.js} +1 -1
  52. package/dist/ui/assets/{main-DkHBZ-Z8.js → main-DFTTAllP.js} +3 -3
  53. package/dist/ui/assets/{main-cherry-_amBc8dK.js → main-cherry-Bbjw_90k.js} +1 -1
  54. package/dist/ui/assets/{memory-curation-seam-DyHEcRFr.js → memory-curation-seam-BufuSUCj.js} +1 -1
  55. package/dist/ui/assets/{memory-health-w-JqSADI.js → memory-health-DdSqq7yP.js} +1 -1
  56. package/dist/ui/assets/memory-v2-flag-uChv9nwr.js +1 -0
  57. package/dist/ui/assets/{memory-write-execute-QL7m81zt.js → memory-write-execute-BygymnF0.js} +1 -1
  58. package/dist/ui/assets/{mount-ikFUYfuZ.js → mount-DlogHA7u.js} +3 -3
  59. package/dist/ui/assets/{mount-BTKLdsWe.js → mount-_sTSuvKx.js} +1 -1
  60. package/dist/ui/assets/{new-session-C-J3C--U.js → new-session-C914zfKa.js} +2 -2
  61. package/dist/ui/assets/{oauth-bootstrap-J_0zCMWG.js → oauth-bootstrap-B7cPXMSk.js} +2 -2
  62. package/dist/ui/assets/{onboarding-orchestrator-KQGvne4_.js → onboarding-orchestrator-CbnB67nZ.js} +1 -1
  63. package/dist/ui/assets/{openai-codex-CzeEgu1I.js → openai-codex-BtwVt-12.js} +1 -1
  64. package/dist/ui/assets/{openai-codex-CxQZLpwm.js → openai-codex-SI0nWQNS.js} +1 -1
  65. package/dist/ui/assets/{openrouter-B7J-7z5K.js → openrouter-BFlMjaCH.js} +1 -1
  66. package/dist/ui/assets/{openrouter-DOm8fQ1O.js → openrouter-BruOnSfT.js} +1 -1
  67. package/dist/ui/assets/{openrouter-free-B5-DDkrc.js → openrouter-free-B2pceWVg.js} +1 -1
  68. package/dist/ui/assets/{openrouter-free-qfML0fyf.js → openrouter-free-DPQDCfqQ.js} +1 -1
  69. package/dist/ui/assets/{openrouter-oauth-BK2Nn8wi.js → openrouter-oauth-BLskezr8.js} +1 -1
  70. package/dist/ui/assets/{openrouter-oauth-BJUinrf5.js → openrouter-oauth-C4kwBIwS.js} +1 -1
  71. package/dist/ui/assets/opfs-mount-8s9WP18b.js +2 -0
  72. package/dist/ui/assets/opfs-mount-DF49ioKQ.js +2 -0
  73. package/dist/ui/assets/{panel-rpc-handlers-CByqCf9E.js → panel-rpc-handlers-BuMdGle_.js} +2 -2
  74. package/dist/ui/assets/{panelize-shell-B79ZTaEI.js → panelize-shell-Dg_58ImI.js} +1 -1
  75. package/dist/ui/assets/{pi-edit-execution-CuhfcMVc.js → pi-edit-execution-C9GYKunH.js} +1 -1
  76. package/dist/ui/assets/{provider-CS0Ezi-C.js → provider-B_fhkXn7.js} +2 -2
  77. package/dist/ui/assets/{provider-Cf9_NWke.js → provider-DEcfbBkM.js} +1 -1
  78. package/dist/ui/assets/{provider-settings-CFxffjS6.js → provider-settings-BLtjMrT0.js} +1 -1
  79. package/dist/ui/assets/provider-store-access-C0w1Xcs2.js +1 -0
  80. package/dist/ui/assets/provider-store-access-YjQKD2es.js +1 -0
  81. package/dist/ui/assets/{providers-wWXM8pKV.js → providers-B0rCH1pp.js} +1 -1
  82. package/dist/ui/assets/{providers-BIgVZAND.js → providers-B9p2VR5L.js} +2 -2
  83. package/dist/ui/assets/{quick-llm-CJfwSjQT.js → quick-llm-B8uh7EVu.js} +1 -1
  84. package/dist/ui/assets/{realm-inprocess-B0LLgY2y.js → realm-inprocess-qhbZWW6z.js} +1 -1
  85. package/dist/ui/assets/{recovery-screen-5rwCQu-V.js → recovery-screen-M8szzZB2.js} +1 -1
  86. package/dist/ui/assets/registry-DfuJBCKY.js +1 -0
  87. package/dist/ui/assets/{remote-terminal-view-CvgN6whk.js → remote-terminal-view-6ygd42Fb.js} +1 -1
  88. package/dist/ui/assets/{restore-gxqWgOJu.js → restore-Qq5h6a38.js} +1 -1
  89. package/dist/ui/assets/{run-CyI0DyWz.js → run--H9dud5r.js} +2 -2
  90. package/dist/ui/assets/{run-jHY3ksSb.js → run-Bk0pGJJa.js} +1 -1
  91. package/dist/ui/assets/{run-DsvkFux3.js → run-C0wVagJ5.js} +2 -2
  92. package/dist/ui/assets/{run-B5CPaO-I.js → run-C3rYy-Lu.js} +1 -1
  93. package/dist/ui/assets/{run-DdeplIj8.js → run-CPDsfLJJ.js} +2 -2
  94. package/dist/ui/assets/run-DUzzkV29.js +82 -0
  95. package/dist/ui/assets/{run-Dzp6uf9a.js → run-_QNErIec.js} +2 -2
  96. package/dist/ui/assets/{session-command-memory-DSKgr_FE.js → session-command-memory-CAl1-crq.js} +2 -2
  97. package/dist/ui/assets/{session-jsonl-DUeVG2T_.js → session-jsonl-B-4fihPX.js} +1 -1
  98. package/dist/ui/assets/{session-jsonl-BfqZO6d_.js → session-jsonl-lB9-7rZS.js} +1 -1
  99. package/dist/ui/assets/{session-search-index-o_XRNxc8.js → session-search-index-Bn4FhmPW.js} +1 -1
  100. package/dist/ui/assets/{setup-feature-flags-remote-DUEXmwjs.js → setup-feature-flags-remote-opNg3JWs.js} +1 -1
  101. package/dist/ui/assets/{signed-fetch-Dl15vWXR.js → signed-fetch-YC2zrriw.js} +1 -1
  102. package/dist/ui/assets/{silent-renew-backoff-DsKGgLRs.js → silent-renew-backoff-Bak0vwwf.js} +1 -1
  103. package/dist/ui/assets/slicc-version-D1Js64gw.js +1 -0
  104. package/dist/ui/assets/{snapshot-Citj7-JE.js → snapshot-6br_5p-f.js} +1 -1
  105. package/dist/ui/assets/{snapshot-features-BHLqOlg9.js → snapshot-features-BqGUjBWl.js} +1 -1
  106. package/dist/ui/assets/{soundscape-DSsqJ8zv.js → soundscape-DRViCPly.js} +1 -1
  107. package/dist/ui/assets/{speak-D6aVzMns.js → speak-DRv_vLqY.js} +1 -1
  108. package/dist/ui/assets/{sprinkle-manager-ME8d4cjx.js → sprinkle-manager-DeJrE3Hq.js} +1 -1
  109. package/dist/ui/assets/{sprinkle-renderer-DUag5OwG.js → sprinkle-renderer-DYUy10CO.js} +1 -1
  110. package/dist/ui/assets/ssh-D1zj1EXl.js +6 -0
  111. package/dist/ui/assets/{state-B6uRuQMD.js → state-BpyjzTIG.js} +1 -1
  112. package/dist/ui/assets/{store-KHNvC53T.js → store-DQkIRnav.js} +1 -1
  113. package/dist/ui/assets/{store-589yQxDA.js → store-DwUewAuZ.js} +1 -1
  114. package/dist/ui/assets/{sudo-s-73cy5v.js → sudo-DIegVBwT.js} +1 -1
  115. package/dist/ui/assets/{supervisor-DAEgImH3.js → supervisor-gHbk5m7z.js} +1 -1
  116. package/dist/ui/assets/{sync-dialog-KSbJH8Ib.js → sync-dialog-CH4PBcVu.js} +1 -1
  117. package/dist/ui/assets/tab-0xwFvGm5.js +1 -0
  118. package/dist/ui/assets/{transformers-env-BoPF1XI7.js → transformers-env-9M9En1_O.js} +1 -1
  119. package/dist/ui/assets/{tray-leader-DYTuRHiF.js → tray-leader-Bd293BI8.js} +1 -1
  120. package/dist/ui/assets/{tray-leave-runtime-DBskaqlh.js → tray-leave-runtime-wLd1uBMu.js} +1 -1
  121. package/dist/ui/assets/{tray-sidecar-CI3PdkCD.js → tray-sidecar-C35X7Jht.js} +1 -1
  122. package/dist/ui/assets/{upgrade-detection-xF6lC9IK.js → upgrade-detection-Tp8fDJAG.js} +1 -1
  123. package/dist/ui/assets/{upskill-lick-skip-DVUSlTF5.js → upskill-lick-skip-Cr0VVPGj.js} +1 -1
  124. package/dist/ui/assets/url-B1WJZBSE.js +1 -0
  125. package/dist/ui/assets/v86-BOapztuq.js +1 -0
  126. package/dist/ui/assets/{voice-reply-jXkqXAts.js → voice-reply-wJfABSIn.js} +1 -1
  127. package/dist/ui/assets/{wc-attach-BXamqL0L.js → wc-attach-CtVWDKPk.js} +2 -2
  128. package/dist/ui/assets/{wc-browser-Df2q83J-.js → wc-browser-BJemxWhg.js} +1 -1
  129. package/dist/ui/assets/{wc-computers-BLXLTk2O.js → wc-computers-Cr14YnOg.js} +1 -1
  130. package/dist/ui/assets/{wc-detached-ezoaBCsO.js → wc-detached-DQ_ZTSZ-.js} +1 -1
  131. package/dist/ui/assets/{wc-extension-DBHJH1V7.js → wc-extension-C8pgLDqO.js} +2 -2
  132. package/dist/ui/assets/{wc-follower-BwVh5O1m.js → wc-follower-nosCeVKN.js} +3 -3
  133. package/dist/ui/assets/{wc-follower-oauth-BHrFykQ1.js → wc-follower-oauth-BU-XAftl.js} +1 -1
  134. package/dist/ui/assets/{wc-gelatiere-CAhoFlla.js → wc-gelatiere-BiyouLW3.js} +1 -1
  135. package/dist/ui/assets/{wc-live-By-Auby6.js → wc-live-CaopRwn0.js} +5 -5
  136. package/dist/ui/assets/{wc-nav-BfvCMizF.js → wc-nav-Wn2qDNiX.js} +2 -2
  137. package/dist/ui/assets/{wc-onboarding-B62UQF1p.js → wc-onboarding-FjrDOv_u.js} +2 -2
  138. package/dist/ui/assets/{wc-permissions-CcLlwQLN.js → wc-permissions-C63-jLbY.js} +2 -2
  139. package/dist/ui/assets/{wc-placeholder-DEsDdnWi.js → wc-placeholder-Bdbmjijc.js} +3 -3
  140. package/dist/ui/assets/{wc-secret-request-CAv_ZACt.js → wc-secret-request-C9iCWgBV.js} +1 -1
  141. package/dist/ui/assets/{wc-settings-DxgsllBm.js → wc-settings-1ZJgN4Wk.js} +3 -3
  142. package/dist/ui/assets/{wc-shell-C6h5-x1_.js → wc-shell-CrMn8BW0.js} +3 -3
  143. package/dist/ui/assets/{wc-shortcut-config-C_f-Vhnd.js → wc-shortcut-config-JXEU24sg.js} +1 -1
  144. package/dist/ui/assets/{wc-sprinkles-UqEPIOlU.js → wc-sprinkles-CBaPR_V8.js} +2 -2
  145. package/dist/ui/assets/{wc-transcript-export-DORqMy3T.js → wc-transcript-export-eyG-SwVe.js} +2 -2
  146. package/dist/ui/assets/{wc-tray-CTF4wGF3.js → wc-tray-dSLNIDh9.js} +4 -4
  147. package/dist/ui/assets/welcome-detection-DuFRP38Z.js +1 -0
  148. package/dist/ui/assets/{whisper-session-D6DdyCO_.js → whisper-session-DrDhzSqp.js} +2 -2
  149. package/dist/ui/assets/{xai-grok-BpXfk14G.js → xai-grok-C2oyJ5tt.js} +1 -1
  150. package/dist/ui/assets/{xai-grok-gjfzWslr.js → xai-grok-G4GFCgrM.js} +1 -1
  151. package/dist/ui/index.html +3 -3
  152. package/dist/ui/packages/webapp/index.html +3 -3
  153. package/package.json +1 -1
  154. package/dist/ui/assets/SKILL-B_vSLfiC.js +0 -1
  155. package/dist/ui/assets/encode-frame-30wbFN-H.js +0 -1
  156. package/dist/ui/assets/frames-7E6RloFP.js +0 -1
  157. package/dist/ui/assets/host-CLGoytqB.js +0 -1
  158. package/dist/ui/assets/memory-v2-flag-BL9HcWqE.js +0 -1
  159. package/dist/ui/assets/opfs-mount-BknMrwaQ.js +0 -2
  160. package/dist/ui/assets/opfs-mount-Dizi9FS1.js +0 -2
  161. package/dist/ui/assets/provider-store-access-9MDuGe4W.js +0 -1
  162. package/dist/ui/assets/provider-store-access-Bvtkddv7.js +0 -1
  163. package/dist/ui/assets/registry-qHtWYFOX.js +0 -1
  164. package/dist/ui/assets/run-B4NB-XFg.js +0 -80
  165. package/dist/ui/assets/slicc-version-BaTg4J2W.js +0 -1
  166. package/dist/ui/assets/ssh-2T7ub5Yk.js +0 -6
  167. package/dist/ui/assets/tab-DI1zy4Vd.js +0 -1
  168. package/dist/ui/assets/url-SK-_tyJs.js +0 -1
  169. package/dist/ui/assets/v86-BF0NlNun.js +0 -1
  170. package/dist/ui/assets/welcome-detection-mqLqle6h.js +0 -1
@@ -0,0 +1 @@
1
+ import{n as e}from"./wc-onboarding-FjrDOv_u.js";export{e as hasOnboardingFinalLickInHistory};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/speak-D6aVzMns.js","assets/preload-helper-Czpn1I53.js","assets/logger-DDBAeTLF.js","assets/runtime-env-Dlaokqg1.js","assets/speech-assets-bridge-CFYafE89.js","assets/transformers-env-BoPF1XI7.js","assets/wc-shell-C6h5-x1_.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/mime-types-D0xZwlMO.js","assets/base64-ELzoYfwP.js","assets/bridge-protocol-C52CnDIj.js","assets/account-store-BBDgfG4U.js","assets/core-zz8rWM4c.js","assets/compat-qQM4gjF_.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-B-zmcypy.js","assets/libesm-BypnjKEL.js","assets/proxied-fetch-W1rZTqEQ.js","assets/fetch-body-1l9I58Vk.js","assets/api-endpoint-DuEQRZ4g.js","assets/secret-topology-fyLSbV8r.js","assets/float-topology-U8FF9pgZ.js","assets/secrets-bridge-client-9RRVsrGm.js","assets/port-bridge-client-BYQawsDH.js","assets/image-markers-q8JQTtid.js","assets/tool-ui-eSQ1g2I1.js","assets/providers-BIgVZAND.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-BeCSBUrZ.js","assets/claude-model-version-DZmbk9E2.js","assets/telemetry-CKoAhRMv.js","assets/types-D8gIX-W-.js","assets/same-file-identity-DuEcSmPX.js","assets/icons-jrIi5FYk.js","assets/wc-shell-WkeczD9x.css","assets/shared-mBEktoxE.js","assets/transformers.web-BBJR2ai3.js"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./preload-helper-Czpn1I53.js";import{t}from"./logger-DDBAeTLF.js";import{a as n,n as r,o as i,r as a,t as o}from"./transformers-env-BoPF1XI7.js";var s=t(`speech:whisper`),c=null,l=`idle`,u=null,d=new Set;function f(){return l}function p(){return u}function m(e){return e&&d.add(e),c||=(l=`loading`,g().then(e=>(l=`ready`,h(),e),e=>{throw l=`failed`,c=null,s.error(`whisper load failed`,e),e})),c}function h(){e(async()=>{let{kokoroWarmup:e}=await import(`./speak-D6aVzMns.js`);return{kokoroWarmup:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38])).then(({kokoroWarmup:e})=>e()).catch(e=>s.warn(`kokoro warmup (chained after whisper) failed`,e))}async function g(){let{pipeline:t,env:c}=await e(async()=>{let{pipeline:e,env:t}=await import(`./transformers.web-BBJR2ai3.js`);return{pipeline:e,env:t}},__vite__mapDeps([39,7,1]));r(c),await o(n),await a();let l=i(),f=e=>{if(e?.file){if(e.status===`progress`)l.update(e.file,e.loaded??0,e.total??0);else if(e.status===`done`)l.complete(e.file);else return;u=l.snapshot();for(let e of d)e(u)}},p=async e=>await t(`automatic-speech-recognition`,n,{device:e,dtype:e===`webgpu`?`fp32`:`q8`,progress_callback:f}),m=typeof navigator<`u`&&`gpu`in navigator,h;if(m)try{h=await p(`webgpu`)}catch(e){s.warn(`whisper webgpu init failed; retrying on wasm`,e),h=await p(`wasm`)}else h=await p(`wasm`);return s.info(`whisper ready`,{model:n,device:m?`webgpu`:`wasm`}),{async transcribe(e,t){let n=performance.now(),r=await h(e,{chunk_length_s:30,task:`transcribe`,...t?.language?{language:t.language}:{}}),i=Array.isArray(r)?r.map(e=>e.text??``).join(` `):r.text??``;return s.info(`whisper transcribe`,{elapsedMs:Math.round(performance.now()-n),audioSeconds:Math.round(e.length/160)/100,numThreads:c.backends?.onnx?.wasm?.numThreads,device:m?`webgpu`:`wasm`}),i.trim()}}}var _=16e3;async function v(e){if(typeof AudioContext>`u`||typeof OfflineAudioContext>`u`)throw Error(`audio decoding requires a window/page realm (AudioContext unavailable)`);let t=new AudioContext,n;try{n=await t.decodeAudioData(e.slice(0))}finally{await t.close().catch(()=>{})}let r=Math.max(1,Math.ceil(n.duration*_)),i=new OfflineAudioContext(1,r,_),a=i.createBufferSource();return a.buffer=n,a.connect(i.destination),a.start(),(await i.startRendering()).getChannelData(0).slice(0)}var y=t(`speech:whisper-session`),b=2e3,x=500,S=5e3,C=3e4,w=(e,t,n)=>new Promise((r,i)=>{let a=setTimeout(()=>i(Error(`${n} timed out after ${t}ms`)),t);e.then(e=>{clearTimeout(a),r(e)},e=>{clearTimeout(a),i(e)})});function T(e){return e?.split(`-`)[0]?.toLowerCase()||void 0}async function E(e,t){let n;if(t.stream)n=t.stream;else{if(!navigator.mediaDevices?.getUserMedia)throw Error(`microphone capture unavailable in this realm`);n=await navigator.mediaDevices.getUserMedia({audio:t.deviceId&&t.deviceId!=="default"?{deviceId:{exact:t.deviceId}}:!0})}let r=new MediaRecorder(n),i=[],a=T(t.lang),o=!1,s=!1;r.ondataavailable=e=>{e.data.size>0&&i.push(e.data)};let c=async()=>{if(i.length===0)return``;let t=await v(await new Blob(i,{type:r.mimeType||`audio/webm`}).arrayBuffer());return e.transcribe(t,{language:a})},l=Promise.resolve(``),u=()=>{let e=l.catch(()=>``).then(()=>c());return l=e.catch(()=>``),e},d=setInterval(()=>{o||s||i.length===0||(o=!0,u().then(e=>{!s&&e&&t.onPartial?.(e)}).catch(e=>{y.warn(`partial transcription failed`,e)}).finally(()=>{o=!1}))},b),f=()=>{if(clearInterval(d),r.state!==`inactive`)try{r.stop()}catch{}for(let e of n.getTracks())e.stop()},p=()=>new Promise(e=>{if(r.state===`inactive`){e();return}r.onstop=()=>e();try{r.stop()}catch{e()}});return r.start(x),{async stop(){if(s)return``;s=!0,clearInterval(d);try{await w(p(),S,`recorder flush`);for(let e of n.getTracks())e.stop();return await w(u(),C,`transcription`)}catch(e){for(let e of n.getTracks())e.stop();let r=e instanceof Error?e.message:String(e);return t.onError?.(`transcription failed: ${r}`),``}},cancel(){s||(s=!0,f())}}}export{p as a,m as i,T as n,f as o,v as r,E as t};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/speak-DRv_vLqY.js","assets/preload-helper-Czpn1I53.js","assets/logger-DDBAeTLF.js","assets/runtime-env-Dlaokqg1.js","assets/speech-assets-bridge-CFYafE89.js","assets/transformers-env-9M9En1_O.js","assets/wc-shell-CrMn8BW0.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/mime-types-D0xZwlMO.js","assets/base64-ELzoYfwP.js","assets/bridge-protocol-C52CnDIj.js","assets/account-store-SI8RQbm0.js","assets/core-zz8rWM4c.js","assets/compat-qQM4gjF_.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-B-zmcypy.js","assets/libesm-BypnjKEL.js","assets/proxied-fetch-W1rZTqEQ.js","assets/fetch-body-1l9I58Vk.js","assets/api-endpoint-DuEQRZ4g.js","assets/secret-topology-fyLSbV8r.js","assets/float-topology-U8FF9pgZ.js","assets/secrets-bridge-client-9RRVsrGm.js","assets/port-bridge-client-BYQawsDH.js","assets/image-markers-q8JQTtid.js","assets/tool-ui-eSQ1g2I1.js","assets/providers-B9p2VR5L.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-BeCSBUrZ.js","assets/claude-model-version-DZmbk9E2.js","assets/telemetry-CKoAhRMv.js","assets/types-D8gIX-W-.js","assets/same-file-identity-DuEcSmPX.js","assets/icons-jrIi5FYk.js","assets/wc-shell-WkeczD9x.css","assets/shared-mBEktoxE.js","assets/transformers.web-BBJR2ai3.js"])))=>i.map(i=>d[i]);
2
+ import{t as e}from"./preload-helper-Czpn1I53.js";import{t}from"./logger-DDBAeTLF.js";import{a as n,n as r,o as i,r as a,t as o}from"./transformers-env-9M9En1_O.js";var s=t(`speech:whisper`),c=null,l=`idle`,u=null,d=new Set;function f(){return l}function p(){return u}function m(e){return e&&d.add(e),c||=(l=`loading`,g().then(e=>(l=`ready`,h(),e),e=>{throw l=`failed`,c=null,s.error(`whisper load failed`,e),e})),c}function h(){e(async()=>{let{kokoroWarmup:e}=await import(`./speak-DRv_vLqY.js`);return{kokoroWarmup:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38])).then(({kokoroWarmup:e})=>e()).catch(e=>s.warn(`kokoro warmup (chained after whisper) failed`,e))}async function g(){let{pipeline:t,env:c}=await e(async()=>{let{pipeline:e,env:t}=await import(`./transformers.web-BBJR2ai3.js`);return{pipeline:e,env:t}},__vite__mapDeps([39,7,1]));r(c),await o(n),await a();let l=i(),f=e=>{if(e?.file){if(e.status===`progress`)l.update(e.file,e.loaded??0,e.total??0);else if(e.status===`done`)l.complete(e.file);else return;u=l.snapshot();for(let e of d)e(u)}},p=async e=>await t(`automatic-speech-recognition`,n,{device:e,dtype:e===`webgpu`?`fp32`:`q8`,progress_callback:f}),m=typeof navigator<`u`&&`gpu`in navigator,h;if(m)try{h=await p(`webgpu`)}catch(e){s.warn(`whisper webgpu init failed; retrying on wasm`,e),h=await p(`wasm`)}else h=await p(`wasm`);return s.info(`whisper ready`,{model:n,device:m?`webgpu`:`wasm`}),{async transcribe(e,t){let n=performance.now(),r=await h(e,{chunk_length_s:30,task:`transcribe`,...t?.language?{language:t.language}:{}}),i=Array.isArray(r)?r.map(e=>e.text??``).join(` `):r.text??``;return s.info(`whisper transcribe`,{elapsedMs:Math.round(performance.now()-n),audioSeconds:Math.round(e.length/160)/100,numThreads:c.backends?.onnx?.wasm?.numThreads,device:m?`webgpu`:`wasm`}),i.trim()}}}var _=16e3;async function v(e){if(typeof AudioContext>`u`||typeof OfflineAudioContext>`u`)throw Error(`audio decoding requires a window/page realm (AudioContext unavailable)`);let t=new AudioContext,n;try{n=await t.decodeAudioData(e.slice(0))}finally{await t.close().catch(()=>{})}let r=Math.max(1,Math.ceil(n.duration*_)),i=new OfflineAudioContext(1,r,_),a=i.createBufferSource();return a.buffer=n,a.connect(i.destination),a.start(),(await i.startRendering()).getChannelData(0).slice(0)}var y=t(`speech:whisper-session`),b=2e3,x=500,S=5e3,C=3e4,w=(e,t,n)=>new Promise((r,i)=>{let a=setTimeout(()=>i(Error(`${n} timed out after ${t}ms`)),t);e.then(e=>{clearTimeout(a),r(e)},e=>{clearTimeout(a),i(e)})});function T(e){return e?.split(`-`)[0]?.toLowerCase()||void 0}async function E(e,t){let n;if(t.stream)n=t.stream;else{if(!navigator.mediaDevices?.getUserMedia)throw Error(`microphone capture unavailable in this realm`);n=await navigator.mediaDevices.getUserMedia({audio:t.deviceId&&t.deviceId!=="default"?{deviceId:{exact:t.deviceId}}:!0})}let r=new MediaRecorder(n),i=[],a=T(t.lang),o=!1,s=!1;r.ondataavailable=e=>{e.data.size>0&&i.push(e.data)};let c=async()=>{if(i.length===0)return``;let t=await v(await new Blob(i,{type:r.mimeType||`audio/webm`}).arrayBuffer());return e.transcribe(t,{language:a})},l=Promise.resolve(``),u=()=>{let e=l.catch(()=>``).then(()=>c());return l=e.catch(()=>``),e},d=setInterval(()=>{o||s||i.length===0||(o=!0,u().then(e=>{!s&&e&&t.onPartial?.(e)}).catch(e=>{y.warn(`partial transcription failed`,e)}).finally(()=>{o=!1}))},b),f=()=>{if(clearInterval(d),r.state!==`inactive`)try{r.stop()}catch{}for(let e of n.getTracks())e.stop()},p=()=>new Promise(e=>{if(r.state===`inactive`){e();return}r.onstop=()=>e();try{r.stop()}catch{e()}});return r.start(x),{async stop(){if(s)return``;s=!0,clearInterval(d);try{await w(p(),S,`recorder flush`);for(let e of n.getTracks())e.stop();return await w(u(),C,`transcription`)}catch(e){for(let e of n.getTracks())e.stop();let r=e instanceof Error?e.message:String(e);return t.onError?.(`transcription failed: ${r}`),``}},cancel(){s||(s=!0,f())}}}export{p as a,m as i,T as n,f as o,v as r,E as t};
@@ -1 +1 @@
1
- import{_ as e,r as t}from"./account-store-DoN97hFH.js";import{a as n}from"./diagnostics-DN_idNHx.js";import{a as r,r as i}from"./compat-uEPf6-XW.js";import{c as a,i as o,r as s,s as c}from"./legacy-api-aliases-jKEvBgOL.js";import"./provider-settings-CFxffjS6.js";import{n as l,r as u}from"./bridge-token-required-BYgoMwr7.js";import{n as d,r as f,t as p}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as m,XaiOAuthError as h}from"./xai-grok-errors-ByEMMSoz.js";function g(e){return typeof e==`object`&&!!e}function _(e){if(!g(e))return null;let t=g(e.config)?e.config:e,n=t.creditUsagePercent;if(typeof n!=`number`||!Number.isFinite(n))return null;let r=Math.min(1e3,Math.max(0,n)),i=g(t.currentPeriod)?t.currentPeriod:{},a=i.type,o=typeof a==`string`?a.replace(`USAGE_PERIOD_TYPE_`,``).toLowerCase():``,s=i.end??t.billingPeriodEnd,c=typeof s==`string`&&Number.isFinite(Date.parse(s))?s:void 0;return{percent:r,status:`ok`,window:o&&o!==`unspecified`?o:`billing`,...c?{resetsAt:c}:{}}}async function v(e,t,n={}){let r=new AbortController,i=setTimeout(()=>r.abort(),n.timeoutMs??8e3);try{let n=await t(`https://cli-chat-proxy.grok.com/v1/billing?format=credits`,{headers:{Authorization:`Bearer ${e}`},signal:r.signal}),{status:i}=n;if(i===404||i===501)return null;if(!n.ok)throw Error(`xAI Grok usage: ${i===401||i===403?`re-login required`:`failed`} (${i})`);let a=await n.text();if(a.length>65536)return null;try{return _(JSON.parse(a))}catch{return null}}finally{clearTimeout(i)}}const y=`xai-grok`,b=`https://auth.x.ai`,x=`${b}/oauth2/authorize`,S=`${b}/oauth2/token`,C=`b1a00492-073a-47ea-816f-4c329264a828`,w=`http://127.0.0.1:56121/callback`,T=`https://api.x.ai/v1`,E=`grok-4.7`,D=`${y}-openai`;function O(e){if(e.some(e=>e.id===E))return e;let t=e.find(e=>e.id===`grok-4.6`)??e.find(e=>e.api===`openai-responses`)??e[0];return t?[{...t,id:E,name:`Grok 4.7`,api:`openai-responses`,reasoning:!0,input:[`text`,`image`],cost:{input:2,output:6,cacheRead:.5,cacheWrite:0},contextWindow:5e5,maxTokens:5e5,thinkingLevelMap:{off:null,minimal:null,low:`low`,medium:`medium`,high:`high`,xhigh:`xhigh`,max:null}},...e]:e}function k(){return O(i(`xai`))}function A(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap,cost:e.cost}}function j(e){let t=k(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${E}"`),n=t.find(e=>e.id===E),!n))throw Error(`xAI default model "${E}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:T}}async function M(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:w,client_id:C,code_verifier:t}),r=await fetch(S,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new h(`xAI token exchange failed: ${r.status} ${await r.text()}`,m.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new h(`xAI token exchange did not return access_token.`,m.TOKEN_EXCHANGE_INVALID);return i}async function N(e){if(l())return null;try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:C}),n=await fetch(S,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});if(!n.ok){let e=await n.text();return u(n.status,e)||console.error(`[xai-grok] refresh failed:`,n.status,e),null}return await n.json()}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function P(){return t().find(e=>e.providerId===y)}async function F(){let t=P();if(!t?.accessToken)throw new h("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",m.AUTH_MISSING,!0);let n=t.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return t.accessToken;if(t.refreshToken){let n=await N(t.refreshToken);if(n?.access_token)return await e({providerId:y,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token}return t.accessToken}async function I(){if(!P()?.accessToken)throw Error(`xAI Grok budget: not signed in`);return v(await F(),fetch)}function L(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:D,provider:y,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function R(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}function z(e){console.error(`[xai-grok] Stream error:`,e instanceof Error?e.message:String(e))}async function B(e,t,n,r){try{let i=await F(),a=r.sessionId,c=j(t),l={...r,apiKey:i,headers:R(r.headers,a)},u=c.api===`openai-responses`?o(c,n,l):s(c,n,l);for await(let t of u)e.push(t);e.end()}catch(n){z(n),e.push(L(t,n)),e.end()}}async function V(e,t,n,r){try{let i=await F(),o=r?.sessionId,s=j(t),l={...r,apiKey:i,headers:R(r?.headers,o)},u=s.api===`openai-responses`?a(s,n,l):c(s,n,l);for await(let t of u)e.push(t);e.end()}catch(n){z(n),e.push(L(t,n)),e.end()}}const H=(e,t,r={})=>{let i=n();return B(i,e,t,r).catch(z),i},U=(e,t,r)=>{let i=n();return V(i,e,t,r).catch(z),i},W={id:y,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.7.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:E,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`,`cli-chat-proxy.grok.com`],getModelIds:()=>k().map(A),getBudgetUsage:I,onOAuthLoginIntercepted:async(t,n,r)=>{let i=d(),a=await p(i),o=f(),s=f(),c=new URL(x);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,C),c.searchParams.set(`redirect_uri`,w),c.searchParams.set(`scope`,r?.scopes??`openid profile email offline_access grok-cli:access api:access`),c.searchParams.set(`code_challenge`,a),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,o),c.searchParams.set(`nonce`,s),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let l=await t({authorizeUrl:c.toString(),redirectUriPattern:`http://127.0.0.1:56121/*`,onCapture:`close`});if(!l)throw new h(`xAI OAuth login was cancelled or timed out`,m.CALLBACK_TIMEOUT);let u=new URL(l),g=u.searchParams.get(`code`),_=u.searchParams.get(`state`);if(!g)throw new h(`xAI OAuth redirect did not include a code`,m.CODE_MISSING);if(_!==o)throw new h(`xAI OAuth state mismatch — possible CSRF, aborting`,m.STATE_MISMATCH);let v=await M(g,i);await e({providerId:y,accessToken:v.access_token,refreshToken:v.refresh_token,tokenExpiresAt:Date.now()+(v.expires_in??21600)*1e3,baseUrl:T,scopes:v.scope}),n()},onOAuthLogout:async()=>{await e({providerId:y,accessToken:``})},onSilentRenew:async()=>{let t=P();if(!t?.refreshToken)return null;let n=await N(t.refreshToken);return n?.access_token?(await e({providerId:y,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token):null}};function G(){r({api:D,stream:H,streamSimple:U})}export{m as XaiErrorCode,h as XaiOAuthError,W as config,G as register};
1
+ import{_ as e,r as t}from"./account-store-LwLxI7v1.js";import{a as n}from"./diagnostics-DN_idNHx.js";import{a as r,r as i}from"./compat-uEPf6-XW.js";import{c as a,i as o,r as s,s as c}from"./legacy-api-aliases-jKEvBgOL.js";import"./provider-settings-BLtjMrT0.js";import{n as l,r as u}from"./bridge-token-required-BYgoMwr7.js";import{n as d,r as f,t as p}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as m,XaiOAuthError as h}from"./xai-grok-errors-ByEMMSoz.js";function g(e){return typeof e==`object`&&!!e}function _(e){if(!g(e))return null;let t=g(e.config)?e.config:e,n=t.creditUsagePercent;if(typeof n!=`number`||!Number.isFinite(n))return null;let r=Math.min(1e3,Math.max(0,n)),i=g(t.currentPeriod)?t.currentPeriod:{},a=i.type,o=typeof a==`string`?a.replace(`USAGE_PERIOD_TYPE_`,``).toLowerCase():``,s=i.end??t.billingPeriodEnd,c=typeof s==`string`&&Number.isFinite(Date.parse(s))?s:void 0;return{percent:r,status:`ok`,window:o&&o!==`unspecified`?o:`billing`,...c?{resetsAt:c}:{}}}async function v(e,t,n={}){let r=new AbortController,i=setTimeout(()=>r.abort(),n.timeoutMs??8e3);try{let n=await t(`https://cli-chat-proxy.grok.com/v1/billing?format=credits`,{headers:{Authorization:`Bearer ${e}`},signal:r.signal}),{status:i}=n;if(i===404||i===501)return null;if(!n.ok)throw Error(`xAI Grok usage: ${i===401||i===403?`re-login required`:`failed`} (${i})`);let a=await n.text();if(a.length>65536)return null;try{return _(JSON.parse(a))}catch{return null}}finally{clearTimeout(i)}}const y=`xai-grok`,b=`https://auth.x.ai`,x=`${b}/oauth2/authorize`,S=`${b}/oauth2/token`,C=`b1a00492-073a-47ea-816f-4c329264a828`,w=`http://127.0.0.1:56121/callback`,T=`https://api.x.ai/v1`,E=`grok-4.7`,D=`${y}-openai`;function O(e){if(e.some(e=>e.id===E))return e;let t=e.find(e=>e.id===`grok-4.6`)??e.find(e=>e.api===`openai-responses`)??e[0];return t?[{...t,id:E,name:`Grok 4.7`,api:`openai-responses`,reasoning:!0,input:[`text`,`image`],cost:{input:2,output:6,cacheRead:.5,cacheWrite:0},contextWindow:5e5,maxTokens:5e5,thinkingLevelMap:{off:null,minimal:null,low:`low`,medium:`medium`,high:`high`,xhigh:`xhigh`,max:null}},...e]:e}function k(){return O(i(`xai`))}function A(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap,cost:e.cost}}function j(e){let t=k(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${E}"`),n=t.find(e=>e.id===E),!n))throw Error(`xAI default model "${E}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:T}}async function M(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:w,client_id:C,code_verifier:t}),r=await fetch(S,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new h(`xAI token exchange failed: ${r.status} ${await r.text()}`,m.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new h(`xAI token exchange did not return access_token.`,m.TOKEN_EXCHANGE_INVALID);return i}async function N(e){if(l())return null;try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:C}),n=await fetch(S,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});if(!n.ok){let e=await n.text();return u(n.status,e)||console.error(`[xai-grok] refresh failed:`,n.status,e),null}return await n.json()}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function P(){return t().find(e=>e.providerId===y)}async function F(){let t=P();if(!t?.accessToken)throw new h("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",m.AUTH_MISSING,!0);let n=t.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return t.accessToken;if(t.refreshToken){let n=await N(t.refreshToken);if(n?.access_token)return await e({providerId:y,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token}return t.accessToken}async function I(){if(!P()?.accessToken)throw Error(`xAI Grok budget: not signed in`);return v(await F(),fetch)}function L(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:D,provider:y,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function R(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}function z(e){console.error(`[xai-grok] Stream error:`,e instanceof Error?e.message:String(e))}async function B(e,t,n,r){try{let i=await F(),a=r.sessionId,c=j(t),l={...r,apiKey:i,headers:R(r.headers,a)},u=c.api===`openai-responses`?o(c,n,l):s(c,n,l);for await(let t of u)e.push(t);e.end()}catch(n){z(n),e.push(L(t,n)),e.end()}}async function V(e,t,n,r){try{let i=await F(),o=r?.sessionId,s=j(t),l={...r,apiKey:i,headers:R(r?.headers,o)},u=s.api===`openai-responses`?a(s,n,l):c(s,n,l);for await(let t of u)e.push(t);e.end()}catch(n){z(n),e.push(L(t,n)),e.end()}}const H=(e,t,r={})=>{let i=n();return B(i,e,t,r).catch(z),i},U=(e,t,r)=>{let i=n();return V(i,e,t,r).catch(z),i},W={id:y,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.7.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:E,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`,`cli-chat-proxy.grok.com`],getModelIds:()=>k().map(A),getBudgetUsage:I,onOAuthLoginIntercepted:async(t,n,r)=>{let i=d(),a=await p(i),o=f(),s=f(),c=new URL(x);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,C),c.searchParams.set(`redirect_uri`,w),c.searchParams.set(`scope`,r?.scopes??`openid profile email offline_access grok-cli:access api:access`),c.searchParams.set(`code_challenge`,a),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,o),c.searchParams.set(`nonce`,s),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let l=await t({authorizeUrl:c.toString(),redirectUriPattern:`http://127.0.0.1:56121/*`,onCapture:`close`});if(!l)throw new h(`xAI OAuth login was cancelled or timed out`,m.CALLBACK_TIMEOUT);let u=new URL(l),g=u.searchParams.get(`code`),_=u.searchParams.get(`state`);if(!g)throw new h(`xAI OAuth redirect did not include a code`,m.CODE_MISSING);if(_!==o)throw new h(`xAI OAuth state mismatch — possible CSRF, aborting`,m.STATE_MISMATCH);let v=await M(g,i);await e({providerId:y,accessToken:v.access_token,refreshToken:v.refresh_token,tokenExpiresAt:Date.now()+(v.expires_in??21600)*1e3,baseUrl:T,scopes:v.scope}),n()},onOAuthLogout:async()=>{await e({providerId:y,accessToken:``})},onSilentRenew:async()=>{let t=P();if(!t?.refreshToken)return null;let n=await N(t.refreshToken);return n?.access_token?(await e({providerId:y,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token):null}};function G(){r({api:D,stream:H,streamSimple:U})}export{m as XaiErrorCode,h as XaiOAuthError,W as config,G as register};
@@ -1 +1 @@
1
- import{a as e}from"./diagnostics-DN_idNHx.js";import{a as t,r as n}from"./compat-qQM4gjF_.js";import{c as r,i,r as a,s as o}from"./legacy-api-aliases-DtQJ5I7w.js";import{G as s,f as c}from"./account-store-BBDgfG4U.js";import"./main-DkHBZ-Z8.js";import{n as l,r as u}from"./bridge-token-required-DMk2va9k.js";import{n as d,r as f,t as p}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as m,XaiOAuthError as h}from"./xai-grok-errors-bnlIBeu-.js";var g=`https://cli-chat-proxy.grok.com/v1/billing?format=credits`,_=8e3,v=65536,y=1e3;function b(e){return typeof e==`object`&&!!e}function x(e){if(!b(e))return null;let t=b(e.config)?e.config:e,n=t.creditUsagePercent;if(typeof n!=`number`||!Number.isFinite(n))return null;let r=Math.min(y,Math.max(0,n)),i=b(t.currentPeriod)?t.currentPeriod:{},a=i.type,o=typeof a==`string`?a.replace(`USAGE_PERIOD_TYPE_`,``).toLowerCase():``,s=i.end??t.billingPeriodEnd,c=typeof s==`string`&&Number.isFinite(Date.parse(s))?s:void 0;return{percent:r,status:`ok`,window:o&&o!==`unspecified`?o:`billing`,...c?{resetsAt:c}:{}}}async function S(e,t,n={}){let r=new AbortController,i=setTimeout(()=>r.abort(),n.timeoutMs??_);try{let n=await t(g,{headers:{Authorization:`Bearer ${e}`},signal:r.signal}),{status:i}=n;if(i===404||i===501)return null;if(!n.ok)throw Error(`xAI Grok usage: ${i===401||i===403?`re-login required`:`failed`} (${i})`);let a=await n.text();if(a.length>v)return null;try{return x(JSON.parse(a))}catch{return null}}finally{clearTimeout(i)}}var C=`xai-grok`,w=`https://auth.x.ai`,T=`${w}/oauth2/authorize`,E=`${w}/oauth2/token`,D=`b1a00492-073a-47ea-816f-4c329264a828`,O=`openid profile email offline_access grok-cli:access api:access`,k=`http://127.0.0.1:56121/callback`,A=`http://127.0.0.1:56121/*`,j=`https://api.x.ai/v1`,M=`grok-4.7`,N=`${C}-openai`;function P(e){if(e.some(e=>e.id===M))return e;let t=e.find(e=>e.id===`grok-4.6`)??e.find(e=>e.api===`openai-responses`)??e[0];return t?[{...t,id:M,name:`Grok 4.7`,api:`openai-responses`,reasoning:!0,input:[`text`,`image`],cost:{input:2,output:6,cacheRead:.5,cacheWrite:0},contextWindow:5e5,maxTokens:5e5,thinkingLevelMap:{off:null,minimal:null,low:`low`,medium:`medium`,high:`high`,xhigh:`xhigh`,max:null}},...e]:e}function F(){return P(n(`xai`))}function I(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap,cost:e.cost}}function L(e){let t=F(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${M}"`),n=t.find(e=>e.id===M),!n))throw Error(`xAI default model "${M}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:j}}async function R(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:k,client_id:D,code_verifier:t}),r=await fetch(E,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new h(`xAI token exchange failed: ${r.status} ${await r.text()}`,m.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new h(`xAI token exchange did not return access_token.`,m.TOKEN_EXCHANGE_INVALID);return i}async function z(e){if(l())return null;try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:D}),n=await fetch(E,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});if(!n.ok){let e=await n.text();return u(n.status,e)||console.error(`[xai-grok] refresh failed:`,n.status,e),null}return await n.json()}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function B(){return c().find(e=>e.providerId===C)}async function V(){let e=B();if(!e?.accessToken)throw new h("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",m.AUTH_MISSING,!0);let t=e.tokenExpiresAt??0;if(t&&Date.now()+6e4<t)return e.accessToken;if(e.refreshToken){let t=await z(e.refreshToken);if(t?.access_token)return await s({providerId:C,accessToken:t.access_token,refreshToken:t.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(t.expires_in??21600)*1e3,scopes:t.scope??e.scopes}),t.access_token}return e.accessToken}async function H(){if(!B()?.accessToken)throw Error(`xAI Grok budget: not signed in`);return S(await V(),fetch)}function U(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:N,provider:C,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function W(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}function G(e){console.error(`[xai-grok] Stream error:`,e instanceof Error?e.message:String(e))}async function K(e,t,n,r){try{let o=await V(),s=r.sessionId,c=L(t),l={...r,apiKey:o,headers:W(r.headers,s)},u=c.api===`openai-responses`?i(c,n,l):a(c,n,l);for await(let t of u)e.push(t);e.end()}catch(n){G(n),e.push(U(t,n)),e.end()}}async function q(e,t,n,i){try{let a=await V(),s=i?.sessionId,c=L(t),l={...i,apiKey:a,headers:W(i?.headers,s)},u=c.api===`openai-responses`?r(c,n,l):o(c,n,l);for await(let t of u)e.push(t);e.end()}catch(n){G(n),e.push(U(t,n)),e.end()}}var J=(t,n,r={})=>{let i=e();return K(i,t,n,r).catch(G),i},Y=(t,n,r)=>{let i=e();return q(i,t,n,r).catch(G),i},X={id:C,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.7.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:M,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`,`cli-chat-proxy.grok.com`],getModelIds:()=>F().map(I),getBudgetUsage:H,onOAuthLoginIntercepted:async(e,t,n)=>{let r=d(),i=await p(r),a=f(),o=f(),c=new URL(T);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,D),c.searchParams.set(`redirect_uri`,k),c.searchParams.set(`scope`,n?.scopes??O),c.searchParams.set(`code_challenge`,i),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,a),c.searchParams.set(`nonce`,o),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let l=await e({authorizeUrl:c.toString(),redirectUriPattern:A,onCapture:`close`});if(!l)throw new h(`xAI OAuth login was cancelled or timed out`,m.CALLBACK_TIMEOUT);let u=new URL(l),g=u.searchParams.get(`code`),_=u.searchParams.get(`state`);if(!g)throw new h(`xAI OAuth redirect did not include a code`,m.CODE_MISSING);if(_!==a)throw new h(`xAI OAuth state mismatch — possible CSRF, aborting`,m.STATE_MISMATCH);let v=await R(g,r);await s({providerId:C,accessToken:v.access_token,refreshToken:v.refresh_token,tokenExpiresAt:Date.now()+(v.expires_in??21600)*1e3,baseUrl:j,scopes:v.scope}),t()},onOAuthLogout:async()=>{await s({providerId:C,accessToken:``})},onSilentRenew:async()=>{let e=B();if(!e?.refreshToken)return null;let t=await z(e.refreshToken);return t?.access_token?(await s({providerId:C,accessToken:t.access_token,refreshToken:t.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(t.expires_in??21600)*1e3,scopes:t.scope??e.scopes}),t.access_token):null}};function Z(){t({api:N,stream:J,streamSimple:Y})}export{m as XaiErrorCode,h as XaiOAuthError,X as config,Z as register};
1
+ import{a as e}from"./diagnostics-DN_idNHx.js";import{a as t,r as n}from"./compat-qQM4gjF_.js";import{c as r,i,r as a,s as o}from"./legacy-api-aliases-DtQJ5I7w.js";import{G as s,f as c}from"./account-store-SI8RQbm0.js";import"./main-DFTTAllP.js";import{n as l,r as u}from"./bridge-token-required-DMk2va9k.js";import{n as d,r as f,t as p}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as m,XaiOAuthError as h}from"./xai-grok-errors-bnlIBeu-.js";var g=`https://cli-chat-proxy.grok.com/v1/billing?format=credits`,_=8e3,v=65536,y=1e3;function b(e){return typeof e==`object`&&!!e}function x(e){if(!b(e))return null;let t=b(e.config)?e.config:e,n=t.creditUsagePercent;if(typeof n!=`number`||!Number.isFinite(n))return null;let r=Math.min(y,Math.max(0,n)),i=b(t.currentPeriod)?t.currentPeriod:{},a=i.type,o=typeof a==`string`?a.replace(`USAGE_PERIOD_TYPE_`,``).toLowerCase():``,s=i.end??t.billingPeriodEnd,c=typeof s==`string`&&Number.isFinite(Date.parse(s))?s:void 0;return{percent:r,status:`ok`,window:o&&o!==`unspecified`?o:`billing`,...c?{resetsAt:c}:{}}}async function S(e,t,n={}){let r=new AbortController,i=setTimeout(()=>r.abort(),n.timeoutMs??_);try{let n=await t(g,{headers:{Authorization:`Bearer ${e}`},signal:r.signal}),{status:i}=n;if(i===404||i===501)return null;if(!n.ok)throw Error(`xAI Grok usage: ${i===401||i===403?`re-login required`:`failed`} (${i})`);let a=await n.text();if(a.length>v)return null;try{return x(JSON.parse(a))}catch{return null}}finally{clearTimeout(i)}}var C=`xai-grok`,w=`https://auth.x.ai`,T=`${w}/oauth2/authorize`,E=`${w}/oauth2/token`,D=`b1a00492-073a-47ea-816f-4c329264a828`,O=`openid profile email offline_access grok-cli:access api:access`,k=`http://127.0.0.1:56121/callback`,A=`http://127.0.0.1:56121/*`,j=`https://api.x.ai/v1`,M=`grok-4.7`,N=`${C}-openai`;function P(e){if(e.some(e=>e.id===M))return e;let t=e.find(e=>e.id===`grok-4.6`)??e.find(e=>e.api===`openai-responses`)??e[0];return t?[{...t,id:M,name:`Grok 4.7`,api:`openai-responses`,reasoning:!0,input:[`text`,`image`],cost:{input:2,output:6,cacheRead:.5,cacheWrite:0},contextWindow:5e5,maxTokens:5e5,thinkingLevelMap:{off:null,minimal:null,low:`low`,medium:`medium`,high:`high`,xhigh:`xhigh`,max:null}},...e]:e}function F(){return P(n(`xai`))}function I(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap,cost:e.cost}}function L(e){let t=F(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${M}"`),n=t.find(e=>e.id===M),!n))throw Error(`xAI default model "${M}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:j}}async function R(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:k,client_id:D,code_verifier:t}),r=await fetch(E,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new h(`xAI token exchange failed: ${r.status} ${await r.text()}`,m.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new h(`xAI token exchange did not return access_token.`,m.TOKEN_EXCHANGE_INVALID);return i}async function z(e){if(l())return null;try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:D}),n=await fetch(E,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});if(!n.ok){let e=await n.text();return u(n.status,e)||console.error(`[xai-grok] refresh failed:`,n.status,e),null}return await n.json()}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function B(){return c().find(e=>e.providerId===C)}async function V(){let e=B();if(!e?.accessToken)throw new h("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",m.AUTH_MISSING,!0);let t=e.tokenExpiresAt??0;if(t&&Date.now()+6e4<t)return e.accessToken;if(e.refreshToken){let t=await z(e.refreshToken);if(t?.access_token)return await s({providerId:C,accessToken:t.access_token,refreshToken:t.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(t.expires_in??21600)*1e3,scopes:t.scope??e.scopes}),t.access_token}return e.accessToken}async function H(){if(!B()?.accessToken)throw Error(`xAI Grok budget: not signed in`);return S(await V(),fetch)}function U(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:N,provider:C,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function W(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}function G(e){console.error(`[xai-grok] Stream error:`,e instanceof Error?e.message:String(e))}async function K(e,t,n,r){try{let o=await V(),s=r.sessionId,c=L(t),l={...r,apiKey:o,headers:W(r.headers,s)},u=c.api===`openai-responses`?i(c,n,l):a(c,n,l);for await(let t of u)e.push(t);e.end()}catch(n){G(n),e.push(U(t,n)),e.end()}}async function q(e,t,n,i){try{let a=await V(),s=i?.sessionId,c=L(t),l={...i,apiKey:a,headers:W(i?.headers,s)},u=c.api===`openai-responses`?r(c,n,l):o(c,n,l);for await(let t of u)e.push(t);e.end()}catch(n){G(n),e.push(U(t,n)),e.end()}}var J=(t,n,r={})=>{let i=e();return K(i,t,n,r).catch(G),i},Y=(t,n,r)=>{let i=e();return q(i,t,n,r).catch(G),i},X={id:C,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.7.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:M,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`,`cli-chat-proxy.grok.com`],getModelIds:()=>F().map(I),getBudgetUsage:H,onOAuthLoginIntercepted:async(e,t,n)=>{let r=d(),i=await p(r),a=f(),o=f(),c=new URL(T);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,D),c.searchParams.set(`redirect_uri`,k),c.searchParams.set(`scope`,n?.scopes??O),c.searchParams.set(`code_challenge`,i),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,a),c.searchParams.set(`nonce`,o),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let l=await e({authorizeUrl:c.toString(),redirectUriPattern:A,onCapture:`close`});if(!l)throw new h(`xAI OAuth login was cancelled or timed out`,m.CALLBACK_TIMEOUT);let u=new URL(l),g=u.searchParams.get(`code`),_=u.searchParams.get(`state`);if(!g)throw new h(`xAI OAuth redirect did not include a code`,m.CODE_MISSING);if(_!==a)throw new h(`xAI OAuth state mismatch — possible CSRF, aborting`,m.STATE_MISMATCH);let v=await R(g,r);await s({providerId:C,accessToken:v.access_token,refreshToken:v.refresh_token,tokenExpiresAt:Date.now()+(v.expires_in??21600)*1e3,baseUrl:j,scopes:v.scope}),t()},onOAuthLogout:async()=>{await s({providerId:C,accessToken:``})},onSilentRenew:async()=>{let e=B();if(!e?.refreshToken)return null;let t=await z(e.refreshToken);return t?.access_token?(await s({providerId:C,accessToken:t.access_token,refreshToken:t.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(t.expires_in??21600)*1e3,scopes:t.scope??e.scopes}),t.access_token):null}};function Z(){t({api:N,stream:J,streamSimple:Y})}export{m as XaiErrorCode,h as XaiOAuthError,X as config,Z as register};
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>slicc</title>
7
7
  <link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
8
- <script type="module" crossorigin src="/assets/main-DkHBZ-Z8.js"></script>
8
+ <script type="module" crossorigin src="/assets/main-DFTTAllP.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-Dd_uD5pT.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/diagnostics-DN_idNHx.js">
@@ -30,11 +30,11 @@
30
30
  <link rel="modulepreload" crossorigin href="/assets/tool-ui-eSQ1g2I1.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/core-zz8rWM4c.js">
32
32
  <link rel="modulepreload" crossorigin href="/assets/bridge-protocol-C52CnDIj.js">
33
- <link rel="modulepreload" crossorigin href="/assets/providers-BIgVZAND.js">
33
+ <link rel="modulepreload" crossorigin href="/assets/providers-B9p2VR5L.js">
34
34
  <link rel="modulepreload" crossorigin href="/assets/panel-rpc-B3MSVImO.js">
35
35
  <link rel="modulepreload" crossorigin href="/assets/bedrock-camp-compat-BeCSBUrZ.js">
36
36
  <link rel="modulepreload" crossorigin href="/assets/claude-model-version-DZmbk9E2.js">
37
- <link rel="modulepreload" crossorigin href="/assets/account-store-BBDgfG4U.js">
37
+ <link rel="modulepreload" crossorigin href="/assets/account-store-SI8RQbm0.js">
38
38
  <link rel="modulepreload" crossorigin href="/assets/telemetry-CKoAhRMv.js">
39
39
  <link rel="modulepreload" crossorigin href="/assets/tray-follower-status-BAjnN7Ar.js">
40
40
  <link rel="modulepreload" crossorigin href="/assets/clipboard-eqmn97SP.js">
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>slicc</title>
7
7
  <link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
8
- <script type="module" crossorigin src="/assets/main-DkHBZ-Z8.js"></script>
8
+ <script type="module" crossorigin src="/assets/main-DFTTAllP.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-Dd_uD5pT.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/diagnostics-DN_idNHx.js">
@@ -30,11 +30,11 @@
30
30
  <link rel="modulepreload" crossorigin href="/assets/tool-ui-eSQ1g2I1.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/core-zz8rWM4c.js">
32
32
  <link rel="modulepreload" crossorigin href="/assets/bridge-protocol-C52CnDIj.js">
33
- <link rel="modulepreload" crossorigin href="/assets/providers-BIgVZAND.js">
33
+ <link rel="modulepreload" crossorigin href="/assets/providers-B9p2VR5L.js">
34
34
  <link rel="modulepreload" crossorigin href="/assets/panel-rpc-B3MSVImO.js">
35
35
  <link rel="modulepreload" crossorigin href="/assets/bedrock-camp-compat-BeCSBUrZ.js">
36
36
  <link rel="modulepreload" crossorigin href="/assets/claude-model-version-DZmbk9E2.js">
37
- <link rel="modulepreload" crossorigin href="/assets/account-store-BBDgfG4U.js">
37
+ <link rel="modulepreload" crossorigin href="/assets/account-store-SI8RQbm0.js">
38
38
  <link rel="modulepreload" crossorigin href="/assets/telemetry-CKoAhRMv.js">
39
39
  <link rel="modulepreload" crossorigin href="/assets/tray-follower-status-BAjnN7Ar.js">
40
40
  <link rel="modulepreload" crossorigin href="/assets/clipboard-eqmn97SP.js">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliccy",
3
- "version": "6.178.1",
3
+ "version": "6.178.2",
4
4
  "description": "Browser-based coding agent with thin CLI server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -1 +0,0 @@
1
- var e="---\nname: computer\ndescription: |\n Use this when looking at and poking a screen with SLICC's `computer`\n shell command (xdotool grammar). Covers v86 guests (`v86:<name>`),\n browser tabs (`tab:<id>`), display share (`screen:<handle>`), follower\n desktops (`ssh:<runtimeId>`), HTTP remotes (`url:<host>`), jsh-hosted\n backends, screenshot-space coordinates, frozen JPEG frames, and chaining\n click/type/key.\nallowed-tools: bash\n---\n\n# computer — look at and poke a screen\n\n`computer` is the look-then-act loop for every registered screen. Prefer it over `v86 type|key|mouse|screenshot|text` once a guest is running. `v86 start` still boots the VM and registers `v86:<name>`.\n\n## Target\n\n```bash\ncomputer ls # ids, kinds, sizes\ncomputer use v86:arch # default for later verbs\ncomputer info # descriptor for the current target\n```\n\nResolution order: `-c` / `--computer`, else `$COMPUTER`, else last `computer use`, else the only registered computer.\n\n## Look then act\n\nEvery poke writes a frozen JPEG and prints `target: <id>` then `screen: <path>`. The `target:` line is the resolved computer (`-c`, `$COMPUTER`, last `use`, or the only registered one) so a later `computer screenshot` without `-c` still binds the bash-row UI. That poke frame is a transcript side effect only — it does **not** redefine the coordinate space, so never read new coordinates off it (it can come back narrower and your clicks would map to the wrong place). Run a fresh `computer screenshot` before choosing coordinates for the next click. If the frozen frame cannot be captured, the poke still exits 0 (it already happened); do not retry the same click.\n\n```bash\ncomputer screenshot # JPEG; prints WxH → wxh (scale s)\ncomputer screenshot --size high out.jpg\ncomputer text # text-mode dump when the backend supports it\n```\n\n`--size` is `low` (256), `medium` (768, default), `high` (1536), or a max width. Coordinates on later verbs are in that last `computer screenshot` (the last model-facing shot) unless `--native` — a poke's frozen frame does not update that space. `--native` is the pixel space `computer info --json` advertises (`size` / lastShot). Tab computers screenshot in device pixels; clicks are converted to CSS pixels with the tab's `devicePixelRatio` before they hit the page. A human can also click, scroll, and type in the live lightbox when the computer allows input; Escape releases. Frozen stills in the transcript never forward.\n\n## Poke (xdotool; chainable)\n\n```bash\ncomputer mousemove 120 80\ncomputer click 1 --at 120,80 # 1 left, 2 middle, 3 right\ncomputer click 120 80 # two numbers → coords, button 1\ncomputer drag 10 10 200 80\ncomputer scroll 0 -3 --at 120,80\ncomputer key ctrl+alt+Delete Return\ncomputer type hello world\ncomputer wait 400\ncomputer click 1 type hello # chain: click, then type\n```\n\nAnthropic aliases work the same: `left_click`, `right_click`, `mouse_move`, `left_click_drag`, `screenshot`, …\n\n## v86 guest\n\n```bash\nv86 start -n arch -state \"$TMPDIR/arch_state.bin.zst\" -fs9p https://i.copy.sh/arch/ -net virtio -m 512\ncomputer use v86:arch\ncomputer screenshot\ncomputer type \"uname -a\\n\"\ncomputer key Return\ncomputer record -V 5 guest.webm\n```\n\n`computer rm` unregisters `v86:<name>` and does **not** power the guest off. `v86 stop` / `kill <pid>` still does. `v86 serve` is retired — use `computer watch -c v86:<name>`.\n\n## Browser tab\n\n```bash\nplaywright-cli tab-list # pick a targetId that is not the SLICC app\ncomputer add tab <targetId> -n docs\ncomputer screenshot -c tab:<targetId>\ncomputer click 1 --at 100,80 type hello\n```\n\n`computer add tab` refuses SLICC app tabs (`sliccy.ai` leader, `?slicc=`, extension pages). Pass a URL or a CDP target id. Look at the screenshot and click what you see — screenshot-space `--at` lands on the visual target even when `devicePixelRatio` is not 1.\n\n## Display share (`screen`)\n\n```bash\ncomputer add screen -n desk # panel terminal or cone approval card\ncomputer screenshot -c screen:screen1\ncomputer record -V 10 clip.webm # timed clip from the live session\ncomputer rm screen:screen1 # stops the getDisplayMedia tracks\n```\n\n`computer add screen` needs a real user gesture (`getDisplayMedia`). Type it in the panel terminal, or run it from a cone tool call so an approval card can open the picker. `computer ls` marks a live share with `[display slot]`. Input (keyboard/mouse) is not supported. Screen share cannot come back after `jshd --enable` restore — there is no gesture at boot.\n\n`computer record` writes a clip to a VFS path (default `clip.webm`, max 60s). `screen` uses the live session recorder; v86/tab/url/jsh/ssh poll JPEG stills and pipe them through in-repo ffmpeg wasm (`-f image2pipe`). Default `--fps` is 2.\n\n## Follower desktop (`ssh`)\n\n```bash\nssh --list # exec-capable tray followers\ncomputer add ssh follower-abc -n desk # view-only\ncomputer screenshot\ncomputer add ssh follower-abc --allow-input\ncomputer click 1 --at 100,80 type hello\ncomputer add ssh mac-follower --sim UDID-1 --allow-input # iOS Simulator\n```\n\nProbes at add: native ScreenCaptureKit/CGEvent when the follower advertises `capabilities.computer` (Swift launcher `sliccstart-computer`); else `screencapture` + `cliclick` (macOS), `grim`/`scrot`/`import` + `xdotool`/`ydotool` (Linux), `xcrun simctl io <udid> screenshot` + `idb ui` (`--sim`).\n\nA Mac started with `slicc <join-url> follow --computer` shows as **one** entry in `ssh --list` holding both exec and native capture — the CLI and the headless Sliccstart it spawned are folded by a shared `hello.pairId`. Point `computer add ssh` at that one id and it picks ScreenCaptureKit automatically. Without `--computer` the same Mac may appear twice (a `follower-…` with exec and a `sliccstart-computer` with capture); either works, but only the native one captures under SLICC's own screen-recording permission. Frames come back base64 in ≤3 MiB chunks over tray-exec (or `computer.native.frame` when native). `--allow-input` is a sudo hop (`kind: command`) so a phone can answer with Face ID; `computer ls` shows `[input]` or `[view-only]`. The iOS follower itself is never a driven computer (a real iPhone is out of scope).\n\n## HTTP remote (`url`)\n\n```bash\ncomputer add url http://127.0.0.1:5710 -n demo\ncomputer screenshot\ncomputer text\ncomputer type hello\n```\n\nThe remote must answer `GET /computer` with a `ComputerDescriptor`. Screenshots are `GET /computer/screenshot`; optional `GET /computer/text` (404 means none); input is `POST /computer/input`. A trailing `/computer` on the base is stripped. Live frames use `WS /computer/frames` only when the descriptor advertises `frames: \"push\"`; a failed or closed socket falls back to screenshot polling. Otherwise `computer watch` polls. The in-tree reference is node-server `--computer-demo` (same port as the `/cdp` bridge).\n\n## jsh-hosted backend\n\nA durable `.jsh` can register a computer with `require('sliccy:computer').register(...)`. `register()` subscribes to host `computer-call` events, which keeps `jshd` alive. Optional `handlers.subscribe(fps, onFrame, maxWidth)` is the `computer watch` push path. Example: `/workspace/skills/jshd/examples/fake-computer.jsh`.\n";export{e as default};
@@ -1 +0,0 @@
1
- import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";var t=e({MINIMAL_JPEG:()=>n,bytesFromBase64:()=>c,encodeRgbaFrame:()=>s,fitComputerFrame:()=>l,fitRgbaFrame:()=>a,jpegSize:()=>r,pngBytesToJpeg:()=>o,pngSize:()=>i});const n=Uint8Array.of(255,216,255,192,0,11,8,0,1,0,1,1,1,17,0,255,217);function r(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 i(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}function a(e,t){if(!t||e.width<=t||e.width<=0)return e;let n=t/e.width,r=Math.max(1,Math.round(e.width*n)),i=Math.max(1,Math.round(e.height*n)),a=new Uint8ClampedArray(r*i*4);for(let t=0;t<i;t++){let i=Math.min(e.height-1,Math.round(t/n));for(let o=0;o<r;o++){let s=Math.min(e.width-1,Math.round(o/n)),c=(i*e.width+s)*4,l=(t*r+o)*4;a[l]=e.data[c],a[l+1]=e.data[c+1],a[l+2]=e.data[c+2],a[l+3]=e.data[c+3]}}return{data:a,width:r,height:i}}async function o(e,t=.7){if(r(e))return e;if(typeof OffscreenCanvas>`u`||typeof createImageBitmap>`u`)return n.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:t});return new Uint8Array(await c.arrayBuffer())}async function s(e,t,r=.7){if(typeof OffscreenCanvas>`u`)return n.slice();let i=new OffscreenCanvas(e.width,e.height),a=i.getContext(`2d`);if(!a)throw Error(`could not acquire 2d canvas context`);let o=e.data;a.putImageData(new ImageData(o,e.width,e.height),0,0);let s=await i.convertToBlob({type:t,...t===`image/jpeg`?{quality:r}:{}});return new Uint8Array(await s.arrayBuffer())}function c(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}async function l(e,t,n=u){if(!t||e.width<=t)return e.overCap?{seq:e.seq,mime:e.mime,width:e.width,height:e.height,bytes:e.bytes}:e;let r=t/e.width,i=Math.max(1,Math.round(e.width*r)),a=Math.max(1,Math.round(e.height*r)),o=await n(e,i,a);return o?{seq:e.seq,mime:`image/jpeg`,width:i,height:a,bytes:o}:{...e,overCap:!0}}async function u(e,t,n){if(typeof OffscreenCanvas>`u`||typeof createImageBitmap>`u`)return null;try{let r=new Blob([new Uint8Array(e.bytes)],{type:e.mime}),i=await createImageBitmap(r),a=new OffscreenCanvas(t,n),o=a.getContext(`2d`);if(!o)return i.close(),null;o.drawImage(i,0,0,t,n),i.close();let s=await a.convertToBlob({type:`image/jpeg`,quality:.7});return new Uint8Array(await s.arrayBuffer())}catch{return null}}export{a,i as c,l as i,s as n,r as o,t as r,o as s,c as t};
@@ -1 +0,0 @@
1
- import{t as e}from"./tmpdir-env-ate4iNcK.js";import{n as t}from"./encode-frame-30wbFN-H.js";const n={ctrl:!1,alt:!1,shift:!1,meta:!1},r={ctrl:`ctrl`,control:`ctrl`,alt:`alt`,shift:`shift`,meta:`meta`,super:`meta`,win:`meta`,cmd:`meta`,command:`meta`},i={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++)i[`f${e}`]={key:`F${e}`,code:`F${e}`};const a={enter:[28],tab:[15],esc:[1],escape:[1],space:[57],backspace:[14],delete:[224,83],del:[224,83],up:[224,72],down:[224,80],left:[224,75],right:[224,77],home:[224,71],end:[224,79],pageup:[224,73],pagedown:[224,81],insert:[224,82],f1:[59],f2:[60],f3:[61],f4:[62],f5:[63],f6:[64],f7:[65],f8:[66],f9:[67],f10:[68],f11:[87],f12:[88]},o={ctrl:[29],alt:[56],shift:[42],meta:[224,91]},s={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++)s[`f${e}`]=`KEYCODE_F${e}`;const c={return:`return`,enter:`return`,tab:`tab`,escape:`esc`,esc:`esc`,space:`space`,backspace:`delete`,delete:`fwd-delete`,del:`fwd-delete`,home:`home`,end:`end`,pageup:`page-up`,pagedown:`page-down`,up:`arrow-up`,down:`arrow-down`,left:`arrow-left`,right:`arrow-right`};function l(e){return/^[A-Z][A-Z0-9_]+$/u.test(e)}function u(e){return e.split(/[-+]/u).filter(Boolean)}function d(e){let t=e.toLowerCase();if(i[t])return i[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 f(e){let t=e.trim();if(!t)return null;if(l(t))return{key:t,code:t,modifiers:{...n},keysym:t,native:t};let i=u(t);if(i.length===0)return null;let a={...n},o=null;for(let e=0;e<i.length;e++){let t=i[e],n=e===i.length-1,s=r[t.toLowerCase()];if(s&&!n){a[s]=!0;continue}s&&n&&i.length,o=t}if(!o)return null;if(l(o))return{key:o,code:o,modifiers:a,keysym:o,native:o};let s=d(o);return s?(o.length===1&&/[A-Z]/u.test(o)&&(a.shift=!0),{key:s.key,code:s.code,modifiers:a,keysym:o}):null}function p(e){let t=`1234567890`.indexOf(e);if(t!==-1)return[t===9?11:2+t];let n=[16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,36,37,38,44,45,46,47,48,49,50],r=`qwertyuiopasdfghjklzxcvbnm`.indexOf(e.toLowerCase());return r===-1?null:[n[r]]}function m(e){return e.length===2?[e[0],e[1]|128]:[e[0]|128]}function h(e){let t=e.toLowerCase().split(/[-+]/u).filter(Boolean);if(t.length===0)return null;let n=[],r=[];for(let e=0;e<t.length;e++){let i=t[e];if(e!==t.length-1&&o[i]){n.push(o[i]);continue}let s=a[i]??o[i]??(i.length===1?p(i):null);if(!s)return null;r.push(s)}if(r.length===0)return null;let i=[];for(let e of n)i.push(...e);for(let e of r)i.push(...e,...m(e));for(let e of[...n].reverse())i.push(...m(e));return i}function g(e){return+!!e.alt+(e.ctrl?2:0)+(e.meta?4:0)+(e.shift?8:0)}function _(e,t){let n=g(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 v(e,t=`press`){let n=t===`down`?`kd`:t===`up`?`ku`:`kp`;if(e.native)return`${n}:${e.native}`;let r=c[e.keysym.toLowerCase()]??(e.key.length===1?e.key:e.keysym.toLowerCase()),i=[];return e.modifiers.ctrl&&i.push(`ctrl`),e.modifiers.alt&&i.push(`alt`),e.modifiers.shift&&i.push(`shift`),e.modifiers.meta&&i.push(`cmd`),`${n}:${i.length>0?`${i.join(`,`)},${r}`:r}`}const y={Enter:`Return`,Escape:`Escape`," ":`space`,Backspace:`BackSpace`,Delete:`Delete`,Tab:`Tab`,ArrowUp:`Up`,ArrowDown:`Down`,ArrowLeft:`Left`,ArrowRight:`Right`,Home:`Home`,End:`End`,PageUp:`Page_Up`,PageDown:`Page_Down`,Insert:`Insert`};function b(e){let t=e.native??(e.key.length===1?e.key:y[e.key]??e.keysym),n=D(e.modifiers);return n?`${n}+${t}`:t}const x={Escape:1,Digit1:2,Digit2:3,Digit3:4,Digit4:5,Digit5:6,Digit6:7,Digit7:8,Digit8:9,Digit9:10,Digit0:11,Backspace:14,Tab:15,Enter:28,Control:29,Shift:42,Space:57,Alt:56,F1:59,F2:60,F3:61,F4:62,F5:63,F6:64,F7:65,F8:66,F9:67,F10:68,F11:87,F12:88,Home:102,ArrowUp:103,PageUp:104,ArrowLeft:105,ArrowRight:106,End:107,ArrowDown:108,PageDown:109,Insert:110,Delete:111,Meta:125},S=[16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,36,37,38,44,45,46,47,48,49,50];function C(e){if(e.key.length===1){let t=`qwertyuiopasdfghjklzxcvbnm`.indexOf(e.key.toLowerCase());if(t!==-1)return S[t];if(e.key>=`1`&&e.key<=`9`)return 2+(e.key.charCodeAt(0)-49);if(e.key===`0`)return 11}return x[e.code]??x[e.key]??null}function w(e,t){return`${e}:${+!!t}`}function T(e,t=`press`){let n=C(e);if(n==null)return``;let r=[];if(e.modifiers.ctrl&&r.push(29),e.modifiers.shift&&r.push(42),e.modifiers.alt&&r.push(56),e.modifiers.meta&&r.push(125),t===`down`)return[...r.map(e=>w(e,!0)),w(n,!0)].join(` `);if(t===`up`)return[w(n,!1),...[...r].reverse().map(e=>w(e,!1))].join(` `);let i=[...r.map(e=>w(e,!0)),w(n,!0)],a=[w(n,!1),...[...r].reverse().map(e=>w(e,!1))];return[...i,...a].join(` `)}function E(e){if(e.type===`mousemove`||e.type===`wait`||e.type===`key`||e.type===`text`)return{kind:`noop`};if(e.type===`click`){let t=e.x??0,n=e.y??0;return e.holdMs&&e.holdMs>0?{kind:`long-press`,x:t,y:n,holdMs:e.holdMs}:{kind:`tap`,x:t,y:n}}if(e.type===`drag`)return{kind:`swipe`,x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2};if(e.type===`button`){let t=e.x??0,n=e.y??0;return e.down?{kind:`tap`,x:t,y:n}:{kind:`noop`}}let t=e.x??0,n=e.y??0;return{kind:`swipe`,x1:t,y1:n,x2:t+e.dx,y2:n+e.dy}}function D(e){let t=[];return e.ctrl&&t.push(`ctrl`),e.alt&&t.push(`alt`),e.shift&&t.push(`shift`),e.meta&&t.push(`super`),t.join(`+`)}function O(e){return`screen: ${e}`}function k(e){return`target: ${e}`}async function A(t){let n=`${e(t.env).replace(/\/$/u,``)}/computer/${t.name}`,r=`${n}/${t.seq}.jpg`,i=t.fs.resolvePath(t.cwd,n),a=t.fs.resolvePath(t.cwd,r);return await t.fs.mkdir(i,{recursive:!0}),await t.fs.writeFile(a,t.frame.bytes),a}async function j(e){return t(e,`image/jpeg`,.55)}export{h as a,v as c,T as d,A as i,E as l,O as n,f as o,j as r,_ as s,k as t,b as u};
@@ -1 +0,0 @@
1
- import{i as e}from"./encode-frame-30wbFN-H.js";import{installComputerRegistry as t}from"./registry-qHtWYFOX.js";function n(e){if(e instanceof Uint8Array){let t=new Uint8Array(e.byteLength);return t.set(e),t}if(e instanceof ArrayBuffer)return new Uint8Array(e.slice(0));if(ArrayBuffer.isView(e)){let t=e;return new Uint8Array(t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength))}return Array.isArray(e)?Uint8Array.from(e):e&&typeof e==`object`?i(e):new Uint8Array}function r(e){if(typeof e.byteLength==`number`)return e.byteLength;if(typeof e.length==`number`)return e.length;let t=-1;for(let n of Object.keys(e)){if(!/^\d+$/.test(n))continue;let e=Number(n);e>t&&(t=e)}return t+1}function i(e){let t=r(e),n=new Uint8Array(t);for(let r=0;r<t;r++){let t=e[r];typeof t==`number`&&(n[r]=t&255)}return n}let a=null;function o(){return a}function s(r){let i=t(r.processManager),o=new Map,s=r.pollTimeoutMs??8e3,l=i.list(),u=(e,t)=>{r.transport.send(e,t)},d=i.onChange(e=>{l=e,u({type:`computers`,computers:e})}),f=(e,t,n)=>{p(e,t,n)},p=async(t,r,i)=>{let a=o.get(t);if(!a||a.generation!==i)return;let s=await e(r,a.maxWidth);if(a.generation!==i||s.seq<=a.lastSentSeq)return;a.lastSentSeq=s.seq;let c=n(s.bytes);u({type:`computer-frame`,id:t,seq:s.seq,mime:s.mime,width:s.width,height:s.height,bytes:c,...s.overCap?{overCap:!0}:{}},[c.buffer])},m=e=>{let t=o.get(e);t&&(t.generation+=1,o.delete(e),t.unsub?.(),t.timer&&clearInterval(t.timer))},h=e=>{m(e.id);let t=i.get(e.id);if(!t)return;let n=Math.max(1,Math.min(10,Math.round(e.fps)||2)),r=e.maxWidth>0?e.maxWidth:768,a={id:e.id,fps:n,maxWidth:r,generation:1,lastSentSeq:-1/0,unsub:null,timer:null,inFlight:!1};if(o.set(e.id,a),t.subscribe){a.unsub=t.subscribe(n,t=>f(e.id,t,a.generation),r);return}let l=Math.round(1e3/n),u=()=>{c(a,t,s,t=>f(e.id,t,a.generation))};a.timer=setInterval(u,l),u()},g=r.transport.onMessage(e=>{if(!e||typeof e!=`object`||!(`source`in e)||e.source!==`panel`)return;let t=e.payload;if(t.type===`computer-watch`)h(t);else if(t.type===`computer-unwatch`)m(t.id);else if(t.type===`computer-input`){let e=t;i.get(e.id)?.input(e.events)}});u({type:`computers`,computers:l});let _={watch:(e,t,n)=>h({type:`computer-watch`,id:e,fps:t,maxWidth:n}),unwatch:m,isWatching:e=>o.has(e),stop:()=>{g(),d();for(let e of[...o.keys()])m(e);a===_&&(a=null)}};return a=_,_}async function c(e,t,n,r){if(e.inFlight)return;e.inFlight=!0;let i=e.generation,a=new AbortController;try{let o=await l(t.screenshot({format:`jpeg`,maxWidth:e.maxWidth,signal:a.signal}),n);if(e.generation!==i)return;r(o)}catch{a.abort()}finally{e.generation===i&&(e.inFlight=!1)}}function l(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`computer poll timed out`)),t);e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}export{o as getComputersHost,s as startComputersHost};
@@ -1 +0,0 @@
1
- import{b as e}from"./kernel-worker-ObCC3bZ4.js";function t(){return e(`memory-v2`)}export{t as isMemoryV2Enabled};
@@ -1,2 +0,0 @@
1
- import{Async as e,FileSystem as t,InMemory as n,IndexFS as r,Inode as i,Sync as a,a as o,d as s,f as c,h as l,i as u,isFile as d,m as f,n as p,o as m,p as h,r as g,resolveMountConfig as _,s as v,t as y,u as b,v as x}from"./dist-BZsj6rXC.js";import{i as S,r as C}from"./fs-Dn-aCLAC.js";function w(e){switch(e.name){case`TypeMismatchError`:return`EPERM`;case`IndexSizeError`:case`HierarchyRequestError`:case`InvalidCharacterError`:case`InvalidStateError`:case`SyntaxError`:case`NamespaceError`:case`ConstraintError`:case`VersionError`:case`URLMismatchError`:case`InvalidNodeTypeError`:return`EINVAL`;case`WrongDocumentError`:return`EXDEV`;case`NoModificationAllowedError`:case`InvalidModificationError`:case`InvalidAccessError`:case`SecurityError`:case`NotAllowedError`:return`EACCES`;case`NotFoundError`:return`ENOENT`;case`NotSupportedError`:return`ENOTSUP`;case`InUseAttributeError`:return`EBUSY`;case`NetworkError`:return`ENETDOWN`;case`AbortError`:return`EINTR`;case`QuotaExceededError`:return`ENOSPC`;case`TimeoutError`:return`ETIMEDOUT`;case`ReadOnlyError`:return`EROFS`;default:return`EIO`}}function T(e,t){if(e instanceof f)return e;let n=e instanceof DOMException?h[w(e)]:h.EIO,r=new f(n,e.message);return r.stack=e.stack,Error.captureStackTrace?.(r,T),r.cause=e.cause,r}function E(e){return typeof e==`object`&&!!e&&e.constructor.name==`SharedArrayBuffer`}function D(e){return e instanceof ArrayBuffer?e.resizable:E(e)?e.growable:!1}function O(e,t){return e.kind==t}var k=class extends e(r){async _loadHandles(e,t){for await(let[n,r]of t.entries()){let t=u(e,n);this._handles.set(t,r),O(r,`directory`)&&await this._loadHandles(t,r)}}async _loadMetadata(e){if(this._handles.set(`/`,this.root),await this._loadHandles(`/`,this.root),e){let t=await(await(await this.get(`file`,e)).getFile()).text(),n=JSON.parse(t);this.index.fromJSON(n);return}c(`webaccessfs: no metadata file specified, generating new metadata`);for(let[e,t]of this._handles){let n=this.index._alloc();if(O(t,`file`)){let{lastModified:r,size:a}=await t.getFile();this.index.set(e,new i({mode:420|v,size:a,mtimeMs:r,ino:n,data:n+1,nlink:1}));continue}if(!O(t,`directory`))throw l(`EIO`,`Invalid handle`);this.index.set(e,new i({mode:511|o,size:0,ino:n,data:n+1,nlink:1}))}}constructor(e,t=!1){super(2003133025,`webaccessfs`),this.root=e,this.disableHandleCache=t,this._handles=new Map,this._sync=n.create({label:`accessfs-cache`}),this.attributes.set(`no_buffer_resize`,!0),t&&this.attributes.set(`no_handle_cache`,!0)}async stat(e){try{return await super.stat(e)}catch(t){if(t.code!=`ENOENT`)throw t;let n=await this.get(null,e),r=this.index._alloc(),a=new i({ino:r,data:r+1,nlink:1});if(O(n,`file`)){let e=await n.getFile();a.update({mode:420|v,size:e.size,mtimeMs:e.lastModified})}else a.update({mode:o|511,size:0});return this.index.set(e,a),a}}async touch(e,t){let n=this.index.get(e);if(!n)throw l(`ENOENT`);if(typeof t.size!=`number`||!d(n))return await super.touch(e,t);let r=await this.get(`file`,e).catch(e=>{if(e.code!=`ENOENT`)throw e});if(!r)return await super.touch(e,t);let{size:i}=await r.getFile();if(i==t.size)return await super.touch(e,t);let a=await r.createWritable({keepExistingData:!!t.size});try{await a.truncate(t.size)}catch{await a.write({type:`truncate`,size:t.size})}await a.close(),await super.touch(e,t)}async readdir(e){let t=await this.get(`directory`,e);return await Array.fromAsync(t.keys())}async remove(e){let t=await this.get(`directory`,g(e));for(let t of this._handles.keys())g(t)==e&&this._handles.delete(t);this._handles.delete(e),await t.removeEntry(p(e),{recursive:!0}).catch(t=>{let n=T(t,e);n.code!=`ENOENT`&&x(n)})}removeSync(){throw s(l(`ENOSYS`))}async read(e,t,n,r){if(r<=n)return;let i=await this.get(`file`,e),a;for(let e=0;;e++){let t=await i.getFile();try{a=await t.arrayBuffer();break}catch(t){if(!(t instanceof DOMException)||t.name!==`NotReadableError`||e>=2)throw t}}if(a.byteLength<r-n)throw b(l(`EIO`,[`Unexpected mismatch in file data size. This should not happen.`,`tried to read ${r-n} bytes but the file is ${a.byteLength} bytes.`,`path: ${e}`].join(`
2
- `+` `.repeat(24))));t.set(new Uint8Array(a,n,r-n))}async write(e,t,n){if(D(t.buffer)||E(t.buffer)){let e=new Uint8Array(new ArrayBuffer(t.byteLength),t.byteOffset,t.byteLength);e.set(t),t=e}let r=this.index.get(e);if(!r)throw l(`ENOENT`);let i=(r.mode&m)==o,a;try{a=await this.get(i?`directory`:`file`,e)}catch{a=await(await this.get(`directory`,g(e)))[i?`getDirectoryHandle`:`getFileHandle`](p(e),{create:!0}).catch(t=>x(T(t,e))),this.disableHandleCache||this._handles.set(e,a)}if(i)return;if(O(a,`directory`)){s(l(`EIO`,`Mismatch in entry kind on write`));return}let c=await a.createWritable({keepExistingData:!0});if(n)try{await c.seek(n)}catch{await c.write({type:`seek`,position:n})}await c.write(t),await c.close();let{size:u,lastModified:d}=await a.getFile();r.update({size:u,mtimeMs:d}),this.index.set(e,r)}async writeFile(e,t){return this.write(e,t,0)}async _create(e,t){let n=await(await this.get(`directory`,g(e))).getFileHandle(p(e),{create:!0}).catch(t=>x(T(t,e)));this.disableHandleCache||this._handles.set(e,n)}async _mkdir(e){let t=await(await this.get(`directory`,g(e))).getDirectoryHandle(p(e),{create:!0}).catch(t=>x(T(t,e)));this.disableHandleCache||this._handles.set(e,t)}async get(e=null,t){let n=this._handles.get(t);if(!this.disableHandleCache&&n){if(e&&!O(n,e))throw l(e==`directory`?`ENOTDIR`:`EISDIR`);return n}if(t==`/`)return this.root;let r=t.slice(1).split(`/`),i=this.root;for(let e=0;e<r.length-1;++e)i=await i.getDirectoryHandle(r[e]).catch(e=>x(e.name==`TypeMismatchError`?l(`ENOTDIR`):T(e,t)));try{let n=await i[e==`file`?`getFileHandle`:`getDirectoryHandle`](r.at(-1));return this.disableHandleCache||this._handles.set(t,n),n}catch(n){if(n.name!=`TypeMismatchError`)throw T(n,t);if(e===null){let e=await i.getFileHandle(r.at(-1)).catch(e=>x(T(e,t)));return this.disableHandleCache||this._handles.set(t,e),e}throw l(e==`file`?`EISDIR`:`ENOTDIR`)}}},A={name:`WebAccess`,options:{handle:{type:`object`,required:!0},metadata:{type:`string`,required:!1},disableHandleCache:{type:`boolean`,required:!1},maxOpenFilesForCopy:{type:`number`,required:!1}},async create(e){let t=new k(e.handle,e.disableHandleCache);return t._crossCopySemaphore=new y(e.maxOpenFilesForCopy??128),await t._loadMetadata(e.metadata),t}};a(t);var j=16;async function M({handle:e,dbName:t,asyncCache:n,onRepairProgress:r,withWriteLock:i}){let a=()=>i(()=>C(e,r));try{let e=await a();e?.changed&&console.warn(`[virtual-fs] repaired metadata sidecar before mount (#2146)`,{dbName:t,kindFixed:e.kindFixed,sizesFixed:e.sizesFixed,dropped:e.dropped,inosReassigned:e.inosReassigned,nlinksFixed:e.nlinksFixed,selfEntryDropped:e.selfEntryDropped})}catch{}return S(()=>_({backend:A,handle:e,metadata:`/.metadata.json`,maxOpenFilesForCopy:j,disableAsyncCache:n===!1}),a,e=>console.warn(`[virtual-fs] repaired poisoned metadata sidecar; retrying mount`,{dbName:t,kindFixed:e.kindFixed,sizesFixed:e.sizesFixed,dropped:e.dropped,nlinksFixed:e.nlinksFixed,selfEntryDropped:e.selfEntryDropped}))}export{M as resolveOpfsMount};
@@ -1,2 +0,0 @@
1
- import{n as e,t}from"./sidecar-repair-BTU4PjlG.js";import{Async as n,FileSystem as r,InMemory as i,IndexFS as a,Inode as o,Sync as s,a as c,d as l,f as u,h as d,i as f,isFile as p,m,n as h,o as g,p as _,r as v,resolveMountConfig as y,s as b,t as x,u as S,v as C}from"./dist-CTNUClOy.js";function w(e){switch(e.name){case`TypeMismatchError`:return`EPERM`;case`IndexSizeError`:case`HierarchyRequestError`:case`InvalidCharacterError`:case`InvalidStateError`:case`SyntaxError`:case`NamespaceError`:case`ConstraintError`:case`VersionError`:case`URLMismatchError`:case`InvalidNodeTypeError`:return`EINVAL`;case`WrongDocumentError`:return`EXDEV`;case`NoModificationAllowedError`:case`InvalidModificationError`:case`InvalidAccessError`:case`SecurityError`:case`NotAllowedError`:return`EACCES`;case`NotFoundError`:return`ENOENT`;case`NotSupportedError`:return`ENOTSUP`;case`InUseAttributeError`:return`EBUSY`;case`NetworkError`:return`ENETDOWN`;case`AbortError`:return`EINTR`;case`QuotaExceededError`:return`ENOSPC`;case`TimeoutError`:return`ETIMEDOUT`;case`ReadOnlyError`:return`EROFS`;default:return`EIO`}}function T(e,t){if(e instanceof m)return e;let n=e instanceof DOMException?_[w(e)]:_.EIO,r=new m(n,e.message);return r.stack=e.stack,Error.captureStackTrace?.(r,T),r.cause=e.cause,r}function E(e){return typeof e==`object`&&!!e&&e.constructor.name==`SharedArrayBuffer`}function D(e){return e instanceof ArrayBuffer?e.resizable:E(e)?e.growable:!1}function O(e,t){return e.kind==t}var k=class extends n(a){async _loadHandles(e,t){for await(let[n,r]of t.entries()){let t=f(e,n);this._handles.set(t,r),O(r,`directory`)&&await this._loadHandles(t,r)}}async _loadMetadata(e){if(this._handles.set(`/`,this.root),await this._loadHandles(`/`,this.root),e){let t=await(await(await this.get(`file`,e)).getFile()).text(),n=JSON.parse(t);this.index.fromJSON(n);return}u(`webaccessfs: no metadata file specified, generating new metadata`);for(let[e,t]of this._handles){let n=this.index._alloc();if(O(t,`file`)){let{lastModified:r,size:i}=await t.getFile();this.index.set(e,new o({mode:420|b,size:i,mtimeMs:r,ino:n,data:n+1,nlink:1}));continue}if(!O(t,`directory`))throw d(`EIO`,`Invalid handle`);this.index.set(e,new o({mode:511|c,size:0,ino:n,data:n+1,nlink:1}))}}constructor(e,t=!1){super(2003133025,`webaccessfs`),this.root=e,this.disableHandleCache=t,this._handles=new Map,this._sync=i.create({label:`accessfs-cache`}),this.attributes.set(`no_buffer_resize`,!0),t&&this.attributes.set(`no_handle_cache`,!0)}async stat(e){try{return await super.stat(e)}catch(t){if(t.code!=`ENOENT`)throw t;let n=await this.get(null,e),r=this.index._alloc(),i=new o({ino:r,data:r+1,nlink:1});if(O(n,`file`)){let e=await n.getFile();i.update({mode:420|b,size:e.size,mtimeMs:e.lastModified})}else i.update({mode:c|511,size:0});return this.index.set(e,i),i}}async touch(e,t){let n=this.index.get(e);if(!n)throw d(`ENOENT`);if(typeof t.size!=`number`||!p(n))return await super.touch(e,t);let r=await this.get(`file`,e).catch(e=>{if(e.code!=`ENOENT`)throw e});if(!r)return await super.touch(e,t);let{size:i}=await r.getFile();if(i==t.size)return await super.touch(e,t);let a=await r.createWritable({keepExistingData:!!t.size});try{await a.truncate(t.size)}catch{await a.write({type:`truncate`,size:t.size})}await a.close(),await super.touch(e,t)}async readdir(e){let t=await this.get(`directory`,e);return await Array.fromAsync(t.keys())}async remove(e){let t=await this.get(`directory`,v(e));for(let t of this._handles.keys())v(t)==e&&this._handles.delete(t);this._handles.delete(e),await t.removeEntry(h(e),{recursive:!0}).catch(t=>{let n=T(t,e);n.code!=`ENOENT`&&C(n)})}removeSync(){throw l(d(`ENOSYS`))}async read(e,t,n,r){if(r<=n)return;let i=await this.get(`file`,e),a;for(let e=0;;e++){let t=await i.getFile();try{a=await t.arrayBuffer();break}catch(t){if(!(t instanceof DOMException)||t.name!==`NotReadableError`||e>=2)throw t}}if(a.byteLength<r-n)throw S(d(`EIO`,[`Unexpected mismatch in file data size. This should not happen.`,`tried to read ${r-n} bytes but the file is ${a.byteLength} bytes.`,`path: ${e}`].join(`
2
- `+` `.repeat(24))));t.set(new Uint8Array(a,n,r-n))}async write(e,t,n){if(D(t.buffer)||E(t.buffer)){let e=new Uint8Array(new ArrayBuffer(t.byteLength),t.byteOffset,t.byteLength);e.set(t),t=e}let r=this.index.get(e);if(!r)throw d(`ENOENT`);let i=(r.mode&g)==c,a;try{a=await this.get(i?`directory`:`file`,e)}catch{a=await(await this.get(`directory`,v(e)))[i?`getDirectoryHandle`:`getFileHandle`](h(e),{create:!0}).catch(t=>C(T(t,e))),this.disableHandleCache||this._handles.set(e,a)}if(i)return;if(O(a,`directory`)){l(d(`EIO`,`Mismatch in entry kind on write`));return}let o=await a.createWritable({keepExistingData:!0});if(n)try{await o.seek(n)}catch{await o.write({type:`seek`,position:n})}await o.write(t),await o.close();let{size:s,lastModified:u}=await a.getFile();r.update({size:s,mtimeMs:u}),this.index.set(e,r)}async writeFile(e,t){return this.write(e,t,0)}async _create(e,t){let n=await(await this.get(`directory`,v(e))).getFileHandle(h(e),{create:!0}).catch(t=>C(T(t,e)));this.disableHandleCache||this._handles.set(e,n)}async _mkdir(e){let t=await(await this.get(`directory`,v(e))).getDirectoryHandle(h(e),{create:!0}).catch(t=>C(T(t,e)));this.disableHandleCache||this._handles.set(e,t)}async get(e=null,t){let n=this._handles.get(t);if(!this.disableHandleCache&&n){if(e&&!O(n,e))throw d(e==`directory`?`ENOTDIR`:`EISDIR`);return n}if(t==`/`)return this.root;let r=t.slice(1).split(`/`),i=this.root;for(let e=0;e<r.length-1;++e)i=await i.getDirectoryHandle(r[e]).catch(e=>C(e.name==`TypeMismatchError`?d(`ENOTDIR`):T(e,t)));try{let n=await i[e==`file`?`getFileHandle`:`getDirectoryHandle`](r.at(-1));return this.disableHandleCache||this._handles.set(t,n),n}catch(n){if(n.name!=`TypeMismatchError`)throw T(n,t);if(e===null){let e=await i.getFileHandle(r.at(-1)).catch(e=>C(T(e,t)));return this.disableHandleCache||this._handles.set(t,e),e}throw d(e==`file`?`EISDIR`:`ENOTDIR`)}}};const A={name:`WebAccess`,options:{handle:{type:`object`,required:!0},metadata:{type:`string`,required:!1},disableHandleCache:{type:`boolean`,required:!1},maxOpenFilesForCopy:{type:`number`,required:!1}},async create(e){let t=new k(e.handle,e.disableHandleCache);return t._crossCopySemaphore=new x(e.maxOpenFilesForCopy??128),await t._loadMetadata(e.metadata),t}};s(r);async function j({handle:n,dbName:r,asyncCache:i,onRepairProgress:a,withWriteLock:o}){let s=()=>o(()=>t(n,a));try{let e=await s();e?.changed&&console.warn(`[virtual-fs] repaired metadata sidecar before mount (#2146)`,{dbName:r,kindFixed:e.kindFixed,sizesFixed:e.sizesFixed,dropped:e.dropped,inosReassigned:e.inosReassigned,nlinksFixed:e.nlinksFixed,selfEntryDropped:e.selfEntryDropped})}catch{}return e(()=>y({backend:A,handle:n,metadata:`/.metadata.json`,maxOpenFilesForCopy:16,disableAsyncCache:i===!1}),s,e=>console.warn(`[virtual-fs] repaired poisoned metadata sidecar; retrying mount`,{dbName:r,kindFixed:e.kindFixed,sizesFixed:e.sizesFixed,dropped:e.dropped,nlinksFixed:e.nlinksFixed,selfEntryDropped:e.selfEntryDropped}))}export{j as resolveOpfsMount};
@@ -1 +0,0 @@
1
- import{t as e}from"./provider-CS0Ezi-C.js";export{e as readMcpAuthEntries};
@@ -1 +0,0 @@
1
- import{t as e}from"./store-589yQxDA.js";import"./provider-Cf9_NWke.js";export{e as readMcpAuthEntries};
@@ -1 +0,0 @@
1
- var e=class{entries=new Map;listeners=new Set;usedId=null;pm;constructor(e=null){this.pm=e}onChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}list(){return[...this.entries.values()].map(e=>this.decorate(e)).sort((e,t)=>e.id.localeCompare(t.id))}get(e){return this.entries.get(e)?.backend??null}getEntry(e){let t=this.entries.get(e);return t?{backend:t.backend,descriptor:this.decorate(t)}:null}lastUsedId(){return this.usedId}use(e){let t=this.entries.get(e);return t?(this.usedId=e,this.decorate(t)):null}rememberShot(e,t,n){let r=this.entries.get(e);r&&(r.lastShot=t,n&&(r.lastFrame=n,r.seq=n.seq),this.emitChange())}rememberFrame(e,t){let n=this.entries.get(e);n&&(n.lastFrame=t,n.seq=t.seq,this.emitChange())}nextSeq(e){let t=this.entries.get(e);return t?(t.seq+=1,t.seq):1}lastFrame(e){return this.entries.get(e)?.lastFrame??null}register(e,t={}){let n=e.describe(),r=n.id,i=this.entries.get(r);i&&this.dropEntry(r,i,{closeBackend:!0,exitOwned:!0});let a=t.pid??n.pid??null,o=!1;a==null&&this.pm&&(a=this.pm.spawn({kind:`computer`,argv:t.argv??[`computer`,r],cwd:t.cwd??`/`,owner:{kind:`system`}}).pid,o=!0);let s={backend:e,pid:a,ownsPid:o,lastShot:n.lastShot,lastFrame:null,seq:0,unsubAbort:null};if(a!=null&&this.pm){let e=this.pm.get(a);if(e){let t=()=>{this.closeFromSignal(r)};e.abort.signal.addEventListener(`abort`,t),s.unsubAbort=()=>e.abort.signal.removeEventListener(`abort`,t)}}return this.entries.set(r,s),this.emitChange(),this.decorate(s)}async unregister(e){let t=this.entries.get(e);return t?(await this.dropEntry(e,t,{closeBackend:!0,exitOwned:!0}),this.emitChange(),!0):!1}refresh(e){let t=this.entries.get(e);return t?(this.emitChange(),this.decorate(t)):null}async closeFromSignal(e){let t=this.entries.get(e);t&&(await this.dropEntry(e,t,{closeBackend:!0,exitOwned:!1}),this.emitChange())}async dropEntry(e,t,n){if(this.entries.delete(e),this.usedId===e&&(this.usedId=null),this.detach(t),n.exitOwned&&t.ownsPid&&t.pid!=null&&this.pm&&this.pm.exit(t.pid,0),n.closeBackend)try{await t.backend.close()}catch{}}detach(e){e.unsubAbort?.(),e.unsubAbort=null}decorate(e){let t=e.backend.describe();return{...t,pid:e.pid,lastShot:e.lastShot??t.lastShot}}emitChange(){let e=this.list();for(let t of[...this.listeners])try{t(e)}catch{}}resetForTests(){for(let[e,t]of[...this.entries])this.detach(t),t.backend.close().catch(()=>{}),t.ownsPid&&t.pid!=null&&this.pm&&this.pm.exit(t.pid,0),this.entries.delete(e);this.usedId=null,this.listeners.clear()}};let t=null;function n(n){return t||=new e(n),t}function r(){return t}function i(){if(!t)throw Error(`computer registry is not installed`);return t}function a(){t?.resetForTests(),t=null}export{e as ComputerRegistry,r as getComputerRegistry,n as installComputerRegistry,i as requireComputerRegistry,a as resetComputerRegistryForTests};
@@ -1,80 +0,0 @@
1
- import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{r as t}from"./base64-BPBW1Gzr.js";import"./bridge-protocol-31SWTdS5.js";import{n}from"./host-command-5ESITqj8.js";import{n as r,t as i}from"./panel-rpc-DVS1uJpt.js";import{a,i as o,n as s}from"./tool-ui-DRnUkp2g.js";import{r as c,t as l}from"./subcommand-help-CgO7wRS5.js";import{t as u}from"./approval-timeout-BQ29Z0gf.js";import{t as d}from"./tmpdir-env-ate4iNcK.js";import{n as f}from"./screencapture-media-shared-DlK1Wqh8.js";import{c as p,o as m,s as h,t as g}from"./encode-frame-30wbFN-H.js";import{i as _,n as ee,o as te,s as ne,t as re}from"./frames-7E6RloFP.js";import{getComputerRegistry as ie,installComputerRegistry as ae}from"./registry-qHtWYFOX.js";import{getComputersHost as v}from"./host-CLGoytqB.js";import{t as oe}from"./engine-CzMNXd8U.js";const se=[`bridgeToken`,`bridge`,`tray`],ce=[`cherry`,`connect`],le=[`/join/`,`/tray/`],ue=[``,`/`,`/cloud`,`/connect`];function de(e){let t=e.replace(/\/index\.html$/,`/`);return t.length>1?t.replace(/\/$/,``):t}function fe(e,t={}){let n;try{n=new URL(e)}catch{return!1}for(let e of se)if(n.searchParams.has(e))return!0;for(let e of ce)if(n.searchParams.get(e)===`1`)return!0;if(!new Set([`https://www.sliccy.ai`,`https://slicc-tray-hub-staging.minivelos.workers.dev`,...t.selfOrigins??[]]).has(n.origin))return!1;let r=de(n.pathname);return ue.includes(r)?!0:le.some(e=>`${r}/`.startsWith(e))}function y(e={x:0,y:0}){return{x:e.x,y:e.y}}function pe(e,t){return t.x!==void 0&&t.y!==void 0&&(e.x=t.x,e.y=t.y),e}function me(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}}function he(e,t){return t.map(t=>{if(t.type===`mousemove`||t.type===`click`||t.type===`button`||t.type===`scroll`){let n=me(e,t);return{...t,x:n.x,y:n.y}}return t.type===`drag`&&pe(e,{x:t.x2,y:t.y2}),t})}const b={low:256,medium:768,high:1536};function x(e){if(!e)return b.medium;if(e in b)return b[e];let t=/^(\d+)(?:x\d+)?$/u.exec(e);if(t){let e=Number.parseInt(t[1],10);if(e>0)return e}return b.medium}function ge(e,t){let n=e.width>0?e.width:t.width,r=e.height>0?e.height:t.height,i=t.width,a=t.height,o=n>0?i/n:1;return{nativeWidth:n,nativeHeight:r,shotWidth:i,shotHeight:a,scale:o>0?o:1}}function _e(e){let t=e.scale===1?`1`:e.scale.toFixed(2).replace(/0+$/u,``).replace(/\.$/u,``);return`${e.nativeWidth}x${e.nativeHeight} → ${e.shotWidth}x${e.shotHeight} (scale ${t})`}function ve(e,t){return{width:e.shotWidth,height:e.shotHeight,scale:e.scale,at:t}}function ye(e,t,n,r){return r||!n||n.scale===0?{x:e,y:t}:{x:Math.round(e/n.scale),y:Math.round(t/n.scale)}}function be(e,t,n){let r=Number.isFinite(n)&&n>0?n:1;return r===1?{x:e,y:t}:{x:Math.round(e/r),y:Math.round(t/r)}}function S(e){return`tab:${e}`}const C={screenshot:!0,text:!1,frames:`poll`,keyboard:!0,mouse:`absolute`,scroll:!0,exec:!1,inputAllowed:!0},w={1:`left`,2:`middle`,3:`right`};function T(e){if(fe(e.url))throw Error(`refusing SLICC app tab '${e.title??e.url}'`)}var xe=class{browser;targetId;seq=0;title;url;size=null;pointer=y();constructor(e,t,n={title:t,url:``}){this.browser=e,this.targetId=t,this.title=n.title,this.url=n.url}describe(){return{id:S(this.targetId),kind:`tab`,title:this.title,size:this.size,state:`live`,capabilities:C,pid:null}}async screenshot(e){return await this.refreshInfo(),T({url:this.url,title:this.title}),this.browser.withTab(this.targetId,async t=>{let n=await Se(t,e);return n.native&&(this.size=n.native),this.seq+=1,{seq:this.seq,mime:n.mime,width:n.width,height:n.height,bytes:n.bytes}})}async input(e){await this.refreshInfo(),T({url:this.url,title:this.title}),await this.browser.withTab(this.targetId,async t=>{let n=await Oe(t);for(let r of e)await E(t,r,this.pointer,n)})}async close(){}async refreshInfo(){let e=await Ae(this.browser,this.targetId);e&&(this.title=e.title||this.title,this.url=e.url||this.url)}};async function Se(e,t){let n=await e.screenshot({format:`png`}),r=g(n),i=p(r)??m(r),a=r;t.maxWidth&&i&&i.width>t.maxWidth?a=g(await e.screenshot({format:`png`,maxWidth:t.maxWidth})):t.format!==`png`&&(a=g(await e.screenshot({format:`jpeg`,quality:70})));let o=p(a)??m(a)??i??{width:0,height:0};return t.format!==`png`&&!m(a)&&(a=await h(a)),{mime:m(a)?`image/jpeg`:`image/png`,bytes:a,width:o.width,height:o.height,native:i}}var Ce=class{rpc;targetId;seq=0;title;url;size=null;pointer=y();constructor(e,t,n={title:t,url:``}){this.rpc=e,this.targetId=t,this.title=n.title,this.url=n.url}describe(){return{id:S(this.targetId),kind:`tab`,title:this.title,size:this.size,state:`live`,capabilities:C,pid:null}}async screenshot(e){let t=await this.rpc.call(`computer-tab-screenshot`,{targetId:this.targetId,maxWidth:e.maxWidth,format:e.format});return this.title=t.title,this.url=t.url,this.size=t.nativeWidth&&t.nativeHeight?{width:t.nativeWidth,height:t.nativeHeight}:{width:t.width,height:t.height},this.seq+=1,{seq:this.seq,mime:t.mime,width:t.width,height:t.height,bytes:g(t.base64)}}async input(e){let t=he(this.pointer,e);await this.rpc.call(`computer-tab-input`,{targetId:this.targetId,events:t})}async close(){}};async function E(e,t,n=y(),r){let i=r??await Oe(e);switch(t.type){case`mousemove`:{let r=D(n,t,i);await e.send(`Input.dispatchMouseEvent`,{type:`mouseMoved`,x:r.x,y:r.y});return}case`button`:await we(e,t,n,i);return;case`click`:await Te(e,t,n,i);return;case`drag`:await Ee(e,t,n,i);return;case`scroll`:{let r=D(n,t,i);await e.send(`Input.dispatchMouseEvent`,{type:`mouseWheel`,x:r.x,y:r.y,deltaX:t.dx,deltaY:t.dy});return}case`key`:await De(e,t);return;case`text`:await e.send(`Input.insertText`,{text:t.text});return;case`wait`:await O(Math.max(0,t.ms));return}}async function we(e,t,n,r){let i=D(n,t,r);await e.send(`Input.dispatchMouseEvent`,{type:t.down?`mousePressed`:`mouseReleased`,x:i.x,y:i.y,button:w[t.button],clickCount:1})}async function Te(e,t,n,r){let i=D(n,t,r),a=Math.max(1,t.count);for(let n=1;n<=a;n++)await e.send(`Input.dispatchMouseEvent`,{type:`mousePressed`,x:i.x,y:i.y,button:w[t.button],clickCount:n}),t.holdMs&&t.holdMs>0&&await O(t.holdMs),await e.send(`Input.dispatchMouseEvent`,{type:`mouseReleased`,x:i.x,y:i.y,button:w[t.button],clickCount:n})}async function Ee(e,t,n,r){await E(e,{type:`mousemove`,x:t.x1,y:t.y1},n,r),await E(e,{type:`button`,button:1,down:!0,x:t.x1,y:t.y1},n,r),await E(e,{type:`mousemove`,x:t.x2,y:t.y2},n,r),await E(e,{type:`button`,button:1,down:!1,x:t.x2,y:t.y2},n,r)}async function De(e,t){let n=te(t.keysym);if(!n)throw Error(`unknown keysym '${t.keysym}'`);for(let r of ne(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}})}function D(e,t,n){let r=me(e,t);return be(r.x,r.y,n)}async function Oe(e){try{let t=await e.evaluate(`window.devicePixelRatio`);return typeof t==`number`&&Number.isFinite(t)&&t>0?t:1}catch{return 1}}function ke(e,t){let n=e.find(e=>e.targetId===t);if(n)return n;let r=e.filter(e=>e.url===t||e.url.startsWith(t));if(r.length===1)return r[0];if(r.length>1)return{error:`ambiguous url '${t}' matches ${r.length} tabs`};let i=e.filter(e=>e.title===t);return i.length===1?i[0]:{error:`no tab matching '${t}'`}}async function Ae(e,t){let n=(await e.listAllTargets()).find(e=>e.targetId===t);return n?{title:n.title,url:n.url}:null}function O(e){return new Promise(t=>setTimeout(t,e))}function je(e,t){for(let n of t){let t=Me(e,n);if(t)return t}return null}function Me(e,t){return t.type===`wait`?null:e.inputAllowed?t.type===`key`||t.type===`text`?e.keyboard?null:`keyboard input is not supported`:t.type===`scroll`?e.scroll?null:`scroll is not supported`:(t.type===`mousemove`||t.type===`button`||t.type===`click`||t.type===`drag`)&&e.mouse===`none`?`mouse input is not supported`:null:`input is not allowed`}const k=`computer — look at and poke a screen (xdotool grammar)
2
-
3
- Usage:
4
- computer [-c <id>] [--json] [--native] <verb> [args] [verb ...]
5
-
6
- Target: -c / --computer, else $COMPUTER, else last \`computer use\`, else
7
- the only registered computer. \`computer ls\` lists ids.
8
-
9
- Lifecycle:
10
- ls list registered computers
11
- add tab <targetId|url> [-n name]
12
- register a browser tab (refuses SLICC app tabs)
13
- add screen [-n name] share this display (needs a user gesture)
14
- add ssh <follower> [--sim <udid>] [--allow-input] [-n name]
15
- follower desktop (or iOS Simulator on a Mac).
16
- --allow-input needs sudo (phone can Face ID).
17
- The iOS follower itself is never a computer.
18
- add url <http(s)://base> [-n name]
19
- HTTP remote computer (GET /computer). Trailing
20
- /computer is stripped. node-server --computer-demo
21
- is the in-tree reference.
22
- rm [id] unregister (stops a live screen share)
23
- use <id> set the default computer
24
- info descriptor for the current target
25
-
26
- Look:
27
- screenshot [--size low|medium|high|<N>] [--view] [file]
28
- JPEG; prints WxH → wxh (scale s) and a frozen frame
29
- text text-mode dump when the backend supports it
30
- watch [--fps N] [--stop] live frames to the page (phase 2 UI)
31
- record [-V|--duration SEC] [--fps N] [file]
32
- timed clip (screen: live session; other kinds:
33
- JPEG stills through ffmpeg -f image2pipe, max 60s,
34
- --fps ≤10, streamed into the encoder)
35
-
36
- Poke (xdotool; every verb ends with a frozen-frame line):
37
- mousemove <x> <y> [--relative]
38
- click [1|2|3] [--at x,y] [--hold MS] [--repeat N]
39
- mousedown [1|2|3] [--at x,y]
40
- mouseup [1|2|3] [--at x,y]
41
- drag <x1> <y1> <x2> <y2>
42
- scroll <dx> <dy> [--at x,y]
43
- key <keysym> [keysym...] ctrl+alt+Delete, Return, F5, super+space
44
- keydown <keysym>
45
- keyup <keysym>
46
- type <text...>
47
- wait <ms>
48
- exec <command...> when the backend supports it
49
-
50
- Anthropic aliases (same verbs):
51
- left_click right_click middle_click double_click triple_click
52
- left_click_drag mouse_move scroll key type screenshot wait
53
-
54
- Coordinates are screenshot-space of the last shot unless --native
55
- (the pixel space the descriptor advertises). Tab computers convert
56
- that native space to CSS pixels with the tab's devicePixelRatio.
57
- Buttons: 1 left, 2 middle, 3 right. Chain verbs: computer click 1 type hello
58
-
59
- v86 guests register as v86:<name> on \`v86 start\`. Prefer this command;
60
- \`v86 type|key|mouse|screenshot|text\` remain as thin aliases.
61
- `,Ne=[`-c`,`--computer`,`--size`,`--at`,`--hold`,`--repeat`,`--fps`,`-n`,`--name`,`--__resolved`,`-V`,`--duration`,`--sim`],A=new Set([`ls`,`add`,`rm`,`use`,`info`,`screenshot`,`text`,`watch`,`record`,`mousemove`,`click`,`mousedown`,`mouseup`,`drag`,`scroll`,`key`,`keydown`,`keyup`,`type`,`wait`,`exec`]),j={left_click:`click`,right_click:`click`,middle_click:`click`,double_click:`click`,triple_click:`click`,left_click_drag:`drag`,mouse_move:`mousemove`,screenshot:`screenshot`,wait:`wait`,key:`key`,type:`type`,scroll:`scroll`},Pe=new Set([`type`,`key`,`exec`,`add`]),M=new Set([`--size`,`--at`,`--hold`,`--repeat`,`--fps`,`-n`,`--name`,`-c`,`--computer`,`--__resolved`,`-V`,`--duration`,`--sim`]);function N(e){return A.has(e)||e in j}function Fe(e){return A.has(e)?e:j[e]??null}function Ie(e){let t=[],n,r=!1,i=!1;for(let a=0;a<e.length;a++){let o=e[a];if(o===`--`){t.push(...e.slice(a));break}if(o===`--json`){r=!0;continue}if(o===`--native`){i=!0;continue}if(o===`-c`||o===`--computer`){n=e[++a];continue}t.push(o)}return{computer:n,json:r,native:i,rest:t}}function Le(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(r===`--`){n+=1;continue}let i=Fe(r);if(!i)throw Error(`unknown verb '${r}' — see \`computer --help\``);n+=1;let{args:a,next:o}=ze(i,e,n);t.push({verb:i,alias:r,args:Re(r,i,a)}),n=o}return t}function Re(e,t,n){return t===`click`?e===`left_click`?P(n,`1`):e===`middle_click`?P(n,`2`):e===`right_click`?P(n,`3`):e===`double_click`?[...P(n,`1`),`--repeat`,`2`]:e===`triple_click`?[...P(n,`1`),`--repeat`,`3`]:n:n}function P(e,t){return e[0]===`1`||e[0]===`2`||e[0]===`3`?e:[t,...e]}function ze(e,t,n){return Pe.has(e)?Be(t,n):Ve(Ue(e),t,n)}function Be(e,t){let n=[],r=t,i=!1;for(;r<e.length;){let t=e[r];if(!i&&t===`--`){i=!0,r+=1;continue}if(!i&&N(t))break;n.push(t),r+=1}return{args:n,next:r}}function F(e){return e.startsWith(`--`)||e===`-n`||e===`-c`||e===`-V`}function I(e,t,n){let r=e[t];return n.push(r),t+=1,M.has(r)&&t<e.length&&(n.push(e[t]),t+=1),t}function Ve(e,t,n){let r=[],i=n,a=0;for(;i<t.length;){let n=t[i];if(n===`--`){i+=1;continue}if(F(n)){i=I(t,i,r);continue}if(N(n))break;if(r.push(n),a+=1,i+=1,a>=e&&e>0){i=He(t,i,r);break}}return{args:r,next:i}}function He(e,t,n){let r=t;for(;r<e.length&&F(e[r]);)r=I(e,r,n);return r}function Ue(e){switch(e){case`mousemove`:return 2;case`drag`:return 4;case`scroll`:return 2;case`click`:case`mousedown`:case`mouseup`:return 3;case`wait`:case`keydown`:case`keyup`:case`rm`:case`use`:return 1;case`screenshot`:return 1;case`record`:return 1;default:return 0}}function L(e){let t=e.indexOf(`--at`);if(t===-1)return;let n=e[t+1],r=n?/^(-?\d+),(-?\d+)$/u.exec(n):null;if(!r)throw Error(`--at requires x,y`);return{x:Number(r[1]),y:Number(r[2])}}function R(e,t){let n=e.indexOf(t);if(n===-1)return;let r=Number.parseInt(e[n+1]??``,10);if(!Number.isFinite(r))throw Error(`${t} requires a number`);return r}function z(e,t){return e.includes(t)}function B(e,t){for(let n of t){let t=e.indexOf(n);if(t!==-1)return e[t+1]}}function V(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];if(r===`--`){t.push(...e.slice(n+1));break}if(r.startsWith(`--`)||r===`-n`||r===`-c`||r===`-V`){M.has(r)&&(n+=1);continue}t.push(r)}return t}function We(e){let t=0;for(let n of e)t+=n.byteLength;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.byteLength;return n}function Ge(e){return new Promise(t=>{setTimeout(t,e)})}function H(e){return Math.min(10,Math.max(1,e))}async function Ke(e,t,n){let r=e;if(typeof r.appendFile==`function`){await r.appendFile(t,n);return}let i=new Uint8Array;if(typeof r.readFile==`function`)try{let e=await r.readFile(t,{encoding:`binary`});e instanceof Uint8Array&&(i=Uint8Array.from(e))}catch{}let a=new Uint8Array(i.byteLength+n.byteLength);a.set(i,0),a.set(n,i.byteLength),await e.writeFile(t,a)}async function qe(e){let t=H(e.fps),n=Math.max(1,Math.round(1e3/t)),r=e.now??Date.now,i=e.sleep??Ge,a=r()+e.durationMs,o=0,s=0,c=0,l=0,u=!1;for(;;){let d=await e.screenshot(),f=l+d.bytes.byteLength;if(c>0&&(c>=600||f>8388608)){u=!0;break}o=d.width,s=d.height,await e.onFrame?.(d.bytes),c+=1,l=f;let p=c>=600||l>=8388608,m=r()+n>=a;if(p||m){u=p&&Math.round(c/t*1e3)<e.durationMs;break}await i(n)}return{width:o,height:s,frameCount:c,byteLength:l,durationMs:u?Math.round(c/t*1e3):e.durationMs,truncated:u}}function U(e){let t=d(e.env).replace(/\/$/u,``),n=crypto.randomUUID();return e.fs.resolvePath(e.cwd,`${t}/computer-record-${n}.mjpeg`)}async function W(e,t){let n=e;typeof n.rm==`function`&&await n.rm(t,{force:!0}).catch(()=>void 0)}function Je(e){let t=e instanceof Map?new Map(e):new Map;return t.set(oe,`wasm`),t}async function Ye(e){let{runFfmpeg:t}=await import(`./run-dNFrBZDI.js`),n=!e.sourcePath,r=e.sourcePath??U(e.ctx);n&&(await e.ctx.fs.mkdir(r.slice(0,r.lastIndexOf(`/`)),{recursive:!0}),await e.ctx.fs.writeFile(r,We(e.frames)));try{let n=await t([`-y`,`-hide_banner`,`-nostdin`,`-f`,`image2pipe`,`-c:v`,`mjpeg`,`-framerate`,String(e.fps),`-i`,r,`-an`,`-vf`,`scale=trunc(iw/2)*2:trunc(ih/2)*2`,`-c:v`,`libvpx`,`-b:v`,`1M`,`-pix_fmt`,`yuv420p`,e.dest],{...e.ctx,env:Je(e.ctx.env)});if(n.exitCode!==0){let e=n.stderr.trim()||`ffmpeg failed`;throw Error(e)}return{mime:`video/webm`}}finally{n&&await W(e.ctx.fs,r)}}async function Xe(e,t){let n=await e.fs.readFile(t,{encoding:`binary`});return n instanceof Uint8Array?Uint8Array.from(n):new Uint8Array}async function Ze(e){let t=H(e.fps),n=U(e.ctx);await e.ctx.fs.mkdir(n.slice(0,n.lastIndexOf(`/`)),{recursive:!0}),await e.ctx.fs.writeFile(n,new Uint8Array);try{let r=await qe({screenshot:e.screenshot,durationMs:e.durationMs,fps:t,now:e.now,sleep:e.sleep,onFrame:t=>Ke(e.ctx.fs,n,t)}),{mime:i}=await(e.encode??Ye)({frames:[],sourcePath:n,fps:t,dest:e.dest,width:r.width,height:r.height,durationMs:r.durationMs,ctx:e.ctx}),a=new Uint8Array;try{a=await Xe(e.ctx,e.dest)}catch{}return{bytes:a,mime:i,width:r.width,height:r.height,durationMs:r.durationMs,...r.truncated?{truncated:!0}:{}}}finally{await W(e.ctx.fs,n)}}const Qe=new Set;let G;function $e(e){if(typeof e!=`object`||!e)return!1;let t=Object.getOwnPropertyDescriptor(e,`type`)?.value,n=Object.getOwnPropertyDescriptor(e,`id`)?.value;return(t===`begin`||t===`end`)&&typeof n==`string`}function et(e){e.type===`begin`?Qe.add(e.id):Qe.delete(e.id)}function tt(){if(G===void 0){if(typeof BroadcastChannel!=`function`){G=null;return}try{G=new BroadcastChannel(`slicc-screen-share-approval`)}catch{G=null;return}G.onmessage=e=>{$e(e.data)&&et(e.data)}}}function nt(e){tt(),et(e);try{G?.postMessage(e)}catch{}}function rt(e){nt({type:`begin`,id:e})}function it(e){nt({type:`end`,id:e})}const K=Symbol(`screen-share-approval-timeout`);function at(){return`
62
- <div class="sprinkle-action-card">
63
- <div class="sprinkle-action-card__header">
64
- <div class="sprinkle-action-card__title-group">Share this display</div>
65
- <span class="sprinkle-badge sprinkle-badge--notice">approval</span>
66
- </div>
67
- <div class="sprinkle-action-card__actions">
68
- <button class="sprinkle-btn sprinkle-btn--secondary" data-action="deny">Deny</button>
69
- <button class="sprinkle-btn sprinkle-btn--primary" data-action="approve" data-picker="screenshare">Share screen</button>
70
- </div>
71
- </div>
72
- `}async function ot(){let e=a();if(!e)throw Error("add screen: needs a user gesture — type `computer add screen` in the panel terminal, or run it from a cone tool call so an approval card can open the picker");let t=o.generateId(),n=!1;rt(t);try{let r=s({id:t,html:at(),onAction:async(e,t)=>{if(e!==`approve`)return{denied:!0};let n=t;return n?.cancelled?{cancelled:!0}:n?.error?{error:String(n.error)}:n?.granted&&typeof n.handle==`string`?{approved:!0,handle:n.handle}:{error:`screen share returned an unexpected response`}}},e.onUpdate).catch(e=>{if(n)return K;throw e}),i,a=new Promise(e=>{i=setTimeout(()=>{n=!0,o.cancel(t,`screen share: timed out`),e(K)},12e4)}),c=await Promise.race([r,a]);if(i&&clearTimeout(i),c===K)throw Error(`add screen: timed out after 120s waiting for user approval`);let l=c;if(l.denied)throw Error(`add screen: denied by user`);if(l.cancelled)throw Error(`add screen: cancelled`);if(l.error)throw Error(`add screen: ${l.error}`);if(!l.approved||!l.handle)throw Error(`add screen: no display selected`);return{handle:l.handle}}finally{it(t)}}function q(e,t,n){let r=e.list();if(t)return st(r,t);let i=n.get(`COMPUTER`);if(i)return st(r,i);let a=e.lastUsedId();return a&&e.get(a)?{id:a}:r.length===1?{id:r[0].id}:r.length===0?{error:"no computers registered — `computer add tab <id>`, `computer add screen`, `computer add ssh <follower>`, `computer add url <http(s)://base>`, or `v86 start`"}:{error:`which computer? pass -c <id> or \`computer use\`. registered: ${r.map(e=>e.id).join(`, `)}`}}function st(e,t){let n=e.find(e=>e.id===t);if(n)return{id:n.id};let r=e.filter(e=>e.id.endsWith(`:${t}`)||e.title===t||e.id===`v86:${t}`||e.id===`tab:${t}`||e.id===`screen:${t}`||e.id===`ssh:${t}`||e.id===`url:${t}`);if(r.length===1)return{id:r[0].id};if(r.length>1)return{error:`ambiguous computer '${t}' matches ${r.map(e=>e.id).join(`, `)}`};let i=e.map(e=>e.id).join(`, `);return{error:`unknown computer '${t}'${i?` — registered: ${i}`:` — none registered`}`}}var ct=e({runComputer:()=>xt});function J(e){return{stdout:``,stderr:`computer: ${e}\n`,exitCode:1}}function Y(e=``){return{stdout:e,stderr:``,exitCode:0}}function lt(){return globalThis.__slicc_pm??null}function ut(e){return e.browser??globalThis.__slicc_browser??null}function X(e){return e.panelRpc??globalThis.__slicc_panelRpc??r()}function dt(e){return e.sudoBroker?e.sudoBroker:globalThis.__slicc_sudo??null}function ft(e,t){let n=X(e);if(n)return{async capture(e){let r=await n.call(`tray-computer-native`,{runtimeId:t,action:`capture`,fps:e.fps,maxWidth:e.maxWidth,watch:e.watch},{timeoutMs:6e4});if(!r.jpeg)throw Error(`empty native screenshot from follower`);let{bytesFromBase64:i}=await import(`./encode-frame-30wbFN-H.js`).then(e=>e.r);return{bytes:i(r.jpeg),mime:`image/jpeg`,width:r.width??0,height:r.height??0,nativeWidth:r.nativeWidth??r.width??0,nativeHeight:r.nativeHeight??r.height??0}},unwatch(){n.call(`tray-computer-native`,{runtimeId:t,action:`unwatch`}).catch(()=>{})},async input(e){await n.call(`tray-computer-native`,{runtimeId:t,action:`input`,events:e})}}}function pt(e){return e.listFollowers?.()??n()}const mt={platform:`darwin`,tools:[],capture:null,input:`none`};async function ht(e,t,n,r,i){if(!n)return mt;try{return await i(e,t)}catch(e){let t=e instanceof Error?e.message:String(e);return r?mt:{error:t.startsWith(`add ssh:`)?t:`add ssh: ${t}`}}}async function gt(e,t,n,r,i){if(i===`none`&&!r)return J(`add ssh: --allow-input needs cliclick, xdotool, ydotool, or idb on the follower (screenshot-only otherwise)`);let a=dt(e);if(!a)return J(`add ssh: --allow-input needs sudo approval (not configured)`);let o=await a.requestApproval({kind:`command`,detail:`computer add ssh ${t.runtimeId}${n?` --sim ${n}`:``} --allow-input`,reason:`grant pointer and keyboard control of the follower desktop`});return o.decision===`deny`?J(u(`add ssh`,o)):null}async function _t(e,t,n,r){if(e.sshExec)return e.sshExec(t,n,r);let a=X(e);if(!a)throw Error(`no panel RPC in this float`);let o=r??3e4,s=await a.call(`tray-exec`,{runtimeId:t,command:n,execToken:`computer-ssh-${Date.now().toString(36)}`,timeoutMs:o},{timeoutMs:o+i});if(s.error)throw Error(s.error);return{stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode}}function vt(e,t){let n=t.filter(e=>e.exec||e.computer),r=n.find(t=>t.runtimeId===e);if(r)return r;let i=n.filter(t=>t.runtimeId.endsWith(e)||t.runtimeId.includes(e));return i.length===1?i[0]:i.length>1?{error:`add ssh: ambiguous follower '${e}'`}:{error:`add ssh: no exec-capable or computer-capable follower '${e}' — try \`ssh --list\``}}function yt(e){let t=[];return e.kind===`screen`&&t.push(`display slot`),e.kind===`ssh`&&t.push(e.capabilities.inputAllowed?`input`:`view-only`),t.length>0?` [${t.join(`, `)}]`:``}function bt(e){return e.registry?e.registry:ie()??ae(e.processManager??lt())}async function xt(e,t,n={}){if(e.length===0||e[0]===`--help`||e[0]===`-h`||e[0]===`help`)return Y(k);let r=Ie(e);if(r.rest.length===0)return Y(k);let i=r.rest[0];if(l(r.rest.slice(1),{valueFlags:[...Ne]}))return Y(c(`computer`,i,k,{prefix:`computer`}));let a;try{a=Le(r.rest)}catch(e){return J(e instanceof Error?e.message:String(e))}let o=bt(n),s=[],u=[];for(let e of a)try{let i=await St(e,r,t,n,o);if(i.exitCode!==0)return i;i.stdout&&s.push(i.stdout.replace(/\n$/u,``)),i.stderr&&u.push(i.stderr.replace(/\n$/u,``))}catch(e){return J(e instanceof Error?e.message:String(e))}let d=sn(s.filter(Boolean).join(`
73
- `),a,o,r.computer,t,r.json);return{stdout:d?`${d}\n`:``,stderr:u.length?`${u.join(`
74
- `)}\n`:``,exitCode:0}}async function St(e,t,n,r,i){switch(e.verb){case`ls`:return Ct(i,t.json);case`add`:return wt(e.args,n,r,i);case`rm`:return At(e.args,t.computer,n,i);case`use`:return jt(e.args,i);case`info`:return Mt(t,n,i);case`screenshot`:return Nt(e.args,t,n,i);case`text`:return Pt(t,n,i);case`watch`:return Ft(e.args,t,n,i,r);case`record`:return Rt(e.args,t,n,i,r);case`exec`:return Vt(e.args,t,n,i);default:return Ht(e,t,n,i,r)}}function Ct(e,t){let n=e.list();if(t)return Y(`${JSON.stringify(n)}\n`);if(n.length===0)return Y(`no computers registered
75
- `);let r=[`ID KIND STATE TITLE`];for(let e of n)r.push(`${e.id.padEnd(20)} ${e.kind.padEnd(6)} ${e.state.padEnd(9)} ${e.title}${yt(e)}`);return Y(`${r.join(`
76
- `)}\n`)}async function wt(e,t,n,r){let i=e[0];return i===`tab`?Ot(e,t,n,r):i===`screen`?kt(e,t,n,r):i===`ssh`?Dt(e,t,n,r):i===`url`?Et(e,t,n,r):J(`add: unknown kind '${i??``}' — phase 3 supports \`computer add tab\`, \`computer add screen\`, \`computer add ssh\`, and \`computer add url\``)}async function Tt(e){if(e.urlFetch)return e.urlFetch;let{createProxiedFetch:t}=await import(`./proxied-fetch-CZTz7e5K.js`).then(e=>e.i),{wrapUrlComputerFetch:n}=await import(`./url-SK-_tyJs.js`),r=t();return n((e,t)=>r(e,t))}async function Et(e,t,n,r){let i=B(e,[`-n`,`--name`]),a=V(e).slice(1)[0];if(!a)return J(`add url: requires <http(s)://base>`);let{UrlComputerBackend:o,probeUrlComputer:s,normalizeComputerBase:c}=await import(`./url-SK-_tyJs.js`),l;try{l=c(a)}catch(e){return J(`add url: ${e instanceof Error?e.message:String(e)}`)}let u=await Tt(n),d;try{d=await s(u,l)}catch(e){let t=e instanceof Error?e.message:String(e);return J(t.startsWith(`add url:`)?t:`add url: ${t}`)}i&&(d={...d,title:i});let f=new o(u,l,d),p=r.register(f);return r.use(p.id),Y(`registered ${p.id} (${p.title})\n`)}async function Dt(e,t,n,r){let i=B(e,[`-n`,`--name`]),a=B(e,[`--sim`]),o=z(e,`--allow-input`),s=V(e).slice(1)[0];if(!s)return J(`add ssh: requires <follower>`);let c=vt(s,pt(n));if(`error`in c)return J(c.error);if(c.floatType===`ios`)return J(`add ssh: the iOS follower itself is not a driven computer (a real iPhone is out of scope; pass --sim <udid> on a Mac follower)`);if(a&&!c.exec)return J(`add ssh: --sim needs an exec-capable Mac follower`);let{SshComputerBackend:l,probeSsh:u}=await import(`./ssh-2T7ub5Yk.js`),d=c.computer?n.nativeComputer?.(c.runtimeId)??ft(n,c.runtimeId):void 0,f=c.exec?(e,t)=>_t(n,c.runtimeId,e,t?.timeoutMs):async()=>{throw Error(`follower has no exec capability`)},p=await ht(f,a,!!c.exec,!!d,u);if(`error`in p)return J(p.error);if(o){let e=await gt(n,c,a,!!d,p.input);if(e)return e}let m=i??(a?`${c.runtimeId} sim ${a}`:c.runtimeId),h=new l(f,{runtimeId:c.runtimeId,title:m,probe:p,inputAllowed:o,sim:a,native:d}),g=r.register(h);return r.use(g.id),Y(`registered ${g.id} (${g.title})\n`)}async function Ot(e,t,n,r){let i=B(e,[`-n`,`--name`]),a=V(e).slice(1)[0];if(!a)return J(`add tab: requires <targetId|url>`);let o=ut(n);if(!o)return J(`add tab: no browser API in this float`);let s=ke(await o.listAllTargets(),a);if(`error`in s)return J(s.error);try{T(s)}catch(e){return J(e instanceof Error?e.message:String(e))}let c={title:i??s.title,url:s.url},l=n.browser&&!n.panelRpc?null:X(n),u=l?new Ce(l,s.targetId,c):new xe(o,s.targetId,c),d=r.register(u);return r.use(d.id),Y(`registered ${d.id} (${d.title})\n`)}async function kt(e,t,n,r){let i=B(e,[`-n`,`--name`]),o=B(e,[`--__resolved`]);if(!o){if(!a())return J("add screen: needs a user gesture — type `computer add screen` in the panel terminal, or run it from a cone tool call so an approval card can open the picker");try{o=(await ot()).handle}catch(e){return J(e instanceof Error?e.message:String(e))}}let s=X(n);if(!s)return J(`add screen: no panel RPC in this float`);let{BridgedScreenComputerBackend:c,screenComputerId:l}=await import(`./screen-C5DDwz1F.js`),u=new c(s,o,{title:i??`Display`},()=>{r.refresh(l(o))}),d=r.register(u);return r.use(d.id),Y(`registered ${d.id} (${d.title})\n`)}async function At(e,t,n,r){let i=q(r,V(e)[0]??t,$(n));return`error`in i?J(i.error):await r.unregister(i.id)?Y(`unregistered ${i.id}\n`):J(`unknown computer '${i.id}'`)}function jt(e,t){let n=V(e)[0];if(!n)return J(`use: requires <id>`);let r=q(t,n,new Map);return`error`in r?J(r.error):(t.use(r.id),Y(`using ${r.id}\n`))}function Mt(e,t,n){let r=q(n,e.computer,$(t));if(`error`in r)return J(r.error);let i=n.getEntry(r.id);if(!i)return J(`unknown computer '${r.id}'`);if(e.json)return Y(`${JSON.stringify(i.descriptor)}\n`);let a=i.descriptor,o=a.size?`${a.size.width}x${a.size.height}`:`-`;return Y(`id: ${a.id}\nkind: ${a.kind}\ntitle: ${a.title}\nstate: ${a.state}\nsize: ${o}\npid: ${a.pid??`-`}\n`)}async function Nt(e,n,r,i){let a=Q(i,n.computer,r);if(`exitCode`in a)return a;let o=x(B(e,[`--size`])),s=await a.backend.screenshot({format:`jpeg`,maxWidth:o}),c=ge(a.backend.describe().size??{width:s.width,height:s.height},{width:s.width,height:s.height});i.rememberShot(a.id,ve(c,Date.now()),s);let l=s.seq>0?s.seq:i.nextSeq(a.id),u=await _({fs:r.fs,cwd:r.cwd,env:r.env,name:cn(a.descriptor),seq:l,frame:s}),d=V(e)[0];if(d){let e=r.fs.resolvePath(r.cwd,d);await r.fs.writeFile(e,s.bytes)}let f=[_e(c),ee(u)];return(z(e,`--view`)||z(e,`-v`))&&f.push(`<img:data:${s.mime};base64,${t(s.bytes)}>`),n.json?Y(`${JSON.stringify({id:a.id,path:u,mapping:c})}\n`):Y(`${f.join(`
77
- `)}\n`)}async function Pt(e,t,n){let r=Q(n,e.computer,t);if(`exitCode`in r)return r;if(!r.backend.text)return J(`text: '${r.id}' has no text dump`);let i=await r.backend.text();return i===null?J(`text: unavailable for '${r.id}'`):Y(`${i}\n`)}async function Ft(e,t,n,r,i){let a=Q(r,t.computer,n);if(`exitCode`in a)return a;let o=Bt(i);if(!o)return J(`watch: computers host is not running`);if(z(e,`--stop`))return o.unwatch(a.id),Y(`unwatched ${a.id}\n`);let s=R(e,`--fps`)??2,c=x(B(e,[`--size`]));return o.watch(a.id,s,c),Y(`watching ${a.id} at ${s} fps\n`)}function It(e){return`recordClip`in e&&typeof e.recordClip==`function`}function Lt(e){let t=B(e,[`-V`,`--duration`]);if(t===void 0)return 5;let n=Number(t);if(!Number.isFinite(n)||n<=0)throw Error(`-V/--duration requires a positive number of seconds`);return n}async function Rt(e,t,n,r,i){let a=Q(r,t.computer,n);if(`exitCode`in a)return a;let o,s;try{o=Lt(e),s=R(e,`--fps`)??2}catch(e){return J(e instanceof Error?e.message:String(e))}if(s<=0)return J(`--fps requires a positive number`);if(s>10)return J(`--fps exceeds 10`);let c=f(o*1e3),l=V(e)[0]??`clip.webm`,u=n.fs.resolvePath(n.cwd,l),d;try{d=It(a.backend)?await a.backend.recordClip(c):await zt(a.backend,c,s,u,n,i)}catch(e){return J(`record: ${e instanceof Error?e.message:String(e)}`)}d.bytes.byteLength>0&&await n.fs.writeFile(u,d.bytes);let p=d.durationMs??c;if(t.json)return Y(`${JSON.stringify({id:a.id,path:u,durationMs:p,mime:d.mime,...d.truncated?{truncated:!0}:{}})}\n`);let m=d.truncated?` (truncated)`:``;return Y(`recorded ${p}ms ${d.width}x${d.height}${m} → ${u}\n`)}async function zt(e,t,n,r,i,a){return Ze({screenshot:()=>e.screenshot({format:`jpeg`,maxWidth:768}),durationMs:t,fps:n,dest:r,ctx:i,encode:a.encodeRecordedFrames})}function Bt(e){if(e.watch)return{watch:e.watch,unwatch:e.unwatch??(()=>void 0)};let t=v();return t?{watch:t.watch,unwatch:t.unwatch}:null}async function Vt(e,t,n,r){let i=Q(r,t.computer,n);if(`exitCode`in i)return i;if(!i.backend.exec)return J(`exec: '${i.id}' does not support exec`);let a=e.join(` `);if(!a)return J(`exec: requires a command`);let o=await i.backend.exec(a),s=[o.stdout,o.stderr].filter(Boolean).join(`
78
- `);return{stdout:s?`${s}\n`:``,stderr:``,exitCode:o.exitCode}}async function Ht(e,t,n,r,i){let a=Q(r,t.computer,n);if(`exitCode`in a)return a;let o=Jt(e,t.native,a.descriptor),s=je(a.descriptor.capabilities,o);if(s)return J(`${e.verb}: ${s}`);try{await a.backend.input(o)}catch(t){return J(`${e.verb}: ${t instanceof Error?t.message:String(t)}`)}return Kt(a,n,r,i)}function Ut(e,t){return t.isWatching?t.isWatching(e):v()?.isWatching(e)??!1}function Wt(e,t){let n=e.descriptor.capabilities.frames===`push`;return e.backend.screenshot({format:`jpeg`,maxWidth:t,...n?{pull:!0}:{}})}async function Gt(e,t,n){if(!(e.descriptor.capabilities.frames===`push`&&Ut(e.id,n)))return Wt(e,t);let r=new AbortController,i=n.postActionTimeoutMs??5e3;try{return await qt(e.backend.screenshot({format:`jpeg`,maxWidth:t,signal:r.signal}),i)}catch{return r.abort(),Wt(e,t)}}async function Kt(e,t,n,r){let i=e.descriptor.lastShot?.width??768,a;try{a=await Gt(e,i,r)}catch(e){return{stdout:``,stderr:`computer: screenshot failed after input: ${e instanceof Error?e.message:String(e)}\n`,exitCode:0}}let o=n.nextSeq(e.id),s={...a,seq:o};n.rememberFrame(e.id,s);let c=await _({fs:t.fs,cwd:t.cwd,env:t.env,name:cn(e.descriptor),seq:o,frame:s});return Y(`${ee(c)}\n`)}function qt(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`timed out`)),t);e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Jt(e,t,n){let r=(e,r)=>ye(e,r,n.lastShot,t);switch(e.verb){case`mousemove`:return Yt(e.args,r);case`click`:case`mousedown`:case`mouseup`:return Xt(e.verb,e.args,r);case`drag`:return Zt(e.args,r,n.capabilities.mouse);case`scroll`:return Qt(e.args,r);case`key`:case`keydown`:case`keyup`:return $t(e.verb,e.args);case`type`:return en(e.args);case`wait`:return tn(e.args);default:throw Error(`internal: ${e.verb} is not an input verb`)}}function Yt(e,t){let n=V(e),r=Number(n[0]),i=Number(n[1]);if(!Number.isFinite(r)||!Number.isFinite(i))throw Error(`mousemove: requires <x> <y>`);let a=z(e,`--relative`),o=a?{x:r,y:i}:t(r,i);return[{type:`mousemove`,x:o.x,y:o.y,relative:a}]}function Xt(e,t,n){let r=V(t),{button:i,skip:a}=nn(r),o=L(t)??an(r,a),s=o?n(o.x,o.y):void 0;if(e===`mousedown`)return[{type:`button`,button:i,down:!0,...Z(s)}];if(e===`mouseup`)return[{type:`button`,button:i,down:!1,...Z(s)}];let c=R(t,`--hold`);return[{type:`click`,button:i,count:R(t,`--repeat`)??1,...c===void 0?{}:{holdMs:c},...Z(s)}]}function Zt(e,t,n){let r=V(e).map(Number);if(r.length<4||r.some(e=>!Number.isFinite(e)))throw Error(`drag: requires <x1> <y1> <x2> <y2>`);let i=t(r[0],r[1]),a=t(r[2],r[3]);return n===`touch`?[{type:`drag`,x1:i.x,y1:i.y,x2:a.x,y2:a.y}]:[{type:`mousemove`,x:i.x,y:i.y},{type:`button`,button:1,down:!0,x:i.x,y:i.y},{type:`mousemove`,x:a.x,y:a.y},{type:`button`,button:1,down:!1,x:a.x,y:a.y}]}function Qt(e,t){let n=V(e),r=Number(n[0]),i=Number(n[1]);if(!Number.isFinite(r)||!Number.isFinite(i))throw Error(`scroll: requires <dx> <dy>`);let a=L(e);return[{type:`scroll`,dx:r,dy:i,...Z(a?t(a.x,a.y):void 0)}]}function $t(e,t){if(e===`key`){if(t.length===0)throw Error(`key: no keysym supplied`);return t.map(e=>({type:`key`,keysym:e}))}let n=V(t)[0];if(!n)throw Error(`${e}: no keysym supplied`);return[{type:`key`,keysym:n,down:e===`keydown`}]}function en(e){let t=e.join(` `).replace(/\\n/gu,`
79
- `).replace(/\\t/gu,` `);if(!t)throw Error(`type: no text supplied`);return[{type:`text`,text:t}]}function tn(e){let t=Number(V(e)[0]);if(!Number.isFinite(t))throw Error(`wait: requires <ms>`);return[{type:`wait`,ms:t}]}function nn(e){return e[0]===void 0?{button:1,skip:0}:e[0]===`left`||e[0]===`middle`||e[0]===`right`||e[0]===`1`||e[0]===`2`||e[0]===`3`?{button:rn(e[0]),skip:1}:{button:1,skip:0}}function rn(e){if(!e||e===`left`||e===`1`)return 1;if(e===`middle`||e===`2`)return 2;if(e===`right`||e===`3`)return 3;let t=Number.parseInt(e,10);if(t===1||t===2||t===3)return t;throw Error(`unknown button '${e}' (use 1|2|3)`)}function an(e,t){let n=Number(e[t]),r=Number(e[t+1]);if(Number.isFinite(n)&&Number.isFinite(r))return{x:n,y:r}}function Z(e){return e?{x:e.x,y:e.y}:{}}const on=new Set([`ls`,`add`,`rm`,`use`]);function sn(e,t,n,r,i,a){if(a||!t.some(e=>!on.has(e.verb)))return e;let o=q(n,r,$(i));if(`error`in o)return e;let s=re(o.id);return e.split(`
80
- `).some(e=>e.trim()===s)?e:e?`${s}\n${e}`:s}function Q(e,t,n){let r=q(e,t,$(n));if(`error`in r)return J(r.error);let i=e.getEntry(r.id);return i?{id:r.id,backend:i.backend,descriptor:i.descriptor}:J(`unknown computer '${r.id}'`)}function $(e){let t=e.env;if(t instanceof Map)return t;let n=new Map;if(t&&typeof t==`object`)for(let[e,r]of Object.entries(t))r!==void 0&&n.set(e,r);return n}function cn(e){return e.id.replace(/[/:]/gu,`_`)}export{he as n,y as r,xt as runComputer,ct as t};
@@ -1 +0,0 @@
1
- function e(){return{version:`6.178.1`,releasedAt:`2026-09-22T13:55:31Z`,buildId:`6.178.1-mucql8be`}}let t=null;function n(e){t=e}function r(){return t}export{e as n,n as r,r as t};
@@ -1,6 +0,0 @@
1
- import{c as e,i as t,o as n,s as r,t as i}from"./encode-frame-30wbFN-H.js";import{c as a,d as o,l as s,o as c,u as l}from"./frames-7E6RloFP.js";import{n as u,r as d}from"./run-B4NB-XFg.js";function f(e){return`'${e.replace(/'/g,`'\\''`)}'`}function p(e){return f(String(Math.round(e)))}function m(e,t,n){return`cliclick ${f(`${e}:${Math.round(t)},${Math.round(n)}`)}`}function h(e){return e===2?`mc`:e===3?`rc`:`c`}function g(e){return e===2?`md`:e===3?`rd`:`dd`}function _(e){return e===2?`mu`:e===3?`ru`:`du`}function v(e){return e}function y(e,t){let n=e===2?2:+(e===3);return t===`down`?`ydotool click ${f(b(64|n))}`:t===`up`?`ydotool click ${f(b(128|n))}`:`ydotool click ${f(b(192|n))}`}function b(e){return`0x${e.toString(16).toUpperCase()}`}function x(e,t){return Math.min(20,Math.max(1,Math.round(Math.max(Math.abs(e),Math.abs(t))/40)||1))}function S(e){return`sleep ${f((Math.max(0,e)/1e3).toFixed(3))}`}function C(e){switch(e.type){case`mousemove`:return[m(`m`,e.x,e.y)];case`click`:{let t=e.x??0,n=e.y??0;if(e.holdMs&&e.holdMs>0)return[m(g(e.button),t,n),S(e.holdMs),m(_(e.button),t,n)];let r=m(e.count>=2&&e.button===1?`dc`:h(e.button),t,n);return e.count>2?Array.from({length:e.count},()=>r):[r]}case`button`:return[m(e.down?g(e.button):_(e.button),e.x??0,e.y??0)];case`drag`:return[m(`dd`,e.x1,e.y1),m(`du`,e.x2,e.y2)];case`key`:{let t=c(e.keysym);if(!t)return[];let n=e.down===!0?`down`:e.down===!1?`up`:`press`;return[`cliclick ${f(a(t,n))}`]}case`text`:return[`cliclick ${f(`t:${e.text}`)}`];case`wait`:return[S(e.ms)];case`scroll`:return[];default:return[]}}function w(e,t){return`xdotool mousemove -- ${p(e)} ${p(t)}`}function T(e){switch(e.type){case`mousemove`:return e.relative?[`xdotool mousemove_relative -- ${p(e.x)} ${p(e.y)}`]:[w(e.x,e.y)];case`click`:{let t=Math.max(1,e.count),n=e.holdMs&&e.holdMs>0?` --delay ${p(e.holdMs)}`:``;return[w(e.x??0,e.y??0),`xdotool click --repeat ${p(t)}${n} ${p(v(e.button))}`]}case`button`:{let t=e.down?`mousedown`:`mouseup`;return[w(e.x??0,e.y??0),`xdotool ${t} ${p(v(e.button))}`]}case`drag`:return[w(e.x1,e.y1),`xdotool mousedown 1`,w(e.x2,e.y2),`xdotool mouseup 1`];case`scroll`:{let t=e.dy<0?4:e.dy>0?5:e.dx<0?6:7;return[w(e.x??0,e.y??0),`xdotool click --repeat ${p(x(e.dx,e.dy))} ${p(t)}`]}default:return null}}function E(e){let t=T(e);if(t)return t;if(e.type===`key`){let t=c(e.keysym);if(!t)return[];let n=l(t);return e.down===!0?[`xdotool keydown ${f(n)}`]:e.down===!1?[`xdotool keyup ${f(n)}`]:[`xdotool key ${f(n)}`]}return e.type===`text`?[`xdotool type -- ${f(e.text)}`]:e.type===`wait`?[S(e.ms)]:[]}function D(e){switch(e.type){case`mousemove`:return[`ydotool mousemove --absolute -- ${p(e.x)} ${p(e.y)}`];case`click`:{let t=Math.round(e.x??0),n=Math.round(e.y??0),r=Math.max(1,e.count),i=y(e.button,`click`);return[`ydotool mousemove --absolute -- ${p(t)} ${p(n)}`,...Array.from({length:r},()=>i)]}case`button`:{let t=Math.round(e.x??0),n=Math.round(e.y??0);return[`ydotool mousemove --absolute -- ${p(t)} ${p(n)}`,y(e.button,e.down?`down`:`up`)]}case`drag`:return[`ydotool mousemove --absolute -- ${p(e.x1)} ${p(e.y1)}`,y(1,`down`),`ydotool mousemove --absolute -- ${p(e.x2)} ${p(e.y2)}`,y(1,`up`)];case`scroll`:return[`ydotool mousemove --absolute -- ${p(e.x??0)} ${p(e.y??0)}`,`ydotool click --repeat ${p(x(e.dx,e.dy))} ${f(e.dy<0?b(195):b(196))}`];case`key`:{let t=c(e.keysym);if(!t)return[];let n=e.down===!0?`down`:e.down===!1?`up`:`press`,r=o(t,n);return r?[`ydotool key ${f(r)}`]:[]}case`text`:return[`ydotool type -- ${f(e.text)}`];case`wait`:return[S(e.ms)];default:return[]}}function O(e,t){let n=`--udid ${f(t)}`;if(e.type===`key`){let t=c(e.keysym);return t?.key===`Home`?[`idb ui button HOME ${n}`]:t&&t.key.length===1&&!t.modifiers.ctrl&&!t.modifiers.meta?[`idb ui text ${f(t.key)} ${n}`]:[]}if(e.type===`text`)return[`idb ui text ${f(e.text)} ${n}`];if(e.type===`wait`)return[S(e.ms)];let r=s(e);return r.kind===`noop`?[]:r.kind===`tap`?[`idb ui tap ${p(r.x)} ${p(r.y)} ${n}`]:r.kind===`long-press`?[`idb ui tap ${p(r.x)} ${p(r.y)} --duration ${p(r.holdMs)} ${n}`]:[`idb ui swipe ${p(r.x1)} ${p(r.y1)} ${p(r.x2)} ${p(r.y2)} ${n}`]}function k(e,t,n){return t===`none`?[]:t===`cliclick`?C(e):t===`xdotool`?E(e):t===`ydotool`?D(e):t===`idb`&&n?O(e,n):[]}function A(e,t){return t?`ssh:${e}:sim:${t}`:`ssh:${e}`}function j(e){return`/tmp/slicc-${e.replace(/[^A-Za-z0-9._-]+/gu,`_`)}`}function M(e){let t=e.toLowerCase();return t.startsWith(`darwin`)?`darwin`:t.startsWith(`linux`)?`linux`:`unknown`}const N=[`screencapture`,`grim`,`scrot`,`import`],P=[`cliclick`,`xdotool`,`ydotool`];function F(e,t){for(let n of t)if(e.includes(n))return n;return null}function I(e){let t=/SLICC_SSH_PROBE\s+(\S+)\s*(.*)/u.exec(e);if(!t)return{error:`probe: unexpected follower output`};let n=t[2].trim().split(/\s+/u).filter(Boolean);return{platform:M(t[1]),tools:n,capture:F(n,N),input:F(n,P)??`none`}}async function L(e,t){let n=await e(`u=$(uname -s 2>/dev/null || echo unknown)
2
- tools=""
3
- for t in screencapture cliclick grim scrot import xdotool ydotool idb xcrun; do
4
- command -v "$t" >/dev/null 2>&1 && tools="$tools$t "
5
- done
6
- printf 'SLICC_SSH_PROBE %s %s\\n' "$u" "$tools"`,{timeoutMs:15e3});if(n.exitCode!==0)throw Error((n.stderr||n.stdout||`probe failed`).trim());let r=I(n.stdout);if(`error`in r)throw Error(r.error);if(t){if(r.platform!==`darwin`)throw Error(`--sim requires a Mac follower`);if(!r.tools.includes(`xcrun`))throw Error(`xcrun not found on the follower`);if(!(await e(`xcrun simctl list devices 2>/dev/null | grep -F ${f(t)} || true`,{timeoutMs:15e3})).stdout.includes(t))throw Error(`simulator '${t}' not found`);return{...r,capture:`simctl`,input:r.tools.includes(`idb`)?`idb`:`none`,sim:t}}if(!r.capture)throw Error(`no screenshot tool (need screencapture, grim, scrot, or import)`);return r}function R(e,t,n=3145728){if(t<=0)return[];let r=Math.ceil(t/n),i=[];for(let t=0;t<r;t++)i.push(`dd if=${f(e)} bs=${n} skip=${t} count=1 2>/dev/null`);return i}function z(e){let t=f(`${e.tmpBase}.png`),n=f(`${e.tmpBase}.b64`),r;switch(e.capture){case`screencapture`:r=`screencapture -x ${t}`;break;case`grim`:r=`grim ${t}`;break;case`scrot`:r=`scrot ${t}`;break;case`import`:r=`import -window root ${t}`;break;case`simctl`:r=`xcrun simctl io ${f(e.udid??``)} screenshot ${t}`;break;default:e.capture,r=`false`}return`${r} && base64 < ${t} | tr -d '\\n' > ${n} && n=$(wc -c < ${n} | tr -d ' ') && printf 'SLICC_SSH_B64 %s\\n' "$n"`}function B(e,t,n=!1){let r=t&&(e.input!==`none`||n);return{screenshot:!0,text:!1,frames:`poll`,keyboard:r,mouse:r?e.input===`idb`?`touch`:`absolute`:`none`,scroll:r&&(n||e.input!==`cliclick`),exec:!1,inputAllowed:r}}function V(e){let t=/SLICC_SSH_B64\s+(\d+)/u.exec(e);return t?Number(t[1]):NaN}var H=class{sshExec;seq=0;size=null;pointer=d();tmpBase;runtimeId;sim;probe;inputAllowed;title;native;constructor(e,t){this.sshExec=e,this.runtimeId=t.runtimeId,this.sim=t.sim,this.probe=t.probe,this.native=t.native,this.inputAllowed=t.inputAllowed&&(t.probe.input!==`none`||!!t.native),this.title=t.title,this.tmpBase=j(A(t.runtimeId,t.sim))}describe(){let e=B(this.probe,this.inputAllowed,!!this.native);return{id:A(this.runtimeId,this.sim),kind:`ssh`,title:this.title,size:this.size,state:`live`,capabilities:e,pid:null,...this.sim?{softKeys:[{label:`Home`,keysym:`Home`}]}:{}}}async screenshot(a){if(this.native){let e=await this.native.capture({fps:2,maxWidth:a.maxWidth,watch:!1});this.seq+=1;let n={seq:this.seq,mime:e.mime,width:e.width,height:e.height,bytes:e.bytes};return a.maxWidth&&(n=await t(n,a.maxWidth)),this.size={width:e.nativeWidth,height:e.nativeHeight},n}if(!this.probe.capture)throw Error(`no screenshot tool on the follower`);let o=z({capture:this.probe.capture,tmpBase:this.tmpBase,udid:this.sim}),s=await this.sshExec(o,{timeoutMs:6e4});if(s.exitCode!==0)throw Error((s.stderr||s.stdout||`screenshot failed`).trim());let c=V(s.stdout);if(!Number.isFinite(c)||c<=0)throw Error(`empty screenshot from follower`);let l=[];for(let e of R(`${this.tmpBase}.b64`,c)){let t=await this.sshExec(e,{timeoutMs:3e4});if(t.exitCode!==0)throw Error((t.stderr||`screenshot chunk failed`).trim());l.push(t.stdout.replace(/\s+/gu,``))}let u=i(l.join(``)),d=e(u),f=n(u),p=d??f;if(!p)throw Error(`follower screenshot was not PNG or JPEG`);let m=u,h=d?`image/png`:`image/jpeg`;a.format===`jpeg`&&d&&(m=await r(u),h=`image/jpeg`),this.seq+=1;let g={seq:this.seq,mime:h,width:p.width,height:p.height,bytes:m};return a.maxWidth&&(g=await t(g,a.maxWidth)),this.size={width:p.width,height:p.height},g}async input(e){if(!this.inputAllowed)throw Error(`input is not allowed`);let t=u(this.pointer,e);if(this.native){await this.native.input(t);return}for(let e of t){let t=k(e,this.probe.input,this.sim);for(let e of t){let t=await this.sshExec(e,{timeoutMs:15e3});if(t.exitCode!==0)throw Error((t.stderr||t.stdout||`input failed: ${e}`).trim())}}}async close(){if(this.native?.unwatch(),this.probe.capture)try{await this.sshExec(`rm -f ${f(`${this.tmpBase}.png`)} ${f(`${this.tmpBase}.b64`)}`,{timeoutMs:5e3})}catch{}}};export{H as SshComputerBackend,L as probeSsh};
@@ -1 +0,0 @@
1
- import{t as e}from"./slicc-app-url-BKHBBuTR.js";import{a as t,i as n,n as r}from"./scale-D09IlqOK.js";var i=Uint8Array.of(255,216,255,192,0,11,8,0,1,0,1,1,1,17,0,255,217);function a(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 o(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 s(e,t=.7){if(a(e))return e;if(typeof OffscreenCanvas>`u`||typeof createImageBitmap>`u`)return i.slice();let n=new Blob([new Uint8Array(e)],{type:`image/png`}),r=await createImageBitmap(n),o=new OffscreenCanvas(r.width,r.height),s=o.getContext(`2d`);if(!s)throw Error(`could not acquire 2d canvas context`);s.drawImage(r,0,0),r.close();let c=await o.convertToBlob({type:`image/jpeg`,quality:t});return new Uint8Array(await c.arrayBuffer())}function c(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 l(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)}function u(e={x:0,y:0}){return{x:e.x,y:e.y}}function d(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 f={1:`left`,2:`middle`,3:`right`};function p(t){if(e(t.url))throw Error(`refusing SLICC app tab '${t.title??t.url}'`)}async function m(e,t){let n=c(await e.screenshot({format:`png`})),r=o(n)??a(n),i=n;t.maxWidth&&r&&r.width>t.maxWidth?i=c(await e.screenshot({format:`png`,maxWidth:t.maxWidth})):t.format!==`png`&&(i=c(await e.screenshot({format:`jpeg`,quality:70})));let l=o(i)??a(i)??r??{width:0,height:0};return t.format!==`png`&&!a(i)&&(i=await s(i)),{mime:a(i)?`image/jpeg`:`image/png`,bytes:i,width:l.width,height:l.height,native:r}}async function h(e,t,n=u(),r){let i=r??await C(e);switch(t.type){case`mousemove`:{let r=S(n,t,i);await e.send(`Input.dispatchMouseEvent`,{type:`mouseMoved`,x:r.x,y:r.y});return}case`button`:await g(e,t,n,i);return;case`click`:await _(e,t,n,i);return;case`drag`:await v(e,t,n,i);return;case`scroll`:{let r=S(n,t,i);await e.send(`Input.dispatchMouseEvent`,{type:`mouseWheel`,x:r.x,y:r.y,deltaX:t.dx,deltaY:t.dy});return}case`key`:await y(e,t);return;case`text`:await e.send(`Input.insertText`,{text:t.text});return;case`wait`:await T(Math.max(0,t.ms));return}}async function g(e,t,n,r){let i=S(n,t,r);await e.send(`Input.dispatchMouseEvent`,{type:t.down?`mousePressed`:`mouseReleased`,x:i.x,y:i.y,button:f[t.button],clickCount:1})}async function _(e,t,n,r){let i=S(n,t,r),a=Math.max(1,t.count);for(let n=1;n<=a;n++)await e.send(`Input.dispatchMouseEvent`,{type:`mousePressed`,x:i.x,y:i.y,button:f[t.button],clickCount:n}),t.holdMs&&t.holdMs>0&&await T(t.holdMs),await e.send(`Input.dispatchMouseEvent`,{type:`mouseReleased`,x:i.x,y:i.y,button:f[t.button],clickCount:n})}async function v(e,t,n,r){await h(e,{type:`mousemove`,x:t.x1,y:t.y1},n,r),await h(e,{type:`button`,button:1,down:!0,x:t.x1,y:t.y1},n,r),await h(e,{type:`mousemove`,x:t.x2,y:t.y2},n,r),await h(e,{type:`button`,button:1,down:!1,x:t.x2,y:t.y2},n,r)}async function y(e,r){let i=n(r.keysym);if(!i)throw Error(`unknown keysym '${r.keysym}'`);for(let n of t(i,r.down))await e.send(`Input.dispatchKeyEvent`,{type:n.type,key:n.key,code:n.code,modifiers:n.modifiers,...n.text===void 0?{}:{text:n.text}})}async function b(e,t,n){let r=await w(e,t)??{title:t,url:``};return p(r),e.withTab(t,async e=>{let t=await m(e,{format:n.format===`png`?`png`:`jpeg`,maxWidth:n.maxWidth});return{mime:t.mime,base64:l(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 x(e,t,n){p(await w(e,t)??{title:t,url:``});let r=u();await e.withTab(t,async e=>{let t=await C(e);for(let i of n)await h(e,i,r,t)})}function S(e,t,n){let i=d(e,t);return r(i.x,i.y,n)}async function C(e){try{let t=await e.evaluate(`window.devicePixelRatio`);return typeof t==`number`&&Number.isFinite(t)&&t>0?t:1}catch{return 1}}async function w(e,t){let n=(await e.listAllTargets()).find(e=>e.targetId===t);return n?{title:n.title,url:n.url}:null}function T(e){return new Promise(t=>setTimeout(t,e))}export{x as inputTab,b as screenshotTab};
@@ -1 +0,0 @@
1
- import{c as e,i as t,o as n}from"./encode-frame-30wbFN-H.js";function r(e){return async(t,n)=>{let r=await e(t,{method:n?.method,headers:n?.headers,body:typeof n?.body==`string`?n.body:void 0,signal:n?.signal});return{status:r.status,headers:r.headers,body:r.body}}}function i(e){let t=AbortSignal.timeout(8e3);return e?AbortSignal.any([t,e]):t}const a={screenshot:!0,text:!1,frames:`poll`,keyboard:!1,mouse:`none`,scroll:!1,exec:!1,inputAllowed:!1};function o(e){let t=new URL(e);if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`only http(s) bases`);let n=t.pathname.replace(/\/+$/u,``);n.endsWith(`/computer`)&&(n=n.slice(0,-9)),t.pathname=n||`/`,t.search=``,t.hash=``;let r=t.toString();return t.pathname===`/`&&r.endsWith(`/`)?r.slice(0,-1):r.replace(/\/+$/u,``)}function s(e){let t=new URL(o(e)),n=t.pathname===`/`?``:t.pathname;return`url:${t.host}${n}`}function c(e){return JSON.parse(new TextDecoder().decode(e))}function l(e,t){if(!(t in e))return;let n=Object.getOwnPropertyDescriptor(e,t)?.value;return typeof n==`boolean`?n:void 0}function u(e,t){if(!(t in e))return;let n=Object.getOwnPropertyDescriptor(e,t)?.value;return typeof n==`string`?n:void 0}function d(e,t){if(!(t in e))return;let n=Object.getOwnPropertyDescriptor(e,t)?.value;return typeof n==`number`&&Number.isFinite(n)?n:void 0}function f(e){if(typeof e!=`object`||!e)return null;let t=d(e,`width`),n=d(e,`height`);return!t||!n||t<=0||n<=0?null:{width:t,height:n}}function p(e){if(typeof e!=`object`||!e)return{...a};let t=u(e,`mouse`),n=u(e,`frames`),r=t===`absolute`||t===`relative`||t===`touch`||t===`none`?t:a.mouse,i=n===`push`||n===`poll`||n===`none`?n:a.frames;return{screenshot:l(e,`screenshot`)??a.screenshot,text:l(e,`text`)??a.text,frames:i,keyboard:l(e,`keyboard`)??a.keyboard,mouse:r,scroll:l(e,`scroll`)??a.scroll,exec:l(e,`exec`)??a.exec,inputAllowed:l(e,`inputAllowed`)??a.inputAllowed}}function m(e,t,n){let r=typeof e==`object`&&e?e:{},i=u(r,`state`),a=u(r,`title`),o=`size`in r?Object.getOwnPropertyDescriptor(r,`size`)?.value:void 0,s=`capabilities`in r?Object.getOwnPropertyDescriptor(r,`capabilities`)?.value:void 0,c=i===`starting`||i===`live`||i===`paused`||i===`gone`?i:`live`;return{id:t,kind:`url`,title:a&&a.length>0?a:n,size:f(o),state:c,capabilities:p(s),pid:null}}function h(t){let r=e(t);if(r)return{mime:`image/png`,...r};let i=n(t);return i?{mime:`image/jpeg`,...i}:null}async function g(e,t){let n=o(t),r=s(n),a=await e(`${n}/computer`,{signal:i()});if(a.status<200||a.status>=300)throw Error(`GET /computer returned ${a.status}`);return m(c(a.body),r,new URL(n).host)}var _=class{fetchImpl;base;seq=0;descriptor;subscribe;constructor(e,t,n){this.fetchImpl=e,this.base=t,this.descriptor=n,n.capabilities.frames===`push`&&(this.subscribe=(e,t,n)=>this.bindFrames(e,t,n))}describe(){return this.descriptor}async screenshot(e){let n=new URLSearchParams;n.set(`format`,e.format);let r=await this.fetchImpl(`${this.base}/computer/screenshot?${n.toString()}`,{signal:i(e.signal)});if(r.status<200||r.status>=300)throw Error(`GET /computer/screenshot returned ${r.status}`);let a=h(r.body);if(!a)throw Error(`remote screenshot was not PNG or JPEG`);this.seq+=1;let o={seq:this.seq,mime:a.mime,width:a.width,height:a.height,bytes:r.body};return e.maxWidth&&(o=await t(o,e.maxWidth)),this.descriptor.size||(this.descriptor={...this.descriptor,size:{width:a.width,height:a.height}}),o}async text(){if(!this.descriptor.capabilities.text)return null;let e=await this.fetchImpl(`${this.base}/computer/text`,{signal:i()});if(e.status===404)return null;if(e.status<200||e.status>=300)throw Error(`GET /computer/text returned ${e.status}`);return new TextDecoder().decode(e.body)}async input(e){if(!this.descriptor.capabilities.inputAllowed)throw Error(`input is not allowed`);let t=await this.fetchImpl(`${this.base}/computer/input`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:i()});if(t.status<200||t.status>=300)throw Error(`POST /computer/input returned ${t.status}`)}async close(){}bindFrames(e,t,n){let r=!1,i=null,a=()=>{if(r||i)return;let a=Math.round(1e3/Math.max(1,e)),o=()=>{r||this.screenshot({format:`jpeg`,maxWidth:n}).then(t,()=>{})};i=setInterval(o,a),o()},o=()=>{r=!0,i&&clearInterval(i),i=null};if(typeof WebSocket>`u`)return a(),o;let s=this.base.replace(/^http/u,`ws`),c=new URLSearchParams({fps:String(e)});n&&c.set(`maxWidth`,String(n));let l;try{l=new WebSocket(`${s}/computer/frames?${c.toString()}`)}catch{return a(),o}l.binaryType=`arraybuffer`;let u=e=>{this.dispatchWsFrame(e.data,t)},d=()=>{a()};return l.addEventListener(`message`,u),l.addEventListener(`error`,d),l.addEventListener(`close`,d),()=>{o(),l.removeEventListener(`message`,u),l.removeEventListener(`error`,d),l.removeEventListener(`close`,d),l.close()}}async dispatchWsFrame(e,t){let n;if(typeof e==`string`)return;if(e instanceof ArrayBuffer)n=new Uint8Array(e);else if(typeof Blob<`u`&&e instanceof Blob)n=new Uint8Array(await e.arrayBuffer());else return;let r=h(n);r&&(this.seq+=1,t({seq:this.seq,mime:r.mime,width:r.width,height:r.height,bytes:n}))}};export{_ as UrlComputerBackend,o as normalizeComputerBase,g as probeUrlComputer,r as wrapUrlComputerFetch};
@@ -1 +0,0 @@
1
- import{n as e,t}from"./v86-vm-DCm7zA2r.js";import{a as n}from"./encode-frame-30wbFN-H.js";import{a as r,r as i}from"./frames-7E6RloFP.js";import{getComputerRegistry as a}from"./registry-qHtWYFOX.js";function o(e){return`v86:${e}`}const s={screenshot:!0,text:!0,frames:`poll`,keyboard:!0,mouse:`relative`,scroll:!0,exec:!1,inputAllowed:!0},c={1:0,2:1,3:2};var l=class{record;lastX=0;lastY=0;seq=0;constructor(e){this.record=e}describe(){let e=this.record.screen,t=e.width>0&&e.height>0?{width:e.width,height:e.height}:null;return{id:o(this.record.name),kind:`v86`,title:this.record.name,size:t,state:this.record.emulator.is_running()?`live`:`paused`,capabilities:s,pid:this.record.pid}}async screenshot(e){let r=t(this.record);if(!r)throw Error(`no graphical frame for '${this.record.name}' — the guest is in text mode; use \`computer text\``);let a=n(r,e.maxWidth),o=await i(a);return this.seq+=1,{seq:this.seq,mime:`image/jpeg`,width:a.width,height:a.height,bytes:o}}async text(){return e(this.record)}async input(e){for(let t of e)await this.apply(t)}async close(){}async apply(e){switch(e.type){case`mousemove`:this.applyMousemove(e);return;case`button`:await this.applyButton(e);return;case`click`:await this.applyClick(e);return;case`scroll`:await this.applyScroll(e);return;case`drag`:await this.applyDrag(e);return;case`key`:this.applyKey(e);return;case`text`:this.record.emulator.keyboard_send_text(e.text);return;case`wait`:await u(Math.max(0,e.ms));return}}applyMousemove(e){let t=this.record.emulator;if(e.relative){t.bus.send(`mouse-delta`,[e.x,-e.y]),this.lastX+=e.x,this.lastY+=e.y;return}this.rehomePointer(),t.bus.send(`mouse-delta`,[e.x,-e.y]),this.lastX=e.x,this.lastY=e.y}rehomePointer(){this.record.emulator.bus.send(`mouse-delta`,[-16384,16384]),this.lastX=0,this.lastY=0}async maybeMoveTo(e,t){e!==void 0&&t!==void 0&&this.applyMousemove({type:`mousemove`,x:e,y:t})}async applyButton(e){await this.maybeMoveTo(e.x,e.y),this.sendButtons(e.button,e.down)}async applyClick(e){await this.maybeMoveTo(e.x,e.y);let t=Math.max(1,e.count);for(let n=0;n<t;n++)this.sendButtons(e.button,!0),e.holdMs&&e.holdMs>0&&await u(e.holdMs),this.sendButtons(e.button,!1)}async applyScroll(e){await this.maybeMoveTo(e.x,e.y),this.record.emulator.bus.send(`mouse-wheel`,[e.dx,-e.dy])}async applyDrag(e){this.applyMousemove({type:`mousemove`,x:e.x1,y:e.y1}),this.sendButtons(1,!0),this.applyMousemove({type:`mousemove`,x:e.x2,y:e.y2}),this.sendButtons(1,!1)}applyKey(e){let t=r(e.keysym);if(!t)throw Error(`unknown keysym '${e.keysym}'`);if(e.down===!1){this.record.emulator.keyboard_send_scancodes(t.filter((e,n)=>n>=t.length/2));return}if(e.down===!0){this.record.emulator.keyboard_send_scancodes(t.slice(0,Math.ceil(t.length/2)));return}this.record.emulator.keyboard_send_scancodes(t)}sendButtons(e,t){let n=[!1,!1,!1];t&&(n[c[e]]=!0),this.record.emulator.bus.send(`mouse-click`,n)}};function u(e){return new Promise(t=>setTimeout(t,e))}function d(e,t=a()){return t?t.register(new l(e),{pid:e.pid}):null}function f(e,t=a()){t&&t.unregister(o(e))}export{l as V86ComputerBackend,d as registerV86Computer,f as unregisterV86Computer,o as v86ComputerId};
@@ -1 +0,0 @@
1
- import{n as e}from"./wc-onboarding-B62UQF1p.js";export{e as hasOnboardingFinalLickInHistory};