duocode 0.1.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 (220) hide show
  1. package/.env.example +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +52 -0
  4. package/dist/ast/context.d.ts +16 -0
  5. package/dist/ast/context.js +37 -0
  6. package/dist/ast/context.js.map +1 -0
  7. package/dist/ast/diff.d.ts +27 -0
  8. package/dist/ast/diff.js +44 -0
  9. package/dist/ast/diff.js.map +1 -0
  10. package/dist/ast/locks.d.ts +47 -0
  11. package/dist/ast/locks.js +88 -0
  12. package/dist/ast/locks.js.map +1 -0
  13. package/dist/ast/merge.d.ts +22 -0
  14. package/dist/ast/merge.js +120 -0
  15. package/dist/ast/merge.js.map +1 -0
  16. package/dist/ast/ownership.d.ts +31 -0
  17. package/dist/ast/ownership.js +111 -0
  18. package/dist/ast/ownership.js.map +1 -0
  19. package/dist/ast/parser.d.ts +44 -0
  20. package/dist/ast/parser.js +134 -0
  21. package/dist/ast/parser.js.map +1 -0
  22. package/dist/cli.d.ts +2 -0
  23. package/dist/cli.js +423 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/commands/doctor.d.ts +5 -0
  26. package/dist/commands/doctor.js +63 -0
  27. package/dist/commands/doctor.js.map +1 -0
  28. package/dist/commands/duo.d.ts +9 -0
  29. package/dist/commands/duo.js +285 -0
  30. package/dist/commands/duo.js.map +1 -0
  31. package/dist/commands/github.d.ts +2 -0
  32. package/dist/commands/github.js +85 -0
  33. package/dist/commands/github.js.map +1 -0
  34. package/dist/commands/init.d.ts +2 -0
  35. package/dist/commands/init.js +33 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/negotiation.d.ts +2 -0
  38. package/dist/commands/negotiation.js +160 -0
  39. package/dist/commands/negotiation.js.map +1 -0
  40. package/dist/commands/repl_commands.d.ts +26 -0
  41. package/dist/commands/repl_commands.js +226 -0
  42. package/dist/commands/repl_commands.js.map +1 -0
  43. package/dist/commands/shell.d.ts +1 -0
  44. package/dist/commands/shell.js +110 -0
  45. package/dist/commands/shell.js.map +1 -0
  46. package/dist/commands/start.d.ts +2 -0
  47. package/dist/commands/start.js +231 -0
  48. package/dist/commands/start.js.map +1 -0
  49. package/dist/commands/task.d.ts +2 -0
  50. package/dist/commands/task.js +215 -0
  51. package/dist/commands/task.js.map +1 -0
  52. package/dist/config/loader.d.ts +193 -0
  53. package/dist/config/loader.js +106 -0
  54. package/dist/config/loader.js.map +1 -0
  55. package/dist/context/project_context.d.ts +79 -0
  56. package/dist/context/project_context.js +292 -0
  57. package/dist/context/project_context.js.map +1 -0
  58. package/dist/context/token_budget.d.ts +35 -0
  59. package/dist/context/token_budget.js +81 -0
  60. package/dist/context/token_budget.js.map +1 -0
  61. package/dist/db/queries.d.ts +121 -0
  62. package/dist/db/queries.js +109 -0
  63. package/dist/db/queries.js.map +1 -0
  64. package/dist/db/schema.d.ts +110 -0
  65. package/dist/db/schema.js +346 -0
  66. package/dist/db/schema.js.map +1 -0
  67. package/dist/duo/duo_orchestrator.d.ts +50 -0
  68. package/dist/duo/duo_orchestrator.js +510 -0
  69. package/dist/duo/duo_orchestrator.js.map +1 -0
  70. package/dist/duo/duo_session.d.ts +47 -0
  71. package/dist/duo/duo_session.js +127 -0
  72. package/dist/duo/duo_session.js.map +1 -0
  73. package/dist/duo/duo_types.d.ts +168 -0
  74. package/dist/duo/duo_types.js +53 -0
  75. package/dist/duo/duo_types.js.map +1 -0
  76. package/dist/duo/session_store.d.ts +71 -0
  77. package/dist/duo/session_store.js +177 -0
  78. package/dist/duo/session_store.js.map +1 -0
  79. package/dist/git/worktree.d.ts +21 -0
  80. package/dist/git/worktree.js +86 -0
  81. package/dist/git/worktree.js.map +1 -0
  82. package/dist/github/cache.d.ts +23 -0
  83. package/dist/github/cache.js +67 -0
  84. package/dist/github/cache.js.map +1 -0
  85. package/dist/github/issues.d.ts +17 -0
  86. package/dist/github/issues.js +93 -0
  87. package/dist/github/issues.js.map +1 -0
  88. package/dist/github/mcp_client.d.ts +57 -0
  89. package/dist/github/mcp_client.js +214 -0
  90. package/dist/github/mcp_client.js.map +1 -0
  91. package/dist/github/sync.d.ts +11 -0
  92. package/dist/github/sync.js +65 -0
  93. package/dist/github/sync.js.map +1 -0
  94. package/dist/github/webhook.d.ts +25 -0
  95. package/dist/github/webhook.js +197 -0
  96. package/dist/github/webhook.js.map +1 -0
  97. package/dist/negotiation/index.d.ts +1 -0
  98. package/dist/negotiation/index.js +2 -0
  99. package/dist/negotiation/index.js.map +1 -0
  100. package/dist/negotiation/protocol.d.ts +62 -0
  101. package/dist/negotiation/protocol.js +188 -0
  102. package/dist/negotiation/protocol.js.map +1 -0
  103. package/dist/orchestrator/complexity_scorer.d.ts +2 -0
  104. package/dist/orchestrator/complexity_scorer.js +79 -0
  105. package/dist/orchestrator/complexity_scorer.js.map +1 -0
  106. package/dist/orchestrator/dependency_graph.d.ts +7 -0
  107. package/dist/orchestrator/dependency_graph.js +73 -0
  108. package/dist/orchestrator/dependency_graph.js.map +1 -0
  109. package/dist/orchestrator/intent_parser.d.ts +11 -0
  110. package/dist/orchestrator/intent_parser.js +116 -0
  111. package/dist/orchestrator/intent_parser.js.map +1 -0
  112. package/dist/orchestrator/task_runner.d.ts +56 -0
  113. package/dist/orchestrator/task_runner.js +181 -0
  114. package/dist/orchestrator/task_runner.js.map +1 -0
  115. package/dist/orchestrator/types.d.ts +44 -0
  116. package/dist/orchestrator/types.js +21 -0
  117. package/dist/orchestrator/types.js.map +1 -0
  118. package/dist/providers/anthropic.d.ts +12 -0
  119. package/dist/providers/anthropic.js +258 -0
  120. package/dist/providers/anthropic.js.map +1 -0
  121. package/dist/providers/auction.d.ts +42 -0
  122. package/dist/providers/auction.js +190 -0
  123. package/dist/providers/auction.js.map +1 -0
  124. package/dist/providers/base.d.ts +103 -0
  125. package/dist/providers/base.js +2 -0
  126. package/dist/providers/base.js.map +1 -0
  127. package/dist/providers/cost_tracker.d.ts +45 -0
  128. package/dist/providers/cost_tracker.js +111 -0
  129. package/dist/providers/cost_tracker.js.map +1 -0
  130. package/dist/providers/duo_pair_router.d.ts +11 -0
  131. package/dist/providers/duo_pair_router.js +67 -0
  132. package/dist/providers/duo_pair_router.js.map +1 -0
  133. package/dist/providers/factory.d.ts +7 -0
  134. package/dist/providers/factory.js +130 -0
  135. package/dist/providers/factory.js.map +1 -0
  136. package/dist/providers/grading_rubric.d.ts +37 -0
  137. package/dist/providers/grading_rubric.js +238 -0
  138. package/dist/providers/grading_rubric.js.map +1 -0
  139. package/dist/providers/openai.d.ts +12 -0
  140. package/dist/providers/openai.js +229 -0
  141. package/dist/providers/openai.js.map +1 -0
  142. package/dist/providers/openrouter.d.ts +14 -0
  143. package/dist/providers/openrouter.js +178 -0
  144. package/dist/providers/openrouter.js.map +1 -0
  145. package/dist/providers/performance_tracker.d.ts +21 -0
  146. package/dist/providers/performance_tracker.js +63 -0
  147. package/dist/providers/performance_tracker.js.map +1 -0
  148. package/dist/providers/registry_loader.d.ts +6 -0
  149. package/dist/providers/registry_loader.js +54 -0
  150. package/dist/providers/registry_loader.js.map +1 -0
  151. package/dist/providers/retry.d.ts +66 -0
  152. package/dist/providers/retry.js +203 -0
  153. package/dist/providers/retry.js.map +1 -0
  154. package/dist/providers/role_scorer.d.ts +16 -0
  155. package/dist/providers/role_scorer.js +16 -0
  156. package/dist/providers/role_scorer.js.map +1 -0
  157. package/dist/providers/router.d.ts +84 -0
  158. package/dist/providers/router.js +542 -0
  159. package/dist/providers/router.js.map +1 -0
  160. package/dist/security/credentials.d.ts +6 -0
  161. package/dist/security/credentials.js +16 -0
  162. package/dist/security/credentials.js.map +1 -0
  163. package/dist/setup/browser.d.ts +1 -0
  164. package/dist/setup/browser.js +12 -0
  165. package/dist/setup/browser.js.map +1 -0
  166. package/dist/setup/global_config.d.ts +14 -0
  167. package/dist/setup/global_config.js +54 -0
  168. package/dist/setup/global_config.js.map +1 -0
  169. package/dist/setup/wizard.d.ts +2 -0
  170. package/dist/setup/wizard.js +206 -0
  171. package/dist/setup/wizard.js.map +1 -0
  172. package/dist/tools/agent_loop.d.ts +38 -0
  173. package/dist/tools/agent_loop.js +72 -0
  174. package/dist/tools/agent_loop.js.map +1 -0
  175. package/dist/tools/approval.d.ts +64 -0
  176. package/dist/tools/approval.js +172 -0
  177. package/dist/tools/approval.js.map +1 -0
  178. package/dist/tools/checkpoint.d.ts +65 -0
  179. package/dist/tools/checkpoint.js +342 -0
  180. package/dist/tools/checkpoint.js.map +1 -0
  181. package/dist/tools/definitions.d.ts +13 -0
  182. package/dist/tools/definitions.js +103 -0
  183. package/dist/tools/definitions.js.map +1 -0
  184. package/dist/tools/diff_display.d.ts +46 -0
  185. package/dist/tools/diff_display.js +298 -0
  186. package/dist/tools/diff_display.js.map +1 -0
  187. package/dist/tools/executor.d.ts +12 -0
  188. package/dist/tools/executor.js +340 -0
  189. package/dist/tools/executor.js.map +1 -0
  190. package/dist/tools/permissions.d.ts +17 -0
  191. package/dist/tools/permissions.js +139 -0
  192. package/dist/tools/permissions.js.map +1 -0
  193. package/dist/tools/tool_types.d.ts +48 -0
  194. package/dist/tools/tool_types.js +7 -0
  195. package/dist/tools/tool_types.js.map +1 -0
  196. package/dist/ui/banner.d.ts +4 -0
  197. package/dist/ui/banner.js +104 -0
  198. package/dist/ui/banner.js.map +1 -0
  199. package/dist/ui/callbacks.d.ts +30 -0
  200. package/dist/ui/callbacks.js +132 -0
  201. package/dist/ui/callbacks.js.map +1 -0
  202. package/dist/ui/colors.d.ts +14 -0
  203. package/dist/ui/colors.js +28 -0
  204. package/dist/ui/colors.js.map +1 -0
  205. package/dist/ui/dashboard.d.ts +51 -0
  206. package/dist/ui/dashboard.js +181 -0
  207. package/dist/ui/dashboard.js.map +1 -0
  208. package/dist/ui/leaderboard.d.ts +16 -0
  209. package/dist/ui/leaderboard.js +43 -0
  210. package/dist/ui/leaderboard.js.map +1 -0
  211. package/dist/ui/logger.d.ts +28 -0
  212. package/dist/ui/logger.js +117 -0
  213. package/dist/ui/logger.js.map +1 -0
  214. package/dist/ui/progress.d.ts +16 -0
  215. package/dist/ui/progress.js +62 -0
  216. package/dist/ui/progress.js.map +1 -0
  217. package/dist/ui/tokenizer.d.ts +5 -0
  218. package/dist/ui/tokenizer.js +54 -0
  219. package/dist/ui/tokenizer.js.map +1 -0
  220. package/package.json +63 -0
package/dist/cli.js ADDED
@@ -0,0 +1,423 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { createInterface } from "node:readline/promises";
5
+ import { Command } from "commander";
6
+ import { registerInitCommand } from "./commands/init.js";
7
+ import { registerStartCommand } from "./commands/start.js";
8
+ import { registerNegotiationCommand } from "./commands/negotiation.js";
9
+ import { registerTaskCommand } from "./commands/task.js";
10
+ import { registerGithubCommand } from "./commands/github.js";
11
+ import { registerDuoCommand, buildProviders, tryLoadProvider } from "./commands/duo.js";
12
+ import { registerDoctorCommand } from "./commands/doctor.js";
13
+ import { runInteractiveShell } from "./commands/shell.js";
14
+ import { handleSlashCommand, printHelp } from "./commands/repl_commands.js";
15
+ import { loadGlobalConfig, applyCredentialsToEnv, } from "./setup/global_config.js";
16
+ import { runSetupIfNeeded, runReconfigure } from "./setup/wizard.js";
17
+ import { loadConfig } from "./config/loader.js";
18
+ import { initDatabase } from "./db/schema.js";
19
+ import { buildProjectContext, stripMentions, extractMentions } from "./context/project_context.js";
20
+ import { formatSessionCost } from "./ui/progress.js";
21
+ import { DuoOrchestrator } from "./duo/duo_orchestrator.js";
22
+ import { DuoSession, MODE_LABELS, MODE_DESCRIPTIONS, } from "./duo/duo_session.js";
23
+ import { SessionStore } from "./duo/session_store.js";
24
+ import { CheckpointManager } from "./tools/checkpoint.js";
25
+ import { ProviderRouter } from "./providers/router.js";
26
+ import { R, B, DM, CYN, BLU, GRN, YLW, RED, stripAnsi } from "./ui/colors.js";
27
+ import { createLogger, configureLogger } from "./ui/logger.js";
28
+ import { banner, printManPage, printModels, checkPromptClarity, } from "./ui/banner.js";
29
+ import { makeConfirmationCallback, makeModelPickerCallback, makeArchitectReviewCallback, } from "./ui/callbacks.js";
30
+ const SELF_PATH = fileURLToPath(import.meta.url);
31
+ const log = createLogger("cli");
32
+ // ── Mode prompt rendering ───────────────────────────────────────
33
+ const MODE_COLORS = {
34
+ code: CYN,
35
+ plan: BLU,
36
+ execute: GRN,
37
+ debug: YLW,
38
+ };
39
+ function buildModePrompt(mode, costUsd = 0) {
40
+ const color = MODE_COLORS[mode];
41
+ const label = MODE_LABELS[mode];
42
+ const costStr = costUsd > 0 ? ` ${DM}(${formatSessionCost(costUsd)})${R}` : "";
43
+ return `${CYN}duocode${R} ${color}[${label}]${R}${costStr}${DM}>${R} `;
44
+ }
45
+ function printModeChange(mode) {
46
+ const color = MODE_COLORS[mode];
47
+ const label = MODE_LABELS[mode];
48
+ const desc = MODE_DESCRIPTIONS[mode];
49
+ log.raw(`${color}${B}${label}${R} ${DM}${desc}${R}\n`);
50
+ }
51
+ // ── Conversational REPL ─────────────────────────────────────────
52
+ async function runConversationalMode() {
53
+ if (!process.stdin.isTTY || !process.stdout.isTTY)
54
+ return;
55
+ const repoPath = process.cwd();
56
+ let db = null;
57
+ let projectConfig = null;
58
+ try {
59
+ projectConfig = loadConfig(repoPath);
60
+ const dbPath = path.resolve(repoPath, projectConfig.database.path);
61
+ try {
62
+ db = initDatabase(dbPath);
63
+ }
64
+ catch (dbError) {
65
+ const msg = dbError instanceof Error ? dbError.message : String(dbError);
66
+ log.warn("Could not open database", { error: msg });
67
+ }
68
+ }
69
+ catch { /* No project config — expected in non-project dirs */ }
70
+ configureLogger({
71
+ level: (process.env.DUOCODE_LOG_LEVEL ?? projectConfig?.logging?.level ?? "info"),
72
+ filePath: process.env.DUOCODE_LOG_FILE ?? projectConfig?.logging?.file ?? null,
73
+ });
74
+ // Graceful shutdown
75
+ let shuttingDown = false;
76
+ const shutdown = (signal) => {
77
+ if (shuttingDown)
78
+ return;
79
+ shuttingDown = true;
80
+ log.info("Shutting down", { signal });
81
+ db?.close();
82
+ process.exit(0);
83
+ };
84
+ process.on("SIGINT", () => shutdown("SIGINT"));
85
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
86
+ try {
87
+ const { capabilityRouter, costTracker } = buildProviders();
88
+ if (db)
89
+ costTracker.setDatabase(db);
90
+ const openaiProvider = await tryLoadProvider("openai");
91
+ const anthropicProvider = await tryLoadProvider("anthropic");
92
+ const providers = [openaiProvider, anthropicProvider].filter((p) => p !== null);
93
+ if (providers.length === 0) {
94
+ log.error("No providers configured. Run 'duocode login' to set up API keys.");
95
+ return;
96
+ }
97
+ const providerRouter = new ProviderRouter(providers, capabilityRouter, costTracker);
98
+ const session = new DuoSession();
99
+ const sessionStore = new SessionStore(repoPath);
100
+ const checkpointMgr = new CheckpointManager(repoPath);
101
+ let currentSessionId;
102
+ let currentRl = null;
103
+ const autoCheck = () => session.mode === "execute" || session.autoConfirm;
104
+ const getRl = () => currentRl;
105
+ const orchestrator = new DuoOrchestrator(providerRouter, capabilityRouter, costTracker, db, makeConfirmationCallback(getRl, { autoConfirm: autoCheck }), {
106
+ retryConfig: { maxAttempts: 3, baseDelayMs: 1000 },
107
+ onRetry: (attempt) => {
108
+ if (!attempt.success && attempt.error) {
109
+ const delay = attempt.error.retryAfterMs
110
+ ? `${(attempt.error.retryAfterMs / 1000).toFixed(1)}s`
111
+ : `${attempt.durationMs}ms`;
112
+ log.warn(`Retrying (attempt ${attempt.attempt + 2}/3, waiting ${delay})...`);
113
+ }
114
+ },
115
+ });
116
+ orchestrator.setModelPickerCallback(makeModelPickerCallback(getRl, { autoConfirm: autoCheck }));
117
+ orchestrator.setArchitectReviewCallback(makeArchitectReviewCallback(getRl, { autoConfirm: autoCheck }));
118
+ if (projectConfig?.tools) {
119
+ orchestrator.setPermissionConfig({
120
+ level: "confirm-writes",
121
+ allowedCommandPatterns: projectConfig.tools.allowedCommands,
122
+ deniedCommandPatterns: undefined,
123
+ });
124
+ }
125
+ const contextConfig = projectConfig?.context
126
+ ? {
127
+ maxDepth: projectConfig.context.maxDepth,
128
+ maxTreeFiles: projectConfig.context.maxFiles,
129
+ maxFileSizeBytes: projectConfig.context.maxFileSizeKb * 1024,
130
+ maxContextChars: projectConfig.context.maxContextChars,
131
+ ignoreDirs: projectConfig.context.ignoreDirs,
132
+ }
133
+ : undefined;
134
+ log.raw(`\n ${CYN}${B}Conversational mode${R} ${DM}— type your request, or /help for commands${R}\n`);
135
+ log.raw(` ${DM}Shift+Tab to cycle modes:${R} ${CYN}Code${R} ${DM}→${R} ${BLU}Plan${R} ${DM}→${R} ${GRN}Execute${R} ${DM}→${R} ${YLW}Debug${R}\n\n`);
136
+ let rl = createInterface({ input: process.stdin, output: process.stdout });
137
+ currentRl = rl;
138
+ const keypressHandler = (_ch, key) => {
139
+ if (key?.name === "tab" && key?.shift) {
140
+ const newMode = session.cycleMode();
141
+ const iface = rl;
142
+ const currentInput = iface.line ?? "";
143
+ const cursor = iface.cursor ?? currentInput.length;
144
+ const newPrompt = buildModePrompt(newMode, session.getTotalCost());
145
+ if (iface._prompt !== undefined)
146
+ iface._prompt = newPrompt;
147
+ process.stdout.write("\r\x1b[2K" + newPrompt + currentInput);
148
+ process.stdout.write(`\x1b[${stripAnsi(newPrompt).length + cursor + 1}G`);
149
+ }
150
+ };
151
+ process.stdin.on("keypress", keypressHandler);
152
+ // Slash command context (shared mutable state)
153
+ const cmdCtx = {
154
+ session, sessionStore, checkpointMgr, db,
155
+ currentSessionId,
156
+ setSessionId: (id) => { currentSessionId = id; cmdCtx.currentSessionId = id; },
157
+ log,
158
+ };
159
+ try {
160
+ while (true) {
161
+ const raw = await rl.question(buildModePrompt(session.mode, session.getTotalCost()));
162
+ const line = raw.trim();
163
+ if (!line)
164
+ continue;
165
+ // ── Slash commands ──
166
+ if (line.startsWith("/")) {
167
+ const [cmd, ...rest] = line.slice(1).split(/\s+/);
168
+ const cmdLower = cmd.toLowerCase();
169
+ // Mode handled separately (needs readline access)
170
+ if (cmdLower === "mode") {
171
+ const modeArg = rest[0]?.toLowerCase();
172
+ if (modeArg && (modeArg === "code" || modeArg === "plan" || modeArg === "execute" || modeArg === "debug")) {
173
+ session.setMode(modeArg);
174
+ printModeChange(session.mode);
175
+ }
176
+ else if (!modeArg) {
177
+ printModeChange(session.cycleMode());
178
+ }
179
+ else {
180
+ log.raw(`${RED}Unknown mode: ${modeArg}${R} ${DM}(code|plan|execute|debug)${R}\n`);
181
+ }
182
+ log.raw("\n");
183
+ continue;
184
+ }
185
+ // Shell handled separately (needs readline close/reopen)
186
+ if (cmdLower === "shell") {
187
+ process.stdin.removeListener("keypress", keypressHandler);
188
+ rl.close();
189
+ await runInteractiveShell(SELF_PATH);
190
+ rl = createInterface({ input: process.stdin, output: process.stdout });
191
+ currentRl = rl;
192
+ process.stdin.on("keypress", keypressHandler);
193
+ log.raw(`\n ${DM}Back to conversational mode.${R}\n\n`);
194
+ continue;
195
+ }
196
+ const result = handleSlashCommand(cmdLower, rest, cmdCtx);
197
+ if (result === "exit")
198
+ break;
199
+ if (result === "handled")
200
+ continue;
201
+ log.raw(`${RED}Unknown command: /${cmd}${R} ${DM}(type /help)${R}\n\n`);
202
+ continue;
203
+ }
204
+ // ── Bare commands ──
205
+ const lineLower = line.toLowerCase();
206
+ if (lineLower === "man" || lineLower === "manual") {
207
+ printManPage();
208
+ continue;
209
+ }
210
+ if (lineLower === "models") {
211
+ printModels();
212
+ continue;
213
+ }
214
+ if (lineLower === "help") {
215
+ printHelp(log);
216
+ continue;
217
+ }
218
+ // "go"/"execute"/"continue" — run stored plan
219
+ if (lineLower === "go" || lineLower === "execute" || lineLower === "continue") {
220
+ const pending = session.pendingPlan;
221
+ if (!pending) {
222
+ log.warn("No stored plan. Use Plan mode to generate one first.");
223
+ continue;
224
+ }
225
+ log.info("Executing stored plan...");
226
+ checkpointMgr.create(`pre-go: ${pending.prompt.slice(0, 30)}`);
227
+ const conversationContext = session.buildContext();
228
+ try {
229
+ const result = await orchestrator.execute({
230
+ prompt: pending.prompt,
231
+ conversationContext: conversationContext || undefined,
232
+ enableGrading: session.gradingEnabled,
233
+ requireConfirmation: session.mode !== "execute" && !session.autoConfirm,
234
+ precomputedPlan: pending.architectOutput,
235
+ });
236
+ session.clearPendingPlan();
237
+ if (result === null) {
238
+ log.raw(`${DM}Aborted.${R}\n\n`);
239
+ continue;
240
+ }
241
+ session.addTurn({
242
+ prompt: pending.prompt,
243
+ architectPlan: pending.architectOutput,
244
+ executorOutput: result.executorOutput,
245
+ grading: result.grading,
246
+ costUsd: pending.costUsd + result.totalCostUsd,
247
+ durationMs: pending.durationMs + result.durationMs,
248
+ timestamp: Date.now(),
249
+ });
250
+ currentSessionId = sessionStore.saveAsync(session, currentSessionId);
251
+ cmdCtx.currentSessionId = currentSessionId;
252
+ }
253
+ catch (error) {
254
+ log.error(`DuoPair failed: ${error instanceof Error ? error.message : String(error)}`);
255
+ }
256
+ continue;
257
+ }
258
+ // ── Regular prompt ──
259
+ let userPrompt = line;
260
+ if (userPrompt.startsWith("!")) {
261
+ userPrompt = userPrompt.slice(1).trim();
262
+ }
263
+ else {
264
+ const clarification = checkPromptClarity(userPrompt);
265
+ if (clarification) {
266
+ log.warn(clarification);
267
+ continue;
268
+ }
269
+ }
270
+ const conversationContext = session.buildContext();
271
+ const currentMode = session.mode;
272
+ const mentions = extractMentions(userPrompt, repoPath);
273
+ const cleanPrompt = mentions.length > 0 ? stripMentions(userPrompt) : userPrompt;
274
+ let projectContextStr;
275
+ let includedFilesList;
276
+ if (mentions.length > 0 || contextConfig) {
277
+ const ctx = buildProjectContext(repoPath, userPrompt, contextConfig);
278
+ if (ctx.includedFiles.length > 0) {
279
+ projectContextStr = ctx.systemContext;
280
+ includedFilesList = ctx.includedFiles.map((f) => ({ path: f.path, reason: f.reason }));
281
+ let contextLine = `${DM}Context: ${ctx.includedFiles.length} files included`;
282
+ if (ctx.droppedFiles.length > 0)
283
+ contextLine += `, ${ctx.droppedFiles.length} dropped (budget)`;
284
+ log.raw(`${contextLine}${R}\n`);
285
+ for (const f of ctx.includedFiles.slice(0, 5))
286
+ log.raw(` ${DM} ${f.path} (${f.reason})${R}\n`);
287
+ if (ctx.includedFiles.length > 5)
288
+ log.raw(` ${DM} ... and ${ctx.includedFiles.length - 5} more${R}\n`);
289
+ }
290
+ }
291
+ let effectivePrompt = cleanPrompt;
292
+ if (currentMode === "debug") {
293
+ effectivePrompt =
294
+ `DEBUG REQUEST: Analyze and fix the following issue. ` +
295
+ `Identify root causes, explain the error, and provide corrected code.\n\n${cleanPrompt}`;
296
+ }
297
+ const configArchitect = projectConfig?.models?.preferredArchitect;
298
+ const configExecutor = projectConfig?.models?.preferredExecutor;
299
+ const configJudge = projectConfig?.models?.judge;
300
+ if (currentMode !== "plan") {
301
+ checkpointMgr.create(`pre: ${userPrompt.slice(0, 40)}`);
302
+ }
303
+ try {
304
+ if (currentMode === "plan") {
305
+ const result = await orchestrator.execute({
306
+ prompt: effectivePrompt,
307
+ conversationContext: conversationContext || undefined,
308
+ projectContext: projectContextStr,
309
+ includedFiles: includedFilesList,
310
+ preferredArchitect: configArchitect,
311
+ enableGrading: false,
312
+ requireConfirmation: !session.autoConfirm,
313
+ architectOnly: true,
314
+ });
315
+ if (result === null) {
316
+ log.raw(`${DM}Aborted.${R}\n\n`);
317
+ continue;
318
+ }
319
+ session.storePlan({
320
+ prompt: effectivePrompt,
321
+ architectOutput: result.architectOutput,
322
+ costUsd: result.totalCostUsd,
323
+ durationMs: result.durationMs,
324
+ });
325
+ currentSessionId = sessionStore.saveAsync(session, currentSessionId);
326
+ cmdCtx.currentSessionId = currentSessionId;
327
+ log.raw(`\n${BLU}${B}Plan stored.${R} ${DM}Type ${CYN}go${R}${DM} to execute, or switch to Execute mode with Shift+Tab.${R}\n\n`);
328
+ }
329
+ else {
330
+ const result = await orchestrator.execute({
331
+ prompt: effectivePrompt,
332
+ conversationContext: conversationContext || undefined,
333
+ projectContext: projectContextStr,
334
+ includedFiles: includedFilesList,
335
+ preferredArchitect: configArchitect,
336
+ preferredExecutor: configExecutor,
337
+ judgeModel: configJudge,
338
+ enableGrading: session.gradingEnabled,
339
+ requireConfirmation: currentMode !== "execute" && !session.autoConfirm,
340
+ });
341
+ if (result === null) {
342
+ log.raw(`${DM}Aborted.${R}\n\n`);
343
+ continue;
344
+ }
345
+ session.addTurn({
346
+ prompt: userPrompt,
347
+ architectPlan: result.architectOutput,
348
+ executorOutput: result.executorOutput,
349
+ grading: result.grading,
350
+ costUsd: result.totalCostUsd,
351
+ durationMs: result.durationMs,
352
+ timestamp: Date.now(),
353
+ });
354
+ currentSessionId = sessionStore.saveAsync(session, currentSessionId);
355
+ cmdCtx.currentSessionId = currentSessionId;
356
+ }
357
+ }
358
+ catch (error) {
359
+ log.error(`DuoPair failed: ${error instanceof Error ? error.message : String(error)}`);
360
+ }
361
+ }
362
+ }
363
+ finally {
364
+ process.stdin.removeListener("keypress", keypressHandler);
365
+ rl.close();
366
+ log.raw("\n");
367
+ }
368
+ }
369
+ finally {
370
+ db?.close();
371
+ }
372
+ }
373
+ // ── CLI program ─────────────────────────────────────────────────
374
+ const program = new Command();
375
+ program
376
+ .name("duocode")
377
+ .description("Multi-agent code orchestrator")
378
+ .version("0.1.0");
379
+ registerStartCommand(program);
380
+ registerInitCommand(program);
381
+ registerTaskCommand(program);
382
+ registerNegotiationCommand(program);
383
+ registerGithubCommand(program);
384
+ registerDuoCommand(program);
385
+ registerDoctorCommand(program);
386
+ program
387
+ .command("shell")
388
+ .description("Start interactive Duocode shell (run commands without prefix)")
389
+ .action(async () => { await runInteractiveShell(SELF_PATH); });
390
+ program
391
+ .command("login")
392
+ .description("Re-authenticate with AI providers")
393
+ .action(async () => { log.raw(banner()); await runReconfigure(); });
394
+ program
395
+ .command("man")
396
+ .description("Show all commands and usage")
397
+ .action(() => { log.raw(banner()); printManPage(); });
398
+ program.configureOutput({
399
+ outputError: (str, write) => write(`\x1b[31mError:\x1b[0m ${str}`),
400
+ });
401
+ const savedConfig = loadGlobalConfig();
402
+ if (savedConfig)
403
+ applyCredentialsToEnv(savedConfig);
404
+ const args = process.argv.slice(2);
405
+ if (args.length === 0) {
406
+ log.raw(banner());
407
+ runSetupIfNeeded(process.cwd())
408
+ .then(async () => {
409
+ if (process.env.DUOCODE_SHELL_CHILD !== "1")
410
+ await runConversationalMode();
411
+ })
412
+ .catch((error) => {
413
+ log.error(error instanceof Error ? error.message : String(error));
414
+ process.exitCode = 1;
415
+ });
416
+ }
417
+ else {
418
+ program.parseAsync(process.argv).catch((error) => {
419
+ log.error(`duocode failed: ${error instanceof Error ? error.message : String(error)}`);
420
+ process.exitCode = 1;
421
+ });
422
+ }
423
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Health-check command: verify installation, native deps, and API keys.
3
+ */
4
+ import { Command } from "commander";
5
+ export declare function registerDoctorCommand(program: Command): void;
@@ -0,0 +1,63 @@
1
+ export function registerDoctorCommand(program) {
2
+ program
3
+ .command("doctor")
4
+ .description("Verify duocode installation and dependencies")
5
+ .action(async () => {
6
+ let ok = true;
7
+ // Node.js version
8
+ const nodeVersion = process.version;
9
+ const major = Number(nodeVersion.slice(1).split(".")[0]);
10
+ if (major >= 20) {
11
+ console.log(` ok Node.js ${nodeVersion}`);
12
+ }
13
+ else {
14
+ console.log(` FAIL Node.js ${nodeVersion} (need >= 20)`);
15
+ ok = false;
16
+ }
17
+ // better-sqlite3
18
+ try {
19
+ await import("better-sqlite3");
20
+ console.log(" ok better-sqlite3");
21
+ }
22
+ catch {
23
+ console.log(" FAIL better-sqlite3 not available");
24
+ ok = false;
25
+ }
26
+ // tree-sitter (optional)
27
+ try {
28
+ await import("tree-sitter");
29
+ console.log(" ok tree-sitter");
30
+ }
31
+ catch {
32
+ console.log(" warn tree-sitter not available (negotiation features disabled)");
33
+ }
34
+ // Language grammars
35
+ for (const grammar of ["tree-sitter-typescript", "tree-sitter-python", "tree-sitter-go"]) {
36
+ try {
37
+ await import(grammar);
38
+ console.log(` ok ${grammar}`);
39
+ }
40
+ catch {
41
+ console.log(` warn ${grammar} not available`);
42
+ }
43
+ }
44
+ // API keys
45
+ console.log("");
46
+ const openai = process.env.OPENAI_API_KEY ? "set" : "not set";
47
+ const anthropic = process.env.ANTHROPIC_API_KEY ? "set" : "not set";
48
+ console.log(` OPENAI_API_KEY: ${openai}`);
49
+ console.log(` ANTHROPIC_API_KEY: ${anthropic}`);
50
+ if (!process.env.OPENAI_API_KEY && !process.env.ANTHROPIC_API_KEY) {
51
+ console.log("\n warn No API keys configured. Run 'duocode login' to set up.");
52
+ }
53
+ console.log("");
54
+ if (ok) {
55
+ console.log(" Installation healthy.");
56
+ }
57
+ else {
58
+ console.log(" Issues found. Fix the items marked FAIL above.");
59
+ process.exitCode = 1;
60
+ }
61
+ });
62
+ }
63
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,EAAE,GAAG,IAAI,CAAC;QAEd,kBAAkB;QAClB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,eAAe,CAAC,CAAC;YAC3D,EAAE,GAAG,KAAK,CAAC;QACb,CAAC;QAED,iBAAiB;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,EAAE,GAAG,KAAK,CAAC;QACb,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACnF,CAAC;QAED,oBAAoB;QACpB,KAAK,MAAM,OAAO,IAAI,CAAC,wBAAwB,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,EAAE,CAAC;YACzF,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,gBAAgB,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,WAAW;QACX,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;QAElD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAClF,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,EAAE,EAAE,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "commander";
2
+ import { CapabilityRouter } from "../providers/router.js";
3
+ import { CostTracker } from "../providers/cost_tracker.js";
4
+ export declare function buildProviders(): {
5
+ capabilityRouter: CapabilityRouter;
6
+ costTracker: CostTracker;
7
+ };
8
+ export declare function registerDuoCommand(program: Command): void;
9
+ export declare function tryLoadProvider(name: "openai" | "anthropic"): Promise<import("../providers/base.js").ModelProvider | null>;