sliccy 3.5.5 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/README.md +1 -2
  2. package/dist/node-server/_cloud_core/src/errors.d.ts +14 -0
  3. package/dist/node-server/_cloud_core/src/errors.d.ts.map +1 -0
  4. package/dist/node-server/_cloud_core/src/errors.js +13 -0
  5. package/dist/node-server/_cloud_core/src/index.d.ts +19 -0
  6. package/dist/node-server/_cloud_core/src/index.d.ts.map +1 -0
  7. package/dist/node-server/_cloud_core/src/index.js +14 -0
  8. package/dist/node-server/_cloud_core/src/operations/kill.d.ts +18 -0
  9. package/dist/node-server/_cloud_core/src/operations/kill.d.ts.map +1 -0
  10. package/dist/node-server/_cloud_core/src/operations/kill.js +32 -0
  11. package/dist/node-server/_cloud_core/src/operations/list.d.ts +25 -0
  12. package/dist/node-server/_cloud_core/src/operations/list.d.ts.map +1 -0
  13. package/dist/node-server/_cloud_core/src/operations/list.js +145 -0
  14. package/dist/node-server/_cloud_core/src/operations/pause.d.ts +15 -0
  15. package/dist/node-server/_cloud_core/src/operations/pause.d.ts.map +1 -0
  16. package/dist/node-server/_cloud_core/src/operations/pause.js +27 -0
  17. package/dist/node-server/_cloud_core/src/operations/resume.d.ts +22 -0
  18. package/dist/node-server/_cloud_core/src/operations/resume.d.ts.map +1 -0
  19. package/dist/node-server/_cloud_core/src/operations/resume.js +86 -0
  20. package/dist/node-server/_cloud_core/src/operations/start.d.ts +67 -0
  21. package/dist/node-server/_cloud_core/src/operations/start.d.ts.map +1 -0
  22. package/dist/node-server/_cloud_core/src/operations/start.js +228 -0
  23. package/dist/node-server/_cloud_core/src/polling.d.ts +18 -0
  24. package/dist/node-server/_cloud_core/src/polling.d.ts.map +1 -0
  25. package/dist/node-server/_cloud_core/src/polling.js +79 -0
  26. package/dist/node-server/_cloud_core/src/registry.d.ts +27 -0
  27. package/dist/node-server/_cloud_core/src/registry.d.ts.map +1 -0
  28. package/dist/node-server/_cloud_core/src/registry.js +1 -0
  29. package/dist/node-server/_cloud_core/src/secrets-filter.d.ts +2 -0
  30. package/dist/node-server/_cloud_core/src/secrets-filter.d.ts.map +1 -0
  31. package/dist/node-server/_cloud_core/src/secrets-filter.js +17 -0
  32. package/dist/node-server/_cloud_core/src/substrate-factory.d.ts +3 -0
  33. package/dist/node-server/_cloud_core/src/substrate-factory.d.ts.map +1 -0
  34. package/dist/node-server/_cloud_core/src/substrate-factory.js +6 -0
  35. package/dist/node-server/_cloud_core/src/substrate.d.ts +53 -0
  36. package/dist/node-server/_cloud_core/src/substrate.d.ts.map +1 -0
  37. package/dist/node-server/_cloud_core/src/substrate.js +1 -0
  38. package/dist/node-server/_cloud_core/src/substrates/e2b.d.ts +3 -0
  39. package/dist/node-server/_cloud_core/src/substrates/e2b.d.ts.map +1 -0
  40. package/dist/node-server/_cloud_core/src/substrates/e2b.js +98 -0
  41. package/dist/node-server/_cloud_core/src/types.d.ts +94 -0
  42. package/dist/node-server/_cloud_core/src/types.d.ts.map +1 -0
  43. package/dist/node-server/_cloud_core/src/types.js +3 -0
  44. package/dist/node-server/_cloud_core/tests/fixtures/fake-substrate.d.ts +39 -0
  45. package/dist/node-server/_cloud_core/tests/fixtures/fake-substrate.d.ts.map +1 -0
  46. package/dist/node-server/_cloud_core/tests/fixtures/fake-substrate.js +75 -0
  47. package/dist/node-server/_cloud_core/tests/fixtures/index.d.ts +4 -0
  48. package/dist/node-server/_cloud_core/tests/fixtures/index.d.ts.map +1 -0
  49. package/dist/node-server/_cloud_core/tests/fixtures/index.js +2 -0
  50. package/dist/node-server/_cloud_core/tests/fixtures/mem-registry.d.ts +10 -0
  51. package/dist/node-server/_cloud_core/tests/fixtures/mem-registry.d.ts.map +1 -0
  52. package/dist/node-server/_cloud_core/tests/fixtures/mem-registry.js +25 -0
  53. package/dist/node-server/_cloud_core/tests/kill.test.d.ts +2 -0
  54. package/dist/node-server/_cloud_core/tests/kill.test.d.ts.map +1 -0
  55. package/dist/node-server/_cloud_core/tests/kill.test.js +164 -0
  56. package/dist/node-server/_cloud_core/tests/list.test.d.ts +2 -0
  57. package/dist/node-server/_cloud_core/tests/list.test.d.ts.map +1 -0
  58. package/dist/node-server/_cloud_core/tests/list.test.js +300 -0
  59. package/dist/node-server/_cloud_core/tests/pause.test.d.ts +2 -0
  60. package/dist/node-server/_cloud_core/tests/pause.test.d.ts.map +1 -0
  61. package/dist/node-server/_cloud_core/tests/pause.test.js +167 -0
  62. package/dist/node-server/_cloud_core/tests/resume.test.d.ts +2 -0
  63. package/dist/node-server/_cloud_core/tests/resume.test.d.ts.map +1 -0
  64. package/dist/node-server/_cloud_core/tests/resume.test.js +203 -0
  65. package/dist/node-server/_cloud_core/tests/secrets-filter.test.d.ts +2 -0
  66. package/dist/node-server/_cloud_core/tests/secrets-filter.test.d.ts.map +1 -0
  67. package/dist/node-server/_cloud_core/tests/secrets-filter.test.js +30 -0
  68. package/dist/node-server/_cloud_core/tests/start.test.d.ts +2 -0
  69. package/dist/node-server/_cloud_core/tests/start.test.d.ts.map +1 -0
  70. package/dist/node-server/_cloud_core/tests/start.test.js +513 -0
  71. package/dist/node-server/chrome-launch.d.ts +1 -0
  72. package/dist/node-server/chrome-launch.js +3 -0
  73. package/dist/node-server/cloud/dispatch.d.ts +34 -0
  74. package/dist/node-server/cloud/dispatch.js +79 -0
  75. package/dist/node-server/cloud/kill.d.ts +12 -0
  76. package/dist/node-server/cloud/kill.js +11 -0
  77. package/dist/node-server/cloud/list.d.ts +6 -0
  78. package/dist/node-server/cloud/list.js +6 -0
  79. package/dist/node-server/cloud/pause.d.ts +7 -0
  80. package/dist/node-server/cloud/pause.js +6 -0
  81. package/dist/node-server/cloud/registry-file.d.ts +13 -0
  82. package/dist/node-server/cloud/registry-file.js +85 -0
  83. package/dist/node-server/cloud/resume.d.ts +11 -0
  84. package/dist/node-server/cloud/resume.js +17 -0
  85. package/dist/node-server/cloud/start.d.ts +16 -0
  86. package/dist/node-server/cloud/start.js +49 -0
  87. package/dist/node-server/cloud-status.d.ts +11 -0
  88. package/dist/node-server/cloud-status.js +49 -0
  89. package/dist/node-server/hosted-bootstrap.d.ts +21 -0
  90. package/dist/node-server/hosted-bootstrap.js +14 -0
  91. package/dist/node-server/index.js +157 -3
  92. package/dist/node-server/leader-restart.d.ts +29 -0
  93. package/dist/node-server/leader-restart.js +146 -0
  94. package/dist/node-server/runtime-flags.d.ts +1 -0
  95. package/dist/node-server/runtime-flags.js +6 -0
  96. package/dist/ui/assets/{adobe-DSSPywlx.js → adobe-Bb9Koo41.js} +1 -1
  97. package/dist/ui/assets/adobe-C83SQyit.js +2 -0
  98. package/dist/ui/assets/agent-bridge-CqFAtXhQ.js +1 -0
  99. package/dist/ui/assets/{agent-message-to-chat-CsyFcZ2w.js → agent-message-to-chat-B5maV2R5.js} +1 -1
  100. package/dist/ui/assets/{anthropic-DdObQ2i-.js → anthropic-B_W-Zf1F.js} +1 -1
  101. package/dist/ui/assets/{anthropic-04L_IqQ4.js → anthropic-DFqMAkaW.js} +1 -1
  102. package/dist/ui/assets/{apps-BBc8G_er.js → apps-CQcu3SPP.js} +1 -1
  103. package/dist/ui/assets/{azure-openai-maMzaMwe.js → azure-openai-N2PiMhaz.js} +1 -1
  104. package/dist/ui/assets/azure-openai-miFUu6Hv.js +1 -0
  105. package/dist/ui/assets/azure-openai-responses-DOyJjHhU.js +1 -0
  106. package/dist/ui/assets/{azure-openai-responses-Cd0P_ssa.js → azure-openai-responses-k5E1atrw.js} +1 -1
  107. package/dist/ui/assets/{bsh-watchdog-C8BJAFc3.js → bsh-watchdog-CqkW32Q7.js} +1 -1
  108. package/dist/ui/assets/{cdp-DMk0S7sC.js → cdp-DRnArGXe.js} +3 -3
  109. package/dist/ui/assets/cloud-CCHD45tb.js +1 -0
  110. package/dist/ui/assets/cloud-DyAca2cv.css +1 -0
  111. package/dist/ui/assets/cost-command-Qd6vdo4-.js +1 -0
  112. package/dist/ui/assets/{dist-cK1g1pHF.js → dist-ChvbMSOY.js} +1 -1
  113. package/dist/ui/assets/{dist-BTGs16AV.js → dist-CltZJzbd.js} +1 -1
  114. package/dist/ui/assets/{dist-BcBxL8nL.js → dist-cZSF0917.js} +1 -1
  115. package/dist/ui/assets/{dist-Bgcuvc8h.js → dist-ljtB3O-J.js} +1 -1
  116. package/dist/ui/assets/{es-Bjf1BIVF.js → es-HXRnKgrk.js} +1 -1
  117. package/dist/ui/assets/follower-sprinkle-bridge-_PGckvHb.js +1 -0
  118. package/dist/ui/assets/{github-q1jHC2aO.js → github-BENqO11g.js} +1 -1
  119. package/dist/ui/assets/github-C-Z3n5Xc.js +2 -0
  120. package/dist/ui/assets/google-7RDpSFjr.js +1 -0
  121. package/dist/ui/assets/{google-okAFtSPB.js → google-BaN03Ews.js} +1 -1
  122. package/dist/ui/assets/{google-shared-O-0R1H53.js → google-shared-B50LC94Y.js} +1 -1
  123. package/dist/ui/assets/google-shared-DQIr6_u6.js +11 -0
  124. package/dist/ui/assets/{google-vertex-BkZigHmB.js → google-vertex-DmQqHOd3.js} +1 -1
  125. package/dist/ui/assets/google-vertex-fe0XTrlp.js +1 -0
  126. package/dist/ui/assets/{intercepted-oauth-BbYCzrsi.js → intercepted-oauth-DZunMpOb.js} +1 -1
  127. package/dist/ui/assets/{kernel-worker-7oVJDvYj.js → kernel-worker-C5VWVo3p.js} +915 -915
  128. package/dist/ui/assets/{lick-ws-bridge-Cre3RRwL.js → lick-ws-bridge-BlpI5Vfh.js} +1 -1
  129. package/dist/ui/assets/{local-llm-DAe8mBkI.js → local-llm-B9x9dHMp.js} +1 -1
  130. package/dist/ui/assets/magick-wasm-DTuiyppo.js +1 -0
  131. package/dist/ui/assets/{index-BdDYVKjf.js → main-CGBwb-Z7.js} +85 -84
  132. package/dist/ui/assets/{mistral-BgP2Mhzf.js → mistral-Bm98WJNR.js} +1 -1
  133. package/dist/ui/assets/{mistral-DVuMIs98.js → mistral-DNRus666.js} +1 -1
  134. package/dist/ui/assets/modulepreload-polyfill-wMinxHhO.js +1 -0
  135. package/dist/ui/assets/nuke-command-CC3imLyj.js +1 -0
  136. package/dist/ui/assets/{oauth-D12YL9GU.js → oauth-DBX2TVKl.js} +1 -1
  137. package/dist/ui/assets/oauth-bootstrap-DOOX1I7K.js +2 -0
  138. package/dist/ui/assets/oauth-service-Bv4EZbHs.js +1 -0
  139. package/dist/ui/assets/{oauth-service-Copu_4SG.js → oauth-service-v9k7zmDr.js} +1 -1
  140. package/dist/ui/assets/offscreen-client-C8dacNXH.js +1 -0
  141. package/dist/ui/assets/onboarding-orchestrator-C_kYnC4g.js +1 -0
  142. package/dist/ui/assets/{openai-codex-responses-BAPqEmsF.js → openai-codex-responses-DQIglX1K.js} +1 -1
  143. package/dist/ui/assets/{openai-codex-responses-B7pudFjp.js → openai-codex-responses-DW1a9bCj.js} +1 -1
  144. package/dist/ui/assets/openai-completions-ChQDZA6E.js +5 -0
  145. package/dist/ui/assets/{openai-responses-CtIsFZKY.js → openai-responses-CY2Kt17O.js} +1 -1
  146. package/dist/ui/assets/openai-responses-Pm8J-HuA.js +1 -0
  147. package/dist/ui/assets/{openai-responses-shared-CqmlDcXz.js → openai-responses-shared-CVjR8F2I.js} +1 -1
  148. package/dist/ui/assets/{openai-responses-shared-DxBvmwvL.js → openai-responses-shared-DsbHT7ZR.js} +1 -1
  149. package/dist/ui/assets/{openrouter-CdadiGtx.js → openrouter-C17Qgp_a.js} +1 -1
  150. package/dist/ui/assets/openrouter-YvEDVJjZ.js +1 -0
  151. package/dist/ui/assets/panel-rpc-handlers-D3TvKTBJ.js +1 -0
  152. package/dist/ui/assets/{provider-DcrxGcMH.js → provider-CVQ1-hiX.js} +2 -2
  153. package/dist/ui/assets/{provider-DXK8JUs0.js → provider-DQdgU2cB.js} +1 -1
  154. package/dist/ui/assets/provider-store-access-HJH7Oiu7.js +1 -0
  155. package/dist/ui/assets/provider-store-access-R_T_zm3J.js +1 -0
  156. package/dist/ui/assets/proxied-fetch-BD4Aw_98.js +1 -0
  157. package/dist/ui/assets/{pyodide-DlSYVqmj.js → pyodide-DjwZMHCM.js} +2 -2
  158. package/dist/ui/assets/{remote-terminal-view-PnTEWD7p.js → remote-terminal-view-BY0dldZw.js} +1 -1
  159. package/dist/ui/assets/secret-env-CRC281WY.js +1 -0
  160. package/dist/ui/assets/slicc-editor-DWlyJ8F2.js +12 -0
  161. package/dist/ui/assets/{spawn-CfeAB8A4.js → spawn-7IvlkEig.js} +1 -1
  162. package/dist/ui/assets/{sql-wasm-BVmSEJv3.js → sql-wasm-CwnEMigK.js} +1 -1
  163. package/dist/ui/assets/{store-D-IKH6-w.js → store-j2Druu0N.js} +1 -1
  164. package/dist/ui/assets/tray-leave-runtime-Bn8j6E27.js +1 -0
  165. package/dist/ui/assets/{upgrade-detection-CpKdzfSv.js → upgrade-detection-3mhOWPt2.js} +1 -1
  166. package/dist/ui/assets/{xai-grok-DwtbUE6F.js → xai-grok-Che7ONVU.js} +1 -1
  167. package/dist/ui/assets/xai-grok-Doi4Og_5.js +1 -0
  168. package/dist/ui/assets/{xai-grok-sanitize-DtMFuPGU.js → xai-grok-sanitize-C7TgWvwD.js} +1 -1
  169. package/dist/ui/electron-overlay-entry.js +9 -9
  170. package/dist/ui/index.html +3 -2
  171. package/dist/ui/llm-proxy-sw.js +1 -1
  172. package/dist/ui/packages/webapp/cloud/index.html +38 -0
  173. package/dist/ui/packages/webapp/index.html +3 -2
  174. package/package.json +9 -7
  175. package/dist/ui/assets/adobe-DCsfRQn2.js +0 -2
  176. package/dist/ui/assets/agent-bridge-DaJ_nmW3.js +0 -1
  177. package/dist/ui/assets/azure-openai-DzGirHIb.js +0 -1
  178. package/dist/ui/assets/azure-openai-responses-CjukGNgz.js +0 -1
  179. package/dist/ui/assets/cost-command-BtJx6Gwp.js +0 -1
  180. package/dist/ui/assets/follower-sprinkle-bridge-BFLnAii4.js +0 -1
  181. package/dist/ui/assets/github-CcyS4zY-.js +0 -2
  182. package/dist/ui/assets/google-Cgd9E3cB.js +0 -1
  183. package/dist/ui/assets/google-shared-Dz7dBXHI.js +0 -11
  184. package/dist/ui/assets/google-vertex-BSk7Kd0k.js +0 -1
  185. package/dist/ui/assets/magick-wasm-C1izt9i7.js +0 -1
  186. package/dist/ui/assets/nuke-command-BbxGOoiP.js +0 -1
  187. package/dist/ui/assets/oauth-bootstrap-BtJmY6M6.js +0 -2
  188. package/dist/ui/assets/oauth-service-DJF7cZo7.js +0 -1
  189. package/dist/ui/assets/offscreen-client-Cz7pdJA-.js +0 -1
  190. package/dist/ui/assets/onboarding-orchestrator-BKXIEudN.js +0 -1
  191. package/dist/ui/assets/openai-completions-iJ14N4Sw.js +0 -5
  192. package/dist/ui/assets/openai-responses-C4kJ_gQ1.js +0 -1
  193. package/dist/ui/assets/openrouter-CPoeAmgd.js +0 -1
  194. package/dist/ui/assets/panel-rpc-handlers-DbHRM59x.js +0 -1
  195. package/dist/ui/assets/provider-store-access-BjvfvyfX.js +0 -1
  196. package/dist/ui/assets/provider-store-access-auxlQIvP.js +0 -1
  197. package/dist/ui/assets/proxied-fetch-Zr3psZ6-.js +0 -1
  198. package/dist/ui/assets/secret-env-YSczATtn.js +0 -1
  199. package/dist/ui/assets/slicc-editor-BwZ-JdjT.js +0 -12
  200. package/dist/ui/assets/tray-leave-runtime-D9Wr8bCF.js +0 -1
  201. package/dist/ui/assets/xai-grok-CGPoHWCQ.js +0 -1
  202. /package/dist/ui/assets/{active-transport-Cu6hvJXz.js → active-transport-DHcaBd4j.js} +0 -0
  203. /package/dist/ui/assets/{addon-fit-D2MIn2bh.js → addon-fit-CUt9lrQO.js} +0 -0
  204. /package/dist/ui/assets/{azure-ai-foundry-DVqxYCDH.js → azure-ai-foundry-B4QrVklT.js} +0 -0
  205. /package/dist/ui/assets/{chat-fixture-C0wxG6yH.js → chat-fixture-ChGRNFda.js} +0 -0
  206. /package/dist/ui/assets/{dist-BNe7ZIzA.js → dist-CZcDRTma.js} +0 -0
  207. /package/dist/ui/assets/{dist-4mA3RMrN.js → dist-D0kTaNET.js} +0 -0
  208. /package/dist/ui/assets/{git-config-47_ySgKl.js → git-config-DcQbkikl.js} +0 -0
  209. /package/dist/ui/assets/{github-copilot-headers-CTUP_cqn.js → github-copilot-headers-C5CocKfn.js} +0 -0
  210. /package/dist/ui/assets/{global-db-CMspJ2t8.js → global-db-DL3jdM9H.js} +0 -0
  211. /package/dist/ui/assets/{hash-B9Dtr1VK.js → hash-iitWbNjK.js} +0 -0
  212. /package/dist/ui/assets/{headers-AeYLn7L4.js → headers-qDMOQQGF.js} +0 -0
  213. /package/dist/ui/assets/{index-CvlDeETm.css → main-CvlDeETm.css} +0 -0
  214. /package/dist/ui/assets/{openai-Bf1npfRy.js → openai-BR_xAflc.js} +0 -0
  215. /package/dist/ui/assets/{page-storage-sync-3GLxly8J.js → page-storage-sync-sv2ogNKh.js} +0 -0
  216. /package/dist/ui/assets/{rum-CY2gBT8x.js → rum-z5wz4Dnj.js} +0 -0
  217. /package/dist/ui/assets/{sanitize-unicode-h0KEBmEw.js → sanitize-unicode-B1z_Y4Dq.js} +0 -0
  218. /package/dist/ui/assets/{sprinkle-bridge-channel-DAHSl7rf.js → sprinkle-bridge-channel-ChD0T07C.js} +0 -0
  219. /package/dist/ui/assets/{src-BQRb5emh.js → src-DRmQ1wr-.js} +0 -0
  220. /package/dist/ui/assets/{xai-grok-errors-DQQRqci0.js → xai-grok-errors-BdY43UIn.js} +0 -0
  221. /package/dist/ui/assets/{xai-grok-models-D7n8nh39.js → xai-grok-models-C9MIa-Aj.js} +0 -0
  222. /package/dist/ui/assets/{xterm-4j9yS4Tj.js → xterm-VndicwFp.js} +0 -0
@@ -22,10 +22,30 @@ import { SecretProxyManager } from './secrets/proxy-manager.js';
22
22
  import { OauthSecretStore } from './secrets/oauth-secret-store.js';
23
23
  import { handleDaSignAndForward, handleS3SignAndForward } from './secrets/sign-and-forward.js';
24
24
  import { readOrCreateSessionId } from './secrets/session-id-file.js';
25
+ import { registerCloudStatusEndpoint } from './cloud-status.js';
26
+ import { registerHostedBootstrapEndpoint } from './hosted-bootstrap.js';
27
+ import { createHttpCdp, registerLeaderRestartEndpoint } from './leader-restart.js';
25
28
  import { FETCH_PROXY_SKIP_HEADERS } from './fetch-proxy-headers.js';
26
29
  import { buildLocalApiDescriptor, sliccLinksMiddleware } from './links-middleware.js';
30
+ import { parseCloudArgs } from './cloud/dispatch.js';
31
+ import { createSubstrate } from './_cloud_core/src/index.js';
32
+ import { FileRegistry } from './cloud/registry-file.js';
33
+ import { runStart } from './cloud/start.js';
34
+ import { runList } from './cloud/list.js';
35
+ import { runPause } from './cloud/pause.js';
36
+ import { runResume } from './cloud/resume.js';
37
+ import { runKill } from './cloud/kill.js';
38
+ import { promises as fsPromises } from 'node:fs';
27
39
  const __dirname = fileURLToPath(new URL('.', import.meta.url));
28
40
  const PROJECT_ROOT = resolve(__dirname, '..', '..');
41
+ // ---------------------------------------------------------------------------
42
+ // Cloud dispatcher — must run BEFORE any other boot logic
43
+ // ---------------------------------------------------------------------------
44
+ const _parsedCloudArgs = parseCloudArgs(process.argv.slice(2));
45
+ if (_parsedCloudArgs) {
46
+ await runCloudSubcommand(_parsedCloudArgs);
47
+ process.exit(0);
48
+ }
29
49
  const RUNTIME_FLAGS = parseCliRuntimeFlags(process.argv.slice(2));
30
50
  // Version command — exit immediately, no side effects
31
51
  if (RUNTIME_FLAGS.version) {
@@ -420,6 +440,11 @@ async function main() {
420
440
  join: RUNTIME_FLAGS.join,
421
441
  joinUrl: RUNTIME_FLAGS.joinUrl,
422
442
  });
443
+ // Append runtime parameter for hosted mode
444
+ if (RUNTIME_FLAGS.hosted) {
445
+ const sep = browserLaunchUrl.includes('?') ? '&' : '?';
446
+ browserLaunchUrl += `${sep}runtime=hosted-leader`;
447
+ }
423
448
  // Append optional prompt parameter
424
449
  if (RUNTIME_FLAGS.prompt) {
425
450
  const sep = browserLaunchUrl.includes('?') ? '&' : '?';
@@ -433,12 +458,17 @@ async function main() {
433
458
  }
434
459
  const chromeProfile = (() => {
435
460
  try {
436
- return resolveChromeLaunchProfile({
461
+ const resolved = resolveChromeLaunchProfile({
437
462
  projectRoot: PROJECT_ROOT,
438
463
  tmpDir: process.env['TMPDIR'] ?? '/tmp',
439
464
  profile: RUNTIME_FLAGS.profile,
440
465
  servePort: SERVE_PORT,
441
466
  });
467
+ // Override user data dir in hosted mode to use persistent profile
468
+ if (RUNTIME_FLAGS.hosted) {
469
+ resolved.userDataDir = process.env['CHROME_USER_DATA_DIR'] ?? '/data/profile';
470
+ }
471
+ return resolved;
442
472
  }
443
473
  catch (error) {
444
474
  console.error(error instanceof Error ? error.message : String(error));
@@ -471,6 +501,7 @@ async function main() {
471
501
  cdpPort: REQUESTED_CDP_PORT,
472
502
  launchUrl: browserLaunchUrl,
473
503
  profile: chromeProfile,
504
+ hosted: RUNTIME_FLAGS.hosted,
474
505
  });
475
506
  // Profile directories are reused across runs (both the dev
476
507
  // `/tmp/browser-coding-agent-chrome` profile and the persistent
@@ -678,7 +709,10 @@ async function main() {
678
709
  }));
679
710
  app.get('/api/runtime-config', (_req, res) => {
680
711
  res.json({
681
- trayWorkerBaseUrl: RUNTIME_FLAGS.leadWorkerBaseUrl ??
712
+ trayWorkerBaseUrl:
713
+ // Hosted mode source: env var injected at sandbox-create time.
714
+ (RUNTIME_FLAGS.hosted ? process.env['SLICC_TRAY_WORKER_BASE_URL']?.trim() : null) ??
715
+ RUNTIME_FLAGS.leadWorkerBaseUrl ??
682
716
  (process.env['WORKER_BASE_URL']?.trim() || null) ??
683
717
  (DEV_MODE
684
718
  ? 'https://slicc-tray-hub-staging.minivelos.workers.dev'
@@ -992,6 +1026,14 @@ async function main() {
992
1026
  await secretProxy.reload();
993
1027
  res.status(204).end();
994
1028
  });
1029
+ // Cloud status endpoint (hosted-only) — writes join info to /tmp/slicc-join.json
1030
+ // Register BEFORE Chromium launches. The webapp's first action after
1031
+ // ?runtime=hosted-leader boot is to mint a tray and POST /api/cloud-status.
1032
+ // If the route doesn't exist yet, the post 404s and the CLI poll times out.
1033
+ if (RUNTIME_FLAGS.hosted) {
1034
+ registerCloudStatusEndpoint(app, { joinFilePath: '/tmp/slicc-join.json' });
1035
+ registerHostedBootstrapEndpoint(app, { secretStore });
1036
+ }
995
1037
  // Fetch proxy — forwards cross-origin requests from the browser to bypass CORS.
996
1038
  // Used by just-bash's curl which calls the browser's fetch() API.
997
1039
  // Note: express.json() may have already parsed the body, so we check req.body first.
@@ -1064,6 +1106,17 @@ async function main() {
1064
1106
  // Only strip browser's auto-added localhost origin, preserve legitimate origins
1065
1107
  delete headers['origin'];
1066
1108
  }
1109
+ // Default-Origin fallback: when no explicit caller Origin survives, synthesize
1110
+ // one from the target URL so upstream CORS-protected APIs see a real Origin
1111
+ // instead of nothing. Caller-supplied X-Proxy-Origin (handled above) still wins.
1112
+ if (!headers['origin']) {
1113
+ try {
1114
+ headers['origin'] = new URL(targetUrl).origin;
1115
+ }
1116
+ catch {
1117
+ // Malformed targetUrl — leave origin unset; the upstream fetch will fail anyway.
1118
+ }
1119
+ }
1067
1120
  // Forbidden-header transport: restore X-Proxy-Referer → Referer
1068
1121
  const proxyReferer = req.headers['x-proxy-referer'];
1069
1122
  if (proxyReferer) {
@@ -1304,7 +1357,7 @@ async function main() {
1304
1357
  });
1305
1358
  // Create the HTTP server BEFORE Vite so we can register our upgrade handler first
1306
1359
  const server = createServer(app);
1307
- if (DEV_MODE) {
1360
+ if (DEV_MODE && !RUNTIME_FLAGS.hosted) {
1308
1361
  // Dev mode: use Vite's dev server as middleware for HMR
1309
1362
  const { createServer: createViteServer } = await import('vite');
1310
1363
  const webappIndexHtml = resolve(process.cwd(), 'packages/webapp/index.html');
@@ -1730,6 +1783,14 @@ async function main() {
1730
1783
  console.log(`[cdp-proxy] Pre-connected: CDP available at ${cdpUrl}`);
1731
1784
  await ensureChromeConnection(cdpUrl);
1732
1785
  console.log('[cdp-proxy] Chrome WebSocket ready (pre-warmed)');
1786
+ // Register leader-restart endpoint now that CDP is ready (hosted mode only)
1787
+ if (RUNTIME_FLAGS.hosted) {
1788
+ registerLeaderRestartEndpoint(app, {
1789
+ cdp: createHttpCdp(CDP_PORT),
1790
+ localUrlPrefix: `http://localhost:${SERVE_PORT}/`,
1791
+ });
1792
+ console.log('[hosted] /api/leader-restart endpoint registered');
1793
+ }
1733
1794
  }
1734
1795
  catch (err) {
1735
1796
  console.log('[cdp-proxy] Pre-connect failed (will retry on first client):', err);
@@ -1762,6 +1823,99 @@ async function main() {
1762
1823
  }
1763
1824
  });
1764
1825
  }
1826
+ // ---------------------------------------------------------------------------
1827
+ // Cloud dispatcher helpers
1828
+ // ---------------------------------------------------------------------------
1829
+ async function readSecretsEnvKey(name) {
1830
+ try {
1831
+ const home = process.env['HOME'] ?? process.env['USERPROFILE'] ?? '.';
1832
+ const file = process.env['SLICC_SECRETS_FILE'] ?? join(home, '.slicc', 'secrets.env');
1833
+ const contents = await fsPromises.readFile(file, 'utf-8');
1834
+ for (const line of contents.split('\n')) {
1835
+ const m = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/.exec(line);
1836
+ if (m && m[1] === name)
1837
+ return m[2].trim();
1838
+ }
1839
+ }
1840
+ catch {
1841
+ /* file missing → undefined */
1842
+ }
1843
+ return undefined;
1844
+ }
1845
+ function defaultSecretsPath() {
1846
+ const home = process.env['HOME'] ?? process.env['USERPROFILE'] ?? '.';
1847
+ return join(home, '.slicc', 'secrets.env');
1848
+ }
1849
+ function readPackageVersion() {
1850
+ try {
1851
+ const pkgPath = join(PROJECT_ROOT, 'package.json');
1852
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
1853
+ return pkg.version;
1854
+ }
1855
+ catch {
1856
+ return 'unknown';
1857
+ }
1858
+ }
1859
+ async function runCloudSubcommand(parsed) {
1860
+ const apiKey = process.env['E2B_API_KEY'] ?? (await readSecretsEnvKey('E2B_API_KEY'));
1861
+ if (!apiKey) {
1862
+ console.error('E2B_API_KEY not set. Add it to ~/.slicc/secrets.env (with E2B_API_KEY_DOMAINS=e2b.dev) ' +
1863
+ 'or export it.');
1864
+ process.exit(2);
1865
+ }
1866
+ const substrate = createSubstrate(parsed.args.substrate, { apiKey });
1867
+ const registryPath = FileRegistry.defaultPath();
1868
+ const localSliccVersion = readPackageVersion();
1869
+ switch (parsed.subcommand) {
1870
+ case 'start': {
1871
+ const result = await runStart({
1872
+ substrate,
1873
+ envFilePath: parsed.args.envFile ?? defaultSecretsPath(),
1874
+ registryPath,
1875
+ workerBaseUrl: process.env['SLICC_TRAY_WORKER_BASE_URL']?.trim() || 'https://www.sliccy.ai',
1876
+ sliccVersion: localSliccVersion,
1877
+ name: parsed.args.name,
1878
+ });
1879
+ console.log(`Sandbox ${result.sandboxId} ready.`);
1880
+ console.log(`Open: ${result.joinUrl}`);
1881
+ console.log('Attach from iOS, desktop SLICC, or any browser tab.');
1882
+ break;
1883
+ }
1884
+ case 'list': {
1885
+ const entries = await runList({ substrate, registryPath });
1886
+ for (const e of entries) {
1887
+ console.log(`${e.substrate}\t${e.sandboxId}\t${e.name ?? '-'}\t${e.state}\t${e.joinUrl}`);
1888
+ }
1889
+ break;
1890
+ }
1891
+ case 'pause':
1892
+ await runPause({ substrate, registryPath, query: parsed.args.query });
1893
+ console.log('Paused.');
1894
+ break;
1895
+ case 'resume': {
1896
+ const result = await runResume({
1897
+ substrate,
1898
+ envFilePath: parsed.args.envFile ?? defaultSecretsPath(),
1899
+ registryPath,
1900
+ query: parsed.args.query,
1901
+ localSliccVersion,
1902
+ });
1903
+ if (result.versionMismatch) {
1904
+ console.warn(`Warning: running sandbox is sliccVersion=${result.versionMismatch.running}, ` +
1905
+ `local CLI is ${result.versionMismatch.local}. Proceeding anyway.`);
1906
+ }
1907
+ if (result.trayRebuilt) {
1908
+ console.warn('Tray was rebuilt; existing followers must re-attach to the new join URL.');
1909
+ }
1910
+ console.log(`Resumed. Open: ${result.joinUrl}`);
1911
+ break;
1912
+ }
1913
+ case 'kill':
1914
+ await runKill({ substrate, registryPath, query: parsed.args.query });
1915
+ console.log('Killed.');
1916
+ break;
1917
+ }
1918
+ }
1765
1919
  main().catch((err) => {
1766
1920
  console.error('Fatal error:', err);
1767
1921
  const errorData = err instanceof Error
@@ -0,0 +1,29 @@
1
+ import { type Express } from 'express';
2
+ export interface CdpTargetInfo {
3
+ id?: string;
4
+ targetId?: string;
5
+ type: string;
6
+ url: string;
7
+ attached: boolean;
8
+ }
9
+ export interface CdpLike {
10
+ send(method: string, params?: unknown, sessionId?: string): Promise<unknown>;
11
+ }
12
+ export declare function findSliccPageTarget(targets: CdpTargetInfo[], localUrlPrefix: string): CdpTargetInfo | null;
13
+ export type RestartResult = {
14
+ ok: true;
15
+ } | {
16
+ ok: false;
17
+ code: 'NO_LEADER_TAB' | 'CDP_NOT_READY' | 'CDP_ERROR' | 'INTERNAL';
18
+ message: string;
19
+ };
20
+ export declare function restartLeader(cdp: CdpLike, localUrlPrefix: string): Promise<RestartResult>;
21
+ /**
22
+ * HTTP-backed CdpLike. Implements Target.getTargets via the CDP HTTP /json
23
+ * endpoint. Target.attachToTarget + Page.reload are sent over WebSocket.
24
+ */
25
+ export declare function createHttpCdp(cdpPort: number): CdpLike;
26
+ export declare function registerLeaderRestartEndpoint(app: Express, options: {
27
+ cdp: CdpLike;
28
+ localUrlPrefix: string;
29
+ }): void;
@@ -0,0 +1,146 @@
1
+ import { requireLoopback } from './cloud-status.js';
2
+ import { WebSocket } from 'ws';
3
+ export function findSliccPageTarget(targets, localUrlPrefix) {
4
+ const candidates = targets.filter((t) => t.type === 'page' && t.url.startsWith(localUrlPrefix));
5
+ if (candidates.length === 0)
6
+ return null;
7
+ return candidates.find((t) => t.attached) ?? candidates[0];
8
+ }
9
+ export async function restartLeader(cdp, localUrlPrefix) {
10
+ let targets;
11
+ try {
12
+ const result = (await cdp.send('Target.getTargets'));
13
+ targets = result.targetInfos;
14
+ }
15
+ catch (err) {
16
+ const msg = err instanceof Error ? err.message : String(err);
17
+ // ECONNREFUSED / timeout / fetch failure → CDP cold-starting (retriable 503).
18
+ // Other failures (malformed response, protocol error) → fatal (500).
19
+ const isTransient = /ECONNREFUSED|timeout|fetch failed|ETIMEDOUT|ENOTFOUND/i.test(msg);
20
+ return {
21
+ ok: false,
22
+ code: isTransient ? 'CDP_NOT_READY' : 'CDP_ERROR',
23
+ message: msg,
24
+ };
25
+ }
26
+ const target = findSliccPageTarget(targets, localUrlPrefix);
27
+ if (!target)
28
+ return { ok: false, code: 'NO_LEADER_TAB', message: 'no SLICC page target found' };
29
+ const tid = target.targetId ?? target.id;
30
+ if (!tid)
31
+ return { ok: false, code: 'INTERNAL', message: 'target missing id' };
32
+ try {
33
+ const { sessionId } = (await cdp.send('Target.attachToTarget', {
34
+ targetId: tid,
35
+ flatten: true,
36
+ }));
37
+ await cdp.send('Page.reload', { ignoreCache: false }, sessionId);
38
+ return { ok: true };
39
+ }
40
+ catch (err) {
41
+ return { ok: false, code: 'INTERNAL', message: String(err) };
42
+ }
43
+ }
44
+ class CdpClient {
45
+ socket;
46
+ nextId = 1;
47
+ pending = new Map();
48
+ constructor(socket) {
49
+ this.socket = socket;
50
+ socket.on('message', (data) => {
51
+ const msg = JSON.parse(data.toString());
52
+ if (msg.id === undefined)
53
+ return; // event, not a response
54
+ const p = this.pending.get(msg.id);
55
+ if (!p)
56
+ return;
57
+ this.pending.delete(msg.id);
58
+ if (msg.error)
59
+ p.reject(new Error(msg.error.message));
60
+ else
61
+ p.resolve(msg.result);
62
+ });
63
+ }
64
+ async send(method, params, sessionId) {
65
+ const id = this.nextId++;
66
+ const frame = JSON.stringify({ id, method, params, ...(sessionId ? { sessionId } : {}) });
67
+ return new Promise((resolve, reject) => {
68
+ this.pending.set(id, { resolve, reject });
69
+ this.socket.send(frame, (err) => {
70
+ if (err) {
71
+ this.pending.delete(id);
72
+ reject(err);
73
+ }
74
+ });
75
+ });
76
+ }
77
+ close() {
78
+ this.socket.close();
79
+ }
80
+ }
81
+ async function openCdpClient(webSocketDebuggerUrl) {
82
+ const socket = new WebSocket(webSocketDebuggerUrl);
83
+ await new Promise((resolve, reject) => {
84
+ socket.once('open', () => resolve());
85
+ socket.once('error', (err) => reject(err));
86
+ });
87
+ return new CdpClient(socket);
88
+ }
89
+ /**
90
+ * HTTP-backed CdpLike. Implements Target.getTargets via the CDP HTTP /json
91
+ * endpoint. Target.attachToTarget + Page.reload are sent over WebSocket.
92
+ */
93
+ export function createHttpCdp(cdpPort) {
94
+ let cachedClient = null;
95
+ let cachedWebSocketUrl = null;
96
+ return {
97
+ async send(method, params, sessionId) {
98
+ if (method === 'Target.getTargets') {
99
+ const res = await fetch(`http://127.0.0.1:${cdpPort}/json`);
100
+ const list = (await res.json());
101
+ // Stash the first page's ws url for subsequent send() calls in
102
+ // the same restartLeader cycle.
103
+ cachedWebSocketUrl =
104
+ list.find((t) => t.type === 'page' && t.webSocketDebuggerUrl)?.webSocketDebuggerUrl ??
105
+ null;
106
+ return {
107
+ targetInfos: list.map((t) => ({
108
+ id: t.id,
109
+ type: t.type,
110
+ url: t.url,
111
+ attached: Boolean(t.webSocketDebuggerUrl),
112
+ })),
113
+ };
114
+ }
115
+ if (!cachedClient) {
116
+ if (!cachedWebSocketUrl) {
117
+ throw new Error('createHttpCdp: no ws url cached — call Target.getTargets first');
118
+ }
119
+ cachedClient = await openCdpClient(cachedWebSocketUrl);
120
+ }
121
+ try {
122
+ return await cachedClient.send(method, params, sessionId);
123
+ }
124
+ finally {
125
+ if (method === 'Page.reload') {
126
+ // Reload severs the session; drop the client so the next
127
+ // restartLeader cycle re-opens.
128
+ cachedClient.close();
129
+ cachedClient = null;
130
+ cachedWebSocketUrl = null;
131
+ }
132
+ }
133
+ },
134
+ };
135
+ }
136
+ export function registerLeaderRestartEndpoint(app, options) {
137
+ app.post('/api/leader-restart', requireLoopback, async (_req, res) => {
138
+ const result = await restartLeader(options.cdp, options.localUrlPrefix);
139
+ if (result.ok) {
140
+ res.json({ ok: true });
141
+ return;
142
+ }
143
+ const status = result.code === 'NO_LEADER_TAB' || result.code === 'CDP_NOT_READY' ? 503 : 500;
144
+ res.status(status).json({ error: result.code, message: result.message });
145
+ });
146
+ }
@@ -20,6 +20,7 @@ export interface CliRuntimeFlags {
20
20
  /** Path to a .env file for secrets */
21
21
  envFile: string | null;
22
22
  version: boolean;
23
+ hosted: boolean;
23
24
  }
24
25
  export declare const DEFAULT_CLI_CDP_PORT = 9222;
25
26
  export declare const DEFAULT_ELECTRON_ATTACH_CDP_PORT = 9223;
@@ -22,6 +22,7 @@ export function parseCliRuntimeFlags(argv) {
22
22
  let prompt = null;
23
23
  let envFile = null;
24
24
  let version = false;
25
+ let hosted = false;
25
26
  for (let index = 0; index < argv.length; index += 1) {
26
27
  const arg = argv[index];
27
28
  if (arg === 'version' || arg === '--version' || arg === '-v') {
@@ -36,6 +37,10 @@ export function parseCliRuntimeFlags(argv) {
36
37
  serveOnly = true;
37
38
  continue;
38
39
  }
40
+ if (arg === '--hosted') {
41
+ hosted = true;
42
+ continue;
43
+ }
39
44
  if (arg.startsWith('--cdp-port=')) {
40
45
  const value = Number.parseInt(arg.slice('--cdp-port='.length), 10);
41
46
  if (Number.isFinite(value) && value > 0) {
@@ -171,5 +176,6 @@ export function parseCliRuntimeFlags(argv) {
171
176
  prompt,
172
177
  envFile,
173
178
  version,
179
+ hosted,
174
180
  };
175
181
  }
@@ -1 +1 @@
1
- import{F as e,G as t,H as n,M as r,P as i,R as a,V as o,h as s,j as c,p as l,t as u,v as d}from"./kernel-worker-7oVJDvYj.js";import{getOAuthPageOrigin as f}from"./oauth-service-Copu_4SG.js";const p=Object.assign({"/packages/webapp/providers/adobe-config.json":{proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`}})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function m(){let e=s(`adobe`);if(e)return e.replace(/\/$/,``);if(p.proxyEndpoint)return p.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}const h=new Map,g=new Map;async function _(e){let t=h.get(e);if(t)return t;try{let t=await fetch(`${e}/v1/config`,{headers:{[M]:`3.5.5`}});if(t.ok){let n=await t.json();return h.set(e,n),n}console.warn(`[adobe] Proxy /v1/config returned ${t.status}, falling back to build-time config`)}catch(e){console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e))}let n={};return h.set(e,n),n}function v(e){let t=e.clientId||p.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 y(e){return e.scopes||p.scopes}function b(e){return e.imsEnvironment||p.imsEnvironment||`prod`}const x={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function S(e){return x[e??p.imsEnvironment??`prod`]??x.prod}const C=typeof chrome<`u`&&!!chrome?.runtime?.id;function w(){return l().find(e=>e.providerId===`adobe`)}async function T(e,t){try{let n=await fetch(`${S(t)}/ims/userinfo/v2`,{headers:{Authorization:`Bearer ${e}`}});if(n.ok){let e=await n.json();return{name:e.displayName||e.name||e.email,avatar:e.picture||e.avatar_url}}console.warn(`[adobe] User profile fetch returned ${n.status}, account will have no display name`)}catch(e){console.warn(`[adobe] Failed to fetch user profile:`,e instanceof Error?e.message:String(e))}return{}}function E(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)}:null}const D={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!p.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`],getModelIds:()=>{let e=e=>{let t={id:e.id,name:e.name??e.id},n=g.get(e.id);return n?.api&&(t.api=n.api),n?.context_window!==void 0&&(t.context_window=n.context_window),n?.max_tokens!==void 0&&(t.max_tokens=n.max_tokens),n?.reasoning!==void 0&&(t.reasoning=n.reasoning),n?.input&&(t.input=n.input),/haiku/i.test(e.id)&&(t.compat={supportsEagerToolInputStreaming:!1}),t};for(let t of V.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id}));try{localStorage.setItem(`slicc-adobe-models`,JSON.stringify(n))}catch{}return n}for(let t of h.values())if(t.models?.length)return t.models.map(e);try{let e=localStorage.getItem(`slicc-adobe-models`);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)=>{let n=m(),r=await _(n),i=v(r),a=y(r),o=b(r),s=C?null:await f(),c=C?p.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:p.redirectUri??`${s.origin}/auth/callback`,l=C?void 0:btoa(JSON.stringify({port:parseInt(new URL(s.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),u=l?JSON.parse(atob(l)).nonce:null,h=new URLSearchParams({client_id:i,scope:a,response_type:`token`,redirect_uri:c});l&&h.set(`state`,l);let g=await e(`${S(o)}/ims/authorize/v2?${h}`);if(!g)return;if(u&&g)try{if(new URL(g).searchParams.get(`nonce`)!==u){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 x=E(g);if(!x){console.error(`[adobe] Could not extract token from redirect URL`);return}let w=await T(x.accessToken,o);await d({providerId:`adobe`,accessToken:x.accessToken,tokenExpiresAt:Date.now()+x.expiresIn*1e3,userName:w.name,userAvatar:w.avatar,baseUrl:p.proxyEndpoint?void 0:n}),await H().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),t()},onOAuthLogout:async()=>{let e=w();if(e?.accessToken)try{let t=h.values().next().value??{},n=t.clientId||p.clientId,r=b(t);if(n){let t=await fetch(`${S(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 d({providerId:`adobe`,accessToken:``})},onSilentRenew:async()=>w()?.accessToken?j():null};let O=null;async function k(){let e=w();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...`);try{let e=await j();if(e)return e}catch(e){console.warn(`[adobe] Silent renewal failed:`,e instanceof Error?e.message:String(e))}let t=w();if((t?.tokenExpiresAt??0)-Date.now()>0&&t?.accessToken)return t.accessToken;throw Error(`Adobe session expired — please log in again`)}function A(){let e=w();return e?.tokenExpiresAt?Date.now()>e.tokenExpiresAt-6e4:!0}async function j(){return typeof window>`u`?null:O||(O=(async()=>{try{let e=m(),t=await _(e),n=v(t),r=y(t),i=b(t),a=C?p.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:p.redirectUri??`${window.location.origin}/auth/callback`,o=C?void 0:btoa(JSON.stringify({port:parseInt(new URL(window.location.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),s=o?JSON.parse(atob(o)).nonce:null,c=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:a,prompt:`none`});o&&c.set(`state`,o);let l=`${S(i)}/ims/authorize/v2?${c}`,{createOAuthLauncher:u}=await import(`./oauth-service-Copu_4SG.js`),f=await u()(l);if(!f)return null;if(s&&f)try{if(new URL(f).searchParams.get(`nonce`)!==s)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),null}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let h=E(f);if(!h)return null;let g=w();return await d({providerId:`adobe`,accessToken:h.accessToken,tokenExpiresAt:Date.now()+h.expiresIn*1e3,userName:g?.userName,userAvatar:g?.userAvatar,baseUrl:p.proxyEndpoint?void 0:e}),console.log(`[adobe] Token renewed silently`),await H().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),h.accessToken}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}finally{O=null}})(),O)}const M=`X-Slicc-Version`;function N(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[M]=`3.5.5`,{...e,headers:t}}const P=new Set;function F(e,t){if(e.headers){for(let t of Object.keys(e.headers))if(t.toLowerCase()===`x-session-id`)return e}return P.has(t)||(P.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":u(`adobe-provider-fallback`)}}}function I(){P.clear()}function L(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()}}}const R=(e,t,n={})=>{let i=a();return(async()=>{try{let a=await k();if(String(e.api).includes(`openai`)){let o=r({...e,baseUrl:`${m()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,N(F({...n,apiKey:a},`streamAdobe[openai]`)));for await(let e of o)i.push(e)}else{let r=c({...e,baseUrl:m(),api:`anthropic-messages`},t,N(F({...n,apiKey:a},`streamAdobe[anthropic]`)));for await(let e of r)i.push(e)}i.end()}catch(t){console.error(`[adobe] Stream error:`,t instanceof Error?t.message:String(t)),i.push(L(e,t)),i.end()}})(),i},z=(t,n,r)=>{let o=a();return(async()=>{try{let a=await k();if(String(t.api).includes(`openai`)){let i=e({...t,baseUrl:`${m()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},n,N(F({...r,apiKey:a},`streamSimpleAdobe[openai]`)));for await(let e of i)o.push(e)}else{let e=i({...t,baseUrl:m(),api:`anthropic-messages`},n,N(F({...r,apiKey:a},`streamSimpleAdobe[anthropic]`)));for await(let t of e)o.push(t)}o.end()}catch(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e)),o.push(L(t,e)),o.end()}})(),o};async function B(){try{let e=await k(),t=m(),r=await fetch(`${t}/v1/models`,{headers:{Authorization:`Bearer ${e}`,[M]:`3.5.5`}});if(r.ok){let e=await r.json();if(e.data?.length){for(let t of e.data){let e={id:t.id,name:t.name};t.api!==void 0&&(e.api=t.api),t.context_window!==void 0&&(e.context_window=t.context_window),t.max_tokens!==void 0&&(e.max_tokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),g.set(t.id,e)}let r=new Map;for(let e of n())try{for(let t of o(e))r.set(t.id,t)}catch{}return e.data.map(e=>{let n=r.get(e.id),i=`adobe-${e.api===`openai`?`openai`:`anthropic`}`;return n?{...n,provider:`adobe`,api:i}:{id:e.id,name:e.name??e.id,provider:`adobe`,api:i,baseUrl:t,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},inputCost:0,outputCost:0,cacheReadCost:0,cacheWriteCost:0,reasoning:!0}})}}else console.warn(`[adobe] Proxy /v1/models returned ${r.status}, falling back to Anthropic models`)}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return o(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}const V=new Map;async function H(){let e=m(),t=V.get(e);if(t)return t;let n=await B();return V.set(e,n),n}function U(){t({api:`adobe-anthropic`,stream:R,streamSimple:z}),t({api:`adobe-openai`,stream:R,streamSimple:z})}export{I as __resetAdobeSessionIdWarningCacheForTests,D as config,H as getAdobeModels,k as getValidAccessToken,A as isTokenExpired,U as register};
1
+ import{F as e,G as t,H as n,M as r,P as i,R as a,V as o,h as s,j as c,p as l,t as u,v as d}from"./kernel-worker-C5VWVo3p.js";import{getOAuthPageOrigin as f}from"./oauth-service-v9k7zmDr.js";const p=Object.assign({"/packages/webapp/providers/adobe-config.json":{proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`}})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function m(){let e=s(`adobe`);if(e)return e.replace(/\/$/,``);if(p.proxyEndpoint)return p.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}const h=new Map,g=new Map;async function _(e){let t=h.get(e);if(t)return t;try{let t=await fetch(`${e}/v1/config`,{headers:{[M]:`3.7.0`}});if(t.ok){let n=await t.json();return h.set(e,n),n}console.warn(`[adobe] Proxy /v1/config returned ${t.status}, falling back to build-time config`)}catch(e){console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e))}let n={};return h.set(e,n),n}function v(e){let t=e.clientId||p.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 y(e){return e.scopes||p.scopes}function b(e){return e.imsEnvironment||p.imsEnvironment||`prod`}const x={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function S(e){return x[e??p.imsEnvironment??`prod`]??x.prod}const C=typeof chrome<`u`&&!!chrome?.runtime?.id;function w(){return l().find(e=>e.providerId===`adobe`)}async function T(e,t){try{let n=await fetch(`${S(t)}/ims/userinfo/v2`,{headers:{Authorization:`Bearer ${e}`}});if(n.ok){let e=await n.json();return{name:e.displayName||e.name||e.email,avatar:e.picture||e.avatar_url}}console.warn(`[adobe] User profile fetch returned ${n.status}, account will have no display name`)}catch(e){console.warn(`[adobe] Failed to fetch user profile:`,e instanceof Error?e.message:String(e))}return{}}function E(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)}:null}const D={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!p.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`],getModelIds:()=>{let e=e=>{let t={id:e.id,name:e.name??e.id},n=g.get(e.id);return n?.api&&(t.api=n.api),n?.context_window!==void 0&&(t.context_window=n.context_window),n?.max_tokens!==void 0&&(t.max_tokens=n.max_tokens),n?.reasoning!==void 0&&(t.reasoning=n.reasoning),n?.input&&(t.input=n.input),/haiku/i.test(e.id)&&(t.compat={supportsEagerToolInputStreaming:!1}),t};for(let t of V.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id}));try{localStorage.setItem(`slicc-adobe-models`,JSON.stringify(n))}catch{}return n}for(let t of h.values())if(t.models?.length)return t.models.map(e);try{let e=localStorage.getItem(`slicc-adobe-models`);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)=>{let n=m(),r=await _(n),i=v(r),a=y(r),o=b(r),s=C?null:await f(),c=C?p.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:p.redirectUri??`${s.origin}/auth/callback`,l=C?void 0:btoa(JSON.stringify({port:parseInt(new URL(s.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),u=l?JSON.parse(atob(l)).nonce:null,h=new URLSearchParams({client_id:i,scope:a,response_type:`token`,redirect_uri:c});l&&h.set(`state`,l);let g=await e(`${S(o)}/ims/authorize/v2?${h}`);if(!g)return;if(u&&g)try{if(new URL(g).searchParams.get(`nonce`)!==u){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 x=E(g);if(!x){console.error(`[adobe] Could not extract token from redirect URL`);return}let w=await T(x.accessToken,o);await d({providerId:`adobe`,accessToken:x.accessToken,tokenExpiresAt:Date.now()+x.expiresIn*1e3,userName:w.name,userAvatar:w.avatar,baseUrl:p.proxyEndpoint?void 0:n}),await H().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),t()},onOAuthLogout:async()=>{let e=w();if(e?.accessToken)try{let t=h.values().next().value??{},n=t.clientId||p.clientId,r=b(t);if(n){let t=await fetch(`${S(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 d({providerId:`adobe`,accessToken:``})},onSilentRenew:async()=>w()?.accessToken?j():null};let O=null;async function k(){let e=w();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...`);try{let e=await j();if(e)return e}catch(e){console.warn(`[adobe] Silent renewal failed:`,e instanceof Error?e.message:String(e))}let t=w();if((t?.tokenExpiresAt??0)-Date.now()>0&&t?.accessToken)return t.accessToken;throw Error(`Adobe session expired — please log in again`)}function A(){let e=w();return e?.tokenExpiresAt?Date.now()>e.tokenExpiresAt-6e4:!0}async function j(){return typeof window>`u`?null:O||(O=(async()=>{try{let e=m(),t=await _(e),n=v(t),r=y(t),i=b(t),a=C?p.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:p.redirectUri??`${window.location.origin}/auth/callback`,o=C?void 0:btoa(JSON.stringify({port:parseInt(new URL(window.location.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),s=o?JSON.parse(atob(o)).nonce:null,c=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:a,prompt:`none`});o&&c.set(`state`,o);let l=`${S(i)}/ims/authorize/v2?${c}`,{createOAuthLauncher:u}=await import(`./oauth-service-v9k7zmDr.js`),f=await u()(l);if(!f)return null;if(s&&f)try{if(new URL(f).searchParams.get(`nonce`)!==s)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),null}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let h=E(f);if(!h)return null;let g=w();return await d({providerId:`adobe`,accessToken:h.accessToken,tokenExpiresAt:Date.now()+h.expiresIn*1e3,userName:g?.userName,userAvatar:g?.userAvatar,baseUrl:p.proxyEndpoint?void 0:e}),console.log(`[adobe] Token renewed silently`),await H().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),h.accessToken}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}finally{O=null}})(),O)}const M=`X-Slicc-Version`;function N(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[M]=`3.7.0`,{...e,headers:t}}const P=new Set;function F(e,t){if(e.headers){for(let t of Object.keys(e.headers))if(t.toLowerCase()===`x-session-id`)return e}return P.has(t)||(P.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":u(`adobe-provider-fallback`)}}}function I(){P.clear()}function L(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()}}}const R=(e,t,n={})=>{let i=a();return(async()=>{try{let a=await k();if(String(e.api).includes(`openai`)){let o=r({...e,baseUrl:`${m()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,N(F({...n,apiKey:a},`streamAdobe[openai]`)));for await(let e of o)i.push(e)}else{let r=c({...e,baseUrl:m(),api:`anthropic-messages`},t,N(F({...n,apiKey:a},`streamAdobe[anthropic]`)));for await(let e of r)i.push(e)}i.end()}catch(t){console.error(`[adobe] Stream error:`,t instanceof Error?t.message:String(t)),i.push(L(e,t)),i.end()}})(),i},z=(t,n,r)=>{let o=a();return(async()=>{try{let a=await k();if(String(t.api).includes(`openai`)){let i=e({...t,baseUrl:`${m()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},n,N(F({...r,apiKey:a},`streamSimpleAdobe[openai]`)));for await(let e of i)o.push(e)}else{let e=i({...t,baseUrl:m(),api:`anthropic-messages`},n,N(F({...r,apiKey:a},`streamSimpleAdobe[anthropic]`)));for await(let t of e)o.push(t)}o.end()}catch(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e)),o.push(L(t,e)),o.end()}})(),o};async function B(){try{let e=await k(),t=m(),r=await fetch(`${t}/v1/models`,{headers:{Authorization:`Bearer ${e}`,[M]:`3.7.0`}});if(r.ok){let e=await r.json();if(e.data?.length){for(let t of e.data){let e={id:t.id,name:t.name};t.api!==void 0&&(e.api=t.api),t.context_window!==void 0&&(e.context_window=t.context_window),t.max_tokens!==void 0&&(e.max_tokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),g.set(t.id,e)}let r=new Map;for(let e of n())try{for(let t of o(e))r.set(t.id,t)}catch{}return e.data.map(e=>{let n=r.get(e.id),i=`adobe-${e.api===`openai`?`openai`:`anthropic`}`;return n?{...n,provider:`adobe`,api:i}:{id:e.id,name:e.name??e.id,provider:`adobe`,api:i,baseUrl:t,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},inputCost:0,outputCost:0,cacheReadCost:0,cacheWriteCost:0,reasoning:!0}})}}else console.warn(`[adobe] Proxy /v1/models returned ${r.status}, falling back to Anthropic models`)}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return o(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}const V=new Map;async function H(){let e=m(),t=V.get(e);if(t)return t;let n=await B();return V.set(e,n),n}function U(){t({api:`adobe-anthropic`,stream:R,streamSimple:z}),t({api:`adobe-openai`,stream:R,streamSimple:z})}export{I as __resetAdobeSessionIdWarningCacheForTests,D as config,H as getAdobeModels,k as getValidAccessToken,A as isTokenExpired,U as register};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/oauth-service-Bv4EZbHs.js","assets/main-CGBwb-Z7.js","assets/modulepreload-polyfill-wMinxHhO.js","assets/main-CvlDeETm.css"])))=>i.map(i=>d[i]);
2
+ import{B as e,I as t,K as n,L as r,N as i,P as a,U as o,W as s,Y as c,c as l,f as u,h as d,l as f}from"./main-CGBwb-Z7.js";import{getOAuthPageOrigin as p}from"./oauth-service-Bv4EZbHs.js";var m=Object.assign({"/packages/webapp/providers/adobe-config.json":{proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`}})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function h(){let e=u(`adobe`);if(e)return e.replace(/\/$/,``);if(m.proxyEndpoint)return m.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}var g=new Map,_=new Map;async function v(e){let t=g.get(e);if(t)return t;try{let t=await fetch(`${e}/v1/config`,{headers:{[N]:`3.7.0`}});if(t.ok){let n=await t.json();return g.set(e,n),n}console.warn(`[adobe] Proxy /v1/config returned ${t.status}, falling back to build-time config`)}catch(e){console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e))}let n={};return g.set(e,n),n}function y(e){let t=e.clientId||m.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 b(e){return e.scopes||m.scopes}function x(e){return e.imsEnvironment||m.imsEnvironment||`prod`}var S={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function C(e){return S[e??m.imsEnvironment??`prod`]??S.prod}var w=typeof chrome<`u`&&!!chrome?.runtime?.id;function T(){return f().find(e=>e.providerId===`adobe`)}async function E(e,t){try{let n=await fetch(`${C(t)}/ims/userinfo/v2`,{headers:{Authorization:`Bearer ${e}`}});if(n.ok){let e=await n.json();return{name:e.displayName||e.name||e.email,avatar:e.picture||e.avatar_url}}console.warn(`[adobe] User profile fetch returned ${n.status}, account will have no display name`)}catch(e){console.warn(`[adobe] Failed to fetch user profile:`,e instanceof Error?e.message:String(e))}return{}}function D(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)}:null}var O={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!m.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`],getModelIds:()=>{let e=e=>{let t={id:e.id,name:e.name??e.id},n=_.get(e.id);return n?.api&&(t.api=n.api),n?.context_window!==void 0&&(t.context_window=n.context_window),n?.max_tokens!==void 0&&(t.max_tokens=n.max_tokens),n?.reasoning!==void 0&&(t.reasoning=n.reasoning),n?.input&&(t.input=n.input),/haiku/i.test(e.id)&&(t.compat={supportsEagerToolInputStreaming:!1}),t};for(let t of U.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id}));try{localStorage.setItem(`slicc-adobe-models`,JSON.stringify(n))}catch{}return n}for(let t of g.values())if(t.models?.length)return t.models.map(e);try{let e=localStorage.getItem(`slicc-adobe-models`);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)=>{let n=h(),r=await v(n),i=y(r),a=b(r),o=x(r),s=w?null:await p(),c=w?m.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:m.redirectUri??`${s.origin}/auth/callback`,l=w?void 0:btoa(JSON.stringify({port:parseInt(new URL(s.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),u=l?JSON.parse(atob(l)).nonce:null,f=new URLSearchParams({client_id:i,scope:a,response_type:`token`,redirect_uri:c});l&&f.set(`state`,l);let g=await e(`${C(o)}/ims/authorize/v2?${f}`);if(!g)return;if(u&&g)try{if(new URL(g).searchParams.get(`nonce`)!==u){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 _=D(g);if(!_){console.error(`[adobe] Could not extract token from redirect URL`);return}let S=await E(_.accessToken,o);await d({providerId:`adobe`,accessToken:_.accessToken,tokenExpiresAt:Date.now()+_.expiresIn*1e3,userName:S.name,userAvatar:S.avatar,baseUrl:m.proxyEndpoint?void 0:n}),await W().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),t()},onOAuthLogout:async()=>{let e=T();if(e?.accessToken)try{let t=g.values().next().value??{},n=t.clientId||m.clientId,r=x(t);if(n){let t=await fetch(`${C(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 d({providerId:`adobe`,accessToken:``})},onSilentRenew:async()=>T()?.accessToken?M():null},k=null;async function A(){let e=T();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...`);try{let e=await M();if(e)return e}catch(e){console.warn(`[adobe] Silent renewal failed:`,e instanceof Error?e.message:String(e))}let t=T();if((t?.tokenExpiresAt??0)-Date.now()>0&&t?.accessToken)return t.accessToken;throw Error(`Adobe session expired — please log in again`)}function j(){let e=T();return e?.tokenExpiresAt?Date.now()>e.tokenExpiresAt-6e4:!0}async function M(){return typeof window>`u`?null:k||(k=(async()=>{try{let e=h(),t=await v(e),n=y(t),r=b(t),i=x(t),a=w?m.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:m.redirectUri??`${window.location.origin}/auth/callback`,o=w?void 0:btoa(JSON.stringify({port:parseInt(new URL(window.location.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),s=o?JSON.parse(atob(o)).nonce:null,l=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:a,prompt:`none`});o&&l.set(`state`,o);let u=`${C(i)}/ims/authorize/v2?${l}`,{createOAuthLauncher:f}=await c(async()=>{let{createOAuthLauncher:e}=await import(`./oauth-service-Bv4EZbHs.js`);return{createOAuthLauncher:e}},__vite__mapDeps([0,1,2,3])),p=await f()(u);if(!p)return null;if(s&&p)try{if(new URL(p).searchParams.get(`nonce`)!==s)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),null}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let g=D(p);if(!g)return null;let _=T();return await d({providerId:`adobe`,accessToken:g.accessToken,tokenExpiresAt:Date.now()+g.expiresIn*1e3,userName:_?.userName,userAvatar:_?.userAvatar,baseUrl:m.proxyEndpoint?void 0:e}),console.log(`[adobe] Token renewed silently`),await W().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),g.accessToken}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}finally{k=null}})(),k)}var N=`X-Slicc-Version`;function P(e){let t={},n=N.toLowerCase();if(e.headers)for(let[r,i]of Object.entries(e.headers))r.toLowerCase()!==n&&(t[r]=i);return t[N]=`3.7.0`,{...e,headers:t}}var F=`adobe-provider-fallback`,I=new Set;function L(e,t){if(e.headers){for(let t of Object.keys(e.headers))if(t.toLowerCase()===`x-session-id`)return e}return I.has(t)||(I.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":l(F)}}}function R(){I.clear()}function z(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()}}}var B=(t,n,r={})=>{let o=e();return(async()=>{try{let e=await A();if(String(t.api).includes(`openai`)){let i=a({...t,baseUrl:`${h()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},n,P(L({...r,apiKey:e},`streamAdobe[openai]`)));for await(let e of i)o.push(e)}else{let a=i({...t,baseUrl:h(),api:`anthropic-messages`},n,P(L({...r,apiKey:e},`streamAdobe[anthropic]`)));for await(let e of a)o.push(e)}o.end()}catch(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e)),o.push(z(t,e)),o.end()}})(),o},V=(n,i,a)=>{let o=e();return(async()=>{try{let e=await A();if(String(n.api).includes(`openai`)){let t=r({...n,baseUrl:`${h()}/v1`,api:`openai-completions`,compat:{...n.compat,supportsStore:!1,supportsDeveloperRole:!1}},i,P(L({...a,apiKey:e},`streamSimpleAdobe[openai]`)));for await(let e of t)o.push(e)}else{let r=t({...n,baseUrl:h(),api:`anthropic-messages`},i,P(L({...a,apiKey:e},`streamSimpleAdobe[anthropic]`)));for await(let e of r)o.push(e)}o.end()}catch(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e)),o.push(z(n,e)),o.end()}})(),o};async function H(){try{let e=await A(),t=h(),n=await fetch(`${t}/v1/models`,{headers:{Authorization:`Bearer ${e}`,[N]:`3.7.0`}});if(n.ok){let e=await n.json();if(e.data?.length){for(let t of e.data){let e={id:t.id,name:t.name};t.api!==void 0&&(e.api=t.api),t.context_window!==void 0&&(e.context_window=t.context_window),t.max_tokens!==void 0&&(e.max_tokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),_.set(t.id,e)}let n=new Map;for(let e of s())try{for(let t of o(e))n.set(t.id,t)}catch{}return e.data.map(e=>{let r=n.get(e.id),i=`adobe-${e.api===`openai`?`openai`:`anthropic`}`;return r?{...r,provider:`adobe`,api:i}:{id:e.id,name:e.name??e.id,provider:`adobe`,api:i,baseUrl:t,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},inputCost:0,outputCost:0,cacheReadCost:0,cacheWriteCost:0,reasoning:!0}})}}else console.warn(`[adobe] Proxy /v1/models returned ${n.status}, falling back to Anthropic models`)}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return o(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}var U=new Map;async function W(){let e=h(),t=U.get(e);if(t)return t;let n=await H();return U.set(e,n),n}function G(){n({api:`adobe-anthropic`,stream:B,streamSimple:V}),n({api:`adobe-openai`,stream:B,streamSimple:V})}export{R as __resetAdobeSessionIdWarningCacheForTests,O as config,W as getAdobeModels,A as getValidAccessToken,j as isTokenExpired,G as register};
@@ -0,0 +1 @@
1
+ import{X as e}from"./main-CGBwb-Z7.js";var t=e(`agent-bridge`),n=`__slicc_agent`,r=`agent-spawn-request`;function i(){let e={spawn(e){return new Promise((t,n)=>{let i=globalThis.chrome?.runtime;if(!i||typeof i.sendMessage!=`function`){n(Error(`agent: chrome.runtime.sendMessage not available`));return}let a=e=>{let r=i.lastError;if(r){n(Error(r.message??`chrome.runtime error`));return}if(e==null){n(Error(`agent: empty response from offscreen bridge`));return}let a=e;if(!a.ok){n(Error(a.error??`agent: offscreen bridge error`));return}if(!a.result){n(Error(`agent: offscreen bridge returned no result`));return}t(a.result)};try{i.sendMessage({source:`panel`,payload:{type:r,options:e}},a)}catch(e){n(e instanceof Error?e:Error(String(e)))}})}};return globalThis[n]=e,t.info(`agent bridge proxy published on globalThis.__slicc_agent`),e}export{i as publishAgentBridgeProxy};
@@ -1,4 +1,4 @@
1
- import{X as e}from"./kernel-worker-7oVJDvYj.js";const t=new Set([`webhook`,`cron`,`sprinkle`,`fswatch`,`session-reload`,`navigate`,`upgrade`,`scoop-notify`,`scoop-idle`,`scoop-wait`]);function n(e){return e!=null&&t.has(e)}function r(t,n={}){let{source:r=`cone`,idSeed:c=d,hiddenToolNames:l=e}=n,f=[],h=null,g=new Set;for(let e of t){if(i(e)){let t=s(e.content);if(t.length===0)continue;let n=p(t);for(let t of n){if(t.body.length===0&&t.sender==null)continue;let n=t.sender?m(t.sender):null,r={id:c(),role:`user`,content:t.body,timestamp:e.timestamp};n&&(r.source=`lick`,r.channel=n),f.push(r)}h=null;continue}if(a(e)){let t=s(e.content),n=u(e),i=[];for(let e of n)l.has(e.name)?g.add(e.id):i.push(e);let a={id:c(),role:`assistant`,content:t,timestamp:e.timestamp,source:r};i.length>0&&(a.toolCalls=i),f.push(a),h=a;continue}if(o(e)){if(g.has(e.toolCallId))continue;let t=h?.toolCalls?.find(t=>t.id===e.toolCallId);if(!t)continue;t.result=s(e.content),t.isError=e.isError;continue}}return f}function i(e){return e.role===`user`}function a(e){return e.role===`assistant`}function o(e){return e.role===`toolResult`}function s(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e)c(n)&&t.push(n.text);return t.join(``)}function c(e){return e.type===`text`}function l(e){return e.type===`toolCall`}function u(e){if(!Array.isArray(e.content))return[];let t=[];for(let n of e.content)l(n)&&t.push({id:n.id,name:n.name,input:n.arguments});return t}function d(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function f(e){if(!e.startsWith(`[`))return null;let n=e.indexOf(`] `);if(n<=0||e.lastIndexOf(`
1
+ import{X as e}from"./kernel-worker-C5VWVo3p.js";const t=new Set([`webhook`,`cron`,`sprinkle`,`fswatch`,`session-reload`,`navigate`,`upgrade`,`scoop-notify`,`scoop-idle`,`scoop-wait`]);function n(e){return e!=null&&t.has(e)}function r(t,n={}){let{source:r=`cone`,idSeed:c=d,hiddenToolNames:l=e}=n,f=[],h=null,g=new Set;for(let e of t){if(i(e)){let t=s(e.content);if(t.length===0)continue;let n=p(t);for(let t of n){if(t.body.length===0&&t.sender==null)continue;let n=t.sender?m(t.sender):null,r={id:c(),role:`user`,content:t.body,timestamp:e.timestamp};n&&(r.source=`lick`,r.channel=n),f.push(r)}h=null;continue}if(a(e)){let t=s(e.content),n=u(e),i=[];for(let e of n)l.has(e.name)?g.add(e.id):i.push(e);let a={id:c(),role:`assistant`,content:t,timestamp:e.timestamp,source:r};i.length>0&&(a.toolCalls=i),f.push(a),h=a;continue}if(o(e)){if(g.has(e.toolCallId))continue;let t=h?.toolCalls?.find(t=>t.id===e.toolCallId);if(!t)continue;t.result=s(e.content),t.isError=e.isError;continue}}return f}function i(e){return e.role===`user`}function a(e){return e.role===`assistant`}function o(e){return e.role===`toolResult`}function s(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e)c(n)&&t.push(n.text);return t.join(``)}function c(e){return e.type===`text`}function l(e){return e.type===`toolCall`}function u(e){if(!Array.isArray(e.content))return[];let t=[];for(let n of e.content)l(n)&&t.push({id:n.id,name:n.name,input:n.arguments});return t}function d(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function f(e){if(!e.startsWith(`[`))return null;let n=e.indexOf(`] `);if(n<=0||e.lastIndexOf(`
2
2
  `,n)!==-1)return null;let r=e.slice(n+2);if(r.startsWith(`User: `))return{sender:`User`,body:r.slice(6)};for(let e of t){let t=`${e}:`;if(!r.startsWith(t))continue;let n=r.indexOf(`
3
3
  `),i=n===-1?r.length:n,a=r.slice(0,i),o=-1,s=a.indexOf(`[`,t.length);if(s>t.length&&(o=a.lastIndexOf(`: `,s)),o<t.length&&(o=r.indexOf(`: `,t.length)),!(o<0||o>=i))return{sender:r.slice(0,o),body:r.slice(o+2)}}let i=r.indexOf(`
4
4
  `),a=i===-1?r.length:i,o=r.indexOf(`: `);if(o<=0||o>=a)return null;let s=r.slice(0,o);return s.includes(`
@@ -1,4 +1,4 @@
1
- import{D as e,G as t,O as n,V as r,b as i,v as a,y as o,z as s}from"./index-BdDYVKjf.js";import{t as c}from"./headers-AeYLn7L4.js";import{t as l}from"./sanitize-unicode-h0KEBmEw.js";import{i as u,n as ee,t as d}from"./github-copilot-headers-CTUP_cqn.js";function f(e,t,n,r,i){if(r===`m`)throw TypeError(`Private method is not writable`);if(r===`a`&&!i)throw TypeError(`Private accessor was defined without a setter`);if(typeof t==`function`?e!==t||!i:!t.has(e))throw TypeError(`Cannot write private member to an object whose class did not declare it`);return r===`a`?i.call(e,n):i?i.value=n:t.set(e,n),n}function p(e,t,n,r){if(n===`a`&&!r)throw TypeError(`Private accessor was defined without a getter`);if(typeof t==`function`?e!==t||!r:!t.has(e))throw TypeError(`Cannot read private member from an object whose class did not declare it`);return n===`m`?r:n===`a`?r.call(e):r?r.value:t.get(e)}var te=function(){let{crypto:e}=globalThis;if(e?.randomUUID)return te=e.randomUUID.bind(e),e.randomUUID();let t=new Uint8Array(1),n=e?()=>e.getRandomValues(t)[0]:()=>Math.random()*255&255;return`10000000-1000-4000-8000-100000000000`.replace(/[018]/g,e=>(e^n()&15>>e/4).toString(16))};function m(e){return typeof e==`object`&&!!e&&(`name`in e&&e.name===`AbortError`||`message`in e&&String(e.message).includes(`FetchRequestCanceledException`))}var h=e=>{if(e instanceof Error)return e;if(typeof e==`object`&&e){try{if(Object.prototype.toString.call(e)===`[object Error]`){let t=Error(e.message,e.cause?{cause:e.cause}:{});return e.stack&&(t.stack=e.stack),e.cause&&!t.cause&&(t.cause=e.cause),e.name&&(t.name=e.name),t}}catch{}try{return Error(JSON.stringify(e))}catch{}}return Error(e)},g=class extends Error{},_=class e extends g{constructor(t,n,r,i,a){super(`${e.makeMessage(t,n,r)}`),this.status=t,this.headers=i,this.requestID=i?.get(`request-id`),this.error=n,this.type=a??null}static makeMessage(e,t,n){let r=t?.message?typeof t.message==`string`?t.message:JSON.stringify(t.message):t?JSON.stringify(t):n;return e&&r?`${e} ${r}`:e?`${e} status code (no body)`:r||`(no status code or body)`}static generate(t,n,r,i){if(!t||!i)return new ne({message:r,cause:h(n)});let a=n,o=a?.error?.type;return t===400?new ie(t,a,r,i,o):t===401?new ae(t,a,r,i,o):t===403?new oe(t,a,r,i,o):t===404?new se(t,a,r,i,o):t===409?new ce(t,a,r,i,o):t===422?new le(t,a,r,i,o):t===429?new ue(t,a,r,i,o):t>=500?new de(t,a,r,i,o):new e(t,a,r,i,o)}},v=class extends _{constructor({message:e}={}){super(void 0,void 0,e||`Request was aborted.`,void 0)}},ne=class extends _{constructor({message:e,cause:t}){super(void 0,void 0,e||`Connection error.`,void 0),t&&(this.cause=t)}},re=class extends ne{constructor({message:e}={}){super({message:e??`Request timed out.`})}},ie=class extends _{},ae=class extends _{},oe=class extends _{},se=class extends _{},ce=class extends _{},le=class extends _{},ue=class extends _{},de=class extends _{},fe=/^[a-z][a-z0-9+.-]*:/i,pe=e=>fe.test(e),me=e=>(me=Array.isArray,me(e)),he=me;function ge(e){return typeof e==`object`?e??{}:{}}function _e(e){if(!e)return!0;for(let t in e)return!1;return!0}function ve(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var ye=(e,t)=>{if(typeof t!=`number`||!Number.isInteger(t))throw new g(`${e} must be an integer`);if(t<0)throw new g(`${e} must be a positive integer`);return t},be=e=>{try{return JSON.parse(e)}catch{return}},xe=e=>new Promise(t=>setTimeout(t,e)),y=`0.91.1`,Se=()=>typeof window<`u`&&window.document!==void 0&&typeof navigator<`u`;function Ce(){return typeof Deno<`u`&&Deno.build!=null?`deno`:typeof EdgeRuntime<`u`?`edge`:Object.prototype.toString.call(globalThis.process===void 0?0:globalThis.process)===`[object process]`?`node`:`unknown`}var we=()=>{let e=Ce();if(e===`deno`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":y,"X-Stainless-OS":De(Deno.build.os),"X-Stainless-Arch":Ee(Deno.build.arch),"X-Stainless-Runtime":`deno`,"X-Stainless-Runtime-Version":typeof Deno.version==`string`?Deno.version:Deno.version?.deno??`unknown`};if(typeof EdgeRuntime<`u`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":y,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":`edge`,"X-Stainless-Runtime-Version":globalThis.process.version};if(e===`node`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":y,"X-Stainless-OS":De(globalThis.process.platform??`unknown`),"X-Stainless-Arch":Ee(globalThis.process.arch??`unknown`),"X-Stainless-Runtime":`node`,"X-Stainless-Runtime-Version":globalThis.process.version??`unknown`};let t=Te();return t?{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":y,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`browser:${t.browser}`,"X-Stainless-Runtime-Version":t.version}:{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":y,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`unknown`,"X-Stainless-Runtime-Version":`unknown`}};function Te(){if(typeof navigator>`u`||!navigator)return null;for(let{key:e,pattern:t}of[{key:`edge`,pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`chrome`,pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`firefox`,pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`safari`,pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}]){let n=t.exec(navigator.userAgent);if(n)return{browser:e,version:`${n[1]||0}.${n[2]||0}.${n[3]||0}`}}return null}var Ee=e=>e===`x32`?`x32`:e===`x86_64`||e===`x64`?`x64`:e===`arm`?`arm`:e===`aarch64`||e===`arm64`?`arm64`:e?`other:${e}`:`unknown`,De=e=>(e=e.toLowerCase(),e.includes(`ios`)?`iOS`:e===`android`?`Android`:e===`darwin`?`MacOS`:e===`win32`?`Windows`:e===`freebsd`?`FreeBSD`:e===`openbsd`?`OpenBSD`:e===`linux`?`Linux`:e?`Other:${e}`:`Unknown`),Oe,ke=()=>Oe??=we();function Ae(){if(typeof fetch<`u`)return fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function je(...e){let t=globalThis.ReadableStream;if(t===void 0)throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new t(...e)}function Me(e){let t=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator]();return je({start(){},async pull(e){let{done:n,value:r}=await t.next();n?e.close():e.enqueue(r)},async cancel(){await t.return?.()}})}function Ne(e){if(e[Symbol.asyncIterator])return e;let t=e.getReader();return{async next(){try{let e=await t.read();return e?.done&&t.releaseLock(),e}catch(e){throw t.releaseLock(),e}},async return(){let e=t.cancel();return t.releaseLock(),await e,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function Pe(e){if(typeof e!=`object`||!e)return;if(e[Symbol.asyncIterator]){await e[Symbol.asyncIterator]().return?.();return}let t=e.getReader(),n=t.cancel();t.releaseLock(),await n}var Fe=({headers:e,body:t})=>({bodyHeaders:{"content-type":`application/json`},body:JSON.stringify(t)});function Ie(e){return Object.entries(e).filter(([e,t])=>t!==void 0).map(([e,t])=>{if(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)return`${encodeURIComponent(e)}=${encodeURIComponent(t)}`;if(t===null)return`${encodeURIComponent(e)}=`;throw new g(`Cannot stringify type ${typeof t}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join(`&`)}function Le(e){let t=0;for(let n of e)t+=n.length;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}var Re;function ze(e){let t;return(Re??=(t=new globalThis.TextEncoder,t.encode.bind(t)))(e)}var Be;function Ve(e){let t;return(Be??=(t=new globalThis.TextDecoder,t.decode.bind(t)))(e)}var b,x,He=class{constructor(){b.set(this,void 0),x.set(this,void 0),f(this,b,new Uint8Array,`f`),f(this,x,null,`f`)}decode(e){if(e==null)return[];let t=e instanceof ArrayBuffer?new Uint8Array(e):typeof e==`string`?ze(e):e;f(this,b,Le([p(this,b,`f`),t]),`f`);let n=[],r;for(;(r=Ue(p(this,b,`f`),p(this,x,`f`)))!=null;){if(r.carriage&&p(this,x,`f`)==null){f(this,x,r.index,`f`);continue}if(p(this,x,`f`)!=null&&(r.index!==p(this,x,`f`)+1||r.carriage)){n.push(Ve(p(this,b,`f`).subarray(0,p(this,x,`f`)-1))),f(this,b,p(this,b,`f`).subarray(p(this,x,`f`)),`f`),f(this,x,null,`f`);continue}let e=p(this,x,`f`)===null?r.preceding:r.preceding-1,t=Ve(p(this,b,`f`).subarray(0,e));n.push(t),f(this,b,p(this,b,`f`).subarray(r.index),`f`),f(this,x,null,`f`)}return n}flush(){return p(this,b,`f`).length?this.decode(`
1
+ import{D as e,G as t,O as n,V as r,b as i,v as a,y as o,z as s}from"./main-CGBwb-Z7.js";import{t as c}from"./headers-qDMOQQGF.js";import{t as l}from"./sanitize-unicode-B1z_Y4Dq.js";import{i as u,n as ee,t as d}from"./github-copilot-headers-C5CocKfn.js";function f(e,t,n,r,i){if(r===`m`)throw TypeError(`Private method is not writable`);if(r===`a`&&!i)throw TypeError(`Private accessor was defined without a setter`);if(typeof t==`function`?e!==t||!i:!t.has(e))throw TypeError(`Cannot write private member to an object whose class did not declare it`);return r===`a`?i.call(e,n):i?i.value=n:t.set(e,n),n}function p(e,t,n,r){if(n===`a`&&!r)throw TypeError(`Private accessor was defined without a getter`);if(typeof t==`function`?e!==t||!r:!t.has(e))throw TypeError(`Cannot read private member from an object whose class did not declare it`);return n===`m`?r:n===`a`?r.call(e):r?r.value:t.get(e)}var te=function(){let{crypto:e}=globalThis;if(e?.randomUUID)return te=e.randomUUID.bind(e),e.randomUUID();let t=new Uint8Array(1),n=e?()=>e.getRandomValues(t)[0]:()=>Math.random()*255&255;return`10000000-1000-4000-8000-100000000000`.replace(/[018]/g,e=>(e^n()&15>>e/4).toString(16))};function m(e){return typeof e==`object`&&!!e&&(`name`in e&&e.name===`AbortError`||`message`in e&&String(e.message).includes(`FetchRequestCanceledException`))}var h=e=>{if(e instanceof Error)return e;if(typeof e==`object`&&e){try{if(Object.prototype.toString.call(e)===`[object Error]`){let t=Error(e.message,e.cause?{cause:e.cause}:{});return e.stack&&(t.stack=e.stack),e.cause&&!t.cause&&(t.cause=e.cause),e.name&&(t.name=e.name),t}}catch{}try{return Error(JSON.stringify(e))}catch{}}return Error(e)},g=class extends Error{},_=class e extends g{constructor(t,n,r,i,a){super(`${e.makeMessage(t,n,r)}`),this.status=t,this.headers=i,this.requestID=i?.get(`request-id`),this.error=n,this.type=a??null}static makeMessage(e,t,n){let r=t?.message?typeof t.message==`string`?t.message:JSON.stringify(t.message):t?JSON.stringify(t):n;return e&&r?`${e} ${r}`:e?`${e} status code (no body)`:r||`(no status code or body)`}static generate(t,n,r,i){if(!t||!i)return new ne({message:r,cause:h(n)});let a=n,o=a?.error?.type;return t===400?new ie(t,a,r,i,o):t===401?new ae(t,a,r,i,o):t===403?new oe(t,a,r,i,o):t===404?new se(t,a,r,i,o):t===409?new ce(t,a,r,i,o):t===422?new le(t,a,r,i,o):t===429?new ue(t,a,r,i,o):t>=500?new de(t,a,r,i,o):new e(t,a,r,i,o)}},v=class extends _{constructor({message:e}={}){super(void 0,void 0,e||`Request was aborted.`,void 0)}},ne=class extends _{constructor({message:e,cause:t}){super(void 0,void 0,e||`Connection error.`,void 0),t&&(this.cause=t)}},re=class extends ne{constructor({message:e}={}){super({message:e??`Request timed out.`})}},ie=class extends _{},ae=class extends _{},oe=class extends _{},se=class extends _{},ce=class extends _{},le=class extends _{},ue=class extends _{},de=class extends _{},fe=/^[a-z][a-z0-9+.-]*:/i,pe=e=>fe.test(e),me=e=>(me=Array.isArray,me(e)),he=me;function ge(e){return typeof e==`object`?e??{}:{}}function _e(e){if(!e)return!0;for(let t in e)return!1;return!0}function ve(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var ye=(e,t)=>{if(typeof t!=`number`||!Number.isInteger(t))throw new g(`${e} must be an integer`);if(t<0)throw new g(`${e} must be a positive integer`);return t},be=e=>{try{return JSON.parse(e)}catch{return}},xe=e=>new Promise(t=>setTimeout(t,e)),y=`0.91.1`,Se=()=>typeof window<`u`&&window.document!==void 0&&typeof navigator<`u`;function Ce(){return typeof Deno<`u`&&Deno.build!=null?`deno`:typeof EdgeRuntime<`u`?`edge`:Object.prototype.toString.call(globalThis.process===void 0?0:globalThis.process)===`[object process]`?`node`:`unknown`}var we=()=>{let e=Ce();if(e===`deno`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":y,"X-Stainless-OS":De(Deno.build.os),"X-Stainless-Arch":Ee(Deno.build.arch),"X-Stainless-Runtime":`deno`,"X-Stainless-Runtime-Version":typeof Deno.version==`string`?Deno.version:Deno.version?.deno??`unknown`};if(typeof EdgeRuntime<`u`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":y,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":`edge`,"X-Stainless-Runtime-Version":globalThis.process.version};if(e===`node`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":y,"X-Stainless-OS":De(globalThis.process.platform??`unknown`),"X-Stainless-Arch":Ee(globalThis.process.arch??`unknown`),"X-Stainless-Runtime":`node`,"X-Stainless-Runtime-Version":globalThis.process.version??`unknown`};let t=Te();return t?{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":y,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`browser:${t.browser}`,"X-Stainless-Runtime-Version":t.version}:{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":y,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`unknown`,"X-Stainless-Runtime-Version":`unknown`}};function Te(){if(typeof navigator>`u`||!navigator)return null;for(let{key:e,pattern:t}of[{key:`edge`,pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`chrome`,pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`firefox`,pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`safari`,pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}]){let n=t.exec(navigator.userAgent);if(n)return{browser:e,version:`${n[1]||0}.${n[2]||0}.${n[3]||0}`}}return null}var Ee=e=>e===`x32`?`x32`:e===`x86_64`||e===`x64`?`x64`:e===`arm`?`arm`:e===`aarch64`||e===`arm64`?`arm64`:e?`other:${e}`:`unknown`,De=e=>(e=e.toLowerCase(),e.includes(`ios`)?`iOS`:e===`android`?`Android`:e===`darwin`?`MacOS`:e===`win32`?`Windows`:e===`freebsd`?`FreeBSD`:e===`openbsd`?`OpenBSD`:e===`linux`?`Linux`:e?`Other:${e}`:`Unknown`),Oe,ke=()=>Oe??=we();function Ae(){if(typeof fetch<`u`)return fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Anthropic({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function je(...e){let t=globalThis.ReadableStream;if(t===void 0)throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new t(...e)}function Me(e){let t=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator]();return je({start(){},async pull(e){let{done:n,value:r}=await t.next();n?e.close():e.enqueue(r)},async cancel(){await t.return?.()}})}function Ne(e){if(e[Symbol.asyncIterator])return e;let t=e.getReader();return{async next(){try{let e=await t.read();return e?.done&&t.releaseLock(),e}catch(e){throw t.releaseLock(),e}},async return(){let e=t.cancel();return t.releaseLock(),await e,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function Pe(e){if(typeof e!=`object`||!e)return;if(e[Symbol.asyncIterator]){await e[Symbol.asyncIterator]().return?.();return}let t=e.getReader(),n=t.cancel();t.releaseLock(),await n}var Fe=({headers:e,body:t})=>({bodyHeaders:{"content-type":`application/json`},body:JSON.stringify(t)});function Ie(e){return Object.entries(e).filter(([e,t])=>t!==void 0).map(([e,t])=>{if(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)return`${encodeURIComponent(e)}=${encodeURIComponent(t)}`;if(t===null)return`${encodeURIComponent(e)}=`;throw new g(`Cannot stringify type ${typeof t}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join(`&`)}function Le(e){let t=0;for(let n of e)t+=n.length;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}var Re;function ze(e){let t;return(Re??=(t=new globalThis.TextEncoder,t.encode.bind(t)))(e)}var Be;function Ve(e){let t;return(Be??=(t=new globalThis.TextDecoder,t.decode.bind(t)))(e)}var b,x,He=class{constructor(){b.set(this,void 0),x.set(this,void 0),f(this,b,new Uint8Array,`f`),f(this,x,null,`f`)}decode(e){if(e==null)return[];let t=e instanceof ArrayBuffer?new Uint8Array(e):typeof e==`string`?ze(e):e;f(this,b,Le([p(this,b,`f`),t]),`f`);let n=[],r;for(;(r=Ue(p(this,b,`f`),p(this,x,`f`)))!=null;){if(r.carriage&&p(this,x,`f`)==null){f(this,x,r.index,`f`);continue}if(p(this,x,`f`)!=null&&(r.index!==p(this,x,`f`)+1||r.carriage)){n.push(Ve(p(this,b,`f`).subarray(0,p(this,x,`f`)-1))),f(this,b,p(this,b,`f`).subarray(p(this,x,`f`)),`f`),f(this,x,null,`f`);continue}let e=p(this,x,`f`)===null?r.preceding:r.preceding-1,t=Ve(p(this,b,`f`).subarray(0,e));n.push(t),f(this,b,p(this,b,`f`).subarray(r.index),`f`),f(this,x,null,`f`)}return n}flush(){return p(this,b,`f`).length?this.decode(`
2
2
  `):[]}};b=new WeakMap,x=new WeakMap,He.NEWLINE_CHARS=new Set([`
3
3
  `,`\r`]),He.NEWLINE_REGEXP=/\r\n|[\n\r]/g;function Ue(e,t){for(let n=t??0;n<e.length;n++){if(e[n]===10)return{preceding:n,index:n+1,carriage:!1};if(e[n]===13)return{preceding:n,index:n+1,carriage:!0}}return null}function We(e){for(let t=0;t<e.length-1;t++){if(e[t]===10&&e[t+1]===10||e[t]===13&&e[t+1]===13)return t+2;if(e[t]===13&&e[t+1]===10&&t+3<e.length&&e[t+2]===13&&e[t+3]===10)return t+4}return-1}var Ge={off:0,error:200,warn:300,info:400,debug:500},Ke=(e,t,n)=>{if(e){if(ve(Ge,e))return e;S(n).warn(`${t} was set to ${JSON.stringify(e)}, expected one of ${JSON.stringify(Object.keys(Ge))}`)}};function qe(){}function Je(e,t,n){return!t||Ge[e]>Ge[n]?qe:t[e].bind(t)}var Ye={error:qe,warn:qe,info:qe,debug:qe},Xe=new WeakMap;function S(e){let t=e.logger,n=e.logLevel??`off`;if(!t)return Ye;let r=Xe.get(t);if(r&&r[0]===n)return r[1];let i={error:Je(`error`,t,n),warn:Je(`warn`,t,n),info:Je(`info`,t,n),debug:Je(`debug`,t,n)};return Xe.set(t,[n,i]),i}var C=e=>(e.options&&(e.options={...e.options},delete e.options.headers),e.headers&&=Object.fromEntries((e.headers instanceof Headers?[...e.headers]:Object.entries(e.headers)).map(([e,t])=>[e,e.toLowerCase()===`x-api-key`||e.toLowerCase()===`authorization`||e.toLowerCase()===`cookie`||e.toLowerCase()===`set-cookie`?`***`:t])),`retryOfRequestLogID`in e&&(e.retryOfRequestLogID&&(e.retryOf=e.retryOfRequestLogID),delete e.retryOfRequestLogID),e),Ze,Qe=class e{constructor(e,t,n){this.iterator=e,Ze.set(this,void 0),this.controller=t,f(this,Ze,n,`f`)}static fromSSEResponse(t,n,r){let i=!1,a=r?S(r):console;async function*o(){if(i)throw new g("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");i=!0;let e=!1;try{for await(let e of $e(t,n)){if(e.event===`completion`)try{yield JSON.parse(e.data)}catch(t){throw a.error(`Could not parse message into JSON:`,e.data),a.error(`From chunk:`,e.raw),t}if(e.event===`message_start`||e.event===`message_delta`||e.event===`message_stop`||e.event===`content_block_start`||e.event===`content_block_delta`||e.event===`content_block_stop`||e.event===`message`||e.event===`user.message`||e.event===`user.interrupt`||e.event===`user.tool_confirmation`||e.event===`user.custom_tool_result`||e.event===`agent.message`||e.event===`agent.thinking`||e.event===`agent.tool_use`||e.event===`agent.tool_result`||e.event===`agent.mcp_tool_use`||e.event===`agent.mcp_tool_result`||e.event===`agent.custom_tool_use`||e.event===`agent.thread_context_compacted`||e.event===`session.status_running`||e.event===`session.status_idle`||e.event===`session.status_rescheduled`||e.event===`session.status_terminated`||e.event===`session.error`||e.event===`session.deleted`||e.event===`span.model_request_start`||e.event===`span.model_request_end`)try{yield JSON.parse(e.data)}catch(t){throw a.error(`Could not parse message into JSON:`,e.data),a.error(`From chunk:`,e.raw),t}if(e.event!==`ping`&&e.event===`error`){let n=be(e.data)??e.data,r=n?.error?.type;throw new _(void 0,n,void 0,t.headers,r)}}e=!0}catch(e){if(m(e))return;throw e}finally{e||n.abort()}}return new e(o,n,r)}static fromReadableStream(t,n,r){let i=!1;async function*a(){let e=new He,n=Ne(t);for await(let t of n)for(let n of e.decode(t))yield n;for(let t of e.flush())yield t}async function*o(){if(i)throw new g("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");i=!0;let e=!1;try{for await(let t of a())e||t&&(yield JSON.parse(t));e=!0}catch(e){if(m(e))return;throw e}finally{e||n.abort()}}return new e(o,n,r)}[(Ze=new WeakMap,Symbol.asyncIterator)](){return this.iterator()}tee(){let t=[],n=[],r=this.iterator(),i=e=>({next:()=>{if(e.length===0){let e=r.next();t.push(e),n.push(e)}return e.shift()}});return[new e(()=>i(t),this.controller,p(this,Ze,`f`)),new e(()=>i(n),this.controller,p(this,Ze,`f`))]}toReadableStream(){let e=this,t;return je({async start(){t=e[Symbol.asyncIterator]()},async pull(e){try{let{value:n,done:r}=await t.next();if(r)return e.close();let i=ze(JSON.stringify(n)+`
4
4
  `);e.enqueue(i)}catch(t){e.error(t)}},async cancel(){await t.return?.()}})}};async function*$e(e,t){if(!e.body)throw t.abort(),globalThis.navigator!==void 0&&globalThis.navigator.product===`ReactNative`?new g(`The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api`):new g(`Attempted to iterate over a response with no body`);let n=new tt,r=new He,i=Ne(e.body);for await(let e of et(i))for(let t of r.decode(e)){let e=n.decode(t);e&&(yield e)}for(let e of r.flush()){let t=n.decode(e);t&&(yield t)}}async function*et(e){let t=new Uint8Array;for await(let n of e){if(n==null)continue;let e=n instanceof ArrayBuffer?new Uint8Array(n):typeof n==`string`?ze(n):n,r=new Uint8Array(t.length+e.length);r.set(t),r.set(e,t.length),t=r;let i;for(;(i=We(t))!==-1;)yield t.slice(0,i),t=t.slice(i)}t.length>0&&(yield t)}var tt=class{constructor(){this.event=null,this.data=[],this.chunks=[]}decode(e){if(e.endsWith(`\r`)&&(e=e.substring(0,e.length-1)),!e){if(!this.event&&!this.data.length)return null;let e={event:this.event,data:this.data.join(`