@pyric/cli 0.1.0-alpha.30 → 0.1.0-alpha.30.2

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 (169) hide show
  1. package/dist/assurance/.generated/conformance-verdicts.d.ts +8 -0
  2. package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
  3. package/dist/assurance/.generated/conformance-verdicts.js +8 -0
  4. package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
  5. package/dist/bridge/server/peer.d.ts +10 -0
  6. package/dist/bridge/server/peer.d.ts.map +1 -1
  7. package/dist/bridge/server/peer.js +46 -1
  8. package/dist/bridge/server/peer.js.map +1 -1
  9. package/dist/cli/serve.d.ts +2 -0
  10. package/dist/cli/serve.d.ts.map +1 -1
  11. package/dist/cli/serve.js +13 -2
  12. package/dist/cli/serve.js.map +1 -1
  13. package/dist/conformance/.generated/can-i-use-browser.js +2 -2
  14. package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
  15. package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
  16. package/dist/conformance/.generated/can-i-use.js +1 -1
  17. package/dist/conformance/.generated/can-i-use.js.map +1 -1
  18. package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
  19. package/dist/conformance/.generated/conformance-docs.js +1 -1
  20. package/dist/conformance/.generated/conformance-docs.js.map +1 -1
  21. package/dist/register/app-bridge-admin-app-check.d.ts +3 -0
  22. package/dist/register/app-bridge-admin-app-check.d.ts.map +1 -0
  23. package/dist/register/app-bridge-admin-app-check.js +43 -0
  24. package/dist/register/app-bridge-admin-app-check.js.map +1 -0
  25. package/dist/register/app-bridge-app-check.d.ts +4 -0
  26. package/dist/register/app-bridge-app-check.d.ts.map +1 -1
  27. package/dist/register/app-bridge-app-check.js +4 -0
  28. package/dist/register/app-bridge-app-check.js.map +1 -1
  29. package/dist/register/app-bridge-shadow.d.ts +4 -2
  30. package/dist/register/app-bridge-shadow.d.ts.map +1 -1
  31. package/dist/register/app-bridge-shadow.js +29 -5
  32. package/dist/register/app-bridge-shadow.js.map +1 -1
  33. package/dist/register/index.d.ts.map +1 -1
  34. package/dist/register/index.js +21 -0
  35. package/dist/register/index.js.map +1 -1
  36. package/dist/serve/ai-diagnostics-relay.d.ts +4 -1
  37. package/dist/serve/ai-diagnostics-relay.d.ts.map +1 -1
  38. package/dist/serve/ai-diagnostics-relay.js +3 -0
  39. package/dist/serve/ai-diagnostics-relay.js.map +1 -1
  40. package/dist/serve/ai-proxy.d.ts +21 -1
  41. package/dist/serve/ai-proxy.d.ts.map +1 -1
  42. package/dist/serve/ai-proxy.js +39 -14
  43. package/dist/serve/ai-proxy.js.map +1 -1
  44. package/dist/serve/ai-terminal-blocks.d.ts +6 -4
  45. package/dist/serve/ai-terminal-blocks.d.ts.map +1 -1
  46. package/dist/serve/ai-terminal-blocks.js +7 -4
  47. package/dist/serve/ai-terminal-blocks.js.map +1 -1
  48. package/dist/serve/ai-terminal-text.d.ts +8 -0
  49. package/dist/serve/ai-terminal-text.d.ts.map +1 -1
  50. package/dist/serve/ai-terminal-text.js +10 -0
  51. package/dist/serve/ai-terminal-text.js.map +1 -1
  52. package/dist/serve/bundler.d.ts +40 -0
  53. package/dist/serve/bundler.d.ts.map +1 -1
  54. package/dist/serve/bundler.js +133 -2
  55. package/dist/serve/bundler.js.map +1 -1
  56. package/dist/serve/entries/ai.d.ts.map +1 -1
  57. package/dist/serve/entries/ai.js +28 -26
  58. package/dist/serve/entries/ai.js.map +1 -1
  59. package/dist/serve/entries/app-ai-passthrough.d.ts +4 -4
  60. package/dist/serve/entries/app-ai-passthrough.d.ts.map +1 -1
  61. package/dist/serve/entries/app-ai-passthrough.js +8 -52
  62. package/dist/serve/entries/app-ai-passthrough.js.map +1 -1
  63. package/dist/serve/firebase-module-swap.d.ts +22 -0
  64. package/dist/serve/firebase-module-swap.d.ts.map +1 -1
  65. package/dist/serve/firebase-module-swap.js +51 -3
  66. package/dist/serve/firebase-module-swap.js.map +1 -1
  67. package/dist/serve/gemini-error-redaction.d.ts +6 -0
  68. package/dist/serve/gemini-error-redaction.d.ts.map +1 -0
  69. package/dist/serve/gemini-error-redaction.js +61 -0
  70. package/dist/serve/gemini-error-redaction.js.map +1 -0
  71. package/dist/serve/gemini-proxy.d.ts +40 -0
  72. package/dist/serve/gemini-proxy.d.ts.map +1 -0
  73. package/dist/serve/gemini-proxy.js +105 -0
  74. package/dist/serve/gemini-proxy.js.map +1 -0
  75. package/dist/serve/hosted/method-protocol.d.ts +4 -4
  76. package/dist/serve/html-injection.d.ts +2 -0
  77. package/dist/serve/html-injection.d.ts.map +1 -1
  78. package/dist/serve/html-injection.js +4 -2
  79. package/dist/serve/html-injection.js.map +1 -1
  80. package/dist/serve/namespace.d.ts +9 -0
  81. package/dist/serve/namespace.d.ts.map +1 -1
  82. package/dist/serve/namespace.js +71 -15
  83. package/dist/serve/namespace.js.map +1 -1
  84. package/dist/serve/sandbox-session.d.ts +3 -0
  85. package/dist/serve/sandbox-session.d.ts.map +1 -1
  86. package/dist/serve/sandbox-session.js +1 -0
  87. package/dist/serve/sandbox-session.js.map +1 -1
  88. package/dist/serve/site-ui/docs/ai-compat/index.html +29 -10
  89. package/dist/serve/site-ui/docs/ai-compat.md +30 -9
  90. package/dist/serve/site-ui/docs/app-check-compat/index.html +42 -18
  91. package/dist/serve/site-ui/docs/app-check-compat.md +42 -18
  92. package/dist/serve/site-ui/docs/auth-compat/index.html +4 -4
  93. package/dist/serve/site-ui/docs/auth-compat.md +4 -4
  94. package/dist/serve/site-ui/docs/build/ai-logic/index.html +21 -5
  95. package/dist/serve/site-ui/docs/build/ai-logic.md +23 -2
  96. package/dist/serve/site-ui/docs/database-compat/index.html +4 -4
  97. package/dist/serve/site-ui/docs/database-compat.md +4 -4
  98. package/dist/serve/site-ui/docs/firestore-compat/index.html +4 -4
  99. package/dist/serve/site-ui/docs/firestore-compat.md +4 -4
  100. package/dist/serve/site-ui/docs/index.json +10 -0
  101. package/dist/serve/site-ui/docs/messaging-compat/index.html +4 -4
  102. package/dist/serve/site-ui/docs/messaging-compat.md +4 -4
  103. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +4 -0
  104. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api.md +5 -0
  105. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-app-check-reference-api/index.html +2 -0
  106. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-app-check-reference-api.md +3 -0
  107. package/dist/serve/site-ui/docs/storage-compat/index.html +5 -5
  108. package/dist/serve/site-ui/docs/storage-compat.md +5 -5
  109. package/dist/serve/site-ui/docs/tutorial/index.html +11 -1
  110. package/dist/serve/site-ui/docs/tutorial.md +12 -1
  111. package/dist/serve/site-ui/examples/chess/index.html +1 -1
  112. package/dist/serve/vite-sandbox-generation.d.ts.map +1 -1
  113. package/dist/serve/vite-sandbox-generation.js +2 -0
  114. package/dist/serve/vite-sandbox-generation.js.map +1 -1
  115. package/dist/serve/worker/ai-proxy-paths.d.ts +32 -0
  116. package/dist/serve/worker/ai-proxy-paths.d.ts.map +1 -0
  117. package/dist/serve/worker/ai-proxy-paths.js +20 -0
  118. package/dist/serve/worker/ai-proxy-paths.js.map +1 -0
  119. package/dist/serve/worker/client/ai.d.ts +3 -1
  120. package/dist/serve/worker/client/ai.d.ts.map +1 -1
  121. package/dist/serve/worker/client/ai.js +3 -0
  122. package/dist/serve/worker/client/ai.js.map +1 -1
  123. package/dist/serve/worker/entry.js +2 -0
  124. package/dist/serve/worker/entry.js.map +1 -1
  125. package/dist/serve/worker/host-ai.d.ts +4 -5
  126. package/dist/serve/worker/host-ai.d.ts.map +1 -1
  127. package/dist/serve/worker/host-ai.js +19 -23
  128. package/dist/serve/worker/host-ai.js.map +1 -1
  129. package/dist/serve/worker/host-context.d.ts +13 -4
  130. package/dist/serve/worker/host-context.d.ts.map +1 -1
  131. package/dist/serve/worker/host-context.js.map +1 -1
  132. package/dist/serve/worker/inbound-validation/operation-arguments.d.ts.map +1 -1
  133. package/dist/serve/worker/inbound-validation/operation-arguments.js +11 -0
  134. package/dist/serve/worker/inbound-validation/operation-arguments.js.map +1 -1
  135. package/dist/serve/worker/protocol.d.ts +13 -0
  136. package/dist/serve/worker/protocol.d.ts.map +1 -1
  137. package/dist/serve/worker/protocol.js.map +1 -1
  138. package/package.json +4 -4
  139. package/src/assurance/.generated/conformance-verdicts.ts +8 -0
  140. package/src/bridge/server/peer.ts +49 -1
  141. package/src/cli/serve.ts +14 -2
  142. package/src/conformance/.generated/can-i-use-browser.ts +2 -2
  143. package/src/conformance/.generated/can-i-use.ts +1 -1
  144. package/src/conformance/.generated/conformance-docs.ts +1 -1
  145. package/src/register/app-bridge-admin-app-check.ts +46 -0
  146. package/src/register/app-bridge-app-check.ts +4 -0
  147. package/src/register/app-bridge-shadow.ts +35 -5
  148. package/src/register/index.ts +23 -0
  149. package/src/serve/ai-diagnostics-relay.ts +6 -1
  150. package/src/serve/ai-proxy.ts +43 -14
  151. package/src/serve/ai-terminal-blocks.ts +8 -4
  152. package/src/serve/ai-terminal-text.ts +11 -0
  153. package/src/serve/bundler.ts +163 -2
  154. package/src/serve/entries/ai.ts +28 -27
  155. package/src/serve/entries/app-ai-passthrough.ts +8 -58
  156. package/src/serve/firebase-module-swap.ts +52 -3
  157. package/src/serve/gemini-error-redaction.ts +60 -0
  158. package/src/serve/gemini-proxy.ts +140 -0
  159. package/src/serve/html-injection.ts +4 -2
  160. package/src/serve/namespace.ts +74 -15
  161. package/src/serve/sandbox-session.ts +4 -0
  162. package/src/serve/vite-sandbox-generation.ts +2 -0
  163. package/src/serve/worker/ai-proxy-paths.ts +35 -0
  164. package/src/serve/worker/client/ai.ts +6 -1
  165. package/src/serve/worker/entry.ts +2 -0
  166. package/src/serve/worker/host-ai.ts +23 -23
  167. package/src/serve/worker/host-context.ts +13 -3
  168. package/src/serve/worker/inbound-validation/operation-arguments.ts +11 -0
  169. package/src/serve/worker/protocol.ts +14 -2
@@ -2,58 +2,14 @@
2
2
  import { bindAppRegistrySandbox } from 'pyric/app/internal';
3
3
  import { sandbox } from './app-backend.js';
4
4
  import * as pyricApp from 'pyric/app';
5
- import * as realApp from 'firebase/app';
5
+ import { shadowedAppRegistry } from '../../register/app-bridge-shadow.js';
6
6
  bindAppRegistrySandbox(sandbox);
7
- function decorateApp(app, options, rawSettings) {
8
- try {
9
- let shadow;
10
- try {
11
- shadow = realApp.getApp(app.name);
12
- }
13
- catch {
14
- const initOptions = (options ?? app.options);
15
- const initSettings = rawSettings ?? app.name;
16
- const isStringSettings = typeof initSettings === 'string';
17
- if (isStringSettings) {
18
- shadow = realApp.initializeApp(initOptions, initSettings);
19
- }
20
- else {
21
- const objectSettings = initSettings;
22
- shadow = realApp.initializeApp(initOptions, objectSettings);
23
- }
24
- }
25
- const hasShadowContainer = shadow.container !== undefined && shadow.container !== null;
26
- if (hasShadowContainer) {
27
- Object.defineProperty(app, 'container', { value: shadow.container, configurable: true });
28
- }
29
- }
30
- catch {
31
- // Observational/best-effort: do not break Pyric initialization if shadow initialization fails.
32
- }
33
- return app;
34
- }
35
- export function initializeApp(options, rawSettings) {
36
- const app = pyricApp.initializeApp(options, rawSettings);
37
- return decorateApp(app, options, rawSettings);
38
- }
39
- export function getApp(name) {
40
- return decorateApp(pyricApp.getApp(name));
41
- }
42
- export function getApps() {
43
- return pyricApp.getApps().map((app) => decorateApp(app));
44
- }
45
- export async function deleteApp(app) {
46
- try {
47
- const shadow = realApp.getApp(app.name);
48
- const hasShadow = shadow !== undefined && shadow !== null;
49
- if (hasShadow) {
50
- await realApp.deleteApp(shadow);
51
- }
52
- }
53
- catch {
54
- // Ignore if shadow app was not initialized or already deleted.
55
- }
56
- return pyricApp.deleteApp(app);
57
- }
7
+ // One shadow implementation for every plane: the register adapters build
8
+ // their exports from the same registry.
9
+ const registry = shadowedAppRegistry(pyricApp);
10
+ export const initializeApp = registry.initializeApp;
11
+ export const getApp = registry.getApp;
12
+ export const getApps = registry.getApps;
13
+ export const deleteApp = registry.deleteApp;
58
14
  export { FirebaseError, SDK_VERSION, onLog, registerVersion, setLogLevel, } from 'pyric/app';
59
15
  //# sourceMappingURL=app-ai-passthrough.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-ai-passthrough.js","sourceRoot":"","sources":["../../../src/serve/entries/app-ai-passthrough.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAChH,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AAExC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,SAAS,WAAW,CAClB,GAAyB,EACzB,OAAkC,EAClC,WAAmD;IAEnD,IAAI,CAAC;QACH,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAA4B,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,WAAW,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAA4B,CAAC;YACxE,MAAM,YAAY,GAAG,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC;YAC7C,MAAM,gBAAgB,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC;YAC1D,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW,EAAE,YAAY,CAA4B,CAAC;YACvF,CAAC;iBAAM,CAAC;gBACN,MAAM,cAAc,GAAG,YAA2C,CAAC;gBACnE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW,EAAE,cAAc,CAA4B,CAAC;YACzF,CAAC;QACH,CAAC;QACD,MAAM,kBAAkB,GAAG,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC;QACvF,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+FAA+F;IACjG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAkC,EAClC,WAAmD;IAEnD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACzD,OAAO,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAa;IAClC,OAAO,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAyB;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC;QAC1D,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IACD,OAAO,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,OAAO,EACL,aAAa,EACb,WAAW,EACX,KAAK,EACL,eAAe,EACf,WAAW,GACZ,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"app-ai-passthrough.js","sourceRoot":"","sources":["../../../src/serve/entries/app-ai-passthrough.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAChH,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,yEAAyE;AACzE,wCAAwC;AACxC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;AACpD,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;AAE5C,OAAO,EACL,aAAa,EACb,WAAW,EACX,KAAK,EACL,eAAe,EACf,WAAW,GACZ,MAAM,WAAW,CAAC"}
@@ -15,6 +15,21 @@ export declare function resolveAiMode(explicit: AiMode | undefined, env: Record<
15
15
  * from the result is not swapped and resolves to the Firebase SDK.
16
16
  */
17
17
  export declare function swappedFirebaseEntries(mode: AiMode): ReadonlyMap<ServedFirebaseSpecifier, string>;
18
+ /**
19
+ * The Firebase SDK modules `pyric sandbox` builds for the browser from the
20
+ * project's own `firebase` install in production AI mode, to the entry key of
21
+ * each (`/__pyric/sdk/<key>.js`). One build, so the three share one
22
+ * `@firebase/app` component registry. The Vite and register planes resolve
23
+ * the Firebase SDK themselves and never read this.
24
+ */
25
+ export declare const REAL_SDK_ENTRIES: ReadonlyMap<ServedFirebaseSpecifier, string>;
26
+ /**
27
+ * The import-map plane's specifier to entry key table: the swap, plus, in
28
+ * production AI mode, the unswapped `firebase/ai` sent to the Firebase SDK
29
+ * that `pyric sandbox` builds. A browser has no package resolution, so on
30
+ * this plane an unswapped specifier still needs a URL.
31
+ */
32
+ export declare function importMapFirebaseEntries(mode: AiMode): ReadonlyMap<ServedFirebaseSpecifier, string>;
18
33
  /**
19
34
  * Whether an importer is one of this package's own modules that wrap the
20
35
  * Firebase SDK's `firebase/app` or `firebase/app-check`. Those imports must
@@ -24,4 +39,11 @@ export declare function swappedFirebaseEntries(mode: AiMode): ReadonlyMap<Served
24
39
  export declare function isShadowAppImporter(importer: string | undefined): boolean;
25
40
  /** Whether this import is a shadow-app wrapper reaching the Firebase SDK it wraps. */
26
41
  export declare function isBypassedBridgeImport(specifier: string, importer: string | undefined): boolean;
42
+ /**
43
+ * Where a bypassed bridge import goes on the import-map plane: the entry key
44
+ * of the Firebase SDK module `pyric sandbox` builds. The bare specifier
45
+ * cannot stay, because the import map sends it back to the wrapper itself.
46
+ * Undefined for every import {@link isBypassedBridgeImport} does not name.
47
+ */
48
+ export declare function bridgeImportEntryKey(specifier: string, importer: string | undefined): string | undefined;
27
49
  //# sourceMappingURL=firebase-module-swap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"firebase-module-swap.d.ts","sourceRoot":"","sources":["../../src/serve/firebase-module-swap.ts"],"names":[],"mappings":"AAmBA,2EAA2E;AAC3E,eAAO,MAAM,WAAW,wTAed,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;AAE9C,mFAAmF;AACnF,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,MAAM,CAIR;AAOD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAYjG;AAsBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAIzE;AAKD,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE/F"}
1
+ {"version":3,"file":"firebase-module-swap.d.ts","sourceRoot":"","sources":["../../src/serve/firebase-module-swap.ts"],"names":[],"mappings":"AAoBA,2EAA2E;AAC3E,eAAO,MAAM,WAAW,wTAed,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;AAE9C,mFAAmF;AACnF,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,MAAM,CAIR;AAOD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAYjG;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,uBAAuB,EAAE,MAAM,CAIxE,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAOnG;AAsBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAIzE;AAcD,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE/F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGxG"}
@@ -8,7 +8,8 @@
8
8
  * container.
9
9
  *
10
10
  * Every plane that swaps Firebase modules reads {@link swappedFirebaseEntries}:
11
- * the `pyric sandbox` import map (`html-injection.ts`) and the Vite resolver
11
+ * the `pyric sandbox` import map (`html-injection.ts`, through
12
+ * {@link importMapFirebaseEntries}) and the Vite resolver
12
13
  * (`vite-module-swap.ts`). Every front door resolves the mode with
13
14
  * {@link resolveAiMode}. One table and one precedence rule, so the planes
14
15
  * cannot disagree about what production mode means. It imports only Node
@@ -66,6 +67,33 @@ export function swappedFirebaseEntries(mode) {
66
67
  }
67
68
  return swapped;
68
69
  }
70
+ /**
71
+ * The Firebase SDK modules `pyric sandbox` builds for the browser from the
72
+ * project's own `firebase` install in production AI mode, to the entry key of
73
+ * each (`/__pyric/sdk/<key>.js`). One build, so the three share one
74
+ * `@firebase/app` component registry. The Vite and register planes resolve
75
+ * the Firebase SDK themselves and never read this.
76
+ */
77
+ export const REAL_SDK_ENTRIES = new Map([
78
+ ['firebase/app', 'firebase-sdk-app'],
79
+ ['firebase/ai', 'firebase-sdk-ai'],
80
+ ['firebase/app-check', 'firebase-sdk-app-check'],
81
+ ]);
82
+ /**
83
+ * The import-map plane's specifier to entry key table: the swap, plus, in
84
+ * production AI mode, the unswapped `firebase/ai` sent to the Firebase SDK
85
+ * that `pyric sandbox` builds. A browser has no package resolution, so on
86
+ * this plane an unswapped specifier still needs a URL.
87
+ */
88
+ export function importMapFirebaseEntries(mode) {
89
+ const entries = new Map(swappedFirebaseEntries(mode));
90
+ for (const [specifier, key] of REAL_SDK_ENTRIES) {
91
+ const isUnswapped = !entries.has(specifier);
92
+ if (isUnswapped)
93
+ entries.set(specifier, key);
94
+ }
95
+ return entries;
96
+ }
69
97
  /** This package's root (`src/serve/` and `dist/serve/` both sit two levels below it), as written and resolved. */
70
98
  const PACKAGE_ROOTS = (() => {
71
99
  const root = fileURLToPath(new URL('../../', import.meta.url)).replaceAll('\\', '/');
@@ -96,10 +124,30 @@ export function isShadowAppImporter(importer) {
96
124
  const file = importerFile(importer);
97
125
  return PACKAGE_ROOTS.some((root) => file.startsWith(root) && SHADOW_MODULE.test(file.slice(root.length)));
98
126
  }
99
- /** The SDK modules a shadow-app wrapper imports for itself. */
100
- const BRIDGED_SPECIFIERS = new Set(['firebase/app', 'firebase/app-check']);
127
+ /**
128
+ * The SDK modules a shadow-app wrapper imports for itself. The firebase-admin
129
+ * pair is the register's App Check verifier for production AI mode
130
+ * (`register/app-bridge-admin-app-check.ts`); no browser plane serves them.
131
+ */
132
+ const BRIDGED_SPECIFIERS = new Set([
133
+ 'firebase/app',
134
+ 'firebase/app-check',
135
+ 'firebase-admin/app',
136
+ 'firebase-admin/app-check',
137
+ ]);
101
138
  /** Whether this import is a shadow-app wrapper reaching the Firebase SDK it wraps. */
102
139
  export function isBypassedBridgeImport(specifier, importer) {
103
140
  return BRIDGED_SPECIFIERS.has(specifier) && isShadowAppImporter(importer);
104
141
  }
142
+ /**
143
+ * Where a bypassed bridge import goes on the import-map plane: the entry key
144
+ * of the Firebase SDK module `pyric sandbox` builds. The bare specifier
145
+ * cannot stay, because the import map sends it back to the wrapper itself.
146
+ * Undefined for every import {@link isBypassedBridgeImport} does not name.
147
+ */
148
+ export function bridgeImportEntryKey(specifier, importer) {
149
+ if (!isBypassedBridgeImport(specifier, importer))
150
+ return undefined;
151
+ return REAL_SDK_ENTRIES.get(specifier);
152
+ }
105
153
  //# sourceMappingURL=firebase-module-swap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"firebase-module-swap.js","sourceRoot":"","sources":["../../src/serve/firebase-module-swap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"firebase-module-swap.js","sourceRoot":"","sources":["../../src/serve/firebase-module-swap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `text` with every credential in `credentials` removed, and every
3
+ * credential URL parameter masked. A JSON body stays JSON.
4
+ */
5
+ export declare function redactUpstreamError(text: string, credentials: readonly string[]): string;
6
+ //# sourceMappingURL=gemini-error-redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-error-redaction.d.ts","sourceRoot":"","sources":["../../src/serve/gemini-error-redaction.ts"],"names":[],"mappings":"AAmDA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAIxF"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Masking an upstream Gemini error before the gemini proxy relays it to the
3
+ * browser (#1584). An upstream or a gateway can quote the credential it was
4
+ * sent in any form: in the URL (`?key=`, `&key=`, JSON-escaped or
5
+ * percent-encoded), in plain text, or in an echoed header such as
6
+ * `x-goog-api-key` or `Authorization: Bearer`. So the proxy removes the exact
7
+ * credentials the request carried, raw and percent-encoded, then runs
8
+ * `redactUrl` as a second pass for any other credential parameter.
9
+ *
10
+ * A JSON body is masked value by value and serialized again, so the
11
+ * browser engine still reads Gemini's own status and message. Text
12
+ * redaction over the raw JSON could eat a closing quote and leave the
13
+ * envelope unparseable.
14
+ */
15
+ import { redactUrl } from 'pyric/ai/internal';
16
+ const MASK = '***';
17
+ /** The forms a credential can appear in, longest first. */
18
+ function quotedForms(credential) {
19
+ const forms = new Set([encodeURIComponent(credential), credential]);
20
+ return [...forms].sort((a, b) => b.length - a.length);
21
+ }
22
+ function redactText(text, credentials) {
23
+ let masked = text;
24
+ for (const credential of credentials) {
25
+ for (const form of quotedForms(credential))
26
+ masked = masked.split(form).join(MASK);
27
+ }
28
+ return redactUrl(masked);
29
+ }
30
+ function redactValue(value, credentials) {
31
+ if (typeof value === 'string')
32
+ return redactText(value, credentials);
33
+ if (Array.isArray(value))
34
+ return value.map((item) => redactValue(item, credentials));
35
+ const isObject = value !== null && typeof value === 'object';
36
+ if (!isObject)
37
+ return value;
38
+ const entries = Object.entries(value)
39
+ .map(([key, item]) => [redactText(key, credentials), redactValue(item, credentials)]);
40
+ return Object.fromEntries(entries);
41
+ }
42
+ /** The JSON value `text` holds, or undefined when it is not JSON. */
43
+ function parseJson(text) {
44
+ try {
45
+ return { value: JSON.parse(text) };
46
+ }
47
+ catch {
48
+ return undefined;
49
+ }
50
+ }
51
+ /**
52
+ * `text` with every credential in `credentials` removed, and every
53
+ * credential URL parameter masked. A JSON body stays JSON.
54
+ */
55
+ export function redactUpstreamError(text, credentials) {
56
+ const json = parseJson(text);
57
+ if (json === undefined)
58
+ return redactText(text, credentials);
59
+ return JSON.stringify(redactValue(json.value, credentials));
60
+ }
61
+ //# sourceMappingURL=gemini-error-redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-error-redaction.js","sourceRoot":"","sources":["../../src/serve/gemini-error-redaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,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,SAAS,UAAU,CAAC,IAAY,EAAE,WAA8B;IAC9D,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,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACrE,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,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxF,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,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * `/__pyric/ai-proxy/gemini`: where a browser gemini engine sends (#1584).
3
+ *
4
+ * A page or SharedWorker has no server environment, and the Gemini API key
5
+ * must never reach it. The browser engine sends each request here with no
6
+ * credentials. The dev server sends it on with the gemini engine's own
7
+ * request code (`GeminiUpstream` from `pyric/ai/internal`): the key from the
8
+ * server's environment or ADC, to the server's configured base URL. A
9
+ * successful answer streams back unchanged. An error comes back with its
10
+ * status and with any credential it quotes masked, so the browser engine
11
+ * reads Gemini's own error and never the key. The body is bounded as the
12
+ * openai route's is.
13
+ *
14
+ * The browser chooses only the model and the call. The target and the
15
+ * credentials are the server's, so no page can send the key anywhere else.
16
+ * The App Check gate runs before any of this, in the broker that owns the
17
+ * browser engine.
18
+ */
19
+ import type { IncomingMessage, ServerResponse } from 'node:http';
20
+ import { type GeminiUpstreamOptions } from 'pyric/ai/internal';
21
+ import type { ServeLogger } from './server.js';
22
+ import { type AiDiagnosticThrottle } from './ai-proxy.js';
23
+ import { type AiEngineConfigWire } from './worker/protocol.js';
24
+ export { GEMINI_PROXY_PATH } from './worker/ai-proxy-paths.js';
25
+ /** The server's gemini engine config: the Vite plugin's `ai.engine`, when it is gemini. */
26
+ export interface GeminiProxyConfig {
27
+ baseUrl?: string;
28
+ apiKey?: string;
29
+ }
30
+ /** The gemini proxy's config from a configured engine, when that engine is gemini. */
31
+ export declare function geminiProxyConfig(engine: AiEngineConfigWire | undefined): GeminiProxyConfig | undefined;
32
+ /** Is this request for the gemini proxy (and not the OpenAI-compatible one)? */
33
+ export declare function isGeminiProxyPath(pathname: string): boolean;
34
+ /**
35
+ * The gemini proxy handler. One `GeminiUpstream` serves every request, so an
36
+ * ADC token is looked up once and reused, as the engine itself does.
37
+ * `seams` replaces the ADC lookup in tests.
38
+ */
39
+ export declare function createGeminiProxy(config: GeminiProxyConfig | undefined, throttle: AiDiagnosticThrottle, logger?: ServeLogger, seams?: Pick<GeminiUpstreamOptions, 'printAdcToken'>): (req: IncomingMessage, res: ServerResponse, url: URL) => Promise<void>;
40
+ //# sourceMappingURL=gemini-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-proxy.d.ts","sourceRoot":"","sources":["../../src/serve/gemini-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAqD,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE7G,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,2FAA2F;AAC3F,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sFAAsF;AACtF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAOvG;AAYD,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE3D;AAgCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,GAAG,SAAS,EACrC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,CAAC,EAAE,WAAW,EACpB,KAAK,GAAE,IAAI,CAAC,qBAAqB,EAAE,eAAe,CAAM,GACvD,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAwCxE"}
@@ -0,0 +1,105 @@
1
+ import { GeminiUpstream } from 'pyric/ai/internal';
2
+ import { redactUpstreamError } from './gemini-error-redaction.js';
3
+ import { fetchAiUpstream, readAiProxyBody, relayAiUpstream } from './ai-proxy.js';
4
+ import { GEMINI_PROXY_PATH } from './worker/ai-proxy-paths.js';
5
+ import { serializeError } from './worker/protocol.js';
6
+ export { GEMINI_PROXY_PATH } from './worker/ai-proxy-paths.js';
7
+ /** The gemini proxy's config from a configured engine, when that engine is gemini. */
8
+ export function geminiProxyConfig(engine) {
9
+ const isGemini = engine?.kind === 'gemini';
10
+ if (!isGemini)
11
+ return undefined;
12
+ return {
13
+ ...(engine.baseUrl !== undefined ? { baseUrl: engine.baseUrl } : {}),
14
+ ...(engine.apiKey !== undefined ? { apiKey: engine.apiKey } : {}),
15
+ };
16
+ }
17
+ /** `/v1beta/models/<model>:<call>`, for the three calls the browser engine makes. */
18
+ const GEMINI_CALL_PATH = /^\/v1beta\/(models\/[A-Za-z0-9._-]+):(generateContent|streamGenerateContent|countTokens)$/;
19
+ /** The query each call may carry: only the stream asks for server-sent events. */
20
+ const CALL_QUERY = {
21
+ generateContent: '',
22
+ countTokens: '',
23
+ streamGenerateContent: '?alt=sse',
24
+ };
25
+ /** Is this request for the gemini proxy (and not the OpenAI-compatible one)? */
26
+ export function isGeminiProxyPath(pathname) {
27
+ return pathname.startsWith(`${GEMINI_PROXY_PATH}/`);
28
+ }
29
+ /** The resource and the action `GeminiUpstream.send` takes, or null for anything else. */
30
+ function geminiCall(url) {
31
+ const match = url.pathname.slice(GEMINI_PROXY_PATH.length).match(GEMINI_CALL_PATH);
32
+ if (match === null)
33
+ return null;
34
+ const [, resource, call] = match;
35
+ const isExpectedQuery = url.search === CALL_QUERY[call];
36
+ if (!isExpectedQuery)
37
+ return null;
38
+ return { resource, action: `${call}${url.search}` };
39
+ }
40
+ /** Answer with a Gemini error envelope, as the upstream would. */
41
+ function sendEnvelope(res, code, message, status) {
42
+ res.writeHead(code, { 'content-type': 'application/json', 'cache-control': 'no-store' });
43
+ res.end(JSON.stringify({ error: { code, message, status } }));
44
+ }
45
+ /**
46
+ * Send a non-2xx upstream answer with the credentials the request carried
47
+ * removed, in whatever form the upstream quotes them, and a JSON envelope
48
+ * kept parseable (`gemini-error-redaction.ts`).
49
+ */
50
+ async function relayRedactedError(upstream, credentials, res) {
51
+ const text = redactUpstreamError(await upstream.text().catch(() => ''), credentials);
52
+ const headers = { 'cache-control': 'no-store' };
53
+ const contentType = upstream.headers.get('content-type');
54
+ if (contentType)
55
+ headers['content-type'] = contentType;
56
+ res.writeHead(upstream.status, headers);
57
+ res.end(text);
58
+ }
59
+ /**
60
+ * The gemini proxy handler. One `GeminiUpstream` serves every request, so an
61
+ * ADC token is looked up once and reused, as the engine itself does.
62
+ * `seams` replaces the ADC lookup in tests.
63
+ */
64
+ export function createGeminiProxy(config, throttle, logger, seams = {}) {
65
+ const upstream = new GeminiUpstream({
66
+ ...seams,
67
+ ...(config?.baseUrl !== undefined ? { baseUrl: config.baseUrl } : {}),
68
+ ...(config?.apiKey !== undefined ? { apiKey: config.apiKey } : {}),
69
+ fetch: Object.assign((input, init) => fetchAiUpstream(input, init, throttle, logger), { preconnect: fetch.preconnect }),
70
+ });
71
+ return async (req, res, url) => {
72
+ if (req.method !== 'POST') {
73
+ res.writeHead(405, { allow: 'POST' }).end('method not allowed');
74
+ return;
75
+ }
76
+ const call = geminiCall(url);
77
+ if (call === null) {
78
+ sendEnvelope(res, 404, `pyric dev ai-proxy: ${url.pathname} is not a Gemini call the proxy sends.`, 'NOT_FOUND');
79
+ return;
80
+ }
81
+ const body = await readAiProxyBody(req, res);
82
+ if (body === null)
83
+ return;
84
+ let response;
85
+ let credentials;
86
+ try {
87
+ ({ response, credentials } = await upstream.sendWithCredentials(call.resource, call.action, body));
88
+ }
89
+ catch (error) {
90
+ // Missing credentials (401) and an unreachable upstream (502) come as
91
+ // the engine's own envelopes, already redacted.
92
+ const envelope = serializeError(error).aiEnvelope;
93
+ if (envelope === undefined)
94
+ throw error;
95
+ sendEnvelope(res, envelope.error.code, envelope.error.message, envelope.error.status);
96
+ return;
97
+ }
98
+ if (response.ok) {
99
+ await relayAiUpstream(response, res);
100
+ return;
101
+ }
102
+ await relayRedactedError(response, credentials, res);
103
+ };
104
+ }
105
+ //# sourceMappingURL=gemini-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-proxy.js","sourceRoot":"","sources":["../../src/serve/gemini-proxy.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,cAAc,EAA8B,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAA6B,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAA2B,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAQ/D,sFAAsF;AACtF,MAAM,UAAU,iBAAiB,CAAC,MAAsC;IACtE,MAAM,QAAQ,GAAG,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO;QACL,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,gBAAgB,GAAG,2FAA2F,CAAC;AAErH,kFAAkF;AAClF,MAAM,UAAU,GAA2B;IACzC,eAAe,EAAE,EAAE;IACnB,WAAW,EAAE,EAAE;IACf,qBAAqB,EAAE,UAAU;CAClC,CAAC;AAEF,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,iBAAiB,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,0FAA0F;AAC1F,SAAS,UAAU,CAAC,GAAQ;IAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnF,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,KAA4C,CAAC;IACxE,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;AACtD,CAAC;AAED,kEAAkE;AAClE,SAAS,YAAY,CAAC,GAAmB,EAAE,IAAY,EAAE,OAAe,EAAE,MAAc;IACtF,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;IACzF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,kBAAkB,CAAC,QAAkB,EAAE,WAA8B,EAAE,GAAmB;IACvG,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IACrF,MAAM,OAAO,GAA2B,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;IACxE,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACzD,IAAI,WAAW;QAAE,OAAO,CAAC,cAAc,CAAC,GAAG,WAAW,CAAC;IACvD,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAqC,EACrC,QAA8B,EAC9B,MAAoB,EACpB,QAAsD,EAAE;IAExD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC;QAClC,GAAG,KAAK;QACR,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,KAAK,EAAE,MAAM,CAAC,MAAM,CAClB,CAAC,KAAkC,EAAE,IAAkB,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAC1G,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CACjC;KACF,CAAC,CAAC;IACH,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,GAAG,CAAC,QAAQ,wCAAwC,EAAE,WAAW,CAAC,CAAC;YACjH,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAC1B,IAAI,QAAkB,CAAC;QACvB,IAAI,WAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACrG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sEAAsE;YACtE,gDAAgD;YAChD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;YAClD,IAAI,QAAQ,KAAK,SAAS;gBAAE,MAAM,KAAK,CAAC;YACxC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,MAAM,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC"}
@@ -12,15 +12,15 @@ export declare const hostedMethodRequest: z.ZodObject<{
12
12
  allowProduction: z.ZodDefault<z.ZodBoolean>;
13
13
  }, "strict", z.ZodTypeAny, {
14
14
  key: string;
15
+ projectDir: string;
15
16
  instanceId: string;
16
17
  args: Record<string, unknown>;
17
- projectDir: string;
18
18
  allowProduction: boolean;
19
19
  }, {
20
20
  key: string;
21
+ projectDir: string;
21
22
  instanceId: string;
22
23
  args: Record<string, unknown>;
23
- projectDir: string;
24
24
  allowProduction?: boolean | undefined;
25
25
  }>;
26
26
  export type HostedMethodRequest = z.infer<typeof hostedMethodRequest>;
@@ -43,10 +43,10 @@ export declare const hostedReproRequest: z.ZodObject<{
43
43
  instanceId: z.ZodString;
44
44
  projectDir: z.ZodString;
45
45
  }, "strict", z.ZodTypeAny, {
46
- instanceId: string;
47
46
  projectDir: string;
48
- }, {
49
47
  instanceId: string;
48
+ }, {
50
49
  projectDir: string;
50
+ instanceId: string;
51
51
  }>;
52
52
  //# sourceMappingURL=method-protocol.d.ts.map
@@ -3,6 +3,8 @@ import { type AiMode } from './firebase-module-swap.js';
3
3
  /**
4
4
  * The import-map targets, specifier to served URL, for one AI mode. Derived
5
5
  * from the shared swap table, so the Vite resolver serves the same modules.
6
+ * In production AI mode `firebase/ai` goes to the Firebase SDK that
7
+ * `pyric sandbox` builds from the project's `firebase` install.
6
8
  */
7
9
  export declare function sdkImportMap(mode?: AiMode): Record<string, string>;
8
10
  /** Inject the sandbox import map and boot tags before application modules. */
@@ -1 +1 @@
1
- {"version":3,"file":"html-injection.d.ts","sourceRoot":"","sources":["../../src/serve/html-injection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,EAA0B,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEhF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM7E;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,4FAA4F;IAC5F,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAOnF"}
1
+ {"version":3,"file":"html-injection.d.ts","sourceRoot":"","sources":["../../src/serve/html-injection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAElF;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM7E;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,4FAA4F;IAC5F,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAOnF"}
@@ -1,14 +1,16 @@
1
1
  import { stampHostedTarget } from './runtime/hosted-target.js';
2
2
  import { REACT_BOOTSTRAP } from './react-bootstrap.js';
3
3
  import { SANDBOX_BUILD_MARKER } from './sandbox-marker.js';
4
- import { swappedFirebaseEntries } from './firebase-module-swap.js';
4
+ import { importMapFirebaseEntries } from './firebase-module-swap.js';
5
5
  /**
6
6
  * The import-map targets, specifier to served URL, for one AI mode. Derived
7
7
  * from the shared swap table, so the Vite resolver serves the same modules.
8
+ * In production AI mode `firebase/ai` goes to the Firebase SDK that
9
+ * `pyric sandbox` builds from the project's `firebase` install.
8
10
  */
9
11
  export function sdkImportMap(mode = 'sandbox') {
10
12
  const imports = {};
11
- for (const [specifier, entryKey] of swappedFirebaseEntries(mode)) {
13
+ for (const [specifier, entryKey] of importMapFirebaseEntries(mode)) {
12
14
  imports[specifier] = `/__pyric/sdk/${entryKey}.js`;
13
15
  }
14
16
  return imports;
@@ -1 +1 @@
1
- {"version":3,"file":"html-injection.js","sourceRoot":"","sources":["../../src/serve/html-injection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"html-injection.js","sourceRoot":"","sources":["../../src/serve/html-injection.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { type StateStore } from './state-store.js';
4
4
  import { type StudioRouteOptions } from './studio/index.js';
5
5
  import { type ServeLogger } from './server.js';
6
6
  import type { InitPayload } from './init-payload.js';
7
+ import { type GeminiProxyConfig } from './gemini-proxy.js';
7
8
  import { type AiDiagnosticPayload } from './ai-terminal-blocks.js';
8
9
  import type { AssetResolver } from './assets/resolver.js';
9
10
  import { type BeaconReport } from '../register/beacon.js';
@@ -75,6 +76,10 @@ export interface NamespaceOptions {
75
76
  * (local Ollama). Always mounted — the route only touches the network
76
77
  * when a request arrives. */
77
78
  aiProxyUpstream?: string;
79
+ /** The gemini engine `/__pyric/ai-proxy/gemini` sends for a browser engine
80
+ * (#1584): the Vite plugin's `ai.engine` when it is gemini. Absent, it
81
+ * sends to Google AI Studio with the key from this process's environment. */
82
+ aiGemini?: GeminiProxyConfig;
78
83
  /** Receives one handshake beacon per pyric-launched child (`POST
79
84
  * /__pyric/beacon`, sent by `@pyric/cli/register` once its hooks and
80
85
  * net-guard are installed). Absent means the route still 204s; the child
@@ -90,6 +95,10 @@ export interface NamespaceOptions {
90
95
  * falling back to raw `console`). */
91
96
  logger?: ServeLogger;
92
97
  }
98
+ /** Largest relayed denial the route reads. A real one is a message, a path, a
99
+ * uid and a short owner stack, a few KiB at most; the index route's 64 KiB
100
+ * leaves room for a deep stack without letting a page grow the server. */
101
+ export declare const DENIAL_BODY_LIMIT_BYTES: number;
93
102
  /** Loosely-typed mirror of the client's relay payload — JSON from the served
94
103
  * page, read defensively since nothing here enforces the wire shape. */
95
104
  interface DenialRelayPayload {
@@ -1 +1 @@
1
- {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/serve/namespace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/serve/namespace.ts"],"names":[],"mappings":"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"}