sliccy 6.238.0 → 6.238.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/ui/.vite/manifest.json +177 -177
  2. package/dist/ui/assets/SKILL-C-CvOwkC.js +1 -0
  3. package/dist/ui/assets/{account-store-K5DJCchF.js → account-store-31cxummp.js} +1 -1
  4. package/dist/ui/assets/{account-store-DSFfWkyC.js → account-store-CLw42Fru.js} +1 -1
  5. package/dist/ui/assets/{adobe-CKAWge2t.js → adobe-BAOdeR6A.js} +1 -1
  6. package/dist/ui/assets/{adobe-CXsRvCQh.js → adobe-pjfER-WX.js} +1 -1
  7. package/dist/ui/assets/{agent-panels-CzvjMHHx.js → agent-panels-ClWyfRiy.js} +1 -1
  8. package/dist/ui/assets/{almost-bash-shell-headless-CqDPyH4O.js → almost-bash-shell-headless-HcCFdtfi.js} +566 -640
  9. package/dist/ui/assets/{apply-layout-C8rhHLUO.js → apply-layout-DtU7s70A.js} +1 -1
  10. package/dist/ui/assets/{azure-openai-o-8n2udD.js → azure-openai-16OjK7MW.js} +1 -1
  11. package/dist/ui/assets/{azure-openai-CkSWaEpT.js → azure-openai-2TldVerJ.js} +1 -1
  12. package/dist/ui/assets/{cdp-M1w55z6s.js → cdp-PMwUQne0.js} +67 -10
  13. package/dist/ui/assets/{cerebras-BgJaNEs9.js → cerebras-CZvVC6ct.js} +1 -1
  14. package/dist/ui/assets/{cerebras-CPMNlOll.js → cerebras-Q_C5CmzI.js} +1 -1
  15. package/dist/ui/assets/{composer-speech-Cy6MWDOo.js → composer-speech-B0V8REcq.js} +1 -1
  16. package/dist/ui/assets/{connect-surface-DlEcm9MI.js → connect-surface-BGMEPn4t.js} +1 -1
  17. package/dist/ui/assets/{directed-approval-D5t_HSLq.js → directed-approval-pLlyTlwa.js} +1 -1
  18. package/dist/ui/assets/{emscripten-vfs-hook-B8JXbn8m.js → emscripten-vfs-hook-H9599noy.js} +1 -1
  19. package/dist/ui/assets/{frozen-archive-writer--A0fKvni.js → frozen-archive-writer-YfpsS6Au.js} +1 -1
  20. package/dist/ui/assets/{gelatiere-unit-Dd0xq9hP.js → gelatiere-unit-DoZciEc0.js} +1 -1
  21. package/dist/ui/assets/{github-Cp0bBz-6.js → github-B0GZ69T6.js} +1 -1
  22. package/dist/ui/assets/{github-DMhqx6iO.js → github-C0JkJ4-X.js} +1 -1
  23. package/dist/ui/assets/{github-copilot-o5fDIWpu.js → github-copilot-6zjU0UsW.js} +1 -1
  24. package/dist/ui/assets/{github-copilot-XunB421U.js → github-copilot-DbVywZN-.js} +1 -1
  25. package/dist/ui/assets/{go-driver-DS6D_tfi.js → go-driver-CvHJRpyw.js} +3 -3
  26. package/dist/ui/assets/{hear-ByYFfoiZ.js → hear-PNcT_h1V.js} +1 -1
  27. package/dist/ui/assets/{help-DuAvKnbR.js → help-Dgedzig_.js} +7 -5
  28. package/dist/ui/assets/{js-realm-worker-Bxz7W1wn.js → js-realm-worker-DPtEPsQE.js} +2 -2
  29. package/dist/ui/assets/{jsh-executor-CElf4lyu.js → jsh-executor-qcdlZs_U.js} +3 -3
  30. package/dist/ui/assets/{kernel-worker-DNqum68Q.js → kernel-worker-CkGJtXT8.js} +132 -75
  31. package/dist/ui/assets/{lick-ws-bridge-Cpw9Hazg.js → lick-ws-bridge-BRyT27BZ.js} +1 -1
  32. package/dist/ui/assets/{lick-ws-bridge-CsdPXXvp.js → lick-ws-bridge-DCphRN_U.js} +1 -1
  33. package/dist/ui/assets/{live-session-curation-BaXokl-K.js → live-session-curation-NUhwcw--.js} +1 -1
  34. package/dist/ui/assets/{live-session-snapshot-Drer629d.js → live-session-snapshot-BeRCm1Nl.js} +1 -1
  35. package/dist/ui/assets/{local-llm-DuUIu9n3.js → local-llm-BXkyCJ_z.js} +1 -1
  36. package/dist/ui/assets/{local-llm-_K7t0h4f.js → local-llm-CtOUVB_I.js} +1 -1
  37. package/dist/ui/assets/{main-Dbl4-foD.js → main-Dz8oxllC.js} +3 -3
  38. package/dist/ui/assets/{main-cherry-gU3QGlLU.js → main-cherry-BIyXJ_3M.js} +1 -1
  39. package/dist/ui/assets/{mcp-command-_TUrcGr6.js → mcp-command-DFAER6FF.js} +9 -9
  40. package/dist/ui/assets/{memory-curation-seam-CVNy5qqo.js → memory-curation-seam-DbGKr9Qe.js} +1 -1
  41. package/dist/ui/assets/{memory-health-DDfUWAhk.js → memory-health-DhHUtC2W.js} +1 -1
  42. package/dist/ui/assets/{memory-write-execute-CDV9jZnq.js → memory-write-execute-CBCk5a7F.js} +1 -1
  43. package/dist/ui/assets/{merge-folded-cost-into-frozen-5xiMRDDP.js → merge-folded-cost-into-frozen-Dw-_UA2z.js} +1 -1
  44. package/dist/ui/assets/{new-session-BZVdijuX.js → new-session-BUSZCuxQ.js} +2 -2
  45. package/dist/ui/assets/{oauth-bootstrap-DPuHmiuS.js → oauth-bootstrap-D8AxQ1UY.js} +2 -2
  46. package/dist/ui/assets/{onboarding-orchestrator-Gx3ukXDO.js → onboarding-orchestrator-DLdo_5OL.js} +1 -1
  47. package/dist/ui/assets/{openai-codex-DFEBOBp_.js → openai-codex-BWfnGR1c.js} +1 -1
  48. package/dist/ui/assets/{openai-codex-BM2Ls-YO.js → openai-codex-C6EGG09A.js} +1 -1
  49. package/dist/ui/assets/{openrouter-Aq-Kzxw6.js → openrouter-Cd4M2AC9.js} +1 -1
  50. package/dist/ui/assets/{openrouter-Cw7-S7HP.js → openrouter-Cnz8aWy1.js} +1 -1
  51. package/dist/ui/assets/{openrouter-free-DFsw1T3q.js → openrouter-free-CWrvYeNH.js} +1 -1
  52. package/dist/ui/assets/{openrouter-free-AHPHE6gB.js → openrouter-free-P0Xql0dR.js} +1 -1
  53. package/dist/ui/assets/{openrouter-oauth-DzPjdk-Y.js → openrouter-oauth-CpETMetI.js} +1 -1
  54. package/dist/ui/assets/{openrouter-oauth-DPHrgsVu.js → openrouter-oauth-DhzFBQj1.js} +1 -1
  55. package/dist/ui/assets/{panel-rpc-handlers-BR8OSqPr.js → panel-rpc-handlers-2KrUyWoh.js} +2 -2
  56. package/dist/ui/assets/{panelize-shell-D4nz-t5F.js → panelize-shell-BDbzN4ZN.js} +1 -1
  57. package/dist/ui/assets/{pi-edit-execution-C1kd3eLE.js → pi-edit-execution-DruO8N4U.js} +1 -1
  58. package/dist/ui/assets/pipe-status-BBrT3VeG.js +5 -0
  59. package/dist/ui/assets/{provider-BtMtOs2W.js → provider-C-FUejo2.js} +1 -1
  60. package/dist/ui/assets/{provider-B2yHk7oU.js → provider-DqpPcXNC.js} +1 -1
  61. package/dist/ui/assets/{provider-settings-CUL7LIod.js → provider-settings-BvpuRRhI.js} +1 -1
  62. package/dist/ui/assets/provider-store-access-CTsEO0b_.js +1 -0
  63. package/dist/ui/assets/provider-store-access-DXdBN4uE.js +1 -0
  64. package/dist/ui/assets/{providers-BUAe2eUe.js → providers-00axKtF9.js} +1 -1
  65. package/dist/ui/assets/{providers-BDpLAzfX.js → providers-jD6rCt0u.js} +2 -2
  66. package/dist/ui/assets/{quick-llm-C_p-0WNI.js → quick-llm-Cx7uDkYg.js} +1 -1
  67. package/dist/ui/assets/{realm-inprocess-BVHa1n4_.js → realm-inprocess-dFpgqzhW.js} +2 -2
  68. package/dist/ui/assets/{realm-unhandled-rejections-B85FEa4F.js → realm-unhandled-rejections-Blp7ZN8C.js} +1 -1
  69. package/dist/ui/assets/{realm-unhandled-rejections-C0wH9mem.js → realm-unhandled-rejections-DtlG5cWZ.js} +1 -1
  70. package/dist/ui/assets/{recovery-screen-BagFQnuK.js → recovery-screen-CBqYteQO.js} +1 -1
  71. package/dist/ui/assets/{remote-terminal-view-pKN-v_Dn.js → remote-terminal-view-X7kW2LxE.js} +2 -2
  72. package/dist/ui/assets/restore-BqarpWVq.js +1 -0
  73. package/dist/ui/assets/{run-Ya7qy3MQ.js → run-BL31T-_Z.js} +2 -2
  74. package/dist/ui/assets/{run-DMfFMxTu.js → run-Bmg4J98v.js} +1 -1
  75. package/dist/ui/assets/{run-c70sEj_s.js → run-CcKwxzLY.js} +1 -1
  76. package/dist/ui/assets/run-DKWaudm_.js +18 -0
  77. package/dist/ui/assets/{run-BNvk9_v0.js → run-DvuN8Fn9.js} +2 -2
  78. package/dist/ui/assets/{run-xrSr00dd.js → run-l4-ivwOu.js} +1 -1
  79. package/dist/ui/assets/script-catalog-D5joO5l7.js +2 -0
  80. package/dist/ui/assets/{session-command-memory-CeiBXm_q.js → session-command-memory-_ama7cso.js} +2 -2
  81. package/dist/ui/assets/{session-jsonl-CZ7erF8E.js → session-jsonl-CXVf4Wha.js} +1 -1
  82. package/dist/ui/assets/{session-jsonl-D-pOMGmr.js → session-jsonl-deH2Aa3g.js} +1 -1
  83. package/dist/ui/assets/{session-search-index-BuLUXlX8.js → session-search-index-DF1RrbAV.js} +1 -1
  84. package/dist/ui/assets/{setup-feature-flags-remote-BYePF-d_.js → setup-feature-flags-remote-DVMDmUlc.js} +1 -1
  85. package/dist/ui/assets/{setup-model-catalog-DJS8QEtY.js → setup-model-catalog-spckEhB7.js} +1 -1
  86. package/dist/ui/assets/{silent-renew-backoff-BmTBjYE8.js → silent-renew-backoff-cI7-L6ZH.js} +1 -1
  87. package/dist/ui/assets/slicc-version-CnSXxWG8.js +1 -0
  88. package/dist/ui/assets/snapshot-HHgn9isb.js +5 -0
  89. package/dist/ui/assets/snapshot-features-C59UnBDa.js +9 -0
  90. package/dist/ui/assets/{soundscape-D00lkQB0.js → soundscape-BiMkGsdL.js} +1 -1
  91. package/dist/ui/assets/{speak-22GRzWrR.js → speak-4zKEV89Z.js} +1 -1
  92. package/dist/ui/assets/{sprinkle-manager-Djo48oat.js → sprinkle-manager-fCGR1PM3.js} +1 -1
  93. package/dist/ui/assets/{sprinkle-renderer-BSEdWZhI.js → sprinkle-renderer-Dz9sFggb.js} +1 -1
  94. package/dist/ui/assets/{state-BOigwV2f.js → state-Dx_7TiP6.js} +5 -5
  95. package/dist/ui/assets/{sudo-B0dYM82w.js → sudo-DIy3Tv_K.js} +1 -1
  96. package/dist/ui/assets/{supervisor-DLk8e9W6.js → supervisor-jHdimydd.js} +1 -1
  97. package/dist/ui/assets/{sync-dialog-QrYOH8ZT.js → sync-dialog-DRMVOJG5.js} +1 -1
  98. package/dist/ui/assets/{transformers-env-iJW-oU0y.js → transformers-env-x-PCt3wI.js} +1 -1
  99. package/dist/ui/assets/{tray-leader-Cm5EL2cx.js → tray-leader-C5LqCGmj.js} +1 -1
  100. package/dist/ui/assets/{tray-leave-runtime-JPbh-fWi.js → tray-leave-runtime-BlIyiXG2.js} +1 -1
  101. package/dist/ui/assets/{tray-sidecar-VbCtddJm.js → tray-sidecar-B-QapNna.js} +1 -1
  102. package/dist/ui/assets/{upgrade-detection-BC43dsWo.js → upgrade-detection-CJITafNt.js} +1 -1
  103. package/dist/ui/assets/{validate-args-BcxRh84E.js → validate-args-hQ6FqlWN.js} +1 -1
  104. package/dist/ui/assets/{voice-reply-DOtdANeY.js → voice-reply-Cd-5pJIs.js} +1 -1
  105. package/dist/ui/assets/{wc-attach-CeA7pHKs.js → wc-attach-CC-5pK7A.js} +2 -2
  106. package/dist/ui/assets/{wc-browser-BPQkC-5u.js → wc-browser-Db8oxDQT.js} +1 -1
  107. package/dist/ui/assets/{wc-computers-CYMPvo-x.js → wc-computers-CZPS1Eh7.js} +1 -1
  108. package/dist/ui/assets/{wc-detached-B9FwLGw0.js → wc-detached-DWYp5wAP.js} +1 -1
  109. package/dist/ui/assets/{wc-extension-WUbBhroP.js → wc-extension-5IglZTwJ.js} +2 -2
  110. package/dist/ui/assets/{wc-follower-kE-HfPUQ.js → wc-follower-9iDYp3OE.js} +3 -3
  111. package/dist/ui/assets/{wc-follower-oauth-D5LUyvC7.js → wc-follower-oauth-QbGGYO0B.js} +1 -1
  112. package/dist/ui/assets/{wc-gelatiere-BnXeZDbM.js → wc-gelatiere-BjdhvBxs.js} +1 -1
  113. package/dist/ui/assets/{wc-live-V4rcz4Uu.js → wc-live-BFxhQ5Xo.js} +5 -5
  114. package/dist/ui/assets/{wc-nav-CpLV0zl0.js → wc-nav-DLvCv4mT.js} +2 -2
  115. package/dist/ui/assets/{wc-onboarding-CkSVfDNx.js → wc-onboarding-CJR0jxsa.js} +2 -2
  116. package/dist/ui/assets/{wc-permissions-InmLVeDO.js → wc-permissions-osnYtYLb.js} +2 -2
  117. package/dist/ui/assets/{wc-placeholder-DLJI5g5C.js → wc-placeholder-C4ikML_h.js} +3 -3
  118. package/dist/ui/assets/{wc-secret-request-CKhViaCN.js → wc-secret-request-B3lpntmP.js} +1 -1
  119. package/dist/ui/assets/{wc-settings-F0Nos7vN.js → wc-settings-C4ZOprvY.js} +3 -3
  120. package/dist/ui/assets/{wc-shell-BLBm7Ua3.js → wc-shell-Cx3tnmkh.js} +3 -3
  121. package/dist/ui/assets/{wc-shortcut-config-CpHEuwxq.js → wc-shortcut-config-Cs8WeBXf.js} +1 -1
  122. package/dist/ui/assets/{wc-sprinkles-B9k4zQN0.js → wc-sprinkles-DGi3j1Ev.js} +2 -2
  123. package/dist/ui/assets/{wc-transcript-export-fmUpwSAy.js → wc-transcript-export-Uk4DpVPz.js} +2 -2
  124. package/dist/ui/assets/{wc-tray-DiQ-pOQa.js → wc-tray-DselVbJr.js} +4 -4
  125. package/dist/ui/assets/welcome-detection-CN0SSbnT.js +1 -0
  126. package/dist/ui/assets/{whisper-session-BdQmRMRo.js → whisper-session-BtQ1Vj74.js} +2 -2
  127. package/dist/ui/assets/{xai-grok-xUghnSq4.js → xai-grok-0uY_cbQl.js} +1 -1
  128. package/dist/ui/assets/{xai-grok-MRaFyR9W.js → xai-grok-BYbyfA0E.js} +1 -1
  129. package/dist/ui/index.html +3 -3
  130. package/dist/ui/packages/webapp/index.html +3 -3
  131. package/package.json +1 -1
  132. package/dist/ui/assets/SKILL-IFmza_44.js +0 -1
  133. package/dist/ui/assets/provider-store-access-B4GuLxd3.js +0 -1
  134. package/dist/ui/assets/provider-store-access-DxOcFF8O.js +0 -1
  135. package/dist/ui/assets/reason-l_1I9RdR.js +0 -5
  136. package/dist/ui/assets/restore-CKpUI1cw.js +0 -1
  137. package/dist/ui/assets/run-BI9A9cl8.js +0 -18
  138. package/dist/ui/assets/script-catalog-WaCMvXY3.js +0 -2
  139. package/dist/ui/assets/slicc-version-vARYXlwc.js +0 -1
  140. package/dist/ui/assets/snapshot-YDNf2VnW.js +0 -5
  141. package/dist/ui/assets/snapshot-features-Kbro52QQ.js +0 -12
  142. package/dist/ui/assets/welcome-detection-KO-5PJFl.js +0 -1
@@ -0,0 +1 @@
1
+ var e="---\nname: playwright-cli\ndescription: |\n Use this whenever the user asks to browse, navigate, click, fill a form,\n scrape, take a screenshot, or otherwise interact with a web page. SLICC drives\n the browser through the `playwright-cli` shell command (also aliased as\n `playwright` and `puppeteer`). Read this BEFORE running any browser\n automation: every tab-operating command requires a `--tab` target id, and\n multi-agent tab handling has rules you must follow.\nallowed-tools: bash\n---\n\n# Browser Automation via playwright-cli\n\nUse `playwright-cli` (also aliased as `playwright` and `puppeteer`) via the bash tool for all browser automation.\n\n**Every tab-operating command requires `--tab=<targetId>`.** There is no implicit \"current tab\". Always specify which tab you're operating on.\n\n`playwright-cli <command> --help` prints that command's usage and does nothing else — safe to run before any action.\n\n## Quick Start\n\n```bash\n# 1. Open a page — note the targetId in the output\nplaywright-cli open https://example.com\n# Output: Opened https://example.com in new tab [targetId: E9A3F...]\n\n# 2. Take a snapshot to see the page structure and get element refs\nplaywright-cli snapshot --tab=E9A3F\n\n# 3. Interact using refs from the snapshot (e.g. e5, e12)\nplaywright-cli click --tab=E9A3F e5\nplaywright-cli fill --tab=E9A3F e12 \"hello world\"\n\n# 4. Each action prints \"Snapshot: <path>\" — read it to see what changed\nplaywright-cli snapshot --tab=E9A3F\n```\n\n## Tab IDs\n\n- `tab-list` shows all tabs with their targetIds and a stable `(tab N)` number. In the extension the user's active tab is marked `(active)`; standalone Chrome does not report it.\n- `tab-new` / `open` return the new tab's targetId — capture it for subsequent commands.\n- Use `--tab=<targetId>` on ALL commands that operate on a tab.\n\n## Frame IDs\n\n- `frames --tab=<targetId>` lists frame IDs. A frame ID is not a tab target ID; never pass it to `--tab`.\n- Use `--tab=<targetId> --frame=<frameId>` with `eval`, `eval-file`, or `snapshot` to target a child frame, including cross-origin frames.\n- A frame-scoped `snapshot` prints only that frame's accessibility subtree. Its frame-prefixed refs (`f1e5`) work with every ref command except `drag`, `screenshot`, and `snapshot --boxes`; do not pass `--frame` to those commands.\n\n## Common Failure Modes\n\n- `--tab <targetId> is required` — you forgot `--tab=<id>`. Run `tab-list` to get IDs.\n- `is a frame ID, not a tab target ID` — keep the owning tab's targetId in `--tab` and pass the frame ID with `--frame`.\n- `No snapshot available` — run `snapshot --tab=<id>` before using refs.\n- `unknown flag \"--x\"` / `unexpected argument \"y\"` — every subcommand rejects arguments it does not\n support, so an exit code of 0 means everything you passed was honoured. Check `<verb> --help`.\n- For free-text payloads that start with `-` (e.g. `fill`/`type`/`eval`), put `--` before the text:\n `fill --tab=<id> e1 -- --dash-looking`.\n- `is not an element ref` — a screenshot's positional is a main-frame element ref (`e5`); the output\n path is `--filename=<path>`. Frame-prefixed refs (`f1e5`) clip only with `click`-family commands.\n- `Unknown ref` / `is no longer on the page` — that element was removed or renamed, or the page navigated. Re-run `snapshot` for current refs; a ref is never re-pointed at a different element.\n- Refs are tied to **one tab + one page load**. They do not carry across tabs, navigations, or reloads.\n\n## Element Refs\n\nSnapshots assign short ref IDs (`e1`, `e2`, ...) to interactive elements. Use these refs with `click`, `fill`, `dblclick`, `hover`, `select`, `check`, `uncheck`, `drag`, `upload`, `drop`, and `screenshot`.\n\nWhen present, accessibility states appear after the ref in Playwright aria-snapshot form — `[checked]`, `[checked=mixed]`, `[expanded]` / `[expanded=false]`, `[selected]`, `[pressed]`, `[disabled]`, `[level=N]` — so a re-snapshot shows whether a radio, disclosure, tab, or toggle changed.\n\nA ref names one element for as long as that element stays on the page with the same role and name. When the page adds an element, it gets a new ref and the existing refs do not shift, so `fill e28 …; fill e30 …; click e31` keeps hitting the elements you read. A ref whose element is gone fails loudly instead of acting on whatever took its place.\n\n## Commands\n\nAll commands below that operate on a tab require `--tab=<targetId>`.\n\n### Core\n\n```bash\nplaywright-cli open [url] [--foreground] [--mobile] # Open tab (background by default), returns targetId\nplaywright-cli tab-new [url] [--foreground] [--mobile] # Same as open\nplaywright-cli tab-close --tab=<id> # Close tab (alias: close)\nplaywright-cli goto --tab=<id> <url> # Navigate tab\nplaywright-cli navigate --tab=<id> <url> # Alias for goto\nplaywright-cli snapshot --tab=<id> [--frame=<frameId>] [--no-iframes] [--filename=path] [--depth=<n>] [--boxes] # Tab tree or one frame subtree; --depth limits nesting, --boxes adds [box=x,y,w,h] rects\nplaywright-cli find --tab=<id> <text> # Search the snapshot for text (case-insensitive), returns matching lines + context\nplaywright-cli find --tab=<id> --regex=<re> # Same, with a regexp (use either text or --regex, not both)\nplaywright-cli eval --tab=<id> [--frame=<frameId>] <expression> [--filename=path|--output=path] # Evaluate JS in a tab/frame, incl. top-level await/return; use `--` before an expression that starts with `-`\nplaywright-cli eval-file --tab=<id> [--frame=<frameId>] <vfs-path> [--output=path|--filename=path] # Evaluate JS from a VFS file in a tab/frame (top-level await/return supported)\nplaywright-cli frames --tab=<id> # List frame IDs for --frame (not --tab)\nplaywright-cli resize --tab=<id> <width> <height> # Resize viewport\n```\n\n`--foreground` (or `--fg`) opens the new tab **in the foreground** — it brings the\nnew tab to the front and switches the user's visible/active tab to it, instead of\nopening in the background.\n\n**Bringing a tab to the foreground (activate / focus / raise / switch to a tab):**\n\n- **New tab** → `open <url> --foreground` (or `tab-new <url> --fg`).\n- **Existing tab** → `tab-select --tab=<targetId>`, or `tab-select <N>` with the `(tab N)` number from `tab-list`. Numbers stick to their tab while it is open (new tabs get the next number), so they do not shift when other agents open or close tabs.\n\n`--mobile` opens the tab with generic mobile-device emulation (viewport,\ndevice pixel ratio, touch, Android Chrome UA), sticky for the tab's lifetime —\na later `resize` changes only the dimensions and keeps the mobile identity.\nMobile pages are usually lighter, which saves tokens.\n\nThese two are the ONLY ways to change which tab is in front. There is no\n`activate`, `bring-to-front`, or `focus` subcommand, and `eval`-ing\n`window.focus()` does NOT work (browsers block a page from stealing foreground).\nIf a tab didn't come to the front, re-run `tab-select` / `--foreground` — do not\nfall back to `window.focus()`.\n\n### Interaction\n\n```bash\nplaywright-cli click --tab=<id> <ref> [--modifiers=Shift,Control,Alt,Meta] # Click element\nplaywright-cli dblclick --tab=<id> <ref> [button] [--modifiers=...] # Double-click\nplaywright-cli fill --tab=<id> <ref> <text> [--submit] # Clear input + type text (--submit presses Enter); use `--` before text that starts with `-`\nplaywright-cli type --tab=<id> <text> [--submit] # Type into focused element (--submit presses Enter); use `--` before text that starts with `-`\nplaywright-cli hover --tab=<id> <ref> # Hover over element\nplaywright-cli select --tab=<id> <ref> <value> # Select dropdown value\nplaywright-cli check --tab=<id> <ref> # Check checkbox/radio\nplaywright-cli uncheck --tab=<id> <ref> # Uncheck checkbox/radio\nplaywright-cli drag --tab=<id> <startRef> <endRef> # Drag and drop\nplaywright-cli upload --tab=<id> [ref] <file> [file...] # Upload VFS files to file input as raw bytes (optional snapshot ref targets hidden inputs)\nplaywright-cli drop --tab=<id> <ref> [--path=<vfs-path>] [--data=<mime/type=value>] # Drop files/data onto element (--path drops raw bytes)\nplaywright-cli dialog-accept --tab=<id> [text] # Accept JS dialog\nplaywright-cli dialog-dismiss --tab=<id> # Dismiss JS dialog\n```\n\n### Keyboard\n\n```bash\nplaywright-cli press --tab=<id> <key> # Press key (keyDown + keyUp, e.g. Enter, Tab, Escape)\nplaywright-cli keydown --tab=<id> <key> # Hold key down (no paired keyUp)\nplaywright-cli keyup --tab=<id> <key> # Release held key (no paired keyDown)\n```\n\n### Mouse\n\n```bash\nplaywright-cli mousemove --tab=<id> <x> <y> # Move mouse to coordinates (negative coords ok, e.g. -10 20)\nplaywright-cli mousedown --tab=<id> [button] # Press mouse button (left/right/middle, default: left)\nplaywright-cli mouseup --tab=<id> [button] # Release mouse button\nplaywright-cli mousewheel --tab=<id> <dx> <dy> # Scroll mouse wheel (negative deltas ok, e.g. 0 -300)\n```\n\n### Navigation\n\n```bash\nplaywright-cli go-back --tab=<id> # history.back()\nplaywright-cli go-forward --tab=<id> # history.forward()\nplaywright-cli reload --tab=<id> # Reload page\n```\n\n### Teleport\n\n```bash\nplaywright-cli teleport --tab=<id> --start=<regex> --return=<regex> [--timeout=<s>]\nplaywright-cli teleport --list # List available follower runtimes\nplaywright-cli teleport --off --tab=<id> # Cancel a teleport on this tab\nplaywright-cli open <url> --teleport-start=<regex> --teleport-return=<regex>\nplaywright-cli goto --tab=<id> <url> --teleport-start=<regex> --teleport-return=<regex>\n```\n\nTeleport is for leader/follower tray auth handoffs. Scoped to a specific tab — only commands targeting the teleporting tab are blocked; other tabs remain operational.\n\n`--runtime` is optional: without it, teleport picks the most recently active eligible follower (preferring standalone floats). Only followers that can actually serve cookies are eligible — cherry hosts, exec-only CLI followers, and any target advertising `network: false` are excluded, so a teleport fails fast instead of \"succeeding\" with zero cookies.\n\n### Screenshots\n\n```bash\nplaywright-cli screenshot --tab=<id> # Save to $TMPDIR/screenshot-<ts>.png\nplaywright-cli screenshot --tab=<id> --filename=page.png # Save to custom path\nplaywright-cli screenshot --tab=<id> e5 # Clip to an element (positional = MAIN-FRAME ref, not a path)\nplaywright-cli screenshot --tab=<id> --fullPage # Full scrollable page (alias: --full-page)\nplaywright-cli screenshot --tab=<id> --max-width=800 # Downscale to a max width (png output only)\nplaywright-cli screenshot --tab=<id> --type=jpeg # png (default) / jpeg / webp; inferred from --filename extension\nplaywright-cli screenshot --tab=<id> --hires # Capture in device pixels (honors device pixel ratio)\n```\n\nViewport screenshots (default, `--max-width`, `--hires`) honor the tab's current scroll position. `--fullPage` captures from the document origin.\n\nAn element screenshot (`screenshot e5`) returns **that element's crop or fails**\n(exit 1) — typically because the snapshot went stale after a navigation or\nlayout change. Re-run `snapshot` and retry with a fresh ref; it never silently\nsubstitutes a full-viewport frame.\n\nA `resize` sticks to its tab: the viewport override is re-applied automatically\nwhenever the tab is re-attached, so another driver switching tabs cannot reset\nit.\n\nAll playwright-cli commands share one browser, and locking is **per tab**:\ncommands on different tabs run in parallel; commands on the same tab serialize.\nA slow or hung navigation stalls only its own tab. A few genuinely global\noperations (`tab-select`, `--foreground`, and the attach that points the bridge\nat a tab) still take a bridge-wide lock, but they are short and never wrap a\npage wait. When callers queue up, commands may emit a\n`note: browser bridge contended — ...` line on stderr with the total lock wait\nand queue depth; the note says whether the wait was on **this tab** or\n**bridge-wide**. Either way it is back-off guidance — stagger callers or give\neach one its own tab, never re-run the command; it already ran, it was just\nslow to get the lock.\n\n**Giving up cancels the command.** When your `bash` call stops waiting — the\nturn is cancelled, `timeout` fires, or someone runs `kill <pid>` — the\nplaywright-cli command is cancelled too instead of running on for a caller that\nis gone: a queued command drops out of the tab's queue without taking the lock,\na `goto` waiting on a load event and a `waitForSelector` poll stop at once, and\na multi-step command stops before its next CDP round trip. Such a command exits\n**130** with a stderr line naming the step it stopped at, never 0.\n\nTwo consequences for you:\n\n- A cancelled command may have **half-landed**. The CDP request already on the\n wire cannot be recalled, so keys may be typed or a click delivered before the\n stop. `snapshot` the tab and continue from what you see rather than blindly\n re-running — same rule as a mid-command session reset.\n- `background_after` alone does **not** cancel; it detaches, and the command\n keeps running as a background job (that is what makes a long `goto` usable).\n Use `timeout` or `kill <pid>` when you actually want it stopped.\n\n**Stale session.** The bridge re-attaches automatically after a Chrome reset;\nthere is no need to reload the tab or open a new one. Two error shapes:\n\n- `Session with given id not found` — the bridge already re-attached; re-run\n the command.\n- `… was reset mid-command … the outcome is unknown` — part of the command may\n have landed (keys typed, a click delivered) before the session died. Do NOT\n blindly re-run it: `snapshot` the tab first and continue from what you see.\n\n### Save As\n\n```bash\nplaywright-cli pdf --tab=<id> [--filename=path] # Save page as PDF (not available in extension mode)\n```\n\n### Viewing pages and screenshots yourself\n\nThe browser displays things to the human; `open --view` is what lets _you_ see them. **But viewing screenshots is a last resort for the cone — every image you load eats a large chunk of the context window** (a single 1280×800 PNG can run 1500+ tokens, full-page screenshots much more). Reach for cheaper signals first:\n\n1. **`playwright-cli snapshot --tab=<id>`** — text accessibility tree. Use this first; it answers \"what's on the page\" for almost all verification tasks at a tiny fraction of the token cost. On a big page, `find --tab=<id> <text>` greps the snapshot and returns just the matching lines with context, and `snapshot --depth=<n>` caps the tree — both much cheaper than the full tree.\n2. **`eval` against the DOM** — when you need a specific value (`document.title`, an attribute, computed style), `eval` it. Don't screenshot for facts you can extract.\n3. **Delegate visual inspection to a scoop.** If the cone genuinely needs vision (layout regression, render fidelity, \"does this look right\"), spawn a scoop to take and view the screenshot — the scoop's context absorbs the tokens, and you receive its summary back. The cone's window stays clean for orchestration.\n4. **`open --view` in the cone** — only when the cone itself must see pixels for its current decision and steps 1–3 won't do.\n\n**What you CAN see:**\n\n- `open --view --size <low|medium|high|WxH> <path>` — reads an image from the VFS and returns it, resized to fit the box (`low` 256×256, `medium` 768×768, `high` 1536×1536). `--size` is required. Works with PNG, JPEG, GIF, WebP, SVG.\n- `playwright-cli screenshot --tab=<id> --filename=<path>` + `open --view --size medium <path>` — screenshot a tab, then view it.\n- `screencapture --view screenshot.png` — capture the user's screen via browser screen sharing.\n- `screencapture --video -V 10 clip.webm` — record a timed screen/window/tab clip (WebM).\n- `playwright-cli snapshot --tab=<id>` — accessibility tree (text). Use to verify content without vision.\n\n**What only the human sees:**\n\n- `serve <dir>` — opens an app directory in a browser tab (read-only preview).\n- Preview URLs survive authenticated tray roves without changing their original directory, entry file, or bridge permissions. A handoff can briefly return `503`; retry the same pending rove rather than minting another target. Bridge tabs reconnect automatically (their connection IDs may change). Revoked previews stay revoked, and persistent snapshots keep their original expiry rather than receiving a fresh TTL.\n- Persistent uploads retry safely only with the same file bytes and MIME type. Body/R2-write waits time out after 30 seconds. Unknown writes retain bounded cleanup bookkeeping (up to eight unresolved uploads per preview); expiry/revoke never makes such a preview serve again, even if a delayed write finishes later.\n- `serve --ttl 30d <dir>` — uploads an immutable snapshot that works without the leader. TTL units are whole `m`, `h`, `d`, or `w`, capped at 30 days. It implies `--no-bridge`, conflicts with `--bridge`/`--max-tabs`, and is limited to 1,000 files, 25 MiB per file, and 50 MiB total. Use `serve --list` for mode/expiry and `serve --stop <token>` to revoke it early.\n- **`serve` limits — plan for them:** a live-preview file over 25 MiB is served only through Range requests (a plain GET answers 413; media elements use ranges, so no splitting is needed), and `--ttl` files must be ≤ 25 MiB. A tray holds at most **10 `--ttl` snapshots** (uploads in progress count); live previews have no quota. A live preview is deleted once the leader has been disconnected for 5 minutes; a snapshot lasts until its TTL. Each `serve` prints `Preview token: …`; `serve --stop <token-or-url>` snapshots you no longer need, and on `Snapshot limit reached` run `serve --list` and stop old ones.\n- `serve --bridge <dir>` — opens a **driveable** preview whose visitors auto-connect as live synthetic-CDP targets you can navigate/click/evaluate/screenshot via playwright. **Security: opt-in only; cross-subdomain cookie risk accepted (host-only cookies isolated; `Domain=.sliccy.now` cookies readable across previews).** Flags: `--max-tabs <N>` (default 20), `--quiet` (suppress the first-visit announcement), `--no-bridge` (force read-only), `--stop <token>` (revoke + delete webhook). Use `serve --logs [<token>] [--lines <N>]` to inspect leader-memory-only connect/disconnect records without emitting a lick or waking the cone. `serve --truncate [<token>]` clears matching records **and re-arms the first-visit announcement**, so the next visit announces once. Visitor page API: `window.slicc.emit(name, detail?)` (fires webhook lick on cone), `window.slicc.on(name, cb)` (subscribes to CustomEvents you dispatch).\n- **Media in `serve` previews plays through Range requests:** live previews answer `Range` in ≤ 8 MiB windows, so `<video>`/`<audio>` larger than 25 MiB play and seek without splitting; only a plain full-file GET of such a file gets 413. `--ttl` snapshots support Range too (their files stay ≤ 25 MiB).\n- `open <path>` (no flags) — opens a file in a browser tab.\n- `imgcat <path>` — displays an image in the terminal preview.\n\n**Workflow to verify a page (when vision is actually required):**\n\n1. `serve /workspace/app` — open the app (the human sees it).\n2. `playwright-cli tab-list` — find the tab by URL, note the targetId.\n3. `playwright-cli snapshot --tab=<id>` — required before screenshot, and often answers your question on its own.\n4. `playwright-cli screenshot --tab=<id> --filename=\"$TMPDIR/shot.png\"` — consider `--max-width` to keep the file small.\n5. `open --view --size medium \"$TMPDIR/shot.png\"` — now you can see it. Use `--size low` when layout is all you need. Strongly prefer doing this from a scoop, not the cone.\n\n**Don't:**\n\n- Default to screenshots when a snapshot would do.\n- `read_file` on a PNG or base64-encode to view images.\n- `imgcat` or `cat` on screenshots expecting to see them.\n- Open a screenshot then screenshot that tab.\n- Use `eval` to check the active tab — use `tab-list`.\n\n### Tab Management\n\n```bash\nplaywright-cli tab-list # List tabs with targetIds, (tab N), (active) marker\nplaywright-cli tab-new [url] # New tab, returns targetId\nplaywright-cli tab-close --tab=<id> # Close specific tab\nplaywright-cli tab-select --tab=<id> # Select (bring to front) a tab by targetId\nplaywright-cli tab-select <N> # ... or by its (tab N) number from tab-list\n```\n\n### Cookies\n\n```bash\nplaywright-cli cookie-list --tab=<id> [--domain=<d>] [--path=<p>] # List cookies (filter by domain/path)\nplaywright-cli cookie-get --tab=<id> <name> # Get cookie\nplaywright-cli cookie-set --tab=<id> <name> <value> [--sameSite=Strict|Lax|None] [other flags] # Set cookie\nplaywright-cli cookie-delete --tab=<id> <name> [--domain= --path=] # Delete cookie\nplaywright-cli cookie-clear --tab=<id> # Clear all cookies\n```\n\n### Storage\n\n```bash\nplaywright-cli localstorage-list --tab=<id>\nplaywright-cli localstorage-get --tab=<id> <key>\nplaywright-cli localstorage-set --tab=<id> <key> <value>\nplaywright-cli localstorage-delete --tab=<id> <key>\nplaywright-cli localstorage-clear --tab=<id>\n# Same pattern for sessionstorage-*\nplaywright-cli state-save --tab=<id> [filename|--filename=path] # Save cookies + localStorage to JSON\nplaywright-cli state-load --tab=<id> <filename> # Restore from state file\n```\n\n### Network\n\n```bash\nplaywright-cli console --tab=<id> [min-level] [--clear] # List console messages (debug/log/info/warning/error)\nplaywright-cli requests --tab=<id> [--static] [--filter=<regex>] [--clear] # List network requests\nplaywright-cli request --tab=<id> <index> [--filename=path] # Full request details\nplaywright-cli request-headers --tab=<id> <index> # Request headers only\nplaywright-cli request-body --tab=<id> <index> # Request body only\nplaywright-cli response-headers --tab=<id> <index> # Response headers only\nplaywright-cli response-body --tab=<id> <index> [--filename=path] # Response body (--filename saves the exact bytes)\nplaywright-cli network-state-set --tab=<id> <online|offline> # Toggle network state\nplaywright-cli route --tab=<id> <pattern> [--status=N] [--body=text] [--content-type=type] [--header=name:value]\nplaywright-cli route-list --tab=<id> # List active routes\nplaywright-cli unroute --tab=<id> [pattern] # Remove routes (all if no pattern)\n```\n\n### DevTools\n\n```bash\nplaywright-cli generate-locator --tab=<id> <ref> # Generate Playwright locator string for element\nplaywright-cli highlight --tab=<id> <ref> [--style=<css>] # Highlight element with visual overlay\nplaywright-cli highlight --tab=<id> --hide [ref] # Remove highlight (all if no ref)\n```\n\n### HAR Recording\n\n```bash\nplaywright-cli record [url] [--filter=<js-expr>] # Open tab with network recording\nplaywright-cli stop-recording <recordingId> # Stop and save HAR\n```\n\n## Multi-Agent Tab Behavior\n\n**All agents (cone + scoops) share the same tab namespace.** There is no tab isolation.\n\n- `tab-list` shows **every** tab from every agent — yours, the cone's, other scoops'. The list can be noisy.\n- Any agent can `eval`, `snapshot`, or `close` any tab — there are no ownership checks.\n- Tab counts fluctuate as other agents open and close tabs concurrently.\n\n**Best practices for scoops:**\n\n1. **Track your own tab IDs.** When you open a tab, capture the targetId and store it. Don't rely on `tab-list` to find your tabs later — other agents' tabs will be mixed in.\n\n ```bash\n # Open and capture the ID\n playwright-cli tab-new https://example.com\n # Output: Opened https://example.com in new tab [targetId: ABC123...]\n # Use ABC123 for all subsequent commands on this tab\n ```\n\n2. **NEVER close tabs you didn't open.** Tabs you don't recognize belong to the **user** or other agents. User tabs are off-limits unless the user explicitly asks you to close them. Only close tabs whose targetId you captured from your own `tab-new` / `open` calls.\n\n3. **Handle \"tab not found\" gracefully.** Another agent might close a tab between your `tab-list` and your command. If you get `Error: No tab with id`, the tab is gone — move on.\n\n4. **Don't depend on tab count or ordering.** Other agents are opening/closing tabs concurrently. Use targetIds, not positional logic.\n\n5. **Clean up when done.** Close all tabs you opened before finishing. Include this in every scoop brief:\n _\"Close each tab with `playwright-cli tab-close --tab=<id>` when done.\"_\n\n## Tips\n\n- **Refs are stable per element** — chain actions on refs from one snapshot freely. Re-snapshot (or read the `Snapshot: <path>` file an action prints) to see elements the page added.\n- `open` and `tab-new` open tabs in the **background** by default. Capture the targetId from the output. To open in the **foreground** add `--foreground`/`--fg`; to raise an **already-open** tab use `tab-select --tab=<id>` (or `tab-select <N>`).\n- After `goto`, `go-back`, `go-forward`, or `reload`, take a fresh `snapshot --tab=<id>`: the new page has new refs.\n- Unexpected JavaScript dialogs are auto-dismissed on attached pages.\n- Use `eval --tab=<id>` for DOM operations not covered by built-in commands; save results with `--filename=path`.\n- The SLICC app tab and Chrome internal UI tabs are automatically excluded from `tab-list`.\n- `fill` clears and types into regular inputs, textareas, and `contenteditable` elements. Use `--submit` to press Enter after. If the text or an `eval` expression starts with `-`, put `--` before it so it is not parsed as a flag.\n- Negative numbers for `mousewheel` / `mousemove` are positionals (no `--` needed): `mousewheel --tab=<id> 0 -300`.\n- `drop --path=<vfs-path>` injects the file as **raw bytes**; a UTF-8 text round-trip would replace every byte >= 0x80 with `EF BF BD`, so mp4/zip/jpg drops stay byte-exact.\n- Screenshots default to `$TMPDIR/screenshot-<timestamp>.png` — your own scratch directory, not the shared root. Use `--filename=path` to save elsewhere —\n `screenshot <path>` is an error, because that slot is the element ref.\n- Unsupported flags and extra positionals are rejected per subcommand, so a probe that exits 0 means\n the flag was honoured — nothing is silently dropped.\n- Use `keydown`/`keyup` for holding modifier keys (e.g. Shift+click: `keydown Shift`, `click`, `keyup Shift`).\n- Use `requests` + `response-body` to inspect XHR/fetch responses; `route` to mock or block them.\n- **Calling the app's own backend? Use `curlwright`, not `eval-file`.** It is curl's flags run by a `fetch()` inside the tab, so cookies, origin and session come along: `curlwright -s -X POST https://app.example.com/api/items -H 'X-CSRF-Token: abc' -d '{\"name\":\"x\"}' --tab=<id>`. `-o <file>` writes a **byte-exact** body, which `eval-file` cannot do at all — that is the only way to pull a binary response out of a page. Without `--tab` it uses the tab already on that origin. `curlwright --help` for the flag list. It cancels the same way playwright-cli does — giving up exits **130** and writes no `-o` file for a response nobody is reading — but the in-page `fetch` is bounded by `-m`, not by the cancellation, so a cancelled request may still have reached the server.\n- `state-save` / `state-load` persist auth state (cookies + localStorage) across sessions.\n- Every command is logged to `session.md` (auto-snapshots and screenshot copies alongside) under `/.playwright/` in the cone, or your own `$TMPDIR/.playwright/` in a scoop. `state-save` with no filename writes `storage-state.json` there too.\n- `pdf` saves a print-layout PDF; not available in extension mode.\n- `upload` injects VFS files as **raw bytes** (a UTF-8 text round-trip would replace every byte ≥ 0x80 with `EF BF BD`). A leading `eN` / `fNeN` token is a snapshot ref, never a filename — run `snapshot` first; without a ref, focus the file input first. To upload a file named `e2`, pass `./e2` or an absolute path.\n\n## Low-level CDP escape hatch\n\nFor raw Chrome DevTools Protocol calls that `playwright-cli` doesn't wrap, send JSON-RPC directly over WebSocket with `websocat`:\n\n```bash\n# Discover the page's debug socket URL via the CDP HTTP endpoint\ncurl -s http://127.0.0.1:9222/json | jq -r '.[0].webSocketDebuggerUrl'\n\n# Send a single CDP method, receive the response, exit\necho 'Page.navigate {\"url\":\"https://example.com\"}' \\\n | websocat -1 --jsonrpc --jsonrpc-omit-jsonrpc ws://127.0.0.1:9222/devtools/page/<id>\n```\n\nRun `websocat --help` for the full flag list. Use this only when `playwright-cli` has no wrapper for the CDP method you need.\n";export{e as default};
@@ -1,2 +1,2 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/oauth-service-GpUOM3Aw.js","assets/preload-helper-Czpn1I53.js","assets/proxied-fetch-4VBgrEIu.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/base64-ELzoYfwP.js","assets/proxy-error-BSFYY7jj.js","assets/api-endpoint-DuEQRZ4g.js","assets/runtime-env-Dlaokqg1.js","assets/panel-rpc-accessor-B4BfPLSo.js","assets/permissions-surface-registry-CilCRwhh.js"])))=>i.map(i=>d[i]);
2
- import{a as e,i as t,o as n}from"./core-Cx9N3lmn.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{t as i}from"./logger-DDBAeTLF.js";import"./proxied-fetch-4VBgrEIu.js";import{s as a,t as o}from"./api-endpoint-DuEQRZ4g.js";import{n as s}from"./float-topology-C_iRKPQK.js";import"./secret-topology-hMRoGGjt.js";import{n as c,t as l}from"./panel-rpc-accessor-B4BfPLSo.js";import{n as ee}from"./secrets-bridge-client-D734Xx8G.js";import{n as u,o as d,t as f}from"./providers-BDpLAzfX.js";import{n as te,t as p}from"./stored-accounts-ChNHYF68.js";import{a as ne,c as re,i as ie,l as ae}from"./bedrock-camp-compat-B1oHsbyo.js";import{r as oe,t as se}from"./bedrock-camp-extra-models-BYrxX19D.js";import{o as ce}from"./claude-model-version-DZmbk9E2.js";var m=`slicc_oauth_extra_domains`;function h(e){try{let t=e.getItem(m);if(!t)return{};let n=JSON.parse(t);if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n)){if(typeof e!=`string`||!Array.isArray(t))continue;let n=t.filter(e=>typeof e==`string`&&e.length>0);n.length>0&&(r[e]=n)}return r}catch{return{}}}function le(e,t){try{e.setItem(m,JSON.stringify(t))}catch(e){throw Error(`Failed to persist OAuth extras (localStorage quota exceeded?): ${e instanceof Error?e.message:String(e)}`)}}function ue(e,t){let n={input:0,output:0,cacheRead:0,cacheWrite:0},r=ce(e);if(!r)return n;let i;for(let e of t.values()){let t=ce(e.id);!t||t.family!==r.family||(!i||t.major>i.major||t.major===i.major&&t.minor>i.minor)&&(i={major:t.major,minor:t.minor,cost:e.cost})}return i?.cost??n}i(`model-policy`);var de=`/etc/models`;function fe(){return{sections:{}}}function g(e,t,n){return e.providerId===t?e.modelId===`*`||e.modelId===n:!1}function _(e,t){return e.sections[t]??[]}function pe(e,t,n,r){return _(e,t).some(e=>e.deny&&g(e,n,r))}function me(e,t,n,r){let i=_(e,t);return i.some(e=>e.deny&&g(e,n,r))?!1:n===t||i.some(e=>!e.deny&&g(e,n,r))}var he=fe();function ge(){return he}function _e(e,t,n){return`add \`${t}:${n}\` (or \`${t}:*\`) under \`[${e}]\` in ${de}`}var v=t,y=e,b=`selected-model`,ve=[`slicc_provider`,`slicc_api_key`,`slicc_base_url`,`anthropic_api_key`,`api_provider`,`azure_resource`,`bedrock_region`],ye=new Set([`github`]);function x(e){let t;try{t=n()}catch{return!1}return t.includes(e)&&!d(e)}var S=!1;function be(){if(!S){S=!0;for(let e of ve)try{localStorage.removeItem(e)}catch{}C()}}function C(){try{let e=localStorage.getItem(b);if(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t);(ye.has(n)||x(n))&&localStorage.removeItem(b)}}}catch{}try{let e=localStorage.getItem(p);if(!e)return;let t=JSON.parse(e);if(!Array.isArray(t))return;let n=t.filter(e=>!(typeof e==`object`&&e&&typeof e.providerId==`string`&&x(e.providerId)));n.length!==t.length&&localStorage.setItem(p,JSON.stringify(n))}catch{}}function xe(){S=!1}var Se={_resetLegacyCleanup:xe};function w(){let e=n().filter(d),t=u();return[...new Set([...e,...t])].filter(e=>!f(e)?.hidden)}function T(t){try{if(O(t).length>0)return!0}catch{}try{if(e(t).length>0)return!0}catch{}let n=f(t);return!!(n?.modelOverrides&&Object.keys(n.modelOverrides).length>0)}function Ce(t,n){try{if(O(t).some(e=>e.id===n))return!0}catch{}try{if(e(t).some(e=>e.id===n))return!0}catch{}let r=f(t);return!!(r?.modelOverrides&&Object.hasOwn(r.modelOverrides,n))}function E(e){return f(e)||{id:e,name:e.split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),description:`${e} provider`,requiresApiKey:!0,requiresBaseUrl:!1}}function D(e,t){t.context_window!==void 0&&(e.contextWindow=t.context_window),t.max_tokens!==void 0&&(e.maxTokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),t.cost!==void 0&&(e.cost=t.cost,e.inputCost=t.cost.input,e.outputCost=t.cost.output,e.cacheReadCost=t.cost.cacheRead,e.cacheWriteCost=t.cost.cacheWrite),t.compat!==void 0&&(e.compat={...e.compat??{},...t.compat}),t.thinkingLevelMap!==void 0&&(e.thinkingLevelMap={...e.thinkingLevelMap??{},...t.thinkingLevelMap})}function we(e){let t=ie(e);return{...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`,reasoning:e.reasoning===!0&&(re(e)||t!==null),...t?{thinkingLevelMap:{...t}}:{}}}function O(e){try{if(e===`bedrock-camp`){let e=ne(W(`bedrock-camp`));return oe(y(`amazon-bedrock`),se).filter(t=>ae(t,e)).map(we)}let t=E(e);if(t.getModelIds){let r;try{r=t.getModelIds()}catch(t){return k.error(`Provider getModelIds callback failed`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}let i=new Map;for(let e of n())try{for(let t of y(e))i.set(t.id,t)}catch{}return r.map(n=>{let r=n.api===`openai`?`openai`:`anthropic`,a=`${e}-${r}`,o=i.get(n.id),s;if(o)s={...o,api:a,provider:e};else if(s=q(e,n.id,``,a),n.name&&(s.name=n.name),r===`anthropic`){let e=ue(n.id,i);s.cost=e,s.inputCost=e.input,s.outputCost=e.output,s.cacheReadCost=e.cacheRead,s.cacheWriteCost=e.cacheWrite}let c=t.modelOverrides?.[n.id];return c&&D(s,c),D(s,n),s})}if(t.isOAuth){let n=y(`anthropic`),r=`${e}-anthropic`;return n.map(n=>{let i={...n,api:r,provider:e},a=t.modelOverrides?.[n.id];return a&&D(i,a),i})}return y(e===`azure-ai-foundry`?`anthropic`:e)}catch(t){return k.error(`Failed to load models`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}}function Te(e){let t=N().find(t=>t.providerId===e);if(!t?.accessToken)return null;let n=!!t.tokenExpiresAt&&Date.now()>t.tokenExpiresAt-6e4;return{token:t.accessToken,maskedValue:t.maskedValue,expiresAt:t.tokenExpiresAt,userName:t.userName,userAvatar:t.userAvatar,scopes:t.scopes,expired:n}}var Ee=Object.assign({})[`/packages/webapp/providers.json`]??[],k=i(`provider-settings`);function De(e=Ee){if(e.length===0||N().length>0)return;let t=new Set(w());for(let n of e)if(!(!n.providerId||!n.apiKey)){if(!t.has(n.providerId)){k.warn(`Unknown provider "${n.providerId}" in providers.json — skipping`);continue}R(n.providerId,n.apiKey,n.baseUrl)}let n=e.find(e=>e.providerId&&e.apiKey&&t.has(e.providerId));n?.model&&!localStorage.getItem(b)&&localStorage.setItem(b,`${n.providerId}:${n.model}`)}var Oe=[/haiku/i];function A(e){return Oe.some(t=>t.test(e))}function ke(e){return e.filter(e=>!A(e.id))}function j(e,t){let n=$();if(n===null)return e;let r=ge();return e.filter(e=>!pe(r,n,t,e.id))}function M(){let e=N();if(e.length===0)return[];let t=new Map;for(let n of e){if(t.has(n.providerId))continue;let e=E(n.providerId);if(e.hidden||x(n.providerId))continue;let r=j(ke(O(n.providerId)),n.providerId);if(r.length===0)continue;let i={providerId:n.providerId,providerName:e.name,models:r};t.set(n.providerId,i)}return[...t.values()]}function Ae(e){return M().map(e=>e.providerId).filter(t=>t!==e)}function N(){return be(),te()}function P(e){return h(localStorage)[e]??[]}function F(e,t){let n=h(localStorage),r=t.map(e=>e.trim()).filter(e=>e.length>0);r.length===0?delete n[e]:n[e]=r,le(localStorage,n)}async function je(e,t){if(c()){F(e,t);return}let n=l();if(!n)throw Error(`setExtraOAuthDomainsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let{storeAfter:r}=await n.call(`oauth-extras-set`,{providerId:e,domains:t});try{le(localStorage,r)}catch(t){k.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{providerId:e,error:t instanceof Error?t.message:String(t)})}}function Me(){return h(localStorage)}function I(e){localStorage.setItem(p,JSON.stringify(e))}async function L(e){if(c()){I(e);return}let t=l();if(!t)throw Error(`saveAccountsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let n=JSON.stringify(e),{storedJson:r}=await t.call(`save-oauth-accounts`,{accountsJson:n});try{localStorage.setItem(p,r)}catch(e){k.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{error:e instanceof Error?e.message:String(e)})}}function R(e,t,n,r,i){let a=N().filter(t=>t.providerId!==e),o={providerId:e,apiKey:t};n&&(o.baseUrl=n),r&&(o.deployment=r),i&&(o.apiVersion=i),a.push(o),I(a)}async function Ne(e){let t=s();try{if(t===`extension-direct`){let t=await new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.delete`,name:`oauth.${e}.token`},n=>{chrome.runtime.lastError&&k.error(`SW secrets.delete transport failed`,{providerId:e,error:chrome.runtime.lastError.message}),t(n??{})})});t.error&&k.error(`SW secrets.delete returned error`,{providerId:e,error:t.error})}else if(t===`extension-delegate`){let t=await ee(`secrets.delete`,{name:`oauth.${e}.token`});t?.error&&k.error(`Bridge secrets.delete returned error`,{providerId:e,error:t.error})}else if(t!==`connect`){let t=await fetch(a(`/api/secrets/oauth/${e}`),{method:`DELETE`,headers:o()});!t.ok&&t.status!==404&&k.warn(`OAuth replica DELETE non-ok`,{providerId:e,status:t.status})}}catch(n){k.error(`OAuth replica removal failed`,{providerId:e,topology:t,error:n instanceof Error?n.message:String(n)})}}async function z(e){let t=N().find(t=>t.providerId===e),n=E(e);t&&n?.isOAuth&&await Pe(e),await Ne(e),await L(N().filter(t=>t.providerId!==e));let r=localStorage.getItem(b)??``,i=r.indexOf(`:`);i>0&&r.slice(0,i)===e&&localStorage.removeItem(b)}async function Pe(e){let t=N().find(t=>t.providerId===e);if(!t)return;let n=E(e);if(n?.isOAuth){if(n.onOAuthLogout)try{await n.onOAuthLogout()}catch(t){k.warn(`onOAuthLogout failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})}if(n.getOAuthLogoutUrl){let i=n.getOAuthLogoutUrl(t);if(i){let{openIdpLogoutUrl:t}=await r(async()=>{let{openIdpLogoutUrl:e}=await import(`./oauth-service-GpUOM3Aw.js`);return{openIdpLogoutUrl:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]));await t(i).catch(t=>{k.warn(`IdP logout popup failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})})}}await L(N().map(t=>t.providerId===e?{providerId:t.providerId,apiKey:``,baseUrl:t.baseUrl,userName:t.userName,userAvatar:t.userAvatar,loggedOut:!0}:t)),await Ne(e)}}async function Fe(e,t={}){let n=Math.max(1,t.attempts??3),r=t.delayMs??150,i=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),a;for(let t=0;t<n;t++){let o=await e();if(o.maskedValue)return{maskedValue:o.maskedValue};o.error&&(a=o.error),t<n-1&&await i(r)}return{lastError:a}}var Ie=`access token rotated during mask write`;function B(e,t,n,r){let i=r.find(t=>t.providerId===e);return i?.accessToken?i.accessToken===t?(i.maskedValue=n,{maskedValue:n}):(k.warn(`OAuth mask write raced with token rotation; discarding replica`,{providerId:e}),{error:Ie}):{error:`account gone after mask write`}}function V(e,t){return!!e&&e!==t}async function H(e,t,n){let r={providerId:e.providerId,accessToken:e.accessToken,domains:e.domains.join(`,`)},{maskedValue:i,lastError:a}=await Fe(()=>t.sendMaskRequest(r),n);if(!V(i,e.accessToken)){let t=i?`mask replica equals the access token`:a??`no error reported (cold SW or empty reply)`;return k.error(`OAuth mask give-up: no masked value after retries`,{providerId:e.providerId,reason:t}),{error:t}}let o=t.getAccounts(),s=B(e.providerId,e.accessToken,i,o);return s.maskedValue&&await t.saveAccounts(o),s}function Le(e){let t=E(e).oauthTokenDomains??[],n=P(e),r=new Set,i=[];for(let e of[...t,...n]){let t=e.toLowerCase();r.has(t)||(r.add(t),i.push(e))}return i}function Re(e){return new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.mask-oauth-token`,...e},n=>{chrome.runtime.lastError&&k.error(`SW mask-oauth-token transport failed`,{providerId:e.providerId,error:chrome.runtime.lastError.message});let r=typeof n==`object`&&n?n:void 0;r?.error&&k.warn(`SW mask-oauth-token returned error`,{providerId:e.providerId,error:r.error}),t(r??{})})})}function ze(e){return ee(`secrets.mask-oauth-token`,e).then(t=>(t?.error&&k.warn(`Bridge mask-oauth-token returned error`,{providerId:e.providerId,error:t.error}),t??{})).catch(t=>(k.error(`Bridge mask-oauth-token transport failed`,{providerId:e.providerId,error:t instanceof Error?t.message:String(t)}),{}))}async function Be(e,t,n){let r=a(`/api/secrets/oauth-update`),i=await fetch(r,{method:`POST`,headers:o({"Content-Type":`application/json`}),body:JSON.stringify({providerId:e,accessToken:t,domains:n})});if(!i.ok)return k.warn(`OAuth replica POST non-ok`,{providerId:e,status:i.status,url:r}),{error:`OAuth replica POST HTTP ${i.status}`};let s=await i.json();if(typeof s.maskedValue!=`string`)return k.warn(`OAuth replica POST ok but missing maskedValue`,{providerId:e,url:r}),{error:`OAuth replica POST ok but missing maskedValue`};if(!V(s.maskedValue,t))return k.error(`OAuth mask replica equals the access token; refusing to persist`,{providerId:e}),{error:`mask replica equals the access token`};let c=N(),l=B(e,t,s.maskedValue,c);return l.maskedValue&&await L(c),l}async function Ve(e,t){let n=await He(e,t);if(n.error!==Ie)return n;let r=N().find(t=>t.providerId===e)?.accessToken;return!r||r===t?n:He(e,r)}async function He(e,t){let n=Le(e);if(n.length===0)return{error:`no oauth token domains configured`};let r=s();try{return r===`extension-direct`?H({providerId:e,accessToken:t,domains:n},{sendMaskRequest:Re,getAccounts:N,saveAccounts:L}):r===`extension-delegate`?H({providerId:e,accessToken:t,domains:n},{sendMaskRequest:ze,getAccounts:N,saveAccounts:L}):r===`connect`?{error:`no replica store in connect mode`}:await Be(e,t,n)}catch(t){let n=t instanceof Error?t.message:String(t);return k.error(`OAuth replica sync failed`,{providerId:e,topology:r,error:n}),{error:n}}}async function Ue(e){let t=N().find(t=>t.providerId===e);return t?.accessToken?V(t.maskedValue,t.accessToken)?{maskedValue:t.maskedValue}:Ve(e,t.accessToken):{error:`no access token held`}}function We(e,t){if(e.accessToken)return`scopes`in e?e.scopes:t?.scopes}async function Ge(e){let t=N().find(t=>t.providerId===e.providerId),n=N().filter(t=>t.providerId!==e.providerId);n.push({providerId:e.providerId,apiKey:``,accessToken:e.accessToken,refreshToken:e.refreshToken,tokenExpiresAt:e.tokenExpiresAt,userName:e.userName,userAvatar:e.userAvatar,baseUrl:e.baseUrl??t?.baseUrl,scopes:We(e,t)}),await L(n),await Ve(e.providerId,e.accessToken)}var Ke=`local`;function U(e){let t=N().find(t=>t.providerId===e);return t&&(t.accessToken||t.apiKey)||null}function qe(e){let t=N().find(t=>t.providerId===e);return t?t.accessToken||t.apiKey||(E(e).optionalApiKey?Ke:null):null}function W(e){return N().find(t=>t.providerId===e)?.baseUrl??null}function Je(e){return N().find(t=>t.providerId===e)?.deployment??null}function Ye(e){return N().find(t=>t.providerId===e)?.apiVersion??null}function G(){let e=localStorage.getItem(b)||``,t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function Xe(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t),r=new Set([...u(),...w()]),i=n.includes(`.`);if(r.has(n)||!i){localStorage.setItem(b,e);return}}let n=K();localStorage.setItem(b,`${n}:${e}`)}function Ze(){return localStorage.getItem(b)||``}function K(){let e=Ze(),t=e.indexOf(`:`);if(t>0)return e.slice(0,t);let n=N(),r=G();if(r){let e=n.find(e=>T(e.providerId)&&Ce(e.providerId,r));if(e)return e.providerId}let i=n.find(e=>T(e.providerId));return i?i.providerId:n.length>0?n[0].providerId:`anthropic`}function Qe(e){let t=G();localStorage.setItem(b,`${e}:${t}`)}function $e(){let e=G();localStorage.setItem(b,e)}function et(){return qe(K())}function tt(e){let t=K();R(t,e,W(t)??void 0)}async function nt(){await z(K())}function rt(){return W(K())}function it(e){let t=K(),n=U(t);n&&R(t,n,e||void 0)}function at(){let e=K(),t=U(e);t&&R(e,t)}function ot(){let e=N(),t=K(),n=G();return e.map(e=>{let r={providerId:e.providerId,apiKey:e.apiKey};return e.baseUrl&&(r.baseUrl=e.baseUrl),e.providerId===t&&n&&(r.model=n),r})}async function st(){let e=N();await Promise.allSettled(e.map(e=>z(e.providerId))),localStorage.removeItem(p),localStorage.removeItem(b);for(let e of ve)localStorage.removeItem(e)}function ct(e){return/^(?:gpt[-.]?|o[0-9]|chatgpt)/i.test(e)?`openai`:`anthropic`}function q(e,t,n,r){return{id:t,name:t,provider:e,api:r??`${e}-${ct(t)}`,baseUrl:n??``,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},reasoning:!0}}function J(e,t){return t.isOAuth||e===`azure-ai-foundry`?`anthropic`:e===`bedrock-camp`?`amazon-bedrock`:e}function lt(){let e=new Set;for(let t of N())t.loggedOut||(e.add(t.providerId),e.add(J(t.providerId,E(t.providerId))));return[...e]}function ut(e,t,n){let r=O(e).find(e=>e.id===t);return r?n?{...r,baseUrl:n}:r:null}function dt(e,t,n,r){return n.isOAuth?O(t).find(e=>e.id===r)||{...e,api:`${t}-anthropic`,provider:t}:t===`bedrock-camp`?{...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`}:e}function ft(e,t,n,r,i){let a=ut(e,n,r);if(a)return a;if(t.isOAuth)return q(e,n,r);if(i)throw Error(`Model ${n} is not available from provider ${e}`);return Y()}function pt(e,t){if(!e)return Y();let n=t??K(),r=W(n),i=E(n);if(t!==void 0){let t=ut(n,e,r);if(t)return t}try{let t=v(J(n,i),e);if(!t?.id)throw Error(`Model ${e} not found`);let a=dt(t,n,i,e);return r?{...a,baseUrl:r}:a}catch(a){return k.debug(`resolveModelById: pi-ai lookup miss, using provider fallback`,{providerId:n,modelId:e,error:a instanceof Error?a.message:String(a)}),ft(n,i,e,r,t!==void 0)}}function mt(e,t){return e.provider===t||e.provider===J(t,E(t))}function Y(){let e=K(),t=G(),n=W(e),r=O(e),i=E(e),a=i.defaultModelId?r.find(e=>e.id.toLowerCase().includes(i.defaultModelId.toLowerCase()))?.id:void 0,o=t||a||r[0]?.id||`claude-sonnet-4-6`;try{let t=J(e,i),a=v(t,o);if(!a?.id)throw Error(`Model ${o} not found in ${t} registry`);let s=a;return i.isOAuth?s=r.find(e=>e.id===o)||{...s,api:`${e}-anthropic`,provider:e}:e===`bedrock-camp`&&(s={...s,api:`bedrock-camp-converse`,provider:`bedrock-camp`}),n&&(s={...s,baseUrl:n}),s}catch(t){k.debug(`resolveCurrentModel: pi-ai lookup miss, using provider fallback`,{providerId:e,effectiveModelId:o,error:t instanceof Error?t.message:String(t)});let a=r.find(e=>e.id===o);return a?n?{...a,baseUrl:n}:a:i.isOAuth?q(e,o,n):v(`anthropic`,`claude-sonnet-4-0`)}}function ht(e){let t=e.toLowerCase();if(!t)return null;let n=null;try{n=K()}catch{}if(n!==null){let e=X(t,[n]);if(e!==null)return e}return X(t,N().map(e=>e.providerId))}function X(e,t){let n=null,r=-1;for(let i of t)for(let t of O(i)){let i=t.id.toLowerCase(),a=(t.name??``).toLowerCase();if(!i.includes(e)&&!a.includes(e))continue;let o=t.contextWindow??0;(o>r||o===r&&Tt(t.id,n??``)>0)&&(r=o,n=t.id)}return n}function Z(){let e=[];try{for(let t of N())e.includes(t.providerId)||e.push(t.providerId)}catch{}try{let t=K();e.includes(t)||e.push(t)}catch{}return e}function gt(e){let t=e.indexOf(`:`);if(t<=0||t===e.length-1)return null;let n=e.slice(0,t),r=e.slice(t+1),i=Z().includes(n);if(i)return{providerId:n,modelId:r,configured:i};let a=!1;try{a=w().includes(n)}catch{}return a?{providerId:n,modelId:r,configured:!1}:null}function Q(e,t,n=!0){let r=[e],i=n?X(e.toLowerCase(),[t]):null;i!==null&&i!==e&&r.push(i);let a=[];try{a=O(t)}catch{}for(let n of r)if(!(a.length>0&&!a.some(e=>e.id===n)))try{if(pt(n,t).id===n)return{modelId:n,providerId:t}}catch(r){k.debug(`selectModelFromProvider: candidate did not resolve`,{input:e,candidate:n,providerId:t,error:r instanceof Error?r.message:String(r)})}return null}function _t(e){return e.map(e=>`${e.providerId}:${e.modelId}`).join(`, `)}function vt(e){if(!e)return{ok:!1,error:`unknown model: (empty)`};let t=gt(e);if(t)return St(e,t);let n=null;try{n=K()}catch{}if(n!==null){let t=Q(e,n);if(t)return xt(t)}return Ct(e,n)}function $(){try{return K()}catch{return null}}function yt(e){let t=$();return t===null||me(ge(),t,e.providerId,e.modelId)}function bt(e){let t=$()??`<none>`;return{ok:!1,error:`model not allowed: ${`${e.providerId}:${e.modelId}`} is blocked by ${de} while "${t}" is selected — ${_e(t,e.providerId,e.modelId)}`}}function xt(e){return yt(e)?{ok:!0,selection:e}:bt(e)}function St(e,t){if(!t.configured){let n=Z();return{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" is not configured${n.length>0?`; configured: ${n.join(`, `)}`:``})`}}let n=Q(t.modelId,t.providerId);return n?xt(n):{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" does not offer "${t.modelId}")`}}function Ct(e,t){let n=Z().filter(e=>e!==t);for(let t of[`exact`,`shorthand`]){let r=[];for(let i of n){let n=t===`exact`?e:X(e.toLowerCase(),[i]);if(n===null)continue;let a=Q(n,i,!1);a&&r.push(a)}let i=r.filter(yt);if(i.length===0&&r.length>0)return bt(r[0]);if(i.length===1)return{ok:!0,selection:i[0]};if(i.length>1)return{ok:!1,error:`ambiguous model: ${e} matches ${_t(i)} — qualify it as provider:model`}}return{ok:!1,error:`unknown model: ${e}`}}function wt(e){let t=vt(e);return t.ok?t.selection.modelId:null}function Tt(e,t){let n=e.match(/\d+/g)?.map(Number)??[],r=t.match(/\d+/g)?.map(Number)??[],i=Math.max(n.length,r.length);for(let e=0;e<i;e++){let t=(n[e]??0)-(r[e]??0);if(t!==0)return t}return 0}export{V as A,pt as B,Te as C,G as D,U as E,H as F,tt as G,wt as H,j as I,je as J,it as K,T as L,Fe as M,C as N,K as O,mt as P,z as R,lt as S,O as T,vt as U,ht as V,Ge as W,Qe as X,Xe as Y,ue as Z,w as _,nt as a,Je as b,Ue as c,M as d,Me as f,Ye as g,qe as h,st as i,Pe as j,A as k,ot as l,et as m,R as n,at as o,Ae as p,F as q,De as r,$e as s,Se as t,N as u,rt as v,E as w,P as x,W as y,Y as z};
2
+ import{a as e,i as t,o as n}from"./core-Cx9N3lmn.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{t as i}from"./logger-DDBAeTLF.js";import"./proxied-fetch-4VBgrEIu.js";import{s as a,t as o}from"./api-endpoint-DuEQRZ4g.js";import{n as s}from"./float-topology-C_iRKPQK.js";import"./secret-topology-hMRoGGjt.js";import{n as c,t as l}from"./panel-rpc-accessor-B4BfPLSo.js";import{n as ee}from"./secrets-bridge-client-D734Xx8G.js";import{n as u,o as d,t as f}from"./providers-jD6rCt0u.js";import{n as te,t as p}from"./stored-accounts-ChNHYF68.js";import{a as ne,c as re,i as ie,l as ae}from"./bedrock-camp-compat-B1oHsbyo.js";import{r as oe,t as se}from"./bedrock-camp-extra-models-BYrxX19D.js";import{o as ce}from"./claude-model-version-DZmbk9E2.js";var m=`slicc_oauth_extra_domains`;function h(e){try{let t=e.getItem(m);if(!t)return{};let n=JSON.parse(t);if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n)){if(typeof e!=`string`||!Array.isArray(t))continue;let n=t.filter(e=>typeof e==`string`&&e.length>0);n.length>0&&(r[e]=n)}return r}catch{return{}}}function le(e,t){try{e.setItem(m,JSON.stringify(t))}catch(e){throw Error(`Failed to persist OAuth extras (localStorage quota exceeded?): ${e instanceof Error?e.message:String(e)}`)}}function ue(e,t){let n={input:0,output:0,cacheRead:0,cacheWrite:0},r=ce(e);if(!r)return n;let i;for(let e of t.values()){let t=ce(e.id);!t||t.family!==r.family||(!i||t.major>i.major||t.major===i.major&&t.minor>i.minor)&&(i={major:t.major,minor:t.minor,cost:e.cost})}return i?.cost??n}i(`model-policy`);var de=`/etc/models`;function fe(){return{sections:{}}}function g(e,t,n){return e.providerId===t?e.modelId===`*`||e.modelId===n:!1}function _(e,t){return e.sections[t]??[]}function pe(e,t,n,r){return _(e,t).some(e=>e.deny&&g(e,n,r))}function me(e,t,n,r){let i=_(e,t);return i.some(e=>e.deny&&g(e,n,r))?!1:n===t||i.some(e=>!e.deny&&g(e,n,r))}var he=fe();function ge(){return he}function _e(e,t,n){return`add \`${t}:${n}\` (or \`${t}:*\`) under \`[${e}]\` in ${de}`}var v=t,y=e,b=`selected-model`,ve=[`slicc_provider`,`slicc_api_key`,`slicc_base_url`,`anthropic_api_key`,`api_provider`,`azure_resource`,`bedrock_region`],ye=new Set([`github`]);function x(e){let t;try{t=n()}catch{return!1}return t.includes(e)&&!d(e)}var S=!1;function be(){if(!S){S=!0;for(let e of ve)try{localStorage.removeItem(e)}catch{}C()}}function C(){try{let e=localStorage.getItem(b);if(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t);(ye.has(n)||x(n))&&localStorage.removeItem(b)}}}catch{}try{let e=localStorage.getItem(p);if(!e)return;let t=JSON.parse(e);if(!Array.isArray(t))return;let n=t.filter(e=>!(typeof e==`object`&&e&&typeof e.providerId==`string`&&x(e.providerId)));n.length!==t.length&&localStorage.setItem(p,JSON.stringify(n))}catch{}}function xe(){S=!1}var Se={_resetLegacyCleanup:xe};function w(){let e=n().filter(d),t=u();return[...new Set([...e,...t])].filter(e=>!f(e)?.hidden)}function T(t){try{if(O(t).length>0)return!0}catch{}try{if(e(t).length>0)return!0}catch{}let n=f(t);return!!(n?.modelOverrides&&Object.keys(n.modelOverrides).length>0)}function Ce(t,n){try{if(O(t).some(e=>e.id===n))return!0}catch{}try{if(e(t).some(e=>e.id===n))return!0}catch{}let r=f(t);return!!(r?.modelOverrides&&Object.hasOwn(r.modelOverrides,n))}function E(e){return f(e)||{id:e,name:e.split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),description:`${e} provider`,requiresApiKey:!0,requiresBaseUrl:!1}}function D(e,t){t.context_window!==void 0&&(e.contextWindow=t.context_window),t.max_tokens!==void 0&&(e.maxTokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),t.cost!==void 0&&(e.cost=t.cost,e.inputCost=t.cost.input,e.outputCost=t.cost.output,e.cacheReadCost=t.cost.cacheRead,e.cacheWriteCost=t.cost.cacheWrite),t.compat!==void 0&&(e.compat={...e.compat??{},...t.compat}),t.thinkingLevelMap!==void 0&&(e.thinkingLevelMap={...e.thinkingLevelMap??{},...t.thinkingLevelMap})}function we(e){let t=ie(e);return{...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`,reasoning:e.reasoning===!0&&(re(e)||t!==null),...t?{thinkingLevelMap:{...t}}:{}}}function O(e){try{if(e===`bedrock-camp`){let e=ne(W(`bedrock-camp`));return oe(y(`amazon-bedrock`),se).filter(t=>ae(t,e)).map(we)}let t=E(e);if(t.getModelIds){let r;try{r=t.getModelIds()}catch(t){return k.error(`Provider getModelIds callback failed`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}let i=new Map;for(let e of n())try{for(let t of y(e))i.set(t.id,t)}catch{}return r.map(n=>{let r=n.api===`openai`?`openai`:`anthropic`,a=`${e}-${r}`,o=i.get(n.id),s;if(o)s={...o,api:a,provider:e};else if(s=q(e,n.id,``,a),n.name&&(s.name=n.name),r===`anthropic`){let e=ue(n.id,i);s.cost=e,s.inputCost=e.input,s.outputCost=e.output,s.cacheReadCost=e.cacheRead,s.cacheWriteCost=e.cacheWrite}let c=t.modelOverrides?.[n.id];return c&&D(s,c),D(s,n),s})}if(t.isOAuth){let n=y(`anthropic`),r=`${e}-anthropic`;return n.map(n=>{let i={...n,api:r,provider:e},a=t.modelOverrides?.[n.id];return a&&D(i,a),i})}return y(e===`azure-ai-foundry`?`anthropic`:e)}catch(t){return k.error(`Failed to load models`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}}function Te(e){let t=N().find(t=>t.providerId===e);if(!t?.accessToken)return null;let n=!!t.tokenExpiresAt&&Date.now()>t.tokenExpiresAt-6e4;return{token:t.accessToken,maskedValue:t.maskedValue,expiresAt:t.tokenExpiresAt,userName:t.userName,userAvatar:t.userAvatar,scopes:t.scopes,expired:n}}var Ee=Object.assign({})[`/packages/webapp/providers.json`]??[],k=i(`provider-settings`);function De(e=Ee){if(e.length===0||N().length>0)return;let t=new Set(w());for(let n of e)if(!(!n.providerId||!n.apiKey)){if(!t.has(n.providerId)){k.warn(`Unknown provider "${n.providerId}" in providers.json — skipping`);continue}R(n.providerId,n.apiKey,n.baseUrl)}let n=e.find(e=>e.providerId&&e.apiKey&&t.has(e.providerId));n?.model&&!localStorage.getItem(b)&&localStorage.setItem(b,`${n.providerId}:${n.model}`)}var Oe=[/haiku/i];function A(e){return Oe.some(t=>t.test(e))}function ke(e){return e.filter(e=>!A(e.id))}function j(e,t){let n=$();if(n===null)return e;let r=ge();return e.filter(e=>!pe(r,n,t,e.id))}function M(){let e=N();if(e.length===0)return[];let t=new Map;for(let n of e){if(t.has(n.providerId))continue;let e=E(n.providerId);if(e.hidden||x(n.providerId))continue;let r=j(ke(O(n.providerId)),n.providerId);if(r.length===0)continue;let i={providerId:n.providerId,providerName:e.name,models:r};t.set(n.providerId,i)}return[...t.values()]}function Ae(e){return M().map(e=>e.providerId).filter(t=>t!==e)}function N(){return be(),te()}function P(e){return h(localStorage)[e]??[]}function F(e,t){let n=h(localStorage),r=t.map(e=>e.trim()).filter(e=>e.length>0);r.length===0?delete n[e]:n[e]=r,le(localStorage,n)}async function je(e,t){if(c()){F(e,t);return}let n=l();if(!n)throw Error(`setExtraOAuthDomainsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let{storeAfter:r}=await n.call(`oauth-extras-set`,{providerId:e,domains:t});try{le(localStorage,r)}catch(t){k.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{providerId:e,error:t instanceof Error?t.message:String(t)})}}function Me(){return h(localStorage)}function I(e){localStorage.setItem(p,JSON.stringify(e))}async function L(e){if(c()){I(e);return}let t=l();if(!t)throw Error(`saveAccountsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let n=JSON.stringify(e),{storedJson:r}=await t.call(`save-oauth-accounts`,{accountsJson:n});try{localStorage.setItem(p,r)}catch(e){k.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{error:e instanceof Error?e.message:String(e)})}}function R(e,t,n,r,i){let a=N().filter(t=>t.providerId!==e),o={providerId:e,apiKey:t};n&&(o.baseUrl=n),r&&(o.deployment=r),i&&(o.apiVersion=i),a.push(o),I(a)}async function Ne(e){let t=s();try{if(t===`extension-direct`){let t=await new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.delete`,name:`oauth.${e}.token`},n=>{chrome.runtime.lastError&&k.error(`SW secrets.delete transport failed`,{providerId:e,error:chrome.runtime.lastError.message}),t(n??{})})});t.error&&k.error(`SW secrets.delete returned error`,{providerId:e,error:t.error})}else if(t===`extension-delegate`){let t=await ee(`secrets.delete`,{name:`oauth.${e}.token`});t?.error&&k.error(`Bridge secrets.delete returned error`,{providerId:e,error:t.error})}else if(t!==`connect`){let t=await fetch(a(`/api/secrets/oauth/${e}`),{method:`DELETE`,headers:o()});!t.ok&&t.status!==404&&k.warn(`OAuth replica DELETE non-ok`,{providerId:e,status:t.status})}}catch(n){k.error(`OAuth replica removal failed`,{providerId:e,topology:t,error:n instanceof Error?n.message:String(n)})}}async function z(e){let t=N().find(t=>t.providerId===e),n=E(e);t&&n?.isOAuth&&await Pe(e),await Ne(e),await L(N().filter(t=>t.providerId!==e));let r=localStorage.getItem(b)??``,i=r.indexOf(`:`);i>0&&r.slice(0,i)===e&&localStorage.removeItem(b)}async function Pe(e){let t=N().find(t=>t.providerId===e);if(!t)return;let n=E(e);if(n?.isOAuth){if(n.onOAuthLogout)try{await n.onOAuthLogout()}catch(t){k.warn(`onOAuthLogout failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})}if(n.getOAuthLogoutUrl){let i=n.getOAuthLogoutUrl(t);if(i){let{openIdpLogoutUrl:t}=await r(async()=>{let{openIdpLogoutUrl:e}=await import(`./oauth-service-GpUOM3Aw.js`);return{openIdpLogoutUrl:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]));await t(i).catch(t=>{k.warn(`IdP logout popup failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})})}}await L(N().map(t=>t.providerId===e?{providerId:t.providerId,apiKey:``,baseUrl:t.baseUrl,userName:t.userName,userAvatar:t.userAvatar,loggedOut:!0}:t)),await Ne(e)}}async function Fe(e,t={}){let n=Math.max(1,t.attempts??3),r=t.delayMs??150,i=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),a;for(let t=0;t<n;t++){let o=await e();if(o.maskedValue)return{maskedValue:o.maskedValue};o.error&&(a=o.error),t<n-1&&await i(r)}return{lastError:a}}var Ie=`access token rotated during mask write`;function B(e,t,n,r){let i=r.find(t=>t.providerId===e);return i?.accessToken?i.accessToken===t?(i.maskedValue=n,{maskedValue:n}):(k.warn(`OAuth mask write raced with token rotation; discarding replica`,{providerId:e}),{error:Ie}):{error:`account gone after mask write`}}function V(e,t){return!!e&&e!==t}async function H(e,t,n){let r={providerId:e.providerId,accessToken:e.accessToken,domains:e.domains.join(`,`)},{maskedValue:i,lastError:a}=await Fe(()=>t.sendMaskRequest(r),n);if(!V(i,e.accessToken)){let t=i?`mask replica equals the access token`:a??`no error reported (cold SW or empty reply)`;return k.error(`OAuth mask give-up: no masked value after retries`,{providerId:e.providerId,reason:t}),{error:t}}let o=t.getAccounts(),s=B(e.providerId,e.accessToken,i,o);return s.maskedValue&&await t.saveAccounts(o),s}function Le(e){let t=E(e).oauthTokenDomains??[],n=P(e),r=new Set,i=[];for(let e of[...t,...n]){let t=e.toLowerCase();r.has(t)||(r.add(t),i.push(e))}return i}function Re(e){return new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.mask-oauth-token`,...e},n=>{chrome.runtime.lastError&&k.error(`SW mask-oauth-token transport failed`,{providerId:e.providerId,error:chrome.runtime.lastError.message});let r=typeof n==`object`&&n?n:void 0;r?.error&&k.warn(`SW mask-oauth-token returned error`,{providerId:e.providerId,error:r.error}),t(r??{})})})}function ze(e){return ee(`secrets.mask-oauth-token`,e).then(t=>(t?.error&&k.warn(`Bridge mask-oauth-token returned error`,{providerId:e.providerId,error:t.error}),t??{})).catch(t=>(k.error(`Bridge mask-oauth-token transport failed`,{providerId:e.providerId,error:t instanceof Error?t.message:String(t)}),{}))}async function Be(e,t,n){let r=a(`/api/secrets/oauth-update`),i=await fetch(r,{method:`POST`,headers:o({"Content-Type":`application/json`}),body:JSON.stringify({providerId:e,accessToken:t,domains:n})});if(!i.ok)return k.warn(`OAuth replica POST non-ok`,{providerId:e,status:i.status,url:r}),{error:`OAuth replica POST HTTP ${i.status}`};let s=await i.json();if(typeof s.maskedValue!=`string`)return k.warn(`OAuth replica POST ok but missing maskedValue`,{providerId:e,url:r}),{error:`OAuth replica POST ok but missing maskedValue`};if(!V(s.maskedValue,t))return k.error(`OAuth mask replica equals the access token; refusing to persist`,{providerId:e}),{error:`mask replica equals the access token`};let c=N(),l=B(e,t,s.maskedValue,c);return l.maskedValue&&await L(c),l}async function Ve(e,t){let n=await He(e,t);if(n.error!==Ie)return n;let r=N().find(t=>t.providerId===e)?.accessToken;return!r||r===t?n:He(e,r)}async function He(e,t){let n=Le(e);if(n.length===0)return{error:`no oauth token domains configured`};let r=s();try{return r===`extension-direct`?H({providerId:e,accessToken:t,domains:n},{sendMaskRequest:Re,getAccounts:N,saveAccounts:L}):r===`extension-delegate`?H({providerId:e,accessToken:t,domains:n},{sendMaskRequest:ze,getAccounts:N,saveAccounts:L}):r===`connect`?{error:`no replica store in connect mode`}:await Be(e,t,n)}catch(t){let n=t instanceof Error?t.message:String(t);return k.error(`OAuth replica sync failed`,{providerId:e,topology:r,error:n}),{error:n}}}async function Ue(e){let t=N().find(t=>t.providerId===e);return t?.accessToken?V(t.maskedValue,t.accessToken)?{maskedValue:t.maskedValue}:Ve(e,t.accessToken):{error:`no access token held`}}function We(e,t){if(e.accessToken)return`scopes`in e?e.scopes:t?.scopes}async function Ge(e){let t=N().find(t=>t.providerId===e.providerId),n=N().filter(t=>t.providerId!==e.providerId);n.push({providerId:e.providerId,apiKey:``,accessToken:e.accessToken,refreshToken:e.refreshToken,tokenExpiresAt:e.tokenExpiresAt,userName:e.userName,userAvatar:e.userAvatar,baseUrl:e.baseUrl??t?.baseUrl,scopes:We(e,t)}),await L(n),await Ve(e.providerId,e.accessToken)}var Ke=`local`;function U(e){let t=N().find(t=>t.providerId===e);return t&&(t.accessToken||t.apiKey)||null}function qe(e){let t=N().find(t=>t.providerId===e);return t?t.accessToken||t.apiKey||(E(e).optionalApiKey?Ke:null):null}function W(e){return N().find(t=>t.providerId===e)?.baseUrl??null}function Je(e){return N().find(t=>t.providerId===e)?.deployment??null}function Ye(e){return N().find(t=>t.providerId===e)?.apiVersion??null}function G(){let e=localStorage.getItem(b)||``,t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function Xe(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t),r=new Set([...u(),...w()]),i=n.includes(`.`);if(r.has(n)||!i){localStorage.setItem(b,e);return}}let n=K();localStorage.setItem(b,`${n}:${e}`)}function Ze(){return localStorage.getItem(b)||``}function K(){let e=Ze(),t=e.indexOf(`:`);if(t>0)return e.slice(0,t);let n=N(),r=G();if(r){let e=n.find(e=>T(e.providerId)&&Ce(e.providerId,r));if(e)return e.providerId}let i=n.find(e=>T(e.providerId));return i?i.providerId:n.length>0?n[0].providerId:`anthropic`}function Qe(e){let t=G();localStorage.setItem(b,`${e}:${t}`)}function $e(){let e=G();localStorage.setItem(b,e)}function et(){return qe(K())}function tt(e){let t=K();R(t,e,W(t)??void 0)}async function nt(){await z(K())}function rt(){return W(K())}function it(e){let t=K(),n=U(t);n&&R(t,n,e||void 0)}function at(){let e=K(),t=U(e);t&&R(e,t)}function ot(){let e=N(),t=K(),n=G();return e.map(e=>{let r={providerId:e.providerId,apiKey:e.apiKey};return e.baseUrl&&(r.baseUrl=e.baseUrl),e.providerId===t&&n&&(r.model=n),r})}async function st(){let e=N();await Promise.allSettled(e.map(e=>z(e.providerId))),localStorage.removeItem(p),localStorage.removeItem(b);for(let e of ve)localStorage.removeItem(e)}function ct(e){return/^(?:gpt[-.]?|o[0-9]|chatgpt)/i.test(e)?`openai`:`anthropic`}function q(e,t,n,r){return{id:t,name:t,provider:e,api:r??`${e}-${ct(t)}`,baseUrl:n??``,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},reasoning:!0}}function J(e,t){return t.isOAuth||e===`azure-ai-foundry`?`anthropic`:e===`bedrock-camp`?`amazon-bedrock`:e}function lt(){let e=new Set;for(let t of N())t.loggedOut||(e.add(t.providerId),e.add(J(t.providerId,E(t.providerId))));return[...e]}function ut(e,t,n){let r=O(e).find(e=>e.id===t);return r?n?{...r,baseUrl:n}:r:null}function dt(e,t,n,r){return n.isOAuth?O(t).find(e=>e.id===r)||{...e,api:`${t}-anthropic`,provider:t}:t===`bedrock-camp`?{...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`}:e}function ft(e,t,n,r,i){let a=ut(e,n,r);if(a)return a;if(t.isOAuth)return q(e,n,r);if(i)throw Error(`Model ${n} is not available from provider ${e}`);return Y()}function pt(e,t){if(!e)return Y();let n=t??K(),r=W(n),i=E(n);if(t!==void 0){let t=ut(n,e,r);if(t)return t}try{let t=v(J(n,i),e);if(!t?.id)throw Error(`Model ${e} not found`);let a=dt(t,n,i,e);return r?{...a,baseUrl:r}:a}catch(a){return k.debug(`resolveModelById: pi-ai lookup miss, using provider fallback`,{providerId:n,modelId:e,error:a instanceof Error?a.message:String(a)}),ft(n,i,e,r,t!==void 0)}}function mt(e,t){return e.provider===t||e.provider===J(t,E(t))}function Y(){let e=K(),t=G(),n=W(e),r=O(e),i=E(e),a=i.defaultModelId?r.find(e=>e.id.toLowerCase().includes(i.defaultModelId.toLowerCase()))?.id:void 0,o=t||a||r[0]?.id||`claude-sonnet-4-6`;try{let t=J(e,i),a=v(t,o);if(!a?.id)throw Error(`Model ${o} not found in ${t} registry`);let s=a;return i.isOAuth?s=r.find(e=>e.id===o)||{...s,api:`${e}-anthropic`,provider:e}:e===`bedrock-camp`&&(s={...s,api:`bedrock-camp-converse`,provider:`bedrock-camp`}),n&&(s={...s,baseUrl:n}),s}catch(t){k.debug(`resolveCurrentModel: pi-ai lookup miss, using provider fallback`,{providerId:e,effectiveModelId:o,error:t instanceof Error?t.message:String(t)});let a=r.find(e=>e.id===o);return a?n?{...a,baseUrl:n}:a:i.isOAuth?q(e,o,n):v(`anthropic`,`claude-sonnet-4-0`)}}function ht(e){let t=e.toLowerCase();if(!t)return null;let n=null;try{n=K()}catch{}if(n!==null){let e=X(t,[n]);if(e!==null)return e}return X(t,N().map(e=>e.providerId))}function X(e,t){let n=null,r=-1;for(let i of t)for(let t of O(i)){let i=t.id.toLowerCase(),a=(t.name??``).toLowerCase();if(!i.includes(e)&&!a.includes(e))continue;let o=t.contextWindow??0;(o>r||o===r&&Tt(t.id,n??``)>0)&&(r=o,n=t.id)}return n}function Z(){let e=[];try{for(let t of N())e.includes(t.providerId)||e.push(t.providerId)}catch{}try{let t=K();e.includes(t)||e.push(t)}catch{}return e}function gt(e){let t=e.indexOf(`:`);if(t<=0||t===e.length-1)return null;let n=e.slice(0,t),r=e.slice(t+1),i=Z().includes(n);if(i)return{providerId:n,modelId:r,configured:i};let a=!1;try{a=w().includes(n)}catch{}return a?{providerId:n,modelId:r,configured:!1}:null}function Q(e,t,n=!0){let r=[e],i=n?X(e.toLowerCase(),[t]):null;i!==null&&i!==e&&r.push(i);let a=[];try{a=O(t)}catch{}for(let n of r)if(!(a.length>0&&!a.some(e=>e.id===n)))try{if(pt(n,t).id===n)return{modelId:n,providerId:t}}catch(r){k.debug(`selectModelFromProvider: candidate did not resolve`,{input:e,candidate:n,providerId:t,error:r instanceof Error?r.message:String(r)})}return null}function _t(e){return e.map(e=>`${e.providerId}:${e.modelId}`).join(`, `)}function vt(e){if(!e)return{ok:!1,error:`unknown model: (empty)`};let t=gt(e);if(t)return St(e,t);let n=null;try{n=K()}catch{}if(n!==null){let t=Q(e,n);if(t)return xt(t)}return Ct(e,n)}function $(){try{return K()}catch{return null}}function yt(e){let t=$();return t===null||me(ge(),t,e.providerId,e.modelId)}function bt(e){let t=$()??`<none>`;return{ok:!1,error:`model not allowed: ${`${e.providerId}:${e.modelId}`} is blocked by ${de} while "${t}" is selected — ${_e(t,e.providerId,e.modelId)}`}}function xt(e){return yt(e)?{ok:!0,selection:e}:bt(e)}function St(e,t){if(!t.configured){let n=Z();return{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" is not configured${n.length>0?`; configured: ${n.join(`, `)}`:``})`}}let n=Q(t.modelId,t.providerId);return n?xt(n):{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" does not offer "${t.modelId}")`}}function Ct(e,t){let n=Z().filter(e=>e!==t);for(let t of[`exact`,`shorthand`]){let r=[];for(let i of n){let n=t===`exact`?e:X(e.toLowerCase(),[i]);if(n===null)continue;let a=Q(n,i,!1);a&&r.push(a)}let i=r.filter(yt);if(i.length===0&&r.length>0)return bt(r[0]);if(i.length===1)return{ok:!0,selection:i[0]};if(i.length>1)return{ok:!1,error:`ambiguous model: ${e} matches ${_t(i)} — qualify it as provider:model`}}return{ok:!1,error:`unknown model: ${e}`}}function wt(e){let t=vt(e);return t.ok?t.selection.modelId:null}function Tt(e,t){let n=e.match(/\d+/g)?.map(Number)??[],r=t.match(/\d+/g)?.map(Number)??[],i=Math.max(n.length,r.length);for(let e=0;e<i;e++){let t=(n[e]??0)-(r[e]??0);if(t!==0)return t}return 0}export{V as A,pt as B,Te as C,G as D,U as E,H as F,tt as G,wt as H,j as I,je as J,it as K,T as L,Fe as M,C as N,K as O,mt as P,z as R,lt as S,O as T,vt as U,ht as V,Ge as W,Qe as X,Xe as Y,ue as Z,w as _,nt as a,Je as b,Ue as c,M as d,Me as f,Ye as g,qe as h,st as i,Pe as j,A as k,ot as l,et as m,R as n,at as o,Ae as p,F as q,De as r,$e as s,Se as t,N as u,rt as v,E as w,P as x,W as y,Y as z};
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-LESFN7Hj.js";import"./proxied-fetch-F-dCBEfh.js";import{n,t as r}from"./panel-rpc-accessor-B4BfPLSo.js";import{n as i,o as a,t as o}from"./providers-BUAe2eUe.js";import{s,t as c}from"./api-endpoint-D8lUKmPu.js";import{n as l,t as u}from"./stored-accounts-Cx83FZwe.js";import{a as d,i as ee,o as f}from"./core-C1m4D34S.js";import{n as te}from"./float-topology-COIC4j_U.js";import{t as ne}from"./secrets-bridge-client-GOCzDscb.js";import{a as re,c as ie,i as ae,l as oe}from"./bedrock-camp-compat-ByR2ly4i.js";import{r as se,t as ce}from"./bedrock-camp-extra-models-DIuCBjcJ.js";import{s as p}from"./claude-model-version-ceOteQ2f.js";const le=`slicc_oauth_extra_domains`;function m(e){try{let t=e.getItem(le);if(!t)return{};let n=JSON.parse(t);if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n)){if(typeof e!=`string`||!Array.isArray(t))continue;let n=t.filter(e=>typeof e==`string`&&e.length>0);n.length>0&&(r[e]=n)}return r}catch{return{}}}function h(e,t){try{e.setItem(le,JSON.stringify(t))}catch(e){throw Error(`Failed to persist OAuth extras (localStorage quota exceeded?): ${e instanceof Error?e.message:String(e)}`)}}function g(e,t){let n={input:0,output:0,cacheRead:0,cacheWrite:0},r=p(e);if(!r)return n;let i;for(let e of t.values()){let t=p(e.id);!t||t.family!==r.family||(!i||t.major>i.major||t.major===i.major&&t.minor>i.minor)&&(i={major:t.major,minor:t.minor,cost:e.cost})}return i?.cost??n}const ue=t(`model-policy`),_=`/etc/models`;function v(){return{sections:{}}}function de(e){let t=e.indexOf(`#`);return(t===-1?e:e.slice(0,t)).trim()}function fe(e){let t=v();if(typeof e!=`string`)return t;let n=null;for(let r of e.split(/\r?\n/)){let e=de(r);if(!e)continue;let i=/^\[([^\]]+)\]$/.exec(e);if(i){n=i[1].trim(),t.sections[n]??=[];continue}if(n===null){ue.warn(`model policy entry before any [provider] section — ignored`,{entry:e});continue}let a=e.startsWith(`-`),o=a?e.slice(1).trim():e,s=o.indexOf(`:`);if(s<=0||s===o.length-1){ue.warn(`model policy entry is not provider:model — ignored`,{entry:e});continue}t.sections[n].push({providerId:o.slice(0,s).trim(),modelId:o.slice(s+1).trim(),deny:a})}return t}function y(e,t,n){return e.providerId===t?e.modelId===`*`||e.modelId===n:!1}function pe(e,t){return e.sections[t]??[]}function me(e,t,n,r){return pe(e,t).some(e=>e.deny&&y(e,n,r))}function he(e,t,n,r){let i=pe(e,t);return i.some(e=>e.deny&&y(e,n,r))?!1:n===t||i.some(e=>!e.deny&&y(e,n,r))}let ge=v();function _e(e){ge=e}function ve(){return ge}function ye(e,t,n){return`add \`${t}:${n}\` (or \`${t}:*\`) under \`[${e}]\` in ${_}`}var be=e({ACCOUNTS_KEY:()=>u,__test__:()=>Te,addAccount:()=>P,applyProviderDefaults:()=>Ae,clearAllSettings:()=>ht,clearApiKey:()=>ut,clearBaseUrl:()=>pt,clearSelectedProvider:()=>st,ensureOAuthMaskReplica:()=>$e,exportProviders:()=>mt,getAccounts:()=>M,getAllAvailableModels:()=>Fe,getAllExtraOAuthDomains:()=>Be,getAlternativeModelProviders:()=>Ie,getApiKey:()=>ct,getApiKeyForProvider:()=>z,getApiVersionForProvider:()=>rt,getAvailableProviders:()=>E,getBaseUrl:()=>dt,getBaseUrlForProvider:()=>B,getDeploymentForProvider:()=>nt,getExtraOAuthDomains:()=>Le,getModelCatalogProviderIds:()=>_t,getOAuthAccountInfo:()=>Oe,getProviderConfig:()=>O,getProviderModels:()=>A,getRawApiKeyForProvider:()=>R,getSelectedModelId:()=>V,getSelectedProvider:()=>H,isModelHiddenFromPicker:()=>Me,isUsableOAuthMaskReplica:()=>I,logoutOAuthAccount:()=>Ue,maskOAuthTokenWithRetry:()=>We,migrateLegacyAuthOnlySelection:()=>T,modelRunsOnProvider:()=>xt,persistOAuthMaskViaServiceWorker:()=>L,policyVisible:()=>Pe,providerOffersLlmModels:()=>D,removeAccount:()=>F,resolveCurrentModel:()=>K,resolveModelById:()=>G,resolveModelByShorthand:()=>St,resolveModelIdForScoop:()=>Ot,resolveModelSelectionForScoop:()=>X,saveOAuthAccount:()=>tt,setApiKey:()=>lt,setBaseUrl:()=>ft,setExtraOAuthDomains:()=>Re,setExtraOAuthDomainsAsync:()=>ze,setSelectedModelId:()=>it,setSelectedProvider:()=>ot});const b=ee,x=d,S=`selected-model`,xe=[`slicc_provider`,`slicc_api_key`,`slicc_base_url`,`anthropic_api_key`,`api_provider`,`azure_resource`,`bedrock_region`],Se=new Set([`github`]);function C(e){let t;try{t=f()}catch{return!1}return t.includes(e)&&!a(e)}let w=!1;function Ce(){if(!w){w=!0;for(let e of xe)try{localStorage.removeItem(e)}catch{}T()}}function T(){try{let e=localStorage.getItem(S);if(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t);(Se.has(n)||C(n))&&localStorage.removeItem(S)}}}catch{}try{let e=localStorage.getItem(u);if(!e)return;let t=JSON.parse(e);if(!Array.isArray(t))return;let n=t.filter(e=>!(typeof e==`object`&&e&&typeof e.providerId==`string`&&C(e.providerId)));n.length!==t.length&&localStorage.setItem(u,JSON.stringify(n))}catch{}}function we(){w=!1}const Te={_resetLegacyCleanup:we};function E(){let e=f().filter(a),t=i();return[...new Set([...e,...t])].filter(e=>!o(e)?.hidden)}function D(e){try{if(A(e).length>0)return!0}catch{}try{if(d(e).length>0)return!0}catch{}let t=o(e);return!!(t?.modelOverrides&&Object.keys(t.modelOverrides).length>0)}function Ee(e,t){try{if(A(e).some(e=>e.id===t))return!0}catch{}try{if(d(e).some(e=>e.id===t))return!0}catch{}let n=o(e);return!!(n?.modelOverrides&&Object.hasOwn(n.modelOverrides,t))}function O(e){return o(e)||{id:e,name:e.split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),description:`${e} provider`,requiresApiKey:!0,requiresBaseUrl:!1}}function k(e,t){t.context_window!==void 0&&(e.contextWindow=t.context_window),t.max_tokens!==void 0&&(e.maxTokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),t.cost!==void 0&&(e.cost=t.cost,e.inputCost=t.cost.input,e.outputCost=t.cost.output,e.cacheReadCost=t.cost.cacheRead,e.cacheWriteCost=t.cost.cacheWrite),t.compat!==void 0&&(e.compat={...e.compat??{},...t.compat}),t.thinkingLevelMap!==void 0&&(e.thinkingLevelMap={...e.thinkingLevelMap??{},...t.thinkingLevelMap})}function De(e){let t=ae(e);return{...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`,reasoning:e.reasoning===!0&&(ie(e)||t!==null),...t?{thinkingLevelMap:{...t}}:{}}}function A(e){try{if(e===`bedrock-camp`){let e=re(B(`bedrock-camp`));return se(x(`amazon-bedrock`),ce).filter(t=>oe(t,e)).map(De)}let t=O(e);if(t.getModelIds){let n;try{n=t.getModelIds()}catch(t){return j.error(`Provider getModelIds callback failed`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}let r=new Map;for(let e of f())try{for(let t of x(e))r.set(t.id,t)}catch{}return n.map(n=>{let i=n.api===`openai`?`openai`:`anthropic`,a=`${e}-${i}`,o=r.get(n.id),s;if(o)s={...o,api:a,provider:e};else if(s=U(e,n.id,``,a),n.name&&(s.name=n.name),i===`anthropic`){let e=g(n.id,r);s.cost=e,s.inputCost=e.input,s.outputCost=e.output,s.cacheReadCost=e.cacheRead,s.cacheWriteCost=e.cacheWrite}let c=t.modelOverrides?.[n.id];return c&&k(s,c),k(s,n),s})}if(t.isOAuth){let n=x(`anthropic`),r=`${e}-anthropic`;return n.map(n=>{let i={...n,api:r,provider:e},a=t.modelOverrides?.[n.id];return a&&k(i,a),i})}return x(e===`azure-ai-foundry`?`anthropic`:e)}catch(t){return j.error(`Failed to load models`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}}function Oe(e){let t=M().find(t=>t.providerId===e);if(!t?.accessToken)return null;let n=!!t.tokenExpiresAt&&Date.now()>t.tokenExpiresAt-6e4;return{token:t.accessToken,maskedValue:t.maskedValue,expiresAt:t.tokenExpiresAt,userName:t.userName,userAvatar:t.userAvatar,scopes:t.scopes,expired:n}}const ke=Object.assign({})[`/packages/webapp/providers.json`]??[],j=t(`provider-settings`);function Ae(e=ke){if(e.length===0||M().length>0)return;let t=new Set(E());for(let n of e)if(!(!n.providerId||!n.apiKey)){if(!t.has(n.providerId)){j.warn(`Unknown provider "${n.providerId}" in providers.json — skipping`);continue}P(n.providerId,n.apiKey,n.baseUrl)}let n=e.find(e=>e.providerId&&e.apiKey&&t.has(e.providerId));n?.model&&!localStorage.getItem(S)&&localStorage.setItem(S,`${n.providerId}:${n.model}`)}const je=[/haiku/i];function Me(e){return je.some(t=>t.test(e))}function Ne(e){return e.filter(e=>!Me(e.id))}function Pe(e,t){let n=Z();if(n===null)return e;let r=ve();return e.filter(e=>!me(r,n,t,e.id))}function Fe(){let e=M();if(e.length===0)return[];let t=new Map;for(let n of e){if(t.has(n.providerId))continue;let e=O(n.providerId);if(e.hidden||C(n.providerId))continue;let r=Pe(Ne(A(n.providerId)),n.providerId);if(r.length===0)continue;let i={providerId:n.providerId,providerName:e.name,models:r};t.set(n.providerId,i)}return[...t.values()]}function Ie(e){return Fe().map(e=>e.providerId).filter(t=>t!==e)}function M(){return Ce(),l()}function Le(e){return m(localStorage)[e]??[]}function Re(e,t){let n=m(localStorage),r=t.map(e=>e.trim()).filter(e=>e.length>0);r.length===0?delete n[e]:n[e]=r,h(localStorage,n)}async function ze(e,t){if(n()){Re(e,t);return}let i=r();if(!i)throw Error(`setExtraOAuthDomainsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let{storeAfter:a}=await i.call(`oauth-extras-set`,{providerId:e,domains:t});try{h(localStorage,a)}catch(t){j.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{providerId:e,error:t instanceof Error?t.message:String(t)})}}function Be(){return m(localStorage)}function Ve(e){localStorage.setItem(u,JSON.stringify(e))}async function N(e){if(n()){Ve(e);return}let t=r();if(!t)throw Error(`saveAccountsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let i=JSON.stringify(e),{storedJson:a}=await t.call(`save-oauth-accounts`,{accountsJson:i});try{localStorage.setItem(u,a)}catch(e){j.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{error:e instanceof Error?e.message:String(e)})}}function P(e,t,n,r,i){let a=M().filter(t=>t.providerId!==e),o={providerId:e,apiKey:t};n&&(o.baseUrl=n),r&&(o.deployment=r),i&&(o.apiVersion=i),a.push(o),Ve(a)}async function He(e){let t=te();try{if(t===`extension-direct`){let t=await new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.delete`,name:`oauth.${e}.token`},n=>{chrome.runtime.lastError&&j.error(`SW secrets.delete transport failed`,{providerId:e,error:chrome.runtime.lastError.message}),t(n??{})})});t.error&&j.error(`SW secrets.delete returned error`,{providerId:e,error:t.error})}else if(t===`extension-delegate`){let t=await ne(`secrets.delete`,{name:`oauth.${e}.token`});t?.error&&j.error(`Bridge secrets.delete returned error`,{providerId:e,error:t.error})}else if(t!==`connect`){let t=await fetch(s(`/api/secrets/oauth/${e}`),{method:`DELETE`,headers:c()});!t.ok&&t.status!==404&&j.warn(`OAuth replica DELETE non-ok`,{providerId:e,status:t.status})}}catch(n){j.error(`OAuth replica removal failed`,{providerId:e,topology:t,error:n instanceof Error?n.message:String(n)})}}async function F(e){let t=M().find(t=>t.providerId===e),n=O(e);t&&n?.isOAuth&&await Ue(e),await He(e),await N(M().filter(t=>t.providerId!==e));let r=localStorage.getItem(S)??``,i=r.indexOf(`:`);i>0&&r.slice(0,i)===e&&localStorage.removeItem(S)}async function Ue(e){let t=M().find(t=>t.providerId===e);if(!t)return;let n=O(e);if(n?.isOAuth){if(n.onOAuthLogout)try{await n.onOAuthLogout()}catch(t){j.warn(`onOAuthLogout failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})}if(n.getOAuthLogoutUrl){let r=n.getOAuthLogoutUrl(t);if(r){let{openIdpLogoutUrl:t}=await import(`./oauth-service-MWzqRq2q.js`);await t(r).catch(t=>{j.warn(`IdP logout popup failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})})}}await N(M().map(t=>t.providerId===e?{providerId:t.providerId,apiKey:``,baseUrl:t.baseUrl,userName:t.userName,userAvatar:t.userAvatar,loggedOut:!0}:t)),await He(e)}}async function We(e,t={}){let n=Math.max(1,t.attempts??3),r=t.delayMs??150,i=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),a;for(let t=0;t<n;t++){let o=await e();if(o.maskedValue)return{maskedValue:o.maskedValue};o.error&&(a=o.error),t<n-1&&await i(r)}return{lastError:a}}const Ge=`access token rotated during mask write`;function Ke(e,t,n,r){let i=r.find(t=>t.providerId===e);return i?.accessToken?i.accessToken===t?(i.maskedValue=n,{maskedValue:n}):(j.warn(`OAuth mask write raced with token rotation; discarding replica`,{providerId:e}),{error:Ge}):{error:`account gone after mask write`}}function I(e,t){return!!e&&e!==t}async function L(e,t,n){let r={providerId:e.providerId,accessToken:e.accessToken,domains:e.domains.join(`,`)},{maskedValue:i,lastError:a}=await We(()=>t.sendMaskRequest(r),n);if(!I(i,e.accessToken)){let t=i?`mask replica equals the access token`:a??`no error reported (cold SW or empty reply)`;return j.error(`OAuth mask give-up: no masked value after retries`,{providerId:e.providerId,reason:t}),{error:t}}let o=t.getAccounts(),s=Ke(e.providerId,e.accessToken,i,o);return s.maskedValue&&await t.saveAccounts(o),s}function qe(e){let t=O(e).oauthTokenDomains??[],n=Le(e),r=new Set,i=[];for(let e of[...t,...n]){let t=e.toLowerCase();r.has(t)||(r.add(t),i.push(e))}return i}function Je(e){return new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.mask-oauth-token`,...e},n=>{chrome.runtime.lastError&&j.error(`SW mask-oauth-token transport failed`,{providerId:e.providerId,error:chrome.runtime.lastError.message});let r=typeof n==`object`&&n?n:void 0;r?.error&&j.warn(`SW mask-oauth-token returned error`,{providerId:e.providerId,error:r.error}),t(r??{})})})}function Ye(e){return ne(`secrets.mask-oauth-token`,e).then(t=>(t?.error&&j.warn(`Bridge mask-oauth-token returned error`,{providerId:e.providerId,error:t.error}),t??{})).catch(t=>(j.error(`Bridge mask-oauth-token transport failed`,{providerId:e.providerId,error:t instanceof Error?t.message:String(t)}),{}))}async function Xe(e,t,n){let r=s(`/api/secrets/oauth-update`),i=await fetch(r,{method:`POST`,headers:c({"Content-Type":`application/json`}),body:JSON.stringify({providerId:e,accessToken:t,domains:n})});if(!i.ok)return j.warn(`OAuth replica POST non-ok`,{providerId:e,status:i.status,url:r}),{error:`OAuth replica POST HTTP ${i.status}`};let a=await i.json();if(typeof a.maskedValue!=`string`)return j.warn(`OAuth replica POST ok but missing maskedValue`,{providerId:e,url:r}),{error:`OAuth replica POST ok but missing maskedValue`};if(!I(a.maskedValue,t))return j.error(`OAuth mask replica equals the access token; refusing to persist`,{providerId:e}),{error:`mask replica equals the access token`};let o=M(),l=Ke(e,t,a.maskedValue,o);return l.maskedValue&&await N(o),l}async function Ze(e,t){let n=await Qe(e,t);if(n.error!==Ge)return n;let r=M().find(t=>t.providerId===e)?.accessToken;return!r||r===t?n:Qe(e,r)}async function Qe(e,t){let n=qe(e);if(n.length===0)return{error:`no oauth token domains configured`};let r=te();try{return r===`extension-direct`?L({providerId:e,accessToken:t,domains:n},{sendMaskRequest:Je,getAccounts:M,saveAccounts:N}):r===`extension-delegate`?L({providerId:e,accessToken:t,domains:n},{sendMaskRequest:Ye,getAccounts:M,saveAccounts:N}):r===`connect`?{error:`no replica store in connect mode`}:await Xe(e,t,n)}catch(t){let n=t instanceof Error?t.message:String(t);return j.error(`OAuth replica sync failed`,{providerId:e,topology:r,error:n}),{error:n}}}async function $e(e){let t=M().find(t=>t.providerId===e);return t?.accessToken?I(t.maskedValue,t.accessToken)?{maskedValue:t.maskedValue}:Ze(e,t.accessToken):{error:`no access token held`}}function et(e,t){if(e.accessToken)return`scopes`in e?e.scopes:t?.scopes}async function tt(e){let t=M().find(t=>t.providerId===e.providerId),n=M().filter(t=>t.providerId!==e.providerId);n.push({providerId:e.providerId,apiKey:``,accessToken:e.accessToken,refreshToken:e.refreshToken,tokenExpiresAt:e.tokenExpiresAt,userName:e.userName,userAvatar:e.userAvatar,baseUrl:e.baseUrl??t?.baseUrl,scopes:et(e,t)}),await N(n),await Ze(e.providerId,e.accessToken)}function R(e){let t=M().find(t=>t.providerId===e);return t&&(t.accessToken||t.apiKey)||null}function z(e){let t=M().find(t=>t.providerId===e);return t?t.accessToken||t.apiKey||(O(e).optionalApiKey?`local`:null):null}function B(e){return M().find(t=>t.providerId===e)?.baseUrl??null}function nt(e){return M().find(t=>t.providerId===e)?.deployment??null}function rt(e){return M().find(t=>t.providerId===e)?.apiVersion??null}function V(){let e=localStorage.getItem(S)||``,t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function it(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t),r=new Set([...i(),...E()]),a=n.includes(`.`);if(r.has(n)||!a){localStorage.setItem(S,e);return}}let n=H();localStorage.setItem(S,`${n}:${e}`)}function at(){return localStorage.getItem(S)||``}function H(){let e=at(),t=e.indexOf(`:`);if(t>0)return e.slice(0,t);let n=M(),r=V();if(r){let e=n.find(e=>D(e.providerId)&&Ee(e.providerId,r));if(e)return e.providerId}let i=n.find(e=>D(e.providerId));return i?i.providerId:n.length>0?n[0].providerId:`anthropic`}function ot(e){let t=V();localStorage.setItem(S,`${e}:${t}`)}function st(){let e=V();localStorage.setItem(S,e)}function ct(){return z(H())}function lt(e){let t=H();P(t,e,B(t)??void 0)}async function ut(){await F(H())}function dt(){return B(H())}function ft(e){let t=H(),n=R(t);n&&P(t,n,e||void 0)}function pt(){let e=H(),t=R(e);t&&P(e,t)}function mt(){let e=M(),t=H(),n=V();return e.map(e=>{let r={providerId:e.providerId,apiKey:e.apiKey};return e.baseUrl&&(r.baseUrl=e.baseUrl),e.providerId===t&&n&&(r.model=n),r})}async function ht(){let e=M();await Promise.allSettled(e.map(e=>F(e.providerId))),localStorage.removeItem(u),localStorage.removeItem(S);for(let e of xe)localStorage.removeItem(e)}function gt(e){return/^(?:gpt[-.]?|o[0-9]|chatgpt)/i.test(e)?`openai`:`anthropic`}function U(e,t,n,r){return{id:t,name:t,provider:e,api:r??`${e}-${gt(t)}`,baseUrl:n??``,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},reasoning:!0}}function W(e,t){return t.isOAuth||e===`azure-ai-foundry`?`anthropic`:e===`bedrock-camp`?`amazon-bedrock`:e}function _t(){let e=new Set;for(let t of M())t.loggedOut||(e.add(t.providerId),e.add(W(t.providerId,O(t.providerId))));return[...e]}function vt(e,t,n){let r=A(e).find(e=>e.id===t);return r?n?{...r,baseUrl:n}:r:null}function yt(e,t,n,r){return n.isOAuth?A(t).find(e=>e.id===r)||{...e,api:`${t}-anthropic`,provider:t}:t===`bedrock-camp`?{...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`}:e}function bt(e,t,n,r,i){let a=vt(e,n,r);if(a)return a;if(t.isOAuth)return U(e,n,r);if(i)throw Error(`Model ${n} is not available from provider ${e}`);return K()}function G(e,t){if(!e)return K();let n=t??H(),r=B(n),i=O(n);if(t!==void 0){let t=vt(n,e,r);if(t)return t}try{let t=W(n,i),a=b(t,e);if(!a?.id)throw Error(`Model ${e} not found`);let o=yt(a,n,i,e);return r?{...o,baseUrl:r}:o}catch(a){return j.debug(`resolveModelById: pi-ai lookup miss, using provider fallback`,{providerId:n,modelId:e,error:a instanceof Error?a.message:String(a)}),bt(n,i,e,r,t!==void 0)}}function xt(e,t){return e.provider===t||e.provider===W(t,O(t))}function K(){let e=H(),t=V(),n=B(e),r=A(e),i=O(e),a=i.defaultModelId?r.find(e=>e.id.toLowerCase().includes(i.defaultModelId.toLowerCase()))?.id:void 0,o=t||a||r[0]?.id||`claude-sonnet-4-6`;try{let t=W(e,i),a=b(t,o);if(!a?.id)throw Error(`Model ${o} not found in ${t} registry`);let s=a;return i.isOAuth?s=r.find(e=>e.id===o)||{...s,api:`${e}-anthropic`,provider:e}:e===`bedrock-camp`&&(s={...s,api:`bedrock-camp-converse`,provider:`bedrock-camp`}),n&&(s={...s,baseUrl:n}),s}catch(t){j.debug(`resolveCurrentModel: pi-ai lookup miss, using provider fallback`,{providerId:e,effectiveModelId:o,error:t instanceof Error?t.message:String(t)});let a=r.find(e=>e.id===o);return a?n?{...a,baseUrl:n}:a:i.isOAuth?U(e,o,n):b(`anthropic`,`claude-sonnet-4-0`)}}function St(e){let t=e.toLowerCase();if(!t)return null;let n=null;try{n=H()}catch{}if(n!==null){let e=q(t,[n]);if(e!==null)return e}return q(t,M().map(e=>e.providerId))}function q(e,t){let n=null,r=-1;for(let i of t)for(let t of A(i)){let i=t.id.toLowerCase(),a=(t.name??``).toLowerCase();if(!i.includes(e)&&!a.includes(e))continue;let o=t.contextWindow??0;(o>r||o===r&&kt(t.id,n??``)>0)&&(r=o,n=t.id)}return n}function J(){let e=[];try{for(let t of M())e.includes(t.providerId)||e.push(t.providerId)}catch{}try{let t=H();e.includes(t)||e.push(t)}catch{}return e}function Ct(e){let t=e.indexOf(`:`);if(t<=0||t===e.length-1)return null;let n=e.slice(0,t),r=e.slice(t+1),i=J().includes(n);if(i)return{providerId:n,modelId:r,configured:i};let a=!1;try{a=E().includes(n)}catch{}return a?{providerId:n,modelId:r,configured:!1}:null}function Y(e,t,n=!0){let r=[e],i=n?q(e.toLowerCase(),[t]):null;i!==null&&i!==e&&r.push(i);let a=[];try{a=A(t)}catch{}for(let n of r)if(!(a.length>0&&!a.some(e=>e.id===n)))try{if(G(n,t).id===n)return{modelId:n,providerId:t}}catch(r){j.debug(`selectModelFromProvider: candidate did not resolve`,{input:e,candidate:n,providerId:t,error:r instanceof Error?r.message:String(r)})}return null}function wt(e){return e.map(e=>`${e.providerId}:${e.modelId}`).join(`, `)}function X(e){if(!e)return{ok:!1,error:`unknown model: (empty)`};let t=Ct(e);if(t)return Et(e,t);let n=null;try{n=H()}catch{}if(n!==null){let t=Y(e,n);if(t)return $(t)}return Dt(e,n)}function Z(){try{return H()}catch{return null}}function Tt(e){let t=Z();return t===null||he(ve(),t,e.providerId,e.modelId)}function Q(e){let t=Z()??`<none>`;return{ok:!1,error:`model not allowed: ${`${e.providerId}:${e.modelId}`} is blocked by ${_} while "${t}" is selected — ${ye(t,e.providerId,e.modelId)}`}}function $(e){return Tt(e)?{ok:!0,selection:e}:Q(e)}function Et(e,t){if(!t.configured){let n=J();return{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" is not configured${n.length>0?`; configured: ${n.join(`, `)}`:``})`}}let n=Y(t.modelId,t.providerId);return n?$(n):{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" does not offer "${t.modelId}")`}}function Dt(e,t){let n=J().filter(e=>e!==t);for(let t of[`exact`,`shorthand`]){let r=[];for(let i of n){let n=t===`exact`?e:q(e.toLowerCase(),[i]);if(n===null)continue;let a=Y(n,i,!1);a&&r.push(a)}let i=r.filter(Tt);if(i.length===0&&r.length>0)return Q(r[0]);if(i.length===1)return{ok:!0,selection:i[0]};if(i.length>1)return{ok:!1,error:`ambiguous model: ${e} matches ${wt(i)} — qualify it as provider:model`}}return{ok:!1,error:`unknown model: ${e}`}}function Ot(e){let t=X(e);return t.ok?t.selection.modelId:null}function kt(e,t){let n=e.match(/\d+/g)?.map(Number)??[],r=t.match(/\d+/g)?.map(Number)??[],i=Math.max(n.length,r.length);for(let e=0;e<i;e++){let t=(n[e]??0)-(r[e]??0);if(t!==0)return t}return 0}export{m as C,g as S,tt as _,z as a,fe as b,nt as c,V as d,H as f,X as g,G as h,ct as i,Oe as l,K as m,$e as n,rt as o,xt as p,M as r,B as s,be as t,A as u,_ as v,_e as x,v as y};
1
+ import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-LESFN7Hj.js";import"./proxied-fetch-F-dCBEfh.js";import{n,t as r}from"./panel-rpc-accessor-B4BfPLSo.js";import{n as i,o as a,t as o}from"./providers-00axKtF9.js";import{s,t as c}from"./api-endpoint-D8lUKmPu.js";import{n as l,t as u}from"./stored-accounts-Cx83FZwe.js";import{a as d,i as ee,o as f}from"./core-C1m4D34S.js";import{n as te}from"./float-topology-COIC4j_U.js";import{t as ne}from"./secrets-bridge-client-GOCzDscb.js";import{a as re,c as ie,i as ae,l as oe}from"./bedrock-camp-compat-ByR2ly4i.js";import{r as se,t as ce}from"./bedrock-camp-extra-models-DIuCBjcJ.js";import{s as p}from"./claude-model-version-ceOteQ2f.js";const le=`slicc_oauth_extra_domains`;function m(e){try{let t=e.getItem(le);if(!t)return{};let n=JSON.parse(t);if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n)){if(typeof e!=`string`||!Array.isArray(t))continue;let n=t.filter(e=>typeof e==`string`&&e.length>0);n.length>0&&(r[e]=n)}return r}catch{return{}}}function h(e,t){try{e.setItem(le,JSON.stringify(t))}catch(e){throw Error(`Failed to persist OAuth extras (localStorage quota exceeded?): ${e instanceof Error?e.message:String(e)}`)}}function g(e,t){let n={input:0,output:0,cacheRead:0,cacheWrite:0},r=p(e);if(!r)return n;let i;for(let e of t.values()){let t=p(e.id);!t||t.family!==r.family||(!i||t.major>i.major||t.major===i.major&&t.minor>i.minor)&&(i={major:t.major,minor:t.minor,cost:e.cost})}return i?.cost??n}const ue=t(`model-policy`),_=`/etc/models`;function v(){return{sections:{}}}function de(e){let t=e.indexOf(`#`);return(t===-1?e:e.slice(0,t)).trim()}function fe(e){let t=v();if(typeof e!=`string`)return t;let n=null;for(let r of e.split(/\r?\n/)){let e=de(r);if(!e)continue;let i=/^\[([^\]]+)\]$/.exec(e);if(i){n=i[1].trim(),t.sections[n]??=[];continue}if(n===null){ue.warn(`model policy entry before any [provider] section — ignored`,{entry:e});continue}let a=e.startsWith(`-`),o=a?e.slice(1).trim():e,s=o.indexOf(`:`);if(s<=0||s===o.length-1){ue.warn(`model policy entry is not provider:model — ignored`,{entry:e});continue}t.sections[n].push({providerId:o.slice(0,s).trim(),modelId:o.slice(s+1).trim(),deny:a})}return t}function y(e,t,n){return e.providerId===t?e.modelId===`*`||e.modelId===n:!1}function pe(e,t){return e.sections[t]??[]}function me(e,t,n,r){return pe(e,t).some(e=>e.deny&&y(e,n,r))}function he(e,t,n,r){let i=pe(e,t);return i.some(e=>e.deny&&y(e,n,r))?!1:n===t||i.some(e=>!e.deny&&y(e,n,r))}let ge=v();function _e(e){ge=e}function ve(){return ge}function ye(e,t,n){return`add \`${t}:${n}\` (or \`${t}:*\`) under \`[${e}]\` in ${_}`}var be=e({ACCOUNTS_KEY:()=>u,__test__:()=>Te,addAccount:()=>P,applyProviderDefaults:()=>Ae,clearAllSettings:()=>ht,clearApiKey:()=>ut,clearBaseUrl:()=>pt,clearSelectedProvider:()=>st,ensureOAuthMaskReplica:()=>$e,exportProviders:()=>mt,getAccounts:()=>M,getAllAvailableModels:()=>Fe,getAllExtraOAuthDomains:()=>Be,getAlternativeModelProviders:()=>Ie,getApiKey:()=>ct,getApiKeyForProvider:()=>z,getApiVersionForProvider:()=>rt,getAvailableProviders:()=>E,getBaseUrl:()=>dt,getBaseUrlForProvider:()=>B,getDeploymentForProvider:()=>nt,getExtraOAuthDomains:()=>Le,getModelCatalogProviderIds:()=>_t,getOAuthAccountInfo:()=>Oe,getProviderConfig:()=>O,getProviderModels:()=>A,getRawApiKeyForProvider:()=>R,getSelectedModelId:()=>V,getSelectedProvider:()=>H,isModelHiddenFromPicker:()=>Me,isUsableOAuthMaskReplica:()=>I,logoutOAuthAccount:()=>Ue,maskOAuthTokenWithRetry:()=>We,migrateLegacyAuthOnlySelection:()=>T,modelRunsOnProvider:()=>xt,persistOAuthMaskViaServiceWorker:()=>L,policyVisible:()=>Pe,providerOffersLlmModels:()=>D,removeAccount:()=>F,resolveCurrentModel:()=>K,resolveModelById:()=>G,resolveModelByShorthand:()=>St,resolveModelIdForScoop:()=>Ot,resolveModelSelectionForScoop:()=>X,saveOAuthAccount:()=>tt,setApiKey:()=>lt,setBaseUrl:()=>ft,setExtraOAuthDomains:()=>Re,setExtraOAuthDomainsAsync:()=>ze,setSelectedModelId:()=>it,setSelectedProvider:()=>ot});const b=ee,x=d,S=`selected-model`,xe=[`slicc_provider`,`slicc_api_key`,`slicc_base_url`,`anthropic_api_key`,`api_provider`,`azure_resource`,`bedrock_region`],Se=new Set([`github`]);function C(e){let t;try{t=f()}catch{return!1}return t.includes(e)&&!a(e)}let w=!1;function Ce(){if(!w){w=!0;for(let e of xe)try{localStorage.removeItem(e)}catch{}T()}}function T(){try{let e=localStorage.getItem(S);if(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t);(Se.has(n)||C(n))&&localStorage.removeItem(S)}}}catch{}try{let e=localStorage.getItem(u);if(!e)return;let t=JSON.parse(e);if(!Array.isArray(t))return;let n=t.filter(e=>!(typeof e==`object`&&e&&typeof e.providerId==`string`&&C(e.providerId)));n.length!==t.length&&localStorage.setItem(u,JSON.stringify(n))}catch{}}function we(){w=!1}const Te={_resetLegacyCleanup:we};function E(){let e=f().filter(a),t=i();return[...new Set([...e,...t])].filter(e=>!o(e)?.hidden)}function D(e){try{if(A(e).length>0)return!0}catch{}try{if(d(e).length>0)return!0}catch{}let t=o(e);return!!(t?.modelOverrides&&Object.keys(t.modelOverrides).length>0)}function Ee(e,t){try{if(A(e).some(e=>e.id===t))return!0}catch{}try{if(d(e).some(e=>e.id===t))return!0}catch{}let n=o(e);return!!(n?.modelOverrides&&Object.hasOwn(n.modelOverrides,t))}function O(e){return o(e)||{id:e,name:e.split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),description:`${e} provider`,requiresApiKey:!0,requiresBaseUrl:!1}}function k(e,t){t.context_window!==void 0&&(e.contextWindow=t.context_window),t.max_tokens!==void 0&&(e.maxTokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),t.cost!==void 0&&(e.cost=t.cost,e.inputCost=t.cost.input,e.outputCost=t.cost.output,e.cacheReadCost=t.cost.cacheRead,e.cacheWriteCost=t.cost.cacheWrite),t.compat!==void 0&&(e.compat={...e.compat??{},...t.compat}),t.thinkingLevelMap!==void 0&&(e.thinkingLevelMap={...e.thinkingLevelMap??{},...t.thinkingLevelMap})}function De(e){let t=ae(e);return{...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`,reasoning:e.reasoning===!0&&(ie(e)||t!==null),...t?{thinkingLevelMap:{...t}}:{}}}function A(e){try{if(e===`bedrock-camp`){let e=re(B(`bedrock-camp`));return se(x(`amazon-bedrock`),ce).filter(t=>oe(t,e)).map(De)}let t=O(e);if(t.getModelIds){let n;try{n=t.getModelIds()}catch(t){return j.error(`Provider getModelIds callback failed`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}let r=new Map;for(let e of f())try{for(let t of x(e))r.set(t.id,t)}catch{}return n.map(n=>{let i=n.api===`openai`?`openai`:`anthropic`,a=`${e}-${i}`,o=r.get(n.id),s;if(o)s={...o,api:a,provider:e};else if(s=U(e,n.id,``,a),n.name&&(s.name=n.name),i===`anthropic`){let e=g(n.id,r);s.cost=e,s.inputCost=e.input,s.outputCost=e.output,s.cacheReadCost=e.cacheRead,s.cacheWriteCost=e.cacheWrite}let c=t.modelOverrides?.[n.id];return c&&k(s,c),k(s,n),s})}if(t.isOAuth){let n=x(`anthropic`),r=`${e}-anthropic`;return n.map(n=>{let i={...n,api:r,provider:e},a=t.modelOverrides?.[n.id];return a&&k(i,a),i})}return x(e===`azure-ai-foundry`?`anthropic`:e)}catch(t){return j.error(`Failed to load models`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}}function Oe(e){let t=M().find(t=>t.providerId===e);if(!t?.accessToken)return null;let n=!!t.tokenExpiresAt&&Date.now()>t.tokenExpiresAt-6e4;return{token:t.accessToken,maskedValue:t.maskedValue,expiresAt:t.tokenExpiresAt,userName:t.userName,userAvatar:t.userAvatar,scopes:t.scopes,expired:n}}const ke=Object.assign({})[`/packages/webapp/providers.json`]??[],j=t(`provider-settings`);function Ae(e=ke){if(e.length===0||M().length>0)return;let t=new Set(E());for(let n of e)if(!(!n.providerId||!n.apiKey)){if(!t.has(n.providerId)){j.warn(`Unknown provider "${n.providerId}" in providers.json — skipping`);continue}P(n.providerId,n.apiKey,n.baseUrl)}let n=e.find(e=>e.providerId&&e.apiKey&&t.has(e.providerId));n?.model&&!localStorage.getItem(S)&&localStorage.setItem(S,`${n.providerId}:${n.model}`)}const je=[/haiku/i];function Me(e){return je.some(t=>t.test(e))}function Ne(e){return e.filter(e=>!Me(e.id))}function Pe(e,t){let n=Z();if(n===null)return e;let r=ve();return e.filter(e=>!me(r,n,t,e.id))}function Fe(){let e=M();if(e.length===0)return[];let t=new Map;for(let n of e){if(t.has(n.providerId))continue;let e=O(n.providerId);if(e.hidden||C(n.providerId))continue;let r=Pe(Ne(A(n.providerId)),n.providerId);if(r.length===0)continue;let i={providerId:n.providerId,providerName:e.name,models:r};t.set(n.providerId,i)}return[...t.values()]}function Ie(e){return Fe().map(e=>e.providerId).filter(t=>t!==e)}function M(){return Ce(),l()}function Le(e){return m(localStorage)[e]??[]}function Re(e,t){let n=m(localStorage),r=t.map(e=>e.trim()).filter(e=>e.length>0);r.length===0?delete n[e]:n[e]=r,h(localStorage,n)}async function ze(e,t){if(n()){Re(e,t);return}let i=r();if(!i)throw Error(`setExtraOAuthDomainsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let{storeAfter:a}=await i.call(`oauth-extras-set`,{providerId:e,domains:t});try{h(localStorage,a)}catch(t){j.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{providerId:e,error:t instanceof Error?t.message:String(t)})}}function Be(){return m(localStorage)}function Ve(e){localStorage.setItem(u,JSON.stringify(e))}async function N(e){if(n()){Ve(e);return}let t=r();if(!t)throw Error(`saveAccountsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let i=JSON.stringify(e),{storedJson:a}=await t.call(`save-oauth-accounts`,{accountsJson:i});try{localStorage.setItem(u,a)}catch(e){j.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{error:e instanceof Error?e.message:String(e)})}}function P(e,t,n,r,i){let a=M().filter(t=>t.providerId!==e),o={providerId:e,apiKey:t};n&&(o.baseUrl=n),r&&(o.deployment=r),i&&(o.apiVersion=i),a.push(o),Ve(a)}async function He(e){let t=te();try{if(t===`extension-direct`){let t=await new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.delete`,name:`oauth.${e}.token`},n=>{chrome.runtime.lastError&&j.error(`SW secrets.delete transport failed`,{providerId:e,error:chrome.runtime.lastError.message}),t(n??{})})});t.error&&j.error(`SW secrets.delete returned error`,{providerId:e,error:t.error})}else if(t===`extension-delegate`){let t=await ne(`secrets.delete`,{name:`oauth.${e}.token`});t?.error&&j.error(`Bridge secrets.delete returned error`,{providerId:e,error:t.error})}else if(t!==`connect`){let t=await fetch(s(`/api/secrets/oauth/${e}`),{method:`DELETE`,headers:c()});!t.ok&&t.status!==404&&j.warn(`OAuth replica DELETE non-ok`,{providerId:e,status:t.status})}}catch(n){j.error(`OAuth replica removal failed`,{providerId:e,topology:t,error:n instanceof Error?n.message:String(n)})}}async function F(e){let t=M().find(t=>t.providerId===e),n=O(e);t&&n?.isOAuth&&await Ue(e),await He(e),await N(M().filter(t=>t.providerId!==e));let r=localStorage.getItem(S)??``,i=r.indexOf(`:`);i>0&&r.slice(0,i)===e&&localStorage.removeItem(S)}async function Ue(e){let t=M().find(t=>t.providerId===e);if(!t)return;let n=O(e);if(n?.isOAuth){if(n.onOAuthLogout)try{await n.onOAuthLogout()}catch(t){j.warn(`onOAuthLogout failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})}if(n.getOAuthLogoutUrl){let r=n.getOAuthLogoutUrl(t);if(r){let{openIdpLogoutUrl:t}=await import(`./oauth-service-MWzqRq2q.js`);await t(r).catch(t=>{j.warn(`IdP logout popup failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})})}}await N(M().map(t=>t.providerId===e?{providerId:t.providerId,apiKey:``,baseUrl:t.baseUrl,userName:t.userName,userAvatar:t.userAvatar,loggedOut:!0}:t)),await He(e)}}async function We(e,t={}){let n=Math.max(1,t.attempts??3),r=t.delayMs??150,i=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),a;for(let t=0;t<n;t++){let o=await e();if(o.maskedValue)return{maskedValue:o.maskedValue};o.error&&(a=o.error),t<n-1&&await i(r)}return{lastError:a}}const Ge=`access token rotated during mask write`;function Ke(e,t,n,r){let i=r.find(t=>t.providerId===e);return i?.accessToken?i.accessToken===t?(i.maskedValue=n,{maskedValue:n}):(j.warn(`OAuth mask write raced with token rotation; discarding replica`,{providerId:e}),{error:Ge}):{error:`account gone after mask write`}}function I(e,t){return!!e&&e!==t}async function L(e,t,n){let r={providerId:e.providerId,accessToken:e.accessToken,domains:e.domains.join(`,`)},{maskedValue:i,lastError:a}=await We(()=>t.sendMaskRequest(r),n);if(!I(i,e.accessToken)){let t=i?`mask replica equals the access token`:a??`no error reported (cold SW or empty reply)`;return j.error(`OAuth mask give-up: no masked value after retries`,{providerId:e.providerId,reason:t}),{error:t}}let o=t.getAccounts(),s=Ke(e.providerId,e.accessToken,i,o);return s.maskedValue&&await t.saveAccounts(o),s}function qe(e){let t=O(e).oauthTokenDomains??[],n=Le(e),r=new Set,i=[];for(let e of[...t,...n]){let t=e.toLowerCase();r.has(t)||(r.add(t),i.push(e))}return i}function Je(e){return new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.mask-oauth-token`,...e},n=>{chrome.runtime.lastError&&j.error(`SW mask-oauth-token transport failed`,{providerId:e.providerId,error:chrome.runtime.lastError.message});let r=typeof n==`object`&&n?n:void 0;r?.error&&j.warn(`SW mask-oauth-token returned error`,{providerId:e.providerId,error:r.error}),t(r??{})})})}function Ye(e){return ne(`secrets.mask-oauth-token`,e).then(t=>(t?.error&&j.warn(`Bridge mask-oauth-token returned error`,{providerId:e.providerId,error:t.error}),t??{})).catch(t=>(j.error(`Bridge mask-oauth-token transport failed`,{providerId:e.providerId,error:t instanceof Error?t.message:String(t)}),{}))}async function Xe(e,t,n){let r=s(`/api/secrets/oauth-update`),i=await fetch(r,{method:`POST`,headers:c({"Content-Type":`application/json`}),body:JSON.stringify({providerId:e,accessToken:t,domains:n})});if(!i.ok)return j.warn(`OAuth replica POST non-ok`,{providerId:e,status:i.status,url:r}),{error:`OAuth replica POST HTTP ${i.status}`};let a=await i.json();if(typeof a.maskedValue!=`string`)return j.warn(`OAuth replica POST ok but missing maskedValue`,{providerId:e,url:r}),{error:`OAuth replica POST ok but missing maskedValue`};if(!I(a.maskedValue,t))return j.error(`OAuth mask replica equals the access token; refusing to persist`,{providerId:e}),{error:`mask replica equals the access token`};let o=M(),l=Ke(e,t,a.maskedValue,o);return l.maskedValue&&await N(o),l}async function Ze(e,t){let n=await Qe(e,t);if(n.error!==Ge)return n;let r=M().find(t=>t.providerId===e)?.accessToken;return!r||r===t?n:Qe(e,r)}async function Qe(e,t){let n=qe(e);if(n.length===0)return{error:`no oauth token domains configured`};let r=te();try{return r===`extension-direct`?L({providerId:e,accessToken:t,domains:n},{sendMaskRequest:Je,getAccounts:M,saveAccounts:N}):r===`extension-delegate`?L({providerId:e,accessToken:t,domains:n},{sendMaskRequest:Ye,getAccounts:M,saveAccounts:N}):r===`connect`?{error:`no replica store in connect mode`}:await Xe(e,t,n)}catch(t){let n=t instanceof Error?t.message:String(t);return j.error(`OAuth replica sync failed`,{providerId:e,topology:r,error:n}),{error:n}}}async function $e(e){let t=M().find(t=>t.providerId===e);return t?.accessToken?I(t.maskedValue,t.accessToken)?{maskedValue:t.maskedValue}:Ze(e,t.accessToken):{error:`no access token held`}}function et(e,t){if(e.accessToken)return`scopes`in e?e.scopes:t?.scopes}async function tt(e){let t=M().find(t=>t.providerId===e.providerId),n=M().filter(t=>t.providerId!==e.providerId);n.push({providerId:e.providerId,apiKey:``,accessToken:e.accessToken,refreshToken:e.refreshToken,tokenExpiresAt:e.tokenExpiresAt,userName:e.userName,userAvatar:e.userAvatar,baseUrl:e.baseUrl??t?.baseUrl,scopes:et(e,t)}),await N(n),await Ze(e.providerId,e.accessToken)}function R(e){let t=M().find(t=>t.providerId===e);return t&&(t.accessToken||t.apiKey)||null}function z(e){let t=M().find(t=>t.providerId===e);return t?t.accessToken||t.apiKey||(O(e).optionalApiKey?`local`:null):null}function B(e){return M().find(t=>t.providerId===e)?.baseUrl??null}function nt(e){return M().find(t=>t.providerId===e)?.deployment??null}function rt(e){return M().find(t=>t.providerId===e)?.apiVersion??null}function V(){let e=localStorage.getItem(S)||``,t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function it(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t),r=new Set([...i(),...E()]),a=n.includes(`.`);if(r.has(n)||!a){localStorage.setItem(S,e);return}}let n=H();localStorage.setItem(S,`${n}:${e}`)}function at(){return localStorage.getItem(S)||``}function H(){let e=at(),t=e.indexOf(`:`);if(t>0)return e.slice(0,t);let n=M(),r=V();if(r){let e=n.find(e=>D(e.providerId)&&Ee(e.providerId,r));if(e)return e.providerId}let i=n.find(e=>D(e.providerId));return i?i.providerId:n.length>0?n[0].providerId:`anthropic`}function ot(e){let t=V();localStorage.setItem(S,`${e}:${t}`)}function st(){let e=V();localStorage.setItem(S,e)}function ct(){return z(H())}function lt(e){let t=H();P(t,e,B(t)??void 0)}async function ut(){await F(H())}function dt(){return B(H())}function ft(e){let t=H(),n=R(t);n&&P(t,n,e||void 0)}function pt(){let e=H(),t=R(e);t&&P(e,t)}function mt(){let e=M(),t=H(),n=V();return e.map(e=>{let r={providerId:e.providerId,apiKey:e.apiKey};return e.baseUrl&&(r.baseUrl=e.baseUrl),e.providerId===t&&n&&(r.model=n),r})}async function ht(){let e=M();await Promise.allSettled(e.map(e=>F(e.providerId))),localStorage.removeItem(u),localStorage.removeItem(S);for(let e of xe)localStorage.removeItem(e)}function gt(e){return/^(?:gpt[-.]?|o[0-9]|chatgpt)/i.test(e)?`openai`:`anthropic`}function U(e,t,n,r){return{id:t,name:t,provider:e,api:r??`${e}-${gt(t)}`,baseUrl:n??``,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},reasoning:!0}}function W(e,t){return t.isOAuth||e===`azure-ai-foundry`?`anthropic`:e===`bedrock-camp`?`amazon-bedrock`:e}function _t(){let e=new Set;for(let t of M())t.loggedOut||(e.add(t.providerId),e.add(W(t.providerId,O(t.providerId))));return[...e]}function vt(e,t,n){let r=A(e).find(e=>e.id===t);return r?n?{...r,baseUrl:n}:r:null}function yt(e,t,n,r){return n.isOAuth?A(t).find(e=>e.id===r)||{...e,api:`${t}-anthropic`,provider:t}:t===`bedrock-camp`?{...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`}:e}function bt(e,t,n,r,i){let a=vt(e,n,r);if(a)return a;if(t.isOAuth)return U(e,n,r);if(i)throw Error(`Model ${n} is not available from provider ${e}`);return K()}function G(e,t){if(!e)return K();let n=t??H(),r=B(n),i=O(n);if(t!==void 0){let t=vt(n,e,r);if(t)return t}try{let t=W(n,i),a=b(t,e);if(!a?.id)throw Error(`Model ${e} not found`);let o=yt(a,n,i,e);return r?{...o,baseUrl:r}:o}catch(a){return j.debug(`resolveModelById: pi-ai lookup miss, using provider fallback`,{providerId:n,modelId:e,error:a instanceof Error?a.message:String(a)}),bt(n,i,e,r,t!==void 0)}}function xt(e,t){return e.provider===t||e.provider===W(t,O(t))}function K(){let e=H(),t=V(),n=B(e),r=A(e),i=O(e),a=i.defaultModelId?r.find(e=>e.id.toLowerCase().includes(i.defaultModelId.toLowerCase()))?.id:void 0,o=t||a||r[0]?.id||`claude-sonnet-4-6`;try{let t=W(e,i),a=b(t,o);if(!a?.id)throw Error(`Model ${o} not found in ${t} registry`);let s=a;return i.isOAuth?s=r.find(e=>e.id===o)||{...s,api:`${e}-anthropic`,provider:e}:e===`bedrock-camp`&&(s={...s,api:`bedrock-camp-converse`,provider:`bedrock-camp`}),n&&(s={...s,baseUrl:n}),s}catch(t){j.debug(`resolveCurrentModel: pi-ai lookup miss, using provider fallback`,{providerId:e,effectiveModelId:o,error:t instanceof Error?t.message:String(t)});let a=r.find(e=>e.id===o);return a?n?{...a,baseUrl:n}:a:i.isOAuth?U(e,o,n):b(`anthropic`,`claude-sonnet-4-0`)}}function St(e){let t=e.toLowerCase();if(!t)return null;let n=null;try{n=H()}catch{}if(n!==null){let e=q(t,[n]);if(e!==null)return e}return q(t,M().map(e=>e.providerId))}function q(e,t){let n=null,r=-1;for(let i of t)for(let t of A(i)){let i=t.id.toLowerCase(),a=(t.name??``).toLowerCase();if(!i.includes(e)&&!a.includes(e))continue;let o=t.contextWindow??0;(o>r||o===r&&kt(t.id,n??``)>0)&&(r=o,n=t.id)}return n}function J(){let e=[];try{for(let t of M())e.includes(t.providerId)||e.push(t.providerId)}catch{}try{let t=H();e.includes(t)||e.push(t)}catch{}return e}function Ct(e){let t=e.indexOf(`:`);if(t<=0||t===e.length-1)return null;let n=e.slice(0,t),r=e.slice(t+1),i=J().includes(n);if(i)return{providerId:n,modelId:r,configured:i};let a=!1;try{a=E().includes(n)}catch{}return a?{providerId:n,modelId:r,configured:!1}:null}function Y(e,t,n=!0){let r=[e],i=n?q(e.toLowerCase(),[t]):null;i!==null&&i!==e&&r.push(i);let a=[];try{a=A(t)}catch{}for(let n of r)if(!(a.length>0&&!a.some(e=>e.id===n)))try{if(G(n,t).id===n)return{modelId:n,providerId:t}}catch(r){j.debug(`selectModelFromProvider: candidate did not resolve`,{input:e,candidate:n,providerId:t,error:r instanceof Error?r.message:String(r)})}return null}function wt(e){return e.map(e=>`${e.providerId}:${e.modelId}`).join(`, `)}function X(e){if(!e)return{ok:!1,error:`unknown model: (empty)`};let t=Ct(e);if(t)return Et(e,t);let n=null;try{n=H()}catch{}if(n!==null){let t=Y(e,n);if(t)return $(t)}return Dt(e,n)}function Z(){try{return H()}catch{return null}}function Tt(e){let t=Z();return t===null||he(ve(),t,e.providerId,e.modelId)}function Q(e){let t=Z()??`<none>`;return{ok:!1,error:`model not allowed: ${`${e.providerId}:${e.modelId}`} is blocked by ${_} while "${t}" is selected — ${ye(t,e.providerId,e.modelId)}`}}function $(e){return Tt(e)?{ok:!0,selection:e}:Q(e)}function Et(e,t){if(!t.configured){let n=J();return{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" is not configured${n.length>0?`; configured: ${n.join(`, `)}`:``})`}}let n=Y(t.modelId,t.providerId);return n?$(n):{ok:!1,error:`unknown model: ${e} (provider "${t.providerId}" does not offer "${t.modelId}")`}}function Dt(e,t){let n=J().filter(e=>e!==t);for(let t of[`exact`,`shorthand`]){let r=[];for(let i of n){let n=t===`exact`?e:q(e.toLowerCase(),[i]);if(n===null)continue;let a=Y(n,i,!1);a&&r.push(a)}let i=r.filter(Tt);if(i.length===0&&r.length>0)return Q(r[0]);if(i.length===1)return{ok:!0,selection:i[0]};if(i.length>1)return{ok:!1,error:`ambiguous model: ${e} matches ${wt(i)} — qualify it as provider:model`}}return{ok:!1,error:`unknown model: ${e}`}}function Ot(e){let t=X(e);return t.ok?t.selection.modelId:null}function kt(e,t){let n=e.match(/\d+/g)?.map(Number)??[],r=t.match(/\d+/g)?.map(Number)??[],i=Math.max(n.length,r.length);for(let e=0;e<i;e++){let t=(n[e]??0)-(r[e]??0);if(t!==0)return t}return 0}export{m as C,g as S,tt as _,z as a,fe as b,nt as c,V as d,H as f,X as g,G as h,ct as i,Oe as l,K as m,$e as n,rt as o,xt as p,M as r,B as s,be as t,A as u,_ as v,_e as x,v as y};
@@ -1,2 +1,2 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/oauth-service-GpUOM3Aw.js","assets/preload-helper-Czpn1I53.js","assets/proxied-fetch-4VBgrEIu.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/base64-ELzoYfwP.js","assets/proxy-error-BSFYY7jj.js","assets/api-endpoint-DuEQRZ4g.js","assets/runtime-env-Dlaokqg1.js","assets/panel-rpc-accessor-B4BfPLSo.js","assets/permissions-surface-registry-CilCRwhh.js"])))=>i.map(i=>d[i]);
2
- import{a as e,o as t}from"./core-Cx9N3lmn.js";import{a as n}from"./diagnostics-Cag7MsZI.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{a as i}from"./compat-BAGLwgqY.js";import{a,r as o,s,t as c}from"./legacy-api-aliases-BjgG1CsY.js";import{O as l,W as u,Z as d,u as f,y as p}from"./account-store-K5DJCchF.js";import{t as m}from"./panel-rpc-accessor-B4BfPLSo.js";import{t as h}from"./providers-BDpLAzfX.js";import{i as g,n as _,r as ee}from"./claude-model-version-DZmbk9E2.js";import"./main-Dbl4-foD.js";import{n as v,t as te}from"./silent-renew-backoff-BmTBjYE8.js";import{i as ne}from"./provider-budget-LCzMPlKv.js";import{getOAuthPageOrigin as re}from"./oauth-service-GpUOM3Aw.js";import{n as y}from"./pi-transcript-context-miZCMig3.js";import{n as b}from"./temperature-support-DhoZT6gU.js";import{t as x}from"./llm-session-id-bZQs6gBN.js";var ie={proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`};function ae(e,t){return _(e,t)}function S(e,t,n){return e!==`xhigh`||!t?e:g(t,n)?`xhigh`:ee(t,n)?`max`:`high`}function oe(e,t){let n=e?t?.thinkingLevelMap?.[e]:void 0;return S((()=>{if(typeof n==`string`)return n;switch(e){case`minimal`:case`low`:return`low`;case`medium`:return`medium`;case`xhigh`:return`xhigh`;default:return`high`}})(),t?.id,t?.name)}function se(e,t){return async(n,r)=>{let i=t?await t(n,r)??n:n,a=i.thinking;return a&&a.type===`enabled`&&(i.thinking={type:`adaptive`,...a.display===void 0?{}:{display:a.display}},i.output_config={...i.output_config??{},effort:e}),i}}function ce(e,t){if(!ae(e.id,e.name))return t;let n=t,r=S(n.effort??oe(n.reasoning,e),e.id,e.name);return{...t,onPayload:se(r,n.onPayload)}}function le(e,t){let n={id:e.id,name:e.name??e.id},r=t?.api??e.api,i=t?.context_window??e.context_window,a=t?.max_tokens??e.max_tokens,o=t?.reasoning??e.reasoning,s=t?.input??e.input;r&&(n.api=r),i!==void 0&&(n.context_window=i),a!==void 0&&(n.max_tokens=a),o!==void 0&&(n.reasoning=o),s&&(n.input=s);let c=t?.cost??e.cost;return c&&(n.cost=c),/haiku/i.test(e.id)&&(n.compat={supportsEagerToolInputStreaming:!1}),/sonnet-5\b/i.test(e.id)&&!n.thinkingLevelMap&&(n.thinkingLevelMap={xhigh:`xhigh`}),n}var ue=8e3;async function de(e,t,n,r={}){let i=typeof AbortController==`function`?new AbortController:null,a=i?setTimeout(()=>i.abort(),r.timeoutMs??ue):null;try{let a=await n(`${e.replace(/\/$/,``)}/v1/usage`,{headers:{...r.headers,Authorization:`Bearer ${t}`},...i?{signal:i.signal}:{}});if(a.status===404||a.status===501)return null;if(!a.ok)throw Error(`Adobe /v1/usage returned ${a.status}`);return ne(await a.json())}finally{a&&clearTimeout(a)}}var fe=6e4,pe=3e5,me=18e5,he=class{resolve;providerId;now;#e=null;#t=null;#n=null;#r=null;constructor(e,t,n=Date.now){this.resolve=e,this.providerId=t,this.now=n}#i(e){return e===`ok`?fe:e===`unsupported`?me:pe}isStale(){let e=this.#e;return!e||this.#t!==this.providerId()||this.now()-e.at>=this.#i(e.outcome)}snapshot(){return this.#t===this.providerId()?this.#e?.window??null:null}async refresh(e={}){if(!e.force&&!this.isStale())return this.snapshot();let t=this.providerId();return this.#n!==null&&this.#r===t?this.#n:(this.#n=this.resolve().then(e=>{let n=e?{...e,at:this.now()}:null;return this.#a(t,n?`ok`:`unsupported`,n),n}).catch(()=>{let e=this.snapshot();return this.#a(t,`failed`,e),e}).finally(()=>{this.#r===t&&(this.#n=null,this.#r=null)}),this.#r=t,this.#n)}#a(e,t,n){e===this.providerId()&&(this.#t=e,this.#e={outcome:t,window:n,at:this.now()})}clear(){this.#e=null,this.#t=null}};async function ge(){let e=l();if(!e)return null;let t=h(e);if(!t?.getBudgetUsage)return null;let n=await t.getBudgetUsage();return n?{...n,providerId:e}:null}function _e(){try{return l()}catch{return``}}var ve=new he(ge,_e);function C(){ve.clear()}var w=Object.assign({"/packages/webapp/providers/adobe-config.json":ie})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function T(){let e=p(`adobe`);if(e)return e.replace(/\/$/,``);if(w.proxyEndpoint)return w.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}var E=new Map,D=new Map,O=`slicc-adobe-models`;function k(e){try{localStorage.setItem(O,JSON.stringify(e))}catch{}}async function A(e){try{let t=await fetch(`${e}/v1/config`,{headers:{[K]:`6.238.0`}});return t.ok?await t.json():(console.warn(`[adobe] Proxy /v1/config returned ${t.status}`),null)}catch(e){return console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e)),null}}async function j(e){let t=E.get(e);if(t)return t;let n=await A(e);return n||=(await new Promise(e=>setTimeout(e,600)),await A(e)),n?(E.set(e,n),n):{}}function M(e){let t=e.clientId||w.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 N(e){return e.scopes||w.scopes}function P(e){return e.imsEnvironment||w.imsEnvironment||`prod`}var F={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function I(e){return F[e??w.imsEnvironment??`prod`]??F.prod}var ye=1e4,be=5e3;async function L(){let e;try{e=T()}catch{return{}}return E.get(e)||new Promise(t=>{let n=setTimeout(()=>t({}),be),r=e=>{clearTimeout(n),t(e)};j(e).then(r,()=>r({}))})}function R(e){try{let t=e.split(`.`)[1];if(!t)return;let n=t.replace(/-/g,`+`).replace(/_/g,`/`),r=atob(n+`=`.repeat((4-n.length%4)%4)),i=JSON.parse(r);return typeof i.client_id==`string`?i.client_id:void 0}catch{return}}var z=typeof chrome<`u`&&!!chrome?.runtime?.id;function B(){return f().find(e=>e.providerId===`adobe`)}var xe=[`/ims/profile/v1`,`/ims/userinfo/v2`];async function Se(e,t){try{let n=await fetch(e,{headers:{Authorization:`Bearer ${t}`}});if(!n.ok){console.warn(`[adobe] Profile fetch ${e} returned ${n.status}`);return}let r=await n.json(),i=r.displayName||r.name||r.email;return i?{name:i,avatar:r.picture||r.avatar_url}:void 0}catch(t){console.warn(`[adobe] Profile fetch ${e} failed:`,t instanceof Error?t.message:String(t));return}}async function Ce(e,t){for(let n of xe){let r=await Se(`${I(t)}${n}`,e);if(r)return r}return console.warn(`[adobe] No IMS profile endpoint named the user; account will have no display name`),{}}async function we(){let e=B(),t=e?.accessToken;if(!t)return{status:`unknown`,detail:`no stored token`};let n=await L(),r=R(t)||n.clientId||w.clientId||``;if(!r)return{status:`unknown`,detail:`no IMS client ID available`};let i=I(P(n));try{let n=await fetch(`${i}/ims/validate_token/v1`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:r,token:t,type:`access_token`}),signal:AbortSignal.timeout(ye)});if(!n.ok)return{status:`unknown`,detail:`HTTP ${n.status}${n.statusText?` ${n.statusText}`:``}`};let a=await n.json();return a.valid===!0?{status:`accepted`,userName:e?.userName}:a.valid===!1?{status:`rejected`,detail:`IMS reported the token invalid (${typeof a.reason==`string`?a.reason:`no reason given`})`}:{status:`unknown`,detail:"IMS answered 200 without a boolean `valid` verdict"}}catch(e){return{status:`unknown`,detail:e instanceof Error?e.message:String(e)}}}function V(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10),scope:n.get(`scope`)??void 0}:null}var H={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!w.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`,`admin.hlx.page`,`admin.hlx.live`,`admin.aem.page`,`admin.aem.live`,`api.aem.live`],getBudgetUsage:Ee,getModelIds:()=>{let e=e=>le(e,D.get(e.id));for(let t of Q.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id,reasoning:t.reasoning,input:t.input,cost:t.cost}));return k(n),n}for(let t of E.values())if(t.models?.length)return t.models.map(t=>e(t));try{let e=localStorage.getItem(O);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,t,n)=>{let r=T(),i=await j(r),a=M(i),o=N(i),s=P(i),c=z?null:await re(),l=z?null:v({pageHref:c.href,pageOrigin:c.origin,configuredRedirectUri:w.redirectUri},()=>crypto.randomUUID()),d=z?w.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:l.redirectUri,f=l?.oauthState,p=l?.expectedNonce??null,m=new URLSearchParams({client_id:a,scope:o,response_type:`token`,redirect_uri:d});f&&m.set(`state`,f),n?.forceReauth&&m.set(`prompt`,`login`);let h=await e(`${I(s)}/ims/authorize/v2?${m}`);if(!h)return;if(p&&h)try{if(new URL(h).searchParams.get(`nonce`)!==p){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let g=V(h);if(!g){console.error(`[adobe] Could not extract token from redirect URL`);return}let _=await Ce(g.accessToken,s);await u({providerId:`adobe`,accessToken:g.accessToken,tokenExpiresAt:Date.now()+g.expiresIn*1e3,userName:_.name,userAvatar:_.avatar,scopes:g.scope,baseUrl:w.proxyEndpoint?void 0:r}),C(),await $().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),t()},onOAuthLogout:async()=>{let e=B();if(e?.accessToken)try{let t=await L(),n=R(e.accessToken)||t.clientId||w.clientId,r=P(t);if(n){let t=await fetch(`${I(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 u({providerId:`adobe`,accessToken:``}),C()},onSilentRenew:async()=>B()?.accessToken?De():null,onValidateToken:we,refreshModels:async e=>{await $(e);let t=H.getModelIds?.();t?.length&&k(t)}},U=null,Te=te();async function W(){let e=B();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);let t=await Te.run(()=>De());if(t)return t;let n=B();if((n?.tokenExpiresAt??0)-Date.now()>0&&n?.accessToken)return n.accessToken;throw Error(`Adobe session expired — please log in again`)}async function Ee(){let e;try{e=T()}catch{return null}let t=B();if(!t?.accessToken||G())throw Error(`Adobe budget: not signed in`);return de(e,t.accessToken,fetch,{headers:{"X-Session-Id":x(Ne)}})}function G(){let e=B();return!e?.tokenExpiresAt||Date.now()>e.tokenExpiresAt-6e4}async function De(){if(typeof window>`u`){let e=m();if(!e)return null;try{let{accessToken:t}=await e.call(`silent-renew`,{providerId:`adobe`},{timeoutMs:13e4});return t}catch(e){return console.warn(`[adobe] worker→page silent-renew bridge failed:`,e instanceof Error?e.message:String(e)),null}}return U===null&&(U=je().finally(()=>{U=null})),U}function Oe(e,t){let n=M(t),r=N(t),i=P(t),a=z?null:v({pageHref:window.location.href,pageOrigin:window.location.origin,configuredRedirectUri:w.redirectUri},()=>crypto.randomUUID()),o=z?w.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:a.redirectUri,s=a?.oauthState,c=a?.expectedNonce??null,l=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:o,prompt:`none`});return s&&l.set(`state`,s),{authorizeUrl:`${I(i)}/ims/authorize/v2?${l}`,expectedNonce:c,proxyEndpoint:e}}function ke(e,t){if(!t)return!0;try{if(new URL(e).searchParams.get(`nonce`)!==t)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),!1}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}return!0}async function Ae(e,t){let n=B();await u({providerId:`adobe`,accessToken:e.accessToken,tokenExpiresAt:Date.now()+e.expiresIn*1e3,userName:n?.userName,userAvatar:n?.userAvatar,scopes:e.scope,baseUrl:w.proxyEndpoint?void 0:t})}async function je(){try{let e=T(),{authorizeUrl:t,expectedNonce:n}=Oe(e,await j(e)),{createOAuthLauncher:i}=await r(async()=>{let{createOAuthLauncher:e}=await import(`./oauth-service-GpUOM3Aw.js`);return{createOAuthLauncher:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])),a=await i()(t,{interactive:!1});if(!a||!ke(a,n))return null;let o=V(a);return o?(await Ae(o,e),console.log(`[adobe] Token renewed silently`),await $().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),o.accessToken):null}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}}var K=`X-Slicc-Version`;function q(e){let t={},n=K.toLowerCase();if(e.headers)for(let[r,i]of Object.entries(e.headers))r.toLowerCase()!==n&&(t[r]=i);return t[K]=`6.238.0`,{...e,headers:t}}var Me=`adobe-provider-fallback`,Ne=`adobe-usage-probe`,J=new Set;function Y(e,t){if(e.headers){for(let[t,n]of Object.entries(e.headers))if(t.toLowerCase()===`x-session-id`&&n!=null)return e}return J.has(t)||(J.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":x(Me)}}}function Pe(){J.clear()}function Fe(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function X(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e))}var Ie=(e,t,r={})=>{let i=n();return Le(i,e,t,r).catch(X),i};async function Le(e,t,n,r){try{let i=await W();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${T()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},s=o(a,y(n),q(Y({...r,apiKey:i},`streamAdobe[openai]`)));for await(let t of s)e.push(t)}else{let a={...t,baseUrl:T(),api:`anthropic-messages`},o=c(a,y(n),q(Y(ce(t,b(t.id,t.name,{...r,apiKey:i})),`streamAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){X(n),e.push(Fe(t,n)),e.end()}}var Z=(e,t,r)=>{let i=n();return Re(i,e,t,r).catch(X),i};async function Re(e,t,n,r){try{let i=await W();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${T()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=s(a,y(n),q(Y({...r,apiKey:i},`streamSimpleAdobe[openai]`)));for await(let t of o)e.push(t)}else{let o={...t,baseUrl:T(),api:`anthropic-messages`},s=a(o,y(n),q(Y(ce(t,b(t.id,t.name,{...r,apiKey:i})),`streamSimpleAdobe[anthropic]`)));for await(let t of s)e.push(t)}e.end()}catch(n){X(n),e.push(Fe(t,n)),e.end()}}function ze(e){let t={id:e.id,name:e.name};return e.api!==void 0&&(t.api=e.api),e.context_window!==void 0&&(t.context_window=e.context_window),e.max_tokens!==void 0&&(t.max_tokens=e.max_tokens),e.reasoning!==void 0&&(t.reasoning=e.reasoning),e.input!==void 0&&(t.input=e.input),t}function Be(){let n=new Map;for(let r of t())try{let t=e(r);for(let e of t)n.set(e.id,e)}catch{}return n}function Ve(e,t,n){let r=`adobe-${e.api===`openai`?`openai`:`anthropic`}`,i=n.get(e.id);if(i)return{...i,provider:`adobe`,api:r};let a=d(e.id,n);return{id:e.id,name:e.name??e.id,provider:`adobe`,api:r,baseUrl:t,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:a,inputCost:a.input,outputCost:a.output,cacheReadCost:a.cacheRead,cacheWriteCost:a.cacheWrite,reasoning:!0}}function He(e,t){for(let t of e)D.set(t.id,ze(t));let n=Be();return e.map(e=>Ve(e,t,n))}async function Ue(e){try{let t=e??await W(),n=T(),r=await fetch(`${n}/v1/models`,{headers:{Authorization:`Bearer ${t}`,[K]:`6.238.0`}});if(!r.ok)console.warn(`[adobe] Proxy /v1/models returned ${r.status}, falling back to Anthropic models`);else{let e=await r.json();if(e.data?.length)return He(e.data,n)}}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return null}var Q=new Map;function We(){return e(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}async function $(e){let t=T(),n=Q.get(t);if(n)return n;let r=await Ue(e);return r?(Q.set(t,r),r):We()}function Ge(){i({api:`adobe-anthropic`,stream:Ie,streamSimple:Z}),i({api:`adobe-openai`,stream:Ie,streamSimple:Z})}export{Pe as __resetAdobeSessionIdWarningCacheForTests,H as config,V as extractTokenFromUrl,$ as getAdobeModels,W as getValidAccessToken,G as isTokenExpired,Ge as register};
2
+ import{a as e,o as t}from"./core-Cx9N3lmn.js";import{a as n}from"./diagnostics-Cag7MsZI.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{a as i}from"./compat-BAGLwgqY.js";import{a,r as o,s,t as c}from"./legacy-api-aliases-BjgG1CsY.js";import{O as l,W as u,Z as d,u as f,y as p}from"./account-store-31cxummp.js";import{t as m}from"./panel-rpc-accessor-B4BfPLSo.js";import{t as h}from"./providers-jD6rCt0u.js";import{i as g,n as _,r as ee}from"./claude-model-version-DZmbk9E2.js";import"./main-Dz8oxllC.js";import{n as v,t as te}from"./silent-renew-backoff-cI7-L6ZH.js";import{i as ne}from"./provider-budget-LCzMPlKv.js";import{getOAuthPageOrigin as re}from"./oauth-service-GpUOM3Aw.js";import{n as y}from"./pi-transcript-context-miZCMig3.js";import{n as b}from"./temperature-support-DhoZT6gU.js";import{t as x}from"./llm-session-id-bZQs6gBN.js";var ie={proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`};function ae(e,t){return _(e,t)}function S(e,t,n){return e!==`xhigh`||!t?e:g(t,n)?`xhigh`:ee(t,n)?`max`:`high`}function oe(e,t){let n=e?t?.thinkingLevelMap?.[e]:void 0;return S((()=>{if(typeof n==`string`)return n;switch(e){case`minimal`:case`low`:return`low`;case`medium`:return`medium`;case`xhigh`:return`xhigh`;default:return`high`}})(),t?.id,t?.name)}function se(e,t){return async(n,r)=>{let i=t?await t(n,r)??n:n,a=i.thinking;return a&&a.type===`enabled`&&(i.thinking={type:`adaptive`,...a.display===void 0?{}:{display:a.display}},i.output_config={...i.output_config??{},effort:e}),i}}function ce(e,t){if(!ae(e.id,e.name))return t;let n=t,r=S(n.effort??oe(n.reasoning,e),e.id,e.name);return{...t,onPayload:se(r,n.onPayload)}}function le(e,t){let n={id:e.id,name:e.name??e.id},r=t?.api??e.api,i=t?.context_window??e.context_window,a=t?.max_tokens??e.max_tokens,o=t?.reasoning??e.reasoning,s=t?.input??e.input;r&&(n.api=r),i!==void 0&&(n.context_window=i),a!==void 0&&(n.max_tokens=a),o!==void 0&&(n.reasoning=o),s&&(n.input=s);let c=t?.cost??e.cost;return c&&(n.cost=c),/haiku/i.test(e.id)&&(n.compat={supportsEagerToolInputStreaming:!1}),/sonnet-5\b/i.test(e.id)&&!n.thinkingLevelMap&&(n.thinkingLevelMap={xhigh:`xhigh`}),n}var ue=8e3;async function de(e,t,n,r={}){let i=typeof AbortController==`function`?new AbortController:null,a=i?setTimeout(()=>i.abort(),r.timeoutMs??ue):null;try{let a=await n(`${e.replace(/\/$/,``)}/v1/usage`,{headers:{...r.headers,Authorization:`Bearer ${t}`},...i?{signal:i.signal}:{}});if(a.status===404||a.status===501)return null;if(!a.ok)throw Error(`Adobe /v1/usage returned ${a.status}`);return ne(await a.json())}finally{a&&clearTimeout(a)}}var fe=6e4,pe=3e5,me=18e5,he=class{resolve;providerId;now;#e=null;#t=null;#n=null;#r=null;constructor(e,t,n=Date.now){this.resolve=e,this.providerId=t,this.now=n}#i(e){return e===`ok`?fe:e===`unsupported`?me:pe}isStale(){let e=this.#e;return!e||this.#t!==this.providerId()||this.now()-e.at>=this.#i(e.outcome)}snapshot(){return this.#t===this.providerId()?this.#e?.window??null:null}async refresh(e={}){if(!e.force&&!this.isStale())return this.snapshot();let t=this.providerId();return this.#n!==null&&this.#r===t?this.#n:(this.#n=this.resolve().then(e=>{let n=e?{...e,at:this.now()}:null;return this.#a(t,n?`ok`:`unsupported`,n),n}).catch(()=>{let e=this.snapshot();return this.#a(t,`failed`,e),e}).finally(()=>{this.#r===t&&(this.#n=null,this.#r=null)}),this.#r=t,this.#n)}#a(e,t,n){e===this.providerId()&&(this.#t=e,this.#e={outcome:t,window:n,at:this.now()})}clear(){this.#e=null,this.#t=null}};async function ge(){let e=l();if(!e)return null;let t=h(e);if(!t?.getBudgetUsage)return null;let n=await t.getBudgetUsage();return n?{...n,providerId:e}:null}function _e(){try{return l()}catch{return``}}var ve=new he(ge,_e);function C(){ve.clear()}var w=Object.assign({"/packages/webapp/providers/adobe-config.json":ie})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function T(){let e=p(`adobe`);if(e)return e.replace(/\/$/,``);if(w.proxyEndpoint)return w.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}var E=new Map,D=new Map,O=`slicc-adobe-models`;function k(e){try{localStorage.setItem(O,JSON.stringify(e))}catch{}}async function A(e){try{let t=await fetch(`${e}/v1/config`,{headers:{[K]:`6.238.2`}});return t.ok?await t.json():(console.warn(`[adobe] Proxy /v1/config returned ${t.status}`),null)}catch(e){return console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e)),null}}async function j(e){let t=E.get(e);if(t)return t;let n=await A(e);return n||=(await new Promise(e=>setTimeout(e,600)),await A(e)),n?(E.set(e,n),n):{}}function M(e){let t=e.clientId||w.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 N(e){return e.scopes||w.scopes}function P(e){return e.imsEnvironment||w.imsEnvironment||`prod`}var F={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function I(e){return F[e??w.imsEnvironment??`prod`]??F.prod}var ye=1e4,be=5e3;async function L(){let e;try{e=T()}catch{return{}}return E.get(e)||new Promise(t=>{let n=setTimeout(()=>t({}),be),r=e=>{clearTimeout(n),t(e)};j(e).then(r,()=>r({}))})}function R(e){try{let t=e.split(`.`)[1];if(!t)return;let n=t.replace(/-/g,`+`).replace(/_/g,`/`),r=atob(n+`=`.repeat((4-n.length%4)%4)),i=JSON.parse(r);return typeof i.client_id==`string`?i.client_id:void 0}catch{return}}var z=typeof chrome<`u`&&!!chrome?.runtime?.id;function B(){return f().find(e=>e.providerId===`adobe`)}var xe=[`/ims/profile/v1`,`/ims/userinfo/v2`];async function Se(e,t){try{let n=await fetch(e,{headers:{Authorization:`Bearer ${t}`}});if(!n.ok){console.warn(`[adobe] Profile fetch ${e} returned ${n.status}`);return}let r=await n.json(),i=r.displayName||r.name||r.email;return i?{name:i,avatar:r.picture||r.avatar_url}:void 0}catch(t){console.warn(`[adobe] Profile fetch ${e} failed:`,t instanceof Error?t.message:String(t));return}}async function Ce(e,t){for(let n of xe){let r=await Se(`${I(t)}${n}`,e);if(r)return r}return console.warn(`[adobe] No IMS profile endpoint named the user; account will have no display name`),{}}async function we(){let e=B(),t=e?.accessToken;if(!t)return{status:`unknown`,detail:`no stored token`};let n=await L(),r=R(t)||n.clientId||w.clientId||``;if(!r)return{status:`unknown`,detail:`no IMS client ID available`};let i=I(P(n));try{let n=await fetch(`${i}/ims/validate_token/v1`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:r,token:t,type:`access_token`}),signal:AbortSignal.timeout(ye)});if(!n.ok)return{status:`unknown`,detail:`HTTP ${n.status}${n.statusText?` ${n.statusText}`:``}`};let a=await n.json();return a.valid===!0?{status:`accepted`,userName:e?.userName}:a.valid===!1?{status:`rejected`,detail:`IMS reported the token invalid (${typeof a.reason==`string`?a.reason:`no reason given`})`}:{status:`unknown`,detail:"IMS answered 200 without a boolean `valid` verdict"}}catch(e){return{status:`unknown`,detail:e instanceof Error?e.message:String(e)}}}function V(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10),scope:n.get(`scope`)??void 0}:null}var H={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!w.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`,`admin.hlx.page`,`admin.hlx.live`,`admin.aem.page`,`admin.aem.live`,`api.aem.live`],getBudgetUsage:Ee,getModelIds:()=>{let e=e=>le(e,D.get(e.id));for(let t of Q.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id,reasoning:t.reasoning,input:t.input,cost:t.cost}));return k(n),n}for(let t of E.values())if(t.models?.length)return t.models.map(t=>e(t));try{let e=localStorage.getItem(O);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,t,n)=>{let r=T(),i=await j(r),a=M(i),o=N(i),s=P(i),c=z?null:await re(),l=z?null:v({pageHref:c.href,pageOrigin:c.origin,configuredRedirectUri:w.redirectUri},()=>crypto.randomUUID()),d=z?w.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:l.redirectUri,f=l?.oauthState,p=l?.expectedNonce??null,m=new URLSearchParams({client_id:a,scope:o,response_type:`token`,redirect_uri:d});f&&m.set(`state`,f),n?.forceReauth&&m.set(`prompt`,`login`);let h=await e(`${I(s)}/ims/authorize/v2?${m}`);if(!h)return;if(p&&h)try{if(new URL(h).searchParams.get(`nonce`)!==p){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let g=V(h);if(!g){console.error(`[adobe] Could not extract token from redirect URL`);return}let _=await Ce(g.accessToken,s);await u({providerId:`adobe`,accessToken:g.accessToken,tokenExpiresAt:Date.now()+g.expiresIn*1e3,userName:_.name,userAvatar:_.avatar,scopes:g.scope,baseUrl:w.proxyEndpoint?void 0:r}),C(),await $().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),t()},onOAuthLogout:async()=>{let e=B();if(e?.accessToken)try{let t=await L(),n=R(e.accessToken)||t.clientId||w.clientId,r=P(t);if(n){let t=await fetch(`${I(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 u({providerId:`adobe`,accessToken:``}),C()},onSilentRenew:async()=>B()?.accessToken?De():null,onValidateToken:we,refreshModels:async e=>{await $(e);let t=H.getModelIds?.();t?.length&&k(t)}},U=null,Te=te();async function W(){let e=B();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);let t=await Te.run(()=>De());if(t)return t;let n=B();if((n?.tokenExpiresAt??0)-Date.now()>0&&n?.accessToken)return n.accessToken;throw Error(`Adobe session expired — please log in again`)}async function Ee(){let e;try{e=T()}catch{return null}let t=B();if(!t?.accessToken||G())throw Error(`Adobe budget: not signed in`);return de(e,t.accessToken,fetch,{headers:{"X-Session-Id":x(Ne)}})}function G(){let e=B();return!e?.tokenExpiresAt||Date.now()>e.tokenExpiresAt-6e4}async function De(){if(typeof window>`u`){let e=m();if(!e)return null;try{let{accessToken:t}=await e.call(`silent-renew`,{providerId:`adobe`},{timeoutMs:13e4});return t}catch(e){return console.warn(`[adobe] worker→page silent-renew bridge failed:`,e instanceof Error?e.message:String(e)),null}}return U===null&&(U=je().finally(()=>{U=null})),U}function Oe(e,t){let n=M(t),r=N(t),i=P(t),a=z?null:v({pageHref:window.location.href,pageOrigin:window.location.origin,configuredRedirectUri:w.redirectUri},()=>crypto.randomUUID()),o=z?w.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:a.redirectUri,s=a?.oauthState,c=a?.expectedNonce??null,l=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:o,prompt:`none`});return s&&l.set(`state`,s),{authorizeUrl:`${I(i)}/ims/authorize/v2?${l}`,expectedNonce:c,proxyEndpoint:e}}function ke(e,t){if(!t)return!0;try{if(new URL(e).searchParams.get(`nonce`)!==t)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),!1}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}return!0}async function Ae(e,t){let n=B();await u({providerId:`adobe`,accessToken:e.accessToken,tokenExpiresAt:Date.now()+e.expiresIn*1e3,userName:n?.userName,userAvatar:n?.userAvatar,scopes:e.scope,baseUrl:w.proxyEndpoint?void 0:t})}async function je(){try{let e=T(),{authorizeUrl:t,expectedNonce:n}=Oe(e,await j(e)),{createOAuthLauncher:i}=await r(async()=>{let{createOAuthLauncher:e}=await import(`./oauth-service-GpUOM3Aw.js`);return{createOAuthLauncher:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9])),a=await i()(t,{interactive:!1});if(!a||!ke(a,n))return null;let o=V(a);return o?(await Ae(o,e),console.log(`[adobe] Token renewed silently`),await $().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),o.accessToken):null}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}}var K=`X-Slicc-Version`;function q(e){let t={},n=K.toLowerCase();if(e.headers)for(let[r,i]of Object.entries(e.headers))r.toLowerCase()!==n&&(t[r]=i);return t[K]=`6.238.2`,{...e,headers:t}}var Me=`adobe-provider-fallback`,Ne=`adobe-usage-probe`,J=new Set;function Y(e,t){if(e.headers){for(let[t,n]of Object.entries(e.headers))if(t.toLowerCase()===`x-session-id`&&n!=null)return e}return J.has(t)||(J.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":x(Me)}}}function Pe(){J.clear()}function Fe(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function X(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e))}var Ie=(e,t,r={})=>{let i=n();return Le(i,e,t,r).catch(X),i};async function Le(e,t,n,r){try{let i=await W();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${T()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},s=o(a,y(n),q(Y({...r,apiKey:i},`streamAdobe[openai]`)));for await(let t of s)e.push(t)}else{let a={...t,baseUrl:T(),api:`anthropic-messages`},o=c(a,y(n),q(Y(ce(t,b(t.id,t.name,{...r,apiKey:i})),`streamAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){X(n),e.push(Fe(t,n)),e.end()}}var Z=(e,t,r)=>{let i=n();return Re(i,e,t,r).catch(X),i};async function Re(e,t,n,r){try{let i=await W();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${T()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=s(a,y(n),q(Y({...r,apiKey:i},`streamSimpleAdobe[openai]`)));for await(let t of o)e.push(t)}else{let o={...t,baseUrl:T(),api:`anthropic-messages`},s=a(o,y(n),q(Y(ce(t,b(t.id,t.name,{...r,apiKey:i})),`streamSimpleAdobe[anthropic]`)));for await(let t of s)e.push(t)}e.end()}catch(n){X(n),e.push(Fe(t,n)),e.end()}}function ze(e){let t={id:e.id,name:e.name};return e.api!==void 0&&(t.api=e.api),e.context_window!==void 0&&(t.context_window=e.context_window),e.max_tokens!==void 0&&(t.max_tokens=e.max_tokens),e.reasoning!==void 0&&(t.reasoning=e.reasoning),e.input!==void 0&&(t.input=e.input),t}function Be(){let n=new Map;for(let r of t())try{let t=e(r);for(let e of t)n.set(e.id,e)}catch{}return n}function Ve(e,t,n){let r=`adobe-${e.api===`openai`?`openai`:`anthropic`}`,i=n.get(e.id);if(i)return{...i,provider:`adobe`,api:r};let a=d(e.id,n);return{id:e.id,name:e.name??e.id,provider:`adobe`,api:r,baseUrl:t,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:a,inputCost:a.input,outputCost:a.output,cacheReadCost:a.cacheRead,cacheWriteCost:a.cacheWrite,reasoning:!0}}function He(e,t){for(let t of e)D.set(t.id,ze(t));let n=Be();return e.map(e=>Ve(e,t,n))}async function Ue(e){try{let t=e??await W(),n=T(),r=await fetch(`${n}/v1/models`,{headers:{Authorization:`Bearer ${t}`,[K]:`6.238.2`}});if(!r.ok)console.warn(`[adobe] Proxy /v1/models returned ${r.status}, falling back to Anthropic models`);else{let e=await r.json();if(e.data?.length)return He(e.data,n)}}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return null}var Q=new Map;function We(){return e(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}async function $(e){let t=T(),n=Q.get(t);if(n)return n;let r=await Ue(e);return r?(Q.set(t,r),r):We()}function Ge(){i({api:`adobe-anthropic`,stream:Ie,streamSimple:Z}),i({api:`adobe-openai`,stream:Ie,streamSimple:Z})}export{Pe as __resetAdobeSessionIdWarningCacheForTests,H as config,V as extractTokenFromUrl,$ as getAdobeModels,W as getValidAccessToken,G as isTokenExpired,Ge as register};
@@ -1 +1 @@
1
- import{S as e,_ as t,r as n,s as r}from"./account-store-DSFfWkyC.js";import{t as i}from"./panel-rpc-accessor-B4BfPLSo.js";import{a}from"./diagnostics-Cag7MsZI.js";import{a as o}from"./compat-nGhSz-U1.js";import{a as s,o as c}from"./core-C1m4D34S.js";import{a as l,r as u,s as d,t as f}from"./legacy-api-aliases--xyLjPgC.js";import{a as p,i as m,r as h}from"./claude-model-version-ceOteQ2f.js";import{r as g}from"./provider-budget-DbHWq3j6.js";import{n as _}from"./llm-session-id-CKpY5F_-.js";import{n as v}from"./pi-transcript-context-4pjVPiVC.js";import{m as y}from"./kernel-worker-DNqum68Q.js";import{n as b,t as ee}from"./silent-renew-backoff-Dmz3DJHb.js";import{getOAuthPageOrigin as te}from"./oauth-service-MWzqRq2q.js";import{n as x}from"./temperature-support-0nztUM0u.js";import"./provider-settings-CUL7LIod.js";var ne={proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`};function re(e,t){return h(e,t)}function S(e,t,n){return e!==`xhigh`||!t?e:p(t,n)?`xhigh`:m(t,n)?`max`:`high`}function ie(e,t){let n=e?t?.thinkingLevelMap?.[e]:void 0;return S((()=>{if(typeof n==`string`)return n;switch(e){case`minimal`:case`low`:return`low`;case`medium`:return`medium`;case`xhigh`:return`xhigh`;default:return`high`}})(),t?.id,t?.name)}function ae(e,t){return async(n,r)=>{let i=t?await t(n,r)??n:n,a=i.thinking;return a&&a.type===`enabled`&&(i.thinking={type:`adaptive`,...a.display===void 0?{}:{display:a.display}},i.output_config={...i.output_config??{},effort:e}),i}}function C(e,t){if(!re(e.id,e.name))return t;let n=t,r=S(n.effort??ie(n.reasoning,e),e.id,e.name);return{...t,onPayload:ae(r,n.onPayload)}}function oe(e,t){let n={id:e.id,name:e.name??e.id},r=t?.api??e.api,i=t?.context_window??e.context_window,a=t?.max_tokens??e.max_tokens,o=t?.reasoning??e.reasoning,s=t?.input??e.input;r&&(n.api=r),i!==void 0&&(n.context_window=i),a!==void 0&&(n.max_tokens=a),o!==void 0&&(n.reasoning=o),s&&(n.input=s);let c=t?.cost??e.cost;return c&&(n.cost=c),/haiku/i.test(e.id)&&(n.compat={supportsEagerToolInputStreaming:!1}),/sonnet-5\b/i.test(e.id)&&!n.thinkingLevelMap&&(n.thinkingLevelMap={xhigh:`xhigh`}),n}async function se(e,t,n,r={}){let i=typeof AbortController==`function`?new AbortController:null,a=i?setTimeout(()=>i.abort(),r.timeoutMs??8e3):null;try{let a=await n(`${e.replace(/\/$/,``)}/v1/usage`,{headers:{...r.headers,Authorization:`Bearer ${t}`},...i?{signal:i.signal}:{}});if(a.status===404||a.status===501)return null;if(!a.ok)throw Error(`Adobe /v1/usage returned ${a.status}`);return g(await a.json())}finally{a&&clearTimeout(a)}}const w=Object.assign({"/packages/webapp/providers/adobe-config.json":ne})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function T(){let e=r(`adobe`);if(e)return e.replace(/\/$/,``);if(w.proxyEndpoint)return w.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}const E=new Map,ce=new Map,le=`slicc-adobe-models`;function ue(e){try{localStorage.setItem(le,JSON.stringify(e))}catch{}}async function D(e){try{let t=await fetch(`${e}/v1/config`,{headers:{[W]:`6.238.0`}});return t.ok?await t.json():(console.warn(`[adobe] Proxy /v1/config returned ${t.status}`),null)}catch(e){return console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e)),null}}async function O(e){let t=E.get(e);if(t)return t;let n=await D(e);return n||=(await new Promise(e=>setTimeout(e,600)),await D(e)),n?(E.set(e,n),n):{}}function k(e){let t=e.clientId||w.clientId;if(!t)throw Error(`Could not determine IMS client ID — proxy /v1/config did not return one and adobe-config.json is empty`);return t}function A(e){return e.scopes||w.scopes}function j(e){return e.imsEnvironment||w.imsEnvironment||`prod`}const M={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function N(e){return M[e??w.imsEnvironment??`prod`]??M.prod}async function P(){let e;try{e=T()}catch{return{}}return E.get(e)||new Promise(t=>{let n=setTimeout(()=>t({}),5e3),r=e=>{clearTimeout(n),t(e)};O(e).then(r,()=>r({}))})}function F(e){try{let t=e.split(`.`)[1];if(!t)return;let n=t.replace(/-/g,`+`).replace(/_/g,`/`),r=atob(n+`=`.repeat((4-n.length%4)%4)),i=JSON.parse(r);return typeof i.client_id==`string`?i.client_id:void 0}catch{return}}const I=typeof chrome<`u`&&!!chrome?.runtime?.id;function L(){return n().find(e=>e.providerId===`adobe`)}const de=[`/ims/profile/v1`,`/ims/userinfo/v2`];async function fe(e,t){try{let n=await fetch(e,{headers:{Authorization:`Bearer ${t}`}});if(!n.ok){console.warn(`[adobe] Profile fetch ${e} returned ${n.status}`);return}let r=await n.json(),i=r.displayName||r.name||r.email;return i?{name:i,avatar:r.picture||r.avatar_url}:void 0}catch(t){console.warn(`[adobe] Profile fetch ${e} failed:`,t instanceof Error?t.message:String(t));return}}async function pe(e,t){for(let n of de){let r=await fe(`${N(t)}${n}`,e);if(r)return r}return console.warn(`[adobe] No IMS profile endpoint named the user; account will have no display name`),{}}async function me(){let e=L(),t=e?.accessToken;if(!t)return{status:`unknown`,detail:`no stored token`};let n=await P(),r=F(t)||n.clientId||w.clientId||``;if(!r)return{status:`unknown`,detail:`no IMS client ID available`};let i=N(j(n));try{let n=await fetch(`${i}/ims/validate_token/v1`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:r,token:t,type:`access_token`}),signal:AbortSignal.timeout(1e4)});if(!n.ok)return{status:`unknown`,detail:`HTTP ${n.status}${n.statusText?` ${n.statusText}`:``}`};let a=await n.json();return a.valid===!0?{status:`accepted`,userName:e?.userName}:a.valid===!1?{status:`rejected`,detail:`IMS reported the token invalid (${typeof a.reason==`string`?a.reason:`no reason given`})`}:{status:`unknown`,detail:"IMS answered 200 without a boolean `valid` verdict"}}catch(e){return{status:`unknown`,detail:e instanceof Error?e.message:String(e)}}}function R(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10),scope:n.get(`scope`)??void 0}:null}const z={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!w.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`,`admin.hlx.page`,`admin.hlx.live`,`admin.aem.page`,`admin.aem.live`,`api.aem.live`],getBudgetUsage:ge,getModelIds:()=>{let e=e=>oe(e,ce.get(e.id));for(let t of Q.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id,reasoning:t.reasoning,input:t.input,cost:t.cost}));return ue(n),n}for(let t of E.values())if(t.models?.length)return t.models.map(t=>e(t));try{let e=localStorage.getItem(le);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,n,r)=>{let i=T(),a=await O(i),o=k(a),s=A(a),c=j(a),l=I?null:await te(),u=I?null:b({pageHref:l.href,pageOrigin:l.origin,configuredRedirectUri:w.redirectUri},()=>crypto.randomUUID()),d=I?w.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:u.redirectUri,f=u?.oauthState,p=u?.expectedNonce??null,m=new URLSearchParams({client_id:o,scope:s,response_type:`token`,redirect_uri:d});f&&m.set(`state`,f),r?.forceReauth&&m.set(`prompt`,`login`);let h=await e(`${N(c)}/ims/authorize/v2?${m}`);if(!h)return;if(p&&h)try{if(new URL(h).searchParams.get(`nonce`)!==p){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let g=R(h);if(!g){console.error(`[adobe] Could not extract token from redirect URL`);return}let _=await pe(g.accessToken,c);await t({providerId:`adobe`,accessToken:g.accessToken,tokenExpiresAt:Date.now()+g.expiresIn*1e3,userName:_.name,userAvatar:_.avatar,scopes:g.scope,baseUrl:w.proxyEndpoint?void 0:i}),y(),await $().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),n()},onOAuthLogout:async()=>{let e=L();if(e?.accessToken)try{let t=await P(),n=F(e.accessToken)||t.clientId||w.clientId,r=j(t);if(n){let t=await fetch(`${N(r)}/ims/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({token:e.accessToken,token_type_hint:`access_token`,client_id:n})});t.ok||console.warn(`[adobe] Token revocation returned ${t.status}, token may still be valid server-side`)}}catch(e){console.warn(`[adobe] Failed to revoke token:`,e instanceof Error?e.message:String(e))}await t({providerId:`adobe`,accessToken:``}),y()},onSilentRenew:async()=>L()?.accessToken?U():null,onValidateToken:me,refreshModels:async e=>{await $(e);let t=z.getModelIds?.();t?.length&&ue(t)}};let B=null;const he=ee();async function V(){let e=L();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);let t=await he.run(()=>U());if(t)return t;let n=L();if((n?.tokenExpiresAt??0)-Date.now()>0&&n?.accessToken)return n.accessToken;throw Error(`Adobe session expired — please log in again`)}async function ge(){let e;try{e=T()}catch{return null}let t=L();if(!t?.accessToken||H())throw Error(`Adobe budget: not signed in`);return se(e,t.accessToken,fetch,{headers:{"X-Session-Id":_(xe)}})}function H(){let e=L();return!e?.tokenExpiresAt||Date.now()>e.tokenExpiresAt-6e4}async function U(){if(typeof window>`u`){let e=i();if(!e)return null;try{let{accessToken:t}=await e.call(`silent-renew`,{providerId:`adobe`},{timeoutMs:13e4});return t}catch(e){return console.warn(`[adobe] worker→page silent-renew bridge failed:`,e instanceof Error?e.message:String(e)),null}}return B===null&&(B=be().finally(()=>{B=null})),B}function _e(e,t){let n=k(t),r=A(t),i=j(t),a=I?null:b({pageHref:window.location.href,pageOrigin:window.location.origin,configuredRedirectUri:w.redirectUri},()=>crypto.randomUUID()),o=I?w.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:a.redirectUri,s=a?.oauthState,c=a?.expectedNonce??null,l=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:o,prompt:`none`});return s&&l.set(`state`,s),{authorizeUrl:`${N(i)}/ims/authorize/v2?${l}`,expectedNonce:c,proxyEndpoint:e}}function ve(e,t){if(!t)return!0;try{if(new URL(e).searchParams.get(`nonce`)!==t)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),!1}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}return!0}async function ye(e,n){let r=L();await t({providerId:`adobe`,accessToken:e.accessToken,tokenExpiresAt:Date.now()+e.expiresIn*1e3,userName:r?.userName,userAvatar:r?.userAvatar,scopes:e.scope,baseUrl:w.proxyEndpoint?void 0:n})}async function be(){try{let e=T(),{authorizeUrl:t,expectedNonce:n}=_e(e,await O(e)),{createOAuthLauncher:r}=await import(`./oauth-service-MWzqRq2q.js`),i=await r()(t,{interactive:!1});if(!i||!ve(i,n))return null;let a=R(i);return a?(await ye(a,e),console.log(`[adobe] Token renewed silently`),await $().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),a.accessToken):null}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}}const W=`X-Slicc-Version`;function G(e){let t={};if(e.headers)for(let[n,r]of Object.entries(e.headers))n.toLowerCase()!==`x-slicc-version`&&(t[n]=r);return t[W]=`6.238.0`,{...e,headers:t}}const xe=`adobe-usage-probe`,K=new Set;function q(e,t){if(e.headers){for(let[t,n]of Object.entries(e.headers))if(t.toLowerCase()===`x-session-id`&&n!=null)return e}return K.has(t)||(K.add(t),console.warn(`[adobe] Missing X-Session-Id from ${t} — using daily fallback. Attach an X-Session-Id header at the call site (see scoop-context.ts streamWithSessionId or docs/pitfalls.md).`)),{...e,headers:{...e.headers??{},"X-Session-Id":_(`adobe-provider-fallback`)}}}function Se(){K.clear()}function J(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function Y(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e))}const X=(e,t,n={})=>{let r=a();return Ce(r,e,t,n).catch(Y),r};async function Ce(e,t,n,r){try{let i=await V();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${T()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=u(a,v(n),G(q({...r,apiKey:i},`streamAdobe[openai]`)));for await(let t of o)e.push(t)}else{let a={...t,baseUrl:T(),api:`anthropic-messages`},o=f(a,v(n),G(q(C(t,x(t.id,t.name,{...r,apiKey:i})),`streamAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){Y(n),e.push(J(t,n)),e.end()}}const Z=(e,t,n)=>{let r=a();return we(r,e,t,n).catch(Y),r};async function we(e,t,n,r){try{let i=await V();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${T()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=d(a,v(n),G(q({...r,apiKey:i},`streamSimpleAdobe[openai]`)));for await(let t of o)e.push(t)}else{let a={...t,baseUrl:T(),api:`anthropic-messages`},o=l(a,v(n),G(q(C(t,x(t.id,t.name,{...r,apiKey:i})),`streamSimpleAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){Y(n),e.push(J(t,n)),e.end()}}function Te(e){let t={id:e.id,name:e.name};return e.api!==void 0&&(t.api=e.api),e.context_window!==void 0&&(t.context_window=e.context_window),e.max_tokens!==void 0&&(t.max_tokens=e.max_tokens),e.reasoning!==void 0&&(t.reasoning=e.reasoning),e.input!==void 0&&(t.input=e.input),t}function Ee(){let e=new Map;for(let t of c())try{let n=s(t);for(let t of n)e.set(t.id,t)}catch{}return e}function De(t,n,r){let i=`adobe-${t.api===`openai`?`openai`:`anthropic`}`,a=r.get(t.id);if(a)return{...a,provider:`adobe`,api:i};let o=e(t.id,r);return{id:t.id,name:t.name??t.id,provider:`adobe`,api:i,baseUrl:n,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:o,inputCost:o.input,outputCost:o.output,cacheReadCost:o.cacheRead,cacheWriteCost:o.cacheWrite,reasoning:!0}}function Oe(e,t){for(let t of e)ce.set(t.id,Te(t));let n=Ee();return e.map(e=>De(e,t,n))}async function ke(e){try{let t=e??await V(),n=T(),r=await fetch(`${n}/v1/models`,{headers:{Authorization:`Bearer ${t}`,[W]:`6.238.0`}});if(!r.ok)console.warn(`[adobe] Proxy /v1/models returned ${r.status}, falling back to Anthropic models`);else{let e=await r.json();if(e.data?.length)return Oe(e.data,n)}}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return null}const Q=new Map;function Ae(){return s(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}async function $(e){let t=T(),n=Q.get(t);if(n)return n;let r=await ke(e);return r?(Q.set(t,r),r):Ae()}function je(){o({api:`adobe-anthropic`,stream:X,streamSimple:Z}),o({api:`adobe-openai`,stream:X,streamSimple:Z})}export{Se as __resetAdobeSessionIdWarningCacheForTests,z as config,R as extractTokenFromUrl,$ as getAdobeModels,V as getValidAccessToken,H as isTokenExpired,je as register};
1
+ import{S as e,_ as t,r as n,s as r}from"./account-store-CLw42Fru.js";import{t as i}from"./panel-rpc-accessor-B4BfPLSo.js";import{a}from"./diagnostics-Cag7MsZI.js";import{a as o}from"./compat-nGhSz-U1.js";import{a as s,o as c}from"./core-C1m4D34S.js";import{a as l,r as u,s as d,t as f}from"./legacy-api-aliases--xyLjPgC.js";import{a as p,i as m,r as h}from"./claude-model-version-ceOteQ2f.js";import{r as g}from"./provider-budget-DbHWq3j6.js";import{n as _}from"./llm-session-id-CKpY5F_-.js";import{n as v}from"./pi-transcript-context-4pjVPiVC.js";import{m as y}from"./kernel-worker-CkGJtXT8.js";import{n as b,t as ee}from"./silent-renew-backoff-Dmz3DJHb.js";import{getOAuthPageOrigin as te}from"./oauth-service-MWzqRq2q.js";import{n as x}from"./temperature-support-0nztUM0u.js";import"./provider-settings-BvpuRRhI.js";var ne={proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`};function re(e,t){return h(e,t)}function S(e,t,n){return e!==`xhigh`||!t?e:p(t,n)?`xhigh`:m(t,n)?`max`:`high`}function ie(e,t){let n=e?t?.thinkingLevelMap?.[e]:void 0;return S((()=>{if(typeof n==`string`)return n;switch(e){case`minimal`:case`low`:return`low`;case`medium`:return`medium`;case`xhigh`:return`xhigh`;default:return`high`}})(),t?.id,t?.name)}function ae(e,t){return async(n,r)=>{let i=t?await t(n,r)??n:n,a=i.thinking;return a&&a.type===`enabled`&&(i.thinking={type:`adaptive`,...a.display===void 0?{}:{display:a.display}},i.output_config={...i.output_config??{},effort:e}),i}}function C(e,t){if(!re(e.id,e.name))return t;let n=t,r=S(n.effort??ie(n.reasoning,e),e.id,e.name);return{...t,onPayload:ae(r,n.onPayload)}}function oe(e,t){let n={id:e.id,name:e.name??e.id},r=t?.api??e.api,i=t?.context_window??e.context_window,a=t?.max_tokens??e.max_tokens,o=t?.reasoning??e.reasoning,s=t?.input??e.input;r&&(n.api=r),i!==void 0&&(n.context_window=i),a!==void 0&&(n.max_tokens=a),o!==void 0&&(n.reasoning=o),s&&(n.input=s);let c=t?.cost??e.cost;return c&&(n.cost=c),/haiku/i.test(e.id)&&(n.compat={supportsEagerToolInputStreaming:!1}),/sonnet-5\b/i.test(e.id)&&!n.thinkingLevelMap&&(n.thinkingLevelMap={xhigh:`xhigh`}),n}async function se(e,t,n,r={}){let i=typeof AbortController==`function`?new AbortController:null,a=i?setTimeout(()=>i.abort(),r.timeoutMs??8e3):null;try{let a=await n(`${e.replace(/\/$/,``)}/v1/usage`,{headers:{...r.headers,Authorization:`Bearer ${t}`},...i?{signal:i.signal}:{}});if(a.status===404||a.status===501)return null;if(!a.ok)throw Error(`Adobe /v1/usage returned ${a.status}`);return g(await a.json())}finally{a&&clearTimeout(a)}}const w=Object.assign({"/packages/webapp/providers/adobe-config.json":ne})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function T(){let e=r(`adobe`);if(e)return e.replace(/\/$/,``);if(w.proxyEndpoint)return w.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}const E=new Map,ce=new Map,le=`slicc-adobe-models`;function ue(e){try{localStorage.setItem(le,JSON.stringify(e))}catch{}}async function D(e){try{let t=await fetch(`${e}/v1/config`,{headers:{[W]:`6.238.2`}});return t.ok?await t.json():(console.warn(`[adobe] Proxy /v1/config returned ${t.status}`),null)}catch(e){return console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e)),null}}async function O(e){let t=E.get(e);if(t)return t;let n=await D(e);return n||=(await new Promise(e=>setTimeout(e,600)),await D(e)),n?(E.set(e,n),n):{}}function k(e){let t=e.clientId||w.clientId;if(!t)throw Error(`Could not determine IMS client ID — proxy /v1/config did not return one and adobe-config.json is empty`);return t}function A(e){return e.scopes||w.scopes}function j(e){return e.imsEnvironment||w.imsEnvironment||`prod`}const M={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function N(e){return M[e??w.imsEnvironment??`prod`]??M.prod}async function P(){let e;try{e=T()}catch{return{}}return E.get(e)||new Promise(t=>{let n=setTimeout(()=>t({}),5e3),r=e=>{clearTimeout(n),t(e)};O(e).then(r,()=>r({}))})}function F(e){try{let t=e.split(`.`)[1];if(!t)return;let n=t.replace(/-/g,`+`).replace(/_/g,`/`),r=atob(n+`=`.repeat((4-n.length%4)%4)),i=JSON.parse(r);return typeof i.client_id==`string`?i.client_id:void 0}catch{return}}const I=typeof chrome<`u`&&!!chrome?.runtime?.id;function L(){return n().find(e=>e.providerId===`adobe`)}const de=[`/ims/profile/v1`,`/ims/userinfo/v2`];async function fe(e,t){try{let n=await fetch(e,{headers:{Authorization:`Bearer ${t}`}});if(!n.ok){console.warn(`[adobe] Profile fetch ${e} returned ${n.status}`);return}let r=await n.json(),i=r.displayName||r.name||r.email;return i?{name:i,avatar:r.picture||r.avatar_url}:void 0}catch(t){console.warn(`[adobe] Profile fetch ${e} failed:`,t instanceof Error?t.message:String(t));return}}async function pe(e,t){for(let n of de){let r=await fe(`${N(t)}${n}`,e);if(r)return r}return console.warn(`[adobe] No IMS profile endpoint named the user; account will have no display name`),{}}async function me(){let e=L(),t=e?.accessToken;if(!t)return{status:`unknown`,detail:`no stored token`};let n=await P(),r=F(t)||n.clientId||w.clientId||``;if(!r)return{status:`unknown`,detail:`no IMS client ID available`};let i=N(j(n));try{let n=await fetch(`${i}/ims/validate_token/v1`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({client_id:r,token:t,type:`access_token`}),signal:AbortSignal.timeout(1e4)});if(!n.ok)return{status:`unknown`,detail:`HTTP ${n.status}${n.statusText?` ${n.statusText}`:``}`};let a=await n.json();return a.valid===!0?{status:`accepted`,userName:e?.userName}:a.valid===!1?{status:`rejected`,detail:`IMS reported the token invalid (${typeof a.reason==`string`?a.reason:`no reason given`})`}:{status:`unknown`,detail:"IMS answered 200 without a boolean `valid` verdict"}}catch(e){return{status:`unknown`,detail:e instanceof Error?e.message:String(e)}}}function R(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10),scope:n.get(`scope`)??void 0}:null}const z={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!w.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`,`admin.hlx.page`,`admin.hlx.live`,`admin.aem.page`,`admin.aem.live`,`api.aem.live`],getBudgetUsage:ge,getModelIds:()=>{let e=e=>oe(e,ce.get(e.id));for(let t of Q.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id,reasoning:t.reasoning,input:t.input,cost:t.cost}));return ue(n),n}for(let t of E.values())if(t.models?.length)return t.models.map(t=>e(t));try{let e=localStorage.getItem(le);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,n,r)=>{let i=T(),a=await O(i),o=k(a),s=A(a),c=j(a),l=I?null:await te(),u=I?null:b({pageHref:l.href,pageOrigin:l.origin,configuredRedirectUri:w.redirectUri},()=>crypto.randomUUID()),d=I?w.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:u.redirectUri,f=u?.oauthState,p=u?.expectedNonce??null,m=new URLSearchParams({client_id:o,scope:s,response_type:`token`,redirect_uri:d});f&&m.set(`state`,f),r?.forceReauth&&m.set(`prompt`,`login`);let h=await e(`${N(c)}/ims/authorize/v2?${m}`);if(!h)return;if(p&&h)try{if(new URL(h).searchParams.get(`nonce`)!==p){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let g=R(h);if(!g){console.error(`[adobe] Could not extract token from redirect URL`);return}let _=await pe(g.accessToken,c);await t({providerId:`adobe`,accessToken:g.accessToken,tokenExpiresAt:Date.now()+g.expiresIn*1e3,userName:_.name,userAvatar:_.avatar,scopes:g.scope,baseUrl:w.proxyEndpoint?void 0:i}),y(),await $().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),n()},onOAuthLogout:async()=>{let e=L();if(e?.accessToken)try{let t=await P(),n=F(e.accessToken)||t.clientId||w.clientId,r=j(t);if(n){let t=await fetch(`${N(r)}/ims/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({token:e.accessToken,token_type_hint:`access_token`,client_id:n})});t.ok||console.warn(`[adobe] Token revocation returned ${t.status}, token may still be valid server-side`)}}catch(e){console.warn(`[adobe] Failed to revoke token:`,e instanceof Error?e.message:String(e))}await t({providerId:`adobe`,accessToken:``}),y()},onSilentRenew:async()=>L()?.accessToken?U():null,onValidateToken:me,refreshModels:async e=>{await $(e);let t=z.getModelIds?.();t?.length&&ue(t)}};let B=null;const he=ee();async function V(){let e=L();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);let t=await he.run(()=>U());if(t)return t;let n=L();if((n?.tokenExpiresAt??0)-Date.now()>0&&n?.accessToken)return n.accessToken;throw Error(`Adobe session expired — please log in again`)}async function ge(){let e;try{e=T()}catch{return null}let t=L();if(!t?.accessToken||H())throw Error(`Adobe budget: not signed in`);return se(e,t.accessToken,fetch,{headers:{"X-Session-Id":_(xe)}})}function H(){let e=L();return!e?.tokenExpiresAt||Date.now()>e.tokenExpiresAt-6e4}async function U(){if(typeof window>`u`){let e=i();if(!e)return null;try{let{accessToken:t}=await e.call(`silent-renew`,{providerId:`adobe`},{timeoutMs:13e4});return t}catch(e){return console.warn(`[adobe] worker→page silent-renew bridge failed:`,e instanceof Error?e.message:String(e)),null}}return B===null&&(B=be().finally(()=>{B=null})),B}function _e(e,t){let n=k(t),r=A(t),i=j(t),a=I?null:b({pageHref:window.location.href,pageOrigin:window.location.origin,configuredRedirectUri:w.redirectUri},()=>crypto.randomUUID()),o=I?w.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:a.redirectUri,s=a?.oauthState,c=a?.expectedNonce??null,l=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:o,prompt:`none`});return s&&l.set(`state`,s),{authorizeUrl:`${N(i)}/ims/authorize/v2?${l}`,expectedNonce:c,proxyEndpoint:e}}function ve(e,t){if(!t)return!0;try{if(new URL(e).searchParams.get(`nonce`)!==t)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),!1}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}return!0}async function ye(e,n){let r=L();await t({providerId:`adobe`,accessToken:e.accessToken,tokenExpiresAt:Date.now()+e.expiresIn*1e3,userName:r?.userName,userAvatar:r?.userAvatar,scopes:e.scope,baseUrl:w.proxyEndpoint?void 0:n})}async function be(){try{let e=T(),{authorizeUrl:t,expectedNonce:n}=_e(e,await O(e)),{createOAuthLauncher:r}=await import(`./oauth-service-MWzqRq2q.js`),i=await r()(t,{interactive:!1});if(!i||!ve(i,n))return null;let a=R(i);return a?(await ye(a,e),console.log(`[adobe] Token renewed silently`),await $().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),a.accessToken):null}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}}const W=`X-Slicc-Version`;function G(e){let t={};if(e.headers)for(let[n,r]of Object.entries(e.headers))n.toLowerCase()!==`x-slicc-version`&&(t[n]=r);return t[W]=`6.238.2`,{...e,headers:t}}const xe=`adobe-usage-probe`,K=new Set;function q(e,t){if(e.headers){for(let[t,n]of Object.entries(e.headers))if(t.toLowerCase()===`x-session-id`&&n!=null)return e}return K.has(t)||(K.add(t),console.warn(`[adobe] Missing X-Session-Id from ${t} — using daily fallback. Attach an X-Session-Id header at the call site (see scoop-context.ts streamWithSessionId or docs/pitfalls.md).`)),{...e,headers:{...e.headers??{},"X-Session-Id":_(`adobe-provider-fallback`)}}}function Se(){K.clear()}function J(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function Y(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e))}const X=(e,t,n={})=>{let r=a();return Ce(r,e,t,n).catch(Y),r};async function Ce(e,t,n,r){try{let i=await V();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${T()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=u(a,v(n),G(q({...r,apiKey:i},`streamAdobe[openai]`)));for await(let t of o)e.push(t)}else{let a={...t,baseUrl:T(),api:`anthropic-messages`},o=f(a,v(n),G(q(C(t,x(t.id,t.name,{...r,apiKey:i})),`streamAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){Y(n),e.push(J(t,n)),e.end()}}const Z=(e,t,n)=>{let r=a();return we(r,e,t,n).catch(Y),r};async function we(e,t,n,r){try{let i=await V();if(String(t.api).includes(`openai`)){let a={...t,baseUrl:`${T()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},o=d(a,v(n),G(q({...r,apiKey:i},`streamSimpleAdobe[openai]`)));for await(let t of o)e.push(t)}else{let a={...t,baseUrl:T(),api:`anthropic-messages`},o=l(a,v(n),G(q(C(t,x(t.id,t.name,{...r,apiKey:i})),`streamSimpleAdobe[anthropic]`)));for await(let t of o)e.push(t)}e.end()}catch(n){Y(n),e.push(J(t,n)),e.end()}}function Te(e){let t={id:e.id,name:e.name};return e.api!==void 0&&(t.api=e.api),e.context_window!==void 0&&(t.context_window=e.context_window),e.max_tokens!==void 0&&(t.max_tokens=e.max_tokens),e.reasoning!==void 0&&(t.reasoning=e.reasoning),e.input!==void 0&&(t.input=e.input),t}function Ee(){let e=new Map;for(let t of c())try{let n=s(t);for(let t of n)e.set(t.id,t)}catch{}return e}function De(t,n,r){let i=`adobe-${t.api===`openai`?`openai`:`anthropic`}`,a=r.get(t.id);if(a)return{...a,provider:`adobe`,api:i};let o=e(t.id,r);return{id:t.id,name:t.name??t.id,provider:`adobe`,api:i,baseUrl:n,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:o,inputCost:o.input,outputCost:o.output,cacheReadCost:o.cacheRead,cacheWriteCost:o.cacheWrite,reasoning:!0}}function Oe(e,t){for(let t of e)ce.set(t.id,Te(t));let n=Ee();return e.map(e=>De(e,t,n))}async function ke(e){try{let t=e??await V(),n=T(),r=await fetch(`${n}/v1/models`,{headers:{Authorization:`Bearer ${t}`,[W]:`6.238.2`}});if(!r.ok)console.warn(`[adobe] Proxy /v1/models returned ${r.status}, falling back to Anthropic models`);else{let e=await r.json();if(e.data?.length)return Oe(e.data,n)}}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return null}const Q=new Map;function Ae(){return s(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}async function $(e){let t=T(),n=Q.get(t);if(n)return n;let r=await ke(e);return r?(Q.set(t,r),r):Ae()}function je(){o({api:`adobe-anthropic`,stream:X,streamSimple:Z}),o({api:`adobe-openai`,stream:X,streamSimple:Z})}export{Se as __resetAdobeSessionIdWarningCacheForTests,z as config,R as extractTokenFromUrl,$ as getAdobeModels,V as getValidAccessToken,H as isTokenExpired,je as register};
@@ -1 +1 @@
1
- import{t as e}from"./logger-DDBAeTLF.js";import{J as t}from"./wc-shell-BLBm7Ua3.js";var n=e(`agent-panels`),r=`/workspace/panels`,i=`panel.json`;function a(e,t){if(!e||typeof e!=`object`)return n.warn(`panel manifest is not an object`,{dir:t}),null;let r=e;return typeof r.id!=`string`||r.id.trim()===``?(n.warn(`panel manifest needs a non-empty id`,{dir:t}),null):typeof r.title!=`string`||r.title.trim()===``?(n.warn(`panel manifest needs a non-empty title`,{dir:t,id:r.id}),null):{id:r.id,title:r.title,icon:typeof r.icon==`string`?r.icon:void 0,minWidth:typeof r.minWidth==`number`?r.minWidth:void 0,minHeight:typeof r.minHeight==`number`?r.minHeight:void 0,preferredSize:typeof r.preferredSize==`string`||typeof r.preferredSize==`number`?r.preferredSize:void 0,presentation:r.presentation===`floating`?`floating`:void 0,anchor:r.anchor,realm:r.realm===`main`?`main`:`sandboxed`}}async function o(e){let t=[];try{if(!await e.exists(`/workspace/panels`))return t;let o=await e.readDir(r);for(let s of o){if(s.type!==`directory`)continue;let o=`${r}/${s.name}`,c=`${o}/${i}`;if(!await e.exists(c))continue;let l;try{let t=await e.readFile(c);l=JSON.parse(typeof t==`string`?t:String(t))}catch(e){n.warn(`unreadable panel manifest`,{manifestPath:c,error:e});continue}let u=a(l,o);if(!u)continue;let d=l.entry,f=typeof d==`string`&&d.length>0?`${o}/${d}`:null;t.push({meta:u,dir:o,entry:f})}}catch(e){n.warn(`agent panel discovery failed`,{error:e})}return t}async function s(e){let r=await o(e);for(let e of r)t({meta:e.meta,source:{kind:`sandboxed`,entry:e.entry??`${e.dir}/panel.shtml`},origin:`agent`});return r.length>0&&n.info(`registered agent panels`,{count:r.length}),r}export{s as registerAgentPanels};
1
+ import{t as e}from"./logger-DDBAeTLF.js";import{J as t}from"./wc-shell-Cx3tnmkh.js";var n=e(`agent-panels`),r=`/workspace/panels`,i=`panel.json`;function a(e,t){if(!e||typeof e!=`object`)return n.warn(`panel manifest is not an object`,{dir:t}),null;let r=e;return typeof r.id!=`string`||r.id.trim()===``?(n.warn(`panel manifest needs a non-empty id`,{dir:t}),null):typeof r.title!=`string`||r.title.trim()===``?(n.warn(`panel manifest needs a non-empty title`,{dir:t,id:r.id}),null):{id:r.id,title:r.title,icon:typeof r.icon==`string`?r.icon:void 0,minWidth:typeof r.minWidth==`number`?r.minWidth:void 0,minHeight:typeof r.minHeight==`number`?r.minHeight:void 0,preferredSize:typeof r.preferredSize==`string`||typeof r.preferredSize==`number`?r.preferredSize:void 0,presentation:r.presentation===`floating`?`floating`:void 0,anchor:r.anchor,realm:r.realm===`main`?`main`:`sandboxed`}}async function o(e){let t=[];try{if(!await e.exists(`/workspace/panels`))return t;let o=await e.readDir(r);for(let s of o){if(s.type!==`directory`)continue;let o=`${r}/${s.name}`,c=`${o}/${i}`;if(!await e.exists(c))continue;let l;try{let t=await e.readFile(c);l=JSON.parse(typeof t==`string`?t:String(t))}catch(e){n.warn(`unreadable panel manifest`,{manifestPath:c,error:e});continue}let u=a(l,o);if(!u)continue;let d=l.entry,f=typeof d==`string`&&d.length>0?`${o}/${d}`:null;t.push({meta:u,dir:o,entry:f})}}catch(e){n.warn(`agent panel discovery failed`,{error:e})}return t}async function s(e){let r=await o(e);for(let e of r)t({meta:e.meta,source:{kind:`sandboxed`,entry:e.entry??`${e.dir}/panel.shtml`},origin:`agent`});return r.length>0&&n.info(`registered agent panels`,{count:r.length}),r}export{s as registerAgentPanels};