veryfront 0.1.666 → 0.1.668

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.666",
3
+ "version": "0.1.668",
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":"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"}
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,
@@ -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 +1 @@
1
- {"version":3,"file":"_data.d.ts","sourceRoot":"","sources":["../../../src/src/integrations/_data.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,eAAO,MAAM,UAAU,EAAE,iBAAiB,EAoCzC,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoCxC,CAAC"}
1
+ {"version":3,"file":"_data.d.ts","sourceRoot":"","sources":["../../../src/src/integrations/_data.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,eAAO,MAAM,UAAU,EAAE,iBAAiB,EAg/UzC,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAuExC,CAAC"}