tandem-mode 0.0.1
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/LICENSE +21 -0
- package/README.md +191 -0
- package/README.sr.md +194 -0
- package/dist/agent/clipboard.js +26 -0
- package/dist/agent/clipboard.js.map +1 -0
- package/dist/agent/loop.js +157 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/pricing.js +21 -0
- package/dist/agent/pricing.js.map +1 -0
- package/dist/agent/session.js +78 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/agent/tools/edit.js +78 -0
- package/dist/agent/tools/edit.js.map +1 -0
- package/dist/agent/tools/gitDiff.js +42 -0
- package/dist/agent/tools/gitDiff.js.map +1 -0
- package/dist/agent/tools/index.js +24 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/tools/listDir.js +29 -0
- package/dist/agent/tools/listDir.js.map +1 -0
- package/dist/agent/tools/readFile.js +40 -0
- package/dist/agent/tools/readFile.js.map +1 -0
- package/dist/agent/tools/search.js +51 -0
- package/dist/agent/tools/search.js.map +1 -0
- package/dist/agent/tools/shell.js +95 -0
- package/dist/agent/tools/shell.js.map +1 -0
- package/dist/agent/tools/types.js +11 -0
- package/dist/agent/tools/types.js.map +1 -0
- package/dist/agent/tools/viewImage.js +34 -0
- package/dist/agent/tools/viewImage.js.map +1 -0
- package/dist/agent/tools/webSearch.js +27 -0
- package/dist/agent/tools/webSearch.js.map +1 -0
- package/dist/agent/usage.js +36 -0
- package/dist/agent/usage.js.map +1 -0
- package/dist/benchmark/runner.js +176 -0
- package/dist/benchmark/runner.js.map +1 -0
- package/dist/benchmark/tasks/bitwiseBulkPriceWizard.js +50 -0
- package/dist/benchmark/tasks/bitwiseBulkPriceWizard.js.map +1 -0
- package/dist/benchmark/types.js +2 -0
- package/dist/benchmark/types.js.map +1 -0
- package/dist/cli.js +442 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/credentials.js +80 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/env.js +12 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/schema.js +6 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/store.js +35 -0
- package/dist/config/store.js.map +1 -0
- package/dist/deepseek/client.js +145 -0
- package/dist/deepseek/client.js.map +1 -0
- package/dist/deepseek/types.js +2 -0
- package/dist/deepseek/types.js.map +1 -0
- package/dist/deepseek/vision.js +59 -0
- package/dist/deepseek/vision.js.map +1 -0
- package/dist/deepseek/webSearch.js +43 -0
- package/dist/deepseek/webSearch.js.map +1 -0
- package/dist/orchestrator/orchestrate.js +63 -0
- package/dist/orchestrator/orchestrate.js.map +1 -0
- package/dist/orchestrator/planner.js +48 -0
- package/dist/orchestrator/planner.js.map +1 -0
- package/dist/orchestrator/repoMap.js +52 -0
- package/dist/orchestrator/repoMap.js.map +1 -0
- package/dist/orchestrator/reviewer.js +53 -0
- package/dist/orchestrator/reviewer.js.map +1 -0
- package/dist/orchestrator/types.js +18 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/repl/commands.js +139 -0
- package/dist/repl/commands.js.map +1 -0
- package/dist/repl/state.js +2 -0
- package/dist/repl/state.js.map +1 -0
- package/dist/repl/system-prompt.js +5 -0
- package/dist/repl/system-prompt.js.map +1 -0
- package/dist/repl/wizard.js +34 -0
- package/dist/repl/wizard.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { createSession, findLatestSession, findSessionById, loadSessionMessages, appendSessionMessage, } from "../agent/session.js";
|
|
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`;
|
|
18
|
+
export async function handleCommand(line, state) {
|
|
19
|
+
const [cmd = "", ...rest] = line.slice(1).trim().split(/\s+/);
|
|
20
|
+
const arg = rest.join(" ").trim();
|
|
21
|
+
switch (cmd) {
|
|
22
|
+
case "help":
|
|
23
|
+
console.log(HELP_TEXT);
|
|
24
|
+
return "continue";
|
|
25
|
+
case "exit":
|
|
26
|
+
case "quit":
|
|
27
|
+
return "exit";
|
|
28
|
+
case "model":
|
|
29
|
+
if (arg === "deepseek-v4-pro" || arg === "deepseek-v4-flash") {
|
|
30
|
+
state.model = arg;
|
|
31
|
+
console.log(`Model: ${arg}`);
|
|
32
|
+
}
|
|
33
|
+
else if (!arg) {
|
|
34
|
+
console.log(`Trenutni model: ${state.model}`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.log("Upotreba: /model deepseek-v4-pro|deepseek-v4-flash");
|
|
38
|
+
}
|
|
39
|
+
return "continue";
|
|
40
|
+
case "thinking":
|
|
41
|
+
if (arg === "on" || arg === "off") {
|
|
42
|
+
state.thinkingEnabled = arg === "on";
|
|
43
|
+
console.log(`Thinking: ${arg}`);
|
|
44
|
+
}
|
|
45
|
+
else if (!arg) {
|
|
46
|
+
console.log(`Thinking: ${state.thinkingEnabled ? "on" : "off"}`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log("Upotreba: /thinking on|off");
|
|
50
|
+
}
|
|
51
|
+
return "continue";
|
|
52
|
+
case "effort":
|
|
53
|
+
if (arg === "low" || arg === "high" || arg === "max") {
|
|
54
|
+
state.reasoningEffort = arg;
|
|
55
|
+
console.log(`Reasoning effort: ${arg}`);
|
|
56
|
+
}
|
|
57
|
+
else if (!arg) {
|
|
58
|
+
console.log(`Trenutni effort: ${state.reasoningEffort}`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
console.log("Upotreba: /effort low|high|max");
|
|
62
|
+
}
|
|
63
|
+
return "continue";
|
|
64
|
+
case "status": {
|
|
65
|
+
console.log(`Sesija: ${state.session.id}`);
|
|
66
|
+
console.log(`Model: ${state.model}`);
|
|
67
|
+
console.log(`Thinking: ${state.thinkingEnabled ? `on (${state.reasoningEffort})` : "off"}`);
|
|
68
|
+
console.log(`Budžet: ${state.budgetUsd !== undefined ? `$${state.budgetUsd.toFixed(2)}` : "nije postavljen"}`);
|
|
69
|
+
console.log(`Max review loops: ${state.maxReviewLoops}`);
|
|
70
|
+
console.log(`Poruka u istoriji: ${state.messages.length}`);
|
|
71
|
+
return "continue";
|
|
72
|
+
}
|
|
73
|
+
case "usage": {
|
|
74
|
+
const totals = state.usage.totals();
|
|
75
|
+
const cost = state.usage.estimatedCostUsd();
|
|
76
|
+
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)}`);
|
|
80
|
+
if (Math.abs(cost - offPeakCost) > 0.0000001) {
|
|
81
|
+
console.log(`Ova sesija bi off-peak koštala: $${offPeakCost.toFixed(4)}`);
|
|
82
|
+
}
|
|
83
|
+
if (state.budgetUsd !== undefined) {
|
|
84
|
+
console.log(`Budžet: $${state.budgetUsd.toFixed(2)} (iskorišćeno ${((cost / state.budgetUsd) * 100).toFixed(0)}%)`);
|
|
85
|
+
}
|
|
86
|
+
return "continue";
|
|
87
|
+
}
|
|
88
|
+
case "budget":
|
|
89
|
+
if (arg) {
|
|
90
|
+
const n = Number(arg);
|
|
91
|
+
if (Number.isFinite(n) && n > 0) {
|
|
92
|
+
state.budgetUsd = n;
|
|
93
|
+
console.log(`Budžet postavljen na $${n.toFixed(2)}.`);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.log("Upotreba: /budget <iznos u USD>");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log(state.budgetUsd !== undefined ? `Trenutni budžet: $${state.budgetUsd.toFixed(2)}` : "Budžet nije postavljen.");
|
|
101
|
+
}
|
|
102
|
+
return "continue";
|
|
103
|
+
case "new": {
|
|
104
|
+
state.session = await createSession(state.cwd);
|
|
105
|
+
const systemMsg = { role: "system", content: SYSTEM_PROMPT };
|
|
106
|
+
state.messages = [systemMsg];
|
|
107
|
+
await appendSessionMessage(state.session, systemMsg);
|
|
108
|
+
console.log(`Nova sesija: ${state.session.id}`);
|
|
109
|
+
return "continue";
|
|
110
|
+
}
|
|
111
|
+
case "fork": {
|
|
112
|
+
const forked = await createSession(state.cwd);
|
|
113
|
+
for (const msg of state.messages) {
|
|
114
|
+
await appendSessionMessage(forked, msg);
|
|
115
|
+
}
|
|
116
|
+
state.session = forked;
|
|
117
|
+
console.log(`Sesija forkovana: ${forked.id} (${state.messages.length} poruka preneto, originalna sesija netaknuta)`);
|
|
118
|
+
return "continue";
|
|
119
|
+
}
|
|
120
|
+
case "resume": {
|
|
121
|
+
const target = arg ? await findSessionById(state.cwd, arg) : await findLatestSession(state.cwd);
|
|
122
|
+
if (!target) {
|
|
123
|
+
console.log(arg ? `Sesija '${arg}' nije pronađena.` : "Nema prethodne sesije u ovom direktorijumu.");
|
|
124
|
+
return "continue";
|
|
125
|
+
}
|
|
126
|
+
state.messages = await loadSessionMessages(target.filePath);
|
|
127
|
+
state.session = target;
|
|
128
|
+
console.log(`Nastavljena sesija: ${target.id} (${state.messages.length} poruka)`);
|
|
129
|
+
return "continue";
|
|
130
|
+
}
|
|
131
|
+
case "clear":
|
|
132
|
+
console.clear();
|
|
133
|
+
return "continue";
|
|
134
|
+
default:
|
|
135
|
+
console.log(`Nepoznata komanda: /${cmd}. Ukucaj /help.`);
|
|
136
|
+
return "continue";
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/repl/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/repl/state.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
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.`;
|
|
5
|
+
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/repl/system-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;;;8BAGC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { password, select } from "@inquirer/prompts";
|
|
2
|
+
import { setStoredApiKey } from "../config/credentials.js";
|
|
3
|
+
import { saveGlobalConfig } from "../config/store.js";
|
|
4
|
+
export async function runFirstRunWizard() {
|
|
5
|
+
console.log("Prvo pokretanje — potreban je DeepSeek API ključ.\n");
|
|
6
|
+
const apiKey = await password({
|
|
7
|
+
message: "DeepSeek API ključ:",
|
|
8
|
+
mask: "*",
|
|
9
|
+
validate: (value) => (value.trim().length > 0 ? true : "Ključ ne može biti prazan."),
|
|
10
|
+
});
|
|
11
|
+
const defaultModel = await select({
|
|
12
|
+
message: "Podrazumevani model:",
|
|
13
|
+
choices: [
|
|
14
|
+
{ name: "deepseek-v4-pro (jači, skuplji)", value: "deepseek-v4-pro" },
|
|
15
|
+
{ name: "deepseek-v4-flash (brži, jeftiniji)", value: "deepseek-v4-flash" },
|
|
16
|
+
],
|
|
17
|
+
default: "deepseek-v4-pro",
|
|
18
|
+
});
|
|
19
|
+
const defaultReasoningEffort = await select({
|
|
20
|
+
message: "Podrazumevani reasoning effort:",
|
|
21
|
+
choices: [
|
|
22
|
+
{ name: "low", value: "low" },
|
|
23
|
+
{ name: "high", value: "high" },
|
|
24
|
+
{ name: "max", value: "max" },
|
|
25
|
+
],
|
|
26
|
+
default: "high",
|
|
27
|
+
});
|
|
28
|
+
await setStoredApiKey(apiKey.trim());
|
|
29
|
+
const config = { defaultModel, defaultReasoningEffort };
|
|
30
|
+
await saveGlobalConfig(config);
|
|
31
|
+
console.log("\nSačuvano — ključ je u OS credential store-u, podešavanja u ~/.tandem/config.json.\n");
|
|
32
|
+
return config;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/repl/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IAEnE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;QAC5B,OAAO,EAAE,qBAAqB;QAC9B,IAAI,EAAE,GAAG;QACT,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B,CAAC;KACrF,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,MAAM,CAA0C;QACzE,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,iBAAiB,EAAE;YACrE,EAAE,IAAI,EAAE,qCAAqC,EAAE,KAAK,EAAE,mBAAmB,EAAE;SAC5E;QACD,OAAO,EAAE,iBAAiB;KAC3B,CAAC,CAAC;IAEH,MAAM,sBAAsB,GAAG,MAAM,MAAM,CAAyB;QAClE,OAAO,EAAE,iCAAiC;QAC1C,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;YAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAC/B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;SAC9B;QACD,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IAEH,MAAM,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,MAAM,GAAiB,EAAE,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACtE,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAE/B,OAAO,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC;IACrG,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tandem-mode",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "DeepSeek coding CLI — planner/worker/reviewer agentic loop",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/zdrave08/Tandem-Mode.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/zdrave08/Tandem-Mode#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/zdrave08/Tandem-Mode/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"deepseek",
|
|
17
|
+
"cli",
|
|
18
|
+
"ai",
|
|
19
|
+
"coding-agent",
|
|
20
|
+
"llm"
|
|
21
|
+
],
|
|
22
|
+
"bin": {
|
|
23
|
+
"tandem": "dist/cli.js"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=20"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"dev": "tsx src/cli.tsx",
|
|
33
|
+
"build": "tsc -p tsconfig.json",
|
|
34
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
35
|
+
"start": "node dist/cli.js",
|
|
36
|
+
"prepublishOnly": "pnpm build"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@inquirer/prompts": "^8.7.0",
|
|
40
|
+
"ink": "^5.0.1",
|
|
41
|
+
"react": "^18.3.1"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/node": "^20.14.0",
|
|
45
|
+
"@types/react": "^18.3.3",
|
|
46
|
+
"tsx": "^4.16.0",
|
|
47
|
+
"typescript": "^5.5.0"
|
|
48
|
+
}
|
|
49
|
+
}
|