duocode 0.1.0 → 1.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/dist/cli.js +81 -12
- package/dist/cli.js.map +1 -1
- package/dist/commands/duo.js +10 -6
- package/dist/commands/duo.js.map +1 -1
- package/dist/commands/repl_commands.js +1 -1
- package/dist/commands/repl_commands.js.map +1 -1
- package/dist/duo/duo_orchestrator.d.ts +3 -1
- package/dist/duo/duo_orchestrator.js +166 -37
- package/dist/duo/duo_orchestrator.js.map +1 -1
- package/dist/duo/duo_session.d.ts +1 -1
- package/dist/duo/duo_session.js +8 -4
- package/dist/duo/duo_session.js.map +1 -1
- package/dist/duo/duo_types.d.ts +24 -1
- package/dist/duo/duo_types.js.map +1 -1
- package/dist/duo/swarm_orchestrator.d.ts +22 -0
- package/dist/duo/swarm_orchestrator.js +282 -0
- package/dist/duo/swarm_orchestrator.js.map +1 -0
- package/dist/github/mcp_client.d.ts +5 -0
- package/dist/github/mcp_client.js +26 -0
- package/dist/github/mcp_client.js.map +1 -1
- package/dist/providers/cost_tracker.js +13 -0
- package/dist/providers/cost_tracker.js.map +1 -1
- package/dist/providers/factory.js +97 -0
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/registry_loader.js.map +1 -1
- package/dist/providers/router.js +72 -0
- package/dist/providers/router.js.map +1 -1
- package/dist/tools/agent_loop.d.ts +6 -0
- package/dist/tools/agent_loop.js +16 -2
- package/dist/tools/agent_loop.js.map +1 -1
- package/dist/tools/definitions.d.ts +3 -0
- package/dist/tools/definitions.js +20 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/discover_tools.d.ts +11 -0
- package/dist/tools/discover_tools.js +41 -0
- package/dist/tools/discover_tools.js.map +1 -0
- package/dist/tools/executor.d.ts +4 -0
- package/dist/tools/executor.js +44 -0
- package/dist/tools/executor.js.map +1 -1
- package/dist/tools/intent_preloader.d.ts +17 -0
- package/dist/tools/intent_preloader.js +60 -0
- package/dist/tools/intent_preloader.js.map +1 -0
- package/dist/tools/tool_registry.d.ts +64 -0
- package/dist/tools/tool_registry.js +138 -0
- package/dist/tools/tool_registry.js.map +1 -0
- package/dist/ui/banner.js +4 -2
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/callbacks.d.ts +7 -1
- package/dist/ui/callbacks.js +74 -11
- package/dist/ui/callbacks.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central registry for all tools (core + MCP).
|
|
3
|
+
*
|
|
4
|
+
* Three tiers:
|
|
5
|
+
* 1. always-active – core tools, sent to the LLM every turn
|
|
6
|
+
* 2. pre-loaded – activated by intent preloader before the loop starts
|
|
7
|
+
* 3. deferred – only activated when the LLM calls discover_tools
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolDefinition } from "../providers/base.js";
|
|
10
|
+
export interface RegisteredTool {
|
|
11
|
+
definition: ToolDefinition;
|
|
12
|
+
/** Logical grouping: "core", "github", "slack", etc. */
|
|
13
|
+
namespace: string;
|
|
14
|
+
/** Searchable keywords beyond name/description */
|
|
15
|
+
tags: string[];
|
|
16
|
+
/** If true, always included in the tool set sent to the LLM */
|
|
17
|
+
alwaysActive: boolean;
|
|
18
|
+
/** Approximate token cost of the JSON schema when serialised */
|
|
19
|
+
estimatedTokens: number;
|
|
20
|
+
/** Where this tool came from */
|
|
21
|
+
source: "core" | "mcp";
|
|
22
|
+
/** For MCP tools, which server they belong to */
|
|
23
|
+
mcpServer?: string;
|
|
24
|
+
}
|
|
25
|
+
/** Rough token estimate: ~4 chars per token for JSON schema text. */
|
|
26
|
+
export declare function estimateToolTokens(def: ToolDefinition): number;
|
|
27
|
+
/** "core" namespace uses bare names; others get "namespace__name". */
|
|
28
|
+
export declare function qualifiedName(ns: string, name: string): string;
|
|
29
|
+
/** Extract namespace and bare name from a possibly-qualified name. */
|
|
30
|
+
export declare function splitQualifiedName(qname: string): {
|
|
31
|
+
namespace: string;
|
|
32
|
+
bareName: string;
|
|
33
|
+
};
|
|
34
|
+
export declare class ToolRegistry {
|
|
35
|
+
private readonly tools;
|
|
36
|
+
private readonly activeSet;
|
|
37
|
+
register(tool: RegisteredTool): void;
|
|
38
|
+
registerBatch(tools: RegisteredTool[]): void;
|
|
39
|
+
/**
|
|
40
|
+
* Search all registered tools (active or not) by keyword.
|
|
41
|
+
* Returns top N matches sorted by relevance score.
|
|
42
|
+
*/
|
|
43
|
+
discover(query: string, maxResults?: number): RegisteredTool[];
|
|
44
|
+
/**
|
|
45
|
+
* Promote tools to the active set so they are sent to the LLM.
|
|
46
|
+
* Accepts qualified keys or bare names (looked up in "core" namespace).
|
|
47
|
+
* Returns the ToolDefinitions that were newly activated.
|
|
48
|
+
*/
|
|
49
|
+
activate(toolKeys: string[]): ToolDefinition[];
|
|
50
|
+
/** Return ToolDefinitions for all currently-active tools. */
|
|
51
|
+
getActiveTools(): ToolDefinition[];
|
|
52
|
+
/** Estimated token cost of all currently-active tool definitions. */
|
|
53
|
+
getActiveTokenCost(): number;
|
|
54
|
+
/** Check whether a qualified name is registered (active or not). */
|
|
55
|
+
has(key: string): boolean;
|
|
56
|
+
/** Get a registered tool by qualified key, or undefined. */
|
|
57
|
+
get(key: string): RegisteredTool | undefined;
|
|
58
|
+
/** Total number of registered tools. */
|
|
59
|
+
get size(): number;
|
|
60
|
+
/** Number of currently active tools. */
|
|
61
|
+
get activeSize(): number;
|
|
62
|
+
/** List all registered qualified keys. */
|
|
63
|
+
keys(): string[];
|
|
64
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// ── Token estimation ─────────────────────────────────────────────
|
|
2
|
+
/** Rough token estimate: ~4 chars per token for JSON schema text. */
|
|
3
|
+
export function estimateToolTokens(def) {
|
|
4
|
+
const schemaText = JSON.stringify(def.inputSchema);
|
|
5
|
+
const descLen = def.description?.length ?? 0;
|
|
6
|
+
const nameLen = def.name.length;
|
|
7
|
+
return Math.ceil((nameLen + descLen + schemaText.length) / 4);
|
|
8
|
+
}
|
|
9
|
+
// ── Qualified naming ─────────────────────────────────────────────
|
|
10
|
+
/** "core" namespace uses bare names; others get "namespace__name". */
|
|
11
|
+
export function qualifiedName(ns, name) {
|
|
12
|
+
return ns === "core" ? name : `${ns}__${name}`;
|
|
13
|
+
}
|
|
14
|
+
/** Extract namespace and bare name from a possibly-qualified name. */
|
|
15
|
+
export function splitQualifiedName(qname) {
|
|
16
|
+
const idx = qname.indexOf("__");
|
|
17
|
+
if (idx === -1)
|
|
18
|
+
return { namespace: "core", bareName: qname };
|
|
19
|
+
return { namespace: qname.slice(0, idx), bareName: qname.slice(idx + 2) };
|
|
20
|
+
}
|
|
21
|
+
// ── Search scoring ───────────────────────────────────────────────
|
|
22
|
+
function scoreToolForQuery(tool, queryWords) {
|
|
23
|
+
let score = 0;
|
|
24
|
+
const name = tool.definition.name.toLowerCase();
|
|
25
|
+
const desc = (tool.definition.description ?? "").toLowerCase();
|
|
26
|
+
const tagStr = tool.tags.join(" ").toLowerCase();
|
|
27
|
+
const ns = tool.namespace.toLowerCase();
|
|
28
|
+
for (const word of queryWords) {
|
|
29
|
+
if (name.includes(word))
|
|
30
|
+
score += 3;
|
|
31
|
+
if (ns.includes(word))
|
|
32
|
+
score += 2;
|
|
33
|
+
if (tagStr.includes(word))
|
|
34
|
+
score += 2;
|
|
35
|
+
if (desc.includes(word))
|
|
36
|
+
score += 1;
|
|
37
|
+
}
|
|
38
|
+
return score;
|
|
39
|
+
}
|
|
40
|
+
// ── Registry ─────────────────────────────────────────────────────
|
|
41
|
+
export class ToolRegistry {
|
|
42
|
+
tools = new Map();
|
|
43
|
+
activeSet = new Set();
|
|
44
|
+
// ── Registration ─────────────────────────────────────────────
|
|
45
|
+
register(tool) {
|
|
46
|
+
const key = qualifiedName(tool.namespace, tool.definition.name);
|
|
47
|
+
this.tools.set(key, tool);
|
|
48
|
+
if (tool.alwaysActive) {
|
|
49
|
+
this.activeSet.add(key);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
registerBatch(tools) {
|
|
53
|
+
for (const tool of tools) {
|
|
54
|
+
this.register(tool);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ── Discovery ────────────────────────────────────────────────
|
|
58
|
+
/**
|
|
59
|
+
* Search all registered tools (active or not) by keyword.
|
|
60
|
+
* Returns top N matches sorted by relevance score.
|
|
61
|
+
*/
|
|
62
|
+
discover(query, maxResults = 5) {
|
|
63
|
+
const words = query
|
|
64
|
+
.toLowerCase()
|
|
65
|
+
.split(/\s+/)
|
|
66
|
+
.filter((w) => w.length > 0);
|
|
67
|
+
if (words.length === 0)
|
|
68
|
+
return [];
|
|
69
|
+
const scored = [];
|
|
70
|
+
for (const tool of this.tools.values()) {
|
|
71
|
+
const score = scoreToolForQuery(tool, words);
|
|
72
|
+
if (score > 0) {
|
|
73
|
+
scored.push({ tool, score });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
scored.sort((a, b) => b.score - a.score);
|
|
77
|
+
return scored.slice(0, maxResults).map((s) => s.tool);
|
|
78
|
+
}
|
|
79
|
+
// ── Activation ───────────────────────────────────────────────
|
|
80
|
+
/**
|
|
81
|
+
* Promote tools to the active set so they are sent to the LLM.
|
|
82
|
+
* Accepts qualified keys or bare names (looked up in "core" namespace).
|
|
83
|
+
* Returns the ToolDefinitions that were newly activated.
|
|
84
|
+
*/
|
|
85
|
+
activate(toolKeys) {
|
|
86
|
+
const activated = [];
|
|
87
|
+
for (const key of toolKeys) {
|
|
88
|
+
const tool = this.tools.get(key);
|
|
89
|
+
if (tool && !this.activeSet.has(key)) {
|
|
90
|
+
this.activeSet.add(key);
|
|
91
|
+
activated.push(tool.definition);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return activated;
|
|
95
|
+
}
|
|
96
|
+
// ── Querying ─────────────────────────────────────────────────
|
|
97
|
+
/** Return ToolDefinitions for all currently-active tools. */
|
|
98
|
+
getActiveTools() {
|
|
99
|
+
const defs = [];
|
|
100
|
+
for (const key of this.activeSet) {
|
|
101
|
+
const tool = this.tools.get(key);
|
|
102
|
+
if (tool)
|
|
103
|
+
defs.push(tool.definition);
|
|
104
|
+
}
|
|
105
|
+
return defs;
|
|
106
|
+
}
|
|
107
|
+
/** Estimated token cost of all currently-active tool definitions. */
|
|
108
|
+
getActiveTokenCost() {
|
|
109
|
+
let total = 0;
|
|
110
|
+
for (const key of this.activeSet) {
|
|
111
|
+
const tool = this.tools.get(key);
|
|
112
|
+
if (tool)
|
|
113
|
+
total += tool.estimatedTokens;
|
|
114
|
+
}
|
|
115
|
+
return total;
|
|
116
|
+
}
|
|
117
|
+
/** Check whether a qualified name is registered (active or not). */
|
|
118
|
+
has(key) {
|
|
119
|
+
return this.tools.has(key);
|
|
120
|
+
}
|
|
121
|
+
/** Get a registered tool by qualified key, or undefined. */
|
|
122
|
+
get(key) {
|
|
123
|
+
return this.tools.get(key);
|
|
124
|
+
}
|
|
125
|
+
/** Total number of registered tools. */
|
|
126
|
+
get size() {
|
|
127
|
+
return this.tools.size;
|
|
128
|
+
}
|
|
129
|
+
/** Number of currently active tools. */
|
|
130
|
+
get activeSize() {
|
|
131
|
+
return this.activeSet.size;
|
|
132
|
+
}
|
|
133
|
+
/** List all registered qualified keys. */
|
|
134
|
+
keys() {
|
|
135
|
+
return [...this.tools.keys()];
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=tool_registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool_registry.js","sourceRoot":"","sources":["../../src/tools/tool_registry.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/banner.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { R, B, DM, CYN, DCY, BLU, GRN, MAG } from "./colors.js";
|
|
2
2
|
import { buildProviders } from "../commands/duo.js";
|
|
3
|
+
import { extractLogicalProvider } from "../providers/router.js";
|
|
3
4
|
import { createLogger } from "./logger.js";
|
|
4
5
|
export function banner() {
|
|
5
6
|
const L1 = `${CYN}${B}█████${DCY}▄${CYN} ██ ██ ${DCY}▄${CYN}████${DCY}▄${CYN} ${DCY}▄${CYN}█████ ${DCY}▄${CYN}████${DCY}▄${CYN} █████${DCY}▄${CYN} ██████${R}`;
|
|
@@ -81,9 +82,10 @@ export function printModels() {
|
|
|
81
82
|
for (const p of profiles) {
|
|
82
83
|
const pr = costTracker.getPricing(p.model);
|
|
83
84
|
const cost = pr ? `$${(pr.inputPer1kUsd * 1000).toFixed(2)}/$${(pr.outputPer1kUsd * 1000).toFixed(2)} /M` : "";
|
|
84
|
-
const
|
|
85
|
+
const logical = extractLogicalProvider(p.model, p.provider);
|
|
86
|
+
const tag = logical === "openai" ? BLU : logical === "anthropic" ? GRN : MAG;
|
|
85
87
|
const caps = p.capabilities.slice(0, 4).join(", ");
|
|
86
|
-
log.raw(` ${tag}${p.model.padEnd(24)}${R} ${DM}${
|
|
88
|
+
log.raw(` ${tag}${p.model.padEnd(24)}${R} ${DM}${logical.padEnd(12)}${R} ${DM}ctx:${String(Math.round((p.contextWindow ?? 0) / 1000)).padEnd(4)}K ${cost.padEnd(22)} ${caps}${R}\n`);
|
|
87
89
|
}
|
|
88
90
|
log.raw("\n");
|
|
89
91
|
}
|
package/dist/ui/banner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/callbacks.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* commands/duo.ts to eliminate duplication.
|
|
6
6
|
*/
|
|
7
7
|
import type { Interface as ReadlineInterface } from "node:readline/promises";
|
|
8
|
-
import type { ConfirmationCallback, ModelPickerCallback, ArchitectReviewCallback } from "../duo/duo_types.js";
|
|
8
|
+
import type { ConfirmationCallback, ModelPickerCallback, ArchitectReviewCallback, ExecutorReviewCallback } from "../duo/duo_types.js";
|
|
9
9
|
export declare function makeConfirmationCallback(getRl: () => ReadlineInterface | null, opts?: {
|
|
10
10
|
autoConfirm?: () => boolean;
|
|
11
11
|
}): ConfirmationCallback;
|
|
@@ -28,3 +28,9 @@ export declare function makeArchitectReviewCallback(getRl: () => ReadlineInterfa
|
|
|
28
28
|
export declare function makeSingleShotArchitectReview(opts?: {
|
|
29
29
|
skip?: boolean;
|
|
30
30
|
}): ArchitectReviewCallback;
|
|
31
|
+
export declare function makeExecutorReviewCallback(getRl: () => ReadlineInterface | null, opts?: {
|
|
32
|
+
autoConfirm?: () => boolean;
|
|
33
|
+
}): ExecutorReviewCallback;
|
|
34
|
+
export declare function makeSingleShotExecutorReview(opts?: {
|
|
35
|
+
skip?: boolean;
|
|
36
|
+
}): ExecutorReviewCallback;
|
package/dist/ui/callbacks.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { createInterface } from "node:readline/promises";
|
|
2
|
-
import {
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
3
|
+
import { writeFileSync, mkdirSync } from "node:fs";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { R, B, CYN, BLU, GRN, DM } from "./colors.js";
|
|
3
7
|
import { createLogger } from "./logger.js";
|
|
4
8
|
const log = createLogger("callbacks");
|
|
5
9
|
// ── Confirmation ────────────────────────────────────────────────
|
|
@@ -97,32 +101,91 @@ export function makeSingleShotModelPicker(opts) {
|
|
|
97
101
|
};
|
|
98
102
|
}
|
|
99
103
|
// ── Architect Review ────────────────────────────────────────────
|
|
104
|
+
function openViewer(content, suffix) {
|
|
105
|
+
const dir = join(tmpdir(), "duocode-review");
|
|
106
|
+
mkdirSync(dir, { recursive: true });
|
|
107
|
+
const tmpFile = join(dir, `review-${Date.now()}${suffix}`);
|
|
108
|
+
writeFileSync(tmpFile, content, "utf-8");
|
|
109
|
+
try {
|
|
110
|
+
execFileSync("vi", ["-R", tmpFile], { stdio: "inherit" });
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function askReviewQuestion(rl, phase, content) {
|
|
118
|
+
const answer = await rl.question(`${CYN}${phase}: [Y]es / [v]iew / [r]evise / [n]o?${R} `);
|
|
119
|
+
const trimmed = answer.trim().toLowerCase();
|
|
120
|
+
if (trimmed === "n" || trimmed === "no")
|
|
121
|
+
return { action: "abort" };
|
|
122
|
+
if (trimmed === "v" || trimmed === "view") {
|
|
123
|
+
if (!content)
|
|
124
|
+
return { action: "approve" };
|
|
125
|
+
log.raw(`${DM}Opening in vi (read-only)...${R}\n`);
|
|
126
|
+
openViewer(content, ".md");
|
|
127
|
+
const editAnswer = await rl.question(`${CYN}Want to make changes? [y/N]${R} `);
|
|
128
|
+
if (editAnswer.trim().toLowerCase() === "y" || editAnswer.trim().toLowerCase() === "yes") {
|
|
129
|
+
const feedback = await rl.question(`${CYN}Describe your changes: ${R}`);
|
|
130
|
+
return { action: "revise", feedback: feedback.trim() };
|
|
131
|
+
}
|
|
132
|
+
return { action: "approve" };
|
|
133
|
+
}
|
|
134
|
+
if (trimmed === "r" || trimmed === "revise") {
|
|
135
|
+
const feedback = await rl.question(`${CYN}Revision feedback: ${R}`);
|
|
136
|
+
return { action: "revise", feedback: feedback.trim() };
|
|
137
|
+
}
|
|
138
|
+
return { action: "approve" };
|
|
139
|
+
}
|
|
100
140
|
export function makeArchitectReviewCallback(getRl, opts) {
|
|
101
141
|
return async (plan) => {
|
|
102
142
|
if (opts?.autoConfirm?.())
|
|
103
|
-
return
|
|
143
|
+
return { action: "approve" };
|
|
104
144
|
const rl = getRl();
|
|
105
145
|
if (!rl)
|
|
106
|
-
return
|
|
146
|
+
return { action: "approve" };
|
|
107
147
|
const sectionCount = (plan.match(/^## /gm) || []).length;
|
|
108
148
|
const sectionInfo = sectionCount > 0 ? ` (${sectionCount} sections)` : "";
|
|
109
149
|
log.raw(`\n${BLU}${B}Architect plan complete${sectionInfo}.${R}\n`);
|
|
110
150
|
log.raw(`${DM}Review the plan above before proceeding to executor.${R}\n\n`);
|
|
111
|
-
|
|
112
|
-
const trimmed = answer.trim().toLowerCase();
|
|
113
|
-
return trimmed === "" || trimmed === "y" || trimmed === "yes";
|
|
151
|
+
return askReviewQuestion(rl, "Proceed to executor", plan);
|
|
114
152
|
};
|
|
115
153
|
}
|
|
116
154
|
export function makeSingleShotArchitectReview(opts) {
|
|
117
|
-
return async (
|
|
155
|
+
return async (plan) => {
|
|
118
156
|
if (opts?.skip)
|
|
119
|
-
return
|
|
157
|
+
return { action: "approve" };
|
|
120
158
|
log.raw(`\n${DM}Review the architect plan above before proceeding to executor.${R}\n\n`);
|
|
121
159
|
const tmpRl = createInterface({ input: process.stdin, output: process.stdout });
|
|
122
160
|
try {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
161
|
+
return await askReviewQuestion(tmpRl, "Proceed to executor", plan);
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
tmpRl.close();
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// ── Executor Review ─────────────────────────────────────────────
|
|
169
|
+
export function makeExecutorReviewCallback(getRl, opts) {
|
|
170
|
+
return async (output) => {
|
|
171
|
+
if (opts?.autoConfirm?.())
|
|
172
|
+
return { action: "approve" };
|
|
173
|
+
const rl = getRl();
|
|
174
|
+
if (!rl)
|
|
175
|
+
return { action: "approve" };
|
|
176
|
+
log.raw(`\n${GRN}${B}Executor output complete.${R}\n`);
|
|
177
|
+
log.raw(`${DM}Review the output above before proceeding to grading.${R}\n\n`);
|
|
178
|
+
return askReviewQuestion(rl, "Proceed to grading", output);
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
export function makeSingleShotExecutorReview(opts) {
|
|
182
|
+
return async (output) => {
|
|
183
|
+
if (opts?.skip)
|
|
184
|
+
return { action: "approve" };
|
|
185
|
+
log.raw(`\n${DM}Review the executor output above before proceeding to grading.${R}\n\n`);
|
|
186
|
+
const tmpRl = createInterface({ input: process.stdin, output: process.stdout });
|
|
187
|
+
try {
|
|
188
|
+
return await askReviewQuestion(tmpRl, "Proceed to grading", output);
|
|
126
189
|
}
|
|
127
190
|
finally {
|
|
128
191
|
tmpRl.close();
|
package/dist/ui/callbacks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callbacks.js","sourceRoot":"","sources":["../../src/ui/callbacks.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"callbacks.js","sourceRoot":"","sources":["../../src/ui/callbacks.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAY3C,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;AAEtC,mEAAmE;AAEnE,MAAM,UAAU,wBAAwB,CACtC,KAAqC,EACrC,IAAsC;IAEtC,OAAO,KAAK,IAAiC,EAAE;QAC7C,IAAI,IAAI,EAAE,WAAW,EAAE,EAAE;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC9B,GAAG,GAAG,yDAAyD,CAAC,GAAG,CACpE,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QACxD,IAAI,OAAO,KAAK,GAAG;YAAE,OAAO,gBAAgB,CAAC;QAC7C,IAAI,OAAO,KAAK,GAAG;YAAE,OAAO,eAAe,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,IAAyB;IAEzB,OAAO,KAAK,IAAiC,EAAE;QAC7C,IAAI,IAAI,EAAE,IAAI;YAAE,OAAO,SAAS,CAAC;QACjC,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CACjC,GAAG,GAAG,yDAAyD,CAAC,GAAG,CACpE,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC5C,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI;gBAAE,OAAO,OAAO,CAAC;YACxD,IAAI,OAAO,KAAK,GAAG;gBAAE,OAAO,gBAAgB,CAAC;YAC7C,IAAI,OAAO,KAAK,GAAG;gBAAE,OAAO,eAAe,CAAC;YAC5C,OAAO,SAAS,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,mEAAmE;AAEnE,SAAS,mBAAmB,CAAC,OAA4B,EAAE,IAAa;IACtE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,GAAG,CACL,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG;YACtG,aAAa,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAC5F,CAAC;IACJ,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,GAAW;IACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAqC,EACrC,IAAsC;IAEtC,OAAO,KAAK,EACV,IAAa,EACb,OAA4B,EAC5B,aAAqB,EACG,EAAE;QAC1B,IAAI,IAAI,EAAE,WAAW,EAAE,EAAE;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACrB,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IACjD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,IAAyB;IAEzB,OAAO,KAAK,EACV,IAAa,EACb,OAA4B,EAC5B,aAAqB,EACG,EAAE;QAC1B,IAAI,IAAI,EAAE,IAAI;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC;YACH,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9E,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QACjD,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,mEAAmE;AAEnE,SAAS,UAAU,CAAC,OAAe,EAAE,MAAc;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAC7C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3D,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,EAAqB,EACrB,KAAa,EACb,OAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,KAAK,sCAAsC,CAAC,GAAG,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACpE,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC3C,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,+BAA+B,CAAC,IAAI,CAAC,CAAC;QACnD,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;QAC/E,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;YACzF,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,GAAG,0BAA0B,CAAC,EAAE,CAAC,CAAC;YACxE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACzD,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAAqC,EACrC,IAAsC;IAEtC,OAAO,KAAK,EAAE,IAAY,EAA2B,EAAE;QACrD,IAAI,IAAI,EAAE,WAAW,EAAE,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACxD,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACzD,MAAM,WAAW,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,0BAA0B,WAAW,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,uDAAuD,CAAC,MAAM,CAAC,CAAC;QAC7E,OAAO,iBAAiB,CAAC,EAAE,EAAE,qBAAqB,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,IAAyB;IAEzB,OAAO,KAAK,EAAE,IAAY,EAA2B,EAAE;QACrD,IAAI,IAAI,EAAE,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC7C,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,iEAAiE,CAAC,MAAM,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC;YACH,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,EAAE,IAAI,CAAC,CAAC;QACrE,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,mEAAmE;AAEnE,MAAM,UAAU,0BAA0B,CACxC,KAAqC,EACrC,IAAsC;IAEtC,OAAO,KAAK,EAAE,MAAc,EAA2B,EAAE;QACvD,IAAI,IAAI,EAAE,WAAW,EAAE,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACxD,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACtC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;QACvD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,wDAAwD,CAAC,MAAM,CAAC,CAAC;QAC9E,OAAO,iBAAiB,CAAC,EAAE,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,IAAyB;IAEzB,OAAO,KAAK,EAAE,MAAc,EAA2B,EAAE;QACvD,IAAI,IAAI,EAAE,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC7C,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,iEAAiE,CAAC,MAAM,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC;YACH,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "duocode",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Multi-agent code orchestration CLI with AST ownership, negotiation, provider routing, and GitHub integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
|
-
"keywords": [
|
|
7
|
+
"keywords": [
|
|
8
|
+
"cli",
|
|
9
|
+
"coding",
|
|
10
|
+
"ai",
|
|
11
|
+
"orchestration",
|
|
12
|
+
"multi-agent",
|
|
13
|
+
"duopair"
|
|
14
|
+
],
|
|
8
15
|
"repository": {
|
|
9
16
|
"type": "git",
|
|
10
17
|
"url": "git+https://github.com/duocode/duocode.git"
|