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.
Files changed (51) hide show
  1. package/README.md +8 -1
  2. package/README.sr.md +8 -1
  3. package/dist/agent/clipboard.js +4 -5
  4. package/dist/agent/clipboard.js.map +1 -1
  5. package/dist/agent/loop.js +2 -2
  6. package/dist/agent/loop.js.map +1 -1
  7. package/dist/agent/tools/edit.js +11 -11
  8. package/dist/agent/tools/edit.js.map +1 -1
  9. package/dist/agent/tools/gitDiff.js +6 -6
  10. package/dist/agent/tools/gitDiff.js.map +1 -1
  11. package/dist/agent/tools/listDir.js +4 -4
  12. package/dist/agent/tools/listDir.js.map +1 -1
  13. package/dist/agent/tools/readFile.js +7 -7
  14. package/dist/agent/tools/readFile.js.map +1 -1
  15. package/dist/agent/tools/search.js +10 -10
  16. package/dist/agent/tools/search.js.map +1 -1
  17. package/dist/agent/tools/shell.js +9 -9
  18. package/dist/agent/tools/shell.js.map +1 -1
  19. package/dist/agent/tools/viewImage.js +4 -4
  20. package/dist/agent/tools/viewImage.js.map +1 -1
  21. package/dist/agent/tools/webSearch.js +3 -3
  22. package/dist/agent/tools/webSearch.js.map +1 -1
  23. package/dist/cli.js +36 -22
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config/credentials.js +5 -5
  26. package/dist/config/credentials.js.map +1 -1
  27. package/dist/config/schema.js.map +1 -1
  28. package/dist/deepseek/vision.js +4 -4
  29. package/dist/deepseek/vision.js.map +1 -1
  30. package/dist/deepseek/webSearch.js +1 -1
  31. package/dist/i18n/en.js +86 -0
  32. package/dist/i18n/en.js.map +1 -0
  33. package/dist/i18n/index.js +23 -0
  34. package/dist/i18n/index.js.map +1 -0
  35. package/dist/i18n/sr.js +84 -0
  36. package/dist/i18n/sr.js.map +1 -0
  37. package/dist/orchestrator/orchestrate.js +35 -19
  38. package/dist/orchestrator/orchestrate.js.map +1 -1
  39. package/dist/orchestrator/planner.js +10 -10
  40. package/dist/orchestrator/planner.js.map +1 -1
  41. package/dist/orchestrator/repoMap.js +1 -1
  42. package/dist/orchestrator/repoMap.js.map +1 -1
  43. package/dist/orchestrator/reviewer.js +20 -12
  44. package/dist/orchestrator/reviewer.js.map +1 -1
  45. package/dist/repl/commands.js +24 -37
  46. package/dist/repl/commands.js.map +1 -1
  47. package/dist/repl/system-prompt.js +13 -11
  48. package/dist/repl/system-prompt.js.map +1 -1
  49. package/dist/repl/wizard.js +17 -9
  50. package/dist/repl/wizard.js.map +1 -1
  51. package/package.json +1 -1
@@ -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
- const WORKER_SYSTEM_PROMPT = `Ti si worker u Tandem Mode orkestraciji. Dobijaš JEDAN konkretan task iz
6
- plana ispod, sa mapom repozitorijuma. Nemaš pristup razgovoru koji je
7
- proizveo plan — sve što ti treba je ovde. Izvrši task koristeći alate
8
- (read_file, list_dir, search, edit, git_diff, shell, view_image). Kad
9
- završiš, odgovori sažeto bez tool poziva da se petlja zaustavi.`;
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 (ceo, za kontekst):\n${JSON.stringify(plan)}\n\nMapa repozitorijuma:\n${repoMap}`;
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("\n📋 Planiram...\n");
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(`Plan: ${plan.summary}`);
19
- plan.tasks.forEach((t, i) => console.log(` ${i + 1}. [${t.id}] ${t.description}`));
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 t of plan.tasks) {
37
+ for (const planTask of plan.tasks) {
23
38
  if (opts.signal?.aborted)
24
39
  return;
25
- console.log(`\n🔧 Worker: ${t.description}\n`);
40
+ console.log(t("orchWorker", { description: planTask.description }));
26
41
  const messages = [
27
42
  { role: "system", content: stablePrefix },
28
- { role: "user", content: `Task: ${t.description}\nKriterijum prihvatanja: ${t.acceptanceCriteria}` },
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("\n🔍 Reviewer proverava...\n");
51
+ console.log(t("orchReviewer"));
37
52
  const diffResult = await gitDiffTool.execute({}, { cwd: opts.cwd, env: opts.env, usage: opts.usage });
38
- const { result: review, usage: reviewUsage } = await runReviewer(opts.env, task, plan, diffResult.output, opts.signal);
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(`✅ Reviewer odobrio. ${review.notes}\n`);
57
+ console.log(t("orchApproved", { notes: review.notes }));
42
58
  return;
43
59
  }
44
60
  loops++;
45
- console.log(`⚠ Reviewer traži izmene (${loops}/${opts.maxReviewLoops}): ${review.notes}`);
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(`\n❌ Dostignut max_review_loops (${opts.maxReviewLoops}) bez odobrenja — proveri ručno.\n`);
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(`\n🔧 Worker (korekcija): ${correction.description}\n`);
70
+ console.log(t("orchWorkerCorrection", { description: correction.description }));
55
71
  const messages = [
56
72
  { role: "system", content: stablePrefix },
57
- { role: "user", content: `Korekcija od reviewera: ${correction.description}` },
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":"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"}
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 = `Ti si planner u Tandem Mode coding agentu. Dobijaš zadatak i mapu
4
- repozitorijuma. Podeli zadatak na male, nezavisne korake koje worker model
5
- (bez pristupa ovom razgovoru, samo alatima read_file/list_dir/search/edit/
6
- git_diff/shell/view_image) može samostalno izvršiti.
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
- Odgovori ISKLJUČIVO validnim JSON-om, bez markdown ograda, tačno ove šeme:
8
+ Respond ONLY with valid JSON, with no markdown fences, in exactly this schema:
9
9
  {
10
- "summary": "kratak opis pristupa",
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: `Zadatak:\n${task}\n\nMapa repozitorijuma:\n${repoMap}` },
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 nije vratio validan JSON (pokušaj ${attempt}):\n${result.content.slice(0, 500)}`);
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 ne prati očekivanu šemu (pokušaj ${attempt}):\n${result.content.slice(0, 500)}`);
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 nije uspeo posle više pokušaja.");
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,aAAa,IAAI,6BAA6B,OAAO,EAAE,EAAE;aACnF;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,6CAA6C,OAAO,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACjH,SAAS;QACX,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACpB,SAAS,GAAG,IAAI,KAAK,CAAC,iDAAiD,OAAO,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACrH,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"}
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... (isečeno, ukupno ${files.length} fajlova)` : ""));
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,0BAA0B,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CACzF,CAAC;AACJ,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 = `Ti si reviewer u Tandem Mode coding agentu. Dobijaš originalni zadatak,
4
- plan koji je worker(i) izvršio, i git diff stvarnih izmena. Proveri da li
5
- diff zaista ispunjava zadatak i kriterijume prihvatanja iz plana, da nema
6
- nepotrebnih izmena, i da je kod razuman.
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
- Odgovori ISKLJUČIVO validnim JSON-om, bez markdown ograda, tačno ove šeme:
10
+ Respond ONLY with valid JSON, with no markdown fences, in exactly this schema:
9
11
  {
10
12
  "approved": true|false,
11
- "notes": "kratko obrazloženje",
13
+ "notes": "brief justification",
12
14
  "corrections": [{ "description": "...", "files": ["..."] }]
13
15
  }
14
- "corrections" je prazan niz ako je approved true.`;
16
+ "corrections" is an empty array if approved is true.`;
15
17
  const MAX_ATTEMPTS = 2;
16
- export async function runReviewer(env, originalTask, plan, gitDiff, signal) {
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: `Originalni zadatak:\n${originalTask}\n\nPlan:\n${JSON.stringify(plan, null, 2)}\n\nGit diff:\n${gitDiff.slice(0, 15000)}`,
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 nije vratio validan JSON (pokušaj ${attempt}):\n${response.content.slice(0, 500)}`);
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 ne prati očekivanu šemu (pokušaj ${attempt}):\n${response.content.slice(0, 500)}`);
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 nije uspeo posle više pokušaja.");
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;;;;;;;;;;;kDAWmB,CAAC;AAEnD,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAc,EACd,YAAoB,EACpB,IAAU,EACV,OAAe,EACf,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,wBAAwB,YAAY,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,kBAAkB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE;iBACpI;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,8CAA8C,OAAO,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACpH,SAAS;QACX,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,SAAS,GAAG,IAAI,KAAK,CAAC,kDAAkD,OAAO,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACxH,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"}
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"}
@@ -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
- const HELP_TEXT = `Komande:
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(HELP_TEXT);
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(`Trenutni model: ${state.model}`);
20
+ console.log(t("modelCurrent", { model: state.model }));
35
21
  }
36
22
  else {
37
- console.log("Upotreba: /model deepseek-v4-pro|deepseek-v4-flash");
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("Upotreba: /thinking on|off");
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(`Trenutni effort: ${state.reasoningEffort}`);
44
+ console.log(t("effortCurrent", { effort: state.reasoningEffort }));
59
45
  }
60
46
  else {
61
- console.log("Upotreba: /effort low|high|max");
47
+ console.log(t("usageLine", { syntax: "/effort low|high|max" }));
62
48
  }
63
49
  return "continue";
64
50
  case "status": {
65
- console.log(`Sesija: ${state.session.id}`);
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(`Budžet: ${state.budgetUsd !== undefined ? `$${state.budgetUsd.toFixed(2)}` : "nije postavljen"}`);
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(`Poruka u istoriji: ${state.messages.length}`);
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(`Pozivi: ${state.usage.callCount}`);
78
- console.log(`Tokeni: ${totals.promptTokens} in (${totals.promptCacheHitTokens} cached) / ${totals.completionTokens} out`);
79
- console.log(`Procenjena cena: $${cost.toFixed(4)}`);
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(`Ova sesija bi off-peak koštala: $${offPeakCost.toFixed(4)}`);
68
+ console.log(t("usageOffPeak", { cost: `$${offPeakCost.toFixed(4)}` }));
82
69
  }
83
70
  if (state.budgetUsd !== undefined) {
84
- console.log(`Budžet: $${state.budgetUsd.toFixed(2)} (iskorišćeno ${((cost / state.budgetUsd) * 100).toFixed(0)}%)`);
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(`Budžet postavljen na $${n.toFixed(2)}.`);
80
+ console.log(t("budgetSet", { amount: `$${n.toFixed(2)}` }));
94
81
  }
95
82
  else {
96
- console.log("Upotreba: /budget <iznos u USD>");
83
+ console.log(t("usageLine", { syntax: "/budget <USD>" }));
97
84
  }
98
85
  }
99
86
  else {
100
- console.log(state.budgetUsd !== undefined ? `Trenutni budžet: $${state.budgetUsd.toFixed(2)}` : "Budžet nije postavljen.");
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(`Nova sesija: ${state.session.id}`);
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(`Sesija forkovana: ${forked.id} (${state.messages.length} poruka preneto, originalna sesija netaknuta)`);
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 ? `Sesija '${arg}' nije pronađena.` : "Nema prethodne sesije u ovom direktorijumu.");
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(`Nastavljena sesija: ${target.id} (${state.messages.length} poruka)`);
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(`Nepoznata komanda: /${cmd}. Ukucaj /help.`);
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":"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"}
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 = `Ti si Tandem Mode, coding agent koji radi u realnom repozitorijumu.
2
- Koristi alate (read_file, list_dir, search, edit, git_diff, shell) da istražiš
3
- kod i uradiš zatraženu izmenu. Kad završiš zadatak, odgovori sažeto bez tool
4
- poziva da se petlja zaustavi.
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
- Radi tačno ono što je traženo — ništa više. Ne dodaji podršku za platforme,
7
- distribucije ili varijante koje korisnik nije pomenuo (npr. ako traži playbook
8
- za RHEL, ne generiši uzgred i verziju za Debian/Ubuntu). Ne hardkoduj u
9
- generisani kod/konfiguraciju vrednosti koje si otkrio istražujući lokalni
10
- sistem (npr. trenutno instaliranu verziju paketa) osim ako je korisnik
11
- eksplicitno tražio da se prilagodi tačno tom stanju — po defaultu ostavi
12
- generičku/najnoviju verziju ili promenljivu koju korisnik može da popuni.`;
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;;;;;;;;;;;0EAW6C,CAAC"}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/repl/system-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;0CAaa,CAAC"}