tandem-mode 0.1.4 → 0.4.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.
- package/README.md +37 -1
- package/README.sr.md +37 -1
- package/dist/agent/clipboard.js +4 -5
- package/dist/agent/clipboard.js.map +1 -1
- package/dist/agent/compact.js +80 -0
- package/dist/agent/compact.js.map +1 -0
- package/dist/agent/loop.js +2 -2
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/tools/edit.js +11 -11
- package/dist/agent/tools/edit.js.map +1 -1
- package/dist/agent/tools/gitDiff.js +41 -18
- package/dist/agent/tools/gitDiff.js.map +1 -1
- package/dist/agent/tools/listDir.js +4 -4
- package/dist/agent/tools/listDir.js.map +1 -1
- package/dist/agent/tools/readFile.js +7 -7
- package/dist/agent/tools/readFile.js.map +1 -1
- package/dist/agent/tools/search.js +10 -10
- package/dist/agent/tools/search.js.map +1 -1
- package/dist/agent/tools/shell.js +32 -14
- package/dist/agent/tools/shell.js.map +1 -1
- package/dist/agent/tools/viewImage.js +4 -4
- package/dist/agent/tools/viewImage.js.map +1 -1
- package/dist/agent/tools/webSearch.js +3 -3
- package/dist/agent/tools/webSearch.js.map +1 -1
- package/dist/benchmark/runner.js.map +1 -1
- package/dist/benchmark/tasks/{bitwiseBulkPriceWizard.js → bulkPriceWizard.js} +3 -3
- package/dist/benchmark/tasks/bulkPriceWizard.js.map +1 -0
- package/dist/cli.js +48 -22
- package/dist/cli.js.map +1 -1
- package/dist/config/credentials.js +5 -5
- package/dist/config/credentials.js.map +1 -1
- package/dist/config/profiles.js +108 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/deepseek/vision.js +4 -4
- package/dist/deepseek/vision.js.map +1 -1
- package/dist/deepseek/webSearch.js +1 -1
- package/dist/i18n/en.js +103 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.js +23 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/sr.js +101 -0
- package/dist/i18n/sr.js.map +1 -0
- package/dist/orchestrator/notify.js +38 -0
- package/dist/orchestrator/notify.js.map +1 -0
- package/dist/orchestrator/orchestrate.js +50 -19
- package/dist/orchestrator/orchestrate.js.map +1 -1
- package/dist/orchestrator/planner.js +10 -10
- package/dist/orchestrator/planner.js.map +1 -1
- package/dist/orchestrator/repoMap.js +1 -1
- package/dist/orchestrator/repoMap.js.map +1 -1
- package/dist/orchestrator/reviewer.js +20 -12
- package/dist/orchestrator/reviewer.js.map +1 -1
- package/dist/repl/commands.js +122 -37
- package/dist/repl/commands.js.map +1 -1
- package/dist/repl/system-prompt.js +13 -11
- package/dist/repl/system-prompt.js.map +1 -1
- package/dist/repl/wizard.js +17 -9
- package/dist/repl/wizard.js.map +1 -1
- package/package.json +1 -1
- package/dist/benchmark/tasks/bitwiseBulkPriceWizard.js.map +0 -1
|
@@ -4,14 +4,14 @@ const execFileAsync = promisify(execFile);
|
|
|
4
4
|
const MAX_OUTPUT_CHARS = 20_000;
|
|
5
5
|
export const searchTool = {
|
|
6
6
|
name: "search",
|
|
7
|
-
description: "
|
|
7
|
+
description: "Search file contents with a regex pattern using ripgrep (rg).",
|
|
8
8
|
parameters: {
|
|
9
9
|
type: "object",
|
|
10
10
|
properties: {
|
|
11
|
-
pattern: { type: "string", description: "Regex
|
|
12
|
-
path: { type: "string", description: "
|
|
13
|
-
glob: { type: "string", description: "
|
|
14
|
-
caseInsensitive: { type: "boolean", description: "
|
|
11
|
+
pattern: { type: "string", description: "Regex pattern to search for." },
|
|
12
|
+
path: { type: "string", description: "Directory or file to search. Defaults to the working directory." },
|
|
13
|
+
glob: { type: "string", description: "Optional glob file filter, e.g. '*.ts'." },
|
|
14
|
+
caseInsensitive: { type: "boolean", description: "Case-insensitive search." },
|
|
15
15
|
},
|
|
16
16
|
required: ["pattern"],
|
|
17
17
|
},
|
|
@@ -29,22 +29,22 @@ export const searchTool = {
|
|
|
29
29
|
rgArgs.push("--", pattern, searchPath);
|
|
30
30
|
try {
|
|
31
31
|
const { stdout } = await execFileAsync("rg", rgArgs, { cwd: ctx.cwd, maxBuffer: 10 * 1024 * 1024 });
|
|
32
|
-
const output = stdout.length > MAX_OUTPUT_CHARS ? stdout.slice(0, MAX_OUTPUT_CHARS) + "\n... (
|
|
33
|
-
return { output: output.trim() || "(
|
|
32
|
+
const output = stdout.length > MAX_OUTPUT_CHARS ? stdout.slice(0, MAX_OUTPUT_CHARS) + "\n... (truncated)" : stdout;
|
|
33
|
+
return { output: output.trim() || "(no matches)", isError: false };
|
|
34
34
|
}
|
|
35
35
|
catch (err) {
|
|
36
36
|
const e = err;
|
|
37
37
|
if (e.code === "ENOENT") {
|
|
38
38
|
return {
|
|
39
|
-
output: "ripgrep (rg)
|
|
39
|
+
output: "ripgrep (rg) is not installed or not on PATH. Install it for the search tool to work.",
|
|
40
40
|
isError: true,
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
// rg vraća exit code 1 kad nema poklapanja — to nije greška alata.
|
|
44
44
|
if (e.code === 1) {
|
|
45
|
-
return { output: "(
|
|
45
|
+
return { output: "(no matches)", isError: false };
|
|
46
46
|
}
|
|
47
|
-
return { output: `
|
|
47
|
+
return { output: `Search error: ${e.message}`, isError: true };
|
|
48
48
|
}
|
|
49
49
|
},
|
|
50
50
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/agent/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,+DAA+D;IAC5E,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/agent/tools/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,28 +14,46 @@ const SAFE_COMMAND_PATTERNS = [
|
|
|
14
14
|
/^(php|node|npm|pnpm|npx|python|python3)\s+(-v|--version|-l)\b/i,
|
|
15
15
|
/^(which|where)\s+\S/i,
|
|
16
16
|
];
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* `child.kill()` only stops the shell itself; a command it started (node, curl, ...)
|
|
19
|
+
* keeps running and keeps the pipes open, which holds the whole CLI process open
|
|
20
|
+
* after a timeout or abort. On Windows the whole process tree is killed, and on every
|
|
21
|
+
* platform the pipes are closed so nothing keeps the event loop alive.
|
|
22
|
+
*/
|
|
23
|
+
function terminate(child) {
|
|
24
|
+
if (child.pid !== undefined && process.platform === "win32") {
|
|
25
|
+
spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], { stdio: "ignore" }).on("error", () => { });
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
child.kill();
|
|
29
|
+
}
|
|
30
|
+
child.stdout?.destroy();
|
|
31
|
+
child.stderr?.destroy();
|
|
32
|
+
}
|
|
33
|
+
export function runShell(command, cwd, signal, options = {}) {
|
|
18
34
|
const isWindows = process.platform === "win32";
|
|
19
35
|
const exe = isWindows ? "powershell.exe" : "/bin/sh";
|
|
20
36
|
const args = isWindows ? ["-NoProfile", "-NonInteractive", "-Command", command] : ["-c", command];
|
|
37
|
+
const timeoutMs = options.timeoutMs ?? TIMEOUT_MS;
|
|
21
38
|
return new Promise((resolve, reject) => {
|
|
22
|
-
const child = spawn(exe, args, { cwd });
|
|
39
|
+
const child = spawn(exe, args, { cwd, ...(options.env ? { env: { ...process.env, ...options.env } } : {}) });
|
|
23
40
|
let output = "";
|
|
24
41
|
let settled = false;
|
|
25
42
|
const timer = setTimeout(() => {
|
|
26
43
|
if (settled)
|
|
27
44
|
return;
|
|
28
45
|
settled = true;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
46
|
+
signal?.removeEventListener("abort", onAbort);
|
|
47
|
+
terminate(child);
|
|
48
|
+
reject(new Error(`Command aborted after ${timeoutMs / 1000}s (timeout).`));
|
|
49
|
+
}, timeoutMs);
|
|
32
50
|
const onAbort = () => {
|
|
33
51
|
if (settled)
|
|
34
52
|
return;
|
|
35
53
|
settled = true;
|
|
36
54
|
clearTimeout(timer);
|
|
37
|
-
child
|
|
38
|
-
const abortError = new Error("
|
|
55
|
+
terminate(child);
|
|
56
|
+
const abortError = new Error("Command aborted (ESC).");
|
|
39
57
|
abortError.name = "AbortError";
|
|
40
58
|
reject(abortError);
|
|
41
59
|
};
|
|
@@ -48,8 +66,8 @@ function runShell(command, cwd, signal) {
|
|
|
48
66
|
settled = true;
|
|
49
67
|
clearTimeout(timer);
|
|
50
68
|
signal?.removeEventListener("abort", onAbort);
|
|
51
|
-
child
|
|
52
|
-
reject(new Error(`
|
|
69
|
+
terminate(child);
|
|
70
|
+
reject(new Error(`Command aborted because its output exceeded ${HARD_MAX_BUFFER_CHARS} characters (probably reading binary/large files instead of text).`));
|
|
53
71
|
}
|
|
54
72
|
};
|
|
55
73
|
child.stdout.on("data", onData);
|
|
@@ -74,11 +92,11 @@ function runShell(command, cwd, signal) {
|
|
|
74
92
|
}
|
|
75
93
|
export const shellTool = {
|
|
76
94
|
name: "shell",
|
|
77
|
-
description: "
|
|
95
|
+
description: "Run a command in the system shell (PowerShell on Windows, sh on Linux/macOS) in the working directory.",
|
|
78
96
|
parameters: {
|
|
79
97
|
type: "object",
|
|
80
98
|
properties: {
|
|
81
|
-
command: { type: "string", description: "
|
|
99
|
+
command: { type: "string", description: "Command to run." },
|
|
82
100
|
},
|
|
83
101
|
required: ["command"],
|
|
84
102
|
},
|
|
@@ -90,14 +108,14 @@ export const shellTool = {
|
|
|
90
108
|
const command = String(args["command"] ?? "");
|
|
91
109
|
try {
|
|
92
110
|
const { output, exitCode } = await runShell(command, ctx.cwd, ctx.signal);
|
|
93
|
-
const truncated = output.length > MAX_OUTPUT_CHARS ? output.slice(0, MAX_OUTPUT_CHARS) + "\n... (
|
|
111
|
+
const truncated = output.length > MAX_OUTPUT_CHARS ? output.slice(0, MAX_OUTPUT_CHARS) + "\n... (truncated)" : output;
|
|
94
112
|
return {
|
|
95
|
-
output: `[exit code ${exitCode}]\n${truncated || "(
|
|
113
|
+
output: `[exit code ${exitCode}]\n${truncated || "(no output)"}`,
|
|
96
114
|
isError: exitCode !== 0,
|
|
97
115
|
};
|
|
98
116
|
}
|
|
99
117
|
catch (err) {
|
|
100
|
-
return { output: `
|
|
118
|
+
return { output: `Error running command: ${err.message}`, isError: true };
|
|
101
119
|
}
|
|
102
120
|
},
|
|
103
121
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/agent/tools/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/agent/tools/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,14 +2,14 @@ import path from "node:path";
|
|
|
2
2
|
import { describeImage } from "../../deepseek/vision.js";
|
|
3
3
|
export const viewImageTool = {
|
|
4
4
|
name: "view_image",
|
|
5
|
-
description: "
|
|
5
|
+
description: "View an image (bug screenshot, mockup, diagram) and get a text description or an answer to a question about it. Use when the user mentions a screenshot or image and gives its path. Supported formats: JPEG, PNG, GIF, WebP.",
|
|
6
6
|
parameters: {
|
|
7
7
|
type: "object",
|
|
8
8
|
properties: {
|
|
9
|
-
path: { type: "string", description: "
|
|
9
|
+
path: { type: "string", description: "Path to the image." },
|
|
10
10
|
question: {
|
|
11
11
|
type: "string",
|
|
12
|
-
description: "
|
|
12
|
+
description: "What specifically to ask about the image. Defaults to a general description focused on a possible error.",
|
|
13
13
|
},
|
|
14
14
|
},
|
|
15
15
|
required: ["path"],
|
|
@@ -27,7 +27,7 @@ export const viewImageTool = {
|
|
|
27
27
|
return { output: text, isError: false };
|
|
28
28
|
}
|
|
29
29
|
catch (err) {
|
|
30
|
-
return { output: `
|
|
30
|
+
return { output: `Image analysis error: ${err.message}`, isError: true };
|
|
31
31
|
}
|
|
32
32
|
},
|
|
33
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewImage.js","sourceRoot":"","sources":["../../../src/agent/tools/viewImage.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,YAAY;IAClB,WAAW,EACT
|
|
1
|
+
{"version":3,"file":"viewImage.js","sourceRoot":"","sources":["../../../src/agent/tools/viewImage.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,+NAA+N;IACjO,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;YAC3D,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0GAA0G;aACxH;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;IACD,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK;IAC1B,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;QACrB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YACrF,qEAAqE;YACrE,2EAA2E;YAC3E,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC1C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,yBAA0B,GAAa,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtF,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { runWebSearch } from "../../deepseek/webSearch.js";
|
|
2
2
|
export const webSearchTool = {
|
|
3
3
|
name: "web_search",
|
|
4
|
-
description: "
|
|
4
|
+
description: "Search the web for current information — error messages, library documentation, news. Use when the answer requires something that is not in the code or repo context.",
|
|
5
5
|
parameters: {
|
|
6
6
|
type: "object",
|
|
7
7
|
properties: {
|
|
8
|
-
query: { type: "string", description: "
|
|
8
|
+
query: { type: "string", description: "Search query." },
|
|
9
9
|
},
|
|
10
10
|
required: ["query"],
|
|
11
11
|
},
|
|
@@ -20,7 +20,7 @@ export const webSearchTool = {
|
|
|
20
20
|
return { output: text, isError: false };
|
|
21
21
|
}
|
|
22
22
|
catch (err) {
|
|
23
|
-
return { output: `
|
|
23
|
+
return { output: `Search error: ${err.message}`, isError: true };
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webSearch.js","sourceRoot":"","sources":["../../../src/agent/tools/webSearch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"webSearch.js","sourceRoot":"","sources":["../../../src/agent/tools/webSearch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,uKAAuK;IACzK,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;SACxD;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;IACD,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK;IAC1B,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YACvE,wEAAwE;YACxE,2EAA2E;YAC3E,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC1C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,iBAAkB,GAAa,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9E,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/benchmark/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAgB,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAMrD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,aAAa,GAAG;;;sCAGgB,CAAC;AAQvC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,WAAmB;IAC5D,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChF,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,QAAuB,EACvB,KAA8C,EAC9C,QAAoC,EACpC,GAAc,EACd,GAAW,EACX,OAAgB,EAChB,KAAuB,EACvB,KAAe;IAEf,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,YAAY,CAAC,QAAQ,EAAE;QAC5C,GAAG;QACH,KAAK;QACL,GAAG;QACH,OAAO;QACP,KAAK;QACL,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QACzB,aAAa,EAAE,EAAE;KAClB,CAAC,EAAE,CAAC;QACH,IAAI,EAAE,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACnC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO;gBAAE,KAAK,CAAC,cAAc,EAAE,CAAC;QAChD,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,OAA6C;IACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO;YAAE,SAAS;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO;gBAAE,OAAO,IAAI,CAAC;QACjF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAc,EACd,MAA2B,EAC3B,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/benchmark/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFile, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
-
const FIXTURES_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "fixtures", "
|
|
4
|
+
const FIXTURES_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "fixtures", "bulk-price-wizard");
|
|
5
5
|
async function replaceInFile(filePath, from, to) {
|
|
6
6
|
const content = await readFile(filePath, "utf8");
|
|
7
7
|
if (!content.includes(from)) {
|
|
@@ -9,7 +9,7 @@ async function replaceInFile(filePath, from, to) {
|
|
|
9
9
|
}
|
|
10
10
|
await writeFile(filePath, content.replace(from, to), "utf8");
|
|
11
11
|
}
|
|
12
|
-
export const
|
|
12
|
+
export const benchmarkTasks = [
|
|
13
13
|
{
|
|
14
14
|
id: "money-rounding",
|
|
15
15
|
description: "Users report the 'Round to nearest 0.05' rounding preset is broken — it's rounding to the nearest 50 cents instead of 5 cents. Find and fix the bug in includes/Data/MoneyUtil.php.",
|
|
@@ -47,4 +47,4 @@ export const bwTasks = [
|
|
|
47
47
|
verifyScript: path.join(FIXTURES_DIR, "verify-task4.php"),
|
|
48
48
|
},
|
|
49
49
|
];
|
|
50
|
-
//# sourceMappingURL=
|
|
50
|
+
//# sourceMappingURL=bulkPriceWizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulkPriceWizard.js","sourceRoot":"","sources":["../../../src/benchmark/tasks/bulkPriceWizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,IAAI,EACJ,UAAU,EACV,mBAAmB,CACpB,CAAC;AAYF,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAY,EAAE,EAAU;IACrE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C;QACE,EAAE,EAAE,gBAAgB;QACpB,WAAW,EACT,qLAAqL;QACvL,aAAa,EAAE,CAAC,6BAA6B,CAAC;QAC9C,KAAK,CAAC,SAAS,CAAC,QAAQ;YACtB,MAAM,aAAa,CACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,6BAA6B,CAAC,EAClD,+CAA+C,EAC/C,6CAA6C,CAC9C,CAAC;QACJ,CAAC;QACD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC;KAC1D;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,WAAW,EACT,yNAAyN;QAC3N,aAAa,EAAE,CAAC,iCAAiC,CAAC;QAClD,KAAK,CAAC,SAAS,CAAC,QAAQ;YACtB,MAAM,aAAa,CACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iCAAiC,CAAC,EACtD,2DAA2D,EAC3D,mDAAmD,CACpD,CAAC;QACJ,CAAC;QACD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC;KAC1D;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,WAAW,EACT,6PAA6P;QAC/P,aAAa,EAAE,CAAC,iCAAiC,CAAC;QAClD,KAAK,CAAC,SAAS,CAAC,QAAQ;YACtB,MAAM,aAAa,CACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iCAAiC,CAAC,EACtD,+CAA+C,EAC/C,+CAA+C,CAChD,CAAC;QACJ,CAAC;QACD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC;KAC1D;IACD;QACE,EAAE,EAAE,uBAAuB;QAC3B,WAAW,EACT,sTAAsT;QACxT,aAAa,EAAE,CAAC,sCAAsC,CAAC;QACvD,KAAK,CAAC,SAAS,CAAC,QAAQ;YACtB,MAAM,aAAa,CACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,sCAAsC,CAAC,EAC3D,6EAA6E,EAC7E,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QACD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC;KAC1D;CACF,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -8,6 +8,7 @@ import { fileURLToPath } from "node:url";
|
|
|
8
8
|
import { mkdir, readFile } from "node:fs/promises";
|
|
9
9
|
import { resolveApiKey, resolveBaseUrl } from "./config/env.js";
|
|
10
10
|
import { loadConfig } from "./config/store.js";
|
|
11
|
+
import { resolveLanguage, setLanguage, t } from "./i18n/index.js";
|
|
11
12
|
import { DEFAULT_CONFIG } from "./config/schema.js";
|
|
12
13
|
import { runFirstRunWizard } from "./repl/wizard.js";
|
|
13
14
|
import { handleCommand } from "./repl/commands.js";
|
|
@@ -17,6 +18,7 @@ import { UsageAccumulator } from "./agent/usage.js";
|
|
|
17
18
|
import { isPeakHour } from "./agent/pricing.js";
|
|
18
19
|
import { saveClipboardImage } from "./agent/clipboard.js";
|
|
19
20
|
import { runOrchestration } from "./orchestrator/orchestrate.js";
|
|
21
|
+
import { notifyCompletion } from "./orchestrator/notify.js";
|
|
20
22
|
import { appendSessionMessage, createSession, findLatestSession, loadSessionMessages } from "./agent/session.js";
|
|
21
23
|
// Prikazuje se samo zadnjih N karaktera dok model razmišlja — dovoljno za
|
|
22
24
|
// "Thinking…" preview, a sprečava da Ink na svaki token re-renderuje/re-lejautuje
|
|
@@ -35,7 +37,7 @@ function TurnView({ state, turn, askApproval, onDone, }) {
|
|
|
35
37
|
async function run() {
|
|
36
38
|
const approve = async (toolName, args) => {
|
|
37
39
|
if (state.autoApprove) {
|
|
38
|
-
console.error(
|
|
40
|
+
console.error(t("autoApproved", { call: `${toolName}(${JSON.stringify(args)})` }));
|
|
39
41
|
return true;
|
|
40
42
|
}
|
|
41
43
|
if (state.alwaysApprovedTools.has(toolName))
|
|
@@ -89,13 +91,13 @@ function TurnView({ state, turn, askApproval, onDone, }) {
|
|
|
89
91
|
setContent(event.content);
|
|
90
92
|
break;
|
|
91
93
|
case "max_iterations_reached":
|
|
92
|
-
setNotice("
|
|
94
|
+
setNotice(t("maxIterations"));
|
|
93
95
|
break;
|
|
94
96
|
case "budget_exceeded":
|
|
95
|
-
setNotice(
|
|
97
|
+
setNotice(t("budgetExceeded", { budget: `$${event.budgetUsd.toFixed(2)}`, spent: `$${event.spentUsd.toFixed(4)}` }));
|
|
96
98
|
break;
|
|
97
99
|
case "interrupted":
|
|
98
|
-
setNotice(
|
|
100
|
+
setNotice(t("interrupted"));
|
|
99
101
|
break;
|
|
100
102
|
}
|
|
101
103
|
}
|
|
@@ -110,12 +112,12 @@ function TurnView({ state, turn, askApproval, onDone, }) {
|
|
|
110
112
|
});
|
|
111
113
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
112
114
|
}, []);
|
|
113
|
-
return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [reasoning.length > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "\u273B Thinking\u2026" }), _jsx(Text, { dimColor: true, children: reasoning })] })), toolLog.map((
|
|
114
|
-
const lines =
|
|
115
|
+
return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [reasoning.length > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "\u273B Thinking\u2026" }), _jsx(Text, { dimColor: true, children: reasoning })] })), toolLog.map((entry) => {
|
|
116
|
+
const lines = entry.output?.split("\n") ?? [];
|
|
115
117
|
const preview = lines.slice(0, 3).join("\n");
|
|
116
118
|
const more = lines.length > 3;
|
|
117
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color:
|
|
118
|
-
}), pending && (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [
|
|
119
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: entry.status === "denied" ? "yellow" : entry.isError ? "red" : "cyan", children: ["\u23FA ", entry.name, "(", JSON.stringify(entry.args), ")", entry.status === "running" ? "…" : entry.status === "denied" ? t("toolDenied") : ""] }), preview && (_jsxs(Text, { dimColor: true, children: [" ⎿ ", preview.slice(0, 400), more || preview.length > 400 ? t("toolMoreLines", { count: lines.length }) : ""] }))] }, entry.id));
|
|
120
|
+
}), pending && (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [_jsx(Text, { color: "yellow", bold: true, children: t("destructiveAction", { call: `${pending.toolName}(${JSON.stringify(pending.args)})` }) }), _jsx(Text, { dimColor: true, children: t("approvalHint") })] })), content.length > 0 && _jsx(Text, { children: content }), usageLine && _jsx(Text, { color: "gray", children: usageLine }), notice && _jsx(Text, { color: "yellow", children: notice }), error && _jsx(Text, { color: "red", children: t("errorPrefix", { message: error }) })] }));
|
|
119
121
|
}
|
|
120
122
|
function truncatePath(p, max = 50) {
|
|
121
123
|
return p.length > max ? `…${p.slice(-(max - 1))}` : p;
|
|
@@ -159,6 +161,8 @@ async function runPlanTask(state, task, askApproval, signal) {
|
|
|
159
161
|
cwd: state.cwd,
|
|
160
162
|
env: state.env,
|
|
161
163
|
maxReviewLoops: state.maxReviewLoops,
|
|
164
|
+
...(state.verifyCommand !== undefined ? { verifyCommand: state.verifyCommand } : {}),
|
|
165
|
+
...(state.notifyCommand !== undefined ? { notifyCommand: state.notifyCommand } : {}),
|
|
162
166
|
usage: state.usage,
|
|
163
167
|
...(signal !== undefined ? { signal } : {}),
|
|
164
168
|
runWorkerTurn: (turn) => runTurnConfig(state, turn, askApproval),
|
|
@@ -166,10 +170,18 @@ async function runPlanTask(state, task, askApproval, signal) {
|
|
|
166
170
|
}
|
|
167
171
|
catch (err) {
|
|
168
172
|
if (isAbortError(err)) {
|
|
169
|
-
console.log(
|
|
173
|
+
console.log(t("orchestrationInterrupted"));
|
|
170
174
|
}
|
|
171
175
|
else {
|
|
172
|
-
|
|
176
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
177
|
+
console.error(t("orchestrationError", { message }));
|
|
178
|
+
await notifyCompletion(state.notifyCommand, state.cwd, {
|
|
179
|
+
outcome: "error",
|
|
180
|
+
task,
|
|
181
|
+
notes: message,
|
|
182
|
+
reviewLoops: 0,
|
|
183
|
+
costUsd: state.usage.estimatedCostUsd(),
|
|
184
|
+
});
|
|
173
185
|
}
|
|
174
186
|
}
|
|
175
187
|
}
|
|
@@ -193,7 +205,7 @@ function createLineApprover() {
|
|
|
193
205
|
};
|
|
194
206
|
void consumeLines();
|
|
195
207
|
const approve = (toolName, args) => {
|
|
196
|
-
console.log(`\
|
|
208
|
+
console.log(`\n${t("approvalPrompt", { call: `${toolName}(${JSON.stringify(args)})` })}`);
|
|
197
209
|
return new Promise((resolve) => {
|
|
198
210
|
resolveRef.current = resolve;
|
|
199
211
|
});
|
|
@@ -209,9 +221,9 @@ function createLineApprover() {
|
|
|
209
221
|
*/
|
|
210
222
|
async function runRepl(state) {
|
|
211
223
|
await showBanner(state);
|
|
212
|
-
console.log("
|
|
224
|
+
console.log(t("replHint"));
|
|
213
225
|
if (isPeakHour(new Date())) {
|
|
214
|
-
console.log(
|
|
226
|
+
console.log(t("peakWarning"));
|
|
215
227
|
}
|
|
216
228
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: "> " });
|
|
217
229
|
let closed = false;
|
|
@@ -226,7 +238,7 @@ async function runRepl(state) {
|
|
|
226
238
|
let turnActive = false;
|
|
227
239
|
let lastTurn = Promise.resolve();
|
|
228
240
|
const askApproval = (toolName, args) => {
|
|
229
|
-
console.log(`\
|
|
241
|
+
console.log(`\n${t("approvalPrompt", { call: `${toolName}(${JSON.stringify(args)})` })}`);
|
|
230
242
|
return new Promise((resolve) => {
|
|
231
243
|
approvalRef.current = resolve;
|
|
232
244
|
});
|
|
@@ -253,7 +265,7 @@ async function runRepl(state) {
|
|
|
253
265
|
continue;
|
|
254
266
|
}
|
|
255
267
|
if (turnActive) {
|
|
256
|
-
console.log("
|
|
268
|
+
console.log(t("waitForTurn"));
|
|
257
269
|
continue;
|
|
258
270
|
}
|
|
259
271
|
const beginTurn = (run) => {
|
|
@@ -269,7 +281,7 @@ async function runRepl(state) {
|
|
|
269
281
|
if (line.startsWith("/plan ")) {
|
|
270
282
|
const task = line.slice("/plan ".length).trim();
|
|
271
283
|
if (!task) {
|
|
272
|
-
console.log("
|
|
284
|
+
console.log(t("usageLine", { syntax: "/plan <task>" }));
|
|
273
285
|
showPrompt();
|
|
274
286
|
continue;
|
|
275
287
|
}
|
|
@@ -284,16 +296,16 @@ async function runRepl(state) {
|
|
|
284
296
|
const destPath = path.join(destDir, `paste-${Date.now()}.png`);
|
|
285
297
|
const ok = await saveClipboardImage(destPath);
|
|
286
298
|
if (!ok) {
|
|
287
|
-
console.log("
|
|
299
|
+
console.log(t("pasteNoImage"));
|
|
288
300
|
showPrompt();
|
|
289
301
|
continue;
|
|
290
302
|
}
|
|
291
303
|
const relPath = path.relative(state.cwd, destPath);
|
|
292
|
-
const text = `[
|
|
304
|
+
const text = `[image pasted from the clipboard: ${relPath}] ${extra || "Look at the image and describe what you see."}`;
|
|
293
305
|
beginTurn((signal) => runTurn(state, text, askApproval, signal));
|
|
294
306
|
}
|
|
295
307
|
catch (err) {
|
|
296
|
-
console.log(
|
|
308
|
+
console.log(t("errorPrefix", { message: err instanceof Error ? err.message : String(err) }));
|
|
297
309
|
showPrompt();
|
|
298
310
|
}
|
|
299
311
|
continue;
|
|
@@ -320,6 +332,7 @@ function parseArgv(argv) {
|
|
|
320
332
|
let effort;
|
|
321
333
|
let budgetUsd;
|
|
322
334
|
let maxReviewLoops;
|
|
335
|
+
let language;
|
|
323
336
|
for (let i = 0; i < argv.length; i++) {
|
|
324
337
|
const arg = argv[i];
|
|
325
338
|
if (arg === "--resume" || arg === "-r") {
|
|
@@ -351,6 +364,11 @@ function parseArgv(argv) {
|
|
|
351
364
|
if (Number.isFinite(value) && value > 0)
|
|
352
365
|
maxReviewLoops = value;
|
|
353
366
|
}
|
|
367
|
+
else if (arg === "--lang") {
|
|
368
|
+
const value = argv[++i];
|
|
369
|
+
if (value === "en" || value === "sr")
|
|
370
|
+
language = value;
|
|
371
|
+
}
|
|
354
372
|
else if (arg !== undefined) {
|
|
355
373
|
rest.push(arg);
|
|
356
374
|
}
|
|
@@ -364,6 +382,8 @@ function parseArgv(argv) {
|
|
|
364
382
|
parsed.budgetUsd = budgetUsd;
|
|
365
383
|
if (maxReviewLoops !== undefined)
|
|
366
384
|
parsed.maxReviewLoops = maxReviewLoops;
|
|
385
|
+
if (language !== undefined)
|
|
386
|
+
parsed.language = language;
|
|
367
387
|
return parsed;
|
|
368
388
|
}
|
|
369
389
|
async function printVersion() {
|
|
@@ -380,18 +400,20 @@ async function main() {
|
|
|
380
400
|
const cwd = process.cwd();
|
|
381
401
|
const parsed = parseArgv(rawArgv);
|
|
382
402
|
const config = await loadConfig(cwd);
|
|
403
|
+
setLanguage(resolveLanguage(parsed.language, process.env["TANDEM_LANG"], config.language));
|
|
383
404
|
let apiKey = await resolveApiKey();
|
|
384
405
|
if (!apiKey) {
|
|
385
406
|
if (!process.stdin.isTTY) {
|
|
386
|
-
console.error("
|
|
407
|
+
console.error(t("noApiKey"));
|
|
387
408
|
process.exitCode = 1;
|
|
388
409
|
return;
|
|
389
410
|
}
|
|
390
411
|
const wizardConfig = await runFirstRunWizard();
|
|
391
412
|
Object.assign(config, wizardConfig);
|
|
413
|
+
setLanguage(resolveLanguage(parsed.language, process.env["TANDEM_LANG"], config.language));
|
|
392
414
|
apiKey = await resolveApiKey();
|
|
393
415
|
if (!apiKey) {
|
|
394
|
-
console.error("
|
|
416
|
+
console.error(t("keyNotSaved"));
|
|
395
417
|
process.exitCode = 1;
|
|
396
418
|
return;
|
|
397
419
|
}
|
|
@@ -402,7 +424,7 @@ async function main() {
|
|
|
402
424
|
if (parsed.resume) {
|
|
403
425
|
const existing = await findLatestSession(cwd);
|
|
404
426
|
if (!existing) {
|
|
405
|
-
console.error("
|
|
427
|
+
console.error(t("noSessionToResume"));
|
|
406
428
|
process.exitCode = 1;
|
|
407
429
|
return;
|
|
408
430
|
}
|
|
@@ -428,6 +450,10 @@ async function main() {
|
|
|
428
450
|
messages,
|
|
429
451
|
usage: new UsageAccumulator(),
|
|
430
452
|
};
|
|
453
|
+
if (config.verifyCommand)
|
|
454
|
+
state.verifyCommand = config.verifyCommand;
|
|
455
|
+
if (config.notifyCommand)
|
|
456
|
+
state.notifyCommand = config.notifyCommand;
|
|
431
457
|
const budgetUsd = parsed.budgetUsd ?? config.budgetUsd;
|
|
432
458
|
if (budgetUsd !== undefined)
|
|
433
459
|
state.budgetUsd = budgetUsd;
|