taskflow-dsl 0.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/LICENSE +21 -0
- package/README.md +1008 -0
- package/dist/build/erase/ast.d.ts +13 -0
- package/dist/build/erase/ast.d.ts.map +1 -0
- package/dist/build/erase/ast.js +76 -0
- package/dist/build/erase/ast.js.map +1 -0
- package/dist/build/erase/context.d.ts +18 -0
- package/dist/build/erase/context.d.ts.map +1 -0
- package/dist/build/erase/context.js +109 -0
- package/dist/build/erase/context.js.map +1 -0
- package/dist/build/erase/index.d.ts +4 -0
- package/dist/build/erase/index.d.ts.map +1 -0
- package/dist/build/erase/index.js +2 -0
- package/dist/build/erase/index.js.map +1 -0
- package/dist/build/erase/kinds/agent-script.d.ts +5 -0
- package/dist/build/erase/kinds/agent-script.d.ts.map +1 -0
- package/dist/build/erase/kinds/agent-script.js +100 -0
- package/dist/build/erase/kinds/agent-script.js.map +1 -0
- package/dist/build/erase/kinds/approval.d.ts +4 -0
- package/dist/build/erase/kinds/approval.d.ts.map +1 -0
- package/dist/build/erase/kinds/approval.js +39 -0
- package/dist/build/erase/kinds/approval.js.map +1 -0
- package/dist/build/erase/kinds/branch-opts.d.ts +10 -0
- package/dist/build/erase/kinds/branch-opts.d.ts.map +1 -0
- package/dist/build/erase/kinds/branch-opts.js +21 -0
- package/dist/build/erase/kinds/branch-opts.js.map +1 -0
- package/dist/build/erase/kinds/expand-flow.d.ts +9 -0
- package/dist/build/erase/kinds/expand-flow.d.ts.map +1 -0
- package/dist/build/erase/kinds/expand-flow.js +80 -0
- package/dist/build/erase/kinds/expand-flow.js.map +1 -0
- package/dist/build/erase/kinds/gate-sugar.d.ts +5 -0
- package/dist/build/erase/kinds/gate-sugar.d.ts.map +1 -0
- package/dist/build/erase/kinds/gate-sugar.js +98 -0
- package/dist/build/erase/kinds/gate-sugar.js.map +1 -0
- package/dist/build/erase/kinds/gate.d.ts +5 -0
- package/dist/build/erase/kinds/gate.d.ts.map +1 -0
- package/dist/build/erase/kinds/gate.js +60 -0
- package/dist/build/erase/kinds/gate.js.map +1 -0
- package/dist/build/erase/kinds/index.d.ts +9 -0
- package/dist/build/erase/kinds/index.d.ts.map +1 -0
- package/dist/build/erase/kinds/index.js +107 -0
- package/dist/build/erase/kinds/index.js.map +1 -0
- package/dist/build/erase/kinds/loop.d.ts +4 -0
- package/dist/build/erase/kinds/loop.d.ts.map +1 -0
- package/dist/build/erase/kinds/loop.js +55 -0
- package/dist/build/erase/kinds/loop.js.map +1 -0
- package/dist/build/erase/kinds/map.d.ts +4 -0
- package/dist/build/erase/kinds/map.d.ts.map +1 -0
- package/dist/build/erase/kinds/map.js +117 -0
- package/dist/build/erase/kinds/map.js.map +1 -0
- package/dist/build/erase/kinds/parallel.d.ts +4 -0
- package/dist/build/erase/kinds/parallel.d.ts.map +1 -0
- package/dist/build/erase/kinds/parallel.js +62 -0
- package/dist/build/erase/kinds/parallel.js.map +1 -0
- package/dist/build/erase/kinds/race.d.ts +4 -0
- package/dist/build/erase/kinds/race.d.ts.map +1 -0
- package/dist/build/erase/kinds/race.js +61 -0
- package/dist/build/erase/kinds/race.js.map +1 -0
- package/dist/build/erase/kinds/reduce.d.ts +4 -0
- package/dist/build/erase/kinds/reduce.d.ts.map +1 -0
- package/dist/build/erase/kinds/reduce.js +81 -0
- package/dist/build/erase/kinds/reduce.js.map +1 -0
- package/dist/build/erase/kinds/tournament.d.ts +4 -0
- package/dist/build/erase/kinds/tournament.d.ts.map +1 -0
- package/dist/build/erase/kinds/tournament.js +75 -0
- package/dist/build/erase/kinds/tournament.js.map +1 -0
- package/dist/build/erase/opts.d.ts +18 -0
- package/dist/build/erase/opts.d.ts.map +1 -0
- package/dist/build/erase/opts.js +241 -0
- package/dist/build/erase/opts.js.map +1 -0
- package/dist/build/erase/pipeline.d.ts +8 -0
- package/dist/build/erase/pipeline.d.ts.map +1 -0
- package/dist/build/erase/pipeline.js +420 -0
- package/dist/build/erase/pipeline.js.map +1 -0
- package/dist/build/erase/templates.d.ts +20 -0
- package/dist/build/erase/templates.d.ts.map +1 -0
- package/dist/build/erase/templates.js +185 -0
- package/dist/build/erase/templates.js.map +1 -0
- package/dist/build/erase/types.d.ts +31 -0
- package/dist/build/erase/types.d.ts.map +1 -0
- package/dist/build/erase/types.js +28 -0
- package/dist/build/erase/types.js.map +1 -0
- package/dist/build/erase.d.ts +4 -0
- package/dist/build/erase.d.ts.map +1 -0
- package/dist/build/erase.js +2 -0
- package/dist/build/erase.js.map +1 -0
- package/dist/build.d.ts +26 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +200 -0
- package/dist/build.js.map +1 -0
- package/dist/check.d.ts +21 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +42 -0
- package/dist/check.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +279 -0
- package/dist/cli.js.map +1 -0
- package/dist/decompile.d.ts +7 -0
- package/dist/decompile.d.ts.map +1 -0
- package/dist/decompile.js +353 -0
- package/dist/decompile.js.map +1 -0
- package/dist/diagnostics.d.ts +27 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +17 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/new-skeleton.d.ts +4 -0
- package/dist/new-skeleton.d.ts.map +1 -0
- package/dist/new-skeleton.js +22 -0
- package/dist/new-skeleton.js.map +1 -0
- package/dist/paths.d.ts +28 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +153 -0
- package/dist/paths.js.map +1 -0
- package/dist/runes.d.ts +175 -0
- package/dist/runes.d.ts.map +1 -0
- package/dist/runes.js +83 -0
- package/dist/runes.js.map +1 -0
- package/dist/typecheck.d.ts +6 -0
- package/dist/typecheck.d.ts.map +1 -0
- package/dist/typecheck.js +62 -0
- package/dist/typecheck.js.map +1 -0
- package/package.json +68 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* taskflow-dsl CLI — build | check | decompile | new
|
|
4
|
+
*/
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { createRequire } from "node:module";
|
|
8
|
+
import { buildFile } from "./build.js";
|
|
9
|
+
import { checkFile } from "./check.js";
|
|
10
|
+
import { decompileTaskflow } from "./decompile.js";
|
|
11
|
+
import { formatDiagnostics, hasErrors } from "./diagnostics.js";
|
|
12
|
+
import { skeletonHello, skeletonJson } from "./new-skeleton.js";
|
|
13
|
+
import { assertContainedOutputWritable, resolveInput, writeContainedFileAtomic } from "./paths.js";
|
|
14
|
+
import { desugar, parseJsonc, validateTaskflow } from "taskflow-core";
|
|
15
|
+
const require = createRequire(import.meta.url);
|
|
16
|
+
const PKG_VERSION = (() => {
|
|
17
|
+
try {
|
|
18
|
+
return require("../package.json").version;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return "0.0.0-dev";
|
|
22
|
+
}
|
|
23
|
+
})();
|
|
24
|
+
function usage() {
|
|
25
|
+
return `taskflow-dsl <command> [options] [path]
|
|
26
|
+
|
|
27
|
+
Commands:
|
|
28
|
+
build <file> Erase .tf.ts (or validate .json) → Taskflow / FlowIR
|
|
29
|
+
check <file> Erase + validate (no write)
|
|
30
|
+
decompile <file> Taskflow JSON → .tf.ts
|
|
31
|
+
new [name] Write hello skeleton
|
|
32
|
+
|
|
33
|
+
Options:
|
|
34
|
+
--cwd <dir> Project root for path resolution (default: process.cwd())
|
|
35
|
+
-o, --out <path> Output path (must stay under --cwd)
|
|
36
|
+
--emit taskflow|flowir|both (build, default: taskflow)
|
|
37
|
+
--no-typecheck (check) skip tsc Program diagnostics
|
|
38
|
+
--json Machine-readable diagnostics
|
|
39
|
+
--force Overwrite an existing regular output file
|
|
40
|
+
--json-escape new: emit JSON skeleton instead of .tf.ts
|
|
41
|
+
-V, --version
|
|
42
|
+
-h, --help
|
|
43
|
+
`;
|
|
44
|
+
}
|
|
45
|
+
function parseArgs(argv) {
|
|
46
|
+
const args = argv.slice(2);
|
|
47
|
+
const flags = {};
|
|
48
|
+
const positional = [];
|
|
49
|
+
for (let i = 0; i < args.length; i++) {
|
|
50
|
+
const a = args[i];
|
|
51
|
+
if (a === "-h" || a === "--help")
|
|
52
|
+
flags.help = true;
|
|
53
|
+
else if (a === "-V" || a === "--version")
|
|
54
|
+
flags.version = true;
|
|
55
|
+
else if (a === "--json")
|
|
56
|
+
flags.json = true;
|
|
57
|
+
else if (a === "-o" || a === "--out")
|
|
58
|
+
flags.out = args[++i] ?? "";
|
|
59
|
+
else if (a === "--emit")
|
|
60
|
+
flags.emit = args[++i] ?? "";
|
|
61
|
+
else if (a === "--cwd")
|
|
62
|
+
flags.cwd = args[++i] ?? "";
|
|
63
|
+
else if (a === "--force")
|
|
64
|
+
flags.force = true;
|
|
65
|
+
else if (a === "--typecheck")
|
|
66
|
+
flags.typecheck = true;
|
|
67
|
+
else if (a === "--no-typecheck")
|
|
68
|
+
flags.noTypecheck = true;
|
|
69
|
+
else if (a === "--json-escape")
|
|
70
|
+
flags.jsonEscape = true;
|
|
71
|
+
else if (a.startsWith("-"))
|
|
72
|
+
flags[a] = true;
|
|
73
|
+
else
|
|
74
|
+
positional.push(a);
|
|
75
|
+
}
|
|
76
|
+
return { flags, positional };
|
|
77
|
+
}
|
|
78
|
+
function main() {
|
|
79
|
+
const { flags, positional } = parseArgs(process.argv);
|
|
80
|
+
const unknownFlags = Object.keys(flags).filter((key) => key.startsWith("-"));
|
|
81
|
+
if (unknownFlags.length)
|
|
82
|
+
failUsage(`unknown option: ${unknownFlags[0]}`);
|
|
83
|
+
if (flags.version) {
|
|
84
|
+
process.stdout.write(`${PKG_VERSION}\n`);
|
|
85
|
+
process.exit(0);
|
|
86
|
+
}
|
|
87
|
+
if (flags.help || positional.length === 0) {
|
|
88
|
+
process.stdout.write(usage());
|
|
89
|
+
process.exit(flags.help ? 0 : 2);
|
|
90
|
+
}
|
|
91
|
+
const cwd = typeof flags.cwd === "string" && flags.cwd ? path.resolve(flags.cwd) : process.cwd();
|
|
92
|
+
const cmd = positional[0];
|
|
93
|
+
const allowedByCommand = {
|
|
94
|
+
build: new Set(["cwd", "out", "emit", "json", "force"]),
|
|
95
|
+
check: new Set(["cwd", "typecheck", "noTypecheck", "json"]),
|
|
96
|
+
decompile: new Set(["cwd", "out", "force"]),
|
|
97
|
+
new: new Set(["cwd", "out", "force", "jsonEscape"]),
|
|
98
|
+
};
|
|
99
|
+
const allowed = allowedByCommand[cmd];
|
|
100
|
+
if (allowed) {
|
|
101
|
+
for (const key of Object.keys(flags)) {
|
|
102
|
+
if (key === "help" || key === "version")
|
|
103
|
+
continue;
|
|
104
|
+
if (!allowed.has(key))
|
|
105
|
+
failUsage(`option --${key} is not valid for ${cmd}`);
|
|
106
|
+
}
|
|
107
|
+
const maxPositional = cmd === "new" ? 2 : 2;
|
|
108
|
+
if (positional.length > maxPositional)
|
|
109
|
+
failUsage(`${cmd} received unexpected positional arguments`);
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
if (cmd === "build") {
|
|
113
|
+
const file = positional[1];
|
|
114
|
+
if (!file) {
|
|
115
|
+
process.stderr.write("build requires a file path\n");
|
|
116
|
+
process.exit(2);
|
|
117
|
+
}
|
|
118
|
+
const input = resolveInput(cwd, file);
|
|
119
|
+
const emitValue = String(flags.emit ?? "taskflow");
|
|
120
|
+
if (emitValue !== "taskflow" && emitValue !== "flowir" && emitValue !== "both") {
|
|
121
|
+
failUsage(`--emit must be taskflow, flowir, or both`);
|
|
122
|
+
}
|
|
123
|
+
const emit = emitValue;
|
|
124
|
+
if (emit === "both" && typeof flags.out === "string" && flags.out) {
|
|
125
|
+
failUsage(`--out is ambiguous with --emit both`);
|
|
126
|
+
}
|
|
127
|
+
if (flags.json && typeof flags.out === "string" && flags.out)
|
|
128
|
+
failUsage(`--out cannot be used with --json`);
|
|
129
|
+
const r = buildFile(input, { emit, irHash: true, validate: true });
|
|
130
|
+
if (flags.json) {
|
|
131
|
+
process.stdout.write(JSON.stringify({
|
|
132
|
+
ok: r.ok,
|
|
133
|
+
diagnostics: r.diagnostics,
|
|
134
|
+
irHash: r.irHash,
|
|
135
|
+
taskflow: r.taskflow,
|
|
136
|
+
flowir: r.flowir,
|
|
137
|
+
}, null, 2) + "\n");
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
if (r.diagnostics.length)
|
|
141
|
+
process.stderr.write(formatDiagnostics(r.diagnostics) + "\n");
|
|
142
|
+
if (r.ok && r.taskflow) {
|
|
143
|
+
const stem = input.replace(/\.tf\.ts$/i, "").replace(/\.jsonc?$/i, "");
|
|
144
|
+
const taskflowOut = emit === "taskflow" || emit === "both"
|
|
145
|
+
? typeof flags.out === "string" && flags.out && emit === "taskflow"
|
|
146
|
+
? flags.out
|
|
147
|
+
: `${stem}.taskflow.json`
|
|
148
|
+
: undefined;
|
|
149
|
+
const flowirOut = (emit === "flowir" || emit === "both") && r.flowir
|
|
150
|
+
? typeof flags.out === "string" && flags.out && emit === "flowir"
|
|
151
|
+
? flags.out
|
|
152
|
+
: `${stem}.flowir.json`
|
|
153
|
+
: undefined;
|
|
154
|
+
const outputOptions = { force: flags.force === true };
|
|
155
|
+
// Fail before the first write if either half of `--emit both` is
|
|
156
|
+
// already unsafe or would overwrite without explicit consent.
|
|
157
|
+
for (const output of [taskflowOut, flowirOut]) {
|
|
158
|
+
if (output)
|
|
159
|
+
assertContainedOutputWritable(cwd, outputRelativeTo(cwd, output), outputOptions);
|
|
160
|
+
}
|
|
161
|
+
if (emit === "taskflow" || emit === "both") {
|
|
162
|
+
const outPath = writeContainedFileAtomic(cwd, outputRelativeTo(cwd, taskflowOut), JSON.stringify(r.taskflow, null, 2) + "\n", outputOptions);
|
|
163
|
+
process.stdout.write(`wrote ${outPath}\n`);
|
|
164
|
+
}
|
|
165
|
+
if ((emit === "flowir" || emit === "both") && r.flowir) {
|
|
166
|
+
const p = writeContainedFileAtomic(cwd, outputRelativeTo(cwd, flowirOut), JSON.stringify({ hash: r.irHash, ir: r.flowir }, null, 2) + "\n", outputOptions);
|
|
167
|
+
process.stdout.write(`wrote ${p} (${r.irHash})\n`);
|
|
168
|
+
}
|
|
169
|
+
process.stdout.write(`ok name=${r.taskflow.name} phases=${r.taskflow.phases?.length ?? 0}` +
|
|
170
|
+
(r.irHash ? ` ${r.irHash}` : "") +
|
|
171
|
+
"\n");
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
process.exit(r.ok ? 0 : hasErrors(r.diagnostics) ? 1 : 0);
|
|
175
|
+
}
|
|
176
|
+
if (cmd === "check") {
|
|
177
|
+
const file = positional[1];
|
|
178
|
+
if (!file) {
|
|
179
|
+
process.stderr.write("check requires a file path\n");
|
|
180
|
+
process.exit(2);
|
|
181
|
+
}
|
|
182
|
+
if (flags.typecheck && flags.noTypecheck)
|
|
183
|
+
failUsage(`--typecheck and --no-typecheck are mutually exclusive`);
|
|
184
|
+
const r = checkFile(resolveInput(cwd, file), {
|
|
185
|
+
typecheck: flags.noTypecheck !== true,
|
|
186
|
+
cwd,
|
|
187
|
+
});
|
|
188
|
+
if (flags.json) {
|
|
189
|
+
process.stdout.write(JSON.stringify({ ok: r.ok, diagnostics: r.diagnostics }, null, 2) + "\n");
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
if (r.diagnostics.length)
|
|
193
|
+
process.stdout.write(formatDiagnostics(r.diagnostics) + "\n");
|
|
194
|
+
process.stdout.write(r.ok ? "ok\n" : "failed\n");
|
|
195
|
+
}
|
|
196
|
+
process.exit(r.ok ? 0 : 1);
|
|
197
|
+
}
|
|
198
|
+
if (cmd === "decompile") {
|
|
199
|
+
const file = positional[1];
|
|
200
|
+
if (!file) {
|
|
201
|
+
process.stderr.write("decompile requires a Taskflow JSON path\n");
|
|
202
|
+
process.exit(2);
|
|
203
|
+
}
|
|
204
|
+
const input = resolveInput(cwd, file);
|
|
205
|
+
const inputText = fs.readFileSync(input, "utf8");
|
|
206
|
+
const raw = input.toLowerCase().endsWith(".jsonc") ? parseJsonc(inputText) : JSON.parse(inputText);
|
|
207
|
+
const asRec = raw;
|
|
208
|
+
let def;
|
|
209
|
+
if (Array.isArray(asRec.phases)) {
|
|
210
|
+
const v = validateTaskflow(raw);
|
|
211
|
+
if (!v.ok) {
|
|
212
|
+
process.stderr.write(v.errors.join("\n") + "\n");
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
def = raw;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
try {
|
|
219
|
+
def = desugar(raw);
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
process.stderr.write((e instanceof Error ? e.message : String(e)) + "\n");
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
const v = validateTaskflow(def);
|
|
226
|
+
if (!v.ok) {
|
|
227
|
+
process.stderr.write(v.errors.join("\n") + "\n");
|
|
228
|
+
process.exit(1);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
let src;
|
|
232
|
+
try {
|
|
233
|
+
src = decompileTaskflow(def);
|
|
234
|
+
}
|
|
235
|
+
catch (e) {
|
|
236
|
+
process.stderr.write((e instanceof Error ? e.message : String(e)) + "\n");
|
|
237
|
+
process.exit(1);
|
|
238
|
+
}
|
|
239
|
+
let out = typeof flags.out === "string" && flags.out
|
|
240
|
+
? flags.out
|
|
241
|
+
: input.replace(/\.jsonc?$/i, "") + ".tf.ts";
|
|
242
|
+
if (out === "-") {
|
|
243
|
+
process.stdout.write(src);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
out = writeContainedFileAtomic(cwd, outputRelativeTo(cwd, out), src, { force: flags.force === true });
|
|
247
|
+
process.stdout.write(`wrote ${out}\n`);
|
|
248
|
+
}
|
|
249
|
+
process.exit(0);
|
|
250
|
+
}
|
|
251
|
+
if (cmd === "new") {
|
|
252
|
+
const name = positional[1] ?? "hello";
|
|
253
|
+
const content = flags.jsonEscape ? skeletonJson(name) : skeletonHello(name);
|
|
254
|
+
let outRel = typeof flags.out === "string" && flags.out
|
|
255
|
+
? flags.out
|
|
256
|
+
: flags.jsonEscape
|
|
257
|
+
? `./${name}.json`
|
|
258
|
+
: `./${name}.tf.ts`;
|
|
259
|
+
const out = writeContainedFileAtomic(cwd, outRel, content, { force: flags.force === true });
|
|
260
|
+
process.stdout.write(`wrote ${out}\n`);
|
|
261
|
+
process.exit(0);
|
|
262
|
+
}
|
|
263
|
+
process.stderr.write(`unknown command: ${cmd}\n${usage()}`);
|
|
264
|
+
process.exit(2);
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
process.stderr.write((e instanceof Error ? e.message : String(e)) + "\n");
|
|
268
|
+
process.exit(2);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function failUsage(message) {
|
|
272
|
+
process.stderr.write(`${message}\n`);
|
|
273
|
+
process.exit(2);
|
|
274
|
+
}
|
|
275
|
+
function outputRelativeTo(cwd, out) {
|
|
276
|
+
return path.isAbsolute(out) ? path.relative(path.resolve(cwd), out) : out;
|
|
277
|
+
}
|
|
278
|
+
main();
|
|
279
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taskflow JSON → .tf.ts (semantic, not literal round-trip).
|
|
3
|
+
* MVP: agent / script / map / parallel / gate / reduce / approval / flow / loop / tournament.
|
|
4
|
+
*/
|
|
5
|
+
import { type Taskflow } from "taskflow-core";
|
|
6
|
+
export declare function decompileTaskflow(def: Taskflow): string;
|
|
7
|
+
//# sourceMappingURL=decompile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decompile.d.ts","sourceRoot":"","sources":["../src/decompile.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAkB,KAAK,QAAQ,EAAc,MAAM,eAAe,CAAC;AAyJ1E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAqFvD"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taskflow JSON → .tf.ts (semantic, not literal round-trip).
|
|
3
|
+
* MVP: agent / script / map / parallel / gate / reduce / approval / flow / loop / tournament.
|
|
4
|
+
*/
|
|
5
|
+
import { dependenciesOf } from "taskflow-core";
|
|
6
|
+
/**
|
|
7
|
+
* Encode JSON-compatible data as a standalone JavaScript/TypeScript expression.
|
|
8
|
+
*
|
|
9
|
+
* This deliberately does not concatenate JSON.stringify() output into generated
|
|
10
|
+
* source. Every code-significant ASCII character in strings is escaped, as are
|
|
11
|
+
* line separators and non-ASCII code units, so user-controlled Taskflow text can
|
|
12
|
+
* never terminate a literal or create a script-closing sequence. The recursive
|
|
13
|
+
* encoder also rejects non-JSON values instead of silently changing semantics.
|
|
14
|
+
*/
|
|
15
|
+
function sourceLiteral(value, seen = new Set()) {
|
|
16
|
+
if (value === null)
|
|
17
|
+
return "null";
|
|
18
|
+
if (typeof value === "string") {
|
|
19
|
+
let out = '"';
|
|
20
|
+
for (let i = 0; i < value.length; i++) {
|
|
21
|
+
const code = value.charCodeAt(i);
|
|
22
|
+
if (code === 0x22)
|
|
23
|
+
out += '\\"';
|
|
24
|
+
else if (code === 0x5c)
|
|
25
|
+
out += "\\\\";
|
|
26
|
+
else if (code >= 0x20 && code <= 0x7e &&
|
|
27
|
+
code !== 0x26 && // ampersand: keep generated source inert in HTML/script transports
|
|
28
|
+
code !== 0x3c && // less-than: prevents a literal </script sequence
|
|
29
|
+
code !== 0x3e)
|
|
30
|
+
out += value[i];
|
|
31
|
+
else
|
|
32
|
+
out += `\\u${code.toString(16).padStart(4, "0")}`;
|
|
33
|
+
}
|
|
34
|
+
return `${out}"`;
|
|
35
|
+
}
|
|
36
|
+
if (typeof value === "boolean")
|
|
37
|
+
return value ? "true" : "false";
|
|
38
|
+
if (typeof value === "number") {
|
|
39
|
+
if (!Number.isFinite(value))
|
|
40
|
+
throw new Error("TFDSL_DECOMPILE_UNSUPPORTED: non-finite number cannot be emitted");
|
|
41
|
+
return Object.is(value, -0) ? "-0" : String(value);
|
|
42
|
+
}
|
|
43
|
+
if (typeof value !== "object") {
|
|
44
|
+
throw new Error(`TFDSL_DECOMPILE_UNSUPPORTED: ${typeof value} is not a JSON source literal`);
|
|
45
|
+
}
|
|
46
|
+
if (seen.has(value))
|
|
47
|
+
throw new Error("TFDSL_DECOMPILE_UNSUPPORTED: cyclic value cannot be emitted");
|
|
48
|
+
seen.add(value);
|
|
49
|
+
try {
|
|
50
|
+
if (Array.isArray(value))
|
|
51
|
+
return `[${value.map((item) => sourceLiteral(item, seen)).join(", ")}]`;
|
|
52
|
+
const proto = Object.getPrototypeOf(value);
|
|
53
|
+
if (proto !== Object.prototype && proto !== null) {
|
|
54
|
+
throw new Error("TFDSL_DECOMPILE_UNSUPPORTED: non-plain object cannot be emitted");
|
|
55
|
+
}
|
|
56
|
+
const entries = Object.entries(value);
|
|
57
|
+
if (entries.some(([key]) => key === "__proto__")) {
|
|
58
|
+
throw new Error("TFDSL_DECOMPILE_UNSUPPORTED: '__proto__' object keys cannot round-trip safely");
|
|
59
|
+
}
|
|
60
|
+
return `{ ${entries
|
|
61
|
+
.map(([key, item]) => `${sourceLiteral(key, seen)}: ${sourceLiteral(item, seen)}`)
|
|
62
|
+
.join(", ")} }`;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
seen.delete(value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const RESERVED = new Set([
|
|
69
|
+
"break", "case", "catch", "class", "const", "continue", "debugger", "default", "delete",
|
|
70
|
+
"do", "else", "export", "extends", "false", "finally", "for", "function", "if", "import",
|
|
71
|
+
"in", "instanceof", "new", "null", "return", "super", "switch", "this", "throw", "true",
|
|
72
|
+
"try", "typeof", "var", "void", "while", "with", "yield", "let", "static", "await", "ctx",
|
|
73
|
+
"flow", "agent", "map", "parallel", "gate", "reduce", "approval", "subflow", "loop",
|
|
74
|
+
"tournament", "script", "race", "expand",
|
|
75
|
+
]);
|
|
76
|
+
function allocateBindings(phases) {
|
|
77
|
+
const out = new Map();
|
|
78
|
+
const used = new Set(RESERVED);
|
|
79
|
+
for (const p of phases) {
|
|
80
|
+
let base = p.id.replace(/[^A-Za-z0-9_$]/g, "_") || "phase";
|
|
81
|
+
if (/^[0-9]/.test(base))
|
|
82
|
+
base = `p_${base}`;
|
|
83
|
+
if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(base) || RESERVED.has(base))
|
|
84
|
+
base = `p_${base}`;
|
|
85
|
+
let candidate = base;
|
|
86
|
+
let suffix = 2;
|
|
87
|
+
while (used.has(candidate))
|
|
88
|
+
candidate = `${base}_${suffix++}`;
|
|
89
|
+
used.add(candidate);
|
|
90
|
+
out.set(p.id, candidate);
|
|
91
|
+
}
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
function branchSource(branch, role) {
|
|
95
|
+
const unsupported = Object.keys(branch).filter((key) => key !== "task" && key !== "agent");
|
|
96
|
+
if (unsupported.length > 0) {
|
|
97
|
+
throw new Error(`TFDSL_DECOMPILE_UNSUPPORTED: ${role} contains unsupported branch option(s): ${unsupported.join(", ")}; only task and agent are runtime-supported`);
|
|
98
|
+
}
|
|
99
|
+
if (typeof branch.task !== "string") {
|
|
100
|
+
throw new Error(`TFDSL_DECOMPILE_UNSUPPORTED: ${role}.task must be a string`);
|
|
101
|
+
}
|
|
102
|
+
if (branch.agent !== undefined && typeof branch.agent !== "string") {
|
|
103
|
+
throw new Error(`TFDSL_DECOMPILE_UNSUPPORTED: ${role}.agent must be a string`);
|
|
104
|
+
}
|
|
105
|
+
const branchOpts = branch.agent === undefined ? "" : `, { agent: ${sourceLiteral(branch.agent)} }`;
|
|
106
|
+
return `agent(${sourceLiteral(branch.task)}${branchOpts})`;
|
|
107
|
+
}
|
|
108
|
+
const DECOMPILABLE = new Set([
|
|
109
|
+
"agent",
|
|
110
|
+
"script",
|
|
111
|
+
"map",
|
|
112
|
+
"parallel",
|
|
113
|
+
"gate",
|
|
114
|
+
"reduce",
|
|
115
|
+
"approval",
|
|
116
|
+
"flow",
|
|
117
|
+
"loop",
|
|
118
|
+
"tournament",
|
|
119
|
+
"race",
|
|
120
|
+
"expand",
|
|
121
|
+
]);
|
|
122
|
+
/**
|
|
123
|
+
* Produce the least-disruptive topological order: an already-topological input
|
|
124
|
+
* remains byte-for-byte ordered, while a consumer that precedes its dependency
|
|
125
|
+
* moves just far enough for generated TypeScript bindings to be in scope.
|
|
126
|
+
* `topoLayers().flat()` is intentionally not used here because breadth layers
|
|
127
|
+
* can move unrelated phases across a consumer and break semantic round-trip
|
|
128
|
+
* ordering even when the input was already valid TypeScript declaration order.
|
|
129
|
+
*/
|
|
130
|
+
function stableTopologicalPhases(phases) {
|
|
131
|
+
const byId = new Map(phases.map((phase) => [phase.id, phase]));
|
|
132
|
+
const inputIndex = new Map(phases.map((phase, index) => [phase.id, index]));
|
|
133
|
+
const indegree = new Map(phases.map((phase) => [phase.id, 0]));
|
|
134
|
+
const dependents = new Map(phases.map((phase) => [phase.id, []]));
|
|
135
|
+
for (const phase of phases) {
|
|
136
|
+
for (const dependency of dependenciesOf(phase)) {
|
|
137
|
+
if (!byId.has(dependency))
|
|
138
|
+
continue;
|
|
139
|
+
indegree.set(phase.id, (indegree.get(phase.id) ?? 0) + 1);
|
|
140
|
+
dependents.get(dependency).push(phase.id);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const ready = phases
|
|
144
|
+
.filter((phase) => (indegree.get(phase.id) ?? 0) === 0)
|
|
145
|
+
.map((phase) => phase.id);
|
|
146
|
+
const ordered = [];
|
|
147
|
+
while (ready.length > 0) {
|
|
148
|
+
ready.sort((a, b) => inputIndex.get(a) - inputIndex.get(b));
|
|
149
|
+
const id = ready.shift();
|
|
150
|
+
ordered.push(byId.get(id));
|
|
151
|
+
for (const dependent of dependents.get(id) ?? []) {
|
|
152
|
+
const next = (indegree.get(dependent) ?? 0) - 1;
|
|
153
|
+
indegree.set(dependent, next);
|
|
154
|
+
if (next === 0)
|
|
155
|
+
ready.push(dependent);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return ordered;
|
|
159
|
+
}
|
|
160
|
+
export function decompileTaskflow(def) {
|
|
161
|
+
const inputPhases = def.phases ?? [];
|
|
162
|
+
const phases = stableTopologicalPhases(inputPhases);
|
|
163
|
+
if (phases.length !== inputPhases.length) {
|
|
164
|
+
throw new Error("TFDSL_DECOMPILE_UNSUPPORTED: phase graph cannot be topologically ordered");
|
|
165
|
+
}
|
|
166
|
+
for (const p of phases) {
|
|
167
|
+
const type = p.type ?? "agent";
|
|
168
|
+
if (!DECOMPILABLE.has(type)) {
|
|
169
|
+
throw new Error(`TFDSL_DECOMPILE_UNSUPPORTED: phase type ${sourceLiteral(p.type)} (id=${p.id}) cannot be decompiled in MVP`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const lines = [];
|
|
173
|
+
const imports = new Set(["flow"]);
|
|
174
|
+
for (const p of phases) {
|
|
175
|
+
const kind = p.type ?? "agent";
|
|
176
|
+
if (kind === "flow")
|
|
177
|
+
imports.add("subflow");
|
|
178
|
+
else
|
|
179
|
+
imports.add(kind);
|
|
180
|
+
if (["map", "parallel", "gate", "reduce", "race"].includes(kind))
|
|
181
|
+
imports.add("agent");
|
|
182
|
+
}
|
|
183
|
+
// Stable import order for golden/tests
|
|
184
|
+
const order = [
|
|
185
|
+
"flow",
|
|
186
|
+
"agent",
|
|
187
|
+
"map",
|
|
188
|
+
"parallel",
|
|
189
|
+
"gate",
|
|
190
|
+
"reduce",
|
|
191
|
+
"approval",
|
|
192
|
+
"subflow",
|
|
193
|
+
"loop",
|
|
194
|
+
"tournament",
|
|
195
|
+
"script",
|
|
196
|
+
"race",
|
|
197
|
+
"expand",
|
|
198
|
+
];
|
|
199
|
+
const importList = order.filter((n) => imports.has(n));
|
|
200
|
+
lines.push(`import { ${importList.join(", ")} } from "taskflow-dsl";`);
|
|
201
|
+
lines.push(``);
|
|
202
|
+
const flowOpts = {};
|
|
203
|
+
for (const key of ["description", "version", "agentScope", "strictInterpolation", "contextSharing", "incremental"]) {
|
|
204
|
+
const value = def[key];
|
|
205
|
+
if (value !== undefined)
|
|
206
|
+
flowOpts[key] = value;
|
|
207
|
+
}
|
|
208
|
+
const flowOptText = Object.keys(flowOpts).length ? `, ${sourceLiteral(flowOpts)}` : "";
|
|
209
|
+
lines.push(`export default flow(${sourceLiteral(def.name)}${flowOptText}, (ctx) => {`);
|
|
210
|
+
if (def.budget) {
|
|
211
|
+
lines.push(` ctx.budget(${sourceLiteral(def.budget)});`);
|
|
212
|
+
}
|
|
213
|
+
if (typeof def.concurrency === "number") {
|
|
214
|
+
lines.push(` ctx.concurrency(${def.concurrency});`);
|
|
215
|
+
}
|
|
216
|
+
if (def.args && typeof def.args === "object") {
|
|
217
|
+
lines.push(` ctx.args.declare(${sourceLiteral(def.args)});`);
|
|
218
|
+
}
|
|
219
|
+
const byId = new Map(inputPhases.map((p) => [p.id, p]));
|
|
220
|
+
const bindings = allocateBindings(inputPhases);
|
|
221
|
+
let returnBind;
|
|
222
|
+
// Rune references are ordinary TypeScript bindings, so every dependency must
|
|
223
|
+
// be declared before its consumer even though Taskflow JSON itself permits
|
|
224
|
+
// phases in any order. Keep binding allocation and implicit-final selection
|
|
225
|
+
// tied to the input order so topological emission changes no semantics.
|
|
226
|
+
for (const p of phases) {
|
|
227
|
+
const bind = bindings.get(p.id);
|
|
228
|
+
if (p.final)
|
|
229
|
+
returnBind = bind;
|
|
230
|
+
const line = decompilePhase(p, bind, byId, bindings);
|
|
231
|
+
lines.push(` ${line}`);
|
|
232
|
+
}
|
|
233
|
+
if (!returnBind && def.phases?.length)
|
|
234
|
+
returnBind = bindings.get(def.phases[def.phases.length - 1].id);
|
|
235
|
+
if (returnBind) {
|
|
236
|
+
lines.push(` return ${returnBind};`);
|
|
237
|
+
}
|
|
238
|
+
lines.push(`});`);
|
|
239
|
+
lines.push(``);
|
|
240
|
+
return lines.join("\n");
|
|
241
|
+
}
|
|
242
|
+
function decompilePhase(p, bind, _byId, bindings) {
|
|
243
|
+
const opts = [];
|
|
244
|
+
if (bind !== p.id)
|
|
245
|
+
opts.push(`id: ${sourceLiteral(p.id)}`);
|
|
246
|
+
const raw = p;
|
|
247
|
+
for (const key of [
|
|
248
|
+
"agent", "model", "thinking", "tools", "cwd", "output", "expect", "when", "join", "dependsOn",
|
|
249
|
+
"retry", "timeout", "optional", "idempotent", "final", "concurrency", "context", "contextLimit",
|
|
250
|
+
"onBlock", "eval", "score", "cache", "shareContext", "convergence", "reflexion",
|
|
251
|
+
]) {
|
|
252
|
+
if (raw[key] !== undefined)
|
|
253
|
+
opts.push(`${key}: ${sourceLiteral(raw[key])}`);
|
|
254
|
+
}
|
|
255
|
+
if (p.cancelLosers === false)
|
|
256
|
+
opts.push(`cancelLosers: false`);
|
|
257
|
+
if (raw.input !== undefined)
|
|
258
|
+
opts.push(`input: ${sourceLiteral(raw.input)}`);
|
|
259
|
+
const maxNodes = p.maxNodes;
|
|
260
|
+
if (typeof maxNodes === "number")
|
|
261
|
+
opts.push(`maxNodes: ${maxNodes}`);
|
|
262
|
+
const optStr = opts.length ? `, { ${opts.join(", ")} }` : "";
|
|
263
|
+
const optObj = `{ ${opts.join(", ")} }`;
|
|
264
|
+
switch (p.type ?? "agent") {
|
|
265
|
+
case "agent":
|
|
266
|
+
return `const ${bind} = agent(${sourceLiteral(String(p.task ?? ""))}${optStr});`;
|
|
267
|
+
case "script": {
|
|
268
|
+
const run = p.run;
|
|
269
|
+
if (Array.isArray(run)) {
|
|
270
|
+
return `const ${bind} = script(${sourceLiteral(run)}${optStr});`;
|
|
271
|
+
}
|
|
272
|
+
return `const ${bind} = script(${sourceLiteral(String(run ?? ""))}${optStr});`;
|
|
273
|
+
}
|
|
274
|
+
case "map": {
|
|
275
|
+
const as = p.as ?? "item";
|
|
276
|
+
const local = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(as) && !RESERVED.has(as) ? as : "item";
|
|
277
|
+
const mapOpts = p.as === undefined ? opts : [`as: ${sourceLiteral(as)}`, ...opts];
|
|
278
|
+
const mapOptStr = mapOpts.length ? `, { ${mapOpts.join(", ")} }` : "";
|
|
279
|
+
return `const ${bind} = map(${sourceLiteral(p.over ?? "[]")}, (${local}) => agent(${sourceLiteral(String(p.task ?? `{${as}}`))})${mapOptStr});`;
|
|
280
|
+
}
|
|
281
|
+
case "parallel": {
|
|
282
|
+
const branches = (p.branches ?? []).map((b, i) => branchSource(b, `parallel ${p.id} branch ${i}`));
|
|
283
|
+
return `const ${bind} = parallel([${branches.join(", ")}]${optStr});`;
|
|
284
|
+
}
|
|
285
|
+
case "gate": {
|
|
286
|
+
const upId = p.dependsOn?.[0];
|
|
287
|
+
const upBind = upId ? bindings.get(upId) : undefined;
|
|
288
|
+
if (!upBind)
|
|
289
|
+
throw new Error(`TFDSL_DECOMPILE_UNSUPPORTED: gate ${sourceLiteral(p.id)} requires a known dependency`);
|
|
290
|
+
if (p.task === undefined)
|
|
291
|
+
return `const ${bind} = gate(${upBind}, ${optObj});`;
|
|
292
|
+
return `const ${bind} = gate(${upBind}, ${optObj}, (i) => ${sourceLiteral(p.task)});`;
|
|
293
|
+
}
|
|
294
|
+
case "race": {
|
|
295
|
+
const branches = (p.branches ?? []).map((b, i) => branchSource(b, `race ${p.id} branch ${i}`));
|
|
296
|
+
return `const ${bind} = race([${branches.join(", ")}]${optStr});`;
|
|
297
|
+
}
|
|
298
|
+
case "expand": {
|
|
299
|
+
if (typeof p.def !== "string") {
|
|
300
|
+
throw new Error(`TFDSL_DECOMPILE_UNSUPPORTED: expand phase ${sourceLiteral(p.id)} has non-string def (inline object cannot be recovered as a rune argument)`);
|
|
301
|
+
}
|
|
302
|
+
const em = p.expandMode ?? "nested";
|
|
303
|
+
// Always emit expandMode + shared opts (dependsOn/final/when/maxNodes) so
|
|
304
|
+
// decompile → rebuild keeps DAG edges that string-def alone would lose.
|
|
305
|
+
const expandOpts = [
|
|
306
|
+
`expandMode: ${sourceLiteral(em)}`,
|
|
307
|
+
...(p.with === undefined ? [] : [`with: ${sourceLiteral(p.with)}`]),
|
|
308
|
+
...opts,
|
|
309
|
+
];
|
|
310
|
+
return `const ${bind} = expand(${sourceLiteral(p.def)}, { ${expandOpts.join(", ")} });`;
|
|
311
|
+
}
|
|
312
|
+
case "reduce": {
|
|
313
|
+
const from = (p.from ?? p.dependsOn ?? []).map((id) => {
|
|
314
|
+
const b = bindings.get(id);
|
|
315
|
+
if (!b)
|
|
316
|
+
throw new Error(`TFDSL_DECOMPILE_UNSUPPORTED: reduce ${sourceLiteral(p.id)} references unknown phase ${sourceLiteral(id)}`);
|
|
317
|
+
return b;
|
|
318
|
+
});
|
|
319
|
+
return `const ${bind} = reduce([${from.join(", ")}], (parts) => agent(${sourceLiteral(String(p.task ?? "reduce"))})${optStr});`;
|
|
320
|
+
}
|
|
321
|
+
case "approval":
|
|
322
|
+
return `const ${bind} = approval({ request: ${sourceLiteral(String(p.task ?? "Approve?"))}${opts.length ? `, ${opts.join(", ")}` : ""} });`;
|
|
323
|
+
case "flow":
|
|
324
|
+
if (p.def !== undefined) {
|
|
325
|
+
if (typeof p.def !== "string") {
|
|
326
|
+
throw new Error(`TFDSL_DECOMPILE_UNSUPPORTED: flow phase ${sourceLiteral(p.id)} has non-string def (cannot decompile inline object)`);
|
|
327
|
+
}
|
|
328
|
+
const defOpts = p.with === undefined ? opts : [`with: ${sourceLiteral(p.with)}`, ...opts];
|
|
329
|
+
const defOptStr = defOpts.length ? `, { ${defOpts.join(", ")} }` : "";
|
|
330
|
+
return `const ${bind} = subflow.def(${sourceLiteral(p.def)}${defOptStr});`;
|
|
331
|
+
}
|
|
332
|
+
return `const ${bind} = subflow(${sourceLiteral(p.use ?? "child")}, ${sourceLiteral(p.with ?? {})}${optStr});`;
|
|
333
|
+
case "loop":
|
|
334
|
+
return `const ${bind} = loop({ task: ${sourceLiteral(String(p.task ?? ""))}, maxIterations: ${p.maxIterations ?? 10}, until: ${sourceLiteral(p.until ?? "false")}${opts.length ? `, ${opts.join(", ")}` : ""} });`;
|
|
335
|
+
case "tournament": {
|
|
336
|
+
const tournamentOpts = [
|
|
337
|
+
...(p.variants === undefined ? [] : [`variants: ${p.variants}`]),
|
|
338
|
+
...(p.task === undefined ? [] : [`task: ${sourceLiteral(p.task)}`]),
|
|
339
|
+
...(p.mode === undefined ? [] : [`mode: ${sourceLiteral(p.mode)}`]),
|
|
340
|
+
...(p.branches === undefined
|
|
341
|
+
? []
|
|
342
|
+
: [`branches: [${p.branches.map((b, i) => branchSource(b, `tournament ${p.id} branch ${i}`)).join(", ")}]`]),
|
|
343
|
+
...(p.judge === undefined ? [] : [`judge: ${sourceLiteral(p.judge)}`]),
|
|
344
|
+
...(p.judgeAgent === undefined ? [] : [`judgeAgent: ${sourceLiteral(p.judgeAgent)}`]),
|
|
345
|
+
...opts,
|
|
346
|
+
];
|
|
347
|
+
return `const ${bind} = tournament({ ${tournamentOpts.join(", ")} });`;
|
|
348
|
+
}
|
|
349
|
+
default:
|
|
350
|
+
return `// TFDSL: unsupported-field type=${p.type} id=${p.id}`;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=decompile.js.map
|