@dewtech/dare-cli 2.0.1 → 2.2.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 +33 -6
- package/dist/__tests__/dag-converter.test.js +114 -0
- package/dist/__tests__/dag-converter.test.js.map +1 -1
- 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/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 +75 -0
- package/dist/__tests__/dag-runner/utils.test.js.map +1 -0
- package/dist/commands/blueprint.d.ts +14 -0
- package/dist/commands/blueprint.d.ts.map +1 -1
- package/dist/commands/blueprint.js +249 -116
- package/dist/commands/blueprint.js.map +1 -1
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +38 -30
- package/dist/commands/execute.js.map +1 -1
- 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/run_dag.d.ts +47 -8
- package/dist/dag-runner/run_dag.d.ts.map +1 -1
- package/dist/dag-runner/run_dag.js +205 -124
- package/dist/dag-runner/run_dag.js.map +1 -1
- 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 +22 -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/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/dag-converter.d.ts +8 -2
- package/dist/utils/dag-converter.d.ts.map +1 -1
- package/dist/utils/dag-converter.js +116 -21
- package/dist/utils/dag-converter.js.map +1 -1
- package/package.json +4 -1
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +172 -0
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +210 -229
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +126 -42
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +110 -0
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +110 -0
- package/templates/ide/cursor/.cursor/commands/generate-tasks.md +117 -20
- package/templates/ide/cursor/.cursor/commands/run-dag.md +87 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +176 -0
|
@@ -1,51 +1,172 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* DARE Framework
|
|
3
|
-
*
|
|
4
|
-
* Executes tasks in parallel based on dependency graph
|
|
2
|
+
* DARE Framework — DAG Task Runner
|
|
3
|
+
*
|
|
4
|
+
* Executes tasks in parallel based on a dependency graph (Kahn's ranks),
|
|
5
|
+
* delegating actual execution to a per-runner adapter (Claude / Cursor /
|
|
6
|
+
* Antigravity). Adapted from the Cursor Cookbook DAG Task Runner pattern.
|
|
5
7
|
*/
|
|
6
8
|
import fs from 'fs-extra';
|
|
9
|
+
import path from 'path';
|
|
7
10
|
import chalk from 'chalk';
|
|
11
|
+
import { getAdapter, MissingApiKeyError } from './adapters/index.js';
|
|
12
|
+
import { capOutput } from './utils/cap-output.js';
|
|
13
|
+
import { composePrompt } from './utils/stitch-context.js';
|
|
14
|
+
import { TaskAbortedError, TaskTimeoutError, withTimeout, } from './utils/timeout.js';
|
|
15
|
+
/** Defaults used when a YAML omits the `limits` block. */
|
|
16
|
+
export const DEFAULT_DAG_LIMITS = {
|
|
17
|
+
parent_context_chars: 2000,
|
|
18
|
+
task_output_chars: 4000,
|
|
19
|
+
timeout_seconds: 600,
|
|
20
|
+
};
|
|
21
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
22
|
+
// Public entry point
|
|
23
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
8
24
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
25
|
+
* Execute the DAG. Tasks are statefully mutated in place: status, output,
|
|
26
|
+
* error, tokens and duration get filled in as execution progresses.
|
|
11
27
|
*/
|
|
12
|
-
function
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
export async function runDag(dag, options) {
|
|
29
|
+
const { parallel, runner, canvasPath, resume = false, onlyTaskId } = options;
|
|
30
|
+
if (!isKnownRunner(runner)) {
|
|
31
|
+
throw new Error(`Unknown runner "${runner}". Expected one of: cursor | claude | antigravity.`);
|
|
32
|
+
}
|
|
33
|
+
const adapter = await getAdapter(runner);
|
|
34
|
+
const limits = dag.limits ?? DEFAULT_DAG_LIMITS;
|
|
35
|
+
const models = dag.models[runner];
|
|
36
|
+
if (!models) {
|
|
37
|
+
throw new Error(`dare-dag.yaml has no \`models.${runner}\` block. Define HIGH/MED/LOW for the chosen runner.`);
|
|
38
|
+
}
|
|
39
|
+
// Reset status only for tasks we plan to execute.
|
|
40
|
+
for (const task of dag.tasks) {
|
|
41
|
+
if (resume && (task.status === 'DONE' || task.status === 'SKIPPED'))
|
|
42
|
+
continue;
|
|
43
|
+
task.status = 'PENDING';
|
|
44
|
+
task.error = undefined;
|
|
45
|
+
}
|
|
46
|
+
// Honor SIGINT / SIGTERM — abort all in-flight tasks.
|
|
47
|
+
const cancellation = new AbortController();
|
|
48
|
+
const onSignal = (sig) => {
|
|
49
|
+
console.log(chalk.yellow(`\n ⚠ Received ${sig}. Cancelling in-flight tasks…`));
|
|
50
|
+
cancellation.abort('signal');
|
|
51
|
+
};
|
|
52
|
+
process.once('SIGINT', () => onSignal('SIGINT'));
|
|
53
|
+
process.once('SIGTERM', () => onSignal('SIGTERM'));
|
|
54
|
+
await renderCanvas(dag, canvasPath);
|
|
55
|
+
try {
|
|
56
|
+
if (onlyTaskId) {
|
|
57
|
+
const task = dag.tasks.find((t) => t.id === onlyTaskId);
|
|
58
|
+
if (!task)
|
|
59
|
+
throw new Error(`Task "${onlyTaskId}" not found in DAG.`);
|
|
60
|
+
await executeOne(task, dag, adapter, models, limits, cancellation.signal, canvasPath);
|
|
61
|
+
}
|
|
62
|
+
else if (parallel) {
|
|
63
|
+
await executeParallel(dag, adapter, models, limits, cancellation.signal, canvasPath);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
await executeSequential(dag, adapter, models, limits, cancellation.signal, canvasPath);
|
|
27
67
|
}
|
|
28
|
-
const maxDepRank = Math.max(...task.depends_on.map((dep) => getRank(dep, new Set(visited))));
|
|
29
|
-
const rank = maxDepRank + 1;
|
|
30
|
-
ranks.set(taskId, rank);
|
|
31
|
-
return rank;
|
|
32
68
|
}
|
|
33
|
-
|
|
34
|
-
|
|
69
|
+
finally {
|
|
70
|
+
await renderCanvas(dag, canvasPath);
|
|
71
|
+
printSummary(dag, canvasPath);
|
|
72
|
+
}
|
|
35
73
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
74
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
75
|
+
// Execution strategies
|
|
76
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
77
|
+
async function executeSequential(dag, adapter, models, limits, externalSignal, canvasPath) {
|
|
78
|
+
for (const task of dag.tasks) {
|
|
79
|
+
if (task.status === 'DONE' || task.status === 'SKIPPED')
|
|
80
|
+
continue;
|
|
81
|
+
await executeOne(task, dag, adapter, models, limits, externalSignal, canvasPath);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function executeParallel(dag, adapter, models, limits, externalSignal, canvasPath) {
|
|
85
|
+
const ranks = computeRanks(dag.tasks);
|
|
86
|
+
const maxRank = Math.max(0, ...ranks.values());
|
|
87
|
+
for (let rank = 0; rank <= maxRank; rank++) {
|
|
88
|
+
const rankTasks = dag.tasks.filter((t) => ranks.get(t.id) === rank && t.status === 'PENDING');
|
|
89
|
+
if (rankTasks.length === 0)
|
|
90
|
+
continue;
|
|
91
|
+
console.log(chalk.yellow(`\n 📦 Rank ${rank}: ${rankTasks.length} task(s) in parallel`));
|
|
92
|
+
// Skip tasks whose dependencies failed/skipped — cascading skip.
|
|
93
|
+
const skippable = rankTasks.filter((t) => t.depends_on.some((dep) => {
|
|
94
|
+
const parent = dag.tasks.find((d) => d.id === dep);
|
|
95
|
+
return parent?.status === 'FAILED' || parent?.status === 'SKIPPED';
|
|
96
|
+
}));
|
|
97
|
+
for (const t of skippable) {
|
|
98
|
+
t.status = 'SKIPPED';
|
|
99
|
+
console.log(chalk.gray(` ⏭️ Skipping ${t.id} (dependency failed)`));
|
|
100
|
+
}
|
|
101
|
+
const executable = rankTasks.filter((t) => t.status === 'PENDING');
|
|
102
|
+
if (executable.length === 0) {
|
|
103
|
+
await renderCanvas(dag, canvasPath);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
await Promise.all(executable.map((task) => executeOne(task, dag, adapter, models, limits, externalSignal, canvasPath)));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function executeOne(task, dag, adapter, models, limits, externalSignal, canvasPath) {
|
|
110
|
+
const start = Date.now();
|
|
111
|
+
task.status = 'RUNNING';
|
|
112
|
+
task.error = undefined;
|
|
113
|
+
await renderCanvas(dag, canvasPath);
|
|
114
|
+
console.log(chalk.cyan(` 🔄 ${task.id}: ${task.title}`));
|
|
115
|
+
const parents = task.depends_on
|
|
116
|
+
.map((id) => dag.tasks.find((t) => t.id === id))
|
|
117
|
+
.filter((t) => Boolean(t));
|
|
118
|
+
const prompt = composePrompt({
|
|
119
|
+
task,
|
|
120
|
+
parents,
|
|
121
|
+
parentContextChars: limits.parent_context_chars,
|
|
122
|
+
});
|
|
123
|
+
try {
|
|
124
|
+
const { output, tokens } = await withTimeout(({ signal }) => adapter.call({
|
|
125
|
+
prompt,
|
|
126
|
+
complexity: task.complexity,
|
|
127
|
+
models,
|
|
128
|
+
signal,
|
|
129
|
+
}), { timeoutSeconds: limits.timeout_seconds, externalSignal });
|
|
130
|
+
task.output = capOutput(output, limits.task_output_chars);
|
|
131
|
+
task.tokens = tokens;
|
|
132
|
+
task.duration = Date.now() - start;
|
|
133
|
+
task.status = 'DONE';
|
|
134
|
+
console.log(chalk.green(` ✅ ${task.id} done (${task.duration}ms${tokens ? `, ${tokens} tokens` : ''})`));
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
task.duration = Date.now() - start;
|
|
138
|
+
task.status = 'FAILED';
|
|
139
|
+
task.error = formatError(err);
|
|
140
|
+
if (err instanceof MissingApiKeyError) {
|
|
141
|
+
console.log(chalk.red(` ❌ ${task.id} failed: ${err.message}`));
|
|
142
|
+
}
|
|
143
|
+
else if (err instanceof TaskTimeoutError) {
|
|
144
|
+
console.log(chalk.red(` ❌ ${task.id} timed out after ${err.timeoutSeconds}s`));
|
|
145
|
+
}
|
|
146
|
+
else if (err instanceof TaskAbortedError) {
|
|
147
|
+
console.log(chalk.yellow(` ⚠ ${task.id} aborted: ${err.message}`));
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
console.log(chalk.red(` ❌ ${task.id} failed: ${task.error}`));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
await renderCanvas(dag, canvasPath);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
158
|
+
// Canvas + helpers
|
|
159
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
160
|
+
const STATUS_ICON = {
|
|
161
|
+
PENDING: '⏳',
|
|
162
|
+
RUNNING: '🔄',
|
|
163
|
+
DONE: '✅',
|
|
164
|
+
FAILED: '❌',
|
|
165
|
+
SKIPPED: '⏭️',
|
|
166
|
+
};
|
|
39
167
|
async function renderCanvas(dag, canvasPath) {
|
|
40
|
-
const statusIcon = {
|
|
41
|
-
PENDING: '⏳',
|
|
42
|
-
RUNNING: '🔄',
|
|
43
|
-
DONE: '✅',
|
|
44
|
-
FAILED: '❌',
|
|
45
|
-
SKIPPED: '⏭️',
|
|
46
|
-
};
|
|
47
168
|
const lines = [
|
|
48
|
-
`# DARE DAG Execution
|
|
169
|
+
`# DARE DAG Execution — ${dag.title}`,
|
|
49
170
|
``,
|
|
50
171
|
`**Updated:** ${new Date().toISOString()}`,
|
|
51
172
|
``,
|
|
@@ -55,106 +176,66 @@ async function renderCanvas(dag, canvasPath) {
|
|
|
55
176
|
`|----|-------|--------|----------|--------|`,
|
|
56
177
|
];
|
|
57
178
|
for (const task of dag.tasks) {
|
|
58
|
-
const
|
|
179
|
+
const status = task.status ?? 'PENDING';
|
|
180
|
+
const icon = STATUS_ICON[status];
|
|
59
181
|
const duration = task.duration ? `${task.duration}ms` : '-';
|
|
60
182
|
const tokens = task.tokens ? `${task.tokens}` : '-';
|
|
61
|
-
lines.push(`| ${task.id} | ${task.title} | ${icon} ${
|
|
183
|
+
lines.push(`| ${task.id} | ${task.title} | ${icon} ${status} | ${duration} | ${tokens} |`);
|
|
62
184
|
}
|
|
63
|
-
const done = dag.tasks.filter((t) => t.status === 'DONE').length;
|
|
64
185
|
const total = dag.tasks.length;
|
|
65
|
-
const
|
|
186
|
+
const done = dag.tasks.filter((t) => t.status === 'DONE').length;
|
|
187
|
+
const pct = total === 0 ? 0 : Math.round((done / total) * 100);
|
|
188
|
+
const filled = Math.round(pct / 5);
|
|
66
189
|
lines.push('');
|
|
67
190
|
lines.push(`## Progress: ${done}/${total} tasks (${pct}%)`);
|
|
68
191
|
lines.push('');
|
|
69
|
-
lines.push(`${'█'.repeat(
|
|
70
|
-
await fs.ensureDir(
|
|
192
|
+
lines.push(`${'█'.repeat(filled)}${'░'.repeat(20 - filled)} ${pct}%`);
|
|
193
|
+
await fs.ensureDir(path.dirname(canvasPath));
|
|
71
194
|
await fs.writeFile(canvasPath, lines.join('\n'));
|
|
72
195
|
}
|
|
73
|
-
|
|
74
|
-
* Execute a single task (placeholder - AI agent executes in real use)
|
|
75
|
-
*/
|
|
76
|
-
async function executeTask(task, context, runner) {
|
|
77
|
-
// In real usage, this calls the AI agent (Cursor/Antigravity) with the task prompt
|
|
78
|
-
// For now, we simulate execution
|
|
79
|
-
const delay = task.complexity === 'HIGH' ? 2000 : task.complexity === 'MED' ? 1000 : 500;
|
|
80
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
81
|
-
return {
|
|
82
|
-
output: `Task ${task.id} completed by ${runner}`,
|
|
83
|
-
tokens: Math.floor(Math.random() * 2000) + 500,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Main DAG runner - executes tasks in parallel based on dependency ranks
|
|
88
|
-
*/
|
|
89
|
-
export async function runDag(dag, options) {
|
|
90
|
-
const { parallel, runner, canvasPath } = options;
|
|
91
|
-
// Initialize all tasks as PENDING
|
|
92
|
-
dag.tasks.forEach((t) => (t.status = 'PENDING'));
|
|
93
|
-
await renderCanvas(dag, canvasPath);
|
|
94
|
-
if (!parallel) {
|
|
95
|
-
// Sequential execution
|
|
96
|
-
for (const task of dag.tasks) {
|
|
97
|
-
task.status = 'RUNNING';
|
|
98
|
-
await renderCanvas(dag, canvasPath);
|
|
99
|
-
console.log(chalk.cyan(` 🔄 Running ${task.id}: ${task.title}`));
|
|
100
|
-
const start = Date.now();
|
|
101
|
-
const result = await executeTask(task, '', runner);
|
|
102
|
-
task.status = 'DONE';
|
|
103
|
-
task.output = result.output;
|
|
104
|
-
task.tokens = result.tokens;
|
|
105
|
-
task.duration = Date.now() - start;
|
|
106
|
-
console.log(chalk.green(` ✅ ${task.id} done (${task.duration}ms, ${task.tokens} tokens)`));
|
|
107
|
-
await renderCanvas(dag, canvasPath);
|
|
108
|
-
}
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
// Parallel execution using ranks
|
|
112
|
-
const ranks = computeRanks(dag.tasks);
|
|
113
|
-
const maxRank = Math.max(...ranks.values());
|
|
114
|
-
for (let rank = 0; rank <= maxRank; rank++) {
|
|
115
|
-
const rankTasks = dag.tasks.filter((t) => ranks.get(t.id) === rank && t.status === 'PENDING');
|
|
116
|
-
if (rankTasks.length === 0)
|
|
117
|
-
continue;
|
|
118
|
-
console.log(chalk.yellow(`\n 📦 Rank ${rank}: Executing ${rankTasks.length} task(s) in parallel`));
|
|
119
|
-
// Check if any dependency failed
|
|
120
|
-
const failedDeps = rankTasks.filter((t) => t.depends_on.some((dep) => dag.tasks.find((d) => d.id === dep)?.status === 'FAILED'));
|
|
121
|
-
failedDeps.forEach((t) => {
|
|
122
|
-
t.status = 'SKIPPED';
|
|
123
|
-
console.log(chalk.gray(` ⏭️ Skipping ${t.id} (dependency failed)`));
|
|
124
|
-
});
|
|
125
|
-
const executableTasks = rankTasks.filter((t) => t.status === 'PENDING');
|
|
126
|
-
// Build context from parent outputs
|
|
127
|
-
const parentOutputs = executableTasks.map((t) => t.depends_on
|
|
128
|
-
.map((dep) => dag.tasks.find((d) => d.id === dep)?.output || '')
|
|
129
|
-
.filter(Boolean)
|
|
130
|
-
.join('\n'));
|
|
131
|
-
// Mark all as RUNNING
|
|
132
|
-
executableTasks.forEach((t) => (t.status = 'RUNNING'));
|
|
133
|
-
await renderCanvas(dag, canvasPath);
|
|
134
|
-
// Execute in parallel
|
|
135
|
-
await Promise.all(executableTasks.map(async (task, i) => {
|
|
136
|
-
const start = Date.now();
|
|
137
|
-
console.log(chalk.cyan(` 🔄 ${task.id}: ${task.title}`));
|
|
138
|
-
try {
|
|
139
|
-
const result = await executeTask(task, parentOutputs[i], runner);
|
|
140
|
-
task.status = 'DONE';
|
|
141
|
-
task.output = result.output;
|
|
142
|
-
task.tokens = result.tokens;
|
|
143
|
-
task.duration = Date.now() - start;
|
|
144
|
-
console.log(chalk.green(` ✅ ${task.id} done (${task.duration}ms, ${task.tokens} tokens)`));
|
|
145
|
-
}
|
|
146
|
-
catch (err) {
|
|
147
|
-
task.status = 'FAILED';
|
|
148
|
-
task.duration = Date.now() - start;
|
|
149
|
-
console.log(chalk.red(` ❌ ${task.id} failed: ${err}`));
|
|
150
|
-
}
|
|
151
|
-
await renderCanvas(dag, canvasPath);
|
|
152
|
-
}));
|
|
153
|
-
}
|
|
196
|
+
function printSummary(dag, canvasPath) {
|
|
154
197
|
const done = dag.tasks.filter((t) => t.status === 'DONE').length;
|
|
155
198
|
const failed = dag.tasks.filter((t) => t.status === 'FAILED').length;
|
|
156
199
|
const skipped = dag.tasks.filter((t) => t.status === 'SKIPPED').length;
|
|
157
200
|
console.log(chalk.bold(`\n 📊 Summary: ${done} done, ${failed} failed, ${skipped} skipped`));
|
|
158
201
|
console.log(chalk.cyan(` 📄 Canvas: ${canvasPath}\n`));
|
|
159
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* Compute execution ranks for tasks based on dependencies.
|
|
205
|
+
* Tasks in the same rank can run in parallel (Kahn's algorithm).
|
|
206
|
+
*/
|
|
207
|
+
export function computeRanks(tasks) {
|
|
208
|
+
const ranks = new Map();
|
|
209
|
+
const taskMap = new Map(tasks.map((t) => [t.id, t]));
|
|
210
|
+
function getRank(taskId, visited = new Set()) {
|
|
211
|
+
if (ranks.has(taskId))
|
|
212
|
+
return ranks.get(taskId);
|
|
213
|
+
if (visited.has(taskId)) {
|
|
214
|
+
throw new Error(`Circular dependency detected: ${taskId}`);
|
|
215
|
+
}
|
|
216
|
+
visited.add(taskId);
|
|
217
|
+
const task = taskMap.get(taskId);
|
|
218
|
+
if (!task)
|
|
219
|
+
throw new Error(`Task not found: ${taskId}`);
|
|
220
|
+
if (task.depends_on.length === 0) {
|
|
221
|
+
ranks.set(taskId, 0);
|
|
222
|
+
return 0;
|
|
223
|
+
}
|
|
224
|
+
const maxDepRank = Math.max(...task.depends_on.map((dep) => getRank(dep, new Set(visited))));
|
|
225
|
+
const rank = maxDepRank + 1;
|
|
226
|
+
ranks.set(taskId, rank);
|
|
227
|
+
return rank;
|
|
228
|
+
}
|
|
229
|
+
for (const t of tasks)
|
|
230
|
+
getRank(t.id);
|
|
231
|
+
return ranks;
|
|
232
|
+
}
|
|
233
|
+
function isKnownRunner(runner) {
|
|
234
|
+
return runner === 'cursor' || runner === 'claude' || runner === 'antigravity';
|
|
235
|
+
}
|
|
236
|
+
function formatError(err) {
|
|
237
|
+
if (err instanceof Error)
|
|
238
|
+
return err.message;
|
|
239
|
+
return String(err);
|
|
240
|
+
}
|
|
160
241
|
//# sourceMappingURL=run_dag.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run_dag.js","sourceRoot":"","sources":["../../src/dag-runner/run_dag.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run_dag.js","sourceRoot":"","sources":["../../src/dag-runner/run_dag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cap a task's captured output at `task_output_chars` chars (per the
|
|
3
|
+
* canonical `dare-dag.yaml` `limits` block).
|
|
4
|
+
*
|
|
5
|
+
* Capping applies to the in-memory `output` that gets:
|
|
6
|
+
* 1. stitched as upstream context for downstream tasks
|
|
7
|
+
* 2. shown on the canvas / logs
|
|
8
|
+
*
|
|
9
|
+
* The full output (if larger) is returned as-is to the caller so it can
|
|
10
|
+
* decide whether to persist the original elsewhere — capping is for the
|
|
11
|
+
* runner's bookkeeping, not for the underlying API call.
|
|
12
|
+
*/
|
|
13
|
+
export declare function capOutput(text: string, maxChars: number): string;
|
|
14
|
+
//# sourceMappingURL=cap-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cap-output.d.ts","sourceRoot":"","sources":["../../../src/dag-runner/utils/cap-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMhE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cap a task's captured output at `task_output_chars` chars (per the
|
|
3
|
+
* canonical `dare-dag.yaml` `limits` block).
|
|
4
|
+
*
|
|
5
|
+
* Capping applies to the in-memory `output` that gets:
|
|
6
|
+
* 1. stitched as upstream context for downstream tasks
|
|
7
|
+
* 2. shown on the canvas / logs
|
|
8
|
+
*
|
|
9
|
+
* The full output (if larger) is returned as-is to the caller so it can
|
|
10
|
+
* decide whether to persist the original elsewhere — capping is for the
|
|
11
|
+
* runner's bookkeeping, not for the underlying API call.
|
|
12
|
+
*/
|
|
13
|
+
const TRUNCATION_NOTICE = '…[truncated by DARE — output_cap reached]';
|
|
14
|
+
export function capOutput(text, maxChars) {
|
|
15
|
+
if (maxChars <= 0)
|
|
16
|
+
return '';
|
|
17
|
+
if (text.length <= maxChars)
|
|
18
|
+
return text;
|
|
19
|
+
const room = Math.max(0, maxChars - TRUNCATION_NOTICE.length);
|
|
20
|
+
return text.slice(0, room) + TRUNCATION_NOTICE;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=cap-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cap-output.js","sourceRoot":"","sources":["../../../src/dag-runner/utils/cap-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,iBAAiB,GAAG,2CAA2C,CAAC;AAEtE,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,QAAgB;IACtD,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,iBAAiB,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the upstream context block injected into a child task's prompt.
|
|
3
|
+
*
|
|
4
|
+
* Each parent contributes a snippet capped at `parent_context_chars` chars
|
|
5
|
+
* (per the canonical `dare-dag.yaml` `limits` block). The snippet is the tail
|
|
6
|
+
* of the parent's output — that's where the most decision-relevant content
|
|
7
|
+
* tends to sit for AI agents (final answer, file paths, conclusions).
|
|
8
|
+
*
|
|
9
|
+
* The output is deterministic and self-describing so the child can locate
|
|
10
|
+
* each parent's contribution.
|
|
11
|
+
*/
|
|
12
|
+
import type { DagTask } from '../run_dag.js';
|
|
13
|
+
export interface StitchContextInput {
|
|
14
|
+
task: DagTask;
|
|
15
|
+
parents: DagTask[];
|
|
16
|
+
parentContextChars: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function stitchParentContext({ parents, parentContextChars, }: StitchContextInput): string;
|
|
19
|
+
/**
|
|
20
|
+
* Compose the final prompt sent to a runner: the task's `subtask_prompt`
|
|
21
|
+
* concatenated with the upstream context block (when present).
|
|
22
|
+
*/
|
|
23
|
+
export declare function composePrompt(input: StitchContextInput): string;
|
|
24
|
+
//# sourceMappingURL=stitch-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stitch-context.d.ts","sourceRoot":"","sources":["../../../src/dag-runner/utils/stitch-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAID,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,kBAAkB,GACnB,EAAE,kBAAkB,GAAG,MAAM,CAgB7B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAI/D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const HEADER = '## Upstream context';
|
|
2
|
+
export function stitchParentContext({ parents, parentContextChars, }) {
|
|
3
|
+
if (parents.length === 0)
|
|
4
|
+
return '';
|
|
5
|
+
if (parentContextChars <= 0)
|
|
6
|
+
return '';
|
|
7
|
+
const blocks = [HEADER, ''];
|
|
8
|
+
for (const parent of parents) {
|
|
9
|
+
const snippet = takeTail(parent.output ?? '', parentContextChars);
|
|
10
|
+
blocks.push(`### From parent: ${parent.id} — ${parent.title}`);
|
|
11
|
+
if (snippet.trim().length === 0) {
|
|
12
|
+
blocks.push('_(no captured output)_');
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
blocks.push(snippet);
|
|
16
|
+
}
|
|
17
|
+
blocks.push('');
|
|
18
|
+
}
|
|
19
|
+
return blocks.join('\n');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Compose the final prompt sent to a runner: the task's `subtask_prompt`
|
|
23
|
+
* concatenated with the upstream context block (when present).
|
|
24
|
+
*/
|
|
25
|
+
export function composePrompt(input) {
|
|
26
|
+
const ctx = stitchParentContext(input);
|
|
27
|
+
if (ctx.length === 0)
|
|
28
|
+
return input.task.subtask_prompt;
|
|
29
|
+
return `${input.task.subtask_prompt.trim()}\n\n${ctx}`.trimEnd() + '\n';
|
|
30
|
+
}
|
|
31
|
+
function takeTail(text, maxChars) {
|
|
32
|
+
if (text.length <= maxChars)
|
|
33
|
+
return text;
|
|
34
|
+
return `…${text.slice(text.length - maxChars + 1)}`;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=stitch-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stitch-context.js","sourceRoot":"","sources":["../../../src/dag-runner/utils/stitch-context.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,GAAG,qBAAqB,CAAC;AAErC,MAAM,UAAU,mBAAmB,CAAC,EAClC,OAAO,EACP,kBAAkB,GACC;IACnB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,IAAI,kBAAkB,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;IACvD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;AAC1E,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,QAAgB;IAC9C,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run an async operation with a hard timeout, backed by `AbortController`.
|
|
3
|
+
*
|
|
4
|
+
* The operation receives the controller's `signal` — adapters MUST forward
|
|
5
|
+
* it to their underlying SDK call (Anthropic, Cursor, Google) so an external
|
|
6
|
+
* abort is honored. If the SDK doesn't support cancellation, we still time
|
|
7
|
+
* out at the JS level via the racing promise.
|
|
8
|
+
*
|
|
9
|
+
* Also accepts an optional `externalSignal` so a SIGINT/SIGTERM listener can
|
|
10
|
+
* cancel everything in flight.
|
|
11
|
+
*/
|
|
12
|
+
export interface WithTimeoutOptions {
|
|
13
|
+
timeoutSeconds: number;
|
|
14
|
+
externalSignal?: AbortSignal;
|
|
15
|
+
}
|
|
16
|
+
export interface TimeoutContext {
|
|
17
|
+
signal: AbortSignal;
|
|
18
|
+
}
|
|
19
|
+
export declare class TaskTimeoutError extends Error {
|
|
20
|
+
readonly timeoutSeconds: number;
|
|
21
|
+
constructor(timeoutSeconds: number);
|
|
22
|
+
}
|
|
23
|
+
export declare class TaskAbortedError extends Error {
|
|
24
|
+
constructor(reason?: string);
|
|
25
|
+
}
|
|
26
|
+
export declare function withTimeout<T>(op: (ctx: TimeoutContext) => Promise<T>, { timeoutSeconds, externalSignal }: WithTimeoutOptions): Promise<T>;
|
|
27
|
+
//# sourceMappingURL=timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../../src/dag-runner/utils/timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,WAAW,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;aACb,cAAc,EAAE,MAAM;gBAAtB,cAAc,EAAE,MAAM;CAInD;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,MAAM,SAAY;CAI/B;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,EAAE,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,EACvC,EAAE,cAAc,EAAE,cAAc,EAAE,EAAE,kBAAkB,GACrD,OAAO,CAAC,CAAC,CAAC,CA4BZ"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run an async operation with a hard timeout, backed by `AbortController`.
|
|
3
|
+
*
|
|
4
|
+
* The operation receives the controller's `signal` — adapters MUST forward
|
|
5
|
+
* it to their underlying SDK call (Anthropic, Cursor, Google) so an external
|
|
6
|
+
* abort is honored. If the SDK doesn't support cancellation, we still time
|
|
7
|
+
* out at the JS level via the racing promise.
|
|
8
|
+
*
|
|
9
|
+
* Also accepts an optional `externalSignal` so a SIGINT/SIGTERM listener can
|
|
10
|
+
* cancel everything in flight.
|
|
11
|
+
*/
|
|
12
|
+
export class TaskTimeoutError extends Error {
|
|
13
|
+
constructor(timeoutSeconds) {
|
|
14
|
+
super(`Task exceeded ${timeoutSeconds}s timeout`);
|
|
15
|
+
this.timeoutSeconds = timeoutSeconds;
|
|
16
|
+
this.name = 'TaskTimeoutError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class TaskAbortedError extends Error {
|
|
20
|
+
constructor(reason = 'aborted') {
|
|
21
|
+
super(`Task aborted: ${reason}`);
|
|
22
|
+
this.name = 'TaskAbortedError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function withTimeout(op, { timeoutSeconds, externalSignal }) {
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
// Forward external aborts (e.g. SIGINT handler) to our controller.
|
|
28
|
+
const onExternal = () => controller.abort('external');
|
|
29
|
+
if (externalSignal) {
|
|
30
|
+
if (externalSignal.aborted)
|
|
31
|
+
controller.abort('external');
|
|
32
|
+
else
|
|
33
|
+
externalSignal.addEventListener('abort', onExternal, { once: true });
|
|
34
|
+
}
|
|
35
|
+
const timer = setTimeout(() => controller.abort('timeout'), timeoutSeconds * 1000);
|
|
36
|
+
try {
|
|
37
|
+
return await Promise.race([
|
|
38
|
+
op({ signal: controller.signal }),
|
|
39
|
+
new Promise((_, reject) => {
|
|
40
|
+
controller.signal.addEventListener('abort', () => {
|
|
41
|
+
const reason = controller.signal.reason ?? 'aborted';
|
|
42
|
+
reject(reason === 'timeout'
|
|
43
|
+
? new TaskTimeoutError(timeoutSeconds)
|
|
44
|
+
: new TaskAbortedError(String(reason)));
|
|
45
|
+
}, { once: true });
|
|
46
|
+
}),
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
if (externalSignal)
|
|
52
|
+
externalSignal.removeEventListener('abort', onExternal);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../../src/dag-runner/utils/timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAA4B,cAAsB;QAChD,KAAK,CAAC,iBAAiB,cAAc,WAAW,CAAC,CAAC;QADxB,mBAAc,GAAd,cAAc,CAAQ;QAEhD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,MAAM,GAAG,SAAS;QAC5B,KAAK,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAuC,EACvC,EAAE,cAAc,EAAE,cAAc,EAAsB;IAEtD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IAEzC,mEAAmE;IACnE,MAAM,UAAU,GAAG,GAAS,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5D,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,cAAc,CAAC,OAAO;YAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;;YACpD,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;IAEnF,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC3B,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBAC/C,MAAM,MAAM,GAAI,UAAU,CAAC,MAAM,CAAC,MAA6B,IAAI,SAAS,CAAC;oBAC7E,MAAM,CAAC,MAAM,KAAK,SAAS;wBACzB,CAAC,CAAC,IAAI,gBAAgB,CAAC,cAAc,CAAC;wBACtC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC5C,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACrB,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,cAAc;YAAE,cAAc,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,9 +9,11 @@ export { initCommand } from './commands/init.js';
|
|
|
9
9
|
export { designCommand } from './commands/design.js';
|
|
10
10
|
export { blueprintCommand } from './commands/blueprint.js';
|
|
11
11
|
export { executeCommand } from './commands/execute.js';
|
|
12
|
-
export { runDag } from './dag-runner/run_dag.js';
|
|
13
|
-
export type { Dag, DagTask, RunDagOptions } from './dag-runner/run_dag.js';
|
|
12
|
+
export { runDag, computeRanks, DEFAULT_DAG_LIMITS } from './dag-runner/run_dag.js';
|
|
13
|
+
export type { Dag, DagTask, DagLimits, DagModelMap, DagModels, RunDagOptions, RunnerName, Complexity, TaskStatus as DagTaskStatus, } from './dag-runner/run_dag.js';
|
|
14
14
|
export { convertYamlToDag, convertDagToYaml } from './utils/dag-converter.js';
|
|
15
|
+
export { getAdapter, MissingApiKeyError, AdapterCallError, } from './dag-runner/adapters/index.js';
|
|
16
|
+
export type { RunnerAdapter } from './dag-runner/adapters/index.js';
|
|
15
17
|
export { generateProjectStructure } from './utils/project-generator.js';
|
|
16
18
|
export type { ProjectConfig } from './utils/project-generator.js';
|
|
17
19
|
export { GraphRAG } from './graphrag/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACnF,YAAY,EACV,GAAG,EACH,OAAO,EACP,SAAS,EACT,WAAW,EACX,SAAS,EACT,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,IAAI,aAAa,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAGpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,YAAY,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
|