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.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1008 -0
  3. package/dist/build/erase/ast.d.ts +13 -0
  4. package/dist/build/erase/ast.d.ts.map +1 -0
  5. package/dist/build/erase/ast.js +76 -0
  6. package/dist/build/erase/ast.js.map +1 -0
  7. package/dist/build/erase/context.d.ts +18 -0
  8. package/dist/build/erase/context.d.ts.map +1 -0
  9. package/dist/build/erase/context.js +109 -0
  10. package/dist/build/erase/context.js.map +1 -0
  11. package/dist/build/erase/index.d.ts +4 -0
  12. package/dist/build/erase/index.d.ts.map +1 -0
  13. package/dist/build/erase/index.js +2 -0
  14. package/dist/build/erase/index.js.map +1 -0
  15. package/dist/build/erase/kinds/agent-script.d.ts +5 -0
  16. package/dist/build/erase/kinds/agent-script.d.ts.map +1 -0
  17. package/dist/build/erase/kinds/agent-script.js +100 -0
  18. package/dist/build/erase/kinds/agent-script.js.map +1 -0
  19. package/dist/build/erase/kinds/approval.d.ts +4 -0
  20. package/dist/build/erase/kinds/approval.d.ts.map +1 -0
  21. package/dist/build/erase/kinds/approval.js +39 -0
  22. package/dist/build/erase/kinds/approval.js.map +1 -0
  23. package/dist/build/erase/kinds/branch-opts.d.ts +10 -0
  24. package/dist/build/erase/kinds/branch-opts.d.ts.map +1 -0
  25. package/dist/build/erase/kinds/branch-opts.js +21 -0
  26. package/dist/build/erase/kinds/branch-opts.js.map +1 -0
  27. package/dist/build/erase/kinds/expand-flow.d.ts +9 -0
  28. package/dist/build/erase/kinds/expand-flow.d.ts.map +1 -0
  29. package/dist/build/erase/kinds/expand-flow.js +80 -0
  30. package/dist/build/erase/kinds/expand-flow.js.map +1 -0
  31. package/dist/build/erase/kinds/gate-sugar.d.ts +5 -0
  32. package/dist/build/erase/kinds/gate-sugar.d.ts.map +1 -0
  33. package/dist/build/erase/kinds/gate-sugar.js +98 -0
  34. package/dist/build/erase/kinds/gate-sugar.js.map +1 -0
  35. package/dist/build/erase/kinds/gate.d.ts +5 -0
  36. package/dist/build/erase/kinds/gate.d.ts.map +1 -0
  37. package/dist/build/erase/kinds/gate.js +60 -0
  38. package/dist/build/erase/kinds/gate.js.map +1 -0
  39. package/dist/build/erase/kinds/index.d.ts +9 -0
  40. package/dist/build/erase/kinds/index.d.ts.map +1 -0
  41. package/dist/build/erase/kinds/index.js +107 -0
  42. package/dist/build/erase/kinds/index.js.map +1 -0
  43. package/dist/build/erase/kinds/loop.d.ts +4 -0
  44. package/dist/build/erase/kinds/loop.d.ts.map +1 -0
  45. package/dist/build/erase/kinds/loop.js +55 -0
  46. package/dist/build/erase/kinds/loop.js.map +1 -0
  47. package/dist/build/erase/kinds/map.d.ts +4 -0
  48. package/dist/build/erase/kinds/map.d.ts.map +1 -0
  49. package/dist/build/erase/kinds/map.js +117 -0
  50. package/dist/build/erase/kinds/map.js.map +1 -0
  51. package/dist/build/erase/kinds/parallel.d.ts +4 -0
  52. package/dist/build/erase/kinds/parallel.d.ts.map +1 -0
  53. package/dist/build/erase/kinds/parallel.js +62 -0
  54. package/dist/build/erase/kinds/parallel.js.map +1 -0
  55. package/dist/build/erase/kinds/race.d.ts +4 -0
  56. package/dist/build/erase/kinds/race.d.ts.map +1 -0
  57. package/dist/build/erase/kinds/race.js +61 -0
  58. package/dist/build/erase/kinds/race.js.map +1 -0
  59. package/dist/build/erase/kinds/reduce.d.ts +4 -0
  60. package/dist/build/erase/kinds/reduce.d.ts.map +1 -0
  61. package/dist/build/erase/kinds/reduce.js +81 -0
  62. package/dist/build/erase/kinds/reduce.js.map +1 -0
  63. package/dist/build/erase/kinds/tournament.d.ts +4 -0
  64. package/dist/build/erase/kinds/tournament.d.ts.map +1 -0
  65. package/dist/build/erase/kinds/tournament.js +75 -0
  66. package/dist/build/erase/kinds/tournament.js.map +1 -0
  67. package/dist/build/erase/opts.d.ts +18 -0
  68. package/dist/build/erase/opts.d.ts.map +1 -0
  69. package/dist/build/erase/opts.js +241 -0
  70. package/dist/build/erase/opts.js.map +1 -0
  71. package/dist/build/erase/pipeline.d.ts +8 -0
  72. package/dist/build/erase/pipeline.d.ts.map +1 -0
  73. package/dist/build/erase/pipeline.js +420 -0
  74. package/dist/build/erase/pipeline.js.map +1 -0
  75. package/dist/build/erase/templates.d.ts +20 -0
  76. package/dist/build/erase/templates.d.ts.map +1 -0
  77. package/dist/build/erase/templates.js +185 -0
  78. package/dist/build/erase/templates.js.map +1 -0
  79. package/dist/build/erase/types.d.ts +31 -0
  80. package/dist/build/erase/types.d.ts.map +1 -0
  81. package/dist/build/erase/types.js +28 -0
  82. package/dist/build/erase/types.js.map +1 -0
  83. package/dist/build/erase.d.ts +4 -0
  84. package/dist/build/erase.d.ts.map +1 -0
  85. package/dist/build/erase.js +2 -0
  86. package/dist/build/erase.js.map +1 -0
  87. package/dist/build.d.ts +26 -0
  88. package/dist/build.d.ts.map +1 -0
  89. package/dist/build.js +200 -0
  90. package/dist/build.js.map +1 -0
  91. package/dist/check.d.ts +21 -0
  92. package/dist/check.d.ts.map +1 -0
  93. package/dist/check.js +42 -0
  94. package/dist/check.js.map +1 -0
  95. package/dist/cli.d.ts +6 -0
  96. package/dist/cli.d.ts.map +1 -0
  97. package/dist/cli.js +279 -0
  98. package/dist/cli.js.map +1 -0
  99. package/dist/decompile.d.ts +7 -0
  100. package/dist/decompile.d.ts.map +1 -0
  101. package/dist/decompile.js +353 -0
  102. package/dist/decompile.js.map +1 -0
  103. package/dist/diagnostics.d.ts +27 -0
  104. package/dist/diagnostics.d.ts.map +1 -0
  105. package/dist/diagnostics.js +17 -0
  106. package/dist/diagnostics.js.map +1 -0
  107. package/dist/index.d.ts +7 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +6 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/new-skeleton.d.ts +4 -0
  112. package/dist/new-skeleton.d.ts.map +1 -0
  113. package/dist/new-skeleton.js +22 -0
  114. package/dist/new-skeleton.js.map +1 -0
  115. package/dist/paths.d.ts +28 -0
  116. package/dist/paths.d.ts.map +1 -0
  117. package/dist/paths.js +153 -0
  118. package/dist/paths.js.map +1 -0
  119. package/dist/runes.d.ts +175 -0
  120. package/dist/runes.d.ts.map +1 -0
  121. package/dist/runes.js +83 -0
  122. package/dist/runes.js.map +1 -0
  123. package/dist/typecheck.d.ts +6 -0
  124. package/dist/typecheck.d.ts.map +1 -0
  125. package/dist/typecheck.js +62 -0
  126. package/dist/typecheck.js.map +1 -0
  127. 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
@@ -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