llmz 0.7.0 → 0.8.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 (47) hide show
  1. package/dist/{_baseForOwn-buOZDFbK.cjs → _baseForOwn-BfWDTL8L.cjs} +0 -50
  2. package/dist/common-DdArNQhl.cjs +643 -0
  3. package/dist/common-pgJjFu2Y.js +596 -0
  4. package/dist/compiler-C-OI9sim.cjs +547 -0
  5. package/dist/compiler-CW1VjQsn.js +473 -0
  6. package/dist/{component-BwixNVH8.cjs → component-BXS8vAwO.cjs} +3 -3
  7. package/dist/{component-DGG7d_Mz.js → component-Dq7ZLdvy.js} +1 -1
  8. package/dist/component.d.ts +4 -4
  9. package/dist/component.default.d.ts +60 -87
  10. package/dist/component.default.test.d.ts +1 -0
  11. package/dist/context.d.ts +10 -0
  12. package/dist/{custom-client-CMuy7fXU.js → custom-client-2V9lmzUf.js} +119 -24
  13. package/dist/{custom-client-Bp1TgTKk.cjs → custom-client-HkM1Sdzv.cjs} +124 -29
  14. package/dist/{dual-modes-CfqTk9M8.cjs → dual-modes-Cb7ThvoV.cjs} +1268 -1062
  15. package/dist/{dual-modes-mNyMThtf.js → dual-modes-Cy0_W4O2.js} +1242 -1036
  16. package/dist/example.d.ts +45 -0
  17. package/dist/example.test.d.ts +1 -0
  18. package/dist/{execute-DP_17lYZ.js → execute-Aw4cbIx-.js} +23 -10
  19. package/dist/{execute-msui51b2.cjs → execute-COIHOIKR.cjs} +30 -18
  20. package/dist/{exit-BGi0Kk0y.cjs → exit-DUM96DN1.cjs} +3 -3
  21. package/dist/exit-parser.d.ts +2 -0
  22. package/dist/index.cjs +33 -356
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.js +13 -337
  25. package/dist/index.workerd.js +9981 -9388
  26. package/dist/{jsx-CIgdGGVs.js → jsx-B0iYyvfr.js} +50 -2
  27. package/dist/{jsx-BWvT6ukg.cjs → jsx-D5Y2cPo-.cjs} +58 -4
  28. package/dist/message-stream/parser.d.ts +3 -0
  29. package/dist/message-stream/types.d.ts +1 -1
  30. package/dist/prompts/chat-mode/system.d.ts +2 -0
  31. package/dist/prompts/chat-mode/user.d.ts +2 -0
  32. package/dist/prompts/execution-history.d.ts +6 -0
  33. package/dist/prompts/execution-state.d.ts +3 -0
  34. package/dist/prompts/prompt.d.ts +26 -0
  35. package/dist/prompts/protocol.test.d.ts +1 -0
  36. package/dist/prompts/worker-mode/system.d.ts +2 -0
  37. package/dist/prompts/worker-mode/user.d.ts +2 -0
  38. package/dist/runtime/types.d.ts +9 -0
  39. package/dist/{tool-ReA9gxMp.cjs → tool-Dy6AJpJH.cjs} +4 -4
  40. package/dist/{truncator-B6aaJaN1.cjs → truncator-CLkouTCO.cjs} +3 -3
  41. package/dist/{typings-BwAz_TM9.cjs → typings-3lsqCbkn.cjs} +3 -3
  42. package/dist/{utils-ZpJm00ed.cjs → utils-3ESwP3yg.cjs} +2 -2
  43. package/dist/{vm-C5vf1LH3.js → vm-BLsHw1da.js} +3 -462
  44. package/dist/{vm-BjkJqSQH.cjs → vm-D6s1zF6M.cjs} +28 -489
  45. package/package.json +2 -2
  46. package/dist/isPlainObject-CSxXVKCk.cjs +0 -56
  47. package/dist/isPlainObject-D39AzPO2.js +0 -51
@@ -1,35 +1,3 @@
1
- //#region \0rolldown/runtime.js
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
9
- var __exportAll = (all, no_symbols) => {
10
- let target = {};
11
- for (var name in all) __defProp(target, name, {
12
- get: all[name],
13
- enumerable: true
14
- });
15
- if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
16
- return target;
17
- };
18
- var __copyProps = (to, from, except, desc) => {
19
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
20
- key = keys[i];
21
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
22
- get: ((k) => from[k]).bind(null, key),
23
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
24
- });
25
- }
26
- return to;
27
- };
28
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
29
- value: mod,
30
- enumerable: true
31
- }) : target, mod));
32
- //#endregion
33
1
  const require__baseIteratee = require("./_baseIteratee-CF4qP2a8.cjs");
34
2
  //#region ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_createBaseFor.js
35
3
  /**
@@ -77,24 +45,6 @@ function baseForOwn(object, iteratee) {
77
45
  return object && baseFor(object, iteratee, require__baseIteratee.keys);
78
46
  }
79
47
  //#endregion
80
- Object.defineProperty(exports, "__commonJSMin", {
81
- enumerable: true,
82
- get: function() {
83
- return __commonJSMin;
84
- }
85
- });
86
- Object.defineProperty(exports, "__exportAll", {
87
- enumerable: true,
88
- get: function() {
89
- return __exportAll;
90
- }
91
- });
92
- Object.defineProperty(exports, "__toESM", {
93
- enumerable: true,
94
- get: function() {
95
- return __toESM;
96
- }
97
- });
98
48
  Object.defineProperty(exports, "baseForOwn", {
99
49
  enumerable: true,
100
50
  get: function() {
@@ -0,0 +1,643 @@
1
+ const require_compiler = require("./compiler-C-OI9sim.cjs");
2
+ let json5 = require("json5");
3
+ json5 = require_compiler.__toESM(json5, 1);
4
+ let jsonrepair = require("jsonrepair");
5
+ //#region src/message-stream/types.ts
6
+ /**
7
+ * Reserved protocol symbol. Every block of an LLM response starts with `■`:
8
+ *
9
+ * ■send=<component> { props? }
10
+ * streaming body here
11
+ *
12
+ * ■run
13
+ * // code here
14
+ *
15
+ * ■next=<name> { props? }
16
+ *
17
+ * The model must never emit `■` inside props or body content.
18
+ */
19
+ const MARKER = "■";
20
+ /** Component and exit names are normalized to lowercase (kebab or snake case). */
21
+ const NAME_REGEX = /^[a-z][a-z0-9_-]*$/;
22
+ //#endregion
23
+ //#region src/message-stream/parser.ts
24
+ const isWhitespace = (char) => /\s/.test(char);
25
+ /**
26
+ * Lenient JSON parsing: JSON5 first (unquoted keys, single quotes, trailing
27
+ * commas), then jsonrepair for anything else the model got slightly wrong.
28
+ */
29
+ const tryParseJson = (text) => {
30
+ try {
31
+ return json5.default.parse(text);
32
+ } catch {
33
+ try {
34
+ return json5.default.parse((0, jsonrepair.jsonrepair)(text));
35
+ } catch {
36
+ const trimmed = text.trim();
37
+ if (/^\{\s*\{/.test(trimmed) && /\}\s*\}$/.test(trimmed)) try {
38
+ return json5.default.parse(trimmed.slice(1, -1));
39
+ } catch {}
40
+ return;
41
+ }
42
+ }
43
+ };
44
+ /**
45
+ * Incremental, chunk-boundary-agnostic parser for the message-stream protocol.
46
+ *
47
+ * The parser is purely syntactic: it knows the reserved `■` symbol and the
48
+ * directive grammar, but nothing about registered components, exits or their
49
+ * schemas. Semantic validation is a separate step (see `validator.ts`).
50
+ * Text outside protocol blocks is always discarded with a diagnostic; only
51
+ * explicit `■send` blocks can produce messages.
52
+ *
53
+ * Pushing the same text split across arbitrary chunk boundaries always produces
54
+ * the same items and the same concatenated body deltas. For a higher-level
55
+ * `AsyncIterable` API, see `stream.ts`.
56
+ */
57
+ var StreamingMessageParser = class {
58
+ _maxPropsLength;
59
+ _state = "idle";
60
+ _items = [];
61
+ _diagnostics = [];
62
+ _current;
63
+ _currentReady = false;
64
+ _counter = 0;
65
+ _finished = false;
66
+ _directiveBuffer = "";
67
+ _nameBuffer = "";
68
+ _propsBuffer = "";
69
+ _propsDepth = 0;
70
+ _quoteChar;
71
+ _escaped = false;
72
+ _propsBroken = false;
73
+ _bodyDelta = "";
74
+ _pendingWhitespace = "";
75
+ _preambleHeader;
76
+ _closingFenceTicks;
77
+ constructor(options = {}) {
78
+ this._maxPropsLength = options.maxPropsLength ?? 1e5;
79
+ }
80
+ /** All items parsed so far, in order of appearance. */
81
+ get items() {
82
+ return [...this._items];
83
+ }
84
+ /** All syntax diagnostics, including discarded text that has no protocol item. */
85
+ get diagnostics() {
86
+ return [...this._diagnostics];
87
+ }
88
+ push(chunk) {
89
+ if (this._finished) throw new Error("Parser has already finished. Call reset() before parsing a new stream.");
90
+ const events = [];
91
+ for (const char of chunk) this._processChar(char, events);
92
+ this._flushBodyDelta(events);
93
+ return events;
94
+ }
95
+ /**
96
+ * Signals the end of the transport stream.
97
+ * Pass `'interrupted'` when the stream was cut short (aborted request, network
98
+ * error) so the active item is marked `interrupted` instead of `complete`.
99
+ * All received content is preserved either way.
100
+ */
101
+ finish(reason = "end") {
102
+ if (this._finished) return [];
103
+ this._finished = true;
104
+ const events = [];
105
+ if (this._closingFenceTicks !== void 0 && this._closingFenceTicks !== 3) this._skipUnexpectedText(events);
106
+ this._closingFenceTicks = void 0;
107
+ const status = reason === "interrupted" ? "interrupted" : void 0;
108
+ if (this._state === "skip" && this._preambleHeader) this._recoverPreambleHeader(events);
109
+ switch (this._state) {
110
+ case "directive":
111
+ this._endDirective(events, void 0);
112
+ this._completeCurrent(events, status);
113
+ break;
114
+ case "name":
115
+ this._endName(events);
116
+ this._completeCurrent(events, status);
117
+ break;
118
+ case "header":
119
+ case "body-wait":
120
+ this._completeCurrent(events, status);
121
+ break;
122
+ case "props":
123
+ this._endPartialProps(events);
124
+ this._completeCurrent(events, "interrupted");
125
+ break;
126
+ case "body":
127
+ this._pendingWhitespace = "";
128
+ this._flushBodyDelta(events);
129
+ this._completeCurrent(events, status);
130
+ }
131
+ return events;
132
+ }
133
+ reset() {
134
+ this._state = "idle";
135
+ this._items = [];
136
+ this._diagnostics = [];
137
+ this._current = void 0;
138
+ this._currentReady = false;
139
+ this._counter = 0;
140
+ this._finished = false;
141
+ this._directiveBuffer = "";
142
+ this._nameBuffer = "";
143
+ this._propsBuffer = "";
144
+ this._propsDepth = 0;
145
+ this._quoteChar = void 0;
146
+ this._escaped = false;
147
+ this._propsBroken = false;
148
+ this._bodyDelta = "";
149
+ this._pendingWhitespace = "";
150
+ this._preambleHeader = void 0;
151
+ this._closingFenceTicks = void 0;
152
+ }
153
+ _processChar(char, events) {
154
+ if (this._closingFenceTicks !== void 0) {
155
+ if (char === "`" && this._closingFenceTicks < 3) {
156
+ this._closingFenceTicks++;
157
+ return;
158
+ }
159
+ if (isWhitespace(char) && this._closingFenceTicks === 3) return;
160
+ this._closingFenceTicks = void 0;
161
+ this._skipUnexpectedText(events);
162
+ }
163
+ switch (this._state) {
164
+ case "idle":
165
+ if (char === "■") this._beginItem();
166
+ else if (!isWhitespace(char)) {
167
+ const last = this._items.at(-1);
168
+ if (char === "`" && (last === null || last === void 0 ? void 0 : last.kind) === "next" && last.status === "complete") {
169
+ this._closingFenceTicks = 1;
170
+ return;
171
+ }
172
+ this._skipUnexpectedText(events);
173
+ if (!this._items.length) this._preambleHeader = "";
174
+ }
175
+ return;
176
+ case "directive":
177
+ if (char === "=") this._endDirective(events, "=");
178
+ else if (char === "■") {
179
+ this._endDirective(events, void 0);
180
+ this._completeCurrent(events);
181
+ this._beginItem();
182
+ } else if (char === "\n") this._endDirective(events, "\n");
183
+ else if (isWhitespace(char)) this._endDirective(events, " ");
184
+ else if (char === "{") this._endDirective(events, "{");
185
+ else this._directiveBuffer += char;
186
+ return;
187
+ case "name":
188
+ if (char === "■") {
189
+ this._endName(events);
190
+ this._completeCurrent(events);
191
+ this._beginItem();
192
+ } else if (char === "{") {
193
+ this._endName(events);
194
+ this._afterHeaderChar(char, events);
195
+ } else if (char === "\n") {
196
+ this._endName(events);
197
+ this._afterHeaderChar(char, events);
198
+ } else if (isWhitespace(char)) {
199
+ this._endName(events);
200
+ this._state = "header";
201
+ } else this._nameBuffer += char;
202
+ return;
203
+ case "header":
204
+ this._afterHeaderChar(char, events);
205
+ return;
206
+ case "props":
207
+ this._processPropsChar(char, events);
208
+ return;
209
+ case "body-wait":
210
+ if (char === "■") {
211
+ this._completeCurrent(events);
212
+ this._beginItem();
213
+ } else if (!isWhitespace(char)) {
214
+ this._startBody(events);
215
+ this._appendBody(char);
216
+ }
217
+ return;
218
+ case "body":
219
+ if (char === "■") {
220
+ this._pendingWhitespace = "";
221
+ this._flushBodyDelta(events);
222
+ this._completeCurrent(events);
223
+ this._beginItem();
224
+ } else this._appendBody(char);
225
+ return;
226
+ case "skip":
227
+ if (this._preambleHeader !== void 0) {
228
+ if (char === "■") this._preambleHeader = "■";
229
+ else if (this._preambleHeader) {
230
+ this._preambleHeader += char;
231
+ if (char === "\n") this._recoverPreambleHeader(events);
232
+ else if (this._preambleHeader.length > this._maxPropsLength) this._preambleHeader = "";
233
+ }
234
+ return;
235
+ }
236
+ if (char === "■") this._beginItem();
237
+ return;
238
+ }
239
+ }
240
+ _recoverPreambleHeader(events) {
241
+ const header = this._preambleHeader ?? "";
242
+ if (/^■(?:run|(?:send|next)=[a-z][a-z0-9_-]*(?:[ \t]*\{[^\r\n]*\})?)[ \t]*\r?\n?$/i.test(header)) {
243
+ this._preambleHeader = void 0;
244
+ this._state = "idle";
245
+ for (const char of header) this._processChar(char, events);
246
+ } else this._preambleHeader = "";
247
+ }
248
+ /** Handles a character on the header line, after the directive and name have been parsed. */
249
+ _afterHeaderChar(char, events) {
250
+ const item = this._current;
251
+ if (char === "■") {
252
+ this._completeCurrent(events);
253
+ this._beginItem();
254
+ return;
255
+ }
256
+ if (char === "{" && (item.kind === "send" || item.kind === "next")) {
257
+ this._startProps(char);
258
+ return;
259
+ }
260
+ if (char === "\n") {
261
+ if (item.kind === "next") {
262
+ this._completeCurrent(events);
263
+ this._state = "idle";
264
+ } else this._state = "body-wait";
265
+ return;
266
+ }
267
+ if (isWhitespace(char)) return;
268
+ if (item.kind === "next") {
269
+ this._completeCurrent(events);
270
+ this._skipUnexpectedText(events);
271
+ return;
272
+ }
273
+ this._startBody(events);
274
+ this._appendBody(char);
275
+ }
276
+ _processPropsChar(char, events) {
277
+ this._propsBuffer += char;
278
+ if (this._propsBuffer.length > this._maxPropsLength) {
279
+ this._failProps(events, `props exceeded the maximum length of ${this._maxPropsLength} characters`, "props-too-long");
280
+ this._completeCurrent(events);
281
+ this._state = "skip";
282
+ return;
283
+ }
284
+ if (this._escaped) {
285
+ this._escaped = false;
286
+ return;
287
+ }
288
+ if (this._quoteChar) {
289
+ if (char === "\\") this._escaped = true;
290
+ else if (char === this._quoteChar) this._quoteChar = void 0;
291
+ else if (char === "\n" || char === "\r") this._propsBroken = true;
292
+ else if (char === "■" && this._propsBroken) {
293
+ this._failProps(events, "props were interrupted by a new block");
294
+ this._completeCurrent(events);
295
+ this._beginItem();
296
+ }
297
+ return;
298
+ }
299
+ if (char === "\"" || char === "'") this._quoteChar = char;
300
+ else if (char === "■") {
301
+ this._failProps(events, "props were interrupted by a new block");
302
+ this._completeCurrent(events);
303
+ this._beginItem();
304
+ } else if (char === "{" || char === "[") this._propsDepth++;
305
+ else if (char === "}" || char === "]") {
306
+ this._propsDepth--;
307
+ if (this._propsDepth <= 0) this._endProps(events);
308
+ }
309
+ }
310
+ _beginItem() {
311
+ const item = {
312
+ id: `item-${this._counter++}`,
313
+ kind: "unknown",
314
+ name: "",
315
+ props: {},
316
+ status: "pending",
317
+ diagnostics: []
318
+ };
319
+ this._items.push(item);
320
+ this._current = item;
321
+ this._currentReady = false;
322
+ this._directiveBuffer = "";
323
+ this._nameBuffer = "";
324
+ this._state = "directive";
325
+ }
326
+ /**
327
+ * Finalizes the directive token. `terminator` tells us what ended it:
328
+ * '=' (a name follows), whitespace/newline/'{' (no name), or undefined (■ or end of stream).
329
+ */
330
+ _endDirective(events, terminator) {
331
+ const item = this._current;
332
+ const directive = this._directiveBuffer.toLowerCase();
333
+ if (directive === "send" || directive === "next" || directive === "run") item.kind = directive;
334
+ else {
335
+ item.kind = "unknown";
336
+ item.status = "invalid";
337
+ this._diagnostic(events, {
338
+ code: "invalid-directive",
339
+ message: `Unknown directive "■${this._directiveBuffer}". Expected ■send, ■run or ■next.`,
340
+ itemId: item.id
341
+ });
342
+ events.push({
343
+ type: "item-start",
344
+ item
345
+ });
346
+ this._completeCurrent(events);
347
+ this._state = "skip";
348
+ return;
349
+ }
350
+ if (item.kind === "run") {
351
+ events.push({
352
+ type: "item-start",
353
+ item
354
+ });
355
+ if (terminator === "=") {
356
+ this._diagnostic(events, {
357
+ code: "invalid-directive",
358
+ message: "■run does not take a name",
359
+ itemId: item.id
360
+ });
361
+ this._state = "header";
362
+ } else if (terminator === "\n") this._state = "body-wait";
363
+ else if (terminator === "{" || terminator === " ") {
364
+ this._state = "header";
365
+ if (terminator === "{") {
366
+ this._startBody(events);
367
+ this._appendBody("{");
368
+ }
369
+ }
370
+ return;
371
+ }
372
+ if (terminator === "=") {
373
+ this._nameBuffer = "";
374
+ this._state = "name";
375
+ return;
376
+ }
377
+ item.status = "invalid";
378
+ this._diagnostic(events, {
379
+ code: "invalid-name",
380
+ message: `■${directive} requires a name (e.g. ■${directive}=example)`,
381
+ itemId: item.id
382
+ });
383
+ events.push({
384
+ type: "item-start",
385
+ item
386
+ });
387
+ if (terminator === "\n") {
388
+ this._state = item.kind === "next" ? "idle" : "body-wait";
389
+ if (item.kind === "next") this._completeCurrent(events);
390
+ } else if (terminator === "{") this._startProps("{");
391
+ else this._state = "header";
392
+ }
393
+ _endName(events) {
394
+ const item = this._current;
395
+ const name = this._nameBuffer.toLowerCase();
396
+ item.name = name;
397
+ if (!NAME_REGEX.test(name)) {
398
+ item.status = "invalid";
399
+ this._diagnostic(events, {
400
+ code: "invalid-name",
401
+ message: `Invalid name "${this._nameBuffer}" for ■${item.kind}`,
402
+ itemId: item.id
403
+ });
404
+ }
405
+ events.push({
406
+ type: "item-start",
407
+ item
408
+ });
409
+ }
410
+ _startProps(char) {
411
+ this._propsBuffer = char;
412
+ this._propsDepth = 1;
413
+ this._quoteChar = void 0;
414
+ this._escaped = false;
415
+ this._propsBroken = false;
416
+ this._state = "props";
417
+ }
418
+ _endProps(events) {
419
+ const item = this._current;
420
+ const parsed = tryParseJson(this._propsBuffer);
421
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) this._failProps(events, "props are not a valid JSON object");
422
+ else {
423
+ item.props = parsed;
424
+ this._ready(events);
425
+ }
426
+ if (item.kind === "next") {
427
+ this._completeCurrent(events);
428
+ this._state = "idle";
429
+ } else this._state = "body-wait";
430
+ }
431
+ /** Attempts to salvage props that were cut off by the end of the stream. */
432
+ _endPartialProps(events) {
433
+ const item = this._current;
434
+ const repaired = tryParseJson(this._propsBuffer);
435
+ this._diagnostic(events, {
436
+ code: "interrupted",
437
+ message: `Props of ■${item.kind} were interrupted by the end of the stream`,
438
+ itemId: item.id
439
+ });
440
+ if (repaired && typeof repaired === "object" && !Array.isArray(repaired)) item.props = repaired;
441
+ else {
442
+ item.status = "invalid";
443
+ this._diagnostic(events, {
444
+ code: "invalid-props",
445
+ message: `Invalid props for ■${item.kind}: props are not a valid JSON object`,
446
+ itemId: item.id
447
+ });
448
+ }
449
+ }
450
+ _failProps(events, detail, code = "invalid-props") {
451
+ const item = this._current;
452
+ item.status = "invalid";
453
+ item.props = {};
454
+ this._diagnostic(events, {
455
+ code,
456
+ message: `Invalid props for ■${item.kind}${item.name ? `=${item.name}` : ""}: ${detail}`,
457
+ itemId: item.id
458
+ });
459
+ }
460
+ _startBody(events) {
461
+ const item = this._current;
462
+ this._ready(events);
463
+ item.body ??= "";
464
+ this._pendingWhitespace = "";
465
+ events.push({
466
+ type: "body-start",
467
+ itemId: item.id
468
+ });
469
+ this._state = "body";
470
+ }
471
+ _appendBody(char) {
472
+ if (isWhitespace(char)) {
473
+ this._pendingWhitespace += char;
474
+ return;
475
+ }
476
+ if (this._pendingWhitespace) {
477
+ this._emitBodyText(this._pendingWhitespace);
478
+ this._pendingWhitespace = "";
479
+ }
480
+ this._emitBodyText(char);
481
+ }
482
+ _emitBodyText(text) {
483
+ this._current.body += text;
484
+ this._bodyDelta += text;
485
+ }
486
+ _flushBodyDelta(events) {
487
+ if (this._bodyDelta && this._current) events.push({
488
+ type: "body-delta",
489
+ itemId: this._current.id,
490
+ delta: this._bodyDelta
491
+ });
492
+ this._bodyDelta = "";
493
+ }
494
+ _ready(events) {
495
+ const item = this._current;
496
+ if (!item || this._currentReady) return;
497
+ this._currentReady = true;
498
+ if (item.status !== "invalid") item.status = "streaming";
499
+ events.push({
500
+ type: "item-ready",
501
+ item
502
+ });
503
+ }
504
+ _completeCurrent(events, forcedStatus) {
505
+ const item = this._current;
506
+ if (!item) return;
507
+ this._ready(events);
508
+ if (item.status !== "invalid") item.status = forcedStatus ?? "complete";
509
+ events.push({
510
+ type: "item-complete",
511
+ item
512
+ });
513
+ this._current = void 0;
514
+ this._currentReady = false;
515
+ }
516
+ _skipUnexpectedText(events) {
517
+ this._diagnostic(events, {
518
+ code: "unexpected-text",
519
+ message: "Encountered text outside of a ■ block"
520
+ });
521
+ this._state = "skip";
522
+ }
523
+ _diagnostic(events, diagnostic) {
524
+ this._diagnostics.push(diagnostic);
525
+ if (diagnostic.itemId) {
526
+ const item = this._items.find((i) => i.id === diagnostic.itemId);
527
+ item === null || item === void 0 || item.diagnostics.push(diagnostic);
528
+ }
529
+ events.push({
530
+ type: "diagnostic",
531
+ diagnostic
532
+ });
533
+ }
534
+ };
535
+ //#endregion
536
+ //#region src/prompts/common.ts
537
+ var common_exports = /* @__PURE__ */ require_compiler.__exportAll({
538
+ parseAssistantResponse: () => parseAssistantResponse,
539
+ replacePlaceholders: () => replacePlaceholders,
540
+ toParsedAssistantResponse: () => toParsedAssistantResponse
541
+ });
542
+ /** Strips wrapping code fences the model may have added around the whole response. */
543
+ const stripWrappingFences = (text) => text.trim().split("\n").filter((line, index, arr) => {
544
+ if ((index === 0 || index === arr.length - 1) && line.trim().startsWith("```")) return false;
545
+ return true;
546
+ }).join("\n");
547
+ /** Builds a {@link ParsedAssistantResponse} from parsed protocol items. */
548
+ const toParsedAssistantResponse = (items, raw, diagnostics = []) => {
549
+ var _run$body;
550
+ const runIndex = items.findIndex((item) => item.kind === "run");
551
+ const run = items[runIndex];
552
+ const awaitsResult = !!(run === null || run === void 0 ? void 0 : run.body) && require_compiler.hasTopLevelReturn(run.body);
553
+ const prematureSends = awaitsResult ? items.slice(runIndex + 1).filter((item) => item.kind === "send") : [];
554
+ const sends = items.filter((item, index) => item.kind === "send" && (!awaitsResult || index < runIndex)).map((item) => ({
555
+ name: item.name,
556
+ props: item.props,
557
+ body: item.body
558
+ }));
559
+ const next = items.find((item) => item.kind === "next" && item.status !== "invalid");
560
+ return {
561
+ raw,
562
+ items,
563
+ diagnostics: [...diagnostics, ...prematureSends.map((item) => ({
564
+ code: "send-after-run",
565
+ itemId: item.id,
566
+ message: "Discarded a message generated after code returning a result, before that result was available to the model."
567
+ }))],
568
+ sends,
569
+ code: (run === null || run === void 0 || (_run$body = run.body) === null || _run$body === void 0 ? void 0 : _run$body.trim()) || void 0,
570
+ next: next ? {
571
+ name: next.name,
572
+ props: next.props
573
+ } : void 0
574
+ };
575
+ };
576
+ const parseAssistantResponse = (response) => {
577
+ const parser = new StreamingMessageParser();
578
+ parser.push(stripWrappingFences(response));
579
+ parser.finish();
580
+ return toParsedAssistantResponse(parser.items, response, parser.diagnostics);
581
+ };
582
+ const replacePlaceholders = (prompt, values) => {
583
+ const regex = /* @__PURE__ */ new RegExp("■■■([A-Z0-9_\\.-]+)■■■", "gi");
584
+ const obj = Object.assign({}, values);
585
+ const replaced = prompt.replace(regex, (_match, name) => {
586
+ if (name in values) {
587
+ delete obj[name];
588
+ return typeof values[name] === "string" ? values[name] : JSON.stringify(values[name]);
589
+ } else throw new Error(`Placeholder not found: ${name}`);
590
+ });
591
+ const remaining = Object.keys(obj).filter((key) => key !== "is_message_enabled" && key !== "exits" && key !== "components" && key !== "transcript");
592
+ if (remaining.length) throw new Error(`Missing placeholders: ${remaining.join(", ")}`);
593
+ return replaced.replace(/\n{3,}/g, "\n\n").trim();
594
+ };
595
+ //#endregion
596
+ Object.defineProperty(exports, "MARKER", {
597
+ enumerable: true,
598
+ get: function() {
599
+ return MARKER;
600
+ }
601
+ });
602
+ Object.defineProperty(exports, "NAME_REGEX", {
603
+ enumerable: true,
604
+ get: function() {
605
+ return NAME_REGEX;
606
+ }
607
+ });
608
+ Object.defineProperty(exports, "StreamingMessageParser", {
609
+ enumerable: true,
610
+ get: function() {
611
+ return StreamingMessageParser;
612
+ }
613
+ });
614
+ Object.defineProperty(exports, "common_exports", {
615
+ enumerable: true,
616
+ get: function() {
617
+ return common_exports;
618
+ }
619
+ });
620
+ Object.defineProperty(exports, "parseAssistantResponse", {
621
+ enumerable: true,
622
+ get: function() {
623
+ return parseAssistantResponse;
624
+ }
625
+ });
626
+ Object.defineProperty(exports, "replacePlaceholders", {
627
+ enumerable: true,
628
+ get: function() {
629
+ return replacePlaceholders;
630
+ }
631
+ });
632
+ Object.defineProperty(exports, "toParsedAssistantResponse", {
633
+ enumerable: true,
634
+ get: function() {
635
+ return toParsedAssistantResponse;
636
+ }
637
+ });
638
+ Object.defineProperty(exports, "tryParseJson", {
639
+ enumerable: true,
640
+ get: function() {
641
+ return tryParseJson;
642
+ }
643
+ });