@librechat/agents 3.1.90 → 3.1.91
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 +9 -5
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +46 -14
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/langfuse.cjs +234 -0
- package/dist/cjs/langfuse.cjs.map +1 -0
- package/dist/cjs/main.cjs +25 -0
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/run.cjs +44 -27
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/stream.cjs +10 -3
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +380 -0
- package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -0
- package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs +997 -0
- package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -0
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +575 -0
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -0
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +165 -0
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -0
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs +17 -5
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +110 -6
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +9 -5
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +46 -14
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/langfuse.mjs +226 -0
- package/dist/esm/langfuse.mjs.map +1 -0
- package/dist/esm/main.mjs +5 -1
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/run.mjs +44 -27
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/stream.mjs +10 -3
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +378 -0
- package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -0
- package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs +994 -0
- package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -0
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +566 -0
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -0
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +155 -0
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -0
- package/dist/esm/tools/local/LocalExecutionEngine.mjs +17 -6
- package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +111 -7
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +4 -1
- package/dist/types/graphs/Graph.d.ts +6 -5
- package/dist/types/index.d.ts +1 -0
- package/dist/types/langfuse.d.ts +48 -0
- package/dist/types/tools/cloudflare/CloudflareBridgeRuntime.d.ts +23 -0
- package/dist/types/tools/cloudflare/CloudflareProgrammaticToolCalling.d.ts +4 -0
- package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +21 -0
- package/dist/types/tools/cloudflare/CloudflareSandboxTools.d.ts +22 -0
- package/dist/types/tools/cloudflare/index.d.ts +4 -0
- package/dist/types/tools/local/LocalExecutionEngine.d.ts +1 -0
- package/dist/types/types/graph.d.ts +8 -0
- package/dist/types/types/tools.d.ts +118 -2
- package/package.json +4 -4
- package/src/__tests__/stream.eagerEventExecution.test.ts +66 -0
- package/src/agents/AgentContext.ts +13 -3
- package/src/graphs/Graph.ts +53 -16
- package/src/index.ts +1 -0
- package/src/langfuse.ts +358 -0
- package/src/run.ts +60 -38
- package/src/specs/langfuse-config.test.ts +57 -0
- package/src/specs/langfuse-metadata.test.ts +19 -1
- package/src/stream.ts +13 -3
- package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +537 -0
- package/src/tools/cloudflare/CloudflareBridgeRuntime.ts +480 -0
- package/src/tools/cloudflare/CloudflareProgrammaticToolCalling.ts +1162 -0
- package/src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts +744 -0
- package/src/tools/cloudflare/CloudflareSandboxTools.ts +225 -0
- package/src/tools/cloudflare/index.ts +4 -0
- package/src/tools/local/LocalExecutionEngine.ts +20 -4
- package/src/tools/local/resolveLocalExecutionTools.ts +169 -7
- package/src/types/graph.ts +9 -0
- package/src/types/tools.ts +141 -2
|
@@ -1,14 +1,54 @@
|
|
|
1
|
-
import { CODE_EXECUTION_TOOLS, Constants } from '../../common/enum.mjs';
|
|
1
|
+
import { CODE_EXECUTION_TOOLS, LOCAL_CODING_BUNDLE_NAMES, Constants } from '../../common/enum.mjs';
|
|
2
2
|
import { createLocalBashExecutionTool, createLocalCodeExecutionTool } from './LocalExecutionTools.mjs';
|
|
3
3
|
import { createLocalCodingToolBundle, createLocalCodingTools, createLocalCodingToolDefinitions } from './LocalCodingTools.mjs';
|
|
4
4
|
import { createLocalBashProgrammaticToolCallingTool, createLocalProgrammaticToolCallingTool } from './LocalProgrammaticToolCalling.mjs';
|
|
5
|
+
import 'path';
|
|
6
|
+
import '../cloudflare/CloudflareProgrammaticToolCalling.mjs';
|
|
7
|
+
import 'events';
|
|
8
|
+
import 'stream';
|
|
9
|
+
import './LocalExecutionEngine.mjs';
|
|
10
|
+
import { createCloudflareCodingToolBundle, createCloudflareCodingTools, createCloudflareExecutionTool } from '../cloudflare/CloudflareSandboxTools.mjs';
|
|
5
11
|
|
|
6
12
|
function shouldUseLocalExecution(config) {
|
|
7
13
|
return config?.engine === 'local';
|
|
8
14
|
}
|
|
15
|
+
function shouldUseCloudflareSandboxExecution(config) {
|
|
16
|
+
return config?.engine === 'cloudflare-sandbox';
|
|
17
|
+
}
|
|
9
18
|
function shouldIncludeCodingTools(config) {
|
|
10
|
-
return (shouldUseLocalExecution(config) &&
|
|
11
|
-
config?.local?.includeCodingTools !== false)
|
|
19
|
+
return ((shouldUseLocalExecution(config) &&
|
|
20
|
+
config?.local?.includeCodingTools !== false) ||
|
|
21
|
+
(shouldUseCloudflareSandboxExecution(config) &&
|
|
22
|
+
config?.cloudflare?.includeCodingTools !== false));
|
|
23
|
+
}
|
|
24
|
+
function getCloudflareConfig(config) {
|
|
25
|
+
if (config?.cloudflare == null) {
|
|
26
|
+
throw new Error('toolExecution.cloudflare is required when engine is "cloudflare-sandbox".');
|
|
27
|
+
}
|
|
28
|
+
return config.cloudflare;
|
|
29
|
+
}
|
|
30
|
+
function getSelectedCloudflareCodingToolNames(config) {
|
|
31
|
+
return new Set(config.codingToolNames ?? LOCAL_CODING_BUNDLE_NAMES);
|
|
32
|
+
}
|
|
33
|
+
function filterCloudflareCodingToolAllowlist(tools, selectedNames) {
|
|
34
|
+
const existingTools = tools ?? [];
|
|
35
|
+
if (existingTools.length === 0) {
|
|
36
|
+
return tools;
|
|
37
|
+
}
|
|
38
|
+
return existingTools.filter((existingTool) => {
|
|
39
|
+
if (!('name' in existingTool) || typeof existingTool.name !== 'string') {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
return (!LOCAL_CODING_BUNDLE_NAMES.includes(existingTool.name) ||
|
|
43
|
+
selectedNames.has(existingTool.name));
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function pruneCloudflareCodingToolAllowlist(toolMap, selectedNames) {
|
|
47
|
+
for (const name of LOCAL_CODING_BUNDLE_NAMES) {
|
|
48
|
+
if (!selectedNames.has(name)) {
|
|
49
|
+
toolMap.delete(name);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
12
52
|
}
|
|
13
53
|
function createLocalExecutionTool(name, config) {
|
|
14
54
|
switch (name) {
|
|
@@ -45,9 +85,26 @@ function mergeToolsByName(baseTools, localTools) {
|
|
|
45
85
|
return orderedTools;
|
|
46
86
|
}
|
|
47
87
|
function resolveLocalToolsForBinding(args) {
|
|
48
|
-
if (!shouldUseLocalExecution(args.toolExecution)
|
|
88
|
+
if (!shouldUseLocalExecution(args.toolExecution) &&
|
|
89
|
+
!shouldUseCloudflareSandboxExecution(args.toolExecution)) {
|
|
49
90
|
return args.tools;
|
|
50
91
|
}
|
|
92
|
+
if (shouldUseCloudflareSandboxExecution(args.toolExecution)) {
|
|
93
|
+
const cloudflareConfig = getCloudflareConfig(args.toolExecution);
|
|
94
|
+
if (shouldIncludeCodingTools(args.toolExecution)) {
|
|
95
|
+
const selectedNames = getSelectedCloudflareCodingToolNames(cloudflareConfig);
|
|
96
|
+
return mergeToolsByName(filterCloudflareCodingToolAllowlist(args.tools, selectedNames), createCloudflareCodingTools(cloudflareConfig));
|
|
97
|
+
}
|
|
98
|
+
const replacements = (args.tools ?? [])
|
|
99
|
+
.filter((existingTool) => 'name' in existingTool &&
|
|
100
|
+
typeof existingTool.name === 'string' &&
|
|
101
|
+
CODE_EXECUTION_TOOLS.has(existingTool.name))
|
|
102
|
+
.map((existingTool) => createCloudflareExecutionTool(existingTool.name, cloudflareConfig))
|
|
103
|
+
.filter((cloudflareTool) => cloudflareTool != null);
|
|
104
|
+
return replacements.length === 0
|
|
105
|
+
? args.tools
|
|
106
|
+
: mergeToolsByName(args.tools, replacements);
|
|
107
|
+
}
|
|
51
108
|
const localConfig = args.toolExecution?.local ?? {};
|
|
52
109
|
if (shouldIncludeCodingTools(args.toolExecution)) {
|
|
53
110
|
return mergeToolsByName(args.tools, createLocalCodingTools(localConfig));
|
|
@@ -67,22 +124,68 @@ function resolveLocalToolRegistry(args) {
|
|
|
67
124
|
return args.toolRegistry;
|
|
68
125
|
}
|
|
69
126
|
const registry = new Map(args.toolRegistry ?? []);
|
|
127
|
+
const selectedNames = shouldUseCloudflareSandboxExecution(args.toolExecution)
|
|
128
|
+
? getSelectedCloudflareCodingToolNames(getCloudflareConfig(args.toolExecution))
|
|
129
|
+
: undefined;
|
|
70
130
|
for (const definition of createLocalCodingToolDefinitions()) {
|
|
131
|
+
if (selectedNames != null && !selectedNames.has(definition.name)) {
|
|
132
|
+
registry.delete(definition.name);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
71
135
|
registry.set(definition.name, definition);
|
|
72
136
|
}
|
|
73
137
|
return registry;
|
|
74
138
|
}
|
|
75
139
|
function resolveLocalExecutionTools(args) {
|
|
76
140
|
const directToolNames = new Set();
|
|
77
|
-
if (!shouldUseLocalExecution(args.toolExecution)
|
|
141
|
+
if (!shouldUseLocalExecution(args.toolExecution) &&
|
|
142
|
+
!shouldUseCloudflareSandboxExecution(args.toolExecution)) {
|
|
78
143
|
return {
|
|
79
144
|
toolMap: args.toolMap,
|
|
80
145
|
directToolNames,
|
|
81
146
|
};
|
|
82
147
|
}
|
|
83
|
-
const localConfig = args.toolExecution?.local ?? {};
|
|
84
148
|
const toolMap = new Map(args.toolMap);
|
|
85
149
|
let fileCheckpointer;
|
|
150
|
+
if (shouldUseCloudflareSandboxExecution(args.toolExecution)) {
|
|
151
|
+
const cloudflareConfig = getCloudflareConfig(args.toolExecution);
|
|
152
|
+
if (shouldIncludeCodingTools(args.toolExecution)) {
|
|
153
|
+
const selectedNames = getSelectedCloudflareCodingToolNames(cloudflareConfig);
|
|
154
|
+
pruneCloudflareCodingToolAllowlist(toolMap, selectedNames);
|
|
155
|
+
if (cloudflareConfig.fileCheckpointing === true ||
|
|
156
|
+
args.fileCheckpointer != null) {
|
|
157
|
+
const bundle = createCloudflareCodingToolBundle(cloudflareConfig, {
|
|
158
|
+
checkpointer: args.fileCheckpointer,
|
|
159
|
+
});
|
|
160
|
+
fileCheckpointer = bundle.checkpointer;
|
|
161
|
+
for (const cloudflareTool of bundle.tools) {
|
|
162
|
+
toolMap.set(cloudflareTool.name, cloudflareTool);
|
|
163
|
+
directToolNames.add(cloudflareTool.name);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
for (const cloudflareTool of createCloudflareCodingTools(cloudflareConfig)) {
|
|
168
|
+
toolMap.set(cloudflareTool.name, cloudflareTool);
|
|
169
|
+
directToolNames.add(cloudflareTool.name);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const includeCodingTools = shouldIncludeCodingTools(args.toolExecution);
|
|
174
|
+
for (const name of CODE_EXECUTION_TOOLS) {
|
|
175
|
+
if (includeCodingTools)
|
|
176
|
+
continue;
|
|
177
|
+
if (!toolMap.has(name))
|
|
178
|
+
continue;
|
|
179
|
+
const cloudflareTool = createCloudflareExecutionTool(name, cloudflareConfig);
|
|
180
|
+
if (cloudflareTool == null) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
toolMap.set(name, cloudflareTool);
|
|
184
|
+
directToolNames.add(name);
|
|
185
|
+
}
|
|
186
|
+
return { toolMap, directToolNames, fileCheckpointer };
|
|
187
|
+
}
|
|
188
|
+
const localConfig = args.toolExecution?.local ?? {};
|
|
86
189
|
if (shouldIncludeCodingTools(args.toolExecution)) {
|
|
87
190
|
// Use the bundle factory when fileCheckpointing is on so we can
|
|
88
191
|
// surface the checkpointer back to the caller — without this, the
|
|
@@ -90,7 +193,8 @@ function resolveLocalExecutionTools(args) {
|
|
|
90
193
|
// immediately discarded, making the public `fileCheckpointing`
|
|
91
194
|
// config flag a silent no-op outside of direct
|
|
92
195
|
// `createLocalCodingToolBundle()` use.
|
|
93
|
-
if (localConfig.fileCheckpointing === true ||
|
|
196
|
+
if (localConfig.fileCheckpointing === true ||
|
|
197
|
+
args.fileCheckpointer != null) {
|
|
94
198
|
const bundle = createLocalCodingToolBundle(localConfig, {
|
|
95
199
|
checkpointer: args.fileCheckpointer,
|
|
96
200
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveLocalExecutionTools.mjs","sources":["../../../../src/tools/local/resolveLocalExecutionTools.ts"],"sourcesContent":["import { Constants, CODE_EXECUTION_TOOLS } from '@/common';\nimport {\n createLocalBashExecutionTool,\n createLocalCodeExecutionTool,\n} from './LocalExecutionTools';\nimport {\n createLocalCodingToolBundle,\n createLocalCodingToolDefinitions,\n createLocalCodingTools,\n} from './LocalCodingTools';\nimport {\n createLocalBashProgrammaticToolCallingTool,\n createLocalProgrammaticToolCallingTool,\n} from './LocalProgrammaticToolCalling';\nimport type * as t from '@/types';\n\ntype ResolveLocalToolsResult = {\n toolMap: t.ToolMap;\n directToolNames: Set<string>;\n /**\n * Set when `local.fileCheckpointing === true` AND the auto-bind\n * coding suite is in use. ToolNode stashes this on the node and\n * exposes it via `getFileCheckpointer()` so the host can call\n * `rewind()` after a failed batch. Manual review (finding E)\n * flagged that the config flag was previously a no-op in the\n * Run/ToolNode auto-bind path — only direct\n * `createLocalCodingToolBundle()` callers could access the\n * checkpointer.\n */\n fileCheckpointer?: t.LocalFileCheckpointer;\n};\n\nfunction shouldUseLocalExecution(config?: t.ToolExecutionConfig): boolean {\n return config?.engine === 'local';\n}\n\nfunction shouldIncludeCodingTools(config?: t.ToolExecutionConfig): boolean {\n return (\n shouldUseLocalExecution(config) &&\n config?.local?.includeCodingTools !== false\n );\n}\n\nfunction createLocalExecutionTool(\n name: string,\n config: t.LocalExecutionConfig\n): t.GenericTool | undefined {\n switch (name) {\n case Constants.EXECUTE_CODE:\n return createLocalCodeExecutionTool(config);\n case Constants.BASH_TOOL:\n return createLocalBashExecutionTool({ config });\n case Constants.PROGRAMMATIC_TOOL_CALLING:\n return createLocalProgrammaticToolCallingTool(config);\n case Constants.BASH_PROGRAMMATIC_TOOL_CALLING:\n return createLocalBashProgrammaticToolCallingTool(config);\n default:\n return undefined;\n }\n}\n\nfunction mergeToolsByName(\n baseTools: t.GraphTools | undefined,\n localTools: t.GenericTool[]\n): t.GraphTools {\n const orderedTools: t.GenericTool[] = [];\n const indexByName = new Map<string, number>();\n\n for (const tool of (baseTools as t.GenericTool[] | undefined) ?? []) {\n if ('name' in tool && typeof tool.name === 'string') {\n indexByName.set(tool.name, orderedTools.length);\n }\n orderedTools.push(tool);\n }\n\n for (const tool of localTools) {\n const existingIndex = indexByName.get(tool.name);\n if (existingIndex == null) {\n indexByName.set(tool.name, orderedTools.length);\n orderedTools.push(tool);\n continue;\n }\n orderedTools[existingIndex] = tool;\n }\n\n return orderedTools;\n}\n\nexport function resolveLocalToolsForBinding(args: {\n tools?: t.GraphTools;\n toolExecution?: t.ToolExecutionConfig;\n}): t.GraphTools | undefined {\n if (!shouldUseLocalExecution(args.toolExecution)) {\n return args.tools;\n }\n\n const localConfig = args.toolExecution?.local ?? {};\n if (shouldIncludeCodingTools(args.toolExecution)) {\n return mergeToolsByName(args.tools, createLocalCodingTools(localConfig));\n }\n\n const replacements = ((args.tools as t.GenericTool[] | undefined) ?? [])\n .filter(\n (existingTool): existingTool is t.GenericTool & { name: string } =>\n 'name' in existingTool &&\n typeof existingTool.name === 'string' &&\n CODE_EXECUTION_TOOLS.has(existingTool.name)\n )\n .map((existingTool) =>\n createLocalExecutionTool(existingTool.name, localConfig)\n )\n .filter((localTool): localTool is t.GenericTool => localTool != null);\n\n return replacements.length === 0\n ? args.tools\n : mergeToolsByName(args.tools, replacements);\n}\n\nexport function resolveLocalToolRegistry(args: {\n toolRegistry?: t.LCToolRegistry;\n toolExecution?: t.ToolExecutionConfig;\n}): t.LCToolRegistry | undefined {\n if (!shouldIncludeCodingTools(args.toolExecution)) {\n return args.toolRegistry;\n }\n\n const registry = new Map(args.toolRegistry ?? []);\n for (const definition of createLocalCodingToolDefinitions()) {\n registry.set(definition.name, definition);\n }\n return registry;\n}\n\nexport function resolveLocalExecutionTools(args: {\n toolMap: t.ToolMap;\n toolExecution?: t.ToolExecutionConfig;\n /**\n * Caller-provided checkpointer that overrides the bundle's\n * auto-created one. The Graph layer threads a single per-Run\n * instance so every ToolNode it compiles shares one snapshot\n * store — without that, a multi-agent graph would each get a\n * private checkpointer and `Run.rewindFiles()` couldn't reach\n * any of them.\n */\n fileCheckpointer?: t.LocalFileCheckpointer;\n}): ResolveLocalToolsResult {\n const directToolNames = new Set<string>();\n if (!shouldUseLocalExecution(args.toolExecution)) {\n return {\n toolMap: args.toolMap,\n directToolNames,\n };\n }\n\n const localConfig = args.toolExecution?.local ?? {};\n const toolMap = new Map(args.toolMap);\n let fileCheckpointer: t.LocalFileCheckpointer | undefined;\n\n if (shouldIncludeCodingTools(args.toolExecution)) {\n // Use the bundle factory when fileCheckpointing is on so we can\n // surface the checkpointer back to the caller — without this, the\n // execution-path tools each captured into a checkpointer that was\n // immediately discarded, making the public `fileCheckpointing`\n // config flag a silent no-op outside of direct\n // `createLocalCodingToolBundle()` use.\n if (localConfig.fileCheckpointing === true || args.fileCheckpointer != null) {\n const bundle = createLocalCodingToolBundle(localConfig, {\n checkpointer: args.fileCheckpointer,\n });\n fileCheckpointer = bundle.checkpointer;\n for (const localTool of bundle.tools) {\n toolMap.set(localTool.name, localTool);\n directToolNames.add(localTool.name);\n }\n } else {\n for (const localTool of createLocalCodingTools(localConfig)) {\n toolMap.set(localTool.name, localTool);\n directToolNames.add(localTool.name);\n }\n }\n }\n\n // When the coding-tool bundle was already installed above, it\n // already created `bash_tool` / `execute_code` / programmatic-tool\n // variants. Skip re-creating them here — the audit-of-audit (manual\n // finding #4) flagged that the original loop overwrote those bundle\n // instances with fresh ones via `createLocalExecutionTool`, wasting\n // work and (more importantly) replacing tools the bundle had\n // already wired up with shared state. The CODE_EXECUTION_TOOLS\n // loop is now only relevant when the host pre-bound a tool with\n // one of these names (the `toolMap.has(name)` branch) and coding\n // tools are off.\n const includeCodingTools = shouldIncludeCodingTools(args.toolExecution);\n for (const name of CODE_EXECUTION_TOOLS) {\n if (includeCodingTools) continue;\n if (!toolMap.has(name)) continue;\n\n const localTool = createLocalExecutionTool(name, localConfig);\n if (localTool == null) {\n continue;\n }\n\n toolMap.set(name, localTool);\n directToolNames.add(name);\n }\n\n return { toolMap, directToolNames, fileCheckpointer };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resolveLocalExecutionTools.mjs","sources":["../../../../src/tools/local/resolveLocalExecutionTools.ts"],"sourcesContent":["import {\n Constants,\n CODE_EXECUTION_TOOLS,\n LOCAL_CODING_BUNDLE_NAMES,\n} from '@/common';\nimport {\n createLocalBashExecutionTool,\n createLocalCodeExecutionTool,\n} from './LocalExecutionTools';\nimport {\n createLocalCodingToolBundle,\n createLocalCodingToolDefinitions,\n createLocalCodingTools,\n} from './LocalCodingTools';\nimport {\n createLocalBashProgrammaticToolCallingTool,\n createLocalProgrammaticToolCallingTool,\n} from './LocalProgrammaticToolCalling';\nimport {\n createCloudflareCodingToolBundle,\n createCloudflareCodingTools,\n createCloudflareExecutionTool,\n} from '@/tools/cloudflare';\nimport type * as t from '@/types';\n\ntype ResolveLocalToolsResult = {\n toolMap: t.ToolMap;\n directToolNames: Set<string>;\n /**\n * Set when `local.fileCheckpointing === true` AND the auto-bind\n * coding suite is in use. ToolNode stashes this on the node and\n * exposes it via `getFileCheckpointer()` so the host can call\n * `rewind()` after a failed batch. Manual review (finding E)\n * flagged that the config flag was previously a no-op in the\n * Run/ToolNode auto-bind path — only direct\n * `createLocalCodingToolBundle()` callers could access the\n * checkpointer.\n */\n fileCheckpointer?: t.LocalFileCheckpointer;\n};\n\nfunction shouldUseLocalExecution(config?: t.ToolExecutionConfig): boolean {\n return config?.engine === 'local';\n}\n\nfunction shouldUseCloudflareSandboxExecution(\n config?: t.ToolExecutionConfig\n): boolean {\n return config?.engine === 'cloudflare-sandbox';\n}\n\nfunction shouldIncludeCodingTools(config?: t.ToolExecutionConfig): boolean {\n return (\n (shouldUseLocalExecution(config) &&\n config?.local?.includeCodingTools !== false) ||\n (shouldUseCloudflareSandboxExecution(config) &&\n config?.cloudflare?.includeCodingTools !== false)\n );\n}\n\nfunction getCloudflareConfig(\n config?: t.ToolExecutionConfig\n): t.CloudflareSandboxExecutionConfig {\n if (config?.cloudflare == null) {\n throw new Error(\n 'toolExecution.cloudflare is required when engine is \"cloudflare-sandbox\".'\n );\n }\n return config.cloudflare;\n}\n\nfunction getSelectedCloudflareCodingToolNames(\n config: t.CloudflareSandboxExecutionConfig\n): Set<string> {\n return new Set(config.codingToolNames ?? LOCAL_CODING_BUNDLE_NAMES);\n}\n\nfunction filterCloudflareCodingToolAllowlist(\n tools: t.GraphTools | undefined,\n selectedNames: Set<string>\n): t.GraphTools | undefined {\n const existingTools = (tools as t.GenericTool[] | undefined) ?? [];\n if (existingTools.length === 0) {\n return tools;\n }\n return existingTools.filter((existingTool) => {\n if (!('name' in existingTool) || typeof existingTool.name !== 'string') {\n return true;\n }\n return (\n !LOCAL_CODING_BUNDLE_NAMES.includes(existingTool.name) ||\n selectedNames.has(existingTool.name)\n );\n });\n}\n\nfunction pruneCloudflareCodingToolAllowlist(\n toolMap: t.ToolMap,\n selectedNames: Set<string>\n): void {\n for (const name of LOCAL_CODING_BUNDLE_NAMES) {\n if (!selectedNames.has(name)) {\n toolMap.delete(name);\n }\n }\n}\n\nfunction createLocalExecutionTool(\n name: string,\n config: t.LocalExecutionConfig\n): t.GenericTool | undefined {\n switch (name) {\n case Constants.EXECUTE_CODE:\n return createLocalCodeExecutionTool(config);\n case Constants.BASH_TOOL:\n return createLocalBashExecutionTool({ config });\n case Constants.PROGRAMMATIC_TOOL_CALLING:\n return createLocalProgrammaticToolCallingTool(config);\n case Constants.BASH_PROGRAMMATIC_TOOL_CALLING:\n return createLocalBashProgrammaticToolCallingTool(config);\n default:\n return undefined;\n }\n}\n\nfunction mergeToolsByName(\n baseTools: t.GraphTools | undefined,\n localTools: t.GenericTool[]\n): t.GraphTools {\n const orderedTools: t.GenericTool[] = [];\n const indexByName = new Map<string, number>();\n\n for (const tool of (baseTools as t.GenericTool[] | undefined) ?? []) {\n if ('name' in tool && typeof tool.name === 'string') {\n indexByName.set(tool.name, orderedTools.length);\n }\n orderedTools.push(tool);\n }\n\n for (const tool of localTools) {\n const existingIndex = indexByName.get(tool.name);\n if (existingIndex == null) {\n indexByName.set(tool.name, orderedTools.length);\n orderedTools.push(tool);\n continue;\n }\n orderedTools[existingIndex] = tool;\n }\n\n return orderedTools;\n}\n\nexport function resolveLocalToolsForBinding(args: {\n tools?: t.GraphTools;\n toolExecution?: t.ToolExecutionConfig;\n}): t.GraphTools | undefined {\n if (\n !shouldUseLocalExecution(args.toolExecution) &&\n !shouldUseCloudflareSandboxExecution(args.toolExecution)\n ) {\n return args.tools;\n }\n\n if (shouldUseCloudflareSandboxExecution(args.toolExecution)) {\n const cloudflareConfig = getCloudflareConfig(args.toolExecution);\n if (shouldIncludeCodingTools(args.toolExecution)) {\n const selectedNames =\n getSelectedCloudflareCodingToolNames(cloudflareConfig);\n return mergeToolsByName(\n filterCloudflareCodingToolAllowlist(args.tools, selectedNames),\n createCloudflareCodingTools(cloudflareConfig)\n );\n }\n\n const replacements = ((args.tools as t.GenericTool[] | undefined) ?? [])\n .filter(\n (existingTool): existingTool is t.GenericTool & { name: string } =>\n 'name' in existingTool &&\n typeof existingTool.name === 'string' &&\n CODE_EXECUTION_TOOLS.has(existingTool.name)\n )\n .map((existingTool) =>\n createCloudflareExecutionTool(existingTool.name, cloudflareConfig)\n )\n .filter(\n (cloudflareTool): cloudflareTool is t.GenericTool =>\n cloudflareTool != null\n );\n\n return replacements.length === 0\n ? args.tools\n : mergeToolsByName(args.tools, replacements);\n }\n\n const localConfig = args.toolExecution?.local ?? {};\n if (shouldIncludeCodingTools(args.toolExecution)) {\n return mergeToolsByName(args.tools, createLocalCodingTools(localConfig));\n }\n\n const replacements = ((args.tools as t.GenericTool[] | undefined) ?? [])\n .filter(\n (existingTool): existingTool is t.GenericTool & { name: string } =>\n 'name' in existingTool &&\n typeof existingTool.name === 'string' &&\n CODE_EXECUTION_TOOLS.has(existingTool.name)\n )\n .map((existingTool) =>\n createLocalExecutionTool(existingTool.name, localConfig)\n )\n .filter((localTool): localTool is t.GenericTool => localTool != null);\n\n return replacements.length === 0\n ? args.tools\n : mergeToolsByName(args.tools, replacements);\n}\n\nexport function resolveLocalToolRegistry(args: {\n toolRegistry?: t.LCToolRegistry;\n toolExecution?: t.ToolExecutionConfig;\n}): t.LCToolRegistry | undefined {\n if (!shouldIncludeCodingTools(args.toolExecution)) {\n return args.toolRegistry;\n }\n\n const registry = new Map(args.toolRegistry ?? []);\n const selectedNames = shouldUseCloudflareSandboxExecution(args.toolExecution)\n ? getSelectedCloudflareCodingToolNames(\n getCloudflareConfig(args.toolExecution)\n )\n : undefined;\n for (const definition of createLocalCodingToolDefinitions()) {\n if (selectedNames != null && !selectedNames.has(definition.name)) {\n registry.delete(definition.name);\n continue;\n }\n registry.set(definition.name, definition);\n }\n return registry;\n}\n\nexport function resolveLocalExecutionTools(args: {\n toolMap: t.ToolMap;\n toolExecution?: t.ToolExecutionConfig;\n /**\n * Caller-provided checkpointer that overrides the bundle's\n * auto-created one. The Graph layer threads a single per-Run\n * instance so every ToolNode it compiles shares one snapshot\n * store — without that, a multi-agent graph would each get a\n * private checkpointer and `Run.rewindFiles()` couldn't reach\n * any of them.\n */\n fileCheckpointer?: t.LocalFileCheckpointer;\n}): ResolveLocalToolsResult {\n const directToolNames = new Set<string>();\n if (\n !shouldUseLocalExecution(args.toolExecution) &&\n !shouldUseCloudflareSandboxExecution(args.toolExecution)\n ) {\n return {\n toolMap: args.toolMap,\n directToolNames,\n };\n }\n\n const toolMap = new Map(args.toolMap);\n let fileCheckpointer: t.LocalFileCheckpointer | undefined;\n\n if (shouldUseCloudflareSandboxExecution(args.toolExecution)) {\n const cloudflareConfig = getCloudflareConfig(args.toolExecution);\n if (shouldIncludeCodingTools(args.toolExecution)) {\n const selectedNames =\n getSelectedCloudflareCodingToolNames(cloudflareConfig);\n pruneCloudflareCodingToolAllowlist(toolMap, selectedNames);\n if (\n cloudflareConfig.fileCheckpointing === true ||\n args.fileCheckpointer != null\n ) {\n const bundle = createCloudflareCodingToolBundle(cloudflareConfig, {\n checkpointer: args.fileCheckpointer,\n });\n fileCheckpointer = bundle.checkpointer;\n for (const cloudflareTool of bundle.tools) {\n toolMap.set(cloudflareTool.name, cloudflareTool);\n directToolNames.add(cloudflareTool.name);\n }\n } else {\n for (const cloudflareTool of createCloudflareCodingTools(\n cloudflareConfig\n )) {\n toolMap.set(cloudflareTool.name, cloudflareTool);\n directToolNames.add(cloudflareTool.name);\n }\n }\n }\n\n const includeCodingTools = shouldIncludeCodingTools(args.toolExecution);\n for (const name of CODE_EXECUTION_TOOLS) {\n if (includeCodingTools) continue;\n if (!toolMap.has(name)) continue;\n\n const cloudflareTool = createCloudflareExecutionTool(\n name,\n cloudflareConfig\n );\n if (cloudflareTool == null) {\n continue;\n }\n\n toolMap.set(name, cloudflareTool);\n directToolNames.add(name);\n }\n\n return { toolMap, directToolNames, fileCheckpointer };\n }\n\n const localConfig = args.toolExecution?.local ?? {};\n\n if (shouldIncludeCodingTools(args.toolExecution)) {\n // Use the bundle factory when fileCheckpointing is on so we can\n // surface the checkpointer back to the caller — without this, the\n // execution-path tools each captured into a checkpointer that was\n // immediately discarded, making the public `fileCheckpointing`\n // config flag a silent no-op outside of direct\n // `createLocalCodingToolBundle()` use.\n if (\n localConfig.fileCheckpointing === true ||\n args.fileCheckpointer != null\n ) {\n const bundle = createLocalCodingToolBundle(localConfig, {\n checkpointer: args.fileCheckpointer,\n });\n fileCheckpointer = bundle.checkpointer;\n for (const localTool of bundle.tools) {\n toolMap.set(localTool.name, localTool);\n directToolNames.add(localTool.name);\n }\n } else {\n for (const localTool of createLocalCodingTools(localConfig)) {\n toolMap.set(localTool.name, localTool);\n directToolNames.add(localTool.name);\n }\n }\n }\n\n // When the coding-tool bundle was already installed above, it\n // already created `bash_tool` / `execute_code` / programmatic-tool\n // variants. Skip re-creating them here — the audit-of-audit (manual\n // finding #4) flagged that the original loop overwrote those bundle\n // instances with fresh ones via `createLocalExecutionTool`, wasting\n // work and (more importantly) replacing tools the bundle had\n // already wired up with shared state. The CODE_EXECUTION_TOOLS\n // loop is now only relevant when the host pre-bound a tool with\n // one of these names (the `toolMap.has(name)` branch) and coding\n // tools are off.\n const includeCodingTools = shouldIncludeCodingTools(args.toolExecution);\n for (const name of CODE_EXECUTION_TOOLS) {\n if (includeCodingTools) continue;\n if (!toolMap.has(name)) continue;\n\n const localTool = createLocalExecutionTool(name, localConfig);\n if (localTool == null) {\n continue;\n }\n\n toolMap.set(name, localTool);\n directToolNames.add(name);\n }\n\n return { toolMap, directToolNames, fileCheckpointer };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,8 @@ export declare class AgentContext {
|
|
|
20
20
|
provider: Providers;
|
|
21
21
|
/** Client options for this agent */
|
|
22
22
|
clientOptions?: t.ClientOptions;
|
|
23
|
+
/** Per-agent Langfuse tracing configuration. */
|
|
24
|
+
langfuse?: t.LangfuseConfig;
|
|
23
25
|
/** Token count map indexed by message position */
|
|
24
26
|
indexTokenCountMap: Record<string, number | undefined>;
|
|
25
27
|
/** Canonical pre-run token map used to restore token accounting on reset */
|
|
@@ -159,11 +161,12 @@ export declare class AgentContext {
|
|
|
159
161
|
/** Names of sibling agents executing in parallel (empty if sequential) */
|
|
160
162
|
parallelSiblings: string[];
|
|
161
163
|
};
|
|
162
|
-
constructor({ agentId, name, provider, clientOptions, maxContextTokens, streamBuffer, tokenCounter, tools, toolMap, toolRegistry, toolDefinitions, instructions, additionalInstructions, reasoningKey, toolEnd, instructionTokens, useLegacyContent, discoveredTools, summarizationEnabled, summarizationConfig, contextPruningConfig, maxToolResultChars, }: {
|
|
164
|
+
constructor({ agentId, name, provider, clientOptions, langfuse, maxContextTokens, streamBuffer, tokenCounter, tools, toolMap, toolRegistry, toolDefinitions, instructions, additionalInstructions, reasoningKey, toolEnd, instructionTokens, useLegacyContent, discoveredTools, summarizationEnabled, summarizationConfig, contextPruningConfig, maxToolResultChars, }: {
|
|
163
165
|
agentId: string;
|
|
164
166
|
name?: string;
|
|
165
167
|
provider: Providers;
|
|
166
168
|
clientOptions?: t.ClientOptions;
|
|
169
|
+
langfuse?: t.LangfuseConfig;
|
|
167
170
|
maxContextTokens?: number;
|
|
168
171
|
streamBuffer?: number;
|
|
169
172
|
tokenCounter?: t.TokenCounter;
|
|
@@ -132,11 +132,12 @@ export declare abstract class Graph<T extends t.BaseGraphState = t.BaseGraphStat
|
|
|
132
132
|
/**
|
|
133
133
|
* Single per-Run file checkpointer shared across every ToolNode the
|
|
134
134
|
* graph compiles. Lazily constructed when
|
|
135
|
-
* `toolExecution.local.fileCheckpointing === true`
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
135
|
+
* `toolExecution.local.fileCheckpointing === true` or
|
|
136
|
+
* `toolExecution.cloudflare.fileCheckpointing === true` so
|
|
137
|
+
* multi-agent graphs see ONE snapshot store, not one-per-agent.
|
|
138
|
+
* Returns undefined when checkpointing is disabled or a supported
|
|
139
|
+
* coding-tool engine isn't selected. Exposed via
|
|
140
|
+
* `Run.getFileCheckpointer()` / `Run.rewindFiles()`.
|
|
140
141
|
*/
|
|
141
142
|
private _fileCheckpointer?;
|
|
142
143
|
/**
|
package/dist/types/index.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export * from './tools/ToolNode';
|
|
|
20
20
|
export * from './tools/schema';
|
|
21
21
|
export * from './tools/handlers';
|
|
22
22
|
export * from './tools/local';
|
|
23
|
+
export * from './tools/cloudflare';
|
|
23
24
|
export * from './tools/search';
|
|
24
25
|
export * from './common';
|
|
25
26
|
export * from './utils';
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { CallbackHandler } from '@langfuse/langchain';
|
|
2
|
+
import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
|
|
3
|
+
import type { Serialized } from '@langchain/core/load/serializable';
|
|
4
|
+
import type { BaseMessage } from '@langchain/core/messages';
|
|
5
|
+
import type { LLMResult } from '@langchain/core/outputs';
|
|
6
|
+
import type * as t from '@/types';
|
|
7
|
+
type TraceMetadata = Record<string, unknown>;
|
|
8
|
+
type LangfuseHandlerParams = {
|
|
9
|
+
userId?: string;
|
|
10
|
+
sessionId?: string;
|
|
11
|
+
traceMetadata?: TraceMetadata;
|
|
12
|
+
};
|
|
13
|
+
type AgentLangfuseHandlerParams = LangfuseHandlerParams & {
|
|
14
|
+
langfuse?: t.LangfuseConfig;
|
|
15
|
+
};
|
|
16
|
+
type ResolvedLangfuseConfig = t.LangfuseConfig & {
|
|
17
|
+
enabled: true;
|
|
18
|
+
publicKey: string;
|
|
19
|
+
secretKey: string;
|
|
20
|
+
};
|
|
21
|
+
export declare class LangfuseAgentCallbackHandler extends BaseCallbackHandler {
|
|
22
|
+
name: string;
|
|
23
|
+
private readonly provider;
|
|
24
|
+
private readonly processor;
|
|
25
|
+
private readonly userId?;
|
|
26
|
+
private readonly sessionId?;
|
|
27
|
+
private readonly traceMetadata?;
|
|
28
|
+
private readonly spans;
|
|
29
|
+
constructor({ langfuse, userId, sessionId, traceMetadata, }: LangfuseHandlerParams & {
|
|
30
|
+
langfuse: ResolvedLangfuseConfig;
|
|
31
|
+
});
|
|
32
|
+
private startGenerationSpan;
|
|
33
|
+
handleChatModelStart(llm: Serialized, messages: BaseMessage[][], runId: string, _parentRunId?: string, extraParams?: Record<string, unknown>, _tags?: string[], metadata?: Record<string, unknown>, name?: string): Promise<void>;
|
|
34
|
+
handleLLMStart(llm: Serialized, prompts: string[], runId: string, _parentRunId?: string, extraParams?: Record<string, unknown>, _tags?: string[], metadata?: Record<string, unknown>, name?: string): Promise<void>;
|
|
35
|
+
handleLLMEnd(output: LLMResult, runId: string): Promise<void>;
|
|
36
|
+
handleLLMError(err: unknown, runId: string): Promise<void>;
|
|
37
|
+
private flush;
|
|
38
|
+
dispose(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
export declare function createLegacyLangfuseHandler(params: LangfuseHandlerParams): CallbackHandler;
|
|
41
|
+
export declare function createLangfuseHandler({ langfuse, userId, sessionId, traceMetadata, }: AgentLangfuseHandlerParams): LangfuseAgentCallbackHandler | undefined;
|
|
42
|
+
export declare function hasExplicitLangfuseConfig(contexts: Iterable<{
|
|
43
|
+
langfuse?: t.LangfuseConfig;
|
|
44
|
+
}>): boolean;
|
|
45
|
+
export declare function hasLangfuseEnvConfig(): boolean;
|
|
46
|
+
export declare function isLangfuseCallbackHandler(value: unknown): boolean;
|
|
47
|
+
export declare function disposeLangfuseHandler(value: unknown): Promise<void>;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type * as t from '@/types';
|
|
2
|
+
export type CloudflareBridgeRuntimeConfig = {
|
|
3
|
+
/** Base URL of a Worker using `bridge()` from `@cloudflare/sandbox/bridge`. */
|
|
4
|
+
baseURL: string;
|
|
5
|
+
/** Bearer token stored in the bridge Worker as `SANDBOX_API_KEY`. */
|
|
6
|
+
apiKey?: string;
|
|
7
|
+
/** Existing sandbox id. If omitted, the adapter creates one lazily. */
|
|
8
|
+
sandboxId?: string;
|
|
9
|
+
/** Bridge API route prefix. Defaults to `/v1`. */
|
|
10
|
+
apiRoutePrefix?: string;
|
|
11
|
+
/** Workspace root used for path clamping. Defaults to `/workspace`. */
|
|
12
|
+
workspaceRoot?: string;
|
|
13
|
+
/** Optional bridge session id sent as `Session-Id`. */
|
|
14
|
+
sessionId?: string;
|
|
15
|
+
/** Shell used to run command strings over the bridge exec endpoint. */
|
|
16
|
+
shell?: string;
|
|
17
|
+
/** Optional fetch implementation. Defaults to global `fetch`. */
|
|
18
|
+
fetch?: typeof fetch;
|
|
19
|
+
};
|
|
20
|
+
export type CloudflareBridgeRuntime = t.CloudflareSandboxRuntime & {
|
|
21
|
+
getSandboxId(): Promise<string>;
|
|
22
|
+
};
|
|
23
|
+
export declare function createCloudflareBridgeRuntime(config: CloudflareBridgeRuntimeConfig): CloudflareBridgeRuntime;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DynamicStructuredTool } from '@langchain/core/tools';
|
|
2
|
+
import type * as t from '@/types';
|
|
3
|
+
export declare function createCloudflareProgrammaticToolCallingTool(cloudflareConfig: t.CloudflareSandboxExecutionConfig): DynamicStructuredTool;
|
|
4
|
+
export declare function createCloudflareBashProgrammaticToolCallingTool(cloudflareConfig: t.CloudflareSandboxExecutionConfig): DynamicStructuredTool;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type * as t from '@/types';
|
|
2
|
+
import type { WorkspaceFS } from '@/tools/local/workspaceFS';
|
|
3
|
+
type SpawnResult = {
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
exitCode: number | null;
|
|
7
|
+
timedOut: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function getCloudflareWorkspaceRoot(config?: t.CloudflareSandboxExecutionConfig): string;
|
|
10
|
+
export declare function resolveCloudflareSandbox(config: t.CloudflareSandboxExecutionConfig): Promise<t.CloudflareSandboxRuntime>;
|
|
11
|
+
export declare function createCloudflareWorkspaceFS(config: t.CloudflareSandboxExecutionConfig): WorkspaceFS;
|
|
12
|
+
export declare function createCloudflareLocalExecutionConfig(config: t.CloudflareSandboxExecutionConfig): t.LocalExecutionConfig;
|
|
13
|
+
export declare function validateCloudflareBashCommand(command: string, args: readonly string[], config: t.CloudflareSandboxExecutionConfig): Promise<void>;
|
|
14
|
+
export declare function executeCloudflareBash(command: string, config: t.CloudflareSandboxExecutionConfig, args?: readonly string[]): Promise<SpawnResult>;
|
|
15
|
+
export declare function executeCloudflareCode(input: {
|
|
16
|
+
lang: string;
|
|
17
|
+
code: string;
|
|
18
|
+
args?: string[];
|
|
19
|
+
}, config: t.CloudflareSandboxExecutionConfig): Promise<SpawnResult>;
|
|
20
|
+
export declare function formatCloudflareOutput(result: SpawnResult, cwd: string): string;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DynamicStructuredTool } from '@langchain/core/tools';
|
|
2
|
+
import type * as t from '@/types';
|
|
3
|
+
export declare const CLOUDFLARE_CODING_TOOL_NAMES: readonly string[];
|
|
4
|
+
export declare const CLOUDFLARE_BASH_CODING_TOOL_NAMES: readonly string[];
|
|
5
|
+
export declare const CloudflareCodeExecutionToolDescription: string;
|
|
6
|
+
export declare const CloudflareBashExecutionToolDescription: string;
|
|
7
|
+
export declare function createCloudflareCodeExecutionTool(config: t.CloudflareSandboxExecutionConfig): DynamicStructuredTool;
|
|
8
|
+
export declare function createCloudflareBashExecutionTool(options: {
|
|
9
|
+
config: t.CloudflareSandboxExecutionConfig;
|
|
10
|
+
enableToolOutputReferences?: boolean;
|
|
11
|
+
}): DynamicStructuredTool;
|
|
12
|
+
export type CloudflareCodingToolBundle = {
|
|
13
|
+
tools: DynamicStructuredTool[];
|
|
14
|
+
checkpointer?: t.LocalFileCheckpointer;
|
|
15
|
+
};
|
|
16
|
+
export declare function createCloudflareCodingTools(config: t.CloudflareSandboxExecutionConfig, options?: {
|
|
17
|
+
checkpointer?: t.LocalFileCheckpointer;
|
|
18
|
+
}): DynamicStructuredTool[];
|
|
19
|
+
export declare function createCloudflareCodingToolBundle(config: t.CloudflareSandboxExecutionConfig, options?: {
|
|
20
|
+
checkpointer?: t.LocalFileCheckpointer;
|
|
21
|
+
}): CloudflareCodingToolBundle;
|
|
22
|
+
export declare function createCloudflareExecutionTool(name: string, config: t.CloudflareSandboxExecutionConfig): t.GenericTool | undefined;
|
|
@@ -128,6 +128,7 @@ export interface SpawnLocalProcessOptions {
|
|
|
128
128
|
*/
|
|
129
129
|
internal?: boolean;
|
|
130
130
|
}
|
|
131
|
+
export declare const LOCAL_SPAWN_TIMEOUT_MS: unique symbol;
|
|
131
132
|
export declare function spawnLocalProcess(command: string, args: string[], config?: t.LocalExecutionConfig, options?: SpawnLocalProcessOptions): Promise<SpawnResult>;
|
|
132
133
|
export declare function executeLocalBash(command: string, config?: t.LocalExecutionConfig): Promise<SpawnResult>;
|
|
133
134
|
export declare function executeLocalBashWithArgs(command: string, args: readonly string[], config?: t.LocalExecutionConfig): Promise<SpawnResult>;
|
|
@@ -288,6 +288,12 @@ export interface SubagentUpdateEvent {
|
|
|
288
288
|
/** ISO timestamp for ordering / display. */
|
|
289
289
|
timestamp: string;
|
|
290
290
|
}
|
|
291
|
+
export interface LangfuseConfig {
|
|
292
|
+
enabled?: boolean;
|
|
293
|
+
publicKey?: string;
|
|
294
|
+
secretKey?: string;
|
|
295
|
+
baseUrl?: string;
|
|
296
|
+
}
|
|
291
297
|
export interface AgentInputs {
|
|
292
298
|
agentId: string;
|
|
293
299
|
/** Human-readable name for the agent (used in handoff context). Defaults to agentId if not provided. */
|
|
@@ -301,6 +307,8 @@ export interface AgentInputs {
|
|
|
301
307
|
streamBuffer?: number;
|
|
302
308
|
maxContextTokens?: number;
|
|
303
309
|
clientOptions?: ClientOptions;
|
|
310
|
+
/** Per-agent Langfuse tracing configuration. */
|
|
311
|
+
langfuse?: LangfuseConfig;
|
|
304
312
|
/** Dynamic system tail appended after stable instructions without provider cache markers. */
|
|
305
313
|
additional_instructions?: string;
|
|
306
314
|
reasoningKey?: 'reasoning_content' | 'reasoning';
|
|
@@ -467,10 +467,11 @@ export type ToolOutputReferencesConfig = {
|
|
|
467
467
|
*/
|
|
468
468
|
maxTotalSize?: number;
|
|
469
469
|
};
|
|
470
|
-
export type ToolExecutionEngine = 'sandbox' | 'local';
|
|
470
|
+
export type ToolExecutionEngine = 'sandbox' | 'local' | 'cloudflare-sandbox';
|
|
471
471
|
/**
|
|
472
472
|
* Records pre-write file contents so callers can rewind edits/writes
|
|
473
|
-
* made by
|
|
473
|
+
* made by local-compatible coding-tool engines. Implementations live
|
|
474
|
+
* in `src/tools/local`.
|
|
474
475
|
*/
|
|
475
476
|
export interface LocalFileCheckpointer {
|
|
476
477
|
/**
|
|
@@ -586,6 +587,12 @@ export type LocalExecConfig = {
|
|
|
586
587
|
* overridden together for non-host engines.
|
|
587
588
|
*/
|
|
588
589
|
fs?: import('@/tools/local/workspaceFS').WorkspaceFS;
|
|
590
|
+
/**
|
|
591
|
+
* Set by custom execution backends that already provide their own
|
|
592
|
+
* sandbox boundary. Suppresses the local host-sandbox warning while
|
|
593
|
+
* preserving the warning for plain host `child_process` execution.
|
|
594
|
+
*/
|
|
595
|
+
sandboxed?: boolean;
|
|
589
596
|
};
|
|
590
597
|
export type LocalExecutionConfig = {
|
|
591
598
|
/**
|
|
@@ -740,11 +747,120 @@ export type LocalExecutionConfig = {
|
|
|
740
747
|
timeoutMs?: number;
|
|
741
748
|
};
|
|
742
749
|
};
|
|
750
|
+
export type CloudflareSandboxExecOptions = {
|
|
751
|
+
cwd?: string;
|
|
752
|
+
env?: Record<string, string | undefined>;
|
|
753
|
+
timeout?: number;
|
|
754
|
+
stream?: boolean;
|
|
755
|
+
onOutput?: (stream: 'stdout' | 'stderr', data: string) => void;
|
|
756
|
+
signal?: AbortSignal;
|
|
757
|
+
};
|
|
758
|
+
export type CloudflareSandboxExecResult = {
|
|
759
|
+
success?: boolean;
|
|
760
|
+
exitCode: number;
|
|
761
|
+
stdout: string;
|
|
762
|
+
stderr: string;
|
|
763
|
+
command?: string;
|
|
764
|
+
duration?: number;
|
|
765
|
+
timestamp?: string;
|
|
766
|
+
};
|
|
767
|
+
export type CloudflareSandboxReadFileResult = string | Buffer | Uint8Array | {
|
|
768
|
+
content: string | Buffer | Uint8Array | ReadableStream<Uint8Array>;
|
|
769
|
+
size?: number;
|
|
770
|
+
mimeType?: string;
|
|
771
|
+
encoding?: 'utf-8' | 'utf8' | 'base64';
|
|
772
|
+
isBinary?: boolean;
|
|
773
|
+
};
|
|
774
|
+
export type CloudflareSandboxListFilesOptions = {
|
|
775
|
+
recursive?: boolean;
|
|
776
|
+
includeHidden?: boolean;
|
|
777
|
+
};
|
|
778
|
+
export type CloudflareSandboxFileInfo = {
|
|
779
|
+
name: string;
|
|
780
|
+
absolutePath?: string;
|
|
781
|
+
relativePath?: string;
|
|
782
|
+
type?: 'file' | 'directory' | 'symlink' | 'other';
|
|
783
|
+
size?: number;
|
|
784
|
+
modifiedAt?: string;
|
|
785
|
+
mode?: string;
|
|
786
|
+
};
|
|
787
|
+
export type CloudflareSandboxListFilesResult = CloudflareSandboxFileInfo[] | {
|
|
788
|
+
files: CloudflareSandboxFileInfo[];
|
|
789
|
+
count?: number;
|
|
790
|
+
path?: string;
|
|
791
|
+
success?: boolean;
|
|
792
|
+
};
|
|
793
|
+
export interface CloudflareSandboxRuntime {
|
|
794
|
+
exec(command: string, options?: CloudflareSandboxExecOptions): Promise<CloudflareSandboxExecResult>;
|
|
795
|
+
readFile(path: string, options?: {
|
|
796
|
+
encoding?: string;
|
|
797
|
+
}): Promise<CloudflareSandboxReadFileResult>;
|
|
798
|
+
writeFile(path: string, content: string | ReadableStream<Uint8Array>, options?: {
|
|
799
|
+
encoding?: string;
|
|
800
|
+
}): Promise<unknown>;
|
|
801
|
+
mkdir(path: string, options?: {
|
|
802
|
+
recursive?: boolean;
|
|
803
|
+
}): Promise<unknown>;
|
|
804
|
+
listFiles(path: string, options?: CloudflareSandboxListFilesOptions): Promise<CloudflareSandboxListFilesResult>;
|
|
805
|
+
deleteFile(path: string): Promise<unknown>;
|
|
806
|
+
}
|
|
807
|
+
export type CloudflareSandboxExecutionConfig = {
|
|
808
|
+
sandbox: CloudflareSandboxRuntime | (() => CloudflareSandboxRuntime | Promise<CloudflareSandboxRuntime>);
|
|
809
|
+
/** Working directory inside the sandbox. Defaults to `/workspace`. */
|
|
810
|
+
workspaceRoot?: string;
|
|
811
|
+
/** Extra environment variables merged into sandbox command executions. */
|
|
812
|
+
env?: Record<string, string | undefined>;
|
|
813
|
+
/** Default timeout for sandbox commands, in milliseconds. */
|
|
814
|
+
timeoutMs?: number;
|
|
815
|
+
/** Maximum stdout/stderr characters surfaced to the model. */
|
|
816
|
+
maxOutputChars?: number;
|
|
817
|
+
/**
|
|
818
|
+
* Add the built-in coding suite when `engine` is `cloudflare-sandbox`.
|
|
819
|
+
* Defaults to true, matching the local execution backend.
|
|
820
|
+
*/
|
|
821
|
+
includeCodingTools?: boolean;
|
|
822
|
+
/**
|
|
823
|
+
* Optional exact coding-tool names to expose when `includeCodingTools`
|
|
824
|
+
* is on. Defaults to the full local-parity Cloudflare bundle. Use this
|
|
825
|
+
* to publish a bash-only sandbox surface, for example file/search tools
|
|
826
|
+
* plus `bash_tool` and `run_tools_with_bash`, without exposing
|
|
827
|
+
* `execute_code`.
|
|
828
|
+
*/
|
|
829
|
+
codingToolNames?: readonly string[];
|
|
830
|
+
/** Optional shell executable for bash-style tools. Defaults to `bash`. */
|
|
831
|
+
shell?: string;
|
|
832
|
+
/**
|
|
833
|
+
* Optional project-level compile check configuration. Mirrors the local
|
|
834
|
+
* execution backend.
|
|
835
|
+
*/
|
|
836
|
+
compileCheck?: LocalExecutionConfig['compileCheck'];
|
|
837
|
+
/** Optional read-only guard for mutating coding tools. */
|
|
838
|
+
readOnly?: boolean;
|
|
839
|
+
/** Permit dangerous commands that the validator otherwise blocks. */
|
|
840
|
+
allowDangerousCommands?: LocalExecutionConfig['allowDangerousCommands'];
|
|
841
|
+
/** Tree-sitter-bash AST validation pass for bash commands. */
|
|
842
|
+
bashAst?: LocalExecutionConfig['bashAst'];
|
|
843
|
+
/**
|
|
844
|
+
* Enable per-Run file checkpointing for `edit_file` / `write_file`
|
|
845
|
+
* against the Cloudflare Sandbox workspace.
|
|
846
|
+
*/
|
|
847
|
+
fileCheckpointing?: LocalExecutionConfig['fileCheckpointing'];
|
|
848
|
+
/** Maximum bytes to read in `read_file` before returning a stub. */
|
|
849
|
+
maxReadBytes?: LocalExecutionConfig['maxReadBytes'];
|
|
850
|
+
/** Controls whether `read_file` returns binary files as attachments. */
|
|
851
|
+
attachReadAttachments?: LocalExecutionConfig['attachReadAttachments'];
|
|
852
|
+
/** Maximum pre-encoding byte size to embed inline. */
|
|
853
|
+
maxAttachmentBytes?: LocalExecutionConfig['maxAttachmentBytes'];
|
|
854
|
+
/** Run a fast per-file syntax check after successful edits/writes. */
|
|
855
|
+
postEditSyntaxCheck?: LocalExecutionConfig['postEditSyntaxCheck'];
|
|
856
|
+
};
|
|
743
857
|
export type ToolExecutionConfig = {
|
|
744
858
|
/** `sandbox` preserves the remote Code API behavior and is the default. */
|
|
745
859
|
engine?: ToolExecutionEngine;
|
|
746
860
|
/** Local process execution settings used when `engine` is `local`. */
|
|
747
861
|
local?: LocalExecutionConfig;
|
|
862
|
+
/** Cloudflare Sandbox execution settings used when `engine` is `cloudflare-sandbox`. */
|
|
863
|
+
cloudflare?: CloudflareSandboxExecutionConfig;
|
|
748
864
|
};
|
|
749
865
|
export type ProgrammaticCache = {
|
|
750
866
|
toolMap: ToolMap;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@librechat/agents",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.91",
|
|
4
4
|
"main": "./dist/cjs/main.cjs",
|
|
5
5
|
"module": "./dist/esm/main.mjs",
|
|
6
6
|
"types": "./dist/types/index.d.ts",
|
|
@@ -227,9 +227,9 @@
|
|
|
227
227
|
"@langchain/openai": "1.4.5",
|
|
228
228
|
"@langchain/textsplitters": "^1.0.1",
|
|
229
229
|
"@langchain/xai": "^1.3.17",
|
|
230
|
-
"@langfuse/langchain": "^4.
|
|
231
|
-
"@langfuse/otel": "^4.
|
|
232
|
-
"@langfuse/tracing": "^4.
|
|
230
|
+
"@langfuse/langchain": "^4.6.1",
|
|
231
|
+
"@langfuse/otel": "^4.6.1",
|
|
232
|
+
"@langfuse/tracing": "^4.6.1",
|
|
233
233
|
"@opentelemetry/sdk-node": "^0.218.0",
|
|
234
234
|
"@scarf/scarf": "^1.4.0",
|
|
235
235
|
"@types/diff": "^7.0.2",
|