@meetsmore-oss/use-ai-server 1.15.0 → 1.16.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.
@@ -0,0 +1,22 @@
1
+ import type { Message, ResolveAttachments, ResolveAttachmentsContext } from '@meetsmore-oss/use-ai-core';
2
+ /**
3
+ * Counts the `image_ref` / `file_ref` parts left in the history, for observability.
4
+ * After resolution these become `image_url` / `file_url`; any that remain were not
5
+ * resolved and are dropped during conversion (the attachment never reaches the model).
6
+ */
7
+ export declare function countRefParts(messages: Message[]): number;
8
+ /**
9
+ * Collects ref-bearing attachment parts across the run's whole message history,
10
+ * calls the host's `resolve` once, and puts the returned parts back in place.
11
+ * The input is not mutated. See core's {@link ResolveAttachments} for the
12
+ * details of the resolve contract.
13
+ *
14
+ * Returns the original `messages` reference as-is when there are no refs. When
15
+ * there are, it returns a new array but clones only the messages and content
16
+ * arrays it actually touches, so the caller's input is left unchanged.
17
+ *
18
+ * @throws When `resolve` returns a different number of parts than it was given
19
+ * (a contract violation; the host must return one replacement per input).
20
+ */
21
+ export declare function resolveAttachmentParts(messages: Message[], resolve: ResolveAttachments, context: ResolveAttachmentsContext): Promise<Message[]>;
22
+ //# sourceMappingURL=attachmentResolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachmentResolution.d.ts","sourceRoot":"","sources":["../../src/attachmentResolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAEP,kBAAkB,EAClB,yBAAyB,EAC1B,MAAM,4BAA4B,CAAC;AAkBpC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAWzD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,OAAO,EAAE,CAAC,CA2CpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=attachmentResolution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachmentResolution.test.d.ts","sourceRoot":"","sources":["../../src/attachmentResolution.test.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export { UseAIServer } from './server';
2
2
  export type { UseAIServerConfig, McpEndpointConfig, ToolDefinition, CorsOptions } from './types';
3
3
  export type { ClientSession } from './server';
4
+ export { resolveAttachmentParts } from './attachmentResolution';
5
+ export type { ResolveAttachments, ResolveAttachmentsContext, MultimodalContent } from './types';
4
6
  export type { Agent, AgentInput, EventEmitter, AgentResult } from './agents';
5
7
  export { AISDKAgent, type AISDKAgentConfig, type MessageWithCacheContext, type CacheTtl, type CacheBreakpointResult, type CacheBreakpointFn, createMockReasoningModel } from './agents';
6
8
  export type { UseAIServerPlugin, MessageHandler, BeforeRunAgentResult } from './plugins';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACjG,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,KAAK,QAAQ,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAGxL,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGzF,OAAO,EACL,uBAAuB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,yBAAyB,EACzB,KAAK,uBAAuB,GAC7B,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,wBAAwB,EACxB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,GAAG,EACH,EAAE,EACF,GAAG,GACJ,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACjG,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGhG,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,KAAK,QAAQ,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAGxL,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGzF,OAAO,EACL,uBAAuB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,yBAAyB,EACzB,KAAK,uBAAuB,GAC7B,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,wBAAwB,EACxB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,GAAG,EACH,EAAE,EACF,GAAG,GACJ,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -116744,6 +116744,62 @@ function isUseAIInternalResponse(value) {
116744
116744
  return isMcpConfirmationResponse(value);
116745
116745
  }
116746
116746
 
116747
+ // src/attachmentResolution.ts
116748
+ function hasRef(part) {
116749
+ if (typeof part !== "object" || part === null) {
116750
+ return false;
116751
+ }
116752
+ const p = part;
116753
+ return (p.type === "image_ref" || p.type === "file_ref") && typeof p.ref === "string" && p.ref.length > 0;
116754
+ }
116755
+ function countRefParts(messages) {
116756
+ let count = 0;
116757
+ for (const msg of messages) {
116758
+ const content = msg.content;
116759
+ if (Array.isArray(content)) {
116760
+ for (const part of content) {
116761
+ if (hasRef(part))
116762
+ count++;
116763
+ }
116764
+ }
116765
+ }
116766
+ return count;
116767
+ }
116768
+ async function resolveAttachmentParts(messages, resolve, context) {
116769
+ const refParts = [];
116770
+ const locations = [];
116771
+ messages.forEach((msg, message) => {
116772
+ const content = msg.content;
116773
+ if (Array.isArray(content)) {
116774
+ content.forEach((part, partIndex) => {
116775
+ if (hasRef(part)) {
116776
+ refParts.push(part);
116777
+ locations.push({ message, part: partIndex });
116778
+ }
116779
+ });
116780
+ }
116781
+ });
116782
+ if (refParts.length === 0) {
116783
+ return messages;
116784
+ }
116785
+ const resolved = await resolve(refParts, context);
116786
+ if (!Array.isArray(resolved) || resolved.length !== refParts.length) {
116787
+ throw new Error(`resolveAttachments must return one part per input ref (expected ${refParts.length})`);
116788
+ }
116789
+ const out = messages.slice();
116790
+ const clonedContent = new Map;
116791
+ locations.forEach((loc, i) => {
116792
+ let content = clonedContent.get(loc.message);
116793
+ if (!content) {
116794
+ content = out[loc.message].content.slice();
116795
+ clonedContent.set(loc.message, content);
116796
+ out[loc.message] = { ...out[loc.message], content };
116797
+ }
116798
+ content[loc.part] = resolved[i];
116799
+ });
116800
+ return out;
116801
+ }
116802
+
116747
116803
  // src/rateLimiter.ts
116748
116804
  class RateLimiter {
116749
116805
  requests = new Map;
@@ -120925,6 +120981,7 @@ class UseAIServer {
120925
120981
  messageHandlers = new Map;
120926
120982
  mcpEndpoints = [];
120927
120983
  serverTools = [];
120984
+ resolveAttachments;
120928
120985
  clientIpTracker;
120929
120986
  constructor(config) {
120930
120987
  startTracing(config.spanProcessors);
@@ -120973,6 +121030,7 @@ class UseAIServer {
120973
121030
  names: this.serverTools.map((t) => t.name)
120974
121031
  });
120975
121032
  }
121033
+ this.resolveAttachments = config.resolveAttachments;
120976
121034
  this.plugins = config.plugins ?? [];
120977
121035
  this.initializePlugins();
120978
121036
  this.runtimeAdapter = createRuntimeAdapter(config.runtime ?? "auto");
@@ -121231,9 +121289,9 @@ class UseAIServer {
121231
121289
  for (const block of content) {
121232
121290
  if (block.type === "text" && "text" in block) {
121233
121291
  parts.push({ type: "text", text: block.text });
121234
- } else if (block.type === "image" && "url" in block) {
121292
+ } else if (block.type === "image_url" && "url" in block) {
121235
121293
  parts.push({ type: "image", image: block.url });
121236
- } else if (block.type === "file" && "url" in block) {
121294
+ } else if (block.type === "file_url" && "url" in block) {
121237
121295
  parts.push({
121238
121296
  type: "file",
121239
121297
  data: block.url,
@@ -121261,7 +121319,29 @@ ${block.text}`
121261
121319
  }
121262
121320
  return "";
121263
121321
  };
121264
- const incomingMessages = messages.map((msg, msgIndex) => {
121322
+ let resolvedMessages = messages;
121323
+ let resolveErrored = false;
121324
+ if (this.resolveAttachments) {
121325
+ try {
121326
+ resolvedMessages = await resolveAttachmentParts(messages, this.resolveAttachments, { forwardedProps });
121327
+ } catch (error) {
121328
+ resolveErrored = true;
121329
+ logger2.error("resolveAttachments failed; proceeding without resolved attachments", {
121330
+ runId,
121331
+ error: error instanceof Error ? error.message : String(error)
121332
+ });
121333
+ resolvedMessages = messages;
121334
+ }
121335
+ }
121336
+ const unresolvedRefs = countRefParts(resolvedMessages);
121337
+ if (unresolvedRefs > 0) {
121338
+ logger2.warn("Attachment refs left unresolved; attachments will not reach the model", {
121339
+ runId,
121340
+ unresolvedRefs,
121341
+ reason: resolveErrored ? "resolver-errored" : this.resolveAttachments ? "resolver-returned-ref" : "no-resolver-wired"
121342
+ });
121343
+ }
121344
+ const incomingMessages = resolvedMessages.map((msg, msgIndex) => {
121265
121345
  if (msg.role === "user") {
121266
121346
  return {
121267
121347
  role: "user",
@@ -121338,7 +121418,7 @@ ${block.text}`
121338
121418
  let toolName;
121339
121419
  let toolEncryptedValue;
121340
121420
  for (let i = msgIndex - 1;i >= 0; i--) {
121341
- const prevToolCalls = messages[i].toolCalls;
121421
+ const prevToolCalls = resolvedMessages[i].toolCalls;
121342
121422
  if (prevToolCalls) {
121343
121423
  const match = prevToolCalls.find((tc) => tc.id === toolCallId);
121344
121424
  if (match) {
@@ -147431,6 +147511,7 @@ function defineServerTool(description, schemaOrExecute, executeOrOptions, option
147431
147511
  }
147432
147512
  export {
147433
147513
  startRunSpan,
147514
+ resolveAttachmentParts,
147434
147515
  or,
147435
147516
  not,
147436
147517
  logger2 as logger,
package/dist/server.d.ts CHANGED
@@ -64,6 +64,7 @@ export declare class UseAIServer {
64
64
  private messageHandlers;
65
65
  private mcpEndpoints;
66
66
  private serverTools;
67
+ private resolveAttachments?;
67
68
  private clientIpTracker;
68
69
  /**
69
70
  * Creates a new UseAI server instance.
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iBAAiB,EAYlB,MAAM,SAAS,CAAC;AAOjB,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAezE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,MAAM,CAIZ;IACF,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,WAAW,CAA8B;IAEjD,OAAO,CAAC,eAAe,CAAkB;IAEzC;;;;;OAKG;gBACS,MAAM,EAAE,iBAAiB;IAoGrC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;;;;;OAMG;IACI,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAS1E,OAAO,CAAC,mBAAmB;YAqGb,mBAAmB;YA8BnB,cAAc;IA4Y5B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,gBAAgB;IAiDxB,OAAO,CAAC,0BAA0B;IAqBlC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,SAAS;IAMjB;;;;;;;;;;;OAWG;YACW,qBAAqB;IA+CnC;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAwC5B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IAYjC;;;OAGG;IACU,KAAK;CAsBnB"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EAYlB,MAAM,SAAS,CAAC;AAOjB,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAezE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,MAAM,CAIZ;IACF,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,WAAW,CAA8B;IAEjD,OAAO,CAAC,kBAAkB,CAAC,CAAqB;IAEhD,OAAO,CAAC,eAAe,CAAkB;IAEzC;;;;;OAKG;gBACS,MAAM,EAAE,iBAAiB;IAsGrC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;;;;;OAMG;IACI,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAS1E,OAAO,CAAC,mBAAmB;YAqGb,mBAAmB;YA8BnB,cAAc;IA6a5B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,gBAAgB;IAiDxB,OAAO,CAAC,0BAA0B;IAqBlC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,SAAS;IAMjB;;;;;;;;;;;OAWG;YACW,qBAAqB;IA+CnC;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAwC5B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IAYjC;;;OAGG;IACU,KAAK;CAsBnB"}
@@ -0,0 +1,22 @@
1
+ import type { Message, ResolveAttachments, ResolveAttachmentsContext } from '@meetsmore-oss/use-ai-core';
2
+ /**
3
+ * Counts the `image_ref` / `file_ref` parts left in the history, for observability.
4
+ * After resolution these become `image_url` / `file_url`; any that remain were not
5
+ * resolved and are dropped during conversion (the attachment never reaches the model).
6
+ */
7
+ export declare function countRefParts(messages: Message[]): number;
8
+ /**
9
+ * Collects ref-bearing attachment parts across the run's whole message history,
10
+ * calls the host's `resolve` once, and puts the returned parts back in place.
11
+ * The input is not mutated. See core's {@link ResolveAttachments} for the
12
+ * details of the resolve contract.
13
+ *
14
+ * Returns the original `messages` reference as-is when there are no refs. When
15
+ * there are, it returns a new array but clones only the messages and content
16
+ * arrays it actually touches, so the caller's input is left unchanged.
17
+ *
18
+ * @throws When `resolve` returns a different number of parts than it was given
19
+ * (a contract violation; the host must return one replacement per input).
20
+ */
21
+ export declare function resolveAttachmentParts(messages: Message[], resolve: ResolveAttachments, context: ResolveAttachmentsContext): Promise<Message[]>;
22
+ //# sourceMappingURL=attachmentResolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachmentResolution.d.ts","sourceRoot":"","sources":["../../src/attachmentResolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAEP,kBAAkB,EAClB,yBAAyB,EAC1B,MAAM,4BAA4B,CAAC;AAkBpC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAWzD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,OAAO,EAAE,CAAC,CA2CpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=attachmentResolution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachmentResolution.test.d.ts","sourceRoot":"","sources":["../../src/attachmentResolution.test.ts"],"names":[],"mappings":""}
@@ -1,6 +1,8 @@
1
1
  export { UseAIServer } from './server';
2
2
  export type { UseAIServerConfig, McpEndpointConfig, ToolDefinition, CorsOptions } from './types';
3
3
  export type { ClientSession } from './server';
4
+ export { resolveAttachmentParts } from './attachmentResolution';
5
+ export type { ResolveAttachments, ResolveAttachmentsContext, MultimodalContent } from './types';
4
6
  export type { Agent, AgentInput, EventEmitter, AgentResult } from './agents';
5
7
  export { AISDKAgent, type AISDKAgentConfig, type MessageWithCacheContext, type CacheTtl, type CacheBreakpointResult, type CacheBreakpointFn, createMockReasoningModel } from './agents';
6
8
  export type { UseAIServerPlugin, MessageHandler, BeforeRunAgentResult } from './plugins';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACjG,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,KAAK,QAAQ,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAGxL,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGzF,OAAO,EACL,uBAAuB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,yBAAyB,EACzB,KAAK,uBAAuB,GAC7B,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,wBAAwB,EACxB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,GAAG,EACH,EAAE,EACF,GAAG,GACJ,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACjG,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGhG,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,KAAK,QAAQ,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAGxL,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGzF,OAAO,EACL,uBAAuB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,yBAAyB,EACzB,KAAK,uBAAuB,GAC7B,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,wBAAwB,EACxB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,GAAG,EACH,EAAE,EACF,GAAG,GACJ,MAAM,SAAS,CAAC"}
@@ -64,6 +64,7 @@ export declare class UseAIServer {
64
64
  private messageHandlers;
65
65
  private mcpEndpoints;
66
66
  private serverTools;
67
+ private resolveAttachments?;
67
68
  private clientIpTracker;
68
69
  /**
69
70
  * Creates a new UseAI server instance.
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iBAAiB,EAYlB,MAAM,SAAS,CAAC;AAOjB,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAezE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,MAAM,CAIZ;IACF,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,WAAW,CAA8B;IAEjD,OAAO,CAAC,eAAe,CAAkB;IAEzC;;;;;OAKG;gBACS,MAAM,EAAE,iBAAiB;IAoGrC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;;;;;OAMG;IACI,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAS1E,OAAO,CAAC,mBAAmB;YAqGb,mBAAmB;YA8BnB,cAAc;IA4Y5B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,gBAAgB;IAiDxB,OAAO,CAAC,0BAA0B;IAqBlC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,SAAS;IAMjB;;;;;;;;;;;OAWG;YACW,qBAAqB;IA+CnC;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAwC5B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IAYjC;;;OAGG;IACU,KAAK;CAsBnB"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EAYlB,MAAM,SAAS,CAAC;AAOjB,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAezE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,MAAM,CAIZ;IACF,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,WAAW,CAA8B;IAEjD,OAAO,CAAC,kBAAkB,CAAC,CAAqB;IAEhD,OAAO,CAAC,eAAe,CAAkB;IAEzC;;;;;OAKG;gBACS,MAAM,EAAE,iBAAiB;IAsGrC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;;;;;OAMG;IACI,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAS1E,OAAO,CAAC,mBAAmB;YAqGb,mBAAmB;YA8BnB,cAAc;IA6a5B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,gBAAgB;IAiDxB,OAAO,CAAC,0BAA0B;IAqBlC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,SAAS;IAMjB;;;;;;;;;;;OAWG;YACW,qBAAqB;IA+CnC;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAwC5B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAoBtB;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IAYjC;;;OAGG;IACU,KAAK;CAsBnB"}
@@ -158,7 +158,18 @@ export interface UseAIServerConfig<TAgents extends Record<string, import('./agen
158
158
  * ```
159
159
  */
160
160
  spanProcessors?: import('./instrumentation').SpanProcessor[];
161
+ /**
162
+ * Optional host seam that resolves attachment refs into content the model can read.
163
+ *
164
+ * The host converts each ref into a part use-ai understands (`{ type:'image_url', url }` /
165
+ * `{ type:'file_url', url, mimeType, name }` / a `{ type:'text', text }` fallback when
166
+ * the attachment is missing or unfetchable) and returns it.
167
+ * When omitted, ref-bearing parts pass through unresolved and are silently dropped
168
+ * during conversion (the attachment never reaches the model). See @see ResolveAttachments
169
+ * for the full contract.
170
+ */
171
+ resolveAttachments?: import('@meetsmore-oss/use-ai-core').ResolveAttachments;
161
172
  }
162
- export type { ToolDefinition, ClientMessage, Tool, Message, Context, RunAgentInput, State, RunAgentMessage, ToolResultMessage, AbortRunMessage, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, TextMessageChunkEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ToolCallChunkEvent, ToolCallResultEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, ActivitySnapshotEvent, ActivityDeltaEvent, AGUIEvent, ToolAnnotations, ToolCallStartExtensions, WorkflowStatus, UseAIClientMessage, RunWorkflowMessage, UseAIForwardedProps, ToolApprovalRequestEvent, ToolApprovalResponseMessage, ReasoningStartEvent, ReasoningMessageStartEvent, ReasoningMessageContentEvent, ReasoningMessageEndEvent, ReasoningEndEvent, ReasoningEncryptedValueEvent, ReasoningPart, } from '@meetsmore-oss/use-ai-core';
173
+ export type { ToolDefinition, ClientMessage, Tool, Message, Context, RunAgentInput, State, RunAgentMessage, ToolResultMessage, AbortRunMessage, RunStartedEvent, RunFinishedEvent, RunErrorEvent, StepStartedEvent, StepFinishedEvent, TextMessageStartEvent, TextMessageContentEvent, TextMessageEndEvent, TextMessageChunkEvent, ToolCallStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ToolCallChunkEvent, ToolCallResultEvent, StateSnapshotEvent, StateDeltaEvent, MessagesSnapshotEvent, RawEvent, CustomEvent, ActivitySnapshotEvent, ActivityDeltaEvent, AGUIEvent, ToolAnnotations, ToolCallStartExtensions, WorkflowStatus, UseAIClientMessage, RunWorkflowMessage, UseAIForwardedProps, ToolApprovalRequestEvent, ToolApprovalResponseMessage, ReasoningStartEvent, ReasoningMessageStartEvent, ReasoningMessageContentEvent, ReasoningMessageEndEvent, ReasoningEndEvent, ReasoningEncryptedValueEvent, ReasoningPart, MultimodalContent, ResolveAttachments, ResolveAttachmentsContext, } from '@meetsmore-oss/use-ai-core';
163
174
  export { EventType, ErrorCode, TOOL_APPROVAL_REQUEST } from '@meetsmore-oss/use-ai-core';
164
175
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}