pyric 0.1.0-alpha.31 → 0.1.0-alpha.33

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 (224) hide show
  1. package/dist/ai/app-check-gate.d.ts +20 -10
  2. package/dist/ai/app-check-gate.d.ts.map +1 -1
  3. package/dist/ai/app-check-gate.js +20 -4
  4. package/dist/ai/app-check-gate.js.map +1 -1
  5. package/dist/ai/broker/gemini-engine.d.ts +10 -2
  6. package/dist/ai/broker/gemini-engine.d.ts.map +1 -1
  7. package/dist/ai/broker/gemini-engine.js +54 -24
  8. package/dist/ai/broker/gemini-engine.js.map +1 -1
  9. package/dist/ai/broker/gemini-upstream.d.ts.map +1 -1
  10. package/dist/ai/broker/gemini-upstream.js +11 -9
  11. package/dist/ai/broker/gemini-upstream.js.map +1 -1
  12. package/dist/ai/broker/upstream-error-redaction.d.ts.map +1 -1
  13. package/dist/ai/broker/upstream-error-redaction.js +10 -7
  14. package/dist/ai/broker/upstream-error-redaction.js.map +1 -1
  15. package/dist/ai/errors.d.ts +10 -6
  16. package/dist/ai/errors.d.ts.map +1 -1
  17. package/dist/ai/errors.js +34 -12
  18. package/dist/ai/errors.js.map +1 -1
  19. package/dist/ai/generation-enums.d.ts +0 -21
  20. package/dist/ai/generation-enums.d.ts.map +1 -1
  21. package/dist/ai/generation-enums.js +0 -18
  22. package/dist/ai/generation-enums.js.map +1 -1
  23. package/dist/ai/index.d.ts +1 -1
  24. package/dist/ai/index.d.ts.map +1 -1
  25. package/dist/ai/index.js +1 -1
  26. package/dist/ai/index.js.map +1 -1
  27. package/dist/ai/instances.js +1 -0
  28. package/dist/ai/instances.js.map +1 -1
  29. package/dist/ai/internal.d.ts.map +1 -1
  30. package/dist/ai/internal.js +1 -0
  31. package/dist/ai/internal.js.map +1 -1
  32. package/dist/ai/sandbox-plane.js +1 -1
  33. package/dist/ai/sandbox-plane.js.map +1 -1
  34. package/dist/ai/types.d.ts +4 -0
  35. package/dist/ai/types.d.ts.map +1 -1
  36. package/dist/app/diagnostics.d.ts +1 -1
  37. package/dist/app/diagnostics.js +1 -1
  38. package/dist/app/registry.d.ts.map +1 -1
  39. package/dist/app/registry.js +13 -6
  40. package/dist/app/registry.js.map +1 -1
  41. package/dist/app-check/index.d.ts.map +1 -1
  42. package/dist/app-check/index.js +5 -2
  43. package/dist/app-check/index.js.map +1 -1
  44. package/dist/app-check/state.d.ts.map +1 -1
  45. package/dist/app-check/state.js +5 -3
  46. package/dist/app-check/state.js.map +1 -1
  47. package/dist/auth/sandbox/driver.d.ts +1 -0
  48. package/dist/auth/sandbox/driver.d.ts.map +1 -1
  49. package/dist/auth/sandbox-backend.d.ts +7 -1
  50. package/dist/auth/sandbox-backend.d.ts.map +1 -1
  51. package/dist/auth/sandbox-backend.js +31 -2
  52. package/dist/auth/sandbox-backend.js.map +1 -1
  53. package/dist/firestore/lite.d.ts +2 -2
  54. package/dist/firestore/lite.d.ts.map +1 -1
  55. package/dist/firestore/lite.js +2 -2
  56. package/dist/firestore/lite.js.map +1 -1
  57. package/dist/firestore/sandbox/wire-encoder.d.ts.map +1 -1
  58. package/dist/firestore/sandbox/wire-encoder.js +7 -4
  59. package/dist/firestore/sandbox/wire-encoder.js.map +1 -1
  60. package/dist/rules/grammar/compile-limits.d.ts +1 -1
  61. package/dist/rules/grammar/compile-limits.d.ts.map +1 -1
  62. package/dist/rules/grammar/compile-limits.js +31 -0
  63. package/dist/rules/grammar/compile-limits.js.map +1 -1
  64. package/dist/rules/internal/index.d.ts +1 -0
  65. package/dist/rules/internal/index.d.ts.map +1 -1
  66. package/dist/rules/internal/index.js +2 -0
  67. package/dist/rules/internal/index.js.map +1 -1
  68. package/dist/rules/simulator/conversions.d.ts.map +1 -1
  69. package/dist/rules/simulator/conversions.js +18 -27
  70. package/dist/rules/simulator/conversions.js.map +1 -1
  71. package/dist/rules/simulator/evaluation-builtins.d.ts.map +1 -1
  72. package/dist/rules/simulator/evaluation-builtins.js +19 -13
  73. package/dist/rules/simulator/evaluation-builtins.js.map +1 -1
  74. package/dist/rules/simulator/evaluator.d.ts.map +1 -1
  75. package/dist/rules/simulator/evaluator.js +65 -35
  76. package/dist/rules/simulator/evaluator.js.map +1 -1
  77. package/dist/rules/simulator/firestore-values.d.ts +7 -2
  78. package/dist/rules/simulator/firestore-values.d.ts.map +1 -1
  79. package/dist/rules/simulator/firestore-values.js +12 -6
  80. package/dist/rules/simulator/firestore-values.js.map +1 -1
  81. package/dist/rules/simulator/handler.d.ts.map +1 -1
  82. package/dist/rules/simulator/handler.js +2 -1
  83. package/dist/rules/simulator/handler.js.map +1 -1
  84. package/dist/rules/simulator/host-value.d.ts +14 -0
  85. package/dist/rules/simulator/host-value.d.ts.map +1 -0
  86. package/dist/rules/simulator/host-value.js +60 -0
  87. package/dist/rules/simulator/host-value.js.map +1 -0
  88. package/dist/rules/simulator/index-access.d.ts +1 -1
  89. package/dist/rules/simulator/index-access.d.ts.map +1 -1
  90. package/dist/rules/simulator/index-access.js +22 -16
  91. package/dist/rules/simulator/index-access.js.map +1 -1
  92. package/dist/rules/simulator/mapdiff.d.ts +2 -0
  93. package/dist/rules/simulator/mapdiff.d.ts.map +1 -1
  94. package/dist/rules/simulator/mapdiff.js +6 -0
  95. package/dist/rules/simulator/mapdiff.js.map +1 -1
  96. package/dist/rules/simulator/math-builtins.d.ts.map +1 -1
  97. package/dist/rules/simulator/math-builtins.js +19 -27
  98. package/dist/rules/simulator/math-builtins.js.map +1 -1
  99. package/dist/rules/simulator/rules-int.d.ts +122 -0
  100. package/dist/rules/simulator/rules-int.d.ts.map +1 -0
  101. package/dist/rules/simulator/rules-int.js +241 -0
  102. package/dist/rules/simulator/rules-int.js.map +1 -0
  103. package/dist/rules/simulator/rules-type.d.ts.map +1 -1
  104. package/dist/rules/simulator/rules-type.js +4 -1
  105. package/dist/rules/simulator/rules-type.js.map +1 -1
  106. package/dist/rules/simulator/slice-bounds.d.ts +5 -2
  107. package/dist/rules/simulator/slice-bounds.d.ts.map +1 -1
  108. package/dist/rules/simulator/slice-bounds.js +6 -3
  109. package/dist/rules/simulator/slice-bounds.js.map +1 -1
  110. package/dist/rules/simulator/trace-recorder.d.ts +2 -0
  111. package/dist/rules/simulator/trace-recorder.d.ts.map +1 -1
  112. package/dist/rules/simulator/trace-recorder.js +5 -1
  113. package/dist/rules/simulator/trace-recorder.js.map +1 -1
  114. package/dist/rules/simulator/value-equality.d.ts +2 -1
  115. package/dist/rules/simulator/value-equality.d.ts.map +1 -1
  116. package/dist/rules/simulator/value-equality.js +18 -11
  117. package/dist/rules/simulator/value-equality.js.map +1 -1
  118. package/dist/rules/simulator/wrappers/duration.d.ts +18 -7
  119. package/dist/rules/simulator/wrappers/duration.d.ts.map +1 -1
  120. package/dist/rules/simulator/wrappers/duration.js +45 -25
  121. package/dist/rules/simulator/wrappers/duration.js.map +1 -1
  122. package/dist/rules/simulator/wrappers/float.d.ts +7 -9
  123. package/dist/rules/simulator/wrappers/float.d.ts.map +1 -1
  124. package/dist/rules/simulator/wrappers/float.js +24 -17
  125. package/dist/rules/simulator/wrappers/float.js.map +1 -1
  126. package/dist/sandbox/internal/app-check-token.d.ts +2 -0
  127. package/dist/sandbox/internal/app-check-token.d.ts.map +1 -1
  128. package/dist/sandbox/internal/app-check-token.js +1 -0
  129. package/dist/sandbox/internal/app-check-token.js.map +1 -1
  130. package/dist/sandbox/internal/index.d.ts +1 -0
  131. package/dist/sandbox/internal/index.d.ts.map +1 -1
  132. package/dist/sandbox/internal/index.js +1 -0
  133. package/dist/sandbox/internal/index.js.map +1 -1
  134. package/dist/sandbox/internal/provider-email-verification.d.ts +3 -0
  135. package/dist/sandbox/internal/provider-email-verification.d.ts.map +1 -0
  136. package/dist/sandbox/internal/provider-email-verification.js +22 -0
  137. package/dist/sandbox/internal/provider-email-verification.js.map +1 -0
  138. package/dist/storage/sandbox/rules-bindings.d.ts.map +1 -1
  139. package/dist/storage/sandbox/rules-bindings.js +3 -1
  140. package/dist/storage/sandbox/rules-bindings.js.map +1 -1
  141. package/dist/storage/sandbox/rules-evaluator.d.ts.map +1 -1
  142. package/dist/storage/sandbox/rules-evaluator.js +78 -20
  143. package/dist/storage/sandbox/rules-evaluator.js.map +1 -1
  144. package/dist/storage/sandbox/rules-firestore-lookup.d.ts.map +1 -1
  145. package/dist/storage/sandbox/rules-firestore-lookup.js +9 -28
  146. package/dist/storage/sandbox/rules-firestore-lookup.js.map +1 -1
  147. package/dist/storage/sandbox/rules-latlng.d.ts.map +1 -1
  148. package/dist/storage/sandbox/rules-latlng.js +2 -9
  149. package/dist/storage/sandbox/rules-latlng.js.map +1 -1
  150. package/dist/storage/sandbox/rules-methods.d.ts +5 -5
  151. package/dist/storage/sandbox/rules-methods.d.ts.map +1 -1
  152. package/dist/storage/sandbox/rules-methods.js +11 -11
  153. package/dist/storage/sandbox/rules-methods.js.map +1 -1
  154. package/dist/storage/sandbox/rules-operators.d.ts +14 -11
  155. package/dist/storage/sandbox/rules-operators.d.ts.map +1 -1
  156. package/dist/storage/sandbox/rules-operators.js +44 -55
  157. package/dist/storage/sandbox/rules-operators.js.map +1 -1
  158. package/dist/storage/sandbox/rules-path.d.ts +21 -0
  159. package/dist/storage/sandbox/rules-path.d.ts.map +1 -1
  160. package/dist/storage/sandbox/rules-path.js +47 -2
  161. package/dist/storage/sandbox/rules-path.js.map +1 -1
  162. package/dist/storage/sandbox/rules-time-methods.d.ts.map +1 -1
  163. package/dist/storage/sandbox/rules-time-methods.js +8 -8
  164. package/dist/storage/sandbox/rules-time-methods.js.map +1 -1
  165. package/dist/storage/sandbox/rules-values.d.ts +0 -1
  166. package/dist/storage/sandbox/rules-values.d.ts.map +1 -1
  167. package/dist/storage/sandbox/rules-values.js +0 -8
  168. package/dist/storage/sandbox/rules-values.js.map +1 -1
  169. package/dist/storage/sandbox/rules.d.ts +1 -1
  170. package/dist/storage/sandbox/rules.d.ts.map +1 -1
  171. package/dist/storage/sandbox/rules.js +5 -12
  172. package/dist/storage/sandbox/rules.js.map +1 -1
  173. package/package.json +4 -3
  174. package/src/ai/app-check-gate.ts +37 -11
  175. package/src/ai/broker/gemini-engine.ts +63 -26
  176. package/src/ai/broker/gemini-upstream.ts +11 -8
  177. package/src/ai/broker/upstream-error-redaction.ts +9 -6
  178. package/src/ai/errors.ts +40 -11
  179. package/src/ai/generation-enums.ts +0 -24
  180. package/src/ai/index.ts +0 -3
  181. package/src/ai/instances.ts +1 -0
  182. package/src/ai/internal.ts +1 -0
  183. package/src/ai/sandbox-plane.ts +1 -1
  184. package/src/ai/types.ts +4 -0
  185. package/src/app/diagnostics.test.ts +1 -1
  186. package/src/app/diagnostics.ts +1 -1
  187. package/src/app/registry.ts +21 -8
  188. package/src/app-check/index.ts +5 -2
  189. package/src/app-check/state.ts +5 -3
  190. package/src/auth/sandbox/driver.ts +1 -1
  191. package/src/auth/sandbox-backend.ts +31 -3
  192. package/src/firestore/lite.ts +2 -2
  193. package/src/firestore/sandbox/wire-encoder.ts +7 -4
  194. package/src/rules/grammar/compile-limits.ts +35 -1
  195. package/src/rules/internal/index.ts +3 -0
  196. package/src/rules/simulator/conversions.ts +15 -21
  197. package/src/rules/simulator/evaluation-builtins.ts +18 -14
  198. package/src/rules/simulator/evaluator.ts +71 -28
  199. package/src/rules/simulator/firestore-values.ts +10 -4
  200. package/src/rules/simulator/handler.ts +2 -1
  201. package/src/rules/simulator/host-value.ts +57 -0
  202. package/src/rules/simulator/index-access.ts +23 -17
  203. package/src/rules/simulator/mapdiff.ts +7 -0
  204. package/src/rules/simulator/math-builtins.ts +26 -25
  205. package/src/rules/simulator/rules-int.ts +250 -0
  206. package/src/rules/simulator/rules-type.ts +3 -1
  207. package/src/rules/simulator/slice-bounds.ts +7 -4
  208. package/src/rules/simulator/trace-recorder.ts +5 -1
  209. package/src/rules/simulator/value-equality.ts +23 -9
  210. package/src/rules/simulator/wrappers/duration.ts +50 -29
  211. package/src/rules/simulator/wrappers/float.ts +22 -16
  212. package/src/sandbox/internal/app-check-token.ts +3 -0
  213. package/src/sandbox/internal/index.ts +1 -0
  214. package/src/sandbox/internal/provider-email-verification.ts +22 -0
  215. package/src/storage/sandbox/rules-bindings.ts +3 -1
  216. package/src/storage/sandbox/rules-evaluator.ts +81 -20
  217. package/src/storage/sandbox/rules-firestore-lookup.ts +7 -26
  218. package/src/storage/sandbox/rules-latlng.ts +2 -8
  219. package/src/storage/sandbox/rules-methods.ts +12 -11
  220. package/src/storage/sandbox/rules-operators.ts +56 -51
  221. package/src/storage/sandbox/rules-path.ts +45 -2
  222. package/src/storage/sandbox/rules-time-methods.ts +10 -10
  223. package/src/storage/sandbox/rules-values.ts +0 -8
  224. package/src/storage/sandbox/rules.ts +7 -9
@@ -1,12 +1,15 @@
1
1
  /**
2
2
  * Firebase AI Logic's App Check gate, as the sandbox plays it.
3
3
  *
4
- * From November 2, 2026 AI Logic requires App Check on every project. A
5
- * request with no `X-Firebase-AppCheck` header, a malformed one, the web SDK's
6
- * placeholder token, or a token whose signature fails gets HTTP 403
7
- * `PERMISSION_DENIED` (capture `app-check-ai-gate-wire`, `noHeader.raw`), and
8
- * a valid token answers. The sandbox broker refuses the same requests with the
9
- * same envelope before any engine runs.
4
+ * What AI Logic answers a request without a valid App Check token depends on
5
+ * the project. Enforcement is required from a date each project can set, up to
6
+ * January 21, 2027, and an unenforced project may answer 200 until then. The
7
+ * sandbox always refuses, so an app finds the missing token before production
8
+ * does: a request with no `X-Firebase-AppCheck` header, a malformed one, the web
9
+ * SDK's placeholder token, or a token whose signature fails gets HTTP 403
10
+ * `PERMISSION_DENIED`, the envelope captured from another unenforced project
11
+ * (`earlier-captures/ai-logic-refusal-unenforced.json`), before any engine runs.
12
+ * A valid token answers. See #1300.
10
13
  *
11
14
  * The App Check claim a request carries comes from the handle: `getAI(app)`
12
15
  * reads the app's App Check activation when it builds the handle, as the SDK's
@@ -18,15 +21,22 @@
18
21
  *
19
22
  * The error the app gets stays production's. Pyric's guidance rides beside
20
23
  * it: on the `request_rejected` event the dev server prints, and once per app
21
- * as a `console.warn` in the page or process.
24
+ * as a `console.warn` in the page or process. A server process (a registered
25
+ * Node process, a server-rendered module) gets its own guidance: the reCAPTCHA
26
+ * providers throw there and it has no `self`, so it sets the debug token on
27
+ * `globalThis` beside a CustomProvider, as `build/ai-logic.md` shows (#1639).
28
+ * A page's workers are browser realms: they have no `document`, but `self`
29
+ * works there, so they keep the page guidance.
22
30
  */
23
31
  import type { FirebaseApp } from '../app/types.js';
24
32
  import type { AppCheckClaim, WireErrorEnvelope } from './broker/types.js';
25
- /** Production's message for a refused request (capture `app-check-ai-gate-wire`), verbatim. */
33
+ /** Production's message for a refused request (`earlier-captures/ai-logic-refusal-unenforced.json`), verbatim. */
26
34
  export declare const APP_CHECK_REQUIRED_MESSAGE = "Firebase AI Logic has been deactivated in this project. To resume using Firebase AI Logic, you must enforce Firebase App Check. Learn more: https://firebase.google.com/docs/ai-logic/app-check";
27
- /** Pyric's guidance, printed beside production's error, never in place of it. */
35
+ /** Pyric's guidance for a page, printed beside production's error, never in place of it. */
28
36
  export declare const APP_CHECK_HINT = "Firebase AI Logic refuses requests without an App Check token, and so does the sandbox. Call initializeAppCheck(app, { provider }) before getAI(app). For local development, set self.FIREBASE_APPCHECK_DEBUG_TOKEN = true before initializeAppCheck to use the debug provider; the sandbox accepts its tokens. https://firebase.google.com/docs/ai-logic/app-check";
29
- /** The captured refusal envelope (`app-check-ai-gate-wire`, `noHeader.raw`). */
37
+ /** Pyric's guidance for a server process, where reCAPTCHA throws and `self` does not exist. */
38
+ export declare const APP_CHECK_SERVER_HINT = "Firebase AI Logic refuses requests without an App Check token, and so does the sandbox. This process has no document, so the reCAPTCHA providers throw here. For local development, set globalThis.FIREBASE_APPCHECK_DEBUG_TOKEN = true, then call initializeAppCheck(app, { provider: new CustomProvider({ getToken }) }) before getAI(app). The sandbox does not call getToken while the debug token is set. Without the debug token, getToken returns { token, expireTimeMillis: Date.now() + ttlMillis } from a token your server mints with firebase-admin's getAppCheck().createToken(appId). https://firebase.google.com/docs/ai-logic/app-check";
39
+ /** The captured refusal envelope (`earlier-captures/ai-logic-refusal-unenforced.json`). */
30
40
  export declare function appCheckRequired(): WireErrorEnvelope;
31
41
  /**
32
42
  * Whether AI Logic would accept this token: one the sandbox signed (the web
@@ -1 +1 @@
1
- {"version":3,"file":"app-check-gate.d.ts","sourceRoot":"","sources":["../../src/ai/app-check-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,+FAA+F;AAC/F,eAAO,MAAM,0BAA0B,oMAC4J,CAAC;AAEpM,iFAAiF;AACjF,eAAO,MAAM,cAAc,wWAC4U,CAAC;AAExW,gFAAgF;AAChF,wBAAgB,gBAAgB,IAAI,iBAAiB,CAEpD;AAOD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,GAAE,MAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhH;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASzD;AAED,2DAA2D;AAC3D,MAAM,WAAW,kBAAkB;IACjC,mFAAmF;IACnF,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,0FAA0F;IAC1F,WAAW,IAAI,IAAI,CAAC;CACrB;AAwBD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,GAAG,kBAAkB,CAM/F"}
1
+ {"version":3,"file":"app-check-gate.d.ts","sourceRoot":"","sources":["../../src/ai/app-check-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,kHAAkH;AAClH,eAAO,MAAM,0BAA0B,oMAC4J,CAAC;AAEpM,4FAA4F;AAC5F,eAAO,MAAM,cAAc,wWAC4U,CAAC;AAExW,+FAA+F;AAC/F,eAAO,MAAM,qBAAqB,4nBACylB,CAAC;AAgB5nB,2FAA2F;AAC3F,wBAAgB,gBAAgB,IAAI,iBAAiB,CAEpD;AAOD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,GAAE,MAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhH;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASzD;AAED,2DAA2D;AAC3D,MAAM,WAAW,kBAAkB;IACjC,mFAAmF;IACnF,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,0FAA0F;IAC1F,WAAW,IAAI,IAAI,CAAC;CACrB;AAwBD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,GAAG,kBAAkB,CAM/F"}
@@ -1,11 +1,27 @@
1
1
  import { appCheckActivationOf, appCheckTokenFor } from '../sandbox/internal/app-check-activation.js';
2
2
  import { APP_CHECK_PLACEHOLDER_TOKEN, checkAppCheckToken } from '../sandbox/internal/app-check-token.js';
3
3
  import { RequestHeadersFailure } from './errors.js';
4
- /** Production's message for a refused request (capture `app-check-ai-gate-wire`), verbatim. */
4
+ /** Production's message for a refused request (`earlier-captures/ai-logic-refusal-unenforced.json`), verbatim. */
5
5
  export const APP_CHECK_REQUIRED_MESSAGE = 'Firebase AI Logic has been deactivated in this project. To resume using Firebase AI Logic, you must enforce Firebase App Check. Learn more: https://firebase.google.com/docs/ai-logic/app-check';
6
- /** Pyric's guidance, printed beside production's error, never in place of it. */
6
+ /** Pyric's guidance for a page, printed beside production's error, never in place of it. */
7
7
  export const APP_CHECK_HINT = 'Firebase AI Logic refuses requests without an App Check token, and so does the sandbox. Call initializeAppCheck(app, { provider }) before getAI(app). For local development, set self.FIREBASE_APPCHECK_DEBUG_TOKEN = true before initializeAppCheck to use the debug provider; the sandbox accepts its tokens. https://firebase.google.com/docs/ai-logic/app-check';
8
- /** The captured refusal envelope (`app-check-ai-gate-wire`, `noHeader.raw`). */
8
+ /** Pyric's guidance for a server process, where reCAPTCHA throws and `self` does not exist. */
9
+ export const APP_CHECK_SERVER_HINT = "Firebase AI Logic refuses requests without an App Check token, and so does the sandbox. This process has no document, so the reCAPTCHA providers throw here. For local development, set globalThis.FIREBASE_APPCHECK_DEBUG_TOKEN = true, then call initializeAppCheck(app, { provider: new CustomProvider({ getToken }) }) before getAI(app). The sandbox does not call getToken while the debug token is set. Without the debug token, getToken returns { token, expireTimeMillis: Date.now() + ttlMillis } from a token your server mints with firebase-admin's getAppCheck().createToken(appId). https://firebase.google.com/docs/ai-logic/app-check";
10
+ /**
11
+ * The guidance for the realm the app runs in. A page has a `document`, and a
12
+ * page's Web Worker, SharedWorker or service worker has `WorkerGlobalScope`:
13
+ * both are browser realms. Anything else is a server process.
14
+ */
15
+ function appCheckHintForThisRealm() {
16
+ const scope = globalThis;
17
+ const hasDocument = typeof scope.document !== 'undefined';
18
+ const isWorkerRealm = typeof scope.WorkerGlobalScope !== 'undefined';
19
+ const isBrowserRealm = hasDocument || isWorkerRealm;
20
+ if (isBrowserRealm)
21
+ return APP_CHECK_HINT;
22
+ return APP_CHECK_SERVER_HINT;
23
+ }
24
+ /** The captured refusal envelope (`earlier-captures/ai-logic-refusal-unenforced.json`). */
9
25
  export function appCheckRequired() {
10
26
  return { error: { code: 403, message: APP_CHECK_REQUIRED_MESSAGE, status: 'PERMISSION_DENIED' } };
11
27
  }
@@ -46,7 +62,7 @@ function warnOnce(app) {
46
62
  if (warnedApps.has(app))
47
63
  return;
48
64
  warnedApps.add(app);
49
- console.warn(`[pyric/ai] ${APP_CHECK_HINT}`);
65
+ console.warn(`[pyric/ai] ${appCheckHintForThisRealm()}`);
50
66
  }
51
67
  /**
52
68
  * The token a request carries. A limited-use token request can reject (the
@@ -1 +1 @@
1
- {"version":3,"file":"app-check-gate.js","sourceRoot":"","sources":["../../src/ai/app-check-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app-check-gate.js","sourceRoot":"","sources":["../../src/ai/app-check-gate.ts"],"names":[],"mappings":"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"}
@@ -43,10 +43,18 @@ export declare class GeminiEngine implements AnswerEngine {
43
43
  * upstream's own error envelope: its HTTP code, `status` and message. A
44
44
  * body that is not a Gemini error envelope keeps the HTTP code and reports
45
45
  * the body text. Either way the credentials the request carried are masked
46
- * in every form the upstream can quote them, as the gemini proxy masks
47
- * them (`upstream-error-redaction.ts`).
46
+ * in every form the upstream can quote them, in the message and the status
47
+ * alike, with the masking the gemini proxy applies to the same body
48
+ * (`upstream-error-redaction.ts`, #1660).
48
49
  */
49
50
  private checkStatus;
51
+ /**
52
+ * One read of an upstream stream. A read that fails mid-stream becomes an
53
+ * {@link AiBrokerError} whose message has the request's credentials masked,
54
+ * as a failed fetch's does (#1737): the broker logs the message and the
55
+ * caller receives it, and a read error can quote upstream text.
56
+ */
57
+ private readStream;
50
58
  generateContent(req: GenerateContentRequest, model: string): Promise<WireResponse>;
51
59
  streamGenerateContent(req: GenerateContentRequest, model: string): AsyncIterable<WireChunk>;
52
60
  countTokens(req: CountTokensRequest, model: string): Promise<CountTokensResponse>;
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-engine.d.ts","sourceRoot":"","sources":["../../../src/ai/broker/gemini-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElF,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAgBnF,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAExD,qBAAa,YAAa,YAAW,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;gBAE9B,OAAO,CAAC,EAAE,mBAAmB;IAIzC;;;;;OAKG;IACH,gBAAgB,IAAI,OAAO;IAI3B,oFAAoF;YACtE,IAAI;IASlB;;;;;OAKG;IACH,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;IAIrD,OAAO,CAAC,cAAc;IAItB;;;;;;;OAOG;YACW,WAAW;IAkBnB,eAAe,CAAC,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAKjF,qBAAqB,CAC1B,GAAG,EAAE,sBAAsB,EAC3B,KAAK,EAAE,MAAM,GACZ,aAAa,CAAC,SAAS,CAAC;IAkErB,WAAW,CAAC,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAIxF"}
1
+ {"version":3,"file":"gemini-engine.d.ts","sourceRoot":"","sources":["../../../src/ai/broker/gemini-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElF,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAuCnF,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAExD,qBAAa,YAAa,YAAW,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;gBAE9B,OAAO,CAAC,EAAE,mBAAmB;IAIzC;;;;;OAKG;IACH,gBAAgB,IAAI,OAAO;IAI3B,oFAAoF;YACtE,IAAI;IAUlB;;;;;OAKG;IACH,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;IAIrD,OAAO,CAAC,cAAc;IAItB;;;;;;;;OAQG;YACW,WAAW;IAiBzB;;;;;OAKG;YACW,UAAU;IAclB,eAAe,CAAC,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAKjF,qBAAqB,CAC1B,GAAG,EAAE,sBAAsB,EAC3B,KAAK,EAAE,MAAM,GACZ,aAAa,CAAC,SAAS,CAAC;IA2DrB,WAAW,CAAC,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAIxF"}
@@ -16,7 +16,7 @@
16
16
  */
17
17
  import { AiBrokerError, errorEnvelope } from './synthesizer.js';
18
18
  import { GeminiUpstream } from './gemini-upstream.js';
19
- import { redactUpstreamText } from './upstream-error-redaction.js';
19
+ import { redactUpstreamError, redactUpstreamText } from './upstream-error-redaction.js';
20
20
  export { GEMINI_DEFAULT_BASE_URL, hasGeminiStaticKey } from './gemini-upstream.js';
21
21
  /** The `message` and `status` of a Gemini `{ error: { ... } }` body, or null. */
22
22
  function parseUpstreamError(text) {
@@ -33,6 +33,24 @@ function parseUpstreamError(text) {
33
33
  return null;
34
34
  return { message: error.message, status: error.status };
35
35
  }
36
+ /**
37
+ * One SSE event's data as a chunk, or undefined when it is not JSON. A 2xx
38
+ * stream can carry an error event mid-response; it passes through as the
39
+ * upstream sent it, with the credentials the request carried masked (#1660).
40
+ */
41
+ function parseStreamData(data, credentials) {
42
+ let chunk;
43
+ try {
44
+ chunk = JSON.parse(data);
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ const isErrorEvent = chunk !== null && typeof chunk === 'object' && 'error' in chunk;
50
+ if (!isErrorEvent)
51
+ return chunk;
52
+ return JSON.parse(redactUpstreamError(data, credentials));
53
+ }
36
54
  export class GeminiEngine {
37
55
  upstream;
38
56
  constructor(options) {
@@ -50,7 +68,8 @@ export class GeminiEngine {
50
68
  /** Sends one upstream request; a non-2xx answer throws the upstream's own error. */
51
69
  async send(model, action, body) {
52
70
  const { response, credentials } = await this.upstream.sendWithCredentials(this.normalizeModel(model), action, JSON.stringify(body));
53
- return this.checkStatus(response, credentials);
71
+ await this.checkStatus(response, credentials);
72
+ return { response, credentials };
54
73
  }
55
74
  /**
56
75
  * The model this engine calls upstream: always the requested one. The
@@ -69,27 +88,45 @@ export class GeminiEngine {
69
88
  * upstream's own error envelope: its HTTP code, `status` and message. A
70
89
  * body that is not a Gemini error envelope keeps the HTTP code and reports
71
90
  * the body text. Either way the credentials the request carried are masked
72
- * in every form the upstream can quote them, as the gemini proxy masks
73
- * them (`upstream-error-redaction.ts`).
91
+ * in every form the upstream can quote them, in the message and the status
92
+ * alike, with the masking the gemini proxy applies to the same body
93
+ * (`upstream-error-redaction.ts`, #1660).
74
94
  */
75
95
  async checkStatus(response, credentials) {
76
96
  const isSuccess = response.ok;
77
97
  if (isSuccess)
78
- return response;
98
+ return;
79
99
  const errorText = await response.text().catch(() => '');
80
- const upstream = parseUpstreamError(errorText);
100
+ const upstream = parseUpstreamError(redactUpstreamError(errorText, credentials));
81
101
  if (upstream !== null) {
82
- const message = redactUpstreamText(upstream.message, credentials);
83
- throw new AiBrokerError(errorEnvelope(response.status, message, upstream.status));
102
+ throw new AiBrokerError(errorEnvelope(response.status, upstream.message, upstream.status));
84
103
  }
85
104
  throw new AiBrokerError(errorEnvelope(response.status, `Gemini API returned status ${response.status}: ${redactUpstreamText(errorText, credentials)}`, 'INTERNAL'));
86
105
  }
106
+ /**
107
+ * One read of an upstream stream. A read that fails mid-stream becomes an
108
+ * {@link AiBrokerError} whose message has the request's credentials masked,
109
+ * as a failed fetch's does (#1737): the broker logs the message and the
110
+ * caller receives it, and a read error can quote upstream text.
111
+ */
112
+ async readStream(reader, credentials) {
113
+ try {
114
+ return await reader.read();
115
+ }
116
+ catch (err) {
117
+ if (err instanceof AiBrokerError)
118
+ throw err;
119
+ const rawMessage = err instanceof Error ? err.message : String(err);
120
+ const message = `Gemini API stream aborted mid-response: ${redactUpstreamText(rawMessage, credentials)}`;
121
+ throw new AiBrokerError(errorEnvelope(502, message, 'UNAVAILABLE'));
122
+ }
123
+ }
87
124
  async generateContent(req, model) {
88
- const response = await this.send(model, 'generateContent', req);
125
+ const { response } = await this.send(model, 'generateContent', req);
89
126
  return (await response.json());
90
127
  }
91
128
  async *streamGenerateContent(req, model) {
92
- const response = await this.send(model, 'streamGenerateContent?alt=sse', req);
129
+ const { response, credentials } = await this.send(model, 'streamGenerateContent?alt=sse', req);
93
130
  const hasBody = response.body !== null && response.body !== undefined;
94
131
  if (!hasBody) {
95
132
  throw new AiBrokerError(errorEnvelope(500, 'Gemini API returned an empty stream response.', 'INTERNAL'));
@@ -99,7 +136,7 @@ export class GeminiEngine {
99
136
  let buffer = '';
100
137
  try {
101
138
  while (true) {
102
- const { done, value } = await reader.read();
139
+ const { done, value } = await this.readStream(reader, credentials);
103
140
  const isDone = done === true;
104
141
  if (isDone) {
105
142
  break;
@@ -117,13 +154,10 @@ export class GeminiEngine {
117
154
  if (isEmptyOrDone) {
118
155
  continue;
119
156
  }
120
- try {
121
- const chunk = JSON.parse(dataStr);
157
+ // A malformed SSE chunk is skipped.
158
+ const chunk = parseStreamData(dataStr, credentials);
159
+ if (chunk !== undefined)
122
160
  yield chunk;
123
- }
124
- catch {
125
- // Ignore malformed SSE chunk in stream
126
- }
127
161
  }
128
162
  }
129
163
  const hasTrailingBuffer = buffer.trim().length > 0;
@@ -134,13 +168,9 @@ export class GeminiEngine {
134
168
  const dataStr = line.slice(6).trim();
135
169
  const isNotEmptyOrDone = dataStr !== '' && dataStr !== '[DONE]';
136
170
  if (isNotEmptyOrDone) {
137
- try {
138
- const chunk = JSON.parse(dataStr);
171
+ const chunk = parseStreamData(dataStr, credentials);
172
+ if (chunk !== undefined)
139
173
  yield chunk;
140
- }
141
- catch {
142
- // Ignore malformed SSE chunk in stream
143
- }
144
174
  }
145
175
  }
146
176
  }
@@ -150,7 +180,7 @@ export class GeminiEngine {
150
180
  }
151
181
  }
152
182
  async countTokens(req, model) {
153
- const response = await this.send(model, 'countTokens', req);
183
+ const { response } = await this.send(model, 'countTokens', req);
154
184
  return (await response.json());
155
185
  }
156
186
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-engine.js","sourceRoot":"","sources":["../../../src/ai/broker/gemini-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini-engine.js","sourceRoot":"","sources":["../../../src/ai/broker/gemini-engine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-upstream.d.ts","sourceRoot":"","sources":["../../../src/ai/broker/gemini-upstream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;gDAEgD;AAChD,eAAO,MAAM,uBAAuB,8CAA8C,CAAC;AAqBnF;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAG3E;AAyDD,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB;gEAC4D;IAC5D,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;oEACgE;IAChE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAmBD,qBAAa,cAAc;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsE;IAChG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAmD;IACnE,OAAO,CAAC,SAAS,CAA8B;gBAEnC,OAAO,CAAC,EAAE,qBAAqB;IAS3C;;;;;OAKG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;;;;;OAMG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIvG;;;;;OAKG;IACG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,GACrC,OAAO,CAAC;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAgBzD;;;;OAIG;YACW,gBAAgB;IAyB9B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;YAkBR,cAAc;IAa5B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;YAuBf,IAAI;CAuBnB"}
1
+ {"version":3,"file":"gemini-upstream.d.ts","sourceRoot":"","sources":["../../../src/ai/broker/gemini-upstream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH;;gDAEgD;AAChD,eAAO,MAAM,uBAAuB,8CAA8C,CAAC;AAqBnF;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAG3E;AAyDD,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB;gEAC4D;IAC5D,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;oEACgE;IAChE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAmBD,qBAAa,cAAc;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsE;IAChG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAmD;IACnE,OAAO,CAAC,SAAS,CAA8B;gBAEnC,OAAO,CAAC,EAAE,qBAAqB;IAS3C;;;;;OAKG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;;;;;OAMG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIvG;;;;;OAKG;IACG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,GACrC,OAAO,CAAC;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAgBzD;;;;OAIG;YACW,gBAAgB;IAyB9B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;YAkBR,cAAc;IAa5B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;YAuBf,IAAI;CAyBnB"}
@@ -12,7 +12,8 @@
12
12
  * `/__pyric/ai-proxy/gemini`, which attaches the credentials itself, so none
13
13
  * are sent and the browser never holds the key.
14
14
  */
15
- import { AiBrokerError, errorEnvelope, redactUrl } from './synthesizer.js';
15
+ import { AiBrokerError, errorEnvelope } from './synthesizer.js';
16
+ import { redactUpstreamText } from './upstream-error-redaction.js';
16
17
  /** Where the gemini engine talks when no `baseUrl` overrides it. Published
17
18
  * through `pyric/ai/internal` so the CLI's startup banner can name the same
18
19
  * endpoint instead of keeping its own copy. */
@@ -150,14 +151,14 @@ export class GeminiUpstream {
150
151
  const auth = await this.resolveAuthToken();
151
152
  const credentials = credentialsOf(auth);
152
153
  const first = this.formatUpstreamRequest(resource, action, auth);
153
- const response = await this.post(first.url, first.headers, body);
154
+ const response = await this.post(first.url, first.headers, body, credentials);
154
155
  if (response.status === 401 && auth.isAdc) {
155
156
  await response.body?.cancel().catch(() => { });
156
157
  this.adcToken = undefined;
157
158
  const retryAuth = await this.resolveAuthToken();
158
159
  credentials.push(...credentialsOf(retryAuth));
159
160
  const retry = this.formatUpstreamRequest(resource, action, retryAuth);
160
- return { response: await this.post(retry.url, retry.headers, body), credentials };
161
+ return { response: await this.post(retry.url, retry.headers, body, credentials), credentials };
161
162
  }
162
163
  return { response, credentials };
163
164
  }
@@ -241,17 +242,18 @@ export class GeminiUpstream {
241
242
  const separator = url.includes('?') ? '&' : '?';
242
243
  return { url: `${url}${separator}key=${encodeURIComponent(auth.token)}`, headers };
243
244
  }
244
- async post(url, headers, body) {
245
+ async post(url, headers, body, credentials) {
245
246
  try {
246
247
  return await this.fetchImpl(url, { method: 'POST', headers, body });
247
248
  }
248
249
  catch (err) {
249
- // Redact both: `url` always carries the key when auth is a static key
250
- // (not bearer/ADC); `message` is defensively redacted too in case the
251
- // fetch implementation's own error text echoes the request URL.
250
+ // Mask both with the request's exact credentials, as an error body is
251
+ // masked (#1737): `url` carries a static key, and a fetch error can
252
+ // quote the URL or a header, such as Node's refusal of an invalid
253
+ // `Authorization` value, which quotes the bearer token.
252
254
  const rawMessage = err instanceof Error ? err.message : String(err);
253
- const safeUrl = redactUrl(url);
254
- const safeMessage = redactUrl(rawMessage);
255
+ const safeUrl = redactUpstreamText(url, credentials);
256
+ const safeMessage = redactUpstreamText(rawMessage, credentials);
255
257
  throw new AiBrokerError(errorEnvelope(502, `Failed to connect to Gemini API at ${safeUrl}: ${safeMessage}`, 'UNAVAILABLE'));
256
258
  }
257
259
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-upstream.js","sourceRoot":"","sources":["../../../src/ai/broker/gemini-upstream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini-upstream.js","sourceRoot":"","sources":["../../../src/ai/broker/gemini-upstream.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"upstream-error-redaction.d.ts","sourceRoot":"","sources":["../../../src/ai/broker/upstream-error-redaction.ts"],"names":[],"mappings":"AA6BA;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAMvF;AAqBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAIxF"}
1
+ {"version":3,"file":"upstream-error-redaction.d.ts","sourceRoot":"","sources":["../../../src/ai/broker/upstream-error-redaction.ts"],"names":[],"mappings":"AAkCA;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAIvF;AAqBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAIxF"}
@@ -19,9 +19,14 @@
19
19
  */
20
20
  import { redactUrl } from './synthesizer.js';
21
21
  const MASK = '***';
22
- /** The forms a credential can appear in, longest first. */
23
- function quotedForms(credential) {
24
- const forms = new Set([encodeURIComponent(credential), credential]);
22
+ /**
23
+ * Every form every credential can appear in, raw and percent-encoded,
24
+ * longest first. One credential can contain another, such as an ADC token
25
+ * and the refreshed token that extends it, so the longer is masked first:
26
+ * masking the shorter first would leave the rest of the longer behind.
27
+ */
28
+ function quotedForms(credentials) {
29
+ const forms = new Set(credentials.flatMap((credential) => [encodeURIComponent(credential), credential]));
25
30
  return [...forms].sort((a, b) => b.length - a.length);
26
31
  }
27
32
  /**
@@ -31,10 +36,8 @@ function quotedForms(credential) {
31
36
  */
32
37
  export function redactUpstreamText(text, credentials) {
33
38
  let masked = text;
34
- for (const credential of credentials) {
35
- for (const form of quotedForms(credential))
36
- masked = masked.split(form).join(MASK);
37
- }
39
+ for (const form of quotedForms(credentials))
40
+ masked = masked.split(form).join(MASK);
38
41
  return redactUrl(masked);
39
42
  }
40
43
  function redactValue(value, credentials) {
@@ -1 +1 @@
1
- {"version":3,"file":"upstream-error-redaction.js","sourceRoot":"","sources":["../../../src/ai/broker/upstream-error-redaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,IAAI,GAAG,KAAK,CAAC;AAEnB,2DAA2D;AAC3D,SAAS,WAAW,CAAC,UAAkB;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,WAA8B;IAC7E,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC;YAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,WAA8B;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;IAC7D,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;SAC7D,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAChG,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,qEAAqE;AACrE,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,EAAE,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,WAA8B;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,kBAAkB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"upstream-error-redaction.js","sourceRoot":"","sources":["../../../src/ai/broker/upstream-error-redaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,IAAI,GAAG,KAAK,CAAC;AAEnB;;;;;GAKG;AACH,SAAS,WAAW,CAAC,WAA8B;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACzG,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,WAA8B;IAC7E,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,WAAW,CAAC;QAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,WAA8B;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC7E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;IAC7D,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;SAC7D,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAChG,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,qEAAqE;AACrE,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,EAAE,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,WAA8B;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,kBAAkB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;AAC9D,CAAC"}
@@ -12,6 +12,7 @@
12
12
  */
13
13
  import { FirebaseError } from '../sandbox/internal/firebase-error.js';
14
14
  import { type WireErrorEnvelope } from './broker/index.js';
15
+ import { type Backend } from './backend.js';
15
16
  /** Standardized error codes the SDK can throw — 14 codes in 2.12.0. */
16
17
  export declare const AIErrorCode: {
17
18
  readonly ERROR: "error";
@@ -50,17 +51,20 @@ export declare class AIError extends FirebaseError {
50
51
  /** Minimal HTTP status text table for the statuses the sandbox mints. */
51
52
  export declare function statusTextOf(status: number): string;
52
53
  /**
53
- * Production-shaped request URL for sandbox-minted fetch errors. There is no
54
- * real project behind the sandbox; the path is deterministic and mirrors the
55
- * GoogleAI backend's `/v1beta/projects/<project>/models/<model>:<op>` shape.
54
+ * Production-shaped request URL for sandbox-minted fetch errors, the
55
+ * `RequestURL` the SDK interpolates into its `Error fetching from <url>`
56
+ * message. There is no real project behind the sandbox, so the project is
57
+ * `sandbox`; the model path follows the handle's backend (Google AI when none
58
+ * is given), and a stream carries `?alt=sse`, as the SDK's `queryParams` add
59
+ * it (#1640).
56
60
  */
57
- export declare function sandboxRequestUrl(modelResource: string, op: string): string;
61
+ export declare function sandboxRequestUrl(modelResource: string, op: string, backend?: Backend): string;
58
62
  /**
59
63
  * Translate a broker wire error envelope into the SDK-equivalent
60
64
  * `AIError('fetch-error', ...)` — the exact decoration `makeRequest` applies
61
65
  * to a non-ok response in the installed 2.12.0.
62
66
  */
63
- export declare function aiErrorFromEnvelope(envelope: WireErrorEnvelope, modelResource: string, op: string): AIError;
67
+ export declare function aiErrorFromEnvelope(envelope: WireErrorEnvelope, modelResource: string, op: string, backend?: Backend): AIError;
64
68
  /**
65
69
  * A failure while building a request's headers, before anything is sent: the
66
70
  * App Check provider rejected a limited-use token request. Upstream
@@ -72,5 +76,5 @@ export declare class RequestHeadersFailure extends Error {
72
76
  constructor(reason: unknown);
73
77
  }
74
78
  /** Rethrow broker errors and header failures as SDK errors; pass anything else through. */
75
- export declare function toAIError(err: unknown, modelResource: string, op: string): unknown;
79
+ export declare function toAIError(err: unknown, modelResource: string, op: string, backend?: Backend): unknown;
76
80
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/ai/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI1E,uEAAuE;AACvE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;CAed,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAEzE,wEAAwE;AACxE,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC/C;AAED;;;;GAIG;AACH,qBAAa,OAAQ,SAAQ,aAAa;IACxC,SAAkB,IAAI,EAAE,WAAW,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;gBAE/B,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,eAAe;CAYlF;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,EAC3B,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE,MAAM,GACT,OAAO,CAeT;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO;gBAAf,MAAM,EAAE,OAAO;CAIrC;AAsBD,2FAA2F;AAC3F,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAQlF"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/ai/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAe,KAAK,OAAO,EAAwB,MAAM,cAAc,CAAC;AAI/E,uEAAuE;AACvE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;CAed,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAEzE,wEAAwE;AACxE,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC/C;AAED;;;;GAIG;AACH,qBAAa,OAAQ,SAAQ,aAAa;IACxC,SAAkB,IAAI,EAAE,WAAW,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;gBAE/B,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,eAAe;CAYlF;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAYnD;AAoBD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAG9F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,EAC3B,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAeT;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO;gBAAf,MAAM,EAAE,OAAO;CAIrC;AA2BD,2FAA2F;AAC3F,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAQrG"}