agentx-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/README.md +561 -0
  2. package/dist/agent.d.ts +105 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +690 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/config/config.d.ts +346 -0
  7. package/dist/config/config.d.ts.map +1 -0
  8. package/dist/config/config.js +93 -0
  9. package/dist/config/config.js.map +1 -0
  10. package/dist/contracts/entities/agent-event.d.ts +97 -0
  11. package/dist/contracts/entities/agent-event.d.ts.map +1 -0
  12. package/dist/contracts/entities/agent-event.js +2 -0
  13. package/dist/contracts/entities/agent-event.js.map +1 -0
  14. package/dist/contracts/entities/agent-skill.d.ts +59 -0
  15. package/dist/contracts/entities/agent-skill.d.ts.map +1 -0
  16. package/dist/contracts/entities/agent-skill.js +2 -0
  17. package/dist/contracts/entities/agent-skill.js.map +1 -0
  18. package/dist/contracts/entities/agent-tool.d.ts +42 -0
  19. package/dist/contracts/entities/agent-tool.d.ts.map +1 -0
  20. package/dist/contracts/entities/agent-tool.js +2 -0
  21. package/dist/contracts/entities/agent-tool.js.map +1 -0
  22. package/dist/contracts/entities/chat-message.d.ts +13 -0
  23. package/dist/contracts/entities/chat-message.d.ts.map +1 -0
  24. package/dist/contracts/entities/chat-message.js +2 -0
  25. package/dist/contracts/entities/chat-message.js.map +1 -0
  26. package/dist/contracts/entities/content-part.d.ts +16 -0
  27. package/dist/contracts/entities/content-part.d.ts.map +1 -0
  28. package/dist/contracts/entities/content-part.js +2 -0
  29. package/dist/contracts/entities/content-part.js.map +1 -0
  30. package/dist/contracts/entities/execution-context.d.ts +9 -0
  31. package/dist/contracts/entities/execution-context.d.ts.map +1 -0
  32. package/dist/contracts/entities/execution-context.js +2 -0
  33. package/dist/contracts/entities/execution-context.js.map +1 -0
  34. package/dist/contracts/entities/index.d.ts +11 -0
  35. package/dist/contracts/entities/index.d.ts.map +1 -0
  36. package/dist/contracts/entities/index.js +2 -0
  37. package/dist/contracts/entities/index.js.map +1 -0
  38. package/dist/contracts/entities/knowledge.d.ts +21 -0
  39. package/dist/contracts/entities/knowledge.d.ts.map +1 -0
  40. package/dist/contracts/entities/knowledge.js +2 -0
  41. package/dist/contracts/entities/knowledge.js.map +1 -0
  42. package/dist/contracts/entities/stores.d.ts +18 -0
  43. package/dist/contracts/entities/stores.d.ts.map +1 -0
  44. package/dist/contracts/entities/stores.js +2 -0
  45. package/dist/contracts/entities/stores.js.map +1 -0
  46. package/dist/contracts/entities/token-usage.d.ts +7 -0
  47. package/dist/contracts/entities/token-usage.d.ts.map +1 -0
  48. package/dist/contracts/entities/token-usage.js +2 -0
  49. package/dist/contracts/entities/token-usage.js.map +1 -0
  50. package/dist/contracts/entities/tool-call.d.ts +16 -0
  51. package/dist/contracts/entities/tool-call.d.ts.map +1 -0
  52. package/dist/contracts/entities/tool-call.js +2 -0
  53. package/dist/contracts/entities/tool-call.js.map +1 -0
  54. package/dist/contracts/enums/index.d.ts +21 -0
  55. package/dist/contracts/enums/index.d.ts.map +1 -0
  56. package/dist/contracts/enums/index.js +8 -0
  57. package/dist/contracts/enums/index.js.map +1 -0
  58. package/dist/contracts/index.d.ts +3 -0
  59. package/dist/contracts/index.d.ts.map +1 -0
  60. package/dist/contracts/index.js +3 -0
  61. package/dist/contracts/index.js.map +1 -0
  62. package/dist/core/compaction/autocompact.d.ts +18 -0
  63. package/dist/core/compaction/autocompact.d.ts.map +1 -0
  64. package/dist/core/compaction/autocompact.js +68 -0
  65. package/dist/core/compaction/autocompact.js.map +1 -0
  66. package/dist/core/compaction/microcompact.d.ts +20 -0
  67. package/dist/core/compaction/microcompact.d.ts.map +1 -0
  68. package/dist/core/compaction/microcompact.js +38 -0
  69. package/dist/core/compaction/microcompact.js.map +1 -0
  70. package/dist/core/compaction/snip-compact.d.ts +22 -0
  71. package/dist/core/compaction/snip-compact.d.ts.map +1 -0
  72. package/dist/core/compaction/snip-compact.js +61 -0
  73. package/dist/core/compaction/snip-compact.js.map +1 -0
  74. package/dist/core/compaction/tool-result-budget.d.ts +24 -0
  75. package/dist/core/compaction/tool-result-budget.d.ts.map +1 -0
  76. package/dist/core/compaction/tool-result-budget.js +67 -0
  77. package/dist/core/compaction/tool-result-budget.js.map +1 -0
  78. package/dist/core/context-analysis.d.ts +24 -0
  79. package/dist/core/context-analysis.d.ts.map +1 -0
  80. package/dist/core/context-analysis.js +37 -0
  81. package/dist/core/context-analysis.js.map +1 -0
  82. package/dist/core/context-builder.d.ts +25 -0
  83. package/dist/core/context-builder.d.ts.map +1 -0
  84. package/dist/core/context-builder.js +108 -0
  85. package/dist/core/context-builder.js.map +1 -0
  86. package/dist/core/conversation-manager.d.ts +19 -0
  87. package/dist/core/conversation-manager.d.ts.map +1 -0
  88. package/dist/core/conversation-manager.js +62 -0
  89. package/dist/core/conversation-manager.js.map +1 -0
  90. package/dist/core/execution-context.d.ts +6 -0
  91. package/dist/core/execution-context.d.ts.map +1 -0
  92. package/dist/core/execution-context.js +14 -0
  93. package/dist/core/execution-context.js.map +1 -0
  94. package/dist/core/loop-deps.d.ts +15 -0
  95. package/dist/core/loop-deps.d.ts.map +1 -0
  96. package/dist/core/loop-deps.js +8 -0
  97. package/dist/core/loop-deps.js.map +1 -0
  98. package/dist/core/loop-types.d.ts +34 -0
  99. package/dist/core/loop-types.d.ts.map +1 -0
  100. package/dist/core/loop-types.js +15 -0
  101. package/dist/core/loop-types.js.map +1 -0
  102. package/dist/core/message-normalize.d.ts +18 -0
  103. package/dist/core/message-normalize.d.ts.map +1 -0
  104. package/dist/core/message-normalize.js +69 -0
  105. package/dist/core/message-normalize.js.map +1 -0
  106. package/dist/core/prompt-builders.d.ts +36 -0
  107. package/dist/core/prompt-builders.d.ts.map +1 -0
  108. package/dist/core/prompt-builders.js +89 -0
  109. package/dist/core/prompt-builders.js.map +1 -0
  110. package/dist/core/prompt-cache.d.ts +25 -0
  111. package/dist/core/prompt-cache.d.ts.map +1 -0
  112. package/dist/core/prompt-cache.js +34 -0
  113. package/dist/core/prompt-cache.js.map +1 -0
  114. package/dist/core/react-loop.d.ts +43 -0
  115. package/dist/core/react-loop.d.ts.map +1 -0
  116. package/dist/core/react-loop.js +403 -0
  117. package/dist/core/react-loop.js.map +1 -0
  118. package/dist/core/stop-hooks.d.ts +18 -0
  119. package/dist/core/stop-hooks.d.ts.map +1 -0
  120. package/dist/core/stop-hooks.js +18 -0
  121. package/dist/core/stop-hooks.js.map +1 -0
  122. package/dist/core/stream-emitter.d.ts +24 -0
  123. package/dist/core/stream-emitter.d.ts.map +1 -0
  124. package/dist/core/stream-emitter.js +65 -0
  125. package/dist/core/stream-emitter.js.map +1 -0
  126. package/dist/core/streaming-tool-executor.d.ts +54 -0
  127. package/dist/core/streaming-tool-executor.d.ts.map +1 -0
  128. package/dist/core/streaming-tool-executor.js +164 -0
  129. package/dist/core/streaming-tool-executor.js.map +1 -0
  130. package/dist/core/turn-end-hooks.d.ts +39 -0
  131. package/dist/core/turn-end-hooks.d.ts.map +1 -0
  132. package/dist/core/turn-end-hooks.js +36 -0
  133. package/dist/core/turn-end-hooks.js.map +1 -0
  134. package/dist/index.d.ts +39 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +45 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/knowledge/chunking.d.ts +9 -0
  139. package/dist/knowledge/chunking.d.ts.map +1 -0
  140. package/dist/knowledge/chunking.js +49 -0
  141. package/dist/knowledge/chunking.js.map +1 -0
  142. package/dist/knowledge/embedding-service.d.ts +16 -0
  143. package/dist/knowledge/embedding-service.d.ts.map +1 -0
  144. package/dist/knowledge/embedding-service.js +43 -0
  145. package/dist/knowledge/embedding-service.js.map +1 -0
  146. package/dist/knowledge/knowledge-manager.d.ts +33 -0
  147. package/dist/knowledge/knowledge-manager.d.ts.map +1 -0
  148. package/dist/knowledge/knowledge-manager.js +62 -0
  149. package/dist/knowledge/knowledge-manager.js.map +1 -0
  150. package/dist/knowledge/sqlite-vector-store.d.ts +16 -0
  151. package/dist/knowledge/sqlite-vector-store.d.ts.map +1 -0
  152. package/dist/knowledge/sqlite-vector-store.js +56 -0
  153. package/dist/knowledge/sqlite-vector-store.js.map +1 -0
  154. package/dist/knowledge/vector-store.d.ts +2 -0
  155. package/dist/knowledge/vector-store.d.ts.map +1 -0
  156. package/dist/knowledge/vector-store.js +2 -0
  157. package/dist/knowledge/vector-store.js.map +1 -0
  158. package/dist/llm/errors.d.ts +15 -0
  159. package/dist/llm/errors.d.ts.map +1 -0
  160. package/dist/llm/errors.js +39 -0
  161. package/dist/llm/errors.js.map +1 -0
  162. package/dist/llm/message-types.d.ts +80 -0
  163. package/dist/llm/message-types.d.ts.map +1 -0
  164. package/dist/llm/message-types.js +2 -0
  165. package/dist/llm/message-types.js.map +1 -0
  166. package/dist/llm/openrouter-client.d.ts +18 -0
  167. package/dist/llm/openrouter-client.d.ts.map +1 -0
  168. package/dist/llm/openrouter-client.js +215 -0
  169. package/dist/llm/openrouter-client.js.map +1 -0
  170. package/dist/llm/reasoning.d.ts +10 -0
  171. package/dist/llm/reasoning.d.ts.map +1 -0
  172. package/dist/llm/reasoning.js +18 -0
  173. package/dist/llm/reasoning.js.map +1 -0
  174. package/dist/memory/file-memory-system.d.ts +98 -0
  175. package/dist/memory/file-memory-system.d.ts.map +1 -0
  176. package/dist/memory/file-memory-system.js +310 -0
  177. package/dist/memory/file-memory-system.js.map +1 -0
  178. package/dist/memory/memory-age.d.ts +22 -0
  179. package/dist/memory/memory-age.d.ts.map +1 -0
  180. package/dist/memory/memory-age.js +44 -0
  181. package/dist/memory/memory-age.js.map +1 -0
  182. package/dist/memory/memory-extractor.d.ts +56 -0
  183. package/dist/memory/memory-extractor.d.ts.map +1 -0
  184. package/dist/memory/memory-extractor.js +91 -0
  185. package/dist/memory/memory-extractor.js.map +1 -0
  186. package/dist/memory/memory-paths.d.ts +45 -0
  187. package/dist/memory/memory-paths.d.ts.map +1 -0
  188. package/dist/memory/memory-paths.js +121 -0
  189. package/dist/memory/memory-paths.js.map +1 -0
  190. package/dist/memory/memory-prompts.d.ts +41 -0
  191. package/dist/memory/memory-prompts.d.ts.map +1 -0
  192. package/dist/memory/memory-prompts.js +279 -0
  193. package/dist/memory/memory-prompts.js.map +1 -0
  194. package/dist/memory/memory-relevance.d.ts +16 -0
  195. package/dist/memory/memory-relevance.d.ts.map +1 -0
  196. package/dist/memory/memory-relevance.js +46 -0
  197. package/dist/memory/memory-relevance.js.map +1 -0
  198. package/dist/memory/memory-scanner.d.ts +22 -0
  199. package/dist/memory/memory-scanner.d.ts.map +1 -0
  200. package/dist/memory/memory-scanner.js +99 -0
  201. package/dist/memory/memory-scanner.js.map +1 -0
  202. package/dist/memory/memory-tools.d.ts +16 -0
  203. package/dist/memory/memory-tools.d.ts.map +1 -0
  204. package/dist/memory/memory-tools.js +196 -0
  205. package/dist/memory/memory-tools.js.map +1 -0
  206. package/dist/memory/memory-types.d.ts +47 -0
  207. package/dist/memory/memory-types.d.ts.map +1 -0
  208. package/dist/memory/memory-types.js +24 -0
  209. package/dist/memory/memory-types.js.map +1 -0
  210. package/dist/skills/skill-args.d.ts +23 -0
  211. package/dist/skills/skill-args.d.ts.map +1 -0
  212. package/dist/skills/skill-args.js +77 -0
  213. package/dist/skills/skill-args.js.map +1 -0
  214. package/dist/skills/skill-glob.d.ts +24 -0
  215. package/dist/skills/skill-glob.d.ts.map +1 -0
  216. package/dist/skills/skill-glob.js +60 -0
  217. package/dist/skills/skill-glob.js.map +1 -0
  218. package/dist/skills/skill-loader.d.ts +49 -0
  219. package/dist/skills/skill-loader.d.ts.map +1 -0
  220. package/dist/skills/skill-loader.js +197 -0
  221. package/dist/skills/skill-loader.js.map +1 -0
  222. package/dist/skills/skill-manager.d.ts +83 -0
  223. package/dist/skills/skill-manager.d.ts.map +1 -0
  224. package/dist/skills/skill-manager.js +338 -0
  225. package/dist/skills/skill-manager.js.map +1 -0
  226. package/dist/storage/sqlite-conversation-store.d.ts +15 -0
  227. package/dist/storage/sqlite-conversation-store.d.ts.map +1 -0
  228. package/dist/storage/sqlite-conversation-store.js +45 -0
  229. package/dist/storage/sqlite-conversation-store.js.map +1 -0
  230. package/dist/storage/sqlite-database.d.ts +14 -0
  231. package/dist/storage/sqlite-database.d.ts.map +1 -0
  232. package/dist/storage/sqlite-database.js +95 -0
  233. package/dist/storage/sqlite-database.js.map +1 -0
  234. package/dist/tools/builtin/ask-user.d.ts +7 -0
  235. package/dist/tools/builtin/ask-user.d.ts.map +1 -0
  236. package/dist/tools/builtin/ask-user.js +23 -0
  237. package/dist/tools/builtin/ask-user.js.map +1 -0
  238. package/dist/tools/builtin/bash.d.ts +3 -0
  239. package/dist/tools/builtin/bash.d.ts.map +1 -0
  240. package/dist/tools/builtin/bash.js +54 -0
  241. package/dist/tools/builtin/bash.js.map +1 -0
  242. package/dist/tools/builtin/file-edit.d.ts +3 -0
  243. package/dist/tools/builtin/file-edit.d.ts.map +1 -0
  244. package/dist/tools/builtin/file-edit.js +50 -0
  245. package/dist/tools/builtin/file-edit.js.map +1 -0
  246. package/dist/tools/builtin/file-read.d.ts +3 -0
  247. package/dist/tools/builtin/file-read.d.ts.map +1 -0
  248. package/dist/tools/builtin/file-read.js +47 -0
  249. package/dist/tools/builtin/file-read.js.map +1 -0
  250. package/dist/tools/builtin/file-write.d.ts +3 -0
  251. package/dist/tools/builtin/file-write.d.ts.map +1 -0
  252. package/dist/tools/builtin/file-write.js +29 -0
  253. package/dist/tools/builtin/file-write.js.map +1 -0
  254. package/dist/tools/builtin/glob.d.ts +3 -0
  255. package/dist/tools/builtin/glob.d.ts.map +1 -0
  256. package/dist/tools/builtin/glob.js +67 -0
  257. package/dist/tools/builtin/glob.js.map +1 -0
  258. package/dist/tools/builtin/grep.d.ts +3 -0
  259. package/dist/tools/builtin/grep.d.ts.map +1 -0
  260. package/dist/tools/builtin/grep.js +94 -0
  261. package/dist/tools/builtin/grep.js.map +1 -0
  262. package/dist/tools/builtin/index.d.ts +49 -0
  263. package/dist/tools/builtin/index.d.ts.map +1 -0
  264. package/dist/tools/builtin/index.js +65 -0
  265. package/dist/tools/builtin/index.js.map +1 -0
  266. package/dist/tools/builtin/web-fetch.d.ts +3 -0
  267. package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
  268. package/dist/tools/builtin/web-fetch.js +56 -0
  269. package/dist/tools/builtin/web-fetch.js.map +1 -0
  270. package/dist/tools/json-schema-to-zod.d.ts +30 -0
  271. package/dist/tools/json-schema-to-zod.d.ts.map +1 -0
  272. package/dist/tools/json-schema-to-zod.js +123 -0
  273. package/dist/tools/json-schema-to-zod.js.map +1 -0
  274. package/dist/tools/mcp-adapter.d.ts +80 -0
  275. package/dist/tools/mcp-adapter.d.ts.map +1 -0
  276. package/dist/tools/mcp-adapter.js +326 -0
  277. package/dist/tools/mcp-adapter.js.map +1 -0
  278. package/dist/tools/skill-tool.d.ts +41 -0
  279. package/dist/tools/skill-tool.d.ts.map +1 -0
  280. package/dist/tools/skill-tool.js +149 -0
  281. package/dist/tools/skill-tool.js.map +1 -0
  282. package/dist/tools/sql/index.d.ts +4 -0
  283. package/dist/tools/sql/index.d.ts.map +1 -0
  284. package/dist/tools/sql/index.js +2 -0
  285. package/dist/tools/sql/index.js.map +1 -0
  286. package/dist/tools/sql/sql-query-def.d.ts +22 -0
  287. package/dist/tools/sql/sql-query-def.d.ts.map +1 -0
  288. package/dist/tools/sql/sql-query-def.js +2 -0
  289. package/dist/tools/sql/sql-query-def.js.map +1 -0
  290. package/dist/tools/sql/sql-tool-factory.d.ts +28 -0
  291. package/dist/tools/sql/sql-tool-factory.d.ts.map +1 -0
  292. package/dist/tools/sql/sql-tool-factory.js +136 -0
  293. package/dist/tools/sql/sql-tool-factory.js.map +1 -0
  294. package/dist/tools/tool-executor.d.ts +67 -0
  295. package/dist/tools/tool-executor.d.ts.map +1 -0
  296. package/dist/tools/tool-executor.js +232 -0
  297. package/dist/tools/tool-executor.js.map +1 -0
  298. package/dist/utils/cache.d.ts +22 -0
  299. package/dist/utils/cache.d.ts.map +1 -0
  300. package/dist/utils/cache.js +61 -0
  301. package/dist/utils/cache.js.map +1 -0
  302. package/dist/utils/logger.d.ts +15 -0
  303. package/dist/utils/logger.d.ts.map +1 -0
  304. package/dist/utils/logger.js +46 -0
  305. package/dist/utils/logger.js.map +1 -0
  306. package/dist/utils/model-context.d.ts +14 -0
  307. package/dist/utils/model-context.d.ts.map +1 -0
  308. package/dist/utils/model-context.js +52 -0
  309. package/dist/utils/model-context.js.map +1 -0
  310. package/dist/utils/retry.d.ts +13 -0
  311. package/dist/utils/retry.d.ts.map +1 -0
  312. package/dist/utils/retry.js +41 -0
  313. package/dist/utils/retry.js.map +1 -0
  314. package/dist/utils/token-counter.d.ts +6 -0
  315. package/dist/utils/token-counter.d.ts.map +1 -0
  316. package/dist/utils/token-counter.js +19 -0
  317. package/dist/utils/token-counter.js.map +1 -0
  318. package/package.json +43 -0
@@ -0,0 +1,232 @@
1
+ import { ZodError } from 'zod';
2
+ import { zodToJsonSchema } from 'zod-to-json-schema';
3
+ import { retry } from '../utils/retry.js';
4
+ const DEFAULT_MAX_RESULT_CHARS = 10_000;
5
+ const TRUNCATE_HEAD_RATIO = 0.7;
6
+ const TRUNCATE_TAIL_RATIO = 0.2;
7
+ /**
8
+ * Registers tools, validates args via Zod, converts to JSON Schema,
9
+ * and executes tools with full pipeline:
10
+ *
11
+ * 1. Tool lookup
12
+ * 2. Zod schema validation
13
+ * 3. Semantic validation (tool.validate)
14
+ * 4. Before hook
15
+ * 5. Per-tool timeout wrapping
16
+ * 6. Retry for transient failures
17
+ * 7. Execute with progress callback
18
+ * 8. Result truncation (tool.maxResultChars)
19
+ * 9. Result mapping (tool.mapResult)
20
+ * 10. After hook
21
+ */
22
+ export class ToolExecutor {
23
+ tools = new Map();
24
+ hooks;
25
+ constructor(hooks = {}) {
26
+ this.hooks = hooks;
27
+ }
28
+ register(tool) {
29
+ this.tools.set(tool.name, tool);
30
+ }
31
+ unregister(name) {
32
+ return this.tools.delete(name);
33
+ }
34
+ listTools() {
35
+ return [...this.tools.values()];
36
+ }
37
+ getToolDefinitions() {
38
+ return this.listTools().map(tool => ({
39
+ type: 'function',
40
+ function: {
41
+ name: tool.name,
42
+ description: tool.description,
43
+ parameters: zodToJsonSchema(tool.parameters, { target: 'openApi3' }),
44
+ },
45
+ }));
46
+ }
47
+ async execute(name, args, signalOrOptions) {
48
+ // Normalize options (backward compatible — accepts bare AbortSignal)
49
+ const opts = signalOrOptions instanceof AbortSignal
50
+ ? { signal: signalOrOptions }
51
+ : signalOrOptions ?? {};
52
+ const tool = this.tools.get(name);
53
+ if (!tool) {
54
+ return { content: `Tool "${name}" not found`, isError: true };
55
+ }
56
+ // 1. Zod schema validation
57
+ let validatedArgs;
58
+ try {
59
+ validatedArgs = tool.parameters.parse(args);
60
+ }
61
+ catch (error) {
62
+ if (error instanceof ZodError) {
63
+ return { content: `Validation error: ${error.errors.map(e => e.message).join(', ')}`, isError: true };
64
+ }
65
+ return { content: `Validation error: ${String(error)}`, isError: true };
66
+ }
67
+ // 2. Semantic validation (tool.validate)
68
+ if (tool.validate) {
69
+ try {
70
+ const validationError = await tool.validate(validatedArgs, {
71
+ threadId: opts.threadId ?? 'default',
72
+ recentMessages: 0,
73
+ });
74
+ if (validationError) {
75
+ return { content: `Validation error: ${validationError}`, isError: true };
76
+ }
77
+ }
78
+ catch (error) {
79
+ return { content: `Validation error: ${error instanceof Error ? error.message : String(error)}`, isError: true };
80
+ }
81
+ }
82
+ // 3. Before hook
83
+ if (this.hooks.beforeToolCall) {
84
+ await this.hooks.beforeToolCall(name, validatedArgs);
85
+ }
86
+ // 4. Build execution signal (per-tool timeout + parent signal)
87
+ const execSignal = this.buildSignal(tool, opts.signal);
88
+ // 5. Build progress callback
89
+ const onProgress = opts.onProgress
90
+ ?? (opts.toolCallId && this.hooks.onToolProgress
91
+ ? (data) => this.hooks.onToolProgress(name, opts.toolCallId, data)
92
+ : undefined);
93
+ // 6. Execute (with retry if retryable)
94
+ let result;
95
+ try {
96
+ result = await this.executeWithRetry(tool, validatedArgs, execSignal, onProgress);
97
+ }
98
+ catch (error) {
99
+ result = { content: `Tool error: ${error instanceof Error ? error.message : String(error)}`, isError: true };
100
+ }
101
+ // 7. Result truncation
102
+ const maxChars = tool.maxResultChars ?? DEFAULT_MAX_RESULT_CHARS;
103
+ if (!result.isError && result.content.length > maxChars) {
104
+ result = {
105
+ ...result,
106
+ content: truncateResult(result.content, maxChars),
107
+ metadata: { ...result.metadata, truncated: true, originalLength: result.content.length },
108
+ };
109
+ }
110
+ // 8. Result mapping
111
+ if (tool.mapResult) {
112
+ result = tool.mapResult(result);
113
+ }
114
+ // 9. After hook
115
+ if (this.hooks.afterToolCall) {
116
+ await this.hooks.afterToolCall(name, validatedArgs, result);
117
+ }
118
+ return result;
119
+ }
120
+ async executeParallel(calls, signal) {
121
+ return Promise.all(calls.map(call => this.execute(call.name, call.args, signal)));
122
+ }
123
+ /**
124
+ * Executes tool calls respecting concurrency safety:
125
+ * - Consecutive concurrency-safe tools run in parallel
126
+ * - Non-safe tools run serially (one at a time)
127
+ * - Results are returned in the original call order
128
+ */
129
+ async executePartitioned(calls, signal) {
130
+ const results = [];
131
+ // Partition into batches of consecutive safe/unsafe tools
132
+ const batches = [];
133
+ let currentBatch = [];
134
+ let currentConcurrent = false;
135
+ for (const call of calls) {
136
+ const tool = this.tools.get(call.name);
137
+ const isSafe = tool
138
+ ? typeof tool.isConcurrencySafe === 'function'
139
+ ? tool.isConcurrencySafe(call.args)
140
+ : tool.isConcurrencySafe === true
141
+ : false;
142
+ if (currentBatch.length === 0) {
143
+ currentConcurrent = isSafe;
144
+ currentBatch.push(call);
145
+ }
146
+ else if (isSafe === currentConcurrent && isSafe) {
147
+ currentBatch.push(call);
148
+ }
149
+ else {
150
+ batches.push({ calls: currentBatch, concurrent: currentConcurrent });
151
+ currentBatch = [call];
152
+ currentConcurrent = isSafe;
153
+ }
154
+ }
155
+ if (currentBatch.length > 0) {
156
+ batches.push({ calls: currentBatch, concurrent: currentConcurrent });
157
+ }
158
+ for (const batch of batches) {
159
+ if (batch.concurrent) {
160
+ const batchResults = await Promise.all(batch.calls.map(async (call) => ({
161
+ id: call.id,
162
+ result: await this.execute(call.name, call.args, signal),
163
+ })));
164
+ results.push(...batchResults);
165
+ }
166
+ else {
167
+ for (const call of batch.calls) {
168
+ const result = await this.execute(call.name, call.args, signal);
169
+ results.push({ id: call.id, result });
170
+ }
171
+ }
172
+ }
173
+ return results;
174
+ }
175
+ // --- Private helpers ---
176
+ /**
177
+ * Build an AbortSignal combining parent signal + per-tool timeout.
178
+ */
179
+ buildSignal(tool, parentSignal) {
180
+ if (!tool.timeoutMs && !parentSignal) {
181
+ return new AbortController().signal;
182
+ }
183
+ if (!tool.timeoutMs)
184
+ return parentSignal;
185
+ const timeoutSignal = AbortSignal.timeout(tool.timeoutMs);
186
+ if (!parentSignal)
187
+ return timeoutSignal;
188
+ // Combine both signals
189
+ return AbortSignal.any([parentSignal, timeoutSignal]);
190
+ }
191
+ /**
192
+ * Execute with retry support using the existing retry utility.
193
+ */
194
+ async executeWithRetry(tool, args, signal, onProgress) {
195
+ const execFn = async () => {
196
+ const raw = await tool.execute(args, signal, onProgress);
197
+ return typeof raw === 'string' ? { content: raw } : raw;
198
+ };
199
+ if (!tool.retryable) {
200
+ return execFn();
201
+ }
202
+ const isRetryable = typeof tool.retryable === 'function'
203
+ ? tool.retryable
204
+ : (error) => {
205
+ // Don't retry abort errors
206
+ if (error instanceof DOMException && error.name === 'AbortError')
207
+ return false;
208
+ return true;
209
+ };
210
+ return retry(execFn, {
211
+ maxRetries: tool.maxRetries ?? 2,
212
+ initialDelay: 500,
213
+ backoffMultiplier: 2,
214
+ maxDelay: 5_000,
215
+ signal,
216
+ isRetryable,
217
+ });
218
+ }
219
+ }
220
+ /**
221
+ * Truncate tool result content preserving head and tail.
222
+ * Same strategy as microcompact (70% head, 20% tail).
223
+ */
224
+ function truncateResult(content, maxChars) {
225
+ const headSize = Math.floor(maxChars * TRUNCATE_HEAD_RATIO);
226
+ const tailSize = Math.floor(maxChars * TRUNCATE_TAIL_RATIO);
227
+ const head = content.slice(0, headSize);
228
+ const tail = content.slice(-tailSize);
229
+ const omitted = content.length - headSize - tailSize;
230
+ return `${head}\n\n[truncated ${omitted} characters]\n\n${tail}`;
231
+ }
232
+ //# sourceMappingURL=tool-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.js","sourceRoot":"","sources":["../../src/tools/tool-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface CacheOptions {
2
+ maxSize: number;
3
+ ttl?: number;
4
+ }
5
+ /**
6
+ * LRU Cache with optional TTL expiration.
7
+ * Uses Map insertion order for LRU tracking.
8
+ */
9
+ export declare class LRUCache<K, V> {
10
+ private readonly map;
11
+ private readonly maxSize;
12
+ private readonly ttl;
13
+ constructor(options: CacheOptions);
14
+ get size(): number;
15
+ get(key: K): V | undefined;
16
+ set(key: K, value: V): void;
17
+ has(key: K): boolean;
18
+ delete(key: K): boolean;
19
+ clear(): void;
20
+ private isExpired;
21
+ }
22
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAOD;;;GAGG;AACH,qBAAa,QAAQ,CAAC,CAAC,EAAE,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA+B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;gBAE7B,OAAO,EAAE,YAAY;IAKjC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAe1B,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAa3B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAYpB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIvB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,SAAS;CAIlB"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * LRU Cache with optional TTL expiration.
3
+ * Uses Map insertion order for LRU tracking.
4
+ */
5
+ export class LRUCache {
6
+ map = new Map();
7
+ maxSize;
8
+ ttl;
9
+ constructor(options) {
10
+ this.maxSize = options.maxSize;
11
+ this.ttl = options.ttl;
12
+ }
13
+ get size() {
14
+ return this.map.size;
15
+ }
16
+ get(key) {
17
+ const entry = this.map.get(key);
18
+ if (!entry)
19
+ return undefined;
20
+ if (this.isExpired(entry)) {
21
+ this.map.delete(key);
22
+ return undefined;
23
+ }
24
+ // Move to end (most recently used)
25
+ this.map.delete(key);
26
+ this.map.set(key, entry);
27
+ return entry.value;
28
+ }
29
+ set(key, value) {
30
+ // Remove existing to update position
31
+ this.map.delete(key);
32
+ // Evict LRU if at capacity
33
+ if (this.map.size >= this.maxSize) {
34
+ const firstKey = this.map.keys().next().value;
35
+ this.map.delete(firstKey);
36
+ }
37
+ this.map.set(key, { value, createdAt: Date.now() });
38
+ }
39
+ has(key) {
40
+ const entry = this.map.get(key);
41
+ if (!entry)
42
+ return false;
43
+ if (this.isExpired(entry)) {
44
+ this.map.delete(key);
45
+ return false;
46
+ }
47
+ return true;
48
+ }
49
+ delete(key) {
50
+ return this.map.delete(key);
51
+ }
52
+ clear() {
53
+ this.map.clear();
54
+ }
55
+ isExpired(entry) {
56
+ if (!this.ttl)
57
+ return false;
58
+ return Date.now() - entry.createdAt > this.ttl;
59
+ }
60
+ }
61
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACF,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;IAClC,OAAO,CAAS;IAChB,GAAG,CAAqB;IAEzC,YAAY,OAAqB;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACzB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,GAAM;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAE7B,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,qCAAqC;QACrC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAErB,2BAA2B;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAU,CAAC;YACnD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,GAAG,CAAC,GAAM;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,GAAM;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IAEO,SAAS,CAAC,KAAoB;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QAC5B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;IACjD,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { LogLevel } from '../contracts/enums/index.js';
2
+ export interface Logger {
3
+ level: LogLevel;
4
+ debug(message: string, context?: Record<string, unknown>): void;
5
+ info(message: string, context?: Record<string, unknown>): void;
6
+ warn(message: string, context?: Record<string, unknown>): void;
7
+ error(message: string, context?: Record<string, unknown>): void;
8
+ child(prefix: string): Logger;
9
+ }
10
+ export interface LoggerOptions {
11
+ level?: LogLevel;
12
+ prefix?: string;
13
+ }
14
+ export declare function createLogger(options?: LoggerOptions): Logger;
15
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAU5D,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CA8BhE"}
@@ -0,0 +1,46 @@
1
+ const LOG_LEVELS = {
2
+ debug: 0,
3
+ info: 1,
4
+ warn: 2,
5
+ error: 3,
6
+ silent: 4,
7
+ };
8
+ function formatMessage(level, prefix, message, context) {
9
+ const timestamp = new Date().toISOString();
10
+ const prefixStr = prefix ? `[${prefix}] ` : '';
11
+ const contextStr = context ? ' ' + JSON.stringify(context) : '';
12
+ return `${timestamp} ${level.toUpperCase()} ${prefixStr}${message}${contextStr}`;
13
+ }
14
+ export function createLogger(options = {}) {
15
+ const level = options.level ?? 'info';
16
+ const prefix = options.prefix;
17
+ const threshold = LOG_LEVELS[level];
18
+ function shouldLog(msgLevel) {
19
+ return LOG_LEVELS[msgLevel] >= threshold;
20
+ }
21
+ const logger = {
22
+ level,
23
+ debug(message, context) {
24
+ if (shouldLog('debug'))
25
+ console.debug(formatMessage('debug', prefix, message, context));
26
+ },
27
+ info(message, context) {
28
+ if (shouldLog('info'))
29
+ console.info(formatMessage('info', prefix, message, context));
30
+ },
31
+ warn(message, context) {
32
+ if (shouldLog('warn'))
33
+ console.warn(formatMessage('warn', prefix, message, context));
34
+ },
35
+ error(message, context) {
36
+ if (shouldLog('error'))
37
+ console.error(formatMessage('error', prefix, message, context));
38
+ },
39
+ child(childPrefix) {
40
+ const newPrefix = prefix ? `${prefix}:${childPrefix}` : childPrefix;
41
+ return createLogger({ level, prefix: newPrefix });
42
+ },
43
+ };
44
+ return logger;
45
+ }
46
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;CACV,CAAC;AAgBF,SAAS,aAAa,CAAC,KAAa,EAAE,MAA0B,EAAE,OAAe,EAAE,OAAiC;IAClH,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,SAAS,GAAG,OAAO,GAAG,UAAU,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEpC,SAAS,SAAS,CAAC,QAAkB;QACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC;IAC3C,CAAC;IAED,MAAM,MAAM,GAAW;QACrB,KAAK;QACL,KAAK,CAAC,OAAO,EAAE,OAAQ;YACrB,IAAI,SAAS,CAAC,OAAO,CAAC;gBAAE,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,OAAQ;YACpB,IAAI,SAAS,CAAC,MAAM,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,OAAQ;YACpB,IAAI,SAAS,CAAC,MAAM,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,KAAK,CAAC,OAAO,EAAE,OAAQ;YACrB,IAAI,SAAS,CAAC,OAAO,CAAC;gBAAE,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,KAAK,CAAC,WAAmB;YACvB,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YACpE,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACpD,CAAC;KACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Model context window detection.
3
+ *
4
+ * Maps known model IDs to their context window sizes.
5
+ * Falls back to a conservative default for unknown models.
6
+ */
7
+ /**
8
+ * Get the context window size for a model.
9
+ *
10
+ * @param modelId — full model ID (e.g. "anthropic/claude-sonnet-4-20250514")
11
+ * @param override — optional explicit override (takes precedence)
12
+ */
13
+ export declare function getModelContextWindow(modelId: string, override?: number): number;
14
+ //# sourceMappingURL=model-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-context.d.ts","sourceRoot":"","sources":["../../src/utils/model-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuCH;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQhF"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Model context window detection.
3
+ *
4
+ * Maps known model IDs to their context window sizes.
5
+ * Falls back to a conservative default for unknown models.
6
+ */
7
+ const DEFAULT_CONTEXT_WINDOW = 128_000;
8
+ /** Known model patterns → context window tokens */
9
+ const MODEL_CONTEXT_WINDOWS = [
10
+ // Anthropic Claude
11
+ { pattern: 'claude-opus-4', tokens: 200_000 },
12
+ { pattern: 'claude-sonnet-4', tokens: 200_000 },
13
+ { pattern: 'claude-haiku-4', tokens: 200_000 },
14
+ { pattern: 'claude-3.5-sonnet', tokens: 200_000 },
15
+ { pattern: 'claude-3-opus', tokens: 200_000 },
16
+ { pattern: 'claude-3-sonnet', tokens: 200_000 },
17
+ { pattern: 'claude-3-haiku', tokens: 200_000 },
18
+ // OpenAI GPT-4
19
+ { pattern: 'gpt-4o', tokens: 128_000 },
20
+ { pattern: 'gpt-4-turbo', tokens: 128_000 },
21
+ { pattern: 'gpt-4-0125', tokens: 128_000 },
22
+ { pattern: 'gpt-4-1106', tokens: 128_000 },
23
+ // OpenAI o1/o3
24
+ { pattern: 'o1', tokens: 200_000 },
25
+ { pattern: 'o3', tokens: 200_000 },
26
+ // Google Gemini
27
+ { pattern: 'gemini-2', tokens: 1_000_000 },
28
+ { pattern: 'gemini-1.5-pro', tokens: 1_000_000 },
29
+ { pattern: 'gemini-1.5-flash', tokens: 1_000_000 },
30
+ // DeepSeek
31
+ { pattern: 'deepseek-chat', tokens: 128_000 },
32
+ { pattern: 'deepseek-r1', tokens: 128_000 },
33
+ // Mistral
34
+ { pattern: 'mistral-large', tokens: 128_000 },
35
+ { pattern: 'mistral-medium', tokens: 32_000 },
36
+ ];
37
+ /**
38
+ * Get the context window size for a model.
39
+ *
40
+ * @param modelId — full model ID (e.g. "anthropic/claude-sonnet-4-20250514")
41
+ * @param override — optional explicit override (takes precedence)
42
+ */
43
+ export function getModelContextWindow(modelId, override) {
44
+ if (override !== undefined)
45
+ return override;
46
+ for (const entry of MODEL_CONTEXT_WINDOWS) {
47
+ if (modelId.includes(entry.pattern))
48
+ return entry.tokens;
49
+ }
50
+ return DEFAULT_CONTEXT_WINDOW;
51
+ }
52
+ //# sourceMappingURL=model-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-context.js","sourceRoot":"","sources":["../../src/utils/model-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAEvC,mDAAmD;AACnD,MAAM,qBAAqB,GAA+C;IACxE,mBAAmB;IACnB,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE;IAC7C,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE;IAC/C,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE;IAC9C,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAE;IACjD,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE;IAC7C,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE;IAC/C,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE;IAE9C,eAAe;IACf,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE;IACtC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE;IAC3C,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE;IAC1C,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE;IAE1C,eAAe;IACf,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAClC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAElC,gBAAgB;IAChB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE;IAC1C,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE;IAChD,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE;IAElD,WAAW;IACX,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE;IAC7C,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE;IAE3C,UAAU;IACV,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE;IAC7C,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE;CAC9C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,QAAiB;IACtE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,qBAAqB,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IAC3D,CAAC;IAED,OAAO,sBAAsB,CAAC;AAChC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface RetryOptions {
2
+ maxRetries: number;
3
+ initialDelay?: number;
4
+ backoffMultiplier?: number;
5
+ maxDelay?: number;
6
+ signal?: AbortSignal;
7
+ isRetryable?: (error: unknown) => boolean;
8
+ }
9
+ /**
10
+ * Retries an async function with exponential backoff.
11
+ */
12
+ export declare function retry<T>(fn: () => Promise<T>, options: RetryOptions): Promise<T>;
13
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAkBD;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,CAAC,CAAC,CAkCZ"}
@@ -0,0 +1,41 @@
1
+ function sleep(ms, signal) {
2
+ return new Promise((resolve, reject) => {
3
+ if (signal?.aborted) {
4
+ reject(signal.reason ?? new Error('Aborted'));
5
+ return;
6
+ }
7
+ const timer = setTimeout(resolve, ms);
8
+ signal?.addEventListener('abort', () => {
9
+ clearTimeout(timer);
10
+ reject(signal.reason ?? new Error('Aborted'));
11
+ }, { once: true });
12
+ });
13
+ }
14
+ /**
15
+ * Retries an async function with exponential backoff.
16
+ */
17
+ export async function retry(fn, options) {
18
+ const { maxRetries, initialDelay = 1000, backoffMultiplier = 2, maxDelay = 30_000, signal, isRetryable = () => true, } = options;
19
+ let lastError;
20
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
21
+ try {
22
+ if (signal?.aborted) {
23
+ throw signal.reason ?? new Error('Aborted');
24
+ }
25
+ return await fn();
26
+ }
27
+ catch (error) {
28
+ lastError = error;
29
+ if (attempt >= maxRetries || !isRetryable(error)) {
30
+ throw error;
31
+ }
32
+ // Respect retryAfterMs from rate-limited errors (e.g. 429 with Retry-After header)
33
+ const retryAfterMs = error?.retryAfterMs;
34
+ const backoffDelay = Math.min(initialDelay * backoffMultiplier ** attempt, maxDelay);
35
+ const delay = retryAfterMs ? Math.max(retryAfterMs, backoffDelay) : backoffDelay;
36
+ await sleep(delay, signal);
37
+ }
38
+ }
39
+ throw lastError;
40
+ }
41
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AASA,SAAS,KAAK,CAAC,EAAU,EAAE,MAAoB;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEtC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACrC,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAChD,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,EAAoB,EACpB,OAAqB;IAErB,MAAM,EACJ,UAAU,EACV,YAAY,GAAG,IAAI,EACnB,iBAAiB,GAAG,CAAC,EACrB,QAAQ,GAAG,MAAM,EACjB,MAAM,EACN,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,GACzB,GAAG,OAAO,CAAC;IAEZ,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,MAAM,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAElB,IAAI,OAAO,IAAI,UAAU,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,MAAM,KAAK,CAAC;YACd,CAAC;YAED,mFAAmF;YACnF,MAAM,YAAY,GAAI,KAAmC,EAAE,YAAY,CAAC;YACxE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,iBAAiB,IAAI,OAAO,EAAE,QAAQ,CAAC,CAAC;YACrF,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;YACjF,MAAM,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Estimates token count for a text string.
3
+ * Uses heuristic: ~4 chars per token for latin, ~1.5 chars per token for CJK.
4
+ */
5
+ export declare function estimateTokens(text: string): number;
6
+ //# sourceMappingURL=token-counter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-counter.d.ts","sourceRoot":"","sources":["../../src/utils/token-counter.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWnD"}
@@ -0,0 +1,19 @@
1
+ // CJK Unified Ideographs and common CJK ranges
2
+ const CJK_REGEX = /[\u4e00-\u9fff\u3400-\u4dbf\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uffef\uac00-\ud7af]/g;
3
+ const CHARS_PER_TOKEN_LATIN = 4;
4
+ const CHARS_PER_TOKEN_CJK = 1.5;
5
+ /**
6
+ * Estimates token count for a text string.
7
+ * Uses heuristic: ~4 chars per token for latin, ~1.5 chars per token for CJK.
8
+ */
9
+ export function estimateTokens(text) {
10
+ if (!text)
11
+ return 0;
12
+ const cjkChars = (text.match(CJK_REGEX) ?? []).length;
13
+ const nonCjkText = text.replace(CJK_REGEX, '');
14
+ const latinChars = nonCjkText.replace(/\s+/g, ' ').length;
15
+ const cjkTokens = cjkChars / CHARS_PER_TOKEN_CJK;
16
+ const latinTokens = latinChars / CHARS_PER_TOKEN_LATIN;
17
+ return Math.ceil(cjkTokens + latinTokens);
18
+ }
19
+ //# sourceMappingURL=token-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-counter.js","sourceRoot":"","sources":["../../src/utils/token-counter.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,MAAM,SAAS,GAAG,gGAAgG,CAAC;AACnH,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IAEpB,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;IAE1D,MAAM,SAAS,GAAG,QAAQ,GAAG,mBAAmB,CAAC;IACjD,MAAM,WAAW,GAAG,UAAU,GAAG,qBAAqB,CAAC;IAEvD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;AAC5C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "agentx-sdk",
3
+ "version": "0.1.0",
4
+ "description": "AgentX SDK - Standalone TypeScript agent library with streaming, tools, memory, knowledge (RAG), and skills",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "typecheck": "tsc --noEmit",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "test:coverage": "vitest run --coverage",
23
+ "lint": "tsc --noEmit"
24
+ },
25
+ "engines": {
26
+ "node": ">=22.0.0"
27
+ },
28
+ "dependencies": {
29
+ "better-sqlite3": "^11.0.0",
30
+ "zod": "^3.23.0",
31
+ "zod-to-json-schema": "^3.23.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/better-sqlite3": "^7.6.0",
35
+ "@types/node": "^22.0.0",
36
+ "typescript": "^5.5.0",
37
+ "vitest": "^2.0.0"
38
+ },
39
+ "optionalDependencies": {
40
+ "@modelcontextprotocol/sdk": "^1.0.0"
41
+ },
42
+ "license": "MIT"
43
+ }