general-agent-runtime 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 (332) hide show
  1. package/README.md +311 -0
  2. package/dist/agent/agent.d.ts +14 -0
  3. package/dist/agent/agent.js +25 -0
  4. package/dist/agent/agent.js.map +1 -0
  5. package/dist/agent/builder.d.ts +28 -0
  6. package/dist/agent/builder.js +178 -0
  7. package/dist/agent/builder.js.map +1 -0
  8. package/dist/agent/create-agent.d.ts +2 -0
  9. package/dist/agent/create-agent.js +29 -0
  10. package/dist/agent/create-agent.js.map +1 -0
  11. package/dist/agent/index.d.ts +8 -0
  12. package/dist/agent/index.js +8 -0
  13. package/dist/agent/index.js.map +1 -0
  14. package/dist/agent/integrations/session-context-source.d.ts +12 -0
  15. package/dist/agent/integrations/session-context-source.js +84 -0
  16. package/dist/agent/integrations/session-context-source.js.map +1 -0
  17. package/dist/agent/integrations/session-run-recorder.d.ts +17 -0
  18. package/dist/agent/integrations/session-run-recorder.js +60 -0
  19. package/dist/agent/integrations/session-run-recorder.js.map +1 -0
  20. package/dist/agent/loop-factory.d.ts +11 -0
  21. package/dist/agent/loop-factory.js +16 -0
  22. package/dist/agent/loop-factory.js.map +1 -0
  23. package/dist/agent/run-manager.d.ts +38 -0
  24. package/dist/agent/run-manager.js +96 -0
  25. package/dist/agent/run-manager.js.map +1 -0
  26. package/dist/agent/types.d.ts +38 -0
  27. package/dist/agent/types.js +2 -0
  28. package/dist/agent/types.js.map +1 -0
  29. package/dist/cli/main.d.ts +2 -0
  30. package/dist/cli/main.js +88 -0
  31. package/dist/cli/main.js.map +1 -0
  32. package/dist/cli/renderer.d.ts +2 -0
  33. package/dist/cli/renderer.js +36 -0
  34. package/dist/cli/renderer.js.map +1 -0
  35. package/dist/compaction/budget.d.ts +14 -0
  36. package/dist/compaction/budget.js +28 -0
  37. package/dist/compaction/budget.js.map +1 -0
  38. package/dist/compaction/deterministic.d.ts +9 -0
  39. package/dist/compaction/deterministic.js +106 -0
  40. package/dist/compaction/deterministic.js.map +1 -0
  41. package/dist/compaction/index.d.ts +5 -0
  42. package/dist/compaction/index.js +5 -0
  43. package/dist/compaction/index.js.map +1 -0
  44. package/dist/compaction/manager.d.ts +22 -0
  45. package/dist/compaction/manager.js +111 -0
  46. package/dist/compaction/manager.js.map +1 -0
  47. package/dist/compaction/semantic.d.ts +13 -0
  48. package/dist/compaction/semantic.js +234 -0
  49. package/dist/compaction/semantic.js.map +1 -0
  50. package/dist/compaction/strategy.d.ts +1 -0
  51. package/dist/compaction/strategy.js +2 -0
  52. package/dist/compaction/strategy.js.map +1 -0
  53. package/dist/compaction/types.d.ts +40 -0
  54. package/dist/compaction/types.js +2 -0
  55. package/dist/compaction/types.js.map +1 -0
  56. package/dist/context/budget.d.ts +12 -0
  57. package/dist/context/budget.js +13 -0
  58. package/dist/context/budget.js.map +1 -0
  59. package/dist/context/controller.d.ts +17 -0
  60. package/dist/context/controller.js +78 -0
  61. package/dist/context/controller.js.map +1 -0
  62. package/dist/context/index.d.ts +14 -0
  63. package/dist/context/index.js +13 -0
  64. package/dist/context/index.js.map +1 -0
  65. package/dist/context/manager.d.ts +10 -0
  66. package/dist/context/manager.js +65 -0
  67. package/dist/context/manager.js.map +1 -0
  68. package/dist/context/pipeline.d.ts +16 -0
  69. package/dist/context/pipeline.js +45 -0
  70. package/dist/context/pipeline.js.map +1 -0
  71. package/dist/context/projection.d.ts +8 -0
  72. package/dist/context/projection.js +10 -0
  73. package/dist/context/projection.js.map +1 -0
  74. package/dist/context/source.d.ts +6 -0
  75. package/dist/context/source.js +2 -0
  76. package/dist/context/source.js.map +1 -0
  77. package/dist/context/sources/dynamic.d.ts +10 -0
  78. package/dist/context/sources/dynamic.js +13 -0
  79. package/dist/context/sources/dynamic.js.map +1 -0
  80. package/dist/context/sources/project.d.ts +19 -0
  81. package/dist/context/sources/project.js +75 -0
  82. package/dist/context/sources/project.js.map +1 -0
  83. package/dist/context/sources/system.d.ts +14 -0
  84. package/dist/context/sources/system.js +23 -0
  85. package/dist/context/sources/system.js.map +1 -0
  86. package/dist/context/sources/user.d.ts +14 -0
  87. package/dist/context/sources/user.js +23 -0
  88. package/dist/context/sources/user.js.map +1 -0
  89. package/dist/context/stages/deduplicate.d.ts +7 -0
  90. package/dist/context/stages/deduplicate.js +19 -0
  91. package/dist/context/stages/deduplicate.js.map +1 -0
  92. package/dist/context/stages/expiration.d.ts +5 -0
  93. package/dist/context/stages/expiration.js +14 -0
  94. package/dist/context/stages/expiration.js.map +1 -0
  95. package/dist/context/stages/visibility.d.ts +5 -0
  96. package/dist/context/stages/visibility.js +7 -0
  97. package/dist/context/stages/visibility.js.map +1 -0
  98. package/dist/context/types.d.ts +72 -0
  99. package/dist/context/types.js +2 -0
  100. package/dist/context/types.js.map +1 -0
  101. package/dist/errors/codes.d.ts +1 -0
  102. package/dist/errors/codes.js +2 -0
  103. package/dist/errors/codes.js.map +1 -0
  104. package/dist/errors/index.d.ts +4 -0
  105. package/dist/errors/index.js +4 -0
  106. package/dist/errors/index.js.map +1 -0
  107. package/dist/errors/normalize.d.ts +2 -0
  108. package/dist/errors/normalize.js +32 -0
  109. package/dist/errors/normalize.js.map +1 -0
  110. package/dist/errors/runtime-error.d.ts +18 -0
  111. package/dist/errors/runtime-error.js +21 -0
  112. package/dist/errors/runtime-error.js.map +1 -0
  113. package/dist/errors/serialize.d.ts +2 -0
  114. package/dist/errors/serialize.js +12 -0
  115. package/dist/errors/serialize.js.map +1 -0
  116. package/dist/events/bus.d.ts +17 -0
  117. package/dist/events/bus.js +52 -0
  118. package/dist/events/bus.js.map +1 -0
  119. package/dist/events/index.d.ts +6 -0
  120. package/dist/events/index.js +5 -0
  121. package/dist/events/index.js.map +1 -0
  122. package/dist/events/publisher.d.ts +12 -0
  123. package/dist/events/publisher.js +22 -0
  124. package/dist/events/publisher.js.map +1 -0
  125. package/dist/events/sequence.d.ts +6 -0
  126. package/dist/events/sequence.js +14 -0
  127. package/dist/events/sequence.js.map +1 -0
  128. package/dist/events/sink.d.ts +5 -0
  129. package/dist/events/sink.js +2 -0
  130. package/dist/events/sink.js.map +1 -0
  131. package/dist/events/stream.d.ts +12 -0
  132. package/dist/events/stream.js +46 -0
  133. package/dist/events/stream.js.map +1 -0
  134. package/dist/events/types.d.ts +42 -0
  135. package/dist/events/types.js +2 -0
  136. package/dist/events/types.js.map +1 -0
  137. package/dist/hooks/bus.d.ts +14 -0
  138. package/dist/hooks/bus.js +104 -0
  139. package/dist/hooks/bus.js.map +1 -0
  140. package/dist/hooks/index.d.ts +5 -0
  141. package/dist/hooks/index.js +5 -0
  142. package/dist/hooks/index.js.map +1 -0
  143. package/dist/hooks/policy.d.ts +3 -0
  144. package/dist/hooks/policy.js +33 -0
  145. package/dist/hooks/policy.js.map +1 -0
  146. package/dist/hooks/registry.d.ts +13 -0
  147. package/dist/hooks/registry.js +31 -0
  148. package/dist/hooks/registry.js.map +1 -0
  149. package/dist/hooks/timeout.d.ts +2 -0
  150. package/dist/hooks/timeout.js +63 -0
  151. package/dist/hooks/timeout.js.map +1 -0
  152. package/dist/hooks/types.d.ts +40 -0
  153. package/dist/hooks/types.js +2 -0
  154. package/dist/hooks/types.js.map +1 -0
  155. package/dist/index.d.ts +13 -0
  156. package/dist/index.js +14 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/loop/index.d.ts +7 -0
  159. package/dist/loop/index.js +6 -0
  160. package/dist/loop/index.js.map +1 -0
  161. package/dist/loop/loop.d.ts +22 -0
  162. package/dist/loop/loop.js +623 -0
  163. package/dist/loop/loop.js.map +1 -0
  164. package/dist/loop/policy.d.ts +21 -0
  165. package/dist/loop/policy.js +54 -0
  166. package/dist/loop/policy.js.map +1 -0
  167. package/dist/loop/recorder.d.ts +9 -0
  168. package/dist/loop/recorder.js +2 -0
  169. package/dist/loop/recorder.js.map +1 -0
  170. package/dist/loop/state.d.ts +18 -0
  171. package/dist/loop/state.js +81 -0
  172. package/dist/loop/state.js.map +1 -0
  173. package/dist/loop/stream-assembler.d.ts +12 -0
  174. package/dist/loop/stream-assembler.js +76 -0
  175. package/dist/loop/stream-assembler.js.map +1 -0
  176. package/dist/loop/transition.d.ts +2 -0
  177. package/dist/loop/transition.js +27 -0
  178. package/dist/loop/transition.js.map +1 -0
  179. package/dist/loop/types.d.ts +53 -0
  180. package/dist/loop/types.js +2 -0
  181. package/dist/loop/types.js.map +1 -0
  182. package/dist/model/index.d.ts +6 -0
  183. package/dist/model/index.js +5 -0
  184. package/dist/model/index.js.map +1 -0
  185. package/dist/model/provider.d.ts +6 -0
  186. package/dist/model/provider.js +2 -0
  187. package/dist/model/provider.js.map +1 -0
  188. package/dist/model/providers/openai-compatible/adapter.d.ts +3 -0
  189. package/dist/model/providers/openai-compatible/adapter.js +92 -0
  190. package/dist/model/providers/openai-compatible/adapter.js.map +1 -0
  191. package/dist/model/providers/openai-compatible/errors.d.ts +3 -0
  192. package/dist/model/providers/openai-compatible/errors.js +68 -0
  193. package/dist/model/providers/openai-compatible/errors.js.map +1 -0
  194. package/dist/model/providers/openai-compatible/provider.d.ts +18 -0
  195. package/dist/model/providers/openai-compatible/provider.js +182 -0
  196. package/dist/model/providers/openai-compatible/provider.js.map +1 -0
  197. package/dist/model/providers/openai-compatible/stream-parser.d.ts +1 -0
  198. package/dist/model/providers/openai-compatible/stream-parser.js +45 -0
  199. package/dist/model/providers/openai-compatible/stream-parser.js.map +1 -0
  200. package/dist/model/registry.d.ts +9 -0
  201. package/dist/model/registry.js +35 -0
  202. package/dist/model/registry.js.map +1 -0
  203. package/dist/model/types.d.ts +49 -0
  204. package/dist/model/types.js +2 -0
  205. package/dist/model/types.js.map +1 -0
  206. package/dist/session/factory.d.ts +13 -0
  207. package/dist/session/factory.js +14 -0
  208. package/dist/session/factory.js.map +1 -0
  209. package/dist/session/index.d.ts +8 -0
  210. package/dist/session/index.js +7 -0
  211. package/dist/session/index.js.map +1 -0
  212. package/dist/session/jsonl-store.d.ts +20 -0
  213. package/dist/session/jsonl-store.js +264 -0
  214. package/dist/session/jsonl-store.js.map +1 -0
  215. package/dist/session/projector.d.ts +4 -0
  216. package/dist/session/projector.js +104 -0
  217. package/dist/session/projector.js.map +1 -0
  218. package/dist/session/serializer.d.ts +5 -0
  219. package/dist/session/serializer.js +126 -0
  220. package/dist/session/serializer.js.map +1 -0
  221. package/dist/session/session.d.ts +32 -0
  222. package/dist/session/session.js +129 -0
  223. package/dist/session/session.js.map +1 -0
  224. package/dist/session/store.d.ts +9 -0
  225. package/dist/session/store.js +2 -0
  226. package/dist/session/store.js.map +1 -0
  227. package/dist/session/types.d.ts +29 -0
  228. package/dist/session/types.js +2 -0
  229. package/dist/session/types.js.map +1 -0
  230. package/dist/settings/defaults.d.ts +7 -0
  231. package/dist/settings/defaults.js +40 -0
  232. package/dist/settings/defaults.js.map +1 -0
  233. package/dist/settings/env-source.d.ts +8 -0
  234. package/dist/settings/env-source.js +26 -0
  235. package/dist/settings/env-source.js.map +1 -0
  236. package/dist/settings/file-source.d.ts +9 -0
  237. package/dist/settings/file-source.js +32 -0
  238. package/dist/settings/file-source.js.map +1 -0
  239. package/dist/settings/index.d.ts +8 -0
  240. package/dist/settings/index.js +7 -0
  241. package/dist/settings/index.js.map +1 -0
  242. package/dist/settings/resolver.d.ts +5 -0
  243. package/dist/settings/resolver.js +29 -0
  244. package/dist/settings/resolver.js.map +1 -0
  245. package/dist/settings/runtime-source.d.ts +8 -0
  246. package/dist/settings/runtime-source.js +11 -0
  247. package/dist/settings/runtime-source.js.map +1 -0
  248. package/dist/settings/schema.d.ts +37 -0
  249. package/dist/settings/schema.js +47 -0
  250. package/dist/settings/schema.js.map +1 -0
  251. package/dist/settings/source.d.ts +5 -0
  252. package/dist/settings/source.js +2 -0
  253. package/dist/settings/source.js.map +1 -0
  254. package/dist/settings/types.d.ts +46 -0
  255. package/dist/settings/types.js +2 -0
  256. package/dist/settings/types.js.map +1 -0
  257. package/dist/tools/builtin/list-directory.d.ts +17 -0
  258. package/dist/tools/builtin/list-directory.js +31 -0
  259. package/dist/tools/builtin/list-directory.js.map +1 -0
  260. package/dist/tools/builtin/read-file.d.ts +14 -0
  261. package/dist/tools/builtin/read-file.js +23 -0
  262. package/dist/tools/builtin/read-file.js.map +1 -0
  263. package/dist/tools/builtin/run-command.d.ts +19 -0
  264. package/dist/tools/builtin/run-command.js +46 -0
  265. package/dist/tools/builtin/run-command.js.map +1 -0
  266. package/dist/tools/builtin/write-file.d.ts +20 -0
  267. package/dist/tools/builtin/write-file.js +29 -0
  268. package/dist/tools/builtin/write-file.js.map +1 -0
  269. package/dist/tools/executor.d.ts +29 -0
  270. package/dist/tools/executor.js +212 -0
  271. package/dist/tools/executor.js.map +1 -0
  272. package/dist/tools/index.d.ts +10 -0
  273. package/dist/tools/index.js +9 -0
  274. package/dist/tools/index.js.map +1 -0
  275. package/dist/tools/registry.d.ts +19 -0
  276. package/dist/tools/registry.js +42 -0
  277. package/dist/tools/registry.js.map +1 -0
  278. package/dist/tools/result-processor.d.ts +4 -0
  279. package/dist/tools/result-processor.js +122 -0
  280. package/dist/tools/result-processor.js.map +1 -0
  281. package/dist/tools/tool.d.ts +8 -0
  282. package/dist/tools/tool.js +2 -0
  283. package/dist/tools/tool.js.map +1 -0
  284. package/dist/tools/types.d.ts +44 -0
  285. package/dist/tools/types.js +2 -0
  286. package/dist/tools/types.js.map +1 -0
  287. package/dist/tools/validator.d.ts +5 -0
  288. package/dist/tools/validator.js +112 -0
  289. package/dist/tools/validator.js.map +1 -0
  290. package/dist/types/compaction.d.ts +22 -0
  291. package/dist/types/compaction.js +2 -0
  292. package/dist/types/compaction.js.map +1 -0
  293. package/dist/types/error.d.ts +10 -0
  294. package/dist/types/error.js +2 -0
  295. package/dist/types/error.js.map +1 -0
  296. package/dist/types/ids.d.ts +12 -0
  297. package/dist/types/ids.js +2 -0
  298. package/dist/types/ids.js.map +1 -0
  299. package/dist/types/index.d.ts +9 -0
  300. package/dist/types/index.js +2 -0
  301. package/dist/types/index.js.map +1 -0
  302. package/dist/types/json.d.ts +7 -0
  303. package/dist/types/json.js +2 -0
  304. package/dist/types/json.js.map +1 -0
  305. package/dist/types/message.d.ts +39 -0
  306. package/dist/types/message.js +2 -0
  307. package/dist/types/message.js.map +1 -0
  308. package/dist/types/metadata.d.ts +2 -0
  309. package/dist/types/metadata.js +2 -0
  310. package/dist/types/metadata.js.map +1 -0
  311. package/dist/types/runtime.d.ts +20 -0
  312. package/dist/types/runtime.js +2 -0
  313. package/dist/types/runtime.js.map +1 -0
  314. package/dist/types/tool.d.ts +12 -0
  315. package/dist/types/tool.js +2 -0
  316. package/dist/types/tool.js.map +1 -0
  317. package/dist/types/usage.d.ts +17 -0
  318. package/dist/types/usage.js +2 -0
  319. package/dist/types/usage.js.map +1 -0
  320. package/dist/utils/deep.d.ts +2 -0
  321. package/dist/utils/deep.js +34 -0
  322. package/dist/utils/deep.js.map +1 -0
  323. package/dist/utils/id.d.ts +10 -0
  324. package/dist/utils/id.js +14 -0
  325. package/dist/utils/id.js.map +1 -0
  326. package/dist/utils/index.d.ts +3 -0
  327. package/dist/utils/index.js +4 -0
  328. package/dist/utils/index.js.map +1 -0
  329. package/dist/utils/message.d.ts +11 -0
  330. package/dist/utils/message.js +31 -0
  331. package/dist/utils/message.js.map +1 -0
  332. package/package.json +59 -0
@@ -0,0 +1,14 @@
1
+ import type { JsonObject } from "../../types/index.js";
2
+ import type { Tool } from "../tool.js";
3
+ import type { ToolContext } from "../types.js";
4
+ type ReadFileInput = JsonObject & {
5
+ path: string;
6
+ encoding?: string;
7
+ };
8
+ export declare class ReadFileTool implements Tool<ReadFileInput, string> {
9
+ readonly name = "read_file";
10
+ readonly description = "Read a UTF-8 text file from the filesystem.";
11
+ readonly inputSchema: JsonObject;
12
+ execute(input: ReadFileInput, context: ToolContext, signal?: AbortSignal): Promise<string>;
13
+ }
14
+ export {};
@@ -0,0 +1,23 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export class ReadFileTool {
4
+ name = "read_file";
5
+ description = "Read a UTF-8 text file from the filesystem.";
6
+ inputSchema = {
7
+ type: "object",
8
+ properties: {
9
+ path: { type: "string", minLength: 1 },
10
+ encoding: { type: "string", enum: ["utf8", "utf-8"] },
11
+ },
12
+ required: ["path"],
13
+ additionalProperties: false,
14
+ };
15
+ async execute(input, context, signal) {
16
+ const target = path.resolve(context.cwd ?? process.cwd(), input.path);
17
+ return readFile(target, {
18
+ encoding: "utf8",
19
+ ...(signal === undefined ? {} : { signal }),
20
+ });
21
+ }
22
+ }
23
+ //# sourceMappingURL=read-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../../src/tools/builtin/read-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,6CAA6C,CAAC;IAC5D,WAAW,GAAe;QACjC,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE;YACtC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;SACtD;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;QAClB,oBAAoB,EAAE,KAAK;KAC5B,CAAC;IAEF,KAAK,CAAC,OAAO,CACX,KAAoB,EACpB,OAAoB,EACpB,MAAoB;QAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,QAAQ,CAAC,MAAM,EAAE;YACtB,QAAQ,EAAE,MAAM;YAChB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { JsonObject } from "../../types/index.js";
2
+ import type { Tool } from "../tool.js";
3
+ import type { ToolContext } from "../types.js";
4
+ type RunCommandInput = JsonObject & {
5
+ command: string;
6
+ cwd?: string;
7
+ };
8
+ interface RunCommandResult extends JsonObject {
9
+ stdout: string;
10
+ stderr: string;
11
+ exitCode: number;
12
+ }
13
+ export declare class RunCommandTool implements Tool<RunCommandInput, RunCommandResult> {
14
+ readonly name = "run_command";
15
+ readonly description = "Run a shell command and return stdout, stderr, and exit code.";
16
+ readonly inputSchema: JsonObject;
17
+ execute(input: RunCommandInput, context: ToolContext, signal?: AbortSignal): Promise<RunCommandResult>;
18
+ }
19
+ export {};
@@ -0,0 +1,46 @@
1
+ import { spawn } from "node:child_process";
2
+ import path from "node:path";
3
+ export class RunCommandTool {
4
+ name = "run_command";
5
+ description = "Run a shell command and return stdout, stderr, and exit code.";
6
+ inputSchema = {
7
+ type: "object",
8
+ properties: {
9
+ command: { type: "string", minLength: 1 },
10
+ cwd: { type: "string", minLength: 1 },
11
+ },
12
+ required: ["command"],
13
+ additionalProperties: false,
14
+ };
15
+ async execute(input, context, signal) {
16
+ signal?.throwIfAborted();
17
+ const cwd = path.resolve(context.cwd ?? process.cwd(), input.cwd ?? ".");
18
+ return new Promise((resolve, reject) => {
19
+ let stdout = "";
20
+ let stderr = "";
21
+ const child = spawn(input.command, {
22
+ cwd,
23
+ shell: true,
24
+ windowsHide: true,
25
+ ...(signal === undefined ? {} : { signal }),
26
+ });
27
+ child.stdout?.setEncoding("utf8");
28
+ child.stderr?.setEncoding("utf8");
29
+ child.stdout?.on("data", (chunk) => {
30
+ stdout += chunk;
31
+ });
32
+ child.stderr?.on("data", (chunk) => {
33
+ stderr += chunk;
34
+ });
35
+ child.once("error", reject);
36
+ child.once("close", (code) => {
37
+ resolve({
38
+ stdout,
39
+ stderr,
40
+ exitCode: code ?? -1,
41
+ });
42
+ });
43
+ });
44
+ }
45
+ }
46
+ //# sourceMappingURL=run-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../../src/tools/builtin/run-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAgB7B,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,aAAa,CAAC;IACrB,WAAW,GAAG,+DAA+D,CAAC;IAC9E,WAAW,GAAe;QACjC,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE;YACzC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE;SACtC;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;QACrB,oBAAoB,EAAE,KAAK;KAC5B,CAAC;IAEF,KAAK,CAAC,OAAO,CACX,KAAsB,EACtB,OAAoB,EACpB,MAAoB;QAEpB,MAAM,EAAE,cAAc,EAAE,CAAC;QAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAC5B,KAAK,CAAC,GAAG,IAAI,GAAG,CACjB,CAAC;QAEF,OAAO,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACvD,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;gBACjC,GAAG;gBACH,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,IAAI;gBACjB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;aAC5C,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACzC,MAAM,IAAI,KAAK,CAAC;YAClB,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACzC,MAAM,IAAI,KAAK,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC3B,OAAO,CAAC;oBACN,MAAM;oBACN,MAAM;oBACN,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;iBACrB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { JsonObject } from "../../types/index.js";
2
+ import type { Tool } from "../tool.js";
3
+ import type { ToolContext } from "../types.js";
4
+ interface WriteFileInput extends JsonObject {
5
+ path: string;
6
+ content: string;
7
+ }
8
+ export declare class WriteFileTool implements Tool<WriteFileInput, {
9
+ path: string;
10
+ bytes: number;
11
+ }> {
12
+ readonly name = "write_file";
13
+ readonly description = "Create or overwrite a UTF-8 text file.";
14
+ readonly inputSchema: JsonObject;
15
+ execute(input: WriteFileInput, context: ToolContext, signal?: AbortSignal): Promise<{
16
+ path: string;
17
+ bytes: number;
18
+ }>;
19
+ }
20
+ export {};
@@ -0,0 +1,29 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export class WriteFileTool {
4
+ name = "write_file";
5
+ description = "Create or overwrite a UTF-8 text file.";
6
+ inputSchema = {
7
+ type: "object",
8
+ properties: {
9
+ path: { type: "string", minLength: 1 },
10
+ content: { type: "string" },
11
+ },
12
+ required: ["path", "content"],
13
+ additionalProperties: false,
14
+ };
15
+ async execute(input, context, signal) {
16
+ signal?.throwIfAborted();
17
+ const target = path.resolve(context.cwd ?? process.cwd(), input.path);
18
+ await mkdir(path.dirname(target), { recursive: true });
19
+ await writeFile(target, input.content, {
20
+ encoding: "utf8",
21
+ ...(signal === undefined ? {} : { signal }),
22
+ });
23
+ return {
24
+ path: target,
25
+ bytes: Buffer.byteLength(input.content, "utf8"),
26
+ };
27
+ }
28
+ }
29
+ //# sourceMappingURL=write-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../../src/tools/builtin/write-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,MAAM,OAAO,aAAa;IAGf,IAAI,GAAG,YAAY,CAAC;IACpB,WAAW,GAAG,wCAAwC,CAAC;IACvD,WAAW,GAAe;QACjC,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE;YACtC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC5B;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;QAC7B,oBAAoB,EAAE,KAAK;KAC5B,CAAC;IAEF,KAAK,CAAC,OAAO,CACX,KAAqB,EACrB,OAAoB,EACpB,MAAoB;QAEpB,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE;YACrC,QAAQ,EAAE,MAAM;YAChB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;SAC5C,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;SAChD,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ import type { HookBus } from "../hooks/bus.js";
2
+ import type { ToolCall } from "../types/index.js";
3
+ import type { ToolRegistry } from "./registry.js";
4
+ import type { ToolContext, ToolExecutionResult, ToolInputValidator, ToolResultProcessor } from "./types.js";
5
+ export interface ToolExecutor {
6
+ execute(call: ToolCall, context: ToolContext, signal?: AbortSignal): Promise<ToolExecutionResult>;
7
+ executeMany(calls: readonly ToolCall[], context: ToolContext, signal?: AbortSignal): Promise<readonly ToolExecutionResult[]>;
8
+ }
9
+ export interface DefaultToolExecutorOptions {
10
+ timeoutMs?: number;
11
+ maxParallel?: number;
12
+ maxResultChars?: number;
13
+ maxResultLines?: number;
14
+ maxRetries?: number;
15
+ }
16
+ export declare class DefaultToolExecutor implements ToolExecutor {
17
+ private readonly registry;
18
+ private readonly validator;
19
+ private readonly processor;
20
+ private readonly hookBus;
21
+ private readonly options;
22
+ constructor(registry: ToolRegistry, validator: ToolInputValidator, processor: ToolResultProcessor, hookBus: HookBus, options?: DefaultToolExecutorOptions);
23
+ execute(call: ToolCall, context: ToolContext, signal?: AbortSignal): Promise<ToolExecutionResult>;
24
+ executeMany(calls: readonly ToolCall[], context: ToolContext, signal?: AbortSignal): Promise<readonly ToolExecutionResult[]>;
25
+ private hookContext;
26
+ private retryExhausted;
27
+ private runWithTimeout;
28
+ private processError;
29
+ }
@@ -0,0 +1,212 @@
1
+ import { RuntimeError } from "../errors/runtime-error.js";
2
+ import { normalizeUnknownError } from "../errors/normalize.js";
3
+ const DEFAULT_OPTIONS = {
4
+ timeoutMs: 30_000,
5
+ maxParallel: 4,
6
+ maxResultChars: 8_000,
7
+ maxResultLines: 200,
8
+ maxRetries: 1,
9
+ };
10
+ export class DefaultToolExecutor {
11
+ registry;
12
+ validator;
13
+ processor;
14
+ hookBus;
15
+ options;
16
+ constructor(registry, validator, processor, hookBus, options = {}) {
17
+ this.registry = registry;
18
+ this.validator = validator;
19
+ this.processor = processor;
20
+ this.hookBus = hookBus;
21
+ this.options = { ...DEFAULT_OPTIONS, ...options };
22
+ }
23
+ async execute(call, context, signal) {
24
+ signal?.throwIfAborted();
25
+ const startedAt = Date.now();
26
+ try {
27
+ let currentCall = structuredClone(call);
28
+ for (let attempt = 0; attempt <= this.options.maxRetries; attempt += 1) {
29
+ signal?.throwIfAborted();
30
+ const initialTool = this.registry.require(currentCall.toolName);
31
+ this.validator.validate(initialTool.inputSchema, currentCall.input);
32
+ const before = await this.hookBus.run("before_tool", currentCall, this.hookContext(context, signal));
33
+ if (before.blocked) {
34
+ return this.processError(before.value, new RuntimeError({
35
+ code: "TOOL_PERMISSION",
36
+ category: "tool",
37
+ message: before.reason ?? `Tool blocked: ${currentCall.toolName}`,
38
+ }), startedAt, signal);
39
+ }
40
+ if (before.retryRequested) {
41
+ if (attempt < this.options.maxRetries) {
42
+ currentCall = before.value;
43
+ continue;
44
+ }
45
+ return this.retryExhausted(before.value, before.reason, startedAt, signal);
46
+ }
47
+ currentCall = before.value;
48
+ const tool = this.registry.require(currentCall.toolName);
49
+ this.validator.validate(tool.inputSchema, currentCall.input);
50
+ const value = await this.runWithTimeout((toolSignal) => tool.execute(currentCall.input, context, toolSignal), currentCall.toolName, signal);
51
+ const processed = await this.processor.process({
52
+ call: currentCall,
53
+ raw: {
54
+ value,
55
+ durationMs: Date.now() - startedAt,
56
+ },
57
+ limits: {
58
+ maxChars: this.options.maxResultChars,
59
+ maxLines: this.options.maxResultLines,
60
+ },
61
+ }, signal);
62
+ const after = await this.hookBus.run("after_tool", processed, this.hookContext(context, signal));
63
+ if (after.blocked) {
64
+ return this.processError(processed.call, new RuntimeError({
65
+ code: "TOOL_EXECUTION_FAILED",
66
+ category: "tool",
67
+ message: after.reason ??
68
+ `Tool result blocked: ${processed.call.toolName}`,
69
+ }), startedAt, signal);
70
+ }
71
+ if (after.retryRequested) {
72
+ if (attempt < this.options.maxRetries) {
73
+ currentCall = processed.call;
74
+ continue;
75
+ }
76
+ return this.retryExhausted(processed.call, after.reason, startedAt, signal);
77
+ }
78
+ return after.value;
79
+ }
80
+ return this.retryExhausted(currentCall, undefined, startedAt, signal);
81
+ }
82
+ catch (error) {
83
+ const normalized = normalizeUnknownError(error);
84
+ if (normalized.code === "ABORTED") {
85
+ throw normalized;
86
+ }
87
+ const runtimeError = normalized.category === "tool"
88
+ ? normalized
89
+ : new RuntimeError({
90
+ code: "TOOL_EXECUTION_FAILED",
91
+ category: "tool",
92
+ message: normalized.message,
93
+ cause: normalized,
94
+ });
95
+ return this.processError(call, runtimeError, startedAt, signal);
96
+ }
97
+ }
98
+ async executeMany(calls, context, signal) {
99
+ signal?.throwIfAborted();
100
+ if (calls.length === 0) {
101
+ return [];
102
+ }
103
+ const results = new Array(calls.length);
104
+ let nextIndex = 0;
105
+ const workerCount = Math.max(1, Math.min(this.options.maxParallel, calls.length));
106
+ const worker = async () => {
107
+ while (true) {
108
+ signal?.throwIfAborted();
109
+ const index = nextIndex;
110
+ nextIndex += 1;
111
+ if (index >= calls.length) {
112
+ return;
113
+ }
114
+ const call = calls[index];
115
+ if (call !== undefined) {
116
+ results[index] = await this.execute(call, context, signal);
117
+ }
118
+ }
119
+ };
120
+ await Promise.all(Array.from({ length: workerCount }, () => worker()));
121
+ return results;
122
+ }
123
+ hookContext(context, signal) {
124
+ return {
125
+ sessionId: context.sessionId,
126
+ runId: context.runId,
127
+ turnId: context.turnId,
128
+ ...(signal === undefined ? {} : { signal }),
129
+ ...(context.metadata === undefined
130
+ ? {}
131
+ : { metadata: context.metadata }),
132
+ };
133
+ }
134
+ retryExhausted(call, reason, startedAt, signal) {
135
+ return this.processError(call, new RuntimeError({
136
+ code: "TOOL_EXECUTION_FAILED",
137
+ category: "tool",
138
+ message: reason ??
139
+ `Tool retry limit exceeded after ${this.options.maxRetries} retries: ${call.toolName}`,
140
+ retryable: true,
141
+ }), startedAt, signal);
142
+ }
143
+ async runWithTimeout(execute, toolName, signal) {
144
+ if (signal?.aborted) {
145
+ throw new RuntimeError({
146
+ code: "ABORTED",
147
+ category: "abort",
148
+ message: "Operation aborted",
149
+ cause: signal.reason,
150
+ });
151
+ }
152
+ const controller = new AbortController();
153
+ let timeoutId;
154
+ let externalAbort;
155
+ const guard = new Promise((_, reject) => {
156
+ timeoutId = setTimeout(() => {
157
+ controller.abort("timeout");
158
+ reject(new RuntimeError({
159
+ code: "TOOL_TIMEOUT",
160
+ category: "tool",
161
+ message: `Tool timed out after ${this.options.timeoutMs}ms: ${toolName}`,
162
+ retryable: true,
163
+ }));
164
+ }, this.options.timeoutMs);
165
+ if (signal !== undefined) {
166
+ externalAbort = () => {
167
+ controller.abort(signal.reason);
168
+ reject(new RuntimeError({
169
+ code: "ABORTED",
170
+ category: "abort",
171
+ message: "Operation aborted",
172
+ cause: signal.reason,
173
+ }));
174
+ };
175
+ signal.addEventListener("abort", externalAbort, { once: true });
176
+ }
177
+ });
178
+ try {
179
+ return await Promise.race([execute(controller.signal), guard]);
180
+ }
181
+ finally {
182
+ if (timeoutId !== undefined) {
183
+ clearTimeout(timeoutId);
184
+ }
185
+ if (signal !== undefined && externalAbort !== undefined) {
186
+ signal.removeEventListener("abort", externalAbort);
187
+ }
188
+ }
189
+ }
190
+ processError(call, error, startedAt, signal) {
191
+ const content = {
192
+ error: {
193
+ code: error.code,
194
+ message: error.message,
195
+ retryable: error.retryable,
196
+ },
197
+ };
198
+ return this.processor.process({
199
+ call,
200
+ raw: {
201
+ value: content,
202
+ isError: true,
203
+ durationMs: Date.now() - startedAt,
204
+ },
205
+ limits: {
206
+ maxChars: this.options.maxResultChars,
207
+ maxLines: this.options.maxResultLines,
208
+ },
209
+ }, signal);
210
+ }
211
+ }
212
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/tools/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type * from "./types.js";
2
+ export type * from "./tool.js";
3
+ export { DefaultToolRegistry, type ToolRegistry, } from "./registry.js";
4
+ export { JsonSchemaToolInputValidator } from "./validator.js";
5
+ export { DefaultToolResultProcessor } from "./result-processor.js";
6
+ export { DefaultToolExecutor, type ToolExecutor, type DefaultToolExecutorOptions, } from "./executor.js";
7
+ export { ReadFileTool } from "./builtin/read-file.js";
8
+ export { WriteFileTool } from "./builtin/write-file.js";
9
+ export { ListDirectoryTool } from "./builtin/list-directory.js";
10
+ export { RunCommandTool } from "./builtin/run-command.js";
@@ -0,0 +1,9 @@
1
+ export { DefaultToolRegistry, } from "./registry.js";
2
+ export { JsonSchemaToolInputValidator } from "./validator.js";
3
+ export { DefaultToolResultProcessor } from "./result-processor.js";
4
+ export { DefaultToolExecutor, } from "./executor.js";
5
+ export { ReadFileTool } from "./builtin/read-file.js";
6
+ export { WriteFileTool } from "./builtin/write-file.js";
7
+ export { ListDirectoryTool } from "./builtin/list-directory.js";
8
+ export { RunCommandTool } from "./builtin/run-command.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EACL,mBAAmB,GAGpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ToolSpec } from "../types/tool.js";
2
+ import type { Tool } from "./tool.js";
3
+ export interface ToolRegistry {
4
+ register(tool: Tool): void;
5
+ unregister(name: string): boolean;
6
+ get(name: string): Tool | undefined;
7
+ require(name: string): Tool;
8
+ list(): readonly Tool[];
9
+ specs(): readonly ToolSpec[];
10
+ }
11
+ export declare class DefaultToolRegistry implements ToolRegistry {
12
+ private readonly tools;
13
+ register(tool: Tool): void;
14
+ unregister(name: string): boolean;
15
+ get(name: string): Tool | undefined;
16
+ require(name: string): Tool;
17
+ list(): readonly Tool[];
18
+ specs(): readonly ToolSpec[];
19
+ }
@@ -0,0 +1,42 @@
1
+ import { RuntimeError } from "../errors/runtime-error.js";
2
+ export class DefaultToolRegistry {
3
+ tools = new Map();
4
+ register(tool) {
5
+ if (this.tools.has(tool.name)) {
6
+ throw new RuntimeError({
7
+ code: "TOOL_EXECUTION_FAILED",
8
+ category: "tool",
9
+ message: `Tool already registered: ${tool.name}`,
10
+ });
11
+ }
12
+ this.tools.set(tool.name, tool);
13
+ }
14
+ unregister(name) {
15
+ return this.tools.delete(name);
16
+ }
17
+ get(name) {
18
+ return this.tools.get(name);
19
+ }
20
+ require(name) {
21
+ const tool = this.tools.get(name);
22
+ if (tool === undefined) {
23
+ throw new RuntimeError({
24
+ code: "TOOL_NOT_FOUND",
25
+ category: "tool",
26
+ message: `Tool not found: ${name}`,
27
+ });
28
+ }
29
+ return tool;
30
+ }
31
+ list() {
32
+ return [...this.tools.values()];
33
+ }
34
+ specs() {
35
+ return this.list().map((tool) => ({
36
+ name: tool.name,
37
+ description: tool.description,
38
+ inputSchema: structuredClone(tool.inputSchema),
39
+ }));
40
+ }
41
+ }
42
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAa1D,MAAM,OAAO,mBAAmB;IACb,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAEjD,QAAQ,CAAC,IAAU;QACjB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,YAAY,CAAC;gBACrB,IAAI,EAAE,uBAAuB;gBAC7B,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,4BAA4B,IAAI,CAAC,IAAI,EAAE;aACjD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,YAAY,CAAC;gBACrB,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,mBAAmB,IAAI,EAAE;aACnC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAChC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;SAC/C,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { ToolExecutionResult, ToolResultProcessRequest, ToolResultProcessor } from "./types.js";
2
+ export declare class DefaultToolResultProcessor implements ToolResultProcessor {
3
+ process(request: ToolResultProcessRequest, signal?: AbortSignal): Promise<ToolExecutionResult>;
4
+ }
@@ -0,0 +1,122 @@
1
+ const TRUNCATION_MARKER = "\n... [truncated] ...\n";
2
+ function jsonSafe(value, seen = new Set()) {
3
+ if (value === null || typeof value === "string" || typeof value === "boolean") {
4
+ return value;
5
+ }
6
+ if (typeof value === "number") {
7
+ return Number.isFinite(value) ? value : String(value);
8
+ }
9
+ if (typeof value === "bigint") {
10
+ return value.toString();
11
+ }
12
+ if (Buffer.isBuffer(value)) {
13
+ return value.toString("utf8");
14
+ }
15
+ if (value instanceof Error) {
16
+ const result = {
17
+ name: value.name,
18
+ message: value.message,
19
+ };
20
+ if (value.stack) {
21
+ result.stack = value.stack;
22
+ }
23
+ return result;
24
+ }
25
+ if (value instanceof Date) {
26
+ return value.toISOString();
27
+ }
28
+ if (Array.isArray(value)) {
29
+ if (seen.has(value)) {
30
+ return "[Circular]";
31
+ }
32
+ seen.add(value);
33
+ try {
34
+ return value.map((item) => jsonSafe(item, seen));
35
+ }
36
+ finally {
37
+ seen.delete(value);
38
+ }
39
+ }
40
+ if (typeof value === "object") {
41
+ if (seen.has(value)) {
42
+ return "[Circular]";
43
+ }
44
+ seen.add(value);
45
+ try {
46
+ const result = {};
47
+ for (const [key, child] of Object.entries(value)) {
48
+ result[key] = jsonSafe(child, seen);
49
+ }
50
+ return result;
51
+ }
52
+ finally {
53
+ seen.delete(value);
54
+ }
55
+ }
56
+ return String(value);
57
+ }
58
+ function truncateByLines(text, maxLines) {
59
+ if (maxLines <= 0) {
60
+ return { text: "", truncated: text.length > 0 };
61
+ }
62
+ const lines = text.split(/\r?\n/);
63
+ if (lines.length <= maxLines) {
64
+ return { text, truncated: false };
65
+ }
66
+ const headCount = Math.ceil(maxLines / 2);
67
+ const tailCount = Math.floor(maxLines / 2);
68
+ const head = lines.slice(0, headCount).join("\n");
69
+ const tail = tailCount === 0 ? "" : lines.slice(-tailCount).join("\n");
70
+ return {
71
+ text: tail ? `${head}${TRUNCATION_MARKER}${tail}` : head,
72
+ truncated: true,
73
+ };
74
+ }
75
+ function truncateByChars(text, maxChars) {
76
+ if (text.length <= maxChars) {
77
+ return { text, truncated: false };
78
+ }
79
+ if (maxChars <= 0) {
80
+ return { text: "", truncated: true };
81
+ }
82
+ if (maxChars <= TRUNCATION_MARKER.length + 2) {
83
+ return { text: text.slice(0, maxChars), truncated: true };
84
+ }
85
+ const remaining = maxChars - TRUNCATION_MARKER.length;
86
+ const headCount = Math.ceil(remaining / 2);
87
+ const tailCount = Math.floor(remaining / 2);
88
+ return {
89
+ text: text.slice(0, headCount) +
90
+ TRUNCATION_MARKER +
91
+ text.slice(text.length - tailCount),
92
+ truncated: true,
93
+ };
94
+ }
95
+ function enforceLimits(content, maxChars, maxLines) {
96
+ const rendered = typeof content === "string" ? content : JSON.stringify(content, null, 2);
97
+ const lineLimited = truncateByLines(rendered, maxLines);
98
+ const charLimited = truncateByChars(lineLimited.text, maxChars);
99
+ const truncated = lineLimited.truncated || charLimited.truncated;
100
+ if (!truncated) {
101
+ return { content, truncated: false };
102
+ }
103
+ return { content: charLimited.text, truncated: true };
104
+ }
105
+ export class DefaultToolResultProcessor {
106
+ async process(request, signal) {
107
+ signal?.throwIfAborted();
108
+ const normalized = jsonSafe(request.raw.value);
109
+ const limited = enforceLimits(normalized, request.limits.maxChars, request.limits.maxLines);
110
+ return {
111
+ call: structuredClone(request.call),
112
+ content: limited.content,
113
+ isError: request.raw.isError ?? false,
114
+ truncated: limited.truncated,
115
+ durationMs: request.raw.durationMs ?? 0,
116
+ ...(request.raw.metadata === undefined
117
+ ? {}
118
+ : { metadata: structuredClone(request.raw.metadata) }),
119
+ };
120
+ }
121
+ }
122
+ //# sourceMappingURL=result-processor.js.map