toad-compiler 0.1.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 (114) hide show
  1. package/LICENSE +21 -0
  2. package/dist/analyze.d.ts +13 -0
  3. package/dist/analyze.d.ts.map +1 -0
  4. package/dist/analyze.js +20 -0
  5. package/dist/analyze.js.map +1 -0
  6. package/dist/analyze.test.d.ts +2 -0
  7. package/dist/analyze.test.d.ts.map +1 -0
  8. package/dist/analyze.test.js +45 -0
  9. package/dist/analyze.test.js.map +1 -0
  10. package/dist/ast.d.ts +63 -0
  11. package/dist/ast.d.ts.map +1 -0
  12. package/dist/ast.js +6 -0
  13. package/dist/ast.js.map +1 -0
  14. package/dist/bin.d.ts +3 -0
  15. package/dist/bin.d.ts.map +1 -0
  16. package/dist/bin.js +7 -0
  17. package/dist/bin.js.map +1 -0
  18. package/dist/cli.d.ts +11 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +93 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/cli.test.d.ts +2 -0
  23. package/dist/cli.test.d.ts.map +1 -0
  24. package/dist/cli.test.js +54 -0
  25. package/dist/cli.test.js.map +1 -0
  26. package/dist/codegen.d.ts +9 -0
  27. package/dist/codegen.d.ts.map +1 -0
  28. package/dist/codegen.js +152 -0
  29. package/dist/codegen.js.map +1 -0
  30. package/dist/codegen.test.d.ts +2 -0
  31. package/dist/codegen.test.d.ts.map +1 -0
  32. package/dist/codegen.test.js +76 -0
  33. package/dist/codegen.test.js.map +1 -0
  34. package/dist/controlflow.test.d.ts +2 -0
  35. package/dist/controlflow.test.d.ts.map +1 -0
  36. package/dist/controlflow.test.js +75 -0
  37. package/dist/controlflow.test.js.map +1 -0
  38. package/dist/diagnostics.d.ts +24 -0
  39. package/dist/diagnostics.d.ts.map +1 -0
  40. package/dist/diagnostics.js +26 -0
  41. package/dist/diagnostics.js.map +1 -0
  42. package/dist/each.test.d.ts +2 -0
  43. package/dist/each.test.d.ts.map +1 -0
  44. package/dist/each.test.js +82 -0
  45. package/dist/each.test.js.map +1 -0
  46. package/dist/env.test.d.ts +2 -0
  47. package/dist/env.test.d.ts.map +1 -0
  48. package/dist/env.test.js +27 -0
  49. package/dist/env.test.js.map +1 -0
  50. package/dist/example.test.d.ts +2 -0
  51. package/dist/example.test.d.ts.map +1 -0
  52. package/dist/example.test.js +19 -0
  53. package/dist/example.test.js.map +1 -0
  54. package/dist/if.test.d.ts +2 -0
  55. package/dist/if.test.d.ts.map +1 -0
  56. package/dist/if.test.js +72 -0
  57. package/dist/if.test.js.map +1 -0
  58. package/dist/index.d.ts +17 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +22 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/index.test.d.ts +2 -0
  63. package/dist/index.test.d.ts.map +1 -0
  64. package/dist/index.test.js +19 -0
  65. package/dist/index.test.js.map +1 -0
  66. package/dist/interpolate.d.ts +18 -0
  67. package/dist/interpolate.d.ts.map +1 -0
  68. package/dist/interpolate.js +237 -0
  69. package/dist/interpolate.js.map +1 -0
  70. package/dist/interpolate.test.d.ts +2 -0
  71. package/dist/interpolate.test.d.ts.map +1 -0
  72. package/dist/interpolate.test.js +35 -0
  73. package/dist/interpolate.test.js.map +1 -0
  74. package/dist/lifecycle.test.d.ts +2 -0
  75. package/dist/lifecycle.test.d.ts.map +1 -0
  76. package/dist/lifecycle.test.js +26 -0
  77. package/dist/lifecycle.test.js.map +1 -0
  78. package/dist/objecttypes.test.d.ts +2 -0
  79. package/dist/objecttypes.test.d.ts.map +1 -0
  80. package/dist/objecttypes.test.js +83 -0
  81. package/dist/objecttypes.test.js.map +1 -0
  82. package/dist/preprocess.d.ts +20 -0
  83. package/dist/preprocess.d.ts.map +1 -0
  84. package/dist/preprocess.js +98 -0
  85. package/dist/preprocess.js.map +1 -0
  86. package/dist/preprocess.test.d.ts +2 -0
  87. package/dist/preprocess.test.d.ts.map +1 -0
  88. package/dist/preprocess.test.js +58 -0
  89. package/dist/preprocess.test.js.map +1 -0
  90. package/dist/system.test.d.ts +2 -0
  91. package/dist/system.test.d.ts.map +1 -0
  92. package/dist/system.test.js +35 -0
  93. package/dist/system.test.js.map +1 -0
  94. package/dist/toon.d.ts +16 -0
  95. package/dist/toon.d.ts.map +1 -0
  96. package/dist/toon.js +32 -0
  97. package/dist/toon.js.map +1 -0
  98. package/dist/toon.test.d.ts +2 -0
  99. package/dist/toon.test.d.ts.map +1 -0
  100. package/dist/toon.test.js +50 -0
  101. package/dist/toon.test.js.map +1 -0
  102. package/dist/uses.test.d.ts +2 -0
  103. package/dist/uses.test.d.ts.map +1 -0
  104. package/dist/uses.test.js +32 -0
  105. package/dist/uses.test.js.map +1 -0
  106. package/dist/validate.d.ts +14 -0
  107. package/dist/validate.d.ts.map +1 -0
  108. package/dist/validate.js +351 -0
  109. package/dist/validate.js.map +1 -0
  110. package/dist/validate.test.d.ts +2 -0
  111. package/dist/validate.test.d.ts.map +1 -0
  112. package/dist/validate.test.js +64 -0
  113. package/dist/validate.test.js.map +1 -0
  114. package/package.json +59 -0
@@ -0,0 +1,237 @@
1
+ const PATH = /^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;
2
+ const EACH = /^#each\s+([A-Za-z_][A-Za-z0-9_.]*)\s+as\s+(\{[^}]*\}|[A-Za-z_][A-Za-z0-9_]*)(?:\s*,\s*([A-Za-z_][A-Za-z0-9_]*))?$/;
3
+ const IF = /^#if\s+(!?)\s*([A-Za-z_][A-Za-z0-9_.]*)$/;
4
+ const ELSE_IF = /^:else if\s+(!?)\s*([A-Za-z_][A-Za-z0-9_.]*)$/;
5
+ /**
6
+ * Parse a prompt string into segments. Supports:
7
+ * - `{ a.b }` / `{ env.X }` interpolation
8
+ * - `{#each xs as x, i}…{:else}…{/each}` loop (index + empty fallback)
9
+ * - `{#if a}…{:else if b}…{:else}…{/if}` conditional chain
10
+ * - `{{` / `}}` literal braces
11
+ *
12
+ * `{:else if}` desugars to a nested `{#if}` in the else branch, so the `if`
13
+ * segment stays a simple then/else. Block directives are control lines (the
14
+ * newline immediately after each is consumed). Validation happens in `validate`.
15
+ */
16
+ export function parsePromptTemplate(text) {
17
+ const errors = [];
18
+ const root = [];
19
+ const stack = [{ kind: "root", segs: root }];
20
+ let buf = "";
21
+ const top = () => stack[stack.length - 1];
22
+ const flush = () => {
23
+ if (buf.length > 0) {
24
+ top().segs.push({ kind: "text", value: buf });
25
+ buf = "";
26
+ }
27
+ };
28
+ const eatNewline = (i) => (text[i] === "\n" ? i + 1 : i);
29
+ let i = 0;
30
+ while (i < text.length) {
31
+ const ch = text[i];
32
+ const next = text[i + 1];
33
+ if (ch === "{" && next === "{") {
34
+ buf += "{";
35
+ i += 2;
36
+ continue;
37
+ }
38
+ if (ch === "}" && next === "}") {
39
+ buf += "}";
40
+ i += 2;
41
+ continue;
42
+ }
43
+ if (ch === "{") {
44
+ // Find the matching close brace, allowing one nested `{...}` (e.g. a
45
+ // destructure pattern in `{#each xs as {a, b}}`).
46
+ let end = -1;
47
+ let depth = 0;
48
+ for (let j = i; j < text.length; j++) {
49
+ if (text[j] === "{") {
50
+ depth += 1;
51
+ }
52
+ else if (text[j] === "}") {
53
+ depth -= 1;
54
+ if (depth === 0) {
55
+ end = j;
56
+ break;
57
+ }
58
+ }
59
+ }
60
+ if (end === -1) {
61
+ errors.push("unterminated interpolation: missing '}'");
62
+ buf += ch;
63
+ i += 1;
64
+ continue;
65
+ }
66
+ const inner = text.slice(i + 1, end).trim();
67
+ if (inner.startsWith("#each")) {
68
+ const m = EACH.exec(inner);
69
+ if (!m) {
70
+ errors.push(`invalid {#each}: {${inner}} (use {#each inputs.xs as x} or {#each inputs.xs as x, i})`);
71
+ i = end + 1;
72
+ continue;
73
+ }
74
+ flush();
75
+ const body = [];
76
+ const bind = m[2];
77
+ const item = bind.startsWith("{")
78
+ ? {
79
+ kind: "destructure",
80
+ fields: bind
81
+ .slice(1, -1)
82
+ .split(",")
83
+ .map((s) => s.trim())
84
+ .filter((s) => s.length > 0),
85
+ }
86
+ : { kind: "name", name: bind };
87
+ const frame = {
88
+ kind: "each",
89
+ segs: body,
90
+ source: m[1].split("."),
91
+ item,
92
+ body,
93
+ elseSegs: [],
94
+ };
95
+ if (m[3] !== undefined) {
96
+ frame.index = m[3];
97
+ }
98
+ stack.push(frame);
99
+ i = eatNewline(end + 1);
100
+ continue;
101
+ }
102
+ if (inner.startsWith("#if")) {
103
+ const m = IF.exec(inner);
104
+ if (!m) {
105
+ errors.push(`invalid {#if}: {${inner}} (use {#if inputs.flag} or {#if !inputs.flag})`);
106
+ i = end + 1;
107
+ continue;
108
+ }
109
+ flush();
110
+ const first = {
111
+ cond: m[2].split("."),
112
+ negate: m[1] === "!",
113
+ body: [],
114
+ };
115
+ stack.push({
116
+ kind: "if",
117
+ segs: first.body,
118
+ branches: [first],
119
+ elseSegs: [],
120
+ });
121
+ i = eatNewline(end + 1);
122
+ continue;
123
+ }
124
+ if (inner.startsWith(":else if")) {
125
+ const m = ELSE_IF.exec(inner);
126
+ const frame = top();
127
+ if (!m) {
128
+ errors.push(`invalid {:else if}: {${inner}}`);
129
+ i = end + 1;
130
+ continue;
131
+ }
132
+ if (frame.kind !== "if") {
133
+ errors.push("unexpected {:else if}");
134
+ i = end + 1;
135
+ continue;
136
+ }
137
+ flush();
138
+ const branch = {
139
+ cond: m[2].split("."),
140
+ negate: m[1] === "!",
141
+ body: [],
142
+ };
143
+ frame.branches.push(branch);
144
+ frame.segs = branch.body;
145
+ i = eatNewline(end + 1);
146
+ continue;
147
+ }
148
+ if (inner === ":else") {
149
+ flush();
150
+ const frame = top();
151
+ if (frame.kind !== "if" && frame.kind !== "each") {
152
+ errors.push("unexpected {:else}");
153
+ i = end + 1;
154
+ continue;
155
+ }
156
+ frame.segs = frame.elseSegs;
157
+ i = eatNewline(end + 1);
158
+ continue;
159
+ }
160
+ if (inner === "/each") {
161
+ flush();
162
+ const frame = top();
163
+ if (frame.kind !== "each") {
164
+ errors.push("unexpected {/each}");
165
+ i = end + 1;
166
+ continue;
167
+ }
168
+ stack.pop();
169
+ const seg = {
170
+ kind: "each",
171
+ source: frame.source,
172
+ item: frame.item,
173
+ body: frame.body,
174
+ };
175
+ if (frame.index !== undefined) {
176
+ seg.index = frame.index;
177
+ }
178
+ if (frame.elseSegs.length > 0) {
179
+ seg.else = frame.elseSegs;
180
+ }
181
+ top().segs.push(seg);
182
+ i = eatNewline(end + 1);
183
+ continue;
184
+ }
185
+ if (inner === "/if") {
186
+ flush();
187
+ const frame = top();
188
+ if (frame.kind !== "if") {
189
+ errors.push("unexpected {/if}");
190
+ i = end + 1;
191
+ continue;
192
+ }
193
+ stack.pop();
194
+ // Fold the branch chain into nested if/else segments.
195
+ let elseChain = frame.elseSegs;
196
+ const branches = frame.branches;
197
+ for (let k = branches.length - 1; k >= 0; k--) {
198
+ const branch = branches[k];
199
+ const ifSeg = {
200
+ kind: "if",
201
+ cond: branch.cond,
202
+ negate: branch.negate,
203
+ then: branch.body,
204
+ else: elseChain,
205
+ };
206
+ elseChain = [ifSeg];
207
+ }
208
+ top().segs.push(elseChain[0]);
209
+ i = eatNewline(end + 1);
210
+ continue;
211
+ }
212
+ if (inner === "" || !PATH.test(inner)) {
213
+ errors.push(`invalid interpolation: {${inner}}`);
214
+ i = end + 1;
215
+ continue;
216
+ }
217
+ flush();
218
+ top().segs.push({ kind: "interp", path: inner.split(".") });
219
+ i = end + 1;
220
+ continue;
221
+ }
222
+ if (ch === "}") {
223
+ errors.push("unexpected '}' (use '}}' for a literal brace)");
224
+ buf += ch;
225
+ i += 1;
226
+ continue;
227
+ }
228
+ buf += ch;
229
+ i += 1;
230
+ }
231
+ flush();
232
+ if (stack.length > 1) {
233
+ errors.push("unclosed block (missing {/each} or {/if})");
234
+ }
235
+ return { segments: root, errors };
236
+ }
237
+ //# sourceMappingURL=interpolate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolate.js","sourceRoot":"","sources":["../src/interpolate.ts"],"names":[],"mappings":"AAUA,MAAM,IAAI,GAAG,uDAAuD,CAAC;AACrE,MAAM,IAAI,GACR,mHAAmH,CAAC;AACtH,MAAM,EAAE,GAAG,0CAA0C,CAAC;AACtD,MAAM,OAAO,GAAG,+CAA+C,CAAC;AAuBhE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAoB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,IAAI,GAAG,GAAG,EAAE,CAAC;IAEb,MAAM,GAAG,GAAG,GAAU,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAClD,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9C,GAAG,GAAG,EAAE,CAAC;QACX,CAAC;IACH,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzE,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzB,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC/B,GAAG,IAAI,GAAG,CAAC;YACX,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC/B,GAAG,IAAI,GAAG,CAAC;YACX,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,qEAAqE;YACrE,kDAAkD;YAClD,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;YACb,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACpB,KAAK,IAAI,CAAC,CAAC;gBACb,CAAC;qBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAC3B,KAAK,IAAI,CAAC,CAAC;oBACX,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;wBAChB,GAAG,GAAG,CAAC,CAAC;wBACR,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;gBACvD,GAAG,IAAI,EAAE,CAAC;gBACV,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAE5C,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC3B,IAAI,CAAC,CAAC,EAAE,CAAC;oBACP,MAAM,CAAC,IAAI,CACT,qBAAqB,KAAK,6DAA6D,CACxF,CAAC;oBACF,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;oBACZ,SAAS;gBACX,CAAC;gBACD,KAAK,EAAE,CAAC;gBACR,MAAM,IAAI,GAAoB,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;gBACnB,MAAM,IAAI,GAAa,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBACzC,CAAC,CAAC;wBACE,IAAI,EAAE,aAAa;wBACnB,MAAM,EAAE,IAAI;6BACT,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;6BACZ,KAAK,CAAC,GAAG,CAAC;6BACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;6BACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;qBAC/B;oBACH,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAU;oBACnB,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC;oBACxB,IAAI;oBACJ,IAAI;oBACJ,QAAQ,EAAE,EAAE;iBACb,CAAC;gBACF,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;oBACvB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrB,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzB,IAAI,CAAC,CAAC,EAAE,CAAC;oBACP,MAAM,CAAC,IAAI,CACT,mBAAmB,KAAK,iDAAiD,CAC1E,CAAC;oBACF,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;oBACZ,SAAS;gBACX,CAAC;gBACD,KAAK,EAAE,CAAC;gBACR,MAAM,KAAK,GAAW;oBACpB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC;oBACtB,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;oBACpB,IAAI,EAAE,EAAE;iBACT,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,QAAQ,EAAE,CAAC,KAAK,CAAC;oBACjB,QAAQ,EAAE,EAAE;iBACb,CAAC,CAAC;gBACH,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,CAAC,EAAE,CAAC;oBACP,MAAM,CAAC,IAAI,CAAC,wBAAwB,KAAK,GAAG,CAAC,CAAC;oBAC9C,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;oBACZ,SAAS;gBACX,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;oBACrC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;oBACZ,SAAS;gBACX,CAAC;gBACD,KAAK,EAAE,CAAC;gBACR,MAAM,MAAM,GAAW;oBACrB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC;oBACtB,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;oBACpB,IAAI,EAAE,EAAE;iBACT,CAAC;gBACF,KAAK,CAAC,QAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7B,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;gBACzB,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtB,KAAK,EAAE,CAAC;gBACR,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACjD,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBAClC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;oBACZ,SAAS;gBACX,CAAC;gBACD,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAS,CAAC;gBAC7B,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtB,KAAK,EAAE,CAAC;gBACR,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;oBAClC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;oBACZ,SAAS;gBACX,CAAC;gBACD,KAAK,CAAC,GAAG,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAY;oBACnB,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,KAAK,CAAC,MAAO;oBACrB,IAAI,EAAE,KAAK,CAAC,IAAK;oBACjB,IAAI,EAAE,KAAK,CAAC,IAAK;iBAClB,CAAC;gBACF,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC9B,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBAC1B,CAAC;gBACD,IAAI,KAAK,CAAC,QAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/B,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAC5B,CAAC;gBACD,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBACpB,KAAK,EAAE,CAAC;gBACR,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;oBAChC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;oBACZ,SAAS;gBACX,CAAC;gBACD,KAAK,CAAC,GAAG,EAAE,CAAC;gBACZ,sDAAsD;gBACtD,IAAI,SAAS,GAAoB,KAAK,CAAC,QAAS,CAAC;gBACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAS,CAAC;gBACjC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;oBAC5B,MAAM,KAAK,GAAU;wBACnB,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,IAAI,EAAE,SAAS;qBAChB,CAAC;oBACF,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;gBACD,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC;gBAC/B,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,2BAA2B,KAAK,GAAG,CAAC,CAAC;gBACjD,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;gBACZ,SAAS;YACX,CAAC;YACD,KAAK,EAAE,CAAC;YACR,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5D,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC7D,GAAG,IAAI,EAAE,CAAC;YACV,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,GAAG,IAAI,EAAE,CAAC;QACV,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IAED,KAAK,EAAE,CAAC;IACR,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interpolate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolate.test.d.ts","sourceRoot":"","sources":["../src/interpolate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parsePromptTemplate } from "./interpolate.js";
3
+ describe("parsePromptTemplate", () => {
4
+ it("splits text and interpolations", () => {
5
+ expect(parsePromptTemplate("Research: {inputs.topic} now")).toEqual({
6
+ segments: [
7
+ { kind: "text", value: "Research: " },
8
+ { kind: "interp", path: ["inputs", "topic"] },
9
+ { kind: "text", value: " now" },
10
+ ],
11
+ errors: [],
12
+ });
13
+ });
14
+ it("treats {{ and }} as literal braces", () => {
15
+ expect(parsePromptTemplate("use {{braces}} please")).toEqual({
16
+ segments: [{ kind: "text", value: "use {braces} please" }],
17
+ errors: [],
18
+ });
19
+ });
20
+ it("trims whitespace inside an interpolation", () => {
21
+ expect(parsePromptTemplate("{ inputs.topic }").segments).toEqual([
22
+ { kind: "interp", path: ["inputs", "topic"] },
23
+ ]);
24
+ });
25
+ it("reports an unterminated interpolation", () => {
26
+ const { errors } = parsePromptTemplate("hello {inputs.topic");
27
+ expect(errors).toHaveLength(1);
28
+ expect(errors[0]).toMatch(/unterminated/);
29
+ });
30
+ it("reports an empty/invalid interpolation", () => {
31
+ expect(parsePromptTemplate("{}").errors).toHaveLength(1);
32
+ expect(parsePromptTemplate("{1bad}").errors).toHaveLength(1);
33
+ });
34
+ });
35
+ //# sourceMappingURL=interpolate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpolate.test.js","sourceRoot":"","sources":["../src/interpolate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,mBAAmB,CAAC,8BAA8B,CAAC,CAAC,CAAC,OAAO,CAAC;YAClE,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE;gBACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;gBAC7C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAChC;YACD,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3D,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;YAC1D,MAAM,EAAE,EAAE;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YAC/D,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;SAC9C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lifecycle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.test.d.ts","sourceRoot":"","sources":["../src/lifecycle.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { analyze } from "./analyze.js";
3
+ import { generate } from "./codegen.js";
4
+ function agent(extra) {
5
+ return ["agent: a", "model: m", ...extra, "prompt: |", " hi"].join("\n");
6
+ }
7
+ describe("lifecycle knobs (maxTurns / retries)", () => {
8
+ it("emits maxTurns and retries into createAgent", () => {
9
+ const { ast, diagnostics } = analyze(agent(["maxTurns: 3", "retries: 2"]), "a.agent");
10
+ expect(diagnostics).toEqual([]);
11
+ const code = generate(ast);
12
+ expect(code).toContain("maxTurns: 3,");
13
+ expect(code).toContain("retries: 2,");
14
+ });
15
+ it("omits them when not declared", () => {
16
+ const { ast } = analyze(agent([]), "a.agent");
17
+ const code = generate(ast);
18
+ expect(code).not.toContain("maxTurns:");
19
+ expect(code).not.toContain("retries:");
20
+ });
21
+ it("rejects a negative retries (TOA206)", () => {
22
+ const { diagnostics } = analyze(agent(["retries: -1"]), "a.agent");
23
+ expect(diagnostics.map((d) => d.code)).toContain("TOA206");
24
+ });
25
+ });
26
+ //# sourceMappingURL=lifecycle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.test.js","sourceRoot":"","sources":["../src/lifecycle.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,SAAS,KAAK,CAAC,KAAe;IAC5B,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5E,CAAC;AAED,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,CAClC,KAAK,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,EACpC,SAAS,CACV,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACnE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=objecttypes.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objecttypes.test.d.ts","sourceRoot":"","sources":["../src/objecttypes.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,83 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { analyze } from "./analyze.js";
3
+ import { generate } from "./codegen.js";
4
+ describe("object types", () => {
5
+ it("compiles an object[] input with field access in {#each}", () => {
6
+ const src = [
7
+ "agent: report",
8
+ "model: m",
9
+ "inputs[1]{name,type}:",
10
+ ' rows,"{title:string;score:number}[]"',
11
+ "prompt: |",
12
+ " {#each inputs.rows as r}",
13
+ " {r.title}: {r.score}",
14
+ " {/each}",
15
+ ].join("\n");
16
+ const { ast, diagnostics } = analyze(src, "report.agent");
17
+ expect(diagnostics).toEqual([]);
18
+ const code = generate(ast);
19
+ expect(code).toContain("rows: { title: string; score: number }[];");
20
+ expect(code).toContain("z.array(z.object({ title: z.string(), score: z.number() }))");
21
+ expect(code).toContain("inputs.rows.map((r) => `");
22
+ expect(code).toContain("${r.title}");
23
+ });
24
+ it("supports field access on a scalar object input", () => {
25
+ const src = [
26
+ "agent: greet",
27
+ "model: m",
28
+ "inputs[1]{name,type}:",
29
+ ' user,"{name:string;age:number}"',
30
+ "prompt: |",
31
+ " Hello {inputs.user.name}",
32
+ ].join("\n");
33
+ const { ast, diagnostics } = analyze(src, "greet.agent");
34
+ expect(diagnostics).toEqual([]);
35
+ expect(generate(ast)).toContain("${inputs.user.name}");
36
+ });
37
+ it("rejects access to a missing field (TOA301)", () => {
38
+ const src = [
39
+ "agent: a",
40
+ "model: m",
41
+ "inputs[1]{name,type}:",
42
+ ' rows,"{title:string}[]"',
43
+ "prompt: |",
44
+ " {#each inputs.rows as r}",
45
+ " {r.nope}",
46
+ " {/each}",
47
+ ].join("\n");
48
+ const { diagnostics } = analyze(src, "a.agent");
49
+ expect(diagnostics.map((d) => d.code)).toContain("TOA301");
50
+ });
51
+ it("destructures object array elements in {#each}", () => {
52
+ const src = [
53
+ "agent: a",
54
+ "model: m",
55
+ "inputs[1]{name,type}:",
56
+ ' rows,"{title:string;score:number}[]"',
57
+ "prompt: |",
58
+ " {#each inputs.rows as { title, score }}",
59
+ " {title}: {score}",
60
+ " {/each}",
61
+ ].join("\n");
62
+ const { ast, diagnostics } = analyze(src, "a.agent");
63
+ expect(diagnostics).toEqual([]);
64
+ const code = generate(ast);
65
+ expect(code).toContain("inputs.rows.map(({ title, score }) => `");
66
+ expect(code).toContain("${title}");
67
+ });
68
+ it("rejects destructuring a missing field (TOA306)", () => {
69
+ const src = [
70
+ "agent: a",
71
+ "model: m",
72
+ "inputs[1]{name,type}:",
73
+ ' rows,"{title:string}[]"',
74
+ "prompt: |",
75
+ " {#each inputs.rows as { title, nope }}",
76
+ " {title}",
77
+ " {/each}",
78
+ ].join("\n");
79
+ const { diagnostics } = analyze(src, "a.agent");
80
+ expect(diagnostics.map((d) => d.code)).toContain("TOA306");
81
+ });
82
+ });
83
+ //# sourceMappingURL=objecttypes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objecttypes.test.js","sourceRoot":"","sources":["../src/objecttypes.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Diagnostic } from "./diagnostics.js";
2
+ export interface PreprocessResult {
3
+ /** Valid TOON text, with Toa superset sugar (block scalars) lowered. */
4
+ toon: string;
5
+ /** Depth-0 key -> 1-based source line, for locating later diagnostics. */
6
+ keyLines: Map<string, number>;
7
+ diagnostics: Diagnostic[];
8
+ }
9
+ /**
10
+ * Lower the Toa superset to valid TOON. The only MVP extension is the block
11
+ * scalar `key: |`, whose indented body is captured, dedented, TOON-escaped, and
12
+ * re-emitted as a quoted string — so the real `@toon-format/toon` decoder parses
13
+ * the result while authors still write clean multi-line prompts. See
14
+ * `_bmad-output/architecture.md` §3.①.
15
+ *
16
+ * Indentation is space-based (TOON forbids tabs in indentation). Plain `|` only;
17
+ * trailing blank lines are stripped, internal blank lines preserved.
18
+ */
19
+ export declare function preprocess(source: string, _file: string): PreprocessResult;
20
+ //# sourceMappingURL=preprocess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess.d.ts","sourceRoot":"","sources":["../src/preprocess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAKD;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAqD1E"}
@@ -0,0 +1,98 @@
1
+ const BLOCK_HEADER = /^([A-Za-z_][A-Za-z0-9_.]*|"(?:[^"\\]|\\.)*"): *\| *$/;
2
+ const TOP_LEVEL_KEY = /^([A-Za-z_][A-Za-z0-9_.]*|"(?:[^"\\]|\\.)*"):/;
3
+ /**
4
+ * Lower the Toa superset to valid TOON. The only MVP extension is the block
5
+ * scalar `key: |`, whose indented body is captured, dedented, TOON-escaped, and
6
+ * re-emitted as a quoted string — so the real `@toon-format/toon` decoder parses
7
+ * the result while authors still write clean multi-line prompts. See
8
+ * `_bmad-output/architecture.md` §3.①.
9
+ *
10
+ * Indentation is space-based (TOON forbids tabs in indentation). Plain `|` only;
11
+ * trailing blank lines are stripped, internal blank lines preserved.
12
+ */
13
+ export function preprocess(source, _file) {
14
+ const lines = source.replace(/\r\n/g, "\n").split("\n");
15
+ const out = [];
16
+ const keyLines = new Map();
17
+ const diagnostics = [];
18
+ let i = 0;
19
+ while (i < lines.length) {
20
+ const raw = lines[i] ?? "";
21
+ const indent = leadingSpaces(raw);
22
+ const content = raw.slice(indent);
23
+ if (indent === 0) {
24
+ const keyMatch = TOP_LEVEL_KEY.exec(content);
25
+ if (keyMatch && !keyLines.has(keyMatch[1])) {
26
+ keyLines.set(keyMatch[1], i + 1);
27
+ }
28
+ }
29
+ const header = BLOCK_HEADER.exec(content);
30
+ if (header) {
31
+ const key = header[1];
32
+ const body = [];
33
+ let j = i + 1;
34
+ for (; j < lines.length; j++) {
35
+ const line = lines[j] ?? "";
36
+ if (line.trim() === "" || leadingSpaces(line) > indent) {
37
+ body.push(line);
38
+ }
39
+ else {
40
+ break;
41
+ }
42
+ }
43
+ while (body.length > 0 && (body[body.length - 1] ?? "").trim() === "") {
44
+ body.pop();
45
+ }
46
+ const nonBlankIndents = body
47
+ .filter((l) => l.trim() !== "")
48
+ .map(leadingSpaces);
49
+ const base = nonBlankIndents.length > 0 ? Math.min(...nonBlankIndents) : 0;
50
+ const text = body
51
+ .map((l) => (l.trim() === "" ? "" : l.slice(base)))
52
+ .join("\n");
53
+ out.push(`${" ".repeat(indent)}${key}: "${toonEscape(text)}"`);
54
+ i = j;
55
+ continue;
56
+ }
57
+ out.push(raw);
58
+ i++;
59
+ }
60
+ return { toon: out.join("\n"), keyLines, diagnostics };
61
+ }
62
+ function leadingSpaces(line) {
63
+ let n = 0;
64
+ while (n < line.length && line[n] === " ") {
65
+ n++;
66
+ }
67
+ return n;
68
+ }
69
+ /** Escape a string as a TOON quoted-string body (spec §7.1 escape set). */
70
+ function toonEscape(s) {
71
+ let out = "";
72
+ for (const ch of s) {
73
+ const code = ch.codePointAt(0) ?? 0;
74
+ if (ch === "\\") {
75
+ out += "\\\\";
76
+ }
77
+ else if (ch === '"') {
78
+ out += '\\"';
79
+ }
80
+ else if (ch === "\n") {
81
+ out += "\\n";
82
+ }
83
+ else if (ch === "\r") {
84
+ out += "\\r";
85
+ }
86
+ else if (ch === "\t") {
87
+ out += "\\t";
88
+ }
89
+ else if (code < 0x20) {
90
+ out += `\\u${code.toString(16).padStart(4, "0")}`;
91
+ }
92
+ else {
93
+ out += ch;
94
+ }
95
+ }
96
+ return out;
97
+ }
98
+ //# sourceMappingURL=preprocess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess.js","sourceRoot":"","sources":["../src/preprocess.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=preprocess.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess.test.d.ts","sourceRoot":"","sources":["../src/preprocess.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { preprocess } from "./preprocess.js";
3
+ import { decodeToon } from "./toon.js";
4
+ /** Lower the Toa superset, then decode the resulting TOON — the front-end so far. */
5
+ function lowerAndDecode(src) {
6
+ const pre = preprocess(src, "t.agent");
7
+ expect(pre.diagnostics).toEqual([]);
8
+ const dec = decodeToon(pre.toon, "t.agent");
9
+ expect(dec.diagnostics).toEqual([]);
10
+ return dec.value;
11
+ }
12
+ describe("preprocess — block-scalar lowering", () => {
13
+ it("passes through source with no block scalars unchanged", () => {
14
+ const src = "agent: x\nmodel: y";
15
+ expect(preprocess(src, "t.agent").toon).toBe(src);
16
+ });
17
+ it("lowers a prompt block and decodes to the multi-line string", () => {
18
+ const src = [
19
+ "agent: researcher",
20
+ "prompt: |",
21
+ " Research: {inputs.topic}",
22
+ " Return a summary.",
23
+ "model: claude-opus-4-7",
24
+ ].join("\n");
25
+ expect(lowerAndDecode(src)).toEqual({
26
+ agent: "researcher",
27
+ prompt: "Research: {inputs.topic}\nReturn a summary.",
28
+ model: "claude-opus-4-7",
29
+ });
30
+ });
31
+ it("preserves quotes and colons inside the block (escaped, round-trips)", () => {
32
+ const src = ["prompt: |", ' He said "hi": go'].join("\n");
33
+ expect(lowerAndDecode(src)).toEqual({ prompt: 'He said "hi": go' });
34
+ });
35
+ it("keeps internal blank lines and strips trailing ones", () => {
36
+ const src = ["prompt: |", " line1", "", " line3", ""].join("\n");
37
+ expect(lowerAndDecode(src)).toEqual({ prompt: "line1\n\nline3" });
38
+ });
39
+ it("dedents by the block's minimum indentation, preserving relative indent", () => {
40
+ const src = ["prompt: |", " - a", " - b"].join("\n");
41
+ expect(lowerAndDecode(src)).toEqual({ prompt: "- a\n - b" });
42
+ });
43
+ it("treats an empty block as an empty string", () => {
44
+ expect(lowerAndDecode("prompt: |")).toEqual({ prompt: "" });
45
+ });
46
+ it("does not misfire on a value that merely contains a pipe", () => {
47
+ const src = 'sep: "|"';
48
+ expect(preprocess(src, "t.agent").toon).toBe(src);
49
+ expect(decodeToon(src, "t.agent").value).toEqual({ sep: "|" });
50
+ });
51
+ it("records 1-based line numbers for top-level keys", () => {
52
+ const pre = preprocess("agent: a\nmodel: m\nprompt: |\n hi", "t.agent");
53
+ expect(pre.keyLines.get("agent")).toBe(1);
54
+ expect(pre.keyLines.get("model")).toBe(2);
55
+ expect(pre.keyLines.get("prompt")).toBe(3);
56
+ });
57
+ });
58
+ //# sourceMappingURL=preprocess.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preprocess.test.js","sourceRoot":"","sources":["../src/preprocess.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=system.test.d.ts.map