@oni.bot/core 1.0.2 → 1.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 (293) hide show
  1. package/CHANGELOG.md +146 -146
  2. package/dist/agents/define-agent.d.ts.map +1 -1
  3. package/dist/agents/define-agent.js +7 -2
  4. package/dist/agents/define-agent.js.map +1 -1
  5. package/dist/checkpoint.d.ts.map +1 -1
  6. package/dist/checkpoint.js +7 -2
  7. package/dist/checkpoint.js.map +1 -1
  8. package/dist/checkpointers/postgres.d.ts.map +1 -1
  9. package/dist/checkpointers/postgres.js +45 -28
  10. package/dist/checkpointers/postgres.js.map +1 -1
  11. package/dist/circuit-breaker.d.ts +1 -0
  12. package/dist/circuit-breaker.d.ts.map +1 -1
  13. package/dist/circuit-breaker.js +13 -0
  14. package/dist/circuit-breaker.js.map +1 -1
  15. package/dist/cli/dev.d.ts.map +1 -1
  16. package/dist/cli/dev.js +0 -1
  17. package/dist/cli/dev.js.map +1 -1
  18. package/dist/cli/inspect.d.ts.map +1 -1
  19. package/dist/cli/inspect.js +4 -2
  20. package/dist/cli/inspect.js.map +1 -1
  21. package/dist/cli/run.d.ts.map +1 -1
  22. package/dist/cli/run.js +0 -1
  23. package/dist/cli/run.js.map +1 -1
  24. package/dist/config/loader.d.ts +1 -1
  25. package/dist/config/loader.js +12 -4
  26. package/dist/config/loader.js.map +1 -1
  27. package/dist/coordination/pubsub.d.ts +1 -0
  28. package/dist/coordination/pubsub.d.ts.map +1 -1
  29. package/dist/coordination/pubsub.js +31 -16
  30. package/dist/coordination/pubsub.js.map +1 -1
  31. package/dist/coordination/request-reply.d.ts +17 -2
  32. package/dist/coordination/request-reply.d.ts.map +1 -1
  33. package/dist/coordination/request-reply.js +56 -14
  34. package/dist/coordination/request-reply.js.map +1 -1
  35. package/dist/events/bus.d.ts +1 -0
  36. package/dist/events/bus.d.ts.map +1 -1
  37. package/dist/events/bus.js +17 -10
  38. package/dist/events/bus.js.map +1 -1
  39. package/dist/functional.d.ts.map +1 -1
  40. package/dist/functional.js +3 -0
  41. package/dist/functional.js.map +1 -1
  42. package/dist/graph.d.ts +11 -1
  43. package/dist/graph.d.ts.map +1 -1
  44. package/dist/graph.js +9 -4
  45. package/dist/graph.js.map +1 -1
  46. package/dist/guardrails/audit.d.ts +4 -1
  47. package/dist/guardrails/audit.d.ts.map +1 -1
  48. package/dist/guardrails/audit.js +18 -1
  49. package/dist/guardrails/audit.js.map +1 -1
  50. package/dist/harness/agent-loop.d.ts +1 -7
  51. package/dist/harness/agent-loop.d.ts.map +1 -1
  52. package/dist/harness/agent-loop.js +2 -523
  53. package/dist/harness/agent-loop.js.map +1 -1
  54. package/dist/harness/context-compactor.d.ts +1 -0
  55. package/dist/harness/context-compactor.d.ts.map +1 -1
  56. package/dist/harness/context-compactor.js +43 -1
  57. package/dist/harness/context-compactor.js.map +1 -1
  58. package/dist/harness/harness.d.ts +6 -0
  59. package/dist/harness/harness.d.ts.map +1 -1
  60. package/dist/harness/harness.js +32 -5
  61. package/dist/harness/harness.js.map +1 -1
  62. package/dist/harness/hooks-engine.d.ts.map +1 -1
  63. package/dist/harness/hooks-engine.js +12 -10
  64. package/dist/harness/hooks-engine.js.map +1 -1
  65. package/dist/harness/index.d.ts +3 -1
  66. package/dist/harness/index.d.ts.map +1 -1
  67. package/dist/harness/index.js +2 -0
  68. package/dist/harness/index.js.map +1 -1
  69. package/dist/harness/loop/hooks.d.ts +7 -0
  70. package/dist/harness/loop/hooks.d.ts.map +1 -0
  71. package/dist/harness/loop/hooks.js +46 -0
  72. package/dist/harness/loop/hooks.js.map +1 -0
  73. package/dist/harness/loop/index.d.ts +8 -0
  74. package/dist/harness/loop/index.d.ts.map +1 -0
  75. package/dist/harness/loop/index.js +257 -0
  76. package/dist/harness/loop/index.js.map +1 -0
  77. package/dist/harness/loop/inference.d.ts +19 -0
  78. package/dist/harness/loop/inference.d.ts.map +1 -0
  79. package/dist/harness/loop/inference.js +121 -0
  80. package/dist/harness/loop/inference.js.map +1 -0
  81. package/dist/harness/loop/memory.d.ts +22 -0
  82. package/dist/harness/loop/memory.d.ts.map +1 -0
  83. package/dist/harness/loop/memory.js +73 -0
  84. package/dist/harness/loop/memory.js.map +1 -0
  85. package/dist/harness/loop/safety.d.ts +8 -0
  86. package/dist/harness/loop/safety.d.ts.map +1 -0
  87. package/dist/harness/loop/safety.js +21 -0
  88. package/dist/harness/loop/safety.js.map +1 -0
  89. package/dist/harness/loop/tools.d.ts +24 -0
  90. package/dist/harness/loop/tools.d.ts.map +1 -0
  91. package/dist/harness/loop/tools.js +184 -0
  92. package/dist/harness/loop/tools.js.map +1 -0
  93. package/dist/harness/loop/types.d.ts +7 -0
  94. package/dist/harness/loop/types.d.ts.map +1 -0
  95. package/dist/harness/loop/types.js +9 -0
  96. package/dist/harness/loop/types.js.map +1 -0
  97. package/dist/harness/memory/fs-compat.d.ts +3 -0
  98. package/dist/harness/memory/fs-compat.d.ts.map +1 -0
  99. package/dist/harness/memory/fs-compat.js +26 -0
  100. package/dist/harness/memory/fs-compat.js.map +1 -0
  101. package/dist/harness/memory/index.d.ts +105 -0
  102. package/dist/harness/memory/index.d.ts.map +1 -0
  103. package/dist/harness/memory/index.js +491 -0
  104. package/dist/harness/memory/index.js.map +1 -0
  105. package/dist/harness/memory/prompter.d.ts +7 -0
  106. package/dist/harness/memory/prompter.d.ts.map +1 -0
  107. package/dist/harness/memory/prompter.js +24 -0
  108. package/dist/harness/memory/prompter.js.map +1 -0
  109. package/dist/harness/memory/ranker.d.ts +15 -0
  110. package/dist/harness/memory/ranker.d.ts.map +1 -0
  111. package/dist/harness/memory/ranker.js +72 -0
  112. package/dist/harness/memory/ranker.js.map +1 -0
  113. package/dist/harness/memory/scanner.d.ts +26 -0
  114. package/dist/harness/memory/scanner.d.ts.map +1 -0
  115. package/dist/harness/memory/scanner.js +187 -0
  116. package/dist/harness/memory/scanner.js.map +1 -0
  117. package/dist/harness/memory/types.d.ts +50 -0
  118. package/dist/harness/memory/types.d.ts.map +1 -0
  119. package/dist/harness/memory/types.js +7 -0
  120. package/dist/harness/memory/types.js.map +1 -0
  121. package/dist/harness/memory-loader.d.ts +3 -0
  122. package/dist/harness/memory-loader.d.ts.map +1 -0
  123. package/dist/harness/memory-loader.js +2 -0
  124. package/dist/harness/memory-loader.js.map +1 -0
  125. package/dist/harness/safety-gate.d.ts.map +1 -1
  126. package/dist/harness/safety-gate.js +47 -26
  127. package/dist/harness/safety-gate.js.map +1 -1
  128. package/dist/harness/skill-loader.d.ts +7 -0
  129. package/dist/harness/skill-loader.d.ts.map +1 -1
  130. package/dist/harness/skill-loader.js +24 -8
  131. package/dist/harness/skill-loader.js.map +1 -1
  132. package/dist/harness/todo-module.d.ts.map +1 -1
  133. package/dist/harness/todo-module.js +13 -6
  134. package/dist/harness/todo-module.js.map +1 -1
  135. package/dist/harness/types.d.ts +7 -0
  136. package/dist/harness/types.d.ts.map +1 -1
  137. package/dist/harness/types.js.map +1 -1
  138. package/dist/harness/validate-args.js +18 -3
  139. package/dist/harness/validate-args.js.map +1 -1
  140. package/dist/hitl/interrupt.d.ts +2 -2
  141. package/dist/hitl/interrupt.d.ts.map +1 -1
  142. package/dist/hitl/interrupt.js +8 -5
  143. package/dist/hitl/interrupt.js.map +1 -1
  144. package/dist/hitl/resume.d.ts +10 -0
  145. package/dist/hitl/resume.d.ts.map +1 -1
  146. package/dist/hitl/resume.js +31 -0
  147. package/dist/hitl/resume.js.map +1 -1
  148. package/dist/injected.d.ts.map +1 -1
  149. package/dist/injected.js.map +1 -1
  150. package/dist/inspect.d.ts.map +1 -1
  151. package/dist/inspect.js +28 -8
  152. package/dist/inspect.js.map +1 -1
  153. package/dist/lsp/client.d.ts +2 -0
  154. package/dist/lsp/client.d.ts.map +1 -1
  155. package/dist/lsp/client.js +62 -17
  156. package/dist/lsp/client.js.map +1 -1
  157. package/dist/lsp/index.d.ts.map +1 -1
  158. package/dist/lsp/index.js.map +1 -1
  159. package/dist/mcp/client.d.ts +2 -0
  160. package/dist/mcp/client.d.ts.map +1 -1
  161. package/dist/mcp/client.js +44 -13
  162. package/dist/mcp/client.js.map +1 -1
  163. package/dist/mcp/convert.js +1 -1
  164. package/dist/mcp/convert.js.map +1 -1
  165. package/dist/mcp/transport.d.ts +2 -0
  166. package/dist/mcp/transport.d.ts.map +1 -1
  167. package/dist/mcp/transport.js +33 -8
  168. package/dist/mcp/transport.js.map +1 -1
  169. package/dist/messages/index.d.ts.map +1 -1
  170. package/dist/messages/index.js +7 -1
  171. package/dist/messages/index.js.map +1 -1
  172. package/dist/models/anthropic.d.ts.map +1 -1
  173. package/dist/models/anthropic.js +25 -15
  174. package/dist/models/anthropic.js.map +1 -1
  175. package/dist/models/google.d.ts.map +1 -1
  176. package/dist/models/google.js +23 -7
  177. package/dist/models/google.js.map +1 -1
  178. package/dist/models/ollama.d.ts.map +1 -1
  179. package/dist/models/ollama.js +11 -1
  180. package/dist/models/ollama.js.map +1 -1
  181. package/dist/models/openai.d.ts.map +1 -1
  182. package/dist/models/openai.js +15 -3
  183. package/dist/models/openai.js.map +1 -1
  184. package/dist/models/openrouter.d.ts.map +1 -1
  185. package/dist/models/openrouter.js +14 -3
  186. package/dist/models/openrouter.js.map +1 -1
  187. package/dist/prebuilt/react-agent.d.ts.map +1 -1
  188. package/dist/prebuilt/react-agent.js +7 -2
  189. package/dist/prebuilt/react-agent.js.map +1 -1
  190. package/dist/pregel/checkpointing.d.ts +12 -0
  191. package/dist/pregel/checkpointing.d.ts.map +1 -0
  192. package/dist/pregel/checkpointing.js +60 -0
  193. package/dist/pregel/checkpointing.js.map +1 -0
  194. package/dist/pregel/execution.d.ts +7 -0
  195. package/dist/pregel/execution.d.ts.map +1 -0
  196. package/dist/pregel/execution.js +178 -0
  197. package/dist/pregel/execution.js.map +1 -0
  198. package/dist/pregel/index.d.ts +61 -0
  199. package/dist/pregel/index.d.ts.map +1 -0
  200. package/dist/pregel/index.js +154 -0
  201. package/dist/pregel/index.js.map +1 -0
  202. package/dist/pregel/interrupts.d.ts +3 -0
  203. package/dist/pregel/interrupts.d.ts.map +1 -0
  204. package/dist/pregel/interrupts.js +7 -0
  205. package/dist/pregel/interrupts.js.map +1 -0
  206. package/dist/pregel/state-helpers.d.ts +12 -0
  207. package/dist/pregel/state-helpers.d.ts.map +1 -0
  208. package/dist/pregel/state-helpers.js +71 -0
  209. package/dist/pregel/state-helpers.js.map +1 -0
  210. package/dist/pregel/streaming.d.ts +5 -0
  211. package/dist/pregel/streaming.d.ts.map +1 -0
  212. package/dist/pregel/streaming.js +462 -0
  213. package/dist/pregel/streaming.js.map +1 -0
  214. package/dist/pregel/types.d.ts +48 -0
  215. package/dist/pregel/types.d.ts.map +1 -0
  216. package/dist/pregel/types.js +5 -0
  217. package/dist/pregel/types.js.map +1 -0
  218. package/dist/pregel.d.ts +1 -63
  219. package/dist/pregel.d.ts.map +1 -1
  220. package/dist/pregel.js +2 -804
  221. package/dist/pregel.js.map +1 -1
  222. package/dist/retry.d.ts.map +1 -1
  223. package/dist/retry.js +7 -6
  224. package/dist/retry.js.map +1 -1
  225. package/dist/store/index.d.ts.map +1 -1
  226. package/dist/store/index.js +36 -9
  227. package/dist/store/index.js.map +1 -1
  228. package/dist/stream-events.d.ts.map +1 -1
  229. package/dist/stream-events.js +3 -9
  230. package/dist/stream-events.js.map +1 -1
  231. package/dist/swarm/agent-node.d.ts +11 -0
  232. package/dist/swarm/agent-node.d.ts.map +1 -0
  233. package/dist/swarm/agent-node.js +156 -0
  234. package/dist/swarm/agent-node.js.map +1 -0
  235. package/dist/swarm/compile-ext.d.ts +5 -0
  236. package/dist/swarm/compile-ext.d.ts.map +1 -0
  237. package/dist/swarm/compile-ext.js +126 -0
  238. package/dist/swarm/compile-ext.js.map +1 -0
  239. package/dist/swarm/config.d.ts +147 -0
  240. package/dist/swarm/config.d.ts.map +1 -0
  241. package/dist/swarm/config.js +17 -0
  242. package/dist/swarm/config.js.map +1 -0
  243. package/dist/swarm/factories.d.ts +37 -0
  244. package/dist/swarm/factories.d.ts.map +1 -0
  245. package/dist/swarm/factories.js +703 -0
  246. package/dist/swarm/factories.js.map +1 -0
  247. package/dist/swarm/graph.d.ts +16 -136
  248. package/dist/swarm/graph.d.ts.map +1 -1
  249. package/dist/swarm/graph.js +39 -897
  250. package/dist/swarm/graph.js.map +1 -1
  251. package/dist/swarm/index.d.ts +2 -1
  252. package/dist/swarm/index.d.ts.map +1 -1
  253. package/dist/swarm/index.js.map +1 -1
  254. package/dist/swarm/mailbox.d.ts.map +1 -1
  255. package/dist/swarm/mailbox.js +3 -1
  256. package/dist/swarm/mailbox.js.map +1 -1
  257. package/dist/swarm/mermaid.d.ts +2 -1
  258. package/dist/swarm/mermaid.d.ts.map +1 -1
  259. package/dist/swarm/mermaid.js +6 -3
  260. package/dist/swarm/mermaid.js.map +1 -1
  261. package/dist/swarm/pool.d.ts.map +1 -1
  262. package/dist/swarm/pool.js +18 -1
  263. package/dist/swarm/pool.js.map +1 -1
  264. package/dist/swarm/registry.d.ts.map +1 -1
  265. package/dist/swarm/registry.js +7 -0
  266. package/dist/swarm/registry.js.map +1 -1
  267. package/dist/swarm/scaling.d.ts +10 -1
  268. package/dist/swarm/scaling.d.ts.map +1 -1
  269. package/dist/swarm/scaling.js +85 -14
  270. package/dist/swarm/scaling.js.map +1 -1
  271. package/dist/swarm/snapshot.d.ts.map +1 -1
  272. package/dist/swarm/snapshot.js +10 -1
  273. package/dist/swarm/snapshot.js.map +1 -1
  274. package/dist/swarm/supervisor.js +20 -12
  275. package/dist/swarm/supervisor.js.map +1 -1
  276. package/dist/swarm/tracer.d.ts +3 -1
  277. package/dist/swarm/tracer.d.ts.map +1 -1
  278. package/dist/swarm/tracer.js +66 -15
  279. package/dist/swarm/tracer.js.map +1 -1
  280. package/dist/swarm/types.d.ts +1 -6
  281. package/dist/swarm/types.d.ts.map +1 -1
  282. package/dist/testing/index.d.ts +4 -4
  283. package/dist/testing/index.d.ts.map +1 -1
  284. package/dist/testing/index.js +3 -2
  285. package/dist/testing/index.js.map +1 -1
  286. package/dist/tools/define.d.ts +2 -1
  287. package/dist/tools/define.d.ts.map +1 -1
  288. package/dist/tools/define.js +3 -1
  289. package/dist/tools/define.js.map +1 -1
  290. package/dist/tools/types.d.ts.map +1 -1
  291. package/dist/types.d.ts +3 -1
  292. package/dist/types.d.ts.map +1 -1
  293. package/package.json +1 -1
@@ -1,524 +1,3 @@
1
- // ============================================================
2
- // @oni.bot/core/harness AgentLoop
3
- // Think → Act → Observe async generator driving each agent node
4
- // ============================================================
5
- import { generateId } from "./types.js";
6
- import { validateToolArgs } from "./validate-args.js";
7
- // ─── agentLoop ─────────────────────────────────────────────────────────────
8
- export async function* agentLoop(prompt, config) {
9
- const sessionId = generateId("ses");
10
- const threadId = config.threadId ?? generateId("thr");
11
- const maxTurns = config.maxTurns ?? 10;
12
- const messages = config.initialMessages
13
- ? [...config.initialMessages]
14
- : [];
15
- let turn = 0;
16
- // ── 1. Session Init ──────────────────────────────────────────────────
17
- if (config.hooksEngine) {
18
- const hookResult = await config.hooksEngine.fire("SessionStart", {
19
- sessionId,
20
- agentName: config.agentName,
21
- tools: config.tools.map((t) => t.name),
22
- });
23
- if (hookResult?.additionalContext) {
24
- messages.push({ role: "user", content: hookResult.additionalContext });
25
- messages.push({ role: "assistant", content: "Context loaded." });
26
- }
27
- }
28
- // Push user prompt
29
- messages.push({ role: "user", content: prompt });
30
- yield makeMessage("system", sessionId, turn, {
31
- subtype: "init",
32
- content: `Session ${sessionId} started for agent "${config.agentName}"`,
33
- });
34
- // ── 2. Build LLMToolDef[] ────────────────────────────────────────────
35
- const llmTools = config.tools.map((t) => ({
36
- name: t.name,
37
- description: t.description,
38
- parameters: t.schema,
39
- }));
40
- // Tool lookup map
41
- const toolMap = new Map();
42
- for (const t of config.tools) {
43
- toolMap.set(t.name, t);
44
- }
45
- // ── 3. Main Loop ─────────────────────────────────────────────────────
46
- while (turn < maxTurns) {
47
- // ── 3a. Check AbortSignal ────────────────────────────────────────
48
- if (config.signal?.aborted) {
49
- yield makeMessage("error", sessionId, turn, {
50
- content: "Agent loop aborted by signal",
51
- });
52
- return;
53
- }
54
- // ── 3b. Context Compaction ───────────────────────────────────────
55
- if (config.compactor) {
56
- const compactionCheck = config.compactor.checkCompaction(messages);
57
- if (compactionCheck.needed) {
58
- const beforeCount = messages.length;
59
- yield makeMessage("system", sessionId, turn, {
60
- subtype: "compact_start",
61
- content: "Context compaction starting",
62
- metadata: {
63
- beforeCount,
64
- estimatedTokens: compactionCheck.estimatedTokens,
65
- threshold: compactionCheck.threshold,
66
- maxTokens: compactionCheck.maxTokens,
67
- percentUsed: compactionCheck.percentUsed,
68
- },
69
- });
70
- try {
71
- if (config.hooksEngine) {
72
- await config.hooksEngine.fire("PreCompact", {
73
- sessionId,
74
- messageCount: beforeCount,
75
- estimatedTokens: compactionCheck.estimatedTokens,
76
- });
77
- }
78
- const compacted = await config.compactor.compact(messages, { skipInitialCheck: true });
79
- const estimatedTokensAfter = config.compactor.estimateTokens(compacted);
80
- const percentUsedAfter = compactionCheck.maxTokens > 0
81
- ? estimatedTokensAfter / compactionCheck.maxTokens
82
- : 0;
83
- const afterCount = compacted.length;
84
- const summarized = afterCount <= 2 && beforeCount > 2;
85
- messages.length = 0;
86
- messages.push(...compacted);
87
- yield makeMessage("system", sessionId, turn, {
88
- subtype: "compact_boundary",
89
- content: "Context compacted",
90
- metadata: {
91
- beforeCount,
92
- afterCount,
93
- summarized,
94
- estimatedTokensBefore: compactionCheck.estimatedTokens,
95
- estimatedTokensAfter,
96
- threshold: compactionCheck.threshold,
97
- maxTokens: compactionCheck.maxTokens,
98
- percentUsedBefore: compactionCheck.percentUsed,
99
- percentUsedAfter,
100
- },
101
- });
102
- }
103
- catch (err) {
104
- const errorMsg = err instanceof Error ? err.message : String(err);
105
- yield makeMessage("system", sessionId, turn, {
106
- subtype: "compact_error",
107
- content: `Context compaction failed: ${errorMsg}`,
108
- metadata: {
109
- beforeCount,
110
- afterCount: beforeCount,
111
- estimatedTokensBefore: compactionCheck.estimatedTokens,
112
- threshold: compactionCheck.threshold,
113
- maxTokens: compactionCheck.maxTokens,
114
- percentUsedBefore: compactionCheck.percentUsed,
115
- error: errorMsg,
116
- },
117
- });
118
- }
119
- }
120
- }
121
- // ── 3c. Build system prompt ──────────────────────────────────────
122
- let systemPrompt = config.systemPrompt;
123
- // Inject remaining turns so the model knows its budget
124
- const remaining = maxTurns - turn;
125
- systemPrompt += `\n\nYou have ${remaining} turns remaining. Each turn lets you call multiple tools. Do NOT stop early — use your tools and complete the task autonomously.`;
126
- if (config.env) {
127
- const envLines = [];
128
- if (config.env.cwd)
129
- envLines.push(`Working directory: ${config.env.cwd}`);
130
- if (config.env.platform)
131
- envLines.push(`Platform: ${config.env.platform}`);
132
- if (config.env.date)
133
- envLines.push(`Date: ${config.env.date}`);
134
- if (config.env.gitBranch)
135
- envLines.push(`Git branch: ${config.env.gitBranch}`);
136
- if (config.env.gitStatus)
137
- envLines.push(`Git status: ${config.env.gitStatus}`);
138
- if (envLines.length > 0) {
139
- systemPrompt += `\n\n<env>\n${envLines.join("\n")}\n</env>`;
140
- }
141
- }
142
- // ── 3d. Skill injection ──────────────────────────────────────────
143
- if (config.skillLoader) {
144
- const pending = config.skillLoader.getPendingInjection();
145
- if (pending) {
146
- messages.push({ role: "user", content: pending });
147
- messages.push({ role: "assistant", content: "Skill instructions loaded." });
148
- config.skillLoader.clearPendingInjection();
149
- }
150
- }
151
- // ── 3e. Yield step_start ─────────────────────────────────────────
152
- const stepStartTime = Date.now();
153
- yield makeMessage("step_start", sessionId, turn, {
154
- metadata: { step: turn },
155
- });
156
- // ── 3f. Inference (with retry on transient errors) ───────────────
157
- let response;
158
- const maxRetries = 3;
159
- let lastInferenceError = null;
160
- let succeeded = false;
161
- for (let attempt = 0; attempt <= maxRetries; attempt++) {
162
- try {
163
- response = await config.model.chat({
164
- messages,
165
- tools: llmTools.length > 0 ? llmTools : undefined,
166
- systemPrompt,
167
- maxTokens: config.maxTokens ?? 8192,
168
- });
169
- succeeded = true;
170
- break;
171
- }
172
- catch (err) {
173
- lastInferenceError = err;
174
- const isRetryable = isRetryableError(err);
175
- if (!isRetryable || attempt >= maxRetries) {
176
- break;
177
- }
178
- // Check abort signal before retrying
179
- if (config.signal?.aborted) {
180
- break;
181
- }
182
- // Yield inference_retry so the conductor can emit events and update the UI
183
- const delayMs = getRetryDelay(err, attempt);
184
- yield makeMessage("system", sessionId, turn, {
185
- subtype: "inference_retry",
186
- content: `Retrying inference (attempt ${attempt + 1}/${maxRetries}): ${err instanceof Error ? err.message : String(err)}`,
187
- metadata: {
188
- attempt: attempt + 1,
189
- maxRetries,
190
- delayMs,
191
- error: err instanceof Error ? err.message : String(err),
192
- },
193
- });
194
- if (delayMs > 0) {
195
- // Abort-aware delay: resolve early if signal fires
196
- await new Promise((resolve) => {
197
- const timer = setTimeout(resolve, delayMs);
198
- if (config.signal) {
199
- const onAbort = () => { clearTimeout(timer); resolve(); };
200
- if (config.signal.aborted) {
201
- clearTimeout(timer);
202
- resolve();
203
- return;
204
- }
205
- config.signal.addEventListener("abort", onAbort, { once: true });
206
- }
207
- });
208
- }
209
- }
210
- }
211
- if (!succeeded) {
212
- yield makeMessage("error", sessionId, turn, {
213
- content: `Inference error: ${lastInferenceError instanceof Error ? lastInferenceError.message : String(lastInferenceError)}`,
214
- metadata: { finalMessages: messages },
215
- });
216
- return;
217
- }
218
- // ── 3g. Yield assistant message ──────────────────────────────────
219
- yield makeMessage("assistant", sessionId, turn, {
220
- content: response.content,
221
- toolCalls: response.toolCalls,
222
- metadata: {
223
- usage: response.usage,
224
- stopReason: response.stopReason,
225
- },
226
- });
227
- // ── 3g2. Yield step_finish with usage (for parent stats merge) ──
228
- yield makeMessage("step_finish", sessionId, turn, {
229
- metadata: {
230
- stepDurationMs: Date.now() - stepStartTime,
231
- usage: response.usage,
232
- stopReason: response.stopReason,
233
- toolCount: response.toolCalls?.length ?? 0,
234
- },
235
- });
236
- // ── 3h. Stop condition ───────────────────────────────────────────
237
- if (!response.toolCalls || response.toolCalls.length === 0) {
238
- if (config.hooksEngine) {
239
- const stopResult = await config.hooksEngine.fire("Stop", {
240
- sessionId,
241
- response: response.content,
242
- });
243
- if (stopResult?.decision === "block") {
244
- // Inject feedback as user message, increment turn, continue
245
- const feedback = stopResult.reason ?? "Please provide a more complete response.";
246
- messages.push({
247
- role: "assistant",
248
- content: response.content,
249
- });
250
- messages.push({
251
- role: "user",
252
- content: feedback,
253
- });
254
- turn++;
255
- continue;
256
- }
257
- }
258
- // Fire SessionEnd and yield result
259
- if (config.hooksEngine) {
260
- await config.hooksEngine.fire("SessionEnd", {
261
- sessionId,
262
- reason: "completed",
263
- turns: turn + 1,
264
- });
265
- }
266
- // Include the assistant's final message in history before emitting
267
- messages.push({ role: "assistant", content: response.content });
268
- yield makeMessage("result", sessionId, turn, {
269
- content: response.content,
270
- metadata: { totalTurns: turn + 1, finalMessages: messages },
271
- });
272
- return;
273
- }
274
- // ── 3i. Tool execution ───────────────────────────────────────────
275
- const toolResults = [];
276
- for (const toolCall of response.toolCalls) {
277
- // Fire PreToolUse hook
278
- if (config.hooksEngine) {
279
- const preResult = await config.hooksEngine.fire("PreToolUse", {
280
- sessionId,
281
- toolName: toolCall.name,
282
- input: toolCall.args,
283
- });
284
- if (preResult?.decision === "deny") {
285
- toolResults.push({
286
- toolCallId: toolCall.id,
287
- toolName: toolCall.name,
288
- content: `Tool use denied: ${preResult.reason ?? "blocked by hook"}`,
289
- isError: true,
290
- });
291
- continue;
292
- }
293
- // Apply modifiedInput if hook returned one
294
- if (preResult?.modifiedInput) {
295
- Object.assign(toolCall.args, preResult.modifiedInput);
296
- }
297
- }
298
- // Safety gate check
299
- if (config.safetyGate && config.safetyGate.requiresCheck(toolCall.name)) {
300
- const safetyResult = await config.safetyGate.check({
301
- id: toolCall.id,
302
- name: toolCall.name,
303
- args: toolCall.args,
304
- });
305
- if (!safetyResult.approved) {
306
- toolResults.push({
307
- toolCallId: toolCall.id,
308
- toolName: toolCall.name,
309
- content: `Tool blocked by safety gate: ${safetyResult.reason ?? "unsafe operation"}`,
310
- isError: true,
311
- });
312
- continue;
313
- }
314
- }
315
- // Find and execute tool
316
- const toolDef = toolMap.get(toolCall.name);
317
- if (!toolDef) {
318
- toolResults.push({
319
- toolCallId: toolCall.id,
320
- toolName: toolCall.name,
321
- content: `Unknown tool: ${toolCall.name}`,
322
- isError: true,
323
- });
324
- continue;
325
- }
326
- // Validate tool arguments before execution
327
- if (toolDef.schema) {
328
- const validationError = validateToolArgs(toolCall.args, toolDef.schema, toolCall.name);
329
- if (validationError) {
330
- toolResults.push({
331
- toolCallId: toolCall.id,
332
- toolName: toolCall.name,
333
- content: `${validationError}. Please retry with correct arguments.`,
334
- isError: true,
335
- });
336
- continue;
337
- }
338
- }
339
- // Yield tool_start so the conductor can emit tool.call events
340
- yield makeMessage("tool_start", sessionId, turn, {
341
- metadata: {
342
- toolName: toolCall.name,
343
- toolArgs: toolCall.args,
344
- toolCallId: toolCall.id,
345
- },
346
- });
347
- const metadataUpdates = [];
348
- const toolCtx = {
349
- config: {},
350
- store: null,
351
- state: {},
352
- emit: () => { },
353
- sessionId,
354
- threadId,
355
- agentName: config.agentName,
356
- turn,
357
- signal: config.signal,
358
- metadata: (update) => {
359
- metadataUpdates.push(update);
360
- },
361
- };
362
- try {
363
- const startTime = Date.now();
364
- const rawResult = await toolDef.execute(toolCall.args, toolCtx);
365
- const durationMs = Date.now() - startTime;
366
- const content = typeof rawResult === "string" ? rawResult : JSON.stringify(rawResult);
367
- // Fire PostToolUse
368
- if (config.hooksEngine) {
369
- await config.hooksEngine.fire("PostToolUse", {
370
- sessionId,
371
- toolName: toolCall.name,
372
- input: toolCall.args,
373
- output: rawResult,
374
- durationMs,
375
- });
376
- }
377
- toolResults.push({
378
- toolCallId: toolCall.id,
379
- toolName: toolCall.name,
380
- content,
381
- durationMs,
382
- });
383
- // Yield collected metadata updates from ctx.metadata() calls
384
- for (const mu of metadataUpdates) {
385
- yield makeMessage("tool_metadata", sessionId, turn, {
386
- metadata: {
387
- toolCallId: toolCall.id,
388
- toolName: toolCall.name,
389
- title: mu.title,
390
- data: mu.metadata,
391
- },
392
- });
393
- }
394
- }
395
- catch (err) {
396
- const errorMsg = err instanceof Error ? err.message : String(err);
397
- // Fire PostToolUseFailure
398
- if (config.hooksEngine) {
399
- await config.hooksEngine.fire("PostToolUseFailure", {
400
- sessionId,
401
- toolName: toolCall.name,
402
- input: toolCall.args,
403
- error: err instanceof Error ? err : errorMsg,
404
- });
405
- }
406
- toolResults.push({
407
- toolCallId: toolCall.id,
408
- toolName: toolCall.name,
409
- content: `Tool error: ${errorMsg}`,
410
- isError: true,
411
- });
412
- }
413
- }
414
- // ── 3j. Update messages ──────────────────────────────────────────
415
- messages.push({
416
- role: "assistant",
417
- content: response.content,
418
- toolCalls: response.toolCalls,
419
- });
420
- for (const tr of toolResults) {
421
- messages.push({
422
- role: "tool",
423
- content: tr.content,
424
- toolCallId: tr.toolCallId,
425
- name: tr.toolName,
426
- });
427
- }
428
- // ── 3j. TODO reminder ────────────────────────────────────────────
429
- if (config.todoModule) {
430
- const todoState = config.todoModule.getState();
431
- if (todoState.todos.length > 0) {
432
- const reminder = config.todoModule.toContextString();
433
- messages.push({ role: "user", content: `<system-reminder>\n${reminder}\n</system-reminder>` });
434
- messages.push({ role: "assistant", content: "Noted." });
435
- yield makeMessage("system", sessionId, turn, {
436
- subtype: "todo_reminder",
437
- content: reminder,
438
- });
439
- }
440
- }
441
- // ── 3k. Yield tool_result, increment turn ───────────────────────
442
- yield makeMessage("tool_result", sessionId, turn, {
443
- toolResults,
444
- });
445
- turn++;
446
- }
447
- // ── 4. maxTurns exceeded ─────────────────────────────────────────────
448
- yield makeMessage("error", sessionId, turn, {
449
- content: `Agent loop exceeded maxTurns (${maxTurns})`,
450
- metadata: { finalMessages: messages },
451
- });
452
- }
453
- // ─── wrapWithAgentLoop ─────────────────────────────────────────────────────
454
- export function wrapWithAgentLoop(config) {
455
- return async (state) => {
456
- const prompt = state.task ??
457
- state.context ??
458
- "";
459
- let finalResult = "";
460
- for await (const msg of agentLoop(prompt, config)) {
461
- if (msg.type === "result") {
462
- finalResult = msg.content ?? "";
463
- }
464
- }
465
- return {
466
- agentResults: {
467
- ...(state.agentResults ?? {}),
468
- [config.agentName]: finalResult,
469
- },
470
- };
471
- };
472
- }
473
- // ─── Helpers ───────────────────────────────────────────────────────────────
474
- function makeMessage(type, sessionId, turn, overrides = {}) {
475
- return {
476
- type,
477
- sessionId,
478
- turn,
479
- timestamp: Date.now(),
480
- ...overrides,
481
- };
482
- }
483
- /** Check if an error is retryable (rate limits, transient server errors). */
484
- function isRetryableError(err) {
485
- if (err && typeof err === "object" && "isRetryable" in err) {
486
- return !!err.isRetryable;
487
- }
488
- if (err && typeof err === "object") {
489
- const status = err.status;
490
- if (status === 429 || status === 503 || status === 502 || status === 500) {
491
- return true;
492
- }
493
- }
494
- if (err instanceof Error) {
495
- const msg = err.message.toLowerCase();
496
- if (msg.includes("rate limit") || msg.includes("429") || msg.includes("503") || msg.includes("overloaded")) {
497
- return true;
498
- }
499
- }
500
- return false;
501
- }
502
- /** Get retry delay with exponential backoff. */
503
- function getRetryDelay(err, attempt) {
504
- if (err && typeof err === "object") {
505
- // Respect retryAfterMs if provided by the model adapter
506
- if ("retryAfterMs" in err) {
507
- const after = err.retryAfterMs;
508
- if (typeof after === "number" && after > 0)
509
- return after;
510
- }
511
- // Check headers for retry-after-ms (common in HTTP error responses)
512
- const headers = err.headers;
513
- if (headers) {
514
- const headerMs = headers["retry-after-ms"];
515
- if (headerMs) {
516
- const parsed = parseInt(headerMs, 10);
517
- if (!isNaN(parsed) && parsed > 0)
518
- return parsed;
519
- }
520
- }
521
- }
522
- return Math.min(1000 * Math.pow(2, attempt), 10_000);
523
- }
1
+ // Re-export shim — implementation has moved to src/harness/loop/
2
+ export { agentLoop, wrapWithAgentLoop } from "./loop/index.js";
524
3
  //# sourceMappingURL=agent-loop.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../../src/harness/agent-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../../src/harness/agent-loop.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -69,6 +69,7 @@ export declare class ContextCompactor {
69
69
  compact(messages: ONIModelMessage[], opts?: {
70
70
  skipInitialCheck?: boolean;
71
71
  }): Promise<ONIModelMessage[]>;
72
+ private _runCompaction;
72
73
  /**
73
74
  * Remove tool-role messages from the older portion of the conversation,
74
75
  * keeping the most recent `keepRecent` messages intact.
@@ -1 +1 @@
1
- {"version":3,"file":"context-compactor.d.ts","sourceRoot":"","sources":["../../src/harness/context-compactor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIpE,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAgB,SAAQ,wBAAwB;IAC/D,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,YAAY,EAAE,QAAQ,CAAC;IAEvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAS;gBAElC,MAAM,EAAE,eAAe;IAUnC;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM;IAQnD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO;IAInD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe;IAQ7D;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM;IAKlD,YAAY,IAAI,MAAM;IAItB,YAAY,IAAI,MAAM;IAItB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,wBAAwB;IAUxE;;;;;;OAMG;IACG,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,IAAI,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAsB7G;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;;OAGG;YACW,SAAS;IAoDvB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;OAEG;IACH,OAAO,CAAC,aAAa;CAYtB"}
1
+ {"version":3,"file":"context-compactor.d.ts","sourceRoot":"","sources":["../../src/harness/context-compactor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIpE,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAgB,SAAQ,wBAAwB;IAC/D,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,YAAY,EAAE,QAAQ,CAAC;IAEvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAS;gBAClC,MAAM,EAAE,eAAe;IAUnC;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM;IAQnD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO;IAInD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe;IAQ7D;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM;IAKlD,YAAY,IAAI,MAAM;IAItB,YAAY,IAAI,MAAM;IAItB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,wBAAwB;IAUxE;;;;;;OAMG;IACG,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,IAAI,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;YAQ/F,cAAc;IAkB5B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAyD3B;;;OAGG;YACW,SAAS;IAoDvB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;OAEG;IACH,OAAO,CAAC,aAAa;CAYtB"}
@@ -79,6 +79,9 @@ export class ContextCompactor {
79
79
  if (!opts?.skipInitialCheck && !this.shouldCompact(messages)) {
80
80
  return messages;
81
81
  }
82
+ return this._runCompaction(messages);
83
+ }
84
+ async _runCompaction(messages) {
82
85
  // Stage 1: clear old tool results
83
86
  const cleaned = this.clearOldToolResults(messages);
84
87
  if (!this.shouldCompact(cleaned)) {
@@ -105,7 +108,46 @@ export class ContextCompactor {
105
108
  const cutoff = messages.length - keepRecent;
106
109
  const olderPortion = messages.slice(0, cutoff);
107
110
  const recentPortion = messages.slice(cutoff);
108
- const filteredOlder = olderPortion.filter((m) => m.role !== "tool");
111
+ // Collect IDs of tool-result messages that are in olderPortion (being removed).
112
+ const removedToolCallIds = new Set();
113
+ for (const m of olderPortion) {
114
+ if (m.role === "tool" && m.toolCallId) {
115
+ removedToolCallIds.add(m.toolCallId);
116
+ }
117
+ }
118
+ // For assistant+toolCalls messages whose results span both portions:
119
+ // the assistant must be kept (some results survive in recentPortion), and
120
+ // its tool results in olderPortion must also be kept to avoid producing an
121
+ // incomplete tool-call sequence that both Anthropic and OpenAI reject.
122
+ //
123
+ // keptToolCallIds: tool result IDs in olderPortion that must be retained
124
+ // because their parent assistant message will be kept.
125
+ const keptToolCallIds = new Set();
126
+ for (const m of olderPortion) {
127
+ if (m.role === "assistant" && m.toolCalls && m.toolCalls.length > 0) {
128
+ const allRemoved = m.toolCalls.every((tc) => removedToolCallIds.has(tc.id));
129
+ if (!allRemoved) {
130
+ // This assistant message is kept — retain its olderPortion tool results too.
131
+ for (const tc of m.toolCalls) {
132
+ if (removedToolCallIds.has(tc.id)) {
133
+ keptToolCallIds.add(tc.id);
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }
139
+ // Filter: remove tool messages unless their parent assistant is kept,
140
+ // and remove assistant messages only when ALL their results are removed.
141
+ const filteredOlder = olderPortion.filter((m) => {
142
+ if (m.role === "tool") {
143
+ return m.toolCallId ? keptToolCallIds.has(m.toolCallId) : false;
144
+ }
145
+ if (m.role === "assistant" && m.toolCalls && m.toolCalls.length > 0) {
146
+ if (m.toolCalls.every((tc) => removedToolCallIds.has(tc.id)))
147
+ return false;
148
+ }
149
+ return true;
150
+ });
109
151
  return [...filteredOlder, ...recentPortion];
110
152
  }
111
153
  /**