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.
Files changed (61) hide show
  1. package/dist/{data-service-BsdHkdKS.mjs → data-service-CaB7saTP.mjs} +2175 -113
  2. package/dist/data-service-CaB7saTP.mjs.map +1 -0
  3. package/dist/{data-service-XTxx76uB.js → data-service-D5kHzBt-.js} +2806 -150
  4. package/dist/data-service-D5kHzBt-.js.map +1 -0
  5. package/dist/index.js +1403 -92
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +1248 -93
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/react-query/index.js +2 -1
  10. package/dist/react-query/index.js.map +1 -1
  11. package/dist/react-query/index.mjs +2 -1
  12. package/dist/react-query/index.mjs.map +1 -1
  13. package/dist/types/accessPermissions.d.ts +4 -0
  14. package/dist/types/actions.d.ts +3 -3
  15. package/dist/types/agentToolOptions.d.ts +11 -0
  16. package/dist/types/api-endpoints.d.ts +28 -2
  17. package/dist/types/bedrock.d.ts +220 -0
  18. package/dist/types/cadence.d.ts +33 -0
  19. package/dist/types/codeEnvRef.d.ts +21 -0
  20. package/dist/types/config.d.ts +13457 -1573
  21. package/dist/types/data-service.d.ts +65 -14
  22. package/dist/types/feedback.d.ts +9 -1
  23. package/dist/types/file-config.d.ts +42 -5
  24. package/dist/types/filters.d.ts +1422 -0
  25. package/dist/types/generate.d.ts +85 -1
  26. package/dist/types/index.d.ts +10 -0
  27. package/dist/types/keys.d.ts +29 -4
  28. package/dist/types/langchain.d.ts +4 -0
  29. package/dist/types/limits.d.ts +13 -0
  30. package/dist/types/mcp.d.ts +338 -228
  31. package/dist/types/messages.d.ts +13 -0
  32. package/dist/types/models.d.ts +840 -68
  33. package/dist/types/parameterSettings.d.ts +7 -3
  34. package/dist/types/parsers.d.ts +13 -1
  35. package/dist/types/permissions.d.ts +42 -1
  36. package/dist/types/providers.d.ts +36 -0
  37. package/dist/types/react-query/react-query-service.d.ts +2 -7
  38. package/dist/types/request.d.ts +4 -2
  39. package/dist/types/roles.d.ts +34 -0
  40. package/dist/types/runSteps.d.ts +59 -0
  41. package/dist/types/schemas.d.ts +1358 -34
  42. package/dist/types/stateful-code.d.ts +7 -0
  43. package/dist/types/types/agents.d.ts +303 -8
  44. package/dist/types/types/assistants.d.ts +170 -7
  45. package/dist/types/types/files.d.ts +29 -8
  46. package/dist/types/types/index.d.ts +2 -0
  47. package/dist/types/types/insights.d.ts +62 -0
  48. package/dist/types/types/mcpServers.d.ts +25 -0
  49. package/dist/types/types/mutations.d.ts +2 -0
  50. package/dist/types/types/queries.d.ts +47 -5
  51. package/dist/types/types/queuedTurns.d.ts +870 -0
  52. package/dist/types/types/runs.d.ts +206 -26
  53. package/dist/types/types/schedules.d.ts +306 -0
  54. package/dist/types/types/skills.d.ts +34 -6
  55. package/dist/types/types/subagents.d.ts +159 -0
  56. package/dist/types/types/web.d.ts +12 -2
  57. package/dist/types/types.d.ts +175 -2
  58. package/dist/types/upload.d.ts +2 -0
  59. package/package.json +7 -5
  60. package/dist/data-service-BsdHkdKS.mjs.map +0 -1
  61. 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-XTxx76uB.js");
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 single-digit minor capture to avoid matching date suffixes (e.g., -20250514). */
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 = /anthropic\.claude-(?:[4-9](?:\.\d+)?(?:-\d+)?-(?:sonnet|opus|haiku)|(?:sonnet|opus|haiku)-[4-9])/.test(model);
136
- if (model.includes("anthropic.claude-3-7-sonnet") || isClaude4PlusModel) betaHeaders.push(BEDROCK_OUTPUT_128K_BETA);
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
- let existingValues = [];
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
- [...existingValues, ...generated].forEach((value) => {
146
- if (typeof value !== "string") return;
147
- value.split(",").map((header) => header.trim()).filter(Boolean).forEach((header) => betaHeaders.add(header));
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
- /** Configure thinking for Bedrock Anthropic models: 3.7 Sonnet, Claude 4+ (opus/sonnet/haiku), and Mythos-class (Fable/Mythos). */
249
- if (typeof typedData.model === "string" && (typedData.model.includes("anthropic.claude-3-7-sonnet") || /anthropic\.claude-(?:[4-9](?:\.\d+)?(?:-\d+)?-(?:sonnet|opus|haiku)|(?:sonnet|opus|haiku)-[4-9])/.test(typedData.model) || require_data_service.isMythosClassModel(typedData.model))) {
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 (effort && typeof effort === "string" && effort !== "") additionalFields.output_config = { effort };
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.includes("anthropic.")) {
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.includes("anthropic.");
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.maxTokens ?? updatedData.maxOutputTokens ?? DEFAULT_ENABLED_MAX_TOKENS;
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
- if (updatedData.maxTokens == null && updatedData.maxOutputTokens != null) updatedData.maxTokens = updatedData.maxOutputTokens;
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
- const amrf = result.additionalModelRequestFields;
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
- const textValue = (typeof part.text === "string" ? part.text : part.text?.value) || "";
666
- if (result.length > 0 && textValue.length > 0 && result[result.length - 1] !== " " && textValue[0] !== " ") result += " ";
667
- result += textValue;
668
- } else if (part.type === "think" && !skipReasoning) {
669
- const textValue = typeof part.think === "string" ? part.think : "";
670
- if (result.length > 0 && textValue.length > 0 && result[result.length - 1] !== " " && textValue[0] !== " ") result += " ";
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
- messages.forEach((message) => {
1024
- if (!message) return;
1025
- const parentId = message.parentMessageId ?? "";
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
- const parentMessage = messageMap[parentId];
1036
- if (parentMessage) {
1037
- parentMessage.children.push(extendedMessage);
1038
- extendedMessage.depth = parentMessage.depth + 1;
1039
- } else rootMessages.push(extendedMessage);
1040
- });
1041
- return rootMessages;
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: true,
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: false,
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
- let server = `${require_data_service.EndpointURLs["agents"]}/${endpoint}`;
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: "com_nav_theme_system",
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: "com_nav_theme_system",
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: "com_nav_theme_system",
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: "com_nav_theme_system",
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: "com_nav_theme_system",
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: "com_nav_theme_system",
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
- librechat.maxContextTokens,
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
- librechat.maxContextTokens,
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
- baseDefinitions.imageDetail,
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
- baseDefinitions.imageDetail,
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 (endpoint !== "google" || !model) return settings;
6279
- return settings.map((setting) => setting.key === "maxOutputTokens" ? {
6280
- ...setting,
6281
- default: require_data_service.googleSettings.maxOutputTokens.reset(model)
6282
- } : setting);
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;