@dewtech/dare-cli 2.1.0 → 2.3.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/README.md +53 -7
- package/dist/__tests__/dag-runner/adapters.test.d.ts +2 -0
- package/dist/__tests__/dag-runner/adapters.test.d.ts.map +1 -0
- package/dist/__tests__/dag-runner/adapters.test.js +134 -0
- package/dist/__tests__/dag-runner/adapters.test.js.map +1 -0
- package/dist/__tests__/dag-runner/graph-ingest.test.d.ts +2 -0
- package/dist/__tests__/dag-runner/graph-ingest.test.d.ts.map +1 -0
- package/dist/__tests__/dag-runner/graph-ingest.test.js +105 -0
- package/dist/__tests__/dag-runner/graph-ingest.test.js.map +1 -0
- package/dist/__tests__/dag-runner/orchestrator.test.d.ts +2 -0
- package/dist/__tests__/dag-runner/orchestrator.test.d.ts.map +1 -0
- package/dist/__tests__/dag-runner/orchestrator.test.js +107 -0
- package/dist/__tests__/dag-runner/orchestrator.test.js.map +1 -0
- package/dist/__tests__/dag-runner/utils.test.d.ts +2 -0
- package/dist/__tests__/dag-runner/utils.test.d.ts.map +1 -0
- package/dist/__tests__/dag-runner/utils.test.js +47 -0
- package/dist/__tests__/dag-runner/utils.test.js.map +1 -0
- package/dist/__tests__/graphrag/json-graph.test.d.ts +2 -0
- package/dist/__tests__/graphrag/json-graph.test.d.ts.map +1 -0
- package/dist/__tests__/graphrag/json-graph.test.js +57 -0
- package/dist/__tests__/graphrag/json-graph.test.js.map +1 -0
- package/dist/bin/dare.js +2 -0
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +172 -45
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/graph.d.ts +9 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +155 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/dag-runner/adapters/antigravity.d.ts +6 -0
- package/dist/dag-runner/adapters/antigravity.d.ts.map +1 -0
- package/dist/dag-runner/adapters/antigravity.js +54 -0
- package/dist/dag-runner/adapters/antigravity.js.map +1 -0
- package/dist/dag-runner/adapters/claude.d.ts +6 -0
- package/dist/dag-runner/adapters/claude.d.ts.map +1 -0
- package/dist/dag-runner/adapters/claude.js +48 -0
- package/dist/dag-runner/adapters/claude.js.map +1 -0
- package/dist/dag-runner/adapters/cursor.d.ts +6 -0
- package/dist/dag-runner/adapters/cursor.d.ts.map +1 -0
- package/dist/dag-runner/adapters/cursor.js +58 -0
- package/dist/dag-runner/adapters/cursor.js.map +1 -0
- package/dist/dag-runner/adapters/index.d.ts +46 -0
- package/dist/dag-runner/adapters/index.d.ts.map +1 -0
- package/dist/dag-runner/adapters/index.js +55 -0
- package/dist/dag-runner/adapters/index.js.map +1 -0
- package/dist/dag-runner/graph-ingest.d.ts +17 -0
- package/dist/dag-runner/graph-ingest.d.ts.map +1 -0
- package/dist/dag-runner/graph-ingest.js +149 -0
- package/dist/dag-runner/graph-ingest.js.map +1 -0
- package/dist/dag-runner/run_dag.d.ts +51 -24
- package/dist/dag-runner/run_dag.d.ts.map +1 -1
- package/dist/dag-runner/run_dag.js +163 -109
- package/dist/dag-runner/run_dag.js.map +1 -1
- package/dist/dag-runner/state-store.d.ts +13 -0
- package/dist/dag-runner/state-store.d.ts.map +1 -0
- package/dist/dag-runner/state-store.js +69 -0
- package/dist/dag-runner/state-store.js.map +1 -0
- package/dist/dag-runner/utils/cap-output.d.ts +14 -0
- package/dist/dag-runner/utils/cap-output.d.ts.map +1 -0
- package/dist/dag-runner/utils/cap-output.js +25 -0
- package/dist/dag-runner/utils/cap-output.js.map +1 -0
- package/dist/dag-runner/utils/stitch-context.d.ts +24 -0
- package/dist/dag-runner/utils/stitch-context.d.ts.map +1 -0
- package/dist/dag-runner/utils/stitch-context.js +36 -0
- package/dist/dag-runner/utils/stitch-context.js.map +1 -0
- package/dist/dag-runner/utils/timeout.d.ts +27 -0
- package/dist/dag-runner/utils/timeout.d.ts.map +1 -0
- package/dist/dag-runner/utils/timeout.js +55 -0
- package/dist/dag-runner/utils/timeout.js.map +1 -0
- package/dist/graphrag/factory.d.ts +25 -0
- package/dist/graphrag/factory.d.ts.map +1 -0
- package/dist/graphrag/factory.js +66 -0
- package/dist/graphrag/factory.js.map +1 -0
- package/dist/graphrag/index.d.ts +4 -0
- package/dist/graphrag/index.d.ts.map +1 -1
- package/dist/graphrag/index.js +2 -0
- package/dist/graphrag/index.js.map +1 -1
- package/dist/graphrag/json-graph.d.ts +28 -0
- package/dist/graphrag/json-graph.d.ts.map +1 -0
- package/dist/graphrag/json-graph.js +168 -0
- package/dist/graphrag/json-graph.js.map +1 -0
- package/dist/graphrag/knowledge-graph.d.ts +33 -0
- package/dist/graphrag/knowledge-graph.d.ts.map +1 -0
- package/dist/graphrag/knowledge-graph.js +2 -0
- package/dist/graphrag/knowledge-graph.js.map +1 -0
- package/dist/index.d.ts +13 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +99 -96
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +68 -69
- package/templates/ide/cursor/.cursor/commands/run-dag.md +67 -44
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +97 -87
package/dist/bin/dare.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dare.js","sourceRoot":"","sources":["../../src/bin/dare.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"dare.js","sourceRoot":"","sources":["../../src/bin/dare.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEzE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,6FAA6F,CAAC;KAC1G,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyDpC,eAAO,MAAM,cAAc,SA+CvB,CAAC"}
|
package/dist/commands/execute.js
CHANGED
|
@@ -2,59 +2,186 @@ import { Command } from 'commander';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import fs from 'fs-extra';
|
|
4
4
|
import path from 'path';
|
|
5
|
-
import {
|
|
5
|
+
import { applyCascadingSkip, buildTaskPrompt, computeRanks, markDone, markFailed, markRunning, nextExecutableTasks, renderCanvas, } from '../dag-runner/run_dag.js';
|
|
6
6
|
import { convertYamlToDag } from '../utils/dag-converter.js';
|
|
7
|
+
import { createGraph, loadGraphConfig } from '../graphrag/index.js';
|
|
8
|
+
import { DEFAULT_STATE_PATH, loadAndApplyState, saveState, } from '../dag-runner/state-store.js';
|
|
7
9
|
export const executeCommand = new Command('execute')
|
|
8
|
-
.description('
|
|
9
|
-
.argument('[task-id]', 'Specific task ID to execute')
|
|
10
|
-
.option('--parallel', 'Execute independent tasks in parallel', false)
|
|
11
|
-
.option('--runner <runner>', 'Runner: cursor or antigravity', 'cursor')
|
|
10
|
+
.description('Orchestrate DAG execution (the IDE agent runs each task)')
|
|
12
11
|
.option('--dag <file>', 'Path to dare-dag.yaml', 'DARE/dare-dag.yaml')
|
|
13
|
-
.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
.option('--next', 'Print the next executable tasks (with composed prompts)', false)
|
|
13
|
+
.option('--status', 'Render canvas and show summary (default action)', false)
|
|
14
|
+
.option('--complete <id>', 'Mark a task DONE (use with --output)')
|
|
15
|
+
.option('--fail <id>', 'Mark a task FAILED (use with --reason)')
|
|
16
|
+
.option('--reset <id>', 'Reset a task back to PENDING')
|
|
17
|
+
.option('--output <text>', 'Captured task output (used with --complete)')
|
|
18
|
+
.option('--reason <text>', 'Failure reason (used with --fail)')
|
|
19
|
+
.option('--tokens <n>', 'Tokens consumed (used with --complete)')
|
|
20
|
+
.option('--duration <ms>', 'Task duration in ms (used with --complete)')
|
|
21
|
+
.option('--no-graph', 'Skip knowledge-graph ingestion for this call', false)
|
|
22
|
+
.option('--parallel-hint', 'When using --next, mark every rank-equal task as RUNNING', false)
|
|
23
|
+
.action(async (options) => {
|
|
24
|
+
const cwd = process.cwd();
|
|
25
|
+
const dagPath = path.resolve(cwd, options.dag);
|
|
26
|
+
const canvasPath = path.resolve(cwd, 'DARE/.canvas.md');
|
|
27
|
+
if (!(await fs.pathExists(dagPath))) {
|
|
28
|
+
console.error(chalk.red(`❌ ${options.dag} not found.`));
|
|
18
29
|
console.log(chalk.yellow('Run: dare blueprint'));
|
|
19
30
|
process.exit(1);
|
|
20
31
|
}
|
|
21
|
-
const
|
|
22
|
-
const dag =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
const stateFile = path.resolve(cwd, DEFAULT_STATE_PATH);
|
|
33
|
+
const dag = await loadDag(dagPath);
|
|
34
|
+
await loadAndApplyState(dag, stateFile);
|
|
35
|
+
const graph = options.noGraph ? undefined : await tryOpenGraph(cwd);
|
|
36
|
+
try {
|
|
37
|
+
if (options.complete) {
|
|
38
|
+
await handleComplete(dag, options, stateFile, canvasPath, graph);
|
|
28
39
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
else {
|
|
32
|
-
const pendingTasks = dag.tasks.filter((t) => t.status !== 'DONE');
|
|
33
|
-
console.log(chalk.cyan(`📋 Tasks to execute: ${pendingTasks.length}`));
|
|
34
|
-
console.log(chalk.cyan(`🔀 Mode: ${options.parallel ? 'Parallel (DAG)' : 'Sequential'}`));
|
|
35
|
-
console.log(chalk.cyan(`🖥️ Runner: ${options.runner}\n`));
|
|
36
|
-
}
|
|
37
|
-
if (options.parallel) {
|
|
38
|
-
console.log(chalk.yellow('🚀 Starting DAG Task Runner with parallel execution...\n'));
|
|
39
|
-
await runDag(dag, {
|
|
40
|
-
parallel: true,
|
|
41
|
-
runner: options.runner,
|
|
42
|
-
canvasPath: path.resolve(process.cwd(), 'DARE/.canvas.md'),
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
console.log(chalk.yellow('▶️ Starting sequential execution...\n'));
|
|
47
|
-
for (const task of dag.tasks) {
|
|
48
|
-
if (task.status === 'DONE') {
|
|
49
|
-
console.log(chalk.gray(`⏭️ Skipping ${task.id} (already done)`));
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
console.log(chalk.cyan(`🔄 Executing ${task.id}: ${task.title}`));
|
|
53
|
-
// Sequential execution placeholder
|
|
54
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
55
|
-
console.log(chalk.green(`✅ ${task.id} completed`));
|
|
40
|
+
else if (options.fail) {
|
|
41
|
+
await handleFail(dag, options, stateFile, canvasPath, graph);
|
|
56
42
|
}
|
|
43
|
+
else if (options.reset) {
|
|
44
|
+
await handleReset(dag, options.reset, stateFile, canvasPath);
|
|
45
|
+
}
|
|
46
|
+
else if (options.next) {
|
|
47
|
+
await handleNext(dag, options, stateFile, canvasPath);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Default: --status
|
|
51
|
+
await handleStatus(dag, canvasPath);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
graph?.close();
|
|
57
56
|
}
|
|
58
|
-
console.log(chalk.green.bold('\n✅ Execution complete!\n'));
|
|
59
57
|
});
|
|
58
|
+
// ─── Handlers ────────────────────────────────────────────────────────────────
|
|
59
|
+
async function handleNext(dag, options, stateFile, canvasPath) {
|
|
60
|
+
const newlySkipped = applyCascadingSkip(dag);
|
|
61
|
+
if (newlySkipped.length > 0) {
|
|
62
|
+
console.log(chalk.gray(`↷ Auto-skipped ${newlySkipped.length} blocked task(s).`));
|
|
63
|
+
}
|
|
64
|
+
const ready = nextExecutableTasks(dag, true);
|
|
65
|
+
if (ready.length === 0) {
|
|
66
|
+
const remaining = dag.tasks.some((t) => t.status === 'PENDING' || t.status === 'RUNNING');
|
|
67
|
+
if (remaining) {
|
|
68
|
+
console.log(chalk.yellow('⏸ No tasks ready right now (waiting on RUNNING tasks to complete).'));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.log(chalk.green('✅ All tasks resolved. Run `dare execute --status` for the summary.'));
|
|
72
|
+
}
|
|
73
|
+
await persist(dag, stateFile, canvasPath);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const ranks = computeRanks(dag.tasks);
|
|
77
|
+
const rank = ranks.get(ready[0].id) ?? 0;
|
|
78
|
+
console.log(chalk.blue.bold(`\n📦 Rank ${rank} — ${ready.length} task(s) ready in parallel\n`));
|
|
79
|
+
for (const task of ready) {
|
|
80
|
+
if (options.parallelHint)
|
|
81
|
+
markRunning(dag, task.id);
|
|
82
|
+
printTaskBriefing(dag, task);
|
|
83
|
+
}
|
|
84
|
+
await persist(dag, stateFile, canvasPath);
|
|
85
|
+
console.log(chalk.cyan('\nNext steps for the IDE agent:'));
|
|
86
|
+
console.log(' 1. Execute each task above (parallel or sequential — your choice).');
|
|
87
|
+
console.log(' 2. After each task: `dare execute --complete <id> --output "<summary>"`');
|
|
88
|
+
console.log(' 3. On failure: `dare execute --fail <id> --reason "<message>"`');
|
|
89
|
+
console.log(' 4. When this rank finishes, run `dare execute --next` again.\n');
|
|
90
|
+
}
|
|
91
|
+
async function handleComplete(dag, options, stateFile, canvasPath, graph) {
|
|
92
|
+
const taskId = options.complete;
|
|
93
|
+
const tokens = options.tokens ? parseInt(options.tokens, 10) : undefined;
|
|
94
|
+
const duration = options.duration ? parseInt(options.duration, 10) : undefined;
|
|
95
|
+
const task = markDone(dag, taskId, {
|
|
96
|
+
output: options.output,
|
|
97
|
+
tokens,
|
|
98
|
+
durationMs: duration,
|
|
99
|
+
graph,
|
|
100
|
+
});
|
|
101
|
+
console.log(chalk.green(`✅ ${task.id} marked as DONE.`));
|
|
102
|
+
if (task.tokens)
|
|
103
|
+
console.log(chalk.gray(` tokens: ${task.tokens}`));
|
|
104
|
+
if (task.duration)
|
|
105
|
+
console.log(chalk.gray(` duration: ${task.duration}ms`));
|
|
106
|
+
await persist(dag, stateFile, canvasPath);
|
|
107
|
+
}
|
|
108
|
+
async function handleFail(dag, options, stateFile, canvasPath, graph) {
|
|
109
|
+
const taskId = options.fail;
|
|
110
|
+
const duration = options.duration ? parseInt(options.duration, 10) : undefined;
|
|
111
|
+
const task = markFailed(dag, taskId, {
|
|
112
|
+
error: options.reason ?? 'unspecified',
|
|
113
|
+
durationMs: duration,
|
|
114
|
+
graph,
|
|
115
|
+
});
|
|
116
|
+
console.log(chalk.red(`❌ ${task.id} marked as FAILED: ${task.error}`));
|
|
117
|
+
const skipped = dag.tasks.filter((t) => t.status === 'SKIPPED');
|
|
118
|
+
if (skipped.length > 0) {
|
|
119
|
+
console.log(chalk.gray(` Cascading-skipped: ${skipped.map((t) => t.id).join(', ')}`));
|
|
120
|
+
}
|
|
121
|
+
await persist(dag, stateFile, canvasPath);
|
|
122
|
+
}
|
|
123
|
+
async function handleReset(dag, taskId, stateFile, canvasPath) {
|
|
124
|
+
const task = dag.tasks.find((t) => t.id === taskId);
|
|
125
|
+
if (!task) {
|
|
126
|
+
console.error(chalk.red(`❌ Task "${taskId}" not found.`));
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
task.status = 'PENDING';
|
|
130
|
+
task.error = undefined;
|
|
131
|
+
task.output = undefined;
|
|
132
|
+
task.duration = undefined;
|
|
133
|
+
task.tokens = undefined;
|
|
134
|
+
console.log(chalk.cyan(`↺ ${task.id} reset to PENDING.`));
|
|
135
|
+
await persist(dag, stateFile, canvasPath);
|
|
136
|
+
}
|
|
137
|
+
async function handleStatus(dag, canvasPath) {
|
|
138
|
+
await renderCanvas(dag, canvasPath);
|
|
139
|
+
const counts = {
|
|
140
|
+
PENDING: 0,
|
|
141
|
+
RUNNING: 0,
|
|
142
|
+
DONE: 0,
|
|
143
|
+
FAILED: 0,
|
|
144
|
+
SKIPPED: 0,
|
|
145
|
+
};
|
|
146
|
+
for (const t of dag.tasks)
|
|
147
|
+
counts[t.status ?? 'PENDING']++;
|
|
148
|
+
console.log(chalk.blue.bold(`\n📊 ${dag.title}\n`));
|
|
149
|
+
console.log(` ✅ DONE : ${counts.DONE}`);
|
|
150
|
+
console.log(` 🔄 RUNNING : ${counts.RUNNING}`);
|
|
151
|
+
console.log(` ⏳ PENDING : ${counts.PENDING}`);
|
|
152
|
+
console.log(` ❌ FAILED : ${counts.FAILED}`);
|
|
153
|
+
console.log(` ⏭️ SKIPPED : ${counts.SKIPPED}`);
|
|
154
|
+
console.log(chalk.cyan(`\n 📄 Canvas: ${canvasPath}\n`));
|
|
155
|
+
}
|
|
156
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
157
|
+
async function loadDag(dagPath) {
|
|
158
|
+
const yaml = await fs.readFile(dagPath, 'utf-8');
|
|
159
|
+
return convertYamlToDag(yaml);
|
|
160
|
+
}
|
|
161
|
+
async function persist(dag, stateFile, canvasPath) {
|
|
162
|
+
await saveState(dag, stateFile);
|
|
163
|
+
await renderCanvas(dag, canvasPath);
|
|
164
|
+
}
|
|
165
|
+
async function tryOpenGraph(cwd) {
|
|
166
|
+
try {
|
|
167
|
+
const config = await loadGraphConfig({ cwd });
|
|
168
|
+
return await createGraph(config, { cwd });
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
172
|
+
console.log(chalk.gray(`(graph disabled: ${msg})`));
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function printTaskBriefing(dag, task) {
|
|
177
|
+
console.log(chalk.bold(`▸ ${task.id} — ${task.title}`));
|
|
178
|
+
console.log(chalk.gray(` complexity: ${task.complexity}`));
|
|
179
|
+
if (task.spec_file)
|
|
180
|
+
console.log(chalk.gray(` spec_file: ${task.spec_file}`));
|
|
181
|
+
console.log(chalk.gray(' prompt:'));
|
|
182
|
+
const prompt = buildTaskPrompt(dag, task);
|
|
183
|
+
for (const line of prompt.split('\n'))
|
|
184
|
+
console.log(` ${line}`);
|
|
185
|
+
console.log();
|
|
186
|
+
}
|
|
60
187
|
//# sourceMappingURL=execute.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* `dare graph` — query and visualize the project's knowledge graph.
|
|
4
|
+
*
|
|
5
|
+
* The graph is populated automatically by `dare execute --complete/--fail`.
|
|
6
|
+
* Use these subcommands to inspect, search and export it.
|
|
7
|
+
*/
|
|
8
|
+
export declare const graphCommand: Command;
|
|
9
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC;;;;;GAKG;AACH,eAAO,MAAM,YAAY,SACuC,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { convertYamlToDag } from '../utils/dag-converter.js';
|
|
6
|
+
import { ingestDag } from '../dag-runner/graph-ingest.js';
|
|
7
|
+
import { loadAndApplyState } from '../dag-runner/state-store.js';
|
|
8
|
+
import { createGraph, loadGraphConfig } from '../graphrag/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* `dare graph` — query and visualize the project's knowledge graph.
|
|
11
|
+
*
|
|
12
|
+
* The graph is populated automatically by `dare execute --complete/--fail`.
|
|
13
|
+
* Use these subcommands to inspect, search and export it.
|
|
14
|
+
*/
|
|
15
|
+
export const graphCommand = new Command('graph')
|
|
16
|
+
.description('Inspect and visualize the DARE knowledge graph');
|
|
17
|
+
graphCommand
|
|
18
|
+
.command('stats')
|
|
19
|
+
.description('Show node/edge counts and type breakdown')
|
|
20
|
+
.action(async () => {
|
|
21
|
+
await withGraph(async (graph) => {
|
|
22
|
+
const stats = graph.getStatistics();
|
|
23
|
+
console.log(chalk.blue.bold('\n📊 DARE Knowledge Graph\n'));
|
|
24
|
+
console.log(` Total nodes: ${chalk.cyan(stats.totalNodes)}`);
|
|
25
|
+
console.log(` Total edges: ${chalk.cyan(stats.totalEdges)}`);
|
|
26
|
+
if (Object.keys(stats.nodesByType).length > 0) {
|
|
27
|
+
console.log(chalk.bold('\n Nodes by type:'));
|
|
28
|
+
for (const [type, count] of Object.entries(stats.nodesByType)) {
|
|
29
|
+
console.log(` ${type.padEnd(12)} ${count}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (Object.keys(stats.edgesByType).length > 0) {
|
|
33
|
+
console.log(chalk.bold('\n Edges by type:'));
|
|
34
|
+
for (const [type, count] of Object.entries(stats.edgesByType)) {
|
|
35
|
+
console.log(` ${type.padEnd(12)} ${count}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
console.log();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
graphCommand
|
|
42
|
+
.command('query <term>')
|
|
43
|
+
.description('Search nodes whose label/description contains <term>')
|
|
44
|
+
.option('-l, --limit <n>', 'Maximum results', '10')
|
|
45
|
+
.action(async (term, options) => {
|
|
46
|
+
const limit = parseInt(options.limit, 10) || 10;
|
|
47
|
+
await withGraph(async (graph) => {
|
|
48
|
+
const results = graph.searchNodes(term, limit);
|
|
49
|
+
if (results.length === 0) {
|
|
50
|
+
console.log(chalk.yellow(`No matches for "${term}".`));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
console.log(chalk.blue.bold(`\n🔎 ${results.length} match(es) for "${term}"\n`));
|
|
54
|
+
for (const r of results) {
|
|
55
|
+
console.log(`${chalk.cyan(r.node.id)} ${chalk.gray(`[${r.node.type}]`)}`);
|
|
56
|
+
console.log(` ${r.node.label}`);
|
|
57
|
+
if (r.snippet)
|
|
58
|
+
console.log(chalk.gray(` ${r.snippet}`));
|
|
59
|
+
console.log();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
graphCommand
|
|
64
|
+
.command('viz')
|
|
65
|
+
.description('Export the graph to a Mermaid or DOT diagram')
|
|
66
|
+
.option('-f, --format <fmt>', 'Output format: mermaid | dot', 'mermaid')
|
|
67
|
+
.option('-o, --output <file>', 'Write to file (defaults to stdout)')
|
|
68
|
+
.action(async (options) => {
|
|
69
|
+
const format = options.format.toLowerCase();
|
|
70
|
+
if (format !== 'mermaid' && format !== 'dot') {
|
|
71
|
+
console.error(chalk.red(`Unsupported format "${options.format}". Use: mermaid | dot.`));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
await withGraph(async (graph) => {
|
|
75
|
+
const { nodes, edges } = graph.exportToJson();
|
|
76
|
+
const rendered = format === 'mermaid' ? renderMermaid(nodes, edges) : renderDot(nodes, edges);
|
|
77
|
+
if (options.output) {
|
|
78
|
+
await fs.writeFile(options.output, rendered);
|
|
79
|
+
console.log(chalk.green(`✅ Wrote ${nodes.length} nodes / ${edges.length} edges to ${options.output}`));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log(rendered);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
graphCommand
|
|
87
|
+
.command('ingest')
|
|
88
|
+
.description('Re-sync the graph from the current dare-dag.yaml + state')
|
|
89
|
+
.option('--dag <file>', 'Path to dare-dag.yaml', 'DARE/dare-dag.yaml')
|
|
90
|
+
.action(async (options) => {
|
|
91
|
+
const cwd = process.cwd();
|
|
92
|
+
const dagPath = path.resolve(cwd, options.dag);
|
|
93
|
+
if (!(await fs.pathExists(dagPath))) {
|
|
94
|
+
console.error(chalk.red(`❌ ${options.dag} not found.`));
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
const dag = convertYamlToDag(await fs.readFile(dagPath, 'utf-8'));
|
|
98
|
+
await loadAndApplyState(dag, path.resolve(cwd, '.dare/state.json'));
|
|
99
|
+
await withGraph(async (graph) => {
|
|
100
|
+
ingestDag(graph, dag);
|
|
101
|
+
const stats = graph.getStatistics();
|
|
102
|
+
console.log(chalk.green(`✅ Re-ingested ${dag.tasks.length} tasks. Graph now has ${stats.totalNodes} nodes / ${stats.totalEdges} edges.`));
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
106
|
+
async function withGraph(fn) {
|
|
107
|
+
const cwd = process.cwd();
|
|
108
|
+
let graph;
|
|
109
|
+
try {
|
|
110
|
+
const config = await loadGraphConfig({ cwd });
|
|
111
|
+
graph = await createGraph(config, { cwd });
|
|
112
|
+
await fn(graph);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.error(chalk.red(`❌ ${err instanceof Error ? err.message : String(err)}`));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
graph?.close();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function renderMermaid(nodes, edges) {
|
|
123
|
+
const lines = ['graph LR'];
|
|
124
|
+
for (const n of nodes) {
|
|
125
|
+
const safeId = sanitizeMermaidId(n.id);
|
|
126
|
+
const label = `${n.label}\\n[${n.type}]`.replace(/"/g, '"');
|
|
127
|
+
lines.push(` ${safeId}["${label}"]`);
|
|
128
|
+
}
|
|
129
|
+
for (const e of edges) {
|
|
130
|
+
const src = sanitizeMermaidId(e.sourceId);
|
|
131
|
+
const tgt = sanitizeMermaidId(e.targetId);
|
|
132
|
+
lines.push(` ${src} -- ${e.type} --> ${tgt}`);
|
|
133
|
+
}
|
|
134
|
+
return lines.join('\n');
|
|
135
|
+
}
|
|
136
|
+
function renderDot(nodes, edges) {
|
|
137
|
+
const lines = ['digraph DARE {', ' rankdir=LR;', ' node [shape=box];'];
|
|
138
|
+
for (const n of nodes) {
|
|
139
|
+
const id = JSON.stringify(n.id);
|
|
140
|
+
const label = JSON.stringify(`${n.label}\n[${n.type}]`);
|
|
141
|
+
lines.push(` ${id} [label=${label}];`);
|
|
142
|
+
}
|
|
143
|
+
for (const e of edges) {
|
|
144
|
+
const src = JSON.stringify(e.sourceId);
|
|
145
|
+
const tgt = JSON.stringify(e.targetId);
|
|
146
|
+
const lbl = JSON.stringify(e.type);
|
|
147
|
+
lines.push(` ${src} -> ${tgt} [label=${lbl}];`);
|
|
148
|
+
}
|
|
149
|
+
lines.push('}');
|
|
150
|
+
return lines.join('\n');
|
|
151
|
+
}
|
|
152
|
+
function sanitizeMermaidId(id) {
|
|
153
|
+
return id.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/commands/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type AdapterCallInput, type AdapterCallResult, type RunnerAdapter } from './index.js';
|
|
2
|
+
export declare class AntigravityAdapter implements RunnerAdapter {
|
|
3
|
+
readonly name: "antigravity";
|
|
4
|
+
call({ prompt, complexity, models, signal }: AdapterCallInput): Promise<AdapterCallResult>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=antigravity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity.d.ts","sourceRoot":"","sources":["../../../src/dag-runner/adapters/antigravity.ts"],"names":[],"mappings":"AAWA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAQpB,qBAAa,kBAAmB,YAAW,aAAa;IACtD,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAU;IAEjC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA6BjG"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Antigravity adapter — uses Google Generative AI (Gemini) to execute a task.
|
|
3
|
+
*
|
|
4
|
+
* Antigravity (Google's IDE) does not expose a public agent SDK at the time
|
|
5
|
+
* of writing, so we drive the underlying Gemini family directly. Models in
|
|
6
|
+
* `dare-dag.yaml`'s `models.antigravity` block (e.g. `gemini-2.5-pro`,
|
|
7
|
+
* `gemini-2.5-flash`) are passed as the model id.
|
|
8
|
+
*
|
|
9
|
+
* Env: ANTIGRAVITY_API_KEY (preferred) or GOOGLE_API_KEY (fallback).
|
|
10
|
+
*/
|
|
11
|
+
import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
12
|
+
import { AdapterCallError, MissingApiKeyError, pickModel, } from './index.js';
|
|
13
|
+
const SYSTEM_INSTRUCTION = 'You are a DARE subagent executing a single task from a DAG. Follow the prompt ' +
|
|
14
|
+
'exactly. When you finish, respond with a concise summary of what you did and the ' +
|
|
15
|
+
'paths of files you created or modified. Keep responses self-contained — your ' +
|
|
16
|
+
'output may be quoted into a downstream task.';
|
|
17
|
+
export class AntigravityAdapter {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.name = 'antigravity';
|
|
20
|
+
}
|
|
21
|
+
async call({ prompt, complexity, models, signal }) {
|
|
22
|
+
const apiKey = process.env.ANTIGRAVITY_API_KEY ?? process.env.GOOGLE_API_KEY;
|
|
23
|
+
if (!apiKey)
|
|
24
|
+
throw new MissingApiKeyError('antigravity', 'ANTIGRAVITY_API_KEY');
|
|
25
|
+
const modelId = pickModel(models, complexity);
|
|
26
|
+
try {
|
|
27
|
+
const client = new GoogleGenerativeAI(apiKey);
|
|
28
|
+
const model = client.getGenerativeModel({
|
|
29
|
+
model: modelId,
|
|
30
|
+
systemInstruction: SYSTEM_INSTRUCTION,
|
|
31
|
+
});
|
|
32
|
+
const res = await model.generateContent({
|
|
33
|
+
contents: [{ role: 'user', parts: [{ text: prompt }] }],
|
|
34
|
+
}, { signal });
|
|
35
|
+
const text = res.response.text();
|
|
36
|
+
const usage = res.response.usageMetadata;
|
|
37
|
+
const tokens = usage
|
|
38
|
+
? (usage.promptTokenCount ?? 0) + (usage.candidatesTokenCount ?? 0)
|
|
39
|
+
: undefined;
|
|
40
|
+
return { output: text, tokens };
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (err instanceof MissingApiKeyError)
|
|
44
|
+
throw err;
|
|
45
|
+
throw new AdapterCallError('antigravity', extractErrorMessage(err), err);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function extractErrorMessage(err) {
|
|
50
|
+
if (err instanceof Error)
|
|
51
|
+
return err.message;
|
|
52
|
+
return String(err);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=antigravity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity.js","sourceRoot":"","sources":["../../../src/dag-runner/adapters/antigravity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,GAIV,MAAM,YAAY,CAAC;AAEpB,MAAM,kBAAkB,GACtB,gFAAgF;IAChF,mFAAmF;IACnF,+EAA+E;IAC/E,8CAA8C,CAAC;AAEjD,MAAM,OAAO,kBAAkB;IAA/B;QACW,SAAI,GAAG,aAAsB,CAAC;IA+BzC,CAAC;IA7BC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAoB;QACjE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAC7E,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,kBAAkB,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;QAEhF,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;gBACtC,KAAK,EAAE,OAAO;gBACd,iBAAiB,EAAE,kBAAkB;aACtC,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC;gBACtC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;aACxD,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAEf,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,MAAM,MAAM,GAAG,KAAK;gBAClB,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,CAAC;gBACnE,CAAC,CAAC,SAAS,CAAC;YAEd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,kBAAkB;gBAAE,MAAM,GAAG,CAAC;YACjD,MAAM,IAAI,gBAAgB,CAAC,aAAa,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,GAAY;IACvC,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type AdapterCallInput, type AdapterCallResult, type RunnerAdapter } from './index.js';
|
|
2
|
+
export declare class ClaudeAdapter implements RunnerAdapter {
|
|
3
|
+
readonly name: "claude";
|
|
4
|
+
call({ prompt, complexity, models, signal }: AdapterCallInput): Promise<AdapterCallResult>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/dag-runner/adapters/claude.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAQpB,qBAAa,aAAc,YAAW,aAAa;IACjD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA+BjG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude adapter — calls the Anthropic Messages API to execute a task.
|
|
3
|
+
*
|
|
4
|
+
* Env: ANTHROPIC_API_KEY
|
|
5
|
+
*/
|
|
6
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
7
|
+
import { AdapterCallError, MissingApiKeyError, pickModel, } from './index.js';
|
|
8
|
+
const SYSTEM_PROMPT = 'You are a DARE subagent executing a single task from a DAG. Follow the prompt ' +
|
|
9
|
+
'exactly. When you finish, respond with a concise summary of what you did and the ' +
|
|
10
|
+
'paths of files you created or modified. Keep responses self-contained — your ' +
|
|
11
|
+
'output may be quoted into a downstream task.';
|
|
12
|
+
export class ClaudeAdapter {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.name = 'claude';
|
|
15
|
+
}
|
|
16
|
+
async call({ prompt, complexity, models, signal }) {
|
|
17
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
18
|
+
if (!apiKey)
|
|
19
|
+
throw new MissingApiKeyError('claude', 'ANTHROPIC_API_KEY');
|
|
20
|
+
const model = pickModel(models, complexity);
|
|
21
|
+
const client = new Anthropic({ apiKey });
|
|
22
|
+
try {
|
|
23
|
+
const res = await client.messages.create({
|
|
24
|
+
model,
|
|
25
|
+
max_tokens: 4096,
|
|
26
|
+
system: SYSTEM_PROMPT,
|
|
27
|
+
messages: [{ role: 'user', content: prompt }],
|
|
28
|
+
}, { signal });
|
|
29
|
+
const text = res.content
|
|
30
|
+
.filter((b) => b.type === 'text')
|
|
31
|
+
.map((b) => b.text)
|
|
32
|
+
.join('\n');
|
|
33
|
+
const tokens = (res.usage?.input_tokens ?? 0) + (res.usage?.output_tokens ?? 0);
|
|
34
|
+
return { output: text, tokens };
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
if (err instanceof MissingApiKeyError)
|
|
38
|
+
throw err;
|
|
39
|
+
throw new AdapterCallError('claude', extractErrorMessage(err), err);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function extractErrorMessage(err) {
|
|
44
|
+
if (err instanceof Error)
|
|
45
|
+
return err.message;
|
|
46
|
+
return String(err);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/dag-runner/adapters/claude.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,GAIV,MAAM,YAAY,CAAC;AAEpB,MAAM,aAAa,GACjB,gFAAgF;IAChF,mFAAmF;IACnF,+EAA+E;IAC/E,8CAA8C,CAAC;AAEjD,MAAM,OAAO,aAAa;IAA1B;QACW,SAAI,GAAG,QAAiB,CAAC;IAiCpC,CAAC;IA/BC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAoB;QACjE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAEzE,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CACtC;gBACE,KAAK;gBACL,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,aAAa;gBACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;aAC9C,EACD,EAAE,MAAM,EAAE,CACX,CAAC;YAEF,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO;iBACrB,MAAM,CAAC,CAAC,CAAC,EAA4B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAC1D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC,CAAC;YAEhF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,kBAAkB;gBAAE,MAAM,GAAG,CAAC;YACjD,MAAM,IAAI,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,GAAY;IACvC,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type AdapterCallInput, type AdapterCallResult, type RunnerAdapter } from './index.js';
|
|
2
|
+
export declare class CursorAdapter implements RunnerAdapter {
|
|
3
|
+
readonly name: "cursor";
|
|
4
|
+
call({ prompt, complexity, models, signal }: AdapterCallInput): Promise<AdapterCallResult>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/dag-runner/adapters/cursor.ts"],"names":[],"mappings":"AAQA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAEpB,qBAAa,aAAc,YAAW,aAAa;IACjD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAoCjG"}
|