sliccy 4.3.1 → 4.5.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/index.js +645 -1550
- package/dist/node-server/routes/fetch-proxy.d.ts +12 -0
- package/dist/node-server/routes/fetch-proxy.js +316 -0
- package/dist/node-server/routes/handoff.d.ts +48 -0
- package/dist/node-server/routes/handoff.js +60 -0
- package/dist/node-server/routes/lick-api.d.ts +7 -0
- package/dist/node-server/routes/lick-api.js +129 -0
- package/dist/node-server/routes/lick-bridge.d.ts +16 -0
- package/dist/node-server/routes/lick-bridge.js +73 -0
- package/dist/node-server/routes/oauth-callback.d.ts +11 -0
- package/dist/node-server/routes/oauth-callback.js +62 -0
- package/dist/node-server/routes/secrets.d.ts +17 -0
- package/dist/node-server/routes/secrets.js +204 -0
- package/dist/node-server/ui-serving.d.ts +18 -0
- package/dist/node-server/ui-serving.js +91 -0
- package/dist/ui/assets/{account-store-BJJ5koV6.js → account-store-C1ZfhTK1.js} +2 -2
- package/dist/ui/assets/{account-store-DAZSl2RR.js → account-store-DRL4A-Ru.js} +2 -2
- package/dist/ui/assets/{adobe-BEppKv52.js → adobe-CMdazkCY.js} +1 -1
- package/dist/ui/assets/{adobe-CQg9LKPF.js → adobe-DvNK5WQI.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-CXgyVOmd.js → agent-message-to-chat-CL5EAbmJ.js} +1 -1
- package/dist/ui/assets/{apps-RfBlK6cX.js → apps-DBq6U-lx.js} +1 -1
- package/dist/ui/assets/{azure-openai-CoX9vWu2.js → azure-openai-C1UBrpLV.js} +1 -1
- package/dist/ui/assets/{azure-openai-KwIWdsss.js → azure-openai-QjjnqvLS.js} +1 -1
- package/dist/ui/assets/{bsh-watchdog-DA6OkxnZ.js → bsh-watchdog-efC4nmy5.js} +1 -1
- package/dist/ui/assets/{connect-surface-43hJgHGT.js → connect-surface-yQ76sy4W.js} +1 -1
- package/dist/ui/assets/dip-CsTIFJgu.js +1 -0
- package/dist/ui/assets/{dist-BfDQL5YL.js → dist-C61m0s11.js} +1 -1
- package/dist/ui/assets/{dist-BRutuC1w.js → dist-DgvPtJle.js} +1 -1
- package/dist/ui/assets/{es-B21LREST.js → es-CIdEpLFA.js} +1 -1
- package/dist/ui/assets/{fs-BUjc4jrN.js → fs-DLPuUNHV.js} +2 -2
- package/dist/ui/assets/{fs-CNNIA2b2.js → fs-DONXnCO6.js} +1 -1
- package/dist/ui/assets/{github-CW8Tthe2.js → github-DSWrD8bq.js} +1 -1
- package/dist/ui/assets/{github-DX27yfOl.js → github-Dw4y8tJ1.js} +2 -2
- package/dist/ui/assets/{github-copilot-C-_uEuwb.js → github-copilot-5bS-76bh.js} +1 -1
- package/dist/ui/assets/{github-copilot-D3RdyeQI.js → github-copilot-BGPlopaI.js} +1 -1
- package/dist/ui/assets/{hear-BOHY1XgC.js → hear-CFhY5lnj.js} +1 -1
- package/dist/ui/assets/{kernel-worker-CBwgvoVr.js → kernel-worker-U2pdGEcm.js} +631 -631
- package/dist/ui/assets/{kokoro-engine-BpkUzY1i.js → kokoro-engine-CWlN3DkD.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-BfFahI9u.js → lick-ws-bridge-D-5VQrxa.js} +1 -1
- package/dist/ui/assets/{local-llm-CggFkqmI.js → local-llm-x5RnDA7B.js} +1 -1
- package/dist/ui/assets/{main-Bj_ZnhJb.js → main-B3wJxNAn.js} +3 -3
- package/dist/ui/assets/{mount-CL_CZ0Mw.js → mount-CXCPRGEQ.js} +2 -2
- package/dist/ui/assets/{mount-CfNqKHdA.js → mount-DGFNLTRM.js} +1 -1
- package/dist/ui/assets/{new-session-DF3Nmlnr.js → new-session-BG0Fak9U.js} +1 -1
- package/dist/ui/assets/{oauth-bootstrap-Cm9R5n39.js → oauth-bootstrap-Q3TH-iaj.js} +2 -2
- package/dist/ui/assets/{openai-codex-BZaQhZ9p.js → openai-codex-DZr2BkNe.js} +1 -1
- package/dist/ui/assets/{openai-codex-BOUDpgXE.js → openai-codex-oVa9_iUN.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-iZ8zKd5I.js → panel-rpc-handlers-f_RVs4A8.js} +1 -1
- package/dist/ui/assets/{provider-BaMv5vAw.js → provider-BCCx6rSj.js} +1 -1
- package/dist/ui/assets/{provider-BEa9VYQR.js → provider-Cq7CZBnu.js} +2 -2
- package/dist/ui/assets/provider-store-access-Bj2CShPs.js +1 -0
- package/dist/ui/assets/provider-store-access-BsBKI0HK.js +1 -0
- package/dist/ui/assets/{providers-CEXR1HJ-.js → providers-CfaSIe2i.js} +1 -1
- package/dist/ui/assets/{quick-llm-Bw9f5yg-.js → quick-llm-DAxgX-Q-.js} +1 -1
- package/dist/ui/assets/session-freezer-BtOs5CVA.js +1 -0
- package/dist/ui/assets/setup-sudo-DIFOUA5_.js +1 -0
- package/dist/ui/assets/{speak-Gox4T20Z.js → speak-B9udBKl2.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-DhY2ZOCW.js → sprinkle-manager-BjVP7wBM.js} +1 -1
- package/dist/ui/assets/{store-Bc7A_0Yc.js → store-RUY0kc-Y.js} +1 -1
- package/dist/ui/assets/{sudo-BCc4yvx3.js → sudo-DSWs7-95.js} +1 -1
- package/dist/ui/assets/{transformers-env-C1hwuvV2.js → transformers-env-EeU3AbXE.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-F226tJcg.js → tray-leave-runtime-BeZf8bPZ.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-Bo-CGczJ.js → upgrade-detection-Ac_hsZDf.js} +1 -1
- package/dist/ui/assets/{wc-attach-BLvxK0mJ.js → wc-attach-BsFPgqLi.js} +2 -2
- package/dist/ui/assets/{wc-detached-C8hfWbpo.js → wc-detached-Dx6f7WQ-.js} +1 -1
- package/dist/ui/assets/{wc-extension-eovabBSz.js → wc-extension-DCUk4lv_.js} +2 -2
- package/dist/ui/assets/{wc-live-CS1gOsoy.js → wc-live-CQyyOWQK.js} +5 -5
- package/dist/ui/assets/wc-nav-DYDZQQ9U.js +2 -0
- package/dist/ui/assets/{wc-onboarding-BVjQVwRF.js → wc-onboarding-VBsrKnAX.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-bzOBNRjt.js → wc-placeholder-BCSsNKoJ.js} +2 -2
- package/dist/ui/assets/{wc-settings-Dv17H7zn.js → wc-settings-B-LMAhMh.js} +2 -2
- package/dist/ui/assets/{wc-shell-CiUfQN5d.js → wc-shell-sjVj57Ki.js} +162 -99
- package/dist/ui/assets/{wc-sprinkles-BlZTOPAT.js → wc-sprinkles-CV303QxU.js} +2 -2
- package/dist/ui/assets/{wc-tray-CbcIbhiR.js → wc-tray-CEyMfUTG.js} +3 -3
- package/dist/ui/assets/{xai-grok-C4VwA4iM.js → xai-grok-CW5FvgTv.js} +1 -1
- package/dist/ui/assets/{xai-grok-BGM5yYfR.js → xai-grok-okkOqw0L.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/ui/packages/webapp/index.html +2 -2
- package/package.json +6 -5
- package/dist/ui/assets/dip-Cram-Ilm.js +0 -1
- package/dist/ui/assets/provider-store-access-BYfwZYtS.js +0 -1
- package/dist/ui/assets/provider-store-access-DWZbQzMb.js +0 -1
- package/dist/ui/assets/session-freezer-BFN8KSY_.js +0 -1
- package/dist/ui/assets/setup-sudo-CsI18ELm.js +0 -1
- package/dist/ui/assets/wc-nav-DEAIjLZF.js +0 -2
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* Generic OAuth redirect target for OAuth providers (implicit + PKCE).
|
|
4
|
+
*
|
|
5
|
+
* The callback page tries `window.opener.postMessage` first (works in the
|
|
6
|
+
* CLI popup flow). When `window.opener` is null (Electron overlay opens the
|
|
7
|
+
* system browser), it falls back to POSTing the result to
|
|
8
|
+
* `/api/oauth-result`, which the UI polls via the GET counterpart — the
|
|
9
|
+
* server holds the single pending result in memory between the two calls.
|
|
10
|
+
*/
|
|
11
|
+
export function registerOAuthCallbackRoutes(app) {
|
|
12
|
+
// Pending OAuth result for server-side relay (Electron overlay can't use window.opener)
|
|
13
|
+
let pendingOAuthResult = null;
|
|
14
|
+
app.get('/auth/callback', (_req, res) => {
|
|
15
|
+
res.send(`<!DOCTYPE html><html><body><script>
|
|
16
|
+
var q = new URLSearchParams(location.search);
|
|
17
|
+
var h = new URLSearchParams(location.hash.replace(/^#/, ''));
|
|
18
|
+
var payload = {
|
|
19
|
+
type: 'oauth-callback',
|
|
20
|
+
redirectUrl: location.href,
|
|
21
|
+
code: q.get('code'),
|
|
22
|
+
state: q.get('state') || h.get('state'),
|
|
23
|
+
error: q.get('error') || h.get('error'),
|
|
24
|
+
access_token: h.get('access_token'),
|
|
25
|
+
expires_in: h.get('expires_in'),
|
|
26
|
+
token_type: h.get('token_type')
|
|
27
|
+
};
|
|
28
|
+
if (window.opener) {
|
|
29
|
+
window.opener.postMessage(payload, '*');
|
|
30
|
+
} else {
|
|
31
|
+
fetch('/api/oauth-result', {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers: { 'Content-Type': 'application/json' },
|
|
34
|
+
body: JSON.stringify(payload)
|
|
35
|
+
}).catch(function(err) { console.error('[oauth-callback] Failed to relay result to server:', err); });
|
|
36
|
+
}
|
|
37
|
+
window.close();
|
|
38
|
+
</script><p>Completing login... you can close this window.</p></body></html>`);
|
|
39
|
+
});
|
|
40
|
+
app.post('/api/oauth-result', express.json(), (req, res) => {
|
|
41
|
+
const body = req.body;
|
|
42
|
+
const redirectUrl = typeof body.redirectUrl === 'string' ? body.redirectUrl : '';
|
|
43
|
+
if (!redirectUrl) {
|
|
44
|
+
console.warn('[oauth-result] Received callback with empty redirectUrl');
|
|
45
|
+
}
|
|
46
|
+
pendingOAuthResult = {
|
|
47
|
+
redirectUrl,
|
|
48
|
+
error: typeof body.error === 'string' ? body.error : undefined,
|
|
49
|
+
};
|
|
50
|
+
res.json({ ok: true });
|
|
51
|
+
});
|
|
52
|
+
app.get('/api/oauth-result', (_req, res) => {
|
|
53
|
+
if (pendingOAuthResult) {
|
|
54
|
+
const result = pendingOAuthResult;
|
|
55
|
+
pendingOAuthResult = null;
|
|
56
|
+
res.json(result);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
res.status(204).end();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Express } from 'express';
|
|
2
|
+
import type { EnvSecretStore } from '../secrets/env-secret-store.js';
|
|
3
|
+
import type { OauthSecretStore } from '../secrets/oauth-secret-store.js';
|
|
4
|
+
import type { SecretProxyManager } from '../secrets/proxy-manager.js';
|
|
5
|
+
export interface SecretRoutesDeps {
|
|
6
|
+
secretStore: EnvSecretStore;
|
|
7
|
+
secretProxy: SecretProxyManager;
|
|
8
|
+
oauthStore: OauthSecretStore;
|
|
9
|
+
/** When true, the full sign-and-forward error is logged for the local operator. */
|
|
10
|
+
devMode: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Secret management API — direct .env file access (no browser needed). The
|
|
14
|
+
* `secretStore` is wired into `secretProxy` so the fetch-proxy and the
|
|
15
|
+
* management API share one source of truth.
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerSecretRoutes(app: Express, deps: SecretRoutesDeps): void;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { previewSecret } from '../_shared/index.js';
|
|
2
|
+
import express from 'express';
|
|
3
|
+
import { handleDaSignAndForward, handleS3SignAndForward } from '../secrets/sign-and-forward.js';
|
|
4
|
+
/**
|
|
5
|
+
* Sign-and-forward failure responder. Logs only a generic line + trace id —
|
|
6
|
+
* the err.message can carry profile names, bucket names, or partial URLs we
|
|
7
|
+
* don't want in shared log aggregators. The trace id lets the user correlate
|
|
8
|
+
* the 500 they got with the server log; the detail goes to the file logger
|
|
9
|
+
* (above DEBUG) only when devMode is on.
|
|
10
|
+
*/
|
|
11
|
+
function respondSignAndForwardError(res, err, devMode, label) {
|
|
12
|
+
const traceId = (globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2, 10)).slice(0, 8);
|
|
13
|
+
console.error(`${label} sign-and-forward error [trace=${traceId}]`);
|
|
14
|
+
if (devMode) {
|
|
15
|
+
console.error(err);
|
|
16
|
+
}
|
|
17
|
+
if (!res.headersSent) {
|
|
18
|
+
res.status(500).json({
|
|
19
|
+
ok: false,
|
|
20
|
+
error: `internal sign-and-forward error [trace=${traceId}]`,
|
|
21
|
+
errorCode: 'internal',
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function isStringArray(value) {
|
|
26
|
+
return Array.isArray(value) && value.every((d) => typeof d === 'string');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Secret management API — direct .env file access (no browser needed). The
|
|
30
|
+
* `secretStore` is wired into `secretProxy` so the fetch-proxy and the
|
|
31
|
+
* management API share one source of truth.
|
|
32
|
+
*/
|
|
33
|
+
export function registerSecretRoutes(app, deps) {
|
|
34
|
+
const { secretStore, secretProxy, oauthStore, devMode } = deps;
|
|
35
|
+
app.get('/api/secrets', (_req, res) => {
|
|
36
|
+
try {
|
|
37
|
+
res.json(secretStore.list());
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
res
|
|
41
|
+
.status(500)
|
|
42
|
+
.json({ error: err instanceof Error ? err.message : 'Failed to list secrets' });
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
// Persisted-set — write a secret to ~/.slicc/secrets.env. Gated by the agent's
|
|
46
|
+
// intrinsic sudo prompt before the request is ever sent.
|
|
47
|
+
app.post('/api/secrets', express.json(), async (req, res) => {
|
|
48
|
+
const { name, value, domains } = req.body ?? {};
|
|
49
|
+
if (typeof name !== 'string' || typeof value !== 'string' || !isStringArray(domains)) {
|
|
50
|
+
return res.status(400).json({ error: 'bad-request' });
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
secretStore.set(name, value, domains);
|
|
54
|
+
await secretProxy.reload();
|
|
55
|
+
res.json({ ok: true });
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
res.status(500).json({ error: err instanceof Error ? err.message : 'Failed to set secret' });
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
// Scope edit — update the allowed domains of an existing secret (persisted or
|
|
62
|
+
// session), preserving the value. Gated by the agent before sending.
|
|
63
|
+
app.post('/api/secrets/scope', express.json(), async (req, res) => {
|
|
64
|
+
const { name, domains } = req.body ?? {};
|
|
65
|
+
if (typeof name !== 'string' || !isStringArray(domains)) {
|
|
66
|
+
return res.status(400).json({ error: 'bad-request' });
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
if (secretProxy.sessionStore.has(name)) {
|
|
70
|
+
secretProxy.sessionStore.setDomains(name, domains);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const existing = secretStore.get(name);
|
|
74
|
+
if (!existing)
|
|
75
|
+
return res.status(404).json({ error: `no secret named "${name}"` });
|
|
76
|
+
secretStore.set(name, existing.value, domains);
|
|
77
|
+
}
|
|
78
|
+
await secretProxy.reload();
|
|
79
|
+
res.json({ ok: true });
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
res
|
|
83
|
+
.status(500)
|
|
84
|
+
.json({ error: err instanceof Error ? err.message : 'Failed to update scope' });
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
// Session secrets — in-memory only, never written to disk. Free for the agent
|
|
88
|
+
// to create; the masking pipeline picks them up on the reload below.
|
|
89
|
+
app.get('/api/secrets/session', (_req, res) => {
|
|
90
|
+
res.json(secretProxy.sessionStore.list());
|
|
91
|
+
});
|
|
92
|
+
app.post('/api/secrets/session', express.json(), async (req, res) => {
|
|
93
|
+
const { name, value, domains } = req.body ?? {};
|
|
94
|
+
if (typeof name !== 'string' ||
|
|
95
|
+
typeof value !== 'string' ||
|
|
96
|
+
(domains !== undefined && !isStringArray(domains))) {
|
|
97
|
+
return res.status(400).json({ error: 'bad-request' });
|
|
98
|
+
}
|
|
99
|
+
secretProxy.sessionStore.set(name, value, Array.isArray(domains) ? domains : []);
|
|
100
|
+
await secretProxy.reload();
|
|
101
|
+
res.json({ ok: true });
|
|
102
|
+
});
|
|
103
|
+
// Peek — elided preview of the unmasked value (session or persisted). The
|
|
104
|
+
// full value never leaves the server.
|
|
105
|
+
app.get('/api/secrets/peek', (req, res) => {
|
|
106
|
+
const name = typeof req.query.name === 'string' ? req.query.name : '';
|
|
107
|
+
if (!name)
|
|
108
|
+
return res.status(400).json({ error: 'bad-request' });
|
|
109
|
+
const session = secretProxy.sessionStore.getRecord(name);
|
|
110
|
+
if (session) {
|
|
111
|
+
return res.json({ name, preview: previewSecret(session.value), domains: session.domains });
|
|
112
|
+
}
|
|
113
|
+
const persisted = secretStore.get(name);
|
|
114
|
+
if (persisted) {
|
|
115
|
+
return res.json({
|
|
116
|
+
name,
|
|
117
|
+
preview: previewSecret(persisted.value),
|
|
118
|
+
domains: persisted.domains,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return res.status(404).json({ error: `no secret named "${name}"` });
|
|
122
|
+
});
|
|
123
|
+
// S3 sign-and-forward — browser-side mount backend posts envelopes here;
|
|
124
|
+
// server resolves the s3.<profile>.* secrets, signs SigV4 v4, forwards to
|
|
125
|
+
// the upstream, returns the response as a JSON envelope. The browser
|
|
126
|
+
// never sees access_key_id / secret_access_key.
|
|
127
|
+
app.post('/api/s3-sign-and-forward', async (req, res) => {
|
|
128
|
+
try {
|
|
129
|
+
await handleS3SignAndForward(req, res, secretStore);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
respondSignAndForwardError(res, err, devMode, 'S3');
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
// DA sign-and-forward — same pattern as S3, but for Adobe da.live. The
|
|
136
|
+
// IMS bearer token is passed transiently in the envelope (browser holds
|
|
137
|
+
// it via the existing Adobe LLM provider). v2 will move OAuth server-side
|
|
138
|
+
// to remove the browser exposure entirely.
|
|
139
|
+
app.post('/api/da-sign-and-forward', async (req, res) => {
|
|
140
|
+
try {
|
|
141
|
+
await handleDaSignAndForward(req, res);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
respondSignAndForwardError(res, err, devMode, 'DA');
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
// Tool-output real→masked scrub. The browser-side agent realm never holds
|
|
148
|
+
// real secret values, so the defense-in-depth scrub of bash / read_file /
|
|
149
|
+
// other tool results runs here against the node-server-owned
|
|
150
|
+
// SecretProxyManager. Direction is real→masked ONLY (`scrubResponse`), so it
|
|
151
|
+
// is always safe and idempotent for already-masked tokens and secret-free
|
|
152
|
+
// output. The caller treats any non-2xx / malformed response as "return
|
|
153
|
+
// input unchanged" — the scrub is defense-in-depth, not the primary defense.
|
|
154
|
+
app.post('/api/secrets/scrub', express.json({ limit: '32mb' }), (req, res) => {
|
|
155
|
+
const text = req.body?.text;
|
|
156
|
+
if (typeof text !== 'string') {
|
|
157
|
+
return res.status(400).json({ error: 'bad-request' });
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
res.json({ text: secretProxy.scrubResponse(text) });
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
res.status(500).json({ error: err instanceof Error ? err.message : 'scrub failed', text });
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
// Masked secrets endpoint — returns name + maskedValue pairs for shell env
|
|
167
|
+
// population. Real values are never exposed; only deterministic
|
|
168
|
+
// session-scoped masks.
|
|
169
|
+
app.get('/api/secrets/masked', (_req, res) => {
|
|
170
|
+
try {
|
|
171
|
+
res.json(secretProxy.getMaskedEntries());
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
res
|
|
175
|
+
.status(500)
|
|
176
|
+
.json({ error: err instanceof Error ? err.message : 'Failed to get masked secrets' });
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
// OAuth secret update — stores access token from OAuth login flow
|
|
180
|
+
app.post('/api/secrets/oauth-update', express.json(), async (req, res) => {
|
|
181
|
+
const { providerId, accessToken, domains } = req.body ?? {};
|
|
182
|
+
if (typeof providerId !== 'string' ||
|
|
183
|
+
typeof accessToken !== 'string' ||
|
|
184
|
+
!isStringArray(domains) ||
|
|
185
|
+
domains.length === 0) {
|
|
186
|
+
return res.status(400).json({ error: 'bad-request' });
|
|
187
|
+
}
|
|
188
|
+
const name = `oauth.${providerId}.token`;
|
|
189
|
+
oauthStore.set(name, accessToken, domains);
|
|
190
|
+
await secretProxy.reload();
|
|
191
|
+
const masked = secretProxy.getMaskedEntries().find((e) => e.name === name)?.maskedValue;
|
|
192
|
+
res.json({ providerId, name, maskedValue: masked, domains });
|
|
193
|
+
});
|
|
194
|
+
// OAuth secret deletion — removes access token on logout
|
|
195
|
+
app.delete('/api/secrets/oauth/:providerId', async (req, res) => {
|
|
196
|
+
const name = `oauth.${req.params.providerId}.token`;
|
|
197
|
+
if (!oauthStore.list().some((e) => e.name === name)) {
|
|
198
|
+
return res.status(404).json({ error: 'not-found' });
|
|
199
|
+
}
|
|
200
|
+
oauthStore.delete(name);
|
|
201
|
+
await secretProxy.reload();
|
|
202
|
+
res.status(204).end();
|
|
203
|
+
});
|
|
204
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Server as HttpServer } from 'node:http';
|
|
2
|
+
import { type Express } from 'express';
|
|
3
|
+
export interface UiServingOptions {
|
|
4
|
+
devMode: boolean;
|
|
5
|
+
hosted: boolean;
|
|
6
|
+
/** Origin string used only for the dev-server log line. */
|
|
7
|
+
serveOrigin: string;
|
|
8
|
+
/** Built UI directory served in production mode. */
|
|
9
|
+
uiDir: string;
|
|
10
|
+
/** Repo root used to locate the webapp Vite config in dev mode. */
|
|
11
|
+
webappRoot?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Attach UI serving to the Express app. In dev mode (and not hosted) this wires
|
|
15
|
+
* Vite's dev server as middleware for HMR; otherwise it serves the built static
|
|
16
|
+
* bundle with an SPA fallback.
|
|
17
|
+
*/
|
|
18
|
+
export declare function attachUiServing(app: Express, server: HttpServer, opts: UiServingOptions): Promise<void>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { join, resolve, sep } from 'node:path';
|
|
3
|
+
import express from 'express';
|
|
4
|
+
/**
|
|
5
|
+
* Attach UI serving to the Express app. In dev mode (and not hosted) this wires
|
|
6
|
+
* Vite's dev server as middleware for HMR; otherwise it serves the built static
|
|
7
|
+
* bundle with an SPA fallback.
|
|
8
|
+
*/
|
|
9
|
+
export async function attachUiServing(app, server, opts) {
|
|
10
|
+
if (opts.devMode && !opts.hosted) {
|
|
11
|
+
await attachViteDevServer(app, server, opts);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
attachStaticServing(app, opts.uiDir);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function attachViteDevServer(app, server, opts) {
|
|
18
|
+
const root = opts.webappRoot ?? process.cwd();
|
|
19
|
+
const { createServer: createViteServer } = await import('vite');
|
|
20
|
+
const webappIndexHtml = resolve(root, 'packages/webapp/index.html');
|
|
21
|
+
const vite = await createViteServer({
|
|
22
|
+
configFile: resolve(root, 'packages/webapp/vite.config.ts'),
|
|
23
|
+
server: {
|
|
24
|
+
middlewareMode: true,
|
|
25
|
+
hmr: {
|
|
26
|
+
server, // Share the HTTP server — our upgrade handler routes /cdp and /licks-ws separately
|
|
27
|
+
path: '/__vite_hmr', // Dedicated path avoids conflicts with /cdp upgrade handler
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
appType: 'custom', // We handle index.html serving ourselves via the handler below
|
|
31
|
+
root,
|
|
32
|
+
});
|
|
33
|
+
app.use(vite.middlewares);
|
|
34
|
+
app.use(async (req, res, next) => {
|
|
35
|
+
if (req.method !== 'GET' ||
|
|
36
|
+
!req.headers.accept?.includes('text/html') ||
|
|
37
|
+
req.path.includes('.')) {
|
|
38
|
+
next();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const template = readFileSync(webappIndexHtml, 'utf-8');
|
|
43
|
+
const html = await vite.transformIndexHtml(req.originalUrl, template);
|
|
44
|
+
res.status(200).setHeader('Content-Type', 'text/html');
|
|
45
|
+
res.end(html);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
if (err instanceof Error) {
|
|
49
|
+
vite.ssrFixStacktrace(err);
|
|
50
|
+
}
|
|
51
|
+
next(err);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
console.log(`Vite dev server middleware attached (HMR on ${opts.serveOrigin}/__vite_hmr)`);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Cache-Control policy for the built static bundle. Default `no-cache` forces a
|
|
58
|
+
* cheap conditional revalidation so a stale `index.html` never pins outdated
|
|
59
|
+
* `/assets/<hash>.js` references; service workers are `no-store`; content-hashed
|
|
60
|
+
* `/assets/*` are immutable. Each branch overrides the default by assigning to
|
|
61
|
+
* `cacheControl` — never add a separate setHeader after, or the catch-all wins.
|
|
62
|
+
*/
|
|
63
|
+
function setStaticCacheControl(res, path) {
|
|
64
|
+
let cacheControl = 'no-cache';
|
|
65
|
+
if (path.endsWith('llm-proxy-sw.js') || path.endsWith('preview-sw.js')) {
|
|
66
|
+
// Service workers need `Service-Worker-Allowed: /` for the root-scoped
|
|
67
|
+
// registration `llm-proxy-sw.js` does (`preview-sw.js` registers at the
|
|
68
|
+
// narrower `/preview/` scope, so the broader allowance is harmless).
|
|
69
|
+
// `no-store`, not `no-cache`: a stale SW pinned in cache would intercept
|
|
70
|
+
// fetch / dispatch `preview/*` with outdated logic — a worse failure mode
|
|
71
|
+
// than the revalidation cost.
|
|
72
|
+
res.setHeader('Service-Worker-Allowed', '/');
|
|
73
|
+
cacheControl = 'no-store';
|
|
74
|
+
}
|
|
75
|
+
else if (path.includes(`${sep}assets${sep}`)) {
|
|
76
|
+
// Vite emits content-hashed filenames into `/assets/` — immutable per URL.
|
|
77
|
+
// `path` is a filesystem path, hence the platform-aware `sep` match.
|
|
78
|
+
cacheControl = 'public, max-age=31536000, immutable';
|
|
79
|
+
}
|
|
80
|
+
res.setHeader('Cache-Control', cacheControl);
|
|
81
|
+
}
|
|
82
|
+
function attachStaticServing(app, uiDir) {
|
|
83
|
+
app.use(express.static(uiDir, { setHeaders: setStaticCacheControl }));
|
|
84
|
+
// SPA fallback — serve index.html for all non-file routes. The served
|
|
85
|
+
// index.html carries references to the current asset hashes, and stale-cached
|
|
86
|
+
// HTML is the canonical post-update breakage, hence `no-cache`.
|
|
87
|
+
app.get('/{*path}', (_req, res) => {
|
|
88
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
89
|
+
res.sendFile(join(uiDir, 'index.html'));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
@@ -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-QjjnqvLS.js","assets/dist-CSwuvPa6.js","assets/preload-helper-zJ_50EbN.js","assets/event-stream-Cs43PhOB.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-B3wJxNAn.js","assets/modulepreload-polyfill-Dezn_h7o.js","assets/logger-DDBAeTLF.js","assets/clipboard-DgFtRQbq.js","assets/bedrock-camp-D64i9rke.js","assets/local-llm-x5RnDA7B.js","assets/openai-completions-Dry_mhhJ.js","assets/github-copilot-headers-DZtWWv8W.js","assets/openai-prompt-cache-DXo9f3w5.js","assets/headers-DO1UzNKu.js","assets/sanitize-unicode-DmIE6hZJ.js","assets/adobe-DvNK5WQI.js","assets/oauth-service-CTlktxVj.js","assets/panel-rpc-DqT2FG7c.js","assets/llm-session-id-DVmZ9C2t.js","assets/github-copilot-BGPlopaI.js","assets/github-Dw4y8tJ1.js","assets/global-db-CbuLl-zx.js","assets/openai-codex-DZr2BkNe.js","assets/xai-grok-sanitize-CR2JoOJd.js","assets/xai-grok-models-CeEBaUMC.js","assets/xai-grok-CW5FvgTv.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-CSwuvPa6.js";import{t as n}from"./preload-helper-zJ_50EbN.js";import{a as r,o as i,s as a}from"./event-stream-Cs43PhOB.js";import"./context-compaction-DJF_qJZJ.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-D64i9rke.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-KwIWdsss.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-D64i9rke.js`).then(e=>e.n),__vite__mapDeps([13,5,1,2,3,4,6,7])),"./built-in/local-llm.ts":()=>n(()=>import(`./local-llm-CggFkqmI.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-CQg9LKPF.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-D3RdyeQI.js`),__vite__mapDeps([24,2,1,3,4,5,6,9,10,11,12])),"/packages/webapp/providers/github.ts":()=>n(()=>import(`./github-DX27yfOl.js`),__vite__mapDeps([25,2,9,5,10,11,12,26,21,22])),"/packages/webapp/providers/openai-codex.ts":()=>n(()=>import(`./openai-codex-BZaQhZ9p.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-C4VwA4iM.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:()=>zt,clearAllSettings:()=>yn,clearApiKey:()=>mn,clearBaseUrl:()=>_n,clearSelectedProvider:()=>dn,exportProviders:()=>vn,getAccounts:()=>Y,getAllAvailableModels:()=>Ut,getAllExtraOAuthDomains:()=>qt,getApiKey:()=>fn,getApiKeyForProvider:()=>an,getApiVersionForProvider:()=>sn,getAvailableProviders:()=>Pt,getBaseUrl:()=>hn,getBaseUrlForProvider:()=>Z,getDeploymentForProvider:()=>on,getExtraOAuthDomains:()=>Wt,getOAuthAccountInfo:()=>Lt,getProviderConfig:()=>K,getProviderModels:()=>q,getRawApiKeyForProvider:()=>rn,getSelectedModelId:()=>Q,getSelectedProvider:()=>$,isModelHiddenFromPicker:()=>Vt,logoutOAuthAccount:()=>Qt,maskOAuthTokenWithRetry:()=>$t,migrateLegacyAuthOnlySelection:()=>jt,persistOAuthMaskViaServiceWorker:()=>en,providerOffersLlmModels:()=>Ft,removeAccount:()=>Zt,resolveCurrentModel:()=>wn,resolveModelById:()=>Cn,saveOAuthAccount:()=>tn,setApiKey:()=>pn,setBaseUrl:()=>gn,setExtraOAuthDomains:()=>Gt,setExtraOAuthDomainsAsync:()=>Kt,setSelectedModelId:()=>cn,setSelectedProvider:()=>un}),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 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 It(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=xn(e,n.id,``,i),n.name&&(o.name=n.name));let s=t.modelOverrides?.[n.id];return s&&It(o,s),It(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&&It(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 Lt(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 Rt=Object.assign({})[`/packages/webapp/providers.json`]??[],J=o(`provider-settings`);function zt(e=Rt){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 Bt=[/haiku/i];function Vt(e){return Bt.some(t=>t.test(e))}function Ht(e){return e.filter(e=>!Vt(e.id))}function Ut(){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=Ht(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 Wt(e){return c(localStorage)[e]??[]}function Gt(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 Kt(e,t){if(l()){Gt(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 qt(){return c(localStorage)}function Jt(e){localStorage.setItem(W,JSON.stringify(e))}async function Yt(e){if(l()){Jt(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),Jt(a)}async function Xt(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 Zt(e){let t=Y().find(t=>t.providerId===e),n=K(e);t&&n?.isOAuth&&await Qt(e),await Xt(e),await Yt(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 Qt(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 Yt(Y().map(t=>t.providerId===e?{providerId:t.providerId,apiKey:``,baseUrl:t.baseUrl,userName:t.userName,userAvatar:t.userAvatar,loggedOut:!0}:t)),await Xt(e)}}async function $t(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 en(e,t,n){let r={providerId:e.providerId,accessToken:e.accessToken,domains:e.domains.join(`,`)},{maskedValue:i,lastError:a}=await $t(()=>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 tn(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 Yt(n);let r=K(e.providerId)?.oauthTokenDomains??[],i=Wt(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 en({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:Yt});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 Yt(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 nn=`local`;function rn(e){let t=Y().find(t=>t.providerId===e);return t&&(t.accessToken||t.apiKey)||null}function an(e){let t=Y().find(t=>t.providerId===e);return t?t.accessToken||t.apiKey||(K(e).optionalApiKey?nn:null):null}function Z(e){return Y().find(t=>t.providerId===e)?.baseUrl??null}function on(e){return Y().find(t=>t.providerId===e)?.deployment??null}function sn(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 cn(e){if(e.includes(`:`))localStorage.setItem(G,e);else{let t=$();localStorage.setItem(G,`${t}:${e}`)}}function ln(){return localStorage.getItem(G)||``}function $(){let e=ln(),t=e.indexOf(`:`);if(t>0)return e.slice(0,t);let n=Y();return n.length>0?n[0].providerId:`anthropic`}function un(e){let t=Q();localStorage.setItem(G,`${e}:${t}`)}function dn(){let e=Q();localStorage.setItem(G,e)}function fn(){return an($())}function pn(e){let t=$();X(t,e,Z(t)??void 0)}async function mn(){await Zt($())}function hn(){return Z($())}function gn(e){let t=$(),n=rn(t);n&&X(t,n,e||void 0)}function _n(){let e=$(),t=rn(e);t&&X(e,t)}function vn(){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 yn(){let e=Y();await Promise.allSettled(e.map(e=>Zt(e.providerId))),localStorage.removeItem(W),localStorage.removeItem(G);for(let e of Et)localStorage.removeItem(e)}function bn(e){return/^(?:gpt[-.]?|o[0-9]|chatgpt)/i.test(e)?`openai`:`anthropic`}function xn(e,t,n,r){return{id:t,name:t,provider:e,api:r??`${e}-${bn(t)}`,baseUrl:n??``,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},reasoning:!0}}function Sn(e,t){return t.isOAuth||e===`azure-ai-foundry`?`anthropic`:e===`bedrock-camp`?`amazon-bedrock`:e}function Cn(e){if(!e)return wn();let t=$(),n=Z(t),r=K(t);try{let i=wt(Sn(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:xn(t,e,n)}return wn()}}function wn(){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=Sn(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?xn(e,o,n):wt(`anthropic`,`claude-sonnet-4-0`)}}export{$t as A,Gt as B,K as C,$ as D,Q as E,wn as F,St as G,cn as H,Cn as I,yt as K,tn as L,en as M,Ft as N,Vt as O,Zt as P,pn as R,Lt as S,rn as T,un as U,Kt as V,bt as W,Pt as _,zt as a,on as b,_n as c,Y as d,Ut as f,sn as g,an as h,X as i,jt as j,Qt as k,dn as l,fn as m,Nt as n,yn as o,qt as p,Ct as r,mn as s,W as t,vn as u,hn as v,q as w,Wt as x,Z as y,gn 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-QjjnqvLS.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-D64i9rke.js`).then(e=>e.n),__vite__mapDeps([13,5,1,2,3,4,6,7])),"./built-in/local-llm.ts":()=>n(()=>import(`./local-llm-x5RnDA7B.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-DvNK5WQI.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-BGPlopaI.js`),__vite__mapDeps([24,2,1,3,4,5,6,9,10,11,12])),"/packages/webapp/providers/github.ts":()=>n(()=>import(`./github-Dw4y8tJ1.js`),__vite__mapDeps([25,2,9,5,10,11,12,26,21,22])),"/packages/webapp/providers/openai-codex.ts":()=>n(()=>import(`./openai-codex-DZr2BkNe.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-CW5FvgTv.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){if(e.includes(`:`))localStorage.setItem(G,e);else{let t=$();localStorage.setItem(G,`${t}:${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};
|