tandem-mode 0.2.0 → 0.5.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.
@@ -0,0 +1,108 @@
1
+ import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ // The name becomes a file name, so it is restricted to a safe charset: no path
5
+ // separators, no dots, no way to leave the profiles directory.
6
+ const NAME_PATTERN = /^[a-z0-9][a-z0-9_-]{0,39}$/;
7
+ function profilesDir() {
8
+ return path.join(os.homedir(), ".tandem", "profiles");
9
+ }
10
+ /** Lower-cases and validates; returns `null` for a name that cannot be used. */
11
+ export function normalizeProfileName(raw) {
12
+ const name = raw.trim().toLowerCase();
13
+ return NAME_PATTERN.test(name) ? name : null;
14
+ }
15
+ export function profilePath(name) {
16
+ return path.join(profilesDir(), `${name}.json`);
17
+ }
18
+ /** Throws an Error with a reason on a malformed file; only known fields are kept. */
19
+ export function parseProfile(raw) {
20
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
21
+ throw new Error("expected a JSON object");
22
+ }
23
+ const input = raw;
24
+ const profile = {};
25
+ if (input["model"] !== undefined) {
26
+ if (input["model"] !== "deepseek-v4-pro" && input["model"] !== "deepseek-v4-flash") {
27
+ throw new Error(`unknown model ${JSON.stringify(input["model"])}`);
28
+ }
29
+ profile.model = input["model"];
30
+ }
31
+ if (input["reasoningEffort"] !== undefined) {
32
+ const effort = input["reasoningEffort"];
33
+ if (effort !== "low" && effort !== "high" && effort !== "max") {
34
+ throw new Error(`unknown reasoningEffort ${JSON.stringify(effort)}`);
35
+ }
36
+ profile.reasoningEffort = effort;
37
+ }
38
+ if (input["budgetUsd"] !== undefined) {
39
+ const budget = input["budgetUsd"];
40
+ if (typeof budget !== "number" || !Number.isFinite(budget) || budget <= 0) {
41
+ throw new Error("budgetUsd must be a positive number");
42
+ }
43
+ profile.budgetUsd = budget;
44
+ }
45
+ if (input["maxReviewLoops"] !== undefined) {
46
+ const loops = input["maxReviewLoops"];
47
+ if (typeof loops !== "number" || !Number.isInteger(loops) || loops <= 0) {
48
+ throw new Error("maxReviewLoops must be a positive integer");
49
+ }
50
+ profile.maxReviewLoops = loops;
51
+ }
52
+ return profile;
53
+ }
54
+ export async function saveProfile(name, profile) {
55
+ const filePath = profilePath(name);
56
+ await mkdir(path.dirname(filePath), { recursive: true });
57
+ await writeFile(filePath, JSON.stringify(profile, null, 2) + "\n", "utf8");
58
+ return filePath;
59
+ }
60
+ /** `null` if there is no such profile; throws on a malformed file. */
61
+ export async function loadProfile(name) {
62
+ let raw;
63
+ try {
64
+ raw = await readFile(profilePath(name), "utf8");
65
+ }
66
+ catch (err) {
67
+ if (err.code === "ENOENT")
68
+ return null;
69
+ throw err;
70
+ }
71
+ let parsed;
72
+ try {
73
+ parsed = JSON.parse(raw);
74
+ }
75
+ catch {
76
+ throw new Error("not valid JSON");
77
+ }
78
+ return parseProfile(parsed);
79
+ }
80
+ export async function listProfiles() {
81
+ let entries;
82
+ try {
83
+ entries = await readdir(profilesDir());
84
+ }
85
+ catch (err) {
86
+ if (err.code === "ENOENT")
87
+ return [];
88
+ throw err;
89
+ }
90
+ return entries
91
+ .filter((f) => f.endsWith(".json"))
92
+ .map((f) => f.slice(0, -".json".length))
93
+ .filter((n) => NAME_PATTERN.test(n))
94
+ .sort();
95
+ }
96
+ export function describeProfile(profile) {
97
+ const parts = [];
98
+ if (profile.model)
99
+ parts.push(`model=${profile.model}`);
100
+ if (profile.reasoningEffort)
101
+ parts.push(`effort=${profile.reasoningEffort}`);
102
+ if (profile.budgetUsd !== undefined)
103
+ parts.push(`budget=$${profile.budgetUsd.toFixed(2)}`);
104
+ if (profile.maxReviewLoops !== undefined)
105
+ parts.push(`loops=${profile.maxReviewLoops}`);
106
+ return parts.join(" ");
107
+ }
108
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/config/profiles.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,6 @@ export const DEFAULT_CONFIG = {
2
2
  defaultModel: "deepseek-v4-pro",
3
3
  defaultReasoningEffort: "high",
4
4
  maxReviewLoops: 3,
5
+ maxIterations: 25,
5
6
  };
6
7
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,cAAc,GAA+F;IACxH,YAAY,EAAE,iBAAiB;IAC/B,sBAAsB,EAAE,MAAM;IAC9B,cAAc,EAAE,CAAC;CAClB,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,cAAc,GAEvB;IACF,YAAY,EAAE,iBAAiB;IAC/B,sBAAsB,EAAE,MAAM;IAC9B,cAAc,EAAE,CAAC;IACjB,aAAa,EAAE,EAAE;CAClB,CAAC"}
package/dist/i18n/en.js CHANGED
@@ -1,20 +1,24 @@
1
1
  // Source of truth for UI messages. `sr.ts` must define every key declared here.
2
2
  // Placeholders are written as {name} and filled in by `t()`.
3
3
  export const en = {
4
- helpText: `Commands:
5
- /plan <task> planner/worker/reviewer orchestration
6
- /model [deepseek-v4-pro|deepseek-v4-flash] show or change the model
7
- /thinking [on|off] toggle thinking mode
8
- /effort [low|high|max] show or change reasoning effort
9
- /status current settings and session
10
- /usage token usage, estimated cost, off-peak projection
11
- /budget [amount] show or set the budget in USD
12
- /new new session
13
- /fork new session with a copy of the current history
14
- /resume [id] resume the latest or a specific session
15
- /paste [message] send an image from the clipboard
16
- /clear clear the screen
17
- /help this list
4
+ helpText: `Commands:
5
+ /plan <task> planner/worker/reviewer orchestration
6
+ /model [deepseek-v4-pro|deepseek-v4-flash] show or change the model
7
+ /thinking [on|off] toggle thinking mode
8
+ /effort [low|high|max] show or change reasoning effort
9
+ /status current settings and session
10
+ /diff [--staged] [path] show the working-tree diff (no API call)
11
+ /usage token usage, estimated cost, off-peak projection
12
+ /budget [amount] show or set the budget in USD
13
+ /new new session
14
+ /save-profile <name> save model, effort, budget and review loops as a profile
15
+ /profile [name] load a saved profile, or list them
16
+ /compact summarize the history into a new session to free up context
17
+ /fork new session with a copy of the current history
18
+ /resume [id] resume the latest or a specific session
19
+ /paste [message] send an image from the clipboard
20
+ /clear clear the screen
21
+ /help this list
18
22
  /exit exit`,
19
23
  usageLine: "Usage: {syntax}",
20
24
  unknownCommand: "Unknown command: /{cmd}. Type /help.",
@@ -25,6 +29,7 @@ export const en = {
25
29
  statusNotSet: "not set",
26
30
  statusVerify: "Verify command: {value}",
27
31
  statusVerifyNone: "not set",
32
+ statusNotify: "Notify command: {value}",
28
33
  statusMessages: "Messages in history: {count}",
29
34
  usageCalls: "Calls: {count}",
30
35
  usageTokens: "Tokens: {input} in ({cached} cached) / {output} out",
@@ -39,6 +44,17 @@ export const en = {
39
44
  sessionNotFound: "Session '{id}' not found.",
40
45
  sessionNoneInDir: "No previous session in this directory.",
41
46
  sessionResumed: "Resumed session: {id} ({count} messages)",
47
+ compactNothing: "Nothing to compact yet.",
48
+ compactWorking: "Compacting {count} messages...",
49
+ compactDone: "Compacted {before} messages into {after}. New session: {id} (previous session {previous} is untouched on disk)",
50
+ compactFailed: "Compaction failed, history unchanged: {message}",
51
+ profileInvalidName: "Profile names use a-z, 0-9, - and _ (up to 40 characters, starting with a letter or digit).",
52
+ profileSaved: "Profile '{name}' saved to {path}",
53
+ profileLoaded: "Loaded profile '{name}': {summary}",
54
+ profileNotFound: "Profile '{name}' not found. Type /profile to list saved profiles.",
55
+ profileInvalid: "Profile '{name}' is invalid: {reason}",
56
+ profileList: "Saved profiles: {names}",
57
+ profileNone: "No saved profiles. Save the current settings with /save-profile <name>.",
42
58
  toolDenied: " (denied)",
43
59
  toolMoreLines: " … ({count} lines)",
44
60
  destructiveAction: "Destructive action: {call}",
@@ -46,7 +62,16 @@ export const en = {
46
62
  approvalPrompt: "Allow {call}? (y/n/a — a = always allow this tool)",
47
63
  autoApproved: "[--yes] auto-approved: {call}",
48
64
  errorPrefix: "Error: {message}",
49
- maxIterations: "Reached the maximum number of iterations without a final answer.",
65
+ maxIterations: "Reached the maximum number of iterations without a final answer. The session is saved: send a message (e.g. \"continue\") to pick up where it stopped.",
66
+ continueAsk: "The agent used {n} calls and has not finished.",
67
+ continueHint: "y = continue for {chunk} more calls, n = stop, a = always continue in this session (answer below)",
68
+ continuePrompt: "Continue for {chunk} more calls? (y/n/a — a = always continue this session)",
69
+ autoContinued: "[auto-continue] {n} calls used, continuing (spent ~{spent} of {budget})",
70
+ autoContinueNeedsBudget: "autoContinue only works together with a budget (--budget or budgetUsd); without one the agent will ask before continuing.",
71
+ continueStopped: "Stopped at the iteration limit (non-interactive run). Re-run with --auto-continue and --budget to let it go on.",
72
+ statusMode_chat: "chat",
73
+ statusMode_plan: "plan",
74
+ statusCalls: "call {n}/{max}",
50
75
  budgetExceeded: "Budget of {budget} reached (spent ~{spent}). The loop stopped before the next call — the session is saved, raise the budget with /budget and continue.",
51
76
  interrupted: "⏹ Interrupted (ESC). The session is saved up to this point.",
52
77
  orchestrationInterrupted: "⏹ Orchestration interrupted (ESC).",
@@ -78,6 +103,7 @@ export const en = {
78
103
  orchApproved: "✅ Reviewer approved. {notes}\n",
79
104
  orchChangesRequested: "⚠ Reviewer requests changes ({loops}/{max}): {notes}",
80
105
  orchMaxLoops: "\n❌ Reached max_review_loops ({max}) without approval — check manually.\n",
106
+ notifyFailed: "⚠ The notification command failed: {reason}",
81
107
  clipboardCmdNotFound: 'Command "{cmd}" not found. {hint}',
82
108
  clipboardInstallWl: "Install wl-clipboard (e.g. sudo apt install wl-clipboard).",
83
109
  clipboardInstallXclip: "Install xclip (e.g. sudo apt install xclip).",
@@ -1 +1 @@
1
- {"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,QAAQ,EAAE;;;;;;;;;;;;;;mDAcuC;IAEjD,SAAS,EAAE,iBAAiB;IAC5B,cAAc,EAAE,sCAAsC;IAEtD,YAAY,EAAE,wBAAwB;IACtC,aAAa,EAAE,0BAA0B;IAEzC,aAAa,EAAE,eAAe;IAC9B,YAAY,EAAE,iBAAiB;IAC/B,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,yBAAyB;IACvC,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,8BAA8B;IAE9C,UAAU,EAAE,gBAAgB;IAC5B,WAAW,EAAE,qDAAqD;IAClE,SAAS,EAAE,wBAAwB;IACnC,YAAY,EAAE,yCAAyC;IACvD,WAAW,EAAE,oCAAoC;IAEjD,SAAS,EAAE,yBAAyB;IACpC,aAAa,EAAE,0BAA0B;IACzC,UAAU,EAAE,gBAAgB;IAE5B,UAAU,EAAE,mBAAmB;IAC/B,aAAa,EAAE,kFAAkF;IACjG,eAAe,EAAE,2BAA2B;IAC5C,gBAAgB,EAAE,wCAAwC;IAC1D,cAAc,EAAE,0CAA0C;IAE1D,UAAU,EAAE,WAAW;IACvB,aAAa,EAAE,oBAAoB;IACnC,iBAAiB,EAAE,4BAA4B;IAC/C,YAAY,EAAE,iFAAiF;IAC/F,cAAc,EAAE,oDAAoD;IACpE,YAAY,EAAE,+BAA+B;IAC7C,WAAW,EAAE,kBAAkB;IAC/B,aAAa,EAAE,kEAAkE;IACjF,cAAc,EACZ,wJAAwJ;IAC1J,WAAW,EAAE,6DAA6D;IAC1E,wBAAwB,EAAE,oCAAoC;IAC9D,kBAAkB,EAAE,gCAAgC;IAEpD,QAAQ,EAAE,sCAAsC;IAChD,WAAW,EAAE,mFAAmF;IAChG,WAAW,EAAE,sCAAsC;IACnD,YAAY,EAAE,4BAA4B;IAE1C,QAAQ,EACN,qIAAqI;IACvI,WAAW,EAAE,8CAA8C;IAC3D,iBAAiB,EAAE,kDAAkD;IAErE,WAAW,EAAE,+CAA+C;IAC5D,cAAc,EAAE,WAAW;IAC3B,YAAY,EAAE,mBAAmB;IACjC,cAAc,EAAE,0BAA0B;IAC1C,WAAW,EAAE,gBAAgB;IAC7B,cAAc,EAAE,qCAAqC;IACrD,gBAAgB,EAAE,qCAAqC;IACvD,YAAY,EAAE,2BAA2B;IACzC,WAAW,EAAE,uFAAuF;IAEpG,YAAY,EAAE,oBAAoB;IAClC,QAAQ,EAAE,iBAAiB;IAC3B,UAAU,EAAE,8BAA8B;IAC1C,oBAAoB,EAAE,2CAA2C;IACjE,YAAY,EAAE,gCAAgC;IAC9C,UAAU,EAAE,0BAA0B;IACtC,gBAAgB,EAAE,UAAU;IAC5B,gBAAgB,EAAE,wBAAwB;IAC1C,YAAY,EAAE,gCAAgC;IAC9C,oBAAoB,EAAE,sDAAsD;IAC5E,YAAY,EAAE,2EAA2E;IAEzF,oBAAoB,EAAE,mCAAmC;IACzD,kBAAkB,EAAE,4DAA4D;IAChF,qBAAqB,EAAE,8CAA8C;IACrE,oBAAoB,EAAE,gFAAgF;CACvG,CAAC"}
1
+ {"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"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"}
package/dist/i18n/sr.js CHANGED
@@ -1,18 +1,22 @@
1
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
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
+ /diff [--staged] [putanja] prikaži diff radnog stabla (bez API poziva)
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
+ /save-profile <ime> sačuvaj model, effort, budžet i review krugove kao profil
13
+ /profile [ime] učitaj sačuvan profil, ili prikaži listu
14
+ /compact sažmi istoriju u novu sesiju da se oslobodi kontekst
15
+ /fork nova sesija sa kopijom trenutne istorije
16
+ /resume [id] nastavi poslednju ili navedenu sesiju
17
+ /paste [poruka] pošalji sliku iz clipboard-a
18
+ /clear očisti ekran
19
+ /help ova lista
16
20
  /exit izlaz`,
17
21
  usageLine: "Upotreba: {syntax}",
18
22
  unknownCommand: "Nepoznata komanda: /{cmd}. Ukucaj /help.",
@@ -23,6 +27,7 @@ export const sr = {
23
27
  statusNotSet: "nije postavljen",
24
28
  statusVerify: "Verify komanda: {value}",
25
29
  statusVerifyNone: "nije postavljena",
30
+ statusNotify: "Notify komanda: {value}",
26
31
  statusMessages: "Poruka u istoriji: {count}",
27
32
  usageCalls: "Pozivi: {count}",
28
33
  usageTokens: "Tokeni: {input} in ({cached} cached) / {output} out",
@@ -37,6 +42,17 @@ export const sr = {
37
42
  sessionNotFound: "Sesija '{id}' nije pronađena.",
38
43
  sessionNoneInDir: "Nema prethodne sesije u ovom direktorijumu.",
39
44
  sessionResumed: "Nastavljena sesija: {id} ({count} poruka)",
45
+ compactNothing: "Još nema šta da se sažme.",
46
+ compactWorking: "Sažimam {count} poruka...",
47
+ compactDone: "Sažeto {before} poruka u {after}. Nova sesija: {id} (prethodna sesija {previous} ostaje netaknuta na disku)",
48
+ compactFailed: "Sažimanje nije uspelo, istorija je nepromenjena: {message}",
49
+ profileInvalidName: "Imena profila koriste a-z, 0-9, - i _ (do 40 karaktera, počinju slovom ili cifrom).",
50
+ profileSaved: "Profil '{name}' sačuvan u {path}",
51
+ profileLoaded: "Učitan profil '{name}': {summary}",
52
+ profileNotFound: "Profil '{name}' nije pronađen. Ukucaj /profile za listu sačuvanih profila.",
53
+ profileInvalid: "Profil '{name}' nije ispravan: {reason}",
54
+ profileList: "Sačuvani profili: {names}",
55
+ profileNone: "Nema sačuvanih profila. Sačuvaj trenutna podešavanja sa /save-profile <ime>.",
40
56
  toolDenied: " (odbijeno)",
41
57
  toolMoreLines: " … ({count} linija)",
42
58
  destructiveAction: "Destruktivna akcija: {call}",
@@ -44,7 +60,16 @@ export const sr = {
44
60
  approvalPrompt: "Dozvoli izvršavanje {call}? (y/n/a — a = uvek dozvoli ovaj alat)",
45
61
  autoApproved: "[--yes] auto-odobreno: {call}",
46
62
  errorPrefix: "Greška: {message}",
47
- maxIterations: "Dostignut je maksimalan broj iteracija bez finalnog odgovora.",
63
+ maxIterations: "Dostignut je maksimalan broj iteracija bez finalnog odgovora. Sesija je sačuvana: pošalji poruku (npr. \"nastavi\") da nastavi tamo gde je stao.",
64
+ continueAsk: "Agent je iskoristio {n} poziva i nije završio.",
65
+ continueHint: "y = nastavi još {chunk} poziva, n = stani, a = uvek nastavi u ovoj sesiji (odgovor ispod)",
66
+ continuePrompt: "Nastaviti još {chunk} poziva? (y/n/a — a = uvek nastavi u ovoj sesiji)",
67
+ autoContinued: "[auto-continue] iskorišćeno {n} poziva, nastavljam (potrošeno ~{spent} od {budget})",
68
+ autoContinueNeedsBudget: "autoContinue radi samo uz budžet (--budget ili budgetUsd); bez njega agent pita pre nastavka.",
69
+ continueStopped: "Stao na granici iteracija (neinteraktivni rad). Pokreni ponovo sa --auto-continue i --budget da nastavi.",
70
+ statusMode_chat: "chat",
71
+ statusMode_plan: "plan",
72
+ statusCalls: "poziv {n}/{max}",
48
73
  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
74
  interrupted: "⏹ Prekinuto (ESC). Sesija je sačuvana do ove tačke.",
50
75
  orchestrationInterrupted: "⏹ Orkestracija prekinuta (ESC).",
@@ -76,6 +101,7 @@ export const sr = {
76
101
  orchApproved: "✅ Reviewer odobrio. {notes}\n",
77
102
  orchChangesRequested: "⚠ Reviewer traži izmene ({loops}/{max}): {notes}",
78
103
  orchMaxLoops: "\n❌ Dostignut max_review_loops ({max}) bez odobrenja — proveri ručno.\n",
104
+ notifyFailed: "⚠ Komanda za obaveštenje nije uspela: {reason}",
79
105
  clipboardCmdNotFound: 'Komanda "{cmd}" nije pronađena. {hint}',
80
106
  clipboardInstallWl: "Instaliraj wl-clipboard (npr. sudo apt install wl-clipboard).",
81
107
  clipboardInstallXclip: "Instaliraj xclip (npr. sudo apt install xclip).",
@@ -1 +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"}
1
+ {"version":3,"file":"sr.js","sourceRoot":"","sources":["../../src/i18n/sr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { runShell } from "../agent/tools/shell.js";
2
+ import { t } from "../i18n/index.js";
3
+ // The notification must never hold up the end of a run for long.
4
+ const NOTIFY_TIMEOUT_MS = 15_000;
5
+ const MAX_TASK_CHARS = 500;
6
+ const MAX_NOTES_CHARS = 1_000;
7
+ // Environment values cannot contain NUL bytes.
8
+ function envValue(text, max) {
9
+ return text.replaceAll("\0", "").slice(0, max);
10
+ }
11
+ /**
12
+ * Runs the user's `notifyCommand` after a /plan run. Details go in as environment
13
+ * variables, never spliced into the command text, so a task or review note cannot
14
+ * inject shell code. A failing command only prints a warning.
15
+ */
16
+ export async function notifyCompletion(command, cwd, info) {
17
+ if (!command)
18
+ return;
19
+ try {
20
+ const { exitCode, output } = await runShell(command, cwd, undefined, {
21
+ timeoutMs: NOTIFY_TIMEOUT_MS,
22
+ env: {
23
+ TANDEM_OUTCOME: info.outcome,
24
+ TANDEM_TASK: envValue(info.task, MAX_TASK_CHARS),
25
+ TANDEM_NOTES: envValue(info.notes, MAX_NOTES_CHARS),
26
+ TANDEM_REVIEW_LOOPS: String(info.reviewLoops),
27
+ TANDEM_COST_USD: info.costUsd.toFixed(4),
28
+ },
29
+ });
30
+ if (exitCode !== 0) {
31
+ console.warn(t("notifyFailed", { reason: `exit code ${exitCode}: ${output.trim().slice(0, 200)}` }));
32
+ }
33
+ }
34
+ catch (err) {
35
+ console.warn(t("notifyFailed", { reason: err instanceof Error ? err.message : String(err) }));
36
+ }
37
+ }
38
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/orchestrator/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAcrC,iEAAiE;AACjE,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,+CAA+C;AAC/C,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAW;IACzC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA2B,EAAE,GAAW,EAAE,IAAgB;IAC/F,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE;YACnE,SAAS,EAAE,iBAAiB;YAC5B,GAAG,EAAE;gBACH,cAAc,EAAE,IAAI,CAAC,OAAO;gBAC5B,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;gBAChD,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC;gBACnD,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC7C,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;aACzC;SACF,CAAC,CAAC;QACH,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,aAAa,QAAQ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;AACH,CAAC"}
@@ -3,6 +3,7 @@ import { buildRepoMap } from "./repoMap.js";
3
3
  import { runPlanner } from "./planner.js";
4
4
  import { runReviewer } from "./reviewer.js";
5
5
  import { runShell } from "../agent/tools/shell.js";
6
+ import { notifyCompletion } from "./notify.js";
6
7
  import { t } from "../i18n/index.js";
7
8
  const WORKER_SYSTEM_PROMPT = `You are a worker in a Tandem Mode orchestration. You get ONE concrete task from
8
9
  the plan below, with a repository map. You have no access to the conversation
@@ -55,6 +56,13 @@ export async function runOrchestration(task, opts) {
55
56
  opts.usage.add("deepseek-v4-pro", reviewUsage);
56
57
  if (review.approved) {
57
58
  console.log(t("orchApproved", { notes: review.notes }));
59
+ await notifyCompletion(opts.notifyCommand, opts.cwd, {
60
+ outcome: "approved",
61
+ task,
62
+ notes: review.notes,
63
+ reviewLoops: loops,
64
+ costUsd: opts.usage.estimatedCostUsd(),
65
+ });
58
66
  return;
59
67
  }
60
68
  loops++;
@@ -62,6 +70,13 @@ export async function runOrchestration(task, opts) {
62
70
  review.corrections.forEach((c) => console.log(` - ${c.description}`));
63
71
  if (loops >= opts.maxReviewLoops) {
64
72
  console.log(t("orchMaxLoops", { max: opts.maxReviewLoops }));
73
+ await notifyCompletion(opts.notifyCommand, opts.cwd, {
74
+ outcome: "max_review_loops",
75
+ task,
76
+ notes: review.notes,
77
+ reviewLoops: loops,
78
+ costUsd: opts.usage.estimatedCostUsd(),
79
+ });
65
80
  return;
66
81
  }
67
82
  for (const correction of review.corrections) {
@@ -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,4 +1,7 @@
1
1
  import { createSession, findLatestSession, findSessionById, loadSessionMessages, appendSessionMessage, } from "../agent/session.js";
2
+ import { compactConversation, SUMMARY_MODEL } from "../agent/compact.js";
3
+ import { gitDiffTool } from "../agent/tools/gitDiff.js";
4
+ import { describeProfile, listProfiles, loadProfile, normalizeProfileName, saveProfile, } from "../config/profiles.js";
2
5
  import { SYSTEM_PROMPT } from "./system-prompt.js";
3
6
  import { t } from "../i18n/index.js";
4
7
  export async function handleCommand(line, state) {
@@ -53,10 +56,19 @@ export async function handleCommand(line, state) {
53
56
  console.log(`Thinking: ${state.thinkingEnabled ? `on (${state.reasoningEffort})` : "off"}`);
54
57
  console.log(t("statusBudget", { value: state.budgetUsd !== undefined ? `$${state.budgetUsd.toFixed(2)}` : t("statusNotSet") }));
55
58
  console.log(`Max review loops: ${state.maxReviewLoops}`);
59
+ console.log(`Max iterations: ${state.maxIterations}${state.autoContinue ? " (auto-continue)" : ""}`);
56
60
  console.log(t("statusVerify", { value: state.verifyCommand ?? t("statusVerifyNone") }));
61
+ console.log(t("statusNotify", { value: state.notifyCommand ?? t("statusVerifyNone") }));
57
62
  console.log(t("statusMessages", { count: state.messages.length }));
58
63
  return "continue";
59
64
  }
65
+ case "diff": {
66
+ const staged = rest[0] === "--staged";
67
+ const scopePath = (staged ? rest.slice(1) : rest).join(" ").trim();
68
+ const result = await gitDiffTool.execute({ staged, ...(scopePath ? { path: scopePath } : {}) }, { cwd: state.cwd, env: state.env, usage: state.usage });
69
+ console.log(result.output);
70
+ return "continue";
71
+ }
60
72
  case "usage": {
61
73
  const totals = state.usage.totals();
62
74
  const cost = state.usage.estimatedCostUsd();
@@ -95,6 +107,93 @@ export async function handleCommand(line, state) {
95
107
  console.log(t("sessionNew", { id: state.session.id }));
96
108
  return "continue";
97
109
  }
110
+ case "save-profile": {
111
+ const name = normalizeProfileName(arg);
112
+ if (!name) {
113
+ console.log(arg ? t("profileInvalidName") : t("usageLine", { syntax: "/save-profile <name>" }));
114
+ return "continue";
115
+ }
116
+ const profile = {
117
+ model: state.model,
118
+ reasoningEffort: state.reasoningEffort,
119
+ maxReviewLoops: state.maxReviewLoops,
120
+ ...(state.budgetUsd !== undefined ? { budgetUsd: state.budgetUsd } : {}),
121
+ };
122
+ try {
123
+ const filePath = await saveProfile(name, profile);
124
+ console.log(t("profileSaved", { name, path: filePath }));
125
+ }
126
+ catch (err) {
127
+ console.log(t("errorPrefix", { message: err instanceof Error ? err.message : String(err) }));
128
+ }
129
+ return "continue";
130
+ }
131
+ case "profile": {
132
+ if (!arg) {
133
+ try {
134
+ const names = await listProfiles();
135
+ console.log(names.length > 0 ? t("profileList", { names: names.join(", ") }) : t("profileNone"));
136
+ }
137
+ catch (err) {
138
+ console.log(t("errorPrefix", { message: err instanceof Error ? err.message : String(err) }));
139
+ }
140
+ return "continue";
141
+ }
142
+ const name = normalizeProfileName(arg);
143
+ if (!name) {
144
+ console.log(t("profileInvalidName"));
145
+ return "continue";
146
+ }
147
+ try {
148
+ const profile = await loadProfile(name);
149
+ if (!profile) {
150
+ console.log(t("profileNotFound", { name }));
151
+ return "continue";
152
+ }
153
+ // Only the fields present in the profile are applied; the rest of the session is left alone.
154
+ if (profile.model)
155
+ state.model = profile.model;
156
+ if (profile.reasoningEffort)
157
+ state.reasoningEffort = profile.reasoningEffort;
158
+ if (profile.budgetUsd !== undefined)
159
+ state.budgetUsd = profile.budgetUsd;
160
+ if (profile.maxReviewLoops !== undefined)
161
+ state.maxReviewLoops = profile.maxReviewLoops;
162
+ console.log(t("profileLoaded", { name, summary: describeProfile(profile) }));
163
+ }
164
+ catch (err) {
165
+ console.log(t("profileInvalid", { name, reason: err instanceof Error ? err.message : String(err) }));
166
+ }
167
+ return "continue";
168
+ }
169
+ case "compact": {
170
+ if (state.messages.filter((m) => m.role !== "system").length < 2) {
171
+ console.log(t("compactNothing"));
172
+ return "continue";
173
+ }
174
+ console.log(t("compactWorking", { count: state.messages.length }));
175
+ try {
176
+ const first = state.messages[0];
177
+ const systemPrompt = first?.role === "system" && first.content ? first.content : SYSTEM_PROMPT;
178
+ const result = await compactConversation(state.env, state.messages, systemPrompt);
179
+ state.usage.add(SUMMARY_MODEL, result.usage);
180
+ // New session instead of rewriting the old file: the original history stays on
181
+ // disk untouched, and /resume of the new session loads the compact version.
182
+ const previous = state.session;
183
+ const next = await createSession(state.cwd);
184
+ for (const msg of result.messages) {
185
+ await appendSessionMessage(next, msg);
186
+ }
187
+ const before = state.messages.length;
188
+ state.session = next;
189
+ state.messages = result.messages;
190
+ console.log(t("compactDone", { before, after: result.messages.length, id: next.id, previous: previous.id }));
191
+ }
192
+ catch (err) {
193
+ console.log(t("compactFailed", { message: err instanceof Error ? err.message : String(err) }));
194
+ }
195
+ return "continue";
196
+ }
98
197
  case "fork": {
99
198
  const forked = await createSession(state.cwd);
100
199
  for (const msg of state.messages) {
@@ -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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"}