sliccy 6.96.5 → 6.96.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/node-server/bridge-security.js +6 -0
  2. package/dist/node-server/fetch-proxy-headers.d.ts +18 -2
  3. package/dist/node-server/fetch-proxy-headers.js +39 -4
  4. package/dist/node-server/routes/fetch-proxy.js +12 -1
  5. package/dist/ui/.vite/manifest.json +132 -132
  6. package/dist/ui/assets/{account-store-Dx1WcjCr.js → account-store-BVE4jy3-.js} +1 -1
  7. package/dist/ui/assets/{account-store-BwBEcWZO.js → account-store-Ce0SDy-x.js} +1 -1
  8. package/dist/ui/assets/{adobe-CgHB4rci.js → adobe-D-qSi6qK.js} +1 -1
  9. package/dist/ui/assets/{adobe-BmKkXfB_.js → adobe-Ge97KLMm.js} +1 -1
  10. package/dist/ui/assets/{apply-layout-BCsXEx0D.js → apply-layout-CKgio92B.js} +1 -1
  11. package/dist/ui/assets/{apps-BRV6ETTo.js → apps-BZ1Ze9xG.js} +1 -1
  12. package/dist/ui/assets/{azure-openai-CSaN4jeV.js → azure-openai-Br-YVliw.js} +1 -1
  13. package/dist/ui/assets/{azure-openai-Cd4wS9K7.js → azure-openai-BxchqcZz.js} +1 -1
  14. package/dist/ui/assets/{cerebras-CHW-b6GG.js → cerebras-BxhrOznk.js} +1 -1
  15. package/dist/ui/assets/{cerebras-B3O43tZ5.js → cerebras-DDxUqnjA.js} +1 -1
  16. package/dist/ui/assets/{connect-surface-ssx7-Dy-.js → connect-surface-bwxW3nc9.js} +1 -1
  17. package/dist/ui/assets/{fs-aWeCFB3S.js → fs-DCZHO1bL.js} +1 -1
  18. package/dist/ui/assets/{fs-B6xgXxxw.js → fs-DOCTNZa7.js} +2 -2
  19. package/dist/ui/assets/{github-BqTcNMXU.js → github-DM_HbGTJ.js} +1 -1
  20. package/dist/ui/assets/{github-CQkROylj.js → github-FRx8QPIA.js} +2 -2
  21. package/dist/ui/assets/{github-copilot-BqPtV3Bs.js → github-copilot-DugWb9Fn.js} +1 -1
  22. package/dist/ui/assets/{github-copilot-Cz2i1wQ3.js → github-copilot-NoeeY5fk.js} +1 -1
  23. package/dist/ui/assets/{github-install-B3Dv8nq2.js → github-install-26Z37QZ1.js} +1 -1
  24. package/dist/ui/assets/{github-zip-CNXaAVaK.js → github-zip-CyhHeOHP.js} +1 -1
  25. package/dist/ui/assets/{js-realm-worker-DTp0em4K.js → js-realm-worker-BFHvIAgF.js} +1 -1
  26. package/dist/ui/assets/{kernel-worker-eFEXUNFZ.js → kernel-worker-BR5Utwcd.js} +637 -635
  27. package/dist/ui/assets/{local-llm-BjtZ6nHy.js → local-llm-CxgeyaQJ.js} +1 -1
  28. package/dist/ui/assets/{local-llm-BD1xDJr1.js → local-llm-Ibx1LmKI.js} +1 -1
  29. package/dist/ui/assets/{main-Cg_0I3qd.js → main-ahNtj47U.js} +3 -3
  30. package/dist/ui/assets/{mount-DucWPMJJ.js → mount-D0y_mTHQ.js} +2 -2
  31. package/dist/ui/assets/{mount-CJV6tG8D.js → mount-Dry2Wnls.js} +1 -1
  32. package/dist/ui/assets/{mount-recovery-DWg5BeKv.js → mount-recovery-BSAMGifF.js} +1 -1
  33. package/dist/ui/assets/{new-session-BBoeWLbt.js → new-session-CDOzd_eS.js} +2 -2
  34. package/dist/ui/assets/{oauth-bootstrap-CDjey4JB.js → oauth-bootstrap-BBKPU9y-.js} +2 -2
  35. package/dist/ui/assets/{openai-codex-b0VevFcF.js → openai-codex-CC0qB4c1.js} +1 -1
  36. package/dist/ui/assets/{openai-codex-BoCQrZ1p.js → openai-codex-DCbXq5Ra.js} +1 -1
  37. package/dist/ui/assets/{openrouter-mxsetAE4.js → openrouter-DcM3y1vc.js} +1 -1
  38. package/dist/ui/assets/{openrouter-BprooYu2.js → openrouter-DjjqhBZw.js} +1 -1
  39. package/dist/ui/assets/{openrouter-oauth-BdXIC5da.js → openrouter-oauth-Bmgp5WD2.js} +1 -1
  40. package/dist/ui/assets/{openrouter-oauth-CkuyJSAb.js → openrouter-oauth-CtW44Dmk.js} +1 -1
  41. package/dist/ui/assets/{panel-rpc-handlers-DuWWLAzY.js → panel-rpc-handlers-DbJlEuL7.js} +2 -2
  42. package/dist/ui/assets/{panelize-shell-C2n0OG-k.js → panelize-shell-COz1Z7LB.js} +1 -1
  43. package/dist/ui/assets/{provider--JoQJygG.js → provider-CMq1ZUes.js} +2 -2
  44. package/dist/ui/assets/{provider-Bdsl0MWy.js → provider-DXuXmxfK.js} +1 -1
  45. package/dist/ui/assets/{provider-settings-D_W173zT.js → provider-settings-BpvNOSqu.js} +1 -1
  46. package/dist/ui/assets/{provider-settings-DGkqxTbY.js → provider-settings-pc_JYEQm.js} +1 -1
  47. package/dist/ui/assets/provider-store-access-CcTfXOdm.js +1 -0
  48. package/dist/ui/assets/{provider-store-access-Bq7wWB6u.js → provider-store-access-CyCqMeZi.js} +2 -2
  49. package/dist/ui/assets/{providers-qyq8oyjE.js → providers-CYj4AuBU.js} +2 -2
  50. package/dist/ui/assets/{providers-CgIuxlnK.js → providers-KAUC4e8l.js} +1 -1
  51. package/dist/ui/assets/{quick-llm-OR-YMhic.js → quick-llm-u1V9BBkp.js} +1 -1
  52. package/dist/ui/assets/{recovery-screen-Lr3-6FUG.js → recovery-screen-BEwcubM6.js} +1 -1
  53. package/dist/ui/assets/{redirect-uri-BKfi7JzM.js → redirect-uri-yUf5LHNS.js} +1 -1
  54. package/dist/ui/assets/{session-freezer-D6ZdNTZ7.js → session-freezer-D50pAXC6.js} +3 -3
  55. package/dist/ui/assets/{setup-feature-flags-remote-1mQzGE4H.js → setup-feature-flags-remote-CV9wUYKD.js} +1 -1
  56. package/dist/ui/assets/{setup-standalone-prelude-D-fsB4tA.js → setup-standalone-prelude-DVKdy8XN.js} +1 -1
  57. package/dist/ui/assets/{setup-sudo-BYsgoc-e.js → setup-sudo-YCcB2IAi.js} +2 -2
  58. package/dist/ui/assets/{skills-B_clT8gi.js → skills-CiVGHYb4.js} +1 -1
  59. package/dist/ui/assets/slicc-version-GgXLmqeF.js +1 -0
  60. package/dist/ui/assets/{src-Bw7lN3n5.js → src-CG9Sp0SZ.js} +80 -76
  61. package/dist/ui/assets/{store-CtiYsYpG.js → store-CKms8ZfU.js} +1 -1
  62. package/dist/ui/assets/{store-k_VtjJeV.js → store-Cr6JJ8_Z.js} +1 -1
  63. package/dist/ui/assets/{sudo-B2uxPipc.js → sudo--pBfO6U8.js} +1 -1
  64. package/dist/ui/assets/{upgrade-detection-Bu0E74pM.js → upgrade-detection-B02GwFuJ.js} +1 -1
  65. package/dist/ui/assets/{wc-attach-CtIH1DsM.js → wc-attach-BbEnzTrf.js} +2 -2
  66. package/dist/ui/assets/{wc-extension-XOL2gbOc.js → wc-extension-BzUEDPxr.js} +2 -2
  67. package/dist/ui/assets/{wc-float-label-Bj-0-MZA.js → wc-float-label-BATxvSb5.js} +1 -1
  68. package/dist/ui/assets/{wc-floatbar-online-Do-_H9l4.js → wc-floatbar-online-Dogbrrqe.js} +1 -1
  69. package/dist/ui/assets/{wc-follower-Bfh_t4bi.js → wc-follower-D5iut7k7.js} +3 -3
  70. package/dist/ui/assets/{wc-live-BxboYyYC.js → wc-live-BciOQ5DG.js} +4 -4
  71. package/dist/ui/assets/{wc-nav-DpAIgtYn.js → wc-nav-DKroWdgw.js} +2 -2
  72. package/dist/ui/assets/{wc-onboarding-DMtKcL4H.js → wc-onboarding-CrEx1j_R.js} +2 -2
  73. package/dist/ui/assets/{wc-placeholder-iicpBco1.js → wc-placeholder-ClynEvfd.js} +2 -2
  74. package/dist/ui/assets/{wc-settings-BuyKUI-r.js → wc-settings-Dcr76N3I.js} +2 -2
  75. package/dist/ui/assets/{wc-shell-CfdPzB2G.js → wc-shell-DA11yk41.js} +3 -3
  76. package/dist/ui/assets/{wc-sprinkles-DgAKkrKv.js → wc-sprinkles-CswzFow2.js} +2 -2
  77. package/dist/ui/assets/{wc-tray-w7M0LljR.js → wc-tray-CJq1AMmu.js} +2 -2
  78. package/dist/ui/assets/{xai-grok-BgEzD8-1.js → xai-grok-BsWUPA4u.js} +1 -1
  79. package/dist/ui/assets/{xai-grok-B8s45pbP.js → xai-grok-BzwRRpAO.js} +1 -1
  80. package/dist/ui/index.html +6 -6
  81. package/dist/ui/packages/webapp/index.html +6 -6
  82. package/package.json +1 -1
  83. package/dist/ui/assets/provider-store-access-CKbDPuyn.js +0 -1
  84. package/dist/ui/assets/slicc-version-DOZIgl5t.js +0 -1
@@ -111,6 +111,12 @@ const CORS_BASE_ALLOW_HEADERS = [
111
111
  * (`isProxyError` reads `X-Proxy-Error`) and the forbidden-response
112
112
  * bridge (`decodeForbiddenResponseHeaders` reads `X-Proxy-Set-Cookie`). MCP
113
113
  * clients also read protocol negotiation/session headers from proxy responses.
114
+ *
115
+ * `/api/fetch-proxy` overrides this per-response with the union of this base
116
+ * set and every forwarded upstream header name (see
117
+ * `buildFetchProxyExposeHeaders`) so agents can inspect non-CORS-safelisted
118
+ * headers such as Content-Security-Policy. Other `/api/*` routes keep this
119
+ * static list.
114
120
  */
115
121
  const CORS_EXPOSE_HEADERS = 'Link, X-Proxy-Error, X-Proxy-Set-Cookie, X-Proxy-Content-Length, Mcp-Session-Id, MCP-Protocol-Version';
116
122
  /**
@@ -42,11 +42,27 @@ export declare const FETCH_PROXY_SKIP_RESPONSE_HEADERS: ReadonlySet<string>;
42
42
  * middleware remains the sole CORS authority. `x-proxy-` is the proxy's
43
43
  * own response-marker namespace — never echo an upstream value.
44
44
  */
45
+ export declare const FETCH_PROXY_SKIP_RESPONSE_PREFIXES: readonly string[];
45
46
  /**
46
47
  * Proxy-set response header carrying the upstream `content-length` when it is
47
48
  * exact (identity encoding). Read by the webapp's `proxied-fetch.ts` to drive
48
49
  * determinate download progress; never copied from upstream (the `x-proxy-`
49
- * prefix below guarantees that).
50
+ * prefix above guarantees that).
50
51
  */
51
52
  export declare const FETCH_PROXY_CONTENT_LENGTH_HEADER = "X-Proxy-Content-Length";
52
- export declare const FETCH_PROXY_SKIP_RESPONSE_PREFIXES: readonly string[];
53
+ /**
54
+ * Response headers the browser must always be allowed to read on the
55
+ * `/api/fetch-proxy` hop, even when the upstream response carries none of
56
+ * them. Kept in sync with `CORS_EXPOSE_HEADERS` in `bridge-security.ts` and
57
+ * `BridgeSecurity.corsExposeHeaders` in the Swift server. The route appends
58
+ * every forwarded upstream header name on top of this base so agents can
59
+ * inspect CSP / HSTS / ETag / etc. — browsers only surface non-CORS-safelisted
60
+ * response headers when they appear here (credentials mode forbids `*`).
61
+ */
62
+ export declare const FETCH_PROXY_BASE_EXPOSE_HEADERS: readonly string[];
63
+ /**
64
+ * Build the `Access-Control-Expose-Headers` value for a proxied response:
65
+ * the static proxy markers plus every header name we actually forwarded.
66
+ * Dedupes case-insensitively while preserving the first-seen spelling.
67
+ */
68
+ export declare function buildFetchProxyExposeHeaders(forwardedHeaderNames: Iterable<string>): string;
@@ -65,14 +65,49 @@ export const FETCH_PROXY_SKIP_RESPONSE_HEADERS = new Set([
65
65
  * middleware remains the sole CORS authority. `x-proxy-` is the proxy's
66
66
  * own response-marker namespace — never echo an upstream value.
67
67
  */
68
+ export const FETCH_PROXY_SKIP_RESPONSE_PREFIXES = [
69
+ 'access-control-',
70
+ 'x-proxy-',
71
+ ];
68
72
  /**
69
73
  * Proxy-set response header carrying the upstream `content-length` when it is
70
74
  * exact (identity encoding). Read by the webapp's `proxied-fetch.ts` to drive
71
75
  * determinate download progress; never copied from upstream (the `x-proxy-`
72
- * prefix below guarantees that).
76
+ * prefix above guarantees that).
73
77
  */
74
78
  export const FETCH_PROXY_CONTENT_LENGTH_HEADER = 'X-Proxy-Content-Length';
75
- export const FETCH_PROXY_SKIP_RESPONSE_PREFIXES = [
76
- 'access-control-',
77
- 'x-proxy-',
79
+ /**
80
+ * Response headers the browser must always be allowed to read on the
81
+ * `/api/fetch-proxy` hop, even when the upstream response carries none of
82
+ * them. Kept in sync with `CORS_EXPOSE_HEADERS` in `bridge-security.ts` and
83
+ * `BridgeSecurity.corsExposeHeaders` in the Swift server. The route appends
84
+ * every forwarded upstream header name on top of this base so agents can
85
+ * inspect CSP / HSTS / ETag / etc. — browsers only surface non-CORS-safelisted
86
+ * response headers when they appear here (credentials mode forbids `*`).
87
+ */
88
+ export const FETCH_PROXY_BASE_EXPOSE_HEADERS = [
89
+ 'Link',
90
+ 'X-Proxy-Error',
91
+ 'X-Proxy-Set-Cookie',
92
+ FETCH_PROXY_CONTENT_LENGTH_HEADER,
93
+ 'Mcp-Session-Id',
94
+ 'MCP-Protocol-Version',
95
+ 'Cache-Control',
78
96
  ];
97
+ /**
98
+ * Build the `Access-Control-Expose-Headers` value for a proxied response:
99
+ * the static proxy markers plus every header name we actually forwarded.
100
+ * Dedupes case-insensitively while preserving the first-seen spelling.
101
+ */
102
+ export function buildFetchProxyExposeHeaders(forwardedHeaderNames) {
103
+ const seen = new Set();
104
+ const out = [];
105
+ for (const name of [...FETCH_PROXY_BASE_EXPOSE_HEADERS, ...forwardedHeaderNames]) {
106
+ const lower = name.toLowerCase();
107
+ if (seen.has(lower))
108
+ continue;
109
+ seen.add(lower);
110
+ out.push(name);
111
+ }
112
+ return out.join(', ');
113
+ }
@@ -1,7 +1,7 @@
1
1
  import { Readable, Transform } from 'node:stream';
2
2
  import { StringDecoder } from 'node:string_decoder';
3
3
  import { HMAC_SIGN_HEADER, isLoopbackOrigin, isTextContentType } from '../_shared/index.js';
4
- import { FETCH_PROXY_CONTENT_LENGTH_HEADER, FETCH_PROXY_SKIP_HEADERS, FETCH_PROXY_SKIP_RESPONSE_HEADERS, FETCH_PROXY_SKIP_RESPONSE_PREFIXES, } from '../fetch-proxy-headers.js';
4
+ import { buildFetchProxyExposeHeaders, FETCH_PROXY_CONTENT_LENGTH_HEADER, FETCH_PROXY_SKIP_HEADERS, FETCH_PROXY_SKIP_RESPONSE_HEADERS, FETCH_PROXY_SKIP_RESPONSE_PREFIXES, } from '../fetch-proxy-headers.js';
5
5
  import { AgentActivityTracker, registerAgentActivityRoute } from './agent-activity.js';
6
6
  /** Pick the first value of a possibly-multi-valued request header. */
7
7
  function firstHeaderValue(value) {
@@ -141,10 +141,17 @@ function unmaskRequestBody(secretProxy, headers, rawBody, targetHostname) {
141
141
  * middleware remains the sole authority on the browser→bridge hop —
142
142
  * see `FETCH_PROXY_SKIP_RESPONSE_HEADERS` / `..._PREFIXES`. All header
143
143
  * values are secret-scrubbed.
144
+ *
145
+ * After forwarding, set `Access-Control-Expose-Headers` to the union of the
146
+ * proxy markers and every forwarded header name. Cross-origin thin-bridge
147
+ * callers (sliccy.ai → localhost) run under credentials mode, so the
148
+ * browser otherwise only surfaces CORS-safelisted headers and agents
149
+ * silently miss CSP / HSTS / X-Frame-Options / ETag / etc.
144
150
  */
145
151
  function forwardUpstreamHeaders(res, upstream, secretProxy) {
146
152
  res.status(upstream.status);
147
153
  res.setHeader('Cache-Control', 'no-store, no-cache');
154
+ const forwardedNames = [];
148
155
  const setCookieValues = upstream.headers.getSetCookie();
149
156
  upstream.headers.forEach((v, k) => {
150
157
  const lower = k.toLowerCase();
@@ -154,6 +161,7 @@ function forwardUpstreamHeaders(res, upstream, secretProxy) {
154
161
  return;
155
162
  // Headers are small — one-shot scrub, no per-chunk semantics.
156
163
  res.setHeader(k, secretProxy.scrubResponse(v));
164
+ forwardedNames.push(k);
157
165
  });
158
166
  if (setCookieValues.length > 0) {
159
167
  res.setHeader('X-Proxy-Set-Cookie', secretProxy.scrubResponse(JSON.stringify(setCookieValues)));
@@ -175,6 +183,9 @@ function forwardUpstreamHeaders(res, upstream, secretProxy) {
175
183
  if (upstreamLength && !upstream.headers.get('content-encoding') && /^\d+$/.test(upstreamLength)) {
176
184
  res.setHeader(FETCH_PROXY_CONTENT_LENGTH_HEADER, upstreamLength);
177
185
  }
186
+ // Override the thin-bridge middleware's static expose list with the
187
+ // full set for this response. Credentials mode forbids `*`.
188
+ res.setHeader('Access-Control-Expose-Headers', buildFetchProxyExposeHeaders(forwardedNames));
178
189
  }
179
190
  /**
180
191
  * Buffer-aware UTF-8 secret scrubber. A `StringDecoder` keeps trailing partial