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 +1 -1
- package/esm/src/agent/hosted/context-summary-generator.d.ts +21 -0
- package/esm/src/agent/hosted/context-summary-generator.d.ts.map +1 -0
- package/esm/src/agent/hosted/context-summary-generator.js +144 -0
- package/esm/src/agent/hosted/veryfront-cloud-agent-service.d.ts.map +1 -1
- package/esm/src/agent/hosted/veryfront-cloud-agent-service.js +30 -1
- package/esm/src/agent/runtime/message-adapter.js +2 -2
- package/esm/src/agent/service/config.d.ts +8 -0
- package/esm/src/agent/service/config.d.ts.map +1 -1
- package/esm/src/agent/service/config.js +16 -0
- package/esm/src/chat/conversation.d.ts +11 -0
- package/esm/src/chat/conversation.d.ts.map +1 -1
- package/esm/src/chat/conversation.js +24 -3
- package/esm/src/chat/message-prep.d.ts.map +1 -1
- package/esm/src/chat/message-prep.js +29 -23
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
package/esm/deno.js
CHANGED
|
@@ -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;
|
|
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:
|
|
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;
|
|
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":"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
|
|
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
|
|
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;
|
|
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);
|