fest-gateway 0.1.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 (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +274 -0
  3. package/dist/cli/claude.js +326 -0
  4. package/dist/cli/claude.js.map +1 -0
  5. package/dist/cli/config.js +59 -0
  6. package/dist/cli/config.js.map +1 -0
  7. package/dist/cli/login.js +130 -0
  8. package/dist/cli/login.js.map +1 -0
  9. package/dist/cli/logout.js +20 -0
  10. package/dist/cli/logout.js.map +1 -0
  11. package/dist/cli/whoami.js +34 -0
  12. package/dist/cli/whoami.js.map +1 -0
  13. package/dist/server/adapters/anthropic.js +74 -0
  14. package/dist/server/adapters/anthropic.js.map +1 -0
  15. package/dist/server/adapters/fireworks.js +54 -0
  16. package/dist/server/adapters/fireworks.js.map +1 -0
  17. package/dist/server/adapters/index.js +16 -0
  18. package/dist/server/adapters/index.js.map +1 -0
  19. package/dist/server/adapters/registry.js +38 -0
  20. package/dist/server/adapters/registry.js.map +1 -0
  21. package/dist/server/adapters/rewrite.js +152 -0
  22. package/dist/server/adapters/rewrite.js.map +1 -0
  23. package/dist/server/adapters/url.js +24 -0
  24. package/dist/server/adapters/url.js.map +1 -0
  25. package/dist/server/api/auth.js +213 -0
  26. package/dist/server/api/auth.js.map +1 -0
  27. package/dist/server/api/live.js +108 -0
  28. package/dist/server/api/live.js.map +1 -0
  29. package/dist/server/api/models.js +129 -0
  30. package/dist/server/api/models.js.map +1 -0
  31. package/dist/server/api/oauth.js +300 -0
  32. package/dist/server/api/oauth.js.map +1 -0
  33. package/dist/server/api/routes.js +164 -0
  34. package/dist/server/api/routes.js.map +1 -0
  35. package/dist/server/api/routing-view.js +47 -0
  36. package/dist/server/api/routing-view.js.map +1 -0
  37. package/dist/server/auth/accounts.js +111 -0
  38. package/dist/server/auth/accounts.js.map +1 -0
  39. package/dist/server/auth/gateway-401.js +85 -0
  40. package/dist/server/auth/gateway-401.js.map +1 -0
  41. package/dist/server/auth/guard.js +74 -0
  42. package/dist/server/auth/guard.js.map +1 -0
  43. package/dist/server/auth/oauth.js +43 -0
  44. package/dist/server/auth/oauth.js.map +1 -0
  45. package/dist/server/auth/password.js +104 -0
  46. package/dist/server/auth/password.js.map +1 -0
  47. package/dist/server/auth/posture.js +145 -0
  48. package/dist/server/auth/posture.js.map +1 -0
  49. package/dist/server/auth/session.js +161 -0
  50. package/dist/server/auth/session.js.map +1 -0
  51. package/dist/server/bin/fest.js +589 -0
  52. package/dist/server/bin/fest.js.map +1 -0
  53. package/dist/server/config.js +109 -0
  54. package/dist/server/config.js.map +1 -0
  55. package/dist/server/credentials/provider.js +70 -0
  56. package/dist/server/credentials/provider.js.map +1 -0
  57. package/dist/server/credentials/resolve.js +89 -0
  58. package/dist/server/credentials/resolve.js.map +1 -0
  59. package/dist/server/http/body.js +66 -0
  60. package/dist/server/http/body.js.map +1 -0
  61. package/dist/server/http/errors.js +144 -0
  62. package/dist/server/http/errors.js.map +1 -0
  63. package/dist/server/http/headers.js +189 -0
  64. package/dist/server/http/headers.js.map +1 -0
  65. package/dist/server/http/pipe.js +97 -0
  66. package/dist/server/http/pipe.js.map +1 -0
  67. package/dist/server/http/server.js +226 -0
  68. package/dist/server/http/server.js.map +1 -0
  69. package/dist/server/http/sse.js +167 -0
  70. package/dist/server/http/sse.js.map +1 -0
  71. package/dist/server/http/static.js +138 -0
  72. package/dist/server/http/static.js.map +1 -0
  73. package/dist/server/ingest/live-bus.js +67 -0
  74. package/dist/server/ingest/live-bus.js.map +1 -0
  75. package/dist/server/ingest/sink.js +141 -0
  76. package/dist/server/ingest/sink.js.map +1 -0
  77. package/dist/server/log.js +31 -0
  78. package/dist/server/log.js.map +1 -0
  79. package/dist/server/pipeline/count-tokens.js +48 -0
  80. package/dist/server/pipeline/count-tokens.js.map +1 -0
  81. package/dist/server/pipeline/dispatch.js +138 -0
  82. package/dist/server/pipeline/dispatch.js.map +1 -0
  83. package/dist/server/pipeline/passthrough.js +392 -0
  84. package/dist/server/pipeline/passthrough.js.map +1 -0
  85. package/dist/server/pipeline/preflight.js +66 -0
  86. package/dist/server/pipeline/preflight.js.map +1 -0
  87. package/dist/server/pipeline/record.js +49 -0
  88. package/dist/server/pipeline/record.js.map +1 -0
  89. package/dist/server/pipeline/substitute.js +287 -0
  90. package/dist/server/pipeline/substitute.js.map +1 -0
  91. package/dist/server/routes/resolve.js +176 -0
  92. package/dist/server/routes/resolve.js.map +1 -0
  93. package/dist/server/routes/table.js +247 -0
  94. package/dist/server/routes/table.js.map +1 -0
  95. package/dist/server/routes/watch.js +101 -0
  96. package/dist/server/routes/watch.js.map +1 -0
  97. package/dist/server/secret/fingerprint.js +107 -0
  98. package/dist/server/secret/fingerprint.js.map +1 -0
  99. package/dist/server/secret/non-persistable.js +69 -0
  100. package/dist/server/secret/non-persistable.js.map +1 -0
  101. package/dist/server/store/audit.js +53 -0
  102. package/dist/server/store/audit.js.map +1 -0
  103. package/dist/server/store/bootstrap.js +53 -0
  104. package/dist/server/store/bootstrap.js.map +1 -0
  105. package/dist/server/store/db.js +157 -0
  106. package/dist/server/store/db.js.map +1 -0
  107. package/dist/server/store/ids.js +14 -0
  108. package/dist/server/store/ids.js.map +1 -0
  109. package/dist/server/store/migrations/001-init.sql +213 -0
  110. package/dist/server/store/migrations/002-feed-and-error-indexes.sql +26 -0
  111. package/dist/server/store/migrations/003-routing.sql +42 -0
  112. package/dist/server/store/migrations/004-admin-auth.sql +72 -0
  113. package/dist/server/store/migrations/005-notional-cost.sql +28 -0
  114. package/dist/server/store/queries.js +904 -0
  115. package/dist/server/store/queries.js.map +1 -0
  116. package/dist/server/store/retention.js +79 -0
  117. package/dist/server/store/retention.js.map +1 -0
  118. package/dist/server/store/seed.js +203 -0
  119. package/dist/server/store/seed.js.map +1 -0
  120. package/dist/server/store/tokens.js +133 -0
  121. package/dist/server/store/tokens.js.map +1 -0
  122. package/dist/server/store/write.js +330 -0
  123. package/dist/server/store/write.js.map +1 -0
  124. package/dist/server/usage/accumulator.js +209 -0
  125. package/dist/server/usage/accumulator.js.map +1 -0
  126. package/dist/server/usage/cost.js +57 -0
  127. package/dist/server/usage/cost.js.map +1 -0
  128. package/dist/server/usage/prices/catalog.js +136 -0
  129. package/dist/server/usage/prices/catalog.js.map +1 -0
  130. package/dist/server/usage/prices/refresh.js +125 -0
  131. package/dist/server/usage/prices/refresh.js.map +1 -0
  132. package/dist/server/usage/prices/snapshot.json.gz +0 -0
  133. package/dist/server/usage/prices/table.js +102 -0
  134. package/dist/server/usage/prices/table.js.map +1 -0
  135. package/dist/server/usage/pricing.js +103 -0
  136. package/dist/server/usage/pricing.js.map +1 -0
  137. package/dist/shared/api.js +19 -0
  138. package/dist/shared/api.js.map +1 -0
  139. package/dist/shared/base-models.js +28 -0
  140. package/dist/shared/base-models.js.map +1 -0
  141. package/dist/shared/demotion-vars.js +17 -0
  142. package/dist/shared/demotion-vars.js.map +1 -0
  143. package/dist/shared/series.js +50 -0
  144. package/dist/shared/series.js.map +1 -0
  145. package/dist/shared/types.js +40 -0
  146. package/dist/shared/types.js.map +1 -0
  147. package/dist/web/dist/assets/index-8HlKsJqt.css +2 -0
  148. package/dist/web/dist/assets/index-DQ7fyPVm.js +56 -0
  149. package/dist/web/dist/assets/index-DQ7fyPVm.js.map +1 -0
  150. package/dist/web/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  151. package/dist/web/dist/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  152. package/dist/web/dist/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  153. package/dist/web/dist/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  154. package/dist/web/dist/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  155. package/dist/web/dist/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  156. package/dist/web/dist/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  157. package/dist/web/dist/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  158. package/dist/web/dist/index.html +44 -0
  159. package/dist/web/dist/nearform-icon.svg +4 -0
  160. package/package.json +82 -0
  161. package/routes.example.json +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../server/store/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Retention.
3
+ *
4
+ * Raw `requests` rows carry per-developer detail — who, when, which session —
5
+ * so they are the privacy-bearing part of the system and they age out. The
6
+ * hourly rollups are aggregate and survive far longer, which is what lets a
7
+ * dashboard show a year of trends without keeping a year of surveillance.
8
+ *
9
+ * Deletes run in bounded batches. A single unbounded `DELETE` would hold the
10
+ * write lock for as long as it takes, and on a single-writer SQLite that means
11
+ * stalling the metering flush — and therefore the proxy's own queue — behind
12
+ * housekeeping.
13
+ */
14
+ import { sweepSessions } from "../auth/session.js";
15
+ import { log } from "../log.js";
16
+ export const DEFAULT_RETENTION = {
17
+ requestDays: 30,
18
+ rollupDays: 400,
19
+ batchSize: 5_000,
20
+ };
21
+ export function runRetention(store, policy = DEFAULT_RETENTION, now = Date.now()) {
22
+ const batchSize = policy.batchSize ?? 5_000;
23
+ const requestCutoff = now - policy.requestDays * 86_400_000;
24
+ const rollupCutoff = now - policy.rollupDays * 86_400_000;
25
+ // Delete by `seq` rather than by timestamp directly: seq is the primary key,
26
+ // so the subselect is an index scan and the delete is a rowid lookup.
27
+ const delRequests = store.db.prepare(`DELETE FROM requests WHERE seq IN (
28
+ SELECT seq FROM requests WHERE started_at < ? ORDER BY seq LIMIT ?
29
+ )`);
30
+ const delRollups = store.db.prepare(`DELETE FROM usage_hourly WHERE hour_start < ?`);
31
+ let requestsDeleted = 0;
32
+ for (;;) {
33
+ // One transaction per batch, so other writers get a turn between batches.
34
+ const deleted = store.transaction(() => Number(delRequests.run(requestCutoff, batchSize).changes));
35
+ requestsDeleted += deleted;
36
+ if (deleted < batchSize)
37
+ break;
38
+ }
39
+ const rollupsDeleted = store.transaction(() => Number(delRollups.run(rollupCutoff).changes));
40
+ if (requestsDeleted > 0 || rollupsDeleted > 0) {
41
+ log.info("retention swept", {
42
+ requestsDeleted,
43
+ rollupsDeleted,
44
+ requestDays: policy.requestDays,
45
+ rollupDays: policy.rollupDays,
46
+ });
47
+ }
48
+ return { requestsDeleted, rollupsDeleted };
49
+ }
50
+ /**
51
+ * Hourly sweep. Unref'd so housekeeping never holds the process open, and run
52
+ * on a timer rather than at boot so a restart loop cannot turn into a delete
53
+ * loop.
54
+ */
55
+ export function startRetention(store, policy = DEFAULT_RETENTION, intervalMs = 3_600_000) {
56
+ const timer = setInterval(() => {
57
+ try {
58
+ runRetention(store, policy);
59
+ // Dead dashboard sessions ride the same sweep. They are not governed by
60
+ // the retention policy — an expired session hash proves nothing, and the
61
+ // record of who signed in lives in the audit log — so they are simply
62
+ // deleted once they can no longer authenticate anything.
63
+ const sessions = sweepSessions(store);
64
+ if (sessions > 0)
65
+ log.info("sessions swept", { deleted: sessions });
66
+ }
67
+ catch (err) {
68
+ // Housekeeping must never take the gateway down.
69
+ log.warn("retention failed", { error: String(err).slice(0, 200) });
70
+ }
71
+ }, intervalMs);
72
+ timer.unref();
73
+ return {
74
+ stop() {
75
+ clearInterval(timer);
76
+ },
77
+ };
78
+ }
79
+ //# sourceMappingURL=retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention.js","sourceRoot":"","sources":["../../../server/store/retention.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAWhC,MAAM,CAAC,MAAM,iBAAiB,GAAoB;IAChD,WAAW,EAAE,EAAE;IACf,UAAU,EAAE,GAAG;IACf,SAAS,EAAE,KAAK;CACjB,CAAC;AAOF,MAAM,UAAU,YAAY,CAC1B,KAAY,EACZ,SAA0B,iBAAiB,EAC3C,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;IAC5C,MAAM,aAAa,GAAG,GAAG,GAAG,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC;IAC5D,MAAM,YAAY,GAAG,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IAE1D,6EAA6E;IAC7E,sEAAsE;IACtE,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAClC;;OAEG,CACJ,CAAC;IACF,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CACjC,+CAA+C,CAChD,CAAC;IAEF,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,SAAS,CAAC;QACR,0EAA0E;QAC1E,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACnG,eAAe,IAAI,OAAO,CAAC;QAC3B,IAAI,OAAO,GAAG,SAAS;YAAE,MAAM;IACjC,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7F,IAAI,eAAe,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC1B,eAAe;YACf,cAAc;YACd,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAY,EACZ,SAA0B,iBAAiB,EAC3C,UAAU,GAAG,SAAS;IAEtB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,CAAC;YACH,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5B,wEAAwE;YACxE,yEAAyE;YACzE,sEAAsE;YACtE,yDAAyD;YACzD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,QAAQ,GAAG,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,iDAAiD;YACjD,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,EAAE,UAAU,CAAC,CAAC;IACf,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO;QACL,IAAI;YACF,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Synthetic traffic, for looking at the dashboard without a live Max session.
3
+ *
4
+ * Development-only, and honest about it: every generated row is real in shape
5
+ * but invented in content, so it must never be mixed into a database that also
6
+ * holds observed traffic. `fest seed` therefore refuses to run against a
7
+ * non-empty `requests` table unless told to, rather than quietly contaminating
8
+ * a real record with numbers nobody measured.
9
+ *
10
+ * The generator is deterministic (a fixed-seed PRNG, not `Math.random`) so two
11
+ * people looking at "the dashboard with seed data" are looking at the same
12
+ * dashboard, and a screenshot in a bug report means something.
13
+ *
14
+ * What it deliberately reproduces, because these are the cases the UI must get
15
+ * right and a happy-path generator would never produce:
16
+ *
17
+ * - subscription rows with `costUsd: null` and a populated `notionalCostUsd` —
18
+ * no org spend, but real value; the first must never render as `$0.00` or be
19
+ * summed into org spend, and the second must never be summed into it either;
20
+ * - rows with no resolved model, which are unpriced on BOTH figures;
21
+ * - a few `fallback_server` rows — real org spend, which the posture screen is
22
+ * supposed to shout about;
23
+ * - unattributed rows with no `userId` — somebody running without a token;
24
+ * - errors, aborts and a 401, which is expected traffic rather than a fault;
25
+ * - large 1-hour cache writes, because that is what Claude Code actually does.
26
+ */
27
+ import { randomUUID } from "node:crypto";
28
+ import { resolve } from "node:path";
29
+ import { priceUsage } from "../usage/pricing.js";
30
+ import { createRequestWriter } from "./write.js";
31
+ import { ensureOrg, ensureUser } from "./bootstrap.js";
32
+ /** Mulberry32 — tiny, and the same sequence on every machine. */
33
+ function prng(seed) {
34
+ let a = seed >>> 0;
35
+ return () => {
36
+ a = (a + 0x6d2b79f5) >>> 0;
37
+ let t = Math.imul(a ^ (a >>> 15), 1 | a);
38
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
39
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
40
+ };
41
+ }
42
+ const MODELS = [
43
+ "claude-opus-5",
44
+ "claude-sonnet-5",
45
+ "claude-haiku-4-5-20251001",
46
+ ];
47
+ const SEED_USERS = ["ada@corp.test", "grace@corp.test", "alan@corp.test"];
48
+ export function generateRecords(opts) {
49
+ const count = opts.requests ?? 400;
50
+ const hours = opts.hours ?? 48;
51
+ const now = opts.now ?? Date.now();
52
+ const rand = prng(opts.seed ?? 1337);
53
+ const pick = (xs) => xs[Math.floor(rand() * xs.length)];
54
+ const records = [];
55
+ for (let i = 0; i < count; i += 1) {
56
+ // Bias toward recent hours: a real team's traffic is not uniform, and a
57
+ // flat histogram would hide whether the chart's time axis works at all.
58
+ const ageHours = Math.floor(hours * rand() * rand());
59
+ const startedAt = now - ageHours * 3_600_000 - Math.floor(rand() * 3_600_000);
60
+ // Weighted so the first-listed developer dominates, with a tail of
61
+ // unattributed traffic — the case the Users screen exists to surface.
62
+ const roll = rand();
63
+ const userId = roll < 0.08 ? null : (opts.userIds[Math.floor(rand() * rand() * opts.userIds.length)] ?? null);
64
+ const originRoll = rand();
65
+ const credentialOrigin = originRoll < 0.9 ? "inbound_subscription" : originRoll < 0.97 ? "fallback_server" : "inbound_key";
66
+ const subscription = credentialOrigin === "inbound_subscription";
67
+ const statusRoll = rand();
68
+ const status = statusRoll < 0.93
69
+ ? "ok"
70
+ : statusRoll < 0.96
71
+ ? "client_abort"
72
+ : statusRoll < 0.98
73
+ ? "upstream_error"
74
+ : statusRoll < 0.99
75
+ ? "identity_denied"
76
+ : "stream_error";
77
+ const httpStatus = status === "ok" || status === "client_abort"
78
+ ? 200
79
+ : status === "identity_denied"
80
+ ? 401
81
+ : rand() < 0.5
82
+ ? 429
83
+ : 500;
84
+ // Claude Code caches aggressively with a 1-hour TTL, so most of the context
85
+ // is a cache read and cache writes are large and occasional.
86
+ const cached = rand() < 0.75;
87
+ const cacheRead = cached ? 8_000 + Math.floor(rand() * 40_000) : 0;
88
+ const cacheWrite1h = cached && rand() < 0.3 ? 5_000 + Math.floor(rand() * 30_000) : 0;
89
+ const cacheWrite5m = !cached && rand() < 0.2 ? 500 + Math.floor(rand() * 4_000) : 0;
90
+ const inputTokens = 2 + Math.floor(rand() * 400);
91
+ const outputTokens = status === "ok" ? 20 + Math.floor(rand() * 1_500) : Math.floor(rand() * 60);
92
+ const ttfbMs = 400 + Math.floor(rand() * 2_200);
93
+ const durationMs = ttfbMs + Math.floor(rand() * rand() * 70_000);
94
+ // 2% of rows never resolved a model, which is what an unpriceable row looks
95
+ // like in production — the dashboard must show those as "n/a", not "$0".
96
+ const servedModel = rand() < 0.02 ? null : pick(MODELS);
97
+ const usage = {
98
+ inputTokens,
99
+ cacheReadTokens: cacheRead,
100
+ cacheWrite5mTokens: cacheWrite5m,
101
+ cacheWrite1hTokens: cacheWrite1h,
102
+ outputTokens,
103
+ webSearches: 0,
104
+ };
105
+ const priced = priceUsage(servedModel, usage, subscription);
106
+ // Utilisation climbs through the window, so the quota panel has both a
107
+ // comfortable developer and one close to the wall.
108
+ const util = Math.min(0.99, 0.15 + (1 - ageHours / hours) * rand() * 1.1);
109
+ records.push({
110
+ id: randomUUID(),
111
+ startedAt,
112
+ endedAt: startedAt + durationMs,
113
+ posture: credentialOrigin === "inbound_key" ? "key" : "subscription",
114
+ identityCarrier: userId === null ? "none" : "path",
115
+ callerFingerprint: userId === null ? null : `fp${(i % 7) + 1}`.padEnd(12, "0"),
116
+ userId,
117
+ tokenId: userId === null ? null : `tok-${userId}`,
118
+ credentialFingerprint: `cred${(i % 5) + 1}`.padEnd(12, "0"),
119
+ credentialOrigin,
120
+ sessionId: `sess-${Math.floor(i / 12)}`,
121
+ requestedModel: pick(MODELS),
122
+ servedModel,
123
+ upstream: "https://api.anthropic.com",
124
+ stream: true,
125
+ status,
126
+ httpStatus,
127
+ ...(status === "ok" || status === "client_abort" ? {} : { errorType: status }),
128
+ partial: status === "client_abort" || status === "stream_error",
129
+ usage,
130
+ // Priced through the REAL engine rather than with invented numbers, so
131
+ // the demo exercises the same null-vs-value behaviour production does: a
132
+ // subscription row gets `costUsd: null` with a populated notional figure,
133
+ // and the 2% of rows with no resolved model come out unpriced on both.
134
+ costUsd: priced.cost,
135
+ costBasis: priced.basis,
136
+ notionalCostUsd: priced.notionalCost,
137
+ ttfbMs: status === "identity_denied" ? null : ttfbMs,
138
+ durationMs,
139
+ bytesIn: 1_000 + Math.floor(rand() * 50_000),
140
+ bytesOut: 500 + Math.floor(rand() * 90_000),
141
+ upstreamRequestId: `req_seed_${i}`,
142
+ rateLimit: subscription
143
+ ? {
144
+ status: "allowed",
145
+ fiveHourUtilization: Number(util.toFixed(3)),
146
+ fiveHourStatus: util > 0.95 ? "rejected" : "allowed",
147
+ fiveHourResetAt: startedAt + 3_600_000,
148
+ sevenDayUtilization: Number((util * 0.3).toFixed(3)),
149
+ sevenDayStatus: "allowed",
150
+ sevenDayResetAt: startedAt + 5 * 86_400_000,
151
+ representativeClaim: "five_hour",
152
+ overageStatus: util > 0.95 ? "rejected" : "allowed",
153
+ ...(util > 0.95 ? { overageDisabledReason: "not_enabled_for_org" } : {}),
154
+ }
155
+ : null,
156
+ clientVersion: "2.1.278",
157
+ pipeline: credentialOrigin === "fallback_server" ? "substitute" : "passthrough",
158
+ routeId: credentialOrigin === "fallback_server" ? "demo-substitute" : null,
159
+ credentialsConsidered: credentialOrigin === "fallback_server"
160
+ ? [
161
+ {
162
+ source: "inbound_subscription",
163
+ result: "skipped",
164
+ reason: "a Claude subscription credential is only valid at Anthropic",
165
+ },
166
+ { source: "env:DEMO_PROVIDER_KEY", result: "used" },
167
+ ]
168
+ : [{ source: `inbound_${subscription ? "subscription" : "key"}`, result: "used" }],
169
+ });
170
+ }
171
+ // Oldest first, so rowids run in the same direction as time and the keyset
172
+ // feed reads the way it will in production.
173
+ return records.sort((a, b) => a.startedAt - b.startedAt);
174
+ }
175
+ export function seed(store, opts = {}) {
176
+ const org = ensureOrg(store);
177
+ const userIds = SEED_USERS.map((email) => ensureUser(store, { orgId: org.id, email, role: "member" }).id);
178
+ const records = generateRecords({
179
+ orgId: org.id,
180
+ userIds,
181
+ ...(opts.requests === undefined ? {} : { requests: opts.requests }),
182
+ ...(opts.hours === undefined ? {} : { hours: opts.hours }),
183
+ });
184
+ const written = createRequestWriter(store).writeBatch(org.id, records);
185
+ return { written, users: SEED_USERS };
186
+ }
187
+ /** The database `serve` uses by default. Never wiped without an explicit say-so. */
188
+ export const DEFAULT_DB_PATH = "./data/fest.db";
189
+ /**
190
+ * Is this the database that records real traffic?
191
+ *
192
+ * Path-resolved rather than string-compared, so `data/fest.db`,
193
+ * `./data/fest.db` and an absolute path all answer the same. A guard that can
194
+ * be stepped around by spelling the path differently is not a guard.
195
+ */
196
+ export function isDefaultDatabase(dbPath) {
197
+ return resolve(dbPath) === resolve(DEFAULT_DB_PATH);
198
+ }
199
+ export function existingRequestCount(store) {
200
+ const row = store.db.prepare("SELECT COUNT(*) AS n FROM requests").get();
201
+ return row.n;
202
+ }
203
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../server/store/seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,iEAAiE;AACjE,SAAS,IAAI,CAAC,IAAY;IACxB,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;IACnB,OAAO,GAAG,EAAE;QACV,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG;IACb,eAAe;IACf,iBAAiB;IACjB,2BAA2B;CACnB,CAAC;AAEX,MAAM,UAAU,GAAG,CAAC,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,CAAU,CAAC;AAYnF,MAAM,UAAU,eAAe,CAAC,IAAiB;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,CAAK,EAAgB,EAAK,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAM,CAAC;IAElF,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,wEAAwE;QACxE,wEAAwE;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,GAAG,GAAG,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC;QAE9E,mEAAmE;QACnE,sEAAsE;QACtE,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC;QACpB,MAAM,MAAM,GACV,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAEjG,MAAM,UAAU,GAAG,IAAI,EAAE,CAAC;QAC1B,MAAM,gBAAgB,GACpB,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC;QACpG,MAAM,YAAY,GAAG,gBAAgB,KAAK,sBAAsB,CAAC;QAEjE,MAAM,UAAU,GAAG,IAAI,EAAE,CAAC;QAC1B,MAAM,MAAM,GACV,UAAU,GAAG,IAAI;YACf,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,UAAU,GAAG,IAAI;gBACjB,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,UAAU,GAAG,IAAI;oBACjB,CAAC,CAAC,gBAAgB;oBAClB,CAAC,CAAC,UAAU,GAAG,IAAI;wBACjB,CAAC,CAAC,iBAAiB;wBACnB,CAAC,CAAC,cAAc,CAAC;QAE3B,MAAM,UAAU,GACd,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,cAAc;YAC1C,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,MAAM,KAAK,iBAAiB;gBAC5B,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG;oBACZ,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,GAAG,CAAC;QAEd,4EAA4E;QAC5E,6DAA6D;QAC7D,MAAM,MAAM,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,MAAM,IAAI,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,YAAY,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAEjG,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC;QAEjE,4EAA4E;QAC5E,yEAAyE;QACzE,MAAM,WAAW,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG;YACZ,WAAW;YACX,eAAe,EAAE,SAAS;YAC1B,kBAAkB,EAAE,YAAY;YAChC,kBAAkB,EAAE,YAAY;YAChC,YAAY;YACZ,WAAW,EAAE,CAAC;SACf,CAAC;QACF,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QAE5D,uEAAuE;QACvE,mDAAmD;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;QAE1E,OAAO,CAAC,IAAI,CAAC;YACX,EAAE,EAAE,UAAU,EAAE;YAChB,SAAS;YACT,OAAO,EAAE,SAAS,GAAG,UAAU;YAC/B,OAAO,EAAE,gBAAgB,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc;YACpE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YAClD,iBAAiB,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC;YAC9E,MAAM;YACN,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,MAAM,EAAE;YACjD,qBAAqB,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC;YAC3D,gBAAgB;YAChB,SAAS,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE;YACvC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC;YAC5B,WAAW;YACX,QAAQ,EAAE,2BAA2B;YACrC,MAAM,EAAE,IAAI;YACZ,MAAM;YACN,UAAU;YACV,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YAC9E,OAAO,EAAE,MAAM,KAAK,cAAc,IAAI,MAAM,KAAK,cAAc;YAC/D,KAAK;YACL,uEAAuE;YACvE,yEAAyE;YACzE,0EAA0E;YAC1E,uEAAuE;YACvE,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,SAAS,EAAE,MAAM,CAAC,KAAK;YACvB,eAAe,EAAE,MAAM,CAAC,YAAY;YACpC,MAAM,EAAE,MAAM,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;YACpD,UAAU;YACV,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC;YAC5C,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC;YAC3C,iBAAiB,EAAE,YAAY,CAAC,EAAE;YAClC,SAAS,EAAE,YAAY;gBACrB,CAAC,CAAC;oBACE,MAAM,EAAE,SAAS;oBACjB,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC5C,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;oBACpD,eAAe,EAAE,SAAS,GAAG,SAAS;oBACtC,mBAAmB,EAAE,MAAM,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACpD,cAAc,EAAE,SAAS;oBACzB,eAAe,EAAE,SAAS,GAAG,CAAC,GAAG,UAAU;oBAC3C,mBAAmB,EAAE,WAAW;oBAChC,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;oBACnD,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACzE;gBACH,CAAC,CAAC,IAAI;YACR,aAAa,EAAE,SAAS;YACxB,QAAQ,EAAE,gBAAgB,KAAK,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;YAC/E,OAAO,EAAE,gBAAgB,KAAK,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI;YAC1E,qBAAqB,EACnB,gBAAgB,KAAK,iBAAiB;gBACpC,CAAC,CAAC;oBACE;wBACE,MAAM,EAAE,sBAAsB;wBAC9B,MAAM,EAAE,SAAS;wBACjB,MAAM,EAAE,6DAA6D;qBACtE;oBACD,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,EAAE;iBACpD;gBACH,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;SACvF,CAAC,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,4CAA4C;IAC5C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;AAC3D,CAAC;AAOD,MAAM,UAAU,IAAI,CAAC,KAAY,EAAE,OAA8C,EAAE;IACjF,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAC5B,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAC1E,CAAC;IACF,MAAM,OAAO,GAAG,eAAe,CAAC;QAC9B,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,OAAO;QACP,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;KAC3D,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACvE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACxC,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAY;IAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAmB,CAAC;IAC1F,OAAO,GAAG,CAAC,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Fest identity tokens: who is this developer?
3
+ *
4
+ * This is emphatically NOT an upstream provider credential. It is never
5
+ * forwarded to Anthropic, and it cannot be carried in `ANTHROPIC_API_KEY` or
6
+ * `ANTHROPIC_AUTH_TOKEN`, because setting either makes Claude Code abandon
7
+ * subscription auth and fall back to key auth — silently moving a developer off
8
+ * their own plan onto whatever key the server holds. So the token travels in
9
+ * the URL path (`/t/<token>`) or an `X-Fest-Token` header.
10
+ *
11
+ * The raw token is shown exactly once, at creation. We store only sha256(raw)
12
+ * plus a short display prefix.
13
+ */
14
+ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
15
+ import { newId } from "./ids.js";
16
+ const TOKEN_PREFIX = "fest_";
17
+ const TOKEN_BYTES = 32;
18
+ const DISPLAY_PREFIX_CHARS = 11;
19
+ /**
20
+ * sha256, deliberately not scrypt/bcrypt.
21
+ *
22
+ * These are 32 bytes of CSPRNG output, so there is no dictionary to attack and
23
+ * nothing a slow KDF would buy — while a slow KDF would add its cost to EVERY
24
+ * proxied request, since authentication is on the hot path. User passwords,
25
+ * when they arrive, will use scrypt. Please do not "fix" this.
26
+ */
27
+ function hashToken(raw) {
28
+ return createHash("sha256").update(raw, "utf8").digest("hex");
29
+ }
30
+ export function generateToken() {
31
+ const raw = TOKEN_PREFIX + randomBytes(TOKEN_BYTES).toString("base64url");
32
+ return { raw, hash: hashToken(raw), displayPrefix: raw.slice(0, DISPLAY_PREFIX_CHARS) };
33
+ }
34
+ export function createToken(store, args) {
35
+ const { raw, hash, displayPrefix } = generateToken();
36
+ const id = newId("tok");
37
+ store.db
38
+ .prepare(`INSERT INTO identity_tokens
39
+ (id, org_id, user_id, name, token_hash, token_prefix, created_at, expires_at)
40
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
41
+ .run(id, args.orgId, args.userId, args.name ?? "", hash, displayPrefix, Date.now(), args.expiresAt ?? null);
42
+ return { id, raw, displayPrefix };
43
+ }
44
+ /**
45
+ * Resolve a presented token.
46
+ *
47
+ * Lookup is by hash against a unique index, so there is no meaningful timing
48
+ * channel on the secret itself. The `timingSafeEqual` below guards the
49
+ * comparison of the retrieved hash anyway, which costs nothing and keeps the
50
+ * property locally obvious.
51
+ *
52
+ * Returns null for unknown, revoked and expired tokens alike: the caller must
53
+ * not be able to distinguish them, since that would turn this into an oracle
54
+ * for which tokens once existed.
55
+ */
56
+ export function resolveToken(store, raw) {
57
+ if (raw === null || raw.length === 0)
58
+ return null;
59
+ const hash = hashToken(raw);
60
+ const row = store.db
61
+ .prepare(`SELECT id, org_id, user_id, token_hash, expires_at, revoked_at
62
+ FROM identity_tokens
63
+ WHERE token_hash = ?`)
64
+ .get(hash);
65
+ if (row === undefined)
66
+ return null;
67
+ const a = Buffer.from(hash, "hex");
68
+ const b = Buffer.from(row.token_hash, "hex");
69
+ if (a.length !== b.length || !timingSafeEqual(a, b))
70
+ return null;
71
+ if (row.revoked_at !== null)
72
+ return null;
73
+ if (row.expires_at !== null && row.expires_at <= Date.now())
74
+ return null;
75
+ return { tokenId: row.id, orgId: row.org_id, userId: row.user_id };
76
+ }
77
+ export function revokeToken(store, orgId, tokenId) {
78
+ const res = store.db
79
+ .prepare(`UPDATE identity_tokens SET revoked_at = ?
80
+ WHERE id = ? AND org_id = ? AND revoked_at IS NULL`)
81
+ .run(Date.now(), tokenId, orgId);
82
+ return Number(res.changes) > 0;
83
+ }
84
+ export function listTokens(store, orgId) {
85
+ const rows = store.db
86
+ .prepare(`SELECT id, user_id, name, token_prefix, created_at, last_used_at, revoked_at, expires_at
87
+ FROM identity_tokens WHERE org_id = ? ORDER BY created_at DESC`)
88
+ .all(orgId);
89
+ return rows.map((r) => ({
90
+ id: String(r["id"]),
91
+ userId: String(r["user_id"]),
92
+ name: String(r["name"] ?? ""),
93
+ displayPrefix: String(r["token_prefix"]),
94
+ createdAt: Number(r["created_at"]),
95
+ lastUsedAt: r["last_used_at"] === null ? null : Number(r["last_used_at"]),
96
+ revokedAt: r["revoked_at"] === null ? null : Number(r["revoked_at"]),
97
+ expiresAt: r["expires_at"] === null ? null : Number(r["expires_at"]),
98
+ }));
99
+ }
100
+ /**
101
+ * Coalesced `last_used_at` tracking.
102
+ *
103
+ * Updating this per request would roughly double the write volume of the whole
104
+ * system for information nobody needs to the second. Instead the caller
105
+ * records touches in memory and flushes them periodically.
106
+ */
107
+ export function createLastUsedTracker(store, flushIntervalMs = 60_000) {
108
+ const pending = new Map();
109
+ const timer = setInterval(() => flush(), flushIntervalMs);
110
+ timer.unref();
111
+ function flush() {
112
+ if (pending.size === 0)
113
+ return;
114
+ const entries = [...pending.entries()];
115
+ pending.clear();
116
+ const stmt = store.db.prepare(`UPDATE identity_tokens SET last_used_at = ? WHERE id = ?`);
117
+ store.transaction(() => {
118
+ for (const [tokenId, at] of entries)
119
+ stmt.run(at, tokenId);
120
+ });
121
+ }
122
+ return {
123
+ touch(tokenId) {
124
+ pending.set(tokenId, Date.now());
125
+ },
126
+ flush,
127
+ stop() {
128
+ clearInterval(timer);
129
+ flush();
130
+ },
131
+ };
132
+ }
133
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../../server/store/tokens.ts"],"names":[],"mappings":"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"}