@anvia/core 1.0.0-rc.2 → 1.0.0-rc.4
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/README.md +77 -10
- package/dist/agent/index.d.ts +20 -13
- package/dist/agent/index.js +36 -15
- package/dist/{agent-yBG8e9Jj.d.ts → agent-CXScUOpX.d.ts} +12 -15
- package/dist/chunk-3RM57ZT2.js +31 -0
- package/dist/chunk-3RM57ZT2.js.map +1 -0
- package/dist/{chunk-DBSCKTUL.js → chunk-5GXSQYQT.js} +1744 -838
- package/dist/chunk-5GXSQYQT.js.map +1 -0
- package/dist/{chunk-KIDGIJM7.js → chunk-AZB6N7P4.js} +94 -86
- package/dist/chunk-AZB6N7P4.js.map +1 -0
- package/dist/{chunk-KR3RCCHJ.js → chunk-D2ECOWN5.js} +26 -11
- package/dist/chunk-D2ECOWN5.js.map +1 -0
- package/dist/{chunk-EINTGEGY.js → chunk-FXAIYTRE.js} +101 -26
- package/dist/chunk-FXAIYTRE.js.map +1 -0
- package/dist/{chunk-FMHLROPQ.js → chunk-GQL5KRAH.js} +13 -33
- package/dist/chunk-GQL5KRAH.js.map +1 -0
- package/dist/{chunk-D37WMSP6.js → chunk-J2W63PJI.js} +50 -10
- package/dist/chunk-J2W63PJI.js.map +1 -0
- package/dist/{chunk-OJH6HWHX.js → chunk-KFR4CDGK.js} +8 -2
- package/dist/chunk-KFR4CDGK.js.map +1 -0
- package/dist/{chunk-TIZYTPJO.js → chunk-PK5LKOFL.js} +33 -2
- package/dist/chunk-PK5LKOFL.js.map +1 -0
- package/dist/{chunk-XKYYBABH.js → chunk-RFHQY2IO.js} +2 -2
- package/dist/chunk-TRQ3XRFD.js +54 -0
- package/dist/chunk-TRQ3XRFD.js.map +1 -0
- package/dist/{chunk-CWM7B2OO.js → chunk-VKYZZXP5.js} +10 -2
- package/dist/chunk-VKYZZXP5.js.map +1 -0
- package/dist/{chunk-77AIYARB.js → chunk-XYTPYUGB.js} +29 -19
- package/dist/chunk-XYTPYUGB.js.map +1 -0
- package/dist/{chunk-4WI3VGZK.js → chunk-ZCPOIDAQ.js} +3 -3
- package/dist/{client-B8DT1vUG.d.ts → client-DvUatElp.d.ts} +4 -3
- package/dist/completion/index.d.ts +3 -3
- package/dist/completion/index.js +2 -2
- package/dist/documents/index.d.ts +34 -0
- package/dist/documents/index.js +315 -0
- package/dist/documents/index.js.map +1 -0
- package/dist/{dynamic-tools-KwEGRbHp.d.ts → dynamic-tools-AEBOTgu1.d.ts} +3 -3
- package/dist/embeddings/index.js +2 -1
- package/dist/evals/index.d.ts +19 -11
- package/dist/evals/index.js +88 -55
- package/dist/evals/index.js.map +1 -1
- package/dist/extractor/index.d.ts +1 -1
- package/dist/extractor/index.js +3 -3
- package/dist/guardrails/index.d.ts +6 -129
- package/dist/guardrails/index.js +1 -1
- package/dist/image-generation/index.d.ts +1 -1
- package/dist/index.d.ts +15 -14
- package/dist/index.js +49 -28
- package/dist/interactions-csssHYcN.d.ts +174 -0
- package/dist/internal/agent.d.ts +18 -22
- package/dist/internal/agent.js +45 -14
- package/dist/internal/agent.js.map +1 -1
- package/dist/mcp/index.d.ts +4 -4
- package/dist/mcp/index.js +6 -5
- package/dist/memory/index.d.ts +3 -3
- package/dist/memory/index.js +3 -3
- package/dist/{message-schema-Cn7ezRfJ.d.ts → message-schema-B2M7AYzR.d.ts} +1 -1
- package/dist/observability/index.d.ts +8 -7
- package/dist/observability/index.js +3 -3
- package/dist/pipeline/index.d.ts +18 -18
- package/dist/pipeline/index.js +20 -29
- package/dist/pipeline/index.js.map +1 -1
- package/dist/skills/index.d.ts +4 -4
- package/dist/skills/index.js +6 -5
- package/dist/speech-generation/index.d.ts +1 -1
- package/dist/text-C_6eKrbC.d.ts +32 -0
- package/dist/{think-tool-6H2QNQzQ.d.ts → think-tool-D8frXxwV.d.ts} +16 -2
- package/dist/tool/index.d.ts +6 -6
- package/dist/tool/index.js +9 -4
- package/dist/{tool--Mz4v1eL.d.ts → tool-r62gf3QY.d.ts} +3 -2
- package/dist/transcription/index.d.ts +1 -1
- package/dist/{types-Dld1TpWj.d.ts → types-C3gv9EX6.d.ts} +1 -1
- package/dist/{types-3x3mOLHU.d.ts → types-CElwurHZ.d.ts} +56 -35
- package/dist/types-CIPaIbZo.d.ts +105 -0
- package/dist/{types-CQ_ioXWK.d.ts → types-D9rKQ_as.d.ts} +24 -2
- package/dist/{types-BVzM4RsC.d.ts → types-DbolvLtZ.d.ts} +1 -1
- package/dist/{types-DiJqJejp.d.ts → types-RT3cuyRk.d.ts} +1 -1
- package/dist/vector-store/index.d.ts +7 -6
- package/dist/vector-store/index.js +6 -3
- package/package.json +6 -6
- package/dist/chunk-77AIYARB.js.map +0 -1
- package/dist/chunk-CWM7B2OO.js.map +0 -1
- package/dist/chunk-D37WMSP6.js.map +0 -1
- package/dist/chunk-DBSCKTUL.js.map +0 -1
- package/dist/chunk-EINTGEGY.js.map +0 -1
- package/dist/chunk-FMHLROPQ.js.map +0 -1
- package/dist/chunk-KIDGIJM7.js.map +0 -1
- package/dist/chunk-KR3RCCHJ.js.map +0 -1
- package/dist/chunk-OJH6HWHX.js.map +0 -1
- package/dist/chunk-TIZYTPJO.js.map +0 -1
- package/dist/loaders/index.d.ts +0 -87
- package/dist/loaders/index.js +0 -299
- package/dist/loaders/index.js.map +0 -1
- package/dist/middleware-C7PdmKF7.d.ts +0 -56
- /package/dist/{chunk-XKYYBABH.js.map → chunk-RFHQY2IO.js.map} +0 -0
- /package/dist/{chunk-4WI3VGZK.js.map → chunk-ZCPOIDAQ.js.map} +0 -0
|
@@ -1,4 +1,28 @@
|
|
|
1
|
-
// src/guardrails/
|
|
1
|
+
// src/guardrails/actions.ts
|
|
2
|
+
function allow(options = {}) {
|
|
3
|
+
return { action: "allow", ...options };
|
|
4
|
+
}
|
|
5
|
+
function block(options) {
|
|
6
|
+
return { action: "block", ...options };
|
|
7
|
+
}
|
|
8
|
+
var commonActions = {
|
|
9
|
+
allow,
|
|
10
|
+
block
|
|
11
|
+
};
|
|
12
|
+
var inputActions = {
|
|
13
|
+
...commonActions,
|
|
14
|
+
rewrite(options) {
|
|
15
|
+
return { action: "rewrite", ...options };
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var outputActions = {
|
|
19
|
+
...commonActions,
|
|
20
|
+
rewrite(options) {
|
|
21
|
+
return { action: "rewrite", ...options };
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// src/guardrails/policy.ts
|
|
2
26
|
function defineGuardrailPolicy(options) {
|
|
3
27
|
return {
|
|
4
28
|
id: options.id,
|
|
@@ -13,16 +37,6 @@ function defineInputGuardrail(guardrail) {
|
|
|
13
37
|
function defineOutputGuardrail(guardrail) {
|
|
14
38
|
return guardrail;
|
|
15
39
|
}
|
|
16
|
-
function allow(options = {}) {
|
|
17
|
-
return { action: "allow", ...options };
|
|
18
|
-
}
|
|
19
|
-
function block(options) {
|
|
20
|
-
return { action: "block", ...options };
|
|
21
|
-
}
|
|
22
|
-
var guardrails = {
|
|
23
|
-
blockText,
|
|
24
|
-
redactText
|
|
25
|
-
};
|
|
26
40
|
function normalizeGuardrailPolicies(policies) {
|
|
27
41
|
if (policies === void 0) {
|
|
28
42
|
return [];
|
|
@@ -35,6 +49,65 @@ function appendGuardrailPolicies(current, next) {
|
|
|
35
49
|
function hasEnforcedOutputGuardrails(policies) {
|
|
36
50
|
return policies.some((policy) => policy.mode === "enforce" && policy.output.length > 0);
|
|
37
51
|
}
|
|
52
|
+
|
|
53
|
+
// src/guardrails/message.ts
|
|
54
|
+
function textFromMessage(message) {
|
|
55
|
+
if (message.role === "system") {
|
|
56
|
+
return message.content;
|
|
57
|
+
}
|
|
58
|
+
if (typeof message.content === "string") {
|
|
59
|
+
return message.content;
|
|
60
|
+
}
|
|
61
|
+
return message.content.flatMap((content) => {
|
|
62
|
+
if (content.type === "text") {
|
|
63
|
+
return [content.text];
|
|
64
|
+
}
|
|
65
|
+
if (content.type === "file" && content.data.type === "text") {
|
|
66
|
+
return [content.data.text];
|
|
67
|
+
}
|
|
68
|
+
if (content.type === "tool-result") {
|
|
69
|
+
return textFromToolResult(content.output);
|
|
70
|
+
}
|
|
71
|
+
return [];
|
|
72
|
+
}).join("\n");
|
|
73
|
+
}
|
|
74
|
+
function rewriteMessageText(message, text) {
|
|
75
|
+
if (message.role === "system") {
|
|
76
|
+
return { ...message, content: text };
|
|
77
|
+
}
|
|
78
|
+
if (message.role === "user") {
|
|
79
|
+
const content = typeof message.content === "string" ? [] : message.content;
|
|
80
|
+
return {
|
|
81
|
+
...message,
|
|
82
|
+
content: [
|
|
83
|
+
{ type: "text", text },
|
|
84
|
+
...content.filter(
|
|
85
|
+
(item) => item.type !== "text" && !(item.type === "file" && item.data.type === "text")
|
|
86
|
+
)
|
|
87
|
+
]
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
if (message.role === "assistant") {
|
|
91
|
+
return { ...message, content: [{ type: "text", text }] };
|
|
92
|
+
}
|
|
93
|
+
return message;
|
|
94
|
+
}
|
|
95
|
+
function textFromToolResult(output) {
|
|
96
|
+
switch (output.type) {
|
|
97
|
+
case "text":
|
|
98
|
+
case "error-text":
|
|
99
|
+
return [output.value];
|
|
100
|
+
case "json":
|
|
101
|
+
case "error-json":
|
|
102
|
+
return [JSON.stringify(output.value)];
|
|
103
|
+
case "content":
|
|
104
|
+
return output.value.flatMap((part) => part.type === "text" ? [part.text] : []);
|
|
105
|
+
case "execution-denied":
|
|
106
|
+
return output.reason === void 0 ? [] : [output.reason];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// src/guardrails/runtime.ts
|
|
38
111
|
async function runInputGuardrails(policies, context) {
|
|
39
112
|
let prompt = context.prompt;
|
|
40
113
|
let inputText = context.inputText;
|
|
@@ -157,21 +230,11 @@ function decisionRecord(args) {
|
|
|
157
230
|
if (args.action.metadata !== void 0) record.metadata = args.action.metadata;
|
|
158
231
|
return record;
|
|
159
232
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
...commonActions,
|
|
166
|
-
rewrite(options) {
|
|
167
|
-
return { action: "rewrite", ...options };
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
|
-
var outputActions = {
|
|
171
|
-
...commonActions,
|
|
172
|
-
rewrite(options) {
|
|
173
|
-
return { action: "rewrite", ...options };
|
|
174
|
-
}
|
|
233
|
+
|
|
234
|
+
// src/guardrails/text.ts
|
|
235
|
+
var guardrails = {
|
|
236
|
+
blockText,
|
|
237
|
+
redactText
|
|
175
238
|
};
|
|
176
239
|
function blockText(options) {
|
|
177
240
|
return textPatternGuardrail(options, "block");
|
|
@@ -240,73 +303,18 @@ function replaceTextPattern(text, pattern, replacement) {
|
|
|
240
303
|
const globalFlags = flags.includes("g") ? flags : `${flags}g`;
|
|
241
304
|
return text.replace(new RegExp(pattern.source, globalFlags), replacement);
|
|
242
305
|
}
|
|
243
|
-
function textFromMessage(message) {
|
|
244
|
-
if (message.role === "system") {
|
|
245
|
-
return message.content;
|
|
246
|
-
}
|
|
247
|
-
if (typeof message.content === "string") {
|
|
248
|
-
return message.content;
|
|
249
|
-
}
|
|
250
|
-
return message.content.flatMap((content) => {
|
|
251
|
-
if (content.type === "text") {
|
|
252
|
-
return [content.text];
|
|
253
|
-
}
|
|
254
|
-
if (content.type === "file" && content.data.type === "text") {
|
|
255
|
-
return [content.data.text];
|
|
256
|
-
}
|
|
257
|
-
if (content.type === "tool-result") {
|
|
258
|
-
return textFromToolResult(content.output);
|
|
259
|
-
}
|
|
260
|
-
return [];
|
|
261
|
-
}).join("\n");
|
|
262
|
-
}
|
|
263
|
-
function rewriteMessageText(message, text) {
|
|
264
|
-
if (message.role === "system") {
|
|
265
|
-
return { ...message, content: text };
|
|
266
|
-
}
|
|
267
|
-
if (message.role === "user") {
|
|
268
|
-
const content = typeof message.content === "string" ? [] : message.content;
|
|
269
|
-
return {
|
|
270
|
-
...message,
|
|
271
|
-
content: [
|
|
272
|
-
{ type: "text", text },
|
|
273
|
-
...content.filter(
|
|
274
|
-
(item) => item.type !== "text" && !(item.type === "file" && item.data.type === "text")
|
|
275
|
-
)
|
|
276
|
-
]
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
if (message.role === "assistant") {
|
|
280
|
-
return { ...message, content: [{ type: "text", text }] };
|
|
281
|
-
}
|
|
282
|
-
return message;
|
|
283
|
-
}
|
|
284
|
-
function textFromToolResult(output) {
|
|
285
|
-
switch (output.type) {
|
|
286
|
-
case "text":
|
|
287
|
-
case "error-text":
|
|
288
|
-
return [output.value];
|
|
289
|
-
case "json":
|
|
290
|
-
case "error-json":
|
|
291
|
-
return [JSON.stringify(output.value)];
|
|
292
|
-
case "content":
|
|
293
|
-
return output.value.flatMap((part) => part.type === "text" ? [part.text] : []);
|
|
294
|
-
case "execution-denied":
|
|
295
|
-
return output.reason === void 0 ? [] : [output.reason];
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
306
|
|
|
299
307
|
export {
|
|
308
|
+
allow,
|
|
309
|
+
block,
|
|
300
310
|
defineGuardrailPolicy,
|
|
301
311
|
defineInputGuardrail,
|
|
302
312
|
defineOutputGuardrail,
|
|
303
|
-
allow,
|
|
304
|
-
block,
|
|
305
|
-
guardrails,
|
|
306
313
|
normalizeGuardrailPolicies,
|
|
307
314
|
appendGuardrailPolicies,
|
|
308
315
|
hasEnforcedOutputGuardrails,
|
|
309
316
|
runInputGuardrails,
|
|
310
|
-
runOutputGuardrails
|
|
317
|
+
runOutputGuardrails,
|
|
318
|
+
guardrails
|
|
311
319
|
};
|
|
312
|
-
//# sourceMappingURL=chunk-
|
|
320
|
+
//# sourceMappingURL=chunk-AZB6N7P4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/guardrails/actions.ts","../src/guardrails/policy.ts","../src/guardrails/message.ts","../src/guardrails/runtime.ts","../src/guardrails/text.ts"],"sourcesContent":["import type {\n GuardrailActionBase,\n GuardrailAllow,\n GuardrailBlock,\n GuardrailCommonActions,\n InputGuardrailActions,\n OutputGuardrailActions,\n} from \"./types\";\n\nexport function allow(options: GuardrailActionBase = {}): GuardrailAllow {\n return { action: \"allow\", ...options };\n}\n\nexport function block(options: Omit<GuardrailBlock, \"action\">): GuardrailBlock {\n return { action: \"block\", ...options };\n}\n\nconst commonActions: GuardrailCommonActions = {\n allow,\n block,\n};\n\nexport const inputActions: InputGuardrailActions = {\n ...commonActions,\n rewrite(options) {\n return { action: \"rewrite\", ...options };\n },\n};\n\nexport const outputActions: OutputGuardrailActions = {\n ...commonActions,\n rewrite(options) {\n return { action: \"rewrite\", ...options };\n },\n};\n","import type {\n GuardrailPolicy,\n GuardrailPolicyInput,\n GuardrailPolicyOptions,\n InputGuardrail,\n OutputGuardrail,\n} from \"./types\";\n\nexport function defineGuardrailPolicy(options: GuardrailPolicyOptions): GuardrailPolicy {\n return {\n id: options.id,\n mode: options.mode ?? \"enforce\",\n input: options.input ?? [],\n output: options.output ?? [],\n };\n}\n\nexport function defineInputGuardrail(guardrail: InputGuardrail): InputGuardrail {\n return guardrail;\n}\n\nexport function defineOutputGuardrail(guardrail: OutputGuardrail): OutputGuardrail {\n return guardrail;\n}\n\nexport function normalizeGuardrailPolicies(\n policies: GuardrailPolicyInput | undefined,\n): GuardrailPolicy[] {\n if (policies === undefined) {\n return [];\n }\n return Array.isArray(policies) ? policies : [policies];\n}\n\nexport function appendGuardrailPolicies(\n current: GuardrailPolicy[],\n next: GuardrailPolicyInput,\n): GuardrailPolicy[] {\n return [...current, ...normalizeGuardrailPolicies(next)];\n}\n\nexport function hasEnforcedOutputGuardrails(policies: GuardrailPolicy[]): boolean {\n return policies.some((policy) => policy.mode === \"enforce\" && policy.output.length > 0);\n}\n","import type { Message, ToolResultPart } from \"../completion\";\n\nexport function textFromMessage(message: Message): string {\n if (message.role === \"system\") {\n return message.content;\n }\n if (typeof message.content === \"string\") {\n return message.content;\n }\n return message.content\n .flatMap((content) => {\n if (content.type === \"text\") {\n return [content.text];\n }\n if (content.type === \"file\" && content.data.type === \"text\") {\n return [content.data.text];\n }\n if (content.type === \"tool-result\") {\n return textFromToolResult(content.output);\n }\n return [];\n })\n .join(\"\\n\");\n}\n\nexport function rewriteMessageText(message: Message, text: string): Message {\n if (message.role === \"system\") {\n return { ...message, content: text };\n }\n if (message.role === \"user\") {\n const content = typeof message.content === \"string\" ? [] : message.content;\n return {\n ...message,\n content: [\n { type: \"text\", text },\n ...content.filter(\n (item) => item.type !== \"text\" && !(item.type === \"file\" && item.data.type === \"text\"),\n ),\n ],\n };\n }\n if (message.role === \"assistant\") {\n return { ...message, content: [{ type: \"text\", text }] };\n }\n return message;\n}\n\nfunction textFromToolResult(output: ToolResultPart[\"output\"]): string[] {\n switch (output.type) {\n case \"text\":\n case \"error-text\":\n return [output.value];\n case \"json\":\n case \"error-json\":\n return [JSON.stringify(output.value)];\n case \"content\":\n return output.value.flatMap((part) => (part.type === \"text\" ? [part.text] : []));\n case \"execution-denied\":\n return output.reason === undefined ? [] : [output.reason];\n }\n}\n","import type { MaybePromise } from \"../internal/type-utils\";\nimport { allow, inputActions, outputActions } from \"./actions\";\nimport { rewriteMessageText, textFromMessage } from \"./message\";\nimport type {\n GuardrailActionBase,\n GuardrailActionName,\n GuardrailAllow,\n GuardrailBlock,\n GuardrailBoundary,\n GuardrailDecisionRecord,\n GuardrailPolicy,\n InputGuardrailContext,\n InputGuardrailRunResult,\n OutputGuardrailContext,\n OutputGuardrailRunResult,\n} from \"./types\";\n\nexport async function runInputGuardrails(\n policies: GuardrailPolicy[],\n context: InputGuardrailContext,\n): Promise<InputGuardrailRunResult> {\n let prompt = context.prompt;\n let inputText = context.inputText;\n const decisions: GuardrailDecisionRecord[] = [];\n\n for (const policy of policies) {\n for (const guardrail of policy.input) {\n const currentContext = { ...context, prompt, inputText };\n const result = await runGuardrail(policy, guardrail.id, \"input\", () =>\n guardrail.check(currentContext, inputActions),\n );\n decisions.push(result.decision);\n\n if (policy.mode === \"observe\") {\n continue;\n }\n if (result.action.action === \"block\") {\n return {\n prompt,\n inputText,\n blocked: true,\n message: result.action.message,\n decisions,\n };\n }\n if (result.action.action === \"rewrite\") {\n if (result.action.prompt !== undefined) {\n prompt = result.action.prompt;\n inputText = textFromMessage(prompt);\n } else if (result.action.inputText !== undefined) {\n inputText = result.action.inputText;\n prompt = rewriteMessageText(prompt, inputText);\n }\n }\n }\n }\n\n return { prompt, inputText, blocked: false, decisions };\n}\n\nexport async function runOutputGuardrails(\n policies: GuardrailPolicy[],\n context: OutputGuardrailContext,\n): Promise<OutputGuardrailRunResult> {\n let outputText = context.outputText;\n const decisions: GuardrailDecisionRecord[] = [];\n\n for (const policy of policies) {\n for (const guardrail of policy.output) {\n const currentContext = { ...context, outputText };\n const result = await runGuardrail(policy, guardrail.id, \"output\", () =>\n guardrail.check(currentContext, outputActions),\n );\n decisions.push(result.decision);\n\n if (policy.mode === \"observe\") {\n continue;\n }\n if (result.action.action === \"block\") {\n return {\n outputText,\n blocked: true,\n message: result.action.message,\n decisions,\n };\n }\n if (result.action.action === \"rewrite\") {\n outputText = result.action.outputText;\n }\n }\n }\n\n return { outputText, blocked: false, decisions };\n}\n\ntype RunGuardrailResult<TAction extends { action: GuardrailActionName }> = {\n action: TAction;\n decision: GuardrailDecisionRecord;\n};\n\nasync function runGuardrail<TAction extends { action: GuardrailActionName } & GuardrailActionBase>(\n policy: GuardrailPolicy,\n guardrailId: string,\n boundary: GuardrailBoundary,\n run: () => MaybePromise<TAction | undefined>,\n): Promise<RunGuardrailResult<TAction | GuardrailAllow>> {\n const startedAt = Date.now();\n try {\n const action = (await run()) ?? allow();\n return {\n action,\n decision: decisionRecord({\n policy,\n guardrailId,\n boundary,\n action,\n latencyMs: Date.now() - startedAt,\n }),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (policy.mode === \"observe\") {\n return {\n action: allow(),\n decision: {\n policyId: policy.id,\n guardrailId,\n boundary,\n mode: policy.mode,\n action: \"error\",\n applied: false,\n reason: message,\n latencyMs: Date.now() - startedAt,\n },\n };\n }\n throw error;\n }\n}\n\nfunction decisionRecord(args: {\n policy: GuardrailPolicy;\n guardrailId: string;\n boundary: GuardrailBoundary;\n action: GuardrailAllow | GuardrailBlock | ({ action: GuardrailActionName } & GuardrailActionBase);\n latencyMs: number;\n}): GuardrailDecisionRecord {\n const applied = args.policy.mode === \"enforce\" && args.action.action !== \"allow\";\n const record: GuardrailDecisionRecord = {\n policyId: args.policy.id,\n guardrailId: args.guardrailId,\n boundary: args.boundary,\n mode: args.policy.mode,\n action: args.action.action,\n applied,\n latencyMs: args.latencyMs,\n };\n if (args.action.reason !== undefined) record.reason = args.action.reason;\n if (\"message\" in args.action && typeof args.action.message === \"string\") {\n record.message = args.action.message;\n }\n if (args.action.metadata !== undefined) record.metadata = args.action.metadata;\n return record;\n}\n","import { allow, block } from \"./actions\";\nimport { defineInputGuardrail, defineOutputGuardrail } from \"./policy\";\nimport type { GuardrailAllow, GuardrailBlock, InputGuardrail, OutputGuardrail } from \"./types\";\n\nexport const guardrails = {\n blockText,\n redactText,\n};\n\ntype TextPatternBoundary = \"input\" | \"output\";\n\ntype TextPatternGuardrailFor<Boundary extends TextPatternBoundary> = Boundary extends \"input\"\n ? InputGuardrail\n : OutputGuardrail;\n\ntype TextPatternGuardrailOptions<Boundary extends TextPatternBoundary = TextPatternBoundary> = {\n id: string;\n boundary: Boundary;\n patterns: Array<string | RegExp>;\n reason: string;\n message?: string | undefined;\n};\n\ntype TextPatternRedactOptions<Boundary extends TextPatternBoundary = TextPatternBoundary> =\n TextPatternGuardrailOptions<Boundary> & { replacement?: string | undefined };\n\nfunction blockText<Boundary extends TextPatternBoundary>(\n options: TextPatternGuardrailOptions<Boundary>,\n): TextPatternGuardrailFor<Boundary> {\n return textPatternGuardrail(options, \"block\");\n}\n\nfunction redactText<Boundary extends TextPatternBoundary>(\n options: TextPatternRedactOptions<Boundary>,\n): TextPatternGuardrailFor<Boundary> {\n return textPatternGuardrail(options, \"rewrite\");\n}\n\nfunction textPatternGuardrail<Boundary extends TextPatternBoundary>(\n options: TextPatternRedactOptions<Boundary>,\n action: \"block\" | \"rewrite\",\n): TextPatternGuardrailFor<Boundary> {\n if (options.boundary === \"input\") {\n return defineInputGuardrail({\n id: options.id,\n check(ctx, actions) {\n return textPatternAction(ctx.inputText, options, action, (value) =>\n actions.rewrite({ inputText: value, reason: options.reason }),\n );\n },\n }) as TextPatternGuardrailFor<Boundary>;\n }\n return defineOutputGuardrail({\n id: options.id,\n check(ctx, actions) {\n return textPatternAction(ctx.outputText, options, action, (value) =>\n actions.rewrite({ outputText: value, reason: options.reason }),\n );\n },\n }) as TextPatternGuardrailFor<Boundary>;\n}\n\nfunction textPatternAction<TRewrite>(\n text: string,\n options: TextPatternGuardrailOptions & { replacement?: string | undefined },\n action: \"block\" | \"rewrite\",\n rewrite: (value: string) => TRewrite,\n): GuardrailAllow | GuardrailBlock | TRewrite {\n const matched = options.patterns.some((pattern) => textPatternMatches(text, pattern));\n if (!matched) {\n return allow();\n }\n if (action === \"block\") {\n return block({\n reason: options.reason,\n message: options.message,\n });\n }\n let current = text;\n for (const pattern of options.patterns) {\n current = replaceTextPattern(current, pattern, options.replacement ?? \"[redacted]\");\n }\n return rewrite(current);\n}\n\nfunction textPatternMatches(text: string, pattern: string | RegExp): boolean {\n if (typeof pattern === \"string\") {\n return text.includes(pattern);\n }\n pattern.lastIndex = 0;\n const matched = pattern.test(text);\n pattern.lastIndex = 0;\n return matched;\n}\n\nfunction replaceTextPattern(text: string, pattern: string | RegExp, replacement: string): string {\n if (typeof pattern === \"string\") {\n return text.split(pattern).join(replacement);\n }\n pattern.lastIndex = 0;\n const flags = pattern.flags.replace(\"y\", \"\");\n const globalFlags = flags.includes(\"g\") ? flags : `${flags}g`;\n return text.replace(new RegExp(pattern.source, globalFlags), replacement);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
parseMessage,
|
|
4
4
|
parseMessages,
|
|
5
5
|
toProviderJsonSchema
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-PK5LKOFL.js";
|
|
7
7
|
import {
|
|
8
8
|
abortError,
|
|
9
9
|
resolveRetryOptions,
|
|
@@ -112,13 +112,14 @@ function getAssistantGenerationMetadata(message) {
|
|
|
112
112
|
if (!isJsonObjectValue(generation) || typeof generation.provider !== "string" || typeof generation.modelId !== "string" || !isUsageValue(generation.usage)) {
|
|
113
113
|
return void 0;
|
|
114
114
|
}
|
|
115
|
+
let usage = { ...generation.usage };
|
|
116
|
+
if (generation.usage.details !== void 0) {
|
|
117
|
+
usage = { ...usage, details: { ...generation.usage.details } };
|
|
118
|
+
}
|
|
115
119
|
const metadata = {
|
|
116
120
|
provider: generation.provider,
|
|
117
121
|
modelId: generation.modelId,
|
|
118
|
-
usage
|
|
119
|
-
...generation.usage,
|
|
120
|
-
...generation.usage.details === void 0 ? {} : { details: { ...generation.usage.details } }
|
|
121
|
-
}
|
|
122
|
+
usage
|
|
122
123
|
};
|
|
123
124
|
if (isContextUsageValue(generation.contextUsage)) {
|
|
124
125
|
metadata.contextUsage = {
|
|
@@ -133,10 +134,13 @@ function getAssistantGenerationMetadata(message) {
|
|
|
133
134
|
metadata.sources = generation.sources.map((source) => ({ ...source }));
|
|
134
135
|
}
|
|
135
136
|
if (isProviderToolCallArray(generation.providerToolCalls)) {
|
|
136
|
-
metadata.providerToolCalls = generation.providerToolCalls.map((toolCall) =>
|
|
137
|
-
...toolCall
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
metadata.providerToolCalls = generation.providerToolCalls.map((toolCall) => {
|
|
138
|
+
let copy = { ...toolCall };
|
|
139
|
+
if (toolCall.details !== void 0) {
|
|
140
|
+
copy = { ...copy, details: { ...toolCall.details } };
|
|
141
|
+
}
|
|
142
|
+
return copy;
|
|
143
|
+
});
|
|
140
144
|
}
|
|
141
145
|
return metadata;
|
|
142
146
|
}
|
|
@@ -258,8 +262,10 @@ function requestHasFileDocumentInput(request) {
|
|
|
258
262
|
// src/internal/completion-request.ts
|
|
259
263
|
function createCompletionRequest(input, options) {
|
|
260
264
|
const configuredTools = options.tools ?? [];
|
|
265
|
+
const chatHistory = messagesFromInput(input);
|
|
266
|
+
assertNoAgentInteractionParts(chatHistory);
|
|
261
267
|
const request = {
|
|
262
|
-
chatHistory
|
|
268
|
+
chatHistory,
|
|
263
269
|
documents: [...options.documents ?? []],
|
|
264
270
|
tools: configuredTools.filter((tool) => !isProviderTool(tool))
|
|
265
271
|
};
|
|
@@ -275,6 +281,15 @@ function createCompletionRequest(input, options) {
|
|
|
275
281
|
if (options.providerOptions !== void 0) request.providerOptions = options.providerOptions;
|
|
276
282
|
return request;
|
|
277
283
|
}
|
|
284
|
+
function assertNoAgentInteractionParts(messages) {
|
|
285
|
+
for (const message of messages) {
|
|
286
|
+
if (message.role === "tool" && message.content.some((part) => part.type !== "tool-result")) {
|
|
287
|
+
throw new TypeError(
|
|
288
|
+
"Completion messages contain an unresolved Agent interaction response. Resume the Agent with its continuation instead of sending interaction parts directly to a provider."
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
278
293
|
function messagesFromInput(input) {
|
|
279
294
|
if (typeof input === "string") {
|
|
280
295
|
return [{ role: "user", content: input }];
|
|
@@ -497,4 +512,4 @@ export {
|
|
|
497
512
|
streamCompletion,
|
|
498
513
|
isStreamingCompletionModel
|
|
499
514
|
};
|
|
500
|
-
//# sourceMappingURL=chunk-
|
|
515
|
+
//# sourceMappingURL=chunk-D2ECOWN5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/completion/types.ts","../src/internal/completion-request.ts","../src/completion/generate-completion.ts"],"sourcesContent":["import type { ModelCallOptions } from \"../model-call-options\";\nimport { isJsonValue } from \"./json\";\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\nexport type JsonObject = { [key: string]: JsonValue | undefined };\n\nexport type Document = {\n id: string;\n text: string;\n additionalProps?: Record<string, string>;\n};\n\nexport type TextPart = Readonly<{\n type: \"text\";\n text: string;\n signature?: string;\n}>;\n\nexport type ImageDetail = \"auto\" | \"low\" | \"high\";\n\nexport type FileData =\n | Readonly<{ type: \"url\"; url: string }>\n | Readonly<{ type: \"data\"; data: string }>\n | Readonly<{ type: \"text\"; text: string }>;\n\nexport type ImagePart = Readonly<{\n type: \"image\";\n image: Exclude<FileData, Readonly<{ type: \"text\"; text: string }>>;\n mediaType?: string;\n detail?: ImageDetail;\n}>;\n\nexport type FilePart = Readonly<{\n type: \"file\";\n data: FileData;\n mediaType: string;\n filename?: string;\n}>;\n\nexport type ReasoningPart = Readonly<{\n type: \"reasoning\";\n text: string;\n id?: string;\n details?: readonly ReasoningDetail[];\n}>;\n\nexport type ReasoningDetail =\n | Readonly<{\n type: \"text\";\n text: string;\n signature?: string;\n }>\n | Readonly<{\n type: \"summary\";\n text: string;\n }>\n | Readonly<{\n type: \"encrypted\";\n data: string;\n }>\n | Readonly<{\n type: \"redacted\";\n data: string;\n }>;\n\nexport type ReasoningContentType = ReasoningDetail[\"type\"];\n\nexport type ToolCallPart = Readonly<{\n type: \"tool-call\";\n toolCallId: string;\n callId?: string;\n toolName: string;\n input: JsonValue;\n signature?: string;\n}>;\n\nexport type ToolResultContentPart = TextPart | FilePart;\n\nexport type ToolResultOutput =\n | Readonly<{ type: \"text\"; value: string }>\n | Readonly<{ type: \"json\"; value: JsonValue }>\n | Readonly<{ type: \"content\"; value: readonly ToolResultContentPart[] }>\n | Readonly<{ type: \"execution-denied\"; reason?: string }>\n | Readonly<{ type: \"error-text\"; value: string }>\n | Readonly<{ type: \"error-json\"; value: JsonValue }>;\n\nexport type ToolResultPart = Readonly<{\n type: \"tool-result\";\n toolCallId: string;\n callId?: string;\n toolName: string;\n output: ToolResultOutput;\n}>;\n\nexport type ToolApprovalResponsePart = Readonly<{\n type: \"tool-approval-response\";\n interactionId: string;\n toolCallId: string;\n callId?: string;\n toolName: string;\n approved: boolean;\n reason?: string;\n}>;\n\nexport type ToolQuestionAnswer = Readonly<{\n questionId: string;\n value: string;\n}>;\n\nexport type ToolQuestionResponsePart = Readonly<{\n type: \"tool-question-response\";\n interactionId: string;\n toolCallId: string;\n callId?: string;\n toolName: string;\n answers: readonly ToolQuestionAnswer[];\n}>;\n\nexport type ToolInteractionResponsePart = ToolApprovalResponsePart | ToolQuestionResponsePart;\n\nexport type UserContentPart = TextPart | ImagePart | FilePart;\nexport type AssistantContentPart = TextPart | ImagePart | FilePart | ReasoningPart | ToolCallPart;\n\nexport type SystemMessage<Metadata extends JsonObject = JsonObject> = Readonly<{\n role: \"system\";\n content: string;\n metadata?: Metadata;\n}>;\n\nexport type UserMessage<Metadata extends JsonObject = JsonObject> = Readonly<{\n role: \"user\";\n content: string | readonly UserContentPart[];\n metadata?: Metadata;\n}>;\n\nexport type AssistantMessage<Metadata extends JsonObject = JsonObject> = Readonly<{\n role: \"assistant\";\n id?: string;\n content: string | readonly AssistantContentPart[];\n metadata?: Metadata;\n}>;\n\nexport type ToolMessage<Metadata extends JsonObject = JsonObject> = Readonly<{\n role: \"tool\";\n content: readonly (ToolResultPart | ToolInteractionResponsePart)[];\n metadata?: Metadata;\n}>;\n\nexport type Message<Metadata extends JsonObject = JsonObject> =\n | SystemMessage<Metadata>\n | UserMessage<Metadata>\n | AssistantMessage<Metadata>\n | ToolMessage<Metadata>;\n\nexport function reasoningDisplayText(\n reasoning: ReasoningPart | readonly ReasoningDetail[],\n): string {\n const details = \"type\" in reasoning ? reasoning.details : reasoning;\n if (details === undefined) {\n return \"type\" in reasoning ? reasoning.text : \"\";\n }\n return details\n .flatMap((item) => {\n if (item.type === \"text\" || item.type === \"summary\") {\n return [item.text];\n }\n return [];\n })\n .join(\"\");\n}\n\nexport type ToolChoice =\n | \"auto\"\n | \"required\"\n | \"none\"\n | {\n type: \"function\";\n name: string;\n };\n\nexport type ToolDefinition = {\n name: string;\n description: string;\n parameters: JsonObject;\n};\n\n/**\n * A tool executed by the model provider rather than by Anvia's local tool runtime.\n *\n * Provider packages expose typed factories for these values. Application code can\n * pass them through the same high-level `tools` APIs used for local tools.\n */\nexport type ProviderTool = {\n kind: \"provider\";\n provider: string;\n name: string;\n configuration?: JsonObject;\n};\n\nexport type CompletionTool = ToolDefinition | ProviderTool;\n\nexport function isProviderTool(value: unknown): value is ProviderTool {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const candidate = value as Partial<ProviderTool>;\n return (\n candidate.kind === \"provider\" &&\n typeof candidate.provider === \"string\" &&\n candidate.provider.trim().length > 0 &&\n typeof candidate.name === \"string\" &&\n candidate.name.trim().length > 0 &&\n (candidate.configuration === undefined ||\n (typeof candidate.configuration === \"object\" &&\n candidate.configuration !== null &&\n !Array.isArray(candidate.configuration) &&\n isJsonValue(candidate.configuration)))\n );\n}\n\nexport type CompletionSource = {\n type: \"url\";\n url: string;\n title?: string;\n id?: string;\n startIndex?: number;\n endIndex?: number;\n};\n\nexport type ProviderToolCall = {\n id: string;\n name: string;\n status?: string;\n details?: JsonObject;\n};\n\n/**\n * Provider-normalized, mutually exclusive usage buckets.\n *\n * Every token should appear in exactly one non-total bucket. `total` is the\n * only aggregate key and should equal the sum of the other buckets.\n */\nexport type UsageDetails = Record<string, number>;\n\nexport type Usage = {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n cachedInputTokens: number;\n cacheCreationInputTokens: number;\n details?: UsageDetails;\n};\n\nexport type ModelContextLimits = {\n contextWindow: number;\n maxInputTokens?: number;\n maxOutputTokens?: number;\n};\n\nexport type CompletionModelInfo = {\n modelId: string;\n context: ModelContextLimits;\n};\n\nexport type ContextUsage = {\n model: CompletionModelInfo;\n usedTokens: number;\n remainingTokens: number;\n usedPercent: number;\n remainingPercent: number;\n};\n\nexport function calculateContextUsage(\n usage: Usage,\n model: CompletionModelInfo | undefined,\n): ContextUsage | undefined {\n if (\n model === undefined ||\n !Number.isFinite(usage.inputTokens) ||\n usage.inputTokens <= 0 ||\n !Number.isFinite(model.context.contextWindow) ||\n model.context.contextWindow <= 0\n ) {\n return undefined;\n }\n\n const usedTokens = Math.max(0, usage.inputTokens);\n const remainingTokens = Math.max(0, model.context.contextWindow - usedTokens);\n const usedPercent = Math.min(100, (usedTokens / model.context.contextWindow) * 100);\n return {\n model,\n usedTokens,\n remainingTokens,\n usedPercent,\n remainingPercent: 100 - usedPercent,\n };\n}\n\nexport function withContextUsage<RawResponse>(\n response: CompletionResponse<RawResponse>,\n model: CompletionModelInfo | undefined,\n): CompletionResponse<RawResponse> {\n const contextUsage = calculateContextUsage(response.usage, model);\n return contextUsage === undefined ? response : { ...response, contextUsage };\n}\n\nexport function resolveModelContextLimits(\n modelId: string,\n catalog: Readonly<Record<string, ModelContextLimits>>,\n override?: ModelContextLimits,\n): ModelContextLimits | undefined {\n return override ?? catalog[modelId];\n}\n\nexport type AssistantGenerationMetadata = {\n provider: string;\n modelId: string;\n usage: Usage;\n contextUsage?: ContextUsage;\n sources?: CompletionSource[];\n providerToolCalls?: ProviderToolCall[];\n};\n\nexport const Usage = {\n empty(): Usage {\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n cachedInputTokens: 0,\n cacheCreationInputTokens: 0,\n };\n },\n add(left: Usage, right: Usage): Usage {\n const result: Usage = {\n inputTokens: left.inputTokens + right.inputTokens,\n outputTokens: left.outputTokens + right.outputTokens,\n totalTokens: left.totalTokens + right.totalTokens,\n cachedInputTokens: left.cachedInputTokens + right.cachedInputTokens,\n cacheCreationInputTokens: left.cacheCreationInputTokens + right.cacheCreationInputTokens,\n };\n const details = addUsageDetails(left, right);\n if (details !== undefined) {\n result.details = details;\n }\n return result;\n },\n};\n\nfunction addUsageDetails(left: Usage, right: Usage): UsageDetails | undefined {\n if (isEmptyUsage(left) && left.details === undefined) {\n return right.details === undefined ? undefined : { ...right.details };\n }\n if (isEmptyUsage(right) && right.details === undefined) {\n return left.details === undefined ? undefined : { ...left.details };\n }\n if (left.details === undefined || right.details === undefined) {\n return undefined;\n }\n const details: UsageDetails = { ...left.details };\n for (const [key, value] of Object.entries(right.details)) {\n details[key] = (details[key] ?? 0) + value;\n }\n return details;\n}\n\nfunction isEmptyUsage(usage: Usage): boolean {\n return (\n usage.inputTokens === 0 &&\n usage.outputTokens === 0 &&\n usage.totalTokens === 0 &&\n usage.cachedInputTokens === 0 &&\n usage.cacheCreationInputTokens === 0\n );\n}\n\nexport function getAssistantGenerationMetadata(\n message: Message,\n): AssistantGenerationMetadata | undefined {\n if (message.role !== \"assistant\" || !isJsonObjectValue(message.metadata)) {\n return undefined;\n }\n const frameworkMetadata = message.metadata.anvia;\n if (!isJsonObjectValue(frameworkMetadata)) {\n return undefined;\n }\n const generation = frameworkMetadata.generation;\n if (\n !isJsonObjectValue(generation) ||\n typeof generation.provider !== \"string\" ||\n typeof generation.modelId !== \"string\" ||\n !isUsageValue(generation.usage)\n ) {\n return undefined;\n }\n let usage: Usage = { ...generation.usage };\n if (generation.usage.details !== undefined) {\n usage = { ...usage, details: { ...generation.usage.details } };\n }\n const metadata: AssistantGenerationMetadata = {\n provider: generation.provider,\n modelId: generation.modelId,\n usage,\n };\n if (isContextUsageValue(generation.contextUsage)) {\n metadata.contextUsage = {\n ...generation.contextUsage,\n model: {\n ...generation.contextUsage.model,\n context: { ...generation.contextUsage.model.context },\n },\n };\n }\n if (isCompletionSourceArray(generation.sources)) {\n metadata.sources = generation.sources.map((source) => ({ ...source }));\n }\n if (isProviderToolCallArray(generation.providerToolCalls)) {\n metadata.providerToolCalls = generation.providerToolCalls.map((toolCall) => {\n let copy: ProviderToolCall = { ...toolCall };\n if (toolCall.details !== undefined) {\n copy = { ...copy, details: { ...toolCall.details } };\n }\n return copy;\n });\n }\n return metadata;\n}\n\nfunction isJsonObjectValue(value: JsonValue | undefined): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isContextUsageValue(value: JsonValue | undefined): value is JsonObject & ContextUsage {\n if (!isJsonObjectValue(value) || !isJsonObjectValue(value.model)) {\n return false;\n }\n const context = value.model.context;\n if (\n typeof value.model.modelId === \"string\" &&\n isJsonObjectValue(context) &&\n isPositiveFiniteNumber(context.contextWindow) &&\n isOptionalPositiveFiniteNumber(context.maxInputTokens) &&\n isOptionalPositiveFiniteNumber(context.maxOutputTokens) &&\n isNonnegativeFiniteNumber(value.usedTokens) &&\n isNonnegativeFiniteNumber(value.remainingTokens) &&\n isPercentage(value.usedPercent) &&\n isPercentage(value.remainingPercent)\n ) {\n const contextWindow = context.contextWindow;\n const remainingTokens = Math.max(0, contextWindow - value.usedTokens);\n const usedPercent = Math.min(100, (value.usedTokens / contextWindow) * 100);\n const remainingPercent = (remainingTokens / contextWindow) * 100;\n return (\n value.remainingTokens === remainingTokens &&\n approximatelyEqual(value.usedPercent, usedPercent) &&\n approximatelyEqual(value.remainingPercent, remainingPercent)\n );\n }\n return false;\n}\n\nfunction approximatelyEqual(left: number, right: number): boolean {\n const scale = Math.max(1, Math.abs(left), Math.abs(right));\n return Math.abs(left - right) <= Number.EPSILON * scale * 8;\n}\n\nfunction isPositiveFiniteNumber(value: JsonValue | undefined): value is number {\n return isNonnegativeFiniteNumber(value) && value > 0;\n}\n\nfunction isOptionalPositiveFiniteNumber(value: JsonValue | undefined): boolean {\n return value === undefined || isPositiveFiniteNumber(value);\n}\n\nfunction isPercentage(value: JsonValue | undefined): value is number {\n return isNonnegativeFiniteNumber(value) && value <= 100;\n}\n\nfunction isUsageValue(value: JsonValue | undefined): value is JsonObject & Usage {\n if (!isJsonObjectValue(value)) {\n return false;\n }\n return (\n isNonnegativeFiniteNumber(value.inputTokens) &&\n isNonnegativeFiniteNumber(value.outputTokens) &&\n isNonnegativeFiniteNumber(value.totalTokens) &&\n isNonnegativeFiniteNumber(value.cachedInputTokens) &&\n isNonnegativeFiniteNumber(value.cacheCreationInputTokens) &&\n isUsageDetailsValue(value.details)\n );\n}\n\nfunction isNonnegativeFiniteNumber(value: JsonValue | undefined): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n}\n\nfunction isUsageDetailsValue(value: JsonValue | undefined): value is JsonObject | undefined {\n if (value === undefined) {\n return true;\n }\n if (!isJsonObjectValue(value)) {\n return false;\n }\n let total: number | undefined;\n let bucketSum = 0;\n for (const [key, detail] of Object.entries(value)) {\n if (detail === undefined || !isNonnegativeFiniteNumber(detail)) {\n return false;\n }\n if (key === \"total\") {\n total = detail;\n } else {\n bucketSum += detail;\n }\n }\n return total !== undefined && total === bucketSum;\n}\n\nfunction isCompletionSourceArray(value: JsonValue | undefined): value is CompletionSource[] {\n return (\n Array.isArray(value) &&\n value.every(\n (source) =>\n isJsonObjectValue(source) &&\n source.type === \"url\" &&\n typeof source.url === \"string\" &&\n (source.title === undefined || typeof source.title === \"string\") &&\n (source.id === undefined || typeof source.id === \"string\") &&\n (source.startIndex === undefined || typeof source.startIndex === \"number\") &&\n (source.endIndex === undefined || typeof source.endIndex === \"number\"),\n )\n );\n}\n\nfunction isProviderToolCallArray(value: JsonValue | undefined): value is ProviderToolCall[] {\n return (\n Array.isArray(value) &&\n value.every(\n (toolCall) =>\n isJsonObjectValue(toolCall) &&\n typeof toolCall.id === \"string\" &&\n typeof toolCall.name === \"string\" &&\n (toolCall.status === undefined || typeof toolCall.status === \"string\") &&\n (toolCall.details === undefined || isJsonObjectValue(toolCall.details)),\n )\n );\n}\n\nexport type CompletionRequest = {\n instructions?: string;\n chatHistory: Message[];\n documents: Document[];\n tools: ToolDefinition[];\n providerTools?: ProviderTool[];\n temperature?: number;\n maxTokens?: number;\n toolChoice?: ToolChoice;\n providerOptions?: JsonObject;\n outputSchema?: JsonObject;\n};\n\nexport type CompletionResponse<RawResponse = unknown> = {\n choice: AssistantContentPart[];\n usage: Usage;\n contextUsage?: ContextUsage;\n rawResponse: RawResponse;\n messageId?: string;\n sources?: CompletionSource[];\n providerToolCalls?: ProviderToolCall[];\n};\n\nexport type CompletionResult<Output = string, RawResponse = unknown> = {\n output: Output;\n text: string;\n content: readonly AssistantContentPart[];\n usage: Usage;\n contextUsage?: ContextUsage;\n rawResponse: RawResponse;\n messageId?: string;\n sources?: readonly CompletionSource[];\n providerToolCalls?: readonly ProviderToolCall[];\n};\n\nexport type CompletionModelCapabilities = {\n streaming: boolean;\n tools: boolean;\n toolChoice: boolean;\n imageInput: boolean;\n documentInput: boolean;\n outputSchema: boolean;\n reasoning: boolean;\n providerTools?: boolean;\n};\n\nexport interface CompletionModel<RawResponse = unknown> {\n readonly provider: string;\n readonly modelId: string;\n readonly contextLimits?: ModelContextLimits | undefined;\n readonly capabilities: CompletionModelCapabilities;\n traceRequest?(\n request: CompletionRequest,\n options?: { stream?: boolean | undefined },\n ): JsonObject | undefined;\n completion(\n request: CompletionRequest,\n options?: ModelCallOptions,\n ): Promise<CompletionResponse<RawResponse>>;\n}\n\nexport type ToolCallArgumentsMode = \"append\" | \"replace\";\n\nexport type CompletionStreamPart =\n | {\n type: \"text_delta\";\n delta: string;\n }\n | {\n type: \"reasoning_delta\";\n delta: string;\n id?: string;\n contentType?: ReasoningContentType;\n signature?: string;\n }\n | {\n type: \"tool_call_delta\";\n id: string;\n callId?: string;\n name?: string;\n argumentsDelta?: string;\n argumentsMode?: ToolCallArgumentsMode;\n signature?: string;\n }\n | {\n type: \"tool_call\";\n toolCall: ToolCallPart;\n }\n | {\n type: \"source\";\n source: CompletionSource;\n }\n | {\n type: \"provider_tool_call\";\n toolCall: ProviderToolCall;\n }\n | {\n type: \"message_id\";\n id: string;\n };\n\nexport type CompletionModelStreamEvent<RawResponse = unknown> =\n | CompletionStreamPart\n | {\n type: \"final\";\n response: CompletionResponse<RawResponse>;\n }\n | {\n type: \"error\";\n error: unknown;\n usage?: Usage;\n };\n\nexport type CompletionStreamEvent<Output = string, RawResponse = unknown> =\n | CompletionStreamPart\n | {\n type: \"final\";\n result: CompletionResult<Output, RawResponse>;\n }\n | {\n type: \"error\";\n error: unknown;\n usage: Usage;\n };\n\nexport interface StreamingCompletionModel<RawResponse = unknown>\n extends CompletionModel<RawResponse> {\n streamCompletion(\n request: CompletionRequest,\n options?: ModelCallOptions,\n ): AsyncIterable<CompletionModelStreamEvent<RawResponse>>;\n}\n\nexport class CompletionCapabilityError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CompletionCapabilityError\";\n }\n}\n\nexport function assertCompletionRequestSupported(\n model: CompletionModel,\n request: CompletionRequest,\n options: { streaming?: boolean | undefined } = {},\n): void {\n const modelLabel = `${model.provider}:${model.modelId}`;\n const capabilities = model.capabilities;\n\n if (options.streaming === true && !capabilities.streaming) {\n throw new CompletionCapabilityError(`${modelLabel} does not support streaming completions.`);\n }\n\n if (request.tools.length > 0 && !capabilities.tools) {\n throw new CompletionCapabilityError(`${modelLabel} does not support tool definitions.`);\n }\n\n if ((request.providerTools?.length ?? 0) > 0 && capabilities.providerTools !== true) {\n throw new CompletionCapabilityError(`${modelLabel} does not support provider-executed tools.`);\n }\n\n if (request.toolChoice !== undefined && !capabilities.toolChoice) {\n throw new CompletionCapabilityError(`${modelLabel} does not support tool choice.`);\n }\n\n if (request.outputSchema !== undefined && !capabilities.outputSchema) {\n throw new CompletionCapabilityError(`${modelLabel} does not support output schemas.`);\n }\n\n if (!capabilities.imageInput && requestHasImageInput(request)) {\n throw new CompletionCapabilityError(`${modelLabel} does not support image input.`);\n }\n\n if (!capabilities.documentInput && requestHasFileDocumentInput(request)) {\n throw new CompletionCapabilityError(`${modelLabel} does not support document file input.`);\n }\n}\n\nexport function textFromAssistantContent(content: readonly AssistantContentPart[]): string {\n return content.flatMap((item) => (item.type === \"text\" ? [item.text] : [])).join(\"\\n\");\n}\n\nfunction requestHasImageInput(request: CompletionRequest): boolean {\n return request.chatHistory.some((message) =>\n message.role === \"system\" || typeof message.content === \"string\"\n ? false\n : message.content.some((content) => content.type === \"image\"),\n );\n}\n\nfunction requestHasFileDocumentInput(request: CompletionRequest): boolean {\n return request.chatHistory.some((message) =>\n message.role === \"user\" && typeof message.content !== \"string\"\n ? message.content.some((content) => content.type === \"file\" && content.data.type !== \"text\")\n : false,\n );\n}\n","import { parseMessage, parseMessages } from \"../completion/message-schema\";\nimport type {\n CompletionRequest,\n CompletionTool,\n Document,\n JsonObject,\n Message as MessageType,\n ToolChoice,\n ToolDefinition,\n} from \"../completion/types\";\nimport { isProviderTool } from \"../completion/types\";\n\nexport type CompletionRequestOptions = {\n instructions?: string | undefined;\n documents?: readonly Document[] | undefined;\n tools?: readonly CompletionTool[] | undefined;\n temperature?: number | undefined;\n maxTokens?: number | undefined;\n toolChoice?: ToolChoice | undefined;\n outputSchema?: JsonObject | undefined;\n providerOptions?: JsonObject | undefined;\n};\n\nexport function createCompletionRequest(\n input: string | MessageType | readonly MessageType[],\n options: CompletionRequestOptions,\n): CompletionRequest {\n const configuredTools = options.tools ?? [];\n const chatHistory = messagesFromInput(input);\n assertNoAgentInteractionParts(chatHistory);\n const request: CompletionRequest = {\n chatHistory,\n documents: [...(options.documents ?? [])],\n tools: configuredTools.filter((tool): tool is ToolDefinition => !isProviderTool(tool)),\n };\n const providerTools = configuredTools.filter(isProviderTool);\n\n if (providerTools.length > 0) request.providerTools = providerTools;\n if (options.instructions !== undefined && options.instructions.length > 0) {\n request.instructions = options.instructions;\n }\n if (options.temperature !== undefined) request.temperature = options.temperature;\n if (options.maxTokens !== undefined) request.maxTokens = options.maxTokens;\n if (options.toolChoice !== undefined) request.toolChoice = options.toolChoice;\n if (options.outputSchema !== undefined) request.outputSchema = options.outputSchema;\n if (options.providerOptions !== undefined) request.providerOptions = options.providerOptions;\n\n return request;\n}\n\nfunction assertNoAgentInteractionParts(messages: readonly MessageType[]): void {\n for (const message of messages) {\n if (message.role === \"tool\" && message.content.some((part) => part.type !== \"tool-result\")) {\n throw new TypeError(\n \"Completion messages contain an unresolved Agent interaction response. Resume the Agent with its continuation instead of sending interaction parts directly to a provider.\",\n );\n }\n }\n}\n\nfunction messagesFromInput(input: string | MessageType | readonly MessageType[]): MessageType[] {\n if (typeof input === \"string\") {\n return [{ role: \"user\", content: input }];\n }\n if (Array.isArray(input)) {\n if (input.length === 0) {\n throw new Error(\"input must contain at least one Message.\");\n }\n return parseMessages(input);\n }\n return [parseMessage(input)];\n}\n","import { abortError, throwIfAborted } from \"../internal/abort\";\nimport { createCompletionRequest } from \"../internal/completion-request\";\nimport type { ModelCallOptions } from \"../model-call-options\";\nimport {\n type ResolvedRetryOptions,\n type RetrySetting,\n resolveRetryOptions,\n retryDelayMs,\n retryOptionsForFailure,\n runWithRetries,\n waitForRetry,\n} from \"../retry\";\nimport { toProviderJsonSchema, type ZodSchema } from \"../schema/zod-schema\";\nimport type {\n CompletionModel,\n CompletionModelStreamEvent,\n CompletionRequest,\n CompletionResponse,\n CompletionResult,\n CompletionStreamEvent,\n CompletionTool,\n Document,\n JsonObject,\n Message as MessageType,\n StreamingCompletionModel,\n ToolChoice,\n} from \"./types\";\nimport { assertCompletionRequestSupported, textFromAssistantContent, Usage } from \"./types\";\n\nexport type CompletionInput =\n | { prompt: string; messages?: never }\n | { messages: readonly MessageType[]; prompt?: never };\n\nexport type CompletionBaseOptions<Model extends CompletionModel = CompletionModel> =\n CompletionInput & {\n model: Model;\n instructions?: string | undefined;\n documents?: readonly Document[] | undefined;\n tools?: readonly CompletionTool[] | undefined;\n temperature?: number | undefined;\n maxTokens?: number | undefined;\n toolChoice?: ToolChoice | undefined;\n providerOptions?: JsonObject | undefined;\n retries?: RetrySetting | undefined;\n abortSignal?: AbortSignal | undefined;\n };\n\nexport type GenerateCompletionOptions<Model extends CompletionModel = CompletionModel> =\n CompletionBaseOptions<Model> & { outputSchema?: never };\n\nexport type GenerateStructuredCompletionOptions<\n Output,\n Model extends CompletionModel = CompletionModel,\n> = CompletionBaseOptions<Model> & { outputSchema: ZodSchema<Output> };\n\nexport type StreamCompletionOptions<\n Model extends StreamingCompletionModel = StreamingCompletionModel,\n> = GenerateCompletionOptions<Model>;\n\nexport type StreamStructuredCompletionOptions<\n Output,\n Model extends StreamingCompletionModel = StreamingCompletionModel,\n> = GenerateStructuredCompletionOptions<Output, Model>;\n\ntype RawResponseOf<Model> =\n Model extends CompletionModel<infer RawResponse> ? RawResponse : unknown;\n\nexport function generateCompletion<Output, Model extends CompletionModel>(\n options: GenerateStructuredCompletionOptions<Output, Model>,\n): Promise<CompletionResult<Output, RawResponseOf<Model>>>;\nexport function generateCompletion<Model extends CompletionModel>(\n options: GenerateCompletionOptions<Model>,\n): Promise<CompletionResult<string, RawResponseOf<Model>>>;\nexport async function generateCompletion<Output, Model extends CompletionModel>(\n options: GenerateCompletionOptions<Model> | GenerateStructuredCompletionOptions<Output, Model>,\n): Promise<CompletionResult<Output | string, RawResponseOf<Model>>> {\n throwIfAborted(options.abortSignal);\n const request = requestFromOptions(options);\n assertCompletionRequestSupported(options.model, request);\n const retries = resolveOptionalRetries(options.retries);\n const response = await sendCompletion(options.model, request, retries, options.abortSignal);\n return resultFromResponse(response, structuredOutputSchema(options));\n}\n\nexport function streamCompletion<Output, Model extends StreamingCompletionModel>(\n options: StreamStructuredCompletionOptions<Output, Model>,\n): AsyncIterable<CompletionStreamEvent<Output, RawResponseOf<Model>>>;\nexport function streamCompletion<Model extends StreamingCompletionModel>(\n options: StreamCompletionOptions<Model>,\n): AsyncIterable<CompletionStreamEvent<string, RawResponseOf<Model>>>;\nexport function streamCompletion<Output, Model extends StreamingCompletionModel>(\n options: StreamCompletionOptions<Model> | StreamStructuredCompletionOptions<Output, Model>,\n): AsyncIterable<CompletionStreamEvent<Output | string, RawResponseOf<Model>>> {\n throwIfAborted(options.abortSignal);\n const request = requestFromOptions(options);\n if (!isStreamingCompletionModel(options.model) || !options.model.capabilities.streaming) {\n throw new Error(\"This completion model does not support streaming\");\n }\n assertCompletionRequestSupported(options.model, request, { streaming: true });\n const retries = resolveOptionalRetries(options.retries);\n return streamCompletionWithRetries(\n options.model,\n request,\n retries,\n options.abortSignal,\n structuredOutputSchema(options),\n );\n}\n\nasync function sendCompletion<Model extends CompletionModel>(\n model: Model,\n request: CompletionRequest,\n retries: ResolvedRetryOptions | undefined,\n abortSignal: AbortSignal | undefined,\n): Promise<CompletionResponse<RawResponseOf<Model>>> {\n const callOptions = modelCallOptions(abortSignal);\n return runWithRetries(\n () => {\n throwIfAborted(abortSignal);\n return model.completion(request, callOptions) as Promise<\n CompletionResponse<RawResponseOf<Model>>\n >;\n },\n retries,\n { streaming: false, abortSignal },\n );\n}\n\nfunction resolveOptionalRetries(\n setting: RetrySetting | undefined,\n): ResolvedRetryOptions | undefined {\n return setting === undefined || setting === false ? undefined : resolveRetryOptions(setting);\n}\n\nasync function* streamCompletionWithRetries<Output, Model extends StreamingCompletionModel>(\n model: Model,\n request: CompletionRequest,\n retries: ResolvedRetryOptions | undefined,\n abortSignal: AbortSignal | undefined,\n outputSchema: ZodSchema<Output> | undefined,\n): AsyncIterable<CompletionStreamEvent<Output | string, RawResponseOf<Model>>> {\n let attempt = 1;\n let swallowedUsage = Usage.empty();\n const callOptions = modelCallOptions(abortSignal);\n\n while (true) {\n let exposedProgress = false;\n let retryDelay: number | undefined;\n try {\n throwIfAborted(abortSignal);\n const events = model.streamCompletion(request, callOptions) as AsyncIterable<\n CompletionModelStreamEvent<RawResponseOf<Model>>\n >;\n for await (const event of events) {\n if (event.type === \"error\" && !exposedProgress) {\n const retryOptions = retryOptionsForFailure(retries, {\n error: event.error,\n attempt,\n streaming: true,\n });\n if (retryOptions !== undefined) {\n swallowedUsage = Usage.add(swallowedUsage, event.usage ?? Usage.empty());\n retryDelay = retryDelayMs(retryOptions, attempt);\n break;\n }\n }\n\n if (event.type === \"error\") {\n yield {\n type: \"error\",\n error: event.error,\n usage: Usage.add(swallowedUsage, event.usage ?? Usage.empty()),\n };\n return;\n }\n\n if (event.type === \"final\") {\n const response =\n swallowedUsage.totalTokens === 0\n ? event.response\n : {\n ...event.response,\n usage: Usage.add(swallowedUsage, event.response.usage),\n };\n try {\n yield {\n type: \"final\",\n result: resultFromResponse(response, outputSchema),\n };\n } catch (error) {\n yield { type: \"error\", error, usage: response.usage };\n }\n return;\n }\n\n exposedProgress = true;\n yield event;\n }\n\n if (retryDelay !== undefined) {\n await waitForRetry(retryDelay, abortSignal);\n attempt += 1;\n continue;\n }\n\n yield {\n type: \"error\",\n error: new Error(\"The completion model stream ended without a final event.\"),\n usage: swallowedUsage,\n };\n return;\n } catch (error) {\n const normalizedError =\n abortSignal?.aborted === true ? abortError(abortSignal.reason) : error;\n if (!exposedProgress) {\n const retryOptions = retryOptionsForFailure(retries, {\n error: normalizedError,\n attempt,\n streaming: true,\n });\n if (retryOptions !== undefined) {\n try {\n await waitForRetry(retryDelayMs(retryOptions, attempt), abortSignal);\n attempt += 1;\n continue;\n } catch (waitError) {\n yield { type: \"error\", error: waitError, usage: swallowedUsage };\n return;\n }\n }\n }\n yield { type: \"error\", error: normalizedError, usage: swallowedUsage };\n return;\n }\n }\n}\n\nfunction requestFromOptions<Model extends CompletionModel, Output>(\n options: GenerateCompletionOptions<Model> | GenerateStructuredCompletionOptions<Output, Model>,\n): CompletionRequest {\n const input = inputFromOptions(options);\n return createCompletionRequest(input, {\n instructions: options.instructions,\n documents: options.documents,\n tools: options.tools,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n toolChoice: options.toolChoice,\n providerOptions: options.providerOptions,\n outputSchema:\n \"outputSchema\" in options && options.outputSchema !== undefined\n ? toProviderJsonSchema(options.outputSchema)\n : undefined,\n });\n}\n\nfunction inputFromOptions(options: CompletionInput): string | readonly MessageType[] {\n const prompt = (options as { prompt?: unknown }).prompt;\n const messages = (options as { messages?: unknown }).messages;\n const hasPrompt = prompt !== undefined;\n const hasMessages = messages !== undefined;\n if (hasPrompt === hasMessages) {\n throw new TypeError(\"Exactly one of prompt or messages must be provided.\");\n }\n if (hasPrompt) {\n if (typeof prompt !== \"string\" || prompt.trim().length === 0) {\n throw new TypeError(\"Completion prompt must be a non-empty string.\");\n }\n return prompt;\n }\n if (!Array.isArray(messages)) {\n throw new TypeError(\"Completion messages must be an array of Message values.\");\n }\n return messages as readonly MessageType[];\n}\n\nfunction structuredOutputSchema<Output>(options: {\n outputSchema?: ZodSchema<Output> | undefined;\n}): ZodSchema<Output> | undefined {\n return options.outputSchema;\n}\n\nfunction resultFromResponse<Output, RawResponse>(\n response: CompletionResponse<RawResponse>,\n outputSchema: ZodSchema<Output> | undefined,\n): CompletionResult<Output | string, RawResponse> {\n const text = textFromAssistantContent(response.choice);\n const result: CompletionResult<Output | string, RawResponse> = {\n output: outputSchema === undefined ? text : parseCompletionOutput(text, outputSchema),\n text,\n content: [...response.choice],\n usage: response.usage,\n rawResponse: response.rawResponse,\n };\n if (response.contextUsage !== undefined) result.contextUsage = response.contextUsage;\n if (response.messageId !== undefined) result.messageId = response.messageId;\n if (response.sources !== undefined) result.sources = [...response.sources];\n if (response.providerToolCalls !== undefined) {\n result.providerToolCalls = [...response.providerToolCalls];\n }\n return result;\n}\n\nfunction parseCompletionOutput<Output>(text: string, schema: ZodSchema<Output>): Output {\n let json: unknown;\n try {\n json = JSON.parse(text);\n } catch (error) {\n throw new Error(\"generateCompletion expected the model response to be valid JSON.\", {\n cause: error,\n });\n }\n return schema.parse(json);\n}\n\nfunction modelCallOptions(abortSignal: AbortSignal | undefined): ModelCallOptions | undefined {\n return abortSignal === undefined ? undefined : { abortSignal };\n}\n\nexport function isStreamingCompletionModel(\n model: CompletionModel,\n): model is StreamingCompletionModel {\n return typeof (model as { streamCompletion?: unknown }).streamCompletion === \"function\";\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-CQNNSZPG.js";
|
|
4
4
|
import {
|
|
5
5
|
ToolOutput
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XYTPYUGB.js";
|
|
7
7
|
import {
|
|
8
8
|
abortError,
|
|
9
9
|
throwIfAborted
|
|
@@ -191,6 +191,11 @@ for (const [network, prefix] of [
|
|
|
191
191
|
}
|
|
192
192
|
var defaultAddressResolver = (hostname) => lookup(hostname, { all: true, verbatim: true });
|
|
193
193
|
function parseAndValidateMcpUrl(url) {
|
|
194
|
+
const parsed = parseMcpHttpUrl(url);
|
|
195
|
+
validateMcpHostname(parsed.hostname);
|
|
196
|
+
return parsed;
|
|
197
|
+
}
|
|
198
|
+
function parseMcpHttpUrl(url) {
|
|
194
199
|
let parsed;
|
|
195
200
|
try {
|
|
196
201
|
parsed = new URL(url);
|
|
@@ -200,7 +205,6 @@ function parseAndValidateMcpUrl(url) {
|
|
|
200
205
|
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
201
206
|
throw new Error(`MCP URL blocked: only HTTP(S) URLs are allowed (${parsed.protocol})`);
|
|
202
207
|
}
|
|
203
|
-
validateMcpHostname(parsed.hostname);
|
|
204
208
|
return parsed;
|
|
205
209
|
}
|
|
206
210
|
async function resolveAndValidateMcpHostname(hostname, resolveAddresses = defaultAddressResolver) {
|
|
@@ -311,6 +315,13 @@ var safeMcpDispatcher = new Agent({
|
|
|
311
315
|
|
|
312
316
|
// src/mcp/client.ts
|
|
313
317
|
var coreClientVersion;
|
|
318
|
+
var transportOwnedHttpHeaders = /* @__PURE__ */ new Set([
|
|
319
|
+
"accept",
|
|
320
|
+
"content-type",
|
|
321
|
+
"last-event-id",
|
|
322
|
+
"mcp-protocol-version",
|
|
323
|
+
"mcp-session-id"
|
|
324
|
+
]);
|
|
314
325
|
var McpClient = class {
|
|
315
326
|
name;
|
|
316
327
|
#options;
|
|
@@ -393,13 +404,14 @@ var McpClient = class {
|
|
|
393
404
|
const serverInfo = copyServerInfo(client.getServerVersion());
|
|
394
405
|
const capabilities = copyJsonObject(client.getServerCapabilities());
|
|
395
406
|
const instructions = client.getInstructions();
|
|
396
|
-
|
|
407
|
+
let registration = {
|
|
397
408
|
name: this.name,
|
|
398
|
-
tools
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
}
|
|
409
|
+
tools
|
|
410
|
+
};
|
|
411
|
+
if (serverInfo !== void 0) registration = { ...registration, serverInfo };
|
|
412
|
+
if (capabilities !== void 0) registration = { ...registration, capabilities };
|
|
413
|
+
if (instructions !== void 0) registration = { ...registration, instructions };
|
|
414
|
+
const server = freezeServer(registration);
|
|
403
415
|
this.#server = server;
|
|
404
416
|
return server;
|
|
405
417
|
} catch (error) {
|
|
@@ -421,25 +433,88 @@ async function createTransport(options, connectOptions) {
|
|
|
421
433
|
return transport.create({ abortSignal: connectOptions.abortSignal });
|
|
422
434
|
}
|
|
423
435
|
if (transport.type === "stdio") {
|
|
424
|
-
|
|
425
|
-
command: transport.command
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
436
|
+
let parameters2 = {
|
|
437
|
+
command: transport.command
|
|
438
|
+
};
|
|
439
|
+
if (transport.args !== void 0) parameters2 = { ...parameters2, args: transport.args };
|
|
440
|
+
if (transport.env !== void 0) parameters2 = { ...parameters2, env: transport.env };
|
|
441
|
+
if (transport.cwd !== void 0) parameters2 = { ...parameters2, cwd: transport.cwd };
|
|
442
|
+
if (transport.stderr !== void 0) parameters2 = { ...parameters2, stderr: transport.stderr };
|
|
443
|
+
if (transport.maxBufferSize !== void 0) {
|
|
444
|
+
parameters2 = { ...parameters2, maxBufferSize: transport.maxBufferSize };
|
|
445
|
+
}
|
|
446
|
+
return new StdioClientTransport(parameters2);
|
|
447
|
+
}
|
|
448
|
+
const ssrfProtection = transport.ssrfProtection ?? "strict";
|
|
449
|
+
if (ssrfProtection !== "strict" && ssrfProtection !== "disabled") {
|
|
450
|
+
throw new TypeError("MCP Streamable HTTP ssrfProtection must be strict or disabled");
|
|
451
|
+
}
|
|
452
|
+
let parameters = {};
|
|
453
|
+
let url;
|
|
454
|
+
let transportFetch;
|
|
455
|
+
if (ssrfProtection === "strict") {
|
|
456
|
+
transportFetch = createSafeMcpFetch();
|
|
457
|
+
url = parseAndValidateMcpUrl(transport.url);
|
|
458
|
+
} else {
|
|
459
|
+
url = parseMcpHttpUrl(transport.url);
|
|
460
|
+
}
|
|
461
|
+
if (transport.headers !== void 0) {
|
|
462
|
+
const headers = copyMcpHeaders(transport.headers, transport.authProvider !== void 0);
|
|
463
|
+
const fetchRequest = transportFetch ?? defaultMcpFetch;
|
|
464
|
+
transportFetch = createMcpEndpointFetch(url, headers, fetchRequest);
|
|
465
|
+
}
|
|
466
|
+
if (transportFetch !== void 0) parameters = { ...parameters, fetch: transportFetch };
|
|
467
|
+
if (transport.authProvider !== void 0) {
|
|
468
|
+
parameters = { ...parameters, authProvider: transport.authProvider };
|
|
469
|
+
}
|
|
470
|
+
if (transport.reconnectionOptions !== void 0) {
|
|
471
|
+
parameters = { ...parameters, reconnectionOptions: transport.reconnectionOptions };
|
|
472
|
+
}
|
|
473
|
+
if (transport.sessionId !== void 0) {
|
|
474
|
+
parameters = { ...parameters, sessionId: transport.sessionId };
|
|
475
|
+
}
|
|
476
|
+
return asSdkTransport(new StreamableHTTPClientTransport(url, parameters));
|
|
477
|
+
}
|
|
478
|
+
function copyMcpHeaders(value, hasAuthProvider) {
|
|
479
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
480
|
+
throw new TypeError("MCP Streamable HTTP headers must be a plain object");
|
|
481
|
+
}
|
|
482
|
+
const prototype = Object.getPrototypeOf(value);
|
|
483
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
484
|
+
throw new TypeError("MCP Streamable HTTP headers must be a plain object");
|
|
485
|
+
}
|
|
486
|
+
const headers = new Headers();
|
|
487
|
+
for (const [name, headerValue] of Object.entries(value)) {
|
|
488
|
+
if (typeof headerValue !== "string") {
|
|
489
|
+
throw new TypeError(`MCP Streamable HTTP header ${name} must be a string`);
|
|
490
|
+
}
|
|
491
|
+
const normalizedName = name.toLowerCase();
|
|
492
|
+
if (transportOwnedHttpHeaders.has(normalizedName)) {
|
|
493
|
+
throw new TypeError(`MCP Streamable HTTP header ${name} is owned by the transport`);
|
|
494
|
+
}
|
|
495
|
+
if (hasAuthProvider && normalizedName === "authorization") {
|
|
496
|
+
throw new TypeError(
|
|
497
|
+
"MCP Streamable HTTP authorization header cannot be combined with authProvider"
|
|
498
|
+
);
|
|
499
|
+
}
|
|
500
|
+
headers.set(name, headerValue);
|
|
432
501
|
}
|
|
433
|
-
return
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
502
|
+
return headers;
|
|
503
|
+
}
|
|
504
|
+
function createMcpEndpointFetch(endpoint, configuredHeaders, fetchRequest) {
|
|
505
|
+
return (input, init) => {
|
|
506
|
+
const requestUrl = input instanceof Request ? new URL(input.url) : new URL(input);
|
|
507
|
+
if (requestUrl.href !== endpoint.href) return fetchRequest(input, init);
|
|
508
|
+
const requestHeaders = new Headers(
|
|
509
|
+
init?.headers ?? (input instanceof Request ? input.headers : void 0)
|
|
510
|
+
);
|
|
511
|
+
configuredHeaders.forEach((value, name) => {
|
|
512
|
+
requestHeaders.set(name, value);
|
|
513
|
+
});
|
|
514
|
+
return fetchRequest(input, { ...init, headers: requestHeaders, redirect: "error" });
|
|
515
|
+
};
|
|
442
516
|
}
|
|
517
|
+
var defaultMcpFetch = (input, init) => globalThis.fetch(input, init);
|
|
443
518
|
async function listAllTools(client, abortSignal) {
|
|
444
519
|
const tools = [];
|
|
445
520
|
const seenCursors = /* @__PURE__ */ new Set();
|
|
@@ -626,4 +701,4 @@ export {
|
|
|
626
701
|
McpClient,
|
|
627
702
|
McpClientGroup
|
|
628
703
|
};
|
|
629
|
-
//# sourceMappingURL=chunk-
|
|
704
|
+
//# sourceMappingURL=chunk-FXAIYTRE.js.map
|