@nervekit/agent 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 (263) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/dist/agent-loop.d.ts +2 -0
  4. package/dist/agent-loop.d.ts.map +1 -0
  5. package/dist/agent-loop.js +2 -0
  6. package/dist/agent-loop.js.map +1 -0
  7. package/dist/agent.d.ts +125 -0
  8. package/dist/agent.d.ts.map +1 -0
  9. package/dist/agent.js +427 -0
  10. package/dist/agent.js.map +1 -0
  11. package/dist/harness/agent-harness.d.ts +114 -0
  12. package/dist/harness/agent-harness.d.ts.map +1 -0
  13. package/dist/harness/agent-harness.js +474 -0
  14. package/dist/harness/agent-harness.js.map +1 -0
  15. package/dist/harness/compaction/branch-summarization.d.ts +54 -0
  16. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
  17. package/dist/harness/compaction/branch-summarization.js +183 -0
  18. package/dist/harness/compaction/branch-summarization.js.map +1 -0
  19. package/dist/harness/compaction/compaction.d.ts +19 -0
  20. package/dist/harness/compaction/compaction.d.ts.map +1 -0
  21. package/dist/harness/compaction/compaction.js +335 -0
  22. package/dist/harness/compaction/compaction.js.map +1 -0
  23. package/dist/harness/compaction/cut-points.d.ts +7 -0
  24. package/dist/harness/compaction/cut-points.d.ts.map +1 -0
  25. package/dist/harness/compaction/cut-points.js +106 -0
  26. package/dist/harness/compaction/cut-points.js.map +1 -0
  27. package/dist/harness/compaction/overflow.d.ts +3 -0
  28. package/dist/harness/compaction/overflow.d.ts.map +1 -0
  29. package/dist/harness/compaction/overflow.js +54 -0
  30. package/dist/harness/compaction/overflow.js.map +1 -0
  31. package/dist/harness/compaction/policy.d.ts +8 -0
  32. package/dist/harness/compaction/policy.d.ts.map +1 -0
  33. package/dist/harness/compaction/policy.js +57 -0
  34. package/dist/harness/compaction/policy.js.map +1 -0
  35. package/dist/harness/compaction/types.d.ts +79 -0
  36. package/dist/harness/compaction/types.d.ts.map +1 -0
  37. package/dist/harness/compaction/types.js +2 -0
  38. package/dist/harness/compaction/types.js.map +1 -0
  39. package/dist/harness/compaction/usage.d.ts +30 -0
  40. package/dist/harness/compaction/usage.d.ts.map +1 -0
  41. package/dist/harness/compaction/usage.js +177 -0
  42. package/dist/harness/compaction/usage.js.map +1 -0
  43. package/dist/harness/compaction/utils.d.ts +25 -0
  44. package/dist/harness/compaction/utils.d.ts.map +1 -0
  45. package/dist/harness/compaction/utils.js +131 -0
  46. package/dist/harness/compaction/utils.js.map +1 -0
  47. package/dist/harness/configuration.d.ts +34 -0
  48. package/dist/harness/configuration.d.ts.map +1 -0
  49. package/dist/harness/configuration.js +75 -0
  50. package/dist/harness/configuration.js.map +1 -0
  51. package/dist/harness/conversation/context.d.ts +24 -0
  52. package/dist/harness/conversation/context.d.ts.map +1 -0
  53. package/dist/harness/conversation/context.js +76 -0
  54. package/dist/harness/conversation/context.js.map +1 -0
  55. package/dist/harness/conversation/conversation.d.ts +36 -0
  56. package/dist/harness/conversation/conversation.d.ts.map +1 -0
  57. package/dist/harness/conversation/conversation.js +163 -0
  58. package/dist/harness/conversation/conversation.js.map +1 -0
  59. package/dist/harness/conversation/entries.d.ts +117 -0
  60. package/dist/harness/conversation/entries.d.ts.map +1 -0
  61. package/dist/harness/conversation/entries.js +2 -0
  62. package/dist/harness/conversation/entries.js.map +1 -0
  63. package/dist/harness/conversation/jsonl-repo.d.ts +27 -0
  64. package/dist/harness/conversation/jsonl-repo.d.ts.map +1 -0
  65. package/dist/harness/conversation/jsonl-repo.js +110 -0
  66. package/dist/harness/conversation/jsonl-repo.js.map +1 -0
  67. package/dist/harness/conversation/jsonl-storage.d.ts +34 -0
  68. package/dist/harness/conversation/jsonl-storage.d.ts.map +1 -0
  69. package/dist/harness/conversation/jsonl-storage.js +213 -0
  70. package/dist/harness/conversation/jsonl-storage.js.map +1 -0
  71. package/dist/harness/conversation/memory-repo.d.ts +18 -0
  72. package/dist/harness/conversation/memory-repo.d.ts.map +1 -0
  73. package/dist/harness/conversation/memory-repo.js +45 -0
  74. package/dist/harness/conversation/memory-repo.js.map +1 -0
  75. package/dist/harness/conversation/memory-storage.d.ts +25 -0
  76. package/dist/harness/conversation/memory-storage.d.ts.map +1 -0
  77. package/dist/harness/conversation/memory-storage.js +88 -0
  78. package/dist/harness/conversation/memory-storage.js.map +1 -0
  79. package/dist/harness/conversation/repo-utils.d.ts +13 -0
  80. package/dist/harness/conversation/repo-utils.d.ts.map +1 -0
  81. package/dist/harness/conversation/repo-utils.js +39 -0
  82. package/dist/harness/conversation/repo-utils.js.map +1 -0
  83. package/dist/harness/conversation/storage-utils.d.ts +11 -0
  84. package/dist/harness/conversation/storage-utils.d.ts.map +1 -0
  85. package/dist/harness/conversation/storage-utils.js +32 -0
  86. package/dist/harness/conversation/storage-utils.js.map +1 -0
  87. package/dist/harness/conversation/text-extraction.d.ts +8 -0
  88. package/dist/harness/conversation/text-extraction.d.ts.map +1 -0
  89. package/dist/harness/conversation/text-extraction.js +24 -0
  90. package/dist/harness/conversation/text-extraction.js.map +1 -0
  91. package/dist/harness/conversation/uuid.d.ts +2 -0
  92. package/dist/harness/conversation/uuid.d.ts.map +1 -0
  93. package/dist/harness/conversation/uuid.js +54 -0
  94. package/dist/harness/conversation/uuid.js.map +1 -0
  95. package/dist/harness/conversation-writes.d.ts +9 -0
  96. package/dist/harness/conversation-writes.d.ts.map +1 -0
  97. package/dist/harness/conversation-writes.js +54 -0
  98. package/dist/harness/conversation-writes.js.map +1 -0
  99. package/dist/harness/env/nodejs.d.ts +53 -0
  100. package/dist/harness/env/nodejs.d.ts.map +1 -0
  101. package/dist/harness/env/nodejs.js +497 -0
  102. package/dist/harness/env/nodejs.js.map +1 -0
  103. package/dist/harness/env/types.d.ts +106 -0
  104. package/dist/harness/env/types.d.ts.map +1 -0
  105. package/dist/harness/env/types.js +2 -0
  106. package/dist/harness/env/types.js.map +1 -0
  107. package/dist/harness/errors.d.ts +48 -0
  108. package/dist/harness/errors.d.ts.map +1 -0
  109. package/dist/harness/errors.js +63 -0
  110. package/dist/harness/errors.js.map +1 -0
  111. package/dist/harness/events.d.ts +238 -0
  112. package/dist/harness/events.d.ts.map +1 -0
  113. package/dist/harness/events.js +2 -0
  114. package/dist/harness/events.js.map +1 -0
  115. package/dist/harness/harness-configuration-methods.d.ts +36 -0
  116. package/dist/harness/harness-configuration-methods.d.ts.map +1 -0
  117. package/dist/harness/harness-configuration-methods.js +145 -0
  118. package/dist/harness/harness-configuration-methods.js.map +1 -0
  119. package/dist/harness/harness-continuation.d.ts +18 -0
  120. package/dist/harness/harness-continuation.d.ts.map +1 -0
  121. package/dist/harness/harness-continuation.js +56 -0
  122. package/dist/harness/harness-continuation.js.map +1 -0
  123. package/dist/harness/harness-events.d.ts +23 -0
  124. package/dist/harness/harness-events.d.ts.map +1 -0
  125. package/dist/harness/harness-events.js +129 -0
  126. package/dist/harness/harness-events.js.map +1 -0
  127. package/dist/harness/harness-invocations.d.ts +20 -0
  128. package/dist/harness/harness-invocations.d.ts.map +1 -0
  129. package/dist/harness/harness-invocations.js +22 -0
  130. package/dist/harness/harness-invocations.js.map +1 -0
  131. package/dist/harness/harness-maintenance.d.ts +30 -0
  132. package/dist/harness/harness-maintenance.d.ts.map +1 -0
  133. package/dist/harness/harness-maintenance.js +155 -0
  134. package/dist/harness/harness-maintenance.js.map +1 -0
  135. package/dist/harness/harness-queue-methods.d.ts +45 -0
  136. package/dist/harness/harness-queue-methods.d.ts.map +1 -0
  137. package/dist/harness/harness-queue-methods.js +51 -0
  138. package/dist/harness/harness-queue-methods.js.map +1 -0
  139. package/dist/harness/messages.d.ts +76 -0
  140. package/dist/harness/messages.d.ts.map +1 -0
  141. package/dist/harness/messages.js +147 -0
  142. package/dist/harness/messages.js.map +1 -0
  143. package/dist/harness/options.d.ts +95 -0
  144. package/dist/harness/options.d.ts.map +1 -0
  145. package/dist/harness/options.js +2 -0
  146. package/dist/harness/options.js.map +1 -0
  147. package/dist/harness/prompt-templates.d.ts +49 -0
  148. package/dist/harness/prompt-templates.d.ts.map +1 -0
  149. package/dist/harness/prompt-templates.js +230 -0
  150. package/dist/harness/prompt-templates.js.map +1 -0
  151. package/dist/harness/result.d.ts +19 -0
  152. package/dist/harness/result.d.ts.map +1 -0
  153. package/dist/harness/result.js +32 -0
  154. package/dist/harness/result.js.map +1 -0
  155. package/dist/harness/run/messages.d.ts +5 -0
  156. package/dist/harness/run/messages.d.ts.map +1 -0
  157. package/dist/harness/run/messages.js +37 -0
  158. package/dist/harness/run/messages.js.map +1 -0
  159. package/dist/harness/skills/format.d.ts +6 -0
  160. package/dist/harness/skills/format.d.ts.map +1 -0
  161. package/dist/harness/skills/format.js +38 -0
  162. package/dist/harness/skills/format.js.map +1 -0
  163. package/dist/harness/skills/index.d.ts +5 -0
  164. package/dist/harness/skills/index.d.ts.map +1 -0
  165. package/dist/harness/skills/index.js +5 -0
  166. package/dist/harness/skills/index.js.map +1 -0
  167. package/dist/harness/skills/loader.d.ts +43 -0
  168. package/dist/harness/skills/loader.d.ts.map +1 -0
  169. package/dist/harness/skills/loader.js +279 -0
  170. package/dist/harness/skills/loader.js.map +1 -0
  171. package/dist/harness/skills/parser.d.ts +12 -0
  172. package/dist/harness/skills/parser.d.ts.map +1 -0
  173. package/dist/harness/skills/parser.js +22 -0
  174. package/dist/harness/skills/parser.js.map +1 -0
  175. package/dist/harness/skills/validation.d.ts +3 -0
  176. package/dist/harness/skills/validation.d.ts.map +1 -0
  177. package/dist/harness/skills/validation.js +28 -0
  178. package/dist/harness/skills/validation.js.map +1 -0
  179. package/dist/harness/skills.d.ts +2 -0
  180. package/dist/harness/skills.d.ts.map +1 -0
  181. package/dist/harness/skills.js +2 -0
  182. package/dist/harness/skills.js.map +1 -0
  183. package/dist/harness/stream-options.d.ts +5 -0
  184. package/dist/harness/stream-options.d.ts.map +1 -0
  185. package/dist/harness/stream-options.js +67 -0
  186. package/dist/harness/stream-options.js.map +1 -0
  187. package/dist/harness/system-prompt.d.ts +2 -0
  188. package/dist/harness/system-prompt.d.ts.map +1 -0
  189. package/dist/harness/system-prompt.js +2 -0
  190. package/dist/harness/system-prompt.js.map +1 -0
  191. package/dist/harness/turn-state.d.ts +27 -0
  192. package/dist/harness/turn-state.d.ts.map +1 -0
  193. package/dist/harness/turn-state.js +35 -0
  194. package/dist/harness/turn-state.js.map +1 -0
  195. package/dist/harness/types.d.ts +9 -0
  196. package/dist/harness/types.d.ts.map +1 -0
  197. package/dist/harness/types.js +8 -0
  198. package/dist/harness/types.js.map +1 -0
  199. package/dist/harness/utils/env-path.d.ts +14 -0
  200. package/dist/harness/utils/env-path.d.ts.map +1 -0
  201. package/dist/harness/utils/env-path.js +99 -0
  202. package/dist/harness/utils/env-path.js.map +1 -0
  203. package/dist/harness/utils/shell-output.d.ts +16 -0
  204. package/dist/harness/utils/shell-output.d.ts.map +1 -0
  205. package/dist/harness/utils/shell-output.js +137 -0
  206. package/dist/harness/utils/shell-output.js.map +1 -0
  207. package/dist/harness/utils/truncate.d.ts +70 -0
  208. package/dist/harness/utils/truncate.d.ts.map +1 -0
  209. package/dist/harness/utils/truncate.js +289 -0
  210. package/dist/harness/utils/truncate.js.map +1 -0
  211. package/dist/index.d.ts +24 -0
  212. package/dist/index.d.ts.map +1 -0
  213. package/dist/index.js +25 -0
  214. package/dist/index.js.map +1 -0
  215. package/dist/node.d.ts +3 -0
  216. package/dist/node.d.ts.map +1 -0
  217. package/dist/node.js +3 -0
  218. package/dist/node.js.map +1 -0
  219. package/dist/proxy.d.ts +67 -0
  220. package/dist/proxy.d.ts.map +1 -0
  221. package/dist/proxy.js +299 -0
  222. package/dist/proxy.js.map +1 -0
  223. package/dist/runtime/loop/agent-loop.d.ts +24 -0
  224. package/dist/runtime/loop/agent-loop.d.ts.map +1 -0
  225. package/dist/runtime/loop/agent-loop.js +72 -0
  226. package/dist/runtime/loop/agent-loop.js.map +1 -0
  227. package/dist/runtime/loop/events.d.ts +5 -0
  228. package/dist/runtime/loop/events.d.ts.map +1 -0
  229. package/dist/runtime/loop/events.js +5 -0
  230. package/dist/runtime/loop/events.js.map +1 -0
  231. package/dist/runtime/loop/index.d.ts +6 -0
  232. package/dist/runtime/loop/index.d.ts.map +1 -0
  233. package/dist/runtime/loop/index.js +6 -0
  234. package/dist/runtime/loop/index.js.map +1 -0
  235. package/dist/runtime/loop/stream-assistant.d.ts +9 -0
  236. package/dist/runtime/loop/stream-assistant.d.ts.map +1 -0
  237. package/dist/runtime/loop/stream-assistant.js +87 -0
  238. package/dist/runtime/loop/stream-assistant.js.map +1 -0
  239. package/dist/runtime/loop/tool-execution.d.ts +15 -0
  240. package/dist/runtime/loop/tool-execution.d.ts.map +1 -0
  241. package/dist/runtime/loop/tool-execution.js +271 -0
  242. package/dist/runtime/loop/tool-execution.js.map +1 -0
  243. package/dist/runtime/loop/turn-loop.d.ts +7 -0
  244. package/dist/runtime/loop/turn-loop.d.ts.map +1 -0
  245. package/dist/runtime/loop/turn-loop.js +84 -0
  246. package/dist/runtime/loop/turn-loop.js.map +1 -0
  247. package/dist/runtime.d.ts +63 -0
  248. package/dist/runtime.d.ts.map +1 -0
  249. package/dist/runtime.js +170 -0
  250. package/dist/runtime.js.map +1 -0
  251. package/dist/suspension.d.ts +18 -0
  252. package/dist/suspension.d.ts.map +1 -0
  253. package/dist/suspension.js +19 -0
  254. package/dist/suspension.js.map +1 -0
  255. package/dist/types.d.ts +395 -0
  256. package/dist/types.d.ts.map +1 -0
  257. package/dist/types.js +2 -0
  258. package/dist/types.js.map +1 -0
  259. package/dist/worker.d.ts +2 -0
  260. package/dist/worker.d.ts.map +1 -0
  261. package/dist/worker.js +88 -0
  262. package/dist/worker.js.map +1 -0
  263. package/package.json +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/harness/skills.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { AgentHarnessStreamOptions, AgentHarnessStreamOptionsPatch } from "./options.js";
2
+ export declare function cloneStreamOptions(streamOptions?: AgentHarnessStreamOptions): AgentHarnessStreamOptions;
3
+ export declare function mergeHeaders(...headers: Array<Record<string, string> | undefined>): Record<string, string> | undefined;
4
+ export declare function applyStreamOptionsPatch(base: AgentHarnessStreamOptions, patch?: AgentHarnessStreamOptionsPatch): AgentHarnessStreamOptions;
5
+ //# sourceMappingURL=stream-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-options.d.ts","sourceRoot":"","sources":["../../src/harness/stream-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,8BAA8B,EAC/B,MAAM,cAAc,CAAC;AAEtB,wBAAgB,kBAAkB,CAChC,aAAa,CAAC,EAAE,yBAAyB,GACxC,yBAAyB,CAQ3B;AAED,wBAAgB,YAAY,CAC1B,GAAG,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,GACpD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CASpC;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,yBAAyB,EAC/B,KAAK,CAAC,EAAE,8BAA8B,GACrC,yBAAyB,CAuC3B"}
@@ -0,0 +1,67 @@
1
+ export function cloneStreamOptions(streamOptions) {
2
+ return {
3
+ ...streamOptions,
4
+ headers: streamOptions?.headers ? { ...streamOptions.headers } : undefined,
5
+ metadata: streamOptions?.metadata
6
+ ? { ...streamOptions.metadata }
7
+ : undefined,
8
+ };
9
+ }
10
+ export function mergeHeaders(...headers) {
11
+ const merged = {};
12
+ let hasHeaders = false;
13
+ for (const entry of headers) {
14
+ if (!entry)
15
+ continue;
16
+ Object.assign(merged, entry);
17
+ hasHeaders = true;
18
+ }
19
+ return hasHeaders ? merged : undefined;
20
+ }
21
+ export function applyStreamOptionsPatch(base, patch) {
22
+ const result = cloneStreamOptions(base);
23
+ if (!patch)
24
+ return result;
25
+ if (Object.hasOwn(patch, "transport"))
26
+ result.transport = patch.transport;
27
+ if (Object.hasOwn(patch, "timeoutMs"))
28
+ result.timeoutMs = patch.timeoutMs;
29
+ if (Object.hasOwn(patch, "maxRetries"))
30
+ result.maxRetries = patch.maxRetries;
31
+ if (Object.hasOwn(patch, "maxRetryDelayMs"))
32
+ result.maxRetryDelayMs = patch.maxRetryDelayMs;
33
+ if (Object.hasOwn(patch, "cacheRetention"))
34
+ result.cacheRetention = patch.cacheRetention;
35
+ if (Object.hasOwn(patch, "headers")) {
36
+ if (patch.headers === undefined) {
37
+ result.headers = undefined;
38
+ }
39
+ else {
40
+ const headers = { ...(result.headers ?? {}) };
41
+ for (const [key, value] of Object.entries(patch.headers)) {
42
+ if (value === undefined)
43
+ delete headers[key];
44
+ else
45
+ headers[key] = value;
46
+ }
47
+ result.headers = Object.keys(headers).length > 0 ? headers : undefined;
48
+ }
49
+ }
50
+ if (Object.hasOwn(patch, "metadata")) {
51
+ if (patch.metadata === undefined) {
52
+ result.metadata = undefined;
53
+ }
54
+ else {
55
+ const metadata = { ...(result.metadata ?? {}) };
56
+ for (const [key, value] of Object.entries(patch.metadata)) {
57
+ if (value === undefined)
58
+ delete metadata[key];
59
+ else
60
+ metadata[key] = value;
61
+ }
62
+ result.metadata = Object.keys(metadata).length > 0 ? metadata : undefined;
63
+ }
64
+ }
65
+ return result;
66
+ }
67
+ //# sourceMappingURL=stream-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-options.js","sourceRoot":"","sources":["../../src/harness/stream-options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { formatSkillsForSystemPrompt } from "./skills/format.js";
2
+ //# sourceMappingURL=system-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/harness/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { formatSkillsForSystemPrompt } from "./skills/format.js";
2
+ //# sourceMappingURL=system-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/harness/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { AgentMessage, AgentTool, AnyModel, ThinkingLevel } from "../types.js";
2
+ import type { Conversation } from "./conversation/conversation.js";
3
+ import type { ExecutionEnv } from "./env/types.js";
4
+ import type { AgentHarnessOptions, AgentHarnessResources, AgentHarnessStreamOptions, PromptTemplate, Skill } from "./options.js";
5
+ export interface AgentHarnessTurnState<TSkill extends Skill = Skill, TPromptTemplate extends PromptTemplate = PromptTemplate, TTool extends AgentTool = AgentTool> {
6
+ messages: AgentMessage[];
7
+ resources: AgentHarnessResources<TSkill, TPromptTemplate>;
8
+ streamOptions: AgentHarnessStreamOptions;
9
+ conversationId: string;
10
+ systemPrompt: string;
11
+ model: AnyModel;
12
+ thinkingLevel: ThinkingLevel;
13
+ tools: TTool[];
14
+ activeTools: TTool[];
15
+ }
16
+ export declare function createTurnState<TSkill extends Skill = Skill, TPromptTemplate extends PromptTemplate = PromptTemplate, TTool extends AgentTool = AgentTool>(options: {
17
+ env: ExecutionEnv;
18
+ conversation: Conversation;
19
+ resources: AgentHarnessResources<TSkill, TPromptTemplate>;
20
+ streamOptions: AgentHarnessStreamOptions;
21
+ systemPrompt: AgentHarnessOptions<TSkill, TPromptTemplate, TTool>["systemPrompt"];
22
+ model: AnyModel;
23
+ thinkingLevel: ThinkingLevel;
24
+ tools: Map<string, TTool>;
25
+ activeToolNames: string[];
26
+ }): Promise<AgentHarnessTurnState<TSkill, TPromptTemplate, TTool>>;
27
+ //# sourceMappingURL=turn-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-state.d.ts","sourceRoot":"","sources":["../../src/harness/turn-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,aAAa,EACd,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,cAAc,EACd,KAAK,EACN,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,qBAAqB,CACpC,MAAM,SAAS,KAAK,GAAG,KAAK,EAC5B,eAAe,SAAS,cAAc,GAAG,cAAc,EACvD,KAAK,SAAS,SAAS,GAAG,SAAS;IAEnC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,EAAE,qBAAqB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC1D,aAAa,EAAE,yBAAyB,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,QAAQ,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,WAAW,EAAE,KAAK,EAAE,CAAC;CACtB;AAED,wBAAsB,eAAe,CACnC,MAAM,SAAS,KAAK,GAAG,KAAK,EAC5B,eAAe,SAAS,cAAc,GAAG,cAAc,EACvD,KAAK,SAAS,SAAS,GAAG,SAAS,EACnC,OAAO,EAAE;IACT,GAAG,EAAE,YAAY,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,qBAAqB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC1D,aAAa,EAAE,yBAAyB,CAAC;IACzC,YAAY,EAAE,mBAAmB,CAC/B,MAAM,EACN,eAAe,EACf,KAAK,CACN,CAAC,cAAc,CAAC,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,GAAG,OAAO,CAAC,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,CA+BjE"}
@@ -0,0 +1,35 @@
1
+ import { cloneStreamOptions } from "./stream-options.js";
2
+ export async function createTurnState(options) {
3
+ const context = await options.conversation.buildContext();
4
+ const conversationMetadata = await options.conversation.getMetadata();
5
+ const tools = [...options.tools.values()];
6
+ const activeTools = options.activeToolNames
7
+ .map((name) => options.tools.get(name))
8
+ .filter((tool) => tool !== undefined);
9
+ let systemPrompt = "You are a helpful assistant.";
10
+ if (typeof options.systemPrompt === "string") {
11
+ systemPrompt = options.systemPrompt;
12
+ }
13
+ else if (options.systemPrompt) {
14
+ systemPrompt = await options.systemPrompt({
15
+ env: options.env,
16
+ conversation: options.conversation,
17
+ model: options.model,
18
+ thinkingLevel: options.thinkingLevel,
19
+ activeTools,
20
+ resources: options.resources,
21
+ });
22
+ }
23
+ return {
24
+ messages: context.messages,
25
+ resources: options.resources,
26
+ streamOptions: cloneStreamOptions(options.streamOptions),
27
+ conversationId: conversationMetadata.id,
28
+ systemPrompt,
29
+ model: options.model,
30
+ thinkingLevel: options.thinkingLevel,
31
+ tools,
32
+ activeTools,
33
+ };
34
+ }
35
+ //# sourceMappingURL=turn-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-state.js","sourceRoot":"","sources":["../../src/harness/turn-state.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAkBzD,MAAM,CAAC,KAAK,UAAU,eAAe,CAInC,OAcD;IACC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;IAC1D,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;IACtE,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACtC,MAAM,CAAC,CAAC,IAAI,EAAiB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACvD,IAAI,YAAY,GAAG,8BAA8B,CAAC;IAClD,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC7C,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IACtC,CAAC;SAAM,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QAChC,YAAY,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;YACxC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,WAAW;YACX,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC;QACxD,cAAc,EAAE,oBAAoB,CAAC,EAAE;QACvC,YAAY;QACZ,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,KAAK;QACL,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type { AgentHarness } from "./agent-harness.js";
2
+ export * from "./conversation/context.js";
3
+ export * from "./conversation/entries.js";
4
+ export * from "./env/types.js";
5
+ export * from "./errors.js";
6
+ export * from "./events.js";
7
+ export * from "./options.js";
8
+ export * from "./result.js";
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./conversation/context.js";
2
+ export * from "./conversation/entries.js";
3
+ export * from "./env/types.js";
4
+ export * from "./errors.js";
5
+ export * from "./events.js";
6
+ export * from "./options.js";
7
+ export * from "./result.js";
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"AACA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,14 @@
1
+ /** Join environment paths while preserving Windows-style separators when the base path uses them. */
2
+ export declare function joinEnvPath(base: string, child: string): string;
3
+ /** Return the parent directory for either POSIX or Windows-style environment paths. */
4
+ export declare function dirnameEnvPath(path: string): string;
5
+ /** Return the final path segment for either POSIX or Windows-style environment paths. */
6
+ export declare function basenameEnvPath(path: string): string;
7
+ /**
8
+ * Return a POSIX-style path relative to root for ignore matching.
9
+ *
10
+ * The ignore package requires relative, slash-separated paths. Execution environments may return native Windows paths,
11
+ * so comparisons are performed on normalized separators before the relative path is produced.
12
+ */
13
+ export declare function relativeEnvPath(root: string, path: string): string;
14
+ //# sourceMappingURL=env-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-path.d.ts","sourceRoot":"","sources":["../../../src/harness/utils/env-path.ts"],"names":[],"mappings":"AAiDA,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/D;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBlE"}
@@ -0,0 +1,99 @@
1
+ const WINDOWS_DRIVE_PATH_RE = /^[A-Za-z]:[\\/]/;
2
+ function preferredSeparator(path) {
3
+ return path.includes("\\") && !path.includes("/") ? "\\" : "/";
4
+ }
5
+ function isAsciiLetter(char) {
6
+ if (!char)
7
+ return false;
8
+ const code = char.charCodeAt(0);
9
+ return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
10
+ }
11
+ function isPathSeparator(char) {
12
+ return char === "/" || char === "\\";
13
+ }
14
+ function isWindowsDriveRootPath(path) {
15
+ if (path.length < 3 || !isAsciiLetter(path[0]) || path[1] !== ":") {
16
+ return false;
17
+ }
18
+ for (let index = 2; index < path.length; index += 1) {
19
+ if (!isPathSeparator(path[index]))
20
+ return false;
21
+ }
22
+ return true;
23
+ }
24
+ function stripTrailingSeparators(path) {
25
+ if (isWindowsDriveRootPath(path))
26
+ return path.slice(0, 3);
27
+ let end = path.length;
28
+ while (end > 0 && isPathSeparator(path[end - 1]))
29
+ end -= 1;
30
+ return end === 0 ? path : path.slice(0, end);
31
+ }
32
+ function toPosixPath(path) {
33
+ const normalized = path.replace(/\\/g, "/");
34
+ if (isWindowsDriveRootPath(normalized))
35
+ return normalized.slice(0, 3);
36
+ let end = normalized.length;
37
+ while (end > 0 && normalized[end - 1] === "/")
38
+ end -= 1;
39
+ return end === 0 ? normalized : normalized.slice(0, end);
40
+ }
41
+ function isWindowsDrivePath(path) {
42
+ return WINDOWS_DRIVE_PATH_RE.test(path) || /^[A-Za-z]:\//u.test(path);
43
+ }
44
+ function makeRelativeIgnorePath(path) {
45
+ return path.replace(/^[A-Za-z]:\/?/u, "").replace(/^\/+/, "");
46
+ }
47
+ /** Join environment paths while preserving Windows-style separators when the base path uses them. */
48
+ export function joinEnvPath(base, child) {
49
+ const separator = preferredSeparator(base);
50
+ const normalizedBase = stripTrailingSeparators(base);
51
+ const normalizedChild = child.replace(/^[\\/]+/, "");
52
+ if (!normalizedBase)
53
+ return normalizedChild;
54
+ const separatorPrefix = /[\\/]$/.test(normalizedBase) ? "" : separator;
55
+ return `${normalizedBase}${separatorPrefix}${normalizedChild}`;
56
+ }
57
+ /** Return the parent directory for either POSIX or Windows-style environment paths. */
58
+ export function dirnameEnvPath(path) {
59
+ const normalized = stripTrailingSeparators(path);
60
+ const slashIndex = Math.max(normalized.lastIndexOf("/"), normalized.lastIndexOf("\\"));
61
+ if (slashIndex === -1)
62
+ return ".";
63
+ if (slashIndex === 0)
64
+ return normalized.slice(0, 1);
65
+ if (slashIndex === 2 && WINDOWS_DRIVE_PATH_RE.test(normalized)) {
66
+ return normalized.slice(0, 3);
67
+ }
68
+ return normalized.slice(0, slashIndex);
69
+ }
70
+ /** Return the final path segment for either POSIX or Windows-style environment paths. */
71
+ export function basenameEnvPath(path) {
72
+ const normalized = stripTrailingSeparators(path);
73
+ const slashIndex = Math.max(normalized.lastIndexOf("/"), normalized.lastIndexOf("\\"));
74
+ return slashIndex === -1 ? normalized : normalized.slice(slashIndex + 1);
75
+ }
76
+ /**
77
+ * Return a POSIX-style path relative to root for ignore matching.
78
+ *
79
+ * The ignore package requires relative, slash-separated paths. Execution environments may return native Windows paths,
80
+ * so comparisons are performed on normalized separators before the relative path is produced.
81
+ */
82
+ export function relativeEnvPath(root, path) {
83
+ const normalizedRoot = toPosixPath(root);
84
+ const normalizedPath = toPosixPath(path);
85
+ const windowsComparison = isWindowsDrivePath(normalizedRoot) || isWindowsDrivePath(normalizedPath);
86
+ const compareRoot = windowsComparison
87
+ ? normalizedRoot.toLowerCase()
88
+ : normalizedRoot;
89
+ const comparePath = windowsComparison
90
+ ? normalizedPath.toLowerCase()
91
+ : normalizedPath;
92
+ if (comparePath === compareRoot)
93
+ return "";
94
+ if (comparePath.startsWith(`${compareRoot}/`)) {
95
+ return normalizedPath.slice(normalizedRoot.length + 1);
96
+ }
97
+ return makeRelativeIgnorePath(normalizedPath);
98
+ }
99
+ //# sourceMappingURL=env-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-path.js","sourceRoot":"","sources":["../../../src/harness/utils/env-path.ts"],"names":[],"mappings":"AAAA,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEhD,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACjE,CAAC;AAED,SAAS,aAAa,CAAC,IAAwB;IAC7C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,eAAe,CAAC,IAAwB;IAC/C,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC;AACvC,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,IAAI,sBAAsB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,OAAO,GAAG,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAAE,GAAG,IAAI,CAAC,CAAC;IAC3D,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,sBAAsB,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,IAAI,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;IAC5B,OAAO,GAAG,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG;QAAE,GAAG,IAAI,CAAC,CAAC;IACxD,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAa;IACrD,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACrD,IAAI,CAAC,cAAc;QAAE,OAAO,eAAe,CAAC;IAC5C,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,OAAO,GAAG,cAAc,GAAG,eAAe,GAAG,eAAe,EAAE,CAAC;AACjE,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAC3B,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAC7B,CAAC;IACF,IAAI,UAAU,KAAK,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IAClC,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,IAAI,UAAU,KAAK,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAC3B,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAC7B,CAAC;IACF,OAAO,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAY;IACxD,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,iBAAiB,GACrB,kBAAkB,CAAC,cAAc,CAAC,IAAI,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,iBAAiB;QACnC,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE;QAC9B,CAAC,CAAC,cAAc,CAAC;IACnB,MAAM,WAAW,GAAG,iBAAiB;QACnC,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE;QAC9B,CAAC,CAAC,cAAc,CAAC;IAEnB,IAAI,WAAW,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC3C,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,sBAAsB,CAAC,cAAc,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ExecutionEnv, ExecutionEnvExecOptions } from "../env/types.js";
2
+ import { ExecutionError } from "../errors.js";
3
+ import { type Result } from "../result.js";
4
+ export interface ShellCaptureOptions extends Omit<ExecutionEnvExecOptions, "onStdout" | "onStderr"> {
5
+ onChunk?: (chunk: string) => void;
6
+ }
7
+ export interface ShellCaptureResult {
8
+ output: string;
9
+ exitCode: number | undefined;
10
+ cancelled: boolean;
11
+ truncated: boolean;
12
+ fullOutputPath?: string;
13
+ }
14
+ export declare function sanitizeBinaryOutput(str: string): string;
15
+ export declare function executeShellWithCapture(env: ExecutionEnv, command: string, options?: ShellCaptureOptions): Promise<Result<ShellCaptureResult, ExecutionError>>;
16
+ //# sourceMappingURL=shell-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-output.d.ts","sourceRoot":"","sources":["../../../src/harness/utils/shell-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAW,KAAK,MAAM,EAAW,MAAM,cAAc,CAAC;AAG7D,MAAM,WAAW,mBACf,SAAQ,IAAI,CAAC,uBAAuB,EAAE,UAAU,GAAG,UAAU,CAAC;IAC9D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAmHrD"}
@@ -0,0 +1,137 @@
1
+ import { ExecutionError } from "../errors.js";
2
+ import { err, ok, toError } from "../result.js";
3
+ import { DEFAULT_MAX_BYTES, truncateTail } from "./truncate.js";
4
+ function toExecutionError(error) {
5
+ if (error instanceof ExecutionError)
6
+ return error;
7
+ const cause = toError(error);
8
+ return new ExecutionError("unknown", cause.message, cause);
9
+ }
10
+ export function sanitizeBinaryOutput(str) {
11
+ return Array.from(str)
12
+ .filter((char) => {
13
+ const code = char.codePointAt(0);
14
+ if (code === undefined)
15
+ return false;
16
+ if (code === 0x09 || code === 0x0a || code === 0x0d)
17
+ return true;
18
+ if (code <= 0x1f)
19
+ return false;
20
+ if (code >= 0xfff9 && code <= 0xfffb)
21
+ return false;
22
+ return true;
23
+ })
24
+ .join("");
25
+ }
26
+ export async function executeShellWithCapture(env, command, options) {
27
+ const outputChunks = [];
28
+ let outputBytes = 0;
29
+ const maxOutputBytes = DEFAULT_MAX_BYTES * 2;
30
+ const encoder = new TextEncoder();
31
+ let totalBytes = 0;
32
+ let fullOutputPath;
33
+ let writeChain = Promise.resolve(ok(undefined));
34
+ let captureError;
35
+ const appendFullOutput = (text) => {
36
+ if (!fullOutputPath || captureError)
37
+ return;
38
+ const path = fullOutputPath;
39
+ writeChain = writeChain.then(async (previous) => {
40
+ if (!previous.ok)
41
+ return previous;
42
+ const appendResult = await env.appendFile(path, text, options?.abortSignal);
43
+ return appendResult.ok
44
+ ? ok(undefined)
45
+ : err(toExecutionError(appendResult.error));
46
+ });
47
+ };
48
+ const ensureFullOutputFile = (initialContent) => {
49
+ if (fullOutputPath || captureError)
50
+ return;
51
+ writeChain = writeChain.then(async (previous) => {
52
+ if (!previous.ok)
53
+ return previous;
54
+ const tempFile = await env.createTempFile({
55
+ prefix: "bash-",
56
+ suffix: ".log",
57
+ abortSignal: options?.abortSignal,
58
+ });
59
+ if (!tempFile.ok)
60
+ return err(toExecutionError(tempFile.error));
61
+ fullOutputPath = tempFile.value;
62
+ const appendResult = await env.appendFile(tempFile.value, initialContent, options?.abortSignal);
63
+ return appendResult.ok
64
+ ? ok(undefined)
65
+ : err(toExecutionError(appendResult.error));
66
+ });
67
+ };
68
+ const onChunk = (chunk) => {
69
+ try {
70
+ totalBytes += encoder.encode(chunk).byteLength;
71
+ const text = sanitizeBinaryOutput(chunk).replace(/\r/g, "");
72
+ if (totalBytes > DEFAULT_MAX_BYTES && !fullOutputPath) {
73
+ ensureFullOutputFile(outputChunks.join("") + text);
74
+ }
75
+ else {
76
+ appendFullOutput(text);
77
+ }
78
+ outputChunks.push(text);
79
+ outputBytes += text.length;
80
+ while (outputBytes > maxOutputBytes && outputChunks.length > 1) {
81
+ const removed = outputChunks.shift();
82
+ if (removed === undefined)
83
+ break;
84
+ outputBytes -= removed.length;
85
+ }
86
+ options?.onChunk?.(text);
87
+ }
88
+ catch (error) {
89
+ captureError = toExecutionError(error);
90
+ }
91
+ };
92
+ try {
93
+ const result = await env.exec(command, {
94
+ ...(options ?? {}),
95
+ onStdout: onChunk,
96
+ onStderr: onChunk,
97
+ });
98
+ const tailOutput = outputChunks.join("");
99
+ const truncationResult = truncateTail(tailOutput);
100
+ if (truncationResult.truncated && !fullOutputPath) {
101
+ ensureFullOutputFile(tailOutput);
102
+ }
103
+ const writeResult = await writeChain;
104
+ if (!writeResult.ok)
105
+ return err(writeResult.error);
106
+ if (captureError)
107
+ return err(captureError);
108
+ if (!result.ok) {
109
+ if (result.error.code === "aborted" || options?.abortSignal?.aborted) {
110
+ return ok({
111
+ output: truncationResult.truncated
112
+ ? truncationResult.content
113
+ : tailOutput,
114
+ exitCode: undefined,
115
+ cancelled: true,
116
+ truncated: truncationResult.truncated,
117
+ fullOutputPath,
118
+ });
119
+ }
120
+ return err(result.error);
121
+ }
122
+ const cancelled = options?.abortSignal?.aborted ?? false;
123
+ return ok({
124
+ output: truncationResult.truncated
125
+ ? truncationResult.content
126
+ : tailOutput,
127
+ exitCode: cancelled ? undefined : result.value.exitCode,
128
+ cancelled,
129
+ truncated: truncationResult.truncated,
130
+ fullOutputPath,
131
+ });
132
+ }
133
+ catch (error) {
134
+ return err(toExecutionError(error));
135
+ }
136
+ }
137
+ //# sourceMappingURL=shell-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-output.js","sourceRoot":"","sources":["../../../src/harness/utils/shell-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Shared truncation utilities for tool outputs.
3
+ *
4
+ * Truncation is based on two independent limits - whichever is hit first wins:
5
+ * - Line limit (default: 2000 lines)
6
+ * - Byte limit (default: 50KB)
7
+ *
8
+ * Never returns partial lines (except bash tail truncation edge case).
9
+ */
10
+ export declare const DEFAULT_MAX_LINES = 2000;
11
+ export declare const DEFAULT_MAX_BYTES: number;
12
+ export declare const GREP_MAX_LINE_LENGTH = 500;
13
+ export interface TruncationResult {
14
+ /** The truncated content */
15
+ content: string;
16
+ /** Whether truncation occurred */
17
+ truncated: boolean;
18
+ /** Which limit was hit: "lines", "bytes", or null if not truncated */
19
+ truncatedBy: "lines" | "bytes" | null;
20
+ /** Total number of lines in the original content */
21
+ totalLines: number;
22
+ /** Total number of bytes in the original content */
23
+ totalBytes: number;
24
+ /** Number of complete lines in the truncated output */
25
+ outputLines: number;
26
+ /** Number of bytes in the truncated output */
27
+ outputBytes: number;
28
+ /** Whether the last line was partially truncated (only for tail truncation edge case) */
29
+ lastLinePartial: boolean;
30
+ /** Whether the first line exceeded the byte limit (for head truncation) */
31
+ firstLineExceedsLimit: boolean;
32
+ /** The max lines limit that was applied */
33
+ maxLines: number;
34
+ /** The max bytes limit that was applied */
35
+ maxBytes: number;
36
+ }
37
+ export interface TruncationOptions {
38
+ /** Maximum number of lines (default: 2000) */
39
+ maxLines?: number;
40
+ /** Maximum number of bytes (default: 50KB) */
41
+ maxBytes?: number;
42
+ }
43
+ /**
44
+ * Format bytes as human-readable size.
45
+ */
46
+ export declare function formatSize(bytes: number): string;
47
+ /**
48
+ * Truncate content from the head (keep first N lines/bytes).
49
+ * Suitable for file reads where you want to see the beginning.
50
+ *
51
+ * Never returns partial lines. If first line exceeds byte limit,
52
+ * returns empty content with firstLineExceedsLimit=true.
53
+ */
54
+ export declare function truncateHead(content: string, options?: TruncationOptions): TruncationResult;
55
+ /**
56
+ * Truncate content from the tail (keep last N lines/bytes).
57
+ * Suitable for bash output where you want to see the end (errors, final results).
58
+ *
59
+ * May return partial first line if the last line of original content exceeds byte limit.
60
+ */
61
+ export declare function truncateTail(content: string, options?: TruncationOptions): TruncationResult;
62
+ /**
63
+ * Truncate a single line to max characters, adding [truncated] suffix.
64
+ * Used for grep match lines.
65
+ */
66
+ export declare function truncateLine(line: string, maxChars?: number): {
67
+ text: string;
68
+ wasTruncated: boolean;
69
+ };
70
+ //# sourceMappingURL=truncate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../../src/harness/utils/truncate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAC3C,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,sEAAsE;IACtE,WAAW,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;IACtC,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,yFAAyF;IACzF,eAAe,EAAE,OAAO,CAAC;IACzB,2EAA2E;IAC3E,qBAAqB,EAAE,OAAO,CAAC;IAC/B,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAwDD;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CAkFlB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CA+ElB;AA2CD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAA6B,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAQzC"}