librechat-data-provider 0.8.521 → 0.8.523

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 (64) hide show
  1. package/dist/{data-service-pwrlWjJs.mjs → data-service-Bx6IFaSa.mjs} +1770 -51
  2. package/dist/data-service-Bx6IFaSa.mjs.map +1 -0
  3. package/dist/{data-service-DOIF4BkW.js → data-service-CTX0tVO5.js} +2509 -112
  4. package/dist/data-service-CTX0tVO5.js.map +1 -0
  5. package/dist/index.js +1503 -54
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +1314 -55
  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 +58 -1
  14. package/dist/types/actions.d.ts +2 -2
  15. package/dist/types/agentToolOptions.d.ts +11 -0
  16. package/dist/types/api-endpoints.d.ts +24 -0
  17. package/dist/types/bedrock.d.ts +238 -10
  18. package/dist/types/cadence.d.ts +33 -0
  19. package/dist/types/code/approval.d.ts +26 -0
  20. package/dist/types/code/worker.d.ts +10 -0
  21. package/dist/types/code/workspace.d.ts +28 -0
  22. package/dist/types/codeEnvRef.d.ts +26 -0
  23. package/dist/types/config.d.ts +13180 -3021
  24. package/dist/types/data-service.d.ts +48 -2
  25. package/dist/types/errors.d.ts +2 -0
  26. package/dist/types/file-config.d.ts +138 -9
  27. package/dist/types/filters.d.ts +1422 -0
  28. package/dist/types/generate.d.ts +103 -1
  29. package/dist/types/index.d.ts +17 -0
  30. package/dist/types/keys.d.ts +33 -2
  31. package/dist/types/langchain.d.ts +4 -0
  32. package/dist/types/limits.d.ts +13 -0
  33. package/dist/types/mcp.d.ts +555 -460
  34. package/dist/types/messages.d.ts +24 -0
  35. package/dist/types/models.d.ts +1112 -319
  36. package/dist/types/parameterSettings.d.ts +13 -1
  37. package/dist/types/parsers.d.ts +10 -0
  38. package/dist/types/permissions.d.ts +42 -1
  39. package/dist/types/providers.d.ts +37 -0
  40. package/dist/types/request.d.ts +2 -2
  41. package/dist/types/resolve-llm-delivery-path.d.ts +68 -0
  42. package/dist/types/roles.d.ts +34 -0
  43. package/dist/types/runSteps.d.ts +59 -0
  44. package/dist/types/schemas.d.ts +1724 -248
  45. package/dist/types/stateful-code.d.ts +7 -0
  46. package/dist/types/svg.d.ts +34 -0
  47. package/dist/types/types/agents.d.ts +116 -7
  48. package/dist/types/types/assistants.d.ts +121 -6
  49. package/dist/types/types/files.d.ts +46 -2
  50. package/dist/types/types/index.d.ts +2 -0
  51. package/dist/types/types/insights.d.ts +71 -0
  52. package/dist/types/types/mutations.d.ts +1 -0
  53. package/dist/types/types/queries.d.ts +37 -2
  54. package/dist/types/types/queuedTurns.d.ts +870 -0
  55. package/dist/types/types/runs.d.ts +119 -9
  56. package/dist/types/types/schedules.d.ts +339 -0
  57. package/dist/types/types/skills.d.ts +9 -0
  58. package/dist/types/types/subagents.d.ts +159 -0
  59. package/dist/types/types/traces.d.ts +85 -0
  60. package/dist/types/types/web.d.ts +12 -2
  61. package/dist/types/types.d.ts +101 -1
  62. package/package.json +5 -3
  63. package/dist/data-service-DOIF4BkW.js.map +0 -1
  64. package/dist/data-service-pwrlWjJs.mjs.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-DOIF4BkW.js");
2
+ const require_data_service = require("./data-service-CTX0tVO5.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");
@@ -190,6 +191,17 @@ function supportsContext1m(model) {
190
191
  return false;
191
192
  }
192
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
+ /**
193
205
  * A Bedrock Claude model ID may be prefixed (`anthropic.claude-*`,
194
206
  * `us.anthropic.claude-*`, `global.anthropic.claude-*`) or bare (`claude-*`,
195
207
  * used when the LibreChat model ID maps to an application inference profile).
@@ -644,11 +656,14 @@ let StepEvents = /* @__PURE__ */ function(StepEvents) {
644
656
  StepEvents["ON_REASONING_DELTA"] = "on_reasoning_delta";
645
657
  StepEvents["ON_RUN_STEP_DELTA"] = "on_run_step_delta";
646
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";
647
661
  StepEvents["ON_SUMMARIZE_START"] = "on_summarize_start";
648
662
  StepEvents["ON_SUMMARIZE_DELTA"] = "on_summarize_delta";
649
663
  StepEvents["ON_SUMMARIZE_COMPLETE"] = "on_summarize_complete";
650
664
  StepEvents["ON_SUBAGENT_UPDATE"] = "on_subagent_update";
651
665
  StepEvents["ON_SANDBOX_STARTING"] = "on_sandbox_starting";
666
+ StepEvents["ON_PTC_TOOL_CALL"] = "on_ptc_tool_call";
652
667
  return StepEvents;
653
668
  }({});
654
669
  /** Token-tracking event names streamed to the client (separate from StepEvents dispatch). */
@@ -689,6 +704,17 @@ let ActivityLabelEvents = /* @__PURE__ */ function(ActivityLabelEvents) {
689
704
  ActivityLabelEvents["ON_ACTIVITY_LABEL"] = "on_activity_label";
690
705
  return ActivityLabelEvents;
691
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
+ const finiteNonNegativeInteger = (value) => {
715
+ if (typeof value !== "number" || !Number.isFinite(value)) return;
716
+ return Math.min(Number.MAX_SAFE_INTEGER, Math.max(0, Math.floor(value)));
717
+ };
692
718
  /**
693
719
  * Full prompt token count for one completed model call — the EXACT context the
694
720
  * model saw, provider-aware: additive providers (Bedrock) report `input_tokens`
@@ -700,37 +726,114 @@ let ActivityLabelEvents = /* @__PURE__ */ function(ActivityLabelEvents) {
700
726
  * gauge reconciles its calibrated estimate to.
701
727
  */
702
728
  const promptTokensFromUsage = (event) => {
703
- const input = event.input_tokens ?? 0;
729
+ const input = finiteNonNegativeInteger(event.input_tokens) ?? 0;
704
730
  const details = event.input_token_details ?? {};
705
- const cacheRead = details.cache_read ?? 0;
706
- const cacheCreation = details.cache_creation ?? 0;
707
- return (event.provider != null ? require_data_service.inputTokensIncludesCache(event.provider) : cacheRead + cacheCreation <= input) ? input : input + cacheRead + cacheCreation;
731
+ const cacheRead = finiteNonNegativeInteger(details.cache_read) ?? 0;
732
+ const cacheCreation = finiteNonNegativeInteger(details.cache_creation) ?? 0;
733
+ return (event.provider != null ? require_data_service.inputTokensIncludesCache(event.provider) : cacheRead + cacheCreation <= input) ? input : Math.min(Number.MAX_SAFE_INTEGER, input + cacheRead + cacheCreation);
734
+ };
735
+ /**
736
+ * Scales per-tool result-message counts while bounding both malformed input and
737
+ * rounding error. Null-prototype records keep tool names as ordinary data keys;
738
+ * cumulative apportionment preserves the scaled sum in one linear pass.
739
+ */
740
+ const scaleToolMessageTokenCounts = (value, oldTotal, newTotal) => {
741
+ if (value == null || typeof value !== "object" || Array.isArray(value)) return;
742
+ const scaled = Object.create(null);
743
+ let remaining = oldTotal;
744
+ let cumulative = 0;
745
+ let allocated = 0;
746
+ let found = false;
747
+ for (const [name, rawCount] of Object.entries(value)) {
748
+ const count = finiteNonNegativeInteger(rawCount);
749
+ if (count == null || count === 0) continue;
750
+ const bounded = Math.min(count, remaining);
751
+ remaining -= bounded;
752
+ cumulative += bounded;
753
+ const target = oldTotal > 0 ? Math.round(cumulative / oldTotal * newTotal) : 0;
754
+ const apportioned = target - allocated;
755
+ allocated = target;
756
+ if (apportioned > 0) {
757
+ scaled[name] = apportioned;
758
+ found = true;
759
+ }
760
+ }
761
+ return found ? scaled : void 0;
708
762
  };
709
763
  /**
710
764
  * Reconciles a pre-invoke context snapshot's CALIBRATED estimate to a call's
711
765
  * ACTUAL prompt tokens. The SDK's calibration multiplier scales only
712
- * `messageTokens` (instructions/summary are raw tiktoken counts), and it can
766
+ * `messageTokens` (instructions/summary are raw tiktoken counts) and can
713
767
  * over-shoot badly when a provider injects server-side content the SDK never
714
768
  * counted (e.g. Anthropic web search) — pinning the gauge several× too high and
715
769
  * persisting it. Trust the provider's own prompt count: keep the raw
716
- * instruction/summary rows, set `messageTokens` to the remainder, and recompute
717
- * the free space. No-op when `promptTokens` is unusable.
770
+ * instruction/summary rows, set `messageTokens` to the remainder, recompute the
771
+ * free space, and rescale the `toolMessageTokens` share to the new message
772
+ * total. No-op when `promptTokens` is unusable.
718
773
  */
719
774
  const reconcileContextUsage = (snapshot, promptTokens) => {
720
775
  if (!Number.isFinite(promptTokens) || promptTokens <= 0) return snapshot;
776
+ const normalizedPromptTokens = Math.min(Number.MAX_SAFE_INTEGER, Math.floor(promptTokens));
777
+ if (normalizedPromptTokens <= 0) return snapshot;
721
778
  const { breakdown } = snapshot;
722
- const budget = snapshot.contextBudget ?? breakdown.maxContextTokens;
723
- const nonMessageTokens = (breakdown.instructionTokens ?? 0) + (breakdown.summaryTokens ?? 0);
724
- const messageTokens = Math.max(0, promptTokens - nonMessageTokens);
725
- return {
779
+ const instructionTokens = finiteNonNegativeInteger(breakdown.instructionTokens) ?? 0;
780
+ const summaryTokens = finiteNonNegativeInteger(breakdown.summaryTokens) ?? 0;
781
+ const budget = finiteNonNegativeInteger(snapshot.contextBudget) ?? finiteNonNegativeInteger(breakdown.maxContextTokens);
782
+ const nonMessageTokens = instructionTokens + summaryTokens;
783
+ const messageTokens = Math.max(0, normalizedPromptTokens - nonMessageTokens);
784
+ /** `toolMessageTokens` is a subset of the OLD (calibrated) `messageTokens`;
785
+ * rescale it by the same proportion so the split tracks the provider's real
786
+ * total. A supplied zero remains a known-zero split; absent fields stay absent
787
+ * for older snapshots. */
788
+ const priorMessageTokens = finiteNonNegativeInteger(breakdown.messageTokens) ?? 0;
789
+ const priorToolMessageTokens = finiteNonNegativeInteger(breakdown.toolMessageTokens);
790
+ let toolMessageTokens;
791
+ if (priorToolMessageTokens != null) {
792
+ toolMessageTokens = 0;
793
+ if (priorMessageTokens > 0 && priorToolMessageTokens > 0) toolMessageTokens = Math.min(messageTokens, Math.round(Math.min(priorToolMessageTokens, priorMessageTokens) / priorMessageTokens * messageTokens));
794
+ }
795
+ const toolMessageTokenCounts = toolMessageTokens != null ? scaleToolMessageTokenCounts(breakdown.toolMessageTokenCounts, Math.min(priorToolMessageTokens ?? 0, priorMessageTokens), toolMessageTokens) : void 0;
796
+ const nextBreakdown = {
797
+ ...breakdown,
798
+ instructionTokens,
799
+ summaryTokens,
800
+ messageTokens
801
+ };
802
+ if (toolMessageTokens == null) {
803
+ delete nextBreakdown.toolMessageTokens;
804
+ delete nextBreakdown.toolMessageTokenCounts;
805
+ } else {
806
+ nextBreakdown.toolMessageTokens = toolMessageTokens;
807
+ if (toolMessageTokenCounts == null) delete nextBreakdown.toolMessageTokenCounts;
808
+ else nextBreakdown.toolMessageTokenCounts = toolMessageTokenCounts;
809
+ }
810
+ const result = {
726
811
  ...snapshot,
727
- breakdown: {
728
- ...breakdown,
729
- messageTokens
730
- },
731
- remainingContextTokens: budget != null ? Math.max(0, budget - promptTokens) : snapshot.remainingContextTokens
812
+ breakdown: nextBreakdown
732
813
  };
814
+ if (budget != null) result.remainingContextTokens = Math.max(0, budget - normalizedPromptTokens);
815
+ else {
816
+ const remaining = finiteNonNegativeInteger(snapshot.remainingContextTokens);
817
+ if (remaining == null) delete result.remainingContextTokens;
818
+ else result.remainingContextTokens = remaining;
819
+ }
820
+ return result;
733
821
  };
822
+ /** Provider output, including reasoning omitted from an under-reported output count. */
823
+ const outputTokensFromUsage = (event) => {
824
+ const output = finiteNonNegativeInteger(event.output_tokens) ?? 0;
825
+ const total = finiteNonNegativeInteger(event.total_tokens) ?? 0;
826
+ return Math.max(output, total - promptTokensFromUsage(event));
827
+ };
828
+ /** Reconcile and retain the primary call details on live, saved, and resumable snapshots. */
829
+ const reconcileContextUsageFromEvent = (snapshot, event) => ({
830
+ ...reconcileContextUsage(snapshot, promptTokensFromUsage(event)),
831
+ model: event.model,
832
+ provider: event.provider,
833
+ completedOutputTokens: outputTokensFromUsage(event),
834
+ cacheRead: finiteNonNegativeInteger(event.input_token_details?.cache_read) ?? 0,
835
+ cacheWrite: finiteNonNegativeInteger(event.input_token_details?.cache_creation) ?? 0
836
+ });
734
837
  //#endregion
735
838
  //#region src/parsers.ts
736
839
  dayjs.default.extend(dayjs_plugin_utc_js.default);
@@ -964,6 +1067,14 @@ function replaceSpecialVars({ text, user, now: inputNow, timezone }) {
964
1067
  return result;
965
1068
  }
966
1069
  /**
1070
+ * Resolves the display label ("sender") for an ephemeral agent:
1071
+ * `modelLabel` (user/preset) → model spec's `label` → endpoint config's
1072
+ * `modelDisplayLabel` → `''` (lets consumers fall back to the model name).
1073
+ */
1074
+ function getEphemeralSender({ modelLabel, specLabel, modelDisplayLabel }) {
1075
+ return modelLabel ?? specLabel ?? modelDisplayLabel ?? "";
1076
+ }
1077
+ /**
967
1078
  * Encodes an ephemeral agent ID from endpoint, model, optional sender, and optional index.
968
1079
  * Uses __ to replace : (reserved in graph node names) and ___ to separate sender.
969
1080
  *
@@ -1255,7 +1366,266 @@ function mapGroupToAzureConfig({ groupName, groupMap }) {
1255
1366
  return result;
1256
1367
  }
1257
1368
  //#endregion
1369
+ //#region src/langchain.ts
1370
+ /**
1371
+ * LangChain classifies a provider failure by mutating the error: it stamps `lc_error_code` and
1372
+ * appends `\n\nTroubleshooting URL: <docs url>\n` to the message. Both halves are handled here
1373
+ * because the server strips the URL before persisting the message, while the client still reads the
1374
+ * code back out of messages persisted before it did.
1375
+ */
1376
+ const LANGCHAIN = "langchain";
1377
+ const ERROR_PATH = "/errors/";
1378
+ const TROUBLESHOOTING_LABEL = "Troubleshooting URL:";
1379
+ const WHITESPACE = /\s/;
1380
+ /** Provider errors cross untyped boundaries, so a `message` is not guaranteed to be a string. */
1381
+ function toMessageText(message) {
1382
+ if (typeof message === "string") return message;
1383
+ return message == null ? "" : String(message);
1384
+ }
1385
+ function isErrorCodeCharacter(character) {
1386
+ const code = character.charCodeAt(0);
1387
+ return character === "_" || code >= 65 && code <= 90 || code >= 97 && code <= 122;
1388
+ }
1389
+ function findTokenEnd(text, start, limit = text.length) {
1390
+ let end = start;
1391
+ while (end < limit && !WHITESPACE.test(text[end])) end += 1;
1392
+ return end;
1393
+ }
1394
+ function findErrorCode(text, searchableText, start, end) {
1395
+ const langChainIndex = searchableText.indexOf(LANGCHAIN, start);
1396
+ if (langChainIndex < 0 || langChainIndex >= end) return;
1397
+ let errorCode;
1398
+ let pathIndex = searchableText.indexOf(ERROR_PATH, langChainIndex + 9);
1399
+ while (pathIndex >= 0 && pathIndex < end) {
1400
+ const codeStart = pathIndex + 8;
1401
+ let codeEnd = codeStart;
1402
+ while (codeEnd < end && isErrorCodeCharacter(text[codeEnd])) codeEnd += 1;
1403
+ if (codeEnd > codeStart) errorCode = {
1404
+ start: codeStart,
1405
+ end: codeEnd
1406
+ };
1407
+ pathIndex = searchableText.indexOf(ERROR_PATH, Math.max(codeStart, codeEnd));
1408
+ }
1409
+ return errorCode;
1410
+ }
1411
+ /** Removes LangChain's appended docs URL so provider text carries no third-party attribution. */
1412
+ function stripLangChainTroubleshootingUrl(message) {
1413
+ const text = toMessageText(message);
1414
+ const parts = [];
1415
+ let copiedUntil = 0;
1416
+ let searchFrom = 0;
1417
+ while (searchFrom < text.length) {
1418
+ const labelStart = text.indexOf(TROUBLESHOOTING_LABEL, searchFrom);
1419
+ if (labelStart < 0) break;
1420
+ let matchStart = labelStart;
1421
+ while (matchStart > copiedUntil && WHITESPACE.test(text[matchStart - 1])) matchStart -= 1;
1422
+ let urlStart = labelStart + 20;
1423
+ while (urlStart < text.length && WHITESPACE.test(text[urlStart])) urlStart += 1;
1424
+ if (!text.startsWith("https://", urlStart) && !text.startsWith("http://", urlStart)) {
1425
+ searchFrom = urlStart;
1426
+ continue;
1427
+ }
1428
+ const urlEnd = findTokenEnd(text, urlStart);
1429
+ const errorCode = findErrorCode(text, text, urlStart, urlEnd);
1430
+ if (errorCode == null) {
1431
+ searchFrom = urlEnd;
1432
+ continue;
1433
+ }
1434
+ let matchEnd = errorCode.end;
1435
+ if (text[matchEnd] === "/") matchEnd += 1;
1436
+ while (matchEnd < text.length && WHITESPACE.test(text[matchEnd])) matchEnd += 1;
1437
+ parts.push(text.slice(copiedUntil, matchStart), " ");
1438
+ copiedUntil = matchEnd;
1439
+ searchFrom = matchEnd;
1440
+ }
1441
+ parts.push(text.slice(copiedUntil));
1442
+ return parts.join("").trim();
1443
+ }
1444
+ /** The classification LangChain encoded in the docs URL it appended, when the text carries one. */
1445
+ function parseLangChainErrorCode(message) {
1446
+ const text = toMessageText(message);
1447
+ const searchableText = text.toLowerCase();
1448
+ let searchFrom = 0;
1449
+ while (searchFrom < text.length) {
1450
+ const langChainIndex = searchableText.indexOf(LANGCHAIN, searchFrom);
1451
+ if (langChainIndex < 0) return;
1452
+ const tokenEnd = findTokenEnd(text, langChainIndex);
1453
+ const errorCode = findErrorCode(text, searchableText, langChainIndex, tokenEnd);
1454
+ if (errorCode != null) return text.slice(errorCode.start, errorCode.end).toUpperCase();
1455
+ searchFrom = tokenEnd + 1;
1456
+ }
1457
+ }
1458
+ //#endregion
1459
+ //#region src/resolve-llm-delivery-path.ts
1460
+ /** Audio and video reach the model only through the media encoders, which support a
1461
+ * narrower provider set than documents. Images use the broadly supported vision
1462
+ * path and are never gated here. */
1463
+ const isProviderCapable = (mimeType, endpoint, useResponsesApi) => {
1464
+ if (mimeType.startsWith("audio/") || mimeType.startsWith("video/")) return require_data_service.isMediaSupportedProvider(endpoint);
1465
+ if (mimeType === "application/pdf") return useResponsesApi === true || require_data_service.isDocumentSupportedProvider(endpoint);
1466
+ return true;
1467
+ };
1468
+ const SYSTEM_LLM_DELIVERY_DEFAULTS = {
1469
+ fallback: "text",
1470
+ overrides: {
1471
+ "image/*": "provider",
1472
+ "video/*": "provider",
1473
+ "audio/*": "provider",
1474
+ "application/pdf": "provider"
1475
+ }
1476
+ };
1477
+ /**
1478
+ * Types some step in the upload pipeline can turn into text: natively readable text,
1479
+ * documents a parser or OCR handles, images through OCR, and audio through transcription.
1480
+ *
1481
+ * Everything absent from this list, notably archives, tarballs, columnar data files and
1482
+ * video, has no such step, and the default text matcher accepts any well-formed type, so
1483
+ * routing them to text ends in their bytes being decoded as UTF-8.
1484
+ */
1485
+ const TEXT_RECOVERABLE_MIME_TYPES = [
1486
+ /^text\//,
1487
+ /^image\//,
1488
+ /^audio\//,
1489
+ /^application\/(json|javascript|xml|sql|yaml|x-yaml|csv|typescript|x-sh|vnd\.coffeescript)$/,
1490
+ /^application\/pdf$/,
1491
+ /^application\/vnd\.openxmlformats-officedocument\.(wordprocessingml\.document|spreadsheetml\.sheet)$/,
1492
+ /^application\/vnd\.oasis\.opendocument\.(text|spreadsheet)$/,
1493
+ /^application\/(vnd\.ms-excel|x-msexcel|msexcel|x-ms-excel|x-excel|x-dos_ms_excel|xls|x-xls)$/,
1494
+ /^message\/rfc822$/
1495
+ ];
1496
+ /**
1497
+ * Types whose bytes are text already, so reading them directly is meaningful. Everything
1498
+ * else needs a real extractor: decoding it as UTF-8 produces mojibake rather than content.
1499
+ */
1500
+ /** Application types whose payload is text. Mirrors the set the content-protection code
1501
+ * treats as textual, plus the source and data formats this pipeline also accepts. */
1502
+ const TEXTUAL_APPLICATION_MIME_TYPES = new Set([
1503
+ "application/json",
1504
+ "application/javascript",
1505
+ "application/sql",
1506
+ "application/xml",
1507
+ "application/x-yaml",
1508
+ "application/yaml",
1509
+ "application/csv",
1510
+ "application/typescript",
1511
+ "application/x-sh",
1512
+ "application/vnd.coffeescript"
1513
+ ]);
1514
+ function isNativelyReadableText(mimeType) {
1515
+ const normalized = mimeType.split(";", 1)[0].trim().toLowerCase();
1516
+ return normalized.startsWith("text/") || TEXTUAL_APPLICATION_MIME_TYPES.has(normalized) || normalized === "message/rfc822";
1517
+ }
1518
+ function hasTextExtractionPath(mimeType) {
1519
+ return TEXT_RECOVERABLE_MIME_TYPES.some((pattern) => pattern.test(mimeType));
1520
+ }
1521
+ /**
1522
+ * Resolves the default file path destination for a given mime type.
1523
+ * Resolution chain: endpoint overrides -> endpoint fallback -> global overrides -> global fallback -> system defaults.
1524
+ */
1525
+ function resolveDefaultLLMDeliveryPath(mimeType, endpointConfig, globalConfig, endpoint, useResponsesApi, sttConfigured) {
1526
+ const wildcard = mimeType.split("/")[0] + "/*";
1527
+ if (endpointConfig?.overrides) {
1528
+ if (endpointConfig.overrides[mimeType]) return endpointConfig.overrides[mimeType];
1529
+ if (endpointConfig.overrides[wildcard]) return endpointConfig.overrides[wildcard];
1530
+ }
1531
+ if (endpointConfig?.fallback) return endpointConfig.fallback;
1532
+ if (globalConfig?.overrides) {
1533
+ if (globalConfig.overrides[mimeType]) return globalConfig.overrides[mimeType];
1534
+ if (globalConfig.overrides[wildcard]) return globalConfig.overrides[wildcard];
1535
+ }
1536
+ if (globalConfig?.fallback) return globalConfig.fallback;
1537
+ const systemDefault = SYSTEM_LLM_DELIVERY_DEFAULTS.overrides[mimeType] ?? SYSTEM_LLM_DELIVERY_DEFAULTS.overrides[wildcard] ?? SYSTEM_LLM_DELIVERY_DEFAULTS.fallback;
1538
+ /** Only the system default is capability-gated: an explicit config above is the
1539
+ * admin's decision. A known endpoint that cannot encode documents or media would
1540
+ * otherwise accept the upload and hand the model nothing at all. */
1541
+ /** `agents` is a container, not a provider: it is what an upload reports when the
1542
+ * agent's real provider could not be resolved, as for ephemeral agents. A custom
1543
+ * endpoint name is likewise unresolvable here, since its real provider is chosen
1544
+ * at request time and is usually OpenAI- or Anthropic-compatible. Judging
1545
+ * capability from either would downgrade media the actual provider can deliver,
1546
+ * so an unresolved provider keeps the system default. */
1547
+ const namedEndpoint = endpoint != null && endpoint !== "agents";
1548
+ const providerKnown = namedEndpoint && require_data_service.isKnownProviderIdentifier(endpoint);
1549
+ const isMedia = mimeType.startsWith("audio/") || mimeType.startsWith("video/");
1550
+ const canRecoverText = (type) => type.startsWith("audio/") && sttConfigured === false ? false : hasTextExtractionPath(type);
1551
+ if (systemDefault === "provider" && (isMedia ? namedEndpoint : providerKnown) && !isProviderCapable(mimeType, endpoint, useResponsesApi)) return canRecoverText(mimeType) ? "text" : "none";
1552
+ /** Bedrock's Converse document path natively accepts more than PDF, so on that
1553
+ * endpoint its document types belong on the provider path rather than being
1554
+ * extracted, which would drop non-text content and layout. */
1555
+ if (systemDefault !== "provider" && endpoint === "bedrock" && require_data_service.isBedrockDocumentType(mimeType)) return "provider";
1556
+ if (systemDefault === "text" && !canRecoverText(mimeType)) return "none";
1557
+ return systemDefault;
1558
+ }
1559
+ /**
1560
+ * Delivery path for an upload that named no tool resource. The legacy chooser makes the
1561
+ * destination explicit, so nothing is inferred there.
1562
+ */
1563
+ function resolveDefaultUploadLLMDeliveryPath({ mimeType, endpointConfig, fileConfig, endpoint, useResponsesApi, sttConfigured }) {
1564
+ if (endpointConfig?.legacyFileUploadUX === true) return "provider";
1565
+ return resolveDefaultLLMDeliveryPath(mimeType, endpointConfig?.defaultLLMDeliveryPath, fileConfig?.defaultLLMDeliveryPath, endpoint, useResponsesApi, sttConfigured);
1566
+ }
1567
+ /** Delivery path for an upload, honoring an explicitly chosen tool resource. */
1568
+ function resolveUploadLLMDeliveryPath({ toolResource, mimeType, endpointConfig, fileConfig, endpoint, useResponsesApi, sttConfigured }) {
1569
+ if (toolResource === "context" || toolResource === "ocr") return "text";
1570
+ if (toolResource === "file_search" || toolResource === "execute_code") return "none";
1571
+ return resolveDefaultUploadLLMDeliveryPath({
1572
+ mimeType,
1573
+ endpointConfig,
1574
+ fileConfig,
1575
+ endpoint,
1576
+ useResponsesApi,
1577
+ sttConfigured
1578
+ });
1579
+ }
1580
+ /**
1581
+ * Whether a file tool can do anything with this type. `file_search` indexes extracted
1582
+ * text, so it needs a type some step can turn into text and cannot use media, whose
1583
+ * extraction paths are OCR and speech rather than the vector store. Code execution is
1584
+ * judged by the list the client offers it from. Shared by upload-time selection and
1585
+ * deferred provisioning so the two cannot queue a file the other would refuse.
1586
+ */
1587
+ function canToolResourceConsume(toolResource, mimeType) {
1588
+ if (toolResource === "file_search") return !mimeType.startsWith("image") && !mimeType.startsWith("audio") && !mimeType.startsWith("video") && (hasTextExtractionPath(mimeType) || matchesMimeList(mimeType, require_data_service.retrievalMimeTypes));
1589
+ if (toolResource === "execute_code") return matchesMimeList(mimeType, require_data_service.codeInterpreterMimeTypes);
1590
+ return true;
1591
+ }
1592
+ const matchesMimeList = (mimeType, patterns) => patterns.some((pattern) => pattern.test(mimeType));
1593
+ /**
1594
+ * Where a unified upload will end up, and whether it can be accepted at all.
1595
+ *
1596
+ * An upload has to be readable by something: the model, an extraction step, or a file
1597
+ * tool. A permanent one has to land on an agent resource too, or storing it succeeds
1598
+ * while leaving the agent no reference to it. Both outcomes are decided here rather than
1599
+ * discovered later, so a request that would change nothing is refused with a reason.
1600
+ *
1601
+ * `agentTools` is undefined when no agent record backs the upload, as for an ephemeral
1602
+ * agent that exists only for the request. An unknown tool set is not judged.
1603
+ */
1604
+ function resolveUploadDestination(params) {
1605
+ const { toolResource, deliveryPath, mimeType, agentTools, hasAgent, isMessageAttachment, allowUnknownMessageConsumer = false, contextEnabled } = params;
1606
+ const refusesContext = (resource) => resource === "context" && hasAgent && !isMessageAttachment && contextEnabled === false;
1607
+ if (toolResource) {
1608
+ const resolved = toolResource === "ocr" ? "context" : toolResource;
1609
+ return refusesContext(resolved) ? { rejection: "context-disabled" } : { toolResource: resolved };
1610
+ }
1611
+ if (deliveryPath === "text") return refusesContext("context") ? { rejection: "context-disabled" } : { toolResource: "context" };
1612
+ const consumingTool = agentTools?.find((tool) => (tool === "execute_code" || tool === "file_search") && canToolResourceConsume(tool, mimeType));
1613
+ if (deliveryPath === "none" && consumingTool) return { toolResource: consumingTool };
1614
+ if (hasAgent && !isMessageAttachment) return { rejection: "no-agent-resource" };
1615
+ if (deliveryPath === "none" && (!isMessageAttachment || !allowUnknownMessageConsumer)) return { rejection: "no-consumer" };
1616
+ return {};
1617
+ }
1618
+ //#endregion
1258
1619
  //#region src/messages.ts
1620
+ /** A generated reasoning title describes the text as it existed at generation time.
1621
+ * Any manual edit or merge into a different reasoning step invalidates the entire
1622
+ * title revision domain while preserving unrelated content metadata. */
1623
+ function stripReasoningLabelMetadata(part) {
1624
+ if (part.type !== "think") return part;
1625
+ 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;
1626
+ return unlabeledPart;
1627
+ }
1628
+ const treeCache = /* @__PURE__ */ new WeakMap();
1259
1629
  /**
1260
1630
  * Builds the render tree from the flat messages array. Order-robust: live
1261
1631
  * stream/steer/preempt cache writes can momentarily place a child before its
@@ -1266,6 +1636,11 @@ function mapGroupToAzureConfig({ groupName, groupMap }) {
1266
1636
  */
1267
1637
  function buildTree({ messages, fileMap }) {
1268
1638
  if (messages === null) return null;
1639
+ const cached = treeCache.get(messages);
1640
+ if (cached) {
1641
+ if (fileMap == null && cached.bare) return cached.bare;
1642
+ if (fileMap != null && cached.fileMap === fileMap && cached.hydrated) return cached.hydrated;
1643
+ }
1269
1644
  const messageMap = {};
1270
1645
  const orderedMessages = [];
1271
1646
  const rootMessages = [];
@@ -1319,7 +1694,129 @@ function buildTree({ messages, fileMap }) {
1319
1694
  rootMessages.push(extendedMessage);
1320
1695
  assignDepths(extendedMessage);
1321
1696
  }
1322
- return rootMessages;
1697
+ const tree = rootMessages;
1698
+ const entry = cached ?? {};
1699
+ if (fileMap == null) entry.bare = tree;
1700
+ else {
1701
+ entry.fileMap = fileMap;
1702
+ entry.hydrated = tree;
1703
+ }
1704
+ if (!cached) treeCache.set(messages, entry);
1705
+ return tree;
1706
+ }
1707
+ /**
1708
+ * Memoizes a messages array's id index. Every row that needs to look another
1709
+ * message up (the hover controls resolving the turn a rerun would replay) would
1710
+ * otherwise scan the whole array, which is quadratic in the conversation. A
1711
+ * cache write replaces the array, so the index dies with the array it indexes
1712
+ * and can never answer from stale rows.
1713
+ */
1714
+ const indexCache = /* @__PURE__ */ new WeakMap();
1715
+ /** The message with this id, resolved through the array's memoized index. */
1716
+ function findMessageById(messages, messageId) {
1717
+ if (messages == null || messageId == null) return;
1718
+ let index = indexCache.get(messages);
1719
+ if (index == null) {
1720
+ index = /* @__PURE__ */ new Map();
1721
+ for (const message of messages) if (message?.messageId != null && !index.has(message.messageId)) index.set(message.messageId, message);
1722
+ indexCache.set(messages, index);
1723
+ }
1724
+ return index.get(messageId);
1725
+ }
1726
+ /**
1727
+ * True when a turn carries the marker the server stamps on a manual compaction:
1728
+ * `markCompactionSummary` sets `initiatedBy: 'user'` on the summary a Compact
1729
+ * action produced, and nothing else writes it, so an automatic summary detour is
1730
+ * not one. This is the compaction's own identity, independent of where it hangs:
1731
+ * Compact runs on whatever leaf the branch ends with, so its response can parent
1732
+ * onto a user message as easily as onto the answer it summarized. Redoing one is
1733
+ * the context indicator's Compact action, never a rerun of the turn behind it.
1734
+ */
1735
+ function isUserInitiatedCompaction(message) {
1736
+ const content = message?.content;
1737
+ if (!Array.isArray(content)) return false;
1738
+ return content.some((part) => part?.type === "summary" && part.initiatedBy === "user");
1739
+ }
1740
+ /**
1741
+ * True when a message is a finished manual compaction: every content part is a
1742
+ * summary and at least one of them carries text. A part that is still streaming
1743
+ * or that failed contributes no text of its own, so an interrupted compaction
1744
+ * can be retried.
1745
+ */
1746
+ function isCompactedLeaf(message) {
1747
+ const content = message?.content;
1748
+ if (!Array.isArray(content) || content.length === 0) return false;
1749
+ let usable = false;
1750
+ for (const part of content) {
1751
+ if (part?.type !== "summary") return false;
1752
+ if (part.summarizing === true || part.failed === true) continue;
1753
+ const hasText = (part.content ?? []).some((block) => typeof block?.text === "string" && block.text.trim().length > 0);
1754
+ usable = usable || hasText;
1755
+ }
1756
+ return usable;
1757
+ }
1758
+ //#endregion
1759
+ //#region src/errors.ts
1760
+ const TOOL_CALL_ERROR_PREFIX = /^Error:\s*(?:\[[^\]]*\]\s*)*tool call failed:\s*/i;
1761
+ function hasToolCallErrorPrefix(text) {
1762
+ return TOOL_CALL_ERROR_PREFIX.test(text);
1763
+ }
1764
+ function stripToolCallErrorPrefix(text) {
1765
+ return text.replace(TOOL_CALL_ERROR_PREFIX, "");
1766
+ }
1767
+ //#endregion
1768
+ //#region src/runSteps.ts
1769
+ /**
1770
+ * Below this, a duration is noise rather than information: sub-second tool
1771
+ * calls are the common case, and labelling every one of them `· 0.3s` adds a
1772
+ * moving number to the end of most cards without telling the reader anything
1773
+ * they could act on. Callers use {@link isReportableRunStepDuration} rather
1774
+ * than comparing against this directly.
1775
+ */
1776
+ const MIN_REPORTABLE_RUN_STEP_DURATION_MS = 1e3;
1777
+ /**
1778
+ * Wall-clock duration of a run step, derived from the terminal
1779
+ * `on_run_step_closed` event.
1780
+ *
1781
+ * Returns `undefined` rather than a fallback whenever the value would be a
1782
+ * guess, because a wrong duration is worse than an absent one — an absent one
1783
+ * renders nothing, a wrong one is indistinguishable from a real measurement:
1784
+ *
1785
+ * - `created_at` is optional on the event; emitters that do not know when the
1786
+ * step opened cannot have their duration inferred from anything else.
1787
+ * - A negative result means the two timestamps came from clocks that disagree.
1788
+ * That is not hypothetical: since `@librechat/agents` v3.6.0 a step can be
1789
+ * opened in one process and closed in another after a checkpoint resume, so
1790
+ * the two stamps can legitimately originate on different machines.
1791
+ * - Non-finite input is treated as absent instead of propagating `NaN` into
1792
+ * rendering.
1793
+ *
1794
+ * Known limits, accepted rather than guessed at: only the negative direction
1795
+ * of clock skew is detectable from a single stamp pair — positive skew
1796
+ * inflates the result and cannot be distinguished from a genuinely long
1797
+ * step. And the value is wall-clock elapsed between open and close, so a
1798
+ * step held open across a suspension (a checkpoint resume, a HITL approval
1799
+ * wait) includes that held-open time. Both are properties of the only data
1800
+ * available, not derivation bugs.
1801
+ */
1802
+ function getRunStepDurationMs(closed) {
1803
+ const { created_at: createdAt, closed_at: closedAt } = closed;
1804
+ if (typeof createdAt !== "number" || typeof closedAt !== "number") return;
1805
+ if (!Number.isFinite(createdAt) || !Number.isFinite(closedAt)) return;
1806
+ const durationMs = closedAt - createdAt;
1807
+ return durationMs >= 0 ? durationMs : void 0;
1808
+ }
1809
+ /**
1810
+ * Whether a derived duration is worth showing to the reader.
1811
+ *
1812
+ * This is a presentation judgment, so it belongs at render time only. The
1813
+ * stamp sites persist the raw {@link getRunStepDurationMs} value instead of
1814
+ * pre-filtering through this — thresholding at write time would bake a
1815
+ * display rule into stored data, making "fast" indistinguishable from "not
1816
+ * derivable" and unrecoverable if the rule ever changes.
1817
+ */
1818
+ function isReportableRunStepDuration(durationMs) {
1819
+ return typeof durationMs === "number" && durationMs >= 1e3;
1323
1820
  }
1324
1821
  //#endregion
1325
1822
  //#region src/artifacts.ts
@@ -4492,6 +4989,10 @@ let PermissionTypes = /* @__PURE__ */ function(PermissionTypes) {
4492
4989
  * Type for Shared Link Permissions
4493
4990
  */
4494
4991
  PermissionTypes["SHARED_LINKS"] = "SHARED_LINKS";
4992
+ /**
4993
+ * Type for Scheduled Chats Permissions
4994
+ */
4995
+ PermissionTypes["SCHEDULES"] = "SCHEDULES";
4495
4996
  return PermissionTypes;
4496
4997
  }({});
4497
4998
  /**
@@ -4515,11 +5016,20 @@ const PERMISSION_TYPE_INTERFACE_FIELDS = {
4515
5016
  ["MCP_SERVERS"]: "mcpServers",
4516
5017
  ["REMOTE_AGENTS"]: "remoteAgents",
4517
5018
  ["SKILLS"]: "skills",
4518
- ["SHARED_LINKS"]: "sharedLinks"
5019
+ ["SHARED_LINKS"]: "sharedLinks",
5020
+ ["SCHEDULES"]: "schedules"
4519
5021
  };
4520
5022
  /** Set of interface config field names that correspond to role permissions. */
4521
5023
  const INTERFACE_PERMISSION_FIELDS = new Set(Object.values(PERMISSION_TYPE_INTERFACE_FIELDS));
4522
5024
  /**
5025
+ * Interface fields that seed a permission (use/create) BUT also carry runtime
5026
+ * config that must survive DB/tenant/user overrides. For these, override
5027
+ * sanitizers strip only the permission sub-keys (use/create) from the object
5028
+ * form and PRESERVE the boolean form — for `schedules`, `interface.schedules: false`
5029
+ * is the runtime feature disable that `getLimits` reads, not a permission toggle.
5030
+ */
5031
+ const RUNTIME_CONFIG_INTERFACE_FIELDS = new Set(["schedules"]);
5032
+ /**
4523
5033
  * YAML sub-keys within composite interface permission fields that map to permission bits.
4524
5034
  * When an interface permission field is an object, only these sub-keys are stripped from
4525
5035
  * DB overrides — other sub-keys (like `placeholder`, `trustCheckbox`) are UI-only and pass through.
@@ -4620,6 +5130,10 @@ const skillPermissionsSchema = zod.z.object({
4620
5130
  ["SHARE"]: zod.z.boolean().default(false),
4621
5131
  ["SHARE_PUBLIC"]: zod.z.boolean().default(false)
4622
5132
  });
5133
+ const schedulesPermissionsSchema = zod.z.object({
5134
+ ["USE"]: zod.z.boolean().default(true),
5135
+ ["CREATE"]: zod.z.boolean().default(true)
5136
+ });
4623
5137
  const sharedLinksPermissionsSchema = zod.z.object({
4624
5138
  ["CREATE"]: zod.z.boolean().default(true),
4625
5139
  ["SHARE"]: zod.z.boolean().default(true),
@@ -4641,7 +5155,8 @@ const permissionsSchema = zod.z.object({
4641
5155
  ["MCP_SERVERS"]: mcpServersPermissionsSchema,
4642
5156
  ["REMOTE_AGENTS"]: remoteAgentsPermissionsSchema,
4643
5157
  ["SKILLS"]: skillPermissionsSchema,
4644
- ["SHARED_LINKS"]: sharedLinksPermissionsSchema
5158
+ ["SHARED_LINKS"]: sharedLinksPermissionsSchema,
5159
+ ["SCHEDULES"]: schedulesPermissionsSchema
4645
5160
  });
4646
5161
  //#endregion
4647
5162
  //#region src/roles.ts
@@ -4722,6 +5237,10 @@ const defaultRolesSchema = zod.z.object({
4722
5237
  ["CREATE"]: zod.z.boolean().default(true),
4723
5238
  ["SHARE"]: zod.z.boolean().default(true),
4724
5239
  ["SHARE_PUBLIC"]: zod.z.boolean().default(true)
5240
+ }),
5241
+ ["SCHEDULES"]: schedulesPermissionsSchema.extend({
5242
+ ["USE"]: zod.z.boolean().default(true),
5243
+ ["CREATE"]: zod.z.boolean().default(true)
4725
5244
  })
4726
5245
  })
4727
5246
  }),
@@ -4795,6 +5314,10 @@ const roleDefaults = defaultRolesSchema.parse({
4795
5314
  ["CREATE"]: true,
4796
5315
  ["SHARE"]: true,
4797
5316
  ["SHARE_PUBLIC"]: true
5317
+ },
5318
+ ["SCHEDULES"]: {
5319
+ ["USE"]: true,
5320
+ ["CREATE"]: true
4798
5321
  }
4799
5322
  }
4800
5323
  },
@@ -4850,6 +5373,10 @@ const roleDefaults = defaultRolesSchema.parse({
4850
5373
  ["CREATE"]: true,
4851
5374
  ["SHARE"]: true,
4852
5375
  ["SHARE_PUBLIC"]: true
5376
+ },
5377
+ ["SCHEDULES"]: {
5378
+ ["USE"]: true,
5379
+ ["CREATE"]: true
4853
5380
  }
4854
5381
  }
4855
5382
  }
@@ -4869,6 +5396,337 @@ let InvocationMode = /* @__PURE__ */ function(InvocationMode) {
4869
5396
  return InvocationMode;
4870
5397
  }({});
4871
5398
  //#endregion
5399
+ //#region src/types/schedules.ts
5400
+ /** Cadences the dialog builds from structured pickers (hour, minute, weekday). */
5401
+ const scheduleStructuredFrequencies = [
5402
+ "hourly",
5403
+ "daily",
5404
+ "weekdays",
5405
+ "weekly"
5406
+ ];
5407
+ const scheduleFrequencies = [...scheduleStructuredFrequencies, "cron"];
5408
+ /** Bounds a stored expression. Generous for five fields, because each one can hold a
5409
+ * list: an every-minute-of-the-hour cadence spelled out runs past two hundred chars. */
5410
+ const SCHEDULE_CRON_MAX_LENGTH = 256;
5411
+ const scheduleTargets = ["new"];
5412
+ const structuredCadenceSchema = zod.z.object({
5413
+ frequency: zod.z.enum(scheduleStructuredFrequencies),
5414
+ hour: zod.z.number().int().min(0).max(23),
5415
+ minute: zod.z.number().int().min(0).max(59),
5416
+ daysOfWeek: zod.z.array(zod.z.number().int().min(0).max(6)).min(1).max(7).transform((days) => Array.from(new Set(days))).optional()
5417
+ });
5418
+ /**
5419
+ * A raw cron expression carries its own hour and minute, so it cannot share the
5420
+ * structured shape: there is no single `hour` for `0 9,17 * * 1-5`. Syntax is
5421
+ * validated server-side by croner, the same parser the engine fires from, rather
5422
+ * than by a regex that would accept patterns croner then rejects at fire time.
5423
+ */
5424
+ const cronCadenceSchema = zod.z.object({
5425
+ frequency: zod.z.literal("cron"),
5426
+ expression: zod.z.string().trim().min(1).max(256)
5427
+ });
5428
+ const scheduleCadenceSchema = zod.z.discriminatedUnion("frequency", [structuredCadenceSchema, cronCadenceSchema]);
5429
+ const isCronCadence = (cadence) => cadence.frequency === "cron";
5430
+ const createSchedulePayloadSchema = zod.z.object({
5431
+ name: zod.z.string().trim().min(1).max(256),
5432
+ prompt: zod.z.string().trim().min(1).max(32e3),
5433
+ agent_id: zod.z.string().trim().min(1),
5434
+ cadence: scheduleCadenceSchema,
5435
+ timezone: zod.z.string().min(1),
5436
+ target: zod.z.enum(scheduleTargets).default("new"),
5437
+ file_ids: zod.z.array(zod.z.string()).max(10).transform((ids) => Array.from(new Set(ids))).optional(),
5438
+ /**
5439
+ * Chat project each run's conversation is filed under. `null` clears the scope.
5440
+ * Ownership is checked server-side at write time and again at every fire, so a
5441
+ * deleted project disables the schedule instead of silently filing runs loose.
5442
+ */
5443
+ chatProjectId: zod.z.string().trim().min(1).nullable().optional(),
5444
+ enabled: zod.z.boolean().default(true),
5445
+ /**
5446
+ * Client-generated key making creation idempotent across retries. Creation commits
5447
+ * the row and arms it in two writes, so a failure between them leaves the client
5448
+ * unable to tell whether anything persisted; retrying blind can produce two recurring
5449
+ * schedules. A retry carrying the same key resolves to the original row instead.
5450
+ * REQUIRED: an optional key preserves the keyless duplicate path for any client
5451
+ * that omits it, which is exactly the failure the key exists to close.
5452
+ */
5453
+ clientRequestId: zod.z.string().trim().min(1).max(128)
5454
+ });
5455
+ /** Idempotency is a property of the CREATE attempt, not of the schedule's config. */
5456
+ const updateSchedulePayloadSchema = createSchedulePayloadSchema.omit({ clientRequestId: true }).partial().extend({
5457
+ /**
5458
+ * The configRevision the client's edit was computed from (captured when the
5459
+ * dialog opened). The server fences the update on it, so a concurrent edit
5460
+ * from another tab answers 409 instead of being silently overwritten by a
5461
+ * payload rebuilt from a stale snapshot (cadence is sent whole, so the
5462
+ * server-side fresh-read fence alone cannot detect this).
5463
+ */
5464
+ expectedConfigRevision: zod.z.number().int().min(0).optional() });
5465
+ /** Only structured schedule preflight failures may request immediate suspension. */
5466
+ function getScheduleMCPDisabledReason(outcomes) {
5467
+ const statuses = new Set(outcomes?.map((outcome) => outcome.status));
5468
+ if (statuses.has("mcp_permission_denied")) return "mcp_permission_denied";
5469
+ if (statuses.has("mcp_configuration_missing")) return "mcp_configuration_missing";
5470
+ if (statuses.has("mcp_reauth_required")) return "mcp_reauth_required";
5471
+ }
5472
+ const scheduleMCPOutcomeSchema = zod.z.object({
5473
+ server: zod.z.string(),
5474
+ /** Agent whose selected tool requires this server. Used to open the correct
5475
+ * recovery chat when the requirement belongs to a handoff or subagent. */
5476
+ agentId: zod.z.string().optional(),
5477
+ status: zod.z.enum([
5478
+ "ready",
5479
+ "mcp_reauth_required",
5480
+ "mcp_configuration_missing",
5481
+ "mcp_permission_denied",
5482
+ "mcp_unavailable"
5483
+ ])
5484
+ });
5485
+ function readScheduleMCPOutcomes(error) {
5486
+ if (!error || !/^mcp_(reauth_required|configuration_missing|permission_denied|unavailable): \[/.test(error)) return [];
5487
+ try {
5488
+ const result = scheduleMCPOutcomeSchema.array().safeParse(JSON.parse(error.slice(error.indexOf(": ") + 2)));
5489
+ return result.success ? result.data : [];
5490
+ } catch {
5491
+ return [];
5492
+ }
5493
+ }
5494
+ //#endregion
5495
+ //#region src/cadence.ts
5496
+ /** Mirrors the server default when a weekly cadence omits `daysOfWeek`. */
5497
+ const WEEKLY_DEFAULT_DAY = 1;
5498
+ /**
5499
+ * Minute, hour, day of month, month, day of week. croner also reads a six-field form
5500
+ * carrying seconds and a seven-field form that pins a year, and both are refused.
5501
+ * Seconds would promise a precision the runtime does not keep: the engine polls on a
5502
+ * thirty-second tick and offsets each schedule by up to two minutes of jitter. A pinned
5503
+ * year makes a cadence that runs out, and every caller here treats "no next occurrence"
5504
+ * as a cadence it cannot read.
5505
+ */
5506
+ const CRON_FIELD_COUNT = 5;
5507
+ /**
5508
+ * Spring-forward compresses consecutive wall-clock occurrences, so the ENFORCEABLE
5509
+ * minimum for day-and-longer gaps is the nominal gap minus the largest real-world
5510
+ * transition: two hours (Antarctica/Troll; every other zone shifts at most one).
5511
+ * A floor set exactly at the nominal value would otherwise admit a schedule that
5512
+ * genuinely violates it once a year. Hourly gaps are unaffected (the skipped hours
5513
+ * lengthen, never shorten, the gap between occurrences).
5514
+ */
5515
+ const DST_COMPRESSION_MINUTES = 120;
5516
+ /**
5517
+ * Occurrences sampled when measuring a cron expression's tightest gap. The floor
5518
+ * exists to reject expressions that fire too OFTEN, and a dense pattern reveals
5519
+ * its short gap within the first few occurrences, so a small window answers the
5520
+ * question this guards. Known limit: this is a bounded probe, not the exhaustive
5521
+ * proof the structured formulas give. An expression that is sparse for the next
5522
+ * `CRON_PROBE_OCCURRENCES` runs and dense later would pass here and be caught by
5523
+ * the fire-time recheck instead.
5524
+ */
5525
+ const CRON_PROBE_OCCURRENCES = 32;
5526
+ /** Enough to span four nominal gaps from an anchor two gaps before a transition,
5527
+ * which is what guarantees the straddling pair falls inside the window. */
5528
+ const TRANSITION_PROBE_OCCURRENCES = 5;
5529
+ /**
5530
+ * Compiles a cadence to the cron expression the engine fires from. Shared rather
5531
+ * than server-owned because the dialog previews the next runs, validates the
5532
+ * interval floor, and disables its own submit from these same functions: a second
5533
+ * client-side implementation would drift and either show run times the schedule
5534
+ * does not keep or accept a cadence the server then rejects.
5535
+ */
5536
+ function cadenceToCron(cadence) {
5537
+ if (cadence.frequency === "cron") return cadence.expression;
5538
+ const { frequency, hour, minute } = cadence;
5539
+ if (frequency === "hourly") return `${minute} * * * *`;
5540
+ if (frequency === "daily") return `${minute} ${hour} * * *`;
5541
+ if (frequency === "weekdays") return `${minute} ${hour} * * 1-5`;
5542
+ return `${minute} ${hour} * * ${[...cadence.daysOfWeek?.length ? cadence.daysOfWeek : [WEEKLY_DEFAULT_DAY]].sort((a, b) => a - b).join(",")}`;
5543
+ }
5544
+ /**
5545
+ * Everything `cronCadenceSchema` will accept: exactly five fields, within the length
5546
+ * the schema stores, and actually matching at some point. croner accepts syntactically
5547
+ * valid patterns that can never match (`0 0 30 2 *`), and those would arm a schedule
5548
+ * that never fires. Validated with croner rather than a regex, because a regex would
5549
+ * accept patterns croner then rejects at fire time.
5550
+ *
5551
+ * A five-field expression that matches at all matches forever, which is what lets every
5552
+ * caller keep reading "no next occurrence" as "this cadence is unreadable".
5553
+ */
5554
+ function isValidCronExpression(expression, timezone) {
5555
+ const trimmed = expression.trim();
5556
+ if (trimmed.length > 256) return false;
5557
+ if (trimmed.split(/\s+/).length !== CRON_FIELD_COUNT) return false;
5558
+ try {
5559
+ return new croner.Cron(trimmed, {
5560
+ timezone,
5561
+ paused: true
5562
+ }).nextRun() != null;
5563
+ } catch {
5564
+ return false;
5565
+ }
5566
+ }
5567
+ /**
5568
+ * The next occurrences the engine would fire. Server-side jitter (up to two
5569
+ * minutes) is deliberately not modelled: it is keyed off a schedule id that does
5570
+ * not exist yet at create time, and showing 9:01 for a 9:00 schedule reads as a bug.
5571
+ */
5572
+ function nextRunInstants(cadence, timezone, count) {
5573
+ try {
5574
+ const runs = new croner.Cron(cadenceToCron(cadence), {
5575
+ timezone,
5576
+ paused: true
5577
+ }).nextRuns(count);
5578
+ return runs.filter((run, index) => index === 0 || run.getTime() !== runs[index - 1].getTime());
5579
+ } catch {
5580
+ return [];
5581
+ }
5582
+ }
5583
+ const MINUTE_MS = 6e4;
5584
+ const DAY_MS = 1440 * MINUTE_MS;
5585
+ /** A year and a bit, so a zone with a single yearly transition always shows one. */
5586
+ const TRANSITION_SEARCH_DAYS = 400;
5587
+ const offsetFormatters = /* @__PURE__ */ new Map();
5588
+ /** Minutes east of UTC in `zone` at `instant`, read back from the wall clock the
5589
+ * zone renders. The only way to observe a zone's offset without a tz database. */
5590
+ function zoneOffsetMinutes(zone, instant) {
5591
+ let formatter = offsetFormatters.get(zone);
5592
+ if (formatter == null) {
5593
+ formatter = new Intl.DateTimeFormat("en-US", {
5594
+ timeZone: zone,
5595
+ hourCycle: "h23",
5596
+ year: "numeric",
5597
+ month: "2-digit",
5598
+ day: "2-digit",
5599
+ hour: "2-digit",
5600
+ minute: "2-digit",
5601
+ second: "2-digit"
5602
+ });
5603
+ offsetFormatters.set(zone, formatter);
5604
+ }
5605
+ const parts = {};
5606
+ for (const part of formatter.formatToParts(instant)) parts[part.type] = part.value;
5607
+ const wallClock = Date.UTC(Number(parts.year), Number(parts.month) - 1, Number(parts.day), Number(parts.hour), Number(parts.minute), Number(parts.second));
5608
+ return Math.round((wallClock - instant.getTime()) / MINUTE_MS);
5609
+ }
5610
+ /** Zone transitions are asked for once per fire, and the scan below costs ~10ms.
5611
+ * Keyed by day because that is how far the answer stays put as the window slides,
5612
+ * and cleared wholesale at the cap so a long-lived worker cannot accumulate an
5613
+ * entry per zone per day forever. */
5614
+ const transitionCache = /* @__PURE__ */ new Map();
5615
+ const TRANSITION_CACHE_MAX = 512;
5616
+ /**
5617
+ * Every instant `zone` changes its UTC offset within the search window; empty for a
5618
+ * fixed-offset zone. Both directions matter and only one of them shortens anything,
5619
+ * so taking just the next one would usually find the harmless fall-back and miss the
5620
+ * spring-forward six months behind it. Bracketed a day at a time, bisected to the
5621
+ * minute.
5622
+ */
5623
+ function offsetChanges(zone, from) {
5624
+ const day = Math.floor(from.getTime() / DAY_MS);
5625
+ const cacheKey = `${zone}:${day}`;
5626
+ const cached = transitionCache.get(cacheKey);
5627
+ if (cached != null) return cached;
5628
+ const changes = [];
5629
+ const start = /* @__PURE__ */ new Date((day - 1) * DAY_MS);
5630
+ let low = start.getTime();
5631
+ let baseOffset = zoneOffsetMinutes(zone, start);
5632
+ const end = low + TRANSITION_SEARCH_DAYS * DAY_MS;
5633
+ for (let probe = low + DAY_MS; probe <= end; probe += DAY_MS) {
5634
+ const offset = zoneOffsetMinutes(zone, new Date(probe));
5635
+ if (offset !== baseOffset) {
5636
+ let high = probe;
5637
+ let bracket = low;
5638
+ while (high - bracket > MINUTE_MS) {
5639
+ const mid = bracket + Math.floor((high - bracket) / 2);
5640
+ if (zoneOffsetMinutes(zone, new Date(mid)) === baseOffset) bracket = mid;
5641
+ else high = mid;
5642
+ }
5643
+ changes.push(new Date(high));
5644
+ baseOffset = offset;
5645
+ }
5646
+ low = probe;
5647
+ }
5648
+ if (transitionCache.size >= TRANSITION_CACHE_MAX) transitionCache.clear();
5649
+ transitionCache.set(cacheKey, changes);
5650
+ return changes;
5651
+ }
5652
+ function runsAfter(expression, from, zone, occurrences = CRON_PROBE_OCCURRENCES) {
5653
+ return new croner.Cron(expression, {
5654
+ timezone: zone,
5655
+ paused: true
5656
+ }).nextRuns(occurrences, from);
5657
+ }
5658
+ /** Tightest gap, in minutes, across `runs`; null when there is no pair to measure. */
5659
+ function minGapMinutes(runs) {
5660
+ if (runs.length < 2) return null;
5661
+ let minGapMs = Number.MAX_SAFE_INTEGER;
5662
+ for (let i = 1; i < runs.length; i++) {
5663
+ const gapMs = runs[i].getTime() - runs[i - 1].getTime();
5664
+ if (gapMs <= 0) continue;
5665
+ minGapMs = Math.min(minGapMs, gapMs);
5666
+ }
5667
+ if (minGapMs === Number.MAX_SAFE_INTEGER) return null;
5668
+ return Math.floor(minGapMs / MINUTE_MS);
5669
+ }
5670
+ function probeMinGapMinutes(expression, zone, from, occurrences = CRON_PROBE_OCCURRENCES) {
5671
+ return minGapMinutes(runsAfter(expression, from, zone, occurrences));
5672
+ }
5673
+ /**
5674
+ * Smallest gap in minutes between occurrences. Returns 0 for an unparseable or
5675
+ * never-matching expression so every floor rejects it, failing closed rather than
5676
+ * admitting an expression the engine cannot fire.
5677
+ *
5678
+ * Measured twice, and the smaller wins:
5679
+ *
5680
+ * 1. Nominal, probed in UTC, then discounted by the same worst-case DST allowance
5681
+ * the structured branches assume. This keeps `0 9 * * *` reporting exactly what
5682
+ * the Daily preset reports, so the same schedule cannot be admitted in one form
5683
+ * and rejected in the other.
5684
+ * 2. Real elapsed time in the schedule's own zone, across each of that zone's
5685
+ * transitions. Spring-forward compresses a gap that straddles one
5686
+ * (`0 0,12 * * *` in America/New_York is 11 hours that day, not 12), and step 1
5687
+ * only discounts gaps of a day or more, so a subdaily gap needs measuring rather
5688
+ * than estimating. Anchoring at the transition is what makes a bounded probe see
5689
+ * it at all: from today it is usually months outside any reasonable window.
5690
+ */
5691
+ function cronIntervalMinutes(expression, timezone) {
5692
+ try {
5693
+ const now = /* @__PURE__ */ new Date();
5694
+ const nominal = probeMinGapMinutes(expression, "UTC", now);
5695
+ if (nominal == null) return 0;
5696
+ const estimate = nominal < 1440 ? nominal : Math.max(0, nominal - DST_COMPRESSION_MINUTES);
5697
+ if (timezone == null || estimate === 0) return estimate;
5698
+ const anchorBackMs = 2 * Math.max(nominal, 1) * MINUTE_MS;
5699
+ let smallest = estimate;
5700
+ for (const transition of offsetChanges(timezone, now)) {
5701
+ const measured = probeMinGapMinutes(expression, timezone, new Date(Math.max(now.getTime(), transition.getTime() - anchorBackMs)), TRANSITION_PROBE_OCCURRENCES);
5702
+ if (measured != null) smallest = Math.min(smallest, measured);
5703
+ }
5704
+ return smallest;
5705
+ } catch {
5706
+ return 0;
5707
+ }
5708
+ }
5709
+ /**
5710
+ * Minimum minutes between occurrences, for the admin interval floor. `timezone` is
5711
+ * the schedule's own; passing it lets the cron branch measure a DST-compressed gap
5712
+ * instead of estimating one. The structured branches are zone-independent: their
5713
+ * formulas already carry the worst-case allowance.
5714
+ */
5715
+ function cadenceIntervalMinutes(cadence, timezone) {
5716
+ if (isCronCadence(cadence)) return cronIntervalMinutes(cadence.expression, timezone);
5717
+ if (cadence.frequency === "hourly") return 60;
5718
+ if (cadence.frequency === "daily" || cadence.frequency === "weekdays") return 1440 - DST_COMPRESSION_MINUTES;
5719
+ const days = cadence.daysOfWeek?.length ? Array.from(new Set(cadence.daysOfWeek)) : [WEEKLY_DEFAULT_DAY];
5720
+ if (days.length <= 1) return 10080 - DST_COMPRESSION_MINUTES;
5721
+ const sorted = [...days].sort((a, b) => a - b);
5722
+ let minGapDays = 7;
5723
+ for (let i = 0; i < sorted.length; i++) {
5724
+ const gap = i + 1 < sorted.length ? sorted[i + 1] - sorted[i] : 7 - sorted[i] + sorted[0];
5725
+ minGapDays = Math.min(minGapDays, gap);
5726
+ }
5727
+ return minGapDays * 24 * 60 - DST_COMPRESSION_MINUTES;
5728
+ }
5729
+ //#endregion
4872
5730
  //#region src/types/skills.ts
4873
5731
  /**
4874
5732
  * Shared skill validation constants — the single source of truth for name,
@@ -4901,6 +5759,252 @@ let DATE_RANGE = /* @__PURE__ */ function(DATE_RANGE) {
4901
5759
  return DATE_RANGE;
4902
5760
  }({});
4903
5761
  //#endregion
5762
+ //#region src/types/insights.ts
5763
+ const INSIGHTS_MAX_RANGE_DAYS = 30;
5764
+ const INSIGHTS_SEARCH_MIN_LENGTH = 3;
5765
+ const INSIGHTS_SEARCH_MAX_LENGTH = 200;
5766
+ const INSIGHTS_AGENT_ID_MAX_LENGTH = 256;
5767
+ //#endregion
5768
+ //#region src/types/traces.ts
5769
+ const TRACE_CURSOR_MAX_LENGTH = 4096;
5770
+ const TRACE_SOURCE_ID_MAX_LENGTH = 128;
5771
+ const TRACE_RECORD_ID_MAX_LENGTH = 256;
5772
+ //#endregion
5773
+ //#region src/types/queuedTurns.ts
5774
+ const agentQueuedTurnStatuses = [
5775
+ "queued",
5776
+ "claimed",
5777
+ "admitted",
5778
+ "cancelled",
5779
+ "dead"
5780
+ ];
5781
+ const agentQueuedTurnDurability = ["process_local", "durable"];
5782
+ const agentQueuedTurnFileRefSchema = zod.z.object({
5783
+ file_id: zod.z.string().trim().min(1),
5784
+ type: zod.z.string().optional(),
5785
+ filepath: zod.z.string().optional(),
5786
+ filename: zod.z.string().optional(),
5787
+ height: zod.z.number().optional(),
5788
+ width: zod.z.number().optional(),
5789
+ bytes: zod.z.number().nonnegative().optional()
5790
+ });
5791
+ const enqueueAgentQueuedTurnSchema = zod.z.object({
5792
+ conversationId: zod.z.string().trim().min(1),
5793
+ parentMessageId: zod.z.string().trim().min(1),
5794
+ clientRequestId: zod.z.string().trim().min(1).max(128),
5795
+ text: zod.z.string(),
5796
+ files: zod.z.array(agentQueuedTurnFileRefSchema).optional(),
5797
+ quotes: zod.z.array(zod.z.string()).optional(),
5798
+ manualSkills: zod.z.array(zod.z.string().trim().min(1)).optional(),
5799
+ priority: zod.z.boolean().optional(),
5800
+ expectedPredecessorCreatedAt: zod.z.number().int().nonnegative().optional()
5801
+ });
5802
+ const listAgentQueuedTurnsSchema = zod.z.object({
5803
+ conversationId: zod.z.string().trim().min(1),
5804
+ clientRequestIds: zod.z.array(zod.z.string().trim().min(1).max(128)).max(100).transform((ids) => Array.from(new Set(ids))).optional()
5805
+ });
5806
+ const cancelAgentQueuedTurnSchema = zod.z.object({ queuedTurnId: zod.z.string().trim().min(1) });
5807
+ const agentQueuedTurnReceiptSchema = enqueueAgentQueuedTurnSchema.extend({
5808
+ queuedTurnId: zod.z.string().trim().min(1),
5809
+ status: zod.z.enum(agentQueuedTurnStatuses),
5810
+ /** Effective generation boundary consumed by an admitted turn. This can
5811
+ * advance beyond the originally captured root as queued turns chain. */
5812
+ effectivePredecessorCreatedAt: zod.z.number().int().nonnegative().optional(),
5813
+ /** Explicitly proves that this admission consumed no predecessor boundary. */
5814
+ rootPredecessor: zod.z.literal(true).optional(),
5815
+ position: zod.z.number().int().nonnegative().optional(),
5816
+ /** Immutable queue sequence retained as `revision` for wire compatibility. */
5817
+ revision: zod.z.number().int().nonnegative(),
5818
+ failure: zod.z.object({
5819
+ code: zod.z.string().trim().min(1).max(128),
5820
+ message: zod.z.string().max(2048).optional()
5821
+ }).optional(),
5822
+ createdAt: zod.z.string(),
5823
+ updatedAt: zod.z.string()
5824
+ });
5825
+ const agentQueuedTurnCapabilitySchema = zod.z.discriminatedUnion("supported", [zod.z.object({ supported: zod.z.literal(false) }), zod.z.object({
5826
+ supported: zod.z.literal(true),
5827
+ durability: zod.z.enum(agentQueuedTurnDurability)
5828
+ })]);
5829
+ const enqueueAgentQueuedTurnResponseSchema = zod.z.object({
5830
+ receipt: agentQueuedTurnReceiptSchema,
5831
+ capability: agentQueuedTurnCapabilitySchema
5832
+ });
5833
+ const listAgentQueuedTurnsResponseSchema = zod.z.object({
5834
+ queuedTurns: zod.z.array(agentQueuedTurnReceiptSchema),
5835
+ capability: agentQueuedTurnCapabilitySchema,
5836
+ revision: zod.z.number().int().nonnegative()
5837
+ });
5838
+ const cancelAgentQueuedTurnResponseSchema = zod.z.object({ receipt: agentQueuedTurnReceiptSchema });
5839
+ //#endregion
5840
+ //#region src/providers.ts
5841
+ /** Canonical provider identity used for branding across client and server. */
5842
+ let ProviderId = /* @__PURE__ */ function(ProviderId) {
5843
+ ProviderId["openai"] = "openai";
5844
+ ProviderId["anthropic"] = "anthropic";
5845
+ ProviderId["google"] = "google";
5846
+ ProviderId["azure"] = "azure";
5847
+ ProviderId["bedrock"] = "bedrock";
5848
+ ProviderId["xai"] = "xai";
5849
+ ProviderId["moonshot"] = "moonshot";
5850
+ ProviderId["anyscale"] = "anyscale";
5851
+ ProviderId["apipie"] = "apipie";
5852
+ ProviderId["cohere"] = "cohere";
5853
+ ProviderId["deepseek"] = "deepseek";
5854
+ ProviderId["fireworks"] = "fireworks";
5855
+ ProviderId["groq"] = "groq";
5856
+ ProviderId["helicone"] = "helicone";
5857
+ ProviderId["huggingface"] = "huggingface";
5858
+ ProviderId["lemonade"] = "lemonade";
5859
+ ProviderId["mistral"] = "mistral";
5860
+ ProviderId["mlx"] = "mlx";
5861
+ ProviderId["ollama"] = "ollama";
5862
+ ProviderId["openrouter"] = "openrouter";
5863
+ ProviderId["perplexity"] = "perplexity";
5864
+ ProviderId["qwen"] = "qwen";
5865
+ ProviderId["shuttleai"] = "shuttleai";
5866
+ ProviderId["together"] = "together";
5867
+ ProviderId["unify"] = "unify";
5868
+ ProviderId["vercel"] = "vercel";
5869
+ return ProviderId;
5870
+ }({});
5871
+ const endpointToProvider = {
5872
+ ["openAI"]: "openai",
5873
+ ["azureOpenAI"]: "azure",
5874
+ ["anthropic"]: "anthropic",
5875
+ ["google"]: "google",
5876
+ ["bedrock"]: "bedrock"
5877
+ };
5878
+ const knownEndpointToProvider = {
5879
+ ["anyscale"]: "anyscale",
5880
+ ["apipie"]: "apipie",
5881
+ ["cohere"]: "cohere",
5882
+ ["fireworks"]: "fireworks",
5883
+ ["deepseek"]: "deepseek",
5884
+ ["moonshot"]: "moonshot",
5885
+ ["groq"]: "groq",
5886
+ ["helicone"]: "helicone",
5887
+ ["huggingface"]: "huggingface",
5888
+ ["lemonade"]: "lemonade",
5889
+ ["mistral"]: "mistral",
5890
+ ["mlx"]: "mlx",
5891
+ ["ollama"]: "ollama",
5892
+ ["openrouter"]: "openrouter",
5893
+ ["perplexity"]: "perplexity",
5894
+ ["shuttleai"]: "shuttleai",
5895
+ ["together.ai"]: "together",
5896
+ ["unify"]: "unify",
5897
+ ["vercel"]: "vercel",
5898
+ ["xai"]: "xai"
5899
+ };
5900
+ const providerAliases = {
5901
+ chatgpt: "openai",
5902
+ gpt: "openai",
5903
+ azureopenai: "azure",
5904
+ claude: "anthropic",
5905
+ gemini: "google",
5906
+ gemma: "google",
5907
+ vertex: "google",
5908
+ vertexai: "google",
5909
+ palm: "google",
5910
+ awsbedrock: "bedrock",
5911
+ grok: "xai",
5912
+ kimi: "moonshot",
5913
+ moonshotai: "moonshot",
5914
+ amdlemonade: "lemonade",
5915
+ lemonadeserver: "lemonade",
5916
+ mistralai: "mistral",
5917
+ togetherai: "together"
5918
+ };
5919
+ const modelCatalogAliases = { ["vertexai"]: "google" };
5920
+ const normalize = (input) => input.toLowerCase().replace(/[\s._-]/g, "");
5921
+ const providerByNormalizedId = Object.values(ProviderId).reduce((acc, id) => {
5922
+ acc[normalize(id)] = id;
5923
+ return acc;
5924
+ }, {});
5925
+ /** Resolves free-form provider text to a canonical id, ignoring case and separators. */
5926
+ function resolveProviderId(input) {
5927
+ if (!input) return null;
5928
+ const key = normalize(input);
5929
+ return providerByNormalizedId[key] ?? providerAliases[key] ?? null;
5930
+ }
5931
+ /** Resolves a runtime provider to its model catalog, using a native alias only when needed. */
5932
+ function resolveModelCatalogKey(provider, catalogs) {
5933
+ const key = provider ?? "";
5934
+ return catalogs?.[key] != null ? key : modelCatalogAliases[key] ?? key;
5935
+ }
5936
+ //#endregion
5937
+ //#region src/svg.ts
5938
+ /**
5939
+ * DOMPurify policy for user-provided SVG icons, shared by the browser uploader and
5940
+ * the server trust boundary so a preview and the persisted icon cannot disagree.
5941
+ * `use` is re-added for self-contained `<defs>` references (targets restricted by
5942
+ * `restrictSvgReferences`); every SMIL element is forbidden so a stored icon
5943
+ * cannot animate forever wherever it renders.
5944
+ */
5945
+ const SVG_SANITIZE_CONFIG = {
5946
+ USE_PROFILES: {
5947
+ svg: true,
5948
+ svgFilters: true
5949
+ },
5950
+ ADD_TAGS: ["use"],
5951
+ ADD_ATTR: ["fr"],
5952
+ FORBID_TAGS: [
5953
+ "script",
5954
+ "foreignObject",
5955
+ "style",
5956
+ "a",
5957
+ "image",
5958
+ "animate",
5959
+ "animateColor",
5960
+ "animateMotion",
5961
+ "animateTransform",
5962
+ "mpath",
5963
+ "set"
5964
+ ],
5965
+ FORBID_ATTR: ["style"]
5966
+ };
5967
+ const URL_TOKEN_PREFIX = /url\(\s*['"]?\s*/gi;
5968
+ /**
5969
+ * True when every `url()` token targets a fragment. Backslashes reject the value
5970
+ * outright: CSS unescapes idents before tokenizing, so `u\72l(...)` is a `url()`.
5971
+ */
5972
+ function referencesOnlyFragments(value) {
5973
+ if (value.includes("\\")) return false;
5974
+ if (!value.toLowerCase().includes("url(")) return true;
5975
+ URL_TOKEN_PREFIX.lastIndex = 0;
5976
+ while (URL_TOKEN_PREFIX.exec(value) !== null) if (value[URL_TOKEN_PREFIX.lastIndex] !== "#") return false;
5977
+ return true;
5978
+ }
5979
+ /** DOMPurify hook that drops every attribute referencing outside the document. */
5980
+ function restrictSvgReferences(node) {
5981
+ const names = [];
5982
+ for (let i = 0; i < node.attributes.length; i += 1) names.push(node.attributes[i].name);
5983
+ for (const name of names) {
5984
+ const value = node.getAttribute(name)?.trim();
5985
+ if (value == null) continue;
5986
+ if (name === "href" || name === "xlink:href") {
5987
+ if (!value.startsWith("#")) node.removeAttribute(name);
5988
+ continue;
5989
+ }
5990
+ if (!referencesOnlyFragments(value)) node.removeAttribute(name);
5991
+ }
5992
+ }
5993
+ /** SVG names the HTML parser lowercases and its adjustment table does not restore. */
5994
+ const UNADJUSTED_SVG_TAGS = [[/(<\/?)fedropshadow\b/gi, "$1feDropShadow"]];
5995
+ const SVG_ROOT_TAG = /<svg(\s[^>]*)?>/i;
5996
+ /**
5997
+ * Makes HTML-mode sanitizer output valid as a standalone `image/svg+xml`
5998
+ * document: restores camelCase element names the HTML parser lowercased and
5999
+ * declares the SVG namespace on the root, without which an XML parser puts the
6000
+ * root in no namespace and the icon renders blank.
6001
+ */
6002
+ function finalizeSvgMarkup(markup) {
6003
+ let restored = markup;
6004
+ for (const [pattern, canonical] of UNADJUSTED_SVG_TAGS) restored = restored.replace(pattern, canonical);
6005
+ return restored.replace(SVG_ROOT_TAG, (tag, attributes) => attributes != null && /\sxmlns\s*=/i.test(attributes) ? tag : `<svg xmlns="http://www.w3.org/2000/svg"${attributes ?? ""}>`);
6006
+ }
6007
+ //#endregion
4904
6008
  //#region src/actions.ts
4905
6009
  function sha1(input) {
4906
6010
  return crypto.default.createHash("sha1").update(input).digest("hex");
@@ -5384,11 +6488,13 @@ function getUserTimezone() {
5384
6488
  }
5385
6489
  }
5386
6490
  function createPayload(submission) {
5387
- const { isEdited, addedConvo, userMessage, isContinued, isTemporary, isRegenerate, conversation, editedContent, ephemeralAgent, endpointOption, manualSkills, clientRequestId, recoverySteerId, expectedPredecessorCreatedAt } = submission;
6491
+ const { isEdited, addedConvo, userMessage, isContinued, isTemporary, isRegenerate, compact, conversation, editedContent, ephemeralAgent, endpointOption, manualSkills, codeApprovalMode, codeEnvironmentMode, codeWorkspaces, clientRequestId, recoverySteerId, expectedPredecessorCreatedAt } = submission;
5388
6492
  const { conversationId } = require_data_service.tConvoUpdateSchema.parse(conversation);
5389
6493
  const { endpoint: _e, endpointType } = endpointOption;
5390
6494
  const endpoint = _e;
5391
- let server = `${require_data_service.EndpointURLs["agents"]}/${endpoint}`;
6495
+ /** Custom endpoint names are user-defined and may contain `/`, which would
6496
+ * otherwise split into extra path segments and miss the `/:endpoint` route. */
6497
+ let server = `${require_data_service.EndpointURLs["agents"]}/${encodeURIComponent(endpoint)}`;
5392
6498
  if (require_data_service.isAssistantsEndpoint(endpoint)) server = require_data_service.EndpointURLs[endpointType ?? endpoint] + (isEdited ? "/modify" : "");
5393
6499
  const payload = {
5394
6500
  ...userMessage,
@@ -5396,12 +6502,18 @@ function createPayload(submission) {
5396
6502
  endpoint,
5397
6503
  addedConvo,
5398
6504
  isTemporary,
5399
- isRegenerate,
6505
+ /** A compaction borrows the regenerate shape client-side only: the server
6506
+ * must see it as a compaction, never as a regenerated user turn. */
6507
+ isRegenerate: compact === true ? void 0 : isRegenerate,
6508
+ ...compact === true && { compact: true },
5400
6509
  editedContent,
5401
6510
  conversationId,
5402
6511
  isContinued: !!(isEdited && isContinued),
5403
6512
  ephemeralAgent: require_data_service.isAssistantsEndpoint(endpoint) ? void 0 : ephemeralAgent,
5404
6513
  manualSkills: require_data_service.isAssistantsEndpoint(endpoint) ? void 0 : manualSkills,
6514
+ codeApprovalMode: require_data_service.isAssistantsEndpoint(endpoint) ? void 0 : codeApprovalMode,
6515
+ codeEnvironmentMode: require_data_service.isAssistantsEndpoint(endpoint) ? void 0 : codeEnvironmentMode,
6516
+ codeWorkspaces: require_data_service.isAssistantsEndpoint(endpoint) ? void 0 : codeWorkspaces,
5405
6517
  timezone: getUserTimezone(),
5406
6518
  clientRequestId,
5407
6519
  recoverySteerId,
@@ -5464,28 +6576,6 @@ const baseDefinitions = {
5464
6576
  optionType: "conversation",
5465
6577
  minTags: 0,
5466
6578
  maxTags: 4
5467
- },
5468
- imageDetail: {
5469
- key: "imageDetail",
5470
- label: "com_endpoint_plug_image_detail",
5471
- labelCode: true,
5472
- description: "com_endpoint_openai_detail",
5473
- descriptionCode: true,
5474
- type: "enum",
5475
- default: "auto",
5476
- component: "slider",
5477
- options: [
5478
- "low",
5479
- "auto",
5480
- "high"
5481
- ],
5482
- enumMappings: {
5483
- ["low"]: "com_ui_low",
5484
- ["auto"]: "com_ui_auto",
5485
- ["high"]: "com_ui_high"
5486
- },
5487
- optionType: "conversation",
5488
- columnSpan: 2
5489
6579
  }
5490
6580
  };
5491
6581
  const createDefinition = (base, overrides) => {
@@ -5543,6 +6633,30 @@ const librechat = {
5543
6633
  placeholderCode: true,
5544
6634
  optionType: "model"
5545
6635
  },
6636
+ /** Controls how LibreChat encodes image content blocks, not a provider request
6637
+ * parameter — so it belongs to this group and is stripped from model options. */
6638
+ imageDetail: {
6639
+ key: "imageDetail",
6640
+ label: "com_endpoint_plug_image_detail",
6641
+ labelCode: true,
6642
+ description: "com_endpoint_openai_detail",
6643
+ descriptionCode: true,
6644
+ type: "enum",
6645
+ default: "auto",
6646
+ component: "slider",
6647
+ options: [
6648
+ "low",
6649
+ "auto",
6650
+ "high"
6651
+ ],
6652
+ enumMappings: {
6653
+ ["low"]: "com_ui_low",
6654
+ ["auto"]: "com_ui_auto",
6655
+ ["high"]: "com_ui_high"
6656
+ },
6657
+ optionType: "conversation",
6658
+ columnSpan: 2
6659
+ },
5546
6660
  fileTokenLimit: {
5547
6661
  key: "fileTokenLimit",
5548
6662
  label: "com_ui_file_token_limit",
@@ -6121,6 +7235,14 @@ const meta = {
6121
7235
  })
6122
7236
  };
6123
7237
  const google = {
7238
+ /** Bounds the hand-rolled editor enforced through InputNumber, and they stay
7239
+ * scoped to this endpoint: the shared definition is rendered by every other
7240
+ * endpoint, whose own context windows may fall outside them. */
7241
+ maxContextTokens: createDefinition(librechat.maxContextTokens, { range: {
7242
+ min: require_data_service.googleSettings.maxContextTokens.min,
7243
+ max: require_data_service.googleSettings.maxContextTokens.max,
7244
+ step: require_data_service.googleSettings.maxContextTokens.step
7245
+ } }),
6124
7246
  temperature: createDefinition(baseDefinitions.temperature, {
6125
7247
  default: require_data_service.googleSettings.temperature.default,
6126
7248
  range: {
@@ -6260,7 +7382,7 @@ const google = {
6260
7382
  const googleConfig = [
6261
7383
  librechat.modelLabel,
6262
7384
  librechat.promptPrefix,
6263
- librechat.maxContextTokens,
7385
+ google.maxContextTokens,
6264
7386
  google.maxOutputTokens,
6265
7387
  google.temperature,
6266
7388
  google.topP,
@@ -6279,7 +7401,7 @@ const googleCol1 = [
6279
7401
  librechat.promptPrefix
6280
7402
  ];
6281
7403
  const googleCol2 = [
6282
- librechat.maxContextTokens,
7404
+ google.maxContextTokens,
6283
7405
  google.maxOutputTokens,
6284
7406
  google.temperature,
6285
7407
  google.topP,
@@ -6303,7 +7425,7 @@ const openAI = [
6303
7425
  openAIParams.presence_penalty,
6304
7426
  baseDefinitions.stop,
6305
7427
  librechat.resendFiles,
6306
- baseDefinitions.imageDetail,
7428
+ librechat.imageDetail,
6307
7429
  openAIParams.web_search,
6308
7430
  openAIParams.reasoning_effort,
6309
7431
  openAIParams.useResponsesApi,
@@ -6333,7 +7455,7 @@ const openAICol2 = [
6333
7455
  openAIParams.presence_penalty,
6334
7456
  baseDefinitions.stop,
6335
7457
  librechat.resendFiles,
6336
- baseDefinitions.imageDetail,
7458
+ librechat.imageDetail,
6337
7459
  openAIParams.reasoning_effort,
6338
7460
  openAIParams.reasoning_summary,
6339
7461
  openAIParams.reasoning_mode,
@@ -6574,6 +7696,38 @@ const paramSettings = {
6574
7696
  [`bedrock-zai`]: bedrockZAI,
6575
7697
  ["google"]: googleConfig
6576
7698
  };
7699
+ /**
7700
+ * Maps effective backend param names for OpenAI-compatible/Azure endpoints (as deleted from
7701
+ * `llmConfig` via `dropParams`, e.g. `maxTokens`) to their corresponding UI/conversation keys
7702
+ * (e.g. `max_tokens`). Native providers (anthropic, google, bedrock, ...) already render these
7703
+ * same camelCase names as their UI key (e.g. `topP`), so this alias must only be applied to
7704
+ * OpenAI-compatible parameter sets — see `resolveDropParamsUIKeys`.
7705
+ */
7706
+ const dropParamsBackendToUIKey = {
7707
+ maxTokens: "max_tokens",
7708
+ topP: "top_p",
7709
+ frequencyPenalty: "frequency_penalty",
7710
+ presencePenalty: "presence_penalty"
7711
+ };
7712
+ /** Endpoint keys whose parameter settings render the OpenAI-compatible (snake_case) UI keys. */
7713
+ const openAILikeParamEndpointKeys = new Set([
7714
+ "openAI",
7715
+ "azureOpenAI",
7716
+ "custom",
7717
+ "openrouter"
7718
+ ]);
7719
+ /**
7720
+ * Normalizes an admin-configured `dropParams` list into the UI/conversation keys used to hide
7721
+ * the matching controls in the settings panels. `endpointKey` should be the same key used to
7722
+ * resolve the panel's parameter settings (e.g. `overriddenEndpointKey`); the backend-name alias
7723
+ * is only applied for OpenAI-compatible endpoints, since native providers (anthropic, google,
7724
+ * bedrock, ...) already use these backend names as their UI key.
7725
+ */
7726
+ function resolveDropParamsUIKeys(dropParams, endpointKey) {
7727
+ if (!dropParams || dropParams.length === 0) return /* @__PURE__ */ new Set();
7728
+ if (!openAILikeParamEndpointKeys.has(endpointKey)) return new Set(dropParams);
7729
+ return new Set(dropParams.map((param) => dropParamsBackendToUIKey[param] ?? param));
7730
+ }
6577
7731
  const openAIColumns = {
6578
7732
  col1: openAICol1,
6579
7733
  col2: openAICol2
@@ -6640,13 +7794,71 @@ const agentParamSettings = Object.entries(presetSettings).reduce((acc, [key, val
6640
7794
  * Resolves model-aware defaults for a settings configuration before rendering.
6641
7795
  * Google's `maxOutputTokens` default depends on the selected Gemini model so that
6642
7796
  * current models (2.5 and 3+) surface their 64K output limit instead of the legacy 8K value.
7797
+ * Anthropic prompt-cache controls are only surfaced for models that support them.
6643
7798
  */
6644
7799
  function applyModelAwareDefaults(settings, endpoint, model) {
6645
- if (endpoint !== "google" || !model) return settings;
6646
- return settings.map((setting) => setting.key === "maxOutputTokens" ? {
6647
- ...setting,
6648
- default: require_data_service.googleSettings.maxOutputTokens.reset(model)
6649
- } : setting);
7800
+ if (!model) return settings;
7801
+ const modelAwareSettings = endpoint === "google" ? settings.map((setting) => {
7802
+ if (setting.key === "maxOutputTokens") return {
7803
+ ...setting,
7804
+ default: require_data_service.googleSettings.maxOutputTokens.reset(model)
7805
+ };
7806
+ /** The shared thinking budget range is model-agnostic, so it caps Pro below
7807
+ * its real ceiling and accepts Flash values the provider rejects. The
7808
+ * maximum and the positive floor move together. `range.min` stays -1 so
7809
+ * the "decide automatically" sentinel remains typeable. */
7810
+ if (setting.key === "thinkingBudget" && setting.range != null) {
7811
+ const bounds = require_data_service.getGoogleThinkingBudgetBounds(model);
7812
+ if (bounds != null) return {
7813
+ ...setting,
7814
+ range: {
7815
+ ...setting.range,
7816
+ max: bounds.max,
7817
+ positiveMin: bounds.min,
7818
+ modelSpecific: true
7819
+ }
7820
+ };
7821
+ }
7822
+ return setting;
7823
+ }) : settings;
7824
+ if (endpoint !== "anthropic" || supportsPromptCache(model)) return modelAwareSettings;
7825
+ return modelAwareSettings.filter((setting) => setting.key !== "promptCache" && setting.key !== "promptCacheTtl");
7826
+ }
7827
+ //#endregion
7828
+ //#region src/agentToolOptions.ts
7829
+ const actionDomainSeparatorRegex = /* @__PURE__ */ new RegExp("---", "g");
7830
+ /**
7831
+ * Collapses the encoded-domain suffix of an action tool name to the shape used
7832
+ * by runtime tool definitions. The operation id is deliberately preserved.
7833
+ */
7834
+ function normalizeActionToolName(toolName) {
7835
+ if (!require_data_service.isActionTool(toolName)) return toolName;
7836
+ const prefixEnd = toolName.lastIndexOf(require_data_service.actionDelimiter) + require_data_service.actionDelimiter.length;
7837
+ const encodedDomain = toolName.slice(prefixEnd);
7838
+ return toolName.slice(0, prefixEnd) + encodedDomain.replace(actionDomainSeparatorRegex, "_");
7839
+ }
7840
+ /**
7841
+ * Removes Code Interpreter as an allowed caller without mutating the input.
7842
+ * Tool entries and unrelated options are preserved; an empty entry is removed.
7843
+ */
7844
+ function removeCodeExecutionCaller(toolOptions) {
7845
+ if (toolOptions == null) return toolOptions;
7846
+ const normalized = {};
7847
+ for (const [toolName, options] of Object.entries(toolOptions)) {
7848
+ const callers = options.allowed_callers;
7849
+ if (callers?.includes("code_execution") !== true) {
7850
+ normalized[toolName] = options;
7851
+ continue;
7852
+ }
7853
+ const allowedCallers = callers.filter((caller) => caller !== "code_execution");
7854
+ const { allowed_callers: _removed, ...remainingOptions } = options;
7855
+ const nextOptions = allowedCallers.length > 0 ? {
7856
+ ...remainingOptions,
7857
+ allowed_callers: allowedCallers
7858
+ } : remainingOptions;
7859
+ if (Object.keys(nextOptions).length > 0) normalized[toolName] = nextOptions;
7860
+ }
7861
+ return normalized;
6650
7862
  }
6651
7863
  //#endregion
6652
7864
  //#region src/codeEnvRef.ts
@@ -6673,7 +7885,56 @@ const CODE_ENV_KINDS = [
6673
7885
  "agent",
6674
7886
  "user"
6675
7887
  ];
7888
+ function getCodeEnvRefForProfile(refs, routeKey) {
7889
+ const profileRef = refs?.codeEnvRefs?.[routeKey];
7890
+ if (profileRef) return profileRef;
7891
+ const legacyRef = refs?.codeEnvRef;
7892
+ if (legacyRef && (legacyRef.executionRouteKey ?? legacyRef.executionProfile ?? "default") === routeKey) return legacyRef;
7893
+ }
7894
+ /** Adds one profile pointer without discarding the other profile's storage object. */
7895
+ function mergeCodeEnvRef(refs, ref) {
7896
+ const codeEnvRefs = { ...refs?.codeEnvRefs };
7897
+ const legacyRef = refs?.codeEnvRef;
7898
+ if (legacyRef) codeEnvRefs[legacyRef.executionRouteKey ?? legacyRef.executionProfile ?? "default"] ??= legacyRef;
7899
+ const routeKey = ref.executionRouteKey ?? ref.executionProfile ?? "default";
7900
+ codeEnvRefs[routeKey] = ref;
7901
+ return {
7902
+ codeEnvRef: codeEnvRefs.default ?? codeEnvRefs.stateful ?? ref,
7903
+ codeEnvRefs
7904
+ };
7905
+ }
7906
+ /** Enumerates every deployment-local pointer, including legacy single-pointer records. */
7907
+ function getCodeEnvRefs(refs) {
7908
+ const merged = { ...refs?.codeEnvRefs };
7909
+ const legacyRef = refs?.codeEnvRef;
7910
+ if (legacyRef) merged[legacyRef.executionRouteKey ?? legacyRef.executionProfile ?? "default"] ??= legacyRef;
7911
+ return Object.entries(merged).flatMap(([routeKey, ref]) => ref ? [[routeKey, ref]] : []);
7912
+ }
7913
+ //#endregion
7914
+ //#region src/code/worker.ts
7915
+ function isCodeWorkerShell(value) {
7916
+ return value === "posix" || value === "powershell";
7917
+ }
7918
+ function quotePosix(value) {
7919
+ return `'${value.replace(/'/g, `'\\''`)}'`;
7920
+ }
7921
+ function quotePowerShell(value) {
7922
+ return `'${value.replace(/'/g, "''")}'`;
7923
+ }
7924
+ function createCodeWorkerSetupCommand(pairing, shell, options = {}) {
7925
+ const quote = shell === "powershell" ? quotePowerShell : quotePosix;
7926
+ const pair = `librechat-code pair ${quote(pairing.endpoint)} ${quote(pairing.code)} --worker-id ${quote(pairing.workerId)}`;
7927
+ const run = ["librechat-code run", ...[
7928
+ options.defaultWorkspace === false ? null : "--default-workspace",
7929
+ options.allowWorkspaceWrites === true ? "--allow-workspace-writes" : null,
7930
+ options.allowWorkspaceCommands === true ? "--allow-workspace-commands" : null
7931
+ ].filter((value) => value != null)].join(" ");
7932
+ if (shell === "powershell") return `${pair}\n$env:LIBRECHAT_CODE_WORKER_ID = ${quote(pairing.workerId)}\n${run}`;
7933
+ return `${pair}\nLIBRECHAT_CODE_WORKER_ID=${quote(pairing.workerId)} ${run}`;
7934
+ }
6676
7935
  //#endregion
7936
+ exports.ACTION_METADATA_FILTER_FIELDS = require_data_service.ACTION_METADATA_FILTER_FIELDS;
7937
+ exports.AGENT_INSTRUCTION_FILTER_FIELDS = require_data_service.AGENT_INSTRUCTION_FILTER_FIELDS;
6677
7938
  exports.AUTH_USER_DOC_BY_ID_PREFIX = require_data_service.AUTH_USER_DOC_BY_ID_PREFIX;
6678
7939
  exports.AccessRoleIds = require_data_service.AccessRoleIds;
6679
7940
  exports.ActionRequest = ActionRequest;
@@ -6694,30 +7955,51 @@ exports.BEDROCK_FINE_GRAINED_TOOL_STREAMING_BETA = BEDROCK_FINE_GRAINED_TOOL_STR
6694
7955
  exports.BEDROCK_OUTPUT_128K_BETA = BEDROCK_OUTPUT_128K_BETA;
6695
7956
  exports.BedrockProviders = require_data_service.BedrockProviders;
6696
7957
  exports.BedrockReasoningConfig = require_data_service.BedrockReasoningConfig;
7958
+ exports.CODE_APPROVAL_MODES = require_data_service.CODE_APPROVAL_MODES;
7959
+ exports.CODE_ENVIRONMENT_COMMAND_TIMEOUT_DEFAULT_MS = require_data_service.CODE_ENVIRONMENT_COMMAND_TIMEOUT_DEFAULT_MS;
7960
+ exports.CODE_ENVIRONMENT_COMMAND_TIMEOUT_HARD_MAX_MS = require_data_service.CODE_ENVIRONMENT_COMMAND_TIMEOUT_HARD_MAX_MS;
7961
+ exports.CODE_ENVIRONMENT_DECISION_VERSION = require_data_service.CODE_ENVIRONMENT_DECISION_VERSION;
7962
+ exports.CODE_ENVIRONMENT_MODES = require_data_service.CODE_ENVIRONMENT_MODES;
6697
7963
  exports.CODE_ENV_KINDS = CODE_ENV_KINDS;
7964
+ exports.CODE_WORKSPACE_ID_PATTERN = require_data_service.CODE_WORKSPACE_ID_PATTERN;
7965
+ exports.CODE_WORKSPACE_MAX_COUNT = require_data_service.CODE_WORKSPACE_MAX_COUNT;
7966
+ exports.CODE_WORKSPACE_OPERATIONS = require_data_service.CODE_WORKSPACE_OPERATIONS;
7967
+ exports.CODE_WORKSPACE_SELECTION_ERROR_REASONS = require_data_service.CODE_WORKSPACE_SELECTION_ERROR_REASONS;
7968
+ exports.CONVERSATION_STARTER_FILTER_FIELDS = require_data_service.CONVERSATION_STARTER_FILTER_FIELDS;
7969
+ exports.CONVERSATION_TITLE_FILTER_FIELDS = require_data_service.CONVERSATION_TITLE_FILTER_FIELDS;
6698
7970
  exports.CacheKeys = require_data_service.CacheKeys;
6699
7971
  exports.Capabilities = require_data_service.Capabilities;
7972
+ exports.CodeApprovalModeError = require_data_service.CodeApprovalModeError;
6700
7973
  exports.CohereConstants = require_data_service.CohereConstants;
6701
7974
  exports.ComponentTypes = require_data_service.ComponentTypes;
6702
7975
  exports.Constants = require_data_service.Constants;
6703
7976
  exports.ContentTypes = ContentTypes;
6704
7977
  exports.DATE_RANGE = DATE_RANGE;
6705
7978
  exports.DEFAULT_MEMORY_MAX_INPUT_TOKENS = require_data_service.DEFAULT_MEMORY_MAX_INPUT_TOKENS;
7979
+ exports.DefaultLLMDeliveryPath = require_data_service.DefaultLLMDeliveryPath;
6706
7980
  exports.DynamicQueryKeys = require_data_service.DynamicQueryKeys;
6707
7981
  exports.EImageOutputType = require_data_service.EImageOutputType;
6708
7982
  exports.EModelEndpoint = require_data_service.EModelEndpoint;
6709
7983
  exports.EToolResources = require_data_service.EToolResources;
6710
7984
  exports.EndpointURLs = require_data_service.EndpointURLs;
6711
7985
  exports.ErrorTypes = require_data_service.ErrorTypes;
7986
+ exports.FEEDBACK_FILTER_FIELDS = require_data_service.FEEDBACK_FILTER_FIELDS;
6712
7987
  exports.FEEDBACK_RATINGS = require_data_service.FEEDBACK_RATINGS;
6713
7988
  exports.FEEDBACK_REASON_KEYS = require_data_service.FEEDBACK_REASON_KEYS;
6714
7989
  exports.FEEDBACK_TAGS = require_data_service.FEEDBACK_TAGS;
7990
+ exports.FILE_FILTER_FIELDS = require_data_service.FILE_FILTER_FIELDS;
7991
+ exports.FILTER_PII_STARTER_PATTERNS = require_data_service.FILTER_PII_STARTER_PATTERNS;
6715
7992
  exports.FetchTokenConfig = require_data_service.FetchTokenConfig;
6716
7993
  exports.FileContext = require_data_service.FileContext;
6717
7994
  exports.FilePurpose = require_data_service.FilePurpose;
6718
7995
  exports.FileSources = require_data_service.FileSources;
6719
7996
  exports.ForkOptions = require_data_service.ForkOptions;
6720
7997
  exports.FunctionSignature = FunctionSignature;
7998
+ exports.HITL_MESSAGE_FILTER_FIELDS = require_data_service.HITL_MESSAGE_FILTER_FIELDS;
7999
+ exports.INSIGHTS_AGENT_ID_MAX_LENGTH = INSIGHTS_AGENT_ID_MAX_LENGTH;
8000
+ exports.INSIGHTS_MAX_RANGE_DAYS = INSIGHTS_MAX_RANGE_DAYS;
8001
+ exports.INSIGHTS_SEARCH_MAX_LENGTH = INSIGHTS_SEARCH_MAX_LENGTH;
8002
+ exports.INSIGHTS_SEARCH_MIN_LENGTH = INSIGHTS_SEARCH_MIN_LENGTH;
6721
8003
  exports.INTERFACE_PERMISSION_FIELDS = INTERFACE_PERMISSION_FIELDS;
6722
8004
  exports.ImageDetail = require_data_service.ImageDetail;
6723
8005
  exports.ImageDetailCost = require_data_service.ImageDetailCost;
@@ -6725,15 +8007,36 @@ exports.ImageVisionTool = require_data_service.ImageVisionTool;
6725
8007
  exports.InfiniteCollections = require_data_service.InfiniteCollections;
6726
8008
  exports.InvocationMode = InvocationMode;
6727
8009
  exports.KnownEndpoints = require_data_service.KnownEndpoints;
8010
+ exports.LANGFUSE_TRACE_CONVERSATION_METADATA_FIELDS = require_data_service.LANGFUSE_TRACE_CONVERSATION_METADATA_FIELDS;
8011
+ exports.LANGFUSE_TRACE_USER_ID_FIELDS = require_data_service.LANGFUSE_TRACE_USER_ID_FIELDS;
8012
+ exports.LANGFUSE_TRACE_USER_METADATA_FIELDS = require_data_service.LANGFUSE_TRACE_USER_METADATA_FIELDS;
6728
8013
  exports.LocalStorageKeys = require_data_service.LocalStorageKeys;
8014
+ exports.MAX_CHAT_PROJECT_DESCRIPTION_LENGTH = require_data_service.MAX_CHAT_PROJECT_DESCRIPTION_LENGTH;
8015
+ exports.MAX_CHAT_PROJECT_NAME_LENGTH = require_data_service.MAX_CHAT_PROJECT_NAME_LENGTH;
8016
+ exports.MAX_GRAPH_SUBAGENT_MEMBERS = require_data_service.MAX_GRAPH_SUBAGENT_MEMBERS;
8017
+ exports.MAX_MCP_ICON_PATH_LENGTH = require_data_service.MAX_MCP_ICON_PATH_LENGTH;
8018
+ exports.MAX_PII_CUSTOM_PATTERNS_TOTAL = require_data_service.MAX_PII_CUSTOM_PATTERNS_TOTAL;
8019
+ exports.MAX_PII_CUSTOM_REGEX_CHARACTERS = require_data_service.MAX_PII_CUSTOM_REGEX_CHARACTERS;
8020
+ exports.MAX_PII_CUSTOM_REGEX_INSTRUCTIONS = require_data_service.MAX_PII_CUSTOM_REGEX_INSTRUCTIONS;
8021
+ exports.MAX_PII_PATTERNS_PER_SOURCE = require_data_service.MAX_PII_PATTERNS_PER_SOURCE;
8022
+ exports.MAX_PII_PATTERN_ID_LENGTH = require_data_service.MAX_PII_PATTERN_ID_LENGTH;
8023
+ exports.MAX_PII_PATTERN_LABEL_LENGTH = require_data_service.MAX_PII_PATTERN_LABEL_LENGTH;
8024
+ exports.MAX_PII_PATTERN_LENGTH = require_data_service.MAX_PII_PATTERN_LENGTH;
6729
8025
  exports.MAX_SUBAGENTS = require_data_service.MAX_SUBAGENTS;
8026
+ exports.MAX_SUBAGENTS_CEILING = require_data_service.MAX_SUBAGENTS_CEILING;
6730
8027
  exports.MAX_SUBAGENT_DEPTH = require_data_service.MAX_SUBAGENT_DEPTH;
6731
8028
  exports.MAX_SUBAGENT_GRAPH_NODES = require_data_service.MAX_SUBAGENT_GRAPH_NODES;
6732
8029
  exports.MAX_SUBAGENT_RUN_CONFIGS = require_data_service.MAX_SUBAGENT_RUN_CONFIGS;
6733
8030
  exports.MCPOptionsSchema = require_data_service.MCPOptionsSchema;
6734
8031
  exports.MCPServerUserInputSchema = require_data_service.MCPServerUserInputSchema;
6735
8032
  exports.MCPServersSchema = require_data_service.MCPServersSchema;
8033
+ exports.MCP_SERVER_TITLE_ERROR = require_data_service.MCP_SERVER_TITLE_ERROR;
8034
+ exports.MCP_SERVER_TITLE_PATTERN = require_data_service.MCP_SERVER_TITLE_PATTERN;
6736
8035
  exports.MCP_USER_INPUT_FIELDS = require_data_service.MCP_USER_INPUT_FIELDS;
8036
+ exports.MEMORY_FILTER_FIELDS = require_data_service.MEMORY_FILTER_FIELDS;
8037
+ exports.MESSAGE_FILTER_FIELDS = require_data_service.MESSAGE_FILTER_FIELDS;
8038
+ exports.MIN_REPORTABLE_RUN_STEP_DURATION_MS = MIN_REPORTABLE_RUN_STEP_DURATION_MS;
8039
+ exports.MODEL_PARAMETER_FILTER_FIELDS = require_data_service.MODEL_PARAMETER_FILTER_FIELDS;
6737
8040
  exports.MYTHOS_CLASS_FAMILIES = require_data_service.MYTHOS_CLASS_FAMILIES;
6738
8041
  exports.MemoryScope = require_data_service.MemoryScope;
6739
8042
  exports.MessageContentTypes = require_data_service.MessageContentTypes;
@@ -6742,17 +8045,21 @@ exports.OCRStrategy = require_data_service.OCRStrategy;
6742
8045
  exports.OptionTypes = require_data_service.OptionTypes;
6743
8046
  exports.PERMISSION_SUB_KEYS = PERMISSION_SUB_KEYS;
6744
8047
  exports.PERMISSION_TYPE_INTERFACE_FIELDS = PERMISSION_TYPE_INTERFACE_FIELDS;
8048
+ exports.PROMPT_FILTER_FIELDS = require_data_service.PROMPT_FILTER_FIELDS;
6745
8049
  exports.PermissionBits = require_data_service.PermissionBits;
6746
8050
  exports.PermissionTypes = PermissionTypes;
6747
8051
  exports.Permissions = Permissions;
6748
8052
  exports.PrincipalModel = require_data_service.PrincipalModel;
6749
8053
  exports.PrincipalType = require_data_service.PrincipalType;
8054
+ exports.ProviderId = ProviderId;
6750
8055
  exports.Providers = require_data_service.Providers;
6751
8056
  exports.QueryKeys = require_data_service.QueryKeys;
6752
8057
  exports.REFILL_INTERVAL_UNITS = require_data_service.REFILL_INTERVAL_UNITS;
8058
+ exports.RUNTIME_CONFIG_INTERFACE_FIELDS = RUNTIME_CONFIG_INTERFACE_FIELDS;
6753
8059
  exports.RateLimitPrefix = require_data_service.RateLimitPrefix;
6754
8060
  exports.ReasoningContext = require_data_service.ReasoningContext;
6755
8061
  exports.ReasoningEffort = require_data_service.ReasoningEffort;
8062
+ exports.ReasoningLabelEvents = ReasoningLabelEvents;
6756
8063
  exports.ReasoningMode = require_data_service.ReasoningMode;
6757
8064
  exports.ReasoningParameterFormat = require_data_service.ReasoningParameterFormat;
6758
8065
  exports.ReasoningResponseKey = require_data_service.ReasoningResponseKey;
@@ -6761,11 +8068,13 @@ exports.RerankerTypes = require_data_service.RerankerTypes;
6761
8068
  exports.ResourceType = require_data_service.ResourceType;
6762
8069
  exports.RetentionMode = require_data_service.RetentionMode;
6763
8070
  exports.RunStatus = require_data_service.RunStatus;
8071
+ exports.SCHEDULE_CRON_MAX_LENGTH = SCHEDULE_CRON_MAX_LENGTH;
6764
8072
  exports.SEPARATORS = SEPARATORS;
6765
8073
  exports.SKILL_BODY_MAX_LENGTH = SKILL_BODY_MAX_LENGTH;
6766
8074
  exports.SKILL_DESCRIPTION_MAX_LENGTH = SKILL_DESCRIPTION_MAX_LENGTH;
6767
8075
  exports.SKILL_DESCRIPTION_SHORT_THRESHOLD = SKILL_DESCRIPTION_SHORT_THRESHOLD;
6768
8076
  exports.SKILL_DISPLAY_TITLE_MAX_LENGTH = SKILL_DISPLAY_TITLE_MAX_LENGTH;
8077
+ exports.SKILL_FILTER_FIELDS = require_data_service.SKILL_FILTER_FIELDS;
6769
8078
  exports.SKILL_NAME_MAX_LENGTH = SKILL_NAME_MAX_LENGTH;
6770
8079
  exports.SKILL_NAME_PATTERN = SKILL_NAME_PATTERN;
6771
8080
  exports.SKILL_SYNC_DEFAULT_DISCOVERY_DEPTH = require_data_service.SKILL_SYNC_DEFAULT_DISCOVERY_DEPTH;
@@ -6773,7 +8082,11 @@ exports.SKILL_SYNC_MAX_DISCOVERY_DEPTH = require_data_service.SKILL_SYNC_MAX_DIS
6773
8082
  exports.SKILL_SYNC_MAX_INTERVAL_MINUTES = require_data_service.SKILL_SYNC_MAX_INTERVAL_MINUTES;
6774
8083
  exports.SKILL_SYNC_MIN_INTERVAL_MINUTES = require_data_service.SKILL_SYNC_MIN_INTERVAL_MINUTES;
6775
8084
  exports.SSEOptionsSchema = require_data_service.SSEOptionsSchema;
8085
+ exports.STATEFUL_CODE_ENVIRONMENTS = require_data_service.STATEFUL_CODE_ENVIRONMENTS;
8086
+ exports.STORED_MESSAGE_FILTER_FIELDS = require_data_service.STORED_MESSAGE_FILTER_FIELDS;
6776
8087
  exports.STTProviders = require_data_service.STTProviders;
8088
+ exports.SVG_SANITIZE_CONFIG = SVG_SANITIZE_CONFIG;
8089
+ exports.SYSTEM_LLM_DELIVERY_DEFAULTS = SYSTEM_LLM_DELIVERY_DEFAULTS;
6777
8090
  exports.SafeSearchTypes = require_data_service.SafeSearchTypes;
6778
8091
  exports.ScraperProviders = require_data_service.ScraperProviders;
6779
8092
  exports.SearchCategories = require_data_service.SearchCategories;
@@ -6781,6 +8094,7 @@ exports.SearchProviders = require_data_service.SearchProviders;
6781
8094
  exports.SettingTypes = require_data_service.SettingTypes;
6782
8095
  exports.SettingsTabValues = require_data_service.SettingsTabValues;
6783
8096
  exports.SettingsViews = require_data_service.SettingsViews;
8097
+ exports.SkillsScope = require_data_service.SkillsScope;
6784
8098
  exports.StdioOptionsSchema = require_data_service.StdioOptionsSchema;
6785
8099
  exports.SteerEvents = SteerEvents;
6786
8100
  exports.StepEvents = StepEvents;
@@ -6789,6 +8103,10 @@ exports.StepTypes = StepTypes;
6789
8103
  exports.StreamableHTTPOptionsSchema = require_data_service.StreamableHTTPOptionsSchema;
6790
8104
  exports.SystemCategories = require_data_service.SystemCategories;
6791
8105
  exports.SystemRoles = SystemRoles;
8106
+ exports.TOOL_ARGUMENT_FILTER_FIELDS = require_data_service.TOOL_ARGUMENT_FILTER_FIELDS;
8107
+ exports.TRACE_CURSOR_MAX_LENGTH = TRACE_CURSOR_MAX_LENGTH;
8108
+ exports.TRACE_RECORD_ID_MAX_LENGTH = TRACE_RECORD_ID_MAX_LENGTH;
8109
+ exports.TRACE_SOURCE_ID_MAX_LENGTH = TRACE_SOURCE_ID_MAX_LENGTH;
6792
8110
  exports.TTSProviders = require_data_service.TTSProviders;
6793
8111
  exports.ThinkingDisplay = require_data_service.ThinkingDisplay;
6794
8112
  exports.ThinkingLevel = require_data_service.ThinkingLevel;
@@ -6806,8 +8124,16 @@ exports.accessRoleToPermBits = require_data_service.accessRoleToPermBits;
6806
8124
  exports.accordian = accordian;
6807
8125
  exports.actionDelimiter = require_data_service.actionDelimiter;
6808
8126
  exports.actionDomainSeparator = require_data_service.actionDomainSeparator;
8127
+ exports.actionMetadataFilterFieldSchema = require_data_service.actionMetadataFilterFieldSchema;
8128
+ exports.agentGitIdentitySchema = require_data_service.agentGitIdentitySchema;
8129
+ exports.agentInstructionFilterFieldSchema = require_data_service.agentInstructionFilterFieldSchema;
6809
8130
  exports.agentParamSettings = agentParamSettings;
6810
8131
  exports.agentPermissionsSchema = agentPermissionsSchema;
8132
+ exports.agentQueuedTurnCapabilitySchema = agentQueuedTurnCapabilitySchema;
8133
+ exports.agentQueuedTurnDurability = agentQueuedTurnDurability;
8134
+ exports.agentQueuedTurnFileRefSchema = agentQueuedTurnFileRefSchema;
8135
+ exports.agentQueuedTurnReceiptSchema = agentQueuedTurnReceiptSchema;
8136
+ exports.agentQueuedTurnStatuses = agentQueuedTurnStatuses;
6811
8137
  exports.agentsBaseSchema = require_data_service.agentsBaseSchema;
6812
8138
  exports.agentsEndpointSchema = require_data_service.agentsEndpointSchema;
6813
8139
  exports.agentsSchema = require_data_service.agentsSchema;
@@ -6852,7 +8178,12 @@ exports.buildServerNameAliases = require_data_service.buildServerNameAliases;
6852
8178
  exports.buildTree = buildTree;
6853
8179
  exports.button = button;
6854
8180
  exports.cacheSubsetProviders = require_data_service.cacheSubsetProviders;
8181
+ exports.cadenceIntervalMinutes = cadenceIntervalMinutes;
8182
+ exports.cadenceToCron = cadenceToCron;
6855
8183
  exports.calendar = calendar;
8184
+ exports.canToolResourceConsume = canToolResourceConsume;
8185
+ exports.cancelAgentQueuedTurnResponseSchema = cancelAgentQueuedTurnResponseSchema;
8186
+ exports.cancelAgentQueuedTurnSchema = cancelAgentQueuedTurnSchema;
6856
8187
  exports.capsEffortWhenThinkingDisabled = capsEffortWhenThinkingDisabled;
6857
8188
  exports.card = card;
6858
8189
  exports.carousel = carousel;
@@ -6862,7 +8193,11 @@ exports.checkpointerSchema = require_data_service.checkpointerSchema;
6862
8193
  exports.checkpointerTypeSchema = require_data_service.checkpointerTypeSchema;
6863
8194
  exports.clampEffortForDisabledThinking = clampEffortForDisabledThinking;
6864
8195
  exports.clampOutputConfigEffort = clampOutputConfigEffort;
8196
+ exports.clampSettingRange = require_data_service.clampSettingRange;
6865
8197
  exports.cloudfrontConfigSchema = require_data_service.cloudfrontConfigSchema;
8198
+ exports.codeEnvironmentPermissionDecisionSchema = require_data_service.codeEnvironmentPermissionDecisionSchema;
8199
+ exports.codeEnvironmentUserConfigSchema = require_data_service.codeEnvironmentUserConfigSchema;
8200
+ exports.codeEnvironmentUserSettingsSchema = require_data_service.codeEnvironmentUserSettingsSchema;
6866
8201
  exports.codeInterpreterMimeTypes = require_data_service.codeInterpreterMimeTypes;
6867
8202
  exports.codeInterpreterMimeTypesList = require_data_service.codeInterpreterMimeTypesList;
6868
8203
  exports.codeTypeMapping = require_data_service.codeTypeMapping;
@@ -6874,9 +8209,14 @@ exports.compactAssistantSchema = require_data_service.compactAssistantSchema;
6874
8209
  exports.compactGoogleSchema = require_data_service.compactGoogleSchema;
6875
8210
  exports.configSchema = require_data_service.configSchema;
6876
8211
  exports.contextPruningSchema = require_data_service.contextPruningSchema;
8212
+ exports.conversationStarterFilterFieldSchema = require_data_service.conversationStarterFilterFieldSchema;
8213
+ exports.conversationTitleFilterFieldSchema = require_data_service.conversationTitleFilterFieldSchema;
6877
8214
  exports.convertStringsToRegex = require_data_service.convertStringsToRegex;
8215
+ exports.createCodeWorkerSetupCommand = createCodeWorkerSetupCommand;
6878
8216
  exports.createPayload = createPayload;
8217
+ exports.createSchedulePayloadSchema = createSchedulePayloadSchema;
6879
8218
  exports.createURL = createURL;
8219
+ exports.cronCadenceSchema = cronCadenceSchema;
6880
8220
  Object.defineProperty(exports, "dataService", {
6881
8221
  enumerable: true,
6882
8222
  get: function() {
@@ -6888,6 +8228,7 @@ exports.defaultAgentFormValues = require_data_service.defaultAgentFormValues;
6888
8228
  exports.defaultAssistantFormValues = require_data_service.defaultAssistantFormValues;
6889
8229
  exports.defaultAssistantsVersion = require_data_service.defaultAssistantsVersion;
6890
8230
  exports.defaultEndpoints = require_data_service.defaultEndpoints;
8231
+ exports.defaultLLMDeliveryPathSchema = require_data_service.defaultLLMDeliveryPathSchema;
6891
8232
  exports.defaultModels = require_data_service.defaultModels;
6892
8233
  exports.defaultOCRMimeTypes = require_data_service.defaultOCRMimeTypes;
6893
8234
  exports.defaultOrderQuery = require_data_service.defaultOrderQuery;
@@ -6917,6 +8258,9 @@ exports.encodeEphemeralAgentId = encodeEphemeralAgentId;
6917
8258
  exports.endpointFileConfigSchema = require_data_service.endpointFileConfigSchema;
6918
8259
  exports.endpointSchema = require_data_service.endpointSchema;
6919
8260
  exports.endpointSettings = require_data_service.endpointSettings;
8261
+ exports.endpointToProvider = endpointToProvider;
8262
+ exports.enqueueAgentQueuedTurnResponseSchema = enqueueAgentQueuedTurnResponseSchema;
8263
+ exports.enqueueAgentQueuedTurnSchema = enqueueAgentQueuedTurnSchema;
6920
8264
  exports.envVarRegex = require_data_service.envVarRegex;
6921
8265
  exports.errorsToString = errorsToString;
6922
8266
  exports.essentialShadcnComponents = essentialShadcnComponents;
@@ -6927,33 +8271,53 @@ exports.extendedModelEndpointSchema = require_data_service.extendedModelEndpoint
6927
8271
  exports.extractDomainFromUrl = extractDomainFromUrl;
6928
8272
  exports.extractEnvVariable = require_data_service.extractEnvVariable;
6929
8273
  exports.extractVariableName = require_data_service.extractVariableName;
8274
+ exports.feedbackFilterFieldSchema = require_data_service.feedbackFilterFieldSchema;
6930
8275
  exports.feedbackRatingSchema = require_data_service.feedbackRatingSchema;
6931
8276
  exports.feedbackSchema = require_data_service.feedbackSchema;
6932
8277
  exports.feedbackTagKeySchema = require_data_service.feedbackTagKeySchema;
6933
8278
  exports.fileCitationsPermissionsSchema = fileCitationsPermissionsSchema;
6934
8279
  exports.fileConfig = require_data_service.fileConfig;
6935
8280
  exports.fileConfigSchema = require_data_service.fileConfigSchema;
8281
+ exports.fileFilterFieldSchema = require_data_service.fileFilterFieldSchema;
6936
8282
  exports.fileSearchPermissionsSchema = fileSearchPermissionsSchema;
6937
8283
  exports.fileSourceSchema = require_data_service.fileSourceSchema;
6938
8284
  exports.fileStorageSchema = require_data_service.fileStorageSchema;
6939
8285
  exports.fileStrategiesSchema = require_data_service.fileStrategiesSchema;
8286
+ exports.filterPiiActionSchema = require_data_service.filterPiiActionSchema;
8287
+ exports.filterPiiCustomPatternSchema = require_data_service.filterPiiCustomPatternSchema;
8288
+ exports.filterPiiRegexSchema = require_data_service.filterPiiRegexSchema;
8289
+ exports.filterPiiStarterPatternSchema = require_data_service.filterPiiStarterPatternSchema;
8290
+ exports.filtersConfigSchema = require_data_service.filtersConfigSchema;
8291
+ exports.finalizeSvgMarkup = finalizeSvgMarkup;
6940
8292
  exports.findLastSeparatorIndex = findLastSeparatorIndex;
8293
+ exports.findMessageById = findMessageById;
6941
8294
  exports.fullMimeTypesList = require_data_service.fullMimeTypesList;
6942
8295
  exports.generateDynamicSchema = require_data_service.generateDynamicSchema;
6943
8296
  exports.generateGoogleSchema = require_data_service.generateGoogleSchema;
6944
8297
  exports.generateOpenAISchema = require_data_service.generateOpenAISchema;
8298
+ exports.getAllowedCodeApprovalModes = require_data_service.getAllowedCodeApprovalModes;
8299
+ exports.getCodeEnvRefForProfile = getCodeEnvRefForProfile;
8300
+ exports.getCodeEnvRefs = getCodeEnvRefs;
6945
8301
  exports.getConfigDefaults = require_data_service.getConfigDefaults;
6946
8302
  exports.getConfiguredMimeAccept = require_data_service.getConfiguredMimeAccept;
6947
8303
  exports.getDefaultParamsEndpoint = require_data_service.getDefaultParamsEndpoint;
8304
+ exports.getDocumentFileExtension = require_data_service.getDocumentFileExtension;
6948
8305
  exports.getEnabledEndpoints = getEnabledEndpoints;
6949
8306
  exports.getEndpointField = require_data_service.getEndpointField;
6950
8307
  exports.getEndpointFileConfig = require_data_service.getEndpointFileConfig;
8308
+ exports.getEphemeralSender = getEphemeralSender;
6951
8309
  exports.getFirstDefinedValue = getFirstDefinedValue;
8310
+ exports.getGoogleThinkingBudgetBounds = require_data_service.getGoogleThinkingBudgetBounds;
8311
+ exports.getGoogleThinkingBudgetMax = require_data_service.getGoogleThinkingBudgetMax;
8312
+ exports.getMaxSubagents = require_data_service.getMaxSubagents;
6952
8313
  exports.getModelKey = require_data_service.getModelKey;
6953
8314
  exports.getNonEmptyValue = getNonEmptyValue;
8315
+ exports.getPiiRegexProgramSize = require_data_service.getPiiRegexProgramSize;
6954
8316
  exports.getRefillEligibilityDate = require_data_service.getRefillEligibilityDate;
6955
8317
  exports.getResourcePermissionsResponseSchema = require_data_service.getResourcePermissionsResponseSchema;
6956
8318
  exports.getResponseSender = getResponseSender;
8319
+ exports.getRunStepDurationMs = getRunStepDurationMs;
8320
+ exports.getScheduleMCPDisabledReason = getScheduleMCPDisabledReason;
6957
8321
  exports.getSchemaDefaults = require_data_service.getSchemaDefaults;
6958
8322
  exports.getSettingsKeys = require_data_service.getSettingsKeys;
6959
8323
  exports.getTagByKey = require_data_service.getTagByKey;
@@ -6963,7 +8327,13 @@ exports.googleBaseSchema = require_data_service.googleBaseSchema;
6963
8327
  exports.googleGenConfigSchema = require_data_service.googleGenConfigSchema;
6964
8328
  exports.googleSchema = require_data_service.googleSchema;
6965
8329
  exports.googleSettings = require_data_service.googleSettings;
8330
+ exports.hasActiveFiltersConfig = require_data_service.hasActiveFiltersConfig;
8331
+ exports.hasActivePiiFields = require_data_service.hasActivePiiFields;
8332
+ exports.hasActivePiiPatterns = require_data_service.hasActivePiiPatterns;
6966
8333
  exports.hasPermissions = require_data_service.hasPermissions;
8334
+ exports.hasProcessMCPServerConfig = require_data_service.hasProcessMCPServerConfig;
8335
+ exports.hasTextExtractionPath = hasTextExtractionPath;
8336
+ exports.hasToolCallErrorPrefix = hasToolCallErrorPrefix;
6967
8337
  exports.hostImageIdSuffix = require_data_service.hostImageIdSuffix;
6968
8338
  exports.hostImageNamePrefix = require_data_service.hostImageNamePrefix;
6969
8339
  exports.hoverCard = hoverCard;
@@ -6984,42 +8354,76 @@ exports.isAnthropicDocumentType = require_data_service.isAnthropicDocumentType;
6984
8354
  exports.isAnthropicTextDocumentType = require_data_service.isAnthropicTextDocumentType;
6985
8355
  exports.isAssistantsEndpoint = require_data_service.isAssistantsEndpoint;
6986
8356
  exports.isBedrockDocumentType = require_data_service.isBedrockDocumentType;
8357
+ exports.isCodeEnvironmentMode = require_data_service.isCodeEnvironmentMode;
8358
+ exports.isCodeWorkerShell = isCodeWorkerShell;
8359
+ exports.isCodeWorkspaceSelection = require_data_service.isCodeWorkspaceSelection;
8360
+ exports.isCodeWorkspaceSelectionErrorReason = require_data_service.isCodeWorkspaceSelectionErrorReason;
8361
+ exports.isCodeWorkspaceSelections = require_data_service.isCodeWorkspaceSelections;
8362
+ exports.isCompactedLeaf = isCompactedLeaf;
8363
+ exports.isCronCadence = isCronCadence;
6987
8364
  exports.isDocumentSupportedProvider = require_data_service.isDocumentSupportedProvider;
6988
8365
  exports.isEphemeralAgentId = isEphemeralAgentId;
6989
8366
  exports.isImageVisionTool = require_data_service.isImageVisionTool;
8367
+ exports.isKnownProviderIdentifier = require_data_service.isKnownProviderIdentifier;
8368
+ exports.isMediaSupportedProvider = require_data_service.isMediaSupportedProvider;
8369
+ exports.isMessageFileUpload = require_data_service.isMessageFileUpload;
6990
8370
  exports.isMythosClassModel = require_data_service.isMythosClassModel;
8371
+ exports.isNativelyReadableText = isNativelyReadableText;
6991
8372
  exports.isOpenAILikeProvider = require_data_service.isOpenAILikeProvider;
6992
8373
  exports.isParamEndpoint = require_data_service.isParamEndpoint;
6993
8374
  exports.isPermissiveMimeConfig = require_data_service.isPermissiveMimeConfig;
8375
+ exports.isProcessMCPServerConfig = require_data_service.isProcessMCPServerConfig;
8376
+ exports.isProcessMCPServerField = require_data_service.isProcessMCPServerField;
6994
8377
  exports.isRemoteOidcUrlAllowed = require_data_service.isRemoteOidcUrlAllowed;
8378
+ exports.isReportableRunStepDuration = isReportableRunStepDuration;
8379
+ exports.isResponsesApiUpload = require_data_service.isResponsesApiUpload;
8380
+ exports.isSecureCodeEnvironmentControlURL = require_data_service.isSecureCodeEnvironmentControlURL;
6995
8381
  exports.isSensitiveEnvVar = require_data_service.isSensitiveEnvVar;
8382
+ exports.isSpeechProviderConfigured = require_data_service.isSpeechProviderConfigured;
6996
8383
  exports.isSystemRoleName = isSystemRoleName;
6997
8384
  exports.isThinkingDisabled = isThinkingDisabled;
6998
8385
  exports.isUUID = require_data_service.isUUID;
8386
+ exports.isUserInitiatedCompaction = isUserInitiatedCompaction;
8387
+ exports.isValidCronExpression = isValidCronExpression;
8388
+ exports.knownEndpointToProvider = knownEndpointToProvider;
6999
8389
  exports.label = label;
7000
8390
  exports.langfuseConfigSchema = require_data_service.langfuseConfigSchema;
8391
+ exports.langfuseTraceConfigSchema = require_data_service.langfuseTraceConfigSchema;
7001
8392
  exports.librechat = librechat;
8393
+ exports.listAgentQueuedTurnsResponseSchema = listAgentQueuedTurnsResponseSchema;
8394
+ exports.listAgentQueuedTurnsSchema = listAgentQueuedTurnsSchema;
8395
+ exports.listConfiguredSpeechProviders = require_data_service.listConfiguredSpeechProviders;
7002
8396
  exports.loginPage = require_data_service.loginPage;
7003
8397
  exports.mapGroupToAzureConfig = mapGroupToAzureConfig;
7004
8398
  exports.mapModelToAzureConfig = mapModelToAzureConfig;
7005
8399
  exports.marketplacePermissionsSchema = marketplacePermissionsSchema;
8400
+ exports.materializeModelSpecEndpoints = require_data_service.materializeModelSpecEndpoints;
7006
8401
  exports.mbToBytes = require_data_service.mbToBytes;
8402
+ exports.mcpRefreshDefaults = require_data_service.mcpRefreshDefaults;
7007
8403
  exports.mcpServersPermissionsSchema = mcpServersPermissionsSchema;
8404
+ exports.mediaSupportedProviders = require_data_service.mediaSupportedProviders;
7008
8405
  exports.megabyte = require_data_service.megabyte;
8406
+ exports.memoryFilterFieldSchema = require_data_service.memoryFilterFieldSchema;
7009
8407
  exports.memoryPermissionsSchema = memoryPermissionsSchema;
7010
8408
  exports.memorySchema = require_data_service.memorySchema;
7011
8409
  exports.menuBar = menuBar;
8410
+ exports.mergeCodeEnvRef = mergeCodeEnvRef;
7012
8411
  exports.mergeFileConfig = require_data_service.mergeFileConfig;
8412
+ exports.messageFilterFieldSchema = require_data_service.messageFilterFieldSchema;
7013
8413
  exports.messageFilterPiiSchema = require_data_service.messageFilterPiiSchema;
7014
8414
  exports.messageFilterSchema = require_data_service.messageFilterSchema;
7015
8415
  exports.mimeTypeAliases = require_data_service.mimeTypeAliases;
7016
8416
  exports.modelConfigSchema = require_data_service.modelConfigSchema;
8417
+ exports.modelParameterFilterFieldSchema = require_data_service.modelParameterFilterFieldSchema;
7017
8418
  exports.modelSpecSubagentsSchema = require_data_service.modelSpecSubagentsSchema;
7018
8419
  exports.modularEndpoints = require_data_service.modularEndpoints;
7019
8420
  exports.multiConvoPermissionsSchema = multiConvoPermissionsSchema;
7020
8421
  exports.navigationMenu = navigationMenu;
8422
+ exports.nextRunInstants = nextRunInstants;
8423
+ exports.normalizeActionToolName = normalizeActionToolName;
7021
8424
  exports.normalizeEndpointName = require_data_service.normalizeEndpointName;
7022
8425
  exports.normalizeMCPToolKey = require_data_service.normalizeMCPToolKey;
8426
+ exports.normalizeSearxngEngines = require_data_service.normalizeSearxngEngines;
7023
8427
  exports.normalizeServerName = require_data_service.normalizeServerName;
7024
8428
  exports.ocrSchema = require_data_service.ocrSchema;
7025
8429
  exports.omitsSamplingParameters = omitsSamplingParameters;
@@ -7030,6 +8434,7 @@ exports.openAISettings = require_data_service.openAISettings;
7030
8434
  exports.openRouterSchema = require_data_service.openRouterSchema;
7031
8435
  exports.openapiToFunction = openapiToFunction;
7032
8436
  exports.orderEndpointsConfig = orderEndpointsConfig;
8437
+ exports.outputTokensFromUsage = outputTokensFromUsage;
7033
8438
  exports.pagination = pagination;
7034
8439
  exports.paramDefinitionSchema = require_data_service.paramDefinitionSchema;
7035
8440
  exports.paramEndpoints = require_data_service.paramEndpoints;
@@ -7037,6 +8442,7 @@ exports.paramSettings = paramSettings;
7037
8442
  exports.parseCompactConvo = parseCompactConvo;
7038
8443
  exports.parseConvo = parseConvo;
7039
8444
  exports.parseEphemeralAgentId = parseEphemeralAgentId;
8445
+ exports.parseLangChainErrorCode = parseLangChainErrorCode;
7040
8446
  exports.parseTextParts = parseTextParts;
7041
8447
  exports.peoplePickerPermissionsSchema = peoplePickerPermissionsSchema;
7042
8448
  exports.permBitsToAccessLevel = require_data_service.permBitsToAccessLevel;
@@ -7046,32 +8452,60 @@ exports.popover = popover;
7046
8452
  exports.presetSettings = presetSettings;
7047
8453
  exports.principalSchema = require_data_service.principalSchema;
7048
8454
  exports.progress = progress;
8455
+ exports.promptFilterFieldSchema = require_data_service.promptFilterFieldSchema;
7049
8456
  exports.promptPermissionsSchema = promptPermissionsSchema;
7050
8457
  exports.promptTokensFromUsage = promptTokensFromUsage;
7051
8458
  exports.providerEndpointMap = require_data_service.providerEndpointMap;
7052
8459
  exports.radioGroup = radioGroup;
7053
8460
  exports.rateLimitSchema = require_data_service.rateLimitSchema;
8461
+ exports.readScheduleMCPOutcomes = readScheduleMCPOutcomes;
7054
8462
  exports.reconcileContextUsage = reconcileContextUsage;
8463
+ exports.reconcileContextUsageFromEvent = reconcileContextUsageFromEvent;
7055
8464
  exports.registerPage = require_data_service.registerPage;
7056
8465
  exports.remoteAgentsPermissionsSchema = remoteAgentsPermissionsSchema;
8466
+ exports.removeCodeExecutionCaller = removeCodeExecutionCaller;
7057
8467
  exports.removeNullishValues = require_data_service.removeNullishValues;
7058
8468
  exports.replaceSpecialVars = replaceSpecialVars;
7059
8469
  exports.request = require_data_service.request_default;
7060
8470
  exports.requiresExplicitThinkingDisabled = requiresExplicitThinkingDisabled;
8471
+ exports.resolveAgentSkillsScope = require_data_service.resolveAgentSkillsScope;
8472
+ exports.resolveAllowedStatefulCodeEnvironments = require_data_service.resolveAllowedStatefulCodeEnvironments;
8473
+ exports.resolveCodeApprovalMode = require_data_service.resolveCodeApprovalMode;
8474
+ exports.resolveCodePermissionDecision = require_data_service.resolveCodePermissionDecision;
8475
+ exports.resolveDefaultLLMDeliveryPath = resolveDefaultLLMDeliveryPath;
8476
+ exports.resolveDefaultUploadLLMDeliveryPath = resolveDefaultUploadLLMDeliveryPath;
8477
+ exports.resolveDropParamsUIKeys = resolveDropParamsUIKeys;
7061
8478
  exports.resolveEndpointType = require_data_service.resolveEndpointType;
8479
+ exports.resolveModelCatalogKey = resolveModelCatalogKey;
8480
+ exports.resolveModelSpecEndpoint = require_data_service.resolveModelSpecEndpoint;
8481
+ exports.resolveProviderId = resolveProviderId;
7062
8482
  exports.resolveRef = resolveRef;
8483
+ exports.resolveSandboxFilename = require_data_service.resolveSandboxFilename;
8484
+ exports.resolveStatefulCodeEnvironment = require_data_service.resolveStatefulCodeEnvironment;
7063
8485
  exports.resolveThinkingDisplay = resolveThinkingDisplay;
8486
+ exports.resolveTraceViewerConfig = require_data_service.resolveTraceViewerConfig;
8487
+ exports.resolveUploadDestination = resolveUploadDestination;
8488
+ exports.resolveUploadLLMDeliveryPath = resolveUploadLLMDeliveryPath;
8489
+ exports.resolveUseResponsesApi = require_data_service.resolveUseResponsesApi;
7064
8490
  exports.resourcePermissionsResponseSchema = require_data_service.resourcePermissionsResponseSchema;
8491
+ exports.restrictSvgReferences = restrictSvgReferences;
7065
8492
  exports.retainRecentConfigSchema = require_data_service.retainRecentConfigSchema;
7066
8493
  exports.retrievalMimeTypes = require_data_service.retrievalMimeTypes;
7067
8494
  exports.retrievalMimeTypesList = require_data_service.retrievalMimeTypesList;
7068
8495
  exports.roleDefaults = roleDefaults;
7069
8496
  exports.roleSchema = roleSchema;
7070
8497
  exports.runCodePermissionsSchema = runCodePermissionsSchema;
8498
+ exports.scheduleCadenceSchema = scheduleCadenceSchema;
8499
+ exports.scheduleFrequencies = scheduleFrequencies;
8500
+ exports.scheduleMCPOutcomeSchema = scheduleMCPOutcomeSchema;
8501
+ exports.scheduleStructuredFrequencies = scheduleStructuredFrequencies;
8502
+ exports.scheduleTargets = scheduleTargets;
8503
+ exports.schedulesPermissionsSchema = schedulesPermissionsSchema;
7071
8504
  exports.select = select;
7072
8505
  exports.separator = separator;
7073
8506
  exports.setAcceptLanguageHeader = require_data_service.setAcceptLanguageHeader;
7074
8507
  exports.setFileConfigRegexCompiler = require_data_service.setFileConfigRegexCompiler;
8508
+ exports.setMaxSubagents = require_data_service.setMaxSubagents;
7075
8509
  exports.setMessageFilterRegexValidator = require_data_service.setMessageFilterRegexValidator;
7076
8510
  exports.setTokenHeader = require_data_service.setTokenHeader;
7077
8511
  exports.sha1 = sha1;
@@ -7079,6 +8513,7 @@ exports.shadcnComponents = shadcnComponents;
7079
8513
  exports.sharedFileDownload = require_data_service.sharedFileDownload;
7080
8514
  exports.sharedLinksPermissionsSchema = sharedLinksPermissionsSchema;
7081
8515
  exports.skeleton = skeleton;
8516
+ exports.skillFilterFieldSchema = require_data_service.skillFilterFieldSchema;
7082
8517
  exports.skillPermissionsSchema = skillPermissionsSchema;
7083
8518
  exports.skillSyncConfigSchema = require_data_service.skillSyncConfigSchema;
7084
8519
  exports.skillSyncGitHubSourceSchema = require_data_service.skillSyncGitHubSourceSchema;
@@ -7088,6 +8523,13 @@ exports.specsConfigSchema = require_data_service.specsConfigSchema;
7088
8523
  exports.splitMCPToolKey = require_data_service.splitMCPToolKey;
7089
8524
  exports.splitToolCallName = require_data_service.splitToolCallName;
7090
8525
  exports.stripAgentIdSuffix = stripAgentIdSuffix;
8526
+ exports.stripLangChainTroubleshootingUrl = stripLangChainTroubleshootingUrl;
8527
+ exports.stripReasoningLabelMetadata = stripReasoningLabelMetadata;
8528
+ exports.stripServerNamePrefix = require_data_service.stripServerNamePrefix;
8529
+ exports.stripServerNamePrefixes = require_data_service.stripServerNamePrefixes;
8530
+ exports.stripToolCallErrorPrefix = stripToolCallErrorPrefix;
8531
+ exports.structuredCadenceSchema = structuredCadenceSchema;
8532
+ exports.subagentThreadLineageSchema = require_data_service.subagentThreadLineageSchema;
7091
8533
  exports.summarizationConfigSchema = require_data_service.summarizationConfigSchema;
7092
8534
  exports.summarizationTriggerSchema = require_data_service.summarizationTriggerSchema;
7093
8535
  exports.supportedMimeTypes = require_data_service.supportedMimeTypes;
@@ -7095,6 +8537,7 @@ exports.supportsAdaptiveThinking = supportsAdaptiveThinking;
7095
8537
  exports.supportsBalanceCheck = require_data_service.supportsBalanceCheck;
7096
8538
  exports.supportsContext1m = supportsContext1m;
7097
8539
  exports.supportsFiles = require_data_service.supportsFiles;
8540
+ exports.supportsPromptCache = supportsPromptCache;
7098
8541
  exports.switchComponent = switchComponent;
7099
8542
  exports.tBannerSchema = require_data_service.tBannerSchema;
7100
8543
  exports.tConversationSchema = require_data_service.tConversationSchema;
@@ -7122,13 +8565,19 @@ exports.toggleGroup = toggleGroup;
7122
8565
  exports.toolApprovalHookConfigSchema = require_data_service.toolApprovalHookConfigSchema;
7123
8566
  exports.toolApprovalModeSchema = require_data_service.toolApprovalModeSchema;
7124
8567
  exports.toolApprovalPolicySchema = require_data_service.toolApprovalPolicySchema;
8568
+ exports.toolArgumentFilterFieldSchema = require_data_service.toolArgumentFilterFieldSchema;
7125
8569
  exports.tooltip = tooltip;
8570
+ exports.traceViewerDefaults = require_data_service.traceViewerDefaults;
8571
+ exports.traceViewerLimits = require_data_service.traceViewerLimits;
7126
8572
  exports.transactionsSchema = require_data_service.transactionsSchema;
7127
8573
  exports.turnstileOptionsSchema = require_data_service.turnstileOptionsSchema;
7128
8574
  exports.turnstileSchema = require_data_service.turnstileSchema;
8575
+ exports.unattributedAssistantContentSchema = require_data_service.unattributedAssistantContentSchema;
7129
8576
  exports.updateResourcePermissionsRequestSchema = require_data_service.updateResourcePermissionsRequestSchema;
7130
8577
  exports.updateResourcePermissionsResponseSchema = require_data_service.updateResourcePermissionsResponseSchema;
8578
+ exports.updateSchedulePayloadSchema = updateSchedulePayloadSchema;
7131
8579
  exports.useToast = useToast;
8580
+ exports.userSubmittedMessageFieldPathSchema = require_data_service.userSubmittedMessageFieldPathSchema;
7132
8581
  exports.utils = utils;
7133
8582
  exports.validateActionDomain = validateActionDomain;
7134
8583
  exports.validateAndParseOpenAPISpec = validateAndParseOpenAPISpec;