@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,110 @@
1
+ /**
2
+ * Type definitions for the task store system.
3
+ *
4
+ * Task stores provide persistence for background task state, allowing tasks
5
+ * to survive process restarts and be recovered when the agent resumes.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ // =============================================================================
10
+ // Helper Functions
11
+ // =============================================================================
12
+ /**
13
+ * Create a new background task with the given data.
14
+ *
15
+ * This is a convenience function that ensures timestamps are set correctly.
16
+ *
17
+ * @param data - Partial task data (id, subagentType, description required)
18
+ * @returns A complete task object
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const task = createBackgroundTask({
23
+ * id: "task-123",
24
+ * subagentType: "researcher",
25
+ * description: "Research topic X",
26
+ * });
27
+ * ```
28
+ *
29
+ * @category TaskStore
30
+ */
31
+ export function createBackgroundTask(data) {
32
+ const now = new Date().toISOString();
33
+ return {
34
+ status: "pending",
35
+ createdAt: now,
36
+ updatedAt: now,
37
+ ...data,
38
+ };
39
+ }
40
+ /**
41
+ * Update an existing task with new data.
42
+ *
43
+ * Automatically updates the `updatedAt` timestamp.
44
+ *
45
+ * @param task - The existing task
46
+ * @param updates - Partial updates to apply
47
+ * @returns A new task object with updates applied
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const updated = updateBackgroundTask(task, {
52
+ * status: "completed",
53
+ * result: "Task completed successfully",
54
+ * completedAt: new Date().toISOString(),
55
+ * });
56
+ * ```
57
+ *
58
+ * @category TaskStore
59
+ */
60
+ export function updateBackgroundTask(task, updates) {
61
+ return {
62
+ ...task,
63
+ ...updates,
64
+ updatedAt: new Date().toISOString(),
65
+ };
66
+ }
67
+ /**
68
+ * Type guard to check if an object is a valid BackgroundTask.
69
+ *
70
+ * @param value - The value to check
71
+ * @returns True if the value is a valid BackgroundTask
72
+ *
73
+ * @category TaskStore
74
+ */
75
+ export function isBackgroundTask(value) {
76
+ if (typeof value !== "object" || value === null) {
77
+ return false;
78
+ }
79
+ const obj = value;
80
+ return (typeof obj.id === "string" &&
81
+ typeof obj.subagentType === "string" &&
82
+ typeof obj.description === "string" &&
83
+ (obj.status === "pending" ||
84
+ obj.status === "running" ||
85
+ obj.status === "completed" ||
86
+ obj.status === "failed") &&
87
+ typeof obj.createdAt === "string" &&
88
+ typeof obj.updatedAt === "string");
89
+ }
90
+ /**
91
+ * Check if a task should be expired based on age and status.
92
+ *
93
+ * @param task - The task to check
94
+ * @param expirationMs - Expiration time in milliseconds
95
+ * @returns True if the task should be expired
96
+ *
97
+ * @category TaskStore
98
+ */
99
+ export function shouldExpireTask(task, expirationMs) {
100
+ // Only expire completed or failed tasks
101
+ if (task.status !== "completed" && task.status !== "failed") {
102
+ return false;
103
+ }
104
+ // Use completedAt if available, otherwise use updatedAt
105
+ const timestampStr = task.completedAt ?? task.updatedAt;
106
+ const timestamp = new Date(timestampStr).getTime();
107
+ const now = Date.now();
108
+ return now - timestamp > expirationMs;
109
+ }
110
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/task-store/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkMH,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,oBAAoB,CAClC,IACsE;IAEtE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,GAAG,IAAI;KACR,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAoB,EACpB,OAA0D;IAE1D,OAAO;QACL,GAAG,IAAI;QACP,GAAG,OAAO;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAE7C,OAAO,CACL,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;QAC1B,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ;QACpC,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ;QACnC,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS;YACvB,GAAG,CAAC,MAAM,KAAK,SAAS;YACxB,GAAG,CAAC,MAAM,KAAK,WAAW;YAC1B,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC;QAC1B,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QACjC,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAClC,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAoB,EAAE,YAAoB;IACzE,wCAAwC;IACxC,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wDAAwD;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,OAAO,GAAG,GAAG,SAAS,GAAG,YAAY,CAAC;AACxC,CAAC"}
@@ -0,0 +1,401 @@
1
+ /**
2
+ * Assertion helpers for agent testing.
3
+ *
4
+ * Provides convenient assertion utilities for testing agent behavior,
5
+ * responses, tool calls, and state.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import type { LanguageModelUsage } from "ai";
10
+ import type { AgentState, TodoItem } from "../backends/state.js";
11
+ import type { FinishReason, GenerateResult, GenerateResultComplete, StreamPart, ToolCallResult } from "../types.js";
12
+ import type { MockAgent } from "./mock-agent.js";
13
+ /**
14
+ * Error thrown when an agent assertion fails.
15
+ *
16
+ * @category Testing
17
+ */
18
+ export declare class AgentAssertionError extends Error {
19
+ /** The expected value */
20
+ readonly expected: unknown;
21
+ /** The actual value */
22
+ readonly actual: unknown;
23
+ /** Additional context */
24
+ readonly context?: Record<string, unknown>;
25
+ constructor(message: string, expected: unknown, actual: unknown, context?: Record<string, unknown>);
26
+ }
27
+ /**
28
+ * Assert that a response contains specific text.
29
+ *
30
+ * @param result - The generate result to check
31
+ * @param text - Text that should be present
32
+ * @throws AgentAssertionError if text is not found
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * const result = await agent.generate({ prompt: "Say hello" });
37
+ * assertResponseContains(result, "hello");
38
+ * ```
39
+ *
40
+ * @category Testing
41
+ */
42
+ export declare function assertResponseContains(result: GenerateResult, text: string): void;
43
+ /**
44
+ * Assert that a response matches a regular expression.
45
+ *
46
+ * @param result - The generate result to check
47
+ * @param pattern - Pattern to match against
48
+ * @throws AgentAssertionError if pattern doesn't match
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * assertResponseMatches(result, /hello.*world/i);
53
+ * ```
54
+ *
55
+ * @category Testing
56
+ */
57
+ export declare function assertResponseMatches(result: GenerateResult, pattern: RegExp): void;
58
+ /**
59
+ * Assert that a response has a specific finish reason.
60
+ *
61
+ * @param result - The generate result to check
62
+ * @param reason - Expected finish reason
63
+ * @throws AgentAssertionError if reason doesn't match
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * assertFinishReason(result, "stop");
68
+ * ```
69
+ *
70
+ * @category Testing
71
+ */
72
+ export declare function assertFinishReason(result: GenerateResult, reason: FinishReason): void;
73
+ /**
74
+ * Assert that a response has usage information.
75
+ *
76
+ * @param result - The generate result to check
77
+ * @throws AgentAssertionError if usage is missing
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * assertHasUsage(result);
82
+ * console.log(result.usage.inputTokens);
83
+ * ```
84
+ *
85
+ * @category Testing
86
+ */
87
+ export declare function assertHasUsage(result: GenerateResult): asserts result is GenerateResultComplete & {
88
+ usage: LanguageModelUsage;
89
+ };
90
+ /**
91
+ * Assert that token usage is within expected bounds.
92
+ *
93
+ * @param result - The generate result to check
94
+ * @param options - Usage bounds
95
+ * @throws AgentAssertionError if usage is outside bounds
96
+ *
97
+ * @example
98
+ * ```typescript
99
+ * assertUsageWithin(result, {
100
+ * maxInputTokens: 1000,
101
+ * maxOutputTokens: 500,
102
+ * });
103
+ * ```
104
+ *
105
+ * @category Testing
106
+ */
107
+ export declare function assertUsageWithin(result: GenerateResult, options: {
108
+ minInputTokens?: number;
109
+ maxInputTokens?: number;
110
+ minOutputTokens?: number;
111
+ maxOutputTokens?: number;
112
+ }): void;
113
+ /**
114
+ * Assert that structured output was generated.
115
+ *
116
+ * @param result - The generate result to check
117
+ * @throws AgentAssertionError if output is missing
118
+ *
119
+ * @example
120
+ * ```typescript
121
+ * assertHasOutput(result);
122
+ * const data = result.output as MySchema;
123
+ * ```
124
+ *
125
+ * @category Testing
126
+ */
127
+ export declare function assertHasOutput(result: GenerateResult): asserts result is GenerateResultComplete & {
128
+ output: unknown;
129
+ };
130
+ /**
131
+ * Assert that a specific tool was called.
132
+ *
133
+ * @param result - The generate result to check
134
+ * @param toolName - Name of the tool expected to be called
135
+ * @returns The matching tool call
136
+ * @throws AgentAssertionError if tool was not called
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * const toolCall = assertToolCalled(result, "weather");
141
+ * expect(toolCall.input.city).toBe("Tokyo");
142
+ * ```
143
+ *
144
+ * @category Testing
145
+ */
146
+ export declare function assertToolCalled(result: GenerateResult, toolName: string): ToolCallResult;
147
+ /**
148
+ * Assert that a tool was called with specific input.
149
+ *
150
+ * @param result - The generate result to check
151
+ * @param toolName - Name of the tool
152
+ * @param expectedInput - Expected input (partial match)
153
+ * @returns The matching tool call
154
+ * @throws AgentAssertionError if tool was not called with expected input
155
+ *
156
+ * @example
157
+ * ```typescript
158
+ * assertToolCalledWith(result, "weather", { city: "Tokyo" });
159
+ * ```
160
+ *
161
+ * @category Testing
162
+ */
163
+ export declare function assertToolCalledWith(result: GenerateResult, toolName: string, expectedInput: Record<string, unknown>): ToolCallResult;
164
+ /**
165
+ * Assert that a tool was NOT called.
166
+ *
167
+ * @param result - The generate result to check
168
+ * @param toolName - Name of the tool that should not be called
169
+ * @throws AgentAssertionError if tool was called
170
+ *
171
+ * @example
172
+ * ```typescript
173
+ * assertToolNotCalled(result, "dangerousTool");
174
+ * ```
175
+ *
176
+ * @category Testing
177
+ */
178
+ export declare function assertToolNotCalled(result: GenerateResult, toolName: string): void;
179
+ /**
180
+ * Assert the number of times a tool was called.
181
+ *
182
+ * @param result - The generate result to check
183
+ * @param toolName - Name of the tool
184
+ * @param count - Expected call count
185
+ * @throws AgentAssertionError if count doesn't match
186
+ *
187
+ * @example
188
+ * ```typescript
189
+ * assertToolCallCount(result, "search", 3);
190
+ * ```
191
+ *
192
+ * @category Testing
193
+ */
194
+ export declare function assertToolCallCount(result: GenerateResult, toolName: string, count: number): void;
195
+ /**
196
+ * Assert that steps were executed.
197
+ *
198
+ * @param result - The generate result to check
199
+ * @param minSteps - Minimum expected steps
200
+ * @param maxSteps - Maximum expected steps (optional)
201
+ * @throws AgentAssertionError if step count is outside bounds
202
+ *
203
+ * @example
204
+ * ```typescript
205
+ * assertStepCount(result, 1, 5);
206
+ * ```
207
+ *
208
+ * @category Testing
209
+ */
210
+ export declare function assertStepCount(result: GenerateResult, minSteps: number, maxSteps?: number): void;
211
+ /**
212
+ * Collect all chunks from a stream into an array.
213
+ *
214
+ * @param stream - The stream to collect
215
+ * @returns Array of all stream parts
216
+ *
217
+ * @example
218
+ * ```typescript
219
+ * const chunks = await collectStreamChunks(agent.stream({ prompt: "Hi" }));
220
+ * assertStreamHasText(chunks);
221
+ * ```
222
+ *
223
+ * @category Testing
224
+ */
225
+ export declare function collectStreamChunks(stream: AsyncGenerator<StreamPart>): Promise<StreamPart[]>;
226
+ /**
227
+ * Assert that a stream contains text chunks.
228
+ *
229
+ * @param chunks - Collected stream chunks
230
+ * @throws AgentAssertionError if no text chunks found
231
+ *
232
+ * @category Testing
233
+ */
234
+ export declare function assertStreamHasText(chunks: StreamPart[]): void;
235
+ /**
236
+ * Assert that a stream has a finish chunk.
237
+ *
238
+ * @param chunks - Collected stream chunks
239
+ * @param reason - Optional expected finish reason
240
+ * @throws AgentAssertionError if no finish chunk or wrong reason
241
+ *
242
+ * @category Testing
243
+ */
244
+ export declare function assertStreamFinished(chunks: StreamPart[], reason?: FinishReason): void;
245
+ /**
246
+ * Get the combined text from stream chunks.
247
+ *
248
+ * @param chunks - Collected stream chunks
249
+ * @returns Combined text
250
+ *
251
+ * @example
252
+ * ```typescript
253
+ * const chunks = await collectStreamChunks(stream);
254
+ * const text = getStreamText(chunks);
255
+ * expect(text).toContain("hello");
256
+ * ```
257
+ *
258
+ * @category Testing
259
+ */
260
+ export declare function getStreamText(chunks: StreamPart[]): string;
261
+ /**
262
+ * Assert that the combined stream text contains specific content.
263
+ *
264
+ * @param chunks - Collected stream chunks
265
+ * @param text - Text to look for
266
+ * @throws AgentAssertionError if text not found
267
+ *
268
+ * @category Testing
269
+ */
270
+ export declare function assertStreamTextContains(chunks: StreamPart[], text: string): void;
271
+ /**
272
+ * Assert that agent state contains a file.
273
+ *
274
+ * @param state - The agent state to check
275
+ * @param path - File path
276
+ * @throws AgentAssertionError if file doesn't exist
277
+ *
278
+ * @example
279
+ * ```typescript
280
+ * assertStateHasFile(agent.state, "/src/index.ts");
281
+ * ```
282
+ *
283
+ * @category Testing
284
+ */
285
+ export declare function assertStateHasFile(state: AgentState, path: string): void;
286
+ /**
287
+ * Assert that agent state has a todo item.
288
+ *
289
+ * @param state - The agent state to check
290
+ * @param matcher - Todo content or partial match
291
+ * @returns The matching todo
292
+ * @throws AgentAssertionError if todo not found
293
+ *
294
+ * @example
295
+ * ```typescript
296
+ * const todo = assertStateHasTodo(agent.state, { content: "Fix bug" });
297
+ * expect(todo.status).toBe("completed");
298
+ * ```
299
+ *
300
+ * @category Testing
301
+ */
302
+ export declare function assertStateHasTodo(state: AgentState, matcher: string | Partial<TodoItem>): TodoItem;
303
+ /**
304
+ * Assert the number of todos in a state.
305
+ *
306
+ * @param state - The agent state to check
307
+ * @param count - Expected todo count
308
+ * @param status - Optional filter by status
309
+ * @throws AgentAssertionError if count doesn't match
310
+ *
311
+ * @example
312
+ * ```typescript
313
+ * assertTodoCount(agent.state, 3);
314
+ * assertTodoCount(agent.state, 1, "completed");
315
+ * ```
316
+ *
317
+ * @category Testing
318
+ */
319
+ export declare function assertTodoCount(state: AgentState, count: number, status?: TodoItem["status"]): void;
320
+ /**
321
+ * Assert that a mock agent was called.
322
+ *
323
+ * @param agent - The mock agent
324
+ * @param method - Method to check ("generate" or "stream")
325
+ * @throws AgentAssertionError if not called
326
+ *
327
+ * @category Testing
328
+ */
329
+ export declare function assertMockAgentCalled(agent: MockAgent, method?: "generate" | "stream"): void;
330
+ /**
331
+ * Assert that a mock agent was called a specific number of times.
332
+ *
333
+ * @param agent - The mock agent
334
+ * @param count - Expected call count
335
+ * @param method - Method to check ("generate" or "stream")
336
+ * @throws AgentAssertionError if count doesn't match
337
+ *
338
+ * @category Testing
339
+ */
340
+ export declare function assertMockAgentCallCount(agent: MockAgent, count: number, method?: "generate" | "stream"): void;
341
+ /**
342
+ * Assert that a mock agent was called with specific options.
343
+ *
344
+ * @param agent - The mock agent
345
+ * @param options - Expected options (partial match)
346
+ * @param method - Method to check
347
+ * @throws AgentAssertionError if not called with options
348
+ *
349
+ * @category Testing
350
+ */
351
+ export declare function assertMockAgentCalledWith(agent: MockAgent, options: Record<string, unknown>, method?: "generate" | "stream"): void;
352
+ /**
353
+ * Options for assertAgentBehavior.
354
+ *
355
+ * @category Testing
356
+ */
357
+ export interface AgentBehaviorOptions {
358
+ /** Expected response text (partial match) */
359
+ responseContains?: string | string[];
360
+ /** Expected response pattern */
361
+ responseMatches?: RegExp;
362
+ /** Expected finish reason */
363
+ finishReason?: FinishReason;
364
+ /** Tools that should be called */
365
+ toolsCalled?: string[];
366
+ /** Tools that should NOT be called */
367
+ toolsNotCalled?: string[];
368
+ /** Minimum steps */
369
+ minSteps?: number;
370
+ /** Maximum steps */
371
+ maxSteps?: number;
372
+ /** Has structured output */
373
+ hasOutput?: boolean;
374
+ /** Has usage information */
375
+ hasUsage?: boolean;
376
+ }
377
+ /**
378
+ * Assert multiple agent behavior expectations at once.
379
+ *
380
+ * This is a convenience function that combines multiple assertions.
381
+ *
382
+ * @param result - The generate result to check
383
+ * @param options - Behavior expectations
384
+ * @throws AgentAssertionError if any expectation fails
385
+ *
386
+ * @example
387
+ * ```typescript
388
+ * assertAgentBehavior(result, {
389
+ * responseContains: ["hello", "world"],
390
+ * finishReason: "stop",
391
+ * toolsCalled: ["search"],
392
+ * toolsNotCalled: ["delete"],
393
+ * minSteps: 1,
394
+ * hasUsage: true,
395
+ * });
396
+ * ```
397
+ *
398
+ * @category Testing
399
+ */
400
+ export declare function assertAgentBehavior(result: GenerateResult, options: AgentBehaviorOptions): void;
401
+ //# sourceMappingURL=assertions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../../src/testing/assertions.ts"],"names":[],"mappings":"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"}