sliccy 4.23.0 → 4.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node-server/bridge-security.d.ts +56 -2
- package/dist/node-server/bridge-security.js +186 -9
- package/dist/node-server/fetch-proxy-headers.d.ts +8 -2
- package/dist/node-server/fetch-proxy-headers.js +9 -2
- package/dist/node-server/index.js +153 -45
- package/dist/node-server/routes/fetch-proxy.d.ts +8 -0
- package/dist/node-server/routes/fetch-proxy.js +6 -1
- package/dist/ui/assets/{account-store-9y5Ab4vV.js → account-store-CCx84KSO.js} +2 -2
- package/dist/ui/assets/{account-store-CSLAx3pa.js → account-store-D6F5ht1K.js} +2 -2
- package/dist/ui/assets/adobe-B_gJbGrM.js +1 -0
- package/dist/ui/assets/adobe-D8jV1ibX.js +2 -0
- package/dist/ui/assets/{agent-message-to-chat-bEHX4iF4.js → agent-message-to-chat-Dt9iSVuQ.js} +1 -1
- package/dist/ui/assets/{apps-Dh-H9LYE.js → apps-CyKH98UU.js} +1 -1
- package/dist/ui/assets/{azure-openai-BpIYfrM-.js → azure-openai-CTCrw8ag.js} +1 -1
- package/dist/ui/assets/{azure-openai-C4YFzA3o.js → azure-openai-DHxbdJP2.js} +1 -1
- package/dist/ui/assets/{bsh-watchdog-CNmrTRAy.js → bsh-watchdog-DRf6YtLF.js} +1 -1
- package/dist/ui/assets/{cdp-BGgdiko1.js → cdp-D4JkCTey.js} +2 -2
- package/dist/ui/assets/{connect-surface-DTsPWNDo.js → connect-surface-BAkLQjYg.js} +1 -1
- package/dist/ui/assets/dip-CoQDOdRF.js +1 -0
- package/dist/ui/assets/{dist-CjQIX13Y.js → dist-DstXLyS2.js} +1 -1
- package/dist/ui/assets/{dist-B5wGuNlW.js → dist-Gjxc3CGe.js} +1 -1
- package/dist/ui/assets/{es-t4MB1uY0.js → es-BtePr83c.js} +1 -1
- package/dist/ui/assets/{fs-ry06ziaM.js → fs-CES5lb4o.js} +1 -1
- package/dist/ui/assets/{fs-BlhR8i_q.js → fs-D3A8iUb-.js} +2 -2
- package/dist/ui/assets/{github-Cr1bhcIq.js → github-BD9mji3m.js} +1 -1
- package/dist/ui/assets/{github-6R3ONWs4.js → github-BjJwZAID.js} +2 -2
- package/dist/ui/assets/{github-copilot-_vAY24oI.js → github-copilot-O5-ryiZR.js} +1 -1
- package/dist/ui/assets/{github-copilot-CPpSIAl_.js → github-copilot-yWe1M0K_.js} +1 -1
- package/dist/ui/assets/{hear-DLqP08Yk.js → hear-CFjk8o5A.js} +1 -1
- package/dist/ui/assets/{kernel-worker-ReGrzvdD.js → kernel-worker-DS4Sjo4b.js} +1029 -1029
- package/dist/ui/assets/{kokoro-engine-BeiKy8PB.js → kokoro-engine-TLc0ityO.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-DZy9C70j.js → lick-ws-bridge-Fa3rBD7K.js} +1 -1
- package/dist/ui/assets/{local-llm-ehhQ9AeC.js → local-llm-77SlLHlX.js} +1 -1
- package/dist/ui/assets/main-RvuAuHo8.js +24 -0
- package/dist/ui/assets/{main-cherry-X1IxoqNY.js → main-cherry-B1mI8ArD.js} +1 -1
- package/dist/ui/assets/{mount-Crd-I-lS.js → mount-B3baMU-O.js} +1 -1
- package/dist/ui/assets/{mount-Cf2e3Vu8.js → mount-Dwoznret.js} +2 -2
- package/dist/ui/assets/{new-session-PJxD5xz-.js → new-session-BnW6Ia6h.js} +2 -2
- package/dist/ui/assets/{oauth-bootstrap-38UC9ABk.js → oauth-bootstrap-D4jfK89n.js} +2 -2
- package/dist/ui/assets/oauth-service-CoJ-pYVD.js +1 -0
- package/dist/ui/assets/oauth-service-hTyvduF1.js +1 -0
- package/dist/ui/assets/{openai-codex-CcWEg2Id.js → openai-codex-BG86bd3g.js} +1 -1
- package/dist/ui/assets/{openai-codex-4vY4IfjZ.js → openai-codex-W1k-olNJ.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-CyLUoTYQ.js → panel-rpc-handlers-BAwdZnUG.js} +1 -1
- package/dist/ui/assets/{provider-BRZxUH2o.js → provider-Ba8_qOfx.js} +1 -1
- package/dist/ui/assets/{provider-BGI7Ytuv.js → provider-fDZ2ppW0.js} +2 -2
- package/dist/ui/assets/provider-store-access-BVVboGQW.js +1 -0
- package/dist/ui/assets/provider-store-access-DLLL3FmZ.js +1 -0
- package/dist/ui/assets/{providers-CcDiXx1v.js → providers-DteOckdy.js} +1 -1
- package/dist/ui/assets/proxied-fetch-BBO8HwcV.js +1 -0
- package/dist/ui/assets/{quick-llm-CpcpayIL.js → quick-llm-BRbz1fDI.js} +1 -1
- package/dist/ui/assets/{remote-terminal-view-FVcjc7kw.js → remote-terminal-view-CSqiig2G.js} +1 -1
- package/dist/ui/assets/session-freezer-tVkiu4V5.js +1 -0
- package/dist/ui/assets/{setup-sprinkle-exec-BGXT8k4k.js → setup-sprinkle-exec-C7SBZY7y.js} +1 -1
- package/dist/ui/assets/setup-sudo-DWfiGlOf.js +1 -0
- package/dist/ui/assets/{speak-gvgsbAbr.js → speak-DhkLZ-am.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-am-b2nZK.js → sprinkle-manager-BLhwuVdT.js} +1 -1
- package/dist/ui/assets/{store-2Y1B359N.js → store-T-K8TeFw.js} +1 -1
- package/dist/ui/assets/{sudo-CXuD9JQi.js → sudo-qsDyNaAG.js} +1 -1
- package/dist/ui/assets/terminal-session-client-CbAduNfC.js +1 -0
- package/dist/ui/assets/{transformers-env-RCjmw9ix.js → transformers-env-DSAN95G3.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-EjSnz0hB.js → tray-leave-runtime-tqIb9yl_.js} +1 -1
- package/dist/ui/assets/upgrade-detection-pjQXVRWP.js +1 -0
- package/dist/ui/assets/{wc-attach-BbBcc9d7.js → wc-attach-DwcZ5MaG.js} +2 -2
- package/dist/ui/assets/{wc-detached-BsGgVyQ2.js → wc-detached-BvZo_AId.js} +1 -1
- package/dist/ui/assets/{wc-extension-pjc1MPFN.js → wc-extension-CtHl8VdG.js} +2 -2
- package/dist/ui/assets/wc-live-BHTqp_8F.js +253 -0
- package/dist/ui/assets/{wc-nav-D1GUd0Mt.js → wc-nav-BJuQ2irW.js} +2 -2
- package/dist/ui/assets/wc-onboarding-84S404WJ.js +2 -0
- package/dist/ui/assets/{wc-placeholder-CEMVuHe3.js → wc-placeholder-DXEcgvyw.js} +3 -3
- package/dist/ui/assets/wc-settings-DWuDKTDp.js +24 -0
- package/dist/ui/assets/{wc-shell-tnKegXuB.js → wc-shell-B_z0VSKk.js} +3 -3
- package/dist/ui/assets/{wc-sprinkles-DEgP8Ihj.js → wc-sprinkles-BsYJVGg_.js} +2 -2
- package/dist/ui/assets/{wc-tray-BsL3c-FP.js → wc-tray-CWJphCmt.js} +3 -3
- package/dist/ui/assets/{xai-grok-BK-WZwtZ.js → xai-grok-D7ULF1Ef.js} +1 -1
- package/dist/ui/assets/{xai-grok-CqrCTXgB.js → xai-grok-DQ32cJt0.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/ui/llm-proxy-sw.js +1 -1
- package/dist/ui/packages/webapp/index.html +2 -2
- package/package.json +1 -1
- package/dist/ui/assets/adobe-Ba8U6Soe.js +0 -2
- package/dist/ui/assets/adobe-BtvdR5I0.js +0 -1
- package/dist/ui/assets/dip-Fvfzs0-q.js +0 -1
- package/dist/ui/assets/main-zx9b4e1t.js +0 -24
- package/dist/ui/assets/oauth-service-CTlktxVj.js +0 -1
- package/dist/ui/assets/oauth-service-DQVciyk_.js +0 -1
- package/dist/ui/assets/provider-store-access-BiJN5bAM.js +0 -1
- package/dist/ui/assets/provider-store-access-Dp0MGqAc.js +0 -1
- package/dist/ui/assets/proxied-fetch-Dg114MVx.js +0 -1
- package/dist/ui/assets/proxy-error-9UvXMpzG.js +0 -1
- package/dist/ui/assets/session-freezer-DQ--9MwT.js +0 -1
- package/dist/ui/assets/setup-sudo-I4S39zW5.js +0 -1
- package/dist/ui/assets/terminal-session-client-C_tYJ1IB.js +0 -1
- package/dist/ui/assets/upgrade-detection-CHScEQnq.js +0 -1
- package/dist/ui/assets/wc-live-BAWrPhr9.js +0 -253
- package/dist/ui/assets/wc-onboarding-Bt02HM9-.js +0 -2
- package/dist/ui/assets/wc-settings-DP3TVlWk.js +0 -24
|
@@ -10,7 +10,7 @@ import { homedir } from 'os';
|
|
|
10
10
|
import { basename, dirname, join, resolve } from 'path';
|
|
11
11
|
import { fileURLToPath } from 'url';
|
|
12
12
|
import { WebSocket, WebSocketServer } from 'ws';
|
|
13
|
-
import { buildCorsHeaders, buildPnaPreflightHeaders, mintBridgeToken, selectBridgeSubprotocol, validateBridgeUpgrade, } from './bridge-security.js';
|
|
13
|
+
import { BRIDGE_TOKEN_HEADER, buildCorsHeaders, buildPnaPreflightHeaders, isLoopbackBridgeOrigin, mintBridgeToken, selectBridgeSubprotocol, validateBridgeToken, validateBridgeUpgrade, } from './bridge-security.js';
|
|
14
14
|
import { applyCdpUnmask } from './cdp-proxy/cdp-unmask.js';
|
|
15
15
|
import { createCdpSessionUrlTracker } from './cdp-proxy/session-url-tracker.js';
|
|
16
16
|
import { buildChromeLaunchArgs, clearStaleDevToolsActivePort, ensureQaProfileScaffold, findChromeExecutable, legacyChromeCandidates, migrateLegacyDefaultChromeProfile, planChromeSpawn, resolveChromeLaunchProfile, waitForCdpPort, } from './chrome-launch.js';
|
|
@@ -813,6 +813,27 @@ function forwardClientFrame(state, data, ctx) {
|
|
|
813
813
|
console.log(`[cdp-proxy] Client→Chrome (DROPPED — no connection): ${preview}`);
|
|
814
814
|
}
|
|
815
815
|
}
|
|
816
|
+
/**
|
|
817
|
+
* Wait for `state.cdpPort` to be populated (i.e. `launchChromeTarget`'s
|
|
818
|
+
* `waitForCdpPort` has resolved). Used by clients that race ahead of the
|
|
819
|
+
* browser launch — primarily the thin-bridge case where `server.listen()`
|
|
820
|
+
* runs BEFORE `launchBrowser` so the hosted leader can connect to /cdp
|
|
821
|
+
* the moment Chrome opens it, even before Chrome's own CDP port is known.
|
|
822
|
+
*/
|
|
823
|
+
async function waitForServerCdpPort(state, timeoutMs = 30_000) {
|
|
824
|
+
if (state.cdpPort > 0)
|
|
825
|
+
return state.cdpPort;
|
|
826
|
+
const startedAt = Date.now();
|
|
827
|
+
while (state.cdpPort === 0 && Date.now() - startedAt < timeoutMs) {
|
|
828
|
+
if (state.shuttingDown)
|
|
829
|
+
throw new Error('Server shutting down');
|
|
830
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
831
|
+
}
|
|
832
|
+
if (state.cdpPort === 0) {
|
|
833
|
+
throw new Error('Chrome CDP port did not become available in time');
|
|
834
|
+
}
|
|
835
|
+
return state.cdpPort;
|
|
836
|
+
}
|
|
816
837
|
async function handleCdpClient(state, clientWs, ctx, cdpPort) {
|
|
817
838
|
try {
|
|
818
839
|
// Only one client active at a time — close the previous one.
|
|
@@ -843,7 +864,8 @@ async function handleCdpClient(state, clientWs, ctx, cdpPort) {
|
|
|
843
864
|
});
|
|
844
865
|
// NOW do async work — messages arriving during these awaits are buffered.
|
|
845
866
|
if (!state.cdpUrl) {
|
|
846
|
-
|
|
867
|
+
const port = cdpPort && cdpPort > 0 ? cdpPort : await waitForServerCdpPort(state);
|
|
868
|
+
state.cdpUrl = await waitForCDP(port);
|
|
847
869
|
console.log(`[cdp-proxy] CDP available at: ${state.cdpUrl}`);
|
|
848
870
|
}
|
|
849
871
|
await ensureChromeConnection(state, state.cdpUrl, ctx);
|
|
@@ -911,13 +933,16 @@ function createGracefulShutdown(state, deps) {
|
|
|
911
933
|
deps.wss.close();
|
|
912
934
|
// Stop accepting new HTTP connections.
|
|
913
935
|
deps.server.close();
|
|
914
|
-
|
|
936
|
+
// Read cdpPort from state — populated by `launchChromeTarget`; may be 0
|
|
937
|
+
// if shutdown fires before the browser ever launched.
|
|
938
|
+
await closeLaunchedBrowserGracefully(state, state.cdpPort);
|
|
915
939
|
process.exit(0);
|
|
916
940
|
};
|
|
917
941
|
}
|
|
918
942
|
/** Pre-connect to Chrome so the proxy is warm before the first client; hosted mode registers leader-restart once CDP is ready. */
|
|
919
|
-
async function preconnectCdp(state, ctx, app, servePort
|
|
943
|
+
async function preconnectCdp(state, ctx, app, servePort) {
|
|
920
944
|
try {
|
|
945
|
+
const cdpPort = state.cdpPort > 0 ? state.cdpPort : await waitForServerCdpPort(state);
|
|
921
946
|
state.cdpUrl = await waitForCDP(cdpPort);
|
|
922
947
|
console.log(`[cdp-proxy] Pre-connected: CDP available at ${state.cdpUrl}`);
|
|
923
948
|
await ensureChromeConnection(state, state.cdpUrl, ctx);
|
|
@@ -950,37 +975,61 @@ async function startOverlayInjector(state, cdpPort, servePort) {
|
|
|
950
975
|
console.error('[electron-float] Failed to start overlay injector:', message);
|
|
951
976
|
}
|
|
952
977
|
}
|
|
953
|
-
/**
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
978
|
+
/**
|
|
979
|
+
* Bind the HTTP server (and the /cdp WS upgrade handler attached to it) so
|
|
980
|
+
* incoming `ws://localhost/cdp` connections are accepted. Resolves when
|
|
981
|
+
* `server.listen` fires its 'listening' callback.
|
|
982
|
+
*
|
|
983
|
+
* Split out of the old `startCdpServer` so `main()` can `await` listening
|
|
984
|
+
* BEFORE `launchBrowser(state)` runs — without this ordering the hosted
|
|
985
|
+
* leader's eager `browser.connect()` (fired the moment Chrome opens
|
|
986
|
+
* sliccy.ai in thin-bridge mode) can race ahead of the bridge and fail
|
|
987
|
+
* its one-shot WebSocket handshake.
|
|
988
|
+
*/
|
|
989
|
+
function startListening(deps) {
|
|
990
|
+
const { server, fileLogger, servePort, serveOrigin, cdpPort } = deps;
|
|
991
|
+
return new Promise((resolve) => {
|
|
992
|
+
server.listen(servePort, '127.0.0.1', () => {
|
|
993
|
+
if (THIN_BRIDGE_MODE) {
|
|
994
|
+
console.log(`Thin /cdp bridge + /api at ${serveOrigin}`);
|
|
995
|
+
}
|
|
996
|
+
else {
|
|
997
|
+
console.log(`Serving UI at ${serveOrigin}`);
|
|
998
|
+
}
|
|
999
|
+
console.log(`CDP proxy at ws://localhost:${servePort}/cdp`);
|
|
1000
|
+
fileLogger.log('info', 'CLI server started', {
|
|
1001
|
+
port: servePort,
|
|
1002
|
+
cdpPort,
|
|
1003
|
+
devMode: DEV_MODE,
|
|
1004
|
+
electronMode: ELECTRON_MODE,
|
|
1005
|
+
});
|
|
1006
|
+
resolve();
|
|
969
1007
|
});
|
|
970
|
-
void preconnectCdp(state, ctx, app, servePort, cdpPort);
|
|
971
|
-
if (ELECTRON_MODE) {
|
|
972
|
-
void startOverlayInjector(state, cdpPort, servePort);
|
|
973
|
-
}
|
|
974
|
-
else if (!THIN_BRIDGE_MODE) {
|
|
975
|
-
// Thin-bridge mode has no local UI page to forward console output from.
|
|
976
|
-
setTimeout(() => {
|
|
977
|
-
attachConsoleForwarder(cdpPort, String(servePort)).catch((err) => {
|
|
978
|
-
console.error('[page] Console forwarder error:', err);
|
|
979
|
-
});
|
|
980
|
-
}, 2500);
|
|
981
|
-
}
|
|
982
1008
|
});
|
|
983
1009
|
}
|
|
1010
|
+
/**
|
|
1011
|
+
* Post-listen warmup: pre-connects to Chrome's CDP (so the proxy is warm
|
|
1012
|
+
* before the first client), starts the Electron overlay injector, and
|
|
1013
|
+
* attaches the console forwarder. Reads `state.cdpPort` dynamically so
|
|
1014
|
+
* the value populated by `launchChromeTarget` is used regardless of when
|
|
1015
|
+
* this runs relative to the listen callback.
|
|
1016
|
+
*/
|
|
1017
|
+
function runCdpProxyWarmup(state, deps) {
|
|
1018
|
+
const { app, ctx, servePort } = deps;
|
|
1019
|
+
void preconnectCdp(state, ctx, app, servePort);
|
|
1020
|
+
if (ELECTRON_MODE) {
|
|
1021
|
+
void startOverlayInjector(state, state.cdpPort, servePort);
|
|
1022
|
+
}
|
|
1023
|
+
else if (!THIN_BRIDGE_MODE) {
|
|
1024
|
+
// Thin-bridge mode has no local UI page to forward console output from.
|
|
1025
|
+
const cdpPort = state.cdpPort;
|
|
1026
|
+
setTimeout(() => {
|
|
1027
|
+
attachConsoleForwarder(cdpPort, String(servePort)).catch((err) => {
|
|
1028
|
+
console.error('[page] Console forwarder error:', err);
|
|
1029
|
+
});
|
|
1030
|
+
}, 2500);
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
984
1033
|
/**
|
|
985
1034
|
* Build the secret stores + masking pipeline shared by the fetch-proxy, the
|
|
986
1035
|
* /api/secrets routes, and the S3 sign-and-forward handler. Secret-load
|
|
@@ -1014,10 +1063,25 @@ async function bootstrapSecrets() {
|
|
|
1014
1063
|
* OPTIONS from an allowlisted origin short-circuits to 204 with the PNA
|
|
1015
1064
|
* opt-in. Non-allowlisted origins fall through with no CORS headers, which
|
|
1016
1065
|
* preserves same-origin (localhost) behavior unchanged.
|
|
1066
|
+
*
|
|
1067
|
+
* Additionally enforces the per-process bridge token on cross-origin
|
|
1068
|
+
* `/api/*` requests from REMOTE allowlisted origins (sliccy.ai) — the
|
|
1069
|
+
* origin allowlist alone is insufficient because any script on
|
|
1070
|
+
* `https://www.sliccy.ai` could otherwise reach the local node-server's
|
|
1071
|
+
* /api surface (secrets, fetch-proxy, etc.). Loopback allowlisted
|
|
1072
|
+
* origins (e.g. the locally-served OAuth callback at
|
|
1073
|
+
* `http://localhost:5710/auth/callback` POSTing to `/api/oauth-result`)
|
|
1074
|
+
* are exempt — they originate from this same server. OPTIONS preflights
|
|
1075
|
+
* are exempt because browsers strip custom headers from preflights.
|
|
1017
1076
|
*/
|
|
1018
|
-
function createThinBridgeCorsMiddleware() {
|
|
1077
|
+
function createThinBridgeCorsMiddleware(bridgeToken) {
|
|
1019
1078
|
return (req, res, next) => {
|
|
1020
|
-
|
|
1079
|
+
// Reflect the requested headers so the agent's `bash curl -H …` (which
|
|
1080
|
+
// can carry arbitrary upstream headers through /api/fetch-proxy) is not
|
|
1081
|
+
// blocked by a hardcoded allowlist. Cross-origin preflights advertise
|
|
1082
|
+
// those headers via `Access-Control-Request-Headers`.
|
|
1083
|
+
const origin = req.headers.origin;
|
|
1084
|
+
const cors = buildCorsHeaders(origin, req.headers['access-control-request-headers']);
|
|
1021
1085
|
if (cors) {
|
|
1022
1086
|
for (const [k, v] of Object.entries(cors))
|
|
1023
1087
|
res.setHeader(k, v);
|
|
@@ -1029,6 +1093,17 @@ function createThinBridgeCorsMiddleware() {
|
|
|
1029
1093
|
res.status(204).end();
|
|
1030
1094
|
return;
|
|
1031
1095
|
}
|
|
1096
|
+
// Token gate on /api/* from remote allowlisted origins. `cors` is only
|
|
1097
|
+
// truthy when the Origin is in the allowlist; loopback callers
|
|
1098
|
+
// (localhost/127.0.0.1) and no-Origin curl-style callers fall through
|
|
1099
|
+
// unchanged.
|
|
1100
|
+
if (cors &&
|
|
1101
|
+
req.path.startsWith('/api/') &&
|
|
1102
|
+
!isLoopbackBridgeOrigin(origin) &&
|
|
1103
|
+
!validateBridgeToken(req.headers[BRIDGE_TOKEN_HEADER.toLowerCase()], bridgeToken)) {
|
|
1104
|
+
res.status(403).json({ error: 'bridge-token-required' });
|
|
1105
|
+
return;
|
|
1106
|
+
}
|
|
1032
1107
|
next();
|
|
1033
1108
|
};
|
|
1034
1109
|
}
|
|
@@ -1052,13 +1127,18 @@ function createCdpWebSocketServer(bridgeToken) {
|
|
|
1052
1127
|
});
|
|
1053
1128
|
}
|
|
1054
1129
|
async function main() {
|
|
1055
|
-
// Resolve ports
|
|
1056
|
-
//
|
|
1130
|
+
// Resolve ports first; `launchBrowser` is deferred until AFTER
|
|
1131
|
+
// `server.listen()` so the /cdp bridge is accepting connections before
|
|
1132
|
+
// Chrome opens its target URL (the packaged-CLI thin-bridge mode opens
|
|
1133
|
+
// the hosted leader at sliccy.ai, whose eager `browser.connect()`
|
|
1134
|
+
// otherwise races ahead of the bridge listener and fails its one-shot
|
|
1135
|
+
// WebSocket handshake). `state.cdpPort` becomes valid inside
|
|
1136
|
+
// `launchChromeTarget` once Chrome announces its CDP port; consumers
|
|
1137
|
+
// that need it (`handleCdpClient`, `preconnectCdp`, the graceful-
|
|
1138
|
+
// shutdown handler) read it dynamically from `state`.
|
|
1057
1139
|
const state = createServerState();
|
|
1058
1140
|
await resolvePorts(state);
|
|
1059
|
-
|
|
1060
|
-
const { servePort: SERVE_PORT, cdpPort: CDP_PORT, serveOrigin: SERVE_ORIGIN } = state;
|
|
1061
|
-
const discoveredTrayJoinUrl = state.discoveredTrayJoinUrl;
|
|
1141
|
+
const { servePort: SERVE_PORT, serveOrigin: SERVE_ORIGIN } = state;
|
|
1062
1142
|
// 3. Set up express app with request logging
|
|
1063
1143
|
const { secretStore, secretProxy, oauthStore } = await bootstrapSecrets();
|
|
1064
1144
|
const app = express();
|
|
@@ -1066,7 +1146,7 @@ async function main() {
|
|
|
1066
1146
|
// Append SLICC's standard RFC 8288 Link header set on every /api/* response.
|
|
1067
1147
|
app.use(sliccLinksMiddleware());
|
|
1068
1148
|
if (THIN_BRIDGE_MODE) {
|
|
1069
|
-
app.use(createThinBridgeCorsMiddleware());
|
|
1149
|
+
app.use(createThinBridgeCorsMiddleware(state.bridgeToken));
|
|
1070
1150
|
}
|
|
1071
1151
|
// ---------------------------------------------------------------------------
|
|
1072
1152
|
// Lick system — WebSocket bridge for webhooks/crontasks (all logic in browser)
|
|
@@ -1094,7 +1174,11 @@ async function main() {
|
|
|
1094
1174
|
(DEV_MODE
|
|
1095
1175
|
? 'https://slicc-tray-hub-staging.minivelos.workers.dev'
|
|
1096
1176
|
: 'https://www.sliccy.ai'),
|
|
1097
|
-
|
|
1177
|
+
// Read dynamically from state — populated by `launchElectronTarget`
|
|
1178
|
+
// when an existing leader is discovered. `launchBrowser` now runs
|
|
1179
|
+
// after `server.listen()`, so this endpoint must NOT close over a
|
|
1180
|
+
// pre-launch snapshot or it would always return null.
|
|
1181
|
+
trayJoinUrl: state.discoveredTrayJoinUrl ?? null,
|
|
1098
1182
|
});
|
|
1099
1183
|
});
|
|
1100
1184
|
// Localhost API descriptor — the discoverable surface advertised by the
|
|
@@ -1167,7 +1251,6 @@ async function main() {
|
|
|
1167
1251
|
fileLogger,
|
|
1168
1252
|
wss,
|
|
1169
1253
|
server,
|
|
1170
|
-
cdpPort: CDP_PORT,
|
|
1171
1254
|
});
|
|
1172
1255
|
process.on('SIGINT', () => {
|
|
1173
1256
|
gracefulShutdown();
|
|
@@ -1187,17 +1270,42 @@ async function main() {
|
|
|
1187
1270
|
}
|
|
1188
1271
|
}
|
|
1189
1272
|
});
|
|
1273
|
+
await startCdpStack(state, { app, server, wss, cdpCtx, fileLogger });
|
|
1274
|
+
}
|
|
1275
|
+
/**
|
|
1276
|
+
* Bottom half of `main()`: bind the /cdp WS handler, start listening on
|
|
1277
|
+
* the HTTP server BEFORE launching the browser so the /cdp bridge is
|
|
1278
|
+
* accepting the hosted leader's eager connect the instant Chrome opens
|
|
1279
|
+
* sliccy.ai, then launch the browser (populates `state.cdpPort`), then
|
|
1280
|
+
* run the post-launch warmup (preconnect / overlay / console forwarder).
|
|
1281
|
+
*
|
|
1282
|
+
* Extracted purely to keep `main()` under the lint-enforced function-size
|
|
1283
|
+
* cap; not a meaningful boundary, just a co-locating helper.
|
|
1284
|
+
*/
|
|
1285
|
+
async function startCdpStack(state, deps) {
|
|
1286
|
+
const { app, server, wss, cdpCtx, fileLogger } = deps;
|
|
1287
|
+
const { servePort: SERVE_PORT, serveOrigin: SERVE_ORIGIN } = state;
|
|
1288
|
+
// Read `state.cdpPort` dynamically — populated by `launchChromeTarget`
|
|
1289
|
+
// AFTER `server.listen()` so we can't capture it here.
|
|
1190
1290
|
wss.on('connection', (clientWs) => {
|
|
1191
|
-
void handleCdpClient(state, clientWs, cdpCtx,
|
|
1291
|
+
void handleCdpClient(state, clientWs, cdpCtx, state.cdpPort);
|
|
1292
|
+
});
|
|
1293
|
+
await startListening({
|
|
1294
|
+
server,
|
|
1295
|
+
fileLogger,
|
|
1296
|
+
servePort: SERVE_PORT,
|
|
1297
|
+
serveOrigin: SERVE_ORIGIN,
|
|
1298
|
+
cdpPort: state.cdpPort,
|
|
1192
1299
|
});
|
|
1193
|
-
|
|
1300
|
+
await launchBrowser(state);
|
|
1301
|
+
runCdpProxyWarmup(state, {
|
|
1194
1302
|
app,
|
|
1195
1303
|
server,
|
|
1196
1304
|
ctx: cdpCtx,
|
|
1197
1305
|
fileLogger,
|
|
1198
1306
|
servePort: SERVE_PORT,
|
|
1199
1307
|
serveOrigin: SERVE_ORIGIN,
|
|
1200
|
-
cdpPort:
|
|
1308
|
+
cdpPort: state.cdpPort,
|
|
1201
1309
|
});
|
|
1202
1310
|
}
|
|
1203
1311
|
// ---------------------------------------------------------------------------
|
|
@@ -2,6 +2,14 @@ import type { Express } from 'express';
|
|
|
2
2
|
import type { SecretProxyManager } from '../secrets/proxy-manager.js';
|
|
3
3
|
export interface FetchProxyDeps {
|
|
4
4
|
secretProxy: SecretProxyManager;
|
|
5
|
+
/**
|
|
6
|
+
* Optional logger sink for per-request observability. Defaults to
|
|
7
|
+
* `console`. Tests pass a silent sink so the route's logging doesn't
|
|
8
|
+
* leak into test output. The bridge's silence on `Failed to fetch`
|
|
9
|
+
* regressions was the original motivation — see issue tracker for
|
|
10
|
+
* the thin-bridge curl diagnosis.
|
|
11
|
+
*/
|
|
12
|
+
logger?: Pick<Console, 'log' | 'warn' | 'error'>;
|
|
5
13
|
}
|
|
6
14
|
/**
|
|
7
15
|
* Fetch proxy — forwards cross-origin requests from the browser to bypass
|
|
@@ -241,15 +241,17 @@ function streamUpstreamBody(res, upstream, secretProxy, detachClientClose) {
|
|
|
241
241
|
* checks req.body first.
|
|
242
242
|
*/
|
|
243
243
|
export function registerFetchProxyRoute(app, deps) {
|
|
244
|
-
const { secretProxy } = deps;
|
|
244
|
+
const { secretProxy, logger = console } = deps;
|
|
245
245
|
app.all('/api/fetch-proxy', async (req, res) => {
|
|
246
246
|
const rawBody = await collectRawBody(req);
|
|
247
247
|
const targetUrl = req.headers['x-target-url'];
|
|
248
248
|
if (!targetUrl) {
|
|
249
|
+
logger.warn(`[fetch-proxy] ${req.method} → 400 (missing X-Target-URL)`);
|
|
249
250
|
res.setHeader('X-Proxy-Error', '1');
|
|
250
251
|
res.status(400).json({ error: 'Missing X-Target-URL header' });
|
|
251
252
|
return;
|
|
252
253
|
}
|
|
254
|
+
logger.log(`[fetch-proxy] ${req.method} ${targetUrl}`);
|
|
253
255
|
// Hoisted so the catch handler can detach it on early failures (e.g. fetch
|
|
254
256
|
// threw before the success-path detach could run).
|
|
255
257
|
let onClientClose = null;
|
|
@@ -271,6 +273,7 @@ export function registerFetchProxyRoute(app, deps) {
|
|
|
271
273
|
}
|
|
272
274
|
const injection = injectRequestSecrets(secretProxy, headers, targetUrl, targetHostname);
|
|
273
275
|
if ('forbidden' in injection) {
|
|
276
|
+
logger.warn(`[fetch-proxy] ${req.method} ${targetUrl} → 403 (secret "${injection.forbidden.secretName}" not allowed for "${injection.forbidden.hostname}")`);
|
|
274
277
|
res.setHeader('X-Proxy-Error', '1');
|
|
275
278
|
res.status(403).json({
|
|
276
279
|
error: `Secret "${injection.forbidden.secretName}" is not allowed for domain "${injection.forbidden.hostname}"`,
|
|
@@ -296,6 +299,7 @@ export function registerFetchProxyRoute(app, deps) {
|
|
|
296
299
|
res.on('close', onClientClose);
|
|
297
300
|
fetchInit.signal = abortController.signal;
|
|
298
301
|
const upstream = await fetch(injection.cleanedUrl, fetchInit);
|
|
302
|
+
logger.log(`[fetch-proxy] ${req.method} ${targetUrl} ← ${upstream.status}`);
|
|
299
303
|
forwardUpstreamHeaders(res, upstream, secretProxy);
|
|
300
304
|
if (!upstream.body) {
|
|
301
305
|
res.end();
|
|
@@ -309,6 +313,7 @@ export function registerFetchProxyRoute(app, deps) {
|
|
|
309
313
|
// listener attached to the response object.
|
|
310
314
|
detachClientClose();
|
|
311
315
|
const message = err instanceof Error ? err.message : String(err);
|
|
316
|
+
logger.error(`[fetch-proxy] ${req.method} ${targetUrl} ← 502 (${message})`);
|
|
312
317
|
res.setHeader('X-Proxy-Error', '1');
|
|
313
318
|
res.status(502).json({ error: `Proxy fetch failed: ${message}` });
|
|
314
319
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/azure-openai-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/azure-openai-CTCrw8ag.js","assets/dist-BmWy99kl.js","assets/preload-helper-zJ_50EbN.js","assets/event-stream-BJI_nGaK.js","assets/json-parse-BUunmmNl.js","assets/chunk-aKtaBQYM.js","assets/__vite-browser-external-C7iut881.js","assets/transform-messages-DzB_lMo-.js","assets/openai-Cn5LRPCm.js","assets/main-RvuAuHo8.js","assets/modulepreload-polyfill-Dezn_h7o.js","assets/logger-DDBAeTLF.js","assets/clipboard-DgFtRQbq.js","assets/bedrock-camp-9-QEmC9Z.js","assets/local-llm-77SlLHlX.js","assets/openai-completions-DLI0t_lj.js","assets/github-copilot-headers-DZtWWv8W.js","assets/openai-prompt-cache-DXo9f3w5.js","assets/headers-DO1UzNKu.js","assets/sanitize-unicode-DmIE6hZJ.js","assets/adobe-D8jV1ibX.js","assets/oauth-service-CoJ-pYVD.js","assets/proxied-fetch-BBO8HwcV.js","assets/panel-rpc-DqT2FG7c.js","assets/llm-session-id-DVmZ9C2t.js","assets/github-copilot-yWe1M0K_.js","assets/github-BjJwZAID.js","assets/global-db-CbuLl-zx.js","assets/openai-codex-BG86bd3g.js","assets/xai-grok-sanitize-CR2JoOJd.js","assets/xai-grok-models-CeEBaUMC.js","assets/xai-grok-D7ULF1Ef.js","assets/xai-grok-errors-bnlIBeu-.js"])))=>i.map(i=>d[i]);
|
|
2
2
|
import{n as e,t}from"./chunk-aKtaBQYM.js";import"./dist-BmWy99kl.js";import{t as n}from"./preload-helper-zJ_50EbN.js";import{a as r,o as i,s as a}from"./event-stream-BJI_nGaK.js";import"./context-compaction-CFWyOzX1.js";import{t as o}from"./logger-DDBAeTLF.js";import"./tool-ui-YOPqzMmL.js";import{n as s,t as c}from"./src-DlEHAkLd.js";import{n as l,t as u}from"./panel-rpc-DqT2FG7c.js";import{r as d,t as f}from"./bedrock-camp-9-QEmC9Z.js";var p=Symbol.for(`yaml.alias`),m=Symbol.for(`yaml.document`),h=Symbol.for(`yaml.map`),g=Symbol.for(`yaml.pair`),_=Symbol.for(`yaml.scalar`),v=Symbol.for(`yaml.seq`),y=Symbol.for(`yaml.node.type`),b=e=>!!e&&typeof e==`object`&&e[y]===p,x=e=>!!e&&typeof e==`object`&&e[y]===m,S=e=>!!e&&typeof e==`object`&&e[y]===h,C=e=>!!e&&typeof e==`object`&&e[y]===g,w=e=>!!e&&typeof e==`object`&&e[y]===_,T=e=>!!e&&typeof e==`object`&&e[y]===v;function E(e){if(e&&typeof e==`object`)switch(e[y]){case h:case v:return!0}return!1}function D(e){if(e&&typeof e==`object`)switch(e[y]){case p:case h:case _:case v:return!0}return!1}var O=e=>(w(e)||E(e))&&!!e.anchor,k=Symbol(`break visit`),ee=Symbol(`skip children`),A=Symbol(`remove node`);function j(e,t){let n=ne(t);x(e)?M(null,e.contents,n,Object.freeze([e]))===A&&(e.contents=null):M(null,e,n,Object.freeze([]))}j.BREAK=k,j.SKIP=ee,j.REMOVE=A;function M(e,t,n,r){let i=re(e,t,n,r);if(D(i)||C(i))return ie(e,r,i),M(e,i,n,r);if(typeof i!=`symbol`){if(E(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=M(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===k)return k;else i===A&&(t.items.splice(e,1),--e)}}else if(C(t)){r=Object.freeze(r.concat(t));let e=M(`key`,t.key,n,r);if(e===k)return k;e===A&&(t.key=null);let i=M(`value`,t.value,n,r);if(i===k)return k;i===A&&(t.value=null)}}return i}async function te(e,t){let n=ne(t);x(e)?await N(null,e.contents,n,Object.freeze([e]))===A&&(e.contents=null):await N(null,e,n,Object.freeze([]))}te.BREAK=k,te.SKIP=ee,te.REMOVE=A;async function N(e,t,n,r){let i=await re(e,t,n,r);if(D(i)||C(i))return ie(e,r,i),N(e,i,n,r);if(typeof i!=`symbol`){if(E(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=await N(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===k)return k;else i===A&&(t.items.splice(e,1),--e)}}else if(C(t)){r=Object.freeze(r.concat(t));let e=await N(`key`,t.key,n,r);if(e===k)return k;e===A&&(t.key=null);let i=await N(`value`,t.value,n,r);if(i===k)return k;i===A&&(t.value=null)}}return i}function ne(e){return typeof e==`object`&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function re(e,t,n,r){if(typeof n==`function`)return n(e,t,r);if(S(t))return n.Map?.(e,t,r);if(T(t))return n.Seq?.(e,t,r);if(C(t))return n.Pair?.(e,t,r);if(w(t))return n.Scalar?.(e,t,r);if(b(t))return n.Alias?.(e,t,r)}function ie(e,t,n){let r=t[t.length-1];if(E(r))r.items[e]=n;else if(C(r))e===`key`?r.key=n:r.value=n;else if(x(r))r.contents=n;else{let e=b(r)?`alias`:`scalar`;throw Error(`Cannot replace node with ${e} parent`)}}var ae={"!":`%21`,",":`%2C`,"[":`%5B`,"]":`%5D`,"{":`%7B`,"}":`%7D`},oe=e=>e.replace(/[!,[\]{}]/g,e=>ae[e]),se=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case`1.1`:this.atNextDocument=!0;break;case`1.2`:this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:`1.2`},this.tags=Object.assign({},e.defaultTags);break}return t}add(t,n){this.atNextDocument&&=(this.yaml={explicit:e.defaultYaml.explicit,version:`1.1`},this.tags=Object.assign({},e.defaultTags),!1);let r=t.trim().split(/[ \t]+/),i=r.shift();switch(i){case`%TAG`:{if(r.length!==2&&(n(0,`%TAG directive should contain exactly two parts`),r.length<2))return!1;let[e,t]=r;return this.tags[e]=t,!0}case`%YAML`:{if(this.yaml.explicit=!0,r.length!==1)return n(0,`%YAML directive should contain exactly one part`),!1;let[e]=r;if(e===`1.1`||e===`1.2`)return this.yaml.version=e,!0;{let t=/^\d+\.\d+$/.test(e);return n(6,`Unsupported YAML version ${e}`,t),!1}}default:return n(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e===`!`)return`!`;if(e[0]!==`!`)return t(`Not a valid tag: ${e}`),null;if(e[1]===`<`){let n=e.slice(2,-1);return n===`!`||n===`!!`?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==`>`&&t(`Verbatim tags must end with a >`),n)}let[,n,r]=e.match(/^(.*!)([^!]*)$/s);r||t(`The ${e} tag has no suffix`);let i=this.tags[n];if(i)try{return i+decodeURIComponent(r)}catch(e){return t(String(e)),null}return n===`!`?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+oe(e.substring(n.length));return e[0]===`!`?e:`!<${e}>`}toString(e){let t=this.yaml.explicit?[`%YAML ${this.yaml.version||`1.2`}`]:[],n=Object.entries(this.tags),r;if(e&&n.length>0&&D(e.contents)){let t={};j(e.contents,(e,n)=>{D(n)&&n.tag&&(t[n.tag]=!0)}),r=Object.keys(t)}else r=[];for(let[i,a]of n)i===`!!`&&a===`tag:yaml.org,2002:`||(!e||r.some(e=>e.startsWith(a)))&&t.push(`%TAG ${i} ${a}`);return t.join(`
|
|
3
3
|
`)}};se.defaultYaml={explicit:!1,version:`1.2`},se.defaultTags={"!!":`tag:yaml.org,2002:`};function ce(e){if(/[\x00-\x19\s,[\]{}]/.test(e)){let t=`Anchor must not contain whitespace or control characters: ${JSON.stringify(e)}`;throw Error(t)}return!0}function le(e,t,n,r){if(r&&typeof r==`object`)if(Array.isArray(r))for(let t=0,n=r.length;t<n;++t){let n=r[t],i=le(e,r,String(t),n);i===void 0?delete r[t]:i!==n&&(r[t]=i)}else if(r instanceof Map)for(let t of Array.from(r.keys())){let n=r.get(t),i=le(e,r,t,n);i===void 0?r.delete(t):i!==n&&r.set(t,i)}else if(r instanceof Set)for(let t of Array.from(r)){let n=le(e,r,t,t);n===void 0?r.delete(t):n!==t&&(r.delete(t),r.add(n))}else for(let[t,n]of Object.entries(r)){let i=le(e,r,t,n);i===void 0?delete r[t]:i!==n&&(r[t]=i)}return e.call(t,n,r)}function P(e,t,n){if(Array.isArray(e))return e.map((e,t)=>P(e,String(t),n));if(e&&typeof e.toJSON==`function`){if(!n||!O(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=e=>{r.res=e,delete n.onCreate};let i=e.toJSON(t,n);return n.onCreate&&n.onCreate(i),i}return typeof e==`bigint`&&!n?.keep?Number(e):e}var ue=class{constructor(e){Object.defineProperty(this,y,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:t,maxAliasCount:n,onAnchor:r,reviver:i}={}){if(!x(e))throw TypeError(`A document argument is required`);let a={anchors:new Map,doc:e,keep:!0,mapAsMap:t===!0,mapKeyWarned:!1,maxAliasCount:typeof n==`number`?n:100},o=P(this,``,a);if(typeof r==`function`)for(let{count:e,res:t}of a.anchors.values())r(t,e);return typeof i==`function`?le(i,{"":o},``,o):o}},de=class extends ue{constructor(e){super(p),this.source=e,Object.defineProperty(this,"tag",{set(){throw Error(`Alias nodes cannot have tags`)}})}resolve(e,t){if(t?.maxAliasCount===0)throw ReferenceError(`Alias resolution is disabled`);let n;t?.aliasResolveCache?n=t.aliasResolveCache:(n=[],j(e,{Node:(e,t)=>{(b(t)||O(t))&&n.push(t)}}),t&&(t.aliasResolveCache=n));let r;for(let e of n){if(e===this)break;e.anchor===this.source&&(r=e)}return r}toJSON(e,t){if(!t)return{source:this.source};let{anchors:n,doc:r,maxAliasCount:i}=t,a=this.resolve(r,t);if(!a){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw ReferenceError(e)}let o=n.get(a);if(o||=(P(a,null,t),n.get(a)),o?.res===void 0)throw ReferenceError(`This should not happen: Alias anchor was not resolved?`);if(i>=0&&(o.count+=1,o.aliasCount===0&&(o.aliasCount=fe(r,a,n)),o.count*o.aliasCount>i))throw ReferenceError(`Excessive alias count indicates a resource exhaustion attack`);return o.res}toString(e,t,n){let r=`*${this.source}`;if(e){if(ce(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw Error(e)}if(e.implicitKey)return`${r} `}return r}};function fe(e,t,n){if(b(t)){let r=t.resolve(e),i=n&&r&&n.get(r);return i?i.count*i.aliasCount:0}else if(E(t)){let r=0;for(let i of t.items){let t=fe(e,i,n);t>r&&(r=t)}return r}else if(C(t)){let r=fe(e,t.key,n),i=fe(e,t.value,n);return Math.max(r,i)}return 1}var pe=e=>!e||typeof e!=`function`&&typeof e!=`object`,F=class extends ue{constructor(e){super(_),this.value=e}toJSON(e,t){return t?.keep?this.value:P(this.value,e,t)}toString(){return String(this.value)}};F.BLOCK_FOLDED=`BLOCK_FOLDED`,F.BLOCK_LITERAL=`BLOCK_LITERAL`,F.PLAIN=`PLAIN`,F.QUOTE_DOUBLE=`QUOTE_DOUBLE`,F.QUOTE_SINGLE=`QUOTE_SINGLE`;var me=`tag:yaml.org,2002:`;function he(e,t,n){if(t){let e=n.filter(e=>e.tag===t),r=e.find(e=>!e.format)??e[0];if(!r)throw Error(`Tag ${t} not found`);return r}return n.find(t=>t.identify?.(e)&&!t.format)}function ge(e,t,n){if(x(e)&&(e=e.contents),D(e))return e;if(C(e)){let t=n.schema[h].createNode?.(n.schema,null,n);return t.items.push(e),t}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<`u`&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:i,onTagObj:a,schema:o,sourceObjects:s}=n,c;if(r&&e&&typeof e==`object`){if(c=s.get(e),c)return c.anchor??=i(e),new de(c.anchor);c={anchor:null,node:null},s.set(e,c)}t?.startsWith(`!!`)&&(t=me+t.slice(2));let l=he(e,t,o.tags);if(!l){if(e&&typeof e.toJSON==`function`&&(e=e.toJSON()),!e||typeof e!=`object`){let t=new F(e);return c&&(c.node=t),t}l=e instanceof Map?o[h]:Symbol.iterator in Object(e)?o[v]:o[h]}a&&(a(l),delete n.onTagObj);let u=l?.createNode?l.createNode(n.schema,e,n):typeof l?.nodeClass?.from==`function`?l.nodeClass.from(n.schema,e,n):new F(e);return t?u.tag=t:l.default||(u.tag=l.tag),c&&(c.node=u),u}function _e(e,t,n){let r=n;for(let e=t.length-1;e>=0;--e){let n=t[e];if(typeof n==`number`&&Number.isInteger(n)&&n>=0){let e=[];e[n]=r,r=e}else r=new Map([[n,r]])}return ge(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw Error(`This should not happen, please report a bug.`)},schema:e,sourceObjects:new Map})}var ve=e=>e==null||typeof e==`object`&&!!e[Symbol.iterator]().next().done,ye=class extends ue{constructor(e,t){super(e),Object.defineProperty(this,"schema",{value:t,configurable:!0,enumerable:!1,writable:!0})}clone(e){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(t.schema=e),t.items=t.items.map(t=>D(t)||C(t)?t.clone(e):t),this.range&&(t.range=this.range.slice()),t}addIn(e,t){if(ve(e))this.add(t);else{let[n,...r]=e,i=this.get(n,!0);if(E(i))i.addIn(r,t);else if(i===void 0&&this.schema)this.set(n,_e(this.schema,r,t));else throw Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}}deleteIn(e){let[t,...n]=e;if(n.length===0)return this.delete(t);let r=this.get(t,!0);if(E(r))return r.deleteIn(n);throw Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}getIn(e,t){let[n,...r]=e,i=this.get(n,!0);return r.length===0?!t&&w(i)?i.value:i:E(i)?i.getIn(r,t):void 0}hasAllNullValues(e){return this.items.every(t=>{if(!C(t))return!1;let n=t.value;return n==null||e&&w(n)&&n.value==null&&!n.commentBefore&&!n.comment&&!n.tag})}hasIn(e){let[t,...n]=e;if(n.length===0)return this.has(t);let r=this.get(t,!0);return E(r)?r.hasIn(n):!1}setIn(e,t){let[n,...r]=e;if(r.length===0)this.set(n,t);else{let e=this.get(n,!0);if(E(e))e.setIn(r,t);else if(e===void 0&&this.schema)this.set(n,_e(this.schema,r,t));else throw Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}}},be=e=>e.replace(/^(?!$)(?: $)?/gm,`#`);function xe(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}var I=(e,t,n)=>e.endsWith(`
|
|
4
4
|
`)?xe(n,t):n.includes(`
|
|
@@ -35,4 +35,4 @@ $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,`$1$2`).replace(/\
|
|
|
35
35
|
`}}return e?(p+=`
|
|
36
36
|
`+xe(l(e),c),s&&s()):d&&o&&o(),p}function Qe({items:e},t,{flowChars:n,itemIndent:r}){let{indent:i,indentStep:a,flowCollectionPadding:o,options:{commentString:s}}=t;r+=a;let c=Object.assign({},t,{indent:r,inFlow:!0,type:null}),l=!1,u=0,d=[];for(let n=0;n<e.length;++n){let i=e[n],a=null;if(D(i))i.spaceBefore&&d.push(``),$e(t,d,i.commentBefore,!1),i.comment&&(a=i.comment);else if(C(i)){let e=D(i.key)?i.key:null;e&&(e.spaceBefore&&d.push(``),$e(t,d,e.commentBefore,!1),e.comment&&(l=!0));let n=D(i.value)?i.value:null;n?(n.comment&&(a=n.comment),n.commentBefore&&(l=!0)):i.value==null&&e?.comment&&(a=e.comment)}a&&(l=!0);let o=Re(i,c,()=>a=null);l||=d.length>u||o.includes(`
|
|
37
37
|
`),n<e.length-1?o+=`,`:t.options.trailingComma&&(t.options.lineWidth>0&&(l||=d.reduce((e,t)=>e+t.length+2,2)+(o.length+2)>t.options.lineWidth),l&&(o+=`,`)),a&&(o+=I(o,r,s(a))),d.push(o),u=d.length}let{start:f,end:p}=n;if(d.length===0)return f+p;if(!l){let e=d.reduce((e,t)=>e+t.length+2,2);l=t.options.lineWidth>0&&e>t.options.lineWidth}if(l){let e=f;for(let t of d)e+=t?`\n${a}${i}${t}`:`
|
|
38
|
-
`;return`${e}\n${i}${p}`}else return`${f}${o}${d.join(` `)}${o}${p}`}function $e({indent:e,options:{commentString:t}},n,r,i){if(r&&i&&(r=r.replace(/^\n+/,``)),r){let i=xe(t(r),e);n.push(i.trimStart())}}function B(e,t){let n=w(t)?t.value:t;for(let r of e)if(C(r)&&(r.key===t||r.key===n||w(r.key)&&r.key.value===n))return r}var V=class extends ye{static get tagName(){return`tag:yaml.org,2002:map`}constructor(e){super(h,e),this.items=[]}static from(e,t,n){let{keepUndefined:r,replacer:i}=n,a=new this(e),o=(e,o)=>{if(typeof i==`function`)o=i.call(t,e,o);else if(Array.isArray(i)&&!i.includes(e))return;(o!==void 0||r)&&a.items.push(Ye(e,o,n))};if(t instanceof Map)for(let[e,n]of t)o(e,n);else if(t&&typeof t==`object`)for(let e of Object.keys(t))o(e,t[e]);return typeof e.sortMapEntries==`function`&&a.items.sort(e.sortMapEntries),a}add(e,t){let n;n=C(e)?e:!e||typeof e!=`object`||!(`key`in e)?new z(e,e?.value):new z(e.key,e.value);let r=B(this.items,n.key),i=this.schema?.sortMapEntries;if(r){if(!t)throw Error(`Key ${n.key} already set`);w(r.value)&&pe(n.value)?r.value.value=n.value:r.value=n.value}else if(i){let e=this.items.findIndex(e=>i(n,e)<0);e===-1?this.items.push(n):this.items.splice(e,0,n)}else this.items.push(n)}delete(e){let t=B(this.items,e);return t?this.items.splice(this.items.indexOf(t),1).length>0:!1}get(e,t){let n=B(this.items,e)?.value;return(!t&&w(n)?n.value:n)??void 0}has(e){return!!B(this.items,e)}set(e,t){this.add(new z(e,t),!0)}toJSON(e,t,n){let r=n?new n:t?.mapAsMap?new Map:{};t?.onCreate&&t.onCreate(r);for(let e of this.items)qe(t,r,e);return r}toString(e,t,n){if(!e)return JSON.stringify(this);for(let e of this.items)if(!C(e))throw Error(`Map items must all be pairs; found ${JSON.stringify(e)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),Xe(this,e,{blockItemPrefix:``,flowChars:{start:`{`,end:`}`},itemIndent:e.indent||``,onChompKeep:n,onComment:t})}},et={collection:`map`,default:!0,nodeClass:V,tag:`tag:yaml.org,2002:map`,resolve(e,t){return S(e)||t(`Expected a mapping for this tag`),e},createNode:(e,t,n)=>V.from(e,t,n)},tt=class extends ye{static get tagName(){return`tag:yaml.org,2002:seq`}constructor(e){super(v,e),this.items=[]}add(e){this.items.push(e)}delete(e){let t=nt(e);return typeof t==`number`?this.items.splice(t,1).length>0:!1}get(e,t){let n=nt(e);if(typeof n!=`number`)return;let r=this.items[n];return!t&&w(r)?r.value:r}has(e){let t=nt(e);return typeof t==`number`&&t<this.items.length}set(e,t){let n=nt(e);if(typeof n!=`number`)throw Error(`Expected a valid index, not ${e}.`);let r=this.items[n];w(r)&&pe(t)?r.value=t:this.items[n]=t}toJSON(e,t){let n=[];t?.onCreate&&t.onCreate(n);let r=0;for(let e of this.items)n.push(P(e,String(r++),t));return n}toString(e,t,n){return e?Xe(this,e,{blockItemPrefix:`- `,flowChars:{start:`[`,end:`]`},itemIndent:(e.indent||``)+` `,onChompKeep:n,onComment:t}):JSON.stringify(this)}static from(e,t,n){let{replacer:r}=n,i=new this(e);if(t&&Symbol.iterator in Object(t)){let e=0;for(let a of t){if(typeof r==`function`){let n=t instanceof Set?a:String(e++);a=r.call(t,n,a)}i.items.push(ge(a,void 0,n))}}return i}};function nt(e){let t=w(e)?e.value:e;return t&&typeof t==`string`&&(t=Number(t)),typeof t==`number`&&Number.isInteger(t)&&t>=0?t:null}var rt={collection:`seq`,default:!0,nodeClass:tt,tag:`tag:yaml.org,2002:seq`,resolve(e,t){return T(e)||t(`Expected a sequence for this tag`),e},createNode:(e,t,n)=>tt.from(e,t,n)};function it(e){return typeof e==`bigint`||Number.isInteger(e)}var at=({value:e})=>JSON.stringify(e),ot=[{identify:e=>typeof e==`string`,default:!0,tag:`tag:yaml.org,2002:str`,resolve:e=>e,stringify:at},{identify:e=>e==null,createNode:()=>new F(null),default:!0,tag:`tag:yaml.org,2002:null`,test:/^null$/,resolve:()=>null,stringify:at},{identify:e=>typeof e==`boolean`,default:!0,tag:`tag:yaml.org,2002:bool`,test:/^true$|^false$/,resolve:e=>e===`true`,stringify:at},{identify:it,default:!0,tag:`tag:yaml.org,2002:int`,test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(e,t,{intAsBigInt:n})=>n?BigInt(e):parseInt(e,10),stringify:({value:e})=>it(e)?e.toString():JSON.stringify(e)},{identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:e=>parseFloat(e),stringify:at}];[et,rt].concat(ot,{default:!0,tag:``,test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}});function st(e,t,n){let{replacer:r}=n,i=new tt(e);i.tag=`tag:yaml.org,2002:pairs`;let a=0;if(t&&Symbol.iterator in Object(t))for(let e of t){typeof r==`function`&&(e=r.call(t,String(a++),e));let o,s;if(Array.isArray(e))if(e.length===2)o=e[0],s=e[1];else throw TypeError(`Expected [key, value] tuple: ${e}`);else if(e&&e instanceof Object){let t=Object.keys(e);if(t.length===1)o=t[0],s=e[o];else throw TypeError(`Expected tuple with one key, not ${t.length} keys`)}else o=e;i.items.push(Ye(o,s,n))}return i}var ct=class e extends tt{constructor(){super(),this.add=V.prototype.add.bind(this),this.delete=V.prototype.delete.bind(this),this.get=V.prototype.get.bind(this),this.has=V.prototype.has.bind(this),this.set=V.prototype.set.bind(this),this.tag=e.tag}toJSON(e,t){if(!t)return super.toJSON(e);let n=new Map;t?.onCreate&&t.onCreate(n);for(let e of this.items){let r,i;if(C(e)?(r=P(e.key,``,t),i=P(e.value,r,t)):r=P(e,``,t),n.has(r))throw Error(`Ordered maps must not include duplicate keys`);n.set(r,i)}return n}static from(e,t,n){let r=st(e,t,n),i=new this;return i.items=r.items,i}};ct.tag=`tag:yaml.org,2002:omap`;var lt=class e extends V{constructor(t){super(t),this.tag=e.tag}add(e){let t;t=C(e)?e:e&&typeof e==`object`&&`key`in e&&`value`in e&&e.value===null?new z(e.key,null):new z(e,null),B(this.items,t.key)||this.items.push(t)}get(e,t){let n=B(this.items,e);return!t&&C(n)?w(n.key)?n.key.value:n.key:n}set(e,t){if(typeof t!=`boolean`)throw Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof t}`);let n=B(this.items,e);n&&!t?this.items.splice(this.items.indexOf(n),1):!n&&t&&this.items.push(new z(e))}toJSON(e,t){return super.toJSON(e,t,Set)}toString(e,t,n){if(!e)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},e,{allNullValues:!0}),t,n);throw Error(`Set items must all have null values`)}static from(e,t,n){let{replacer:r}=n,i=new this(e);if(t&&Symbol.iterator in Object(t))for(let e of t)typeof r==`function`&&(e=r.call(t,e,e)),i.items.push(Ye(e,null,n));return i}};lt.tag=`tag:yaml.org,2002:set`;var ut=Symbol(`break visit`),dt=Symbol(`skip children`),ft=Symbol(`remove item`);function H(e,t){`type`in e&&e.type===`document`&&(e={start:e.start,value:e.value}),pt(Object.freeze([]),e,t)}H.BREAK=ut,H.SKIP=dt,H.REMOVE=ft,H.itemAtPath=(e,t)=>{let n=e;for(let[e,r]of t){let t=n?.[e];if(t&&`items`in t)n=t.items[r];else return}return n},H.parentCollection=(e,t)=>{let n=H.itemAtPath(e,t.slice(0,-1)),r=t[t.length-1][0],i=n?.[r];if(i&&`items`in i)return i;throw Error(`Parent collection not found`)};function pt(e,t,n){let r=n(t,e);if(typeof r==`symbol`)return r;for(let i of[`key`,`value`]){let a=t[i];if(a&&`items`in a){for(let t=0;t<a.items.length;++t){let r=pt(Object.freeze(e.concat([[i,t]])),a.items[t],n);if(typeof r==`number`)t=r-1;else if(r===ut)return ut;else r===ft&&(a.items.splice(t,1),--t)}typeof r==`function`&&i===`key`&&(r=r(t,e))}}return typeof r==`function`?r(t,e):r}t(((e,t)=>{function n(e){return Array.isArray(e)?e:[e]}var r=void 0,i=``,a=` `,o=`\\`,s=/^\s+$/,c=/(?:[^\\]|^)\\$/,l=/^\\!/,u=/^\\#/,d=/\r?\n/g,f=/^\.{0,2}\/|^\.{1,2}$/,p=/\/$/,m=`/`,h=`node-ignore`;typeof Symbol<`u`&&(h=Symbol.for(`node-ignore`));var g=h,_=(e,t,n)=>(Object.defineProperty(e,t,{value:n}),n),v=/([0-z])-([0-z])/g,y=()=>!1,b=e=>e.replace(v,(e,t,n)=>t.charCodeAt(0)<=n.charCodeAt(0)?e:i),x=e=>{let{length:t}=e;return e.slice(0,t-t%2)},S=[[/^\uFEFF/,()=>i],[/((?:\\\\)*?)(\\?\s+)$/,(e,t,n)=>t+(n.indexOf(`\\`)===0?a:i)],[/(\\+?)\s/g,(e,t)=>{let{length:n}=t;return t.slice(0,n-n%2)+a}],[/[\\$.|*+(){^]/g,e=>`\\${e}`],[/(?!\\)\?/g,()=>`[^/]`],[/^\//,()=>`^`],[/\//g,()=>`\\/`],[/^\^*\\\*\\\*\\\//,()=>`^(?:.*\\/)?`],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?`^`:`(?:^|\\/)`}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(e,t,n)=>t+6<n.length?`(?:\\/[^\\/]+)*`:`\\/.+`],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(e,t,n)=>t+n.replace(/\\\*/g,`[^\\/]*`)],[/\\\\\\(?=[$.|*+(){^])/g,()=>o],[/\\\\/g,()=>o],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(e,t,n,r,i)=>t===o?`\\[${n}${x(r)}${i}`:i===`]`&&r.length%2==0?`[${b(n)}${r}]`:`[]`],[/(?:[^*])$/,e=>/\/$/.test(e)?`${e}$`:`${e}(?=$|\\/$)`]],C=/(^|\\\/)?\\\*$/,w=`regex`,T=`checkRegex`,E={[w](e,t){return`${t?`${t}[^/]+`:`[^/]*`}(?=$|\\/$)`},[T](e,t){return`${t?`${t}[^/]*`:`[^/]*`}(?=$|\\/$)`}},D=e=>S.reduce((t,[n,r])=>t.replace(n,r.bind(e)),e),O=e=>typeof e==`string`,k=e=>e&&O(e)&&!s.test(e)&&!c.test(e)&&e.indexOf(`#`)!==0,ee=e=>e.split(d).filter(Boolean),A=class{constructor(e,t,n,r,i,a){this.pattern=e,this.mark=t,this.negative=i,_(this,`body`,n),_(this,`ignoreCase`,r),_(this,`regexPrefix`,a)}get regex(){let e=`_regex`;return this[e]?this[e]:this._make(w,e)}get checkRegex(){let e=`_checkRegex`;return this[e]?this[e]:this._make(T,e)}_make(e,t){let n=this.regexPrefix.replace(C,E[e]),r=this.ignoreCase?new RegExp(n,`i`):new RegExp(n);return _(this,t,r)}},j=({pattern:e,mark:t},n)=>{let r=!1,i=e;i.indexOf(`!`)===0&&(r=!0,i=i.substr(1)),i=i.replace(l,`!`).replace(u,`#`);let a=D(i);return new A(e,t,i,n,r,a)},M=class{constructor(e){this._ignoreCase=e,this._rules=[]}_add(e){if(e&&e[g]){this._rules=this._rules.concat(e._rules._rules),this._added=!0;return}if(O(e)&&(e={pattern:e}),k(e.pattern)){let t=j(e,this._ignoreCase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,n(O(e)?ee(e):e).forEach(this._add,this),this._added}test(e,t,n){let i=!1,a=!1,o;this._rules.forEach(s=>{let{negative:c}=s;a===c&&i!==a||c&&!i&&!a&&!t||s[n].test(e)&&(i=!c,a=c,o=c?r:s)});let s={ignored:i,unignored:a};return o&&(s.rule=o),s}},te=(e,t)=>{throw new t(e)},N=(e,t,n)=>O(e)?e?N.isNotRelative(e)?n(`path should be a \`path.relative()\`d string, but got "${t}"`,RangeError):!0:n(`path must not be empty`,TypeError):n(`path must be a string, but got \`${t}\``,TypeError),ne=e=>f.test(e);N.isNotRelative=ne,N.convert=e=>e;var re=class{constructor({ignorecase:e=!0,ignoreCase:t=e,allowRelativePaths:n=!1}={}){_(this,g,!0),this._rules=new M(t),this._strictPathCheck=!n,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(e){return this._rules.add(e)&&this._initCache(),this}addPattern(e){return this.add(e)}_test(e,t,n,r){let i=e&&N.convert(e);return N(i,e,this._strictPathCheck?te:y),this._t(i,t,n,r)}checkIgnore(e){if(!p.test(e))return this.test(e);let t=e.split(m).filter(Boolean);if(t.pop(),t.length){let e=this._t(t.join(m)+m,this._testCache,!0,t);if(e.ignored)return e}return this._rules.test(e,!1,T)}_t(e,t,n,r){if(e in t)return t[e];if(r||=e.split(m).filter(Boolean),r.pop(),!r.length)return t[e]=this._rules.test(e,n,w);let i=this._t(r.join(m)+m,t,n,r);return t[e]=i.ignored?i:this._rules.test(e,n,w)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return n(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},ie=e=>new re(e),ae=e=>N(e&&N.convert(e),e,y),oe=()=>{N.convert=e=>/^\\\\\?\\/.test(e)||/["<>|\u0000-\u001F]+/u.test(e)?e:e.replace(/\\/g,`/`);let e=/^[a-z]:\//i;N.isNotRelative=t=>e.test(t)||ne(t)};typeof process<`u`&&process.platform===`win32`&&oe(),t.exports=ie,ie.default=ie,t.exports.isPathValid=ae,_(t.exports,Symbol.for(`setupWindows`),oe)}))(),globalThis.Buffer,o(`secret-scrub`),o(`image-processor`),o(`tool-adapter`);var mt=Object.assign({"/packages/dev-tools/providers.build.json":{include:[`*`],exclude:[`amazon-bedrock`]}})[`/packages/dev-tools/providers.build.json`]??{include:[`*`],exclude:[]};function ht(e){let{include:t,exclude:n}=mt;return n.includes(`*`)||n.includes(e)?!1:!!(t.includes(`*`)||t.includes(e))}var gt=Object.assign({"./built-in/azure-ai-foundry.ts":()=>n(()=>import(`./azure-ai-foundry-Bo0FAJyX.js`),[]),"./built-in/azure-openai.ts":()=>n(()=>import(`./azure-openai-BpIYfrM-.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])),"./built-in/bedrock-camp.ts":()=>n(()=>import(`./bedrock-camp-9-QEmC9Z.js`).then(e=>e.n),__vite__mapDeps([13,5,1,2,3,4,6,7])),"./built-in/local-llm.ts":()=>n(()=>import(`./local-llm-ehhQ9AeC.js`),__vite__mapDeps([14,1,2,3,4,5,6,15,16,17,7,18,19,8,11]))}),_t=Object.assign({"/packages/webapp/providers/adobe.ts":()=>n(()=>import(`./adobe-Ba8U6Soe.js`),__vite__mapDeps([20,2,1,3,4,5,6,9,10,11,12,13,7,21,22,23])),"/packages/webapp/providers/github-copilot.ts":()=>n(()=>import(`./github-copilot-CPpSIAl_.js`),__vite__mapDeps([24,2,1,3,4,5,6,9,10,11,12])),"/packages/webapp/providers/github.ts":()=>n(()=>import(`./github-6R3ONWs4.js`),__vite__mapDeps([25,2,9,5,10,11,12,26,21,22])),"/packages/webapp/providers/openai-codex.ts":()=>n(()=>import(`./openai-codex-CcWEg2Id.js`),__vite__mapDeps([27,1,2,3,4,5,6,9,10,11,12])),"/packages/webapp/providers/xai-grok-errors.ts":()=>n(()=>import(`./xai-grok-errors-bnlIBeu-.js`),[]),"/packages/webapp/providers/xai-grok-models.ts":()=>n(()=>import(`./xai-grok-models-CeEBaUMC.js`),[]),"/packages/webapp/providers/xai-grok-sanitize.ts":()=>n(()=>import(`./xai-grok-sanitize-CR2JoOJd.js`),__vite__mapDeps([28,29])),"/packages/webapp/providers/xai-grok.ts":()=>n(()=>import(`./xai-grok-BK-WZwtZ.js`),__vite__mapDeps([30,1,2,3,4,5,6,9,10,11,12,31,29,28]))}),U=new Map,vt=null;function yt(){return vt||(vt=(async()=>{for(let[e,t]of Object.entries(gt)){let e=await t();e.config&&ht(e.config.id)&&(U.set(e.config.id,e.config),e.register?.())}for(let[e,t]of Object.entries(_t)){let e=await t();e.config&&(U.set(e.config.id,e.config),e.register?.())}})(),vt)}function bt(e){return U.get(e)}function xt(){return[...U.keys()]}function St(e){U.set(e.id,e)}var Ct=e({ACCOUNTS_KEY:()=>W,__test__:()=>Nt,addAccount:()=>X,applyProviderDefaults:()=>Bt,clearAllSettings:()=>bn,clearApiKey:()=>hn,clearBaseUrl:()=>vn,clearSelectedProvider:()=>fn,exportProviders:()=>yn,getAccounts:()=>Y,getAllAvailableModels:()=>Wt,getAllExtraOAuthDomains:()=>Jt,getApiKey:()=>pn,getApiKeyForProvider:()=>on,getApiVersionForProvider:()=>cn,getAvailableProviders:()=>Pt,getBaseUrl:()=>gn,getBaseUrlForProvider:()=>Z,getDeploymentForProvider:()=>sn,getExtraOAuthDomains:()=>Gt,getOAuthAccountInfo:()=>Rt,getProviderConfig:()=>K,getProviderModels:()=>q,getRawApiKeyForProvider:()=>an,getSelectedModelId:()=>Q,getSelectedProvider:()=>$,isModelHiddenFromPicker:()=>Ht,logoutOAuthAccount:()=>$t,maskOAuthTokenWithRetry:()=>en,migrateLegacyAuthOnlySelection:()=>jt,persistOAuthMaskViaServiceWorker:()=>tn,providerOffersLlmModels:()=>Ft,removeAccount:()=>Qt,resolveCurrentModel:()=>Tn,resolveModelById:()=>wn,saveOAuthAccount:()=>nn,setApiKey:()=>mn,setBaseUrl:()=>_n,setExtraOAuthDomains:()=>Kt,setExtraOAuthDomainsAsync:()=>qt,setSelectedModelId:()=>ln,setSelectedProvider:()=>dn}),wt=r,Tt=i,W=`slicc_accounts`,G=`selected-model`,Et=[`slicc_provider`,`slicc_api_key`,`slicc_base_url`,`anthropic_api_key`,`api_provider`,`azure_resource`,`bedrock_region`],Dt=new Set([`github`]);function Ot(e){let t;try{t=a()}catch{return!1}return t.includes(e)&&!ht(e)}var kt=!1;function At(){if(!kt){kt=!0;for(let e of Et)try{localStorage.removeItem(e)}catch{}jt()}}function jt(){try{let e=localStorage.getItem(G);if(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t);(Dt.has(n)||Ot(n))&&localStorage.removeItem(G)}}}catch{}try{let e=localStorage.getItem(W);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`&&Ot(e.providerId)));n.length!==t.length&&localStorage.setItem(W,JSON.stringify(n))}catch{}}function Mt(){kt=!1}var Nt={_resetLegacyCleanup:Mt};function Pt(){let e=a().filter(ht),t=xt();return[...new Set([...e,...t])].filter(e=>!bt(e)?.hidden)}function Ft(e){try{if(q(e).length>0)return!0}catch{}try{if(i(e).length>0)return!0}catch{}let t=bt(e);return!!(t?.modelOverrides&&Object.keys(t.modelOverrides).length>0)}function It(e,t){try{if(q(e).some(e=>e.id===t))return!0}catch{}try{if(i(e).some(e=>e.id===t))return!0}catch{}let n=bt(e);return!!(n?.modelOverrides&&Object.hasOwn(n.modelOverrides,t))}function K(e){return bt(e)||{id:e,name:e.split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),description:`${e} provider`,requiresApiKey:!0,requiresBaseUrl:!1}}function Lt(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.compat!==void 0&&(e.compat={...e.compat??{},...t.compat}),t.thinkingLevelMap!==void 0&&(e.thinkingLevelMap={...e.thinkingLevelMap??{},...t.thinkingLevelMap})}function q(e){try{if(e===`bedrock-camp`){let e=f(Z(`bedrock-camp`));return Tt(`amazon-bedrock`).filter(t=>d(t,e)).map(e=>({...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`}))}let t=K(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 a())try{for(let t of Tt(e))r.set(t.id,t)}catch{}return n.map(n=>{let i=`${e}-${n.api===`openai`?`openai`:`anthropic`}`,a=r.get(n.id),o;a?o={...a,api:i,provider:e}:(o=Sn(e,n.id,``,i),n.name&&(o.name=n.name));let s=t.modelOverrides?.[n.id];return s&&Lt(o,s),Lt(o,n),o})}if(t.isOAuth){let n=Tt(`anthropic`),r=`${e}-anthropic`;return n.map(n=>{let i={...n,api:r,provider:e},a=t.modelOverrides?.[n.id];return a&&Lt(i,a),i})}return Tt(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 Rt(e){let t=Y().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,expired:n}}var zt=Object.assign({})[`/packages/webapp/providers.json`]??[],J=o(`provider-settings`);function Bt(e=zt){if(e.length===0||Y().length>0)return;let t=new Set(Pt());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}X(n.providerId,n.apiKey,n.baseUrl)}let n=e.find(e=>e.providerId&&e.apiKey&&t.has(e.providerId));n?.model&&!localStorage.getItem(G)&&localStorage.setItem(G,`${n.providerId}:${n.model}`)}var Vt=[/haiku/i];function Ht(e){return Vt.some(t=>t.test(e))}function Ut(e){return e.filter(e=>!Ht(e.id))}function Wt(){let e=Y();if(e.length===0)return[];let t=new Map;for(let n of e){if(t.has(n.providerId))continue;let e=K(n.providerId);if(e.hidden||Ot(n.providerId))continue;let r=Ut(q(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 Y(){At();let e=localStorage.getItem(W);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`object`&&!!e&&typeof e.providerId==`string`&&typeof e.apiKey==`string`):[]}catch{return[]}}function Gt(e){return c(localStorage)[e]??[]}function Kt(e,t){let n=c(localStorage),r=t.map(e=>e.trim()).filter(e=>e.length>0);r.length===0?delete n[e]:n[e]=r,s(localStorage,n)}async function qt(e,t){if(l()){Kt(e,t);return}let n=u();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{s(localStorage,r)}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 Jt(){return c(localStorage)}function Yt(e){localStorage.setItem(W,JSON.stringify(e))}async function Xt(e){if(l()){Yt(e);return}let t=u();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(W,r)}catch(e){J.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{error:e instanceof Error?e.message:String(e)})}}function X(e,t,n,r,i){let a=Y().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),Yt(a)}async function Zt(e){let t=typeof chrome<`u`&&!!chrome?.runtime?.id;try{if(t){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{let t=await fetch(`/api/secrets/oauth/${e}`,{method:`DELETE`});!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,isExtension:t,error:n instanceof Error?n.message:String(n)})}}async function Qt(e){let t=Y().find(t=>t.providerId===e),n=K(e);t&&n?.isOAuth&&await $t(e),await Zt(e),await Xt(Y().filter(t=>t.providerId!==e));let r=localStorage.getItem(G)??``,i=r.indexOf(`:`);i>0&&r.slice(0,i)===e&&localStorage.removeItem(G)}async function $t(e){let t=Y().find(t=>t.providerId===e);if(!t)return;let r=K(e);if(r?.isOAuth){if(r.onOAuthLogout)try{await r.onOAuthLogout()}catch(t){J.warn(`onOAuthLogout failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})}if(r.getOAuthLogoutUrl){let i=r.getOAuthLogoutUrl(t);if(i){let{openIdpLogoutUrl:t}=await n(async()=>{let{openIdpLogoutUrl:e}=await import(`./oauth-service-CTlktxVj.js`);return{openIdpLogoutUrl:e}},__vite__mapDeps([21,2,22,5]));await t(i).catch(t=>{J.warn(`IdP logout popup failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})})}}await Xt(Y().map(t=>t.providerId===e?{providerId:t.providerId,apiKey:``,baseUrl:t.baseUrl,userName:t.userName,userAvatar:t.userAvatar,loggedOut:!0}:t)),await Zt(e)}}async function en(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}}async function tn(e,t,n){let r={providerId:e.providerId,accessToken:e.accessToken,domains:e.domains.join(`,`)},{maskedValue:i,lastError:a}=await en(()=>t.sendMaskRequest(r),n);if(!i){J.error(`OAuth mask give-up: no masked value after retries`,{providerId:e.providerId,reason:a??`no error reported (cold SW or empty reply)`});return}let o=t.getAccounts(),s=o.find(t=>t.providerId===e.providerId);s&&(s.maskedValue=i,await t.saveAccounts(o))}async function nn(e){let t=Y().find(t=>t.providerId===e.providerId),n=Y().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}),await Xt(n);let r=K(e.providerId)?.oauthTokenDomains??[],i=Gt(e.providerId),a=new Set,o=[];for(let e of[...r,...i]){let t=e.toLowerCase();a.has(t)||(a.add(t),o.push(e))}if(o.length===0)return;let s=typeof chrome<`u`&&!!chrome?.runtime?.id;try{if(s)await tn({providerId:e.providerId,accessToken:e.accessToken,domains:o},{sendMaskRequest:t=>new Promise(n=>{chrome.runtime.sendMessage({type:`secrets.mask-oauth-token`,...t},t=>{chrome.runtime.lastError&&J.error(`SW mask-oauth-token transport failed`,{providerId:e.providerId,error:chrome.runtime.lastError.message}),t?.error&&J.warn(`SW mask-oauth-token returned error`,{providerId:e.providerId,error:t.error}),n(t??{})})}),getAccounts:Y,saveAccounts:Xt});else if(!globalThis.__slicc_connect_mode){let t=await fetch(`/api/secrets/oauth-update`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({providerId:e.providerId,accessToken:e.accessToken,domains:o})});if(t.ok){let n=await t.json(),r=Y(),i=r.find(t=>t.providerId===e.providerId);i&&typeof n.maskedValue==`string`&&(i.maskedValue=n.maskedValue,await Xt(r))}else J.warn(`OAuth replica POST non-ok`,{providerId:e.providerId,status:t.status})}}catch(t){J.error(`OAuth replica sync failed`,{providerId:e.providerId,isExtension:s,error:t instanceof Error?t.message:String(t)})}}var rn=`local`;function an(e){let t=Y().find(t=>t.providerId===e);return t&&(t.accessToken||t.apiKey)||null}function on(e){let t=Y().find(t=>t.providerId===e);return t?t.accessToken||t.apiKey||(K(e).optionalApiKey?rn:null):null}function Z(e){return Y().find(t=>t.providerId===e)?.baseUrl??null}function sn(e){return Y().find(t=>t.providerId===e)?.deployment??null}function cn(e){return Y().find(t=>t.providerId===e)?.apiVersion??null}function Q(){let e=localStorage.getItem(G)||``,t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function ln(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t),r=new Set([...xt(),...Pt()]),i=n.includes(`.`);if(r.has(n)||!i){localStorage.setItem(G,e);return}}let n=$();localStorage.setItem(G,`${n}:${e}`)}function un(){return localStorage.getItem(G)||``}function $(){let e=un(),t=e.indexOf(`:`);if(t>0)return e.slice(0,t);let n=Y(),r=Q();if(r){let e=n.find(e=>Ft(e.providerId)&&It(e.providerId,r));if(e)return e.providerId}let i=n.find(e=>Ft(e.providerId));return i?i.providerId:n.length>0?n[0].providerId:`anthropic`}function dn(e){let t=Q();localStorage.setItem(G,`${e}:${t}`)}function fn(){let e=Q();localStorage.setItem(G,e)}function pn(){return on($())}function mn(e){let t=$();X(t,e,Z(t)??void 0)}async function hn(){await Qt($())}function gn(){return Z($())}function _n(e){let t=$(),n=an(t);n&&X(t,n,e||void 0)}function vn(){let e=$(),t=an(e);t&&X(e,t)}function yn(){let e=Y(),t=$(),n=Q();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 bn(){let e=Y();await Promise.allSettled(e.map(e=>Qt(e.providerId))),localStorage.removeItem(W),localStorage.removeItem(G);for(let e of Et)localStorage.removeItem(e)}function xn(e){return/^(?:gpt[-.]?|o[0-9]|chatgpt)/i.test(e)?`openai`:`anthropic`}function Sn(e,t,n,r){return{id:t,name:t,provider:e,api:r??`${e}-${xn(t)}`,baseUrl:n??``,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},reasoning:!0}}function Cn(e,t){return t.isOAuth||e===`azure-ai-foundry`?`anthropic`:e===`bedrock-camp`?`amazon-bedrock`:e}function wn(e){if(!e)return Tn();let t=$(),n=Z(t),r=K(t);try{let i=wt(Cn(t,r),e);if(!i?.id)throw Error(`Model ${e} not found`);let a=i;return r.isOAuth?a=q(t).find(t=>t.id===e)||{...a,api:`${t}-anthropic`,provider:t}:t===`bedrock-camp`&&(a={...a,api:`bedrock-camp-converse`,provider:`bedrock-camp`}),n&&(a={...a,baseUrl:n}),a}catch(i){if(J.debug(`resolveModelById: pi-ai lookup miss, using provider fallback`,{providerId:t,modelId:e,error:i instanceof Error?i.message:String(i)}),r.isOAuth){let r=q(t).find(t=>t.id===e);return r?n?{...r,baseUrl:n}:r:Sn(t,e,n)}return Tn()}}function Tn(){let e=$(),t=Q(),n=Z(e),r=q(e),i=K(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=Cn(e,i),a=wt(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?Sn(e,o,n):wt(`anthropic`,`claude-sonnet-4-0`)}}export{en as A,Kt as B,K as C,$ as D,Q as E,Tn as F,St as G,ln as H,wn as I,yt as K,nn as L,tn as M,Ft as N,Ht as O,Qt as P,mn as R,Rt as S,an as T,dn as U,qt as V,bt as W,Pt as _,Bt as a,sn as b,vn as c,Y as d,Wt as f,cn as g,on as h,X as i,jt as j,$t as k,fn as l,pn as m,Nt as n,bn as o,Jt as p,Ct as r,hn as s,W as t,yn as u,gn as v,q as w,Gt as x,Z as y,_n as z};
|
|
38
|
+
`;return`${e}\n${i}${p}`}else return`${f}${o}${d.join(` `)}${o}${p}`}function $e({indent:e,options:{commentString:t}},n,r,i){if(r&&i&&(r=r.replace(/^\n+/,``)),r){let i=xe(t(r),e);n.push(i.trimStart())}}function B(e,t){let n=w(t)?t.value:t;for(let r of e)if(C(r)&&(r.key===t||r.key===n||w(r.key)&&r.key.value===n))return r}var V=class extends ye{static get tagName(){return`tag:yaml.org,2002:map`}constructor(e){super(h,e),this.items=[]}static from(e,t,n){let{keepUndefined:r,replacer:i}=n,a=new this(e),o=(e,o)=>{if(typeof i==`function`)o=i.call(t,e,o);else if(Array.isArray(i)&&!i.includes(e))return;(o!==void 0||r)&&a.items.push(Ye(e,o,n))};if(t instanceof Map)for(let[e,n]of t)o(e,n);else if(t&&typeof t==`object`)for(let e of Object.keys(t))o(e,t[e]);return typeof e.sortMapEntries==`function`&&a.items.sort(e.sortMapEntries),a}add(e,t){let n;n=C(e)?e:!e||typeof e!=`object`||!(`key`in e)?new z(e,e?.value):new z(e.key,e.value);let r=B(this.items,n.key),i=this.schema?.sortMapEntries;if(r){if(!t)throw Error(`Key ${n.key} already set`);w(r.value)&&pe(n.value)?r.value.value=n.value:r.value=n.value}else if(i){let e=this.items.findIndex(e=>i(n,e)<0);e===-1?this.items.push(n):this.items.splice(e,0,n)}else this.items.push(n)}delete(e){let t=B(this.items,e);return t?this.items.splice(this.items.indexOf(t),1).length>0:!1}get(e,t){let n=B(this.items,e)?.value;return(!t&&w(n)?n.value:n)??void 0}has(e){return!!B(this.items,e)}set(e,t){this.add(new z(e,t),!0)}toJSON(e,t,n){let r=n?new n:t?.mapAsMap?new Map:{};t?.onCreate&&t.onCreate(r);for(let e of this.items)qe(t,r,e);return r}toString(e,t,n){if(!e)return JSON.stringify(this);for(let e of this.items)if(!C(e))throw Error(`Map items must all be pairs; found ${JSON.stringify(e)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),Xe(this,e,{blockItemPrefix:``,flowChars:{start:`{`,end:`}`},itemIndent:e.indent||``,onChompKeep:n,onComment:t})}},et={collection:`map`,default:!0,nodeClass:V,tag:`tag:yaml.org,2002:map`,resolve(e,t){return S(e)||t(`Expected a mapping for this tag`),e},createNode:(e,t,n)=>V.from(e,t,n)},tt=class extends ye{static get tagName(){return`tag:yaml.org,2002:seq`}constructor(e){super(v,e),this.items=[]}add(e){this.items.push(e)}delete(e){let t=nt(e);return typeof t==`number`?this.items.splice(t,1).length>0:!1}get(e,t){let n=nt(e);if(typeof n!=`number`)return;let r=this.items[n];return!t&&w(r)?r.value:r}has(e){let t=nt(e);return typeof t==`number`&&t<this.items.length}set(e,t){let n=nt(e);if(typeof n!=`number`)throw Error(`Expected a valid index, not ${e}.`);let r=this.items[n];w(r)&&pe(t)?r.value=t:this.items[n]=t}toJSON(e,t){let n=[];t?.onCreate&&t.onCreate(n);let r=0;for(let e of this.items)n.push(P(e,String(r++),t));return n}toString(e,t,n){return e?Xe(this,e,{blockItemPrefix:`- `,flowChars:{start:`[`,end:`]`},itemIndent:(e.indent||``)+` `,onChompKeep:n,onComment:t}):JSON.stringify(this)}static from(e,t,n){let{replacer:r}=n,i=new this(e);if(t&&Symbol.iterator in Object(t)){let e=0;for(let a of t){if(typeof r==`function`){let n=t instanceof Set?a:String(e++);a=r.call(t,n,a)}i.items.push(ge(a,void 0,n))}}return i}};function nt(e){let t=w(e)?e.value:e;return t&&typeof t==`string`&&(t=Number(t)),typeof t==`number`&&Number.isInteger(t)&&t>=0?t:null}var rt={collection:`seq`,default:!0,nodeClass:tt,tag:`tag:yaml.org,2002:seq`,resolve(e,t){return T(e)||t(`Expected a sequence for this tag`),e},createNode:(e,t,n)=>tt.from(e,t,n)};function it(e){return typeof e==`bigint`||Number.isInteger(e)}var at=({value:e})=>JSON.stringify(e),ot=[{identify:e=>typeof e==`string`,default:!0,tag:`tag:yaml.org,2002:str`,resolve:e=>e,stringify:at},{identify:e=>e==null,createNode:()=>new F(null),default:!0,tag:`tag:yaml.org,2002:null`,test:/^null$/,resolve:()=>null,stringify:at},{identify:e=>typeof e==`boolean`,default:!0,tag:`tag:yaml.org,2002:bool`,test:/^true$|^false$/,resolve:e=>e===`true`,stringify:at},{identify:it,default:!0,tag:`tag:yaml.org,2002:int`,test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(e,t,{intAsBigInt:n})=>n?BigInt(e):parseInt(e,10),stringify:({value:e})=>it(e)?e.toString():JSON.stringify(e)},{identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:e=>parseFloat(e),stringify:at}];[et,rt].concat(ot,{default:!0,tag:``,test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}});function st(e,t,n){let{replacer:r}=n,i=new tt(e);i.tag=`tag:yaml.org,2002:pairs`;let a=0;if(t&&Symbol.iterator in Object(t))for(let e of t){typeof r==`function`&&(e=r.call(t,String(a++),e));let o,s;if(Array.isArray(e))if(e.length===2)o=e[0],s=e[1];else throw TypeError(`Expected [key, value] tuple: ${e}`);else if(e&&e instanceof Object){let t=Object.keys(e);if(t.length===1)o=t[0],s=e[o];else throw TypeError(`Expected tuple with one key, not ${t.length} keys`)}else o=e;i.items.push(Ye(o,s,n))}return i}var ct=class e extends tt{constructor(){super(),this.add=V.prototype.add.bind(this),this.delete=V.prototype.delete.bind(this),this.get=V.prototype.get.bind(this),this.has=V.prototype.has.bind(this),this.set=V.prototype.set.bind(this),this.tag=e.tag}toJSON(e,t){if(!t)return super.toJSON(e);let n=new Map;t?.onCreate&&t.onCreate(n);for(let e of this.items){let r,i;if(C(e)?(r=P(e.key,``,t),i=P(e.value,r,t)):r=P(e,``,t),n.has(r))throw Error(`Ordered maps must not include duplicate keys`);n.set(r,i)}return n}static from(e,t,n){let r=st(e,t,n),i=new this;return i.items=r.items,i}};ct.tag=`tag:yaml.org,2002:omap`;var lt=class e extends V{constructor(t){super(t),this.tag=e.tag}add(e){let t;t=C(e)?e:e&&typeof e==`object`&&`key`in e&&`value`in e&&e.value===null?new z(e.key,null):new z(e,null),B(this.items,t.key)||this.items.push(t)}get(e,t){let n=B(this.items,e);return!t&&C(n)?w(n.key)?n.key.value:n.key:n}set(e,t){if(typeof t!=`boolean`)throw Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof t}`);let n=B(this.items,e);n&&!t?this.items.splice(this.items.indexOf(n),1):!n&&t&&this.items.push(new z(e))}toJSON(e,t){return super.toJSON(e,t,Set)}toString(e,t,n){if(!e)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},e,{allNullValues:!0}),t,n);throw Error(`Set items must all have null values`)}static from(e,t,n){let{replacer:r}=n,i=new this(e);if(t&&Symbol.iterator in Object(t))for(let e of t)typeof r==`function`&&(e=r.call(t,e,e)),i.items.push(Ye(e,null,n));return i}};lt.tag=`tag:yaml.org,2002:set`;var ut=Symbol(`break visit`),dt=Symbol(`skip children`),ft=Symbol(`remove item`);function H(e,t){`type`in e&&e.type===`document`&&(e={start:e.start,value:e.value}),pt(Object.freeze([]),e,t)}H.BREAK=ut,H.SKIP=dt,H.REMOVE=ft,H.itemAtPath=(e,t)=>{let n=e;for(let[e,r]of t){let t=n?.[e];if(t&&`items`in t)n=t.items[r];else return}return n},H.parentCollection=(e,t)=>{let n=H.itemAtPath(e,t.slice(0,-1)),r=t[t.length-1][0],i=n?.[r];if(i&&`items`in i)return i;throw Error(`Parent collection not found`)};function pt(e,t,n){let r=n(t,e);if(typeof r==`symbol`)return r;for(let i of[`key`,`value`]){let a=t[i];if(a&&`items`in a){for(let t=0;t<a.items.length;++t){let r=pt(Object.freeze(e.concat([[i,t]])),a.items[t],n);if(typeof r==`number`)t=r-1;else if(r===ut)return ut;else r===ft&&(a.items.splice(t,1),--t)}typeof r==`function`&&i===`key`&&(r=r(t,e))}}return typeof r==`function`?r(t,e):r}t(((e,t)=>{function n(e){return Array.isArray(e)?e:[e]}var r=void 0,i=``,a=` `,o=`\\`,s=/^\s+$/,c=/(?:[^\\]|^)\\$/,l=/^\\!/,u=/^\\#/,d=/\r?\n/g,f=/^\.{0,2}\/|^\.{1,2}$/,p=/\/$/,m=`/`,h=`node-ignore`;typeof Symbol<`u`&&(h=Symbol.for(`node-ignore`));var g=h,_=(e,t,n)=>(Object.defineProperty(e,t,{value:n}),n),v=/([0-z])-([0-z])/g,y=()=>!1,b=e=>e.replace(v,(e,t,n)=>t.charCodeAt(0)<=n.charCodeAt(0)?e:i),x=e=>{let{length:t}=e;return e.slice(0,t-t%2)},S=[[/^\uFEFF/,()=>i],[/((?:\\\\)*?)(\\?\s+)$/,(e,t,n)=>t+(n.indexOf(`\\`)===0?a:i)],[/(\\+?)\s/g,(e,t)=>{let{length:n}=t;return t.slice(0,n-n%2)+a}],[/[\\$.|*+(){^]/g,e=>`\\${e}`],[/(?!\\)\?/g,()=>`[^/]`],[/^\//,()=>`^`],[/\//g,()=>`\\/`],[/^\^*\\\*\\\*\\\//,()=>`^(?:.*\\/)?`],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?`^`:`(?:^|\\/)`}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(e,t,n)=>t+6<n.length?`(?:\\/[^\\/]+)*`:`\\/.+`],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(e,t,n)=>t+n.replace(/\\\*/g,`[^\\/]*`)],[/\\\\\\(?=[$.|*+(){^])/g,()=>o],[/\\\\/g,()=>o],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(e,t,n,r,i)=>t===o?`\\[${n}${x(r)}${i}`:i===`]`&&r.length%2==0?`[${b(n)}${r}]`:`[]`],[/(?:[^*])$/,e=>/\/$/.test(e)?`${e}$`:`${e}(?=$|\\/$)`]],C=/(^|\\\/)?\\\*$/,w=`regex`,T=`checkRegex`,E={[w](e,t){return`${t?`${t}[^/]+`:`[^/]*`}(?=$|\\/$)`},[T](e,t){return`${t?`${t}[^/]*`:`[^/]*`}(?=$|\\/$)`}},D=e=>S.reduce((t,[n,r])=>t.replace(n,r.bind(e)),e),O=e=>typeof e==`string`,k=e=>e&&O(e)&&!s.test(e)&&!c.test(e)&&e.indexOf(`#`)!==0,ee=e=>e.split(d).filter(Boolean),A=class{constructor(e,t,n,r,i,a){this.pattern=e,this.mark=t,this.negative=i,_(this,`body`,n),_(this,`ignoreCase`,r),_(this,`regexPrefix`,a)}get regex(){let e=`_regex`;return this[e]?this[e]:this._make(w,e)}get checkRegex(){let e=`_checkRegex`;return this[e]?this[e]:this._make(T,e)}_make(e,t){let n=this.regexPrefix.replace(C,E[e]),r=this.ignoreCase?new RegExp(n,`i`):new RegExp(n);return _(this,t,r)}},j=({pattern:e,mark:t},n)=>{let r=!1,i=e;i.indexOf(`!`)===0&&(r=!0,i=i.substr(1)),i=i.replace(l,`!`).replace(u,`#`);let a=D(i);return new A(e,t,i,n,r,a)},M=class{constructor(e){this._ignoreCase=e,this._rules=[]}_add(e){if(e&&e[g]){this._rules=this._rules.concat(e._rules._rules),this._added=!0;return}if(O(e)&&(e={pattern:e}),k(e.pattern)){let t=j(e,this._ignoreCase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,n(O(e)?ee(e):e).forEach(this._add,this),this._added}test(e,t,n){let i=!1,a=!1,o;this._rules.forEach(s=>{let{negative:c}=s;a===c&&i!==a||c&&!i&&!a&&!t||s[n].test(e)&&(i=!c,a=c,o=c?r:s)});let s={ignored:i,unignored:a};return o&&(s.rule=o),s}},te=(e,t)=>{throw new t(e)},N=(e,t,n)=>O(e)?e?N.isNotRelative(e)?n(`path should be a \`path.relative()\`d string, but got "${t}"`,RangeError):!0:n(`path must not be empty`,TypeError):n(`path must be a string, but got \`${t}\``,TypeError),ne=e=>f.test(e);N.isNotRelative=ne,N.convert=e=>e;var re=class{constructor({ignorecase:e=!0,ignoreCase:t=e,allowRelativePaths:n=!1}={}){_(this,g,!0),this._rules=new M(t),this._strictPathCheck=!n,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(e){return this._rules.add(e)&&this._initCache(),this}addPattern(e){return this.add(e)}_test(e,t,n,r){let i=e&&N.convert(e);return N(i,e,this._strictPathCheck?te:y),this._t(i,t,n,r)}checkIgnore(e){if(!p.test(e))return this.test(e);let t=e.split(m).filter(Boolean);if(t.pop(),t.length){let e=this._t(t.join(m)+m,this._testCache,!0,t);if(e.ignored)return e}return this._rules.test(e,!1,T)}_t(e,t,n,r){if(e in t)return t[e];if(r||=e.split(m).filter(Boolean),r.pop(),!r.length)return t[e]=this._rules.test(e,n,w);let i=this._t(r.join(m)+m,t,n,r);return t[e]=i.ignored?i:this._rules.test(e,n,w)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return n(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},ie=e=>new re(e),ae=e=>N(e&&N.convert(e),e,y),oe=()=>{N.convert=e=>/^\\\\\?\\/.test(e)||/["<>|\u0000-\u001F]+/u.test(e)?e:e.replace(/\\/g,`/`);let e=/^[a-z]:\//i;N.isNotRelative=t=>e.test(t)||ne(t)};typeof process<`u`&&process.platform===`win32`&&oe(),t.exports=ie,ie.default=ie,t.exports.isPathValid=ae,_(t.exports,Symbol.for(`setupWindows`),oe)}))(),globalThis.Buffer,o(`secret-scrub`),o(`image-processor`),o(`tool-adapter`);var mt=Object.assign({"/packages/dev-tools/providers.build.json":{include:[`*`],exclude:[`amazon-bedrock`]}})[`/packages/dev-tools/providers.build.json`]??{include:[`*`],exclude:[]};function ht(e){let{include:t,exclude:n}=mt;return n.includes(`*`)||n.includes(e)?!1:!!(t.includes(`*`)||t.includes(e))}var gt=Object.assign({"./built-in/azure-ai-foundry.ts":()=>n(()=>import(`./azure-ai-foundry-Bo0FAJyX.js`),[]),"./built-in/azure-openai.ts":()=>n(()=>import(`./azure-openai-CTCrw8ag.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])),"./built-in/bedrock-camp.ts":()=>n(()=>import(`./bedrock-camp-9-QEmC9Z.js`).then(e=>e.n),__vite__mapDeps([13,5,1,2,3,4,6,7])),"./built-in/local-llm.ts":()=>n(()=>import(`./local-llm-77SlLHlX.js`),__vite__mapDeps([14,1,2,3,4,5,6,15,16,17,7,18,19,8,11]))}),_t=Object.assign({"/packages/webapp/providers/adobe.ts":()=>n(()=>import(`./adobe-D8jV1ibX.js`),__vite__mapDeps([20,2,1,3,4,5,6,9,10,11,12,13,7,21,22,23,24])),"/packages/webapp/providers/github-copilot.ts":()=>n(()=>import(`./github-copilot-yWe1M0K_.js`),__vite__mapDeps([25,2,1,3,4,5,6,9,10,11,12])),"/packages/webapp/providers/github.ts":()=>n(()=>import(`./github-BjJwZAID.js`),__vite__mapDeps([26,2,9,5,10,11,12,27,21,22,23])),"/packages/webapp/providers/openai-codex.ts":()=>n(()=>import(`./openai-codex-BG86bd3g.js`),__vite__mapDeps([28,1,2,3,4,5,6,9,10,11,12])),"/packages/webapp/providers/xai-grok-errors.ts":()=>n(()=>import(`./xai-grok-errors-bnlIBeu-.js`),[]),"/packages/webapp/providers/xai-grok-models.ts":()=>n(()=>import(`./xai-grok-models-CeEBaUMC.js`),[]),"/packages/webapp/providers/xai-grok-sanitize.ts":()=>n(()=>import(`./xai-grok-sanitize-CR2JoOJd.js`),__vite__mapDeps([29,30])),"/packages/webapp/providers/xai-grok.ts":()=>n(()=>import(`./xai-grok-D7ULF1Ef.js`),__vite__mapDeps([31,1,2,3,4,5,6,9,10,11,12,32,30,29]))}),U=new Map,vt=null;function yt(){return vt||(vt=(async()=>{for(let[e,t]of Object.entries(gt)){let e=await t();e.config&&ht(e.config.id)&&(U.set(e.config.id,e.config),e.register?.())}for(let[e,t]of Object.entries(_t)){let e=await t();e.config&&(U.set(e.config.id,e.config),e.register?.())}})(),vt)}function bt(e){return U.get(e)}function xt(){return[...U.keys()]}function St(e){U.set(e.id,e)}var Ct=e({ACCOUNTS_KEY:()=>W,__test__:()=>Nt,addAccount:()=>X,applyProviderDefaults:()=>Bt,clearAllSettings:()=>bn,clearApiKey:()=>hn,clearBaseUrl:()=>vn,clearSelectedProvider:()=>fn,exportProviders:()=>yn,getAccounts:()=>Y,getAllAvailableModels:()=>Wt,getAllExtraOAuthDomains:()=>Jt,getApiKey:()=>pn,getApiKeyForProvider:()=>on,getApiVersionForProvider:()=>cn,getAvailableProviders:()=>Pt,getBaseUrl:()=>gn,getBaseUrlForProvider:()=>Z,getDeploymentForProvider:()=>sn,getExtraOAuthDomains:()=>Gt,getOAuthAccountInfo:()=>Rt,getProviderConfig:()=>K,getProviderModels:()=>q,getRawApiKeyForProvider:()=>an,getSelectedModelId:()=>Q,getSelectedProvider:()=>$,isModelHiddenFromPicker:()=>Ht,logoutOAuthAccount:()=>$t,maskOAuthTokenWithRetry:()=>en,migrateLegacyAuthOnlySelection:()=>jt,persistOAuthMaskViaServiceWorker:()=>tn,providerOffersLlmModels:()=>Ft,removeAccount:()=>Qt,resolveCurrentModel:()=>Tn,resolveModelById:()=>wn,saveOAuthAccount:()=>nn,setApiKey:()=>mn,setBaseUrl:()=>_n,setExtraOAuthDomains:()=>Kt,setExtraOAuthDomainsAsync:()=>qt,setSelectedModelId:()=>ln,setSelectedProvider:()=>dn}),wt=r,Tt=i,W=`slicc_accounts`,G=`selected-model`,Et=[`slicc_provider`,`slicc_api_key`,`slicc_base_url`,`anthropic_api_key`,`api_provider`,`azure_resource`,`bedrock_region`],Dt=new Set([`github`]);function Ot(e){let t;try{t=a()}catch{return!1}return t.includes(e)&&!ht(e)}var kt=!1;function At(){if(!kt){kt=!0;for(let e of Et)try{localStorage.removeItem(e)}catch{}jt()}}function jt(){try{let e=localStorage.getItem(G);if(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t);(Dt.has(n)||Ot(n))&&localStorage.removeItem(G)}}}catch{}try{let e=localStorage.getItem(W);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`&&Ot(e.providerId)));n.length!==t.length&&localStorage.setItem(W,JSON.stringify(n))}catch{}}function Mt(){kt=!1}var Nt={_resetLegacyCleanup:Mt};function Pt(){let e=a().filter(ht),t=xt();return[...new Set([...e,...t])].filter(e=>!bt(e)?.hidden)}function Ft(e){try{if(q(e).length>0)return!0}catch{}try{if(i(e).length>0)return!0}catch{}let t=bt(e);return!!(t?.modelOverrides&&Object.keys(t.modelOverrides).length>0)}function It(e,t){try{if(q(e).some(e=>e.id===t))return!0}catch{}try{if(i(e).some(e=>e.id===t))return!0}catch{}let n=bt(e);return!!(n?.modelOverrides&&Object.hasOwn(n.modelOverrides,t))}function K(e){return bt(e)||{id:e,name:e.split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),description:`${e} provider`,requiresApiKey:!0,requiresBaseUrl:!1}}function Lt(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.compat!==void 0&&(e.compat={...e.compat??{},...t.compat}),t.thinkingLevelMap!==void 0&&(e.thinkingLevelMap={...e.thinkingLevelMap??{},...t.thinkingLevelMap})}function q(e){try{if(e===`bedrock-camp`){let e=f(Z(`bedrock-camp`));return Tt(`amazon-bedrock`).filter(t=>d(t,e)).map(e=>({...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`}))}let t=K(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 a())try{for(let t of Tt(e))r.set(t.id,t)}catch{}return n.map(n=>{let i=`${e}-${n.api===`openai`?`openai`:`anthropic`}`,a=r.get(n.id),o;a?o={...a,api:i,provider:e}:(o=Sn(e,n.id,``,i),n.name&&(o.name=n.name));let s=t.modelOverrides?.[n.id];return s&&Lt(o,s),Lt(o,n),o})}if(t.isOAuth){let n=Tt(`anthropic`),r=`${e}-anthropic`;return n.map(n=>{let i={...n,api:r,provider:e},a=t.modelOverrides?.[n.id];return a&&Lt(i,a),i})}return Tt(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 Rt(e){let t=Y().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,expired:n}}var zt=Object.assign({})[`/packages/webapp/providers.json`]??[],J=o(`provider-settings`);function Bt(e=zt){if(e.length===0||Y().length>0)return;let t=new Set(Pt());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}X(n.providerId,n.apiKey,n.baseUrl)}let n=e.find(e=>e.providerId&&e.apiKey&&t.has(e.providerId));n?.model&&!localStorage.getItem(G)&&localStorage.setItem(G,`${n.providerId}:${n.model}`)}var Vt=[/haiku/i];function Ht(e){return Vt.some(t=>t.test(e))}function Ut(e){return e.filter(e=>!Ht(e.id))}function Wt(){let e=Y();if(e.length===0)return[];let t=new Map;for(let n of e){if(t.has(n.providerId))continue;let e=K(n.providerId);if(e.hidden||Ot(n.providerId))continue;let r=Ut(q(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 Y(){At();let e=localStorage.getItem(W);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`object`&&!!e&&typeof e.providerId==`string`&&typeof e.apiKey==`string`):[]}catch{return[]}}function Gt(e){return c(localStorage)[e]??[]}function Kt(e,t){let n=c(localStorage),r=t.map(e=>e.trim()).filter(e=>e.length>0);r.length===0?delete n[e]:n[e]=r,s(localStorage,n)}async function qt(e,t){if(l()){Kt(e,t);return}let n=u();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{s(localStorage,r)}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 Jt(){return c(localStorage)}function Yt(e){localStorage.setItem(W,JSON.stringify(e))}async function Xt(e){if(l()){Yt(e);return}let t=u();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(W,r)}catch(e){J.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{error:e instanceof Error?e.message:String(e)})}}function X(e,t,n,r,i){let a=Y().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),Yt(a)}async function Zt(e){let t=typeof chrome<`u`&&!!chrome?.runtime?.id;try{if(t){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{let t=await fetch(`/api/secrets/oauth/${e}`,{method:`DELETE`});!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,isExtension:t,error:n instanceof Error?n.message:String(n)})}}async function Qt(e){let t=Y().find(t=>t.providerId===e),n=K(e);t&&n?.isOAuth&&await $t(e),await Zt(e),await Xt(Y().filter(t=>t.providerId!==e));let r=localStorage.getItem(G)??``,i=r.indexOf(`:`);i>0&&r.slice(0,i)===e&&localStorage.removeItem(G)}async function $t(e){let t=Y().find(t=>t.providerId===e);if(!t)return;let r=K(e);if(r?.isOAuth){if(r.onOAuthLogout)try{await r.onOAuthLogout()}catch(t){J.warn(`onOAuthLogout failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})}if(r.getOAuthLogoutUrl){let i=r.getOAuthLogoutUrl(t);if(i){let{openIdpLogoutUrl:t}=await n(async()=>{let{openIdpLogoutUrl:e}=await import(`./oauth-service-CoJ-pYVD.js`);return{openIdpLogoutUrl:e}},__vite__mapDeps([21,2,22,5,23]));await t(i).catch(t=>{J.warn(`IdP logout popup failed`,{providerId:e,error:t instanceof Error?t.message:String(t)})})}}await Xt(Y().map(t=>t.providerId===e?{providerId:t.providerId,apiKey:``,baseUrl:t.baseUrl,userName:t.userName,userAvatar:t.userAvatar,loggedOut:!0}:t)),await Zt(e)}}async function en(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}}async function tn(e,t,n){let r={providerId:e.providerId,accessToken:e.accessToken,domains:e.domains.join(`,`)},{maskedValue:i,lastError:a}=await en(()=>t.sendMaskRequest(r),n);if(!i){J.error(`OAuth mask give-up: no masked value after retries`,{providerId:e.providerId,reason:a??`no error reported (cold SW or empty reply)`});return}let o=t.getAccounts(),s=o.find(t=>t.providerId===e.providerId);s&&(s.maskedValue=i,await t.saveAccounts(o))}async function nn(e){let t=Y().find(t=>t.providerId===e.providerId),n=Y().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}),await Xt(n);let r=K(e.providerId)?.oauthTokenDomains??[],i=Gt(e.providerId),a=new Set,o=[];for(let e of[...r,...i]){let t=e.toLowerCase();a.has(t)||(a.add(t),o.push(e))}if(o.length===0)return;let s=typeof chrome<`u`&&!!chrome?.runtime?.id;try{if(s)await tn({providerId:e.providerId,accessToken:e.accessToken,domains:o},{sendMaskRequest:t=>new Promise(n=>{chrome.runtime.sendMessage({type:`secrets.mask-oauth-token`,...t},t=>{chrome.runtime.lastError&&J.error(`SW mask-oauth-token transport failed`,{providerId:e.providerId,error:chrome.runtime.lastError.message}),t?.error&&J.warn(`SW mask-oauth-token returned error`,{providerId:e.providerId,error:t.error}),n(t??{})})}),getAccounts:Y,saveAccounts:Xt});else if(!globalThis.__slicc_connect_mode){let t=await fetch(`/api/secrets/oauth-update`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({providerId:e.providerId,accessToken:e.accessToken,domains:o})});if(t.ok){let n=await t.json(),r=Y(),i=r.find(t=>t.providerId===e.providerId);i&&typeof n.maskedValue==`string`&&(i.maskedValue=n.maskedValue,await Xt(r))}else J.warn(`OAuth replica POST non-ok`,{providerId:e.providerId,status:t.status})}}catch(t){J.error(`OAuth replica sync failed`,{providerId:e.providerId,isExtension:s,error:t instanceof Error?t.message:String(t)})}}var rn=`local`;function an(e){let t=Y().find(t=>t.providerId===e);return t&&(t.accessToken||t.apiKey)||null}function on(e){let t=Y().find(t=>t.providerId===e);return t?t.accessToken||t.apiKey||(K(e).optionalApiKey?rn:null):null}function Z(e){return Y().find(t=>t.providerId===e)?.baseUrl??null}function sn(e){return Y().find(t=>t.providerId===e)?.deployment??null}function cn(e){return Y().find(t=>t.providerId===e)?.apiVersion??null}function Q(){let e=localStorage.getItem(G)||``,t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function ln(e){let t=e.indexOf(`:`);if(t>0){let n=e.slice(0,t),r=new Set([...xt(),...Pt()]),i=n.includes(`.`);if(r.has(n)||!i){localStorage.setItem(G,e);return}}let n=$();localStorage.setItem(G,`${n}:${e}`)}function un(){return localStorage.getItem(G)||``}function $(){let e=un(),t=e.indexOf(`:`);if(t>0)return e.slice(0,t);let n=Y(),r=Q();if(r){let e=n.find(e=>Ft(e.providerId)&&It(e.providerId,r));if(e)return e.providerId}let i=n.find(e=>Ft(e.providerId));return i?i.providerId:n.length>0?n[0].providerId:`anthropic`}function dn(e){let t=Q();localStorage.setItem(G,`${e}:${t}`)}function fn(){let e=Q();localStorage.setItem(G,e)}function pn(){return on($())}function mn(e){let t=$();X(t,e,Z(t)??void 0)}async function hn(){await Qt($())}function gn(){return Z($())}function _n(e){let t=$(),n=an(t);n&&X(t,n,e||void 0)}function vn(){let e=$(),t=an(e);t&&X(e,t)}function yn(){let e=Y(),t=$(),n=Q();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 bn(){let e=Y();await Promise.allSettled(e.map(e=>Qt(e.providerId))),localStorage.removeItem(W),localStorage.removeItem(G);for(let e of Et)localStorage.removeItem(e)}function xn(e){return/^(?:gpt[-.]?|o[0-9]|chatgpt)/i.test(e)?`openai`:`anthropic`}function Sn(e,t,n,r){return{id:t,name:t,provider:e,api:r??`${e}-${xn(t)}`,baseUrl:n??``,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},reasoning:!0}}function Cn(e,t){return t.isOAuth||e===`azure-ai-foundry`?`anthropic`:e===`bedrock-camp`?`amazon-bedrock`:e}function wn(e){if(!e)return Tn();let t=$(),n=Z(t),r=K(t);try{let i=wt(Cn(t,r),e);if(!i?.id)throw Error(`Model ${e} not found`);let a=i;return r.isOAuth?a=q(t).find(t=>t.id===e)||{...a,api:`${t}-anthropic`,provider:t}:t===`bedrock-camp`&&(a={...a,api:`bedrock-camp-converse`,provider:`bedrock-camp`}),n&&(a={...a,baseUrl:n}),a}catch(i){if(J.debug(`resolveModelById: pi-ai lookup miss, using provider fallback`,{providerId:t,modelId:e,error:i instanceof Error?i.message:String(i)}),r.isOAuth){let r=q(t).find(t=>t.id===e);return r?n?{...r,baseUrl:n}:r:Sn(t,e,n)}return Tn()}}function Tn(){let e=$(),t=Q(),n=Z(e),r=q(e),i=K(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=Cn(e,i),a=wt(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?Sn(e,o,n):wt(`anthropic`,`claude-sonnet-4-0`)}}export{en as A,Kt as B,K as C,$ as D,Q as E,Tn as F,St as G,ln as H,wn as I,yt as K,nn as L,tn as M,Ft as N,Ht as O,Qt as P,mn as R,Rt as S,an as T,dn as U,qt as V,bt as W,Pt as _,Bt as a,sn as b,vn as c,Y as d,Wt as f,cn as g,on as h,X as i,jt as j,$t as k,fn as l,pn as m,Nt as n,bn as o,Jt as p,Ct as r,hn as s,W as t,yn as u,gn as v,q as w,Gt as x,Z as y,_n as z};
|