@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,345 @@
1
+ /**
2
+ * Logging hook utilities.
3
+ *
4
+ * Provides logging hooks for observability and debugging using the unified
5
+ * hook system.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ /**
10
+ * Truncates text to maximum length with ellipsis.
11
+ */
12
+ function truncate(text, maxLength) {
13
+ if (text.length <= maxLength) {
14
+ return text;
15
+ }
16
+ return `${text.slice(0, maxLength)}...`;
17
+ }
18
+ /**
19
+ * Formats message count by role.
20
+ */
21
+ function formatMessageCount(messages = []) {
22
+ const byRole = {};
23
+ for (const msg of messages) {
24
+ if (typeof msg === "object" && msg !== null && "role" in msg) {
25
+ const role = String(msg.role);
26
+ byRole[role] = (byRole[role] ?? 0) + 1;
27
+ }
28
+ }
29
+ return Object.entries(byRole)
30
+ .map(([role, count]) => `${count} ${role}`)
31
+ .join(", ");
32
+ }
33
+ /**
34
+ * Creates logging hooks for generation lifecycle events.
35
+ *
36
+ * Provides Pre/Post logging for generation with timing information,
37
+ * usage statistics, and error logging.
38
+ *
39
+ * @param options - Configuration options
40
+ * @returns Array of hooks for generation events
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * const logHooks = createLoggingHooks({
45
+ * prefix: "[MyAgent]",
46
+ * logTiming: true,
47
+ * maxTextLength: 100,
48
+ * });
49
+ *
50
+ * const agent = createAgent({
51
+ * model,
52
+ * hooks: {
53
+ * PreGenerate: [{ hooks: [logHooks[0]] }],
54
+ * PostGenerate: [{ hooks: [logHooks[1]] }],
55
+ * PostGenerateFailure: [{ hooks: [logHooks[2]] }],
56
+ * },
57
+ * });
58
+ * ```
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * // Custom logger (e.g., structured logging)
63
+ * const logHooks = createLoggingHooks({
64
+ * log: (msg) => logger.info(msg),
65
+ * });
66
+ * ```
67
+ *
68
+ * @category Hooks
69
+ */
70
+ export function createLoggingHooks(options = {}) {
71
+ const { log = console.log, logGeneration = true, logTiming = true, maxTextLength = 200, prefix = "[Agent]", logFullMessages = false, } = options;
72
+ const startTimes = new Map();
73
+ // PreGenerate: Log request
74
+ const preGenerate = async (input) => {
75
+ if (input.hook_event_name !== "PreGenerate")
76
+ return {};
77
+ if (!logGeneration)
78
+ return {};
79
+ const preGenInput = input;
80
+ const { messages, temperature, maxTokens } = preGenInput.options;
81
+ const messageInfo = logFullMessages ? JSON.stringify(messages) : formatMessageCount(messages);
82
+ let logMsg = `${prefix} PreGenerate:`;
83
+ logMsg += `\n Messages: ${messageInfo}`;
84
+ if (temperature !== undefined)
85
+ logMsg += `\n Temperature: ${temperature}`;
86
+ if (maxTokens !== undefined)
87
+ logMsg += `\n MaxTokens: ${maxTokens}`;
88
+ log(logMsg);
89
+ // Track start time for this session
90
+ if (logTiming) {
91
+ startTimes.set(preGenInput.session_id, Date.now());
92
+ }
93
+ return {};
94
+ };
95
+ // PostGenerate: Log response
96
+ const postGenerate = async (input) => {
97
+ if (input.hook_event_name !== "PostGenerate")
98
+ return {};
99
+ if (!logGeneration)
100
+ return {};
101
+ const postGenInput = input;
102
+ const { result } = postGenInput;
103
+ let logMsg = `${prefix} PostGenerate:`;
104
+ logMsg += `\n Text: ${truncate(result.text || "", maxTextLength)}`;
105
+ logMsg += `\n Finish: ${result.finishReason}`;
106
+ if (result.usage) {
107
+ logMsg += `\n Tokens: ${result.usage.totalTokens} (${result.usage.inputTokens} in, ${result.usage.outputTokens} out)`;
108
+ }
109
+ // Add timing if available
110
+ if (logTiming) {
111
+ const startTime = startTimes.get(postGenInput.session_id);
112
+ if (startTime) {
113
+ const duration = Date.now() - startTime;
114
+ logMsg += `\n Duration: ${duration}ms`;
115
+ startTimes.delete(postGenInput.session_id);
116
+ }
117
+ }
118
+ log(logMsg);
119
+ return {};
120
+ };
121
+ // PostGenerateFailure: Log error
122
+ const postGenerateFailure = async (input) => {
123
+ if (input.hook_event_name !== "PostGenerateFailure")
124
+ return {};
125
+ const failureInput = input;
126
+ let logMsg = `${prefix} PostGenerateFailure:`;
127
+ logMsg += `\n Error: ${failureInput.error.message}`;
128
+ // Add timing if available
129
+ if (logTiming) {
130
+ const startTime = startTimes.get(failureInput.session_id);
131
+ if (startTime) {
132
+ const duration = Date.now() - startTime;
133
+ logMsg += `\n Duration: ${duration}ms (failed)`;
134
+ startTimes.delete(failureInput.session_id);
135
+ }
136
+ }
137
+ log(logMsg);
138
+ return {};
139
+ };
140
+ return [preGenerate, postGenerate, postGenerateFailure];
141
+ }
142
+ /**
143
+ * Creates logging hooks for tool execution events.
144
+ *
145
+ * Provides Pre/Post logging for tool calls with arguments, results,
146
+ * and error information.
147
+ *
148
+ * @param options - Configuration options
149
+ * @returns Array of hooks for tool events
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * const toolLogHooks = createToolLoggingHooks({
154
+ * prefix: "[Tools]",
155
+ * maxTextLength: 150,
156
+ * });
157
+ *
158
+ * const agent = createAgent({
159
+ * model,
160
+ * hooks: {
161
+ * PreToolUse: [{ hooks: [toolLogHooks[0]] }],
162
+ * PostToolUse: [{ hooks: [toolLogHooks[1]] }],
163
+ * PostToolUseFailure: [{ hooks: [toolLogHooks[2]] }],
164
+ * },
165
+ * });
166
+ * ```
167
+ *
168
+ * @category Hooks
169
+ */
170
+ export function createToolLoggingHooks(options = {}) {
171
+ const { log = console.log, logTools = true, logTiming = true, logErrors = true, maxTextLength = 200, prefix = "[Agent]", } = options;
172
+ const toolStartTimes = new Map();
173
+ // PreToolUse: Log tool call
174
+ const preToolUse = async (input, toolUseId) => {
175
+ if (input.hook_event_name !== "PreToolUse")
176
+ return {};
177
+ if (!logTools)
178
+ return {};
179
+ const preToolInput = input;
180
+ let logMsg = `${prefix} PreToolUse: ${preToolInput.tool_name}`;
181
+ logMsg += `\n Input: ${truncate(JSON.stringify(preToolInput.tool_input), maxTextLength)}`;
182
+ log(logMsg);
183
+ // Track start time
184
+ if (logTiming && toolUseId) {
185
+ toolStartTimes.set(toolUseId, Date.now());
186
+ }
187
+ return {};
188
+ };
189
+ // PostToolUse: Log tool result
190
+ const postToolUse = async (input, toolUseId) => {
191
+ if (input.hook_event_name !== "PostToolUse")
192
+ return {};
193
+ if (!logTools)
194
+ return {};
195
+ const postToolInput = input;
196
+ let logMsg = `${prefix} PostToolUse: ${postToolInput.tool_name}`;
197
+ logMsg += `\n Result: ${truncate(String(postToolInput.tool_response), maxTextLength)}`;
198
+ // Add timing if available
199
+ if (logTiming && toolUseId) {
200
+ const startTime = toolStartTimes.get(toolUseId);
201
+ if (startTime) {
202
+ const duration = Date.now() - startTime;
203
+ logMsg += `\n Duration: ${duration}ms`;
204
+ toolStartTimes.delete(toolUseId);
205
+ }
206
+ }
207
+ log(logMsg);
208
+ return {};
209
+ };
210
+ // PostToolUseFailure: Log tool error
211
+ const postToolUseFailure = async (input, toolUseId) => {
212
+ if (input.hook_event_name !== "PostToolUseFailure")
213
+ return {};
214
+ if (!logErrors)
215
+ return {};
216
+ const failureInput = input;
217
+ let logMsg = `${prefix} PostToolUseFailure: ${failureInput.tool_name}`;
218
+ logMsg += `\n Error: ${failureInput.error}`;
219
+ // Add timing if available
220
+ if (logTiming && toolUseId) {
221
+ const startTime = toolStartTimes.get(toolUseId);
222
+ if (startTime) {
223
+ const duration = Date.now() - startTime;
224
+ logMsg += `\n Duration: ${duration}ms (failed)`;
225
+ toolStartTimes.delete(toolUseId);
226
+ }
227
+ }
228
+ log(logMsg);
229
+ return {};
230
+ };
231
+ return [preToolUse, postToolUse, postToolUseFailure];
232
+ }
233
+ /**
234
+ * Creates logging hooks for context compaction events.
235
+ *
236
+ * Provides Pre/Post logging for compaction with token savings
237
+ * and message count information.
238
+ *
239
+ * @param options - Configuration options
240
+ * @returns Array of hooks for compaction events
241
+ *
242
+ * @example
243
+ * ```typescript
244
+ * const compactLogHooks = createCompactionLoggingHooks({
245
+ * prefix: "[Compaction]",
246
+ * });
247
+ *
248
+ * const agent = createAgent({
249
+ * model,
250
+ * hooks: {
251
+ * PreCompact: [compactLogHooks[0]],
252
+ * PostCompact: [compactLogHooks[1]],
253
+ * },
254
+ * });
255
+ * ```
256
+ *
257
+ * @category Hooks
258
+ */
259
+ export function createCompactionLoggingHooks(options = {}) {
260
+ const { log = console.log, logCompaction = true, logTiming = true, prefix = "[Agent]" } = options;
261
+ const compactionStartTimes = new Map();
262
+ // PreCompact: Log compaction start
263
+ const preCompact = async (input) => {
264
+ if (input.hook_event_name !== "PreCompact")
265
+ return {};
266
+ if (!logCompaction)
267
+ return {};
268
+ const preCompactInput = input;
269
+ let logMsg = `${prefix} PreCompact:`;
270
+ logMsg += `\n Messages: ${preCompactInput.message_count}`;
271
+ logMsg += `\n Tokens: ${preCompactInput.tokens_before}`;
272
+ log(logMsg);
273
+ // Track start time
274
+ if (logTiming) {
275
+ compactionStartTimes.set(preCompactInput.session_id, Date.now());
276
+ }
277
+ return {};
278
+ };
279
+ // PostCompact: Log compaction result
280
+ const postCompact = async (input) => {
281
+ if (input.hook_event_name !== "PostCompact")
282
+ return {};
283
+ if (!logCompaction)
284
+ return {};
285
+ const postCompactInput = input;
286
+ const reductionPercent = postCompactInput.tokens_before > 0
287
+ ? ((postCompactInput.tokens_saved / postCompactInput.tokens_before) * 100).toFixed(1)
288
+ : "0.0";
289
+ let logMsg = `${prefix} PostCompact:`;
290
+ logMsg += `\n Messages: ${postCompactInput.messages_before} → ${postCompactInput.messages_after}`;
291
+ logMsg += `\n Tokens: ${postCompactInput.tokens_before} → ${postCompactInput.tokens_after} (saved ${postCompactInput.tokens_saved}, ${reductionPercent}% reduction)`;
292
+ // Add timing if available
293
+ if (logTiming) {
294
+ const startTime = compactionStartTimes.get(postCompactInput.session_id);
295
+ if (startTime) {
296
+ const duration = Date.now() - startTime;
297
+ logMsg += `\n Duration: ${duration}ms`;
298
+ compactionStartTimes.delete(postCompactInput.session_id);
299
+ }
300
+ }
301
+ log(logMsg);
302
+ return {};
303
+ };
304
+ return [preCompact, postCompact];
305
+ }
306
+ /**
307
+ * Creates comprehensive logging hooks for all lifecycle events.
308
+ *
309
+ * Combines generation, tool, and compaction logging into a single set of hooks.
310
+ *
311
+ * @param options - Configuration options
312
+ * @returns Object with hooks for all events
313
+ *
314
+ * @example
315
+ * ```typescript
316
+ * const { generationHooks, toolHooks, compactionHooks } = createComprehensiveLoggingHooks({
317
+ * prefix: "[MyAgent]",
318
+ * logTiming: true,
319
+ * });
320
+ *
321
+ * const agent = createAgent({
322
+ * model,
323
+ * hooks: {
324
+ * PreGenerate: [generationHooks[0]],
325
+ * PostGenerate: [generationHooks[1]],
326
+ * PostGenerateFailure: [generationHooks[2]],
327
+ * PreToolUse: [toolHooks[0]],
328
+ * PostToolUse: [toolHooks[1]],
329
+ * PostToolUseFailure: [toolHooks[2]],
330
+ * PreCompact: [compactionHooks[0]],
331
+ * PostCompact: [compactionHooks[1]],
332
+ * },
333
+ * });
334
+ * ```
335
+ *
336
+ * @category Hooks
337
+ */
338
+ export function createComprehensiveLoggingHooks(options = {}) {
339
+ return {
340
+ generationHooks: createLoggingHooks(options),
341
+ toolHooks: createToolLoggingHooks(options),
342
+ compactionHooks: createCompactionLoggingHooks(options),
343
+ };
344
+ }
345
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/hooks/logging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Guardrails - Content moderation utilities for AI generation.
3
+ *
4
+ * This module provides a simple, composable approach to content moderation:
5
+ * - Guardrails are just async functions that return pass/block results
6
+ * - Multiple guardrails can race against generation
7
+ * - First failure aborts everything via shared AbortSignal
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ import type { UIMessage } from "ai";
12
+ /**
13
+ * Result from a guardrail check.
14
+ */
15
+ export interface GuardrailCheckResult {
16
+ /** Whether the content should be blocked */
17
+ blocked: boolean;
18
+ /** Reason for blocking (if blocked) */
19
+ reason?: string;
20
+ /** IDs of messages that caused the block */
21
+ blockedMessageIds?: string[];
22
+ }
23
+ /**
24
+ * A guardrail is a function that checks content and returns a result.
25
+ *
26
+ * Guardrails can be sync or async. They receive the text to check and
27
+ * an optional AbortSignal for cancellation.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * // Simple regex guardrail
32
+ * const noSecrets: Guardrail = async (text) => ({
33
+ * blocked: /SECRET_API_KEY/i.test(text),
34
+ * reason: "Contains sensitive pattern",
35
+ * });
36
+ *
37
+ * // LLM-based guardrail
38
+ * const llmModeration: Guardrail = async (text, signal) => {
39
+ * const result = await moderateWithLLM(text, { signal });
40
+ * return {
41
+ * blocked: result.flagged,
42
+ * reason: result.reason,
43
+ * };
44
+ * };
45
+ * ```
46
+ */
47
+ export type Guardrail = (text: string, signal?: AbortSignal) => Promise<GuardrailCheckResult> | GuardrailCheckResult;
48
+ /**
49
+ * Options for raceGuardrails.
50
+ */
51
+ export interface RaceGuardrailsOptions {
52
+ /** Message to show when content is blocked */
53
+ blockedMessage?: string;
54
+ /** IDs of messages to remove from client history if blocked */
55
+ blockedMessageIds?: string[];
56
+ }
57
+ /**
58
+ * Race multiple guardrails - first failure blocks, all run in parallel.
59
+ *
60
+ * Returns a Promise that resolves when all guardrails pass, or rejects
61
+ * with GeneratePermissionDeniedError if any guardrail blocks.
62
+ *
63
+ * @example
64
+ * ```typescript
65
+ * const controller = new AbortController();
66
+ *
67
+ * // Start guardrails and generation in parallel
68
+ * const guardrailsPromise = raceGuardrails(
69
+ * text,
70
+ * [regexGuardrail, llmGuardrail],
71
+ * controller.signal,
72
+ * {
73
+ * blockedMessage: "Content blocked",
74
+ * onBlock: () => controller.abort(),
75
+ * }
76
+ * );
77
+ *
78
+ * const generation = agent.streamRaw({
79
+ * messages,
80
+ * signal: controller.signal,
81
+ * });
82
+ *
83
+ * // Wait for guardrails to pass (or throw)
84
+ * await guardrailsPromise;
85
+ * ```
86
+ */
87
+ export declare function raceGuardrails(text: string, guardrails: Guardrail[], signal?: AbortSignal, options?: RaceGuardrailsOptions): Promise<void>;
88
+ /**
89
+ * Run guardrails in parallel with generation, aborting on first failure.
90
+ *
91
+ * This is a convenience wrapper that sets up the abort controller and
92
+ * coordinates guardrails with the generation function.
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * const result = await runWithGuardrails(
97
+ * extractText(messages),
98
+ * [regexGuardrail, llmGuardrail],
99
+ * (signal) => agent.generate({ messages, signal })
100
+ * );
101
+ * ```
102
+ */
103
+ export declare function runWithGuardrails<T>(text: string, guardrails: Guardrail[], generateFn: (signal: AbortSignal) => Promise<T>, options?: RaceGuardrailsOptions): Promise<T>;
104
+ /**
105
+ * Create a regex-based guardrail.
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * const noSecrets = createRegexGuardrail([
110
+ * /SECRET_API_KEY/i,
111
+ * /password\s*=\s*["'][^"']+["']/i,
112
+ * ], "Contains sensitive data");
113
+ * ```
114
+ */
115
+ export declare function createRegexGuardrail(patterns: RegExp[], reason?: string): Guardrail;
116
+ /**
117
+ * Create a guardrail with a timeout.
118
+ *
119
+ * If the guardrail doesn't complete within the timeout, it returns
120
+ * a non-blocking result (fail-open behavior).
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * const timedLLMGuardrail = withTimeout(llmGuardrail, 5000);
125
+ * ```
126
+ */
127
+ export declare function withTimeout(guardrail: Guardrail, timeoutMs: number, failOpen?: boolean): Guardrail;
128
+ /**
129
+ * Extract text content from UI messages.
130
+ */
131
+ export declare function extractTextFromMessages(messages: UIMessage[]): string;
132
+ /**
133
+ * Find the last user message ID from a list of messages.
134
+ */
135
+ export declare function findLastUserMessageId(messages: UIMessage[]): string | undefined;
136
+ /**
137
+ * Configuration for buffered output guardrails.
138
+ */
139
+ export interface OutputGuardrailConfig {
140
+ /**
141
+ * Guardrail to run on accumulated output.
142
+ * Can be a single guardrail or multiple that will be raced.
143
+ */
144
+ guardrails: Guardrail | Guardrail[];
145
+ /**
146
+ * Minimum buffer size (in characters) before running checks.
147
+ * Helps avoid excessive API calls for small outputs.
148
+ * @default 100
149
+ */
150
+ minBufferSize?: number;
151
+ /**
152
+ * Check interval in milliseconds.
153
+ * If set, runs periodic checks on accumulated buffer.
154
+ * @default undefined (only check at end)
155
+ */
156
+ checkIntervalMs?: number;
157
+ /**
158
+ * Timeout for guardrail checks in milliseconds.
159
+ * @default 30000 (30 seconds)
160
+ */
161
+ timeout?: number;
162
+ /**
163
+ * Message to show when content is blocked.
164
+ * @default "Output blocked by guardrail"
165
+ */
166
+ blockedMessage?: string;
167
+ }
168
+ /**
169
+ * State of the buffered output guardrail.
170
+ */
171
+ export type BufferedGuardrailState = "buffering" | "passed" | "blocked" | "error";
172
+ /**
173
+ * Controller for buffered output guardrails.
174
+ *
175
+ * Buffers output content and runs guardrail checks before releasing
176
+ * content to the client.
177
+ */
178
+ export declare class BufferedOutputGuardrail {
179
+ private buffer;
180
+ private chunks;
181
+ private state;
182
+ private blockReason;
183
+ private abortController;
184
+ private checkPromise;
185
+ private lastCheckTime;
186
+ private guardrails;
187
+ private config;
188
+ constructor(config: OutputGuardrailConfig);
189
+ /** Get current state of the guardrail. */
190
+ get currentState(): BufferedGuardrailState;
191
+ /** Get the block reason (if blocked). */
192
+ get reason(): string | null;
193
+ /** Get the abort signal. */
194
+ get signal(): AbortSignal;
195
+ /** Check if guardrail is still buffering. */
196
+ isBuffering(): boolean;
197
+ /** Check if guardrail has passed. */
198
+ hasPassed(): boolean;
199
+ /** Check if guardrail has blocked content. */
200
+ hasBlocked(): boolean;
201
+ /**
202
+ * Add content to the buffer.
203
+ * Returns true if content should be forwarded, false if blocked.
204
+ */
205
+ addContent(text: string): boolean;
206
+ /**
207
+ * Add a chunk to the buffer for later flushing.
208
+ */
209
+ addChunk(chunk: unknown): boolean;
210
+ private startCheck;
211
+ /**
212
+ * Finalize the guardrail check.
213
+ * Call this when output is complete to ensure final check passes.
214
+ */
215
+ finalize(): Promise<void>;
216
+ /** Get the buffered content. */
217
+ getBuffer(): string;
218
+ /** Get the buffered chunks. */
219
+ getChunks(): unknown[];
220
+ /** Clear the buffer and chunks. */
221
+ clear(): void;
222
+ /** Abort the guardrail. */
223
+ abort(): void;
224
+ }
225
+ /**
226
+ * Creates a buffered output guardrail.
227
+ *
228
+ * @example
229
+ * ```typescript
230
+ * const guardrail = createBufferedOutputGuardrail({
231
+ * guardrails: [noSecretsGuardrail, noPIIGuardrail],
232
+ * minBufferSize: 100,
233
+ * });
234
+ *
235
+ * for await (const chunk of stream) {
236
+ * if (chunk.type === 'text-delta') {
237
+ * if (!guardrail.addContent(chunk.delta)) break;
238
+ * }
239
+ * guardrail.addChunk(chunk);
240
+ * }
241
+ *
242
+ * await guardrail.finalize();
243
+ * for (const chunk of guardrail.getChunks()) {
244
+ * writer.write(chunk);
245
+ * }
246
+ * ```
247
+ */
248
+ export declare function createBufferedOutputGuardrail(config: OutputGuardrailConfig): BufferedOutputGuardrail;
249
+ /**
250
+ * Wraps a ReadableStream with buffered output guardrails.
251
+ *
252
+ * @example
253
+ * ```typescript
254
+ * const guardedStream = wrapStreamWithOutputGuardrail(sourceStream, {
255
+ * guardrails: noSecretsGuardrail,
256
+ * });
257
+ *
258
+ * for await (const chunk of guardedStream) {
259
+ * writer.write(chunk);
260
+ * }
261
+ * ```
262
+ */
263
+ export declare function wrapStreamWithOutputGuardrail<T extends {
264
+ type?: string;
265
+ delta?: string;
266
+ text?: string;
267
+ }>(stream: ReadableStream<T>, config: OutputGuardrailConfig): ReadableStream<T>;
268
+ //# sourceMappingURL=parallel-guardrails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-guardrails.d.ts","sourceRoot":"","sources":["../../src/hooks/parallel-guardrails.ts"],"names":[],"mappings":"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"}