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.
- package/dist/{_baseForOwn-buOZDFbK.cjs → _baseForOwn-BfWDTL8L.cjs} +0 -50
- package/dist/common-DdArNQhl.cjs +643 -0
- package/dist/common-pgJjFu2Y.js +596 -0
- package/dist/compiler-C-OI9sim.cjs +547 -0
- package/dist/compiler-CW1VjQsn.js +473 -0
- package/dist/{component-BwixNVH8.cjs → component-BXS8vAwO.cjs} +3 -3
- package/dist/{component-DGG7d_Mz.js → component-Dq7ZLdvy.js} +1 -1
- package/dist/component.d.ts +4 -4
- package/dist/component.default.d.ts +60 -87
- package/dist/component.default.test.d.ts +1 -0
- package/dist/context.d.ts +10 -0
- package/dist/{custom-client-CMuy7fXU.js → custom-client-2V9lmzUf.js} +119 -24
- package/dist/{custom-client-Bp1TgTKk.cjs → custom-client-HkM1Sdzv.cjs} +124 -29
- package/dist/{dual-modes-CfqTk9M8.cjs → dual-modes-Cb7ThvoV.cjs} +1268 -1062
- package/dist/{dual-modes-mNyMThtf.js → dual-modes-Cy0_W4O2.js} +1242 -1036
- package/dist/example.d.ts +45 -0
- package/dist/example.test.d.ts +1 -0
- package/dist/{execute-DP_17lYZ.js → execute-Aw4cbIx-.js} +23 -10
- package/dist/{execute-msui51b2.cjs → execute-COIHOIKR.cjs} +30 -18
- package/dist/{exit-BGi0Kk0y.cjs → exit-DUM96DN1.cjs} +3 -3
- package/dist/exit-parser.d.ts +2 -0
- package/dist/index.cjs +33 -356
- package/dist/index.d.ts +2 -0
- package/dist/index.js +13 -337
- package/dist/index.workerd.js +9981 -9388
- package/dist/{jsx-CIgdGGVs.js → jsx-B0iYyvfr.js} +50 -2
- package/dist/{jsx-BWvT6ukg.cjs → jsx-D5Y2cPo-.cjs} +58 -4
- package/dist/message-stream/parser.d.ts +3 -0
- package/dist/message-stream/types.d.ts +1 -1
- package/dist/prompts/chat-mode/system.d.ts +2 -0
- package/dist/prompts/chat-mode/user.d.ts +2 -0
- package/dist/prompts/execution-history.d.ts +6 -0
- package/dist/prompts/execution-state.d.ts +3 -0
- package/dist/prompts/prompt.d.ts +26 -0
- package/dist/prompts/protocol.test.d.ts +1 -0
- package/dist/prompts/worker-mode/system.d.ts +2 -0
- package/dist/prompts/worker-mode/user.d.ts +2 -0
- package/dist/runtime/types.d.ts +9 -0
- package/dist/{tool-ReA9gxMp.cjs → tool-Dy6AJpJH.cjs} +4 -4
- package/dist/{truncator-B6aaJaN1.cjs → truncator-CLkouTCO.cjs} +3 -3
- package/dist/{typings-BwAz_TM9.cjs → typings-3lsqCbkn.cjs} +3 -3
- package/dist/{utils-ZpJm00ed.cjs → utils-3ESwP3yg.cjs} +2 -2
- package/dist/{vm-C5vf1LH3.js → vm-BLsHw1da.js} +3 -462
- package/dist/{vm-BjkJqSQH.cjs → vm-D6s1zF6M.cjs} +28 -489
- package/package.json +2 -2
- package/dist/isPlainObject-CSxXVKCk.cjs +0 -56
- 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
|
+
});
|