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,500 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.escapeHtml = escapeHtml;
4
+ exports.layoutTemplate = layoutTemplate;
5
+ exports.dashboardTemplate = dashboardTemplate;
6
+ exports.approvalsTemplate = approvalsTemplate;
7
+ exports.policiesTemplate = policiesTemplate;
8
+ exports.budgetsTemplate = budgetsTemplate;
9
+ exports.traceListTemplate = traceListTemplate;
10
+ exports.traceDetailTemplate = traceDetailTemplate;
11
+ exports.apiKeysTemplate = apiKeysTemplate;
12
+ function escapeHtml(str) {
13
+ return String(str)
14
+ .replace(/&/g, '&')
15
+ .replace(/</g, '&lt;')
16
+ .replace(/>/g, '&gt;')
17
+ .replace(/"/g, '&quot;')
18
+ .replace(/'/g, '&#039;');
19
+ }
20
+ function layoutTemplate(title, activeNav, content) {
21
+ return `<!DOCTYPE html>
22
+ <html>
23
+ <head>
24
+ <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'">
25
+ <title>Palaryn Admin - ${escapeHtml(title)}</title>
26
+ <style>
27
+ * { margin: 0; padding: 0; box-sizing: border-box; }
28
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; display: flex; min-height: 100vh; background: #f5f7fa; }
29
+ .sidebar { width: 240px; background: #1a1d23; color: #fff; padding: 20px 0; }
30
+ .sidebar h1 { font-size: 18px; padding: 0 20px 20px; border-bottom: 1px solid #2d3139; }
31
+ .sidebar nav a { display: block; padding: 12px 20px; color: #9ca3af; text-decoration: none; }
32
+ .sidebar nav a:hover, .sidebar nav a.active { background: #2d3139; color: #fff; }
33
+ .main { flex: 1; padding: 30px; }
34
+ .card { background: #fff; border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
35
+ .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-bottom: 24px; }
36
+ .stat-card { background: #fff; border-radius: 8px; padding: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
37
+ .stat-card .value { font-size: 28px; font-weight: 700; color: #1a1d23; }
38
+ .stat-card .label { font-size: 13px; color: #6b7280; margin-top: 4px; }
39
+ .badge { display: inline-block; padding: 2px 8px; border-radius: 12px; font-size: 12px; font-weight: 600; }
40
+ .badge-green { background: #d1fae5; color: #065f46; }
41
+ .badge-red { background: #fee2e2; color: #991b1b; }
42
+ .badge-yellow { background: #fef3c7; color: #92400e; }
43
+ .badge-blue { background: #dbeafe; color: #1e40af; }
44
+ table { width: 100%; border-collapse: collapse; }
45
+ th, td { text-align: left; padding: 10px 12px; border-bottom: 1px solid #e5e7eb; }
46
+ th { font-size: 12px; text-transform: uppercase; color: #6b7280; font-weight: 600; }
47
+ .btn { display: inline-block; padding: 6px 14px; border-radius: 6px; border: none; cursor: pointer; font-size: 13px; font-weight: 500; }
48
+ .btn-primary { background: #3b82f6; color: #fff; }
49
+ .btn-danger { background: #ef4444; color: #fff; }
50
+ .btn-success { background: #10b981; color: #fff; }
51
+ input, textarea, select { padding: 8px 12px; border: 1px solid #d1d5db; border-radius: 6px; font-size: 14px; width: 100%; }
52
+ textarea { min-height: 200px; font-family: monospace; }
53
+ .form-group { margin-bottom: 16px; }
54
+ .form-group label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 6px; color: #374151; }
55
+ pre { background: #1a1d23; color: #e5e7eb; padding: 16px; border-radius: 8px; overflow-x: auto; font-size: 13px; }
56
+ .alert { padding: 12px 16px; border-radius: 8px; margin-bottom: 16px; }
57
+ .alert-success { background: #d1fae5; color: #065f46; }
58
+ .alert-error { background: #fee2e2; color: #991b1b; }
59
+ </style>
60
+ </head>
61
+ <body>
62
+ <div class="sidebar">
63
+ <h1>Palaryn Admin</h1>
64
+ <nav>
65
+ <a href="/admin" class="${activeNav === 'dashboard' ? 'active' : ''}">Dashboard</a>
66
+ <a href="/admin/approvals" class="${activeNav === 'approvals' ? 'active' : ''}">Approvals</a>
67
+ <a href="/admin/policies" class="${activeNav === 'policies' ? 'active' : ''}">Policies</a>
68
+ <a href="/admin/budgets" class="${activeNav === 'budgets' ? 'active' : ''}">Budgets</a>
69
+ <a href="/admin/traces" class="${activeNav === 'traces' ? 'active' : ''}">Traces</a>
70
+ <a href="/admin/api-keys" class="${activeNav === 'api-keys' ? 'active' : ''}">API Keys</a>
71
+ </nav>
72
+ </div>
73
+ <div class="main">
74
+ <h2 style="margin-bottom: 24px; color: #1a1d23;">${escapeHtml(title)}</h2>
75
+ ${content}
76
+ </div>
77
+ </body>
78
+ </html>`;
79
+ }
80
+ function dashboardTemplate(stats) {
81
+ const recentEventsRows = stats.recent_events.slice(0, 20).map(event => {
82
+ const eventType = escapeHtml(event.event_type || '');
83
+ const badgeClass = eventType.includes('DENIED') || eventType.includes('INCIDENT')
84
+ ? 'badge-red'
85
+ : eventType.includes('APPROVAL_REQUESTED') || eventType.includes('APPROVAL_EXPIRED')
86
+ ? 'badge-yellow'
87
+ : eventType.includes('APPROVED') || eventType.includes('EXECUTED') || eventType.includes('RETURNED')
88
+ ? 'badge-green'
89
+ : 'badge-blue';
90
+ return `<tr>
91
+ <td><span class="badge ${badgeClass}">${eventType}</span></td>
92
+ <td>${escapeHtml(event.tool_name || '-')}</td>
93
+ <td>${escapeHtml(event.actor_id || '-')}</td>
94
+ <td>${escapeHtml(event.timestamp || '-')}</td>
95
+ </tr>`;
96
+ }).join('\n');
97
+ const content = `
98
+ <div class="stats-grid">
99
+ <div class="stat-card">
100
+ <div class="value">${stats.total_requests}</div>
101
+ <div class="label">Total Requests</div>
102
+ </div>
103
+ <div class="stat-card">
104
+ <div class="value">${stats.pending_approvals}</div>
105
+ <div class="label">Pending Approvals</div>
106
+ </div>
107
+ <div class="stat-card">
108
+ <div class="value">${stats.active_workspaces}</div>
109
+ <div class="label">Active Workspaces</div>
110
+ </div>
111
+ <div class="stat-card">
112
+ <div class="value">${stats.policy_rules}</div>
113
+ <div class="label">Policy Rules</div>
114
+ </div>
115
+ </div>
116
+ <div class="card">
117
+ <h3 style="margin-bottom: 16px; color: #374151;">Recent Events</h3>
118
+ ${stats.recent_events.length === 0
119
+ ? '<p style="color: #6b7280;">No events recorded yet.</p>'
120
+ : `<table>
121
+ <thead>
122
+ <tr>
123
+ <th>Event</th>
124
+ <th>Tool</th>
125
+ <th>Actor</th>
126
+ <th>Time</th>
127
+ </tr>
128
+ </thead>
129
+ <tbody>
130
+ ${recentEventsRows}
131
+ </tbody>
132
+ </table>`}
133
+ </div>`;
134
+ return layoutTemplate('Dashboard', 'dashboard', content);
135
+ }
136
+ function approvalsTemplate(approvals, csrfToken) {
137
+ const csrfField = csrfToken ? `<input type="hidden" name="_csrf" value="${escapeHtml(csrfToken)}">` : '';
138
+ const rows = approvals.map(a => {
139
+ const statusBadge = a.status === 'pending'
140
+ ? '<span class="badge badge-yellow">pending</span>'
141
+ : a.status === 'approved'
142
+ ? '<span class="badge badge-green">approved</span>'
143
+ : a.status === 'denied'
144
+ ? '<span class="badge badge-red">denied</span>'
145
+ : '<span class="badge badge-blue">' + escapeHtml(a.status) + '</span>';
146
+ const actions = a.status === 'pending'
147
+ ? `<form method="POST" action="/admin/approvals/${escapeHtml(a.approval_id)}/approve" style="display:inline;">
148
+ ${csrfField}
149
+ <button type="submit" class="btn btn-success">Approve</button>
150
+ </form>
151
+ <form method="POST" action="/admin/approvals/${escapeHtml(a.approval_id)}/deny" style="display:inline; margin-left:4px;">
152
+ ${csrfField}
153
+ <button type="submit" class="btn btn-danger">Deny</button>
154
+ </form>`
155
+ : '-';
156
+ return `<tr>
157
+ <td>${escapeHtml(a.approval_id)}</td>
158
+ <td>${escapeHtml(a.tool_name || '-')}</td>
159
+ <td>${escapeHtml(a.actor_id || '-')}</td>
160
+ <td>${escapeHtml(a.scope || '-')}</td>
161
+ <td>${statusBadge}</td>
162
+ <td>${escapeHtml(a.reason || '-')}</td>
163
+ <td>${escapeHtml(a.created_at || '-')}</td>
164
+ <td>${actions}</td>
165
+ </tr>`;
166
+ }).join('\n');
167
+ const content = `
168
+ <div class="card">
169
+ ${approvals.length === 0
170
+ ? '<p style="color: #6b7280;">No pending approvals.</p>'
171
+ : `<table>
172
+ <thead>
173
+ <tr>
174
+ <th>ID</th>
175
+ <th>Tool</th>
176
+ <th>Actor</th>
177
+ <th>Scope</th>
178
+ <th>Status</th>
179
+ <th>Reason</th>
180
+ <th>Created</th>
181
+ <th>Actions</th>
182
+ </tr>
183
+ </thead>
184
+ <tbody>
185
+ ${rows}
186
+ </tbody>
187
+ </table>`}
188
+ </div>`;
189
+ return layoutTemplate('Approvals', 'approvals', content);
190
+ }
191
+ function policiesTemplate(policy, validationResult, csrfToken, policyYaml, applyResult) {
192
+ const csrfField = csrfToken ? `<input type="hidden" name="_csrf" value="${escapeHtml(csrfToken)}">` : '';
193
+ const policyJson = JSON.stringify(policy, null, 2);
194
+ const validationAlert = validationResult
195
+ ? validationResult.valid
196
+ ? '<div class="alert alert-success">Policy is valid.</div>'
197
+ : `<div class="alert alert-error">Validation errors: ${escapeHtml((validationResult.errors || []).join('; '))}</div>`
198
+ : '';
199
+ const applyAlert = applyResult
200
+ ? applyResult.success
201
+ ? `<div class="alert alert-success">${escapeHtml(applyResult.message)}</div>`
202
+ : `<div class="alert alert-error">${escapeHtml(applyResult.message)}</div>`
203
+ : '';
204
+ const yamlContent = policyYaml || '';
205
+ const content = `
206
+ ${applyAlert}
207
+ ${validationAlert}
208
+ <div class="card">
209
+ <h3 style="margin-bottom: 16px; color: #374151;">Edit Policy (YAML)</h3>
210
+ <form method="POST" action="/admin/policies/apply">
211
+ ${csrfField}
212
+ <div class="form-group">
213
+ <label for="policy_editor">Policy Pack YAML</label>
214
+ <div style="position: relative;">
215
+ <pre id="policy_highlight" aria-hidden="true" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: 0; padding: 8px 12px; border: 1px solid #d1d5db; border-radius: 6px; font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace; font-size: 13px; line-height: 1.5; tab-size: 2; overflow: auto; pointer-events: none; white-space: pre-wrap; word-wrap: break-word; color: transparent; background: transparent;"></pre>
216
+ <textarea id="policy_editor" name="policy_yaml" style="position: relative; min-height: 400px; font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace; font-size: 13px; line-height: 1.5; tab-size: 2; background: transparent; caret-color: #1a1d23; z-index: 1;">${escapeHtml(yamlContent)}</textarea>
217
+ </div>
218
+ <script>
219
+ (function() {
220
+ var ta = document.getElementById('policy_editor');
221
+ var pre = document.getElementById('policy_highlight');
222
+ if (!ta || !pre) return;
223
+ function highlightYaml(text) {
224
+ var escaped = text.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
225
+ return escaped
226
+ .replace(/^(\\s*#.*)$/gm, '<span style="color:#6b7280;font-style:italic;">$1</span>')
227
+ .replace(/^(\\s*[\\w][\\w.-]*)(\\s*:)/gm, '<span style="color:#2563eb;">$1</span>$2')
228
+ .replace(/:\\s*("(?:[^"\\\\]|\\\\.)*")/g, ': <span style="color:#059669;">$1</span>')
229
+ .replace(/:\\s*('(?:[^'\\\\]|\\\\.)*')/g, ': <span style="color:#059669;">$1</span>')
230
+ .replace(/:\\s*(\\d+\\.?\\d*)/g, ': <span style="color:#d97706;">$1</span>')
231
+ .replace(/:\\s*(true|false|null|yes|no)/gi, ': <span style="color:#dc2626;">$1</span>')
232
+ .replace(/(ALLOW|DENY|TRANSFORM|REQUIRE_APPROVAL)/g, '<span style="color:#7c3aed;font-weight:600;">$1</span>');
233
+ }
234
+ function sync() { pre.innerHTML = highlightYaml(ta.value) + '\\n'; }
235
+ ta.addEventListener('input', sync);
236
+ ta.addEventListener('scroll', function() { pre.scrollTop = ta.scrollTop; pre.scrollLeft = ta.scrollLeft; });
237
+ sync();
238
+ })();
239
+ </script>
240
+ </div>
241
+ <div style="display: flex; gap: 12px; align-items: center;">
242
+ <button type="submit" class="btn btn-success" style="font-size: 15px; padding: 10px 24px;">Save &amp; Apply</button>
243
+ </div>
244
+ </form>
245
+ <form method="POST" action="/admin/policies/reload" style="margin-top: 12px;">
246
+ ${csrfField}
247
+ <button type="submit" class="btn btn-primary">Reload from Disk</button>
248
+ </form>
249
+ </div>
250
+ <div class="card">
251
+ <h3 style="margin-bottom: 16px; color: #374151;">Active Policy Pack (read-only)</h3>
252
+ <pre>${escapeHtml(policyJson)}</pre>
253
+ </div>
254
+ <div class="card">
255
+ <h3 style="margin-bottom: 16px; color: #374151;">Validate Policy</h3>
256
+ <form method="POST" action="/admin/policies/validate">
257
+ ${csrfField}
258
+ <div class="form-group">
259
+ <label for="policy_validate_json">Policy Pack (JSON)</label>
260
+ <textarea id="policy_validate_json" name="policy_json" placeholder='{"name": "test", "version": "1.0", "rules": []}'></textarea>
261
+ </div>
262
+ <button type="submit" class="btn btn-primary">Validate</button>
263
+ </form>
264
+ </div>`;
265
+ return layoutTemplate('Policies', 'policies', content);
266
+ }
267
+ function budgetsTemplate(budgets, costSummary) {
268
+ const rows = budgets.map(b => {
269
+ const limitStr = b.limit !== undefined ? `$${b.limit.toFixed(2)}` : 'unlimited';
270
+ const pct = b.limit !== undefined && b.limit > 0 ? Math.min(100, (b.spent / b.limit) * 100) : 0;
271
+ const barColor = pct > 80 ? '#ef4444' : pct > 50 ? '#f59e0b' : '#10b981';
272
+ return `<tr>
273
+ <td>${escapeHtml(b.key)}</td>
274
+ <td>${escapeHtml(b.label)}</td>
275
+ <td>$${b.spent.toFixed(4)}</td>
276
+ <td>${limitStr}</td>
277
+ <td>
278
+ <div style="background:#e5e7eb; border-radius:4px; height:8px; width:120px; display:inline-block; vertical-align:middle;">
279
+ <div style="background:${barColor}; border-radius:4px; height:8px; width:${pct}%;"></div>
280
+ </div>
281
+ <span style="font-size:12px; color:#6b7280; margin-left:6px;">${pct.toFixed(0)}%</span>
282
+ </td>
283
+ </tr>`;
284
+ }).join('\n');
285
+ const costSummaryHtml = costSummary ? `
286
+ <div class="stats-grid" style="margin-bottom: 24px;">
287
+ <div class="stat-card">
288
+ <div class="value">$${costSummary.estimated_total.toFixed(4)}</div>
289
+ <div class="label">Estimated Cost (Total)</div>
290
+ </div>
291
+ <div class="stat-card">
292
+ <div class="value">$${costSummary.actual_total.toFixed(4)}</div>
293
+ <div class="label">Actual Cost (Total)</div>
294
+ </div>
295
+ </div>
296
+ ${costSummary.top_tools.length > 0 ? `<div class="card" style="margin-bottom: 20px;">
297
+ <h3 style="margin-bottom: 16px; color: #374151;">Top Tools by Cost</h3>
298
+ <table>
299
+ <thead><tr><th>Tool</th><th>Cost (USD)</th></tr></thead>
300
+ <tbody>
301
+ ${costSummary.top_tools.map(t => `<tr><td>${escapeHtml(t.tool_name)}</td><td>$${t.cost.toFixed(4)}</td></tr>`).join('\n')}
302
+ </tbody>
303
+ </table>
304
+ </div>` : ''}` : '';
305
+ const content = `
306
+ ${costSummaryHtml}
307
+ <div class="card">
308
+ ${budgets.length === 0
309
+ ? '<p style="color: #6b7280;">No budget data available.</p>'
310
+ : `<table>
311
+ <thead>
312
+ <tr>
313
+ <th>Key</th>
314
+ <th>Type</th>
315
+ <th>Spent</th>
316
+ <th>Limit</th>
317
+ <th>Usage</th>
318
+ </tr>
319
+ </thead>
320
+ <tbody>
321
+ ${rows}
322
+ </tbody>
323
+ </table>`}
324
+ </div>`;
325
+ return layoutTemplate('Budgets', 'budgets', content);
326
+ }
327
+ function paginationControls(info, baseUrl) {
328
+ if (info.totalPages <= 1)
329
+ return '';
330
+ const prevDisabled = info.page <= 1;
331
+ const nextDisabled = info.page >= info.totalPages;
332
+ return `<div style="display: flex; align-items: center; justify-content: center; gap: 12px; margin-top: 16px; padding-top: 16px; border-top: 1px solid #e5e7eb;">
333
+ ${prevDisabled
334
+ ? '<span class="btn" style="opacity: 0.5; cursor: default;">&larr; Previous</span>'
335
+ : `<a href="${baseUrl}?page=${info.page - 1}&limit=${info.limit}" class="btn btn-primary">&larr; Previous</a>`}
336
+ <span style="font-size: 14px; color: #374151;">Page ${info.page} of ${info.totalPages} (${info.total} total)</span>
337
+ ${nextDisabled
338
+ ? '<span class="btn" style="opacity: 0.5; cursor: default;">Next &rarr;</span>'
339
+ : `<a href="${baseUrl}?page=${info.page + 1}&limit=${info.limit}" class="btn btn-primary">Next &rarr;</a>`}
340
+ </div>`;
341
+ }
342
+ function traceListTemplate(traces, pagination) {
343
+ const content = `
344
+ <div class="card">
345
+ <h3 style="margin-bottom: 16px; color: #374151;">Search Traces</h3>
346
+ <form method="GET" action="/admin/traces" style="display: flex; gap: 8px; align-items: flex-end;">
347
+ <div class="form-group" style="flex: 1; margin-bottom: 0;">
348
+ <label for="task_id">Task ID</label>
349
+ <input type="text" id="task_id" name="task_id" placeholder="Enter a task_id to search..." />
350
+ </div>
351
+ <button type="submit" class="btn btn-primary" style="height: 38px;">Search</button>
352
+ </form>
353
+ </div>
354
+ <div class="card">
355
+ <h3 style="margin-bottom: 16px; color: #374151;">Recent Task IDs</h3>
356
+ ${traces.length === 0
357
+ ? '<p style="color: #6b7280;">No trace data available.</p>'
358
+ : `<table>
359
+ <thead>
360
+ <tr>
361
+ <th>Task ID</th>
362
+ <th>Events</th>
363
+ <th>First Seen</th>
364
+ <th>Actions</th>
365
+ </tr>
366
+ </thead>
367
+ <tbody>
368
+ ${traces.map(t => `<tr>
369
+ <td>${escapeHtml(t.task_id)}</td>
370
+ <td>${t.event_count}</td>
371
+ <td>${escapeHtml(t.first_seen || '-')}</td>
372
+ <td><a href="/admin/traces/${escapeHtml(t.task_id)}" class="btn btn-primary">View</a></td>
373
+ </tr>`).join('\n')}
374
+ </tbody>
375
+ </table>
376
+ ${pagination ? paginationControls(pagination, '/admin/traces') : ''}`}
377
+ </div>`;
378
+ return layoutTemplate('Traces', 'traces', content);
379
+ }
380
+ function traceDetailTemplate(taskId, events) {
381
+ const rows = events.map(e => {
382
+ const eventType = escapeHtml(e.event_type || '');
383
+ const badgeClass = eventType.includes('DENIED') || eventType.includes('INCIDENT')
384
+ ? 'badge-red'
385
+ : eventType.includes('APPROVAL_REQUESTED') || eventType.includes('APPROVAL_EXPIRED')
386
+ ? 'badge-yellow'
387
+ : eventType.includes('APPROVED') || eventType.includes('EXECUTED') || eventType.includes('RETURNED')
388
+ ? 'badge-green'
389
+ : 'badge-blue';
390
+ return `<tr>
391
+ <td>${escapeHtml(e.event_id || '-')}</td>
392
+ <td><span class="badge ${badgeClass}">${eventType}</span></td>
393
+ <td>${escapeHtml(e.tool_name || '-')}</td>
394
+ <td>${escapeHtml(e.actor_id || '-')}</td>
395
+ <td>${escapeHtml(e.timestamp || '-')}</td>
396
+ <td><pre style="margin:0; padding:4px 8px; font-size:11px; max-width:400px; overflow-x:auto; white-space:pre-wrap; word-break:break-word;">${escapeHtml(JSON.stringify(e.metadata || {}, null, 2))}</pre></td>
397
+ </tr>`;
398
+ }).join('\n');
399
+ const content = `
400
+ <div style="margin-bottom: 16px;">
401
+ <a href="/admin/traces" style="color: #3b82f6; text-decoration: none;">&larr; Back to Traces</a>
402
+ </div>
403
+ <div class="card">
404
+ <h3 style="margin-bottom: 16px; color: #374151;">Task: ${escapeHtml(taskId)}</h3>
405
+ ${events.length === 0
406
+ ? '<p style="color: #6b7280;">No events found for this task.</p>'
407
+ : `<table>
408
+ <thead>
409
+ <tr>
410
+ <th>Event ID</th>
411
+ <th>Type</th>
412
+ <th>Tool</th>
413
+ <th>Actor</th>
414
+ <th>Time</th>
415
+ <th>Metadata</th>
416
+ </tr>
417
+ </thead>
418
+ <tbody>
419
+ ${rows}
420
+ </tbody>
421
+ </table>`}
422
+ </div>`;
423
+ return layoutTemplate(`Trace: ${taskId}`, 'traces', content);
424
+ }
425
+ function apiKeysTemplate(keys, csrfToken, createdKey) {
426
+ const csrfField = csrfToken ? `<input type="hidden" name="_csrf" value="${escapeHtml(csrfToken)}">` : '';
427
+ const createdAlert = createdKey
428
+ ? `<div class="alert alert-success">
429
+ New API key created: <code style="background:#065f46; color:#d1fae5; padding:2px 8px; border-radius:4px; font-size:14px; user-select:all;">${escapeHtml(createdKey)}</code>
430
+ <br><strong>Copy this key now &mdash; it won&rsquo;t be shown again.</strong>
431
+ </div>`
432
+ : '';
433
+ const rows = keys.map(k => {
434
+ const maskedKey = k.key.length > 8
435
+ ? k.key.substring(0, 4) + '...' + k.key.substring(k.key.length - 4)
436
+ : k.key;
437
+ const statusBadge = k.revoked
438
+ ? '<span class="badge badge-red">revoked</span>'
439
+ : k.expires_at && new Date(k.expires_at) < new Date()
440
+ ? '<span class="badge badge-yellow">expired</span>'
441
+ : '<span class="badge badge-green">active</span>';
442
+ const revokeAction = !k.revoked
443
+ ? `<form method="POST" action="/admin/api-keys/${escapeHtml(k.key)}/revoke" style="display:inline;">
444
+ ${csrfField}
445
+ <button type="submit" class="btn btn-danger">Revoke</button>
446
+ </form>`
447
+ : '-';
448
+ return `<tr>
449
+ <td>${escapeHtml(maskedKey)}</td>
450
+ <td>${escapeHtml(k.workspace_id)}</td>
451
+ <td>${escapeHtml(k.description || '-')}</td>
452
+ <td>${(k.roles || []).map(r => `<span class="badge badge-blue">${escapeHtml(r)}</span>`).join(' ') || '-'}</td>
453
+ <td>${statusBadge}</td>
454
+ <td>${escapeHtml(k.created_at || '-')}</td>
455
+ <td>${revokeAction}</td>
456
+ </tr>`;
457
+ }).join('\n');
458
+ const content = `
459
+ ${createdAlert}
460
+ <div class="card">
461
+ <h3 style="margin-bottom: 16px; color: #374151;">Create New API Key</h3>
462
+ <form method="POST" action="/admin/api-keys">
463
+ ${csrfField}
464
+ <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 16px;">
465
+ <div class="form-group">
466
+ <label for="workspace_id">Workspace ID</label>
467
+ <input type="text" id="workspace_id" name="workspace_id" placeholder="ws_example" required />
468
+ </div>
469
+ <div class="form-group">
470
+ <label for="description">Description</label>
471
+ <input type="text" id="description" name="description" placeholder="Key description" />
472
+ </div>
473
+ </div>
474
+ <button type="submit" class="btn btn-primary">Create Key</button>
475
+ </form>
476
+ </div>
477
+ <div class="card">
478
+ <h3 style="margin-bottom: 16px; color: #374151;">API Keys</h3>
479
+ ${keys.length === 0
480
+ ? '<p style="color: #6b7280;">No API keys configured.</p>'
481
+ : `<table>
482
+ <thead>
483
+ <tr>
484
+ <th>Key</th>
485
+ <th>Workspace</th>
486
+ <th>Description</th>
487
+ <th>Roles</th>
488
+ <th>Status</th>
489
+ <th>Created</th>
490
+ <th>Actions</th>
491
+ </tr>
492
+ </thead>
493
+ <tbody>
494
+ ${rows}
495
+ </tbody>
496
+ </table>`}
497
+ </div>`;
498
+ return layoutTemplate('API Keys', 'api-keys', content);
499
+ }
500
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/admin/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ import { ToolCall } from '../types/tool-call';
2
+ export interface AnomalyConfig {
3
+ enabled: boolean;
4
+ /** Window size for rolling baseline in milliseconds (default: 3600000 = 1 hour) */
5
+ window_ms?: number;
6
+ /** Number of standard deviations before flagging anomaly (default: 3) */
7
+ z_score_threshold?: number;
8
+ /** Minimum number of data points before anomaly detection activates (default: 10) */
9
+ min_samples?: number;
10
+ /** Action on anomaly: 'log' just records, 'flag' adds to result metadata, 'block' denies the call */
11
+ action?: 'log' | 'flag' | 'block';
12
+ /** Per-actor tracking (default: true) */
13
+ track_actors?: boolean;
14
+ /** Per-tool tracking (default: true) */
15
+ track_tools?: boolean;
16
+ /** Per-workspace tracking (default: true) */
17
+ track_workspaces?: boolean;
18
+ }
19
+ export interface AnomalyAlert {
20
+ alert_id: string;
21
+ timestamp: string;
22
+ anomaly_type: AnomalyType;
23
+ entity_type: 'actor' | 'tool' | 'workspace';
24
+ entity_id: string;
25
+ metric: string;
26
+ current_value: number;
27
+ baseline_mean: number;
28
+ baseline_stddev: number;
29
+ z_score: number;
30
+ severity: 'low' | 'medium' | 'high';
31
+ }
32
+ export type AnomalyType = 'request_rate_spike' | 'error_rate_spike' | 'latency_spike' | 'new_tool_usage' | 'off_hours_activity' | 'capability_escalation' | 'unusual_payload_size';
33
+ export interface AnomalyState {
34
+ windows: Record<string, {
35
+ timestamps: number[];
36
+ values: number[];
37
+ }>;
38
+ actorTools: Record<string, string[]>;
39
+ actorCaps: Record<string, string[]>;
40
+ alerts: AnomalyAlert[];
41
+ }
42
+ export declare class RollingWindow {
43
+ private timestamps;
44
+ private values;
45
+ private windowMs;
46
+ constructor(windowMs: number);
47
+ /** Add a data point */
48
+ record(value: number, timestamp?: number): void;
49
+ /** Remove data points outside the window */
50
+ private prune;
51
+ /** Get count of data points in window */
52
+ count(): number;
53
+ /** Get mean of values in window */
54
+ mean(): number;
55
+ /** Get standard deviation (sample stddev) */
56
+ stddev(): number;
57
+ /** Calculate z-score for a new value */
58
+ zScore(value: number): number;
59
+ /** Get rate (count / window duration in seconds) */
60
+ rate(): number;
61
+ /** Reset window */
62
+ reset(): void;
63
+ /** Serialize window state for persistence */
64
+ serialize(): {
65
+ timestamps: number[];
66
+ values: number[];
67
+ };
68
+ /** Restore window state from serialized data */
69
+ static deserialize(data: {
70
+ timestamps: number[];
71
+ values: number[];
72
+ }, windowMs: number): RollingWindow;
73
+ }
74
+ export declare class AnomalyDetector {
75
+ private config;
76
+ private windows;
77
+ private actorToolHistory;
78
+ private actorCapabilityHistory;
79
+ private offHoursAlertedThisHour;
80
+ private alerts;
81
+ private maxAlerts;
82
+ private maxEntities;
83
+ private windowLastUpdated;
84
+ private actorToolLastUpdated;
85
+ private actorCapLastUpdated;
86
+ private cleanupInterval;
87
+ constructor(config: AnomalyConfig, options?: {
88
+ maxEntities?: number;
89
+ });
90
+ /** Stop the periodic cleanup interval. Call in tests or on shutdown. */
91
+ destroy(): void;
92
+ /** Remove entries that haven't been updated within the window duration. */
93
+ private cleanupStaleEntries;
94
+ /** Evict the oldest entry from a map+timestamps pair when over limit. */
95
+ private evictOldest;
96
+ /**
97
+ * Analyze a tool call for anomalies. Called in the gateway pipeline.
98
+ * Returns an array of anomaly alerts (empty if no anomalies detected).
99
+ */
100
+ analyze(toolCall: ToolCall): AnomalyAlert[];
101
+ /**
102
+ * Record the result of a tool execution for latency/error tracking.
103
+ * Called after execution completes.
104
+ */
105
+ recordResult(toolCall: ToolCall, durationMs: number, isError: boolean): void;
106
+ /**
107
+ * Check if a new latency/error reading is anomalous.
108
+ * Returns alerts for latency spikes and error rate spikes.
109
+ */
110
+ analyzeResult(toolCall: ToolCall, durationMs: number, isError: boolean): AnomalyAlert[];
111
+ /** Get recent alerts */
112
+ getAlerts(limit?: number): AnomalyAlert[];
113
+ /** Get alerts for a specific entity */
114
+ getAlertsForEntity(entityType: string, entityId: string): AnomalyAlert[];
115
+ /** Get baseline stats for an entity+metric */
116
+ getBaseline(entityType: string, entityId: string, metric: string): {
117
+ mean: number;
118
+ stddev: number;
119
+ count: number;
120
+ } | null;
121
+ /** Get a baseline report suitable for the anomaly radar dashboard widget */
122
+ getBaselineReport(): {
123
+ current: Record<string, number>;
124
+ baseline: Record<string, number>;
125
+ alerts: AnomalyAlert[];
126
+ };
127
+ /** Reset all tracking data */
128
+ reset(): void;
129
+ /** Export all state for persistence. Returns a JSON-serializable object. */
130
+ exportState(): AnomalyState;
131
+ /** Import state from a previously exported snapshot. */
132
+ importState(state: AnomalyState): void;
133
+ private getOrCreateWindow;
134
+ private checkRequestRate;
135
+ private checkNewToolUsage;
136
+ private checkCapabilityEscalation;
137
+ private checkOffHours;
138
+ private createAlert;
139
+ private classifySeverity;
140
+ }
141
+ //# sourceMappingURL=detector.d.ts.map