@robota-sdk/agent-tools 3.0.0-beta.66 → 3.0.0-beta.68
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/node/index.cjs +52 -284
- package/dist/node/index.d.ts +4 -67
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +53 -284
- package/dist/node/index.js.map +1 -1
- package/package.json +4 -3
package/dist/node/index.cjs
CHANGED
|
@@ -29,6 +29,8 @@ let zod = require("zod");
|
|
|
29
29
|
let node_crypto = require("node:crypto");
|
|
30
30
|
let fast_glob = require("fast-glob");
|
|
31
31
|
fast_glob = __toESM(fast_glob, 1);
|
|
32
|
+
let p_limit = require("p-limit");
|
|
33
|
+
p_limit = __toESM(p_limit, 1);
|
|
32
34
|
//#region src/sandbox/e2b-sandbox-client.ts
|
|
33
35
|
var E2BSandboxClient = class {
|
|
34
36
|
sandbox;
|
|
@@ -662,281 +664,6 @@ function createZodFunctionTool(name, description, zodSchema, fn) {
|
|
|
662
664
|
return new FunctionTool(schema, wrappedFn);
|
|
663
665
|
}
|
|
664
666
|
//#endregion
|
|
665
|
-
//#region src/implementations/openapi-schema-converter.ts
|
|
666
|
-
/**
|
|
667
|
-
* HTTP methods to search when scanning OpenAPI paths
|
|
668
|
-
*/
|
|
669
|
-
const HTTP_METHODS = [
|
|
670
|
-
"get",
|
|
671
|
-
"post",
|
|
672
|
-
"put",
|
|
673
|
-
"delete",
|
|
674
|
-
"patch",
|
|
675
|
-
"head",
|
|
676
|
-
"options"
|
|
677
|
-
];
|
|
678
|
-
/**
|
|
679
|
-
* Find an operation in the OpenAPI spec by operationId
|
|
680
|
-
*/
|
|
681
|
-
function findOperation(apiSpec, operationId) {
|
|
682
|
-
for (const [path, pathItem] of Object.entries(apiSpec.paths || {})) {
|
|
683
|
-
if (!pathItem) continue;
|
|
684
|
-
for (const method of HTTP_METHODS) {
|
|
685
|
-
const operation = pathItem[method];
|
|
686
|
-
if (operation?.operationId === operationId) return {
|
|
687
|
-
method,
|
|
688
|
-
path,
|
|
689
|
-
operation
|
|
690
|
-
};
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
/**
|
|
695
|
-
* Map OpenAPI type to JSON schema type
|
|
696
|
-
*/
|
|
697
|
-
function mapOpenAPIType(type) {
|
|
698
|
-
switch (type) {
|
|
699
|
-
case "string": return "string";
|
|
700
|
-
case "number": return "number";
|
|
701
|
-
case "integer": return "integer";
|
|
702
|
-
case "boolean": return "boolean";
|
|
703
|
-
case "array": return "array";
|
|
704
|
-
case "object": return "object";
|
|
705
|
-
default: return "string";
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
/**
|
|
709
|
-
* Convert OpenAPI schema to parameter schema
|
|
710
|
-
*/
|
|
711
|
-
function convertOpenAPISchemaToParameterSchema(schema) {
|
|
712
|
-
if ("$ref" in schema) return { type: "object" };
|
|
713
|
-
const result = { type: mapOpenAPIType(schema.type) };
|
|
714
|
-
if (schema.description) result.description = schema.description;
|
|
715
|
-
if (schema.enum) result.enum = schema.enum;
|
|
716
|
-
if (schema.minimum !== void 0) result.minimum = schema.minimum;
|
|
717
|
-
if (schema.maximum !== void 0) result.maximum = schema.maximum;
|
|
718
|
-
if (schema.pattern) result.pattern = schema.pattern;
|
|
719
|
-
if (schema.format) result.format = schema.format;
|
|
720
|
-
if (schema.default !== void 0) result.default = schema.default;
|
|
721
|
-
if (schema.type === "array" && schema.items) result.items = convertOpenAPISchemaToParameterSchema(schema.items);
|
|
722
|
-
if (schema.type === "object" && schema.properties) {
|
|
723
|
-
result.properties = {};
|
|
724
|
-
for (const [propName, propSchema] of Object.entries(schema.properties)) result.properties[propName] = convertOpenAPISchemaToParameterSchema(propSchema);
|
|
725
|
-
if (schema.required && schema.required.length > 0) result.required = schema.required;
|
|
726
|
-
}
|
|
727
|
-
return result;
|
|
728
|
-
}
|
|
729
|
-
/**
|
|
730
|
-
* Convert OpenAPI parameter object to tool parameter schema
|
|
731
|
-
*/
|
|
732
|
-
function convertOpenAPIParamToSchema(param) {
|
|
733
|
-
const schema = param.schema;
|
|
734
|
-
return convertOpenAPISchemaToParameterSchema(schema);
|
|
735
|
-
}
|
|
736
|
-
/**
|
|
737
|
-
* Create a tool schema from an OpenAPI operation specification
|
|
738
|
-
*/
|
|
739
|
-
function createSchemaFromOperation(operationId, opSpec) {
|
|
740
|
-
const properties = {};
|
|
741
|
-
const required = [];
|
|
742
|
-
const params = opSpec.parameters || [];
|
|
743
|
-
for (const param of params) {
|
|
744
|
-
properties[param.name] = convertOpenAPIParamToSchema(param);
|
|
745
|
-
if (param.required) required.push(param.name);
|
|
746
|
-
}
|
|
747
|
-
if (opSpec.requestBody) {
|
|
748
|
-
const jsonContent = opSpec.requestBody.content?.["application/json"];
|
|
749
|
-
if (jsonContent?.schema) {
|
|
750
|
-
const bodySchema = convertOpenAPISchemaToParameterSchema(jsonContent.schema);
|
|
751
|
-
if (bodySchema.type === "object" && bodySchema.properties) {
|
|
752
|
-
Object.assign(properties, bodySchema.properties);
|
|
753
|
-
const schemaWithRequired = bodySchema;
|
|
754
|
-
if (schemaWithRequired.required) required.push(...schemaWithRequired.required);
|
|
755
|
-
}
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
const schemaParams = {
|
|
759
|
-
type: "object",
|
|
760
|
-
properties
|
|
761
|
-
};
|
|
762
|
-
if (required.length > 0) schemaParams.required = required;
|
|
763
|
-
return {
|
|
764
|
-
name: operationId,
|
|
765
|
-
description: opSpec.summary || opSpec.description || `OpenAPI operation: ${operationId}`,
|
|
766
|
-
parameters: schemaParams
|
|
767
|
-
};
|
|
768
|
-
}
|
|
769
|
-
//#endregion
|
|
770
|
-
//#region src/implementations/openapi-tool.ts
|
|
771
|
-
/**
|
|
772
|
-
* OpenAPI tool implementation
|
|
773
|
-
* Executes API calls based on OpenAPI 3.0 specifications
|
|
774
|
-
*
|
|
775
|
-
* Implements ITool without extending AbstractTool to avoid
|
|
776
|
-
* circular runtime dependency (tools → agents → tools).
|
|
777
|
-
*/
|
|
778
|
-
var OpenAPITool = class {
|
|
779
|
-
schema;
|
|
780
|
-
apiSpec;
|
|
781
|
-
operationId;
|
|
782
|
-
baseURL;
|
|
783
|
-
config;
|
|
784
|
-
eventService;
|
|
785
|
-
constructor(config) {
|
|
786
|
-
this.config = config;
|
|
787
|
-
if (typeof config.spec !== "object" || config.spec === null || typeof config.spec.openapi !== "string" || typeof config.spec.paths !== "object") throw new Error("Invalid OpenAPI spec: must contain \"openapi\" (string) and \"paths\" (object) fields");
|
|
788
|
-
this.apiSpec = config.spec;
|
|
789
|
-
this.operationId = config.operationId;
|
|
790
|
-
this.baseURL = config.baseURL;
|
|
791
|
-
this.schema = this.createSchemaFromOpenAPI();
|
|
792
|
-
}
|
|
793
|
-
/**
|
|
794
|
-
* Execute the OpenAPI tool
|
|
795
|
-
*/
|
|
796
|
-
async execute(parameters, context) {
|
|
797
|
-
const toolName = this.schema.name;
|
|
798
|
-
const validation = this.validateParameters(parameters);
|
|
799
|
-
if (!validation.isValid) throw new _robota_sdk_agent_core.ValidationError(`Invalid parameters for OpenAPI tool "${toolName}": ${validation.errors.join(", ")}`);
|
|
800
|
-
try {
|
|
801
|
-
const startTime = Date.now();
|
|
802
|
-
return {
|
|
803
|
-
success: true,
|
|
804
|
-
data: await this.executeAPICall(parameters, context),
|
|
805
|
-
metadata: {
|
|
806
|
-
executionTime: Date.now() - startTime,
|
|
807
|
-
toolName,
|
|
808
|
-
operationId: this.operationId,
|
|
809
|
-
baseURL: this.baseURL
|
|
810
|
-
}
|
|
811
|
-
};
|
|
812
|
-
} catch (error) {
|
|
813
|
-
if (error instanceof _robota_sdk_agent_core.ToolExecutionError || error instanceof _robota_sdk_agent_core.ValidationError) throw error;
|
|
814
|
-
const safeError = error instanceof Error ? error : new Error(String(error));
|
|
815
|
-
throw new _robota_sdk_agent_core.ToolExecutionError(`OpenAPI tool execution failed: ${safeError.message}`, toolName, safeError, {
|
|
816
|
-
operationId: this.operationId,
|
|
817
|
-
baseURL: this.baseURL,
|
|
818
|
-
parametersCount: Object.keys(parameters).length
|
|
819
|
-
});
|
|
820
|
-
}
|
|
821
|
-
}
|
|
822
|
-
/**
|
|
823
|
-
* Validate tool parameters
|
|
824
|
-
*/
|
|
825
|
-
validate(parameters) {
|
|
826
|
-
return this.validateParameters(parameters).isValid;
|
|
827
|
-
}
|
|
828
|
-
/**
|
|
829
|
-
* Validate tool parameters with detailed result
|
|
830
|
-
*/
|
|
831
|
-
validateParameters(parameters) {
|
|
832
|
-
const required = this.schema.parameters.required || [];
|
|
833
|
-
const errors = [];
|
|
834
|
-
for (const field of required) if (!(field in parameters)) errors.push(`Missing required parameter: ${field}`);
|
|
835
|
-
return {
|
|
836
|
-
isValid: errors.length === 0,
|
|
837
|
-
errors
|
|
838
|
-
};
|
|
839
|
-
}
|
|
840
|
-
/**
|
|
841
|
-
* Get tool name
|
|
842
|
-
*/
|
|
843
|
-
getName() {
|
|
844
|
-
return this.schema.name;
|
|
845
|
-
}
|
|
846
|
-
/**
|
|
847
|
-
* Set EventService for post-construction injection.
|
|
848
|
-
*/
|
|
849
|
-
setEventService(eventService) {
|
|
850
|
-
this.eventService = eventService;
|
|
851
|
-
}
|
|
852
|
-
/**
|
|
853
|
-
* Get tool description
|
|
854
|
-
*/
|
|
855
|
-
getDescription() {
|
|
856
|
-
return this.schema.description;
|
|
857
|
-
}
|
|
858
|
-
/**
|
|
859
|
-
* Execute the actual API call
|
|
860
|
-
* @private
|
|
861
|
-
*/
|
|
862
|
-
async executeAPICall(parameters, _context) {
|
|
863
|
-
const operation = findOperation(this.apiSpec, this.operationId);
|
|
864
|
-
if (!operation) throw new Error(`Operation ${this.operationId} not found in OpenAPI spec`);
|
|
865
|
-
this.buildRequestConfig(operation, parameters);
|
|
866
|
-
throw new Error("Not implemented: actual API execution is not yet available");
|
|
867
|
-
}
|
|
868
|
-
/**
|
|
869
|
-
* Build HTTP request configuration from OpenAPI operation and parameters
|
|
870
|
-
*/
|
|
871
|
-
buildRequestConfig(opInfo, parameters) {
|
|
872
|
-
const { method, path, operation } = opInfo;
|
|
873
|
-
let url = this.baseURL + path;
|
|
874
|
-
const headers = {};
|
|
875
|
-
let body;
|
|
876
|
-
const params = operation.parameters || [];
|
|
877
|
-
for (const param of params) {
|
|
878
|
-
const value = parameters[param.name];
|
|
879
|
-
if (value === void 0 && param.required) throw new Error(`Required parameter ${param.name} is missing`);
|
|
880
|
-
if (value !== void 0) switch (param.in) {
|
|
881
|
-
case "path":
|
|
882
|
-
url = url.replace(`{${param.name}}`, encodeURIComponent(String(value)));
|
|
883
|
-
break;
|
|
884
|
-
case "query": {
|
|
885
|
-
const separator = url.includes("?") ? "&" : "?";
|
|
886
|
-
url += `${separator}${param.name}=${encodeURIComponent(String(value))}`;
|
|
887
|
-
break;
|
|
888
|
-
}
|
|
889
|
-
case "header":
|
|
890
|
-
headers[param.name] = String(value);
|
|
891
|
-
break;
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
if ([
|
|
895
|
-
"post",
|
|
896
|
-
"put",
|
|
897
|
-
"patch"
|
|
898
|
-
].includes(method) && operation.requestBody) {
|
|
899
|
-
if (operation.requestBody.content?.["application/json"]) {
|
|
900
|
-
headers["Content-Type"] = "application/json";
|
|
901
|
-
const bodyParams = {};
|
|
902
|
-
for (const [key, value] of Object.entries(parameters)) if (!params.some((p) => p.name === key)) bodyParams[key] = value;
|
|
903
|
-
body = JSON.stringify(bodyParams);
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
if (this.config.auth) switch (this.config.auth.type) {
|
|
907
|
-
case "bearer":
|
|
908
|
-
headers["Authorization"] = `Bearer ${this.config.auth.token}`;
|
|
909
|
-
break;
|
|
910
|
-
case "apiKey": {
|
|
911
|
-
const headerName = this.config.auth.header || "X-API-Key";
|
|
912
|
-
headers[headerName] = this.config.auth.apiKey || "";
|
|
913
|
-
break;
|
|
914
|
-
}
|
|
915
|
-
}
|
|
916
|
-
const result = {
|
|
917
|
-
method,
|
|
918
|
-
url,
|
|
919
|
-
headers
|
|
920
|
-
};
|
|
921
|
-
if (body !== void 0) result.body = body;
|
|
922
|
-
return result;
|
|
923
|
-
}
|
|
924
|
-
/**
|
|
925
|
-
* Create tool schema from OpenAPI operation specification
|
|
926
|
-
*/
|
|
927
|
-
createSchemaFromOpenAPI() {
|
|
928
|
-
const operation = findOperation(this.apiSpec, this.operationId);
|
|
929
|
-
if (!operation) throw new Error(`[STRICT-POLICY][EMITTER-CONTRACT] OpenAPI operation not found: ${this.operationId}. Emitter contract must provide a valid operationId present in the OpenAPI document.`);
|
|
930
|
-
return createSchemaFromOperation(this.operationId, operation.operation);
|
|
931
|
-
}
|
|
932
|
-
};
|
|
933
|
-
/**
|
|
934
|
-
* Factory function to create OpenAPI tools from specification
|
|
935
|
-
*/
|
|
936
|
-
function createOpenAPITool(config) {
|
|
937
|
-
return new OpenAPITool(config);
|
|
938
|
-
}
|
|
939
|
-
//#endregion
|
|
940
667
|
//#region src/builtins/bash-tool.ts
|
|
941
668
|
/**
|
|
942
669
|
* BashTool — execute shell commands via child_process.spawn
|
|
@@ -956,7 +683,8 @@ const BashSchema = zod.z.object({
|
|
|
956
683
|
* Resolves with the TToolResult JSON string.
|
|
957
684
|
*/
|
|
958
685
|
async function runBash(args, options = {}) {
|
|
959
|
-
const { command, timeout = DEFAULT_TIMEOUT_MS$2, workingDirectory } = args;
|
|
686
|
+
const { command, timeout: rawTimeout = DEFAULT_TIMEOUT_MS$2, workingDirectory } = args;
|
|
687
|
+
const timeout = Math.min(rawTimeout, 6e5);
|
|
960
688
|
if (options.sandboxClient) try {
|
|
961
689
|
const sandboxResult = await options.sandboxClient.run(command, {
|
|
962
690
|
timeoutMs: timeout,
|
|
@@ -1052,6 +780,25 @@ function createBashTool(options = {}) {
|
|
|
1052
780
|
*/
|
|
1053
781
|
const bashTool = createBashTool();
|
|
1054
782
|
//#endregion
|
|
783
|
+
//#region src/builtins/path-guard.ts
|
|
784
|
+
/**
|
|
785
|
+
* Returns a JSON-serialized TToolResult error when filePath is outside cwd.
|
|
786
|
+
* Returns undefined when the path is within cwd or cwd is not set.
|
|
787
|
+
*/
|
|
788
|
+
function checkPathWithinCwd(filePath, cwd) {
|
|
789
|
+
if (cwd === void 0) return void 0;
|
|
790
|
+
const resolved = (0, node_path.resolve)(filePath);
|
|
791
|
+
const cwdResolved = (0, node_path.resolve)(cwd);
|
|
792
|
+
if (resolved !== cwdResolved && !resolved.startsWith(cwdResolved + node_path.sep)) {
|
|
793
|
+
const result = {
|
|
794
|
+
success: false,
|
|
795
|
+
output: "",
|
|
796
|
+
error: `Access denied: "${filePath}" is outside the working directory`
|
|
797
|
+
};
|
|
798
|
+
return JSON.stringify(result);
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
//#endregion
|
|
1055
802
|
//#region src/builtins/read-tool.ts
|
|
1056
803
|
/**
|
|
1057
804
|
* ReadTool — read a file and return its contents with line numbers (cat -n style).
|
|
@@ -1111,6 +858,8 @@ async function readFileTool(args, options = {}) {
|
|
|
1111
858
|
};
|
|
1112
859
|
return JSON.stringify(result);
|
|
1113
860
|
}
|
|
861
|
+
const pathError = checkPathWithinCwd(filePath, options.cwd);
|
|
862
|
+
if (pathError !== void 0) return pathError;
|
|
1114
863
|
let fileStats;
|
|
1115
864
|
try {
|
|
1116
865
|
fileStats = await (0, node_fs_promises.stat)(filePath);
|
|
@@ -1209,6 +958,10 @@ const WriteSchema = zod.z.object({
|
|
|
1209
958
|
});
|
|
1210
959
|
async function writeFileTool(args, options = {}) {
|
|
1211
960
|
const { filePath, content } = args;
|
|
961
|
+
if (!options.sandboxClient) {
|
|
962
|
+
const pathError = checkPathWithinCwd(filePath, options.cwd);
|
|
963
|
+
if (pathError !== void 0) return pathError;
|
|
964
|
+
}
|
|
1212
965
|
try {
|
|
1213
966
|
if (options.sandboxClient) await options.sandboxClient.writeFile(filePath, content);
|
|
1214
967
|
else await atomicWriteUtf8File(filePath, content);
|
|
@@ -1254,6 +1007,10 @@ const EditSchema = zod.z.object({
|
|
|
1254
1007
|
});
|
|
1255
1008
|
async function editFileTool(args, options = {}) {
|
|
1256
1009
|
const { filePath, oldString, newString, replaceAll = false } = args;
|
|
1010
|
+
if (!options.sandboxClient) {
|
|
1011
|
+
const pathError = checkPathWithinCwd(filePath, options.cwd);
|
|
1012
|
+
if (pathError !== void 0) return pathError;
|
|
1013
|
+
}
|
|
1257
1014
|
let content;
|
|
1258
1015
|
try {
|
|
1259
1016
|
content = options.sandboxClient ? await options.sandboxClient.readFile(filePath) : await (0, node_fs_promises.readFile)(filePath, "utf8");
|
|
@@ -1350,7 +1107,8 @@ async function globFileTool(args) {
|
|
|
1350
1107
|
};
|
|
1351
1108
|
return JSON.stringify(result);
|
|
1352
1109
|
}
|
|
1353
|
-
const
|
|
1110
|
+
const limit = (0, p_limit.default)(100);
|
|
1111
|
+
const withMtime = await Promise.all(matches.map((p) => limit(async () => {
|
|
1354
1112
|
const absPath = (0, node_path.resolve)(cwd, p);
|
|
1355
1113
|
try {
|
|
1356
1114
|
return {
|
|
@@ -1363,7 +1121,7 @@ async function globFileTool(args) {
|
|
|
1363
1121
|
mtime: 0
|
|
1364
1122
|
};
|
|
1365
1123
|
}
|
|
1366
|
-
}));
|
|
1124
|
+
})));
|
|
1367
1125
|
withMtime.sort((a, b) => b.mtime - a.mtime);
|
|
1368
1126
|
const maxResults = args.limit ?? DEFAULT_MAX_RESULTS;
|
|
1369
1127
|
const totalMatches = withMtime.length;
|
|
@@ -1534,6 +1292,17 @@ const WebFetchSchema = zod.z.object({
|
|
|
1534
1292
|
function htmlToText(html) {
|
|
1535
1293
|
return html.replace(/<script[\s\S]*?<\/script>/gi, "").replace(/<style[\s\S]*?<\/style>/gi, "").replace(/<[^>]+>/g, " ").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, "\"").replace(/'/g, "'").replace(/ /g, " ").replace(/\s+/g, " ").trim();
|
|
1536
1294
|
}
|
|
1295
|
+
function classifyFetchError(err) {
|
|
1296
|
+
if (!(err instanceof Error)) return String(err);
|
|
1297
|
+
if (err.name === "AbortError") return `Request timed out after ${DEFAULT_TIMEOUT_MS$1 / 1e3}s. The server did not respond in time.`;
|
|
1298
|
+
const code = err.code;
|
|
1299
|
+
if (code === "ENOTFOUND" || code === "EAI_AGAIN") return `Network error: DNS resolution failed for this host. The URL may be incorrect or the host does not exist. Do not retry with the same URL.`;
|
|
1300
|
+
if (code === "ECONNREFUSED") return `Network error: Connection refused. The server is not accepting connections at this address. Do not retry with the same URL.`;
|
|
1301
|
+
if (code === "ECONNRESET") return `Network error: Connection was reset by the server. The server may be temporarily unavailable.`;
|
|
1302
|
+
if (code === "ETIMEDOUT") return `Network error: Connection timed out. The server is not reachable within the expected time.`;
|
|
1303
|
+
if (code === "CERT_HAS_EXPIRED" || code === "UNABLE_TO_VERIFY_LEAF_SIGNATURE") return `Network error: SSL certificate error (${code}). The server's certificate is invalid. Do not retry with the same URL.`;
|
|
1304
|
+
return `Network error: ${err.message} Check that the URL is correct and the server is reachable.`;
|
|
1305
|
+
}
|
|
1537
1306
|
async function runWebFetch(args) {
|
|
1538
1307
|
const { url, headers } = args;
|
|
1539
1308
|
try {
|
|
@@ -1542,7 +1311,7 @@ async function runWebFetch(args) {
|
|
|
1542
1311
|
const result = {
|
|
1543
1312
|
success: false,
|
|
1544
1313
|
output: "",
|
|
1545
|
-
error: `Invalid URL: ${url}
|
|
1314
|
+
error: `Invalid URL: "${url}". Fix the URL format before retrying.`
|
|
1546
1315
|
};
|
|
1547
1316
|
return JSON.stringify(result);
|
|
1548
1317
|
}
|
|
@@ -1559,10 +1328,11 @@ async function runWebFetch(args) {
|
|
|
1559
1328
|
});
|
|
1560
1329
|
clearTimeout(timeout);
|
|
1561
1330
|
if (!response.ok) {
|
|
1331
|
+
const retryHint = response.status >= 500 ? " The server is temporarily unavailable — retrying may help." : " Do not retry with the same URL.";
|
|
1562
1332
|
const result = {
|
|
1563
1333
|
success: false,
|
|
1564
1334
|
output: "",
|
|
1565
|
-
error: `HTTP ${response.status} ${response.statusText}`
|
|
1335
|
+
error: `HTTP ${response.status} ${response.statusText}.${retryHint}`
|
|
1566
1336
|
};
|
|
1567
1337
|
return JSON.stringify(result);
|
|
1568
1338
|
}
|
|
@@ -1572,7 +1342,7 @@ async function runWebFetch(args) {
|
|
|
1572
1342
|
const result = {
|
|
1573
1343
|
success: false,
|
|
1574
1344
|
output: "",
|
|
1575
|
-
error: `Response too large: ${buffer.byteLength} bytes (max ${MAX_RESPONSE_BYTES})
|
|
1345
|
+
error: `Response too large: ${buffer.byteLength} bytes (max ${MAX_RESPONSE_BYTES}). Consider fetching a more specific URL or a paginated endpoint.`
|
|
1576
1346
|
};
|
|
1577
1347
|
return JSON.stringify(result);
|
|
1578
1348
|
}
|
|
@@ -1586,7 +1356,7 @@ async function runWebFetch(args) {
|
|
|
1586
1356
|
const result = {
|
|
1587
1357
|
success: false,
|
|
1588
1358
|
output: "",
|
|
1589
|
-
error:
|
|
1359
|
+
error: classifyFetchError(err)
|
|
1590
1360
|
};
|
|
1591
1361
|
return JSON.stringify(result);
|
|
1592
1362
|
}
|
|
@@ -1662,14 +1432,12 @@ const webSearchTool = createZodFunctionTool("WebSearch", "Search the web and ret
|
|
|
1662
1432
|
exports.E2BSandboxClient = E2BSandboxClient;
|
|
1663
1433
|
exports.FunctionTool = FunctionTool;
|
|
1664
1434
|
exports.InMemorySandboxClient = InMemorySandboxClient;
|
|
1665
|
-
exports.OpenAPITool = OpenAPITool;
|
|
1666
1435
|
exports.ToolRegistry = ToolRegistry;
|
|
1667
1436
|
exports.applyWorkspaceManifest = applyWorkspaceManifest;
|
|
1668
1437
|
exports.bashTool = bashTool;
|
|
1669
1438
|
exports.createBashTool = createBashTool;
|
|
1670
1439
|
exports.createEditTool = createEditTool;
|
|
1671
1440
|
exports.createFunctionTool = createFunctionTool;
|
|
1672
|
-
exports.createOpenAPITool = createOpenAPITool;
|
|
1673
1441
|
exports.createReadTool = createReadTool;
|
|
1674
1442
|
exports.createWriteTool = createWriteTool;
|
|
1675
1443
|
exports.createZodFunctionTool = createZodFunctionTool;
|
package/dist/node/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IEventService, IFunctionTool,
|
|
1
|
+
import { IEventService, IFunctionTool, IParameterValidationResult, ITool, IToolExecutionContext, IToolRegistry, IToolResult, IToolSchema, TToolExecutor, TToolParameters, TUniversalValue } from "@robota-sdk/agent-core";
|
|
2
2
|
|
|
3
3
|
//#region src/types/tool-result.d.ts
|
|
4
4
|
/**
|
|
@@ -104,6 +104,8 @@ interface ISandboxClient {
|
|
|
104
104
|
}
|
|
105
105
|
interface ISandboxToolOptions {
|
|
106
106
|
sandboxClient?: ISandboxClient;
|
|
107
|
+
/** When set, Read/Write/Edit operations on the host (non-sandbox) are restricted to this directory. */
|
|
108
|
+
cwd?: string;
|
|
107
109
|
}
|
|
108
110
|
//#endregion
|
|
109
111
|
//#region src/sandbox/e2b-sandbox-client.d.ts
|
|
@@ -348,65 +350,6 @@ declare function createFunctionTool(name: string, description: string, parameter
|
|
|
348
350
|
*/
|
|
349
351
|
declare function createZodFunctionTool(name: string, description: string, zodSchema: IZodSchema, fn: TToolExecutor): FunctionTool;
|
|
350
352
|
//#endregion
|
|
351
|
-
//#region src/implementations/openapi-tool.d.ts
|
|
352
|
-
/**
|
|
353
|
-
* OpenAPI tool implementation
|
|
354
|
-
* Executes API calls based on OpenAPI 3.0 specifications
|
|
355
|
-
*
|
|
356
|
-
* Implements ITool without extending AbstractTool to avoid
|
|
357
|
-
* circular runtime dependency (tools → agents → tools).
|
|
358
|
-
*/
|
|
359
|
-
declare class OpenAPITool implements ITool {
|
|
360
|
-
readonly schema: IToolSchema;
|
|
361
|
-
private readonly apiSpec;
|
|
362
|
-
private readonly operationId;
|
|
363
|
-
private readonly baseURL;
|
|
364
|
-
private readonly config;
|
|
365
|
-
private eventService;
|
|
366
|
-
constructor(config: IOpenAPIToolConfig);
|
|
367
|
-
/**
|
|
368
|
-
* Execute the OpenAPI tool
|
|
369
|
-
*/
|
|
370
|
-
execute(parameters: TToolParameters, context?: IToolExecutionContext): Promise<IToolResult>;
|
|
371
|
-
/**
|
|
372
|
-
* Validate tool parameters
|
|
373
|
-
*/
|
|
374
|
-
validate(parameters: TToolParameters): boolean;
|
|
375
|
-
/**
|
|
376
|
-
* Validate tool parameters with detailed result
|
|
377
|
-
*/
|
|
378
|
-
validateParameters(parameters: TToolParameters): IParameterValidationResult;
|
|
379
|
-
/**
|
|
380
|
-
* Get tool name
|
|
381
|
-
*/
|
|
382
|
-
getName(): string;
|
|
383
|
-
/**
|
|
384
|
-
* Set EventService for post-construction injection.
|
|
385
|
-
*/
|
|
386
|
-
setEventService(eventService: IEventService | undefined): void;
|
|
387
|
-
/**
|
|
388
|
-
* Get tool description
|
|
389
|
-
*/
|
|
390
|
-
getDescription(): string;
|
|
391
|
-
/**
|
|
392
|
-
* Execute the actual API call
|
|
393
|
-
* @private
|
|
394
|
-
*/
|
|
395
|
-
private executeAPICall;
|
|
396
|
-
/**
|
|
397
|
-
* Build HTTP request configuration from OpenAPI operation and parameters
|
|
398
|
-
*/
|
|
399
|
-
private buildRequestConfig;
|
|
400
|
-
/**
|
|
401
|
-
* Create tool schema from OpenAPI operation specification
|
|
402
|
-
*/
|
|
403
|
-
private createSchemaFromOpenAPI;
|
|
404
|
-
}
|
|
405
|
-
/**
|
|
406
|
-
* Factory function to create OpenAPI tools from specification
|
|
407
|
-
*/
|
|
408
|
-
declare function createOpenAPITool(config: IOpenAPIToolConfig): OpenAPITool;
|
|
409
|
-
//#endregion
|
|
410
353
|
//#region src/implementations/function-tool/schema-converter.d.ts
|
|
411
354
|
/**
|
|
412
355
|
* Convert Zod schema to JSON Schema format with safe undefined handling
|
|
@@ -479,12 +422,6 @@ declare const globTool: FunctionTool;
|
|
|
479
422
|
declare const grepTool: FunctionTool;
|
|
480
423
|
//#endregion
|
|
481
424
|
//#region src/builtins/web-fetch-tool.d.ts
|
|
482
|
-
/**
|
|
483
|
-
* WebFetchTool — fetch a URL and return its content as text.
|
|
484
|
-
*
|
|
485
|
-
* HTML is stripped to plain text for readability. Uses Node.js native fetch.
|
|
486
|
-
* Output is capped at 30K chars (same as other tools).
|
|
487
|
-
*/
|
|
488
425
|
declare const webFetchTool: FunctionTool;
|
|
489
426
|
//#endregion
|
|
490
427
|
//#region src/builtins/web-search-tool.d.ts
|
|
@@ -496,5 +433,5 @@ declare const webFetchTool: FunctionTool;
|
|
|
496
433
|
*/
|
|
497
434
|
declare const webSearchTool: FunctionTool;
|
|
498
435
|
//#endregion
|
|
499
|
-
export { E2BSandboxClient, FunctionTool, type IE2BSandboxAdapter, type IE2BSandboxClientOptions, type IFunctionToolExecutionMetadata, type IFunctionToolResult, type IFunctionToolValidationOptions, type IInMemorySandboxClientOptions, type ISandboxClient, type ISandboxRunOptions, type ISandboxRunResult, type ISandboxToolOptions, type ISchemaConversionOptions, type IWorkspaceManifest, type IWorkspaceManifestAppliedEntry, type IWorkspaceManifestApplyOptions, type IWorkspaceManifestApplyResult, type IWorkspaceManifestAzureBlobMountEntry, type IWorkspaceManifestDirectoryEntry, type IWorkspaceManifestFileEntry, type IWorkspaceManifestGcsMountEntry, type IWorkspaceManifestGitRepositoryEntry, type IWorkspaceManifestLocalDirectoryEntry, type IWorkspaceManifestLocalFileEntry, type IWorkspaceManifestPermissions, type IWorkspaceManifestR2MountEntry, type IWorkspaceManifestS3MountEntry, type IZodParseResult, type IZodSchema, type IZodSchemaDef, InMemorySandboxClient,
|
|
436
|
+
export { E2BSandboxClient, FunctionTool, type IE2BSandboxAdapter, type IE2BSandboxClientOptions, type IFunctionToolExecutionMetadata, type IFunctionToolResult, type IFunctionToolValidationOptions, type IInMemorySandboxClientOptions, type ISandboxClient, type ISandboxRunOptions, type ISandboxRunResult, type ISandboxToolOptions, type ISchemaConversionOptions, type IWorkspaceManifest, type IWorkspaceManifestAppliedEntry, type IWorkspaceManifestApplyOptions, type IWorkspaceManifestApplyResult, type IWorkspaceManifestAzureBlobMountEntry, type IWorkspaceManifestDirectoryEntry, type IWorkspaceManifestFileEntry, type IWorkspaceManifestGcsMountEntry, type IWorkspaceManifestGitRepositoryEntry, type IWorkspaceManifestLocalDirectoryEntry, type IWorkspaceManifestLocalFileEntry, type IWorkspaceManifestPermissions, type IWorkspaceManifestR2MountEntry, type IWorkspaceManifestS3MountEntry, type IZodParseResult, type IZodSchema, type IZodSchemaDef, InMemorySandboxClient, type TInMemorySandboxRunHandler, type TToolResult, type TWorkspaceManifestApplyStatus, type TWorkspaceManifestEntry, ToolRegistry, applyWorkspaceManifest, bashTool, createBashTool, createEditTool, createFunctionTool, createReadTool, createWriteTool, createZodFunctionTool, editTool, globTool, grepTool, readTool, validateWorkspaceManifestPath, webFetchTool, webSearchTool, writeTool, zodToJsonSchema };
|
|
500
437
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/types/tool-result.ts","../../src/sandbox/types.ts","../../src/sandbox/e2b-sandbox-client.ts","../../src/sandbox/in-memory-sandbox-client.ts","../../src/sandbox/workspace-manifest.ts","../../src/registry/tool-registry.ts","../../src/implementations/function-tool/types.ts","../../src/implementations/function-tool.ts","../../src/implementations/
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/types/tool-result.ts","../../src/sandbox/types.ts","../../src/sandbox/e2b-sandbox-client.ts","../../src/sandbox/in-memory-sandbox-client.ts","../../src/sandbox/workspace-manifest.ts","../../src/registry/tool-registry.ts","../../src/implementations/function-tool/types.ts","../../src/implementations/function-tool.ts","../../src/implementations/function-tool/schema-converter.ts","../../src/builtins/bash-tool.ts","../../src/builtins/read-tool.ts","../../src/builtins/write-tool.ts","../../src/builtins/edit-tool.ts","../../src/builtins/glob-tool.ts","../../src/builtins/grep-tool.ts","../../src/builtins/web-fetch-tool.ts","../../src/builtins/web-search-tool.ts"],"mappings":"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"}
|