@illuma-ai/agents 1.1.28 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  2. package/dist/cjs/common/spawnPath.cjs +104 -0
  3. package/dist/cjs/common/spawnPath.cjs.map +1 -0
  4. package/dist/cjs/graphs/Graph.cjs +89 -45
  5. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  6. package/dist/cjs/graphs/HandoffRegistry.cjs +47 -8
  7. package/dist/cjs/graphs/HandoffRegistry.cjs.map +1 -1
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs +493 -267
  9. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  10. package/dist/cjs/graphs/phases/flushLoop.cjs +214 -0
  11. package/dist/cjs/graphs/phases/flushLoop.cjs.map +1 -0
  12. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs +102 -0
  13. package/dist/cjs/graphs/phases/memoryFlushPhase.cjs.map +1 -0
  14. package/dist/cjs/llm/bedrock/index.cjs +4 -3
  15. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  16. package/dist/cjs/main.cjs +117 -0
  17. package/dist/cjs/main.cjs.map +1 -1
  18. package/dist/cjs/memory/citations.cjs +69 -0
  19. package/dist/cjs/memory/citations.cjs.map +1 -0
  20. package/dist/cjs/memory/compositeBackend.cjs +60 -0
  21. package/dist/cjs/memory/compositeBackend.cjs.map +1 -0
  22. package/dist/cjs/memory/constants.cjs +232 -0
  23. package/dist/cjs/memory/constants.cjs.map +1 -0
  24. package/dist/cjs/memory/embeddings.cjs +151 -0
  25. package/dist/cjs/memory/embeddings.cjs.map +1 -0
  26. package/dist/cjs/memory/factory.cjs +95 -0
  27. package/dist/cjs/memory/factory.cjs.map +1 -0
  28. package/dist/cjs/memory/migrate.cjs +81 -0
  29. package/dist/cjs/memory/migrate.cjs.map +1 -0
  30. package/dist/cjs/memory/mmr.cjs +138 -0
  31. package/dist/cjs/memory/mmr.cjs.map +1 -0
  32. package/dist/cjs/memory/paths.cjs +217 -0
  33. package/dist/cjs/memory/paths.cjs.map +1 -0
  34. package/dist/cjs/memory/pgvectorStore.cjs +225 -0
  35. package/dist/cjs/memory/pgvectorStore.cjs.map +1 -0
  36. package/dist/cjs/memory/recallTracking.cjs +98 -0
  37. package/dist/cjs/memory/recallTracking.cjs.map +1 -0
  38. package/dist/cjs/memory/schema.sql +51 -0
  39. package/dist/cjs/memory/temporalDecay.cjs +118 -0
  40. package/dist/cjs/memory/temporalDecay.cjs.map +1 -0
  41. package/dist/cjs/nodes/ApprovalGateNode.cjs +1 -1
  42. package/dist/cjs/nodes/ApprovalGateNode.cjs.map +1 -1
  43. package/dist/cjs/prompts/memoryFlushPrompt.cjs +49 -0
  44. package/dist/cjs/prompts/memoryFlushPrompt.cjs.map +1 -0
  45. package/dist/cjs/run.cjs +16 -3
  46. package/dist/cjs/run.cjs.map +1 -1
  47. package/dist/cjs/tools/AskUser.cjs +6 -1
  48. package/dist/cjs/tools/AskUser.cjs.map +1 -1
  49. package/dist/cjs/tools/BrowserTools.cjs +1 -1
  50. package/dist/cjs/tools/BrowserTools.cjs.map +1 -1
  51. package/dist/cjs/tools/ToolNode.cjs +127 -10
  52. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  53. package/dist/cjs/tools/approval/constants.cjs +2 -2
  54. package/dist/cjs/tools/approval/constants.cjs.map +1 -1
  55. package/dist/cjs/tools/memory/index.cjs +58 -0
  56. package/dist/cjs/tools/memory/index.cjs.map +1 -0
  57. package/dist/cjs/tools/memory/memoryAppendTool.cjs +69 -0
  58. package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -0
  59. package/dist/cjs/tools/memory/memoryGetTool.cjs +49 -0
  60. package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -0
  61. package/dist/cjs/tools/memory/memorySearchTool.cjs +65 -0
  62. package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -0
  63. package/dist/cjs/tools/memory/shared.cjs +106 -0
  64. package/dist/cjs/tools/memory/shared.cjs.map +1 -0
  65. package/dist/cjs/types/graph.cjs.map +1 -1
  66. package/dist/cjs/utils/childAgentContext.cjs +242 -0
  67. package/dist/cjs/utils/childAgentContext.cjs.map +1 -0
  68. package/dist/cjs/utils/errors.cjs +113 -0
  69. package/dist/cjs/utils/errors.cjs.map +1 -0
  70. package/dist/cjs/utils/events.cjs +36 -7
  71. package/dist/cjs/utils/events.cjs.map +1 -1
  72. package/dist/cjs/utils/finishReasons.cjs +44 -0
  73. package/dist/cjs/utils/finishReasons.cjs.map +1 -0
  74. package/dist/cjs/utils/llm.cjs.map +1 -1
  75. package/dist/cjs/utils/logging.cjs +34 -0
  76. package/dist/cjs/utils/logging.cjs.map +1 -0
  77. package/dist/cjs/utils/toolCallNormalization.cjs +250 -0
  78. package/dist/cjs/utils/toolCallNormalization.cjs.map +1 -0
  79. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  80. package/dist/esm/common/spawnPath.mjs +95 -0
  81. package/dist/esm/common/spawnPath.mjs.map +1 -0
  82. package/dist/esm/graphs/Graph.mjs +89 -45
  83. package/dist/esm/graphs/Graph.mjs.map +1 -1
  84. package/dist/esm/graphs/HandoffRegistry.mjs +47 -8
  85. package/dist/esm/graphs/HandoffRegistry.mjs.map +1 -1
  86. package/dist/esm/graphs/MultiAgentGraph.mjs +493 -267
  87. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  88. package/dist/esm/graphs/phases/flushLoop.mjs +209 -0
  89. package/dist/esm/graphs/phases/flushLoop.mjs.map +1 -0
  90. package/dist/esm/graphs/phases/memoryFlushPhase.mjs +99 -0
  91. package/dist/esm/graphs/phases/memoryFlushPhase.mjs.map +1 -0
  92. package/dist/esm/llm/bedrock/index.mjs +4 -3
  93. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  94. package/dist/esm/main.mjs +21 -0
  95. package/dist/esm/main.mjs.map +1 -1
  96. package/dist/esm/memory/citations.mjs +64 -0
  97. package/dist/esm/memory/citations.mjs.map +1 -0
  98. package/dist/esm/memory/compositeBackend.mjs +58 -0
  99. package/dist/esm/memory/compositeBackend.mjs.map +1 -0
  100. package/dist/esm/memory/constants.mjs +198 -0
  101. package/dist/esm/memory/constants.mjs.map +1 -0
  102. package/dist/esm/memory/embeddings.mjs +148 -0
  103. package/dist/esm/memory/embeddings.mjs.map +1 -0
  104. package/dist/esm/memory/factory.mjs +93 -0
  105. package/dist/esm/memory/factory.mjs.map +1 -0
  106. package/dist/esm/memory/migrate.mjs +78 -0
  107. package/dist/esm/memory/migrate.mjs.map +1 -0
  108. package/dist/esm/memory/mmr.mjs +130 -0
  109. package/dist/esm/memory/mmr.mjs.map +1 -0
  110. package/dist/esm/memory/paths.mjs +207 -0
  111. package/dist/esm/memory/paths.mjs.map +1 -0
  112. package/dist/esm/memory/pgvectorStore.mjs +223 -0
  113. package/dist/esm/memory/pgvectorStore.mjs.map +1 -0
  114. package/dist/esm/memory/recallTracking.mjs +94 -0
  115. package/dist/esm/memory/recallTracking.mjs.map +1 -0
  116. package/dist/esm/memory/schema.sql +51 -0
  117. package/dist/esm/memory/temporalDecay.mjs +110 -0
  118. package/dist/esm/memory/temporalDecay.mjs.map +1 -0
  119. package/dist/esm/nodes/ApprovalGateNode.mjs +1 -1
  120. package/dist/esm/nodes/ApprovalGateNode.mjs.map +1 -1
  121. package/dist/esm/prompts/memoryFlushPrompt.mjs +44 -0
  122. package/dist/esm/prompts/memoryFlushPrompt.mjs.map +1 -0
  123. package/dist/esm/run.mjs +16 -3
  124. package/dist/esm/run.mjs.map +1 -1
  125. package/dist/esm/tools/AskUser.mjs +6 -1
  126. package/dist/esm/tools/AskUser.mjs.map +1 -1
  127. package/dist/esm/tools/BrowserTools.mjs +1 -1
  128. package/dist/esm/tools/BrowserTools.mjs.map +1 -1
  129. package/dist/esm/tools/ToolNode.mjs +128 -11
  130. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  131. package/dist/esm/tools/approval/constants.mjs +2 -2
  132. package/dist/esm/tools/approval/constants.mjs.map +1 -1
  133. package/dist/esm/tools/memory/index.mjs +46 -0
  134. package/dist/esm/tools/memory/index.mjs.map +1 -0
  135. package/dist/esm/tools/memory/memoryAppendTool.mjs +67 -0
  136. package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -0
  137. package/dist/esm/tools/memory/memoryGetTool.mjs +47 -0
  138. package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -0
  139. package/dist/esm/tools/memory/memorySearchTool.mjs +63 -0
  140. package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -0
  141. package/dist/esm/tools/memory/shared.mjs +98 -0
  142. package/dist/esm/tools/memory/shared.mjs.map +1 -0
  143. package/dist/esm/types/graph.mjs.map +1 -1
  144. package/dist/esm/utils/childAgentContext.mjs +237 -0
  145. package/dist/esm/utils/childAgentContext.mjs.map +1 -0
  146. package/dist/esm/utils/errors.mjs +109 -0
  147. package/dist/esm/utils/errors.mjs.map +1 -0
  148. package/dist/esm/utils/events.mjs +36 -8
  149. package/dist/esm/utils/events.mjs.map +1 -1
  150. package/dist/esm/utils/finishReasons.mjs +41 -0
  151. package/dist/esm/utils/finishReasons.mjs.map +1 -0
  152. package/dist/esm/utils/llm.mjs.map +1 -1
  153. package/dist/esm/utils/logging.mjs +31 -0
  154. package/dist/esm/utils/logging.mjs.map +1 -0
  155. package/dist/esm/utils/toolCallNormalization.mjs +247 -0
  156. package/dist/esm/utils/toolCallNormalization.mjs.map +1 -0
  157. package/dist/types/common/index.d.ts +1 -0
  158. package/dist/types/common/spawnPath.d.ts +59 -0
  159. package/dist/types/graphs/HandoffRegistry.d.ts +24 -7
  160. package/dist/types/graphs/MultiAgentGraph.d.ts +43 -23
  161. package/dist/types/graphs/phases/flushLoop.d.ts +106 -0
  162. package/dist/types/graphs/phases/memoryFlushPhase.d.ts +100 -0
  163. package/dist/types/index.d.ts +7 -0
  164. package/dist/types/memory/__tests__/mockBackend.d.ts +40 -0
  165. package/dist/types/memory/citations.d.ts +39 -0
  166. package/dist/types/memory/compositeBackend.d.ts +30 -0
  167. package/dist/types/memory/constants.d.ts +121 -0
  168. package/dist/types/memory/embeddings.d.ts +15 -0
  169. package/dist/types/memory/factory.d.ts +23 -0
  170. package/dist/types/memory/index.d.ts +21 -0
  171. package/dist/types/memory/migrate.d.ts +14 -0
  172. package/dist/types/memory/mmr.d.ts +50 -0
  173. package/dist/types/memory/paths.d.ts +107 -0
  174. package/dist/types/memory/pgvectorStore.d.ts +56 -0
  175. package/dist/types/memory/recallTracking.d.ts +30 -0
  176. package/dist/types/memory/temporalDecay.d.ts +53 -0
  177. package/dist/types/memory/types.d.ts +182 -0
  178. package/dist/types/prompts/memoryFlushPrompt.d.ts +54 -0
  179. package/dist/types/run.d.ts +1 -0
  180. package/dist/types/tools/AskUser.d.ts +1 -1
  181. package/dist/types/tools/BrowserTools.d.ts +2 -2
  182. package/dist/types/tools/approval/constants.d.ts +2 -2
  183. package/dist/types/tools/memory/index.d.ts +39 -0
  184. package/dist/types/tools/memory/memoryAppendTool.d.ts +27 -0
  185. package/dist/types/tools/memory/memoryGetTool.d.ts +22 -0
  186. package/dist/types/tools/memory/memorySearchTool.d.ts +22 -0
  187. package/dist/types/tools/memory/shared.d.ts +106 -0
  188. package/dist/types/types/graph.d.ts +10 -3
  189. package/dist/types/utils/childAgentContext.d.ts +99 -0
  190. package/dist/types/utils/errors.d.ts +37 -0
  191. package/dist/types/utils/events.d.ts +21 -0
  192. package/dist/types/utils/finishReasons.d.ts +32 -0
  193. package/dist/types/utils/index.d.ts +1 -0
  194. package/dist/types/utils/logging.d.ts +2 -0
  195. package/dist/types/utils/toolCallNormalization.d.ts +44 -0
  196. package/package.json +6 -4
  197. package/src/agents/AgentContext.ts +12 -4
  198. package/src/common/__tests__/enum.test.ts +4 -2
  199. package/src/common/__tests__/spawnPath.test.ts +110 -0
  200. package/src/common/index.ts +1 -0
  201. package/src/common/spawnPath.ts +101 -0
  202. package/src/graphs/Graph.ts +95 -61
  203. package/src/graphs/HandoffRegistry.ts +48 -17
  204. package/src/graphs/MultiAgentGraph.ts +588 -327
  205. package/src/graphs/__tests__/HandoffRegistry.test.ts +4 -1
  206. package/src/graphs/__tests__/multi-agent-delegate.test.ts +61 -16
  207. package/src/graphs/__tests__/multi-agent-edges.test.ts +4 -2
  208. package/src/graphs/__tests__/multi-agent-nested-subgraph.test.ts +221 -0
  209. package/src/graphs/__tests__/structured-output.integration.test.ts +212 -118
  210. package/src/graphs/contextManagement.e2e.test.ts +1 -1
  211. package/src/graphs/phases/__tests__/flushLoop.test.ts +264 -0
  212. package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +37 -0
  213. package/src/graphs/phases/__tests__/runMemoryFlush.test.ts +150 -0
  214. package/src/graphs/phases/flushLoop.ts +303 -0
  215. package/src/graphs/phases/memoryFlushPhase.ts +209 -0
  216. package/src/index.ts +30 -1
  217. package/src/llm/bedrock/index.ts +4 -5
  218. package/src/memory/__tests__/citations.test.ts +61 -0
  219. package/src/memory/__tests__/compositeBackend.test.ts +79 -0
  220. package/src/memory/__tests__/isolation.test.ts +206 -0
  221. package/src/memory/__tests__/mmr.test.ts +148 -0
  222. package/src/memory/__tests__/mockBackend.ts +161 -0
  223. package/src/memory/__tests__/paths.test.ts +168 -0
  224. package/src/memory/__tests__/recallTracking.test.ts +96 -0
  225. package/src/memory/__tests__/temporalDecay.test.ts +151 -0
  226. package/src/memory/citations.ts +80 -0
  227. package/src/memory/compositeBackend.ts +99 -0
  228. package/src/memory/constants.ts +229 -0
  229. package/src/memory/embeddings.ts +188 -0
  230. package/src/memory/factory.ts +111 -0
  231. package/src/memory/index.ts +46 -0
  232. package/src/memory/migrate.ts +116 -0
  233. package/src/memory/mmr.ts +161 -0
  234. package/src/memory/paths.ts +258 -0
  235. package/src/memory/pgvectorStore.ts +324 -0
  236. package/src/memory/recallTracking.ts +127 -0
  237. package/src/memory/schema.sql +51 -0
  238. package/src/memory/temporalDecay.ts +134 -0
  239. package/src/memory/types.ts +185 -0
  240. package/src/nodes/ApprovalGateNode.ts +4 -10
  241. package/src/nodes/__tests__/ApprovalGateNode.test.ts +11 -20
  242. package/src/prompts/memoryFlushPrompt.ts +78 -0
  243. package/src/run.ts +17 -6
  244. package/src/scripts/test-bedrock-handoff-autonomous.ts +56 -20
  245. package/src/specs/agent-handoffs-bedrock.integration.test.ts +8 -5
  246. package/src/specs/agent-handoffs.test.ts +8 -2
  247. package/src/tools/AskUser.ts +7 -2
  248. package/src/tools/BrowserTools.ts +3 -5
  249. package/src/tools/ToolNode.ts +150 -13
  250. package/src/tools/__tests__/ToolApproval.test.ts +22 -9
  251. package/src/tools/approval/__tests__/constants.test.ts +1 -1
  252. package/src/tools/approval/constants.ts +2 -2
  253. package/src/tools/memory/__tests__/memoryTools.test.ts +205 -0
  254. package/src/tools/memory/index.ts +96 -0
  255. package/src/tools/memory/memoryAppendTool.ts +101 -0
  256. package/src/tools/memory/memoryGetTool.ts +53 -0
  257. package/src/tools/memory/memorySearchTool.ts +80 -0
  258. package/src/tools/memory/shared.ts +169 -0
  259. package/src/tools/search/search.test.ts +6 -1
  260. package/src/types/graph.ts +10 -3
  261. package/src/utils/__tests__/childAgentContext.test.ts +217 -0
  262. package/src/utils/__tests__/errors.test.ts +136 -0
  263. package/src/utils/__tests__/finishReasons.test.ts +55 -0
  264. package/src/utils/__tests__/toolCallNormalization.test.ts +181 -0
  265. package/src/utils/childAgentContext.ts +259 -0
  266. package/src/utils/errors.ts +115 -0
  267. package/src/utils/events.ts +37 -7
  268. package/src/utils/finishReasons.ts +40 -0
  269. package/src/utils/index.ts +1 -0
  270. package/src/utils/llm.ts +0 -1
  271. package/src/utils/logging.ts +45 -8
  272. package/src/utils/toolCallNormalization.ts +271 -0
@@ -29,10 +29,14 @@ var contextPressure = require('../utils/contextPressure.cjs');
29
29
  var toolDiscoveryCache = require('../utils/toolDiscoveryCache.cjs');
30
30
  var pruneCalibration = require('../utils/pruneCalibration.cjs');
31
31
  var fileManifest = require('../utils/fileManifest.cjs');
32
+ var errors = require('../utils/errors.cjs');
32
33
  var providers = require('../llm/providers.cjs');
33
34
  var ToolNode = require('../tools/ToolNode.cjs');
34
35
  var index = require('../llm/openai/index.cjs');
35
36
  var events = require('../utils/events.cjs');
37
+ var logging = require('../utils/logging.cjs');
38
+ var toolCallNormalization = require('../utils/toolCallNormalization.cjs');
39
+ var finishReasons = require('../utils/finishReasons.cjs');
36
40
  var schema = require('../tools/schema.cjs');
37
41
  var validate = require('../schemas/validate.cjs');
38
42
  var AgentContext = require('../agents/AgentContext.cjs');
@@ -797,7 +801,7 @@ class StandardGraph extends Graph {
797
801
  const resolved = agentContext.resolveStructuredOutputMode();
798
802
  method = resolved.method;
799
803
  if (resolved.warnings.length > 0) {
800
- console.warn('[Graph] Structured output mode warnings:', resolved.warnings);
804
+ logging.mwarn('[Graph] Structured output mode warnings:', resolved.warnings);
801
805
  }
802
806
  }
803
807
  else {
@@ -820,7 +824,7 @@ class StandardGraph extends Graph {
820
824
  const { schema: prepared, warnings } = validate.prepareSchemaForProvider(schema, provider, structuredOutputConfig.strict !== false);
821
825
  preparedSchema = prepared;
822
826
  if (warnings.length > 0) {
823
- console.warn('[Graph] Schema preparation warnings:', warnings);
827
+ logging.mwarn('[Graph] Schema preparation warnings:', warnings);
824
828
  }
825
829
  }
826
830
  // Use withStructuredOutput to bind the schema
@@ -890,7 +894,7 @@ class StandardGraph extends Graph {
890
894
  const errorMessage = typeof handleErrors === 'string'
891
895
  ? handleErrors
892
896
  : `The response did not match the expected schema. Error: ${lastError.message}. Please try again with a valid response.`;
893
- console.warn(`[Graph] Structured output attempt ${attempts} failed: ${lastError.message}. Retrying...`);
897
+ logging.mwarn(`[Graph] Structured output attempt ${attempts} failed: ${lastError.message}. Retrying...`);
894
898
  // Add the error as a human message for context
895
899
  finalMessages = [
896
900
  ...finalMessages,
@@ -1040,7 +1044,7 @@ class StandardGraph extends Graph {
1040
1044
  const cachedDiscoveries = this._toolDiscoveryCache.getNewDiscoveries(messages$1);
1041
1045
  if (cachedDiscoveries.length > 0) {
1042
1046
  agentContext.markToolsAsDiscovered(cachedDiscoveries);
1043
- console.debug(`[Graph:ToolDiscovery] Cached ${cachedDiscoveries.length} new tools (total: ${this._toolDiscoveryCache.size})`);
1047
+ logging.mlog(`[Graph:ToolDiscovery] Cached ${cachedDiscoveries.length} new tools (total: ${this._toolDiscoveryCache.size})`);
1044
1048
  }
1045
1049
  const toolsForBinding = agentContext.getToolsForBinding();
1046
1050
  // PERF: Detect subsequent ReAct iterations (tool results present in messages)
@@ -1059,8 +1063,8 @@ class StandardGraph extends Graph {
1059
1063
  clientOptions: effectiveClientOptions,
1060
1064
  });
1061
1065
  // DEBUG: Log which model and tools each agent uses during handoff
1062
- console.debug(`[createCallModel] Agent "${agentId}" invoking LLM | provider=${agentContext.provider} | ` +
1063
- `model=${effectiveClientOptions?.model ?? 'default'} | ` +
1066
+ logging.mlog(`[createCallModel] Agent "${agentId}" invoking LLM | provider=${agentContext.provider} | ` +
1067
+ `model=${effectiveClientOptions.model ?? 'default'} | ` +
1064
1068
  `toolsForBinding=${toolsForBinding?.length ?? 0} | ` +
1065
1069
  `toolNames=[${(toolsForBinding ?? []).map((t) => t.name ?? 'unknown').join(', ')}]`);
1066
1070
  if (agentContext.systemRunnable) {
@@ -1072,7 +1076,15 @@ class StandardGraph extends Graph {
1072
1076
  if (!config.signal) {
1073
1077
  config.signal = this.signal;
1074
1078
  }
1075
- this.config = config;
1079
+ // First-writer-wins: `this.config` is used ONLY as a "has a run started"
1080
+ // existence flag by the dispatch* methods (they never read its value —
1081
+ // they read the current RunnableConfig from LangChain AsyncLocalStorage).
1082
+ // Unconditionally reassigning here races across concurrent child
1083
+ // subgraph.invoke() calls under parallel multi-agent handoffs; the last
1084
+ // writer wins, and any dispatch firing between writes would historically
1085
+ // have been tagged with the wrong child's metadata. Keeping the first
1086
+ // write pinned makes this a true flag, eliminating the race.
1087
+ this.config ??= config;
1076
1088
  let messagesToUse = messages$1;
1077
1089
  // ====================================================================
1078
1090
  // PRE-PRUNING DELEGATION CHECK
@@ -1138,13 +1150,13 @@ class StandardGraph extends Graph {
1138
1150
  const oldMessages = messages$1.slice(messages$1[0]?.getType() === 'system' ? 1 : 0, Math.max(1, messages$1.length - recentTurnCount));
1139
1151
  if (oldMessages.length > 0) {
1140
1152
  this._summaryInFlight = true;
1141
- console.debug(`[Graph:ProactiveSummary] Context at ${utilization.toFixed(1)}% (threshold ${threshold}%) — summarizing ${oldMessages.length} older msgs in background`);
1153
+ logging.mlog(`[Graph:ProactiveSummary] Context at ${utilization.toFixed(1)}% (threshold ${threshold}%) — summarizing ${oldMessages.length} older msgs in background`);
1142
1154
  agentContext
1143
1155
  .summarizeCallback(oldMessages)
1144
1156
  .then((updated) => {
1145
1157
  if (updated != null && updated !== '') {
1146
1158
  this._cachedRunSummary = updated;
1147
- console.debug(`[Graph:ProactiveSummary] Background summary ready (len=${updated.length})`);
1159
+ logging.mlog(`[Graph:ProactiveSummary] Background summary ready (len=${updated.length})`);
1148
1160
  }
1149
1161
  })
1150
1162
  .catch((err) => {
@@ -1320,7 +1332,7 @@ class StandardGraph extends Graph {
1320
1332
  viewIdx++;
1321
1333
  }
1322
1334
  agentContext.indexTokenCountMap = viewTokenMap;
1323
- console.debug(`[Graph:Compaction] ${messages$1.length}→${viewParts.length} msgs | ` +
1335
+ logging.mlog(`[Graph:Compaction] ${messages$1.length}→${viewParts.length} msgs | ` +
1324
1336
  `compacted=${compactedMessages.length} window=${recentMessages.length} | ` +
1325
1337
  `summary=${summarySource} | budget=${usedTokens}/${recentBudget}` +
1326
1338
  (fileManifestTokens > 0
@@ -1334,7 +1346,7 @@ class StandardGraph extends Graph {
1334
1346
  if (shouldSummarize) {
1335
1347
  if (this._summaryInFlight) {
1336
1348
  this._pendingMessagesToRefine.push(...compactedMessages);
1337
- console.debug(`[Graph:Compaction] Summary in-flight, queued ${compactedMessages.length} msgs (pending=${this._pendingMessagesToRefine.length})`);
1349
+ logging.mlog(`[Graph:Compaction] Summary in-flight, queued ${compactedMessages.length} msgs (pending=${this._pendingMessagesToRefine.length})`);
1338
1350
  }
1339
1351
  else {
1340
1352
  this._summaryInFlight = true;
@@ -1375,7 +1387,7 @@ class StandardGraph extends Graph {
1375
1387
  const { messages: dedupedMessages, removedCount } = dedup.deduplicateSystemMessages(messagesToUse);
1376
1388
  if (removedCount > 0) {
1377
1389
  messagesToUse = dedupedMessages;
1378
- console.debug(`[Graph:Dedup] Removed ${removedCount} duplicate system message(s)`);
1390
+ logging.mlog(`[Graph:Dedup] Removed ${removedCount} duplicate system message(s)`);
1379
1391
  }
1380
1392
  let finalMessages = messagesToUse;
1381
1393
  if (agentContext.useLegacyContent) {
@@ -1539,18 +1551,12 @@ class StandardGraph extends Graph {
1539
1551
  }, config);
1540
1552
  }
1541
1553
  catch (primaryError) {
1542
- // Check if this is a "input too long" error from Bedrock/Anthropic
1543
- const errorMessage = primaryError.message.toLowerCase();
1544
- const isInputTooLongError = errorMessage.includes('too long') ||
1545
- errorMessage.includes('input is too long') ||
1546
- errorMessage.includes('context length') ||
1547
- errorMessage.includes('maximum context') ||
1548
- errorMessage.includes('validationexception') ||
1549
- errorMessage.includes('prompt is too long');
1554
+ const errorMessage = primaryError.message;
1555
+ const isInputTooLongError = errors.isLikelyContextOverflowError(errorMessage);
1550
1556
  // Log when we detect the error
1551
1557
  if (isInputTooLongError) {
1552
- console.warn('[Graph] Detected input too long error:', errorMessage.substring(0, 200));
1553
- console.warn('[Graph] Checking emergency pruning conditions:', {
1558
+ logging.mwarn('[Graph] Detected input too long error:', errorMessage.substring(0, 200));
1559
+ logging.mwarn('[Graph] Checking emergency pruning conditions:', {
1554
1560
  hasPruneMessages: !!agentContext.pruneMessages,
1555
1561
  hasTokenCounter: !!agentContext.tokenCounter,
1556
1562
  maxContextTokens: agentContext.maxContextTokens,
@@ -1570,12 +1576,12 @@ class StandardGraph extends Graph {
1570
1576
  if (result)
1571
1577
  break; // Exit if we got a result
1572
1578
  const reducedMaxTokens = Math.floor(agentContext.maxContextTokens * reductionFactor);
1573
- console.warn(`[Graph] Input too long. Retrying with ${reductionFactor * 100}% context (${reducedMaxTokens} tokens)...`);
1579
+ logging.mwarn(`[Graph] Input too long. Retrying with ${reductionFactor * 100}% context (${reducedMaxTokens} tokens)...`);
1574
1580
  // Build fresh indexTokenCountMap if missing/incomplete
1575
1581
  // This is needed when messages were dynamically added without updating the token map
1576
1582
  let tokenMapForPruning = agentContext.indexTokenCountMap;
1577
1583
  if (Object.keys(tokenMapForPruning).length < messages$1.length) {
1578
- console.warn('[Graph] Building fresh token count map for emergency pruning...');
1584
+ logging.mwarn('[Graph] Building fresh token count map for emergency pruning...');
1579
1585
  tokenMapForPruning = {};
1580
1586
  for (let i = 0; i < messages$1.length; i++) {
1581
1587
  tokenMapForPruning[i] = agentContext.tokenCounter(messages$1[i]);
@@ -1595,7 +1601,7 @@ class StandardGraph extends Graph {
1595
1601
  });
1596
1602
  // Skip if we can't fit any messages
1597
1603
  if (reducedMessages.length === 0) {
1598
- console.warn(`[Graph] Cannot fit any messages at ${reductionFactor * 100}% reduction, trying next level...`);
1604
+ logging.mwarn(`[Graph] Cannot fit any messages at ${reductionFactor * 100}% reduction, trying next level...`);
1599
1605
  continue;
1600
1606
  }
1601
1607
  // Calculate how many messages were pruned and estimate context timeframe
@@ -1650,12 +1656,10 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
1650
1656
  console.info(`[Graph] ✅ Retry successful at ${reductionFactor * 100}% with ${reducedMessages.length} messages (reduced from ${finalMessages.length})`);
1651
1657
  }
1652
1658
  catch (retryError) {
1653
- const retryErrorMsg = retryError.message.toLowerCase();
1654
- const stillTooLong = retryErrorMsg.includes('too long') ||
1655
- retryErrorMsg.includes('context length') ||
1656
- retryErrorMsg.includes('validationexception');
1659
+ const retryErrorMsg = retryError.message;
1660
+ const stillTooLong = errors.isLikelyContextOverflowError(retryErrorMsg);
1657
1661
  if (stillTooLong && reductionFactor > 0.1) {
1658
- console.warn(`[Graph] Still too long at ${reductionFactor * 100}%, trying more aggressive pruning...`);
1662
+ logging.mwarn(`[Graph] Still too long at ${reductionFactor * 100}%, trying more aggressive pruning...`);
1659
1663
  }
1660
1664
  else {
1661
1665
  console.error(`[Graph] Retry at ${reductionFactor * 100}% failed:`, retryError.message);
@@ -1715,6 +1719,20 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
1715
1719
  * handled everything — both paths become no-ops.
1716
1720
  */
1717
1721
  const responseMessage = result.messages?.[0];
1722
+ // Tool-call name normalization — catches LLM output that names tools
1723
+ // with wrong delimiters (outlook/operations), prefixes
1724
+ // (functions.outlook_operations), case drift, counter suffixes, or
1725
+ // empty names recoverable from the tool_call id. Mutates in place so
1726
+ // the downstream ToolNode dispatch sees the corrected names.
1727
+ if (responseMessage && agentContext.toolMap) {
1728
+ const allowedNames = new Set(Object.keys(agentContext.toolMap));
1729
+ if (allowedNames.size > 0) {
1730
+ const rewrote = toolCallNormalization.normalizeMessageToolCalls(responseMessage, allowedNames);
1731
+ if (rewrote) {
1732
+ logging.mlog(`[Graph] normalized tool_call names on agent "${agentId}" response`);
1733
+ }
1734
+ }
1735
+ }
1718
1736
  const toolCalls = responseMessage
1719
1737
  ?.tool_calls;
1720
1738
  const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;
@@ -1801,12 +1819,20 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
1801
1819
  const meta = finalMsg.response_metadata;
1802
1820
  // Bedrock streaming nests stopReason inside messageStop: { stopReason: '...' }
1803
1821
  const messageStop = meta.messageStop;
1804
- this.lastFinishReason =
1805
- meta.finish_reason ?? // OpenAI/Azure
1806
- meta.stop_reason ?? // Anthropic direct API
1807
- meta.stopReason ?? // Bedrock invoke (non-streaming)
1808
- messageStop?.stopReason ?? // Bedrock streaming
1809
- meta.finishReason; // VertexAI/Google
1822
+ const nextReason = meta.finish_reason ?? // OpenAI/Azure
1823
+ meta.stop_reason ?? // Anthropic direct API
1824
+ meta.stopReason ?? // Bedrock invoke (non-streaming)
1825
+ messageStop?.stopReason ?? // Bedrock streaming
1826
+ meta.finishReason; // VertexAI/Google
1827
+ // Sticky on truncation: a single Graph instance is reused across
1828
+ // every scoped-subgraph inner node invocation (see MultiAgentGraph
1829
+ // buildScopedSubgraph). If an earlier inner node hit max_tokens
1830
+ // but a later inner node finished cleanly, the host's continuation layer
1831
+ // would miss the truncation signal unless we preserve it. Keep the
1832
+ // truncation reason pinned so the outer caller can retry.
1833
+ if (!finishReasons.isTruncationReason(this.lastFinishReason)) {
1834
+ this.lastFinishReason = nextReason;
1835
+ }
1810
1836
  }
1811
1837
  this.cleanupSignalListener();
1812
1838
  // DEFERRED STRUCTURED OUTPUT: When the agent has tools AND structured output configured,
@@ -1854,7 +1880,7 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
1854
1880
  // but we couldn't format the output as structured JSON.
1855
1881
  // Return the unstructured text response from attemptInvoke.
1856
1882
  console.error('[Graph] Deferred structured output failed after successful tool use:', structuredError);
1857
- console.warn('[Graph] Falling back to unstructured response from tool-use phase');
1883
+ logging.mwarn('[Graph] Falling back to unstructured response from tool-use phase');
1858
1884
  return result;
1859
1885
  }
1860
1886
  }
@@ -1870,7 +1896,10 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
1870
1896
  const agentNode = `${AGENT}${agentId}`;
1871
1897
  const toolNode = `${TOOLS}${agentId}`;
1872
1898
  const routeMessage = (state, config) => {
1873
- this.config = config;
1899
+ // First-writer-wins — see note in createCallModel. `this.config` is an
1900
+ // existence flag only; assigning unconditionally would race under
1901
+ // parallel child subgraph.invoke().
1902
+ this.config ??= config;
1874
1903
  return ToolNode.toolsCondition(state, toolNode, this.invokedToolIds);
1875
1904
  };
1876
1905
  const StateAnnotation = langgraph.Annotation.Root({
@@ -1908,10 +1937,16 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
1908
1937
  default: () => [],
1909
1938
  }),
1910
1939
  });
1940
+ // Pass compileOptions (including the HITL checkpointer) to the OUTER
1941
+ // workflow — not just the inner agent subgraph. hasInterrupts() calls
1942
+ // getState() on the outer compiled graph; without a checkpointer here,
1943
+ // getState reports zero tasks and the HITL interrupt/resume loop breaks
1944
+ // out immediately even though interrupt() fired correctly inside the
1945
+ // agent subgraph.
1911
1946
  const workflow = new langgraph.StateGraph(StateAnnotation)
1912
1947
  .addNode(this.defaultAgentId, agentNode, { ends: [langgraph.END] })
1913
1948
  .addEdge(langgraph.START, this.defaultAgentId)
1914
- .compile();
1949
+ .compile(this.compileOptions);
1915
1950
  return workflow;
1916
1951
  }
1917
1952
  /**
@@ -1982,12 +2017,16 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
1982
2017
  }
1983
2018
  catch (_e) {
1984
2019
  /** If we can't get agent context, that's okay - agentId remains undefined */
1985
- console.debug(`[dispatchRunStep] Could not resolve agentId from metadata.langgraph_node="${metadata.langgraph_node}": ${_e.message}`);
2020
+ logging.mlog(`[dispatchRunStep] Could not resolve agentId from metadata.langgraph_node="${metadata.langgraph_node}": ${_e.message}`);
1986
2021
  }
1987
2022
  }
1988
2023
  this.contentData.push(runStep);
1989
2024
  this.contentIndexMap.set(stepId, runStep.index);
1990
- await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_RUN_STEP, runStep, this.config);
2025
+ // Pass undefined so safeDispatchCustomEvent resolves the runnable config
2026
+ // from LangChain's AsyncLocalStorage. Using the shared `this.config` would
2027
+ // race across concurrent child subgraph.invoke calls under parallel
2028
+ // multi-agent handoffs and tag events with the wrong child's spawnKey.
2029
+ await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_RUN_STEP, runStep);
1991
2030
  return stepId;
1992
2031
  }
1993
2032
  async handleToolCallCompleted(data, metadata, omitOutput) {
@@ -2095,7 +2134,7 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
2095
2134
  throw new Error('No config provided');
2096
2135
  }
2097
2136
  if (!data.id) {
2098
- console.warn('No Tool ID provided for Tool Error');
2137
+ logging.mwarn('No Tool ID provided for Tool Error');
2099
2138
  return;
2100
2139
  }
2101
2140
  const stepId = graph.toolCallStepIds.get(data.id) ?? '';
@@ -2143,7 +2182,10 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
2143
2182
  id,
2144
2183
  delta,
2145
2184
  };
2146
- await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_RUN_STEP_DELTA, runStepDelta, this.config);
2185
+ // See dispatchRunStep note: do not pass `this.config`. The implicit
2186
+ // AsyncLocalStorage config is the correct per-async-branch source under
2187
+ // parallel handoffs.
2188
+ await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_RUN_STEP_DELTA, runStepDelta);
2147
2189
  }
2148
2190
  async dispatchMessageDelta(id, delta) {
2149
2191
  if (!this.config) {
@@ -2153,7 +2195,8 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
2153
2195
  id,
2154
2196
  delta,
2155
2197
  };
2156
- await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_MESSAGE_DELTA, messageDelta, this.config);
2198
+ // See dispatchRunStep note.
2199
+ await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_MESSAGE_DELTA, messageDelta);
2157
2200
  }
2158
2201
  dispatchReasoningDelta = async (stepId, delta) => {
2159
2202
  if (!this.config) {
@@ -2163,7 +2206,8 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
2163
2206
  id: stepId,
2164
2207
  delta,
2165
2208
  };
2166
- await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_REASONING_DELTA, reasoningDelta, this.config);
2209
+ // See dispatchRunStep note.
2210
+ await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_REASONING_DELTA, reasoningDelta);
2167
2211
  };
2168
2212
  }
2169
2213