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
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE5E,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAsB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EACL,UAAU,EAEV,WAAW,EACX,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EACL,MAAM,EACN,YAAY,EACZ,WAAW,EACX,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAE3B,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;AAEhC,mEAAmE;AAEnE,MAAM,WAAW,GAAoC;IACnD,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,SAAS,eAAe,CAAC,IAAqB,EAAE,OAAO,GAAG,CAAC;IACzD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO,GAAG,GAAG,UAAU,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,GAAG,OAAO,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;AACzE,CAAC;AAED,SAAS,eAAe,CAAC,IAAqB;IAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACrC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,mEAAmE;AAEnE,KAAK,UAAU,qBAAqB;IAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO;IAE1D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,EAAE,GAA2C,IAAI,CAAC;IACtD,IAAI,aAAa,GAAyB,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC;YAAC,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,OAAO,OAAO,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzE,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,sDAAsD,CAAC,CAAC;IAElE,eAAe,CAAC;QACd,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,aAAa,EAAE,OAAO,EAAE,KAAK,IAAI,MAAM,CAAkD;QAClI,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,aAAa,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;KAC/E,CAAC,CAAC;IAEH,oBAAoB;IACpB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,EAAE;QAClC,IAAI,YAAY;YAAE,OAAO;QACzB,YAAY,GAAG,IAAI,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,EAAE,EAAE,KAAK,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAAC;QAC3D,IAAI,EAAE;YAAE,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAEpC,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,iBAAiB,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC,MAAM,CAC1D,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAC9C,CAAC;QAEF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,SAAS,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;QACpF,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,gBAAoC,CAAC;QAEzC,IAAI,SAAS,GAA8C,IAAI,CAAC;QAChE,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;QAC1E,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;QAE9B,MAAM,YAAY,GAAG,IAAI,eAAe,CACtC,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,EAAE,EACjD,wBAAwB,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,EAC3D;YACE,WAAW,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE;YAClD,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;gBACnB,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY;wBACtC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;wBACtD,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC;oBAC9B,GAAG,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,OAAO,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;SACF,CACF,CAAC;QACF,YAAY,CAAC,sBAAsB,CACjC,uBAAuB,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAC3D,CAAC;QACF,YAAY,CAAC,0BAA0B,CACrC,2BAA2B,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAC/D,CAAC;QAEF,IAAI,aAAa,EAAE,KAAK,EAAE,CAAC;YACzB,YAAY,CAAC,mBAAmB,CAAC;gBAC/B,KAAK,EAAE,gBAAgB;gBACvB,sBAAsB,EAAE,aAAa,CAAC,KAAK,CAAC,eAAe;gBAC3D,qBAAqB,EAAE,SAAS;aACjC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAA8B,aAAa,EAAE,OAAO;YACrE,CAAC,CAAC;gBACE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,QAAQ;gBACxC,YAAY,EAAE,aAAa,CAAC,OAAO,CAAC,QAAQ;gBAC5C,gBAAgB,EAAE,aAAa,CAAC,OAAO,CAAC,aAAa,GAAG,IAAI;gBAC5D,eAAe,EAAE,aAAa,CAAC,OAAO,CAAC,eAAe;gBACtD,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC,UAAU;aAC7C;YACH,CAAC,CAAC,SAAS,CAAC;QAEd,GAAG,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,IAAI,EAAE,6CAA6C,CAAC,IAAI,CAAC,CAAC;QACvG,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,4BAA4B,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAErJ,IAAI,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,SAAS,GAAG,EAAE,CAAC;QAEf,MAAM,eAAe,GAAG,CAAC,GAAuB,EAAE,GAAuC,EAAE,EAAE;YAC3F,IAAI,GAAG,EAAE,IAAI,KAAK,KAAK,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,EAAqE,CAAC;gBACpF,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC;gBACnD,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;gBACnE,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;oBAAE,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;gBAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC;gBAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAE9C,+CAA+C;QAC/C,MAAM,MAAM,GAAwB;YAClC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE;YACxC,gBAAgB;YAChB,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,gBAAgB,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC,CAAC;YAC9E,GAAG;SACJ,CAAC;QAEF,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;gBACrF,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI;oBAAE,SAAS;gBAEpB,uBAAuB;gBACvB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAClD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;oBAEnC,kDAAkD;oBAClD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;wBACxB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;wBACvC,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;4BAC1G,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;4BACzB,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBAChC,CAAC;6BAAM,IAAI,CAAC,OAAO,EAAE,CAAC;4BACpB,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;wBACvC,CAAC;6BAAM,CAAC;4BACN,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,iBAAiB,OAAO,GAAG,CAAC,IAAI,EAAE,4BAA4B,CAAC,IAAI,CAAC,CAAC;wBACrF,CAAC;wBACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBACd,SAAS;oBACX,CAAC;oBAED,yDAAyD;oBACzD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;wBACzB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;wBAC1D,EAAE,CAAC,KAAK,EAAE,CAAC;wBACX,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;wBACrC,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;wBACvE,SAAS,GAAG,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;wBAC9C,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,+BAA+B,CAAC,MAAM,CAAC,CAAC;wBACzD,SAAS;oBACX,CAAC;oBAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;oBAC1D,IAAI,MAAM,KAAK,MAAM;wBAAE,MAAM;oBAC7B,IAAI,MAAM,KAAK,SAAS;wBAAE,SAAS;oBACnC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,qBAAqB,GAAG,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;oBACxE,SAAS;gBACX,CAAC;gBAED,sBAAsB;gBACtB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrC,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAAC,YAAY,EAAE,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAChF,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAAC,WAAW,EAAE,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACxD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;oBAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAEvD,8CAA8C;gBAC9C,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;oBAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;oBACpC,IAAI,CAAC,OAAO,EAAE,CAAC;wBAAC,GAAG,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;wBAAC,SAAS;oBAAC,CAAC;oBAC7F,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;oBACrC,aAAa,CAAC,MAAM,CAAC,WAAW,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC/D,MAAM,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;oBACnD,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;4BACxC,MAAM,EAAE,OAAO,CAAC,MAAM;4BACtB,mBAAmB,EAAE,mBAAmB,IAAI,SAAS;4BACrD,aAAa,EAAE,OAAO,CAAC,cAAc;4BACrC,mBAAmB,EAAE,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,WAAW;4BACvE,eAAe,EAAE,OAAO,CAAC,eAAe;yBACzC,CAAC,CAAC;wBACH,OAAO,CAAC,gBAAgB,EAAE,CAAC;wBAC3B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;4BAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;4BAAC,SAAS;wBAAC,CAAC;wBACpE,OAAO,CAAC,OAAO,CAAC;4BACd,MAAM,EAAE,OAAO,CAAC,MAAM;4BACtB,aAAa,EAAE,OAAO,CAAC,eAAe;4BACtC,cAAc,EAAE,MAAM,CAAC,cAAc;4BACrC,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,YAAY;4BAC9C,UAAU,EAAE,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;4BAClD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;yBACtB,CAAC,CAAC;wBACH,gBAAgB,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;wBACrE,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;oBAC7C,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,GAAG,CAAC,KAAK,CAAC,mBAAmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBACzF,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,uBAAuB;gBACvB,IAAI,UAAU,GAAG,IAAI,CAAC;gBACtB,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/B,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;oBACrD,IAAI,aAAa,EAAE,CAAC;wBAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;wBAAC,SAAS;oBAAC,CAAC;gBAC3D,CAAC;gBAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;gBACnD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;gBACjC,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;gBACjF,IAAI,iBAAqC,CAAC;gBAC1C,IAAI,iBAAsE,CAAC;gBAE3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,EAAE,CAAC;oBACzC,MAAM,GAAG,GAAG,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;oBACrE,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACjC,iBAAiB,GAAG,GAAG,CAAC,aAAa,CAAC;wBACtC,iBAAiB,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;wBACvF,IAAI,WAAW,GAAG,GAAG,EAAE,YAAY,GAAG,CAAC,aAAa,CAAC,MAAM,iBAAiB,CAAC;wBAC7E,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;4BAAE,WAAW,IAAI,KAAK,GAAG,CAAC,YAAY,CAAC,MAAM,mBAAmB,CAAC;wBAChG,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,IAAI,CAAC,CAAC;wBAChC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;4BAAE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;wBACjG,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;4BAAE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC3G,CAAC;gBACH,CAAC;gBAED,IAAI,eAAe,GAAG,WAAW,CAAC;gBAClC,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;oBAC5B,eAAe;wBACb,sDAAsD;4BACtD,2EAA2E,WAAW,EAAE,CAAC;gBAC7F,CAAC;gBAED,MAAM,eAAe,GAAG,aAAa,EAAE,MAAM,EAAE,kBAAkB,CAAC;gBAClE,MAAM,cAAc,GAAG,aAAa,EAAE,MAAM,EAAE,iBAAiB,CAAC;gBAChE,MAAM,WAAW,GAAG,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC;gBAEjD,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;oBAC3B,aAAa,CAAC,MAAM,CAAC,QAAQ,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBAED,IAAI,CAAC;oBACH,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;wBAC3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;4BACxC,MAAM,EAAE,eAAe;4BACvB,mBAAmB,EAAE,mBAAmB,IAAI,SAAS;4BACrD,cAAc,EAAE,iBAAiB;4BACjC,aAAa,EAAE,iBAAiB;4BAChC,kBAAkB,EAAE,eAAe;4BACnC,aAAa,EAAE,KAAK;4BACpB,mBAAmB,EAAE,CAAC,OAAO,CAAC,WAAW;4BACzC,aAAa,EAAE,IAAI;yBACpB,CAAC,CAAC;wBACH,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;4BAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;4BAAC,SAAS;wBAAC,CAAC;wBACpE,OAAO,CAAC,SAAS,CAAC;4BAChB,MAAM,EAAE,eAAe;4BACvB,eAAe,EAAE,MAAM,CAAC,eAAe;4BACvC,OAAO,EAAE,MAAM,CAAC,YAAY;4BAC5B,UAAU,EAAE,MAAM,CAAC,UAAU;yBAC9B,CAAC,CAAC;wBACH,gBAAgB,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;wBACrE,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;wBAC3C,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,yDAAyD,CAAC,MAAM,CAAC,CAAC;oBACpI,CAAC;yBAAM,CAAC;wBACN,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;4BACxC,MAAM,EAAE,eAAe;4BACvB,mBAAmB,EAAE,mBAAmB,IAAI,SAAS;4BACrD,cAAc,EAAE,iBAAiB;4BACjC,aAAa,EAAE,iBAAiB;4BAChC,kBAAkB,EAAE,eAAe;4BACnC,iBAAiB,EAAE,cAAc;4BACjC,UAAU,EAAE,WAAW;4BACvB,aAAa,EAAE,OAAO,CAAC,cAAc;4BACrC,mBAAmB,EAAE,WAAW,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,WAAW;yBACvE,CAAC,CAAC;wBACH,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;4BAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;4BAAC,SAAS;wBAAC,CAAC;wBACpE,OAAO,CAAC,OAAO,CAAC;4BACd,MAAM,EAAE,UAAU;4BAClB,aAAa,EAAE,MAAM,CAAC,eAAe;4BACrC,cAAc,EAAE,MAAM,CAAC,cAAc;4BACrC,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,OAAO,EAAE,MAAM,CAAC,YAAY;4BAC5B,UAAU,EAAE,MAAM,CAAC,UAAU;4BAC7B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;yBACtB,CAAC,CAAC;wBACH,gBAAgB,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;wBACrE,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;oBAC7C,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,GAAG,CAAC,KAAK,CAAC,mBAAmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACzF,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAC1D,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,EAAE,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,mEAAmE;AAEnE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,+BAA+B,CAAC;KAC5C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,0BAA0B,CAAC,OAAO,CAAC,CAAC;AACpC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjE,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,KAAK,IAAI,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtE,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAExD,OAAO,CAAC,eAAe,CAAC;IACtB,WAAW,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC;CACnE,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,gBAAgB,EAAE,CAAC;AACvC,IAAI,WAAW;IAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;AAEpD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAClB,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;SAC5B,IAAI,CAAC,KAAK,IAAI,EAAE;QACf,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG;YAAE,MAAM,qBAAqB,EAAE,CAAC;IAC7E,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACxB,GAAG,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACxD,GAAG,CAAC,KAAK,CAAC,mBAAmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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>;
|