sliccy 5.32.2 → 5.32.4
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/_shared/bridge-protocol.d.ts +28 -0
- package/dist/node-server/_shared/bridge-protocol.d.ts.map +1 -0
- package/dist/node-server/_shared/bridge-protocol.js +28 -0
- package/dist/node-server/_shared/bridge-protocol.js.map +1 -0
- package/dist/node-server/_shared/index.d.ts +2 -0
- package/dist/node-server/_shared/index.d.ts.map +1 -1
- package/dist/node-server/_shared/index.js +2 -0
- package/dist/node-server/_shared/index.js.map +1 -1
- package/dist/node-server/_shared/tray-signaling.d.ts +272 -0
- package/dist/node-server/_shared/tray-signaling.d.ts.map +1 -0
- package/dist/node-server/_shared/tray-signaling.js +22 -0
- package/dist/node-server/_shared/tray-signaling.js.map +1 -0
- package/dist/node-server/bridge-security.d.ts +5 -19
- package/dist/node-server/bridge-security.js +10 -21
- package/dist/node-server/electron-runtime.d.ts +2 -0
- package/dist/ui/assets/{account-store-CBHqMqMY.js → account-store-BfOHnqUX.js} +2 -2
- package/dist/ui/assets/{account-store-Be0sLc0E.js → account-store-BokqeKBj.js} +3 -3
- package/dist/ui/assets/{adobe-DFl-yrxT.js → adobe-B6BLrKyZ.js} +1 -1
- package/dist/ui/assets/{adobe-OIagHOLg.js → adobe-DCTZeeCG.js} +2 -2
- package/dist/ui/assets/{adobe-oauth-state-Ge2y0PGt.js → adobe-oauth-state-DiSnFEyL.js} +1 -1
- package/dist/ui/assets/adobe-oauth-state-DyWfCpd9.js +1 -0
- package/dist/ui/assets/{agent-message-to-chat-CTUNoooS.js → agent-message-to-chat-BGOt7zdt.js} +1 -1
- package/dist/ui/assets/{apps-CVrmOXwO.js → apps-So20aUVP.js} +1 -1
- package/dist/ui/assets/{azure-openai-Bn5Xcvwc.js → azure-openai-Dg7P7-zc.js} +1 -1
- package/dist/ui/assets/{azure-openai-GsTlovpn.js → azure-openai-DkXl6rL7.js} +1 -1
- package/dist/ui/assets/{cdp-D7cRI5-J.js → cdp-wAooorxs.js} +1 -1
- package/dist/ui/assets/{cerebras-5-EyYbr8.js → cerebras-BHEfKUqA.js} +1 -1
- package/dist/ui/assets/{cerebras-Kr8ja3Py.js → cerebras-CqjkCBXf.js} +1 -1
- package/dist/ui/assets/{composer-speech-C8TRsqUk.js → composer-speech-B9xMPyhK.js} +1 -1
- package/dist/ui/assets/{connect-surface-gw9ko5fb.js → connect-surface-BKaKXs1I.js} +1 -1
- package/dist/ui/assets/dip-DDOAr0-_.js +1 -0
- package/dist/ui/assets/{dist-BMBwRw51.js → dist-CQDi-98s.js} +1 -1
- package/dist/ui/assets/{dist-2i3KKoVh.js → dist-D_z6cCg2.js} +1 -1
- package/dist/ui/assets/{ensure-speech-assets-BrA1HS7C.js → ensure-speech-assets-CQm9qv40.js} +1 -1
- package/dist/ui/assets/esp8266-XUxBx9Cp.js +1 -0
- package/dist/ui/assets/{esptool-operations-DGylwFzm.js → esptool-operations-DX2M1lrH.js} +2 -2
- package/dist/ui/assets/{fs-DVo-4gB0.js → fs-8G6exssT.js} +1 -1
- package/dist/ui/assets/{fs-CV70p4II.js → fs-Y501gVp6.js} +2 -2
- package/dist/ui/assets/{github-BuFX5eNu.js → github-Bb4Uk3zm.js} +1 -1
- package/dist/ui/assets/{github-CfW2yV2q.js → github-CmzugZyZ.js} +2 -2
- package/dist/ui/assets/{github-copilot-CNCKemQr.js → github-copilot-BC3lA6pG.js} +1 -1
- package/dist/ui/assets/{github-copilot-DXwIpDVa.js → github-copilot-CEMcvKxO.js} +1 -1
- package/dist/ui/assets/{hear-D26m2iyP.js → hear-BgLO8_ZV.js} +1 -1
- package/dist/ui/assets/{hear-DEv4kmVy.js → hear-CsPhwvRU.js} +1 -1
- package/dist/ui/assets/{kernel-worker-zLoWkU7a.js → kernel-worker-cOMb9dW0.js} +40 -40
- package/dist/ui/assets/{kokoro-engine-Djlem5OX.js → kokoro-engine-8SK1XhNo.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-B9t8ijE8.js → lick-ws-bridge-DUpfw5Cw.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-DEL6x1AS.js → lick-ws-bridge-ZICrYFIq.js} +1 -1
- package/dist/ui/assets/{local-llm-BnA7aP-R.js → local-llm-DjSsoqBK.js} +1 -1
- package/dist/ui/assets/main-BwjqRukt.js +24 -0
- package/dist/ui/assets/{main-cherry-CqL2Gwv5.js → main-cherry-D01ARITG.js} +1 -1
- package/dist/ui/assets/mount-DqnZMKpT.js +1 -0
- package/dist/ui/assets/{mount-qoRDnCCJ.js → mount-SC46VzJl.js} +2 -2
- package/dist/ui/assets/{mount-bridge-client-DHpxu7lQ.js → mount-bridge-client-VA_GLWNL.js} +1 -1
- package/dist/ui/assets/{new-session-Bjq1W5H6.js → new-session-B6B6YSVJ.js} +2 -2
- package/dist/ui/assets/{oauth-bootstrap-BvEgSSJ8.js → oauth-bootstrap-8oaNo14A.js} +2 -2
- package/dist/ui/assets/{oauth-service-CPJvHYuO.js → oauth-service-DALcoLdp.js} +1 -1
- package/dist/ui/assets/{oauth-service-BSqTYvb6.js → oauth-service-DdejFjWa.js} +1 -1
- package/dist/ui/assets/{openai-codex-DJE0mPXq.js → openai-codex-BIjw8lvz.js} +1 -1
- package/dist/ui/assets/{openai-codex-DQgm7IKT.js → openai-codex-C5L90K9s.js} +1 -1
- package/dist/ui/assets/page-follower-tray-BJ1UHMvQ.js +5 -0
- package/dist/ui/assets/{panel-rpc-handlers-Czwq_aJ9.js → panel-rpc-handlers-DWnPCtqS.js} +2 -2
- package/dist/ui/assets/{port-bridge-client-BJ5rcoKH.js → port-bridge-client-CbHZI-MK.js} +1 -1
- package/dist/ui/assets/{port-bridge-client-vT8ubtB-.js → port-bridge-client-HYsuFrMw.js} +1 -1
- package/dist/ui/assets/{provider-CNUGJ-w7.js → provider-DCEZLF1W.js} +1 -1
- package/dist/ui/assets/{provider-C21fMLYX.js → provider-DtBT8r4B.js} +2 -2
- package/dist/ui/assets/provider-store-access-0MbnfMwG.js +1 -0
- package/dist/ui/assets/provider-store-access-Bwpbtc8J.js +1 -0
- package/dist/ui/assets/{providers-Cc-clf3L.js → providers-CvYMDqCL.js} +1 -1
- package/dist/ui/assets/{providers-DKkb84ca.js → providers-DhaH6zef.js} +2 -2
- package/dist/ui/assets/proxied-fetch-BG3drLHR.js +1 -0
- package/dist/ui/assets/{proxied-fetch-iGqLvoxh.js → proxied-fetch-CaWoNw-n.js} +1 -1
- package/dist/ui/assets/{quick-llm-CjE8d7wM.js → quick-llm-Dq21hPK2.js} +1 -1
- package/dist/ui/assets/remote-cdp-transport-DDt3F4ID.js +1 -0
- package/dist/ui/assets/{secret-env-kbusPsVw.js → secret-env-zIJToV_E.js} +1 -1
- package/dist/ui/assets/{secret-topology-DnYeyyJY.js → secret-topology-k6-rjoyS.js} +1 -1
- package/dist/ui/assets/{secrets-bridge-client-x_puVSDN.js → secrets-bridge-client-2HszvKw8.js} +1 -1
- package/dist/ui/assets/session-freezer-B59WuEaJ.js +1 -0
- package/dist/ui/assets/{speak-DnUM0f7v.js → speak-BDVSzMcc.js} +1 -1
- package/dist/ui/assets/{speak-CmxGedm5.js → speak-CClITCPK.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-CXVBHJDz.js → sprinkle-manager-gfD7_n13.js} +1 -1
- package/dist/ui/assets/src-YN73WJ67.js +1 -0
- package/dist/ui/assets/{store-Dx_ZzMg_.js → store-DrCJeBNd.js} +1 -1
- package/dist/ui/assets/{sudo-BbmyOpF9.js → sudo-DgiMHb5o.js} +1 -1
- package/dist/ui/assets/{transformers-env-Cnn67zUZ.js → transformers-env-DKNE7GpB.js} +1 -1
- package/dist/ui/assets/{transformers-env-CjH48rcA.js → transformers-env-lVvkNQQe.js} +1 -1
- package/dist/ui/assets/{tray-leader-DER0Kqek.js → tray-leader-Lqisrfbv.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-tQxiXR1Q.js → tray-leave-runtime-C2MoDf-1.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-C8c9rw4H.js → upgrade-detection-CbBla6hH.js} +1 -1
- package/dist/ui/assets/{voice-reply-Dy-oQfd-.js → voice-reply-CJuWFQPX.js} +1 -1
- package/dist/ui/assets/{wc-attach-giyJS8xV.js → wc-attach-jZdZHKD1.js} +3 -3
- package/dist/ui/assets/{wc-extension-jApoArCe.js → wc-extension-Cs88BUjq.js} +2 -2
- package/dist/ui/assets/{wc-float-label-Dh8xz8qh.js → wc-float-label-DXWATTwk.js} +1 -1
- package/dist/ui/assets/{wc-follower-Cm3cGQkn.js → wc-follower-C3__8PFa.js} +3 -3
- package/dist/ui/assets/{wc-live-D1nJ3GDk.js → wc-live-DR6tvItT.js} +5 -5
- package/dist/ui/assets/{wc-nav-BAoA-zSN.js → wc-nav-DtsNnJ6v.js} +2 -2
- package/dist/ui/assets/{wc-onboarding-B64HAy72.js → wc-onboarding-D0yx-jSj.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-yyu0hmrA.js → wc-placeholder-BbSTS-RA.js} +3 -3
- package/dist/ui/assets/{wc-settings-BjaQ1EAb.js → wc-settings-CPEfugAj.js} +2 -2
- package/dist/ui/assets/{wc-shell-CAEO-A-u.js → wc-shell-Dk6AF6cB.js} +4 -4
- package/dist/ui/assets/wc-sprinkles-BIGx9RF3.js +2 -0
- package/dist/ui/assets/wc-tray-CkhSEgan.js +2 -0
- package/dist/ui/assets/{whisper-engine-BsaW_WE8.js → whisper-engine-CRsuayPy.js} +1 -1
- package/dist/ui/assets/{whisper-session-Duou3zwG.js → whisper-session-DHXbD0fp.js} +2 -2
- package/dist/ui/assets/{xai-grok-Bfyy94VQ.js → xai-grok-B-MyCxjN.js} +1 -1
- package/dist/ui/assets/{xai-grok-CIE5nGX8.js → xai-grok-Bb_OnCv9.js} +1 -1
- package/dist/ui/index.html +8 -8
- package/dist/ui/llm-proxy-sw.js +1 -1
- package/dist/ui/packages/webapp/index.html +8 -8
- package/package.json +2 -2
- package/dist/ui/assets/adobe-oauth-state-eeR_OjLo.js +0 -1
- package/dist/ui/assets/dip-CsTxNMzW.js +0 -1
- package/dist/ui/assets/esp8266-QhhQXv-N.js +0 -1
- package/dist/ui/assets/main-B50qzOkm.js +0 -24
- package/dist/ui/assets/mount-DrVm3N-1.js +0 -1
- package/dist/ui/assets/page-follower-tray-CVFWQlMs.js +0 -5
- package/dist/ui/assets/provider-store-access-Bf8xGjp8.js +0 -1
- package/dist/ui/assets/provider-store-access-D0_IhxuU.js +0 -1
- package/dist/ui/assets/proxied-fetch-BVw2cmL4.js +0 -1
- package/dist/ui/assets/remote-cdp-transport-DTCu2BgA.js +0 -1
- package/dist/ui/assets/session-freezer-CMu6M5zn.js +0 -1
- package/dist/ui/assets/src-BdPw21ST.js +0 -1
- package/dist/ui/assets/wc-sprinkles-BEnPWrOf.js +0 -2
- package/dist/ui/assets/wc-tray-CZcH2Ikb.js +0 -2
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone/Electron thin-bridge launch contract — single source of truth.
|
|
3
|
+
*
|
|
4
|
+
* The node-server (and swift-server) appends `?bridge=<ws-url>&bridgeToken=…`
|
|
5
|
+
* to the hosted leader launch URL; the leader dials the local `/cdp`
|
|
6
|
+
* WebSocket offering `Sec-WebSocket-Protocol: slicc.bridge.v1.<token>` and
|
|
7
|
+
* sends the raw token on cross-origin `/api/*` calls as `X-Bridge-Token`.
|
|
8
|
+
*
|
|
9
|
+
* Consumers: `packages/node-server/src/bridge-security.ts` (server gate),
|
|
10
|
+
* `packages/webapp/src/ui/boot/bridge-launch-params.ts` (leader boot),
|
|
11
|
+
* `packages/chrome-extension/src/bridge-sw.ts` (SW port allowlist),
|
|
12
|
+
* `packages/webapp/src/ui/llm-proxy-sw.ts` (header pass-through).
|
|
13
|
+
* Swift mirror: `packages/swift-server/Sources/Server/BridgeSecurity.swift`
|
|
14
|
+
* — update it when these values change.
|
|
15
|
+
*/
|
|
16
|
+
/** Production hosted-UI origin every bridge allowlist starts from. */
|
|
17
|
+
export declare const SLICC_HOSTED_ORIGIN = "https://www.sliccy.ai";
|
|
18
|
+
/** Staging tray-hub origin (allowlisted by the node-server bridge only). */
|
|
19
|
+
export declare const SLICC_STAGING_HUB_ORIGIN = "https://slicc-tray-hub-staging.minivelos.workers.dev";
|
|
20
|
+
/** Subprotocol prefix the leader sends; servers validate `<prefix><token>`. */
|
|
21
|
+
export declare const BRIDGE_SUBPROTOCOL_PREFIX = "slicc.bridge.v1.";
|
|
22
|
+
/** Query-param name carrying the per-process bridge token. */
|
|
23
|
+
export declare const BRIDGE_TOKEN_QUERY_PARAM = "bridgeToken";
|
|
24
|
+
/** Query-param name carrying the local `/cdp` WebSocket URL. */
|
|
25
|
+
export declare const BRIDGE_WS_QUERY_PARAM = "bridge";
|
|
26
|
+
/** Header carrying the raw bridge token on cross-origin `/api/*` calls. */
|
|
27
|
+
export declare const BRIDGE_TOKEN_HEADER = "X-Bridge-Token";
|
|
28
|
+
//# sourceMappingURL=bridge-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-protocol.d.ts","sourceRoot":"","sources":["../src/bridge-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,0BAA0B,CAAC;AAE3D,4EAA4E;AAC5E,eAAO,MAAM,wBAAwB,yDAAyD,CAAC;AAE/F,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAE5D,8DAA8D;AAC9D,eAAO,MAAM,wBAAwB,gBAAgB,CAAC;AAEtD,gEAAgE;AAChE,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAE9C,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone/Electron thin-bridge launch contract — single source of truth.
|
|
3
|
+
*
|
|
4
|
+
* The node-server (and swift-server) appends `?bridge=<ws-url>&bridgeToken=…`
|
|
5
|
+
* to the hosted leader launch URL; the leader dials the local `/cdp`
|
|
6
|
+
* WebSocket offering `Sec-WebSocket-Protocol: slicc.bridge.v1.<token>` and
|
|
7
|
+
* sends the raw token on cross-origin `/api/*` calls as `X-Bridge-Token`.
|
|
8
|
+
*
|
|
9
|
+
* Consumers: `packages/node-server/src/bridge-security.ts` (server gate),
|
|
10
|
+
* `packages/webapp/src/ui/boot/bridge-launch-params.ts` (leader boot),
|
|
11
|
+
* `packages/chrome-extension/src/bridge-sw.ts` (SW port allowlist),
|
|
12
|
+
* `packages/webapp/src/ui/llm-proxy-sw.ts` (header pass-through).
|
|
13
|
+
* Swift mirror: `packages/swift-server/Sources/Server/BridgeSecurity.swift`
|
|
14
|
+
* — update it when these values change.
|
|
15
|
+
*/
|
|
16
|
+
/** Production hosted-UI origin every bridge allowlist starts from. */
|
|
17
|
+
export const SLICC_HOSTED_ORIGIN = 'https://www.sliccy.ai';
|
|
18
|
+
/** Staging tray-hub origin (allowlisted by the node-server bridge only). */
|
|
19
|
+
export const SLICC_STAGING_HUB_ORIGIN = 'https://slicc-tray-hub-staging.minivelos.workers.dev';
|
|
20
|
+
/** Subprotocol prefix the leader sends; servers validate `<prefix><token>`. */
|
|
21
|
+
export const BRIDGE_SUBPROTOCOL_PREFIX = 'slicc.bridge.v1.';
|
|
22
|
+
/** Query-param name carrying the per-process bridge token. */
|
|
23
|
+
export const BRIDGE_TOKEN_QUERY_PARAM = 'bridgeToken';
|
|
24
|
+
/** Query-param name carrying the local `/cdp` WebSocket URL. */
|
|
25
|
+
export const BRIDGE_WS_QUERY_PARAM = 'bridge';
|
|
26
|
+
/** Header carrying the raw bridge token on cross-origin `/api/*` calls. */
|
|
27
|
+
export const BRIDGE_TOKEN_HEADER = 'X-Bridge-Token';
|
|
28
|
+
//# sourceMappingURL=bridge-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge-protocol.js","sourceRoot":"","sources":["../src/bridge-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,sEAAsE;AACtE,MAAM,CAAC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;AAE3D,4EAA4E;AAC5E,MAAM,CAAC,MAAM,wBAAwB,GAAG,sDAAsD,CAAC;AAE/F,+EAA+E;AAC/E,MAAM,CAAC,MAAM,yBAAyB,GAAG,kBAAkB,CAAC;AAE5D,8DAA8D;AAC9D,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAa,CAAC;AAEtD,gEAAgE;AAChE,MAAM,CAAC,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAE9C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './base64.js';
|
|
2
|
+
export * from './bridge-protocol.js';
|
|
2
3
|
export * from './cdp-frame-unmask.js';
|
|
3
4
|
export * from './electron-overlay-route.js';
|
|
4
5
|
export * from './oauth-extra-domains-storage.js';
|
|
@@ -8,4 +9,5 @@ export * from './secrets-pipeline.js';
|
|
|
8
9
|
export * from './session-secret-store.js';
|
|
9
10
|
export * from './sign-and-forward.js';
|
|
10
11
|
export * from './sigv4.js';
|
|
12
|
+
export * from './tray-signaling.js';
|
|
11
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Re-exports added in Task 1.2 (secret-masking) and Task 1.3 (secrets-pipeline).
|
|
2
2
|
export * from './base64.js';
|
|
3
|
+
export * from './bridge-protocol.js';
|
|
3
4
|
export * from './cdp-frame-unmask.js';
|
|
4
5
|
export * from './electron-overlay-route.js';
|
|
5
6
|
export * from './oauth-extra-domains-storage.js';
|
|
@@ -9,4 +10,5 @@ export * from './secrets-pipeline.js';
|
|
|
9
10
|
export * from './session-secret-store.js';
|
|
10
11
|
export * from './sign-and-forward.js';
|
|
11
12
|
export * from './sigv4.js';
|
|
13
|
+
export * from './tray-signaling.js';
|
|
12
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tray signaling wire contract — single source of truth.
|
|
3
|
+
*
|
|
4
|
+
* Spoken on two wires:
|
|
5
|
+
* 1. The leader's control WebSocket to the tray-hub worker
|
|
6
|
+
* (`LeaderToWorkerControlMessage` / `WorkerToLeaderControlMessage`).
|
|
7
|
+
* 2. The follower's HTTP bootstrap API on the worker
|
|
8
|
+
* (`FollowerBootstrapRequest` → `FollowerAttachResponse` /
|
|
9
|
+
* `FollowerBootstrapResponse`).
|
|
10
|
+
*
|
|
11
|
+
* Consumed by `packages/webapp` (leader + TS follower) and
|
|
12
|
+
* `packages/cloudflare-worker` (SessionTray Durable Object). The iOS follower
|
|
13
|
+
* mirrors a subset in `packages/ios-app/SliccFollower/Models/TrayTypes.swift`
|
|
14
|
+
* — update that mirror when this file changes.
|
|
15
|
+
*
|
|
16
|
+
* Worker-internal persisted state (`TrayBootstrapRecord`, `TrayRecord`) is NOT
|
|
17
|
+
* wire contract and lives in `packages/cloudflare-worker/src/shared.ts`.
|
|
18
|
+
*/
|
|
19
|
+
export declare const TRAY_BOOTSTRAP_TIMEOUT_MS = 20000;
|
|
20
|
+
export declare const TRAY_BOOTSTRAP_MAX_RETRIES = 3;
|
|
21
|
+
export declare const TRAY_BOOTSTRAP_RETRY_AFTER_MS = 1000;
|
|
22
|
+
export type TrayBootstrapState = 'pending' | 'offered' | 'connected' | 'failed';
|
|
23
|
+
export interface TraySessionDescription {
|
|
24
|
+
type: 'offer' | 'answer';
|
|
25
|
+
sdp: string;
|
|
26
|
+
}
|
|
27
|
+
export interface TrayIceCandidate {
|
|
28
|
+
candidate: string;
|
|
29
|
+
sdpMid?: string | null;
|
|
30
|
+
sdpMLineIndex?: number | null;
|
|
31
|
+
usernameFragment?: string | null;
|
|
32
|
+
}
|
|
33
|
+
export interface TrayBootstrapFailure {
|
|
34
|
+
code: string;
|
|
35
|
+
message: string;
|
|
36
|
+
retryable: boolean;
|
|
37
|
+
retryAfterMs: number | null;
|
|
38
|
+
failedAt: string;
|
|
39
|
+
}
|
|
40
|
+
export type TrayBootstrapEvent = {
|
|
41
|
+
sequence: number;
|
|
42
|
+
sentAt: string;
|
|
43
|
+
type: 'bootstrap.offer';
|
|
44
|
+
offer: TraySessionDescription;
|
|
45
|
+
} | {
|
|
46
|
+
sequence: number;
|
|
47
|
+
sentAt: string;
|
|
48
|
+
type: 'bootstrap.ice_candidate';
|
|
49
|
+
candidate: TrayIceCandidate;
|
|
50
|
+
} | {
|
|
51
|
+
sequence: number;
|
|
52
|
+
sentAt: string;
|
|
53
|
+
type: 'bootstrap.failed';
|
|
54
|
+
failure: TrayBootstrapFailure;
|
|
55
|
+
};
|
|
56
|
+
export interface TrayBootstrapStatus {
|
|
57
|
+
controllerId: string;
|
|
58
|
+
bootstrapId: string;
|
|
59
|
+
attempt: number;
|
|
60
|
+
state: TrayBootstrapState;
|
|
61
|
+
expiresAt: string;
|
|
62
|
+
cursor: number;
|
|
63
|
+
maxRetries: number;
|
|
64
|
+
retriesRemaining: number;
|
|
65
|
+
retryAfterMs: number | null;
|
|
66
|
+
failure: TrayBootstrapFailure | null;
|
|
67
|
+
}
|
|
68
|
+
export interface TurnIceServer {
|
|
69
|
+
urls: string[];
|
|
70
|
+
username: string;
|
|
71
|
+
credential: string;
|
|
72
|
+
}
|
|
73
|
+
export interface FollowerJoinRequestedMessage {
|
|
74
|
+
type: 'follower.join_requested';
|
|
75
|
+
trayId: string;
|
|
76
|
+
controllerId: string;
|
|
77
|
+
runtime?: string;
|
|
78
|
+
bootstrapId: string;
|
|
79
|
+
attempt: number;
|
|
80
|
+
expiresAt: string;
|
|
81
|
+
iceServers?: TurnIceServer[];
|
|
82
|
+
}
|
|
83
|
+
export interface BootstrapAnswerMessage {
|
|
84
|
+
type: 'bootstrap.answer';
|
|
85
|
+
trayId: string;
|
|
86
|
+
controllerId: string;
|
|
87
|
+
bootstrapId: string;
|
|
88
|
+
answer: TraySessionDescription;
|
|
89
|
+
}
|
|
90
|
+
export interface BootstrapIceCandidateMessage {
|
|
91
|
+
type: 'bootstrap.ice_candidate';
|
|
92
|
+
trayId: string;
|
|
93
|
+
controllerId: string;
|
|
94
|
+
bootstrapId: string;
|
|
95
|
+
candidate: TrayIceCandidate;
|
|
96
|
+
}
|
|
97
|
+
export interface WebhookEventMessage {
|
|
98
|
+
type: 'webhook.event';
|
|
99
|
+
webhookId: string;
|
|
100
|
+
headers: Record<string, string>;
|
|
101
|
+
body: unknown;
|
|
102
|
+
timestamp: string;
|
|
103
|
+
}
|
|
104
|
+
export interface WorkerPreviewRequest {
|
|
105
|
+
type: 'preview.request';
|
|
106
|
+
reqId: string;
|
|
107
|
+
servedRoot: string;
|
|
108
|
+
vfsPath: string;
|
|
109
|
+
asText: boolean;
|
|
110
|
+
}
|
|
111
|
+
export interface WorkerPreviewRevoked {
|
|
112
|
+
type: 'preview.revoked';
|
|
113
|
+
previewToken: string;
|
|
114
|
+
}
|
|
115
|
+
export interface WorkerBridgeConnected {
|
|
116
|
+
type: 'bridge.connected';
|
|
117
|
+
connId: string;
|
|
118
|
+
previewToken: string;
|
|
119
|
+
origin: string;
|
|
120
|
+
userAgent: string;
|
|
121
|
+
connectedAt: string;
|
|
122
|
+
}
|
|
123
|
+
export interface WorkerBridgeDisconnected {
|
|
124
|
+
type: 'bridge.disconnected';
|
|
125
|
+
connId: string;
|
|
126
|
+
reason?: string;
|
|
127
|
+
}
|
|
128
|
+
export interface WorkerBridgeCdpResponse {
|
|
129
|
+
type: 'bridge.cdp.response';
|
|
130
|
+
connId: string;
|
|
131
|
+
id: number;
|
|
132
|
+
result?: Record<string, unknown>;
|
|
133
|
+
error?: {
|
|
134
|
+
code: number;
|
|
135
|
+
message: string;
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
export type WorkerToLeaderControlMessage = {
|
|
139
|
+
type: 'leader.connected';
|
|
140
|
+
trayId: string;
|
|
141
|
+
controllerId: string;
|
|
142
|
+
} | {
|
|
143
|
+
type: 'pong';
|
|
144
|
+
trayId: string;
|
|
145
|
+
} | FollowerJoinRequestedMessage | BootstrapAnswerMessage | BootstrapIceCandidateMessage | WebhookEventMessage | WorkerPreviewRequest | WorkerPreviewRevoked | WorkerBridgeConnected | WorkerBridgeDisconnected | WorkerBridgeCdpResponse;
|
|
146
|
+
export interface LeaderBootstrapOfferMessage {
|
|
147
|
+
type: 'bootstrap.offer';
|
|
148
|
+
controllerId: string;
|
|
149
|
+
bootstrapId: string;
|
|
150
|
+
offer: TraySessionDescription;
|
|
151
|
+
}
|
|
152
|
+
export interface LeaderBootstrapIceCandidateMessage {
|
|
153
|
+
type: 'bootstrap.ice_candidate';
|
|
154
|
+
controllerId: string;
|
|
155
|
+
bootstrapId: string;
|
|
156
|
+
candidate: TrayIceCandidate;
|
|
157
|
+
}
|
|
158
|
+
export interface LeaderBootstrapFailedMessage {
|
|
159
|
+
type: 'bootstrap.failed';
|
|
160
|
+
controllerId: string;
|
|
161
|
+
bootstrapId: string;
|
|
162
|
+
code: string;
|
|
163
|
+
message: string;
|
|
164
|
+
retryable?: boolean;
|
|
165
|
+
retryAfterMs?: number | null;
|
|
166
|
+
}
|
|
167
|
+
export interface LeaderPreviewResponseOk {
|
|
168
|
+
type: 'preview.response';
|
|
169
|
+
reqId: string;
|
|
170
|
+
ok: true;
|
|
171
|
+
mime: string;
|
|
172
|
+
chunkIndex: number;
|
|
173
|
+
totalChunks: number;
|
|
174
|
+
/** utf-8 text OR base64-encoded binary, per `encoding`. */
|
|
175
|
+
content: string;
|
|
176
|
+
encoding: 'utf-8' | 'base64';
|
|
177
|
+
}
|
|
178
|
+
export interface LeaderPreviewResponseError {
|
|
179
|
+
type: 'preview.response';
|
|
180
|
+
reqId: string;
|
|
181
|
+
ok: false;
|
|
182
|
+
status: 404 | 403 | 500;
|
|
183
|
+
reason?: string;
|
|
184
|
+
}
|
|
185
|
+
export interface LeaderPreviewPurge {
|
|
186
|
+
type: 'preview.purge';
|
|
187
|
+
previewToken: string;
|
|
188
|
+
}
|
|
189
|
+
export interface LeaderBridgeCdpRequest {
|
|
190
|
+
type: 'bridge.cdp.request';
|
|
191
|
+
connId: string;
|
|
192
|
+
id: number;
|
|
193
|
+
method: string;
|
|
194
|
+
params?: Record<string, unknown>;
|
|
195
|
+
sessionId?: string;
|
|
196
|
+
}
|
|
197
|
+
/** Leader → worker: close a bridged preview visitor tab's connection (from
|
|
198
|
+
* `Target.closeTarget` on a `preview:<token>:<connId>` target). */
|
|
199
|
+
export interface LeaderBridgeClose {
|
|
200
|
+
type: 'bridge.close';
|
|
201
|
+
connId: string;
|
|
202
|
+
}
|
|
203
|
+
export type LeaderToWorkerControlMessage = {
|
|
204
|
+
type: 'ping';
|
|
205
|
+
} | LeaderBootstrapOfferMessage | LeaderBootstrapIceCandidateMessage | LeaderBootstrapFailedMessage | LeaderPreviewResponseOk | LeaderPreviewResponseError | LeaderPreviewPurge | LeaderBridgeCdpRequest | LeaderBridgeClose;
|
|
206
|
+
export interface BootstrapPollRequest {
|
|
207
|
+
action: 'poll';
|
|
208
|
+
controllerId?: string;
|
|
209
|
+
bootstrapId?: string;
|
|
210
|
+
cursor?: number;
|
|
211
|
+
}
|
|
212
|
+
export interface BootstrapAnswerRequest {
|
|
213
|
+
action: 'answer';
|
|
214
|
+
controllerId?: string;
|
|
215
|
+
bootstrapId?: string;
|
|
216
|
+
answer?: TraySessionDescription;
|
|
217
|
+
}
|
|
218
|
+
export interface BootstrapIceCandidateRequest {
|
|
219
|
+
action: 'ice-candidate';
|
|
220
|
+
controllerId?: string;
|
|
221
|
+
bootstrapId?: string;
|
|
222
|
+
candidate?: TrayIceCandidate;
|
|
223
|
+
}
|
|
224
|
+
export interface BootstrapRetryRequest {
|
|
225
|
+
action: 'retry';
|
|
226
|
+
controllerId?: string;
|
|
227
|
+
bootstrapId?: string;
|
|
228
|
+
runtime?: string;
|
|
229
|
+
}
|
|
230
|
+
export type FollowerBootstrapRequest = BootstrapPollRequest | BootstrapAnswerRequest | BootstrapIceCandidateRequest | BootstrapRetryRequest;
|
|
231
|
+
export interface TrayLeaderSummary {
|
|
232
|
+
controllerId: string;
|
|
233
|
+
connected: boolean;
|
|
234
|
+
reconnectDeadline: string | null;
|
|
235
|
+
}
|
|
236
|
+
export interface FollowerJoinRequest {
|
|
237
|
+
controllerId?: string;
|
|
238
|
+
runtime?: string;
|
|
239
|
+
}
|
|
240
|
+
export type FollowerAttachResult = {
|
|
241
|
+
action: 'wait';
|
|
242
|
+
code: 'LEADER_NOT_ELECTED' | 'LEADER_NOT_CONNECTED';
|
|
243
|
+
retryAfterMs: number;
|
|
244
|
+
} | {
|
|
245
|
+
action: 'signal';
|
|
246
|
+
code: 'LEADER_CONNECTED';
|
|
247
|
+
bootstrap: TrayBootstrapStatus;
|
|
248
|
+
} | {
|
|
249
|
+
action: 'fail';
|
|
250
|
+
code: 'INVALID_JOIN_CAPABILITY' | 'TRAY_EXPIRED';
|
|
251
|
+
error: string;
|
|
252
|
+
};
|
|
253
|
+
export interface FollowerAttachResponse {
|
|
254
|
+
trayId: string;
|
|
255
|
+
controllerId: string;
|
|
256
|
+
role: 'follower';
|
|
257
|
+
leader: TrayLeaderSummary | null;
|
|
258
|
+
participantCount: number;
|
|
259
|
+
result: FollowerAttachResult;
|
|
260
|
+
iceServers?: TurnIceServer[];
|
|
261
|
+
}
|
|
262
|
+
export interface FollowerBootstrapResponse {
|
|
263
|
+
trayId: string;
|
|
264
|
+
controllerId: string;
|
|
265
|
+
role: 'follower';
|
|
266
|
+
leader: TrayLeaderSummary | null;
|
|
267
|
+
participantCount: number;
|
|
268
|
+
bootstrap: TrayBootstrapStatus;
|
|
269
|
+
events: TrayBootstrapEvent[];
|
|
270
|
+
iceServers?: TurnIceServer[];
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=tray-signaling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tray-signaling.d.ts","sourceRoot":"","sources":["../src/tray-signaling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tray signaling wire contract — single source of truth.
|
|
3
|
+
*
|
|
4
|
+
* Spoken on two wires:
|
|
5
|
+
* 1. The leader's control WebSocket to the tray-hub worker
|
|
6
|
+
* (`LeaderToWorkerControlMessage` / `WorkerToLeaderControlMessage`).
|
|
7
|
+
* 2. The follower's HTTP bootstrap API on the worker
|
|
8
|
+
* (`FollowerBootstrapRequest` → `FollowerAttachResponse` /
|
|
9
|
+
* `FollowerBootstrapResponse`).
|
|
10
|
+
*
|
|
11
|
+
* Consumed by `packages/webapp` (leader + TS follower) and
|
|
12
|
+
* `packages/cloudflare-worker` (SessionTray Durable Object). The iOS follower
|
|
13
|
+
* mirrors a subset in `packages/ios-app/SliccFollower/Models/TrayTypes.swift`
|
|
14
|
+
* — update that mirror when this file changes.
|
|
15
|
+
*
|
|
16
|
+
* Worker-internal persisted state (`TrayBootstrapRecord`, `TrayRecord`) is NOT
|
|
17
|
+
* wire contract and lives in `packages/cloudflare-worker/src/shared.ts`.
|
|
18
|
+
*/
|
|
19
|
+
export const TRAY_BOOTSTRAP_TIMEOUT_MS = 20_000;
|
|
20
|
+
export const TRAY_BOOTSTRAP_MAX_RETRIES = 3;
|
|
21
|
+
export const TRAY_BOOTSTRAP_RETRY_AFTER_MS = 1_000;
|
|
22
|
+
//# sourceMappingURL=tray-signaling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tray-signaling.js","sourceRoot":"","sources":["../src/tray-signaling.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAChD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,6BAA6B,GAAG,KAAK,CAAC"}
|
|
@@ -18,11 +18,12 @@
|
|
|
18
18
|
* Pure module (no node-only imports) so the WS gate is trivially unit
|
|
19
19
|
* testable from `tests/bridge-security.test.ts`.
|
|
20
20
|
*/
|
|
21
|
+
import { BRIDGE_SUBPROTOCOL_PREFIX, BRIDGE_TOKEN_HEADER, BRIDGE_TOKEN_QUERY_PARAM, BRIDGE_WS_QUERY_PARAM } from './_shared/index.js';
|
|
22
|
+
export { BRIDGE_SUBPROTOCOL_PREFIX, BRIDGE_TOKEN_HEADER, BRIDGE_TOKEN_QUERY_PARAM, BRIDGE_WS_QUERY_PARAM, };
|
|
21
23
|
/**
|
|
22
|
-
* Origin allowlist.
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* sync, otherwise extension and standalone disagree on what's a leader.
|
|
24
|
+
* Origin allowlist. The hosted origins come from `@slicc/shared-ts`
|
|
25
|
+
* (`bridge-protocol.ts`) — the same constants the extension allowlist
|
|
26
|
+
* composes from — plus this server's own dev-mode loopback origins.
|
|
26
27
|
*
|
|
27
28
|
* Dev-only extra origins can be added at process start via the
|
|
28
29
|
* `BRIDGE_DEV_ALLOWED_ORIGINS` env var (comma-separated). Used by the
|
|
@@ -31,21 +32,6 @@
|
|
|
31
32
|
* allowlist is byte-identical to this frozen base — prod is unaffected.
|
|
32
33
|
*/
|
|
33
34
|
export declare const BRIDGE_ALLOWED_ORIGINS: readonly string[];
|
|
34
|
-
/** Subprotocol prefix advertised by the leader; the per-process token is appended. */
|
|
35
|
-
export declare const BRIDGE_SUBPROTOCOL_PREFIX = "slicc.bridge.v1.";
|
|
36
|
-
/** Query-param name the launch URL uses to forward the subprotocol token to the leader. */
|
|
37
|
-
export declare const BRIDGE_TOKEN_QUERY_PARAM = "bridgeToken";
|
|
38
|
-
/** Query-param name the launch URL uses to forward the local /cdp WebSocket URL. */
|
|
39
|
-
export declare const BRIDGE_WS_QUERY_PARAM = "bridge";
|
|
40
|
-
/**
|
|
41
|
-
* Request header carrying the per-process bridge token on cross-origin
|
|
42
|
-
* /api/* calls from a remote allowlisted leader (e.g. sliccy.ai). The
|
|
43
|
-
* webapp's `proxied-fetch.ts` attaches it whenever a local API base
|
|
44
|
-
* origin is set; the thin-bridge CORS middleware validates it. Header
|
|
45
|
-
* is included in `CORS_BASE_ALLOW_HEADERS` so browsers don't strip it
|
|
46
|
-
* on the preflight.
|
|
47
|
-
*/
|
|
48
|
-
export declare const BRIDGE_TOKEN_HEADER = "X-Bridge-Token";
|
|
49
35
|
/**
|
|
50
36
|
* True iff `origin` is in the bridge allowlist. The frozen prod base
|
|
51
37
|
* (`BRIDGE_ALLOWED_ORIGINS`) is matched case-sensitively against the
|
|
@@ -19,11 +19,15 @@
|
|
|
19
19
|
* testable from `tests/bridge-security.test.ts`.
|
|
20
20
|
*/
|
|
21
21
|
import { randomUUID, timingSafeEqual } from 'node:crypto';
|
|
22
|
+
import { BRIDGE_SUBPROTOCOL_PREFIX, BRIDGE_TOKEN_HEADER, BRIDGE_TOKEN_QUERY_PARAM, BRIDGE_WS_QUERY_PARAM, SLICC_HOSTED_ORIGIN, SLICC_STAGING_HUB_ORIGIN, } from './_shared/index.js';
|
|
23
|
+
// Re-exported so the many existing bridge-security importers (index.ts,
|
|
24
|
+
// launch-url.ts, electron-controller.ts, tests) keep their import surface.
|
|
25
|
+
// Canonical definitions: packages/shared-ts/src/bridge-protocol.ts.
|
|
26
|
+
export { BRIDGE_SUBPROTOCOL_PREFIX, BRIDGE_TOKEN_HEADER, BRIDGE_TOKEN_QUERY_PARAM, BRIDGE_WS_QUERY_PARAM, };
|
|
22
27
|
/**
|
|
23
|
-
* Origin allowlist.
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* sync, otherwise extension and standalone disagree on what's a leader.
|
|
28
|
+
* Origin allowlist. The hosted origins come from `@slicc/shared-ts`
|
|
29
|
+
* (`bridge-protocol.ts`) — the same constants the extension allowlist
|
|
30
|
+
* composes from — plus this server's own dev-mode loopback origins.
|
|
27
31
|
*
|
|
28
32
|
* Dev-only extra origins can be added at process start via the
|
|
29
33
|
* `BRIDGE_DEV_ALLOWED_ORIGINS` env var (comma-separated). Used by the
|
|
@@ -32,8 +36,8 @@ import { randomUUID, timingSafeEqual } from 'node:crypto';
|
|
|
32
36
|
* allowlist is byte-identical to this frozen base — prod is unaffected.
|
|
33
37
|
*/
|
|
34
38
|
export const BRIDGE_ALLOWED_ORIGINS = Object.freeze([
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
SLICC_HOSTED_ORIGIN,
|
|
40
|
+
SLICC_STAGING_HUB_ORIGIN,
|
|
37
41
|
'http://localhost:5710',
|
|
38
42
|
'http://127.0.0.1:5710',
|
|
39
43
|
]);
|
|
@@ -81,21 +85,6 @@ const BRIDGE_DEV_ALLOWED_ORIGINS = (() => {
|
|
|
81
85
|
}
|
|
82
86
|
return set;
|
|
83
87
|
})();
|
|
84
|
-
/** Subprotocol prefix advertised by the leader; the per-process token is appended. */
|
|
85
|
-
export const BRIDGE_SUBPROTOCOL_PREFIX = 'slicc.bridge.v1.';
|
|
86
|
-
/** Query-param name the launch URL uses to forward the subprotocol token to the leader. */
|
|
87
|
-
export const BRIDGE_TOKEN_QUERY_PARAM = 'bridgeToken';
|
|
88
|
-
/** Query-param name the launch URL uses to forward the local /cdp WebSocket URL. */
|
|
89
|
-
export const BRIDGE_WS_QUERY_PARAM = 'bridge';
|
|
90
|
-
/**
|
|
91
|
-
* Request header carrying the per-process bridge token on cross-origin
|
|
92
|
-
* /api/* calls from a remote allowlisted leader (e.g. sliccy.ai). The
|
|
93
|
-
* webapp's `proxied-fetch.ts` attaches it whenever a local API base
|
|
94
|
-
* origin is set; the thin-bridge CORS middleware validates it. Header
|
|
95
|
-
* is included in `CORS_BASE_ALLOW_HEADERS` so browsers don't strip it
|
|
96
|
-
* on the preflight.
|
|
97
|
-
*/
|
|
98
|
-
export const BRIDGE_TOKEN_HEADER = 'X-Bridge-Token';
|
|
99
88
|
/**
|
|
100
89
|
* Headers we allow on cross-origin /api requests from the hosted leader.
|
|
101
90
|
* Includes the `/api/fetch-proxy` transport headers (`X-Target-URL`, the
|