librechat-data-provider 0.8.522 → 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 (46) hide show
  1. package/dist/{data-service-CaB7saTP.mjs → data-service-Bx6IFaSa.mjs} +638 -27
  2. package/dist/data-service-Bx6IFaSa.mjs.map +1 -0
  3. package/dist/{data-service-D5kHzBt-.js → data-service-CTX0tVO5.js} +871 -26
  4. package/dist/data-service-CTX0tVO5.js.map +1 -0
  5. package/dist/index.js +557 -19
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +491 -20
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/react-query/index.js +1 -1
  10. package/dist/react-query/index.mjs +1 -1
  11. package/dist/types/accessPermissions.d.ts +54 -1
  12. package/dist/types/api-endpoints.d.ts +6 -0
  13. package/dist/types/bedrock.d.ts +80 -20
  14. package/dist/types/code/approval.d.ts +26 -0
  15. package/dist/types/code/worker.d.ts +10 -0
  16. package/dist/types/code/workspace.d.ts +28 -0
  17. package/dist/types/codeEnvRef.d.ts +5 -0
  18. package/dist/types/config.d.ts +6062 -3828
  19. package/dist/types/data-service.d.ts +8 -0
  20. package/dist/types/errors.d.ts +2 -0
  21. package/dist/types/file-config.d.ts +137 -9
  22. package/dist/types/filters.d.ts +176 -176
  23. package/dist/types/generate.d.ts +28 -4
  24. package/dist/types/index.d.ts +7 -0
  25. package/dist/types/keys.d.ts +11 -1
  26. package/dist/types/mcp.d.ts +336 -330
  27. package/dist/types/messages.d.ts +19 -0
  28. package/dist/types/models.d.ts +367 -238
  29. package/dist/types/parameterSettings.d.ts +8 -0
  30. package/dist/types/providers.d.ts +1 -0
  31. package/dist/types/resolve-llm-delivery-path.d.ts +68 -0
  32. package/dist/types/schemas.d.ts +628 -317
  33. package/dist/types/svg.d.ts +34 -0
  34. package/dist/types/types/agents.d.ts +24 -0
  35. package/dist/types/types/assistants.d.ts +27 -3
  36. package/dist/types/types/files.d.ts +34 -0
  37. package/dist/types/types/insights.d.ts +9 -0
  38. package/dist/types/types/queries.d.ts +8 -1
  39. package/dist/types/types/queuedTurns.d.ts +16 -16
  40. package/dist/types/types/runs.d.ts +24 -5
  41. package/dist/types/types/schedules.d.ts +44 -11
  42. package/dist/types/types/traces.d.ts +85 -0
  43. package/dist/types/types.d.ts +41 -1
  44. package/package.json +2 -2
  45. package/dist/data-service-CaB7saTP.mjs.map +0 -1
  46. package/dist/data-service-D5kHzBt-.js.map +0 -1
@@ -350,6 +350,52 @@ const filtersConfigSchema = zod.z.object({
350
350
  });
351
351
  });
352
352
  //#endregion
353
+ //#region src/code/workspace.ts
354
+ const CODE_WORKSPACE_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
355
+ /** Protocol-v1 ceiling enforced by the worker and Code API. */
356
+ const CODE_WORKSPACE_MAX_COUNT = 32;
357
+ /** API/client protocol for immutable conversation-owned environment decisions. */
358
+ const CODE_ENVIRONMENT_DECISION_VERSION = 1;
359
+ const CODE_WORKSPACE_OPERATIONS = [
360
+ "read_file",
361
+ "search_text",
362
+ "list_files",
363
+ "write_file",
364
+ "preview_edit",
365
+ "edit_file",
366
+ "execute_command"
367
+ ];
368
+ const CODE_WORKSPACE_SELECTION_ERROR_REASONS = [
369
+ "required",
370
+ "invalid",
371
+ "worker_unavailable",
372
+ "unsupported",
373
+ "missing",
374
+ "locked"
375
+ ];
376
+ const CODE_ENVIRONMENT_MODES = ["attached", "without_attached"];
377
+ function isCodeEnvironmentMode(value) {
378
+ return CODE_ENVIRONMENT_MODES.some((mode) => mode === value);
379
+ }
380
+ function isCodeWorkspaceSelectionErrorReason(value) {
381
+ return CODE_WORKSPACE_SELECTION_ERROR_REASONS.some((reason) => reason === value);
382
+ }
383
+ function isCodeWorkspaceSelection(value) {
384
+ if (value == null || typeof value !== "object" || Array.isArray(value)) return false;
385
+ const selection = value;
386
+ return Object.keys(selection).every((key) => key === "environmentId" || key === "workspaceId") && typeof selection.environmentId === "string" && CODE_WORKSPACE_ID_PATTERN.test(selection.environmentId) && typeof selection.workspaceId === "string" && CODE_WORKSPACE_ID_PATTERN.test(selection.workspaceId);
387
+ }
388
+ /** One exact workspace per attached environment used by a conversation. */
389
+ function isCodeWorkspaceSelections(value) {
390
+ if (!Array.isArray(value)) return false;
391
+ const environmentIds = /* @__PURE__ */ new Set();
392
+ return value.every((selection) => {
393
+ if (!isCodeWorkspaceSelection(selection) || environmentIds.has(selection.environmentId)) return false;
394
+ environmentIds.add(selection.environmentId);
395
+ return true;
396
+ });
397
+ }
398
+ //#endregion
353
399
  //#region src/feedback.ts
354
400
  const FEEDBACK_RATINGS = ["thumbsUp", "thumbsDown"];
355
401
  const FEEDBACK_REASON_KEYS = [
@@ -459,6 +505,63 @@ function getTagByKey(key) {
459
505
  return FEEDBACK_TAGS.find((tag) => tag.key === key);
460
506
  }
461
507
  //#endregion
508
+ //#region src/code/approval.ts
509
+ const CODE_APPROVAL_MODES = [
510
+ "ask",
511
+ "acceptEdits",
512
+ "fullAccess"
513
+ ];
514
+ const MODE_PERMISSIONS = {
515
+ ask: {
516
+ fileWrite: "ask",
517
+ commandExecution: "ask"
518
+ },
519
+ acceptEdits: {
520
+ fileWrite: "allow",
521
+ commandExecution: "ask"
522
+ },
523
+ fullAccess: {
524
+ fileWrite: "allow",
525
+ commandExecution: "allow"
526
+ }
527
+ };
528
+ /** Omitted deployment configuration never grants unattended execution. */
529
+ function getAllowedCodeApprovalModes({ enabled, allowedModes, configSchema, settings, environment }) {
530
+ if (enabled === false) return [];
531
+ const permitted = new Set(allowedModes ?? ["ask"]);
532
+ return CODE_APPROVAL_MODES.filter((mode) => {
533
+ if (!permitted.has(mode)) return false;
534
+ if (environment === "managed") return true;
535
+ for (const category of ["fileWrite", "commandExecution"]) {
536
+ if (MODE_PERMISSIONS[mode][category] !== "allow") continue;
537
+ const field = configSchema?.permissions?.[category];
538
+ const configured = settings?.permissions?.[category];
539
+ if ((configured != null && field?.allowed.includes(configured) === true ? configured : field?.default ?? "ask") === "deny" || field?.allowed.includes("allow") !== true) return false;
540
+ }
541
+ return true;
542
+ });
543
+ }
544
+ var CodeApprovalModeError = class extends Error {
545
+ constructor() {
546
+ super("The selected code approval mode is not permitted by the current policy.");
547
+ this.code = "CODE_APPROVAL_MODE_NOT_ALLOWED";
548
+ this.name = "CodeApprovalModeError";
549
+ }
550
+ };
551
+ /** Validate untrusted request state again at admission, including after policy changes. */
552
+ function resolveCodeApprovalMode(requested, constraints) {
553
+ if (requested == null) return void 0;
554
+ const selected = getAllowedCodeApprovalModes(constraints).find((mode) => mode === requested);
555
+ if (selected == null) throw new CodeApprovalModeError();
556
+ return selected;
557
+ }
558
+ /** Apply a turn preference without modifying machine settings or overriding an existing deny. */
559
+ function resolveCodePermissionDecision({ mode, category, decision }) {
560
+ if (mode == null || decision === "deny") return decision;
561
+ if (MODE_PERMISSIONS[mode] == null) throw new CodeApprovalModeError();
562
+ return MODE_PERMISSIONS[mode][category];
563
+ }
564
+ //#endregion
462
565
  //#region src/stateful-code.ts
463
566
  const STATEFUL_CODE_ENVIRONMENTS = [
464
567
  "user",
@@ -502,6 +605,10 @@ let EToolResources = /* @__PURE__ */ function(EToolResources) {
502
605
  EToolResources["ocr"] = "ocr";
503
606
  return EToolResources;
504
607
  }({});
608
+ const agentGitIdentitySchema = zod.z.object({
609
+ name: zod.z.string().trim().min(1).max(128).refine((value) => !/[\0\r\n]/.test(value)),
610
+ email: zod.z.string().trim().email().max(254).refine((value) => !/[\0\r\n]/.test(value))
611
+ }).optional();
505
612
  let AnnotationTypes = /* @__PURE__ */ function(AnnotationTypes) {
506
613
  AnnotationTypes["FILE_CITATION"] = "file_citation";
507
614
  AnnotationTypes["FILE_PATH"] = "file_path";
@@ -693,7 +800,35 @@ const inputTokensIncludesCache = (provider) => {
693
800
  return cacheSubsetProviders.has(provider ?? "");
694
801
  };
695
802
  const isDocumentSupportedProvider = (provider) => {
696
- return documentSupportedProviders.has(provider ?? "");
803
+ const normalized = provider?.toLowerCase() ?? "";
804
+ return Array.from(documentSupportedProviders).some((candidate) => candidate.toLowerCase() === normalized);
805
+ };
806
+ /**
807
+ * Endpoints whose encoders actually build native audio/video payloads. Narrower than
808
+ * `documentSupportedProviders`: a provider can accept PDFs and still emit nothing for
809
+ * media, in which case the upload has to fall back to text/STT.
810
+ */
811
+ const mediaSupportedProviders = new Set([
812
+ "google",
813
+ "vertexai",
814
+ "openrouter"
815
+ ]);
816
+ const isMediaSupportedProvider = (provider) => {
817
+ return mediaSupportedProviders.has(provider?.toLowerCase() ?? "");
818
+ };
819
+ /**
820
+ * Built-in endpoint and provider identifiers. A name outside this set is a custom
821
+ * endpoint whose real provider is resolved at request time, so its capabilities
822
+ * cannot be judged from the name alone.
823
+ */
824
+ const knownProviderIdentifiers = new Set([
825
+ ...Object.values(EModelEndpoint),
826
+ ...Object.values(Providers),
827
+ ...Object.values(EModelEndpoint).map((provider) => provider.toLowerCase()),
828
+ ...Object.values(Providers).map((provider) => provider.toLowerCase())
829
+ ]);
830
+ const isKnownProviderIdentifier = (provider) => {
831
+ return knownProviderIdentifiers.has(provider?.toLowerCase() ?? "");
697
832
  };
698
833
  const paramEndpoints = new Set([
699
834
  "agents",
@@ -896,6 +1031,7 @@ const defaultAgentFormValues = {
896
1031
  ["memory"]: false,
897
1032
  stateful_code_environment: "user",
898
1033
  code_environment_id: void 0,
1034
+ code_workspace_id: void 0,
899
1035
  category: "general",
900
1036
  support_contact: {
901
1037
  name: "",
@@ -1386,6 +1522,12 @@ const tConversationSchema = zod.z.object({
1386
1522
  pinned: zod.z.boolean().optional(),
1387
1523
  /** Server-derived: an active shared link exists for this conversation. Not persisted. */
1388
1524
  isShared: zod.z.boolean().optional(),
1525
+ codeApprovalMode: zod.z.enum(CODE_APPROVAL_MODES).optional(),
1526
+ codeEnvironmentMode: zod.z.enum(CODE_ENVIRONMENT_MODES).optional(),
1527
+ codeWorkspaces: zod.z.array(zod.z.object({
1528
+ environmentId: zod.z.string().regex(CODE_WORKSPACE_ID_PATTERN),
1529
+ workspaceId: zod.z.string().regex(CODE_WORKSPACE_ID_PATTERN)
1530
+ }).strict()).optional(),
1389
1531
  title: zod.z.string().nullable().or(zod.z.literal("New Chat")).default("New Chat"),
1390
1532
  user: zod.z.string().optional(),
1391
1533
  messages: zod.z.array(zod.z.string()).optional(),
@@ -2289,6 +2431,7 @@ const MAX_GRAPH_SUBAGENT_MEMBERS = 32;
2289
2431
  const modelSpecSubagentsSchema = zod.z.object({
2290
2432
  enabled: zod.z.boolean().optional(),
2291
2433
  allowSelf: zod.z.boolean().optional(),
2434
+ shareFiles: zod.z.boolean().optional(),
2292
2435
  agent_ids: zod.z.array(zod.z.string()).optional()
2293
2436
  }).superRefine((subagents, ctx) => {
2294
2437
  const maxSubagents = getMaxSubagents();
@@ -2570,6 +2713,49 @@ const bedrockDocumentFormats = {
2570
2713
  "text/plain": "txt",
2571
2714
  "text/markdown": "md"
2572
2715
  };
2716
+ /**
2717
+ * Whether an upload belongs to the conversation rather than to the agent. The value
2718
+ * arrives from multipart form data, so it can be the string "false", which is truthy.
2719
+ * Shared so the route, the authorization check and processing cannot disagree about it.
2720
+ */
2721
+ const isMessageFileUpload = (value) => value === true || value === "true";
2722
+ /**
2723
+ * Whether the upload's conversation uses the Responses API, which decides whether Azure
2724
+ * can carry a document natively. Multipart form data has no booleans, so it arrives as
2725
+ * the string "true".
2726
+ */
2727
+ const isResponsesApiUpload = (value) => value === true || value === "true";
2728
+ /**
2729
+ * The name a file carries inside the code sandbox.
2730
+ *
2731
+ * Image uploads are converted to the configured output type while the record keeps the
2732
+ * original filename, so the extension has to follow the stored bytes or the sandbox
2733
+ * decoder is handed a mismatch. Provisioning and priming both resolve the mount path
2734
+ * from here: deriving it twice under different rules leaves a later turn advertising a
2735
+ * path that does not exist in the sandbox.
2736
+ */
2737
+ const resolveSandboxFilename = (filename, mimeType) => {
2738
+ if (!mimeType?.startsWith("image/")) return filename;
2739
+ const subtype = mimeType.slice(6);
2740
+ if (![
2741
+ "webp",
2742
+ "png",
2743
+ "jpeg",
2744
+ "gif"
2745
+ ].includes(subtype)) return filename;
2746
+ const accepted = subtype === "jpeg" ? [".jpg", ".jpeg"] : [`.${subtype}`];
2747
+ const lastDot = filename.lastIndexOf(".");
2748
+ const currentExt = lastDot > 0 ? filename.slice(lastDot).toLowerCase() : "";
2749
+ if (accepted.includes(currentExt)) return filename;
2750
+ return `${lastDot > 0 ? filename.slice(0, lastDot) : filename}${accepted[0]}`;
2751
+ };
2752
+ /**
2753
+ * The Responses setting a turn actually runs on. A saved agent's own record wins, since
2754
+ * execution reads its model parameters; a conversation only answers for itself. Upload
2755
+ * and delivery must agree here, or a document is stored as raw provider content and then
2756
+ * re-resolved to text it has no extraction for.
2757
+ */
2758
+ const resolveUseResponsesApi = (agentValue, conversationValue) => agentValue ?? conversationValue ?? void 0;
2573
2759
  const isBedrockDocumentType = (mimeType) => mimeType != null && mimeType in bedrockDocumentFormats;
2574
2760
  /** MIME types Bedrock's Converse document path can send to the model (mirrors `bedrockDocumentFormats`). */
2575
2761
  const bedrockDocumentMimeTypes = Object.keys(bedrockDocumentFormats);
@@ -2803,6 +2989,8 @@ const mbToBytes = (mb) => mb * megabyte;
2803
2989
  const defaultSizeLimit = mbToBytes(512);
2804
2990
  const defaultSkillImportSizeLimit = mbToBytes(50);
2805
2991
  const defaultTokenLimit = 1e5;
2992
+ const defaultContextSizeLimit = mbToBytes(128);
2993
+ const defaultContextCharLimit = 1e6;
2806
2994
  const assistantsFileConfig = {
2807
2995
  fileLimit: 10,
2808
2996
  fileSizeLimit: defaultSizeLimit,
@@ -2834,6 +3022,8 @@ const fileConfig = {
2834
3022
  serverFileSizeLimit: defaultSizeLimit,
2835
3023
  avatarSizeLimit: mbToBytes(2),
2836
3024
  fileTokenLimit: defaultTokenLimit,
3025
+ fileContextSizeLimit: defaultContextSizeLimit,
3026
+ fileContextCharLimit: defaultContextCharLimit,
2837
3027
  clientImageResize: {
2838
3028
  enabled: false,
2839
3029
  maxWidth: 1900,
@@ -2849,12 +3039,23 @@ const fileConfig = {
2849
3039
  }
2850
3040
  };
2851
3041
  const supportedMimeTypesSchema = zod.z.array(zod.z.string()).optional();
3042
+ const DefaultLLMDeliveryPath = zod.z.enum([
3043
+ "provider",
3044
+ "text",
3045
+ "none"
3046
+ ]);
3047
+ const defaultLLMDeliveryPathSchema = zod.z.object({
3048
+ fallback: DefaultLLMDeliveryPath.optional(),
3049
+ overrides: zod.z.record(DefaultLLMDeliveryPath).optional()
3050
+ });
2852
3051
  const endpointFileConfigSchema = zod.z.object({
2853
3052
  disabled: zod.z.boolean().optional(),
2854
3053
  fileLimit: zod.z.number().min(0).optional(),
2855
3054
  fileSizeLimit: zod.z.number().min(0).optional(),
2856
3055
  totalSizeLimit: zod.z.number().min(0).optional(),
2857
- supportedMimeTypes: supportedMimeTypesSchema.optional()
3056
+ supportedMimeTypes: supportedMimeTypesSchema.optional(),
3057
+ defaultLLMDeliveryPath: defaultLLMDeliveryPathSchema.optional(),
3058
+ legacyFileUploadUX: zod.z.boolean().optional()
2858
3059
  });
2859
3060
  const skillFileConfigSchema = zod.z.object({ fileSizeLimit: zod.z.number().min(0).optional() });
2860
3061
  const fileConfigSchema = zod.z.object({
@@ -2863,6 +3064,9 @@ const fileConfigSchema = zod.z.object({
2863
3064
  serverFileSizeLimit: zod.z.number().min(0).optional(),
2864
3065
  avatarSizeLimit: zod.z.number().min(0).optional(),
2865
3066
  fileTokenLimit: zod.z.number().min(0).optional(),
3067
+ fileContextSizeLimit: zod.z.number().min(0).optional(),
3068
+ fileContextCharLimit: zod.z.number().min(0).optional(),
3069
+ codeEnvLivenessSafeWindowMs: zod.z.number().min(0).optional(),
2866
3070
  imageGeneration: zod.z.object({
2867
3071
  percentage: zod.z.number().min(0).max(100).optional(),
2868
3072
  px: zod.z.number().min(0).optional()
@@ -2874,7 +3078,9 @@ const fileConfigSchema = zod.z.object({
2874
3078
  quality: zod.z.number().min(0).max(1).optional()
2875
3079
  }).optional(),
2876
3080
  ocr: zod.z.object({ supportedMimeTypes: supportedMimeTypesSchema.optional() }).optional(),
2877
- text: zod.z.object({ supportedMimeTypes: supportedMimeTypesSchema.optional() }).optional()
3081
+ text: zod.z.object({ supportedMimeTypes: supportedMimeTypesSchema.optional() }).optional(),
3082
+ defaultLLMDeliveryPath: defaultLLMDeliveryPathSchema.optional(),
3083
+ legacyFileUploadUX: zod.z.boolean().optional()
2878
3084
  });
2879
3085
  /**
2880
3086
  * Compiler for admin-supplied MIME patterns. Defaults to native `RegExp`, which browser
@@ -3010,6 +3216,12 @@ const documentMimeExtensions = [
3010
3216
  ["text/calendar", [".ics"]],
3011
3217
  ["message/rfc822", [".eml"]]
3012
3218
  ];
3219
+ /** Preferred extension for a known document MIME type, including its leading dot. */
3220
+ function getDocumentFileExtension(mimeType) {
3221
+ const normalized = mimeType?.split(";", 1)[0].trim().toLowerCase();
3222
+ const canonical = normalized === "text/comma-separated-values" ? "text/csv" : normalized;
3223
+ return documentMimeExtensions.find(([type]) => type === canonical)?.[1][0];
3224
+ }
3013
3225
  const documentMimeSet = new Set(documentMimeExtensions.map(([mimeType]) => mimeType));
3014
3226
  /** Every MIME type LibreChat may accept, used to detect patterns that reach beyond the representable set. */
3015
3227
  const knownMimeUniverse = Array.from(new Set([
@@ -3103,7 +3315,45 @@ function mergeWithDefault(endpointConfig, defaultConfig, endpoint) {
3103
3315
  fileLimit: endpointConfig.fileLimit ?? defaultConfig.fileLimit,
3104
3316
  fileSizeLimit: endpointConfig.fileSizeLimit ?? defaultConfig.fileSizeLimit,
3105
3317
  totalSizeLimit: endpointConfig.totalSizeLimit ?? defaultConfig.totalSizeLimit,
3106
- supportedMimeTypes: endpointConfig.supportedMimeTypes ?? defaultMimeTypes
3318
+ supportedMimeTypes: endpointConfig.supportedMimeTypes ?? defaultMimeTypes,
3319
+ defaultLLMDeliveryPath: mergeDeliveryPathConfig(endpointConfig.defaultLLMDeliveryPath, defaultConfig.defaultLLMDeliveryPath),
3320
+ legacyFileUploadUX: endpointConfig.legacyFileUploadUX ?? defaultConfig.legacyFileUploadUX
3321
+ };
3322
+ }
3323
+ /**
3324
+ * Deep-merges delivery-path config so an endpoint that supplies only one override
3325
+ * still inherits the default's fallback and shared overrides. Whole-object
3326
+ * replacement would silently drop the inherited routing.
3327
+ */
3328
+ function mergeDeliveryPathConfig(endpointValue, defaultValue) {
3329
+ if (!endpointValue) return defaultValue;
3330
+ if (!defaultValue) return endpointValue;
3331
+ if (endpointValue.fallback != null) return endpointValue;
3332
+ const hasOverrides = endpointValue.overrides != null || defaultValue.overrides != null;
3333
+ return {
3334
+ ...defaultValue.fallback != null ? { fallback: defaultValue.fallback } : {},
3335
+ ...hasOverrides ? { overrides: { ...shadowByWildcard(defaultValue.overrides, endpointValue.overrides) } } : {}
3336
+ };
3337
+ }
3338
+ /**
3339
+ * Flattens two override layers into one map that still resolves like the layered chain.
3340
+ * Resolution reads exact keys before wildcards, so a plain spread would let a lower
3341
+ * layer's `image/png` outrank the upper layer's `image/*`. Dropping the entries an
3342
+ * upper wildcard covers restores precedence without changing how lookups work.
3343
+ */
3344
+ function shadowByWildcard(lower, upper) {
3345
+ if (!lower) return { ...upper };
3346
+ const upperWildcards = /* @__PURE__ */ new Set();
3347
+ for (const key in upper) if (key.endsWith("/*")) upperWildcards.add(key.slice(0, -1));
3348
+ if (upperWildcards.size === 0) return {
3349
+ ...lower,
3350
+ ...upper
3351
+ };
3352
+ const retained = {};
3353
+ for (const key in lower) if (!(!key.endsWith("/*") && upperWildcards.has(key.slice(0, key.indexOf("/") + 1)) && upper?.[key] == null)) retained[key] = lower[key];
3354
+ return {
3355
+ ...retained,
3356
+ ...upper
3107
3357
  };
3108
3358
  }
3109
3359
  function getEndpointFileConfig(params) {
@@ -3111,8 +3361,13 @@ function getEndpointFileConfig(params) {
3111
3361
  if (!mergedFileConfig?.endpoints) return fileConfig.endpoints.default;
3112
3362
  /** Compute an effective default by merging user-configured default over the base default */
3113
3363
  const baseDefaultConfig = fileConfig.endpoints.default;
3364
+ const globalDefaultConfig = {
3365
+ ...baseDefaultConfig,
3366
+ defaultLLMDeliveryPath: mergeDeliveryPathConfig(mergedFileConfig.defaultLLMDeliveryPath, baseDefaultConfig.defaultLLMDeliveryPath),
3367
+ legacyFileUploadUX: mergedFileConfig.legacyFileUploadUX ?? baseDefaultConfig.legacyFileUploadUX
3368
+ };
3114
3369
  const userDefaultConfig = mergedFileConfig.endpoints.default;
3115
- const defaultConfig = userDefaultConfig ? mergeWithDefault(userDefaultConfig, baseDefaultConfig, "default") : baseDefaultConfig;
3370
+ const defaultConfig = userDefaultConfig ? mergeWithDefault(userDefaultConfig, globalDefaultConfig, "default") : globalDefaultConfig;
3116
3371
  const normalizedEndpoint = normalizeEndpointName(endpoint ?? "");
3117
3372
  const standardEndpoints = new Set([
3118
3373
  "default",
@@ -3167,9 +3422,13 @@ function mergeFileConfig(dynamic) {
3167
3422
  }
3168
3423
  };
3169
3424
  if (!dynamic) return mergedConfig;
3425
+ if (dynamic.defaultLLMDeliveryPath !== void 0) mergedConfig.defaultLLMDeliveryPath = dynamic.defaultLLMDeliveryPath;
3426
+ if (dynamic.legacyFileUploadUX !== void 0) mergedConfig.legacyFileUploadUX = dynamic.legacyFileUploadUX;
3170
3427
  if (dynamic.serverFileSizeLimit !== void 0) mergedConfig.serverFileSizeLimit = mbToBytes(dynamic.serverFileSizeLimit);
3171
3428
  if (dynamic.avatarSizeLimit !== void 0) mergedConfig.avatarSizeLimit = mbToBytes(dynamic.avatarSizeLimit);
3172
3429
  if (dynamic.fileTokenLimit !== void 0) mergedConfig.fileTokenLimit = dynamic.fileTokenLimit;
3430
+ if (dynamic.fileContextSizeLimit !== void 0) mergedConfig.fileContextSizeLimit = mbToBytes(dynamic.fileContextSizeLimit);
3431
+ if (dynamic.fileContextCharLimit !== void 0) mergedConfig.fileContextCharLimit = dynamic.fileContextCharLimit;
3173
3432
  if (dynamic.skills?.fileSizeLimit !== void 0) mergedConfig.skills = {
3174
3433
  ...mergedConfig.skills,
3175
3434
  fileSizeLimit: mbToBytes(dynamic.skills.fileSizeLimit)
@@ -3217,6 +3476,8 @@ function mergeFileConfig(dynamic) {
3217
3476
  });
3218
3477
  if (dynamicEndpoint.disabled !== void 0) mergedEndpoint.disabled = dynamicEndpoint.disabled;
3219
3478
  if (dynamicEndpoint.supportedMimeTypes) mergedEndpoint.supportedMimeTypes = convertStringsToRegex(dynamicEndpoint.supportedMimeTypes);
3479
+ if (dynamicEndpoint.defaultLLMDeliveryPath !== void 0) mergedEndpoint.defaultLLMDeliveryPath = dynamicEndpoint.defaultLLMDeliveryPath;
3480
+ if (dynamicEndpoint.legacyFileUploadUX !== void 0) mergedEndpoint.legacyFileUploadUX = dynamicEndpoint.legacyFileUploadUX;
3220
3481
  }
3221
3482
  return mergedConfig;
3222
3483
  }
@@ -3246,6 +3507,7 @@ const codeEnvironments = () => `${BASE_URL}/api/code-environments`;
3246
3507
  const codeEnvironmentPairings = () => `${codeEnvironments()}/pairings`;
3247
3508
  const codeEnvironmentById = (id) => `${codeEnvironments()}/${encodeURIComponent(id)}`;
3248
3509
  const codeEnvironmentSettings = (id) => `${codeEnvironmentById(id)}/settings`;
3510
+ const codeEnvironmentStatus = (id) => `${codeEnvironmentById(id)}/status`;
3249
3511
  const messagesRoot = `${BASE_URL}/api/messages`;
3250
3512
  const messages = (params) => {
3251
3513
  const { conversationId, messageId, ...rest } = params;
@@ -3458,8 +3720,15 @@ const listSkillsWithFilters = (filter) => {
3458
3720
  };
3459
3721
  const skillFiles = (id) => `${getSkill$1(id)}/files`;
3460
3722
  const skillFile = (id, relativePath) => `${skillFiles(id)}/${encodeURIComponent(relativePath)}`;
3461
- const insights = () => `${BASE_URL}/api/admin/insights`;
3723
+ const insights = () => `${BASE_URL}/api/insights`;
3462
3724
  const insightsAccess = () => `${insights()}/access`;
3725
+ const conversationTrace = (conversationId) => `${BASE_URL}/api/traces/${encodeURIComponent(conversationId)}`;
3726
+ const conversationTraceAvailability = (conversationId) => `${conversationTrace(conversationId)}/availability`;
3727
+ const conversationTraceRecords = (conversationId, cursor) => `${conversationTrace(conversationId)}/records${cursor ? `?${new URLSearchParams({ cursor }).toString()}` : ""}`;
3728
+ const conversationTraceRecord = (conversationId, recordId, messageId, sourceId) => `${conversationTrace(conversationId)}/records/${encodeURIComponent(recordId)}?${new URLSearchParams({
3729
+ message: messageId,
3730
+ ...sourceId ? { source: sourceId } : {}
3731
+ }).toString()}`;
3463
3732
  const adminSkillsSync = () => `${BASE_URL}/api/admin/skills/sync`;
3464
3733
  const adminSkillsSyncStatus = () => `${adminSkillsSync()}/status`;
3465
3734
  const adminSkillsSyncRun = () => `${adminSkillsSync()}/run`;
@@ -3468,6 +3737,7 @@ const skillStates = () => `${BASE_URL}/api/user/settings/skills/active`;
3468
3737
  const adminLangfuseConnection = () => `${BASE_URL}/api/admin/langfuse/connection`;
3469
3738
  const adminLangfuseConnectionTest = () => `${adminLangfuseConnection()}/test`;
3470
3739
  const adminLangfuseSessionLink = (conversationId) => `${adminLangfuseConnection()}/session/${encodeURIComponent(conversationId)}`;
3740
+ const pinnedOrder = () => `${BASE_URL}/api/user/settings/pinned-order`;
3471
3741
  const toolFavorites = () => `${BASE_URL}/api/user/settings/favorites/tools`;
3472
3742
  const toolFavorite = (itemType, itemId) => `${toolFavorites()}/${itemType}/${encodeURIComponent(itemId)}`;
3473
3743
  const roles = () => `${BASE_URL}/api/roles`;
@@ -3539,6 +3809,7 @@ let FileContext = /* @__PURE__ */ function(FileContext) {
3539
3809
  FileContext["image_generation"] = "image_generation";
3540
3810
  FileContext["assistants_output"] = "assistants_output";
3541
3811
  FileContext["message_attachment"] = "message_attachment";
3812
+ FileContext["run_artifact"] = "run_artifact";
3542
3813
  FileContext["skill_file"] = "skill_file";
3543
3814
  FileContext["filename"] = "filename";
3544
3815
  FileContext["updatedAt"] = "updatedAt";
@@ -3569,6 +3840,12 @@ let TokenExchangeMethodEnum = /* @__PURE__ */ function(TokenExchangeMethodEnum)
3569
3840
  }({});
3570
3841
  //#endregion
3571
3842
  //#region src/mcp.ts
3843
+ /**
3844
+ * Upper bound on a stored MCP `iconPath` (URL or data URI). Enforced by
3845
+ * `sanitizeMcpIconPath`, not a schema `.max()`, so re-submitting a server whose
3846
+ * stored icon predates the cap clears the icon instead of rejecting the update.
3847
+ */
3848
+ const MAX_MCP_ICON_PATH_LENGTH = 256 * 1024;
3572
3849
  const validateOAuthClientCredentials = (oauth, ctx) => {
3573
3850
  if (oauth.client_secret && !oauth.client_id) ctx.addIssue({
3574
3851
  code: zod.z.ZodIssueCode.custom,
@@ -3977,6 +4254,8 @@ const excludedKeys = new Set([
3977
4254
  "conversationId",
3978
4255
  "agentEventBinding",
3979
4256
  "agentEventActor",
4257
+ "agentEventActorCleanup",
4258
+ "agentEventActorSuspension",
3980
4259
  "agentEventActorReconciliations",
3981
4260
  "agentEventActorEpoch",
3982
4261
  "agentEventActorLegacyTurn",
@@ -4485,13 +4764,13 @@ function isRemoteOidcUrlAllowed(value) {
4485
4764
  }
4486
4765
  const remoteApiOidcUrlSchema = zod.z.string().url().refine(isRemoteOidcUrlAllowed, { message: "must use https:// unless targeting localhost" });
4487
4766
  const remoteApiOidcScopeSchema = zod.z.string().refine((scope) => !scope.includes(","), { message: "scopes must be space-separated" });
4488
- const remoteApiOidcSchema = zod.z.object({
4767
+ const oidcAccessTokenSchema = zod.z.object({
4489
4768
  enabled: zod.z.boolean().default(false),
4490
4769
  issuer: remoteApiOidcUrlSchema.optional(),
4491
4770
  audience: zod.z.string().min(1).optional(),
4492
- jwksUri: remoteApiOidcUrlSchema.optional(),
4493
- scope: remoteApiOidcScopeSchema.optional()
4494
- }).superRefine((oidc, ctx) => {
4771
+ jwksUri: remoteApiOidcUrlSchema.optional()
4772
+ });
4773
+ function validateEnabledOidc(oidc, ctx) {
4495
4774
  if (oidc.enabled === true && !oidc.issuer) ctx.addIssue({
4496
4775
  code: zod.z.ZodIssueCode.custom,
4497
4776
  path: ["issuer"],
@@ -4502,12 +4781,46 @@ const remoteApiOidcSchema = zod.z.object({
4502
4781
  path: ["audience"],
4503
4782
  message: "audience is required when OIDC auth is enabled"
4504
4783
  });
4505
- });
4784
+ }
4785
+ const remoteApiOidcSchema = oidcAccessTokenSchema.extend({ scope: remoteApiOidcScopeSchema.optional() }).superRefine(validateEnabledOidc);
4506
4786
  const remoteApiAuthSchema = zod.z.object({
4507
4787
  apiKey: zod.z.object({ enabled: zod.z.boolean().default(true) }).optional(),
4508
4788
  oidc: remoteApiOidcSchema.optional()
4509
4789
  });
4510
4790
  const remoteApiSchema = zod.z.object({ auth: remoteApiAuthSchema.optional() });
4791
+ const managementClientBindingSchema = zod.z.object({
4792
+ clientId: zod.z.string().trim().min(1).max(128),
4793
+ subject: zod.z.string().trim().min(1).max(512).optional(),
4794
+ userId: zod.z.string().trim().regex(/^[a-f\d]{24}$/i, "must be a MongoDB ObjectId").transform((userId) => userId.toLowerCase()),
4795
+ tenantId: zod.z.string().trim().min(1).max(128).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/, "must be a valid tenant id").refine((tenantId) => tenantId !== "__SYSTEM__", "system tenant is not allowed"),
4796
+ enabled: zod.z.boolean().default(true)
4797
+ }).strict();
4798
+ const managementApiOidcSchema = oidcAccessTokenSchema.strict().superRefine(validateEnabledOidc);
4799
+ const managementApiAuthSchema = zod.z.object({
4800
+ oidc: managementApiOidcSchema,
4801
+ clients: zod.z.array(managementClientBindingSchema).max(100).default([])
4802
+ }).strict().superRefine((auth, ctx) => {
4803
+ if (auth.oidc.enabled === true && auth.clients.length === 0) ctx.addIssue({
4804
+ code: zod.z.ZodIssueCode.custom,
4805
+ path: ["clients"],
4806
+ message: "at least one client binding is required when management auth is enabled"
4807
+ });
4808
+ const clientIds = /* @__PURE__ */ new Set();
4809
+ for (let index = 0; index < auth.clients.length; index++) {
4810
+ const client = auth.clients[index];
4811
+ if (clientIds.has(client.clientId)) ctx.addIssue({
4812
+ code: zod.z.ZodIssueCode.custom,
4813
+ path: [
4814
+ "clients",
4815
+ index,
4816
+ "clientId"
4817
+ ],
4818
+ message: "client IDs must be unique"
4819
+ });
4820
+ clientIds.add(client.clientId);
4821
+ }
4822
+ });
4823
+ const managementApiSchema = zod.z.object({ auth: managementApiAuthSchema.optional() }).strict();
4511
4824
  /**
4512
4825
  * Permission mode applied to a tool call. Mirrors `@librechat/agents`'s
4513
4826
  * `ToolPolicyMode` 1:1.
@@ -4646,15 +4959,25 @@ const codeEnvironmentPermissionFieldSchema = zod.z.object({
4646
4959
  message: "Permission default must be included in allowed values"
4647
4960
  });
4648
4961
  });
4962
+ /** Existing attached commands used a fixed 30-second execution budget. */
4963
+ const CODE_ENVIRONMENT_COMMAND_TIMEOUT_DEFAULT_MS = 3e4;
4964
+ /** Protocol-level ceiling; deployments may only lower this value. */
4965
+ const CODE_ENVIRONMENT_COMMAND_TIMEOUT_HARD_MAX_MS = 5 * 6e4;
4649
4966
  /**
4650
4967
  * Typed user-tunable surface for one attached code environment. Omitted fields
4651
4968
  * remain fixed at LibreChat's safe baseline. Isolation, networking, mounts,
4652
4969
  * privileged execution, and secrets are deliberately not representable here.
4653
4970
  */
4654
- const codeEnvironmentUserConfigSchema = zod.z.object({ permissions: zod.z.object({
4655
- fileWrite: codeEnvironmentPermissionFieldSchema.optional(),
4656
- commandExecution: codeEnvironmentPermissionFieldSchema.optional()
4657
- }).strict().optional() }).strict();
4971
+ const codeEnvironmentUserConfigSchema = zod.z.object({
4972
+ permissions: zod.z.object({
4973
+ fileWrite: codeEnvironmentPermissionFieldSchema.optional(),
4974
+ commandExecution: codeEnvironmentPermissionFieldSchema.optional()
4975
+ }).strict().optional(),
4976
+ limits: zod.z.object({
4977
+ /** Maximum timeout a Bash invocation may request. Omission preserves
4978
+ * the historical 30-second command budget. */
4979
+ maxCommandTimeoutMs: zod.z.number().int().min(1).max(CODE_ENVIRONMENT_COMMAND_TIMEOUT_HARD_MAX_MS).optional() }).strict().optional()
4980
+ }).strict();
4658
4981
  const codeEnvironmentUserSettingsSchema = zod.z.object({ permissions: zod.z.object({
4659
4982
  fileWrite: codeEnvironmentPermissionDecisionSchema.optional(),
4660
4983
  commandExecution: codeEnvironmentPermissionDecisionSchema.optional()
@@ -4679,12 +5002,32 @@ const agentsEndpointSchema = baseEndpointSchema.omit({ baseURL: true }).merge(zo
4679
5002
  * the shipped default of 10 for orchestration-heavy deployments, bounded by
4680
5003
  * `MAX_SUBAGENTS_CEILING`. */
4681
5004
  maxSubagents: zod.z.number().int().min(1).max(50).optional().default(10),
5005
+ /** Run-scoped file access for explicitly opted-in subagent delegations. */
5006
+ fileSharing: zod.z.object({
5007
+ enabled: zod.z.boolean().optional().default(false),
5008
+ allowSiblingSharing: zod.z.boolean().optional().default(false),
5009
+ maxFiles: zod.z.number().int().min(1).max(1e3).optional().default(100),
5010
+ /** Aggregate disk budget for private output versions retained during a run. */
5011
+ maxPrivateBytes: zod.z.number().int().min(1).max(10737418240).optional().default(268435456),
5012
+ ttlMs: zod.z.number().int().min(1).max(864e5).optional().default(36e5)
5013
+ }).optional(),
5014
+ /** Maximum concurrent Code API uploads per route and authenticated principal. */
5015
+ codeApiUploadConcurrency: zod.z.number().int().min(1).max(100).optional().default(3),
5016
+ /** Maximum wall-clock time spent waiting on Code API rate limits per operation. */
5017
+ codeApiMaxRetryWaitMs: zod.z.number().int().min(0).max(3e5).optional().default(2e4),
4682
5018
  allowedProviders: zod.z.array(zod.z.union([zod.z.string(), eModelEndpointSchema])).optional(),
4683
5019
  capabilities: zod.z.array(zod.z.nativeEnum(AgentCapabilities)).optional().default(defaultAgentCapabilities),
4684
5020
  /** Controls which workspace-sharing scopes users may select for stateful code sessions.
4685
5021
  * Omit this block to preserve the legacy behavior of allowing every scope. */
4686
5022
  statefulCodeSessions: zod.z.object({
4687
5023
  allowedEnvironments: zod.z.array(zod.z.enum(STATEFUL_CODE_ENVIRONMENTS)).min(1),
5024
+ /** Server-only personal worker enrollment policy. Effective principal
5025
+ * policy may tighten, but never raise, the deployment ceiling. */
5026
+ principalWorkers: zod.z.object({
5027
+ enabled: zod.z.boolean().optional(),
5028
+ /** Defaults to five. Zero disables enrollment; existing machines remain usable. */
5029
+ maxPerUser: zod.z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional()
5030
+ }).optional(),
4688
5031
  /** Operator-managed execution environments. Attached entries route to a
4689
5032
  * Code API deployment backed by an outbound librechat-code worker. */
4690
5033
  environments: zod.z.array(zod.z.object({
@@ -4791,8 +5134,14 @@ const agentsEndpointSchema = baseEndpointSchema.omit({ baseURL: true }).merge(zo
4791
5134
  eventDriven: zod.z.object({ selfUrl: zod.z.string().url().optional() }).optional(),
4792
5135
  /** Conversational background-task delivery policy. Automatic completion wakeups are
4793
5136
  * enabled unless an administrator explicitly restores poll-only behavior. */
4794
- backgroundTasks: zod.z.object({ completionWakeups: zod.z.boolean().optional().default(true) }).optional(),
5137
+ backgroundTasks: zod.z.object({
5138
+ completionWakeups: zod.z.boolean().optional().default(true),
5139
+ /** Cooperative cancellation for process-local ordinary tools. Off
5140
+ * by default so existing deployments opt into the new control. */
5141
+ ordinaryToolCancellation: zod.z.boolean().optional().default(false)
5142
+ }).optional(),
4795
5143
  skills: zod.z.object({ maxCatalogSkills: zod.z.number().int().min(1).max(100).optional() }).optional(),
5144
+ managementApi: managementApiSchema.optional(),
4796
5145
  remoteApi: remoteApiSchema.optional(),
4797
5146
  /** Human-in-the-loop tool approval policy. Off by default. */
4798
5147
  toolApproval: toolApprovalPolicySchema,
@@ -5050,6 +5399,21 @@ const sttSchema = zod.z.object({
5050
5399
  openai: sttOpenaiSchema.optional(),
5051
5400
  azureOpenAI: sttAzureOpenAISchema.optional()
5052
5401
  });
5402
+ /**
5403
+ * The speech providers a schema actually configures. `allowedAddresses` is transport
5404
+ * policy rather than a provider, and a provider key present but empty configures
5405
+ * nothing. The speech services accept a schema only when exactly one survives here, so
5406
+ * the upload router reads availability from the same list and never routes audio to a
5407
+ * transcription that cannot run.
5408
+ */
5409
+ function listConfiguredSpeechProviders(schema) {
5410
+ if (schema == null) return [];
5411
+ return Object.entries(schema).filter(([key, value]) => key !== "allowedAddresses" && value != null && typeof value === "object" && Object.keys(value).length > 0);
5412
+ }
5413
+ /** Whether a speech schema names exactly one usable provider. */
5414
+ function isSpeechProviderConfigured(schema) {
5415
+ return listConfiguredSpeechProviders(schema).length === 1;
5416
+ }
5053
5417
  const speechTab = zod.z.object({
5054
5418
  conversationMode: zod.z.boolean().optional(),
5055
5419
  advancedMode: zod.z.boolean().optional(),
@@ -5134,7 +5498,14 @@ const termsOfServiceSchema = zod.z.object({
5134
5498
  modalContent: zod.z.string().or(zod.z.array(zod.z.string())).optional()
5135
5499
  });
5136
5500
  const localizedStringSchema = zod.z.union([zod.z.string(), zod.z.record(zod.z.string())]);
5501
+ const mcpRefreshDefaults = {
5502
+ toolsRefreshInterval: 300 * 1e3,
5503
+ statusRefreshInterval: 30 * 1e3
5504
+ };
5137
5505
  const mcpServersSchema = zod.z.object({
5506
+ /** Foreground polling intervals in milliseconds; 0 disables polling. */
5507
+ toolsRefreshInterval: zod.z.number().int().nonnegative().max(2147483647).optional(),
5508
+ statusRefreshInterval: zod.z.number().int().nonnegative().max(2147483647).optional(),
5138
5509
  placeholder: zod.z.string().optional(),
5139
5510
  use: zod.z.boolean().optional(),
5140
5511
  create: zod.z.boolean().optional(),
@@ -5146,6 +5517,68 @@ const mcpServersSchema = zod.z.object({
5146
5517
  subLabel: localizedStringSchema.optional()
5147
5518
  }).optional()
5148
5519
  }).optional();
5520
+ /** Values the trace viewer uses for any `interface.traceViewer` field left unset. */
5521
+ const traceViewerDefaults = {
5522
+ enabled: false,
5523
+ showInputOutput: false,
5524
+ maxRecords: 1e3,
5525
+ maxContentLength: 5e4,
5526
+ requestsPerMinute: 30,
5527
+ requestTimeoutMs: 1e4
5528
+ };
5529
+ /** Inclusive bounds for the numeric `interface.traceViewer` fields. */
5530
+ const traceViewerLimits = {
5531
+ maxRecords: {
5532
+ min: 1,
5533
+ max: 1e4
5534
+ },
5535
+ maxContentLength: {
5536
+ min: 1,
5537
+ max: 1e6
5538
+ },
5539
+ requestsPerMinute: {
5540
+ min: 1,
5541
+ max: 1e3
5542
+ },
5543
+ requestTimeoutMs: {
5544
+ min: 1e3,
5545
+ max: 3e5
5546
+ }
5547
+ };
5548
+ const boundedIntegerSchema = (field) => zod.z.number().int().min(traceViewerLimits[field].min).max(traceViewerLimits[field].max).optional();
5549
+ const traceViewerSchema = zod.z.object({
5550
+ /** Shows the conversation trace control for traces this deployment exported. */
5551
+ enabled: zod.z.boolean().optional(),
5552
+ /** Returns observation input, output and metadata in the record inspector. */
5553
+ showInputOutput: zod.z.boolean().optional(),
5554
+ /** Observations read from the tracing backend per request. */
5555
+ maxRecords: boundedIntegerSchema("maxRecords"),
5556
+ /** Characters kept from each input, output and metadata value before truncation. */
5557
+ maxContentLength: boundedIntegerSchema("maxContentLength"),
5558
+ /** Trace reads one user may start per minute. */
5559
+ requestsPerMinute: boundedIntegerSchema("requestsPerMinute"),
5560
+ /** Budget for each round trip to the tracing backend, in milliseconds. */
5561
+ requestTimeoutMs: boundedIntegerSchema("requestTimeoutMs")
5562
+ });
5563
+ function boundedInteger(value, field) {
5564
+ const { min, max } = traceViewerLimits[field];
5565
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= min ? Math.min(value, max) : traceViewerDefaults[field];
5566
+ }
5567
+ /**
5568
+ * Fills unset or invalid `interface.traceViewer` fields from
5569
+ * {@link traceViewerDefaults}. Admin config overrides reach runtime without
5570
+ * schema validation, so every consumer reads the section through this.
5571
+ */
5572
+ function resolveTraceViewerConfig(config) {
5573
+ return {
5574
+ enabled: config?.enabled === true,
5575
+ showInputOutput: config?.showInputOutput === true,
5576
+ maxRecords: boundedInteger(config?.maxRecords, "maxRecords"),
5577
+ maxContentLength: boundedInteger(config?.maxContentLength, "maxContentLength"),
5578
+ requestsPerMinute: boundedInteger(config?.requestsPerMinute, "requestsPerMinute"),
5579
+ requestTimeoutMs: boundedInteger(config?.requestTimeoutMs, "requestTimeoutMs")
5580
+ };
5581
+ }
5149
5582
  let RetentionMode = /* @__PURE__ */ function(RetentionMode) {
5150
5583
  RetentionMode["ALL"] = "all";
5151
5584
  RetentionMode["TEMPORARY"] = "temporary";
@@ -5179,6 +5612,7 @@ const interfaceSchema = zod.z.object({
5179
5612
  })]).optional(),
5180
5613
  temporaryChat: zod.z.boolean().optional(),
5181
5614
  temporaryChatRetention: zod.z.number().min(1).max(8760).optional(),
5615
+ generalChatRetention: zod.z.number().min(1).max(8760).optional(),
5182
5616
  autoSubmitFromUrl: zod.z.boolean().optional(),
5183
5617
  retentionMode: zod.z.nativeEnum(RetentionMode).default("temporary"),
5184
5618
  retainAgentFiles: zod.z.boolean().optional(),
@@ -5199,6 +5633,7 @@ const interfaceSchema = zod.z.object({
5199
5633
  marketplace: zod.z.object({ use: zod.z.boolean().optional() }).optional(),
5200
5634
  fileSearch: zod.z.boolean().optional(),
5201
5635
  fileCitations: zod.z.boolean().optional(),
5636
+ traceViewer: traceViewerSchema.optional(),
5202
5637
  /** Tool keys (and `'mcp'` or an MCP server name) pinned to the prompt bar by default */
5203
5638
  defaultPinnedTools: zod.z.array(zod.z.string()).optional(),
5204
5639
  buildInfo: zod.z.boolean().optional(),
@@ -5227,7 +5662,10 @@ const interfaceSchema = zod.z.object({
5227
5662
  maxPerUser: zod.z.number().int().min(0).optional(),
5228
5663
  minIntervalMinutes: zod.z.number().int().min(1).optional(),
5229
5664
  autoDisableAfterFailures: zod.z.number().int().min(1).optional(),
5665
+ admissionConcurrency: zod.z.number().int().min(1).max(100).optional(),
5230
5666
  fireConcurrency: zod.z.number().int().min(1).optional(),
5667
+ mcpPreflightConcurrency: zod.z.number().int().min(1).max(10).optional(),
5668
+ mcpPreflightTimeoutMs: zod.z.number().int().min(1e3).max(6e5).optional(),
5231
5669
  /** Refuse schedules that are not filed under a chat project. Enforced on
5232
5670
  * create/update AND at every fire, so raising it later stops schedules
5233
5671
  * that predate the policy instead of grandfathering them. */
@@ -5620,6 +6058,57 @@ const messageFilterPiiSchema = zod.z.object({
5620
6058
  });
5621
6059
  });
5622
6060
  const messageFilterSchema = zod.z.object({ pii: messageFilterPiiSchema.optional() });
6061
+ /** User fields a deployment may select as the Langfuse trace `userId`. */
6062
+ const LANGFUSE_TRACE_USER_ID_FIELDS = [
6063
+ "id",
6064
+ "email",
6065
+ "username",
6066
+ "name",
6067
+ "openidId",
6068
+ "samlId",
6069
+ "ldapId",
6070
+ "googleId",
6071
+ "githubId",
6072
+ "discordId",
6073
+ "appleId",
6074
+ "facebookId"
6075
+ ];
6076
+ /** User fields a deployment may copy into Langfuse trace metadata. */
6077
+ const LANGFUSE_TRACE_USER_METADATA_FIELDS = [
6078
+ ...LANGFUSE_TRACE_USER_ID_FIELDS,
6079
+ "role",
6080
+ "provider"
6081
+ ];
6082
+ /** Request fields a deployment may copy into Langfuse trace metadata. */
6083
+ const LANGFUSE_TRACE_CONVERSATION_METADATA_FIELDS = [
6084
+ "conversationId",
6085
+ "endpoint",
6086
+ "endpointType",
6087
+ "provider",
6088
+ "model",
6089
+ "modelLabel",
6090
+ "spec"
6091
+ ];
6092
+ /**
6093
+ * What a deployment attaches to every Langfuse trace beyond the defaults.
6094
+ * Nothing here is exported unless explicitly listed, so the default trace
6095
+ * carries only the internal user id and no user or request metadata.
6096
+ */
6097
+ const langfuseTraceConfigSchema = zod.z.object({
6098
+ /**
6099
+ * Which user field becomes the trace `userId`. Defaults to the internal user
6100
+ * id; a user with no value for the chosen field keeps the internal id.
6101
+ */
6102
+ userIdField: zod.z.enum(LANGFUSE_TRACE_USER_ID_FIELDS).optional(),
6103
+ /** User fields exported as `librechat.user.<field>` trace metadata. */
6104
+ userMetadataFields: zod.z.array(zod.z.enum(LANGFUSE_TRACE_USER_METADATA_FIELDS)).optional(),
6105
+ /**
6106
+ * Request fields exported as trace metadata: `librechat.conversation.id`,
6107
+ * `librechat.endpoint`, `librechat.endpoint.type`, `librechat.provider`,
6108
+ * `librechat.model`, `librechat.model.label`, and `librechat.spec`.
6109
+ */
6110
+ conversationMetadataFields: zod.z.array(zod.z.enum(LANGFUSE_TRACE_CONVERSATION_METADATA_FIELDS)).optional()
6111
+ });
5623
6112
  const langfuseConfigSchema = zod.z.object({
5624
6113
  enabled: zod.z.boolean().optional(),
5625
6114
  publicKey: zod.z.string().optional(),
@@ -5651,7 +6140,9 @@ const langfuseConfigSchema = zod.z.object({
5651
6140
  * schema does not yet express — and note the fanout collector forwards only
5652
6141
  * `Authorization` upstream regardless.
5653
6142
  */
5654
- headers: zod.z.record(zod.z.string()).optional()
6143
+ headers: zod.z.record(zod.z.string()).optional(),
6144
+ /** Trace user identity and allowlisted user/request metadata. */
6145
+ trace: langfuseTraceConfigSchema.optional()
5655
6146
  });
5656
6147
  const configSchema = zod.z.object({
5657
6148
  version: zod.z.string(),
@@ -5669,7 +6160,35 @@ const configSchema = zod.z.object({
5669
6160
  mcpServers: MCPServersSchema.optional(),
5670
6161
  mcpSettings: zod.z.object({
5671
6162
  allowedDomains: zod.z.array(zod.z.string()).optional(),
5672
- allowedAddresses: allowedAddressesSchema
6163
+ allowedAddresses: allowedAddressesSchema,
6164
+ catalogRecovery: zod.z.object({
6165
+ discoveryBackoffMs: zod.z.array(zod.z.number().int().positive().max(1440 * 6e4)).min(1).max(8).default([
6166
+ 5 * 6e4,
6167
+ 10 * 6e4,
6168
+ 20 * 6e4,
6169
+ 30 * 6e4
6170
+ ]),
6171
+ discoveryTimeoutMs: zod.z.number().int().positive().max(5 * 6e4).default(3e3),
6172
+ /** How long past `discoveryTimeoutMs` a stalled discovery may hold its catalog slot and
6173
+ * coalesced requests. It is never cancelled, so OAuth tokens it redeemed still persist,
6174
+ * and no other discovery for the same server state starts until it settles. */
6175
+ discoverySettleGraceMs: zod.z.number().int().nonnegative().max(5 * 6e4).default(1e4),
6176
+ reauthRetryMs: zod.z.number().int().positive().max(1440 * 6e4).default(30 * 6e4),
6177
+ maxStateEntries: zod.z.number().int().positive().max(1e6).default(1e4),
6178
+ /** Process-wide: how many discoveries released past `discoverySettleGraceMs` may still be
6179
+ * running before recovery starts no new discovery until one settles. The default matches
6180
+ * the three catalog slots a stalled dependency could hold before discoveries were released. */
6181
+ maxDetachedDiscoveries: zod.z.number().int().positive().max(1e3).default(3),
6182
+ generationReadTimeoutMs: zod.z.number().int().positive().max(1e4).default(500),
6183
+ authorizationFenceRetryMs: zod.z.array(zod.z.number().int().nonnegative().max(6e4)).min(1).max(8).default([
6184
+ 0,
6185
+ 50,
6186
+ 200
6187
+ ]),
6188
+ authorizationFenceTimeoutMs: zod.z.number().int().positive().max(3e4).default(1e3),
6189
+ authorizationFenceRetryIntervalMs: zod.z.number().int().positive().max(60 * 6e4).default(3e4),
6190
+ authorizationFenceRetryBatchSize: zod.z.number().int().positive().max(1e4).default(100)
6191
+ }).default({})
5673
6192
  }).optional(),
5674
6193
  interface: interfaceSchema,
5675
6194
  turnstile: turnstileSchema.optional(),
@@ -5728,6 +6247,7 @@ let KnownEndpoints = /* @__PURE__ */ function(KnownEndpoints) {
5728
6247
  KnownEndpoints["groq"] = "groq";
5729
6248
  KnownEndpoints["helicone"] = "helicone";
5730
6249
  KnownEndpoints["huggingface"] = "huggingface";
6250
+ KnownEndpoints["lemonade"] = "lemonade";
5731
6251
  KnownEndpoints["mistral"] = "mistral";
5732
6252
  KnownEndpoints["mlx"] = "mlx";
5733
6253
  KnownEndpoints["ollama"] = "ollama";
@@ -5766,6 +6286,7 @@ const alternateName = {
5766
6286
  ["anthropic"]: "Anthropic",
5767
6287
  ["custom"]: "Custom",
5768
6288
  ["bedrock"]: "AWS Bedrock",
6289
+ ["lemonade"]: "AMD Lemonade",
5769
6290
  ["ollama"]: "Ollama",
5770
6291
  ["deepseek"]: "DeepSeek",
5771
6292
  ["moonshot"]: "Moonshot",
@@ -5773,6 +6294,14 @@ const alternateName = {
5773
6294
  ["vercel"]: "Vercel",
5774
6295
  ["helicone"]: "Helicone"
5775
6296
  };
6297
+ /**
6298
+ * Models the Assistants endpoints cannot run. GPT-6 Astra serves tool calls only
6299
+ * from the Responses API, and the Assistants surface does not route through
6300
+ * `getOpenAILLMConfig`, so listing it there would offer a configuration the
6301
+ * provider rejects. Kept out of `sharedOpenAIModels`, which both Assistants
6302
+ * catalogs consume.
6303
+ */
6304
+ const responsesOnlyOpenAIModels = ["gpt-6-astra"];
5776
6305
  const sharedOpenAIModels = [
5777
6306
  "gpt-5.6",
5778
6307
  "gpt-5.6-terra",
@@ -5868,7 +6397,7 @@ const bedrockModels = [
5868
6397
  const defaultModels = {
5869
6398
  ["azureAssistants"]: sharedOpenAIModels,
5870
6399
  ["assistants"]: [...sharedOpenAIModels, "chatgpt-4o-latest"],
5871
- ["agents"]: sharedOpenAIModels,
6400
+ ["agents"]: [...responsesOnlyOpenAIModels, ...sharedOpenAIModels],
5872
6401
  ["google"]: [
5873
6402
  "gemini-3.8-flash",
5874
6403
  "gemini-3.7-flash",
@@ -5886,6 +6415,7 @@ const defaultModels = {
5886
6415
  ],
5887
6416
  ["anthropic"]: sharedAnthropicModels,
5888
6417
  ["openAI"]: [
6418
+ ...responsesOnlyOpenAIModels,
5889
6419
  ...sharedOpenAIModels,
5890
6420
  "chatgpt-4o-latest",
5891
6421
  "gpt-4-vision-preview",
@@ -5898,12 +6428,19 @@ const fitlerAssistantModels = (str) => {
5898
6428
  return /gpt-4|gpt-3\\.5/i.test(str) && !/vision|instruct/i.test(str);
5899
6429
  };
5900
6430
  const openAIModels = defaultModels["openAI"];
6431
+ /**
6432
+ * The OpenAI catalog without the models only the first-party OpenAI endpoint
6433
+ * can run. Azure OpenAI shares this list, but Astra is neither routed to the
6434
+ * Responses API nor given its request constraints there, and listing it first
6435
+ * would let it become the default selection.
6436
+ */
6437
+ const nonResponsesOnlyOpenAIModels = openAIModels.filter((model) => !responsesOnlyOpenAIModels.includes(model));
5901
6438
  const initialModelsConfig = {
5902
6439
  initial: [],
5903
6440
  ["openAI"]: openAIModels,
5904
6441
  ["assistants"]: openAIModels.filter(fitlerAssistantModels),
5905
6442
  ["agents"]: openAIModels,
5906
- ["azureOpenAI"]: openAIModels,
6443
+ ["azureOpenAI"]: nonResponsesOnlyOpenAIModels,
5907
6444
  ["google"]: defaultModels["google"],
5908
6445
  ["anthropic"]: defaultModels["anthropic"],
5909
6446
  ["bedrock"]: defaultModels["bedrock"]
@@ -6201,6 +6738,10 @@ let ViolationTypes = /* @__PURE__ */ function(ViolationTypes) {
6201
6738
  * Registration violations.
6202
6739
  */
6203
6740
  ViolationTypes["REGISTRATIONS"] = "registrations";
6741
+ /**
6742
+ * Shared link retrieval limit violations.
6743
+ */
6744
+ ViolationTypes["SHARE_LIMIT"] = "share_limit";
6204
6745
  return ViolationTypes;
6205
6746
  }({});
6206
6747
  /**
@@ -6268,6 +6809,10 @@ let ErrorTypes = /* @__PURE__ */ function(ErrorTypes) {
6268
6809
  */
6269
6810
  ErrorTypes["STATEFUL_CODE_ENVIRONMENT_NOT_ALLOWED"] = "stateful_code_environment_not_allowed";
6270
6811
  /**
6812
+ * A conversation's selected attached workspace cannot be used as requested.
6813
+ */
6814
+ ErrorTypes["CODE_WORKSPACE_UNAVAILABLE"] = "code_workspace_unavailable";
6815
+ /**
6271
6816
  * Invalid Agent Provider (excluded by Admin)
6272
6817
  */
6273
6818
  ErrorTypes["INVALID_AGENT_PROVIDER"] = "invalid_agent_provider";
@@ -6311,6 +6856,26 @@ let ErrorTypes = /* @__PURE__ */ function(ErrorTypes) {
6311
6856
  * Provider throttled or refused the request for exceeding a rate/spend allowance
6312
6857
  */
6313
6858
  ErrorTypes["MODEL_RATE_LIMIT"] = "model_rate_limit";
6859
+ /**
6860
+ * An agent model provider failed and the run could not recover.
6861
+ */
6862
+ ErrorTypes["UPSTREAM_MODEL_ERROR"] = "upstream_model_error";
6863
+ /**
6864
+ * Context pruning removed every message; nothing fits the configured context window
6865
+ */
6866
+ ErrorTypes["EMPTY_MESSAGES"] = "empty_messages";
6867
+ /**
6868
+ * Formatted provider payload exceeded the context budget before invocation
6869
+ */
6870
+ ErrorTypes["FINAL_CONTEXT_OVERFLOW"] = "final_context_overflow";
6871
+ /**
6872
+ * A manual compaction the graph could not attempt; `reason` says why
6873
+ */
6874
+ ErrorTypes["COMPACTION_SKIPPED"] = "compaction_skipped";
6875
+ /**
6876
+ * A manual compaction whose summarizer produced nothing; history is untouched
6877
+ */
6878
+ ErrorTypes["COMPACTION_FAILED"] = "compaction_failed";
6314
6879
  return ErrorTypes;
6315
6880
  }({});
6316
6881
  /**
@@ -6442,7 +7007,7 @@ let TTSProviders = /* @__PURE__ */ function(TTSProviders) {
6442
7007
  /** Enum for app-wide constants */
6443
7008
  let Constants = /* @__PURE__ */ function(Constants) {
6444
7009
  /**
6445
- * Key for the app's version. The placeholder `v0.8.8-rc2` is
7010
+ * Key for the app's version. The placeholder `v0.8.8-rc3` is
6446
7011
  * swapped in by `@rollup/plugin-replace` during `npm run build:data-provider`
6447
7012
  * using the value of the root `package.json`'s `version` field. Consumers
6448
7013
  * always import this via the built dist bundle (see `main` field in
@@ -6450,9 +7015,9 @@ let Constants = /* @__PURE__ */ function(Constants) {
6450
7015
  * substituted value. Only tests that import the TypeScript source directly
6451
7016
  * would observe the raw placeholder.
6452
7017
  */
6453
- Constants["VERSION"] = "v0.8.8-rc2";
7018
+ Constants["VERSION"] = "v0.8.8-rc3";
6454
7019
  /** Key for the Custom Config's version (librechat.yaml). */
6455
- Constants["CONFIG_VERSION"] = "1.3.15";
7020
+ Constants["CONFIG_VERSION"] = "1.3.16";
6456
7021
  /** Standard value for the first message's `parentMessageId` value, to indicate no parent exists. */
6457
7022
  Constants["NO_PARENT"] = "00000000-0000-0000-0000-000000000000";
6458
7023
  /** Standard value to use whatever the submission prelim. `responseMessageId` is */
@@ -6929,6 +7494,8 @@ let PermissionBits = /* @__PURE__ */ function(PermissionBits) {
6929
7494
  PermissionBits[PermissionBits["DELETE"] = 4] = "DELETE";
6930
7495
  /** 1000 - Can share agent with others (future) */
6931
7496
  PermissionBits[PermissionBits["SHARE"] = 8] = "SHARE";
7497
+ /** 10000 - Can view Insights data for an agent when VIEW is also present */
7498
+ PermissionBits[PermissionBits["VIEW_INSIGHTS"] = 16] = "VIEW_INSIGHTS";
6932
7499
  return PermissionBits;
6933
7500
  }({});
6934
7501
  /**
@@ -6970,6 +7537,8 @@ const principalSchema = zod.z.object({
6970
7537
  description: zod.z.string().optional(),
6971
7538
  idOnTheSource: zod.z.string().optional(),
6972
7539
  accessRoleId: zod.z.nativeEnum(AccessRoleIds).optional(),
7540
+ viewInsights: zod.z.boolean().optional(),
7541
+ isAdmin: zod.z.boolean().optional(),
6973
7542
  memberCount: zod.z.number().optional()
6974
7543
  });
6975
7544
  /**
@@ -7103,6 +7672,9 @@ let QueryKeys = /* @__PURE__ */ function(QueryKeys) {
7103
7672
  QueryKeys["searchEnabled"] = "searchEnabled";
7104
7673
  QueryKeys["langfuseConnection"] = "langfuseConnection";
7105
7674
  QueryKeys["langfuseSessionLink"] = "langfuseSessionLink";
7675
+ QueryKeys["conversationTraceAvailability"] = "conversationTraceAvailability";
7676
+ QueryKeys["conversationTraceRecords"] = "conversationTraceRecords";
7677
+ QueryKeys["conversationTraceRecord"] = "conversationTraceRecord";
7106
7678
  QueryKeys["user"] = "user";
7107
7679
  QueryKeys["name"] = "name";
7108
7680
  QueryKeys["models"] = "models";
@@ -7179,13 +7751,26 @@ let QueryKeys = /* @__PURE__ */ function(QueryKeys) {
7179
7751
  QueryKeys["subagentThread"] = "subagentThread";
7180
7752
  QueryKeys["codeEnvironments"] = "codeEnvironments";
7181
7753
  QueryKeys["agentQueuedTurns"] = "agentQueuedTurns";
7754
+ QueryKeys["pinnedOrder"] = "pinnedOrder";
7182
7755
  return QueryKeys;
7183
7756
  }({});
7184
- const DynamicQueryKeys = { agentFiles: (agentId) => ["agentFiles", agentId] };
7757
+ const DynamicQueryKeys = {
7758
+ agentFiles: (agentId) => ["agentFiles", agentId],
7759
+ codeEnvironmentStatus: (id) => [
7760
+ "codeEnvironments",
7761
+ id,
7762
+ "status"
7763
+ ]
7764
+ };
7185
7765
  let MutationKeys = /* @__PURE__ */ function(MutationKeys) {
7186
7766
  MutationKeys["subagentControl"] = "subagentControl";
7187
7767
  MutationKeys["enqueueAgentQueuedTurn"] = "enqueueAgentQueuedTurn";
7188
7768
  MutationKeys["cancelAgentQueuedTurn"] = "cancelAgentQueuedTurn";
7769
+ /** Whole-array favorites write, keyed so every hook instance's write is
7770
+ * visible to the others through the query client. */
7771
+ MutationKeys["updateFavorites"] = "updateFavorites";
7772
+ /** Pinned-section display order write, keyed for the same reason. */
7773
+ MutationKeys["updatePinnedOrder"] = "updatePinnedOrder";
7189
7774
  MutationKeys["updateLangfuseConnection"] = "updateLangfuseConnection";
7190
7775
  MutationKeys["testLangfuseConnection"] = "testLangfuseConnection";
7191
7776
  MutationKeys["createAgentApiKey"] = "createAgentApiKey";
@@ -7707,10 +8292,14 @@ var data_service_exports = /* @__PURE__ */ __exportAll({
7707
8292
  getAvailableTools: () => getAvailableTools,
7708
8293
  getBanner: () => getBanner,
7709
8294
  getCategories: () => getCategories,
8295
+ getCodeEnvironmentStatus: () => getCodeEnvironmentStatus,
7710
8296
  getCodeEnvironments: () => getCodeEnvironments,
7711
8297
  getCodeOutputDownload: () => getCodeOutputDownload,
7712
8298
  getConversationById: () => getConversationById,
7713
8299
  getConversationTags: () => getConversationTags,
8300
+ getConversationTraceAvailability: () => getConversationTraceAvailability,
8301
+ getConversationTraceRecord: () => getConversationTraceRecord,
8302
+ getConversationTraceRecords: () => getConversationTraceRecords,
7714
8303
  getConversations: () => getConversations,
7715
8304
  getCustomConfigSpeech: () => getCustomConfigSpeech,
7716
8305
  getDomainServerBaseUrl: () => getDomainServerBaseUrl,
@@ -7742,6 +8331,7 @@ var data_service_exports = /* @__PURE__ */ __exportAll({
7742
8331
  getMessagesByConvoId: () => getMessagesByConvoId,
7743
8332
  getModels: () => getModels,
7744
8333
  getParentSubagents: () => getParentSubagents,
8334
+ getPinnedOrder: () => getPinnedOrder,
7745
8335
  getPresets: () => getPresets,
7746
8336
  getProjectById: () => getProjectById,
7747
8337
  getPrompt: () => getPrompt,
@@ -7833,6 +8423,7 @@ var data_service_exports = /* @__PURE__ */ __exportAll({
7833
8423
  updateMessage: () => updateMessage,
7834
8424
  updateMessageContent: () => updateMessageContent,
7835
8425
  updatePeoplePickerPermissions: () => updatePeoplePickerPermissions,
8426
+ updatePinnedOrder: () => updatePinnedOrder,
7836
8427
  updatePreset: () => updatePreset,
7837
8428
  updateProject: () => updateProject,
7838
8429
  updatePromptGroup: () => updatePromptGroup,
@@ -7864,13 +8455,23 @@ var data_service_exports = /* @__PURE__ */ __exportAll({
7864
8455
  });
7865
8456
  function getInsights(params = {}) {
7866
8457
  const query = new URLSearchParams();
7867
- for (const [key, value] of Object.entries(params)) if (value !== void 0 && value !== null && value !== "") query.set(key, String(value));
8458
+ for (const [key, value] of Object.entries(params)) if (Array.isArray(value)) value.forEach((item) => query.append(key, String(item)));
8459
+ else if (value !== void 0 && value !== null && value !== "") query.set(key, String(value));
7868
8460
  const suffix = query.toString() ? `?${query.toString()}` : "";
7869
8461
  return request_default.get(`${insights()}${suffix}`);
7870
8462
  }
7871
8463
  function getInsightsAccess() {
7872
8464
  return request_default.get(insightsAccess());
7873
8465
  }
8466
+ function getConversationTraceAvailability(conversationId) {
8467
+ return request_default.get(conversationTraceAvailability(conversationId));
8468
+ }
8469
+ function getConversationTraceRecords({ conversationId, cursor }, signal) {
8470
+ return request_default.get(conversationTraceRecords(conversationId, cursor), signal ? { signal } : void 0);
8471
+ }
8472
+ function getConversationTraceRecord({ conversationId, recordId, messageId, sourceId }, signal) {
8473
+ return request_default.get(conversationTraceRecord(conversationId, recordId, messageId, sourceId), signal ? { signal } : void 0);
8474
+ }
7874
8475
  function getLangfuseConnection() {
7875
8476
  return request_default.get(adminLangfuseConnection());
7876
8477
  }
@@ -7895,6 +8496,9 @@ function deleteUser(payload) {
7895
8496
  function getCodeEnvironments() {
7896
8497
  return request_default.get(codeEnvironments());
7897
8498
  }
8499
+ function getCodeEnvironmentStatus(id) {
8500
+ return request_default.get(codeEnvironmentStatus(id));
8501
+ }
7898
8502
  function pairCodeEnvironment(payload) {
7899
8503
  return request_default.post(codeEnvironmentPairings(), payload);
7900
8504
  }
@@ -7910,6 +8514,13 @@ function getFavorites() {
7910
8514
  function updateFavorites(favorites) {
7911
8515
  return request_default.post(`${apiBaseUrl()}/api/user/settings/favorites`, { favorites });
7912
8516
  }
8517
+ /** Combined Pinned-section display order: favorite and pinned-chat entry keys interleaved. */
8518
+ function getPinnedOrder() {
8519
+ return request_default.get(pinnedOrder());
8520
+ }
8521
+ function updatePinnedOrder(pinnedOrder$1) {
8522
+ return request_default.post(pinnedOrder(), { pinnedOrder: pinnedOrder$1 });
8523
+ }
7913
8524
  /** Tool favorites — starred marketplace items (builtins, tools, MCP servers, skills). */
7914
8525
  function getToolFavorites() {
7915
8526
  return request_default.get(toolFavorites());
@@ -8854,6 +9465,60 @@ Object.defineProperty(exports, "BedrockReasoningConfig", {
8854
9465
  return BedrockReasoningConfig;
8855
9466
  }
8856
9467
  });
9468
+ Object.defineProperty(exports, "CODE_APPROVAL_MODES", {
9469
+ enumerable: true,
9470
+ get: function() {
9471
+ return CODE_APPROVAL_MODES;
9472
+ }
9473
+ });
9474
+ Object.defineProperty(exports, "CODE_ENVIRONMENT_COMMAND_TIMEOUT_DEFAULT_MS", {
9475
+ enumerable: true,
9476
+ get: function() {
9477
+ return CODE_ENVIRONMENT_COMMAND_TIMEOUT_DEFAULT_MS;
9478
+ }
9479
+ });
9480
+ Object.defineProperty(exports, "CODE_ENVIRONMENT_COMMAND_TIMEOUT_HARD_MAX_MS", {
9481
+ enumerable: true,
9482
+ get: function() {
9483
+ return CODE_ENVIRONMENT_COMMAND_TIMEOUT_HARD_MAX_MS;
9484
+ }
9485
+ });
9486
+ Object.defineProperty(exports, "CODE_ENVIRONMENT_DECISION_VERSION", {
9487
+ enumerable: true,
9488
+ get: function() {
9489
+ return CODE_ENVIRONMENT_DECISION_VERSION;
9490
+ }
9491
+ });
9492
+ Object.defineProperty(exports, "CODE_ENVIRONMENT_MODES", {
9493
+ enumerable: true,
9494
+ get: function() {
9495
+ return CODE_ENVIRONMENT_MODES;
9496
+ }
9497
+ });
9498
+ Object.defineProperty(exports, "CODE_WORKSPACE_ID_PATTERN", {
9499
+ enumerable: true,
9500
+ get: function() {
9501
+ return CODE_WORKSPACE_ID_PATTERN;
9502
+ }
9503
+ });
9504
+ Object.defineProperty(exports, "CODE_WORKSPACE_MAX_COUNT", {
9505
+ enumerable: true,
9506
+ get: function() {
9507
+ return CODE_WORKSPACE_MAX_COUNT;
9508
+ }
9509
+ });
9510
+ Object.defineProperty(exports, "CODE_WORKSPACE_OPERATIONS", {
9511
+ enumerable: true,
9512
+ get: function() {
9513
+ return CODE_WORKSPACE_OPERATIONS;
9514
+ }
9515
+ });
9516
+ Object.defineProperty(exports, "CODE_WORKSPACE_SELECTION_ERROR_REASONS", {
9517
+ enumerable: true,
9518
+ get: function() {
9519
+ return CODE_WORKSPACE_SELECTION_ERROR_REASONS;
9520
+ }
9521
+ });
8857
9522
  Object.defineProperty(exports, "CONVERSATION_STARTER_FILTER_FIELDS", {
8858
9523
  enumerable: true,
8859
9524
  get: function() {
@@ -8878,6 +9543,12 @@ Object.defineProperty(exports, "Capabilities", {
8878
9543
  return Capabilities;
8879
9544
  }
8880
9545
  });
9546
+ Object.defineProperty(exports, "CodeApprovalModeError", {
9547
+ enumerable: true,
9548
+ get: function() {
9549
+ return CodeApprovalModeError;
9550
+ }
9551
+ });
8881
9552
  Object.defineProperty(exports, "CohereConstants", {
8882
9553
  enumerable: true,
8883
9554
  get: function() {
@@ -8902,6 +9573,12 @@ Object.defineProperty(exports, "DEFAULT_MEMORY_MAX_INPUT_TOKENS", {
8902
9573
  return DEFAULT_MEMORY_MAX_INPUT_TOKENS;
8903
9574
  }
8904
9575
  });
9576
+ Object.defineProperty(exports, "DefaultLLMDeliveryPath", {
9577
+ enumerable: true,
9578
+ get: function() {
9579
+ return DefaultLLMDeliveryPath;
9580
+ }
9581
+ });
8905
9582
  Object.defineProperty(exports, "DynamicQueryKeys", {
8906
9583
  enumerable: true,
8907
9584
  get: function() {
@@ -9040,6 +9717,24 @@ Object.defineProperty(exports, "KnownEndpoints", {
9040
9717
  return KnownEndpoints;
9041
9718
  }
9042
9719
  });
9720
+ Object.defineProperty(exports, "LANGFUSE_TRACE_CONVERSATION_METADATA_FIELDS", {
9721
+ enumerable: true,
9722
+ get: function() {
9723
+ return LANGFUSE_TRACE_CONVERSATION_METADATA_FIELDS;
9724
+ }
9725
+ });
9726
+ Object.defineProperty(exports, "LANGFUSE_TRACE_USER_ID_FIELDS", {
9727
+ enumerable: true,
9728
+ get: function() {
9729
+ return LANGFUSE_TRACE_USER_ID_FIELDS;
9730
+ }
9731
+ });
9732
+ Object.defineProperty(exports, "LANGFUSE_TRACE_USER_METADATA_FIELDS", {
9733
+ enumerable: true,
9734
+ get: function() {
9735
+ return LANGFUSE_TRACE_USER_METADATA_FIELDS;
9736
+ }
9737
+ });
9043
9738
  Object.defineProperty(exports, "LocalStorageKeys", {
9044
9739
  enumerable: true,
9045
9740
  get: function() {
@@ -9064,6 +9759,12 @@ Object.defineProperty(exports, "MAX_GRAPH_SUBAGENT_MEMBERS", {
9064
9759
  return MAX_GRAPH_SUBAGENT_MEMBERS;
9065
9760
  }
9066
9761
  });
9762
+ Object.defineProperty(exports, "MAX_MCP_ICON_PATH_LENGTH", {
9763
+ enumerable: true,
9764
+ get: function() {
9765
+ return MAX_MCP_ICON_PATH_LENGTH;
9766
+ }
9767
+ });
9067
9768
  Object.defineProperty(exports, "MAX_PII_CUSTOM_PATTERNS_TOTAL", {
9068
9769
  enumerable: true,
9069
9770
  get: function() {
@@ -9562,6 +10263,12 @@ Object.defineProperty(exports, "actionMetadataFilterFieldSchema", {
9562
10263
  return actionMetadataFilterFieldSchema;
9563
10264
  }
9564
10265
  });
10266
+ Object.defineProperty(exports, "agentGitIdentitySchema", {
10267
+ enumerable: true,
10268
+ get: function() {
10269
+ return agentGitIdentitySchema;
10270
+ }
10271
+ });
9565
10272
  Object.defineProperty(exports, "agentInstructionFilterFieldSchema", {
9566
10273
  enumerable: true,
9567
10274
  get: function() {
@@ -9940,6 +10647,12 @@ Object.defineProperty(exports, "defaultEndpoints", {
9940
10647
  return defaultEndpoints;
9941
10648
  }
9942
10649
  });
10650
+ Object.defineProperty(exports, "defaultLLMDeliveryPathSchema", {
10651
+ enumerable: true,
10652
+ get: function() {
10653
+ return defaultLLMDeliveryPathSchema;
10654
+ }
10655
+ });
9943
10656
  Object.defineProperty(exports, "defaultModels", {
9944
10657
  enumerable: true,
9945
10658
  get: function() {
@@ -10276,6 +10989,12 @@ Object.defineProperty(exports, "getAllEffectivePermissions", {
10276
10989
  return getAllEffectivePermissions;
10277
10990
  }
10278
10991
  });
10992
+ Object.defineProperty(exports, "getAllowedCodeApprovalModes", {
10993
+ enumerable: true,
10994
+ get: function() {
10995
+ return getAllowedCodeApprovalModes;
10996
+ }
10997
+ });
10279
10998
  Object.defineProperty(exports, "getAvailablePlugins", {
10280
10999
  enumerable: true,
10281
11000
  get: function() {
@@ -10312,6 +11031,12 @@ Object.defineProperty(exports, "getDefaultParamsEndpoint", {
10312
11031
  return getDefaultParamsEndpoint;
10313
11032
  }
10314
11033
  });
11034
+ Object.defineProperty(exports, "getDocumentFileExtension", {
11035
+ enumerable: true,
11036
+ get: function() {
11037
+ return getDocumentFileExtension;
11038
+ }
11039
+ });
10315
11040
  Object.defineProperty(exports, "getEffectivePermissions", {
10316
11041
  enumerable: true,
10317
11042
  get: function() {
@@ -10594,6 +11319,30 @@ Object.defineProperty(exports, "isBedrockDocumentType", {
10594
11319
  return isBedrockDocumentType;
10595
11320
  }
10596
11321
  });
11322
+ Object.defineProperty(exports, "isCodeEnvironmentMode", {
11323
+ enumerable: true,
11324
+ get: function() {
11325
+ return isCodeEnvironmentMode;
11326
+ }
11327
+ });
11328
+ Object.defineProperty(exports, "isCodeWorkspaceSelection", {
11329
+ enumerable: true,
11330
+ get: function() {
11331
+ return isCodeWorkspaceSelection;
11332
+ }
11333
+ });
11334
+ Object.defineProperty(exports, "isCodeWorkspaceSelectionErrorReason", {
11335
+ enumerable: true,
11336
+ get: function() {
11337
+ return isCodeWorkspaceSelectionErrorReason;
11338
+ }
11339
+ });
11340
+ Object.defineProperty(exports, "isCodeWorkspaceSelections", {
11341
+ enumerable: true,
11342
+ get: function() {
11343
+ return isCodeWorkspaceSelections;
11344
+ }
11345
+ });
10597
11346
  Object.defineProperty(exports, "isDocumentSupportedProvider", {
10598
11347
  enumerable: true,
10599
11348
  get: function() {
@@ -10606,6 +11355,24 @@ Object.defineProperty(exports, "isImageVisionTool", {
10606
11355
  return isImageVisionTool;
10607
11356
  }
10608
11357
  });
11358
+ Object.defineProperty(exports, "isKnownProviderIdentifier", {
11359
+ enumerable: true,
11360
+ get: function() {
11361
+ return isKnownProviderIdentifier;
11362
+ }
11363
+ });
11364
+ Object.defineProperty(exports, "isMediaSupportedProvider", {
11365
+ enumerable: true,
11366
+ get: function() {
11367
+ return isMediaSupportedProvider;
11368
+ }
11369
+ });
11370
+ Object.defineProperty(exports, "isMessageFileUpload", {
11371
+ enumerable: true,
11372
+ get: function() {
11373
+ return isMessageFileUpload;
11374
+ }
11375
+ });
10609
11376
  Object.defineProperty(exports, "isMythosClassModel", {
10610
11377
  enumerable: true,
10611
11378
  get: function() {
@@ -10648,6 +11415,12 @@ Object.defineProperty(exports, "isRemoteOidcUrlAllowed", {
10648
11415
  return isRemoteOidcUrlAllowed;
10649
11416
  }
10650
11417
  });
11418
+ Object.defineProperty(exports, "isResponsesApiUpload", {
11419
+ enumerable: true,
11420
+ get: function() {
11421
+ return isResponsesApiUpload;
11422
+ }
11423
+ });
10651
11424
  Object.defineProperty(exports, "isSecureCodeEnvironmentControlURL", {
10652
11425
  enumerable: true,
10653
11426
  get: function() {
@@ -10660,6 +11433,12 @@ Object.defineProperty(exports, "isSensitiveEnvVar", {
10660
11433
  return isSensitiveEnvVar;
10661
11434
  }
10662
11435
  });
11436
+ Object.defineProperty(exports, "isSpeechProviderConfigured", {
11437
+ enumerable: true,
11438
+ get: function() {
11439
+ return isSpeechProviderConfigured;
11440
+ }
11441
+ });
10663
11442
  Object.defineProperty(exports, "isUUID", {
10664
11443
  enumerable: true,
10665
11444
  get: function() {
@@ -10672,6 +11451,18 @@ Object.defineProperty(exports, "langfuseConfigSchema", {
10672
11451
  return langfuseConfigSchema;
10673
11452
  }
10674
11453
  });
11454
+ Object.defineProperty(exports, "langfuseTraceConfigSchema", {
11455
+ enumerable: true,
11456
+ get: function() {
11457
+ return langfuseTraceConfigSchema;
11458
+ }
11459
+ });
11460
+ Object.defineProperty(exports, "listConfiguredSpeechProviders", {
11461
+ enumerable: true,
11462
+ get: function() {
11463
+ return listConfiguredSpeechProviders;
11464
+ }
11465
+ });
10675
11466
  Object.defineProperty(exports, "loginPage", {
10676
11467
  enumerable: true,
10677
11468
  get: function() {
@@ -10690,6 +11481,18 @@ Object.defineProperty(exports, "mbToBytes", {
10690
11481
  return mbToBytes;
10691
11482
  }
10692
11483
  });
11484
+ Object.defineProperty(exports, "mcpRefreshDefaults", {
11485
+ enumerable: true,
11486
+ get: function() {
11487
+ return mcpRefreshDefaults;
11488
+ }
11489
+ });
11490
+ Object.defineProperty(exports, "mediaSupportedProviders", {
11491
+ enumerable: true,
11492
+ get: function() {
11493
+ return mediaSupportedProviders;
11494
+ }
11495
+ });
10693
11496
  Object.defineProperty(exports, "megabyte", {
10694
11497
  enumerable: true,
10695
11498
  get: function() {
@@ -10918,6 +11721,18 @@ Object.defineProperty(exports, "resolveAllowedStatefulCodeEnvironments", {
10918
11721
  return resolveAllowedStatefulCodeEnvironments;
10919
11722
  }
10920
11723
  });
11724
+ Object.defineProperty(exports, "resolveCodeApprovalMode", {
11725
+ enumerable: true,
11726
+ get: function() {
11727
+ return resolveCodeApprovalMode;
11728
+ }
11729
+ });
11730
+ Object.defineProperty(exports, "resolveCodePermissionDecision", {
11731
+ enumerable: true,
11732
+ get: function() {
11733
+ return resolveCodePermissionDecision;
11734
+ }
11735
+ });
10921
11736
  Object.defineProperty(exports, "resolveEndpointType", {
10922
11737
  enumerable: true,
10923
11738
  get: function() {
@@ -10930,12 +11745,30 @@ Object.defineProperty(exports, "resolveModelSpecEndpoint", {
10930
11745
  return resolveModelSpecEndpoint;
10931
11746
  }
10932
11747
  });
11748
+ Object.defineProperty(exports, "resolveSandboxFilename", {
11749
+ enumerable: true,
11750
+ get: function() {
11751
+ return resolveSandboxFilename;
11752
+ }
11753
+ });
10933
11754
  Object.defineProperty(exports, "resolveStatefulCodeEnvironment", {
10934
11755
  enumerable: true,
10935
11756
  get: function() {
10936
11757
  return resolveStatefulCodeEnvironment;
10937
11758
  }
10938
11759
  });
11760
+ Object.defineProperty(exports, "resolveTraceViewerConfig", {
11761
+ enumerable: true,
11762
+ get: function() {
11763
+ return resolveTraceViewerConfig;
11764
+ }
11765
+ });
11766
+ Object.defineProperty(exports, "resolveUseResponsesApi", {
11767
+ enumerable: true,
11768
+ get: function() {
11769
+ return resolveUseResponsesApi;
11770
+ }
11771
+ });
10939
11772
  Object.defineProperty(exports, "resourcePermissionsResponseSchema", {
10940
11773
  enumerable: true,
10941
11774
  get: function() {
@@ -11218,6 +12051,18 @@ Object.defineProperty(exports, "toolArgumentFilterFieldSchema", {
11218
12051
  return toolArgumentFilterFieldSchema;
11219
12052
  }
11220
12053
  });
12054
+ Object.defineProperty(exports, "traceViewerDefaults", {
12055
+ enumerable: true,
12056
+ get: function() {
12057
+ return traceViewerDefaults;
12058
+ }
12059
+ });
12060
+ Object.defineProperty(exports, "traceViewerLimits", {
12061
+ enumerable: true,
12062
+ get: function() {
12063
+ return traceViewerLimits;
12064
+ }
12065
+ });
11221
12066
  Object.defineProperty(exports, "transactionsSchema", {
11222
12067
  enumerable: true,
11223
12068
  get: function() {
@@ -11351,4 +12196,4 @@ Object.defineProperty(exports, "webSearchSchema", {
11351
12196
  }
11352
12197
  });
11353
12198
 
11354
- //# sourceMappingURL=data-service-D5kHzBt-.js.map
12199
+ //# sourceMappingURL=data-service-CTX0tVO5.js.map