@data-club/ai-hub-server 0.0.1

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 (248) hide show
  1. package/dist/auth/argon2.d.ts +72 -0
  2. package/dist/auth/argon2.d.ts.map +1 -0
  3. package/dist/auth/argon2.js +145 -0
  4. package/dist/auth/argon2.js.map +1 -0
  5. package/dist/auth/encryption.d.ts +52 -0
  6. package/dist/auth/encryption.d.ts.map +1 -0
  7. package/dist/auth/encryption.js +98 -0
  8. package/dist/auth/encryption.js.map +1 -0
  9. package/dist/auth/jwt.d.ts +133 -0
  10. package/dist/auth/jwt.d.ts.map +1 -0
  11. package/dist/auth/jwt.js +147 -0
  12. package/dist/auth/jwt.js.map +1 -0
  13. package/dist/auth/middleware.d.ts +101 -0
  14. package/dist/auth/middleware.d.ts.map +1 -0
  15. package/dist/auth/middleware.js +161 -0
  16. package/dist/auth/middleware.js.map +1 -0
  17. package/dist/auth/passwordPolicy.d.ts +72 -0
  18. package/dist/auth/passwordPolicy.d.ts.map +1 -0
  19. package/dist/auth/passwordPolicy.js +88 -0
  20. package/dist/auth/passwordPolicy.js.map +1 -0
  21. package/dist/auth/roleRules.d.ts +200 -0
  22. package/dist/auth/roleRules.d.ts.map +1 -0
  23. package/dist/auth/roleRules.js +365 -0
  24. package/dist/auth/roleRules.js.map +1 -0
  25. package/dist/auth/userView.d.ts +55 -0
  26. package/dist/auth/userView.d.ts.map +1 -0
  27. package/dist/auth/userView.js +77 -0
  28. package/dist/auth/userView.js.map +1 -0
  29. package/dist/bootstrap.d.ts +104 -0
  30. package/dist/bootstrap.d.ts.map +1 -0
  31. package/dist/bootstrap.js +160 -0
  32. package/dist/bootstrap.js.map +1 -0
  33. package/dist/db/connection.d.ts +39 -0
  34. package/dist/db/connection.d.ts.map +1 -0
  35. package/dist/db/connection.js +62 -0
  36. package/dist/db/connection.js.map +1 -0
  37. package/dist/db/migrate.d.ts +31 -0
  38. package/dist/db/migrate.d.ts.map +1 -0
  39. package/dist/db/migrate.js +197 -0
  40. package/dist/db/migrate.js.map +1 -0
  41. package/dist/db/schema.d.ts +1902 -0
  42. package/dist/db/schema.d.ts.map +1 -0
  43. package/dist/db/schema.js +662 -0
  44. package/dist/db/schema.js.map +1 -0
  45. package/dist/db/seed.d.ts +92 -0
  46. package/dist/db/seed.d.ts.map +1 -0
  47. package/dist/db/seed.js +160 -0
  48. package/dist/db/seed.js.map +1 -0
  49. package/dist/handlers/fetch.d.ts +89 -0
  50. package/dist/handlers/fetch.d.ts.map +1 -0
  51. package/dist/handlers/fetch.js +173 -0
  52. package/dist/handlers/fetch.js.map +1 -0
  53. package/dist/handlers/nextjs.d.ts +40 -0
  54. package/dist/handlers/nextjs.d.ts.map +1 -0
  55. package/dist/handlers/nextjs.js +42 -0
  56. package/dist/handlers/nextjs.js.map +1 -0
  57. package/dist/handlers/responses.d.ts +46 -0
  58. package/dist/handlers/responses.d.ts.map +1 -0
  59. package/dist/handlers/responses.js +74 -0
  60. package/dist/handlers/responses.js.map +1 -0
  61. package/dist/handlers/routeTable.d.ts +21 -0
  62. package/dist/handlers/routeTable.d.ts.map +1 -0
  63. package/dist/handlers/routeTable.js +133 -0
  64. package/dist/handlers/routeTable.js.map +1 -0
  65. package/dist/handlers/router.d.ts +37 -0
  66. package/dist/handlers/router.d.ts.map +1 -0
  67. package/dist/handlers/router.js +82 -0
  68. package/dist/handlers/router.js.map +1 -0
  69. package/dist/handlers/sse.d.ts +38 -0
  70. package/dist/handlers/sse.d.ts.map +1 -0
  71. package/dist/handlers/sse.js +52 -0
  72. package/dist/handlers/sse.js.map +1 -0
  73. package/dist/handlers/types.d.ts +96 -0
  74. package/dist/handlers/types.d.ts.map +1 -0
  75. package/dist/handlers/types.js +14 -0
  76. package/dist/handlers/types.js.map +1 -0
  77. package/dist/index.d.ts +25 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +24 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/letta/client.d.ts +355 -0
  82. package/dist/letta/client.d.ts.map +1 -0
  83. package/dist/letta/client.js +529 -0
  84. package/dist/letta/client.js.map +1 -0
  85. package/dist/letta/eventTranslator.d.ts +166 -0
  86. package/dist/letta/eventTranslator.d.ts.map +1 -0
  87. package/dist/letta/eventTranslator.js +532 -0
  88. package/dist/letta/eventTranslator.js.map +1 -0
  89. package/dist/letta/index.d.ts +13 -0
  90. package/dist/letta/index.d.ts.map +1 -0
  91. package/dist/letta/index.js +12 -0
  92. package/dist/letta/index.js.map +1 -0
  93. package/dist/letta/modelSettings.d.ts +176 -0
  94. package/dist/letta/modelSettings.d.ts.map +1 -0
  95. package/dist/letta/modelSettings.js +314 -0
  96. package/dist/letta/modelSettings.js.map +1 -0
  97. package/dist/letta/promptWrapping.d.ts +141 -0
  98. package/dist/letta/promptWrapping.d.ts.map +1 -0
  99. package/dist/letta/promptWrapping.js +213 -0
  100. package/dist/letta/promptWrapping.js.map +1 -0
  101. package/dist/letta/sandbox.d.ts +100 -0
  102. package/dist/letta/sandbox.d.ts.map +1 -0
  103. package/dist/letta/sandbox.js +151 -0
  104. package/dist/letta/sandbox.js.map +1 -0
  105. package/dist/letta/settingsFileSeed.d.ts +146 -0
  106. package/dist/letta/settingsFileSeed.d.ts.map +1 -0
  107. package/dist/letta/settingsFileSeed.js +177 -0
  108. package/dist/letta/settingsFileSeed.js.map +1 -0
  109. package/dist/letta/subprocessThrottle.d.ts +151 -0
  110. package/dist/letta/subprocessThrottle.d.ts.map +1 -0
  111. package/dist/letta/subprocessThrottle.js +195 -0
  112. package/dist/letta/subprocessThrottle.js.map +1 -0
  113. package/dist/letta/tpmRecovery.d.ts +202 -0
  114. package/dist/letta/tpmRecovery.d.ts.map +1 -0
  115. package/dist/letta/tpmRecovery.js +314 -0
  116. package/dist/letta/tpmRecovery.js.map +1 -0
  117. package/dist/letta/types.d.ts +54 -0
  118. package/dist/letta/types.d.ts.map +1 -0
  119. package/dist/letta/types.js +16 -0
  120. package/dist/letta/types.js.map +1 -0
  121. package/dist/observability/logger.d.ts +48 -0
  122. package/dist/observability/logger.d.ts.map +1 -0
  123. package/dist/observability/logger.js +81 -0
  124. package/dist/observability/logger.js.map +1 -0
  125. package/dist/observability/metrics.d.ts +53 -0
  126. package/dist/observability/metrics.d.ts.map +1 -0
  127. package/dist/observability/metrics.js +92 -0
  128. package/dist/observability/metrics.js.map +1 -0
  129. package/dist/routes/admin/agents.d.ts +63 -0
  130. package/dist/routes/admin/agents.d.ts.map +1 -0
  131. package/dist/routes/admin/agents.js +461 -0
  132. package/dist/routes/admin/agents.js.map +1 -0
  133. package/dist/routes/admin/rotatingMessages.d.ts +51 -0
  134. package/dist/routes/admin/rotatingMessages.d.ts.map +1 -0
  135. package/dist/routes/admin/rotatingMessages.js +292 -0
  136. package/dist/routes/admin/rotatingMessages.js.map +1 -0
  137. package/dist/routes/admin/sessions.d.ts +61 -0
  138. package/dist/routes/admin/sessions.d.ts.map +1 -0
  139. package/dist/routes/admin/sessions.js +232 -0
  140. package/dist/routes/admin/sessions.js.map +1 -0
  141. package/dist/routes/admin/settings.d.ts +110 -0
  142. package/dist/routes/admin/settings.d.ts.map +1 -0
  143. package/dist/routes/admin/settings.js +401 -0
  144. package/dist/routes/admin/settings.js.map +1 -0
  145. package/dist/routes/admin/users.d.ts +115 -0
  146. package/dist/routes/admin/users.d.ts.map +1 -0
  147. package/dist/routes/admin/users.js +374 -0
  148. package/dist/routes/admin/users.js.map +1 -0
  149. package/dist/routes/agents.d.ts +30 -0
  150. package/dist/routes/agents.d.ts.map +1 -0
  151. package/dist/routes/agents.js +55 -0
  152. package/dist/routes/agents.js.map +1 -0
  153. package/dist/routes/auth.d.ts +121 -0
  154. package/dist/routes/auth.d.ts.map +1 -0
  155. package/dist/routes/auth.js +422 -0
  156. package/dist/routes/auth.js.map +1 -0
  157. package/dist/routes/chat.d.ts +97 -0
  158. package/dist/routes/chat.d.ts.map +1 -0
  159. package/dist/routes/chat.js +484 -0
  160. package/dist/routes/chat.js.map +1 -0
  161. package/dist/routes/featureToggles.d.ts +34 -0
  162. package/dist/routes/featureToggles.d.ts.map +1 -0
  163. package/dist/routes/featureToggles.js +47 -0
  164. package/dist/routes/featureToggles.js.map +1 -0
  165. package/dist/routes/health.d.ts +24 -0
  166. package/dist/routes/health.d.ts.map +1 -0
  167. package/dist/routes/health.js +37 -0
  168. package/dist/routes/health.js.map +1 -0
  169. package/dist/routes/metrics.d.ts +35 -0
  170. package/dist/routes/metrics.d.ts.map +1 -0
  171. package/dist/routes/metrics.js +106 -0
  172. package/dist/routes/metrics.js.map +1 -0
  173. package/dist/routes/sessions.d.ts +161 -0
  174. package/dist/routes/sessions.d.ts.map +1 -0
  175. package/dist/routes/sessions.js +1501 -0
  176. package/dist/routes/sessions.js.map +1 -0
  177. package/dist/routes/stubs.d.ts +25 -0
  178. package/dist/routes/stubs.d.ts.map +1 -0
  179. package/dist/routes/stubs.js +25 -0
  180. package/dist/routes/stubs.js.map +1 -0
  181. package/dist/state/cron.d.ts +58 -0
  182. package/dist/state/cron.d.ts.map +1 -0
  183. package/dist/state/cron.js +160 -0
  184. package/dist/state/cron.js.map +1 -0
  185. package/dist/state/rotationRunner.d.ts +96 -0
  186. package/dist/state/rotationRunner.d.ts.map +1 -0
  187. package/dist/state/rotationRunner.js +246 -0
  188. package/dist/state/rotationRunner.js.map +1 -0
  189. package/dist/state/rotationScheduler.d.ts +76 -0
  190. package/dist/state/rotationScheduler.d.ts.map +1 -0
  191. package/dist/state/rotationScheduler.js +124 -0
  192. package/dist/state/rotationScheduler.js.map +1 -0
  193. package/dist/state/turnRegistry.d.ts +95 -0
  194. package/dist/state/turnRegistry.d.ts.map +1 -0
  195. package/dist/state/turnRegistry.js +149 -0
  196. package/dist/state/turnRegistry.js.map +1 -0
  197. package/dist/state/turnRunner.d.ts +134 -0
  198. package/dist/state/turnRunner.d.ts.map +1 -0
  199. package/dist/state/turnRunner.js +476 -0
  200. package/dist/state/turnRunner.js.map +1 -0
  201. package/package.json +47 -0
  202. package/src/auth/argon2.ts +152 -0
  203. package/src/auth/encryption.ts +110 -0
  204. package/src/auth/jwt.ts +217 -0
  205. package/src/auth/middleware.ts +250 -0
  206. package/src/auth/passwordPolicy.ts +99 -0
  207. package/src/auth/roleRules.ts +497 -0
  208. package/src/auth/userView.ts +88 -0
  209. package/src/bootstrap.ts +254 -0
  210. package/src/db/connection.ts +75 -0
  211. package/src/db/migrate.ts +212 -0
  212. package/src/db/schema.ts +750 -0
  213. package/src/db/seed.ts +236 -0
  214. package/src/handlers/fetch.ts +251 -0
  215. package/src/handlers/nextjs.ts +49 -0
  216. package/src/handlers/responses.ts +95 -0
  217. package/src/handlers/routeTable.ts +188 -0
  218. package/src/handlers/router.ts +96 -0
  219. package/src/handlers/sse.ts +55 -0
  220. package/src/handlers/types.ts +104 -0
  221. package/src/index.ts +60 -0
  222. package/src/letta/client.ts +860 -0
  223. package/src/letta/eventTranslator.ts +667 -0
  224. package/src/letta/index.ts +46 -0
  225. package/src/letta/lettaCliShim.mjs +40 -0
  226. package/src/letta/sandbox.ts +167 -0
  227. package/src/letta/settingsFileSeed.ts +254 -0
  228. package/src/letta/subprocessThrottle.ts +251 -0
  229. package/src/letta/types.ts +65 -0
  230. package/src/observability/logger.ts +103 -0
  231. package/src/observability/metrics.ts +114 -0
  232. package/src/routes/admin/agents.ts +574 -0
  233. package/src/routes/admin/rotatingMessages.ts +351 -0
  234. package/src/routes/admin/sessions.ts +283 -0
  235. package/src/routes/admin/settings.ts +463 -0
  236. package/src/routes/admin/users.ts +455 -0
  237. package/src/routes/agents.ts +66 -0
  238. package/src/routes/auth.ts +513 -0
  239. package/src/routes/chat.ts +534 -0
  240. package/src/routes/featureToggles.ts +52 -0
  241. package/src/routes/health.ts +44 -0
  242. package/src/routes/metrics.ts +111 -0
  243. package/src/routes/sessions.ts +1878 -0
  244. package/src/state/cron.ts +179 -0
  245. package/src/state/rotationRunner.ts +326 -0
  246. package/src/state/rotationScheduler.ts +164 -0
  247. package/src/state/turnRegistry.ts +210 -0
  248. package/src/state/turnRunner.ts +588 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * First-boot seed.
3
+ *
4
+ * Two responsibilities, both idempotent:
5
+ *
6
+ * 1. **Super-admin seed (§8.5).** If the `user` table is empty, insert
7
+ * `username = "DataClub"`, `password_hash = argon2id("admin")`,
8
+ * `role = "super_admin"`, `is_initial_password = true`. Hardcoded
9
+ * credentials by design — the operator changes them on first login (the
10
+ * flag enforces it).
11
+ *
12
+ * 2. **Admin-setting bootstrap (§6.7 / §6.10 / §12.1).** If the singleton
13
+ * `admin_setting` row doesn't exist, create it with theme defaults
14
+ * (`theme_switcher_enabled = true`, `theme_default = "light"` per §7.6),
15
+ * seed `service_token_signing_key` from env `SERVICE_TOKEN_SIGNING_KEY`
16
+ * if set else random, seed `metrics_scrape_token` from env
17
+ * `METRICS_SCRAPE_TOKEN` if set else random, encrypt and store the env
18
+ * `LETTA_API_KEY`, and write `letta_base_url` / `letta_ade_url`. After
19
+ * first boot the env vars for the signing key + metrics token are no
20
+ * longer consulted — DB columns are authoritative.
21
+ *
22
+ * Both run inside a single SQLite transaction so a partial failure can't
23
+ * leave a half-seeded DB. Idempotency is enforced by the row-existence
24
+ * checks at the top of each branch.
25
+ *
26
+ * @see SPECIFICATIONS.md §8.5 — initial super admin seed
27
+ * @see SPECIFICATIONS.md §6.7 — single signing key
28
+ * @see SPECIFICATIONS.md §6.10 — observability / metrics token
29
+ * @see SPECIFICATIONS.md §12.1 — env-var semantics
30
+ */
31
+ import type { Logger } from "../observability/logger.js";
32
+ import type { DbHandle } from "./connection.js";
33
+ /** Seeded super-admin username — see §8.5. */
34
+ export declare const SUPER_ADMIN_SEED_USERNAME = "DataClub";
35
+ /** Seeded super-admin password — see §8.5. Operator changes on first login. */
36
+ export declare const SUPER_ADMIN_SEED_PASSWORD = "admin";
37
+ /**
38
+ * Inputs the seed needs from the env (or a test harness). Kept as an explicit
39
+ * record so callers don't pass `process.env` directly through the seed —
40
+ * test harnesses can synthesize the exact shape they want without monkeying
41
+ * with the real environment.
42
+ */
43
+ export interface SeedInputs {
44
+ /** Required — the AES-256 encryption key (parsed). */
45
+ encryptionKey: Buffer;
46
+ /** Optional bootstrap-only signing key. Random when undefined (§6.7). */
47
+ signingKeyFromEnv?: Buffer | undefined;
48
+ /** Optional bootstrap-only metrics token. Random when undefined (§6.10). */
49
+ metricsScrapeTokenFromEnv?: string | undefined;
50
+ /**
51
+ * @deprecated Kept on the interface so existing callers compile, but
52
+ * **no longer seeded into the DB**. The Letta API key is read at runtime
53
+ * from `admin_setting.letta_api_key_encrypted` with a fallback to
54
+ * `env.LETTA_API_KEY` when the column is empty/whitespace
55
+ * (`letta/client.ts:getSdk`). Letting env stay authoritative until a
56
+ * super-admin overrides it via the admin panel is the precedence
57
+ * documented in env-vars.md. v2 will drop this field.
58
+ */
59
+ lettaApiKey?: string | undefined;
60
+ /** Required — Letta base URL written into the row. */
61
+ lettaBaseUrl?: string | undefined;
62
+ /** Optional super-admin override for the ADE link target. */
63
+ lettaAdeUrl?: string | undefined;
64
+ }
65
+ /**
66
+ * What the seed actually wrote, so the caller can log first-boot specifics
67
+ * (e.g. "metrics scrape token: <random>" exactly once on stdout).
68
+ */
69
+ export interface SeedReport {
70
+ /** `true` if the super-admin row was created on this boot. */
71
+ seededSuperAdmin: boolean;
72
+ /** `true` if the `admin_setting` row was created on this boot. */
73
+ seededAdminSetting: boolean;
74
+ /**
75
+ * If `seededAdminSetting && metricsScrapeTokenFromEnv was undefined`, this
76
+ * is the random token that was generated. The dev runner logs it once on
77
+ * stdout for the operator to copy. `null` otherwise.
78
+ */
79
+ randomMetricsScrapeToken: string | null;
80
+ }
81
+ /**
82
+ * Runs both seed branches in a single transaction. Idempotent — running on
83
+ * an already-seeded DB is a no-op (returns a report with both booleans
84
+ * `false` and `randomMetricsScrapeToken` null).
85
+ *
86
+ * @param handle - the DB handle.
87
+ * @param inputs - bootstrap-only env values.
88
+ * @param logger - pino logger for the once-on-first-boot notices (§6.10).
89
+ * @returns what was actually seeded.
90
+ */
91
+ export declare function runFirstBootSeed(handle: DbHandle, inputs: SeedInputs, logger: Logger): Promise<SeedReport>;
92
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/db/seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAOhD,8CAA8C;AAC9C,eAAO,MAAM,yBAAyB,aAAa,CAAC;AAEpD,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,UAAU,CAAC;AAMjD;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,4EAA4E;IAC5E,yBAAyB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,8DAA8D;IAC9D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kEAAkE;IAClE,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAMD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CA0GrB"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * First-boot seed.
3
+ *
4
+ * Two responsibilities, both idempotent:
5
+ *
6
+ * 1. **Super-admin seed (§8.5).** If the `user` table is empty, insert
7
+ * `username = "DataClub"`, `password_hash = argon2id("admin")`,
8
+ * `role = "super_admin"`, `is_initial_password = true`. Hardcoded
9
+ * credentials by design — the operator changes them on first login (the
10
+ * flag enforces it).
11
+ *
12
+ * 2. **Admin-setting bootstrap (§6.7 / §6.10 / §12.1).** If the singleton
13
+ * `admin_setting` row doesn't exist, create it with theme defaults
14
+ * (`theme_switcher_enabled = true`, `theme_default = "light"` per §7.6),
15
+ * seed `service_token_signing_key` from env `SERVICE_TOKEN_SIGNING_KEY`
16
+ * if set else random, seed `metrics_scrape_token` from env
17
+ * `METRICS_SCRAPE_TOKEN` if set else random, encrypt and store the env
18
+ * `LETTA_API_KEY`, and write `letta_base_url` / `letta_ade_url`. After
19
+ * first boot the env vars for the signing key + metrics token are no
20
+ * longer consulted — DB columns are authoritative.
21
+ *
22
+ * Both run inside a single SQLite transaction so a partial failure can't
23
+ * leave a half-seeded DB. Idempotency is enforced by the row-existence
24
+ * checks at the top of each branch.
25
+ *
26
+ * @see SPECIFICATIONS.md §8.5 — initial super admin seed
27
+ * @see SPECIFICATIONS.md §6.7 — single signing key
28
+ * @see SPECIFICATIONS.md §6.10 — observability / metrics token
29
+ * @see SPECIFICATIONS.md §12.1 — env-var semantics
30
+ */
31
+ import { randomBytes, randomUUID } from "node:crypto";
32
+ import { hashPassword } from "../auth/argon2.js";
33
+ import { adminSetting, user } from "./schema.js";
34
+ /* ────────────────────────────────────────────────────────────────────────── */
35
+ /* Hardcoded super-admin credentials (§8.5) */
36
+ /* ────────────────────────────────────────────────────────────────────────── */
37
+ /** Seeded super-admin username — see §8.5. */
38
+ export const SUPER_ADMIN_SEED_USERNAME = "DataClub";
39
+ /** Seeded super-admin password — see §8.5. Operator changes on first login. */
40
+ export const SUPER_ADMIN_SEED_PASSWORD = "admin";
41
+ /* ────────────────────────────────────────────────────────────────────────── */
42
+ /* Seed entrypoint */
43
+ /* ────────────────────────────────────────────────────────────────────────── */
44
+ /**
45
+ * Runs both seed branches in a single transaction. Idempotent — running on
46
+ * an already-seeded DB is a no-op (returns a report with both booleans
47
+ * `false` and `randomMetricsScrapeToken` null).
48
+ *
49
+ * @param handle - the DB handle.
50
+ * @param inputs - bootstrap-only env values.
51
+ * @param logger - pino logger for the once-on-first-boot notices (§6.10).
52
+ * @returns what was actually seeded.
53
+ */
54
+ export async function runFirstBootSeed(handle, inputs, logger) {
55
+ const report = {
56
+ seededSuperAdmin: false,
57
+ seededAdminSetting: false,
58
+ randomMetricsScrapeToken: null,
59
+ };
60
+ // Compute the password hash + encryption outside the transaction (Argon2
61
+ // is async; better-sqlite3 transactions are sync).
62
+ const userCount = handle.raw
63
+ .prepare("SELECT COUNT(*) as c FROM user")
64
+ .get();
65
+ const adminCount = handle.raw
66
+ .prepare("SELECT COUNT(*) as c FROM admin_setting")
67
+ .get();
68
+ let superAdminInsert = null;
69
+ if (userCount.c === 0) {
70
+ const passwordHash = await hashPassword(SUPER_ADMIN_SEED_PASSWORD);
71
+ superAdminInsert = {
72
+ id: randomUUID(),
73
+ username: SUPER_ADMIN_SEED_USERNAME,
74
+ passwordHash,
75
+ identitySource: "local",
76
+ isInitialPassword: true,
77
+ role: "super_admin",
78
+ };
79
+ }
80
+ let adminInsert = null;
81
+ if (adminCount.c === 0) {
82
+ const signingKey = inputs.signingKeyFromEnv ?? randomBytes(64);
83
+ let metricsToken;
84
+ if (inputs.metricsScrapeTokenFromEnv) {
85
+ metricsToken = inputs.metricsScrapeTokenFromEnv;
86
+ }
87
+ else {
88
+ metricsToken = randomBytes(32).toString("hex");
89
+ report.randomMetricsScrapeToken = metricsToken;
90
+ }
91
+ // **Deliberately left NULL.** `LETTA_API_KEY` is consulted at runtime
92
+ // as a fallback when this column is empty or whitespace (see
93
+ // `letta/client.ts:getSdk`). Seeding it into the DB on first boot would
94
+ // freeze the env value into the admin_setting row, after which
95
+ // changing `.env` + restart would silently have no effect — that was
96
+ // the rotation footgun before 2026-05. Leaving the column NULL by
97
+ // default means env stays authoritative until a super-admin explicitly
98
+ // PATCHes a value via /admin/settings; clearing the value there falls
99
+ // back to env again. See docs/operations/env-vars.md for the full
100
+ // precedence model.
101
+ const lettaApiKeyEncrypted = null;
102
+ adminInsert = {
103
+ id: 1,
104
+ lettaApiKeyEncrypted,
105
+ lettaBaseUrl: inputs.lettaBaseUrl ?? null,
106
+ lettaAdeUrl: inputs.lettaAdeUrl ?? deriveLettaAdeUrl(inputs.lettaBaseUrl),
107
+ featureToggles: {},
108
+ themeSwitcherEnabled: true,
109
+ themeDefault: "light",
110
+ serviceTokenSigningKey: signingKey,
111
+ metricsScrapeToken: metricsToken,
112
+ };
113
+ }
114
+ if (!superAdminInsert && !adminInsert) {
115
+ return report;
116
+ }
117
+ const tx = handle.raw.transaction(() => {
118
+ if (superAdminInsert) {
119
+ handle.db.insert(user).values(superAdminInsert).run();
120
+ report.seededSuperAdmin = true;
121
+ }
122
+ if (adminInsert) {
123
+ handle.db.insert(adminSetting).values(adminInsert).run();
124
+ report.seededAdminSetting = true;
125
+ }
126
+ });
127
+ tx();
128
+ if (report.seededSuperAdmin) {
129
+ logger.info({
130
+ username: SUPER_ADMIN_SEED_USERNAME,
131
+ is_initial_password: true,
132
+ }, "Seeded initial super-admin user (change the password immediately on first login).");
133
+ }
134
+ if (report.randomMetricsScrapeToken) {
135
+ // Per §6.10: log the random metrics token once on stdout so the operator
136
+ // can copy it into their Prometheus / Alloy config. We embed the value
137
+ // in the message string rather than as a structured field because the
138
+ // generic pino-redaction policy (§13.3) censors token-shaped keys — and
139
+ // here, this is the one place where we _do_ want the operator to see it.
140
+ // Subsequent reads (`GET /admin/settings`, request logs) never expose it
141
+ // because it stays out of the structured field list. Operators rotate via
142
+ // `/admin/settings/rotate-metrics-token`; only the rotation response
143
+ // re-reveals the new value.
144
+ logger.info({ event: "first_boot_metrics_token_generated" }, `Generated random METRICS_SCRAPE_TOKEN: ${report.randomMetricsScrapeToken} — copy this into your Prometheus / Alloy scrape config.`);
145
+ }
146
+ return report;
147
+ }
148
+ /**
149
+ * Derives `letta_ade_url` from `letta_base_url` by stripping a trailing
150
+ * `/v1` per §12.1. Returns `null` if the base url is itself null.
151
+ *
152
+ * @param baseUrl - the configured Letta base URL.
153
+ * @returns the ADE URL or `null`.
154
+ */
155
+ function deriveLettaAdeUrl(baseUrl) {
156
+ if (!baseUrl)
157
+ return null;
158
+ return baseUrl.replace(/\/v1\/?$/, "");
159
+ }
160
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/db/seed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Canonical entry point: `createFetchHandler({...})`.
3
+ *
4
+ * Every per-customer wrapper mounts this through one of the adapters. The
5
+ * Next.js App Router adapter (`createNextRouteHandler`) is the first-class
6
+ * one (§6.2); the bare `createFetchHandler` is what `node:http` /
7
+ * `Bun.serve` / Cloudflare Workers / etc. wrap directly with a 5-line
8
+ * adapter on the user's side.
9
+ *
10
+ * The handler:
11
+ *
12
+ * 1. Peels `basePath` off the URL.
13
+ * 2. Runs the matcher against the route table.
14
+ * 3. Invokes the matched handler with `(req, ctx)` and a unique
15
+ * `request_id` propagated through the per-request child logger.
16
+ * 4. Catches any thrown error, logs it, returns a generic 500.
17
+ *
18
+ * No auth check happens here — that's the role-enforcement middleware's
19
+ * job, and it lives inside individual handlers (or, in Step 3+, behind a
20
+ * `protected()` wrapper). Step 2's `POST /auth/login` does not require auth.
21
+ *
22
+ * @see SPECIFICATIONS.md §6.2 — Web-Standard Fetch handlers
23
+ */
24
+ import type Database from "better-sqlite3";
25
+ import type { DrizzleDB } from "../db/connection.js";
26
+ import { type LettaClient } from "../letta/client.js";
27
+ import { SubprocessThrottle } from "../letta/subprocessThrottle.js";
28
+ import type { Logger } from "../observability/logger.js";
29
+ import type { RouteEntry } from "./types.js";
30
+ /**
31
+ * Dependency bundle accepted by `createFetchHandler`. The fetch entry point
32
+ * stays decoupled from process bootstrap (env loading, DB opening,
33
+ * migrations) so tests can pass a tmp DB + a captured logger directly.
34
+ */
35
+ export interface CreateFetchHandlerOptions {
36
+ /** Drizzle client. */
37
+ db: DrizzleDB;
38
+ /** Raw better-sqlite3 handle (used for `transaction()` and PRAGMAs). */
39
+ sqlite: Database.Database;
40
+ /** Pino logger with redaction wired. */
41
+ logger: Logger;
42
+ /** Parsed `AI_HUB_ENCRYPTION_KEY`. */
43
+ encryptionKey: Buffer;
44
+ /** Route prefix. Default `/api/ai-hub`. */
45
+ basePath?: string;
46
+ /**
47
+ * Override the route table (tests inject a stub table to assert matcher
48
+ * behavior in isolation). Defaults to `buildRouteTable()`.
49
+ */
50
+ routes?: ReadonlyArray<RouteEntry>;
51
+ /**
52
+ * Project-shaped Letta client. Tests pass a mock so they never call
53
+ * out to a real Letta. When omitted, the default reads
54
+ * `admin_setting.letta_base_url` + decrypted API key on each use and
55
+ * memoizes one SDK instance per `(apiKey, baseURL)` pair.
56
+ *
57
+ * @see SPECIFICATIONS.md §6.4
58
+ */
59
+ lettaClient?: LettaClient;
60
+ /**
61
+ * Throttle gating Letta Code subprocess spawns. Tests inject a configured
62
+ * instance (e.g. with a fixed `MemReader` returning low MemAvailable to
63
+ * drive the 503 overload path). Defaults to a fresh `SubprocessThrottle`
64
+ * with config from env (`AI_HUB_SUBPROCESS_RAM_THRESHOLD_PCT`,
65
+ * `AI_HUB_SUBPROCESS_HARD_CAP`) reading `/proc/meminfo`.
66
+ *
67
+ * @see ../letta/subprocessThrottle.ts
68
+ */
69
+ subprocessThrottle?: SubprocessThrottle;
70
+ /**
71
+ * Env-var source for runtime fallbacks (currently: the Letta API key
72
+ * when the DB column is empty — see `letta/client.ts:resolveApiKey`).
73
+ * Defaults to `process.env`. Tests pass the synthesized record they
74
+ * boot with so the env-fallback behavior is exercisable.
75
+ */
76
+ envSource?: Record<string, string | undefined>;
77
+ }
78
+ /**
79
+ * The exposed Fetch handler — `(Request) => Promise<Response>`.
80
+ */
81
+ export type FetchHandler = (req: Request) => Promise<Response>;
82
+ /**
83
+ * Builds a Fetch handler from the given dependencies.
84
+ *
85
+ * @param opts - DB, logger, encryption key, etc.
86
+ * @returns the per-instance Fetch handler.
87
+ */
88
+ export declare function createFetchHandler(opts: CreateFetchHandlerOptions): FetchHandler;
89
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/handlers/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAEL,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAMzD,OAAO,KAAK,EAAsB,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjE;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,sBAAsB;IACtB,EAAE,EAAE,SAAS,CAAC;IACd,wEAAwE;IACxE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC1B,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACnC;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,yBAAyB,GAC9B,YAAY,CA6Ed"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Canonical entry point: `createFetchHandler({...})`.
3
+ *
4
+ * Every per-customer wrapper mounts this through one of the adapters. The
5
+ * Next.js App Router adapter (`createNextRouteHandler`) is the first-class
6
+ * one (§6.2); the bare `createFetchHandler` is what `node:http` /
7
+ * `Bun.serve` / Cloudflare Workers / etc. wrap directly with a 5-line
8
+ * adapter on the user's side.
9
+ *
10
+ * The handler:
11
+ *
12
+ * 1. Peels `basePath` off the URL.
13
+ * 2. Runs the matcher against the route table.
14
+ * 3. Invokes the matched handler with `(req, ctx)` and a unique
15
+ * `request_id` propagated through the per-request child logger.
16
+ * 4. Catches any thrown error, logs it, returns a generic 500.
17
+ *
18
+ * No auth check happens here — that's the role-enforcement middleware's
19
+ * job, and it lives inside individual handlers (or, in Step 3+, behind a
20
+ * `protected()` wrapper). Step 2's `POST /auth/login` does not require auth.
21
+ *
22
+ * @see SPECIFICATIONS.md §6.2 — Web-Standard Fetch handlers
23
+ */
24
+ import { randomUUID } from "node:crypto";
25
+ import { createDefaultLettaClient, } from "../letta/client.js";
26
+ import { resolveFilesDir } from "../letta/sandbox.js";
27
+ import { readThrottleConfigFromEnv, SubprocessThrottle, } from "../letta/subprocessThrottle.js";
28
+ import { ensureRotationScheduler } from "../state/rotationScheduler.js";
29
+ import { buildRouteTable } from "./routeTable.js";
30
+ import { matchRoute } from "./router.js";
31
+ import { internalError, methodNotAllowed, notFound } from "./responses.js";
32
+ /**
33
+ * Builds a Fetch handler from the given dependencies.
34
+ *
35
+ * @param opts - DB, logger, encryption key, etc.
36
+ * @returns the per-instance Fetch handler.
37
+ */
38
+ export function createFetchHandler(opts) {
39
+ const subprocessThrottle = opts.subprocessThrottle ?? new SubprocessThrottle(readThrottleConfigFromEnv());
40
+ const envSource = opts.envSource ?? process.env;
41
+ // Step-12.5 — resolve the per-session sandbox + seed base directory.
42
+ // Creates `seeds/` + `sandboxes/` under the resolved path if missing
43
+ // (idempotent), so the admin agents validator + POST /sessions don't
44
+ // need to mkdir on the fly.
45
+ const filesDir = resolveFilesDir(envSource);
46
+ const ctx = {
47
+ db: opts.db,
48
+ sqlite: opts.sqlite,
49
+ logger: opts.logger,
50
+ encryptionKey: opts.encryptionKey,
51
+ basePath: normalizeBasePath(opts.basePath ?? "/api/ai-hub"),
52
+ lettaClient: opts.lettaClient ??
53
+ createDefaultLettaClient({
54
+ db: opts.db,
55
+ encryptionKey: opts.encryptionKey,
56
+ subprocessThrottle,
57
+ envSource,
58
+ }),
59
+ subprocessThrottle,
60
+ envSource,
61
+ filesDir,
62
+ };
63
+ // Start the rotating-message scheduler once per process. Idempotent + a
64
+ // no-op under tests / when `AI_HUB_DISABLE_ROTATION_SCHEDULER=1` (see
65
+ // `ensureRotationScheduler`), so building multiple handlers — or booting
66
+ // the server in vitest — never spawns competing loops.
67
+ ensureRotationScheduler({ db: ctx.db, lettaClient: ctx.lettaClient, logger: ctx.logger }, envSource);
68
+ const routes = opts.routes ?? buildRouteTable();
69
+ return async (req) => {
70
+ const requestId = req.headers.get("x-request-id") ?? randomUUID();
71
+ const childLogger = ctx.logger.child({ request_id: requestId });
72
+ const childCtx = { ...ctx, logger: childLogger };
73
+ const url = new URL(req.url);
74
+ const innerPath = stripBasePath(url.pathname, ctx.basePath);
75
+ if (innerPath === null) {
76
+ // Path is outside the basePath — the wrapper shouldn't have routed it
77
+ // here, but if it did we 404 cleanly rather than bubbling an
78
+ // ambiguous response.
79
+ return notFound();
80
+ }
81
+ const method = req.method.toUpperCase();
82
+ const match = matchRoute(routes, method, innerPath);
83
+ if (!match) {
84
+ // Distinguish "path doesn't exist" from "path exists, wrong method"
85
+ // — the React client treats them differently. We do the second-pass
86
+ // check by trying the wildcard method.
87
+ const anyMethod = matchRoute(routes, "*", innerPath);
88
+ if (anyMethod)
89
+ return methodNotAllowed();
90
+ // Also check whether the same path exists for *any* method.
91
+ const samePath = routes.find((r) => pathMatchesRaw(r.path, innerPath));
92
+ return samePath ? methodNotAllowed() : notFound();
93
+ }
94
+ try {
95
+ return await match.entry.handler(req, childCtx, match.params);
96
+ }
97
+ catch (err) {
98
+ childLogger.error({ err: err instanceof Error ? err.message : String(err), method, path: innerPath }, "Unhandled error in route handler.");
99
+ return internalError();
100
+ }
101
+ };
102
+ }
103
+ /* ────────────────────────────────────────────────────────────────────────── */
104
+ /* Helpers */
105
+ /* ────────────────────────────────────────────────────────────────────────── */
106
+ /**
107
+ * Trims trailing slashes off `basePath` and ensures it begins with one.
108
+ *
109
+ * @param raw - the user-supplied base path.
110
+ * @returns the normalized base path (e.g. `"/api/ai-hub"`).
111
+ */
112
+ function normalizeBasePath(raw) {
113
+ if (!raw)
114
+ return "";
115
+ let out = raw;
116
+ if (!out.startsWith("/"))
117
+ out = "/" + out;
118
+ while (out.length > 1 && out.endsWith("/"))
119
+ out = out.slice(0, -1);
120
+ return out;
121
+ }
122
+ /**
123
+ * Returns `pathname` with `basePath` peeled off, or `null` if `pathname` is
124
+ * not under the prefix. An empty `basePath` returns `pathname` unchanged.
125
+ *
126
+ * @param pathname - request URL pathname.
127
+ * @param basePath - the configured prefix.
128
+ * @returns the inner path or `null`.
129
+ */
130
+ function stripBasePath(pathname, basePath) {
131
+ if (basePath === "" || basePath === "/")
132
+ return pathname;
133
+ if (pathname === basePath)
134
+ return "/";
135
+ if (pathname.startsWith(basePath + "/")) {
136
+ return pathname.slice(basePath.length);
137
+ }
138
+ return null;
139
+ }
140
+ /**
141
+ * Cheap "does this template match this path at all" predicate used for the
142
+ * 405-vs-404 disambiguation. Doesn't return params (that already happened
143
+ * in the main match).
144
+ *
145
+ * @param template - the route template.
146
+ * @param pathname - the actual path.
147
+ * @returns `true` when the template's segments match the path's.
148
+ */
149
+ function pathMatchesRaw(template, pathname) {
150
+ const tplParts = trimSlashes(template).split("/");
151
+ const pathParts = trimSlashes(pathname).split("/");
152
+ if (tplParts.length !== pathParts.length)
153
+ return false;
154
+ for (let i = 0; i < tplParts.length; i++) {
155
+ const tp = tplParts[i];
156
+ const pp = pathParts[i];
157
+ if (tp.startsWith(":"))
158
+ continue;
159
+ if (tp !== pp)
160
+ return false;
161
+ }
162
+ return true;
163
+ }
164
+ /** Same trim logic as in `router.ts`; inlined here to keep this file self-contained. */
165
+ function trimSlashes(s) {
166
+ let out = s;
167
+ if (out.startsWith("/"))
168
+ out = out.slice(1);
169
+ if (out.endsWith("/"))
170
+ out = out.slice(0, -1);
171
+ return out;
172
+ }
173
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/handlers/fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Next.js App Router adapter.
3
+ *
4
+ * Wraps `createFetchHandler` so per-customer wrapper apps can mount
5
+ * ai-hub-server with one line:
6
+ *
7
+ * ```ts
8
+ * // app/api/ai-hub/[...path]/route.ts
9
+ * import { createNextRouteHandler } from "@data-club/ai-hub-server";
10
+ *
11
+ * const handler = createNextRouteHandler({ ...options });
12
+ * export const GET = handler;
13
+ * export const POST = handler;
14
+ * export const PATCH = handler;
15
+ * export const DELETE = handler;
16
+ * ```
17
+ *
18
+ * The adapter is intentionally thin — Next.js App Router already gives us
19
+ * Web-Standard `Request` / `Response` objects, so this is barely more than
20
+ * a re-export. The reason it exists at all (rather than telling users to
21
+ * import `createFetchHandler` directly) is so the package owns the contract:
22
+ * if Next.js ever tightens its route-handler signature (e.g. adds a context
23
+ * arg), we adapt here without breaking every wrapper app.
24
+ *
25
+ * @see SPECIFICATIONS.md §6.2 — stack
26
+ * @see SPECIFICATIONS.md §14 — demo app pattern
27
+ */
28
+ import { type CreateFetchHandlerOptions, type FetchHandler } from "./fetch.js";
29
+ /**
30
+ * Builds a Next.js App Router-compatible route handler.
31
+ *
32
+ * Each HTTP-method export (`GET`, `POST`, …) in `route.ts` should reference
33
+ * the same instance — Next.js dispatches by method name, but our internal
34
+ * matcher does the work; sharing the instance avoids re-opening the DB.
35
+ *
36
+ * @param opts - same shape as `createFetchHandler`.
37
+ * @returns a function suitable for `export const GET = ...`.
38
+ */
39
+ export declare function createNextRouteHandler(opts: CreateFetchHandlerOptions): FetchHandler;
40
+ //# sourceMappingURL=nextjs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/handlers/nextjs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,yBAAyB,GAC9B,YAAY,CAEd"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Next.js App Router adapter.
3
+ *
4
+ * Wraps `createFetchHandler` so per-customer wrapper apps can mount
5
+ * ai-hub-server with one line:
6
+ *
7
+ * ```ts
8
+ * // app/api/ai-hub/[...path]/route.ts
9
+ * import { createNextRouteHandler } from "@data-club/ai-hub-server";
10
+ *
11
+ * const handler = createNextRouteHandler({ ...options });
12
+ * export const GET = handler;
13
+ * export const POST = handler;
14
+ * export const PATCH = handler;
15
+ * export const DELETE = handler;
16
+ * ```
17
+ *
18
+ * The adapter is intentionally thin — Next.js App Router already gives us
19
+ * Web-Standard `Request` / `Response` objects, so this is barely more than
20
+ * a re-export. The reason it exists at all (rather than telling users to
21
+ * import `createFetchHandler` directly) is so the package owns the contract:
22
+ * if Next.js ever tightens its route-handler signature (e.g. adds a context
23
+ * arg), we adapt here without breaking every wrapper app.
24
+ *
25
+ * @see SPECIFICATIONS.md §6.2 — stack
26
+ * @see SPECIFICATIONS.md §14 — demo app pattern
27
+ */
28
+ import { createFetchHandler, } from "./fetch.js";
29
+ /**
30
+ * Builds a Next.js App Router-compatible route handler.
31
+ *
32
+ * Each HTTP-method export (`GET`, `POST`, …) in `route.ts` should reference
33
+ * the same instance — Next.js dispatches by method name, but our internal
34
+ * matcher does the work; sharing the instance avoids re-opening the DB.
35
+ *
36
+ * @param opts - same shape as `createFetchHandler`.
37
+ * @returns a function suitable for `export const GET = ...`.
38
+ */
39
+ export function createNextRouteHandler(opts) {
40
+ return createFetchHandler(opts);
41
+ }
42
+ //# sourceMappingURL=nextjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../src/handlers/nextjs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EACL,kBAAkB,GAGnB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAA+B;IAE/B,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}