daycare-cli 0.0.12 → 0.0.13

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.
Files changed (68) hide show
  1. package/dist/config/configResolve.d.ts.map +1 -1
  2. package/dist/config/configResolve.js +2 -0
  3. package/dist/config/configResolve.js.map +1 -1
  4. package/dist/config/configResolve.spec.js +10 -0
  5. package/dist/config/configResolve.spec.js.map +1 -1
  6. package/dist/config/configSettingsParse.d.ts.map +1 -1
  7. package/dist/config/configSettingsParse.js +1 -0
  8. package/dist/config/configSettingsParse.js.map +1 -1
  9. package/dist/config/configTypes.d.ts +1 -0
  10. package/dist/config/configTypes.d.ts.map +1 -1
  11. package/dist/engine/agents/agent.d.ts.map +1 -1
  12. package/dist/engine/agents/agent.js +1 -0
  13. package/dist/engine/agents/agent.js.map +1 -1
  14. package/dist/engine/engine.d.ts.map +1 -1
  15. package/dist/engine/engine.js +5 -0
  16. package/dist/engine/engine.js.map +1 -1
  17. package/dist/engine/engine.spec.js +16 -0
  18. package/dist/engine/engine.spec.js.map +1 -1
  19. package/dist/engine/modules/rlm/rlmConstants.d.ts +3 -0
  20. package/dist/engine/modules/rlm/rlmConstants.d.ts.map +1 -0
  21. package/dist/engine/modules/rlm/rlmConstants.js +3 -0
  22. package/dist/engine/modules/rlm/rlmConstants.js.map +1 -0
  23. package/dist/engine/modules/rlm/rlmConvert.d.ts +14 -0
  24. package/dist/engine/modules/rlm/rlmConvert.d.ts.map +1 -0
  25. package/dist/engine/modules/rlm/rlmConvert.js +81 -0
  26. package/dist/engine/modules/rlm/rlmConvert.js.map +1 -0
  27. package/dist/engine/modules/rlm/rlmConvert.spec.d.ts +2 -0
  28. package/dist/engine/modules/rlm/rlmConvert.spec.d.ts.map +1 -0
  29. package/dist/engine/modules/rlm/rlmConvert.spec.js +71 -0
  30. package/dist/engine/modules/rlm/rlmConvert.spec.js.map +1 -0
  31. package/dist/engine/modules/rlm/rlmExecute.d.ts +13 -0
  32. package/dist/engine/modules/rlm/rlmExecute.d.ts.map +1 -0
  33. package/dist/engine/modules/rlm/rlmExecute.js +120 -0
  34. package/dist/engine/modules/rlm/rlmExecute.js.map +1 -0
  35. package/dist/engine/modules/rlm/rlmExecute.spec.d.ts +2 -0
  36. package/dist/engine/modules/rlm/rlmExecute.spec.d.ts.map +1 -0
  37. package/dist/engine/modules/rlm/rlmExecute.spec.js +118 -0
  38. package/dist/engine/modules/rlm/rlmExecute.spec.js.map +1 -0
  39. package/dist/engine/modules/rlm/rlmPreambleBuild.d.ts +7 -0
  40. package/dist/engine/modules/rlm/rlmPreambleBuild.d.ts.map +1 -0
  41. package/dist/engine/modules/rlm/rlmPreambleBuild.js +148 -0
  42. package/dist/engine/modules/rlm/rlmPreambleBuild.js.map +1 -0
  43. package/dist/engine/modules/rlm/rlmPreambleBuild.spec.d.ts +2 -0
  44. package/dist/engine/modules/rlm/rlmPreambleBuild.spec.d.ts.map +1 -0
  45. package/dist/engine/modules/rlm/rlmPreambleBuild.spec.js +47 -0
  46. package/dist/engine/modules/rlm/rlmPreambleBuild.spec.js.map +1 -0
  47. package/dist/engine/modules/rlm/rlmTool.d.ts +8 -0
  48. package/dist/engine/modules/rlm/rlmTool.d.ts.map +1 -0
  49. package/dist/engine/modules/rlm/rlmTool.js +67 -0
  50. package/dist/engine/modules/rlm/rlmTool.js.map +1 -0
  51. package/dist/engine/modules/rlm/rlmTool.spec.d.ts +2 -0
  52. package/dist/engine/modules/rlm/rlmTool.spec.d.ts.map +1 -0
  53. package/dist/engine/modules/rlm/rlmTool.spec.js +107 -0
  54. package/dist/engine/modules/rlm/rlmTool.spec.js.map +1 -0
  55. package/dist/engine/modules/rlm/rlmToolDescriptionBuild.d.ts +7 -0
  56. package/dist/engine/modules/rlm/rlmToolDescriptionBuild.d.ts.map +1 -0
  57. package/dist/engine/modules/rlm/rlmToolDescriptionBuild.js +22 -0
  58. package/dist/engine/modules/rlm/rlmToolDescriptionBuild.js.map +1 -0
  59. package/dist/engine/modules/tools/toolListContextBuild.d.ts +1 -0
  60. package/dist/engine/modules/tools/toolListContextBuild.d.ts.map +1 -1
  61. package/dist/engine/modules/tools/toolListContextBuild.js +17 -0
  62. package/dist/engine/modules/tools/toolListContextBuild.js.map +1 -1
  63. package/dist/engine/modules/tools/toolListContextBuild.spec.js +16 -0
  64. package/dist/engine/modules/tools/toolListContextBuild.spec.js.map +1 -1
  65. package/dist/settings.d.ts +1 -0
  66. package/dist/settings.d.ts.map +1 -1
  67. package/dist/settings.js.map +1 -1
  68. package/package.json +2 -2
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Converts Monty positional/keyword arguments into the JSON object expected by tool execution.
3
+ * Expects: positional argument order matches tool parameter property order.
4
+ */
5
+ export function rlmArgsConvert(args, kwargs, toolSchema) {
6
+ const propertyNames = toolParameterNamesResolve(toolSchema);
7
+ const output = {};
8
+ for (let index = 0; index < args.length; index += 1) {
9
+ const name = propertyNames[index];
10
+ if (!name) {
11
+ throw new Error(`Too many positional arguments for tool ${toolSchema.name}.`);
12
+ }
13
+ output[name] = montyValueConvert(args[index]);
14
+ }
15
+ const convertedKwargs = montyValueConvert(kwargs);
16
+ if (!recordIs(convertedKwargs)) {
17
+ throw new Error("Tool kwargs must convert to an object.");
18
+ }
19
+ for (const [name, value] of Object.entries(convertedKwargs)) {
20
+ output[name] = value;
21
+ }
22
+ return output;
23
+ }
24
+ /**
25
+ * Converts a tool execution result into a Python-friendly string value.
26
+ * Expects: tool result content follows the ToolResultMessage text block convention.
27
+ */
28
+ export function rlmResultConvert(toolResult) {
29
+ const text = toolResult.toolMessage.content
30
+ .filter((part) => part.type === "text")
31
+ .map((part) => ("text" in part && typeof part.text === "string" ? part.text : ""))
32
+ .join("\n")
33
+ .trim();
34
+ if (text.length > 0) {
35
+ return text;
36
+ }
37
+ if (toolResult.toolMessage.isError) {
38
+ return "Tool execution failed.";
39
+ }
40
+ return "";
41
+ }
42
+ function toolParameterNamesResolve(tool) {
43
+ if (!recordIs(tool.parameters)) {
44
+ return [];
45
+ }
46
+ const properties = tool.parameters.properties;
47
+ if (!recordIs(properties)) {
48
+ return [];
49
+ }
50
+ return Object.keys(properties);
51
+ }
52
+ function montyValueConvert(value) {
53
+ if (typeof value === "bigint") {
54
+ if (value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER)) {
55
+ return Number(value);
56
+ }
57
+ return value.toString();
58
+ }
59
+ if (value instanceof Map) {
60
+ const result = {};
61
+ for (const [key, item] of value.entries()) {
62
+ result[String(key)] = montyValueConvert(item);
63
+ }
64
+ return result;
65
+ }
66
+ if (Array.isArray(value)) {
67
+ return value.map((entry) => montyValueConvert(entry));
68
+ }
69
+ if (!recordIs(value)) {
70
+ return value;
71
+ }
72
+ const result = {};
73
+ for (const [key, entry] of Object.entries(value)) {
74
+ result[key] = montyValueConvert(entry);
75
+ }
76
+ return result;
77
+ }
78
+ function recordIs(value) {
79
+ return typeof value === "object" && value !== null && !Array.isArray(value);
80
+ }
81
+ //# sourceMappingURL=rlmConvert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rlmConvert.js","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmConvert.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAqB,EACrB,MAAqC,EACrC,UAAgB;IAEhB,MAAM,aAAa,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,0CAA0C,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAA+B;IAC9D,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO;SACxC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;SACtC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACjF,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;IAEV,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACnC,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAU;IAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;IAC9C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACzF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rlmConvert.spec.d.ts.map
@@ -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,71 @@
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 schema property 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("merges kwargs and lets kwargs override positional args", () => {
22
+ const converted = rlmArgsConvert(["/tmp/a.txt", "hello"], { content: "override" }, tool);
23
+ expect(converted).toEqual({
24
+ path: "/tmp/a.txt",
25
+ content: "override"
26
+ });
27
+ });
28
+ it("converts nested Monty map and bigint values", () => {
29
+ const converted = rlmArgsConvert(["/tmp/a.txt", new Map([["count", BigInt(3)]])], {}, tool);
30
+ expect(converted).toEqual({
31
+ path: "/tmp/a.txt",
32
+ content: {
33
+ count: 3
34
+ }
35
+ });
36
+ });
37
+ });
38
+ describe("rlmResultConvert", () => {
39
+ it("returns joined text content", () => {
40
+ const result = {
41
+ toolMessage: {
42
+ role: "toolResult",
43
+ toolCallId: "1",
44
+ toolName: "x",
45
+ content: [
46
+ { type: "text", text: "hello" },
47
+ { type: "text", text: "world" }
48
+ ],
49
+ isError: false,
50
+ timestamp: Date.now()
51
+ },
52
+ files: []
53
+ };
54
+ expect(rlmResultConvert(result)).toBe("hello\nworld");
55
+ });
56
+ it("returns fallback error text for empty error payloads", () => {
57
+ const result = {
58
+ toolMessage: {
59
+ role: "toolResult",
60
+ toolCallId: "1",
61
+ toolName: "x",
62
+ content: [],
63
+ isError: true,
64
+ timestamp: Date.now()
65
+ },
66
+ files: []
67
+ };
68
+ expect(rlmResultConvert(result)).toBe("Tool execution failed.");
69
+ });
70
+ });
71
+ //# 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,IAAI,CAAC,MAAM,CACrB;YACE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;YACnB,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;SACnC,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAChC;KACiB,CAAC;IAErB,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAEpE,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC;QAEzF,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,UAAU;SACpB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,SAAS,GAAG,cAAc,CAC9B,CAAC,YAAY,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC/C,EAAE,EACF,IAAI,CACL,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YACxB,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE;gBACP,KAAK,EAAE,CAAC;aACT;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAwB;YAClC,WAAW,EAAE;gBACX,IAAI,EAAE,YAAY;gBAClB,UAAU,EAAE,GAAG;gBACf,QAAQ,EAAE,GAAG;gBACb,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;oBAC/B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;iBAChC;gBACD,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB;YACD,KAAK,EAAE,EAAE;SACV,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAwB;YAClC,WAAW,EAAE;gBACX,IAAI,EAAE,YAAY;gBAClB,UAAU,EAAE,GAAG;gBACf,QAAQ,EAAE,GAAG;gBACb,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB;YACD,KAAK,EAAE,EAAE;SACV,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rlmExecute.spec.d.ts.map
@@ -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,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;AAIhD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CA0CtD"}
@@ -0,0 +1,148 @@
1
+ import { RLM_PRINT_FUNCTION_NAME, RLM_TOOL_NAME } from "./rlmConstants.js";
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 function rlmPreambleBuild(tools) {
7
+ const lines = [
8
+ "# You have the following tools available as Python functions.",
9
+ "# Call tool functions directly (no await).",
10
+ "# Tool failures raise ToolError (alias of RuntimeError).",
11
+ "# Use print() for debug logs; the last expression is returned.",
12
+ "",
13
+ "from typing import Any",
14
+ "",
15
+ "ToolError = RuntimeError",
16
+ "",
17
+ "# Typed tool stubs for code assistance only (not executed).",
18
+ "if False:",
19
+ ` def ${RLM_PRINT_FUNCTION_NAME}(*values: Any) -> None:`,
20
+ " ...",
21
+ ""
22
+ ];
23
+ let stubCount = 0;
24
+ for (const tool of tools) {
25
+ if (tool.name === RLM_TOOL_NAME) {
26
+ continue;
27
+ }
28
+ if (!pythonIdentifierIs(tool.name)) {
29
+ continue;
30
+ }
31
+ stubCount += 1;
32
+ const signature = pythonSignatureBuild(tool);
33
+ const description = pythonDocstringEscape(tool.description?.trim() || "No description.");
34
+ lines.push(` def ${tool.name}(${signature}) -> str:`);
35
+ lines.push(` \"\"\"${description}\"\"\"`);
36
+ lines.push(" ...");
37
+ lines.push("");
38
+ }
39
+ if (stubCount === 0) {
40
+ lines.push(" pass");
41
+ }
42
+ return lines.join("\n").trimEnd();
43
+ }
44
+ function pythonSignatureBuild(tool) {
45
+ const parameters = parametersSchemaResolve(tool);
46
+ const properties = propertiesSchemaResolve(parameters.properties);
47
+ const required = new Set(requiredListResolve(parameters.required));
48
+ const entries = [];
49
+ for (const [name, schema] of Object.entries(properties)) {
50
+ if (!pythonIdentifierIs(name)) {
51
+ continue;
52
+ }
53
+ const typeHint = pythonTypeFromSchema(schema);
54
+ if (required.has(name)) {
55
+ entries.push(`${name}: ${typeHint}`);
56
+ continue;
57
+ }
58
+ entries.push(`${name}: ${typeHint} | None = None`);
59
+ }
60
+ return entries.join(", ");
61
+ }
62
+ function parametersSchemaResolve(tool) {
63
+ const schema = tool.parameters;
64
+ if (!recordIs(schema)) {
65
+ return {};
66
+ }
67
+ return {
68
+ properties: recordIs(schema.properties) ? schema.properties : undefined,
69
+ required: schema.required
70
+ };
71
+ }
72
+ function propertiesSchemaResolve(value) {
73
+ if (!recordIs(value)) {
74
+ return {};
75
+ }
76
+ return value;
77
+ }
78
+ function requiredListResolve(value) {
79
+ if (!Array.isArray(value)) {
80
+ return [];
81
+ }
82
+ return value.filter((entry) => typeof entry === "string");
83
+ }
84
+ function pythonTypeFromSchema(schema) {
85
+ if (!recordIs(schema)) {
86
+ return "Any";
87
+ }
88
+ const anyOf = schema.anyOf;
89
+ if (Array.isArray(anyOf) && anyOf.length > 0) {
90
+ const union = anyOf
91
+ .map((candidate) => pythonTypeFromSchema(candidate))
92
+ .filter((candidate, index, all) => all.indexOf(candidate) === index);
93
+ return union.length > 0 ? union.join(" | ") : "Any";
94
+ }
95
+ const oneOf = schema.oneOf;
96
+ if (Array.isArray(oneOf) && oneOf.length > 0) {
97
+ const union = oneOf
98
+ .map((candidate) => pythonTypeFromSchema(candidate))
99
+ .filter((candidate, index, all) => all.indexOf(candidate) === index);
100
+ return union.length > 0 ? union.join(" | ") : "Any";
101
+ }
102
+ const type = schema.type;
103
+ if (typeof type === "string") {
104
+ if (type === "string") {
105
+ return "str";
106
+ }
107
+ if (type === "integer") {
108
+ return "int";
109
+ }
110
+ if (type === "number") {
111
+ return "float";
112
+ }
113
+ if (type === "boolean") {
114
+ return "bool";
115
+ }
116
+ if (type === "null") {
117
+ return "None";
118
+ }
119
+ if (type === "array") {
120
+ return `list[${pythonTypeFromSchema(schema.items)}]`;
121
+ }
122
+ if (type === "object") {
123
+ const additional = schema.additionalProperties;
124
+ if (additional === false) {
125
+ return "dict[str, Any]";
126
+ }
127
+ return "dict[str, Any]";
128
+ }
129
+ }
130
+ if (Array.isArray(type) && type.length > 0) {
131
+ const union = type
132
+ .filter((entry) => typeof entry === "string")
133
+ .map((entry) => pythonTypeFromSchema({ type: entry }))
134
+ .filter((candidate, index, all) => all.indexOf(candidate) === index);
135
+ return union.length > 0 ? union.join(" | ") : "Any";
136
+ }
137
+ return "Any";
138
+ }
139
+ function pythonIdentifierIs(value) {
140
+ return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
141
+ }
142
+ function pythonDocstringEscape(value) {
143
+ return value.replace(/\"\"\"/g, '\\"\\"\\"');
144
+ }
145
+ function recordIs(value) {
146
+ return typeof value === "object" && value !== null && !Array.isArray(value);
147
+ }
148
+ //# sourceMappingURL=rlmPreambleBuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rlmPreambleBuild.js","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmPreambleBuild.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rlmPreambleBuild.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rlmPreambleBuild.spec.d.ts","sourceRoot":"","sources":["../../../../sources/engine/modules/rlm/rlmPreambleBuild.spec.ts"],"names":[],"mappings":""}