@harny/sdk 0.0.1-alpha.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +56 -42
- package/dist/cjs/agent/adapters.d.ts +167 -0
- package/dist/cjs/agent/adapters.js +557 -0
- package/dist/cjs/agent/adapters.js.map +1 -0
- package/dist/cjs/agent/hooks.d.ts +52 -0
- package/dist/cjs/agent/hooks.js +41 -0
- package/dist/cjs/agent/hooks.js.map +1 -0
- package/dist/cjs/agent/index.d.ts +34 -0
- package/dist/cjs/agent/index.js +62 -0
- package/dist/cjs/agent/index.js.map +1 -0
- package/dist/cjs/agent/loop.d.ts +401 -0
- package/dist/cjs/agent/loop.js +1252 -0
- package/dist/cjs/agent/loop.js.map +1 -0
- package/dist/cjs/agent/roster.d.ts +62 -0
- package/dist/cjs/agent/roster.js +149 -0
- package/dist/cjs/agent/roster.js.map +1 -0
- package/dist/cjs/agent/session.d.ts +106 -0
- package/dist/cjs/agent/session.js +261 -0
- package/dist/cjs/agent/session.js.map +1 -0
- package/dist/cjs/agent/spend.d.ts +39 -0
- package/dist/cjs/agent/spend.js +70 -0
- package/dist/cjs/agent/spend.js.map +1 -0
- package/dist/cjs/agent/tools.d.ts +83 -0
- package/dist/cjs/agent/tools.js +212 -0
- package/dist/cjs/agent/tools.js.map +1 -0
- package/dist/cjs/agent/tracing.d.ts +72 -0
- package/dist/cjs/agent/tracing.js +128 -0
- package/dist/cjs/agent/tracing.js.map +1 -0
- package/dist/cjs/agent/util.d.ts +60 -0
- package/dist/cjs/agent/util.js +188 -0
- package/dist/cjs/agent/util.js.map +1 -0
- package/dist/cjs/conflictQuestion.d.ts +137 -0
- package/dist/cjs/conflictQuestion.js +356 -0
- package/dist/cjs/conflictQuestion.js.map +1 -0
- package/dist/cjs/index.d.ts +950 -0
- package/dist/cjs/index.js +1124 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/memoryV1.d.ts +121 -0
- package/dist/cjs/memoryV1.js +132 -0
- package/dist/cjs/memoryV1.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/agent/adapters.d.ts +167 -0
- package/dist/esm/agent/adapters.js +543 -0
- package/dist/esm/agent/adapters.js.map +1 -0
- package/dist/esm/agent/hooks.d.ts +52 -0
- package/dist/esm/agent/hooks.js +36 -0
- package/dist/esm/agent/hooks.js.map +1 -0
- package/dist/esm/agent/index.d.ts +34 -0
- package/dist/esm/agent/index.js +28 -0
- package/dist/esm/agent/index.js.map +1 -0
- package/dist/esm/agent/loop.d.ts +401 -0
- package/dist/esm/agent/loop.js +1243 -0
- package/dist/esm/agent/loop.js.map +1 -0
- package/dist/esm/agent/roster.d.ts +62 -0
- package/dist/esm/agent/roster.js +143 -0
- package/dist/esm/agent/roster.js.map +1 -0
- package/dist/esm/agent/session.d.ts +106 -0
- package/dist/esm/agent/session.js +221 -0
- package/dist/esm/agent/session.js.map +1 -0
- package/dist/esm/agent/spend.d.ts +39 -0
- package/dist/esm/agent/spend.js +65 -0
- package/dist/esm/agent/spend.js.map +1 -0
- package/dist/esm/agent/tools.d.ts +83 -0
- package/dist/esm/agent/tools.js +205 -0
- package/dist/esm/agent/tools.js.map +1 -0
- package/dist/esm/agent/tracing.d.ts +72 -0
- package/dist/esm/agent/tracing.js +119 -0
- package/dist/esm/agent/tracing.js.map +1 -0
- package/dist/esm/agent/util.d.ts +60 -0
- package/dist/esm/agent/util.js +168 -0
- package/dist/esm/agent/util.js.map +1 -0
- package/dist/esm/conflictQuestion.d.ts +137 -0
- package/dist/esm/conflictQuestion.js +346 -0
- package/dist/esm/conflictQuestion.js.map +1 -0
- package/dist/esm/index.d.ts +950 -0
- package/dist/esm/index.js +1072 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/memoryV1.d.ts +121 -0
- package/dist/esm/memoryV1.js +124 -0
- package/dist/esm/memoryV1.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/package.json +41 -15
- package/index.js +0 -270
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model adapters: three wire styles, configured entirely from a roster entry.
|
|
3
|
+
*
|
|
4
|
+
* The loop speaks one neutral shape (messages, tool specs, tool calls). An
|
|
5
|
+
* adapter translates it to one wire style and back:
|
|
6
|
+
*
|
|
7
|
+
* - `chat_completions`: the widely shared chat-completions request shape.
|
|
8
|
+
* - `messages`: the messages request shape with content blocks.
|
|
9
|
+
* - `generate_content`: the generate-content shape with function declarations.
|
|
10
|
+
*
|
|
11
|
+
* Which provider speaks which style, the base URL, the auth header, any fixed
|
|
12
|
+
* headers and any extra request-body fields (a pin to one host on a provider
|
|
13
|
+
* that routes to many) all come from the roster entry, so no provider or model
|
|
14
|
+
* name is written here and a new provider on an existing style is a roster edit.
|
|
15
|
+
*
|
|
16
|
+
* Within one run, the model's own assistant turns are replayed in the native
|
|
17
|
+
* form the provider returned (some providers require their reasoning or
|
|
18
|
+
* signature fields back on the next call), with one repair: a tool call whose
|
|
19
|
+
* arguments are not a JSON object is replayed with `{}` (the loop has already
|
|
20
|
+
* answered it as invalid), because some hosts refuse the whole request
|
|
21
|
+
* otherwise. Across runs the session store keeps plain text and action notes
|
|
22
|
+
* only, so a conversation survives a change of preset or provider.
|
|
23
|
+
*
|
|
24
|
+
* A model that thinks before it answers (`thinking_always_on` in its roster
|
|
25
|
+
* entry; the agent never switches thinking off) spends part of the answer
|
|
26
|
+
* limit thinking. Its adapter gives every call at least the entry's
|
|
27
|
+
* `answer_room_tokens`; only the tokens the model uses are billed, and the
|
|
28
|
+
* thinking itself is never capped. A turn the provider stopped at the limit,
|
|
29
|
+
* or before it finished for another documented reason, is marked `cutOff`.
|
|
30
|
+
*/
|
|
31
|
+
import { MAX_TIMER_MS, RunAborted, isPlainObject, or, pyDumps, sleep, toInt, truthy } from "./util.js";
|
|
32
|
+
export class Usage {
|
|
33
|
+
constructor(inputTokens = 0, outputTokens = 0) {
|
|
34
|
+
this.inputTokens = inputTokens;
|
|
35
|
+
this.outputTokens = outputTokens;
|
|
36
|
+
}
|
|
37
|
+
get totalTokens() {
|
|
38
|
+
return this.inputTokens + this.outputTokens;
|
|
39
|
+
}
|
|
40
|
+
add(other) {
|
|
41
|
+
this.inputTokens += other.inputTokens;
|
|
42
|
+
this.outputTokens += other.outputTokens;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* One neutral message. `native` holds a provider's own assistant turn.
|
|
47
|
+
*
|
|
48
|
+
* A `tool_results` message may carry `text`: the loop's own words to the model
|
|
49
|
+
* after the results (the closing turn at the step limit), sent in the same
|
|
50
|
+
* turn as the results so user and model turns keep alternating.
|
|
51
|
+
*/
|
|
52
|
+
export class Message {
|
|
53
|
+
constructor(init) {
|
|
54
|
+
this.role = init.role;
|
|
55
|
+
this.text = init.text ?? "";
|
|
56
|
+
this.toolCalls = init.toolCalls ?? [];
|
|
57
|
+
this.results = init.results ?? [];
|
|
58
|
+
this.native = init.native ?? null;
|
|
59
|
+
this.nativeStyle = init.nativeStyle ?? null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** How each wire style says "stopped at the answer limit". */
|
|
63
|
+
const LENGTH_STOPS = new Set(["length", "max_tokens", "MAX_TOKENS"]);
|
|
64
|
+
/**
|
|
65
|
+
* Other stop reasons the providers document for a turn that did not finish: a
|
|
66
|
+
* content or safety filter, a lack of resources or a network or server fault
|
|
67
|
+
* mid-answer, an aborted or paused turn, a full context window, a refusal, or
|
|
68
|
+
* a malformed or unexpected tool call. Such a turn is never an answer and its
|
|
69
|
+
* tool calls are never run.
|
|
70
|
+
*/
|
|
71
|
+
const UNFINISHED_STOPS = new Set([
|
|
72
|
+
// chat-completions hosts
|
|
73
|
+
"content_filter", "insufficient_system_resource", "aborted", "sensitive", "network_error",
|
|
74
|
+
"server_error", "model_context_window_exceeded", "error",
|
|
75
|
+
// messages
|
|
76
|
+
"refusal", "pause_turn",
|
|
77
|
+
// generate-content
|
|
78
|
+
"SAFETY", "RECITATION", "BLOCKLIST", "PROHIBITED_CONTENT", "SPII", "IMAGE_SAFETY", "LANGUAGE", "OTHER",
|
|
79
|
+
"MALFORMED_FUNCTION_CALL", "UNEXPECTED_TOOL_CALL", "TOO_MANY_TOOL_CALLS",
|
|
80
|
+
]);
|
|
81
|
+
export class ModelTurn {
|
|
82
|
+
constructor(text, toolCalls, usage, stop, native = null) {
|
|
83
|
+
this.text = text;
|
|
84
|
+
this.toolCalls = toolCalls;
|
|
85
|
+
this.usage = usage;
|
|
86
|
+
this.stop = stop;
|
|
87
|
+
this.native = native;
|
|
88
|
+
}
|
|
89
|
+
/** The provider stopped this turn before it finished: text and tool calls may be incomplete. */
|
|
90
|
+
get cutOff() {
|
|
91
|
+
return LENGTH_STOPS.has(this.stop) || UNFINISHED_STOPS.has(this.stop);
|
|
92
|
+
}
|
|
93
|
+
/** Stopped at the answer limit (the common case of `cutOff`). */
|
|
94
|
+
get atAnswerLimit() {
|
|
95
|
+
return LENGTH_STOPS.has(this.stop);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** The model provider refused or failed the call (after retries). */
|
|
99
|
+
export class ModelProviderError extends Error {
|
|
100
|
+
constructor(message, statusCode = null) {
|
|
101
|
+
super(message);
|
|
102
|
+
this.name = "ModelProviderError";
|
|
103
|
+
this.statusCode = statusCode;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const RETRY_STATUS = new Set([408, 409, 425, 429, 500, 502, 503, 504, 529]);
|
|
107
|
+
const MAX_RETRIES = 2;
|
|
108
|
+
const MAX_RETRY_AFTER_S = 10;
|
|
109
|
+
function retryAfterSeconds(response, attempt) {
|
|
110
|
+
const raw = response.headers.get("retry-after");
|
|
111
|
+
let value = raw === null ? 2 ** attempt : Number(raw.trim());
|
|
112
|
+
if (raw !== null && (raw.trim() === "" || Number.isNaN(value)))
|
|
113
|
+
value = 2 ** attempt;
|
|
114
|
+
return Math.max(0, Math.min(value, MAX_RETRY_AFTER_S));
|
|
115
|
+
}
|
|
116
|
+
function errorText(text) {
|
|
117
|
+
let body;
|
|
118
|
+
try {
|
|
119
|
+
body = JSON.parse(text);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return text.slice(0, 300);
|
|
123
|
+
}
|
|
124
|
+
if (isPlainObject(body)) {
|
|
125
|
+
const err = body.error;
|
|
126
|
+
if (isPlainObject(err)) {
|
|
127
|
+
return String(truthy(err.message) ? err.message : pyDumps(err)).slice(0, 300);
|
|
128
|
+
}
|
|
129
|
+
if (typeof err === "string")
|
|
130
|
+
return err.slice(0, 300);
|
|
131
|
+
}
|
|
132
|
+
return pyDumps(body).slice(0, 300);
|
|
133
|
+
}
|
|
134
|
+
/** One call's signal: aborts on the run's signal or after `timeoutMs`. Call `done()` when the call ends. */
|
|
135
|
+
function callSignal(outer, timeoutMs) {
|
|
136
|
+
const controller = new AbortController();
|
|
137
|
+
const onOuter = () => controller.abort(outer?.reason);
|
|
138
|
+
const timer = setTimeout(() => controller.abort(new DOMException("timed out", "TimeoutError")), Math.min(timeoutMs, MAX_TIMER_MS));
|
|
139
|
+
if (outer) {
|
|
140
|
+
if (outer.aborted)
|
|
141
|
+
controller.abort(outer.reason);
|
|
142
|
+
else
|
|
143
|
+
outer.addEventListener("abort", onOuter, { once: true });
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
signal: controller.signal,
|
|
147
|
+
done: () => {
|
|
148
|
+
clearTimeout(timer);
|
|
149
|
+
outer?.removeEventListener("abort", onOuter);
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
async function drain(response) {
|
|
154
|
+
try {
|
|
155
|
+
await response.arrayBuffer();
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// the body is not needed
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const ADAPTER_KEYS = new WeakMap();
|
|
162
|
+
class HttpAdapter {
|
|
163
|
+
constructor(resolved, options = {}) {
|
|
164
|
+
const entry = resolved.entry;
|
|
165
|
+
this.provider = entry.provider;
|
|
166
|
+
this.model = entry.model;
|
|
167
|
+
this.base = entry.api.base_url.replace(/\/+$/, "");
|
|
168
|
+
this.auth = entry.api.auth;
|
|
169
|
+
this.fixedHeaders = { ...(entry.api.headers ?? {}) };
|
|
170
|
+
this.maxTokensParam = entry.api.max_tokens_param;
|
|
171
|
+
this.extraBody = JSON.parse(JSON.stringify(entry.api.extra_body ?? {}));
|
|
172
|
+
const caps = entry.capabilities ?? {};
|
|
173
|
+
const room = caps.answer_room_tokens;
|
|
174
|
+
this.answerRoomTokens = caps.thinking_always_on && truthy(room) ? toInt(room) : null;
|
|
175
|
+
this.fetchImpl = options.fetch ?? ((...args) => globalThis.fetch(...args));
|
|
176
|
+
this.timeoutMs = options.timeoutMs ?? 60000;
|
|
177
|
+
ADAPTER_KEYS.set(this, resolved.apiKey);
|
|
178
|
+
}
|
|
179
|
+
/** The caller's limit, raised to the roster's answer room for a model that always thinks. */
|
|
180
|
+
answerLimit(requested) {
|
|
181
|
+
return Math.max(Math.trunc(requested), this.answerRoomTokens ?? 0);
|
|
182
|
+
}
|
|
183
|
+
/** The roster entry's extra fields, added where the adapter set nothing. */
|
|
184
|
+
withExtra(body) {
|
|
185
|
+
for (const [key, value] of Object.entries(this.extraBody)) {
|
|
186
|
+
if (!(key in body))
|
|
187
|
+
body[key] = JSON.parse(JSON.stringify(value));
|
|
188
|
+
}
|
|
189
|
+
return body;
|
|
190
|
+
}
|
|
191
|
+
headers() {
|
|
192
|
+
const headers = { "Content-Type": "application/json", ...this.fixedHeaders };
|
|
193
|
+
const key = ADAPTER_KEYS.get(this) ?? "";
|
|
194
|
+
if (this.auth === "bearer")
|
|
195
|
+
headers["Authorization"] = `Bearer ${key}`;
|
|
196
|
+
else
|
|
197
|
+
headers[this.auth] = key;
|
|
198
|
+
return headers;
|
|
199
|
+
}
|
|
200
|
+
async post(url, body, signal) {
|
|
201
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {
|
|
202
|
+
if (signal?.aborted)
|
|
203
|
+
throw new RunAborted();
|
|
204
|
+
const call = callSignal(signal, this.timeoutMs);
|
|
205
|
+
let response;
|
|
206
|
+
let text;
|
|
207
|
+
try {
|
|
208
|
+
response = await this.fetchImpl(url, {
|
|
209
|
+
method: "POST",
|
|
210
|
+
headers: this.headers(),
|
|
211
|
+
body: JSON.stringify(body),
|
|
212
|
+
signal: call.signal,
|
|
213
|
+
});
|
|
214
|
+
text = RETRY_STATUS.has(response.status) && attempt < MAX_RETRIES ? "" : await response.text();
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
call.done();
|
|
218
|
+
if (signal?.aborted)
|
|
219
|
+
throw new RunAborted();
|
|
220
|
+
if (attempt < MAX_RETRIES) {
|
|
221
|
+
await sleep(1000 * 2 ** attempt, signal);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
throw new ModelProviderError(`${this.provider}: ${err?.message ?? String(err)}`);
|
|
225
|
+
}
|
|
226
|
+
call.done();
|
|
227
|
+
if (RETRY_STATUS.has(response.status) && attempt < MAX_RETRIES) {
|
|
228
|
+
await drain(response);
|
|
229
|
+
await sleep(1000 * retryAfterSeconds(response, attempt), signal);
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (!response.ok) {
|
|
233
|
+
throw new ModelProviderError(`${this.provider} returned ${response.status}: ${errorText(text)}`, response.status);
|
|
234
|
+
}
|
|
235
|
+
let data;
|
|
236
|
+
try {
|
|
237
|
+
data = JSON.parse(text);
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
throw new ModelProviderError(`${this.provider} returned a body that is not JSON`);
|
|
241
|
+
}
|
|
242
|
+
if (!isPlainObject(data)) {
|
|
243
|
+
throw new ModelProviderError(`${this.provider} returned a non-object body`);
|
|
244
|
+
}
|
|
245
|
+
return data;
|
|
246
|
+
}
|
|
247
|
+
throw new ModelProviderError(`${this.provider}: retries exhausted`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/** `[arguments, error]`: an object, or `null` with the reason it is not one. */
|
|
251
|
+
export function parseArguments(raw) {
|
|
252
|
+
if (isPlainObject(raw))
|
|
253
|
+
return [raw, null];
|
|
254
|
+
if (raw === null || raw === undefined || raw === "")
|
|
255
|
+
return [{}, null];
|
|
256
|
+
if (typeof raw !== "string")
|
|
257
|
+
return [null, "arguments are not valid JSON: not a string"];
|
|
258
|
+
let value;
|
|
259
|
+
try {
|
|
260
|
+
value = JSON.parse(raw);
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
return [null, `arguments are not valid JSON: ${err.message}`];
|
|
264
|
+
}
|
|
265
|
+
if (!isPlainObject(value))
|
|
266
|
+
return [null, "arguments must be a JSON object"];
|
|
267
|
+
return [value, null];
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* The model's own turn, safe to send back: a tool call whose arguments are not
|
|
271
|
+
* a JSON object is replayed with `{}`. Valid arguments go back byte for byte;
|
|
272
|
+
* the stored turn is never changed.
|
|
273
|
+
*/
|
|
274
|
+
export function replayable(native) {
|
|
275
|
+
if (!isPlainObject(native) || !Array.isArray(native.tool_calls))
|
|
276
|
+
return native;
|
|
277
|
+
let changed = false;
|
|
278
|
+
const repaired = native.tool_calls.map((call) => {
|
|
279
|
+
const fn = isPlainObject(call) ? call.function : undefined;
|
|
280
|
+
if (!isPlainObject(call) || !isPlainObject(fn))
|
|
281
|
+
return call;
|
|
282
|
+
const [args, err] = parseArguments(fn.arguments);
|
|
283
|
+
if (err !== null || typeof fn.arguments !== "string" || !fn.arguments.trim()) {
|
|
284
|
+
changed = true;
|
|
285
|
+
return { ...call, function: { ...fn, arguments: err === null ? pyDumps(args) : "{}" } };
|
|
286
|
+
}
|
|
287
|
+
return call;
|
|
288
|
+
});
|
|
289
|
+
return changed ? { ...native, tool_calls: repaired } : native;
|
|
290
|
+
}
|
|
291
|
+
export class ChatCompletionsAdapter extends HttpAdapter {
|
|
292
|
+
constructor() {
|
|
293
|
+
super(...arguments);
|
|
294
|
+
this.style = "chat_completions";
|
|
295
|
+
}
|
|
296
|
+
wireMessages(system, messages) {
|
|
297
|
+
const out = [{ role: "system", content: system }];
|
|
298
|
+
for (const message of messages) {
|
|
299
|
+
if (message.role === "user") {
|
|
300
|
+
out.push({ role: "user", content: message.text });
|
|
301
|
+
}
|
|
302
|
+
else if (message.role === "assistant") {
|
|
303
|
+
if (message.native !== null && message.nativeStyle === this.style)
|
|
304
|
+
out.push(replayable(message.native));
|
|
305
|
+
else
|
|
306
|
+
out.push({ role: "assistant", content: message.text });
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
for (const result of message.results) {
|
|
310
|
+
out.push({ role: "tool", tool_call_id: result.callId, content: result.content });
|
|
311
|
+
}
|
|
312
|
+
if (message.text)
|
|
313
|
+
out.push({ role: "user", content: message.text });
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return out;
|
|
317
|
+
}
|
|
318
|
+
async complete(request) {
|
|
319
|
+
const body = {
|
|
320
|
+
model: this.model,
|
|
321
|
+
messages: this.wireMessages(request.system, request.messages),
|
|
322
|
+
[this.maxTokensParam]: this.answerLimit(request.maxOutputTokens),
|
|
323
|
+
};
|
|
324
|
+
if (request.tools.length) {
|
|
325
|
+
body.tools = request.tools.map((t) => ({
|
|
326
|
+
type: "function",
|
|
327
|
+
function: { name: t.name, description: t.description, parameters: t.parameters },
|
|
328
|
+
}));
|
|
329
|
+
body.tool_choice = "auto";
|
|
330
|
+
}
|
|
331
|
+
const data = await this.post(`${this.base}/chat/completions`, this.withExtra(body), request.signal);
|
|
332
|
+
const choices = Array.isArray(data.choices) ? data.choices : [];
|
|
333
|
+
if (!choices.length)
|
|
334
|
+
throw new ModelProviderError(`${this.provider} returned no choices`);
|
|
335
|
+
const choice = isPlainObject(choices[0]) ? choices[0] : {};
|
|
336
|
+
const msg = isPlainObject(choice.message) ? choice.message : {};
|
|
337
|
+
const rawCalls = Array.isArray(msg.tool_calls) ? msg.tool_calls : [];
|
|
338
|
+
const calls = [];
|
|
339
|
+
for (const raw of rawCalls) {
|
|
340
|
+
const call = isPlainObject(raw) ? raw : {};
|
|
341
|
+
const fn = isPlainObject(call.function) ? call.function : {};
|
|
342
|
+
const [args, err] = parseArguments(fn.arguments);
|
|
343
|
+
calls.push({
|
|
344
|
+
id: String(or(call.id, `call_${calls.length}`)),
|
|
345
|
+
name: String(or(fn.name, "")),
|
|
346
|
+
arguments: args,
|
|
347
|
+
parseError: err,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
const native = { role: "assistant", content: msg.content ?? null };
|
|
351
|
+
if (truthy(msg.tool_calls))
|
|
352
|
+
native.tool_calls = msg.tool_calls;
|
|
353
|
+
if (msg.reasoning_content !== undefined && msg.reasoning_content !== null) {
|
|
354
|
+
native.reasoning_content = msg.reasoning_content;
|
|
355
|
+
}
|
|
356
|
+
const usage = isPlainObject(data.usage) ? data.usage : {};
|
|
357
|
+
return new ModelTurn(typeof msg.content === "string" ? msg.content : "", calls, new Usage(toInt(usage.prompt_tokens), toInt(usage.completion_tokens)), String(or(choice.finish_reason, "")), native);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
export class MessagesAdapter extends HttpAdapter {
|
|
361
|
+
constructor() {
|
|
362
|
+
super(...arguments);
|
|
363
|
+
this.style = "messages";
|
|
364
|
+
}
|
|
365
|
+
wireMessages(messages) {
|
|
366
|
+
const out = [];
|
|
367
|
+
for (const message of messages) {
|
|
368
|
+
if (message.role === "user") {
|
|
369
|
+
out.push({ role: "user", content: message.text });
|
|
370
|
+
}
|
|
371
|
+
else if (message.role === "assistant") {
|
|
372
|
+
if (message.native !== null && message.nativeStyle === this.style) {
|
|
373
|
+
out.push({ role: "assistant", content: message.native });
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
out.push({ role: "assistant", content: [{ type: "text", text: message.text || "(no text)" }] });
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
const content = message.results.map((r) => ({
|
|
381
|
+
type: "tool_result",
|
|
382
|
+
tool_use_id: r.callId,
|
|
383
|
+
content: r.content,
|
|
384
|
+
is_error: Boolean(r.isError),
|
|
385
|
+
}));
|
|
386
|
+
if (message.text)
|
|
387
|
+
content.push({ type: "text", text: message.text });
|
|
388
|
+
out.push({ role: "user", content });
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return out;
|
|
392
|
+
}
|
|
393
|
+
async complete(request) {
|
|
394
|
+
const body = {
|
|
395
|
+
model: this.model,
|
|
396
|
+
system: request.system,
|
|
397
|
+
messages: this.wireMessages(request.messages),
|
|
398
|
+
max_tokens: this.answerLimit(request.maxOutputTokens),
|
|
399
|
+
};
|
|
400
|
+
if (request.tools.length) {
|
|
401
|
+
body.tools = request.tools.map((t) => ({ name: t.name, description: t.description, input_schema: t.parameters }));
|
|
402
|
+
}
|
|
403
|
+
const data = await this.post(`${this.base}/messages`, this.withExtra(body), request.signal);
|
|
404
|
+
const blocks = Array.isArray(data.content) ? data.content : [];
|
|
405
|
+
const texts = [];
|
|
406
|
+
const calls = [];
|
|
407
|
+
for (const raw of blocks) {
|
|
408
|
+
const block = isPlainObject(raw) ? raw : {};
|
|
409
|
+
if (block.type === "text") {
|
|
410
|
+
texts.push(String(or(block.text, "")));
|
|
411
|
+
}
|
|
412
|
+
else if (block.type === "tool_use") {
|
|
413
|
+
const [args, err] = parseArguments(block.input);
|
|
414
|
+
calls.push({ id: String(block.id), name: String(or(block.name, "")), arguments: args, parseError: err });
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
const usage = isPlainObject(data.usage) ? data.usage : {};
|
|
418
|
+
const inputTokens = toInt(usage.input_tokens) + toInt(usage.cache_creation_input_tokens) + toInt(usage.cache_read_input_tokens);
|
|
419
|
+
return new ModelTurn(texts.join(""), calls, new Usage(inputTokens, toInt(usage.output_tokens)), String(or(data.stop_reason, "")), blocks);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
const SCHEMA_KEYS = new Set([
|
|
423
|
+
"type", "format", "description", "nullable", "enum", "items", "properties", "required",
|
|
424
|
+
"minimum", "maximum", "minItems", "maxItems", "minLength", "maxLength", "pattern",
|
|
425
|
+
]);
|
|
426
|
+
/** Reduce a JSON schema to the subset function declarations accept. */
|
|
427
|
+
export function declarationSchema(schema) {
|
|
428
|
+
if (!isPlainObject(schema))
|
|
429
|
+
return schema;
|
|
430
|
+
const out = {};
|
|
431
|
+
for (const [key, value] of Object.entries(schema)) {
|
|
432
|
+
if (!SCHEMA_KEYS.has(key))
|
|
433
|
+
continue;
|
|
434
|
+
if (key === "type" && typeof value === "string")
|
|
435
|
+
out[key] = value.toUpperCase();
|
|
436
|
+
else if (key === "properties" && isPlainObject(value)) {
|
|
437
|
+
out[key] = Object.fromEntries(Object.entries(value).map(([name, sub]) => [name, declarationSchema(sub)]));
|
|
438
|
+
}
|
|
439
|
+
else if (key === "items")
|
|
440
|
+
out[key] = declarationSchema(value);
|
|
441
|
+
else
|
|
442
|
+
out[key] = value;
|
|
443
|
+
}
|
|
444
|
+
return out;
|
|
445
|
+
}
|
|
446
|
+
export class GenerateContentAdapter extends HttpAdapter {
|
|
447
|
+
constructor() {
|
|
448
|
+
super(...arguments);
|
|
449
|
+
this.style = "generate_content";
|
|
450
|
+
}
|
|
451
|
+
wireContents(messages) {
|
|
452
|
+
const out = [];
|
|
453
|
+
for (const message of messages) {
|
|
454
|
+
if (message.role === "user") {
|
|
455
|
+
out.push({ role: "user", parts: [{ text: message.text }] });
|
|
456
|
+
}
|
|
457
|
+
else if (message.role === "assistant") {
|
|
458
|
+
if (message.native !== null && message.nativeStyle === this.style)
|
|
459
|
+
out.push(message.native);
|
|
460
|
+
else
|
|
461
|
+
out.push({ role: "model", parts: [{ text: message.text || "(no text)" }] });
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
const parts = message.results.map((r) => {
|
|
465
|
+
let payload;
|
|
466
|
+
try {
|
|
467
|
+
payload = JSON.parse(r.content);
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
payload = r.content;
|
|
471
|
+
}
|
|
472
|
+
if (!isPlainObject(payload))
|
|
473
|
+
payload = { result: payload };
|
|
474
|
+
return { functionResponse: { name: r.name, response: payload } };
|
|
475
|
+
});
|
|
476
|
+
if (message.text)
|
|
477
|
+
parts.push({ text: message.text });
|
|
478
|
+
out.push({ role: "user", parts });
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
return out;
|
|
482
|
+
}
|
|
483
|
+
async complete(request) {
|
|
484
|
+
const body = {
|
|
485
|
+
systemInstruction: { parts: [{ text: request.system }] },
|
|
486
|
+
contents: this.wireContents(request.messages),
|
|
487
|
+
generationConfig: { maxOutputTokens: this.answerLimit(request.maxOutputTokens) },
|
|
488
|
+
};
|
|
489
|
+
if (request.tools.length) {
|
|
490
|
+
body.tools = [
|
|
491
|
+
{
|
|
492
|
+
functionDeclarations: request.tools.map((t) => ({
|
|
493
|
+
name: t.name,
|
|
494
|
+
description: t.description,
|
|
495
|
+
parameters: declarationSchema(t.parameters),
|
|
496
|
+
})),
|
|
497
|
+
},
|
|
498
|
+
];
|
|
499
|
+
}
|
|
500
|
+
const data = await this.post(`${this.base}/models/${this.model}:generateContent`, this.withExtra(body), request.signal);
|
|
501
|
+
const candidates = Array.isArray(data.candidates) ? data.candidates : [];
|
|
502
|
+
if (!candidates.length)
|
|
503
|
+
throw new ModelProviderError(`${this.provider} returned no candidates`);
|
|
504
|
+
const first = isPlainObject(candidates[0]) ? candidates[0] : {};
|
|
505
|
+
const content = truthy(first.content) && isPlainObject(first.content) ? first.content : { role: "model", parts: [] };
|
|
506
|
+
const texts = [];
|
|
507
|
+
const calls = [];
|
|
508
|
+
const parts = Array.isArray(content.parts) ? content.parts : [];
|
|
509
|
+
for (const raw of parts) {
|
|
510
|
+
const part = isPlainObject(raw) ? raw : {};
|
|
511
|
+
if ("functionCall" in part) {
|
|
512
|
+
const fc = isPlainObject(part.functionCall) ? part.functionCall : {};
|
|
513
|
+
const [args, err] = parseArguments(fc.args);
|
|
514
|
+
calls.push({
|
|
515
|
+
id: String(or(fc.id, `call_${calls.length}`)),
|
|
516
|
+
name: String(or(fc.name, "")),
|
|
517
|
+
arguments: args,
|
|
518
|
+
parseError: err,
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
else if ("text" in part && !truthy(part.thought)) {
|
|
522
|
+
texts.push(String(part.text));
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
const usage = isPlainObject(data.usageMetadata) ? data.usageMetadata : {};
|
|
526
|
+
const output = toInt(usage.candidatesTokenCount) + toInt(usage.thoughtsTokenCount);
|
|
527
|
+
return new ModelTurn(texts.join(""), calls, new Usage(toInt(usage.promptTokenCount), output), String(or(first.finishReason, "")), content);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
const ADAPTERS = {
|
|
531
|
+
chat_completions: ChatCompletionsAdapter,
|
|
532
|
+
messages: MessagesAdapter,
|
|
533
|
+
generate_content: GenerateContentAdapter,
|
|
534
|
+
};
|
|
535
|
+
/** The adapter for a resolved roster entry's wire style. */
|
|
536
|
+
export function buildAdapter(resolved, options = {}) {
|
|
537
|
+
const style = resolved.entry.api.style;
|
|
538
|
+
const cls = Object.prototype.hasOwnProperty.call(ADAPTERS, style) ? ADAPTERS[style] : undefined;
|
|
539
|
+
if (!cls)
|
|
540
|
+
throw new Error(`unsupported wire style '${style}'`);
|
|
541
|
+
return new cls(resolved, options);
|
|
542
|
+
}
|
|
543
|
+
//# sourceMappingURL=adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../../src/agent/adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAuBvG,MAAM,OAAO,KAAK;IACd,YACW,cAAc,CAAC,EACf,eAAe,CAAC;QADhB,gBAAW,GAAX,WAAW,CAAI;QACf,iBAAY,GAAZ,YAAY,CAAI;IACxB,CAAC;IAEJ,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;IAChD,CAAC;IAED,GAAG,CAAC,KAAY;QACZ,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC;IAC5C,CAAC;CACJ;AAID;;;;;;GAMG;AACH,MAAM,OAAO,OAAO;IAQhB,YAAY,IAOX;QACG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;IAChD,CAAC;CACJ;AAED,8DAA8D;AAC9D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;AACrE;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC7B,yBAAyB;IACzB,gBAAgB,EAAE,8BAA8B,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe;IACzF,cAAc,EAAE,+BAA+B,EAAE,OAAO;IACxD,WAAW;IACX,SAAS,EAAE,YAAY;IACvB,mBAAmB;IACnB,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO;IACtG,yBAAyB,EAAE,sBAAsB,EAAE,qBAAqB;CAC3E,CAAC,CAAC;AAEH,MAAM,OAAO,SAAS;IAClB,YACa,IAAY,EACZ,SAAqB,EACrB,KAAY,EACZ,IAAY,EACZ,SAAkB,IAAI;QAJtB,SAAI,GAAJ,IAAI,CAAQ;QACZ,cAAS,GAAT,SAAS,CAAY;QACrB,UAAK,GAAL,KAAK,CAAO;QACZ,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAgB;IAChC,CAAC;IAEJ,gGAAgG;IAChG,IAAI,MAAM;QACN,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED,iEAAiE;IACjE,IAAI,aAAa;QACb,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;CACJ;AAED,qEAAqE;AACrE,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzC,YAAY,OAAe,EAAE,aAA4B,IAAI;QACzD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;CACJ;AAyBD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC5E,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,SAAS,iBAAiB,CAAC,QAAkB,EAAE,OAAe;IAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAChD,IAAI,KAAK,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAAE,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC;IACrF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC3B,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,4GAA4G;AAC5G,SAAS,UAAU,CAAC,KAAqC,EAAE,SAAiB;IACxE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IACnI,IAAI,KAAK,EAAE,CAAC;QACR,IAAI,KAAK,CAAC,OAAO;YAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;YAC7C,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO;QACH,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,IAAI,EAAE,GAAG,EAAE;YACP,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;KACJ,CAAC;AACN,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,QAAkB;IACnC,IAAI,CAAC;QACD,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACL,yBAAyB;IAC7B,CAAC;AACL,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,OAAO,EAAkB,CAAC;AAEnD,MAAe,WAAW;IActB,YAAY,QAAuB,EAAE,UAA0B,EAAE;QAC7D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACrC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,kBAAkB,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrF,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAA8B,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACrG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAM,CAAC;QAC7C,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,6FAA6F;IACnF,WAAW,CAAC,SAAiB;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,4EAA4E;IAClE,SAAS,CAAC,IAA6B;QAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,OAAO;QACX,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACrG,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,GAAG,EAAE,CAAC;;YAClE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QAC9B,OAAO,OAAO,CAAC;IACnB,CAAC;IAES,KAAK,CAAC,IAAI,CAChB,GAAW,EACX,IAA6B,EAC7B,MAA2B;QAE3B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;YACzD,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,IAAI,UAAU,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,QAAkB,CAAC;YACvB,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC;gBACD,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;oBACjC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;oBACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;iBACtB,CAAC,CAAC;gBACH,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnG,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,IAAI,MAAM,EAAE,OAAO;oBAAE,MAAM,IAAI,UAAU,EAAE,CAAC;gBAC5C,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBACxB,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,EAAE,MAAM,CAAC,CAAC;oBACzC,SAAS;gBACb,CAAC;gBACD,MAAM,IAAI,kBAAkB,CAAC,GAAG,IAAI,CAAC,QAAQ,KAAM,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChG,CAAC;YACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;gBAC7D,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACtB,MAAM,KAAK,CAAC,IAAI,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;gBACjE,SAAS;YACb,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,kBAAkB,CACxB,GAAG,IAAI,CAAC,QAAQ,aAAa,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,IAAI,CAAC,EAAE,EAClE,QAAQ,CAAC,MAAM,CAClB,CAAC;YACN,CAAC;YACD,IAAI,IAAa,CAAC;YAClB,IAAI,CAAC;gBACD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACL,MAAM,IAAI,kBAAkB,CAAC,GAAG,IAAI,CAAC,QAAQ,mCAAmC,CAAC,CAAC;YACtF,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,kBAAkB,CAAC,GAAG,IAAI,CAAC,QAAQ,6BAA6B,CAAC,CAAC;YAChF,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,IAAI,kBAAkB,CAAC,GAAG,IAAI,CAAC,QAAQ,qBAAqB,CAAC,CAAC;IACxE,CAAC;CAGJ;AAED,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAAC,GAAY;IACvC,IAAI,aAAa,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACvE,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,EAAE,4CAA4C,CAAC,CAAC;IACzF,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,EAAE,iCAAkC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC;IAC5E,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe;IACtC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/E,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAa,EAAE,EAAE;QACrD,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5D,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,cAAc,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3E,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5F,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAClE,CAAC;AAED,MAAM,OAAO,sBAAuB,SAAQ,WAAW;IAAvD;;QACa,UAAK,GAAG,kBAAkB,CAAC;IAiExC,CAAC;IA/DW,YAAY,CAAC,MAAc,EAAE,QAAmB;QACpD,MAAM,GAAG,GAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACtC,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,KAAK;oBAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;;oBACnG,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACJ,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACnC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrF,CAAC;gBACD,IAAI,OAAO,CAAC,IAAI;oBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACxE,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACnC,MAAM,IAAI,GAA4B;YAClC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC;YAC7D,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC;SACnE,CAAC;QACF,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE;aACnF,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC9B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACpG,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,IAAI,CAAC,QAAQ,sBAAsB,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,cAAc,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC/C,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC7B,SAAS,EAAE,IAAI;gBACf,UAAU,EAAE,GAAG;aAClB,CAAC,CAAC;QACP,CAAC;QACD,MAAM,MAAM,GAA4B,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;QAC5F,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAC/D,IAAI,GAAG,CAAC,iBAAiB,KAAK,SAAS,IAAI,GAAG,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;YACxE,MAAM,CAAC,iBAAiB,GAAG,GAAG,CAAC,iBAAiB,CAAC;QACrD,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,IAAI,SAAS,CAChB,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAClD,KAAK,EACL,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,EACrE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,EACpC,MAAM,CACT,CAAC;IACN,CAAC;CACJ;AAED,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAAhD;;QACa,UAAK,GAAG,UAAU,CAAC;IA6DhC,CAAC;IA3DW,YAAY,CAAC,QAAmB;QACpC,MAAM,GAAG,GAAc,EAAE,CAAC;QAC1B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACtC,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;oBAChE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC7D,CAAC;qBAAM,CAAC;oBACJ,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;gBACpG,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,OAAO,GAAc,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnD,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE,CAAC,CAAC,MAAM;oBACrB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;iBAC/B,CAAC,CAAC,CAAC;gBACJ,IAAI,OAAO,CAAC,IAAI;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACxC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACnC,MAAM,IAAI,GAA4B;YAClC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC7C,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC;SACxD,CAAC;QACF,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACtH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7G,CAAC;QACL,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,WAAW,GACb,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAChH,OAAO,IAAI,SAAS,CAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EACd,KAAK,EACL,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAClD,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,EAChC,MAAM,CACT,CAAC;IACN,CAAC;CACJ;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACxB,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU;IACtF,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS;CACpF,CAAC,CAAC;AAEH,uEAAuE;AACvE,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC7C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACpC,IAAI,GAAG,KAAK,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;aAC3E,IAAI,GAAG,KAAK,YAAY,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9G,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;;YAC3D,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,MAAM,OAAO,sBAAuB,SAAQ,WAAW;IAAvD;;QACa,UAAK,GAAG,kBAAkB,CAAC;IAkFxC,CAAC;IAhFW,YAAY,CAAC,QAAmB;QACpC,MAAM,GAAG,GAAc,EAAE,CAAC;QAC1B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACtC,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,KAAK;oBAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;;oBACvF,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACJ,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACpC,IAAI,OAAgB,CAAC;oBACrB,IAAI,CAAC;wBACD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBACpC,CAAC;oBAAC,MAAM,CAAC;wBACL,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;oBACxB,CAAC;oBACD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;wBAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;oBAC3D,OAAO,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAA6B,CAAC;gBAChG,CAAC,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,IAAI;oBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACnC,MAAM,IAAI,GAA4B;YAClC,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE;YACxD,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC7C,gBAAgB,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;SACnF,CAAC;QACF,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG;gBACT;oBACI,oBAAoB,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC5C,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;wBAC1B,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC;qBAC9C,CAAC,CAAC;iBACN;aACJ,CAAC;QACN,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CACxB,GAAG,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,KAAK,kBAAkB,EACnD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EACpB,OAAO,CAAC,MAAM,CACjB,CAAC;QACF,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,IAAI,CAAC,QAAQ,yBAAyB,CAAC,CAAC;QAChG,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACrH,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;gBACzB,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC;oBACP,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC7C,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC7B,SAAS,EAAE,IAAI;oBACf,UAAU,EAAE,GAAG;iBAClB,CAAC,CAAC;YACP,CAAC;iBAAM,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAClC,CAAC;QACL,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACnF,OAAO,IAAI,SAAS,CAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EACd,KAAK,EACL,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,EAChD,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,EAClC,OAAO,CACV,CAAC;IACN,CAAC;CACJ;AAED,MAAM,QAAQ,GAA2F;IACrG,gBAAgB,EAAE,sBAAsB;IACxC,QAAQ,EAAE,eAAe;IACzB,gBAAgB,EAAE,sBAAsB;CAC3C,CAAC;AAEF,4DAA4D;AAC5D,MAAM,UAAU,YAAY,CAAC,QAAuB,EAAE,UAA0B,EAAE;IAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChG,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,GAAG,CAAC,CAAC;IAC/D,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seams where the business plugs in the checks it already trusts.
|
|
3
|
+
*
|
|
4
|
+
* The agent calls these at three moments:
|
|
5
|
+
*
|
|
6
|
+
* - `beforeModel`: just before each model call. Throw `HookBlocked` to stop
|
|
7
|
+
* the run (for example a moderation check on the user's message).
|
|
8
|
+
* - `beforeAct`: just before each action is sent to Harny. Return
|
|
9
|
+
* `ActDecision.deny(reason)` to skip it; the model is told it was not allowed.
|
|
10
|
+
* - `afterAct`: after Harny answers, with the outcome (for logging or alerts).
|
|
11
|
+
*
|
|
12
|
+
* A hook can narrow what the agent does; it cannot widen it. Harny still
|
|
13
|
+
* applies the business's acting policy, works out which kinds of action each
|
|
14
|
+
* one is and records every action on its own server, whatever a hook returns.
|
|
15
|
+
*/
|
|
16
|
+
import type { ActionInitiator, ActionOutcome } from "../index.js";
|
|
17
|
+
import type { Message } from "./adapters.js";
|
|
18
|
+
/** Thrown by a hook to stop the run. The message is kept on the result, not shown. */
|
|
19
|
+
export declare class HookBlocked extends Error {
|
|
20
|
+
constructor(message: string);
|
|
21
|
+
}
|
|
22
|
+
export interface HookContext {
|
|
23
|
+
readonly runId: string;
|
|
24
|
+
readonly user: string;
|
|
25
|
+
readonly sessionId: string;
|
|
26
|
+
readonly initiatedBy: ActionInitiator;
|
|
27
|
+
readonly step: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class ActDecision {
|
|
30
|
+
readonly allow: boolean;
|
|
31
|
+
readonly reason: string;
|
|
32
|
+
private constructor();
|
|
33
|
+
static allowed(): ActDecision;
|
|
34
|
+
static deny(reason: string): ActDecision;
|
|
35
|
+
}
|
|
36
|
+
/** Implement the ones you need; a missing hook does nothing. */
|
|
37
|
+
export interface AgentHooks {
|
|
38
|
+
beforeModel?(ctx: HookContext, input: {
|
|
39
|
+
system: string;
|
|
40
|
+
messages: Message[];
|
|
41
|
+
}): void | Promise<void>;
|
|
42
|
+
/** Return `ActDecision.allowed()` or `ActDecision.deny(reason)`. */
|
|
43
|
+
beforeAct?(ctx: HookContext, input: {
|
|
44
|
+
action: string;
|
|
45
|
+
arguments: Record<string, unknown>;
|
|
46
|
+
}): ActDecision | Promise<ActDecision>;
|
|
47
|
+
afterAct?(ctx: HookContext, input: {
|
|
48
|
+
action: string;
|
|
49
|
+
arguments: Record<string, unknown>;
|
|
50
|
+
outcome: ActionOutcome;
|
|
51
|
+
}): void | Promise<void>;
|
|
52
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seams where the business plugs in the checks it already trusts.
|
|
3
|
+
*
|
|
4
|
+
* The agent calls these at three moments:
|
|
5
|
+
*
|
|
6
|
+
* - `beforeModel`: just before each model call. Throw `HookBlocked` to stop
|
|
7
|
+
* the run (for example a moderation check on the user's message).
|
|
8
|
+
* - `beforeAct`: just before each action is sent to Harny. Return
|
|
9
|
+
* `ActDecision.deny(reason)` to skip it; the model is told it was not allowed.
|
|
10
|
+
* - `afterAct`: after Harny answers, with the outcome (for logging or alerts).
|
|
11
|
+
*
|
|
12
|
+
* A hook can narrow what the agent does; it cannot widen it. Harny still
|
|
13
|
+
* applies the business's acting policy, works out which kinds of action each
|
|
14
|
+
* one is and records every action on its own server, whatever a hook returns.
|
|
15
|
+
*/
|
|
16
|
+
/** Thrown by a hook to stop the run. The message is kept on the result, not shown. */
|
|
17
|
+
export class HookBlocked extends Error {
|
|
18
|
+
constructor(message) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = "HookBlocked";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class ActDecision {
|
|
24
|
+
constructor(allow, reason = "") {
|
|
25
|
+
this.allow = allow;
|
|
26
|
+
this.reason = reason;
|
|
27
|
+
Object.freeze(this);
|
|
28
|
+
}
|
|
29
|
+
static allowed() {
|
|
30
|
+
return new ActDecision(true);
|
|
31
|
+
}
|
|
32
|
+
static deny(reason) {
|
|
33
|
+
return new ActDecision(false, reason);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=hooks.js.map
|