@librechat/agents 3.4.1 → 3.4.2
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/graphs/Graph.cjs +57 -33
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +81 -33
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/graphs/applyGraphRuntimeConfig.cjs +14 -0
- package/dist/cjs/graphs/applyGraphRuntimeConfig.cjs.map +1 -0
- package/dist/cjs/graphs/createGraph.cjs +15 -0
- package/dist/cjs/graphs/createGraph.cjs.map +1 -0
- package/dist/cjs/graphs/index.cjs +1 -0
- package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +1 -1
- package/dist/cjs/main.cjs +20 -11
- package/dist/cjs/run.cjs +48 -38
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/JsonlSessionStore.cjs +2 -2
- package/dist/cjs/tools/SubagentTool.cjs +4 -4
- package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +13 -9
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/eagerEventExecution.cjs +1 -0
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs +3 -3
- package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +2 -2
- package/dist/cjs/tools/search/rerankers.cjs +154 -1
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +4 -1
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs +601 -0
- package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs.map +1 -0
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +672 -343
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentReplay.cjs +3 -1
- package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -1
- package/dist/cjs/tools/subagent/childGraphConfig.cjs +278 -0
- package/dist/cjs/tools/subagent/childGraphConfig.cjs.map +1 -0
- package/dist/cjs/tools/subagent/index.cjs +1 -0
- package/dist/cjs/tools/subagent/runtimeLimits.cjs +5 -0
- package/dist/cjs/tools/subagent/runtimeLimits.cjs.map +1 -0
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +57 -33
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +81 -33
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/graphs/applyGraphRuntimeConfig.mjs +14 -0
- package/dist/esm/graphs/applyGraphRuntimeConfig.mjs.map +1 -0
- package/dist/esm/graphs/createGraph.mjs +15 -0
- package/dist/esm/graphs/createGraph.mjs.map +1 -0
- package/dist/esm/graphs/index.mjs +1 -0
- package/dist/esm/hooks/createWorkspacePolicyHook.mjs +1 -1
- package/dist/esm/main.mjs +12 -10
- package/dist/esm/run.mjs +48 -38
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/JsonlSessionStore.mjs +2 -2
- package/dist/esm/tools/SubagentTool.mjs +4 -4
- package/dist/esm/tools/SubagentTool.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +13 -9
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/eagerEventExecution.mjs +1 -1
- package/dist/esm/tools/local/LocalExecutionEngine.mjs +3 -3
- package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +2 -2
- package/dist/esm/tools/search/rerankers.mjs +154 -1
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +4 -1
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs +597 -0
- package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs.map +1 -0
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +672 -343
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentReplay.mjs +3 -1
- package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -1
- package/dist/esm/tools/subagent/childGraphConfig.mjs +272 -0
- package/dist/esm/tools/subagent/childGraphConfig.mjs.map +1 -0
- package/dist/esm/tools/subagent/index.mjs +1 -0
- package/dist/esm/tools/subagent/runtimeLimits.mjs +5 -0
- package/dist/esm/tools/subagent/runtimeLimits.mjs.map +1 -0
- package/dist/types/agents/AgentContext.d.ts +1 -1
- package/dist/types/graphs/Graph.d.ts +7 -2
- package/dist/types/graphs/MultiAgentGraph.d.ts +7 -1
- package/dist/types/graphs/applyGraphRuntimeConfig.d.ts +3 -0
- package/dist/types/graphs/createGraph.d.ts +13 -0
- package/dist/types/graphs/graphFactory.d.ts +13 -0
- package/dist/types/graphs/index.d.ts +2 -0
- package/dist/types/run.d.ts +2 -2
- package/dist/types/tools/SubagentTool.d.ts +1 -1
- package/dist/types/tools/search/rerankers.d.ts +28 -0
- package/dist/types/tools/search/types.d.ts +38 -1
- package/dist/types/tools/subagent/SubagentExecutionRegistry.d.ts +171 -0
- package/dist/types/tools/subagent/SubagentExecutor.d.ts +32 -37
- package/dist/types/tools/subagent/SubagentReplay.d.ts +5 -1
- package/dist/types/tools/subagent/childGraphConfig.d.ts +37 -0
- package/dist/types/tools/subagent/index.d.ts +1 -1
- package/dist/types/tools/subagent/runtimeLimits.d.ts +4 -0
- package/dist/types/types/graph.d.ts +184 -19
- package/package.json +3 -1
- package/src/agents/AgentContext.ts +1 -1
- package/src/graphs/Graph.ts +111 -60
- package/src/graphs/MultiAgentGraph.ts +149 -47
- package/src/graphs/__tests__/MultiAgentGraph.test.ts +86 -0
- package/src/graphs/__tests__/composition.smoke.test.ts +152 -0
- package/src/graphs/__tests__/createGraph.test.ts +206 -0
- package/src/graphs/applyGraphRuntimeConfig.ts +25 -0
- package/src/graphs/createGraph.ts +32 -0
- package/src/graphs/graphFactory.ts +12 -0
- package/src/graphs/index.ts +2 -0
- package/src/run.ts +50 -38
- package/src/specs/graph-subagent.live.test.ts +242 -0
- package/src/specs/graph-subagent.test.ts +322 -0
- package/src/specs/langfuse-routing.integration.test.ts +120 -1
- package/src/specs/subagent.test.ts +130 -4
- package/src/tools/SubagentTool.ts +4 -4
- package/src/tools/ToolNode.ts +22 -10
- package/src/tools/__tests__/SubagentExecutor.test.ts +198 -9
- package/src/tools/__tests__/SubagentReplay.test.ts +29 -0
- package/src/tools/__tests__/directToolHITLResumeScope.test.ts +28 -2
- package/src/tools/__tests__/subagentHooks.test.ts +90 -3
- package/src/tools/search/rag-api-reranker.test.ts +891 -0
- package/src/tools/search/rerankers.ts +260 -0
- package/src/tools/search/tool.ts +6 -0
- package/src/tools/search/types.ts +45 -1
- package/src/tools/subagent/SubagentExecutionRegistry.ts +1159 -0
- package/src/tools/subagent/SubagentExecutor.ts +1245 -563
- package/src/tools/subagent/SubagentReplay.ts +10 -1
- package/src/tools/subagent/__tests__/SubagentExecutionRegistry.test.ts +637 -0
- package/src/tools/subagent/__tests__/SubagentExecutor.lazy.test.ts +3054 -0
- package/src/tools/subagent/__tests__/childGraphConfig.test.ts +521 -0
- package/src/tools/subagent/childGraphConfig.ts +694 -0
- package/src/tools/subagent/index.ts +6 -0
- package/src/tools/subagent/runtimeLimits.ts +7 -0
- package/src/types/graph.ts +217 -19
|
@@ -95,11 +95,13 @@ function isSubagentResumeExecution(value, seen, depth) {
|
|
|
95
95
|
if (value == null || typeof value !== "object") return false;
|
|
96
96
|
const execution = value;
|
|
97
97
|
const childRunId = execution.childRunId;
|
|
98
|
+
const subagentType = execution.subagentType;
|
|
99
|
+
const configId = execution.configId;
|
|
98
100
|
const approvalExecutionScope = execution.approvalExecutionScope;
|
|
99
101
|
const checkpoints = execution.checkpoints;
|
|
100
102
|
const graphState = execution.graphState;
|
|
101
103
|
const approvalReplays = execution.approvalReplays;
|
|
102
|
-
if (!isString(execution.parentToolCallId) || !isString(childRunId) || !isString(approvalExecutionScope) || !Array.isArray(checkpoints) || checkpoints.length === 0 || !checkpoints.every(isCheckpointReference) || !isGraphResumeState(graphState) || !Array.isArray(approvalReplays)) return false;
|
|
104
|
+
if (!isString(execution.parentToolCallId) || !isString(childRunId) || subagentType != null && !isString(subagentType) || configId != null && !isString(configId) || !isString(approvalExecutionScope) || !Array.isArray(checkpoints) || checkpoints.length === 0 || !checkpoints.every(isCheckpointReference) || !isGraphResumeState(graphState) || !Array.isArray(approvalReplays)) return false;
|
|
103
105
|
const checkpointThreadId = checkpoints[0].threadId;
|
|
104
106
|
const checkpointNamespaces = new Set(checkpoints.map((checkpoint) => checkpoint.checkpointNs));
|
|
105
107
|
if (!approvalReplays.every((snapshot) => isApprovalReplaySnapshot(snapshot) && snapshot.key.executionScope === approvalExecutionScope)) return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubagentReplay.cjs","names":[],"sources":["../../../../src/tools/subagent/SubagentReplay.ts"],"sourcesContent":["import type { ToolCall, ToolMessage } from '@langchain/core/messages/tool';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { ToolOutputReferenceState } from '@/tools/toolOutputReferences';\nimport type { ToolApprovalReplaySnapshot } from '@/hooks';\nimport type { ToolSessionContext } from '@/types';\n\nexport const SUBAGENT_RESUME_MANIFEST_CONFIG_KEY =\n '__librechat_subagent_resume_manifest';\nexport const SUBAGENT_RESUME_ATTEMPT_CONFIG_KEY =\n '__librechat_subagent_resume_attempt';\nexport const SUBAGENT_PARENT_BATCH_CONFIG_KEY =\n '__librechat_subagent_parent_batch';\n\nconst SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY =\n '__librechat_subagent_resume_manifest';\nconst SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY =\n '__librechat_subagent_resume_payload';\nconst SUBAGENT_RESUME_WRAPPER_VERSION_KEY =\n '__librechat_subagent_resume_wrapper';\nconst SUBAGENT_RESUME_PRIVATE_PAYLOAD_KEYS = [\n SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY,\n SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY,\n SUBAGENT_RESUME_WRAPPER_VERSION_KEY,\n] as const;\nconst MAX_RESUME_MANIFEST_DEPTH = 32;\n\nexport interface SubagentCheckpointReference {\n threadId: string;\n checkpointId: string;\n checkpointNs: string;\n}\n\nexport interface SubagentToolCallStepReference {\n toolCallId: string;\n stepId: string;\n}\n\nexport interface SubagentToolSessionReference {\n toolName: string;\n context: ToolSessionContext;\n}\n\nexport interface SubagentToolNodeResumeState {\n stateKey: string;\n toolUsageCounts: Array<{ toolName: string; count: number }>;\n directPathTurns: Array<{ toolCallId: string; turn: number }>;\n}\n\nexport interface SubagentEagerToolUsageState {\n agentId: string;\n toolUsageCounts: Array<{ toolName: string; count: number }>;\n}\n\nexport interface SubagentGraphResumeState {\n toolCallSteps: SubagentToolCallStepReference[];\n toolSessions: SubagentToolSessionReference[];\n toolNodes: SubagentToolNodeResumeState[];\n eagerToolUsage: SubagentEagerToolUsageState[];\n eagerToolSuppressions: string[];\n toolOutputReferences?: ToolOutputReferenceState;\n}\n\n/** Private checkpoint payload linking a parent pause to an exact child state. */\nexport interface SubagentResumeExecution {\n parentToolCallId: string;\n childRunId: string;\n approvalExecutionScope: string;\n checkpoints: SubagentCheckpointReference[];\n graphState: SubagentGraphResumeState;\n approvalReplays: ToolApprovalReplaySnapshot[];\n descendant?: SubagentResumeManifest;\n}\n\n/** Private checkpoint payload linking a parent pause to every child state. */\nexport interface SubagentResumeManifest {\n version: 1;\n executions: SubagentResumeExecution[];\n}\n\ntype PayloadWithSubagentResumeManifest = {\n [SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY]?: unknown;\n};\n\ntype WrappedSubagentResumePayload = PayloadWithSubagentResumeManifest & {\n [SUBAGENT_RESUME_WRAPPER_VERSION_KEY]: 1;\n [SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY]: unknown;\n};\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\nfunction isNonnegativeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isApprovalReplaySnapshot(\n value: unknown\n): value is ToolApprovalReplaySnapshot {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const snapshot = value as Partial<ToolApprovalReplaySnapshot>;\n const key = snapshot.key;\n const result = snapshot.result;\n return (\n key != null &&\n isString(key.executionScope) &&\n typeof key.agentId === 'string' &&\n isString(key.toolUseId) &&\n result != null &&\n result.decision === 'ask' &&\n Array.isArray(result.additionalContexts) &&\n Array.isArray(result.injectedMessages) &&\n Array.isArray(result.errors)\n );\n}\n\nfunction isCheckpointReference(\n value: unknown\n): value is SubagentCheckpointReference {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const checkpoint = value as Partial<SubagentCheckpointReference>;\n return (\n isString(checkpoint.threadId) &&\n isString(checkpoint.checkpointId) &&\n typeof checkpoint.checkpointNs === 'string'\n );\n}\n\nfunction isToolCallStepReference(\n value: unknown\n): value is SubagentToolCallStepReference {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const reference = value as Partial<SubagentToolCallStepReference>;\n return isString(reference.toolCallId) && isString(reference.stepId);\n}\n\nfunction isToolSessionReference(\n value: unknown\n): value is SubagentToolSessionReference {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const reference = value as Partial<SubagentToolSessionReference>;\n const context = reference.context;\n return (\n isString(reference.toolName) &&\n context != null &&\n typeof context === 'object' &&\n isString(context.session_id) &&\n Number.isFinite(context.lastUpdated) &&\n (context.files == null || Array.isArray(context.files))\n );\n}\n\nfunction isToolUsageCountReference(\n value: unknown\n): value is SubagentToolNodeResumeState['toolUsageCounts'][number] {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const entry = value as Partial<\n SubagentToolNodeResumeState['toolUsageCounts'][number]\n >;\n return isString(entry.toolName) && isNonnegativeInteger(entry.count);\n}\n\nfunction isDirectPathTurnReference(\n value: unknown\n): value is SubagentToolNodeResumeState['directPathTurns'][number] {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const entry = value as Partial<\n SubagentToolNodeResumeState['directPathTurns'][number]\n >;\n return isString(entry.toolCallId) && isNonnegativeInteger(entry.turn);\n}\n\nfunction isToolNodeResumeState(\n value: unknown\n): value is SubagentToolNodeResumeState {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const state = value as Partial<SubagentToolNodeResumeState>;\n if (\n !isString(state.stateKey) ||\n !Array.isArray(state.toolUsageCounts) ||\n !Array.isArray(state.directPathTurns)\n ) {\n return false;\n }\n const validUsageCounts = state.toolUsageCounts.every(\n isToolUsageCountReference\n );\n const validDirectTurns = state.directPathTurns.every(\n isDirectPathTurnReference\n );\n if (!validUsageCounts || !validDirectTurns) {\n return false;\n }\n const usageToolNames = new Set(\n state.toolUsageCounts.map((entry) => entry.toolName)\n );\n const directToolCallIds = new Set(\n state.directPathTurns.map((entry) => entry.toolCallId)\n );\n return (\n usageToolNames.size === state.toolUsageCounts.length &&\n directToolCallIds.size === state.directPathTurns.length\n );\n}\n\nfunction isEagerToolUsageState(\n value: unknown\n): value is SubagentEagerToolUsageState {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const state = value as Partial<SubagentEagerToolUsageState>;\n if (\n typeof state.agentId !== 'string' ||\n !Array.isArray(state.toolUsageCounts) ||\n !state.toolUsageCounts.every(isToolUsageCountReference)\n ) {\n return false;\n }\n const toolNames = new Set(\n state.toolUsageCounts.map((entry) => entry.toolName)\n );\n return toolNames.size === state.toolUsageCounts.length;\n}\n\nfunction isToolOutputReferenceEntry(\n value: unknown\n): value is ToolOutputReferenceState['entries'][number] {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const entry = value as Partial<ToolOutputReferenceState['entries'][number]>;\n return isString(entry.key) && typeof entry.value === 'string';\n}\n\nfunction isToolOutputReferenceState(\n value: unknown\n): value is ToolOutputReferenceState {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const state = value as Partial<ToolOutputReferenceState>;\n if (\n !Array.isArray(state.entries) ||\n !state.entries.every(isToolOutputReferenceEntry) ||\n !isNonnegativeInteger(state.turnCounter) ||\n !Array.isArray(state.warnedNonStringTools) ||\n !state.warnedNonStringTools.every(isString)\n ) {\n return false;\n }\n const entryKeys = new Set(state.entries.map((entry) => entry.key));\n const warnedTools = new Set(state.warnedNonStringTools);\n return (\n entryKeys.size === state.entries.length &&\n warnedTools.size === state.warnedNonStringTools.length\n );\n}\n\nfunction isGraphResumeState(value: unknown): value is SubagentGraphResumeState {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const state = value as Partial<SubagentGraphResumeState>;\n if (\n !Array.isArray(state.toolCallSteps) ||\n !state.toolCallSteps.every(isToolCallStepReference) ||\n !Array.isArray(state.toolSessions) ||\n !state.toolSessions.every(isToolSessionReference) ||\n !Array.isArray(state.toolNodes) ||\n !state.toolNodes.every(isToolNodeResumeState) ||\n !Array.isArray(state.eagerToolUsage) ||\n !state.eagerToolUsage.every(isEagerToolUsageState) ||\n !Array.isArray(state.eagerToolSuppressions) ||\n !state.eagerToolSuppressions.every(isString) ||\n (state.toolOutputReferences != null &&\n !isToolOutputReferenceState(state.toolOutputReferences))\n ) {\n return false;\n }\n const toolCallIds = new Set(\n state.toolCallSteps.map((reference) => reference.toolCallId)\n );\n const toolNames = new Set(\n state.toolSessions.map((reference) => reference.toolName)\n );\n const toolNodeKeys = new Set(state.toolNodes.map((node) => node.stateKey));\n const eagerAgentIds = new Set(\n state.eagerToolUsage.map((usage) => usage.agentId)\n );\n const eagerSuppressions = new Set(state.eagerToolSuppressions);\n return (\n toolCallIds.size === state.toolCallSteps.length &&\n toolNames.size === state.toolSessions.length &&\n toolNodeKeys.size === state.toolNodes.length &&\n eagerAgentIds.size === state.eagerToolUsage.length &&\n eagerSuppressions.size === state.eagerToolSuppressions.length\n );\n}\n\nfunction isSubagentResumeExecution(\n value: unknown,\n seen: Set<object>,\n depth: number\n): value is SubagentResumeExecution {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const execution = value as Partial<SubagentResumeExecution>;\n const childRunId = execution.childRunId;\n const approvalExecutionScope = execution.approvalExecutionScope;\n const checkpoints = execution.checkpoints;\n const graphState = execution.graphState;\n const approvalReplays = execution.approvalReplays;\n if (\n !isString(execution.parentToolCallId) ||\n !isString(childRunId) ||\n !isString(approvalExecutionScope) ||\n !Array.isArray(checkpoints) ||\n checkpoints.length === 0 ||\n !checkpoints.every(isCheckpointReference) ||\n !isGraphResumeState(graphState) ||\n !Array.isArray(approvalReplays)\n ) {\n return false;\n }\n const checkpointThreadId = checkpoints[0].threadId;\n const checkpointNamespaces = new Set(\n checkpoints.map((checkpoint) => checkpoint.checkpointNs)\n );\n const validApprovalReplays = approvalReplays.every(\n (snapshot) =>\n isApprovalReplaySnapshot(snapshot) &&\n snapshot.key.executionScope === approvalExecutionScope\n );\n if (!validApprovalReplays) {\n return false;\n }\n const approvalKeys = new Set(\n approvalReplays.map((snapshot) =>\n JSON.stringify([\n snapshot.key.executionScope,\n snapshot.key.agentId,\n snapshot.key.toolUseId,\n ])\n )\n );\n return (\n checkpoints.every(\n (checkpoint) => checkpoint.threadId === checkpointThreadId\n ) &&\n checkpointNamespaces.size === checkpoints.length &&\n approvalKeys.size === approvalReplays.length &&\n (execution.descendant == null ||\n isSubagentResumeManifest(execution.descendant, seen, depth + 1))\n );\n}\n\nfunction isSubagentResumeManifest(\n value: unknown,\n seen: Set<object> = new Set(),\n depth = 0\n): value is SubagentResumeManifest {\n if (\n value == null ||\n typeof value !== 'object' ||\n depth > MAX_RESUME_MANIFEST_DEPTH ||\n seen.has(value)\n ) {\n return false;\n }\n seen.add(value);\n const manifest = value as Partial<SubagentResumeManifest>;\n if (\n manifest.version !== 1 ||\n !Array.isArray(manifest.executions) ||\n manifest.executions.length === 0 ||\n !manifest.executions.every((execution) =>\n isSubagentResumeExecution(execution, seen, depth)\n )\n ) {\n return false;\n }\n const parentToolCallIds = new Set(\n manifest.executions.map((execution) => execution.parentToolCallId)\n );\n return parentToolCallIds.size === manifest.executions.length;\n}\n\nexport function getSubagentResumeManifest(\n payload: unknown\n): SubagentResumeManifest | undefined {\n if (payload == null || typeof payload !== 'object') {\n return undefined;\n }\n if (\n !Object.prototype.hasOwnProperty.call(\n payload,\n SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY\n )\n ) {\n return undefined;\n }\n const manifest = (payload as PayloadWithSubagentResumeManifest)[\n SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY\n ];\n return isSubagentResumeManifest(manifest) ? manifest : undefined;\n}\n\nexport function requireValidSubagentResumeManifest(\n payload: unknown\n): SubagentResumeManifest | undefined {\n if (\n payload == null ||\n typeof payload !== 'object' ||\n !Object.prototype.hasOwnProperty.call(\n payload,\n SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY\n )\n ) {\n return undefined;\n }\n const manifest = getSubagentResumeManifest(payload);\n if (manifest == null) {\n throw new Error('Invalid subagent resume manifest.');\n }\n return manifest;\n}\n\nfunction canAttachSubagentResumeManifestInline(\n payload: unknown\n): payload is Record<string, unknown> {\n if (\n payload == null ||\n typeof payload !== 'object' ||\n Array.isArray(payload) ||\n Object.getPrototypeOf(payload) !== Object.prototype\n ) {\n return false;\n }\n return SUBAGENT_RESUME_PRIVATE_PAYLOAD_KEYS.every(\n (key) => !Object.prototype.hasOwnProperty.call(payload, key)\n );\n}\n\nfunction isInlineSubagentResumePayload(\n payload: unknown\n): payload is PayloadWithSubagentResumeManifest & Record<string, unknown> {\n return (\n payload != null &&\n typeof payload === 'object' &&\n !Array.isArray(payload) &&\n Object.getPrototypeOf(payload) === Object.prototype &&\n !Object.prototype.hasOwnProperty.call(\n payload,\n SUBAGENT_RESUME_WRAPPER_VERSION_KEY\n ) &&\n !Object.prototype.hasOwnProperty.call(\n payload,\n SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY\n ) &&\n getSubagentResumeManifest(payload) != null\n );\n}\n\nexport function attachSubagentResumeManifest(\n payload: unknown,\n manifest: SubagentResumeManifest\n): object {\n if (\n isWrappedSubagentResumePayload(payload) ||\n isInlineSubagentResumePayload(payload)\n ) {\n return {\n ...payload,\n [SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY]: manifest,\n };\n }\n if (!canAttachSubagentResumeManifestInline(payload)) {\n return {\n [SUBAGENT_RESUME_WRAPPER_VERSION_KEY]: 1,\n [SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY]: payload,\n [SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY]: manifest,\n };\n }\n return {\n ...payload,\n [SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY]: manifest,\n };\n}\n\nexport function stripSubagentResumeManifest(payload: unknown): unknown {\n if (isWrappedSubagentResumePayload(payload)) {\n return payload[SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY];\n }\n if (\n payload == null ||\n typeof payload !== 'object' ||\n getSubagentResumeManifest(payload) == null\n ) {\n return payload;\n }\n return Object.fromEntries(\n Object.entries(payload).filter(\n ([key]) => key !== SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY\n )\n );\n}\n\nfunction isWrappedSubagentResumePayload(\n payload: unknown\n): payload is WrappedSubagentResumePayload {\n if (\n payload == null ||\n typeof payload !== 'object' ||\n Array.isArray(payload) ||\n Object.getPrototypeOf(payload) !== Object.prototype ||\n Object.keys(payload).length !== SUBAGENT_RESUME_PRIVATE_PAYLOAD_KEYS.length\n ) {\n return false;\n }\n const wrapper = payload as Partial<WrappedSubagentResumePayload>;\n return (\n wrapper[SUBAGENT_RESUME_WRAPPER_VERSION_KEY] === 1 &&\n Object.prototype.hasOwnProperty.call(\n wrapper,\n SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY\n ) &&\n getSubagentResumeManifest(wrapper) != null\n );\n}\n\nexport const SUBAGENT_REPLAY_CONTROLLER = Symbol.for(\n '@librechat/agents/subagent-replay-controller'\n);\n\nexport type SettledSubagentToolOutput = {\n output: ToolMessage;\n additionalContexts: string[];\n resolvedArgs?: Record<string, unknown>;\n referenceContent?: string;\n};\n\nexport interface SubagentReplayController {\n getResumeManifest?(\n parentToolCallIds?: ReadonlySet<string>\n ): Promise<SubagentResumeManifest | undefined>;\n getSettledOutput(\n call: ToolCall,\n config: RunnableConfig\n ): Promise<SettledSubagentToolOutput | undefined>;\n persistSettledOutput(\n call: ToolCall,\n config: RunnableConfig,\n settled: SettledSubagentToolOutput\n ): Promise<void>;\n}\n\nexport type ReplayableSubagentTool = {\n [SUBAGENT_REPLAY_CONTROLLER]?: SubagentReplayController;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SubagentReplay.cjs","names":[],"sources":["../../../../src/tools/subagent/SubagentReplay.ts"],"sourcesContent":["import type { ToolCall, ToolMessage } from '@langchain/core/messages/tool';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { ToolOutputReferenceState } from '@/tools/toolOutputReferences';\nimport type { ToolApprovalReplaySnapshot } from '@/hooks';\nimport type { ToolSessionContext } from '@/types';\n\nexport const SUBAGENT_RESUME_MANIFEST_CONFIG_KEY =\n '__librechat_subagent_resume_manifest';\nexport const SUBAGENT_RESUME_ATTEMPT_CONFIG_KEY =\n '__librechat_subagent_resume_attempt';\nexport const SUBAGENT_PARENT_BATCH_CONFIG_KEY =\n '__librechat_subagent_parent_batch';\n\nconst SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY =\n '__librechat_subagent_resume_manifest';\nconst SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY =\n '__librechat_subagent_resume_payload';\nconst SUBAGENT_RESUME_WRAPPER_VERSION_KEY =\n '__librechat_subagent_resume_wrapper';\nconst SUBAGENT_RESUME_PRIVATE_PAYLOAD_KEYS = [\n SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY,\n SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY,\n SUBAGENT_RESUME_WRAPPER_VERSION_KEY,\n] as const;\nconst MAX_RESUME_MANIFEST_DEPTH = 32;\n\nexport interface SubagentCheckpointReference {\n threadId: string;\n checkpointId: string;\n checkpointNs: string;\n}\n\nexport interface SubagentToolCallStepReference {\n toolCallId: string;\n stepId: string;\n}\n\nexport interface SubagentToolSessionReference {\n toolName: string;\n context: ToolSessionContext;\n}\n\nexport interface SubagentToolNodeResumeState {\n stateKey: string;\n toolUsageCounts: Array<{ toolName: string; count: number }>;\n directPathTurns: Array<{ toolCallId: string; turn: number }>;\n}\n\nexport interface SubagentEagerToolUsageState {\n agentId: string;\n toolUsageCounts: Array<{ toolName: string; count: number }>;\n}\n\nexport interface SubagentGraphResumeState {\n toolCallSteps: SubagentToolCallStepReference[];\n toolSessions: SubagentToolSessionReference[];\n toolNodes: SubagentToolNodeResumeState[];\n eagerToolUsage: SubagentEagerToolUsageState[];\n eagerToolSuppressions: string[];\n toolOutputReferences?: ToolOutputReferenceState;\n}\n\n/** Private checkpoint payload linking a parent pause to an exact child state. */\nexport interface SubagentResumeExecution {\n parentToolCallId: string;\n childRunId: string;\n /** Effective child type bound when this execution first ran. */\n subagentType?: string;\n /** Lazy child revision bound when this execution first resolved. */\n configId?: string;\n approvalExecutionScope: string;\n checkpoints: SubagentCheckpointReference[];\n graphState: SubagentGraphResumeState;\n approvalReplays: ToolApprovalReplaySnapshot[];\n descendant?: SubagentResumeManifest;\n}\n\n/** Private checkpoint payload linking a parent pause to every child state. */\nexport interface SubagentResumeManifest {\n version: 1;\n executions: SubagentResumeExecution[];\n}\n\ntype PayloadWithSubagentResumeManifest = {\n [SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY]?: unknown;\n};\n\ntype WrappedSubagentResumePayload = PayloadWithSubagentResumeManifest & {\n [SUBAGENT_RESUME_WRAPPER_VERSION_KEY]: 1;\n [SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY]: unknown;\n};\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\nfunction isNonnegativeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isApprovalReplaySnapshot(\n value: unknown\n): value is ToolApprovalReplaySnapshot {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const snapshot = value as Partial<ToolApprovalReplaySnapshot>;\n const key = snapshot.key;\n const result = snapshot.result;\n return (\n key != null &&\n isString(key.executionScope) &&\n typeof key.agentId === 'string' &&\n isString(key.toolUseId) &&\n result != null &&\n result.decision === 'ask' &&\n Array.isArray(result.additionalContexts) &&\n Array.isArray(result.injectedMessages) &&\n Array.isArray(result.errors)\n );\n}\n\nfunction isCheckpointReference(\n value: unknown\n): value is SubagentCheckpointReference {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const checkpoint = value as Partial<SubagentCheckpointReference>;\n return (\n isString(checkpoint.threadId) &&\n isString(checkpoint.checkpointId) &&\n typeof checkpoint.checkpointNs === 'string'\n );\n}\n\nfunction isToolCallStepReference(\n value: unknown\n): value is SubagentToolCallStepReference {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const reference = value as Partial<SubagentToolCallStepReference>;\n return isString(reference.toolCallId) && isString(reference.stepId);\n}\n\nfunction isToolSessionReference(\n value: unknown\n): value is SubagentToolSessionReference {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const reference = value as Partial<SubagentToolSessionReference>;\n const context = reference.context;\n return (\n isString(reference.toolName) &&\n context != null &&\n typeof context === 'object' &&\n isString(context.session_id) &&\n Number.isFinite(context.lastUpdated) &&\n (context.files == null || Array.isArray(context.files))\n );\n}\n\nfunction isToolUsageCountReference(\n value: unknown\n): value is SubagentToolNodeResumeState['toolUsageCounts'][number] {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const entry = value as Partial<\n SubagentToolNodeResumeState['toolUsageCounts'][number]\n >;\n return isString(entry.toolName) && isNonnegativeInteger(entry.count);\n}\n\nfunction isDirectPathTurnReference(\n value: unknown\n): value is SubagentToolNodeResumeState['directPathTurns'][number] {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const entry = value as Partial<\n SubagentToolNodeResumeState['directPathTurns'][number]\n >;\n return isString(entry.toolCallId) && isNonnegativeInteger(entry.turn);\n}\n\nfunction isToolNodeResumeState(\n value: unknown\n): value is SubagentToolNodeResumeState {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const state = value as Partial<SubagentToolNodeResumeState>;\n if (\n !isString(state.stateKey) ||\n !Array.isArray(state.toolUsageCounts) ||\n !Array.isArray(state.directPathTurns)\n ) {\n return false;\n }\n const validUsageCounts = state.toolUsageCounts.every(\n isToolUsageCountReference\n );\n const validDirectTurns = state.directPathTurns.every(\n isDirectPathTurnReference\n );\n if (!validUsageCounts || !validDirectTurns) {\n return false;\n }\n const usageToolNames = new Set(\n state.toolUsageCounts.map((entry) => entry.toolName)\n );\n const directToolCallIds = new Set(\n state.directPathTurns.map((entry) => entry.toolCallId)\n );\n return (\n usageToolNames.size === state.toolUsageCounts.length &&\n directToolCallIds.size === state.directPathTurns.length\n );\n}\n\nfunction isEagerToolUsageState(\n value: unknown\n): value is SubagentEagerToolUsageState {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const state = value as Partial<SubagentEagerToolUsageState>;\n if (\n typeof state.agentId !== 'string' ||\n !Array.isArray(state.toolUsageCounts) ||\n !state.toolUsageCounts.every(isToolUsageCountReference)\n ) {\n return false;\n }\n const toolNames = new Set(\n state.toolUsageCounts.map((entry) => entry.toolName)\n );\n return toolNames.size === state.toolUsageCounts.length;\n}\n\nfunction isToolOutputReferenceEntry(\n value: unknown\n): value is ToolOutputReferenceState['entries'][number] {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const entry = value as Partial<ToolOutputReferenceState['entries'][number]>;\n return isString(entry.key) && typeof entry.value === 'string';\n}\n\nfunction isToolOutputReferenceState(\n value: unknown\n): value is ToolOutputReferenceState {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const state = value as Partial<ToolOutputReferenceState>;\n if (\n !Array.isArray(state.entries) ||\n !state.entries.every(isToolOutputReferenceEntry) ||\n !isNonnegativeInteger(state.turnCounter) ||\n !Array.isArray(state.warnedNonStringTools) ||\n !state.warnedNonStringTools.every(isString)\n ) {\n return false;\n }\n const entryKeys = new Set(state.entries.map((entry) => entry.key));\n const warnedTools = new Set(state.warnedNonStringTools);\n return (\n entryKeys.size === state.entries.length &&\n warnedTools.size === state.warnedNonStringTools.length\n );\n}\n\nfunction isGraphResumeState(value: unknown): value is SubagentGraphResumeState {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const state = value as Partial<SubagentGraphResumeState>;\n if (\n !Array.isArray(state.toolCallSteps) ||\n !state.toolCallSteps.every(isToolCallStepReference) ||\n !Array.isArray(state.toolSessions) ||\n !state.toolSessions.every(isToolSessionReference) ||\n !Array.isArray(state.toolNodes) ||\n !state.toolNodes.every(isToolNodeResumeState) ||\n !Array.isArray(state.eagerToolUsage) ||\n !state.eagerToolUsage.every(isEagerToolUsageState) ||\n !Array.isArray(state.eagerToolSuppressions) ||\n !state.eagerToolSuppressions.every(isString) ||\n (state.toolOutputReferences != null &&\n !isToolOutputReferenceState(state.toolOutputReferences))\n ) {\n return false;\n }\n const toolCallIds = new Set(\n state.toolCallSteps.map((reference) => reference.toolCallId)\n );\n const toolNames = new Set(\n state.toolSessions.map((reference) => reference.toolName)\n );\n const toolNodeKeys = new Set(state.toolNodes.map((node) => node.stateKey));\n const eagerAgentIds = new Set(\n state.eagerToolUsage.map((usage) => usage.agentId)\n );\n const eagerSuppressions = new Set(state.eagerToolSuppressions);\n return (\n toolCallIds.size === state.toolCallSteps.length &&\n toolNames.size === state.toolSessions.length &&\n toolNodeKeys.size === state.toolNodes.length &&\n eagerAgentIds.size === state.eagerToolUsage.length &&\n eagerSuppressions.size === state.eagerToolSuppressions.length\n );\n}\n\nfunction isSubagentResumeExecution(\n value: unknown,\n seen: Set<object>,\n depth: number\n): value is SubagentResumeExecution {\n if (value == null || typeof value !== 'object') {\n return false;\n }\n const execution = value as Partial<SubagentResumeExecution>;\n const childRunId = execution.childRunId;\n const subagentType = execution.subagentType;\n const configId = execution.configId;\n const approvalExecutionScope = execution.approvalExecutionScope;\n const checkpoints = execution.checkpoints;\n const graphState = execution.graphState;\n const approvalReplays = execution.approvalReplays;\n if (\n !isString(execution.parentToolCallId) ||\n !isString(childRunId) ||\n (subagentType != null && !isString(subagentType)) ||\n (configId != null && !isString(configId)) ||\n !isString(approvalExecutionScope) ||\n !Array.isArray(checkpoints) ||\n checkpoints.length === 0 ||\n !checkpoints.every(isCheckpointReference) ||\n !isGraphResumeState(graphState) ||\n !Array.isArray(approvalReplays)\n ) {\n return false;\n }\n const checkpointThreadId = checkpoints[0].threadId;\n const checkpointNamespaces = new Set(\n checkpoints.map((checkpoint) => checkpoint.checkpointNs)\n );\n const validApprovalReplays = approvalReplays.every(\n (snapshot) =>\n isApprovalReplaySnapshot(snapshot) &&\n snapshot.key.executionScope === approvalExecutionScope\n );\n if (!validApprovalReplays) {\n return false;\n }\n const approvalKeys = new Set(\n approvalReplays.map((snapshot) =>\n JSON.stringify([\n snapshot.key.executionScope,\n snapshot.key.agentId,\n snapshot.key.toolUseId,\n ])\n )\n );\n return (\n checkpoints.every(\n (checkpoint) => checkpoint.threadId === checkpointThreadId\n ) &&\n checkpointNamespaces.size === checkpoints.length &&\n approvalKeys.size === approvalReplays.length &&\n (execution.descendant == null ||\n isSubagentResumeManifest(execution.descendant, seen, depth + 1))\n );\n}\n\nfunction isSubagentResumeManifest(\n value: unknown,\n seen: Set<object> = new Set(),\n depth = 0\n): value is SubagentResumeManifest {\n if (\n value == null ||\n typeof value !== 'object' ||\n depth > MAX_RESUME_MANIFEST_DEPTH ||\n seen.has(value)\n ) {\n return false;\n }\n seen.add(value);\n const manifest = value as Partial<SubagentResumeManifest>;\n if (\n manifest.version !== 1 ||\n !Array.isArray(manifest.executions) ||\n manifest.executions.length === 0 ||\n !manifest.executions.every((execution) =>\n isSubagentResumeExecution(execution, seen, depth)\n )\n ) {\n return false;\n }\n const parentToolCallIds = new Set(\n manifest.executions.map((execution) => execution.parentToolCallId)\n );\n return parentToolCallIds.size === manifest.executions.length;\n}\n\nexport function getSubagentResumeManifest(\n payload: unknown\n): SubagentResumeManifest | undefined {\n if (payload == null || typeof payload !== 'object') {\n return undefined;\n }\n if (\n !Object.prototype.hasOwnProperty.call(\n payload,\n SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY\n )\n ) {\n return undefined;\n }\n const manifest = (payload as PayloadWithSubagentResumeManifest)[\n SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY\n ];\n return isSubagentResumeManifest(manifest) ? manifest : undefined;\n}\n\nexport function requireValidSubagentResumeManifest(\n payload: unknown\n): SubagentResumeManifest | undefined {\n if (\n payload == null ||\n typeof payload !== 'object' ||\n !Object.prototype.hasOwnProperty.call(\n payload,\n SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY\n )\n ) {\n return undefined;\n }\n const manifest = getSubagentResumeManifest(payload);\n if (manifest == null) {\n throw new Error('Invalid subagent resume manifest.');\n }\n return manifest;\n}\n\nfunction canAttachSubagentResumeManifestInline(\n payload: unknown\n): payload is Record<string, unknown> {\n if (\n payload == null ||\n typeof payload !== 'object' ||\n Array.isArray(payload) ||\n Object.getPrototypeOf(payload) !== Object.prototype\n ) {\n return false;\n }\n return SUBAGENT_RESUME_PRIVATE_PAYLOAD_KEYS.every(\n (key) => !Object.prototype.hasOwnProperty.call(payload, key)\n );\n}\n\nfunction isInlineSubagentResumePayload(\n payload: unknown\n): payload is PayloadWithSubagentResumeManifest & Record<string, unknown> {\n return (\n payload != null &&\n typeof payload === 'object' &&\n !Array.isArray(payload) &&\n Object.getPrototypeOf(payload) === Object.prototype &&\n !Object.prototype.hasOwnProperty.call(\n payload,\n SUBAGENT_RESUME_WRAPPER_VERSION_KEY\n ) &&\n !Object.prototype.hasOwnProperty.call(\n payload,\n SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY\n ) &&\n getSubagentResumeManifest(payload) != null\n );\n}\n\nexport function attachSubagentResumeManifest(\n payload: unknown,\n manifest: SubagentResumeManifest\n): object {\n if (\n isWrappedSubagentResumePayload(payload) ||\n isInlineSubagentResumePayload(payload)\n ) {\n return {\n ...payload,\n [SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY]: manifest,\n };\n }\n if (!canAttachSubagentResumeManifestInline(payload)) {\n return {\n [SUBAGENT_RESUME_WRAPPER_VERSION_KEY]: 1,\n [SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY]: payload,\n [SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY]: manifest,\n };\n }\n return {\n ...payload,\n [SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY]: manifest,\n };\n}\n\nexport function stripSubagentResumeManifest(payload: unknown): unknown {\n if (isWrappedSubagentResumePayload(payload)) {\n return payload[SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY];\n }\n if (\n payload == null ||\n typeof payload !== 'object' ||\n getSubagentResumeManifest(payload) == null\n ) {\n return payload;\n }\n return Object.fromEntries(\n Object.entries(payload).filter(\n ([key]) => key !== SUBAGENT_RESUME_MANIFEST_PAYLOAD_KEY\n )\n );\n}\n\nfunction isWrappedSubagentResumePayload(\n payload: unknown\n): payload is WrappedSubagentResumePayload {\n if (\n payload == null ||\n typeof payload !== 'object' ||\n Array.isArray(payload) ||\n Object.getPrototypeOf(payload) !== Object.prototype ||\n Object.keys(payload).length !== SUBAGENT_RESUME_PRIVATE_PAYLOAD_KEYS.length\n ) {\n return false;\n }\n const wrapper = payload as Partial<WrappedSubagentResumePayload>;\n return (\n wrapper[SUBAGENT_RESUME_WRAPPER_VERSION_KEY] === 1 &&\n Object.prototype.hasOwnProperty.call(\n wrapper,\n SUBAGENT_RESUME_WRAPPED_PAYLOAD_KEY\n ) &&\n getSubagentResumeManifest(wrapper) != null\n );\n}\n\nexport const SUBAGENT_REPLAY_CONTROLLER = Symbol.for(\n '@librechat/agents/subagent-replay-controller'\n);\n\nexport type SettledSubagentToolOutput = {\n output: ToolMessage;\n additionalContexts: string[];\n resolvedArgs?: Record<string, unknown>;\n referenceContent?: string;\n};\n\nexport interface SubagentReplayController {\n getResumeManifest?(\n parentToolCallIds?: ReadonlySet<string>,\n config?: RunnableConfig\n ): Promise<SubagentResumeManifest | undefined>;\n getSettledOutput(\n call: ToolCall,\n config: RunnableConfig\n ): Promise<SettledSubagentToolOutput | undefined>;\n persistSettledOutput(\n call: ToolCall,\n config: RunnableConfig,\n settled: SettledSubagentToolOutput\n ): Promise<void>;\n}\n\nexport type ReplayableSubagentTool = {\n [SUBAGENT_REPLAY_CONTROLLER]?: SubagentReplayController;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
const require_runtimeLimits = require("./runtimeLimits.cjs");
|
|
2
|
+
//#region src/tools/subagent/childGraphConfig.ts
|
|
3
|
+
const RESERVED_GRAPH_MEMBER_IDS = new Set([
|
|
4
|
+
"__start__",
|
|
5
|
+
"__end__",
|
|
6
|
+
"messages",
|
|
7
|
+
"agentMessages",
|
|
8
|
+
"subagentResult"
|
|
9
|
+
]);
|
|
10
|
+
function isObject(value) {
|
|
11
|
+
return value != null && typeof value === "object";
|
|
12
|
+
}
|
|
13
|
+
function isNonEmptyString(value) {
|
|
14
|
+
return typeof value === "string" && value.trim() !== "";
|
|
15
|
+
}
|
|
16
|
+
function isGraphSubagentConfig(config) {
|
|
17
|
+
return config.kind === "graph";
|
|
18
|
+
}
|
|
19
|
+
function assertGraphSubagentConfigShape(input) {
|
|
20
|
+
if (!isObject(input)) throw new Error("Graph subagent config must be an object.");
|
|
21
|
+
const candidate = input;
|
|
22
|
+
const configType = isNonEmptyString(candidate.type) ? candidate.type : "<unknown>";
|
|
23
|
+
if (candidate.kind !== "graph") throw new Error(`Graph subagent "${configType}" must set kind to "graph".`);
|
|
24
|
+
for (const [field, value] of [
|
|
25
|
+
["type", candidate.type],
|
|
26
|
+
["name", candidate.name],
|
|
27
|
+
["description", candidate.description],
|
|
28
|
+
["entryAgentId", candidate.entryAgentId],
|
|
29
|
+
["resultAgentId", candidate.resultAgentId]
|
|
30
|
+
]) if (!isNonEmptyString(value)) throw new Error(`Graph subagent "${configType}" must define a non-empty ${field}.`);
|
|
31
|
+
if (!Array.isArray(candidate.agents)) throw new Error(`Graph subagent "${configType}" agents must be an array.`);
|
|
32
|
+
const agents = candidate.agents;
|
|
33
|
+
for (const agent of agents) if (!isObject(agent)) throw new Error(`Graph subagent "${configType}" agents must contain objects.`);
|
|
34
|
+
if (!Array.isArray(candidate.edges)) throw new Error(`Graph subagent "${configType}" edges must be an array.`);
|
|
35
|
+
const edges = candidate.edges;
|
|
36
|
+
for (const edge of edges) if (!isObject(edge)) throw new Error(`Graph subagent "${configType}" edges must contain objects.`);
|
|
37
|
+
if (candidate.allowNested != null && typeof candidate.allowNested !== "boolean") throw new Error(`Graph subagent "${configType}" allowNested must be a boolean.`);
|
|
38
|
+
if (candidate.maxTurns != null && (typeof candidate.maxTurns !== "number" || !Number.isSafeInteger(candidate.maxTurns) || candidate.maxTurns <= 0)) throw new Error(`Graph subagent "${configType}" maxTurns must be a positive safe integer.`);
|
|
39
|
+
if (candidate.agentInputs !== void 0 || candidate.resolveAgentInputs !== void 0 || candidate.configId !== void 0 || candidate.self !== void 0) throw new Error(`Graph subagent "${configType}" cannot define agentInputs or self, or lazy fields configId/resolveAgentInputs.`);
|
|
40
|
+
}
|
|
41
|
+
function getEndpoints(endpoint) {
|
|
42
|
+
return Array.isArray(endpoint) ? endpoint : [endpoint];
|
|
43
|
+
}
|
|
44
|
+
function assertNonEmptyUniqueEndpoints(endpoints, label, edgeIndex) {
|
|
45
|
+
if (endpoints.length === 0) throw new Error(`Graph subagent edge ${edgeIndex} must include at least one ${label} agent.`);
|
|
46
|
+
const seen = /* @__PURE__ */ new Set();
|
|
47
|
+
for (const endpoint of endpoints) {
|
|
48
|
+
if (typeof endpoint !== "string" || endpoint.trim() === "") throw new Error(`Graph subagent edge ${edgeIndex} contains a blank ${label} agent ID.`);
|
|
49
|
+
if (seen.has(endpoint)) throw new Error(`Graph subagent edge ${edgeIndex} repeats ${label} agent "${endpoint}".`);
|
|
50
|
+
seen.add(endpoint);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function visitReachable(start, adjacency) {
|
|
54
|
+
const visited = /* @__PURE__ */ new Set();
|
|
55
|
+
const pending = [start];
|
|
56
|
+
while (pending.length > 0) {
|
|
57
|
+
const current = pending.pop();
|
|
58
|
+
if (current == null || visited.has(current)) continue;
|
|
59
|
+
visited.add(current);
|
|
60
|
+
for (const next of adjacency.get(current) ?? []) if (!visited.has(next)) pending.push(next);
|
|
61
|
+
}
|
|
62
|
+
return visited;
|
|
63
|
+
}
|
|
64
|
+
function validateGraphSubagentConfig(config) {
|
|
65
|
+
assertGraphSubagentConfigShape(config);
|
|
66
|
+
if (config.agents.length === 0) throw new Error(`Graph subagent "${config.type}" must include an agent.`);
|
|
67
|
+
if (config.agents.length > 32) throw new Error(`Graph subagent "${config.type}" cannot exceed 32 agents.`);
|
|
68
|
+
if (config.maxTurns != null && config.maxTurns > require_runtimeLimits.MAX_GRAPH_SUBAGENT_TURNS) throw new Error(`Graph subagent "${config.type}" maxTurns exceeds the safe graph recursion budget.`);
|
|
69
|
+
if (config.allowNested === true) throw new Error(`Graph subagent "${config.type}" cannot enable allowNested because graph-member nesting and resume semantics are outside this MVP.`);
|
|
70
|
+
const agentIds = /* @__PURE__ */ new Set();
|
|
71
|
+
for (const agent of config.agents) {
|
|
72
|
+
if (typeof agent.agentId !== "string" || agent.agentId.trim() === "") throw new Error(`Graph subagent "${config.type}" contains a blank agent ID.`);
|
|
73
|
+
if (agentIds.has(agent.agentId)) throw new Error(`Graph subagent "${config.type}" contains duplicate agent ID "${agent.agentId}".`);
|
|
74
|
+
if (RESERVED_GRAPH_MEMBER_IDS.has(agent.agentId) || agent.agentId.includes("|") || agent.agentId.includes(":")) throw new Error(`Graph subagent "${config.type}" agent ID "${agent.agentId}" is reserved by the graph runtime.`);
|
|
75
|
+
agentIds.add(agent.agentId);
|
|
76
|
+
}
|
|
77
|
+
if (!agentIds.has(config.entryAgentId)) throw new Error(`Graph subagent "${config.type}" entryAgentId "${config.entryAgentId}" is not a configured agent.`);
|
|
78
|
+
if (!agentIds.has(config.resultAgentId)) throw new Error(`Graph subagent "${config.type}" resultAgentId "${config.resultAgentId}" is not a configured agent.`);
|
|
79
|
+
const adjacency = /* @__PURE__ */ new Map();
|
|
80
|
+
const reverseAdjacency = /* @__PURE__ */ new Map();
|
|
81
|
+
const incomingEdgeSources = /* @__PURE__ */ new Map();
|
|
82
|
+
const promptedEdges = [];
|
|
83
|
+
const directedEdges = /* @__PURE__ */ new Set();
|
|
84
|
+
for (const agentId of agentIds) {
|
|
85
|
+
adjacency.set(agentId, /* @__PURE__ */ new Set());
|
|
86
|
+
reverseAdjacency.set(agentId, /* @__PURE__ */ new Set());
|
|
87
|
+
}
|
|
88
|
+
for (let edgeIndex = 0; edgeIndex < config.edges.length; edgeIndex++) {
|
|
89
|
+
const edge = config.edges[edgeIndex];
|
|
90
|
+
if (edge.edgeType !== "direct") throw new Error(`Graph subagent "${config.type}" edge ${edgeIndex} must set edgeType to "direct".`);
|
|
91
|
+
if (edge.condition != null) throw new Error(`Graph subagent "${config.type}" edge ${edgeIndex} cannot define a condition.`);
|
|
92
|
+
if (edge.promptKey != null) throw new Error(`Graph subagent "${config.type}" edge ${edgeIndex} cannot define promptKey.`);
|
|
93
|
+
const runtimePrompt = edge.prompt;
|
|
94
|
+
if (runtimePrompt != null && typeof runtimePrompt !== "string" && typeof runtimePrompt !== "function") throw new Error(`Graph subagent "${config.type}" edge ${edgeIndex} prompt must be a string or function.`);
|
|
95
|
+
const runtimeExcludeResults = edge.excludeResults;
|
|
96
|
+
if (runtimeExcludeResults != null && typeof runtimeExcludeResults !== "boolean") throw new Error(`Graph subagent "${config.type}" edge ${edgeIndex} excludeResults must be a boolean.`);
|
|
97
|
+
const sources = getEndpoints(edge.from);
|
|
98
|
+
const destinations = getEndpoints(edge.to);
|
|
99
|
+
assertNonEmptyUniqueEndpoints(sources, "source", edgeIndex);
|
|
100
|
+
assertNonEmptyUniqueEndpoints(destinations, "destination", edgeIndex);
|
|
101
|
+
if (runtimePrompt != null && runtimePrompt !== "") promptedEdges.push({
|
|
102
|
+
edgeIndex,
|
|
103
|
+
destinations
|
|
104
|
+
});
|
|
105
|
+
else if (runtimeExcludeResults != null) throw new Error(`Graph subagent "${config.type}" edge ${edgeIndex} cannot define excludeResults without a prompt.`);
|
|
106
|
+
for (const endpoint of [...sources, ...destinations]) if (!agentIds.has(endpoint)) throw new Error(`Graph subagent "${config.type}" edge ${edgeIndex} references unknown agent "${endpoint}".`);
|
|
107
|
+
for (const destination of destinations) {
|
|
108
|
+
const incomingGroups = incomingEdgeSources.get(destination) ?? [];
|
|
109
|
+
incomingGroups.push(sources);
|
|
110
|
+
incomingEdgeSources.set(destination, incomingGroups);
|
|
111
|
+
if (edge.prompt != null && edge.prompt !== "" && agentIds.has(`fan_in_${destination}_prompt`)) throw new Error(`Graph subagent "${config.type}" agent ID "fan_in_${destination}_prompt" conflicts with a generated prompt node.`);
|
|
112
|
+
for (const source of sources) {
|
|
113
|
+
if (source === destination) throw new Error(`Graph subagent "${config.type}" cannot contain self-edge "${source}".`);
|
|
114
|
+
const edgeKey = `${source}\u0000${destination}`;
|
|
115
|
+
if (directedEdges.has(edgeKey)) throw new Error(`Graph subagent "${config.type}" repeats edge "${source}" -> "${destination}".`);
|
|
116
|
+
directedEdges.add(edgeKey);
|
|
117
|
+
adjacency.get(source).add(destination);
|
|
118
|
+
reverseAdjacency.get(destination).add(source);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
for (const [destination, incomingGroups] of incomingEdgeSources) {
|
|
123
|
+
const incomingSources = reverseAdjacency.get(destination);
|
|
124
|
+
if (incomingSources.size <= 1) continue;
|
|
125
|
+
if (incomingGroups.length !== 1 || incomingGroups[0].length !== incomingSources.size) throw new Error(`Graph subagent "${config.type}" fan-in to "${destination}" must use one edge with an array-valued from field.`);
|
|
126
|
+
}
|
|
127
|
+
const isSimpleChain = [...agentIds].every((agentId) => adjacency.get(agentId).size <= 1 && reverseAdjacency.get(agentId).size <= 1);
|
|
128
|
+
for (const { edgeIndex, destinations } of promptedEdges) {
|
|
129
|
+
if (destinations.length !== 1) throw new Error(`Graph subagent "${config.type}" prompted edge ${edgeIndex} must have exactly one destination.`);
|
|
130
|
+
if (!isSimpleChain && destinations[0] !== config.resultAgentId) throw new Error(`Graph subagent "${config.type}" prompted edge ${edgeIndex} must target resultAgentId "${config.resultAgentId}" after parallel branches converge.`);
|
|
131
|
+
}
|
|
132
|
+
const roots = [...agentIds].filter((agentId) => reverseAdjacency.get(agentId).size === 0);
|
|
133
|
+
if (roots.length !== 1 || roots[0] !== config.entryAgentId) throw new Error(`Graph subagent "${config.type}" must have entryAgentId "${config.entryAgentId}" as its only root.`);
|
|
134
|
+
const sinks = [...agentIds].filter((agentId) => adjacency.get(agentId).size === 0);
|
|
135
|
+
if (sinks.length !== 1 || sinks[0] !== config.resultAgentId) throw new Error(`Graph subagent "${config.type}" must have resultAgentId "${config.resultAgentId}" as its only sink.`);
|
|
136
|
+
const remainingIncoming = /* @__PURE__ */ new Map();
|
|
137
|
+
const ready = [];
|
|
138
|
+
for (const agentId of agentIds) {
|
|
139
|
+
const incomingCount = reverseAdjacency.get(agentId).size;
|
|
140
|
+
remainingIncoming.set(agentId, incomingCount);
|
|
141
|
+
if (incomingCount === 0) ready.push(agentId);
|
|
142
|
+
}
|
|
143
|
+
let visitedCount = 0;
|
|
144
|
+
while (ready.length > 0) {
|
|
145
|
+
const current = ready.pop();
|
|
146
|
+
visitedCount++;
|
|
147
|
+
for (const destination of adjacency.get(current) ?? []) {
|
|
148
|
+
const incomingCount = remainingIncoming.get(destination) - 1;
|
|
149
|
+
remainingIncoming.set(destination, incomingCount);
|
|
150
|
+
if (incomingCount === 0) ready.push(destination);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (visitedCount !== agentIds.size) throw new Error(`Graph subagent "${config.type}" must be acyclic.`);
|
|
154
|
+
const reachableFromEntry = visitReachable(config.entryAgentId, adjacency);
|
|
155
|
+
const canReachResult = visitReachable(config.resultAgentId, reverseAdjacency);
|
|
156
|
+
if (reachableFromEntry.size !== agentIds.size || canReachResult.size !== agentIds.size) throw new Error(`Every agent in graph subagent "${config.type}" must be reachable from entryAgentId and able to reach resultAgentId.`);
|
|
157
|
+
}
|
|
158
|
+
function normalizeSingleAgentConfig(config, parentContext) {
|
|
159
|
+
const candidate = config;
|
|
160
|
+
if (candidate.kind === "agent" && (candidate.agents !== void 0 || candidate.edges !== void 0 || candidate.entryAgentId !== void 0 || candidate.resultAgentId !== void 0)) throw new Error(`Single-agent subagent "${config.type}" cannot define graph topology fields.`);
|
|
161
|
+
if (config.self === true && config.resolveAgentInputs != null) throw new Error(`Subagent "${config.type}" cannot combine self with resolveAgentInputs.`);
|
|
162
|
+
if (config.agentInputs != null) return config;
|
|
163
|
+
if (config.self === true && parentContext._sourceInputs != null) return {
|
|
164
|
+
...config,
|
|
165
|
+
agentInputs: { ...parentContext._sourceInputs }
|
|
166
|
+
};
|
|
167
|
+
if (config.resolveAgentInputs == null) return null;
|
|
168
|
+
if (!isNonEmptyString(config.configId)) throw new Error(`Lazy subagent "${config.type}" requires a non-empty "configId".`);
|
|
169
|
+
return config;
|
|
170
|
+
}
|
|
171
|
+
/** Normalize eager, self, lazy, and graph subagent entries for advertisement. */
|
|
172
|
+
function normalizeSubagentConfigEntries(configs, parentContext) {
|
|
173
|
+
const normalized = [];
|
|
174
|
+
const seenTypes = /* @__PURE__ */ new Set();
|
|
175
|
+
for (const config of configs) {
|
|
176
|
+
let executable;
|
|
177
|
+
if (isGraphSubagentConfig(config)) {
|
|
178
|
+
validateGraphSubagentConfig(config);
|
|
179
|
+
executable = config;
|
|
180
|
+
} else executable = normalizeSingleAgentConfig(config, parentContext);
|
|
181
|
+
if (executable == null) continue;
|
|
182
|
+
if (seenTypes.has(executable.type)) throw new Error(`Duplicate subagent type "${executable.type}". Each SubagentConfig must have a unique "type" field.`);
|
|
183
|
+
seenTypes.add(executable.type);
|
|
184
|
+
normalized.push(executable);
|
|
185
|
+
}
|
|
186
|
+
return normalized;
|
|
187
|
+
}
|
|
188
|
+
/** Resolve self-spawn inputs and validate explicit graph configs. */
|
|
189
|
+
function resolveSubagentConfigEntries(configs, parentContext) {
|
|
190
|
+
return normalizeSubagentConfigEntries(configs, parentContext).filter((config) => isGraphSubagentConfig(config) || config.agentInputs != null);
|
|
191
|
+
}
|
|
192
|
+
/** Resolve legacy single-agent configs with the original public signature. */
|
|
193
|
+
function resolveSubagentConfigs(configs, parentContext) {
|
|
194
|
+
const graphConfig = configs.find(isGraphSubagentConfig);
|
|
195
|
+
if (graphConfig != null) throw new Error(`Graph subagent "${graphConfig.type}" requires resolveSubagentConfigEntries().`);
|
|
196
|
+
return resolveSubagentConfigEntries(configs, parentContext);
|
|
197
|
+
}
|
|
198
|
+
/** Normalize legacy single-agent configs while rejecting graph entries. */
|
|
199
|
+
function normalizeSubagentConfigs(configs, parentContext) {
|
|
200
|
+
const graphConfig = configs.find(isGraphSubagentConfig);
|
|
201
|
+
if (graphConfig != null) throw new Error(`Graph subagent "${graphConfig.type}" requires normalizeSubagentConfigEntries().`);
|
|
202
|
+
return normalizeSubagentConfigEntries(configs, parentContext);
|
|
203
|
+
}
|
|
204
|
+
function prepareChildInputs({ agentInputs, agentId, self, allowNested, parentMaxDepth, keepToolDefinitions }) {
|
|
205
|
+
const childInputs = {
|
|
206
|
+
...agentInputs,
|
|
207
|
+
agentId,
|
|
208
|
+
toolDefinitions: keepToolDefinitions ? agentInputs.toolDefinitions : void 0,
|
|
209
|
+
initialSummary: void 0,
|
|
210
|
+
discoveredTools: void 0,
|
|
211
|
+
graphTools: self ? void 0 : agentInputs.graphTools
|
|
212
|
+
};
|
|
213
|
+
if (allowNested) childInputs.maxSubagentDepth = Math.max(0, parentMaxDepth - 1);
|
|
214
|
+
else {
|
|
215
|
+
childInputs.subagentConfigs = void 0;
|
|
216
|
+
childInputs.maxSubagentDepth = void 0;
|
|
217
|
+
}
|
|
218
|
+
return childInputs;
|
|
219
|
+
}
|
|
220
|
+
function buildChildInputs(config, childAgentId, parentMaxDepth, keepToolDefinitions = false) {
|
|
221
|
+
return prepareChildInputs({
|
|
222
|
+
agentInputs: config.agentInputs,
|
|
223
|
+
agentId: childAgentId,
|
|
224
|
+
self: config.self === true,
|
|
225
|
+
allowNested: config.allowNested === true,
|
|
226
|
+
parentMaxDepth,
|
|
227
|
+
keepToolDefinitions
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
function buildGraphChildInputs(config, parentMaxDepth, keepToolDefinitions = false) {
|
|
231
|
+
return config.agents.map((agentInputs) => prepareChildInputs({
|
|
232
|
+
agentInputs,
|
|
233
|
+
agentId: agentInputs.agentId,
|
|
234
|
+
self: false,
|
|
235
|
+
allowNested: false,
|
|
236
|
+
parentMaxDepth,
|
|
237
|
+
keepToolDefinitions
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
function createChildGraphPlan({ config, executionSuffix, parentAgentId, parentMaxDepth, keepToolDefinitions }) {
|
|
241
|
+
if (isGraphSubagentConfig(config)) {
|
|
242
|
+
validateGraphSubagentConfig(config);
|
|
243
|
+
const agents = buildGraphChildInputs(config, parentMaxDepth, keepToolDefinitions);
|
|
244
|
+
return {
|
|
245
|
+
kind: "graph",
|
|
246
|
+
subjectAgentId: `${parentAgentId ?? "agent"}_subgraph_${executionSuffix}`,
|
|
247
|
+
checkpointNodeId: config.resultAgentId,
|
|
248
|
+
agents,
|
|
249
|
+
memberInputs: new Map(agents.map((agentInputs) => [agentInputs.agentId, agentInputs])),
|
|
250
|
+
edges: config.edges.map((edge) => ({
|
|
251
|
+
...edge,
|
|
252
|
+
from: Array.isArray(edge.from) ? [...edge.from] : edge.from,
|
|
253
|
+
to: Array.isArray(edge.to) ? [...edge.to] : edge.to
|
|
254
|
+
})),
|
|
255
|
+
entryAgentId: config.entryAgentId,
|
|
256
|
+
resultAgentId: config.resultAgentId
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
const childAgentId = config.agentInputs.agentId || `${parentAgentId ?? "agent"}_sub_${executionSuffix}`;
|
|
260
|
+
const childInputs = buildChildInputs(config, childAgentId, parentMaxDepth, keepToolDefinitions);
|
|
261
|
+
return {
|
|
262
|
+
kind: "agent",
|
|
263
|
+
subjectAgentId: childAgentId,
|
|
264
|
+
checkpointNodeId: childAgentId,
|
|
265
|
+
agents: [childInputs],
|
|
266
|
+
memberInputs: new Map([[childAgentId, childInputs]])
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
//#endregion
|
|
270
|
+
exports.buildChildInputs = buildChildInputs;
|
|
271
|
+
exports.createChildGraphPlan = createChildGraphPlan;
|
|
272
|
+
exports.isGraphSubagentConfig = isGraphSubagentConfig;
|
|
273
|
+
exports.normalizeSubagentConfigEntries = normalizeSubagentConfigEntries;
|
|
274
|
+
exports.normalizeSubagentConfigs = normalizeSubagentConfigs;
|
|
275
|
+
exports.resolveSubagentConfigEntries = resolveSubagentConfigEntries;
|
|
276
|
+
exports.resolveSubagentConfigs = resolveSubagentConfigs;
|
|
277
|
+
|
|
278
|
+
//# sourceMappingURL=childGraphConfig.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"childGraphConfig.cjs","names":["MAX_GRAPH_SUBAGENT_TURNS"],"sources":["../../../../src/tools/subagent/childGraphConfig.ts"],"sourcesContent":["import type {\n AgentInputs,\n ExecutableSubagentConfig,\n ExecutableSubagentConfigEntry,\n GraphEdge,\n GraphSubagentConfig,\n ResolvedSingleAgentSubagentConfig,\n ResolvedSubagentConfig,\n ResolvedSubagentConfigEntry,\n SubagentConfig,\n SubagentConfigEntry,\n} from '@/types';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport {\n MAX_GRAPH_SUBAGENT_MEMBERS,\n MAX_GRAPH_SUBAGENT_TURNS,\n} from './runtimeLimits';\n\nconst RESERVED_GRAPH_MEMBER_IDS = new Set([\n '__start__',\n '__end__',\n 'messages',\n 'agentMessages',\n 'subagentResult',\n]);\n\ntype ChildGraphPlanBase = {\n subjectAgentId: string;\n checkpointNodeId: string;\n agents: AgentInputs[];\n memberInputs: ReadonlyMap<string, AgentInputs>;\n};\n\nexport type ChildGraphPlan =\n | (ChildGraphPlanBase & {\n kind: 'agent';\n })\n | (ChildGraphPlanBase & {\n kind: 'graph';\n edges: GraphEdge[];\n entryAgentId: string;\n resultAgentId: string;\n });\n\ntype CreateChildGraphPlanParams = {\n config: ResolvedSubagentConfigEntry;\n executionSuffix: string;\n parentAgentId?: string;\n parentMaxDepth: number;\n keepToolDefinitions: boolean;\n};\n\ntype UnvalidatedGraphSubagentConfig = Omit<\n GraphSubagentConfig,\n 'allowNested' | 'edges'\n> & { allowNested?: boolean; edges: GraphEdge[] };\n\ntype GraphSubagentConfigCandidate = {\n kind?: unknown;\n type?: unknown;\n name?: unknown;\n description?: unknown;\n maxTurns?: unknown;\n allowNested?: unknown;\n agents?: unknown;\n edges?: unknown;\n entryAgentId?: unknown;\n resultAgentId?: unknown;\n configId?: unknown;\n agentInputs?: unknown;\n resolveAgentInputs?: unknown;\n self?: unknown;\n};\n\nfunction isObject(value: unknown): value is object {\n return value != null && typeof value === 'object';\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim() !== '';\n}\n\nexport function isGraphSubagentConfig(\n config: SubagentConfigEntry\n): config is GraphSubagentConfig {\n return (config as { kind?: unknown }).kind === 'graph';\n}\n\nfunction assertGraphSubagentConfigShape(\n input: unknown\n): asserts input is UnvalidatedGraphSubagentConfig {\n if (!isObject(input)) {\n throw new Error('Graph subagent config must be an object.');\n }\n const candidate = input as GraphSubagentConfigCandidate;\n const configType = isNonEmptyString(candidate.type)\n ? candidate.type\n : '<unknown>';\n if (candidate.kind !== 'graph') {\n throw new Error(`Graph subagent \"${configType}\" must set kind to \"graph\".`);\n }\n for (const [field, value] of [\n ['type', candidate.type],\n ['name', candidate.name],\n ['description', candidate.description],\n ['entryAgentId', candidate.entryAgentId],\n ['resultAgentId', candidate.resultAgentId],\n ] as const) {\n if (!isNonEmptyString(value)) {\n throw new Error(\n `Graph subagent \"${configType}\" must define a non-empty ${field}.`\n );\n }\n }\n if (!Array.isArray(candidate.agents)) {\n throw new Error(`Graph subagent \"${configType}\" agents must be an array.`);\n }\n const agents: unknown[] = candidate.agents;\n for (const agent of agents) {\n if (!isObject(agent)) {\n throw new Error(\n `Graph subagent \"${configType}\" agents must contain objects.`\n );\n }\n }\n if (!Array.isArray(candidate.edges)) {\n throw new Error(`Graph subagent \"${configType}\" edges must be an array.`);\n }\n const edges: unknown[] = candidate.edges;\n for (const edge of edges) {\n if (!isObject(edge)) {\n throw new Error(\n `Graph subagent \"${configType}\" edges must contain objects.`\n );\n }\n }\n if (\n candidate.allowNested != null &&\n typeof candidate.allowNested !== 'boolean'\n ) {\n throw new Error(\n `Graph subagent \"${configType}\" allowNested must be a boolean.`\n );\n }\n if (\n candidate.maxTurns != null &&\n (typeof candidate.maxTurns !== 'number' ||\n !Number.isSafeInteger(candidate.maxTurns) ||\n candidate.maxTurns <= 0)\n ) {\n throw new Error(\n `Graph subagent \"${configType}\" maxTurns must be a positive safe integer.`\n );\n }\n if (\n candidate.agentInputs !== undefined ||\n candidate.resolveAgentInputs !== undefined ||\n candidate.configId !== undefined ||\n candidate.self !== undefined\n ) {\n throw new Error(\n `Graph subagent \"${configType}\" cannot define agentInputs or self, or lazy fields configId/resolveAgentInputs.`\n );\n }\n}\n\nfunction getEndpoints(endpoint: string | string[]): string[] {\n return Array.isArray(endpoint) ? endpoint : [endpoint];\n}\n\nfunction assertNonEmptyUniqueEndpoints(\n endpoints: string[],\n label: string,\n edgeIndex: number\n): void {\n if (endpoints.length === 0) {\n throw new Error(\n `Graph subagent edge ${edgeIndex} must include at least one ${label} agent.`\n );\n }\n const seen = new Set<string>();\n for (const endpoint of endpoints) {\n if (typeof endpoint !== 'string' || endpoint.trim() === '') {\n throw new Error(\n `Graph subagent edge ${edgeIndex} contains a blank ${label} agent ID.`\n );\n }\n if (seen.has(endpoint)) {\n throw new Error(\n `Graph subagent edge ${edgeIndex} repeats ${label} agent \"${endpoint}\".`\n );\n }\n seen.add(endpoint);\n }\n}\n\nfunction visitReachable(\n start: string,\n adjacency: ReadonlyMap<string, ReadonlySet<string>>\n): Set<string> {\n const visited = new Set<string>();\n const pending = [start];\n while (pending.length > 0) {\n const current = pending.pop();\n if (current == null || visited.has(current)) {\n continue;\n }\n visited.add(current);\n for (const next of adjacency.get(current) ?? []) {\n if (!visited.has(next)) {\n pending.push(next);\n }\n }\n }\n return visited;\n}\n\nexport function validateGraphSubagentConfig(config: unknown): void {\n assertGraphSubagentConfigShape(config);\n if (config.agents.length === 0) {\n throw new Error(`Graph subagent \"${config.type}\" must include an agent.`);\n }\n if (config.agents.length > MAX_GRAPH_SUBAGENT_MEMBERS) {\n throw new Error(\n `Graph subagent \"${config.type}\" cannot exceed ${MAX_GRAPH_SUBAGENT_MEMBERS} agents.`\n );\n }\n if (config.maxTurns != null && config.maxTurns > MAX_GRAPH_SUBAGENT_TURNS) {\n throw new Error(\n `Graph subagent \"${config.type}\" maxTurns exceeds the safe graph recursion budget.`\n );\n }\n if (config.allowNested === true) {\n throw new Error(\n `Graph subagent \"${config.type}\" cannot enable allowNested because graph-member nesting and resume semantics are outside this MVP.`\n );\n }\n\n const agentIds = new Set<string>();\n for (const agent of config.agents) {\n if (typeof agent.agentId !== 'string' || agent.agentId.trim() === '') {\n throw new Error(\n `Graph subagent \"${config.type}\" contains a blank agent ID.`\n );\n }\n if (agentIds.has(agent.agentId)) {\n throw new Error(\n `Graph subagent \"${config.type}\" contains duplicate agent ID \"${agent.agentId}\".`\n );\n }\n if (\n RESERVED_GRAPH_MEMBER_IDS.has(agent.agentId) ||\n agent.agentId.includes('|') ||\n agent.agentId.includes(':')\n ) {\n throw new Error(\n `Graph subagent \"${config.type}\" agent ID \"${agent.agentId}\" is reserved by the graph runtime.`\n );\n }\n agentIds.add(agent.agentId);\n }\n\n if (!agentIds.has(config.entryAgentId)) {\n throw new Error(\n `Graph subagent \"${config.type}\" entryAgentId \"${config.entryAgentId}\" is not a configured agent.`\n );\n }\n if (!agentIds.has(config.resultAgentId)) {\n throw new Error(\n `Graph subagent \"${config.type}\" resultAgentId \"${config.resultAgentId}\" is not a configured agent.`\n );\n }\n\n const adjacency = new Map<string, Set<string>>();\n const reverseAdjacency = new Map<string, Set<string>>();\n const incomingEdgeSources = new Map<string, string[][]>();\n const promptedEdges: Array<{\n edgeIndex: number;\n destinations: string[];\n }> = [];\n const directedEdges = new Set<string>();\n for (const agentId of agentIds) {\n adjacency.set(agentId, new Set());\n reverseAdjacency.set(agentId, new Set());\n }\n\n for (let edgeIndex = 0; edgeIndex < config.edges.length; edgeIndex++) {\n const edge = config.edges[edgeIndex];\n if (edge.edgeType !== 'direct') {\n throw new Error(\n `Graph subagent \"${config.type}\" edge ${edgeIndex} must set edgeType to \"direct\".`\n );\n }\n if (edge.condition != null) {\n throw new Error(\n `Graph subagent \"${config.type}\" edge ${edgeIndex} cannot define a condition.`\n );\n }\n if (edge.promptKey != null) {\n throw new Error(\n `Graph subagent \"${config.type}\" edge ${edgeIndex} cannot define promptKey.`\n );\n }\n const runtimePrompt = (edge as { prompt?: unknown }).prompt;\n if (\n runtimePrompt != null &&\n typeof runtimePrompt !== 'string' &&\n typeof runtimePrompt !== 'function'\n ) {\n throw new Error(\n `Graph subagent \"${config.type}\" edge ${edgeIndex} prompt must be a string or function.`\n );\n }\n const runtimeExcludeResults = (edge as { excludeResults?: unknown })\n .excludeResults;\n if (\n runtimeExcludeResults != null &&\n typeof runtimeExcludeResults !== 'boolean'\n ) {\n throw new Error(\n `Graph subagent \"${config.type}\" edge ${edgeIndex} excludeResults must be a boolean.`\n );\n }\n\n const sources = getEndpoints(edge.from);\n const destinations = getEndpoints(edge.to);\n assertNonEmptyUniqueEndpoints(sources, 'source', edgeIndex);\n assertNonEmptyUniqueEndpoints(destinations, 'destination', edgeIndex);\n if (runtimePrompt != null && runtimePrompt !== '') {\n promptedEdges.push({ edgeIndex, destinations });\n } else if (runtimeExcludeResults != null) {\n throw new Error(\n `Graph subagent \"${config.type}\" edge ${edgeIndex} cannot define excludeResults without a prompt.`\n );\n }\n\n for (const endpoint of [...sources, ...destinations]) {\n if (!agentIds.has(endpoint)) {\n throw new Error(\n `Graph subagent \"${config.type}\" edge ${edgeIndex} references unknown agent \"${endpoint}\".`\n );\n }\n }\n\n for (const destination of destinations) {\n const incomingGroups = incomingEdgeSources.get(destination) ?? [];\n incomingGroups.push(sources);\n incomingEdgeSources.set(destination, incomingGroups);\n if (\n edge.prompt != null &&\n edge.prompt !== '' &&\n agentIds.has(`fan_in_${destination}_prompt`)\n ) {\n throw new Error(\n `Graph subagent \"${config.type}\" agent ID \"fan_in_${destination}_prompt\" conflicts with a generated prompt node.`\n );\n }\n for (const source of sources) {\n if (source === destination) {\n throw new Error(\n `Graph subagent \"${config.type}\" cannot contain self-edge \"${source}\".`\n );\n }\n const edgeKey = `${source}\\u0000${destination}`;\n if (directedEdges.has(edgeKey)) {\n throw new Error(\n `Graph subagent \"${config.type}\" repeats edge \"${source}\" -> \"${destination}\".`\n );\n }\n directedEdges.add(edgeKey);\n adjacency.get(source)!.add(destination);\n reverseAdjacency.get(destination)!.add(source);\n }\n }\n }\n\n for (const [destination, incomingGroups] of incomingEdgeSources) {\n const incomingSources = reverseAdjacency.get(destination)!;\n if (incomingSources.size <= 1) {\n continue;\n }\n if (\n incomingGroups.length !== 1 ||\n incomingGroups[0].length !== incomingSources.size\n ) {\n throw new Error(\n `Graph subagent \"${config.type}\" fan-in to \"${destination}\" must use one edge with an array-valued from field.`\n );\n }\n }\n\n const isSimpleChain = [...agentIds].every(\n (agentId) =>\n adjacency.get(agentId)!.size <= 1 &&\n reverseAdjacency.get(agentId)!.size <= 1\n );\n for (const { edgeIndex, destinations } of promptedEdges) {\n if (destinations.length !== 1) {\n throw new Error(\n `Graph subagent \"${config.type}\" prompted edge ${edgeIndex} must have exactly one destination.`\n );\n }\n if (!isSimpleChain && destinations[0] !== config.resultAgentId) {\n throw new Error(\n `Graph subagent \"${config.type}\" prompted edge ${edgeIndex} must target resultAgentId \"${config.resultAgentId}\" after parallel branches converge.`\n );\n }\n }\n\n const roots = [...agentIds].filter(\n (agentId) => reverseAdjacency.get(agentId)!.size === 0\n );\n if (roots.length !== 1 || roots[0] !== config.entryAgentId) {\n throw new Error(\n `Graph subagent \"${config.type}\" must have entryAgentId \"${config.entryAgentId}\" as its only root.`\n );\n }\n const sinks = [...agentIds].filter(\n (agentId) => adjacency.get(agentId)!.size === 0\n );\n if (sinks.length !== 1 || sinks[0] !== config.resultAgentId) {\n throw new Error(\n `Graph subagent \"${config.type}\" must have resultAgentId \"${config.resultAgentId}\" as its only sink.`\n );\n }\n\n const remainingIncoming = new Map<string, number>();\n const ready: string[] = [];\n for (const agentId of agentIds) {\n const incomingCount = reverseAdjacency.get(agentId)!.size;\n remainingIncoming.set(agentId, incomingCount);\n if (incomingCount === 0) {\n ready.push(agentId);\n }\n }\n let visitedCount = 0;\n while (ready.length > 0) {\n const current = ready.pop()!;\n visitedCount++;\n for (const destination of adjacency.get(current) ?? []) {\n const incomingCount = remainingIncoming.get(destination)! - 1;\n remainingIncoming.set(destination, incomingCount);\n if (incomingCount === 0) {\n ready.push(destination);\n }\n }\n }\n if (visitedCount !== agentIds.size) {\n throw new Error(`Graph subagent \"${config.type}\" must be acyclic.`);\n }\n\n const reachableFromEntry = visitReachable(config.entryAgentId, adjacency);\n const canReachResult = visitReachable(config.resultAgentId, reverseAdjacency);\n if (\n reachableFromEntry.size !== agentIds.size ||\n canReachResult.size !== agentIds.size\n ) {\n throw new Error(\n `Every agent in graph subagent \"${config.type}\" must be reachable from entryAgentId and able to reach resultAgentId.`\n );\n }\n}\n\nfunction normalizeSingleAgentConfig(\n config: SubagentConfig,\n parentContext: AgentContext\n): ExecutableSubagentConfig | null {\n const candidate = config as GraphSubagentConfigCandidate;\n if (\n candidate.kind === 'agent' &&\n (candidate.agents !== undefined ||\n candidate.edges !== undefined ||\n candidate.entryAgentId !== undefined ||\n candidate.resultAgentId !== undefined)\n ) {\n throw new Error(\n `Single-agent subagent \"${config.type}\" cannot define graph topology fields.`\n );\n }\n if (config.self === true && config.resolveAgentInputs != null) {\n throw new Error(\n `Subagent \"${config.type}\" cannot combine self with resolveAgentInputs.`\n );\n }\n if (config.agentInputs != null) {\n return config as ResolvedSingleAgentSubagentConfig;\n }\n if (config.self === true && parentContext._sourceInputs != null) {\n return {\n ...config,\n agentInputs: { ...parentContext._sourceInputs },\n };\n }\n if (config.resolveAgentInputs == null) {\n return null;\n }\n if (!isNonEmptyString(config.configId)) {\n throw new Error(\n `Lazy subagent \"${config.type}\" requires a non-empty \"configId\".`\n );\n }\n return config as ExecutableSubagentConfig;\n}\n\n/** Normalize eager, self, lazy, and graph subagent entries for advertisement. */\nexport function normalizeSubagentConfigEntries(\n configs: SubagentConfigEntry[],\n parentContext: AgentContext\n): ExecutableSubagentConfigEntry[] {\n const normalized: ExecutableSubagentConfigEntry[] = [];\n const seenTypes = new Set<string>();\n for (const config of configs) {\n let executable: ExecutableSubagentConfigEntry | null;\n if (isGraphSubagentConfig(config)) {\n validateGraphSubagentConfig(config);\n executable = config;\n } else {\n executable = normalizeSingleAgentConfig(config, parentContext);\n }\n if (executable == null) {\n continue;\n }\n if (seenTypes.has(executable.type)) {\n throw new Error(\n `Duplicate subagent type \"${executable.type}\". Each SubagentConfig must have a unique \"type\" field.`\n );\n }\n seenTypes.add(executable.type);\n normalized.push(executable);\n }\n return normalized;\n}\n\n/** Resolve self-spawn inputs and validate explicit graph configs. */\nexport function resolveSubagentConfigEntries(\n configs: SubagentConfigEntry[],\n parentContext: AgentContext\n): ResolvedSubagentConfigEntry[] {\n return normalizeSubagentConfigEntries(configs, parentContext).filter(\n (config): config is ResolvedSubagentConfigEntry =>\n isGraphSubagentConfig(config) || config.agentInputs != null\n );\n}\n\n/** Resolve legacy single-agent configs with the original public signature. */\nexport function resolveSubagentConfigs(\n configs: SubagentConfig[],\n parentContext: AgentContext\n): ResolvedSubagentConfig[] {\n const graphConfig = configs.find(isGraphSubagentConfig);\n if (graphConfig != null) {\n throw new Error(\n `Graph subagent \"${graphConfig.type}\" requires resolveSubagentConfigEntries().`\n );\n }\n return resolveSubagentConfigEntries(\n configs,\n parentContext\n ) as ResolvedSubagentConfig[];\n}\n\n/** Normalize legacy single-agent configs while rejecting graph entries. */\nexport function normalizeSubagentConfigs(\n configs: SubagentConfig[],\n parentContext: AgentContext\n): ExecutableSubagentConfig[] {\n const graphConfig = configs.find(isGraphSubagentConfig);\n if (graphConfig != null) {\n throw new Error(\n `Graph subagent \"${graphConfig.type}\" requires normalizeSubagentConfigEntries().`\n );\n }\n return normalizeSubagentConfigEntries(\n configs,\n parentContext\n ) as ExecutableSubagentConfig[];\n}\n\nfunction prepareChildInputs({\n agentInputs,\n agentId,\n self,\n allowNested,\n parentMaxDepth,\n keepToolDefinitions,\n}: {\n agentInputs: AgentInputs;\n agentId: string;\n self: boolean;\n allowNested: boolean;\n parentMaxDepth: number;\n keepToolDefinitions: boolean;\n}): AgentInputs {\n const childInputs: AgentInputs = {\n ...agentInputs,\n agentId,\n toolDefinitions: keepToolDefinitions\n ? agentInputs.toolDefinitions\n : undefined,\n initialSummary: undefined,\n discoveredTools: undefined,\n graphTools: self ? undefined : agentInputs.graphTools,\n };\n if (allowNested) {\n childInputs.maxSubagentDepth = Math.max(0, parentMaxDepth - 1);\n } else {\n childInputs.subagentConfigs = undefined;\n childInputs.maxSubagentDepth = undefined;\n }\n return childInputs;\n}\n\nexport function buildChildInputs(\n config: ResolvedSubagentConfig,\n childAgentId: string,\n parentMaxDepth: number,\n keepToolDefinitions: boolean = false\n): AgentInputs {\n return prepareChildInputs({\n agentInputs: config.agentInputs,\n agentId: childAgentId,\n self: config.self === true,\n allowNested: config.allowNested === true,\n parentMaxDepth,\n keepToolDefinitions,\n });\n}\n\nexport function buildGraphChildInputs(\n config: GraphSubagentConfig,\n parentMaxDepth: number,\n keepToolDefinitions: boolean = false\n): AgentInputs[] {\n return config.agents.map((agentInputs) =>\n prepareChildInputs({\n agentInputs,\n agentId: agentInputs.agentId,\n self: false,\n allowNested: false,\n parentMaxDepth,\n keepToolDefinitions,\n })\n );\n}\n\nexport function createChildGraphPlan({\n config,\n executionSuffix,\n parentAgentId,\n parentMaxDepth,\n keepToolDefinitions,\n}: CreateChildGraphPlanParams): ChildGraphPlan {\n if (isGraphSubagentConfig(config)) {\n validateGraphSubagentConfig(config);\n const agents = buildGraphChildInputs(\n config,\n parentMaxDepth,\n keepToolDefinitions\n );\n return {\n kind: 'graph',\n subjectAgentId: `${parentAgentId ?? 'agent'}_subgraph_${executionSuffix}`,\n checkpointNodeId: config.resultAgentId,\n agents,\n memberInputs: new Map(\n agents.map((agentInputs) => [agentInputs.agentId, agentInputs])\n ),\n edges: config.edges.map((edge) => ({\n ...edge,\n from: Array.isArray(edge.from) ? [...edge.from] : edge.from,\n to: Array.isArray(edge.to) ? [...edge.to] : edge.to,\n })),\n entryAgentId: config.entryAgentId,\n resultAgentId: config.resultAgentId,\n };\n }\n\n const childAgentId =\n config.agentInputs.agentId ||\n `${parentAgentId ?? 'agent'}_sub_${executionSuffix}`;\n const childInputs = buildChildInputs(\n config,\n childAgentId,\n parentMaxDepth,\n keepToolDefinitions\n );\n return {\n kind: 'agent',\n subjectAgentId: childAgentId,\n checkpointNodeId: childAgentId,\n agents: [childInputs],\n memberInputs: new Map([[childAgentId, childInputs]]),\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeLimits.cjs","names":[],"sources":["../../../../src/tools/subagent/runtimeLimits.ts"],"sourcesContent":["export const DEFAULT_SUBAGENT_MAX_TURNS = 25;\nexport const SUBAGENT_RECURSION_MULTIPLIER = 3;\nexport const MAX_GRAPH_SUBAGENT_MEMBERS = 32;\nexport const MAX_GRAPH_SUBAGENT_TURNS = Math.floor(\n Number.MAX_SAFE_INTEGER /\n (SUBAGENT_RECURSION_MULTIPLIER * MAX_GRAPH_SUBAGENT_MEMBERS)\n);\n"],"mappings":"AAGA,MAAa,2BAA2B,KAAK,MAC3C,OAAO,mBAAA,EAET"}
|