@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.
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/spawnPath.cjs +104 -0
- package/dist/cjs/common/spawnPath.cjs.map +1 -0
- package/dist/cjs/graphs/Graph.cjs +89 -45
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/HandoffRegistry.cjs +47 -8
- package/dist/cjs/graphs/HandoffRegistry.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +493 -267
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/graphs/phases/flushLoop.cjs +214 -0
- package/dist/cjs/graphs/phases/flushLoop.cjs.map +1 -0
- package/dist/cjs/graphs/phases/memoryFlushPhase.cjs +102 -0
- package/dist/cjs/graphs/phases/memoryFlushPhase.cjs.map +1 -0
- package/dist/cjs/llm/bedrock/index.cjs +4 -3
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +117 -0
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/memory/citations.cjs +69 -0
- package/dist/cjs/memory/citations.cjs.map +1 -0
- package/dist/cjs/memory/compositeBackend.cjs +60 -0
- package/dist/cjs/memory/compositeBackend.cjs.map +1 -0
- package/dist/cjs/memory/constants.cjs +232 -0
- package/dist/cjs/memory/constants.cjs.map +1 -0
- package/dist/cjs/memory/embeddings.cjs +151 -0
- package/dist/cjs/memory/embeddings.cjs.map +1 -0
- package/dist/cjs/memory/factory.cjs +95 -0
- package/dist/cjs/memory/factory.cjs.map +1 -0
- package/dist/cjs/memory/migrate.cjs +81 -0
- package/dist/cjs/memory/migrate.cjs.map +1 -0
- package/dist/cjs/memory/mmr.cjs +138 -0
- package/dist/cjs/memory/mmr.cjs.map +1 -0
- package/dist/cjs/memory/paths.cjs +217 -0
- package/dist/cjs/memory/paths.cjs.map +1 -0
- package/dist/cjs/memory/pgvectorStore.cjs +225 -0
- package/dist/cjs/memory/pgvectorStore.cjs.map +1 -0
- package/dist/cjs/memory/recallTracking.cjs +98 -0
- package/dist/cjs/memory/recallTracking.cjs.map +1 -0
- package/dist/cjs/memory/schema.sql +51 -0
- package/dist/cjs/memory/temporalDecay.cjs +118 -0
- package/dist/cjs/memory/temporalDecay.cjs.map +1 -0
- package/dist/cjs/nodes/ApprovalGateNode.cjs +1 -1
- package/dist/cjs/nodes/ApprovalGateNode.cjs.map +1 -1
- package/dist/cjs/prompts/memoryFlushPrompt.cjs +49 -0
- package/dist/cjs/prompts/memoryFlushPrompt.cjs.map +1 -0
- package/dist/cjs/run.cjs +16 -3
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/tools/AskUser.cjs +6 -1
- package/dist/cjs/tools/AskUser.cjs.map +1 -1
- package/dist/cjs/tools/BrowserTools.cjs +1 -1
- package/dist/cjs/tools/BrowserTools.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +127 -10
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/approval/constants.cjs +2 -2
- package/dist/cjs/tools/approval/constants.cjs.map +1 -1
- package/dist/cjs/tools/memory/index.cjs +58 -0
- package/dist/cjs/tools/memory/index.cjs.map +1 -0
- package/dist/cjs/tools/memory/memoryAppendTool.cjs +69 -0
- package/dist/cjs/tools/memory/memoryAppendTool.cjs.map +1 -0
- package/dist/cjs/tools/memory/memoryGetTool.cjs +49 -0
- package/dist/cjs/tools/memory/memoryGetTool.cjs.map +1 -0
- package/dist/cjs/tools/memory/memorySearchTool.cjs +65 -0
- package/dist/cjs/tools/memory/memorySearchTool.cjs.map +1 -0
- package/dist/cjs/tools/memory/shared.cjs +106 -0
- package/dist/cjs/tools/memory/shared.cjs.map +1 -0
- package/dist/cjs/types/graph.cjs.map +1 -1
- package/dist/cjs/utils/childAgentContext.cjs +242 -0
- package/dist/cjs/utils/childAgentContext.cjs.map +1 -0
- package/dist/cjs/utils/errors.cjs +113 -0
- package/dist/cjs/utils/errors.cjs.map +1 -0
- package/dist/cjs/utils/events.cjs +36 -7
- package/dist/cjs/utils/events.cjs.map +1 -1
- package/dist/cjs/utils/finishReasons.cjs +44 -0
- package/dist/cjs/utils/finishReasons.cjs.map +1 -0
- package/dist/cjs/utils/llm.cjs.map +1 -1
- package/dist/cjs/utils/logging.cjs +34 -0
- package/dist/cjs/utils/logging.cjs.map +1 -0
- package/dist/cjs/utils/toolCallNormalization.cjs +250 -0
- package/dist/cjs/utils/toolCallNormalization.cjs.map +1 -0
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/spawnPath.mjs +95 -0
- package/dist/esm/common/spawnPath.mjs.map +1 -0
- package/dist/esm/graphs/Graph.mjs +89 -45
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/HandoffRegistry.mjs +47 -8
- package/dist/esm/graphs/HandoffRegistry.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +493 -267
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/graphs/phases/flushLoop.mjs +209 -0
- package/dist/esm/graphs/phases/flushLoop.mjs.map +1 -0
- package/dist/esm/graphs/phases/memoryFlushPhase.mjs +99 -0
- package/dist/esm/graphs/phases/memoryFlushPhase.mjs.map +1 -0
- package/dist/esm/llm/bedrock/index.mjs +4 -3
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/main.mjs +21 -0
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/memory/citations.mjs +64 -0
- package/dist/esm/memory/citations.mjs.map +1 -0
- package/dist/esm/memory/compositeBackend.mjs +58 -0
- package/dist/esm/memory/compositeBackend.mjs.map +1 -0
- package/dist/esm/memory/constants.mjs +198 -0
- package/dist/esm/memory/constants.mjs.map +1 -0
- package/dist/esm/memory/embeddings.mjs +148 -0
- package/dist/esm/memory/embeddings.mjs.map +1 -0
- package/dist/esm/memory/factory.mjs +93 -0
- package/dist/esm/memory/factory.mjs.map +1 -0
- package/dist/esm/memory/migrate.mjs +78 -0
- package/dist/esm/memory/migrate.mjs.map +1 -0
- package/dist/esm/memory/mmr.mjs +130 -0
- package/dist/esm/memory/mmr.mjs.map +1 -0
- package/dist/esm/memory/paths.mjs +207 -0
- package/dist/esm/memory/paths.mjs.map +1 -0
- package/dist/esm/memory/pgvectorStore.mjs +223 -0
- package/dist/esm/memory/pgvectorStore.mjs.map +1 -0
- package/dist/esm/memory/recallTracking.mjs +94 -0
- package/dist/esm/memory/recallTracking.mjs.map +1 -0
- package/dist/esm/memory/schema.sql +51 -0
- package/dist/esm/memory/temporalDecay.mjs +110 -0
- package/dist/esm/memory/temporalDecay.mjs.map +1 -0
- package/dist/esm/nodes/ApprovalGateNode.mjs +1 -1
- package/dist/esm/nodes/ApprovalGateNode.mjs.map +1 -1
- package/dist/esm/prompts/memoryFlushPrompt.mjs +44 -0
- package/dist/esm/prompts/memoryFlushPrompt.mjs.map +1 -0
- package/dist/esm/run.mjs +16 -3
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/tools/AskUser.mjs +6 -1
- package/dist/esm/tools/AskUser.mjs.map +1 -1
- package/dist/esm/tools/BrowserTools.mjs +1 -1
- package/dist/esm/tools/BrowserTools.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +128 -11
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/approval/constants.mjs +2 -2
- package/dist/esm/tools/approval/constants.mjs.map +1 -1
- package/dist/esm/tools/memory/index.mjs +46 -0
- package/dist/esm/tools/memory/index.mjs.map +1 -0
- package/dist/esm/tools/memory/memoryAppendTool.mjs +67 -0
- package/dist/esm/tools/memory/memoryAppendTool.mjs.map +1 -0
- package/dist/esm/tools/memory/memoryGetTool.mjs +47 -0
- package/dist/esm/tools/memory/memoryGetTool.mjs.map +1 -0
- package/dist/esm/tools/memory/memorySearchTool.mjs +63 -0
- package/dist/esm/tools/memory/memorySearchTool.mjs.map +1 -0
- package/dist/esm/tools/memory/shared.mjs +98 -0
- package/dist/esm/tools/memory/shared.mjs.map +1 -0
- package/dist/esm/types/graph.mjs.map +1 -1
- package/dist/esm/utils/childAgentContext.mjs +237 -0
- package/dist/esm/utils/childAgentContext.mjs.map +1 -0
- package/dist/esm/utils/errors.mjs +109 -0
- package/dist/esm/utils/errors.mjs.map +1 -0
- package/dist/esm/utils/events.mjs +36 -8
- package/dist/esm/utils/events.mjs.map +1 -1
- package/dist/esm/utils/finishReasons.mjs +41 -0
- package/dist/esm/utils/finishReasons.mjs.map +1 -0
- package/dist/esm/utils/llm.mjs.map +1 -1
- package/dist/esm/utils/logging.mjs +31 -0
- package/dist/esm/utils/logging.mjs.map +1 -0
- package/dist/esm/utils/toolCallNormalization.mjs +247 -0
- package/dist/esm/utils/toolCallNormalization.mjs.map +1 -0
- package/dist/types/common/index.d.ts +1 -0
- package/dist/types/common/spawnPath.d.ts +59 -0
- package/dist/types/graphs/HandoffRegistry.d.ts +24 -7
- package/dist/types/graphs/MultiAgentGraph.d.ts +43 -23
- package/dist/types/graphs/phases/flushLoop.d.ts +106 -0
- package/dist/types/graphs/phases/memoryFlushPhase.d.ts +100 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/memory/__tests__/mockBackend.d.ts +40 -0
- package/dist/types/memory/citations.d.ts +39 -0
- package/dist/types/memory/compositeBackend.d.ts +30 -0
- package/dist/types/memory/constants.d.ts +121 -0
- package/dist/types/memory/embeddings.d.ts +15 -0
- package/dist/types/memory/factory.d.ts +23 -0
- package/dist/types/memory/index.d.ts +21 -0
- package/dist/types/memory/migrate.d.ts +14 -0
- package/dist/types/memory/mmr.d.ts +50 -0
- package/dist/types/memory/paths.d.ts +107 -0
- package/dist/types/memory/pgvectorStore.d.ts +56 -0
- package/dist/types/memory/recallTracking.d.ts +30 -0
- package/dist/types/memory/temporalDecay.d.ts +53 -0
- package/dist/types/memory/types.d.ts +182 -0
- package/dist/types/prompts/memoryFlushPrompt.d.ts +54 -0
- package/dist/types/run.d.ts +1 -0
- package/dist/types/tools/AskUser.d.ts +1 -1
- package/dist/types/tools/BrowserTools.d.ts +2 -2
- package/dist/types/tools/approval/constants.d.ts +2 -2
- package/dist/types/tools/memory/index.d.ts +39 -0
- package/dist/types/tools/memory/memoryAppendTool.d.ts +27 -0
- package/dist/types/tools/memory/memoryGetTool.d.ts +22 -0
- package/dist/types/tools/memory/memorySearchTool.d.ts +22 -0
- package/dist/types/tools/memory/shared.d.ts +106 -0
- package/dist/types/types/graph.d.ts +10 -3
- package/dist/types/utils/childAgentContext.d.ts +99 -0
- package/dist/types/utils/errors.d.ts +37 -0
- package/dist/types/utils/events.d.ts +21 -0
- package/dist/types/utils/finishReasons.d.ts +32 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/logging.d.ts +2 -0
- package/dist/types/utils/toolCallNormalization.d.ts +44 -0
- package/package.json +6 -4
- package/src/agents/AgentContext.ts +12 -4
- package/src/common/__tests__/enum.test.ts +4 -2
- package/src/common/__tests__/spawnPath.test.ts +110 -0
- package/src/common/index.ts +1 -0
- package/src/common/spawnPath.ts +101 -0
- package/src/graphs/Graph.ts +95 -61
- package/src/graphs/HandoffRegistry.ts +48 -17
- package/src/graphs/MultiAgentGraph.ts +588 -327
- package/src/graphs/__tests__/HandoffRegistry.test.ts +4 -1
- package/src/graphs/__tests__/multi-agent-delegate.test.ts +61 -16
- package/src/graphs/__tests__/multi-agent-edges.test.ts +4 -2
- package/src/graphs/__tests__/multi-agent-nested-subgraph.test.ts +221 -0
- package/src/graphs/__tests__/structured-output.integration.test.ts +212 -118
- package/src/graphs/contextManagement.e2e.test.ts +1 -1
- package/src/graphs/phases/__tests__/flushLoop.test.ts +264 -0
- package/src/graphs/phases/__tests__/memoryFlushPhase.test.ts +37 -0
- package/src/graphs/phases/__tests__/runMemoryFlush.test.ts +150 -0
- package/src/graphs/phases/flushLoop.ts +303 -0
- package/src/graphs/phases/memoryFlushPhase.ts +209 -0
- package/src/index.ts +30 -1
- package/src/llm/bedrock/index.ts +4 -5
- package/src/memory/__tests__/citations.test.ts +61 -0
- package/src/memory/__tests__/compositeBackend.test.ts +79 -0
- package/src/memory/__tests__/isolation.test.ts +206 -0
- package/src/memory/__tests__/mmr.test.ts +148 -0
- package/src/memory/__tests__/mockBackend.ts +161 -0
- package/src/memory/__tests__/paths.test.ts +168 -0
- package/src/memory/__tests__/recallTracking.test.ts +96 -0
- package/src/memory/__tests__/temporalDecay.test.ts +151 -0
- package/src/memory/citations.ts +80 -0
- package/src/memory/compositeBackend.ts +99 -0
- package/src/memory/constants.ts +229 -0
- package/src/memory/embeddings.ts +188 -0
- package/src/memory/factory.ts +111 -0
- package/src/memory/index.ts +46 -0
- package/src/memory/migrate.ts +116 -0
- package/src/memory/mmr.ts +161 -0
- package/src/memory/paths.ts +258 -0
- package/src/memory/pgvectorStore.ts +324 -0
- package/src/memory/recallTracking.ts +127 -0
- package/src/memory/schema.sql +51 -0
- package/src/memory/temporalDecay.ts +134 -0
- package/src/memory/types.ts +185 -0
- package/src/nodes/ApprovalGateNode.ts +4 -10
- package/src/nodes/__tests__/ApprovalGateNode.test.ts +11 -20
- package/src/prompts/memoryFlushPrompt.ts +78 -0
- package/src/run.ts +17 -6
- package/src/scripts/test-bedrock-handoff-autonomous.ts +56 -20
- package/src/specs/agent-handoffs-bedrock.integration.test.ts +8 -5
- package/src/specs/agent-handoffs.test.ts +8 -2
- package/src/tools/AskUser.ts +7 -2
- package/src/tools/BrowserTools.ts +3 -5
- package/src/tools/ToolNode.ts +150 -13
- package/src/tools/__tests__/ToolApproval.test.ts +22 -9
- package/src/tools/approval/__tests__/constants.test.ts +1 -1
- package/src/tools/approval/constants.ts +2 -2
- package/src/tools/memory/__tests__/memoryTools.test.ts +205 -0
- package/src/tools/memory/index.ts +96 -0
- package/src/tools/memory/memoryAppendTool.ts +101 -0
- package/src/tools/memory/memoryGetTool.ts +53 -0
- package/src/tools/memory/memorySearchTool.ts +80 -0
- package/src/tools/memory/shared.ts +169 -0
- package/src/tools/search/search.test.ts +6 -1
- package/src/types/graph.ts +10 -3
- package/src/utils/__tests__/childAgentContext.test.ts +217 -0
- package/src/utils/__tests__/errors.test.ts +136 -0
- package/src/utils/__tests__/finishReasons.test.ts +55 -0
- package/src/utils/__tests__/toolCallNormalization.test.ts +181 -0
- package/src/utils/childAgentContext.ts +259 -0
- package/src/utils/errors.ts +115 -0
- package/src/utils/events.ts +37 -7
- package/src/utils/finishReasons.ts +40 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/llm.ts +0 -1
- package/src/utils/logging.ts +45 -8
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1063
|
-
`model=${effectiveClientOptions
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1543
|
-
const
|
|
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
|
-
|
|
1553
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
1654
|
-
const stillTooLong =
|
|
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
|
-
|
|
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
|
-
|
|
1805
|
-
meta.
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2209
|
+
// See dispatchRunStep note.
|
|
2210
|
+
await events.safeDispatchCustomEvent(_enum.GraphEvents.ON_REASONING_DELTA, reasoningDelta);
|
|
2167
2211
|
};
|
|
2168
2212
|
}
|
|
2169
2213
|
|