veryfront 0.1.667 → 0.1.669

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.667",
3
+ "version": "0.1.669",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "workspace": [
@@ -0,0 +1,21 @@
1
+ import { resolveModel } from "../../provider/index.js";
2
+ import { generateText } from "../../runtime/runtime-bridge.js";
3
+ import type { ContextSummaryGenerator } from "./context-budget-manager.js";
4
+ type GenerateTextFunction = typeof generateText;
5
+ type ResolveModelFunction = typeof resolveModel;
6
+ /** Options accepted by Veryfront Cloud context summary generator. */
7
+ export type VeryfrontCloudContextSummaryGeneratorOptions = {
8
+ apiUrl: string | URL;
9
+ authToken: string;
10
+ projectId?: string | null;
11
+ model?: string;
12
+ maxOutputTokens: number;
13
+ maxInputTokens: number;
14
+ abortSignal?: AbortSignal;
15
+ generateText?: GenerateTextFunction;
16
+ resolveModel?: ResolveModelFunction;
17
+ };
18
+ /** Create a Veryfront Cloud backed summary generator for context compaction. */
19
+ export declare function createVeryfrontCloudContextSummaryGenerator(options: VeryfrontCloudContextSummaryGeneratorOptions): ContextSummaryGenerator;
20
+ export {};
21
+ //# sourceMappingURL=context-summary-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-summary-generator.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/context-summary-generator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EAIb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAK3E,KAAK,oBAAoB,GAAG,OAAO,YAAY,CAAC;AAChD,KAAK,oBAAoB,GAAG,OAAO,YAAY,CAAC;AAEhD,qEAAqE;AACrE,MAAM,MAAM,4CAA4C,GAAG;IACzD,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC,CAAC;AAiKF,gFAAgF;AAChF,wBAAgB,2CAA2C,CACzD,OAAO,EAAE,4CAA4C,GACpD,uBAAuB,CAmBzB"}
@@ -0,0 +1,144 @@
1
+ import { estimateTokens } from "../../chat/message-prep.js";
2
+ import { resolveModel, resolveVeryfrontCloudGatewayModelId, resolveVeryfrontCloudModelId, runWithVeryfrontCloudContextAsync, } from "../../provider/index.js";
3
+ import { generateText } from "../../runtime/runtime-bridge.js";
4
+ const DEFAULT_MAX_SERIALIZED_PART_CHARACTERS = 20_000;
5
+ const DEFAULT_MAX_SERIALIZED_MESSAGE_CHARACTERS = 60_000;
6
+ function truncateText(text, maxCharacters) {
7
+ if (text.length <= maxCharacters) {
8
+ return text;
9
+ }
10
+ return `${text.slice(0, maxCharacters)}\n[truncated ${text.length - maxCharacters} characters]`;
11
+ }
12
+ function stringifyUnknown(value) {
13
+ try {
14
+ return JSON.stringify(value);
15
+ }
16
+ catch {
17
+ return "[unserializable]";
18
+ }
19
+ }
20
+ function serializeMessagePart(part) {
21
+ if (part.type === "text" && "text" in part) {
22
+ return truncateText(part.text, DEFAULT_MAX_SERIALIZED_PART_CHARACTERS);
23
+ }
24
+ if (part.type === "tool-result" && "result" in part) {
25
+ return [
26
+ `tool result: ${part.toolName}`,
27
+ `tool call id: ${part.toolCallId}`,
28
+ truncateText(stringifyUnknown(part.result), DEFAULT_MAX_SERIALIZED_PART_CHARACTERS),
29
+ ].join("\n");
30
+ }
31
+ if ((part.type === "image" || part.type === "file") && "mediaType" in part) {
32
+ return `${part.type}: ${part.mediaType}`;
33
+ }
34
+ if ("toolCallId" in part && "toolName" in part && "args" in part) {
35
+ return [
36
+ `tool call: ${part.toolName}`,
37
+ `tool call id: ${part.toolCallId}`,
38
+ truncateText(stringifyUnknown(part.args), DEFAULT_MAX_SERIALIZED_PART_CHARACTERS),
39
+ ].join("\n");
40
+ }
41
+ return truncateText(stringifyUnknown(part), DEFAULT_MAX_SERIALIZED_PART_CHARACTERS);
42
+ }
43
+ function serializeMessage(message) {
44
+ const body = message.parts.map(serializeMessagePart).join("\n\n");
45
+ const serialized = [
46
+ `<message id="${message.id}" role="${message.role}">`,
47
+ body,
48
+ "</message>",
49
+ ].join("\n");
50
+ return truncateText(serialized, DEFAULT_MAX_SERIALIZED_MESSAGE_CHARACTERS);
51
+ }
52
+ function chunkSerializedMessages(messages, maxInputTokens) {
53
+ const chunks = [];
54
+ let current = "";
55
+ for (const message of messages) {
56
+ const serialized = serializeMessage(message);
57
+ const candidate = current ? `${current}\n\n${serialized}` : serialized;
58
+ if (current && estimateTokens(candidate) > maxInputTokens) {
59
+ chunks.push(current);
60
+ current = serialized;
61
+ continue;
62
+ }
63
+ current = candidate;
64
+ }
65
+ if (current) {
66
+ chunks.push(current);
67
+ }
68
+ return chunks;
69
+ }
70
+ function createCompactionMessages(input) {
71
+ const customInstructions = input.customInstructions
72
+ ? `\nAdditional compaction instructions:\n${input.customInstructions}`
73
+ : "";
74
+ const priorSummary = input.priorSummary
75
+ ? `\nExisting summary to update:\n${input.priorSummary}\n`
76
+ : "";
77
+ return [
78
+ {
79
+ role: "system",
80
+ content: [
81
+ "Summarize previous context for a continued Veryfront agent run.",
82
+ "Output only the summary.",
83
+ "Preserve user goals, constraints, completed work, in-progress work, decisions, file or project state, tool evidence, and next actions.",
84
+ "Do not continue the conversation.",
85
+ "Do not include private credentials or raw internal metadata.",
86
+ ].join("\n"),
87
+ },
88
+ {
89
+ role: "user",
90
+ content: [
91
+ priorSummary,
92
+ `Recent messages retained separately: ${input.retainedMessageCount}`,
93
+ customInstructions,
94
+ "\nConversation segment to summarize:",
95
+ input.segment,
96
+ ].join("\n"),
97
+ },
98
+ ];
99
+ }
100
+ async function summarizeSegment(input) {
101
+ const generate = input.options.generateText ?? generateText;
102
+ const resolve = input.options.resolveModel ?? resolveModel;
103
+ const result = await runWithVeryfrontCloudContextAsync({
104
+ apiBaseUrl: input.options.apiUrl.toString(),
105
+ apiToken: input.options.authToken,
106
+ projectSlug: input.options.projectId ?? undefined,
107
+ serviceLayer: "cloud",
108
+ }, () => Promise.resolve(generate({
109
+ model: resolve(input.modelId),
110
+ messages: createCompactionMessages({
111
+ segment: input.segment,
112
+ priorSummary: input.priorSummary,
113
+ retainedMessageCount: input.retainedMessageCount,
114
+ customInstructions: input.customInstructions,
115
+ }),
116
+ maxOutputTokens: input.options.maxOutputTokens,
117
+ temperature: 0,
118
+ abortSignal: input.options.abortSignal,
119
+ })));
120
+ return result.text.trim();
121
+ }
122
+ function resolveSummaryModelId(model) {
123
+ const cloudModelId = resolveVeryfrontCloudModelId(model);
124
+ return resolveVeryfrontCloudGatewayModelId(cloudModelId) ?? cloudModelId;
125
+ }
126
+ /** Create a Veryfront Cloud backed summary generator for context compaction. */
127
+ export function createVeryfrontCloudContextSummaryGenerator(options) {
128
+ return async ({ messagesToSummarize, retainedMessages, customInstructions }) => {
129
+ const modelId = resolveSummaryModelId(options.model);
130
+ const chunks = chunkSerializedMessages(messagesToSummarize, options.maxInputTokens);
131
+ let summary = "";
132
+ for (const chunk of chunks) {
133
+ summary = await summarizeSegment({
134
+ options,
135
+ modelId,
136
+ segment: chunk,
137
+ priorSummary: summary || undefined,
138
+ retainedMessageCount: retainedMessages.length,
139
+ customInstructions,
140
+ });
141
+ }
142
+ return { text: summary };
143
+ };
144
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"veryfront-cloud-agent-service.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/veryfront-cloud-agent-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AAuC9E,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,yBAAyB,CAAC;AAOjC,OAAO,EAAE,KAAK,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AAC9F,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAkBzE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAKjE,OAAO,EAML,KAAK,8BAA8B,EAEpC,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAEL,KAAK,kDAAkD,EACxD,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAK9B,KAAK,2BAA2B,EACjC,MAAM,uBAAuB,CAAC;AAS/B,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAYhF,iFAAiF;AACjF,MAAM,MAAM,2CAA2C,GACnD,WAAW,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC,GACxD,WAAW,CAAC,kDAAkD,CAAC,eAAe,CAAC,CAAC,GAChF;IACA,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI,CAAC;CACvC,CAAC;AAEJ,MAAM,MAAM,yCAAyC,GAAG,8BAA8B,CAAC;AAEvF,6EAA6E;AAC7E,MAAM,MAAM,uCAAuC,GAAG,2BAA2B,CAAC;AAElF,uCAAuC;AACvC,wBAAgB,qBAAqB,IACjC,2BAA2B,GAC3B,6BAA6B,CAEhC;AAED,0CAA0C;AAC1C,wBAAgB,wBAAwB,IACpC,2BAA2B,GAC3B,6BAA6B,CAEhC;AAED,KAAK,sBAAsB,GAAG,MAAM,GAAG,GAAG,CAAC;AAE3C,8DAA8D;AAC9D,MAAM,MAAM,qCAAqC,GAAG;IAClD;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,WAAW,CAAC,EAAE,yCAAyC,CAAC;IACxD;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,uCAAuC,EAAE,CAAC;IAChE,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,cAAc,CAAC,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;IACnE,GAAG,CAAC,EAAE,kDAAkD,CAAC,KAAK,CAAC,CAAC;IAChE,aAAa,CAAC,EAAE,2CAA2C,CAAC;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,EAAE,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC;CACrC,CAAC;AAEF,yDAAyD;AACzD,MAAM,MAAM,iCAAiC,GAAG,qCAAqC,CAAC;AACtF,yCAAyC;AACzC,MAAM,MAAM,mBAAmB,GAAG,qCAAqC,CAAC;AASxE,qFAAqF;AACrF,MAAM,MAAM,+CAA+C,GAAG,2BAA2B,GAAG;IAC1F,MAAM,EAAE,yBAAyB,CAAC;IAClC,KAAK,EAAE,+BAA+B,CAAC,OAAO,CAAC,CAAC;IAChD,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,QAAQ,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAC;IAClD,cAAc,EAAE,gCAAgC,CAAC;CAClD,CAAC;AACF,gEAAgE;AAChE,MAAM,MAAM,6BAA6B,GAAG,+CAA+C,CAAC;AAC5F,4DAA4D;AAC5D,MAAM,MAAM,yBAAyB,GAAG,2CAA2C,CAAC;AAkyBpF,yDAAyD;AACzD,wBAAsB,2CAA2C,CAC/D,OAAO,GAAE,qCAA0C,GAClD,OAAO,CAAC,yBAAyB,CAAC,+CAA+C,CAAC,CAAC,CAKrF;AAED,iDAAiD;AACjD,wBAAsB,mCAAmC,CACvD,OAAO,GAAE,qCAA0C,GAClD,OAAO,CAAC,2BAA2B,CAAC,+CAA+C,CAAC,CAAC,CAgBvF;AAED,4BAA4B;AAC5B,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,qCAA0C,GAClD,OAAO,CAAC,IAAI,CAAC,CAiDf"}
1
+ {"version":3,"file":"veryfront-cloud-agent-service.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/veryfront-cloud-agent-service.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ import { createHostedFormInputTool } from "./form-input-tool.js";
22
22
  import { createHostedAgentProjectSteering, } from "./agent-project-steering.js";
23
23
  import { createLiveStudioMcpTools } from "../project/live-studio-mcp-tools.js";
24
24
  import { createDefaultHostedChatRuntime, } from "./default-chat-runtime.js";
25
+ import { createVeryfrontCloudContextSummaryGenerator } from "./context-summary-generator.js";
25
26
  import { createDefaultHostedInvokeAgentTool } from "./default-invoke-agent-tool.js";
26
27
  import { createDefaultHostedProjectSteeringRefresh, fetchDefaultHostedProjectSteering, } from "./default-project-steering-refresh.js";
27
28
  import { createRuntimeAgentDefinitionFromAgent, describeProjectAgentRuntimeAgentIdCandidates, discoverProjectAgentRuntime, doesProjectAgentRuntimeAgentMatchSource, getProjectAgentRuntimeAgentIdCandidates, resolveSingleProjectAgentRuntimeAgentId, } from "../project/agent-runtime.js";
@@ -478,16 +479,43 @@ function fetchProjectSteering(context, input) {
478
479
  traceOperationName: "chat.fetchSteering",
479
480
  });
480
481
  }
482
+ function createHostedChatContextBudgetOptions(context, req, agentConfig, abortSignal) {
483
+ const config = context.infrastructure.getConfig();
484
+ if (!config.VERYFRONT_CONTEXT_COMPACTION_ENABLED || !req.durableRootRun) {
485
+ return undefined;
486
+ }
487
+ return {
488
+ tokenBudget: config.VERYFRONT_CONTEXT_COMPACTION_TOKEN_BUDGET,
489
+ reserveTokens: config.VERYFRONT_CONTEXT_COMPACTION_RESERVE_TOKENS,
490
+ recentTailTokens: config.VERYFRONT_CONTEXT_COMPACTION_RECENT_TAIL_TOKENS,
491
+ minimumRecentTurns: config.VERYFRONT_CONTEXT_COMPACTION_MINIMUM_RECENT_TURNS,
492
+ maxSummaryTokens: config.VERYFRONT_CONTEXT_COMPACTION_MAX_SUMMARY_TOKENS,
493
+ summaryGenerator: createVeryfrontCloudContextSummaryGenerator({
494
+ apiUrl: config.VERYFRONT_API_URL,
495
+ authToken: req.authToken,
496
+ projectId: req.projectId,
497
+ model: config.VERYFRONT_CONTEXT_COMPACTION_SUMMARY_MODEL ?? agentConfig.model,
498
+ maxOutputTokens: config.VERYFRONT_CONTEXT_COMPACTION_MAX_SUMMARY_TOKENS,
499
+ maxInputTokens: config.VERYFRONT_CONTEXT_COMPACTION_SUMMARY_INPUT_TOKENS,
500
+ abortSignal,
501
+ }),
502
+ logger: {
503
+ debug: (message, metadata) => context.infrastructure.logger.debug(message, metadata),
504
+ error: (message, metadata) => context.infrastructure.logger.error(message, metadata),
505
+ },
506
+ };
507
+ }
481
508
  async function prepareChatExecution(context, req) {
482
509
  const { userId, authToken, projectId, conversationId, upstreamParentConversationId, upstreamParentRunId, spawnedFromToolCallId, } = req;
483
510
  const config = context.infrastructure.getConfig();
484
511
  setPrepareChatExecutionStartAttributes(context, { projectId, userId });
485
512
  const agentConfig = await resolveAgentConfig(context, req.agentId ?? getDefaultAgentId(context));
513
+ const abortController = new AbortController();
486
514
  const { effectiveMessages, rootRunContext, runtime: { agent, runtimeKind, modelId, cleanup }, finalMessages, } = await prepareVeryfrontCloudHostedChatExecution({
487
515
  request: req,
488
516
  agentConfig,
489
517
  apiUrl: config.VERYFRONT_API_URL,
490
- abortSignal: new AbortController().signal,
518
+ abortSignal: abortController.signal,
491
519
  logger: context.infrastructure.logger,
492
520
  rootRun: {
493
521
  instrumentation: {
@@ -500,6 +528,7 @@ async function prepareChatExecution(context, req) {
500
528
  },
501
529
  fetchSteering: (steeringInput) => fetchProjectSteering(context, steeringInput),
502
530
  buildInstructions: buildVeryfrontCloudRuntimeInstructions,
531
+ contextBudget: createHostedChatContextBudgetOptions(context, req, agentConfig, abortController.signal),
503
532
  createRuntime: (creationOptions) => context.trace("chat.createRuntime", () => createAgentRuntime(context, {
504
533
  ...creationOptions,
505
534
  userId: req.userId,
@@ -1,4 +1,4 @@
1
- import { isRecord } from "../../chat/conversation.js";
1
+ import { getProviderModelMessageSourceId, isRecord } from "../../chat/conversation.js";
2
2
  import { buildDataFileAnnotation, } from "../../chat/types.js";
3
3
  import { toChildRunToolInputRecord } from "../child-run/execution-support.js";
4
4
  /** Error shape for agent runtime message conversion. */
@@ -19,7 +19,7 @@ function getOptionalStringField(part, key) {
19
19
  return typeof value === "string" && value.length > 0 ? value : undefined;
20
20
  }
21
21
  function createAgentRuntimeMessageId(message, index) {
22
- return `agent-runtime-${message.role}-${index + 1}`;
22
+ return getProviderModelMessageSourceId(message) ?? `agent-runtime-${message.role}-${index + 1}`;
23
23
  }
24
24
  function createTextAgentRuntimePart(text) {
25
25
  return hasTextContent(text) ? { type: "text", text } : null;
@@ -16,6 +16,14 @@ export type AgentServiceConfig = {
16
16
  VERYFRONT_STUDIO_MCP_URL: string;
17
17
  VERYFRONT_ENABLE_DURABLE_INVOKE_AGENT: boolean;
18
18
  VERYFRONT_ENABLE_DURABLE_TASK: boolean;
19
+ VERYFRONT_CONTEXT_COMPACTION_ENABLED: boolean;
20
+ VERYFRONT_CONTEXT_COMPACTION_TOKEN_BUDGET: number;
21
+ VERYFRONT_CONTEXT_COMPACTION_RESERVE_TOKENS: number;
22
+ VERYFRONT_CONTEXT_COMPACTION_RECENT_TAIL_TOKENS: number;
23
+ VERYFRONT_CONTEXT_COMPACTION_MINIMUM_RECENT_TURNS: number;
24
+ VERYFRONT_CONTEXT_COMPACTION_MAX_SUMMARY_TOKENS: number;
25
+ VERYFRONT_CONTEXT_COMPACTION_SUMMARY_INPUT_TOKENS: number;
26
+ VERYFRONT_CONTEXT_COMPACTION_SUMMARY_MODEL?: string;
19
27
  NODE_ENV: "development" | "test" | "production";
20
28
  PORT: number;
21
29
  OAUTH_PUBLIC_KEY?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/service/config.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,4BAA4B,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAE3E,2CAA2C;AAC3C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,oCAAoC,EAAE,4BAA4B,CAAC;IACnE,6CAA6C,EAAE,MAAM,CAAC;IACtD,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB,EAAE,MAAM,CAAC;IACjC,qCAAqC,EAAE,OAAO,CAAC;IAC/C,6BAA6B,EAAE,OAAO,CAAC;IACvC,QAAQ,EAAE,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;AA4DlF,2CAA2C;AAC3C,eAAO,MAAM,wBAAwB,sEAA0C,CAAC;AAEhF,kDAAkD;AAClD,eAAO,MAAM,8BAA8B,sEAA2B,CAAC;AACvE,kDAAkD;AAClD,MAAM,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AAC1D,qDAAqD;AACrD,MAAM,MAAM,6BAA6B,GAAG,uBAAuB,CAAC;AAEpE,iDAAiD;AACjD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,uBAAuB,GAC7B,kBAAkB,CAGpB;AAED,wDAAwD;AACxD,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,6BAA6B,GACnC,wBAAwB,CAE1B"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/service/config.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,4BAA4B,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAE3E,2CAA2C;AAC3C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,oCAAoC,EAAE,4BAA4B,CAAC;IACnE,6CAA6C,EAAE,MAAM,CAAC;IACtD,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB,EAAE,MAAM,CAAC;IACjC,qCAAqC,EAAE,OAAO,CAAC;IAC/C,6BAA6B,EAAE,OAAO,CAAC;IACvC,oCAAoC,EAAE,OAAO,CAAC;IAC9C,yCAAyC,EAAE,MAAM,CAAC;IAClD,2CAA2C,EAAE,MAAM,CAAC;IACpD,+CAA+C,EAAE,MAAM,CAAC;IACxD,iDAAiD,EAAE,MAAM,CAAC;IAC1D,+CAA+C,EAAE,MAAM,CAAC;IACxD,iDAAiD,EAAE,MAAM,CAAC;IAC1D,0CAA0C,CAAC,EAAE,MAAM,CAAC;IACpD,QAAQ,EAAE,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;AA0FlF,2CAA2C;AAC3C,eAAO,MAAM,wBAAwB,sEAA0C,CAAC;AAEhF,kDAAkD;AAClD,eAAO,MAAM,8BAA8B,sEAA2B,CAAC;AACvE,kDAAkD;AAClD,MAAM,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AAC1D,qDAAqD;AACrD,MAAM,MAAM,6BAA6B,GAAG,uBAAuB,CAAC;AAEpE,iDAAiD;AACjD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,uBAAuB,GAC7B,kBAAkB,CAGpB;AAED,wDAAwD;AACxD,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,6BAA6B,GACnC,wBAAwB,CAE1B"}
@@ -37,6 +37,14 @@ const getAgentServiceConfigSchema = defineSchema((v) => {
37
37
  VERYFRONT_STUDIO_MCP_URL: v.string().default(""),
38
38
  VERYFRONT_ENABLE_DURABLE_INVOKE_AGENT: booleanFlagSchema,
39
39
  VERYFRONT_ENABLE_DURABLE_TASK: booleanFlagSchema,
40
+ VERYFRONT_CONTEXT_COMPACTION_ENABLED: v.string().default("true").transform(parseBooleanFlag),
41
+ VERYFRONT_CONTEXT_COMPACTION_TOKEN_BUDGET: v.coerce.number().int().positive().default(180_000),
42
+ VERYFRONT_CONTEXT_COMPACTION_RESERVE_TOKENS: v.coerce.number().int().nonnegative().default(32_000),
43
+ VERYFRONT_CONTEXT_COMPACTION_RECENT_TAIL_TOKENS: v.coerce.number().int().positive().default(40_000),
44
+ VERYFRONT_CONTEXT_COMPACTION_MINIMUM_RECENT_TURNS: v.coerce.number().int().positive().default(2),
45
+ VERYFRONT_CONTEXT_COMPACTION_MAX_SUMMARY_TOKENS: v.coerce.number().int().positive().default(8_000),
46
+ VERYFRONT_CONTEXT_COMPACTION_SUMMARY_INPUT_TOKENS: v.coerce.number().int().positive().default(64_000),
47
+ VERYFRONT_CONTEXT_COMPACTION_SUMMARY_MODEL: v.string().min(1).optional(),
40
48
  ALLOWED_ORIGINS: v.string().default("http://localhost:3000,http://veryfront.me:3000"),
41
49
  OTEL_ENABLED: booleanFlagSchema,
42
50
  OTEL_EXPORTER_OTLP_ENDPOINT: v.string().optional(),
@@ -56,6 +64,14 @@ const getAgentServiceConfigSchema = defineSchema((v) => {
56
64
  VERYFRONT_STUDIO_MCP_URL: env.VERYFRONT_STUDIO_MCP_URL,
57
65
  VERYFRONT_ENABLE_DURABLE_INVOKE_AGENT: env.VERYFRONT_ENABLE_DURABLE_INVOKE_AGENT,
58
66
  VERYFRONT_ENABLE_DURABLE_TASK: env.VERYFRONT_ENABLE_DURABLE_TASK,
67
+ VERYFRONT_CONTEXT_COMPACTION_ENABLED: env.VERYFRONT_CONTEXT_COMPACTION_ENABLED,
68
+ VERYFRONT_CONTEXT_COMPACTION_TOKEN_BUDGET: env.VERYFRONT_CONTEXT_COMPACTION_TOKEN_BUDGET,
69
+ VERYFRONT_CONTEXT_COMPACTION_RESERVE_TOKENS: env.VERYFRONT_CONTEXT_COMPACTION_RESERVE_TOKENS,
70
+ VERYFRONT_CONTEXT_COMPACTION_RECENT_TAIL_TOKENS: env.VERYFRONT_CONTEXT_COMPACTION_RECENT_TAIL_TOKENS,
71
+ VERYFRONT_CONTEXT_COMPACTION_MINIMUM_RECENT_TURNS: env.VERYFRONT_CONTEXT_COMPACTION_MINIMUM_RECENT_TURNS,
72
+ VERYFRONT_CONTEXT_COMPACTION_MAX_SUMMARY_TOKENS: env.VERYFRONT_CONTEXT_COMPACTION_MAX_SUMMARY_TOKENS,
73
+ VERYFRONT_CONTEXT_COMPACTION_SUMMARY_INPUT_TOKENS: env.VERYFRONT_CONTEXT_COMPACTION_SUMMARY_INPUT_TOKENS,
74
+ VERYFRONT_CONTEXT_COMPACTION_SUMMARY_MODEL: env.VERYFRONT_CONTEXT_COMPACTION_SUMMARY_MODEL,
59
75
  NODE_ENV: env.NODE_ENV,
60
76
  PORT: env.PORT,
61
77
  OAUTH_PUBLIC_KEY: env.OAUTH_PUBLIC_KEY,
@@ -1,5 +1,16 @@
1
1
  import type { InferSchema } from "../extensions/schema/index.js";
2
2
  import type { ChatUiMessage, ChatUiMessagePart, ProviderModelMessage } from "./types.js";
3
+ declare const PROVIDER_MODEL_MESSAGE_SOURCE_ID: unique symbol;
4
+ /** Provider model message plus local-only source metadata. */
5
+ export type ProviderModelMessageWithSourceId = ProviderModelMessage & {
6
+ [PROVIDER_MODEL_MESSAGE_SOURCE_ID]?: string;
7
+ };
8
+ /** Read the local-only source UI message id attached during provider conversion. */
9
+ export declare function getProviderModelMessageSourceId(message: ProviderModelMessage): string | undefined;
10
+ /** Attach local-only source UI message id metadata to a provider message. */
11
+ export declare function withProviderModelMessageSourceId(message: ProviderModelMessage, sourceId: string): ProviderModelMessage;
12
+ /** Copy local-only source UI message id metadata when a provider message is cloned. */
13
+ export declare function copyProviderModelMessageSourceId<T extends ProviderModelMessage>(source: ProviderModelMessage, target: T): T;
3
14
  /** Zod schema for get message part. */
4
15
  export declare const getMessagePartSchema: () => import("../internal-agents/schema.js").Schema<import("../extensions/schema/schema-validator.js").InferShape<{
5
16
  type: import("../internal-agents/schema.js").Schema<"text">;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/src/chat/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAEV,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,uCAAuC;AACvC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDhC,CAAC;AAEF,4CAA4C;AAC5C,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAC;AAE/E,4CAA4C;AAC5C,eAAO,MAAM,yBAAyB,6DAErC,CAAC;AACF,iDAAiD;AACjD,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC;AAEzF,yCAAyC;AACzC,eAAO,MAAM,sBAAsB,6DAElC,CAAC;AACF,8CAA8C;AAC9C,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC,CAAC;AAEnF,2CAA2C;AAC3C,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;GAiBpC,CAAC;AAEF,gDAAgD;AAChD,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC;AAEvF,sCAAsC;AACtC,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoB/B,CAAC;AAEF,6BAA6B;AAC7B,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC;AAE7E,8CAA8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kDAAkD;AAClD,KAAK,UAAU,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAGpF,iCAAiC;AACjC,eAAO,MAAM,YAAY,QACuD,CAAC;AAEjF,uCAAuC;AACvC,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,IAAI,MAAM,CAExE;AAED,yBAAyB;AACzB,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG1D;AAED,0BAA0B;AAC1B,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAiB9F;AAED,2BAA2B;AAC3B,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,2BAA2B;AAC3B,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtF;AAoBD,gCAAgC;AAChC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQvD;AAED,uDAAuD;AACvD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,iBAAiB,GACtB,IAAI,IAAI,iBAAiB,GAAG;IAAE,IAAI,EAAE,QAAQ,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAEvE;AAED,mDAAmD;AACnD,wBAAgB,YAAY,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,IAAI,UAAU,CAMxE;AAED,2BAA2B;AAC3B,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAOlE;AAED,uBAAuB;AACvB,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,EAAE,EACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GACA,IAAI,CAiCN;AA2BD,uDAAuD;AACvD,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,aAAa,GAAG,WAAW,EAAE,CAiEtF;AAOD,sDAAsD;AACtD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAEtE;AAED,6CAA6C;AAC7C,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa,CAEtF;AAED,6CAA6C;AAC7C,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAChB,aAAa,CAaf;AA8BD,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAOpE;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAOxE;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEhE;AAED,iDAAiD;AACjD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE1E;AAED,2CAA2C;AAC3C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAoB5E;AA8cD,sDAAsD;AACtD,wBAAgB,wCAAwC,CACtD,QAAQ,EAAE,aAAa,EAAE,GACxB,oBAAoB,EAAE,CAkCxB"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/src/chat/conversation.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,24 @@
1
1
  import { defineSchema } from "../schemas/index.js";
2
+ const PROVIDER_MODEL_MESSAGE_SOURCE_ID = Symbol.for("veryfront.providerModelMessageSourceId");
3
+ /** Read the local-only source UI message id attached during provider conversion. */
4
+ export function getProviderModelMessageSourceId(message) {
5
+ return message[PROVIDER_MODEL_MESSAGE_SOURCE_ID];
6
+ }
7
+ /** Attach local-only source UI message id metadata to a provider message. */
8
+ export function withProviderModelMessageSourceId(message, sourceId) {
9
+ Object.defineProperty(message, PROVIDER_MODEL_MESSAGE_SOURCE_ID, {
10
+ value: sourceId,
11
+ configurable: true,
12
+ enumerable: false,
13
+ writable: true,
14
+ });
15
+ return message;
16
+ }
17
+ /** Copy local-only source UI message id metadata when a provider message is cloned. */
18
+ export function copyProviderModelMessageSourceId(source, target) {
19
+ const sourceId = getProviderModelMessageSourceId(source);
20
+ return sourceId ? withProviderModelMessageSourceId(target, sourceId) : target;
21
+ }
2
22
  /** Zod schema for get message part. */
3
23
  export const getMessagePartSchema = defineSchema((v) => v.discriminatedUnion("type", [
4
24
  v.object({ type: v.literal("text"), text: v.string() }),
@@ -700,13 +720,14 @@ export function convertUiMessagesToProviderModelMessages(messages) {
700
720
  return [];
701
721
  }
702
722
  })();
703
- for (const providerMessage of converted) {
723
+ for (const rawProviderMessage of converted) {
724
+ const providerMessage = withProviderModelMessageSourceId(rawProviderMessage, message.id);
704
725
  const previous = providerMessages.at(-1);
705
726
  if (previous?.role === "tool" && providerMessage.role === "tool") {
706
- providerMessages[providerMessages.length - 1] = {
727
+ providerMessages[providerMessages.length - 1] = withProviderModelMessageSourceId({
707
728
  role: "tool",
708
729
  content: [...previous.content, ...providerMessage.content],
709
- };
730
+ }, getProviderModelMessageSourceId(previous) ?? message.id);
710
731
  continue;
711
732
  }
712
733
  providerMessages.push(providerMessage);
@@ -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;AAMpB,4EAA4E;AAC5E,MAAM,WAAW,iDAAiD;IAChE,sBAAsB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,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;AA4ED,wDAAwD;AACxD,wBAAgB,0CAA0C,CACxD,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,iDAAsD,GAC9D,oBAAoB,EAAE,CAqBxB;AA2OD,6BAA6B;AAC7B,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,EAAE,CA4E3F;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"}
1
+ {"version":3,"file":"message-prep.d.ts","sourceRoot":"","sources":["../../../src/src/chat/message-prep.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AASjC,OAAO,EAKL,KAAK,aAAa,EAGlB,KAAK,oBAAoB,EAE1B,MAAM,YAAY,CAAC;AAMpB,4EAA4E;AAC5E,MAAM,WAAW,iDAAiD;IAChE,sBAAsB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,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,CA8BxB;AA4ED,wDAAwD;AACxD,wBAAgB,0CAA0C,CACxD,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,iDAAsD,GAC9D,oBAAoB,EAAE,CAqBxB;AA2OD,6BAA6B;AAC7B,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,oBAAoB,EAAE,CA4E3F;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,CAgE1F;AAED,4BAA4B;AAC5B,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,oBAAoB,EAAE,EAChC,MAAM,GAAE,MAA6B,EACrC,QAAQ,GAAE,MAAU,GACnB,oBAAoB,EAAE,CAMxB"}
@@ -1,4 +1,4 @@
1
- import { convertUiMessagesToProviderModelMessages, getStringField, isReasoningPart, isToolCallPart, isToolResultPart, } from "./conversation.js";
1
+ import { convertUiMessagesToProviderModelMessages, copyProviderModelMessageSourceId, getStringField, isReasoningPart, isToolCallPart, isToolResultPart, } from "./conversation.js";
2
2
  import { buildDataFileAnnotation, normalizeInlineAttachmentMediaType, } from "./types.js";
3
3
  import { historicalToolSummaries } from "../integrations/_tool_summaries.js";
4
4
  const CHARS_PER_TOKEN = 4;
@@ -354,18 +354,21 @@ export function sanitizeProviderModelMessages(messages) {
354
354
  if (Array.isArray(message.content)) {
355
355
  if (message.role === "user") {
356
356
  const cleaned = cleanContent(message.content);
357
- if (cleaned.length > 0)
358
- result.push({ ...message, content: cleaned });
357
+ if (cleaned.length > 0) {
358
+ result.push(copyProviderModelMessageSourceId(message, { ...message, content: cleaned }));
359
+ }
359
360
  }
360
361
  else if (message.role === "assistant") {
361
362
  const cleaned = cleanContent(message.content);
362
- if (cleaned.length > 0)
363
- result.push({ ...message, content: cleaned });
363
+ if (cleaned.length > 0) {
364
+ result.push(copyProviderModelMessageSourceId(message, { ...message, content: cleaned }));
365
+ }
364
366
  }
365
367
  else if (message.role === "tool") {
366
368
  const cleaned = cleanContent(message.content);
367
- if (cleaned.length > 0)
368
- result.push({ ...message, content: cleaned });
369
+ if (cleaned.length > 0) {
370
+ result.push(copyProviderModelMessageSourceId(message, { ...message, content: cleaned }));
371
+ }
369
372
  }
370
373
  continue;
371
374
  }
@@ -667,7 +670,7 @@ export function maskOldToolOutputs(messages) {
667
670
  if (msg.role === "assistant" && Array.isArray(msg.content)) {
668
671
  const filtered = msg.content.filter((part) => !isReasoningPart(part));
669
672
  if (filtered.length !== msg.content.length) {
670
- return { ...msg, content: filtered };
673
+ return copyProviderModelMessageSourceId(msg, { ...msg, content: filtered });
671
674
  }
672
675
  return msg;
673
676
  }
@@ -715,7 +718,7 @@ export function maskOldToolOutputs(messages) {
715
718
  }
716
719
  return { ...part, output: wrapToolResultOutput(part.output, masked) };
717
720
  });
718
- return { ...msg, content: newContent };
721
+ return copyProviderModelMessageSourceId(msg, { ...msg, content: newContent });
719
722
  });
720
723
  }
721
724
  function createSyntheticToolResult(toolCallId, toolName) {
@@ -763,10 +766,10 @@ export function repairToolPairs(messages) {
763
766
  }
764
767
  }
765
768
  if (repairedContent.length !== message.content.length) {
766
- result[index] = {
769
+ result[index] = copyProviderModelMessageSourceId(message, {
767
770
  ...message,
768
771
  content: repairedContent,
769
- };
772
+ });
770
773
  }
771
774
  if (regularToolCalls.length === 0) {
772
775
  continue;
@@ -811,24 +814,24 @@ export function repairToolPairs(messages) {
811
814
  laterIndex--;
812
815
  continue;
813
816
  }
814
- result[laterIndex] = {
817
+ result[laterIndex] = copyProviderModelMessageSourceId(laterMessage, {
815
818
  ...laterMessage,
816
819
  content: keptLaterContent,
817
- };
820
+ });
818
821
  }
819
822
  const repairedResults = unresolvedCalls.map((toolCall) => movedResults.get(toolCall.id) ?? createSyntheticToolResult(toolCall.id, toolCall.toolName));
820
823
  if (nextMessage?.role === "tool" && Array.isArray(nextMessage.content)) {
821
- result[index + 1] = {
824
+ result[index + 1] = copyProviderModelMessageSourceId(nextMessage, {
822
825
  ...nextMessage,
823
826
  content: [...repairedResults, ...nextMessage.content],
824
- };
827
+ });
825
828
  }
826
829
  else {
827
830
  const toolMessage = {
828
831
  role: "tool",
829
832
  content: repairedResults,
830
833
  };
831
- result.splice(index + 1, 0, toolMessage);
834
+ result.splice(index + 1, 0, copyProviderModelMessageSourceId(message, toolMessage));
832
835
  }
833
836
  mutated = true;
834
837
  }
@@ -858,7 +861,7 @@ export function ensureToolCallInputs(messages) {
858
861
  });
859
862
  if (msgMutated) {
860
863
  mutated = true;
861
- return { ...msg, content: newContent };
864
+ return copyProviderModelMessageSourceId(msg, { ...msg, content: newContent });
862
865
  }
863
866
  return msg;
864
867
  });
@@ -909,8 +912,9 @@ export function dedupeToolHistory(messages) {
909
912
  deduped.push(message);
910
913
  continue;
911
914
  }
912
- if (filtered.length > 0)
913
- deduped.push({ ...message, content: filtered });
915
+ if (filtered.length > 0) {
916
+ deduped.push(copyProviderModelMessageSourceId(message, { ...message, content: filtered }));
917
+ }
914
918
  }
915
919
  else if (message.role === "assistant" && Array.isArray(message.content)) {
916
920
  const { filtered, changed } = filterParts(message.content);
@@ -918,8 +922,9 @@ export function dedupeToolHistory(messages) {
918
922
  deduped.push(message);
919
923
  continue;
920
924
  }
921
- if (filtered.length > 0)
922
- deduped.push({ ...message, content: filtered });
925
+ if (filtered.length > 0) {
926
+ deduped.push(copyProviderModelMessageSourceId(message, { ...message, content: filtered }));
927
+ }
923
928
  }
924
929
  else if (message.role === "tool") {
925
930
  const { filtered, changed } = filterParts(message.content);
@@ -927,8 +932,9 @@ export function dedupeToolHistory(messages) {
927
932
  deduped.push(message);
928
933
  continue;
929
934
  }
930
- if (filtered.length > 0)
931
- deduped.push({ ...message, content: filtered });
935
+ if (filtered.length > 0) {
936
+ deduped.push(copyProviderModelMessageSourceId(message, { ...message, content: filtered }));
937
+ }
932
938
  }
933
939
  else {
934
940
  deduped.push(message);
@@ -1,3 +1,3 @@
1
1
  /** Shared version value. */
2
- export declare const VERSION = "0.1.667";
2
+ export declare const VERSION = "0.1.669";
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.667";
4
+ export const VERSION = "0.1.669";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.667",
3
+ "version": "0.1.669",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",