daycare-cli 0.0.12 → 0.0.14
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/config/configResolve.d.ts.map +1 -1
- package/dist/config/configResolve.js +2 -0
- package/dist/config/configResolve.js.map +1 -1
- package/dist/config/configResolve.spec.js +10 -0
- package/dist/config/configResolve.spec.js.map +1 -1
- package/dist/config/configSettingsParse.d.ts.map +1 -1
- package/dist/config/configSettingsParse.js +1 -0
- package/dist/config/configSettingsParse.js.map +1 -1
- package/dist/config/configTypes.d.ts +1 -0
- package/dist/config/configTypes.d.ts.map +1 -1
- package/dist/engine/agents/agent.d.ts.map +1 -1
- package/dist/engine/agents/agent.js +1 -0
- package/dist/engine/agents/agent.js.map +1 -1
- package/dist/engine/engine.d.ts.map +1 -1
- package/dist/engine/engine.js +5 -0
- package/dist/engine/engine.js.map +1 -1
- package/dist/engine/engine.spec.js +16 -0
- package/dist/engine/engine.spec.js.map +1 -1
- package/dist/engine/modules/rlm/rlmConstants.d.ts +3 -0
- package/dist/engine/modules/rlm/rlmConstants.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmConstants.js +3 -0
- package/dist/engine/modules/rlm/rlmConstants.js.map +1 -0
- package/dist/engine/modules/rlm/rlmConvert.d.ts +14 -0
- package/dist/engine/modules/rlm/rlmConvert.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmConvert.js +72 -0
- package/dist/engine/modules/rlm/rlmConvert.js.map +1 -0
- package/dist/engine/modules/rlm/rlmConvert.spec.d.ts +2 -0
- package/dist/engine/modules/rlm/rlmConvert.spec.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmConvert.spec.js +92 -0
- package/dist/engine/modules/rlm/rlmConvert.spec.js.map +1 -0
- package/dist/engine/modules/rlm/rlmExecute.d.ts +13 -0
- package/dist/engine/modules/rlm/rlmExecute.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmExecute.js +120 -0
- package/dist/engine/modules/rlm/rlmExecute.js.map +1 -0
- package/dist/engine/modules/rlm/rlmExecute.spec.d.ts +2 -0
- package/dist/engine/modules/rlm/rlmExecute.spec.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmExecute.spec.js +118 -0
- package/dist/engine/modules/rlm/rlmExecute.spec.js.map +1 -0
- package/dist/engine/modules/rlm/rlmParameterEntriesBuild.d.ts +13 -0
- package/dist/engine/modules/rlm/rlmParameterEntriesBuild.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmParameterEntriesBuild.js +51 -0
- package/dist/engine/modules/rlm/rlmParameterEntriesBuild.js.map +1 -0
- package/dist/engine/modules/rlm/rlmPreambleBuild.d.ts +7 -0
- package/dist/engine/modules/rlm/rlmPreambleBuild.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmPreambleBuild.js +122 -0
- package/dist/engine/modules/rlm/rlmPreambleBuild.js.map +1 -0
- package/dist/engine/modules/rlm/rlmPreambleBuild.spec.d.ts +2 -0
- package/dist/engine/modules/rlm/rlmPreambleBuild.spec.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmPreambleBuild.spec.js +62 -0
- package/dist/engine/modules/rlm/rlmPreambleBuild.spec.js.map +1 -0
- package/dist/engine/modules/rlm/rlmTool.d.ts +8 -0
- package/dist/engine/modules/rlm/rlmTool.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmTool.js +67 -0
- package/dist/engine/modules/rlm/rlmTool.js.map +1 -0
- package/dist/engine/modules/rlm/rlmTool.spec.d.ts +2 -0
- package/dist/engine/modules/rlm/rlmTool.spec.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmTool.spec.js +107 -0
- package/dist/engine/modules/rlm/rlmTool.spec.js.map +1 -0
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.d.ts +7 -0
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.js +22 -0
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.js.map +1 -0
- package/dist/engine/modules/tools/toolListContextBuild.d.ts +1 -0
- package/dist/engine/modules/tools/toolListContextBuild.d.ts.map +1 -1
- package/dist/engine/modules/tools/toolListContextBuild.js +17 -0
- package/dist/engine/modules/tools/toolListContextBuild.js.map +1 -1
- package/dist/engine/modules/tools/toolListContextBuild.spec.js +16 -0
- package/dist/engine/modules/tools/toolListContextBuild.spec.js.map +1 -1
- package/dist/settings.d.ts +1 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { rlmParameterEntriesBuild } from "./rlmParameterEntriesBuild.js";
|
|
2
|
+
/**
|
|
3
|
+
* Converts Monty positional/keyword arguments into the JSON object expected by tool execution.
|
|
4
|
+
* Expects: positional argument order matches generated Python stub parameter order.
|
|
5
|
+
*/
|
|
6
|
+
export function rlmArgsConvert(args, kwargs, toolSchema) {
|
|
7
|
+
const propertyNames = rlmParameterEntriesBuild(toolSchema).map((entry) => entry.name);
|
|
8
|
+
const output = {};
|
|
9
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
10
|
+
const name = propertyNames[index];
|
|
11
|
+
if (!name) {
|
|
12
|
+
throw new Error(`Too many positional arguments for tool ${toolSchema.name}.`);
|
|
13
|
+
}
|
|
14
|
+
output[name] = montyValueConvert(args[index]);
|
|
15
|
+
}
|
|
16
|
+
const convertedKwargs = montyValueConvert(kwargs);
|
|
17
|
+
if (!recordIs(convertedKwargs)) {
|
|
18
|
+
throw new Error("Tool kwargs must convert to an object.");
|
|
19
|
+
}
|
|
20
|
+
for (const [name, value] of Object.entries(convertedKwargs)) {
|
|
21
|
+
output[name] = value;
|
|
22
|
+
}
|
|
23
|
+
return output;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Converts a tool execution result into a Python-friendly string value.
|
|
27
|
+
* Expects: tool result content follows the ToolResultMessage text block convention.
|
|
28
|
+
*/
|
|
29
|
+
export function rlmResultConvert(toolResult) {
|
|
30
|
+
const text = toolResult.toolMessage.content
|
|
31
|
+
.filter((part) => part.type === "text")
|
|
32
|
+
.map((part) => ("text" in part && typeof part.text === "string" ? part.text : ""))
|
|
33
|
+
.join("\n")
|
|
34
|
+
.trim();
|
|
35
|
+
if (text.length > 0) {
|
|
36
|
+
return text;
|
|
37
|
+
}
|
|
38
|
+
if (toolResult.toolMessage.isError) {
|
|
39
|
+
return "Tool execution failed.";
|
|
40
|
+
}
|
|
41
|
+
return "";
|
|
42
|
+
}
|
|
43
|
+
function montyValueConvert(value) {
|
|
44
|
+
if (typeof value === "bigint") {
|
|
45
|
+
if (value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER)) {
|
|
46
|
+
return Number(value);
|
|
47
|
+
}
|
|
48
|
+
return value.toString();
|
|
49
|
+
}
|
|
50
|
+
if (value instanceof Map) {
|
|
51
|
+
const result = {};
|
|
52
|
+
for (const [key, item] of value.entries()) {
|
|
53
|
+
result[String(key)] = montyValueConvert(item);
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
if (Array.isArray(value)) {
|
|
58
|
+
return value.map((entry) => montyValueConvert(entry));
|
|
59
|
+
}
|
|
60
|
+
if (!recordIs(value)) {
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
const result = {};
|
|
64
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
65
|
+
result[key] = montyValueConvert(entry);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
function recordIs(value) {
|
|
70
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=rlmConvert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlmConvert.js","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmConvert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlmConvert.spec.d.ts","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmConvert.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { Type } from "@sinclair/typebox";
|
|
3
|
+
import { rlmArgsConvert, rlmResultConvert } from "./rlmConvert.js";
|
|
4
|
+
describe("rlmArgsConvert", () => {
|
|
5
|
+
const tool = {
|
|
6
|
+
name: "write_file",
|
|
7
|
+
description: "",
|
|
8
|
+
parameters: Type.Object({
|
|
9
|
+
path: Type.String(),
|
|
10
|
+
content: Type.String(),
|
|
11
|
+
mode: Type.Optional(Type.String())
|
|
12
|
+
}, { additionalProperties: false })
|
|
13
|
+
};
|
|
14
|
+
it("maps positional arguments by generated stub parameter order", () => {
|
|
15
|
+
const converted = rlmArgsConvert(["/tmp/a.txt", "hello"], {}, tool);
|
|
16
|
+
expect(converted).toEqual({
|
|
17
|
+
path: "/tmp/a.txt",
|
|
18
|
+
content: "hello"
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
it("maps positional arguments required-first when optional keys appear first", () => {
|
|
22
|
+
const reorderedTool = {
|
|
23
|
+
name: "write_file",
|
|
24
|
+
description: "",
|
|
25
|
+
parameters: {
|
|
26
|
+
type: "object",
|
|
27
|
+
properties: {
|
|
28
|
+
mode: { type: "string" },
|
|
29
|
+
path: { type: "string" },
|
|
30
|
+
content: { type: "string" }
|
|
31
|
+
},
|
|
32
|
+
required: ["path", "content"],
|
|
33
|
+
additionalProperties: false
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const converted = rlmArgsConvert(["/tmp/a.txt", "hello"], {}, reorderedTool);
|
|
37
|
+
expect(converted).toEqual({
|
|
38
|
+
path: "/tmp/a.txt",
|
|
39
|
+
content: "hello"
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
it("merges kwargs and lets kwargs override positional args", () => {
|
|
43
|
+
const converted = rlmArgsConvert(["/tmp/a.txt", "hello"], { content: "override" }, tool);
|
|
44
|
+
expect(converted).toEqual({
|
|
45
|
+
path: "/tmp/a.txt",
|
|
46
|
+
content: "override"
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
it("converts nested Monty map and bigint values", () => {
|
|
50
|
+
const converted = rlmArgsConvert(["/tmp/a.txt", new Map([["count", BigInt(3)]])], {}, tool);
|
|
51
|
+
expect(converted).toEqual({
|
|
52
|
+
path: "/tmp/a.txt",
|
|
53
|
+
content: {
|
|
54
|
+
count: 3
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("rlmResultConvert", () => {
|
|
60
|
+
it("returns joined text content", () => {
|
|
61
|
+
const result = {
|
|
62
|
+
toolMessage: {
|
|
63
|
+
role: "toolResult",
|
|
64
|
+
toolCallId: "1",
|
|
65
|
+
toolName: "x",
|
|
66
|
+
content: [
|
|
67
|
+
{ type: "text", text: "hello" },
|
|
68
|
+
{ type: "text", text: "world" }
|
|
69
|
+
],
|
|
70
|
+
isError: false,
|
|
71
|
+
timestamp: Date.now()
|
|
72
|
+
},
|
|
73
|
+
files: []
|
|
74
|
+
};
|
|
75
|
+
expect(rlmResultConvert(result)).toBe("hello\nworld");
|
|
76
|
+
});
|
|
77
|
+
it("returns fallback error text for empty error payloads", () => {
|
|
78
|
+
const result = {
|
|
79
|
+
toolMessage: {
|
|
80
|
+
role: "toolResult",
|
|
81
|
+
toolCallId: "1",
|
|
82
|
+
toolName: "x",
|
|
83
|
+
content: [],
|
|
84
|
+
isError: true,
|
|
85
|
+
timestamp: Date.now()
|
|
86
|
+
},
|
|
87
|
+
files: []
|
|
88
|
+
};
|
|
89
|
+
expect(rlmResultConvert(result)).toBe("Tool execution failed.");
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=rlmConvert.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlmConvert.spec.js","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmConvert.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ToolExecutionContext } from "@/types";
|
|
2
|
+
import type { ToolResolver } from "../toolResolver.js";
|
|
3
|
+
export type RlmExecuteResult = {
|
|
4
|
+
output: string;
|
|
5
|
+
printOutput: string[];
|
|
6
|
+
toolCallCount: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Executes Monty Python code by routing external function calls into ToolResolver.
|
|
10
|
+
* Expects: preamble matches the currently available tool names.
|
|
11
|
+
*/
|
|
12
|
+
export declare function rlmExecute(code: string, preamble: string, context: ToolExecutionContext, toolResolver: ToolResolver): Promise<RlmExecuteResult>;
|
|
13
|
+
//# sourceMappingURL=rlmExecute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlmExecute.d.ts","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmExecute.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAWvD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,oBAAoB,EAC7B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAmF3B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { Monty, MontySnapshot } from "@pydantic/monty";
|
|
2
|
+
import { createId } from "@paralleldrive/cuid2";
|
|
3
|
+
import { rlmArgsConvert, rlmResultConvert } from "./rlmConvert.js";
|
|
4
|
+
import { RLM_PRINT_FUNCTION_NAME, RLM_TOOL_NAME } from "./rlmConstants.js";
|
|
5
|
+
const RLM_LIMITS = {
|
|
6
|
+
maxDurationSecs: 30,
|
|
7
|
+
maxMemory: 50 * 1024 * 1024,
|
|
8
|
+
maxRecursionDepth: 100,
|
|
9
|
+
maxAllocations: 1_000_000
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Executes Monty Python code by routing external function calls into ToolResolver.
|
|
13
|
+
* Expects: preamble matches the currently available tool names.
|
|
14
|
+
*/
|
|
15
|
+
export async function rlmExecute(code, preamble, context, toolResolver) {
|
|
16
|
+
const availableTools = toolResolver
|
|
17
|
+
.listTools()
|
|
18
|
+
.filter((tool) => tool.name !== RLM_TOOL_NAME);
|
|
19
|
+
const toolByName = new Map(availableTools.map((tool) => [tool.name, tool]));
|
|
20
|
+
const externalFunctions = [...toolByName.keys(), RLM_PRINT_FUNCTION_NAME];
|
|
21
|
+
const rewrittenCode = printCallsRewrite(code);
|
|
22
|
+
const script = [preamble.trim(), rewrittenCode].filter((chunk) => chunk.length > 0).join("\n\n");
|
|
23
|
+
const monty = new Monty(script, {
|
|
24
|
+
scriptName: "run_python.py",
|
|
25
|
+
externalFunctions
|
|
26
|
+
});
|
|
27
|
+
const printOutput = [];
|
|
28
|
+
let toolCallCount = 0;
|
|
29
|
+
let progress = monty.start({ limits: RLM_LIMITS });
|
|
30
|
+
while (progress instanceof MontySnapshot) {
|
|
31
|
+
if (progress.functionName === RLM_PRINT_FUNCTION_NAME) {
|
|
32
|
+
printOutput.push(printLineBuild(progress.args));
|
|
33
|
+
progress = progress.resume({ returnValue: null });
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const tool = toolByName.get(progress.functionName);
|
|
37
|
+
if (!tool) {
|
|
38
|
+
progress = progress.resume({
|
|
39
|
+
exception: {
|
|
40
|
+
type: "RuntimeError",
|
|
41
|
+
message: `ToolError: Unknown tool: ${progress.functionName}`
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
toolCallCount += 1;
|
|
47
|
+
let resumeOptions;
|
|
48
|
+
try {
|
|
49
|
+
const args = rlmArgsConvert(progress.args, progress.kwargs, tool);
|
|
50
|
+
const toolResult = await toolResolver.execute({
|
|
51
|
+
type: "toolCall",
|
|
52
|
+
id: createId(),
|
|
53
|
+
name: tool.name,
|
|
54
|
+
arguments: args
|
|
55
|
+
}, context);
|
|
56
|
+
const value = rlmResultConvert(toolResult);
|
|
57
|
+
if (toolResult.toolMessage.isError) {
|
|
58
|
+
resumeOptions = {
|
|
59
|
+
exception: {
|
|
60
|
+
type: "RuntimeError",
|
|
61
|
+
message: typeof value === "string" && value.trim().length > 0
|
|
62
|
+
? value
|
|
63
|
+
: `Tool execution failed: ${tool.name}`
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
resumeOptions = { returnValue: value };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
73
|
+
resumeOptions = {
|
|
74
|
+
exception: {
|
|
75
|
+
type: "RuntimeError",
|
|
76
|
+
message: `ToolError: ${message}`
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
progress = progress.resume(resumeOptions);
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
output: valueFormat(progress.output),
|
|
84
|
+
printOutput,
|
|
85
|
+
toolCallCount
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function printCallsRewrite(code) {
|
|
89
|
+
return code.replace(/(^|[^A-Za-z0-9_])print\s*\(/gm, `$1${RLM_PRINT_FUNCTION_NAME}(`);
|
|
90
|
+
}
|
|
91
|
+
function printLineBuild(args) {
|
|
92
|
+
return args.map((entry) => valueFormat(entry)).join(" ").trimEnd();
|
|
93
|
+
}
|
|
94
|
+
function valueFormat(value) {
|
|
95
|
+
if (value === null || value === undefined) {
|
|
96
|
+
return "";
|
|
97
|
+
}
|
|
98
|
+
if (typeof value === "string") {
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") {
|
|
102
|
+
return String(value);
|
|
103
|
+
}
|
|
104
|
+
if (value instanceof Map) {
|
|
105
|
+
return valueFormat(Object.fromEntries(value.entries()));
|
|
106
|
+
}
|
|
107
|
+
if (Array.isArray(value)) {
|
|
108
|
+
return value.map((entry) => valueFormat(entry)).join(", ");
|
|
109
|
+
}
|
|
110
|
+
if (typeof value === "object") {
|
|
111
|
+
try {
|
|
112
|
+
return JSON.stringify(value);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return String(value);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return String(value);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=rlmExecute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlmExecute.js","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmExecute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlmExecute.spec.d.ts","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmExecute.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { Type } from "@sinclair/typebox";
|
|
3
|
+
import { rlmExecute } from "./rlmExecute.js";
|
|
4
|
+
import { rlmPreambleBuild } from "./rlmPreambleBuild.js";
|
|
5
|
+
const baseTools = [
|
|
6
|
+
{
|
|
7
|
+
name: "echo",
|
|
8
|
+
description: "Echo back text.",
|
|
9
|
+
parameters: Type.Object({ text: Type.String() }, { additionalProperties: false })
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: "fail_tool",
|
|
13
|
+
description: "Always fails.",
|
|
14
|
+
parameters: Type.Object({}, { additionalProperties: false })
|
|
15
|
+
}
|
|
16
|
+
];
|
|
17
|
+
describe("rlmExecute", () => {
|
|
18
|
+
it("executes a tool call and returns final output", async () => {
|
|
19
|
+
const resolver = createResolver(async (name, args) => {
|
|
20
|
+
if (name !== "echo") {
|
|
21
|
+
throw new Error(`Unexpected tool ${name}`);
|
|
22
|
+
}
|
|
23
|
+
const payload = args;
|
|
24
|
+
return okResult(name, String(payload.text));
|
|
25
|
+
});
|
|
26
|
+
const result = await rlmExecute("value = echo('hello')\nvalue", rlmPreambleBuild(resolver.listTools()), createContext(), resolver);
|
|
27
|
+
expect(result.output).toBe("hello");
|
|
28
|
+
expect(result.toolCallCount).toBe(1);
|
|
29
|
+
expect(result.printOutput).toEqual([]);
|
|
30
|
+
});
|
|
31
|
+
it("supports chained calls and catches tool errors in python", async () => {
|
|
32
|
+
const resolver = createResolver(async (name, args) => {
|
|
33
|
+
if (name === "echo") {
|
|
34
|
+
const payload = args;
|
|
35
|
+
return okResult(name, `echo:${payload.text}`);
|
|
36
|
+
}
|
|
37
|
+
if (name === "fail_tool") {
|
|
38
|
+
return errorResult(name, "boom");
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`Unexpected tool ${name}`);
|
|
41
|
+
});
|
|
42
|
+
const code = [
|
|
43
|
+
"first = echo('one')",
|
|
44
|
+
"try:",
|
|
45
|
+
" fail_tool()",
|
|
46
|
+
"except ToolError:",
|
|
47
|
+
" pass",
|
|
48
|
+
"second = echo(first)",
|
|
49
|
+
"second"
|
|
50
|
+
].join("\n");
|
|
51
|
+
const result = await rlmExecute(code, rlmPreambleBuild(resolver.listTools()), createContext(), resolver);
|
|
52
|
+
expect(result.output).toBe("echo:echo:one");
|
|
53
|
+
expect(result.toolCallCount).toBe(3);
|
|
54
|
+
});
|
|
55
|
+
it("captures print output", async () => {
|
|
56
|
+
const resolver = createResolver(async (name) => {
|
|
57
|
+
throw new Error(`Unexpected tool ${name}`);
|
|
58
|
+
});
|
|
59
|
+
const result = await rlmExecute("print('hello', 'world')\n'done'", rlmPreambleBuild(resolver.listTools()), createContext(), resolver);
|
|
60
|
+
expect(result.output).toBe("done");
|
|
61
|
+
expect(result.printOutput).toEqual(["hello world"]);
|
|
62
|
+
expect(result.toolCallCount).toBe(0);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
function createResolver(handler) {
|
|
66
|
+
return {
|
|
67
|
+
listTools: () => baseTools,
|
|
68
|
+
execute: vi.fn(async (toolCall) => handler(toolCall.name, toolCall.arguments))
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function createContext() {
|
|
72
|
+
return {
|
|
73
|
+
connectorRegistry: null,
|
|
74
|
+
fileStore: null,
|
|
75
|
+
auth: null,
|
|
76
|
+
logger: console,
|
|
77
|
+
assistant: null,
|
|
78
|
+
permissions: {
|
|
79
|
+
workingDir: "/tmp",
|
|
80
|
+
writeDirs: [],
|
|
81
|
+
readDirs: [],
|
|
82
|
+
network: false,
|
|
83
|
+
events: false
|
|
84
|
+
},
|
|
85
|
+
agent: null,
|
|
86
|
+
source: "test",
|
|
87
|
+
messageContext: {},
|
|
88
|
+
agentSystem: null,
|
|
89
|
+
heartbeats: null
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function okResult(name, text) {
|
|
93
|
+
return {
|
|
94
|
+
toolMessage: {
|
|
95
|
+
role: "toolResult",
|
|
96
|
+
toolCallId: "1",
|
|
97
|
+
toolName: name,
|
|
98
|
+
content: [{ type: "text", text }],
|
|
99
|
+
isError: false,
|
|
100
|
+
timestamp: Date.now()
|
|
101
|
+
},
|
|
102
|
+
files: []
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function errorResult(name, text) {
|
|
106
|
+
return {
|
|
107
|
+
toolMessage: {
|
|
108
|
+
role: "toolResult",
|
|
109
|
+
toolCallId: "1",
|
|
110
|
+
toolName: name,
|
|
111
|
+
content: [{ type: "text", text }],
|
|
112
|
+
isError: true,
|
|
113
|
+
timestamp: Date.now()
|
|
114
|
+
},
|
|
115
|
+
files: []
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=rlmExecute.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlmExecute.spec.js","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmExecute.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Tool } from "@mariozechner/pi-ai";
|
|
2
|
+
type RlmParameterEntry = {
|
|
3
|
+
name: string;
|
|
4
|
+
schema: unknown;
|
|
5
|
+
required: boolean;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Builds ordered tool parameter entries for RLM Python binding.
|
|
9
|
+
* Expects: tool.parameters follows JSON schema object shape when present.
|
|
10
|
+
*/
|
|
11
|
+
export declare function rlmParameterEntriesBuild(tool: Tool): RlmParameterEntry[];
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=rlmParameterEntriesBuild.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlmParameterEntriesBuild.d.ts","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmParameterEntriesBuild.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,IAAI,GAAG,iBAAiB,EAAE,CAsBxE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds ordered tool parameter entries for RLM Python binding.
|
|
3
|
+
* Expects: tool.parameters follows JSON schema object shape when present.
|
|
4
|
+
*/
|
|
5
|
+
export function rlmParameterEntriesBuild(tool) {
|
|
6
|
+
const parameters = parametersSchemaResolve(tool);
|
|
7
|
+
const properties = propertiesSchemaResolve(parameters.properties);
|
|
8
|
+
const required = new Set(requiredListResolve(parameters.required));
|
|
9
|
+
const requiredEntries = [];
|
|
10
|
+
const optionalEntries = [];
|
|
11
|
+
for (const [name, schema] of Object.entries(properties)) {
|
|
12
|
+
if (!pythonIdentifierIs(name)) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
if (required.has(name)) {
|
|
16
|
+
requiredEntries.push({ name, schema, required: true });
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
optionalEntries.push({ name, schema, required: false });
|
|
20
|
+
}
|
|
21
|
+
return [...requiredEntries, ...optionalEntries];
|
|
22
|
+
}
|
|
23
|
+
function parametersSchemaResolve(tool) {
|
|
24
|
+
const schema = tool.parameters;
|
|
25
|
+
if (!recordIs(schema)) {
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
properties: recordIs(schema.properties) ? schema.properties : undefined,
|
|
30
|
+
required: schema.required
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function propertiesSchemaResolve(value) {
|
|
34
|
+
if (!recordIs(value)) {
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
function requiredListResolve(value) {
|
|
40
|
+
if (!Array.isArray(value)) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
return value.filter((entry) => typeof entry === "string");
|
|
44
|
+
}
|
|
45
|
+
function pythonIdentifierIs(value) {
|
|
46
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
|
|
47
|
+
}
|
|
48
|
+
function recordIs(value) {
|
|
49
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=rlmParameterEntriesBuild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlmParameterEntriesBuild.js","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmParameterEntriesBuild.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAU;IACjD,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,uBAAuB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEnE,MAAM,eAAe,GAAwB,EAAE,CAAC;IAChD,MAAM,eAAe,GAAwB,EAAE,CAAC;IAEhD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,SAAS;QACX,CAAC;QAED,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,GAAG,eAAe,EAAE,GAAG,eAAe,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAU;IAIzC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAqB,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACvE,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;IAC7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Tool } from "@mariozechner/pi-ai";
|
|
2
|
+
/**
|
|
3
|
+
* Builds a Python preamble containing synchronous tool stubs for the current tool surface.
|
|
4
|
+
* Expects: tool names are unique and come from ToolResolver.listTools().
|
|
5
|
+
*/
|
|
6
|
+
export declare function rlmPreambleBuild(tools: Tool[]): string;
|
|
7
|
+
//# sourceMappingURL=rlmPreambleBuild.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rlmPreambleBuild.d.ts","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmPreambleBuild.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAKhD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CA0CtD"}
|