open-agents-ai 0.61.0 → 0.62.0

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 (162) hide show
  1. package/dist/args.d.ts +3 -0
  2. package/dist/args.d.ts.map +1 -0
  3. package/dist/args.js +51 -0
  4. package/dist/args.js.map +1 -0
  5. package/dist/bin.d.ts +3 -0
  6. package/dist/bin.d.ts.map +1 -0
  7. package/dist/bin.js +7 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/cli.d.ts +5 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +39 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/commands/config.d.ts +32 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +188 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/eval.d.ts +33 -0
  18. package/dist/commands/eval.d.ts.map +1 -0
  19. package/dist/commands/eval.js +211 -0
  20. package/dist/commands/eval.js.map +1 -0
  21. package/dist/commands/index-repo.d.ts +16 -0
  22. package/dist/commands/index-repo.d.ts.map +1 -0
  23. package/dist/commands/index-repo.js +84 -0
  24. package/dist/commands/index-repo.js.map +1 -0
  25. package/dist/commands/run.d.ts +25 -0
  26. package/dist/commands/run.d.ts.map +1 -0
  27. package/dist/commands/run.js +36 -0
  28. package/dist/commands/run.js.map +1 -0
  29. package/dist/commands/serve.d.ts +34 -0
  30. package/dist/commands/serve.d.ts.map +1 -0
  31. package/dist/commands/serve.js +195 -0
  32. package/dist/commands/serve.js.map +1 -0
  33. package/dist/commands/status.d.ts +14 -0
  34. package/dist/commands/status.d.ts.map +1 -0
  35. package/dist/commands/status.js +186 -0
  36. package/dist/commands/status.js.map +1 -0
  37. package/dist/config.d.ts +49 -0
  38. package/dist/config.d.ts.map +1 -0
  39. package/dist/config.js +150 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/index.d.ts +59 -6
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +252 -37730
  44. package/dist/index.js.map +1 -0
  45. package/dist/open-agents-bin +11 -0
  46. package/dist/tui/bless-engine.d.ts +53 -0
  47. package/dist/tui/bless-engine.d.ts.map +1 -0
  48. package/dist/tui/bless-engine.js +158 -0
  49. package/dist/tui/bless-engine.js.map +1 -0
  50. package/dist/tui/braille-spinner.d.ts +83 -0
  51. package/dist/tui/braille-spinner.d.ts.map +1 -0
  52. package/dist/tui/braille-spinner.js +288 -0
  53. package/dist/tui/braille-spinner.js.map +1 -0
  54. package/dist/tui/call-agent.d.ts +78 -0
  55. package/dist/tui/call-agent.d.ts.map +1 -0
  56. package/dist/tui/call-agent.js +299 -0
  57. package/dist/tui/call-agent.js.map +1 -0
  58. package/dist/tui/carousel-descriptors.d.ts +46 -0
  59. package/dist/tui/carousel-descriptors.d.ts.map +1 -0
  60. package/dist/tui/carousel-descriptors.js +367 -0
  61. package/dist/tui/carousel-descriptors.js.map +1 -0
  62. package/dist/tui/carousel.d.ts +53 -0
  63. package/dist/tui/carousel.d.ts.map +1 -0
  64. package/dist/tui/carousel.js +315 -0
  65. package/dist/tui/carousel.js.map +1 -0
  66. package/dist/tui/commands.d.ts +147 -0
  67. package/dist/tui/commands.d.ts.map +1 -0
  68. package/dist/tui/commands.js +1140 -0
  69. package/dist/tui/commands.js.map +1 -0
  70. package/dist/tui/dmn-engine.d.ts +199 -0
  71. package/dist/tui/dmn-engine.d.ts.map +1 -0
  72. package/dist/tui/dmn-engine.js +982 -0
  73. package/dist/tui/dmn-engine.js.map +1 -0
  74. package/dist/tui/dream-engine.d.ts +133 -0
  75. package/dist/tui/dream-engine.d.ts.map +1 -0
  76. package/dist/tui/dream-engine.js +1358 -0
  77. package/dist/tui/dream-engine.js.map +1 -0
  78. package/dist/tui/edit-history.d.ts +38 -0
  79. package/dist/tui/edit-history.d.ts.map +1 -0
  80. package/dist/tui/edit-history.js +140 -0
  81. package/dist/tui/edit-history.js.map +1 -0
  82. package/dist/tui/emotion-engine.d.ts +100 -0
  83. package/dist/tui/emotion-engine.d.ts.map +1 -0
  84. package/dist/tui/emotion-engine.js +334 -0
  85. package/dist/tui/emotion-engine.js.map +1 -0
  86. package/dist/tui/index.d.ts +7 -0
  87. package/dist/tui/index.d.ts.map +1 -0
  88. package/dist/tui/index.js +5 -0
  89. package/dist/tui/index.js.map +1 -0
  90. package/dist/tui/interactive.d.ts +12 -0
  91. package/dist/tui/interactive.d.ts.map +1 -0
  92. package/dist/tui/interactive.js +2723 -0
  93. package/dist/tui/interactive.js.map +1 -0
  94. package/dist/tui/listen.d.ts +128 -0
  95. package/dist/tui/listen.d.ts.map +1 -0
  96. package/dist/tui/listen.js +752 -0
  97. package/dist/tui/listen.js.map +1 -0
  98. package/dist/tui/model-picker.d.ts +55 -0
  99. package/dist/tui/model-picker.d.ts.map +1 -0
  100. package/dist/tui/model-picker.js +283 -0
  101. package/dist/tui/model-picker.js.map +1 -0
  102. package/dist/tui/oa-directory.d.ts +181 -0
  103. package/dist/tui/oa-directory.d.ts.map +1 -0
  104. package/dist/tui/oa-directory.js +500 -0
  105. package/dist/tui/oa-directory.js.map +1 -0
  106. package/dist/tui/project-context.d.ts +99 -0
  107. package/dist/tui/project-context.d.ts.map +1 -0
  108. package/dist/tui/project-context.js +377 -0
  109. package/dist/tui/project-context.js.map +1 -0
  110. package/dist/tui/render.d.ts +102 -0
  111. package/dist/tui/render.d.ts.map +1 -0
  112. package/dist/tui/render.js +883 -0
  113. package/dist/tui/render.js.map +1 -0
  114. package/dist/tui/setup.d.ts +99 -0
  115. package/dist/tui/setup.d.ts.map +1 -0
  116. package/dist/tui/setup.js +1349 -0
  117. package/dist/tui/setup.js.map +1 -0
  118. package/dist/tui/snr-engine.d.ts +115 -0
  119. package/dist/tui/snr-engine.d.ts.map +1 -0
  120. package/dist/tui/snr-engine.js +440 -0
  121. package/dist/tui/snr-engine.js.map +1 -0
  122. package/dist/tui/status-bar.d.ts +312 -0
  123. package/dist/tui/status-bar.d.ts.map +1 -0
  124. package/dist/tui/status-bar.js +1042 -0
  125. package/dist/tui/status-bar.js.map +1 -0
  126. package/dist/tui/stream-renderer.d.ts +106 -0
  127. package/dist/tui/stream-renderer.d.ts.map +1 -0
  128. package/dist/tui/stream-renderer.js +562 -0
  129. package/dist/tui/stream-renderer.js.map +1 -0
  130. package/dist/tui/telegram-bridge.d.ts +220 -0
  131. package/dist/tui/telegram-bridge.d.ts.map +1 -0
  132. package/dist/tui/telegram-bridge.js +1274 -0
  133. package/dist/tui/telegram-bridge.js.map +1 -0
  134. package/dist/tui/tool-policy.d.ts +57 -0
  135. package/dist/tui/tool-policy.d.ts.map +1 -0
  136. package/dist/tui/tool-policy.js +189 -0
  137. package/dist/tui/tool-policy.js.map +1 -0
  138. package/dist/tui/voice-session.d.ts +118 -0
  139. package/dist/tui/voice-session.d.ts.map +1 -0
  140. package/dist/tui/voice-session.js +846 -0
  141. package/dist/tui/voice-session.js.map +1 -0
  142. package/dist/tui/voice.d.ts +126 -0
  143. package/dist/tui/voice.d.ts.map +1 -0
  144. package/dist/tui/voice.js +1435 -0
  145. package/dist/tui/voice.js.map +1 -0
  146. package/dist/types.d.ts +10 -0
  147. package/dist/types.d.ts.map +1 -0
  148. package/dist/types.js +9 -0
  149. package/dist/types.js.map +1 -0
  150. package/dist/ui/output.d.ts +36 -0
  151. package/dist/ui/output.d.ts.map +1 -0
  152. package/dist/ui/output.js +117 -0
  153. package/dist/ui/output.js.map +1 -0
  154. package/dist/ui/spinner.d.ts +30 -0
  155. package/dist/ui/spinner.d.ts.map +1 -0
  156. package/dist/ui/spinner.js +106 -0
  157. package/dist/ui/spinner.js.map +1 -0
  158. package/dist/updater.d.ts +42 -0
  159. package/dist/updater.d.ts.map +1 -0
  160. package/dist/updater.js +165 -0
  161. package/dist/updater.js.map +1 -0
  162. package/package.json +1 -1
package/dist/args.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { CliOptions } from "./types.js";
2
+ export declare function parseArgs(argv: string[]): CliOptions;
3
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAgCpD"}
package/dist/args.js ADDED
@@ -0,0 +1,51 @@
1
+ import { parseArgs as nodeParseArgs } from "node:util";
2
+ import { DEFAULT_OPTIONS } from "./types.js";
3
+ export function parseArgs(argv) {
4
+ const { values } = nodeParseArgs({
5
+ args: argv.slice(2),
6
+ options: {
7
+ model: { type: "string", short: "m" },
8
+ "backend-url": { type: "string", short: "b" },
9
+ "project-root": { type: "string", short: "p" },
10
+ "max-iterations": { type: "string", short: "i" },
11
+ temperature: { type: "string", short: "t" },
12
+ verbose: { type: "boolean", short: "v" },
13
+ help: { type: "boolean", short: "h" },
14
+ },
15
+ allowPositionals: true,
16
+ });
17
+ if (values.help) {
18
+ printHelp();
19
+ process.exit(0);
20
+ }
21
+ return {
22
+ model: values.model ?? DEFAULT_OPTIONS.model,
23
+ backendUrl: values["backend-url"] ?? DEFAULT_OPTIONS.backendUrl,
24
+ projectRoot: values["project-root"] ?? DEFAULT_OPTIONS.projectRoot,
25
+ maxIterations: values["max-iterations"]
26
+ ? parseInt(values["max-iterations"], 10)
27
+ : DEFAULT_OPTIONS.maxIterations,
28
+ temperature: values.temperature
29
+ ? parseFloat(values.temperature)
30
+ : DEFAULT_OPTIONS.temperature,
31
+ verbose: values.verbose ?? DEFAULT_OPTIONS.verbose,
32
+ };
33
+ }
34
+ function printHelp() {
35
+ const help = `
36
+ open-agent - AI coding assistant powered by open-source models
37
+
38
+ Usage: open-agent [options] [prompt]
39
+
40
+ Options:
41
+ -m, --model <name> Model name (default: qwen-2.5-coder-32b)
42
+ -b, --backend-url <url> vLLM backend URL (default: http://localhost:8000/v1)
43
+ -p, --project-root <path> Project root directory (default: cwd)
44
+ -i, --max-iterations <n> Max agent loop iterations (default: 25)
45
+ -t, --temperature <float> Sampling temperature (default: 0.0)
46
+ -v, --verbose Enable verbose output
47
+ -h, --help Show this help message
48
+ `;
49
+ console.log(help.trim());
50
+ }
51
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC;QAC/B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACnB,OAAO,EAAE;YACP,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YACrC,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YAC7C,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YAC9C,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YAChD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YAC3C,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;YACxC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;SACtC;QACD,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO;QACL,KAAK,EAAG,MAAM,CAAC,KAAgB,IAAI,eAAe,CAAC,KAAK;QACxD,UAAU,EAAG,MAAM,CAAC,aAAa,CAAY,IAAI,eAAe,CAAC,UAAU;QAC3E,WAAW,EAAG,MAAM,CAAC,cAAc,CAAY,IAAI,eAAe,CAAC,WAAW;QAC9E,aAAa,EAAE,MAAM,CAAC,gBAAgB,CAAC;YACrC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAW,EAAE,EAAE,CAAC;YAClD,CAAC,CAAC,eAAe,CAAC,aAAa;QACjC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC7B,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,WAAqB,CAAC;YAC1C,CAAC,CAAC,eAAe,CAAC,WAAW;QAC/B,OAAO,EAAG,MAAM,CAAC,OAAmB,IAAI,eAAe,CAAC,OAAO;KAChE,CAAC;AACJ,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG;;;;;;;;;;;;;CAad,CAAC;IACA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3B,CAAC"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from "./args.js";
3
+ import { createCli } from "./cli.js";
4
+ const options = parseArgs(process.argv);
5
+ const cli = createCli(options);
6
+ await cli.start();
7
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACxC,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;AAC/B,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { CliOptions } from "./types.js";
2
+ export declare function createCli(options: CliOptions): {
3
+ start: () => Promise<void>;
4
+ };
5
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG;IAC9C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CA0CA"}
package/dist/cli.js ADDED
@@ -0,0 +1,39 @@
1
+ import { createInterface } from "node:readline";
2
+ export function createCli(options) {
3
+ return {
4
+ async start() {
5
+ console.log(`open-agent v0.1.0`);
6
+ console.log(`Model: ${options.model}`);
7
+ console.log(`Backend: ${options.backendUrl}`);
8
+ console.log(`Project: ${options.projectRoot}`);
9
+ console.log("");
10
+ const rl = createInterface({
11
+ input: process.stdin,
12
+ output: process.stdout,
13
+ prompt: "> ",
14
+ });
15
+ rl.prompt();
16
+ rl.on("line", async (line) => {
17
+ const input = line.trim();
18
+ if (!input) {
19
+ rl.prompt();
20
+ return;
21
+ }
22
+ if (input === "exit" || input === "quit") {
23
+ console.log("Goodbye.");
24
+ rl.close();
25
+ return;
26
+ }
27
+ // TODO: Wire up to AgentLoop when orchestrator is ready
28
+ console.log(`[agent] Processing: "${input}"`);
29
+ console.log("[agent] Agent loop not yet connected.");
30
+ console.log("");
31
+ rl.prompt();
32
+ });
33
+ rl.on("close", () => {
34
+ process.exit(0);
35
+ });
36
+ },
37
+ };
38
+ }
39
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,UAAU,SAAS,CAAC,OAAmB;IAG3C,OAAO;QACL,KAAK,CAAC,KAAK;YACT,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,MAAM,EAAE,GAAG,eAAe,CAAC;gBACzB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,IAAI;aACb,CAAC,CAAC;YAEH,EAAE,CAAC,MAAM,EAAE,CAAC;YAEZ,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,EAAE,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO;gBACT,CAAC;gBAED,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;oBACzC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBACxB,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO;gBACT,CAAC;gBAED,wDAAwD;gBACxD,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,EAAE,CAAC,MAAM,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * commands/config.ts
3
+ *
4
+ * Show or modify the agent configuration.
5
+ *
6
+ * Usage:
7
+ * open-agents config # show current config
8
+ * open-agents config set KEY VALUE # set global config
9
+ * open-agents config set KEY VALUE --local # set project-local override
10
+ * open-agents config keys # list settable keys
11
+ *
12
+ * Priority chain (highest → lowest):
13
+ * 1. CLI flags
14
+ * 2. Project-local .oa/settings.json (--local)
15
+ * 3. Global ~/.open-agents/settings.json
16
+ * 4. Environment variables
17
+ * 5. Global ~/.open-agents/config.json
18
+ * 6. Built-in defaults
19
+ */
20
+ import type { AgentConfig } from "../config.js";
21
+ export interface ConfigOptions {
22
+ subCommand?: string;
23
+ key?: string;
24
+ value?: string;
25
+ verbose?: boolean;
26
+ /** When true, writes to .oa/settings.json (project-local) */
27
+ local?: boolean;
28
+ /** Repository/project path (default: cwd) */
29
+ repoPath?: string;
30
+ }
31
+ export declare function configCommand(opts: ConfigOptions, config: AgentConfig): Promise<void>;
32
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAwBhD,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkDD,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3F"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * commands/config.ts
3
+ *
4
+ * Show or modify the agent configuration.
5
+ *
6
+ * Usage:
7
+ * open-agents config # show current config
8
+ * open-agents config set KEY VALUE # set global config
9
+ * open-agents config set KEY VALUE --local # set project-local override
10
+ * open-agents config keys # list settable keys
11
+ *
12
+ * Priority chain (highest → lowest):
13
+ * 1. CLI flags
14
+ * 2. Project-local .oa/settings.json (--local)
15
+ * 3. Global ~/.open-agents/settings.json
16
+ * 4. Environment variables
17
+ * 5. Global ~/.open-agents/config.json
18
+ * 6. Built-in defaults
19
+ */
20
+ import { join, resolve } from "node:path";
21
+ import { homedir } from "node:os";
22
+ import { cwd } from "node:process";
23
+ import { setConfigValue } from "../config.js";
24
+ import { initOaDirectory, loadProjectSettings, saveProjectSettings, loadGlobalSettings, resolveSettings, } from "../tui/oa-directory.js";
25
+ import { printHeader, printSection, printKeyValue, printSuccess, printError, printInfo, printWarning, } from "../ui/output.js";
26
+ // ---------------------------------------------------------------------------
27
+ // Allowlist of settable config keys and their descriptions
28
+ // ---------------------------------------------------------------------------
29
+ const CONFIG_KEYS = {
30
+ backendUrl: "Backend base URL (Ollama or OpenAI-compatible)",
31
+ backendType: "Backend type: ollama, vllm, fake",
32
+ model: "Model name to use",
33
+ apiKey: "Bearer token for authenticated deployments",
34
+ maxRetries: "Maximum HTTP retries (integer)",
35
+ timeoutMs: "Per-request timeout in milliseconds (integer)",
36
+ dryRun: "Dry-run mode - patches not written (true/false)",
37
+ verbose: "Verbose output (true/false)",
38
+ dbPath: "Path to SQLite memory database",
39
+ voice: "Enable TTS voice feedback (true/false)",
40
+ voiceModel: "TTS voice model: glados, overwatch",
41
+ stream: "Enable real-time token streaming with pastel syntax highlighting (true/false)",
42
+ bruteforce: "Brute-force mode: auto re-engage agent when turn limit hit (true/false)",
43
+ };
44
+ // Keys that contain secrets — must be redacted in all display output
45
+ const SENSITIVE_KEYS = new Set(["apiKey", "api_key", "secret", "password", "token"]);
46
+ /** Redact a value if its key is sensitive — show "[set — xxxx...]" with 4-char prefix */
47
+ function redactIfSensitive(key, value) {
48
+ if (SENSITIVE_KEYS.has(key) && typeof value === "string" && value.length > 0) {
49
+ return value.length > 4 ? `[set — ${value.slice(0, 4)}...]` : "[set]";
50
+ }
51
+ return String(value);
52
+ }
53
+ // Keys that should be coerced to numbers
54
+ const INT_KEYS = new Set(["maxRetries", "timeoutMs"]);
55
+ // Keys that should be coerced to booleans
56
+ const BOOL_KEYS = new Set(["dryRun", "verbose", "voice", "stream", "bruteforce"]);
57
+ function coerceForSettings(key, value) {
58
+ if (INT_KEYS.has(key))
59
+ return parseInt(value, 10);
60
+ if (BOOL_KEYS.has(key)) {
61
+ return value === "1" || value.toLowerCase() === "true" || value.toLowerCase() === "yes";
62
+ }
63
+ return value;
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // Command implementation
67
+ // ---------------------------------------------------------------------------
68
+ export async function configCommand(opts, config) {
69
+ if (opts.subCommand === "set") {
70
+ return handleSet(opts, config);
71
+ }
72
+ if (opts.subCommand === "keys") {
73
+ return handleKeys();
74
+ }
75
+ return handleShow(opts, config);
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Sub-handlers
79
+ // ---------------------------------------------------------------------------
80
+ function handleShow(opts, config) {
81
+ const repoRoot = resolve(opts.repoPath ?? cwd());
82
+ printHeader("Configuration");
83
+ printSection("Active Settings (merged)");
84
+ printKeyValue("backendUrl", config.backendUrl, 2);
85
+ printKeyValue("backendType", config.backendType, 2);
86
+ printKeyValue("model", config.model, 2);
87
+ printKeyValue("apiKey", config.apiKey ? "[set]" : "[not set]", 2);
88
+ printKeyValue("maxRetries", String(config.maxRetries), 2);
89
+ printKeyValue("timeoutMs", String(config.timeoutMs), 2);
90
+ printKeyValue("dryRun", String(config.dryRun), 2);
91
+ printKeyValue("verbose", String(config.verbose), 2);
92
+ printKeyValue("dbPath", config.dbPath, 2);
93
+ // Show project-local overrides
94
+ const projectSettings = loadProjectSettings(repoRoot);
95
+ const projectKeys = Object.entries(projectSettings).filter(([, v]) => v !== undefined);
96
+ if (projectKeys.length > 0) {
97
+ printSection(`Project Overrides (.oa/settings.json)`);
98
+ for (const [k, v] of projectKeys) {
99
+ printKeyValue(k, redactIfSensitive(k, v), 2);
100
+ }
101
+ }
102
+ else {
103
+ printSection("Project Overrides");
104
+ printInfo(" (none — use 'config set KEY VALUE --local' to add)");
105
+ }
106
+ // Show global settings overrides
107
+ const globalSettings = loadGlobalSettings();
108
+ const globalKeys = Object.entries(globalSettings).filter(([, v]) => v !== undefined);
109
+ if (globalKeys.length > 0) {
110
+ printSection("Global Settings (~/.open-agents/settings.json)");
111
+ for (const [k, v] of globalKeys) {
112
+ printKeyValue(k, redactIfSensitive(k, v), 2);
113
+ }
114
+ }
115
+ printSection("Config File");
116
+ printInfo(`~/.open-agents/config.json (${join(homedir(), ".open-agents", "config.json")})`);
117
+ printSection("Priority Chain");
118
+ printInfo(" 1. CLI flags (--model, --backend-url, etc.)");
119
+ printInfo(" 2. Project .oa/settings.json (--local)");
120
+ printInfo(" 3. Global ~/.open-agents/settings.json");
121
+ printInfo(" 4. Environment variables (OPEN_AGENTS_*)");
122
+ printInfo(" 5. Global ~/.open-agents/config.json");
123
+ printInfo(" 6. Built-in defaults");
124
+ if (opts.verbose) {
125
+ printSection("All Settable Keys");
126
+ for (const [key, desc] of Object.entries(CONFIG_KEYS)) {
127
+ printKeyValue(key, desc, 2);
128
+ }
129
+ }
130
+ }
131
+ function handleSet(opts, _config) {
132
+ const { key, value } = opts;
133
+ if (!key) {
134
+ printError("Usage: open-agents config set KEY VALUE [--local]");
135
+ printInfo("Run 'open-agents config keys' to see available keys");
136
+ process.exit(1);
137
+ }
138
+ if (value === undefined) {
139
+ printError(`No value provided for key: ${key}`);
140
+ printInfo(`Usage: open-agents config set ${key} <value>`);
141
+ process.exit(1);
142
+ }
143
+ if (!Object.prototype.hasOwnProperty.call(CONFIG_KEYS, key)) {
144
+ printError(`Unknown config key: "${key}"`);
145
+ printInfo("Run 'open-agents config keys' to see available keys");
146
+ process.exit(1);
147
+ }
148
+ if (opts.local) {
149
+ // Write to project-local .oa/settings.json only
150
+ const repoRoot = resolve(opts.repoPath ?? cwd());
151
+ try {
152
+ initOaDirectory(repoRoot);
153
+ const coerced = coerceForSettings(key, value);
154
+ saveProjectSettings(repoRoot, { [key]: coerced });
155
+ printSuccess(`Project override set: ${key} = ${redactIfSensitive(key, value)}`);
156
+ printInfo(`Saved to ${join(repoRoot, ".oa", "settings.json")}`);
157
+ printInfo("This override applies only when running in this workspace.");
158
+ }
159
+ catch (err) {
160
+ printError(`Failed to save: ${err instanceof Error ? err.message : String(err)}`);
161
+ process.exit(1);
162
+ }
163
+ }
164
+ else {
165
+ // Write to global ~/.open-agents/config.json (legacy behavior)
166
+ try {
167
+ setConfigValue(key, value);
168
+ printSuccess(`Config updated: ${key} = ${redactIfSensitive(key, value)}`);
169
+ printInfo(`Saved to ~/.open-agents/config.json`);
170
+ printInfo("Tip: Use --local to set project-specific overrides.");
171
+ }
172
+ catch (err) {
173
+ printError(`Failed to save config: ${err instanceof Error ? err.message : String(err)}`);
174
+ process.exit(1);
175
+ }
176
+ }
177
+ }
178
+ function handleKeys() {
179
+ printHeader("Config Keys");
180
+ printInfo("All keys can be set globally or per-project (--local):\n");
181
+ for (const [key, desc] of Object.entries(CONFIG_KEYS)) {
182
+ printKeyValue(key, desc, 2);
183
+ }
184
+ printInfo("\nUsage:");
185
+ printInfo(" oa config set model qwen3.5:122b # global default");
186
+ printInfo(" oa config set model qwen3.5:122b --local # this project only");
187
+ }
188
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * commands/eval.ts
3
+ *
4
+ * Run evaluation tasks against the RALPH loop.
5
+ *
6
+ * The eval suite exercises the agent on a set of synthetic coding tasks and
7
+ * reports a pass/fail rate. Useful for regression testing after model or
8
+ * prompt changes.
9
+ *
10
+ * Usage:
11
+ * open-agents eval
12
+ * open-agents eval --suite basic
13
+ * open-agents eval --suite full --repo /path/to/repo
14
+ * open-agents eval --suite full --verbose (live mode uses configured backend)
15
+ */
16
+ import type { AgentConfig } from "../config.js";
17
+ export interface EvalTask {
18
+ id: string;
19
+ description: string;
20
+ /** Natural-language request passed to the RALPH loop */
21
+ request: string;
22
+ /** Expected terminal statuses that count as a "pass" */
23
+ expectedStatuses: string[];
24
+ }
25
+ export interface EvalOptions {
26
+ suite?: string;
27
+ repoPath?: string;
28
+ verbose?: boolean;
29
+ /** When true, connect to the configured backend instead of FakeBackend */
30
+ live?: boolean;
31
+ }
32
+ export declare function evalCommand(opts: EvalOptions, config: AgentConfig): Promise<void>;
33
+ //# sourceMappingURL=eval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAiBhD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAoDD,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAkBD,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAwJvF"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * commands/eval.ts
3
+ *
4
+ * Run evaluation tasks against the RALPH loop.
5
+ *
6
+ * The eval suite exercises the agent on a set of synthetic coding tasks and
7
+ * reports a pass/fail rate. Useful for regression testing after model or
8
+ * prompt changes.
9
+ *
10
+ * Usage:
11
+ * open-agents eval
12
+ * open-agents eval --suite basic
13
+ * open-agents eval --suite full --repo /path/to/repo
14
+ * open-agents eval --suite full --verbose (live mode uses configured backend)
15
+ */
16
+ import { tmpdir } from "node:os";
17
+ import { mkdirSync, writeFileSync } from "node:fs";
18
+ import { join } from "node:path";
19
+ import { RalphLoop } from "@open-agents/orchestrator";
20
+ import { createBackend, FakeBackend } from "@open-agents/backend-vllm";
21
+ import { Spinner } from "../ui/spinner.js";
22
+ import { printHeader, printSection, printKeyValue, printSuccess, printError, printWarning, printInfo, formatDuration, } from "../ui/output.js";
23
+ // ---------------------------------------------------------------------------
24
+ // Built-in eval suites
25
+ // ---------------------------------------------------------------------------
26
+ const BASIC_SUITE = [
27
+ {
28
+ id: "eval-001",
29
+ description: "Simple fix request",
30
+ request: "Fix the null pointer dereference in the auth module",
31
+ expectedStatuses: ["success", "partial_success", "needs_human_decision"],
32
+ },
33
+ {
34
+ id: "eval-002",
35
+ description: "Feature addition request",
36
+ request: "Add pagination support to the user list endpoint",
37
+ expectedStatuses: ["success", "partial_success", "needs_human_decision"],
38
+ },
39
+ {
40
+ id: "eval-003",
41
+ description: "Refactor request",
42
+ request: "Refactor the database connection pool to use async/await",
43
+ expectedStatuses: ["success", "partial_success", "needs_human_decision"],
44
+ },
45
+ ];
46
+ const FULL_SUITE = [
47
+ ...BASIC_SUITE,
48
+ {
49
+ id: "eval-004",
50
+ description: "Test generation request",
51
+ request: "Write unit tests for the payment processing module",
52
+ expectedStatuses: ["success", "partial_success", "needs_human_decision"],
53
+ },
54
+ {
55
+ id: "eval-005",
56
+ description: "Documentation request",
57
+ request: "Add JSDoc comments to all exported functions in the API layer",
58
+ expectedStatuses: ["success", "partial_success", "needs_human_decision"],
59
+ },
60
+ ];
61
+ const SUITES = {
62
+ basic: BASIC_SUITE,
63
+ full: FULL_SUITE,
64
+ };
65
+ // ---------------------------------------------------------------------------
66
+ // Command implementation
67
+ // ---------------------------------------------------------------------------
68
+ export async function evalCommand(opts, config) {
69
+ const suiteName = opts.suite ?? "basic";
70
+ const suite = SUITES[suiteName];
71
+ if (!suite) {
72
+ printError(`Unknown eval suite: "${suiteName}". Available: ${Object.keys(SUITES).join(", ")}`);
73
+ process.exit(1);
74
+ }
75
+ const useLive = opts.live ?? false;
76
+ const modeLabel = useLive
77
+ ? `live (${config.backendType}: ${config.model})`
78
+ : "offline (FakeBackend)";
79
+ printHeader("Evaluation Suite");
80
+ printKeyValue("Suite", suiteName, 2);
81
+ printKeyValue("Tasks", String(suite.length), 2);
82
+ printKeyValue("Mode", modeLabel, 2);
83
+ // Prepare a temp directory to use as repo root for eval tasks
84
+ const evalRepoRoot = opts.repoPath ?? createTempEvalRepo();
85
+ // -------------------------------------------------------------------------
86
+ // Backend selection
87
+ // -------------------------------------------------------------------------
88
+ let rawBackend;
89
+ if (useLive) {
90
+ rawBackend = createBackend({
91
+ type: config.backendType,
92
+ model: config.model,
93
+ baseUrl: config.backendUrl,
94
+ maxRetries: config.maxRetries,
95
+ timeoutMs: config.timeoutMs,
96
+ });
97
+ // Verify the backend is reachable before running the suite
98
+ const spinner = new Spinner(`Connecting to ${config.backendType} at ${config.backendUrl} ...`);
99
+ spinner.start();
100
+ const healthy = await rawBackend.healthCheck();
101
+ if (!healthy) {
102
+ spinner.fail(`Backend unreachable at ${config.backendUrl}`);
103
+ printError("Run without --live to use FakeBackend, or start your backend first.");
104
+ process.exit(1);
105
+ }
106
+ spinner.succeed(`Connected to ${config.backendType} (model: ${config.model})`);
107
+ }
108
+ else {
109
+ // Default: use FakeBackend so evals run without any backend dependency
110
+ rawBackend = new FakeBackend();
111
+ }
112
+ // Adapt to the orchestrator's simpler LLMBackend interface
113
+ const backend = {
114
+ async complete(request) {
115
+ const result = await rawBackend.complete({
116
+ messages: request.messages.map((m) => ({
117
+ id: globalThis.crypto.randomUUID(),
118
+ sessionId: globalThis.crypto.randomUUID(),
119
+ role: m.role,
120
+ content: m.content,
121
+ timestamp: new Date().toISOString(),
122
+ })),
123
+ maxTokens: request.maxTokens,
124
+ temperature: request.temperature,
125
+ });
126
+ return { content: result.content ?? "" };
127
+ },
128
+ };
129
+ const loop = new RalphLoop(backend, {
130
+ maxRetries: config.maxRetries,
131
+ timeoutMs: 30_000, // short timeout for evals
132
+ dryRun: true, // always dry-run for evals
133
+ repoRootOverride: evalRepoRoot,
134
+ });
135
+ const results = [];
136
+ for (const task of suite) {
137
+ const spinner = new Spinner(`[${task.id}] ${task.description}`);
138
+ spinner.start();
139
+ const start = Date.now();
140
+ let result;
141
+ try {
142
+ const report = await loop.run(task.request, evalRepoRoot);
143
+ const passed = task.expectedStatuses.includes(report.status);
144
+ result = {
145
+ task,
146
+ status: report.status,
147
+ passed,
148
+ durationMs: Date.now() - start,
149
+ };
150
+ if (passed) {
151
+ spinner.succeed(`[${task.id}] PASS (${report.status})`);
152
+ }
153
+ else {
154
+ spinner.fail(`[${task.id}] FAIL (got: ${report.status})`);
155
+ }
156
+ }
157
+ catch (err) {
158
+ result = {
159
+ task,
160
+ status: "error",
161
+ passed: false,
162
+ durationMs: Date.now() - start,
163
+ error: err instanceof Error ? err.message : String(err),
164
+ };
165
+ spinner.fail(`[${task.id}] ERROR: ${result.error}`);
166
+ }
167
+ results.push(result);
168
+ }
169
+ // -------------------------------------------------------------------------
170
+ // Results report
171
+ // -------------------------------------------------------------------------
172
+ const passed = results.filter((r) => r.passed).length;
173
+ const failed = results.filter((r) => !r.passed).length;
174
+ const totalMs = results.reduce((acc, r) => acc + r.durationMs, 0);
175
+ const passRate = ((passed / results.length) * 100).toFixed(0);
176
+ printSection("Eval Results");
177
+ printKeyValue("Suite", suiteName, 2);
178
+ printKeyValue("Total tasks", String(results.length), 2);
179
+ printKeyValue("Passed", String(passed), 2);
180
+ printKeyValue("Failed", String(failed), 2);
181
+ printKeyValue("Pass rate", `${passRate}%`, 2);
182
+ printKeyValue("Total duration", formatDuration(totalMs), 2);
183
+ if (opts.verbose) {
184
+ printSection("Task Breakdown");
185
+ for (const r of results) {
186
+ const icon = r.passed ? "PASS" : "FAIL";
187
+ printKeyValue(`${r.task.id} [${icon}]`, `${r.status} (${formatDuration(r.durationMs)})`, 2);
188
+ if (r.error) {
189
+ printInfo(` Error: ${r.error}`);
190
+ }
191
+ }
192
+ }
193
+ if (failed === 0) {
194
+ printSuccess(`All ${results.length} eval tasks passed!`);
195
+ }
196
+ else {
197
+ printWarning(`${failed} eval task(s) failed`);
198
+ }
199
+ process.exit(failed > 0 ? 1 : 0);
200
+ }
201
+ // ---------------------------------------------------------------------------
202
+ // Helpers
203
+ // ---------------------------------------------------------------------------
204
+ function createTempEvalRepo() {
205
+ const dir = join(tmpdir(), `open-agents-eval-${Date.now()}`);
206
+ mkdirSync(dir, { recursive: true });
207
+ // Seed with a minimal package.json so the indexer has something to scan
208
+ writeFileSync(join(dir, "package.json"), JSON.stringify({ name: "eval-repo", version: "0.0.0" }, null, 2) + "\n", "utf8");
209
+ return dir;
210
+ }
211
+ //# sourceMappingURL=eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"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"}