librechat-data-provider 0.8.509 → 0.8.522
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/dist/{data-service-BsdHkdKS.mjs → data-service-CaB7saTP.mjs} +2175 -113
- package/dist/data-service-CaB7saTP.mjs.map +1 -0
- package/dist/{data-service-XTxx76uB.js → data-service-D5kHzBt-.js} +2806 -150
- package/dist/data-service-D5kHzBt-.js.map +1 -0
- package/dist/index.js +1403 -92
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1248 -93
- package/dist/index.mjs.map +1 -1
- package/dist/react-query/index.js +2 -1
- package/dist/react-query/index.js.map +1 -1
- package/dist/react-query/index.mjs +2 -1
- package/dist/react-query/index.mjs.map +1 -1
- package/dist/types/accessPermissions.d.ts +4 -0
- package/dist/types/actions.d.ts +3 -3
- package/dist/types/agentToolOptions.d.ts +11 -0
- package/dist/types/api-endpoints.d.ts +28 -2
- package/dist/types/bedrock.d.ts +220 -0
- package/dist/types/cadence.d.ts +33 -0
- package/dist/types/codeEnvRef.d.ts +21 -0
- package/dist/types/config.d.ts +13457 -1573
- package/dist/types/data-service.d.ts +65 -14
- package/dist/types/feedback.d.ts +9 -1
- package/dist/types/file-config.d.ts +42 -5
- package/dist/types/filters.d.ts +1422 -0
- package/dist/types/generate.d.ts +85 -1
- package/dist/types/index.d.ts +10 -0
- package/dist/types/keys.d.ts +29 -4
- package/dist/types/langchain.d.ts +4 -0
- package/dist/types/limits.d.ts +13 -0
- package/dist/types/mcp.d.ts +338 -228
- package/dist/types/messages.d.ts +13 -0
- package/dist/types/models.d.ts +840 -68
- package/dist/types/parameterSettings.d.ts +7 -3
- package/dist/types/parsers.d.ts +13 -1
- package/dist/types/permissions.d.ts +42 -1
- package/dist/types/providers.d.ts +36 -0
- package/dist/types/react-query/react-query-service.d.ts +2 -7
- package/dist/types/request.d.ts +4 -2
- package/dist/types/roles.d.ts +34 -0
- package/dist/types/runSteps.d.ts +59 -0
- package/dist/types/schemas.d.ts +1358 -34
- package/dist/types/stateful-code.d.ts +7 -0
- package/dist/types/types/agents.d.ts +303 -8
- package/dist/types/types/assistants.d.ts +170 -7
- package/dist/types/types/files.d.ts +29 -8
- package/dist/types/types/index.d.ts +2 -0
- package/dist/types/types/insights.d.ts +62 -0
- package/dist/types/types/mcpServers.d.ts +25 -0
- package/dist/types/types/mutations.d.ts +2 -0
- package/dist/types/types/queries.d.ts +47 -5
- package/dist/types/types/queuedTurns.d.ts +870 -0
- package/dist/types/types/runs.d.ts +206 -26
- package/dist/types/types/schedules.d.ts +306 -0
- package/dist/types/types/skills.d.ts +34 -6
- package/dist/types/types/subagents.d.ts +159 -0
- package/dist/types/types/web.d.ts +12 -2
- package/dist/types/types.d.ts +175 -2
- package/dist/types/upload.d.ts +2 -0
- package/package.json +7 -5
- package/dist/data-service-BsdHkdKS.mjs.map +0 -1
- package/dist/data-service-XTxx76uB.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_data_service = require("./data-service-
|
|
2
|
+
const require_data_service = require("./data-service-D5kHzBt-.js");
|
|
3
3
|
let zod = require("zod");
|
|
4
4
|
let dayjs = require("dayjs");
|
|
5
5
|
dayjs = require_data_service.__toESM(dayjs);
|
|
@@ -7,6 +7,7 @@ let dayjs_plugin_utc_js = require("dayjs/plugin/utc.js");
|
|
|
7
7
|
dayjs_plugin_utc_js = require_data_service.__toESM(dayjs_plugin_utc_js);
|
|
8
8
|
let dayjs_plugin_timezone_js = require("dayjs/plugin/timezone.js");
|
|
9
9
|
dayjs_plugin_timezone_js = require_data_service.__toESM(dayjs_plugin_timezone_js);
|
|
10
|
+
let croner = require("croner");
|
|
10
11
|
let axios = require("axios");
|
|
11
12
|
axios = require_data_service.__toESM(axios);
|
|
12
13
|
let url = require("url");
|
|
@@ -14,10 +15,13 @@ let crypto = require("crypto");
|
|
|
14
15
|
crypto = require_data_service.__toESM(crypto);
|
|
15
16
|
let js_yaml = require("js-yaml");
|
|
16
17
|
//#region src/bedrock.ts
|
|
17
|
-
const DEFAULT_ENABLED_MAX_TOKENS = 8192;
|
|
18
18
|
const DEFAULT_THINKING_BUDGET = 2e3;
|
|
19
|
+
const BEDROCK_CLAUDE_SONNET_4_6_MAX_OUTPUT = 64e3;
|
|
19
20
|
const BEDROCK_OUTPUT_128K_BETA = "output-128k-2025-02-19";
|
|
20
21
|
const BEDROCK_FINE_GRAINED_TOOL_STREAMING_BETA = "fine-grained-tool-streaming-2025-05-14";
|
|
22
|
+
/** Betas LibreChat injects itself, safe to strip from persisted AMRF when a
|
|
23
|
+
* model no longer supports them; anything else in `anthropic_beta` is a user opt-in. */
|
|
24
|
+
const GENERATED_BEDROCK_BETAS = new Set([BEDROCK_OUTPUT_128K_BETA, BEDROCK_FINE_GRAINED_TOOL_STREAMING_BETA]);
|
|
21
25
|
const bedrockReasoningConfigValues = new Set(Object.values(require_data_service.BedrockReasoningConfig));
|
|
22
26
|
/**
|
|
23
27
|
* Resolves the final `thinking.display` value for an adaptive-thinking request.
|
|
@@ -62,14 +66,14 @@ function parseOpusVersion(model) {
|
|
|
62
66
|
return null;
|
|
63
67
|
}
|
|
64
68
|
/** Extracts sonnet major/minor version from both naming formats.
|
|
65
|
-
* Uses
|
|
69
|
+
* Uses bounded minor capture to avoid matching date suffixes (e.g., -20250514). */
|
|
66
70
|
function parseSonnetVersion(model) {
|
|
67
|
-
const nameFirst = model.match(/claude-sonnet[-.]?(\d+)(?:[-.](\d)(?!\d))?/);
|
|
71
|
+
const nameFirst = model.match(/claude-sonnet[-.]?(\d+)(?:[-.](\d{1,2})(?!\d))?/);
|
|
68
72
|
if (nameFirst) return {
|
|
69
73
|
major: parseInt(nameFirst[1], 10),
|
|
70
74
|
minor: nameFirst[2] != null ? parseInt(nameFirst[2], 10) : 0
|
|
71
75
|
};
|
|
72
|
-
const numFirst = model.match(/claude-(\d+)(?:[-.](\d)(?!\d))?-sonnet/);
|
|
76
|
+
const numFirst = model.match(/claude-(\d+)(?:[-.](\d{1,2})(?!\d))?-sonnet/);
|
|
73
77
|
if (numFirst) return {
|
|
74
78
|
major: parseInt(numFirst[1], 10),
|
|
75
79
|
minor: numFirst[2] != null ? parseInt(numFirst[2], 10) : 0
|
|
@@ -103,15 +107,80 @@ function supportsAdaptiveThinking(model) {
|
|
|
103
107
|
function omitsThinkingByDefault(model) {
|
|
104
108
|
const opus = parseOpusVersion(model);
|
|
105
109
|
if (opus && (opus.major > 4 || opus.major === 4 && opus.minor >= 7)) return true;
|
|
110
|
+
const sonnet = parseSonnetVersion(model);
|
|
111
|
+
if (sonnet != null && sonnet.major >= 5) return true;
|
|
106
112
|
if (require_data_service.isMythosClassModel(model)) return true;
|
|
107
113
|
return false;
|
|
108
114
|
}
|
|
109
115
|
function omitsSamplingParameters(model) {
|
|
110
116
|
const opus = parseOpusVersion(model);
|
|
111
117
|
if (opus && (opus.major > 4 || opus.major === 4 && opus.minor >= 7)) return true;
|
|
118
|
+
const sonnet = parseSonnetVersion(model);
|
|
119
|
+
if (sonnet != null && sonnet.major >= 5) return true;
|
|
112
120
|
if (require_data_service.isMythosClassModel(model)) return true;
|
|
113
121
|
return false;
|
|
114
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* Whether disabling thinking requires sending an explicit `{ type: 'disabled' }`
|
|
125
|
+
* config rather than simply omitting the `thinking` field.
|
|
126
|
+
*
|
|
127
|
+
* Sonnet 5 and Opus 5 treat an omitted `thinking` field as adaptive thinking ON
|
|
128
|
+
* by default, so honoring a user who turns thinking off means sending the
|
|
129
|
+
* disabled config explicitly. Opus 4.7/4.8 run without thinking when the field
|
|
130
|
+
* is omitted, and Fable/Mythos reject an explicit disabled config (400,
|
|
131
|
+
* thinking always on), so both are excluded.
|
|
132
|
+
*
|
|
133
|
+
* See https://platform.claude.com/docs/en/about-claude/models/migration-guide#migrating-to-claude-sonnet-5
|
|
134
|
+
*/
|
|
135
|
+
function requiresExplicitThinkingDisabled(model) {
|
|
136
|
+
const sonnet = parseSonnetVersion(model);
|
|
137
|
+
if (sonnet != null && sonnet.major >= 5) return true;
|
|
138
|
+
const opus = parseOpusVersion(model);
|
|
139
|
+
return opus != null && opus.major >= 5;
|
|
140
|
+
}
|
|
141
|
+
/** Effort levels Opus 5 rejects while thinking is explicitly disabled. */
|
|
142
|
+
const EFFORTS_REJECTED_WHEN_THINKING_DISABLED = new Set(["xhigh", "max"]);
|
|
143
|
+
/**
|
|
144
|
+
* Whether the model caps `output_config.effort` while thinking is disabled.
|
|
145
|
+
*
|
|
146
|
+
* Opus 5 rejects `xhigh`/`max` in that combination with a 400: "output_config
|
|
147
|
+
* .effort 'xhigh' is not supported when thinking is disabled on this model. Use
|
|
148
|
+
* effort 'high' or below, or enable thinking." Opus 4.7/4.8, Sonnet 5, and
|
|
149
|
+
* Sonnet 4.6 accept every effort level they otherwise support with thinking
|
|
150
|
+
* off, so the cap is Opus 5+ only.
|
|
151
|
+
*/
|
|
152
|
+
function capsEffortWhenThinkingDisabled(model) {
|
|
153
|
+
const opus = parseOpusVersion(model);
|
|
154
|
+
return opus != null && opus.major >= 5;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Lowers an effort level the model would reject while thinking is disabled to
|
|
158
|
+
* the highest accepted value (`high`, which is also the API default). Returns
|
|
159
|
+
* the effort unchanged when the combination is valid.
|
|
160
|
+
*/
|
|
161
|
+
function clampEffortForDisabledThinking(model, effort) {
|
|
162
|
+
if (capsEffortWhenThinkingDisabled(model) && EFFORTS_REJECTED_WHEN_THINKING_DISABLED.has(effort)) return "high";
|
|
163
|
+
return effort;
|
|
164
|
+
}
|
|
165
|
+
/** An `output_config` container carrying a usable effort level. */
|
|
166
|
+
function hasStringEffort(value) {
|
|
167
|
+
if (typeof value !== "object" || value === null || !("effort" in value)) return false;
|
|
168
|
+
return typeof value.effort === "string";
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Clamps an `output_config.effort` in place when the model would reject it
|
|
172
|
+
* while thinking is disabled. No-op when the container carries no string
|
|
173
|
+
* effort, so callers can pass a possibly-absent config directly.
|
|
174
|
+
*/
|
|
175
|
+
function clampOutputConfigEffort(model, outputConfig) {
|
|
176
|
+
if (!hasStringEffort(outputConfig)) return;
|
|
177
|
+
outputConfig.effort = clampEffortForDisabledThinking(model, outputConfig.effort);
|
|
178
|
+
}
|
|
179
|
+
/** Whether a resolved thinking config is an explicit `{ type: 'disabled' }`. */
|
|
180
|
+
function isThinkingDisabled(thinking) {
|
|
181
|
+
if (typeof thinking !== "object" || thinking === null || !("type" in thinking)) return false;
|
|
182
|
+
return thinking.type === "disabled";
|
|
183
|
+
}
|
|
115
184
|
/** Checks if a model has a 1M context window (Sonnet 4.6+, Opus 4.6+, Opus 5+, Fable/Mythos) */
|
|
116
185
|
function supportsContext1m(model) {
|
|
117
186
|
const sonnet = parseSonnetVersion(model);
|
|
@@ -122,6 +191,30 @@ function supportsContext1m(model) {
|
|
|
122
191
|
return false;
|
|
123
192
|
}
|
|
124
193
|
/**
|
|
194
|
+
* Checks whether a native Anthropic Claude model supports prompt caching.
|
|
195
|
+
*
|
|
196
|
+
* This uses the configured model ID directly. Resolving it through a token
|
|
197
|
+
* map first can collapse a newly released Claude model to the generic
|
|
198
|
+
* `claude-` fallback and incorrectly disable cache control.
|
|
199
|
+
*/
|
|
200
|
+
function supportsPromptCache(model) {
|
|
201
|
+
if (model.includes("claude-3-5-sonnet-latest") || model.includes("claude-3.5-sonnet-latest")) return false;
|
|
202
|
+
return /claude-3[-.]7/.test(model) || /claude-3[-.]5-(?:sonnet|haiku)/.test(model) || /claude-3-(?:sonnet|haiku|opus)?/.test(model) || /claude-(?:sonnet|opus|haiku)[-.]?(?:[4-9]|\d{2,})/.test(model) || /claude-(?:[4-9]|\d{2,})(?:[-.](?:sonnet|opus|haiku))?/.test(model) || require_data_service.isMythosClassModel(model);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* A Bedrock Claude model ID may be prefixed (`anthropic.claude-*`,
|
|
206
|
+
* `us.anthropic.claude-*`, `global.anthropic.claude-*`) or bare (`claude-*`,
|
|
207
|
+
* used when the LibreChat model ID maps to an application inference profile).
|
|
208
|
+
* Match on the `claude` family token so every form is recognized — requiring
|
|
209
|
+
* the literal `anthropic.` prefix silently dropped thinking config, beta
|
|
210
|
+
* headers, and sampling handling for inference-profile deployments.
|
|
211
|
+
*/
|
|
212
|
+
const BEDROCK_CLAUDE_4PLUS_THINKING = /claude-(?:[4-9](?:\.\d+)?(?:-\d+)?-(?:sonnet|opus|haiku)|(?:sonnet|opus|haiku)-[4-9])/;
|
|
213
|
+
/** Whether a Bedrock model ID is an Anthropic Claude model (prefixed or bare). */
|
|
214
|
+
function isBedrockClaudeModel(model) {
|
|
215
|
+
return model.includes("claude");
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
125
218
|
* Gets the appropriate anthropic_beta headers for Bedrock Anthropic models.
|
|
126
219
|
* Bedrock uses `anthropic_beta` (with underscore) in additionalModelRequestFields.
|
|
127
220
|
*
|
|
@@ -132,19 +225,33 @@ function getBedrockAnthropicBetaHeaders(model) {
|
|
|
132
225
|
const betaHeaders = [];
|
|
133
226
|
/** Mythos-class (Fable/Mythos) is intentionally not matched: these betas are built-in/no-op for the
|
|
134
227
|
* 4.7+ generation (Fable has native 128K output), so omitting them on Bedrock is lossless. */
|
|
135
|
-
const isClaude4PlusModel =
|
|
136
|
-
if (model.includes("
|
|
228
|
+
const isClaude4PlusModel = BEDROCK_CLAUDE_4PLUS_THINKING.test(model);
|
|
229
|
+
if (model.includes("claude-3-7-sonnet") || isClaude4PlusModel) betaHeaders.push(BEDROCK_OUTPUT_128K_BETA);
|
|
137
230
|
if (isClaude4PlusModel) betaHeaders.push(BEDROCK_FINE_GRAINED_TOOL_STREAMING_BETA);
|
|
138
231
|
return betaHeaders;
|
|
139
232
|
}
|
|
233
|
+
/** Flatten an anthropic_beta value (array, single string, or comma-delimited
|
|
234
|
+
* string) into trimmed, non-empty header tokens. */
|
|
235
|
+
function normalizeBetaHeaders(value) {
|
|
236
|
+
let values = [];
|
|
237
|
+
if (Array.isArray(value)) values = value;
|
|
238
|
+
else if (typeof value === "string") values = [value];
|
|
239
|
+
const headers = [];
|
|
240
|
+
values.forEach((entry) => {
|
|
241
|
+
if (typeof entry !== "string") return;
|
|
242
|
+
entry.split(",").map((header) => header.trim()).filter(Boolean).forEach((header) => headers.push(header));
|
|
243
|
+
});
|
|
244
|
+
return headers;
|
|
245
|
+
}
|
|
140
246
|
function mergeBedrockAnthropicBetaHeaders(existing, generated) {
|
|
141
|
-
|
|
142
|
-
if (Array.isArray(existing)) existingValues = existing;
|
|
143
|
-
else if (typeof existing === "string") existingValues = [existing];
|
|
247
|
+
const generatedSet = new Set(generated);
|
|
144
248
|
const betaHeaders = /* @__PURE__ */ new Set();
|
|
145
|
-
[...
|
|
146
|
-
|
|
147
|
-
|
|
249
|
+
[...normalizeBetaHeaders(existing), ...generated].forEach((header) => {
|
|
250
|
+
/** Drop a generated beta carried over from a prior model that the current
|
|
251
|
+
* model does not generate (e.g. fine-grained-tool-streaming on a 3.7
|
|
252
|
+
* profile); user opt-ins are always preserved. */
|
|
253
|
+
if (GENERATED_BEDROCK_BETAS.has(header) && !generatedSet.has(header)) return;
|
|
254
|
+
betaHeaders.add(header);
|
|
148
255
|
});
|
|
149
256
|
return Array.from(betaHeaders);
|
|
150
257
|
}
|
|
@@ -178,7 +285,7 @@ const bedrockInputSchema = require_data_service.tConversationSchema.pick({
|
|
|
178
285
|
}).transform((obj) => {
|
|
179
286
|
if (obj.additionalModelRequestFields?.thinking != null) {
|
|
180
287
|
const thinking = obj.additionalModelRequestFields.thinking;
|
|
181
|
-
obj.thinking = !!thinking;
|
|
288
|
+
obj.thinking = typeof thinking === "object" && thinking !== null && thinking.type === "disabled" ? false : !!thinking;
|
|
182
289
|
obj.thinkingBudget = typeof thinking === "object" && "budget_tokens" in thinking ? thinking.budget_tokens : void 0;
|
|
183
290
|
if (obj.thinkingDisplay == null) {
|
|
184
291
|
const persistedDisplay = extractPersistedDisplay({ thinking });
|
|
@@ -245,16 +352,49 @@ const bedrockInputParser = require_data_service.tConversationSchema.pick({
|
|
|
245
352
|
delete typedData[key];
|
|
246
353
|
}
|
|
247
354
|
});
|
|
248
|
-
/**
|
|
249
|
-
|
|
355
|
+
/**
|
|
356
|
+
* Persisted `model_parameters` can carry a prior "thinking off" only inside
|
|
357
|
+
* `additionalModelRequestFields.thinking = { type: 'disabled' }` (a known
|
|
358
|
+
* key that isn't spread into `additionalFields`). `initializeBedrock` feeds
|
|
359
|
+
* those params straight through this parser, so surface that as
|
|
360
|
+
* `thinking: false` — otherwise the disabled branch is skipped and the
|
|
361
|
+
* config rebuilds adaptive, flipping a user's Sonnet 5 setting back on.
|
|
362
|
+
*/
|
|
363
|
+
const persistedThinking = typedData.additionalModelRequestFields?.thinking;
|
|
364
|
+
if (additionalFields.thinking === void 0 && typeof persistedThinking === "object" && persistedThinking !== null && persistedThinking.type === "disabled") additionalFields.thinking = false;
|
|
365
|
+
/** Bedrock thinking-capable Claude models: 3.7 Sonnet, Claude 4+ (opus/sonnet/haiku), and Mythos-class (Fable/Mythos). */
|
|
366
|
+
const isThinkingModel = typeof typedData.model === "string" && (typedData.model.includes("claude-3-7-sonnet") || BEDROCK_CLAUDE_4PLUS_THINKING.test(typedData.model) || require_data_service.isMythosClassModel(typedData.model));
|
|
367
|
+
if (isThinkingModel) {
|
|
250
368
|
if (supportsAdaptiveThinking(typedData.model)) {
|
|
369
|
+
/** Persisted AMRF is spread into the final request, so clearing only
|
|
370
|
+
* `additionalFields` leaves a stale value from a prior selection. */
|
|
371
|
+
const persistedAmrf = typedData.additionalModelRequestFields;
|
|
372
|
+
const thinkingDisabled = additionalFields.thinking === false;
|
|
251
373
|
const effort = additionalFields.effort;
|
|
252
|
-
if (
|
|
374
|
+
if (typeof effort === "string" && effort !== "") additionalFields.output_config = { effort };
|
|
375
|
+
else if (effort !== void 0 && persistedAmrf)
|
|
376
|
+
/** Explicit unset ('' or null) clears the persisted effort. An absent
|
|
377
|
+
* effort (agent resume, where the prior llmConfig persisted
|
|
378
|
+
* `output_config` but no top-level `effort`) preserves it. */
|
|
379
|
+
delete persistedAmrf.output_config;
|
|
253
380
|
delete additionalFields.effort;
|
|
381
|
+
/**
|
|
382
|
+
* Opus 5 rejects `xhigh`/`max` effort while thinking is disabled, so
|
|
383
|
+
* clamp both the effort derived above and any effort still carried in
|
|
384
|
+
* persisted AMRF (agent resume sends `output_config` with no top-level
|
|
385
|
+
* `effort`, so the branch above leaves it untouched).
|
|
386
|
+
*/
|
|
387
|
+
if (thinkingDisabled) [additionalFields, persistedAmrf].forEach((target) => clampOutputConfigEffort(typedData.model, target?.output_config));
|
|
254
388
|
if (additionalFields.thinking === false) {
|
|
255
|
-
delete additionalFields.thinking;
|
|
256
389
|
delete additionalFields.thinkingBudget;
|
|
257
390
|
delete additionalFields.thinkingDisplay;
|
|
391
|
+
if (requiresExplicitThinkingDisabled(typedData.model)) additionalFields.thinking = { type: "disabled" };
|
|
392
|
+
else {
|
|
393
|
+
delete additionalFields.thinking;
|
|
394
|
+
/** Disable-by-omission models (Opus 4.7+): drop the persisted
|
|
395
|
+
* adaptive config so turning thinking off actually disables it. */
|
|
396
|
+
if (persistedAmrf) delete persistedAmrf.thinking;
|
|
397
|
+
}
|
|
258
398
|
} else {
|
|
259
399
|
/**
|
|
260
400
|
* Persisted agent `model_parameters` round-trip back through this
|
|
@@ -282,10 +422,18 @@ const bedrockInputParser = require_data_service.tConversationSchema.pick({
|
|
|
282
422
|
if (additionalFields.thinking === true && additionalFields.thinkingBudget === void 0) additionalFields.thinkingBudget = DEFAULT_THINKING_BUDGET;
|
|
283
423
|
delete additionalFields.effort;
|
|
284
424
|
delete additionalFields.thinkingDisplay;
|
|
425
|
+
/** A bare non-adaptive thinking profile (e.g. `claude-3-7-sonnet`) must
|
|
426
|
+
* not inherit an adaptive/disabled thinking object or `output_config`
|
|
427
|
+
* persisted from another model; this branch's own fields are authoritative. */
|
|
428
|
+
const persistedAmrf = typedData.additionalModelRequestFields;
|
|
429
|
+
if (persistedAmrf) {
|
|
430
|
+
delete persistedAmrf.thinking;
|
|
431
|
+
delete persistedAmrf.output_config;
|
|
432
|
+
}
|
|
285
433
|
}
|
|
286
434
|
/** Anthropic uses 'effort' via output_config, not reasoning_config */
|
|
287
435
|
delete additionalFields.reasoning_effort;
|
|
288
|
-
if (typedData.model
|
|
436
|
+
if (isBedrockClaudeModel(typedData.model)) {
|
|
289
437
|
const betaHeaders = getBedrockAnthropicBetaHeaders(typedData.model);
|
|
290
438
|
if (betaHeaders.length > 0) {
|
|
291
439
|
const existingBetaHeaders = typedData.additionalModelRequestFields?.anthropic_beta;
|
|
@@ -303,7 +451,7 @@ const bedrockInputParser = require_data_service.tConversationSchema.pick({
|
|
|
303
451
|
delete additionalFields.reasoning_effort;
|
|
304
452
|
if (typeof reasoningEffort === "string" && bedrockReasoningConfigValues.has(reasoningEffort)) additionalFields.reasoning_config = reasoningEffort;
|
|
305
453
|
}
|
|
306
|
-
const isAnthropicModel = typeof typedData.model === "string" && typedData.model
|
|
454
|
+
const isAnthropicModel = typeof typedData.model === "string" && isBedrockClaudeModel(typedData.model);
|
|
307
455
|
/** Strip stale fields from previously-persisted additionalModelRequestFields */
|
|
308
456
|
if (typeof typedData.additionalModelRequestFields === "object" && typedData.additionalModelRequestFields != null) {
|
|
309
457
|
const amrf = typedData.additionalModelRequestFields;
|
|
@@ -317,6 +465,22 @@ const bedrockInputParser = require_data_service.tConversationSchema.pick({
|
|
|
317
465
|
} else {
|
|
318
466
|
delete amrf.reasoning_config;
|
|
319
467
|
delete amrf.reasoning_effort;
|
|
468
|
+
/** A Claude model that does not support Bedrock thinking (e.g. a bare
|
|
469
|
+
* `claude-3-5-sonnet` inference profile) must not carry stale thinking
|
|
470
|
+
* fields from a previously-selected thinking model. Drop only the
|
|
471
|
+
* LibreChat-generated betas (output-128k, fine-grained tool streaming);
|
|
472
|
+
* user opt-ins in `anthropic_beta` are preserved. */
|
|
473
|
+
if (!isThinkingModel) {
|
|
474
|
+
delete amrf.thinking;
|
|
475
|
+
delete amrf.thinkingBudget;
|
|
476
|
+
delete amrf.effort;
|
|
477
|
+
delete amrf.output_config;
|
|
478
|
+
if (amrf.anthropic_beta !== void 0) {
|
|
479
|
+
const kept = normalizeBetaHeaders(amrf.anthropic_beta).filter((header) => !GENERATED_BEDROCK_BETAS.has(header));
|
|
480
|
+
if (kept.length > 0) amrf.anthropic_beta = kept;
|
|
481
|
+
else delete amrf.anthropic_beta;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
320
484
|
}
|
|
321
485
|
if (shouldOmitSamplingParameters) {
|
|
322
486
|
delete amrf.temperature;
|
|
@@ -359,11 +523,37 @@ const bedrockInputParser = require_data_service.tConversationSchema.pick({
|
|
|
359
523
|
* @param data - The parsed Bedrock request options object
|
|
360
524
|
* @returns The object with thinking configured appropriately
|
|
361
525
|
*/
|
|
526
|
+
/**
|
|
527
|
+
* `anthropicSettings.maxOutputTokens.reset` only matches the canonical
|
|
528
|
+
* family-first id (`claude-sonnet-5`); Bedrock also accepts number-first
|
|
529
|
+
* aliases (`claude-5-sonnet`, `claude-4-7-sonnet`) that this file gates as
|
|
530
|
+
* thinking models. Canonicalize to family-first so those aliases resolve to the
|
|
531
|
+
* real ceiling instead of the 8192 fallback.
|
|
532
|
+
*/
|
|
533
|
+
function toFamilyFirstClaudeId(model) {
|
|
534
|
+
return model.replace(/claude-(\d+(?:[-.]\d+)?)-(sonnet|opus|haiku)/, "claude-$2-$1");
|
|
535
|
+
}
|
|
536
|
+
function isBedrockClaudeSonnet46(model) {
|
|
537
|
+
return /claude-sonnet[-.]?4[-.]?6(?=$|[^0-9])/.test(toFamilyFirstClaudeId(model));
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Thinking tokens share the `maxTokens` output budget with tool-call arguments
|
|
541
|
+
* (e.g. a `create_file` `content`), so a low default truncates large authored
|
|
542
|
+
* files mid-argument. Mirror the direct-Anthropic path and default to the
|
|
543
|
+
* model's full max output when the request does not set one explicitly.
|
|
544
|
+
*/
|
|
545
|
+
function resolveThinkingMaxTokens(data) {
|
|
546
|
+
const explicit = data.maxTokens ?? data.maxOutputTokens;
|
|
547
|
+
if (typeof explicit === "number" && explicit > 0) return explicit;
|
|
548
|
+
const model = typeof data.model === "string" ? data.model : "";
|
|
549
|
+
if (isBedrockClaudeSonnet46(model)) return BEDROCK_CLAUDE_SONNET_4_6_MAX_OUTPUT;
|
|
550
|
+
return require_data_service.anthropicSettings.maxOutputTokens.reset(toFamilyFirstClaudeId(model));
|
|
551
|
+
}
|
|
362
552
|
function configureThinking(data) {
|
|
363
553
|
const updatedData = { ...data };
|
|
364
554
|
const thinking = updatedData.additionalModelRequestFields?.thinking;
|
|
365
555
|
if (thinking === true) {
|
|
366
|
-
updatedData.maxTokens = updatedData
|
|
556
|
+
updatedData.maxTokens = resolveThinkingMaxTokens(updatedData);
|
|
367
557
|
delete updatedData.maxOutputTokens;
|
|
368
558
|
const thinkingConfig = {
|
|
369
559
|
type: "enabled",
|
|
@@ -373,12 +563,30 @@ function configureThinking(data) {
|
|
|
373
563
|
updatedData.additionalModelRequestFields.thinking = thinkingConfig;
|
|
374
564
|
delete updatedData.additionalModelRequestFields.thinkingBudget;
|
|
375
565
|
} else if (typeof thinking === "object" && thinking != null && thinking.type === "adaptive") {
|
|
376
|
-
|
|
566
|
+
updatedData.maxTokens = resolveThinkingMaxTokens(updatedData);
|
|
377
567
|
delete updatedData.maxOutputTokens;
|
|
378
568
|
delete updatedData.additionalModelRequestFields.thinkingBudget;
|
|
379
569
|
}
|
|
380
570
|
return updatedData;
|
|
381
571
|
}
|
|
572
|
+
/** Top-level Converse request fields (issue #14029: `system` from a preset).
|
|
573
|
+
* The input parser's catch-all routes unknown keys into
|
|
574
|
+
* additionalModelRequestFields, and Bedrock rejects any that collide with a
|
|
575
|
+
* field the request already sends (`messages`/`modelId` always,
|
|
576
|
+
* `inferenceConfig` whenever maxTokens is set, `toolConfig` for agents). */
|
|
577
|
+
const RESERVED_CONVERSE_FIELDS = [
|
|
578
|
+
"system",
|
|
579
|
+
"messages",
|
|
580
|
+
"modelId",
|
|
581
|
+
"toolConfig",
|
|
582
|
+
"inferenceConfig",
|
|
583
|
+
"guardrailConfig",
|
|
584
|
+
"promptVariables",
|
|
585
|
+
"requestMetadata",
|
|
586
|
+
"performanceConfig",
|
|
587
|
+
"additionalModelRequestFields",
|
|
588
|
+
"additionalModelResponseFieldPaths"
|
|
589
|
+
];
|
|
382
590
|
const bedrockOutputParser = (data) => {
|
|
383
591
|
const knownKeys = [
|
|
384
592
|
...Object.keys(require_data_service.tConversationSchema.shape),
|
|
@@ -397,7 +605,15 @@ const bedrockOutputParser = (data) => {
|
|
|
397
605
|
if (result.maxTokens !== void 0 && result.maxOutputTokens === void 0) result.maxOutputTokens = result.maxTokens;
|
|
398
606
|
else if (result.maxOutputTokens !== void 0 && result.maxTokens === void 0) result.maxTokens = result.maxOutputTokens;
|
|
399
607
|
result = configureThinking(result);
|
|
400
|
-
|
|
608
|
+
let amrf = result.additionalModelRequestFields;
|
|
609
|
+
if (amrf && typeof amrf === "object") {
|
|
610
|
+
const reserved = RESERVED_CONVERSE_FIELDS.filter((key) => key in (amrf ?? {}));
|
|
611
|
+
if (reserved.length > 0) {
|
|
612
|
+
amrf = { ...amrf };
|
|
613
|
+
for (const key of reserved) delete amrf[key];
|
|
614
|
+
result.additionalModelRequestFields = amrf;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
401
617
|
if (!amrf || Object.keys(amrf).length === 0) delete result.additionalModelRequestFields;
|
|
402
618
|
return result;
|
|
403
619
|
};
|
|
@@ -414,6 +630,8 @@ let ContentTypes = /* @__PURE__ */ function(ContentTypes) {
|
|
|
414
630
|
ContentTypes["INPUT_AUDIO"] = "input_audio";
|
|
415
631
|
ContentTypes["AGENT_UPDATE"] = "agent_update";
|
|
416
632
|
ContentTypes["SUMMARY"] = "summary";
|
|
633
|
+
ContentTypes["ACTIVITY_LABEL"] = "activity_label";
|
|
634
|
+
ContentTypes["STEER"] = "steer";
|
|
417
635
|
ContentTypes["ERROR"] = "error";
|
|
418
636
|
return ContentTypes;
|
|
419
637
|
}({});
|
|
@@ -438,10 +656,14 @@ let StepEvents = /* @__PURE__ */ function(StepEvents) {
|
|
|
438
656
|
StepEvents["ON_REASONING_DELTA"] = "on_reasoning_delta";
|
|
439
657
|
StepEvents["ON_RUN_STEP_DELTA"] = "on_run_step_delta";
|
|
440
658
|
StepEvents["ON_RUN_STEP_COMPLETED"] = "on_run_step_completed";
|
|
659
|
+
/** Terminal signal for a run step: closed with a status and timestamps. */
|
|
660
|
+
StepEvents["ON_RUN_STEP_CLOSED"] = "on_run_step_closed";
|
|
441
661
|
StepEvents["ON_SUMMARIZE_START"] = "on_summarize_start";
|
|
442
662
|
StepEvents["ON_SUMMARIZE_DELTA"] = "on_summarize_delta";
|
|
443
663
|
StepEvents["ON_SUMMARIZE_COMPLETE"] = "on_summarize_complete";
|
|
444
664
|
StepEvents["ON_SUBAGENT_UPDATE"] = "on_subagent_update";
|
|
665
|
+
StepEvents["ON_SANDBOX_STARTING"] = "on_sandbox_starting";
|
|
666
|
+
StepEvents["ON_PTC_TOOL_CALL"] = "on_ptc_tool_call";
|
|
445
667
|
return StepEvents;
|
|
446
668
|
}({});
|
|
447
669
|
/** Token-tracking event names streamed to the client (separate from StepEvents dispatch). */
|
|
@@ -451,6 +673,45 @@ let UsageEvents = /* @__PURE__ */ function(UsageEvents) {
|
|
|
451
673
|
return UsageEvents;
|
|
452
674
|
}({});
|
|
453
675
|
/**
|
|
676
|
+
* Human-in-the-loop event names. Streamed to live clients when a run pauses for
|
|
677
|
+
* tool approval (or an ask-user question). Reconnecting clients instead read the
|
|
678
|
+
* same record from `resumeState.pendingAction` on the sync event / status route.
|
|
679
|
+
*/
|
|
680
|
+
let ApprovalEvents = /* @__PURE__ */ function(ApprovalEvents) {
|
|
681
|
+
ApprovalEvents["ON_PENDING_ACTION"] = "on_pending_action";
|
|
682
|
+
return ApprovalEvents;
|
|
683
|
+
}({});
|
|
684
|
+
/**
|
|
685
|
+
* Steering event names. `on_steer_applied` streams to live clients when a
|
|
686
|
+
* queued steer message is injected at a tool-batch boundary; reconnecting
|
|
687
|
+
* clients recover injected steers from `aggregatedContent` and still-queued
|
|
688
|
+
* ones from `resumeState.pendingSteers`. Steers that never reach a boundary
|
|
689
|
+
* ride the final/abort events as `pendingSteers`.
|
|
690
|
+
*/
|
|
691
|
+
let SteerEvents = /* @__PURE__ */ function(SteerEvents) {
|
|
692
|
+
SteerEvents["ON_STEER_APPLIED"] = "on_steer_applied";
|
|
693
|
+
/** Durable capability correction for queued steers after HITL handover. */
|
|
694
|
+
SteerEvents["ON_STEER_UPDATED"] = "on_steer_updated";
|
|
695
|
+
return SteerEvents;
|
|
696
|
+
}({});
|
|
697
|
+
/**
|
|
698
|
+
* Activity-label event names. `on_activity_label` streams to live clients
|
|
699
|
+
* when a tool-batch or parent-phase label part is claimed and again when the
|
|
700
|
+
* fast-model label resolves; reconnecting clients recover applied labels
|
|
701
|
+
* from `aggregatedContent` like any other content part.
|
|
702
|
+
*/
|
|
703
|
+
let ActivityLabelEvents = /* @__PURE__ */ function(ActivityLabelEvents) {
|
|
704
|
+
ActivityLabelEvents["ON_ACTIVITY_LABEL"] = "on_activity_label";
|
|
705
|
+
return ActivityLabelEvents;
|
|
706
|
+
}({});
|
|
707
|
+
/** Live title updates for an existing reasoning content part. */
|
|
708
|
+
let ReasoningLabelEvents = /* @__PURE__ */ function(ReasoningLabelEvents) {
|
|
709
|
+
ReasoningLabelEvents["ON_REASONING_LABEL"] = "on_reasoning_label";
|
|
710
|
+
/** Internal durable budget reservation; clients intentionally do not render it. */
|
|
711
|
+
ReasoningLabelEvents["ON_REASONING_LABEL_ATTEMPT"] = "on_reasoning_label_attempt";
|
|
712
|
+
return ReasoningLabelEvents;
|
|
713
|
+
}({});
|
|
714
|
+
/**
|
|
454
715
|
* Full prompt token count for one completed model call — the EXACT context the
|
|
455
716
|
* model saw, provider-aware: additive providers (Bedrock) report `input_tokens`
|
|
456
717
|
* excluding cache, so cache reads/writes are added back; subset providers
|
|
@@ -657,19 +918,21 @@ const parseCompactConvo = ({ endpoint, endpointType, conversation, possibleValue
|
|
|
657
918
|
if (models && convo) convo.model = getFirstDefinedValue(models) ?? convo.model;
|
|
658
919
|
return convo;
|
|
659
920
|
};
|
|
660
|
-
function parseTextParts(contentParts, skipReasoning = false) {
|
|
921
|
+
function parseTextParts(contentParts, skipReasoning = false, options) {
|
|
661
922
|
let result = "";
|
|
923
|
+
const append = (textValue) => {
|
|
924
|
+
if (result.length > 0 && textValue.length > 0 && result[result.length - 1] !== " " && textValue[0] !== " ") result += " ";
|
|
925
|
+
result += textValue;
|
|
926
|
+
};
|
|
662
927
|
for (const part of contentParts) {
|
|
663
928
|
if (!part?.type) continue;
|
|
664
|
-
if (part.type === "text")
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
result += textValue;
|
|
672
|
-
}
|
|
929
|
+
if (part.type === "text") append((typeof part.text === "string" ? part.text : part.text?.value) || "");
|
|
930
|
+
else if (part.type === "steer" && options?.includeSteer === true)
|
|
931
|
+
/** Mid-run user speech: excluded by default so generic extraction (TTS
|
|
932
|
+
* reading assistant output) never speaks the user's own words — the
|
|
933
|
+
* full-record surfaces (search indexing, persisted abort text) opt in. */
|
|
934
|
+
append(typeof part.steer === "string" ? part.steer : "");
|
|
935
|
+
else if (part.type === "think" && !skipReasoning) append(typeof part.think === "string" ? part.think : "");
|
|
673
936
|
}
|
|
674
937
|
return result;
|
|
675
938
|
}
|
|
@@ -723,6 +986,14 @@ function replaceSpecialVars({ text, user, now: inputNow, timezone }) {
|
|
|
723
986
|
return result;
|
|
724
987
|
}
|
|
725
988
|
/**
|
|
989
|
+
* Resolves the display label ("sender") for an ephemeral agent:
|
|
990
|
+
* `modelLabel` (user/preset) → model spec's `label` → endpoint config's
|
|
991
|
+
* `modelDisplayLabel` → `''` (lets consumers fall back to the model name).
|
|
992
|
+
*/
|
|
993
|
+
function getEphemeralSender({ modelLabel, specLabel, modelDisplayLabel }) {
|
|
994
|
+
return modelLabel ?? specLabel ?? modelDisplayLabel ?? "";
|
|
995
|
+
}
|
|
996
|
+
/**
|
|
726
997
|
* Encodes an ephemeral agent ID from endpoint, model, optional sender, and optional index.
|
|
727
998
|
* Uses __ to replace : (reserved in graph node names) and ___ to separate sender.
|
|
728
999
|
*
|
|
@@ -1014,15 +1285,132 @@ function mapGroupToAzureConfig({ groupName, groupMap }) {
|
|
|
1014
1285
|
return result;
|
|
1015
1286
|
}
|
|
1016
1287
|
//#endregion
|
|
1288
|
+
//#region src/langchain.ts
|
|
1289
|
+
/**
|
|
1290
|
+
* LangChain classifies a provider failure by mutating the error: it stamps `lc_error_code` and
|
|
1291
|
+
* appends `\n\nTroubleshooting URL: <docs url>\n` to the message. Both halves are handled here
|
|
1292
|
+
* because the server strips the URL before persisting the message, while the client still reads the
|
|
1293
|
+
* code back out of messages persisted before it did.
|
|
1294
|
+
*/
|
|
1295
|
+
const LANGCHAIN = "langchain";
|
|
1296
|
+
const ERROR_PATH = "/errors/";
|
|
1297
|
+
const TROUBLESHOOTING_LABEL = "Troubleshooting URL:";
|
|
1298
|
+
const WHITESPACE = /\s/;
|
|
1299
|
+
/** Provider errors cross untyped boundaries, so a `message` is not guaranteed to be a string. */
|
|
1300
|
+
function toMessageText(message) {
|
|
1301
|
+
if (typeof message === "string") return message;
|
|
1302
|
+
return message == null ? "" : String(message);
|
|
1303
|
+
}
|
|
1304
|
+
function isErrorCodeCharacter(character) {
|
|
1305
|
+
const code = character.charCodeAt(0);
|
|
1306
|
+
return character === "_" || code >= 65 && code <= 90 || code >= 97 && code <= 122;
|
|
1307
|
+
}
|
|
1308
|
+
function findTokenEnd(text, start, limit = text.length) {
|
|
1309
|
+
let end = start;
|
|
1310
|
+
while (end < limit && !WHITESPACE.test(text[end])) end += 1;
|
|
1311
|
+
return end;
|
|
1312
|
+
}
|
|
1313
|
+
function findErrorCode(text, searchableText, start, end) {
|
|
1314
|
+
const langChainIndex = searchableText.indexOf(LANGCHAIN, start);
|
|
1315
|
+
if (langChainIndex < 0 || langChainIndex >= end) return;
|
|
1316
|
+
let errorCode;
|
|
1317
|
+
let pathIndex = searchableText.indexOf(ERROR_PATH, langChainIndex + 9);
|
|
1318
|
+
while (pathIndex >= 0 && pathIndex < end) {
|
|
1319
|
+
const codeStart = pathIndex + 8;
|
|
1320
|
+
let codeEnd = codeStart;
|
|
1321
|
+
while (codeEnd < end && isErrorCodeCharacter(text[codeEnd])) codeEnd += 1;
|
|
1322
|
+
if (codeEnd > codeStart) errorCode = {
|
|
1323
|
+
start: codeStart,
|
|
1324
|
+
end: codeEnd
|
|
1325
|
+
};
|
|
1326
|
+
pathIndex = searchableText.indexOf(ERROR_PATH, Math.max(codeStart, codeEnd));
|
|
1327
|
+
}
|
|
1328
|
+
return errorCode;
|
|
1329
|
+
}
|
|
1330
|
+
/** Removes LangChain's appended docs URL so provider text carries no third-party attribution. */
|
|
1331
|
+
function stripLangChainTroubleshootingUrl(message) {
|
|
1332
|
+
const text = toMessageText(message);
|
|
1333
|
+
const parts = [];
|
|
1334
|
+
let copiedUntil = 0;
|
|
1335
|
+
let searchFrom = 0;
|
|
1336
|
+
while (searchFrom < text.length) {
|
|
1337
|
+
const labelStart = text.indexOf(TROUBLESHOOTING_LABEL, searchFrom);
|
|
1338
|
+
if (labelStart < 0) break;
|
|
1339
|
+
let matchStart = labelStart;
|
|
1340
|
+
while (matchStart > copiedUntil && WHITESPACE.test(text[matchStart - 1])) matchStart -= 1;
|
|
1341
|
+
let urlStart = labelStart + 20;
|
|
1342
|
+
while (urlStart < text.length && WHITESPACE.test(text[urlStart])) urlStart += 1;
|
|
1343
|
+
if (!text.startsWith("https://", urlStart) && !text.startsWith("http://", urlStart)) {
|
|
1344
|
+
searchFrom = urlStart;
|
|
1345
|
+
continue;
|
|
1346
|
+
}
|
|
1347
|
+
const urlEnd = findTokenEnd(text, urlStart);
|
|
1348
|
+
const errorCode = findErrorCode(text, text, urlStart, urlEnd);
|
|
1349
|
+
if (errorCode == null) {
|
|
1350
|
+
searchFrom = urlEnd;
|
|
1351
|
+
continue;
|
|
1352
|
+
}
|
|
1353
|
+
let matchEnd = errorCode.end;
|
|
1354
|
+
if (text[matchEnd] === "/") matchEnd += 1;
|
|
1355
|
+
while (matchEnd < text.length && WHITESPACE.test(text[matchEnd])) matchEnd += 1;
|
|
1356
|
+
parts.push(text.slice(copiedUntil, matchStart), " ");
|
|
1357
|
+
copiedUntil = matchEnd;
|
|
1358
|
+
searchFrom = matchEnd;
|
|
1359
|
+
}
|
|
1360
|
+
parts.push(text.slice(copiedUntil));
|
|
1361
|
+
return parts.join("").trim();
|
|
1362
|
+
}
|
|
1363
|
+
/** The classification LangChain encoded in the docs URL it appended, when the text carries one. */
|
|
1364
|
+
function parseLangChainErrorCode(message) {
|
|
1365
|
+
const text = toMessageText(message);
|
|
1366
|
+
const searchableText = text.toLowerCase();
|
|
1367
|
+
let searchFrom = 0;
|
|
1368
|
+
while (searchFrom < text.length) {
|
|
1369
|
+
const langChainIndex = searchableText.indexOf(LANGCHAIN, searchFrom);
|
|
1370
|
+
if (langChainIndex < 0) return;
|
|
1371
|
+
const tokenEnd = findTokenEnd(text, langChainIndex);
|
|
1372
|
+
const errorCode = findErrorCode(text, searchableText, langChainIndex, tokenEnd);
|
|
1373
|
+
if (errorCode != null) return text.slice(errorCode.start, errorCode.end).toUpperCase();
|
|
1374
|
+
searchFrom = tokenEnd + 1;
|
|
1375
|
+
}
|
|
1376
|
+
}
|
|
1377
|
+
//#endregion
|
|
1017
1378
|
//#region src/messages.ts
|
|
1379
|
+
/** A generated reasoning title describes the text as it existed at generation time.
|
|
1380
|
+
* Any manual edit or merge into a different reasoning step invalidates the entire
|
|
1381
|
+
* title revision domain while preserving unrelated content metadata. */
|
|
1382
|
+
function stripReasoningLabelMetadata(part) {
|
|
1383
|
+
if (part.type !== "think") return part;
|
|
1384
|
+
const { reasoning_label: _label, reasoning_label_step_id: _stepId, reasoning_label_attempts: _attempts, reasoning_label_submitted_chars: _submittedChars, reasoning_label_revision: _revision, reasoning_label_status: _status, ...unlabeledPart } = part;
|
|
1385
|
+
return unlabeledPart;
|
|
1386
|
+
}
|
|
1387
|
+
const treeCache = /* @__PURE__ */ new WeakMap();
|
|
1388
|
+
/**
|
|
1389
|
+
* Builds the render tree from the flat messages array. Order-robust: live
|
|
1390
|
+
* stream/steer/preempt cache writes can momentarily place a child before its
|
|
1391
|
+
* parent, and a single-pass link would hoist such rows into phantom root
|
|
1392
|
+
* branches — folding the visible thread to one dangling branch until a
|
|
1393
|
+
* refetch restores creation order. Linking happens only after every message
|
|
1394
|
+
* is indexed, so array order never changes the tree shape.
|
|
1395
|
+
*/
|
|
1018
1396
|
function buildTree({ messages, fileMap }) {
|
|
1019
1397
|
if (messages === null) return null;
|
|
1398
|
+
const cached = treeCache.get(messages);
|
|
1399
|
+
if (cached) {
|
|
1400
|
+
if (fileMap == null && cached.bare) return cached.bare;
|
|
1401
|
+
if (fileMap != null && cached.fileMap === fileMap && cached.hydrated) return cached.hydrated;
|
|
1402
|
+
}
|
|
1020
1403
|
const messageMap = {};
|
|
1404
|
+
const orderedMessages = [];
|
|
1021
1405
|
const rootMessages = [];
|
|
1022
1406
|
const childrenCount = {};
|
|
1023
|
-
|
|
1024
|
-
if (!message)
|
|
1025
|
-
|
|
1407
|
+
for (const message of messages) {
|
|
1408
|
+
if (!message) continue;
|
|
1409
|
+
/** A self-parented row can never link under itself (it becomes a root),
|
|
1410
|
+
* so count it with the parentless group — charging its own id would
|
|
1411
|
+
* inflate the sibling indices of its real children past
|
|
1412
|
+
* `children.length`. */
|
|
1413
|
+
const parentId = message.parentMessageId === message.messageId ? "" : message.parentMessageId ?? "";
|
|
1026
1414
|
childrenCount[parentId] = (childrenCount[parentId] || 0) + 1;
|
|
1027
1415
|
const extendedMessage = {
|
|
1028
1416
|
...message,
|
|
@@ -1032,13 +1420,102 @@ function buildTree({ messages, fileMap }) {
|
|
|
1032
1420
|
};
|
|
1033
1421
|
if (message.files && fileMap) extendedMessage.files = message.files.map((file) => fileMap[file.file_id ?? ""] ?? file);
|
|
1034
1422
|
messageMap[message.messageId] = extendedMessage;
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1423
|
+
orderedMessages.push(extendedMessage);
|
|
1424
|
+
}
|
|
1425
|
+
for (const extendedMessage of orderedMessages) {
|
|
1426
|
+
const parentMessage = messageMap[extendedMessage.parentMessageId ?? ""];
|
|
1427
|
+
if (parentMessage && parentMessage !== extendedMessage) parentMessage.children.push(extendedMessage);
|
|
1428
|
+
else rootMessages.push(extendedMessage);
|
|
1429
|
+
}
|
|
1430
|
+
/** Depth comes from a roots-down walk (a child linked before its parent
|
|
1431
|
+
* can't inherit depth at link time). The `visited` set doubles as the
|
|
1432
|
+
* cycle guard: nodes on a corrupt parent cycle are unreachable from any
|
|
1433
|
+
* root, so they resurface as roots instead of disappearing. */
|
|
1434
|
+
const visited = /* @__PURE__ */ new Set();
|
|
1435
|
+
const assignDepths = (root) => {
|
|
1436
|
+
visited.add(root);
|
|
1437
|
+
const stack = [root];
|
|
1438
|
+
while (stack.length > 0) {
|
|
1439
|
+
const node = stack.pop();
|
|
1440
|
+
/** Every node has one parent, so this walk reaches each node once — an
|
|
1441
|
+
* already-visited child is a cycle back-edge. Sever it (not just skip
|
|
1442
|
+
* it) so consumers that recurse `children` terminate. */
|
|
1443
|
+
if (node.children.some((child) => visited.has(child))) node.children = node.children.filter((child) => !visited.has(child));
|
|
1444
|
+
for (const child of node.children) {
|
|
1445
|
+
child.depth = node.depth + 1;
|
|
1446
|
+
visited.add(child);
|
|
1447
|
+
stack.push(child);
|
|
1448
|
+
}
|
|
1449
|
+
}
|
|
1450
|
+
};
|
|
1451
|
+
for (const root of rootMessages) assignDepths(root);
|
|
1452
|
+
for (const extendedMessage of orderedMessages) if (!visited.has(extendedMessage)) {
|
|
1453
|
+
rootMessages.push(extendedMessage);
|
|
1454
|
+
assignDepths(extendedMessage);
|
|
1455
|
+
}
|
|
1456
|
+
const tree = rootMessages;
|
|
1457
|
+
const entry = cached ?? {};
|
|
1458
|
+
if (fileMap == null) entry.bare = tree;
|
|
1459
|
+
else {
|
|
1460
|
+
entry.fileMap = fileMap;
|
|
1461
|
+
entry.hydrated = tree;
|
|
1462
|
+
}
|
|
1463
|
+
if (!cached) treeCache.set(messages, entry);
|
|
1464
|
+
return tree;
|
|
1465
|
+
}
|
|
1466
|
+
//#endregion
|
|
1467
|
+
//#region src/runSteps.ts
|
|
1468
|
+
/**
|
|
1469
|
+
* Below this, a duration is noise rather than information: sub-second tool
|
|
1470
|
+
* calls are the common case, and labelling every one of them `· 0.3s` adds a
|
|
1471
|
+
* moving number to the end of most cards without telling the reader anything
|
|
1472
|
+
* they could act on. Callers use {@link isReportableRunStepDuration} rather
|
|
1473
|
+
* than comparing against this directly.
|
|
1474
|
+
*/
|
|
1475
|
+
const MIN_REPORTABLE_RUN_STEP_DURATION_MS = 1e3;
|
|
1476
|
+
/**
|
|
1477
|
+
* Wall-clock duration of a run step, derived from the terminal
|
|
1478
|
+
* `on_run_step_closed` event.
|
|
1479
|
+
*
|
|
1480
|
+
* Returns `undefined` rather than a fallback whenever the value would be a
|
|
1481
|
+
* guess, because a wrong duration is worse than an absent one — an absent one
|
|
1482
|
+
* renders nothing, a wrong one is indistinguishable from a real measurement:
|
|
1483
|
+
*
|
|
1484
|
+
* - `created_at` is optional on the event; emitters that do not know when the
|
|
1485
|
+
* step opened cannot have their duration inferred from anything else.
|
|
1486
|
+
* - A negative result means the two timestamps came from clocks that disagree.
|
|
1487
|
+
* That is not hypothetical: since `@librechat/agents` v3.6.0 a step can be
|
|
1488
|
+
* opened in one process and closed in another after a checkpoint resume, so
|
|
1489
|
+
* the two stamps can legitimately originate on different machines.
|
|
1490
|
+
* - Non-finite input is treated as absent instead of propagating `NaN` into
|
|
1491
|
+
* rendering.
|
|
1492
|
+
*
|
|
1493
|
+
* Known limits, accepted rather than guessed at: only the negative direction
|
|
1494
|
+
* of clock skew is detectable from a single stamp pair — positive skew
|
|
1495
|
+
* inflates the result and cannot be distinguished from a genuinely long
|
|
1496
|
+
* step. And the value is wall-clock elapsed between open and close, so a
|
|
1497
|
+
* step held open across a suspension (a checkpoint resume, a HITL approval
|
|
1498
|
+
* wait) includes that held-open time. Both are properties of the only data
|
|
1499
|
+
* available, not derivation bugs.
|
|
1500
|
+
*/
|
|
1501
|
+
function getRunStepDurationMs(closed) {
|
|
1502
|
+
const { created_at: createdAt, closed_at: closedAt } = closed;
|
|
1503
|
+
if (typeof createdAt !== "number" || typeof closedAt !== "number") return;
|
|
1504
|
+
if (!Number.isFinite(createdAt) || !Number.isFinite(closedAt)) return;
|
|
1505
|
+
const durationMs = closedAt - createdAt;
|
|
1506
|
+
return durationMs >= 0 ? durationMs : void 0;
|
|
1507
|
+
}
|
|
1508
|
+
/**
|
|
1509
|
+
* Whether a derived duration is worth showing to the reader.
|
|
1510
|
+
*
|
|
1511
|
+
* This is a presentation judgment, so it belongs at render time only. The
|
|
1512
|
+
* stamp sites persist the raw {@link getRunStepDurationMs} value instead of
|
|
1513
|
+
* pre-filtering through this — thresholding at write time would bake a
|
|
1514
|
+
* display rule into stored data, making "fast" indistinguishable from "not
|
|
1515
|
+
* derivable" and unrecoverable if the rule ever changes.
|
|
1516
|
+
*/
|
|
1517
|
+
function isReportableRunStepDuration(durationMs) {
|
|
1518
|
+
return typeof durationMs === "number" && durationMs >= 1e3;
|
|
1042
1519
|
}
|
|
1043
1520
|
//#endregion
|
|
1044
1521
|
//#region src/artifacts.ts
|
|
@@ -4211,6 +4688,10 @@ let PermissionTypes = /* @__PURE__ */ function(PermissionTypes) {
|
|
|
4211
4688
|
* Type for Shared Link Permissions
|
|
4212
4689
|
*/
|
|
4213
4690
|
PermissionTypes["SHARED_LINKS"] = "SHARED_LINKS";
|
|
4691
|
+
/**
|
|
4692
|
+
* Type for Scheduled Chats Permissions
|
|
4693
|
+
*/
|
|
4694
|
+
PermissionTypes["SCHEDULES"] = "SCHEDULES";
|
|
4214
4695
|
return PermissionTypes;
|
|
4215
4696
|
}({});
|
|
4216
4697
|
/**
|
|
@@ -4234,11 +4715,20 @@ const PERMISSION_TYPE_INTERFACE_FIELDS = {
|
|
|
4234
4715
|
["MCP_SERVERS"]: "mcpServers",
|
|
4235
4716
|
["REMOTE_AGENTS"]: "remoteAgents",
|
|
4236
4717
|
["SKILLS"]: "skills",
|
|
4237
|
-
["SHARED_LINKS"]: "sharedLinks"
|
|
4718
|
+
["SHARED_LINKS"]: "sharedLinks",
|
|
4719
|
+
["SCHEDULES"]: "schedules"
|
|
4238
4720
|
};
|
|
4239
4721
|
/** Set of interface config field names that correspond to role permissions. */
|
|
4240
4722
|
const INTERFACE_PERMISSION_FIELDS = new Set(Object.values(PERMISSION_TYPE_INTERFACE_FIELDS));
|
|
4241
4723
|
/**
|
|
4724
|
+
* Interface fields that seed a permission (use/create) BUT also carry runtime
|
|
4725
|
+
* config that must survive DB/tenant/user overrides. For these, override
|
|
4726
|
+
* sanitizers strip only the permission sub-keys (use/create) from the object
|
|
4727
|
+
* form and PRESERVE the boolean form — for `schedules`, `interface.schedules: false`
|
|
4728
|
+
* is the runtime feature disable that `getLimits` reads, not a permission toggle.
|
|
4729
|
+
*/
|
|
4730
|
+
const RUNTIME_CONFIG_INTERFACE_FIELDS = new Set(["schedules"]);
|
|
4731
|
+
/**
|
|
4242
4732
|
* YAML sub-keys within composite interface permission fields that map to permission bits.
|
|
4243
4733
|
* When an interface permission field is an object, only these sub-keys are stripped from
|
|
4244
4734
|
* DB overrides — other sub-keys (like `placeholder`, `trustCheckbox`) are UI-only and pass through.
|
|
@@ -4339,6 +4829,10 @@ const skillPermissionsSchema = zod.z.object({
|
|
|
4339
4829
|
["SHARE"]: zod.z.boolean().default(false),
|
|
4340
4830
|
["SHARE_PUBLIC"]: zod.z.boolean().default(false)
|
|
4341
4831
|
});
|
|
4832
|
+
const schedulesPermissionsSchema = zod.z.object({
|
|
4833
|
+
["USE"]: zod.z.boolean().default(true),
|
|
4834
|
+
["CREATE"]: zod.z.boolean().default(true)
|
|
4835
|
+
});
|
|
4342
4836
|
const sharedLinksPermissionsSchema = zod.z.object({
|
|
4343
4837
|
["CREATE"]: zod.z.boolean().default(true),
|
|
4344
4838
|
["SHARE"]: zod.z.boolean().default(true),
|
|
@@ -4360,7 +4854,8 @@ const permissionsSchema = zod.z.object({
|
|
|
4360
4854
|
["MCP_SERVERS"]: mcpServersPermissionsSchema,
|
|
4361
4855
|
["REMOTE_AGENTS"]: remoteAgentsPermissionsSchema,
|
|
4362
4856
|
["SKILLS"]: skillPermissionsSchema,
|
|
4363
|
-
["SHARED_LINKS"]: sharedLinksPermissionsSchema
|
|
4857
|
+
["SHARED_LINKS"]: sharedLinksPermissionsSchema,
|
|
4858
|
+
["SCHEDULES"]: schedulesPermissionsSchema
|
|
4364
4859
|
});
|
|
4365
4860
|
//#endregion
|
|
4366
4861
|
//#region src/roles.ts
|
|
@@ -4441,6 +4936,10 @@ const defaultRolesSchema = zod.z.object({
|
|
|
4441
4936
|
["CREATE"]: zod.z.boolean().default(true),
|
|
4442
4937
|
["SHARE"]: zod.z.boolean().default(true),
|
|
4443
4938
|
["SHARE_PUBLIC"]: zod.z.boolean().default(true)
|
|
4939
|
+
}),
|
|
4940
|
+
["SCHEDULES"]: schedulesPermissionsSchema.extend({
|
|
4941
|
+
["USE"]: zod.z.boolean().default(true),
|
|
4942
|
+
["CREATE"]: zod.z.boolean().default(true)
|
|
4444
4943
|
})
|
|
4445
4944
|
})
|
|
4446
4945
|
}),
|
|
@@ -4514,6 +5013,10 @@ const roleDefaults = defaultRolesSchema.parse({
|
|
|
4514
5013
|
["CREATE"]: true,
|
|
4515
5014
|
["SHARE"]: true,
|
|
4516
5015
|
["SHARE_PUBLIC"]: true
|
|
5016
|
+
},
|
|
5017
|
+
["SCHEDULES"]: {
|
|
5018
|
+
["USE"]: true,
|
|
5019
|
+
["CREATE"]: true
|
|
4517
5020
|
}
|
|
4518
5021
|
}
|
|
4519
5022
|
},
|
|
@@ -4569,6 +5072,10 @@ const roleDefaults = defaultRolesSchema.parse({
|
|
|
4569
5072
|
["CREATE"]: true,
|
|
4570
5073
|
["SHARE"]: true,
|
|
4571
5074
|
["SHARE_PUBLIC"]: true
|
|
5075
|
+
},
|
|
5076
|
+
["SCHEDULES"]: {
|
|
5077
|
+
["USE"]: true,
|
|
5078
|
+
["CREATE"]: true
|
|
4572
5079
|
}
|
|
4573
5080
|
}
|
|
4574
5081
|
}
|
|
@@ -4588,6 +5095,308 @@ let InvocationMode = /* @__PURE__ */ function(InvocationMode) {
|
|
|
4588
5095
|
return InvocationMode;
|
|
4589
5096
|
}({});
|
|
4590
5097
|
//#endregion
|
|
5098
|
+
//#region src/types/schedules.ts
|
|
5099
|
+
/** Cadences the dialog builds from structured pickers (hour, minute, weekday). */
|
|
5100
|
+
const scheduleStructuredFrequencies = [
|
|
5101
|
+
"hourly",
|
|
5102
|
+
"daily",
|
|
5103
|
+
"weekdays",
|
|
5104
|
+
"weekly"
|
|
5105
|
+
];
|
|
5106
|
+
const scheduleFrequencies = [...scheduleStructuredFrequencies, "cron"];
|
|
5107
|
+
/** Bounds a stored expression. Generous for five fields, because each one can hold a
|
|
5108
|
+
* list: an every-minute-of-the-hour cadence spelled out runs past two hundred chars. */
|
|
5109
|
+
const SCHEDULE_CRON_MAX_LENGTH = 256;
|
|
5110
|
+
const scheduleTargets = ["new"];
|
|
5111
|
+
const structuredCadenceSchema = zod.z.object({
|
|
5112
|
+
frequency: zod.z.enum(scheduleStructuredFrequencies),
|
|
5113
|
+
hour: zod.z.number().int().min(0).max(23),
|
|
5114
|
+
minute: zod.z.number().int().min(0).max(59),
|
|
5115
|
+
daysOfWeek: zod.z.array(zod.z.number().int().min(0).max(6)).min(1).max(7).transform((days) => Array.from(new Set(days))).optional()
|
|
5116
|
+
});
|
|
5117
|
+
/**
|
|
5118
|
+
* A raw cron expression carries its own hour and minute, so it cannot share the
|
|
5119
|
+
* structured shape: there is no single `hour` for `0 9,17 * * 1-5`. Syntax is
|
|
5120
|
+
* validated server-side by croner, the same parser the engine fires from, rather
|
|
5121
|
+
* than by a regex that would accept patterns croner then rejects at fire time.
|
|
5122
|
+
*/
|
|
5123
|
+
const cronCadenceSchema = zod.z.object({
|
|
5124
|
+
frequency: zod.z.literal("cron"),
|
|
5125
|
+
expression: zod.z.string().trim().min(1).max(256)
|
|
5126
|
+
});
|
|
5127
|
+
const scheduleCadenceSchema = zod.z.discriminatedUnion("frequency", [structuredCadenceSchema, cronCadenceSchema]);
|
|
5128
|
+
const isCronCadence = (cadence) => cadence.frequency === "cron";
|
|
5129
|
+
const createSchedulePayloadSchema = zod.z.object({
|
|
5130
|
+
name: zod.z.string().trim().min(1).max(256),
|
|
5131
|
+
prompt: zod.z.string().trim().min(1).max(32e3),
|
|
5132
|
+
agent_id: zod.z.string().trim().min(1),
|
|
5133
|
+
cadence: scheduleCadenceSchema,
|
|
5134
|
+
timezone: zod.z.string().min(1),
|
|
5135
|
+
target: zod.z.enum(scheduleTargets).default("new"),
|
|
5136
|
+
file_ids: zod.z.array(zod.z.string()).max(10).transform((ids) => Array.from(new Set(ids))).optional(),
|
|
5137
|
+
/**
|
|
5138
|
+
* Chat project each run's conversation is filed under. `null` clears the scope.
|
|
5139
|
+
* Ownership is checked server-side at write time and again at every fire, so a
|
|
5140
|
+
* deleted project disables the schedule instead of silently filing runs loose.
|
|
5141
|
+
*/
|
|
5142
|
+
chatProjectId: zod.z.string().trim().min(1).nullable().optional(),
|
|
5143
|
+
enabled: zod.z.boolean().default(true),
|
|
5144
|
+
/**
|
|
5145
|
+
* Client-generated key making creation idempotent across retries. Creation commits
|
|
5146
|
+
* the row and arms it in two writes, so a failure between them leaves the client
|
|
5147
|
+
* unable to tell whether anything persisted; retrying blind can produce two recurring
|
|
5148
|
+
* schedules. A retry carrying the same key resolves to the original row instead.
|
|
5149
|
+
* REQUIRED: an optional key preserves the keyless duplicate path for any client
|
|
5150
|
+
* that omits it, which is exactly the failure the key exists to close.
|
|
5151
|
+
*/
|
|
5152
|
+
clientRequestId: zod.z.string().trim().min(1).max(128)
|
|
5153
|
+
});
|
|
5154
|
+
/** Idempotency is a property of the CREATE attempt, not of the schedule's config. */
|
|
5155
|
+
const updateSchedulePayloadSchema = createSchedulePayloadSchema.omit({ clientRequestId: true }).partial().extend({
|
|
5156
|
+
/**
|
|
5157
|
+
* The configRevision the client's edit was computed from (captured when the
|
|
5158
|
+
* dialog opened). The server fences the update on it, so a concurrent edit
|
|
5159
|
+
* from another tab answers 409 instead of being silently overwritten by a
|
|
5160
|
+
* payload rebuilt from a stale snapshot (cadence is sent whole, so the
|
|
5161
|
+
* server-side fresh-read fence alone cannot detect this).
|
|
5162
|
+
*/
|
|
5163
|
+
expectedConfigRevision: zod.z.number().int().min(0).optional() });
|
|
5164
|
+
//#endregion
|
|
5165
|
+
//#region src/cadence.ts
|
|
5166
|
+
/** Mirrors the server default when a weekly cadence omits `daysOfWeek`. */
|
|
5167
|
+
const WEEKLY_DEFAULT_DAY = 1;
|
|
5168
|
+
/**
|
|
5169
|
+
* Minute, hour, day of month, month, day of week. croner also reads a six-field form
|
|
5170
|
+
* carrying seconds and a seven-field form that pins a year, and both are refused.
|
|
5171
|
+
* Seconds would promise a precision the runtime does not keep: the engine polls on a
|
|
5172
|
+
* thirty-second tick and offsets each schedule by up to two minutes of jitter. A pinned
|
|
5173
|
+
* year makes a cadence that runs out, and every caller here treats "no next occurrence"
|
|
5174
|
+
* as a cadence it cannot read.
|
|
5175
|
+
*/
|
|
5176
|
+
const CRON_FIELD_COUNT = 5;
|
|
5177
|
+
/**
|
|
5178
|
+
* Spring-forward compresses consecutive wall-clock occurrences, so the ENFORCEABLE
|
|
5179
|
+
* minimum for day-and-longer gaps is the nominal gap minus the largest real-world
|
|
5180
|
+
* transition: two hours (Antarctica/Troll; every other zone shifts at most one).
|
|
5181
|
+
* A floor set exactly at the nominal value would otherwise admit a schedule that
|
|
5182
|
+
* genuinely violates it once a year. Hourly gaps are unaffected (the skipped hours
|
|
5183
|
+
* lengthen, never shorten, the gap between occurrences).
|
|
5184
|
+
*/
|
|
5185
|
+
const DST_COMPRESSION_MINUTES = 120;
|
|
5186
|
+
/**
|
|
5187
|
+
* Occurrences sampled when measuring a cron expression's tightest gap. The floor
|
|
5188
|
+
* exists to reject expressions that fire too OFTEN, and a dense pattern reveals
|
|
5189
|
+
* its short gap within the first few occurrences, so a small window answers the
|
|
5190
|
+
* question this guards. Known limit: this is a bounded probe, not the exhaustive
|
|
5191
|
+
* proof the structured formulas give. An expression that is sparse for the next
|
|
5192
|
+
* `CRON_PROBE_OCCURRENCES` runs and dense later would pass here and be caught by
|
|
5193
|
+
* the fire-time recheck instead.
|
|
5194
|
+
*/
|
|
5195
|
+
const CRON_PROBE_OCCURRENCES = 32;
|
|
5196
|
+
/** Enough to span four nominal gaps from an anchor two gaps before a transition,
|
|
5197
|
+
* which is what guarantees the straddling pair falls inside the window. */
|
|
5198
|
+
const TRANSITION_PROBE_OCCURRENCES = 5;
|
|
5199
|
+
/**
|
|
5200
|
+
* Compiles a cadence to the cron expression the engine fires from. Shared rather
|
|
5201
|
+
* than server-owned because the dialog previews the next runs, validates the
|
|
5202
|
+
* interval floor, and disables its own submit from these same functions: a second
|
|
5203
|
+
* client-side implementation would drift and either show run times the schedule
|
|
5204
|
+
* does not keep or accept a cadence the server then rejects.
|
|
5205
|
+
*/
|
|
5206
|
+
function cadenceToCron(cadence) {
|
|
5207
|
+
if (cadence.frequency === "cron") return cadence.expression;
|
|
5208
|
+
const { frequency, hour, minute } = cadence;
|
|
5209
|
+
if (frequency === "hourly") return `${minute} * * * *`;
|
|
5210
|
+
if (frequency === "daily") return `${minute} ${hour} * * *`;
|
|
5211
|
+
if (frequency === "weekdays") return `${minute} ${hour} * * 1-5`;
|
|
5212
|
+
return `${minute} ${hour} * * ${[...cadence.daysOfWeek?.length ? cadence.daysOfWeek : [WEEKLY_DEFAULT_DAY]].sort((a, b) => a - b).join(",")}`;
|
|
5213
|
+
}
|
|
5214
|
+
/**
|
|
5215
|
+
* Everything `cronCadenceSchema` will accept: exactly five fields, within the length
|
|
5216
|
+
* the schema stores, and actually matching at some point. croner accepts syntactically
|
|
5217
|
+
* valid patterns that can never match (`0 0 30 2 *`), and those would arm a schedule
|
|
5218
|
+
* that never fires. Validated with croner rather than a regex, because a regex would
|
|
5219
|
+
* accept patterns croner then rejects at fire time.
|
|
5220
|
+
*
|
|
5221
|
+
* A five-field expression that matches at all matches forever, which is what lets every
|
|
5222
|
+
* caller keep reading "no next occurrence" as "this cadence is unreadable".
|
|
5223
|
+
*/
|
|
5224
|
+
function isValidCronExpression(expression, timezone) {
|
|
5225
|
+
const trimmed = expression.trim();
|
|
5226
|
+
if (trimmed.length > 256) return false;
|
|
5227
|
+
if (trimmed.split(/\s+/).length !== CRON_FIELD_COUNT) return false;
|
|
5228
|
+
try {
|
|
5229
|
+
return new croner.Cron(trimmed, {
|
|
5230
|
+
timezone,
|
|
5231
|
+
paused: true
|
|
5232
|
+
}).nextRun() != null;
|
|
5233
|
+
} catch {
|
|
5234
|
+
return false;
|
|
5235
|
+
}
|
|
5236
|
+
}
|
|
5237
|
+
/**
|
|
5238
|
+
* The next occurrences the engine would fire. Server-side jitter (up to two
|
|
5239
|
+
* minutes) is deliberately not modelled: it is keyed off a schedule id that does
|
|
5240
|
+
* not exist yet at create time, and showing 9:01 for a 9:00 schedule reads as a bug.
|
|
5241
|
+
*/
|
|
5242
|
+
function nextRunInstants(cadence, timezone, count) {
|
|
5243
|
+
try {
|
|
5244
|
+
const runs = new croner.Cron(cadenceToCron(cadence), {
|
|
5245
|
+
timezone,
|
|
5246
|
+
paused: true
|
|
5247
|
+
}).nextRuns(count);
|
|
5248
|
+
return runs.filter((run, index) => index === 0 || run.getTime() !== runs[index - 1].getTime());
|
|
5249
|
+
} catch {
|
|
5250
|
+
return [];
|
|
5251
|
+
}
|
|
5252
|
+
}
|
|
5253
|
+
const MINUTE_MS = 6e4;
|
|
5254
|
+
const DAY_MS = 1440 * MINUTE_MS;
|
|
5255
|
+
/** A year and a bit, so a zone with a single yearly transition always shows one. */
|
|
5256
|
+
const TRANSITION_SEARCH_DAYS = 400;
|
|
5257
|
+
const offsetFormatters = /* @__PURE__ */ new Map();
|
|
5258
|
+
/** Minutes east of UTC in `zone` at `instant`, read back from the wall clock the
|
|
5259
|
+
* zone renders. The only way to observe a zone's offset without a tz database. */
|
|
5260
|
+
function zoneOffsetMinutes(zone, instant) {
|
|
5261
|
+
let formatter = offsetFormatters.get(zone);
|
|
5262
|
+
if (formatter == null) {
|
|
5263
|
+
formatter = new Intl.DateTimeFormat("en-US", {
|
|
5264
|
+
timeZone: zone,
|
|
5265
|
+
hourCycle: "h23",
|
|
5266
|
+
year: "numeric",
|
|
5267
|
+
month: "2-digit",
|
|
5268
|
+
day: "2-digit",
|
|
5269
|
+
hour: "2-digit",
|
|
5270
|
+
minute: "2-digit",
|
|
5271
|
+
second: "2-digit"
|
|
5272
|
+
});
|
|
5273
|
+
offsetFormatters.set(zone, formatter);
|
|
5274
|
+
}
|
|
5275
|
+
const parts = {};
|
|
5276
|
+
for (const part of formatter.formatToParts(instant)) parts[part.type] = part.value;
|
|
5277
|
+
const wallClock = Date.UTC(Number(parts.year), Number(parts.month) - 1, Number(parts.day), Number(parts.hour), Number(parts.minute), Number(parts.second));
|
|
5278
|
+
return Math.round((wallClock - instant.getTime()) / MINUTE_MS);
|
|
5279
|
+
}
|
|
5280
|
+
/** Zone transitions are asked for once per fire, and the scan below costs ~10ms.
|
|
5281
|
+
* Keyed by day because that is how far the answer stays put as the window slides,
|
|
5282
|
+
* and cleared wholesale at the cap so a long-lived worker cannot accumulate an
|
|
5283
|
+
* entry per zone per day forever. */
|
|
5284
|
+
const transitionCache = /* @__PURE__ */ new Map();
|
|
5285
|
+
const TRANSITION_CACHE_MAX = 512;
|
|
5286
|
+
/**
|
|
5287
|
+
* Every instant `zone` changes its UTC offset within the search window; empty for a
|
|
5288
|
+
* fixed-offset zone. Both directions matter and only one of them shortens anything,
|
|
5289
|
+
* so taking just the next one would usually find the harmless fall-back and miss the
|
|
5290
|
+
* spring-forward six months behind it. Bracketed a day at a time, bisected to the
|
|
5291
|
+
* minute.
|
|
5292
|
+
*/
|
|
5293
|
+
function offsetChanges(zone, from) {
|
|
5294
|
+
const day = Math.floor(from.getTime() / DAY_MS);
|
|
5295
|
+
const cacheKey = `${zone}:${day}`;
|
|
5296
|
+
const cached = transitionCache.get(cacheKey);
|
|
5297
|
+
if (cached != null) return cached;
|
|
5298
|
+
const changes = [];
|
|
5299
|
+
const start = /* @__PURE__ */ new Date((day - 1) * DAY_MS);
|
|
5300
|
+
let low = start.getTime();
|
|
5301
|
+
let baseOffset = zoneOffsetMinutes(zone, start);
|
|
5302
|
+
const end = low + TRANSITION_SEARCH_DAYS * DAY_MS;
|
|
5303
|
+
for (let probe = low + DAY_MS; probe <= end; probe += DAY_MS) {
|
|
5304
|
+
const offset = zoneOffsetMinutes(zone, new Date(probe));
|
|
5305
|
+
if (offset !== baseOffset) {
|
|
5306
|
+
let high = probe;
|
|
5307
|
+
let bracket = low;
|
|
5308
|
+
while (high - bracket > MINUTE_MS) {
|
|
5309
|
+
const mid = bracket + Math.floor((high - bracket) / 2);
|
|
5310
|
+
if (zoneOffsetMinutes(zone, new Date(mid)) === baseOffset) bracket = mid;
|
|
5311
|
+
else high = mid;
|
|
5312
|
+
}
|
|
5313
|
+
changes.push(new Date(high));
|
|
5314
|
+
baseOffset = offset;
|
|
5315
|
+
}
|
|
5316
|
+
low = probe;
|
|
5317
|
+
}
|
|
5318
|
+
if (transitionCache.size >= TRANSITION_CACHE_MAX) transitionCache.clear();
|
|
5319
|
+
transitionCache.set(cacheKey, changes);
|
|
5320
|
+
return changes;
|
|
5321
|
+
}
|
|
5322
|
+
function runsAfter(expression, from, zone, occurrences = CRON_PROBE_OCCURRENCES) {
|
|
5323
|
+
return new croner.Cron(expression, {
|
|
5324
|
+
timezone: zone,
|
|
5325
|
+
paused: true
|
|
5326
|
+
}).nextRuns(occurrences, from);
|
|
5327
|
+
}
|
|
5328
|
+
/** Tightest gap, in minutes, across `runs`; null when there is no pair to measure. */
|
|
5329
|
+
function minGapMinutes(runs) {
|
|
5330
|
+
if (runs.length < 2) return null;
|
|
5331
|
+
let minGapMs = Number.MAX_SAFE_INTEGER;
|
|
5332
|
+
for (let i = 1; i < runs.length; i++) {
|
|
5333
|
+
const gapMs = runs[i].getTime() - runs[i - 1].getTime();
|
|
5334
|
+
if (gapMs <= 0) continue;
|
|
5335
|
+
minGapMs = Math.min(minGapMs, gapMs);
|
|
5336
|
+
}
|
|
5337
|
+
if (minGapMs === Number.MAX_SAFE_INTEGER) return null;
|
|
5338
|
+
return Math.floor(minGapMs / MINUTE_MS);
|
|
5339
|
+
}
|
|
5340
|
+
function probeMinGapMinutes(expression, zone, from, occurrences = CRON_PROBE_OCCURRENCES) {
|
|
5341
|
+
return minGapMinutes(runsAfter(expression, from, zone, occurrences));
|
|
5342
|
+
}
|
|
5343
|
+
/**
|
|
5344
|
+
* Smallest gap in minutes between occurrences. Returns 0 for an unparseable or
|
|
5345
|
+
* never-matching expression so every floor rejects it, failing closed rather than
|
|
5346
|
+
* admitting an expression the engine cannot fire.
|
|
5347
|
+
*
|
|
5348
|
+
* Measured twice, and the smaller wins:
|
|
5349
|
+
*
|
|
5350
|
+
* 1. Nominal, probed in UTC, then discounted by the same worst-case DST allowance
|
|
5351
|
+
* the structured branches assume. This keeps `0 9 * * *` reporting exactly what
|
|
5352
|
+
* the Daily preset reports, so the same schedule cannot be admitted in one form
|
|
5353
|
+
* and rejected in the other.
|
|
5354
|
+
* 2. Real elapsed time in the schedule's own zone, across each of that zone's
|
|
5355
|
+
* transitions. Spring-forward compresses a gap that straddles one
|
|
5356
|
+
* (`0 0,12 * * *` in America/New_York is 11 hours that day, not 12), and step 1
|
|
5357
|
+
* only discounts gaps of a day or more, so a subdaily gap needs measuring rather
|
|
5358
|
+
* than estimating. Anchoring at the transition is what makes a bounded probe see
|
|
5359
|
+
* it at all: from today it is usually months outside any reasonable window.
|
|
5360
|
+
*/
|
|
5361
|
+
function cronIntervalMinutes(expression, timezone) {
|
|
5362
|
+
try {
|
|
5363
|
+
const now = /* @__PURE__ */ new Date();
|
|
5364
|
+
const nominal = probeMinGapMinutes(expression, "UTC", now);
|
|
5365
|
+
if (nominal == null) return 0;
|
|
5366
|
+
const estimate = nominal < 1440 ? nominal : Math.max(0, nominal - DST_COMPRESSION_MINUTES);
|
|
5367
|
+
if (timezone == null || estimate === 0) return estimate;
|
|
5368
|
+
const anchorBackMs = 2 * Math.max(nominal, 1) * MINUTE_MS;
|
|
5369
|
+
let smallest = estimate;
|
|
5370
|
+
for (const transition of offsetChanges(timezone, now)) {
|
|
5371
|
+
const measured = probeMinGapMinutes(expression, timezone, new Date(Math.max(now.getTime(), transition.getTime() - anchorBackMs)), TRANSITION_PROBE_OCCURRENCES);
|
|
5372
|
+
if (measured != null) smallest = Math.min(smallest, measured);
|
|
5373
|
+
}
|
|
5374
|
+
return smallest;
|
|
5375
|
+
} catch {
|
|
5376
|
+
return 0;
|
|
5377
|
+
}
|
|
5378
|
+
}
|
|
5379
|
+
/**
|
|
5380
|
+
* Minimum minutes between occurrences, for the admin interval floor. `timezone` is
|
|
5381
|
+
* the schedule's own; passing it lets the cron branch measure a DST-compressed gap
|
|
5382
|
+
* instead of estimating one. The structured branches are zone-independent: their
|
|
5383
|
+
* formulas already carry the worst-case allowance.
|
|
5384
|
+
*/
|
|
5385
|
+
function cadenceIntervalMinutes(cadence, timezone) {
|
|
5386
|
+
if (isCronCadence(cadence)) return cronIntervalMinutes(cadence.expression, timezone);
|
|
5387
|
+
if (cadence.frequency === "hourly") return 60;
|
|
5388
|
+
if (cadence.frequency === "daily" || cadence.frequency === "weekdays") return 1440 - DST_COMPRESSION_MINUTES;
|
|
5389
|
+
const days = cadence.daysOfWeek?.length ? Array.from(new Set(cadence.daysOfWeek)) : [WEEKLY_DEFAULT_DAY];
|
|
5390
|
+
if (days.length <= 1) return 10080 - DST_COMPRESSION_MINUTES;
|
|
5391
|
+
const sorted = [...days].sort((a, b) => a - b);
|
|
5392
|
+
let minGapDays = 7;
|
|
5393
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
5394
|
+
const gap = i + 1 < sorted.length ? sorted[i + 1] - sorted[i] : 7 - sorted[i] + sorted[0];
|
|
5395
|
+
minGapDays = Math.min(minGapDays, gap);
|
|
5396
|
+
}
|
|
5397
|
+
return minGapDays * 24 * 60 - DST_COMPRESSION_MINUTES;
|
|
5398
|
+
}
|
|
5399
|
+
//#endregion
|
|
4591
5400
|
//#region src/types/skills.ts
|
|
4592
5401
|
/**
|
|
4593
5402
|
* Shared skill validation constants — the single source of truth for name,
|
|
@@ -4620,6 +5429,171 @@ let DATE_RANGE = /* @__PURE__ */ function(DATE_RANGE) {
|
|
|
4620
5429
|
return DATE_RANGE;
|
|
4621
5430
|
}({});
|
|
4622
5431
|
//#endregion
|
|
5432
|
+
//#region src/types/insights.ts
|
|
5433
|
+
const INSIGHTS_MAX_RANGE_DAYS = 30;
|
|
5434
|
+
const INSIGHTS_SEARCH_MIN_LENGTH = 3;
|
|
5435
|
+
const INSIGHTS_SEARCH_MAX_LENGTH = 200;
|
|
5436
|
+
//#endregion
|
|
5437
|
+
//#region src/types/queuedTurns.ts
|
|
5438
|
+
const agentQueuedTurnStatuses = [
|
|
5439
|
+
"queued",
|
|
5440
|
+
"claimed",
|
|
5441
|
+
"admitted",
|
|
5442
|
+
"cancelled",
|
|
5443
|
+
"dead"
|
|
5444
|
+
];
|
|
5445
|
+
const agentQueuedTurnDurability = ["process_local", "durable"];
|
|
5446
|
+
const agentQueuedTurnFileRefSchema = zod.z.object({
|
|
5447
|
+
file_id: zod.z.string().trim().min(1),
|
|
5448
|
+
type: zod.z.string().optional(),
|
|
5449
|
+
filepath: zod.z.string().optional(),
|
|
5450
|
+
filename: zod.z.string().optional(),
|
|
5451
|
+
height: zod.z.number().optional(),
|
|
5452
|
+
width: zod.z.number().optional(),
|
|
5453
|
+
bytes: zod.z.number().nonnegative().optional()
|
|
5454
|
+
});
|
|
5455
|
+
const enqueueAgentQueuedTurnSchema = zod.z.object({
|
|
5456
|
+
conversationId: zod.z.string().trim().min(1),
|
|
5457
|
+
parentMessageId: zod.z.string().trim().min(1),
|
|
5458
|
+
clientRequestId: zod.z.string().trim().min(1).max(128),
|
|
5459
|
+
text: zod.z.string(),
|
|
5460
|
+
files: zod.z.array(agentQueuedTurnFileRefSchema).optional(),
|
|
5461
|
+
quotes: zod.z.array(zod.z.string()).optional(),
|
|
5462
|
+
manualSkills: zod.z.array(zod.z.string().trim().min(1)).optional(),
|
|
5463
|
+
priority: zod.z.boolean().optional(),
|
|
5464
|
+
expectedPredecessorCreatedAt: zod.z.number().int().nonnegative().optional()
|
|
5465
|
+
});
|
|
5466
|
+
const listAgentQueuedTurnsSchema = zod.z.object({
|
|
5467
|
+
conversationId: zod.z.string().trim().min(1),
|
|
5468
|
+
clientRequestIds: zod.z.array(zod.z.string().trim().min(1).max(128)).max(100).transform((ids) => Array.from(new Set(ids))).optional()
|
|
5469
|
+
});
|
|
5470
|
+
const cancelAgentQueuedTurnSchema = zod.z.object({ queuedTurnId: zod.z.string().trim().min(1) });
|
|
5471
|
+
const agentQueuedTurnReceiptSchema = enqueueAgentQueuedTurnSchema.extend({
|
|
5472
|
+
queuedTurnId: zod.z.string().trim().min(1),
|
|
5473
|
+
status: zod.z.enum(agentQueuedTurnStatuses),
|
|
5474
|
+
/** Effective generation boundary consumed by an admitted turn. This can
|
|
5475
|
+
* advance beyond the originally captured root as queued turns chain. */
|
|
5476
|
+
effectivePredecessorCreatedAt: zod.z.number().int().nonnegative().optional(),
|
|
5477
|
+
/** Explicitly proves that this admission consumed no predecessor boundary. */
|
|
5478
|
+
rootPredecessor: zod.z.literal(true).optional(),
|
|
5479
|
+
position: zod.z.number().int().nonnegative().optional(),
|
|
5480
|
+
/** Immutable queue sequence retained as `revision` for wire compatibility. */
|
|
5481
|
+
revision: zod.z.number().int().nonnegative(),
|
|
5482
|
+
failure: zod.z.object({
|
|
5483
|
+
code: zod.z.string().trim().min(1).max(128),
|
|
5484
|
+
message: zod.z.string().max(2048).optional()
|
|
5485
|
+
}).optional(),
|
|
5486
|
+
createdAt: zod.z.string(),
|
|
5487
|
+
updatedAt: zod.z.string()
|
|
5488
|
+
});
|
|
5489
|
+
const agentQueuedTurnCapabilitySchema = zod.z.discriminatedUnion("supported", [zod.z.object({ supported: zod.z.literal(false) }), zod.z.object({
|
|
5490
|
+
supported: zod.z.literal(true),
|
|
5491
|
+
durability: zod.z.enum(agentQueuedTurnDurability)
|
|
5492
|
+
})]);
|
|
5493
|
+
const enqueueAgentQueuedTurnResponseSchema = zod.z.object({
|
|
5494
|
+
receipt: agentQueuedTurnReceiptSchema,
|
|
5495
|
+
capability: agentQueuedTurnCapabilitySchema
|
|
5496
|
+
});
|
|
5497
|
+
const listAgentQueuedTurnsResponseSchema = zod.z.object({
|
|
5498
|
+
queuedTurns: zod.z.array(agentQueuedTurnReceiptSchema),
|
|
5499
|
+
capability: agentQueuedTurnCapabilitySchema,
|
|
5500
|
+
revision: zod.z.number().int().nonnegative()
|
|
5501
|
+
});
|
|
5502
|
+
const cancelAgentQueuedTurnResponseSchema = zod.z.object({ receipt: agentQueuedTurnReceiptSchema });
|
|
5503
|
+
//#endregion
|
|
5504
|
+
//#region src/providers.ts
|
|
5505
|
+
/** Canonical provider identity used for branding across client and server. */
|
|
5506
|
+
let ProviderId = /* @__PURE__ */ function(ProviderId) {
|
|
5507
|
+
ProviderId["openai"] = "openai";
|
|
5508
|
+
ProviderId["anthropic"] = "anthropic";
|
|
5509
|
+
ProviderId["google"] = "google";
|
|
5510
|
+
ProviderId["azure"] = "azure";
|
|
5511
|
+
ProviderId["bedrock"] = "bedrock";
|
|
5512
|
+
ProviderId["xai"] = "xai";
|
|
5513
|
+
ProviderId["moonshot"] = "moonshot";
|
|
5514
|
+
ProviderId["anyscale"] = "anyscale";
|
|
5515
|
+
ProviderId["apipie"] = "apipie";
|
|
5516
|
+
ProviderId["cohere"] = "cohere";
|
|
5517
|
+
ProviderId["deepseek"] = "deepseek";
|
|
5518
|
+
ProviderId["fireworks"] = "fireworks";
|
|
5519
|
+
ProviderId["groq"] = "groq";
|
|
5520
|
+
ProviderId["helicone"] = "helicone";
|
|
5521
|
+
ProviderId["huggingface"] = "huggingface";
|
|
5522
|
+
ProviderId["mistral"] = "mistral";
|
|
5523
|
+
ProviderId["mlx"] = "mlx";
|
|
5524
|
+
ProviderId["ollama"] = "ollama";
|
|
5525
|
+
ProviderId["openrouter"] = "openrouter";
|
|
5526
|
+
ProviderId["perplexity"] = "perplexity";
|
|
5527
|
+
ProviderId["qwen"] = "qwen";
|
|
5528
|
+
ProviderId["shuttleai"] = "shuttleai";
|
|
5529
|
+
ProviderId["together"] = "together";
|
|
5530
|
+
ProviderId["unify"] = "unify";
|
|
5531
|
+
ProviderId["vercel"] = "vercel";
|
|
5532
|
+
return ProviderId;
|
|
5533
|
+
}({});
|
|
5534
|
+
const endpointToProvider = {
|
|
5535
|
+
["openAI"]: "openai",
|
|
5536
|
+
["azureOpenAI"]: "azure",
|
|
5537
|
+
["anthropic"]: "anthropic",
|
|
5538
|
+
["google"]: "google",
|
|
5539
|
+
["bedrock"]: "bedrock"
|
|
5540
|
+
};
|
|
5541
|
+
const knownEndpointToProvider = {
|
|
5542
|
+
["anyscale"]: "anyscale",
|
|
5543
|
+
["apipie"]: "apipie",
|
|
5544
|
+
["cohere"]: "cohere",
|
|
5545
|
+
["fireworks"]: "fireworks",
|
|
5546
|
+
["deepseek"]: "deepseek",
|
|
5547
|
+
["moonshot"]: "moonshot",
|
|
5548
|
+
["groq"]: "groq",
|
|
5549
|
+
["helicone"]: "helicone",
|
|
5550
|
+
["huggingface"]: "huggingface",
|
|
5551
|
+
["mistral"]: "mistral",
|
|
5552
|
+
["mlx"]: "mlx",
|
|
5553
|
+
["ollama"]: "ollama",
|
|
5554
|
+
["openrouter"]: "openrouter",
|
|
5555
|
+
["perplexity"]: "perplexity",
|
|
5556
|
+
["shuttleai"]: "shuttleai",
|
|
5557
|
+
["together.ai"]: "together",
|
|
5558
|
+
["unify"]: "unify",
|
|
5559
|
+
["vercel"]: "vercel",
|
|
5560
|
+
["xai"]: "xai"
|
|
5561
|
+
};
|
|
5562
|
+
const providerAliases = {
|
|
5563
|
+
chatgpt: "openai",
|
|
5564
|
+
gpt: "openai",
|
|
5565
|
+
azureopenai: "azure",
|
|
5566
|
+
claude: "anthropic",
|
|
5567
|
+
gemini: "google",
|
|
5568
|
+
gemma: "google",
|
|
5569
|
+
vertex: "google",
|
|
5570
|
+
vertexai: "google",
|
|
5571
|
+
palm: "google",
|
|
5572
|
+
awsbedrock: "bedrock",
|
|
5573
|
+
grok: "xai",
|
|
5574
|
+
kimi: "moonshot",
|
|
5575
|
+
moonshotai: "moonshot",
|
|
5576
|
+
mistralai: "mistral",
|
|
5577
|
+
togetherai: "together"
|
|
5578
|
+
};
|
|
5579
|
+
const modelCatalogAliases = { ["vertexai"]: "google" };
|
|
5580
|
+
const normalize = (input) => input.toLowerCase().replace(/[\s._-]/g, "");
|
|
5581
|
+
const providerByNormalizedId = Object.values(ProviderId).reduce((acc, id) => {
|
|
5582
|
+
acc[normalize(id)] = id;
|
|
5583
|
+
return acc;
|
|
5584
|
+
}, {});
|
|
5585
|
+
/** Resolves free-form provider text to a canonical id, ignoring case and separators. */
|
|
5586
|
+
function resolveProviderId(input) {
|
|
5587
|
+
if (!input) return null;
|
|
5588
|
+
const key = normalize(input);
|
|
5589
|
+
return providerByNormalizedId[key] ?? providerAliases[key] ?? null;
|
|
5590
|
+
}
|
|
5591
|
+
/** Resolves a runtime provider to its model catalog, using a native alias only when needed. */
|
|
5592
|
+
function resolveModelCatalogKey(provider, catalogs) {
|
|
5593
|
+
const key = provider ?? "";
|
|
5594
|
+
return catalogs?.[key] != null ? key : modelCatalogAliases[key] ?? key;
|
|
5595
|
+
}
|
|
5596
|
+
//#endregion
|
|
4623
5597
|
//#region src/actions.ts
|
|
4624
5598
|
function sha1(input) {
|
|
4625
5599
|
return crypto.default.createHash("sha1").update(input).digest("hex");
|
|
@@ -4946,6 +5920,27 @@ function extractDomainFromUrl(url$2) {
|
|
|
4946
5920
|
throw new Error(`Invalid URL format: ${url$2}`);
|
|
4947
5921
|
}
|
|
4948
5922
|
}
|
|
5923
|
+
function getExplicitPort(value) {
|
|
5924
|
+
const normalizedValue = value.trim();
|
|
5925
|
+
const protocolSeparatorIndex = normalizedValue.indexOf("://");
|
|
5926
|
+
const hasProtocol = protocolSeparatorIndex !== -1;
|
|
5927
|
+
const authorityAndPath = hasProtocol ? normalizedValue.slice(protocolSeparatorIndex + 3) : normalizedValue;
|
|
5928
|
+
let port;
|
|
5929
|
+
try {
|
|
5930
|
+
const parsedUrl = new url.URL(hasProtocol ? normalizedValue : `https://${normalizedValue}`);
|
|
5931
|
+
port = parsedUrl.port;
|
|
5932
|
+
if (!port && (parsedUrl.protocol === "http:" || parsedUrl.protocol === "https:")) port = new url.URL(`${parsedUrl.protocol === "http:" ? "https:" : "http:"}//${authorityAndPath}`).port;
|
|
5933
|
+
} catch {
|
|
5934
|
+
return null;
|
|
5935
|
+
}
|
|
5936
|
+
if (!port) return null;
|
|
5937
|
+
const parsedPort = Number(port);
|
|
5938
|
+
if (!Number.isInteger(parsedPort) || parsedPort < 1 || parsedPort > 65535) throw new Error(`Invalid port in domain: ${value}`);
|
|
5939
|
+
return String(parsedPort);
|
|
5940
|
+
}
|
|
5941
|
+
function getDefaultActionPort(protocol) {
|
|
5942
|
+
return protocol === "https:" ? "443" : "80";
|
|
5943
|
+
}
|
|
4949
5944
|
/**
|
|
4950
5945
|
* Validates client domain matches OpenAPI spec server URL domain (SSRF prevention).
|
|
4951
5946
|
* @param clientProvidedDomain - Domain from client (with/without protocol)
|
|
@@ -4966,6 +5961,7 @@ function validateActionDomain(clientProvidedDomain, specServerUrl) {
|
|
|
4966
5961
|
/** Extract hostname from client domain if it's a full URL */
|
|
4967
5962
|
let clientHostname = clientProvidedDomain;
|
|
4968
5963
|
let clientHasProtocol = false;
|
|
5964
|
+
const clientExplicitPort = getExplicitPort(clientProvidedDomain);
|
|
4969
5965
|
if (clientProvidedDomain.includes("://")) {
|
|
4970
5966
|
if (!clientProvidedDomain.startsWith("http://") && !clientProvidedDomain.startsWith("https://")) return {
|
|
4971
5967
|
isValid: false,
|
|
@@ -4977,7 +5973,7 @@ function validateActionDomain(clientProvidedDomain, specServerUrl) {
|
|
|
4977
5973
|
} catch {
|
|
4978
5974
|
clientHasProtocol = false;
|
|
4979
5975
|
}
|
|
4980
|
-
}
|
|
5976
|
+
} else if (clientExplicitPort !== null) clientHostname = new url.URL(`https://${clientProvidedDomain}`).hostname;
|
|
4981
5977
|
/** Normalize IPv6 addresses by removing brackets for comparison */
|
|
4982
5978
|
const normalizedClientHostname = clientHostname.replace(/^\[(.+)\]$/, "$1");
|
|
4983
5979
|
const normalizedSpecHostname = specHostname.replace(/^\[(.+)\]$/, "$1");
|
|
@@ -4990,14 +5986,23 @@ function validateActionDomain(clientProvidedDomain, specServerUrl) {
|
|
|
4990
5986
|
const hostname = isIP(normalizedClientHostname) === 6 && !clientHostname.startsWith("[") ? `[${normalizedClientHostname}]` : clientHostname;
|
|
4991
5987
|
normalizedClientDomain = `${specUrl.protocol}//${hostname}`;
|
|
4992
5988
|
} else normalizedClientDomain = `https://${clientHostname}`;
|
|
4993
|
-
if (normalizedSpecDomain === normalizedClientDomain || !clientHasProtocol && isIPAddress && normalizedClientHostname === normalizedSpecHostname) return {
|
|
4994
|
-
isValid:
|
|
5989
|
+
if (!(normalizedSpecDomain === normalizedClientDomain || !clientHasProtocol && isIPAddress && normalizedClientHostname === normalizedSpecHostname)) return {
|
|
5990
|
+
isValid: false,
|
|
5991
|
+
message: `Domain mismatch: Client provided '${clientProvidedDomain}', but spec uses '${specHostname}'`,
|
|
4995
5992
|
normalizedSpecDomain,
|
|
4996
5993
|
normalizedClientDomain
|
|
4997
5994
|
};
|
|
5995
|
+
if (clientExplicitPort !== null) {
|
|
5996
|
+
const specEffectivePort = specUrl.port || getDefaultActionPort(specUrl.protocol);
|
|
5997
|
+
if (clientExplicitPort !== specEffectivePort) return {
|
|
5998
|
+
isValid: false,
|
|
5999
|
+
message: `Port mismatch: Client provided '${clientProvidedDomain}', but spec uses effective port '${specEffectivePort}'`,
|
|
6000
|
+
normalizedSpecDomain,
|
|
6001
|
+
normalizedClientDomain
|
|
6002
|
+
};
|
|
6003
|
+
}
|
|
4998
6004
|
return {
|
|
4999
|
-
isValid:
|
|
5000
|
-
message: `Domain mismatch: Client provided '${clientProvidedDomain}', but spec uses '${specHostname}'`,
|
|
6005
|
+
isValid: true,
|
|
5001
6006
|
normalizedSpecDomain,
|
|
5002
6007
|
normalizedClientDomain
|
|
5003
6008
|
};
|
|
@@ -5072,11 +6077,13 @@ function getUserTimezone() {
|
|
|
5072
6077
|
}
|
|
5073
6078
|
}
|
|
5074
6079
|
function createPayload(submission) {
|
|
5075
|
-
const { isEdited, addedConvo, userMessage, isContinued, isTemporary, isRegenerate, conversation, editedContent, ephemeralAgent, endpointOption, manualSkills } = submission;
|
|
6080
|
+
const { isEdited, addedConvo, userMessage, isContinued, isTemporary, isRegenerate, conversation, editedContent, ephemeralAgent, endpointOption, manualSkills, clientRequestId, recoverySteerId, expectedPredecessorCreatedAt } = submission;
|
|
5076
6081
|
const { conversationId } = require_data_service.tConvoUpdateSchema.parse(conversation);
|
|
5077
6082
|
const { endpoint: _e, endpointType } = endpointOption;
|
|
5078
6083
|
const endpoint = _e;
|
|
5079
|
-
|
|
6084
|
+
/** Custom endpoint names are user-defined and may contain `/`, which would
|
|
6085
|
+
* otherwise split into extra path segments and miss the `/:endpoint` route. */
|
|
6086
|
+
let server = `${require_data_service.EndpointURLs["agents"]}/${encodeURIComponent(endpoint)}`;
|
|
5080
6087
|
if (require_data_service.isAssistantsEndpoint(endpoint)) server = require_data_service.EndpointURLs[endpointType ?? endpoint] + (isEdited ? "/modify" : "");
|
|
5081
6088
|
const payload = {
|
|
5082
6089
|
...userMessage,
|
|
@@ -5090,7 +6097,10 @@ function createPayload(submission) {
|
|
|
5090
6097
|
isContinued: !!(isEdited && isContinued),
|
|
5091
6098
|
ephemeralAgent: require_data_service.isAssistantsEndpoint(endpoint) ? void 0 : ephemeralAgent,
|
|
5092
6099
|
manualSkills: require_data_service.isAssistantsEndpoint(endpoint) ? void 0 : manualSkills,
|
|
5093
|
-
timezone: getUserTimezone()
|
|
6100
|
+
timezone: getUserTimezone(),
|
|
6101
|
+
clientRequestId,
|
|
6102
|
+
recoverySteerId,
|
|
6103
|
+
expectedPredecessorCreatedAt
|
|
5094
6104
|
};
|
|
5095
6105
|
return {
|
|
5096
6106
|
server,
|
|
@@ -5149,28 +6159,6 @@ const baseDefinitions = {
|
|
|
5149
6159
|
optionType: "conversation",
|
|
5150
6160
|
minTags: 0,
|
|
5151
6161
|
maxTags: 4
|
|
5152
|
-
},
|
|
5153
|
-
imageDetail: {
|
|
5154
|
-
key: "imageDetail",
|
|
5155
|
-
label: "com_endpoint_plug_image_detail",
|
|
5156
|
-
labelCode: true,
|
|
5157
|
-
description: "com_endpoint_openai_detail",
|
|
5158
|
-
descriptionCode: true,
|
|
5159
|
-
type: "enum",
|
|
5160
|
-
default: "auto",
|
|
5161
|
-
component: "slider",
|
|
5162
|
-
options: [
|
|
5163
|
-
"low",
|
|
5164
|
-
"auto",
|
|
5165
|
-
"high"
|
|
5166
|
-
],
|
|
5167
|
-
enumMappings: {
|
|
5168
|
-
["low"]: "com_ui_low",
|
|
5169
|
-
["auto"]: "com_ui_auto",
|
|
5170
|
-
["high"]: "com_ui_high"
|
|
5171
|
-
},
|
|
5172
|
-
optionType: "conversation",
|
|
5173
|
-
columnSpan: 2
|
|
5174
6162
|
}
|
|
5175
6163
|
};
|
|
5176
6164
|
const createDefinition = (base, overrides) => {
|
|
@@ -5197,7 +6185,7 @@ const librechat = {
|
|
|
5197
6185
|
labelCode: true,
|
|
5198
6186
|
type: "number",
|
|
5199
6187
|
component: "input",
|
|
5200
|
-
placeholder: "
|
|
6188
|
+
placeholder: "com_endpoint_default",
|
|
5201
6189
|
placeholderCode: true,
|
|
5202
6190
|
description: "com_endpoint_context_info",
|
|
5203
6191
|
descriptionCode: true,
|
|
@@ -5228,13 +6216,37 @@ const librechat = {
|
|
|
5228
6216
|
placeholderCode: true,
|
|
5229
6217
|
optionType: "model"
|
|
5230
6218
|
},
|
|
6219
|
+
/** Controls how LibreChat encodes image content blocks, not a provider request
|
|
6220
|
+
* parameter — so it belongs to this group and is stripped from model options. */
|
|
6221
|
+
imageDetail: {
|
|
6222
|
+
key: "imageDetail",
|
|
6223
|
+
label: "com_endpoint_plug_image_detail",
|
|
6224
|
+
labelCode: true,
|
|
6225
|
+
description: "com_endpoint_openai_detail",
|
|
6226
|
+
descriptionCode: true,
|
|
6227
|
+
type: "enum",
|
|
6228
|
+
default: "auto",
|
|
6229
|
+
component: "slider",
|
|
6230
|
+
options: [
|
|
6231
|
+
"low",
|
|
6232
|
+
"auto",
|
|
6233
|
+
"high"
|
|
6234
|
+
],
|
|
6235
|
+
enumMappings: {
|
|
6236
|
+
["low"]: "com_ui_low",
|
|
6237
|
+
["auto"]: "com_ui_auto",
|
|
6238
|
+
["high"]: "com_ui_high"
|
|
6239
|
+
},
|
|
6240
|
+
optionType: "conversation",
|
|
6241
|
+
columnSpan: 2
|
|
6242
|
+
},
|
|
5231
6243
|
fileTokenLimit: {
|
|
5232
6244
|
key: "fileTokenLimit",
|
|
5233
6245
|
label: "com_ui_file_token_limit",
|
|
5234
6246
|
labelCode: true,
|
|
5235
6247
|
description: "com_ui_file_token_limit_desc",
|
|
5236
6248
|
descriptionCode: true,
|
|
5237
|
-
placeholder: "
|
|
6249
|
+
placeholder: "com_endpoint_default",
|
|
5238
6250
|
placeholderCode: true,
|
|
5239
6251
|
type: "number",
|
|
5240
6252
|
component: "input",
|
|
@@ -5306,7 +6318,7 @@ const openAIParams = {
|
|
|
5306
6318
|
component: "input",
|
|
5307
6319
|
description: "com_endpoint_openai_max_tokens",
|
|
5308
6320
|
descriptionCode: true,
|
|
5309
|
-
placeholder: "
|
|
6321
|
+
placeholder: "com_endpoint_default",
|
|
5310
6322
|
placeholderCode: true,
|
|
5311
6323
|
optionType: "model",
|
|
5312
6324
|
columnSpan: 2
|
|
@@ -5327,7 +6339,8 @@ const openAIParams = {
|
|
|
5327
6339
|
"low",
|
|
5328
6340
|
"medium",
|
|
5329
6341
|
"high",
|
|
5330
|
-
"xhigh"
|
|
6342
|
+
"xhigh",
|
|
6343
|
+
"max"
|
|
5331
6344
|
],
|
|
5332
6345
|
enumMappings: {
|
|
5333
6346
|
[""]: "com_ui_auto",
|
|
@@ -5336,7 +6349,8 @@ const openAIParams = {
|
|
|
5336
6349
|
["low"]: "com_ui_low",
|
|
5337
6350
|
["medium"]: "com_ui_medium",
|
|
5338
6351
|
["high"]: "com_ui_high",
|
|
5339
|
-
["xhigh"]: "com_ui_xhigh"
|
|
6352
|
+
["xhigh"]: "com_ui_xhigh",
|
|
6353
|
+
["max"]: "com_ui_max"
|
|
5340
6354
|
},
|
|
5341
6355
|
optionType: "model",
|
|
5342
6356
|
columnSpan: 4
|
|
@@ -5391,6 +6405,52 @@ const openAIParams = {
|
|
|
5391
6405
|
optionType: "model",
|
|
5392
6406
|
columnSpan: 4
|
|
5393
6407
|
},
|
|
6408
|
+
reasoning_mode: {
|
|
6409
|
+
key: "reasoning_mode",
|
|
6410
|
+
label: "com_endpoint_reasoning_mode",
|
|
6411
|
+
labelCode: true,
|
|
6412
|
+
description: "com_endpoint_openai_reasoning_mode",
|
|
6413
|
+
descriptionCode: true,
|
|
6414
|
+
type: "enum",
|
|
6415
|
+
default: "",
|
|
6416
|
+
component: "slider",
|
|
6417
|
+
options: [
|
|
6418
|
+
"",
|
|
6419
|
+
"standard",
|
|
6420
|
+
"pro"
|
|
6421
|
+
],
|
|
6422
|
+
enumMappings: {
|
|
6423
|
+
[""]: "com_ui_unset",
|
|
6424
|
+
["standard"]: "com_ui_standard",
|
|
6425
|
+
["pro"]: "com_ui_pro"
|
|
6426
|
+
},
|
|
6427
|
+
optionType: "model",
|
|
6428
|
+
columnSpan: 4
|
|
6429
|
+
},
|
|
6430
|
+
reasoning_context: {
|
|
6431
|
+
key: "reasoning_context",
|
|
6432
|
+
label: "com_endpoint_reasoning_context",
|
|
6433
|
+
labelCode: true,
|
|
6434
|
+
description: "com_endpoint_openai_reasoning_context",
|
|
6435
|
+
descriptionCode: true,
|
|
6436
|
+
type: "enum",
|
|
6437
|
+
default: "",
|
|
6438
|
+
component: "slider",
|
|
6439
|
+
options: [
|
|
6440
|
+
"",
|
|
6441
|
+
"auto",
|
|
6442
|
+
"current_turn",
|
|
6443
|
+
"all_turns"
|
|
6444
|
+
],
|
|
6445
|
+
enumMappings: {
|
|
6446
|
+
[""]: "com_ui_unset",
|
|
6447
|
+
["auto"]: "com_ui_auto",
|
|
6448
|
+
["current_turn"]: "com_ui_current_turn",
|
|
6449
|
+
["all_turns"]: "com_ui_all_turns"
|
|
6450
|
+
},
|
|
6451
|
+
optionType: "model",
|
|
6452
|
+
columnSpan: 4
|
|
6453
|
+
},
|
|
5394
6454
|
verbosity: {
|
|
5395
6455
|
key: "verbosity",
|
|
5396
6456
|
label: "com_endpoint_verbosity",
|
|
@@ -5438,7 +6498,7 @@ const anthropic = {
|
|
|
5438
6498
|
component: "input",
|
|
5439
6499
|
description: "com_endpoint_anthropic_maxoutputtokens",
|
|
5440
6500
|
descriptionCode: true,
|
|
5441
|
-
placeholder: "
|
|
6501
|
+
placeholder: "com_endpoint_default",
|
|
5442
6502
|
placeholderCode: true,
|
|
5443
6503
|
range: {
|
|
5444
6504
|
min: require_data_service.anthropicSettings.maxOutputTokens.min,
|
|
@@ -5626,7 +6686,7 @@ const bedrock = {
|
|
|
5626
6686
|
component: "input",
|
|
5627
6687
|
description: "com_endpoint_anthropic_maxoutputtokens",
|
|
5628
6688
|
descriptionCode: true,
|
|
5629
|
-
placeholder: "
|
|
6689
|
+
placeholder: "com_endpoint_default",
|
|
5630
6690
|
placeholderCode: true,
|
|
5631
6691
|
optionType: "model",
|
|
5632
6692
|
columnSpan: 2
|
|
@@ -5758,6 +6818,14 @@ const meta = {
|
|
|
5758
6818
|
})
|
|
5759
6819
|
};
|
|
5760
6820
|
const google = {
|
|
6821
|
+
/** Bounds the hand-rolled editor enforced through InputNumber, and they stay
|
|
6822
|
+
* scoped to this endpoint: the shared definition is rendered by every other
|
|
6823
|
+
* endpoint, whose own context windows may fall outside them. */
|
|
6824
|
+
maxContextTokens: createDefinition(librechat.maxContextTokens, { range: {
|
|
6825
|
+
min: require_data_service.googleSettings.maxContextTokens.min,
|
|
6826
|
+
max: require_data_service.googleSettings.maxContextTokens.max,
|
|
6827
|
+
step: require_data_service.googleSettings.maxContextTokens.step
|
|
6828
|
+
} }),
|
|
5761
6829
|
temperature: createDefinition(baseDefinitions.temperature, {
|
|
5762
6830
|
default: require_data_service.googleSettings.temperature.default,
|
|
5763
6831
|
range: {
|
|
@@ -5799,7 +6867,7 @@ const google = {
|
|
|
5799
6867
|
component: "input",
|
|
5800
6868
|
description: "com_endpoint_google_maxoutputtokens",
|
|
5801
6869
|
descriptionCode: true,
|
|
5802
|
-
placeholder: "
|
|
6870
|
+
placeholder: "com_endpoint_default",
|
|
5803
6871
|
placeholderCode: true,
|
|
5804
6872
|
default: require_data_service.googleSettings.maxOutputTokens.default,
|
|
5805
6873
|
range: {
|
|
@@ -5897,7 +6965,7 @@ const google = {
|
|
|
5897
6965
|
const googleConfig = [
|
|
5898
6966
|
librechat.modelLabel,
|
|
5899
6967
|
librechat.promptPrefix,
|
|
5900
|
-
|
|
6968
|
+
google.maxContextTokens,
|
|
5901
6969
|
google.maxOutputTokens,
|
|
5902
6970
|
google.temperature,
|
|
5903
6971
|
google.topP,
|
|
@@ -5916,7 +6984,7 @@ const googleCol1 = [
|
|
|
5916
6984
|
librechat.promptPrefix
|
|
5917
6985
|
];
|
|
5918
6986
|
const googleCol2 = [
|
|
5919
|
-
|
|
6987
|
+
google.maxContextTokens,
|
|
5920
6988
|
google.maxOutputTokens,
|
|
5921
6989
|
google.temperature,
|
|
5922
6990
|
google.topP,
|
|
@@ -5940,11 +7008,13 @@ const openAI = [
|
|
|
5940
7008
|
openAIParams.presence_penalty,
|
|
5941
7009
|
baseDefinitions.stop,
|
|
5942
7010
|
librechat.resendFiles,
|
|
5943
|
-
|
|
7011
|
+
librechat.imageDetail,
|
|
5944
7012
|
openAIParams.web_search,
|
|
5945
7013
|
openAIParams.reasoning_effort,
|
|
5946
7014
|
openAIParams.useResponsesApi,
|
|
5947
7015
|
openAIParams.reasoning_summary,
|
|
7016
|
+
openAIParams.reasoning_mode,
|
|
7017
|
+
openAIParams.reasoning_context,
|
|
5948
7018
|
openAIParams.verbosity,
|
|
5949
7019
|
openAIParams.disableStreaming,
|
|
5950
7020
|
librechat.fileTokenLimit
|
|
@@ -5968,9 +7038,11 @@ const openAICol2 = [
|
|
|
5968
7038
|
openAIParams.presence_penalty,
|
|
5969
7039
|
baseDefinitions.stop,
|
|
5970
7040
|
librechat.resendFiles,
|
|
5971
|
-
|
|
7041
|
+
librechat.imageDetail,
|
|
5972
7042
|
openAIParams.reasoning_effort,
|
|
5973
7043
|
openAIParams.reasoning_summary,
|
|
7044
|
+
openAIParams.reasoning_mode,
|
|
7045
|
+
openAIParams.reasoning_context,
|
|
5974
7046
|
openAIParams.verbosity,
|
|
5975
7047
|
openAIParams.useResponsesApi,
|
|
5976
7048
|
openAIParams.web_search,
|
|
@@ -6273,13 +7345,71 @@ const agentParamSettings = Object.entries(presetSettings).reduce((acc, [key, val
|
|
|
6273
7345
|
* Resolves model-aware defaults for a settings configuration before rendering.
|
|
6274
7346
|
* Google's `maxOutputTokens` default depends on the selected Gemini model so that
|
|
6275
7347
|
* current models (2.5 and 3+) surface their 64K output limit instead of the legacy 8K value.
|
|
7348
|
+
* Anthropic prompt-cache controls are only surfaced for models that support them.
|
|
6276
7349
|
*/
|
|
6277
7350
|
function applyModelAwareDefaults(settings, endpoint, model) {
|
|
6278
|
-
if (
|
|
6279
|
-
|
|
6280
|
-
|
|
6281
|
-
|
|
6282
|
-
|
|
7351
|
+
if (!model) return settings;
|
|
7352
|
+
const modelAwareSettings = endpoint === "google" ? settings.map((setting) => {
|
|
7353
|
+
if (setting.key === "maxOutputTokens") return {
|
|
7354
|
+
...setting,
|
|
7355
|
+
default: require_data_service.googleSettings.maxOutputTokens.reset(model)
|
|
7356
|
+
};
|
|
7357
|
+
/** The shared thinking budget range is model-agnostic, so it caps Pro below
|
|
7358
|
+
* its real ceiling and accepts Flash values the provider rejects. The
|
|
7359
|
+
* maximum and the positive floor move together. `range.min` stays -1 so
|
|
7360
|
+
* the "decide automatically" sentinel remains typeable. */
|
|
7361
|
+
if (setting.key === "thinkingBudget" && setting.range != null) {
|
|
7362
|
+
const bounds = require_data_service.getGoogleThinkingBudgetBounds(model);
|
|
7363
|
+
if (bounds != null) return {
|
|
7364
|
+
...setting,
|
|
7365
|
+
range: {
|
|
7366
|
+
...setting.range,
|
|
7367
|
+
max: bounds.max,
|
|
7368
|
+
positiveMin: bounds.min,
|
|
7369
|
+
modelSpecific: true
|
|
7370
|
+
}
|
|
7371
|
+
};
|
|
7372
|
+
}
|
|
7373
|
+
return setting;
|
|
7374
|
+
}) : settings;
|
|
7375
|
+
if (endpoint !== "anthropic" || supportsPromptCache(model)) return modelAwareSettings;
|
|
7376
|
+
return modelAwareSettings.filter((setting) => setting.key !== "promptCache" && setting.key !== "promptCacheTtl");
|
|
7377
|
+
}
|
|
7378
|
+
//#endregion
|
|
7379
|
+
//#region src/agentToolOptions.ts
|
|
7380
|
+
const actionDomainSeparatorRegex = /* @__PURE__ */ new RegExp("---", "g");
|
|
7381
|
+
/**
|
|
7382
|
+
* Collapses the encoded-domain suffix of an action tool name to the shape used
|
|
7383
|
+
* by runtime tool definitions. The operation id is deliberately preserved.
|
|
7384
|
+
*/
|
|
7385
|
+
function normalizeActionToolName(toolName) {
|
|
7386
|
+
if (!require_data_service.isActionTool(toolName)) return toolName;
|
|
7387
|
+
const prefixEnd = toolName.lastIndexOf(require_data_service.actionDelimiter) + require_data_service.actionDelimiter.length;
|
|
7388
|
+
const encodedDomain = toolName.slice(prefixEnd);
|
|
7389
|
+
return toolName.slice(0, prefixEnd) + encodedDomain.replace(actionDomainSeparatorRegex, "_");
|
|
7390
|
+
}
|
|
7391
|
+
/**
|
|
7392
|
+
* Removes Code Interpreter as an allowed caller without mutating the input.
|
|
7393
|
+
* Tool entries and unrelated options are preserved; an empty entry is removed.
|
|
7394
|
+
*/
|
|
7395
|
+
function removeCodeExecutionCaller(toolOptions) {
|
|
7396
|
+
if (toolOptions == null) return toolOptions;
|
|
7397
|
+
const normalized = {};
|
|
7398
|
+
for (const [toolName, options] of Object.entries(toolOptions)) {
|
|
7399
|
+
const callers = options.allowed_callers;
|
|
7400
|
+
if (callers?.includes("code_execution") !== true) {
|
|
7401
|
+
normalized[toolName] = options;
|
|
7402
|
+
continue;
|
|
7403
|
+
}
|
|
7404
|
+
const allowedCallers = callers.filter((caller) => caller !== "code_execution");
|
|
7405
|
+
const { allowed_callers: _removed, ...remainingOptions } = options;
|
|
7406
|
+
const nextOptions = allowedCallers.length > 0 ? {
|
|
7407
|
+
...remainingOptions,
|
|
7408
|
+
allowed_callers: allowedCallers
|
|
7409
|
+
} : remainingOptions;
|
|
7410
|
+
if (Object.keys(nextOptions).length > 0) normalized[toolName] = nextOptions;
|
|
7411
|
+
}
|
|
7412
|
+
return normalized;
|
|
6283
7413
|
}
|
|
6284
7414
|
//#endregion
|
|
6285
7415
|
//#region src/codeEnvRef.ts
|
|
@@ -6306,12 +7436,42 @@ const CODE_ENV_KINDS = [
|
|
|
6306
7436
|
"agent",
|
|
6307
7437
|
"user"
|
|
6308
7438
|
];
|
|
7439
|
+
function getCodeEnvRefForProfile(refs, routeKey) {
|
|
7440
|
+
const profileRef = refs?.codeEnvRefs?.[routeKey];
|
|
7441
|
+
if (profileRef) return profileRef;
|
|
7442
|
+
const legacyRef = refs?.codeEnvRef;
|
|
7443
|
+
if (legacyRef && (legacyRef.executionRouteKey ?? legacyRef.executionProfile ?? "default") === routeKey) return legacyRef;
|
|
7444
|
+
}
|
|
7445
|
+
/** Adds one profile pointer without discarding the other profile's storage object. */
|
|
7446
|
+
function mergeCodeEnvRef(refs, ref) {
|
|
7447
|
+
const codeEnvRefs = { ...refs?.codeEnvRefs };
|
|
7448
|
+
const legacyRef = refs?.codeEnvRef;
|
|
7449
|
+
if (legacyRef) codeEnvRefs[legacyRef.executionRouteKey ?? legacyRef.executionProfile ?? "default"] ??= legacyRef;
|
|
7450
|
+
const routeKey = ref.executionRouteKey ?? ref.executionProfile ?? "default";
|
|
7451
|
+
codeEnvRefs[routeKey] = ref;
|
|
7452
|
+
return {
|
|
7453
|
+
codeEnvRef: codeEnvRefs.default ?? codeEnvRefs.stateful ?? ref,
|
|
7454
|
+
codeEnvRefs
|
|
7455
|
+
};
|
|
7456
|
+
}
|
|
7457
|
+
/** Enumerates every deployment-local pointer, including legacy single-pointer records. */
|
|
7458
|
+
function getCodeEnvRefs(refs) {
|
|
7459
|
+
const merged = { ...refs?.codeEnvRefs };
|
|
7460
|
+
const legacyRef = refs?.codeEnvRef;
|
|
7461
|
+
if (legacyRef) merged[legacyRef.executionRouteKey ?? legacyRef.executionProfile ?? "default"] ??= legacyRef;
|
|
7462
|
+
return Object.entries(merged).flatMap(([routeKey, ref]) => ref ? [[routeKey, ref]] : []);
|
|
7463
|
+
}
|
|
6309
7464
|
//#endregion
|
|
7465
|
+
exports.ACTION_METADATA_FILTER_FIELDS = require_data_service.ACTION_METADATA_FILTER_FIELDS;
|
|
7466
|
+
exports.AGENT_INSTRUCTION_FILTER_FIELDS = require_data_service.AGENT_INSTRUCTION_FILTER_FIELDS;
|
|
7467
|
+
exports.AUTH_USER_DOC_BY_ID_PREFIX = require_data_service.AUTH_USER_DOC_BY_ID_PREFIX;
|
|
6310
7468
|
exports.AccessRoleIds = require_data_service.AccessRoleIds;
|
|
6311
7469
|
exports.ActionRequest = ActionRequest;
|
|
7470
|
+
exports.ActivityLabelEvents = ActivityLabelEvents;
|
|
6312
7471
|
exports.AgentCapabilities = require_data_service.AgentCapabilities;
|
|
6313
7472
|
exports.AnnotationTypes = require_data_service.AnnotationTypes;
|
|
6314
7473
|
exports.AnthropicEffort = require_data_service.AnthropicEffort;
|
|
7474
|
+
exports.ApprovalEvents = ApprovalEvents;
|
|
6315
7475
|
exports.ArtifactModes = ArtifactModes;
|
|
6316
7476
|
exports.AssistantStreamEvents = require_data_service.AssistantStreamEvents;
|
|
6317
7477
|
exports.AuthKeys = require_data_service.AuthKeys;
|
|
@@ -6319,11 +7479,14 @@ exports.AuthType = require_data_service.AuthType;
|
|
|
6319
7479
|
exports.AuthTypeEnum = require_data_service.AuthTypeEnum;
|
|
6320
7480
|
exports.AuthorizationTypeEnum = require_data_service.AuthorizationTypeEnum;
|
|
6321
7481
|
exports.BASE_ONLY_CONFIG_SECTIONS = require_data_service.BASE_ONLY_CONFIG_SECTIONS;
|
|
7482
|
+
exports.BASE_PRINCIPAL_CONFIG_SECTIONS = require_data_service.BASE_PRINCIPAL_CONFIG_SECTIONS;
|
|
6322
7483
|
exports.BEDROCK_FINE_GRAINED_TOOL_STREAMING_BETA = BEDROCK_FINE_GRAINED_TOOL_STREAMING_BETA;
|
|
6323
7484
|
exports.BEDROCK_OUTPUT_128K_BETA = BEDROCK_OUTPUT_128K_BETA;
|
|
6324
7485
|
exports.BedrockProviders = require_data_service.BedrockProviders;
|
|
6325
7486
|
exports.BedrockReasoningConfig = require_data_service.BedrockReasoningConfig;
|
|
6326
7487
|
exports.CODE_ENV_KINDS = CODE_ENV_KINDS;
|
|
7488
|
+
exports.CONVERSATION_STARTER_FILTER_FIELDS = require_data_service.CONVERSATION_STARTER_FILTER_FIELDS;
|
|
7489
|
+
exports.CONVERSATION_TITLE_FILTER_FIELDS = require_data_service.CONVERSATION_TITLE_FILTER_FIELDS;
|
|
6327
7490
|
exports.CacheKeys = require_data_service.CacheKeys;
|
|
6328
7491
|
exports.Capabilities = require_data_service.Capabilities;
|
|
6329
7492
|
exports.CohereConstants = require_data_service.CohereConstants;
|
|
@@ -6338,15 +7501,22 @@ exports.EModelEndpoint = require_data_service.EModelEndpoint;
|
|
|
6338
7501
|
exports.EToolResources = require_data_service.EToolResources;
|
|
6339
7502
|
exports.EndpointURLs = require_data_service.EndpointURLs;
|
|
6340
7503
|
exports.ErrorTypes = require_data_service.ErrorTypes;
|
|
7504
|
+
exports.FEEDBACK_FILTER_FIELDS = require_data_service.FEEDBACK_FILTER_FIELDS;
|
|
6341
7505
|
exports.FEEDBACK_RATINGS = require_data_service.FEEDBACK_RATINGS;
|
|
6342
7506
|
exports.FEEDBACK_REASON_KEYS = require_data_service.FEEDBACK_REASON_KEYS;
|
|
6343
7507
|
exports.FEEDBACK_TAGS = require_data_service.FEEDBACK_TAGS;
|
|
7508
|
+
exports.FILE_FILTER_FIELDS = require_data_service.FILE_FILTER_FIELDS;
|
|
7509
|
+
exports.FILTER_PII_STARTER_PATTERNS = require_data_service.FILTER_PII_STARTER_PATTERNS;
|
|
6344
7510
|
exports.FetchTokenConfig = require_data_service.FetchTokenConfig;
|
|
6345
7511
|
exports.FileContext = require_data_service.FileContext;
|
|
6346
7512
|
exports.FilePurpose = require_data_service.FilePurpose;
|
|
6347
7513
|
exports.FileSources = require_data_service.FileSources;
|
|
6348
7514
|
exports.ForkOptions = require_data_service.ForkOptions;
|
|
6349
7515
|
exports.FunctionSignature = FunctionSignature;
|
|
7516
|
+
exports.HITL_MESSAGE_FILTER_FIELDS = require_data_service.HITL_MESSAGE_FILTER_FIELDS;
|
|
7517
|
+
exports.INSIGHTS_MAX_RANGE_DAYS = INSIGHTS_MAX_RANGE_DAYS;
|
|
7518
|
+
exports.INSIGHTS_SEARCH_MAX_LENGTH = INSIGHTS_SEARCH_MAX_LENGTH;
|
|
7519
|
+
exports.INSIGHTS_SEARCH_MIN_LENGTH = INSIGHTS_SEARCH_MIN_LENGTH;
|
|
6350
7520
|
exports.INTERFACE_PERMISSION_FIELDS = INTERFACE_PERMISSION_FIELDS;
|
|
6351
7521
|
exports.ImageDetail = require_data_service.ImageDetail;
|
|
6352
7522
|
exports.ImageDetailCost = require_data_service.ImageDetailCost;
|
|
@@ -6355,31 +7525,55 @@ exports.InfiniteCollections = require_data_service.InfiniteCollections;
|
|
|
6355
7525
|
exports.InvocationMode = InvocationMode;
|
|
6356
7526
|
exports.KnownEndpoints = require_data_service.KnownEndpoints;
|
|
6357
7527
|
exports.LocalStorageKeys = require_data_service.LocalStorageKeys;
|
|
7528
|
+
exports.MAX_CHAT_PROJECT_DESCRIPTION_LENGTH = require_data_service.MAX_CHAT_PROJECT_DESCRIPTION_LENGTH;
|
|
7529
|
+
exports.MAX_CHAT_PROJECT_NAME_LENGTH = require_data_service.MAX_CHAT_PROJECT_NAME_LENGTH;
|
|
7530
|
+
exports.MAX_GRAPH_SUBAGENT_MEMBERS = require_data_service.MAX_GRAPH_SUBAGENT_MEMBERS;
|
|
7531
|
+
exports.MAX_PII_CUSTOM_PATTERNS_TOTAL = require_data_service.MAX_PII_CUSTOM_PATTERNS_TOTAL;
|
|
7532
|
+
exports.MAX_PII_CUSTOM_REGEX_CHARACTERS = require_data_service.MAX_PII_CUSTOM_REGEX_CHARACTERS;
|
|
7533
|
+
exports.MAX_PII_CUSTOM_REGEX_INSTRUCTIONS = require_data_service.MAX_PII_CUSTOM_REGEX_INSTRUCTIONS;
|
|
7534
|
+
exports.MAX_PII_PATTERNS_PER_SOURCE = require_data_service.MAX_PII_PATTERNS_PER_SOURCE;
|
|
7535
|
+
exports.MAX_PII_PATTERN_ID_LENGTH = require_data_service.MAX_PII_PATTERN_ID_LENGTH;
|
|
7536
|
+
exports.MAX_PII_PATTERN_LABEL_LENGTH = require_data_service.MAX_PII_PATTERN_LABEL_LENGTH;
|
|
7537
|
+
exports.MAX_PII_PATTERN_LENGTH = require_data_service.MAX_PII_PATTERN_LENGTH;
|
|
6358
7538
|
exports.MAX_SUBAGENTS = require_data_service.MAX_SUBAGENTS;
|
|
7539
|
+
exports.MAX_SUBAGENTS_CEILING = require_data_service.MAX_SUBAGENTS_CEILING;
|
|
6359
7540
|
exports.MAX_SUBAGENT_DEPTH = require_data_service.MAX_SUBAGENT_DEPTH;
|
|
6360
7541
|
exports.MAX_SUBAGENT_GRAPH_NODES = require_data_service.MAX_SUBAGENT_GRAPH_NODES;
|
|
6361
7542
|
exports.MAX_SUBAGENT_RUN_CONFIGS = require_data_service.MAX_SUBAGENT_RUN_CONFIGS;
|
|
6362
7543
|
exports.MCPOptionsSchema = require_data_service.MCPOptionsSchema;
|
|
6363
7544
|
exports.MCPServerUserInputSchema = require_data_service.MCPServerUserInputSchema;
|
|
6364
7545
|
exports.MCPServersSchema = require_data_service.MCPServersSchema;
|
|
7546
|
+
exports.MCP_SERVER_TITLE_ERROR = require_data_service.MCP_SERVER_TITLE_ERROR;
|
|
7547
|
+
exports.MCP_SERVER_TITLE_PATTERN = require_data_service.MCP_SERVER_TITLE_PATTERN;
|
|
6365
7548
|
exports.MCP_USER_INPUT_FIELDS = require_data_service.MCP_USER_INPUT_FIELDS;
|
|
7549
|
+
exports.MEMORY_FILTER_FIELDS = require_data_service.MEMORY_FILTER_FIELDS;
|
|
7550
|
+
exports.MESSAGE_FILTER_FIELDS = require_data_service.MESSAGE_FILTER_FIELDS;
|
|
7551
|
+
exports.MIN_REPORTABLE_RUN_STEP_DURATION_MS = MIN_REPORTABLE_RUN_STEP_DURATION_MS;
|
|
7552
|
+
exports.MODEL_PARAMETER_FILTER_FIELDS = require_data_service.MODEL_PARAMETER_FILTER_FIELDS;
|
|
6366
7553
|
exports.MYTHOS_CLASS_FAMILIES = require_data_service.MYTHOS_CLASS_FAMILIES;
|
|
7554
|
+
exports.MemoryScope = require_data_service.MemoryScope;
|
|
6367
7555
|
exports.MessageContentTypes = require_data_service.MessageContentTypes;
|
|
6368
7556
|
exports.MutationKeys = require_data_service.MutationKeys;
|
|
6369
7557
|
exports.OCRStrategy = require_data_service.OCRStrategy;
|
|
6370
7558
|
exports.OptionTypes = require_data_service.OptionTypes;
|
|
6371
7559
|
exports.PERMISSION_SUB_KEYS = PERMISSION_SUB_KEYS;
|
|
6372
7560
|
exports.PERMISSION_TYPE_INTERFACE_FIELDS = PERMISSION_TYPE_INTERFACE_FIELDS;
|
|
7561
|
+
exports.PROMPT_FILTER_FIELDS = require_data_service.PROMPT_FILTER_FIELDS;
|
|
6373
7562
|
exports.PermissionBits = require_data_service.PermissionBits;
|
|
6374
7563
|
exports.PermissionTypes = PermissionTypes;
|
|
6375
7564
|
exports.Permissions = Permissions;
|
|
6376
7565
|
exports.PrincipalModel = require_data_service.PrincipalModel;
|
|
6377
7566
|
exports.PrincipalType = require_data_service.PrincipalType;
|
|
7567
|
+
exports.ProviderId = ProviderId;
|
|
6378
7568
|
exports.Providers = require_data_service.Providers;
|
|
6379
7569
|
exports.QueryKeys = require_data_service.QueryKeys;
|
|
6380
7570
|
exports.REFILL_INTERVAL_UNITS = require_data_service.REFILL_INTERVAL_UNITS;
|
|
7571
|
+
exports.RUNTIME_CONFIG_INTERFACE_FIELDS = RUNTIME_CONFIG_INTERFACE_FIELDS;
|
|
6381
7572
|
exports.RateLimitPrefix = require_data_service.RateLimitPrefix;
|
|
7573
|
+
exports.ReasoningContext = require_data_service.ReasoningContext;
|
|
6382
7574
|
exports.ReasoningEffort = require_data_service.ReasoningEffort;
|
|
7575
|
+
exports.ReasoningLabelEvents = ReasoningLabelEvents;
|
|
7576
|
+
exports.ReasoningMode = require_data_service.ReasoningMode;
|
|
6383
7577
|
exports.ReasoningParameterFormat = require_data_service.ReasoningParameterFormat;
|
|
6384
7578
|
exports.ReasoningResponseKey = require_data_service.ReasoningResponseKey;
|
|
6385
7579
|
exports.ReasoningSummary = require_data_service.ReasoningSummary;
|
|
@@ -6387,11 +7581,13 @@ exports.RerankerTypes = require_data_service.RerankerTypes;
|
|
|
6387
7581
|
exports.ResourceType = require_data_service.ResourceType;
|
|
6388
7582
|
exports.RetentionMode = require_data_service.RetentionMode;
|
|
6389
7583
|
exports.RunStatus = require_data_service.RunStatus;
|
|
7584
|
+
exports.SCHEDULE_CRON_MAX_LENGTH = SCHEDULE_CRON_MAX_LENGTH;
|
|
6390
7585
|
exports.SEPARATORS = SEPARATORS;
|
|
6391
7586
|
exports.SKILL_BODY_MAX_LENGTH = SKILL_BODY_MAX_LENGTH;
|
|
6392
7587
|
exports.SKILL_DESCRIPTION_MAX_LENGTH = SKILL_DESCRIPTION_MAX_LENGTH;
|
|
6393
7588
|
exports.SKILL_DESCRIPTION_SHORT_THRESHOLD = SKILL_DESCRIPTION_SHORT_THRESHOLD;
|
|
6394
7589
|
exports.SKILL_DISPLAY_TITLE_MAX_LENGTH = SKILL_DISPLAY_TITLE_MAX_LENGTH;
|
|
7590
|
+
exports.SKILL_FILTER_FIELDS = require_data_service.SKILL_FILTER_FIELDS;
|
|
6395
7591
|
exports.SKILL_NAME_MAX_LENGTH = SKILL_NAME_MAX_LENGTH;
|
|
6396
7592
|
exports.SKILL_NAME_PATTERN = SKILL_NAME_PATTERN;
|
|
6397
7593
|
exports.SKILL_SYNC_DEFAULT_DISCOVERY_DEPTH = require_data_service.SKILL_SYNC_DEFAULT_DISCOVERY_DEPTH;
|
|
@@ -6399,6 +7595,8 @@ exports.SKILL_SYNC_MAX_DISCOVERY_DEPTH = require_data_service.SKILL_SYNC_MAX_DIS
|
|
|
6399
7595
|
exports.SKILL_SYNC_MAX_INTERVAL_MINUTES = require_data_service.SKILL_SYNC_MAX_INTERVAL_MINUTES;
|
|
6400
7596
|
exports.SKILL_SYNC_MIN_INTERVAL_MINUTES = require_data_service.SKILL_SYNC_MIN_INTERVAL_MINUTES;
|
|
6401
7597
|
exports.SSEOptionsSchema = require_data_service.SSEOptionsSchema;
|
|
7598
|
+
exports.STATEFUL_CODE_ENVIRONMENTS = require_data_service.STATEFUL_CODE_ENVIRONMENTS;
|
|
7599
|
+
exports.STORED_MESSAGE_FILTER_FIELDS = require_data_service.STORED_MESSAGE_FILTER_FIELDS;
|
|
6402
7600
|
exports.STTProviders = require_data_service.STTProviders;
|
|
6403
7601
|
exports.SafeSearchTypes = require_data_service.SafeSearchTypes;
|
|
6404
7602
|
exports.ScraperProviders = require_data_service.ScraperProviders;
|
|
@@ -6407,13 +7605,16 @@ exports.SearchProviders = require_data_service.SearchProviders;
|
|
|
6407
7605
|
exports.SettingTypes = require_data_service.SettingTypes;
|
|
6408
7606
|
exports.SettingsTabValues = require_data_service.SettingsTabValues;
|
|
6409
7607
|
exports.SettingsViews = require_data_service.SettingsViews;
|
|
7608
|
+
exports.SkillsScope = require_data_service.SkillsScope;
|
|
6410
7609
|
exports.StdioOptionsSchema = require_data_service.StdioOptionsSchema;
|
|
7610
|
+
exports.SteerEvents = SteerEvents;
|
|
6411
7611
|
exports.StepEvents = StepEvents;
|
|
6412
7612
|
exports.StepStatus = require_data_service.StepStatus;
|
|
6413
7613
|
exports.StepTypes = StepTypes;
|
|
6414
7614
|
exports.StreamableHTTPOptionsSchema = require_data_service.StreamableHTTPOptionsSchema;
|
|
6415
7615
|
exports.SystemCategories = require_data_service.SystemCategories;
|
|
6416
7616
|
exports.SystemRoles = SystemRoles;
|
|
7617
|
+
exports.TOOL_ARGUMENT_FILTER_FIELDS = require_data_service.TOOL_ARGUMENT_FILTER_FIELDS;
|
|
6417
7618
|
exports.TTSProviders = require_data_service.TTSProviders;
|
|
6418
7619
|
exports.ThinkingDisplay = require_data_service.ThinkingDisplay;
|
|
6419
7620
|
exports.ThinkingLevel = require_data_service.ThinkingLevel;
|
|
@@ -6431,8 +7632,15 @@ exports.accessRoleToPermBits = require_data_service.accessRoleToPermBits;
|
|
|
6431
7632
|
exports.accordian = accordian;
|
|
6432
7633
|
exports.actionDelimiter = require_data_service.actionDelimiter;
|
|
6433
7634
|
exports.actionDomainSeparator = require_data_service.actionDomainSeparator;
|
|
7635
|
+
exports.actionMetadataFilterFieldSchema = require_data_service.actionMetadataFilterFieldSchema;
|
|
7636
|
+
exports.agentInstructionFilterFieldSchema = require_data_service.agentInstructionFilterFieldSchema;
|
|
6434
7637
|
exports.agentParamSettings = agentParamSettings;
|
|
6435
7638
|
exports.agentPermissionsSchema = agentPermissionsSchema;
|
|
7639
|
+
exports.agentQueuedTurnCapabilitySchema = agentQueuedTurnCapabilitySchema;
|
|
7640
|
+
exports.agentQueuedTurnDurability = agentQueuedTurnDurability;
|
|
7641
|
+
exports.agentQueuedTurnFileRefSchema = agentQueuedTurnFileRefSchema;
|
|
7642
|
+
exports.agentQueuedTurnReceiptSchema = agentQueuedTurnReceiptSchema;
|
|
7643
|
+
exports.agentQueuedTurnStatuses = agentQueuedTurnStatuses;
|
|
6436
7644
|
exports.agentsBaseSchema = require_data_service.agentsBaseSchema;
|
|
6437
7645
|
exports.agentsEndpointSchema = require_data_service.agentsEndpointSchema;
|
|
6438
7646
|
exports.agentsSchema = require_data_service.agentsSchema;
|
|
@@ -6463,6 +7671,7 @@ exports.balanceSchema = require_data_service.balanceSchema;
|
|
|
6463
7671
|
exports.baseEndpointSchema = require_data_service.baseEndpointSchema;
|
|
6464
7672
|
exports.bedrockDocumentExtensions = require_data_service.bedrockDocumentExtensions;
|
|
6465
7673
|
exports.bedrockDocumentFormats = require_data_service.bedrockDocumentFormats;
|
|
7674
|
+
exports.bedrockDocumentMimeTypes = require_data_service.bedrockDocumentMimeTypes;
|
|
6466
7675
|
exports.bedrockEndpointSchema = require_data_service.bedrockEndpointSchema;
|
|
6467
7676
|
exports.bedrockGuardrailConfigSchema = require_data_service.bedrockGuardrailConfigSchema;
|
|
6468
7677
|
exports.bedrockInputParser = bedrockInputParser;
|
|
@@ -6472,15 +7681,29 @@ exports.bedrockOutputParser = bedrockOutputParser;
|
|
|
6472
7681
|
exports.bookmarkPermissionsSchema = bookmarkPermissionsSchema;
|
|
6473
7682
|
exports.breadcrumb = breadcrumb;
|
|
6474
7683
|
exports.buildLoginRedirectUrl = require_data_service.buildLoginRedirectUrl;
|
|
7684
|
+
exports.buildServerNameAliases = require_data_service.buildServerNameAliases;
|
|
6475
7685
|
exports.buildTree = buildTree;
|
|
6476
7686
|
exports.button = button;
|
|
6477
7687
|
exports.cacheSubsetProviders = require_data_service.cacheSubsetProviders;
|
|
7688
|
+
exports.cadenceIntervalMinutes = cadenceIntervalMinutes;
|
|
7689
|
+
exports.cadenceToCron = cadenceToCron;
|
|
6478
7690
|
exports.calendar = calendar;
|
|
7691
|
+
exports.cancelAgentQueuedTurnResponseSchema = cancelAgentQueuedTurnResponseSchema;
|
|
7692
|
+
exports.cancelAgentQueuedTurnSchema = cancelAgentQueuedTurnSchema;
|
|
7693
|
+
exports.capsEffortWhenThinkingDisabled = capsEffortWhenThinkingDisabled;
|
|
6479
7694
|
exports.card = card;
|
|
6480
7695
|
exports.carousel = carousel;
|
|
6481
7696
|
exports.checkOpenAIStorage = require_data_service.checkOpenAIStorage;
|
|
6482
7697
|
exports.checkbox = checkbox;
|
|
7698
|
+
exports.checkpointerSchema = require_data_service.checkpointerSchema;
|
|
7699
|
+
exports.checkpointerTypeSchema = require_data_service.checkpointerTypeSchema;
|
|
7700
|
+
exports.clampEffortForDisabledThinking = clampEffortForDisabledThinking;
|
|
7701
|
+
exports.clampOutputConfigEffort = clampOutputConfigEffort;
|
|
7702
|
+
exports.clampSettingRange = require_data_service.clampSettingRange;
|
|
6483
7703
|
exports.cloudfrontConfigSchema = require_data_service.cloudfrontConfigSchema;
|
|
7704
|
+
exports.codeEnvironmentPermissionDecisionSchema = require_data_service.codeEnvironmentPermissionDecisionSchema;
|
|
7705
|
+
exports.codeEnvironmentUserConfigSchema = require_data_service.codeEnvironmentUserConfigSchema;
|
|
7706
|
+
exports.codeEnvironmentUserSettingsSchema = require_data_service.codeEnvironmentUserSettingsSchema;
|
|
6484
7707
|
exports.codeInterpreterMimeTypes = require_data_service.codeInterpreterMimeTypes;
|
|
6485
7708
|
exports.codeInterpreterMimeTypesList = require_data_service.codeInterpreterMimeTypesList;
|
|
6486
7709
|
exports.codeTypeMapping = require_data_service.codeTypeMapping;
|
|
@@ -6492,9 +7715,13 @@ exports.compactAssistantSchema = require_data_service.compactAssistantSchema;
|
|
|
6492
7715
|
exports.compactGoogleSchema = require_data_service.compactGoogleSchema;
|
|
6493
7716
|
exports.configSchema = require_data_service.configSchema;
|
|
6494
7717
|
exports.contextPruningSchema = require_data_service.contextPruningSchema;
|
|
7718
|
+
exports.conversationStarterFilterFieldSchema = require_data_service.conversationStarterFilterFieldSchema;
|
|
7719
|
+
exports.conversationTitleFilterFieldSchema = require_data_service.conversationTitleFilterFieldSchema;
|
|
6495
7720
|
exports.convertStringsToRegex = require_data_service.convertStringsToRegex;
|
|
6496
7721
|
exports.createPayload = createPayload;
|
|
7722
|
+
exports.createSchedulePayloadSchema = createSchedulePayloadSchema;
|
|
6497
7723
|
exports.createURL = createURL;
|
|
7724
|
+
exports.cronCadenceSchema = cronCadenceSchema;
|
|
6498
7725
|
Object.defineProperty(exports, "dataService", {
|
|
6499
7726
|
enumerable: true,
|
|
6500
7727
|
get: function() {
|
|
@@ -6521,7 +7748,9 @@ exports.dropdownMenu = dropdownMenu;
|
|
|
6521
7748
|
exports.eAnthropicEffortSchema = require_data_service.eAnthropicEffortSchema;
|
|
6522
7749
|
exports.eImageDetailSchema = require_data_service.eImageDetailSchema;
|
|
6523
7750
|
exports.eModelEndpointSchema = require_data_service.eModelEndpointSchema;
|
|
7751
|
+
exports.eReasoningContextSchema = require_data_service.eReasoningContextSchema;
|
|
6524
7752
|
exports.eReasoningEffortSchema = require_data_service.eReasoningEffortSchema;
|
|
7753
|
+
exports.eReasoningModeSchema = require_data_service.eReasoningModeSchema;
|
|
6525
7754
|
exports.eReasoningParameterFormatSchema = require_data_service.eReasoningParameterFormatSchema;
|
|
6526
7755
|
exports.eReasoningResponseKeySchema = require_data_service.eReasoningResponseKeySchema;
|
|
6527
7756
|
exports.eReasoningSummarySchema = require_data_service.eReasoningSummarySchema;
|
|
@@ -6533,6 +7762,9 @@ exports.encodeEphemeralAgentId = encodeEphemeralAgentId;
|
|
|
6533
7762
|
exports.endpointFileConfigSchema = require_data_service.endpointFileConfigSchema;
|
|
6534
7763
|
exports.endpointSchema = require_data_service.endpointSchema;
|
|
6535
7764
|
exports.endpointSettings = require_data_service.endpointSettings;
|
|
7765
|
+
exports.endpointToProvider = endpointToProvider;
|
|
7766
|
+
exports.enqueueAgentQueuedTurnResponseSchema = enqueueAgentQueuedTurnResponseSchema;
|
|
7767
|
+
exports.enqueueAgentQueuedTurnSchema = enqueueAgentQueuedTurnSchema;
|
|
6536
7768
|
exports.envVarRegex = require_data_service.envVarRegex;
|
|
6537
7769
|
exports.errorsToString = errorsToString;
|
|
6538
7770
|
exports.essentialShadcnComponents = essentialShadcnComponents;
|
|
@@ -6543,32 +7775,48 @@ exports.extendedModelEndpointSchema = require_data_service.extendedModelEndpoint
|
|
|
6543
7775
|
exports.extractDomainFromUrl = extractDomainFromUrl;
|
|
6544
7776
|
exports.extractEnvVariable = require_data_service.extractEnvVariable;
|
|
6545
7777
|
exports.extractVariableName = require_data_service.extractVariableName;
|
|
7778
|
+
exports.feedbackFilterFieldSchema = require_data_service.feedbackFilterFieldSchema;
|
|
6546
7779
|
exports.feedbackRatingSchema = require_data_service.feedbackRatingSchema;
|
|
6547
7780
|
exports.feedbackSchema = require_data_service.feedbackSchema;
|
|
6548
7781
|
exports.feedbackTagKeySchema = require_data_service.feedbackTagKeySchema;
|
|
6549
7782
|
exports.fileCitationsPermissionsSchema = fileCitationsPermissionsSchema;
|
|
6550
7783
|
exports.fileConfig = require_data_service.fileConfig;
|
|
6551
7784
|
exports.fileConfigSchema = require_data_service.fileConfigSchema;
|
|
7785
|
+
exports.fileFilterFieldSchema = require_data_service.fileFilterFieldSchema;
|
|
6552
7786
|
exports.fileSearchPermissionsSchema = fileSearchPermissionsSchema;
|
|
6553
7787
|
exports.fileSourceSchema = require_data_service.fileSourceSchema;
|
|
6554
7788
|
exports.fileStorageSchema = require_data_service.fileStorageSchema;
|
|
6555
7789
|
exports.fileStrategiesSchema = require_data_service.fileStrategiesSchema;
|
|
7790
|
+
exports.filterPiiActionSchema = require_data_service.filterPiiActionSchema;
|
|
7791
|
+
exports.filterPiiCustomPatternSchema = require_data_service.filterPiiCustomPatternSchema;
|
|
7792
|
+
exports.filterPiiRegexSchema = require_data_service.filterPiiRegexSchema;
|
|
7793
|
+
exports.filterPiiStarterPatternSchema = require_data_service.filterPiiStarterPatternSchema;
|
|
7794
|
+
exports.filtersConfigSchema = require_data_service.filtersConfigSchema;
|
|
6556
7795
|
exports.findLastSeparatorIndex = findLastSeparatorIndex;
|
|
6557
7796
|
exports.fullMimeTypesList = require_data_service.fullMimeTypesList;
|
|
6558
7797
|
exports.generateDynamicSchema = require_data_service.generateDynamicSchema;
|
|
6559
7798
|
exports.generateGoogleSchema = require_data_service.generateGoogleSchema;
|
|
6560
7799
|
exports.generateOpenAISchema = require_data_service.generateOpenAISchema;
|
|
7800
|
+
exports.getCodeEnvRefForProfile = getCodeEnvRefForProfile;
|
|
7801
|
+
exports.getCodeEnvRefs = getCodeEnvRefs;
|
|
6561
7802
|
exports.getConfigDefaults = require_data_service.getConfigDefaults;
|
|
7803
|
+
exports.getConfiguredMimeAccept = require_data_service.getConfiguredMimeAccept;
|
|
6562
7804
|
exports.getDefaultParamsEndpoint = require_data_service.getDefaultParamsEndpoint;
|
|
6563
7805
|
exports.getEnabledEndpoints = getEnabledEndpoints;
|
|
6564
7806
|
exports.getEndpointField = require_data_service.getEndpointField;
|
|
6565
7807
|
exports.getEndpointFileConfig = require_data_service.getEndpointFileConfig;
|
|
7808
|
+
exports.getEphemeralSender = getEphemeralSender;
|
|
6566
7809
|
exports.getFirstDefinedValue = getFirstDefinedValue;
|
|
7810
|
+
exports.getGoogleThinkingBudgetBounds = require_data_service.getGoogleThinkingBudgetBounds;
|
|
7811
|
+
exports.getGoogleThinkingBudgetMax = require_data_service.getGoogleThinkingBudgetMax;
|
|
7812
|
+
exports.getMaxSubagents = require_data_service.getMaxSubagents;
|
|
6567
7813
|
exports.getModelKey = require_data_service.getModelKey;
|
|
6568
7814
|
exports.getNonEmptyValue = getNonEmptyValue;
|
|
7815
|
+
exports.getPiiRegexProgramSize = require_data_service.getPiiRegexProgramSize;
|
|
6569
7816
|
exports.getRefillEligibilityDate = require_data_service.getRefillEligibilityDate;
|
|
6570
7817
|
exports.getResourcePermissionsResponseSchema = require_data_service.getResourcePermissionsResponseSchema;
|
|
6571
7818
|
exports.getResponseSender = getResponseSender;
|
|
7819
|
+
exports.getRunStepDurationMs = getRunStepDurationMs;
|
|
6572
7820
|
exports.getSchemaDefaults = require_data_service.getSchemaDefaults;
|
|
6573
7821
|
exports.getSettingsKeys = require_data_service.getSettingsKeys;
|
|
6574
7822
|
exports.getTagByKey = require_data_service.getTagByKey;
|
|
@@ -6578,7 +7826,11 @@ exports.googleBaseSchema = require_data_service.googleBaseSchema;
|
|
|
6578
7826
|
exports.googleGenConfigSchema = require_data_service.googleGenConfigSchema;
|
|
6579
7827
|
exports.googleSchema = require_data_service.googleSchema;
|
|
6580
7828
|
exports.googleSettings = require_data_service.googleSettings;
|
|
7829
|
+
exports.hasActiveFiltersConfig = require_data_service.hasActiveFiltersConfig;
|
|
7830
|
+
exports.hasActivePiiFields = require_data_service.hasActivePiiFields;
|
|
7831
|
+
exports.hasActivePiiPatterns = require_data_service.hasActivePiiPatterns;
|
|
6581
7832
|
exports.hasPermissions = require_data_service.hasPermissions;
|
|
7833
|
+
exports.hasProcessMCPServerConfig = require_data_service.hasProcessMCPServerConfig;
|
|
6582
7834
|
exports.hostImageIdSuffix = require_data_service.hostImageIdSuffix;
|
|
6583
7835
|
exports.hostImageNamePrefix = require_data_service.hostImageNamePrefix;
|
|
6584
7836
|
exports.hoverCard = hoverCard;
|
|
@@ -6595,8 +7847,11 @@ exports.inputTokensIncludesCache = require_data_service.inputTokensIncludesCache
|
|
|
6595
7847
|
exports.interfaceSchema = require_data_service.interfaceSchema;
|
|
6596
7848
|
exports.isActionTool = require_data_service.isActionTool;
|
|
6597
7849
|
exports.isAgentsEndpoint = require_data_service.isAgentsEndpoint;
|
|
7850
|
+
exports.isAnthropicDocumentType = require_data_service.isAnthropicDocumentType;
|
|
7851
|
+
exports.isAnthropicTextDocumentType = require_data_service.isAnthropicTextDocumentType;
|
|
6598
7852
|
exports.isAssistantsEndpoint = require_data_service.isAssistantsEndpoint;
|
|
6599
7853
|
exports.isBedrockDocumentType = require_data_service.isBedrockDocumentType;
|
|
7854
|
+
exports.isCronCadence = isCronCadence;
|
|
6600
7855
|
exports.isDocumentSupportedProvider = require_data_service.isDocumentSupportedProvider;
|
|
6601
7856
|
exports.isEphemeralAgentId = isEphemeralAgentId;
|
|
6602
7857
|
exports.isImageVisionTool = require_data_service.isImageVisionTool;
|
|
@@ -6604,32 +7859,52 @@ exports.isMythosClassModel = require_data_service.isMythosClassModel;
|
|
|
6604
7859
|
exports.isOpenAILikeProvider = require_data_service.isOpenAILikeProvider;
|
|
6605
7860
|
exports.isParamEndpoint = require_data_service.isParamEndpoint;
|
|
6606
7861
|
exports.isPermissiveMimeConfig = require_data_service.isPermissiveMimeConfig;
|
|
7862
|
+
exports.isProcessMCPServerConfig = require_data_service.isProcessMCPServerConfig;
|
|
7863
|
+
exports.isProcessMCPServerField = require_data_service.isProcessMCPServerField;
|
|
6607
7864
|
exports.isRemoteOidcUrlAllowed = require_data_service.isRemoteOidcUrlAllowed;
|
|
7865
|
+
exports.isReportableRunStepDuration = isReportableRunStepDuration;
|
|
7866
|
+
exports.isSecureCodeEnvironmentControlURL = require_data_service.isSecureCodeEnvironmentControlURL;
|
|
6608
7867
|
exports.isSensitiveEnvVar = require_data_service.isSensitiveEnvVar;
|
|
6609
7868
|
exports.isSystemRoleName = isSystemRoleName;
|
|
7869
|
+
exports.isThinkingDisabled = isThinkingDisabled;
|
|
6610
7870
|
exports.isUUID = require_data_service.isUUID;
|
|
7871
|
+
exports.isValidCronExpression = isValidCronExpression;
|
|
7872
|
+
exports.knownEndpointToProvider = knownEndpointToProvider;
|
|
6611
7873
|
exports.label = label;
|
|
7874
|
+
exports.langfuseConfigSchema = require_data_service.langfuseConfigSchema;
|
|
6612
7875
|
exports.librechat = librechat;
|
|
7876
|
+
exports.listAgentQueuedTurnsResponseSchema = listAgentQueuedTurnsResponseSchema;
|
|
7877
|
+
exports.listAgentQueuedTurnsSchema = listAgentQueuedTurnsSchema;
|
|
6613
7878
|
exports.loginPage = require_data_service.loginPage;
|
|
6614
7879
|
exports.mapGroupToAzureConfig = mapGroupToAzureConfig;
|
|
6615
7880
|
exports.mapModelToAzureConfig = mapModelToAzureConfig;
|
|
6616
7881
|
exports.marketplacePermissionsSchema = marketplacePermissionsSchema;
|
|
7882
|
+
exports.materializeModelSpecEndpoints = require_data_service.materializeModelSpecEndpoints;
|
|
6617
7883
|
exports.mbToBytes = require_data_service.mbToBytes;
|
|
6618
7884
|
exports.mcpServersPermissionsSchema = mcpServersPermissionsSchema;
|
|
6619
7885
|
exports.megabyte = require_data_service.megabyte;
|
|
7886
|
+
exports.memoryFilterFieldSchema = require_data_service.memoryFilterFieldSchema;
|
|
6620
7887
|
exports.memoryPermissionsSchema = memoryPermissionsSchema;
|
|
6621
7888
|
exports.memorySchema = require_data_service.memorySchema;
|
|
6622
7889
|
exports.menuBar = menuBar;
|
|
7890
|
+
exports.mergeCodeEnvRef = mergeCodeEnvRef;
|
|
6623
7891
|
exports.mergeFileConfig = require_data_service.mergeFileConfig;
|
|
7892
|
+
exports.messageFilterFieldSchema = require_data_service.messageFilterFieldSchema;
|
|
6624
7893
|
exports.messageFilterPiiSchema = require_data_service.messageFilterPiiSchema;
|
|
6625
7894
|
exports.messageFilterSchema = require_data_service.messageFilterSchema;
|
|
6626
7895
|
exports.mimeTypeAliases = require_data_service.mimeTypeAliases;
|
|
6627
7896
|
exports.modelConfigSchema = require_data_service.modelConfigSchema;
|
|
7897
|
+
exports.modelParameterFilterFieldSchema = require_data_service.modelParameterFilterFieldSchema;
|
|
6628
7898
|
exports.modelSpecSubagentsSchema = require_data_service.modelSpecSubagentsSchema;
|
|
6629
7899
|
exports.modularEndpoints = require_data_service.modularEndpoints;
|
|
6630
7900
|
exports.multiConvoPermissionsSchema = multiConvoPermissionsSchema;
|
|
6631
7901
|
exports.navigationMenu = navigationMenu;
|
|
7902
|
+
exports.nextRunInstants = nextRunInstants;
|
|
7903
|
+
exports.normalizeActionToolName = normalizeActionToolName;
|
|
6632
7904
|
exports.normalizeEndpointName = require_data_service.normalizeEndpointName;
|
|
7905
|
+
exports.normalizeMCPToolKey = require_data_service.normalizeMCPToolKey;
|
|
7906
|
+
exports.normalizeSearxngEngines = require_data_service.normalizeSearxngEngines;
|
|
7907
|
+
exports.normalizeServerName = require_data_service.normalizeServerName;
|
|
6633
7908
|
exports.ocrSchema = require_data_service.ocrSchema;
|
|
6634
7909
|
exports.omitsSamplingParameters = omitsSamplingParameters;
|
|
6635
7910
|
exports.omitsThinkingByDefault = omitsThinkingByDefault;
|
|
@@ -6646,6 +7921,7 @@ exports.paramSettings = paramSettings;
|
|
|
6646
7921
|
exports.parseCompactConvo = parseCompactConvo;
|
|
6647
7922
|
exports.parseConvo = parseConvo;
|
|
6648
7923
|
exports.parseEphemeralAgentId = parseEphemeralAgentId;
|
|
7924
|
+
exports.parseLangChainErrorCode = parseLangChainErrorCode;
|
|
6649
7925
|
exports.parseTextParts = parseTextParts;
|
|
6650
7926
|
exports.peoplePickerPermissionsSchema = peoplePickerPermissionsSchema;
|
|
6651
7927
|
exports.permBitsToAccessLevel = require_data_service.permBitsToAccessLevel;
|
|
@@ -6655,6 +7931,7 @@ exports.popover = popover;
|
|
|
6655
7931
|
exports.presetSettings = presetSettings;
|
|
6656
7932
|
exports.principalSchema = require_data_service.principalSchema;
|
|
6657
7933
|
exports.progress = progress;
|
|
7934
|
+
exports.promptFilterFieldSchema = require_data_service.promptFilterFieldSchema;
|
|
6658
7935
|
exports.promptPermissionsSchema = promptPermissionsSchema;
|
|
6659
7936
|
exports.promptTokensFromUsage = promptTokensFromUsage;
|
|
6660
7937
|
exports.providerEndpointMap = require_data_service.providerEndpointMap;
|
|
@@ -6663,34 +7940,60 @@ exports.rateLimitSchema = require_data_service.rateLimitSchema;
|
|
|
6663
7940
|
exports.reconcileContextUsage = reconcileContextUsage;
|
|
6664
7941
|
exports.registerPage = require_data_service.registerPage;
|
|
6665
7942
|
exports.remoteAgentsPermissionsSchema = remoteAgentsPermissionsSchema;
|
|
7943
|
+
exports.removeCodeExecutionCaller = removeCodeExecutionCaller;
|
|
6666
7944
|
exports.removeNullishValues = require_data_service.removeNullishValues;
|
|
6667
7945
|
exports.replaceSpecialVars = replaceSpecialVars;
|
|
6668
7946
|
exports.request = require_data_service.request_default;
|
|
7947
|
+
exports.requiresExplicitThinkingDisabled = requiresExplicitThinkingDisabled;
|
|
7948
|
+
exports.resolveAgentSkillsScope = require_data_service.resolveAgentSkillsScope;
|
|
7949
|
+
exports.resolveAllowedStatefulCodeEnvironments = require_data_service.resolveAllowedStatefulCodeEnvironments;
|
|
6669
7950
|
exports.resolveEndpointType = require_data_service.resolveEndpointType;
|
|
7951
|
+
exports.resolveModelCatalogKey = resolveModelCatalogKey;
|
|
7952
|
+
exports.resolveModelSpecEndpoint = require_data_service.resolveModelSpecEndpoint;
|
|
7953
|
+
exports.resolveProviderId = resolveProviderId;
|
|
6670
7954
|
exports.resolveRef = resolveRef;
|
|
7955
|
+
exports.resolveStatefulCodeEnvironment = require_data_service.resolveStatefulCodeEnvironment;
|
|
6671
7956
|
exports.resolveThinkingDisplay = resolveThinkingDisplay;
|
|
6672
7957
|
exports.resourcePermissionsResponseSchema = require_data_service.resourcePermissionsResponseSchema;
|
|
7958
|
+
exports.retainRecentConfigSchema = require_data_service.retainRecentConfigSchema;
|
|
6673
7959
|
exports.retrievalMimeTypes = require_data_service.retrievalMimeTypes;
|
|
6674
7960
|
exports.retrievalMimeTypesList = require_data_service.retrievalMimeTypesList;
|
|
6675
7961
|
exports.roleDefaults = roleDefaults;
|
|
6676
7962
|
exports.roleSchema = roleSchema;
|
|
6677
7963
|
exports.runCodePermissionsSchema = runCodePermissionsSchema;
|
|
7964
|
+
exports.scheduleCadenceSchema = scheduleCadenceSchema;
|
|
7965
|
+
exports.scheduleFrequencies = scheduleFrequencies;
|
|
7966
|
+
exports.scheduleStructuredFrequencies = scheduleStructuredFrequencies;
|
|
7967
|
+
exports.scheduleTargets = scheduleTargets;
|
|
7968
|
+
exports.schedulesPermissionsSchema = schedulesPermissionsSchema;
|
|
6678
7969
|
exports.select = select;
|
|
6679
7970
|
exports.separator = separator;
|
|
6680
7971
|
exports.setAcceptLanguageHeader = require_data_service.setAcceptLanguageHeader;
|
|
7972
|
+
exports.setFileConfigRegexCompiler = require_data_service.setFileConfigRegexCompiler;
|
|
7973
|
+
exports.setMaxSubagents = require_data_service.setMaxSubagents;
|
|
7974
|
+
exports.setMessageFilterRegexValidator = require_data_service.setMessageFilterRegexValidator;
|
|
6681
7975
|
exports.setTokenHeader = require_data_service.setTokenHeader;
|
|
6682
7976
|
exports.sha1 = sha1;
|
|
6683
7977
|
exports.shadcnComponents = shadcnComponents;
|
|
6684
7978
|
exports.sharedFileDownload = require_data_service.sharedFileDownload;
|
|
6685
7979
|
exports.sharedLinksPermissionsSchema = sharedLinksPermissionsSchema;
|
|
6686
7980
|
exports.skeleton = skeleton;
|
|
7981
|
+
exports.skillFilterFieldSchema = require_data_service.skillFilterFieldSchema;
|
|
6687
7982
|
exports.skillPermissionsSchema = skillPermissionsSchema;
|
|
6688
7983
|
exports.skillSyncConfigSchema = require_data_service.skillSyncConfigSchema;
|
|
6689
7984
|
exports.skillSyncGitHubSourceSchema = require_data_service.skillSyncGitHubSourceSchema;
|
|
6690
7985
|
exports.slider = slider;
|
|
6691
7986
|
exports.specialVariables = require_data_service.specialVariables;
|
|
6692
7987
|
exports.specsConfigSchema = require_data_service.specsConfigSchema;
|
|
7988
|
+
exports.splitMCPToolKey = require_data_service.splitMCPToolKey;
|
|
7989
|
+
exports.splitToolCallName = require_data_service.splitToolCallName;
|
|
6693
7990
|
exports.stripAgentIdSuffix = stripAgentIdSuffix;
|
|
7991
|
+
exports.stripLangChainTroubleshootingUrl = stripLangChainTroubleshootingUrl;
|
|
7992
|
+
exports.stripReasoningLabelMetadata = stripReasoningLabelMetadata;
|
|
7993
|
+
exports.stripServerNamePrefix = require_data_service.stripServerNamePrefix;
|
|
7994
|
+
exports.stripServerNamePrefixes = require_data_service.stripServerNamePrefixes;
|
|
7995
|
+
exports.structuredCadenceSchema = structuredCadenceSchema;
|
|
7996
|
+
exports.subagentThreadLineageSchema = require_data_service.subagentThreadLineageSchema;
|
|
6694
7997
|
exports.summarizationConfigSchema = require_data_service.summarizationConfigSchema;
|
|
6695
7998
|
exports.summarizationTriggerSchema = require_data_service.summarizationTriggerSchema;
|
|
6696
7999
|
exports.supportedMimeTypes = require_data_service.supportedMimeTypes;
|
|
@@ -6698,6 +8001,7 @@ exports.supportsAdaptiveThinking = supportsAdaptiveThinking;
|
|
|
6698
8001
|
exports.supportsBalanceCheck = require_data_service.supportsBalanceCheck;
|
|
6699
8002
|
exports.supportsContext1m = supportsContext1m;
|
|
6700
8003
|
exports.supportsFiles = require_data_service.supportsFiles;
|
|
8004
|
+
exports.supportsPromptCache = supportsPromptCache;
|
|
6701
8005
|
exports.switchComponent = switchComponent;
|
|
6702
8006
|
exports.tBannerSchema = require_data_service.tBannerSchema;
|
|
6703
8007
|
exports.tConversationSchema = require_data_service.tConversationSchema;
|
|
@@ -6722,13 +8026,20 @@ exports.toast = toast;
|
|
|
6722
8026
|
exports.toaster = toaster;
|
|
6723
8027
|
exports.toggle = toggle;
|
|
6724
8028
|
exports.toggleGroup = toggleGroup;
|
|
8029
|
+
exports.toolApprovalHookConfigSchema = require_data_service.toolApprovalHookConfigSchema;
|
|
8030
|
+
exports.toolApprovalModeSchema = require_data_service.toolApprovalModeSchema;
|
|
8031
|
+
exports.toolApprovalPolicySchema = require_data_service.toolApprovalPolicySchema;
|
|
8032
|
+
exports.toolArgumentFilterFieldSchema = require_data_service.toolArgumentFilterFieldSchema;
|
|
6725
8033
|
exports.tooltip = tooltip;
|
|
6726
8034
|
exports.transactionsSchema = require_data_service.transactionsSchema;
|
|
6727
8035
|
exports.turnstileOptionsSchema = require_data_service.turnstileOptionsSchema;
|
|
6728
8036
|
exports.turnstileSchema = require_data_service.turnstileSchema;
|
|
8037
|
+
exports.unattributedAssistantContentSchema = require_data_service.unattributedAssistantContentSchema;
|
|
6729
8038
|
exports.updateResourcePermissionsRequestSchema = require_data_service.updateResourcePermissionsRequestSchema;
|
|
6730
8039
|
exports.updateResourcePermissionsResponseSchema = require_data_service.updateResourcePermissionsResponseSchema;
|
|
8040
|
+
exports.updateSchedulePayloadSchema = updateSchedulePayloadSchema;
|
|
6731
8041
|
exports.useToast = useToast;
|
|
8042
|
+
exports.userSubmittedMessageFieldPathSchema = require_data_service.userSubmittedMessageFieldPathSchema;
|
|
6732
8043
|
exports.utils = utils;
|
|
6733
8044
|
exports.validateActionDomain = validateActionDomain;
|
|
6734
8045
|
exports.validateAndParseOpenAPISpec = validateAndParseOpenAPISpec;
|