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.
- package/.env.example +36 -0
- package/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/ast/context.d.ts +16 -0
- package/dist/ast/context.js +37 -0
- package/dist/ast/context.js.map +1 -0
- package/dist/ast/diff.d.ts +27 -0
- package/dist/ast/diff.js +44 -0
- package/dist/ast/diff.js.map +1 -0
- package/dist/ast/locks.d.ts +47 -0
- package/dist/ast/locks.js +88 -0
- package/dist/ast/locks.js.map +1 -0
- package/dist/ast/merge.d.ts +22 -0
- package/dist/ast/merge.js +120 -0
- package/dist/ast/merge.js.map +1 -0
- package/dist/ast/ownership.d.ts +31 -0
- package/dist/ast/ownership.js +111 -0
- package/dist/ast/ownership.js.map +1 -0
- package/dist/ast/parser.d.ts +44 -0
- package/dist/ast/parser.js +134 -0
- package/dist/ast/parser.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +423 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.js +63 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/duo.d.ts +9 -0
- package/dist/commands/duo.js +285 -0
- package/dist/commands/duo.js.map +1 -0
- package/dist/commands/github.d.ts +2 -0
- package/dist/commands/github.js +85 -0
- package/dist/commands/github.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +33 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/negotiation.d.ts +2 -0
- package/dist/commands/negotiation.js +160 -0
- package/dist/commands/negotiation.js.map +1 -0
- package/dist/commands/repl_commands.d.ts +26 -0
- package/dist/commands/repl_commands.js +226 -0
- package/dist/commands/repl_commands.js.map +1 -0
- package/dist/commands/shell.d.ts +1 -0
- package/dist/commands/shell.js +110 -0
- package/dist/commands/shell.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.js +231 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/task.d.ts +2 -0
- package/dist/commands/task.js +215 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/config/loader.d.ts +193 -0
- package/dist/config/loader.js +106 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/context/project_context.d.ts +79 -0
- package/dist/context/project_context.js +292 -0
- package/dist/context/project_context.js.map +1 -0
- package/dist/context/token_budget.d.ts +35 -0
- package/dist/context/token_budget.js +81 -0
- package/dist/context/token_budget.js.map +1 -0
- package/dist/db/queries.d.ts +121 -0
- package/dist/db/queries.js +109 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.d.ts +110 -0
- package/dist/db/schema.js +346 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/duo/duo_orchestrator.d.ts +50 -0
- package/dist/duo/duo_orchestrator.js +510 -0
- package/dist/duo/duo_orchestrator.js.map +1 -0
- package/dist/duo/duo_session.d.ts +47 -0
- package/dist/duo/duo_session.js +127 -0
- package/dist/duo/duo_session.js.map +1 -0
- package/dist/duo/duo_types.d.ts +168 -0
- package/dist/duo/duo_types.js +53 -0
- package/dist/duo/duo_types.js.map +1 -0
- package/dist/duo/session_store.d.ts +71 -0
- package/dist/duo/session_store.js +177 -0
- package/dist/duo/session_store.js.map +1 -0
- package/dist/git/worktree.d.ts +21 -0
- package/dist/git/worktree.js +86 -0
- package/dist/git/worktree.js.map +1 -0
- package/dist/github/cache.d.ts +23 -0
- package/dist/github/cache.js +67 -0
- package/dist/github/cache.js.map +1 -0
- package/dist/github/issues.d.ts +17 -0
- package/dist/github/issues.js +93 -0
- package/dist/github/issues.js.map +1 -0
- package/dist/github/mcp_client.d.ts +57 -0
- package/dist/github/mcp_client.js +214 -0
- package/dist/github/mcp_client.js.map +1 -0
- package/dist/github/sync.d.ts +11 -0
- package/dist/github/sync.js +65 -0
- package/dist/github/sync.js.map +1 -0
- package/dist/github/webhook.d.ts +25 -0
- package/dist/github/webhook.js +197 -0
- package/dist/github/webhook.js.map +1 -0
- package/dist/negotiation/index.d.ts +1 -0
- package/dist/negotiation/index.js +2 -0
- package/dist/negotiation/index.js.map +1 -0
- package/dist/negotiation/protocol.d.ts +62 -0
- package/dist/negotiation/protocol.js +188 -0
- package/dist/negotiation/protocol.js.map +1 -0
- package/dist/orchestrator/complexity_scorer.d.ts +2 -0
- package/dist/orchestrator/complexity_scorer.js +79 -0
- package/dist/orchestrator/complexity_scorer.js.map +1 -0
- package/dist/orchestrator/dependency_graph.d.ts +7 -0
- package/dist/orchestrator/dependency_graph.js +73 -0
- package/dist/orchestrator/dependency_graph.js.map +1 -0
- package/dist/orchestrator/intent_parser.d.ts +11 -0
- package/dist/orchestrator/intent_parser.js +116 -0
- package/dist/orchestrator/intent_parser.js.map +1 -0
- package/dist/orchestrator/task_runner.d.ts +56 -0
- package/dist/orchestrator/task_runner.js +181 -0
- package/dist/orchestrator/task_runner.js.map +1 -0
- package/dist/orchestrator/types.d.ts +44 -0
- package/dist/orchestrator/types.js +21 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +12 -0
- package/dist/providers/anthropic.js +258 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/auction.d.ts +42 -0
- package/dist/providers/auction.js +190 -0
- package/dist/providers/auction.js.map +1 -0
- package/dist/providers/base.d.ts +103 -0
- package/dist/providers/base.js +2 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/cost_tracker.d.ts +45 -0
- package/dist/providers/cost_tracker.js +111 -0
- package/dist/providers/cost_tracker.js.map +1 -0
- package/dist/providers/duo_pair_router.d.ts +11 -0
- package/dist/providers/duo_pair_router.js +67 -0
- package/dist/providers/duo_pair_router.js.map +1 -0
- package/dist/providers/factory.d.ts +7 -0
- package/dist/providers/factory.js +130 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/grading_rubric.d.ts +37 -0
- package/dist/providers/grading_rubric.js +238 -0
- package/dist/providers/grading_rubric.js.map +1 -0
- package/dist/providers/openai.d.ts +12 -0
- package/dist/providers/openai.js +229 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +14 -0
- package/dist/providers/openrouter.js +178 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/performance_tracker.d.ts +21 -0
- package/dist/providers/performance_tracker.js +63 -0
- package/dist/providers/performance_tracker.js.map +1 -0
- package/dist/providers/registry_loader.d.ts +6 -0
- package/dist/providers/registry_loader.js +54 -0
- package/dist/providers/registry_loader.js.map +1 -0
- package/dist/providers/retry.d.ts +66 -0
- package/dist/providers/retry.js +203 -0
- package/dist/providers/retry.js.map +1 -0
- package/dist/providers/role_scorer.d.ts +16 -0
- package/dist/providers/role_scorer.js +16 -0
- package/dist/providers/role_scorer.js.map +1 -0
- package/dist/providers/router.d.ts +84 -0
- package/dist/providers/router.js +542 -0
- package/dist/providers/router.js.map +1 -0
- package/dist/security/credentials.d.ts +6 -0
- package/dist/security/credentials.js +16 -0
- package/dist/security/credentials.js.map +1 -0
- package/dist/setup/browser.d.ts +1 -0
- package/dist/setup/browser.js +12 -0
- package/dist/setup/browser.js.map +1 -0
- package/dist/setup/global_config.d.ts +14 -0
- package/dist/setup/global_config.js +54 -0
- package/dist/setup/global_config.js.map +1 -0
- package/dist/setup/wizard.d.ts +2 -0
- package/dist/setup/wizard.js +206 -0
- package/dist/setup/wizard.js.map +1 -0
- package/dist/tools/agent_loop.d.ts +38 -0
- package/dist/tools/agent_loop.js +72 -0
- package/dist/tools/agent_loop.js.map +1 -0
- package/dist/tools/approval.d.ts +64 -0
- package/dist/tools/approval.js +172 -0
- package/dist/tools/approval.js.map +1 -0
- package/dist/tools/checkpoint.d.ts +65 -0
- package/dist/tools/checkpoint.js +342 -0
- package/dist/tools/checkpoint.js.map +1 -0
- package/dist/tools/definitions.d.ts +13 -0
- package/dist/tools/definitions.js +103 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/diff_display.d.ts +46 -0
- package/dist/tools/diff_display.js +298 -0
- package/dist/tools/diff_display.js.map +1 -0
- package/dist/tools/executor.d.ts +12 -0
- package/dist/tools/executor.js +340 -0
- package/dist/tools/executor.js.map +1 -0
- package/dist/tools/permissions.d.ts +17 -0
- package/dist/tools/permissions.js +139 -0
- package/dist/tools/permissions.js.map +1 -0
- package/dist/tools/tool_types.d.ts +48 -0
- package/dist/tools/tool_types.js +7 -0
- package/dist/tools/tool_types.js.map +1 -0
- package/dist/ui/banner.d.ts +4 -0
- package/dist/ui/banner.js +104 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/callbacks.d.ts +30 -0
- package/dist/ui/callbacks.js +132 -0
- package/dist/ui/callbacks.js.map +1 -0
- package/dist/ui/colors.d.ts +14 -0
- package/dist/ui/colors.js +28 -0
- package/dist/ui/colors.js.map +1 -0
- package/dist/ui/dashboard.d.ts +51 -0
- package/dist/ui/dashboard.js +181 -0
- package/dist/ui/dashboard.js.map +1 -0
- package/dist/ui/leaderboard.d.ts +16 -0
- package/dist/ui/leaderboard.js +43 -0
- package/dist/ui/leaderboard.js.map +1 -0
- package/dist/ui/logger.d.ts +28 -0
- package/dist/ui/logger.js +117 -0
- package/dist/ui/logger.js.map +1 -0
- package/dist/ui/progress.d.ts +16 -0
- package/dist/ui/progress.js +62 -0
- package/dist/ui/progress.js.map +1 -0
- package/dist/ui/tokenizer.d.ts +5 -0
- package/dist/ui/tokenizer.js +54 -0
- package/dist/ui/tokenizer.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slash command handlers for the conversational REPL.
|
|
3
|
+
* Extracted from cli.ts to keep file sizes manageable.
|
|
4
|
+
*/
|
|
5
|
+
import type { DuoSession } from "../duo/duo_session.js";
|
|
6
|
+
import type { SessionStore } from "../duo/session_store.js";
|
|
7
|
+
import type { CheckpointManager } from "../tools/checkpoint.js";
|
|
8
|
+
import type { Logger } from "../ui/logger.js";
|
|
9
|
+
import type Database from "better-sqlite3";
|
|
10
|
+
export interface SlashCommandContext {
|
|
11
|
+
session: DuoSession;
|
|
12
|
+
sessionStore: SessionStore;
|
|
13
|
+
checkpointMgr: CheckpointManager;
|
|
14
|
+
currentSessionId: string | undefined;
|
|
15
|
+
setSessionId: (id: string | undefined) => void;
|
|
16
|
+
db: Database.Database | null;
|
|
17
|
+
log: Logger;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Handle a slash command. Returns:
|
|
21
|
+
* - "handled" if the command was processed
|
|
22
|
+
* - "exit" if user wants to quit
|
|
23
|
+
* - "unknown" if the command is not recognized
|
|
24
|
+
*/
|
|
25
|
+
export declare function handleSlashCommand(cmdLower: string, rest: string[], ctx: SlashCommandContext): "handled" | "exit" | "unknown";
|
|
26
|
+
export declare function printHelp(log: Logger): void;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { DIMENSION_WEIGHTS } from "../duo/duo_types.js";
|
|
2
|
+
import { R, B, CYN, GRN, RED, DM, MAG } from "../ui/colors.js";
|
|
3
|
+
import { printLeaderboard } from "../ui/leaderboard.js";
|
|
4
|
+
/**
|
|
5
|
+
* Handle a slash command. Returns:
|
|
6
|
+
* - "handled" if the command was processed
|
|
7
|
+
* - "exit" if user wants to quit
|
|
8
|
+
* - "unknown" if the command is not recognized
|
|
9
|
+
*/
|
|
10
|
+
export function handleSlashCommand(cmdLower, rest, ctx) {
|
|
11
|
+
const { session, sessionStore, checkpointMgr, log, db } = ctx;
|
|
12
|
+
if (cmdLower === "exit" || cmdLower === "quit") {
|
|
13
|
+
return "exit";
|
|
14
|
+
}
|
|
15
|
+
if (cmdLower === "clear") {
|
|
16
|
+
session.clear();
|
|
17
|
+
log.raw(`${DM}Session cleared.${R}\n\n`);
|
|
18
|
+
return "handled";
|
|
19
|
+
}
|
|
20
|
+
if (cmdLower === "history") {
|
|
21
|
+
log.raw(`\n${session.buildHistorySummary()}\n\n`);
|
|
22
|
+
return "handled";
|
|
23
|
+
}
|
|
24
|
+
if (cmdLower === "help") {
|
|
25
|
+
printHelp(log);
|
|
26
|
+
return "handled";
|
|
27
|
+
}
|
|
28
|
+
if (cmdLower === "leaderboard") {
|
|
29
|
+
if (!db) {
|
|
30
|
+
log.raw(`${DM}No database available (no project initialized).${R}\n\n`);
|
|
31
|
+
return "handled";
|
|
32
|
+
}
|
|
33
|
+
printLeaderboard(db);
|
|
34
|
+
return "handled";
|
|
35
|
+
}
|
|
36
|
+
if (cmdLower === "config") {
|
|
37
|
+
log.raw(`\n${B}${CYN}DuoPair Configuration${R}\n\n`);
|
|
38
|
+
log.raw(`${DM}Model selection: user-driven (interactive picker)${R}\n`);
|
|
39
|
+
log.raw(`${DM}Default assignment: sorted by roleAffinity${R}\n\n`);
|
|
40
|
+
log.raw(`${B}${MAG}ISO/IEC 25010 Grading Weights${R}\n`);
|
|
41
|
+
for (const [key, value] of Object.entries(DIMENSION_WEIGHTS)) {
|
|
42
|
+
log.raw(` ${key.padEnd(18)} ${(value * 100).toFixed(0)}%\n`);
|
|
43
|
+
}
|
|
44
|
+
log.raw("\n");
|
|
45
|
+
return "handled";
|
|
46
|
+
}
|
|
47
|
+
if (cmdLower === "no-grade") {
|
|
48
|
+
const enabled = session.toggleGrading();
|
|
49
|
+
log.raw(`${DM}Grading ${enabled ? "enabled" : "disabled"} for subsequent turns.${R}\n\n`);
|
|
50
|
+
return "handled";
|
|
51
|
+
}
|
|
52
|
+
if (cmdLower === "auto-confirm") {
|
|
53
|
+
const enabled = session.toggleAutoConfirm();
|
|
54
|
+
log.raw(`${DM}Auto-confirm ${enabled ? "enabled" : "disabled"}.${R}\n\n`);
|
|
55
|
+
return "handled";
|
|
56
|
+
}
|
|
57
|
+
if (cmdLower === "save") {
|
|
58
|
+
try {
|
|
59
|
+
const id = sessionStore.save(session, ctx.currentSessionId);
|
|
60
|
+
ctx.setSessionId(id);
|
|
61
|
+
log.info("Session saved", { sessionId: id });
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
65
|
+
log.error(`Save failed: ${msg}`);
|
|
66
|
+
}
|
|
67
|
+
return "handled";
|
|
68
|
+
}
|
|
69
|
+
if (cmdLower === "resume") {
|
|
70
|
+
handleResume(rest, ctx);
|
|
71
|
+
return "handled";
|
|
72
|
+
}
|
|
73
|
+
if (cmdLower === "sessions") {
|
|
74
|
+
handleSessionsList(ctx);
|
|
75
|
+
return "handled";
|
|
76
|
+
}
|
|
77
|
+
if (cmdLower === "undo") {
|
|
78
|
+
handleUndo(rest, ctx);
|
|
79
|
+
return "handled";
|
|
80
|
+
}
|
|
81
|
+
if (cmdLower === "redo") {
|
|
82
|
+
handleRedo(ctx);
|
|
83
|
+
return "handled";
|
|
84
|
+
}
|
|
85
|
+
return "unknown";
|
|
86
|
+
}
|
|
87
|
+
function handleResume(rest, ctx) {
|
|
88
|
+
const { session, sessionStore, log } = ctx;
|
|
89
|
+
const targetId = rest[0];
|
|
90
|
+
if (!targetId) {
|
|
91
|
+
const sessions = sessionStore.list();
|
|
92
|
+
if (sessions.length === 0) {
|
|
93
|
+
log.raw(`${DM}No saved sessions.${R}\n\n`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
log.raw(`\n ${B}Saved sessions${R} ${DM}(use /resume <id>)${R}\n\n`);
|
|
97
|
+
for (const s of sessions.slice(0, 10)) {
|
|
98
|
+
const date = new Date(s.updatedAt).toLocaleString();
|
|
99
|
+
log.raw(` ${CYN}${s.id.slice(0, 8)}${R} ${DM}${date} ${s.turns.length} turns $${s.totalCostUsd.toFixed(4)}${R} "${s.promptPreview}"\n`);
|
|
100
|
+
}
|
|
101
|
+
log.raw("\n");
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const allSessions = sessionStore.list();
|
|
105
|
+
const match = allSessions.find((s) => s.id.startsWith(targetId));
|
|
106
|
+
if (!match) {
|
|
107
|
+
log.error(`Session not found: ${targetId}`);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const { session: restored, data } = sessionStore.resume(match.id);
|
|
112
|
+
session.clear();
|
|
113
|
+
for (const turn of restored.getTurns()) {
|
|
114
|
+
session.addTurn(turn);
|
|
115
|
+
}
|
|
116
|
+
session.setMode(data.mode);
|
|
117
|
+
if (data.gradingEnabled !== session.gradingEnabled)
|
|
118
|
+
session.toggleGrading();
|
|
119
|
+
if (data.autoConfirm !== session.autoConfirm)
|
|
120
|
+
session.toggleAutoConfirm();
|
|
121
|
+
session.assignment = data.assignment;
|
|
122
|
+
if (data.pendingPlan)
|
|
123
|
+
session.storePlan(data.pendingPlan);
|
|
124
|
+
ctx.setSessionId(match.id);
|
|
125
|
+
log.info("Resumed session", {
|
|
126
|
+
sessionId: match.id.slice(0, 8),
|
|
127
|
+
turns: data.turns.length,
|
|
128
|
+
cost: `$${data.totalCostUsd.toFixed(4)}`,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
133
|
+
log.error(`Resume failed: ${msg}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function handleSessionsList(ctx) {
|
|
137
|
+
const { sessionStore, log, currentSessionId } = ctx;
|
|
138
|
+
const sessions = sessionStore.list();
|
|
139
|
+
if (sessions.length === 0) {
|
|
140
|
+
log.raw(`${DM}No saved sessions.${R}\n\n`);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
log.raw(`\n ${B}Saved sessions${R}\n\n`);
|
|
144
|
+
for (const s of sessions) {
|
|
145
|
+
const date = new Date(s.updatedAt).toLocaleString();
|
|
146
|
+
const current = s.id === currentSessionId ? ` ${GRN}(current)${R}` : "";
|
|
147
|
+
log.raw(` ${CYN}${s.id.slice(0, 8)}${R}${current} ${DM}${date} ${s.turns.length} turns $${s.totalCostUsd.toFixed(4)}${R} "${s.promptPreview}"\n`);
|
|
148
|
+
}
|
|
149
|
+
log.raw("\n");
|
|
150
|
+
}
|
|
151
|
+
function handleUndo(rest, ctx) {
|
|
152
|
+
const { checkpointMgr, log } = ctx;
|
|
153
|
+
const subCmd = rest[0]?.toLowerCase();
|
|
154
|
+
if (subCmd === "list") {
|
|
155
|
+
const history = checkpointMgr.getHistory();
|
|
156
|
+
if (history.length === 0) {
|
|
157
|
+
log.raw(`${DM}No checkpoints available.${R}\n\n`);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
log.raw(`\n ${B}Checkpoint history${R} ${DM}(${history.length} available)${R}\n\n`);
|
|
161
|
+
for (const cp of history) {
|
|
162
|
+
const date = new Date(cp.timestamp).toLocaleString();
|
|
163
|
+
log.raw(` ${CYN}#${cp.id}${R} ${DM}${date} ${cp.strategy} ${cp.files.length} files${R} "${cp.label}"\n`);
|
|
164
|
+
}
|
|
165
|
+
log.raw("\n");
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const steps = subCmd ? parseInt(subCmd, 10) : 1;
|
|
169
|
+
if (isNaN(steps) || steps < 1) {
|
|
170
|
+
log.raw(`${RED}Usage: /undo [list | <n>]${R}\n\n`);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (checkpointMgr.undoCount === 0) {
|
|
174
|
+
log.raw(`${DM}No checkpoints to undo.${R}\n\n`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const restored = checkpointMgr.undo(steps);
|
|
178
|
+
if (restored) {
|
|
179
|
+
log.raw(`${GRN}Restored checkpoint #${restored.id}${R} ${DM}(${restored.files.length} files, ${restored.strategy})${R}\n\n`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
log.error("Undo failed.");
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function handleRedo(ctx) {
|
|
186
|
+
const { checkpointMgr, log } = ctx;
|
|
187
|
+
if (checkpointMgr.redoCount === 0) {
|
|
188
|
+
log.raw(`${DM}No checkpoints to redo.${R}\n\n`);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const restored = checkpointMgr.redo();
|
|
192
|
+
if (restored) {
|
|
193
|
+
log.raw(`${GRN}Redone checkpoint #${restored.id}${R} ${DM}(${restored.files.length} files)${R}\n\n`);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
log.error("Redo failed.");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
export function printHelp(log) {
|
|
200
|
+
log.raw(`\n ${B}Slash commands${R}\n`);
|
|
201
|
+
log.raw(` ${CYN}/exit${R} ${DM}Exit the REPL${R}\n`);
|
|
202
|
+
log.raw(` ${CYN}/clear${R} ${DM}Clear conversation history${R}\n`);
|
|
203
|
+
log.raw(` ${CYN}/history${R} ${DM}Show conversation turns${R}\n`);
|
|
204
|
+
log.raw(` ${CYN}/mode${R} ${DM}Cycle mode (or Shift+Tab)${R}\n`);
|
|
205
|
+
log.raw(` ${CYN}/mode <name>${R} ${DM}Switch to code|plan|execute|debug${R}\n`);
|
|
206
|
+
log.raw(` ${CYN}/save${R} ${DM}Save current session to disk${R}\n`);
|
|
207
|
+
log.raw(` ${CYN}/resume [id]${R} ${DM}Resume a saved session${R}\n`);
|
|
208
|
+
log.raw(` ${CYN}/sessions${R} ${DM}List saved sessions${R}\n`);
|
|
209
|
+
log.raw(` ${CYN}/undo${R} ${DM}Undo last file changes${R}\n`);
|
|
210
|
+
log.raw(` ${CYN}/undo list${R} ${DM}Show checkpoint history${R}\n`);
|
|
211
|
+
log.raw(` ${CYN}/undo <n>${R} ${DM}Undo N steps back${R}\n`);
|
|
212
|
+
log.raw(` ${CYN}/redo${R} ${DM}Redo last undone checkpoint${R}\n`);
|
|
213
|
+
log.raw(` ${CYN}/leaderboard${R} ${DM}Show ELO rankings${R}\n`);
|
|
214
|
+
log.raw(` ${CYN}/config${R} ${DM}Show scoring config${R}\n`);
|
|
215
|
+
log.raw(` ${CYN}/shell${R} ${DM}Drop into the command shell${R}\n`);
|
|
216
|
+
log.raw(` ${CYN}/no-grade${R} ${DM}Toggle grading on/off${R}\n`);
|
|
217
|
+
log.raw(` ${CYN}/auto-confirm${R} ${DM}Toggle cost confirmation on/off${R}\n`);
|
|
218
|
+
log.raw(` ${CYN}/help${R} ${DM}Show this help${R}\n\n`);
|
|
219
|
+
log.raw(` ${B}Bare commands${R}\n`);
|
|
220
|
+
log.raw(` ${CYN}man${R} ${DM}Show all commands and usage${R}\n`);
|
|
221
|
+
log.raw(` ${CYN}models${R} ${DM}List available model profiles${R}\n`);
|
|
222
|
+
log.raw(` ${CYN}go${R} ${DM}Execute stored plan (Plan mode)${R}\n`);
|
|
223
|
+
log.raw(` ${CYN}help${R} ${DM}Show this help${R}\n\n`);
|
|
224
|
+
log.raw(` ${DM}Anything else is sent as a DuoPair prompt.${R}\n\n`);
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=repl_commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl_commands.js","sourceRoot":"","sources":["../../src/commands/repl_commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runInteractiveShell(selfPath: string): Promise<void>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import { createInterface } from "node:readline/promises";
|
|
6
|
+
import { R, CYN, DM } from "../ui/colors.js";
|
|
7
|
+
import { tokenizeCommandLine } from "../ui/tokenizer.js";
|
|
8
|
+
import { createLogger } from "../ui/logger.js";
|
|
9
|
+
function runChildCommand(args, cwd, selfPath) {
|
|
10
|
+
return new Promise((resolve) => {
|
|
11
|
+
const child = spawn(process.execPath, [...process.execArgv, selfPath, ...args], {
|
|
12
|
+
stdio: "inherit",
|
|
13
|
+
cwd,
|
|
14
|
+
env: {
|
|
15
|
+
...process.env,
|
|
16
|
+
DUOCODE_SHELL_CHILD: "1",
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
child.on("close", (code) => {
|
|
20
|
+
resolve(code ?? 1);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const log = createLogger("shell");
|
|
25
|
+
export async function runInteractiveShell(selfPath) {
|
|
26
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
log.raw(`\n ${CYN}Interactive mode${R} ${DM}(type 'exit' to quit)${R}\n`);
|
|
30
|
+
log.raw(` ${DM}Use commands like:${R} start "add prompt"\n`);
|
|
31
|
+
log.raw(` ${DM}All commands from 'man' work here without the 'duocode' prefix.${R}\n\n`);
|
|
32
|
+
let shellCwd = process.cwd();
|
|
33
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
34
|
+
try {
|
|
35
|
+
while (true) {
|
|
36
|
+
const raw = await rl.question(`${CYN}duocode${R}:${DM}${shellCwd}${R}> `);
|
|
37
|
+
const line = raw.trim();
|
|
38
|
+
if (!line) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (line === "exit" || line === "quit") {
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
if (line === "help" || line === "?") {
|
|
45
|
+
log.raw(` ${DM}Examples:${R}\n`);
|
|
46
|
+
log.raw(` cd /path/to/repo\n`);
|
|
47
|
+
log.raw(` pwd\n`);
|
|
48
|
+
log.raw(` start "build an express endpoint"\n`);
|
|
49
|
+
log.raw(` init\n`);
|
|
50
|
+
log.raw(` task create "my task"\n`);
|
|
51
|
+
log.raw(` negotiation run --help\n`);
|
|
52
|
+
log.raw(` github sync --help\n`);
|
|
53
|
+
log.raw(` task list\n`);
|
|
54
|
+
log.raw(` man\n`);
|
|
55
|
+
log.raw(` exit\n\n`);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
let tokens;
|
|
59
|
+
try {
|
|
60
|
+
tokens = tokenizeCommandLine(line);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
64
|
+
log.error(`duocode shell: ${message}`);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (tokens[0] === "duocode") {
|
|
68
|
+
tokens = tokens.slice(1);
|
|
69
|
+
}
|
|
70
|
+
if (tokens.length === 0) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (tokens[0] === "shell") {
|
|
74
|
+
log.raw(` ${DM}Already in interactive mode.${R}\n`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (tokens[0] === "pwd") {
|
|
78
|
+
log.raw(`${shellCwd}\n`);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (tokens[0] === "cd") {
|
|
82
|
+
const rawTarget = tokens[1] ?? "~";
|
|
83
|
+
const target = rawTarget === "~"
|
|
84
|
+
? os.homedir()
|
|
85
|
+
: rawTarget.startsWith("~/")
|
|
86
|
+
? path.join(os.homedir(), rawTarget.slice(2))
|
|
87
|
+
: path.resolve(shellCwd, rawTarget);
|
|
88
|
+
if (!fs.existsSync(target)) {
|
|
89
|
+
log.error(`directory does not exist: ${target}`);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (!fs.statSync(target).isDirectory()) {
|
|
93
|
+
log.error(`not a directory: ${target}`);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
shellCwd = target;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const exitCode = await runChildCommand(tokens, shellCwd, selfPath);
|
|
100
|
+
if (exitCode !== 0) {
|
|
101
|
+
log.warn(`Command exited with code ${exitCode}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
rl.close();
|
|
107
|
+
log.raw("\n");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/commands/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createProviderStack } from "../providers/factory.js";
|
|
4
|
+
import { printDashboardHeader, printDashboardFooter, printDashboardAuction, printDashboardIntent, } from "../ui/dashboard.js";
|
|
5
|
+
import { analyzeIntent } from "../orchestrator/intent_parser.js";
|
|
6
|
+
import { createLogger } from "../ui/logger.js";
|
|
7
|
+
const log = createLogger("start");
|
|
8
|
+
const LANGUAGE_EXTENSIONS = {
|
|
9
|
+
markdown: ".md",
|
|
10
|
+
md: ".md",
|
|
11
|
+
python: ".py",
|
|
12
|
+
typescript: ".ts",
|
|
13
|
+
javascript: ".js",
|
|
14
|
+
rust: ".rs",
|
|
15
|
+
go: ".go",
|
|
16
|
+
ruby: ".rb",
|
|
17
|
+
java: ".java",
|
|
18
|
+
cpp: ".cpp",
|
|
19
|
+
"c++": ".cpp",
|
|
20
|
+
c: ".c",
|
|
21
|
+
bash: ".sh",
|
|
22
|
+
shell: ".sh",
|
|
23
|
+
html: ".html",
|
|
24
|
+
css: ".css",
|
|
25
|
+
sql: ".sql",
|
|
26
|
+
php: ".php",
|
|
27
|
+
swift: ".swift",
|
|
28
|
+
kotlin: ".kt",
|
|
29
|
+
lua: ".lua",
|
|
30
|
+
perl: ".pl",
|
|
31
|
+
r: ".r",
|
|
32
|
+
scala: ".scala",
|
|
33
|
+
zig: ".zig",
|
|
34
|
+
dart: ".dart",
|
|
35
|
+
elixir: ".ex",
|
|
36
|
+
haskell: ".hs",
|
|
37
|
+
yaml: ".yaml",
|
|
38
|
+
toml: ".toml",
|
|
39
|
+
};
|
|
40
|
+
// Domain-specific tools/frameworks that imply a language or file type.
|
|
41
|
+
// Checked before generic language keywords so "nmap script" → .nse, not .c.
|
|
42
|
+
const DOMAIN_EXTENSIONS = [
|
|
43
|
+
{ pattern: /\breadme\b/, ext: ".md", baseFallback: "README" },
|
|
44
|
+
{ pattern: /\bnmap\b/, ext: ".nse", baseFallback: "script" },
|
|
45
|
+
{ pattern: /\bwireshark\b/, ext: ".lua" },
|
|
46
|
+
{ pattern: /\bdocker(?:file)?\b/, ext: "", baseFallback: "Dockerfile" },
|
|
47
|
+
{ pattern: /\bmakefile\b/, ext: "", baseFallback: "Makefile" },
|
|
48
|
+
{ pattern: /\bterraform\b/, ext: ".tf" },
|
|
49
|
+
{ pattern: /\bansible\b/, ext: ".yaml", baseFallback: "playbook" },
|
|
50
|
+
{ pattern: /\bwebpack\b/, ext: ".js", baseFallback: "webpack.config" },
|
|
51
|
+
{ pattern: /\bnginx\b/, ext: ".conf" },
|
|
52
|
+
{ pattern: /\bgithub action\b/, ext: ".yaml", baseFallback: "action" },
|
|
53
|
+
{ pattern: /\bgrpc\b/, ext: ".proto" },
|
|
54
|
+
{ pattern: /\bgraphql\b/, ext: ".graphql" },
|
|
55
|
+
{ pattern: /\bcmake\b/, ext: ".cmake", baseFallback: "CMakeLists" },
|
|
56
|
+
];
|
|
57
|
+
function buildSystemMessage(prompt) {
|
|
58
|
+
const lower = prompt.toLowerCase();
|
|
59
|
+
const codeOnlyRequested = /\b(only code|just code|no explanation|no markdown|code only)\b/.test(lower);
|
|
60
|
+
if (codeOnlyRequested) {
|
|
61
|
+
return "You are a code generator. Output only the requested code content.";
|
|
62
|
+
}
|
|
63
|
+
return [
|
|
64
|
+
"You are DuoCode, a software engineering assistant.",
|
|
65
|
+
"Follow the user's requested deliverables exactly.",
|
|
66
|
+
"If the user asks for code plus docs/plans/README/tests, include all requested artifacts.",
|
|
67
|
+
"If multiple files are needed, separate them clearly using file headers like 'File: path/to/file.ext'.",
|
|
68
|
+
"Do not omit explanations or planning text when explicitly requested.",
|
|
69
|
+
].join(" ");
|
|
70
|
+
}
|
|
71
|
+
function inferOutputPath(prompt) {
|
|
72
|
+
const lower = prompt.toLowerCase();
|
|
73
|
+
// Try to extract a meaningful name after action verbs
|
|
74
|
+
const actionPattern = /(?:create|write|build|make|generate)\s+(?:a\s+)?(?:(?:simple|basic|new)\s+)?(\w+)/i;
|
|
75
|
+
const match = lower.match(actionPattern);
|
|
76
|
+
let baseName = match?.[1] ?? "output";
|
|
77
|
+
// If baseName is a language name, look for a better noun after it
|
|
78
|
+
if (LANGUAGE_EXTENSIONS[baseName]) {
|
|
79
|
+
const afterLang = new RegExp(`${baseName}\\s+(?:script|program|function|file|module|class)?\\s*(?:that|to|which|for|called|named)?\\s+(\\w+)`, "i");
|
|
80
|
+
const betterMatch = lower.match(afterLang);
|
|
81
|
+
if (betterMatch?.[1]) {
|
|
82
|
+
baseName = betterMatch[1];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// 1) Check for an explicit language keyword (word-boundary match).
|
|
86
|
+
// "python nmap scanner" → .py wins over the nmap domain default.
|
|
87
|
+
let ext = "";
|
|
88
|
+
for (const [lang, extension] of Object.entries(LANGUAGE_EXTENSIONS)) {
|
|
89
|
+
const wordBoundary = new RegExp(`\\b${lang}\\b`);
|
|
90
|
+
if (wordBoundary.test(lower)) {
|
|
91
|
+
ext = extension;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// 2) If no explicit language, check domain-specific tools (e.g. "nmap" → .nse).
|
|
96
|
+
if (!ext) {
|
|
97
|
+
for (const domain of DOMAIN_EXTENSIONS) {
|
|
98
|
+
if (domain.pattern.test(lower)) {
|
|
99
|
+
if (domain.baseFallback) {
|
|
100
|
+
baseName = domain.baseFallback;
|
|
101
|
+
}
|
|
102
|
+
return `${baseName}${domain.ext}`;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// 3) Fallback
|
|
107
|
+
if (!ext) {
|
|
108
|
+
ext = ".txt";
|
|
109
|
+
}
|
|
110
|
+
// If baseName is still a language name, fall back to a generic name
|
|
111
|
+
if (LANGUAGE_EXTENSIONS[baseName]) {
|
|
112
|
+
baseName = "output";
|
|
113
|
+
}
|
|
114
|
+
return `${baseName}${ext}`;
|
|
115
|
+
}
|
|
116
|
+
function tierToCapabilities(tier) {
|
|
117
|
+
switch (tier) {
|
|
118
|
+
case "fast":
|
|
119
|
+
return ["code_generation", "fast_response", "streaming"];
|
|
120
|
+
case "strong":
|
|
121
|
+
return ["code_generation", "deep_reasoning", "streaming"];
|
|
122
|
+
case "frontier":
|
|
123
|
+
return ["code_generation", "deep_reasoning", "streaming"];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export function registerStartCommand(program) {
|
|
127
|
+
program
|
|
128
|
+
.command("start")
|
|
129
|
+
.description("Send a prompt to AI and stream the response")
|
|
130
|
+
.argument("<prompt>", "What you want built")
|
|
131
|
+
.option("--model <id>", "Override model (e.g. openai/gpt-4o)")
|
|
132
|
+
.option("--output <path>", "Output file path")
|
|
133
|
+
.option("--auction-mode <mode>", "auto|single|hybrid|ab_test", "auto")
|
|
134
|
+
.option("--ab-key <key>", "Stable key for A/B assignment (used with --auction-mode ab_test)")
|
|
135
|
+
.option("--no-parse", "Skip intent parsing (faster, no analysis cost)")
|
|
136
|
+
.action(async (prompt, opts) => {
|
|
137
|
+
const { router, costTracker, capabilityRouter } = createProviderStack();
|
|
138
|
+
// Step 1: Intent analysis (if enabled)
|
|
139
|
+
let analysis = null;
|
|
140
|
+
if (opts.parse !== false && !opts.model) {
|
|
141
|
+
try {
|
|
142
|
+
analysis = await analyzeIntent({ prompt, router, capabilityRouter, costTracker });
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
146
|
+
log.warn("Intent parsing skipped", { error: msg });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Step 2: Model routing — complexity-aware if analysis succeeded
|
|
150
|
+
let modelId = opts.model;
|
|
151
|
+
let contextWindow;
|
|
152
|
+
if (!modelId) {
|
|
153
|
+
const requiredCaps = analysis
|
|
154
|
+
? tierToCapabilities(analysis.complexity.recommendedTier)
|
|
155
|
+
: ["code_generation", "streaming"];
|
|
156
|
+
const route = capabilityRouter.route({
|
|
157
|
+
requiredCapabilities: requiredCaps,
|
|
158
|
+
requireStreaming: true,
|
|
159
|
+
...(analysis ? {
|
|
160
|
+
estimatedInputTokens: analysis.intent.estimatedTokens.input,
|
|
161
|
+
estimatedOutputTokens: analysis.intent.estimatedTokens.output,
|
|
162
|
+
} : {}),
|
|
163
|
+
}, costTracker);
|
|
164
|
+
modelId = route.model.model;
|
|
165
|
+
contextWindow = route.model.contextWindow;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
const profile = capabilityRouter.listProfiles().find((p) => p.model === modelId);
|
|
169
|
+
contextWindow = profile?.contextWindow;
|
|
170
|
+
}
|
|
171
|
+
if (analysis) {
|
|
172
|
+
printDashboardIntent({ analysis });
|
|
173
|
+
}
|
|
174
|
+
printDashboardHeader({ model: modelId, contextWindow });
|
|
175
|
+
const systemMessage = buildSystemMessage(prompt);
|
|
176
|
+
const textParts = [];
|
|
177
|
+
let inputTokens = 0;
|
|
178
|
+
let outputTokens = 0;
|
|
179
|
+
const streamRequest = opts.model
|
|
180
|
+
? {
|
|
181
|
+
model: opts.model,
|
|
182
|
+
messages: [
|
|
183
|
+
{ role: "system", content: systemMessage },
|
|
184
|
+
{ role: "user", content: prompt },
|
|
185
|
+
],
|
|
186
|
+
}
|
|
187
|
+
: {
|
|
188
|
+
messages: [
|
|
189
|
+
{ role: "system", content: systemMessage },
|
|
190
|
+
{ role: "user", content: prompt },
|
|
191
|
+
],
|
|
192
|
+
route: {
|
|
193
|
+
requiredCapabilities: ["code_generation", "streaming"],
|
|
194
|
+
requireStreaming: true,
|
|
195
|
+
},
|
|
196
|
+
auctionMode: opts.auctionMode,
|
|
197
|
+
abTestKey: opts.abKey,
|
|
198
|
+
};
|
|
199
|
+
const auctionPreview = router.previewAuction(streamRequest);
|
|
200
|
+
printDashboardAuction({ auction: auctionPreview });
|
|
201
|
+
for await (const event of router.stream(streamRequest)) {
|
|
202
|
+
if (event.type === "text-delta") {
|
|
203
|
+
process.stdout.write(event.delta);
|
|
204
|
+
textParts.push(event.delta);
|
|
205
|
+
}
|
|
206
|
+
else if (event.type === "usage") {
|
|
207
|
+
inputTokens = event.usage.inputTokens;
|
|
208
|
+
outputTokens = event.usage.outputTokens;
|
|
209
|
+
}
|
|
210
|
+
else if (event.type === "done") {
|
|
211
|
+
inputTokens = event.response.usage.inputTokens;
|
|
212
|
+
outputTokens = event.response.usage.outputTokens;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const outputText = textParts.join("");
|
|
216
|
+
const outputPath = opts.output ?? inferOutputPath(prompt);
|
|
217
|
+
if (outputText.trim().length > 0) {
|
|
218
|
+
const resolved = path.resolve(outputPath);
|
|
219
|
+
fs.mkdirSync(path.dirname(resolved), { recursive: true });
|
|
220
|
+
fs.writeFileSync(resolved, outputText, "utf8");
|
|
221
|
+
}
|
|
222
|
+
const totals = costTracker.getTotals();
|
|
223
|
+
printDashboardFooter({
|
|
224
|
+
inputTokens,
|
|
225
|
+
outputTokens,
|
|
226
|
+
costUsd: totals.totalUsd,
|
|
227
|
+
savedPath: outputText.trim().length > 0 ? outputPath : undefined,
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|