tandem-mode 0.1.4 → 0.2.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 +8 -1
- package/README.sr.md +8 -1
- package/dist/agent/clipboard.js +4 -5
- package/dist/agent/clipboard.js.map +1 -1
- 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 +6 -6
- 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 +9 -9
- 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/cli.js +36 -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/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 +86 -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 +84 -0
- package/dist/i18n/sr.js.map +1 -0
- package/dist/orchestrator/orchestrate.js +35 -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 +24 -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/i18n/sr.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export const sr = {
|
|
2
|
+
helpText: `Komande:
|
|
3
|
+
/plan <zadatak> planner/worker/reviewer orkestracija
|
|
4
|
+
/model [deepseek-v4-pro|deepseek-v4-flash] prikaži ili promeni model
|
|
5
|
+
/thinking [on|off] uključi/isključi thinking mode
|
|
6
|
+
/effort [low|high|max] prikaži ili promeni reasoning effort
|
|
7
|
+
/status trenutna podešavanja i sesija
|
|
8
|
+
/usage utrošak tokena, procenjena cena, off-peak projekcija
|
|
9
|
+
/budget [iznos] prikaži ili postavi budžet u USD
|
|
10
|
+
/new nova sesija
|
|
11
|
+
/fork nova sesija sa kopijom trenutne istorije
|
|
12
|
+
/resume [id] nastavi poslednju ili navedenu sesiju
|
|
13
|
+
/paste [poruka] pošalji sliku iz clipboard-a
|
|
14
|
+
/clear očisti ekran
|
|
15
|
+
/help ova lista
|
|
16
|
+
/exit izlaz`,
|
|
17
|
+
usageLine: "Upotreba: {syntax}",
|
|
18
|
+
unknownCommand: "Nepoznata komanda: /{cmd}. Ukucaj /help.",
|
|
19
|
+
modelCurrent: "Trenutni model: {model}",
|
|
20
|
+
effortCurrent: "Trenutni effort: {effort}",
|
|
21
|
+
statusSession: "Sesija: {id}",
|
|
22
|
+
statusBudget: "Budžet: {value}",
|
|
23
|
+
statusNotSet: "nije postavljen",
|
|
24
|
+
statusVerify: "Verify komanda: {value}",
|
|
25
|
+
statusVerifyNone: "nije postavljena",
|
|
26
|
+
statusMessages: "Poruka u istoriji: {count}",
|
|
27
|
+
usageCalls: "Pozivi: {count}",
|
|
28
|
+
usageTokens: "Tokeni: {input} in ({cached} cached) / {output} out",
|
|
29
|
+
usageCost: "Procenjena cena: {cost}",
|
|
30
|
+
usageOffPeak: "Ova sesija bi off-peak koštala: {cost}",
|
|
31
|
+
usageBudget: "Budžet: {budget} (iskorišćeno {percent}%)",
|
|
32
|
+
budgetSet: "Budžet postavljen na {amount}.",
|
|
33
|
+
budgetCurrent: "Trenutni budžet: {amount}",
|
|
34
|
+
budgetNone: "Budžet nije postavljen.",
|
|
35
|
+
sessionNew: "Nova sesija: {id}",
|
|
36
|
+
sessionForked: "Sesija forkovana: {id} ({count} poruka preneto, originalna sesija netaknuta)",
|
|
37
|
+
sessionNotFound: "Sesija '{id}' nije pronađena.",
|
|
38
|
+
sessionNoneInDir: "Nema prethodne sesije u ovom direktorijumu.",
|
|
39
|
+
sessionResumed: "Nastavljena sesija: {id} ({count} poruka)",
|
|
40
|
+
toolDenied: " (odbijeno)",
|
|
41
|
+
toolMoreLines: " … ({count} linija)",
|
|
42
|
+
destructiveAction: "Destruktivna akcija: {call}",
|
|
43
|
+
approvalHint: "y = dozvoli, n = odbij, a = uvek dozvoli ovaj alat ovoj sesiji (odgovor ispod)",
|
|
44
|
+
approvalPrompt: "Dozvoli izvršavanje {call}? (y/n/a — a = uvek dozvoli ovaj alat)",
|
|
45
|
+
autoApproved: "[--yes] auto-odobreno: {call}",
|
|
46
|
+
errorPrefix: "Greška: {message}",
|
|
47
|
+
maxIterations: "Dostignut je maksimalan broj iteracija bez finalnog odgovora.",
|
|
48
|
+
budgetExceeded: "Budžet od {budget} je dostignut (potrošeno ~{spent}). Petlja je zaustavljena pre sledećeg poziva — sesija je sačuvana, povećaj budžet sa /budget i nastavi.",
|
|
49
|
+
interrupted: "⏹ Prekinuto (ESC). Sesija je sačuvana do ove tačke.",
|
|
50
|
+
orchestrationInterrupted: "⏹ Orkestracija prekinuta (ESC).",
|
|
51
|
+
orchestrationError: "Greška u orkestraciji: {message}",
|
|
52
|
+
replHint: "/help za komande, /exit za izlaz.\n",
|
|
53
|
+
peakWarning: "⚠ Trenutno je peak sat (01–04h ili 06–10h UTC) — cene su duplo veće nego off-peak.\n",
|
|
54
|
+
waitForTurn: "Sačekaj da se trenutni potez završi.",
|
|
55
|
+
pasteNoImage: "Nema slike u clipboard-u.",
|
|
56
|
+
noApiKey: "Nema DeepSeek API ključa. Postavi DEEPSEEK_API_KEY env promenljivu ili pokreni tandem interaktivno da odradiš first-run wizard.",
|
|
57
|
+
keyNotSaved: "Ključ nije sačuvan ispravno — pokušaj ponovo.",
|
|
58
|
+
noSessionToResume: "Nema prethodne sesije za nastavak u ovom direktorijumu.",
|
|
59
|
+
wizardIntro: "Prvo pokretanje — potreban je DeepSeek API ključ.\n",
|
|
60
|
+
wizardLanguage: "Jezik:",
|
|
61
|
+
wizardApiKey: "DeepSeek API ključ:",
|
|
62
|
+
wizardKeyEmpty: "Ključ ne može biti prazan.",
|
|
63
|
+
wizardModel: "Podrazumevani model:",
|
|
64
|
+
wizardModelPro: "deepseek-v4-pro (jači, skuplji)",
|
|
65
|
+
wizardModelFlash: "deepseek-v4-flash (brži, jeftiniji)",
|
|
66
|
+
wizardEffort: "Podrazumevani reasoning effort:",
|
|
67
|
+
wizardSaved: "\nSačuvano — ključ je u OS credential store-u, podešavanja u ~/.tandem/config.json.\n",
|
|
68
|
+
orchPlanning: "\n📋 Planiram...\n",
|
|
69
|
+
orchPlan: "Plan: {summary}",
|
|
70
|
+
orchWorker: "\n🔧 Worker: {description}\n",
|
|
71
|
+
orchWorkerCorrection: "\n🔧 Worker (korekcija): {description}\n",
|
|
72
|
+
orchReviewer: "\n🔍 Reviewer proverava...\n",
|
|
73
|
+
orchVerify: "\n🧪 Verify: {command}\n",
|
|
74
|
+
orchVerifyPassed: " prošlo",
|
|
75
|
+
orchVerifyFailed: " palo (exit {code})",
|
|
76
|
+
orchApproved: "✅ Reviewer odobrio. {notes}\n",
|
|
77
|
+
orchChangesRequested: "⚠ Reviewer traži izmene ({loops}/{max}): {notes}",
|
|
78
|
+
orchMaxLoops: "\n❌ Dostignut max_review_loops ({max}) bez odobrenja — proveri ručno.\n",
|
|
79
|
+
clipboardCmdNotFound: 'Komanda "{cmd}" nije pronađena. {hint}',
|
|
80
|
+
clipboardInstallWl: "Instaliraj wl-clipboard (npr. sudo apt install wl-clipboard).",
|
|
81
|
+
clipboardInstallXclip: "Instaliraj xclip (npr. sudo apt install xclip).",
|
|
82
|
+
clipboardUnsupported: 'Clipboard paste slike nije podržan na platformi "{platform}".',
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=sr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sr.js","sourceRoot":"","sources":["../../src/i18n/sr.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAA+B;IAC5C,QAAQ,EAAE;;;;;;;;;;;;;;oDAcwC;IAElD,SAAS,EAAE,oBAAoB;IAC/B,cAAc,EAAE,0CAA0C;IAE1D,YAAY,EAAE,yBAAyB;IACvC,aAAa,EAAE,2BAA2B;IAE1C,aAAa,EAAE,cAAc;IAC7B,YAAY,EAAE,iBAAiB;IAC/B,YAAY,EAAE,iBAAiB;IAC/B,YAAY,EAAE,yBAAyB;IACvC,gBAAgB,EAAE,kBAAkB;IACpC,cAAc,EAAE,4BAA4B;IAE5C,UAAU,EAAE,iBAAiB;IAC7B,WAAW,EAAE,qDAAqD;IAClE,SAAS,EAAE,yBAAyB;IACpC,YAAY,EAAE,wCAAwC;IACtD,WAAW,EAAE,2CAA2C;IAExD,SAAS,EAAE,gCAAgC;IAC3C,aAAa,EAAE,2BAA2B;IAC1C,UAAU,EAAE,yBAAyB;IAErC,UAAU,EAAE,mBAAmB;IAC/B,aAAa,EAAE,8EAA8E;IAC7F,eAAe,EAAE,+BAA+B;IAChD,gBAAgB,EAAE,6CAA6C;IAC/D,cAAc,EAAE,2CAA2C;IAE3D,UAAU,EAAE,aAAa;IACzB,aAAa,EAAE,qBAAqB;IACpC,iBAAiB,EAAE,6BAA6B;IAChD,YAAY,EAAE,gFAAgF;IAC9F,cAAc,EAAE,kEAAkE;IAClF,YAAY,EAAE,+BAA+B;IAC7C,WAAW,EAAE,mBAAmB;IAChC,aAAa,EAAE,+DAA+D;IAC9E,cAAc,EACZ,6JAA6J;IAC/J,WAAW,EAAE,qDAAqD;IAClE,wBAAwB,EAAE,iCAAiC;IAC3D,kBAAkB,EAAE,kCAAkC;IAEtD,QAAQ,EAAE,qCAAqC;IAC/C,WAAW,EAAE,sFAAsF;IACnG,WAAW,EAAE,sCAAsC;IACnD,YAAY,EAAE,2BAA2B;IAEzC,QAAQ,EACN,iIAAiI;IACnI,WAAW,EAAE,+CAA+C;IAC5D,iBAAiB,EAAE,yDAAyD;IAE5E,WAAW,EAAE,qDAAqD;IAClE,cAAc,EAAE,QAAQ;IACxB,YAAY,EAAE,qBAAqB;IACnC,cAAc,EAAE,4BAA4B;IAC5C,WAAW,EAAE,sBAAsB;IACnC,cAAc,EAAE,iCAAiC;IACjD,gBAAgB,EAAE,qCAAqC;IACvD,YAAY,EAAE,iCAAiC;IAC/C,WAAW,EAAE,uFAAuF;IAEpG,YAAY,EAAE,oBAAoB;IAClC,QAAQ,EAAE,iBAAiB;IAC3B,UAAU,EAAE,8BAA8B;IAC1C,oBAAoB,EAAE,0CAA0C;IAChE,YAAY,EAAE,8BAA8B;IAC5C,UAAU,EAAE,0BAA0B;IACtC,gBAAgB,EAAE,UAAU;IAC5B,gBAAgB,EAAE,sBAAsB;IACxC,YAAY,EAAE,+BAA+B;IAC7C,oBAAoB,EAAE,kDAAkD;IACxE,YAAY,EAAE,yEAAyE;IAEvF,oBAAoB,EAAE,wCAAwC;IAC9D,kBAAkB,EAAE,+DAA+D;IACnF,qBAAqB,EAAE,iDAAiD;IACxE,oBAAoB,EAAE,+DAA+D;CACtF,CAAC"}
|
|
@@ -2,30 +2,45 @@ import { gitDiffTool } from "../agent/tools/gitDiff.js";
|
|
|
2
2
|
import { buildRepoMap } from "./repoMap.js";
|
|
3
3
|
import { runPlanner } from "./planner.js";
|
|
4
4
|
import { runReviewer } from "./reviewer.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
import { runShell } from "../agent/tools/shell.js";
|
|
6
|
+
import { t } from "../i18n/index.js";
|
|
7
|
+
const WORKER_SYSTEM_PROMPT = `You are a worker in a Tandem Mode orchestration. You get ONE concrete task from
|
|
8
|
+
the plan below, with a repository map. You have no access to the conversation
|
|
9
|
+
that produced the plan — everything you need is here. Carry out the task using the tools
|
|
10
|
+
(read_file, list_dir, search, edit, git_diff, shell, view_image). When
|
|
11
|
+
you are done, answer concisely without tool calls so the loop stops.`;
|
|
10
12
|
function buildStablePrefix(plan, repoMap) {
|
|
11
|
-
return `${WORKER_SYSTEM_PROMPT}\n\nPlan (
|
|
13
|
+
return `${WORKER_SYSTEM_PROMPT}\n\nPlan (full, for context):\n${JSON.stringify(plan)}\n\nRepository map:\n${repoMap}`;
|
|
14
|
+
}
|
|
15
|
+
async function runVerify(command, cwd, signal) {
|
|
16
|
+
console.log(t("orchVerify", { command }));
|
|
17
|
+
try {
|
|
18
|
+
const { output, exitCode } = await runShell(command, cwd, signal);
|
|
19
|
+
console.log(exitCode === 0 ? t("orchVerifyPassed") : t("orchVerifyFailed", { code: String(exitCode) }));
|
|
20
|
+
return { command, exitCode, output };
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
if (err instanceof Error && err.name === "AbortError")
|
|
24
|
+
throw err;
|
|
25
|
+
return { command, exitCode: null, output: err.message };
|
|
26
|
+
}
|
|
12
27
|
}
|
|
13
28
|
export async function runOrchestration(task, opts) {
|
|
14
|
-
console.log("
|
|
29
|
+
console.log(t("orchPlanning"));
|
|
15
30
|
const repoMap = await buildRepoMap(opts.cwd);
|
|
16
31
|
const { plan, usage: plannerUsage } = await runPlanner(opts.env, task, repoMap, opts.signal);
|
|
17
32
|
opts.usage.add("deepseek-v4-pro", plannerUsage);
|
|
18
|
-
console.log(
|
|
19
|
-
plan.tasks.forEach((
|
|
33
|
+
console.log(t("orchPlan", { summary: plan.summary }));
|
|
34
|
+
plan.tasks.forEach((planTask, i) => console.log(` ${i + 1}. [${planTask.id}] ${planTask.description}`));
|
|
20
35
|
const stablePrefix = buildStablePrefix(plan, repoMap);
|
|
21
36
|
const workerThinking = { reasoningEffort: "high" };
|
|
22
|
-
for (const
|
|
37
|
+
for (const planTask of plan.tasks) {
|
|
23
38
|
if (opts.signal?.aborted)
|
|
24
39
|
return;
|
|
25
|
-
console.log(
|
|
40
|
+
console.log(t("orchWorker", { description: planTask.description }));
|
|
26
41
|
const messages = [
|
|
27
42
|
{ role: "system", content: stablePrefix },
|
|
28
|
-
{ role: "user", content: `Task: ${
|
|
43
|
+
{ role: "user", content: `Task: ${planTask.description}\nAcceptance criteria: ${planTask.acceptanceCriteria}` },
|
|
29
44
|
];
|
|
30
45
|
await opts.runWorkerTurn({ messages, model: "deepseek-v4-flash", thinking: workerThinking, ...(opts.signal ? { signal: opts.signal } : {}) });
|
|
31
46
|
}
|
|
@@ -33,28 +48,29 @@ export async function runOrchestration(task, opts) {
|
|
|
33
48
|
for (;;) {
|
|
34
49
|
if (opts.signal?.aborted)
|
|
35
50
|
return;
|
|
36
|
-
console.log("
|
|
51
|
+
console.log(t("orchReviewer"));
|
|
37
52
|
const diffResult = await gitDiffTool.execute({}, { cwd: opts.cwd, env: opts.env, usage: opts.usage });
|
|
38
|
-
const
|
|
53
|
+
const verify = opts.verifyCommand ? await runVerify(opts.verifyCommand, opts.cwd, opts.signal) : undefined;
|
|
54
|
+
const { result: review, usage: reviewUsage } = await runReviewer(opts.env, task, plan, diffResult.output, verify, opts.signal);
|
|
39
55
|
opts.usage.add("deepseek-v4-pro", reviewUsage);
|
|
40
56
|
if (review.approved) {
|
|
41
|
-
console.log(
|
|
57
|
+
console.log(t("orchApproved", { notes: review.notes }));
|
|
42
58
|
return;
|
|
43
59
|
}
|
|
44
60
|
loops++;
|
|
45
|
-
console.log(
|
|
61
|
+
console.log(t("orchChangesRequested", { loops, max: opts.maxReviewLoops, notes: review.notes }));
|
|
46
62
|
review.corrections.forEach((c) => console.log(` - ${c.description}`));
|
|
47
63
|
if (loops >= opts.maxReviewLoops) {
|
|
48
|
-
console.log(
|
|
64
|
+
console.log(t("orchMaxLoops", { max: opts.maxReviewLoops }));
|
|
49
65
|
return;
|
|
50
66
|
}
|
|
51
67
|
for (const correction of review.corrections) {
|
|
52
68
|
if (opts.signal?.aborted)
|
|
53
69
|
return;
|
|
54
|
-
console.log(
|
|
70
|
+
console.log(t("orchWorkerCorrection", { description: correction.description }));
|
|
55
71
|
const messages = [
|
|
56
72
|
{ role: "system", content: stablePrefix },
|
|
57
|
-
{ role: "user", content: `
|
|
73
|
+
{ role: "user", content: `Correction from the reviewer: ${correction.description}` },
|
|
58
74
|
];
|
|
59
75
|
await opts.runWorkerTurn({ messages, model: "deepseek-v4-flash", thinking: workerThinking, ...(opts.signal ? { signal: opts.signal } : {}) });
|
|
60
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrate.js","sourceRoot":"","sources":["../../src/orchestrator/orchestrate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"orchestrate.js","sourceRoot":"","sources":["../../src/orchestrator/orchestrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { chatCompletionOnce } from "../deepseek/client.js";
|
|
2
2
|
import { isPlan } from "./types.js";
|
|
3
|
-
const PLANNER_SYSTEM_PROMPT = `
|
|
4
|
-
|
|
5
|
-
(
|
|
6
|
-
git_diff/shell/view_image)
|
|
3
|
+
const PLANNER_SYSTEM_PROMPT = `You are the planner in the Tandem Mode coding agent. You receive a task and a map
|
|
4
|
+
of the repository. Split the task into small, independent steps that a worker model
|
|
5
|
+
(with no access to this conversation, only the tools read_file/list_dir/search/edit/
|
|
6
|
+
git_diff/shell/view_image) can carry out on its own.
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Respond ONLY with valid JSON, with no markdown fences, in exactly this schema:
|
|
9
9
|
{
|
|
10
|
-
"summary": "
|
|
10
|
+
"summary": "short description of the approach",
|
|
11
11
|
"tasks": [
|
|
12
12
|
{ "id": "t1", "description": "...", "files": ["..."], "acceptanceCriteria": "..." }
|
|
13
13
|
]
|
|
@@ -22,7 +22,7 @@ export async function runPlanner(env, task, repoMap, signal) {
|
|
|
22
22
|
jsonOutput: true,
|
|
23
23
|
messages: [
|
|
24
24
|
{ role: "system", content: PLANNER_SYSTEM_PROMPT },
|
|
25
|
-
{ role: "user", content: `
|
|
25
|
+
{ role: "user", content: `Task:\n${task}\n\nRepository map:\n${repoMap}` },
|
|
26
26
|
],
|
|
27
27
|
...(signal ? { signal } : {}),
|
|
28
28
|
});
|
|
@@ -31,11 +31,11 @@ export async function runPlanner(env, task, repoMap, signal) {
|
|
|
31
31
|
parsed = JSON.parse(result.content);
|
|
32
32
|
}
|
|
33
33
|
catch {
|
|
34
|
-
lastError = new Error(`Planner
|
|
34
|
+
lastError = new Error(`Planner did not return valid JSON (attempt ${attempt}):\n${result.content.slice(0, 500)}`);
|
|
35
35
|
continue;
|
|
36
36
|
}
|
|
37
37
|
if (!isPlan(parsed)) {
|
|
38
|
-
lastError = new Error(`Planner JSON
|
|
38
|
+
lastError = new Error(`Planner JSON does not follow the expected schema (attempt ${attempt}):\n${result.content.slice(0, 500)}`);
|
|
39
39
|
continue;
|
|
40
40
|
}
|
|
41
41
|
return { plan: parsed, usage: result.usage };
|
|
@@ -43,6 +43,6 @@ export async function runPlanner(env, task, repoMap, signal) {
|
|
|
43
43
|
// Poznato ponašanje: json_object mod povremeno vrati prazan/nevalidan
|
|
44
44
|
// sadržaj (verovatno prolazna API nestabilnost, ne dosledna greška —
|
|
45
45
|
// videti docs/api-notes.md). Jedan retry pokriva to bez rušenja pozivaoca.
|
|
46
|
-
throw lastError ?? new Error("Planner
|
|
46
|
+
throw lastError ?? new Error("Planner failed after multiple attempts.");
|
|
47
47
|
}
|
|
48
48
|
//# sourceMappingURL=planner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/orchestrator/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,EAAE,MAAM,EAAa,MAAM,YAAY,CAAC;AAE/C,MAAM,qBAAqB,GAAG;;;;;;;;;;;EAW5B,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAc,EACd,IAAY,EACZ,OAAe,EACf,MAAoB;IAEpB,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE;YAC3C,KAAK,EAAE,iBAAiB;YACxB,QAAQ,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE;YACpC,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE;gBAClD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/orchestrator/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,EAAE,MAAM,EAAa,MAAM,YAAY,CAAC;AAE/C,MAAM,qBAAqB,GAAG;;;;;;;;;;;EAW5B,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAc,EACd,IAAY,EACZ,OAAe,EACf,MAAoB;IAEpB,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE;YAC3C,KAAK,EAAE,iBAAiB;YACxB,QAAQ,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE;YACpC,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE;gBAClD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,IAAI,wBAAwB,OAAO,EAAE,EAAE;aAC3E;YACD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;QAEH,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,IAAI,KAAK,CAAC,8CAA8C,OAAO,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAClH,SAAS;QACX,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACpB,SAAS,GAAG,IAAI,KAAK,CAAC,6DAA6D,OAAO,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACjI,SAAS;QACX,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED,sEAAsE;IACtE,qEAAqE;IACrE,2EAA2E;IAC3E,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -47,6 +47,6 @@ export async function buildRepoMap(cwd) {
|
|
|
47
47
|
const files = (await listViaGit(cwd)) ?? (await listViaFs(cwd));
|
|
48
48
|
const truncated = files.length > MAX_FILES;
|
|
49
49
|
const listed = files.slice(0, MAX_FILES).sort();
|
|
50
|
-
return (listed.join("\n") + (truncated ? `\n... (
|
|
50
|
+
return (listed.join("\n") + (truncated ? `\n... (truncated, ${files.length} files in total)` : ""));
|
|
51
51
|
}
|
|
52
52
|
//# sourceMappingURL=repoMap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repoMap.js","sourceRoot":"","sources":["../../src/orchestrator/repoMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QAClG,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,UAAU,IAAI,CAAC,GAAW;QAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,SAAS;YAAE,OAAO;QACxC,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,MAAM,IAAI,SAAS;gBAAE,OAAO;YACxC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+GAA+G;AAC/G,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,KAAK,GAAG,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"repoMap.js","sourceRoot":"","sources":["../../src/orchestrator/repoMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QAClG,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,UAAU,IAAI,CAAC,GAAW;QAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,SAAS;YAAE,OAAO;QACxC,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,MAAM,IAAI,SAAS;gBAAE,OAAO;YACxC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+GAA+G;AAC/G,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,KAAK,GAAG,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAC3F,CAAC;AACJ,CAAC"}
|
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
import { chatCompletionOnce } from "../deepseek/client.js";
|
|
2
2
|
import { isReviewResult } from "./types.js";
|
|
3
|
-
const REVIEWER_SYSTEM_PROMPT = `
|
|
4
|
-
plan
|
|
5
|
-
diff
|
|
6
|
-
|
|
3
|
+
const REVIEWER_SYSTEM_PROMPT = `You are the reviewer in the Tandem Mode coding agent. You receive the original task,
|
|
4
|
+
the plan the worker(s) carried out, and the git diff of the actual changes. Check whether the
|
|
5
|
+
diff really fulfills the task and the plan's acceptance criteria, contains no
|
|
6
|
+
unnecessary changes, and that the code is reasonable. If a check result
|
|
7
|
+
(build/test) is attached, a non-zero exit code means the change does not pass — in that case do not
|
|
8
|
+
approve, and name the concrete error from the output in "corrections".
|
|
7
9
|
|
|
8
|
-
|
|
10
|
+
Respond ONLY with valid JSON, with no markdown fences, in exactly this schema:
|
|
9
11
|
{
|
|
10
12
|
"approved": true|false,
|
|
11
|
-
"notes": "
|
|
13
|
+
"notes": "brief justification",
|
|
12
14
|
"corrections": [{ "description": "...", "files": ["..."] }]
|
|
13
15
|
}
|
|
14
|
-
"corrections"
|
|
16
|
+
"corrections" is an empty array if approved is true.`;
|
|
15
17
|
const MAX_ATTEMPTS = 2;
|
|
16
|
-
|
|
18
|
+
const MAX_VERIFY_CHARS = 6000;
|
|
19
|
+
function formatVerify(verify) {
|
|
20
|
+
// Greške build/test alata su obično na kraju izlaza, pa čuvamo rep, ne glavu.
|
|
21
|
+
const out = verify.output.length > MAX_VERIFY_CHARS ? "...(truncated)\n" + verify.output.slice(-MAX_VERIFY_CHARS) : verify.output;
|
|
22
|
+
return `\n\nCheck result (${verify.command}), exit code ${verify.exitCode ?? "n/a (not run)"}:\n${out || "(no output)"}`;
|
|
23
|
+
}
|
|
24
|
+
export async function runReviewer(env, originalTask, plan, gitDiff, verify, signal) {
|
|
17
25
|
let lastError;
|
|
18
26
|
for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
|
|
19
27
|
const response = await chatCompletionOnce(env, {
|
|
@@ -24,7 +32,7 @@ export async function runReviewer(env, originalTask, plan, gitDiff, signal) {
|
|
|
24
32
|
{ role: "system", content: REVIEWER_SYSTEM_PROMPT },
|
|
25
33
|
{
|
|
26
34
|
role: "user",
|
|
27
|
-
content: `
|
|
35
|
+
content: `Original task:\n${originalTask}\n\nPlan:\n${JSON.stringify(plan, null, 2)}\n\nGit diff:\n${gitDiff.slice(0, 15000)}${verify ? formatVerify(verify) : ""}`,
|
|
28
36
|
},
|
|
29
37
|
],
|
|
30
38
|
...(signal ? { signal } : {}),
|
|
@@ -34,11 +42,11 @@ export async function runReviewer(env, originalTask, plan, gitDiff, signal) {
|
|
|
34
42
|
parsed = JSON.parse(response.content);
|
|
35
43
|
}
|
|
36
44
|
catch {
|
|
37
|
-
lastError = new Error(`Reviewer
|
|
45
|
+
lastError = new Error(`Reviewer did not return valid JSON (attempt ${attempt}):\n${response.content.slice(0, 500)}`);
|
|
38
46
|
continue;
|
|
39
47
|
}
|
|
40
48
|
if (!isReviewResult(parsed)) {
|
|
41
|
-
lastError = new Error(`Reviewer JSON
|
|
49
|
+
lastError = new Error(`Reviewer JSON does not follow the expected schema (attempt ${attempt}):\n${response.content.slice(0, 500)}`);
|
|
42
50
|
continue;
|
|
43
51
|
}
|
|
44
52
|
const result = {
|
|
@@ -48,6 +56,6 @@ export async function runReviewer(env, originalTask, plan, gitDiff, signal) {
|
|
|
48
56
|
};
|
|
49
57
|
return { result, usage: response.usage };
|
|
50
58
|
}
|
|
51
|
-
throw lastError ?? new Error("Reviewer
|
|
59
|
+
throw lastError ?? new Error("Reviewer failed after multiple attempts.");
|
|
52
60
|
}
|
|
53
61
|
//# sourceMappingURL=reviewer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../src/orchestrator/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,EAAE,cAAc,EAAgC,MAAM,YAAY,CAAC;AAE1E,MAAM,sBAAsB,GAAG
|
|
1
|
+
{"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../src/orchestrator/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,EAAE,cAAc,EAAgC,MAAM,YAAY,CAAC;AAE1E,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;qDAasB,CAAC;AAEtD,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAQ9B,SAAS,YAAY,CAAC,MAAoB;IACxC,8EAA8E;IAC9E,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAClI,OAAO,qBAAqB,MAAM,CAAC,OAAO,gBAAgB,MAAM,CAAC,QAAQ,IAAI,eAAe,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;AAC3H,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAc,EACd,YAAoB,EACpB,IAAU,EACV,OAAe,EACf,MAAqB,EACrB,MAAoB;IAEpB,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE;YAC7C,KAAK,EAAE,iBAAiB;YACxB,QAAQ,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE;YACrC,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAsB,EAAE;gBACnD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,mBAAmB,YAAY,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;iBACpK;aACF;YACD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;QAEH,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,IAAI,KAAK,CAAC,+CAA+C,OAAO,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACrH,SAAS;QACX,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,SAAS,GAAG,IAAI,KAAK,CAAC,8DAA8D,OAAO,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACpI,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAiB;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;YACzB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;SACtC,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC3E,CAAC"}
|
package/dist/repl/commands.js
CHANGED
|
@@ -1,26 +1,12 @@
|
|
|
1
1
|
import { createSession, findLatestSession, findSessionById, loadSessionMessages, appendSessionMessage, } from "../agent/session.js";
|
|
2
2
|
import { SYSTEM_PROMPT } from "./system-prompt.js";
|
|
3
|
-
|
|
4
|
-
/plan <zadatak> planner/worker/reviewer orkestracija
|
|
5
|
-
/model [deepseek-v4-pro|deepseek-v4-flash] prikaži ili promeni model
|
|
6
|
-
/thinking [on|off] uključi/isključi thinking mode
|
|
7
|
-
/effort [low|high|max] prikaži ili promeni reasoning effort
|
|
8
|
-
/status trenutna podešavanja i sesija
|
|
9
|
-
/usage utrošak tokena, procenjena cena, off-peak projekcija
|
|
10
|
-
/budget [iznos] prikaži ili postavi budžet u USD
|
|
11
|
-
/new nova sesija
|
|
12
|
-
/fork nova sesija sa kopijom trenutne istorije
|
|
13
|
-
/resume [id] nastavi poslednju ili navedenu sesiju
|
|
14
|
-
/paste [poruka] pošalji sliku iz clipboard-a (Windows)
|
|
15
|
-
/clear očisti ekran
|
|
16
|
-
/help ova lista
|
|
17
|
-
/exit izlaz`;
|
|
3
|
+
import { t } from "../i18n/index.js";
|
|
18
4
|
export async function handleCommand(line, state) {
|
|
19
5
|
const [cmd = "", ...rest] = line.slice(1).trim().split(/\s+/);
|
|
20
6
|
const arg = rest.join(" ").trim();
|
|
21
7
|
switch (cmd) {
|
|
22
8
|
case "help":
|
|
23
|
-
console.log(
|
|
9
|
+
console.log(t("helpText"));
|
|
24
10
|
return "continue";
|
|
25
11
|
case "exit":
|
|
26
12
|
case "quit":
|
|
@@ -31,10 +17,10 @@ export async function handleCommand(line, state) {
|
|
|
31
17
|
console.log(`Model: ${arg}`);
|
|
32
18
|
}
|
|
33
19
|
else if (!arg) {
|
|
34
|
-
console.log(
|
|
20
|
+
console.log(t("modelCurrent", { model: state.model }));
|
|
35
21
|
}
|
|
36
22
|
else {
|
|
37
|
-
console.log("
|
|
23
|
+
console.log(t("usageLine", { syntax: "/model deepseek-v4-pro|deepseek-v4-flash" }));
|
|
38
24
|
}
|
|
39
25
|
return "continue";
|
|
40
26
|
case "thinking":
|
|
@@ -46,7 +32,7 @@ export async function handleCommand(line, state) {
|
|
|
46
32
|
console.log(`Thinking: ${state.thinkingEnabled ? "on" : "off"}`);
|
|
47
33
|
}
|
|
48
34
|
else {
|
|
49
|
-
console.log("
|
|
35
|
+
console.log(t("usageLine", { syntax: "/thinking on|off" }));
|
|
50
36
|
}
|
|
51
37
|
return "continue";
|
|
52
38
|
case "effort":
|
|
@@ -55,33 +41,34 @@ export async function handleCommand(line, state) {
|
|
|
55
41
|
console.log(`Reasoning effort: ${arg}`);
|
|
56
42
|
}
|
|
57
43
|
else if (!arg) {
|
|
58
|
-
console.log(
|
|
44
|
+
console.log(t("effortCurrent", { effort: state.reasoningEffort }));
|
|
59
45
|
}
|
|
60
46
|
else {
|
|
61
|
-
console.log("
|
|
47
|
+
console.log(t("usageLine", { syntax: "/effort low|high|max" }));
|
|
62
48
|
}
|
|
63
49
|
return "continue";
|
|
64
50
|
case "status": {
|
|
65
|
-
console.log(
|
|
51
|
+
console.log(t("statusSession", { id: state.session.id }));
|
|
66
52
|
console.log(`Model: ${state.model}`);
|
|
67
53
|
console.log(`Thinking: ${state.thinkingEnabled ? `on (${state.reasoningEffort})` : "off"}`);
|
|
68
|
-
console.log(
|
|
54
|
+
console.log(t("statusBudget", { value: state.budgetUsd !== undefined ? `$${state.budgetUsd.toFixed(2)}` : t("statusNotSet") }));
|
|
69
55
|
console.log(`Max review loops: ${state.maxReviewLoops}`);
|
|
70
|
-
console.log(
|
|
56
|
+
console.log(t("statusVerify", { value: state.verifyCommand ?? t("statusVerifyNone") }));
|
|
57
|
+
console.log(t("statusMessages", { count: state.messages.length }));
|
|
71
58
|
return "continue";
|
|
72
59
|
}
|
|
73
60
|
case "usage": {
|
|
74
61
|
const totals = state.usage.totals();
|
|
75
62
|
const cost = state.usage.estimatedCostUsd();
|
|
76
63
|
const offPeakCost = state.usage.offPeakEquivalentCostUsd();
|
|
77
|
-
console.log(
|
|
78
|
-
console.log(
|
|
79
|
-
console.log(
|
|
64
|
+
console.log(t("usageCalls", { count: state.usage.callCount }));
|
|
65
|
+
console.log(t("usageTokens", { input: totals.promptTokens, cached: totals.promptCacheHitTokens, output: totals.completionTokens }));
|
|
66
|
+
console.log(t("usageCost", { cost: `$${cost.toFixed(4)}` }));
|
|
80
67
|
if (Math.abs(cost - offPeakCost) > 0.0000001) {
|
|
81
|
-
console.log(
|
|
68
|
+
console.log(t("usageOffPeak", { cost: `$${offPeakCost.toFixed(4)}` }));
|
|
82
69
|
}
|
|
83
70
|
if (state.budgetUsd !== undefined) {
|
|
84
|
-
console.log(
|
|
71
|
+
console.log(t("usageBudget", { budget: `$${state.budgetUsd.toFixed(2)}`, percent: ((cost / state.budgetUsd) * 100).toFixed(0) }));
|
|
85
72
|
}
|
|
86
73
|
return "continue";
|
|
87
74
|
}
|
|
@@ -90,14 +77,14 @@ export async function handleCommand(line, state) {
|
|
|
90
77
|
const n = Number(arg);
|
|
91
78
|
if (Number.isFinite(n) && n > 0) {
|
|
92
79
|
state.budgetUsd = n;
|
|
93
|
-
console.log(
|
|
80
|
+
console.log(t("budgetSet", { amount: `$${n.toFixed(2)}` }));
|
|
94
81
|
}
|
|
95
82
|
else {
|
|
96
|
-
console.log("
|
|
83
|
+
console.log(t("usageLine", { syntax: "/budget <USD>" }));
|
|
97
84
|
}
|
|
98
85
|
}
|
|
99
86
|
else {
|
|
100
|
-
console.log(state.budgetUsd !== undefined ?
|
|
87
|
+
console.log(state.budgetUsd !== undefined ? t("budgetCurrent", { amount: `$${state.budgetUsd.toFixed(2)}` }) : t("budgetNone"));
|
|
101
88
|
}
|
|
102
89
|
return "continue";
|
|
103
90
|
case "new": {
|
|
@@ -105,7 +92,7 @@ export async function handleCommand(line, state) {
|
|
|
105
92
|
const systemMsg = { role: "system", content: SYSTEM_PROMPT };
|
|
106
93
|
state.messages = [systemMsg];
|
|
107
94
|
await appendSessionMessage(state.session, systemMsg);
|
|
108
|
-
console.log(
|
|
95
|
+
console.log(t("sessionNew", { id: state.session.id }));
|
|
109
96
|
return "continue";
|
|
110
97
|
}
|
|
111
98
|
case "fork": {
|
|
@@ -114,25 +101,25 @@ export async function handleCommand(line, state) {
|
|
|
114
101
|
await appendSessionMessage(forked, msg);
|
|
115
102
|
}
|
|
116
103
|
state.session = forked;
|
|
117
|
-
console.log(
|
|
104
|
+
console.log(t("sessionForked", { id: forked.id, count: state.messages.length }));
|
|
118
105
|
return "continue";
|
|
119
106
|
}
|
|
120
107
|
case "resume": {
|
|
121
108
|
const target = arg ? await findSessionById(state.cwd, arg) : await findLatestSession(state.cwd);
|
|
122
109
|
if (!target) {
|
|
123
|
-
console.log(arg ?
|
|
110
|
+
console.log(arg ? t("sessionNotFound", { id: arg }) : t("sessionNoneInDir"));
|
|
124
111
|
return "continue";
|
|
125
112
|
}
|
|
126
113
|
state.messages = await loadSessionMessages(target.filePath);
|
|
127
114
|
state.session = target;
|
|
128
|
-
console.log(
|
|
115
|
+
console.log(t("sessionResumed", { id: target.id, count: state.messages.length }));
|
|
129
116
|
return "continue";
|
|
130
117
|
}
|
|
131
118
|
case "clear":
|
|
132
119
|
console.clear();
|
|
133
120
|
return "continue";
|
|
134
121
|
default:
|
|
135
|
-
console.log(
|
|
122
|
+
console.log(t("unknownCommand", { cmd }));
|
|
136
123
|
return "continue";
|
|
137
124
|
}
|
|
138
125
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/repl/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/repl/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
export const SYSTEM_PROMPT = `
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
export const SYSTEM_PROMPT = `You are Tandem Mode, a coding agent working in a real repository.
|
|
2
|
+
Use the tools (read_file, list_dir, search, edit, git_diff, shell) to explore
|
|
3
|
+
the code and make the requested change. When the task is done, answer
|
|
4
|
+
concisely without tool calls so the loop stops.
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
Do exactly what was asked — nothing more. Do not add support for platforms,
|
|
7
|
+
distributions or variants the user did not mention (e.g. if they ask for a
|
|
8
|
+
playbook for RHEL, do not also generate a Debian/Ubuntu version on the side).
|
|
9
|
+
Do not hardcode into generated code/configuration values you discovered while
|
|
10
|
+
exploring the local system (e.g. the currently installed package version)
|
|
11
|
+
unless the user explicitly asked to match that exact state — by default leave
|
|
12
|
+
a generic/latest version or a variable the user can fill in.
|
|
13
|
+
|
|
14
|
+
Reply in the language the user writes in.`;
|
|
13
15
|
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/repl/system-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/repl/system-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;0CAaa,CAAC"}
|