@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
@@ -0,0 +1,257 @@
1
+ // ============================================================
2
+ // @oni.bot/core/harness/loop — Index
3
+ // agentLoop() + wrapWithAgentLoop() assembling all sub-modules.
4
+ // ============================================================
5
+ import { generateId } from "../types.js";
6
+ import { makeMessage } from "./types.js";
7
+ // Sub-module imports
8
+ import { runInference } from "./inference.js";
9
+ import { buildLLMTools, buildToolMap, executeTools } from "./tools.js";
10
+ import { initMemory, finalizeMemory } from "./memory.js";
11
+ import { fireSessionStart, fireSessionEnd, fireStop, firePreCompact, firePostCompact, } from "./hooks.js";
12
+ // ─── agentLoop ─────────────────────────────────────────────────────────────
13
+ export async function* agentLoop(prompt, config) {
14
+ const sessionId = generateId("ses");
15
+ const threadId = config.threadId ?? generateId("thr");
16
+ const maxTurns = config.maxTurns ?? 10;
17
+ const messages = config.initialMessages ? [...config.initialMessages] : [];
18
+ let turn = 0;
19
+ // ── 0. Memory init ───────────────────────────────────────────────────────
20
+ const { memoryLoader, memoryContext } = initMemory(prompt, config);
21
+ const effectiveSystemPrompt = memoryContext
22
+ ? [memoryContext, config.systemPrompt].filter(Boolean).join("\n\n")
23
+ : config.systemPrompt;
24
+ let sessionOutcome = "completed";
25
+ // ── 1. Session Init ──────────────────────────────────────────────────
26
+ if (config.hooksEngine) {
27
+ const hookResult = await fireSessionStart(config.hooksEngine, sessionId, config.agentName, config.tools.map((t) => t.name));
28
+ if (hookResult?.additionalContext) {
29
+ messages.push({ role: "user", content: hookResult.additionalContext });
30
+ messages.push({ role: "assistant", content: "Context loaded." });
31
+ }
32
+ }
33
+ // ── 1b. Build allTools ───────────────────────────────────────────────
34
+ const allTools = memoryLoader
35
+ ? [...config.tools, memoryLoader.getQueryTool()]
36
+ : config.tools;
37
+ messages.push({ role: "user", content: prompt });
38
+ yield makeMessage("system", sessionId, turn, {
39
+ subtype: "init",
40
+ content: `Session ${sessionId} started for agent "${config.agentName}"`,
41
+ });
42
+ // ── 2. Build LLMToolDef[] ────────────────────────────────────────────
43
+ const llmTools = buildLLMTools(allTools);
44
+ const toolMap = buildToolMap(allTools);
45
+ // ── 3. Main Loop ─────────────────────────────────────────────────────
46
+ try {
47
+ while (turn < maxTurns) {
48
+ // ── 3a. Check AbortSignal ──────────────────────────────────────
49
+ if (config.signal?.aborted) {
50
+ sessionOutcome = "interrupted";
51
+ yield makeMessage("error", sessionId, turn, { content: "Agent loop aborted by signal" });
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 firePreCompact(config.hooksEngine, sessionId, beforeCount, compactionCheck.estimatedTokens);
73
+ }
74
+ const compacted = await config.compactor.compact(messages, { skipInitialCheck: true });
75
+ const estimatedTokensAfter = config.compactor.estimateTokens(compacted);
76
+ const percentUsedAfter = compactionCheck.maxTokens > 0
77
+ ? estimatedTokensAfter / compactionCheck.maxTokens : 0;
78
+ const afterCount = compacted.length;
79
+ const summarized = afterCount <= 2 && beforeCount > 2;
80
+ messages.length = 0;
81
+ messages.push(...compacted);
82
+ yield makeMessage("system", sessionId, turn, {
83
+ subtype: "compact_boundary",
84
+ content: "Context compacted",
85
+ metadata: {
86
+ beforeCount, afterCount, summarized,
87
+ estimatedTokensBefore: compactionCheck.estimatedTokens, estimatedTokensAfter,
88
+ threshold: compactionCheck.threshold, maxTokens: compactionCheck.maxTokens,
89
+ percentUsedBefore: compactionCheck.percentUsed, percentUsedAfter,
90
+ },
91
+ });
92
+ if (config.hooksEngine) {
93
+ await firePostCompact(config.hooksEngine, sessionId, beforeCount, afterCount, estimatedTokensAfter, summarized);
94
+ }
95
+ }
96
+ catch (err) {
97
+ const errorMsg = err instanceof Error ? err.message : String(err);
98
+ yield makeMessage("system", sessionId, turn, {
99
+ subtype: "compact_error",
100
+ content: `Context compaction failed: ${errorMsg}`,
101
+ metadata: {
102
+ beforeCount, afterCount: beforeCount,
103
+ estimatedTokensBefore: compactionCheck.estimatedTokens,
104
+ threshold: compactionCheck.threshold, maxTokens: compactionCheck.maxTokens,
105
+ percentUsedBefore: compactionCheck.percentUsed, error: errorMsg,
106
+ },
107
+ });
108
+ }
109
+ }
110
+ }
111
+ // ── 3c. Build system prompt ────────────────────────────────────
112
+ let systemPrompt = effectiveSystemPrompt;
113
+ const remaining = maxTurns - turn;
114
+ 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.`;
115
+ if (config.env) {
116
+ const envLines = [];
117
+ if (config.env.cwd)
118
+ envLines.push(`Working directory: ${config.env.cwd}`);
119
+ if (config.env.platform)
120
+ envLines.push(`Platform: ${config.env.platform}`);
121
+ if (config.env.date)
122
+ envLines.push(`Date: ${config.env.date}`);
123
+ if (config.env.gitBranch)
124
+ envLines.push(`Git branch: ${config.env.gitBranch}`);
125
+ if (config.env.gitStatus)
126
+ envLines.push(`Git status: ${config.env.gitStatus}`);
127
+ if (envLines.length > 0)
128
+ systemPrompt += `\n\n<env>\n${envLines.join("\n")}\n</env>`;
129
+ }
130
+ // ── 3d. Skill injection ────────────────────────────────────────
131
+ if (config.skillLoader) {
132
+ const pending = config.skillLoader.getPendingInjection();
133
+ if (pending) {
134
+ messages.push({ role: "user", content: pending });
135
+ messages.push({ role: "assistant", content: "Skill instructions loaded." });
136
+ config.skillLoader.clearPendingInjection();
137
+ }
138
+ }
139
+ // ── 3e. Yield step_start ───────────────────────────────────────
140
+ const stepStartTime = Date.now();
141
+ yield makeMessage("step_start", sessionId, turn, { metadata: { step: turn } });
142
+ // ── 3f. Inference ──────────────────────────────────────────────
143
+ const inferenceResult = await runInference(messages, llmTools, systemPrompt, config, sessionId, turn);
144
+ for (const evt of inferenceResult.events)
145
+ yield evt;
146
+ if (!inferenceResult.succeeded) {
147
+ sessionOutcome = "error";
148
+ yield makeMessage("error", sessionId, turn, {
149
+ content: `Inference error: ${inferenceResult.lastError instanceof Error ? inferenceResult.lastError.message : String(inferenceResult.lastError)}`,
150
+ metadata: { finalMessages: messages },
151
+ });
152
+ return;
153
+ }
154
+ const response = inferenceResult.response;
155
+ // ── 3g. Yield assistant message ────────────────────────────────
156
+ yield makeMessage("assistant", sessionId, turn, {
157
+ content: response.content,
158
+ toolCalls: response.toolCalls,
159
+ metadata: { usage: response.usage, stopReason: response.stopReason },
160
+ });
161
+ // ── 3g2. Yield step_finish ─────────────────────────────────────
162
+ yield makeMessage("step_finish", sessionId, turn, {
163
+ metadata: {
164
+ stepDurationMs: Date.now() - stepStartTime,
165
+ usage: response.usage,
166
+ stopReason: response.stopReason,
167
+ toolCount: response.toolCalls?.length ?? 0,
168
+ },
169
+ });
170
+ // ── 3h. Stop condition ─────────────────────────────────────────
171
+ if (!response.toolCalls || response.toolCalls.length === 0) {
172
+ if (config.hooksEngine) {
173
+ const stopResult = await fireStop(config.hooksEngine, sessionId, response.content);
174
+ if (stopResult?.decision === "block") {
175
+ const feedback = stopResult.reason ?? "Please provide a more complete response.";
176
+ messages.push({ role: "assistant", content: response.content });
177
+ messages.push({ role: "user", content: feedback });
178
+ turn++;
179
+ continue;
180
+ }
181
+ }
182
+ if (config.hooksEngine) {
183
+ await fireSessionEnd(config.hooksEngine, sessionId, "completed", turn + 1);
184
+ }
185
+ messages.push({ role: "assistant", content: response.content });
186
+ yield makeMessage("result", sessionId, turn, {
187
+ content: response.content,
188
+ metadata: { totalTurns: turn + 1, finalMessages: messages },
189
+ });
190
+ return;
191
+ }
192
+ // ── 3i. Tool execution ─────────────────────────────────────────
193
+ const { toolResults, events: toolEvents } = await executeTools(response.toolCalls, {
194
+ sessionId,
195
+ threadId,
196
+ turn,
197
+ config,
198
+ toolMap,
199
+ hasMemoryLoader: memoryLoader !== null,
200
+ });
201
+ // Yield events emitted during tool execution (tool_start, tool_metadata)
202
+ for (const evt of toolEvents)
203
+ yield evt;
204
+ // ── 3j. Update messages ────────────────────────────────────────
205
+ messages.push({ role: "assistant", content: response.content, toolCalls: response.toolCalls });
206
+ for (const tr of toolResults) {
207
+ messages.push({ role: "tool", content: tr.content, toolCallId: tr.toolCallId, name: tr.toolName });
208
+ }
209
+ // ── 3j. TODO reminder ──────────────────────────────────────────
210
+ if (config.todoModule) {
211
+ const todoState = config.todoModule.getState();
212
+ if (todoState.todos.length > 0) {
213
+ const reminder = config.todoModule.toContextString();
214
+ messages.push({ role: "user", content: `<system-reminder>\n${reminder}\n</system-reminder>` });
215
+ messages.push({ role: "assistant", content: "Noted." });
216
+ yield makeMessage("system", sessionId, turn, { subtype: "todo_reminder", content: reminder });
217
+ }
218
+ }
219
+ // ── 3k. Yield tool_result, increment turn ──────────────────────
220
+ yield makeMessage("tool_result", sessionId, turn, { toolResults });
221
+ turn++;
222
+ }
223
+ // Post-loop: maxTurns exhausted
224
+ sessionOutcome = "budget-exceeded";
225
+ yield makeMessage("error", sessionId, turn, {
226
+ content: `Agent loop exceeded maxTurns (${maxTurns})`,
227
+ metadata: { finalMessages: messages },
228
+ });
229
+ }
230
+ catch (err) {
231
+ sessionOutcome = "error";
232
+ yield makeMessage("error", sessionId, turn, {
233
+ content: `Agent loop error: ${err instanceof Error ? err.message : String(err)}`,
234
+ metadata: { finalMessages: messages },
235
+ });
236
+ }
237
+ finally {
238
+ finalizeMemory(memoryLoader, sessionId, prompt, turn, sessionOutcome, config);
239
+ }
240
+ }
241
+ // ─── wrapWithAgentLoop ─────────────────────────────────────────────────────
242
+ export function wrapWithAgentLoop(config) {
243
+ return async (state) => {
244
+ const prompt = state.task ??
245
+ state.context ??
246
+ "";
247
+ let finalResult = "";
248
+ for await (const msg of agentLoop(prompt, config)) {
249
+ if (msg.type === "result")
250
+ finalResult = msg.content ?? "";
251
+ }
252
+ return {
253
+ agentResults: { ...(state.agentResults ?? {}), [config.agentName]: finalResult },
254
+ };
255
+ };
256
+ }
257
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/harness/loop/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ChatResponse, LLMToolDef, ONIModelMessage } from "../../models/types.js";
2
+ import type { AgentLoopConfig, LoopMessage } from "../types.js";
3
+ /** Check if an error is retryable (rate limits, transient server errors). */
4
+ export declare function isRetryableError(err: unknown): boolean;
5
+ /** Get retry delay with exponential backoff. */
6
+ export declare function getRetryDelay(err: unknown, attempt: number): number;
7
+ export interface InferenceResult {
8
+ response: ChatResponse | null;
9
+ /** Yielded messages during retries */
10
+ events: LoopMessage[];
11
+ succeeded: boolean;
12
+ lastError: unknown;
13
+ }
14
+ /**
15
+ * Run LLM inference with retry/timeout/header-aware backoff.
16
+ * Returns the response and any yield-able events (retry messages).
17
+ */
18
+ export declare function runInference(messages: ONIModelMessage[], llmTools: LLMToolDef[], systemPrompt: string, config: AgentLoopConfig, sessionId: string, turn: number): Promise<InferenceResult>;
19
+ //# sourceMappingURL=inference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inference.d.ts","sourceRoot":"","sources":["../../../src/harness/loop/inference.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAKhE,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAiBtD;AAID,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAkBnE;AAID,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,sCAAsC;IACtC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,eAAe,EAAE,EAC3B,QAAQ,EAAE,UAAU,EAAE,EACtB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,eAAe,CAAC,CAsE1B"}
@@ -0,0 +1,121 @@
1
+ // ============================================================
2
+ // @oni.bot/core/harness/loop — Inference
3
+ // LLM invocation with retry/timeout/header-aware backoff.
4
+ // ============================================================
5
+ import { makeMessage } from "./types.js";
6
+ // ─── isRetryableError ───────────────────────────────────────────────────────
7
+ /** Check if an error is retryable (rate limits, transient server errors). */
8
+ export function isRetryableError(err) {
9
+ if (err && typeof err === "object" && "isRetryable" in err) {
10
+ return !!err.isRetryable;
11
+ }
12
+ if (err && typeof err === "object") {
13
+ const status = err.status;
14
+ if (status === 429 || status === 503 || status === 502 || status === 500) {
15
+ return true;
16
+ }
17
+ }
18
+ if (err instanceof Error) {
19
+ const msg = err.message.toLowerCase();
20
+ if (msg.includes("rate limit") || msg.includes("429") || msg.includes("503") || msg.includes("overloaded")) {
21
+ return true;
22
+ }
23
+ }
24
+ return false;
25
+ }
26
+ // ─── getRetryDelay ──────────────────────────────────────────────────────────
27
+ /** Get retry delay with exponential backoff. */
28
+ export function getRetryDelay(err, attempt) {
29
+ if (err && typeof err === "object") {
30
+ // Respect retryAfterMs if provided by the model adapter
31
+ if ("retryAfterMs" in err) {
32
+ const after = err.retryAfterMs;
33
+ if (typeof after === "number" && after > 0)
34
+ return after;
35
+ }
36
+ // Check headers for retry-after-ms (common in HTTP error responses)
37
+ const headers = err.headers;
38
+ if (headers) {
39
+ const headerMs = headers["retry-after-ms"];
40
+ if (headerMs) {
41
+ const parsed = parseInt(headerMs, 10);
42
+ if (!isNaN(parsed) && parsed > 0)
43
+ return parsed;
44
+ }
45
+ }
46
+ }
47
+ return Math.min(1000 * Math.pow(2, attempt), 10_000);
48
+ }
49
+ /**
50
+ * Run LLM inference with retry/timeout/header-aware backoff.
51
+ * Returns the response and any yield-able events (retry messages).
52
+ */
53
+ export async function runInference(messages, llmTools, systemPrompt, config, sessionId, turn) {
54
+ const maxRetries = 3;
55
+ const inferenceTimeoutMs = config.inferenceTimeoutMs ?? 120_000;
56
+ const events = [];
57
+ let response = null;
58
+ let lastInferenceError = null;
59
+ let succeeded = false;
60
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
61
+ try {
62
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error(`Inference timeout after ${inferenceTimeoutMs}ms`)), inferenceTimeoutMs));
63
+ response = await Promise.race([
64
+ config.model.chat({
65
+ messages,
66
+ tools: llmTools.length > 0 ? llmTools : undefined,
67
+ systemPrompt,
68
+ maxTokens: config.maxTokens ?? 8192,
69
+ }),
70
+ timeoutPromise,
71
+ ]);
72
+ succeeded = true;
73
+ break;
74
+ }
75
+ catch (err) {
76
+ lastInferenceError = err;
77
+ const isRetryable = isRetryableError(err);
78
+ if (!isRetryable || attempt >= maxRetries) {
79
+ break;
80
+ }
81
+ // Check abort signal before retrying
82
+ if (config.signal?.aborted) {
83
+ break;
84
+ }
85
+ // Yield inference_retry so the conductor can emit events and update the UI
86
+ const delayMs = getRetryDelay(err, attempt);
87
+ events.push(makeMessage("system", sessionId, turn, {
88
+ subtype: "inference_retry",
89
+ content: `Retrying inference (attempt ${attempt + 1}/${maxRetries}): ${err instanceof Error ? err.message : String(err)}`,
90
+ metadata: {
91
+ attempt: attempt + 1,
92
+ maxRetries,
93
+ delayMs,
94
+ error: err instanceof Error ? err.message : String(err),
95
+ },
96
+ }));
97
+ if (delayMs > 0) {
98
+ // Abort-aware delay: resolve early if signal fires
99
+ await new Promise((resolve) => {
100
+ if (config.signal) {
101
+ const onAbort = () => { clearTimeout(timer); resolve(); };
102
+ if (config.signal.aborted) {
103
+ resolve();
104
+ return;
105
+ }
106
+ config.signal.addEventListener("abort", onAbort, { once: true });
107
+ const timer = setTimeout(() => {
108
+ config.signal.removeEventListener("abort", onAbort);
109
+ resolve();
110
+ }, delayMs);
111
+ }
112
+ else {
113
+ setTimeout(resolve, delayMs);
114
+ }
115
+ });
116
+ }
117
+ }
118
+ }
119
+ return { response, events, succeeded, lastError: lastInferenceError };
120
+ }
121
+ //# sourceMappingURL=inference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inference.js","sourceRoot":"","sources":["../../../src/harness/loop/inference.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { MemoryLoader } from "../memory-loader.js";
2
+ import type { AgentLoopConfig } from "../types.js";
3
+ import type { SessionOutcome } from "../types.js";
4
+ export interface MemoryInitResult {
5
+ memoryLoader: MemoryLoader | null;
6
+ memoryContext: string;
7
+ }
8
+ /**
9
+ * Initialize MemoryLoader and run wake/orient/match if configured.
10
+ * Returns the loader instance and the built system prompt prefix.
11
+ */
12
+ export declare function initMemory(prompt: string, config: AgentLoopConfig): MemoryInitResult;
13
+ /**
14
+ * buildEpisodicLog — Assemble session log for persistEpisodic().
15
+ *
16
+ * When compactor.getLastSummary() is unavailable (not yet implemented),
17
+ * ## What Happened falls back to the raw task description.
18
+ */
19
+ export declare function buildEpisodicLog(sessionId: string, taskDescription: string, turnCount: number, outcome: SessionOutcome, compactor?: import("../context-compactor.js").ContextCompactor): string;
20
+ /** Persist episodic memory and reset session state. */
21
+ export declare function finalizeMemory(memoryLoader: MemoryLoader | null, sessionId: string, prompt: string, turn: number, sessionOutcome: SessionOutcome, config: AgentLoopConfig): void;
22
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/harness/loop/memory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,gBAAgB,CAoBpF;AAUD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,OAAO,yBAAyB,EAAE,gBAAgB,GAC7D,MAAM,CAgCR;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAC5B,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,eAAe,GACtB,IAAI,CAMN"}
@@ -0,0 +1,73 @@
1
+ // ============================================================
2
+ // @oni.bot/core/harness/loop — Memory
3
+ // MemoryLoader wake/orient/match integration.
4
+ // ============================================================
5
+ import { MemoryLoader } from "../memory-loader.js";
6
+ /**
7
+ * Initialize MemoryLoader and run wake/orient/match if configured.
8
+ * Returns the loader instance and the built system prompt prefix.
9
+ */
10
+ export function initMemory(prompt, config) {
11
+ const memoryLoader = config.memoryRoot
12
+ ? MemoryLoader.fromRoot(config.memoryRoot, {
13
+ budgets: config.memoryBudgets,
14
+ debug: config.memoryDebug,
15
+ })
16
+ : null;
17
+ let memoryContext = "";
18
+ if (memoryLoader && !config.signal?.aborted) {
19
+ memoryLoader.wake();
20
+ memoryLoader.orient();
21
+ const t2 = memoryLoader.match(prompt);
22
+ if (config.memoryDebug && t2.dropped.length > 0) {
23
+ console.log(`[MemoryLoader] match() dropped ${t2.dropped.length} units over T2 budget`);
24
+ }
25
+ memoryContext = memoryLoader.buildSystemPrompt([0, 1, 2]);
26
+ }
27
+ return { memoryLoader, memoryContext };
28
+ }
29
+ /**
30
+ * buildEpisodicLog — Assemble session log for persistEpisodic().
31
+ *
32
+ * When compactor.getLastSummary() is unavailable (not yet implemented),
33
+ * ## What Happened falls back to the raw task description.
34
+ */
35
+ export function buildEpisodicLog(sessionId, taskDescription, turnCount, outcome, compactor) {
36
+ const c = compactor;
37
+ const summary = c?.getLastSummary?.() ?? null;
38
+ const openThreads = c?.getOpenThreads?.() ?? "none";
39
+ const outcomeNote = outcome === "budget-exceeded"
40
+ ? "Session ended at turn limit. Task may be incomplete — check Open Threads before assuming prior work is done."
41
+ : "";
42
+ return [
43
+ `---`,
44
+ `type: episodic`,
45
+ `session: ${sessionId}`,
46
+ `outcome: ${outcome}`,
47
+ `turns: ${turnCount}`,
48
+ `created: ${new Date().toISOString()}`,
49
+ `---`,
50
+ ``,
51
+ `## What Happened`,
52
+ summary ?? taskDescription,
53
+ ``,
54
+ `## Turns`,
55
+ String(turnCount),
56
+ ``,
57
+ `## Outcome`,
58
+ outcome,
59
+ ...(outcomeNote ? [``, outcomeNote] : []),
60
+ ``,
61
+ `## Open Threads`,
62
+ openThreads,
63
+ ].join("\n");
64
+ }
65
+ /** Persist episodic memory and reset session state. */
66
+ export function finalizeMemory(memoryLoader, sessionId, prompt, turn, sessionOutcome, config) {
67
+ if (memoryLoader) {
68
+ const log = buildEpisodicLog(sessionId, prompt, turn, sessionOutcome, config.compactor);
69
+ memoryLoader.persistEpisodic(sessionId, log);
70
+ memoryLoader.resetSession();
71
+ }
72
+ }
73
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/harness/loop/memory.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,sCAAsC;AACtC,8CAA8C;AAC9C,+DAA+D;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAWnD;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,MAAuB;IAChE,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU;QACpC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE;YACvC,OAAO,EAAE,MAAM,CAAC,aAAa;YAC7B,KAAK,EAAE,MAAM,CAAC,WAAW;SAC1B,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QAC5C,YAAY,CAAC,IAAI,EAAE,CAAC;QACpB,YAAY,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,CAAC,OAAO,CAAC,MAAM,uBAAuB,CAAC,CAAC;QAC1F,CAAC;QACD,aAAa,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;AACzC,CAAC;AAUD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,eAAuB,EACvB,SAAiB,EACjB,OAAuB,EACvB,SAA8D;IAE9D,MAAM,CAAC,GAAG,SAAwD,CAAC;IACnE,MAAM,OAAO,GAAG,CAAC,EAAE,cAAc,EAAE,EAAE,IAAI,IAAI,CAAC;IAC9C,MAAM,WAAW,GAAG,CAAC,EAAE,cAAc,EAAE,EAAE,IAAI,MAAM,CAAC;IAEpD,MAAM,WAAW,GACf,OAAO,KAAK,iBAAiB;QAC3B,CAAC,CAAC,8GAA8G;QAChH,CAAC,CAAC,EAAE,CAAC;IAET,OAAO;QACL,KAAK;QACL,gBAAgB;QAChB,YAAY,SAAS,EAAE;QACvB,YAAY,OAAO,EAAE;QACrB,UAAU,SAAS,EAAE;QACrB,YAAY,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;QACtC,KAAK;QACL,EAAE;QACF,kBAAkB;QAClB,OAAO,IAAI,eAAe;QAC1B,EAAE;QACF,UAAU;QACV,MAAM,CAAC,SAAS,CAAC;QACjB,EAAE;QACF,YAAY;QACZ,OAAO;QACP,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,EAAE;QACF,iBAAiB;QACjB,WAAW;KACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,cAAc,CAC5B,YAAiC,EACjC,SAAiB,EACjB,MAAc,EACd,IAAY,EACZ,cAA8B,EAC9B,MAAuB;IAEvB,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACxF,YAAY,CAAC,eAAe,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC7C,YAAY,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SafetyGate, SafetyCheckResult } from "../safety-gate.js";
2
+ /**
3
+ * Run a safety gate check for a tool call.
4
+ * Returns the check result, or null if no gate is configured or the tool
5
+ * does not require a check.
6
+ */
7
+ export declare function checkSafety(safetyGate: SafetyGate | undefined, toolCallId: string, toolName: string, toolArgs: Record<string, unknown>): Promise<SafetyCheckResult | null>;
8
+ //# sourceMappingURL=safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../../src/harness/loop/safety.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAIvE;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAUnC"}
@@ -0,0 +1,21 @@
1
+ // ============================================================
2
+ // @oni.bot/core/harness/loop — Safety
3
+ // SafetyGate check integration.
4
+ // ============================================================
5
+ // ─── checkSafety ────────────────────────────────────────────────────────────
6
+ /**
7
+ * Run a safety gate check for a tool call.
8
+ * Returns the check result, or null if no gate is configured or the tool
9
+ * does not require a check.
10
+ */
11
+ export async function checkSafety(safetyGate, toolCallId, toolName, toolArgs) {
12
+ if (!safetyGate || !safetyGate.requiresCheck(toolName)) {
13
+ return null;
14
+ }
15
+ return safetyGate.check({
16
+ id: toolCallId,
17
+ name: toolName,
18
+ args: toolArgs,
19
+ });
20
+ }
21
+ //# sourceMappingURL=safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../src/harness/loop/safety.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,sCAAsC;AACtC,gCAAgC;AAChC,+DAA+D;AAI/D,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAkC,EAClC,UAAkB,EAClB,QAAgB,EAChB,QAAiC;IAEjC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC;QACtB,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;KACf,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { LLMToolDef, ONIModelToolCall } from "../../models/types.js";
2
+ import type { ToolDefinition } from "../../tools/types.js";
3
+ import type { LoopToolResult, LoopMessage, AgentLoopConfig } from "../types.js";
4
+ /** Convert ToolDefinition[] to LLMToolDef[] for the model adapter. */
5
+ export declare function buildLLMTools(tools: ToolDefinition[]): LLMToolDef[];
6
+ /** Build a name → ToolDefinition lookup map. */
7
+ export declare function buildToolMap(tools: ToolDefinition[]): Map<string, ToolDefinition>;
8
+ export interface ToolExecutionContext {
9
+ sessionId: string;
10
+ threadId: string;
11
+ turn: number;
12
+ config: AgentLoopConfig;
13
+ toolMap: Map<string, ToolDefinition>;
14
+ hasMemoryLoader: boolean;
15
+ }
16
+ /**
17
+ * Execute all tool calls for a turn.
18
+ * Returns tool results and any yield-able events (tool_start, tool_metadata).
19
+ */
20
+ export declare function executeTools(toolCalls: ONIModelToolCall[], ctx: ToolExecutionContext): Promise<{
21
+ toolResults: LoopToolResult[];
22
+ events: LoopMessage[];
23
+ }>;
24
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/harness/loop/tools.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EACV,cAAc,EAEd,WAAW,EACX,eAAe,EAChB,MAAM,aAAa,CAAC;AAOrB,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,UAAU,EAAE,CAMnE;AAED,gDAAgD;AAChD,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAMjF;AAID,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACrC,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,gBAAgB,EAAE,EAC7B,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC;IAAE,WAAW,EAAE,cAAc,EAAE,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,CAsKnE"}