veryfront 0.1.566 → 0.1.567

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/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.566",
3
+ "version": "0.1.567",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "workspace": [
@@ -1 +1 @@
1
- {"version":3,"file":"text-generation-runtime-message-converter.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/text-generation-runtime-message-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAGV,4BAA4B,EAI7B,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAGL,KAAK,OAAO,EAGb,MAAM,aAAa,CAAC;AA0ErB;;GAEG;AACH,wBAAgB,qCAAqC,CAAC,GAAG,EAAE,OAAO,GAAG,4BAA4B,CA2FhG;AA8BD;;GAEG;AACH,wBAAgB,sCAAsC,CACpD,QAAQ,EAAE,OAAO,EAAE,GAClB,4BAA4B,EAAE,CAyChC"}
1
+ {"version":3,"file":"text-generation-runtime-message-converter.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/text-generation-runtime-message-converter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAGV,4BAA4B,EAI7B,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAGL,KAAK,OAAO,EAGb,MAAM,aAAa,CAAC;AA0ErB;;GAEG;AACH,wBAAgB,qCAAqC,CAAC,GAAG,EAAE,OAAO,GAAG,4BAA4B,CA2FhG;AA8BD;;GAEG;AACH,wBAAgB,sCAAsC,CACpD,QAAQ,EAAE,OAAO,EAAE,GAClB,4BAA4B,EAAE,CA4BhC"}
@@ -181,7 +181,6 @@ function hasProviderSendableAssistantContent(message) {
181
181
  */
182
182
  export function convertToTextGenerationRuntimeMessages(messages) {
183
183
  const textGenerationRuntimeMessages = [];
184
- const toolResultMessageIndexes = new Map();
185
184
  for (const message of messages) {
186
185
  if (!hasProviderSendableAssistantContent(message)) {
187
186
  continue;
@@ -196,14 +195,7 @@ export function convertToTextGenerationRuntimeMessages(messages) {
196
195
  continue;
197
196
  }
198
197
  for (const toolResultPart of toolResultParts) {
199
- const toolResultMessage = convertToolResultPart(toolResultPart);
200
- const existingIndex = toolResultMessageIndexes.get(toolResultPart.toolCallId);
201
- if (existingIndex === undefined) {
202
- toolResultMessageIndexes.set(toolResultPart.toolCallId, textGenerationRuntimeMessages.length);
203
- textGenerationRuntimeMessages.push(toolResultMessage);
204
- continue;
205
- }
206
- textGenerationRuntimeMessages[existingIndex] = toolResultMessage;
198
+ textGenerationRuntimeMessages.push(convertToolResultPart(toolResultPart));
207
199
  }
208
200
  }
209
201
  return textGenerationRuntimeMessages;
@@ -1 +1 @@
1
- {"version":3,"file":"message-prep.d.ts","sourceRoot":"","sources":["../../../src/src/chat/message-prep.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAQjC,OAAO,EAKL,KAAK,aAAa,EAGlB,KAAK,oBAAoB,EAE1B,MAAM,YAAY,CAAC;AAIpB,uBAAuB;AACvB,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAErD;AAOD,qBAAqB;AACrB,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,oBAAoB,EAAE,EAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,oBAAoB,EAAE,CAiCxB;AAqCD,kDAAkD;AAClD,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,oBAAoB,EAAE,EAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,oBAAoB,EAAE,CAiExB;AA+BD,4DAA4D;AAC5D,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAGxE;AAED,gDAAgD;AAChD,wBAAgB,kCAAkC,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAwB7F;AAED,qDAAqD;AACrD,wBAAgB,wCAAwC,CACtD,QAAQ,EAAE,aAAa,EAAE,GACxB,aAAa,EAAE,CAmDjB;AAiBD,gCAAgC;AAChC,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAiBhF;AA6CD,wCAAwC;AACxC,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,oBAAoB,EAAE,GAC/B,oBAAoB,EAAE,CAwBxB;AAED;;GAEG;AACH,4CAA4C;AAC5C,eAAO,MAAM,qBAAqB,sCAAgC,CAAC;AAYnE,wDAAwD;AACxD,wBAAgB,0CAA0C,CACxD,QAAQ,EAAE,aAAa,EAAE,GACxB,oBAAoB,EAAE,CAcxB;AA4FD,6BAA6B;AAC7B,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,EAAE,CAsE3F;AAWD,yBAAyB;AACzB,wBAAgB,eAAe,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,EAAE,CA4IxF;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGjF;AAED,sCAAsC;AACtC,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,EAAE,CA4B7F;AAED,wBAAwB;AACxB,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,oBAAoB,EAAE,EAChC,QAAQ,GAAE,MAAU,GACnB,oBAAoB,EAAE,CAexB;AAED,2BAA2B;AAC3B,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,EAAE,CA0D1F;AAED,4BAA4B;AAC5B,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,oBAAoB,EAAE,EAChC,MAAM,GAAE,MAA6B,EACrC,QAAQ,GAAE,MAAU,GACnB,oBAAoB,EAAE,CAMxB;AAED;;GAEG;AACH,4DAA4D;AAC5D,eAAO,MAAM,kCAAkC,mDAA6C,CAAC"}
1
+ {"version":3,"file":"message-prep.d.ts","sourceRoot":"","sources":["../../../src/src/chat/message-prep.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAQjC,OAAO,EAKL,KAAK,aAAa,EAGlB,KAAK,oBAAoB,EAE1B,MAAM,YAAY,CAAC;AAIpB,uBAAuB;AACvB,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAErD;AAOD,qBAAqB;AACrB,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,oBAAoB,EAAE,EAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,oBAAoB,EAAE,CAiCxB;AAqCD,kDAAkD;AAClD,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,oBAAoB,EAAE,EAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,oBAAoB,EAAE,CAiExB;AA+BD,4DAA4D;AAC5D,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAGxE;AAED,gDAAgD;AAChD,wBAAgB,kCAAkC,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAwB7F;AAED,qDAAqD;AACrD,wBAAgB,wCAAwC,CACtD,QAAQ,EAAE,aAAa,EAAE,GACxB,aAAa,EAAE,CAmDjB;AAyCD,gCAAgC;AAChC,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAiBhF;AAsFD,wCAAwC;AACxC,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,oBAAoB,EAAE,GAC/B,oBAAoB,EAAE,CAwBxB;AAED;;GAEG;AACH,4CAA4C;AAC5C,eAAO,MAAM,qBAAqB,sCAAgC,CAAC;AAYnE,wDAAwD;AACxD,wBAAgB,0CAA0C,CACxD,QAAQ,EAAE,aAAa,EAAE,GACxB,oBAAoB,EAAE,CAiBxB;AA4FD,6BAA6B;AAC7B,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,EAAE,CAsE3F;AAWD,yBAAyB;AACzB,wBAAgB,eAAe,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,EAAE,CA4IxF;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGjF;AAED,sCAAsC;AACtC,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,EAAE,CA4B7F;AAED,wBAAwB;AACxB,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,oBAAoB,EAAE,EAChC,QAAQ,GAAE,MAAU,GACnB,oBAAoB,EAAE,CAexB;AAED,2BAA2B;AAC3B,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,EAAE,CA0D1F;AAED,4BAA4B;AAC5B,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,oBAAoB,EAAE,EAChC,MAAM,GAAE,MAA6B,EACrC,QAAQ,GAAE,MAAU,GACnB,oBAAoB,EAAE,CAMxB;AAED;;GAEG;AACH,4DAA4D;AAC5D,eAAO,MAAM,kCAAkC,mDAA6C,CAAC"}
@@ -237,6 +237,25 @@ function isPendingToolPart(part) {
237
237
  }
238
238
  return part.type === "dynamic-tool" || part.type === "tool_call" || part.type.startsWith("tool-");
239
239
  }
240
+ function getToolPartCallId(part) {
241
+ if (!isRecord(part)) {
242
+ return null;
243
+ }
244
+ const toolCallId = part.toolCallId;
245
+ return typeof toolCallId === "string" && toolCallId.length > 0 ? toolCallId : null;
246
+ }
247
+ function isToolLikePart(part) {
248
+ return isRecord(part) && typeof part.type === "string" &&
249
+ (part.type === "dynamic-tool" || part.type === "tool_call" || part.type.startsWith("tool-"));
250
+ }
251
+ function hasToolState(part, state) {
252
+ return isRecord(part) && part.state === state && isToolLikePart(part);
253
+ }
254
+ function isToolErrorState(part) {
255
+ return isRecord(part) &&
256
+ (part.state === "output-error" || part.state === "output-denied" || part.state === "error") &&
257
+ isToolLikePart(part);
258
+ }
240
259
  /** Strip pending tool parts. */
241
260
  export function stripPendingToolParts(messages) {
242
261
  return messages.flatMap((message) => {
@@ -253,6 +272,39 @@ export function stripPendingToolParts(messages) {
253
272
  return [{ ...message, parts }];
254
273
  });
255
274
  }
275
+ function stripSupersededToolErrorParts(messages) {
276
+ return messages.flatMap((message) => {
277
+ if (message.role !== "assistant" || message.parts.length === 0) {
278
+ return [message];
279
+ }
280
+ const completedToolCallIds = new Set();
281
+ for (const part of message.parts) {
282
+ if (hasToolState(part, "output-available")) {
283
+ const toolCallId = getToolPartCallId(part);
284
+ if (toolCallId) {
285
+ completedToolCallIds.add(toolCallId);
286
+ }
287
+ }
288
+ }
289
+ if (completedToolCallIds.size === 0) {
290
+ return [message];
291
+ }
292
+ const parts = message.parts.filter((part) => {
293
+ if (!isToolErrorState(part)) {
294
+ return true;
295
+ }
296
+ const toolCallId = getToolPartCallId(part);
297
+ return !toolCallId || !completedToolCallIds.has(toolCallId);
298
+ });
299
+ if (parts.length === message.parts.length) {
300
+ return [message];
301
+ }
302
+ if (parts.length === 0) {
303
+ return [];
304
+ }
305
+ return [{ ...message, parts }];
306
+ });
307
+ }
256
308
  function isKeepableModelPart(part, includeReasoning) {
257
309
  if (!isRecord(part) || typeof part.type !== "string")
258
310
  return false;
@@ -344,7 +396,8 @@ export function prepareProviderModelMessagesFromUiMessages(messages) {
344
396
  const validMessages = messages.filter((message) => message && typeof message === "object" && "role" in message);
345
397
  const normalizedMessages = normalizeMessageFilePartMediaTypes(validMessages);
346
398
  const strippedPendingToolMessages = stripPendingToolParts(normalizedMessages);
347
- const rewrittenMessages = rewriteUnsupportedFilePartsAsAnnotations(strippedPendingToolMessages);
399
+ const strippedSupersededToolMessages = stripSupersededToolErrorParts(strippedPendingToolMessages);
400
+ const rewrittenMessages = rewriteUnsupportedFilePartsAsAnnotations(strippedSupersededToolMessages);
348
401
  const providerModelMessages = convertUiMessagesToProviderModelMessages(rewrittenMessages);
349
402
  const patchedMessages = ensureToolCallInputs(dedupeToolHistory(providerModelMessages));
350
403
  const sanitized = sanitizeProviderModelMessages(patchedMessages);
@@ -111,7 +111,7 @@ export const getMessageMetadataSchema = defineSchema((v) => v.object({
111
111
  */
112
112
  export const messageMetadataSchema = lazySchema(getMessageMetadataSchema);
113
113
  /** Zod schema for get chat UI message role. */
114
- export const getChatUiMessageRoleSchema = defineSchema((v) => v.enum(["system", "user", "assistant"]));
114
+ export const getChatUiMessageRoleSchema = defineSchema((v) => v.enum(["system", "user", "assistant", "tool"]));
115
115
  /** Schema for chat ui message role.
116
116
  * @deprecated Use getChatUiMessageRoleSchema()
117
117
  */
@@ -1 +1 @@
1
- {"version":3,"file":"upload-handler.d.ts","sourceRoot":"","sources":["../../../src/src/embedding/upload-handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAoF3C,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA2CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,QAAQ,EACf,MAAM,CAAC,EAAE,mBAAmB;oBAIC,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;eA8ElC,OAAO,CAAC,QAAQ,CAAC;uBAW3B,OAAO,WACR;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,KAC1C,OAAO,CAAC,QAAQ,CAAC;EA0BrB"}
1
+ {"version":3,"file":"upload-handler.d.ts","sourceRoot":"","sources":["../../../src/src/embedding/upload-handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqF3C,UAAU,mBAAmB;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA2CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,QAAQ,EACf,MAAM,CAAC,EAAE,mBAAmB;oBAIC,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;eA8ElC,OAAO,CAAC,QAAQ,CAAC;uBAW3B,OAAO,WACR;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,KAC1C,OAAO,CAAC,QAAQ,CAAC;EA0BrB"}
@@ -2,9 +2,9 @@ import { isVeryfrontCloudEnabled } from "../platform/cloud/resolver.js";
2
2
  import { VeryfrontCloudBlobStorage } from "../workflow/blob/veryfront-cloud-storage.js";
3
3
  import { serverLogger } from "../utils/index.js";
4
4
  import { loadUpload } from "./upload-loader.js";
5
- // `File` is a global only on Node 20+; import from `node:buffer` for Node 18
6
- // compatibility (engines.node >= 18.0.0).
7
- import { File } from "node:buffer";
5
+ import * as nodeBuffer from "node:buffer";
6
+ const FileCtor = globalThis.File ??
7
+ nodeBuffer.File;
8
8
  const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
9
9
  const MAX_FILE_NAME_LENGTH = 200;
10
10
  const CLOUD_UPLOAD_PREFIX = ".veryfront/rag/uploads/";
@@ -145,7 +145,7 @@ export function createUploadHandler(store, config) {
145
145
  try {
146
146
  const formData = await request.formData();
147
147
  const file = formData.get("file");
148
- if (!file || !(file instanceof File)) {
148
+ if (!file || !(file instanceof FileCtor)) {
149
149
  return Response.json({ error: "No file provided" }, { status: 400 });
150
150
  }
151
151
  if (file.size > maxSize) {
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../../src/src/security/input-validation/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAI/D,OAAO,EAAkB,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK1F,8CAA8C;AAC9C,wBAAsB,aAAa,CAAC,CAAC,EACnC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,CAAC,CAAC,CA6BZ;AAED,6DAA6D;AAC7D,wBAAsB,aAAa,CAAC,CAAC,EACnC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,CAAC,CAAC,CA0BZ;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CA2B1E"}
1
+ {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../../src/src/security/input-validation/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAI/D,OAAO,EAAkB,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAM1F,8CAA8C;AAC9C,wBAAsB,aAAa,CAAC,CAAC,EACnC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,CAAC,CAAC,CA6BZ;AAED,6DAA6D;AAC7D,wBAAsB,aAAa,CAAC,CAAC,EACnC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,CAAC,CAAC,CA0BZ;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CA2B1E"}
@@ -2,9 +2,9 @@ import { createValidationError, VeryfrontError } from "./errors.js";
2
2
  import { readBodyWithLimit, validateContentType, validateRequestLimits } from "./limits.js";
3
3
  import { sanitizeData } from "./sanitizers.js";
4
4
  import { DEFAULT_LIMITS } from "./types.js";
5
- // `File` is a global only on Node 20+; import from `node:buffer` for Node 18
6
- // compatibility (engines.node >= 18.0.0).
7
- import { File } from "node:buffer";
5
+ import * as nodeBuffer from "node:buffer";
6
+ const FileCtor = globalThis.File ??
7
+ nodeBuffer.File;
8
8
  /** Parse and validate a JSON request body. */
9
9
  export async function parseJsonBody(request, schema, options) {
10
10
  validateRequestLimits(request, options?.limits);
@@ -42,7 +42,7 @@ export async function parseFormData(request, schema, options) {
42
42
  const data = {};
43
43
  const maxFileSize = options?.limits?.maxFileSize ?? DEFAULT_LIMITS.maxFileSize;
44
44
  for (const [key, value] of formData.entries()) {
45
- if (value instanceof File && value.size > maxFileSize) {
45
+ if (value instanceof FileCtor && value.size > maxFileSize) {
46
46
  throw createValidationError(`File ${key} too large`, {
47
47
  maxSize: maxFileSize,
48
48
  actualSize: value.size,
@@ -1,3 +1,3 @@
1
1
  /** Shared version value. */
2
- export declare const VERSION = "0.1.566";
2
+ export declare const VERSION = "0.1.567";
3
3
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
3
  /** Shared version value. */
4
- export const VERSION = "0.1.566";
4
+ export const VERSION = "0.1.567";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.566",
3
+ "version": "0.1.567",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",