sliccy 6.178.2 → 6.179.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/dist/node-server/_shared/tray-sync-protocol.d.ts +18 -3
  2. package/dist/node-server/_shared/tray-sync-protocol.d.ts.map +1 -1
  3. package/dist/node-server/_shared/tray-sync-protocol.js.map +1 -1
  4. package/dist/ui/.vite/manifest.json +191 -182
  5. package/dist/ui/assets/SKILL-B2bgzyKV.js +1 -0
  6. package/dist/ui/assets/__vite-browser-external-CVereMU8.js +1 -0
  7. package/dist/ui/assets/account-store-_Ksq0LeF.js +1 -0
  8. package/dist/ui/assets/account-store-dO23dNCl.js +2 -0
  9. package/dist/ui/assets/{adobe-BHZ-TF7E.js → adobe-BIvm4-sf.js} +1 -1
  10. package/dist/ui/assets/{adobe-Cqd5wrqM.js → adobe-DGXLUuxi.js} +1 -1
  11. package/dist/ui/assets/{agent-panels-DXCdmUkc.js → agent-panels-1Al9YhTO.js} +1 -1
  12. package/dist/ui/assets/{almost-bash-shell-headless-B29ulBpN.js → almost-bash-shell-headless-D8xvUvg7.js} +231 -231
  13. package/dist/ui/assets/{apply-layout-BiYaZGTe.js → apply-layout-BInHwmtO.js} +1 -1
  14. package/dist/ui/assets/{apps-BYK0eeEc.js → apps-Baz0Lnmg.js} +1 -1
  15. package/dist/ui/assets/{azure-openai-BgA0OxNa.js → azure-openai-BOY1NiG8.js} +1 -1
  16. package/dist/ui/assets/{azure-openai-DwxTKwka.js → azure-openai-ttpNpc1f.js} +1 -1
  17. package/dist/ui/assets/{backend-hostfs-CeXHlroV.js → backend-hostfs-BOg3QQ4q.js} +1 -1
  18. package/dist/ui/assets/bedrock-camp-BQ02i7Bk.js +1 -0
  19. package/dist/ui/assets/bedrock-camp-CMYc0nQP.js +1 -0
  20. package/dist/ui/assets/bedrock-camp-extra-models-B0WH9IRx.js +1 -0
  21. package/dist/ui/assets/bedrock-camp-extra-models-WTCIjj5a.js +1 -0
  22. package/dist/ui/assets/{bunny-probe-Dk-taSwq.js → bunny-probe-DwyMiB71.js} +1 -1
  23. package/dist/ui/assets/{bunny-run-CmnXF3U5.js → bunny-run-COGwXgvg.js} +1 -1
  24. package/dist/ui/assets/{cdp-wm8vfA8s.js → cdp-BKix-G_U.js} +4 -4
  25. package/dist/ui/assets/{cerebras-BPlfZv3L.js → cerebras-DjoHQ6Xp.js} +1 -1
  26. package/dist/ui/assets/{cerebras-wuHzITPY.js → cerebras-UE5-6iqM.js} +1 -1
  27. package/dist/ui/assets/{composer-speech-DI9SI2lY.js → composer-speech-BVzciYHA.js} +1 -1
  28. package/dist/ui/assets/{connect-surface-zTa8OfFh.js → connect-surface-O3amvWBB.js} +1 -1
  29. package/dist/ui/assets/{directed-approval-DmDgVpiX.js → directed-approval-_Y76j9C0.js} +1 -1
  30. package/dist/ui/assets/{ensure-speech-assets-42E6KJDv.js → ensure-speech-assets-BrVI5VWr.js} +1 -1
  31. package/dist/ui/assets/{fast-path-DiV4YcEb.js → fast-path-CG_eXz0M.js} +1 -1
  32. package/dist/ui/assets/{frozen-archive-writer-C97kBlYw.js → frozen-archive-writer-BqU275cT.js} +1 -1
  33. package/dist/ui/assets/{fs-BKmepe3Q.js → fs-BCvRe0en.js} +2 -2
  34. package/dist/ui/assets/{fs-DmgjBIs9.js → fs-CNQgTr1W.js} +1 -1
  35. package/dist/ui/assets/{gelatiere-store-D1l9WE1j.js → gelatiere-store-Bv8M3zKW.js} +1 -1
  36. package/dist/ui/assets/{gelatiere-unit-jlm5b-JJ.js → gelatiere-unit-ucpnioSj.js} +1 -1
  37. package/dist/ui/assets/{github-C8jjATg2.js → github-B6d20Xtd.js} +2 -2
  38. package/dist/ui/assets/{github-auth-CkC7qTEg.js → github-auth-DHDr0MZD.js} +1 -1
  39. package/dist/ui/assets/{github-copilot-D7QRCTDD.js → github-copilot-DF54WJFJ.js} +1 -1
  40. package/dist/ui/assets/{github-copilot-DuwasHAz.js → github-copilot-DxvP_gQ2.js} +1 -1
  41. package/dist/ui/assets/{github-BB3M-XW1.js → github-gkCO9POj.js} +1 -1
  42. package/dist/ui/assets/{github-install-DT3Wys59.js → github-install-CLwrUeHG.js} +1 -1
  43. package/dist/ui/assets/{github-zip-CX3GXBmW.js → github-zip-ggx_X_vr.js} +1 -1
  44. package/dist/ui/assets/{hear-pJ--prvx.js → hear-BO8nJLV8.js} +1 -1
  45. package/dist/ui/assets/{help-gOzjZhgS.js → help-CPzYQxS7.js} +1 -1
  46. package/dist/ui/assets/{installer-DeqzzcvC.js → installer-DdfBd9PU.js} +1 -1
  47. package/dist/ui/assets/{js-realm-worker-QT2JnICz.js → js-realm-worker-BityZEz7.js} +9 -9
  48. package/dist/ui/assets/{jsh-executor-BBZWMBxV.js → jsh-executor-CKyw9lLY.js} +3 -3
  49. package/dist/ui/assets/{kernel-worker-B23YxkDH.js → kernel-worker-qQGHaMnf.js} +11 -11
  50. package/dist/ui/assets/{lick-ws-bridge-CpcUjLS6.js → lick-ws-bridge-BkNkR9Ca.js} +1 -1
  51. package/dist/ui/assets/{lick-ws-bridge-DsoQWD5s.js → lick-ws-bridge-DRImkUTH.js} +1 -1
  52. package/dist/ui/assets/{live-session-curation-BWfx-Nu1.js → live-session-curation-P6SXyKp0.js} +1 -1
  53. package/dist/ui/assets/{live-session-snapshot-BSNfthJ2.js → live-session-snapshot-CyWcObFf.js} +1 -1
  54. package/dist/ui/assets/{local-llm-vzP-uq7M.js → local-llm-BUnPutW1.js} +1 -1
  55. package/dist/ui/assets/{local-llm-DGFPI_4T.js → local-llm-CmoETAXe.js} +1 -1
  56. package/dist/ui/assets/main-D9U5TUrs.js +22 -0
  57. package/dist/ui/assets/{main-cherry-Bbjw_90k.js → main-cherry-CCD39MP_.js} +1 -1
  58. package/dist/ui/assets/{memory-curation-seam-BufuSUCj.js → memory-curation-seam-DsTTNESg.js} +1 -1
  59. package/dist/ui/assets/{memory-health-DdSqq7yP.js → memory-health-unNAzsFb.js} +1 -1
  60. package/dist/ui/assets/memory-v2-flag-B2nSV4Lc.js +1 -0
  61. package/dist/ui/assets/{memory-write-execute-BygymnF0.js → memory-write-execute-DaxAnwsF.js} +1 -1
  62. package/dist/ui/assets/{mount-_sTSuvKx.js → mount-BMvAKuQj.js} +1 -1
  63. package/dist/ui/assets/{mount-DlogHA7u.js → mount-LPTe0PFr.js} +3 -3
  64. package/dist/ui/assets/new-session-CoExcd2o.js +2 -0
  65. package/dist/ui/assets/oauth-bootstrap-C1B2GC97.js +2 -0
  66. package/dist/ui/assets/{onboarding-orchestrator-CbnB67nZ.js → onboarding-orchestrator-fgBOHrFc.js} +1 -1
  67. package/dist/ui/assets/{openai-codex-SI0nWQNS.js → openai-codex-BG00vpqV.js} +1 -1
  68. package/dist/ui/assets/{openai-codex-BtwVt-12.js → openai-codex-D5bGv3v_.js} +1 -1
  69. package/dist/ui/assets/{openrouter-BFlMjaCH.js → openrouter-BXmUmBsU.js} +1 -1
  70. package/dist/ui/assets/{openrouter-BruOnSfT.js → openrouter-OxxNLK64.js} +1 -1
  71. package/dist/ui/assets/{openrouter-free-DPQDCfqQ.js → openrouter-free-gR5o0rCK.js} +1 -1
  72. package/dist/ui/assets/{openrouter-free-B2pceWVg.js → openrouter-free-uGVhtFc3.js} +1 -1
  73. package/dist/ui/assets/{openrouter-oauth-BLskezr8.js → openrouter-oauth-BvV3Fia1.js} +1 -1
  74. package/dist/ui/assets/{openrouter-oauth-C4kwBIwS.js → openrouter-oauth-CT_Zj9YD.js} +1 -1
  75. package/dist/ui/assets/{opfs-mount-8s9WP18b.js → opfs-mount-UFdaZCov.js} +1 -1
  76. package/dist/ui/assets/panel-rpc-handlers-82bfFThY.js +2 -0
  77. package/dist/ui/assets/{panelize-shell-Dg_58ImI.js → panelize-shell-B5r_tYN0.js} +1 -1
  78. package/dist/ui/assets/{pi-edit-execution-C9GYKunH.js → pi-edit-execution-DF1HhU43.js} +1 -1
  79. package/dist/ui/assets/{provider-DEcfbBkM.js → provider-DIX-yDf1.js} +1 -1
  80. package/dist/ui/assets/{provider-B_fhkXn7.js → provider-ZlWYE7tn.js} +2 -2
  81. package/dist/ui/assets/{provider-settings-BLtjMrT0.js → provider-settings-By6-4Hob.js} +1 -1
  82. package/dist/ui/assets/provider-store-access-DGTGBgAd.js +1 -0
  83. package/dist/ui/assets/provider-store-access-DblNX0Qr.js +1 -0
  84. package/dist/ui/assets/providers-BFl9psp8.js +2 -0
  85. package/dist/ui/assets/providers-CLabs7-N.js +1 -0
  86. package/dist/ui/assets/py-live-vfs-DaPSes0l.js +168 -0
  87. package/dist/ui/assets/py-live-vfs-Dx9cFlfE.js +168 -0
  88. package/dist/ui/assets/{py-realm-worker-A1ICPvEl.js → py-realm-worker-CYwLJW9I.js} +3 -3
  89. package/dist/ui/assets/{pyodide-DGH4V3SQ.js → pyodide-DKNrUBio.js} +2 -2
  90. package/dist/ui/assets/{quick-llm-B8uh7EVu.js → quick-llm-D9d7sUsw.js} +1 -1
  91. package/dist/ui/assets/realm-inprocess-BRBbxPBB.js +30 -0
  92. package/dist/ui/assets/{recovery-screen-M8szzZB2.js → recovery-screen-CkIyMRc0.js} +1 -1
  93. package/dist/ui/assets/{remote-terminal-view-6ygd42Fb.js → remote-terminal-view-CpbLu8Sz.js} +1 -1
  94. package/dist/ui/assets/require-guards-Du29-pl4.js +252 -0
  95. package/dist/ui/assets/{restore-Qq5h6a38.js → restore-BZ9V2jCD.js} +1 -1
  96. package/dist/ui/assets/run-B0N83lIB.js +86 -0
  97. package/dist/ui/assets/{run--H9dud5r.js → run-BEOVa96v.js} +2 -2
  98. package/dist/ui/assets/{run-DK8nktud.js → run-BoSrXXY1.js} +2 -2
  99. package/dist/ui/assets/{run-CPDsfLJJ.js → run-Bq-Xk94T.js} +2 -2
  100. package/dist/ui/assets/{run-dNFrBZDI.js → run-CTYkZrli.js} +1 -1
  101. package/dist/ui/assets/{run-_QNErIec.js → run-DSzWrEfE.js} +2 -2
  102. package/dist/ui/assets/{run-C3rYy-Lu.js → run-Dgam-lSu.js} +1 -1
  103. package/dist/ui/assets/{run-C0wVagJ5.js → run-DkxI8mp3.js} +2 -2
  104. package/dist/ui/assets/{run-Bk0pGJJa.js → run-DnjuDRM3.js} +1 -1
  105. package/dist/ui/assets/{session-command-memory-CAl1-crq.js → session-command-memory-DyJ_PMwk.js} +2 -2
  106. package/dist/ui/assets/{session-jsonl-lB9-7rZS.js → session-jsonl-CGBR73CL.js} +1 -1
  107. package/dist/ui/assets/{session-jsonl-B-4fihPX.js → session-jsonl-px88OtuO.js} +1 -1
  108. package/dist/ui/assets/{session-search-index-Bn4FhmPW.js → session-search-index-yyM4rIX7.js} +1 -1
  109. package/dist/ui/assets/{setup-feature-flags-remote-opNg3JWs.js → setup-feature-flags-remote-B6HW35ii.js} +1 -1
  110. package/dist/ui/assets/{signed-fetch-YC2zrriw.js → signed-fetch-D1gxhAgf.js} +1 -1
  111. package/dist/ui/assets/{silent-renew-backoff-Bak0vwwf.js → silent-renew-backoff-CgDiUeEr.js} +1 -1
  112. package/dist/ui/assets/slicc-version-2HAR5Ivl.js +1 -0
  113. package/dist/ui/assets/{snapshot-features-BqGUjBWl.js → snapshot-features-bBwoXkOR.js} +1 -1
  114. package/dist/ui/assets/{snapshot-6br_5p-f.js → snapshot-oVV9Iqa-.js} +1 -1
  115. package/dist/ui/assets/{soundscape-DRViCPly.js → soundscape-C1bpUu46.js} +1 -1
  116. package/dist/ui/assets/{speak-DRv_vLqY.js → speak-C7tACkSs.js} +1 -1
  117. package/dist/ui/assets/{sprinkle-manager-DeJrE3Hq.js → sprinkle-manager-q03I3INE.js} +1 -1
  118. package/dist/ui/assets/{sprinkle-renderer-DYUy10CO.js → sprinkle-renderer-CeFlc9rW.js} +25 -8
  119. package/dist/ui/assets/{src-CmTUvI8R.js → src-BfoZU01X.js} +74 -74
  120. package/dist/ui/assets/{ssh-D1zj1EXl.js → ssh-DplyBT74.js} +2 -2
  121. package/dist/ui/assets/{state-BpyjzTIG.js → state-CDWzXqaM.js} +1 -1
  122. package/dist/ui/assets/{store-DwUewAuZ.js → store-BSzBYE_Q.js} +1 -1
  123. package/dist/ui/assets/{store-DQkIRnav.js → store-DQazKd79.js} +1 -1
  124. package/dist/ui/assets/{sudo-DIegVBwT.js → sudo-Bel-CIaV.js} +1 -1
  125. package/dist/ui/assets/{supervisor-gHbk5m7z.js → supervisor-Dwyz3Q6J.js} +1 -1
  126. package/dist/ui/assets/{sync-dialog-CH4PBcVu.js → sync-dialog-BrADzVJ_.js} +1 -1
  127. package/dist/ui/assets/sync-exec-xhr-bridge-BjD_IfJF.js +1 -0
  128. package/dist/ui/assets/sync-sab-wire-CkrsRVrw.js +1 -0
  129. package/dist/ui/assets/tab-8LaHojfd.js +1 -0
  130. package/dist/ui/assets/{transformers-env-9M9En1_O.js → transformers-env-BdAlKg6J.js} +1 -1
  131. package/dist/ui/assets/{tray-leader-Bd293BI8.js → tray-leader-Ci2RqIwT.js} +1 -1
  132. package/dist/ui/assets/{tray-leave-runtime-wLd1uBMu.js → tray-leave-runtime-BTZJXHF3.js} +1 -1
  133. package/dist/ui/assets/{tray-sidecar-C35X7Jht.js → tray-sidecar-0neE65_N.js} +1 -1
  134. package/dist/ui/assets/{upgrade-detection-Tp8fDJAG.js → upgrade-detection-BhD72UZe.js} +1 -1
  135. package/dist/ui/assets/{upskill-lick-skip-Cr0VVPGj.js → upskill-lick-skip-CdUqlWMq.js} +1 -1
  136. package/dist/ui/assets/{voice-reply-wJfABSIn.js → voice-reply-DmPQ88Bf.js} +1 -1
  137. package/dist/ui/assets/wc-attach-Cl4xiVKJ.js +13 -0
  138. package/dist/ui/assets/{wc-browser-BJemxWhg.js → wc-browser-BvVPGuJC.js} +1 -1
  139. package/dist/ui/assets/{wc-computers-Cr14YnOg.js → wc-computers-BE8zFCtr.js} +1 -1
  140. package/dist/ui/assets/{wc-detached-DQ_ZTSZ-.js → wc-detached-B0kP4Z2z.js} +1 -1
  141. package/dist/ui/assets/{wc-extension-C8pgLDqO.js → wc-extension-WMLYCZ4S.js} +2 -2
  142. package/dist/ui/assets/wc-follower-D8xNU0aW.js +17 -0
  143. package/dist/ui/assets/{wc-follower-oauth-BU-XAftl.js → wc-follower-oauth-B1NOOs9Y.js} +1 -1
  144. package/dist/ui/assets/{wc-gelatiere-BiyouLW3.js → wc-gelatiere-D11FUwwn.js} +1 -1
  145. package/dist/ui/assets/wc-live-BN97yBha.js +428 -0
  146. package/dist/ui/assets/wc-nav-KGT1hZcx.js +2 -0
  147. package/dist/ui/assets/{wc-onboarding-FjrDOv_u.js → wc-onboarding-Bnq3tf12.js} +2 -2
  148. package/dist/ui/assets/{wc-permissions-C63-jLbY.js → wc-permissions-D5ysM8C0.js} +2 -2
  149. package/dist/ui/assets/{wc-placeholder-Bdbmjijc.js → wc-placeholder-BXQeCEMQ.js} +3 -3
  150. package/dist/ui/assets/{wc-secret-request-C9iCWgBV.js → wc-secret-request-p-Za4Fvj.js} +1 -1
  151. package/dist/ui/assets/{wc-settings-1ZJgN4Wk.js → wc-settings-ZR46gu8_.js} +3 -3
  152. package/dist/ui/assets/{wc-shell-CrMn8BW0.js → wc-shell-BXTMxaKz.js} +149 -149
  153. package/dist/ui/assets/{wc-shortcut-config-JXEU24sg.js → wc-shortcut-config-BcDpfOL9.js} +1 -1
  154. package/dist/ui/assets/{wc-sprinkles-CBaPR_V8.js → wc-sprinkles-DgakIQNM.js} +2 -2
  155. package/dist/ui/assets/{wc-transcript-export-eyG-SwVe.js → wc-transcript-export-diqfvsUL.js} +2 -2
  156. package/dist/ui/assets/wc-tray-CtCdghN6.js +5 -0
  157. package/dist/ui/assets/welcome-detection-wvPklODF.js +1 -0
  158. package/dist/ui/assets/whisper-session-AsG9i34j.js +2 -0
  159. package/dist/ui/assets/{xai-grok-C2oyJ5tt.js → xai-grok-CyMPEYvk.js} +1 -1
  160. package/dist/ui/assets/{xai-grok-G4GFCgrM.js → xai-grok-DeZVR3e9.js} +1 -1
  161. package/dist/ui/index.html +4 -3
  162. package/dist/ui/llm-proxy-sw.js +1 -1
  163. package/dist/ui/packages/webapp/index.html +4 -3
  164. package/package.json +2 -2
  165. package/dist/ui/assets/SKILL-CJrjPuRt.js +0 -1
  166. package/dist/ui/assets/__vite-browser-external-C7Grxh8D.js +0 -1
  167. package/dist/ui/assets/account-store-LwLxI7v1.js +0 -1
  168. package/dist/ui/assets/account-store-SI8RQbm0.js +0 -2
  169. package/dist/ui/assets/bedrock-camp-D-jmLdEX.js +0 -1
  170. package/dist/ui/assets/bedrock-camp-DmVFQWfL.js +0 -1
  171. package/dist/ui/assets/main-DFTTAllP.js +0 -22
  172. package/dist/ui/assets/memory-v2-flag-uChv9nwr.js +0 -1
  173. package/dist/ui/assets/new-session-C914zfKa.js +0 -2
  174. package/dist/ui/assets/oauth-bootstrap-B7cPXMSk.js +0 -2
  175. package/dist/ui/assets/panel-rpc-handlers-BuMdGle_.js +0 -2
  176. package/dist/ui/assets/provider-store-access-C0w1Xcs2.js +0 -1
  177. package/dist/ui/assets/provider-store-access-YjQKD2es.js +0 -1
  178. package/dist/ui/assets/providers-B0rCH1pp.js +0 -1
  179. package/dist/ui/assets/providers-B9p2VR5L.js +0 -2
  180. package/dist/ui/assets/realm-inprocess-qhbZWW6z.js +0 -30
  181. package/dist/ui/assets/run-DUzzkV29.js +0 -82
  182. package/dist/ui/assets/slicc-version-D1Js64gw.js +0 -1
  183. package/dist/ui/assets/sync-sab-wire-CN1_ni9J.js +0 -252
  184. package/dist/ui/assets/tab-0xwFvGm5.js +0 -1
  185. package/dist/ui/assets/wc-attach-CtVWDKPk.js +0 -13
  186. package/dist/ui/assets/wc-follower-nosCeVKN.js +0 -17
  187. package/dist/ui/assets/wc-live-CaopRwn0.js +0 -427
  188. package/dist/ui/assets/wc-nav-Wn2qDNiX.js +0 -2
  189. package/dist/ui/assets/wc-tray-dSLNIDh9.js +0 -5
  190. package/dist/ui/assets/welcome-detection-DuFRP38Z.js +0 -1
  191. package/dist/ui/assets/whisper-session-DrDhzSqp.js +0 -2
@@ -0,0 +1 @@
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, names, titles\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`-c` takes an id, the `-n` name the computer was added under, or its current title — in that order. Prefer the **id** or the **name**: `ls` shows them in separate columns because `TITLE` is whatever the surface calls itself right now (a tab republishes `document.title` on every capture), while `NAME` is fixed for the life of the registration.\n\n## Look then act\n\nEvery poke writes a frozen JPEG and prints `target: <id>` then `screen: <path>`. The extension of that path follows the bytes, so it is `.jpg` in practice and `.png` only if a backend hands back PNG the runtime could not transcode — read the extension, do not assume it. 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. It is an upper bound: a frame is never widened past the computer's native size to reach it, and one that cannot be encoded that narrow arrives at native size rather than upscaled. 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\nhost # every follower, tagged [ssh] [computer] [playwright]\nssh --list # exec-capable tray followers only\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\ncomputer add ssh mac-follower --display 3 -n portrait # a second screen\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 `host`, tagged `[ssh] [computer]` — 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. **`host` is the roster to read**: an entry tagged `[computer]` can be looked at, whether it holds the screen itself or through its paired launcher. `ssh --list` shows the exec half only, because that is the list of targets that accept commands — a capture-only `sliccstart-computer` is addressable from `host`, never from `ssh`. Without `--computer` the same Mac appears twice (a `follower-…` tagged `[ssh]` and a `sliccstart-computer` tagged `[computer]`); 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**Which screen (native capture only).** Default is the Mac's **main** display. `--display <n>` picks another: 1-based in the OS display order, the same numbering as `screencapture -D <n>` on that follower, so `screencapture -D 3` through the exec channel shows you what `--display 3` will capture. An out-of-range number fails with the attached displays listed (`display 7 is not attached — attached displays: 1=5120x2880 (main), …`), which is also the cheapest way to enumerate them. A picked display widens the id to `ssh:<runtime>:display:<n>`, so register one computer per screen to drive several at once. Native frames and `--size` are in real **pixels**, so `--size 2000` reaches 2000 px wide on a 2x display, not the 1440 point width.\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};
@@ -0,0 +1 @@
1
+ import{t as e}from"./py-realm-worker-CYwLJW9I.js";var t=e(((e,t)=>{t.exports={}}));export default t();
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-LESFN7Hj.js";import"./proxied-fetch-CZTz7e5K.js";import{n,r}from"./panel-rpc-DVS1uJpt.js";import{n as i,o as a,t as o}from"./providers-CLabs7-N.js";import{s,t as c}from"./api-endpoint-D8lUKmPu.js";import{i as l,n as ee,r as u}from"./compat-uEPf6-XW.js";import{a as te}from"./core-LSLY4su2.js";import{t as d}from"./secrets-bridge-client-C0Lc0mUg.js";import{i as ne,r as re,t as ie}from"./bedrock-camp-compat-99DjWBHV.js";import{r as ae,t as oe}from"./bedrock-camp-extra-models-B0WH9IRx.js";import{s as se}from"./claude-model-version-ceOteQ2f.js";const ce=`slicc_oauth_extra_domains`;function f(e){try{let t=e.getItem(ce);if(!t)return{};let n=JSON.parse(t);if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n)){if(typeof e!=`string`||!Array.isArray(t))continue;let n=t.filter(e=>typeof e==`string`&&e.length>0);n.length>0&&(r[e]=n)}return r}catch{return{}}}function le(e,t){try{e.setItem(ce,JSON.stringify(t))}catch(e){throw Error(`Failed to persist OAuth extras (localStorage quota exceeded?): ${e instanceof Error?e.message:String(e)}`)}}function ue(e,t){let n={input:0,output:0,cacheRead:0,cacheWrite:0},r=se(e);if(!r)return n;let i;for(let e of t.values()){let t=se(e.id);!t||t.family!==r.family||(!i||t.major>i.major||t.major===i.major&&t.minor>i.minor)&&(i={major:t.major,minor:t.minor,cost:e.cost})}return i?.cost??n}const de=t(`model-policy`),p=`/etc/models`;function m(){return{sections:{}}}function fe(e){let t=e.indexOf(`#`);return(t===-1?e:e.slice(0,t)).trim()}function pe(e){let t=m();if(typeof e!=`string`)return t;let n=null;for(let r of e.split(/\r?\n/)){let e=fe(r);if(!e)continue;let i=/^\[([^\]]+)\]$/.exec(e);if(i){n=i[1].trim(),t.sections[n]??=[];continue}if(n===null){de.warn(`model policy entry before any [provider] section — ignored`,{entry:e});continue}let a=e.startsWith(`-`),o=a?e.slice(1).trim():e,s=o.indexOf(`:`);if(s<=0||s===o.length-1){de.warn(`model policy entry is not provider:model — ignored`,{entry:e});continue}t.sections[n].push({providerId:o.slice(0,s).trim(),modelId:o.slice(s+1).trim(),deny:a})}return t}function h(e,t,n){return e.providerId===t?e.modelId===`*`||e.modelId===n:!1}function me(e,t){return e.sections[t]??[]}function he(e,t,n,r){return me(e,t).some(e=>e.deny&&h(e,n,r))}function ge(e,t,n,r){let i=me(e,t);return i.some(e=>e.deny&&h(e,n,r))?!1:n===t||i.some(e=>!e.deny&&h(e,n,r))}let _e=m();function ve(e){_e=e}function g(){return _e}function ye(e,t,n){return`add \`${t}:${n}\` (or \`${t}:*\`) under \`[${e}]\` in ${p}`}var be=e({ACCOUNTS_KEY:()=>y,__test__:()=>Ee,addAccount:()=>P,applyProviderDefaults:()=>ke,clearAllSettings:()=>dt,clearApiKey:()=>ot,clearBaseUrl:()=>lt,clearSelectedProvider:()=>rt,ensureOAuthMaskReplica:()=>Ye,exportProviders:()=>ut,getAccounts:()=>M,getAllAvailableModels:()=>Me,getAllExtraOAuthDomains:()=>Le,getAlternativeModelProviders:()=>Ne,getApiKey:()=>it,getApiKeyForProvider:()=>B,getApiVersionForProvider:()=>$e,getAvailableProviders:()=>C,getBaseUrl:()=>st,getBaseUrlForProvider:()=>V,getDeploymentForProvider:()=>Qe,getExtraOAuthDomains:()=>Pe,getOAuthAccountInfo:()=>O,getProviderConfig:()=>T,getProviderModels:()=>D,getRawApiKeyForProvider:()=>z,getSelectedModelId:()=>H,getSelectedProvider:()=>U,isModelHiddenFromPicker:()=>A,isUsableOAuthMaskReplica:()=>L,logoutOAuthAccount:()=>Be,maskOAuthTokenWithRetry:()=>Ve,migrateLegacyAuthOnlySelection:()=>we,modelRunsOnProvider:()=>gt,persistOAuthMaskViaServiceWorker:()=>R,policyVisible:()=>j,providerOffersLlmModels:()=>w,removeAccount:()=>F,resolveCurrentModel:()=>q,resolveModelById:()=>K,resolveModelByShorthand:()=>_t,resolveModelIdForScoop:()=>wt,resolveModelSelectionForScoop:()=>Z,saveOAuthAccount:()=>Ze,setApiKey:()=>at,setBaseUrl:()=>ct,setExtraOAuthDomains:()=>Fe,setExtraOAuthDomainsAsync:()=>Ie,setSelectedModelId:()=>et,setSelectedProvider:()=>nt});const _=ee,v=u,y=`slicc_accounts`,b=`selected-model`,xe=[`slicc_provider`,`slicc_api_key`,`slicc_base_url`,`anthropic_api_key`,`api_provider`,`azure_resource`,`bedrock_region`],Se=new Set([`github`]);function x(e){let t;try{t=l()}catch{return!1}return t.includes(e)&&!a(e)}let S=!1;function Ce(){if(!S){S=!0;for(let e of xe)try{localStorage.removeItem(e)}catch{}we()}}function we(){try{let e=localStorage.getItem(b);if(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t);(Se.has(n)||x(n))&&localStorage.removeItem(b)}}}catch{}try{let e=localStorage.getItem(y);if(!e)return;let t=JSON.parse(e);if(!Array.isArray(t))return;let n=t.filter(e=>!(typeof e==`object`&&e&&typeof e.providerId==`string`&&x(e.providerId)));n.length!==t.length&&localStorage.setItem(y,JSON.stringify(n))}catch{}}function Te(){S=!1}const Ee={_resetLegacyCleanup:Te};function C(){let e=l().filter(a),t=i();return[...new Set([...e,...t])].filter(e=>!o(e)?.hidden)}function w(e){try{if(D(e).length>0)return!0}catch{}try{if(u(e).length>0)return!0}catch{}let t=o(e);return!!(t?.modelOverrides&&Object.keys(t.modelOverrides).length>0)}function De(e,t){try{if(D(e).some(e=>e.id===t))return!0}catch{}try{if(u(e).some(e=>e.id===t))return!0}catch{}let n=o(e);return!!(n?.modelOverrides&&Object.hasOwn(n.modelOverrides,t))}function T(e){return o(e)||{id:e,name:e.split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),description:`${e} provider`,requiresApiKey:!0,requiresBaseUrl:!1}}function E(e,t){t.context_window!==void 0&&(e.contextWindow=t.context_window),t.max_tokens!==void 0&&(e.maxTokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),t.cost!==void 0&&(e.cost=t.cost,e.inputCost=t.cost.input,e.outputCost=t.cost.output,e.cacheReadCost=t.cost.cacheRead,e.cacheWriteCost=t.cost.cacheWrite),t.compat!==void 0&&(e.compat={...e.compat??{},...t.compat}),t.thinkingLevelMap!==void 0&&(e.thinkingLevelMap={...e.thinkingLevelMap??{},...t.thinkingLevelMap})}function D(e){try{if(e===`bedrock-camp`){let e=ie(V(`bedrock-camp`));return ae(v(`amazon-bedrock`),oe).filter(t=>ne(t,e)).map(e=>({...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`,reasoning:e.reasoning===!0&&re(e)}))}let t=T(e);if(t.getModelIds){let n;try{n=t.getModelIds()}catch(t){return k.error(`Provider getModelIds callback failed`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}let r=new Map;for(let e of l())try{for(let t of v(e))r.set(t.id,t)}catch{}return n.map(n=>{let i=n.api===`openai`?`openai`:`anthropic`,a=`${e}-${i}`,o=r.get(n.id),s;if(o)s={...o,api:a,provider:e};else if(s=W(e,n.id,``,a),n.name&&(s.name=n.name),i===`anthropic`){let e=ue(n.id,r);s.cost=e,s.inputCost=e.input,s.outputCost=e.output,s.cacheReadCost=e.cacheRead,s.cacheWriteCost=e.cacheWrite}let c=t.modelOverrides?.[n.id];return c&&E(s,c),E(s,n),s})}if(t.isOAuth){let n=v(`anthropic`),r=`${e}-anthropic`;return n.map(n=>{let i={...n,api:r,provider:e},a=t.modelOverrides?.[n.id];return a&&E(i,a),i})}return v(e===`azure-ai-foundry`?`anthropic`:e)}catch(t){return k.error(`Failed to load models`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}}function O(e){let t=M().find(t=>t.providerId===e);if(!t?.accessToken)return null;let n=!!t.tokenExpiresAt&&Date.now()>t.tokenExpiresAt-6e4;return{token:t.accessToken,maskedValue:t.maskedValue,expiresAt:t.tokenExpiresAt,userName:t.userName,userAvatar:t.userAvatar,scopes:t.scopes,expired:n}}const Oe=Object.assign({})[`/packages/webapp/providers.json`]??[],k=t(`provider-settings`);function ke(e=Oe){if(e.length===0||M().length>0)return;let t=new Set(C());for(let n of e)if(!(!n.providerId||!n.apiKey)){if(!t.has(n.providerId)){k.warn(`Unknown provider "${n.providerId}" in providers.json — skipping`);continue}P(n.providerId,n.apiKey,n.baseUrl)}let n=e.find(e=>e.providerId&&e.apiKey&&t.has(e.providerId));n?.model&&!localStorage.getItem(b)&&localStorage.setItem(b,`${n.providerId}:${n.model}`)}const Ae=[/haiku/i];function A(e){return Ae.some(t=>t.test(e))}function je(e){return e.filter(e=>!A(e.id))}function j(e,t){let n=Q();if(n===null)return e;let r=g();return e.filter(e=>!he(r,n,t,e.id))}function Me(){let e=M();if(e.length===0)return[];let t=new Map;for(let n of e){if(t.has(n.providerId))continue;let e=T(n.providerId);if(e.hidden||x(n.providerId))continue;let r=j(je(D(n.providerId)),n.providerId);if(r.length===0)continue;let i={providerId:n.providerId,providerName:e.name,models:r};t.set(n.providerId,i)}return[...t.values()]}function Ne(e){return Me().map(e=>e.providerId).filter(t=>t!==e)}function M(){Ce();let e=localStorage.getItem(y);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`object`&&!!e&&typeof e.providerId==`string`&&typeof e.apiKey==`string`):[]}catch{return[]}}function Pe(e){return f(localStorage)[e]??[]}function Fe(e,t){let n=f(localStorage),r=t.map(e=>e.trim()).filter(e=>e.length>0);r.length===0?delete n[e]:n[e]=r,le(localStorage,n)}async function Ie(e,t){if(r()){Fe(e,t);return}let i=n();if(!i)throw Error(`setExtraOAuthDomainsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let{storeAfter:a}=await i.call(`oauth-extras-set`,{providerId:e,domains:t});try{le(localStorage,a)}catch(t){k.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{providerId:e,error:t instanceof Error?t.message:String(t)})}}function Le(){return f(localStorage)}function Re(e){localStorage.setItem(y,JSON.stringify(e))}async function N(e){if(r()){Re(e);return}let t=n();if(!t)throw Error(`saveAccountsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let i=JSON.stringify(e),{storedJson:a}=await t.call(`save-oauth-accounts`,{accountsJson:i});try{localStorage.setItem(y,a)}catch(e){k.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{error:e instanceof Error?e.message:String(e)})}}function P(e,t,n,r,i){let a=M().filter(t=>t.providerId!==e),o={providerId:e,apiKey:t};n&&(o.baseUrl=n),r&&(o.deployment=r),i&&(o.apiVersion=i),a.push(o),Re(a)}async function ze(e){let t=te();try{if(t===`extension-direct`){let t=await new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.delete`,name:`oauth.${e}.token`},n=>{chrome.runtime.lastError&&k.error(`SW secrets.delete transport failed`,{providerId:e,error:chrome.runtime.lastError.message}),t(n??{})})});t.error&&k.error(`SW secrets.delete returned error`,{providerId:e,error:t.error})}else if(t===`extension-delegate`){let t=await d(`secrets.delete`,{name:`oauth.${e}.token`});t?.error&&k.error(`Bridge secrets.delete returned error`,{providerId:e,error:t.error})}else if(t!==`connect`){let t=await fetch(s(`/api/secrets/oauth/${e}`),{method:`DELETE`,headers:c()});!t.ok&&t.status!==404&&k.warn(`OAuth replica DELETE non-ok`,{providerId:e,status:t.status})}}catch(n){k.error(`OAuth replica removal failed`,{providerId:e,topology:t,error:n instanceof Error?n.message:String(n)})}}async function F(e){let t=M().find(t=>t.providerId===e),n=T(e);t&&n?.isOAuth&&await Be(e),await ze(e),await N(M().filter(t=>t.providerId!==e));let r=localStorage.getItem(b)??``,i=r.indexOf(`:`);i>0&&r.slice(0,i)===e&&localStorage.removeItem(b)}async function Be(e){let t=M().find(t=>t.providerId===e);if(!t)return;let n=T(e);if(n?.isOAuth){if(n.onOAuthLogout)try{await n.onOAuthLogout()}catch(t){k.warn(`onOAuthLogout failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})}if(n.getOAuthLogoutUrl){let r=n.getOAuthLogoutUrl(t);if(r){let{openIdpLogoutUrl:t}=await import(`./oauth-service-Gh6Z-BhZ.js`);await t(r).catch(t=>{k.warn(`IdP logout popup failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})})}}await N(M().map(t=>t.providerId===e?{providerId:t.providerId,apiKey:``,baseUrl:t.baseUrl,userName:t.userName,userAvatar:t.userAvatar,loggedOut:!0}:t)),await ze(e)}}async function Ve(e,t={}){let n=Math.max(1,t.attempts??3),r=t.delayMs??150,i=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),a;for(let t=0;t<n;t++){let o=await e();if(o.maskedValue)return{maskedValue:o.maskedValue};o.error&&(a=o.error),t<n-1&&await i(r)}return{lastError:a}}const He=`access token rotated during mask write`;function I(e,t,n,r){let i=r.find(t=>t.providerId===e);return i?.accessToken?i.accessToken===t?(i.maskedValue=n,{maskedValue:n}):(k.warn(`OAuth mask write raced with token rotation; discarding replica`,{providerId:e}),{error:He}):{error:`account gone after mask write`}}function L(e,t){return!!e&&e!==t}async function R(e,t,n){let r={providerId:e.providerId,accessToken:e.accessToken,domains:e.domains.join(`,`)},{maskedValue:i,lastError:a}=await Ve(()=>t.sendMaskRequest(r),n);if(!L(i,e.accessToken)){let t=i?`mask replica equals the access token`:a??`no error reported (cold SW or empty reply)`;return k.error(`OAuth mask give-up: no masked value after retries`,{providerId:e.providerId,reason:t}),{error:t}}let o=t.getAccounts(),s=I(e.providerId,e.accessToken,i,o);return s.maskedValue&&await t.saveAccounts(o),s}function Ue(e){let t=T(e).oauthTokenDomains??[],n=Pe(e),r=new Set,i=[];for(let e of[...t,...n]){let t=e.toLowerCase();r.has(t)||(r.add(t),i.push(e))}return i}function We(e){return new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.mask-oauth-token`,...e},n=>{chrome.runtime.lastError&&k.error(`SW mask-oauth-token transport failed`,{providerId:e.providerId,error:chrome.runtime.lastError.message});let r=typeof n==`object`&&n?n:void 0;r?.error&&k.warn(`SW mask-oauth-token returned error`,{providerId:e.providerId,error:r.error}),t(r??{})})})}function Ge(e){return d(`secrets.mask-oauth-token`,e).then(t=>(t?.error&&k.warn(`Bridge mask-oauth-token returned error`,{providerId:e.providerId,error:t.error}),t??{})).catch(t=>(k.error(`Bridge mask-oauth-token transport failed`,{providerId:e.providerId,error:t instanceof Error?t.message:String(t)}),{}))}async function Ke(e,t,n){let r=s(`/api/secrets/oauth-update`),i=await fetch(r,{method:`POST`,headers:c({"Content-Type":`application/json`}),body:JSON.stringify({providerId:e,accessToken:t,domains:n})});if(!i.ok)return k.warn(`OAuth replica POST non-ok`,{providerId:e,status:i.status,url:r}),{error:`OAuth replica POST HTTP ${i.status}`};let a=await i.json();if(typeof a.maskedValue!=`string`)return k.warn(`OAuth replica POST ok but missing maskedValue`,{providerId:e,url:r}),{error:`OAuth replica POST ok but missing maskedValue`};if(!L(a.maskedValue,t))return k.error(`OAuth mask replica equals the access token; refusing to persist`,{providerId:e}),{error:`mask replica equals the access token`};let o=M(),l=I(e,t,a.maskedValue,o);return l.maskedValue&&await N(o),l}async function qe(e,t){let n=await Je(e,t);if(n.error!==He)return n;let r=M().find(t=>t.providerId===e)?.accessToken;return!r||r===t?n:Je(e,r)}async function Je(e,t){let n=Ue(e);if(n.length===0)return{error:`no oauth token domains configured`};let r=te();try{return r===`extension-direct`?R({providerId:e,accessToken:t,domains:n},{sendMaskRequest:We,getAccounts:M,saveAccounts:N}):r===`extension-delegate`?R({providerId:e,accessToken:t,domains:n},{sendMaskRequest:Ge,getAccounts:M,saveAccounts:N}):r===`connect`?{error:`no replica store in connect mode`}:await Ke(e,t,n)}catch(t){let n=t instanceof Error?t.message:String(t);return k.error(`OAuth replica sync failed`,{providerId:e,topology:r,error:n}),{error:n}}}async function Ye(e){let t=M().find(t=>t.providerId===e);return t?.accessToken?L(t.maskedValue,t.accessToken)?{maskedValue:t.maskedValue}:qe(e,t.accessToken):{error:`no access token held`}}function Xe(e,t){if(e.accessToken)return`scopes`in e?e.scopes:t?.scopes}async function Ze(e){let t=M().find(t=>t.providerId===e.providerId),n=M().filter(t=>t.providerId!==e.providerId);n.push({providerId:e.providerId,apiKey:``,accessToken:e.accessToken,refreshToken:e.refreshToken,tokenExpiresAt:e.tokenExpiresAt,userName:e.userName,userAvatar:e.userAvatar,baseUrl:e.baseUrl??t?.baseUrl,scopes:Xe(e,t)}),await N(n),await qe(e.providerId,e.accessToken)}function z(e){let t=M().find(t=>t.providerId===e);return t&&(t.accessToken||t.apiKey)||null}function B(e){let t=M().find(t=>t.providerId===e);return t?t.accessToken||t.apiKey||(T(e).optionalApiKey?`local`:null):null}function V(e){return M().find(t=>t.providerId===e)?.baseUrl??null}function Qe(e){return M().find(t=>t.providerId===e)?.deployment??null}function $e(e){return M().find(t=>t.providerId===e)?.apiVersion??null}function H(){let e=localStorage.getItem(b)||``,t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function et(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t),r=new Set([...i(),...C()]),a=n.includes(`.`);if(r.has(n)||!a){localStorage.setItem(b,e);return}}let n=U();localStorage.setItem(b,`${n}:${e}`)}function tt(){return localStorage.getItem(b)||``}function U(){let e=tt(),t=e.indexOf(`:`);if(t>0)return e.slice(0,t);let n=M(),r=H();if(r){let e=n.find(e=>w(e.providerId)&&De(e.providerId,r));if(e)return e.providerId}let i=n.find(e=>w(e.providerId));return i?i.providerId:n.length>0?n[0].providerId:`anthropic`}function nt(e){let t=H();localStorage.setItem(b,`${e}:${t}`)}function rt(){let e=H();localStorage.setItem(b,e)}function it(){return B(U())}function at(e){let t=U();P(t,e,V(t)??void 0)}async function ot(){await F(U())}function st(){return V(U())}function ct(e){let t=U(),n=z(t);n&&P(t,n,e||void 0)}function lt(){let e=U(),t=z(e);t&&P(e,t)}function ut(){let e=M(),t=U(),n=H();return e.map(e=>{let r={providerId:e.providerId,apiKey:e.apiKey};return e.baseUrl&&(r.baseUrl=e.baseUrl),e.providerId===t&&n&&(r.model=n),r})}async function dt(){let e=M();await Promise.allSettled(e.map(e=>F(e.providerId))),localStorage.removeItem(y),localStorage.removeItem(b);for(let e of xe)localStorage.removeItem(e)}function ft(e){return/^(?:gpt[-.]?|o[0-9]|chatgpt)/i.test(e)?`openai`:`anthropic`}function W(e,t,n,r){return{id:t,name:t,provider:e,api:r??`${e}-${ft(t)}`,baseUrl:n??``,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},reasoning:!0}}function G(e,t){return t.isOAuth||e===`azure-ai-foundry`?`anthropic`:e===`bedrock-camp`?`amazon-bedrock`:e}function pt(e,t,n){let r=D(e).find(e=>e.id===t);return r?n?{...r,baseUrl:n}:r:null}function mt(e,t,n,r){return n.isOAuth?D(t).find(e=>e.id===r)||{...e,api:`${t}-anthropic`,provider:t}:t===`bedrock-camp`?{...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`}:e}function ht(e,t,n,r,i){let a=pt(e,n,r);if(a)return a;if(t.isOAuth)return W(e,n,r);if(i)throw Error(`Model ${n} is not available from provider ${e}`);return q()}function K(e,t){if(!e)return q();let n=t??U(),r=V(n),i=T(n);if(t!==void 0){let t=pt(n,e,r);if(t)return t}try{let t=G(n,i),a=_(t,e);if(!a?.id)throw Error(`Model ${e} not found`);let o=mt(a,n,i,e);return r?{...o,baseUrl:r}:o}catch(a){return k.debug(`resolveModelById: pi-ai lookup miss, using provider fallback`,{providerId:n,modelId:e,error:a instanceof Error?a.message:String(a)}),ht(n,i,e,r,t!==void 0)}}function gt(e,t){return e.provider===t||e.provider===G(t,T(t))}function q(){let e=U(),t=H(),n=V(e),r=D(e),i=T(e),a=i.defaultModelId?r.find(e=>e.id.toLowerCase().includes(i.defaultModelId.toLowerCase()))?.id:void 0,o=t||a||r[0]?.id||`claude-sonnet-4-6`;try{let t=G(e,i),a=_(t,o);if(!a?.id)throw Error(`Model ${o} not found in ${t} registry`);let s=a;return i.isOAuth?s=r.find(e=>e.id===o)||{...s,api:`${e}-anthropic`,provider:e}:e===`bedrock-camp`&&(s={...s,api:`bedrock-camp-converse`,provider:`bedrock-camp`}),n&&(s={...s,baseUrl:n}),s}catch(t){k.debug(`resolveCurrentModel: pi-ai lookup miss, using provider fallback`,{providerId:e,effectiveModelId:o,error:t instanceof Error?t.message:String(t)});let a=r.find(e=>e.id===o);return a?n?{...a,baseUrl:n}:a:i.isOAuth?W(e,o,n):_(`anthropic`,`claude-sonnet-4-0`)}}function _t(e){let t=e.toLowerCase();if(!t)return null;let n=null;try{n=U()}catch{}if(n!==null){let e=J(t,[n]);if(e!==null)return e}return J(t,M().map(e=>e.providerId))}function J(e,t){let n=null,r=-1;for(let i of t)for(let t of D(i)){let i=t.id.toLowerCase(),a=(t.name??``).toLowerCase();if(!i.includes(e)&&!a.includes(e))continue;let o=t.contextWindow??0;(o>r||o===r&&Tt(t.id,n??``)>0)&&(r=o,n=t.id)}return n}function Y(){let e=[];try{for(let t of M())e.includes(t.providerId)||e.push(t.providerId)}catch{}try{let t=U();e.includes(t)||e.push(t)}catch{}return e}function vt(e){let t=e.indexOf(`:`);if(t<=0||t===e.length-1)return null;let n=e.slice(0,t),r=e.slice(t+1),i=Y().includes(n);if(i)return{providerId:n,modelId:r,configured:i};let a=!1;try{a=C().includes(n)}catch{}return a?{providerId:n,modelId:r,configured:!1}:null}function X(e,t,n=!0){let r=[e],i=n?J(e.toLowerCase(),[t]):null;i!==null&&i!==e&&r.push(i);let a=[];try{a=D(t)}catch{}for(let n of r)if(!(a.length>0&&!a.some(e=>e.id===n)))try{if(K(n,t).id===n)return{modelId:n,providerId:t}}catch(r){k.debug(`selectModelFromProvider: candidate did not resolve`,{input:e,candidate:n,providerId:t,error:r instanceof Error?r.message:String(r)})}return null}function yt(e){return e.map(e=>`${e.providerId}:${e.modelId}`).join(`, `)}function Z(e){if(!e)return{ok:!1,error:`unknown model: (empty)`};let t=vt(e);if(t)return St(e,t);let n=null;try{n=U()}catch{}if(n!==null){let t=X(e,n);if(t)return $(t)}return Ct(e,n)}function Q(){try{return U()}catch{return null}}function bt(e){let t=Q();return t===null||ge(g(),t,e.providerId,e.modelId)}function xt(e){let t=Q()??`<none>`;return{ok:!1,error:`model not allowed: ${`${e.providerId}:${e.modelId}`} is blocked by ${p} while "${t}" is selected — ${ye(t,e.providerId,e.modelId)}`}}function $(e){return bt(e)?{ok:!0,selection:e}:xt(e)}function St(e,t){if(!t.configured){let n=Y();return{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" is not configured${n.length>0?`; configured: ${n.join(`, `)}`:``})`}}let n=X(t.modelId,t.providerId);return n?$(n):{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" does not offer "${t.modelId}")`}}function Ct(e,t){let n=Y().filter(e=>e!==t);for(let t of[`exact`,`shorthand`]){let r=[];for(let i of n){let n=t===`exact`?e:J(e.toLowerCase(),[i]);if(n===null)continue;let a=X(n,i,!1);a&&r.push(a)}let i=r.filter(bt);if(i.length===0&&r.length>0)return xt(r[0]);if(i.length===1)return{ok:!0,selection:i[0]};if(i.length>1)return{ok:!1,error:`ambiguous model: ${e} matches ${yt(i)} — qualify it as provider:model`}}return{ok:!1,error:`unknown model: ${e}`}}function wt(e){let t=Z(e);return t.ok?t.selection.modelId:null}function Tt(e,t){let n=e.match(/\d+/g)?.map(Number)??[],r=t.match(/\d+/g)?.map(Number)??[],i=Math.max(n.length,r.length);for(let e=0;e<i;e++){let t=(n[e]??0)-(r[e]??0);if(t!==0)return t}return 0}export{ue as S,Ze as _,B as a,pe as b,Qe as c,H as d,U as f,Z as g,K as h,it as i,O as l,q as m,Ye as n,$e as o,gt as p,M as r,V as s,be as t,D as u,p as v,ve as x,m as y};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/oauth-service-C2D9b8uV.js","assets/preload-helper-Czpn1I53.js","assets/proxied-fetch-W1rZTqEQ.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/base64-ELzoYfwP.js","assets/fetch-body-1l9I58Vk.js","assets/api-endpoint-DuEQRZ4g.js","assets/runtime-env-Dlaokqg1.js","assets/panel-rpc-B3MSVImO.js","assets/permissions-surface-registry-CilCRwhh.js"])))=>i.map(i=>d[i]);
2
+ import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import"./core-zz8rWM4c.js";import{t}from"./preload-helper-Czpn1I53.js";import{i as n,n as r,r as i}from"./compat-qQM4gjF_.js";import{t as a}from"./logger-DDBAeTLF.js";import"./proxied-fetch-W1rZTqEQ.js";import{s as o,t as s}from"./api-endpoint-DuEQRZ4g.js";import{n as c}from"./float-topology-U8FF9pgZ.js";import"./secret-topology-fyLSbV8r.js";import{n as l}from"./secrets-bridge-client-9RRVsrGm.js";import{n as ee,o as te,t as u}from"./providers-BFl9psp8.js";import{n as ne,t as re}from"./panel-rpc-B3MSVImO.js";import{i as ie,r as ae,t as oe}from"./bedrock-camp-compat-BeCSBUrZ.js";import{r as se,t as ce}from"./bedrock-camp-extra-models-WTCIjj5a.js";import{o as le}from"./claude-model-version-DZmbk9E2.js";var ue=`slicc_oauth_extra_domains`;function d(e){try{let t=e.getItem(ue);if(!t)return{};let n=JSON.parse(t);if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n)){if(typeof e!=`string`||!Array.isArray(t))continue;let n=t.filter(e=>typeof e==`string`&&e.length>0);n.length>0&&(r[e]=n)}return r}catch{return{}}}function f(e,t){try{e.setItem(ue,JSON.stringify(t))}catch(e){throw Error(`Failed to persist OAuth extras (localStorage quota exceeded?): ${e instanceof Error?e.message:String(e)}`)}}function de(e,t){let n={input:0,output:0,cacheRead:0,cacheWrite:0},r=le(e);if(!r)return n;let i;for(let e of t.values()){let t=le(e.id);!t||t.family!==r.family||(!i||t.major>i.major||t.major===i.major&&t.minor>i.minor)&&(i={major:t.major,minor:t.minor,cost:e.cost})}return i?.cost??n}a(`model-policy`);var fe=`/etc/models`;function pe(){return{sections:{}}}function p(e,t,n){return e.providerId===t?e.modelId===`*`||e.modelId===n:!1}function me(e,t){return e.sections[t]??[]}function he(e,t,n,r){return me(e,t).some(e=>e.deny&&p(e,n,r))}function ge(e,t,n,r){let i=me(e,t);return i.some(e=>e.deny&&p(e,n,r))?!1:n===t||i.some(e=>!e.deny&&p(e,n,r))}var _e=pe();function ve(){return _e}function ye(e,t,n){return`add \`${t}:${n}\` (or \`${t}:*\`) under \`[${e}]\` in ${fe}`}var be=e({ACCOUNTS_KEY:()=>g,__test__:()=>Te,addAccount:()=>P,applyProviderDefaults:()=>ke,clearAllSettings:()=>ct,clearApiKey:()=>rt,clearBaseUrl:()=>ot,clearSelectedProvider:()=>et,ensureOAuthMaskReplica:()=>Ge,exportProviders:()=>st,getAccounts:()=>A,getAllAvailableModels:()=>k,getAllExtraOAuthDomains:()=>Pe,getAlternativeModelProviders:()=>Me,getApiKey:()=>tt,getApiKeyForProvider:()=>V,getApiVersionForProvider:()=>Xe,getAvailableProviders:()=>x,getBaseUrl:()=>it,getBaseUrlForProvider:()=>H,getDeploymentForProvider:()=>Ye,getExtraOAuthDomains:()=>j,getOAuthAccountInfo:()=>De,getProviderConfig:()=>C,getProviderModels:()=>T,getRawApiKeyForProvider:()=>B,getSelectedModelId:()=>U,getSelectedProvider:()=>W,isModelHiddenFromPicker:()=>D,isUsableOAuthMaskReplica:()=>R,logoutOAuthAccount:()=>I,maskOAuthTokenWithRetry:()=>L,migrateLegacyAuthOnlySelection:()=>b,modelRunsOnProvider:()=>pt,persistOAuthMaskViaServiceWorker:()=>z,policyVisible:()=>O,providerOffersLlmModels:()=>S,removeAccount:()=>F,resolveCurrentModel:()=>J,resolveModelById:()=>q,resolveModelByShorthand:()=>mt,resolveModelIdForScoop:()=>St,resolveModelSelectionForScoop:()=>Q,saveOAuthAccount:()=>qe,setApiKey:()=>nt,setBaseUrl:()=>at,setExtraOAuthDomains:()=>M,setExtraOAuthDomainsAsync:()=>Ne,setSelectedModelId:()=>Ze,setSelectedProvider:()=>$e}),m=r,h=i,g=`slicc_accounts`,_=`selected-model`,xe=[`slicc_provider`,`slicc_api_key`,`slicc_base_url`,`anthropic_api_key`,`api_provider`,`azure_resource`,`bedrock_region`],Se=new Set([`github`]);function v(e){let t;try{t=n()}catch{return!1}return t.includes(e)&&!te(e)}var y=!1;function Ce(){if(!y){y=!0;for(let e of xe)try{localStorage.removeItem(e)}catch{}b()}}function b(){try{let e=localStorage.getItem(_);if(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t);(Se.has(n)||v(n))&&localStorage.removeItem(_)}}}catch{}try{let e=localStorage.getItem(g);if(!e)return;let t=JSON.parse(e);if(!Array.isArray(t))return;let n=t.filter(e=>!(typeof e==`object`&&e&&typeof e.providerId==`string`&&v(e.providerId)));n.length!==t.length&&localStorage.setItem(g,JSON.stringify(n))}catch{}}function we(){y=!1}var Te={_resetLegacyCleanup:we};function x(){let e=n().filter(te),t=ee();return[...new Set([...e,...t])].filter(e=>!u(e)?.hidden)}function S(e){try{if(T(e).length>0)return!0}catch{}try{if(i(e).length>0)return!0}catch{}let t=u(e);return!!(t?.modelOverrides&&Object.keys(t.modelOverrides).length>0)}function Ee(e,t){try{if(T(e).some(e=>e.id===t))return!0}catch{}try{if(i(e).some(e=>e.id===t))return!0}catch{}let n=u(e);return!!(n?.modelOverrides&&Object.hasOwn(n.modelOverrides,t))}function C(e){return u(e)||{id:e,name:e.split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),description:`${e} provider`,requiresApiKey:!0,requiresBaseUrl:!1}}function w(e,t){t.context_window!==void 0&&(e.contextWindow=t.context_window),t.max_tokens!==void 0&&(e.maxTokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),t.cost!==void 0&&(e.cost=t.cost,e.inputCost=t.cost.input,e.outputCost=t.cost.output,e.cacheReadCost=t.cost.cacheRead,e.cacheWriteCost=t.cost.cacheWrite),t.compat!==void 0&&(e.compat={...e.compat??{},...t.compat}),t.thinkingLevelMap!==void 0&&(e.thinkingLevelMap={...e.thinkingLevelMap??{},...t.thinkingLevelMap})}function T(e){try{if(e===`bedrock-camp`){let e=oe(H(`bedrock-camp`));return se(h(`amazon-bedrock`),ce).filter(t=>ie(t,e)).map(e=>({...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`,reasoning:e.reasoning===!0&&ae(e)}))}let t=C(e);if(t.getModelIds){let r;try{r=t.getModelIds()}catch(t){return E.error(`Provider getModelIds callback failed`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}let i=new Map;for(let e of n())try{for(let t of h(e))i.set(t.id,t)}catch{}return r.map(n=>{let r=n.api===`openai`?`openai`:`anthropic`,a=`${e}-${r}`,o=i.get(n.id),s;if(o)s={...o,api:a,provider:e};else if(s=G(e,n.id,``,a),n.name&&(s.name=n.name),r===`anthropic`){let e=de(n.id,i);s.cost=e,s.inputCost=e.input,s.outputCost=e.output,s.cacheReadCost=e.cacheRead,s.cacheWriteCost=e.cacheWrite}let c=t.modelOverrides?.[n.id];return c&&w(s,c),w(s,n),s})}if(t.isOAuth){let n=h(`anthropic`),r=`${e}-anthropic`;return n.map(n=>{let i={...n,api:r,provider:e},a=t.modelOverrides?.[n.id];return a&&w(i,a),i})}return h(e===`azure-ai-foundry`?`anthropic`:e)}catch(t){return E.error(`Failed to load models`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}}function De(e){let t=A().find(t=>t.providerId===e);if(!t?.accessToken)return null;let n=!!t.tokenExpiresAt&&Date.now()>t.tokenExpiresAt-6e4;return{token:t.accessToken,maskedValue:t.maskedValue,expiresAt:t.tokenExpiresAt,userName:t.userName,userAvatar:t.userAvatar,scopes:t.scopes,expired:n}}var Oe=Object.assign({})[`/packages/webapp/providers.json`]??[],E=a(`provider-settings`);function ke(e=Oe){if(e.length===0||A().length>0)return;let t=new Set(x());for(let n of e)if(!(!n.providerId||!n.apiKey)){if(!t.has(n.providerId)){E.warn(`Unknown provider "${n.providerId}" in providers.json — skipping`);continue}P(n.providerId,n.apiKey,n.baseUrl)}let n=e.find(e=>e.providerId&&e.apiKey&&t.has(e.providerId));n?.model&&!localStorage.getItem(_)&&localStorage.setItem(_,`${n.providerId}:${n.model}`)}var Ae=[/haiku/i];function D(e){return Ae.some(t=>t.test(e))}function je(e){return e.filter(e=>!D(e.id))}function O(e,t){let n=$();if(n===null)return e;let r=ve();return e.filter(e=>!he(r,n,t,e.id))}function k(){let e=A();if(e.length===0)return[];let t=new Map;for(let n of e){if(t.has(n.providerId))continue;let e=C(n.providerId);if(e.hidden||v(n.providerId))continue;let r=O(je(T(n.providerId)),n.providerId);if(r.length===0)continue;let i={providerId:n.providerId,providerName:e.name,models:r};t.set(n.providerId,i)}return[...t.values()]}function Me(e){return k().map(e=>e.providerId).filter(t=>t!==e)}function A(){Ce();let e=localStorage.getItem(g);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`object`&&!!e&&typeof e.providerId==`string`&&typeof e.apiKey==`string`):[]}catch{return[]}}function j(e){return d(localStorage)[e]??[]}function M(e,t){let n=d(localStorage),r=t.map(e=>e.trim()).filter(e=>e.length>0);r.length===0?delete n[e]:n[e]=r,f(localStorage,n)}async function Ne(e,t){if(ne()){M(e,t);return}let n=re();if(!n)throw Error(`setExtraOAuthDomainsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let{storeAfter:r}=await n.call(`oauth-extras-set`,{providerId:e,domains:t});try{f(localStorage,r)}catch(t){E.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{providerId:e,error:t instanceof Error?t.message:String(t)})}}function Pe(){return d(localStorage)}function Fe(e){localStorage.setItem(g,JSON.stringify(e))}async function N(e){if(ne()){Fe(e);return}let t=re();if(!t)throw Error(`saveAccountsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let n=JSON.stringify(e),{storedJson:r}=await t.call(`save-oauth-accounts`,{accountsJson:n});try{localStorage.setItem(g,r)}catch(e){E.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{error:e instanceof Error?e.message:String(e)})}}function P(e,t,n,r,i){let a=A().filter(t=>t.providerId!==e),o={providerId:e,apiKey:t};n&&(o.baseUrl=n),r&&(o.deployment=r),i&&(o.apiVersion=i),a.push(o),Fe(a)}async function Ie(e){let t=c();try{if(t===`extension-direct`){let t=await new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.delete`,name:`oauth.${e}.token`},n=>{chrome.runtime.lastError&&E.error(`SW secrets.delete transport failed`,{providerId:e,error:chrome.runtime.lastError.message}),t(n??{})})});t.error&&E.error(`SW secrets.delete returned error`,{providerId:e,error:t.error})}else if(t===`extension-delegate`){let t=await l(`secrets.delete`,{name:`oauth.${e}.token`});t?.error&&E.error(`Bridge secrets.delete returned error`,{providerId:e,error:t.error})}else if(t!==`connect`){let t=await fetch(o(`/api/secrets/oauth/${e}`),{method:`DELETE`,headers:s()});!t.ok&&t.status!==404&&E.warn(`OAuth replica DELETE non-ok`,{providerId:e,status:t.status})}}catch(n){E.error(`OAuth replica removal failed`,{providerId:e,topology:t,error:n instanceof Error?n.message:String(n)})}}async function F(e){let t=A().find(t=>t.providerId===e),n=C(e);t&&n?.isOAuth&&await I(e),await Ie(e),await N(A().filter(t=>t.providerId!==e));let r=localStorage.getItem(_)??``,i=r.indexOf(`:`);i>0&&r.slice(0,i)===e&&localStorage.removeItem(_)}async function I(e){let n=A().find(t=>t.providerId===e);if(!n)return;let r=C(e);if(r?.isOAuth){if(r.onOAuthLogout)try{await r.onOAuthLogout()}catch(t){E.warn(`onOAuthLogout failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})}if(r.getOAuthLogoutUrl){let i=r.getOAuthLogoutUrl(n);if(i){let{openIdpLogoutUrl:n}=await t(async()=>{let{openIdpLogoutUrl:e}=await import(`./oauth-service-C2D9b8uV.js`);return{openIdpLogoutUrl:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]));await n(i).catch(t=>{E.warn(`IdP logout popup failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})})}}await N(A().map(t=>t.providerId===e?{providerId:t.providerId,apiKey:``,baseUrl:t.baseUrl,userName:t.userName,userAvatar:t.userAvatar,loggedOut:!0}:t)),await Ie(e)}}async function L(e,t={}){let n=Math.max(1,t.attempts??3),r=t.delayMs??150,i=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),a;for(let t=0;t<n;t++){let o=await e();if(o.maskedValue)return{maskedValue:o.maskedValue};o.error&&(a=o.error),t<n-1&&await i(r)}return{lastError:a}}var Le=`access token rotated during mask write`;function Re(e,t,n,r){let i=r.find(t=>t.providerId===e);return i?.accessToken?i.accessToken===t?(i.maskedValue=n,{maskedValue:n}):(E.warn(`OAuth mask write raced with token rotation; discarding replica`,{providerId:e}),{error:Le}):{error:`account gone after mask write`}}function R(e,t){return!!e&&e!==t}async function z(e,t,n){let r={providerId:e.providerId,accessToken:e.accessToken,domains:e.domains.join(`,`)},{maskedValue:i,lastError:a}=await L(()=>t.sendMaskRequest(r),n);if(!R(i,e.accessToken)){let t=i?`mask replica equals the access token`:a??`no error reported (cold SW or empty reply)`;return E.error(`OAuth mask give-up: no masked value after retries`,{providerId:e.providerId,reason:t}),{error:t}}let o=t.getAccounts(),s=Re(e.providerId,e.accessToken,i,o);return s.maskedValue&&await t.saveAccounts(o),s}function ze(e){let t=C(e).oauthTokenDomains??[],n=j(e),r=new Set,i=[];for(let e of[...t,...n]){let t=e.toLowerCase();r.has(t)||(r.add(t),i.push(e))}return i}function Be(e){return new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.mask-oauth-token`,...e},n=>{chrome.runtime.lastError&&E.error(`SW mask-oauth-token transport failed`,{providerId:e.providerId,error:chrome.runtime.lastError.message});let r=typeof n==`object`&&n?n:void 0;r?.error&&E.warn(`SW mask-oauth-token returned error`,{providerId:e.providerId,error:r.error}),t(r??{})})})}function Ve(e){return l(`secrets.mask-oauth-token`,e).then(t=>(t?.error&&E.warn(`Bridge mask-oauth-token returned error`,{providerId:e.providerId,error:t.error}),t??{})).catch(t=>(E.error(`Bridge mask-oauth-token transport failed`,{providerId:e.providerId,error:t instanceof Error?t.message:String(t)}),{}))}async function He(e,t,n){let r=o(`/api/secrets/oauth-update`),i=await fetch(r,{method:`POST`,headers:s({"Content-Type":`application/json`}),body:JSON.stringify({providerId:e,accessToken:t,domains:n})});if(!i.ok)return E.warn(`OAuth replica POST non-ok`,{providerId:e,status:i.status,url:r}),{error:`OAuth replica POST HTTP ${i.status}`};let a=await i.json();if(typeof a.maskedValue!=`string`)return E.warn(`OAuth replica POST ok but missing maskedValue`,{providerId:e,url:r}),{error:`OAuth replica POST ok but missing maskedValue`};if(!R(a.maskedValue,t))return E.error(`OAuth mask replica equals the access token; refusing to persist`,{providerId:e}),{error:`mask replica equals the access token`};let c=A(),l=Re(e,t,a.maskedValue,c);return l.maskedValue&&await N(c),l}async function Ue(e,t){let n=await We(e,t);if(n.error!==Le)return n;let r=A().find(t=>t.providerId===e)?.accessToken;return!r||r===t?n:We(e,r)}async function We(e,t){let n=ze(e);if(n.length===0)return{error:`no oauth token domains configured`};let r=c();try{return r===`extension-direct`?z({providerId:e,accessToken:t,domains:n},{sendMaskRequest:Be,getAccounts:A,saveAccounts:N}):r===`extension-delegate`?z({providerId:e,accessToken:t,domains:n},{sendMaskRequest:Ve,getAccounts:A,saveAccounts:N}):r===`connect`?{error:`no replica store in connect mode`}:await He(e,t,n)}catch(t){let n=t instanceof Error?t.message:String(t);return E.error(`OAuth replica sync failed`,{providerId:e,topology:r,error:n}),{error:n}}}async function Ge(e){let t=A().find(t=>t.providerId===e);return t?.accessToken?R(t.maskedValue,t.accessToken)?{maskedValue:t.maskedValue}:Ue(e,t.accessToken):{error:`no access token held`}}function Ke(e,t){if(e.accessToken)return`scopes`in e?e.scopes:t?.scopes}async function qe(e){let t=A().find(t=>t.providerId===e.providerId),n=A().filter(t=>t.providerId!==e.providerId);n.push({providerId:e.providerId,apiKey:``,accessToken:e.accessToken,refreshToken:e.refreshToken,tokenExpiresAt:e.tokenExpiresAt,userName:e.userName,userAvatar:e.userAvatar,baseUrl:e.baseUrl??t?.baseUrl,scopes:Ke(e,t)}),await N(n),await Ue(e.providerId,e.accessToken)}var Je=`local`;function B(e){let t=A().find(t=>t.providerId===e);return t&&(t.accessToken||t.apiKey)||null}function V(e){let t=A().find(t=>t.providerId===e);return t?t.accessToken||t.apiKey||(C(e).optionalApiKey?Je:null):null}function H(e){return A().find(t=>t.providerId===e)?.baseUrl??null}function Ye(e){return A().find(t=>t.providerId===e)?.deployment??null}function Xe(e){return A().find(t=>t.providerId===e)?.apiVersion??null}function U(){let e=localStorage.getItem(_)||``,t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function Ze(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t),r=new Set([...ee(),...x()]),i=n.includes(`.`);if(r.has(n)||!i){localStorage.setItem(_,e);return}}let n=W();localStorage.setItem(_,`${n}:${e}`)}function Qe(){return localStorage.getItem(_)||``}function W(){let e=Qe(),t=e.indexOf(`:`);if(t>0)return e.slice(0,t);let n=A(),r=U();if(r){let e=n.find(e=>S(e.providerId)&&Ee(e.providerId,r));if(e)return e.providerId}let i=n.find(e=>S(e.providerId));return i?i.providerId:n.length>0?n[0].providerId:`anthropic`}function $e(e){let t=U();localStorage.setItem(_,`${e}:${t}`)}function et(){let e=U();localStorage.setItem(_,e)}function tt(){return V(W())}function nt(e){let t=W();P(t,e,H(t)??void 0)}async function rt(){await F(W())}function it(){return H(W())}function at(e){let t=W(),n=B(t);n&&P(t,n,e||void 0)}function ot(){let e=W(),t=B(e);t&&P(e,t)}function st(){let e=A(),t=W(),n=U();return e.map(e=>{let r={providerId:e.providerId,apiKey:e.apiKey};return e.baseUrl&&(r.baseUrl=e.baseUrl),e.providerId===t&&n&&(r.model=n),r})}async function ct(){let e=A();await Promise.allSettled(e.map(e=>F(e.providerId))),localStorage.removeItem(g),localStorage.removeItem(_);for(let e of xe)localStorage.removeItem(e)}function lt(e){return/^(?:gpt[-.]?|o[0-9]|chatgpt)/i.test(e)?`openai`:`anthropic`}function G(e,t,n,r){return{id:t,name:t,provider:e,api:r??`${e}-${lt(t)}`,baseUrl:n??``,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},reasoning:!0}}function K(e,t){return t.isOAuth||e===`azure-ai-foundry`?`anthropic`:e===`bedrock-camp`?`amazon-bedrock`:e}function ut(e,t,n){let r=T(e).find(e=>e.id===t);return r?n?{...r,baseUrl:n}:r:null}function dt(e,t,n,r){return n.isOAuth?T(t).find(e=>e.id===r)||{...e,api:`${t}-anthropic`,provider:t}:t===`bedrock-camp`?{...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`}:e}function ft(e,t,n,r,i){let a=ut(e,n,r);if(a)return a;if(t.isOAuth)return G(e,n,r);if(i)throw Error(`Model ${n} is not available from provider ${e}`);return J()}function q(e,t){if(!e)return J();let n=t??W(),r=H(n),i=C(n);if(t!==void 0){let t=ut(n,e,r);if(t)return t}try{let t=m(K(n,i),e);if(!t?.id)throw Error(`Model ${e} not found`);let a=dt(t,n,i,e);return r?{...a,baseUrl:r}:a}catch(a){return E.debug(`resolveModelById: pi-ai lookup miss, using provider fallback`,{providerId:n,modelId:e,error:a instanceof Error?a.message:String(a)}),ft(n,i,e,r,t!==void 0)}}function pt(e,t){return e.provider===t||e.provider===K(t,C(t))}function J(){let e=W(),t=U(),n=H(e),r=T(e),i=C(e),a=i.defaultModelId?r.find(e=>e.id.toLowerCase().includes(i.defaultModelId.toLowerCase()))?.id:void 0,o=t||a||r[0]?.id||`claude-sonnet-4-6`;try{let t=K(e,i),a=m(t,o);if(!a?.id)throw Error(`Model ${o} not found in ${t} registry`);let s=a;return i.isOAuth?s=r.find(e=>e.id===o)||{...s,api:`${e}-anthropic`,provider:e}:e===`bedrock-camp`&&(s={...s,api:`bedrock-camp-converse`,provider:`bedrock-camp`}),n&&(s={...s,baseUrl:n}),s}catch(t){E.debug(`resolveCurrentModel: pi-ai lookup miss, using provider fallback`,{providerId:e,effectiveModelId:o,error:t instanceof Error?t.message:String(t)});let a=r.find(e=>e.id===o);return a?n?{...a,baseUrl:n}:a:i.isOAuth?G(e,o,n):m(`anthropic`,`claude-sonnet-4-0`)}}function mt(e){let t=e.toLowerCase();if(!t)return null;let n=null;try{n=W()}catch{}if(n!==null){let e=Y(t,[n]);if(e!==null)return e}return Y(t,A().map(e=>e.providerId))}function Y(e,t){let n=null,r=-1;for(let i of t)for(let t of T(i)){let i=t.id.toLowerCase(),a=(t.name??``).toLowerCase();if(!i.includes(e)&&!a.includes(e))continue;let o=t.contextWindow??0;(o>r||o===r&&Ct(t.id,n??``)>0)&&(r=o,n=t.id)}return n}function X(){let e=[];try{for(let t of A())e.includes(t.providerId)||e.push(t.providerId)}catch{}try{let t=W();e.includes(t)||e.push(t)}catch{}return e}function ht(e){let t=e.indexOf(`:`);if(t<=0||t===e.length-1)return null;let n=e.slice(0,t),r=e.slice(t+1),i=X().includes(n);if(i)return{providerId:n,modelId:r,configured:i};let a=!1;try{a=x().includes(n)}catch{}return a?{providerId:n,modelId:r,configured:!1}:null}function Z(e,t,n=!0){let r=[e],i=n?Y(e.toLowerCase(),[t]):null;i!==null&&i!==e&&r.push(i);let a=[];try{a=T(t)}catch{}for(let n of r)if(!(a.length>0&&!a.some(e=>e.id===n)))try{if(q(n,t).id===n)return{modelId:n,providerId:t}}catch(r){E.debug(`selectModelFromProvider: candidate did not resolve`,{input:e,candidate:n,providerId:t,error:r instanceof Error?r.message:String(r)})}return null}function gt(e){return e.map(e=>`${e.providerId}:${e.modelId}`).join(`, `)}function Q(e){if(!e)return{ok:!1,error:`unknown model: (empty)`};let t=ht(e);if(t)return bt(e,t);let n=null;try{n=W()}catch{}if(n!==null){let t=Z(e,n);if(t)return yt(t)}return xt(e,n)}function $(){try{return W()}catch{return null}}function _t(e){let t=$();return t===null||ge(ve(),t,e.providerId,e.modelId)}function vt(e){let t=$()??`<none>`;return{ok:!1,error:`model not allowed: ${`${e.providerId}:${e.modelId}`} is blocked by ${fe} while "${t}" is selected — ${ye(t,e.providerId,e.modelId)}`}}function yt(e){return _t(e)?{ok:!0,selection:e}:vt(e)}function bt(e,t){if(!t.configured){let n=X();return{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" is not configured${n.length>0?`; configured: ${n.join(`, `)}`:``})`}}let n=Z(t.modelId,t.providerId);return n?yt(n):{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" does not offer "${t.modelId}")`}}function xt(e,t){let n=X().filter(e=>e!==t);for(let t of[`exact`,`shorthand`]){let r=[];for(let i of n){let n=t===`exact`?e:Y(e.toLowerCase(),[i]);if(n===null)continue;let a=Z(n,i,!1);a&&r.push(a)}let i=r.filter(_t);if(i.length===0&&r.length>0)return vt(r[0]);if(i.length===1)return{ok:!0,selection:i[0]};if(i.length>1)return{ok:!1,error:`ambiguous model: ${e} matches ${gt(i)} — qualify it as provider:model`}}return{ok:!1,error:`unknown model: ${e}`}}function St(e){let t=Q(e);return t.ok?t.selection.modelId:null}function Ct(e,t){let n=e.match(/\d+/g)?.map(Number)??[],r=t.match(/\d+/g)?.map(Number)??[],i=Math.max(n.length,r.length);for(let e=0;e<i;e++){let t=(n[e]??0)-(r[e]??0);if(t!==0)return t}return 0}export{D as A,J as B,j as C,B as D,T as E,pt as F,qe as G,mt as H,z as I,M as J,nt as K,O as L,I as M,L as N,U as O,b as P,de as Q,S as R,Ye as S,C as T,St as U,q as V,Q as W,Ze as X,Ne as Y,$e as Z,V as _,ke as a,it as b,ot as c,st as d,A as f,tt as g,Me as h,P as i,R as j,W as k,et as l,Pe as m,Te as n,ct as o,k as p,at as q,be as r,rt as s,g as t,Ge as u,Xe as v,De as w,H as x,x as y,F as z};
@@ -1 +1 @@
1
- import{S as e,_ as t,r as n,s as r}from"./account-store-LwLxI7v1.js";import{n as i}from"./panel-rpc-DVS1uJpt.js";import{a}from"./diagnostics-DN_idNHx.js";import{a as o,i as s,r as c}from"./compat-uEPf6-XW.js";import{a as l,r as u,s as d,t as f}from"./legacy-api-aliases-jKEvBgOL.js";import{a as p,i as m,r as h}from"./claude-model-version-ceOteQ2f.js";import{r as g}from"./provider-budget-DbHWq3j6.js";import{n as _}from"./llm-session-id-BZyXP_j2.js";import{v}from"./kernel-worker-B23YxkDH.js";import{n as y,t as ee}from"./silent-renew-backoff-Dmz3DJHb.js";import{getOAuthPageOrigin as te}from"./oauth-service-Gh6Z-BhZ.js";import{n as b}from"./temperature-support-PjwXIa-F.js";import"./provider-settings-BLtjMrT0.js";var ne={proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`};function re(e,t){return h(e,t)}function x(e,t,n){return e!==`xhigh`||!t?e:p(t,n)?`xhigh`:m(t,n)?`max`:`high`}function ie(e,t){let n=e?t?.thinkingLevelMap?.[e]:void 0;return x((()=>{if(typeof n==`string`)return n;switch(e){case`minimal`:case`low`:return`low`;case`medium`:return`medium`;case`xhigh`:return`xhigh`;default:return`high`}})(),t?.id,t?.name)}function ae(e,t){return async(n,r)=>{let i=t?await t(n,r)??n:n,a=i.thinking;return a&&a.type===`enabled`&&(i.thinking={type:`adaptive`,...a.display===void 0?{}:{display:a.display}},i.output_config={...i.output_config??{},effort:e}),i}}function S(e,t){if(!re(e.id,e.name))return t;let n=t,r=x(n.effort??ie(n.reasoning,e),e.id,e.name);return{...t,onPayload:ae(r,n.onPayload)}}function oe(e,t){let n={id:e.id,name:e.name??e.id},r=t?.api??e.api,i=t?.context_window??e.context_window,a=t?.max_tokens??e.max_tokens,o=t?.reasoning??e.reasoning,s=t?.input??e.input;r&&(n.api=r),i!==void 0&&(n.context_window=i),a!==void 0&&(n.max_tokens=a),o!==void 0&&(n.reasoning=o),s&&(n.input=s);let c=t?.cost??e.cost;return c&&(n.cost=c),/haiku/i.test(e.id)&&(n.compat={supportsEagerToolInputStreaming:!1}),/sonnet-5\b/i.test(e.id)&&!n.thinkingLevelMap&&(n.thinkingLevelMap={xhigh:`xhigh`}),n}async function se(e,t,n,r={}){let i=typeof AbortController==`function`?new AbortController:null,a=i?setTimeout(()=>i.abort(),r.timeoutMs??8e3):null;try{let a=await n(`${e.replace(/\/$/,``)}/v1/usage`,{headers:{...r.headers,Authorization:`Bearer ${t}`},...i?{signal:i.signal}:{}});if(a.status===404||a.status===501)return null;if(!a.ok)throw Error(`Adobe /v1/usage returned ${a.status}`);return g(await a.json())}finally{a&&clearTimeout(a)}}const C=Object.assign({"/packages/webapp/providers/adobe-config.json":ne})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function w(){let e=r(`adobe`);if(e)return e.replace(/\/$/,``);if(C.proxyEndpoint)return C.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}const T=new Map,ce=new Map,le=`slicc-adobe-models`;function E(e){try{localStorage.setItem(le,JSON.stringify(e))}catch{}}async function D(e){try{let t=await fetch(`${e}/v1/config`,{headers:{[W]:`6.178.2`}});return t.ok?await t.json():(console.warn(`[adobe] Proxy /v1/config returned ${t.status}`),null)}catch(e){return console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e)),null}}async function O(e){let t=T.get(e);if(t)return t;let n=await D(e);return n||=(await new Promise(e=>setTimeout(e,600)),await D(e)),n?(T.set(e,n),n):{}}function k(e){let t=e.clientId||C.clientId;if(!t)throw Error(`Could not determine IMS client ID — proxy /v1/config did not return one and adobe-config.json is empty`);return t}function A(e){return e.scopes||C.scopes}function j(e){return e.imsEnvironment||C.imsEnvironment||`prod`}const M={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function N(e){return M[e??C.imsEnvironment??`prod`]??M.prod}async function P(){let e;try{e=w()}catch{return{}}return T.get(e)||new Promise(t=>{let n=setTimeout(()=>t({}),5e3),r=e=>{clearTimeout(n),t(e)};O(e).then(r,()=>r({}))})}function F(e){try{let t=e.split(`.`)[1];if(!t)return;let n=t.replace(/-/g,`+`).replace(/_/g,`/`),r=atob(n+`=`.repeat((4-n.length%4)%4)),i=JSON.parse(r);return typeof i.client_id==`string`?i.client_id:void 0}catch{return}}const I=typeof chrome<`u`&&!!chrome?.runtime?.id;function L(){return n().find(e=>e.providerId===`adobe`)}const ue=[`/ims/profile/v1`,`/ims/userinfo/v2`];async function de(e,t){try{let n=await fetch(e,{headers:{Authorization:`Bearer ${t}`}});if(!n.ok){console.warn(`[adobe] Profile fetch ${e} returned ${n.status}`);return}let r=await n.json(),i=r.displayName||r.name||r.email;return i?{name:i,avatar:r.picture||r.avatar_url}:void 0}catch(t){console.warn(`[adobe] Profile fetch ${e} failed:`,t instanceof Error?t.message:String(t));return}}async function fe(e,t){for(let n of ue){let r=await de(`${N(t)}${n}`,e);if(r)return r}return console.warn(`[adobe] No IMS profile endpoint named the user; account will have no display name`),{}}async function pe(){let e=L(),t=e?.accessToken;if(!t)return{status:`unknown`,detail:`no stored token`};let n=await P(),r=F(t)||n.clientId||C.clientId||``;if(!r)return{status:`unknown`,detail:`no IMS client ID available`};let i=N(j(n));try{let n=await fetch(`${i}/ims/validate_token/v1`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:r,token:t,type:`access_token`}),signal:AbortSignal.timeout(1e4)});if(!n.ok)return{status:`unknown`,detail:`HTTP ${n.status}${n.statusText?` ${n.statusText}`:``}`};let a=await n.json();return a.valid===!0?{status:`accepted`,userName:e?.userName}:a.valid===!1?{status:`rejected`,detail:`IMS reported the token invalid (${typeof a.reason==`string`?a.reason:`no reason given`})`}:{status:`unknown`,detail:"IMS answered 200 without a boolean `valid` verdict"}}catch(e){return{status:`unknown`,detail:e instanceof Error?e.message:String(e)}}}function R(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10),scope:n.get(`scope`)??void 0}:null}const z={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!C.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`,`admin.hlx.page`,`admin.hlx.live`,`admin.aem.page`,`admin.aem.live`,`api.aem.live`],getBudgetUsage:he,getModelIds:()=>{let e=e=>oe(e,ce.get(e.id));for(let t of Q.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id,reasoning:t.reasoning,input:t.input,cost:t.cost}));return E(n),n}for(let t of T.values())if(t.models?.length)return t.models.map(t=>e(t));try{let e=localStorage.getItem(le);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,n,r)=>{let i=w(),a=await O(i),o=k(a),s=A(a),c=j(a),l=I?null:await te(),u=I?null:y({pageHref:l.href,pageOrigin:l.origin,configuredRedirectUri:C.redirectUri},()=>crypto.randomUUID()),d=I?C.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:u.redirectUri,f=u?.oauthState,p=u?.expectedNonce??null,m=new URLSearchParams({client_id:o,scope:s,response_type:`token`,redirect_uri:d});f&&m.set(`state`,f),r?.forceReauth&&m.set(`prompt`,`login`);let h=await e(`${N(c)}/ims/authorize/v2?${m}`);if(!h)return;if(p&&h)try{if(new URL(h).searchParams.get(`nonce`)!==p){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let g=R(h);if(!g){console.error(`[adobe] Could not extract token from redirect URL`);return}let _=await fe(g.accessToken,c);await t({providerId:`adobe`,accessToken:g.accessToken,tokenExpiresAt:Date.now()+g.expiresIn*1e3,userName:_.name,userAvatar:_.avatar,scopes:g.scope,baseUrl:C.proxyEndpoint?void 0:i}),v(),await $().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),n()},onOAuthLogout:async()=>{let e=L();if(e?.accessToken)try{let t=await P(),n=F(e.accessToken)||t.clientId||C.clientId,r=j(t);if(n){let t=await fetch(`${N(r)}/ims/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({token:e.accessToken,token_type_hint:`access_token`,client_id:n})});t.ok||console.warn(`[adobe] Token revocation returned ${t.status}, token may still be valid server-side`)}}catch(e){console.warn(`[adobe] Failed to revoke token:`,e instanceof Error?e.message:String(e))}await t({providerId:`adobe`,accessToken:``}),v()},onSilentRenew:async()=>L()?.accessToken?U():null,onValidateToken:pe,refreshModels:async e=>{await $(e);let t=z.getModelIds?.();t?.length&&E(t)}};let B=null;const me=ee();async function V(){let e=L();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);let t=await me.run(()=>U());if(t)return t;let n=L();if((n?.tokenExpiresAt??0)-Date.now()>0&&n?.accessToken)return n.accessToken;throw Error(`Adobe session expired — please log in again`)}async function he(){let e;try{e=w()}catch{return null}let t=L();if(!t?.accessToken||H())throw Error(`Adobe budget: not signed in`);return se(e,t.accessToken,fetch,{headers:{"X-Session-Id":_(be)}})}function H(){let e=L();return!e?.tokenExpiresAt||Date.now()>e.tokenExpiresAt-6e4}async function U(){if(typeof window>`u`){let e=i();if(!e)return null;try{let{accessToken:t}=await e.call(`silent-renew`,{providerId:`adobe`},{timeoutMs:13e4});return t}catch(e){return console.warn(`[adobe] worker→page silent-renew bridge failed:`,e instanceof Error?e.message:String(e)),null}}return B===null&&(B=ye().finally(()=>{B=null})),B}function ge(e,t){let n=k(t),r=A(t),i=j(t),a=I?null:y({pageHref:window.location.href,pageOrigin:window.location.origin,configuredRedirectUri:C.redirectUri},()=>crypto.randomUUID()),o=I?C.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:a.redirectUri,s=a?.oauthState,c=a?.expectedNonce??null,l=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:o,prompt:`none`});return s&&l.set(`state`,s),{authorizeUrl:`${N(i)}/ims/authorize/v2?${l}`,expectedNonce:c,proxyEndpoint:e}}function _e(e,t){if(!t)return!0;try{if(new URL(e).searchParams.get(`nonce`)!==t)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),!1}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}return!0}async function ve(e,n){let r=L();await t({providerId:`adobe`,accessToken:e.accessToken,tokenExpiresAt:Date.now()+e.expiresIn*1e3,userName:r?.userName,userAvatar:r?.userAvatar,scopes:e.scope,baseUrl:C.proxyEndpoint?void 0:n})}async function ye(){try{let e=w(),{authorizeUrl:t,expectedNonce:n}=ge(e,await O(e)),{createOAuthLauncher:r}=await import(`./oauth-service-Gh6Z-BhZ.js`),i=await r()(t,{interactive:!1});if(!i||!_e(i,n))return null;let a=R(i);return a?(await ve(a,e),console.log(`[adobe] Token renewed silently`),await $().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),a.accessToken):null}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}}const W=`X-Slicc-Version`;function G(e){let t={};if(e.headers)for(let[n,r]of Object.entries(e.headers))n.toLowerCase()!==`x-slicc-version`&&(t[n]=r);return t[W]=`6.178.2`,{...e,headers:t}}const be=`adobe-usage-probe`,K=new Set;function q(e,t){if(e.headers){for(let[t,n]of Object.entries(e.headers))if(t.toLowerCase()===`x-session-id`&&n!=null)return e}return K.has(t)||(K.add(t),console.warn(`[adobe] Missing X-Session-Id from ${t} — using daily fallback. Attach an X-Session-Id header at the call site (see scoop-context.ts streamWithSessionId or docs/pitfalls.md).`)),{...e,headers:{...e.headers??{},"X-Session-Id":_(`adobe-provider-fallback`)}}}function xe(){K.clear()}function J(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function Y(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e))}const X=(e,t,n={})=>{let r=a();return Se(r,e,t,n).catch(Y),r};async function Se(e,t,n,r){try{let i=await V();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${w()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=u(a,n,G(q({...r,apiKey:i},`streamAdobe[openai]`)));for await(let t of o)e.push(t)}else{let a={...t,baseUrl:w(),api:`anthropic-messages`},o=f(a,n,G(q(S(t,b(t.id,t.name,{...r,apiKey:i})),`streamAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){Y(n),e.push(J(t,n)),e.end()}}const Z=(e,t,n)=>{let r=a();return Ce(r,e,t,n).catch(Y),r};async function Ce(e,t,n,r){try{let i=await V();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${w()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=d(a,n,G(q({...r,apiKey:i},`streamSimpleAdobe[openai]`)));for await(let t of o)e.push(t)}else{let a={...t,baseUrl:w(),api:`anthropic-messages`},o=l(a,n,G(q(S(t,b(t.id,t.name,{...r,apiKey:i})),`streamSimpleAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){Y(n),e.push(J(t,n)),e.end()}}function we(e){let t={id:e.id,name:e.name};return e.api!==void 0&&(t.api=e.api),e.context_window!==void 0&&(t.context_window=e.context_window),e.max_tokens!==void 0&&(t.max_tokens=e.max_tokens),e.reasoning!==void 0&&(t.reasoning=e.reasoning),e.input!==void 0&&(t.input=e.input),t}function Te(){let e=new Map;for(let t of s())try{let n=c(t);for(let t of n)e.set(t.id,t)}catch{}return e}function Ee(t,n,r){let i=`adobe-${t.api===`openai`?`openai`:`anthropic`}`,a=r.get(t.id);if(a)return{...a,provider:`adobe`,api:i};let o=e(t.id,r);return{id:t.id,name:t.name??t.id,provider:`adobe`,api:i,baseUrl:n,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:o,inputCost:o.input,outputCost:o.output,cacheReadCost:o.cacheRead,cacheWriteCost:o.cacheWrite,reasoning:!0}}function De(e,t){for(let t of e)ce.set(t.id,we(t));let n=Te();return e.map(e=>Ee(e,t,n))}async function Oe(e){try{let t=e??await V(),n=w(),r=await fetch(`${n}/v1/models`,{headers:{Authorization:`Bearer ${t}`,[W]:`6.178.2`}});if(!r.ok)console.warn(`[adobe] Proxy /v1/models returned ${r.status}, falling back to Anthropic models`);else{let e=await r.json();if(e.data?.length)return De(e.data,n)}}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return null}const Q=new Map;function ke(){return c(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}async function $(e){let t=w(),n=Q.get(t);if(n)return n;let r=await Oe(e);return r?(Q.set(t,r),r):ke()}function Ae(){o({api:`adobe-anthropic`,stream:X,streamSimple:Z}),o({api:`adobe-openai`,stream:X,streamSimple:Z})}export{xe as __resetAdobeSessionIdWarningCacheForTests,z as config,R as extractTokenFromUrl,$ as getAdobeModels,V as getValidAccessToken,H as isTokenExpired,Ae as register};
1
+ import{S as e,_ as t,r as n,s as r}from"./account-store-_Ksq0LeF.js";import{n as i}from"./panel-rpc-DVS1uJpt.js";import{a}from"./diagnostics-DN_idNHx.js";import{a as o,i as s,r as c}from"./compat-uEPf6-XW.js";import{a as l,r as u,s as d,t as f}from"./legacy-api-aliases-jKEvBgOL.js";import{a as p,i as m,r as h}from"./claude-model-version-ceOteQ2f.js";import{r as g}from"./provider-budget-DbHWq3j6.js";import{n as _}from"./llm-session-id-BZyXP_j2.js";import{v}from"./kernel-worker-qQGHaMnf.js";import{n as y,t as ee}from"./silent-renew-backoff-Dmz3DJHb.js";import{getOAuthPageOrigin as te}from"./oauth-service-Gh6Z-BhZ.js";import{n as b}from"./temperature-support-PjwXIa-F.js";import"./provider-settings-By6-4Hob.js";var ne={proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`};function re(e,t){return h(e,t)}function x(e,t,n){return e!==`xhigh`||!t?e:p(t,n)?`xhigh`:m(t,n)?`max`:`high`}function ie(e,t){let n=e?t?.thinkingLevelMap?.[e]:void 0;return x((()=>{if(typeof n==`string`)return n;switch(e){case`minimal`:case`low`:return`low`;case`medium`:return`medium`;case`xhigh`:return`xhigh`;default:return`high`}})(),t?.id,t?.name)}function ae(e,t){return async(n,r)=>{let i=t?await t(n,r)??n:n,a=i.thinking;return a&&a.type===`enabled`&&(i.thinking={type:`adaptive`,...a.display===void 0?{}:{display:a.display}},i.output_config={...i.output_config??{},effort:e}),i}}function S(e,t){if(!re(e.id,e.name))return t;let n=t,r=x(n.effort??ie(n.reasoning,e),e.id,e.name);return{...t,onPayload:ae(r,n.onPayload)}}function oe(e,t){let n={id:e.id,name:e.name??e.id},r=t?.api??e.api,i=t?.context_window??e.context_window,a=t?.max_tokens??e.max_tokens,o=t?.reasoning??e.reasoning,s=t?.input??e.input;r&&(n.api=r),i!==void 0&&(n.context_window=i),a!==void 0&&(n.max_tokens=a),o!==void 0&&(n.reasoning=o),s&&(n.input=s);let c=t?.cost??e.cost;return c&&(n.cost=c),/haiku/i.test(e.id)&&(n.compat={supportsEagerToolInputStreaming:!1}),/sonnet-5\b/i.test(e.id)&&!n.thinkingLevelMap&&(n.thinkingLevelMap={xhigh:`xhigh`}),n}async function se(e,t,n,r={}){let i=typeof AbortController==`function`?new AbortController:null,a=i?setTimeout(()=>i.abort(),r.timeoutMs??8e3):null;try{let a=await n(`${e.replace(/\/$/,``)}/v1/usage`,{headers:{...r.headers,Authorization:`Bearer ${t}`},...i?{signal:i.signal}:{}});if(a.status===404||a.status===501)return null;if(!a.ok)throw Error(`Adobe /v1/usage returned ${a.status}`);return g(await a.json())}finally{a&&clearTimeout(a)}}const C=Object.assign({"/packages/webapp/providers/adobe-config.json":ne})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function w(){let e=r(`adobe`);if(e)return e.replace(/\/$/,``);if(C.proxyEndpoint)return C.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}const T=new Map,ce=new Map,le=`slicc-adobe-models`;function E(e){try{localStorage.setItem(le,JSON.stringify(e))}catch{}}async function D(e){try{let t=await fetch(`${e}/v1/config`,{headers:{[W]:`6.179.1`}});return t.ok?await t.json():(console.warn(`[adobe] Proxy /v1/config returned ${t.status}`),null)}catch(e){return console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e)),null}}async function O(e){let t=T.get(e);if(t)return t;let n=await D(e);return n||=(await new Promise(e=>setTimeout(e,600)),await D(e)),n?(T.set(e,n),n):{}}function k(e){let t=e.clientId||C.clientId;if(!t)throw Error(`Could not determine IMS client ID — proxy /v1/config did not return one and adobe-config.json is empty`);return t}function A(e){return e.scopes||C.scopes}function j(e){return e.imsEnvironment||C.imsEnvironment||`prod`}const M={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function N(e){return M[e??C.imsEnvironment??`prod`]??M.prod}async function P(){let e;try{e=w()}catch{return{}}return T.get(e)||new Promise(t=>{let n=setTimeout(()=>t({}),5e3),r=e=>{clearTimeout(n),t(e)};O(e).then(r,()=>r({}))})}function F(e){try{let t=e.split(`.`)[1];if(!t)return;let n=t.replace(/-/g,`+`).replace(/_/g,`/`),r=atob(n+`=`.repeat((4-n.length%4)%4)),i=JSON.parse(r);return typeof i.client_id==`string`?i.client_id:void 0}catch{return}}const I=typeof chrome<`u`&&!!chrome?.runtime?.id;function L(){return n().find(e=>e.providerId===`adobe`)}const ue=[`/ims/profile/v1`,`/ims/userinfo/v2`];async function de(e,t){try{let n=await fetch(e,{headers:{Authorization:`Bearer ${t}`}});if(!n.ok){console.warn(`[adobe] Profile fetch ${e} returned ${n.status}`);return}let r=await n.json(),i=r.displayName||r.name||r.email;return i?{name:i,avatar:r.picture||r.avatar_url}:void 0}catch(t){console.warn(`[adobe] Profile fetch ${e} failed:`,t instanceof Error?t.message:String(t));return}}async function fe(e,t){for(let n of ue){let r=await de(`${N(t)}${n}`,e);if(r)return r}return console.warn(`[adobe] No IMS profile endpoint named the user; account will have no display name`),{}}async function pe(){let e=L(),t=e?.accessToken;if(!t)return{status:`unknown`,detail:`no stored token`};let n=await P(),r=F(t)||n.clientId||C.clientId||``;if(!r)return{status:`unknown`,detail:`no IMS client ID available`};let i=N(j(n));try{let n=await fetch(`${i}/ims/validate_token/v1`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:r,token:t,type:`access_token`}),signal:AbortSignal.timeout(1e4)});if(!n.ok)return{status:`unknown`,detail:`HTTP ${n.status}${n.statusText?` ${n.statusText}`:``}`};let a=await n.json();return a.valid===!0?{status:`accepted`,userName:e?.userName}:a.valid===!1?{status:`rejected`,detail:`IMS reported the token invalid (${typeof a.reason==`string`?a.reason:`no reason given`})`}:{status:`unknown`,detail:"IMS answered 200 without a boolean `valid` verdict"}}catch(e){return{status:`unknown`,detail:e instanceof Error?e.message:String(e)}}}function R(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10),scope:n.get(`scope`)??void 0}:null}const z={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!C.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`,`admin.hlx.page`,`admin.hlx.live`,`admin.aem.page`,`admin.aem.live`,`api.aem.live`],getBudgetUsage:he,getModelIds:()=>{let e=e=>oe(e,ce.get(e.id));for(let t of Q.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id,reasoning:t.reasoning,input:t.input,cost:t.cost}));return E(n),n}for(let t of T.values())if(t.models?.length)return t.models.map(t=>e(t));try{let e=localStorage.getItem(le);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,n,r)=>{let i=w(),a=await O(i),o=k(a),s=A(a),c=j(a),l=I?null:await te(),u=I?null:y({pageHref:l.href,pageOrigin:l.origin,configuredRedirectUri:C.redirectUri},()=>crypto.randomUUID()),d=I?C.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:u.redirectUri,f=u?.oauthState,p=u?.expectedNonce??null,m=new URLSearchParams({client_id:o,scope:s,response_type:`token`,redirect_uri:d});f&&m.set(`state`,f),r?.forceReauth&&m.set(`prompt`,`login`);let h=await e(`${N(c)}/ims/authorize/v2?${m}`);if(!h)return;if(p&&h)try{if(new URL(h).searchParams.get(`nonce`)!==p){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let g=R(h);if(!g){console.error(`[adobe] Could not extract token from redirect URL`);return}let _=await fe(g.accessToken,c);await t({providerId:`adobe`,accessToken:g.accessToken,tokenExpiresAt:Date.now()+g.expiresIn*1e3,userName:_.name,userAvatar:_.avatar,scopes:g.scope,baseUrl:C.proxyEndpoint?void 0:i}),v(),await $().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),n()},onOAuthLogout:async()=>{let e=L();if(e?.accessToken)try{let t=await P(),n=F(e.accessToken)||t.clientId||C.clientId,r=j(t);if(n){let t=await fetch(`${N(r)}/ims/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({token:e.accessToken,token_type_hint:`access_token`,client_id:n})});t.ok||console.warn(`[adobe] Token revocation returned ${t.status}, token may still be valid server-side`)}}catch(e){console.warn(`[adobe] Failed to revoke token:`,e instanceof Error?e.message:String(e))}await t({providerId:`adobe`,accessToken:``}),v()},onSilentRenew:async()=>L()?.accessToken?U():null,onValidateToken:pe,refreshModels:async e=>{await $(e);let t=z.getModelIds?.();t?.length&&E(t)}};let B=null;const me=ee();async function V(){let e=L();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);let t=await me.run(()=>U());if(t)return t;let n=L();if((n?.tokenExpiresAt??0)-Date.now()>0&&n?.accessToken)return n.accessToken;throw Error(`Adobe session expired — please log in again`)}async function he(){let e;try{e=w()}catch{return null}let t=L();if(!t?.accessToken||H())throw Error(`Adobe budget: not signed in`);return se(e,t.accessToken,fetch,{headers:{"X-Session-Id":_(be)}})}function H(){let e=L();return!e?.tokenExpiresAt||Date.now()>e.tokenExpiresAt-6e4}async function U(){if(typeof window>`u`){let e=i();if(!e)return null;try{let{accessToken:t}=await e.call(`silent-renew`,{providerId:`adobe`},{timeoutMs:13e4});return t}catch(e){return console.warn(`[adobe] worker→page silent-renew bridge failed:`,e instanceof Error?e.message:String(e)),null}}return B===null&&(B=ye().finally(()=>{B=null})),B}function ge(e,t){let n=k(t),r=A(t),i=j(t),a=I?null:y({pageHref:window.location.href,pageOrigin:window.location.origin,configuredRedirectUri:C.redirectUri},()=>crypto.randomUUID()),o=I?C.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:a.redirectUri,s=a?.oauthState,c=a?.expectedNonce??null,l=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:o,prompt:`none`});return s&&l.set(`state`,s),{authorizeUrl:`${N(i)}/ims/authorize/v2?${l}`,expectedNonce:c,proxyEndpoint:e}}function _e(e,t){if(!t)return!0;try{if(new URL(e).searchParams.get(`nonce`)!==t)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),!1}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}return!0}async function ve(e,n){let r=L();await t({providerId:`adobe`,accessToken:e.accessToken,tokenExpiresAt:Date.now()+e.expiresIn*1e3,userName:r?.userName,userAvatar:r?.userAvatar,scopes:e.scope,baseUrl:C.proxyEndpoint?void 0:n})}async function ye(){try{let e=w(),{authorizeUrl:t,expectedNonce:n}=ge(e,await O(e)),{createOAuthLauncher:r}=await import(`./oauth-service-Gh6Z-BhZ.js`),i=await r()(t,{interactive:!1});if(!i||!_e(i,n))return null;let a=R(i);return a?(await ve(a,e),console.log(`[adobe] Token renewed silently`),await $().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),a.accessToken):null}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}}const W=`X-Slicc-Version`;function G(e){let t={};if(e.headers)for(let[n,r]of Object.entries(e.headers))n.toLowerCase()!==`x-slicc-version`&&(t[n]=r);return t[W]=`6.179.1`,{...e,headers:t}}const be=`adobe-usage-probe`,K=new Set;function q(e,t){if(e.headers){for(let[t,n]of Object.entries(e.headers))if(t.toLowerCase()===`x-session-id`&&n!=null)return e}return K.has(t)||(K.add(t),console.warn(`[adobe] Missing X-Session-Id from ${t} — using daily fallback. Attach an X-Session-Id header at the call site (see scoop-context.ts streamWithSessionId or docs/pitfalls.md).`)),{...e,headers:{...e.headers??{},"X-Session-Id":_(`adobe-provider-fallback`)}}}function xe(){K.clear()}function J(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function Y(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e))}const X=(e,t,n={})=>{let r=a();return Se(r,e,t,n).catch(Y),r};async function Se(e,t,n,r){try{let i=await V();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${w()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=u(a,n,G(q({...r,apiKey:i},`streamAdobe[openai]`)));for await(let t of o)e.push(t)}else{let a={...t,baseUrl:w(),api:`anthropic-messages`},o=f(a,n,G(q(S(t,b(t.id,t.name,{...r,apiKey:i})),`streamAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){Y(n),e.push(J(t,n)),e.end()}}const Z=(e,t,n)=>{let r=a();return Ce(r,e,t,n).catch(Y),r};async function Ce(e,t,n,r){try{let i=await V();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${w()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=d(a,n,G(q({...r,apiKey:i},`streamSimpleAdobe[openai]`)));for await(let t of o)e.push(t)}else{let a={...t,baseUrl:w(),api:`anthropic-messages`},o=l(a,n,G(q(S(t,b(t.id,t.name,{...r,apiKey:i})),`streamSimpleAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){Y(n),e.push(J(t,n)),e.end()}}function we(e){let t={id:e.id,name:e.name};return e.api!==void 0&&(t.api=e.api),e.context_window!==void 0&&(t.context_window=e.context_window),e.max_tokens!==void 0&&(t.max_tokens=e.max_tokens),e.reasoning!==void 0&&(t.reasoning=e.reasoning),e.input!==void 0&&(t.input=e.input),t}function Te(){let e=new Map;for(let t of s())try{let n=c(t);for(let t of n)e.set(t.id,t)}catch{}return e}function Ee(t,n,r){let i=`adobe-${t.api===`openai`?`openai`:`anthropic`}`,a=r.get(t.id);if(a)return{...a,provider:`adobe`,api:i};let o=e(t.id,r);return{id:t.id,name:t.name??t.id,provider:`adobe`,api:i,baseUrl:n,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:o,inputCost:o.input,outputCost:o.output,cacheReadCost:o.cacheRead,cacheWriteCost:o.cacheWrite,reasoning:!0}}function De(e,t){for(let t of e)ce.set(t.id,we(t));let n=Te();return e.map(e=>Ee(e,t,n))}async function Oe(e){try{let t=e??await V(),n=w(),r=await fetch(`${n}/v1/models`,{headers:{Authorization:`Bearer ${t}`,[W]:`6.179.1`}});if(!r.ok)console.warn(`[adobe] Proxy /v1/models returned ${r.status}, falling back to Anthropic models`);else{let e=await r.json();if(e.data?.length)return De(e.data,n)}}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return null}const Q=new Map;function ke(){return c(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}async function $(e){let t=w(),n=Q.get(t);if(n)return n;let r=await Oe(e);return r?(Q.set(t,r),r):ke()}function Ae(){o({api:`adobe-anthropic`,stream:X,streamSimple:Z}),o({api:`adobe-openai`,stream:X,streamSimple:Z})}export{xe as __resetAdobeSessionIdWarningCacheForTests,z as config,R as extractTokenFromUrl,$ as getAdobeModels,V as getValidAccessToken,H as isTokenExpired,Ae as register};
@@ -1,2 +1,2 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/oauth-service-C2D9b8uV.js","assets/preload-helper-Czpn1I53.js","assets/proxied-fetch-W1rZTqEQ.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/base64-ELzoYfwP.js","assets/fetch-body-1l9I58Vk.js","assets/api-endpoint-DuEQRZ4g.js","assets/runtime-env-Dlaokqg1.js","assets/panel-rpc-B3MSVImO.js","assets/permissions-surface-registry-CilCRwhh.js"])))=>i.map(i=>d[i]);
2
- import{a as e}from"./diagnostics-DN_idNHx.js";import{t}from"./preload-helper-Czpn1I53.js";import{a as n,i as r,r as i}from"./compat-qQM4gjF_.js";import{a,r as o,s,t as c}from"./legacy-api-aliases-DtQJ5I7w.js";import{G as l,Q as u,f as d,k as f,x as p}from"./account-store-SI8RQbm0.js";import{t as m}from"./providers-B9p2VR5L.js";import{t as h}from"./panel-rpc-B3MSVImO.js";import{i as g,n as _,r as ee}from"./claude-model-version-DZmbk9E2.js";import"./main-DFTTAllP.js";import{n as v,t as te}from"./silent-renew-backoff-Bak0vwwf.js";import{i as ne}from"./provider-budget-LCzMPlKv.js";import{getOAuthPageOrigin as re}from"./oauth-service-C2D9b8uV.js";import{n as y}from"./temperature-support-Dd00cuZX.js";import{t as b}from"./llm-session-id-bZQs6gBN.js";var ie={proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`};function ae(e,t){return _(e,t)}function x(e,t,n){return e!==`xhigh`||!t?e:g(t,n)?`xhigh`:ee(t,n)?`max`:`high`}function oe(e,t){let n=e?t?.thinkingLevelMap?.[e]:void 0;return x((()=>{if(typeof n==`string`)return n;switch(e){case`minimal`:case`low`:return`low`;case`medium`:return`medium`;case`xhigh`:return`xhigh`;default:return`high`}})(),t?.id,t?.name)}function se(e,t){return async(n,r)=>{let i=t?await t(n,r)??n:n,a=i.thinking;return a&&a.type===`enabled`&&(i.thinking={type:`adaptive`,...a.display===void 0?{}:{display:a.display}},i.output_config={...i.output_config??{},effort:e}),i}}function ce(e,t){if(!ae(e.id,e.name))return t;let n=t,r=x(n.effort??oe(n.reasoning,e),e.id,e.name);return{...t,onPayload:se(r,n.onPayload)}}function le(e,t){let n={id:e.id,name:e.name??e.id},r=t?.api??e.api,i=t?.context_window??e.context_window,a=t?.max_tokens??e.max_tokens,o=t?.reasoning??e.reasoning,s=t?.input??e.input;r&&(n.api=r),i!==void 0&&(n.context_window=i),a!==void 0&&(n.max_tokens=a),o!==void 0&&(n.reasoning=o),s&&(n.input=s);let c=t?.cost??e.cost;return c&&(n.cost=c),/haiku/i.test(e.id)&&(n.compat={supportsEagerToolInputStreaming:!1}),/sonnet-5\b/i.test(e.id)&&!n.thinkingLevelMap&&(n.thinkingLevelMap={xhigh:`xhigh`}),n}var ue=8e3;async function de(e,t,n,r={}){let i=typeof AbortController==`function`?new AbortController:null,a=i?setTimeout(()=>i.abort(),r.timeoutMs??ue):null;try{let a=await n(`${e.replace(/\/$/,``)}/v1/usage`,{headers:{...r.headers,Authorization:`Bearer ${t}`},...i?{signal:i.signal}:{}});if(a.status===404||a.status===501)return null;if(!a.ok)throw Error(`Adobe /v1/usage returned ${a.status}`);return ne(await a.json())}finally{a&&clearTimeout(a)}}var fe=6e4,pe=3e5,me=18e5,he=class{resolve;providerId;now;#e=null;#t=null;#n=null;#r=null;constructor(e,t,n=Date.now){this.resolve=e,this.providerId=t,this.now=n}#i(e){return e===`ok`?fe:e===`unsupported`?me:pe}isStale(){let e=this.#e;return!e||this.#t!==this.providerId()||this.now()-e.at>=this.#i(e.outcome)}snapshot(){return this.#t===this.providerId()?this.#e?.window??null:null}async refresh(e={}){if(!e.force&&!this.isStale())return this.snapshot();let t=this.providerId();return this.#n!==null&&this.#r===t?this.#n:(this.#n=this.resolve().then(e=>{let n=e?{...e,at:this.now()}:null;return this.#a(t,n?`ok`:`unsupported`,n),n}).catch(()=>{let e=this.snapshot();return this.#a(t,`failed`,e),e}).finally(()=>{this.#r===t&&(this.#n=null,this.#r=null)}),this.#r=t,this.#n)}#a(e,t,n){e===this.providerId()&&(this.#t=e,this.#e={outcome:t,window:n,at:this.now()})}clear(){this.#e=null,this.#t=null}};async function ge(){let e=f();if(!e)return null;let t=m(e);if(!t?.getBudgetUsage)return null;let n=await t.getBudgetUsage();return n?{...n,providerId:e}:null}function _e(){try{return f()}catch{return``}}var ve=new he(ge,_e);function S(){ve.clear()}var C=Object.assign({"/packages/webapp/providers/adobe-config.json":ie})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function w(){let e=p(`adobe`);if(e)return e.replace(/\/$/,``);if(C.proxyEndpoint)return C.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}var T=new Map,E=new Map,D=`slicc-adobe-models`;function O(e){try{localStorage.setItem(D,JSON.stringify(e))}catch{}}async function k(e){try{let t=await fetch(`${e}/v1/config`,{headers:{[G]:`6.178.2`}});return t.ok?await t.json():(console.warn(`[adobe] Proxy /v1/config returned ${t.status}`),null)}catch(e){return console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e)),null}}async function A(e){let t=T.get(e);if(t)return t;let n=await k(e);return n||=(await new Promise(e=>setTimeout(e,600)),await k(e)),n?(T.set(e,n),n):{}}function j(e){let t=e.clientId||C.clientId;if(!t)throw Error(`Could not determine IMS client ID — proxy /v1/config did not return one and adobe-config.json is empty`);return t}function M(e){return e.scopes||C.scopes}function N(e){return e.imsEnvironment||C.imsEnvironment||`prod`}var P={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function F(e){return P[e??C.imsEnvironment??`prod`]??P.prod}var ye=1e4,be=5e3;async function I(){let e;try{e=w()}catch{return{}}return T.get(e)||new Promise(t=>{let n=setTimeout(()=>t({}),be),r=e=>{clearTimeout(n),t(e)};A(e).then(r,()=>r({}))})}function L(e){try{let t=e.split(`.`)[1];if(!t)return;let n=t.replace(/-/g,`+`).replace(/_/g,`/`),r=atob(n+`=`.repeat((4-n.length%4)%4)),i=JSON.parse(r);return typeof i.client_id==`string`?i.client_id:void 0}catch{return}}var R=typeof chrome<`u`&&!!chrome?.runtime?.id;function z(){return d().find(e=>e.providerId===`adobe`)}var xe=[`/ims/profile/v1`,`/ims/userinfo/v2`];async function Se(e,t){try{let n=await fetch(e,{headers:{Authorization:`Bearer ${t}`}});if(!n.ok){console.warn(`[adobe] Profile fetch ${e} returned ${n.status}`);return}let r=await n.json(),i=r.displayName||r.name||r.email;return i?{name:i,avatar:r.picture||r.avatar_url}:void 0}catch(t){console.warn(`[adobe] Profile fetch ${e} failed:`,t instanceof Error?t.message:String(t));return}}async function Ce(e,t){for(let n of xe){let r=await Se(`${F(t)}${n}`,e);if(r)return r}return console.warn(`[adobe] No IMS profile endpoint named the user; account will have no display name`),{}}async function we(){let e=z(),t=e?.accessToken;if(!t)return{status:`unknown`,detail:`no stored token`};let n=await I(),r=L(t)||n.clientId||C.clientId||``;if(!r)return{status:`unknown`,detail:`no IMS client ID available`};let i=F(N(n));try{let n=await fetch(`${i}/ims/validate_token/v1`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:r,token:t,type:`access_token`}),signal:AbortSignal.timeout(ye)});if(!n.ok)return{status:`unknown`,detail:`HTTP ${n.status}${n.statusText?` ${n.statusText}`:``}`};let a=await n.json();return a.valid===!0?{status:`accepted`,userName:e?.userName}:a.valid===!1?{status:`rejected`,detail:`IMS reported the token invalid (${typeof a.reason==`string`?a.reason:`no reason given`})`}:{status:`unknown`,detail:"IMS answered 200 without a boolean `valid` verdict"}}catch(e){return{status:`unknown`,detail:e instanceof Error?e.message:String(e)}}}function B(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10),scope:n.get(`scope`)??void 0}:null}var V={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!C.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`,`admin.hlx.page`,`admin.hlx.live`,`admin.aem.page`,`admin.aem.live`,`api.aem.live`],getBudgetUsage:Ee,getModelIds:()=>{let e=e=>le(e,E.get(e.id));for(let t of Q.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id,reasoning:t.reasoning,input:t.input,cost:t.cost}));return O(n),n}for(let t of T.values())if(t.models?.length)return t.models.map(t=>e(t));try{let e=localStorage.getItem(D);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,t,n)=>{let r=w(),i=await A(r),a=j(i),o=M(i),s=N(i),c=R?null:await re(),u=R?null:v({pageHref:c.href,pageOrigin:c.origin,configuredRedirectUri:C.redirectUri},()=>crypto.randomUUID()),d=R?C.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:u.redirectUri,f=u?.oauthState,p=u?.expectedNonce??null,m=new URLSearchParams({client_id:a,scope:o,response_type:`token`,redirect_uri:d});f&&m.set(`state`,f),n?.forceReauth&&m.set(`prompt`,`login`);let h=await e(`${F(s)}/ims/authorize/v2?${m}`);if(!h)return;if(p&&h)try{if(new URL(h).searchParams.get(`nonce`)!==p){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let g=B(h);if(!g){console.error(`[adobe] Could not extract token from redirect URL`);return}let _=await Ce(g.accessToken,s);await l({providerId:`adobe`,accessToken:g.accessToken,tokenExpiresAt:Date.now()+g.expiresIn*1e3,userName:_.name,userAvatar:_.avatar,scopes:g.scope,baseUrl:C.proxyEndpoint?void 0:r}),S(),await $().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),t()},onOAuthLogout:async()=>{let e=z();if(e?.accessToken)try{let t=await I(),n=L(e.accessToken)||t.clientId||C.clientId,r=N(t);if(n){let t=await fetch(`${F(r)}/ims/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({token:e.accessToken,token_type_hint:`access_token`,client_id:n})});t.ok||console.warn(`[adobe] Token revocation returned ${t.status}, token may still be valid server-side`)}}catch(e){console.warn(`[adobe] Failed to revoke token:`,e instanceof Error?e.message:String(e))}await l({providerId:`adobe`,accessToken:``}),S()},onSilentRenew:async()=>z()?.accessToken?De():null,onValidateToken:we,refreshModels:async e=>{await $(e);let t=V.getModelIds?.();t?.length&&O(t)}},H=null,Te=te();async function U(){let e=z();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);let t=await Te.run(()=>De());if(t)return t;let n=z();if((n?.tokenExpiresAt??0)-Date.now()>0&&n?.accessToken)return n.accessToken;throw Error(`Adobe session expired — please log in again`)}async function Ee(){let e;try{e=w()}catch{return null}let t=z();if(!t?.accessToken||W())throw Error(`Adobe budget: not signed in`);return de(e,t.accessToken,fetch,{headers:{"X-Session-Id":b(Ne)}})}function W(){let e=z();return!e?.tokenExpiresAt||Date.now()>e.tokenExpiresAt-6e4}async function De(){if(typeof window>`u`){let e=h();if(!e)return null;try{let{accessToken:t}=await e.call(`silent-renew`,{providerId:`adobe`},{timeoutMs:13e4});return t}catch(e){return console.warn(`[adobe] worker→page silent-renew bridge failed:`,e instanceof Error?e.message:String(e)),null}}return H===null&&(H=je().finally(()=>{H=null})),H}function Oe(e,t){let n=j(t),r=M(t),i=N(t),a=R?null:v({pageHref:window.location.href,pageOrigin:window.location.origin,configuredRedirectUri:C.redirectUri},()=>crypto.randomUUID()),o=R?C.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:a.redirectUri,s=a?.oauthState,c=a?.expectedNonce??null,l=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:o,prompt:`none`});return s&&l.set(`state`,s),{authorizeUrl:`${F(i)}/ims/authorize/v2?${l}`,expectedNonce:c,proxyEndpoint:e}}function ke(e,t){if(!t)return!0;try{if(new URL(e).searchParams.get(`nonce`)!==t)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),!1}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}return!0}async function Ae(e,t){let n=z();await l({providerId:`adobe`,accessToken:e.accessToken,tokenExpiresAt:Date.now()+e.expiresIn*1e3,userName:n?.userName,userAvatar:n?.userAvatar,scopes:e.scope,baseUrl:C.proxyEndpoint?void 0:t})}async function je(){try{let e=w(),{authorizeUrl:n,expectedNonce:r}=Oe(e,await A(e)),{createOAuthLauncher:i}=await t(async()=>{let{createOAuthLauncher:e}=await import(`./oauth-service-C2D9b8uV.js`);return{createOAuthLauncher:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])),a=await i()(n,{interactive:!1});if(!a||!ke(a,r))return null;let o=B(a);return o?(await Ae(o,e),console.log(`[adobe] Token renewed silently`),await $().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),o.accessToken):null}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}}var G=`X-Slicc-Version`;function K(e){let t={},n=G.toLowerCase();if(e.headers)for(let[r,i]of Object.entries(e.headers))r.toLowerCase()!==n&&(t[r]=i);return t[G]=`6.178.2`,{...e,headers:t}}var Me=`adobe-provider-fallback`,Ne=`adobe-usage-probe`,q=new Set;function J(e,t){if(e.headers){for(let[t,n]of Object.entries(e.headers))if(t.toLowerCase()===`x-session-id`&&n!=null)return e}return q.has(t)||(q.add(t),console.warn(`[adobe] Missing X-Session-Id from ${t} — using daily fallback. Attach an X-Session-Id header at the call site (see scoop-context.ts streamWithSessionId or docs/pitfalls.md).`)),{...e,headers:{...e.headers??{},"X-Session-Id":b(Me)}}}function Pe(){q.clear()}function Y(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function X(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e))}var Fe=(t,n,r={})=>{let i=e();return Ie(i,t,n,r).catch(X),i};async function Ie(e,t,n,r){try{let i=await U();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${w()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},s=o(a,n,K(J({...r,apiKey:i},`streamAdobe[openai]`)));for await(let t of s)e.push(t)}else{let a={...t,baseUrl:w(),api:`anthropic-messages`},o=c(a,n,K(J(ce(t,y(t.id,t.name,{...r,apiKey:i})),`streamAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){X(n),e.push(Y(t,n)),e.end()}}var Z=(t,n,r)=>{let i=e();return Le(i,t,n,r).catch(X),i};async function Le(e,t,n,r){try{let i=await U();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${w()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=s(a,n,K(J({...r,apiKey:i},`streamSimpleAdobe[openai]`)));for await(let t of o)e.push(t)}else{let o={...t,baseUrl:w(),api:`anthropic-messages`},s=a(o,n,K(J(ce(t,y(t.id,t.name,{...r,apiKey:i})),`streamSimpleAdobe[anthropic]`)));for await(let t of s)e.push(t)}e.end()}catch(n){X(n),e.push(Y(t,n)),e.end()}}function Re(e){let t={id:e.id,name:e.name};return e.api!==void 0&&(t.api=e.api),e.context_window!==void 0&&(t.context_window=e.context_window),e.max_tokens!==void 0&&(t.max_tokens=e.max_tokens),e.reasoning!==void 0&&(t.reasoning=e.reasoning),e.input!==void 0&&(t.input=e.input),t}function ze(){let e=new Map;for(let t of r())try{let n=i(t);for(let t of n)e.set(t.id,t)}catch{}return e}function Be(e,t,n){let r=`adobe-${e.api===`openai`?`openai`:`anthropic`}`,i=n.get(e.id);if(i)return{...i,provider:`adobe`,api:r};let a=u(e.id,n);return{id:e.id,name:e.name??e.id,provider:`adobe`,api:r,baseUrl:t,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:a,inputCost:a.input,outputCost:a.output,cacheReadCost:a.cacheRead,cacheWriteCost:a.cacheWrite,reasoning:!0}}function Ve(e,t){for(let t of e)E.set(t.id,Re(t));let n=ze();return e.map(e=>Be(e,t,n))}async function He(e){try{let t=e??await U(),n=w(),r=await fetch(`${n}/v1/models`,{headers:{Authorization:`Bearer ${t}`,[G]:`6.178.2`}});if(!r.ok)console.warn(`[adobe] Proxy /v1/models returned ${r.status}, falling back to Anthropic models`);else{let e=await r.json();if(e.data?.length)return Ve(e.data,n)}}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return null}var Q=new Map;function Ue(){return i(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}async function $(e){let t=w(),n=Q.get(t);if(n)return n;let r=await He(e);return r?(Q.set(t,r),r):Ue()}function We(){n({api:`adobe-anthropic`,stream:Fe,streamSimple:Z}),n({api:`adobe-openai`,stream:Fe,streamSimple:Z})}export{Pe as __resetAdobeSessionIdWarningCacheForTests,V as config,B as extractTokenFromUrl,$ as getAdobeModels,U as getValidAccessToken,W as isTokenExpired,We as register};
2
+ import{a as e}from"./diagnostics-DN_idNHx.js";import{t}from"./preload-helper-Czpn1I53.js";import{a as n,i as r,r as i}from"./compat-qQM4gjF_.js";import{a,r as o,s,t as c}from"./legacy-api-aliases-DtQJ5I7w.js";import{G as l,Q as u,f as d,k as f,x as p}from"./account-store-dO23dNCl.js";import{t as m}from"./providers-BFl9psp8.js";import{t as h}from"./panel-rpc-B3MSVImO.js";import{i as g,n as _,r as ee}from"./claude-model-version-DZmbk9E2.js";import"./main-D9U5TUrs.js";import{n as v,t as te}from"./silent-renew-backoff-CgDiUeEr.js";import{i as ne}from"./provider-budget-LCzMPlKv.js";import{getOAuthPageOrigin as re}from"./oauth-service-C2D9b8uV.js";import{n as y}from"./temperature-support-Dd00cuZX.js";import{t as b}from"./llm-session-id-bZQs6gBN.js";var ie={proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`};function ae(e,t){return _(e,t)}function x(e,t,n){return e!==`xhigh`||!t?e:g(t,n)?`xhigh`:ee(t,n)?`max`:`high`}function oe(e,t){let n=e?t?.thinkingLevelMap?.[e]:void 0;return x((()=>{if(typeof n==`string`)return n;switch(e){case`minimal`:case`low`:return`low`;case`medium`:return`medium`;case`xhigh`:return`xhigh`;default:return`high`}})(),t?.id,t?.name)}function se(e,t){return async(n,r)=>{let i=t?await t(n,r)??n:n,a=i.thinking;return a&&a.type===`enabled`&&(i.thinking={type:`adaptive`,...a.display===void 0?{}:{display:a.display}},i.output_config={...i.output_config??{},effort:e}),i}}function ce(e,t){if(!ae(e.id,e.name))return t;let n=t,r=x(n.effort??oe(n.reasoning,e),e.id,e.name);return{...t,onPayload:se(r,n.onPayload)}}function le(e,t){let n={id:e.id,name:e.name??e.id},r=t?.api??e.api,i=t?.context_window??e.context_window,a=t?.max_tokens??e.max_tokens,o=t?.reasoning??e.reasoning,s=t?.input??e.input;r&&(n.api=r),i!==void 0&&(n.context_window=i),a!==void 0&&(n.max_tokens=a),o!==void 0&&(n.reasoning=o),s&&(n.input=s);let c=t?.cost??e.cost;return c&&(n.cost=c),/haiku/i.test(e.id)&&(n.compat={supportsEagerToolInputStreaming:!1}),/sonnet-5\b/i.test(e.id)&&!n.thinkingLevelMap&&(n.thinkingLevelMap={xhigh:`xhigh`}),n}var ue=8e3;async function de(e,t,n,r={}){let i=typeof AbortController==`function`?new AbortController:null,a=i?setTimeout(()=>i.abort(),r.timeoutMs??ue):null;try{let a=await n(`${e.replace(/\/$/,``)}/v1/usage`,{headers:{...r.headers,Authorization:`Bearer ${t}`},...i?{signal:i.signal}:{}});if(a.status===404||a.status===501)return null;if(!a.ok)throw Error(`Adobe /v1/usage returned ${a.status}`);return ne(await a.json())}finally{a&&clearTimeout(a)}}var fe=6e4,pe=3e5,me=18e5,he=class{resolve;providerId;now;#e=null;#t=null;#n=null;#r=null;constructor(e,t,n=Date.now){this.resolve=e,this.providerId=t,this.now=n}#i(e){return e===`ok`?fe:e===`unsupported`?me:pe}isStale(){let e=this.#e;return!e||this.#t!==this.providerId()||this.now()-e.at>=this.#i(e.outcome)}snapshot(){return this.#t===this.providerId()?this.#e?.window??null:null}async refresh(e={}){if(!e.force&&!this.isStale())return this.snapshot();let t=this.providerId();return this.#n!==null&&this.#r===t?this.#n:(this.#n=this.resolve().then(e=>{let n=e?{...e,at:this.now()}:null;return this.#a(t,n?`ok`:`unsupported`,n),n}).catch(()=>{let e=this.snapshot();return this.#a(t,`failed`,e),e}).finally(()=>{this.#r===t&&(this.#n=null,this.#r=null)}),this.#r=t,this.#n)}#a(e,t,n){e===this.providerId()&&(this.#t=e,this.#e={outcome:t,window:n,at:this.now()})}clear(){this.#e=null,this.#t=null}};async function ge(){let e=f();if(!e)return null;let t=m(e);if(!t?.getBudgetUsage)return null;let n=await t.getBudgetUsage();return n?{...n,providerId:e}:null}function _e(){try{return f()}catch{return``}}var ve=new he(ge,_e);function S(){ve.clear()}var C=Object.assign({"/packages/webapp/providers/adobe-config.json":ie})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function w(){let e=p(`adobe`);if(e)return e.replace(/\/$/,``);if(C.proxyEndpoint)return C.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}var T=new Map,E=new Map,D=`slicc-adobe-models`;function O(e){try{localStorage.setItem(D,JSON.stringify(e))}catch{}}async function k(e){try{let t=await fetch(`${e}/v1/config`,{headers:{[G]:`6.179.1`}});return t.ok?await t.json():(console.warn(`[adobe] Proxy /v1/config returned ${t.status}`),null)}catch(e){return console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e)),null}}async function A(e){let t=T.get(e);if(t)return t;let n=await k(e);return n||=(await new Promise(e=>setTimeout(e,600)),await k(e)),n?(T.set(e,n),n):{}}function j(e){let t=e.clientId||C.clientId;if(!t)throw Error(`Could not determine IMS client ID — proxy /v1/config did not return one and adobe-config.json is empty`);return t}function M(e){return e.scopes||C.scopes}function N(e){return e.imsEnvironment||C.imsEnvironment||`prod`}var P={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function F(e){return P[e??C.imsEnvironment??`prod`]??P.prod}var ye=1e4,be=5e3;async function I(){let e;try{e=w()}catch{return{}}return T.get(e)||new Promise(t=>{let n=setTimeout(()=>t({}),be),r=e=>{clearTimeout(n),t(e)};A(e).then(r,()=>r({}))})}function L(e){try{let t=e.split(`.`)[1];if(!t)return;let n=t.replace(/-/g,`+`).replace(/_/g,`/`),r=atob(n+`=`.repeat((4-n.length%4)%4)),i=JSON.parse(r);return typeof i.client_id==`string`?i.client_id:void 0}catch{return}}var R=typeof chrome<`u`&&!!chrome?.runtime?.id;function z(){return d().find(e=>e.providerId===`adobe`)}var xe=[`/ims/profile/v1`,`/ims/userinfo/v2`];async function Se(e,t){try{let n=await fetch(e,{headers:{Authorization:`Bearer ${t}`}});if(!n.ok){console.warn(`[adobe] Profile fetch ${e} returned ${n.status}`);return}let r=await n.json(),i=r.displayName||r.name||r.email;return i?{name:i,avatar:r.picture||r.avatar_url}:void 0}catch(t){console.warn(`[adobe] Profile fetch ${e} failed:`,t instanceof Error?t.message:String(t));return}}async function Ce(e,t){for(let n of xe){let r=await Se(`${F(t)}${n}`,e);if(r)return r}return console.warn(`[adobe] No IMS profile endpoint named the user; account will have no display name`),{}}async function we(){let e=z(),t=e?.accessToken;if(!t)return{status:`unknown`,detail:`no stored token`};let n=await I(),r=L(t)||n.clientId||C.clientId||``;if(!r)return{status:`unknown`,detail:`no IMS client ID available`};let i=F(N(n));try{let n=await fetch(`${i}/ims/validate_token/v1`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:r,token:t,type:`access_token`}),signal:AbortSignal.timeout(ye)});if(!n.ok)return{status:`unknown`,detail:`HTTP ${n.status}${n.statusText?` ${n.statusText}`:``}`};let a=await n.json();return a.valid===!0?{status:`accepted`,userName:e?.userName}:a.valid===!1?{status:`rejected`,detail:`IMS reported the token invalid (${typeof a.reason==`string`?a.reason:`no reason given`})`}:{status:`unknown`,detail:"IMS answered 200 without a boolean `valid` verdict"}}catch(e){return{status:`unknown`,detail:e instanceof Error?e.message:String(e)}}}function B(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10),scope:n.get(`scope`)??void 0}:null}var V={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!C.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`,`admin.hlx.page`,`admin.hlx.live`,`admin.aem.page`,`admin.aem.live`,`api.aem.live`],getBudgetUsage:Ee,getModelIds:()=>{let e=e=>le(e,E.get(e.id));for(let t of Q.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id,reasoning:t.reasoning,input:t.input,cost:t.cost}));return O(n),n}for(let t of T.values())if(t.models?.length)return t.models.map(t=>e(t));try{let e=localStorage.getItem(D);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,t,n)=>{let r=w(),i=await A(r),a=j(i),o=M(i),s=N(i),c=R?null:await re(),u=R?null:v({pageHref:c.href,pageOrigin:c.origin,configuredRedirectUri:C.redirectUri},()=>crypto.randomUUID()),d=R?C.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:u.redirectUri,f=u?.oauthState,p=u?.expectedNonce??null,m=new URLSearchParams({client_id:a,scope:o,response_type:`token`,redirect_uri:d});f&&m.set(`state`,f),n?.forceReauth&&m.set(`prompt`,`login`);let h=await e(`${F(s)}/ims/authorize/v2?${m}`);if(!h)return;if(p&&h)try{if(new URL(h).searchParams.get(`nonce`)!==p){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let g=B(h);if(!g){console.error(`[adobe] Could not extract token from redirect URL`);return}let _=await Ce(g.accessToken,s);await l({providerId:`adobe`,accessToken:g.accessToken,tokenExpiresAt:Date.now()+g.expiresIn*1e3,userName:_.name,userAvatar:_.avatar,scopes:g.scope,baseUrl:C.proxyEndpoint?void 0:r}),S(),await $().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),t()},onOAuthLogout:async()=>{let e=z();if(e?.accessToken)try{let t=await I(),n=L(e.accessToken)||t.clientId||C.clientId,r=N(t);if(n){let t=await fetch(`${F(r)}/ims/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({token:e.accessToken,token_type_hint:`access_token`,client_id:n})});t.ok||console.warn(`[adobe] Token revocation returned ${t.status}, token may still be valid server-side`)}}catch(e){console.warn(`[adobe] Failed to revoke token:`,e instanceof Error?e.message:String(e))}await l({providerId:`adobe`,accessToken:``}),S()},onSilentRenew:async()=>z()?.accessToken?De():null,onValidateToken:we,refreshModels:async e=>{await $(e);let t=V.getModelIds?.();t?.length&&O(t)}},H=null,Te=te();async function U(){let e=z();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);let t=await Te.run(()=>De());if(t)return t;let n=z();if((n?.tokenExpiresAt??0)-Date.now()>0&&n?.accessToken)return n.accessToken;throw Error(`Adobe session expired — please log in again`)}async function Ee(){let e;try{e=w()}catch{return null}let t=z();if(!t?.accessToken||W())throw Error(`Adobe budget: not signed in`);return de(e,t.accessToken,fetch,{headers:{"X-Session-Id":b(Ne)}})}function W(){let e=z();return!e?.tokenExpiresAt||Date.now()>e.tokenExpiresAt-6e4}async function De(){if(typeof window>`u`){let e=h();if(!e)return null;try{let{accessToken:t}=await e.call(`silent-renew`,{providerId:`adobe`},{timeoutMs:13e4});return t}catch(e){return console.warn(`[adobe] worker→page silent-renew bridge failed:`,e instanceof Error?e.message:String(e)),null}}return H===null&&(H=je().finally(()=>{H=null})),H}function Oe(e,t){let n=j(t),r=M(t),i=N(t),a=R?null:v({pageHref:window.location.href,pageOrigin:window.location.origin,configuredRedirectUri:C.redirectUri},()=>crypto.randomUUID()),o=R?C.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:a.redirectUri,s=a?.oauthState,c=a?.expectedNonce??null,l=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:o,prompt:`none`});return s&&l.set(`state`,s),{authorizeUrl:`${F(i)}/ims/authorize/v2?${l}`,expectedNonce:c,proxyEndpoint:e}}function ke(e,t){if(!t)return!0;try{if(new URL(e).searchParams.get(`nonce`)!==t)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),!1}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}return!0}async function Ae(e,t){let n=z();await l({providerId:`adobe`,accessToken:e.accessToken,tokenExpiresAt:Date.now()+e.expiresIn*1e3,userName:n?.userName,userAvatar:n?.userAvatar,scopes:e.scope,baseUrl:C.proxyEndpoint?void 0:t})}async function je(){try{let e=w(),{authorizeUrl:n,expectedNonce:r}=Oe(e,await A(e)),{createOAuthLauncher:i}=await t(async()=>{let{createOAuthLauncher:e}=await import(`./oauth-service-C2D9b8uV.js`);return{createOAuthLauncher:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])),a=await i()(n,{interactive:!1});if(!a||!ke(a,r))return null;let o=B(a);return o?(await Ae(o,e),console.log(`[adobe] Token renewed silently`),await $().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),o.accessToken):null}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}}var G=`X-Slicc-Version`;function K(e){let t={},n=G.toLowerCase();if(e.headers)for(let[r,i]of Object.entries(e.headers))r.toLowerCase()!==n&&(t[r]=i);return t[G]=`6.179.1`,{...e,headers:t}}var Me=`adobe-provider-fallback`,Ne=`adobe-usage-probe`,q=new Set;function J(e,t){if(e.headers){for(let[t,n]of Object.entries(e.headers))if(t.toLowerCase()===`x-session-id`&&n!=null)return e}return q.has(t)||(q.add(t),console.warn(`[adobe] Missing X-Session-Id from ${t} — using daily fallback. Attach an X-Session-Id header at the call site (see scoop-context.ts streamWithSessionId or docs/pitfalls.md).`)),{...e,headers:{...e.headers??{},"X-Session-Id":b(Me)}}}function Pe(){q.clear()}function Y(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function X(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e))}var Fe=(t,n,r={})=>{let i=e();return Ie(i,t,n,r).catch(X),i};async function Ie(e,t,n,r){try{let i=await U();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${w()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},s=o(a,n,K(J({...r,apiKey:i},`streamAdobe[openai]`)));for await(let t of s)e.push(t)}else{let a={...t,baseUrl:w(),api:`anthropic-messages`},o=c(a,n,K(J(ce(t,y(t.id,t.name,{...r,apiKey:i})),`streamAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){X(n),e.push(Y(t,n)),e.end()}}var Z=(t,n,r)=>{let i=e();return Le(i,t,n,r).catch(X),i};async function Le(e,t,n,r){try{let i=await U();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${w()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=s(a,n,K(J({...r,apiKey:i},`streamSimpleAdobe[openai]`)));for await(let t of o)e.push(t)}else{let o={...t,baseUrl:w(),api:`anthropic-messages`},s=a(o,n,K(J(ce(t,y(t.id,t.name,{...r,apiKey:i})),`streamSimpleAdobe[anthropic]`)));for await(let t of s)e.push(t)}e.end()}catch(n){X(n),e.push(Y(t,n)),e.end()}}function Re(e){let t={id:e.id,name:e.name};return e.api!==void 0&&(t.api=e.api),e.context_window!==void 0&&(t.context_window=e.context_window),e.max_tokens!==void 0&&(t.max_tokens=e.max_tokens),e.reasoning!==void 0&&(t.reasoning=e.reasoning),e.input!==void 0&&(t.input=e.input),t}function ze(){let e=new Map;for(let t of r())try{let n=i(t);for(let t of n)e.set(t.id,t)}catch{}return e}function Be(e,t,n){let r=`adobe-${e.api===`openai`?`openai`:`anthropic`}`,i=n.get(e.id);if(i)return{...i,provider:`adobe`,api:r};let a=u(e.id,n);return{id:e.id,name:e.name??e.id,provider:`adobe`,api:r,baseUrl:t,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:a,inputCost:a.input,outputCost:a.output,cacheReadCost:a.cacheRead,cacheWriteCost:a.cacheWrite,reasoning:!0}}function Ve(e,t){for(let t of e)E.set(t.id,Re(t));let n=ze();return e.map(e=>Be(e,t,n))}async function He(e){try{let t=e??await U(),n=w(),r=await fetch(`${n}/v1/models`,{headers:{Authorization:`Bearer ${t}`,[G]:`6.179.1`}});if(!r.ok)console.warn(`[adobe] Proxy /v1/models returned ${r.status}, falling back to Anthropic models`);else{let e=await r.json();if(e.data?.length)return Ve(e.data,n)}}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return null}var Q=new Map;function Ue(){return i(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}async function $(e){let t=w(),n=Q.get(t);if(n)return n;let r=await He(e);return r?(Q.set(t,r),r):Ue()}function We(){n({api:`adobe-anthropic`,stream:Fe,streamSimple:Z}),n({api:`adobe-openai`,stream:Fe,streamSimple:Z})}export{Pe as __resetAdobeSessionIdWarningCacheForTests,V as config,B as extractTokenFromUrl,$ as getAdobeModels,U as getValidAccessToken,W as isTokenExpired,We as register};
@@ -1 +1 @@
1
- import{t as e}from"./logger-DDBAeTLF.js";import{K as t}from"./wc-shell-CrMn8BW0.js";var n=e(`agent-panels`),r=`/workspace/panels`,i=`panel.json`;function a(e,t){if(!e||typeof e!=`object`)return n.warn(`panel manifest is not an object`,{dir:t}),null;let r=e;return typeof r.id!=`string`||r.id.trim()===``?(n.warn(`panel manifest needs a non-empty id`,{dir:t}),null):typeof r.title!=`string`||r.title.trim()===``?(n.warn(`panel manifest needs a non-empty title`,{dir:t,id:r.id}),null):{id:r.id,title:r.title,icon:typeof r.icon==`string`?r.icon:void 0,minWidth:typeof r.minWidth==`number`?r.minWidth:void 0,minHeight:typeof r.minHeight==`number`?r.minHeight:void 0,preferredSize:typeof r.preferredSize==`string`||typeof r.preferredSize==`number`?r.preferredSize:void 0,presentation:r.presentation===`floating`?`floating`:void 0,anchor:r.anchor,realm:r.realm===`main`?`main`:`sandboxed`}}async function o(e){let t=[];try{if(!await e.exists(`/workspace/panels`))return t;let o=await e.readDir(r);for(let s of o){if(s.type!==`directory`)continue;let o=`${r}/${s.name}`,c=`${o}/${i}`;if(!await e.exists(c))continue;let l;try{let t=await e.readFile(c);l=JSON.parse(typeof t==`string`?t:String(t))}catch(e){n.warn(`unreadable panel manifest`,{manifestPath:c,error:e});continue}let u=a(l,o);if(!u)continue;let d=l.entry,f=typeof d==`string`&&d.length>0?`${o}/${d}`:null;t.push({meta:u,dir:o,entry:f})}}catch(e){n.warn(`agent panel discovery failed`,{error:e})}return t}async function s(e){let r=await o(e);for(let e of r)t({meta:e.meta,source:{kind:`sandboxed`,entry:e.entry??`${e.dir}/panel.shtml`},origin:`agent`});return r.length>0&&n.info(`registered agent panels`,{count:r.length}),r}export{s as registerAgentPanels};
1
+ import{t as e}from"./logger-DDBAeTLF.js";import{K as t}from"./wc-shell-BXTMxaKz.js";var n=e(`agent-panels`),r=`/workspace/panels`,i=`panel.json`;function a(e,t){if(!e||typeof e!=`object`)return n.warn(`panel manifest is not an object`,{dir:t}),null;let r=e;return typeof r.id!=`string`||r.id.trim()===``?(n.warn(`panel manifest needs a non-empty id`,{dir:t}),null):typeof r.title!=`string`||r.title.trim()===``?(n.warn(`panel manifest needs a non-empty title`,{dir:t,id:r.id}),null):{id:r.id,title:r.title,icon:typeof r.icon==`string`?r.icon:void 0,minWidth:typeof r.minWidth==`number`?r.minWidth:void 0,minHeight:typeof r.minHeight==`number`?r.minHeight:void 0,preferredSize:typeof r.preferredSize==`string`||typeof r.preferredSize==`number`?r.preferredSize:void 0,presentation:r.presentation===`floating`?`floating`:void 0,anchor:r.anchor,realm:r.realm===`main`?`main`:`sandboxed`}}async function o(e){let t=[];try{if(!await e.exists(`/workspace/panels`))return t;let o=await e.readDir(r);for(let s of o){if(s.type!==`directory`)continue;let o=`${r}/${s.name}`,c=`${o}/${i}`;if(!await e.exists(c))continue;let l;try{let t=await e.readFile(c);l=JSON.parse(typeof t==`string`?t:String(t))}catch(e){n.warn(`unreadable panel manifest`,{manifestPath:c,error:e});continue}let u=a(l,o);if(!u)continue;let d=l.entry,f=typeof d==`string`&&d.length>0?`${o}/${d}`:null;t.push({meta:u,dir:o,entry:f})}}catch(e){n.warn(`agent panel discovery failed`,{error:e})}return t}async function s(e){let r=await o(e);for(let e of r)t({meta:e.meta,source:{kind:`sandboxed`,entry:e.entry??`${e.dir}/panel.shtml`},origin:`agent`});return r.length>0&&n.info(`registered agent panels`,{count:r.length}),r}export{s as registerAgentPanels};