@anvia/core 0.25.1 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  AgentBuilder
3
- } from "../chunk-4HWN7734.js";
4
- import "../chunk-YEBIVZM2.js";
5
- import "../chunk-VXONXP2G.js";
3
+ } from "../chunk-JI5YZWNT.js";
4
+ import "../chunk-DALYP4PX.js";
5
+ import "../chunk-BALBBVI3.js";
6
6
  import "../chunk-YK4WAAS4.js";
7
7
  import "../chunk-XUUY2L2D.js";
8
- import "../chunk-2NDQHV7V.js";
9
- import "../chunk-4BGN6PYF.js";
8
+ import "../chunk-HYUYZEAJ.js";
9
+ import "../chunk-MELYDKWQ.js";
10
10
  import "../chunk-2ODTMRHP.js";
11
11
  import "../chunk-UQX6EXWG.js";
12
12
  import "../chunk-MRQLEK2B.js";
13
+ import "../chunk-MNWK2USR.js";
14
+ import "../chunk-OIMLU4SF.js";
13
15
  import "../chunk-Q25IWLBT.js";
14
16
  import "../chunk-MC3CCKEB.js";
15
17
  import "../chunk-ADH7NNCS.js";
16
18
  import "../chunk-WQKHFADH.js";
17
- import "../chunk-MNWK2USR.js";
18
- import "../chunk-OIMLU4SF.js";
19
19
  import "../chunk-CWUJUSOS.js";
20
20
  export {
21
21
  AgentBuilder
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  parseToolArgs,
6
6
  toolResultContentToText
7
- } from "./chunk-2NDQHV7V.js";
7
+ } from "./chunk-HYUYZEAJ.js";
8
8
  import {
9
9
  runControl,
10
10
  toolCallControl
@@ -15,6 +15,9 @@ import {
15
15
  createMemoryCompactionSummary,
16
16
  cumulativeCompactedMessageCount
17
17
  } from "./chunk-MRQLEK2B.js";
18
+ import {
19
+ mapWithConcurrency
20
+ } from "./chunk-OIMLU4SF.js";
18
21
  import {
19
22
  CompletionRequestBuilder
20
23
  } from "./chunk-Q25IWLBT.js";
@@ -30,9 +33,6 @@ import {
30
33
  getAssistantGenerationMetadata,
31
34
  textFromAssistantContent
32
35
  } from "./chunk-ADH7NNCS.js";
33
- import {
34
- mapWithConcurrency
35
- } from "./chunk-OIMLU4SF.js";
36
36
  import {
37
37
  appendGuardrailPolicies,
38
38
  hasEnforcedOutputGuardrails,
@@ -2729,4 +2729,4 @@ export {
2729
2729
  extractRagText,
2730
2730
  PromptRequest
2731
2731
  };
2732
- //# sourceMappingURL=chunk-VXONXP2G.js.map
2732
+ //# sourceMappingURL=chunk-BALBBVI3.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  PromptRequest
3
- } from "./chunk-VXONXP2G.js";
3
+ } from "./chunk-BALBBVI3.js";
4
4
  import {
5
5
  isSkillTool
6
6
  } from "./chunk-YK4WAAS4.js";
7
7
  import {
8
8
  ToolSet
9
- } from "./chunk-2NDQHV7V.js";
9
+ } from "./chunk-HYUYZEAJ.js";
10
10
  import {
11
11
  createTool
12
- } from "./chunk-4BGN6PYF.js";
12
+ } from "./chunk-MELYDKWQ.js";
13
13
  import {
14
14
  isStreamingCompletionModel
15
15
  } from "./chunk-MC3CCKEB.js";
@@ -222,4 +222,4 @@ export {
222
222
  Agent,
223
223
  AgentSession
224
224
  };
225
- //# sourceMappingURL=chunk-YEBIVZM2.js.map
225
+ //# sourceMappingURL=chunk-DALYP4PX.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  InMemoryVectorStore,
3
3
  createTool
4
- } from "./chunk-4BGN6PYF.js";
4
+ } from "./chunk-MELYDKWQ.js";
5
+ import {
6
+ embedDocuments
7
+ } from "./chunk-MNWK2USR.js";
5
8
  import {
6
9
  isToolResultContentArray,
7
10
  serializeToolResultOutput
8
11
  } from "./chunk-ADH7NNCS.js";
9
- import {
10
- embedDocuments
11
- } from "./chunk-MNWK2USR.js";
12
12
 
13
13
  // src/tool/errors.ts
14
14
  var ToolCallError = class extends Error {
@@ -220,4 +220,4 @@ export {
220
220
  createMiddleware,
221
221
  createThinkTool
222
222
  };
223
- //# sourceMappingURL=chunk-2NDQHV7V.js.map
223
+ //# sourceMappingURL=chunk-HYUYZEAJ.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Agent,
3
3
  normalizeAgentId
4
- } from "./chunk-YEBIVZM2.js";
4
+ } from "./chunk-DALYP4PX.js";
5
5
  import {
6
6
  ToolSet
7
- } from "./chunk-2NDQHV7V.js";
7
+ } from "./chunk-HYUYZEAJ.js";
8
8
  import {
9
9
  resolveMemoryOptions
10
10
  } from "./chunk-UQX6EXWG.js";
@@ -217,4 +217,4 @@ var AgentBuilder = class {
217
217
  export {
218
218
  AgentBuilder
219
219
  };
220
- //# sourceMappingURL=chunk-4HWN7734.js.map
220
+ //# sourceMappingURL=chunk-JI5YZWNT.js.map
@@ -1,10 +1,10 @@
1
- import {
2
- toProviderJsonSchema
3
- } from "./chunk-WQKHFADH.js";
4
1
  import {
5
2
  cosineSimilarity,
6
3
  embedText
7
4
  } from "./chunk-MNWK2USR.js";
5
+ import {
6
+ toProviderJsonSchema
7
+ } from "./chunk-WQKHFADH.js";
8
8
 
9
9
  // src/vector-store/index.ts
10
10
  import { z } from "zod";
@@ -334,4 +334,4 @@ export {
334
334
  InMemoryVectorIndex,
335
335
  createVectorSearchTool
336
336
  };
337
- //# sourceMappingURL=chunk-4BGN6PYF.js.map
337
+ //# sourceMappingURL=chunk-MELYDKWQ.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-YK4WAAS4.js";
7
7
  import {
8
8
  createTool
9
- } from "./chunk-4BGN6PYF.js";
9
+ } from "./chunk-MELYDKWQ.js";
10
10
 
11
11
  // src/skills/instructions.ts
12
12
  function skillInstructions(skills) {
@@ -395,4 +395,4 @@ export {
395
395
  SkillValidationError,
396
396
  skill
397
397
  };
398
- //# sourceMappingURL=chunk-BCA4VZ5W.js.map
398
+ //# sourceMappingURL=chunk-NCPN4SJR.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  AgentBuilder
3
- } from "./chunk-4HWN7734.js";
3
+ } from "./chunk-JI5YZWNT.js";
4
4
  import {
5
5
  extractRagText
6
- } from "./chunk-VXONXP2G.js";
6
+ } from "./chunk-BALBBVI3.js";
7
7
  import {
8
8
  createTool
9
- } from "./chunk-4BGN6PYF.js";
9
+ } from "./chunk-MELYDKWQ.js";
10
10
  import {
11
11
  CompletionRequestBuilder
12
12
  } from "./chunk-Q25IWLBT.js";
@@ -138,4 +138,4 @@ export {
138
138
  Extractor,
139
139
  ExtractorBuilder
140
140
  };
141
- //# sourceMappingURL=chunk-KYEBWN3E.js.map
141
+ //# sourceMappingURL=chunk-YLMDBQO4.js.map
@@ -1,22 +1,16 @@
1
1
  import {
2
2
  ExtractorBuilder
3
- } from "../chunk-KYEBWN3E.js";
4
- import "../chunk-4HWN7734.js";
5
- import "../chunk-YEBIVZM2.js";
6
- import "../chunk-VXONXP2G.js";
3
+ } from "../chunk-YLMDBQO4.js";
4
+ import "../chunk-JI5YZWNT.js";
5
+ import "../chunk-DALYP4PX.js";
6
+ import "../chunk-BALBBVI3.js";
7
7
  import "../chunk-YK4WAAS4.js";
8
8
  import "../chunk-XUUY2L2D.js";
9
- import "../chunk-2NDQHV7V.js";
10
- import "../chunk-4BGN6PYF.js";
9
+ import "../chunk-HYUYZEAJ.js";
10
+ import "../chunk-MELYDKWQ.js";
11
11
  import "../chunk-2ODTMRHP.js";
12
12
  import "../chunk-UQX6EXWG.js";
13
13
  import "../chunk-MRQLEK2B.js";
14
- import "../chunk-Q25IWLBT.js";
15
- import "../chunk-MC3CCKEB.js";
16
- import {
17
- Usage
18
- } from "../chunk-ADH7NNCS.js";
19
- import "../chunk-WQKHFADH.js";
20
14
  import {
21
15
  cosineSimilarity,
22
16
  embedText
@@ -24,6 +18,12 @@ import {
24
18
  import {
25
19
  mapWithConcurrency
26
20
  } from "../chunk-OIMLU4SF.js";
21
+ import "../chunk-Q25IWLBT.js";
22
+ import "../chunk-MC3CCKEB.js";
23
+ import {
24
+ Usage
25
+ } from "../chunk-ADH7NNCS.js";
26
+ import "../chunk-WQKHFADH.js";
27
27
  import "../chunk-CWUJUSOS.js";
28
28
 
29
29
  // src/evals/advanced-metrics.ts
@@ -2,23 +2,23 @@ import {
2
2
  ExtractionError,
3
3
  Extractor,
4
4
  ExtractorBuilder
5
- } from "../chunk-KYEBWN3E.js";
6
- import "../chunk-4HWN7734.js";
7
- import "../chunk-YEBIVZM2.js";
8
- import "../chunk-VXONXP2G.js";
5
+ } from "../chunk-YLMDBQO4.js";
6
+ import "../chunk-JI5YZWNT.js";
7
+ import "../chunk-DALYP4PX.js";
8
+ import "../chunk-BALBBVI3.js";
9
9
  import "../chunk-YK4WAAS4.js";
10
10
  import "../chunk-XUUY2L2D.js";
11
- import "../chunk-2NDQHV7V.js";
12
- import "../chunk-4BGN6PYF.js";
11
+ import "../chunk-HYUYZEAJ.js";
12
+ import "../chunk-MELYDKWQ.js";
13
13
  import "../chunk-2ODTMRHP.js";
14
14
  import "../chunk-UQX6EXWG.js";
15
15
  import "../chunk-MRQLEK2B.js";
16
+ import "../chunk-MNWK2USR.js";
17
+ import "../chunk-OIMLU4SF.js";
16
18
  import "../chunk-Q25IWLBT.js";
17
19
  import "../chunk-MC3CCKEB.js";
18
20
  import "../chunk-ADH7NNCS.js";
19
21
  import "../chunk-WQKHFADH.js";
20
- import "../chunk-MNWK2USR.js";
21
- import "../chunk-OIMLU4SF.js";
22
22
  import "../chunk-CWUJUSOS.js";
23
23
  export {
24
24
  ExtractionError,
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SkillValidationError,
3
3
  loadSkills,
4
4
  skill
5
- } from "./chunk-BCA4VZ5W.js";
5
+ } from "./chunk-NCPN4SJR.js";
6
6
  import {
7
7
  coreMessagesToUIMessages,
8
8
  uiMessagesToCoreMessages
@@ -11,22 +11,22 @@ import "./chunk-CQNNSZPG.js";
11
11
  import "./chunk-XWUC7CIT.js";
12
12
  import {
13
13
  AgentBuilder
14
- } from "./chunk-4HWN7734.js";
15
- import "./chunk-YEBIVZM2.js";
14
+ } from "./chunk-JI5YZWNT.js";
15
+ import "./chunk-DALYP4PX.js";
16
16
  import {
17
17
  MaxTurnsError,
18
18
  PromptCancelledError,
19
19
  ToolApprovalRequiredError
20
- } from "./chunk-VXONXP2G.js";
20
+ } from "./chunk-BALBBVI3.js";
21
21
  import "./chunk-YK4WAAS4.js";
22
22
  import "./chunk-XUUY2L2D.js";
23
23
  import {
24
24
  createMiddleware,
25
25
  createThinkTool
26
- } from "./chunk-2NDQHV7V.js";
26
+ } from "./chunk-HYUYZEAJ.js";
27
27
  import {
28
28
  createTool
29
- } from "./chunk-4BGN6PYF.js";
29
+ } from "./chunk-MELYDKWQ.js";
30
30
  import {
31
31
  cancelPrompt,
32
32
  createHook,
@@ -42,6 +42,8 @@ import {
42
42
  createSummaryMemoryCompactor,
43
43
  isMemoryCompactionSummary
44
44
  } from "./chunk-MRQLEK2B.js";
45
+ import "./chunk-MNWK2USR.js";
46
+ import "./chunk-OIMLU4SF.js";
45
47
  import "./chunk-Q25IWLBT.js";
46
48
  import {
47
49
  createCompletion,
@@ -62,8 +64,6 @@ import {
62
64
  withContextUsage
63
65
  } from "./chunk-ADH7NNCS.js";
64
66
  import "./chunk-WQKHFADH.js";
65
- import "./chunk-MNWK2USR.js";
66
- import "./chunk-OIMLU4SF.js";
67
67
  import {
68
68
  allow,
69
69
  block,
@@ -2,20 +2,20 @@ import {
2
2
  Agent,
3
3
  AgentSession,
4
4
  DEFAULT_MAX_TURNS
5
- } from "../chunk-YEBIVZM2.js";
6
- import "../chunk-VXONXP2G.js";
5
+ } from "../chunk-DALYP4PX.js";
6
+ import "../chunk-BALBBVI3.js";
7
7
  import "../chunk-YK4WAAS4.js";
8
8
  import "../chunk-XUUY2L2D.js";
9
- import "../chunk-2NDQHV7V.js";
10
- import "../chunk-4BGN6PYF.js";
9
+ import "../chunk-HYUYZEAJ.js";
10
+ import "../chunk-MELYDKWQ.js";
11
11
  import "../chunk-2ODTMRHP.js";
12
12
  import "../chunk-MRQLEK2B.js";
13
+ import "../chunk-MNWK2USR.js";
14
+ import "../chunk-OIMLU4SF.js";
13
15
  import "../chunk-Q25IWLBT.js";
14
16
  import "../chunk-MC3CCKEB.js";
15
17
  import "../chunk-ADH7NNCS.js";
16
18
  import "../chunk-WQKHFADH.js";
17
- import "../chunk-MNWK2USR.js";
18
- import "../chunk-OIMLU4SF.js";
19
19
  import "../chunk-CWUJUSOS.js";
20
20
  export {
21
21
  Agent,
package/dist/mcp/index.js CHANGED
@@ -101,6 +101,172 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
101
101
  import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
102
102
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
103
103
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
104
+
105
+ // src/mcp/url-safety.ts
106
+ import { lookup } from "dns/promises";
107
+ import { BlockList, isIP } from "net";
108
+ import { Agent, Pool, fetch as undiciFetch } from "undici";
109
+ var blockedIpv4Addresses = new BlockList();
110
+ var blockedIpv6Addresses = new BlockList();
111
+ for (const [network, prefix] of [
112
+ ["0.0.0.0", 8],
113
+ ["10.0.0.0", 8],
114
+ ["100.64.0.0", 10],
115
+ ["127.0.0.0", 8],
116
+ ["169.254.0.0", 16],
117
+ ["172.16.0.0", 12],
118
+ ["192.0.0.0", 24],
119
+ ["192.0.2.0", 24],
120
+ ["192.88.99.0", 24],
121
+ ["192.168.0.0", 16],
122
+ ["198.18.0.0", 15],
123
+ ["198.51.100.0", 24],
124
+ ["203.0.113.0", 24],
125
+ ["224.0.0.0", 4],
126
+ ["240.0.0.0", 4]
127
+ ]) {
128
+ blockedIpv4Addresses.addSubnet(network, prefix, "ipv4");
129
+ }
130
+ for (const [network, prefix] of [
131
+ ["::", 96],
132
+ ["::ffff:0:0", 96],
133
+ ["64:ff9b::", 96],
134
+ ["64:ff9b:1::", 48],
135
+ ["100::", 64],
136
+ ["2001::", 32],
137
+ ["2001:2::", 48],
138
+ ["2001:10::", 28],
139
+ ["2001:20::", 28],
140
+ ["2001:db8::", 32],
141
+ ["2002::", 16],
142
+ ["fc00::", 7],
143
+ ["fe80::", 10],
144
+ ["fec0::", 10],
145
+ ["ff00::", 8]
146
+ ]) {
147
+ blockedIpv6Addresses.addSubnet(network, prefix, "ipv6");
148
+ }
149
+ var defaultAddressResolver = (hostname) => lookup(hostname, { all: true, verbatim: true });
150
+ function parseAndValidateMcpUrl(url) {
151
+ let parsed;
152
+ try {
153
+ parsed = new URL(url);
154
+ } catch {
155
+ throw new Error(`Invalid MCP URL: ${url}`);
156
+ }
157
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
158
+ throw new Error(`MCP URL blocked: only HTTP(S) URLs are allowed (${parsed.protocol})`);
159
+ }
160
+ validateMcpHostname(parsed.hostname);
161
+ return parsed;
162
+ }
163
+ async function resolveAndValidateMcpHostname(hostname, resolveAddresses = defaultAddressResolver) {
164
+ const normalizedHostname = normalizeHostname(hostname);
165
+ validateMcpHostname(normalizedHostname);
166
+ const family = isIP(normalizedHostname);
167
+ if (family !== 0) {
168
+ return [{ address: normalizedHostname, family }];
169
+ }
170
+ let addresses;
171
+ try {
172
+ addresses = await resolveAddresses(normalizedHostname);
173
+ } catch (cause) {
174
+ throw new Error(`Unable to resolve MCP URL hostname (${normalizedHostname})`, { cause });
175
+ }
176
+ if (addresses.length === 0) {
177
+ throw new Error(`Unable to resolve MCP URL hostname (${normalizedHostname})`);
178
+ }
179
+ for (const { address } of addresses) {
180
+ validateMcpHostname(address);
181
+ }
182
+ return addresses;
183
+ }
184
+ function createSafeMcpLookup(resolveAddresses = defaultAddressResolver) {
185
+ return (hostname, options, callback) => {
186
+ void resolveAndValidateMcpHostname(hostname, resolveAddresses).then(
187
+ (addresses) => {
188
+ const requestedFamily = normalizeRequestedFamily(options.family);
189
+ const matchingAddresses = requestedFamily === 0 ? addresses : addresses.filter(({ family }) => family === requestedFamily);
190
+ if (matchingAddresses.length === 0) {
191
+ const error = new Error(`No matching address family for MCP URL (${hostname})`);
192
+ Object.assign(error, { code: "EAI_ADDRFAMILY" });
193
+ callback(error, []);
194
+ return;
195
+ }
196
+ if (options.all) {
197
+ callback(null, matchingAddresses);
198
+ return;
199
+ }
200
+ const address = matchingAddresses[0];
201
+ if (!address) {
202
+ callback(new Error(`Unable to resolve MCP URL hostname (${hostname})`), []);
203
+ return;
204
+ }
205
+ callback(null, address.address, address.family);
206
+ },
207
+ (cause) => {
208
+ callback(asError(cause), []);
209
+ }
210
+ );
211
+ };
212
+ }
213
+ function createSafeMcpFetch() {
214
+ return (url, init) => {
215
+ parseAndValidateMcpUrl(url);
216
+ return undiciFetch(url, {
217
+ ...init,
218
+ dispatcher: safeMcpDispatcher
219
+ });
220
+ };
221
+ }
222
+ function validateMcpHostname(hostname) {
223
+ const normalizedHostname = normalizeHostname(hostname);
224
+ if (normalizedHostname === "localhost" || normalizedHostname.endsWith(".localhost")) {
225
+ throw new Error(`MCP URL blocked: localhost not allowed (${normalizedHostname})`);
226
+ }
227
+ const family = isIP(normalizedHostname);
228
+ if (family === 0) {
229
+ return;
230
+ }
231
+ if (family === 4 && normalizedHostname.startsWith("127.") || family === 6 && normalizedHostname === "::1") {
232
+ throw new Error(`MCP URL blocked: localhost not allowed (${normalizedHostname})`);
233
+ }
234
+ if (normalizedHostname === "169.254.169.254" || normalizedHostname === "fd00:ec2::254") {
235
+ throw new Error(`MCP URL blocked: cloud metadata endpoint not allowed (${normalizedHostname})`);
236
+ }
237
+ if (family === 4 && blockedIpv4Addresses.check(normalizedHostname, "ipv4") || family === 6 && blockedIpv6Addresses.check(normalizedHostname, "ipv6")) {
238
+ const range = family === 4 ? "IP" : "IPv6";
239
+ throw new Error(`MCP URL blocked: private ${range} range not allowed (${normalizedHostname})`);
240
+ }
241
+ }
242
+ function normalizeHostname(hostname) {
243
+ const withoutBrackets = hostname.startsWith("[") && hostname.endsWith("]") ? hostname.slice(1, -1) : hostname;
244
+ return withoutBrackets.toLowerCase().replace(/\.+$/, "");
245
+ }
246
+ function normalizeRequestedFamily(family) {
247
+ if (family === 4 || family === "IPv4") {
248
+ return 4;
249
+ }
250
+ if (family === 6 || family === "IPv6") {
251
+ return 6;
252
+ }
253
+ return 0;
254
+ }
255
+ function asError(cause) {
256
+ return cause instanceof Error ? cause : new Error(String(cause));
257
+ }
258
+ var safeMcpDispatcher = new Agent({
259
+ autoSelectFamily: true,
260
+ connect: {
261
+ lookup: createSafeMcpLookup()
262
+ },
263
+ factory(origin, options) {
264
+ parseAndValidateMcpUrl(origin);
265
+ return new Pool(origin, options);
266
+ }
267
+ });
268
+
269
+ // src/mcp/connections.ts
104
270
  var CORE_CLIENT_VERSION = readCorePackageVersion();
105
271
  var mcp = {
106
272
  stdio(options) {
@@ -118,10 +284,15 @@ var mcp = {
118
284
  return {
119
285
  name: options.name,
120
286
  async connect() {
287
+ assertNoCustomMcpFetch(options.transport?.fetch);
288
+ const url = parseAndValidateMcpUrl(options.url);
121
289
  const client = createSdkClient();
122
290
  await client.connect(
123
291
  asSdkTransport(
124
- new StreamableHTTPClientTransport(new URL(options.url), options.transport)
292
+ new StreamableHTTPClientTransport(url, {
293
+ ...options.transport,
294
+ fetch: createSafeMcpFetch()
295
+ })
125
296
  )
126
297
  );
127
298
  return client;
@@ -132,15 +303,29 @@ var mcp = {
132
303
  return {
133
304
  name: options.name,
134
305
  async connect() {
306
+ assertNoCustomMcpFetch(options.transport?.fetch);
307
+ const url = parseAndValidateMcpUrl(options.url);
135
308
  const client = createSdkClient();
136
309
  await client.connect(
137
- asSdkTransport(new SSEClientTransport(new URL(options.url), options.transport))
310
+ asSdkTransport(
311
+ new SSEClientTransport(url, {
312
+ ...options.transport,
313
+ fetch: createSafeMcpFetch()
314
+ })
315
+ )
138
316
  );
139
317
  return client;
140
318
  }
141
319
  };
142
320
  }
143
321
  };
322
+ function assertNoCustomMcpFetch(fetch) {
323
+ if (fetch !== void 0) {
324
+ throw new Error(
325
+ "Custom MCP transport fetch implementations are not allowed because they can bypass SSRF protection"
326
+ );
327
+ }
328
+ }
144
329
  function createSdkClient() {
145
330
  return new Client({
146
331
  name: "@anvia/core",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/result.ts","../../src/mcp/tool.ts","../../src/mcp/connect.ts","../../src/mcp/connections.ts"],"sourcesContent":["import { isRecord } from \"../internal/record\";\nimport type { McpToolCallContent, McpToolCallResult } from \"./types\";\n\nexport function createCallToolParams(\n name: string,\n args: unknown,\n): { name: string; arguments?: Record<string, unknown> } {\n if (args === null || args === undefined) {\n return { name };\n }\n\n if (!isRecord(args)) {\n throw new Error(\"MCP tool arguments must be a JSON object\");\n }\n\n return { name, arguments: args };\n}\n\nexport function mapMcpToolResult(result: McpToolCallResult): string {\n if (\"toolResult\" in result) {\n return serializeMcpValue(result.toolResult);\n }\n\n if (result.isError === true) {\n throw new Error(mcpErrorMessage(result.content));\n }\n\n return result.content.map(mapMcpContent).join(\"\");\n}\n\nfunction mcpErrorMessage(content: McpToolCallContent[]): string {\n const text = content\n .map((item) => (item.type === \"text\" ? item.text : undefined))\n .filter((item): item is string => item !== undefined)\n .join(\"\\n\");\n\n return text === \"\" ? \"MCP tool returned an error\" : text;\n}\n\nfunction mapMcpContent(content: McpToolCallContent): string {\n if (content.type === \"text\") {\n return content.text;\n }\n\n if (content.type === \"image\") {\n return `data:${content.mimeType};base64,${content.data}`;\n }\n\n if (content.type === \"resource\") {\n const mimeType =\n content.resource.mimeType === undefined ? \"\" : `data:${content.resource.mimeType};`;\n if (\"text\" in content.resource) {\n return `${mimeType}${content.resource.uri}:${content.resource.text}`;\n }\n\n return `${mimeType}${content.resource.uri}:${content.resource.blob}`;\n }\n\n throw new Error(`Unsupported MCP tool result content: ${serializeMcpValue(content)}`);\n}\n\nfunction serializeMcpValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n const serialized = JSON.stringify(value);\n return serialized === undefined ? String(value) : serialized;\n}\n","import type { ToolDefinition } from \"../completion/index\";\nimport type { Tool } from \"../tool/index\";\nimport { createCallToolParams, mapMcpToolResult } from \"./result\";\nimport type { McpClient, McpToolDefinition } from \"./types\";\n\nconst MCP_TOOL_METADATA_KEY = Symbol.for(\"anvia.mcp.tool.metadata\");\n\nexport function createMcpTool(\n definition: McpToolDefinition,\n client: McpClient,\n serverName?: string,\n): Tool {\n const tool: Tool = {\n name: definition.name,\n definition(): ToolDefinition {\n return {\n name: definition.name,\n description: definition.description ?? \"\",\n parameters: definition.inputSchema,\n };\n },\n async call(args): Promise<string> {\n const result = await client.callTool(createCallToolParams(definition.name, args));\n return mapMcpToolResult(result);\n },\n };\n if (serverName !== undefined) {\n Object.defineProperty(tool, MCP_TOOL_METADATA_KEY, {\n value: { serverName },\n enumerable: false,\n });\n }\n return tool;\n}\n","import { createMcpTool } from \"./tool\";\nimport type { McpConnection, McpServer } from \"./types\";\n\nexport async function connectMcp(connection: McpConnection): Promise<McpServer> {\n const client = await connection.connect();\n let tools: Awaited<ReturnType<typeof client.listTools>>[\"tools\"];\n try {\n ({ tools } = await client.listTools());\n } catch (error) {\n try {\n await client.close();\n } catch {\n // Preserve the initialization failure so callers see the actionable MCP error.\n }\n throw error;\n }\n\n return {\n name: connection.name,\n tools: tools.map((tool) => createMcpTool(tool, client, connection.name)),\n close: () => client.close(),\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type {\n McpClient,\n McpConnection,\n McpHttpOptions,\n McpSseOptions,\n McpStdioOptions,\n} from \"./types\";\n\nconst CORE_CLIENT_VERSION = readCorePackageVersion();\n\nexport const mcp = {\n stdio(options: McpStdioOptions): McpConnection {\n return {\n name: options.name,\n async connect(): Promise<McpClient> {\n const { name: _name, ...server } = options;\n const client = createSdkClient();\n await client.connect(asSdkTransport(new StdioClientTransport(server)));\n return client as McpClient;\n },\n };\n },\n\n http(options: McpHttpOptions): McpConnection {\n return {\n name: options.name,\n async connect(): Promise<McpClient> {\n const client = createSdkClient();\n await client.connect(\n asSdkTransport(\n new StreamableHTTPClientTransport(new URL(options.url), options.transport),\n ),\n );\n return client as McpClient;\n },\n };\n },\n\n sse(options: McpSseOptions): McpConnection {\n return {\n name: options.name,\n async connect(): Promise<McpClient> {\n const client = createSdkClient();\n await client.connect(\n asSdkTransport(new SSEClientTransport(new URL(options.url), options.transport)),\n );\n return client as McpClient;\n },\n };\n },\n};\n\nfunction createSdkClient(): Client {\n return new Client({\n name: \"@anvia/core\",\n version: CORE_CLIENT_VERSION,\n });\n}\n\nfunction readCorePackageVersion(): string {\n try {\n const packageJson = JSON.parse(\n readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf8\"),\n ) as { version?: unknown };\n return typeof packageJson.version === \"string\" ? packageJson.version : \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nfunction asSdkTransport(transport: unknown): Parameters<Client[\"connect\"]>[0] {\n return transport as Parameters<Client[\"connect\"]>[0];\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/mcp/result.ts","../../src/mcp/tool.ts","../../src/mcp/connect.ts","../../src/mcp/connections.ts","../../src/mcp/url-safety.ts"],"sourcesContent":["import { isRecord } from \"../internal/record\";\nimport type { McpToolCallContent, McpToolCallResult } from \"./types\";\n\nexport function createCallToolParams(\n name: string,\n args: unknown,\n): { name: string; arguments?: Record<string, unknown> } {\n if (args === null || args === undefined) {\n return { name };\n }\n\n if (!isRecord(args)) {\n throw new Error(\"MCP tool arguments must be a JSON object\");\n }\n\n return { name, arguments: args };\n}\n\nexport function mapMcpToolResult(result: McpToolCallResult): string {\n if (\"toolResult\" in result) {\n return serializeMcpValue(result.toolResult);\n }\n\n if (result.isError === true) {\n throw new Error(mcpErrorMessage(result.content));\n }\n\n return result.content.map(mapMcpContent).join(\"\");\n}\n\nfunction mcpErrorMessage(content: McpToolCallContent[]): string {\n const text = content\n .map((item) => (item.type === \"text\" ? item.text : undefined))\n .filter((item): item is string => item !== undefined)\n .join(\"\\n\");\n\n return text === \"\" ? \"MCP tool returned an error\" : text;\n}\n\nfunction mapMcpContent(content: McpToolCallContent): string {\n if (content.type === \"text\") {\n return content.text;\n }\n\n if (content.type === \"image\") {\n return `data:${content.mimeType};base64,${content.data}`;\n }\n\n if (content.type === \"resource\") {\n const mimeType =\n content.resource.mimeType === undefined ? \"\" : `data:${content.resource.mimeType};`;\n if (\"text\" in content.resource) {\n return `${mimeType}${content.resource.uri}:${content.resource.text}`;\n }\n\n return `${mimeType}${content.resource.uri}:${content.resource.blob}`;\n }\n\n throw new Error(`Unsupported MCP tool result content: ${serializeMcpValue(content)}`);\n}\n\nfunction serializeMcpValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n const serialized = JSON.stringify(value);\n return serialized === undefined ? String(value) : serialized;\n}\n","import type { ToolDefinition } from \"../completion/index\";\nimport type { Tool } from \"../tool/index\";\nimport { createCallToolParams, mapMcpToolResult } from \"./result\";\nimport type { McpClient, McpToolDefinition } from \"./types\";\n\nconst MCP_TOOL_METADATA_KEY = Symbol.for(\"anvia.mcp.tool.metadata\");\n\nexport function createMcpTool(\n definition: McpToolDefinition,\n client: McpClient,\n serverName?: string,\n): Tool {\n const tool: Tool = {\n name: definition.name,\n definition(): ToolDefinition {\n return {\n name: definition.name,\n description: definition.description ?? \"\",\n parameters: definition.inputSchema,\n };\n },\n async call(args): Promise<string> {\n const result = await client.callTool(createCallToolParams(definition.name, args));\n return mapMcpToolResult(result);\n },\n };\n if (serverName !== undefined) {\n Object.defineProperty(tool, MCP_TOOL_METADATA_KEY, {\n value: { serverName },\n enumerable: false,\n });\n }\n return tool;\n}\n","import { createMcpTool } from \"./tool\";\nimport type { McpConnection, McpServer } from \"./types\";\n\nexport async function connectMcp(connection: McpConnection): Promise<McpServer> {\n const client = await connection.connect();\n let tools: Awaited<ReturnType<typeof client.listTools>>[\"tools\"];\n try {\n ({ tools } = await client.listTools());\n } catch (error) {\n try {\n await client.close();\n } catch {\n // Preserve the initialization failure so callers see the actionable MCP error.\n }\n throw error;\n }\n\n return {\n name: connection.name,\n tools: tools.map((tool) => createMcpTool(tool, client, connection.name)),\n close: () => client.close(),\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type {\n McpClient,\n McpConnection,\n McpHttpOptions,\n McpSseOptions,\n McpStdioOptions,\n} from \"./types\";\nimport { createSafeMcpFetch, parseAndValidateMcpUrl } from \"./url-safety\";\n\nconst CORE_CLIENT_VERSION = readCorePackageVersion();\n\nexport const mcp = {\n stdio(options: McpStdioOptions): McpConnection {\n return {\n name: options.name,\n async connect(): Promise<McpClient> {\n const { name: _name, ...server } = options;\n const client = createSdkClient();\n await client.connect(asSdkTransport(new StdioClientTransport(server)));\n return client as McpClient;\n },\n };\n },\n\n http(options: McpHttpOptions): McpConnection {\n return {\n name: options.name,\n async connect(): Promise<McpClient> {\n assertNoCustomMcpFetch(options.transport?.fetch);\n const url = parseAndValidateMcpUrl(options.url);\n const client = createSdkClient();\n await client.connect(\n asSdkTransport(\n new StreamableHTTPClientTransport(url, {\n ...options.transport,\n fetch: createSafeMcpFetch(),\n }),\n ),\n );\n return client as McpClient;\n },\n };\n },\n\n sse(options: McpSseOptions): McpConnection {\n return {\n name: options.name,\n async connect(): Promise<McpClient> {\n assertNoCustomMcpFetch(options.transport?.fetch);\n const url = parseAndValidateMcpUrl(options.url);\n const client = createSdkClient();\n await client.connect(\n asSdkTransport(\n new SSEClientTransport(url, {\n ...options.transport,\n fetch: createSafeMcpFetch(),\n }),\n ),\n );\n return client as McpClient;\n },\n };\n },\n};\n\nfunction assertNoCustomMcpFetch(fetch: unknown): void {\n if (fetch !== undefined) {\n throw new Error(\n \"Custom MCP transport fetch implementations are not allowed because they can bypass SSRF protection\",\n );\n }\n}\n\nfunction createSdkClient(): Client {\n return new Client({\n name: \"@anvia/core\",\n version: CORE_CLIENT_VERSION,\n });\n}\n\nfunction readCorePackageVersion(): string {\n try {\n const packageJson = JSON.parse(\n readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf8\"),\n ) as { version?: unknown };\n return typeof packageJson.version === \"string\" ? packageJson.version : \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nfunction asSdkTransport(transport: unknown): Parameters<Client[\"connect\"]>[0] {\n return transport as Parameters<Client[\"connect\"]>[0];\n}\n","import type { LookupAddress } from \"node:dns\";\nimport { lookup } from \"node:dns/promises\";\nimport type { LookupFunction } from \"node:net\";\nimport { BlockList, isIP } from \"node:net\";\nimport type { StreamableHTTPClientTransportOptions } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { Agent, Pool, fetch as undiciFetch } from \"undici\";\n\ntype FetchLike = NonNullable<StreamableHTTPClientTransportOptions[\"fetch\"]>;\n\nexport type McpAddressResolver = (hostname: string) => Promise<LookupAddress[]>;\n\nconst blockedIpv4Addresses = new BlockList();\nconst blockedIpv6Addresses = new BlockList();\n\nfor (const [network, prefix] of [\n [\"0.0.0.0\", 8],\n [\"10.0.0.0\", 8],\n [\"100.64.0.0\", 10],\n [\"127.0.0.0\", 8],\n [\"169.254.0.0\", 16],\n [\"172.16.0.0\", 12],\n [\"192.0.0.0\", 24],\n [\"192.0.2.0\", 24],\n [\"192.88.99.0\", 24],\n [\"192.168.0.0\", 16],\n [\"198.18.0.0\", 15],\n [\"198.51.100.0\", 24],\n [\"203.0.113.0\", 24],\n [\"224.0.0.0\", 4],\n [\"240.0.0.0\", 4],\n] as const) {\n blockedIpv4Addresses.addSubnet(network, prefix, \"ipv4\");\n}\n\nfor (const [network, prefix] of [\n [\"::\", 96],\n [\"::ffff:0:0\", 96],\n [\"64:ff9b::\", 96],\n [\"64:ff9b:1::\", 48],\n [\"100::\", 64],\n [\"2001::\", 32],\n [\"2001:2::\", 48],\n [\"2001:10::\", 28],\n [\"2001:20::\", 28],\n [\"2001:db8::\", 32],\n [\"2002::\", 16],\n [\"fc00::\", 7],\n [\"fe80::\", 10],\n [\"fec0::\", 10],\n [\"ff00::\", 8],\n] as const) {\n blockedIpv6Addresses.addSubnet(network, prefix, \"ipv6\");\n}\n\nconst defaultAddressResolver: McpAddressResolver = (hostname) =>\n lookup(hostname, { all: true, verbatim: true });\n\nexport function parseAndValidateMcpUrl(url: string | URL): URL {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new Error(`Invalid MCP URL: ${url}`);\n }\n\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(`MCP URL blocked: only HTTP(S) URLs are allowed (${parsed.protocol})`);\n }\n\n validateMcpHostname(parsed.hostname);\n return parsed;\n}\n\nexport async function resolveAndValidateMcpHostname(\n hostname: string,\n resolveAddresses: McpAddressResolver = defaultAddressResolver,\n): Promise<LookupAddress[]> {\n const normalizedHostname = normalizeHostname(hostname);\n validateMcpHostname(normalizedHostname);\n\n const family = isIP(normalizedHostname);\n if (family !== 0) {\n return [{ address: normalizedHostname, family }];\n }\n\n let addresses: LookupAddress[];\n try {\n addresses = await resolveAddresses(normalizedHostname);\n } catch (cause) {\n throw new Error(`Unable to resolve MCP URL hostname (${normalizedHostname})`, { cause });\n }\n\n if (addresses.length === 0) {\n throw new Error(`Unable to resolve MCP URL hostname (${normalizedHostname})`);\n }\n\n for (const { address } of addresses) {\n validateMcpHostname(address);\n }\n\n return addresses;\n}\n\nexport function createSafeMcpLookup(\n resolveAddresses: McpAddressResolver = defaultAddressResolver,\n): LookupFunction {\n return (hostname, options, callback) => {\n void resolveAndValidateMcpHostname(hostname, resolveAddresses).then(\n (addresses) => {\n const requestedFamily = normalizeRequestedFamily(options.family);\n const matchingAddresses =\n requestedFamily === 0\n ? addresses\n : addresses.filter(({ family }) => family === requestedFamily);\n\n if (matchingAddresses.length === 0) {\n const error = new Error(`No matching address family for MCP URL (${hostname})`);\n Object.assign(error, { code: \"EAI_ADDRFAMILY\" });\n callback(error, []);\n return;\n }\n\n if (options.all) {\n callback(null, matchingAddresses);\n return;\n }\n\n const address = matchingAddresses[0];\n if (!address) {\n callback(new Error(`Unable to resolve MCP URL hostname (${hostname})`), []);\n return;\n }\n callback(null, address.address, address.family);\n },\n (cause: unknown) => {\n callback(asError(cause), []);\n },\n );\n };\n}\n\nexport function createSafeMcpFetch(): FetchLike {\n return (url, init) => {\n parseAndValidateMcpUrl(url);\n return undiciFetch(url as Parameters<typeof undiciFetch>[0], {\n ...(init as Parameters<typeof undiciFetch>[1]),\n dispatcher: safeMcpDispatcher,\n }) as ReturnType<FetchLike>;\n };\n}\n\nfunction validateMcpHostname(hostname: string): void {\n const normalizedHostname = normalizeHostname(hostname);\n\n if (normalizedHostname === \"localhost\" || normalizedHostname.endsWith(\".localhost\")) {\n throw new Error(`MCP URL blocked: localhost not allowed (${normalizedHostname})`);\n }\n\n const family = isIP(normalizedHostname);\n if (family === 0) {\n return;\n }\n\n if (\n (family === 4 && normalizedHostname.startsWith(\"127.\")) ||\n (family === 6 && normalizedHostname === \"::1\")\n ) {\n throw new Error(`MCP URL blocked: localhost not allowed (${normalizedHostname})`);\n }\n\n if (normalizedHostname === \"169.254.169.254\" || normalizedHostname === \"fd00:ec2::254\") {\n throw new Error(`MCP URL blocked: cloud metadata endpoint not allowed (${normalizedHostname})`);\n }\n\n if (\n (family === 4 && blockedIpv4Addresses.check(normalizedHostname, \"ipv4\")) ||\n (family === 6 && blockedIpv6Addresses.check(normalizedHostname, \"ipv6\"))\n ) {\n const range = family === 4 ? \"IP\" : \"IPv6\";\n throw new Error(`MCP URL blocked: private ${range} range not allowed (${normalizedHostname})`);\n }\n}\n\nfunction normalizeHostname(hostname: string): string {\n const withoutBrackets =\n hostname.startsWith(\"[\") && hostname.endsWith(\"]\") ? hostname.slice(1, -1) : hostname;\n return withoutBrackets.toLowerCase().replace(/\\.+$/, \"\");\n}\n\nfunction normalizeRequestedFamily(family: number | string | undefined): 0 | 4 | 6 {\n if (family === 4 || family === \"IPv4\") {\n return 4;\n }\n if (family === 6 || family === \"IPv6\") {\n return 6;\n }\n return 0;\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause));\n}\n\nconst safeMcpDispatcher = new Agent({\n autoSelectFamily: true,\n connect: {\n lookup: createSafeMcpLookup(),\n },\n factory(origin, options) {\n parseAndValidateMcpUrl(origin);\n return new Pool(origin, options as Pool.Options);\n },\n});\n"],"mappings":"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","names":[]}
@@ -3,18 +3,18 @@ import {
3
3
  PromptCancelledError,
4
4
  PromptRequest,
5
5
  ToolApprovalRequiredError
6
- } from "../chunk-VXONXP2G.js";
6
+ } from "../chunk-BALBBVI3.js";
7
7
  import "../chunk-XUUY2L2D.js";
8
- import "../chunk-2NDQHV7V.js";
9
- import "../chunk-4BGN6PYF.js";
8
+ import "../chunk-HYUYZEAJ.js";
9
+ import "../chunk-MELYDKWQ.js";
10
10
  import "../chunk-2ODTMRHP.js";
11
11
  import "../chunk-MRQLEK2B.js";
12
+ import "../chunk-MNWK2USR.js";
13
+ import "../chunk-OIMLU4SF.js";
12
14
  import "../chunk-Q25IWLBT.js";
13
15
  import "../chunk-MC3CCKEB.js";
14
16
  import "../chunk-ADH7NNCS.js";
15
17
  import "../chunk-WQKHFADH.js";
16
- import "../chunk-MNWK2USR.js";
17
- import "../chunk-OIMLU4SF.js";
18
18
  import "../chunk-CWUJUSOS.js";
19
19
  export {
20
20
  MaxTurnsError,
@@ -2,15 +2,15 @@ import {
2
2
  SkillValidationError,
3
3
  loadSkills,
4
4
  skill
5
- } from "../chunk-BCA4VZ5W.js";
5
+ } from "../chunk-NCPN4SJR.js";
6
6
  import "../chunk-CQNNSZPG.js";
7
7
  import "../chunk-YK4WAAS4.js";
8
- import "../chunk-2NDQHV7V.js";
9
- import "../chunk-4BGN6PYF.js";
10
- import "../chunk-ADH7NNCS.js";
11
- import "../chunk-WQKHFADH.js";
8
+ import "../chunk-HYUYZEAJ.js";
9
+ import "../chunk-MELYDKWQ.js";
12
10
  import "../chunk-MNWK2USR.js";
13
11
  import "../chunk-OIMLU4SF.js";
12
+ import "../chunk-ADH7NNCS.js";
13
+ import "../chunk-WQKHFADH.js";
14
14
  export {
15
15
  SkillValidationError,
16
16
  loadSkills,
@@ -12,17 +12,17 @@ import {
12
12
  normalizeToolResultOutput,
13
13
  parseToolArgs,
14
14
  toolResultContentToText
15
- } from "../chunk-2NDQHV7V.js";
15
+ } from "../chunk-HYUYZEAJ.js";
16
16
  import {
17
17
  createTool
18
- } from "../chunk-4BGN6PYF.js";
18
+ } from "../chunk-MELYDKWQ.js";
19
+ import "../chunk-MNWK2USR.js";
20
+ import "../chunk-OIMLU4SF.js";
19
21
  import {
20
22
  isToolResultContentArray,
21
23
  serializeToolResultOutput
22
24
  } from "../chunk-ADH7NNCS.js";
23
25
  import "../chunk-WQKHFADH.js";
24
- import "../chunk-MNWK2USR.js";
25
- import "../chunk-OIMLU4SF.js";
26
26
  export {
27
27
  ToolCallError,
28
28
  ToolJsonError,
@@ -3,10 +3,10 @@ import {
3
3
  InMemoryVectorStore,
4
4
  createVectorSearchTool,
5
5
  vectorFilter
6
- } from "../chunk-4BGN6PYF.js";
7
- import "../chunk-WQKHFADH.js";
6
+ } from "../chunk-MELYDKWQ.js";
8
7
  import "../chunk-MNWK2USR.js";
9
8
  import "../chunk-OIMLU4SF.js";
9
+ import "../chunk-WQKHFADH.js";
10
10
  export {
11
11
  InMemoryVectorIndex,
12
12
  InMemoryVectorStore,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/core",
3
- "version": "0.25.1",
3
+ "version": "0.26.0",
4
4
  "description": "Core runtime primitives for context-aware Anvia agents.",
5
5
  "author": "anvia",
6
6
  "maintainer": "Indra Zulfi",
@@ -121,6 +121,7 @@
121
121
  "@modelcontextprotocol/sdk": "^1.30.0",
122
122
  "pdfjs-dist": "^6.2.108",
123
123
  "tinyglobby": "^0.2.17",
124
+ "undici": "^6.25.0",
124
125
  "yaml": "^2.9.0",
125
126
  "zod": "^4.4.3"
126
127
  },