@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
|
@@ -1,28 +1,48 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* DARE
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* DARE DAG Task Runner — orchestration only.
|
|
3
|
+
*
|
|
4
|
+
* The DAG runner is **not** an executor. The agent inside the user's IDE
|
|
5
|
+
* (Cursor / Antigravity / Claude Code) executes each task using its native
|
|
6
|
+
* runtime — the IDE is already authenticated and the user already pays for
|
|
7
|
+
* inference there. This CLI is responsible for:
|
|
8
|
+
*
|
|
9
|
+
* 1. ordering tasks (Kahn's algorithm) and surfacing what to execute next
|
|
10
|
+
* 2. computing the prompt the agent should run, with parent-output context
|
|
11
|
+
* 3. recording status transitions (PENDING → RUNNING → DONE / FAILED / SKIPPED)
|
|
12
|
+
* 4. cascading-skip when a parent fails
|
|
13
|
+
* 5. rendering the live canvas at DARE/.canvas.md
|
|
14
|
+
* 6. (optionally) ingesting finished tasks into the knowledge graph
|
|
15
|
+
*
|
|
16
|
+
* The actual task execution loop lives outside this file: see `dare execute`
|
|
17
|
+
* (`--next` / `--complete` / `--fail`).
|
|
5
18
|
*/
|
|
6
19
|
import fs from 'fs-extra';
|
|
7
|
-
import
|
|
8
|
-
|
|
20
|
+
import path from 'path';
|
|
21
|
+
import { capOutput } from './utils/cap-output.js';
|
|
22
|
+
import { composePrompt } from './utils/stitch-context.js';
|
|
23
|
+
import { ingestTask } from './graph-ingest.js';
|
|
9
24
|
export const DEFAULT_DAG_LIMITS = {
|
|
10
25
|
parent_context_chars: 2000,
|
|
11
26
|
task_output_chars: 4000,
|
|
12
27
|
timeout_seconds: 600,
|
|
13
28
|
};
|
|
29
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
30
|
+
// Topological ranking
|
|
31
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
14
32
|
/**
|
|
15
|
-
* Compute execution ranks for tasks based on dependencies.
|
|
16
|
-
*
|
|
33
|
+
* Compute execution ranks for tasks based on dependencies. Tasks in the same
|
|
34
|
+
* rank can run in parallel (logical parallelism: the IDE agent decides
|
|
35
|
+
* whether to literally fan them out or run them back-to-back).
|
|
17
36
|
*/
|
|
18
|
-
function computeRanks(tasks) {
|
|
37
|
+
export function computeRanks(tasks) {
|
|
19
38
|
const ranks = new Map();
|
|
20
39
|
const taskMap = new Map(tasks.map((t) => [t.id, t]));
|
|
21
40
|
function getRank(taskId, visited = new Set()) {
|
|
22
41
|
if (ranks.has(taskId))
|
|
23
42
|
return ranks.get(taskId);
|
|
24
|
-
if (visited.has(taskId))
|
|
43
|
+
if (visited.has(taskId)) {
|
|
25
44
|
throw new Error(`Circular dependency detected: ${taskId}`);
|
|
45
|
+
}
|
|
26
46
|
visited.add(taskId);
|
|
27
47
|
const task = taskMap.get(taskId);
|
|
28
48
|
if (!task)
|
|
@@ -36,22 +56,124 @@ function computeRanks(tasks) {
|
|
|
36
56
|
ranks.set(taskId, rank);
|
|
37
57
|
return rank;
|
|
38
58
|
}
|
|
39
|
-
|
|
59
|
+
for (const t of tasks)
|
|
60
|
+
getRank(t.id);
|
|
40
61
|
return ranks;
|
|
41
62
|
}
|
|
63
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
64
|
+
// Status queries
|
|
65
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
66
|
+
/**
|
|
67
|
+
* Return the next batch of tasks the agent should execute now: PENDING tasks
|
|
68
|
+
* whose every parent is DONE. These can be executed in parallel by the agent.
|
|
69
|
+
*
|
|
70
|
+
* If `currentRankOnly` is true (default), restrict to the lowest rank that
|
|
71
|
+
* still has executable tasks — gives a clean "rank-by-rank" cadence.
|
|
72
|
+
*/
|
|
73
|
+
export function nextExecutableTasks(dag, currentRankOnly = true) {
|
|
74
|
+
const byId = new Map(dag.tasks.map((t) => [t.id, t]));
|
|
75
|
+
const ready = dag.tasks.filter((t) => {
|
|
76
|
+
if (t.status === 'DONE' || t.status === 'SKIPPED')
|
|
77
|
+
return false;
|
|
78
|
+
if (t.status === 'RUNNING')
|
|
79
|
+
return false; // already picked up
|
|
80
|
+
return t.depends_on.every((d) => byId.get(d)?.status === 'DONE');
|
|
81
|
+
});
|
|
82
|
+
if (!currentRankOnly || ready.length === 0)
|
|
83
|
+
return ready;
|
|
84
|
+
const ranks = computeRanks(dag.tasks);
|
|
85
|
+
const minRank = Math.min(...ready.map((t) => ranks.get(t.id) ?? 0));
|
|
86
|
+
return ready.filter((t) => (ranks.get(t.id) ?? 0) === minRank);
|
|
87
|
+
}
|
|
42
88
|
/**
|
|
43
|
-
*
|
|
89
|
+
* Cascade: any PENDING task whose dependency is FAILED/SKIPPED becomes SKIPPED.
|
|
90
|
+
* Returns the list of newly-skipped tasks (caller can ingest them).
|
|
44
91
|
*/
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
92
|
+
export function applyCascadingSkip(dag) {
|
|
93
|
+
const byId = new Map(dag.tasks.map((t) => [t.id, t]));
|
|
94
|
+
const newlySkipped = [];
|
|
95
|
+
let changed = true;
|
|
96
|
+
while (changed) {
|
|
97
|
+
changed = false;
|
|
98
|
+
for (const task of dag.tasks) {
|
|
99
|
+
if (task.status !== 'PENDING')
|
|
100
|
+
continue;
|
|
101
|
+
const blocked = task.depends_on.some((d) => {
|
|
102
|
+
const parent = byId.get(d);
|
|
103
|
+
return parent?.status === 'FAILED' || parent?.status === 'SKIPPED';
|
|
104
|
+
});
|
|
105
|
+
if (blocked) {
|
|
106
|
+
task.status = 'SKIPPED';
|
|
107
|
+
newlySkipped.push(task);
|
|
108
|
+
changed = true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return newlySkipped;
|
|
113
|
+
}
|
|
114
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
115
|
+
// Prompt composition (what the agent should literally execute)
|
|
116
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
117
|
+
/**
|
|
118
|
+
* Compose the prompt for a given task: the task's `subtask_prompt` plus an
|
|
119
|
+
* "Upstream context" block with capped snippets of each parent's output.
|
|
120
|
+
*/
|
|
121
|
+
export function buildTaskPrompt(dag, task) {
|
|
122
|
+
const limits = dag.limits ?? DEFAULT_DAG_LIMITS;
|
|
123
|
+
const parents = task.depends_on
|
|
124
|
+
.map((id) => dag.tasks.find((t) => t.id === id))
|
|
125
|
+
.filter((t) => Boolean(t));
|
|
126
|
+
return composePrompt({
|
|
127
|
+
task,
|
|
128
|
+
parents,
|
|
129
|
+
parentContextChars: limits.parent_context_chars,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
export function markRunning(dag, taskId) {
|
|
133
|
+
const task = requireTask(dag, taskId);
|
|
134
|
+
task.status = 'RUNNING';
|
|
135
|
+
task.error = undefined;
|
|
136
|
+
return task;
|
|
137
|
+
}
|
|
138
|
+
export function markDone(dag, taskId, opts = {}) {
|
|
139
|
+
const task = requireTask(dag, taskId);
|
|
140
|
+
const limits = dag.limits ?? DEFAULT_DAG_LIMITS;
|
|
141
|
+
task.status = 'DONE';
|
|
142
|
+
task.output = opts.output ? capOutput(opts.output, limits.task_output_chars) : task.output;
|
|
143
|
+
task.tokens = opts.tokens ?? task.tokens;
|
|
144
|
+
task.duration = opts.durationMs ?? task.duration;
|
|
145
|
+
task.error = undefined;
|
|
146
|
+
if (opts.graph)
|
|
147
|
+
safeIngest(opts.graph, task, dag);
|
|
148
|
+
return task;
|
|
149
|
+
}
|
|
150
|
+
export function markFailed(dag, taskId, opts = {}) {
|
|
151
|
+
const task = requireTask(dag, taskId);
|
|
152
|
+
task.status = 'FAILED';
|
|
153
|
+
task.error = opts.error ?? task.error ?? 'unknown';
|
|
154
|
+
task.duration = opts.durationMs ?? task.duration;
|
|
155
|
+
if (opts.graph)
|
|
156
|
+
safeIngest(opts.graph, task, dag);
|
|
157
|
+
// Cascade-skip downstream tasks
|
|
158
|
+
const skipped = applyCascadingSkip(dag);
|
|
159
|
+
if (opts.graph)
|
|
160
|
+
for (const t of skipped)
|
|
161
|
+
safeIngest(opts.graph, t, dag);
|
|
162
|
+
return task;
|
|
163
|
+
}
|
|
164
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
165
|
+
// Canvas rendering
|
|
166
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
167
|
+
const STATUS_ICON = {
|
|
168
|
+
PENDING: '⏳',
|
|
169
|
+
RUNNING: '🔄',
|
|
170
|
+
DONE: '✅',
|
|
171
|
+
FAILED: '❌',
|
|
172
|
+
SKIPPED: '⏭️',
|
|
173
|
+
};
|
|
174
|
+
export async function renderCanvas(dag, canvasPath) {
|
|
53
175
|
const lines = [
|
|
54
|
-
`# DARE DAG Execution
|
|
176
|
+
`# DARE DAG Execution — ${dag.title}`,
|
|
55
177
|
``,
|
|
56
178
|
`**Updated:** ${new Date().toISOString()}`,
|
|
57
179
|
``,
|
|
@@ -61,106 +183,38 @@ async function renderCanvas(dag, canvasPath) {
|
|
|
61
183
|
`|----|-------|--------|----------|--------|`,
|
|
62
184
|
];
|
|
63
185
|
for (const task of dag.tasks) {
|
|
64
|
-
const
|
|
186
|
+
const status = task.status ?? 'PENDING';
|
|
187
|
+
const icon = STATUS_ICON[status];
|
|
65
188
|
const duration = task.duration ? `${task.duration}ms` : '-';
|
|
66
189
|
const tokens = task.tokens ? `${task.tokens}` : '-';
|
|
67
|
-
lines.push(`| ${task.id} | ${task.title} | ${icon} ${
|
|
190
|
+
lines.push(`| ${task.id} | ${task.title} | ${icon} ${status} | ${duration} | ${tokens} |`);
|
|
68
191
|
}
|
|
69
|
-
const done = dag.tasks.filter((t) => t.status === 'DONE').length;
|
|
70
192
|
const total = dag.tasks.length;
|
|
71
|
-
const
|
|
193
|
+
const done = dag.tasks.filter((t) => t.status === 'DONE').length;
|
|
194
|
+
const pct = total === 0 ? 0 : Math.round((done / total) * 100);
|
|
195
|
+
const filled = Math.round(pct / 5);
|
|
72
196
|
lines.push('');
|
|
73
197
|
lines.push(`## Progress: ${done}/${total} tasks (${pct}%)`);
|
|
74
198
|
lines.push('');
|
|
75
|
-
lines.push(`${'█'.repeat(
|
|
76
|
-
await fs.ensureDir(
|
|
199
|
+
lines.push(`${'█'.repeat(filled)}${'░'.repeat(20 - filled)} ${pct}%`);
|
|
200
|
+
await fs.ensureDir(path.dirname(canvasPath));
|
|
77
201
|
await fs.writeFile(canvasPath, lines.join('\n'));
|
|
78
202
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
return {
|
|
88
|
-
output: `Task ${task.id} completed by ${runner}`,
|
|
89
|
-
tokens: Math.floor(Math.random() * 2000) + 500,
|
|
90
|
-
};
|
|
203
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
204
|
+
// Helpers
|
|
205
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
206
|
+
function requireTask(dag, taskId) {
|
|
207
|
+
const task = dag.tasks.find((t) => t.id === taskId);
|
|
208
|
+
if (!task)
|
|
209
|
+
throw new Error(`Task "${taskId}" not found in DAG`);
|
|
210
|
+
return task;
|
|
91
211
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
export async function runDag(dag, options) {
|
|
96
|
-
const { parallel, runner, canvasPath } = options;
|
|
97
|
-
// Initialize all tasks as PENDING
|
|
98
|
-
dag.tasks.forEach((t) => (t.status = 'PENDING'));
|
|
99
|
-
await renderCanvas(dag, canvasPath);
|
|
100
|
-
if (!parallel) {
|
|
101
|
-
// Sequential execution
|
|
102
|
-
for (const task of dag.tasks) {
|
|
103
|
-
task.status = 'RUNNING';
|
|
104
|
-
await renderCanvas(dag, canvasPath);
|
|
105
|
-
console.log(chalk.cyan(` 🔄 Running ${task.id}: ${task.title}`));
|
|
106
|
-
const start = Date.now();
|
|
107
|
-
const result = await executeTask(task, '', runner);
|
|
108
|
-
task.status = 'DONE';
|
|
109
|
-
task.output = result.output;
|
|
110
|
-
task.tokens = result.tokens;
|
|
111
|
-
task.duration = Date.now() - start;
|
|
112
|
-
console.log(chalk.green(` ✅ ${task.id} done (${task.duration}ms, ${task.tokens} tokens)`));
|
|
113
|
-
await renderCanvas(dag, canvasPath);
|
|
114
|
-
}
|
|
115
|
-
return;
|
|
212
|
+
function safeIngest(graph, task, dag) {
|
|
213
|
+
try {
|
|
214
|
+
ingestTask(graph, task, dag);
|
|
116
215
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const maxRank = Math.max(...ranks.values());
|
|
120
|
-
for (let rank = 0; rank <= maxRank; rank++) {
|
|
121
|
-
const rankTasks = dag.tasks.filter((t) => ranks.get(t.id) === rank && t.status === 'PENDING');
|
|
122
|
-
if (rankTasks.length === 0)
|
|
123
|
-
continue;
|
|
124
|
-
console.log(chalk.yellow(`\n 📦 Rank ${rank}: Executing ${rankTasks.length} task(s) in parallel`));
|
|
125
|
-
// Check if any dependency failed
|
|
126
|
-
const failedDeps = rankTasks.filter((t) => t.depends_on.some((dep) => dag.tasks.find((d) => d.id === dep)?.status === 'FAILED'));
|
|
127
|
-
failedDeps.forEach((t) => {
|
|
128
|
-
t.status = 'SKIPPED';
|
|
129
|
-
console.log(chalk.gray(` ⏭️ Skipping ${t.id} (dependency failed)`));
|
|
130
|
-
});
|
|
131
|
-
const executableTasks = rankTasks.filter((t) => t.status === 'PENDING');
|
|
132
|
-
// Build context from parent outputs
|
|
133
|
-
const parentOutputs = executableTasks.map((t) => t.depends_on
|
|
134
|
-
.map((dep) => dag.tasks.find((d) => d.id === dep)?.output || '')
|
|
135
|
-
.filter(Boolean)
|
|
136
|
-
.join('\n'));
|
|
137
|
-
// Mark all as RUNNING
|
|
138
|
-
executableTasks.forEach((t) => (t.status = 'RUNNING'));
|
|
139
|
-
await renderCanvas(dag, canvasPath);
|
|
140
|
-
// Execute in parallel
|
|
141
|
-
await Promise.all(executableTasks.map(async (task, i) => {
|
|
142
|
-
const start = Date.now();
|
|
143
|
-
console.log(chalk.cyan(` 🔄 ${task.id}: ${task.title}`));
|
|
144
|
-
try {
|
|
145
|
-
const result = await executeTask(task, parentOutputs[i], runner);
|
|
146
|
-
task.status = 'DONE';
|
|
147
|
-
task.output = result.output;
|
|
148
|
-
task.tokens = result.tokens;
|
|
149
|
-
task.duration = Date.now() - start;
|
|
150
|
-
console.log(chalk.green(` ✅ ${task.id} done (${task.duration}ms, ${task.tokens} tokens)`));
|
|
151
|
-
}
|
|
152
|
-
catch (err) {
|
|
153
|
-
task.status = 'FAILED';
|
|
154
|
-
task.duration = Date.now() - start;
|
|
155
|
-
console.log(chalk.red(` ❌ ${task.id} failed: ${err}`));
|
|
156
|
-
}
|
|
157
|
-
await renderCanvas(dag, canvasPath);
|
|
158
|
-
}));
|
|
216
|
+
catch {
|
|
217
|
+
// Best-effort. Ingestion failures must not break the orchestrator.
|
|
159
218
|
}
|
|
160
|
-
const done = dag.tasks.filter((t) => t.status === 'DONE').length;
|
|
161
|
-
const failed = dag.tasks.filter((t) => t.status === 'FAILED').length;
|
|
162
|
-
const skipped = dag.tasks.filter((t) => t.status === 'SKIPPED').length;
|
|
163
|
-
console.log(chalk.bold(`\n 📊 Summary: ${done} done, ${failed} failed, ${skipped} skipped`));
|
|
164
|
-
console.log(chalk.cyan(` 📄 Canvas: ${canvasPath}\n`));
|
|
165
219
|
}
|
|
166
220
|
//# sourceMappingURL=run_dag.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run_dag.js","sourceRoot":"","sources":["../../src/dag-runner/run_dag.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"run_dag.js","sourceRoot":"","sources":["../../src/dag-runner/run_dag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Dag, DagTask } from './run_dag.js';
|
|
2
|
+
export declare const DEFAULT_STATE_PATH: string;
|
|
3
|
+
/**
|
|
4
|
+
* Read state from disk and merge it into `dag.tasks`. Missing tasks default
|
|
5
|
+
* to PENDING.
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadAndApplyState(dag: Dag, stateFile: string): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Write the current `dag` runtime state to disk.
|
|
10
|
+
*/
|
|
11
|
+
export declare function saveState(dag: Dag, stateFile: string): Promise<void>;
|
|
12
|
+
export type { DagTask };
|
|
13
|
+
//# sourceMappingURL=state-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/dag-runner/state-store.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAc,MAAM,cAAc,CAAC;AAgB7D,eAAO,MAAM,kBAAkB,QAAmC,CAAC;AAEnE;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBlF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB1E;AAWD,YAAY,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime state store for the DAG.
|
|
3
|
+
*
|
|
4
|
+
* `dare-dag.yaml` stays the canonical spec (id / depends_on / complexity /
|
|
5
|
+
* subtask_prompt / spec_file). Per-task runtime fields — status, output,
|
|
6
|
+
* error, tokens, duration — live in a separate JSON file so that:
|
|
7
|
+
* - the YAML stays diff-friendly and reviewable
|
|
8
|
+
* - the state file can be gitignored (`.dare/`)
|
|
9
|
+
* - CLI invocations can rehydrate the in-memory DAG between commands
|
|
10
|
+
*/
|
|
11
|
+
import path from 'path';
|
|
12
|
+
import fs from 'fs-extra';
|
|
13
|
+
export const DEFAULT_STATE_PATH = path.join('.dare', 'state.json');
|
|
14
|
+
/**
|
|
15
|
+
* Read state from disk and merge it into `dag.tasks`. Missing tasks default
|
|
16
|
+
* to PENDING.
|
|
17
|
+
*/
|
|
18
|
+
export async function loadAndApplyState(dag, stateFile) {
|
|
19
|
+
const exists = await fs.pathExists(stateFile);
|
|
20
|
+
if (!exists) {
|
|
21
|
+
for (const task of dag.tasks)
|
|
22
|
+
task.status = task.status ?? 'PENDING';
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const raw = (await fs.readJson(stateFile));
|
|
26
|
+
const data = isPersistedState(raw) ? raw : null;
|
|
27
|
+
for (const task of dag.tasks) {
|
|
28
|
+
const persisted = data?.tasks?.[task.id];
|
|
29
|
+
if (persisted) {
|
|
30
|
+
task.status = persisted.status;
|
|
31
|
+
task.output = persisted.output;
|
|
32
|
+
task.error = persisted.error;
|
|
33
|
+
task.tokens = persisted.tokens;
|
|
34
|
+
task.duration = persisted.duration;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
task.status = task.status ?? 'PENDING';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Write the current `dag` runtime state to disk.
|
|
43
|
+
*/
|
|
44
|
+
export async function saveState(dag, stateFile) {
|
|
45
|
+
const tasks = {};
|
|
46
|
+
for (const t of dag.tasks) {
|
|
47
|
+
tasks[t.id] = {
|
|
48
|
+
status: t.status ?? 'PENDING',
|
|
49
|
+
output: t.output,
|
|
50
|
+
error: t.error,
|
|
51
|
+
tokens: t.tokens,
|
|
52
|
+
duration: t.duration,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const payload = {
|
|
56
|
+
version: 1,
|
|
57
|
+
updatedAt: new Date().toISOString(),
|
|
58
|
+
tasks,
|
|
59
|
+
};
|
|
60
|
+
await fs.ensureDir(path.dirname(stateFile));
|
|
61
|
+
await fs.writeJson(stateFile, payload, { spaces: 2 });
|
|
62
|
+
}
|
|
63
|
+
function isPersistedState(value) {
|
|
64
|
+
return (typeof value === 'object' &&
|
|
65
|
+
value !== null &&
|
|
66
|
+
'tasks' in value &&
|
|
67
|
+
typeof value.tasks === 'object');
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=state-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/dag-runner/state-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAiB1B,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAQ,EAAE,SAAiB;IACjE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;QACrE,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA6B,CAAC;IACvE,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAC/B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YAC7B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;YAC/B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAQ,EAAE,SAAiB;IACzD,MAAM,KAAK,GAAuC,EAAE,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;YAC7B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAmB;QAC9B,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK;KACN,CAAC;IACF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,IAAI,KAAK;QAChB,OAAQ,KAA4B,CAAC,KAAK,KAAK,QAAQ,CACxD,CAAC;AACJ,CAAC"}
|
|
@@ -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,CAShE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
// If the cap is too small to fit even the notice, do a hard slice.
|
|
20
|
+
if (maxChars <= TRUNCATION_NOTICE.length) {
|
|
21
|
+
return text.slice(0, maxChars);
|
|
22
|
+
}
|
|
23
|
+
return text.slice(0, maxChars - TRUNCATION_NOTICE.length) + TRUNCATION_NOTICE;
|
|
24
|
+
}
|
|
25
|
+
//# 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,mEAAmE;IACnE,IAAI,QAAQ,IAAI,iBAAiB,CAAC,MAAM,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC;AAChF,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"}
|