@wrongstack/providers 0.8.4 → 0.8.6
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/index.js +41 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -13,11 +13,32 @@ var __export = (target, all) => {
|
|
|
13
13
|
function parseToolInput(raw) {
|
|
14
14
|
if (!raw) return {};
|
|
15
15
|
const parsed = safeParse(raw);
|
|
16
|
-
if (!parsed.ok)
|
|
16
|
+
if (!parsed.ok) {
|
|
17
|
+
const trimmed = raw.trim();
|
|
18
|
+
if (trimmed.startsWith('"') && trimmed.endsWith('"')) {
|
|
19
|
+
const unescaped = safeParse(raw);
|
|
20
|
+
if (unescaped.ok && typeof unescaped.value === "string") {
|
|
21
|
+
const innerParsed = safeParse(unescaped.value);
|
|
22
|
+
if (innerParsed.ok && innerParsed.value && typeof innerParsed.value === "object" && !Array.isArray(innerParsed.value)) {
|
|
23
|
+
return innerParsed.value;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return { __raw: raw };
|
|
28
|
+
}
|
|
17
29
|
const v = parsed.value;
|
|
18
30
|
if (v && typeof v === "object" && !Array.isArray(v)) {
|
|
19
31
|
return v;
|
|
20
32
|
}
|
|
33
|
+
if (typeof v === "string") {
|
|
34
|
+
const trimmed = v.trim();
|
|
35
|
+
if (trimmed.startsWith("{") && trimmed.endsWith("}")) {
|
|
36
|
+
const parsed2 = safeParse(trimmed);
|
|
37
|
+
if (parsed2.ok && parsed2.value && typeof parsed2.value === "object" && !Array.isArray(parsed2.value)) {
|
|
38
|
+
return parsed2.value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
21
42
|
return { __raw: v ?? raw };
|
|
22
43
|
}
|
|
23
44
|
var init_tool_input = __esm({
|
|
@@ -823,7 +844,7 @@ function messagesToGemini(messages) {
|
|
|
823
844
|
if (b.type === "text" && b.text) textParts.push({ text: b.text });
|
|
824
845
|
else if (b.type === "tool_result") {
|
|
825
846
|
const responseText = typeof b.content === "string" ? b.content : JSON.stringify(b.content);
|
|
826
|
-
const fnName = b.tool_use_id ?? "unknown";
|
|
847
|
+
const fnName = b.name ?? b.tool_use_id ?? "unknown";
|
|
827
848
|
functionParts.push({
|
|
828
849
|
functionResponse: {
|
|
829
850
|
name: fnName,
|
|
@@ -2017,6 +2038,15 @@ function parseToolArguments(raw, toolName, toolCallId, opts) {
|
|
|
2017
2038
|
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
2018
2039
|
return parsed;
|
|
2019
2040
|
}
|
|
2041
|
+
if (typeof parsed === "string") {
|
|
2042
|
+
const trimmed = parsed.trim();
|
|
2043
|
+
if (trimmed.startsWith("{") && trimmed.endsWith("}")) {
|
|
2044
|
+
const parsed2 = JSON.parse(trimmed);
|
|
2045
|
+
if (parsed2 && typeof parsed2 === "object" && !Array.isArray(parsed2)) {
|
|
2046
|
+
return parsed2;
|
|
2047
|
+
}
|
|
2048
|
+
}
|
|
2049
|
+
}
|
|
2020
2050
|
opts.onParseFailure?.({ toolName, toolCallId, raw });
|
|
2021
2051
|
return { __raw_arguments: raw };
|
|
2022
2052
|
} catch {
|
|
@@ -2027,6 +2057,15 @@ function parseToolArguments(raw, toolName, toolCallId, opts) {
|
|
|
2027
2057
|
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
2028
2058
|
return parsed;
|
|
2029
2059
|
}
|
|
2060
|
+
if (typeof parsed === "string") {
|
|
2061
|
+
const trimmed = parsed.trim();
|
|
2062
|
+
if (trimmed.startsWith("{") && trimmed.endsWith("}")) {
|
|
2063
|
+
const parsed2 = JSON.parse(trimmed);
|
|
2064
|
+
if (parsed2 && typeof parsed2 === "object" && !Array.isArray(parsed2)) {
|
|
2065
|
+
return parsed2;
|
|
2066
|
+
}
|
|
2067
|
+
}
|
|
2068
|
+
}
|
|
2030
2069
|
} catch {
|
|
2031
2070
|
}
|
|
2032
2071
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/_tool-input.ts","../src/aggregate.ts","../src/anthropic.ts","../src/error-parse.ts","../src/family-capabilities.ts","../src/sse.ts","../src/stop-reason.ts","../src/tool-format/to-anthropic.ts","../src/wire-adapter.ts","../src/google.ts","../src/openai.ts","../src/tool-format/to-openai.ts","../src/openai-compatible.ts","../src/wire-format.ts","../src/presets/mistral.ts","../src/presets/anthropic.ts","../src/presets/openai.ts","../src/presets/google.ts","../src/capabilities.ts","../src/tool-format/from-anthropic.ts","../src/tool-format/from-openai.ts","../src/index.ts"],"names":["aggregateStream","ProviderError","safeParse","DEFAULT_BASE","randomUUID","DEFAULT_VERSION","stripCacheControl","messagesToGemini","toolsToGemini","sanitizeSchemaForGemini","GEMINI_ALLOWED_KEYS"],"mappings":";;;;;;;;;;;;AAsBO,SAAS,eAAe,GAAA,EAAkD;AAC/E,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,MAAM,MAAA,GAAS,UAAmB,GAAG,CAAA;AACrC,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,EAAE,OAAO,GAAA,EAAI;AACpC,EAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AACjB,EAAA,IAAI,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AACnD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,CAAA,IAAK,GAAA,EAAI;AAC3B;AA/BA,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oBAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAYA,eAAsB,eAAA,CACpB,QACA,OAAA,EACmB;AACnB,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,UAAA,GAAyB,UAAA;AAC7B,EAAA,IAAI,KAAA,GAAe,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AACzC,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,IAAI,gBAAA,GAAmB,EAAA;AACvB,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAGtB;AACF,EAAA,MAAM,kBAID,EAAC;AACN,EAAA,IAAI,oBAAA,GAAuB,EAAA;AAC3B,EAAA,MAAM,aAEF,EAAC;AAEL,EAAA,WAAA,MAAiB,MAAM,MAAA,EAAQ;AAC7B,IAAA,IAAI,OAAA,UAAiB,EAAE,CAAA;AACvB,IAAA,QAAQ,GAAG,IAAA;AAAM,MACf,KAAK,eAAA;AACH,QAAA,KAAA,GAAQ,EAAA,CAAG,KAAA;AACX,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,IAAI,qBAAqB,EAAA,EAAI;AAC3B,UAAA,gBAAA,GAAmB,WAAA,CAAY,MAAA;AAC/B,UAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AACnB,UAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,kBAAkB,CAAA;AAAA,QACzD;AACA,QAAA,WAAA,CAAY,gBAAgB,CAAA,GAAA,CAAK,WAAA,CAAY,gBAAgB,CAAA,IAAK,MAAM,EAAA,CAAG,IAAA;AAC3E,QAAA;AAAA,MACF,KAAK,gBAAA;AAGH,QAAA,gBAAA,GAAmB,EAAA;AACnB,QAAA,WAAA,CAAY,GAAA,CAAI,GAAG,EAAA,EAAI,EAAE,MAAM,EAAA,CAAG,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,CAAA;AACrD,QAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,QAAQ,EAAA,EAAI,EAAA,CAAG,IAAI,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,sBAAA,EAAwB;AAC3B,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AAC/B,QAAA,IAAI,CAAA,EAAG,CAAA,CAAE,OAAA,IAAW,EAAA,CAAG,OAAA;AACvB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,eAAA,EAAiB;AACpB,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AAC/B,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,IAAI,EAAA,CAAG,UAAU,MAAA,EAAW;AAE1B,YAAA,CAAA,CAAE,KAAA,GAAQ,cAAA,CAAe,CAAA,CAAE,OAAO,CAAA;AAAA,UACpC,CAAA,MAAA,IAAW,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,EAAU;AAEvC,YAAA,CAAA,CAAE,KAAA,GAAQ,cAAA,CAAe,EAAA,CAAG,KAAK,CAAA;AAAA,UACnC,CAAA,MAAA,IAAW,EAAA,CAAG,KAAA,IAAS,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,EAAA,CAAG,KAAK,CAAA,EAAG;AAC/E,YAAA,CAAA,CAAE,QAAQ,EAAA,CAAG,KAAA;AAAA,UACf,CAAA,MAAO;AAEL,YAAA,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAA,EAAO,EAAA,CAAG,KAAA,EAAM;AAAA,UAC9B;AACA,UAAA,IAAI,EAAA,CAAG,YAAA,EAAc,CAAA,CAAE,YAAA,GAAe,EAAA,CAAG,YAAA;AAAA,QAC3C;AAEA,QAAA,gBAAA,GAAmB,EAAA;AACnB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,gBAAA,EAAkB;AACrB,QAAA,gBAAA,GAAmB,EAAA;AAKnB,QAAA,IAAI,oBAAA,KAAyB,EAAA,IAAM,CAAC,eAAA,CAAgB,oBAAoB,CAAA,EAAG;AACzE,UAAA,oBAAA,GAAuB,eAAA,CAAgB,MAAA;AACvC,UAAA,eAAA,CAAgB,IAAA,CAAK,EAAE,OAAA,EAAS,EAAA,EAAI,CAAA;AAAA,QACtC;AAGA,QAAA,IAAI,EAAA,CAAG,YAAA,IAAgB,oBAAA,IAAwB,CAAA,EAAG;AAChD,UAAA,eAAA,CAAgB,oBAAoB,CAAA,CAAG,YAAA,GAAe,EAAA,CAAG,YAAA;AAAA,QAC3D;AACA,QAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,sBAAsB,CAAA;AAC/D,QAAA;AAAA,MACF;AAAA,MACA,KAAK,gBAAA,EAAkB;AAIrB,QAAA,IAAI,oBAAA,KAAyB,EAAA,IAAM,CAAC,eAAA,CAAgB,oBAAoB,CAAA,EAAG;AACzE,UAAA,oBAAA,GAAuB,eAAA,CAAgB,MAAA;AACvC,UAAA,eAAA,CAAgB,IAAA,CAAK,EAAE,OAAA,EAAS,EAAA,EAAI,CAAA;AACpC,UAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,sBAAsB,CAAA;AAAA,QACjE;AACA,QAAA,MAAM,CAAA,GAAI,gBAAgB,oBAAoB,CAAA;AAC9C,QAAA,IAAI,CAAA,EAAG,CAAA,CAAE,OAAA,IAAW,EAAA,CAAG,IAAA;AACvB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,oBAAA,EAAsB;AAIzB,QAAA,IAAI,oBAAA,KAAyB,EAAA,IAAM,CAAC,eAAA,CAAgB,oBAAoB,CAAA,EAAG;AACzE,UAAA,oBAAA,GAAuB,eAAA,CAAgB,MAAA;AACvC,UAAA,eAAA,CAAgB,IAAA,CAAK,EAAE,OAAA,EAAS,EAAA,EAAI,CAAA;AACpC,UAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,sBAAsB,CAAA;AAAA,QACjE;AACA,QAAA,MAAM,CAAA,GAAI,gBAAgB,oBAAoB,CAAA;AAC9C,QAAA,IAAI,CAAA,EAAG,CAAA,CAAE,SAAA,GAAY,EAAA,CAAG,SAAA;AACxB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,eAAA,EAAiB;AACpB,QAAA,oBAAA,GAAuB,EAAA;AACvB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,cAAA;AACH,QAAA,UAAA,GAAa,EAAA,CAAG,UAAA;AAChB,QAAA,KAAA,GAAQ,EAAA,CAAG,KAAA;AACX,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAA,CAAE,GAAG,CAAA,IAAK,EAAA;AACnC,MAAA,IAAI,MAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,IAC/C,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY;AAChC,MAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,CAAA,CAAE,GAAG,CAAA;AAG/B,MAAA,IAAI,CAAC,CAAA,IAAM,CAAC,EAAE,OAAA,IAAW,CAAC,EAAE,SAAA,EAAY;AACxC,MAAA,MAAM,QAAsB,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,EAAE,OAAA,EAAQ;AACpE,MAAA,IAAI,CAAA,CAAE,SAAA,EAAY,KAAA,CAAiC,YAAY,CAAA,CAAE,SAAA;AACjE,MAAA,IAAI,CAAA,CAAE,gBAAgB,MAAA,CAAO,IAAA,CAAK,EAAE,YAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5D,QAAC,KAAA,CAAqD,eAAe,CAAA,CAAE,YAAA;AAAA,MACzE;AACA,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA;AAC/B,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,KAAA,GAAsB;AAAA,UAC1B,IAAA,EAAM,UAAA;AAAA,UACN,IAAI,CAAA,CAAE,EAAA;AAAA,UACN,MAAM,EAAA,CAAG,IAAA;AAAA,UACT,KAAA,EACE,EAAA,CAAG,KAAA,IAAS,OAAO,GAAG,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,EAAA,CAAG,KAAK,CAAA,GAC9D,EAAA,CAAG,QACJ;AAAC,SACT;AACA,QAAA,IAAI,EAAA,CAAG,gBAAgB,MAAA,CAAO,IAAA,CAAK,GAAG,YAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AAC9D,UAAC,KAAA,CAAqD,eAAe,EAAA,CAAG,YAAA;AAAA,QAC1E;AACA,QAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAA;AAEjE,EAAA,OAAO,EAAE,OAAA,EAAS,UAAA,EAAY,KAAA,EAAO,KAAA,EAAM;AAC7C;AA/KA,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kBAAA,GAAA;AACA,IAAA,eAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACQA,eAAA,EAAA;ACIO,SAAS,sBAAA,CACd,UAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,UAAU,OAAO,CAAA;AAC9B,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,UAAU,CAAA,MAAA,EAAS,MAAM,CAAA,CAAA;AAC5C,EAAA,OAAO,IAAI,cAAc,OAAA,EAAS,MAAA,EAAQ,WAAW,UAAA,EAAY,EAAE,MAAM,CAAA;AAC3E;AAEA,IAAM,eAAA,GAAkB,GAAA;AAExB,SAAS,UAAU,OAAA,EAAoC;AACrD,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,eAAe,CAAA;AAI5C,EAAA,MAAM,IAAA,GACJ,OAAA,CAAQ,MAAA,GAAS,eAAA,GACb,EAAE,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,OAAA,CAAQ,MAAA,EAAO,GAClD,EAAE,GAAA,EAAI;AACZ,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG,OAAO,IAAA;AAE5B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,IAAA;AAK9B,EAAA,MAAM,QAAA,GAAW,OAAO,OAAO,CAAA;AAC/B,EAAA,IAAI,QAAA,CAAS,QAAQ,CAAA,EAAG;AACtB,IAAA,MAAM,CAAA,GAAI,SAAS,QAAA,CAAS,MAAM,CAAC,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAC,CAAA;AACnE,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,SAAS,CAAC,CAAA;AACtC,IAAA,IAAI,CAAA,OAAQ,IAAA,GAAO,CAAA;AACnB,IAAA,IAAI,CAAA,OAAQ,OAAA,GAAU,CAAA;AAAA,EACxB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,EAAU;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA;AAAA,EACjB;AAEA,EAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,MAAA,CAAO,MAAM,CAAC,CAAA;AACjC,IAAA,IAAI,CAAA,IAAK,CAAA,KAAM,OAAA,EAAS,IAAA,CAAK,IAAA,GAAO,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,MAAA,CAAO,SAAS,CAAC,CAAA;AACpC,IAAA,IAAI,CAAA,OAAQ,OAAA,GAAU,CAAA;AAAA,EACxB;AAGA,EAAA,MAAM,KAAA,GACJ,QAAA,CAAS,MAAA,CAAO,YAAY,CAAC,CAAA,IAAK,QAAA,CAAS,MAAA,CAAO,WAAW,CAAC,CAAA,IAAK,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,CAAA;AAC1F,EAAA,IAAI,KAAA,OAAY,SAAA,GAAY,KAAA;AAE5B,EAAA,OAAO,IAAA;AACT;AAQA,SAAS,WAAA,CAAY,QAAgB,IAAA,EAAwB;AAC3D,EAAA,IAAI,MAAA,KAAW,GAAG,OAAO,IAAA;AACzB,EAAA,IAAI,WAAW,GAAA,IAAO,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,KAAK,OAAO,IAAA;AAC/D,EAAA,IAAI,MAAA,IAAU,GAAA,IAAO,MAAA,GAAS,GAAA,EAAK,OAAO,IAAA;AAC1C,EAAA,IAAI,IAAA,KAAS,kBAAA,IAAsB,IAAA,KAAS,kBAAA,EAAoB,OAAO,IAAA;AACvE,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAS,CAAA,EAA0C;AAC1D,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE;AAEA,SAAS,SAAS,CAAA,EAAgC;AAChD,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,IAAI,CAAA,GAAI,MAAA;AACrD;;;AC7FO,IAAM,sBAAA,GAA2D;AAAA,EACtE,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,IAAA;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,MAAA,EAAQ,IAAA;AAAA,IACR,SAAA,EAAW,IAAA;AAAA,IACX,WAAA,EAAa,IAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,IAAA;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,MAAA,EAAQ,IAAA;AAAA,IACR,SAAA,EAAW,IAAA;AAAA,IACX,WAAA,EAAa,KAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,KAAA,EAAO,IAAA;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,MAAA,EAAQ,KAAA;AAAA,IACR,SAAA,EAAW,IAAA;AAAA,IACX,WAAA,EAAa,KAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,IAAA;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,MAAA,EAAQ,IAAA;AAAA,IACR,SAAA,EAAW,IAAA;AAAA,IACX,WAAA,EAAa,KAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,KAAA;AAAA,IACP,aAAA,EAAe,KAAA;AAAA,IACf,MAAA,EAAQ,KAAA;AAAA,IACR,SAAA,EAAW,KAAA;AAAA,IACX,WAAA,EAAa,KAAA;AAAA,IACb,YAAA,EAAc,KAAA;AAAA,IACd,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,CAAA;AAAA,IACZ,YAAA,EAAc;AAAA;AAElB;AAEO,SAAS,qBAAA,CACd,MAAA,EACA,SAAA,GAAmC,EAAC,EACtB;AACd,EAAA,OAAO;AAAA,IACL,GAAI,sBAAA,CAAuB,MAAM,CAAA,IAAK,sBAAA,CAAuB,WAAA;AAAA,IAC7D,GAAG;AAAA,GACL;AACF;;;AC1CA,IAAM,mBAAmB,GAAA,GAAM,IAAA;AAE/B,gBAAuB,SACrB,IAAA,EAC2B;AAC3B,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,CAAY,OAAO,CAAA;AACvC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,KAAA,GAAQ,SAAA;AACZ,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,MAAM,QAAQ,MAA8B;AAC1C,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,IAAK,KAAA,KAAU,WAAW,OAAO,MAAA;AAC1D,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAM,GAAA,GAAkB,EAAE,KAAA,EAAO,IAAA,EAAK;AACtC,IAAA,KAAA,GAAQ,SAAA;AACR,IAAA,SAAA,CAAU,MAAA,GAAS,CAAA;AACnB,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAyC;AAC5D,IAAA,IAAI,IAAA,KAAS,EAAA,EAAI,OAAO,KAAA,EAAM;AAC9B,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,MAAA;AACjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,aAAa,EAAA,EAAI;AACnB,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,KAAA,GAAQ,EAAA;AAAA,IACV,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAC9B,MAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA;AAC/B,MAAA,IAAI,MAAM,UAAA,CAAW,GAAG,GAAG,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,KAAA,KAAU,OAAA,EAAS,KAAA,GAAQ,KAAA,IAAS,SAAA;AAAA,SAAA,IAC/B,KAAA,KAAU,MAAA,EAAQ,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAE/C,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAMA,EAAA,MAAM,WAAA,GAAc,CAAC,QAAA,KAA2B;AAC9C,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAA,IAAU,QAAA;AACV,IAAA,IAAI,MAAA,CAAO,SAAS,gBAAA,EAAkB;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,6BAA6B,gBAAgB,CAAA,4CAAA;AAAA,OAC/C;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG;AACxB,IAAA,WAAA,MAAiB,SAAS,IAAA,EAA+B;AACvD,MAAA,WAAA;AAAA,QACE,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,OAAA,CAAQ,OAAO,KAAA,EAAiB,EAAE,MAAA,EAAQ,IAAA,EAAM;AAAA,OACtF;AACA,MAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,CAAA;AAChC,MAAA,MAAA,GAAS,KAAA,CAAM,IAAA;AACf,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,QAAA,MAAM,GAAA,GAAM,YAAY,IAAI,CAAA;AAC5B,QAAA,IAAI,KAAK,MAAM,GAAA;AAAA,MACjB;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,MAAA,GAAU,KAAoC,SAAA,EAAU;AAC9D,IAAA,IAAI;AACF,MAAA,WAAS;AACP,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,WAAA,CAAY,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AACnD,QAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,CAAA;AAChC,QAAA,MAAA,GAAS,KAAA,CAAM,IAAA;AACf,QAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,UAAA,MAAM,GAAA,GAAM,YAAY,IAAI,CAAA;AAC5B,UAAA,IAAI,KAAK,MAAM,GAAA;AAAA,QACjB;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,MAAM,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AACjD,IAAA,IAAI,KAAK,MAAM,GAAA;AAAA,EACjB;AACA,EAAA,MAAM,QAAQ,KAAA,EAAM;AACpB,EAAA,IAAI,OAAO,MAAM,KAAA;AACnB;AAEA,SAAS,YAAY,GAAA,EAAgD;AAInE,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,EAAI,IAAK,EAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,IAAI,CAAE,CAAA;AACtE,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAEA,SAAS,eAAe,CAAA,EAAqB;AAC3C,EAAA,OACE,CAAC,CAAC,CAAA,IACF,OAAO,CAAA,KAAM,QAAA,IACb,OAAQ,CAAA,CAAyB,IAAA,KAAS,UAAA,IAC1C,OAAQ,CAAA,CAAuB,EAAA,KAAO,UAAA;AAE1C;;;ACxIO,SAAS,mBAAmB,IAAA,EAA6C;AAC9E,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,eAAA;AACH,MAAA,OAAO,eAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT;AACE,MAAA,OAAO,UAAA;AAAA;AAEb;AAEO,SAAS,gBAAgB,IAAA,EAA6C;AAC3E,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,YAAA;AAAA,IACL,KAAK,eAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,gBAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT;AACE,MAAA,OAAO,UAAA;AAAA;AAEb;AAMO,SAAS,gBAAgB,IAAA,EAA6C;AAC3E,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AAAA,IACL,KAAK,YAAA;AAAA,IACL,KAAK,eAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,YAAA;AAAA,IACL,KAAK,YAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,UAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT;AACE,MAAA,OAAO,UAAA;AAAA;AAEb;;;ACjDO,SAAS,iBAAiB,KAAA,EAAsC;AACrE,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,YAAA,EAAe,EAAE,WAAA,IAA2C;AAAA,MAC1D,IAAA,EAAM,QAAA;AAAA,MACN,YAAY;AAAC;AACf,GACF,CAAE,CAAA;AACJ;ACLA,SAAS,iBAAiB,GAAA,EAAwC;AAChE,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,IAAI,CAAA,KAAM,UAAa,OAAO,CAAA,CAAE,OAAO,SAAA,IAAa,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,EAAU;AAChF,IAAA,MAAM,IAAI,MAAM,sFAAiF,CAAA;AAAA,EACnG;AAIA,EAAA,IAAI,EAAE,MAAA,IAAU,CAAA,CAAA,IAAM,CAAA,CAAE,SAAS,MAAA,EAAW;AAE1C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,CAAe,CAAC,CAAA;AACrC,IAAA,IAAI,KAAA,KAAU,MAAA,CAAO,SAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAChD,MAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AAAA,IACX;AAAA,EACF;AACF;AAEA,eAAe,SAAS,GAAA,EAAiC;AACvD,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAWO,IAAe,cAAf,MAA+C;AAAA,EAIpD,WAAA,CACqB,MAAA,EACA,OAAA,EACH,SAAA,GAA0B,KAAA,EAC1C;AAHmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACH,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAEhB,IAAA,IAAI,CAAC,QAAQ,MAAM,IAAI,MAAM,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,iBAAA,CAAmB,CAAA;AAAA,EAC1E;AAAA,EALqB,MAAA;AAAA,EACA,OAAA;AAAA,EACH,SAAA;AAAA,EAKlB,MAAM,QAAA,CAAS,GAAA,EAAc,IAAA,EAAkD;AAC7E,IAAA,MAAM,EAAE,eAAA,EAAAA,gBAAAA,EAAgB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA;AAClC,IAAA,OAAOA,gBAAAA,CAAgB,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EAC/C;AAAA,EAEA,OAAO,MAAA,CAAO,GAAA,EAAc,IAAA,EAA2D;AACrF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA;AAC7B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAE/B,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,QACpC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AACD,MAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,MAAA,OAAA,GAAU,GAAA;AAAA,IACZ,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAM,GAAA;AAC/B,MAAA,MAAM,IAAIC,aAAAA,CAAc,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI;AAAA,QAC1F,KAAA,EAAO,GAAA;AAAA,QACP,IAAA,EAAM,EAAE,OAAA,EAAS,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA;AAAE,OACnE,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,QAAQ,EAAA,EAAI;AACf,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,OAAO,CAAA;AACnC,MAAA,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,IAAA,EAAM,IAAI,KAAK,CAAA;AAAA,EACjD;AAAA;AAAA,EAQU,aAAa,IAAA,EAAuC;AAC5D,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,kBAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA,EAYU,cAAA,CAAe,QAAgB,IAAA,EAA6B;AACpE,IAAA,OAAO,sBAAA,CAAuB,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,EACrD;AACF;;;AN/FA,IAAM,YAAA,GAAe,2BAAA;AACrB,IAAM,eAAA,GAAkB,YAAA;AAExB,SAAS,gBAAgB,OAAA,EAA0B;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,SAAS,WAAA,EAAY;AACnD,IAAA,OAAO,IAAA,KAAS,mBAAA,IAAuB,IAAA,CAAK,QAAA,CAAS,gBAAgB,CAAA;AAAA,EACvE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,IAAM,iBAAA,GAAN,cAAgC,WAAA,CAAY;AAAA,EAC/B,EAAA,GAAK,WAAA;AAAA,EACL,YAAA,GAA6B,sBAAsB,WAAW,CAAA;AAAA,EAE/D,IAAA;AAAA,EAEjB,YAAY,IAAA,EAAgC;AAC1C,IAAA,KAAA,CAAM,KAAK,MAAA,EAAQ,IAAA,CAAK,OAAA,IAAW,YAAA,EAAc,KAAK,SAAS,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEmB,SAAS,IAAA,EAAuB;AACjD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC5C,IAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAC3C,IAAA,IAAI,UAAU,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,GAAG,IAAI,CAAA,SAAA,CAAA;AACxC,IAAA,OAAO,GAAG,IAAI,CAAA,YAAA,CAAA;AAAA,EAChB;AAAA,EAEmB,aAAa,GAAA,EAAsC;AACpE,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,KAAA,CAAM,YAAA,CAAa,GAAG,CAAA;AAAA,MACzB,mBAAA,EAAqB,IAAA,CAAK,IAAA,CAAK,UAAA,IAAc;AAAA,KAC/C;AACA,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA,EAAG;AACjC,MAAA,OAAA,CAAQ,WAAW,IAAI,IAAA,CAAK,MAAA;AAAA,IAC9B,CAAA,MAAO;AAML,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,KAAK,IAAA,CAAK,IAAA,IAAQ,KAAK,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAC/C,MAAA,OAAA,CAAQ,gBAAgB,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IACrD;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEmB,UAAU,GAAA,EAAuC;AAClE,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,YAAY,GAAA,CAAI,SAAA;AAAA,MAChB,QAAA,EAAU,IAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,CAAC,CAAA;AAAA,MAC1D,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,IAAI,GAAA,CAAI,UAAU,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,GAAI,GAAA,CAAI,MAAA;AAC9D,IAAA,IAAI,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,GAAI,gBAAA,CAAiB,GAAA,CAAI,KAAK,CAAA;AACjF,IAAA,IAAI,IAAI,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,aAAa,IAAI,GAAA,CAAI,WAAA;AAC7D,IAAA,IAAI,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,IAAI,GAAA,CAAI,IAAA;AAChD,IAAA,IAAI,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,gBAAgB,IAAI,GAAA,CAAI,aAAA;AACpD,IAAA,IAAI,GAAA,CAAI,UAAA,EAAY,IAAA,CAAK,aAAa,IAAI,GAAA,CAAI,UAAA;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEmB,WAAA,CACjB,MACA,aAAA,EAC4B;AAC5B,IAAA,OAAO,oBAAA,CAAqB,MAAM,aAAa,CAAA;AAAA,EACjD;AAAA,EAEmB,cAAA,CAAe,QAAgB,IAAA,EAA6B;AAC7E,IAAA,OAAO,sBAAA,CAAuB,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,EACrD;AAAA,EAEQ,iBAAiB,CAAA,EAAqC;AAC5D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,SAAS,CAAA,CAAE,IAAA;AAAA,MACvC,SAAS,OAAO,CAAA,CAAE,YAAY,QAAA,GAAW,CAAA,CAAE,UAAU,CAAA,CAAE;AAAA,KACzD;AAAA,EACF;AACF;AAeA,gBAAgB,oBAAA,CACd,MACA,aAAA,EAC4B;AAE5B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAGjB;AACF,EAAA,IAAI,KAAA,GAAQ,aAAA;AACZ,EAAA,IAAI,KAAA,GAAe,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AACzC,EAAA,IAAI,UAAA,GAAyB,UAAA;AAC7B,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,WAAA,MAAiB,GAAA,IAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACtC,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,SAAS,QAAA,EAAU;AACxC,IAAA,MAAM,MAAA,GAASC,SAAAA,CAAmC,GAAA,CAAI,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,OAAO,KAAA,EAAO;AACjC,IAAA,MAAM,KAAK,MAAA,CAAO,KAAA;AAClB,IAAA,MAAM,OAAO,MAAA,CAAO,EAAA,CAAG,MAAM,CAAA,IAAK,IAAI,KAAK,CAAA;AAE3C,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,eAAA,EAAiB;AACpB,QAAA,MAAM,OAAA,GAAU,GAAG,SAAS,CAAA;AAU5B,QAAA,IAAI,OAAA,EAAS,KAAA,EAAO,KAAA,GAAQ,OAAA,CAAQ,KAAA;AACpC,QAAA,KAAA,GAAQ;AAAA,UACN,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,YAAA,IAAgB,CAAA;AAAA,UACvC,MAAA,EAAQ,CAAA;AAAA,UACR,SAAA,EAAW,SAAS,KAAA,EAAO,uBAAA;AAAA,UAC3B,UAAA,EAAY,SAAS,KAAA,EAAO;AAAA,SAC9B;AACA,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAM;AAAA,QACvC;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,qBAAA,EAAuB;AAC1B,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAA,CAAG,OAAO,KAAK,CAAC,CAAA;AACrC,QAAA,MAAM,EAAA,GAAK,GAAG,eAAe,CAAA;AAC7B,QAAA,IAAI,EAAA,EAAI,SAAS,UAAA,EAAY;AAC3B,UAAA,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,EAAE,IAAA,EAAM,UAAA,EAAY,EAAA,EAAI,EAAA,CAAG,EAAA,EAAI,IAAA,EAAM,EAAA,CAAG,IAAA,EAAM,OAAA,EAAS,IAAI,CAAA;AAC7E,UAAA,IAAI,EAAA,CAAG,EAAA,IAAM,EAAA,CAAG,IAAA,EAAM;AACpB,YAAA,MAAM,EAAE,MAAM,gBAAA,EAAkB,EAAA,EAAI,GAAG,EAAA,EAAI,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,UAC3D;AAAA,QACF,CAAA,MAAA,IAAW,EAAA,EAAI,IAAA,KAAS,MAAA,EAAQ;AAC9B,UAAA,MAAA,CAAO,IAAI,KAAA,EAAO,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,QACjD,WAAW,EAAA,EAAI,IAAA,KAAS,UAAA,IAAc,EAAA,EAAI,SAAS,mBAAA,EAAqB;AAOtE,UAAA,MAAA,CAAO,IAAI,KAAA,EAAO,EAAE,MAAM,UAAA,EAAY,OAAA,EAAS,IAAI,CAAA;AACnD,UAAA,MAAM,EAAE,MAAM,gBAAA,EAAiB;AAAA,QACjC,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,IAAI,KAAA,EAAO,EAAE,MAAM,SAAA,EAAW,OAAA,EAAS,IAAI,CAAA;AAAA,QACpD;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,qBAAA,EAAuB;AAC1B,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAA,CAAG,OAAO,KAAK,CAAC,CAAA;AACrC,QAAA,MAAM,KAAA,GAAQ,GAAG,OAAO,CAAA;AAUxB,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAC9B,QAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO;AACtB,QAAA,IAAI,MAAM,IAAA,KAAS,YAAA,IAAgB,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AACjE,UAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,QAC/C,WAAW,KAAA,CAAM,IAAA,KAAS,sBAAsB,OAAO,KAAA,CAAM,iBAAiB,QAAA,EAAU;AACtF,UAAA,IAAI,MAAM,EAAA,EAAI;AACZ,YAAA,KAAA,CAAM,WAAW,KAAA,CAAM,YAAA;AACvB,YAAA,MAAM,EAAE,MAAM,sBAAA,EAAwB,EAAA,EAAI,MAAM,EAAA,EAAI,OAAA,EAAS,MAAM,YAAA,EAAa;AAAA,UAClF;AAAA,QACF,WAAW,KAAA,CAAM,IAAA,KAAS,oBAAoB,OAAO,KAAA,CAAM,aAAa,QAAA,EAAU;AAChF,UAAA,MAAM,EAAE,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAM,MAAM,QAAA,EAAS;AAAA,QACvD,WAAW,KAAA,CAAM,IAAA,KAAS,qBAAqB,OAAO,KAAA,CAAM,cAAc,QAAA,EAAU;AAClF,UAAA,MAAM,EAAE,IAAA,EAAM,oBAAA,EAAsB,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,QACjE;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,oBAAA,EAAsB;AACzB,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAA,CAAG,OAAO,KAAK,CAAC,CAAA;AACrC,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAC9B,QAAA,IAAI,KAAA,EAAO,IAAA,KAAS,UAAA,IAAc,KAAA,CAAM,EAAA,EAAI;AAC1C,UAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,OAAO,CAAA;AAC1C,UAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,EAAA,EAAI,KAAA,CAAM,IAAI,KAAA,EAAM;AAAA,QACrD,CAAA,MAAA,IAAW,KAAA,EAAO,IAAA,KAAS,UAAA,EAAY;AACrC,UAAA,MAAM,EAAE,MAAM,eAAA,EAAgB;AAAA,QAChC;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,eAAA,EAAiB;AACpB,QAAA,MAAM,KAAA,GAAQ,GAAG,OAAO,CAAA;AACxB,QAAA,MAAM,CAAA,GAAI,GAAG,OAAO,CAAA;AACpB,QAAA,IAAI,KAAA,EAAO,gBAAgB,MAAA,EAAW;AACpC,UAAA,UAAA,GAAa,kBAAA,CAAmB,MAAM,WAAW,CAAA;AAAA,QACnD;AACA,QAAA,IAAI,CAAA,EAAG,kBAAkB,MAAA,EAAW,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,aAAA,EAAc;AAChF,QAAA;AAAA,MACF;AAAA,MACA,KAAK,cAAA;AACH,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,UAAA,EAAY,KAAA,EAAM;AAChD,QAAA;AAAA,MACF,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,GAAA,GAAM,GAAG,OAAO,CAAA;AACtB,QAAA,MAAM,IAAID,aAAAA,CAAc,GAAA,EAAK,WAAW,wBAAA,EAA0B,CAAA,EAAG,OAAO,WAAA,EAAa;AAAA,UACvF,MAAM,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,OAAA,EAAS,KAAK,OAAA;AAAQ,SAChD,CAAA;AAAA,MACH;AAAA;AACF,EACF;AACA,EAAA,IAAI,OAAA,IAAW,CAAC,OAAA,EAAS;AACvB,IAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,UAAA,EAAY,KAAA,EAAM;AAAA,EAClD;AACF;AO5NA,IAAME,aAAAA,GAAe,kDAAA;AA2Bd,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA,EAC5B,EAAA;AAAA,EACA,YAAA;AAAA,EAED,IAAA;AAAA,EAEjB,YAAY,IAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,KAAK,MAAA,EAAQ,IAAA,CAAK,OAAA,IAAWA,aAAAA,EAAc,KAAK,SAAS,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,IAAM,QAAA;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,sBAAsB,QAAA,EAAU;AAAA,MAClD,GAAG,IAAA,CAAK;AAAA,KACT,CAAA;AAAA,EACH;AAAA,EAEmB,SAAS,GAAA,EAAsB;AAChD,IAAA,OAAO,GAAG,IAAA,CAAK,OAAO,WAAW,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAC,CAAA,8BAAA,CAAA;AAAA,EAChE;AAAA,EAEmB,aAAa,GAAA,EAAsC;AACpE,IAAA,OAAO;AAAA,MACL,GAAG,KAAA,CAAM,YAAA,CAAa,GAAG,CAAA;AAAA,MACzB,kBAAkB,IAAA,CAAK;AAAA,KACzB;AAAA,EACF;AAAA,EAEmB,UAAU,GAAA,EAAuC;AAClE,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,QAAA,EAAU,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAAA,MACvC,gBAAA,EAAkB,IAAA,CAAK,cAAA,CAAe,GAAG;AAAA,KAC3C;AACA,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,mBAAmB,CAAA,GAAI;AAAA,QAC1B,KAAA,EAAO,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK,CAAE;AAAA,OACjD;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,OAAO,IAAI,CAAC,EAAE,sBAAsB,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEmB,WAAA,CACjB,MACA,aAAA,EAC4B;AAC5B,IAAA,OAAO,iBAAA,CAAkB,MAAM,aAAa,CAAA;AAAA,EAC9C;AAAA,EAEmB,cAAA,CAAe,QAAgB,IAAA,EAA6B;AAC7E,IAAA,OAAO,sBAAA,CAAuB,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,EACrD;AAAA,EAEQ,eAAe,GAAA,EAAuC;AAC5D,IAAA,MAAM,GAAA,GAA+B,EAAE,eAAA,EAAiB,GAAA,CAAI,SAAA,EAAU;AACtE,IAAA,IAAI,IAAI,WAAA,KAAgB,MAAA,EAAW,GAAA,CAAI,aAAa,IAAI,GAAA,CAAI,WAAA;AAC5D,IAAA,IAAI,IAAI,IAAA,KAAS,MAAA,EAAW,GAAA,CAAI,MAAM,IAAI,GAAA,CAAI,IAAA;AAC9C,IAAA,IAAI,GAAA,CAAI,aAAA,EAAe,GAAA,CAAI,eAAe,IAAI,GAAA,CAAI,aAAA;AAClD,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEA,SAAS,cAAc,KAAA,EAA+C;AACpE,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,UAAA,EAAY,uBAAA,CAAwB,CAAA,CAAE,WAAkD,CAAA,IAAK;AAAA,MAC3F,IAAA,EAAM,QAAA;AAAA,MACN,YAAY;AAAC;AACf,GACF,CAAE,CAAA;AACJ;AAkBA,IAAM,mBAAA,uBAA0B,GAAA,CAAI;AAAA,EAClC,MAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,wBAAwB,IAAA,EAAoD;AACnF,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,MAAA;AAChD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAGvB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,MAAA;AACrC,EAAA,MAAM,GAAA,GAAM,IAAA;AACZ,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,IAAA,IAAI,CAAC,mBAAA,CAAoB,GAAA,CAAI,CAAC,CAAA,EAAG;AACjC,IAAA,IAAI,CAAA,KAAM,YAAA,IAAgB,CAAA,IAAK,OAAO,MAAM,QAAA,EAAU;AACpD,MAAA,MAAM,QAAiC,EAAC;AACxC,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,CAA4B,CAAA,EAAG;AAC3E,QAAA,MAAM,OAAA,GAAU,wBAAwB,OAAO,CAAA;AAC/C,QAAA,IAAI,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,GAAI,OAAA;AAAA,MAC9B;AACA,MAAA,GAAA,CAAI,YAAY,CAAA,GAAI,KAAA;AAAA,IACtB,CAAA,MAAA,IAAW,MAAM,OAAA,EAAS;AACxB,MAAA,MAAM,OAAA,GAAU,wBAAwB,CAAC,CAAA;AACzC,MAAA,IAAI,OAAA,EAAS,GAAA,CAAI,OAAO,CAAA,GAAI,OAAA;AAAA,IAC9B,WAAW,CAAA,KAAM,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC5C,MAAA,MAAM,OAAA,GAAU,CAAA,CACb,GAAA,CAAI,CAAC,CAAA,KAAM,uBAAA,CAAwB,CAAC,CAAC,CAAA,CACrC,MAAA,CAAO,CAAC,CAAA,KAAoC,MAAM,MAAS,CAAA;AAC9D,MAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA,GAAI,OAAA;AAAA,IACzC,WAAW,CAAA,KAAM,UAAA,IAAc,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC/C,MAAA,GAAA,CAAI,UAAU,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,OAAO,MAAM,QAAQ,CAAA;AAAA,IACzD,WAAW,CAAA,KAAM,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC3C,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,CAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,iBAAiB,QAAA,EAAsC;AAC9D,EAAA,MAAM,MAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACzB,IAAA,MAAM,MAAA,GACJ,OAAO,CAAA,CAAE,OAAA,KAAY,WAAW,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,CAAA,CAAE,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA;AACnF,IAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAC1B,MAAA,MAAM,QAAsB,EAAC;AAC7B,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,aAAA,IACnD,CAAA,CAAE,SAAS,UAAA,EAAY;AAC9B,UAAA,MAAM,IAAA,GAAmB;AAAA,YACvB,cAAc,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,EAAM,EAAE,KAAA;AAAM,WAC9C;AAIA,UAAA,MAAM,GAAA,GAAM,CAAA,CAAE,YAAA,GAAe,yBAAyB,CAAA;AACtD,UAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7C,YAAA,IAAA,CAAK,gBAAA,GAAmB,GAAA;AAAA,UAC1B;AACA,UAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,QACjB;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,CAAA;AACvD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,YAA0B,EAAC;AACjC,IAAA,MAAM,gBAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,WAAA,IACvD,CAAA,CAAE,SAAS,aAAA,EAAe;AACjC,QAAA,MAAM,YAAA,GAAe,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CAAA;AAIzF,QAAA,MAAM,MAAA,GAAS,EAAE,WAAA,IAAe,SAAA;AAChC,QAAA,aAAA,CAAc,IAAA,CAAK;AAAA,UACjB,gBAAA,EAAkB;AAAA,YAChB,IAAA,EAAM,MAAA;AAAA,YACN,QAAA,EAAU,EAAE,OAAA,EAAS,YAAA;AAAa;AACpC,SACD,CAAA;AAAA,MACH,WAAW,CAAA,CAAE,IAAA,KAAS,WAAW,CAAA,CAAE,MAAA,CAAO,SAAS,QAAA,EAAU;AAC3D,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,UAAA,EAAY;AAAA,YACV,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,UAAA,IAAc,WAAA;AAAA,YACjC,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,IAAA,IAAQ;AAAA;AACzB,SACD,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAA0B,CAAC,GAAG,SAAS,CAAA;AAK7C,IAAA,IAAI,cAAc,MAAA,GAAS,CAAA,EAAG,SAAA,CAAU,IAAA,CAAK,GAAG,aAAa,CAAA;AAC7D,IAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,GAAA;AACT;AAWA,gBAAgB,iBAAA,CACd,MACA,aAAA,EAC4B;AAC5B,EAAA,IAAI,KAAA,GAAQ,aAAA;AACZ,EAAA,IAAI,KAAA,GAAe,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AACzC,EAAA,IAAI,UAAA,GAAyB,UAAA;AAC7B,EAAA,IAAI,OAAA,GAAU,KAAA;AAMd,EAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,EAAA,WAAA,MAAiB,GAAA,IAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACtC,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,SAAS,QAAA,EAAU;AACxC,IAAA,MAAM,MAAA,GAASD,SAAAA,CAQZ,GAAA,CAAI,IAAI,CAAA;AACX,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,OAAO,KAAA,EAAO;AACjC,IAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AAEnB,IAAA,IAAI,GAAA,CAAI,YAAA,EAAc,KAAA,GAAQ,GAAA,CAAI,YAAA;AAClC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAM;AAAA,IACvC;AAEA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,UAAA,GAAa,CAAC,CAAA;AACpC,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,EAAW,OAAA,EAAS,KAAA,IAAS,EAAC,EAAG;AAClD,MAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACzD,QAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAC9C,CAAA,MAAA,IAAW,KAAK,YAAA,EAAc;AAC5B,QAAA,eAAA,GAAkB,IAAA;AAClB,QAAA,MAAM,KAAK,UAAA,EAAW;AACtB,QAAA,MAAM,EAAE,IAAA,EAAM,gBAAA,EAAkB,IAAI,IAAA,EAAM,IAAA,CAAK,aAAa,IAAA,EAAK;AAKjE,QAAA,MAAM,YAAA,GACJ,OAAO,IAAA,CAAK,gBAAA,KAAqB,WAC7B,EAAE,yBAAA,EAA2B,IAAA,CAAK,gBAAA,EAAiB,GACnD,MAAA;AACN,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,eAAA;AAAA,UACN,EAAA;AAAA,UACA,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,IAAA,IAAQ,EAAC;AAAA,UAClC,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB;AAAC,SACzC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,MAAA,UAAA,GAAa,eAAA,CAAgB,UAAU,YAAY,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,IAAI,GAAA,CAAI,aAAA;AACd,IAAA,IAAI,CAAA,EAAG;AAKL,MAAA,MAAM,MAAA,GAAS,EAAE,uBAAA,IAA2B,CAAA;AAC5C,MAAA,MAAM,WAAA,GAAc,CAAA,CAAE,gBAAA,IAAoB,KAAA,CAAM,KAAA,GAAQ,MAAA;AACxD,MAAA,KAAA,GAAQ;AAAA,QACN,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,MAAM,CAAA;AAAA,QACvC,MAAA,EAAQ,CAAA,CAAE,oBAAA,IAAwB,KAAA,CAAM,MAAA;AAAA,QACxC,SAAA,EAAW,UAAU,KAAA,CAAM;AAAA,OAC7B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AAIX,IAAA,MAAM,SAAA,GAAwB,kBAAkB,UAAA,GAAa,UAAA;AAC7D,IAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,UAAA,EAAY,WAAW,KAAA,EAAM;AAAA,EAC7D;AACF;;;ACnXA,eAAA,EAAA;;;ACgBO,SAAS,cAAc,KAAA,EAAmC;AAC/D,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,aAAa,CAAA,CAAE,WAAA;AAAA,MACf,UAAA,EAAa,EAAE,WAAA,IAA2C;AAAA,QACxD,IAAA,EAAM,QAAA;AAAA,QACN,YAAY;AAAC;AACf;AACF,GACF,CAAE,CAAA;AACJ;AAuCO,SAAS,gBAAA,CACd,MAAA,EACA,QAAA,EACA,IAAA,GAAuB,EAAC,EACP;AACjB,EAAA,MAAM,MAAuB,EAAC;AAE9B,EAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AACrD,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,SAAS,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AAC3C,MAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAA4B,CAAA,CAAE,SAAS,aAAa,CAAA;AACvF,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,aAAa,CAAA;AAE5D,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,SAAS,IAAA,CAAK,sBAAA,GACV,eAAe,MAAM,CAAA,GACrB,qBAAqB,MAAM;AAAA,SAChC,CAAA;AAAA,MACH;AACA,MAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,QAAA,MAAM,OAAA,GAAU,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CAAA;AACpF,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,cAAc,CAAA,CAAE,WAAA;AAAA,UAChB;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,WAAA,EAAa;AACnC,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AAC3C,MAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAsB,CAAA,CAAE,SAAS,MAAM,CAAA;AACzE,MAAA,MAAM,WAAW,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAyB,CAAA,CAAE,SAAS,UAAU,CAAA;AAC9E,MAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAA0B,CAAA,CAAE,SAAS,UAAU,CAAA;AACrF,MAAA,MAAM,IAAA,GAAO,WAAW,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAClD,MAAA,MAAM,YAAY,cAAA,CACf,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA,CACrB,MAAA,CAAO,CAAC,MAAM,CAAA,IAAK,CAAA,CAAE,SAAS,CAAC,CAAA,CAC/B,KAAK,EAAE,CAAA;AACV,MAAA,MAAM,SAAA,GAA8B,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACvD,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,WAAW,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,KAAK,CAAA;AAAE,OAC/D,CAAE,CAAA;AAEF,MAAA,MAAM,OAAA,GAAyB,EAAE,IAAA,EAAM,WAAA,EAAY;AACnD,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,UAAA,GAAa,SAAA;AACrB,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,QACpB,CAAA,MAAA,IAAW,IAAA,CAAK,oBAAA,KAAyB,cAAA,EAAgB;AACvD,UAAA,OAAA,CAAQ,OAAA,GAAU,EAAA;AAAA,QACpB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,MACpB;AAKA,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,iBAAA,GAAoB,SAAA;AAAA,MAC9B;AACA,MAAA,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,IAClB;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,iBAAiB,OAAA,EAAkD;AAC1E,EAAA,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,CAAA,GAAI,OAAA;AAC3E;AAEA,SAAS,eAAe,MAAA,EAAgC;AACtD,EAAA,OAAO,MAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,CAAA,CAAE,IAAA;AAChC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS,OAAO,SAAA;AAC/B,IAAA,OAAO,EAAA;AAAA,EACT,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACZ;AAEA,SAAS,qBAAqB,MAAA,EAAkD;AAC9E,EAAA,MAAM,WAAW,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AACtD,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,MAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAsB,EAAE,IAAA,KAAS,MAAM,CAAA,CAC/C,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CACjB,KAAK,EAAE,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,MAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAA4B;AAChC,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK;AAC3D,IAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACtB,MAAA,MAAM,MACJ,CAAA,CAAE,MAAA,CAAO,SAAS,KAAA,GACb,CAAA,CAAE,OAAO,GAAA,IAAO,EAAA,GACjB,CAAA,KAAA,EAAQ,CAAA,CAAE,OAAO,UAAA,IAAc,WAAW,WAAW,CAAA,CAAE,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAC9E,MAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,EAAE,KAAI,EAAE;AAAA,IACjD;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAA0B,MAAM,IAAI,CAAA;AACjD;;;AD/JA,IAAMC,aAAAA,GAAe,2BAAA;AAEd,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA,EAC5B,EAAA;AAAA,EACA,YAAA;AAAA,EAEC,IAAA;AAAA,EAEnB,YAAY,IAAA,EAA6B;AACvC,IAAA,KAAA,CAAM,KAAK,MAAA,EAAQ,IAAA,CAAK,OAAA,IAAWA,aAAAA,EAAc,KAAK,SAAS,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,IAAM,QAAA;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,sBAAsB,QAAA,EAAU;AAAA,MAClD,aAAA,EAAe,CAAC,IAAA,CAAK,MAAA,EAAQ,qBAAA;AAAA,MAC7B,YAAA,EAAc,CAAC,IAAA,CAAK,MAAA,EAAQ,eAAA;AAAA,MAC5B,GAAG,IAAA,CAAK;AAAA,KACT,CAAA;AAAA,EACH;AAAA,EAEmB,SAAS,IAAA,EAAuB;AACjD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC5C,IAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAC9C,IAAA,IAAI,2BAA2B,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,GAAG,IAAI,CAAA,iBAAA,CAAA;AACzD,IAAA,OAAO,GAAG,IAAI,CAAA,oBAAA,CAAA;AAAA,EAChB;AAAA,EAEmB,aAAa,GAAA,EAAsC;AACpE,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,KAAA,CAAM,YAAA,CAAa,GAAG,CAAA;AAAA,MACzB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,KACtC;AACA,IAAA,IAAI,IAAA,CAAK,KAAK,YAAA,EAAc;AAC1B,MAAA,OAAA,CAAQ,qBAAqB,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,YAAA;AAAA,IAC7C;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEmB,UAAU,GAAA,EAAuC;AAClE,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,UAAU,gBAAA,CAAiB,IAAA,CAAK,kBAAkB,GAAG,CAAA,EAAG,IAAI,QAAA,EAAU;AAAA,QACpE,GAAG,KAAK,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,MACD,YAAY,GAAA,CAAI,SAAA;AAAA,MAChB,MAAA,EAAQ,IAAA;AAAA,MACR,cAAA,EAAgB,EAAE,aAAA,EAAe,IAAA;AAAK,KACxC;AACA,IAAA,IAAI,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,OAAO,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AACvC,MAAA,IAAI,IAAI,UAAA,EAAY;AAClB,QAAA,IAAI,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,EAAU;AACtC,UAAA,IAAA,CAAK,aAAa,CAAA,GAAI,GAAA,CAAI,UAAA,KAAe,UAAA,GAAa,aAAa,GAAA,CAAI,UAAA;AAAA,QACzE,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,aAAa,CAAA,GAAI;AAAA,YACpB,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,EAAE,IAAA,EAAM,GAAA,CAAI,WAAW,IAAA;AAAK,WACxC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,IAAI,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,aAAa,IAAI,GAAA,CAAI,WAAA;AAC7D,IAAA,IAAI,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,IAAI,GAAA,CAAI,IAAA;AAChD,IAAA,IAAI,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,MAAM,IAAI,GAAA,CAAI,aAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEmB,WAAA,CACjB,MACA,aAAA,EAC4B;AAC5B,IAAA,OAAO,iBAAA,CAAkB,MAAM,aAAa,CAAA;AAAA,EAC9C;AAAA,EAEmB,cAAA,CAAe,QAAgB,IAAA,EAA6B;AAC7E,IAAA,OAAO,sBAAA,CAAuB,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,EACrD;AAAA,EAEQ,kBAAkB,GAAA,EAAiC;AACzD,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,MAAA;AACxB,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAE3B,MAAA,MAAM,EAAE,aAAA,EAAe,GAAA,EAAK,GAAG,MAAK,GAAI,CAAA;AACxC,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AACF;AAkBA,gBAAgB,iBAAA,CACd,MACA,aAAA,EAC4B;AAC5B,EAAA,IAAI,KAAA,GAAQ,aAAA;AACZ,EAAA,IAAI,KAAA,GAAe,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AACzC,EAAA,IAAI,UAAA,GAAyB,UAAA;AAC7B,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAGtB;AAEF,EAAA,WAAA,MAAiB,GAAA,IAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACtC,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,SAAS,QAAA,EAAU;AACxC,IAAA,MAAM,MAAA,GAASD,SAAAA,CAAmC,GAAA,CAAI,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,OAAO,KAAA,EAAO;AACjC,IAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AAEnB,IAAA,IAAI,OAAO,GAAA,CAAI,OAAO,MAAM,QAAA,EAAU,KAAA,GAAQ,IAAI,OAAO,CAAA;AACzD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAM;AAAA,IACvC;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,SAAS,CAAA;AAe7B,IAAA,MAAM,MAAA,GAAS,UAAU,CAAC,CAAA;AAQ1B,IAAA,MAAM,iBACJ,OAAO,MAAA,EAAQ,KAAA,EAAO,iBAAA,KAAsB,WACxC,MAAA,CAAO,KAAA,CAAM,iBAAA,GACb,OAAO,QAAQ,KAAA,EAAO,SAAA,KAAc,QAAA,GAClC,MAAA,CAAO,MAAM,SAAA,GACb,MAAA;AACR,IAAA,IAAI,cAAA,IAAkB,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC/C,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,YAAA,GAAe,IAAA;AACf,QAAA,MAAM,EAAE,MAAM,gBAAA,EAAiB;AAAA,MACjC;AACA,MAAA,MAAM,EAAE,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAM,cAAA,EAAe;AAAA,IACvD;AAEA,IAAA,IAAI,MAAA,EAAQ,OAAO,OAAA,EAAS;AAC1B,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,GAAe,KAAA;AACf,QAAA,MAAM,EAAE,MAAM,eAAA,EAAgB;AAAA,MAChC;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAA,CAAO,MAAM,OAAA,EAAQ;AAAA,IACzD;AAEA,IAAA,IAAI,MAAA,EAAQ,OAAO,UAAA,EAAY;AAC7B,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,GAAe,KAAA;AACf,QAAA,MAAM,EAAE,MAAM,eAAA,EAAgB;AAAA,MAChC;AACA,MAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,KAAA,CAAM,UAAA,EAAY;AACxC,QAAA,MAAM,GAAA,GAAM,GAAG,KAAA,IAAS,CAAA;AACxB,QAAA,IAAI,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAC/B,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,KAAA,GAAQ;AAAA,YACN,IAAI,EAAA,CAAG,EAAA;AAAA,YACP,IAAA,EAAM,GAAG,QAAA,EAAU,IAAA;AAAA,YACnB,MAAA,EAAQ,EAAA;AAAA,YACR,YAAA,EAAc,KAAA;AAAA,YACd,gBAAA,EAAkB;AAAA,WACpB;AACA,UAAA,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,QAC5B,CAAA,MAAO;AACL,UAAA,IAAI,GAAG,EAAA,IAAM,CAAC,MAAM,EAAA,EAAI,KAAA,CAAM,KAAK,EAAA,CAAG,EAAA;AACtC,UAAA,IAAI,EAAA,CAAG,UAAU,IAAA,IAAQ,CAAC,MAAM,IAAA,EAAM,KAAA,CAAM,IAAA,GAAO,EAAA,CAAG,QAAA,CAAS,IAAA;AAAA,QACjE;AACA,QAAA,IAAI,EAAA,CAAG,UAAU,SAAA,EAAW;AAC1B,UAAA,KAAA,CAAM,MAAA,IAAU,GAAG,QAAA,CAAS,SAAA;AAAA,QAC9B;AACA,QAAA,IAAI,CAAC,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,EAAA,IAAM,MAAM,IAAA,EAAM;AACjD,UAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AAErB,UAAA,MAAM,EAAE,MAAM,gBAAA,EAAkB,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,QACjE;AACA,QAAA,IAAI,KAAA,CAAM,gBAAgB,KAAA,CAAM,EAAA,IAAM,MAAM,gBAAA,GAAmB,KAAA,CAAM,OAAO,MAAA,EAAQ;AAClF,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,MAAM,gBAAgB,CAAA;AACzD,UAAA,KAAA,CAAM,gBAAA,GAAmB,MAAM,MAAA,CAAO,MAAA;AACtC,UAAA,MAAM;AAAA,YACJ,IAAA,EAAM,sBAAA;AAAA,YACN,IAAI,KAAA,CAAM,EAAA;AAAA,YACV;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,UAAA,GAAa,eAAA,CAAgB,OAAO,aAAa,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,CAAA,GAAI,IAAI,OAAO,CAAA;AAUrB,IAAA,IAAI,CAAA,EAAG;AAKL,MAAA,MAAM,sBAAA,GACJ,CAAA,CAAE,uBAAA,KAA4B,MAAA,IAAa,EAAE,wBAAA,KAA6B,MAAA;AAC5E,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,qBAAA,EAAuB,aAAA,IAAiB,EAAE,uBAAA,IAA2B,CAAA;AACtF,MAAA,MAAM,WAAA,GACJ,CAAA,CAAE,aAAA,IAAiB,CAAA,CAAE,YAAA,KACpB,sBAAA,GAAA,CACI,CAAA,CAAE,uBAAA,IAA2B,CAAA,KAAM,CAAA,CAAE,wBAAA,IAA4B,CAAA,CAAA,GAClE,MAAM,KAAA,GAAQ,MAAA,CAAA;AACpB,MAAA,KAAA,GAAQ;AAAA,QACN,OAAO,CAAA,CAAE,wBAAA,IAA4B,KAAK,GAAA,CAAI,CAAA,EAAG,cAAc,MAAM,CAAA;AAAA,QACrE,MAAA,EAAQ,CAAA,CAAE,iBAAA,IAAqB,KAAA,CAAM,MAAA;AAAA,QACrC,SAAA,EAAW,UAAU,KAAA,CAAM;AAAA,OAC7B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,EAAE,MAAM,eAAA,EAAgB;AAAA,EAChC;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,WAAA,CAAY,MAAA,EAAO,EAAG;AAExC,IAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AAMjB,IAAA,IAAI,CAAC,KAAA,CAAM,EAAA,QAAU,EAAA,GAAK,CAAA,KAAA,EAAQE,YAAY,CAAA,CAAA;AAC9C,IAAA,IAAI,CAAC,MAAM,YAAA,EAAc;AACvB,MAAA,MAAM,EAAE,MAAM,gBAAA,EAAkB,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,IACjE;AACA,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AACzC,IAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,EAAA,EAAI,KAAA,CAAM,IAAI,KAAA,EAAM;AAAA,EACrD;AACA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,UAAA,EAAY,KAAA,EAAM;AAAA,EAClD;AACF;;;AE1QO,IAAM,wBAAA,GAAN,cAAuC,cAAA,CAAe;AAAA,EAC1C,YAAA;AAAA,EACA,WAAA;AAAA,EAEjB,YAAY,IAAA,EAA+B;AACzC,IAAA,KAAA,CAAM;AAAA,MACJ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,YAAA,EAAc,sBAAsB,mBAAA,EAAqB;AAAA,QACvD,aAAA,EAAe,CAAC,IAAA,CAAK,MAAA,EAAQ,qBAAA;AAAA,QAC7B,YAAA,EAAc,CAAC,IAAA,CAAK,MAAA,EAAQ,eAAA;AAAA,QAC5B,GAAG,IAAA,CAAK;AAAA,OACT,CAAA;AAAA,MACD,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,OAAA;AACzB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AAAA,EAC1B;AAAA,EAEmB,SAAS,GAAA,EAAsB;AAChD,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,KAAA,CAAM,SAAS,GAAG,CAAA;AAAA,EAC3B;AAAA,EAEmB,aAAa,GAAA,EAAsC;AACpE,IAAA,OAAO;AAAA,MACL,GAAG,KAAA,CAAM,YAAA,CAAa,GAAG,CAAA;AAAA,MACzB,GAAG,IAAA,CAAK;AAAA,KACV;AAAA,EACF;AACF;;;ACGO,IAAM,kBAAA,GAAN,cAA8D,WAAA,CAAY;AAAA,EAC7D,EAAA;AAAA,EACA,YAAA;AAAA,EACD,GAAA;AAAA,EAEjB,WAAA,CACE,KACA,IAAA,EACA;AACA,IAAA,KAAA,CAAM,KAAK,MAAA,EAAQ,IAAA,CAAK,WAAW,GAAA,CAAI,cAAA,EAAgB,KAAK,SAAS,CAAA;AACrE,IAAA,IAAA,CAAK,KAAK,GAAA,CAAI,EAAA;AACd,IAAA,IAAA,CAAK,eAAe,GAAA,CAAI,YAAA;AACxB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA,EAEmB,SAAS,GAAA,EAAsB;AAChD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,EAC5C;AAAA,EAEmB,aAAa,GAAA,EAAsC;AACpE,IAAA,OAAO;AAAA,MACL,GAAG,KAAA,CAAM,YAAA,CAAa,GAAG,CAAA;AAAA,MACzB,GAAG,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,QAAQ,GAAG;AAAA,KAC3C;AAAA,EACF;AAAA,EAEmB,UAAU,GAAA,EAAuC;AAClE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA;AAAA,EAC/B;AAAA,EAEmB,WAAA,CACjB,MACA,aAAA,EAC4B;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,aAAa,CAAA;AAAA,EAC3C;AAAA,EAEmB,cAAA,CAAe,QAAgB,IAAA,EAA6B;AAC7E,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,cAAA,GACZ,IAAA,CAAK,GAAA,CAAI,cAAA,CAAe,MAAA,EAAQ,IAAI,CAAA,GACpC,sBAAA,CAAuB,IAAA,CAAK,EAAA,EAAI,QAAQ,IAAI,CAAA;AAAA,EAClD;AAAA,EAEA,OAAe,SAAA,CACb,IAAA,EACA,aAAA,EAC4B;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,iBAAA,CAAkB,aAAa,CAAA;AACtD,IAAA,WAAA,MAAiB,GAAA,IAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACtC,MAAA,KAAA,MAAW,MAAM,IAAA,CAAK,GAAA,CAAI,gBAAA,CAAiB,GAAA,EAAK,KAAK,CAAA,EAAG;AACtD,QAAA,MAAM,EAAA;AAAA,MACR;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,IAAI,cAAA,EAAgB;AAC3B,MAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,GAAA,CAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AAC/C,QAAA,MAAM,EAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAaO,SAAS,iBACd,GAAA,EACqB;AACrB,EAAA,OAAO,GAAA;AACT;AAkBO,SAAS,uBAAA,CACd,GAAA,EACA,IAAA,GAA2B,EAAC,EACX;AACjB,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,EAAA;AAAA,IACV,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,MAAA,EAAQ,CAAC,MAAA,KAA8B;AACrC,MAAA,MAAM,CAAA,GAAI,MAAA;AACV,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,CAAA,CAAE,MAAA;AAChC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,GAAA,CAAI,EAAE,CAAA,qBAAA,CAAuB,CAAA;AAAA,MAC5D;AACA,MAAA,OAAO,IAAI,mBAAmB,GAAA,EAAK;AAAA,QACjC,MAAA;AAAA,QACA,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,CAAA,CAAE;AAAA,OAC5B,CAAA;AAAA,IACH;AAAA,GACF;AACF;;;AC1KA,eAAA,EAAA;AAeO,IAAM,oBAAoB,gBAAA,CAAqC;AAAA,EACpE,EAAA,EAAI,SAAA;AAAA,EACJ,MAAA,EAAQ,mBAAA;AAAA,EACR,YAAA,EAAc,sBAAsB,mBAAA,EAAqB;AAAA,IACvD,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACb,CAAA;AAAA,EACD,cAAA,EAAgB,2BAAA;AAAA,EAChB,QAAA,EAAU,CAAC,IAAA,KAAS,CAAA,EAAG,KAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,iBAAA,CAAA;AAAA,EAC/C,cAAc,CAAC,MAAA,MAAY,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAG,CAAA;AAAA,EAC/D,SAAA,EAAW,CAAC,GAAA,KAAiB;AAC3B,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,QAAA,EAAU,iBAAiB,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA;AAAA,MAC1E,YAAY,GAAA,CAAI,SAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,IAAI,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,OAAO,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AACvC,MAAA,IAAI,IAAI,UAAA,EAAY;AAClB,QAAA,IAAI,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,EAAU;AACtC,UAAA,IAAA,CAAK,aAAa,CAAA,GAAI,GAAA,CAAI,UAAA,KAAe,UAAA,GAAa,aAAa,GAAA,CAAI,UAAA;AAAA,QACzE,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,aAAa,CAAA,GAAI;AAAA,YACpB,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,EAAE,IAAA,EAAM,GAAA,CAAI,WAAW,IAAA;AAAK,WACxC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,IAAI,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,aAAa,IAAI,GAAA,CAAI,WAAA;AAC7D,IAAA,IAAI,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,IAAI,GAAA,CAAI,IAAA;AAChD,IAAA,IAAI,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,MAAM,IAAI,GAAA,CAAI,aAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA,iBAAA,EAAmB,CAAC,aAAA,MAAmB;AAAA,IACrC,KAAA,EAAO,aAAA;AAAA,IACP,OAAA,EAAS,KAAA;AAAA,IACT,SAAA,sBAAe,GAAA;AAAI,GACrB,CAAA;AAAA,EACA,gBAAA,EAAkB,CAAC,GAAA,EAAK,KAAA,KAAyB;AAC/C,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,IAAI,IAAA,KAAS,QAAA,SAAiB,EAAC;AAChD,IAAA,MAAM,MAAA,GAASF,SAAAA,CAcZ,GAAA,CAAI,IAAI,CAAA;AACX,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,MAAA,CAAO,KAAA,SAAc,EAAC;AACzC,IAAA,MAAM,KAAK,MAAA,CAAO,KAAA;AAClB,IAAA,MAAM,MAAqB,EAAC;AAC5B,IAAA,IAAI,EAAA,CAAG,KAAA,EAAO,KAAA,CAAM,KAAA,GAAQ,EAAA,CAAG,KAAA;AAC/B,IAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,iBAAiB,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AAAA,IACxD;AACA,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,OAAA,GAAU,CAAC,CAAA;AAC7B,IAAA,IAAI,MAAA,EAAQ,OAAO,OAAA,EAAS;AAC1B,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AAAA,IAC7D;AACA,IAAA,KAAA,MAAW,EAAA,IAAM,MAAA,EAAQ,KAAA,EAAO,UAAA,IAAc,EAAC,EAAG;AAChD,MAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,GAAG,KAAK,CAAA;AACxC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,KAAA,GAAQ;AAAA,UACN,IAAI,EAAA,CAAG,EAAA;AAAA,UACP,IAAA,EAAM,GAAG,QAAA,EAAU,IAAA;AAAA,UACnB,OAAA,EAAS,EAAA;AAAA,UACT,YAAA,EAAc,KAAA;AAAA,UACd,gBAAA,EAAkB;AAAA,SACpB;AACA,QAAA,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,KAAK,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,IAAI,GAAG,EAAA,IAAM,CAAC,MAAM,EAAA,EAAI,KAAA,CAAM,KAAK,EAAA,CAAG,EAAA;AACtC,QAAA,IAAI,EAAA,CAAG,UAAU,IAAA,IAAQ,CAAC,MAAM,IAAA,EAAM,KAAA,CAAM,IAAA,GAAO,EAAA,CAAG,QAAA,CAAS,IAAA;AAAA,MACjE;AACA,MAAA,MAAM,GAAA,GAAM,GAAG,QAAA,EAAU,SAAA;AACzB,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,KAAA,CAAM,OAAA,IAAW,GAAA;AAAA,MACnB;AACA,MAAA,IAAI,CAAC,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,EAAA,IAAM,MAAM,IAAA,EAAM;AACjD,QAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AACrB,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,MACrE;AACA,MAAA,IAAI,KAAA,CAAM,gBAAgB,KAAA,CAAM,EAAA,IAAM,MAAM,gBAAA,GAAmB,KAAA,CAAM,QAAQ,MAAA,EAAQ;AACnF,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,gBAAgB,CAAA;AAC1D,QAAA,KAAA,CAAM,gBAAA,GAAmB,MAAM,OAAA,CAAQ,MAAA;AACvC,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAI,KAAA,CAAM,EAAA,EAAI,SAAS,CAAA;AAAA,MAClE;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,aAAA,EAAe;AAEzB,MAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,SAAA,CAAU,MAAA,EAAO,EAAG;AAC5C,QAAA,IAAI,KAAA,CAAM,EAAA,IAAM,KAAA,CAAM,IAAA,EAAM;AAC1B,UAAA,IAAI,CAAC,MAAM,YAAA,EAAc;AACvB,YAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,UACrE;AACA,UAAA,GAAA,CAAI,IAAA,CAAK;AAAA,YACP,IAAA,EAAM,eAAA;AAAA,YACN,IAAI,KAAA,CAAM,EAAA;AAAA,YACV,KAAA,EAAO,cAAA,CAAe,KAAA,CAAM,OAAO;AAAA,WACpC,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,UAAA,EAAY,aAAA,CAAc,MAAA,CAAO,aAAa,CAAA;AAAA,QAC9C,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,EAAA,CAAG,KAAA,EAAO,aAAA,IAAiB,CAAA;AAAA,UAClC,MAAA,EAAQ,EAAA,CAAG,KAAA,EAAO,iBAAA,IAAqB;AAAA;AACzC,OACD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAC;AAED,SAAS,cAAc,MAAA,EAA4B;AACjD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,YAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,QAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT;AACE,MAAA,OAAO,UAAA;AAAA;AAEb;AAEA,SAAS,kBAAkB,MAAA,EAA8C;AACvE,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACvB,IAAA,MAAM,EAAE,aAAA,EAAe,GAAA,EAAK,GAAG,MAAK,GAAI,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;;;AChKA,eAAA,EAAA;AAiBA,IAAMG,gBAAAA,GAAkB,YAAA;AAEjB,IAAM,sBAAsB,gBAAA,CAAuC;AAAA,EACxE,EAAA,EAAI,WAAA;AAAA,EACJ,MAAA,EAAQ,WAAA;AAAA,EACR,YAAA,EAAc,sBAAsB,WAAW,CAAA;AAAA,EAC/C,cAAA,EAAgB,2BAAA;AAAA,EAChB,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACjC,IAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,CAAA;AACxC,IAAA,IAAI,UAAU,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,GAAG,CAAC,CAAA,SAAA,CAAA;AAClC,IAAA,OAAO,GAAG,CAAC,CAAA,YAAA,CAAA;AAAA,EACb,CAAA;AAAA,EACA,YAAA,EAAc,CAAC,MAAA,MAAY;AAAA,IACzB,WAAA,EAAa,MAAA;AAAA,IACb,mBAAA,EAAqBA;AAAA,GACvB,CAAA;AAAA,EACA,SAAA,EAAW,CAAC,GAAA,KAAiB;AAC3B,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,YAAY,GAAA,CAAI,SAAA;AAAA,MAChB,QAAA,EAAU,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAgB;AAAA,QAC1C,IAAA,EAAM,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,SAAS,CAAA,CAAE,IAAA;AAAA,QACvC,SAAS,CAAA,CAAE;AAAA,OACb,CAAE,CAAA;AAAA,MACF,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,IAAI,GAAA,CAAI,UAAU,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,GAAI,GAAA,CAAI,MAAA;AAC9D,IAAA,IAAI,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,GAAI,gBAAA,CAAiB,GAAA,CAAI,KAAK,CAAA;AACjF,IAAA,IAAI,IAAI,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,aAAa,IAAI,GAAA,CAAI,WAAA;AAC7D,IAAA,IAAI,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,IAAI,GAAA,CAAI,IAAA;AAChD,IAAA,IAAI,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,gBAAgB,IAAI,GAAA,CAAI,aAAA;AACpD,IAAA,IAAI,GAAA,CAAI,UAAA,EAAY,IAAA,CAAK,aAAa,IAAI,GAAA,CAAI,UAAA;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA,iBAAA,EAAmB,CAAC,aAAA,MAAmB;AAAA,IACrC,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,IAC7B,UAAA,EAAY,UAAA;AAAA,IACZ,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS,KAAA;AAAA,IACT,MAAA,sBAAY,GAAA;AAAI,GAClB,CAAA;AAAA,EACA,gBAAA,EAAkB,CAAC,GAAA,EAAK,KAAA,KAAyB;AAC/C,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,IAAI,IAAA,KAAS,QAAA,SAAiB,EAAC;AAChD,IAAA,MAAM,MAAA,GAASH,SAAAA,CAAmC,GAAA,CAAI,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,MAAA,CAAO,KAAA,SAAc,EAAC;AACzC,IAAA,MAAM,KAAK,MAAA,CAAO,KAAA;AAClB,IAAA,MAAM,OAAO,MAAA,CAAO,EAAA,CAAG,MAAM,CAAA,IAAK,IAAI,KAAK,CAAA;AAC3C,IAAA,MAAM,MAAqB,EAAC;AAE5B,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,eAAA,EAAiB;AACpB,QAAA,MAAM,OAAA,GAAU,GAAG,SAAS,CAAA;AAU5B,QAAA,IAAI,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAC1C,QAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,UACZ,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,YAAA,IAAgB,CAAA;AAAA,UACvC,MAAA,EAAQ,CAAA;AAAA,UACR,SAAA,EAAW,SAAS,KAAA,EAAO,uBAAA;AAAA,UAC3B,UAAA,EAAY,SAAS,KAAA,EAAO;AAAA,SAC9B;AACA,QAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,UAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,UAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,iBAAiB,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AAAA,QACxD;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,qBAAA,EAAuB;AAC1B,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAA,CAAG,OAAO,KAAK,CAAC,CAAA;AACrC,QAAA,MAAM,EAAA,GAAK,GAAG,eAAe,CAAA;AAC7B,QAAA,IAAI,EAAA,EAAI,SAAS,UAAA,EAAY;AAC3B,UAAA,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,EAAE,MAAM,UAAA,EAAY,EAAA,EAAI,EAAA,CAAG,EAAA,EAAI,IAAA,EAAM,EAAA,CAAG,IAAA,EAAM,OAAA,EAAS,IAAI,CAAA;AACnF,UAAA,IAAI,EAAA,CAAG,EAAA,IAAM,EAAA,CAAG,IAAA,EAAM;AACpB,YAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,EAAA,EAAI,GAAG,EAAA,EAAI,IAAA,EAAM,EAAA,CAAG,IAAA,EAAM,CAAA;AAAA,UAC/D;AAAA,QACF,CAAA,MAAA,IAAW,EAAA,EAAI,IAAA,KAAS,MAAA,EAAQ;AAC9B,UAAA,KAAA,CAAM,MAAA,CAAO,IAAI,KAAA,EAAO,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,QACvD,WAAW,EAAA,EAAI,IAAA,KAAS,UAAA,IAAc,EAAA,EAAI,SAAS,mBAAA,EAAqB;AACtE,UAAA,KAAA,CAAM,MAAA,CAAO,IAAI,KAAA,EAAO,EAAE,MAAM,UAAA,EAAY,OAAA,EAAS,IAAI,CAAA;AACzD,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,CAAA;AAAA,QACrC,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,MAAA,CAAO,IAAI,KAAA,EAAO,EAAE,MAAM,SAAA,EAAW,OAAA,EAAS,IAAI,CAAA;AAAA,QAC1D;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,qBAAA,EAAuB;AAC1B,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAA,CAAG,OAAO,KAAK,CAAC,CAAA;AACrC,QAAA,MAAM,KAAA,GAAQ,GAAG,OAAO,CAAA;AASxB,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACpC,QAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO;AACtB,QAAA,IAAI,MAAM,IAAA,KAAS,YAAA,IAAgB,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AACjE,UAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,cAAc,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAAA,QACnD,WAAW,KAAA,CAAM,IAAA,KAAS,sBAAsB,OAAO,KAAA,CAAM,iBAAiB,QAAA,EAAU;AACtF,UAAA,IAAI,MAAM,EAAA,EAAI;AACZ,YAAA,KAAA,CAAM,WAAW,KAAA,CAAM,YAAA;AACvB,YAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,sBAAA,EAAwB,EAAA,EAAI,MAAM,EAAA,EAAI,OAAA,EAAS,KAAA,CAAM,YAAA,EAAc,CAAA;AAAA,UACtF;AAAA,QACF,WAAW,KAAA,CAAM,IAAA,KAAS,oBAAoB,OAAO,KAAA,CAAM,aAAa,QAAA,EAAU;AAChF,UAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,kBAAkB,IAAA,EAAM,KAAA,CAAM,UAAU,CAAA;AAAA,QAC3D,WAAW,KAAA,CAAM,IAAA,KAAS,qBAAqB,OAAO,KAAA,CAAM,cAAc,QAAA,EAAU;AAClF,UAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,sBAAsB,SAAA,EAAW,KAAA,CAAM,WAAW,CAAA;AAAA,QACrE;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,oBAAA,EAAsB;AACzB,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAA,CAAG,OAAO,KAAK,CAAC,CAAA;AACrC,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACpC,QAAA,IAAI,KAAA,EAAO,IAAA,KAAS,UAAA,IAAc,KAAA,CAAM,EAAA,EAAI;AAC1C,UAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,OAAO,CAAA;AAC1C,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAI,KAAA,CAAM,EAAA,EAAI,OAAO,CAAA;AAAA,QACzD,CAAA,MAAA,IAAW,KAAA,EAAO,IAAA,KAAS,UAAA,EAAY;AACrC,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,CAAA;AAAA,QACpC;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,eAAA,EAAiB;AACpB,QAAA,MAAM,KAAA,GAAQ,GAAG,OAAO,CAAA;AACxB,QAAA,MAAM,CAAA,GAAI,GAAG,OAAO,CAAA;AACpB,QAAA,IAAI,KAAA,EAAO,gBAAgB,MAAA,EAAW;AACpC,UAAA,KAAA,CAAM,UAAA,GAAa,kBAAA,CAAmB,KAAA,CAAM,WAAW,CAAA;AAAA,QACzD;AACA,QAAA,IAAI,CAAA,EAAG,kBAAkB,MAAA,EAAW;AAClC,UAAA,KAAA,CAAM,QAAQ,EAAE,GAAG,MAAM,KAAA,EAAO,MAAA,EAAQ,EAAE,aAAA,EAAc;AAAA,QAC1D;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,cAAA;AACH,QAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,UAAA,EAAY,MAAM,UAAA,EAAY,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA;AACnF,QAAA;AAAA,MACF,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,GAAA,GAAM,GAAG,OAAO,CAAA;AACtB,QAAA,MAAM,IAAID,aAAAA,CAAc,GAAA,EAAK,WAAW,wBAAA,EAA0B,CAAA,EAAG,OAAO,WAAA,EAAa;AAAA,UACvF,MAAM,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,OAAA,EAAS,KAAK,OAAA;AAAQ,SAChD,CAAA;AAAA,MACH;AAAA;AAEF,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAAA,EACA,cAAA,EAAgB,CAAC,KAAA,KAAyB;AAGxC,IAAA,IAAI,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM,OAAA,EAAS;AACnC,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,cAAA,EAAgB,UAAA,EAAY,MAAM,UAAA,EAAY,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA;AAAA,IACpF;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AACF,CAAC;;;ACzLD,eAAA,EAAA;AAoBO,IAAM,mBAAmB,gBAAA,CAAoC;AAAA,EAClE,EAAA,EAAI,QAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,YAAA,EAAc,sBAAsB,QAAQ,CAAA;AAAA,EAC5C,cAAA,EAAgB,2BAAA;AAAA,EAChB,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACjC,IAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,CAAA;AAC3C,IAAA,IAAI,2BAA2B,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,GAAG,CAAC,CAAA,iBAAA,CAAA;AACnD,IAAA,OAAO,GAAG,CAAC,CAAA,oBAAA,CAAA;AAAA,EACb,CAAA;AAAA,EACA,cAAc,CAAC,MAAA,MAAY,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAG,CAAA;AAAA,EAC/D,SAAA,EAAW,CAAC,GAAA,KAAiB;AAC3B,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,QAAA,EAAU,iBAAiBK,kBAAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA;AAAA,MAC1E,YAAY,GAAA,CAAI,SAAA;AAAA,MAChB,MAAA,EAAQ,IAAA;AAAA,MACR,cAAA,EAAgB,EAAE,aAAA,EAAe,IAAA;AAAK,KACxC;AACA,IAAA,IAAI,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,OAAO,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AACvC,MAAA,IAAI,IAAI,UAAA,EAAY;AAClB,QAAA,IAAI,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,EAAU;AACtC,UAAA,IAAA,CAAK,aAAa,CAAA,GAAI,GAAA,CAAI,UAAA,KAAe,UAAA,GAAa,aAAa,GAAA,CAAI,UAAA;AAAA,QACzE,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,aAAa,CAAA,GAAI;AAAA,YACpB,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,EAAE,IAAA,EAAM,GAAA,CAAI,WAAW,IAAA;AAAK,WACxC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,IAAI,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,aAAa,IAAI,GAAA,CAAI,WAAA;AAC7D,IAAA,IAAI,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,IAAI,GAAA,CAAI,IAAA;AAChD,IAAA,IAAI,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,MAAM,IAAI,GAAA,CAAI,aAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA,iBAAA,EAAmB,CAAC,aAAA,MAAmB;AAAA,IACrC,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,IAC7B,UAAA,EAAY,UAAA;AAAA,IACZ,OAAA,EAAS,KAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,YAAA,EAAc,KAAA;AAAA,IACd,WAAA,sBAAiB,GAAA,EAAI;AAAA,IACrB,YAAA,EAAc;AAAA,GAChB,CAAA;AAAA,EACA,gBAAA,EAAkB,CAAC,GAAA,EAAK,KAAA,KAAyB;AAC/C,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,IAAI,IAAA,KAAS,QAAA,SAAiB,EAAC;AAChD,IAAA,MAAM,MAAA,GAASJ,SAAAA,CAAmC,GAAA,CAAI,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,MAAA,CAAO,KAAA,SAAc,EAAC;AACzC,IAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,IAAA,MAAM,MAAqB,EAAC;AAE5B,IAAA,IAAI,OAAO,IAAI,OAAO,CAAA,KAAM,UAAU,KAAA,CAAM,KAAA,GAAQ,IAAI,OAAO,CAAA;AAC/D,IAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,iBAAiB,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,SAAS,CAAA;AAe7B,IAAA,MAAM,MAAA,GAAS,UAAU,CAAC,CAAA;AAM1B,IAAA,MAAM,iBACJ,OAAO,MAAA,EAAQ,KAAA,EAAO,iBAAA,KAAsB,WACxC,MAAA,CAAO,KAAA,CAAM,iBAAA,GACb,OAAO,QAAQ,KAAA,EAAO,SAAA,KAAc,QAAA,GAClC,MAAA,CAAO,MAAM,SAAA,GACb,MAAA;AACR,IAAA,IAAI,cAAA,IAAkB,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC/C,MAAA,IAAI,CAAC,MAAM,YAAA,EAAc;AACvB,QAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AACrB,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,CAAA;AAAA,MACrC;AACA,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAM,gBAAgB,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,MAAA,EAAQ,OAAO,OAAA,EAAS;AAC1B,MAAA,IAAI,MAAM,YAAA,EAAc;AACtB,QAAA,KAAA,CAAM,YAAA,GAAe,KAAA;AACrB,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,CAAA;AAAA,MACpC;AACA,MAAA,IAAI,CAAC,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,QAAA,GAAW,IAAA;AACtC,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,MAAA,EAAQ,OAAO,UAAA,EAAY;AAC7B,MAAA,IAAI,MAAM,YAAA,EAAc;AACtB,QAAA,KAAA,CAAM,YAAA,GAAe,KAAA;AACrB,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,CAAA;AAAA,MACpC;AACA,MAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,KAAA,CAAM,UAAA,EAAY;AACxC,QAAA,MAAM,GAAA,GAAM,GAAG,KAAA,IAAS,CAAA;AACxB,QAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACrC,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,KAAA,GAAQ;AAAA,YACN,IAAI,EAAA,CAAG,EAAA;AAAA,YACP,IAAA,EAAM,GAAG,QAAA,EAAU,IAAA;AAAA,YACnB,MAAA,EAAQ,EAAA;AAAA,YACR,YAAA,EAAc,KAAA;AAAA,YACd,gBAAA,EAAkB;AAAA,WACpB;AACA,UAAA,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,QAClC,CAAA,MAAO;AACL,UAAA,IAAI,GAAG,EAAA,IAAM,CAAC,MAAM,EAAA,EAAI,KAAA,CAAM,KAAK,EAAA,CAAG,EAAA;AACtC,UAAA,IAAI,EAAA,CAAG,UAAU,IAAA,IAAQ,CAAC,MAAM,IAAA,EAAM,KAAA,CAAM,IAAA,GAAO,EAAA,CAAG,QAAA,CAAS,IAAA;AAAA,QACjE;AACA,QAAA,IAAI,EAAA,CAAG,UAAU,SAAA,EAAW;AAC1B,UAAA,KAAA,CAAM,MAAA,IAAU,GAAG,QAAA,CAAS,SAAA;AAAA,QAC9B;AACA,QAAA,IAAI,CAAC,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,EAAA,IAAM,MAAM,IAAA,EAAM;AACjD,UAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AACrB,UAAA,KAAA,CAAM,QAAA,GAAW,KAAA;AACjB,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,QACrE;AACA,QAAA,IAAI,KAAA,CAAM,gBAAgB,KAAA,CAAM,EAAA,IAAM,MAAM,gBAAA,GAAmB,KAAA,CAAM,OAAO,MAAA,EAAQ;AAClF,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,MAAM,gBAAgB,CAAA;AACzD,UAAA,KAAA,CAAM,gBAAA,GAAmB,MAAM,MAAA,CAAO,MAAA;AACtC,UAAA,GAAA,CAAI,IAAA,CAAK;AAAA,YACP,IAAA,EAAM,sBAAA;AAAA,YACN,IAAI,KAAA,CAAM,EAAA;AAAA,YACV;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,KAAA,CAAM,UAAA,GAAa,eAAA,CAAgB,MAAA,CAAO,aAAa,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,CAAA,GAAI,IAAI,OAAO,CAAA;AASrB,IAAA,IAAI,CAAA,EAAG;AAIL,MAAA,MAAM,sBAAA,GACJ,CAAA,CAAE,uBAAA,KAA4B,MAAA,IAAa,EAAE,wBAAA,KAA6B,MAAA;AAC5E,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,qBAAA,EAAuB,aAAA,IAAiB,EAAE,uBAAA,IAA2B,CAAA;AACtF,MAAA,MAAM,WAAA,GACJ,CAAA,CAAE,aAAA,KACD,sBAAA,GAAA,CACI,CAAA,CAAE,uBAAA,IAA2B,CAAA,KAAM,CAAA,CAAE,wBAAA,IAA4B,CAAA,CAAA,GAClE,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,MAAA,CAAA;AAC1B,MAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,QACZ,OAAO,CAAA,CAAE,wBAAA,IAA4B,KAAK,GAAA,CAAI,CAAA,EAAG,cAAc,MAAM,CAAA;AAAA,QACrE,MAAA,EAAQ,CAAA,CAAE,iBAAA,IAAqB,KAAA,CAAM,KAAA,CAAM,MAAA;AAAA,QAC3C,SAAA,EAAW,MAAA,IAAU,KAAA,CAAM,KAAA,CAAM;AAAA,OACnC;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAAA,EACA,cAAA,EAAgB,CAAC,KAAA,KAAyB;AACxC,IAAA,IAAI,KAAA,CAAM,YAAA,EAAc,OAAO,EAAC;AAChC,IAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AACrB,IAAA,MAAM,MAAqB,EAAC;AAC5B,IAAA,IAAI,MAAM,YAAA,EAAc;AACtB,MAAA,KAAA,CAAM,YAAA,GAAe,KAAA;AACrB,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,CAAA;AAAA,IACpC;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,WAAA,CAAY,MAAA,EAAO,EAAG;AAC9C,MAAA,IAAI,CAAC,KAAA,CAAM,EAAA,IAAM,CAAC,MAAM,IAAA,EAAM;AAC9B,MAAA,IAAI,CAAC,MAAM,YAAA,EAAc;AACvB,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,EAAA,EAAI,MAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,MACrE;AACA,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AACzC,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAI,KAAA,CAAM,EAAA,EAAI,OAAO,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,UAAA,EAAY,MAAM,UAAA,EAAY,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA;AAAA,IACrF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAC;AAED,SAASI,mBAAkB,MAAA,EAA8C;AACvE,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACvB,IAAA,MAAM,EAAE,aAAA,EAAe,GAAA,EAAK,GAAG,MAAK,GAAI,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;ACpMO,IAAM,mBAAmB,gBAAA,CAAoC;AAAA,EAClE,EAAA,EAAI,QAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,YAAA,EAAc,sBAAsB,QAAQ,CAAA;AAAA,EAC5C,cAAA,EAAgB,kDAAA;AAAA,EAChB,QAAA,EAAU,CAAC,IAAA,EAAM,GAAA,KACf,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAC,CAAA,8BAAA,CAAA;AAAA,EACjD,YAAA,EAAc,CAAC,MAAA,MAAY,EAAE,kBAAkB,MAAA,EAAO,CAAA;AAAA,EACtD,SAAA,EAAW,CAAC,GAAA,KAAiB;AAC3B,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,QAAA,EAAUC,iBAAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAAA,MACvC,gBAAA,EAAkB,eAAe,GAAG;AAAA,KACtC;AACA,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,mBAAmB,CAAA,GAAI;AAAA,QAC1B,KAAA,EAAO,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK,CAAE;AAAA,OACjD;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,OAAO,IAAI,CAAC,EAAE,sBAAsBC,cAAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA,iBAAA,EAAmB,CAAC,aAAA,MAAmB;AAAA,IACrC,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,IAC7B,UAAA,EAAY,UAAA;AAAA,IACZ,OAAA,EAAS,KAAA;AAAA,IACT,eAAA,EAAiB,KAAA;AAAA,IACjB,YAAA,EAAc;AAAA,GAChB,CAAA;AAAA,EACA,gBAAA,EAAkB,CAAC,GAAA,EAAK,KAAA,KAAyB;AAC/C,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,IAAI,IAAA,KAAS,QAAA,SAAiB,EAAC;AAChD,IAAA,MAAM,MAAA,GAASN,SAAAA,CAQZ,GAAA,CAAI,IAAI,CAAA;AACX,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,MAAA,CAAO,KAAA,SAAc,EAAC;AACzC,IAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,IAAA,MAAM,MAAqB,EAAC;AAE5B,IAAA,IAAI,GAAA,CAAI,YAAA,EAAc,KAAA,CAAM,KAAA,GAAQ,GAAA,CAAI,YAAA;AACxC,IAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,iBAAiB,KAAA,EAAO,KAAA,CAAM,OAAO,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,UAAA,GAAa,CAAC,CAAA;AACpC,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,EAAW,OAAA,EAAS,KAAA,IAAS,EAAC,EAAG;AAClD,MAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACzD,QAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,cAAc,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,MAClD,CAAA,MAAA,IAAW,KAAK,YAAA,EAAc;AAC5B,QAAA,KAAA,CAAM,eAAA,GAAkB,IAAA;AACxB,QAAA,MAAM,EAAA,GAAK,CAAA,EAAG,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA,CAAA,EAAIE,UAAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAChE,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,IAAI,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,CAAA;AACrE,QAAA,MAAM,YAAA,GACJ,OAAO,IAAA,CAAK,gBAAA,KAAqB,WAC7B,EAAE,yBAAA,EAA2B,IAAA,CAAK,gBAAA,EAAiB,GACnD,MAAA;AACN,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,IAAA,EAAM,eAAA;AAAA,UACN,EAAA;AAAA,UACA,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,IAAA,IAAQ,EAAC;AAAA,UAClC,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB;AAAC,SACxC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,MAAA,KAAA,CAAM,UAAA,GAAa,eAAA,CAAgB,SAAA,CAAU,YAAY,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,IAAI,GAAA,CAAI,aAAA;AACd,IAAA,IAAI,CAAA,EAAG;AAEL,MAAA,MAAM,MAAA,GAAS,EAAE,uBAAA,IAA2B,CAAA;AAC5C,MAAA,MAAM,WAAA,GAAc,CAAA,CAAE,gBAAA,IAAoB,KAAA,CAAM,MAAM,KAAA,GAAQ,MAAA;AAC9D,MAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,QACZ,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,MAAM,CAAA;AAAA,QACvC,MAAA,EAAQ,CAAA,CAAE,oBAAA,IAAwB,KAAA,CAAM,KAAA,CAAM,MAAA;AAAA,QAC9C,SAAA,EAAW,MAAA,IAAU,KAAA,CAAM,KAAA,CAAM;AAAA,OACnC;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAAA,EACA,cAAA,EAAgB,CAAC,KAAA,KAAyB;AACxC,IAAA,IAAI,MAAM,YAAA,IAAgB,CAAC,KAAA,CAAM,OAAA,SAAgB,EAAC;AAClD,IAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AACrB,IAAA,MAAM,SAAA,GAAwB,KAAA,CAAM,eAAA,GAAkB,UAAA,GAAa,KAAA,CAAM,UAAA;AACzE,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,cAAA,EAAgB,YAAY,SAAA,EAAW,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA;AAAA,EAC7E;AACF,CAAC;AAED,SAAS,eAAe,GAAA,EAAuC;AAC7D,EAAA,MAAM,GAAA,GAA+B,EAAE,eAAA,EAAiB,GAAA,CAAI,SAAA,EAAU;AACtE,EAAA,IAAI,IAAI,WAAA,KAAgB,MAAA,EAAW,GAAA,CAAI,aAAa,IAAI,GAAA,CAAI,WAAA;AAC5D,EAAA,IAAI,IAAI,IAAA,KAAS,MAAA,EAAW,GAAA,CAAI,MAAM,IAAI,GAAA,CAAI,IAAA;AAC9C,EAAA,IAAI,GAAA,CAAI,aAAA,EAAe,GAAA,CAAI,eAAe,IAAI,GAAA,CAAI,aAAA;AAClD,EAAA,OAAO,GAAA;AACT;AAEA,SAASI,eAAc,KAAA,EAA+C;AACpE,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,UAAA,EAAYC,wBAAAA,CAAwB,CAAA,CAAE,WAAkD,CAAA,IAAK;AAAA,MAC3F,IAAA,EAAM,QAAA;AAAA,MACN,YAAY;AAAC;AACf,GACF,CAAE,CAAA;AACJ;AAEA,IAAMC,oBAAAA,uBAA0B,GAAA,CAAI;AAAA,EAClC,MAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAASD,yBAAwB,IAAA,EAAoD;AACnF,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW,OAAO,MAAA;AAChD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,MAAA;AAChC,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,MAAA;AACrC,EAAA,MAAM,GAAA,GAAM,IAAA;AACZ,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,IAAA,IAAI,CAACC,oBAAAA,CAAoB,GAAA,CAAI,CAAC,CAAA,EAAG;AACjC,IAAA,IAAI,CAAA,KAAM,YAAA,IAAgB,CAAA,IAAK,OAAO,MAAM,QAAA,EAAU;AACpD,MAAA,MAAM,QAAiC,EAAC;AACxC,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,CAA4B,CAAA,EAAG;AAC3E,QAAA,MAAM,OAAA,GAAUD,yBAAwB,OAAO,CAAA;AAC/C,QAAA,IAAI,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,GAAI,OAAA;AAAA,MAC9B;AACA,MAAA,GAAA,CAAI,YAAY,CAAA,GAAI,KAAA;AAAA,IACtB,CAAA,MAAA,IAAW,MAAM,OAAA,EAAS;AACxB,MAAA,MAAM,OAAA,GAAUA,yBAAwB,CAAC,CAAA;AACzC,MAAA,IAAI,OAAA,EAAS,GAAA,CAAI,OAAO,CAAA,GAAI,OAAA;AAAA,IAC9B,WAAW,CAAA,KAAM,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC5C,MAAA,MAAM,OAAA,GAAU,CAAA,CACb,GAAA,CAAI,CAAC,CAAA,KAAMA,wBAAAA,CAAwB,CAAC,CAAC,CAAA,CACrC,MAAA,CAAO,CAAC,CAAA,KAAoC,MAAM,MAAS,CAAA;AAC9D,MAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA,GAAI,OAAA;AAAA,IACzC,WAAW,CAAA,KAAM,UAAA,IAAc,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC/C,MAAA,GAAA,CAAI,UAAU,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,OAAO,MAAM,QAAQ,CAAA;AAAA,IACzD,WAAW,CAAA,KAAM,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC3C,MAAA,GAAA,CAAI,MAAM,CAAA,GAAI,CAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAASF,kBAAiB,QAAA,EAAsC;AAC9D,EAAA,MAAM,MAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACzB,IAAA,MAAM,MAAA,GACJ,OAAO,CAAA,CAAE,OAAA,KAAY,WAAW,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,CAAA,CAAE,OAAA,EAAS,IAAI,CAAA,CAAE,OAAA;AACnF,IAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAC1B,MAAA,MAAM,QAAsB,EAAC;AAC7B,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,aAAA,IACnD,CAAA,CAAE,SAAS,UAAA,EAAY;AAC9B,UAAA,MAAM,IAAA,GAAmB;AAAA,YACvB,cAAc,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,EAAM,EAAE,KAAA;AAAM,WAC9C;AACA,UAAA,MAAM,GAAA,GAAM,CAAA,CAAE,YAAA,GAAe,yBAAyB,CAAA;AACtD,UAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7C,YAAA,IAAA,CAAK,gBAAA,GAAmB,GAAA;AAAA,UAC1B;AACA,UAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,QACjB;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,CAAA;AACvD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,YAA0B,EAAC;AACjC,IAAA,MAAM,gBAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,WAAA,IACvD,CAAA,CAAE,SAAS,aAAA,EAAe;AACjC,QAAA,MAAM,YAAA,GAAe,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CAAA;AACzF,QAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,WAAA;AAC3B,QAAA,aAAA,CAAc,IAAA,CAAK;AAAA,UACjB,gBAAA,EAAkB;AAAA,YAChB,IAAA,EAAM,MAAA;AAAA,YACN,QAAA,EAAU,EAAE,OAAA,EAAS,YAAA;AAAa;AACpC,SACD,CAAA;AAAA,MACH,WAAW,CAAA,CAAE,IAAA,KAAS,WAAW,CAAA,CAAE,MAAA,CAAO,SAAS,QAAA,EAAU;AAC3D,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,UAAA,EAAY;AAAA,YACV,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,UAAA,IAAc,WAAA;AAAA,YACjC,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,IAAA,IAAQ;AAAA;AACzB,SACD,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,CAAA;AACrE,IAAA,IAAI,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,aAAA,EAAe,CAAA;AAAA,EACnF;AACA,EAAA,OAAO,GAAA;AACT;;;ACjQA,eAAsB,eAAA,CACpB,QAAA,EACA,UAAA,EACA,OAAA,EACuB;AACvB,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,WAAA,CAAY,UAAU,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,QAAA,EAAU,MAAA,IAAU,aAAa,CAAA;AACpE,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,QAAA,CAAS,YAAY,OAAO,CAAA;AACzD,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,GAAG,IAAA,EAAK;AAC7B,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,KAAA,EAAO,KAAA,CAAM,YAAA,CAAa,KAAA,IAAS,IAAA,CAAK,KAAA;AAAA,IACxC,aAAA,EAAe,KAAA,CAAM,YAAA,CAAa,KAAA,IAAS,IAAA,CAAK,aAAA;AAAA,IAChD,MAAA,EAAQ,KAAA,CAAM,YAAA,CAAa,MAAA,IAAU,IAAA,CAAK,MAAA;AAAA,IAC1C,UAAA,EAAY,KAAA,CAAM,YAAA,CAAa,UAAA,IAAc,IAAA,CAAK;AAAA,GACpD;AACF;;;ACUO,SAAS,oBAAA,CACd,MAAA,EACA,IAAA,GAA6B,EAAC,EACd;AAChB,EAAA,MAAM,MAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAU,OAAO,CAAA,CAAE,SAAS,QAAA,EAAU;AACnD,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA;AAAA,IACzC,WAAW,CAAA,CAAE,IAAA,KAAS,cAAc,CAAA,CAAE,EAAA,IAAM,EAAE,IAAA,EAAM;AAClD,MAAA,MAAM,QAAQ,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA,GAAK,CAAA,CAAE,QAAoC,EAAC;AAC/E,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,IAC9D,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,aAAA,IAAiB,EAAE,WAAA,EAAa;AACpD,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,aAAA;AAAA,QACN,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,OAAA,EAAS,0BAAA,CAA2B,CAAA,CAAE,OAAA,EAAS,IAAI,CAAA;AAAA,QACnD,UAAU,CAAA,CAAE;AAAA,OACb,CAAA;AAAA,IACH,WAAW,CAAA,CAAE,IAAA,KAAS,cAAc,OAAO,CAAA,CAAE,aAAa,QAAA,EAAU;AAIlE,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,UAAA;AAAA,QACN,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,GAAI,EAAE,SAAA,GAAY,EAAE,WAAW,CAAA,CAAE,SAAA,KAAc;AAAC,OACjD,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,EAAE,MAAA,EAAQ;AACzC,MAAA,MAAM,MAAM,CAAA,CAAE,MAAA;AACd,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,KAAS,KAAA,GAAQ,KAAA,GAAQ,QAAA;AAC1C,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,IAAA;AAAA,UACN,GAAI,IAAI,UAAA,GAAa,EAAE,YAAY,GAAA,CAAI,UAAA,KAAe,EAAC;AAAA,UACvD,GAAI,IAAI,IAAA,GAAO,EAAE,MAAM,GAAA,CAAI,IAAA,KAAS,EAAC;AAAA,UACrC,GAAI,IAAI,GAAA,GAAM,EAAE,KAAK,GAAA,CAAI,GAAA,KAAQ;AAAC;AACpC,OACD,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,EAAE,IAAA,EAAM;AACjB,MAAA,IAAA,CAAK,aAAA,GAAgB,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAAA,IAChC;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAWA,SAAS,0BAAA,CAA2B,KAAc,IAAA,EAAoC;AACpF,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,GAAA;AACpC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAItB,IAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,GAAA,EAAyB,IAAI,CAAA;AACjE,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAO,EAAE,IAAA,KAAS,MAAA,GAAS,CAAA,CAAE,IAAA,GAAO,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,CAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,IAAA,EAAM,OAAO,EAAA;AAC9C,EAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAC3B;AAEA,SAAS,cAAc,CAAA,EAA0C;AAC/D,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE;ACxEO,SAAS,iBAAA,CACd,MAAA,EACA,IAAA,GAA0B,EAAC,EACX;AAChB,EAAA,MAAM,MAAsB,EAAC;AAC7B,EAAA,MAAM,IAAA,GAAO,OAAO,OAAA,CAAQ,OAAA;AAI5B,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,SAAS,CAAA,EAAG;AAC/C,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,EACjC;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,OAAA,CAAQ,UAAA,IAAc,EAAC,EAAG;AAChD,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,QAAA,CAAS,SAAA,IAAa,IAAA;AAIrC,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,EAAA,IAAM,CAAA,KAAA,EAAQH,YAAY,CAAA,CAAA;AACxC,IAAA,MAAM,QAAQ,kBAAA,CAAmB,GAAA,EAAK,GAAG,QAAA,CAAS,IAAA,EAAM,IAAI,IAAI,CAAA;AAChE,IAAA,MAAM,KAAA,GAAsB;AAAA,MAC1B,IAAA,EAAM,UAAA;AAAA,MACN,EAAA;AAAA,MACA,IAAA,EAAM,GAAG,QAAA,CAAS,IAAA;AAAA,MAClB;AAAA,KACF;AACA,IAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EAChB;AACA,EAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,IAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,kBAAA,CACP,GAAA,EACA,QAAA,EACA,UAAA,EACA,IAAA,EACyB;AACzB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,QAAA,EAAU,UAAA,EAAY,KAAK,CAAA;AACnD,IAAA,OAAO,EAAE,iBAAiB,GAAA,EAAI;AAAA,EAChC,CAAA,CAAA,MAAQ;AAGN,IAAA,MAAM,SAAA,GAAY,mBAAmB,GAAG,CAAA;AACxC,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACnC,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAE,QAAA,EAAU,UAAA,EAAY,KAAK,CAAA;AACnD,IAAA,OAAO,EAAE,iBAAiB,GAAA,EAAI;AAAA,EAChC;AACF;;;AClCA,eAAsB,mCACpB,IAAA,EAC4B;AAC5B,EAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,QAAA,CAAS,aAAA,EAAc;AACpD,EAAA,MAAM,YAA+B,EAAC;AACtC,EAAA,MAAM,cAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,IAAA,IAAI,CAAA,CAAE,WAAW,aAAA,EAAe;AAC9B,MAAA,WAAA,CAAY,KAAK,CAAC,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,MAAM,CAAA,CAAE,EAAA;AAAA,MACR,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,MAAA,EAAQ,CAAC,GAAA,KAAwB,YAAA,CAAa,GAAG,GAAG;AAAA,KACrD,CAAA;AAAA,EACH;AAGA,EAAA,SAAA,CAAU,IAAA,CAAK;AAAA,IACb,IAAA,EAAM,mBAAA;AAAA,IACN,MAAA,EAAQ,mBAAA;AAAA,IACR,MAAA,EAAQ,CAAC,GAAA,KACP,IAAI,wBAAA,CAAyB;AAAA,MAC3B,EAAA,EAAI,mBAAA;AAAA,MACJ,MAAA,EAAQ,WAAW,GAAG,CAAA;AAAA,MACtB,OAAA,EAAS,IAAI,OAAA,IAAW,EAAA;AAAA,MACxB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,QAAQ,GAAA,CAAI;AAAA,KACb;AAAA,GACJ,CAAA;AAED,EAAA,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,GAAA,EAAK;AAGtC,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA;AAAA,MACP,CAAA,EAAG,WAAA,CAAY,MAAM,CAAA,sDAAA,CAAA,GACnB,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI;AAAA,KAC1C;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,YAAA,CAAa,GAAqB,GAAA,EAA+B;AAGxE,EAAA,MAAM,MAAA,GAAqB,GAAA,CAAI,MAAA,IAAU,CAAA,CAAE,MAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,IAAW,GAAA,CAAI,QAAQ,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,OAAA,GAAU,CAAA,CAAE,OAAA;AACxE,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,IAAU,WAAA,CAAY,OAAO,CAAA;AAChD,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,KAAW,aAAA,EAAe;AACvC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,UAAA,EAAa,CAAA,CAAE,EAAE,CAAA,2BAAA,EACf,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,IAAK,kBAC1B,CAAA,sBAAA,EAAyB,CAAA,CAAE,EAAE,CAAA,GAAA;AAAA,KAC/B;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,IAAW,CAAA,CAAE,OAAA;AAEjC,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,KAAW,aAAA,EAAe;AACvC,IAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,aAAa,CAAA,CAAE,EAAE,CAAA,mCAAA,EAAsC,CAAA,CAAE,OAAO,SAAS,CAAA,uDAAA;AAAA,OAE3E;AAAA,IACF;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,UAAA,EAAa,EAAE,EAAE,CAAA,sJAAA;AAAA,KAEnB;AAAA,EACF;AAEA,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,WAAA;AACH,MAAA,OAAO,IAAI,iBAAA,CAAkB,EAAE,MAAA,EAAiB,SAAS,CAAA;AAAA,IAC3D,KAAK,QAAA;AACH,MAAA,OAAO,IAAI,cAAA,CAAe;AAAA,QACxB,MAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,QAAQ,GAAA,CAAI;AAAA,OACb,CAAA;AAAA,IACH,KAAK,mBAAA;AACH,MAAA,OAAO,IAAI,wBAAA,CAAyB;AAAA,QAClC,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAA;AAAA,QACA,SAAS,OAAA,IAAW,EAAA;AAAA,QACpB,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,QAAQ,GAAA,CAAI;AAAA,OACb,CAAA;AAAA,IACH,KAAK,QAAA;AACH,MAAA,OAAO,IAAI,eAAe,EAAE,EAAA,EAAI,EAAE,EAAA,EAAI,MAAA,EAAiB,SAAS,CAAA;AAAA;AAEtE;AAMO,SAAS,sBAAA,CAAuB,IAAY,GAAA,EAA+B;AAChF,EAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AACf,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,aAAa,EAAE,CAAA,wHAAA;AAAA,KACjB;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAA8B;AAAA,IAClC,EAAA;AAAA,IAEA,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,OAAA,EAAS,GAAA,CAAI,OAAA,IAAW,EAAC;AAAA,IACzB,MAAA,EAAA,CAAS,GAAA,CAAI,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,EAAG,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,IAC1D,GAAA,EAAK;AAAA,GACP;AACA,EAAA,OAAO,YAAA,CAAa,WAAW,GAAG,CAAA;AACpC;AAEA,SAAS,YAAY,IAAA,EAAoC;AACvD,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA;AACzB,IAAA,IAAI,KAAK,OAAO,GAAA;AAAA,EAClB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,GAAA,EAA6B;AAC/C,EAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,OAAO,GAAA,CAAI,MAAA;AAC3B,EAAA,MAAM,IAAI,MAAM,qEAAqE,CAAA;AACvF","file":"index.js","sourcesContent":["import { safeParse } from '@wrongstack/core';\n\n/**\n * Parse a tool-call arguments JSON blob into a canonical\n * `Record<string, unknown>`.\n *\n * Why this exists: providers stream tool-call arguments as raw JSON strings\n * accumulated over multiple `delta` events. Once complete, callers want a\n * dictionary. Naive `JSON.parse` plus `as Record<string, unknown>` is unsafe\n * — a buggy provider, a proxy that rewrites payloads, or a future API change\n * can yield `null`, an array, a string, or a number, all of which would\n * type-check fine but crash downstream tool executors that index into the\n * input by key.\n *\n * Result contract:\n * - Valid JSON object → returned as-is, typed as `Record<string, unknown>`.\n * - Valid JSON array / scalar → wrapped under `{ __raw: value }` so the\n * tool still receives an object (the executor can detect the anomaly).\n * - Invalid JSON → returns `{ __raw: rawString }` so no information is\n * lost; the tool layer can decide whether to fail or salvage.\n * - Empty/null input → returns `{}` (the \"no arguments\" case).\n */\nexport function parseToolInput(raw: string | undefined): Record<string, unknown> {\n if (!raw) return {};\n const parsed = safeParse<unknown>(raw);\n if (!parsed.ok) return { __raw: raw };\n const v = parsed.value;\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n return v as Record<string, unknown>;\n }\n return { __raw: v ?? raw };\n}\n","import type { ContentBlock, Response, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { parseToolInput } from './_tool-input.js';\n\n/**\n * Consume an `AsyncIterable<StreamEvent>` and reduce it to a non-streaming\n * `Response`. Used by `Provider.complete()` default impls so that the\n * streaming code path is the single source of truth.\n *\n * Optional `onEvent` callback fires for every event as it arrives, useful\n * for the agent loop to emit text_delta to the EventBus without writing\n * its own aggregation logic.\n */\nexport async function aggregateStream(\n stream: AsyncIterable<StreamEvent>,\n onEvent?: (e: StreamEvent) => void,\n): Promise<Response> {\n let model = '';\n let stopReason: StopReason = 'end_turn';\n let usage: Usage = { input: 0, output: 0 };\n const textBuffers: string[] = [];\n let currentTextIndex = -1;\n const toolBuffers = new Map<\n string,\n { name: string; partial: string; input?: unknown; providerMeta?: Record<string, unknown> }\n >();\n const thinkingBuffers: Array<{\n textBuf: string;\n signature?: string;\n providerMeta?: Record<string, unknown>;\n }> = [];\n let currentThinkingIndex = -1;\n const blockOrder: Array<\n { kind: 'text'; idx: number } | { kind: 'tool'; id: string } | { kind: 'thinking'; idx: number }\n > = [];\n\n for await (const ev of stream) {\n if (onEvent) onEvent(ev);\n switch (ev.type) {\n case 'message_start':\n model = ev.model;\n break;\n case 'text_delta':\n if (currentTextIndex === -1) {\n currentTextIndex = textBuffers.length;\n textBuffers.push('');\n blockOrder.push({ kind: 'text', idx: currentTextIndex });\n }\n textBuffers[currentTextIndex] = (textBuffers[currentTextIndex] ?? '') + ev.text;\n break;\n case 'tool_use_start':\n // A tool_use block starts — close any open text block so subsequent\n // text_delta starts a new one.\n currentTextIndex = -1;\n toolBuffers.set(ev.id, { name: ev.name, partial: '' });\n blockOrder.push({ kind: 'tool', id: ev.id });\n break;\n case 'tool_use_input_delta': {\n const b = toolBuffers.get(ev.id);\n if (b) b.partial += ev.partial;\n break;\n }\n case 'tool_use_stop': {\n const b = toolBuffers.get(ev.id);\n if (b) {\n if (ev.input === undefined) {\n // No upstream input — parse from the accumulated partial buffer.\n b.input = parseToolInput(b.partial);\n } else if (typeof ev.input === 'string') {\n // Upstream gave us a raw JSON string; route through the validator.\n b.input = parseToolInput(ev.input);\n } else if (ev.input && typeof ev.input === 'object' && !Array.isArray(ev.input)) {\n b.input = ev.input;\n } else {\n // Array / scalar — preserve via __raw so downstream sees an object.\n b.input = { __raw: ev.input };\n }\n if (ev.providerMeta) b.providerMeta = ev.providerMeta;\n }\n // Tool just stopped — next text_delta should open a new text block.\n currentTextIndex = -1;\n break;\n }\n case 'thinking_start': {\n currentTextIndex = -1;\n // If a thinking block was already started by thinking_signature before\n // this event arrived (e.g. due to out-of-order delivery), reuse it so\n // signature and content end up in the same block rather than creating\n // duplicate thinking entries in the response.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ textBuf: '' });\n }\n // Always set providerMeta on the target block (thinking_start may carry\n // metadata even when the prior signature event did not).\n if (ev.providerMeta && currentThinkingIndex >= 0) {\n thinkingBuffers[currentThinkingIndex]!.providerMeta = ev.providerMeta;\n }\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n break;\n }\n case 'thinking_delta': {\n // Ensure a thinking buffer exists before appending. If thinking_signature\n // created the block (currentThinkingIndex >= 0), reuse it so the\n // signature and content end up in the same buffer.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ textBuf: '' });\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n }\n const t = thinkingBuffers[currentThinkingIndex];\n if (t) t.textBuf += ev.text;\n break;\n }\n case 'thinking_signature': {\n // Ensure a thinking buffer exists before storing the signature. This\n // handles out-of-order delivery where thinking_signature arrives before\n // thinking_start.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ textBuf: '' });\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n }\n const t = thinkingBuffers[currentThinkingIndex];\n if (t) t.signature = ev.signature;\n break;\n }\n case 'thinking_stop': {\n currentThinkingIndex = -1;\n break;\n }\n case 'message_stop':\n stopReason = ev.stopReason;\n usage = ev.usage;\n break;\n }\n }\n\n const content: ContentBlock[] = [];\n for (const b of blockOrder) {\n if (b.kind === 'text') {\n const text = textBuffers[b.idx] ?? '';\n if (text) content.push({ type: 'text', text });\n } else if (b.kind === 'thinking') {\n const t = thinkingBuffers[b.idx];\n // Drop completely empty thinking blocks — emitting one would make\n // Anthropic 400 on the round-trip (\"thinking: cannot be empty\").\n if (!t || (!t.textBuf && !t.signature)) continue;\n const block: ContentBlock = { type: 'thinking', thinking: t.textBuf };\n if (t.signature) (block as { signature?: string }).signature = t.signature;\n if (t.providerMeta && Object.keys(t.providerMeta).length > 0) {\n (block as { providerMeta?: Record<string, unknown> }).providerMeta = t.providerMeta;\n }\n content.push(block);\n } else {\n const tb = toolBuffers.get(b.id);\n if (tb) {\n const block: ContentBlock = {\n type: 'tool_use',\n id: b.id,\n name: tb.name,\n input:\n tb.input && typeof tb.input === 'object' && !Array.isArray(tb.input)\n ? (tb.input as Record<string, unknown>)\n : {},\n };\n if (tb.providerMeta && Object.keys(tb.providerMeta).length > 0) {\n (block as { providerMeta?: Record<string, unknown> }).providerMeta = tb.providerMeta;\n }\n content.push(block);\n }\n }\n }\n if (content.length === 0) content.push({ type: 'text', text: '' });\n\n return { content, stopReason, usage, model };\n}\n","import type {\r\n Capabilities,\r\n Message,\r\n Request,\r\n StopReason,\r\n StreamEvent,\r\n Usage,\r\n} from '@wrongstack/core';\r\nimport { ProviderError, safeParse } from '@wrongstack/core';\r\nimport { parseToolInput } from './_tool-input.js';\r\nimport { parseProviderHttpError } from './error-parse.js';\r\nimport { capabilitiesForFamily } from './family-capabilities.js';\r\nimport { parseSSE } from './sse.js';\r\nimport { normalizeAnthropic } from './stop-reason.js';\r\nimport { toolsToAnthropic } from './tool-format/to-anthropic.js';\r\nimport { WireAdapter } from './wire-adapter.js';\r\n\r\nexport interface AnthropicProviderOptions {\r\n apiKey: string;\r\n baseUrl?: string;\r\n apiVersion?: string;\r\n beta?: string[];\r\n fetchImpl?: typeof fetch;\r\n}\r\n\r\nconst DEFAULT_BASE = 'https://api.anthropic.com';\r\nconst DEFAULT_VERSION = '2023-06-01';\r\n\r\nfunction isAnthropicHost(baseUrl: string): boolean {\r\n try {\r\n const host = new URL(baseUrl).hostname.toLowerCase();\r\n return host === 'api.anthropic.com' || host.endsWith('.anthropic.com');\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport class AnthropicProvider extends WireAdapter {\r\n override readonly id = 'anthropic';\r\n override readonly capabilities: Capabilities = capabilitiesForFamily('anthropic');\r\n\r\n private readonly opts: AnthropicProviderOptions;\r\n\r\n constructor(opts: AnthropicProviderOptions) {\r\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl);\r\n this.opts = opts;\r\n }\r\n\r\n protected override buildUrl(_req: Request): string {\r\n const base = this.baseUrl.replace(/\\/+$/, '');\r\n if (/\\/v\\d+\\/messages$/.test(base)) return base;\r\n if (/\\/v\\d+$/.test(base)) return `${base}/messages`;\r\n return `${base}/v1/messages`;\r\n }\r\n\r\n protected override buildHeaders(req: Request): Record<string, string> {\r\n const headers: Record<string, string> = {\r\n ...super.buildHeaders(req),\r\n 'anthropic-version': this.opts.apiVersion ?? DEFAULT_VERSION,\r\n };\r\n if (isAnthropicHost(this.baseUrl)) {\r\n headers['x-api-key'] = this.apiKey;\r\n } else {\r\n // Third-party Anthropic-compatible proxies (kimi-for-coding,\r\n // zai-coding-plan, anyrouter, …) reject `x-api-key` and require\r\n // `Authorization: Bearer`. This mirrors Claude Code's\r\n // ANTHROPIC_AUTH_TOKEN switch — triggered automatically when the\r\n // baseUrl is not Anthropic-owned.\r\n headers['authorization'] = `Bearer ${this.apiKey}`;\r\n }\r\n if (this.opts.beta && this.opts.beta.length > 0) {\r\n headers['anthropic-beta'] = this.opts.beta.join(',');\r\n }\r\n return headers;\r\n }\r\n\r\n protected override buildBody(req: Request): Record<string, unknown> {\r\n const body: Record<string, unknown> = {\r\n model: req.model,\r\n max_tokens: req.maxTokens,\r\n messages: req.messages.map((m) => this.normalizeMessage(m)),\r\n stream: true,\r\n };\r\n if (req.system && req.system.length > 0) body['system'] = req.system;\r\n if (req.tools && req.tools.length > 0) body['tools'] = toolsToAnthropic(req.tools);\r\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\r\n if (req.topP !== undefined) body['top_p'] = req.topP;\r\n if (req.stopSequences) body['stop_sequences'] = req.stopSequences;\r\n if (req.toolChoice) body['tool_choice'] = req.toolChoice;\r\n return body;\r\n }\r\n\r\n protected override parseStream(\r\n body: Parameters<typeof parseSSE>[0],\r\n fallbackModel: string,\r\n ): AsyncIterable<StreamEvent> {\r\n return parseAnthropicStream(body, fallbackModel);\r\n }\r\n\r\n protected override translateError(status: number, text: string): ProviderError {\r\n return parseProviderHttpError(this.id, status, text);\r\n }\r\n\r\n private normalizeMessage(m: Message): Record<string, unknown> {\r\n return {\r\n role: m.role === 'system' ? 'user' : m.role,\r\n content: typeof m.content === 'string' ? m.content : m.content,\r\n };\r\n }\r\n}\r\n\r\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\r\n\r\n/**\r\n * Translate Anthropic's SSE wire format into canonical StreamEvent[].\r\n *\r\n * Block indices ↔ canonical event ids:\r\n * - text blocks emit text_delta with no id\r\n * - tool_use blocks: content_block_start carries the toolu_xxx id, and\r\n * subsequent input_json_delta chunks accumulate the JSON arg string.\r\n *\r\n * usage.input_tokens arrives in message_start; output_tokens lands in\r\n * message_delta.usage.\r\n */\r\nasync function* parseAnthropicStream(\r\n body: Response2Body,\r\n fallbackModel: string,\r\n): AsyncIterable<StreamEvent> {\r\n type BlockKind = 'text' | 'tool_use' | 'thinking' | 'unknown';\r\n const blocks = new Map<\r\n number,\r\n { kind: BlockKind; id?: string; name?: string; partial: string }\r\n >();\r\n let model = fallbackModel;\r\n let usage: Usage = { input: 0, output: 0 };\r\n let stopReason: StopReason = 'end_turn';\r\n let started = false;\r\n let stopped = false;\r\n\r\n for await (const msg of parseSSE(body)) {\r\n if (!msg.data || msg.data === '[DONE]') continue;\r\n const parsed = safeParse<Record<string, unknown>>(msg.data);\r\n if (!parsed.ok || !parsed.value) continue;\r\n const ev = parsed.value;\r\n const type = String(ev['type'] ?? msg.event);\r\n\r\n switch (type) {\r\n case 'message_start': {\r\n const message = ev['message'] as\r\n | {\r\n model?: string;\r\n usage?: {\r\n input_tokens?: number;\r\n cache_read_input_tokens?: number;\r\n cache_creation_input_tokens?: number;\r\n };\r\n }\r\n | undefined;\r\n if (message?.model) model = message.model;\r\n usage = {\r\n input: message?.usage?.input_tokens ?? 0,\r\n output: 0,\r\n cacheRead: message?.usage?.cache_read_input_tokens,\r\n cacheWrite: message?.usage?.cache_creation_input_tokens,\r\n };\r\n if (!started) {\r\n started = true;\r\n yield { type: 'message_start', model };\r\n }\r\n break;\r\n }\r\n case 'content_block_start': {\r\n const index = Number(ev['index'] ?? 0);\r\n const cb = ev['content_block'] as { type?: string; id?: string; name?: string } | undefined;\r\n if (cb?.type === 'tool_use') {\r\n blocks.set(index, { kind: 'tool_use', id: cb.id, name: cb.name, partial: '' });\r\n if (cb.id && cb.name) {\r\n yield { type: 'tool_use_start', id: cb.id, name: cb.name };\r\n }\r\n } else if (cb?.type === 'text') {\r\n blocks.set(index, { kind: 'text', partial: '' });\r\n } else if (cb?.type === 'thinking' || cb?.type === 'redacted_thinking') {\r\n // Anthropic extended thinking. The model emits an opening\r\n // `content_block_start` with type `thinking` (or\r\n // `redacted_thinking` when content was hidden from us), then\r\n // streams `thinking_delta` and a single `signature_delta`.\r\n // Both the text AND the signature must round-trip to the next\r\n // request — without the signature Anthropic returns 400.\r\n blocks.set(index, { kind: 'thinking', partial: '' });\r\n yield { type: 'thinking_start' };\r\n } else {\r\n blocks.set(index, { kind: 'unknown', partial: '' });\r\n }\r\n break;\r\n }\r\n case 'content_block_delta': {\r\n const index = Number(ev['index'] ?? 0);\r\n const delta = ev['delta'] as\r\n | {\r\n type?: string;\r\n text?: string;\r\n partial_json?: string;\r\n thinking?: string;\r\n signature?: string;\r\n data?: string;\r\n }\r\n | undefined;\r\n const block = blocks.get(index);\r\n if (!block || !delta) break;\r\n if (delta.type === 'text_delta' && typeof delta.text === 'string') {\r\n yield { type: 'text_delta', text: delta.text };\r\n } else if (delta.type === 'input_json_delta' && typeof delta.partial_json === 'string') {\r\n if (block.id) {\r\n block.partial += delta.partial_json;\r\n yield { type: 'tool_use_input_delta', id: block.id, partial: delta.partial_json };\r\n }\r\n } else if (delta.type === 'thinking_delta' && typeof delta.thinking === 'string') {\r\n yield { type: 'thinking_delta', text: delta.thinking };\r\n } else if (delta.type === 'signature_delta' && typeof delta.signature === 'string') {\r\n yield { type: 'thinking_signature', signature: delta.signature };\r\n }\r\n break;\r\n }\r\n case 'content_block_stop': {\r\n const index = Number(ev['index'] ?? 0);\r\n const block = blocks.get(index);\r\n if (block?.kind === 'tool_use' && block.id) {\r\n const input = parseToolInput(block.partial);\r\n yield { type: 'tool_use_stop', id: block.id, input };\r\n } else if (block?.kind === 'thinking') {\r\n yield { type: 'thinking_stop' };\r\n }\r\n break;\r\n }\r\n case 'message_delta': {\r\n const delta = ev['delta'] as { stop_reason?: string | null } | undefined;\r\n const u = ev['usage'] as { output_tokens?: number } | undefined;\r\n if (delta?.stop_reason !== undefined) {\r\n stopReason = normalizeAnthropic(delta.stop_reason);\r\n }\r\n if (u?.output_tokens !== undefined) usage = { ...usage, output: u.output_tokens };\r\n break;\r\n }\r\n case 'message_stop':\r\n stopped = true;\r\n yield { type: 'message_stop', stopReason, usage };\r\n break;\r\n case 'error': {\r\n const err = ev['error'] as { message?: string; type?: string } | undefined;\r\n throw new ProviderError(err?.message ?? 'Anthropic stream error', 0, false, 'anthropic', {\r\n body: { type: err?.type, message: err?.message },\r\n });\r\n }\r\n }\r\n }\r\n if (started && !stopped) {\r\n yield { type: 'message_stop', stopReason, usage };\r\n }\r\n}\r\n","import { ProviderError } from '@wrongstack/core';\nimport type { ProviderErrorBody } from '@wrongstack/core';\n\n/**\n * Provider HTTP error bodies come in three or four shapes depending on\n * vendor. Rather than dump the raw JSON into the error message (which is\n * what was shipped to the user log before this module existed), we parse\n * out the fields we care about — `type`, `message`, `requestId` — and put\n * them on `ProviderError.body` for `describe()` and downstream rendering.\n *\n * The function is intentionally tolerant: anything we can't parse falls\n * back to a truncated raw string, never throws.\n */\nexport function parseProviderHttpError(\n providerId: string,\n status: number,\n rawText: string,\n): ProviderError {\n const body = parseBody(rawText);\n const retryable = isRetryable(status, body.type);\n const message = `${providerId} HTTP ${status}`;\n return new ProviderError(message, status, retryable, providerId, { body });\n}\n\nconst RAW_TRUNCATE_AT = 2000;\n\nfunction parseBody(rawText: string): ProviderErrorBody {\n const raw = rawText.slice(0, RAW_TRUNCATE_AT);\n // Surface truncation so downstream renderers (CLI error formatter, log\n // exporter) can show a \"(truncated, N more bytes)\" suffix instead of\n // silently dropping the rest of the provider's error tail.\n const body: ProviderErrorBody =\n rawText.length > RAW_TRUNCATE_AT\n ? { raw, truncated: true, rawLength: rawText.length }\n : { raw };\n if (!rawText.trim()) return body;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawText);\n } catch {\n return body;\n }\n if (!isRecord(parsed)) return body;\n\n // Anthropic / MiniMax / Kimi: { type: \"error\", error: { type, message }, request_id }\n // OpenAI / OpenAI-compatible: { error: { message, type, code, param } }\n // Google: { error: { code, message, status } }\n const errField = parsed['error'];\n if (isRecord(errField)) {\n const t = stringOf(errField['type']) ?? stringOf(errField['status']);\n const m = stringOf(errField['message']);\n if (t) body.type = t;\n if (m) body.message = m;\n } else if (typeof errField === 'string') {\n body.message = errField;\n }\n // Top-level fields some providers use directly\n if (!body.type) {\n const t = stringOf(parsed['type']);\n if (t && t !== 'error') body.type = t;\n }\n if (!body.message) {\n const m = stringOf(parsed['message']);\n if (m) body.message = m;\n }\n\n // request_id (Anthropic), id (some compatible providers)\n const reqId =\n stringOf(parsed['request_id']) ?? stringOf(parsed['requestId']) ?? stringOf(parsed['id']);\n if (reqId) body.requestId = reqId;\n\n return body;\n}\n\n/**\n * Retryability is mostly driven by HTTP status, but provider-specific\n * `type` strings let us catch retryable conditions that don't have a\n * dedicated status code (e.g. Anthropic's `overloaded_error` is 529 but\n * we also retry it when wrapped in a 503).\n */\nfunction isRetryable(status: number, type?: string): boolean {\n if (status === 0) return true; // network error\n if (status === 408 || status === 429 || status === 529) return true;\n if (status >= 500 && status < 600) return true;\n if (type === 'overloaded_error' || type === 'rate_limit_error') return true;\n return false;\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction stringOf(v: unknown): string | undefined {\n return typeof v === 'string' && v.length > 0 ? v : undefined;\n}\n","import type { Capabilities, WireFamily } from '@wrongstack/core';\n\nexport const CAPABILITIES_BY_FAMILY: Record<WireFamily, Capabilities> = {\n anthropic: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: true,\n systemPrompt: true,\n jsonMode: false,\n maxContext: 200_000,\n cacheControl: 'native',\n },\n openai: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: true,\n maxContext: 128_000,\n cacheControl: 'auto',\n },\n 'openai-compatible': {\n tools: true,\n parallelTools: true,\n vision: false,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: false,\n maxContext: 32_000,\n cacheControl: 'none',\n },\n google: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: true,\n maxContext: 1_000_000,\n cacheControl: 'none',\n },\n unsupported: {\n tools: false,\n parallelTools: false,\n vision: false,\n streaming: false,\n promptCache: false,\n systemPrompt: false,\n jsonMode: false,\n maxContext: 0,\n cacheControl: 'none',\n },\n};\n\nexport function capabilitiesForFamily(\n family: WireFamily,\n overrides: Partial<Capabilities> = {},\n): Capabilities {\n return {\n ...(CAPABILITIES_BY_FAMILY[family] ?? CAPABILITIES_BY_FAMILY.unsupported),\n ...overrides,\n };\n}\n","/**\n * Minimal Server-Sent Events parser for HTTP streaming responses.\n *\n * Yields parsed events as `{ event, data }` pairs. Per spec:\n * - Each event is separated by a blank line\n * - `event: foo` sets the event name (defaults to \"message\")\n * - `data: ...` lines accumulate into the data buffer\n * - `:` lines are comments and ignored\n * - `id` / `retry` fields are accepted and ignored\n *\n * For Anthropic the wire format is canonical SSE with explicit `event:` lines.\n * For OpenAI / OpenAI-compatible the format omits `event:` and just emits\n * `data: <json>` chunks, with a final `data: [DONE]`. Both work with this\n * parser; consumers branch on event name or just on `data`.\n */\nexport interface SSEMessage {\n event: string;\n data: string;\n}\n\n/**\n * Cap on the pending-line buffer. A malicious or buggy upstream that sends\n * megabytes without a newline could otherwise pin a worker via the prior\n * O(n²) CRLF replace + unbounded `buffer +=` pattern. 256 KB comfortably\n * accommodates any sane SSE event while ensuring we fail fast on garbage.\n */\nconst MAX_BUFFER_BYTES = 256 * 1024;\n\nexport async function* parseSSE(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n): AsyncIterable<SSEMessage> {\n if (!body) return;\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let event = 'message';\n const dataLines: string[] = [];\n\n const flush = (): SSEMessage | undefined => {\n if (dataLines.length === 0 && event === 'message') return undefined;\n const data = dataLines.join('\\n');\n const msg: SSEMessage = { event, data };\n event = 'message';\n dataLines.length = 0;\n return msg;\n };\n\n const processLine = (line: string): SSEMessage | undefined => {\n if (line === '') return flush();\n if (line.startsWith(':')) return undefined; // comment\n const colonIdx = line.indexOf(':');\n let field: string;\n let value: string;\n if (colonIdx === -1) {\n field = line;\n value = '';\n } else {\n field = line.slice(0, colonIdx);\n value = line.slice(colonIdx + 1);\n if (value.startsWith(' ')) value = value.slice(1);\n }\n if (field === 'event') event = value || 'message';\n else if (field === 'data') dataLines.push(value);\n // id / retry: ignored\n return undefined;\n };\n\n // Incremental CRLF normalization on each appended chunk only — previously\n // we ran `.replace(/\\r\\n/g, '\\n')` on the *entire* buffer per chunk, which\n // is O(n²) in stream length. Trailing CR (split across chunks) is left\n // in the buffer; the splitter handles it on the next round.\n const appendChunk = (chunkStr: string): void => {\n if (chunkStr.length === 0) return;\n buffer += chunkStr;\n if (buffer.length > MAX_BUFFER_BYTES) {\n throw new Error(\n `SSE: pending line exceeds ${MAX_BUFFER_BYTES} bytes — upstream is not framing events`,\n );\n }\n };\n\n // Node.js Readable stream\n if (isNodeReadable(body)) {\n for await (const chunk of body as NodeJS.ReadableStream) {\n appendChunk(\n typeof chunk === 'string' ? chunk : decoder.decode(chunk as Buffer, { stream: true }),\n );\n const split = splitBuffer(buffer);\n buffer = split.tail;\n for (const line of split.lines) {\n const msg = processLine(line);\n if (msg) yield msg;\n }\n }\n } else {\n // Web ReadableStream\n const reader = (body as ReadableStream<Uint8Array>).getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n appendChunk(decoder.decode(value, { stream: true }));\n const split = splitBuffer(buffer);\n buffer = split.tail;\n for (const line of split.lines) {\n const msg = processLine(line);\n if (msg) yield msg;\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n // Flush any trailing buffered line\n if (buffer.length > 0) {\n const msg = processLine(buffer.replace(/\\r$/, ''));\n if (msg) yield msg;\n }\n const final = flush();\n if (final) yield final;\n}\n\nfunction splitBuffer(buf: string): { lines: string[]; tail: string } {\n // Split on \\n directly; strip trailing \\r per-line. Avoids the O(n²)\n // pattern of running .replace(/\\r\\n/g, '\\n') on the entire buffer\n // every chunk.\n const parts = buf.split('\\n');\n const tail = parts.pop() ?? '';\n const lines = parts.map((p) => (p.endsWith('\\r') ? p.slice(0, -1) : p));\n return { lines, tail };\n}\n\nfunction isNodeReadable(b: unknown): boolean {\n return (\n !!b &&\n typeof b === 'object' &&\n typeof (b as { pipe?: unknown }).pipe === 'function' &&\n typeof (b as { on?: unknown }).on === 'function'\n );\n}\n","import type { StopReason } from '@wrongstack/core';\n\nexport function normalizeAnthropic(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'end_turn':\n return 'end_turn';\n case 'tool_use':\n return 'tool_use';\n case 'max_tokens':\n return 'max_tokens';\n case 'stop_sequence':\n return 'stop_sequence';\n case 'refusal':\n return 'refusal';\n default:\n return 'end_turn';\n }\n}\n\nexport function normalizeOpenAI(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'stop':\n return 'end_turn';\n case 'tool_calls':\n case 'function_call':\n return 'tool_use';\n case 'length':\n return 'max_tokens';\n case 'content_filter':\n return 'refusal';\n default:\n return 'end_turn';\n }\n}\n\n/**\n * Normalize Gemini-specific finish reasons. SAFETY, RECITATION, and\n * \"hallucination\" are safety blocks that should not silently become end_turn.\n */\nexport function normalizeGemini(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'SAFETY':\n case 'RECITATION':\n case 'hallucination':\n return 'refusal';\n case 'stop':\n case 'STOP':\n return 'end_turn';\n case 'max_tokens':\n case 'MAX_TOKENS':\n return 'max_tokens';\n case 'tool_use':\n case 'TOOL_USE':\n return 'tool_use';\n default:\n return 'end_turn';\n }\n}\n","import type { Tool } from '@wrongstack/core';\n\nexport interface AnthropicToolSchema {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\nexport function toolsToAnthropic(tools: Tool[]): AnthropicToolSchema[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: (t.inputSchema as Record<string, unknown>) ?? {\n type: 'object',\n properties: {},\n },\n }));\n}\n","import type { Capabilities, Provider, Request, Response, StreamEvent } from '@wrongstack/core';\nimport { ProviderError } from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\n\ntype Response2 = {\n ok: boolean;\n status: number;\n text(): Promise<string>;\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n};\n\n/** Validate fetchImpl response has required fields; normalize missing body to null. */\nfunction validateResponse(res: unknown): asserts res is Response2 {\n const r = res as Record<string, unknown> | undefined;\n if (r === undefined || typeof r.ok !== 'boolean' || typeof r.status !== 'number') {\n throw new Error('fetchImpl returned invalid response shape — expected { ok, status, text, body }');\n }\n // If body is absent, null, or undefined on a plain object (not a native Response\n // with a read-only getter), normalize it to null so callers can safely use it.\n // Native Response objects always have a body getter — no mutation needed.\n if (!('body' in r) || r.body === undefined) {\n // Only set on plain objects — native Response.body is read-only\n const proto = Object.getPrototypeOf(r);\n if (proto === Object.prototype || proto === null) {\n r.body = null;\n }\n }\n}\n\nasync function safeText(res: Response2): Promise<string> {\n try {\n return await res.text();\n } catch {\n return '';\n }\n}\n\n/**\n * Shared HTTP mechanics for streaming providers.\n * Providers extend this to get:\n * - canonical error handling (ProviderError with retryable flag)\n * - SSE body parsing via parseSSE()\n * - abort signal wiring\n *\n * Subclasses implement the abstract members to provide their specific wire format.\n */\nexport abstract class WireAdapter implements Provider {\n abstract readonly id: string;\n abstract readonly capabilities: Capabilities;\n\n constructor(\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n public readonly fetchImpl: typeof fetch = fetch,\n ) {\n if (!apiKey) throw new Error(`${this.constructor.name}: apiKey required`);\n }\n\n async complete(req: Request, opts: { signal: AbortSignal }): Promise<Response> {\n const { aggregateStream } = await import('./aggregate.js');\n return aggregateStream(this.stream(req, opts));\n }\n\n async *stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent> {\n const url = this.buildUrl(req);\n const headers = this.buildHeaders(req);\n const body = this.buildBody(req);\n\n let httpRes: Response2;\n try {\n const raw = await this.fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: opts.signal,\n });\n validateResponse(raw);\n httpRes = raw as Response2;\n } catch (err) {\n if (opts.signal.aborted) throw err;\n throw new ProviderError(err instanceof Error ? err.message : String(err), 0, true, this.id, {\n cause: err,\n body: { message: err instanceof Error ? err.message : String(err) },\n });\n }\n\n if (!httpRes.ok) {\n const text = await safeText(httpRes);\n throw this.translateError(httpRes.status, text);\n }\n\n yield* this.parseStream(httpRes.body, req.model);\n }\n\n // ─── Abstract / overridable ───────────────────────────────────────────────\n\n /** HTTP endpoint for this provider's chat completions / messages API. */\n protected abstract buildUrl(req: Request): string;\n\n /** Per-request headers. `apiKey` is already in scope — call `super.buildHeaders` first. */\n protected buildHeaders(_req: Request): Record<string, string> {\n return {\n 'content-type': 'application/json',\n accept: 'text/event-stream',\n };\n }\n\n /** Map Request fields to the wire request body. */\n protected abstract buildBody(req: Request): Record<string, unknown>;\n\n /** Translate wire SSE events into canonical StreamEvent[]. */\n protected abstract parseStream(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n fallbackModel: string,\n ): AsyncIterable<StreamEvent>;\n\n /** Build a ProviderError from an HTTP failure response. */\n protected translateError(status: number, body: string): ProviderError {\n return parseProviderHttpError(this.id, status, body);\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { type ProviderError, safeParse } from '@wrongstack/core';\nimport type {\n Capabilities,\n Message,\n Request,\n StopReason,\n StreamEvent,\n Tool,\n Usage,\n} from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { parseSSE } from './sse.js';\nimport { normalizeGemini } from './stop-reason.js';\nimport { WireAdapter } from './wire-adapter.js';\n\n/**\n * Google Gemini wire format (generativelanguage.googleapis.com).\n *\n * Differences vs OpenAI:\n * - Endpoint includes the model in the path: /v1beta/models/{model}:generateContent\n * - Messages → `contents: [{ role: 'user'|'model', parts: [...] }]`\n * - System prompt → `systemInstruction: { parts: [{ text }] }`\n * - Tools → `tools: [{ functionDeclarations: [...] }]`\n * - Tool call → `parts: [{ functionCall: { name, args } }]`\n * - Tool result → `parts: [{ functionResponse: { name, response } }]`\n * - Auth via `?key=` query param or `x-goog-api-key` header\n */\n\nexport interface GoogleProviderOptions {\n apiKey: string;\n baseUrl?: string;\n fetchImpl?: typeof fetch;\n id?: string;\n capabilities?: Partial<Capabilities>;\n}\n\nconst DEFAULT_BASE = 'https://generativelanguage.googleapis.com/v1beta';\n\ninterface GeminiPart {\n text?: string;\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: { name: string; response: { content?: unknown } };\n inlineData?: { mimeType: string; data: string };\n /**\n * Gemini's signed thought blob — present on functionCall parts when\n * the model is using thinking. Must be echoed back verbatim on the\n * next request, otherwise the API rejects with:\n * 400 \"Function call is missing a thought_signature in functionCall\n * parts. This is required for tools to work correctly\".\n */\n thoughtSignature?: string;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model' | 'function';\n parts: GeminiPart[];\n}\n\ninterface GeminiCandidate {\n content?: GeminiContent;\n finishReason?: string;\n}\n\nexport class GoogleProvider extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n private readonly opts: GoogleProviderOptions;\n\n constructor(opts: GoogleProviderOptions) {\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl);\n this.opts = opts;\n this.id = opts.id ?? 'google';\n this.capabilities = capabilitiesForFamily('google', {\n ...opts.capabilities,\n });\n }\n\n protected override buildUrl(req: Request): string {\n return `${this.baseUrl}/models/${encodeURIComponent(req.model)}:streamGenerateContent?alt=sse`;\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n 'x-goog-api-key': this.apiKey,\n };\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body: Record<string, unknown> = {\n contents: messagesToGemini(req.messages),\n generationConfig: this.buildGenConfig(req),\n };\n if (req.system && req.system.length > 0) {\n body['systemInstruction'] = {\n parts: req.system.map((b) => ({ text: b.text })),\n };\n }\n if (req.tools && req.tools.length > 0) {\n body['tools'] = [{ functionDeclarations: toolsToGemini(req.tools) }];\n }\n return body;\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return parseGoogleStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, text: string): ProviderError {\n return parseProviderHttpError(this.id, status, text);\n }\n\n private buildGenConfig(req: Request): Record<string, unknown> {\n const cfg: Record<string, unknown> = { maxOutputTokens: req.maxTokens };\n if (req.temperature !== undefined) cfg['temperature'] = req.temperature;\n if (req.topP !== undefined) cfg['topP'] = req.topP;\n if (req.stopSequences) cfg['stopSequences'] = req.stopSequences;\n return cfg;\n }\n}\n\nfunction toolsToGemini(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: sanitizeSchemaForGemini(t.inputSchema as Record<string, unknown> | undefined) ?? {\n type: 'object',\n properties: {},\n },\n }));\n}\n\n/**\n * Gemini's function-declaration `parameters` field accepts an OpenAPI 3.0\n * Schema subset — a strict superset of \"JSON Schema minus a bunch of\n * keywords\". Sending the raw JSON Schema (which Zod/JSON-Schema converters\n * happily emit with `additionalProperties`, `$schema`, etc.) makes the API\n * fail with `Unknown name \"additionalProperties\"` and friends. Walk the\n * schema and keep only what Gemini understands.\n *\n * Spec reference (OpenAPI 3.0 Schema Object → Gemini): supported keywords\n * are type, format, description, nullable, enum, items, properties,\n * required, anyOf, minLength/maxLength, pattern, minimum/maximum,\n * minItems/maxItems, minProperties/maxProperties, propertyOrdering.\n * Anything else — additionalProperties, $schema, $ref, definitions,\n * default, examples, const, allOf, oneOf, not, dependencies, if/then/else\n * — gets dropped silently.\n */\nconst GEMINI_ALLOWED_KEYS = new Set([\n 'type',\n 'format',\n 'description',\n 'nullable',\n 'enum',\n 'items',\n 'properties',\n 'required',\n 'anyOf',\n 'minLength',\n 'maxLength',\n 'pattern',\n 'minimum',\n 'maximum',\n 'minItems',\n 'maxItems',\n 'minProperties',\n 'maxProperties',\n 'propertyOrdering',\n 'title',\n]);\n\nfunction sanitizeSchemaForGemini(node: unknown): Record<string, unknown> | undefined {\n if (node === null || node === undefined) return undefined;\n if (Array.isArray(node)) {\n // Used only for `enum` / `required` / `anyOf` arrays — handled per-key\n // below. Bare arrays here would be malformed schemas, drop.\n return undefined;\n }\n if (typeof node !== 'object') return undefined;\n const src = node as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!GEMINI_ALLOWED_KEYS.has(k)) continue;\n if (k === 'properties' && v && typeof v === 'object') {\n const props: Record<string, unknown> = {};\n for (const [pname, pschema] of Object.entries(v as Record<string, unknown>)) {\n const cleaned = sanitizeSchemaForGemini(pschema);\n if (cleaned) props[pname] = cleaned;\n }\n out['properties'] = props;\n } else if (k === 'items') {\n const cleaned = sanitizeSchemaForGemini(v);\n if (cleaned) out['items'] = cleaned;\n } else if (k === 'anyOf' && Array.isArray(v)) {\n const cleaned = v\n .map((s) => sanitizeSchemaForGemini(s))\n .filter((s): s is Record<string, unknown> => s !== undefined);\n if (cleaned.length > 0) out['anyOf'] = cleaned;\n } else if (k === 'required' && Array.isArray(v)) {\n out['required'] = v.filter((s) => typeof s === 'string');\n } else if (k === 'enum' && Array.isArray(v)) {\n out['enum'] = v;\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction messagesToGemini(messages: Message[]): GeminiContent[] {\n const out: GeminiContent[] = [];\n for (const m of messages) {\n if (m.role === 'system') continue;\n const blocks =\n typeof m.content === 'string' ? [{ type: 'text' as const, text: m.content }] : m.content;\n if (m.role === 'assistant') {\n const parts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) parts.push({ text: b.text });\n else if (b.type === 'tool_use') {\n const part: GeminiPart = {\n functionCall: { name: b.name, args: b.input },\n };\n // Echo the thought_signature back on every assistant tool_use\n // part — Gemini's thinking models REQUIRE it on the next turn\n // or the API returns 400. The value is opaque; we just round-trip.\n const sig = b.providerMeta?.['google.thoughtSignature'];\n if (typeof sig === 'string' && sig.length > 0) {\n part.thoughtSignature = sig;\n }\n parts.push(part);\n }\n }\n if (parts.length > 0) out.push({ role: 'model', parts });\n continue;\n }\n const textParts: GeminiPart[] = [];\n const functionParts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) textParts.push({ text: b.text });\n else if (b.type === 'tool_result') {\n const responseText = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n // Prefer tool_use_id for blocks that were manually constructed\n // (e.g. in tests); fall back to 'unknown' to prevent serialization\n // of `undefined` as the function name.\n const fnName = b.tool_use_id ?? 'unknown';\n functionParts.push({\n functionResponse: {\n name: fnName,\n response: { content: responseText },\n },\n });\n } else if (b.type === 'image' && b.source.type === 'base64') {\n textParts.push({\n inlineData: {\n mimeType: b.source.media_type ?? 'image/png',\n data: b.source.data ?? '',\n },\n });\n }\n }\n const userParts: GeminiPart[] = [...textParts];\n // Include function responses as parts of the user turn — Gemini's API\n // accepts functionResponse blocks inline with text in a single user role.\n // This handles the case where a user message consists only of tool_result\n // blocks (no text): without this, the turn is silently dropped.\n if (functionParts.length > 0) userParts.push(...functionParts);\n if (userParts.length > 0) out.push({ role: 'user', parts: userParts });\n }\n return out;\n}\n\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n\n/**\n * Translate Gemini's `:streamGenerateContent?alt=sse` wire format into\n * canonical StreamEvent[]. Each chunk is a full `data: <json>` line with\n * `candidates[0].content.parts` containing either text or complete\n * functionCall objects — Gemini does not stream partial JSON for tool\n * arguments, so we emit tool_use_start + tool_use_stop together.\n */\nasync function* parseGoogleStream(\n body: Response2Body,\n fallbackModel: string,\n): AsyncIterable<StreamEvent> {\n let model = fallbackModel;\n let usage: Usage = { input: 0, output: 0 };\n let stopReason: StopReason = 'end_turn';\n let started = false;\n // Gemini does not have a `tool_use`/`tool_calls` finish reason — turns\n // that contain functionCall parts come back with `finishReason: \"STOP\"`,\n // which normalizes to `end_turn` and would otherwise make the agent\n // loop exit instead of executing the tool. Track whether we saw any\n // function call so we can force-override the stop reason at message_stop.\n let sawFunctionCall = false;\n\n for await (const msg of parseSSE(body)) {\n if (!msg.data || msg.data === '[DONE]') continue;\n const parsed = safeParse<{\n modelVersion?: string;\n candidates?: GeminiCandidate[];\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n cachedContentTokenCount?: number;\n };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) continue;\n const obj = parsed.value;\n\n if (obj.modelVersion) model = obj.modelVersion;\n if (!started) {\n started = true;\n yield { type: 'message_start', model };\n }\n\n const candidate = obj.candidates?.[0];\n for (const part of candidate?.content?.parts ?? []) {\n if (typeof part.text === 'string' && part.text.length > 0) {\n yield { type: 'text_delta', text: part.text };\n } else if (part.functionCall) {\n sawFunctionCall = true;\n const id = randomUUID();\n yield { type: 'tool_use_start', id, name: part.functionCall.name };\n // Stash the opaque thought_signature so it can be echoed back on\n // the next request. Without this the Gemini API rejects with 400\n // \"Function call is missing a thought_signature in functionCall\n // parts\" on thinking models.\n const providerMeta =\n typeof part.thoughtSignature === 'string'\n ? { 'google.thoughtSignature': part.thoughtSignature }\n : undefined;\n yield {\n type: 'tool_use_stop',\n id,\n input: part.functionCall.args ?? {},\n ...(providerMeta ? { providerMeta } : {}),\n };\n }\n }\n\n if (candidate?.finishReason) {\n stopReason = normalizeGemini(candidate.finishReason);\n }\n\n const u = obj.usageMetadata;\n if (u) {\n // Disjoint semantics — see openai.ts for rationale. Gemini reports\n // `promptTokenCount` as the TOTAL (including cached) and\n // `cachedContentTokenCount` as the cached subset; subtracting keeps\n // cost / hit-ratio math correct.\n const cached = u.cachedContentTokenCount ?? 0;\n const promptTotal = u.promptTokenCount ?? usage.input + cached;\n usage = {\n input: Math.max(0, promptTotal - cached),\n output: u.candidatesTokenCount ?? usage.output,\n cacheRead: cached || usage.cacheRead,\n };\n }\n }\n\n if (started) {\n // Force `tool_use` when we saw any functionCall part — Gemini reports\n // `finishReason: \"STOP\"` for tool-call turns, which would otherwise\n // become `end_turn` and short-circuit the agent loop.\n const finalStop: StopReason = sawFunctionCall ? 'tool_use' : stopReason;\n yield { type: 'message_stop', stopReason: finalStop, usage };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Capabilities, Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { type ProviderError, safeParse } from '@wrongstack/core';\nimport { parseToolInput } from './_tool-input.js';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { parseSSE } from './sse.js';\nimport { normalizeOpenAI } from './stop-reason.js';\nimport { type ConvertOptions, messagesToOpenAI, toolsToOpenAI } from './tool-format/to-openai.js';\nimport { WireAdapter } from './wire-adapter.js';\n\nexport interface OpenAIProviderOptions {\n apiKey: string;\n baseUrl?: string;\n organization?: string;\n fetchImpl?: typeof fetch;\n quirks?: ConvertOptions & {\n parallelToolsDisabled?: boolean;\n jsonArgumentsBuggy?: boolean;\n };\n id?: string;\n capabilities?: Partial<Capabilities>;\n}\n\nconst DEFAULT_BASE = 'https://api.openai.com/v1';\n\nexport class OpenAIProvider extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n protected readonly opts: OpenAIProviderOptions;\n\n constructor(opts: OpenAIProviderOptions) {\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl);\n this.opts = opts;\n this.id = opts.id ?? 'openai';\n this.capabilities = capabilitiesForFamily('openai', {\n parallelTools: !opts.quirks?.parallelToolsDisabled,\n systemPrompt: !opts.quirks?.systemAsMessage,\n ...opts.capabilities,\n });\n }\n\n protected override buildUrl(_req: Request): string {\n const base = this.baseUrl.replace(/\\/+$/, '');\n if (/\\/chat\\/completions$/.test(base)) return base;\n if (/\\/v\\d+(\\/[a-z0-9_-]+)*$/i.test(base)) return `${base}/chat/completions`;\n return `${base}/v1/chat/completions`;\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n const headers: Record<string, string> = {\n ...super.buildHeaders(req),\n authorization: `Bearer ${this.apiKey}`,\n };\n if (this.opts.organization) {\n headers['openai-organization'] = this.opts.organization;\n }\n return headers;\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(this.stripCacheControl(req), req.messages, {\n ...this.opts.quirks,\n }),\n max_tokens: req.maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return parseOpenAIStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, text: string): ProviderError {\n return parseProviderHttpError(this.id, status, text);\n }\n\n private stripCacheControl(req: Request): typeof req.system {\n if (!req.system) return undefined;\n return req.system.map((b) => {\n // Omit cache_control without mutating a copy — rest spread is cleaner.\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n }\n}\n\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n\n/**\n * Translate an OpenAI /chat/completions SSE stream into canonical StreamEvent[].\n *\n * Wire format per chunk:\n * data: {\"id\":\"...\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"hi\"},\"finish_reason\":null}]}\n * data: {\"id\":\"...\",\"choices\":[{\"index\":0,\"delta\":{\"tool_calls\":[\n * {\"index\":0,\"id\":\"call_x\",\"function\":{\"name\":\"echo\",\"arguments\":\"{\\\"text\\\":\"}}]},\"finish_reason\":null}]}\n * data: {\"id\":\"...\",\"choices\":[{...,\"finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":12,...}}\n * data: [DONE]\n *\n * Tool calls stream as a sequence of partial fragments keyed by their\n * `index` in the delta array; we map index → canonical tool_use id from\n * the first chunk that carries one.\n */\nasync function* parseOpenAIStream(\n body: Response2Body,\n fallbackModel: string,\n): AsyncIterable<StreamEvent> {\n let model = fallbackModel;\n let usage: Usage = { input: 0, output: 0 };\n let stopReason: StopReason = 'end_turn';\n let started = false;\n let textOpen = false;\n let thinkingOpen = false;\n const toolByIndex = new Map<\n number,\n { id?: string; name?: string; argBuf: string; emittedStart: boolean; emittedArgLength: number }\n >();\n\n for await (const msg of parseSSE(body)) {\n if (!msg.data || msg.data === '[DONE]') continue;\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) continue;\n const obj = parsed.value;\n\n if (typeof obj['model'] === 'string') model = obj['model'];\n if (!started) {\n started = true;\n yield { type: 'message_start', model };\n }\n\n const choices = obj['choices'] as\n | Array<{\n delta?: {\n content?: string | null;\n reasoning_content?: string;\n reasoning?: string;\n tool_calls?: Array<{\n index?: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>\n | undefined;\n const choice = choices?.[0];\n\n // DeepSeek (and Moonshot/Kimi thinking mode) stream chain-of-thought\n // as `delta.reasoning_content` at the top of the delta. The full blob\n // MUST be echoed back as message-level `reasoning_content` on the\n // next request — otherwise DeepSeek 400s with \"reasoning_content in\n // the thinking mode must be passed back to the API\".\n // OpenRouter sometimes uses `delta.reasoning` for the same field.\n const reasoningDelta =\n typeof choice?.delta?.reasoning_content === 'string'\n ? choice.delta.reasoning_content\n : typeof choice?.delta?.reasoning === 'string'\n ? choice.delta.reasoning\n : undefined;\n if (reasoningDelta && reasoningDelta.length > 0) {\n if (!thinkingOpen) {\n thinkingOpen = true;\n yield { type: 'thinking_start' };\n }\n yield { type: 'thinking_delta', text: reasoningDelta };\n }\n\n if (choice?.delta?.content) {\n if (thinkingOpen) {\n thinkingOpen = false;\n yield { type: 'thinking_stop' };\n }\n if (!textOpen) textOpen = true;\n yield { type: 'text_delta', text: choice.delta.content };\n }\n\n if (choice?.delta?.tool_calls) {\n if (thinkingOpen) {\n thinkingOpen = false;\n yield { type: 'thinking_stop' };\n }\n for (const tc of choice.delta.tool_calls) {\n const idx = tc.index ?? 0;\n let entry = toolByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id,\n name: tc.function?.name,\n argBuf: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n toolByIndex.set(idx, entry);\n } else {\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name && !entry.name) entry.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n entry.argBuf += tc.function.arguments;\n }\n if (!entry.emittedStart && entry.id && entry.name) {\n entry.emittedStart = true;\n textOpen = false;\n yield { type: 'tool_use_start', id: entry.id, name: entry.name };\n }\n if (entry.emittedStart && entry.id && entry.emittedArgLength < entry.argBuf.length) {\n const partial = entry.argBuf.slice(entry.emittedArgLength);\n entry.emittedArgLength = entry.argBuf.length;\n yield {\n type: 'tool_use_input_delta',\n id: entry.id,\n partial,\n };\n }\n }\n }\n\n if (choice?.finish_reason) {\n stopReason = normalizeOpenAI(choice.finish_reason);\n }\n\n const u = obj['usage'] as\n | {\n prompt_tokens?: number;\n input_tokens?: number;\n completion_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n prompt_cache_hit_tokens?: number;\n prompt_cache_miss_tokens?: number;\n }\n | undefined;\n if (u) {\n // Normalize to disjoint semantics: `input` is fresh-only (priced at\n // the full rate), `cacheRead` is the cached subset (priced at the\n // cache rate). OpenAI returns `prompt_tokens_details.cached_tokens`;\n // DeepSeek returns `prompt_cache_hit_tokens`/`prompt_cache_miss_tokens`.\n const hasDeepSeekCacheFields =\n u.prompt_cache_hit_tokens !== undefined || u.prompt_cache_miss_tokens !== undefined;\n const cached = u.prompt_tokens_details?.cached_tokens ?? u.prompt_cache_hit_tokens ?? 0;\n const promptTotal =\n u.prompt_tokens ?? u.input_tokens ??\n (hasDeepSeekCacheFields\n ? (u.prompt_cache_hit_tokens ?? 0) + (u.prompt_cache_miss_tokens ?? 0)\n : usage.input + cached);\n usage = {\n input: u.prompt_cache_miss_tokens ?? Math.max(0, promptTotal - cached),\n output: u.completion_tokens ?? usage.output,\n cacheRead: cached || usage.cacheRead,\n };\n }\n }\n\n if (thinkingOpen) {\n yield { type: 'thinking_stop' };\n }\n for (const entry of toolByIndex.values()) {\n // A tool call with no name is unusable — there's nothing to dispatch to.\n if (!entry.name) continue;\n // Some OpenAI-compatible servers (proxies, local runtimes) omit the\n // `id` field on streamed tool calls entirely. Dropping the call here\n // would silently swallow the model's action; synthesize a stable id so\n // it still dispatches and correlates with its tool_result. Mirrors the\n // Google adapter, which always assigns an id.\n if (!entry.id) entry.id = `call_${randomUUID()}`;\n if (!entry.emittedStart) {\n yield { type: 'tool_use_start', id: entry.id, name: entry.name };\n }\n const input = parseToolInput(entry.argBuf);\n yield { type: 'tool_use_stop', id: entry.id, input };\n }\n if (started) {\n yield { type: 'message_stop', stopReason, usage };\n }\n}\n","import type {\n ContentBlock,\n Message,\n TextBlock,\n ThinkingBlock,\n Tool,\n ToolResultBlock,\n ToolUseBlock,\n} from '@wrongstack/core';\n\nexport interface OpenAIToolSchema {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}\n\nexport function toolsToOpenAI(tools: Tool[]): OpenAIToolSchema[] {\n return tools.map((t) => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: (t.inputSchema as Record<string, unknown>) ?? {\n type: 'object',\n properties: {},\n },\n },\n }));\n}\n\nexport interface OpenAIMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content?: string | OpenAIContent[];\n tool_calls?: OpenAIToolCall[];\n tool_call_id?: string;\n name?: string;\n /**\n * DeepSeek (and other OpenAI-compatible thinking-mode models) require the\n * previous assistant's chain-of-thought to be echoed back on the next\n * request as a top-level `reasoning_content` field on the assistant\n * message — NOT inside individual tool_calls. Without it DeepSeek\n * returns 400 \"reasoning_content in the thinking mode must be passed\n * back to the API\". Vanilla OpenAI ignores this field, so emitting it\n * unconditionally is safe.\n */\n reasoning_content?: string;\n}\n\nexport interface OpenAIContent {\n type: 'text' | 'image_url';\n text?: string;\n image_url?: { url: string };\n}\n\nexport interface OpenAIToolCall {\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n}\n\nexport interface ConvertOptions {\n flattenContentToString?: boolean;\n stripCacheControl?: boolean;\n systemAsMessage?: boolean;\n emptyToolCallContent?: 'null' | 'empty_string';\n}\n\nexport function messagesToOpenAI(\n system: TextBlock[] | undefined,\n messages: Message[],\n opts: ConvertOptions = {},\n): OpenAIMessage[] {\n const out: OpenAIMessage[] = [];\n\n if (system && system.length > 0) {\n const sysText = system.map((b) => b.text).join('\\n\\n');\n if (opts.systemAsMessage) {\n out.push({ role: 'user', content: sysText });\n } else {\n out.push({ role: 'system', content: sysText });\n }\n }\n\n for (const msg of messages) {\n if (msg.role === 'user') {\n const blocks = normalizeContent(msg.content);\n const toolResults = blocks.filter((b): b is ToolResultBlock => b.type === 'tool_result');\n const others = blocks.filter((b) => b.type !== 'tool_result');\n\n if (others.length > 0) {\n out.push({\n role: 'user',\n content: opts.flattenContentToString\n ? blocksToString(others)\n : blocksToContentArray(others),\n });\n }\n for (const r of toolResults) {\n const content = typeof r.content === 'string' ? r.content : JSON.stringify(r.content);\n out.push({\n role: 'tool',\n tool_call_id: r.tool_use_id,\n content,\n });\n }\n } else if (msg.role === 'assistant') {\n const blocks = normalizeContent(msg.content);\n const textBlocks = blocks.filter((b): b is TextBlock => b.type === 'text');\n const toolUses = blocks.filter((b): b is ToolUseBlock => b.type === 'tool_use');\n const thinkingBlocks = blocks.filter((b): b is ThinkingBlock => b.type === 'thinking');\n const text = textBlocks.map((b) => b.text).join('');\n const reasoning = thinkingBlocks\n .map((b) => b.thinking)\n .filter((t) => t && t.length > 0)\n .join('');\n const toolCalls: OpenAIToolCall[] = toolUses.map((u) => ({\n id: u.id,\n type: 'function',\n function: { name: u.name, arguments: JSON.stringify(u.input) },\n }));\n\n const message: OpenAIMessage = { role: 'assistant' };\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n if (text) {\n message.content = text;\n } else if (opts.emptyToolCallContent === 'empty_string') {\n message.content = '';\n }\n } else {\n message.content = text;\n }\n // DeepSeek thinking mode requires the prior assistant's reasoning\n // blob to round-trip on the next request. Vanilla OpenAI silently\n // accepts and ignores the field, so emitting it unconditionally is\n // safe across the OpenAI-compatible ecosystem.\n if (reasoning.length > 0) {\n message.reasoning_content = reasoning;\n }\n out.push(message);\n }\n }\n return out;\n}\n\nfunction normalizeContent(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nfunction blocksToString(blocks: ContentBlock[]): string {\n return blocks\n .map((b) => {\n if (b.type === 'text') return b.text;\n if (b.type === 'image') return '[image]';\n return '';\n })\n .join('');\n}\n\nfunction blocksToContentArray(blocks: ContentBlock[]): OpenAIContent[] | string {\n const hasImage = blocks.some((b) => b.type === 'image');\n if (!hasImage) {\n return blocks\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('');\n }\n return blocks\n .map((b): OpenAIContent | null => {\n if (b.type === 'text') return { type: 'text', text: b.text };\n if (b.type === 'image') {\n const url =\n b.source.type === 'url'\n ? (b.source.url ?? '')\n : `data:${b.source.media_type ?? 'image/png'};base64,${b.source.data ?? ''}`;\n return { type: 'image_url', image_url: { url } };\n }\n return null;\n })\n .filter((c): c is OpenAIContent => c !== null);\n}\n","import type { Request } from '@wrongstack/core';\nimport type { Capabilities } from '@wrongstack/core';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { OpenAIProvider, type OpenAIProviderOptions } from './openai.js';\n\nexport interface CompatibilityQuirks {\n stripCacheControl?: boolean;\n systemAsMessage?: boolean;\n flattenContentToString?: boolean;\n preserveToolCallIds?: boolean;\n parallelToolsDisabled?: boolean;\n jsonArgumentsBuggy?: boolean;\n emptyToolCallContent?: 'null' | 'empty_string';\n}\n\nexport interface OpenAICompatibleOptions {\n id: string;\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string>;\n quirks?: CompatibilityQuirks;\n capabilities?: Partial<Capabilities>;\n fetchImpl?: typeof fetch;\n /**\n * Optional override for URL construction. Receives the base URL and request,\n * returns the full URL to use. Allows custom providers with non-standard\n * URL structures (e.g. Google with model-in-path, Anthropic with /v1/messages).\n */\n urlOverride?: (baseUrl: string, req: Request) => string;\n}\n\nexport class OpenAICompatibleProvider extends OpenAIProvider {\n private readonly extraHeaders?: Record<string, string>;\n private readonly urlOverride?: (baseUrl: string, req: Request) => string;\n\n constructor(opts: OpenAICompatibleOptions) {\n super({\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl,\n fetchImpl: opts.fetchImpl,\n id: opts.id,\n capabilities: capabilitiesForFamily('openai-compatible', {\n parallelTools: !opts.quirks?.parallelToolsDisabled,\n systemPrompt: !opts.quirks?.systemAsMessage,\n ...opts.capabilities,\n }),\n quirks: opts.quirks,\n });\n this.extraHeaders = opts.headers;\n this.urlOverride = opts.urlOverride;\n }\n\n protected override buildUrl(req: Request): string {\n if (this.urlOverride) {\n return this.urlOverride(this.baseUrl, req);\n }\n return super.buildUrl(req);\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n ...this.extraHeaders,\n };\n }\n}\n","import type {\n Capabilities,\n Provider,\n ProviderFactory,\n Request,\n StreamEvent,\n WireFamily,\n} from '@wrongstack/core';\nimport type { ProviderError } from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { type SSEMessage, parseSSE } from './sse.js';\nimport { WireAdapter } from './wire-adapter.js';\n\n/**\n * Declarative wire-format definition. Sufficient to add a new HTTP+SSE\n * provider without subclassing `WireAdapter` — the boilerplate (HTTP errors,\n * abort wiring, SSE body parsing) is shared.\n *\n * The shape covers the variation that actually matters between providers:\n * - URL template (path, query)\n * - Auth headers (x-api-key, Authorization, etc.)\n * - Request body (field names, system-prompt placement, tool format)\n * - SSE event translation (one wire event → 0+ canonical events)\n *\n * Anything more exotic (non-SSE streams, multipart bodies, OAuth flows) still\n * needs a hand-written subclass — those cases are too varied to template.\n *\n * `S` is provider-internal state threaded across SSE events for one stream:\n * accumulating partial tool-call JSON, tracking block kinds, carrying the\n * model id forward from `message_start`, etc. Each `stream()` call gets a\n * fresh `S` via `createStreamState`.\n */\nexport interface WireFormatConfig<S = Record<string, unknown>> {\n /** Provider id (matches catalog id when the provider is in models.dev). */\n id: string;\n /** Wire family — used by the registry's factory list. */\n family: WireFamily;\n capabilities: Capabilities;\n /** Used when the user doesn't override via config.baseUrl. */\n defaultBaseUrl: string;\n /** Build the HTTPS endpoint. Receives the (possibly user-overridden) base URL. */\n buildUrl(baseUrl: string, req: Request): string;\n /** Per-request headers. Default `content-type`/`accept` are provided already. */\n buildHeaders(apiKey: string, req: Request): Record<string, string>;\n /** Map a canonical Request onto the provider's body shape. */\n buildBody(req: Request): Record<string, unknown>;\n /** Construct fresh per-stream state. Called once per `stream()` call. */\n createStreamState(fallbackModel: string): S;\n /**\n * Translate one SSE event into 0+ canonical events. Mutating `state` is\n * expected — providers carry per-stream accumulators (partial tool JSON,\n * current model id, usage) here.\n */\n parseStreamEvent(msg: SSEMessage, state: S): StreamEvent[];\n /**\n * Optional: yield any final events after the upstream stream closes\n * (e.g. emit a synthetic `message_stop` when the wire format ends with\n * `[DONE]` instead of an explicit terminator).\n */\n finalizeStream?(state: S): StreamEvent[];\n /** Optional override; defaults to the shared HTTP error parser. */\n normalizeError?(status: number, body: string): ProviderError;\n}\n\n/**\n * Concrete Provider built from a declarative config. Extends WireAdapter to\n * inherit the canonical HTTP + abort + error machinery.\n */\nexport class WireFormatProvider<S = Record<string, unknown>> extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n private readonly cfg: WireFormatConfig<S>;\n\n constructor(\n cfg: WireFormatConfig<S>,\n opts: { apiKey: string; baseUrl?: string; fetchImpl?: typeof fetch },\n ) {\n super(opts.apiKey, opts.baseUrl ?? cfg.defaultBaseUrl, opts.fetchImpl);\n this.id = cfg.id;\n this.capabilities = cfg.capabilities;\n this.cfg = cfg;\n }\n\n protected override buildUrl(req: Request): string {\n return this.cfg.buildUrl(this.baseUrl, req);\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n ...this.cfg.buildHeaders(this.apiKey, req),\n };\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n return this.cfg.buildBody(req);\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return this.runStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, body: string): ProviderError {\n return this.cfg.normalizeError\n ? this.cfg.normalizeError(status, body)\n : parseProviderHttpError(this.id, status, body);\n }\n\n private async *runStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n const state = this.cfg.createStreamState(fallbackModel);\n for await (const msg of parseSSE(body)) {\n for (const ev of this.cfg.parseStreamEvent(msg, state)) {\n yield ev;\n }\n }\n if (this.cfg.finalizeStream) {\n for (const ev of this.cfg.finalizeStream(state)) {\n yield ev;\n }\n }\n }\n}\n\n/**\n * Identity helper that gives authors type checking on the config literal.\n * Use at module level:\n *\n * export const myProvider = defineWireFormat({\n * id: 'mistral',\n * family: 'openai-compatible',\n * capabilities: { ... },\n * ...\n * });\n */\nexport function defineWireFormat<S = Record<string, unknown>>(\n cfg: WireFormatConfig<S>,\n): WireFormatConfig<S> {\n return cfg;\n}\n\nexport interface WireFactoryOptions {\n /**\n * Optional config-time override of the API key. When omitted, the factory\n * reads `cfg.apiKey` (passed in at create time by the registry / config\n * loader). Setting this here is useful in tests.\n */\n apiKey?: string;\n /** Override the base URL at factory build time. */\n baseUrl?: string;\n}\n\n/**\n * Build a `ProviderFactory` from a declarative wire-format. Plug into\n * `ProviderRegistry.register(...)` or use in `buildProviderFactoriesFromRegistry`\n * for catalog-driven discovery.\n */\nexport function createWireFormatFactory(\n cfg: WireFormatConfig,\n opts: WireFactoryOptions = {},\n): ProviderFactory {\n return {\n type: cfg.id,\n family: cfg.family,\n create: (rawCfg: unknown): Provider => {\n const c = rawCfg as { apiKey?: string; baseUrl?: string };\n const apiKey = opts.apiKey ?? c.apiKey;\n if (!apiKey) {\n throw new Error(`Provider \"${cfg.id}\" requires an apiKey.`);\n }\n return new WireFormatProvider(cfg, {\n apiKey,\n baseUrl: opts.baseUrl ?? c.baseUrl,\n });\n },\n };\n}\n","/**\n * Mistral provider as a declarative wire-format config — a 50-line proof\n * that adding a new OpenAI-flavored provider doesn't require subclassing.\n *\n * Mistral's streaming chat completion API is OpenAI-compatible at the wire\n * level, with `delta.content` + `delta.tool_calls` + `[DONE]` terminator.\n * For exotic providers the same pattern still applies — only the\n * `parseStreamEvent` body changes.\n */\nimport type { Request, StopReason, StreamEvent } from '@wrongstack/core';\nimport { safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { messagesToOpenAI, toolsToOpenAI } from '../tool-format/to-openai.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface MistralStreamState {\n model: string;\n started: boolean;\n // OpenAI-style tool_call accumulators keyed by `index`\n toolCalls: Map<\n number,\n { id?: string; name?: string; partial: string; emittedStart: boolean; emittedArgLength: number }\n >;\n}\n\nexport const mistralWireFormat = defineWireFormat<MistralStreamState>({\n id: 'mistral',\n family: 'openai-compatible',\n capabilities: capabilitiesForFamily('openai-compatible', {\n jsonMode: true,\n maxContext: 128_000,\n }),\n defaultBaseUrl: 'https://api.mistral.ai/v1',\n buildUrl: (base) => `${base.replace(/\\/+$/, '')}/chat/completions`,\n buildHeaders: (apiKey) => ({ authorization: `Bearer ${apiKey}` }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(stripCacheControl(req.system), req.messages, {}),\n max_tokens: req.maxTokens,\n stream: true,\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n started: false,\n toolCalls: new Map(),\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<{\n model?: string;\n choices?: {\n delta?: {\n content?: string;\n tool_calls?: {\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }[];\n };\n finish_reason?: string;\n }[];\n usage?: { prompt_tokens?: number; completion_tokens?: number };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const ev = parsed.value;\n const out: StreamEvent[] = [];\n if (ev.model) state.model = ev.model;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n const choice = ev.choices?.[0];\n if (choice?.delta?.content) {\n out.push({ type: 'text_delta', text: choice.delta.content });\n }\n for (const tc of choice?.delta?.tool_calls ?? []) {\n let block = state.toolCalls.get(tc.index);\n if (!block) {\n block = {\n id: tc.id,\n name: tc.function?.name,\n partial: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n state.toolCalls.set(tc.index, block);\n } else {\n if (tc.id && !block.id) block.id = tc.id;\n if (tc.function?.name && !block.name) block.name = tc.function.name;\n }\n const arg = tc.function?.arguments;\n if (arg) {\n block.partial += arg;\n }\n if (!block.emittedStart && block.id && block.name) {\n block.emittedStart = true;\n out.push({ type: 'tool_use_start', id: block.id, name: block.name });\n }\n if (block.emittedStart && block.id && block.emittedArgLength < block.partial.length) {\n const partial = block.partial.slice(block.emittedArgLength);\n block.emittedArgLength = block.partial.length;\n out.push({ type: 'tool_use_input_delta', id: block.id, partial });\n }\n }\n if (choice?.finish_reason) {\n // Close out tool calls with parsed JSON\n for (const block of state.toolCalls.values()) {\n if (block.id && block.name) {\n if (!block.emittedStart) {\n out.push({ type: 'tool_use_start', id: block.id, name: block.name });\n }\n out.push({\n type: 'tool_use_stop',\n id: block.id,\n input: parseToolInput(block.partial),\n });\n }\n }\n out.push({\n type: 'message_stop',\n stopReason: mapStopReason(choice.finish_reason),\n usage: {\n input: ev.usage?.prompt_tokens ?? 0,\n output: ev.usage?.completion_tokens ?? 0,\n },\n });\n }\n return out;\n },\n});\n\nfunction mapStopReason(reason: string): StopReason {\n switch (reason) {\n case 'tool_calls':\n return 'tool_use';\n case 'length':\n case 'model_length':\n return 'max_tokens';\n case 'stop':\n return 'end_turn';\n default:\n return 'end_turn';\n }\n}\n\nfunction stripCacheControl(system: Request['system']): Request['system'] {\n if (!system) return undefined;\n return system.map((b) => {\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n}\n","/**\n * Anthropic provider expressed as a declarative `WireFormatConfig`.\n *\n * The existing `AnthropicProvider` class stays as the production path until\n * the rest of the registry switches over — both produce the same canonical\n * StreamEvent[]. The per-message logic here is extracted verbatim from\n * `parseAnthropicStream` in `../anthropic.ts`, just split into a stateful\n * `parseStreamEvent` call instead of an async generator loop.\n */\nimport type { Message, Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { ProviderError, safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeAnthropic } from '../stop-reason.js';\nimport { toolsToAnthropic } from '../tool-format/to-anthropic.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ntype BlockKind = 'text' | 'tool_use' | 'thinking' | 'unknown';\n\ninterface AnthropicStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n stopped: boolean;\n blocks: Map<number, { kind: BlockKind; id?: string; name?: string; partial: string }>;\n}\n\nconst DEFAULT_VERSION = '2023-06-01';\n\nexport const anthropicWireFormat = defineWireFormat<AnthropicStreamState>({\n id: 'anthropic',\n family: 'anthropic',\n capabilities: capabilitiesForFamily('anthropic'),\n defaultBaseUrl: 'https://api.anthropic.com',\n buildUrl: (base) => {\n const b = base.replace(/\\/+$/, '');\n if (/\\/v\\d+\\/messages$/.test(b)) return b;\n if (/\\/v\\d+$/.test(b)) return `${b}/messages`;\n return `${b}/v1/messages`;\n },\n buildHeaders: (apiKey) => ({\n 'x-api-key': apiKey,\n 'anthropic-version': DEFAULT_VERSION,\n }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n max_tokens: req.maxTokens,\n messages: req.messages.map((m: Message) => ({\n role: m.role === 'system' ? 'user' : m.role,\n content: m.content,\n })),\n stream: true,\n };\n if (req.system && req.system.length > 0) body['system'] = req.system;\n if (req.tools && req.tools.length > 0) body['tools'] = toolsToAnthropic(req.tools);\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop_sequences'] = req.stopSequences;\n if (req.toolChoice) body['tool_choice'] = req.toolChoice;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n stopped: false,\n blocks: new Map(),\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const ev = parsed.value;\n const type = String(ev['type'] ?? msg.event);\n const out: StreamEvent[] = [];\n\n switch (type) {\n case 'message_start': {\n const message = ev['message'] as\n | {\n model?: string;\n usage?: {\n input_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n }\n | undefined;\n if (message?.model) state.model = message.model;\n state.usage = {\n input: message?.usage?.input_tokens ?? 0,\n output: 0,\n cacheRead: message?.usage?.cache_read_input_tokens,\n cacheWrite: message?.usage?.cache_creation_input_tokens,\n };\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n break;\n }\n case 'content_block_start': {\n const index = Number(ev['index'] ?? 0);\n const cb = ev['content_block'] as { type?: string; id?: string; name?: string } | undefined;\n if (cb?.type === 'tool_use') {\n state.blocks.set(index, { kind: 'tool_use', id: cb.id, name: cb.name, partial: '' });\n if (cb.id && cb.name) {\n out.push({ type: 'tool_use_start', id: cb.id, name: cb.name });\n }\n } else if (cb?.type === 'text') {\n state.blocks.set(index, { kind: 'text', partial: '' });\n } else if (cb?.type === 'thinking' || cb?.type === 'redacted_thinking') {\n state.blocks.set(index, { kind: 'thinking', partial: '' });\n out.push({ type: 'thinking_start' });\n } else {\n state.blocks.set(index, { kind: 'unknown', partial: '' });\n }\n break;\n }\n case 'content_block_delta': {\n const index = Number(ev['index'] ?? 0);\n const delta = ev['delta'] as\n | {\n type?: string;\n text?: string;\n partial_json?: string;\n thinking?: string;\n signature?: string;\n }\n | undefined;\n const block = state.blocks.get(index);\n if (!block || !delta) break;\n if (delta.type === 'text_delta' && typeof delta.text === 'string') {\n out.push({ type: 'text_delta', text: delta.text });\n } else if (delta.type === 'input_json_delta' && typeof delta.partial_json === 'string') {\n if (block.id) {\n block.partial += delta.partial_json;\n out.push({ type: 'tool_use_input_delta', id: block.id, partial: delta.partial_json });\n }\n } else if (delta.type === 'thinking_delta' && typeof delta.thinking === 'string') {\n out.push({ type: 'thinking_delta', text: delta.thinking });\n } else if (delta.type === 'signature_delta' && typeof delta.signature === 'string') {\n out.push({ type: 'thinking_signature', signature: delta.signature });\n }\n break;\n }\n case 'content_block_stop': {\n const index = Number(ev['index'] ?? 0);\n const block = state.blocks.get(index);\n if (block?.kind === 'tool_use' && block.id) {\n const input = parseToolInput(block.partial);\n out.push({ type: 'tool_use_stop', id: block.id, input });\n } else if (block?.kind === 'thinking') {\n out.push({ type: 'thinking_stop' });\n }\n break;\n }\n case 'message_delta': {\n const delta = ev['delta'] as { stop_reason?: string | null } | undefined;\n const u = ev['usage'] as { output_tokens?: number } | undefined;\n if (delta?.stop_reason !== undefined) {\n state.stopReason = normalizeAnthropic(delta.stop_reason);\n }\n if (u?.output_tokens !== undefined) {\n state.usage = { ...state.usage, output: u.output_tokens };\n }\n break;\n }\n case 'message_stop':\n state.stopped = true;\n out.push({ type: 'message_stop', stopReason: state.stopReason, usage: state.usage });\n break;\n case 'error': {\n const err = ev['error'] as { message?: string; type?: string } | undefined;\n throw new ProviderError(err?.message ?? 'Anthropic stream error', 0, false, 'anthropic', {\n body: { type: err?.type, message: err?.message },\n });\n }\n }\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n // If upstream closed without an explicit `message_stop` we synthesize\n // one so the consumer's stream-end logic still fires.\n if (state.started && !state.stopped) {\n return [{ type: 'message_stop', stopReason: state.stopReason, usage: state.usage }];\n }\n return [];\n },\n});\n","/**\n * OpenAI provider as a declarative `WireFormatConfig`. Same canonical events\n * as `OpenAIProvider`; the per-message body is the loop body of\n * `parseOpenAIStream` split into a stateful step.\n */\nimport type { Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeOpenAI } from '../stop-reason.js';\nimport { messagesToOpenAI, toolsToOpenAI } from '../tool-format/to-openai.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface OpenAIStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n textOpen: boolean;\n thinkingOpen: boolean;\n toolByIndex: Map<\n number,\n { id?: string; name?: string; argBuf: string; emittedStart: boolean; emittedArgLength: number }\n >;\n finalEmitted: boolean;\n}\n\nexport const openaiWireFormat = defineWireFormat<OpenAIStreamState>({\n id: 'openai',\n family: 'openai',\n capabilities: capabilitiesForFamily('openai'),\n defaultBaseUrl: 'https://api.openai.com/v1',\n buildUrl: (base) => {\n const b = base.replace(/\\/+$/, '');\n if (/\\/chat\\/completions$/.test(b)) return b;\n if (/\\/v\\d+(\\/[a-z0-9_-]+)*$/i.test(b)) return `${b}/chat/completions`;\n return `${b}/v1/chat/completions`;\n },\n buildHeaders: (apiKey) => ({ authorization: `Bearer ${apiKey}` }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(stripCacheControl(req.system), req.messages, {}),\n max_tokens: req.maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n textOpen: false,\n thinkingOpen: false,\n toolByIndex: new Map(),\n finalEmitted: false,\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const obj = parsed.value;\n const out: StreamEvent[] = [];\n\n if (typeof obj['model'] === 'string') state.model = obj['model'] as string;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n\n const choices = obj['choices'] as\n | Array<{\n delta?: {\n content?: string | null;\n reasoning_content?: string;\n reasoning?: string;\n tool_calls?: Array<{\n index?: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>\n | undefined;\n const choice = choices?.[0];\n\n // DeepSeek (and Moonshot/Kimi thinking mode, OpenRouter `reasoning`)\n // streams chain-of-thought as `delta.reasoning_content` at the top of\n // the delta. The full blob MUST be echoed back as message-level\n // `reasoning_content` on the next request — otherwise DeepSeek 400s.\n const reasoningDelta =\n typeof choice?.delta?.reasoning_content === 'string'\n ? choice.delta.reasoning_content\n : typeof choice?.delta?.reasoning === 'string'\n ? choice.delta.reasoning\n : undefined;\n if (reasoningDelta && reasoningDelta.length > 0) {\n if (!state.thinkingOpen) {\n state.thinkingOpen = true;\n out.push({ type: 'thinking_start' });\n }\n out.push({ type: 'thinking_delta', text: reasoningDelta });\n }\n\n if (choice?.delta?.content) {\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n if (!state.textOpen) state.textOpen = true;\n out.push({ type: 'text_delta', text: choice.delta.content });\n }\n\n if (choice?.delta?.tool_calls) {\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n for (const tc of choice.delta.tool_calls) {\n const idx = tc.index ?? 0;\n let entry = state.toolByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id,\n name: tc.function?.name,\n argBuf: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n state.toolByIndex.set(idx, entry);\n } else {\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name && !entry.name) entry.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n entry.argBuf += tc.function.arguments;\n }\n if (!entry.emittedStart && entry.id && entry.name) {\n entry.emittedStart = true;\n state.textOpen = false;\n out.push({ type: 'tool_use_start', id: entry.id, name: entry.name });\n }\n if (entry.emittedStart && entry.id && entry.emittedArgLength < entry.argBuf.length) {\n const partial = entry.argBuf.slice(entry.emittedArgLength);\n entry.emittedArgLength = entry.argBuf.length;\n out.push({\n type: 'tool_use_input_delta',\n id: entry.id,\n partial,\n });\n }\n }\n }\n\n if (choice?.finish_reason) {\n state.stopReason = normalizeOpenAI(choice.finish_reason);\n }\n\n const u = obj['usage'] as\n | {\n prompt_tokens?: number;\n completion_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n prompt_cache_hit_tokens?: number;\n prompt_cache_miss_tokens?: number;\n }\n | undefined;\n if (u) {\n // Mirror openai.ts: disjoint semantics: input is fresh-only,\n // cacheRead is the cached subset. Subtracting prevents the cost\n // calc / cache-hit-ratio from double-counting cached tokens.\n const hasDeepSeekCacheFields =\n u.prompt_cache_hit_tokens !== undefined || u.prompt_cache_miss_tokens !== undefined;\n const cached = u.prompt_tokens_details?.cached_tokens ?? u.prompt_cache_hit_tokens ?? 0;\n const promptTotal =\n u.prompt_tokens ??\n (hasDeepSeekCacheFields\n ? (u.prompt_cache_hit_tokens ?? 0) + (u.prompt_cache_miss_tokens ?? 0)\n : state.usage.input + cached);\n state.usage = {\n input: u.prompt_cache_miss_tokens ?? Math.max(0, promptTotal - cached),\n output: u.completion_tokens ?? state.usage.output,\n cacheRead: cached || state.usage.cacheRead,\n };\n }\n\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n if (state.finalEmitted) return [];\n state.finalEmitted = true;\n const out: StreamEvent[] = [];\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n for (const entry of state.toolByIndex.values()) {\n if (!entry.id || !entry.name) continue;\n if (!entry.emittedStart) {\n out.push({ type: 'tool_use_start', id: entry.id, name: entry.name });\n }\n const input = parseToolInput(entry.argBuf);\n out.push({ type: 'tool_use_stop', id: entry.id, input });\n }\n if (state.started) {\n out.push({ type: 'message_stop', stopReason: state.stopReason, usage: state.usage });\n }\n return out;\n },\n});\n\nfunction stripCacheControl(system: Request['system']): Request['system'] {\n if (!system) return undefined;\n return system.map((b) => {\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n}\n","import { randomUUID } from 'node:crypto';\n/**\n * Google Gemini provider as a declarative `WireFormatConfig`. Matches the\n * `GoogleProvider` class behavior — same canonical events, same handling\n * of `thoughtSignature` and forced `tool_use` stop reason on functionCall\n * turns.\n */\nimport type { Message, Request, StopReason, StreamEvent, Tool, Usage } from '@wrongstack/core';\nimport { safeParse } from '@wrongstack/core';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeGemini } from '../stop-reason.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface GeminiPart {\n text?: string;\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: { name: string; response: { content?: unknown } };\n inlineData?: { mimeType: string; data: string };\n thoughtSignature?: string;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model' | 'function';\n parts: GeminiPart[];\n}\n\ninterface GeminiCandidate {\n content?: GeminiContent;\n finishReason?: string;\n}\n\ninterface GoogleStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n sawFunctionCall: boolean;\n finalEmitted: boolean;\n}\n\nexport const googleWireFormat = defineWireFormat<GoogleStreamState>({\n id: 'google',\n family: 'google',\n capabilities: capabilitiesForFamily('google'),\n defaultBaseUrl: 'https://generativelanguage.googleapis.com/v1beta',\n buildUrl: (base, req) =>\n `${base}/models/${encodeURIComponent(req.model)}:streamGenerateContent?alt=sse`,\n buildHeaders: (apiKey) => ({ 'x-goog-api-key': apiKey }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n contents: messagesToGemini(req.messages),\n generationConfig: buildGenConfig(req),\n };\n if (req.system && req.system.length > 0) {\n body['systemInstruction'] = {\n parts: req.system.map((b) => ({ text: b.text })),\n };\n }\n if (req.tools && req.tools.length > 0) {\n body['tools'] = [{ functionDeclarations: toolsToGemini(req.tools) }];\n }\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n sawFunctionCall: false,\n finalEmitted: false,\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<{\n modelVersion?: string;\n candidates?: GeminiCandidate[];\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n cachedContentTokenCount?: number;\n };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const obj = parsed.value;\n const out: StreamEvent[] = [];\n\n if (obj.modelVersion) state.model = obj.modelVersion;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n\n const candidate = obj.candidates?.[0];\n for (const part of candidate?.content?.parts ?? []) {\n if (typeof part.text === 'string' && part.text.length > 0) {\n out.push({ type: 'text_delta', text: part.text });\n } else if (part.functionCall) {\n state.sawFunctionCall = true;\n const id = `${part.functionCall.name}_${randomUUID().slice(0, 8)}`;\n out.push({ type: 'tool_use_start', id, name: part.functionCall.name });\n const providerMeta =\n typeof part.thoughtSignature === 'string'\n ? { 'google.thoughtSignature': part.thoughtSignature }\n : undefined;\n out.push({\n type: 'tool_use_stop',\n id,\n input: part.functionCall.args ?? {},\n ...(providerMeta ? { providerMeta } : {}),\n });\n }\n }\n\n if (candidate?.finishReason) {\n state.stopReason = normalizeGemini(candidate.finishReason);\n }\n\n const u = obj.usageMetadata;\n if (u) {\n // Disjoint semantics — see google.ts for rationale.\n const cached = u.cachedContentTokenCount ?? 0;\n const promptTotal = u.promptTokenCount ?? state.usage.input + cached;\n state.usage = {\n input: Math.max(0, promptTotal - cached),\n output: u.candidatesTokenCount ?? state.usage.output,\n cacheRead: cached || state.usage.cacheRead,\n };\n }\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n if (state.finalEmitted || !state.started) return [];\n state.finalEmitted = true;\n const finalStop: StopReason = state.sawFunctionCall ? 'tool_use' : state.stopReason;\n return [{ type: 'message_stop', stopReason: finalStop, usage: state.usage }];\n },\n});\n\nfunction buildGenConfig(req: Request): Record<string, unknown> {\n const cfg: Record<string, unknown> = { maxOutputTokens: req.maxTokens };\n if (req.temperature !== undefined) cfg['temperature'] = req.temperature;\n if (req.topP !== undefined) cfg['topP'] = req.topP;\n if (req.stopSequences) cfg['stopSequences'] = req.stopSequences;\n return cfg;\n}\n\nfunction toolsToGemini(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: sanitizeSchemaForGemini(t.inputSchema as Record<string, unknown> | undefined) ?? {\n type: 'object',\n properties: {},\n },\n }));\n}\n\nconst GEMINI_ALLOWED_KEYS = new Set([\n 'type',\n 'format',\n 'description',\n 'nullable',\n 'enum',\n 'items',\n 'properties',\n 'required',\n 'anyOf',\n 'minLength',\n 'maxLength',\n 'pattern',\n 'minimum',\n 'maximum',\n 'minItems',\n 'maxItems',\n 'minProperties',\n 'maxProperties',\n 'propertyOrdering',\n 'title',\n]);\n\nfunction sanitizeSchemaForGemini(node: unknown): Record<string, unknown> | undefined {\n if (node === null || node === undefined) return undefined;\n if (Array.isArray(node)) return undefined;\n if (typeof node !== 'object') return undefined;\n const src = node as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!GEMINI_ALLOWED_KEYS.has(k)) continue;\n if (k === 'properties' && v && typeof v === 'object') {\n const props: Record<string, unknown> = {};\n for (const [pname, pschema] of Object.entries(v as Record<string, unknown>)) {\n const cleaned = sanitizeSchemaForGemini(pschema);\n if (cleaned) props[pname] = cleaned;\n }\n out['properties'] = props;\n } else if (k === 'items') {\n const cleaned = sanitizeSchemaForGemini(v);\n if (cleaned) out['items'] = cleaned;\n } else if (k === 'anyOf' && Array.isArray(v)) {\n const cleaned = v\n .map((s) => sanitizeSchemaForGemini(s))\n .filter((s): s is Record<string, unknown> => s !== undefined);\n if (cleaned.length > 0) out['anyOf'] = cleaned;\n } else if (k === 'required' && Array.isArray(v)) {\n out['required'] = v.filter((s) => typeof s === 'string');\n } else if (k === 'enum' && Array.isArray(v)) {\n out['enum'] = v;\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction messagesToGemini(messages: Message[]): GeminiContent[] {\n const out: GeminiContent[] = [];\n for (const m of messages) {\n if (m.role === 'system') continue;\n const blocks =\n typeof m.content === 'string' ? [{ type: 'text' as const, text: m.content }] : m.content;\n if (m.role === 'assistant') {\n const parts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) parts.push({ text: b.text });\n else if (b.type === 'tool_use') {\n const part: GeminiPart = {\n functionCall: { name: b.name, args: b.input },\n };\n const sig = b.providerMeta?.['google.thoughtSignature'];\n if (typeof sig === 'string' && sig.length > 0) {\n part.thoughtSignature = sig;\n }\n parts.push(part);\n }\n }\n if (parts.length > 0) out.push({ role: 'model', parts });\n continue;\n }\n const textParts: GeminiPart[] = [];\n const functionParts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) textParts.push({ text: b.text });\n else if (b.type === 'tool_result') {\n const responseText = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n const fnName = b.name ?? b.tool_use_id;\n functionParts.push({\n functionResponse: {\n name: fnName,\n response: { content: responseText },\n },\n });\n } else if (b.type === 'image' && b.source.type === 'base64') {\n textParts.push({\n inlineData: {\n mimeType: b.source.media_type ?? 'image/png',\n data: b.source.data ?? '',\n },\n });\n }\n }\n if (textParts.length > 0) out.push({ role: 'user', parts: textParts });\n if (functionParts.length > 0) out.push({ role: 'function', parts: functionParts });\n }\n return out;\n}\n","import type { Capabilities, ModelsRegistry } from '@wrongstack/core';\nimport { capabilitiesForFamily } from './family-capabilities.js';\n\n/**\n * Resolve capabilities for a (provider, model) pair using the family default\n * as a baseline and overlaying per-model facts from the ModelsRegistry.\n */\nexport async function capabilitiesFor(\n registry: ModelsRegistry,\n providerId: string,\n modelId: string,\n): Promise<Capabilities> {\n const provider = await registry.getProvider(providerId);\n const base = capabilitiesForFamily(provider?.family ?? 'unsupported');\n const model = await registry.getModel(providerId, modelId);\n if (!model) return { ...base };\n return {\n ...base,\n tools: model.capabilities.tools && base.tools,\n parallelTools: model.capabilities.tools && base.parallelTools,\n vision: model.capabilities.vision && base.vision,\n maxContext: model.capabilities.maxContext || base.maxContext,\n };\n}\n","import type { ContentBlock } from '@wrongstack/core';\n\ninterface AnthropicBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n content?: unknown;\n tool_use_id?: string;\n is_error?: boolean;\n thinking?: string;\n signature?: string;\n source?: {\n type?: 'base64' | 'url';\n media_type?: string;\n data?: string;\n url?: string;\n };\n}\n\nexport interface FromAnthropicOptions {\n /**\n * Called once for each block whose `type` the converter doesn't recognize.\n * The block is still dropped — this hook only exists so callers can wire\n * it into observability (event bus, logger) instead of silently losing\n * data. Anthropic ships new block types over time (`thinking`,\n * `server_tool_use`, etc.) and we want a way to find out without\n * inflating the conversion logic itself.\n */\n onUnsupported?: (type: string, block: AnthropicBlock) => void;\n}\n\nexport function contentFromAnthropic(\n blocks: AnthropicBlock[],\n opts: FromAnthropicOptions = {},\n): ContentBlock[] {\n const out: ContentBlock[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && typeof b.text === 'string') {\n out.push({ type: 'text', text: b.text });\n } else if (b.type === 'tool_use' && b.id && b.name) {\n const input = isPlainObject(b.input) ? (b.input as Record<string, unknown>) : {};\n out.push({ type: 'tool_use', id: b.id, name: b.name, input });\n } else if (b.type === 'tool_result' && b.tool_use_id) {\n out.push({\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: normalizeToolResultContent(b.content, opts),\n is_error: b.is_error,\n });\n } else if (b.type === 'thinking' && typeof b.thinking === 'string') {\n // Anthropic extended-thinking block. Must round-trip on the next\n // request — without it Anthropic returns 400 \"content[].thinking\n // in the thinking mode must be passed back to the API\".\n out.push({\n type: 'thinking',\n thinking: b.thinking,\n ...(b.signature ? { signature: b.signature } : {}),\n });\n } else if (b.type === 'image' && b.source) {\n const src = b.source;\n const kind = src.type === 'url' ? 'url' : 'base64';\n out.push({\n type: 'image',\n source: {\n type: kind,\n ...(src.media_type ? { media_type: src.media_type } : {}),\n ...(src.data ? { data: src.data } : {}),\n ...(src.url ? { url: src.url } : {}),\n },\n });\n } else if (b.type) {\n opts.onUnsupported?.(b.type, b);\n }\n }\n return out;\n}\n\n/**\n * Convert Anthropic's tool_result content to our canonical string format.\n * Anthropic ships tool_result.content as either a plain string or an array\n * of `{ type: 'text', text }` / `{ type: 'image', source }` sub-blocks.\n * We flatten sub-block arrays to a string so the canonical type stays `string`.\n * If the caller needs the raw array structure (e.g. for image preservation),\n * they should call `contentFromAnthropic` directly on the raw Anthropic block\n * instead of going through a ToolResultBlock.\n */\nfunction normalizeToolResultContent(raw: unknown, opts: FromAnthropicOptions): string {\n if (typeof raw === 'string') return raw;\n if (Array.isArray(raw)) {\n // Flatten sub-block structure to a text representation.\n // Callers who need the full structure should use contentFromAnthropic\n // directly on the raw Anthropic block before constructing a ToolResultBlock.\n const blocks = contentFromAnthropic(raw as AnthropicBlock[], opts);\n return blocks.map((b) => (b.type === 'text' ? b.text : `[${b.type}]`)).join('');\n }\n if (raw === undefined || raw === null) return '';\n return JSON.stringify(raw);\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","import { randomUUID } from 'node:crypto';\nimport type { ContentBlock, ToolUseBlock } from '@wrongstack/core';\nimport { sanitizeJsonString } from '@wrongstack/core';\nimport type { OpenAIToolCall } from './to-openai.js';\n\nexport interface OpenAIChoice {\n message: {\n role: string;\n content: string | null;\n tool_calls?: OpenAIToolCall[];\n };\n finish_reason: string | null;\n}\n\nexport interface FromOpenAIOptions {\n /**\n * Deprecated: the sanitizer fallback is now always attempted. Kept for\n * backward compatibility; the value is ignored.\n */\n jsonArgumentsBuggy?: boolean;\n /**\n * Called when a tool call's `arguments` field can't be parsed even after\n * the sanitizer pass. Callers can use this to emit a structured event,\n * log it, or surface it in a UI. The block is still appended with\n * `{ __raw_arguments }` so the tool gets *something* to fail on, but\n * silently producing garbage input is the kind of bug that wastes\n * debugging hours — this is the hook to find out.\n */\n onParseFailure?: (info: { toolName: string; toolCallId: string; raw: string }) => void;\n}\n\nexport function contentFromOpenAI(\n choice: OpenAIChoice,\n opts: FromOpenAIOptions = {},\n): ContentBlock[] {\n const out: ContentBlock[] = [];\n const text = choice.message.content;\n // Preserve any non-empty text, including whitespace-only — model output\n // sometimes legitimately starts with a newline or padding spaces. Only\n // skip the truly empty case to avoid duplicate empty blocks.\n if (typeof text === 'string' && text.length > 0) {\n out.push({ type: 'text', text });\n }\n for (const tc of choice.message.tool_calls ?? []) {\n const raw = tc.function.arguments ?? '{}';\n // Some OpenAI-compatible servers omit `id` on tool calls. An empty id\n // breaks tool_result correlation downstream, so synthesize a stable one\n // — matching the streaming path and the Google adapter.\n const id = tc.id || `call_${randomUUID()}`;\n const input = parseToolArguments(raw, tc.function.name, id, opts);\n const block: ToolUseBlock = {\n type: 'tool_use',\n id,\n name: tc.function.name,\n input,\n };\n out.push(block);\n }\n if (out.length === 0) {\n out.push({ type: 'text', text: '' });\n }\n return out;\n}\n\nfunction parseToolArguments(\n raw: string,\n toolName: string,\n toolCallId: string,\n opts: FromOpenAIOptions,\n): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n // JSON parsed but is a scalar/array — wrap so the tool gets a stable\n // object shape, but flag it as a parse anomaly so callers can detect.\n opts.onParseFailure?.({ toolName, toolCallId, raw });\n return { __raw_arguments: raw };\n } catch {\n // First-pass failed — try the sanitizer (handles trailing commas,\n // JS-style comments, smart quotes the model sometimes emits).\n const sanitized = sanitizeJsonString(raw);\n if (sanitized !== null) {\n try {\n const parsed = JSON.parse(sanitized) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // fall through\n }\n }\n opts.onParseFailure?.({ toolName, toolCallId, raw });\n return { __raw_arguments: raw };\n }\n}\n","import type {\n Logger,\n ModelsRegistry,\n Provider,\n ProviderConfig,\n ProviderFactory,\n ResolvedProvider,\n WireFamily,\n} from '@wrongstack/core';\nimport { AnthropicProvider } from './anthropic.js';\nimport { GoogleProvider } from './google.js';\nimport { OpenAICompatibleProvider } from './openai-compatible.js';\nimport { OpenAIProvider } from './openai.js';\nimport { WireAdapter } from './wire-adapter.js';\n\nexport { AnthropicProvider, type AnthropicProviderOptions } from './anthropic.js';\nexport { OpenAIProvider, type OpenAIProviderOptions } from './openai.js';\nexport {\n OpenAICompatibleProvider,\n type OpenAICompatibleOptions,\n type CompatibilityQuirks,\n} from './openai-compatible.js';\nexport { GoogleProvider, type GoogleProviderOptions } from './google.js';\nexport { WireAdapter } from './wire-adapter.js';\nexport {\n WireFormatProvider,\n defineWireFormat,\n createWireFormatFactory,\n type WireFormatConfig,\n type WireFactoryOptions,\n} from './wire-format.js';\nexport { mistralWireFormat } from './presets/mistral.js';\nexport { anthropicWireFormat } from './presets/anthropic.js';\nexport { openaiWireFormat } from './presets/openai.js';\nexport { googleWireFormat } from './presets/google.js';\nexport { capabilitiesFor } from './capabilities.js';\nexport { capabilitiesForFamily, CAPABILITIES_BY_FAMILY } from './family-capabilities.js';\nexport { parseProviderHttpError } from './error-parse.js';\nexport { normalizeAnthropic, normalizeOpenAI } from './stop-reason.js';\nexport { toolsToAnthropic } from './tool-format/to-anthropic.js';\nexport { contentFromAnthropic } from './tool-format/from-anthropic.js';\nexport {\n toolsToOpenAI,\n messagesToOpenAI,\n type OpenAIMessage,\n type OpenAIToolCall,\n type ConvertOptions,\n} from './tool-format/to-openai.js';\nexport { contentFromOpenAI, type OpenAIChoice } from './tool-format/from-openai.js';\n\nexport interface BuildFactoriesOptions {\n registry: ModelsRegistry;\n /** Used to log unsupported families during boot. */\n log?: Logger;\n}\n\n/**\n * Build one ProviderFactory per provider known to models.dev. The factory's\n * `create(cfg)` resolves the wire-family at construction time and returns the\n * matching transport. Unsupported families return a stub that throws when\n * complete() is called, so the system can still boot.\n */\nexport async function buildProviderFactoriesFromRegistry(\n opts: BuildFactoriesOptions,\n): Promise<ProviderFactory[]> {\n const providers = await opts.registry.listProviders();\n const factories: ProviderFactory[] = [];\n const unsupported: ResolvedProvider[] = [];\n\n for (const p of providers) {\n if (p.family === 'unsupported') {\n unsupported.push(p);\n continue;\n }\n factories.push({\n type: p.id,\n family: p.family,\n create: (cfg: ProviderConfig) => makeProvider(p, cfg),\n });\n }\n\n // Generic factories so users can hand-roll a provider not in models.dev.\n factories.push({\n type: 'openai-compatible',\n family: 'openai-compatible',\n create: (cfg) =>\n new OpenAICompatibleProvider({\n id: 'openai-compatible',\n apiKey: requireKey(cfg),\n baseUrl: cfg.baseUrl ?? '',\n headers: cfg.headers,\n quirks: cfg.quirks as ConstructorParameters<typeof OpenAICompatibleProvider>[0]['quirks'],\n }),\n });\n\n if (unsupported.length > 0 && opts.log) {\n // Debug-only: the user already knows their plan; only surface when\n // troubleshooting why a specific provider isn't selectable.\n opts.log.info(\n `${unsupported.length} provider(s) need a plugin (unsupported wire family): ` +\n unsupported.map((p) => p.id).join(', '),\n );\n }\n\n return factories;\n}\n\nfunction makeProvider(p: ResolvedProvider, cfg: ProviderConfig): Provider {\n // Config overrides the catalog. This is the path that lets users wire\n // up internal proxies / self-hosted endpoints without needing models.dev.\n const family: WireFamily = cfg.family ?? p.family;\n const envVars = cfg.envVars && cfg.envVars.length > 0 ? cfg.envVars : p.envVars;\n const apiKey = cfg.apiKey ?? readFromEnv(envVars);\n if (!apiKey && family !== 'unsupported') {\n throw new Error(\n `Provider \"${p.id}\" requires an API key. Set ${\n envVars.join(' or ') || 'apiKey in config'\n } or run \\`wstack auth ${p.id}\\`.`,\n );\n }\n const baseUrl = cfg.baseUrl ?? p.apiBase;\n\n if (!family || family === 'unsupported') {\n if (family === 'unsupported') {\n throw new Error(\n `Provider \"${p.id}\" uses an unsupported wire family (${p.npm ?? 'unknown'}). ` +\n `Register a custom factory via a plugin to enable it.`,\n );\n }\n throw new Error(\n `Provider \"${p.id}\" has no wire family configured. ` +\n `Set an explicit family (\"anthropic\" | \"openai\" | \"openai-compatible\" | \"google\") in config or the models.dev catalog.`,\n );\n }\n\n switch (family) {\n case 'anthropic':\n return new AnthropicProvider({ apiKey: apiKey!, baseUrl });\n case 'openai':\n return new OpenAIProvider({\n apiKey: apiKey!,\n baseUrl,\n id: p.id,\n quirks: cfg.quirks as ConstructorParameters<typeof OpenAIProvider>[0]['quirks'],\n });\n case 'openai-compatible':\n return new OpenAICompatibleProvider({\n id: p.id,\n apiKey: apiKey!,\n baseUrl: baseUrl ?? '',\n headers: cfg.headers,\n quirks: cfg.quirks as ConstructorParameters<typeof OpenAICompatibleProvider>[0]['quirks'],\n });\n case 'google':\n return new GoogleProvider({ id: p.id, apiKey: apiKey!, baseUrl });\n }\n}\n\n/**\n * Build a Provider purely from config — no models.dev lookup at all.\n * Used for user-defined providers and offline operation.\n */\nexport function makeProviderFromConfig(id: string, cfg: ProviderConfig): Provider {\n if (!cfg.family) {\n throw new Error(\n `Provider \"${id}\" needs an explicit family (\"anthropic\" | \"openai\" | \"openai-compatible\" | \"google\") when not in the models.dev catalog.`,\n );\n }\n const synthetic: ResolvedProvider = {\n id,\n name: id,\n family: cfg.family,\n apiBase: cfg.baseUrl,\n envVars: cfg.envVars ?? [],\n models: (cfg.models ?? []).map((m) => ({ id: m, name: m })),\n npm: undefined,\n };\n return makeProvider(synthetic, cfg);\n}\n\nfunction readFromEnv(vars: string[]): string | undefined {\n for (const v of vars) {\n const val = process.env[v];\n if (val) return val;\n }\n return undefined;\n}\n\nfunction requireKey(cfg: ProviderConfig): string {\n if (cfg.apiKey) return cfg.apiKey;\n throw new Error('Provider config requires apiKey (or set the corresponding env var).');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/_tool-input.ts","../src/aggregate.ts","../src/anthropic.ts","../src/error-parse.ts","../src/family-capabilities.ts","../src/sse.ts","../src/stop-reason.ts","../src/tool-format/to-anthropic.ts","../src/wire-adapter.ts","../src/google.ts","../src/openai.ts","../src/tool-format/to-openai.ts","../src/openai-compatible.ts","../src/wire-format.ts","../src/presets/mistral.ts","../src/presets/anthropic.ts","../src/presets/openai.ts","../src/presets/google.ts","../src/capabilities.ts","../src/tool-format/from-anthropic.ts","../src/tool-format/from-openai.ts","../src/index.ts"],"names":["aggregateStream","ProviderError","safeParse","DEFAULT_BASE","randomUUID","DEFAULT_VERSION","stripCacheControl","messagesToGemini","toolsToGemini","sanitizeSchemaForGemini","GEMINI_ALLOWED_KEYS"],"mappings":"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","file":"index.js","sourcesContent":["import { safeParse } from '@wrongstack/core';\n\n/**\n * Parse a tool-call arguments JSON blob into a canonical\n * `Record<string, unknown>`.\n *\n * Why this exists: providers stream tool-call arguments as raw JSON strings\n * accumulated over multiple `delta` events. Once complete, callers want a\n * dictionary. Naive `JSON.parse` plus `as Record<string, unknown>` is unsafe\n * — a buggy provider, a proxy that rewrites payloads, or a future API change\n * can yield `null`, an array, a string, or a number, all of which would\n * type-check fine but crash downstream tool executors that index into the\n * input by key.\n *\n * Result contract:\n * - Valid JSON object → returned as-is, typed as `Record<string, unknown>`.\n * - Valid JSON array / scalar → wrapped under `{ __raw: value }` so the\n * tool still receives an object (the executor can detect the anomaly).\n * - Invalid JSON → returns `{ __raw: rawString }` so no information is\n * lost; the tool layer can decide whether to fail or salvage.\n * - Empty/null input → returns `{}` (the \"no arguments\" case).\n */\nexport function parseToolInput(raw: string | undefined): Record<string, unknown> {\n if (!raw) return {};\n const parsed = safeParse<unknown>(raw);\n if (!parsed.ok) {\n // If raw JSON couldn't be parsed directly, but it starts/ends with quotes\n // (a string scalar containing JSON), try to unescape/parse it.\n const trimmed = raw.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n const unescaped = safeParse<unknown>(raw);\n if (unescaped.ok && typeof unescaped.value === 'string') {\n const innerParsed = safeParse<unknown>(unescaped.value);\n if (innerParsed.ok && innerParsed.value && typeof innerParsed.value === 'object' && !Array.isArray(innerParsed.value)) {\n return innerParsed.value as Record<string, unknown>;\n }\n }\n }\n return { __raw: raw };\n }\n const v = parsed.value;\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n return v as Record<string, unknown>;\n }\n // Salvage case: parsed value is a string (scalar) but contains a serialized JSON object\n // (common when proxies/models map OpenAI arguments string directly to Anthropic input).\n if (typeof v === 'string') {\n const trimmed = v.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n const parsed2 = safeParse<unknown>(trimmed);\n if (parsed2.ok && parsed2.value && typeof parsed2.value === 'object' && !Array.isArray(parsed2.value)) {\n return parsed2.value as Record<string, unknown>;\n }\n }\n }\n return { __raw: v ?? raw };\n}\n","import type { ContentBlock, Response, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { parseToolInput } from './_tool-input.js';\n\n/**\n * Consume an `AsyncIterable<StreamEvent>` and reduce it to a non-streaming\n * `Response`. Used by `Provider.complete()` default impls so that the\n * streaming code path is the single source of truth.\n *\n * Optional `onEvent` callback fires for every event as it arrives, useful\n * for the agent loop to emit text_delta to the EventBus without writing\n * its own aggregation logic.\n */\nexport async function aggregateStream(\n stream: AsyncIterable<StreamEvent>,\n onEvent?: (e: StreamEvent) => void,\n): Promise<Response> {\n let model = '';\n let stopReason: StopReason = 'end_turn';\n let usage: Usage = { input: 0, output: 0 };\n const textBuffers: string[] = [];\n let currentTextIndex = -1;\n const toolBuffers = new Map<\n string,\n { name: string; partial: string; input?: unknown; providerMeta?: Record<string, unknown> }\n >();\n const thinkingBuffers: Array<{\n textBuf: string;\n signature?: string;\n providerMeta?: Record<string, unknown>;\n }> = [];\n let currentThinkingIndex = -1;\n const blockOrder: Array<\n { kind: 'text'; idx: number } | { kind: 'tool'; id: string } | { kind: 'thinking'; idx: number }\n > = [];\n\n for await (const ev of stream) {\n if (onEvent) onEvent(ev);\n switch (ev.type) {\n case 'message_start':\n model = ev.model;\n break;\n case 'text_delta':\n if (currentTextIndex === -1) {\n currentTextIndex = textBuffers.length;\n textBuffers.push('');\n blockOrder.push({ kind: 'text', idx: currentTextIndex });\n }\n textBuffers[currentTextIndex] = (textBuffers[currentTextIndex] ?? '') + ev.text;\n break;\n case 'tool_use_start':\n // A tool_use block starts — close any open text block so subsequent\n // text_delta starts a new one.\n currentTextIndex = -1;\n toolBuffers.set(ev.id, { name: ev.name, partial: '' });\n blockOrder.push({ kind: 'tool', id: ev.id });\n break;\n case 'tool_use_input_delta': {\n const b = toolBuffers.get(ev.id);\n if (b) b.partial += ev.partial;\n break;\n }\n case 'tool_use_stop': {\n const b = toolBuffers.get(ev.id);\n if (b) {\n if (ev.input === undefined) {\n // No upstream input — parse from the accumulated partial buffer.\n b.input = parseToolInput(b.partial);\n } else if (typeof ev.input === 'string') {\n // Upstream gave us a raw JSON string; route through the validator.\n b.input = parseToolInput(ev.input);\n } else if (ev.input && typeof ev.input === 'object' && !Array.isArray(ev.input)) {\n b.input = ev.input;\n } else {\n // Array / scalar — preserve via __raw so downstream sees an object.\n b.input = { __raw: ev.input };\n }\n if (ev.providerMeta) b.providerMeta = ev.providerMeta;\n }\n // Tool just stopped — next text_delta should open a new text block.\n currentTextIndex = -1;\n break;\n }\n case 'thinking_start': {\n currentTextIndex = -1;\n // If a thinking block was already started by thinking_signature before\n // this event arrived (e.g. due to out-of-order delivery), reuse it so\n // signature and content end up in the same block rather than creating\n // duplicate thinking entries in the response.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ textBuf: '' });\n }\n // Always set providerMeta on the target block (thinking_start may carry\n // metadata even when the prior signature event did not).\n if (ev.providerMeta && currentThinkingIndex >= 0) {\n thinkingBuffers[currentThinkingIndex]!.providerMeta = ev.providerMeta;\n }\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n break;\n }\n case 'thinking_delta': {\n // Ensure a thinking buffer exists before appending. If thinking_signature\n // created the block (currentThinkingIndex >= 0), reuse it so the\n // signature and content end up in the same buffer.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ textBuf: '' });\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n }\n const t = thinkingBuffers[currentThinkingIndex];\n if (t) t.textBuf += ev.text;\n break;\n }\n case 'thinking_signature': {\n // Ensure a thinking buffer exists before storing the signature. This\n // handles out-of-order delivery where thinking_signature arrives before\n // thinking_start.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ textBuf: '' });\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n }\n const t = thinkingBuffers[currentThinkingIndex];\n if (t) t.signature = ev.signature;\n break;\n }\n case 'thinking_stop': {\n currentThinkingIndex = -1;\n break;\n }\n case 'message_stop':\n stopReason = ev.stopReason;\n usage = ev.usage;\n break;\n }\n }\n\n const content: ContentBlock[] = [];\n for (const b of blockOrder) {\n if (b.kind === 'text') {\n const text = textBuffers[b.idx] ?? '';\n if (text) content.push({ type: 'text', text });\n } else if (b.kind === 'thinking') {\n const t = thinkingBuffers[b.idx];\n // Drop completely empty thinking blocks — emitting one would make\n // Anthropic 400 on the round-trip (\"thinking: cannot be empty\").\n if (!t || (!t.textBuf && !t.signature)) continue;\n const block: ContentBlock = { type: 'thinking', thinking: t.textBuf };\n if (t.signature) (block as { signature?: string }).signature = t.signature;\n if (t.providerMeta && Object.keys(t.providerMeta).length > 0) {\n (block as { providerMeta?: Record<string, unknown> }).providerMeta = t.providerMeta;\n }\n content.push(block);\n } else {\n const tb = toolBuffers.get(b.id);\n if (tb) {\n const block: ContentBlock = {\n type: 'tool_use',\n id: b.id,\n name: tb.name,\n input:\n tb.input && typeof tb.input === 'object' && !Array.isArray(tb.input)\n ? (tb.input as Record<string, unknown>)\n : {},\n };\n if (tb.providerMeta && Object.keys(tb.providerMeta).length > 0) {\n (block as { providerMeta?: Record<string, unknown> }).providerMeta = tb.providerMeta;\n }\n content.push(block);\n }\n }\n }\n if (content.length === 0) content.push({ type: 'text', text: '' });\n\n return { content, stopReason, usage, model };\n}\n","import type {\r\n Capabilities,\r\n Message,\r\n Request,\r\n StopReason,\r\n StreamEvent,\r\n Usage,\r\n} from '@wrongstack/core';\r\nimport { ProviderError, safeParse } from '@wrongstack/core';\r\nimport { parseToolInput } from './_tool-input.js';\r\nimport { parseProviderHttpError } from './error-parse.js';\r\nimport { capabilitiesForFamily } from './family-capabilities.js';\r\nimport { parseSSE } from './sse.js';\r\nimport { normalizeAnthropic } from './stop-reason.js';\r\nimport { toolsToAnthropic } from './tool-format/to-anthropic.js';\r\nimport { WireAdapter } from './wire-adapter.js';\r\n\r\nexport interface AnthropicProviderOptions {\r\n apiKey: string;\r\n baseUrl?: string;\r\n apiVersion?: string;\r\n beta?: string[];\r\n fetchImpl?: typeof fetch;\r\n}\r\n\r\nconst DEFAULT_BASE = 'https://api.anthropic.com';\r\nconst DEFAULT_VERSION = '2023-06-01';\r\n\r\nfunction isAnthropicHost(baseUrl: string): boolean {\r\n try {\r\n const host = new URL(baseUrl).hostname.toLowerCase();\r\n return host === 'api.anthropic.com' || host.endsWith('.anthropic.com');\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport class AnthropicProvider extends WireAdapter {\r\n override readonly id = 'anthropic';\r\n override readonly capabilities: Capabilities = capabilitiesForFamily('anthropic');\r\n\r\n private readonly opts: AnthropicProviderOptions;\r\n\r\n constructor(opts: AnthropicProviderOptions) {\r\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl);\r\n this.opts = opts;\r\n }\r\n\r\n protected override buildUrl(_req: Request): string {\r\n const base = this.baseUrl.replace(/\\/+$/, '');\r\n if (/\\/v\\d+\\/messages$/.test(base)) return base;\r\n if (/\\/v\\d+$/.test(base)) return `${base}/messages`;\r\n return `${base}/v1/messages`;\r\n }\r\n\r\n protected override buildHeaders(req: Request): Record<string, string> {\r\n const headers: Record<string, string> = {\r\n ...super.buildHeaders(req),\r\n 'anthropic-version': this.opts.apiVersion ?? DEFAULT_VERSION,\r\n };\r\n if (isAnthropicHost(this.baseUrl)) {\r\n headers['x-api-key'] = this.apiKey;\r\n } else {\r\n // Third-party Anthropic-compatible proxies (kimi-for-coding,\r\n // zai-coding-plan, anyrouter, …) reject `x-api-key` and require\r\n // `Authorization: Bearer`. This mirrors Claude Code's\r\n // ANTHROPIC_AUTH_TOKEN switch — triggered automatically when the\r\n // baseUrl is not Anthropic-owned.\r\n headers['authorization'] = `Bearer ${this.apiKey}`;\r\n }\r\n if (this.opts.beta && this.opts.beta.length > 0) {\r\n headers['anthropic-beta'] = this.opts.beta.join(',');\r\n }\r\n return headers;\r\n }\r\n\r\n protected override buildBody(req: Request): Record<string, unknown> {\r\n const body: Record<string, unknown> = {\r\n model: req.model,\r\n max_tokens: req.maxTokens,\r\n messages: req.messages.map((m) => this.normalizeMessage(m)),\r\n stream: true,\r\n };\r\n if (req.system && req.system.length > 0) body['system'] = req.system;\r\n if (req.tools && req.tools.length > 0) body['tools'] = toolsToAnthropic(req.tools);\r\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\r\n if (req.topP !== undefined) body['top_p'] = req.topP;\r\n if (req.stopSequences) body['stop_sequences'] = req.stopSequences;\r\n if (req.toolChoice) body['tool_choice'] = req.toolChoice;\r\n return body;\r\n }\r\n\r\n protected override parseStream(\r\n body: Parameters<typeof parseSSE>[0],\r\n fallbackModel: string,\r\n ): AsyncIterable<StreamEvent> {\r\n return parseAnthropicStream(body, fallbackModel);\r\n }\r\n\r\n protected override translateError(status: number, text: string): ProviderError {\r\n return parseProviderHttpError(this.id, status, text);\r\n }\r\n\r\n private normalizeMessage(m: Message): Record<string, unknown> {\r\n return {\r\n role: m.role === 'system' ? 'user' : m.role,\r\n content: typeof m.content === 'string' ? m.content : m.content,\r\n };\r\n }\r\n}\r\n\r\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\r\n\r\n/**\r\n * Translate Anthropic's SSE wire format into canonical StreamEvent[].\r\n *\r\n * Block indices ↔ canonical event ids:\r\n * - text blocks emit text_delta with no id\r\n * - tool_use blocks: content_block_start carries the toolu_xxx id, and\r\n * subsequent input_json_delta chunks accumulate the JSON arg string.\r\n *\r\n * usage.input_tokens arrives in message_start; output_tokens lands in\r\n * message_delta.usage.\r\n */\r\nasync function* parseAnthropicStream(\r\n body: Response2Body,\r\n fallbackModel: string,\r\n): AsyncIterable<StreamEvent> {\r\n type BlockKind = 'text' | 'tool_use' | 'thinking' | 'unknown';\r\n const blocks = new Map<\r\n number,\r\n { kind: BlockKind; id?: string; name?: string; partial: string }\r\n >();\r\n let model = fallbackModel;\r\n let usage: Usage = { input: 0, output: 0 };\r\n let stopReason: StopReason = 'end_turn';\r\n let started = false;\r\n let stopped = false;\r\n\r\n for await (const msg of parseSSE(body)) {\r\n if (!msg.data || msg.data === '[DONE]') continue;\r\n const parsed = safeParse<Record<string, unknown>>(msg.data);\r\n if (!parsed.ok || !parsed.value) continue;\r\n const ev = parsed.value;\r\n const type = String(ev['type'] ?? msg.event);\r\n\r\n switch (type) {\r\n case 'message_start': {\r\n const message = ev['message'] as\r\n | {\r\n model?: string;\r\n usage?: {\r\n input_tokens?: number;\r\n cache_read_input_tokens?: number;\r\n cache_creation_input_tokens?: number;\r\n };\r\n }\r\n | undefined;\r\n if (message?.model) model = message.model;\r\n usage = {\r\n input: message?.usage?.input_tokens ?? 0,\r\n output: 0,\r\n cacheRead: message?.usage?.cache_read_input_tokens,\r\n cacheWrite: message?.usage?.cache_creation_input_tokens,\r\n };\r\n if (!started) {\r\n started = true;\r\n yield { type: 'message_start', model };\r\n }\r\n break;\r\n }\r\n case 'content_block_start': {\r\n const index = Number(ev['index'] ?? 0);\r\n const cb = ev['content_block'] as { type?: string; id?: string; name?: string } | undefined;\r\n if (cb?.type === 'tool_use') {\r\n blocks.set(index, { kind: 'tool_use', id: cb.id, name: cb.name, partial: '' });\r\n if (cb.id && cb.name) {\r\n yield { type: 'tool_use_start', id: cb.id, name: cb.name };\r\n }\r\n } else if (cb?.type === 'text') {\r\n blocks.set(index, { kind: 'text', partial: '' });\r\n } else if (cb?.type === 'thinking' || cb?.type === 'redacted_thinking') {\r\n // Anthropic extended thinking. The model emits an opening\r\n // `content_block_start` with type `thinking` (or\r\n // `redacted_thinking` when content was hidden from us), then\r\n // streams `thinking_delta` and a single `signature_delta`.\r\n // Both the text AND the signature must round-trip to the next\r\n // request — without the signature Anthropic returns 400.\r\n blocks.set(index, { kind: 'thinking', partial: '' });\r\n yield { type: 'thinking_start' };\r\n } else {\r\n blocks.set(index, { kind: 'unknown', partial: '' });\r\n }\r\n break;\r\n }\r\n case 'content_block_delta': {\r\n const index = Number(ev['index'] ?? 0);\r\n const delta = ev['delta'] as\r\n | {\r\n type?: string;\r\n text?: string;\r\n partial_json?: string;\r\n thinking?: string;\r\n signature?: string;\r\n data?: string;\r\n }\r\n | undefined;\r\n const block = blocks.get(index);\r\n if (!block || !delta) break;\r\n if (delta.type === 'text_delta' && typeof delta.text === 'string') {\r\n yield { type: 'text_delta', text: delta.text };\r\n } else if (delta.type === 'input_json_delta' && typeof delta.partial_json === 'string') {\r\n if (block.id) {\r\n block.partial += delta.partial_json;\r\n yield { type: 'tool_use_input_delta', id: block.id, partial: delta.partial_json };\r\n }\r\n } else if (delta.type === 'thinking_delta' && typeof delta.thinking === 'string') {\r\n yield { type: 'thinking_delta', text: delta.thinking };\r\n } else if (delta.type === 'signature_delta' && typeof delta.signature === 'string') {\r\n yield { type: 'thinking_signature', signature: delta.signature };\r\n }\r\n break;\r\n }\r\n case 'content_block_stop': {\r\n const index = Number(ev['index'] ?? 0);\r\n const block = blocks.get(index);\r\n if (block?.kind === 'tool_use' && block.id) {\r\n const input = parseToolInput(block.partial);\r\n yield { type: 'tool_use_stop', id: block.id, input };\r\n } else if (block?.kind === 'thinking') {\r\n yield { type: 'thinking_stop' };\r\n }\r\n break;\r\n }\r\n case 'message_delta': {\r\n const delta = ev['delta'] as { stop_reason?: string | null } | undefined;\r\n const u = ev['usage'] as { output_tokens?: number } | undefined;\r\n if (delta?.stop_reason !== undefined) {\r\n stopReason = normalizeAnthropic(delta.stop_reason);\r\n }\r\n if (u?.output_tokens !== undefined) usage = { ...usage, output: u.output_tokens };\r\n break;\r\n }\r\n case 'message_stop':\r\n stopped = true;\r\n yield { type: 'message_stop', stopReason, usage };\r\n break;\r\n case 'error': {\r\n const err = ev['error'] as { message?: string; type?: string } | undefined;\r\n throw new ProviderError(err?.message ?? 'Anthropic stream error', 0, false, 'anthropic', {\r\n body: { type: err?.type, message: err?.message },\r\n });\r\n }\r\n }\r\n }\r\n if (started && !stopped) {\r\n yield { type: 'message_stop', stopReason, usage };\r\n }\r\n}\r\n","import { ProviderError } from '@wrongstack/core';\nimport type { ProviderErrorBody } from '@wrongstack/core';\n\n/**\n * Provider HTTP error bodies come in three or four shapes depending on\n * vendor. Rather than dump the raw JSON into the error message (which is\n * what was shipped to the user log before this module existed), we parse\n * out the fields we care about — `type`, `message`, `requestId` — and put\n * them on `ProviderError.body` for `describe()` and downstream rendering.\n *\n * The function is intentionally tolerant: anything we can't parse falls\n * back to a truncated raw string, never throws.\n */\nexport function parseProviderHttpError(\n providerId: string,\n status: number,\n rawText: string,\n): ProviderError {\n const body = parseBody(rawText);\n const retryable = isRetryable(status, body.type);\n const message = `${providerId} HTTP ${status}`;\n return new ProviderError(message, status, retryable, providerId, { body });\n}\n\nconst RAW_TRUNCATE_AT = 2000;\n\nfunction parseBody(rawText: string): ProviderErrorBody {\n const raw = rawText.slice(0, RAW_TRUNCATE_AT);\n // Surface truncation so downstream renderers (CLI error formatter, log\n // exporter) can show a \"(truncated, N more bytes)\" suffix instead of\n // silently dropping the rest of the provider's error tail.\n const body: ProviderErrorBody =\n rawText.length > RAW_TRUNCATE_AT\n ? { raw, truncated: true, rawLength: rawText.length }\n : { raw };\n if (!rawText.trim()) return body;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawText);\n } catch {\n return body;\n }\n if (!isRecord(parsed)) return body;\n\n // Anthropic / MiniMax / Kimi: { type: \"error\", error: { type, message }, request_id }\n // OpenAI / OpenAI-compatible: { error: { message, type, code, param } }\n // Google: { error: { code, message, status } }\n const errField = parsed['error'];\n if (isRecord(errField)) {\n const t = stringOf(errField['type']) ?? stringOf(errField['status']);\n const m = stringOf(errField['message']);\n if (t) body.type = t;\n if (m) body.message = m;\n } else if (typeof errField === 'string') {\n body.message = errField;\n }\n // Top-level fields some providers use directly\n if (!body.type) {\n const t = stringOf(parsed['type']);\n if (t && t !== 'error') body.type = t;\n }\n if (!body.message) {\n const m = stringOf(parsed['message']);\n if (m) body.message = m;\n }\n\n // request_id (Anthropic), id (some compatible providers)\n const reqId =\n stringOf(parsed['request_id']) ?? stringOf(parsed['requestId']) ?? stringOf(parsed['id']);\n if (reqId) body.requestId = reqId;\n\n return body;\n}\n\n/**\n * Retryability is mostly driven by HTTP status, but provider-specific\n * `type` strings let us catch retryable conditions that don't have a\n * dedicated status code (e.g. Anthropic's `overloaded_error` is 529 but\n * we also retry it when wrapped in a 503).\n */\nfunction isRetryable(status: number, type?: string): boolean {\n if (status === 0) return true; // network error\n if (status === 408 || status === 429 || status === 529) return true;\n if (status >= 500 && status < 600) return true;\n if (type === 'overloaded_error' || type === 'rate_limit_error') return true;\n return false;\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction stringOf(v: unknown): string | undefined {\n return typeof v === 'string' && v.length > 0 ? v : undefined;\n}\n","import type { Capabilities, WireFamily } from '@wrongstack/core';\n\nexport const CAPABILITIES_BY_FAMILY: Record<WireFamily, Capabilities> = {\n anthropic: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: true,\n systemPrompt: true,\n jsonMode: false,\n maxContext: 200_000,\n cacheControl: 'native',\n },\n openai: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: true,\n maxContext: 128_000,\n cacheControl: 'auto',\n },\n 'openai-compatible': {\n tools: true,\n parallelTools: true,\n vision: false,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: false,\n maxContext: 32_000,\n cacheControl: 'none',\n },\n google: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: true,\n maxContext: 1_000_000,\n cacheControl: 'none',\n },\n unsupported: {\n tools: false,\n parallelTools: false,\n vision: false,\n streaming: false,\n promptCache: false,\n systemPrompt: false,\n jsonMode: false,\n maxContext: 0,\n cacheControl: 'none',\n },\n};\n\nexport function capabilitiesForFamily(\n family: WireFamily,\n overrides: Partial<Capabilities> = {},\n): Capabilities {\n return {\n ...(CAPABILITIES_BY_FAMILY[family] ?? CAPABILITIES_BY_FAMILY.unsupported),\n ...overrides,\n };\n}\n","/**\n * Minimal Server-Sent Events parser for HTTP streaming responses.\n *\n * Yields parsed events as `{ event, data }` pairs. Per spec:\n * - Each event is separated by a blank line\n * - `event: foo` sets the event name (defaults to \"message\")\n * - `data: ...` lines accumulate into the data buffer\n * - `:` lines are comments and ignored\n * - `id` / `retry` fields are accepted and ignored\n *\n * For Anthropic the wire format is canonical SSE with explicit `event:` lines.\n * For OpenAI / OpenAI-compatible the format omits `event:` and just emits\n * `data: <json>` chunks, with a final `data: [DONE]`. Both work with this\n * parser; consumers branch on event name or just on `data`.\n */\nexport interface SSEMessage {\n event: string;\n data: string;\n}\n\n/**\n * Cap on the pending-line buffer. A malicious or buggy upstream that sends\n * megabytes without a newline could otherwise pin a worker via the prior\n * O(n²) CRLF replace + unbounded `buffer +=` pattern. 256 KB comfortably\n * accommodates any sane SSE event while ensuring we fail fast on garbage.\n */\nconst MAX_BUFFER_BYTES = 256 * 1024;\n\nexport async function* parseSSE(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n): AsyncIterable<SSEMessage> {\n if (!body) return;\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let event = 'message';\n const dataLines: string[] = [];\n\n const flush = (): SSEMessage | undefined => {\n if (dataLines.length === 0 && event === 'message') return undefined;\n const data = dataLines.join('\\n');\n const msg: SSEMessage = { event, data };\n event = 'message';\n dataLines.length = 0;\n return msg;\n };\n\n const processLine = (line: string): SSEMessage | undefined => {\n if (line === '') return flush();\n if (line.startsWith(':')) return undefined; // comment\n const colonIdx = line.indexOf(':');\n let field: string;\n let value: string;\n if (colonIdx === -1) {\n field = line;\n value = '';\n } else {\n field = line.slice(0, colonIdx);\n value = line.slice(colonIdx + 1);\n if (value.startsWith(' ')) value = value.slice(1);\n }\n if (field === 'event') event = value || 'message';\n else if (field === 'data') dataLines.push(value);\n // id / retry: ignored\n return undefined;\n };\n\n // Incremental CRLF normalization on each appended chunk only — previously\n // we ran `.replace(/\\r\\n/g, '\\n')` on the *entire* buffer per chunk, which\n // is O(n²) in stream length. Trailing CR (split across chunks) is left\n // in the buffer; the splitter handles it on the next round.\n const appendChunk = (chunkStr: string): void => {\n if (chunkStr.length === 0) return;\n buffer += chunkStr;\n if (buffer.length > MAX_BUFFER_BYTES) {\n throw new Error(\n `SSE: pending line exceeds ${MAX_BUFFER_BYTES} bytes — upstream is not framing events`,\n );\n }\n };\n\n // Node.js Readable stream\n if (isNodeReadable(body)) {\n for await (const chunk of body as NodeJS.ReadableStream) {\n appendChunk(\n typeof chunk === 'string' ? chunk : decoder.decode(chunk as Buffer, { stream: true }),\n );\n const split = splitBuffer(buffer);\n buffer = split.tail;\n for (const line of split.lines) {\n const msg = processLine(line);\n if (msg) yield msg;\n }\n }\n } else {\n // Web ReadableStream\n const reader = (body as ReadableStream<Uint8Array>).getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n appendChunk(decoder.decode(value, { stream: true }));\n const split = splitBuffer(buffer);\n buffer = split.tail;\n for (const line of split.lines) {\n const msg = processLine(line);\n if (msg) yield msg;\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n // Flush any trailing buffered line\n if (buffer.length > 0) {\n const msg = processLine(buffer.replace(/\\r$/, ''));\n if (msg) yield msg;\n }\n const final = flush();\n if (final) yield final;\n}\n\nfunction splitBuffer(buf: string): { lines: string[]; tail: string } {\n // Split on \\n directly; strip trailing \\r per-line. Avoids the O(n²)\n // pattern of running .replace(/\\r\\n/g, '\\n') on the entire buffer\n // every chunk.\n const parts = buf.split('\\n');\n const tail = parts.pop() ?? '';\n const lines = parts.map((p) => (p.endsWith('\\r') ? p.slice(0, -1) : p));\n return { lines, tail };\n}\n\nfunction isNodeReadable(b: unknown): boolean {\n return (\n !!b &&\n typeof b === 'object' &&\n typeof (b as { pipe?: unknown }).pipe === 'function' &&\n typeof (b as { on?: unknown }).on === 'function'\n );\n}\n","import type { StopReason } from '@wrongstack/core';\n\nexport function normalizeAnthropic(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'end_turn':\n return 'end_turn';\n case 'tool_use':\n return 'tool_use';\n case 'max_tokens':\n return 'max_tokens';\n case 'stop_sequence':\n return 'stop_sequence';\n case 'refusal':\n return 'refusal';\n default:\n return 'end_turn';\n }\n}\n\nexport function normalizeOpenAI(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'stop':\n return 'end_turn';\n case 'tool_calls':\n case 'function_call':\n return 'tool_use';\n case 'length':\n return 'max_tokens';\n case 'content_filter':\n return 'refusal';\n default:\n return 'end_turn';\n }\n}\n\n/**\n * Normalize Gemini-specific finish reasons. SAFETY, RECITATION, and\n * \"hallucination\" are safety blocks that should not silently become end_turn.\n */\nexport function normalizeGemini(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'SAFETY':\n case 'RECITATION':\n case 'hallucination':\n return 'refusal';\n case 'stop':\n case 'STOP':\n return 'end_turn';\n case 'max_tokens':\n case 'MAX_TOKENS':\n return 'max_tokens';\n case 'tool_use':\n case 'TOOL_USE':\n return 'tool_use';\n default:\n return 'end_turn';\n }\n}\n","import type { Tool } from '@wrongstack/core';\n\nexport interface AnthropicToolSchema {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\nexport function toolsToAnthropic(tools: Tool[]): AnthropicToolSchema[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: (t.inputSchema as Record<string, unknown>) ?? {\n type: 'object',\n properties: {},\n },\n }));\n}\n","import type { Capabilities, Provider, Request, Response, StreamEvent } from '@wrongstack/core';\nimport { ProviderError } from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\n\ntype Response2 = {\n ok: boolean;\n status: number;\n text(): Promise<string>;\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n};\n\n/** Validate fetchImpl response has required fields; normalize missing body to null. */\nfunction validateResponse(res: unknown): asserts res is Response2 {\n const r = res as Record<string, unknown> | undefined;\n if (r === undefined || typeof r.ok !== 'boolean' || typeof r.status !== 'number') {\n throw new Error('fetchImpl returned invalid response shape — expected { ok, status, text, body }');\n }\n // If body is absent, null, or undefined on a plain object (not a native Response\n // with a read-only getter), normalize it to null so callers can safely use it.\n // Native Response objects always have a body getter — no mutation needed.\n if (!('body' in r) || r.body === undefined) {\n // Only set on plain objects — native Response.body is read-only\n const proto = Object.getPrototypeOf(r);\n if (proto === Object.prototype || proto === null) {\n r.body = null;\n }\n }\n}\n\nasync function safeText(res: Response2): Promise<string> {\n try {\n return await res.text();\n } catch {\n return '';\n }\n}\n\n/**\n * Shared HTTP mechanics for streaming providers.\n * Providers extend this to get:\n * - canonical error handling (ProviderError with retryable flag)\n * - SSE body parsing via parseSSE()\n * - abort signal wiring\n *\n * Subclasses implement the abstract members to provide their specific wire format.\n */\nexport abstract class WireAdapter implements Provider {\n abstract readonly id: string;\n abstract readonly capabilities: Capabilities;\n\n constructor(\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n public readonly fetchImpl: typeof fetch = fetch,\n ) {\n if (!apiKey) throw new Error(`${this.constructor.name}: apiKey required`);\n }\n\n async complete(req: Request, opts: { signal: AbortSignal }): Promise<Response> {\n const { aggregateStream } = await import('./aggregate.js');\n return aggregateStream(this.stream(req, opts));\n }\n\n async *stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent> {\n const url = this.buildUrl(req);\n const headers = this.buildHeaders(req);\n const body = this.buildBody(req);\n\n let httpRes: Response2;\n try {\n const raw = await this.fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: opts.signal,\n });\n validateResponse(raw);\n httpRes = raw as Response2;\n } catch (err) {\n if (opts.signal.aborted) throw err;\n throw new ProviderError(err instanceof Error ? err.message : String(err), 0, true, this.id, {\n cause: err,\n body: { message: err instanceof Error ? err.message : String(err) },\n });\n }\n\n if (!httpRes.ok) {\n const text = await safeText(httpRes);\n throw this.translateError(httpRes.status, text);\n }\n\n yield* this.parseStream(httpRes.body, req.model);\n }\n\n // ─── Abstract / overridable ───────────────────────────────────────────────\n\n /** HTTP endpoint for this provider's chat completions / messages API. */\n protected abstract buildUrl(req: Request): string;\n\n /** Per-request headers. `apiKey` is already in scope — call `super.buildHeaders` first. */\n protected buildHeaders(_req: Request): Record<string, string> {\n return {\n 'content-type': 'application/json',\n accept: 'text/event-stream',\n };\n }\n\n /** Map Request fields to the wire request body. */\n protected abstract buildBody(req: Request): Record<string, unknown>;\n\n /** Translate wire SSE events into canonical StreamEvent[]. */\n protected abstract parseStream(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n fallbackModel: string,\n ): AsyncIterable<StreamEvent>;\n\n /** Build a ProviderError from an HTTP failure response. */\n protected translateError(status: number, body: string): ProviderError {\n return parseProviderHttpError(this.id, status, body);\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { type ProviderError, safeParse } from '@wrongstack/core';\nimport type {\n Capabilities,\n Message,\n Request,\n StopReason,\n StreamEvent,\n Tool,\n Usage,\n} from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { parseSSE } from './sse.js';\nimport { normalizeGemini } from './stop-reason.js';\nimport { WireAdapter } from './wire-adapter.js';\n\n/**\n * Google Gemini wire format (generativelanguage.googleapis.com).\n *\n * Differences vs OpenAI:\n * - Endpoint includes the model in the path: /v1beta/models/{model}:generateContent\n * - Messages → `contents: [{ role: 'user'|'model', parts: [...] }]`\n * - System prompt → `systemInstruction: { parts: [{ text }] }`\n * - Tools → `tools: [{ functionDeclarations: [...] }]`\n * - Tool call → `parts: [{ functionCall: { name, args } }]`\n * - Tool result → `parts: [{ functionResponse: { name, response } }]`\n * - Auth via `?key=` query param or `x-goog-api-key` header\n */\n\nexport interface GoogleProviderOptions {\n apiKey: string;\n baseUrl?: string;\n fetchImpl?: typeof fetch;\n id?: string;\n capabilities?: Partial<Capabilities>;\n}\n\nconst DEFAULT_BASE = 'https://generativelanguage.googleapis.com/v1beta';\n\ninterface GeminiPart {\n text?: string;\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: { name: string; response: { content?: unknown } };\n inlineData?: { mimeType: string; data: string };\n /**\n * Gemini's signed thought blob — present on functionCall parts when\n * the model is using thinking. Must be echoed back verbatim on the\n * next request, otherwise the API rejects with:\n * 400 \"Function call is missing a thought_signature in functionCall\n * parts. This is required for tools to work correctly\".\n */\n thoughtSignature?: string;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model' | 'function';\n parts: GeminiPart[];\n}\n\ninterface GeminiCandidate {\n content?: GeminiContent;\n finishReason?: string;\n}\n\nexport class GoogleProvider extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n private readonly opts: GoogleProviderOptions;\n\n constructor(opts: GoogleProviderOptions) {\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl);\n this.opts = opts;\n this.id = opts.id ?? 'google';\n this.capabilities = capabilitiesForFamily('google', {\n ...opts.capabilities,\n });\n }\n\n protected override buildUrl(req: Request): string {\n return `${this.baseUrl}/models/${encodeURIComponent(req.model)}:streamGenerateContent?alt=sse`;\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n 'x-goog-api-key': this.apiKey,\n };\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body: Record<string, unknown> = {\n contents: messagesToGemini(req.messages),\n generationConfig: this.buildGenConfig(req),\n };\n if (req.system && req.system.length > 0) {\n body['systemInstruction'] = {\n parts: req.system.map((b) => ({ text: b.text })),\n };\n }\n if (req.tools && req.tools.length > 0) {\n body['tools'] = [{ functionDeclarations: toolsToGemini(req.tools) }];\n }\n return body;\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return parseGoogleStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, text: string): ProviderError {\n return parseProviderHttpError(this.id, status, text);\n }\n\n private buildGenConfig(req: Request): Record<string, unknown> {\n const cfg: Record<string, unknown> = { maxOutputTokens: req.maxTokens };\n if (req.temperature !== undefined) cfg['temperature'] = req.temperature;\n if (req.topP !== undefined) cfg['topP'] = req.topP;\n if (req.stopSequences) cfg['stopSequences'] = req.stopSequences;\n return cfg;\n }\n}\n\nfunction toolsToGemini(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: sanitizeSchemaForGemini(t.inputSchema as Record<string, unknown> | undefined) ?? {\n type: 'object',\n properties: {},\n },\n }));\n}\n\n/**\n * Gemini's function-declaration `parameters` field accepts an OpenAPI 3.0\n * Schema subset — a strict superset of \"JSON Schema minus a bunch of\n * keywords\". Sending the raw JSON Schema (which Zod/JSON-Schema converters\n * happily emit with `additionalProperties`, `$schema`, etc.) makes the API\n * fail with `Unknown name \"additionalProperties\"` and friends. Walk the\n * schema and keep only what Gemini understands.\n *\n * Spec reference (OpenAPI 3.0 Schema Object → Gemini): supported keywords\n * are type, format, description, nullable, enum, items, properties,\n * required, anyOf, minLength/maxLength, pattern, minimum/maximum,\n * minItems/maxItems, minProperties/maxProperties, propertyOrdering.\n * Anything else — additionalProperties, $schema, $ref, definitions,\n * default, examples, const, allOf, oneOf, not, dependencies, if/then/else\n * — gets dropped silently.\n */\nconst GEMINI_ALLOWED_KEYS = new Set([\n 'type',\n 'format',\n 'description',\n 'nullable',\n 'enum',\n 'items',\n 'properties',\n 'required',\n 'anyOf',\n 'minLength',\n 'maxLength',\n 'pattern',\n 'minimum',\n 'maximum',\n 'minItems',\n 'maxItems',\n 'minProperties',\n 'maxProperties',\n 'propertyOrdering',\n 'title',\n]);\n\nfunction sanitizeSchemaForGemini(node: unknown): Record<string, unknown> | undefined {\n if (node === null || node === undefined) return undefined;\n if (Array.isArray(node)) {\n // Used only for `enum` / `required` / `anyOf` arrays — handled per-key\n // below. Bare arrays here would be malformed schemas, drop.\n return undefined;\n }\n if (typeof node !== 'object') return undefined;\n const src = node as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!GEMINI_ALLOWED_KEYS.has(k)) continue;\n if (k === 'properties' && v && typeof v === 'object') {\n const props: Record<string, unknown> = {};\n for (const [pname, pschema] of Object.entries(v as Record<string, unknown>)) {\n const cleaned = sanitizeSchemaForGemini(pschema);\n if (cleaned) props[pname] = cleaned;\n }\n out['properties'] = props;\n } else if (k === 'items') {\n const cleaned = sanitizeSchemaForGemini(v);\n if (cleaned) out['items'] = cleaned;\n } else if (k === 'anyOf' && Array.isArray(v)) {\n const cleaned = v\n .map((s) => sanitizeSchemaForGemini(s))\n .filter((s): s is Record<string, unknown> => s !== undefined);\n if (cleaned.length > 0) out['anyOf'] = cleaned;\n } else if (k === 'required' && Array.isArray(v)) {\n out['required'] = v.filter((s) => typeof s === 'string');\n } else if (k === 'enum' && Array.isArray(v)) {\n out['enum'] = v;\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction messagesToGemini(messages: Message[]): GeminiContent[] {\n const out: GeminiContent[] = [];\n for (const m of messages) {\n if (m.role === 'system') continue;\n const blocks =\n typeof m.content === 'string' ? [{ type: 'text' as const, text: m.content }] : m.content;\n if (m.role === 'assistant') {\n const parts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) parts.push({ text: b.text });\n else if (b.type === 'tool_use') {\n const part: GeminiPart = {\n functionCall: { name: b.name, args: b.input },\n };\n // Echo the thought_signature back on every assistant tool_use\n // part — Gemini's thinking models REQUIRE it on the next turn\n // or the API returns 400. The value is opaque; we just round-trip.\n const sig = b.providerMeta?.['google.thoughtSignature'];\n if (typeof sig === 'string' && sig.length > 0) {\n part.thoughtSignature = sig;\n }\n parts.push(part);\n }\n }\n if (parts.length > 0) out.push({ role: 'model', parts });\n continue;\n }\n const textParts: GeminiPart[] = [];\n const functionParts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) textParts.push({ text: b.text });\n else if (b.type === 'tool_result') {\n const responseText = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n // Prefer tool's actual name when available (e.g. executed by ToolExecutor),\n // falling back to tool_use_id or 'unknown' for manually-constructed\n // blocks in tests.\n const fnName = b.name ?? b.tool_use_id ?? 'unknown';\n functionParts.push({\n functionResponse: {\n name: fnName,\n response: { content: responseText },\n },\n });\n } else if (b.type === 'image' && b.source.type === 'base64') {\n textParts.push({\n inlineData: {\n mimeType: b.source.media_type ?? 'image/png',\n data: b.source.data ?? '',\n },\n });\n }\n }\n const userParts: GeminiPart[] = [...textParts];\n // Include function responses as parts of the user turn — Gemini's API\n // accepts functionResponse blocks inline with text in a single user role.\n // This handles the case where a user message consists only of tool_result\n // blocks (no text): without this, the turn is silently dropped.\n if (functionParts.length > 0) userParts.push(...functionParts);\n if (userParts.length > 0) out.push({ role: 'user', parts: userParts });\n }\n return out;\n}\n\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n\n/**\n * Translate Gemini's `:streamGenerateContent?alt=sse` wire format into\n * canonical StreamEvent[]. Each chunk is a full `data: <json>` line with\n * `candidates[0].content.parts` containing either text or complete\n * functionCall objects — Gemini does not stream partial JSON for tool\n * arguments, so we emit tool_use_start + tool_use_stop together.\n */\nasync function* parseGoogleStream(\n body: Response2Body,\n fallbackModel: string,\n): AsyncIterable<StreamEvent> {\n let model = fallbackModel;\n let usage: Usage = { input: 0, output: 0 };\n let stopReason: StopReason = 'end_turn';\n let started = false;\n // Gemini does not have a `tool_use`/`tool_calls` finish reason — turns\n // that contain functionCall parts come back with `finishReason: \"STOP\"`,\n // which normalizes to `end_turn` and would otherwise make the agent\n // loop exit instead of executing the tool. Track whether we saw any\n // function call so we can force-override the stop reason at message_stop.\n let sawFunctionCall = false;\n\n for await (const msg of parseSSE(body)) {\n if (!msg.data || msg.data === '[DONE]') continue;\n const parsed = safeParse<{\n modelVersion?: string;\n candidates?: GeminiCandidate[];\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n cachedContentTokenCount?: number;\n };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) continue;\n const obj = parsed.value;\n\n if (obj.modelVersion) model = obj.modelVersion;\n if (!started) {\n started = true;\n yield { type: 'message_start', model };\n }\n\n const candidate = obj.candidates?.[0];\n for (const part of candidate?.content?.parts ?? []) {\n if (typeof part.text === 'string' && part.text.length > 0) {\n yield { type: 'text_delta', text: part.text };\n } else if (part.functionCall) {\n sawFunctionCall = true;\n const id = randomUUID();\n yield { type: 'tool_use_start', id, name: part.functionCall.name };\n // Stash the opaque thought_signature so it can be echoed back on\n // the next request. Without this the Gemini API rejects with 400\n // \"Function call is missing a thought_signature in functionCall\n // parts\" on thinking models.\n const providerMeta =\n typeof part.thoughtSignature === 'string'\n ? { 'google.thoughtSignature': part.thoughtSignature }\n : undefined;\n yield {\n type: 'tool_use_stop',\n id,\n input: part.functionCall.args ?? {},\n ...(providerMeta ? { providerMeta } : {}),\n };\n }\n }\n\n if (candidate?.finishReason) {\n stopReason = normalizeGemini(candidate.finishReason);\n }\n\n const u = obj.usageMetadata;\n if (u) {\n // Disjoint semantics — see openai.ts for rationale. Gemini reports\n // `promptTokenCount` as the TOTAL (including cached) and\n // `cachedContentTokenCount` as the cached subset; subtracting keeps\n // cost / hit-ratio math correct.\n const cached = u.cachedContentTokenCount ?? 0;\n const promptTotal = u.promptTokenCount ?? usage.input + cached;\n usage = {\n input: Math.max(0, promptTotal - cached),\n output: u.candidatesTokenCount ?? usage.output,\n cacheRead: cached || usage.cacheRead,\n };\n }\n }\n\n if (started) {\n // Force `tool_use` when we saw any functionCall part — Gemini reports\n // `finishReason: \"STOP\"` for tool-call turns, which would otherwise\n // become `end_turn` and short-circuit the agent loop.\n const finalStop: StopReason = sawFunctionCall ? 'tool_use' : stopReason;\n yield { type: 'message_stop', stopReason: finalStop, usage };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Capabilities, Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { type ProviderError, safeParse } from '@wrongstack/core';\nimport { parseToolInput } from './_tool-input.js';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { parseSSE } from './sse.js';\nimport { normalizeOpenAI } from './stop-reason.js';\nimport { type ConvertOptions, messagesToOpenAI, toolsToOpenAI } from './tool-format/to-openai.js';\nimport { WireAdapter } from './wire-adapter.js';\n\nexport interface OpenAIProviderOptions {\n apiKey: string;\n baseUrl?: string;\n organization?: string;\n fetchImpl?: typeof fetch;\n quirks?: ConvertOptions & {\n parallelToolsDisabled?: boolean;\n jsonArgumentsBuggy?: boolean;\n };\n id?: string;\n capabilities?: Partial<Capabilities>;\n}\n\nconst DEFAULT_BASE = 'https://api.openai.com/v1';\n\nexport class OpenAIProvider extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n protected readonly opts: OpenAIProviderOptions;\n\n constructor(opts: OpenAIProviderOptions) {\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl);\n this.opts = opts;\n this.id = opts.id ?? 'openai';\n this.capabilities = capabilitiesForFamily('openai', {\n parallelTools: !opts.quirks?.parallelToolsDisabled,\n systemPrompt: !opts.quirks?.systemAsMessage,\n ...opts.capabilities,\n });\n }\n\n protected override buildUrl(_req: Request): string {\n const base = this.baseUrl.replace(/\\/+$/, '');\n if (/\\/chat\\/completions$/.test(base)) return base;\n if (/\\/v\\d+(\\/[a-z0-9_-]+)*$/i.test(base)) return `${base}/chat/completions`;\n return `${base}/v1/chat/completions`;\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n const headers: Record<string, string> = {\n ...super.buildHeaders(req),\n authorization: `Bearer ${this.apiKey}`,\n };\n if (this.opts.organization) {\n headers['openai-organization'] = this.opts.organization;\n }\n return headers;\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(this.stripCacheControl(req), req.messages, {\n ...this.opts.quirks,\n }),\n max_tokens: req.maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return parseOpenAIStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, text: string): ProviderError {\n return parseProviderHttpError(this.id, status, text);\n }\n\n private stripCacheControl(req: Request): typeof req.system {\n if (!req.system) return undefined;\n return req.system.map((b) => {\n // Omit cache_control without mutating a copy — rest spread is cleaner.\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n }\n}\n\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n\n/**\n * Translate an OpenAI /chat/completions SSE stream into canonical StreamEvent[].\n *\n * Wire format per chunk:\n * data: {\"id\":\"...\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"hi\"},\"finish_reason\":null}]}\n * data: {\"id\":\"...\",\"choices\":[{\"index\":0,\"delta\":{\"tool_calls\":[\n * {\"index\":0,\"id\":\"call_x\",\"function\":{\"name\":\"echo\",\"arguments\":\"{\\\"text\\\":\"}}]},\"finish_reason\":null}]}\n * data: {\"id\":\"...\",\"choices\":[{...,\"finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":12,...}}\n * data: [DONE]\n *\n * Tool calls stream as a sequence of partial fragments keyed by their\n * `index` in the delta array; we map index → canonical tool_use id from\n * the first chunk that carries one.\n */\nasync function* parseOpenAIStream(\n body: Response2Body,\n fallbackModel: string,\n): AsyncIterable<StreamEvent> {\n let model = fallbackModel;\n let usage: Usage = { input: 0, output: 0 };\n let stopReason: StopReason = 'end_turn';\n let started = false;\n let textOpen = false;\n let thinkingOpen = false;\n const toolByIndex = new Map<\n number,\n { id?: string; name?: string; argBuf: string; emittedStart: boolean; emittedArgLength: number }\n >();\n\n for await (const msg of parseSSE(body)) {\n if (!msg.data || msg.data === '[DONE]') continue;\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) continue;\n const obj = parsed.value;\n\n if (typeof obj['model'] === 'string') model = obj['model'];\n if (!started) {\n started = true;\n yield { type: 'message_start', model };\n }\n\n const choices = obj['choices'] as\n | Array<{\n delta?: {\n content?: string | null;\n reasoning_content?: string;\n reasoning?: string;\n tool_calls?: Array<{\n index?: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>\n | undefined;\n const choice = choices?.[0];\n\n // DeepSeek (and Moonshot/Kimi thinking mode) stream chain-of-thought\n // as `delta.reasoning_content` at the top of the delta. The full blob\n // MUST be echoed back as message-level `reasoning_content` on the\n // next request — otherwise DeepSeek 400s with \"reasoning_content in\n // the thinking mode must be passed back to the API\".\n // OpenRouter sometimes uses `delta.reasoning` for the same field.\n const reasoningDelta =\n typeof choice?.delta?.reasoning_content === 'string'\n ? choice.delta.reasoning_content\n : typeof choice?.delta?.reasoning === 'string'\n ? choice.delta.reasoning\n : undefined;\n if (reasoningDelta && reasoningDelta.length > 0) {\n if (!thinkingOpen) {\n thinkingOpen = true;\n yield { type: 'thinking_start' };\n }\n yield { type: 'thinking_delta', text: reasoningDelta };\n }\n\n if (choice?.delta?.content) {\n if (thinkingOpen) {\n thinkingOpen = false;\n yield { type: 'thinking_stop' };\n }\n if (!textOpen) textOpen = true;\n yield { type: 'text_delta', text: choice.delta.content };\n }\n\n if (choice?.delta?.tool_calls) {\n if (thinkingOpen) {\n thinkingOpen = false;\n yield { type: 'thinking_stop' };\n }\n for (const tc of choice.delta.tool_calls) {\n const idx = tc.index ?? 0;\n let entry = toolByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id,\n name: tc.function?.name,\n argBuf: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n toolByIndex.set(idx, entry);\n } else {\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name && !entry.name) entry.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n entry.argBuf += tc.function.arguments;\n }\n if (!entry.emittedStart && entry.id && entry.name) {\n entry.emittedStart = true;\n textOpen = false;\n yield { type: 'tool_use_start', id: entry.id, name: entry.name };\n }\n if (entry.emittedStart && entry.id && entry.emittedArgLength < entry.argBuf.length) {\n const partial = entry.argBuf.slice(entry.emittedArgLength);\n entry.emittedArgLength = entry.argBuf.length;\n yield {\n type: 'tool_use_input_delta',\n id: entry.id,\n partial,\n };\n }\n }\n }\n\n if (choice?.finish_reason) {\n stopReason = normalizeOpenAI(choice.finish_reason);\n }\n\n const u = obj['usage'] as\n | {\n prompt_tokens?: number;\n input_tokens?: number;\n completion_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n prompt_cache_hit_tokens?: number;\n prompt_cache_miss_tokens?: number;\n }\n | undefined;\n if (u) {\n // Normalize to disjoint semantics: `input` is fresh-only (priced at\n // the full rate), `cacheRead` is the cached subset (priced at the\n // cache rate). OpenAI returns `prompt_tokens_details.cached_tokens`;\n // DeepSeek returns `prompt_cache_hit_tokens`/`prompt_cache_miss_tokens`.\n const hasDeepSeekCacheFields =\n u.prompt_cache_hit_tokens !== undefined || u.prompt_cache_miss_tokens !== undefined;\n const cached = u.prompt_tokens_details?.cached_tokens ?? u.prompt_cache_hit_tokens ?? 0;\n const promptTotal =\n u.prompt_tokens ?? u.input_tokens ??\n (hasDeepSeekCacheFields\n ? (u.prompt_cache_hit_tokens ?? 0) + (u.prompt_cache_miss_tokens ?? 0)\n : usage.input + cached);\n usage = {\n input: u.prompt_cache_miss_tokens ?? Math.max(0, promptTotal - cached),\n output: u.completion_tokens ?? usage.output,\n cacheRead: cached || usage.cacheRead,\n };\n }\n }\n\n if (thinkingOpen) {\n yield { type: 'thinking_stop' };\n }\n for (const entry of toolByIndex.values()) {\n // A tool call with no name is unusable — there's nothing to dispatch to.\n if (!entry.name) continue;\n // Some OpenAI-compatible servers (proxies, local runtimes) omit the\n // `id` field on streamed tool calls entirely. Dropping the call here\n // would silently swallow the model's action; synthesize a stable id so\n // it still dispatches and correlates with its tool_result. Mirrors the\n // Google adapter, which always assigns an id.\n if (!entry.id) entry.id = `call_${randomUUID()}`;\n if (!entry.emittedStart) {\n yield { type: 'tool_use_start', id: entry.id, name: entry.name };\n }\n const input = parseToolInput(entry.argBuf);\n yield { type: 'tool_use_stop', id: entry.id, input };\n }\n if (started) {\n yield { type: 'message_stop', stopReason, usage };\n }\n}\n","import type {\n ContentBlock,\n Message,\n TextBlock,\n ThinkingBlock,\n Tool,\n ToolResultBlock,\n ToolUseBlock,\n} from '@wrongstack/core';\n\nexport interface OpenAIToolSchema {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}\n\nexport function toolsToOpenAI(tools: Tool[]): OpenAIToolSchema[] {\n return tools.map((t) => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: (t.inputSchema as Record<string, unknown>) ?? {\n type: 'object',\n properties: {},\n },\n },\n }));\n}\n\nexport interface OpenAIMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content?: string | OpenAIContent[];\n tool_calls?: OpenAIToolCall[];\n tool_call_id?: string;\n name?: string;\n /**\n * DeepSeek (and other OpenAI-compatible thinking-mode models) require the\n * previous assistant's chain-of-thought to be echoed back on the next\n * request as a top-level `reasoning_content` field on the assistant\n * message — NOT inside individual tool_calls. Without it DeepSeek\n * returns 400 \"reasoning_content in the thinking mode must be passed\n * back to the API\". Vanilla OpenAI ignores this field, so emitting it\n * unconditionally is safe.\n */\n reasoning_content?: string;\n}\n\nexport interface OpenAIContent {\n type: 'text' | 'image_url';\n text?: string;\n image_url?: { url: string };\n}\n\nexport interface OpenAIToolCall {\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n}\n\nexport interface ConvertOptions {\n flattenContentToString?: boolean;\n stripCacheControl?: boolean;\n systemAsMessage?: boolean;\n emptyToolCallContent?: 'null' | 'empty_string';\n}\n\nexport function messagesToOpenAI(\n system: TextBlock[] | undefined,\n messages: Message[],\n opts: ConvertOptions = {},\n): OpenAIMessage[] {\n const out: OpenAIMessage[] = [];\n\n if (system && system.length > 0) {\n const sysText = system.map((b) => b.text).join('\\n\\n');\n if (opts.systemAsMessage) {\n out.push({ role: 'user', content: sysText });\n } else {\n out.push({ role: 'system', content: sysText });\n }\n }\n\n for (const msg of messages) {\n if (msg.role === 'user') {\n const blocks = normalizeContent(msg.content);\n const toolResults = blocks.filter((b): b is ToolResultBlock => b.type === 'tool_result');\n const others = blocks.filter((b) => b.type !== 'tool_result');\n\n if (others.length > 0) {\n out.push({\n role: 'user',\n content: opts.flattenContentToString\n ? blocksToString(others)\n : blocksToContentArray(others),\n });\n }\n for (const r of toolResults) {\n const content = typeof r.content === 'string' ? r.content : JSON.stringify(r.content);\n out.push({\n role: 'tool',\n tool_call_id: r.tool_use_id,\n content,\n });\n }\n } else if (msg.role === 'assistant') {\n const blocks = normalizeContent(msg.content);\n const textBlocks = blocks.filter((b): b is TextBlock => b.type === 'text');\n const toolUses = blocks.filter((b): b is ToolUseBlock => b.type === 'tool_use');\n const thinkingBlocks = blocks.filter((b): b is ThinkingBlock => b.type === 'thinking');\n const text = textBlocks.map((b) => b.text).join('');\n const reasoning = thinkingBlocks\n .map((b) => b.thinking)\n .filter((t) => t && t.length > 0)\n .join('');\n const toolCalls: OpenAIToolCall[] = toolUses.map((u) => ({\n id: u.id,\n type: 'function',\n function: { name: u.name, arguments: JSON.stringify(u.input) },\n }));\n\n const message: OpenAIMessage = { role: 'assistant' };\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n if (text) {\n message.content = text;\n } else if (opts.emptyToolCallContent === 'empty_string') {\n message.content = '';\n }\n } else {\n message.content = text;\n }\n // DeepSeek thinking mode requires the prior assistant's reasoning\n // blob to round-trip on the next request. Vanilla OpenAI silently\n // accepts and ignores the field, so emitting it unconditionally is\n // safe across the OpenAI-compatible ecosystem.\n if (reasoning.length > 0) {\n message.reasoning_content = reasoning;\n }\n out.push(message);\n }\n }\n return out;\n}\n\nfunction normalizeContent(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nfunction blocksToString(blocks: ContentBlock[]): string {\n return blocks\n .map((b) => {\n if (b.type === 'text') return b.text;\n if (b.type === 'image') return '[image]';\n return '';\n })\n .join('');\n}\n\nfunction blocksToContentArray(blocks: ContentBlock[]): OpenAIContent[] | string {\n const hasImage = blocks.some((b) => b.type === 'image');\n if (!hasImage) {\n return blocks\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('');\n }\n return blocks\n .map((b): OpenAIContent | null => {\n if (b.type === 'text') return { type: 'text', text: b.text };\n if (b.type === 'image') {\n const url =\n b.source.type === 'url'\n ? (b.source.url ?? '')\n : `data:${b.source.media_type ?? 'image/png'};base64,${b.source.data ?? ''}`;\n return { type: 'image_url', image_url: { url } };\n }\n return null;\n })\n .filter((c): c is OpenAIContent => c !== null);\n}\n","import type { Request } from '@wrongstack/core';\nimport type { Capabilities } from '@wrongstack/core';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { OpenAIProvider, type OpenAIProviderOptions } from './openai.js';\n\nexport interface CompatibilityQuirks {\n stripCacheControl?: boolean;\n systemAsMessage?: boolean;\n flattenContentToString?: boolean;\n preserveToolCallIds?: boolean;\n parallelToolsDisabled?: boolean;\n jsonArgumentsBuggy?: boolean;\n emptyToolCallContent?: 'null' | 'empty_string';\n}\n\nexport interface OpenAICompatibleOptions {\n id: string;\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string>;\n quirks?: CompatibilityQuirks;\n capabilities?: Partial<Capabilities>;\n fetchImpl?: typeof fetch;\n /**\n * Optional override for URL construction. Receives the base URL and request,\n * returns the full URL to use. Allows custom providers with non-standard\n * URL structures (e.g. Google with model-in-path, Anthropic with /v1/messages).\n */\n urlOverride?: (baseUrl: string, req: Request) => string;\n}\n\nexport class OpenAICompatibleProvider extends OpenAIProvider {\n private readonly extraHeaders?: Record<string, string>;\n private readonly urlOverride?: (baseUrl: string, req: Request) => string;\n\n constructor(opts: OpenAICompatibleOptions) {\n super({\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl,\n fetchImpl: opts.fetchImpl,\n id: opts.id,\n capabilities: capabilitiesForFamily('openai-compatible', {\n parallelTools: !opts.quirks?.parallelToolsDisabled,\n systemPrompt: !opts.quirks?.systemAsMessage,\n ...opts.capabilities,\n }),\n quirks: opts.quirks,\n });\n this.extraHeaders = opts.headers;\n this.urlOverride = opts.urlOverride;\n }\n\n protected override buildUrl(req: Request): string {\n if (this.urlOverride) {\n return this.urlOverride(this.baseUrl, req);\n }\n return super.buildUrl(req);\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n ...this.extraHeaders,\n };\n }\n}\n","import type {\n Capabilities,\n Provider,\n ProviderFactory,\n Request,\n StreamEvent,\n WireFamily,\n} from '@wrongstack/core';\nimport type { ProviderError } from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { type SSEMessage, parseSSE } from './sse.js';\nimport { WireAdapter } from './wire-adapter.js';\n\n/**\n * Declarative wire-format definition. Sufficient to add a new HTTP+SSE\n * provider without subclassing `WireAdapter` — the boilerplate (HTTP errors,\n * abort wiring, SSE body parsing) is shared.\n *\n * The shape covers the variation that actually matters between providers:\n * - URL template (path, query)\n * - Auth headers (x-api-key, Authorization, etc.)\n * - Request body (field names, system-prompt placement, tool format)\n * - SSE event translation (one wire event → 0+ canonical events)\n *\n * Anything more exotic (non-SSE streams, multipart bodies, OAuth flows) still\n * needs a hand-written subclass — those cases are too varied to template.\n *\n * `S` is provider-internal state threaded across SSE events for one stream:\n * accumulating partial tool-call JSON, tracking block kinds, carrying the\n * model id forward from `message_start`, etc. Each `stream()` call gets a\n * fresh `S` via `createStreamState`.\n */\nexport interface WireFormatConfig<S = Record<string, unknown>> {\n /** Provider id (matches catalog id when the provider is in models.dev). */\n id: string;\n /** Wire family — used by the registry's factory list. */\n family: WireFamily;\n capabilities: Capabilities;\n /** Used when the user doesn't override via config.baseUrl. */\n defaultBaseUrl: string;\n /** Build the HTTPS endpoint. Receives the (possibly user-overridden) base URL. */\n buildUrl(baseUrl: string, req: Request): string;\n /** Per-request headers. Default `content-type`/`accept` are provided already. */\n buildHeaders(apiKey: string, req: Request): Record<string, string>;\n /** Map a canonical Request onto the provider's body shape. */\n buildBody(req: Request): Record<string, unknown>;\n /** Construct fresh per-stream state. Called once per `stream()` call. */\n createStreamState(fallbackModel: string): S;\n /**\n * Translate one SSE event into 0+ canonical events. Mutating `state` is\n * expected — providers carry per-stream accumulators (partial tool JSON,\n * current model id, usage) here.\n */\n parseStreamEvent(msg: SSEMessage, state: S): StreamEvent[];\n /**\n * Optional: yield any final events after the upstream stream closes\n * (e.g. emit a synthetic `message_stop` when the wire format ends with\n * `[DONE]` instead of an explicit terminator).\n */\n finalizeStream?(state: S): StreamEvent[];\n /** Optional override; defaults to the shared HTTP error parser. */\n normalizeError?(status: number, body: string): ProviderError;\n}\n\n/**\n * Concrete Provider built from a declarative config. Extends WireAdapter to\n * inherit the canonical HTTP + abort + error machinery.\n */\nexport class WireFormatProvider<S = Record<string, unknown>> extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n private readonly cfg: WireFormatConfig<S>;\n\n constructor(\n cfg: WireFormatConfig<S>,\n opts: { apiKey: string; baseUrl?: string; fetchImpl?: typeof fetch },\n ) {\n super(opts.apiKey, opts.baseUrl ?? cfg.defaultBaseUrl, opts.fetchImpl);\n this.id = cfg.id;\n this.capabilities = cfg.capabilities;\n this.cfg = cfg;\n }\n\n protected override buildUrl(req: Request): string {\n return this.cfg.buildUrl(this.baseUrl, req);\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n ...this.cfg.buildHeaders(this.apiKey, req),\n };\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n return this.cfg.buildBody(req);\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return this.runStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, body: string): ProviderError {\n return this.cfg.normalizeError\n ? this.cfg.normalizeError(status, body)\n : parseProviderHttpError(this.id, status, body);\n }\n\n private async *runStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n const state = this.cfg.createStreamState(fallbackModel);\n for await (const msg of parseSSE(body)) {\n for (const ev of this.cfg.parseStreamEvent(msg, state)) {\n yield ev;\n }\n }\n if (this.cfg.finalizeStream) {\n for (const ev of this.cfg.finalizeStream(state)) {\n yield ev;\n }\n }\n }\n}\n\n/**\n * Identity helper that gives authors type checking on the config literal.\n * Use at module level:\n *\n * export const myProvider = defineWireFormat({\n * id: 'mistral',\n * family: 'openai-compatible',\n * capabilities: { ... },\n * ...\n * });\n */\nexport function defineWireFormat<S = Record<string, unknown>>(\n cfg: WireFormatConfig<S>,\n): WireFormatConfig<S> {\n return cfg;\n}\n\nexport interface WireFactoryOptions {\n /**\n * Optional config-time override of the API key. When omitted, the factory\n * reads `cfg.apiKey` (passed in at create time by the registry / config\n * loader). Setting this here is useful in tests.\n */\n apiKey?: string;\n /** Override the base URL at factory build time. */\n baseUrl?: string;\n}\n\n/**\n * Build a `ProviderFactory` from a declarative wire-format. Plug into\n * `ProviderRegistry.register(...)` or use in `buildProviderFactoriesFromRegistry`\n * for catalog-driven discovery.\n */\nexport function createWireFormatFactory(\n cfg: WireFormatConfig,\n opts: WireFactoryOptions = {},\n): ProviderFactory {\n return {\n type: cfg.id,\n family: cfg.family,\n create: (rawCfg: unknown): Provider => {\n const c = rawCfg as { apiKey?: string; baseUrl?: string };\n const apiKey = opts.apiKey ?? c.apiKey;\n if (!apiKey) {\n throw new Error(`Provider \"${cfg.id}\" requires an apiKey.`);\n }\n return new WireFormatProvider(cfg, {\n apiKey,\n baseUrl: opts.baseUrl ?? c.baseUrl,\n });\n },\n };\n}\n","/**\n * Mistral provider as a declarative wire-format config — a 50-line proof\n * that adding a new OpenAI-flavored provider doesn't require subclassing.\n *\n * Mistral's streaming chat completion API is OpenAI-compatible at the wire\n * level, with `delta.content` + `delta.tool_calls` + `[DONE]` terminator.\n * For exotic providers the same pattern still applies — only the\n * `parseStreamEvent` body changes.\n */\nimport type { Request, StopReason, StreamEvent } from '@wrongstack/core';\nimport { safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { messagesToOpenAI, toolsToOpenAI } from '../tool-format/to-openai.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface MistralStreamState {\n model: string;\n started: boolean;\n // OpenAI-style tool_call accumulators keyed by `index`\n toolCalls: Map<\n number,\n { id?: string; name?: string; partial: string; emittedStart: boolean; emittedArgLength: number }\n >;\n}\n\nexport const mistralWireFormat = defineWireFormat<MistralStreamState>({\n id: 'mistral',\n family: 'openai-compatible',\n capabilities: capabilitiesForFamily('openai-compatible', {\n jsonMode: true,\n maxContext: 128_000,\n }),\n defaultBaseUrl: 'https://api.mistral.ai/v1',\n buildUrl: (base) => `${base.replace(/\\/+$/, '')}/chat/completions`,\n buildHeaders: (apiKey) => ({ authorization: `Bearer ${apiKey}` }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(stripCacheControl(req.system), req.messages, {}),\n max_tokens: req.maxTokens,\n stream: true,\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n started: false,\n toolCalls: new Map(),\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<{\n model?: string;\n choices?: {\n delta?: {\n content?: string;\n tool_calls?: {\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }[];\n };\n finish_reason?: string;\n }[];\n usage?: { prompt_tokens?: number; completion_tokens?: number };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const ev = parsed.value;\n const out: StreamEvent[] = [];\n if (ev.model) state.model = ev.model;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n const choice = ev.choices?.[0];\n if (choice?.delta?.content) {\n out.push({ type: 'text_delta', text: choice.delta.content });\n }\n for (const tc of choice?.delta?.tool_calls ?? []) {\n let block = state.toolCalls.get(tc.index);\n if (!block) {\n block = {\n id: tc.id,\n name: tc.function?.name,\n partial: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n state.toolCalls.set(tc.index, block);\n } else {\n if (tc.id && !block.id) block.id = tc.id;\n if (tc.function?.name && !block.name) block.name = tc.function.name;\n }\n const arg = tc.function?.arguments;\n if (arg) {\n block.partial += arg;\n }\n if (!block.emittedStart && block.id && block.name) {\n block.emittedStart = true;\n out.push({ type: 'tool_use_start', id: block.id, name: block.name });\n }\n if (block.emittedStart && block.id && block.emittedArgLength < block.partial.length) {\n const partial = block.partial.slice(block.emittedArgLength);\n block.emittedArgLength = block.partial.length;\n out.push({ type: 'tool_use_input_delta', id: block.id, partial });\n }\n }\n if (choice?.finish_reason) {\n // Close out tool calls with parsed JSON\n for (const block of state.toolCalls.values()) {\n if (block.id && block.name) {\n if (!block.emittedStart) {\n out.push({ type: 'tool_use_start', id: block.id, name: block.name });\n }\n out.push({\n type: 'tool_use_stop',\n id: block.id,\n input: parseToolInput(block.partial),\n });\n }\n }\n out.push({\n type: 'message_stop',\n stopReason: mapStopReason(choice.finish_reason),\n usage: {\n input: ev.usage?.prompt_tokens ?? 0,\n output: ev.usage?.completion_tokens ?? 0,\n },\n });\n }\n return out;\n },\n});\n\nfunction mapStopReason(reason: string): StopReason {\n switch (reason) {\n case 'tool_calls':\n return 'tool_use';\n case 'length':\n case 'model_length':\n return 'max_tokens';\n case 'stop':\n return 'end_turn';\n default:\n return 'end_turn';\n }\n}\n\nfunction stripCacheControl(system: Request['system']): Request['system'] {\n if (!system) return undefined;\n return system.map((b) => {\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n}\n","/**\n * Anthropic provider expressed as a declarative `WireFormatConfig`.\n *\n * The existing `AnthropicProvider` class stays as the production path until\n * the rest of the registry switches over — both produce the same canonical\n * StreamEvent[]. The per-message logic here is extracted verbatim from\n * `parseAnthropicStream` in `../anthropic.ts`, just split into a stateful\n * `parseStreamEvent` call instead of an async generator loop.\n */\nimport type { Message, Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { ProviderError, safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeAnthropic } from '../stop-reason.js';\nimport { toolsToAnthropic } from '../tool-format/to-anthropic.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ntype BlockKind = 'text' | 'tool_use' | 'thinking' | 'unknown';\n\ninterface AnthropicStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n stopped: boolean;\n blocks: Map<number, { kind: BlockKind; id?: string; name?: string; partial: string }>;\n}\n\nconst DEFAULT_VERSION = '2023-06-01';\n\nexport const anthropicWireFormat = defineWireFormat<AnthropicStreamState>({\n id: 'anthropic',\n family: 'anthropic',\n capabilities: capabilitiesForFamily('anthropic'),\n defaultBaseUrl: 'https://api.anthropic.com',\n buildUrl: (base) => {\n const b = base.replace(/\\/+$/, '');\n if (/\\/v\\d+\\/messages$/.test(b)) return b;\n if (/\\/v\\d+$/.test(b)) return `${b}/messages`;\n return `${b}/v1/messages`;\n },\n buildHeaders: (apiKey) => ({\n 'x-api-key': apiKey,\n 'anthropic-version': DEFAULT_VERSION,\n }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n max_tokens: req.maxTokens,\n messages: req.messages.map((m: Message) => ({\n role: m.role === 'system' ? 'user' : m.role,\n content: m.content,\n })),\n stream: true,\n };\n if (req.system && req.system.length > 0) body['system'] = req.system;\n if (req.tools && req.tools.length > 0) body['tools'] = toolsToAnthropic(req.tools);\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop_sequences'] = req.stopSequences;\n if (req.toolChoice) body['tool_choice'] = req.toolChoice;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n stopped: false,\n blocks: new Map(),\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const ev = parsed.value;\n const type = String(ev['type'] ?? msg.event);\n const out: StreamEvent[] = [];\n\n switch (type) {\n case 'message_start': {\n const message = ev['message'] as\n | {\n model?: string;\n usage?: {\n input_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n }\n | undefined;\n if (message?.model) state.model = message.model;\n state.usage = {\n input: message?.usage?.input_tokens ?? 0,\n output: 0,\n cacheRead: message?.usage?.cache_read_input_tokens,\n cacheWrite: message?.usage?.cache_creation_input_tokens,\n };\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n break;\n }\n case 'content_block_start': {\n const index = Number(ev['index'] ?? 0);\n const cb = ev['content_block'] as { type?: string; id?: string; name?: string } | undefined;\n if (cb?.type === 'tool_use') {\n state.blocks.set(index, { kind: 'tool_use', id: cb.id, name: cb.name, partial: '' });\n if (cb.id && cb.name) {\n out.push({ type: 'tool_use_start', id: cb.id, name: cb.name });\n }\n } else if (cb?.type === 'text') {\n state.blocks.set(index, { kind: 'text', partial: '' });\n } else if (cb?.type === 'thinking' || cb?.type === 'redacted_thinking') {\n state.blocks.set(index, { kind: 'thinking', partial: '' });\n out.push({ type: 'thinking_start' });\n } else {\n state.blocks.set(index, { kind: 'unknown', partial: '' });\n }\n break;\n }\n case 'content_block_delta': {\n const index = Number(ev['index'] ?? 0);\n const delta = ev['delta'] as\n | {\n type?: string;\n text?: string;\n partial_json?: string;\n thinking?: string;\n signature?: string;\n }\n | undefined;\n const block = state.blocks.get(index);\n if (!block || !delta) break;\n if (delta.type === 'text_delta' && typeof delta.text === 'string') {\n out.push({ type: 'text_delta', text: delta.text });\n } else if (delta.type === 'input_json_delta' && typeof delta.partial_json === 'string') {\n if (block.id) {\n block.partial += delta.partial_json;\n out.push({ type: 'tool_use_input_delta', id: block.id, partial: delta.partial_json });\n }\n } else if (delta.type === 'thinking_delta' && typeof delta.thinking === 'string') {\n out.push({ type: 'thinking_delta', text: delta.thinking });\n } else if (delta.type === 'signature_delta' && typeof delta.signature === 'string') {\n out.push({ type: 'thinking_signature', signature: delta.signature });\n }\n break;\n }\n case 'content_block_stop': {\n const index = Number(ev['index'] ?? 0);\n const block = state.blocks.get(index);\n if (block?.kind === 'tool_use' && block.id) {\n const input = parseToolInput(block.partial);\n out.push({ type: 'tool_use_stop', id: block.id, input });\n } else if (block?.kind === 'thinking') {\n out.push({ type: 'thinking_stop' });\n }\n break;\n }\n case 'message_delta': {\n const delta = ev['delta'] as { stop_reason?: string | null } | undefined;\n const u = ev['usage'] as { output_tokens?: number } | undefined;\n if (delta?.stop_reason !== undefined) {\n state.stopReason = normalizeAnthropic(delta.stop_reason);\n }\n if (u?.output_tokens !== undefined) {\n state.usage = { ...state.usage, output: u.output_tokens };\n }\n break;\n }\n case 'message_stop':\n state.stopped = true;\n out.push({ type: 'message_stop', stopReason: state.stopReason, usage: state.usage });\n break;\n case 'error': {\n const err = ev['error'] as { message?: string; type?: string } | undefined;\n throw new ProviderError(err?.message ?? 'Anthropic stream error', 0, false, 'anthropic', {\n body: { type: err?.type, message: err?.message },\n });\n }\n }\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n // If upstream closed without an explicit `message_stop` we synthesize\n // one so the consumer's stream-end logic still fires.\n if (state.started && !state.stopped) {\n return [{ type: 'message_stop', stopReason: state.stopReason, usage: state.usage }];\n }\n return [];\n },\n});\n","/**\n * OpenAI provider as a declarative `WireFormatConfig`. Same canonical events\n * as `OpenAIProvider`; the per-message body is the loop body of\n * `parseOpenAIStream` split into a stateful step.\n */\nimport type { Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeOpenAI } from '../stop-reason.js';\nimport { messagesToOpenAI, toolsToOpenAI } from '../tool-format/to-openai.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface OpenAIStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n textOpen: boolean;\n thinkingOpen: boolean;\n toolByIndex: Map<\n number,\n { id?: string; name?: string; argBuf: string; emittedStart: boolean; emittedArgLength: number }\n >;\n finalEmitted: boolean;\n}\n\nexport const openaiWireFormat = defineWireFormat<OpenAIStreamState>({\n id: 'openai',\n family: 'openai',\n capabilities: capabilitiesForFamily('openai'),\n defaultBaseUrl: 'https://api.openai.com/v1',\n buildUrl: (base) => {\n const b = base.replace(/\\/+$/, '');\n if (/\\/chat\\/completions$/.test(b)) return b;\n if (/\\/v\\d+(\\/[a-z0-9_-]+)*$/i.test(b)) return `${b}/chat/completions`;\n return `${b}/v1/chat/completions`;\n },\n buildHeaders: (apiKey) => ({ authorization: `Bearer ${apiKey}` }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(stripCacheControl(req.system), req.messages, {}),\n max_tokens: req.maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n textOpen: false,\n thinkingOpen: false,\n toolByIndex: new Map(),\n finalEmitted: false,\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const obj = parsed.value;\n const out: StreamEvent[] = [];\n\n if (typeof obj['model'] === 'string') state.model = obj['model'] as string;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n\n const choices = obj['choices'] as\n | Array<{\n delta?: {\n content?: string | null;\n reasoning_content?: string;\n reasoning?: string;\n tool_calls?: Array<{\n index?: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>\n | undefined;\n const choice = choices?.[0];\n\n // DeepSeek (and Moonshot/Kimi thinking mode, OpenRouter `reasoning`)\n // streams chain-of-thought as `delta.reasoning_content` at the top of\n // the delta. The full blob MUST be echoed back as message-level\n // `reasoning_content` on the next request — otherwise DeepSeek 400s.\n const reasoningDelta =\n typeof choice?.delta?.reasoning_content === 'string'\n ? choice.delta.reasoning_content\n : typeof choice?.delta?.reasoning === 'string'\n ? choice.delta.reasoning\n : undefined;\n if (reasoningDelta && reasoningDelta.length > 0) {\n if (!state.thinkingOpen) {\n state.thinkingOpen = true;\n out.push({ type: 'thinking_start' });\n }\n out.push({ type: 'thinking_delta', text: reasoningDelta });\n }\n\n if (choice?.delta?.content) {\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n if (!state.textOpen) state.textOpen = true;\n out.push({ type: 'text_delta', text: choice.delta.content });\n }\n\n if (choice?.delta?.tool_calls) {\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n for (const tc of choice.delta.tool_calls) {\n const idx = tc.index ?? 0;\n let entry = state.toolByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id,\n name: tc.function?.name,\n argBuf: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n state.toolByIndex.set(idx, entry);\n } else {\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name && !entry.name) entry.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n entry.argBuf += tc.function.arguments;\n }\n if (!entry.emittedStart && entry.id && entry.name) {\n entry.emittedStart = true;\n state.textOpen = false;\n out.push({ type: 'tool_use_start', id: entry.id, name: entry.name });\n }\n if (entry.emittedStart && entry.id && entry.emittedArgLength < entry.argBuf.length) {\n const partial = entry.argBuf.slice(entry.emittedArgLength);\n entry.emittedArgLength = entry.argBuf.length;\n out.push({\n type: 'tool_use_input_delta',\n id: entry.id,\n partial,\n });\n }\n }\n }\n\n if (choice?.finish_reason) {\n state.stopReason = normalizeOpenAI(choice.finish_reason);\n }\n\n const u = obj['usage'] as\n | {\n prompt_tokens?: number;\n completion_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n prompt_cache_hit_tokens?: number;\n prompt_cache_miss_tokens?: number;\n }\n | undefined;\n if (u) {\n // Mirror openai.ts: disjoint semantics: input is fresh-only,\n // cacheRead is the cached subset. Subtracting prevents the cost\n // calc / cache-hit-ratio from double-counting cached tokens.\n const hasDeepSeekCacheFields =\n u.prompt_cache_hit_tokens !== undefined || u.prompt_cache_miss_tokens !== undefined;\n const cached = u.prompt_tokens_details?.cached_tokens ?? u.prompt_cache_hit_tokens ?? 0;\n const promptTotal =\n u.prompt_tokens ??\n (hasDeepSeekCacheFields\n ? (u.prompt_cache_hit_tokens ?? 0) + (u.prompt_cache_miss_tokens ?? 0)\n : state.usage.input + cached);\n state.usage = {\n input: u.prompt_cache_miss_tokens ?? Math.max(0, promptTotal - cached),\n output: u.completion_tokens ?? state.usage.output,\n cacheRead: cached || state.usage.cacheRead,\n };\n }\n\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n if (state.finalEmitted) return [];\n state.finalEmitted = true;\n const out: StreamEvent[] = [];\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n for (const entry of state.toolByIndex.values()) {\n if (!entry.id || !entry.name) continue;\n if (!entry.emittedStart) {\n out.push({ type: 'tool_use_start', id: entry.id, name: entry.name });\n }\n const input = parseToolInput(entry.argBuf);\n out.push({ type: 'tool_use_stop', id: entry.id, input });\n }\n if (state.started) {\n out.push({ type: 'message_stop', stopReason: state.stopReason, usage: state.usage });\n }\n return out;\n },\n});\n\nfunction stripCacheControl(system: Request['system']): Request['system'] {\n if (!system) return undefined;\n return system.map((b) => {\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n}\n","import { randomUUID } from 'node:crypto';\n/**\n * Google Gemini provider as a declarative `WireFormatConfig`. Matches the\n * `GoogleProvider` class behavior — same canonical events, same handling\n * of `thoughtSignature` and forced `tool_use` stop reason on functionCall\n * turns.\n */\nimport type { Message, Request, StopReason, StreamEvent, Tool, Usage } from '@wrongstack/core';\nimport { safeParse } from '@wrongstack/core';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeGemini } from '../stop-reason.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface GeminiPart {\n text?: string;\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: { name: string; response: { content?: unknown } };\n inlineData?: { mimeType: string; data: string };\n thoughtSignature?: string;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model' | 'function';\n parts: GeminiPart[];\n}\n\ninterface GeminiCandidate {\n content?: GeminiContent;\n finishReason?: string;\n}\n\ninterface GoogleStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n sawFunctionCall: boolean;\n finalEmitted: boolean;\n}\n\nexport const googleWireFormat = defineWireFormat<GoogleStreamState>({\n id: 'google',\n family: 'google',\n capabilities: capabilitiesForFamily('google'),\n defaultBaseUrl: 'https://generativelanguage.googleapis.com/v1beta',\n buildUrl: (base, req) =>\n `${base}/models/${encodeURIComponent(req.model)}:streamGenerateContent?alt=sse`,\n buildHeaders: (apiKey) => ({ 'x-goog-api-key': apiKey }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n contents: messagesToGemini(req.messages),\n generationConfig: buildGenConfig(req),\n };\n if (req.system && req.system.length > 0) {\n body['systemInstruction'] = {\n parts: req.system.map((b) => ({ text: b.text })),\n };\n }\n if (req.tools && req.tools.length > 0) {\n body['tools'] = [{ functionDeclarations: toolsToGemini(req.tools) }];\n }\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n sawFunctionCall: false,\n finalEmitted: false,\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<{\n modelVersion?: string;\n candidates?: GeminiCandidate[];\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n cachedContentTokenCount?: number;\n };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const obj = parsed.value;\n const out: StreamEvent[] = [];\n\n if (obj.modelVersion) state.model = obj.modelVersion;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n\n const candidate = obj.candidates?.[0];\n for (const part of candidate?.content?.parts ?? []) {\n if (typeof part.text === 'string' && part.text.length > 0) {\n out.push({ type: 'text_delta', text: part.text });\n } else if (part.functionCall) {\n state.sawFunctionCall = true;\n const id = `${part.functionCall.name}_${randomUUID().slice(0, 8)}`;\n out.push({ type: 'tool_use_start', id, name: part.functionCall.name });\n const providerMeta =\n typeof part.thoughtSignature === 'string'\n ? { 'google.thoughtSignature': part.thoughtSignature }\n : undefined;\n out.push({\n type: 'tool_use_stop',\n id,\n input: part.functionCall.args ?? {},\n ...(providerMeta ? { providerMeta } : {}),\n });\n }\n }\n\n if (candidate?.finishReason) {\n state.stopReason = normalizeGemini(candidate.finishReason);\n }\n\n const u = obj.usageMetadata;\n if (u) {\n // Disjoint semantics — see google.ts for rationale.\n const cached = u.cachedContentTokenCount ?? 0;\n const promptTotal = u.promptTokenCount ?? state.usage.input + cached;\n state.usage = {\n input: Math.max(0, promptTotal - cached),\n output: u.candidatesTokenCount ?? state.usage.output,\n cacheRead: cached || state.usage.cacheRead,\n };\n }\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n if (state.finalEmitted || !state.started) return [];\n state.finalEmitted = true;\n const finalStop: StopReason = state.sawFunctionCall ? 'tool_use' : state.stopReason;\n return [{ type: 'message_stop', stopReason: finalStop, usage: state.usage }];\n },\n});\n\nfunction buildGenConfig(req: Request): Record<string, unknown> {\n const cfg: Record<string, unknown> = { maxOutputTokens: req.maxTokens };\n if (req.temperature !== undefined) cfg['temperature'] = req.temperature;\n if (req.topP !== undefined) cfg['topP'] = req.topP;\n if (req.stopSequences) cfg['stopSequences'] = req.stopSequences;\n return cfg;\n}\n\nfunction toolsToGemini(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: sanitizeSchemaForGemini(t.inputSchema as Record<string, unknown> | undefined) ?? {\n type: 'object',\n properties: {},\n },\n }));\n}\n\nconst GEMINI_ALLOWED_KEYS = new Set([\n 'type',\n 'format',\n 'description',\n 'nullable',\n 'enum',\n 'items',\n 'properties',\n 'required',\n 'anyOf',\n 'minLength',\n 'maxLength',\n 'pattern',\n 'minimum',\n 'maximum',\n 'minItems',\n 'maxItems',\n 'minProperties',\n 'maxProperties',\n 'propertyOrdering',\n 'title',\n]);\n\nfunction sanitizeSchemaForGemini(node: unknown): Record<string, unknown> | undefined {\n if (node === null || node === undefined) return undefined;\n if (Array.isArray(node)) return undefined;\n if (typeof node !== 'object') return undefined;\n const src = node as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!GEMINI_ALLOWED_KEYS.has(k)) continue;\n if (k === 'properties' && v && typeof v === 'object') {\n const props: Record<string, unknown> = {};\n for (const [pname, pschema] of Object.entries(v as Record<string, unknown>)) {\n const cleaned = sanitizeSchemaForGemini(pschema);\n if (cleaned) props[pname] = cleaned;\n }\n out['properties'] = props;\n } else if (k === 'items') {\n const cleaned = sanitizeSchemaForGemini(v);\n if (cleaned) out['items'] = cleaned;\n } else if (k === 'anyOf' && Array.isArray(v)) {\n const cleaned = v\n .map((s) => sanitizeSchemaForGemini(s))\n .filter((s): s is Record<string, unknown> => s !== undefined);\n if (cleaned.length > 0) out['anyOf'] = cleaned;\n } else if (k === 'required' && Array.isArray(v)) {\n out['required'] = v.filter((s) => typeof s === 'string');\n } else if (k === 'enum' && Array.isArray(v)) {\n out['enum'] = v;\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction messagesToGemini(messages: Message[]): GeminiContent[] {\n const out: GeminiContent[] = [];\n for (const m of messages) {\n if (m.role === 'system') continue;\n const blocks =\n typeof m.content === 'string' ? [{ type: 'text' as const, text: m.content }] : m.content;\n if (m.role === 'assistant') {\n const parts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) parts.push({ text: b.text });\n else if (b.type === 'tool_use') {\n const part: GeminiPart = {\n functionCall: { name: b.name, args: b.input },\n };\n const sig = b.providerMeta?.['google.thoughtSignature'];\n if (typeof sig === 'string' && sig.length > 0) {\n part.thoughtSignature = sig;\n }\n parts.push(part);\n }\n }\n if (parts.length > 0) out.push({ role: 'model', parts });\n continue;\n }\n const textParts: GeminiPart[] = [];\n const functionParts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) textParts.push({ text: b.text });\n else if (b.type === 'tool_result') {\n const responseText = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n const fnName = b.name ?? b.tool_use_id;\n functionParts.push({\n functionResponse: {\n name: fnName,\n response: { content: responseText },\n },\n });\n } else if (b.type === 'image' && b.source.type === 'base64') {\n textParts.push({\n inlineData: {\n mimeType: b.source.media_type ?? 'image/png',\n data: b.source.data ?? '',\n },\n });\n }\n }\n if (textParts.length > 0) out.push({ role: 'user', parts: textParts });\n if (functionParts.length > 0) out.push({ role: 'function', parts: functionParts });\n }\n return out;\n}\n","import type { Capabilities, ModelsRegistry } from '@wrongstack/core';\nimport { capabilitiesForFamily } from './family-capabilities.js';\n\n/**\n * Resolve capabilities for a (provider, model) pair using the family default\n * as a baseline and overlaying per-model facts from the ModelsRegistry.\n */\nexport async function capabilitiesFor(\n registry: ModelsRegistry,\n providerId: string,\n modelId: string,\n): Promise<Capabilities> {\n const provider = await registry.getProvider(providerId);\n const base = capabilitiesForFamily(provider?.family ?? 'unsupported');\n const model = await registry.getModel(providerId, modelId);\n if (!model) return { ...base };\n return {\n ...base,\n tools: model.capabilities.tools && base.tools,\n parallelTools: model.capabilities.tools && base.parallelTools,\n vision: model.capabilities.vision && base.vision,\n maxContext: model.capabilities.maxContext || base.maxContext,\n };\n}\n","import type { ContentBlock } from '@wrongstack/core';\n\ninterface AnthropicBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n content?: unknown;\n tool_use_id?: string;\n is_error?: boolean;\n thinking?: string;\n signature?: string;\n source?: {\n type?: 'base64' | 'url';\n media_type?: string;\n data?: string;\n url?: string;\n };\n}\n\nexport interface FromAnthropicOptions {\n /**\n * Called once for each block whose `type` the converter doesn't recognize.\n * The block is still dropped — this hook only exists so callers can wire\n * it into observability (event bus, logger) instead of silently losing\n * data. Anthropic ships new block types over time (`thinking`,\n * `server_tool_use`, etc.) and we want a way to find out without\n * inflating the conversion logic itself.\n */\n onUnsupported?: (type: string, block: AnthropicBlock) => void;\n}\n\nexport function contentFromAnthropic(\n blocks: AnthropicBlock[],\n opts: FromAnthropicOptions = {},\n): ContentBlock[] {\n const out: ContentBlock[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && typeof b.text === 'string') {\n out.push({ type: 'text', text: b.text });\n } else if (b.type === 'tool_use' && b.id && b.name) {\n const input = isPlainObject(b.input) ? (b.input as Record<string, unknown>) : {};\n out.push({ type: 'tool_use', id: b.id, name: b.name, input });\n } else if (b.type === 'tool_result' && b.tool_use_id) {\n out.push({\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: normalizeToolResultContent(b.content, opts),\n is_error: b.is_error,\n });\n } else if (b.type === 'thinking' && typeof b.thinking === 'string') {\n // Anthropic extended-thinking block. Must round-trip on the next\n // request — without it Anthropic returns 400 \"content[].thinking\n // in the thinking mode must be passed back to the API\".\n out.push({\n type: 'thinking',\n thinking: b.thinking,\n ...(b.signature ? { signature: b.signature } : {}),\n });\n } else if (b.type === 'image' && b.source) {\n const src = b.source;\n const kind = src.type === 'url' ? 'url' : 'base64';\n out.push({\n type: 'image',\n source: {\n type: kind,\n ...(src.media_type ? { media_type: src.media_type } : {}),\n ...(src.data ? { data: src.data } : {}),\n ...(src.url ? { url: src.url } : {}),\n },\n });\n } else if (b.type) {\n opts.onUnsupported?.(b.type, b);\n }\n }\n return out;\n}\n\n/**\n * Convert Anthropic's tool_result content to our canonical string format.\n * Anthropic ships tool_result.content as either a plain string or an array\n * of `{ type: 'text', text }` / `{ type: 'image', source }` sub-blocks.\n * We flatten sub-block arrays to a string so the canonical type stays `string`.\n * If the caller needs the raw array structure (e.g. for image preservation),\n * they should call `contentFromAnthropic` directly on the raw Anthropic block\n * instead of going through a ToolResultBlock.\n */\nfunction normalizeToolResultContent(raw: unknown, opts: FromAnthropicOptions): string {\n if (typeof raw === 'string') return raw;\n if (Array.isArray(raw)) {\n // Flatten sub-block structure to a text representation.\n // Callers who need the full structure should use contentFromAnthropic\n // directly on the raw Anthropic block before constructing a ToolResultBlock.\n const blocks = contentFromAnthropic(raw as AnthropicBlock[], opts);\n return blocks.map((b) => (b.type === 'text' ? b.text : `[${b.type}]`)).join('');\n }\n if (raw === undefined || raw === null) return '';\n return JSON.stringify(raw);\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","import { randomUUID } from 'node:crypto';\nimport type { ContentBlock, ToolUseBlock } from '@wrongstack/core';\nimport { sanitizeJsonString } from '@wrongstack/core';\nimport type { OpenAIToolCall } from './to-openai.js';\n\nexport interface OpenAIChoice {\n message: {\n role: string;\n content: string | null;\n tool_calls?: OpenAIToolCall[];\n };\n finish_reason: string | null;\n}\n\nexport interface FromOpenAIOptions {\n /**\n * Deprecated: the sanitizer fallback is now always attempted. Kept for\n * backward compatibility; the value is ignored.\n */\n jsonArgumentsBuggy?: boolean;\n /**\n * Called when a tool call's `arguments` field can't be parsed even after\n * the sanitizer pass. Callers can use this to emit a structured event,\n * log it, or surface it in a UI. The block is still appended with\n * `{ __raw_arguments }` so the tool gets *something* to fail on, but\n * silently producing garbage input is the kind of bug that wastes\n * debugging hours — this is the hook to find out.\n */\n onParseFailure?: (info: { toolName: string; toolCallId: string; raw: string }) => void;\n}\n\nexport function contentFromOpenAI(\n choice: OpenAIChoice,\n opts: FromOpenAIOptions = {},\n): ContentBlock[] {\n const out: ContentBlock[] = [];\n const text = choice.message.content;\n // Preserve any non-empty text, including whitespace-only — model output\n // sometimes legitimately starts with a newline or padding spaces. Only\n // skip the truly empty case to avoid duplicate empty blocks.\n if (typeof text === 'string' && text.length > 0) {\n out.push({ type: 'text', text });\n }\n for (const tc of choice.message.tool_calls ?? []) {\n const raw = tc.function.arguments ?? '{}';\n // Some OpenAI-compatible servers omit `id` on tool calls. An empty id\n // breaks tool_result correlation downstream, so synthesize a stable one\n // — matching the streaming path and the Google adapter.\n const id = tc.id || `call_${randomUUID()}`;\n const input = parseToolArguments(raw, tc.function.name, id, opts);\n const block: ToolUseBlock = {\n type: 'tool_use',\n id,\n name: tc.function.name,\n input,\n };\n out.push(block);\n }\n if (out.length === 0) {\n out.push({ type: 'text', text: '' });\n }\n return out;\n}\n\nfunction parseToolArguments(\n raw: string,\n toolName: string,\n toolCallId: string,\n opts: FromOpenAIOptions,\n): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n // Salvage case: parsed value is a string (scalar) but contains a serialized JSON object.\n if (typeof parsed === 'string') {\n const trimmed = parsed.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n const parsed2 = JSON.parse(trimmed) as unknown;\n if (parsed2 && typeof parsed2 === 'object' && !Array.isArray(parsed2)) {\n return parsed2 as Record<string, unknown>;\n }\n }\n }\n // JSON parsed but is a scalar/array — wrap so the tool gets a stable\n // object shape, but flag it as a parse anomaly so callers can detect.\n opts.onParseFailure?.({ toolName, toolCallId, raw });\n return { __raw_arguments: raw };\n } catch {\n // First-pass failed — try the sanitizer (handles trailing commas,\n // JS-style comments, smart quotes the model sometimes emits).\n const sanitized = sanitizeJsonString(raw);\n if (sanitized !== null) {\n try {\n const parsed = JSON.parse(sanitized) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n if (typeof parsed === 'string') {\n const trimmed = parsed.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n const parsed2 = JSON.parse(trimmed) as unknown;\n if (parsed2 && typeof parsed2 === 'object' && !Array.isArray(parsed2)) {\n return parsed2 as Record<string, unknown>;\n }\n }\n }\n } catch {\n // fall through\n }\n }\n opts.onParseFailure?.({ toolName, toolCallId, raw });\n return { __raw_arguments: raw };\n }\n}\n","import type {\n Logger,\n ModelsRegistry,\n Provider,\n ProviderConfig,\n ProviderFactory,\n ResolvedProvider,\n WireFamily,\n} from '@wrongstack/core';\nimport { AnthropicProvider } from './anthropic.js';\nimport { GoogleProvider } from './google.js';\nimport { OpenAICompatibleProvider } from './openai-compatible.js';\nimport { OpenAIProvider } from './openai.js';\nimport { WireAdapter } from './wire-adapter.js';\n\nexport { AnthropicProvider, type AnthropicProviderOptions } from './anthropic.js';\nexport { OpenAIProvider, type OpenAIProviderOptions } from './openai.js';\nexport {\n OpenAICompatibleProvider,\n type OpenAICompatibleOptions,\n type CompatibilityQuirks,\n} from './openai-compatible.js';\nexport { GoogleProvider, type GoogleProviderOptions } from './google.js';\nexport { WireAdapter } from './wire-adapter.js';\nexport {\n WireFormatProvider,\n defineWireFormat,\n createWireFormatFactory,\n type WireFormatConfig,\n type WireFactoryOptions,\n} from './wire-format.js';\nexport { mistralWireFormat } from './presets/mistral.js';\nexport { anthropicWireFormat } from './presets/anthropic.js';\nexport { openaiWireFormat } from './presets/openai.js';\nexport { googleWireFormat } from './presets/google.js';\nexport { capabilitiesFor } from './capabilities.js';\nexport { capabilitiesForFamily, CAPABILITIES_BY_FAMILY } from './family-capabilities.js';\nexport { parseProviderHttpError } from './error-parse.js';\nexport { normalizeAnthropic, normalizeOpenAI } from './stop-reason.js';\nexport { toolsToAnthropic } from './tool-format/to-anthropic.js';\nexport { contentFromAnthropic } from './tool-format/from-anthropic.js';\nexport {\n toolsToOpenAI,\n messagesToOpenAI,\n type OpenAIMessage,\n type OpenAIToolCall,\n type ConvertOptions,\n} from './tool-format/to-openai.js';\nexport { contentFromOpenAI, type OpenAIChoice } from './tool-format/from-openai.js';\n\nexport interface BuildFactoriesOptions {\n registry: ModelsRegistry;\n /** Used to log unsupported families during boot. */\n log?: Logger;\n}\n\n/**\n * Build one ProviderFactory per provider known to models.dev. The factory's\n * `create(cfg)` resolves the wire-family at construction time and returns the\n * matching transport. Unsupported families return a stub that throws when\n * complete() is called, so the system can still boot.\n */\nexport async function buildProviderFactoriesFromRegistry(\n opts: BuildFactoriesOptions,\n): Promise<ProviderFactory[]> {\n const providers = await opts.registry.listProviders();\n const factories: ProviderFactory[] = [];\n const unsupported: ResolvedProvider[] = [];\n\n for (const p of providers) {\n if (p.family === 'unsupported') {\n unsupported.push(p);\n continue;\n }\n factories.push({\n type: p.id,\n family: p.family,\n create: (cfg: ProviderConfig) => makeProvider(p, cfg),\n });\n }\n\n // Generic factories so users can hand-roll a provider not in models.dev.\n factories.push({\n type: 'openai-compatible',\n family: 'openai-compatible',\n create: (cfg) =>\n new OpenAICompatibleProvider({\n id: 'openai-compatible',\n apiKey: requireKey(cfg),\n baseUrl: cfg.baseUrl ?? '',\n headers: cfg.headers,\n quirks: cfg.quirks as ConstructorParameters<typeof OpenAICompatibleProvider>[0]['quirks'],\n }),\n });\n\n if (unsupported.length > 0 && opts.log) {\n // Debug-only: the user already knows their plan; only surface when\n // troubleshooting why a specific provider isn't selectable.\n opts.log.info(\n `${unsupported.length} provider(s) need a plugin (unsupported wire family): ` +\n unsupported.map((p) => p.id).join(', '),\n );\n }\n\n return factories;\n}\n\nfunction makeProvider(p: ResolvedProvider, cfg: ProviderConfig): Provider {\n // Config overrides the catalog. This is the path that lets users wire\n // up internal proxies / self-hosted endpoints without needing models.dev.\n const family: WireFamily = cfg.family ?? p.family;\n const envVars = cfg.envVars && cfg.envVars.length > 0 ? cfg.envVars : p.envVars;\n const apiKey = cfg.apiKey ?? readFromEnv(envVars);\n if (!apiKey && family !== 'unsupported') {\n throw new Error(\n `Provider \"${p.id}\" requires an API key. Set ${\n envVars.join(' or ') || 'apiKey in config'\n } or run \\`wstack auth ${p.id}\\`.`,\n );\n }\n const baseUrl = cfg.baseUrl ?? p.apiBase;\n\n if (!family || family === 'unsupported') {\n if (family === 'unsupported') {\n throw new Error(\n `Provider \"${p.id}\" uses an unsupported wire family (${p.npm ?? 'unknown'}). ` +\n `Register a custom factory via a plugin to enable it.`,\n );\n }\n throw new Error(\n `Provider \"${p.id}\" has no wire family configured. ` +\n `Set an explicit family (\"anthropic\" | \"openai\" | \"openai-compatible\" | \"google\") in config or the models.dev catalog.`,\n );\n }\n\n switch (family) {\n case 'anthropic':\n return new AnthropicProvider({ apiKey: apiKey!, baseUrl });\n case 'openai':\n return new OpenAIProvider({\n apiKey: apiKey!,\n baseUrl,\n id: p.id,\n quirks: cfg.quirks as ConstructorParameters<typeof OpenAIProvider>[0]['quirks'],\n });\n case 'openai-compatible':\n return new OpenAICompatibleProvider({\n id: p.id,\n apiKey: apiKey!,\n baseUrl: baseUrl ?? '',\n headers: cfg.headers,\n quirks: cfg.quirks as ConstructorParameters<typeof OpenAICompatibleProvider>[0]['quirks'],\n });\n case 'google':\n return new GoogleProvider({ id: p.id, apiKey: apiKey!, baseUrl });\n }\n}\n\n/**\n * Build a Provider purely from config — no models.dev lookup at all.\n * Used for user-defined providers and offline operation.\n */\nexport function makeProviderFromConfig(id: string, cfg: ProviderConfig): Provider {\n if (!cfg.family) {\n throw new Error(\n `Provider \"${id}\" needs an explicit family (\"anthropic\" | \"openai\" | \"openai-compatible\" | \"google\") when not in the models.dev catalog.`,\n );\n }\n const synthetic: ResolvedProvider = {\n id,\n name: id,\n family: cfg.family,\n apiBase: cfg.baseUrl,\n envVars: cfg.envVars ?? [],\n models: (cfg.models ?? []).map((m) => ({ id: m, name: m })),\n npm: undefined,\n };\n return makeProvider(synthetic, cfg);\n}\n\nfunction readFromEnv(vars: string[]): string | undefined {\n for (const v of vars) {\n const val = process.env[v];\n if (val) return val;\n }\n return undefined;\n}\n\nfunction requireKey(cfg: ProviderConfig): string {\n if (cfg.apiKey) return cfg.apiKey;\n throw new Error('Provider config requires apiKey (or set the corresponding env var).');\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wrongstack/providers",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.6",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "WrongStack LLM provider adapters (Anthropic, OpenAI, Google) built on declarative WireFormatConfig.",
|
|
6
6
|
"repository": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"dist"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@wrongstack/core": "0.8.
|
|
28
|
+
"@wrongstack/core": "0.8.6"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/node": "^22.19.19",
|