@lleverage-ai/agent-sdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2321 -0
  3. package/dist/agent.d.ts +52 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +2122 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/backend.d.ts +378 -0
  8. package/dist/backend.d.ts.map +1 -0
  9. package/dist/backend.js +71 -0
  10. package/dist/backend.js.map +1 -0
  11. package/dist/backends/composite.d.ts +258 -0
  12. package/dist/backends/composite.d.ts.map +1 -0
  13. package/dist/backends/composite.js +437 -0
  14. package/dist/backends/composite.js.map +1 -0
  15. package/dist/backends/filesystem.d.ts +268 -0
  16. package/dist/backends/filesystem.d.ts.map +1 -0
  17. package/dist/backends/filesystem.js +623 -0
  18. package/dist/backends/filesystem.js.map +1 -0
  19. package/dist/backends/index.d.ts +14 -0
  20. package/dist/backends/index.d.ts.map +1 -0
  21. package/dist/backends/index.js +14 -0
  22. package/dist/backends/index.js.map +1 -0
  23. package/dist/backends/persistent.d.ts +312 -0
  24. package/dist/backends/persistent.d.ts.map +1 -0
  25. package/dist/backends/persistent.js +519 -0
  26. package/dist/backends/persistent.js.map +1 -0
  27. package/dist/backends/sandbox.d.ts +315 -0
  28. package/dist/backends/sandbox.d.ts.map +1 -0
  29. package/dist/backends/sandbox.js +490 -0
  30. package/dist/backends/sandbox.js.map +1 -0
  31. package/dist/backends/state.d.ts +225 -0
  32. package/dist/backends/state.d.ts.map +1 -0
  33. package/dist/backends/state.js +396 -0
  34. package/dist/backends/state.js.map +1 -0
  35. package/dist/checkpointer/file-saver.d.ts +182 -0
  36. package/dist/checkpointer/file-saver.d.ts.map +1 -0
  37. package/dist/checkpointer/file-saver.js +298 -0
  38. package/dist/checkpointer/file-saver.js.map +1 -0
  39. package/dist/checkpointer/index.d.ts +40 -0
  40. package/dist/checkpointer/index.d.ts.map +1 -0
  41. package/dist/checkpointer/index.js +40 -0
  42. package/dist/checkpointer/index.js.map +1 -0
  43. package/dist/checkpointer/kv-saver.d.ts +142 -0
  44. package/dist/checkpointer/kv-saver.d.ts.map +1 -0
  45. package/dist/checkpointer/kv-saver.js +176 -0
  46. package/dist/checkpointer/kv-saver.js.map +1 -0
  47. package/dist/checkpointer/memory-saver.d.ts +158 -0
  48. package/dist/checkpointer/memory-saver.d.ts.map +1 -0
  49. package/dist/checkpointer/memory-saver.js +222 -0
  50. package/dist/checkpointer/memory-saver.js.map +1 -0
  51. package/dist/checkpointer/types.d.ts +353 -0
  52. package/dist/checkpointer/types.d.ts.map +1 -0
  53. package/dist/checkpointer/types.js +159 -0
  54. package/dist/checkpointer/types.js.map +1 -0
  55. package/dist/context-manager.d.ts +627 -0
  56. package/dist/context-manager.d.ts.map +1 -0
  57. package/dist/context-manager.js +1039 -0
  58. package/dist/context-manager.js.map +1 -0
  59. package/dist/context.d.ts +57 -0
  60. package/dist/context.d.ts.map +1 -0
  61. package/dist/context.js +76 -0
  62. package/dist/context.js.map +1 -0
  63. package/dist/errors/index.d.ts +611 -0
  64. package/dist/errors/index.d.ts.map +1 -0
  65. package/dist/errors/index.js +1023 -0
  66. package/dist/errors/index.js.map +1 -0
  67. package/dist/generation-helpers.d.ts +126 -0
  68. package/dist/generation-helpers.d.ts.map +1 -0
  69. package/dist/generation-helpers.js +181 -0
  70. package/dist/generation-helpers.js.map +1 -0
  71. package/dist/hooks/audit.d.ts +210 -0
  72. package/dist/hooks/audit.d.ts.map +1 -0
  73. package/dist/hooks/audit.js +305 -0
  74. package/dist/hooks/audit.js.map +1 -0
  75. package/dist/hooks/cache.d.ts +180 -0
  76. package/dist/hooks/cache.d.ts.map +1 -0
  77. package/dist/hooks/cache.js +273 -0
  78. package/dist/hooks/cache.js.map +1 -0
  79. package/dist/hooks/guardrails.d.ts +145 -0
  80. package/dist/hooks/guardrails.d.ts.map +1 -0
  81. package/dist/hooks/guardrails.js +326 -0
  82. package/dist/hooks/guardrails.js.map +1 -0
  83. package/dist/hooks/index.d.ts +18 -0
  84. package/dist/hooks/index.d.ts.map +1 -0
  85. package/dist/hooks/index.js +32 -0
  86. package/dist/hooks/index.js.map +1 -0
  87. package/dist/hooks/logging.d.ts +193 -0
  88. package/dist/hooks/logging.d.ts.map +1 -0
  89. package/dist/hooks/logging.js +345 -0
  90. package/dist/hooks/logging.js.map +1 -0
  91. package/dist/hooks/parallel-guardrails.d.ts +268 -0
  92. package/dist/hooks/parallel-guardrails.d.ts.map +1 -0
  93. package/dist/hooks/parallel-guardrails.js +416 -0
  94. package/dist/hooks/parallel-guardrails.js.map +1 -0
  95. package/dist/hooks/rate-limit.d.ts +305 -0
  96. package/dist/hooks/rate-limit.d.ts.map +1 -0
  97. package/dist/hooks/rate-limit.js +372 -0
  98. package/dist/hooks/rate-limit.js.map +1 -0
  99. package/dist/hooks/retry.d.ts +144 -0
  100. package/dist/hooks/retry.d.ts.map +1 -0
  101. package/dist/hooks/retry.js +210 -0
  102. package/dist/hooks/retry.js.map +1 -0
  103. package/dist/hooks/secrets.d.ts +174 -0
  104. package/dist/hooks/secrets.d.ts.map +1 -0
  105. package/dist/hooks/secrets.js +306 -0
  106. package/dist/hooks/secrets.js.map +1 -0
  107. package/dist/hooks.d.ts +229 -0
  108. package/dist/hooks.d.ts.map +1 -0
  109. package/dist/hooks.js +352 -0
  110. package/dist/hooks.js.map +1 -0
  111. package/dist/index.d.ts +97 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +182 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/mcp/env.d.ts +25 -0
  116. package/dist/mcp/env.d.ts.map +1 -0
  117. package/dist/mcp/env.js +18 -0
  118. package/dist/mcp/env.js.map +1 -0
  119. package/dist/mcp/index.d.ts +16 -0
  120. package/dist/mcp/index.d.ts.map +1 -0
  121. package/dist/mcp/index.js +17 -0
  122. package/dist/mcp/index.js.map +1 -0
  123. package/dist/mcp/manager.d.ts +184 -0
  124. package/dist/mcp/manager.d.ts.map +1 -0
  125. package/dist/mcp/manager.js +446 -0
  126. package/dist/mcp/manager.js.map +1 -0
  127. package/dist/mcp/types.d.ts +58 -0
  128. package/dist/mcp/types.d.ts.map +1 -0
  129. package/dist/mcp/types.js +7 -0
  130. package/dist/mcp/types.js.map +1 -0
  131. package/dist/mcp/validation.d.ts +119 -0
  132. package/dist/mcp/validation.d.ts.map +1 -0
  133. package/dist/mcp/validation.js +407 -0
  134. package/dist/mcp/validation.js.map +1 -0
  135. package/dist/mcp/virtual-server.d.ts +78 -0
  136. package/dist/mcp/virtual-server.d.ts.map +1 -0
  137. package/dist/mcp/virtual-server.js +137 -0
  138. package/dist/mcp/virtual-server.js.map +1 -0
  139. package/dist/memory/filesystem-store.d.ts +217 -0
  140. package/dist/memory/filesystem-store.d.ts.map +1 -0
  141. package/dist/memory/filesystem-store.js +343 -0
  142. package/dist/memory/filesystem-store.js.map +1 -0
  143. package/dist/memory/index.d.ts +46 -0
  144. package/dist/memory/index.d.ts.map +1 -0
  145. package/dist/memory/index.js +46 -0
  146. package/dist/memory/index.js.map +1 -0
  147. package/dist/memory/loader.d.ts +396 -0
  148. package/dist/memory/loader.d.ts.map +1 -0
  149. package/dist/memory/loader.js +419 -0
  150. package/dist/memory/loader.js.map +1 -0
  151. package/dist/memory/permissions.d.ts +282 -0
  152. package/dist/memory/permissions.d.ts.map +1 -0
  153. package/dist/memory/permissions.js +297 -0
  154. package/dist/memory/permissions.js.map +1 -0
  155. package/dist/memory/rules.d.ts +249 -0
  156. package/dist/memory/rules.d.ts.map +1 -0
  157. package/dist/memory/rules.js +362 -0
  158. package/dist/memory/rules.js.map +1 -0
  159. package/dist/memory/store.d.ts +286 -0
  160. package/dist/memory/store.d.ts.map +1 -0
  161. package/dist/memory/store.js +263 -0
  162. package/dist/memory/store.js.map +1 -0
  163. package/dist/middleware/apply.d.ts +73 -0
  164. package/dist/middleware/apply.d.ts.map +1 -0
  165. package/dist/middleware/apply.js +219 -0
  166. package/dist/middleware/apply.js.map +1 -0
  167. package/dist/middleware/context.d.ts +33 -0
  168. package/dist/middleware/context.d.ts.map +1 -0
  169. package/dist/middleware/context.js +176 -0
  170. package/dist/middleware/context.js.map +1 -0
  171. package/dist/middleware/index.d.ts +31 -0
  172. package/dist/middleware/index.d.ts.map +1 -0
  173. package/dist/middleware/index.js +32 -0
  174. package/dist/middleware/index.js.map +1 -0
  175. package/dist/middleware/logging.d.ts +137 -0
  176. package/dist/middleware/logging.d.ts.map +1 -0
  177. package/dist/middleware/logging.js +374 -0
  178. package/dist/middleware/logging.js.map +1 -0
  179. package/dist/middleware/types.d.ts +183 -0
  180. package/dist/middleware/types.d.ts.map +1 -0
  181. package/dist/middleware/types.js +11 -0
  182. package/dist/middleware/types.js.map +1 -0
  183. package/dist/observability/events.d.ts +183 -0
  184. package/dist/observability/events.d.ts.map +1 -0
  185. package/dist/observability/events.js +305 -0
  186. package/dist/observability/events.js.map +1 -0
  187. package/dist/observability/index.d.ts +55 -0
  188. package/dist/observability/index.d.ts.map +1 -0
  189. package/dist/observability/index.js +87 -0
  190. package/dist/observability/index.js.map +1 -0
  191. package/dist/observability/logger.d.ts +318 -0
  192. package/dist/observability/logger.d.ts.map +1 -0
  193. package/dist/observability/logger.js +436 -0
  194. package/dist/observability/logger.js.map +1 -0
  195. package/dist/observability/metrics.d.ts +341 -0
  196. package/dist/observability/metrics.d.ts.map +1 -0
  197. package/dist/observability/metrics.js +490 -0
  198. package/dist/observability/metrics.js.map +1 -0
  199. package/dist/observability/preset.d.ts +161 -0
  200. package/dist/observability/preset.d.ts.map +1 -0
  201. package/dist/observability/preset.js +133 -0
  202. package/dist/observability/preset.js.map +1 -0
  203. package/dist/observability/streaming.d.ts +113 -0
  204. package/dist/observability/streaming.d.ts.map +1 -0
  205. package/dist/observability/streaming.js +114 -0
  206. package/dist/observability/streaming.js.map +1 -0
  207. package/dist/observability/tracing.d.ts +378 -0
  208. package/dist/observability/tracing.d.ts.map +1 -0
  209. package/dist/observability/tracing.js +539 -0
  210. package/dist/observability/tracing.js.map +1 -0
  211. package/dist/plugins.d.ts +55 -0
  212. package/dist/plugins.d.ts.map +1 -0
  213. package/dist/plugins.js +63 -0
  214. package/dist/plugins.js.map +1 -0
  215. package/dist/presets/index.d.ts +7 -0
  216. package/dist/presets/index.d.ts.map +1 -0
  217. package/dist/presets/index.js +7 -0
  218. package/dist/presets/index.js.map +1 -0
  219. package/dist/presets/production.d.ts +262 -0
  220. package/dist/presets/production.d.ts.map +1 -0
  221. package/dist/presets/production.js +295 -0
  222. package/dist/presets/production.js.map +1 -0
  223. package/dist/security/index.d.ts +179 -0
  224. package/dist/security/index.d.ts.map +1 -0
  225. package/dist/security/index.js +323 -0
  226. package/dist/security/index.js.map +1 -0
  227. package/dist/subagents/advanced.d.ts +413 -0
  228. package/dist/subagents/advanced.d.ts.map +1 -0
  229. package/dist/subagents/advanced.js +396 -0
  230. package/dist/subagents/advanced.js.map +1 -0
  231. package/dist/subagents/index.d.ts +14 -0
  232. package/dist/subagents/index.d.ts.map +1 -0
  233. package/dist/subagents/index.js +15 -0
  234. package/dist/subagents/index.js.map +1 -0
  235. package/dist/subagents.d.ts +73 -0
  236. package/dist/subagents.d.ts.map +1 -0
  237. package/dist/subagents.js +213 -0
  238. package/dist/subagents.js.map +1 -0
  239. package/dist/task-store/file-store.d.ts +76 -0
  240. package/dist/task-store/file-store.d.ts.map +1 -0
  241. package/dist/task-store/file-store.js +190 -0
  242. package/dist/task-store/file-store.js.map +1 -0
  243. package/dist/task-store/index.d.ts +11 -0
  244. package/dist/task-store/index.d.ts.map +1 -0
  245. package/dist/task-store/index.js +10 -0
  246. package/dist/task-store/index.js.map +1 -0
  247. package/dist/task-store/kv-store.d.ts +140 -0
  248. package/dist/task-store/kv-store.d.ts.map +1 -0
  249. package/dist/task-store/kv-store.js +169 -0
  250. package/dist/task-store/kv-store.js.map +1 -0
  251. package/dist/task-store/memory-store.d.ts +66 -0
  252. package/dist/task-store/memory-store.d.ts.map +1 -0
  253. package/dist/task-store/memory-store.js +125 -0
  254. package/dist/task-store/memory-store.js.map +1 -0
  255. package/dist/task-store/types.d.ts +235 -0
  256. package/dist/task-store/types.d.ts.map +1 -0
  257. package/dist/task-store/types.js +110 -0
  258. package/dist/task-store/types.js.map +1 -0
  259. package/dist/testing/assertions.d.ts +401 -0
  260. package/dist/testing/assertions.d.ts.map +1 -0
  261. package/dist/testing/assertions.js +630 -0
  262. package/dist/testing/assertions.js.map +1 -0
  263. package/dist/testing/index.d.ts +343 -0
  264. package/dist/testing/index.d.ts.map +1 -0
  265. package/dist/testing/index.js +360 -0
  266. package/dist/testing/index.js.map +1 -0
  267. package/dist/testing/mock-agent.d.ts +214 -0
  268. package/dist/testing/mock-agent.d.ts.map +1 -0
  269. package/dist/testing/mock-agent.js +448 -0
  270. package/dist/testing/mock-agent.js.map +1 -0
  271. package/dist/testing/recorder.d.ts +288 -0
  272. package/dist/testing/recorder.d.ts.map +1 -0
  273. package/dist/testing/recorder.js +499 -0
  274. package/dist/testing/recorder.js.map +1 -0
  275. package/dist/tools/execute.d.ts +104 -0
  276. package/dist/tools/execute.d.ts.map +1 -0
  277. package/dist/tools/execute.js +191 -0
  278. package/dist/tools/execute.js.map +1 -0
  279. package/dist/tools/factory.d.ts +260 -0
  280. package/dist/tools/factory.d.ts.map +1 -0
  281. package/dist/tools/factory.js +241 -0
  282. package/dist/tools/factory.js.map +1 -0
  283. package/dist/tools/filesystem.d.ts +215 -0
  284. package/dist/tools/filesystem.d.ts.map +1 -0
  285. package/dist/tools/filesystem.js +311 -0
  286. package/dist/tools/filesystem.js.map +1 -0
  287. package/dist/tools/index.d.ts +33 -0
  288. package/dist/tools/index.d.ts.map +1 -0
  289. package/dist/tools/index.js +33 -0
  290. package/dist/tools/index.js.map +1 -0
  291. package/dist/tools/search.d.ts +59 -0
  292. package/dist/tools/search.d.ts.map +1 -0
  293. package/dist/tools/search.js +94 -0
  294. package/dist/tools/search.js.map +1 -0
  295. package/dist/tools/skills.d.ts +354 -0
  296. package/dist/tools/skills.d.ts.map +1 -0
  297. package/dist/tools/skills.js +413 -0
  298. package/dist/tools/skills.js.map +1 -0
  299. package/dist/tools/task.d.ts +272 -0
  300. package/dist/tools/task.d.ts.map +1 -0
  301. package/dist/tools/task.js +521 -0
  302. package/dist/tools/task.js.map +1 -0
  303. package/dist/tools/todos.d.ts +131 -0
  304. package/dist/tools/todos.d.ts.map +1 -0
  305. package/dist/tools/todos.js +120 -0
  306. package/dist/tools/todos.js.map +1 -0
  307. package/dist/tools/tool-registry.d.ts +424 -0
  308. package/dist/tools/tool-registry.d.ts.map +1 -0
  309. package/dist/tools/tool-registry.js +607 -0
  310. package/dist/tools/tool-registry.js.map +1 -0
  311. package/dist/tools/user-interaction.d.ts +116 -0
  312. package/dist/tools/user-interaction.d.ts.map +1 -0
  313. package/dist/tools/user-interaction.js +147 -0
  314. package/dist/tools/user-interaction.js.map +1 -0
  315. package/dist/tools/utils.d.ts +124 -0
  316. package/dist/tools/utils.d.ts.map +1 -0
  317. package/dist/tools/utils.js +189 -0
  318. package/dist/tools/utils.js.map +1 -0
  319. package/dist/tools.d.ts +74 -0
  320. package/dist/tools.d.ts.map +1 -0
  321. package/dist/tools.js +73 -0
  322. package/dist/tools.js.map +1 -0
  323. package/dist/types.d.ts +2421 -0
  324. package/dist/types.d.ts.map +1 -0
  325. package/dist/types.js +55 -0
  326. package/dist/types.js.map +1 -0
  327. package/package.json +81 -0
@@ -0,0 +1,306 @@
1
+ /**
2
+ * Secrets filtering hook utilities.
3
+ *
4
+ * Provides hooks to detect and redact common secret patterns in inputs
5
+ * and outputs using the unified hook system.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ /**
10
+ * Common secret patterns for automatic detection.
11
+ *
12
+ * @category Hooks
13
+ */
14
+ export const COMMON_SECRET_PATTERNS = {
15
+ /** AWS access keys (AKIA...) */
16
+ AWS_ACCESS_KEY: /AKIA[0-9A-Z]{16}/g,
17
+ /** AWS secret keys (40 chars base64) */
18
+ AWS_SECRET_KEY: /[A-Za-z0-9/+=]{40}/g,
19
+ /** GitHub personal access tokens */
20
+ GITHUB_TOKEN: /ghp_[A-Za-z0-9]{36}/g,
21
+ /** GitHub OAuth tokens */
22
+ GITHUB_OAUTH: /gho_[A-Za-z0-9]{36}/g,
23
+ /** Generic API keys (common formats) */
24
+ API_KEY: /api[_-]?key[_-]?[=:]\s*['""]?[A-Za-z0-9_-]{20,}['""]?/gi,
25
+ /** Bearer tokens */
26
+ BEARER_TOKEN: /Bearer\s+[A-Za-z0-9_\-.]+/gi,
27
+ /** JWT tokens */
28
+ JWT: /eyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*/g,
29
+ /** Private keys (PEM format headers) */
30
+ PRIVATE_KEY: /-----BEGIN\s+(?:RSA|EC|OPENSSH|DSA)?\s*PRIVATE KEY-----[\s\S]*?-----END\s+(?:RSA|EC|OPENSSH|DSA)?\s*PRIVATE KEY-----/g,
31
+ /** Generic passwords in common formats */
32
+ PASSWORD: /password[_-]?[=:]\s*['""]?[^\s'"",;]{6,}['""]?/gi,
33
+ /** Slack tokens */
34
+ SLACK_TOKEN: /xox[baprs]-[0-9a-zA-Z]{10,48}/g,
35
+ /** Stripe API keys */
36
+ STRIPE_KEY: /sk_(?:live|test)_[0-9a-zA-Z]{24,}/g,
37
+ /** Generic secrets in common formats */
38
+ GENERIC_SECRET: /secret[_-]?[=:]\s*['""]?[A-Za-z0-9_-]{20,}['""]?/gi,
39
+ };
40
+ /**
41
+ * Redacts secrets in text using the provided patterns.
42
+ */
43
+ function redactSecrets(text, patterns, redactionText, onDetected) {
44
+ let redacted = text;
45
+ for (const pattern of patterns) {
46
+ // Reset lastIndex for global patterns
47
+ pattern.lastIndex = 0;
48
+ // Find all matches first (for callback)
49
+ if (onDetected) {
50
+ const matches = text.match(pattern);
51
+ if (matches) {
52
+ for (const match of matches) {
53
+ onDetected(pattern, match);
54
+ }
55
+ }
56
+ }
57
+ // Redact all matches
58
+ redacted = redacted.replace(pattern, redactionText);
59
+ }
60
+ return redacted;
61
+ }
62
+ /**
63
+ * Extracts and redacts text from messages.
64
+ */
65
+ function redactMessages(messages = [], patterns, redactionText, onDetected) {
66
+ return messages.map((msg) => {
67
+ if (typeof msg !== "object" || msg === null)
68
+ return msg;
69
+ const content = msg.content;
70
+ if (typeof content === "string") {
71
+ return {
72
+ ...msg,
73
+ content: redactSecrets(content, patterns, redactionText, onDetected),
74
+ };
75
+ }
76
+ else if (Array.isArray(content)) {
77
+ return {
78
+ ...msg,
79
+ content: content.map((part) => {
80
+ if (typeof part === "object" &&
81
+ part !== null &&
82
+ "text" in part &&
83
+ typeof part.text === "string") {
84
+ return {
85
+ ...part,
86
+ text: redactSecrets(part.text, patterns, redactionText, onDetected),
87
+ };
88
+ }
89
+ return part;
90
+ }),
91
+ };
92
+ }
93
+ return msg;
94
+ });
95
+ }
96
+ /**
97
+ * Creates secrets filtering hooks for input and output.
98
+ *
99
+ * The PreGenerate hook redacts secrets from input messages before sending
100
+ * to the model. The PostGenerate hook redacts secrets from model responses.
101
+ *
102
+ * This addresses the secrets redaction requirement from CODE_REVIEW.md
103
+ * using the unified hook system.
104
+ *
105
+ * @param options - Configuration options
106
+ * @returns Array of two hooks: [PreGenerate input filter, PostGenerate output filter]
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * const [inputFilter, outputFilter] = createSecretsFilterHooks({
111
+ * redactionText: "***REDACTED***",
112
+ * });
113
+ *
114
+ * const agent = createAgent({
115
+ * model,
116
+ * hooks: {
117
+ * PreGenerate: [{ hooks: [inputFilter] }],
118
+ * PostGenerate: [{ hooks: [outputFilter] }],
119
+ * },
120
+ * });
121
+ * ```
122
+ *
123
+ * @example
124
+ * ```typescript
125
+ * // Custom patterns with alerting
126
+ * const hooks = createSecretsFilterHooks({
127
+ * customPatterns: [/my-secret-format-[A-Z0-9]{16}/g],
128
+ * onSecretDetected: (type, pattern, match) => {
129
+ * console.warn(`Secret detected in ${type}:`, pattern.source);
130
+ * alertSecurityTeam({ type, pattern: pattern.source });
131
+ * },
132
+ * });
133
+ * ```
134
+ *
135
+ * @example
136
+ * ```typescript
137
+ * // Only specific patterns
138
+ * const hooks = createSecretsFilterHooks({
139
+ * patterns: [
140
+ * COMMON_SECRET_PATTERNS.AWS_ACCESS_KEY,
141
+ * COMMON_SECRET_PATTERNS.GITHUB_TOKEN,
142
+ * ],
143
+ * });
144
+ * ```
145
+ *
146
+ * @category Hooks
147
+ */
148
+ export function createSecretsFilterHooks(options = {}) {
149
+ const { customPatterns = [], patterns = Object.values(COMMON_SECRET_PATTERNS), redactionText = "[REDACTED]", filterInput = true, filterOutput = true, onSecretDetected, } = options;
150
+ const allPatterns = [...patterns, ...customPatterns];
151
+ // PreGenerate: Redact secrets from input
152
+ const inputFilter = async (input) => {
153
+ if (input.hook_event_name !== "PreGenerate")
154
+ return {};
155
+ if (!filterInput)
156
+ return {};
157
+ const preGenInput = input;
158
+ const messages = preGenInput.options.messages;
159
+ if (!messages || messages.length === 0)
160
+ return {};
161
+ const redactedMessages = redactMessages(messages, allPatterns, redactionText, onSecretDetected ? (pattern, match) => onSecretDetected("input", pattern, match) : undefined);
162
+ // Only return updatedInput if we actually changed something
163
+ if (JSON.stringify(redactedMessages) !== JSON.stringify(messages)) {
164
+ return {
165
+ hookSpecificOutput: {
166
+ hookEventName: "PreGenerate",
167
+ updatedInput: {
168
+ ...preGenInput.options,
169
+ messages: redactedMessages,
170
+ },
171
+ },
172
+ };
173
+ }
174
+ return {};
175
+ };
176
+ // PostGenerate: Redact secrets from output
177
+ const outputFilter = async (input) => {
178
+ if (input.hook_event_name !== "PostGenerate")
179
+ return {};
180
+ if (!filterOutput)
181
+ return {};
182
+ const postGenInput = input;
183
+ const text = postGenInput.result.text || "";
184
+ const redactedText = redactSecrets(text, allPatterns, redactionText, onSecretDetected ? (pattern, match) => onSecretDetected("output", pattern, match) : undefined);
185
+ // Only return updatedResult if we actually changed something
186
+ if (redactedText !== text) {
187
+ return {
188
+ hookSpecificOutput: {
189
+ hookEventName: "PostGenerate",
190
+ updatedResult: {
191
+ ...postGenInput.result,
192
+ text: redactedText,
193
+ },
194
+ },
195
+ };
196
+ }
197
+ return {};
198
+ };
199
+ return [inputFilter, outputFilter];
200
+ }
201
+ /**
202
+ * Creates managed secrets filter hooks with detection statistics.
203
+ *
204
+ * Returns hooks along with functions to get detection statistics.
205
+ *
206
+ * @param options - Configuration options
207
+ * @returns Object with hooks and statistics getter
208
+ *
209
+ * @example
210
+ * ```typescript
211
+ * const { hooks, getStats, getDetections } = createManagedSecretsFilterHooks();
212
+ *
213
+ * const agent = createAgent({
214
+ * model,
215
+ * hooks: {
216
+ * PreGenerate: [{ hooks: [hooks[0]] }],
217
+ * PostGenerate: [{ hooks: [hooks[1]] }],
218
+ * },
219
+ * });
220
+ *
221
+ * // Check statistics
222
+ * const stats = getStats();
223
+ * console.log(`Secrets detected: ${stats.totalDetections} (${stats.inputDetections} input, ${stats.outputDetections} output)`);
224
+ *
225
+ * // Get detailed detections
226
+ * const detections = getDetections();
227
+ * console.log('Recent detections:', detections.slice(0, 10));
228
+ * ```
229
+ *
230
+ * @category Hooks
231
+ */
232
+ export function createManagedSecretsFilterHooks(options = {}) {
233
+ const { customPatterns = [], patterns = Object.values(COMMON_SECRET_PATTERNS), redactionText = "[REDACTED]", filterInput = true, filterOutput = true, onSecretDetected, } = options;
234
+ const allPatterns = [...patterns, ...customPatterns];
235
+ let inputDetections = 0;
236
+ let outputDetections = 0;
237
+ const detections = [];
238
+ const trackDetection = (type, pattern, match) => {
239
+ if (type === "input")
240
+ inputDetections++;
241
+ else
242
+ outputDetections++;
243
+ detections.push({
244
+ type,
245
+ pattern: pattern.source,
246
+ timestamp: Date.now(),
247
+ });
248
+ if (onSecretDetected) {
249
+ onSecretDetected(type, pattern, match);
250
+ }
251
+ };
252
+ const inputFilter = async (input) => {
253
+ if (input.hook_event_name !== "PreGenerate")
254
+ return {};
255
+ if (!filterInput)
256
+ return {};
257
+ const preGenInput = input;
258
+ const messages = preGenInput.options.messages;
259
+ if (!messages || messages.length === 0)
260
+ return {};
261
+ const redactedMessages = redactMessages(messages, allPatterns, redactionText, (pattern, match) => trackDetection("input", pattern, match));
262
+ if (JSON.stringify(redactedMessages) !== JSON.stringify(messages)) {
263
+ return {
264
+ hookSpecificOutput: {
265
+ hookEventName: "PreGenerate",
266
+ updatedInput: {
267
+ ...preGenInput.options,
268
+ messages: redactedMessages,
269
+ },
270
+ },
271
+ };
272
+ }
273
+ return {};
274
+ };
275
+ const outputFilter = async (input) => {
276
+ if (input.hook_event_name !== "PostGenerate")
277
+ return {};
278
+ if (!filterOutput)
279
+ return {};
280
+ const postGenInput = input;
281
+ const text = postGenInput.result.text || "";
282
+ const redactedText = redactSecrets(text, allPatterns, redactionText, (pattern, match) => trackDetection("output", pattern, match));
283
+ if (redactedText !== text) {
284
+ return {
285
+ hookSpecificOutput: {
286
+ hookEventName: "PostGenerate",
287
+ updatedResult: {
288
+ ...postGenInput.result,
289
+ text: redactedText,
290
+ },
291
+ },
292
+ };
293
+ }
294
+ return {};
295
+ };
296
+ return {
297
+ hooks: [inputFilter, outputFilter],
298
+ getStats: () => ({
299
+ inputDetections,
300
+ outputDetections,
301
+ totalDetections: inputDetections + outputDetections,
302
+ }),
303
+ getDetections: () => [...detections],
304
+ };
305
+ }
306
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/hooks/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Hook system for observing agent lifecycle events.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import type { Agent, HookCallback, HookInput, HookMatcher, HookOutput } from "./types.js";
7
+ /**
8
+ * Checks if a tool name matches a HookMatcher pattern.
9
+ *
10
+ * @param toolName - The tool name to test
11
+ * @param matcher - The matcher pattern (undefined matches all)
12
+ * @returns true if the tool name matches the pattern
13
+ *
14
+ * @internal
15
+ */
16
+ export declare function matchesToolName(toolName: string, matcher: string | undefined): boolean;
17
+ /**
18
+ * Error thrown when a hook times out.
19
+ *
20
+ * @category Hooks
21
+ */
22
+ export declare class HookTimeoutError extends Error {
23
+ constructor(timeout: number);
24
+ }
25
+ /**
26
+ * Invokes hook callbacks with timeout support.
27
+ *
28
+ * This function enforces a hard timeout using `Promise.race`. If a hook does not complete
29
+ * within the specified timeout, it will be treated as returning an empty result `{}`.
30
+ * The abort signal is also set when the timeout is reached, allowing cooperative hooks
31
+ * to clean up resources.
32
+ *
33
+ * @param hooks - Array of hook callbacks to invoke
34
+ * @param input - The hook input data
35
+ * @param toolUseId - The tool use ID (null for non-tool hooks)
36
+ * @param agent - The agent instance
37
+ * @param timeout - Timeout in milliseconds (default: 60000). Each hook must complete within this time.
38
+ * @param retryAttempt - Current retry attempt number (default: 0)
39
+ * @returns Array of hook outputs. Timed out hooks return empty objects `{}`.
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * // Hook that respects the abort signal for cooperative cancellation
44
+ * const cooperativeHook: HookCallback = async (input, toolUseId, ctx) => {
45
+ * for (const item of items) {
46
+ * if (ctx.signal.aborted) {
47
+ * return {}; // Early exit on abort
48
+ * }
49
+ * await processItem(item);
50
+ * }
51
+ * return { hookSpecificOutput: { ... } };
52
+ * };
53
+ *
54
+ * // Even if a hook doesn't check the signal, it will be timed out
55
+ * const results = await invokeHooksWithTimeout(
56
+ * [cooperativeHook, slowHook],
57
+ * input,
58
+ * toolUseId,
59
+ * agent,
60
+ * 5000 // 5 second timeout
61
+ * );
62
+ * ```
63
+ *
64
+ * @internal
65
+ */
66
+ export declare function invokeHooksWithTimeout(hooks: HookCallback[], input: HookInput, toolUseId: string | null, agent: Agent, timeout?: number, retryAttempt?: number): Promise<HookOutput[]>;
67
+ /**
68
+ * Filters and invokes matching hooks for a tool use event.
69
+ *
70
+ * @param matchers - Array of HookMatcher configurations
71
+ * @param toolName - The name of the tool being used
72
+ * @param input - The hook input data
73
+ * @param toolUseId - The tool use ID
74
+ * @param agent - The agent instance
75
+ * @returns Array of hook outputs from all matching hooks
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * const matchers: HookMatcher[] = [
80
+ * { matcher: 'Write|Edit', hooks: [protectFiles], timeout: 30000 },
81
+ * { hooks: [auditLogger] } // Matches all tools
82
+ * ];
83
+ *
84
+ * const outputs = await invokeMatchingHooks(
85
+ * matchers,
86
+ * 'Write',
87
+ * input,
88
+ * toolUseId,
89
+ * agent
90
+ * );
91
+ * ```
92
+ *
93
+ * @category Hooks
94
+ */
95
+ export declare function invokeMatchingHooks(matchers: HookMatcher[], toolName: string, input: HookInput, toolUseId: string, agent: Agent): Promise<HookOutput[]>;
96
+ /**
97
+ * Aggregates permission decisions from multiple hook outputs.
98
+ *
99
+ * Follows the hierarchy: deny > ask > allow > default
100
+ *
101
+ * @param hookOutputs - Array of hook outputs to aggregate
102
+ * @param defaultDecision - Default decision if no hooks provide one (default: 'allow')
103
+ * @returns The aggregated permission decision
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * const outputs: HookOutput[] = [
108
+ * { hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'allow' } },
109
+ * { hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'deny' } },
110
+ * ];
111
+ *
112
+ * const decision = aggregatePermissionDecisions(outputs);
113
+ * // Returns 'deny' because deny wins over allow
114
+ * ```
115
+ *
116
+ * @category Hooks
117
+ */
118
+ export declare function aggregatePermissionDecisions(hookOutputs: HookOutput[], defaultDecision?: "allow" | "deny" | "ask"): "allow" | "deny" | "ask";
119
+ /**
120
+ * Extracts a cached/mock result from hook outputs for short-circuit execution.
121
+ *
122
+ * Returns the first non-undefined `respondWith` value found in the hook outputs.
123
+ * This enables cache hooks to return cached results without executing the actual operation.
124
+ *
125
+ * @param hookOutputs - Array of hook outputs to scan
126
+ * @returns The cached result if found, undefined otherwise
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * const outputs: HookOutput[] = [
131
+ * { hookSpecificOutput: { hookEventName: 'PreGenerate' } },
132
+ * { hookSpecificOutput: { hookEventName: 'PreGenerate', respondWith: cachedResult } },
133
+ * ];
134
+ *
135
+ * const result = extractRespondWith(outputs);
136
+ * // Returns cachedResult
137
+ * ```
138
+ *
139
+ * @category Hooks
140
+ */
141
+ export declare function extractRespondWith<T = unknown>(hookOutputs: HookOutput[]): T | undefined;
142
+ /**
143
+ * Extracts transformed input from hook outputs.
144
+ *
145
+ * Returns the first non-undefined `updatedInput` value found in the hook outputs.
146
+ * This enables hooks to modify inputs before they are used (e.g., redirect file paths,
147
+ * add rate limit headers, sanitize user input).
148
+ *
149
+ * @param hookOutputs - Array of hook outputs to scan
150
+ * @returns The transformed input if found, undefined otherwise
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * const outputs: HookOutput[] = [
155
+ * { hookSpecificOutput: { hookEventName: 'PreToolUse' } },
156
+ * { hookSpecificOutput: {
157
+ * hookEventName: 'PreToolUse',
158
+ * updatedInput: { file_path: '/sandbox/file.txt' }
159
+ * }
160
+ * },
161
+ * ];
162
+ *
163
+ * const transformed = extractUpdatedInput(outputs);
164
+ * // Returns { file_path: '/sandbox/file.txt' }
165
+ * ```
166
+ *
167
+ * @category Hooks
168
+ */
169
+ export declare function extractUpdatedInput<T = unknown>(hookOutputs: HookOutput[]): T | undefined;
170
+ /**
171
+ * Extracts transformed result from hook outputs.
172
+ *
173
+ * Returns the first non-undefined `updatedResult` value found in the hook outputs.
174
+ * This enables hooks to modify outputs after execution (e.g., filter sensitive data,
175
+ * add metadata, transform format, apply post-processing).
176
+ *
177
+ * @param hookOutputs - Array of hook outputs to scan
178
+ * @returns The transformed result if found, undefined otherwise
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * const outputs: HookOutput[] = [
183
+ * { hookSpecificOutput: { hookEventName: 'PostGenerate' } },
184
+ * { hookSpecificOutput: {
185
+ * hookEventName: 'PostGenerate',
186
+ * updatedResult: { ...originalResult, filtered: true }
187
+ * }
188
+ * },
189
+ * ];
190
+ *
191
+ * const transformed = extractUpdatedResult(outputs);
192
+ * // Returns { ...originalResult, filtered: true }
193
+ * ```
194
+ *
195
+ * @category Hooks
196
+ */
197
+ export declare function extractUpdatedResult<T = unknown>(hookOutputs: HookOutput[]): T | undefined;
198
+ /**
199
+ * Extracts retry decision from PostGenerateFailure or PostToolUseFailure hook outputs.
200
+ *
201
+ * Returns the first retry decision found in the hook outputs. If any hook requests a retry,
202
+ * the operation will be retried after the specified delay (or 0ms if no delay specified).
203
+ *
204
+ * @param hookOutputs - Array of hook outputs to scan
205
+ * @returns Object with retry flag and delay, or undefined if no retry requested
206
+ *
207
+ * @example
208
+ * ```typescript
209
+ * const outputs: HookOutput[] = [
210
+ * { hookSpecificOutput: { hookEventName: 'PostGenerateFailure' } },
211
+ * { hookSpecificOutput: {
212
+ * hookEventName: 'PostGenerateFailure',
213
+ * retry: true,
214
+ * retryDelayMs: 1000 // Wait 1s before retrying
215
+ * }
216
+ * },
217
+ * ];
218
+ *
219
+ * const retryDecision = extractRetryDecision(outputs);
220
+ * // Returns { retry: true, retryDelayMs: 1000 }
221
+ * ```
222
+ *
223
+ * @category Hooks
224
+ */
225
+ export declare function extractRetryDecision(hookOutputs: HookOutput[]): {
226
+ retry: boolean;
227
+ retryDelayMs: number;
228
+ } | undefined;
229
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM1F;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAYtF;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,YAAY,EAAE,EACrB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,KAAK,EAAE,KAAK,EACZ,OAAO,SAAQ,EACf,YAAY,SAAI,GACf,OAAO,CAAC,UAAU,EAAE,CAAC,CA6CvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,WAAW,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,UAAU,EAAE,CAAC,CAYvB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,UAAU,EAAE,EACzB,eAAe,GAAE,OAAO,GAAG,MAAM,GAAG,KAAe,GAClD,OAAO,GAAG,MAAM,GAAG,KAAK,CAsB1B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,SAAS,CAQxF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,SAAS,CAQzF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,SAAS,CAQ1F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,UAAU,EAAE,GACxB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAStD"}