@agentlensai/server 0.11.0 → 0.13.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 (633) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cloud/auth/rbac.d.ts +1 -1
  3. package/dist/cloud/auth/rbac.d.ts.map +1 -1
  4. package/dist/cloud/auth/rbac.js +2 -2
  5. package/dist/cloud/auth/rbac.js.map +1 -1
  6. package/dist/cloud/billing/stripe-client.d.ts.map +1 -1
  7. package/dist/cloud/billing/stripe-client.js +6 -1
  8. package/dist/cloud/billing/stripe-client.js.map +1 -1
  9. package/dist/cloud/ingestion/gateway.d.ts.map +1 -1
  10. package/dist/cloud/ingestion/gateway.js +0 -1
  11. package/dist/cloud/ingestion/gateway.js.map +1 -1
  12. package/dist/cloud/middleware/validate-org-access.d.ts +14 -0
  13. package/dist/cloud/middleware/validate-org-access.d.ts.map +1 -0
  14. package/dist/cloud/middleware/validate-org-access.js +38 -0
  15. package/dist/cloud/middleware/validate-org-access.js.map +1 -0
  16. package/dist/cloud/routes/index.d.ts +13 -0
  17. package/dist/cloud/routes/index.d.ts.map +1 -0
  18. package/dist/cloud/routes/index.js +98 -0
  19. package/dist/cloud/routes/index.js.map +1 -0
  20. package/dist/config.d.ts +33 -1
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +71 -1
  23. package/dist/config.js.map +1 -1
  24. package/dist/db/api-key-lookup.d.ts +25 -0
  25. package/dist/db/api-key-lookup.d.ts.map +1 -0
  26. package/dist/db/api-key-lookup.js +38 -0
  27. package/dist/db/api-key-lookup.js.map +1 -0
  28. package/dist/db/connection.postgres.d.ts +44 -0
  29. package/dist/db/connection.postgres.d.ts.map +1 -0
  30. package/dist/db/connection.postgres.js +79 -0
  31. package/dist/db/connection.postgres.js.map +1 -0
  32. package/dist/db/cost-budget-store.d.ts +30 -0
  33. package/dist/db/cost-budget-store.d.ts.map +1 -0
  34. package/dist/db/cost-budget-store.js +201 -0
  35. package/dist/db/cost-budget-store.js.map +1 -0
  36. package/dist/db/drizzle/0000_initial.sql +336 -0
  37. package/dist/db/drizzle/0001_indexes.sql +20 -0
  38. package/dist/db/drizzle/0002_pgvector.sql +19 -0
  39. package/dist/db/drizzle/drizzle/0000_initial.sql +336 -0
  40. package/dist/db/drizzle/drizzle/0001_indexes.sql +20 -0
  41. package/dist/db/drizzle/drizzle/0002_pgvector.sql +19 -0
  42. package/dist/db/drizzle/drizzle/meta/0000_snapshot.json +2593 -0
  43. package/dist/db/drizzle/drizzle/meta/_journal.json +27 -0
  44. package/dist/db/drizzle/meta/0000_snapshot.json +2593 -0
  45. package/dist/db/drizzle/meta/_journal.json +27 -0
  46. package/dist/db/embedding-store.d.ts +2 -1
  47. package/dist/db/embedding-store.d.ts.map +1 -1
  48. package/dist/db/embedding-store.interface.d.ts +19 -0
  49. package/dist/db/embedding-store.interface.d.ts.map +1 -0
  50. package/dist/db/embedding-store.interface.js +7 -0
  51. package/dist/db/embedding-store.interface.js.map +1 -0
  52. package/dist/db/embedding-store.js +3 -1
  53. package/dist/db/embedding-store.js.map +1 -1
  54. package/dist/db/eval-store.d.ts +88 -0
  55. package/dist/db/eval-store.d.ts.map +1 -0
  56. package/dist/db/eval-store.js +408 -0
  57. package/dist/db/eval-store.js.map +1 -0
  58. package/dist/db/guardrail-store.d.ts +9 -0
  59. package/dist/db/guardrail-store.d.ts.map +1 -1
  60. package/dist/db/guardrail-store.js +57 -3
  61. package/dist/db/guardrail-store.js.map +1 -1
  62. package/dist/db/index.d.ts +7 -0
  63. package/dist/db/index.d.ts.map +1 -1
  64. package/dist/db/index.js +4 -12
  65. package/dist/db/index.js.map +1 -1
  66. package/dist/db/migrate.d.ts +5 -22
  67. package/dist/db/migrate.d.ts.map +1 -1
  68. package/dist/db/migrate.js +7 -637
  69. package/dist/db/migrate.js.map +1 -1
  70. package/dist/db/migrate.postgres.d.ts +16 -0
  71. package/dist/db/migrate.postgres.d.ts.map +1 -0
  72. package/dist/db/migrate.postgres.js +23 -0
  73. package/dist/db/migrate.postgres.js.map +1 -0
  74. package/dist/db/migrate.sqlite.d.ts +26 -0
  75. package/dist/db/migrate.sqlite.d.ts.map +1 -0
  76. package/dist/db/migrate.sqlite.js +920 -0
  77. package/dist/db/migrate.sqlite.js.map +1 -0
  78. package/dist/db/postgres-embedding-store.d.ts +23 -0
  79. package/dist/db/postgres-embedding-store.d.ts.map +1 -0
  80. package/dist/db/postgres-embedding-store.js +218 -0
  81. package/dist/db/postgres-embedding-store.js.map +1 -0
  82. package/dist/db/postgres-store.d.ts +80 -0
  83. package/dist/db/postgres-store.d.ts.map +1 -0
  84. package/dist/db/postgres-store.js +910 -0
  85. package/dist/db/postgres-store.js.map +1 -0
  86. package/dist/db/prompt-store.d.ts +57 -0
  87. package/dist/db/prompt-store.d.ts.map +1 -0
  88. package/dist/db/prompt-store.js +300 -0
  89. package/dist/db/prompt-store.js.map +1 -0
  90. package/dist/db/repositories/agent-repository.d.ts +21 -0
  91. package/dist/db/repositories/agent-repository.d.ts.map +1 -0
  92. package/dist/db/repositories/agent-repository.js +142 -0
  93. package/dist/db/repositories/agent-repository.js.map +1 -0
  94. package/dist/db/repositories/alert-repository.d.ts +27 -0
  95. package/dist/db/repositories/alert-repository.d.ts.map +1 -0
  96. package/dist/db/repositories/alert-repository.js +164 -0
  97. package/dist/db/repositories/alert-repository.js.map +1 -0
  98. package/dist/db/repositories/analytics-repository.d.ts +24 -0
  99. package/dist/db/repositories/analytics-repository.d.ts.map +1 -0
  100. package/dist/db/repositories/analytics-repository.js +147 -0
  101. package/dist/db/repositories/analytics-repository.js.map +1 -0
  102. package/dist/db/repositories/event-repository.d.ts +81 -0
  103. package/dist/db/repositories/event-repository.d.ts.map +1 -0
  104. package/dist/db/repositories/event-repository.js +331 -0
  105. package/dist/db/repositories/event-repository.js.map +1 -0
  106. package/dist/db/repositories/notification-channel-repository.d.ts +28 -0
  107. package/dist/db/repositories/notification-channel-repository.d.ts.map +1 -0
  108. package/dist/db/repositories/notification-channel-repository.js +151 -0
  109. package/dist/db/repositories/notification-channel-repository.js.map +1 -0
  110. package/dist/db/repositories/session-repository.d.ts +26 -0
  111. package/dist/db/repositories/session-repository.d.ts.map +1 -0
  112. package/dist/db/repositories/session-repository.js +240 -0
  113. package/dist/db/repositories/session-repository.js.map +1 -0
  114. package/dist/db/schema.postgres.d.ts +4681 -0
  115. package/dist/db/schema.postgres.d.ts.map +1 -0
  116. package/dist/db/schema.postgres.js +458 -0
  117. package/dist/db/schema.postgres.js.map +1 -0
  118. package/dist/db/schema.sqlite.d.ts +2221 -671
  119. package/dist/db/schema.sqlite.d.ts.map +1 -1
  120. package/dist/db/schema.sqlite.js +137 -2
  121. package/dist/db/schema.sqlite.js.map +1 -1
  122. package/dist/db/services/retention-service.d.ts +13 -0
  123. package/dist/db/services/retention-service.d.ts.map +1 -0
  124. package/dist/db/services/retention-service.js +48 -0
  125. package/dist/db/services/retention-service.js.map +1 -0
  126. package/dist/db/shared/query-helpers.d.ts +32 -0
  127. package/dist/db/shared/query-helpers.d.ts.map +1 -0
  128. package/dist/db/shared/query-helpers.js +180 -0
  129. package/dist/db/shared/query-helpers.js.map +1 -0
  130. package/dist/db/sqlite-store.d.ts +48 -55
  131. package/dist/db/sqlite-store.d.ts.map +1 -1
  132. package/dist/db/sqlite-store.js +78 -945
  133. package/dist/db/sqlite-store.js.map +1 -1
  134. package/dist/db/tenant-scoped-store.d.ts +18 -1
  135. package/dist/db/tenant-scoped-store.d.ts.map +1 -1
  136. package/dist/db/tenant-scoped-store.js +6 -0
  137. package/dist/db/tenant-scoped-store.js.map +1 -1
  138. package/dist/index.d.ts +28 -14
  139. package/dist/index.d.ts.map +1 -1
  140. package/dist/index.js +432 -97
  141. package/dist/index.js.map +1 -1
  142. package/dist/lib/alert-engine.d.ts +10 -0
  143. package/dist/lib/alert-engine.d.ts.map +1 -1
  144. package/dist/lib/alert-engine.js +73 -20
  145. package/dist/lib/alert-engine.js.map +1 -1
  146. package/dist/lib/audit-verify.d.ts +40 -0
  147. package/dist/lib/audit-verify.d.ts.map +1 -0
  148. package/dist/lib/audit-verify.js +128 -0
  149. package/dist/lib/audit-verify.js.map +1 -0
  150. package/dist/lib/audit.d.ts +37 -0
  151. package/dist/lib/audit.d.ts.map +1 -0
  152. package/dist/lib/audit.js +59 -0
  153. package/dist/lib/audit.js.map +1 -0
  154. package/dist/lib/budget-engine.d.ts +26 -0
  155. package/dist/lib/budget-engine.d.ts.map +1 -0
  156. package/dist/lib/budget-engine.js +201 -0
  157. package/dist/lib/budget-engine.js.map +1 -0
  158. package/dist/lib/compliance-export.d.ts +41 -0
  159. package/dist/lib/compliance-export.d.ts.map +1 -0
  160. package/dist/lib/compliance-export.js +124 -0
  161. package/dist/lib/compliance-export.js.map +1 -0
  162. package/dist/lib/compliance-report.d.ts +87 -0
  163. package/dist/lib/compliance-report.d.ts.map +1 -0
  164. package/dist/lib/compliance-report.js +148 -0
  165. package/dist/lib/compliance-report.js.map +1 -0
  166. package/dist/lib/context/retrieval.d.ts +5 -3
  167. package/dist/lib/context/retrieval.d.ts.map +1 -1
  168. package/dist/lib/context/retrieval.js +5 -2
  169. package/dist/lib/context/retrieval.js.map +1 -1
  170. package/dist/lib/cost-anomaly-detector.d.ts +23 -0
  171. package/dist/lib/cost-anomaly-detector.d.ts.map +1 -0
  172. package/dist/lib/cost-anomaly-detector.js +108 -0
  173. package/dist/lib/cost-anomaly-detector.js.map +1 -0
  174. package/dist/lib/db-resilience.d.ts +15 -0
  175. package/dist/lib/db-resilience.d.ts.map +1 -0
  176. package/dist/lib/db-resilience.js +49 -0
  177. package/dist/lib/db-resilience.js.map +1 -0
  178. package/dist/lib/diagnostics/cache.d.ts +29 -0
  179. package/dist/lib/diagnostics/cache.d.ts.map +1 -0
  180. package/dist/lib/diagnostics/cache.js +88 -0
  181. package/dist/lib/diagnostics/cache.js.map +1 -0
  182. package/dist/lib/diagnostics/context-builder.d.ts +41 -0
  183. package/dist/lib/diagnostics/context-builder.d.ts.map +1 -0
  184. package/dist/lib/diagnostics/context-builder.js +135 -0
  185. package/dist/lib/diagnostics/context-builder.js.map +1 -0
  186. package/dist/lib/diagnostics/index.d.ts +34 -0
  187. package/dist/lib/diagnostics/index.d.ts.map +1 -0
  188. package/dist/lib/diagnostics/index.js +223 -0
  189. package/dist/lib/diagnostics/index.js.map +1 -0
  190. package/dist/lib/diagnostics/llm-client.d.ts +24 -0
  191. package/dist/lib/diagnostics/llm-client.d.ts.map +1 -0
  192. package/dist/lib/diagnostics/llm-client.js +42 -0
  193. package/dist/lib/diagnostics/llm-client.js.map +1 -0
  194. package/dist/lib/diagnostics/prompt-templates.d.ts +18 -0
  195. package/dist/lib/diagnostics/prompt-templates.d.ts.map +1 -0
  196. package/dist/lib/diagnostics/prompt-templates.js +144 -0
  197. package/dist/lib/diagnostics/prompt-templates.js.map +1 -0
  198. package/dist/lib/diagnostics/providers/anthropic.d.ts +8 -0
  199. package/dist/lib/diagnostics/providers/anthropic.d.ts.map +1 -0
  200. package/dist/lib/diagnostics/providers/anthropic.js +79 -0
  201. package/dist/lib/diagnostics/providers/anthropic.js.map +1 -0
  202. package/dist/lib/diagnostics/providers/openai.d.ts +8 -0
  203. package/dist/lib/diagnostics/providers/openai.d.ts.map +1 -0
  204. package/dist/lib/diagnostics/providers/openai.js +70 -0
  205. package/dist/lib/diagnostics/providers/openai.js.map +1 -0
  206. package/dist/lib/diagnostics/providers/types.d.ts +23 -0
  207. package/dist/lib/diagnostics/providers/types.d.ts.map +1 -0
  208. package/dist/lib/diagnostics/providers/types.js +5 -0
  209. package/dist/lib/diagnostics/providers/types.js.map +1 -0
  210. package/dist/lib/diagnostics/response-parser.d.ts +60 -0
  211. package/dist/lib/diagnostics/response-parser.d.ts.map +1 -0
  212. package/dist/lib/diagnostics/response-parser.js +55 -0
  213. package/dist/lib/diagnostics/response-parser.js.map +1 -0
  214. package/dist/lib/diagnostics/types.d.ts +60 -0
  215. package/dist/lib/diagnostics/types.d.ts.map +1 -0
  216. package/dist/lib/diagnostics/types.js +7 -0
  217. package/dist/lib/diagnostics/types.js.map +1 -0
  218. package/dist/lib/embeddings/index.d.ts +6 -3
  219. package/dist/lib/embeddings/index.d.ts.map +1 -1
  220. package/dist/lib/embeddings/index.js +7 -15
  221. package/dist/lib/embeddings/index.js.map +1 -1
  222. package/dist/lib/embeddings/worker.d.ts +2 -2
  223. package/dist/lib/embeddings/worker.d.ts.map +1 -1
  224. package/dist/lib/embeddings/worker.js +3 -1
  225. package/dist/lib/embeddings/worker.js.map +1 -1
  226. package/dist/lib/error-sanitizer.d.ts +28 -0
  227. package/dist/lib/error-sanitizer.d.ts.map +1 -0
  228. package/dist/lib/error-sanitizer.js +106 -0
  229. package/dist/lib/error-sanitizer.js.map +1 -0
  230. package/dist/lib/eval/index.d.ts +15 -0
  231. package/dist/lib/eval/index.d.ts.map +1 -0
  232. package/dist/lib/eval/index.js +24 -0
  233. package/dist/lib/eval/index.js.map +1 -0
  234. package/dist/lib/eval/runner.d.ts +28 -0
  235. package/dist/lib/eval/runner.d.ts.map +1 -0
  236. package/dist/lib/eval/runner.js +260 -0
  237. package/dist/lib/eval/runner.js.map +1 -0
  238. package/dist/lib/eval/scorers/contains.d.ts +10 -0
  239. package/dist/lib/eval/scorers/contains.d.ts.map +1 -0
  240. package/dist/lib/eval/scorers/contains.js +33 -0
  241. package/dist/lib/eval/scorers/contains.js.map +1 -0
  242. package/dist/lib/eval/scorers/exact-match.d.ts +10 -0
  243. package/dist/lib/eval/scorers/exact-match.d.ts.map +1 -0
  244. package/dist/lib/eval/scorers/exact-match.js +33 -0
  245. package/dist/lib/eval/scorers/exact-match.js.map +1 -0
  246. package/dist/lib/eval/scorers/index.d.ts +20 -0
  247. package/dist/lib/eval/scorers/index.d.ts.map +1 -0
  248. package/dist/lib/eval/scorers/index.js +19 -0
  249. package/dist/lib/eval/scorers/index.js.map +1 -0
  250. package/dist/lib/eval/scorers/llm-judge.d.ts +22 -0
  251. package/dist/lib/eval/scorers/llm-judge.d.ts.map +1 -0
  252. package/dist/lib/eval/scorers/llm-judge.js +79 -0
  253. package/dist/lib/eval/scorers/llm-judge.js.map +1 -0
  254. package/dist/lib/eval/scorers/regex.d.ts +10 -0
  255. package/dist/lib/eval/scorers/regex.d.ts.map +1 -0
  256. package/dist/lib/eval/scorers/regex.js +36 -0
  257. package/dist/lib/eval/scorers/regex.js.map +1 -0
  258. package/dist/lib/guardrails/actions.d.ts +6 -0
  259. package/dist/lib/guardrails/actions.d.ts.map +1 -1
  260. package/dist/lib/guardrails/actions.js +82 -0
  261. package/dist/lib/guardrails/actions.js.map +1 -1
  262. package/dist/lib/guardrails/conditions.d.ts +47 -0
  263. package/dist/lib/guardrails/conditions.d.ts.map +1 -1
  264. package/dist/lib/guardrails/conditions.js +55 -10
  265. package/dist/lib/guardrails/conditions.js.map +1 -1
  266. package/dist/lib/guardrails/content-engine.d.ts +19 -0
  267. package/dist/lib/guardrails/content-engine.d.ts.map +1 -0
  268. package/dist/lib/guardrails/content-engine.js +154 -0
  269. package/dist/lib/guardrails/content-engine.js.map +1 -0
  270. package/dist/lib/guardrails/engine.d.ts +33 -0
  271. package/dist/lib/guardrails/engine.d.ts.map +1 -1
  272. package/dist/lib/guardrails/engine.js +37 -2
  273. package/dist/lib/guardrails/engine.js.map +1 -1
  274. package/dist/lib/guardrails/scanners/base-scanner.d.ts +23 -0
  275. package/dist/lib/guardrails/scanners/base-scanner.d.ts.map +1 -0
  276. package/dist/lib/guardrails/scanners/base-scanner.js +7 -0
  277. package/dist/lib/guardrails/scanners/base-scanner.js.map +1 -0
  278. package/dist/lib/guardrails/scanners/patterns/pii-patterns.d.ts +13 -0
  279. package/dist/lib/guardrails/scanners/patterns/pii-patterns.d.ts.map +1 -0
  280. package/dist/lib/guardrails/scanners/patterns/pii-patterns.js +49 -0
  281. package/dist/lib/guardrails/scanners/patterns/pii-patterns.js.map +1 -0
  282. package/dist/lib/guardrails/scanners/patterns/secret-patterns.d.ts +6 -0
  283. package/dist/lib/guardrails/scanners/patterns/secret-patterns.d.ts.map +1 -0
  284. package/dist/lib/guardrails/scanners/patterns/secret-patterns.js +69 -0
  285. package/dist/lib/guardrails/scanners/patterns/secret-patterns.js.map +1 -0
  286. package/dist/lib/guardrails/scanners/pii-scanner.d.ts +10 -0
  287. package/dist/lib/guardrails/scanners/pii-scanner.d.ts.map +1 -0
  288. package/dist/lib/guardrails/scanners/pii-scanner.js +57 -0
  289. package/dist/lib/guardrails/scanners/pii-scanner.js.map +1 -0
  290. package/dist/lib/guardrails/scanners/scanner-registry.d.ts +14 -0
  291. package/dist/lib/guardrails/scanners/scanner-registry.d.ts.map +1 -0
  292. package/dist/lib/guardrails/scanners/scanner-registry.js +51 -0
  293. package/dist/lib/guardrails/scanners/scanner-registry.js.map +1 -0
  294. package/dist/lib/guardrails/scanners/secrets-scanner.d.ts +9 -0
  295. package/dist/lib/guardrails/scanners/secrets-scanner.d.ts.map +1 -0
  296. package/dist/lib/guardrails/scanners/secrets-scanner.js +47 -0
  297. package/dist/lib/guardrails/scanners/secrets-scanner.js.map +1 -0
  298. package/dist/lib/logger.d.ts +8 -0
  299. package/dist/lib/logger.d.ts.map +1 -0
  300. package/dist/lib/logger.js +31 -0
  301. package/dist/lib/logger.js.map +1 -0
  302. package/dist/lib/lore-client.d.ts +128 -0
  303. package/dist/lib/lore-client.d.ts.map +1 -0
  304. package/dist/lib/lore-client.js +188 -0
  305. package/dist/lib/lore-client.js.map +1 -0
  306. package/dist/lib/mesh-client.d.ts +31 -0
  307. package/dist/lib/mesh-client.d.ts.map +1 -0
  308. package/dist/lib/mesh-client.js +72 -0
  309. package/dist/lib/mesh-client.js.map +1 -0
  310. package/dist/lib/notifications/grouping-buffer.d.ts +25 -0
  311. package/dist/lib/notifications/grouping-buffer.d.ts.map +1 -0
  312. package/dist/lib/notifications/grouping-buffer.js +73 -0
  313. package/dist/lib/notifications/grouping-buffer.js.map +1 -0
  314. package/dist/lib/notifications/provider.d.ts +10 -0
  315. package/dist/lib/notifications/provider.d.ts.map +1 -0
  316. package/dist/lib/notifications/provider.js +5 -0
  317. package/dist/lib/notifications/provider.js.map +1 -0
  318. package/dist/lib/notifications/providers/email.d.ts +14 -0
  319. package/dist/lib/notifications/providers/email.d.ts.map +1 -0
  320. package/dist/lib/notifications/providers/email.js +88 -0
  321. package/dist/lib/notifications/providers/email.js.map +1 -0
  322. package/dist/lib/notifications/providers/pagerduty.d.ts +16 -0
  323. package/dist/lib/notifications/providers/pagerduty.d.ts.map +1 -0
  324. package/dist/lib/notifications/providers/pagerduty.js +94 -0
  325. package/dist/lib/notifications/providers/pagerduty.js.map +1 -0
  326. package/dist/lib/notifications/providers/slack.d.ts +14 -0
  327. package/dist/lib/notifications/providers/slack.d.ts.map +1 -0
  328. package/dist/lib/notifications/providers/slack.js +106 -0
  329. package/dist/lib/notifications/providers/slack.js.map +1 -0
  330. package/dist/lib/notifications/providers/webhook.d.ts +16 -0
  331. package/dist/lib/notifications/providers/webhook.d.ts.map +1 -0
  332. package/dist/lib/notifications/providers/webhook.js +78 -0
  333. package/dist/lib/notifications/providers/webhook.js.map +1 -0
  334. package/dist/lib/notifications/router.d.ts +30 -0
  335. package/dist/lib/notifications/router.d.ts.map +1 -0
  336. package/dist/lib/notifications/router.js +137 -0
  337. package/dist/lib/notifications/router.js.map +1 -0
  338. package/dist/lib/notifications/ssrf.d.ts +13 -0
  339. package/dist/lib/notifications/ssrf.d.ts.map +1 -0
  340. package/dist/lib/notifications/ssrf.js +37 -0
  341. package/dist/lib/notifications/ssrf.js.map +1 -0
  342. package/dist/lib/optimization/analyzers/model-downgrade.d.ts +15 -0
  343. package/dist/lib/optimization/analyzers/model-downgrade.d.ts.map +1 -0
  344. package/dist/lib/optimization/analyzers/model-downgrade.js +58 -0
  345. package/dist/lib/optimization/analyzers/model-downgrade.js.map +1 -0
  346. package/dist/lib/optimization/analyzers/prompt-optimization.d.ts +17 -0
  347. package/dist/lib/optimization/analyzers/prompt-optimization.d.ts.map +1 -0
  348. package/dist/lib/optimization/analyzers/prompt-optimization.js +160 -0
  349. package/dist/lib/optimization/analyzers/prompt-optimization.js.map +1 -0
  350. package/dist/lib/optimization/analyzers/types.d.ts +23 -0
  351. package/dist/lib/optimization/analyzers/types.d.ts.map +1 -0
  352. package/dist/lib/optimization/analyzers/types.js +5 -0
  353. package/dist/lib/optimization/analyzers/types.js.map +1 -0
  354. package/dist/lib/optimization/classifier.d.ts +4 -3
  355. package/dist/lib/optimization/classifier.d.ts.map +1 -1
  356. package/dist/lib/optimization/classifier.js +15 -9
  357. package/dist/lib/optimization/classifier.js.map +1 -1
  358. package/dist/lib/optimization/cost-optimizer.d.ts +21 -0
  359. package/dist/lib/optimization/cost-optimizer.d.ts.map +1 -0
  360. package/dist/lib/optimization/cost-optimizer.js +114 -0
  361. package/dist/lib/optimization/cost-optimizer.js.map +1 -0
  362. package/dist/lib/optimization/engine.d.ts.map +1 -1
  363. package/dist/lib/optimization/engine.js +45 -6
  364. package/dist/lib/optimization/engine.js.map +1 -1
  365. package/dist/lib/optimization/forecast.d.ts +39 -0
  366. package/dist/lib/optimization/forecast.d.ts.map +1 -0
  367. package/dist/lib/optimization/forecast.js +128 -0
  368. package/dist/lib/optimization/forecast.js.map +1 -0
  369. package/dist/lib/secrets.d.ts +30 -0
  370. package/dist/lib/secrets.d.ts.map +1 -0
  371. package/dist/lib/secrets.js +103 -0
  372. package/dist/lib/secrets.js.map +1 -0
  373. package/dist/lib/threshold-monitor.d.ts +53 -0
  374. package/dist/lib/threshold-monitor.d.ts.map +1 -0
  375. package/dist/lib/threshold-monitor.js +112 -0
  376. package/dist/lib/threshold-monitor.js.map +1 -0
  377. package/dist/middleware/audit.d.ts +16 -0
  378. package/dist/middleware/audit.d.ts.map +1 -0
  379. package/dist/middleware/audit.js +16 -0
  380. package/dist/middleware/audit.js.map +1 -0
  381. package/dist/middleware/auth-errors.d.ts +67 -0
  382. package/dist/middleware/auth-errors.d.ts.map +1 -0
  383. package/dist/middleware/auth-errors.js +84 -0
  384. package/dist/middleware/auth-errors.js.map +1 -0
  385. package/dist/middleware/auth.d.ts +5 -2
  386. package/dist/middleware/auth.d.ts.map +1 -1
  387. package/dist/middleware/auth.js +44 -17
  388. package/dist/middleware/auth.js.map +1 -1
  389. package/dist/middleware/body-limit.d.ts +9 -0
  390. package/dist/middleware/body-limit.d.ts.map +1 -0
  391. package/dist/middleware/body-limit.js +15 -0
  392. package/dist/middleware/body-limit.js.map +1 -0
  393. package/dist/middleware/cors-config.d.ts +30 -0
  394. package/dist/middleware/cors-config.d.ts.map +1 -0
  395. package/dist/middleware/cors-config.js +55 -0
  396. package/dist/middleware/cors-config.js.map +1 -0
  397. package/dist/middleware/rate-limit.d.ts +9 -0
  398. package/dist/middleware/rate-limit.d.ts.map +1 -0
  399. package/dist/middleware/rate-limit.js +56 -0
  400. package/dist/middleware/rate-limit.js.map +1 -0
  401. package/dist/middleware/rbac.d.ts +30 -0
  402. package/dist/middleware/rbac.d.ts.map +1 -0
  403. package/dist/middleware/rbac.js +87 -0
  404. package/dist/middleware/rbac.js.map +1 -0
  405. package/dist/middleware/security-headers.d.ts +12 -0
  406. package/dist/middleware/security-headers.d.ts.map +1 -0
  407. package/dist/middleware/security-headers.js +57 -0
  408. package/dist/middleware/security-headers.js.map +1 -0
  409. package/dist/middleware/unified-auth.d.ts +49 -0
  410. package/dist/middleware/unified-auth.d.ts.map +1 -0
  411. package/dist/middleware/unified-auth.js +246 -0
  412. package/dist/middleware/unified-auth.js.map +1 -0
  413. package/dist/middleware/validation.d.ts +31 -0
  414. package/dist/middleware/validation.d.ts.map +1 -0
  415. package/dist/middleware/validation.js +45 -0
  416. package/dist/middleware/validation.js.map +1 -0
  417. package/dist/routes/alerts.d.ts.map +1 -1
  418. package/dist/routes/alerts.js +4 -3
  419. package/dist/routes/alerts.js.map +1 -1
  420. package/dist/routes/analytics.d.ts +2 -1
  421. package/dist/routes/analytics.d.ts.map +1 -1
  422. package/dist/routes/analytics.js +175 -95
  423. package/dist/routes/analytics.js.map +1 -1
  424. package/dist/routes/api-keys.d.ts +5 -0
  425. package/dist/routes/api-keys.d.ts.map +1 -1
  426. package/dist/routes/api-keys.js +89 -8
  427. package/dist/routes/api-keys.js.map +1 -1
  428. package/dist/routes/audit-verify.d.ts +12 -0
  429. package/dist/routes/audit-verify.d.ts.map +1 -0
  430. package/dist/routes/audit-verify.js +73 -0
  431. package/dist/routes/audit-verify.js.map +1 -0
  432. package/dist/routes/audit.d.ts +4 -6
  433. package/dist/routes/audit.d.ts.map +1 -1
  434. package/dist/routes/audit.js +54 -157
  435. package/dist/routes/audit.js.map +1 -1
  436. package/dist/routes/auth.d.ts +21 -0
  437. package/dist/routes/auth.d.ts.map +1 -0
  438. package/dist/routes/auth.js +235 -0
  439. package/dist/routes/auth.js.map +1 -0
  440. package/dist/routes/benchmarks.d.ts.map +1 -1
  441. package/dist/routes/benchmarks.js +63 -11
  442. package/dist/routes/benchmarks.js.map +1 -1
  443. package/dist/routes/capabilities-top.d.ts.map +1 -1
  444. package/dist/routes/capabilities-top.js +1 -4
  445. package/dist/routes/capabilities-top.js.map +1 -1
  446. package/dist/routes/capabilities.d.ts.map +1 -1
  447. package/dist/routes/capabilities.js +1 -7
  448. package/dist/routes/capabilities.js.map +1 -1
  449. package/dist/routes/compliance.d.ts +17 -0
  450. package/dist/routes/compliance.d.ts.map +1 -0
  451. package/dist/routes/compliance.js +151 -0
  452. package/dist/routes/compliance.js.map +1 -0
  453. package/dist/routes/config.d.ts +1 -13
  454. package/dist/routes/config.d.ts.map +1 -1
  455. package/dist/routes/context.d.ts.map +1 -1
  456. package/dist/routes/context.js +6 -5
  457. package/dist/routes/context.js.map +1 -1
  458. package/dist/routes/cost-budgets.d.ts +20 -0
  459. package/dist/routes/cost-budgets.d.ts.map +1 -0
  460. package/dist/routes/cost-budgets.js +194 -0
  461. package/dist/routes/cost-budgets.js.map +1 -0
  462. package/dist/routes/delegation.d.ts.map +1 -1
  463. package/dist/routes/delegation.js +67 -41
  464. package/dist/routes/delegation.js.map +1 -1
  465. package/dist/routes/delegations-top.d.ts.map +1 -1
  466. package/dist/routes/delegations-top.js +1 -3
  467. package/dist/routes/delegations-top.js.map +1 -1
  468. package/dist/routes/diagnose.d.ts +16 -0
  469. package/dist/routes/diagnose.d.ts.map +1 -0
  470. package/dist/routes/diagnose.js +82 -0
  471. package/dist/routes/diagnose.js.map +1 -0
  472. package/dist/routes/discovery.d.ts.map +1 -1
  473. package/dist/routes/discovery.js +50 -38
  474. package/dist/routes/discovery.js.map +1 -1
  475. package/dist/routes/eval.d.ts +24 -0
  476. package/dist/routes/eval.d.ts.map +1 -0
  477. package/dist/routes/eval.js +281 -0
  478. package/dist/routes/eval.js.map +1 -0
  479. package/dist/routes/events.d.ts.map +1 -1
  480. package/dist/routes/events.js +11 -6
  481. package/dist/routes/events.js.map +1 -1
  482. package/dist/routes/guardrails.d.ts +2 -1
  483. package/dist/routes/guardrails.d.ts.map +1 -1
  484. package/dist/routes/guardrails.js +85 -14
  485. package/dist/routes/guardrails.js.map +1 -1
  486. package/dist/routes/health.d.ts +14 -11
  487. package/dist/routes/health.d.ts.map +1 -1
  488. package/dist/routes/health.js +181 -61
  489. package/dist/routes/health.js.map +1 -1
  490. package/dist/routes/lore-proxy.d.ts +13 -0
  491. package/dist/routes/lore-proxy.d.ts.map +1 -0
  492. package/dist/routes/lore-proxy.js +229 -0
  493. package/dist/routes/lore-proxy.js.map +1 -0
  494. package/dist/routes/mesh-proxy.d.ts +7 -0
  495. package/dist/routes/mesh-proxy.d.ts.map +1 -0
  496. package/dist/routes/mesh-proxy.js +94 -0
  497. package/dist/routes/mesh-proxy.js.map +1 -0
  498. package/dist/routes/notifications.d.ts +19 -0
  499. package/dist/routes/notifications.d.ts.map +1 -0
  500. package/dist/routes/notifications.js +129 -0
  501. package/dist/routes/notifications.js.map +1 -0
  502. package/dist/routes/optimize.d.ts.map +1 -1
  503. package/dist/routes/optimize.js +44 -0
  504. package/dist/routes/optimize.js.map +1 -1
  505. package/dist/routes/otlp.d.ts +17 -0
  506. package/dist/routes/otlp.d.ts.map +1 -0
  507. package/dist/routes/otlp.js +544 -0
  508. package/dist/routes/otlp.js.map +1 -0
  509. package/dist/routes/prompts.d.ts +21 -0
  510. package/dist/routes/prompts.d.ts.map +1 -0
  511. package/dist/routes/prompts.js +173 -0
  512. package/dist/routes/prompts.js.map +1 -0
  513. package/dist/routes/recall.d.ts.map +1 -1
  514. package/dist/routes/recall.js +6 -4
  515. package/dist/routes/recall.js.map +1 -1
  516. package/dist/routes/replay.d.ts.map +1 -1
  517. package/dist/routes/replay.js +2 -1
  518. package/dist/routes/replay.js.map +1 -1
  519. package/dist/routes/server-info.d.ts +9 -0
  520. package/dist/routes/server-info.d.ts.map +1 -0
  521. package/dist/routes/server-info.js +18 -0
  522. package/dist/routes/server-info.js.map +1 -0
  523. package/dist/routes/sessions.d.ts +7 -7
  524. package/dist/routes/sessions.d.ts.map +1 -1
  525. package/dist/routes/sessions.js +112 -35
  526. package/dist/routes/sessions.js.map +1 -1
  527. package/dist/routes/stats.d.ts.map +1 -1
  528. package/dist/routes/stats.js +40 -0
  529. package/dist/routes/stats.js.map +1 -1
  530. package/dist/routes/stream.d.ts +2 -2
  531. package/dist/routes/stream.d.ts.map +1 -1
  532. package/dist/routes/stream.js +7 -11
  533. package/dist/routes/stream.js.map +1 -1
  534. package/dist/routes/tenant-helper.d.ts +15 -10
  535. package/dist/routes/tenant-helper.d.ts.map +1 -1
  536. package/dist/routes/tenant-helper.js +36 -22
  537. package/dist/routes/tenant-helper.js.map +1 -1
  538. package/dist/routes/trust.d.ts.map +1 -1
  539. package/dist/routes/trust.js +1 -3
  540. package/dist/routes/trust.js.map +1 -1
  541. package/dist/schemas/api-keys.d.ts +11 -0
  542. package/dist/schemas/api-keys.d.ts.map +1 -0
  543. package/dist/schemas/api-keys.js +10 -0
  544. package/dist/schemas/api-keys.js.map +1 -0
  545. package/dist/schemas/common.d.ts +34 -0
  546. package/dist/schemas/common.d.ts.map +1 -0
  547. package/dist/schemas/common.js +43 -0
  548. package/dist/schemas/common.js.map +1 -0
  549. package/dist/schemas/delegation.d.ts +23 -0
  550. package/dist/schemas/delegation.d.ts.map +1 -0
  551. package/dist/schemas/delegation.js +22 -0
  552. package/dist/schemas/delegation.js.map +1 -0
  553. package/dist/schemas/discovery.d.ts +17 -0
  554. package/dist/schemas/discovery.d.ts.map +1 -0
  555. package/dist/schemas/discovery.js +15 -0
  556. package/dist/schemas/discovery.js.map +1 -0
  557. package/dist/schemas/health.d.ts +75 -0
  558. package/dist/schemas/health.d.ts.map +1 -0
  559. package/dist/schemas/health.js +55 -0
  560. package/dist/schemas/health.js.map +1 -0
  561. package/dist/schemas/index.d.ts +6 -0
  562. package/dist/schemas/index.d.ts.map +1 -0
  563. package/dist/schemas/index.js +6 -0
  564. package/dist/schemas/index.js.map +1 -0
  565. package/dist/schemas/sessions.d.ts +67 -0
  566. package/dist/schemas/sessions.d.ts.map +1 -0
  567. package/dist/schemas/sessions.js +58 -0
  568. package/dist/schemas/sessions.js.map +1 -0
  569. package/dist/services/delegation-service.d.ts +1 -4
  570. package/dist/services/delegation-service.d.ts.map +1 -1
  571. package/dist/services/delegation-service.js +5 -31
  572. package/dist/services/delegation-service.js.map +1 -1
  573. package/package.json +29 -19
  574. package/dist/db/lesson-store.d.ts +0 -57
  575. package/dist/db/lesson-store.d.ts.map +0 -1
  576. package/dist/db/lesson-store.js +0 -217
  577. package/dist/db/lesson-store.js.map +0 -1
  578. package/dist/lib/embeddings/local.d.ts +0 -15
  579. package/dist/lib/embeddings/local.d.ts.map +0 -1
  580. package/dist/lib/embeddings/local.js +0 -65
  581. package/dist/lib/embeddings/local.js.map +0 -1
  582. package/dist/lib/redaction/human-review-layer.d.ts +0 -37
  583. package/dist/lib/redaction/human-review-layer.d.ts.map +0 -1
  584. package/dist/lib/redaction/human-review-layer.js +0 -62
  585. package/dist/lib/redaction/human-review-layer.js.map +0 -1
  586. package/dist/lib/redaction/index.d.ts +0 -12
  587. package/dist/lib/redaction/index.d.ts.map +0 -1
  588. package/dist/lib/redaction/index.js +0 -12
  589. package/dist/lib/redaction/index.js.map +0 -1
  590. package/dist/lib/redaction/pii-detection-layer.d.ts +0 -30
  591. package/dist/lib/redaction/pii-detection-layer.d.ts.map +0 -1
  592. package/dist/lib/redaction/pii-detection-layer.js +0 -183
  593. package/dist/lib/redaction/pii-detection-layer.js.map +0 -1
  594. package/dist/lib/redaction/pipeline.d.ts +0 -26
  595. package/dist/lib/redaction/pipeline.d.ts.map +0 -1
  596. package/dist/lib/redaction/pipeline.js +0 -91
  597. package/dist/lib/redaction/pipeline.js.map +0 -1
  598. package/dist/lib/redaction/secret-detection-layer.d.ts +0 -10
  599. package/dist/lib/redaction/secret-detection-layer.d.ts.map +0 -1
  600. package/dist/lib/redaction/secret-detection-layer.js +0 -79
  601. package/dist/lib/redaction/secret-detection-layer.js.map +0 -1
  602. package/dist/lib/redaction/secret-patterns.d.ts +0 -29
  603. package/dist/lib/redaction/secret-patterns.d.ts.map +0 -1
  604. package/dist/lib/redaction/secret-patterns.js +0 -133
  605. package/dist/lib/redaction/secret-patterns.js.map +0 -1
  606. package/dist/lib/redaction/semantic-denylist-layer.d.ts +0 -10
  607. package/dist/lib/redaction/semantic-denylist-layer.d.ts.map +0 -1
  608. package/dist/lib/redaction/semantic-denylist-layer.js +0 -64
  609. package/dist/lib/redaction/semantic-denylist-layer.js.map +0 -1
  610. package/dist/lib/redaction/tenant-deidentification-layer.d.ts +0 -10
  611. package/dist/lib/redaction/tenant-deidentification-layer.d.ts.map +0 -1
  612. package/dist/lib/redaction/tenant-deidentification-layer.js +0 -64
  613. package/dist/lib/redaction/tenant-deidentification-layer.js.map +0 -1
  614. package/dist/lib/redaction/url-path-scrubbing-layer.d.ts +0 -14
  615. package/dist/lib/redaction/url-path-scrubbing-layer.d.ts.map +0 -1
  616. package/dist/lib/redaction/url-path-scrubbing-layer.js +0 -156
  617. package/dist/lib/redaction/url-path-scrubbing-layer.js.map +0 -1
  618. package/dist/routes/community.d.ts +0 -24
  619. package/dist/routes/community.d.ts.map +0 -1
  620. package/dist/routes/community.js +0 -272
  621. package/dist/routes/community.js.map +0 -1
  622. package/dist/routes/lessons.d.ts +0 -19
  623. package/dist/routes/lessons.d.ts.map +0 -1
  624. package/dist/routes/lessons.js +0 -164
  625. package/dist/routes/lessons.js.map +0 -1
  626. package/dist/routes/redaction-test.d.ts +0 -14
  627. package/dist/routes/redaction-test.d.ts.map +0 -1
  628. package/dist/routes/redaction-test.js +0 -33
  629. package/dist/routes/redaction-test.js.map +0 -1
  630. package/dist/services/community-service.d.ts +0 -283
  631. package/dist/services/community-service.d.ts.map +0 -1
  632. package/dist/services/community-service.js +0 -816
  633. package/dist/services/community-service.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-errors.d.ts","sourceRoot":"","sources":["../../src/middleware/auth-errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAIpC,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO;;;;;gBAO5C;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO;;;;gBAMvC;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO;;;;gBAMvC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO;;;;gBAMpC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO;;;;;gBAOpC;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO;;;;gBAMzC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO;;;;gBAMtC;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO;;;;;gBAO1C;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO;;;;gBAM1C;AAID,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;;;;;;gBAQA"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Standardized auth error response builders (Story 6 / PRD §R5).
3
+ *
4
+ * All 401/403 responses share a consistent JSON structure with
5
+ * actionable `hint` fields. No stack traces or internals leaked.
6
+ */
7
+ // ── 401 Responses ──────────────────────────────────────────
8
+ export function missingCredentials(c) {
9
+ return c.json({
10
+ error: 'Authentication required',
11
+ hint: "Provide an API key via 'Authorization: Bearer als_...' header, or log in via /auth/login",
12
+ docs: '/docs/authentication',
13
+ status: 401,
14
+ }, 401);
15
+ }
16
+ export function invalidApiKey(c) {
17
+ return c.json({
18
+ error: 'Invalid or revoked API key',
19
+ hint: 'This API key is no longer valid. Generate a new key at /api/keys.',
20
+ status: 401,
21
+ }, 401);
22
+ }
23
+ export function expiredApiKey(c) {
24
+ return c.json({
25
+ error: 'API key expired',
26
+ hint: 'This API key has been rotated and is no longer valid. Please use the new key.',
27
+ status: 401,
28
+ }, 401);
29
+ }
30
+ export function expiredJwt(c) {
31
+ return c.json({
32
+ error: 'Token expired',
33
+ hint: 'Your session has expired. Refresh via POST /auth/refresh or log in again.',
34
+ status: 401,
35
+ }, 401);
36
+ }
37
+ export function invalidJwt(c) {
38
+ return c.json({
39
+ error: 'Invalid token',
40
+ hint: 'The provided token is invalid. Log in again via /auth/login.',
41
+ docs: '/docs/authentication',
42
+ status: 401,
43
+ }, 401);
44
+ }
45
+ export function invalidCloudKey(c) {
46
+ return c.json({
47
+ error: 'Invalid or revoked API key',
48
+ hint: 'This cloud API key is no longer valid. Generate a new key in the dashboard.',
49
+ status: 401,
50
+ }, 401);
51
+ }
52
+ export function authRequired(c) {
53
+ return c.json({
54
+ error: 'Authentication required',
55
+ hint: 'No auth context found. This is likely a middleware ordering issue.',
56
+ status: 401,
57
+ }, 401);
58
+ }
59
+ export function otlpAuthRequired(c) {
60
+ return c.json({
61
+ error: 'Authentication required',
62
+ hint: "OTLP authentication is enabled. Provide a token via 'Authorization: Bearer <token>' header.",
63
+ docs: '/docs/otlp-auth',
64
+ status: 401,
65
+ }, 401);
66
+ }
67
+ export function otlpInvalidToken(c) {
68
+ return c.json({
69
+ error: 'Invalid OTLP token',
70
+ hint: 'The provided OTLP auth token does not match. Check your OTLP_AUTH_TOKEN configuration.',
71
+ status: 401,
72
+ }, 401);
73
+ }
74
+ // ── 403 Responses ──────────────────────────────────────────
75
+ export function insufficientPermissions(c, opts) {
76
+ return c.json({
77
+ error: 'Insufficient permissions',
78
+ hint: opts.hint ?? `This action requires '${opts.required}' role or higher. Your current role is '${opts.current}'.`,
79
+ required: opts.required,
80
+ current: opts.current,
81
+ status: 403,
82
+ }, 403);
83
+ }
84
+ //# sourceMappingURL=auth-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-errors.js","sourceRoot":"","sources":["../../src/middleware/auth-errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,8DAA8D;AAE9D,MAAM,UAAU,kBAAkB,CAAC,CAAU;IAC3C,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,yBAAyB;QAChC,IAAI,EAAE,0FAA0F;QAChG,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,GAAG;KACZ,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,4BAA4B;QACnC,IAAI,EAAE,mEAAmE;QACzE,MAAM,EAAE,GAAG;KACZ,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,+EAA+E;QACrF,MAAM,EAAE,GAAG;KACZ,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,2EAA2E;QACjF,MAAM,EAAE,GAAG;KACZ,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,8DAA8D;QACpE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,GAAG;KACZ,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAU;IACxC,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,4BAA4B;QACnC,IAAI,EAAE,6EAA6E;QACnF,MAAM,EAAE,GAAG;KACZ,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,yBAAyB;QAChC,IAAI,EAAE,oEAAoE;QAC1E,MAAM,EAAE,GAAG;KACZ,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,yBAAyB;QAChC,IAAI,EAAE,6FAA6F;QACnG,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,GAAG;KACZ,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE,wFAAwF;QAC9F,MAAM,EAAE,GAAG;KACZ,EAAE,GAAG,CAAC,CAAC;AACV,CAAC;AAED,8DAA8D;AAE9D,MAAM,UAAU,uBAAuB,CAAC,CAAU,EAAE,IAInD;IACC,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,0BAA0B;QACjC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,yBAAyB,IAAI,CAAC,QAAQ,2CAA2C,IAAI,CAAC,OAAO,IAAI;QACpH,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,GAAG;KACZ,EAAE,GAAG,CAAC,CAAC;AACV,CAAC"}
@@ -5,8 +5,11 @@
5
5
  * with SHA-256 and looking it up in the apiKeys table.
6
6
  *
7
7
  * When AUTH_DISABLED=true, authentication is skipped (dev mode).
8
+ *
9
+ * Supports both SQLite (sync) and PostgreSQL (async) backends via IApiKeyLookup.
8
10
  */
9
11
  import type { SqliteDb } from '../db/index.js';
12
+ import type { IApiKeyLookup } from '../db/api-key-lookup.js';
10
13
  /**
11
14
  * API key info attached to the Hono context.
12
15
  */
@@ -29,10 +32,10 @@ export declare function hashApiKey(raw: string): string;
29
32
  /**
30
33
  * Create the auth middleware.
31
34
  *
32
- * @param db - Drizzle SQLite database instance
35
+ * @param dbOrLookup - Drizzle SQLite database instance OR IApiKeyLookup
33
36
  * @param authDisabled - If true, skip authentication (dev mode)
34
37
  */
35
- export declare function authMiddleware(db: SqliteDb, authDisabled: boolean): import("hono").MiddlewareHandler<{
38
+ export declare function authMiddleware(dbOrLookup: SqliteDb | IApiKeyLookup, authDisabled: boolean): import("hono").MiddlewareHandler<{
36
39
  Variables: AuthVariables;
37
40
  }, string, {}, Response>;
38
41
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO;eAC3B,aAAa;yBA2DnD"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,QAAQ,GAAG,aAAa,EAAE,YAAY,EAAE,OAAO;eACnD,aAAa;yBAgFnD"}
@@ -5,6 +5,8 @@
5
5
  * with SHA-256 and looking it up in the apiKeys table.
6
6
  *
7
7
  * When AUTH_DISABLED=true, authentication is skipped (dev mode).
8
+ *
9
+ * Supports both SQLite (sync) and PostgreSQL (async) backends via IApiKeyLookup.
8
10
  */
9
11
  import { createHash } from 'node:crypto';
10
12
  import { createMiddleware } from 'hono/factory';
@@ -19,10 +21,10 @@ export function hashApiKey(raw) {
19
21
  /**
20
22
  * Create the auth middleware.
21
23
  *
22
- * @param db - Drizzle SQLite database instance
24
+ * @param dbOrLookup - Drizzle SQLite database instance OR IApiKeyLookup
23
25
  * @param authDisabled - If true, skip authentication (dev mode)
24
26
  */
25
- export function authMiddleware(db, authDisabled) {
27
+ export function authMiddleware(dbOrLookup, authDisabled) {
26
28
  return createMiddleware(async (c, next) => {
27
29
  // Dev mode: skip auth
28
30
  if (authDisabled) {
@@ -39,7 +41,37 @@ export function authMiddleware(db, authDisabled) {
39
41
  }
40
42
  const rawKey = match[1];
41
43
  const keyHash = hashApiKey(rawKey);
42
- // Look up the key by hash (not revoked)
44
+ // Determine if we have an IApiKeyLookup or a raw SQLite db
45
+ if ('findByHash' in dbOrLookup) {
46
+ // IApiKeyLookup path (works for both SQLite and PostgreSQL)
47
+ const lookup = dbOrLookup;
48
+ const row = await lookup.findByHash(keyHash);
49
+ if (!row) {
50
+ return c.json({ error: 'Invalid or revoked API key', status: 401 }, 401);
51
+ }
52
+ if (row.expiresAt) {
53
+ const now = Math.floor(Date.now() / 1000);
54
+ if (now > row.expiresAt) {
55
+ return c.json({ error: 'This API key has been rotated and is no longer valid. Please use the new key.', status: 401 }, 401);
56
+ }
57
+ }
58
+ // Fire-and-forget lastUsedAt update
59
+ void lookup.updateLastUsed(row.id);
60
+ const scopes = (() => {
61
+ if (Array.isArray(row.scopes))
62
+ return row.scopes;
63
+ try {
64
+ return JSON.parse(row.scopes);
65
+ }
66
+ catch {
67
+ return [];
68
+ }
69
+ })();
70
+ c.set('apiKey', { id: row.id, name: row.name, scopes, tenantId: row.tenantId });
71
+ return next();
72
+ }
73
+ // Legacy SQLite db path (backward compatible)
74
+ const db = dbOrLookup;
43
75
  const row = db
44
76
  .select()
45
77
  .from(apiKeys)
@@ -48,17 +80,17 @@ export function authMiddleware(db, authDisabled) {
48
80
  if (!row) {
49
81
  return c.json({ error: 'Invalid or revoked API key', status: 401 }, 401);
50
82
  }
51
- // Fire-and-forget lastUsedAt update
83
+ if (row.expiresAt) {
84
+ const now = Math.floor(Date.now() / 1000);
85
+ if (now > row.expiresAt) {
86
+ return c.json({ error: 'This API key has been rotated and is no longer valid. Please use the new key.', status: 401 }, 401);
87
+ }
88
+ }
52
89
  const now = Math.floor(Date.now() / 1000);
53
90
  try {
54
- db.update(apiKeys)
55
- .set({ lastUsedAt: now })
56
- .where(eq(apiKeys.id, row.id))
57
- .run();
58
- }
59
- catch {
60
- // Non-critical — don't fail the request
91
+ db.update(apiKeys).set({ lastUsedAt: now }).where(eq(apiKeys.id, row.id)).run();
61
92
  }
93
+ catch { /* non-critical */ }
62
94
  const scopes = (() => {
63
95
  try {
64
96
  return JSON.parse(row.scopes);
@@ -67,12 +99,7 @@ export function authMiddleware(db, authDisabled) {
67
99
  return [];
68
100
  }
69
101
  })();
70
- c.set('apiKey', {
71
- id: row.id,
72
- name: row.name,
73
- scopes,
74
- tenantId: row.tenantId,
75
- });
102
+ c.set('apiKey', { id: row.id, name: row.name, scopes, tenantId: row.tenantId });
76
103
  return next();
77
104
  });
78
105
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * SH-3: Global Body Limit Middleware
3
+ *
4
+ * Applies a 1MB default body size limit to all API routes.
5
+ * Individual routes can override with their own bodyLimit (e.g., events uses 10MB).
6
+ */
7
+ /** 1MB default body limit for API routes */
8
+ export declare const apiBodyLimit: import("hono").MiddlewareHandler;
9
+ //# sourceMappingURL=body-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/body-limit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,4CAA4C;AAC5C,eAAO,MAAM,YAAY,kCAQvB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SH-3: Global Body Limit Middleware
3
+ *
4
+ * Applies a 1MB default body size limit to all API routes.
5
+ * Individual routes can override with their own bodyLimit (e.g., events uses 10MB).
6
+ */
7
+ import { bodyLimit } from 'hono/body-limit';
8
+ /** 1MB default body limit for API routes */
9
+ export const apiBodyLimit = bodyLimit({
10
+ maxSize: 1 * 1024 * 1024, // 1MB
11
+ onError: (c) => {
12
+ return c.json({ error: 'Request body too large', status: 413, maxSize: '1MB' }, 413);
13
+ },
14
+ });
15
+ //# sourceMappingURL=body-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-limit.js","sourceRoot":"","sources":["../../src/middleware/body-limit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC;IACpC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,MAAM;IAChC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,wBAAwB,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAChE,GAAG,CACJ,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * SH-4: CORS Hardening — explicit origin callback for hono/cors.
3
+ *
4
+ * Reads CORS_ORIGINS (comma-separated) and builds an origin callback that:
5
+ * - Rejects unlisted origins (returns empty string → no CORS headers)
6
+ * - Blocks wildcard '*' in production
7
+ * - Auto-allows http://localhost:* in dev mode
8
+ * - Supports credentials, explicit allowed/exposed headers, and maxAge
9
+ */
10
+ /** Local mirror of hono/cors CORSOptions (not exported by the package). */
11
+ type CorsOptions = {
12
+ origin: string | string[] | ((origin: string) => string);
13
+ allowMethods?: string[];
14
+ allowHeaders?: string[];
15
+ maxAge?: number;
16
+ credentials?: boolean;
17
+ exposeHeaders?: string[];
18
+ };
19
+ export interface CorsConfig {
20
+ /** Comma-separated allowed origins, or a single origin */
21
+ corsOrigins?: string;
22
+ /** NODE_ENV value */
23
+ nodeEnv?: string;
24
+ }
25
+ /**
26
+ * Build hono/cors options with an explicit origin callback.
27
+ */
28
+ export declare function buildCorsOptions(config: CorsConfig): CorsOptions;
29
+ export {};
30
+ //# sourceMappingURL=cors-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors-config.d.ts","sourceRoot":"","sources":["../../src/middleware/cors-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,2EAA2E;AAC3E,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IACzD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAcD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAoChE"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * SH-4: CORS Hardening — explicit origin callback for hono/cors.
3
+ *
4
+ * Reads CORS_ORIGINS (comma-separated) and builds an origin callback that:
5
+ * - Rejects unlisted origins (returns empty string → no CORS headers)
6
+ * - Blocks wildcard '*' in production
7
+ * - Auto-allows http://localhost:* in dev mode
8
+ * - Supports credentials, explicit allowed/exposed headers, and maxAge
9
+ */
10
+ /**
11
+ * Parse CORS_ORIGINS env var into a Set of allowed origins.
12
+ */
13
+ function parseOrigins(raw) {
14
+ if (!raw)
15
+ return new Set();
16
+ return new Set(raw.split(',')
17
+ .map(o => o.trim())
18
+ .filter(Boolean));
19
+ }
20
+ /**
21
+ * Build hono/cors options with an explicit origin callback.
22
+ */
23
+ export function buildCorsOptions(config) {
24
+ const isDev = config.nodeEnv !== 'production';
25
+ const origins = parseOrigins(config.corsOrigins);
26
+ // Block wildcard in production
27
+ if (!isDev && origins.has('*')) {
28
+ throw new Error('CORS wildcard (*) is not allowed in production. ' +
29
+ 'Set CORS_ORIGINS to specific origins.');
30
+ }
31
+ return {
32
+ origin: (requestOrigin) => {
33
+ // No origin header (e.g. same-origin, server-to-server) — allow
34
+ if (!requestOrigin)
35
+ return requestOrigin;
36
+ // Exact match
37
+ if (origins.has(requestOrigin))
38
+ return requestOrigin;
39
+ // Wildcard in dev
40
+ if (isDev && origins.has('*'))
41
+ return requestOrigin;
42
+ // Dev mode: auto-allow localhost on any port
43
+ if (isDev && /^https?:\/\/localhost(:\d+)?$/.test(requestOrigin)) {
44
+ return requestOrigin;
45
+ }
46
+ // Reject — return empty string so hono/cors omits CORS headers
47
+ return '';
48
+ },
49
+ credentials: true,
50
+ allowHeaders: ['Authorization', 'Content-Type', 'X-Request-ID'],
51
+ exposeHeaders: ['X-RateLimit-Limit', 'X-RateLimit-Remaining', 'X-RateLimit-Reset'],
52
+ maxAge: 86400,
53
+ };
54
+ }
55
+ //# sourceMappingURL=cors-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors-config.js","sourceRoot":"","sources":["../../src/middleware/cors-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH;;GAEG;AACH,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC3B,OAAO,IAAI,GAAG,CACZ,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAClB,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IACjD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,KAAK,YAAY,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEjD,+BAA+B;IAC/B,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,kDAAkD;YAClD,uCAAuC,CACxC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,CAAC,aAAqB,EAAE,EAAE;YAChC,gEAAgE;YAChE,IAAI,CAAC,aAAa;gBAAE,OAAO,aAAa,CAAC;YAEzC,cAAc;YACd,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;gBAAE,OAAO,aAAa,CAAC;YAErD,kBAAkB;YAClB,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,aAAa,CAAC;YAEpD,6CAA6C;YAC7C,IAAI,KAAK,IAAI,+BAA+B,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjE,OAAO,aAAa,CAAC;YACvB,CAAC;YAED,+DAA+D;YAC/D,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,cAAc,CAAC;QAC/D,aAAa,EAAE,CAAC,mBAAmB,EAAE,uBAAuB,EAAE,mBAAmB,CAAC;QAClF,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Rate-limiting middleware for auth and API endpoints.
3
+ * Uses hono-rate-limiter with in-memory store.
4
+ *
5
+ * @module middleware/rate-limit
6
+ */
7
+ export declare const authRateLimit: import("hono").MiddlewareHandler<import("hono").Env, string, import("hono").Input, Response>;
8
+ export declare const apiRateLimit: import("hono").MiddlewareHandler<import("hono").Env, string, import("hono").Input, Response>;
9
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0BH,eAAO,MAAM,aAAa,8FAWxB,CAAC;AAOH,eAAO,MAAM,YAAY,8FAkBvB,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Rate-limiting middleware for auth and API endpoints.
3
+ * Uses hono-rate-limiter with in-memory store.
4
+ *
5
+ * @module middleware/rate-limit
6
+ */
7
+ import { rateLimiter } from 'hono-rate-limiter';
8
+ import { createLogger } from '../lib/logger.js';
9
+ const log = createLogger('RateLimit');
10
+ // ─── Helpers ─────────────────────────────────────────────
11
+ /**
12
+ * Extract client IP using x-forwarded-for → cf-connecting-ip → 'unknown'.
13
+ */
14
+ function getClientIp(c) {
15
+ return (c.req.header('x-forwarded-for')?.split(',')[0]?.trim() ||
16
+ c.req.header('cf-connecting-ip') ||
17
+ 'unknown');
18
+ }
19
+ // ─── Auth rate limiter ───────────────────────────────────
20
+ const AUTH_MAX = Number(process.env['RATE_LIMIT_AUTH_MAX'] ?? 20);
21
+ const AUTH_WINDOW_MS = Number(process.env['RATE_LIMIT_AUTH_WINDOW_MS'] ?? 15 * 60 * 1000);
22
+ export const authRateLimit = rateLimiter({
23
+ windowMs: AUTH_WINDOW_MS,
24
+ limit: AUTH_MAX,
25
+ standardHeaders: 'draft-7',
26
+ keyGenerator: (c) => `auth:${getClientIp(c)}`,
27
+ handler: (c) => {
28
+ const ip = getClientIp(c);
29
+ const route = new URL(c.req.url).pathname;
30
+ log.warn('Auth rate limit exceeded', { ip, route });
31
+ return c.json({ error: 'Too Many Requests' }, 429);
32
+ },
33
+ });
34
+ // ─── API rate limiter ────────────────────────────────────
35
+ const API_MAX = Number(process.env['RATE_LIMIT_API_MAX'] ?? 200);
36
+ const API_WINDOW_MS = Number(process.env['RATE_LIMIT_API_WINDOW_MS'] ?? 60 * 1000);
37
+ export const apiRateLimit = rateLimiter({
38
+ windowMs: API_WINDOW_MS,
39
+ limit: API_MAX,
40
+ standardHeaders: 'draft-7',
41
+ keyGenerator: (c) => {
42
+ // Prefer API key from Authorization header, fall back to IP
43
+ const authHeader = c.req.header('authorization');
44
+ if (authHeader?.startsWith('Bearer ')) {
45
+ return `api:${authHeader.slice(7)}`;
46
+ }
47
+ return `api:${getClientIp(c)}`;
48
+ },
49
+ handler: (c) => {
50
+ const ip = getClientIp(c);
51
+ const route = new URL(c.req.url).pathname;
52
+ log.warn('API rate limit exceeded', { ip, route });
53
+ return c.json({ error: 'Too Many Requests' }, 429);
54
+ },
55
+ });
56
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;AAEtC,4DAA4D;AAE5D;;GAEG;AACH,SAAS,WAAW,CAAC,CAAU;IAC7B,OAAO,CACL,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;QACtD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC;QAChC,SAAS,CACV,CAAC;AACJ,CAAC;AAED,4DAA4D;AAE5D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC,CAAC;AAClE,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AAE1F,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;IACvC,QAAQ,EAAE,cAAc;IACxB,KAAK,EAAE,QAAQ;IACf,eAAe,EAAE,SAAS;IAC1B,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,WAAW,CAAC,CAAC,CAAC,EAAE;IAC7C,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;CACF,CAAC,CAAC;AAEH,4DAA4D;AAE5D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,GAAG,CAAC,CAAC;AACjE,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;AAEnF,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;IACtC,QAAQ,EAAE,aAAa;IACvB,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,SAAS;IAC1B,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;QAClB,4DAA4D;QAC5D,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACjD,IAAI,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,OAAO,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACb,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * RBAC Enforcement Middleware [F2-S2]
3
+ *
4
+ * Hono middleware factories that read c.var.auth.role (set by unified-auth)
5
+ * and enforce permission categories using the existing cloud/auth/rbac.ts module.
6
+ */
7
+ import { type ActionCategory } from '../cloud/auth/rbac.js';
8
+ import type { UnifiedAuthVariables } from './unified-auth.js';
9
+ /**
10
+ * Require a minimum action category for the route.
11
+ * Reads role from c.var.auth.role (set by unified-auth).
12
+ */
13
+ export declare function requireCategory(category: ActionCategory): import("hono").MiddlewareHandler<{
14
+ Variables: UnifiedAuthVariables;
15
+ }, string, {}, Response>;
16
+ /**
17
+ * Auto-categorize by HTTP method.
18
+ * GET/HEAD/OPTIONS → read; all others → write
19
+ */
20
+ export declare function requireMethodCategory(): import("hono").MiddlewareHandler<{
21
+ Variables: UnifiedAuthVariables;
22
+ }, string, {}, Response>;
23
+ /**
24
+ * Map specific HTTP methods to action categories.
25
+ * Unlisted methods default to 'write'.
26
+ */
27
+ export declare function requireCategoryByMethod(mapping: Partial<Record<string, ActionCategory>>): import("hono").MiddlewareHandler<{
28
+ Variables: UnifiedAuthVariables;
29
+ }, string, {}, Response>;
30
+ //# sourceMappingURL=rbac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../../src/middleware/rbac.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAoC,KAAK,cAAc,EAAa,MAAM,uBAAuB,CAAC;AAEzG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAe9D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc;eACjB,oBAAoB;yBAgB1D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB;eACE,oBAAoB;yBAoB1D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;eACjD,oBAAoB;yBAmB1D"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * RBAC Enforcement Middleware [F2-S2]
3
+ *
4
+ * Hono middleware factories that read c.var.auth.role (set by unified-auth)
5
+ * and enforce permission categories using the existing cloud/auth/rbac.ts module.
6
+ */
7
+ import { createMiddleware } from 'hono/factory';
8
+ import { isRoleAllowed, PERMISSION_MATRIX } from '../cloud/auth/rbac.js';
9
+ import { authRequired, insufficientPermissions } from './auth-errors.js';
10
+ /**
11
+ * Get the minimum role required for a given action category.
12
+ */
13
+ function minRoleForCategory(category) {
14
+ const roles = PERMISSION_MATRIX[category];
15
+ // Return the least-privileged role in the list
16
+ const hierarchy = ['viewer', 'member', 'admin', 'owner'];
17
+ for (const r of hierarchy) {
18
+ if (roles.includes(r))
19
+ return r;
20
+ }
21
+ return 'owner';
22
+ }
23
+ /**
24
+ * Require a minimum action category for the route.
25
+ * Reads role from c.var.auth.role (set by unified-auth).
26
+ */
27
+ export function requireCategory(category) {
28
+ return createMiddleware(async (c, next) => {
29
+ const auth = c.var.auth;
30
+ if (!auth) {
31
+ return authRequired(c);
32
+ }
33
+ if (!isRoleAllowed(auth.role, category)) {
34
+ return insufficientPermissions(c, {
35
+ required: minRoleForCategory(category),
36
+ current: auth.role,
37
+ hint: `This action requires '${minRoleForCategory(category)}' role or higher. Your current role is '${auth.role}'.`,
38
+ });
39
+ }
40
+ return next();
41
+ });
42
+ }
43
+ /**
44
+ * Auto-categorize by HTTP method.
45
+ * GET/HEAD/OPTIONS → read; all others → write
46
+ */
47
+ export function requireMethodCategory() {
48
+ return createMiddleware(async (c, next) => {
49
+ const auth = c.var.auth;
50
+ if (!auth) {
51
+ return authRequired(c);
52
+ }
53
+ const method = c.req.method;
54
+ const category = ['GET', 'HEAD', 'OPTIONS'].includes(method) ? 'read' : 'write';
55
+ if (!isRoleAllowed(auth.role, category)) {
56
+ return insufficientPermissions(c, {
57
+ required: minRoleForCategory(category),
58
+ current: auth.role,
59
+ hint: `${method} requires '${minRoleForCategory(category)}' role. Your role is '${auth.role}'.`,
60
+ });
61
+ }
62
+ return next();
63
+ });
64
+ }
65
+ /**
66
+ * Map specific HTTP methods to action categories.
67
+ * Unlisted methods default to 'write'.
68
+ */
69
+ export function requireCategoryByMethod(mapping) {
70
+ return createMiddleware(async (c, next) => {
71
+ const auth = c.var.auth;
72
+ if (!auth) {
73
+ return authRequired(c);
74
+ }
75
+ const method = c.req.method;
76
+ const category = mapping[method] ?? 'write';
77
+ if (!isRoleAllowed(auth.role, category)) {
78
+ return insufficientPermissions(c, {
79
+ required: minRoleForCategory(category),
80
+ current: auth.role,
81
+ hint: `${method} on this resource requires '${minRoleForCategory(category)}' role. Your role is '${auth.role}'.`,
82
+ });
83
+ }
84
+ return next();
85
+ });
86
+ }
87
+ //# sourceMappingURL=rbac.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.js","sourceRoot":"","sources":["../../src/middleware/rbac.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * SH-5: CSP & Security Headers middleware.
3
+ *
4
+ * Applies security headers to ALL responses. Must be registered as the
5
+ * first middleware in the stack.
6
+ *
7
+ * CSP policy is overridable via the `CSP_POLICY` environment variable.
8
+ * When set, the raw string replaces the built-in CSP object.
9
+ */
10
+ import type { MiddlewareHandler } from 'hono';
11
+ export declare function securityHeadersMiddleware(): MiddlewareHandler;
12
+ //# sourceMappingURL=security-headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-headers.d.ts","sourceRoot":"","sources":["../../src/middleware/security-headers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAO9C,wBAAgB,yBAAyB,IAAI,iBAAiB,CA8C7D"}