palaryn 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (607) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +716 -0
  3. package/dist/sdk/typescript/src/client.d.ts +71 -0
  4. package/dist/sdk/typescript/src/client.d.ts.map +1 -0
  5. package/dist/sdk/typescript/src/client.js +176 -0
  6. package/dist/sdk/typescript/src/client.js.map +1 -0
  7. package/dist/sdk/typescript/src/errors.d.ts +50 -0
  8. package/dist/sdk/typescript/src/errors.d.ts.map +1 -0
  9. package/dist/sdk/typescript/src/errors.js +103 -0
  10. package/dist/sdk/typescript/src/errors.js.map +1 -0
  11. package/dist/sdk/typescript/src/index.d.ts +4 -0
  12. package/dist/sdk/typescript/src/index.d.ts.map +1 -0
  13. package/dist/sdk/typescript/src/index.js +15 -0
  14. package/dist/sdk/typescript/src/index.js.map +1 -0
  15. package/dist/sdk/typescript/src/types.d.ts +101 -0
  16. package/dist/sdk/typescript/src/types.d.ts.map +1 -0
  17. package/dist/sdk/typescript/src/types.js +6 -0
  18. package/dist/sdk/typescript/src/types.js.map +1 -0
  19. package/dist/src/admin/index.d.ts +2 -0
  20. package/dist/src/admin/index.d.ts.map +1 -0
  21. package/dist/src/admin/index.js +6 -0
  22. package/dist/src/admin/index.js.map +1 -0
  23. package/dist/src/admin/routes.d.ts +5 -0
  24. package/dist/src/admin/routes.d.ts.map +1 -0
  25. package/dist/src/admin/routes.js +471 -0
  26. package/dist/src/admin/routes.js.map +1 -0
  27. package/dist/src/admin/templates.d.ts +51 -0
  28. package/dist/src/admin/templates.d.ts.map +1 -0
  29. package/dist/src/admin/templates.js +500 -0
  30. package/dist/src/admin/templates.js.map +1 -0
  31. package/dist/src/anomaly/detector.d.ts +141 -0
  32. package/dist/src/anomaly/detector.d.ts.map +1 -0
  33. package/dist/src/anomaly/detector.js +554 -0
  34. package/dist/src/anomaly/detector.js.map +1 -0
  35. package/dist/src/anomaly/index.d.ts +2 -0
  36. package/dist/src/anomaly/index.d.ts.map +1 -0
  37. package/dist/src/anomaly/index.js +7 -0
  38. package/dist/src/anomaly/index.js.map +1 -0
  39. package/dist/src/approval/manager.d.ts +147 -0
  40. package/dist/src/approval/manager.d.ts.map +1 -0
  41. package/dist/src/approval/manager.js +511 -0
  42. package/dist/src/approval/manager.js.map +1 -0
  43. package/dist/src/approval/webhook.d.ts +36 -0
  44. package/dist/src/approval/webhook.d.ts.map +1 -0
  45. package/dist/src/approval/webhook.js +135 -0
  46. package/dist/src/approval/webhook.js.map +1 -0
  47. package/dist/src/audit/logger.d.ts +70 -0
  48. package/dist/src/audit/logger.d.ts.map +1 -0
  49. package/dist/src/audit/logger.js +440 -0
  50. package/dist/src/audit/logger.js.map +1 -0
  51. package/dist/src/auth/index.d.ts +6 -0
  52. package/dist/src/auth/index.d.ts.map +1 -0
  53. package/dist/src/auth/index.js +22 -0
  54. package/dist/src/auth/index.js.map +1 -0
  55. package/dist/src/auth/password.d.ts +3 -0
  56. package/dist/src/auth/password.d.ts.map +1 -0
  57. package/dist/src/auth/password.js +25 -0
  58. package/dist/src/auth/password.js.map +1 -0
  59. package/dist/src/auth/pkce.d.ts +13 -0
  60. package/dist/src/auth/pkce.d.ts.map +1 -0
  61. package/dist/src/auth/pkce.js +58 -0
  62. package/dist/src/auth/pkce.js.map +1 -0
  63. package/dist/src/auth/providers.d.ts +28 -0
  64. package/dist/src/auth/providers.d.ts.map +1 -0
  65. package/dist/src/auth/providers.js +198 -0
  66. package/dist/src/auth/providers.js.map +1 -0
  67. package/dist/src/auth/routes.d.ts +14 -0
  68. package/dist/src/auth/routes.d.ts.map +1 -0
  69. package/dist/src/auth/routes.js +431 -0
  70. package/dist/src/auth/routes.js.map +1 -0
  71. package/dist/src/auth/session.d.ts +24 -0
  72. package/dist/src/auth/session.d.ts.map +1 -0
  73. package/dist/src/auth/session.js +105 -0
  74. package/dist/src/auth/session.js.map +1 -0
  75. package/dist/src/billing/index.d.ts +7 -0
  76. package/dist/src/billing/index.d.ts.map +1 -0
  77. package/dist/src/billing/index.js +14 -0
  78. package/dist/src/billing/index.js.map +1 -0
  79. package/dist/src/billing/plan-enforcer.d.ts +44 -0
  80. package/dist/src/billing/plan-enforcer.d.ts.map +1 -0
  81. package/dist/src/billing/plan-enforcer.js +110 -0
  82. package/dist/src/billing/plan-enforcer.js.map +1 -0
  83. package/dist/src/billing/routes.d.ts +15 -0
  84. package/dist/src/billing/routes.d.ts.map +1 -0
  85. package/dist/src/billing/routes.js +193 -0
  86. package/dist/src/billing/routes.js.map +1 -0
  87. package/dist/src/billing/stripe-client.d.ts +14 -0
  88. package/dist/src/billing/stripe-client.d.ts.map +1 -0
  89. package/dist/src/billing/stripe-client.js +51 -0
  90. package/dist/src/billing/stripe-client.js.map +1 -0
  91. package/dist/src/billing/webhook-handler.d.ts +19 -0
  92. package/dist/src/billing/webhook-handler.d.ts.map +1 -0
  93. package/dist/src/billing/webhook-handler.js +169 -0
  94. package/dist/src/billing/webhook-handler.js.map +1 -0
  95. package/dist/src/billing/webhook-routes.d.ts +5 -0
  96. package/dist/src/billing/webhook-routes.d.ts.map +1 -0
  97. package/dist/src/billing/webhook-routes.js +30 -0
  98. package/dist/src/billing/webhook-routes.js.map +1 -0
  99. package/dist/src/budget/manager.d.ts +95 -0
  100. package/dist/src/budget/manager.d.ts.map +1 -0
  101. package/dist/src/budget/manager.js +547 -0
  102. package/dist/src/budget/manager.js.map +1 -0
  103. package/dist/src/budget/usage-extractor.d.ts +38 -0
  104. package/dist/src/budget/usage-extractor.d.ts.map +1 -0
  105. package/dist/src/budget/usage-extractor.js +165 -0
  106. package/dist/src/budget/usage-extractor.js.map +1 -0
  107. package/dist/src/cli.d.ts +3 -0
  108. package/dist/src/cli.d.ts.map +1 -0
  109. package/dist/src/cli.js +115 -0
  110. package/dist/src/cli.js.map +1 -0
  111. package/dist/src/config/defaults.d.ts +3 -0
  112. package/dist/src/config/defaults.d.ts.map +1 -0
  113. package/dist/src/config/defaults.js +243 -0
  114. package/dist/src/config/defaults.js.map +1 -0
  115. package/dist/src/config/validate.d.ts +15 -0
  116. package/dist/src/config/validate.d.ts.map +1 -0
  117. package/dist/src/config/validate.js +105 -0
  118. package/dist/src/config/validate.js.map +1 -0
  119. package/dist/src/dlp/composite-scanner.d.ts +47 -0
  120. package/dist/src/dlp/composite-scanner.d.ts.map +1 -0
  121. package/dist/src/dlp/composite-scanner.js +186 -0
  122. package/dist/src/dlp/composite-scanner.js.map +1 -0
  123. package/dist/src/dlp/index.d.ts +10 -0
  124. package/dist/src/dlp/index.d.ts.map +1 -0
  125. package/dist/src/dlp/index.js +26 -0
  126. package/dist/src/dlp/index.js.map +1 -0
  127. package/dist/src/dlp/interfaces.d.ts +33 -0
  128. package/dist/src/dlp/interfaces.d.ts.map +1 -0
  129. package/dist/src/dlp/interfaces.js +3 -0
  130. package/dist/src/dlp/interfaces.js.map +1 -0
  131. package/dist/src/dlp/patterns.d.ts +9 -0
  132. package/dist/src/dlp/patterns.d.ts.map +1 -0
  133. package/dist/src/dlp/patterns.js +25 -0
  134. package/dist/src/dlp/patterns.js.map +1 -0
  135. package/dist/src/dlp/prompt-injection-backend.d.ts +68 -0
  136. package/dist/src/dlp/prompt-injection-backend.d.ts.map +1 -0
  137. package/dist/src/dlp/prompt-injection-backend.js +148 -0
  138. package/dist/src/dlp/prompt-injection-backend.js.map +1 -0
  139. package/dist/src/dlp/prompt-injection-patterns.d.ts +32 -0
  140. package/dist/src/dlp/prompt-injection-patterns.d.ts.map +1 -0
  141. package/dist/src/dlp/prompt-injection-patterns.js +290 -0
  142. package/dist/src/dlp/prompt-injection-patterns.js.map +1 -0
  143. package/dist/src/dlp/regex-backend.d.ts +32 -0
  144. package/dist/src/dlp/regex-backend.d.ts.map +1 -0
  145. package/dist/src/dlp/regex-backend.js +153 -0
  146. package/dist/src/dlp/regex-backend.js.map +1 -0
  147. package/dist/src/dlp/scanner.d.ts +122 -0
  148. package/dist/src/dlp/scanner.d.ts.map +1 -0
  149. package/dist/src/dlp/scanner.js +444 -0
  150. package/dist/src/dlp/scanner.js.map +1 -0
  151. package/dist/src/dlp/text-normalizer.d.ts +41 -0
  152. package/dist/src/dlp/text-normalizer.d.ts.map +1 -0
  153. package/dist/src/dlp/text-normalizer.js +203 -0
  154. package/dist/src/dlp/text-normalizer.js.map +1 -0
  155. package/dist/src/dlp/trufflehog-backend.d.ts +64 -0
  156. package/dist/src/dlp/trufflehog-backend.d.ts.map +1 -0
  157. package/dist/src/dlp/trufflehog-backend.js +151 -0
  158. package/dist/src/dlp/trufflehog-backend.js.map +1 -0
  159. package/dist/src/executor/http-executor.d.ts +25 -0
  160. package/dist/src/executor/http-executor.d.ts.map +1 -0
  161. package/dist/src/executor/http-executor.js +333 -0
  162. package/dist/src/executor/http-executor.js.map +1 -0
  163. package/dist/src/executor/index.d.ts +6 -0
  164. package/dist/src/executor/index.d.ts.map +1 -0
  165. package/dist/src/executor/index.js +12 -0
  166. package/dist/src/executor/index.js.map +1 -0
  167. package/dist/src/executor/interfaces.d.ts +11 -0
  168. package/dist/src/executor/interfaces.d.ts.map +1 -0
  169. package/dist/src/executor/interfaces.js +3 -0
  170. package/dist/src/executor/interfaces.js.map +1 -0
  171. package/dist/src/executor/noop-executor.d.ts +13 -0
  172. package/dist/src/executor/noop-executor.d.ts.map +1 -0
  173. package/dist/src/executor/noop-executor.js +21 -0
  174. package/dist/src/executor/noop-executor.js.map +1 -0
  175. package/dist/src/executor/registry.d.ts +30 -0
  176. package/dist/src/executor/registry.d.ts.map +1 -0
  177. package/dist/src/executor/registry.js +62 -0
  178. package/dist/src/executor/registry.js.map +1 -0
  179. package/dist/src/executor/slack-executor.d.ts +24 -0
  180. package/dist/src/executor/slack-executor.d.ts.map +1 -0
  181. package/dist/src/executor/slack-executor.js +147 -0
  182. package/dist/src/executor/slack-executor.js.map +1 -0
  183. package/dist/src/index.d.ts +25 -0
  184. package/dist/src/index.d.ts.map +1 -0
  185. package/dist/src/index.js +74 -0
  186. package/dist/src/index.js.map +1 -0
  187. package/dist/src/mcp/auth-verifier.d.ts +23 -0
  188. package/dist/src/mcp/auth-verifier.d.ts.map +1 -0
  189. package/dist/src/mcp/auth-verifier.js +162 -0
  190. package/dist/src/mcp/auth-verifier.js.map +1 -0
  191. package/dist/src/mcp/bridge.d.ts +132 -0
  192. package/dist/src/mcp/bridge.d.ts.map +1 -0
  193. package/dist/src/mcp/bridge.js +734 -0
  194. package/dist/src/mcp/bridge.js.map +1 -0
  195. package/dist/src/mcp/http-transport.d.ts +32 -0
  196. package/dist/src/mcp/http-transport.d.ts.map +1 -0
  197. package/dist/src/mcp/http-transport.js +538 -0
  198. package/dist/src/mcp/http-transport.js.map +1 -0
  199. package/dist/src/mcp/index.d.ts +10 -0
  200. package/dist/src/mcp/index.d.ts.map +1 -0
  201. package/dist/src/mcp/index.js +17 -0
  202. package/dist/src/mcp/index.js.map +1 -0
  203. package/dist/src/mcp/oauth-pages.d.ts +23 -0
  204. package/dist/src/mcp/oauth-pages.d.ts.map +1 -0
  205. package/dist/src/mcp/oauth-pages.js +121 -0
  206. package/dist/src/mcp/oauth-pages.js.map +1 -0
  207. package/dist/src/mcp/oauth-postgres-stores.d.ts +55 -0
  208. package/dist/src/mcp/oauth-postgres-stores.d.ts.map +1 -0
  209. package/dist/src/mcp/oauth-postgres-stores.js +226 -0
  210. package/dist/src/mcp/oauth-postgres-stores.js.map +1 -0
  211. package/dist/src/mcp/oauth-provider.d.ts +95 -0
  212. package/dist/src/mcp/oauth-provider.d.ts.map +1 -0
  213. package/dist/src/mcp/oauth-provider.js +360 -0
  214. package/dist/src/mcp/oauth-provider.js.map +1 -0
  215. package/dist/src/mcp/oauth-stores.d.ts +62 -0
  216. package/dist/src/mcp/oauth-stores.d.ts.map +1 -0
  217. package/dist/src/mcp/oauth-stores.js +154 -0
  218. package/dist/src/mcp/oauth-stores.js.map +1 -0
  219. package/dist/src/mcp/server.d.ts +18 -0
  220. package/dist/src/mcp/server.d.ts.map +1 -0
  221. package/dist/src/mcp/server.js +51 -0
  222. package/dist/src/mcp/server.js.map +1 -0
  223. package/dist/src/metrics/collector.d.ts +106 -0
  224. package/dist/src/metrics/collector.d.ts.map +1 -0
  225. package/dist/src/metrics/collector.js +311 -0
  226. package/dist/src/metrics/collector.js.map +1 -0
  227. package/dist/src/metrics/index.d.ts +2 -0
  228. package/dist/src/metrics/index.d.ts.map +1 -0
  229. package/dist/src/metrics/index.js +6 -0
  230. package/dist/src/metrics/index.js.map +1 -0
  231. package/dist/src/middleware/auth.d.ts +77 -0
  232. package/dist/src/middleware/auth.d.ts.map +1 -0
  233. package/dist/src/middleware/auth.js +720 -0
  234. package/dist/src/middleware/auth.js.map +1 -0
  235. package/dist/src/middleware/session.d.ts +18 -0
  236. package/dist/src/middleware/session.d.ts.map +1 -0
  237. package/dist/src/middleware/session.js +67 -0
  238. package/dist/src/middleware/session.js.map +1 -0
  239. package/dist/src/middleware/validate.d.ts +3 -0
  240. package/dist/src/middleware/validate.d.ts.map +1 -0
  241. package/dist/src/middleware/validate.js +85 -0
  242. package/dist/src/middleware/validate.js.map +1 -0
  243. package/dist/src/policy/engine.d.ts +107 -0
  244. package/dist/src/policy/engine.d.ts.map +1 -0
  245. package/dist/src/policy/engine.js +646 -0
  246. package/dist/src/policy/engine.js.map +1 -0
  247. package/dist/src/policy/index.d.ts +3 -0
  248. package/dist/src/policy/index.d.ts.map +1 -0
  249. package/dist/src/policy/index.js +8 -0
  250. package/dist/src/policy/index.js.map +1 -0
  251. package/dist/src/policy/opa-engine.d.ts +176 -0
  252. package/dist/src/policy/opa-engine.d.ts.map +1 -0
  253. package/dist/src/policy/opa-engine.js +790 -0
  254. package/dist/src/policy/opa-engine.js.map +1 -0
  255. package/dist/src/proxy/forward-proxy.d.ts +30 -0
  256. package/dist/src/proxy/forward-proxy.d.ts.map +1 -0
  257. package/dist/src/proxy/forward-proxy.js +580 -0
  258. package/dist/src/proxy/forward-proxy.js.map +1 -0
  259. package/dist/src/proxy/index.d.ts +2 -0
  260. package/dist/src/proxy/index.d.ts.map +1 -0
  261. package/dist/src/proxy/index.js +8 -0
  262. package/dist/src/proxy/index.js.map +1 -0
  263. package/dist/src/ratelimit/limiter.d.ts +45 -0
  264. package/dist/src/ratelimit/limiter.d.ts.map +1 -0
  265. package/dist/src/ratelimit/limiter.js +158 -0
  266. package/dist/src/ratelimit/limiter.js.map +1 -0
  267. package/dist/src/replay/engine.d.ts +40 -0
  268. package/dist/src/replay/engine.d.ts.map +1 -0
  269. package/dist/src/replay/engine.js +106 -0
  270. package/dist/src/replay/engine.js.map +1 -0
  271. package/dist/src/replay/index.d.ts +2 -0
  272. package/dist/src/replay/index.d.ts.map +1 -0
  273. package/dist/src/replay/index.js +6 -0
  274. package/dist/src/replay/index.js.map +1 -0
  275. package/dist/src/saas/index.d.ts +2 -0
  276. package/dist/src/saas/index.d.ts.map +1 -0
  277. package/dist/src/saas/index.js +18 -0
  278. package/dist/src/saas/index.js.map +1 -0
  279. package/dist/src/saas/routes.d.ts +18 -0
  280. package/dist/src/saas/routes.d.ts.map +1 -0
  281. package/dist/src/saas/routes.js +1566 -0
  282. package/dist/src/saas/routes.js.map +1 -0
  283. package/dist/src/server/app.d.ts +44 -0
  284. package/dist/src/server/app.d.ts.map +1 -0
  285. package/dist/src/server/app.js +854 -0
  286. package/dist/src/server/app.js.map +1 -0
  287. package/dist/src/server/errors.d.ts +32 -0
  288. package/dist/src/server/errors.d.ts.map +1 -0
  289. package/dist/src/server/errors.js +39 -0
  290. package/dist/src/server/errors.js.map +1 -0
  291. package/dist/src/server/gateway.d.ts +165 -0
  292. package/dist/src/server/gateway.d.ts.map +1 -0
  293. package/dist/src/server/gateway.js +964 -0
  294. package/dist/src/server/gateway.js.map +1 -0
  295. package/dist/src/server/index.d.ts +2 -0
  296. package/dist/src/server/index.d.ts.map +1 -0
  297. package/dist/src/server/index.js +295 -0
  298. package/dist/src/server/index.js.map +1 -0
  299. package/dist/src/server/logger.d.ts +33 -0
  300. package/dist/src/server/logger.d.ts.map +1 -0
  301. package/dist/src/server/logger.js +230 -0
  302. package/dist/src/server/logger.js.map +1 -0
  303. package/dist/src/server/stream-proxy.d.ts +32 -0
  304. package/dist/src/server/stream-proxy.d.ts.map +1 -0
  305. package/dist/src/server/stream-proxy.js +184 -0
  306. package/dist/src/server/stream-proxy.js.map +1 -0
  307. package/dist/src/storage/file-persistence.d.ts +48 -0
  308. package/dist/src/storage/file-persistence.d.ts.map +1 -0
  309. package/dist/src/storage/file-persistence.js +280 -0
  310. package/dist/src/storage/file-persistence.js.map +1 -0
  311. package/dist/src/storage/index.d.ts +5 -0
  312. package/dist/src/storage/index.d.ts.map +1 -0
  313. package/dist/src/storage/index.js +21 -0
  314. package/dist/src/storage/index.js.map +1 -0
  315. package/dist/src/storage/interfaces.d.ts +237 -0
  316. package/dist/src/storage/interfaces.d.ts.map +1 -0
  317. package/dist/src/storage/interfaces.js +3 -0
  318. package/dist/src/storage/interfaces.js.map +1 -0
  319. package/dist/src/storage/memory.d.ts +162 -0
  320. package/dist/src/storage/memory.d.ts.map +1 -0
  321. package/dist/src/storage/memory.js +603 -0
  322. package/dist/src/storage/memory.js.map +1 -0
  323. package/dist/src/storage/postgres.d.ts +267 -0
  324. package/dist/src/storage/postgres.d.ts.map +1 -0
  325. package/dist/src/storage/postgres.js +1555 -0
  326. package/dist/src/storage/postgres.js.map +1 -0
  327. package/dist/src/storage/redis.d.ts +202 -0
  328. package/dist/src/storage/redis.d.ts.map +1 -0
  329. package/dist/src/storage/redis.js +629 -0
  330. package/dist/src/storage/redis.js.map +1 -0
  331. package/dist/src/tracing/index.d.ts +2 -0
  332. package/dist/src/tracing/index.d.ts.map +1 -0
  333. package/dist/src/tracing/index.js +6 -0
  334. package/dist/src/tracing/index.js.map +1 -0
  335. package/dist/src/tracing/provider.d.ts +43 -0
  336. package/dist/src/tracing/provider.d.ts.map +1 -0
  337. package/dist/src/tracing/provider.js +74 -0
  338. package/dist/src/tracing/provider.js.map +1 -0
  339. package/dist/src/trust/calculator.d.ts +54 -0
  340. package/dist/src/trust/calculator.d.ts.map +1 -0
  341. package/dist/src/trust/calculator.js +102 -0
  342. package/dist/src/trust/calculator.js.map +1 -0
  343. package/dist/src/trust/index.d.ts +2 -0
  344. package/dist/src/trust/index.d.ts.map +1 -0
  345. package/dist/src/trust/index.js +7 -0
  346. package/dist/src/trust/index.js.map +1 -0
  347. package/dist/src/types/budget.d.ts +30 -0
  348. package/dist/src/types/budget.d.ts.map +1 -0
  349. package/dist/src/types/budget.js +3 -0
  350. package/dist/src/types/budget.js.map +1 -0
  351. package/dist/src/types/config.d.ts +176 -0
  352. package/dist/src/types/config.d.ts.map +1 -0
  353. package/dist/src/types/config.js +3 -0
  354. package/dist/src/types/config.js.map +1 -0
  355. package/dist/src/types/events.d.ts +24 -0
  356. package/dist/src/types/events.d.ts.map +1 -0
  357. package/dist/src/types/events.js +3 -0
  358. package/dist/src/types/events.js.map +1 -0
  359. package/dist/src/types/index.d.ts +8 -0
  360. package/dist/src/types/index.d.ts.map +1 -0
  361. package/dist/src/types/index.js +24 -0
  362. package/dist/src/types/index.js.map +1 -0
  363. package/dist/src/types/policy.d.ts +60 -0
  364. package/dist/src/types/policy.d.ts.map +1 -0
  365. package/dist/src/types/policy.js +3 -0
  366. package/dist/src/types/policy.js.map +1 -0
  367. package/dist/src/types/stripe-config.d.ts +12 -0
  368. package/dist/src/types/stripe-config.d.ts.map +1 -0
  369. package/dist/src/types/stripe-config.js +3 -0
  370. package/dist/src/types/stripe-config.js.map +1 -0
  371. package/dist/src/types/subscription.d.ts +24 -0
  372. package/dist/src/types/subscription.d.ts.map +1 -0
  373. package/dist/src/types/subscription.js +38 -0
  374. package/dist/src/types/subscription.js.map +1 -0
  375. package/dist/src/types/tool-call.d.ts +42 -0
  376. package/dist/src/types/tool-call.d.ts.map +1 -0
  377. package/dist/src/types/tool-call.js +3 -0
  378. package/dist/src/types/tool-call.js.map +1 -0
  379. package/dist/src/types/tool-result.d.ts +58 -0
  380. package/dist/src/types/tool-result.d.ts.map +1 -0
  381. package/dist/src/types/tool-result.js +3 -0
  382. package/dist/src/types/tool-result.js.map +1 -0
  383. package/dist/src/types/user.d.ts +101 -0
  384. package/dist/src/types/user.d.ts.map +1 -0
  385. package/dist/src/types/user.js +6 -0
  386. package/dist/src/types/user.js.map +1 -0
  387. package/dist/tests/integration/api.test.d.ts +2 -0
  388. package/dist/tests/integration/api.test.d.ts.map +1 -0
  389. package/dist/tests/integration/api.test.js +1199 -0
  390. package/dist/tests/integration/api.test.js.map +1 -0
  391. package/dist/tests/integration/proxy.test.d.ts +2 -0
  392. package/dist/tests/integration/proxy.test.d.ts.map +1 -0
  393. package/dist/tests/integration/proxy.test.js +251 -0
  394. package/dist/tests/integration/proxy.test.js.map +1 -0
  395. package/dist/tests/integration/storage.test.d.ts +16 -0
  396. package/dist/tests/integration/storage.test.d.ts.map +1 -0
  397. package/dist/tests/integration/storage.test.js +826 -0
  398. package/dist/tests/integration/storage.test.js.map +1 -0
  399. package/dist/tests/unit/admin.test.d.ts +2 -0
  400. package/dist/tests/unit/admin.test.d.ts.map +1 -0
  401. package/dist/tests/unit/admin.test.js +698 -0
  402. package/dist/tests/unit/admin.test.js.map +1 -0
  403. package/dist/tests/unit/anomaly-detector.test.d.ts +2 -0
  404. package/dist/tests/unit/anomaly-detector.test.d.ts.map +1 -0
  405. package/dist/tests/unit/anomaly-detector.test.js +903 -0
  406. package/dist/tests/unit/anomaly-detector.test.js.map +1 -0
  407. package/dist/tests/unit/approval-manager.test.d.ts +2 -0
  408. package/dist/tests/unit/approval-manager.test.d.ts.map +1 -0
  409. package/dist/tests/unit/approval-manager.test.js +528 -0
  410. package/dist/tests/unit/approval-manager.test.js.map +1 -0
  411. package/dist/tests/unit/approval-webhook.test.d.ts +2 -0
  412. package/dist/tests/unit/approval-webhook.test.d.ts.map +1 -0
  413. package/dist/tests/unit/approval-webhook.test.js +355 -0
  414. package/dist/tests/unit/approval-webhook.test.js.map +1 -0
  415. package/dist/tests/unit/audit-logger.test.d.ts +2 -0
  416. package/dist/tests/unit/audit-logger.test.d.ts.map +1 -0
  417. package/dist/tests/unit/audit-logger.test.js +635 -0
  418. package/dist/tests/unit/audit-logger.test.js.map +1 -0
  419. package/dist/tests/unit/auth-routes.test.d.ts +2 -0
  420. package/dist/tests/unit/auth-routes.test.d.ts.map +1 -0
  421. package/dist/tests/unit/auth-routes.test.js +281 -0
  422. package/dist/tests/unit/auth-routes.test.js.map +1 -0
  423. package/dist/tests/unit/auth.test.d.ts +2 -0
  424. package/dist/tests/unit/auth.test.d.ts.map +1 -0
  425. package/dist/tests/unit/auth.test.js +1382 -0
  426. package/dist/tests/unit/auth.test.js.map +1 -0
  427. package/dist/tests/unit/billing.test.d.ts +2 -0
  428. package/dist/tests/unit/billing.test.d.ts.map +1 -0
  429. package/dist/tests/unit/billing.test.js +579 -0
  430. package/dist/tests/unit/billing.test.js.map +1 -0
  431. package/dist/tests/unit/budget-manager.test.d.ts +2 -0
  432. package/dist/tests/unit/budget-manager.test.d.ts.map +1 -0
  433. package/dist/tests/unit/budget-manager.test.js +778 -0
  434. package/dist/tests/unit/budget-manager.test.js.map +1 -0
  435. package/dist/tests/unit/budget-race.test.d.ts +2 -0
  436. package/dist/tests/unit/budget-race.test.d.ts.map +1 -0
  437. package/dist/tests/unit/budget-race.test.js +58 -0
  438. package/dist/tests/unit/budget-race.test.js.map +1 -0
  439. package/dist/tests/unit/cli.test.d.ts +2 -0
  440. package/dist/tests/unit/cli.test.d.ts.map +1 -0
  441. package/dist/tests/unit/cli.test.js +93 -0
  442. package/dist/tests/unit/cli.test.js.map +1 -0
  443. package/dist/tests/unit/concurrency.test.d.ts +2 -0
  444. package/dist/tests/unit/concurrency.test.d.ts.map +1 -0
  445. package/dist/tests/unit/concurrency.test.js +1270 -0
  446. package/dist/tests/unit/concurrency.test.js.map +1 -0
  447. package/dist/tests/unit/config-validate.test.d.ts +2 -0
  448. package/dist/tests/unit/config-validate.test.d.ts.map +1 -0
  449. package/dist/tests/unit/config-validate.test.js +230 -0
  450. package/dist/tests/unit/config-validate.test.js.map +1 -0
  451. package/dist/tests/unit/defaults.test.d.ts +2 -0
  452. package/dist/tests/unit/defaults.test.d.ts.map +1 -0
  453. package/dist/tests/unit/defaults.test.js +364 -0
  454. package/dist/tests/unit/defaults.test.js.map +1 -0
  455. package/dist/tests/unit/dlp-backends.test.d.ts +2 -0
  456. package/dist/tests/unit/dlp-backends.test.d.ts.map +1 -0
  457. package/dist/tests/unit/dlp-backends.test.js +563 -0
  458. package/dist/tests/unit/dlp-backends.test.js.map +1 -0
  459. package/dist/tests/unit/dlp-scanner.test.d.ts +2 -0
  460. package/dist/tests/unit/dlp-scanner.test.d.ts.map +1 -0
  461. package/dist/tests/unit/dlp-scanner.test.js +739 -0
  462. package/dist/tests/unit/dlp-scanner.test.js.map +1 -0
  463. package/dist/tests/unit/error-responses.test.d.ts +2 -0
  464. package/dist/tests/unit/error-responses.test.d.ts.map +1 -0
  465. package/dist/tests/unit/error-responses.test.js +101 -0
  466. package/dist/tests/unit/error-responses.test.js.map +1 -0
  467. package/dist/tests/unit/executor-registry.test.d.ts +2 -0
  468. package/dist/tests/unit/executor-registry.test.d.ts.map +1 -0
  469. package/dist/tests/unit/executor-registry.test.js +390 -0
  470. package/dist/tests/unit/executor-registry.test.js.map +1 -0
  471. package/dist/tests/unit/forward-proxy.test.d.ts +2 -0
  472. package/dist/tests/unit/forward-proxy.test.d.ts.map +1 -0
  473. package/dist/tests/unit/forward-proxy.test.js +621 -0
  474. package/dist/tests/unit/forward-proxy.test.js.map +1 -0
  475. package/dist/tests/unit/gateway-features.test.d.ts +2 -0
  476. package/dist/tests/unit/gateway-features.test.d.ts.map +1 -0
  477. package/dist/tests/unit/gateway-features.test.js +753 -0
  478. package/dist/tests/unit/gateway-features.test.js.map +1 -0
  479. package/dist/tests/unit/http-executor.test.d.ts +2 -0
  480. package/dist/tests/unit/http-executor.test.d.ts.map +1 -0
  481. package/dist/tests/unit/http-executor.test.js +310 -0
  482. package/dist/tests/unit/http-executor.test.js.map +1 -0
  483. package/dist/tests/unit/mcp-bridge.test.d.ts +2 -0
  484. package/dist/tests/unit/mcp-bridge.test.d.ts.map +1 -0
  485. package/dist/tests/unit/mcp-bridge.test.js +1136 -0
  486. package/dist/tests/unit/mcp-bridge.test.js.map +1 -0
  487. package/dist/tests/unit/mcp-http-transport.test.d.ts +2 -0
  488. package/dist/tests/unit/mcp-http-transport.test.d.ts.map +1 -0
  489. package/dist/tests/unit/mcp-http-transport.test.js +899 -0
  490. package/dist/tests/unit/mcp-http-transport.test.js.map +1 -0
  491. package/dist/tests/unit/mcp-oauth.test.d.ts +2 -0
  492. package/dist/tests/unit/mcp-oauth.test.d.ts.map +1 -0
  493. package/dist/tests/unit/mcp-oauth.test.js +759 -0
  494. package/dist/tests/unit/mcp-oauth.test.js.map +1 -0
  495. package/dist/tests/unit/mcp-server.test.d.ts +15 -0
  496. package/dist/tests/unit/mcp-server.test.d.ts.map +1 -0
  497. package/dist/tests/unit/mcp-server.test.js +158 -0
  498. package/dist/tests/unit/mcp-server.test.js.map +1 -0
  499. package/dist/tests/unit/metrics.test.d.ts +2 -0
  500. package/dist/tests/unit/metrics.test.d.ts.map +1 -0
  501. package/dist/tests/unit/metrics.test.js +208 -0
  502. package/dist/tests/unit/metrics.test.js.map +1 -0
  503. package/dist/tests/unit/oauth.test.d.ts +2 -0
  504. package/dist/tests/unit/oauth.test.d.ts.map +1 -0
  505. package/dist/tests/unit/oauth.test.js +281 -0
  506. package/dist/tests/unit/oauth.test.js.map +1 -0
  507. package/dist/tests/unit/opa-circuit-breaker.test.d.ts +2 -0
  508. package/dist/tests/unit/opa-circuit-breaker.test.d.ts.map +1 -0
  509. package/dist/tests/unit/opa-circuit-breaker.test.js +297 -0
  510. package/dist/tests/unit/opa-circuit-breaker.test.js.map +1 -0
  511. package/dist/tests/unit/opa-engine.test.d.ts +2 -0
  512. package/dist/tests/unit/opa-engine.test.d.ts.map +1 -0
  513. package/dist/tests/unit/opa-engine.test.js +1813 -0
  514. package/dist/tests/unit/opa-engine.test.js.map +1 -0
  515. package/dist/tests/unit/pipeline-timing.test.d.ts +2 -0
  516. package/dist/tests/unit/pipeline-timing.test.d.ts.map +1 -0
  517. package/dist/tests/unit/pipeline-timing.test.js +528 -0
  518. package/dist/tests/unit/pipeline-timing.test.js.map +1 -0
  519. package/dist/tests/unit/policy-engine.test.d.ts +2 -0
  520. package/dist/tests/unit/policy-engine.test.d.ts.map +1 -0
  521. package/dist/tests/unit/policy-engine.test.js +1345 -0
  522. package/dist/tests/unit/policy-engine.test.js.map +1 -0
  523. package/dist/tests/unit/policy-store.test.d.ts +2 -0
  524. package/dist/tests/unit/policy-store.test.d.ts.map +1 -0
  525. package/dist/tests/unit/policy-store.test.js +60 -0
  526. package/dist/tests/unit/policy-store.test.js.map +1 -0
  527. package/dist/tests/unit/postgres-storage.test.d.ts +2 -0
  528. package/dist/tests/unit/postgres-storage.test.d.ts.map +1 -0
  529. package/dist/tests/unit/postgres-storage.test.js +614 -0
  530. package/dist/tests/unit/postgres-storage.test.js.map +1 -0
  531. package/dist/tests/unit/prompt-injection-backend.test.d.ts +2 -0
  532. package/dist/tests/unit/prompt-injection-backend.test.d.ts.map +1 -0
  533. package/dist/tests/unit/prompt-injection-backend.test.js +621 -0
  534. package/dist/tests/unit/prompt-injection-backend.test.js.map +1 -0
  535. package/dist/tests/unit/proxy-hardening.test.d.ts +2 -0
  536. package/dist/tests/unit/proxy-hardening.test.d.ts.map +1 -0
  537. package/dist/tests/unit/proxy-hardening.test.js +166 -0
  538. package/dist/tests/unit/proxy-hardening.test.js.map +1 -0
  539. package/dist/tests/unit/rate-limiter.test.d.ts +2 -0
  540. package/dist/tests/unit/rate-limiter.test.d.ts.map +1 -0
  541. package/dist/tests/unit/rate-limiter.test.js +443 -0
  542. package/dist/tests/unit/rate-limiter.test.js.map +1 -0
  543. package/dist/tests/unit/redis-storage.test.d.ts +2 -0
  544. package/dist/tests/unit/redis-storage.test.d.ts.map +1 -0
  545. package/dist/tests/unit/redis-storage.test.js +766 -0
  546. package/dist/tests/unit/redis-storage.test.js.map +1 -0
  547. package/dist/tests/unit/replay-engine.test.d.ts +2 -0
  548. package/dist/tests/unit/replay-engine.test.d.ts.map +1 -0
  549. package/dist/tests/unit/replay-engine.test.js +371 -0
  550. package/dist/tests/unit/replay-engine.test.js.map +1 -0
  551. package/dist/tests/unit/saas-routes.test.d.ts +2 -0
  552. package/dist/tests/unit/saas-routes.test.d.ts.map +1 -0
  553. package/dist/tests/unit/saas-routes.test.js +1399 -0
  554. package/dist/tests/unit/saas-routes.test.js.map +1 -0
  555. package/dist/tests/unit/session.test.d.ts +2 -0
  556. package/dist/tests/unit/session.test.d.ts.map +1 -0
  557. package/dist/tests/unit/session.test.js +532 -0
  558. package/dist/tests/unit/session.test.js.map +1 -0
  559. package/dist/tests/unit/slack-executor.test.d.ts +2 -0
  560. package/dist/tests/unit/slack-executor.test.d.ts.map +1 -0
  561. package/dist/tests/unit/slack-executor.test.js +209 -0
  562. package/dist/tests/unit/slack-executor.test.js.map +1 -0
  563. package/dist/tests/unit/storage-hardening.test.d.ts +2 -0
  564. package/dist/tests/unit/storage-hardening.test.d.ts.map +1 -0
  565. package/dist/tests/unit/storage-hardening.test.js +165 -0
  566. package/dist/tests/unit/storage-hardening.test.js.map +1 -0
  567. package/dist/tests/unit/storage.test.d.ts +2 -0
  568. package/dist/tests/unit/storage.test.d.ts.map +1 -0
  569. package/dist/tests/unit/storage.test.js +698 -0
  570. package/dist/tests/unit/storage.test.js.map +1 -0
  571. package/dist/tests/unit/text-normalizer.test.d.ts +2 -0
  572. package/dist/tests/unit/text-normalizer.test.d.ts.map +1 -0
  573. package/dist/tests/unit/text-normalizer.test.js +229 -0
  574. package/dist/tests/unit/text-normalizer.test.js.map +1 -0
  575. package/dist/tests/unit/tracing.test.d.ts +2 -0
  576. package/dist/tests/unit/tracing.test.d.ts.map +1 -0
  577. package/dist/tests/unit/tracing.test.js +611 -0
  578. package/dist/tests/unit/tracing.test.js.map +1 -0
  579. package/dist/tests/unit/trust-calculator.test.d.ts +2 -0
  580. package/dist/tests/unit/trust-calculator.test.d.ts.map +1 -0
  581. package/dist/tests/unit/trust-calculator.test.js +497 -0
  582. package/dist/tests/unit/trust-calculator.test.js.map +1 -0
  583. package/dist/tests/unit/ts-sdk.test.d.ts +2 -0
  584. package/dist/tests/unit/ts-sdk.test.d.ts.map +1 -0
  585. package/dist/tests/unit/ts-sdk.test.js +421 -0
  586. package/dist/tests/unit/ts-sdk.test.js.map +1 -0
  587. package/dist/tests/unit/usage-extractor-llm.test.d.ts +2 -0
  588. package/dist/tests/unit/usage-extractor-llm.test.d.ts.map +1 -0
  589. package/dist/tests/unit/usage-extractor-llm.test.js +139 -0
  590. package/dist/tests/unit/usage-extractor-llm.test.js.map +1 -0
  591. package/dist/tests/unit/usage-extractor.test.d.ts +2 -0
  592. package/dist/tests/unit/usage-extractor.test.d.ts.map +1 -0
  593. package/dist/tests/unit/usage-extractor.test.js +271 -0
  594. package/dist/tests/unit/usage-extractor.test.js.map +1 -0
  595. package/dist/tests/unit/user-stores.test.d.ts +2 -0
  596. package/dist/tests/unit/user-stores.test.d.ts.map +1 -0
  597. package/dist/tests/unit/user-stores.test.js +687 -0
  598. package/dist/tests/unit/user-stores.test.js.map +1 -0
  599. package/dist/tests/unit/validate.test.d.ts +2 -0
  600. package/dist/tests/unit/validate.test.d.ts.map +1 -0
  601. package/dist/tests/unit/validate.test.js +545 -0
  602. package/dist/tests/unit/validate.test.js.map +1 -0
  603. package/package.json +86 -0
  604. package/policy-packs/README.md +42 -0
  605. package/policy-packs/default.yaml +46 -0
  606. package/policy-packs/dev_fast.yaml +54 -0
  607. package/policy-packs/prod_strict.yaml +83 -0
@@ -0,0 +1,687 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const memory_1 = require("../../src/storage/memory");
4
+ // ---------------------------------------------------------------------------
5
+ // Helpers
6
+ // ---------------------------------------------------------------------------
7
+ function makeUser(overrides = {}) {
8
+ const now = new Date().toISOString();
9
+ return {
10
+ id: 'user-001',
11
+ email: 'alice@example.com',
12
+ display_name: 'Alice',
13
+ status: 'active',
14
+ onboarding_completed: false,
15
+ created_at: now,
16
+ updated_at: now,
17
+ ...overrides,
18
+ };
19
+ }
20
+ function makeOAuthAccount(overrides = {}) {
21
+ const now = new Date().toISOString();
22
+ return {
23
+ id: 'oauth-001',
24
+ user_id: 'user-001',
25
+ provider: 'google',
26
+ provider_user_id: 'goog-12345',
27
+ provider_email: 'alice@gmail.com',
28
+ created_at: now,
29
+ updated_at: now,
30
+ ...overrides,
31
+ };
32
+ }
33
+ function makeWorkspace(overrides = {}) {
34
+ const now = new Date().toISOString();
35
+ return {
36
+ id: 'ws-001',
37
+ name: 'Acme Corp',
38
+ slug: 'acme-corp',
39
+ owner_user_id: 'user-001',
40
+ plan: 'free',
41
+ settings: {},
42
+ created_at: now,
43
+ updated_at: now,
44
+ ...overrides,
45
+ };
46
+ }
47
+ function makeMember(overrides = {}) {
48
+ return {
49
+ id: 'mem-001',
50
+ workspace_id: 'ws-001',
51
+ user_id: 'user-001',
52
+ role: 'owner',
53
+ joined_at: new Date().toISOString(),
54
+ ...overrides,
55
+ };
56
+ }
57
+ function makeSession(overrides = {}) {
58
+ const now = new Date().toISOString();
59
+ return {
60
+ id: 'sess-001',
61
+ user_id: 'user-001',
62
+ expires_at: new Date(Date.now() + 3600000).toISOString(),
63
+ last_active_at: now,
64
+ created_at: now,
65
+ ...overrides,
66
+ };
67
+ }
68
+ function makeApiKey(overrides = {}) {
69
+ return {
70
+ id: 'key-001',
71
+ key_hash: 'hash-abc123',
72
+ key_prefix: 'tg_abc12345',
73
+ user_id: 'user-001',
74
+ workspace_id: 'ws-001',
75
+ name: 'My Key',
76
+ roles: ['agent'],
77
+ tags: [],
78
+ revoked: false,
79
+ created_at: new Date().toISOString(),
80
+ ...overrides,
81
+ };
82
+ }
83
+ // ===========================================================================
84
+ // InMemoryUserStore
85
+ // ===========================================================================
86
+ describe('InMemoryUserStore', () => {
87
+ let store;
88
+ beforeEach(() => {
89
+ store = new memory_1.InMemoryUserStore();
90
+ });
91
+ describe('create', () => {
92
+ it('stores a user', () => {
93
+ const user = makeUser();
94
+ store.create(user);
95
+ expect(store.getById(user.id)).toEqual(user);
96
+ });
97
+ it('stores a defensive copy (mutation safety)', () => {
98
+ const user = makeUser();
99
+ store.create(user);
100
+ user.display_name = 'MUTATED';
101
+ expect(store.getById(user.id)?.display_name).toBe('Alice');
102
+ });
103
+ });
104
+ describe('getById', () => {
105
+ it('returns undefined for non-existent id', () => {
106
+ expect(store.getById('missing')).toBeUndefined();
107
+ });
108
+ it('returns a copy of the user', () => {
109
+ const user = makeUser();
110
+ store.create(user);
111
+ const a = store.getById(user.id);
112
+ const b = store.getById(user.id);
113
+ expect(a).toEqual(b);
114
+ expect(a).not.toBe(b); // Different object references
115
+ });
116
+ });
117
+ describe('getByEmail', () => {
118
+ it('returns undefined when no user has that email', () => {
119
+ expect(store.getByEmail('nobody@example.com')).toBeUndefined();
120
+ });
121
+ it('finds a user by email', () => {
122
+ store.create(makeUser({ id: 'u1', email: 'bob@example.com' }));
123
+ store.create(makeUser({ id: 'u2', email: 'carol@example.com' }));
124
+ const found = store.getByEmail('carol@example.com');
125
+ expect(found?.id).toBe('u2');
126
+ });
127
+ });
128
+ describe('update', () => {
129
+ it('returns undefined for non-existent id', () => {
130
+ expect(store.update('missing', { display_name: 'x' })).toBeUndefined();
131
+ });
132
+ it('updates specified fields and returns the updated user', () => {
133
+ store.create(makeUser());
134
+ const updated = store.update('user-001', {
135
+ display_name: 'Alice Updated',
136
+ onboarding_completed: true,
137
+ });
138
+ expect(updated?.display_name).toBe('Alice Updated');
139
+ expect(updated?.onboarding_completed).toBe(true);
140
+ // Verify persisted
141
+ expect(store.getById('user-001')?.display_name).toBe('Alice Updated');
142
+ });
143
+ it('does not modify fields not included in the update', () => {
144
+ store.create(makeUser({ avatar_url: 'https://img.example.com/alice.png' }));
145
+ store.update('user-001', { display_name: 'Bob' });
146
+ expect(store.getById('user-001')?.avatar_url).toBe('https://img.example.com/alice.png');
147
+ });
148
+ });
149
+ describe('delete', () => {
150
+ it('returns false for non-existent id', () => {
151
+ expect(store.delete('missing')).toBe(false);
152
+ });
153
+ it('removes the user and returns true', () => {
154
+ store.create(makeUser());
155
+ expect(store.delete('user-001')).toBe(true);
156
+ expect(store.getById('user-001')).toBeUndefined();
157
+ });
158
+ });
159
+ describe('list', () => {
160
+ it('returns an empty array when no users exist', () => {
161
+ expect(store.list()).toEqual([]);
162
+ });
163
+ it('returns all users', () => {
164
+ store.create(makeUser({ id: 'u1' }));
165
+ store.create(makeUser({ id: 'u2' }));
166
+ store.create(makeUser({ id: 'u3' }));
167
+ const list = store.list();
168
+ expect(list).toHaveLength(3);
169
+ expect(list.map(u => u.id).sort()).toEqual(['u1', 'u2', 'u3']);
170
+ });
171
+ it('returns copies (mutation safety)', () => {
172
+ store.create(makeUser({ id: 'u1' }));
173
+ const list = store.list();
174
+ list[0].display_name = 'MUTATED';
175
+ expect(store.getById('u1')?.display_name).toBe('Alice');
176
+ });
177
+ });
178
+ });
179
+ // ===========================================================================
180
+ // InMemoryOAuthAccountStore
181
+ // ===========================================================================
182
+ describe('InMemoryOAuthAccountStore', () => {
183
+ let store;
184
+ beforeEach(() => {
185
+ store = new memory_1.InMemoryOAuthAccountStore();
186
+ });
187
+ describe('create', () => {
188
+ it('stores an OAuth account', () => {
189
+ const account = makeOAuthAccount();
190
+ store.create(account);
191
+ expect(store.getById(account.id)).toEqual(account);
192
+ });
193
+ it('stores a defensive copy', () => {
194
+ const account = makeOAuthAccount();
195
+ store.create(account);
196
+ account.provider_email = 'MUTATED';
197
+ expect(store.getById(account.id)?.provider_email).toBe('alice@gmail.com');
198
+ });
199
+ });
200
+ describe('getById', () => {
201
+ it('returns undefined for non-existent id', () => {
202
+ expect(store.getById('missing')).toBeUndefined();
203
+ });
204
+ it('returns a copy of the account', () => {
205
+ store.create(makeOAuthAccount());
206
+ const a = store.getById('oauth-001');
207
+ const b = store.getById('oauth-001');
208
+ expect(a).toEqual(b);
209
+ expect(a).not.toBe(b);
210
+ });
211
+ });
212
+ describe('getByProvider', () => {
213
+ it('returns undefined when no match exists', () => {
214
+ expect(store.getByProvider('google', 'no-match')).toBeUndefined();
215
+ });
216
+ it('finds account by provider and provider_user_id', () => {
217
+ store.create(makeOAuthAccount({ id: 'oa1', provider: 'google', provider_user_id: 'g100' }));
218
+ store.create(makeOAuthAccount({ id: 'oa2', provider: 'github', provider_user_id: 'gh200' }));
219
+ const found = store.getByProvider('github', 'gh200');
220
+ expect(found?.id).toBe('oa2');
221
+ });
222
+ it('does not match different provider with same provider_user_id', () => {
223
+ store.create(makeOAuthAccount({ id: 'oa1', provider: 'google', provider_user_id: 'same-id' }));
224
+ expect(store.getByProvider('github', 'same-id')).toBeUndefined();
225
+ });
226
+ });
227
+ describe('getByUserId', () => {
228
+ it('returns empty array when no accounts exist for user', () => {
229
+ expect(store.getByUserId('missing')).toEqual([]);
230
+ });
231
+ it('returns all accounts for a user', () => {
232
+ store.create(makeOAuthAccount({ id: 'oa1', user_id: 'user-001', provider: 'google' }));
233
+ store.create(makeOAuthAccount({ id: 'oa2', user_id: 'user-001', provider: 'github' }));
234
+ store.create(makeOAuthAccount({ id: 'oa3', user_id: 'user-002', provider: 'google' }));
235
+ const accounts = store.getByUserId('user-001');
236
+ expect(accounts).toHaveLength(2);
237
+ expect(accounts.map(a => a.id).sort()).toEqual(['oa1', 'oa2']);
238
+ });
239
+ });
240
+ describe('update', () => {
241
+ it('returns undefined for non-existent id', () => {
242
+ expect(store.update('missing', { access_token_encrypted: 'x' })).toBeUndefined();
243
+ });
244
+ it('updates the specified fields', () => {
245
+ store.create(makeOAuthAccount());
246
+ const newExpiry = new Date(Date.now() + 7200000).toISOString();
247
+ const updated = store.update('oauth-001', {
248
+ access_token_encrypted: 'new-enc-token',
249
+ token_expires_at: newExpiry,
250
+ });
251
+ expect(updated?.access_token_encrypted).toBe('new-enc-token');
252
+ expect(updated?.token_expires_at).toBe(newExpiry);
253
+ });
254
+ });
255
+ describe('delete', () => {
256
+ it('returns false for non-existent id', () => {
257
+ expect(store.delete('missing')).toBe(false);
258
+ });
259
+ it('removes account and returns true', () => {
260
+ store.create(makeOAuthAccount());
261
+ expect(store.delete('oauth-001')).toBe(true);
262
+ expect(store.getById('oauth-001')).toBeUndefined();
263
+ });
264
+ });
265
+ });
266
+ // ===========================================================================
267
+ // InMemoryWorkspaceStore
268
+ // ===========================================================================
269
+ describe('InMemoryWorkspaceStore', () => {
270
+ let store;
271
+ beforeEach(() => {
272
+ store = new memory_1.InMemoryWorkspaceStore();
273
+ });
274
+ describe('create', () => {
275
+ it('stores a workspace', () => {
276
+ const ws = makeWorkspace();
277
+ store.create(ws);
278
+ expect(store.getById(ws.id)).toEqual(ws);
279
+ });
280
+ it('stores a defensive copy', () => {
281
+ const ws = makeWorkspace();
282
+ store.create(ws);
283
+ ws.name = 'MUTATED';
284
+ expect(store.getById(ws.id)?.name).toBe('Acme Corp');
285
+ });
286
+ });
287
+ describe('getById', () => {
288
+ it('returns undefined for non-existent id', () => {
289
+ expect(store.getById('missing')).toBeUndefined();
290
+ });
291
+ it('returns a copy', () => {
292
+ store.create(makeWorkspace());
293
+ const a = store.getById('ws-001');
294
+ const b = store.getById('ws-001');
295
+ expect(a).not.toBe(b);
296
+ expect(a).toEqual(b);
297
+ });
298
+ });
299
+ describe('getBySlug', () => {
300
+ it('returns undefined when no workspace has that slug', () => {
301
+ expect(store.getBySlug('no-slug')).toBeUndefined();
302
+ });
303
+ it('finds workspace by slug', () => {
304
+ store.create(makeWorkspace({ id: 'ws-1', slug: 'alpha' }));
305
+ store.create(makeWorkspace({ id: 'ws-2', slug: 'beta' }));
306
+ expect(store.getBySlug('beta')?.id).toBe('ws-2');
307
+ });
308
+ });
309
+ describe('getByOwner', () => {
310
+ it('returns empty array when owner has no workspaces', () => {
311
+ expect(store.getByOwner('nobody')).toEqual([]);
312
+ });
313
+ it('returns all workspaces owned by the user', () => {
314
+ store.create(makeWorkspace({ id: 'ws-1', owner_user_id: 'user-001' }));
315
+ store.create(makeWorkspace({ id: 'ws-2', owner_user_id: 'user-001', slug: 'ws2' }));
316
+ store.create(makeWorkspace({ id: 'ws-3', owner_user_id: 'user-002', slug: 'ws3' }));
317
+ const owned = store.getByOwner('user-001');
318
+ expect(owned).toHaveLength(2);
319
+ expect(owned.map(w => w.id).sort()).toEqual(['ws-1', 'ws-2']);
320
+ });
321
+ });
322
+ describe('update', () => {
323
+ it('returns undefined for non-existent id', () => {
324
+ expect(store.update('missing', { name: 'x' })).toBeUndefined();
325
+ });
326
+ it('updates specified fields', () => {
327
+ store.create(makeWorkspace());
328
+ const updated = store.update('ws-001', { name: 'Acme Inc', plan: 'pro' });
329
+ expect(updated?.name).toBe('Acme Inc');
330
+ expect(updated?.plan).toBe('pro');
331
+ expect(store.getById('ws-001')?.name).toBe('Acme Inc');
332
+ });
333
+ });
334
+ describe('delete', () => {
335
+ it('returns false for non-existent id', () => {
336
+ expect(store.delete('missing')).toBe(false);
337
+ });
338
+ it('removes workspace and returns true', () => {
339
+ store.create(makeWorkspace());
340
+ expect(store.delete('ws-001')).toBe(true);
341
+ expect(store.getById('ws-001')).toBeUndefined();
342
+ });
343
+ });
344
+ describe('list', () => {
345
+ it('returns empty array when no workspaces exist', () => {
346
+ expect(store.list()).toEqual([]);
347
+ });
348
+ it('returns all workspaces', () => {
349
+ store.create(makeWorkspace({ id: 'ws-1', slug: 'a' }));
350
+ store.create(makeWorkspace({ id: 'ws-2', slug: 'b' }));
351
+ expect(store.list()).toHaveLength(2);
352
+ });
353
+ it('returns copies (mutation safety)', () => {
354
+ store.create(makeWorkspace({ id: 'ws-1' }));
355
+ const list = store.list();
356
+ list[0].name = 'MUTATED';
357
+ expect(store.getById('ws-1')?.name).toBe('Acme Corp');
358
+ });
359
+ });
360
+ });
361
+ // ===========================================================================
362
+ // InMemoryWorkspaceMemberStore
363
+ // ===========================================================================
364
+ describe('InMemoryWorkspaceMemberStore', () => {
365
+ let store;
366
+ beforeEach(() => {
367
+ store = new memory_1.InMemoryWorkspaceMemberStore();
368
+ });
369
+ describe('create', () => {
370
+ it('stores a member', () => {
371
+ const member = makeMember();
372
+ store.create(member);
373
+ expect(store.getById(member.id)).toEqual(member);
374
+ });
375
+ it('stores a defensive copy', () => {
376
+ const member = makeMember();
377
+ store.create(member);
378
+ member.role = 'viewer';
379
+ expect(store.getById(member.id)?.role).toBe('owner');
380
+ });
381
+ });
382
+ describe('getById', () => {
383
+ it('returns undefined for non-existent id', () => {
384
+ expect(store.getById('missing')).toBeUndefined();
385
+ });
386
+ it('returns a copy', () => {
387
+ store.create(makeMember());
388
+ const a = store.getById('mem-001');
389
+ const b = store.getById('mem-001');
390
+ expect(a).toEqual(b);
391
+ expect(a).not.toBe(b);
392
+ });
393
+ });
394
+ describe('getByWorkspace', () => {
395
+ it('returns empty array for workspace with no members', () => {
396
+ expect(store.getByWorkspace('ws-empty')).toEqual([]);
397
+ });
398
+ it('returns all members of a workspace', () => {
399
+ store.create(makeMember({ id: 'm1', workspace_id: 'ws-1', user_id: 'u1' }));
400
+ store.create(makeMember({ id: 'm2', workspace_id: 'ws-1', user_id: 'u2' }));
401
+ store.create(makeMember({ id: 'm3', workspace_id: 'ws-2', user_id: 'u3' }));
402
+ const members = store.getByWorkspace('ws-1');
403
+ expect(members).toHaveLength(2);
404
+ expect(members.map(m => m.id).sort()).toEqual(['m1', 'm2']);
405
+ });
406
+ });
407
+ describe('getByUser', () => {
408
+ it('returns empty array when user has no memberships', () => {
409
+ expect(store.getByUser('no-user')).toEqual([]);
410
+ });
411
+ it('returns all memberships for a user', () => {
412
+ store.create(makeMember({ id: 'm1', workspace_id: 'ws-1', user_id: 'u1' }));
413
+ store.create(makeMember({ id: 'm2', workspace_id: 'ws-2', user_id: 'u1' }));
414
+ store.create(makeMember({ id: 'm3', workspace_id: 'ws-3', user_id: 'u2' }));
415
+ const memberships = store.getByUser('u1');
416
+ expect(memberships).toHaveLength(2);
417
+ });
418
+ });
419
+ describe('getByWorkspaceAndUser', () => {
420
+ it('returns undefined when no membership exists for that combination', () => {
421
+ store.create(makeMember({ id: 'm1', workspace_id: 'ws-1', user_id: 'u1' }));
422
+ expect(store.getByWorkspaceAndUser('ws-1', 'u2')).toBeUndefined();
423
+ expect(store.getByWorkspaceAndUser('ws-2', 'u1')).toBeUndefined();
424
+ });
425
+ it('finds the specific membership', () => {
426
+ store.create(makeMember({ id: 'm1', workspace_id: 'ws-1', user_id: 'u1', role: 'owner' }));
427
+ store.create(makeMember({ id: 'm2', workspace_id: 'ws-1', user_id: 'u2', role: 'member' }));
428
+ const found = store.getByWorkspaceAndUser('ws-1', 'u2');
429
+ expect(found?.id).toBe('m2');
430
+ expect(found?.role).toBe('member');
431
+ });
432
+ });
433
+ describe('update', () => {
434
+ it('returns undefined for non-existent id', () => {
435
+ expect(store.update('missing', { role: 'admin' })).toBeUndefined();
436
+ });
437
+ it('updates the role and returns updated member', () => {
438
+ store.create(makeMember({ id: 'm1', role: 'member' }));
439
+ const updated = store.update('m1', { role: 'admin' });
440
+ expect(updated?.role).toBe('admin');
441
+ expect(store.getById('m1')?.role).toBe('admin');
442
+ });
443
+ });
444
+ describe('delete', () => {
445
+ it('returns false for non-existent id', () => {
446
+ expect(store.delete('missing')).toBe(false);
447
+ });
448
+ it('removes member and returns true', () => {
449
+ store.create(makeMember());
450
+ expect(store.delete('mem-001')).toBe(true);
451
+ expect(store.getById('mem-001')).toBeUndefined();
452
+ });
453
+ });
454
+ });
455
+ // ===========================================================================
456
+ // InMemorySessionStore
457
+ // ===========================================================================
458
+ describe('InMemorySessionStore', () => {
459
+ let store;
460
+ beforeEach(() => {
461
+ store = new memory_1.InMemorySessionStore();
462
+ });
463
+ describe('create', () => {
464
+ it('stores a session', () => {
465
+ const session = makeSession();
466
+ store.create(session);
467
+ expect(store.getById(session.id)).toEqual(session);
468
+ });
469
+ it('stores a defensive copy', () => {
470
+ const session = makeSession();
471
+ store.create(session);
472
+ session.user_id = 'MUTATED';
473
+ expect(store.getById(session.id)?.user_id).toBe('user-001');
474
+ });
475
+ });
476
+ describe('getById', () => {
477
+ it('returns undefined for non-existent id', () => {
478
+ expect(store.getById('missing')).toBeUndefined();
479
+ });
480
+ it('returns a valid (non-expired) session', () => {
481
+ store.create(makeSession());
482
+ const found = store.getById('sess-001');
483
+ expect(found?.user_id).toBe('user-001');
484
+ });
485
+ it('returns undefined and removes an expired session', () => {
486
+ store.create(makeSession({
487
+ id: 'expired-sess',
488
+ expires_at: new Date(Date.now() - 1000).toISOString(),
489
+ }));
490
+ expect(store.getById('expired-sess')).toBeUndefined();
491
+ // Verify it was actually deleted from the store
492
+ // Create a new session with same id to check
493
+ store.create(makeSession({ id: 'expired-sess' }));
494
+ expect(store.getById('expired-sess')).toBeDefined();
495
+ });
496
+ it('returns a copy (mutation safety)', () => {
497
+ store.create(makeSession());
498
+ const a = store.getById('sess-001');
499
+ const b = store.getById('sess-001');
500
+ expect(a).toEqual(b);
501
+ expect(a).not.toBe(b);
502
+ });
503
+ });
504
+ describe('getByUserId', () => {
505
+ it('returns empty array when user has no sessions', () => {
506
+ expect(store.getByUserId('no-user')).toEqual([]);
507
+ });
508
+ it('returns only non-expired sessions for the user', () => {
509
+ store.create(makeSession({ id: 's1', user_id: 'u1' }));
510
+ store.create(makeSession({ id: 's2', user_id: 'u1' }));
511
+ store.create(makeSession({
512
+ id: 's3',
513
+ user_id: 'u1',
514
+ expires_at: new Date(Date.now() - 1000).toISOString(),
515
+ }));
516
+ store.create(makeSession({ id: 's4', user_id: 'u2' }));
517
+ const sessions = store.getByUserId('u1');
518
+ expect(sessions).toHaveLength(2);
519
+ expect(sessions.map(s => s.id).sort()).toEqual(['s1', 's2']);
520
+ });
521
+ });
522
+ describe('update', () => {
523
+ it('returns undefined for non-existent session', () => {
524
+ expect(store.update('missing', { workspace_id: 'ws-1' })).toBeUndefined();
525
+ });
526
+ it('updates workspace_id', () => {
527
+ store.create(makeSession());
528
+ const updated = store.update('sess-001', { workspace_id: 'ws-999' });
529
+ expect(updated?.workspace_id).toBe('ws-999');
530
+ });
531
+ it('updates last_active_at', () => {
532
+ store.create(makeSession());
533
+ const newTime = new Date().toISOString();
534
+ const updated = store.update('sess-001', { last_active_at: newTime });
535
+ expect(updated?.last_active_at).toBe(newTime);
536
+ });
537
+ });
538
+ describe('delete', () => {
539
+ it('returns false for non-existent session', () => {
540
+ expect(store.delete('missing')).toBe(false);
541
+ });
542
+ it('removes the session and returns true', () => {
543
+ store.create(makeSession());
544
+ expect(store.delete('sess-001')).toBe(true);
545
+ expect(store.getById('sess-001')).toBeUndefined();
546
+ });
547
+ });
548
+ describe('deleteExpired', () => {
549
+ it('returns 0 when no sessions are expired', () => {
550
+ store.create(makeSession({ id: 's1' }));
551
+ store.create(makeSession({ id: 's2' }));
552
+ expect(store.deleteExpired()).toBe(0);
553
+ });
554
+ it('deletes all expired sessions and returns the count', () => {
555
+ store.create(makeSession({ id: 's1' })); // valid
556
+ store.create(makeSession({
557
+ id: 's2',
558
+ expires_at: new Date(Date.now() - 1000).toISOString(),
559
+ }));
560
+ store.create(makeSession({
561
+ id: 's3',
562
+ expires_at: new Date(Date.now() - 5000).toISOString(),
563
+ }));
564
+ const deleted = store.deleteExpired();
565
+ expect(deleted).toBe(2);
566
+ // Verify valid session still exists
567
+ expect(store.getById('s1')).toBeDefined();
568
+ });
569
+ });
570
+ describe('deleteByUserId', () => {
571
+ it('returns 0 when user has no sessions', () => {
572
+ expect(store.deleteByUserId('no-user')).toBe(0);
573
+ });
574
+ it('deletes all sessions for the user and returns count', () => {
575
+ store.create(makeSession({ id: 's1', user_id: 'u1' }));
576
+ store.create(makeSession({ id: 's2', user_id: 'u1' }));
577
+ store.create(makeSession({ id: 's3', user_id: 'u2' }));
578
+ const deleted = store.deleteByUserId('u1');
579
+ expect(deleted).toBe(2);
580
+ // Verify other user's session still exists
581
+ expect(store.getById('s3')).toBeDefined();
582
+ });
583
+ });
584
+ });
585
+ // ===========================================================================
586
+ // InMemoryUserApiKeyStore
587
+ // ===========================================================================
588
+ describe('InMemoryUserApiKeyStore', () => {
589
+ let store;
590
+ beforeEach(() => {
591
+ store = new memory_1.InMemoryUserApiKeyStore();
592
+ });
593
+ describe('create', () => {
594
+ it('stores an API key', () => {
595
+ const key = makeApiKey();
596
+ store.create(key);
597
+ expect(store.getById(key.id)).toEqual(key);
598
+ });
599
+ it('stores a defensive copy', () => {
600
+ const key = makeApiKey();
601
+ store.create(key);
602
+ key.name = 'MUTATED';
603
+ expect(store.getById(key.id)?.name).toBe('My Key');
604
+ });
605
+ });
606
+ describe('getById', () => {
607
+ it('returns undefined for non-existent id', () => {
608
+ expect(store.getById('missing')).toBeUndefined();
609
+ });
610
+ it('returns a copy', () => {
611
+ store.create(makeApiKey());
612
+ const a = store.getById('key-001');
613
+ const b = store.getById('key-001');
614
+ expect(a).toEqual(b);
615
+ expect(a).not.toBe(b);
616
+ });
617
+ });
618
+ describe('getByKeyHash', () => {
619
+ it('returns undefined when no key has that hash', () => {
620
+ expect(store.getByKeyHash('no-hash')).toBeUndefined();
621
+ });
622
+ it('finds a key by its hash', () => {
623
+ store.create(makeApiKey({ id: 'k1', key_hash: 'hash-aaa' }));
624
+ store.create(makeApiKey({ id: 'k2', key_hash: 'hash-bbb' }));
625
+ const found = store.getByKeyHash('hash-bbb');
626
+ expect(found?.id).toBe('k2');
627
+ });
628
+ });
629
+ describe('getByWorkspace', () => {
630
+ it('returns empty array for workspace with no keys', () => {
631
+ expect(store.getByWorkspace('ws-empty')).toEqual([]);
632
+ });
633
+ it('returns all keys for a workspace', () => {
634
+ store.create(makeApiKey({ id: 'k1', workspace_id: 'ws-1', key_hash: 'h1' }));
635
+ store.create(makeApiKey({ id: 'k2', workspace_id: 'ws-1', key_hash: 'h2' }));
636
+ store.create(makeApiKey({ id: 'k3', workspace_id: 'ws-2', key_hash: 'h3' }));
637
+ const keys = store.getByWorkspace('ws-1');
638
+ expect(keys).toHaveLength(2);
639
+ expect(keys.map(k => k.id).sort()).toEqual(['k1', 'k2']);
640
+ });
641
+ });
642
+ describe('getByUser', () => {
643
+ it('returns empty array for user with no keys', () => {
644
+ expect(store.getByUser('no-user')).toEqual([]);
645
+ });
646
+ it('returns all keys for a user', () => {
647
+ store.create(makeApiKey({ id: 'k1', user_id: 'u1', key_hash: 'h1' }));
648
+ store.create(makeApiKey({ id: 'k2', user_id: 'u1', key_hash: 'h2' }));
649
+ store.create(makeApiKey({ id: 'k3', user_id: 'u2', key_hash: 'h3' }));
650
+ const keys = store.getByUser('u1');
651
+ expect(keys).toHaveLength(2);
652
+ expect(keys.map(k => k.id).sort()).toEqual(['k1', 'k2']);
653
+ });
654
+ });
655
+ describe('update', () => {
656
+ it('returns undefined for non-existent id', () => {
657
+ expect(store.update('missing', { revoked: true })).toBeUndefined();
658
+ });
659
+ it('updates specified fields', () => {
660
+ store.create(makeApiKey());
661
+ const updated = store.update('key-001', {
662
+ name: 'Renamed Key',
663
+ revoked: true,
664
+ last_used_at: new Date().toISOString(),
665
+ });
666
+ expect(updated?.name).toBe('Renamed Key');
667
+ expect(updated?.revoked).toBe(true);
668
+ expect(updated?.last_used_at).toBeDefined();
669
+ });
670
+ it('updates roles array', () => {
671
+ store.create(makeApiKey());
672
+ const updated = store.update('key-001', { roles: ['admin', 'agent'] });
673
+ expect(updated?.roles).toEqual(['admin', 'agent']);
674
+ });
675
+ });
676
+ describe('delete', () => {
677
+ it('returns false for non-existent id', () => {
678
+ expect(store.delete('missing')).toBe(false);
679
+ });
680
+ it('removes the key and returns true', () => {
681
+ store.create(makeApiKey());
682
+ expect(store.delete('key-001')).toBe(true);
683
+ expect(store.getById('key-001')).toBeUndefined();
684
+ });
685
+ });
686
+ });
687
+ //# sourceMappingURL=user-stores.test.js.map