fest-gateway 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +87 -3
  2. package/dist/cli/codex.js +116 -0
  3. package/dist/cli/codex.js.map +1 -0
  4. package/dist/cli/copilot.js +109 -0
  5. package/dist/cli/copilot.js.map +1 -0
  6. package/dist/server/api/live.js +1 -0
  7. package/dist/server/api/live.js.map +1 -1
  8. package/dist/server/api/routes.js +2 -1
  9. package/dist/server/api/routes.js.map +1 -1
  10. package/dist/server/bin/fest.js +41 -1
  11. package/dist/server/bin/fest.js.map +1 -1
  12. package/dist/server/config.js +47 -0
  13. package/dist/server/config.js.map +1 -1
  14. package/dist/server/http/client.js +54 -0
  15. package/dist/server/http/client.js.map +1 -0
  16. package/dist/server/http/errors.js +23 -0
  17. package/dist/server/http/errors.js.map +1 -1
  18. package/dist/server/http/headers.js +53 -4
  19. package/dist/server/http/headers.js.map +1 -1
  20. package/dist/server/http/server.js +104 -0
  21. package/dist/server/http/server.js.map +1 -1
  22. package/dist/server/http/sse.js +2 -1
  23. package/dist/server/http/sse.js.map +1 -1
  24. package/dist/server/pipeline/bedrock.js +86 -0
  25. package/dist/server/pipeline/bedrock.js.map +1 -0
  26. package/dist/server/pipeline/count-tokens.js +5 -1
  27. package/dist/server/pipeline/count-tokens.js.map +1 -1
  28. package/dist/server/pipeline/dispatch.js +3 -1
  29. package/dist/server/pipeline/dispatch.js.map +1 -1
  30. package/dist/server/pipeline/openai.js +101 -0
  31. package/dist/server/pipeline/openai.js.map +1 -0
  32. package/dist/server/pipeline/passthrough.js +55 -35
  33. package/dist/server/pipeline/passthrough.js.map +1 -1
  34. package/dist/server/pipeline/record.js +1 -0
  35. package/dist/server/pipeline/record.js.map +1 -1
  36. package/dist/server/pipeline/wire.js +63 -0
  37. package/dist/server/pipeline/wire.js.map +1 -0
  38. package/dist/server/secret/fingerprint.js +11 -1
  39. package/dist/server/secret/fingerprint.js.map +1 -1
  40. package/dist/server/store/migrations/006-client.sql +14 -0
  41. package/dist/server/store/queries.js +27 -1
  42. package/dist/server/store/queries.js.map +1 -1
  43. package/dist/server/store/write.js +3 -2
  44. package/dist/server/store/write.js.map +1 -1
  45. package/dist/server/usage/accumulator.js +3 -3
  46. package/dist/server/usage/accumulator.js.map +1 -1
  47. package/dist/server/usage/prices/catalog.js +3 -1
  48. package/dist/server/usage/prices/catalog.js.map +1 -1
  49. package/dist/server/usage/responses.js +124 -0
  50. package/dist/server/usage/responses.js.map +1 -0
  51. package/dist/shared/demotion-vars.js +35 -0
  52. package/dist/shared/demotion-vars.js.map +1 -1
  53. package/dist/web/dist/assets/bitter-latin-700-normal-1jQzrEdb.woff2 +0 -0
  54. package/dist/web/dist/assets/bitter-latin-700-normal-BHV1FLDM.woff +0 -0
  55. package/dist/web/dist/assets/index-C7n3_lX2.css +2 -0
  56. package/dist/web/dist/assets/index-TVK-7gFI.js +56 -0
  57. package/dist/web/dist/assets/index-TVK-7gFI.js.map +1 -0
  58. package/dist/web/dist/index.html +7 -3
  59. package/package.json +2 -1
  60. package/dist/web/dist/assets/index-AEUYX58m.css +0 -2
  61. package/dist/web/dist/assets/index-DznOpmye.js +0 -56
  62. package/dist/web/dist/assets/index-DznOpmye.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"count-tokens.js","sourceRoot":"","sources":["../../../server/pipeline/count-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAoB,EACpB,GAAmB,EACnB,IAAiE;IAEjE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,uBAAuB,EAAE,oCAAoC,CAAC,CAAC,CAAC;QACvF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;YACnC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE;gBACzC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,YAAY,EAAE,MAAM,CAAC,IAAI;aAC1B,CAAC;YACF,IAAI;YACJ,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACvE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,0EAA0E;QAC1E,wDAAwD;QACxD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,EAAE,kDAAkD,CAAC,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"count-tokens.js","sourceRoot":"","sources":["../../../server/pipeline/count-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAoB,EACpB,GAAmB,EACnB,IAAiE;IAEjE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,uBAAuB,EAAE,oCAAoC,CAAC,CAAC,CAAC;QACvF,OAAO;IACT,CAAC;IAED,6EAA6E;IAC7E,2EAA2E;IAC3E,8BAA8B;IAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;YACnC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE;gBACzC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,YAAY,EAAE,MAAM,CAAC,IAAI;aAC1B,CAAC;YACF,IAAI;YACJ,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACvE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,0EAA0E;QAC1E,wDAAwD;QACxD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,EAAE,kDAAkD,CAAC,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC"}
@@ -25,6 +25,7 @@ import { randomUUID } from "node:crypto";
25
25
  import { detectInbound } from "../auth/posture.js";
26
26
  import { isSubscriptionCredential } from "../secret/fingerprint.js";
27
27
  import { readBodyBytes, isTooLarge, peekRequest } from "../http/body.js";
28
+ import { detectClient, sessionIdOf } from "../http/client.js";
28
29
  import { anthropicError, statusForErrorType } from "../http/errors.js";
29
30
  import { resolveRoute, resolveWithoutCallerCredential, defaultAnthropicUpstream, } from "../routes/resolve.js";
30
31
  import { resolveCredential } from "../credentials/resolve.js";
@@ -98,8 +99,9 @@ export async function dispatchMessages(req, res, ctx) {
98
99
  // A server-held credential is org spend, always. This is the field the
99
100
  // posture screen keys off.
100
101
  credentialOrigin: "fallback_server",
101
- sessionId: headerValue(req, "x-claude-code-session-id"),
102
+ sessionId: sessionIdOf(req.headers),
102
103
  clientVersion: headerValue(req, "user-agent"),
104
+ client: detectClient(req.headers),
103
105
  };
104
106
  if (!credential.ok) {
105
107
  log.warn("substitute refused: no server credential", {
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../server/pipeline/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EACL,YAAY,EACZ,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAExC,MAAM,QAAQ,GAAsC;IAClD,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,gBAAgB;CAC5B,CAAC;AAQF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAoB,EACpB,GAAmB,EACnB,GAAoB;IAEpB,0EAA0E;IAC1E,0EAA0E;IAC1E,oDAAoD;IACpD,EAAE;IACF,uEAAuE;IACvE,6EAA6E;IAC7E,+CAA+C;IAC/C,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACpF,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,uBAAuB,CAAC;QACrC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAChF,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,8BAA8B,cAAc,SAAS,CAAC,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B;;;;;;OAMG;IACH,MAAM,QAAQ,GACZ,OAAO,CAAC,kBAAkB,KAAK,IAAI;QACjC,CAAC,CAAC,8BAA8B,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QACxD,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAE3C,IAAI,QAAQ,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACxC,2EAA2E;QAC3E,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACtF,OAAO;IACT,CAAC;IAED,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5D,IAAI,QAAQ,KAAK,IAAI;QAAE,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE1D,MAAM,cAAc,GAClB,OAAO,CAAC,kBAAkB,KAAK,IAAI,IAAI,wBAAwB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE9F,MAAM,UAAU,GAAG,iBAAiB,CAClC,QAAQ,EACR,OAAO,CAAC,kBAAkB,KAAK,IAAI;QACjC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,kBAAkB,CAAC,WAAW,EAAE,cAAc,EAAE,EAC3E,GAAG,CAAC,OAAO,CACZ,CAAC;IAEF,MAAM,IAAI,GAAG;QACX,EAAE,EAAE,UAAU,EAAE;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;QACzC,iBAAiB,EAAE,OAAO,CAAC,QAAQ,CAAC,gBAAgB;QACpD,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,IAAI;QAChC,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,IAAI;QAClC,yEAAyE;QACzE,uEAAuE;QACvE,yEAAyE;QACzE,mBAAmB;QACnB,qBAAqB,EAAE,IAAI;QAC3B,uEAAuE;QACvE,2BAA2B;QAC3B,gBAAgB,EAAE,iBAAqC;QACvD,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,0BAA0B,CAAC;QACvD,aAAa,EAAE,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC;KAC9C,CAAC;IAEF,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,0CAA0C,EAAE;YACnD,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI;YACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI;YACvC,KAAK,EAAE,QAAQ,CAAC,cAAc;SAC/B,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACxD,iEAAiE;QACjE,MAAM,CACJ,GAAG,EACH,GAAG,CAAC,IAAI,EACR,IAAI,EACJ,QAAQ,EACR,UAAU,CAAC,UAAU,EACrB,iCAAiC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAI,GAAG,CAAC,GAAG,CACjF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE;QAC/B,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,IAAI;QACJ,IAAI,EAAE,OAAO,CAAC,aAAa;QAC3B,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC;QACzC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,GAAG,CAAC,IAAI;KACf,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,GAAoB,EAAE,IAAY;IACrD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../server/pipeline/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EACL,YAAY,EACZ,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAExC,MAAM,QAAQ,GAAsC;IAClD,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,gBAAgB;CAC5B,CAAC;AAQF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAoB,EACpB,GAAmB,EACnB,GAAoB;IAEpB,0EAA0E;IAC1E,0EAA0E;IAC1E,oDAAoD;IACpD,EAAE;IACF,uEAAuE;IACvE,6EAA6E;IAC7E,+CAA+C;IAC/C,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACpF,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,uBAAuB,CAAC;QACrC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAChF,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,8BAA8B,cAAc,SAAS,CAAC,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B;;;;;;OAMG;IACH,MAAM,QAAQ,GACZ,OAAO,CAAC,kBAAkB,KAAK,IAAI;QACjC,CAAC,CAAC,8BAA8B,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QACxD,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAE3C,IAAI,QAAQ,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACxC,2EAA2E;QAC3E,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACtF,OAAO;IACT,CAAC;IAED,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5D,IAAI,QAAQ,KAAK,IAAI;QAAE,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE1D,MAAM,cAAc,GAClB,OAAO,CAAC,kBAAkB,KAAK,IAAI,IAAI,wBAAwB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE9F,MAAM,UAAU,GAAG,iBAAiB,CAClC,QAAQ,EACR,OAAO,CAAC,kBAAkB,KAAK,IAAI;QACjC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,kBAAkB,CAAC,WAAW,EAAE,cAAc,EAAE,EAC3E,GAAG,CAAC,OAAO,CACZ,CAAC;IAEF,MAAM,IAAI,GAAG;QACX,EAAE,EAAE,UAAU,EAAE;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;QACzC,iBAAiB,EAAE,OAAO,CAAC,QAAQ,CAAC,gBAAgB;QACpD,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,IAAI;QAChC,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,IAAI;QAClC,yEAAyE;QACzE,uEAAuE;QACvE,yEAAyE;QACzE,mBAAmB;QACnB,qBAAqB,EAAE,IAAI;QAC3B,uEAAuE;QACvE,2BAA2B;QAC3B,gBAAgB,EAAE,iBAAqC;QACvD,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;QACnC,aAAa,EAAE,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC;QAC7C,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;KAClC,CAAC;IAEF,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,0CAA0C,EAAE;YACnD,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI;YACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI;YACvC,KAAK,EAAE,QAAQ,CAAC,cAAc;SAC/B,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACxD,iEAAiE;QACjE,MAAM,CACJ,GAAG,EACH,GAAG,CAAC,IAAI,EACR,IAAI,EACJ,QAAQ,EACR,UAAU,CAAC,UAAU,EACrB,iCAAiC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAI,GAAG,CAAC,GAAG,CACjF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE;QAC/B,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,IAAI;QACJ,IAAI,EAAE,OAAO,CAAC,aAAa;QAC3B,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC;QACzC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,GAAG,CAAC,IAAI;KACf,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,GAAoB,EAAE,IAAY;IACrD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Codex, on the developer's own OpenAI credential.
3
+ *
4
+ * Two mounts, because Codex has two ways to pay and they reach two different
5
+ * backends with two different credentials:
6
+ *
7
+ * - `/openai` — an API key (`OPENAI_API_KEY`). Codex's provider `base_url` is
8
+ * `<fest>/openai/v1`; requests go to `FEST_OPENAI_BASE_URL`
9
+ * (`https://api.openai.com`) as `POST /v1/responses` and `GET /v1/models`.
10
+ * The key's owner is invoiced at list rates.
11
+ * - `/chatgpt` — a ChatGPT login. Codex's `base_url` is
12
+ * `<fest>/chatgpt/backend-api/codex` with `requires_openai_auth = true`, so
13
+ * it sends its own ChatGPT access token (`Authorization: Bearer eyJ…`) and
14
+ * `ChatGPT-Account-ID`; requests go to `FEST_CHATGPT_BASE_URL`
15
+ * (`https://chatgpt.com`). This is the Codex equivalent of a Claude
16
+ * subscription: the developer's plan pays, and Fest records notional value
17
+ * and the plan's 5h/7d windows. OpenAI documents this gateway pattern for
18
+ * ChatGPT workspaces ("Sign in with ChatGPT through a gateway").
19
+ *
20
+ * Both were established by pointing codex-cli 0.162.1 at the Phase 0 capture
21
+ * server: the paths above, `session-id` for the session, an SSE stream with no
22
+ * content-type from chatgpt.com, and `x-codex-turn-state` on every response.
23
+ *
24
+ * Like `/bedrock`, these are mounts rather than model sniffing, and for the
25
+ * same reasons (see `bedrock.ts`): free to detect, impossible to misfire. And
26
+ * like `/bedrock` they bypass the routing table — the mount means "relay on MY
27
+ * credential", and no rule may swap a server-held key in under it.
28
+ *
29
+ * The credential is forwarded and forgotten. A ChatGPT access token is a
30
+ * bearer for the developer's whole ChatGPT account, which is a reason to be
31
+ * more careful with it than with an API key, not less: it is never stored,
32
+ * and the log scrubber redacts JWTs.
33
+ */
34
+ import { joinUpstreamUrl } from "../adapters/url.js";
35
+ import { openaiError } from "../http/errors.js";
36
+ import { buildDownstreamHeaders, buildUpstreamHeaders } from "../http/headers.js";
37
+ import { detectInbound } from "../auth/posture.js";
38
+ import { OPENAI_RESPONSES_WIRE } from "./wire.js";
39
+ import { log } from "../log.js";
40
+ export const OPENAI_MOUNT = "/openai";
41
+ export const CHATGPT_MOUNT = "/chatgpt";
42
+ export const OPENAI_PATHS = { responses: "/v1/responses", models: "/v1/models" };
43
+ export const CHATGPT_PATHS = {
44
+ responses: "/backend-api/codex/responses",
45
+ models: "/backend-api/codex/models",
46
+ };
47
+ /**
48
+ * Split a mount off a path, or null when it is not that mount.
49
+ *
50
+ * Same contract as `splitBedrockMount`: `/openai` alone is `/`, and
51
+ * `/openaiish` is not the mount.
52
+ */
53
+ export function splitMount(mount, path) {
54
+ if (!path.startsWith(mount))
55
+ return null;
56
+ const rest = path.slice(mount.length);
57
+ if (rest === "")
58
+ return "/";
59
+ return rest.startsWith("/") ? rest : null;
60
+ }
61
+ /**
62
+ * `GET …/models` — relayed, never metered, like `count_tokens`.
63
+ *
64
+ * Codex fetches its model catalogue here before the first turn and caches it
65
+ * against `x-models-etag`, so the etag (and `If-None-Match` on the way up) has
66
+ * to survive. The body is relayed whole: on chatgpt.com it is ~600KB, which is
67
+ * a one-off per session and not worth streaming code for.
68
+ */
69
+ export async function handleCodexModels(req, res, opts) {
70
+ const inbound = detectInbound(req.url ?? "/", req.headers);
71
+ const target = joinUpstreamUrl(opts.upstreamBaseUrl, opts.path);
72
+ try {
73
+ const upstream = await fetch(target, {
74
+ method: req.method ?? "GET",
75
+ headers: buildUpstreamHeaders(req.headers, {
76
+ posture: inbound.posture,
77
+ upstreamHost: target.host,
78
+ defaultAnthropicVersion: false,
79
+ }),
80
+ redirect: "error",
81
+ });
82
+ const body = Buffer.from(await upstream.arrayBuffer());
83
+ const headers = buildDownstreamHeaders(upstream.headers, {
84
+ stream: false,
85
+ allow: (name) => OPENAI_RESPONSES_WIRE.downstreamAllow?.(name) === true || name === "etag",
86
+ });
87
+ res.writeHead(upstream.status, headers);
88
+ res.end(body);
89
+ }
90
+ catch (err) {
91
+ log.warn("codex models relay failed", { error: String(err).slice(0, 200) });
92
+ res.writeHead(502, { "content-type": "application/json" });
93
+ res.end(openaiError("api_error", "Fest: could not reach upstream for the model list."));
94
+ }
95
+ }
96
+ /** Refuse a mount whose upstream an operator switched off. */
97
+ export function refuseDisabled(res, envVar) {
98
+ res.writeHead(501, { "content-type": "application/json", "x-should-retry": "false" });
99
+ res.end(openaiError("invalid_request_error", `Fest: this gateway does not relay this Codex backend (${envVar} is set to "off").`));
100
+ }
101
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../server/pipeline/openai.ts"],"names":[],"mappings":"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"}
@@ -17,13 +17,15 @@
17
17
  import { randomUUID } from "node:crypto";
18
18
  import { EMPTY_USAGE } from "../../shared/types.js";
19
19
  import { detectInbound } from "../auth/posture.js";
20
- import { buildUpstreamHeaders, buildDownstreamHeaders, parseRateLimit } from "../http/headers.js";
21
- import { anthropicError, statusForErrorType, sseErrorEvent, describeUpstreamFailure, } from "../http/errors.js";
20
+ import { buildUpstreamHeaders, buildDownstreamHeaders } from "../http/headers.js";
21
+ import { statusForErrorType, describeUpstreamFailure } from "../http/errors.js";
22
22
  import { readBodyBytes, isTooLarge, peekRequest } from "../http/body.js";
23
23
  import { createSseParser } from "../http/sse.js";
24
- import { createUsageAccumulator, usageFromJson } from "../usage/accumulator.js";
24
+ import { detectClient, sessionIdOf } from "../http/client.js";
25
+ import { ANTHROPIC_WIRE } from "./wire.js";
25
26
  import { priceUsage } from "../usage/pricing.js";
26
27
  import { pipeWithTee, beginStream } from "../http/pipe.js";
28
+ import { joinUpstreamUrl } from "../adapters/url.js";
27
29
  import { isSubscriptionCredential } from "../secret/fingerprint.js";
28
30
  import { badIdentity, noIdentity, noUpstreamCredential } from "../auth/gateway-401.js";
29
31
  import { isWarmupPreflightRefusal } from "./preflight.js";
@@ -47,18 +49,18 @@ preRead) {
47
49
  const startedAt = Date.now();
48
50
  const id = randomUUID();
49
51
  const inbound = detectInbound(req.url ?? "/", req.headers);
50
- const sessionId = headerValue(req, "x-claude-code-session-id");
52
+ const wire = ctx.wire ?? ANTHROPIC_WIRE;
53
+ const sessionId = sessionIdOf(req.headers);
51
54
  const clientVersion = headerValue(req, "user-agent");
55
+ const client = detectClient(req.headers);
56
+ // Decided once, here, and used for posture, origin and pricing alike, so the
57
+ // three can never disagree about who paid.
58
+ const isSubscription = inbound.upstreamCredential !== null &&
59
+ (ctx.subscriptionMount === true || isSubscriptionCredential(inbound.upstreamCredential));
60
+ const posture = isSubscription ? "subscription" : inbound.posture;
52
61
  const credentialsConsidered = inbound.upstreamCredential === null
53
62
  ? [{ source: "inbound", result: "missing", reason: "no credential on the request" }]
54
- : [
55
- {
56
- source: isSubscriptionCredential(inbound.upstreamCredential)
57
- ? "inbound_subscription"
58
- : "inbound_key",
59
- result: "used",
60
- },
61
- ];
63
+ : [{ source: isSubscription ? "inbound_subscription" : "inbound_key", result: "used" }];
62
64
  // Resolve identity before anything else, but note the two failure modes are
63
65
  // NOT the same:
64
66
  // * a token was presented and did not resolve -> always an error, because
@@ -75,13 +77,13 @@ preRead) {
75
77
  id,
76
78
  startedAt,
77
79
  endedAt: Date.now(),
78
- posture: inbound.posture,
80
+ posture,
79
81
  identityCarrier: inbound.identity.carrier,
80
82
  callerFingerprint: inbound.identity.tokenFingerprint,
81
83
  userId: resolved?.userId ?? null,
82
84
  tokenId: resolved?.tokenId ?? null,
83
85
  credentialFingerprint: inbound.upstreamCredential?.fingerprint ?? null,
84
- credentialOrigin: credentialOrigin(inbound.upstreamCredential !== null && isSubscriptionCredential(inbound.upstreamCredential), inbound.upstreamCredential !== null && !isSubscriptionCredential(inbound.upstreamCredential)),
86
+ credentialOrigin: credentialOrigin(isSubscription, inbound.upstreamCredential !== null && !isSubscription),
85
87
  sessionId,
86
88
  requestedModel: null,
87
89
  servedModel: null,
@@ -100,6 +102,7 @@ preRead) {
100
102
  upstreamRequestId: null,
101
103
  rateLimit: null,
102
104
  clientVersion,
105
+ client,
103
106
  pipeline: "passthrough",
104
107
  routeId: ctx.routeId ?? null,
105
108
  // Recorded even though this path never chooses: a record that says
@@ -123,7 +126,7 @@ preRead) {
123
126
  });
124
127
  // Claude Code renders error.message to the developer, so this string is
125
128
  // the user-facing UI. Write it for a human who is mid-task.
126
- res.end(anthropicError(type, message));
129
+ res.end(wire.errorBody(type, message));
127
130
  };
128
131
  if (presentedToken !== null && resolved === null) {
129
132
  denyIdentity(badIdentity().message);
@@ -141,12 +144,11 @@ preRead) {
141
144
  const type = "invalid_request_error";
142
145
  finish({ status: "bad_request", httpStatus: statusForErrorType(type) });
143
146
  res.writeHead(statusForErrorType(type), { "content-type": "application/json" });
144
- res.end(anthropicError(type, `Fest: request body exceeds ${MAX_BODY_BYTES} bytes.`));
147
+ res.end(wire.errorBody(type, `Fest: request body exceeds ${MAX_BODY_BYTES} bytes.`));
145
148
  return;
146
149
  }
147
150
  const body = bodyOrTooLarge;
148
151
  const peek = peekRequest(body);
149
- const isSubscription = inbound.upstreamCredential !== null && isSubscriptionCredential(inbound.upstreamCredential);
150
152
  // Key posture with a Fest token and nothing to pay with: the credential
151
153
  // position holds our OWN token, which we will not forward, and no route
152
154
  // claimed this model. Anthropic's 401 would be accurate but useless — it
@@ -165,13 +167,17 @@ preRead) {
165
167
  "content-type": "application/json",
166
168
  "x-should-retry": String(failure.retryable),
167
169
  });
168
- res.end(anthropicError(failure.type, failure.message));
170
+ res.end(wire.errorBody(failure.type, failure.message));
169
171
  return;
170
172
  }
171
- const target = new URL(inbound.effectivePath, ctx.upstreamBaseUrl);
173
+ // `joinUpstreamUrl`, not `new URL(path, base)`: URL resolution throws away a
174
+ // base URL's own path, which silently drops Bedrock's `/anthropic` segment
175
+ // and turns every request into a 404 nobody can read off the config.
176
+ const target = joinUpstreamUrl(ctx.upstreamBaseUrl, ctx.pathOverride ?? inbound.effectivePath);
172
177
  const headers = buildUpstreamHeaders(req.headers, {
173
- posture: inbound.posture,
178
+ posture,
174
179
  upstreamHost: target.host,
180
+ defaultAnthropicVersion: wire.defaultAnthropicVersion,
175
181
  });
176
182
  const abort = new AbortController();
177
183
  let upstream;
@@ -198,12 +204,15 @@ preRead) {
198
204
  errorMessage: String(err).slice(0, 200),
199
205
  });
200
206
  res.writeHead(statusForErrorType(type), { "content-type": "application/json" });
201
- res.end(anthropicError(type, "Fest: upstream request failed."));
207
+ res.end(wire.errorBody(type, "Fest: upstream request failed."));
202
208
  return;
203
209
  }
204
- const rateLimit = parseRateLimit(upstream.headers);
205
- const upstreamRequestId = upstream.headers.get("request-id") ?? upstream.headers.get("anthropic-request-id");
206
- const downstream = buildDownstreamHeaders(upstream.headers, { stream: peek.stream });
210
+ const rateLimit = wire.parseRateLimit(upstream.headers);
211
+ const upstreamRequestId = wire.upstreamRequestId(upstream.headers);
212
+ const downstream = buildDownstreamHeaders(upstream.headers, {
213
+ stream: peek.stream,
214
+ allow: wire.downstreamAllow,
215
+ });
207
216
  const base = {
208
217
  requestedModel: peek.model,
209
218
  servedModel: peek.model,
@@ -234,7 +243,9 @@ preRead) {
234
243
  * failure and is not warned about, or every session would open with an
235
244
  * error in the dashboard and a warning in the log.
236
245
  */
237
- const preflight = isWarmupPreflightRefusal({
246
+ // Claude Code's warmup ping is an Anthropic-wire phenomenon; nothing on
247
+ // another wire is that ping, whatever its shape.
248
+ const preflight = wire.id === "anthropic" && isWarmupPreflightRefusal({
238
249
  httpStatus: upstream.status,
239
250
  stream: peek.stream,
240
251
  maxTokens: peek.maxTokens,
@@ -268,7 +279,7 @@ preRead) {
268
279
  }
269
280
  // `stream: false`: whatever the client asked for, this is a JSON error, and
270
281
  // framing it as a stream would tell the client to expect SSE it won't get.
271
- res.writeHead(upstream.status, buildDownstreamHeaders(upstream.headers, { stream: false }));
282
+ res.writeHead(upstream.status, buildDownstreamHeaders(upstream.headers, { stream: false, allow: wire.downstreamAllow }));
272
283
  res.end(failure.text);
273
284
  finish({
274
285
  ...base,
@@ -284,12 +295,12 @@ preRead) {
284
295
  const text = await upstream.text();
285
296
  let usage = EMPTY_USAGE;
286
297
  try {
287
- usage = usageFromJson(JSON.parse(text)) ?? EMPTY_USAGE;
298
+ usage = wire.usageFromJson(JSON.parse(text)) ?? EMPTY_USAGE;
288
299
  }
289
300
  catch {
290
301
  // A body we cannot read is still relayed; we just report less.
291
302
  }
292
- const priced = priceUsage(peek.model, usage, isSubscription);
303
+ const priced = priceUsage(peek.model, usage, isSubscription, ctx.priceProvider);
293
304
  res.writeHead(upstream.status, downstream);
294
305
  res.end(text);
295
306
  finish({
@@ -304,8 +315,11 @@ preRead) {
304
315
  return;
305
316
  }
306
317
  // ── streaming ──────────────────────────────────────────────────────────────
307
- const parser = createSseParser();
308
- const acc = createUsageAccumulator();
318
+ const parser = createSseParser({
319
+ interestingTypes: wire.usageEventTypes,
320
+ maxEventChars: wire.maxEventChars,
321
+ });
322
+ const acc = wire.createAccumulator();
309
323
  beginStream(res, upstream.status, downstream);
310
324
  try {
311
325
  const result = await pipeWithTee(upstream.body, res, {
@@ -319,7 +333,7 @@ preRead) {
319
333
  for (const event of parser.flush())
320
334
  acc.apply(event);
321
335
  const usage = acc.snapshot();
322
- const priced = priceUsage(peek.model, usage, isSubscription);
336
+ const priced = priceUsage(peek.model, usage, isSubscription, ctx.priceProvider);
323
337
  const streamErr = acc.streamError();
324
338
  /**
325
339
  * Only a 2xx reaches here — a non-2xx was recorded and relayed above, which
@@ -332,8 +346,14 @@ preRead) {
332
346
  * a client abort wins over them: the developer walking away is the more
333
347
  * specific fact about what happened.
334
348
  */
349
+ //
350
+ // A client that hangs up AFTER the terminal event is not walking away: it
351
+ // has the whole answer. Codex does exactly this — it stops reading at
352
+ // `response.completed` while chatgpt.com is still holding the stream open —
353
+ // and counting that as an abort marked every Codex turn a failure.
354
+ const finished = result.completed || acc.sawTerminal?.() === true;
335
355
  let status = "ok";
336
- if (result.clientAborted)
356
+ if (result.clientAborted && !finished)
337
357
  status = "client_abort";
338
358
  else if (streamErr)
339
359
  status = "stream_error";
@@ -344,7 +364,7 @@ preRead) {
344
364
  status,
345
365
  // Input tokens were already consumed upstream even on an abort, so the
346
366
  // partial usage is real and worth recording — just flagged as incomplete.
347
- partial: result.clientAborted || !result.completed,
367
+ partial: !finished,
348
368
  usage,
349
369
  costUsd: priced.cost,
350
370
  costBasis: priced.basis,
@@ -364,10 +384,10 @@ preRead) {
364
384
  for (const event of parser.flush())
365
385
  acc.apply(event);
366
386
  const usage = acc.snapshot();
367
- const priced = priceUsage(peek.model, usage, isSubscription);
387
+ const priced = priceUsage(peek.model, usage, isSubscription, ctx.priceProvider);
368
388
  log.warn("upstream stream failed mid-flight", { id, error: String(err).slice(0, 200) });
369
389
  if (!res.writableEnded) {
370
- res.write(sseErrorEvent("api_error", "Fest: upstream connection closed mid-stream."));
390
+ res.write(wire.sseErrorFrame("api_error", "Fest: upstream connection closed mid-stream."));
371
391
  res.end();
372
392
  }
373
393
  finish({
@@ -1 +1 @@
1
- {"version":3,"file":"passthrough.js","sourceRoot":"","sources":["../../../server/pipeline/passthrough.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"passthrough.js","sourceRoot":"","sources":["../../../server/pipeline/passthrough.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,7 @@ export function buildRecord(base, partial) {
40
40
  upstreamRequestId: null,
41
41
  rateLimit: null,
42
42
  clientVersion: base.clientVersion,
43
+ client: base.client ?? null,
43
44
  pipeline: base.pipeline,
44
45
  routeId: base.routeId,
45
46
  credentialsConsidered: base.credentialsConsidered,
@@ -1 +1 @@
1
- {"version":3,"file":"record.js","sourceRoot":"","sources":["../../../server/pipeline/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAoBpD,MAAM,UAAU,WAAW,CACzB,IAAgB,EAChB,OAAyD;IAEzD,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,MAAM;QACjB,eAAe,EAAE,IAAI;QACrB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS;QACvC,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,CAAC;QACX,iBAAiB,EAAE,IAAI;QACvB,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,GAAG,OAAO;KACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../../server/pipeline/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAqBpD,MAAM,UAAU,WAAW,CACzB,IAAgB,EAChB,OAAyD;IAEzD,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,MAAM;QACjB,eAAe,EAAE,IAAI;QACrB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS;QACvC,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,CAAC;QACX,iBAAiB,EAAE,IAAI;QACvB,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,GAAG,OAAO;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Wire profiles: everything the pass-through relay needs to know about the
3
+ * API it is relaying, and nothing else.
4
+ *
5
+ * The relay itself — identity, the byte-for-byte forward, the tee, the record —
6
+ * is the same for every client, which is why there is one `handleMessages`
7
+ * rather than one per vendor. What differs is how usage is reported, what an
8
+ * error looks like, which headers matter, and where quota lives. That is this
9
+ * interface. It is not an adapter: nothing here may rewrite a request.
10
+ *
11
+ * - `anthropic` — the Messages API. Claude Code, Bedrock mantle, and Copilot
12
+ * CLI in BYOK mode with `COPILOT_PROVIDER_TYPE=anthropic`.
13
+ * - `openai-responses` — the Responses API. Codex on an API key (`/openai`)
14
+ * and on a ChatGPT login (`/chatgpt`).
15
+ */
16
+ import { USAGE_EVENT_TYPES } from "../../shared/types.js";
17
+ import { anthropicError, openaiError, openaiSseErrorEvent, sseErrorEvent, } from "../http/errors.js";
18
+ import { parseCodexRateLimit, parseRateLimit } from "../http/headers.js";
19
+ import { createUsageAccumulator, usageFromJson, } from "../usage/accumulator.js";
20
+ import { createResponsesAccumulator, responsesUsageFromJson, RESPONSES_MAX_EVENT_CHARS, RESPONSES_USAGE_EVENT_TYPES, } from "../usage/responses.js";
21
+ export const ANTHROPIC_WIRE = {
22
+ id: "anthropic",
23
+ usageEventTypes: USAGE_EVENT_TYPES,
24
+ createAccumulator: createUsageAccumulator,
25
+ usageFromJson,
26
+ errorBody: anthropicError,
27
+ sseErrorFrame: sseErrorEvent,
28
+ defaultAnthropicVersion: true,
29
+ parseRateLimit,
30
+ upstreamRequestId: (h) => h.get("request-id") ?? h.get("anthropic-request-id"),
31
+ };
32
+ /**
33
+ * Response headers a Codex client reads.
34
+ *
35
+ * `x-codex-turn-state` is the one that matters: Codex echoes it on its next
36
+ * request so the backend keeps the turn on the same node, and dropping it was
37
+ * not tested. The rest are quota and diagnostics Codex shows the developer.
38
+ */
39
+ function codexAllow(name) {
40
+ return (name.startsWith("x-codex-") ||
41
+ name.startsWith("x-ratelimit-") ||
42
+ name.startsWith("openai-") ||
43
+ name === "x-request-id" ||
44
+ name === "x-oai-request-id" ||
45
+ name === "x-models-etag");
46
+ }
47
+ export const OPENAI_RESPONSES_WIRE = {
48
+ id: "openai-responses",
49
+ usageEventTypes: RESPONSES_USAGE_EVENT_TYPES,
50
+ maxEventChars: RESPONSES_MAX_EVENT_CHARS,
51
+ createAccumulator: createResponsesAccumulator,
52
+ usageFromJson: responsesUsageFromJson,
53
+ errorBody: openaiError,
54
+ sseErrorFrame: openaiSseErrorEvent,
55
+ defaultAnthropicVersion: false,
56
+ downstreamAllow: codexAllow,
57
+ // api.openai.com sends `x-ratelimit-*` request/token counters, which are per
58
+ // org key and have no 5h/7d shape to map. chatgpt.com sends the Codex plan
59
+ // windows, which do.
60
+ parseRateLimit: parseCodexRateLimit,
61
+ upstreamRequestId: (h) => h.get("x-request-id") ?? h.get("x-oai-request-id"),
62
+ };
63
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../server/pipeline/wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EACL,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,aAAa,GAEd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EACL,sBAAsB,EACtB,aAAa,GAEd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAoB/B,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,EAAE,EAAE,WAAW;IACf,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,sBAAsB;IACzC,aAAa;IACb,SAAS,EAAE,cAAc;IACzB,aAAa,EAAE,aAAa;IAC5B,uBAAuB,EAAE,IAAI;IAC7B,cAAc;IACd,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC;CAC/E,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,CACL,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC1B,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,kBAAkB;QAC3B,IAAI,KAAK,eAAe,CACzB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IAChD,EAAE,EAAE,kBAAkB;IACtB,eAAe,EAAE,2BAA2B;IAC5C,aAAa,EAAE,yBAAyB;IACxC,iBAAiB,EAAE,0BAA0B;IAC7C,aAAa,EAAE,sBAAsB;IACrC,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,mBAAmB;IAClC,uBAAuB,EAAE,KAAK;IAC9B,eAAe,EAAE,UAAU;IAC3B,6EAA6E;IAC7E,2EAA2E;IAC3E,qBAAqB;IACrB,cAAc,EAAE,mBAAmB;IACnC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC;CAC7E,CAAC"}
@@ -67,6 +67,9 @@ export function classifyCredential(header, rawValue) {
67
67
  kind = "FIREPASS_KEY";
68
68
  else if (token.startsWith("fest_"))
69
69
  kind = "FEST_IDENTITY_TOKEN";
70
+ // After every `sk-ant-` case, so an Anthropic key can never land here.
71
+ else if (token.startsWith("sk-"))
72
+ kind = "OPENAI_API_KEY";
70
73
  return {
71
74
  header,
72
75
  scheme: bearer ? "Bearer" : "raw",
@@ -85,8 +88,15 @@ export function isSubscriptionCredential(info) {
85
88
  * fails, so every log line passes through this regardless of where it came from.
86
89
  */
87
90
  const SECRET_PATTERN = /\b(?:sk-ant|sk|pk|ghp|gho|ghs|ghu|github_pat|xox[bpoars]|fw|fpk|fest)[-_][\w-]{8,}\b/gi;
91
+ /**
92
+ * A JWT: three base64url segments, the first an encoded `{"alg":…}` header, so
93
+ * it always starts `eyJ`. A ChatGPT login's access token is one, and it is a
94
+ * bearer for the developer's whole ChatGPT account — and, having no vendor
95
+ * prefix, it slips past `SECRET_PATTERN`.
96
+ */
97
+ const JWT_PATTERN = /\beyJ[\w-]{8,}\.[\w-]{8,}\.[\w-]*/g;
88
98
  export function redactSecrets(text) {
89
- return text.replace(SECRET_PATTERN, "<redacted>");
99
+ return text.replace(SECRET_PATTERN, "<redacted>").replace(JWT_PATTERN, "<redacted>");
90
100
  }
91
101
  /**
92
102
  * Split request headers into credentials (fingerprinted) and the rest (kept).
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../server/secret/fingerprint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../server/secret/fingerprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ -- Which coding agent sent each request: 'claude-code', 'codex' or 'copilot'.
2
+ --
3
+ -- Fest fronted only Claude Code until the `/openai` and `/chatgpt` mounts
4
+ -- (Codex) and Copilot CLI's BYOK mode. Model ids mostly tell the clients apart,
5
+ -- but not reliably — Copilot BYOK sends the same `claude-*` ids Claude Code
6
+ -- does — and "how much of our spend is Codex" is a question per client, not
7
+ -- per model.
8
+ --
9
+ -- Labelled from caller-controlled headers (see server/http/client.ts), so it is
10
+ -- reporting, never policy. NULL is "could not tell", which is also every row
11
+ -- written before this migration: they were almost certainly Claude Code, but a
12
+ -- guess written into history is exactly what this schema refuses to do.
13
+
14
+ ALTER TABLE requests ADD COLUMN client TEXT;