@cloudbase/cloudbase-mcp 2.19.5 → 2.20.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2458,6 +2458,8 @@ function registerEnvTools(server) {
2458
2458
  if (action === "status") {
2459
2459
  const loginState = await (0, auth_js_1.peekLoginState)();
2460
2460
  const authFlowState = await (0, auth_js_1.getAuthProgressState)();
2461
+ // 判断是否为 API Key 模式
2462
+ const isApiKeyMode = !!(process.env.CLOUDBASE_API_KEY && process.env.CLOUDBASE_ENV_ID);
2461
2463
  const authStatus = loginState
2462
2464
  ? "READY"
2463
2465
  : authFlowState.status === "PENDING"
@@ -2482,6 +2484,7 @@ function registerEnvTools(server) {
2482
2484
  ok: true,
2483
2485
  code: "STATUS",
2484
2486
  auth_status: authStatus,
2487
+ ...(isApiKeyMode ? { auth_mode: "api_key" } : {}),
2485
2488
  auth_config: authConfigSummary,
2486
2489
  ...(envPreparation
2487
2490
  ? buildAuthEnvSetupPayload(envPreparation)
@@ -2504,6 +2507,46 @@ function registerEnvTools(server) {
2504
2507
  });
2505
2508
  }
2506
2509
  if (action === "start_auth") {
2510
+ // API Key 模式:尝试换取临时密钥
2511
+ if (process.env.CLOUDBASE_API_KEY && process.env.CLOUDBASE_ENV_ID) {
2512
+ try {
2513
+ const existingLoginState = await (0, auth_js_1.peekLoginState)();
2514
+ if (existingLoginState) {
2515
+ return (0, tool_result_js_1.buildJsonToolResult)({
2516
+ ok: true,
2517
+ code: "AUTH_READY",
2518
+ message: "当前使用 API Key 认证模式,已自动完成登录,无需手动授权。",
2519
+ auth_mode: "api_key",
2520
+ envId: process.env.CLOUDBASE_ENV_ID,
2521
+ });
2522
+ }
2523
+ }
2524
+ catch (e) {
2525
+ // peekLoginState 内部异常,记录后 fall through
2526
+ (0, logger_js_1.debug)("start_auth: peekLoginState threw", { error: e instanceof Error ? e.message : String(e) });
2527
+ }
2528
+ // API Key 换取失败:返回详细诊断信息
2529
+ // 尝试获取更详细的错误信息
2530
+ let diagMessage = "当前配置了 API Key 认证模式,但换取临时密钥失败。";
2531
+ const endpoint = process.env.CLOUDBASE_API_ENDPOINT || `https://${process.env.CLOUDBASE_ENV_ID}.ap-shanghai.tcb-api.tencentcloudapi.com`;
2532
+ diagMessage += `\n\n诊断信息:`;
2533
+ diagMessage += `\n- CLOUDBASE_ENV_ID: ${process.env.CLOUDBASE_ENV_ID}`;
2534
+ diagMessage += `\n- CLOUDBASE_API_KEY: ${process.env.CLOUDBASE_API_KEY.slice(0, 20)}...(已截断)`;
2535
+ diagMessage += `\n- Endpoint: ${endpoint}`;
2536
+ diagMessage += `\n\n可能原因:`;
2537
+ diagMessage += `\n1. API Key 已过期或被删除`;
2538
+ diagMessage += `\n2. Endpoint 不可达(网络/DNS 问题)`;
2539
+ diagMessage += `\n3. CLOUDBASE_ENV_ID 与 API Key 所属环境不匹配`;
2540
+ diagMessage += `\n\n建议:检查 MCP 配置中的 CLOUDBASE_API_KEY 和 CLOUDBASE_ENV_ID 环境变量是否正确。`;
2541
+ return (0, tool_result_js_1.buildJsonToolResult)({
2542
+ ok: false,
2543
+ code: "API_KEY_AUTH_FAILED",
2544
+ message: diagMessage,
2545
+ auth_mode: "api_key",
2546
+ envId: process.env.CLOUDBASE_ENV_ID,
2547
+ endpoint,
2548
+ });
2549
+ }
2507
2550
  const region = server.cloudBaseOptions?.region || process.env.TCB_REGION;
2508
2551
  const auth = toolbox_1.AuthSupervisor.getInstance({});
2509
2552
  const authFlowState = await (0, auth_js_1.getAuthProgressState)();
@@ -2708,6 +2751,15 @@ function registerEnvTools(server) {
2708
2751
  });
2709
2752
  }
2710
2753
  if (action === "logout") {
2754
+ // API Key 模式下不允许 logout
2755
+ if (process.env.CLOUDBASE_API_KEY && process.env.CLOUDBASE_ENV_ID) {
2756
+ return (0, tool_result_js_1.buildJsonToolResult)({
2757
+ ok: false,
2758
+ code: "LOGOUT_NOT_ALLOWED",
2759
+ message: "当前使用 API Key 认证模式,不支持退出登录。如需切换认证方式,请移除 CLOUDBASE_API_KEY 环境变量后重启。",
2760
+ auth_mode: "api_key",
2761
+ });
2762
+ }
2711
2763
  if (confirm !== "yes") {
2712
2764
  return (0, tool_result_js_1.buildJsonToolResult)({
2713
2765
  ok: false,
@@ -2834,29 +2886,58 @@ function registerEnvTools(server) {
2834
2886
  requireEnvId: true,
2835
2887
  mcpServer: server, // Pass server for IDE detection
2836
2888
  });
2837
- // Use commonService to call DescribeEnvs with filter parameters
2838
- // Filter parameters match the reference conditions provided by user
2839
- result = await cloudbaseList.commonService("tcb", "2018-06-08").call({
2840
- Action: "DescribeEnvs",
2841
- Param: {
2842
- EnvTypes: ["weda", "baas"], // Include weda and baas (normal) environments
2843
- IsVisible: false, // Filter out invisible environments
2844
- Channels: ["dcloud", "iotenable", "tem", "scene_module"], // Filter special channels
2845
- },
2846
- });
2847
- (0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
2848
- // Transform response format to match original listEnvs() format
2849
- if (result && result.EnvList) {
2850
- result = { EnvList: result.EnvList };
2851
- }
2852
- else if (result && result.Data && result.Data.EnvList) {
2853
- result = { EnvList: result.Data.EnvList };
2889
+ // 当环境变量设置了 CLOUDBASE_ENV_ID 时(如 API Key 模式),
2890
+ // 避免调用 DescribeEnvs(临时密钥可能不支持该接口),
2891
+ // 改为通过 DescribeEnvInfo 获取单环境信息
2892
+ const envIdFromEnv = process.env.CLOUDBASE_ENV_ID;
2893
+ if (envIdFromEnv) {
2894
+ try {
2895
+ const envInfo = await cloudbaseList.env.describeEnvInfo({ EnvId: envIdFromEnv });
2896
+ (0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, envInfo);
2897
+ // DescribeEnvInfo 返回结构: { EnvInfo: { EnvBaseInfo: { EnvId, Alias, ... }, BillingInfo, ... } }
2898
+ // 需要提取 EnvBaseInfo 作为扁平 env 对象以匹配 DescribeEnvs 返回格式
2899
+ const baseInfo = envInfo?.EnvInfo?.EnvBaseInfo;
2900
+ if (baseInfo) {
2901
+ result = { EnvList: [baseInfo] };
2902
+ }
2903
+ else if (envInfo?.EnvInfo) {
2904
+ // 兼容: 如果没有 EnvBaseInfo 但有 EnvInfo,尝试直接使用
2905
+ result = { EnvList: [{ EnvId: envIdFromEnv, ...envInfo.EnvInfo }] };
2906
+ }
2907
+ else {
2908
+ result = { EnvList: [{ EnvId: envIdFromEnv }] };
2909
+ }
2910
+ }
2911
+ catch (envInfoError) {
2912
+ (0, logger_js_1.debug)("DescribeEnvInfo 失败,返回基础环境信息:", envInfoError instanceof Error ? envInfoError : new Error(String(envInfoError)));
2913
+ result = { EnvList: [{ EnvId: envIdFromEnv }] };
2914
+ }
2854
2915
  }
2855
2916
  else {
2856
- // Fallback to original method if format is unexpected
2857
- (0, logger_js_1.debug)("Unexpected response format, falling back to listEnvs()");
2858
- result = await cloudbaseList.env.listEnvs();
2917
+ // Use commonService to call DescribeEnvs with filter parameters
2918
+ // Filter parameters match the reference conditions provided by user
2919
+ result = await cloudbaseList.commonService("tcb", "2018-06-08").call({
2920
+ Action: "DescribeEnvs",
2921
+ Param: {
2922
+ EnvTypes: ["weda", "baas"], // Include weda and baas (normal) environments
2923
+ IsVisible: false, // Filter out invisible environments
2924
+ Channels: ["dcloud", "iotenable", "tem", "scene_module"], // Filter special channels
2925
+ },
2926
+ });
2859
2927
  (0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
2928
+ // Transform response format to match original listEnvs() format
2929
+ if (result && result.EnvList) {
2930
+ result = { EnvList: result.EnvList };
2931
+ }
2932
+ else if (result && result.Data && result.Data.EnvList) {
2933
+ result = { EnvList: result.Data.EnvList };
2934
+ }
2935
+ else {
2936
+ // Fallback to original method if format is unexpected
2937
+ (0, logger_js_1.debug)("Unexpected response format, falling back to listEnvs()");
2938
+ result = await cloudbaseList.env.listEnvs();
2939
+ (0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
2940
+ }
2860
2941
  }
2861
2942
  }
2862
2943
  catch (error) {
@@ -24609,11 +24690,20 @@ function createManagerFromLoginState(loginState, region) {
24609
24690
  }
24610
24691
  async function listAvailableEnvCandidates(options) {
24611
24692
  const { cloudBaseOptions, loginState: providedLoginState } = options ?? {};
24693
+ // 优先使用显式传入的 envId
24612
24694
  if (cloudBaseOptions?.envId) {
24613
24695
  return [{
24614
24696
  envId: cloudBaseOptions.envId,
24615
24697
  }];
24616
24698
  }
24699
+ // 当环境变量设置了 CLOUDBASE_ENV_ID 且没有显式 credentials 时,直接返回(避免调 DescribeEnvs)
24700
+ // 有显式 credentials 时需要重新查询,因为可能是不同账号
24701
+ const hasExplicitCredentials = !!(cloudBaseOptions?.secretId && cloudBaseOptions?.secretKey);
24702
+ if (process.env.CLOUDBASE_ENV_ID && !hasExplicitCredentials) {
24703
+ return [{
24704
+ envId: process.env.CLOUDBASE_ENV_ID,
24705
+ }];
24706
+ }
24617
24707
  let cloudbase;
24618
24708
  if (cloudBaseOptions?.secretId && cloudBaseOptions?.secretKey) {
24619
24709
  cloudbase = createCloudBaseManagerWithOptions(cloudBaseOptions);
@@ -24940,6 +25030,7 @@ async function getCloudBaseManager(options = {}) {
24940
25030
  await throwPendingAuthError();
24941
25031
  }
24942
25032
  throwAuthRequiredError();
25033
+ return undefined; // unreachable, helps TypeScript narrow
24943
25034
  }
24944
25035
  const { envId: loginEnvId, secretId, secretKey, token } = loginState;
24945
25036
  let finalEnvId = cloudBaseOptions?.envId;
@@ -35189,6 +35280,25 @@ if (isES5) {
35189
35280
  }
35190
35281
 
35191
35282
 
35283
+ /***/ }),
35284
+
35285
+ /***/ 7598:
35286
+ /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
35287
+
35288
+ /*!
35289
+ * mime-db
35290
+ * Copyright(c) 2014 Jonathan Ong
35291
+ * Copyright(c) 2015-2022 Douglas Christopher Wilson
35292
+ * MIT Licensed
35293
+ */
35294
+
35295
+ /**
35296
+ * Module exports.
35297
+ */
35298
+
35299
+ module.exports = __webpack_require__(81813)
35300
+
35301
+
35192
35302
  /***/ }),
35193
35303
 
35194
35304
  /***/ 7600:
@@ -38507,10 +38617,11 @@ function normalizeAgentPayload(params) {
38507
38617
  if (!params) {
38508
38618
  return {};
38509
38619
  }
38510
- const { name, agentId, runtime, timeout, memorySize, installDependency, ...rest } = params;
38620
+ const { name, description, agentId, runtime, timeout, memorySize, installDependency, zipFile, cosBucketRegion, tempCosObjectName, sessionConfig, ...rest } = params;
38511
38621
  return {
38512
38622
  ...rest,
38513
38623
  ...(normalizeString(name) ? { Name: normalizeString(name) } : {}),
38624
+ ...(normalizeString(description) ? { Description: normalizeString(description) } : {}),
38514
38625
  ...(normalizeString(agentId) ? { AgentId: normalizeString(agentId) } : {}),
38515
38626
  ...(normalizeString(runtime) ? { Runtime: normalizeString(runtime) } : {}),
38516
38627
  ...(normalizeNumber(timeout) !== undefined ? { Timeout: normalizeNumber(timeout) } : {}),
@@ -38520,6 +38631,14 @@ function normalizeAgentPayload(params) {
38520
38631
  ...(normalizeBoolean(installDependency) !== undefined
38521
38632
  ? { InstallDependency: normalizeBoolean(installDependency) }
38522
38633
  : {}),
38634
+ ...(normalizeString(zipFile) ? { ZipFile: normalizeString(zipFile) } : {}),
38635
+ ...(normalizeString(cosBucketRegion)
38636
+ ? { CosBucketRegion: normalizeString(cosBucketRegion) }
38637
+ : {}),
38638
+ ...(normalizeString(tempCosObjectName)
38639
+ ? { TempCosObjectName: normalizeString(tempCosObjectName) }
38640
+ : {}),
38641
+ ...(sessionConfig && typeof sessionConfig === "object" ? { SessionConfig: sessionConfig } : {}),
38523
38642
  };
38524
38643
  }
38525
38644
  function registerAgentTools(server) {
@@ -38594,6 +38713,17 @@ function registerAgentTools(server) {
38594
38713
  inputSchema: {
38595
38714
  action: zod_1.z.enum(MANAGE_AGENT_ACTIONS),
38596
38715
  agentId: zod_1.z.string().optional(),
38716
+ name: zod_1.z.string().optional(),
38717
+ description: zod_1.z.string().optional(),
38718
+ runtime: zod_1.z.string().optional(),
38719
+ timeout: zod_1.z.number().optional(),
38720
+ memorySize: zod_1.z.number().optional(),
38721
+ installDependency: zod_1.z.boolean().optional(),
38722
+ zipFile: zod_1.z.string().optional(),
38723
+ cosBucketRegion: zod_1.z.string().optional(),
38724
+ tempCosObjectName: zod_1.z.string().optional(),
38725
+ sessionConfig: zod_1.z.record(zod_1.z.any()).optional(),
38726
+ cwd: zod_1.z.string().optional(),
38597
38727
  params: zod_1.z.record(zod_1.z.any()).optional(),
38598
38728
  },
38599
38729
  annotations: {
@@ -38603,14 +38733,31 @@ function registerAgentTools(server) {
38603
38733
  openWorldHint: true,
38604
38734
  category: "agents",
38605
38735
  },
38606
- }, async ({ action, agentId, params, }) => {
38736
+ }, async ({ action, agentId, name, description, runtime, timeout, memorySize, installDependency, zipFile, cosBucketRegion, tempCosObjectName, sessionConfig, cwd, params, }) => {
38607
38737
  try {
38608
38738
  const cloudbase = await getManager();
38609
- const payload = normalizeAgentPayload(params);
38739
+ const payload = normalizeAgentPayload({
38740
+ name,
38741
+ description,
38742
+ runtime,
38743
+ timeout,
38744
+ memorySize,
38745
+ installDependency,
38746
+ zipFile,
38747
+ cosBucketRegion,
38748
+ tempCosObjectName,
38749
+ sessionConfig,
38750
+ cwd,
38751
+ ...(params ?? {}),
38752
+ });
38610
38753
  if (action === "createAgent") {
38754
+ const normalizedName = normalizeString(payload.Name);
38755
+ if (!normalizedName) {
38756
+ throw new Error("action=createAgent 时必须提供 name(可通过顶层 name 或 params.name 传入)");
38757
+ }
38611
38758
  const createPayload = {
38612
38759
  ...payload,
38613
- Name: normalizeString(payload.Name) ?? "",
38760
+ Name: normalizedName,
38614
38761
  Runtime: normalizeString(payload.Runtime) ?? "Nodejs20.19",
38615
38762
  };
38616
38763
  const result = await cloudbase.agent.createAgent(createPayload);
@@ -39945,6 +40092,7 @@ const QUERY_ACTIONS = [
39945
40092
  "describeCreateResult",
39946
40093
  "describeTaskStatus",
39947
40094
  "getInstanceInfo",
40095
+ "describeInstance",
39948
40096
  ];
39949
40097
  const MANAGE_ACTIONS = [
39950
40098
  "provisionMySQL",
@@ -40208,7 +40356,9 @@ async function getSqlInstanceInfo({ getManager, cloudBaseOptions, server, }) {
40208
40356
  }
40209
40357
  catch (error) {
40210
40358
  const errorCode = extractErrorCode(error);
40211
- const isNotFound = errorCode === "FailedOperation.DataSourceNotExist";
40359
+ const errorMessage = error instanceof Error ? error.message : String(error);
40360
+ const isNotFound = errorCode === "FailedOperation.DataSourceNotExist"
40361
+ || /envLink not exist|not exist|not found/i.test(errorMessage);
40212
40362
  if (!isNotFound) {
40213
40363
  throw error;
40214
40364
  }
@@ -40218,7 +40368,7 @@ async function getSqlInstanceInfo({ getManager, cloudBaseOptions, server, }) {
40218
40368
  instanceId: "default",
40219
40369
  schema: envId,
40220
40370
  rawStatus: typeof createRawStatus === "string" ? createRawStatus : null,
40221
- status: createStatus,
40371
+ status: createStatus === "PENDING" || createStatus === "RUNNING" ? createStatus : "NOT_CREATED",
40222
40372
  createResult: createData ?? createResult,
40223
40373
  };
40224
40374
  }
@@ -40765,7 +40915,7 @@ function registerSQLDatabaseTools(server) {
40765
40915
  inputSchema: {
40766
40916
  action: zod_1.z
40767
40917
  .enum(QUERY_ACTIONS)
40768
- .describe("runQuery=execute read-only SQL; describeCreateResult=query CreateMySQL result; describeTaskStatus=query MySQL task status; getInstanceInfo=get current SQL instance context"),
40918
+ .describe("runQuery=execute read-only SQL; describeCreateResult=query CreateMySQL result; describeTaskStatus=query MySQL task status; getInstanceInfo=get current SQL instance context; describeInstance=alias of getInstanceInfo"),
40769
40919
  sql: zod_1.z
40770
40920
  .string()
40771
40921
  .optional()
@@ -40796,6 +40946,7 @@ function registerSQLDatabaseTools(server) {
40796
40946
  case "describeTaskStatus":
40797
40947
  return handleDescribeTaskStatus(args, context);
40798
40948
  case "getInstanceInfo":
40949
+ case "describeInstance":
40799
40950
  return handleGetInstanceInfo(context);
40800
40951
  default:
40801
40952
  throw new Error(`Unsupported SQL query action: ${args.action}`);
@@ -55124,6 +55275,88 @@ const FS = {
55124
55275
  exports["default"] = FS;
55125
55276
 
55126
55277
 
55278
+ /***/ }),
55279
+
55280
+ /***/ 12754:
55281
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
55282
+
55283
+ "use strict";
55284
+
55285
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
55286
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
55287
+ return new (P || (P = Promise))(function (resolve, reject) {
55288
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
55289
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
55290
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
55291
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
55292
+ });
55293
+ };
55294
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
55295
+ exports.exchangeApiKeyForCredential = void 0;
55296
+ const cloud_api_1 = __webpack_require__(2090);
55297
+ const async_1 = __webpack_require__(80854);
55298
+ const system_1 = __webpack_require__(62179);
55299
+ const error_1 = __webpack_require__(64119);
55300
+ /**
55301
+ * 用 CloudBase API Key 换取临时 STS 密钥
55302
+ *
55303
+ * 调用 qbase-service 的 /capi/credential 端点:
55304
+ * POST https://<envId>.<region>.tcb-api.tencentcloudapi.com/capi/credential
55305
+ * Authorization: Bearer <apiKey>
55306
+ * Body: { "env": "<envId>" }
55307
+ *
55308
+ * 返回: { code: 0, data: { TmpSecretId, TmpSecretKey, Token, ExpiredTime } }
55309
+ */
55310
+ function exchangeApiKeyForCredential(options) {
55311
+ return __awaiter(this, void 0, void 0, function* () {
55312
+ const { apiKey, envId, region = 'ap-shanghai', timeout = 15000, proxy, endpoint } = options;
55313
+ if (!apiKey) {
55314
+ throw new error_1.CloudBaseError('API Key 不能为空');
55315
+ }
55316
+ if (!envId) {
55317
+ throw new error_1.CloudBaseError('环境 ID (envId) 不能为空');
55318
+ }
55319
+ // 支持自定义 endpoint,也支持环境变量 CLOUDBASE_API_ENDPOINT 覆盖
55320
+ const baseUrl = endpoint
55321
+ || process.env.CLOUDBASE_API_ENDPOINT
55322
+ || `https://${envId}.${region}.tcb-api.tencentcloudapi.com`;
55323
+ const url = `${baseUrl}/capi/credential`;
55324
+ // 使用 AsyncMerge 防止并发请求
55325
+ const res = yield async_1.AsyncMerge.merge(() => (0, cloud_api_1.fetch)(url, {
55326
+ method: 'POST',
55327
+ timeout,
55328
+ body: JSON.stringify({ env: envId }),
55329
+ headers: {
55330
+ 'Content-Type': 'application/json',
55331
+ Authorization: `Bearer ${apiKey}`
55332
+ }
55333
+ }, proxy || (0, system_1.getProxy)()), `exchangeApiKey:${envId}`, {
55334
+ maxAge: 5000
55335
+ });
55336
+ if (res.code !== 0) {
55337
+ const message = res.message || res.msg || 'API Key 换取临时密钥失败';
55338
+ throw new error_1.CloudBaseError(message, {
55339
+ action: 'ExchangeApiKeyForCredential',
55340
+ code: res.code
55341
+ });
55342
+ }
55343
+ const { data } = res;
55344
+ if (!data || !data.TmpSecretId || !data.TmpSecretKey || !data.Token) {
55345
+ throw new error_1.CloudBaseError('API Key 换取临时密钥返回数据不完整,请检查 API Key 是否有效');
55346
+ }
55347
+ return {
55348
+ secretId: data.TmpSecretId,
55349
+ secretKey: data.TmpSecretKey,
55350
+ token: data.Token,
55351
+ // ExpiredTime 是秒级时间戳,转换为毫秒
55352
+ accessTokenExpired: data.ExpiredTime * 1000,
55353
+ envId
55354
+ };
55355
+ });
55356
+ }
55357
+ exports.exchangeApiKeyForCredential = exchangeApiKeyForCredential;
55358
+
55359
+
55127
55360
  /***/ }),
55128
55361
 
55129
55362
  /***/ 12788:
@@ -61601,6 +61834,39 @@ class DatabaseService {
61601
61834
  let { Tag } = this.getDatabaseConfig();
61602
61835
  return this.dbOpService.request('RunCommands', Object.assign({ MgoCommands: options.MgoCommands, Tag: options.Tag || Tag, EnvId: options.EnvId || this.envId }, (options.MongoConnector ? { MongoConnector: options.MongoConnector } : {})));
61603
61836
  }
61837
+ /**
61838
+ * 在 PostgreSQL 数据库上执行 SQL 语句
61839
+ *
61840
+ * @param options 执行参数
61841
+ * @param options.Sql 要执行的 SQL 语句
61842
+ * @param options.Role 指定 role 执行 SQL(可选)
61843
+ * @param options.EnvId 环境 ID(可选,不传则自动使用当前环境 ID)
61844
+ * @returns 执行结果,包含影响行数、字段列表、数据行及执行耗时
61845
+ *
61846
+ * @example
61847
+ * // 创建表
61848
+ * const res = await database.executePGSql({
61849
+ * Sql: 'CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT NOT NULL)'
61850
+ * })
61851
+ *
61852
+ * @example
61853
+ * // 查询数据
61854
+ * const res = await database.executePGSql({
61855
+ * Sql: "SELECT * FROM users WHERE id = 1"
61856
+ * })
61857
+ * console.log(res.Columns) // ['id', 'name']
61858
+ * console.log(res.Rows) // ['["1","Alice"]']
61859
+ */
61860
+ async executePGSql(options) {
61861
+ const params = {
61862
+ EnvId: options.EnvId || this.envId,
61863
+ Sql: options.Sql
61864
+ };
61865
+ if (options.Role) {
61866
+ params.Role = options.Role;
61867
+ }
61868
+ return this.dbOpService.request('ExecutePGSql', params);
61869
+ }
61604
61870
  }
61605
61871
  exports.DatabaseService = DatabaseService;
61606
61872
  DatabaseService.tcbServiceVersion = {
@@ -61641,6 +61907,9 @@ __decorate([
61641
61907
  __decorate([
61642
61908
  preLazy()
61643
61909
  ], DatabaseService.prototype, "runCommands", null);
61910
+ __decorate([
61911
+ preLazy()
61912
+ ], DatabaseService.prototype, "executePGSql", null);
61644
61913
 
61645
61914
 
61646
61915
  /***/ }),
@@ -81888,11 +82157,14 @@ const web_auth_1 = __webpack_require__(76097);
81888
82157
  const oauth_1 = __webpack_require__(92423);
81889
82158
  const common_1 = __webpack_require__(96711);
81890
82159
  const credential_1 = __webpack_require__(99795);
82160
+ const api_key_1 = __webpack_require__(12754);
82161
+ const project_store_1 = __webpack_require__(65260);
81891
82162
  const error_1 = __webpack_require__(64119);
81892
82163
  __exportStar(__webpack_require__(96711), exports);
81893
82164
  __exportStar(__webpack_require__(99795), exports);
81894
82165
  __exportStar(__webpack_require__(76097), exports);
81895
82166
  __exportStar(__webpack_require__(92423), exports);
82167
+ __exportStar(__webpack_require__(12754), exports);
81896
82168
  class AuthSupervisor {
81897
82169
  /**
81898
82170
  * 单例模式,全局缓存
@@ -82042,7 +82314,75 @@ class AuthSupervisor {
82042
82314
  return credential;
82043
82315
  });
82044
82316
  }
82045
- logout() {
82317
+ /**
82318
+ * 通过 CloudBase API Key 登录
82319
+ *
82320
+ * API Key 是环境级别的长期凭证,通过 /capi/credential 端点换取临时 STS 密钥。
82321
+ * 临时密钥过期后,自动用 API Key 重新换取(无需 refreshToken 机制)。
82322
+ *
82323
+ * @param apiKey CloudBase 环境的 API Key
82324
+ * @param envId CloudBase 环境 ID
82325
+ * @param opts 选项配置
82326
+ */
82327
+ loginByApiKey(apiKey, envId, opts) {
82328
+ return __awaiter(this, void 0, void 0, function* () {
82329
+ const { forceUpdate = false, region, cwd } = opts || {};
82330
+ // 1. 检查内存缓存(envId 匹配 + 未过期)
82331
+ if (this.cacheCredential &&
82332
+ this.needCache &&
82333
+ !this.isCacheExpire() &&
82334
+ !forceUpdate &&
82335
+ this.cacheCredential.envId === envId) {
82336
+ return this.cacheCredential;
82337
+ }
82338
+ // 2. 如果不强制更新,尝试从本地存储读取
82339
+ if (!forceUpdate) {
82340
+ const stored = yield (0, credential_1.checkAndGetCredential)(Object.assign(Object.assign({}, this.requestConfig), { cwd }));
82341
+ if (stored && stored.envId === envId) {
82342
+ if (this.needCache) {
82343
+ this.cacheCredential = stored;
82344
+ this.cacheExpiredTime = stored.accessTokenExpired
82345
+ ? Number(stored.accessTokenExpired)
82346
+ : Date.now() + 3600 * 1000;
82347
+ }
82348
+ return stored;
82349
+ }
82350
+ }
82351
+ // 3. 用 API Key 换取临时密钥
82352
+ if (!apiKey) {
82353
+ throw new error_1.CloudBaseError('API Key 不能为空');
82354
+ }
82355
+ if (!envId) {
82356
+ throw new error_1.CloudBaseError('环境 ID (envId) 不能为空');
82357
+ }
82358
+ const exchangeResult = yield (0, api_key_1.exchangeApiKeyForCredential)(Object.assign({ apiKey,
82359
+ envId,
82360
+ region }, this.requestConfig));
82361
+ const credential = Object.assign(Object.assign({}, exchangeResult), { authSource: 'api_key', apiKey });
82362
+ // 4. 跳过 checkAuth(CheckTcbService)校验
82363
+ // API Key 换取的临时密钥由后端 /capi/credential 端点已完成验证,
82364
+ // 且其 policy 可能不包含 CheckTcbService 权限,无需再次校验
82365
+ // 5. 存储凭证
82366
+ if (cwd) {
82367
+ // 项目级存储
82368
+ const store = (0, project_store_1.getProjectStore)(cwd, { _: 'CloudBase API Key 凭据,请勿分享', credential: {} }, 'auth');
82369
+ yield store.set('credential', credential);
82370
+ }
82371
+ else {
82372
+ // 全局存储
82373
+ yield credential_1.authStore.set('credential', credential);
82374
+ }
82375
+ // 6. 更新内存缓存
82376
+ if (this.needCache) {
82377
+ this.cacheCredential = credential;
82378
+ this.cacheExpiredTime = credential.accessTokenExpired
82379
+ ? Number(credential.accessTokenExpired)
82380
+ : Date.now() + 3600 * 1000;
82381
+ }
82382
+ return credential;
82383
+ });
82384
+ }
82385
+ logout(opts) {
82046
82386
  return __awaiter(this, void 0, void 0, function* () {
82047
82387
  if (this.cacheCredential) {
82048
82388
  this.cacheCredential = null;
@@ -82058,6 +82398,17 @@ class AuthSupervisor {
82058
82398
  catch (e) {
82059
82399
  yield credential_1.authStore.delete('credential');
82060
82400
  }
82401
+ // 清理项目级凭证
82402
+ const cwd = opts === null || opts === void 0 ? void 0 : opts.cwd;
82403
+ if (cwd) {
82404
+ try {
82405
+ const projectAuthStore = (0, project_store_1.getProjectStore)(cwd, { _: '', credential: {} }, 'auth');
82406
+ yield projectAuthStore.delete('credential');
82407
+ }
82408
+ catch (_a) {
82409
+ // 项目级存储不存在时忽略
82410
+ }
82411
+ }
82061
82412
  });
82062
82413
  }
82063
82414
  isCacheExpire() {
@@ -88360,6 +88711,7 @@ __exportStar(__webpack_require__(73766), exports);
88360
88711
  __exportStar(__webpack_require__(51995), exports);
88361
88712
  __exportStar(__webpack_require__(80854), exports);
88362
88713
  __exportStar(__webpack_require__(40833), exports);
88714
+ __exportStar(__webpack_require__(65260), exports);
88363
88715
  __exportStar(__webpack_require__(84587), exports);
88364
88716
  __exportStar(__webpack_require__(31153), exports);
88365
88717
  __exportStar(__webpack_require__(33283), exports);
@@ -100251,6 +100603,70 @@ exports.stringifyString = stringifyString;
100251
100603
  exports.toJSON = toJSON;
100252
100604
 
100253
100605
 
100606
+ /***/ }),
100607
+
100608
+ /***/ 30983:
100609
+ /***/ ((module) => {
100610
+
100611
+ // 'mime-score' back-ported to CommonJS
100612
+
100613
+ // Score RFC facets (see https://tools.ietf.org/html/rfc6838#section-3)
100614
+ var FACET_SCORES = {
100615
+ 'prs.': 100,
100616
+ 'x-': 200,
100617
+ 'x.': 300,
100618
+ 'vnd.': 400,
100619
+ default: 900
100620
+ }
100621
+
100622
+ // Score mime source (Logic originally from `jshttp/mime-types` module)
100623
+ var SOURCE_SCORES = {
100624
+ nginx: 10,
100625
+ apache: 20,
100626
+ iana: 40,
100627
+ default: 30 // definitions added by `jshttp/mime-db` project?
100628
+ }
100629
+
100630
+ var TYPE_SCORES = {
100631
+ // prefer application/xml over text/xml
100632
+ // prefer application/rtf over text/rtf
100633
+ application: 1,
100634
+
100635
+ // prefer font/woff over application/font-woff
100636
+ font: 2,
100637
+
100638
+ // prefer video/mp4 over audio/mp4 over application/mp4
100639
+ // See https://www.rfc-editor.org/rfc/rfc4337.html#section-2
100640
+ audio: 2,
100641
+ video: 3,
100642
+
100643
+ default: 0
100644
+ }
100645
+
100646
+ /**
100647
+ * Get each component of the score for a mime type. The sum of these is the
100648
+ * total score. The higher the score, the more "official" the type.
100649
+ */
100650
+ module.exports = function mimeScore (mimeType, source = 'default') {
100651
+ if (mimeType === 'application/octet-stream') {
100652
+ return 0
100653
+ }
100654
+
100655
+ const [type, subtype] = mimeType.split('/')
100656
+
100657
+ const facet = subtype.replace(/(\.|x-).*/, '$1')
100658
+
100659
+ const facetScore = FACET_SCORES[facet] || FACET_SCORES.default
100660
+ const sourceScore = SOURCE_SCORES[source] || SOURCE_SCORES.default
100661
+ const typeScore = TYPE_SCORES[type] || TYPE_SCORES.default
100662
+
100663
+ // All else being equal prefer shorter types
100664
+ const lengthScore = 1 - mimeType.length / 100
100665
+
100666
+ return facetScore + sourceScore + typeScore + lengthScore
100667
+ }
100668
+
100669
+
100254
100670
  /***/ }),
100255
100671
 
100256
100672
  /***/ 30989:
@@ -124901,28 +125317,31 @@ const configDir = homeDir && homeAccessible ? path_1.default.join(homeDir, '.con
124901
125317
  exports.cloudbaseConfigDir = path_1.default.join(configDir, '.cloudbase');
124902
125318
  // 确保目录存在
124903
125319
  make_dir_1.default.sync(exports.cloudbaseConfigDir);
124904
- function getAsyncDB(file) {
124905
- const dbPath = path_1.default.join(exports.cloudbaseConfigDir, `${file}.json`);
125320
+ function getAsyncDB(file, directory) {
125321
+ const baseDir = directory || exports.cloudbaseConfigDir;
125322
+ const dbPath = path_1.default.join(baseDir, `${file}.json`);
124906
125323
  const adapter = new FileAsync_1.default(dbPath);
124907
125324
  const db = (0, lowdb_1.default)(adapter);
124908
125325
  return db;
124909
125326
  }
124910
125327
  exports.getAsyncDB = getAsyncDB;
124911
- function getSyncDB(file) {
124912
- const dbPath = path_1.default.join(exports.cloudbaseConfigDir, `${file}.json`);
125328
+ function getSyncDB(file, directory) {
125329
+ const baseDir = directory || exports.cloudbaseConfigDir;
125330
+ const dbPath = path_1.default.join(baseDir, `${file}.json`);
124913
125331
  const adapter = new FileSync_1.default(dbPath);
124914
125332
  const db = (0, lowdb_1.default)(adapter);
124915
125333
  return db;
124916
125334
  }
124917
125335
  exports.getSyncDB = getSyncDB;
124918
125336
  class LocalStore {
124919
- constructor(defaults, dbKey = 'common') {
125337
+ constructor(defaults, dbKey = 'common', options) {
124920
125338
  this.defaults = defaults;
124921
125339
  this.dbKey = dbKey;
125340
+ this.directory = options === null || options === void 0 ? void 0 : options.directory;
124922
125341
  }
124923
125342
  getDB() {
124924
125343
  return __awaiter(this, void 0, void 0, function* () {
124925
- const db = this.db || (yield getAsyncDB(this.dbKey));
125344
+ const db = this.db || (yield getAsyncDB(this.dbKey, this.directory));
124926
125345
  this.db = db;
124927
125346
  return db;
124928
125347
  });
@@ -134489,7 +134908,7 @@ class TelemetryReporter {
134489
134908
  const nodeVersion = process.version; // Node.js版本
134490
134909
  const arch = os_1.default.arch(); // 系统架构
134491
134910
  // 从构建时注入的版本号获取MCP版本信息
134492
- const mcpVersion = process.env.npm_package_version || "2.19.5" || 0;
134911
+ const mcpVersion = process.env.npm_package_version || "2.20.0-beta.0" || 0;
134493
134912
  return {
134494
134913
  userAgent: `${osType} ${osRelease} ${arch} ${nodeVersion} CloudBase-MCP/${mcpVersion}`,
134495
134914
  deviceId: this.deviceId,
@@ -184195,6 +184614,144 @@ module.exports = () => {
184195
184614
  };
184196
184615
 
184197
184616
 
184617
+ /***/ }),
184618
+
184619
+ /***/ 65260:
184620
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
184621
+
184622
+ "use strict";
184623
+
184624
+ var __importDefault = (this && this.__importDefault) || function (mod) {
184625
+ return (mod && mod.__esModule) ? mod : { "default": mod };
184626
+ };
184627
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
184628
+ exports.getProjectStore = exports.getProjectDir = exports.findProjectRoot = exports.canonicalizePath = exports.sanitizePath = exports.projectsDir = exports.PROJECT_ROOT_MARKERS = void 0;
184629
+ const os_1 = __importDefault(__webpack_require__(21820));
184630
+ const fs_1 = __importDefault(__webpack_require__(29021));
184631
+ const path_1 = __importDefault(__webpack_require__(39902));
184632
+ const crypto_1 = __importDefault(__webpack_require__(55511));
184633
+ const make_dir_1 = __importDefault(__webpack_require__(55589));
184634
+ const localstore_1 = __webpack_require__(40833);
184635
+ /**
184636
+ * 项目根目录标志文件列表(按优先级排序)
184637
+ */
184638
+ exports.PROJECT_ROOT_MARKERS = [
184639
+ 'cloudbaserc.json',
184640
+ 'cloudbaserc.js',
184641
+ '.cloudbaserc',
184642
+ '.git'
184643
+ ];
184644
+ /**
184645
+ * projects/ 存储根目录
184646
+ */
184647
+ exports.projectsDir = path_1.default.join(localstore_1.cloudbaseConfigDir, 'projects');
184648
+ /**
184649
+ * 将绝对路径转换为安全的目录名
184650
+ *
184651
+ * 参考 Claude Code sessionStoragePortable.ts 的设计:
184652
+ * - 非字母数字字符替换为连字符 `-`
184653
+ * - 超过 200 字符时截断并附加 sha256 哈希前 16 位确保唯一性
184654
+ *
184655
+ * @example
184656
+ * sanitizePath('/Users/bookerzhao/Projects/myapp')
184657
+ * // → '-Users-bookerzhao-Projects-myapp'
184658
+ */
184659
+ function sanitizePath(absolutePath) {
184660
+ let sanitized = absolutePath.replace(/[^a-zA-Z0-9]/g, '-');
184661
+ if (sanitized.length > 200) {
184662
+ const hash = crypto_1.default.createHash('sha256').update(absolutePath).digest('hex').slice(0, 16);
184663
+ sanitized = sanitized.slice(0, 200) + '-' + hash;
184664
+ }
184665
+ return sanitized;
184666
+ }
184667
+ exports.sanitizePath = sanitizePath;
184668
+ /**
184669
+ * 解析符号链接,获取规范化的绝对路径
184670
+ * 如果路径不存在则返回 path.resolve() 的结果
184671
+ */
184672
+ function canonicalizePath(p) {
184673
+ try {
184674
+ return fs_1.default.realpathSync(p);
184675
+ }
184676
+ catch (_a) {
184677
+ return path_1.default.resolve(p);
184678
+ }
184679
+ }
184680
+ exports.canonicalizePath = canonicalizePath;
184681
+ /**
184682
+ * 从 cwd 向上查找项目根目录
184683
+ *
184684
+ * 查找逻辑:
184685
+ * 1. 从 cwd 开始,逐级向上查找 PROJECT_ROOT_MARKERS
184686
+ * 2. 不越过 Home 目录(防止父目录配置污染)
184687
+ * 3. 都找不到时兜底使用 cwd 本身
184688
+ */
184689
+ function findProjectRoot(cwd) {
184690
+ const resolvedCwd = canonicalizePath(cwd);
184691
+ const homeDir = os_1.default.homedir();
184692
+ let dir = resolvedCwd;
184693
+ while (true) {
184694
+ for (const marker of exports.PROJECT_ROOT_MARKERS) {
184695
+ const markerPath = path_1.default.join(dir, marker);
184696
+ try {
184697
+ fs_1.default.accessSync(markerPath, fs_1.default.constants.F_OK);
184698
+ return dir;
184699
+ }
184700
+ catch (_a) {
184701
+ // marker 不存在,继续
184702
+ }
184703
+ }
184704
+ // 不越过 Home 目录
184705
+ if (dir === homeDir) {
184706
+ break;
184707
+ }
184708
+ const parentDir = path_1.default.dirname(dir);
184709
+ // 已到文件系统根
184710
+ if (parentDir === dir) {
184711
+ break;
184712
+ }
184713
+ dir = parentDir;
184714
+ }
184715
+ // 兜底:使用 cwd 本身
184716
+ return resolvedCwd;
184717
+ }
184718
+ exports.findProjectRoot = findProjectRoot;
184719
+ /**
184720
+ * 获取项目的存储目录路径
184721
+ *
184722
+ * @returns 绝对路径,如 `~/.config/.cloudbase/projects/-Users-bookerzhao-Projects-myapp/`
184723
+ */
184724
+ function getProjectDir(cwd) {
184725
+ const projectRoot = findProjectRoot(cwd);
184726
+ const dirName = sanitizePath(projectRoot);
184727
+ return path_1.default.join(exports.projectsDir, dirName);
184728
+ }
184729
+ exports.getProjectDir = getProjectDir;
184730
+ /**
184731
+ * 获取项目级 LocalStore 实例(通用工厂函数)
184732
+ *
184733
+ * 存储位置: `~/.config/.cloudbase/projects/<sanitized-root>/<dbKey>.json`
184734
+ *
184735
+ * @param cwd - 项目工作目录(会自动向上查找项目根)
184736
+ * @param defaults - LocalStore 默认值
184737
+ * @param dbKey - 存储文件名(不含 .json 后缀),如 'auth'、'env'
184738
+ *
184739
+ * @example
184740
+ * // 获取项目级 auth 存储
184741
+ * const authStore = getProjectStore(process.cwd(), { credential: {} }, 'auth');
184742
+ *
184743
+ * // 获取项目级 env 配置存储
184744
+ * const envStore = getProjectStore(process.cwd(), { envId: '' }, 'env');
184745
+ */
184746
+ function getProjectStore(cwd, defaults, dbKey) {
184747
+ const directory = getProjectDir(cwd);
184748
+ // 确保目录存在
184749
+ make_dir_1.default.sync(directory);
184750
+ return new localstore_1.LocalStore(defaults, dbKey, { directory });
184751
+ }
184752
+ exports.getProjectStore = getProjectStore;
184753
+
184754
+
184198
184755
  /***/ }),
184199
184756
 
184200
184757
  /***/ 65291:
@@ -192956,7 +193513,7 @@ ${envIdSection}
192956
193513
  ## 环境信息
192957
193514
  - 操作系统: ${os_1.default.type()} ${os_1.default.release()}
192958
193515
  - Node.js版本: ${process.version}
192959
- - MCP 版本:${process.env.npm_package_version || "2.19.5" || 0}
193516
+ - MCP 版本:${process.env.npm_package_version || "2.20.0-beta.0" || 0}
192960
193517
  - 系统架构: ${os_1.default.arch()}
192961
193518
  - 时间: ${new Date().toISOString()}
192962
193519
  - 请求ID: ${requestId}
@@ -193004,7 +193561,7 @@ function createWrappedHandler(name, handler, server) {
193004
193561
  success = true;
193005
193562
  requestId = extractRequestIdFromToolResult(result);
193006
193563
  const duration = Date.now() - startTime;
193007
- (0, logger_js_1.debug)(`工具执行成功: ${name}`, { duration });
193564
+ (0, logger_js_1.debug)(`工具执行成功: ${name}`, { duration, requestId: requestId || undefined });
193008
193565
  if (!isTestEnvironment) {
193009
193566
  server.logger?.({ type: 'afterToolCall', toolName: name, args: sanitizeArgs(args), result: result, duration });
193010
193567
  }
@@ -193016,6 +193573,7 @@ function createWrappedHandler(name, handler, server) {
193016
193573
  requestId = (typeof error === 'object' && error && 'requestId' in error) ? error.requestId : '';
193017
193574
  (0, logger_js_1.debug)(`工具执行失败: ${name}`, {
193018
193575
  error: errorMessage,
193576
+ requestId: requestId || undefined,
193019
193577
  duration: Date.now() - startTime
193020
193578
  });
193021
193579
  const isTestEnvironment = false || process.env.VITEST === "true";
@@ -193036,8 +193594,9 @@ function createWrappedHandler(name, handler, server) {
193036
193594
  requestId: (typeof error === 'object' && error && 'requestId' in error) ? error.requestId : '',
193037
193595
  ide: server.ide || process.env.INTEGRATION_IDE || ''
193038
193596
  });
193039
- const mcpVersion = true ? "2.19.5" : 0;
193040
- const enhancedErrorMessage = `${errorMessage}\n\n📦 CloudBase MCP v${mcpVersion}\n🔗 遇到问题?请复制以下链接到浏览器打开\n即可自动携带错误详情快速创建 GitHub Issue:\n${issueLink}`;
193597
+ const mcpVersion = true ? "2.20.0-beta.0" : 0;
193598
+ const requestIdSuffix = requestId ? `\n🆔 RequestId: ${requestId}` : '';
193599
+ const enhancedErrorMessage = `${errorMessage}${requestIdSuffix}\n\n📦 CloudBase MCP v${mcpVersion}\n🔗 遇到问题?请复制以下链接到浏览器打开\n即可自动携带错误详情快速创建 GitHub Issue:\n${issueLink}`;
193041
193600
  // 创建新的错误对象,保持原有的错误类型但更新消息
193042
193601
  const enhancedError = error instanceof Error
193043
193602
  ? new Error(enhancedErrorMessage)
@@ -195080,6 +195639,7 @@ const path_1 = __importDefault(__webpack_require__(39902));
195080
195639
  const make_dir_1 = __importDefault(__webpack_require__(55589));
195081
195640
  const walkdir_1 = __importDefault(__webpack_require__(25567));
195082
195641
  const micromatch_1 = __importDefault(__webpack_require__(90628));
195642
+ const mime_types_1 = __importDefault(__webpack_require__(86049));
195083
195643
  const cos_nodejs_sdk_v5_1 = __importDefault(__webpack_require__(93625));
195084
195644
  const utils_1 = __webpack_require__(62358);
195085
195645
  const error_1 = __webpack_require__(40430);
@@ -196322,6 +196882,1251 @@ class StorageService {
196322
196882
  // 限制总数量
196323
196883
  return results.slice(0, limit);
196324
196884
  }
196885
+ /**
196886
+ * 通过 CloudBase HTTP API 上传对象(Binary 直传)
196887
+ * POST/PUT /v1/storages/object/:bucketId/*objectName
196888
+ */
196889
+ /* eslint-disable complexity */
196890
+ async uploadObject(options) {
196891
+ const { bucketId, objectName, localPath, body, contentType, contentLength, cacheControl, metadata, xRobotsTag, upsert = false, usePut = false, accessToken, envId: envIdOverride } = options;
196892
+ if (!bucketId || typeof bucketId !== 'string') {
196893
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
196894
+ }
196895
+ if (!objectName || typeof objectName !== 'string') {
196896
+ throw new error_1.CloudBaseError('objectName 必须是非空字符串');
196897
+ }
196898
+ if (!accessToken || typeof accessToken !== 'string') {
196899
+ throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
196900
+ }
196901
+ if (!localPath && !body) {
196902
+ throw new error_1.CloudBaseError('localPath 与 body 至少提供一个');
196903
+ }
196904
+ if (localPath && body) {
196905
+ throw new error_1.CloudBaseError('localPath 与 body 只能二选一');
196906
+ }
196907
+ // env / proxy
196908
+ const authConfig = this.environment.getAuthConfig();
196909
+ const { proxy } = authConfig;
196910
+ const { env } = this.getStorageConfig();
196911
+ const envId = envIdOverride || env;
196912
+ // 路径编码:保留 "/" 层级,仅编码每段
196913
+ const encodedBucketId = encodeURIComponent(bucketId);
196914
+ const encodedObjectName = objectName
196915
+ .split('/')
196916
+ .map(seg => encodeURIComponent(seg))
196917
+ .join('/');
196918
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/${encodedBucketId}/${encodedObjectName}`;
196919
+ const method = usePut ? 'PUT' : 'POST';
196920
+ // 推断文件大小
196921
+ let fileSize = contentLength;
196922
+ if (localPath) {
196923
+ const resolvedPath = path_1.default.resolve(localPath);
196924
+ (0, utils_1.checkFullAccess)(resolvedPath, true);
196925
+ const stat = fs_1.default.statSync(resolvedPath);
196926
+ if (!stat.isFile()) {
196927
+ throw new error_1.CloudBaseError(`localPath 不是文件: ${localPath}`);
196928
+ }
196929
+ fileSize = stat.size;
196930
+ }
196931
+ else if (Buffer.isBuffer(body) && fileSize === undefined) {
196932
+ fileSize = body.length;
196933
+ }
196934
+ // 文档约束:> 100MB 拒绝
196935
+ const LIMIT_100MB = 100 * 1024 * 1024;
196936
+ if (fileSize !== undefined && fileSize > LIMIT_100MB) {
196937
+ throw new error_1.CloudBaseError('FileSizeLimitExceeded: 文件大小超过 100MB', {
196938
+ code: 'FileSizeLimitExceeded'
196939
+ });
196940
+ }
196941
+ const finalContentType = this.resolveUploadContentType({
196942
+ contentType,
196943
+ localPath,
196944
+ objectName,
196945
+ body
196946
+ });
196947
+ const headers = {
196948
+ Authorization: `Bearer ${accessToken}`
196949
+ };
196950
+ if (finalContentType) {
196951
+ headers['Content-Type'] = finalContentType;
196952
+ }
196953
+ if (fileSize !== undefined) {
196954
+ headers['Content-Length'] = String(fileSize);
196955
+ }
196956
+ if (cacheControl !== undefined && cacheControl !== null) {
196957
+ headers['Cache-Control'] =
196958
+ typeof cacheControl === 'number' ? `max-age=${cacheControl}` : String(cacheControl);
196959
+ }
196960
+ if (metadata) {
196961
+ // X-Metadata 放在 Header 里,具体大小限制由服务端/网关决定
196962
+ headers['X-Metadata'] = Buffer.from(JSON.stringify(metadata), 'utf8').toString('base64');
196963
+ }
196964
+ if (upsert) {
196965
+ headers['x-upsert'] = 'true';
196966
+ }
196967
+ if (xRobotsTag) {
196968
+ headers['X-Robots-Tag'] = xRobotsTag;
196969
+ }
196970
+ // 组装 Body:文件二进制本身
196971
+ const reqBody = localPath ? fs_1.default.createReadStream(path_1.default.resolve(localPath)) : body;
196972
+ const res = await (0, utils_1.fetchStream)(url, {
196973
+ method,
196974
+ headers,
196975
+ body: reqBody
196976
+ }, proxy);
196977
+ const text = await res.text();
196978
+ let payload = null;
196979
+ if (text) {
196980
+ try {
196981
+ payload = JSON.parse(text);
196982
+ }
196983
+ catch (_a) {
196984
+ if (!res.ok) {
196985
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
196986
+ }
196987
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
196988
+ }
196989
+ }
196990
+ if (!res.ok) {
196991
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
196992
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '上传失败';
196993
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
196994
+ code,
196995
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
196996
+ });
196997
+ }
196998
+ if (!payload || !payload.Id || !payload.Key) {
196999
+ throw new error_1.CloudBaseError('上传成功但响应格式异常:缺少 Id 或 Key');
197000
+ }
197001
+ return {
197002
+ Id: payload.Id,
197003
+ Key: payload.Key
197004
+ };
197005
+ }
197006
+ /**
197007
+ * 通过 CloudBase HTTP API 删除单个对象
197008
+ * DELETE /v1/storages/object/:bucketId/*objectName
197009
+ */
197010
+ async deleteObject(options) {
197011
+ const { bucketId, objectName, accessToken, envId: envIdOverride } = options;
197012
+ if (!bucketId || typeof bucketId !== 'string') {
197013
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197014
+ }
197015
+ if (!objectName || typeof objectName !== 'string') {
197016
+ throw new error_1.CloudBaseError('objectName 必须是非空字符串');
197017
+ }
197018
+ if (!accessToken || typeof accessToken !== 'string') {
197019
+ throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
197020
+ }
197021
+ const { env } = this.getStorageConfig();
197022
+ const envId = envIdOverride || env;
197023
+ const encodedBucketId = encodeURIComponent(bucketId);
197024
+ const encodedObjectName = objectName
197025
+ .split('/')
197026
+ .map(seg => encodeURIComponent(seg))
197027
+ .join('/');
197028
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/${encodedBucketId}/${encodedObjectName}`;
197029
+ const { proxy } = this.environment.getAuthConfig();
197030
+ const res = await (0, utils_1.fetchStream)(url, {
197031
+ method: 'DELETE',
197032
+ headers: {
197033
+ Authorization: `Bearer ${accessToken}`
197034
+ }
197035
+ }, proxy);
197036
+ const text = await res.text();
197037
+ let payload = null;
197038
+ if (text) {
197039
+ try {
197040
+ payload = JSON.parse(text);
197041
+ }
197042
+ catch (_a) {
197043
+ if (!res.ok) {
197044
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197045
+ }
197046
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
197047
+ }
197048
+ }
197049
+ if (!res.ok) {
197050
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197051
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '删除失败';
197052
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197053
+ code,
197054
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197055
+ });
197056
+ }
197057
+ // 网关成功时返回 { message: 'Successfully deleted' }
197058
+ return {
197059
+ message: (payload === null || payload === void 0 ? void 0 : payload.message) || 'Successfully deleted'
197060
+ };
197061
+ }
197062
+ /**
197063
+ * 通过 CloudBase HTTP API 批量删除对象(单次最多 20 个)
197064
+ * DELETE /v1/storages/object/:bucketId
197065
+ */
197066
+ async deleteObjects(options) {
197067
+ const { bucketId, prefixes, accessToken, envId: envIdOverride } = options;
197068
+ if (!bucketId || typeof bucketId !== 'string') {
197069
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197070
+ }
197071
+ if (!accessToken || typeof accessToken !== 'string') {
197072
+ throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
197073
+ }
197074
+ if (!Array.isArray(prefixes) || prefixes.length === 0) {
197075
+ throw new error_1.CloudBaseError('prefixes 必须是非空数组');
197076
+ }
197077
+ if (prefixes.length > 20) {
197078
+ throw new error_1.CloudBaseError('prefixes 最多 20 个');
197079
+ }
197080
+ for (const name of prefixes) {
197081
+ if (!name || typeof name !== 'string') {
197082
+ throw new error_1.CloudBaseError('prefixes 中的每一项必须是非空字符串');
197083
+ }
197084
+ }
197085
+ const { env } = this.getStorageConfig();
197086
+ const envId = envIdOverride || env;
197087
+ const encodedBucketId = encodeURIComponent(bucketId);
197088
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/${encodedBucketId}`;
197089
+ const { proxy } = this.environment.getAuthConfig();
197090
+ const res = await (0, utils_1.fetchStream)(url, {
197091
+ method: 'DELETE',
197092
+ headers: {
197093
+ Authorization: `Bearer ${accessToken}`,
197094
+ 'Content-Type': 'application/json'
197095
+ },
197096
+ body: JSON.stringify({ prefixes })
197097
+ }, proxy);
197098
+ const text = await res.text();
197099
+ let payload = null;
197100
+ if (text) {
197101
+ try {
197102
+ payload = JSON.parse(text);
197103
+ }
197104
+ catch (_a) {
197105
+ if (!res.ok) {
197106
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197107
+ }
197108
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
197109
+ }
197110
+ }
197111
+ if (!res.ok) {
197112
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197113
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '批量删除失败';
197114
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197115
+ code,
197116
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197117
+ });
197118
+ }
197119
+ if (!Array.isArray(payload)) {
197120
+ throw new error_1.CloudBaseError('批量删除响应格式异常:期望数组');
197121
+ }
197122
+ return payload;
197123
+ }
197124
+ /**
197125
+ * 通过 CloudBase HTTP API 复制对象
197126
+ * POST /v1/storages/object/copy
197127
+ */
197128
+ /* eslint-disable complexity */
197129
+ async copyObject(options) {
197130
+ const { bucketId, sourceKey, destinationKey, destinationBucket, metadata, userMetadata, copyMetadata, upsert, accessToken, envId: envIdOverride } = options;
197131
+ if (!bucketId || typeof bucketId !== 'string') {
197132
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197133
+ }
197134
+ if (!sourceKey || typeof sourceKey !== 'string') {
197135
+ throw new error_1.CloudBaseError('sourceKey 必须是非空字符串');
197136
+ }
197137
+ if (!destinationKey || typeof destinationKey !== 'string') {
197138
+ throw new error_1.CloudBaseError('destinationKey 必须是非空字符串');
197139
+ }
197140
+ if (destinationBucket !== undefined &&
197141
+ (typeof destinationBucket !== 'string' || !destinationBucket)) {
197142
+ throw new error_1.CloudBaseError('destinationBucket 必须是非空字符串');
197143
+ }
197144
+ if (metadata !== undefined && (typeof metadata !== 'object' || metadata === null || Array.isArray(metadata))) {
197145
+ throw new error_1.CloudBaseError('metadata 必须是对象');
197146
+ }
197147
+ if (userMetadata !== undefined && (typeof userMetadata !== 'object' || userMetadata === null || Array.isArray(userMetadata))) {
197148
+ throw new error_1.CloudBaseError('userMetadata 必须是对象');
197149
+ }
197150
+ if (copyMetadata !== undefined && typeof copyMetadata !== 'boolean') {
197151
+ throw new error_1.CloudBaseError('copyMetadata 必须是布尔值');
197152
+ }
197153
+ if (!accessToken || typeof accessToken !== 'string') {
197154
+ throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
197155
+ }
197156
+ const { env } = this.getStorageConfig();
197157
+ const envId = envIdOverride || env;
197158
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/copy`;
197159
+ const headers = {
197160
+ Authorization: `Bearer ${accessToken}`,
197161
+ 'Content-Type': 'application/json'
197162
+ };
197163
+ if (upsert) {
197164
+ headers['x-upsert'] = 'true';
197165
+ }
197166
+ // copyMetadata=false 时,userMetadata 通过 x-metadata 头整体替换目标对象的 user_metadata
197167
+ if (copyMetadata === false && userMetadata) {
197168
+ headers['x-metadata'] = Buffer.from(JSON.stringify(userMetadata)).toString('base64');
197169
+ }
197170
+ const body = {
197171
+ bucketId,
197172
+ sourceKey,
197173
+ destinationKey
197174
+ };
197175
+ if (destinationBucket !== undefined)
197176
+ body.destinationBucket = destinationBucket;
197177
+ if (metadata !== undefined)
197178
+ body.metadata = metadata;
197179
+ if (copyMetadata !== undefined)
197180
+ body.copyMetadata = copyMetadata;
197181
+ const { proxy } = this.environment.getAuthConfig();
197182
+ const res = await (0, utils_1.fetchStream)(url, {
197183
+ method: 'POST',
197184
+ headers,
197185
+ body: JSON.stringify(body)
197186
+ }, proxy);
197187
+ const text = await res.text();
197188
+ let payload = null;
197189
+ if (text) {
197190
+ try {
197191
+ payload = JSON.parse(text);
197192
+ }
197193
+ catch (_a) {
197194
+ if (!res.ok) {
197195
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197196
+ }
197197
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
197198
+ }
197199
+ }
197200
+ if (!res.ok) {
197201
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197202
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '复制失败';
197203
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197204
+ code,
197205
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197206
+ });
197207
+ }
197208
+ if (!payload || !payload.Id || !payload.Key) {
197209
+ throw new error_1.CloudBaseError('复制成功但响应格式异常:缺少 Id 或 Key');
197210
+ }
197211
+ return payload;
197212
+ }
197213
+ /**
197214
+ * 通过 CloudBase HTTP API 移动对象(复制后删除源对象,由服务端一次性完成)
197215
+ * POST /v1/storages/object/move
197216
+ */
197217
+ async moveObject(options) {
197218
+ const { bucketId, sourceKey, destinationKey, destinationBucket, accessToken, envId: envIdOverride } = options;
197219
+ if (!bucketId || typeof bucketId !== 'string') {
197220
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197221
+ }
197222
+ if (!sourceKey || typeof sourceKey !== 'string') {
197223
+ throw new error_1.CloudBaseError('sourceKey 必须是非空字符串');
197224
+ }
197225
+ if (!destinationKey || typeof destinationKey !== 'string') {
197226
+ throw new error_1.CloudBaseError('destinationKey 必须是非空字符串');
197227
+ }
197228
+ if (destinationBucket !== undefined &&
197229
+ (typeof destinationBucket !== 'string' || !destinationBucket)) {
197230
+ throw new error_1.CloudBaseError('destinationBucket 必须是非空字符串');
197231
+ }
197232
+ if (!accessToken || typeof accessToken !== 'string') {
197233
+ throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
197234
+ }
197235
+ const { env } = this.getStorageConfig();
197236
+ const envId = envIdOverride || env;
197237
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/move`;
197238
+ const body = {
197239
+ bucketId,
197240
+ sourceKey,
197241
+ destinationKey
197242
+ };
197243
+ if (destinationBucket !== undefined)
197244
+ body.destinationBucket = destinationBucket;
197245
+ const { proxy } = this.environment.getAuthConfig();
197246
+ const res = await (0, utils_1.fetchStream)(url, {
197247
+ method: 'POST',
197248
+ headers: {
197249
+ Authorization: `Bearer ${accessToken}`,
197250
+ 'Content-Type': 'application/json'
197251
+ },
197252
+ body: JSON.stringify(body)
197253
+ }, proxy);
197254
+ const text = await res.text();
197255
+ let payload = null;
197256
+ if (text) {
197257
+ try {
197258
+ payload = JSON.parse(text);
197259
+ }
197260
+ catch (_a) {
197261
+ if (!res.ok) {
197262
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197263
+ }
197264
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
197265
+ }
197266
+ }
197267
+ if (!res.ok) {
197268
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197269
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '移动失败';
197270
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197271
+ code,
197272
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197273
+ });
197274
+ }
197275
+ if (!payload || !payload.Id || !payload.Key) {
197276
+ throw new error_1.CloudBaseError('移动成功但响应格式异常:缺少 Id 或 Key');
197277
+ }
197278
+ return {
197279
+ message: payload.message || 'Successfully moved',
197280
+ Id: payload.Id,
197281
+ Key: payload.Key
197282
+ };
197283
+ }
197284
+ /**
197285
+ * 通过 CloudBase HTTP API 列出对象
197286
+ * POST /v1/storages/object/list/:bucketId
197287
+ */
197288
+ /* eslint-disable complexity */
197289
+ async listObjects(options) {
197290
+ const { bucketId, prefix, limit, cursor, withDelimiter, sortBy, accessToken, envId: envIdOverride } = options;
197291
+ if (!bucketId || typeof bucketId !== 'string') {
197292
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197293
+ }
197294
+ if (prefix !== undefined && typeof prefix !== 'string') {
197295
+ throw new error_1.CloudBaseError('prefix 必须是字符串');
197296
+ }
197297
+ if (limit !== undefined) {
197298
+ if (!Number.isInteger(limit)) {
197299
+ throw new error_1.CloudBaseError('limit 必须是整数');
197300
+ }
197301
+ if (limit < 1 || limit > 1000) {
197302
+ throw new error_1.CloudBaseError('limit 必须在 1 ~ 1000 之间');
197303
+ }
197304
+ }
197305
+ if (cursor !== undefined && typeof cursor !== 'string') {
197306
+ throw new error_1.CloudBaseError('cursor 必须是字符串');
197307
+ }
197308
+ if (withDelimiter !== undefined && typeof withDelimiter !== 'boolean') {
197309
+ throw new error_1.CloudBaseError('withDelimiter 必须是布尔值');
197310
+ }
197311
+ if (!accessToken || typeof accessToken !== 'string') {
197312
+ throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
197313
+ }
197314
+ if (sortBy !== undefined) {
197315
+ if (typeof sortBy !== 'object' || sortBy === null || Array.isArray(sortBy)) {
197316
+ throw new error_1.CloudBaseError('sortBy 必须是对象');
197317
+ }
197318
+ const allowedColumns = ['name', 'created_at', 'updated_at'];
197319
+ const allowedOrders = ['asc', 'desc'];
197320
+ if (sortBy.column !== undefined && !allowedColumns.includes(sortBy.column)) {
197321
+ throw new error_1.CloudBaseError(`sortBy.column 非法,允许值:${allowedColumns.join('、')}`);
197322
+ }
197323
+ if (sortBy.order !== undefined) {
197324
+ const normalizedOrder = String(sortBy.order).toLowerCase();
197325
+ if (!allowedOrders.includes(normalizedOrder)) {
197326
+ throw new error_1.CloudBaseError(`sortBy.order 非法,允许值:${allowedOrders.join('、')}`);
197327
+ }
197328
+ sortBy.order = normalizedOrder;
197329
+ }
197330
+ }
197331
+ const { env } = this.getStorageConfig();
197332
+ const envId = envIdOverride || env;
197333
+ const encodedBucketId = encodeURIComponent(bucketId);
197334
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/list/${encodedBucketId}`;
197335
+ const body = {};
197336
+ if (prefix !== undefined)
197337
+ body.prefix = prefix;
197338
+ if (limit !== undefined)
197339
+ body.limit = limit;
197340
+ if (cursor !== undefined)
197341
+ body.cursor = cursor;
197342
+ if (withDelimiter !== undefined)
197343
+ body.with_delimiter = withDelimiter;
197344
+ if (sortBy !== undefined)
197345
+ body.sortBy = sortBy;
197346
+ const { proxy } = this.environment.getAuthConfig();
197347
+ const res = await (0, utils_1.fetchStream)(url, {
197348
+ method: 'POST',
197349
+ headers: {
197350
+ Authorization: `Bearer ${accessToken}`,
197351
+ 'Content-Type': 'application/json'
197352
+ },
197353
+ body: JSON.stringify(body)
197354
+ }, proxy);
197355
+ const text = await res.text();
197356
+ let payload = null;
197357
+ if (text) {
197358
+ try {
197359
+ payload = JSON.parse(text);
197360
+ }
197361
+ catch (_a) {
197362
+ if (!res.ok) {
197363
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197364
+ }
197365
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
197366
+ }
197367
+ }
197368
+ if (!res.ok) {
197369
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197370
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '列出对象失败';
197371
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197372
+ code,
197373
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197374
+ });
197375
+ }
197376
+ if (!payload || !Array.isArray(payload.objects) || !Array.isArray(payload.folders)) {
197377
+ throw new error_1.CloudBaseError('列出对象成功但响应格式异常:缺少 folders 或 objects 数组');
197378
+ }
197379
+ const result = Object.assign({ folders: payload.folders, objects: payload.objects, hasNext: Boolean(payload.hasNext), nextCursor: payload.nextCursor, nextCursorKey: payload.nextCursorKey }, payload);
197380
+ return result;
197381
+ }
197382
+ /**
197383
+ * 通过 CloudBase HTTP API 生成签名下载 URL
197384
+ * POST /v1/storages/object/sign/:bucketId/*objectName
197385
+ */
197386
+ async signObject(options) {
197387
+ const { bucketId, objectName, expiresIn, accessToken, envId: envIdOverride } = options;
197388
+ if (!bucketId || typeof bucketId !== 'string') {
197389
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197390
+ }
197391
+ if (!objectName || typeof objectName !== 'string') {
197392
+ throw new error_1.CloudBaseError('objectName 必须是非空字符串');
197393
+ }
197394
+ if (!Number.isInteger(expiresIn)) {
197395
+ throw new error_1.CloudBaseError('expiresIn 必须是整数');
197396
+ }
197397
+ if (expiresIn < 1) {
197398
+ throw new error_1.CloudBaseError('expiresIn 必须 >= 1');
197399
+ }
197400
+ if (!accessToken || typeof accessToken !== 'string') {
197401
+ throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
197402
+ }
197403
+ const { env } = this.getStorageConfig();
197404
+ const envId = envIdOverride || env;
197405
+ const encodedBucketId = encodeURIComponent(bucketId);
197406
+ const encodedObjectName = objectName
197407
+ .split('/')
197408
+ .map(seg => encodeURIComponent(seg))
197409
+ .join('/');
197410
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/sign/${encodedBucketId}/${encodedObjectName}`;
197411
+ const { proxy } = this.environment.getAuthConfig();
197412
+ const res = await (0, utils_1.fetchStream)(url, {
197413
+ method: 'POST',
197414
+ headers: {
197415
+ Authorization: `Bearer ${accessToken}`,
197416
+ 'Content-Type': 'application/json'
197417
+ },
197418
+ body: JSON.stringify({ expiresIn })
197419
+ }, proxy);
197420
+ const text = await res.text();
197421
+ let payload = null;
197422
+ if (text) {
197423
+ try {
197424
+ payload = JSON.parse(text);
197425
+ }
197426
+ catch (_a) {
197427
+ if (!res.ok) {
197428
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197429
+ }
197430
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
197431
+ }
197432
+ }
197433
+ if (!res.ok) {
197434
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197435
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '生成签名 URL 失败';
197436
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197437
+ code,
197438
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197439
+ });
197440
+ }
197441
+ if (!payload || typeof payload.signedURL !== 'string' || !payload.signedURL) {
197442
+ throw new error_1.CloudBaseError('生成签名 URL 成功但响应格式异常:缺少 signedURL');
197443
+ }
197444
+ return {
197445
+ signedURL: payload.signedURL
197446
+ };
197447
+ }
197448
+ /**
197449
+ * 通过 CloudBase HTTP API 批量生成签名下载 URL
197450
+ * POST /v1/storages/object/sign/:bucketId
197451
+ */
197452
+ async signObjects(options) {
197453
+ const { bucketId, expiresIn, paths, accessToken, envId: envIdOverride } = options;
197454
+ if (!bucketId || typeof bucketId !== 'string') {
197455
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197456
+ }
197457
+ if (!Number.isInteger(expiresIn)) {
197458
+ throw new error_1.CloudBaseError('expiresIn 必须是整数');
197459
+ }
197460
+ if (expiresIn < 1) {
197461
+ throw new error_1.CloudBaseError('expiresIn 必须 >= 1');
197462
+ }
197463
+ if (!Array.isArray(paths) || paths.length === 0) {
197464
+ throw new error_1.CloudBaseError('paths 必须是非空数组');
197465
+ }
197466
+ if (paths.length > 500) {
197467
+ throw new error_1.CloudBaseError('paths 最多 500 个');
197468
+ }
197469
+ for (const pathItem of paths) {
197470
+ if (!pathItem || typeof pathItem !== 'string') {
197471
+ throw new error_1.CloudBaseError('paths 中每一项必须是非空字符串');
197472
+ }
197473
+ }
197474
+ if (!accessToken || typeof accessToken !== 'string') {
197475
+ throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
197476
+ }
197477
+ const { env } = this.getStorageConfig();
197478
+ const envId = envIdOverride || env;
197479
+ const encodedBucketId = encodeURIComponent(bucketId);
197480
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/sign/${encodedBucketId}`;
197481
+ const { proxy } = this.environment.getAuthConfig();
197482
+ const res = await (0, utils_1.fetchStream)(url, {
197483
+ method: 'POST',
197484
+ headers: {
197485
+ Authorization: `Bearer ${accessToken}`,
197486
+ 'Content-Type': 'application/json'
197487
+ },
197488
+ body: JSON.stringify({
197489
+ expiresIn,
197490
+ paths
197491
+ })
197492
+ }, proxy);
197493
+ const text = await res.text();
197494
+ let payload = null;
197495
+ if (text) {
197496
+ try {
197497
+ payload = JSON.parse(text);
197498
+ }
197499
+ catch (_a) {
197500
+ if (!res.ok) {
197501
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197502
+ }
197503
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
197504
+ }
197505
+ }
197506
+ if (!res.ok) {
197507
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197508
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '批量生成签名 URL 失败';
197509
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197510
+ code,
197511
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197512
+ });
197513
+ }
197514
+ if (!Array.isArray(payload)) {
197515
+ throw new error_1.CloudBaseError('批量生成签名 URL 成功但响应格式异常:期望数组');
197516
+ }
197517
+ return payload;
197518
+ }
197519
+ /**
197520
+ * 通过 CloudBase HTTP API 生成签名上传 URL
197521
+ * POST /v1/storages/object/upload/sign/:bucketId/*objectName
197522
+ */
197523
+ async signUploadObject(options) {
197524
+ const { bucketId, objectName, upsert = false, accessToken, envId: envIdOverride } = options;
197525
+ if (!bucketId || typeof bucketId !== 'string') {
197526
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197527
+ }
197528
+ if (!objectName || typeof objectName !== 'string') {
197529
+ throw new error_1.CloudBaseError('objectName 必须是非空字符串');
197530
+ }
197531
+ if (typeof upsert !== 'boolean') {
197532
+ throw new error_1.CloudBaseError('upsert 必须是布尔值');
197533
+ }
197534
+ if (!accessToken || typeof accessToken !== 'string') {
197535
+ throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
197536
+ }
197537
+ const { env } = this.getStorageConfig();
197538
+ const envId = envIdOverride || env;
197539
+ const encodedBucketId = encodeURIComponent(bucketId);
197540
+ const encodedObjectName = objectName
197541
+ .split('/')
197542
+ .map(seg => encodeURIComponent(seg))
197543
+ .join('/');
197544
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/upload/sign/${encodedBucketId}/${encodedObjectName}`;
197545
+ const headers = {
197546
+ Authorization: `Bearer ${accessToken}`
197547
+ };
197548
+ if (upsert) {
197549
+ headers['x-upsert'] = 'true';
197550
+ }
197551
+ const { proxy } = this.environment.getAuthConfig();
197552
+ const res = await (0, utils_1.fetchStream)(url, {
197553
+ method: 'POST',
197554
+ headers
197555
+ }, proxy);
197556
+ const text = await res.text();
197557
+ let payload = null;
197558
+ if (text) {
197559
+ try {
197560
+ payload = JSON.parse(text);
197561
+ }
197562
+ catch (_a) {
197563
+ if (!res.ok) {
197564
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197565
+ }
197566
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
197567
+ }
197568
+ }
197569
+ if (!res.ok) {
197570
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197571
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '生成签名上传 URL 失败';
197572
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197573
+ code,
197574
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197575
+ });
197576
+ }
197577
+ if (!payload || typeof payload.url !== 'string' || typeof payload.token !== 'string') {
197578
+ throw new error_1.CloudBaseError('生成签名上传 URL 成功但响应格式异常:缺少 url 或 token');
197579
+ }
197580
+ return {
197581
+ url: payload.url,
197582
+ token: payload.token
197583
+ };
197584
+ }
197585
+ /**
197586
+ * 通过 CloudBase HTTP API 使用签名 URL 上传对象(无需 Authorization)
197587
+ * PUT /v1/storages/object/upload/sign/:bucketId/*objectName?token=xxx
197588
+ */
197589
+ async uploadObjectBySign(options) {
197590
+ const { bucketId, objectName, token, localPath, body, contentType, contentLength, envId: envIdOverride } = options;
197591
+ if (!bucketId || typeof bucketId !== 'string') {
197592
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197593
+ }
197594
+ if (!objectName || typeof objectName !== 'string') {
197595
+ throw new error_1.CloudBaseError('objectName 必须是非空字符串');
197596
+ }
197597
+ if (!token || typeof token !== 'string') {
197598
+ throw new error_1.CloudBaseError('token 必须是非空字符串');
197599
+ }
197600
+ if (!localPath && !body) {
197601
+ throw new error_1.CloudBaseError('localPath 与 body 至少提供一个');
197602
+ }
197603
+ if (localPath && body) {
197604
+ throw new error_1.CloudBaseError('localPath 与 body 只能二选一');
197605
+ }
197606
+ const { env } = this.getStorageConfig();
197607
+ const envId = envIdOverride || env;
197608
+ const encodedBucketId = encodeURIComponent(bucketId);
197609
+ const encodedObjectName = objectName
197610
+ .split('/')
197611
+ .map(seg => encodeURIComponent(seg))
197612
+ .join('/');
197613
+ const encodedToken = encodeURIComponent(token);
197614
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/upload/sign/${encodedBucketId}/${encodedObjectName}?token=${encodedToken}`;
197615
+ let fileSize = contentLength;
197616
+ if (localPath) {
197617
+ const resolvedPath = path_1.default.resolve(localPath);
197618
+ (0, utils_1.checkFullAccess)(resolvedPath, true);
197619
+ const stat = fs_1.default.statSync(resolvedPath);
197620
+ if (!stat.isFile()) {
197621
+ throw new error_1.CloudBaseError(`localPath 不是文件: ${localPath}`);
197622
+ }
197623
+ fileSize = stat.size;
197624
+ }
197625
+ else if (Buffer.isBuffer(body) && fileSize === undefined) {
197626
+ fileSize = body.length;
197627
+ }
197628
+ const finalContentType = this.resolveUploadContentType({
197629
+ contentType,
197630
+ localPath,
197631
+ objectName,
197632
+ body
197633
+ });
197634
+ const headers = {};
197635
+ if (finalContentType) {
197636
+ headers['Content-Type'] = finalContentType;
197637
+ }
197638
+ if (fileSize !== undefined) {
197639
+ headers['Content-Length'] = String(fileSize);
197640
+ }
197641
+ const reqBody = localPath ? fs_1.default.createReadStream(path_1.default.resolve(localPath)) : body;
197642
+ const { proxy } = this.environment.getAuthConfig();
197643
+ const res = await (0, utils_1.fetchStream)(url, {
197644
+ method: 'PUT',
197645
+ headers,
197646
+ body: reqBody
197647
+ }, proxy);
197648
+ const text = await res.text();
197649
+ let payload = null;
197650
+ if (text) {
197651
+ try {
197652
+ payload = JSON.parse(text);
197653
+ }
197654
+ catch (_a) {
197655
+ if (!res.ok) {
197656
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197657
+ }
197658
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
197659
+ }
197660
+ }
197661
+ if (!res.ok) {
197662
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197663
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '签名上传失败';
197664
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197665
+ code,
197666
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197667
+ });
197668
+ }
197669
+ if (!payload || typeof payload.Key !== 'string' || !payload.Key) {
197670
+ throw new error_1.CloudBaseError('签名上传成功但响应格式异常:缺少 Key');
197671
+ }
197672
+ return {
197673
+ Key: payload.Key
197674
+ };
197675
+ }
197676
+ /**
197677
+ * 通过 CloudBase HTTP API 下载对象(需认证)
197678
+ * GET/HEAD /v1/storages/object/authenticated/:bucketId/*objectName
197679
+ */
197680
+ async downloadAuthenticatedObject(options) {
197681
+ const { bucketId, objectName, method = 'GET', download, ifNoneMatch, ifModifiedSince, range, accessToken, envId: envIdOverride } = options;
197682
+ if (!bucketId || typeof bucketId !== 'string') {
197683
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197684
+ }
197685
+ if (!objectName || typeof objectName !== 'string') {
197686
+ throw new error_1.CloudBaseError('objectName 必须是非空字符串');
197687
+ }
197688
+ if (!accessToken || typeof accessToken !== 'string') {
197689
+ throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
197690
+ }
197691
+ const normalizedMethod = String(method).toUpperCase();
197692
+ const allowedMethods = ['GET', 'HEAD'];
197693
+ if (!allowedMethods.includes(normalizedMethod)) {
197694
+ throw new error_1.CloudBaseError('method 仅支持 GET 或 HEAD');
197695
+ }
197696
+ const { env } = this.getStorageConfig();
197697
+ const envId = envIdOverride || env;
197698
+ const encodedBucketId = encodeURIComponent(bucketId);
197699
+ const encodedObjectName = objectName
197700
+ .split('/')
197701
+ .map(seg => encodeURIComponent(seg))
197702
+ .join('/');
197703
+ let url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/authenticated/${encodedBucketId}/${encodedObjectName}`;
197704
+ if (download !== undefined) {
197705
+ if (typeof download !== 'string') {
197706
+ throw new error_1.CloudBaseError('download 必须是字符串');
197707
+ }
197708
+ url += `?download=${encodeURIComponent(download)}`;
197709
+ }
197710
+ const headers = {
197711
+ Authorization: `Bearer ${accessToken}`
197712
+ };
197713
+ if (ifNoneMatch !== undefined) {
197714
+ if (typeof ifNoneMatch !== 'string') {
197715
+ throw new error_1.CloudBaseError('ifNoneMatch 必须是字符串');
197716
+ }
197717
+ headers['If-None-Match'] = ifNoneMatch;
197718
+ }
197719
+ if (ifModifiedSince !== undefined) {
197720
+ if (typeof ifModifiedSince !== 'string') {
197721
+ throw new error_1.CloudBaseError('ifModifiedSince 必须是字符串');
197722
+ }
197723
+ headers['If-Modified-Since'] = ifModifiedSince;
197724
+ }
197725
+ if (range !== undefined) {
197726
+ if (typeof range !== 'string') {
197727
+ throw new error_1.CloudBaseError('range 必须是字符串');
197728
+ }
197729
+ headers.Range = range;
197730
+ }
197731
+ const { proxy } = this.environment.getAuthConfig();
197732
+ const res = await (0, utils_1.fetchStream)(url, {
197733
+ method: normalizedMethod,
197734
+ headers
197735
+ }, proxy);
197736
+ if (!res.ok) {
197737
+ const text = await res.text();
197738
+ let payload = null;
197739
+ if (text) {
197740
+ try {
197741
+ payload = JSON.parse(text);
197742
+ }
197743
+ catch (_a) {
197744
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197745
+ }
197746
+ }
197747
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197748
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '下载对象失败';
197749
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197750
+ code,
197751
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197752
+ });
197753
+ }
197754
+ const responseHeaders = {};
197755
+ res.headers.forEach((value, key) => {
197756
+ responseHeaders[key] = value;
197757
+ });
197758
+ return {
197759
+ status: res.status,
197760
+ headers: responseHeaders,
197761
+ body: normalizedMethod === 'HEAD' ? null : res.body
197762
+ };
197763
+ }
197764
+ /**
197765
+ * 通过 CloudBase HTTP API 下载对象(可选认证)
197766
+ * GET/HEAD /v1/storages/object/:bucketId/*objectName
197767
+ */
197768
+ async downloadObject(options) {
197769
+ const { bucketId, objectName, method = 'GET', download, ifNoneMatch, ifModifiedSince, range, accessToken, envId: envIdOverride } = options;
197770
+ if (!bucketId || typeof bucketId !== 'string') {
197771
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197772
+ }
197773
+ if (!objectName || typeof objectName !== 'string') {
197774
+ throw new error_1.CloudBaseError('objectName 必须是非空字符串');
197775
+ }
197776
+ if (accessToken !== undefined && typeof accessToken !== 'string') {
197777
+ throw new error_1.CloudBaseError('accessToken 必须是字符串');
197778
+ }
197779
+ const normalizedMethod = String(method).toUpperCase();
197780
+ const allowedMethods = ['GET', 'HEAD'];
197781
+ if (!allowedMethods.includes(normalizedMethod)) {
197782
+ throw new error_1.CloudBaseError('method 仅支持 GET 或 HEAD');
197783
+ }
197784
+ const { env } = this.getStorageConfig();
197785
+ const envId = envIdOverride || env;
197786
+ const encodedBucketId = encodeURIComponent(bucketId);
197787
+ const encodedObjectName = objectName
197788
+ .split('/')
197789
+ .map(seg => encodeURIComponent(seg))
197790
+ .join('/');
197791
+ let url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/${encodedBucketId}/${encodedObjectName}`;
197792
+ if (download !== undefined) {
197793
+ if (typeof download !== 'string') {
197794
+ throw new error_1.CloudBaseError('download 必须是字符串');
197795
+ }
197796
+ url += `?download=${encodeURIComponent(download)}`;
197797
+ }
197798
+ const headers = {};
197799
+ if (accessToken) {
197800
+ headers.Authorization = `Bearer ${accessToken}`;
197801
+ }
197802
+ if (ifNoneMatch !== undefined) {
197803
+ if (typeof ifNoneMatch !== 'string') {
197804
+ throw new error_1.CloudBaseError('ifNoneMatch 必须是字符串');
197805
+ }
197806
+ headers['If-None-Match'] = ifNoneMatch;
197807
+ }
197808
+ if (ifModifiedSince !== undefined) {
197809
+ if (typeof ifModifiedSince !== 'string') {
197810
+ throw new error_1.CloudBaseError('ifModifiedSince 必须是字符串');
197811
+ }
197812
+ headers['If-Modified-Since'] = ifModifiedSince;
197813
+ }
197814
+ if (range !== undefined) {
197815
+ if (typeof range !== 'string') {
197816
+ throw new error_1.CloudBaseError('range 必须是字符串');
197817
+ }
197818
+ headers.Range = range;
197819
+ }
197820
+ const { proxy } = this.environment.getAuthConfig();
197821
+ const res = await (0, utils_1.fetchStream)(url, {
197822
+ method: normalizedMethod,
197823
+ headers
197824
+ }, proxy);
197825
+ if (!res.ok) {
197826
+ const text = await res.text();
197827
+ let payload = null;
197828
+ if (text) {
197829
+ try {
197830
+ payload = JSON.parse(text);
197831
+ }
197832
+ catch (_a) {
197833
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197834
+ }
197835
+ }
197836
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197837
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '下载对象失败';
197838
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197839
+ code,
197840
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197841
+ });
197842
+ }
197843
+ const responseHeaders = {};
197844
+ res.headers.forEach((value, key) => {
197845
+ responseHeaders[key] = value;
197846
+ });
197847
+ return {
197848
+ status: res.status,
197849
+ headers: responseHeaders,
197850
+ body: normalizedMethod === 'HEAD' ? null : res.body
197851
+ };
197852
+ }
197853
+ /**
197854
+ * 通过 CloudBase HTTP API 下载公开对象(无需认证)
197855
+ * GET/HEAD /v1/storages/object/public/:bucketId/*objectName
197856
+ */
197857
+ async downloadPublicObject(options) {
197858
+ const { bucketId, objectName, method = 'GET', download, envId: envIdOverride } = options;
197859
+ if (!bucketId || typeof bucketId !== 'string') {
197860
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197861
+ }
197862
+ if (!objectName || typeof objectName !== 'string') {
197863
+ throw new error_1.CloudBaseError('objectName 必须是非空字符串');
197864
+ }
197865
+ const normalizedMethod = String(method).toUpperCase();
197866
+ const allowedMethods = ['GET', 'HEAD'];
197867
+ if (!allowedMethods.includes(normalizedMethod)) {
197868
+ throw new error_1.CloudBaseError('method 仅支持 GET 或 HEAD');
197869
+ }
197870
+ const { env } = this.getStorageConfig();
197871
+ const envId = envIdOverride || env;
197872
+ const encodedBucketId = encodeURIComponent(bucketId);
197873
+ const encodedObjectName = objectName
197874
+ .split('/')
197875
+ .map(seg => encodeURIComponent(seg))
197876
+ .join('/');
197877
+ let url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/public/${encodedBucketId}/${encodedObjectName}`;
197878
+ if (download !== undefined) {
197879
+ if (typeof download !== 'string') {
197880
+ throw new error_1.CloudBaseError('download 必须是字符串');
197881
+ }
197882
+ url += `?download=${encodeURIComponent(download)}`;
197883
+ }
197884
+ const { proxy } = this.environment.getAuthConfig();
197885
+ const res = await (0, utils_1.fetchStream)(url, {
197886
+ method: normalizedMethod
197887
+ }, proxy);
197888
+ if (!res.ok) {
197889
+ const text = await res.text();
197890
+ let payload = null;
197891
+ if (text) {
197892
+ try {
197893
+ payload = JSON.parse(text);
197894
+ }
197895
+ catch (_a) {
197896
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197897
+ }
197898
+ }
197899
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197900
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '下载公开对象失败';
197901
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197902
+ code,
197903
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197904
+ });
197905
+ }
197906
+ const responseHeaders = {};
197907
+ res.headers.forEach((value, key) => {
197908
+ responseHeaders[key] = value;
197909
+ });
197910
+ return {
197911
+ status: res.status,
197912
+ headers: responseHeaders,
197913
+ body: normalizedMethod === 'HEAD' ? null : res.body
197914
+ };
197915
+ }
197916
+ /**
197917
+ * 通过 CloudBase HTTP API 使用签名 URL 下载对象(无需 Authorization)
197918
+ * GET/HEAD /v1/storages/object/sign/:bucketId/*objectName?token=xxx
197919
+ */
197920
+ async downloadObjectBySign(options) {
197921
+ const { bucketId, objectName, token, method = 'GET', download, envId: envIdOverride } = options;
197922
+ if (!bucketId || typeof bucketId !== 'string') {
197923
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197924
+ }
197925
+ if (!objectName || typeof objectName !== 'string') {
197926
+ throw new error_1.CloudBaseError('objectName 必须是非空字符串');
197927
+ }
197928
+ if (!token || typeof token !== 'string') {
197929
+ throw new error_1.CloudBaseError('token 必须是非空字符串');
197930
+ }
197931
+ const normalizedMethod = String(method).toUpperCase();
197932
+ const allowedMethods = ['GET', 'HEAD'];
197933
+ if (!allowedMethods.includes(normalizedMethod)) {
197934
+ throw new error_1.CloudBaseError('method 仅支持 GET 或 HEAD');
197935
+ }
197936
+ const { env } = this.getStorageConfig();
197937
+ const envId = envIdOverride || env;
197938
+ const encodedBucketId = encodeURIComponent(bucketId);
197939
+ const encodedObjectName = objectName
197940
+ .split('/')
197941
+ .map(seg => encodeURIComponent(seg))
197942
+ .join('/');
197943
+ let url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/sign/${encodedBucketId}/${encodedObjectName}?token=${encodeURIComponent(token)}`;
197944
+ if (download !== undefined) {
197945
+ if (typeof download !== 'string') {
197946
+ throw new error_1.CloudBaseError('download 必须是字符串');
197947
+ }
197948
+ url += `&download=${encodeURIComponent(download)}`;
197949
+ }
197950
+ const { proxy } = this.environment.getAuthConfig();
197951
+ const res = await (0, utils_1.fetchStream)(url, {
197952
+ method: normalizedMethod
197953
+ }, proxy);
197954
+ if (!res.ok) {
197955
+ const text = await res.text();
197956
+ let payload = null;
197957
+ if (text) {
197958
+ try {
197959
+ payload = JSON.parse(text);
197960
+ }
197961
+ catch (_a) {
197962
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
197963
+ }
197964
+ }
197965
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
197966
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '通过签名 URL 下载对象失败';
197967
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
197968
+ code,
197969
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
197970
+ });
197971
+ }
197972
+ const responseHeaders = {};
197973
+ res.headers.forEach((value, key) => {
197974
+ responseHeaders[key] = value;
197975
+ });
197976
+ return {
197977
+ status: res.status,
197978
+ headers: responseHeaders,
197979
+ body: normalizedMethod === 'HEAD' ? null : res.body
197980
+ };
197981
+ }
197982
+ /**
197983
+ * 通过 CloudBase HTTP API 获取对象元信息(需认证)
197984
+ * GET/HEAD /v1/storages/object/info/authenticated/:bucketId/*objectName
197985
+ */
197986
+ async getObjectInfoAuthenticated(options) {
197987
+ const { bucketId, objectName, method = 'GET', accessToken, envId: envIdOverride } = options;
197988
+ if (!bucketId || typeof bucketId !== 'string') {
197989
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
197990
+ }
197991
+ if (!objectName || typeof objectName !== 'string') {
197992
+ throw new error_1.CloudBaseError('objectName 必须是非空字符串');
197993
+ }
197994
+ if (!accessToken || typeof accessToken !== 'string') {
197995
+ throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
197996
+ }
197997
+ const normalizedMethod = String(method).toUpperCase();
197998
+ const allowedMethods = ['GET', 'HEAD'];
197999
+ if (!allowedMethods.includes(normalizedMethod)) {
198000
+ throw new error_1.CloudBaseError('method 仅支持 GET 或 HEAD');
198001
+ }
198002
+ const { env } = this.getStorageConfig();
198003
+ const envId = envIdOverride || env;
198004
+ const encodedBucketId = encodeURIComponent(bucketId);
198005
+ const encodedObjectName = objectName
198006
+ .split('/')
198007
+ .map(seg => encodeURIComponent(seg))
198008
+ .join('/');
198009
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/info/authenticated/${encodedBucketId}/${encodedObjectName}`;
198010
+ const { proxy } = this.environment.getAuthConfig();
198011
+ const res = await (0, utils_1.fetchStream)(url, {
198012
+ method: normalizedMethod,
198013
+ headers: {
198014
+ Authorization: `Bearer ${accessToken}`
198015
+ }
198016
+ }, proxy);
198017
+ if (!res.ok) {
198018
+ const text = await res.text();
198019
+ let payload = null;
198020
+ if (text) {
198021
+ try {
198022
+ payload = JSON.parse(text);
198023
+ }
198024
+ catch (_a) {
198025
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
198026
+ }
198027
+ }
198028
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
198029
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '获取对象元信息失败';
198030
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
198031
+ code,
198032
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
198033
+ });
198034
+ }
198035
+ const responseHeaders = {};
198036
+ res.headers.forEach((value, key) => {
198037
+ responseHeaders[key] = value;
198038
+ });
198039
+ if (normalizedMethod === 'HEAD') {
198040
+ return {
198041
+ status: res.status,
198042
+ headers: responseHeaders,
198043
+ body: null
198044
+ };
198045
+ }
198046
+ const text = await res.text();
198047
+ let payload = null;
198048
+ if (text) {
198049
+ try {
198050
+ payload = JSON.parse(text);
198051
+ }
198052
+ catch (_b) {
198053
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
198054
+ }
198055
+ }
198056
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
198057
+ throw new error_1.CloudBaseError('获取对象元信息成功但响应格式异常:期望 JSON 对象');
198058
+ }
198059
+ return {
198060
+ status: res.status,
198061
+ headers: responseHeaders,
198062
+ body: payload
198063
+ };
198064
+ }
198065
+ /**
198066
+ * 通过 CloudBase HTTP API 获取公开对象元信息(无需认证)
198067
+ * GET /v1/storages/object/info/public/:bucketId/*objectName
198068
+ */
198069
+ async getObjectInfoPublic(options) {
198070
+ const { bucketId, objectName, envId: envIdOverride } = options;
198071
+ if (!bucketId || typeof bucketId !== 'string') {
198072
+ throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
198073
+ }
198074
+ if (!objectName || typeof objectName !== 'string') {
198075
+ throw new error_1.CloudBaseError('objectName 必须是非空字符串');
198076
+ }
198077
+ const { env } = this.getStorageConfig();
198078
+ const envId = envIdOverride || env;
198079
+ const encodedBucketId = encodeURIComponent(bucketId);
198080
+ const encodedObjectName = objectName
198081
+ .split('/')
198082
+ .map(seg => encodeURIComponent(seg))
198083
+ .join('/');
198084
+ const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/info/public/${encodedBucketId}/${encodedObjectName}`;
198085
+ const { proxy } = this.environment.getAuthConfig();
198086
+ const res = await (0, utils_1.fetchStream)(url, {
198087
+ method: 'GET'
198088
+ }, proxy);
198089
+ if (!res.ok) {
198090
+ const text = await res.text();
198091
+ let payload = null;
198092
+ if (text) {
198093
+ try {
198094
+ payload = JSON.parse(text);
198095
+ }
198096
+ catch (_a) {
198097
+ throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
198098
+ }
198099
+ }
198100
+ const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
198101
+ const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '获取公开对象元信息失败';
198102
+ throw new error_1.CloudBaseError(`${code}: ${message}`, {
198103
+ code,
198104
+ requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
198105
+ });
198106
+ }
198107
+ const responseHeaders = {};
198108
+ res.headers.forEach((value, key) => {
198109
+ responseHeaders[key] = value;
198110
+ });
198111
+ const text = await res.text();
198112
+ let payload = null;
198113
+ if (text) {
198114
+ try {
198115
+ payload = JSON.parse(text);
198116
+ }
198117
+ catch (_b) {
198118
+ throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
198119
+ }
198120
+ }
198121
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
198122
+ throw new error_1.CloudBaseError('获取公开对象元信息成功但响应格式异常:期望 JSON 对象');
198123
+ }
198124
+ return {
198125
+ status: res.status,
198126
+ headers: responseHeaders,
198127
+ body: payload
198128
+ };
198129
+ }
196325
198130
  /**
196326
198131
  * 获取 COS 配置
196327
198132
  */
@@ -196469,6 +198274,87 @@ class StorageService {
196469
198274
  res.map(item => /Error/gi.test(Object.prototype.toString.call(item)) && resultErrorArr.push(item));
196470
198275
  return resultErrorArr;
196471
198276
  }
198277
+ resolveUploadContentType(params) {
198278
+ const { contentType, localPath, objectName, body } = params;
198279
+ // 0. 用户显式指定优先
198280
+ const trimmedContentType = contentType === null || contentType === void 0 ? void 0 : contentType.trim();
198281
+ if (trimmedContentType) {
198282
+ return this.assertValidContentType(trimmedContentType);
198283
+ }
198284
+ // 1. 扩展名推断(优先)
198285
+ const byExt = this.inferMimeByExtension(localPath || objectName);
198286
+ if (byExt)
198287
+ return byExt;
198288
+ // 2. magic bytes 二次识别
198289
+ const byMagic = this.inferMimeByMagicBytes(localPath, body);
198290
+ if (byMagic)
198291
+ return byMagic;
198292
+ return undefined;
198293
+ }
198294
+ inferMimeByExtension(filePathOrName) {
198295
+ if (!filePathOrName)
198296
+ return undefined;
198297
+ const result = mime_types_1.default.lookup(filePathOrName);
198298
+ return typeof result === 'string' ? result : undefined;
198299
+ }
198300
+ inferMimeByMagicBytes(localPath, body) {
198301
+ let head;
198302
+ try {
198303
+ if (localPath) {
198304
+ const fd = fs_1.default.openSync(path_1.default.resolve(localPath), 'r');
198305
+ try {
198306
+ const buf = Buffer.alloc(512);
198307
+ const n = fs_1.default.readSync(fd, buf, 0, 512, 0);
198308
+ head = buf.slice(0, n);
198309
+ }
198310
+ finally {
198311
+ fs_1.default.closeSync(fd);
198312
+ }
198313
+ }
198314
+ else if (Buffer.isBuffer(body)) {
198315
+ head = body.slice(0, 512);
198316
+ }
198317
+ }
198318
+ catch (_a) {
198319
+ return undefined;
198320
+ }
198321
+ if (!head || head.length === 0)
198322
+ return undefined;
198323
+ const startsWith = (sig) => head.length >= sig.length && sig.every((b, i) => head[i] === b);
198324
+ if (startsWith([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]))
198325
+ return 'image/png';
198326
+ if (startsWith([0xFF, 0xD8, 0xFF]))
198327
+ return 'image/jpeg';
198328
+ if (head.slice(0, 6).toString('ascii') === 'GIF87a' || head.slice(0, 6).toString('ascii') === 'GIF89a')
198329
+ return 'image/gif';
198330
+ if (head.slice(0, 4).toString('ascii') === 'RIFF' && head.slice(8, 12).toString('ascii') === 'WEBP')
198331
+ return 'image/webp';
198332
+ if (head.slice(0, 4).toString('ascii') === '%PDF')
198333
+ return 'application/pdf';
198334
+ if (startsWith([0x50, 0x4B, 0x03, 0x04]))
198335
+ return 'application/zip';
198336
+ if (startsWith([0x1F, 0x8B]))
198337
+ return 'application/gzip';
198338
+ if (head.length >= 262 && head.slice(257, 262).toString('ascii') === 'ustar')
198339
+ return 'application/x-tar';
198340
+ return undefined;
198341
+ }
198342
+ assertValidContentType(input) {
198343
+ const ct = input.trim();
198344
+ if (!ct)
198345
+ throw new error_1.CloudBaseError('contentType 不能为空');
198346
+ // 防 header 注入 / 控制字符
198347
+ if (/[\u0000-\u001F\u007F]/.test(ct)) {
198348
+ throw new error_1.CloudBaseError('contentType 非法:包含控制字符');
198349
+ }
198350
+ // 只校验主类型(; 后参数放宽)
198351
+ const base = ct.split(';', 1)[0].trim();
198352
+ const typeSubtypeRe = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
198353
+ if (!typeSubtypeRe.test(base)) {
198354
+ throw new error_1.CloudBaseError('contentType 非法:主类型格式不正确');
198355
+ }
198356
+ return ct;
198357
+ }
196472
198358
  }
196473
198359
  exports.StorageService = StorageService;
196474
198360
  __decorate([
@@ -196558,6 +198444,54 @@ __decorate([
196558
198444
  __decorate([
196559
198445
  (0, utils_1.preLazy)()
196560
198446
  ], StorageService.prototype, "searchFiles", null);
198447
+ __decorate([
198448
+ (0, utils_1.preLazy)()
198449
+ ], StorageService.prototype, "uploadObject", null);
198450
+ __decorate([
198451
+ (0, utils_1.preLazy)()
198452
+ ], StorageService.prototype, "deleteObject", null);
198453
+ __decorate([
198454
+ (0, utils_1.preLazy)()
198455
+ ], StorageService.prototype, "deleteObjects", null);
198456
+ __decorate([
198457
+ (0, utils_1.preLazy)()
198458
+ ], StorageService.prototype, "copyObject", null);
198459
+ __decorate([
198460
+ (0, utils_1.preLazy)()
198461
+ ], StorageService.prototype, "moveObject", null);
198462
+ __decorate([
198463
+ (0, utils_1.preLazy)()
198464
+ ], StorageService.prototype, "listObjects", null);
198465
+ __decorate([
198466
+ (0, utils_1.preLazy)()
198467
+ ], StorageService.prototype, "signObject", null);
198468
+ __decorate([
198469
+ (0, utils_1.preLazy)()
198470
+ ], StorageService.prototype, "signObjects", null);
198471
+ __decorate([
198472
+ (0, utils_1.preLazy)()
198473
+ ], StorageService.prototype, "signUploadObject", null);
198474
+ __decorate([
198475
+ (0, utils_1.preLazy)()
198476
+ ], StorageService.prototype, "uploadObjectBySign", null);
198477
+ __decorate([
198478
+ (0, utils_1.preLazy)()
198479
+ ], StorageService.prototype, "downloadAuthenticatedObject", null);
198480
+ __decorate([
198481
+ (0, utils_1.preLazy)()
198482
+ ], StorageService.prototype, "downloadObject", null);
198483
+ __decorate([
198484
+ (0, utils_1.preLazy)()
198485
+ ], StorageService.prototype, "downloadPublicObject", null);
198486
+ __decorate([
198487
+ (0, utils_1.preLazy)()
198488
+ ], StorageService.prototype, "downloadObjectBySign", null);
198489
+ __decorate([
198490
+ (0, utils_1.preLazy)()
198491
+ ], StorageService.prototype, "getObjectInfoAuthenticated", null);
198492
+ __decorate([
198493
+ (0, utils_1.preLazy)()
198494
+ ], StorageService.prototype, "getObjectInfoPublic", null);
196561
198495
 
196562
198496
 
196563
198497
  /***/ }),
@@ -201363,7 +203297,11 @@ checkIndex: 检查指定索引是否存在`),
201363
203297
  ]).describe(`createCollection: 创建集合
201364
203298
  updateCollection: 更新集合配置;添加索引请传 updateOptions.CreateIndexes,删除索引请传 updateOptions.DropIndexes
201365
203299
  deleteCollection: 删除集合`),
201366
- collectionName: zod_1.z.string().describe("集合名称"),
203300
+ collectionName: zod_1.z
203301
+ .string()
203302
+ .trim()
203303
+ .min(1, "collectionName 不能为空")
203304
+ .describe("集合名称"),
201367
203305
  updateOptions: zod_1.z
201368
203306
  .object({
201369
203307
  CreateIndexes: zod_1.z
@@ -201487,31 +203425,40 @@ deleteCollection: 删除集合`),
201487
203425
  };
201488
203426
  }
201489
203427
  if (action === "deleteCollection") {
201490
- const result = await cloudbase.commonService("tcb", "2018-06-08").call({
201491
- Action: "DeleteTable",
201492
- Param: {
201493
- EnvId: await (0, cloudbase_manager_js_1.getEnvId)(server.cloudBaseOptions),
201494
- TableName: collectionName,
201495
- },
201496
- });
201497
- (0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
201498
- const body = withCollectionName(collectionName, {
201499
- success: true,
201500
- requestId: result.RequestId,
201501
- action,
201502
- message: result.Exists === false ? "集合不存在" : "云开发数据库集合删除成功",
201503
- });
201504
- if (result.Exists === false) {
201505
- body.exists = false;
201506
- }
201507
- return {
201508
- content: [
201509
- {
201510
- type: "text",
201511
- text: JSON.stringify(body, null, 2),
203428
+ try {
203429
+ const result = await cloudbase.commonService("tcb", "2018-06-08").call({
203430
+ Action: "DeleteTable",
203431
+ Param: {
203432
+ EnvId: await (0, cloudbase_manager_js_1.getEnvId)(server.cloudBaseOptions),
203433
+ TableName: collectionName,
201512
203434
  },
201513
- ],
201514
- };
203435
+ });
203436
+ (0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
203437
+ const body = withCollectionName(collectionName, {
203438
+ success: true,
203439
+ requestId: result.RequestId,
203440
+ action,
203441
+ message: result.Exists === false ? "集合不存在" : "云开发数据库集合删除成功",
203442
+ });
203443
+ if (result.Exists === false) {
203444
+ body.exists = false;
203445
+ }
203446
+ return {
203447
+ content: [
203448
+ {
203449
+ type: "text",
203450
+ text: JSON.stringify(body, null, 2),
203451
+ },
203452
+ ],
203453
+ };
203454
+ }
203455
+ catch (error) {
203456
+ const message = error instanceof Error ? error.message : String(error);
203457
+ if (/parameter invalid|invalid parameter|param(eter)?\s+invalid/i.test(message)) {
203458
+ throw new Error(`deleteCollection 参数校验失败,请确认 collectionName 合法且已存在。当前 collectionName=\"${collectionName}\"。原始错误:${message}`);
203459
+ }
203460
+ throw error;
203461
+ }
201515
203462
  }
201516
203463
  throw new Error(`不支持的操作类型: ${action}`);
201517
203464
  });
@@ -206833,10 +208780,11 @@ function registerPermissionTools(server) {
206833
208780
  roleId: zod_1.z.string().optional(),
206834
208781
  roleIds: zod_1.z.array(zod_1.z.string()).optional(),
206835
208782
  roleName: zod_1.z.string().optional(),
206836
- roleIdentity: zod_1.z.string().optional(),
208783
+ roleIdentity: zod_1.z.string().optional().describe("角色标识符(字母/数字/_-:@.),action=createRole 时必填,用于程序化引用角色"),
206837
208784
  description: zod_1.z.string().optional(),
206838
208785
  memberUids: zod_1.z.array(zod_1.z.string()).optional(),
206839
208786
  policies: zod_1.z.array(zod_1.z.record(zod_1.z.any())).optional(),
208787
+ policyIds: zod_1.z.array(zod_1.z.string()).optional().describe("策略 ID 列表(当前不支持直接按 ID 绑定,请改传 policies 详情对象)"),
206840
208788
  uid: zod_1.z.string().optional(),
206841
208789
  uids: zod_1.z.array(zod_1.z.string()).optional(),
206842
208790
  username: zod_1.z.string().optional(),
@@ -206850,7 +208798,7 @@ function registerPermissionTools(server) {
206850
208798
  openWorldHint: true,
206851
208799
  category: "permissions",
206852
208800
  },
206853
- }, async ({ action, resourceType, resourceId, permission, securityRule, roleId, roleIds, roleName, roleIdentity, description, memberUids, policies, uid, uids, username, password, userStatus, }) => withEnvelope(async () => {
208801
+ }, async ({ action, resourceType, resourceId, permission, securityRule, roleId, roleIds, roleName, roleIdentity, description, memberUids, policies, policyIds, uid, uids, username, password, userStatus, }) => withEnvelope(async () => {
206854
208802
  const envId = await (0, cloudbase_manager_js_1.getEnvId)(cloudBaseOptions);
206855
208803
  const cloudbase = await getManager();
206856
208804
  const normalizedPolicies = normalizeRecordArray(policies, "policies");
@@ -206910,6 +208858,14 @@ function registerPermissionTools(server) {
206910
208858
  if (!roleId) {
206911
208859
  throw new Error(`action=${action} 时必须提供 roleId`);
206912
208860
  }
208861
+ if (action === "addRolePolicies" || action === "removeRolePolicies") {
208862
+ if (policyIds?.length) {
208863
+ throw new Error(`action=${action} 暂不支持 policyIds。请改传 policies,且每项至少包含 ResourceType 和 Resource。`);
208864
+ }
208865
+ if (!normalizedPolicies?.length) {
208866
+ throw new Error(`action=${action} 时必须提供 policies,且每项至少包含 ResourceType 和 Resource。`);
208867
+ }
208868
+ }
206913
208869
  const result = await cloudbase.permission.modifyRole({
206914
208870
  roleId,
206915
208871
  ...(action === "updateRole"
@@ -207597,7 +209553,7 @@ function registerSetupTools(server) {
207597
209553
  server.registerTool("downloadTemplate", {
207598
209554
  title: "下载项目模板",
207599
209555
  description: `自动下载并部署CloudBase项目模板。
207600
- **Note**: Call this tool when the user requests to create a new project using a CloudBase template.\n\n支持的模板:\n- react: React + CloudBase 全栈应用模板\n- vue: Vue + CloudBase 全栈应用模板\n- miniprogram: 微信小程序 + 云开发模板 \n- uniapp: UniApp + CloudBase 跨端应用模板\n- rules: 只包含AI编辑器配置文件(包含Cursor、WindSurf、CodeBuddy等所有主流编辑器配置),适合在已有项目中补充AI编辑器配置\n\n支持的IDE类型:\n- all: 下载所有IDE配置\n- cursor: Cursor AI编辑器\n- 其他IDE类型见下方列表\n\n注意:如果未传入 ide 参数且无法从环境变量检测到 IDE,将提示错误并要求传入 ide 参数\n- windsurf: WindSurf AI编辑器\n- codebuddy: CodeBuddy AI编辑器\n- claude-code: Claude Code AI编辑器\n- cline: Cline AI编辑器\n- gemini-cli: Gemini CLI\n- opencode: OpenCode AI编辑器\n- qwen-code: 通义灵码\n- baidu-comate: 百度Comate\n- openai-codex-cli: OpenAI Codex CLI\n- augment-code: Augment Code\n- github-copilot: GitHub Copilot\n- roocode: RooCode AI编辑器\n- tongyi-lingma: 通义灵码\n- trae: Trae AI编辑器\n- qoder: Qoder AI编辑器\n- antigravity: Google Antigravity AI编辑器\n- vscode: Visual Studio Code\n- kiro: Kiro AI编辑器\n- aider: Aider AI编辑器\n\n特别说明:\n- rules 模板会自动包含当前 mcp 版本号信息(版本号:${ true ? "2.19.5" : 0}),便于后续维护和版本追踪\n- 下载 rules 模板时,如果项目中已存在 README.md 文件,系统会自动保护该文件不被覆盖(除非设置 overwrite=true)`,
209556
+ **Note**: Call this tool when the user requests to create a new project using a CloudBase template.\n\n支持的模板:\n- react: React + CloudBase 全栈应用模板\n- vue: Vue + CloudBase 全栈应用模板\n- miniprogram: 微信小程序 + 云开发模板 \n- uniapp: UniApp + CloudBase 跨端应用模板\n- rules: 只包含AI编辑器配置文件(包含Cursor、WindSurf、CodeBuddy等所有主流编辑器配置),适合在已有项目中补充AI编辑器配置\n\n支持的IDE类型:\n- all: 下载所有IDE配置\n- cursor: Cursor AI编辑器\n- 其他IDE类型见下方列表\n\n注意:如果未传入 ide 参数且无法从环境变量检测到 IDE,将提示错误并要求传入 ide 参数\n- windsurf: WindSurf AI编辑器\n- codebuddy: CodeBuddy AI编辑器\n- claude-code: Claude Code AI编辑器\n- cline: Cline AI编辑器\n- gemini-cli: Gemini CLI\n- opencode: OpenCode AI编辑器\n- qwen-code: 通义灵码\n- baidu-comate: 百度Comate\n- openai-codex-cli: OpenAI Codex CLI\n- augment-code: Augment Code\n- github-copilot: GitHub Copilot\n- roocode: RooCode AI编辑器\n- tongyi-lingma: 通义灵码\n- trae: Trae AI编辑器\n- qoder: Qoder AI编辑器\n- antigravity: Google Antigravity AI编辑器\n- vscode: Visual Studio Code\n- kiro: Kiro AI编辑器\n- aider: Aider AI编辑器\n\n特别说明:\n- rules 模板会自动包含当前 mcp 版本号信息(版本号:${ true ? "2.20.0-beta.0" : 0}),便于后续维护和版本追踪\n- 下载 rules 模板时,如果项目中已存在 README.md 文件,系统会自动保护该文件不被覆盖(除非设置 overwrite=true)`,
207601
209557
  inputSchema: {
207602
209558
  template: zod_1.z
207603
209559
  .enum(["react", "vue", "miniprogram", "uniapp", "rules"])
@@ -208993,8 +210949,21 @@ function updateAuthProgressState(partial) {
208993
210949
  return getAuthProgressStateSync();
208994
210950
  }
208995
210951
  function normalizeLoginStateFromEnvVars(options) {
210952
+ if (options?.ignoreEnvVars) {
210953
+ return null;
210954
+ }
210955
+ // 优先检查 CloudBase API Key(优先级高于 TENCENTCLOUD_*)
210956
+ const { CLOUDBASE_API_KEY, CLOUDBASE_ENV_ID: CLOUDBASE_ENV, } = process.env;
210957
+ if (CLOUDBASE_API_KEY && CLOUDBASE_ENV) {
210958
+ return {
210959
+ _type: 'api_key',
210960
+ apiKey: CLOUDBASE_API_KEY,
210961
+ envId: CLOUDBASE_ENV,
210962
+ };
210963
+ }
210964
+ // 然后检查腾讯云密钥环境变量
208996
210965
  const { TENCENTCLOUD_SECRETID, TENCENTCLOUD_SECRETKEY, TENCENTCLOUD_SESSIONTOKEN, } = process.env;
208997
- if (!options?.ignoreEnvVars && TENCENTCLOUD_SECRETID && TENCENTCLOUD_SECRETKEY) {
210966
+ if (TENCENTCLOUD_SECRETID && TENCENTCLOUD_SECRETKEY) {
208998
210967
  return {
208999
210968
  secretId: TENCENTCLOUD_SECRETID,
209000
210969
  secretKey: TENCENTCLOUD_SECRETKEY,
@@ -209137,13 +211106,30 @@ function resetAuthProgressState() {
209137
211106
  async function peekLoginState(options) {
209138
211107
  const envVarLoginState = normalizeLoginStateFromEnvVars(options);
209139
211108
  if (envVarLoginState) {
211109
+ // API Key 模式:需要先用 API Key 换取临时密钥
211110
+ if ('_type' in envVarLoginState && envVarLoginState._type === 'api_key') {
211111
+ (0, logger_js_1.debug)("peekLoginState: detected CLOUDBASE_API_KEY env var");
211112
+ try {
211113
+ // 优先使用 IDE 注入的工作目录,其次 process.cwd()
211114
+ const projectCwd = process.env.WORKSPACE_FOLDER_PATHS || process.cwd();
211115
+ const credential = await auth.loginByApiKey(envVarLoginState.apiKey, envVarLoginState.envId, { cwd: projectCwd });
211116
+ return credential;
211117
+ }
211118
+ catch (e) {
211119
+ (0, logger_js_1.debug)("peekLoginState: API Key login failed", { error: e instanceof Error ? e.message : String(e) });
211120
+ return null;
211121
+ }
211122
+ }
211123
+ // 腾讯云密钥模式:直接返回
209140
211124
  (0, logger_js_1.debug)("loginByApiSecret");
209141
211125
  return envVarLoginState;
209142
211126
  }
211127
+ // 尝试从 toolbox 本地存储读取(包括项目级 API Key 凭证)
209143
211128
  return auth.getLoginState();
209144
211129
  }
209145
211130
  async function ensureLogin(options) {
209146
211131
  (0, logger_js_1.debug)("TENCENTCLOUD_SECRETID", { hasSecretId: !!process.env.TENCENTCLOUD_SECRETID });
211132
+ (0, logger_js_1.debug)("CLOUDBASE_API_KEY", { hasApiKey: !!process.env.CLOUDBASE_API_KEY });
209147
211133
  const loginState = await peekLoginState({
209148
211134
  ignoreEnvVars: options?.ignoreEnvVars,
209149
211135
  });
@@ -209219,7 +211205,8 @@ async function getLoginState(options) {
209219
211205
  return ensureLogin(options);
209220
211206
  }
209221
211207
  async function logout() {
209222
- const result = await auth.logout();
211208
+ const cwd = process.env.WORKSPACE_FOLDER_PATHS || process.cwd();
211209
+ const result = await auth.logout({ cwd });
209223
211210
  resetAuthProgressState();
209224
211211
  return result;
209225
211212
  }
@@ -218011,6 +219998,14 @@ exports["default"] = Settings;
218011
219998
  })));
218012
219999
 
218013
220000
 
220001
+ /***/ }),
220002
+
220003
+ /***/ 81813:
220004
+ /***/ ((module) => {
220005
+
220006
+ "use strict";
220007
+ module.exports = /*#__PURE__*/JSON.parse('{"application/1d-interleaved-parityfec":{"source":"iana"},"application/3gpdash-qoe-report+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/3gpp-ims+xml":{"source":"iana","compressible":true},"application/3gpphal+json":{"source":"iana","compressible":true},"application/3gpphalforms+json":{"source":"iana","compressible":true},"application/a2l":{"source":"iana"},"application/ace+cbor":{"source":"iana"},"application/ace+json":{"source":"iana","compressible":true},"application/ace-groupcomm+cbor":{"source":"iana"},"application/ace-trl+cbor":{"source":"iana"},"application/activemessage":{"source":"iana"},"application/activity+json":{"source":"iana","compressible":true},"application/aif+cbor":{"source":"iana"},"application/aif+json":{"source":"iana","compressible":true},"application/alto-cdni+json":{"source":"iana","compressible":true},"application/alto-cdnifilter+json":{"source":"iana","compressible":true},"application/alto-costmap+json":{"source":"iana","compressible":true},"application/alto-costmapfilter+json":{"source":"iana","compressible":true},"application/alto-directory+json":{"source":"iana","compressible":true},"application/alto-endpointcost+json":{"source":"iana","compressible":true},"application/alto-endpointcostparams+json":{"source":"iana","compressible":true},"application/alto-endpointprop+json":{"source":"iana","compressible":true},"application/alto-endpointpropparams+json":{"source":"iana","compressible":true},"application/alto-error+json":{"source":"iana","compressible":true},"application/alto-networkmap+json":{"source":"iana","compressible":true},"application/alto-networkmapfilter+json":{"source":"iana","compressible":true},"application/alto-propmap+json":{"source":"iana","compressible":true},"application/alto-propmapparams+json":{"source":"iana","compressible":true},"application/alto-tips+json":{"source":"iana","compressible":true},"application/alto-tipsparams+json":{"source":"iana","compressible":true},"application/alto-updatestreamcontrol+json":{"source":"iana","compressible":true},"application/alto-updatestreamparams+json":{"source":"iana","compressible":true},"application/aml":{"source":"iana"},"application/andrew-inset":{"source":"iana","extensions":["ez"]},"application/appinstaller":{"compressible":false,"extensions":["appinstaller"]},"application/applefile":{"source":"iana"},"application/applixware":{"source":"apache","extensions":["aw"]},"application/appx":{"compressible":false,"extensions":["appx"]},"application/appxbundle":{"compressible":false,"extensions":["appxbundle"]},"application/at+jwt":{"source":"iana"},"application/atf":{"source":"iana"},"application/atfx":{"source":"iana"},"application/atom+xml":{"source":"iana","compressible":true,"extensions":["atom"]},"application/atomcat+xml":{"source":"iana","compressible":true,"extensions":["atomcat"]},"application/atomdeleted+xml":{"source":"iana","compressible":true,"extensions":["atomdeleted"]},"application/atomicmail":{"source":"iana"},"application/atomsvc+xml":{"source":"iana","compressible":true,"extensions":["atomsvc"]},"application/atsc-dwd+xml":{"source":"iana","compressible":true,"extensions":["dwd"]},"application/atsc-dynamic-event-message":{"source":"iana"},"application/atsc-held+xml":{"source":"iana","compressible":true,"extensions":["held"]},"application/atsc-rdt+json":{"source":"iana","compressible":true},"application/atsc-rsat+xml":{"source":"iana","compressible":true,"extensions":["rsat"]},"application/atxml":{"source":"iana"},"application/auth-policy+xml":{"source":"iana","compressible":true},"application/automationml-aml+xml":{"source":"iana","compressible":true,"extensions":["aml"]},"application/automationml-amlx+zip":{"source":"iana","compressible":false,"extensions":["amlx"]},"application/bacnet-xdd+zip":{"source":"iana","compressible":false},"application/batch-smtp":{"source":"iana"},"application/bdoc":{"compressible":false,"extensions":["bdoc"]},"application/beep+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/bufr":{"source":"iana"},"application/c2pa":{"source":"iana"},"application/calendar+json":{"source":"iana","compressible":true},"application/calendar+xml":{"source":"iana","compressible":true,"extensions":["xcs"]},"application/call-completion":{"source":"iana"},"application/cals-1840":{"source":"iana"},"application/captive+json":{"source":"iana","compressible":true},"application/cbor":{"source":"iana"},"application/cbor-seq":{"source":"iana"},"application/cccex":{"source":"iana"},"application/ccmp+xml":{"source":"iana","compressible":true},"application/ccxml+xml":{"source":"iana","compressible":true,"extensions":["ccxml"]},"application/cda+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/cdfx+xml":{"source":"iana","compressible":true,"extensions":["cdfx"]},"application/cdmi-capability":{"source":"iana","extensions":["cdmia"]},"application/cdmi-container":{"source":"iana","extensions":["cdmic"]},"application/cdmi-domain":{"source":"iana","extensions":["cdmid"]},"application/cdmi-object":{"source":"iana","extensions":["cdmio"]},"application/cdmi-queue":{"source":"iana","extensions":["cdmiq"]},"application/cdni":{"source":"iana"},"application/ce+cbor":{"source":"iana"},"application/cea":{"source":"iana"},"application/cea-2018+xml":{"source":"iana","compressible":true},"application/cellml+xml":{"source":"iana","compressible":true},"application/cfw":{"source":"iana"},"application/cid-edhoc+cbor-seq":{"source":"iana"},"application/city+json":{"source":"iana","compressible":true},"application/city+json-seq":{"source":"iana"},"application/clr":{"source":"iana"},"application/clue+xml":{"source":"iana","compressible":true},"application/clue_info+xml":{"source":"iana","compressible":true},"application/cms":{"source":"iana"},"application/cnrp+xml":{"source":"iana","compressible":true},"application/coap-eap":{"source":"iana"},"application/coap-group+json":{"source":"iana","compressible":true},"application/coap-payload":{"source":"iana"},"application/commonground":{"source":"iana"},"application/concise-problem-details+cbor":{"source":"iana"},"application/conference-info+xml":{"source":"iana","compressible":true},"application/cose":{"source":"iana"},"application/cose-key":{"source":"iana"},"application/cose-key-set":{"source":"iana"},"application/cose-x509":{"source":"iana"},"application/cpl+xml":{"source":"iana","compressible":true,"extensions":["cpl"]},"application/csrattrs":{"source":"iana"},"application/csta+xml":{"source":"iana","compressible":true},"application/cstadata+xml":{"source":"iana","compressible":true},"application/csvm+json":{"source":"iana","compressible":true},"application/cu-seeme":{"source":"apache","extensions":["cu"]},"application/cwl":{"source":"iana","extensions":["cwl"]},"application/cwl+json":{"source":"iana","compressible":true},"application/cwl+yaml":{"source":"iana"},"application/cwt":{"source":"iana"},"application/cybercash":{"source":"iana"},"application/dart":{"compressible":true},"application/dash+xml":{"source":"iana","compressible":true,"extensions":["mpd"]},"application/dash-patch+xml":{"source":"iana","compressible":true,"extensions":["mpp"]},"application/dashdelta":{"source":"iana"},"application/davmount+xml":{"source":"iana","compressible":true,"extensions":["davmount"]},"application/dca-rft":{"source":"iana"},"application/dcd":{"source":"iana"},"application/dec-dx":{"source":"iana"},"application/dialog-info+xml":{"source":"iana","compressible":true},"application/dicom":{"source":"iana","extensions":["dcm"]},"application/dicom+json":{"source":"iana","compressible":true},"application/dicom+xml":{"source":"iana","compressible":true},"application/dii":{"source":"iana"},"application/dit":{"source":"iana"},"application/dns":{"source":"iana"},"application/dns+json":{"source":"iana","compressible":true},"application/dns-message":{"source":"iana"},"application/docbook+xml":{"source":"apache","compressible":true,"extensions":["dbk"]},"application/dots+cbor":{"source":"iana"},"application/dpop+jwt":{"source":"iana"},"application/dskpp+xml":{"source":"iana","compressible":true},"application/dssc+der":{"source":"iana","extensions":["dssc"]},"application/dssc+xml":{"source":"iana","compressible":true,"extensions":["xdssc"]},"application/dvcs":{"source":"iana"},"application/eat+cwt":{"source":"iana"},"application/eat+jwt":{"source":"iana"},"application/eat-bun+cbor":{"source":"iana"},"application/eat-bun+json":{"source":"iana","compressible":true},"application/eat-ucs+cbor":{"source":"iana"},"application/eat-ucs+json":{"source":"iana","compressible":true},"application/ecmascript":{"source":"apache","compressible":true,"extensions":["ecma"]},"application/edhoc+cbor-seq":{"source":"iana"},"application/edi-consent":{"source":"iana"},"application/edi-x12":{"source":"iana","compressible":false},"application/edifact":{"source":"iana","compressible":false},"application/efi":{"source":"iana"},"application/elm+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/elm+xml":{"source":"iana","compressible":true},"application/emergencycalldata.cap+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/emergencycalldata.comment+xml":{"source":"iana","compressible":true},"application/emergencycalldata.control+xml":{"source":"iana","compressible":true},"application/emergencycalldata.deviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.ecall.msd":{"source":"iana"},"application/emergencycalldata.legacyesn+json":{"source":"iana","compressible":true},"application/emergencycalldata.providerinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.serviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.subscriberinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.veds+xml":{"source":"iana","compressible":true},"application/emma+xml":{"source":"iana","compressible":true,"extensions":["emma"]},"application/emotionml+xml":{"source":"iana","compressible":true,"extensions":["emotionml"]},"application/encaprtp":{"source":"iana"},"application/entity-statement+jwt":{"source":"iana"},"application/epp+xml":{"source":"iana","compressible":true},"application/epub+zip":{"source":"iana","compressible":false,"extensions":["epub"]},"application/eshop":{"source":"iana"},"application/exi":{"source":"iana","extensions":["exi"]},"application/expect-ct-report+json":{"source":"iana","compressible":true},"application/express":{"source":"iana","extensions":["exp"]},"application/fastinfoset":{"source":"iana"},"application/fastsoap":{"source":"iana"},"application/fdf":{"source":"iana","extensions":["fdf"]},"application/fdt+xml":{"source":"iana","compressible":true,"extensions":["fdt"]},"application/fhir+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/fhir+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/fido.trusted-apps+json":{"compressible":true},"application/fits":{"source":"iana"},"application/flexfec":{"source":"iana"},"application/font-sfnt":{"source":"iana"},"application/font-tdpfr":{"source":"iana","extensions":["pfr"]},"application/font-woff":{"source":"iana","compressible":false},"application/framework-attributes+xml":{"source":"iana","compressible":true},"application/geo+json":{"source":"iana","compressible":true,"extensions":["geojson"]},"application/geo+json-seq":{"source":"iana"},"application/geopackage+sqlite3":{"source":"iana"},"application/geopose+json":{"source":"iana","compressible":true},"application/geoxacml+json":{"source":"iana","compressible":true},"application/geoxacml+xml":{"source":"iana","compressible":true},"application/gltf-buffer":{"source":"iana"},"application/gml+xml":{"source":"iana","compressible":true,"extensions":["gml"]},"application/gnap-binding-jws":{"source":"iana"},"application/gnap-binding-jwsd":{"source":"iana"},"application/gnap-binding-rotation-jws":{"source":"iana"},"application/gnap-binding-rotation-jwsd":{"source":"iana"},"application/gpx+xml":{"source":"apache","compressible":true,"extensions":["gpx"]},"application/grib":{"source":"iana"},"application/gxf":{"source":"apache","extensions":["gxf"]},"application/gzip":{"source":"iana","compressible":false,"extensions":["gz"]},"application/h224":{"source":"iana"},"application/held+xml":{"source":"iana","compressible":true},"application/hjson":{"extensions":["hjson"]},"application/hl7v2+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/http":{"source":"iana"},"application/hyperstudio":{"source":"iana","extensions":["stk"]},"application/ibe-key-request+xml":{"source":"iana","compressible":true},"application/ibe-pkg-reply+xml":{"source":"iana","compressible":true},"application/ibe-pp-data":{"source":"iana"},"application/iges":{"source":"iana"},"application/im-iscomposing+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/index":{"source":"iana"},"application/index.cmd":{"source":"iana"},"application/index.obj":{"source":"iana"},"application/index.response":{"source":"iana"},"application/index.vnd":{"source":"iana"},"application/inkml+xml":{"source":"iana","compressible":true,"extensions":["ink","inkml"]},"application/iotp":{"source":"iana"},"application/ipfix":{"source":"iana","extensions":["ipfix"]},"application/ipp":{"source":"iana"},"application/isup":{"source":"iana"},"application/its+xml":{"source":"iana","compressible":true,"extensions":["its"]},"application/java-archive":{"source":"iana","compressible":false,"extensions":["jar","war","ear"]},"application/java-serialized-object":{"source":"apache","compressible":false,"extensions":["ser"]},"application/java-vm":{"source":"apache","compressible":false,"extensions":["class"]},"application/javascript":{"source":"apache","charset":"UTF-8","compressible":true,"extensions":["js"]},"application/jf2feed+json":{"source":"iana","compressible":true},"application/jose":{"source":"iana"},"application/jose+json":{"source":"iana","compressible":true},"application/jrd+json":{"source":"iana","compressible":true},"application/jscalendar+json":{"source":"iana","compressible":true},"application/jscontact+json":{"source":"iana","compressible":true},"application/json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["json","map"]},"application/json-patch+json":{"source":"iana","compressible":true},"application/json-seq":{"source":"iana"},"application/json5":{"extensions":["json5"]},"application/jsonml+json":{"source":"apache","compressible":true,"extensions":["jsonml"]},"application/jsonpath":{"source":"iana"},"application/jwk+json":{"source":"iana","compressible":true},"application/jwk-set+json":{"source":"iana","compressible":true},"application/jwk-set+jwt":{"source":"iana"},"application/jwt":{"source":"iana"},"application/kpml-request+xml":{"source":"iana","compressible":true},"application/kpml-response+xml":{"source":"iana","compressible":true},"application/ld+json":{"source":"iana","compressible":true,"extensions":["jsonld"]},"application/lgr+xml":{"source":"iana","compressible":true,"extensions":["lgr"]},"application/link-format":{"source":"iana"},"application/linkset":{"source":"iana"},"application/linkset+json":{"source":"iana","compressible":true},"application/load-control+xml":{"source":"iana","compressible":true},"application/logout+jwt":{"source":"iana"},"application/lost+xml":{"source":"iana","compressible":true,"extensions":["lostxml"]},"application/lostsync+xml":{"source":"iana","compressible":true},"application/lpf+zip":{"source":"iana","compressible":false},"application/lxf":{"source":"iana"},"application/mac-binhex40":{"source":"iana","extensions":["hqx"]},"application/mac-compactpro":{"source":"apache","extensions":["cpt"]},"application/macwriteii":{"source":"iana"},"application/mads+xml":{"source":"iana","compressible":true,"extensions":["mads"]},"application/manifest+json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["webmanifest"]},"application/marc":{"source":"iana","extensions":["mrc"]},"application/marcxml+xml":{"source":"iana","compressible":true,"extensions":["mrcx"]},"application/mathematica":{"source":"iana","extensions":["ma","nb","mb"]},"application/mathml+xml":{"source":"iana","compressible":true,"extensions":["mathml"]},"application/mathml-content+xml":{"source":"iana","compressible":true},"application/mathml-presentation+xml":{"source":"iana","compressible":true},"application/mbms-associated-procedure-description+xml":{"source":"iana","compressible":true},"application/mbms-deregister+xml":{"source":"iana","compressible":true},"application/mbms-envelope+xml":{"source":"iana","compressible":true},"application/mbms-msk+xml":{"source":"iana","compressible":true},"application/mbms-msk-response+xml":{"source":"iana","compressible":true},"application/mbms-protection-description+xml":{"source":"iana","compressible":true},"application/mbms-reception-report+xml":{"source":"iana","compressible":true},"application/mbms-register+xml":{"source":"iana","compressible":true},"application/mbms-register-response+xml":{"source":"iana","compressible":true},"application/mbms-schedule+xml":{"source":"iana","compressible":true},"application/mbms-user-service-description+xml":{"source":"iana","compressible":true},"application/mbox":{"source":"iana","extensions":["mbox"]},"application/media-policy-dataset+xml":{"source":"iana","compressible":true,"extensions":["mpf"]},"application/media_control+xml":{"source":"iana","compressible":true},"application/mediaservercontrol+xml":{"source":"iana","compressible":true,"extensions":["mscml"]},"application/merge-patch+json":{"source":"iana","compressible":true},"application/metalink+xml":{"source":"apache","compressible":true,"extensions":["metalink"]},"application/metalink4+xml":{"source":"iana","compressible":true,"extensions":["meta4"]},"application/mets+xml":{"source":"iana","compressible":true,"extensions":["mets"]},"application/mf4":{"source":"iana"},"application/mikey":{"source":"iana"},"application/mipc":{"source":"iana"},"application/missing-blocks+cbor-seq":{"source":"iana"},"application/mmt-aei+xml":{"source":"iana","compressible":true,"extensions":["maei"]},"application/mmt-usd+xml":{"source":"iana","compressible":true,"extensions":["musd"]},"application/mods+xml":{"source":"iana","compressible":true,"extensions":["mods"]},"application/moss-keys":{"source":"iana"},"application/moss-signature":{"source":"iana"},"application/mosskey-data":{"source":"iana"},"application/mosskey-request":{"source":"iana"},"application/mp21":{"source":"iana","extensions":["m21","mp21"]},"application/mp4":{"source":"iana","extensions":["mp4","mpg4","mp4s","m4p"]},"application/mpeg4-generic":{"source":"iana"},"application/mpeg4-iod":{"source":"iana"},"application/mpeg4-iod-xmt":{"source":"iana"},"application/mrb-consumer+xml":{"source":"iana","compressible":true},"application/mrb-publish+xml":{"source":"iana","compressible":true},"application/msc-ivr+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msc-mixer+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msix":{"compressible":false,"extensions":["msix"]},"application/msixbundle":{"compressible":false,"extensions":["msixbundle"]},"application/msword":{"source":"iana","compressible":false,"extensions":["doc","dot"]},"application/mud+json":{"source":"iana","compressible":true},"application/multipart-core":{"source":"iana"},"application/mxf":{"source":"iana","extensions":["mxf"]},"application/n-quads":{"source":"iana","extensions":["nq"]},"application/n-triples":{"source":"iana","extensions":["nt"]},"application/nasdata":{"source":"iana"},"application/news-checkgroups":{"source":"iana","charset":"US-ASCII"},"application/news-groupinfo":{"source":"iana","charset":"US-ASCII"},"application/news-transmission":{"source":"iana"},"application/nlsml+xml":{"source":"iana","compressible":true},"application/node":{"source":"iana","extensions":["cjs"]},"application/nss":{"source":"iana"},"application/oauth-authz-req+jwt":{"source":"iana"},"application/oblivious-dns-message":{"source":"iana"},"application/ocsp-request":{"source":"iana"},"application/ocsp-response":{"source":"iana"},"application/octet-stream":{"source":"iana","compressible":true,"extensions":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{"source":"iana","extensions":["oda"]},"application/odm+xml":{"source":"iana","compressible":true},"application/odx":{"source":"iana"},"application/oebps-package+xml":{"source":"iana","compressible":true,"extensions":["opf"]},"application/ogg":{"source":"iana","compressible":false,"extensions":["ogx"]},"application/ohttp-keys":{"source":"iana"},"application/omdoc+xml":{"source":"apache","compressible":true,"extensions":["omdoc"]},"application/onenote":{"source":"apache","extensions":["onetoc","onetoc2","onetmp","onepkg","one","onea"]},"application/opc-nodeset+xml":{"source":"iana","compressible":true},"application/oscore":{"source":"iana"},"application/oxps":{"source":"iana","extensions":["oxps"]},"application/p21":{"source":"iana"},"application/p21+zip":{"source":"iana","compressible":false},"application/p2p-overlay+xml":{"source":"iana","compressible":true,"extensions":["relo"]},"application/parityfec":{"source":"iana"},"application/passport":{"source":"iana"},"application/patch-ops-error+xml":{"source":"iana","compressible":true,"extensions":["xer"]},"application/pdf":{"source":"iana","compressible":false,"extensions":["pdf"]},"application/pdx":{"source":"iana"},"application/pem-certificate-chain":{"source":"iana"},"application/pgp-encrypted":{"source":"iana","compressible":false,"extensions":["pgp"]},"application/pgp-keys":{"source":"iana","extensions":["asc"]},"application/pgp-signature":{"source":"iana","extensions":["sig","asc"]},"application/pics-rules":{"source":"apache","extensions":["prf"]},"application/pidf+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pidf-diff+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pkcs10":{"source":"iana","extensions":["p10"]},"application/pkcs12":{"source":"iana"},"application/pkcs7-mime":{"source":"iana","extensions":["p7m","p7c"]},"application/pkcs7-signature":{"source":"iana","extensions":["p7s"]},"application/pkcs8":{"source":"iana","extensions":["p8"]},"application/pkcs8-encrypted":{"source":"iana"},"application/pkix-attr-cert":{"source":"iana","extensions":["ac"]},"application/pkix-cert":{"source":"iana","extensions":["cer"]},"application/pkix-crl":{"source":"iana","extensions":["crl"]},"application/pkix-pkipath":{"source":"iana","extensions":["pkipath"]},"application/pkixcmp":{"source":"iana","extensions":["pki"]},"application/pls+xml":{"source":"iana","compressible":true,"extensions":["pls"]},"application/poc-settings+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/postscript":{"source":"iana","compressible":true,"extensions":["ai","eps","ps"]},"application/ppsp-tracker+json":{"source":"iana","compressible":true},"application/private-token-issuer-directory":{"source":"iana"},"application/private-token-request":{"source":"iana"},"application/private-token-response":{"source":"iana"},"application/problem+json":{"source":"iana","compressible":true},"application/problem+xml":{"source":"iana","compressible":true},"application/provenance+xml":{"source":"iana","compressible":true,"extensions":["provx"]},"application/provided-claims+jwt":{"source":"iana"},"application/prs.alvestrand.titrax-sheet":{"source":"iana"},"application/prs.cww":{"source":"iana","extensions":["cww"]},"application/prs.cyn":{"source":"iana","charset":"7-BIT"},"application/prs.hpub+zip":{"source":"iana","compressible":false},"application/prs.implied-document+xml":{"source":"iana","compressible":true},"application/prs.implied-executable":{"source":"iana"},"application/prs.implied-object+json":{"source":"iana","compressible":true},"application/prs.implied-object+json-seq":{"source":"iana"},"application/prs.implied-object+yaml":{"source":"iana"},"application/prs.implied-structure":{"source":"iana"},"application/prs.mayfile":{"source":"iana"},"application/prs.nprend":{"source":"iana"},"application/prs.plucker":{"source":"iana"},"application/prs.rdf-xml-crypt":{"source":"iana"},"application/prs.vcfbzip2":{"source":"iana"},"application/prs.xsf+xml":{"source":"iana","compressible":true,"extensions":["xsf"]},"application/pskc+xml":{"source":"iana","compressible":true,"extensions":["pskcxml"]},"application/pvd+json":{"source":"iana","compressible":true},"application/qsig":{"source":"iana"},"application/raml+yaml":{"compressible":true,"extensions":["raml"]},"application/raptorfec":{"source":"iana"},"application/rdap+json":{"source":"iana","compressible":true},"application/rdf+xml":{"source":"iana","compressible":true,"extensions":["rdf","owl"]},"application/reginfo+xml":{"source":"iana","compressible":true,"extensions":["rif"]},"application/relax-ng-compact-syntax":{"source":"iana","extensions":["rnc"]},"application/remote-printing":{"source":"apache"},"application/reputon+json":{"source":"iana","compressible":true},"application/resolve-response+jwt":{"source":"iana"},"application/resource-lists+xml":{"source":"iana","compressible":true,"extensions":["rl"]},"application/resource-lists-diff+xml":{"source":"iana","compressible":true,"extensions":["rld"]},"application/rfc+xml":{"source":"iana","compressible":true},"application/riscos":{"source":"iana"},"application/rlmi+xml":{"source":"iana","compressible":true},"application/rls-services+xml":{"source":"iana","compressible":true,"extensions":["rs"]},"application/route-apd+xml":{"source":"iana","compressible":true,"extensions":["rapd"]},"application/route-s-tsid+xml":{"source":"iana","compressible":true,"extensions":["sls"]},"application/route-usd+xml":{"source":"iana","compressible":true,"extensions":["rusd"]},"application/rpki-checklist":{"source":"iana"},"application/rpki-ghostbusters":{"source":"iana","extensions":["gbr"]},"application/rpki-manifest":{"source":"iana","extensions":["mft"]},"application/rpki-publication":{"source":"iana"},"application/rpki-roa":{"source":"iana","extensions":["roa"]},"application/rpki-signed-tal":{"source":"iana"},"application/rpki-updown":{"source":"iana"},"application/rsd+xml":{"source":"apache","compressible":true,"extensions":["rsd"]},"application/rss+xml":{"source":"apache","compressible":true,"extensions":["rss"]},"application/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"application/rtploopback":{"source":"iana"},"application/rtx":{"source":"iana"},"application/samlassertion+xml":{"source":"iana","compressible":true},"application/samlmetadata+xml":{"source":"iana","compressible":true},"application/sarif+json":{"source":"iana","compressible":true},"application/sarif-external-properties+json":{"source":"iana","compressible":true},"application/sbe":{"source":"iana"},"application/sbml+xml":{"source":"iana","compressible":true,"extensions":["sbml"]},"application/scaip+xml":{"source":"iana","compressible":true},"application/scim+json":{"source":"iana","compressible":true},"application/scvp-cv-request":{"source":"iana","extensions":["scq"]},"application/scvp-cv-response":{"source":"iana","extensions":["scs"]},"application/scvp-vp-request":{"source":"iana","extensions":["spq"]},"application/scvp-vp-response":{"source":"iana","extensions":["spp"]},"application/sdp":{"source":"iana","extensions":["sdp"]},"application/secevent+jwt":{"source":"iana"},"application/senml+cbor":{"source":"iana"},"application/senml+json":{"source":"iana","compressible":true},"application/senml+xml":{"source":"iana","compressible":true,"extensions":["senmlx"]},"application/senml-etch+cbor":{"source":"iana"},"application/senml-etch+json":{"source":"iana","compressible":true},"application/senml-exi":{"source":"iana"},"application/sensml+cbor":{"source":"iana"},"application/sensml+json":{"source":"iana","compressible":true},"application/sensml+xml":{"source":"iana","compressible":true,"extensions":["sensmlx"]},"application/sensml-exi":{"source":"iana"},"application/sep+xml":{"source":"iana","compressible":true},"application/sep-exi":{"source":"iana"},"application/session-info":{"source":"iana"},"application/set-payment":{"source":"iana"},"application/set-payment-initiation":{"source":"iana","extensions":["setpay"]},"application/set-registration":{"source":"iana"},"application/set-registration-initiation":{"source":"iana","extensions":["setreg"]},"application/sgml":{"source":"iana"},"application/sgml-open-catalog":{"source":"iana"},"application/shf+xml":{"source":"iana","compressible":true,"extensions":["shf"]},"application/sieve":{"source":"iana","extensions":["siv","sieve"]},"application/simple-filter+xml":{"source":"iana","compressible":true},"application/simple-message-summary":{"source":"iana"},"application/simplesymbolcontainer":{"source":"iana"},"application/sipc":{"source":"iana"},"application/slate":{"source":"iana"},"application/smil":{"source":"apache"},"application/smil+xml":{"source":"iana","compressible":true,"extensions":["smi","smil"]},"application/smpte336m":{"source":"iana"},"application/soap+fastinfoset":{"source":"iana"},"application/soap+xml":{"source":"iana","compressible":true},"application/sparql-query":{"source":"iana","extensions":["rq"]},"application/sparql-results+xml":{"source":"iana","compressible":true,"extensions":["srx"]},"application/spdx+json":{"source":"iana","compressible":true},"application/spirits-event+xml":{"source":"iana","compressible":true},"application/sql":{"source":"iana","extensions":["sql"]},"application/srgs":{"source":"iana","extensions":["gram"]},"application/srgs+xml":{"source":"iana","compressible":true,"extensions":["grxml"]},"application/sru+xml":{"source":"iana","compressible":true,"extensions":["sru"]},"application/ssdl+xml":{"source":"apache","compressible":true,"extensions":["ssdl"]},"application/sslkeylogfile":{"source":"iana"},"application/ssml+xml":{"source":"iana","compressible":true,"extensions":["ssml"]},"application/st2110-41":{"source":"iana"},"application/stix+json":{"source":"iana","compressible":true},"application/stratum":{"source":"iana"},"application/swid+cbor":{"source":"iana"},"application/swid+xml":{"source":"iana","compressible":true,"extensions":["swidtag"]},"application/tamp-apex-update":{"source":"iana"},"application/tamp-apex-update-confirm":{"source":"iana"},"application/tamp-community-update":{"source":"iana"},"application/tamp-community-update-confirm":{"source":"iana"},"application/tamp-error":{"source":"iana"},"application/tamp-sequence-adjust":{"source":"iana"},"application/tamp-sequence-adjust-confirm":{"source":"iana"},"application/tamp-status-query":{"source":"iana"},"application/tamp-status-response":{"source":"iana"},"application/tamp-update":{"source":"iana"},"application/tamp-update-confirm":{"source":"iana"},"application/tar":{"compressible":true},"application/taxii+json":{"source":"iana","compressible":true},"application/td+json":{"source":"iana","compressible":true},"application/tei+xml":{"source":"iana","compressible":true,"extensions":["tei","teicorpus"]},"application/tetra_isi":{"source":"iana"},"application/thraud+xml":{"source":"iana","compressible":true,"extensions":["tfi"]},"application/timestamp-query":{"source":"iana"},"application/timestamp-reply":{"source":"iana"},"application/timestamped-data":{"source":"iana","extensions":["tsd"]},"application/tlsrpt+gzip":{"source":"iana"},"application/tlsrpt+json":{"source":"iana","compressible":true},"application/tm+json":{"source":"iana","compressible":true},"application/tnauthlist":{"source":"iana"},"application/toc+cbor":{"source":"iana"},"application/token-introspection+jwt":{"source":"iana"},"application/toml":{"source":"iana","compressible":true,"extensions":["toml"]},"application/trickle-ice-sdpfrag":{"source":"iana"},"application/trig":{"source":"iana","extensions":["trig"]},"application/trust-chain+json":{"source":"iana","compressible":true},"application/trust-mark+jwt":{"source":"iana"},"application/trust-mark-delegation+jwt":{"source":"iana"},"application/ttml+xml":{"source":"iana","compressible":true,"extensions":["ttml"]},"application/tve-trigger":{"source":"iana"},"application/tzif":{"source":"iana"},"application/tzif-leap":{"source":"iana"},"application/ubjson":{"compressible":false,"extensions":["ubj"]},"application/uccs+cbor":{"source":"iana"},"application/ujcs+json":{"source":"iana","compressible":true},"application/ulpfec":{"source":"iana"},"application/urc-grpsheet+xml":{"source":"iana","compressible":true},"application/urc-ressheet+xml":{"source":"iana","compressible":true,"extensions":["rsheet"]},"application/urc-targetdesc+xml":{"source":"iana","compressible":true,"extensions":["td"]},"application/urc-uisocketdesc+xml":{"source":"iana","compressible":true},"application/vc":{"source":"iana"},"application/vc+cose":{"source":"iana"},"application/vc+jwt":{"source":"iana"},"application/vcard+json":{"source":"iana","compressible":true},"application/vcard+xml":{"source":"iana","compressible":true},"application/vemmi":{"source":"iana"},"application/vividence.scriptfile":{"source":"apache"},"application/vnd.1000minds.decision-model+xml":{"source":"iana","compressible":true,"extensions":["1km"]},"application/vnd.1ob":{"source":"iana"},"application/vnd.3gpp-prose+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3a+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3ach+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3ch+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc8+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-v2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.5gnas":{"source":"iana"},"application/vnd.3gpp.5gsa2x":{"source":"iana"},"application/vnd.3gpp.5gsa2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.5gsv2x":{"source":"iana"},"application/vnd.3gpp.5gsv2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.access-transfer-events+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.bsf+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.crs+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.current-location-discovery+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gmop+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gtpc":{"source":"iana"},"application/vnd.3gpp.interworking-data":{"source":"iana"},"application/vnd.3gpp.lpp":{"source":"iana"},"application/vnd.3gpp.mc-signalling-ear":{"source":"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-payload":{"source":"iana"},"application/vnd.3gpp.mcdata-regroup+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-signalling":{"source":"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-floor-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-regroup+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-signed+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-init-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-regroup+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-transmission-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mid-call+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ngap":{"source":"iana"},"application/vnd.3gpp.pfcp":{"source":"iana"},"application/vnd.3gpp.pic-bw-large":{"source":"iana","extensions":["plb"]},"application/vnd.3gpp.pic-bw-small":{"source":"iana","extensions":["psb"]},"application/vnd.3gpp.pic-bw-var":{"source":"iana","extensions":["pvb"]},"application/vnd.3gpp.pinapp-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.s1ap":{"source":"iana"},"application/vnd.3gpp.seal-group-doc+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-network-qos-management-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-ue-config-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-unicast-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-user-profile-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.sms":{"source":"iana"},"application/vnd.3gpp.sms+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-ext+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.state-and-event-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ussd+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.v2x":{"source":"iana"},"application/vnd.3gpp.vae-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.bcmcsinfo+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.sms":{"source":"iana"},"application/vnd.3gpp2.tcap":{"source":"iana","extensions":["tcap"]},"application/vnd.3lightssoftware.imagescal":{"source":"iana"},"application/vnd.3m.post-it-notes":{"source":"iana","extensions":["pwn"]},"application/vnd.accpac.simply.aso":{"source":"iana","extensions":["aso"]},"application/vnd.accpac.simply.imp":{"source":"iana","extensions":["imp"]},"application/vnd.acm.addressxfer+json":{"source":"iana","compressible":true},"application/vnd.acm.chatbot+json":{"source":"iana","compressible":true},"application/vnd.acucobol":{"source":"iana","extensions":["acu"]},"application/vnd.acucorp":{"source":"iana","extensions":["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{"source":"apache","compressible":false,"extensions":["air"]},"application/vnd.adobe.flash.movie":{"source":"iana"},"application/vnd.adobe.formscentral.fcdt":{"source":"iana","extensions":["fcdt"]},"application/vnd.adobe.fxp":{"source":"iana","extensions":["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{"source":"iana"},"application/vnd.adobe.xdp+xml":{"source":"iana","compressible":true,"extensions":["xdp"]},"application/vnd.adobe.xfdf":{"source":"apache","extensions":["xfdf"]},"application/vnd.aether.imp":{"source":"iana"},"application/vnd.afpc.afplinedata":{"source":"iana"},"application/vnd.afpc.afplinedata-pagedef":{"source":"iana"},"application/vnd.afpc.cmoca-cmresource":{"source":"iana"},"application/vnd.afpc.foca-charset":{"source":"iana"},"application/vnd.afpc.foca-codedfont":{"source":"iana"},"application/vnd.afpc.foca-codepage":{"source":"iana"},"application/vnd.afpc.modca":{"source":"iana"},"application/vnd.afpc.modca-cmtable":{"source":"iana"},"application/vnd.afpc.modca-formdef":{"source":"iana"},"application/vnd.afpc.modca-mediummap":{"source":"iana"},"application/vnd.afpc.modca-objectcontainer":{"source":"iana"},"application/vnd.afpc.modca-overlay":{"source":"iana"},"application/vnd.afpc.modca-pagesegment":{"source":"iana"},"application/vnd.age":{"source":"iana","extensions":["age"]},"application/vnd.ah-barcode":{"source":"apache"},"application/vnd.ahead.space":{"source":"iana","extensions":["ahead"]},"application/vnd.airzip.filesecure.azf":{"source":"iana","extensions":["azf"]},"application/vnd.airzip.filesecure.azs":{"source":"iana","extensions":["azs"]},"application/vnd.amadeus+json":{"source":"iana","compressible":true},"application/vnd.amazon.ebook":{"source":"apache","extensions":["azw"]},"application/vnd.amazon.mobi8-ebook":{"source":"iana"},"application/vnd.americandynamics.acc":{"source":"iana","extensions":["acc"]},"application/vnd.amiga.ami":{"source":"iana","extensions":["ami"]},"application/vnd.amundsen.maze+xml":{"source":"iana","compressible":true},"application/vnd.android.ota":{"source":"iana"},"application/vnd.android.package-archive":{"source":"apache","compressible":false,"extensions":["apk"]},"application/vnd.anki":{"source":"iana"},"application/vnd.anser-web-certificate-issue-initiation":{"source":"iana","extensions":["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{"source":"apache","extensions":["fti"]},"application/vnd.antix.game-component":{"source":"iana","extensions":["atx"]},"application/vnd.apache.arrow.file":{"source":"iana"},"application/vnd.apache.arrow.stream":{"source":"iana"},"application/vnd.apache.parquet":{"source":"iana"},"application/vnd.apache.thrift.binary":{"source":"iana"},"application/vnd.apache.thrift.compact":{"source":"iana"},"application/vnd.apache.thrift.json":{"source":"iana"},"application/vnd.apexlang":{"source":"iana"},"application/vnd.api+json":{"source":"iana","compressible":true},"application/vnd.aplextor.warrp+json":{"source":"iana","compressible":true},"application/vnd.apothekende.reservation+json":{"source":"iana","compressible":true},"application/vnd.apple.installer+xml":{"source":"iana","compressible":true,"extensions":["mpkg"]},"application/vnd.apple.keynote":{"source":"iana","extensions":["key"]},"application/vnd.apple.mpegurl":{"source":"iana","extensions":["m3u8"]},"application/vnd.apple.numbers":{"source":"iana","extensions":["numbers"]},"application/vnd.apple.pages":{"source":"iana","extensions":["pages"]},"application/vnd.apple.pkpass":{"compressible":false,"extensions":["pkpass"]},"application/vnd.arastra.swi":{"source":"apache"},"application/vnd.aristanetworks.swi":{"source":"iana","extensions":["swi"]},"application/vnd.artisan+json":{"source":"iana","compressible":true},"application/vnd.artsquare":{"source":"iana"},"application/vnd.astraea-software.iota":{"source":"iana","extensions":["iota"]},"application/vnd.audiograph":{"source":"iana","extensions":["aep"]},"application/vnd.autodesk.fbx":{"extensions":["fbx"]},"application/vnd.autopackage":{"source":"iana"},"application/vnd.avalon+json":{"source":"iana","compressible":true},"application/vnd.avistar+xml":{"source":"iana","compressible":true},"application/vnd.balsamiq.bmml+xml":{"source":"iana","compressible":true,"extensions":["bmml"]},"application/vnd.balsamiq.bmpr":{"source":"iana"},"application/vnd.banana-accounting":{"source":"iana"},"application/vnd.bbf.usp.error":{"source":"iana"},"application/vnd.bbf.usp.msg":{"source":"iana"},"application/vnd.bbf.usp.msg+json":{"source":"iana","compressible":true},"application/vnd.bekitzur-stech+json":{"source":"iana","compressible":true},"application/vnd.belightsoft.lhzd+zip":{"source":"iana","compressible":false},"application/vnd.belightsoft.lhzl+zip":{"source":"iana","compressible":false},"application/vnd.bint.med-content":{"source":"iana"},"application/vnd.biopax.rdf+xml":{"source":"iana","compressible":true},"application/vnd.blink-idb-value-wrapper":{"source":"iana"},"application/vnd.blueice.multipass":{"source":"iana","extensions":["mpm"]},"application/vnd.bluetooth.ep.oob":{"source":"iana"},"application/vnd.bluetooth.le.oob":{"source":"iana"},"application/vnd.bmi":{"source":"iana","extensions":["bmi"]},"application/vnd.bpf":{"source":"iana"},"application/vnd.bpf3":{"source":"iana"},"application/vnd.businessobjects":{"source":"iana","extensions":["rep"]},"application/vnd.byu.uapi+json":{"source":"iana","compressible":true},"application/vnd.bzip3":{"source":"iana"},"application/vnd.c3voc.schedule+xml":{"source":"iana","compressible":true},"application/vnd.cab-jscript":{"source":"iana"},"application/vnd.canon-cpdl":{"source":"iana"},"application/vnd.canon-lips":{"source":"iana"},"application/vnd.capasystems-pg+json":{"source":"iana","compressible":true},"application/vnd.cendio.thinlinc.clientconf":{"source":"iana"},"application/vnd.century-systems.tcp_stream":{"source":"iana"},"application/vnd.chemdraw+xml":{"source":"iana","compressible":true,"extensions":["cdxml"]},"application/vnd.chess-pgn":{"source":"iana"},"application/vnd.chipnuts.karaoke-mmd":{"source":"iana","extensions":["mmd"]},"application/vnd.ciedi":{"source":"iana"},"application/vnd.cinderella":{"source":"iana","extensions":["cdy"]},"application/vnd.cirpack.isdn-ext":{"source":"iana"},"application/vnd.citationstyles.style+xml":{"source":"iana","compressible":true,"extensions":["csl"]},"application/vnd.claymore":{"source":"iana","extensions":["cla"]},"application/vnd.cloanto.rp9":{"source":"iana","extensions":["rp9"]},"application/vnd.clonk.c4group":{"source":"iana","extensions":["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{"source":"iana","extensions":["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{"source":"iana","extensions":["c11amz"]},"application/vnd.cncf.helm.chart.content.v1.tar+gzip":{"source":"iana"},"application/vnd.cncf.helm.chart.provenance.v1.prov":{"source":"iana"},"application/vnd.cncf.helm.config.v1+json":{"source":"iana","compressible":true},"application/vnd.coffeescript":{"source":"iana"},"application/vnd.collabio.xodocuments.document":{"source":"iana"},"application/vnd.collabio.xodocuments.document-template":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation-template":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{"source":"iana"},"application/vnd.collection+json":{"source":"iana","compressible":true},"application/vnd.collection.doc+json":{"source":"iana","compressible":true},"application/vnd.collection.next+json":{"source":"iana","compressible":true},"application/vnd.comicbook+zip":{"source":"iana","compressible":false},"application/vnd.comicbook-rar":{"source":"iana"},"application/vnd.commerce-battelle":{"source":"iana"},"application/vnd.commonspace":{"source":"iana","extensions":["csp"]},"application/vnd.contact.cmsg":{"source":"iana","extensions":["cdbcmsg"]},"application/vnd.coreos.ignition+json":{"source":"iana","compressible":true},"application/vnd.cosmocaller":{"source":"iana","extensions":["cmc"]},"application/vnd.crick.clicker":{"source":"iana","extensions":["clkx"]},"application/vnd.crick.clicker.keyboard":{"source":"iana","extensions":["clkk"]},"application/vnd.crick.clicker.palette":{"source":"iana","extensions":["clkp"]},"application/vnd.crick.clicker.template":{"source":"iana","extensions":["clkt"]},"application/vnd.crick.clicker.wordbank":{"source":"iana","extensions":["clkw"]},"application/vnd.criticaltools.wbs+xml":{"source":"iana","compressible":true,"extensions":["wbs"]},"application/vnd.cryptii.pipe+json":{"source":"iana","compressible":true},"application/vnd.crypto-shade-file":{"source":"iana"},"application/vnd.cryptomator.encrypted":{"source":"iana"},"application/vnd.cryptomator.vault":{"source":"iana"},"application/vnd.ctc-posml":{"source":"iana","extensions":["pml"]},"application/vnd.ctct.ws+xml":{"source":"iana","compressible":true},"application/vnd.cups-pdf":{"source":"iana"},"application/vnd.cups-postscript":{"source":"iana"},"application/vnd.cups-ppd":{"source":"iana","extensions":["ppd"]},"application/vnd.cups-raster":{"source":"iana"},"application/vnd.cups-raw":{"source":"iana"},"application/vnd.curl":{"source":"iana"},"application/vnd.curl.car":{"source":"apache","extensions":["car"]},"application/vnd.curl.pcurl":{"source":"apache","extensions":["pcurl"]},"application/vnd.cyan.dean.root+xml":{"source":"iana","compressible":true},"application/vnd.cybank":{"source":"iana"},"application/vnd.cyclonedx+json":{"source":"iana","compressible":true},"application/vnd.cyclonedx+xml":{"source":"iana","compressible":true},"application/vnd.d2l.coursepackage1p0+zip":{"source":"iana","compressible":false},"application/vnd.d3m-dataset":{"source":"iana"},"application/vnd.d3m-problem":{"source":"iana"},"application/vnd.dart":{"source":"iana","compressible":true,"extensions":["dart"]},"application/vnd.data-vision.rdz":{"source":"iana","extensions":["rdz"]},"application/vnd.datalog":{"source":"iana"},"application/vnd.datapackage+json":{"source":"iana","compressible":true},"application/vnd.dataresource+json":{"source":"iana","compressible":true},"application/vnd.dbf":{"source":"iana","extensions":["dbf"]},"application/vnd.dcmp+xml":{"source":"iana","compressible":true,"extensions":["dcmp"]},"application/vnd.debian.binary-package":{"source":"iana"},"application/vnd.dece.data":{"source":"iana","extensions":["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{"source":"iana","compressible":true,"extensions":["uvt","uvvt"]},"application/vnd.dece.unspecified":{"source":"iana","extensions":["uvx","uvvx"]},"application/vnd.dece.zip":{"source":"iana","extensions":["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{"source":"iana","extensions":["fe_launch"]},"application/vnd.desmume.movie":{"source":"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{"source":"iana"},"application/vnd.dm.delegation+xml":{"source":"iana","compressible":true},"application/vnd.dna":{"source":"iana","extensions":["dna"]},"application/vnd.document+json":{"source":"iana","compressible":true},"application/vnd.dolby.mlp":{"source":"apache","extensions":["mlp"]},"application/vnd.dolby.mobile.1":{"source":"iana"},"application/vnd.dolby.mobile.2":{"source":"iana"},"application/vnd.doremir.scorecloud-binary-document":{"source":"iana"},"application/vnd.dpgraph":{"source":"iana","extensions":["dpg"]},"application/vnd.dreamfactory":{"source":"iana","extensions":["dfac"]},"application/vnd.drive+json":{"source":"iana","compressible":true},"application/vnd.ds-keypoint":{"source":"apache","extensions":["kpxx"]},"application/vnd.dtg.local":{"source":"iana"},"application/vnd.dtg.local.flash":{"source":"iana"},"application/vnd.dtg.local.html":{"source":"iana"},"application/vnd.dvb.ait":{"source":"iana","extensions":["ait"]},"application/vnd.dvb.dvbisl+xml":{"source":"iana","compressible":true},"application/vnd.dvb.dvbj":{"source":"iana"},"application/vnd.dvb.esgcontainer":{"source":"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess2":{"source":"iana"},"application/vnd.dvb.ipdcesgpdd":{"source":"iana"},"application/vnd.dvb.ipdcroaming":{"source":"iana"},"application/vnd.dvb.iptv.alfec-base":{"source":"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{"source":"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-container+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-generic+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-msglist+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-request+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-response+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-init+xml":{"source":"iana","compressible":true},"application/vnd.dvb.pfr":{"source":"iana"},"application/vnd.dvb.service":{"source":"iana","extensions":["svc"]},"application/vnd.dxr":{"source":"iana"},"application/vnd.dynageo":{"source":"iana","extensions":["geo"]},"application/vnd.dzr":{"source":"iana"},"application/vnd.easykaraoke.cdgdownload":{"source":"iana"},"application/vnd.ecdis-update":{"source":"iana"},"application/vnd.ecip.rlp":{"source":"iana"},"application/vnd.eclipse.ditto+json":{"source":"iana","compressible":true},"application/vnd.ecowin.chart":{"source":"iana","extensions":["mag"]},"application/vnd.ecowin.filerequest":{"source":"iana"},"application/vnd.ecowin.fileupdate":{"source":"iana"},"application/vnd.ecowin.series":{"source":"iana"},"application/vnd.ecowin.seriesrequest":{"source":"iana"},"application/vnd.ecowin.seriesupdate":{"source":"iana"},"application/vnd.efi.img":{"source":"iana"},"application/vnd.efi.iso":{"source":"iana"},"application/vnd.eln+zip":{"source":"iana","compressible":false},"application/vnd.emclient.accessrequest+xml":{"source":"iana","compressible":true},"application/vnd.enliven":{"source":"iana","extensions":["nml"]},"application/vnd.enphase.envoy":{"source":"iana"},"application/vnd.eprints.data+xml":{"source":"iana","compressible":true},"application/vnd.epson.esf":{"source":"iana","extensions":["esf"]},"application/vnd.epson.msf":{"source":"iana","extensions":["msf"]},"application/vnd.epson.quickanime":{"source":"iana","extensions":["qam"]},"application/vnd.epson.salt":{"source":"iana","extensions":["slt"]},"application/vnd.epson.ssf":{"source":"iana","extensions":["ssf"]},"application/vnd.ericsson.quickcall":{"source":"iana"},"application/vnd.erofs":{"source":"iana"},"application/vnd.espass-espass+zip":{"source":"iana","compressible":false},"application/vnd.eszigno3+xml":{"source":"iana","compressible":true,"extensions":["es3","et3"]},"application/vnd.etsi.aoc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.asic-e+zip":{"source":"iana","compressible":false},"application/vnd.etsi.asic-s+zip":{"source":"iana","compressible":false},"application/vnd.etsi.cug+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvcommand+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-bc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-cod+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-npvr+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvservice+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsync+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvueprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mcid+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mheg5":{"source":"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{"source":"iana","compressible":true},"application/vnd.etsi.pstn+xml":{"source":"iana","compressible":true},"application/vnd.etsi.sci+xml":{"source":"iana","compressible":true},"application/vnd.etsi.simservs+xml":{"source":"iana","compressible":true},"application/vnd.etsi.timestamp-token":{"source":"iana"},"application/vnd.etsi.tsl+xml":{"source":"iana","compressible":true},"application/vnd.etsi.tsl.der":{"source":"iana"},"application/vnd.eu.kasparian.car+json":{"source":"iana","compressible":true},"application/vnd.eudora.data":{"source":"iana"},"application/vnd.evolv.ecig.profile":{"source":"iana"},"application/vnd.evolv.ecig.settings":{"source":"iana"},"application/vnd.evolv.ecig.theme":{"source":"iana"},"application/vnd.exstream-empower+zip":{"source":"iana","compressible":false},"application/vnd.exstream-package":{"source":"iana"},"application/vnd.ezpix-album":{"source":"iana","extensions":["ez2"]},"application/vnd.ezpix-package":{"source":"iana","extensions":["ez3"]},"application/vnd.f-secure.mobile":{"source":"iana"},"application/vnd.familysearch.gedcom+zip":{"source":"iana","compressible":false},"application/vnd.fastcopy-disk-image":{"source":"iana"},"application/vnd.fdf":{"source":"apache","extensions":["fdf"]},"application/vnd.fdsn.mseed":{"source":"iana","extensions":["mseed"]},"application/vnd.fdsn.seed":{"source":"iana","extensions":["seed","dataless"]},"application/vnd.fdsn.stationxml+xml":{"source":"iana","charset":"XML-BASED","compressible":true},"application/vnd.ffsns":{"source":"iana"},"application/vnd.ficlab.flb+zip":{"source":"iana","compressible":false},"application/vnd.filmit.zfc":{"source":"iana"},"application/vnd.fints":{"source":"iana"},"application/vnd.firemonkeys.cloudcell":{"source":"iana"},"application/vnd.flographit":{"source":"iana","extensions":["gph"]},"application/vnd.fluxtime.clip":{"source":"iana","extensions":["ftc"]},"application/vnd.font-fontforge-sfd":{"source":"iana"},"application/vnd.framemaker":{"source":"iana","extensions":["fm","frame","maker","book"]},"application/vnd.freelog.comic":{"source":"iana"},"application/vnd.frogans.fnc":{"source":"apache","extensions":["fnc"]},"application/vnd.frogans.ltf":{"source":"apache","extensions":["ltf"]},"application/vnd.fsc.weblaunch":{"source":"iana","extensions":["fsc"]},"application/vnd.fujifilm.fb.docuworks":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.container":{"source":"iana"},"application/vnd.fujifilm.fb.jfi+xml":{"source":"iana","compressible":true},"application/vnd.fujitsu.oasys":{"source":"iana","extensions":["oas"]},"application/vnd.fujitsu.oasys2":{"source":"iana","extensions":["oa2"]},"application/vnd.fujitsu.oasys3":{"source":"iana","extensions":["oa3"]},"application/vnd.fujitsu.oasysgp":{"source":"iana","extensions":["fg5"]},"application/vnd.fujitsu.oasysprs":{"source":"iana","extensions":["bh2"]},"application/vnd.fujixerox.art-ex":{"source":"iana"},"application/vnd.fujixerox.art4":{"source":"iana"},"application/vnd.fujixerox.ddd":{"source":"iana","extensions":["ddd"]},"application/vnd.fujixerox.docuworks":{"source":"iana","extensions":["xdw"]},"application/vnd.fujixerox.docuworks.binder":{"source":"iana","extensions":["xbd"]},"application/vnd.fujixerox.docuworks.container":{"source":"iana"},"application/vnd.fujixerox.hbpl":{"source":"iana"},"application/vnd.fut-misnet":{"source":"iana"},"application/vnd.futoin+cbor":{"source":"iana"},"application/vnd.futoin+json":{"source":"iana","compressible":true},"application/vnd.fuzzysheet":{"source":"iana","extensions":["fzs"]},"application/vnd.ga4gh.passport+jwt":{"source":"iana"},"application/vnd.genomatix.tuxedo":{"source":"iana","extensions":["txd"]},"application/vnd.genozip":{"source":"iana"},"application/vnd.gentics.grd+json":{"source":"iana","compressible":true},"application/vnd.gentoo.catmetadata+xml":{"source":"iana","compressible":true},"application/vnd.gentoo.ebuild":{"source":"iana"},"application/vnd.gentoo.eclass":{"source":"iana"},"application/vnd.gentoo.gpkg":{"source":"iana"},"application/vnd.gentoo.manifest":{"source":"iana"},"application/vnd.gentoo.pkgmetadata+xml":{"source":"iana","compressible":true},"application/vnd.gentoo.xpak":{"source":"iana"},"application/vnd.geo+json":{"source":"apache","compressible":true},"application/vnd.geocube+xml":{"source":"apache","compressible":true},"application/vnd.geogebra.file":{"source":"iana","extensions":["ggb"]},"application/vnd.geogebra.pinboard":{"source":"iana"},"application/vnd.geogebra.slides":{"source":"iana","extensions":["ggs"]},"application/vnd.geogebra.tool":{"source":"iana","extensions":["ggt"]},"application/vnd.geometry-explorer":{"source":"iana","extensions":["gex","gre"]},"application/vnd.geonext":{"source":"iana","extensions":["gxt"]},"application/vnd.geoplan":{"source":"iana","extensions":["g2w"]},"application/vnd.geospace":{"source":"iana","extensions":["g3w"]},"application/vnd.gerber":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt-response":{"source":"iana"},"application/vnd.gmx":{"source":"iana","extensions":["gmx"]},"application/vnd.gnu.taler.exchange+json":{"source":"iana","compressible":true},"application/vnd.gnu.taler.merchant+json":{"source":"iana","compressible":true},"application/vnd.google-apps.audio":{},"application/vnd.google-apps.document":{"compressible":false,"extensions":["gdoc"]},"application/vnd.google-apps.drawing":{"compressible":false,"extensions":["gdraw"]},"application/vnd.google-apps.drive-sdk":{"compressible":false},"application/vnd.google-apps.file":{},"application/vnd.google-apps.folder":{"compressible":false},"application/vnd.google-apps.form":{"compressible":false,"extensions":["gform"]},"application/vnd.google-apps.fusiontable":{},"application/vnd.google-apps.jam":{"compressible":false,"extensions":["gjam"]},"application/vnd.google-apps.mail-layout":{},"application/vnd.google-apps.map":{"compressible":false,"extensions":["gmap"]},"application/vnd.google-apps.photo":{},"application/vnd.google-apps.presentation":{"compressible":false,"extensions":["gslides"]},"application/vnd.google-apps.script":{"compressible":false,"extensions":["gscript"]},"application/vnd.google-apps.shortcut":{},"application/vnd.google-apps.site":{"compressible":false,"extensions":["gsite"]},"application/vnd.google-apps.spreadsheet":{"compressible":false,"extensions":["gsheet"]},"application/vnd.google-apps.unknown":{},"application/vnd.google-apps.video":{},"application/vnd.google-earth.kml+xml":{"source":"iana","compressible":true,"extensions":["kml"]},"application/vnd.google-earth.kmz":{"source":"iana","compressible":false,"extensions":["kmz"]},"application/vnd.gov.sk.e-form+xml":{"source":"apache","compressible":true},"application/vnd.gov.sk.e-form+zip":{"source":"iana","compressible":false},"application/vnd.gov.sk.xmldatacontainer+xml":{"source":"iana","compressible":true,"extensions":["xdcf"]},"application/vnd.gpxsee.map+xml":{"source":"iana","compressible":true},"application/vnd.grafeq":{"source":"iana","extensions":["gqf","gqs"]},"application/vnd.gridmp":{"source":"iana"},"application/vnd.groove-account":{"source":"iana","extensions":["gac"]},"application/vnd.groove-help":{"source":"iana","extensions":["ghf"]},"application/vnd.groove-identity-message":{"source":"iana","extensions":["gim"]},"application/vnd.groove-injector":{"source":"iana","extensions":["grv"]},"application/vnd.groove-tool-message":{"source":"iana","extensions":["gtm"]},"application/vnd.groove-tool-template":{"source":"iana","extensions":["tpl"]},"application/vnd.groove-vcard":{"source":"iana","extensions":["vcg"]},"application/vnd.hal+json":{"source":"iana","compressible":true},"application/vnd.hal+xml":{"source":"iana","compressible":true,"extensions":["hal"]},"application/vnd.handheld-entertainment+xml":{"source":"iana","compressible":true,"extensions":["zmm"]},"application/vnd.hbci":{"source":"iana","extensions":["hbci"]},"application/vnd.hc+json":{"source":"iana","compressible":true},"application/vnd.hcl-bireports":{"source":"iana"},"application/vnd.hdt":{"source":"iana"},"application/vnd.heroku+json":{"source":"iana","compressible":true},"application/vnd.hhe.lesson-player":{"source":"iana","extensions":["les"]},"application/vnd.hp-hpgl":{"source":"iana","extensions":["hpgl"]},"application/vnd.hp-hpid":{"source":"iana","extensions":["hpid"]},"application/vnd.hp-hps":{"source":"iana","extensions":["hps"]},"application/vnd.hp-jlyt":{"source":"iana","extensions":["jlt"]},"application/vnd.hp-pcl":{"source":"iana","extensions":["pcl"]},"application/vnd.hp-pclxl":{"source":"iana","extensions":["pclxl"]},"application/vnd.hsl":{"source":"iana"},"application/vnd.httphone":{"source":"iana"},"application/vnd.hydrostatix.sof-data":{"source":"iana","extensions":["sfd-hdstx"]},"application/vnd.hyper+json":{"source":"iana","compressible":true},"application/vnd.hyper-item+json":{"source":"iana","compressible":true},"application/vnd.hyperdrive+json":{"source":"iana","compressible":true},"application/vnd.hzn-3d-crossword":{"source":"iana"},"application/vnd.ibm.afplinedata":{"source":"apache"},"application/vnd.ibm.electronic-media":{"source":"iana"},"application/vnd.ibm.minipay":{"source":"iana","extensions":["mpy"]},"application/vnd.ibm.modcap":{"source":"apache","extensions":["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{"source":"iana","extensions":["irm"]},"application/vnd.ibm.secure-container":{"source":"iana","extensions":["sc"]},"application/vnd.iccprofile":{"source":"iana","extensions":["icc","icm"]},"application/vnd.ieee.1905":{"source":"iana"},"application/vnd.igloader":{"source":"iana","extensions":["igl"]},"application/vnd.imagemeter.folder+zip":{"source":"iana","compressible":false},"application/vnd.imagemeter.image+zip":{"source":"iana","compressible":false},"application/vnd.immervision-ivp":{"source":"iana","extensions":["ivp"]},"application/vnd.immervision-ivu":{"source":"iana","extensions":["ivu"]},"application/vnd.ims.imsccv1p1":{"source":"iana"},"application/vnd.ims.imsccv1p2":{"source":"iana"},"application/vnd.ims.imsccv1p3":{"source":"iana"},"application/vnd.ims.lis.v2.result+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy.id+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings.simple+json":{"source":"iana","compressible":true},"application/vnd.informedcontrol.rms+xml":{"source":"iana","compressible":true},"application/vnd.informix-visionary":{"source":"apache"},"application/vnd.infotech.project":{"source":"iana"},"application/vnd.infotech.project+xml":{"source":"iana","compressible":true},"application/vnd.innopath.wamp.notification":{"source":"iana"},"application/vnd.insors.igm":{"source":"iana","extensions":["igm"]},"application/vnd.intercon.formnet":{"source":"iana","extensions":["xpw","xpx"]},"application/vnd.intergeo":{"source":"iana","extensions":["i2g"]},"application/vnd.intertrust.digibox":{"source":"iana"},"application/vnd.intertrust.nncp":{"source":"iana"},"application/vnd.intu.qbo":{"source":"iana","extensions":["qbo"]},"application/vnd.intu.qfx":{"source":"iana","extensions":["qfx"]},"application/vnd.ipfs.ipns-record":{"source":"iana"},"application/vnd.ipld.car":{"source":"iana"},"application/vnd.ipld.dag-cbor":{"source":"iana"},"application/vnd.ipld.dag-json":{"source":"iana"},"application/vnd.ipld.raw":{"source":"iana"},"application/vnd.iptc.g2.catalogitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.conceptitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.knowledgeitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsmessage+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.packageitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.planningitem+xml":{"source":"iana","compressible":true},"application/vnd.ipunplugged.rcprofile":{"source":"iana","extensions":["rcprofile"]},"application/vnd.irepository.package+xml":{"source":"iana","compressible":true,"extensions":["irp"]},"application/vnd.is-xpr":{"source":"iana","extensions":["xpr"]},"application/vnd.isac.fcs":{"source":"iana","extensions":["fcs"]},"application/vnd.iso11783-10+zip":{"source":"iana","compressible":false},"application/vnd.jam":{"source":"iana","extensions":["jam"]},"application/vnd.japannet-directory-service":{"source":"iana"},"application/vnd.japannet-jpnstore-wakeup":{"source":"iana"},"application/vnd.japannet-payment-wakeup":{"source":"iana"},"application/vnd.japannet-registration":{"source":"iana"},"application/vnd.japannet-registration-wakeup":{"source":"iana"},"application/vnd.japannet-setstore-wakeup":{"source":"iana"},"application/vnd.japannet-verification":{"source":"iana"},"application/vnd.japannet-verification-wakeup":{"source":"iana"},"application/vnd.jcp.javame.midlet-rms":{"source":"iana","extensions":["rms"]},"application/vnd.jisp":{"source":"iana","extensions":["jisp"]},"application/vnd.joost.joda-archive":{"source":"iana","extensions":["joda"]},"application/vnd.jsk.isdn-ngn":{"source":"iana"},"application/vnd.kahootz":{"source":"iana","extensions":["ktz","ktr"]},"application/vnd.kde.karbon":{"source":"iana","extensions":["karbon"]},"application/vnd.kde.kchart":{"source":"iana","extensions":["chrt"]},"application/vnd.kde.kformula":{"source":"iana","extensions":["kfo"]},"application/vnd.kde.kivio":{"source":"iana","extensions":["flw"]},"application/vnd.kde.kontour":{"source":"iana","extensions":["kon"]},"application/vnd.kde.kpresenter":{"source":"iana","extensions":["kpr","kpt"]},"application/vnd.kde.kspread":{"source":"iana","extensions":["ksp"]},"application/vnd.kde.kword":{"source":"iana","extensions":["kwd","kwt"]},"application/vnd.kdl":{"source":"iana"},"application/vnd.kenameaapp":{"source":"iana","extensions":["htke"]},"application/vnd.keyman.kmp+zip":{"source":"iana","compressible":false},"application/vnd.keyman.kmx":{"source":"iana"},"application/vnd.kidspiration":{"source":"iana","extensions":["kia"]},"application/vnd.kinar":{"source":"iana","extensions":["kne","knp"]},"application/vnd.koan":{"source":"iana","extensions":["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{"source":"iana","extensions":["sse"]},"application/vnd.las":{"source":"iana"},"application/vnd.las.las+json":{"source":"iana","compressible":true},"application/vnd.las.las+xml":{"source":"iana","compressible":true,"extensions":["lasxml"]},"application/vnd.laszip":{"source":"iana"},"application/vnd.ldev.productlicensing":{"source":"iana"},"application/vnd.leap+json":{"source":"iana","compressible":true},"application/vnd.liberty-request+xml":{"source":"iana","compressible":true},"application/vnd.llamagraphics.life-balance.desktop":{"source":"iana","extensions":["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{"source":"iana","compressible":true,"extensions":["lbe"]},"application/vnd.logipipe.circuit+zip":{"source":"iana","compressible":false},"application/vnd.loom":{"source":"iana"},"application/vnd.lotus-1-2-3":{"source":"iana","extensions":["123"]},"application/vnd.lotus-approach":{"source":"iana","extensions":["apr"]},"application/vnd.lotus-freelance":{"source":"iana","extensions":["pre"]},"application/vnd.lotus-notes":{"source":"iana","extensions":["nsf"]},"application/vnd.lotus-organizer":{"source":"iana","extensions":["org"]},"application/vnd.lotus-screencam":{"source":"iana","extensions":["scm"]},"application/vnd.lotus-wordpro":{"source":"iana","extensions":["lwp"]},"application/vnd.macports.portpkg":{"source":"iana","extensions":["portpkg"]},"application/vnd.mapbox-vector-tile":{"source":"iana","extensions":["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.conftoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.license+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.mdcf":{"source":"iana"},"application/vnd.mason+json":{"source":"iana","compressible":true},"application/vnd.maxar.archive.3tz+zip":{"source":"iana","compressible":false},"application/vnd.maxmind.maxmind-db":{"source":"iana"},"application/vnd.mcd":{"source":"iana","extensions":["mcd"]},"application/vnd.mdl":{"source":"iana"},"application/vnd.mdl-mbsdf":{"source":"iana"},"application/vnd.medcalcdata":{"source":"iana","extensions":["mc1"]},"application/vnd.mediastation.cdkey":{"source":"iana","extensions":["cdkey"]},"application/vnd.medicalholodeck.recordxr":{"source":"iana"},"application/vnd.meridian-slingshot":{"source":"iana"},"application/vnd.mermaid":{"source":"iana"},"application/vnd.mfer":{"source":"iana","extensions":["mwf"]},"application/vnd.mfmp":{"source":"iana","extensions":["mfm"]},"application/vnd.micro+json":{"source":"iana","compressible":true},"application/vnd.micrografx.flo":{"source":"iana","extensions":["flo"]},"application/vnd.micrografx.igx":{"source":"iana","extensions":["igx"]},"application/vnd.microsoft.portable-executable":{"source":"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{"source":"iana"},"application/vnd.miele+json":{"source":"iana","compressible":true},"application/vnd.mif":{"source":"iana","extensions":["mif"]},"application/vnd.minisoft-hp3000-save":{"source":"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{"source":"iana"},"application/vnd.mobius.daf":{"source":"iana","extensions":["daf"]},"application/vnd.mobius.dis":{"source":"iana","extensions":["dis"]},"application/vnd.mobius.mbk":{"source":"iana","extensions":["mbk"]},"application/vnd.mobius.mqy":{"source":"iana","extensions":["mqy"]},"application/vnd.mobius.msl":{"source":"iana","extensions":["msl"]},"application/vnd.mobius.plc":{"source":"iana","extensions":["plc"]},"application/vnd.mobius.txf":{"source":"iana","extensions":["txf"]},"application/vnd.modl":{"source":"iana"},"application/vnd.mophun.application":{"source":"iana","extensions":["mpn"]},"application/vnd.mophun.certificate":{"source":"iana","extensions":["mpc"]},"application/vnd.motorola.flexsuite":{"source":"iana"},"application/vnd.motorola.flexsuite.adsi":{"source":"iana"},"application/vnd.motorola.flexsuite.fis":{"source":"iana"},"application/vnd.motorola.flexsuite.gotap":{"source":"iana"},"application/vnd.motorola.flexsuite.kmr":{"source":"iana"},"application/vnd.motorola.flexsuite.ttc":{"source":"iana"},"application/vnd.motorola.flexsuite.wem":{"source":"iana"},"application/vnd.motorola.iprm":{"source":"iana"},"application/vnd.mozilla.xul+xml":{"source":"iana","compressible":true,"extensions":["xul"]},"application/vnd.ms-3mfdocument":{"source":"iana"},"application/vnd.ms-artgalry":{"source":"iana","extensions":["cil"]},"application/vnd.ms-asf":{"source":"iana"},"application/vnd.ms-cab-compressed":{"source":"iana","extensions":["cab"]},"application/vnd.ms-color.iccprofile":{"source":"apache"},"application/vnd.ms-excel":{"source":"iana","compressible":false,"extensions":["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{"source":"iana","extensions":["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{"source":"iana","extensions":["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{"source":"iana","extensions":["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{"source":"iana","extensions":["xltm"]},"application/vnd.ms-fontobject":{"source":"iana","compressible":true,"extensions":["eot"]},"application/vnd.ms-htmlhelp":{"source":"iana","extensions":["chm"]},"application/vnd.ms-ims":{"source":"iana","extensions":["ims"]},"application/vnd.ms-lrm":{"source":"iana","extensions":["lrm"]},"application/vnd.ms-office.activex+xml":{"source":"iana","compressible":true},"application/vnd.ms-officetheme":{"source":"iana","extensions":["thmx"]},"application/vnd.ms-opentype":{"source":"apache","compressible":true},"application/vnd.ms-outlook":{"compressible":false,"extensions":["msg"]},"application/vnd.ms-package.obfuscated-opentype":{"source":"apache"},"application/vnd.ms-pki.seccat":{"source":"apache","extensions":["cat"]},"application/vnd.ms-pki.stl":{"source":"apache","extensions":["stl"]},"application/vnd.ms-playready.initiator+xml":{"source":"iana","compressible":true},"application/vnd.ms-powerpoint":{"source":"iana","compressible":false,"extensions":["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{"source":"iana","extensions":["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{"source":"iana","extensions":["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{"source":"iana","extensions":["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{"source":"iana","extensions":["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{"source":"iana","extensions":["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{"source":"iana","compressible":true},"application/vnd.ms-printing.printticket+xml":{"source":"apache","compressible":true},"application/vnd.ms-printschematicket+xml":{"source":"iana","compressible":true},"application/vnd.ms-project":{"source":"iana","extensions":["mpp","mpt"]},"application/vnd.ms-tnef":{"source":"iana"},"application/vnd.ms-visio.viewer":{"extensions":["vdx"]},"application/vnd.ms-windows.devicepairing":{"source":"iana"},"application/vnd.ms-windows.nwprinting.oob":{"source":"iana"},"application/vnd.ms-windows.printerpairing":{"source":"iana"},"application/vnd.ms-windows.wsd.oob":{"source":"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.lic-resp":{"source":"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.meter-resp":{"source":"iana"},"application/vnd.ms-word.document.macroenabled.12":{"source":"iana","extensions":["docm"]},"application/vnd.ms-word.template.macroenabled.12":{"source":"iana","extensions":["dotm"]},"application/vnd.ms-works":{"source":"iana","extensions":["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{"source":"iana","extensions":["wpl"]},"application/vnd.ms-xpsdocument":{"source":"iana","compressible":false,"extensions":["xps"]},"application/vnd.msa-disk-image":{"source":"iana"},"application/vnd.mseq":{"source":"iana","extensions":["mseq"]},"application/vnd.msgpack":{"source":"iana"},"application/vnd.msign":{"source":"iana"},"application/vnd.multiad.creator":{"source":"iana"},"application/vnd.multiad.creator.cif":{"source":"iana"},"application/vnd.music-niff":{"source":"iana"},"application/vnd.musician":{"source":"iana","extensions":["mus"]},"application/vnd.muvee.style":{"source":"iana","extensions":["msty"]},"application/vnd.mynfc":{"source":"iana","extensions":["taglet"]},"application/vnd.nacamar.ybrid+json":{"source":"iana","compressible":true},"application/vnd.nato.bindingdataobject+cbor":{"source":"iana"},"application/vnd.nato.bindingdataobject+json":{"source":"iana","compressible":true},"application/vnd.nato.bindingdataobject+xml":{"source":"iana","compressible":true,"extensions":["bdo"]},"application/vnd.nato.openxmlformats-package.iepd+zip":{"source":"iana","compressible":false},"application/vnd.ncd.control":{"source":"iana"},"application/vnd.ncd.reference":{"source":"iana"},"application/vnd.nearst.inv+json":{"source":"iana","compressible":true},"application/vnd.nebumind.line":{"source":"iana"},"application/vnd.nervana":{"source":"iana"},"application/vnd.netfpx":{"source":"iana"},"application/vnd.neurolanguage.nlu":{"source":"iana","extensions":["nlu"]},"application/vnd.nimn":{"source":"iana"},"application/vnd.nintendo.nitro.rom":{"source":"iana"},"application/vnd.nintendo.snes.rom":{"source":"iana"},"application/vnd.nitf":{"source":"iana","extensions":["ntf","nitf"]},"application/vnd.noblenet-directory":{"source":"iana","extensions":["nnd"]},"application/vnd.noblenet-sealer":{"source":"iana","extensions":["nns"]},"application/vnd.noblenet-web":{"source":"iana","extensions":["nnw"]},"application/vnd.nokia.catalogs":{"source":"iana"},"application/vnd.nokia.conml+wbxml":{"source":"iana"},"application/vnd.nokia.conml+xml":{"source":"iana","compressible":true},"application/vnd.nokia.iptv.config+xml":{"source":"iana","compressible":true},"application/vnd.nokia.isds-radio-presets":{"source":"iana"},"application/vnd.nokia.landmark+wbxml":{"source":"iana"},"application/vnd.nokia.landmark+xml":{"source":"iana","compressible":true},"application/vnd.nokia.landmarkcollection+xml":{"source":"iana","compressible":true},"application/vnd.nokia.n-gage.ac+xml":{"source":"iana","compressible":true,"extensions":["ac"]},"application/vnd.nokia.n-gage.data":{"source":"iana","extensions":["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{"source":"apache","extensions":["n-gage"]},"application/vnd.nokia.ncd":{"source":"iana"},"application/vnd.nokia.pcd+wbxml":{"source":"iana"},"application/vnd.nokia.pcd+xml":{"source":"iana","compressible":true},"application/vnd.nokia.radio-preset":{"source":"iana","extensions":["rpst"]},"application/vnd.nokia.radio-presets":{"source":"iana","extensions":["rpss"]},"application/vnd.novadigm.edm":{"source":"iana","extensions":["edm"]},"application/vnd.novadigm.edx":{"source":"iana","extensions":["edx"]},"application/vnd.novadigm.ext":{"source":"iana","extensions":["ext"]},"application/vnd.ntt-local.content-share":{"source":"iana"},"application/vnd.ntt-local.file-transfer":{"source":"iana"},"application/vnd.ntt-local.ogw_remote-access":{"source":"iana"},"application/vnd.ntt-local.sip-ta_remote":{"source":"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{"source":"iana"},"application/vnd.oai.workflows":{"source":"iana"},"application/vnd.oai.workflows+json":{"source":"iana","compressible":true},"application/vnd.oai.workflows+yaml":{"source":"iana"},"application/vnd.oasis.opendocument.base":{"source":"iana"},"application/vnd.oasis.opendocument.chart":{"source":"iana","extensions":["odc"]},"application/vnd.oasis.opendocument.chart-template":{"source":"iana","extensions":["otc"]},"application/vnd.oasis.opendocument.database":{"source":"apache","extensions":["odb"]},"application/vnd.oasis.opendocument.formula":{"source":"iana","extensions":["odf"]},"application/vnd.oasis.opendocument.formula-template":{"source":"iana","extensions":["odft"]},"application/vnd.oasis.opendocument.graphics":{"source":"iana","compressible":false,"extensions":["odg"]},"application/vnd.oasis.opendocument.graphics-template":{"source":"iana","extensions":["otg"]},"application/vnd.oasis.opendocument.image":{"source":"iana","extensions":["odi"]},"application/vnd.oasis.opendocument.image-template":{"source":"iana","extensions":["oti"]},"application/vnd.oasis.opendocument.presentation":{"source":"iana","compressible":false,"extensions":["odp"]},"application/vnd.oasis.opendocument.presentation-template":{"source":"iana","extensions":["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{"source":"iana","compressible":false,"extensions":["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{"source":"iana","extensions":["ots"]},"application/vnd.oasis.opendocument.text":{"source":"iana","compressible":false,"extensions":["odt"]},"application/vnd.oasis.opendocument.text-master":{"source":"iana","extensions":["odm"]},"application/vnd.oasis.opendocument.text-master-template":{"source":"iana"},"application/vnd.oasis.opendocument.text-template":{"source":"iana","extensions":["ott"]},"application/vnd.oasis.opendocument.text-web":{"source":"iana","extensions":["oth"]},"application/vnd.obn":{"source":"iana"},"application/vnd.ocf+cbor":{"source":"iana"},"application/vnd.oci.image.manifest.v1+json":{"source":"iana","compressible":true},"application/vnd.oftn.l10n+json":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessdownload+xml":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessstreaming+xml":{"source":"iana","compressible":true},"application/vnd.oipf.cspg-hexbinary":{"source":"iana"},"application/vnd.oipf.dae.svg+xml":{"source":"iana","compressible":true},"application/vnd.oipf.dae.xhtml+xml":{"source":"iana","compressible":true},"application/vnd.oipf.mippvcontrolmessage+xml":{"source":"iana","compressible":true},"application/vnd.oipf.pae.gem":{"source":"iana"},"application/vnd.oipf.spdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.oipf.spdlist+xml":{"source":"iana","compressible":true},"application/vnd.oipf.ueprofile+xml":{"source":"iana","compressible":true},"application/vnd.oipf.userprofile+xml":{"source":"iana","compressible":true},"application/vnd.olpc-sugar":{"source":"iana","extensions":["xo"]},"application/vnd.oma-scws-config":{"source":"iana"},"application/vnd.oma-scws-http-request":{"source":"iana"},"application/vnd.oma-scws-http-response":{"source":"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.drm-trigger+xml":{"source":"apache","compressible":true},"application/vnd.oma.bcast.imd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.ltkm":{"source":"iana"},"application/vnd.oma.bcast.notification+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.provisioningtrigger":{"source":"iana"},"application/vnd.oma.bcast.sgboot":{"source":"iana"},"application/vnd.oma.bcast.sgdd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sgdu":{"source":"iana"},"application/vnd.oma.bcast.simple-symbol-container":{"source":"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{"source":"apache","compressible":true},"application/vnd.oma.bcast.sprov+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.stkm":{"source":"iana"},"application/vnd.oma.cab-address-book+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-feature-handler+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-pcc+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-subs-invite+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-user-prefs+xml":{"source":"iana","compressible":true},"application/vnd.oma.dcd":{"source":"iana"},"application/vnd.oma.dcdc":{"source":"iana"},"application/vnd.oma.dd2+xml":{"source":"iana","compressible":true,"extensions":["dd2"]},"application/vnd.oma.drm.risd+xml":{"source":"iana","compressible":true},"application/vnd.oma.group-usage-list+xml":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+cbor":{"source":"iana"},"application/vnd.oma.lwm2m+json":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+tlv":{"source":"iana"},"application/vnd.oma.pal+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.detailed-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.final-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.groups+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.invocation-descriptor+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.optimized-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.push":{"source":"iana"},"application/vnd.oma.scidm.messages+xml":{"source":"iana","compressible":true},"application/vnd.oma.xcap-directory+xml":{"source":"iana","compressible":true},"application/vnd.omads-email+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-file+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-folder+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omaloc-supl-init":{"source":"iana"},"application/vnd.onepager":{"source":"iana"},"application/vnd.onepagertamp":{"source":"iana"},"application/vnd.onepagertamx":{"source":"iana"},"application/vnd.onepagertat":{"source":"iana"},"application/vnd.onepagertatp":{"source":"iana"},"application/vnd.onepagertatx":{"source":"iana"},"application/vnd.onvif.metadata":{"source":"iana"},"application/vnd.openblox.game+xml":{"source":"iana","compressible":true,"extensions":["obgx"]},"application/vnd.openblox.game-binary":{"source":"iana"},"application/vnd.openeye.oeb":{"source":"iana"},"application/vnd.openofficeorg.extension":{"source":"apache","extensions":["oxt"]},"application/vnd.openstreetmap.data+xml":{"source":"iana","compressible":true,"extensions":["osm"]},"application/vnd.opentimestamps.ots":{"source":"iana"},"application/vnd.openvpi.dspx+json":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawing+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{"source":"iana","compressible":false,"extensions":["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slide":{"source":"iana","extensions":["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{"source":"iana","extensions":["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.template":{"source":"iana","extensions":["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"source":"iana","compressible":false,"extensions":["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{"source":"iana","extensions":["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.theme+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.vmldrawing":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{"source":"iana","compressible":false,"extensions":["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{"source":"iana","extensions":["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.core-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.relationships+xml":{"source":"iana","compressible":true},"application/vnd.oracle.resource+json":{"source":"iana","compressible":true},"application/vnd.orange.indata":{"source":"iana"},"application/vnd.osa.netdeploy":{"source":"iana"},"application/vnd.osgeo.mapguide.package":{"source":"iana","extensions":["mgp"]},"application/vnd.osgi.bundle":{"source":"iana"},"application/vnd.osgi.dp":{"source":"iana","extensions":["dp"]},"application/vnd.osgi.subsystem":{"source":"iana","extensions":["esa"]},"application/vnd.otps.ct-kip+xml":{"source":"iana","compressible":true},"application/vnd.oxli.countgraph":{"source":"iana"},"application/vnd.pagerduty+json":{"source":"iana","compressible":true},"application/vnd.palm":{"source":"iana","extensions":["pdb","pqa","oprc"]},"application/vnd.panoply":{"source":"iana"},"application/vnd.paos.xml":{"source":"iana"},"application/vnd.patentdive":{"source":"iana"},"application/vnd.patientecommsdoc":{"source":"iana"},"application/vnd.pawaafile":{"source":"iana","extensions":["paw"]},"application/vnd.pcos":{"source":"iana"},"application/vnd.pg.format":{"source":"iana","extensions":["str"]},"application/vnd.pg.osasli":{"source":"iana","extensions":["ei6"]},"application/vnd.piaccess.application-licence":{"source":"iana"},"application/vnd.picsel":{"source":"iana","extensions":["efif"]},"application/vnd.pmi.widget":{"source":"iana","extensions":["wg"]},"application/vnd.poc.group-advertisement+xml":{"source":"iana","compressible":true},"application/vnd.pocketlearn":{"source":"iana","extensions":["plf"]},"application/vnd.powerbuilder6":{"source":"iana","extensions":["pbd"]},"application/vnd.powerbuilder6-s":{"source":"iana"},"application/vnd.powerbuilder7":{"source":"iana"},"application/vnd.powerbuilder7-s":{"source":"iana"},"application/vnd.powerbuilder75":{"source":"iana"},"application/vnd.powerbuilder75-s":{"source":"iana"},"application/vnd.preminet":{"source":"iana"},"application/vnd.previewsystems.box":{"source":"iana","extensions":["box"]},"application/vnd.procrate.brushset":{"extensions":["brushset"]},"application/vnd.procreate.brush":{"extensions":["brush"]},"application/vnd.procreate.dream":{"extensions":["drm"]},"application/vnd.proteus.magazine":{"source":"iana","extensions":["mgz"]},"application/vnd.psfs":{"source":"iana"},"application/vnd.pt.mundusmundi":{"source":"iana"},"application/vnd.publishare-delta-tree":{"source":"iana","extensions":["qps"]},"application/vnd.pvi.ptid1":{"source":"iana","extensions":["ptid"]},"application/vnd.pwg-multiplexed":{"source":"iana"},"application/vnd.pwg-xhtml-print+xml":{"source":"iana","compressible":true,"extensions":["xhtm"]},"application/vnd.qualcomm.brew-app-res":{"source":"iana"},"application/vnd.quarantainenet":{"source":"iana"},"application/vnd.quark.quarkxpress":{"source":"iana","extensions":["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{"source":"iana"},"application/vnd.radisys.moml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conn+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-stream+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-base+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-detect+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-group+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-speech+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-transform+xml":{"source":"iana","compressible":true},"application/vnd.rainstor.data":{"source":"iana"},"application/vnd.rapid":{"source":"iana"},"application/vnd.rar":{"source":"iana","extensions":["rar"]},"application/vnd.realvnc.bed":{"source":"iana","extensions":["bed"]},"application/vnd.recordare.musicxml":{"source":"iana","extensions":["mxl"]},"application/vnd.recordare.musicxml+xml":{"source":"iana","compressible":true,"extensions":["musicxml"]},"application/vnd.relpipe":{"source":"iana"},"application/vnd.renlearn.rlprint":{"source":"iana"},"application/vnd.resilient.logic":{"source":"iana"},"application/vnd.restful+json":{"source":"iana","compressible":true},"application/vnd.rig.cryptonote":{"source":"iana","extensions":["cryptonote"]},"application/vnd.rim.cod":{"source":"apache","extensions":["cod"]},"application/vnd.rn-realmedia":{"source":"apache","extensions":["rm"]},"application/vnd.rn-realmedia-vbr":{"source":"apache","extensions":["rmvb"]},"application/vnd.route66.link66+xml":{"source":"iana","compressible":true,"extensions":["link66"]},"application/vnd.rs-274x":{"source":"iana"},"application/vnd.ruckus.download":{"source":"iana"},"application/vnd.s3sms":{"source":"iana"},"application/vnd.sailingtracker.track":{"source":"iana","extensions":["st"]},"application/vnd.sar":{"source":"iana"},"application/vnd.sbm.cid":{"source":"iana"},"application/vnd.sbm.mid2":{"source":"iana"},"application/vnd.scribus":{"source":"iana"},"application/vnd.sealed.3df":{"source":"iana"},"application/vnd.sealed.csf":{"source":"iana"},"application/vnd.sealed.doc":{"source":"iana"},"application/vnd.sealed.eml":{"source":"iana"},"application/vnd.sealed.mht":{"source":"iana"},"application/vnd.sealed.net":{"source":"iana"},"application/vnd.sealed.ppt":{"source":"iana"},"application/vnd.sealed.tiff":{"source":"iana"},"application/vnd.sealed.xls":{"source":"iana"},"application/vnd.sealedmedia.softseal.html":{"source":"iana"},"application/vnd.sealedmedia.softseal.pdf":{"source":"iana"},"application/vnd.seemail":{"source":"iana","extensions":["see"]},"application/vnd.seis+json":{"source":"iana","compressible":true},"application/vnd.sema":{"source":"iana","extensions":["sema"]},"application/vnd.semd":{"source":"iana","extensions":["semd"]},"application/vnd.semf":{"source":"iana","extensions":["semf"]},"application/vnd.shade-save-file":{"source":"iana"},"application/vnd.shana.informed.formdata":{"source":"iana","extensions":["ifm"]},"application/vnd.shana.informed.formtemplate":{"source":"iana","extensions":["itp"]},"application/vnd.shana.informed.interchange":{"source":"iana","extensions":["iif"]},"application/vnd.shana.informed.package":{"source":"iana","extensions":["ipk"]},"application/vnd.shootproof+json":{"source":"iana","compressible":true},"application/vnd.shopkick+json":{"source":"iana","compressible":true},"application/vnd.shp":{"source":"iana"},"application/vnd.shx":{"source":"iana"},"application/vnd.sigrok.session":{"source":"iana"},"application/vnd.simtech-mindmapper":{"source":"iana","extensions":["twd","twds"]},"application/vnd.siren+json":{"source":"iana","compressible":true},"application/vnd.sketchometry":{"source":"iana"},"application/vnd.smaf":{"source":"iana","extensions":["mmf"]},"application/vnd.smart.notebook":{"source":"iana"},"application/vnd.smart.teacher":{"source":"iana","extensions":["teacher"]},"application/vnd.smintio.portals.archive":{"source":"iana"},"application/vnd.snesdev-page-table":{"source":"iana"},"application/vnd.software602.filler.form+xml":{"source":"iana","compressible":true,"extensions":["fo"]},"application/vnd.software602.filler.form-xml-zip":{"source":"iana"},"application/vnd.solent.sdkm+xml":{"source":"iana","compressible":true,"extensions":["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{"source":"iana","extensions":["dxp"]},"application/vnd.spotfire.sfs":{"source":"iana","extensions":["sfs"]},"application/vnd.sqlite3":{"source":"iana"},"application/vnd.sss-cod":{"source":"iana"},"application/vnd.sss-dtf":{"source":"iana"},"application/vnd.sss-ntf":{"source":"iana"},"application/vnd.stardivision.calc":{"source":"apache","extensions":["sdc"]},"application/vnd.stardivision.draw":{"source":"apache","extensions":["sda"]},"application/vnd.stardivision.impress":{"source":"apache","extensions":["sdd"]},"application/vnd.stardivision.math":{"source":"apache","extensions":["smf"]},"application/vnd.stardivision.writer":{"source":"apache","extensions":["sdw","vor"]},"application/vnd.stardivision.writer-global":{"source":"apache","extensions":["sgl"]},"application/vnd.stepmania.package":{"source":"iana","extensions":["smzip"]},"application/vnd.stepmania.stepchart":{"source":"iana","extensions":["sm"]},"application/vnd.street-stream":{"source":"iana"},"application/vnd.sun.wadl+xml":{"source":"iana","compressible":true,"extensions":["wadl"]},"application/vnd.sun.xml.calc":{"source":"apache","extensions":["sxc"]},"application/vnd.sun.xml.calc.template":{"source":"apache","extensions":["stc"]},"application/vnd.sun.xml.draw":{"source":"apache","extensions":["sxd"]},"application/vnd.sun.xml.draw.template":{"source":"apache","extensions":["std"]},"application/vnd.sun.xml.impress":{"source":"apache","extensions":["sxi"]},"application/vnd.sun.xml.impress.template":{"source":"apache","extensions":["sti"]},"application/vnd.sun.xml.math":{"source":"apache","extensions":["sxm"]},"application/vnd.sun.xml.writer":{"source":"apache","extensions":["sxw"]},"application/vnd.sun.xml.writer.global":{"source":"apache","extensions":["sxg"]},"application/vnd.sun.xml.writer.template":{"source":"apache","extensions":["stw"]},"application/vnd.sus-calendar":{"source":"iana","extensions":["sus","susp"]},"application/vnd.svd":{"source":"iana","extensions":["svd"]},"application/vnd.swiftview-ics":{"source":"iana"},"application/vnd.sybyl.mol2":{"source":"iana"},"application/vnd.sycle+xml":{"source":"iana","compressible":true},"application/vnd.syft+json":{"source":"iana","compressible":true},"application/vnd.symbian.install":{"source":"apache","extensions":["sis","sisx"]},"application/vnd.syncml+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xsm"]},"application/vnd.syncml.dm+wbxml":{"source":"iana","charset":"UTF-8","extensions":["bdm"]},"application/vnd.syncml.dm+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xdm"]},"application/vnd.syncml.dm.notification":{"source":"iana"},"application/vnd.syncml.dmddf+wbxml":{"source":"iana"},"application/vnd.syncml.dmddf+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{"source":"iana"},"application/vnd.syncml.dmtnds+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.syncml.ds.notification":{"source":"iana"},"application/vnd.tableschema+json":{"source":"iana","compressible":true},"application/vnd.tao.intent-module-archive":{"source":"iana","extensions":["tao"]},"application/vnd.tcpdump.pcap":{"source":"iana","extensions":["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{"source":"iana","compressible":true},"application/vnd.tmd.mediaflex.api+xml":{"source":"iana","compressible":true},"application/vnd.tml":{"source":"iana"},"application/vnd.tmobile-livetv":{"source":"iana","extensions":["tmo"]},"application/vnd.tri.onesource":{"source":"iana"},"application/vnd.trid.tpt":{"source":"iana","extensions":["tpt"]},"application/vnd.triscape.mxs":{"source":"iana","extensions":["mxs"]},"application/vnd.trueapp":{"source":"iana","extensions":["tra"]},"application/vnd.truedoc":{"source":"iana"},"application/vnd.ubisoft.webplayer":{"source":"iana"},"application/vnd.ufdl":{"source":"iana","extensions":["ufd","ufdl"]},"application/vnd.uic.osdm+json":{"source":"iana","compressible":true},"application/vnd.uiq.theme":{"source":"iana","extensions":["utz"]},"application/vnd.umajin":{"source":"iana","extensions":["umj"]},"application/vnd.unity":{"source":"iana","extensions":["unityweb"]},"application/vnd.uoml+xml":{"source":"iana","compressible":true,"extensions":["uoml","uo"]},"application/vnd.uplanet.alert":{"source":"iana"},"application/vnd.uplanet.alert-wbxml":{"source":"iana"},"application/vnd.uplanet.bearer-choice":{"source":"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{"source":"iana"},"application/vnd.uplanet.cacheop":{"source":"iana"},"application/vnd.uplanet.cacheop-wbxml":{"source":"iana"},"application/vnd.uplanet.channel":{"source":"iana"},"application/vnd.uplanet.channel-wbxml":{"source":"iana"},"application/vnd.uplanet.list":{"source":"iana"},"application/vnd.uplanet.list-wbxml":{"source":"iana"},"application/vnd.uplanet.listcmd":{"source":"iana"},"application/vnd.uplanet.listcmd-wbxml":{"source":"iana"},"application/vnd.uplanet.signal":{"source":"iana"},"application/vnd.uri-map":{"source":"iana"},"application/vnd.valve.source.material":{"source":"iana"},"application/vnd.vcx":{"source":"iana","extensions":["vcx"]},"application/vnd.vd-study":{"source":"iana"},"application/vnd.vectorworks":{"source":"iana"},"application/vnd.vel+json":{"source":"iana","compressible":true},"application/vnd.veraison.tsm-report+cbor":{"source":"iana"},"application/vnd.veraison.tsm-report+json":{"source":"iana","compressible":true},"application/vnd.verimatrix.vcas":{"source":"iana"},"application/vnd.veritone.aion+json":{"source":"iana","compressible":true},"application/vnd.veryant.thin":{"source":"iana"},"application/vnd.ves.encrypted":{"source":"iana"},"application/vnd.vidsoft.vidconference":{"source":"iana"},"application/vnd.visio":{"source":"iana","extensions":["vsd","vst","vss","vsw","vsdx","vtx"]},"application/vnd.visionary":{"source":"iana","extensions":["vis"]},"application/vnd.vividence.scriptfile":{"source":"iana"},"application/vnd.vocalshaper.vsp4":{"source":"iana"},"application/vnd.vsf":{"source":"iana","extensions":["vsf"]},"application/vnd.wap.sic":{"source":"iana"},"application/vnd.wap.slc":{"source":"iana"},"application/vnd.wap.wbxml":{"source":"iana","charset":"UTF-8","extensions":["wbxml"]},"application/vnd.wap.wmlc":{"source":"iana","extensions":["wmlc"]},"application/vnd.wap.wmlscriptc":{"source":"iana","extensions":["wmlsc"]},"application/vnd.wasmflow.wafl":{"source":"iana"},"application/vnd.webturbo":{"source":"iana","extensions":["wtb"]},"application/vnd.wfa.dpp":{"source":"iana"},"application/vnd.wfa.p2p":{"source":"iana"},"application/vnd.wfa.wsc":{"source":"iana"},"application/vnd.windows.devicepairing":{"source":"iana"},"application/vnd.wmc":{"source":"iana"},"application/vnd.wmf.bootstrap":{"source":"iana"},"application/vnd.wolfram.mathematica":{"source":"iana"},"application/vnd.wolfram.mathematica.package":{"source":"iana"},"application/vnd.wolfram.player":{"source":"iana","extensions":["nbp"]},"application/vnd.wordlift":{"source":"iana"},"application/vnd.wordperfect":{"source":"iana","extensions":["wpd"]},"application/vnd.wqd":{"source":"iana","extensions":["wqd"]},"application/vnd.wrq-hp3000-labelled":{"source":"iana"},"application/vnd.wt.stf":{"source":"iana","extensions":["stf"]},"application/vnd.wv.csp+wbxml":{"source":"iana"},"application/vnd.wv.csp+xml":{"source":"iana","compressible":true},"application/vnd.wv.ssp+xml":{"source":"iana","compressible":true},"application/vnd.xacml+json":{"source":"iana","compressible":true},"application/vnd.xara":{"source":"iana","extensions":["xar"]},"application/vnd.xarin.cpj":{"source":"iana"},"application/vnd.xecrets-encrypted":{"source":"iana"},"application/vnd.xfdl":{"source":"iana","extensions":["xfdl"]},"application/vnd.xfdl.webform":{"source":"iana"},"application/vnd.xmi+xml":{"source":"iana","compressible":true},"application/vnd.xmpie.cpkg":{"source":"iana"},"application/vnd.xmpie.dpkg":{"source":"iana"},"application/vnd.xmpie.plan":{"source":"iana"},"application/vnd.xmpie.ppkg":{"source":"iana"},"application/vnd.xmpie.xlim":{"source":"iana"},"application/vnd.yamaha.hv-dic":{"source":"iana","extensions":["hvd"]},"application/vnd.yamaha.hv-script":{"source":"iana","extensions":["hvs"]},"application/vnd.yamaha.hv-voice":{"source":"iana","extensions":["hvp"]},"application/vnd.yamaha.openscoreformat":{"source":"iana","extensions":["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{"source":"iana","compressible":true,"extensions":["osfpvg"]},"application/vnd.yamaha.remote-setup":{"source":"iana"},"application/vnd.yamaha.smaf-audio":{"source":"iana","extensions":["saf"]},"application/vnd.yamaha.smaf-phrase":{"source":"iana","extensions":["spf"]},"application/vnd.yamaha.through-ngn":{"source":"iana"},"application/vnd.yamaha.tunnel-udpencap":{"source":"iana"},"application/vnd.yaoweme":{"source":"iana"},"application/vnd.yellowriver-custom-menu":{"source":"iana","extensions":["cmp"]},"application/vnd.zul":{"source":"iana","extensions":["zir","zirz"]},"application/vnd.zzazz.deck+xml":{"source":"iana","compressible":true,"extensions":["zaz"]},"application/voicexml+xml":{"source":"iana","compressible":true,"extensions":["vxml"]},"application/voucher-cms+json":{"source":"iana","compressible":true},"application/voucher-jws+json":{"source":"iana","compressible":true},"application/vp":{"source":"iana"},"application/vp+cose":{"source":"iana"},"application/vp+jwt":{"source":"iana"},"application/vq-rtcpxr":{"source":"iana"},"application/wasm":{"source":"iana","compressible":true,"extensions":["wasm"]},"application/watcherinfo+xml":{"source":"iana","compressible":true,"extensions":["wif"]},"application/webpush-options+json":{"source":"iana","compressible":true},"application/whoispp-query":{"source":"iana"},"application/whoispp-response":{"source":"iana"},"application/widget":{"source":"iana","extensions":["wgt"]},"application/winhlp":{"source":"apache","extensions":["hlp"]},"application/wita":{"source":"iana"},"application/wordperfect5.1":{"source":"iana"},"application/wsdl+xml":{"source":"iana","compressible":true,"extensions":["wsdl"]},"application/wspolicy+xml":{"source":"iana","compressible":true,"extensions":["wspolicy"]},"application/x-7z-compressed":{"source":"apache","compressible":false,"extensions":["7z"]},"application/x-abiword":{"source":"apache","extensions":["abw"]},"application/x-ace-compressed":{"source":"apache","extensions":["ace"]},"application/x-amf":{"source":"apache"},"application/x-apple-diskimage":{"source":"apache","extensions":["dmg"]},"application/x-arj":{"compressible":false,"extensions":["arj"]},"application/x-authorware-bin":{"source":"apache","extensions":["aab","x32","u32","vox"]},"application/x-authorware-map":{"source":"apache","extensions":["aam"]},"application/x-authorware-seg":{"source":"apache","extensions":["aas"]},"application/x-bcpio":{"source":"apache","extensions":["bcpio"]},"application/x-bdoc":{"compressible":false,"extensions":["bdoc"]},"application/x-bittorrent":{"source":"apache","extensions":["torrent"]},"application/x-blender":{"extensions":["blend"]},"application/x-blorb":{"source":"apache","extensions":["blb","blorb"]},"application/x-bzip":{"source":"apache","compressible":false,"extensions":["bz"]},"application/x-bzip2":{"source":"apache","compressible":false,"extensions":["bz2","boz"]},"application/x-cbr":{"source":"apache","extensions":["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{"source":"apache","extensions":["vcd"]},"application/x-cfs-compressed":{"source":"apache","extensions":["cfs"]},"application/x-chat":{"source":"apache","extensions":["chat"]},"application/x-chess-pgn":{"source":"apache","extensions":["pgn"]},"application/x-chrome-extension":{"extensions":["crx"]},"application/x-cocoa":{"source":"nginx","extensions":["cco"]},"application/x-compress":{"source":"apache"},"application/x-compressed":{"extensions":["rar"]},"application/x-conference":{"source":"apache","extensions":["nsc"]},"application/x-cpio":{"source":"apache","extensions":["cpio"]},"application/x-csh":{"source":"apache","extensions":["csh"]},"application/x-deb":{"compressible":false},"application/x-debian-package":{"source":"apache","extensions":["deb","udeb"]},"application/x-dgc-compressed":{"source":"apache","extensions":["dgc"]},"application/x-director":{"source":"apache","extensions":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{"source":"apache","extensions":["wad"]},"application/x-dtbncx+xml":{"source":"apache","compressible":true,"extensions":["ncx"]},"application/x-dtbook+xml":{"source":"apache","compressible":true,"extensions":["dtb"]},"application/x-dtbresource+xml":{"source":"apache","compressible":true,"extensions":["res"]},"application/x-dvi":{"source":"apache","compressible":false,"extensions":["dvi"]},"application/x-envoy":{"source":"apache","extensions":["evy"]},"application/x-eva":{"source":"apache","extensions":["eva"]},"application/x-font-bdf":{"source":"apache","extensions":["bdf"]},"application/x-font-dos":{"source":"apache"},"application/x-font-framemaker":{"source":"apache"},"application/x-font-ghostscript":{"source":"apache","extensions":["gsf"]},"application/x-font-libgrx":{"source":"apache"},"application/x-font-linux-psf":{"source":"apache","extensions":["psf"]},"application/x-font-pcf":{"source":"apache","extensions":["pcf"]},"application/x-font-snf":{"source":"apache","extensions":["snf"]},"application/x-font-speedo":{"source":"apache"},"application/x-font-sunos-news":{"source":"apache"},"application/x-font-type1":{"source":"apache","extensions":["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{"source":"apache"},"application/x-freearc":{"source":"apache","extensions":["arc"]},"application/x-futuresplash":{"source":"apache","extensions":["spl"]},"application/x-gca-compressed":{"source":"apache","extensions":["gca"]},"application/x-glulx":{"source":"apache","extensions":["ulx"]},"application/x-gnumeric":{"source":"apache","extensions":["gnumeric"]},"application/x-gramps-xml":{"source":"apache","extensions":["gramps"]},"application/x-gtar":{"source":"apache","extensions":["gtar"]},"application/x-gzip":{"source":"apache"},"application/x-hdf":{"source":"apache","extensions":["hdf"]},"application/x-httpd-php":{"compressible":true,"extensions":["php"]},"application/x-install-instructions":{"source":"apache","extensions":["install"]},"application/x-ipynb+json":{"compressible":true,"extensions":["ipynb"]},"application/x-iso9660-image":{"source":"apache","extensions":["iso"]},"application/x-iwork-keynote-sffkey":{"extensions":["key"]},"application/x-iwork-numbers-sffnumbers":{"extensions":["numbers"]},"application/x-iwork-pages-sffpages":{"extensions":["pages"]},"application/x-java-archive-diff":{"source":"nginx","extensions":["jardiff"]},"application/x-java-jnlp-file":{"source":"apache","compressible":false,"extensions":["jnlp"]},"application/x-javascript":{"compressible":true},"application/x-keepass2":{"extensions":["kdbx"]},"application/x-latex":{"source":"apache","compressible":false,"extensions":["latex"]},"application/x-lua-bytecode":{"extensions":["luac"]},"application/x-lzh-compressed":{"source":"apache","extensions":["lzh","lha"]},"application/x-makeself":{"source":"nginx","extensions":["run"]},"application/x-mie":{"source":"apache","extensions":["mie"]},"application/x-mobipocket-ebook":{"source":"apache","extensions":["prc","mobi"]},"application/x-mpegurl":{"compressible":false},"application/x-ms-application":{"source":"apache","extensions":["application"]},"application/x-ms-shortcut":{"source":"apache","extensions":["lnk"]},"application/x-ms-wmd":{"source":"apache","extensions":["wmd"]},"application/x-ms-wmz":{"source":"apache","extensions":["wmz"]},"application/x-ms-xbap":{"source":"apache","extensions":["xbap"]},"application/x-msaccess":{"source":"apache","extensions":["mdb"]},"application/x-msbinder":{"source":"apache","extensions":["obd"]},"application/x-mscardfile":{"source":"apache","extensions":["crd"]},"application/x-msclip":{"source":"apache","extensions":["clp"]},"application/x-msdos-program":{"extensions":["exe"]},"application/x-msdownload":{"source":"apache","extensions":["exe","dll","com","bat","msi"]},"application/x-msmediaview":{"source":"apache","extensions":["mvb","m13","m14"]},"application/x-msmetafile":{"source":"apache","extensions":["wmf","wmz","emf","emz"]},"application/x-msmoney":{"source":"apache","extensions":["mny"]},"application/x-mspublisher":{"source":"apache","extensions":["pub"]},"application/x-msschedule":{"source":"apache","extensions":["scd"]},"application/x-msterminal":{"source":"apache","extensions":["trm"]},"application/x-mswrite":{"source":"apache","extensions":["wri"]},"application/x-netcdf":{"source":"apache","extensions":["nc","cdf"]},"application/x-ns-proxy-autoconfig":{"compressible":true,"extensions":["pac"]},"application/x-nzb":{"source":"apache","extensions":["nzb"]},"application/x-perl":{"source":"nginx","extensions":["pl","pm"]},"application/x-pilot":{"source":"nginx","extensions":["prc","pdb"]},"application/x-pkcs12":{"source":"apache","compressible":false,"extensions":["p12","pfx"]},"application/x-pkcs7-certificates":{"source":"apache","extensions":["p7b","spc"]},"application/x-pkcs7-certreqresp":{"source":"apache","extensions":["p7r"]},"application/x-pki-message":{"source":"iana"},"application/x-rar-compressed":{"source":"apache","compressible":false,"extensions":["rar"]},"application/x-redhat-package-manager":{"source":"nginx","extensions":["rpm"]},"application/x-research-info-systems":{"source":"apache","extensions":["ris"]},"application/x-sea":{"source":"nginx","extensions":["sea"]},"application/x-sh":{"source":"apache","compressible":true,"extensions":["sh"]},"application/x-shar":{"source":"apache","extensions":["shar"]},"application/x-shockwave-flash":{"source":"apache","compressible":false,"extensions":["swf"]},"application/x-silverlight-app":{"source":"apache","extensions":["xap"]},"application/x-sql":{"source":"apache","extensions":["sql"]},"application/x-stuffit":{"source":"apache","compressible":false,"extensions":["sit"]},"application/x-stuffitx":{"source":"apache","extensions":["sitx"]},"application/x-subrip":{"source":"apache","extensions":["srt"]},"application/x-sv4cpio":{"source":"apache","extensions":["sv4cpio"]},"application/x-sv4crc":{"source":"apache","extensions":["sv4crc"]},"application/x-t3vm-image":{"source":"apache","extensions":["t3"]},"application/x-tads":{"source":"apache","extensions":["gam"]},"application/x-tar":{"source":"apache","compressible":true,"extensions":["tar"]},"application/x-tcl":{"source":"apache","extensions":["tcl","tk"]},"application/x-tex":{"source":"apache","extensions":["tex"]},"application/x-tex-tfm":{"source":"apache","extensions":["tfm"]},"application/x-texinfo":{"source":"apache","extensions":["texinfo","texi"]},"application/x-tgif":{"source":"apache","extensions":["obj"]},"application/x-ustar":{"source":"apache","extensions":["ustar"]},"application/x-virtualbox-hdd":{"compressible":true,"extensions":["hdd"]},"application/x-virtualbox-ova":{"compressible":true,"extensions":["ova"]},"application/x-virtualbox-ovf":{"compressible":true,"extensions":["ovf"]},"application/x-virtualbox-vbox":{"compressible":true,"extensions":["vbox"]},"application/x-virtualbox-vbox-extpack":{"compressible":false,"extensions":["vbox-extpack"]},"application/x-virtualbox-vdi":{"compressible":true,"extensions":["vdi"]},"application/x-virtualbox-vhd":{"compressible":true,"extensions":["vhd"]},"application/x-virtualbox-vmdk":{"compressible":true,"extensions":["vmdk"]},"application/x-wais-source":{"source":"apache","extensions":["src"]},"application/x-web-app-manifest+json":{"compressible":true,"extensions":["webapp"]},"application/x-www-form-urlencoded":{"source":"iana","compressible":true},"application/x-x509-ca-cert":{"source":"iana","extensions":["der","crt","pem"]},"application/x-x509-ca-ra-cert":{"source":"iana"},"application/x-x509-next-ca-cert":{"source":"iana"},"application/x-xfig":{"source":"apache","extensions":["fig"]},"application/x-xliff+xml":{"source":"apache","compressible":true,"extensions":["xlf"]},"application/x-xpinstall":{"source":"apache","compressible":false,"extensions":["xpi"]},"application/x-xz":{"source":"apache","extensions":["xz"]},"application/x-zip-compressed":{"extensions":["zip"]},"application/x-zmachine":{"source":"apache","extensions":["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{"source":"iana"},"application/xacml+xml":{"source":"iana","compressible":true},"application/xaml+xml":{"source":"apache","compressible":true,"extensions":["xaml"]},"application/xcap-att+xml":{"source":"iana","compressible":true,"extensions":["xav"]},"application/xcap-caps+xml":{"source":"iana","compressible":true,"extensions":["xca"]},"application/xcap-diff+xml":{"source":"iana","compressible":true,"extensions":["xdf"]},"application/xcap-el+xml":{"source":"iana","compressible":true,"extensions":["xel"]},"application/xcap-error+xml":{"source":"iana","compressible":true},"application/xcap-ns+xml":{"source":"iana","compressible":true,"extensions":["xns"]},"application/xcon-conference-info+xml":{"source":"iana","compressible":true},"application/xcon-conference-info-diff+xml":{"source":"iana","compressible":true},"application/xenc+xml":{"source":"iana","compressible":true,"extensions":["xenc"]},"application/xfdf":{"source":"iana","extensions":["xfdf"]},"application/xhtml+xml":{"source":"iana","compressible":true,"extensions":["xhtml","xht"]},"application/xhtml-voice+xml":{"source":"apache","compressible":true},"application/xliff+xml":{"source":"iana","compressible":true,"extensions":["xlf"]},"application/xml":{"source":"iana","compressible":true,"extensions":["xml","xsl","xsd","rng"]},"application/xml-dtd":{"source":"iana","compressible":true,"extensions":["dtd"]},"application/xml-external-parsed-entity":{"source":"iana"},"application/xml-patch+xml":{"source":"iana","compressible":true},"application/xmpp+xml":{"source":"iana","compressible":true},"application/xop+xml":{"source":"iana","compressible":true,"extensions":["xop"]},"application/xproc+xml":{"source":"apache","compressible":true,"extensions":["xpl"]},"application/xslt+xml":{"source":"iana","compressible":true,"extensions":["xsl","xslt"]},"application/xspf+xml":{"source":"apache","compressible":true,"extensions":["xspf"]},"application/xv+xml":{"source":"iana","compressible":true,"extensions":["mxml","xhvml","xvml","xvm"]},"application/yaml":{"source":"iana"},"application/yang":{"source":"iana","extensions":["yang"]},"application/yang-data+cbor":{"source":"iana"},"application/yang-data+json":{"source":"iana","compressible":true},"application/yang-data+xml":{"source":"iana","compressible":true},"application/yang-patch+json":{"source":"iana","compressible":true},"application/yang-patch+xml":{"source":"iana","compressible":true},"application/yang-sid+json":{"source":"iana","compressible":true},"application/yin+xml":{"source":"iana","compressible":true,"extensions":["yin"]},"application/zip":{"source":"iana","compressible":false,"extensions":["zip"]},"application/zip+dotlottie":{"extensions":["lottie"]},"application/zlib":{"source":"iana"},"application/zstd":{"source":"iana"},"audio/1d-interleaved-parityfec":{"source":"iana"},"audio/32kadpcm":{"source":"iana"},"audio/3gpp":{"source":"iana","compressible":false,"extensions":["3gpp"]},"audio/3gpp2":{"source":"iana"},"audio/aac":{"source":"iana","extensions":["adts","aac"]},"audio/ac3":{"source":"iana"},"audio/adpcm":{"source":"apache","extensions":["adp"]},"audio/amr":{"source":"iana","extensions":["amr"]},"audio/amr-wb":{"source":"iana"},"audio/amr-wb+":{"source":"iana"},"audio/aptx":{"source":"iana"},"audio/asc":{"source":"iana"},"audio/atrac-advanced-lossless":{"source":"iana"},"audio/atrac-x":{"source":"iana"},"audio/atrac3":{"source":"iana"},"audio/basic":{"source":"iana","compressible":false,"extensions":["au","snd"]},"audio/bv16":{"source":"iana"},"audio/bv32":{"source":"iana"},"audio/clearmode":{"source":"iana"},"audio/cn":{"source":"iana"},"audio/dat12":{"source":"iana"},"audio/dls":{"source":"iana"},"audio/dsr-es201108":{"source":"iana"},"audio/dsr-es202050":{"source":"iana"},"audio/dsr-es202211":{"source":"iana"},"audio/dsr-es202212":{"source":"iana"},"audio/dv":{"source":"iana"},"audio/dvi4":{"source":"iana"},"audio/eac3":{"source":"iana"},"audio/encaprtp":{"source":"iana"},"audio/evrc":{"source":"iana"},"audio/evrc-qcp":{"source":"iana"},"audio/evrc0":{"source":"iana"},"audio/evrc1":{"source":"iana"},"audio/evrcb":{"source":"iana"},"audio/evrcb0":{"source":"iana"},"audio/evrcb1":{"source":"iana"},"audio/evrcnw":{"source":"iana"},"audio/evrcnw0":{"source":"iana"},"audio/evrcnw1":{"source":"iana"},"audio/evrcwb":{"source":"iana"},"audio/evrcwb0":{"source":"iana"},"audio/evrcwb1":{"source":"iana"},"audio/evs":{"source":"iana"},"audio/flac":{"source":"iana"},"audio/flexfec":{"source":"iana"},"audio/fwdred":{"source":"iana"},"audio/g711-0":{"source":"iana"},"audio/g719":{"source":"iana"},"audio/g722":{"source":"iana"},"audio/g7221":{"source":"iana"},"audio/g723":{"source":"iana"},"audio/g726-16":{"source":"iana"},"audio/g726-24":{"source":"iana"},"audio/g726-32":{"source":"iana"},"audio/g726-40":{"source":"iana"},"audio/g728":{"source":"iana"},"audio/g729":{"source":"iana"},"audio/g7291":{"source":"iana"},"audio/g729d":{"source":"iana"},"audio/g729e":{"source":"iana"},"audio/gsm":{"source":"iana"},"audio/gsm-efr":{"source":"iana"},"audio/gsm-hr-08":{"source":"iana"},"audio/ilbc":{"source":"iana"},"audio/ip-mr_v2.5":{"source":"iana"},"audio/isac":{"source":"apache"},"audio/l16":{"source":"iana"},"audio/l20":{"source":"iana"},"audio/l24":{"source":"iana","compressible":false},"audio/l8":{"source":"iana"},"audio/lpc":{"source":"iana"},"audio/matroska":{"source":"iana"},"audio/melp":{"source":"iana"},"audio/melp1200":{"source":"iana"},"audio/melp2400":{"source":"iana"},"audio/melp600":{"source":"iana"},"audio/mhas":{"source":"iana"},"audio/midi":{"source":"apache","extensions":["mid","midi","kar","rmi"]},"audio/midi-clip":{"source":"iana"},"audio/mobile-xmf":{"source":"iana","extensions":["mxmf"]},"audio/mp3":{"compressible":false,"extensions":["mp3"]},"audio/mp4":{"source":"iana","compressible":false,"extensions":["m4a","mp4a","m4b"]},"audio/mp4a-latm":{"source":"iana"},"audio/mpa":{"source":"iana"},"audio/mpa-robust":{"source":"iana"},"audio/mpeg":{"source":"iana","compressible":false,"extensions":["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{"source":"iana"},"audio/musepack":{"source":"apache"},"audio/ogg":{"source":"iana","compressible":false,"extensions":["oga","ogg","spx","opus"]},"audio/opus":{"source":"iana"},"audio/parityfec":{"source":"iana"},"audio/pcma":{"source":"iana"},"audio/pcma-wb":{"source":"iana"},"audio/pcmu":{"source":"iana"},"audio/pcmu-wb":{"source":"iana"},"audio/prs.sid":{"source":"iana"},"audio/qcelp":{"source":"iana"},"audio/raptorfec":{"source":"iana"},"audio/red":{"source":"iana"},"audio/rtp-enc-aescm128":{"source":"iana"},"audio/rtp-midi":{"source":"iana"},"audio/rtploopback":{"source":"iana"},"audio/rtx":{"source":"iana"},"audio/s3m":{"source":"apache","extensions":["s3m"]},"audio/scip":{"source":"iana"},"audio/silk":{"source":"apache","extensions":["sil"]},"audio/smv":{"source":"iana"},"audio/smv-qcp":{"source":"iana"},"audio/smv0":{"source":"iana"},"audio/sofa":{"source":"iana"},"audio/sp-midi":{"source":"iana"},"audio/speex":{"source":"iana"},"audio/t140c":{"source":"iana"},"audio/t38":{"source":"iana"},"audio/telephone-event":{"source":"iana"},"audio/tetra_acelp":{"source":"iana"},"audio/tetra_acelp_bb":{"source":"iana"},"audio/tone":{"source":"iana"},"audio/tsvcis":{"source":"iana"},"audio/uemclip":{"source":"iana"},"audio/ulpfec":{"source":"iana"},"audio/usac":{"source":"iana"},"audio/vdvi":{"source":"iana"},"audio/vmr-wb":{"source":"iana"},"audio/vnd.3gpp.iufp":{"source":"iana"},"audio/vnd.4sb":{"source":"iana"},"audio/vnd.audiokoz":{"source":"iana"},"audio/vnd.celp":{"source":"iana"},"audio/vnd.cisco.nse":{"source":"iana"},"audio/vnd.cmles.radio-events":{"source":"iana"},"audio/vnd.cns.anp1":{"source":"iana"},"audio/vnd.cns.inf1":{"source":"iana"},"audio/vnd.dece.audio":{"source":"iana","extensions":["uva","uvva"]},"audio/vnd.digital-winds":{"source":"iana","extensions":["eol"]},"audio/vnd.dlna.adts":{"source":"iana"},"audio/vnd.dolby.heaac.1":{"source":"iana"},"audio/vnd.dolby.heaac.2":{"source":"iana"},"audio/vnd.dolby.mlp":{"source":"iana"},"audio/vnd.dolby.mps":{"source":"iana"},"audio/vnd.dolby.pl2":{"source":"iana"},"audio/vnd.dolby.pl2x":{"source":"iana"},"audio/vnd.dolby.pl2z":{"source":"iana"},"audio/vnd.dolby.pulse.1":{"source":"iana"},"audio/vnd.dra":{"source":"iana","extensions":["dra"]},"audio/vnd.dts":{"source":"iana","extensions":["dts"]},"audio/vnd.dts.hd":{"source":"iana","extensions":["dtshd"]},"audio/vnd.dts.uhd":{"source":"iana"},"audio/vnd.dvb.file":{"source":"iana"},"audio/vnd.everad.plj":{"source":"iana"},"audio/vnd.hns.audio":{"source":"iana"},"audio/vnd.lucent.voice":{"source":"iana","extensions":["lvp"]},"audio/vnd.ms-playready.media.pya":{"source":"iana","extensions":["pya"]},"audio/vnd.nokia.mobile-xmf":{"source":"iana"},"audio/vnd.nortel.vbk":{"source":"iana"},"audio/vnd.nuera.ecelp4800":{"source":"iana","extensions":["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{"source":"iana","extensions":["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{"source":"iana","extensions":["ecelp9600"]},"audio/vnd.octel.sbc":{"source":"iana"},"audio/vnd.presonus.multitrack":{"source":"iana"},"audio/vnd.qcelp":{"source":"apache"},"audio/vnd.rhetorex.32kadpcm":{"source":"iana"},"audio/vnd.rip":{"source":"iana","extensions":["rip"]},"audio/vnd.rn-realaudio":{"compressible":false},"audio/vnd.sealedmedia.softseal.mpeg":{"source":"iana"},"audio/vnd.vmx.cvsd":{"source":"iana"},"audio/vnd.wave":{"compressible":false},"audio/vorbis":{"source":"iana","compressible":false},"audio/vorbis-config":{"source":"iana"},"audio/wav":{"compressible":false,"extensions":["wav"]},"audio/wave":{"compressible":false,"extensions":["wav"]},"audio/webm":{"source":"apache","compressible":false,"extensions":["weba"]},"audio/x-aac":{"source":"apache","compressible":false,"extensions":["aac"]},"audio/x-aiff":{"source":"apache","extensions":["aif","aiff","aifc"]},"audio/x-caf":{"source":"apache","compressible":false,"extensions":["caf"]},"audio/x-flac":{"source":"apache","extensions":["flac"]},"audio/x-m4a":{"source":"nginx","extensions":["m4a"]},"audio/x-matroska":{"source":"apache","extensions":["mka"]},"audio/x-mpegurl":{"source":"apache","extensions":["m3u"]},"audio/x-ms-wax":{"source":"apache","extensions":["wax"]},"audio/x-ms-wma":{"source":"apache","extensions":["wma"]},"audio/x-pn-realaudio":{"source":"apache","extensions":["ram","ra"]},"audio/x-pn-realaudio-plugin":{"source":"apache","extensions":["rmp"]},"audio/x-realaudio":{"source":"nginx","extensions":["ra"]},"audio/x-tta":{"source":"apache"},"audio/x-wav":{"source":"apache","extensions":["wav"]},"audio/xm":{"source":"apache","extensions":["xm"]},"chemical/x-cdx":{"source":"apache","extensions":["cdx"]},"chemical/x-cif":{"source":"apache","extensions":["cif"]},"chemical/x-cmdf":{"source":"apache","extensions":["cmdf"]},"chemical/x-cml":{"source":"apache","extensions":["cml"]},"chemical/x-csml":{"source":"apache","extensions":["csml"]},"chemical/x-pdb":{"source":"apache"},"chemical/x-xyz":{"source":"apache","extensions":["xyz"]},"font/collection":{"source":"iana","extensions":["ttc"]},"font/otf":{"source":"iana","compressible":true,"extensions":["otf"]},"font/sfnt":{"source":"iana"},"font/ttf":{"source":"iana","compressible":true,"extensions":["ttf"]},"font/woff":{"source":"iana","extensions":["woff"]},"font/woff2":{"source":"iana","extensions":["woff2"]},"image/aces":{"source":"iana","extensions":["exr"]},"image/apng":{"source":"iana","compressible":false,"extensions":["apng"]},"image/avci":{"source":"iana","extensions":["avci"]},"image/avcs":{"source":"iana","extensions":["avcs"]},"image/avif":{"source":"iana","compressible":false,"extensions":["avif"]},"image/bmp":{"source":"iana","compressible":true,"extensions":["bmp","dib"]},"image/cgm":{"source":"iana","extensions":["cgm"]},"image/dicom-rle":{"source":"iana","extensions":["drle"]},"image/dpx":{"source":"iana","extensions":["dpx"]},"image/emf":{"source":"iana","extensions":["emf"]},"image/fits":{"source":"iana","extensions":["fits"]},"image/g3fax":{"source":"iana","extensions":["g3"]},"image/gif":{"source":"iana","compressible":false,"extensions":["gif"]},"image/heic":{"source":"iana","extensions":["heic"]},"image/heic-sequence":{"source":"iana","extensions":["heics"]},"image/heif":{"source":"iana","extensions":["heif"]},"image/heif-sequence":{"source":"iana","extensions":["heifs"]},"image/hej2k":{"source":"iana","extensions":["hej2"]},"image/ief":{"source":"iana","extensions":["ief"]},"image/j2c":{"source":"iana"},"image/jaii":{"source":"iana","extensions":["jaii"]},"image/jais":{"source":"iana","extensions":["jais"]},"image/jls":{"source":"iana","extensions":["jls"]},"image/jp2":{"source":"iana","compressible":false,"extensions":["jp2","jpg2"]},"image/jpeg":{"source":"iana","compressible":false,"extensions":["jpg","jpeg","jpe"]},"image/jph":{"source":"iana","extensions":["jph"]},"image/jphc":{"source":"iana","extensions":["jhc"]},"image/jpm":{"source":"iana","compressible":false,"extensions":["jpm","jpgm"]},"image/jpx":{"source":"iana","compressible":false,"extensions":["jpx","jpf"]},"image/jxl":{"source":"iana","extensions":["jxl"]},"image/jxr":{"source":"iana","extensions":["jxr"]},"image/jxra":{"source":"iana","extensions":["jxra"]},"image/jxrs":{"source":"iana","extensions":["jxrs"]},"image/jxs":{"source":"iana","extensions":["jxs"]},"image/jxsc":{"source":"iana","extensions":["jxsc"]},"image/jxsi":{"source":"iana","extensions":["jxsi"]},"image/jxss":{"source":"iana","extensions":["jxss"]},"image/ktx":{"source":"iana","extensions":["ktx"]},"image/ktx2":{"source":"iana","extensions":["ktx2"]},"image/naplps":{"source":"iana"},"image/pjpeg":{"compressible":false,"extensions":["jfif"]},"image/png":{"source":"iana","compressible":false,"extensions":["png"]},"image/prs.btif":{"source":"iana","extensions":["btif","btf"]},"image/prs.pti":{"source":"iana","extensions":["pti"]},"image/pwg-raster":{"source":"iana"},"image/sgi":{"source":"apache","extensions":["sgi"]},"image/svg+xml":{"source":"iana","compressible":true,"extensions":["svg","svgz"]},"image/t38":{"source":"iana","extensions":["t38"]},"image/tiff":{"source":"iana","compressible":false,"extensions":["tif","tiff"]},"image/tiff-fx":{"source":"iana","extensions":["tfx"]},"image/vnd.adobe.photoshop":{"source":"iana","compressible":true,"extensions":["psd"]},"image/vnd.airzip.accelerator.azv":{"source":"iana","extensions":["azv"]},"image/vnd.clip":{"source":"iana"},"image/vnd.cns.inf2":{"source":"iana"},"image/vnd.dece.graphic":{"source":"iana","extensions":["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{"source":"iana","extensions":["djvu","djv"]},"image/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"image/vnd.dwg":{"source":"iana","extensions":["dwg"]},"image/vnd.dxf":{"source":"iana","extensions":["dxf"]},"image/vnd.fastbidsheet":{"source":"iana","extensions":["fbs"]},"image/vnd.fpx":{"source":"iana","extensions":["fpx"]},"image/vnd.fst":{"source":"iana","extensions":["fst"]},"image/vnd.fujixerox.edmics-mmr":{"source":"iana","extensions":["mmr"]},"image/vnd.fujixerox.edmics-rlc":{"source":"iana","extensions":["rlc"]},"image/vnd.globalgraphics.pgb":{"source":"iana"},"image/vnd.microsoft.icon":{"source":"iana","compressible":true,"extensions":["ico"]},"image/vnd.mix":{"source":"iana"},"image/vnd.mozilla.apng":{"source":"iana"},"image/vnd.ms-dds":{"compressible":true,"extensions":["dds"]},"image/vnd.ms-modi":{"source":"iana","extensions":["mdi"]},"image/vnd.ms-photo":{"source":"apache","extensions":["wdp"]},"image/vnd.net-fpx":{"source":"iana","extensions":["npx"]},"image/vnd.pco.b16":{"source":"iana","extensions":["b16"]},"image/vnd.radiance":{"source":"iana"},"image/vnd.sealed.png":{"source":"iana"},"image/vnd.sealedmedia.softseal.gif":{"source":"iana"},"image/vnd.sealedmedia.softseal.jpg":{"source":"iana"},"image/vnd.svf":{"source":"iana"},"image/vnd.tencent.tap":{"source":"iana","extensions":["tap"]},"image/vnd.valve.source.texture":{"source":"iana","extensions":["vtf"]},"image/vnd.wap.wbmp":{"source":"iana","extensions":["wbmp"]},"image/vnd.xiff":{"source":"iana","extensions":["xif"]},"image/vnd.zbrush.pcx":{"source":"iana","extensions":["pcx"]},"image/webp":{"source":"iana","extensions":["webp"]},"image/wmf":{"source":"iana","extensions":["wmf"]},"image/x-3ds":{"source":"apache","extensions":["3ds"]},"image/x-adobe-dng":{"extensions":["dng"]},"image/x-cmu-raster":{"source":"apache","extensions":["ras"]},"image/x-cmx":{"source":"apache","extensions":["cmx"]},"image/x-emf":{"source":"iana"},"image/x-freehand":{"source":"apache","extensions":["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{"source":"apache","compressible":true,"extensions":["ico"]},"image/x-jng":{"source":"nginx","extensions":["jng"]},"image/x-mrsid-image":{"source":"apache","extensions":["sid"]},"image/x-ms-bmp":{"source":"nginx","compressible":true,"extensions":["bmp"]},"image/x-pcx":{"source":"apache","extensions":["pcx"]},"image/x-pict":{"source":"apache","extensions":["pic","pct"]},"image/x-portable-anymap":{"source":"apache","extensions":["pnm"]},"image/x-portable-bitmap":{"source":"apache","extensions":["pbm"]},"image/x-portable-graymap":{"source":"apache","extensions":["pgm"]},"image/x-portable-pixmap":{"source":"apache","extensions":["ppm"]},"image/x-rgb":{"source":"apache","extensions":["rgb"]},"image/x-tga":{"source":"apache","extensions":["tga"]},"image/x-wmf":{"source":"iana"},"image/x-xbitmap":{"source":"apache","extensions":["xbm"]},"image/x-xcf":{"compressible":false},"image/x-xpixmap":{"source":"apache","extensions":["xpm"]},"image/x-xwindowdump":{"source":"apache","extensions":["xwd"]},"message/bhttp":{"source":"iana"},"message/cpim":{"source":"iana"},"message/delivery-status":{"source":"iana"},"message/disposition-notification":{"source":"iana","extensions":["disposition-notification"]},"message/external-body":{"source":"iana"},"message/feedback-report":{"source":"iana"},"message/global":{"source":"iana","extensions":["u8msg"]},"message/global-delivery-status":{"source":"iana","extensions":["u8dsn"]},"message/global-disposition-notification":{"source":"iana","extensions":["u8mdn"]},"message/global-headers":{"source":"iana","extensions":["u8hdr"]},"message/http":{"source":"iana","compressible":false},"message/imdn+xml":{"source":"iana","compressible":true},"message/mls":{"source":"iana"},"message/news":{"source":"apache"},"message/ohttp-req":{"source":"iana"},"message/ohttp-res":{"source":"iana"},"message/partial":{"source":"iana","compressible":false},"message/rfc822":{"source":"iana","compressible":true,"extensions":["eml","mime","mht","mhtml"]},"message/s-http":{"source":"apache"},"message/sip":{"source":"iana"},"message/sipfrag":{"source":"iana"},"message/tracking-status":{"source":"iana"},"message/vnd.si.simp":{"source":"apache"},"message/vnd.wfa.wsc":{"source":"iana","extensions":["wsc"]},"model/3mf":{"source":"iana","extensions":["3mf"]},"model/e57":{"source":"iana"},"model/gltf+json":{"source":"iana","compressible":true,"extensions":["gltf"]},"model/gltf-binary":{"source":"iana","compressible":true,"extensions":["glb"]},"model/iges":{"source":"iana","compressible":false,"extensions":["igs","iges"]},"model/jt":{"source":"iana","extensions":["jt"]},"model/mesh":{"source":"iana","compressible":false,"extensions":["msh","mesh","silo"]},"model/mtl":{"source":"iana","extensions":["mtl"]},"model/obj":{"source":"iana","extensions":["obj"]},"model/prc":{"source":"iana","extensions":["prc"]},"model/step":{"source":"iana","extensions":["step","stp","stpnc","p21","210"]},"model/step+xml":{"source":"iana","compressible":true,"extensions":["stpx"]},"model/step+zip":{"source":"iana","compressible":false,"extensions":["stpz"]},"model/step-xml+zip":{"source":"iana","compressible":false,"extensions":["stpxz"]},"model/stl":{"source":"iana","extensions":["stl"]},"model/u3d":{"source":"iana","extensions":["u3d"]},"model/vnd.bary":{"source":"iana","extensions":["bary"]},"model/vnd.cld":{"source":"iana","extensions":["cld"]},"model/vnd.collada+xml":{"source":"iana","compressible":true,"extensions":["dae"]},"model/vnd.dwf":{"source":"iana","extensions":["dwf"]},"model/vnd.flatland.3dml":{"source":"iana"},"model/vnd.gdl":{"source":"iana","extensions":["gdl"]},"model/vnd.gs-gdl":{"source":"apache"},"model/vnd.gs.gdl":{"source":"iana"},"model/vnd.gtw":{"source":"iana","extensions":["gtw"]},"model/vnd.moml+xml":{"source":"iana","compressible":true},"model/vnd.mts":{"source":"iana","extensions":["mts"]},"model/vnd.opengex":{"source":"iana","extensions":["ogex"]},"model/vnd.parasolid.transmit.binary":{"source":"iana","extensions":["x_b"]},"model/vnd.parasolid.transmit.text":{"source":"iana","extensions":["x_t"]},"model/vnd.pytha.pyox":{"source":"iana","extensions":["pyo","pyox"]},"model/vnd.rosette.annotated-data-model":{"source":"iana"},"model/vnd.sap.vds":{"source":"iana","extensions":["vds"]},"model/vnd.usda":{"source":"iana","extensions":["usda"]},"model/vnd.usdz+zip":{"source":"iana","compressible":false,"extensions":["usdz"]},"model/vnd.valve.source.compiled-map":{"source":"iana","extensions":["bsp"]},"model/vnd.vtu":{"source":"iana","extensions":["vtu"]},"model/vrml":{"source":"iana","compressible":false,"extensions":["wrl","vrml"]},"model/x3d+binary":{"source":"apache","compressible":false,"extensions":["x3db","x3dbz"]},"model/x3d+fastinfoset":{"source":"iana","extensions":["x3db"]},"model/x3d+vrml":{"source":"apache","compressible":false,"extensions":["x3dv","x3dvz"]},"model/x3d+xml":{"source":"iana","compressible":true,"extensions":["x3d","x3dz"]},"model/x3d-vrml":{"source":"iana","extensions":["x3dv"]},"multipart/alternative":{"source":"iana","compressible":false},"multipart/appledouble":{"source":"iana"},"multipart/byteranges":{"source":"iana"},"multipart/digest":{"source":"iana"},"multipart/encrypted":{"source":"iana","compressible":false},"multipart/form-data":{"source":"iana","compressible":false},"multipart/header-set":{"source":"iana"},"multipart/mixed":{"source":"iana"},"multipart/multilingual":{"source":"iana"},"multipart/parallel":{"source":"iana"},"multipart/related":{"source":"iana","compressible":false},"multipart/report":{"source":"iana"},"multipart/signed":{"source":"iana","compressible":false},"multipart/vnd.bint.med-plus":{"source":"iana"},"multipart/voice-message":{"source":"iana"},"multipart/x-mixed-replace":{"source":"iana"},"text/1d-interleaved-parityfec":{"source":"iana"},"text/cache-manifest":{"source":"iana","compressible":true,"extensions":["appcache","manifest"]},"text/calendar":{"source":"iana","extensions":["ics","ifb"]},"text/calender":{"compressible":true},"text/cmd":{"compressible":true},"text/coffeescript":{"extensions":["coffee","litcoffee"]},"text/cql":{"source":"iana"},"text/cql-expression":{"source":"iana"},"text/cql-identifier":{"source":"iana"},"text/css":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["css"]},"text/csv":{"source":"iana","compressible":true,"extensions":["csv"]},"text/csv-schema":{"source":"iana"},"text/directory":{"source":"iana"},"text/dns":{"source":"iana"},"text/ecmascript":{"source":"apache"},"text/encaprtp":{"source":"iana"},"text/enriched":{"source":"iana"},"text/fhirpath":{"source":"iana"},"text/flexfec":{"source":"iana"},"text/fwdred":{"source":"iana"},"text/gff3":{"source":"iana"},"text/grammar-ref-list":{"source":"iana"},"text/hl7v2":{"source":"iana"},"text/html":{"source":"iana","compressible":true,"extensions":["html","htm","shtml"]},"text/jade":{"extensions":["jade"]},"text/javascript":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["js","mjs"]},"text/jcr-cnd":{"source":"iana"},"text/jsx":{"compressible":true,"extensions":["jsx"]},"text/less":{"compressible":true,"extensions":["less"]},"text/markdown":{"source":"iana","compressible":true,"extensions":["md","markdown"]},"text/mathml":{"source":"nginx","extensions":["mml"]},"text/mdx":{"compressible":true,"extensions":["mdx"]},"text/mizar":{"source":"iana"},"text/n3":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["n3"]},"text/parameters":{"source":"iana","charset":"UTF-8"},"text/parityfec":{"source":"iana"},"text/plain":{"source":"iana","compressible":true,"extensions":["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{"source":"iana","charset":"UTF-8"},"text/prs.fallenstein.rst":{"source":"iana"},"text/prs.lines.tag":{"source":"iana","extensions":["dsc"]},"text/prs.prop.logic":{"source":"iana"},"text/prs.texi":{"source":"iana"},"text/raptorfec":{"source":"iana"},"text/red":{"source":"iana"},"text/rfc822-headers":{"source":"iana"},"text/richtext":{"source":"iana","compressible":true,"extensions":["rtx"]},"text/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"text/rtp-enc-aescm128":{"source":"iana"},"text/rtploopback":{"source":"iana"},"text/rtx":{"source":"iana"},"text/sgml":{"source":"iana","extensions":["sgml","sgm"]},"text/shaclc":{"source":"iana"},"text/shex":{"source":"iana","extensions":["shex"]},"text/slim":{"extensions":["slim","slm"]},"text/spdx":{"source":"iana","extensions":["spdx"]},"text/strings":{"source":"iana"},"text/stylus":{"extensions":["stylus","styl"]},"text/t140":{"source":"iana"},"text/tab-separated-values":{"source":"iana","compressible":true,"extensions":["tsv"]},"text/troff":{"source":"iana","extensions":["t","tr","roff","man","me","ms"]},"text/turtle":{"source":"iana","charset":"UTF-8","extensions":["ttl"]},"text/ulpfec":{"source":"iana"},"text/uri-list":{"source":"iana","compressible":true,"extensions":["uri","uris","urls"]},"text/vcard":{"source":"iana","compressible":true,"extensions":["vcard"]},"text/vnd.a":{"source":"iana"},"text/vnd.abc":{"source":"iana"},"text/vnd.ascii-art":{"source":"iana"},"text/vnd.curl":{"source":"iana","extensions":["curl"]},"text/vnd.curl.dcurl":{"source":"apache","extensions":["dcurl"]},"text/vnd.curl.mcurl":{"source":"apache","extensions":["mcurl"]},"text/vnd.curl.scurl":{"source":"apache","extensions":["scurl"]},"text/vnd.debian.copyright":{"source":"iana","charset":"UTF-8"},"text/vnd.dmclientscript":{"source":"iana"},"text/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"text/vnd.esmertec.theme-descriptor":{"source":"iana","charset":"UTF-8"},"text/vnd.exchangeable":{"source":"iana"},"text/vnd.familysearch.gedcom":{"source":"iana","extensions":["ged"]},"text/vnd.ficlab.flt":{"source":"iana"},"text/vnd.fly":{"source":"iana","extensions":["fly"]},"text/vnd.fmi.flexstor":{"source":"iana","extensions":["flx"]},"text/vnd.gml":{"source":"iana"},"text/vnd.graphviz":{"source":"iana","extensions":["gv"]},"text/vnd.hans":{"source":"iana"},"text/vnd.hgl":{"source":"iana"},"text/vnd.in3d.3dml":{"source":"iana","extensions":["3dml"]},"text/vnd.in3d.spot":{"source":"iana","extensions":["spot"]},"text/vnd.iptc.newsml":{"source":"iana"},"text/vnd.iptc.nitf":{"source":"iana"},"text/vnd.latex-z":{"source":"iana"},"text/vnd.motorola.reflex":{"source":"iana"},"text/vnd.ms-mediapackage":{"source":"iana"},"text/vnd.net2phone.commcenter.command":{"source":"iana"},"text/vnd.radisys.msml-basic-layout":{"source":"iana"},"text/vnd.senx.warpscript":{"source":"iana"},"text/vnd.si.uricatalogue":{"source":"apache"},"text/vnd.sosi":{"source":"iana"},"text/vnd.sun.j2me.app-descriptor":{"source":"iana","charset":"UTF-8","extensions":["jad"]},"text/vnd.trolltech.linguist":{"source":"iana","charset":"UTF-8"},"text/vnd.vcf":{"source":"iana"},"text/vnd.wap.si":{"source":"iana"},"text/vnd.wap.sl":{"source":"iana"},"text/vnd.wap.wml":{"source":"iana","extensions":["wml"]},"text/vnd.wap.wmlscript":{"source":"iana","extensions":["wmls"]},"text/vnd.zoo.kcl":{"source":"iana"},"text/vtt":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["vtt"]},"text/wgsl":{"source":"iana","extensions":["wgsl"]},"text/x-asm":{"source":"apache","extensions":["s","asm"]},"text/x-c":{"source":"apache","extensions":["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{"source":"nginx","extensions":["htc"]},"text/x-fortran":{"source":"apache","extensions":["f","for","f77","f90"]},"text/x-gwt-rpc":{"compressible":true},"text/x-handlebars-template":{"extensions":["hbs"]},"text/x-java-source":{"source":"apache","extensions":["java"]},"text/x-jquery-tmpl":{"compressible":true},"text/x-lua":{"extensions":["lua"]},"text/x-markdown":{"compressible":true,"extensions":["mkd"]},"text/x-nfo":{"source":"apache","extensions":["nfo"]},"text/x-opml":{"source":"apache","extensions":["opml"]},"text/x-org":{"compressible":true,"extensions":["org"]},"text/x-pascal":{"source":"apache","extensions":["p","pas"]},"text/x-processing":{"compressible":true,"extensions":["pde"]},"text/x-sass":{"extensions":["sass"]},"text/x-scss":{"extensions":["scss"]},"text/x-setext":{"source":"apache","extensions":["etx"]},"text/x-sfv":{"source":"apache","extensions":["sfv"]},"text/x-suse-ymp":{"compressible":true,"extensions":["ymp"]},"text/x-uuencode":{"source":"apache","extensions":["uu"]},"text/x-vcalendar":{"source":"apache","extensions":["vcs"]},"text/x-vcard":{"source":"apache","extensions":["vcf"]},"text/xml":{"source":"iana","compressible":true,"extensions":["xml"]},"text/xml-external-parsed-entity":{"source":"iana"},"text/yaml":{"compressible":true,"extensions":["yaml","yml"]},"video/1d-interleaved-parityfec":{"source":"iana"},"video/3gpp":{"source":"iana","extensions":["3gp","3gpp"]},"video/3gpp-tt":{"source":"iana"},"video/3gpp2":{"source":"iana","extensions":["3g2"]},"video/av1":{"source":"iana"},"video/bmpeg":{"source":"iana"},"video/bt656":{"source":"iana"},"video/celb":{"source":"iana"},"video/dv":{"source":"iana"},"video/encaprtp":{"source":"iana"},"video/evc":{"source":"iana"},"video/ffv1":{"source":"iana"},"video/flexfec":{"source":"iana"},"video/h261":{"source":"iana","extensions":["h261"]},"video/h263":{"source":"iana","extensions":["h263"]},"video/h263-1998":{"source":"iana"},"video/h263-2000":{"source":"iana"},"video/h264":{"source":"iana","extensions":["h264"]},"video/h264-rcdo":{"source":"iana"},"video/h264-svc":{"source":"iana"},"video/h265":{"source":"iana"},"video/h266":{"source":"iana"},"video/iso.segment":{"source":"iana","extensions":["m4s"]},"video/jpeg":{"source":"iana","extensions":["jpgv"]},"video/jpeg2000":{"source":"iana"},"video/jpm":{"source":"apache","extensions":["jpm","jpgm"]},"video/jxsv":{"source":"iana"},"video/lottie+json":{"source":"iana","compressible":true},"video/matroska":{"source":"iana"},"video/matroska-3d":{"source":"iana"},"video/mj2":{"source":"iana","extensions":["mj2","mjp2"]},"video/mp1s":{"source":"iana"},"video/mp2p":{"source":"iana"},"video/mp2t":{"source":"iana","extensions":["ts","m2t","m2ts","mts"]},"video/mp4":{"source":"iana","compressible":false,"extensions":["mp4","mp4v","mpg4"]},"video/mp4v-es":{"source":"iana"},"video/mpeg":{"source":"iana","compressible":false,"extensions":["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{"source":"iana"},"video/mpv":{"source":"iana"},"video/nv":{"source":"iana"},"video/ogg":{"source":"iana","compressible":false,"extensions":["ogv"]},"video/parityfec":{"source":"iana"},"video/pointer":{"source":"iana"},"video/quicktime":{"source":"iana","compressible":false,"extensions":["qt","mov"]},"video/raptorfec":{"source":"iana"},"video/raw":{"source":"iana"},"video/rtp-enc-aescm128":{"source":"iana"},"video/rtploopback":{"source":"iana"},"video/rtx":{"source":"iana"},"video/scip":{"source":"iana"},"video/smpte291":{"source":"iana"},"video/smpte292m":{"source":"iana"},"video/ulpfec":{"source":"iana"},"video/vc1":{"source":"iana"},"video/vc2":{"source":"iana"},"video/vnd.cctv":{"source":"iana"},"video/vnd.dece.hd":{"source":"iana","extensions":["uvh","uvvh"]},"video/vnd.dece.mobile":{"source":"iana","extensions":["uvm","uvvm"]},"video/vnd.dece.mp4":{"source":"iana"},"video/vnd.dece.pd":{"source":"iana","extensions":["uvp","uvvp"]},"video/vnd.dece.sd":{"source":"iana","extensions":["uvs","uvvs"]},"video/vnd.dece.video":{"source":"iana","extensions":["uvv","uvvv"]},"video/vnd.directv.mpeg":{"source":"iana"},"video/vnd.directv.mpeg-tts":{"source":"iana"},"video/vnd.dlna.mpeg-tts":{"source":"iana"},"video/vnd.dvb.file":{"source":"iana","extensions":["dvb"]},"video/vnd.fvt":{"source":"iana","extensions":["fvt"]},"video/vnd.hns.video":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.ttsavc":{"source":"iana"},"video/vnd.iptvforum.ttsmpeg2":{"source":"iana"},"video/vnd.motorola.video":{"source":"iana"},"video/vnd.motorola.videop":{"source":"iana"},"video/vnd.mpegurl":{"source":"iana","extensions":["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{"source":"iana","extensions":["pyv"]},"video/vnd.nokia.interleaved-multimedia":{"source":"iana"},"video/vnd.nokia.mp4vr":{"source":"iana"},"video/vnd.nokia.videovoip":{"source":"iana"},"video/vnd.objectvideo":{"source":"iana"},"video/vnd.planar":{"source":"iana"},"video/vnd.radgamettools.bink":{"source":"iana"},"video/vnd.radgamettools.smacker":{"source":"apache"},"video/vnd.sealed.mpeg1":{"source":"iana"},"video/vnd.sealed.mpeg4":{"source":"iana"},"video/vnd.sealed.swf":{"source":"iana"},"video/vnd.sealedmedia.softseal.mov":{"source":"iana"},"video/vnd.uvvu.mp4":{"source":"iana","extensions":["uvu","uvvu"]},"video/vnd.vivo":{"source":"iana","extensions":["viv"]},"video/vnd.youtube.yt":{"source":"iana"},"video/vp8":{"source":"iana"},"video/vp9":{"source":"iana"},"video/webm":{"source":"apache","compressible":false,"extensions":["webm"]},"video/x-f4v":{"source":"apache","extensions":["f4v"]},"video/x-fli":{"source":"apache","extensions":["fli"]},"video/x-flv":{"source":"apache","compressible":false,"extensions":["flv"]},"video/x-m4v":{"source":"apache","extensions":["m4v"]},"video/x-matroska":{"source":"apache","compressible":false,"extensions":["mkv","mk3d","mks"]},"video/x-mng":{"source":"apache","extensions":["mng"]},"video/x-ms-asf":{"source":"apache","extensions":["asf","asx"]},"video/x-ms-vob":{"source":"apache","extensions":["vob"]},"video/x-ms-wm":{"source":"apache","extensions":["wm"]},"video/x-ms-wmv":{"source":"apache","compressible":false,"extensions":["wmv"]},"video/x-ms-wmx":{"source":"apache","extensions":["wmx"]},"video/x-ms-wvx":{"source":"apache","extensions":["wvx"]},"video/x-msvideo":{"source":"apache","extensions":["avi"]},"video/x-sgi-movie":{"source":"apache","extensions":["movie"]},"video/x-smv":{"source":"apache","extensions":["smv"]},"x-conference/x-cooltalk":{"source":"apache","extensions":["ice"]},"x-shader/x-fragment":{"compressible":true},"x-shader/x-vertex":{"compressible":true}}');
220008
+
218014
220009
  /***/ }),
218015
220010
 
218016
220011
  /***/ 82005:
@@ -224909,15 +226904,42 @@ function registerGatewayTools(server) {
224909
226904
  case "deleteAccess": {
224910
226905
  const cloudbase = await getManager();
224911
226906
  const accessPath = input.path ? normalizeAccessPath(input.path) : undefined;
226907
+ let resolvedAccessId = input.accessId;
226908
+ if (!resolvedAccessId) {
226909
+ if (!input.targetName && !accessPath) {
226910
+ throw new Error("action=deleteAccess 时至少需要提供 accessId,或提供 targetName/path 用于定位入口");
226911
+ }
226912
+ const accessList = await cloudbase.access.getAccessList({
226913
+ ...(input.targetName ? { name: input.targetName } : {}),
226914
+ ...(accessPath ? { path: accessPath } : {}),
226915
+ });
226916
+ const candidates = (accessList.APISet ?? []).filter((item) => {
226917
+ if (!accessPath) {
226918
+ return true;
226919
+ }
226920
+ return normalizeAccessPath(item.Path) === accessPath;
226921
+ });
226922
+ if (candidates.length === 0) {
226923
+ throw new Error("未找到可删除的访问入口,请确认 targetName/path 或直接传 accessId");
226924
+ }
226925
+ if (candidates.length > 1 && !accessPath) {
226926
+ throw new Error("匹配到多个访问入口,请补充 path 或直接传 accessId");
226927
+ }
226928
+ resolvedAccessId = candidates[0]?.APIId;
226929
+ }
226930
+ if (!resolvedAccessId) {
226931
+ throw new Error("无法解析访问入口 accessId,请改为显式传入 accessId");
226932
+ }
224912
226933
  const result = await cloudbase.access.deleteAccess({
224913
226934
  ...(input.targetName ? { name: input.targetName } : {}),
224914
- ...(accessPath ? { path: accessPath } : {}),
226935
+ apiId: resolvedAccessId,
224915
226936
  });
224916
226937
  (0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
224917
226938
  return buildEnvelope({
224918
226939
  action: input.action,
224919
226940
  targetName: input.targetName ?? null,
224920
226941
  path: accessPath ?? null,
226942
+ accessId: resolvedAccessId,
224921
226943
  raw: result,
224922
226944
  }, "网关访问入口删除成功");
224923
226945
  }
@@ -225019,6 +227041,7 @@ function registerGatewayTools(server) {
225019
227041
  domain: zod_1.z.string().optional().describe("自定义域名"),
225020
227042
  certificateId: zod_1.z.string().optional().describe("证书 ID"),
225021
227043
  accessName: zod_1.z.string().optional().describe("访问入口名称,保留字段"),
227044
+ accessId: zod_1.z.string().optional().describe("访问入口 ID。deleteAccess 时可直接传入,避免参数歧义"),
225022
227045
  },
225023
227046
  annotations: {
225024
227047
  readOnlyHint: false,
@@ -227255,6 +229278,225 @@ exports.ZipCrypto = __webpack_require__(94014);
227255
229278
  module.exports = __webpack_require__(27910);
227256
229279
 
227257
229280
 
229281
+ /***/ }),
229282
+
229283
+ /***/ 86049:
229284
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
229285
+
229286
+ "use strict";
229287
+ /*!
229288
+ * mime-types
229289
+ * Copyright(c) 2014 Jonathan Ong
229290
+ * Copyright(c) 2015 Douglas Christopher Wilson
229291
+ * MIT Licensed
229292
+ */
229293
+
229294
+
229295
+
229296
+ /**
229297
+ * Module dependencies.
229298
+ * @private
229299
+ */
229300
+
229301
+ var db = __webpack_require__(7598)
229302
+ var extname = (__webpack_require__(39902).extname)
229303
+ var mimeScore = __webpack_require__(30983)
229304
+
229305
+ /**
229306
+ * Module variables.
229307
+ * @private
229308
+ */
229309
+
229310
+ var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/
229311
+ var TEXT_TYPE_REGEXP = /^text\//i
229312
+
229313
+ /**
229314
+ * Module exports.
229315
+ * @public
229316
+ */
229317
+
229318
+ exports.charset = charset
229319
+ exports.charsets = { lookup: charset }
229320
+ exports.contentType = contentType
229321
+ exports.extension = extension
229322
+ exports.extensions = Object.create(null)
229323
+ exports.lookup = lookup
229324
+ exports.types = Object.create(null)
229325
+ exports._extensionConflicts = []
229326
+
229327
+ // Populate the extensions/types maps
229328
+ populateMaps(exports.extensions, exports.types)
229329
+
229330
+ /**
229331
+ * Get the default charset for a MIME type.
229332
+ *
229333
+ * @param {string} type
229334
+ * @return {false|string}
229335
+ */
229336
+
229337
+ function charset (type) {
229338
+ if (!type || typeof type !== 'string') {
229339
+ return false
229340
+ }
229341
+
229342
+ // TODO: use media-typer
229343
+ var match = EXTRACT_TYPE_REGEXP.exec(type)
229344
+ var mime = match && db[match[1].toLowerCase()]
229345
+
229346
+ if (mime && mime.charset) {
229347
+ return mime.charset
229348
+ }
229349
+
229350
+ // default text/* to utf-8
229351
+ if (match && TEXT_TYPE_REGEXP.test(match[1])) {
229352
+ return 'UTF-8'
229353
+ }
229354
+
229355
+ return false
229356
+ }
229357
+
229358
+ /**
229359
+ * Create a full Content-Type header given a MIME type or extension.
229360
+ *
229361
+ * @param {string} str
229362
+ * @return {false|string}
229363
+ */
229364
+
229365
+ function contentType (str) {
229366
+ // TODO: should this even be in this module?
229367
+ if (!str || typeof str !== 'string') {
229368
+ return false
229369
+ }
229370
+
229371
+ var mime = str.indexOf('/') === -1 ? exports.lookup(str) : str
229372
+
229373
+ if (!mime) {
229374
+ return false
229375
+ }
229376
+
229377
+ // TODO: use content-type or other module
229378
+ if (mime.indexOf('charset') === -1) {
229379
+ var charset = exports.charset(mime)
229380
+ if (charset) mime += '; charset=' + charset.toLowerCase()
229381
+ }
229382
+
229383
+ return mime
229384
+ }
229385
+
229386
+ /**
229387
+ * Get the default extension for a MIME type.
229388
+ *
229389
+ * @param {string} type
229390
+ * @return {false|string}
229391
+ */
229392
+
229393
+ function extension (type) {
229394
+ if (!type || typeof type !== 'string') {
229395
+ return false
229396
+ }
229397
+
229398
+ // TODO: use media-typer
229399
+ var match = EXTRACT_TYPE_REGEXP.exec(type)
229400
+
229401
+ // get extensions
229402
+ var exts = match && exports.extensions[match[1].toLowerCase()]
229403
+
229404
+ if (!exts || !exts.length) {
229405
+ return false
229406
+ }
229407
+
229408
+ return exts[0]
229409
+ }
229410
+
229411
+ /**
229412
+ * Lookup the MIME type for a file path/extension.
229413
+ *
229414
+ * @param {string} path
229415
+ * @return {false|string}
229416
+ */
229417
+
229418
+ function lookup (path) {
229419
+ if (!path || typeof path !== 'string') {
229420
+ return false
229421
+ }
229422
+
229423
+ // get the extension ("ext" or ".ext" or full path)
229424
+ var extension = extname('x.' + path)
229425
+ .toLowerCase()
229426
+ .slice(1)
229427
+
229428
+ if (!extension) {
229429
+ return false
229430
+ }
229431
+
229432
+ return exports.types[extension] || false
229433
+ }
229434
+
229435
+ /**
229436
+ * Populate the extensions and types maps.
229437
+ * @private
229438
+ */
229439
+
229440
+ function populateMaps (extensions, types) {
229441
+ Object.keys(db).forEach(function forEachMimeType (type) {
229442
+ var mime = db[type]
229443
+ var exts = mime.extensions
229444
+
229445
+ if (!exts || !exts.length) {
229446
+ return
229447
+ }
229448
+
229449
+ // mime -> extensions
229450
+ extensions[type] = exts
229451
+
229452
+ // extension -> mime
229453
+ for (var i = 0; i < exts.length; i++) {
229454
+ var extension = exts[i]
229455
+ types[extension] = _preferredType(extension, types[extension], type)
229456
+
229457
+ // DELETE (eventually): Capture extension->type maps that change as a
229458
+ // result of switching to mime-score. This is just to help make reviewing
229459
+ // PR #119 easier, and can be removed once that PR is approved.
229460
+ const legacyType = _preferredTypeLegacy(
229461
+ extension,
229462
+ types[extension],
229463
+ type
229464
+ )
229465
+ if (legacyType !== types[extension]) {
229466
+ exports._extensionConflicts.push([extension, legacyType, types[extension]])
229467
+ }
229468
+ }
229469
+ })
229470
+ }
229471
+
229472
+ // Resolve type conflict using mime-score
229473
+ function _preferredType (ext, type0, type1) {
229474
+ var score0 = type0 ? mimeScore(type0, db[type0].source) : 0
229475
+ var score1 = type1 ? mimeScore(type1, db[type1].source) : 0
229476
+
229477
+ return score0 > score1 ? type0 : type1
229478
+ }
229479
+
229480
+ // Resolve type conflict using pre-mime-score logic
229481
+ function _preferredTypeLegacy (ext, type0, type1) {
229482
+ var SOURCE_RANK = ['nginx', 'apache', undefined, 'iana']
229483
+
229484
+ var score0 = type0 ? SOURCE_RANK.indexOf(db[type0].source) : 0
229485
+ var score1 = type1 ? SOURCE_RANK.indexOf(db[type1].source) : 0
229486
+
229487
+ if (
229488
+ exports.types[extension] !== 'application/octet-stream' &&
229489
+ (score0 > score1 ||
229490
+ (score0 === score1 &&
229491
+ exports.types[extension]?.slice(0, 12) === 'application/'))
229492
+ ) {
229493
+ return type0
229494
+ }
229495
+
229496
+ return score0 > score1 ? type0 : type1
229497
+ }
229498
+
229499
+
227258
229500
  /***/ }),
227259
229501
 
227260
229502
  /***/ 86144:
@@ -234606,6 +236848,8 @@ function shouldRegisterTool(toolName) {
234606
236848
  'manageCloudRun',
234607
236849
  // Download tools - local file downloads
234608
236850
  'manageStorage',
236851
+ // Apps tools - deployApp reads local filePath for code upload
236852
+ 'manageApps',
234609
236853
  ];
234610
236854
  const shouldRegister = !cloudIncompatibleTools.includes(toolName);
234611
236855
  if (!shouldRegister) {
@@ -258752,39 +260996,57 @@ class FunctionService {
258752
260996
  return res;
258753
260997
  }
258754
260998
  catch (e) {
258755
- // 函数存在
260999
+ // 函数已存在(同名冲突)
258756
261000
  const functionExist = e.code === 'ResourceInUse.FunctionName' || e.code === 'ResourceInUse.Function';
258757
- // 已存在同名函数,强制更新
258758
- if (functionExist && force) {
258759
- // 1. 更新函数代码(通过 deployMode 区分镜像部署和代码部署)
258760
- const codeRes = await this.updateFunctionCode({
258761
- func,
258762
- base64Code,
258763
- functionPath,
258764
- functionRootPath,
258765
- codeSecret: codeSecret,
258766
- deployMode: isImageDeploy ? 'image' : undefined
258767
- });
258768
- // 等待函数状态正常
258769
- await this.waitFunctionActive(funcName, codeSecret);
258770
- // 2. 更新函数配置
258771
- const configRes = await this.updateFunctionConfig(func);
258772
- // 等待函数状态正常
258773
- await this.waitFunctionActive(funcName, codeSecret);
258774
- // 3. 创建函数触发器
258775
- const triggerRes = await this.retryCreateTrigger(funcName, func.triggers);
258776
- // 设置路径,创建云接入路径
258777
- if (func.path) {
258778
- await this.createAccessPath(funcName, func.path);
261001
+ if (functionExist) {
261002
+ // 检查同名函数是否是 CREATE_FAILED 残留
261003
+ // 场景:上次部署因依赖安装失败留下了残留函数,用户修正参数后重新部署(不传 force)
261004
+ // 此时应自动清理残留并重新创建,而不是报错要求用户手动删除或传 force
261005
+ try {
261006
+ const { Status } = await this.getFunctionDetail(funcName, codeSecret);
261007
+ if (Status === constant_1.SCF_STATUS.CREATE_FAILED) {
261008
+ console.warn(`[${funcName}] 检测到同名函数处于 CREATE_FAILED 状态,自动清理后重新创建...`);
261009
+ await this.deleteFunction(funcName);
261010
+ // 重新执行创建(递归调用,此时同名函数已删除,不会再碰到 ResourceInUse)
261011
+ return this.createFunction(funcParam);
261012
+ }
261013
+ }
261014
+ catch (checkErr) {
261015
+ // 查询或删除失败,继续走原有逻辑(force 判断)
261016
+ console.warn(`[${funcName}] 检查残留状态失败(可忽略): ${checkErr.message}`);
261017
+ }
261018
+ // 已存在且状态正常,强制覆盖更新
261019
+ if (force) {
261020
+ // 1. 更新函数代码(通过 deployMode 区分镜像部署和代码部署)
261021
+ const codeRes = await this.updateFunctionCode({
261022
+ func,
261023
+ base64Code,
261024
+ functionPath,
261025
+ functionRootPath,
261026
+ codeSecret: codeSecret,
261027
+ deployMode: isImageDeploy ? 'image' : undefined
261028
+ });
261029
+ // 等待函数状态正常
261030
+ await this.waitFunctionActive(funcName, codeSecret);
261031
+ // 2. 更新函数配置
261032
+ const configRes = await this.updateFunctionConfig(func);
261033
+ // 等待函数状态正常
261034
+ await this.waitFunctionActive(funcName, codeSecret);
261035
+ // 3. 创建函数触发器
261036
+ const triggerRes = await this.retryCreateTrigger(funcName, func.triggers);
261037
+ // 设置路径,创建云接入路径
261038
+ if (func.path) {
261039
+ await this.createAccessPath(funcName, func.path);
261040
+ }
261041
+ // 检查函数状态
261042
+ await this.waitFunctionActive(funcName, codeSecret);
261043
+ // 返回全部操作的响应值
261044
+ return {
261045
+ triggerRes,
261046
+ configRes,
261047
+ codeRes
261048
+ };
258779
261049
  }
258780
- // 检查函数状态
258781
- await this.waitFunctionActive(funcName, codeSecret);
258782
- // 返回全部操作的响应值
258783
- return {
258784
- triggerRes,
258785
- configRes,
258786
- codeRes
258787
- };
258788
261050
  }
258789
261051
  // 不强制覆盖,抛出错误
258790
261052
  if (e.message && !force) {
@@ -258809,8 +261071,8 @@ class FunctionService {
258809
261071
  async getFunctionList(limit = 20, offset = 0) {
258810
261072
  // 获取Function 环境配置
258811
261073
  const { namespace } = this.getFunctionConfig();
258812
- const res = await this.scfService.request('ListFunctions', {
258813
- Namespace: namespace,
261074
+ const res = await this.tcbService.request('ListFunctions', {
261075
+ EnvId: namespace,
258814
261076
  Limit: limit,
258815
261077
  Offset: offset
258816
261078
  });
@@ -258825,8 +261087,8 @@ class FunctionService {
258825
261087
  async listFunctions(limit = 20, offset = 0) {
258826
261088
  // 获取Function 环境配置
258827
261089
  const { namespace } = this.getFunctionConfig();
258828
- const res = await this.scfService.request('ListFunctions', {
258829
- Namespace: namespace,
261090
+ const res = await this.tcbService.request('ListFunctions', {
261091
+ EnvId: namespace,
258830
261092
  Limit: limit,
258831
261093
  Offset: offset
258832
261094
  });
@@ -258857,8 +261119,8 @@ class FunctionService {
258857
261119
  const { envId } = options;
258858
261120
  while (true) {
258859
261121
  try {
258860
- const res = await this.scfService.request('ListFunctions', {
258861
- Namespace: envId,
261122
+ const res = await this.tcbService.request('ListFunctions', {
261123
+ EnvId: envId,
258862
261124
  Limit: pageSize,
258863
261125
  Offset: currentOffset
258864
261126
  });
@@ -264076,10 +266338,12 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
264076
266338
  exports.getCredentialWithoutCheck = exports.checkAndGetCredential = exports.isCamRefused = exports.refreshTmpToken = exports.getCredentialData = exports.ENV_NAME = exports.authStore = void 0;
264077
266339
  const cloud_api_1 = __webpack_require__(2090);
264078
266340
  const common_1 = __webpack_require__(96711);
266341
+ const api_key_1 = __webpack_require__(12754);
264079
266342
  const async_1 = __webpack_require__(80854);
264080
266343
  const coding_1 = __webpack_require__(40540);
264081
266344
  const system_1 = __webpack_require__(62179);
264082
266345
  const localstore_1 = __webpack_require__(40833);
266346
+ const project_store_1 = __webpack_require__(65260);
264083
266347
  const error_1 = __webpack_require__(64119);
264084
266348
  const refreshTokenUrl = 'https://iaas.cloud.tencent.com/tcb_refresh';
264085
266349
  exports.authStore = new localstore_1.LocalStore({
@@ -264094,6 +266358,8 @@ var ENV_NAME;
264094
266358
  ENV_NAME["ENV_TCB_ENV_ID"] = "TENCENTCLOUD_TCB_ENVID";
264095
266359
  ENV_NAME["ENV_RUNENV"] = "TENCENTCLOUD_RUNENV";
264096
266360
  ENV_NAME["ENV_RUNENV_SCF"] = "TENCENTCLOUD_RUNENV=SCF";
266361
+ ENV_NAME["ENV_CLOUDBASE_API_KEY"] = "CLOUDBASE_API_KEY";
266362
+ ENV_NAME["ENV_CLOUDBASE_ENV_ID"] = "CLOUDBASE_ENV_ID";
264097
266363
  })(ENV_NAME = exports.ENV_NAME || (exports.ENV_NAME = {}));
264098
266364
  function resolveCredentialFormEnv() {
264099
266365
  const getEnvVar = (envName) => {
@@ -264108,9 +266374,48 @@ function resolveCredentialFormEnv() {
264108
266374
  token
264109
266375
  };
264110
266376
  }
266377
+ /**
266378
+ * 从环境变量检测 CloudBase API Key
266379
+ * 优先级高于 TENCENTCLOUD_SECRETID/KEY
266380
+ */
266381
+ function resolveApiKeyFromEnv() {
266382
+ const apiKey = process.env[ENV_NAME.ENV_CLOUDBASE_API_KEY];
266383
+ const envId = process.env[ENV_NAME.ENV_CLOUDBASE_ENV_ID];
266384
+ if (apiKey && envId) {
266385
+ return { apiKey, envId };
266386
+ }
266387
+ return null;
266388
+ }
266389
+ // 获取项目级存储的 API Key 凭证
266390
+ function getProjectApiKeyCredential(cwd) {
266391
+ return __awaiter(this, void 0, void 0, function* () {
266392
+ try {
266393
+ const store = (0, project_store_1.getProjectStore)(cwd, { _: '', credential: {} }, 'auth');
266394
+ const stored = yield store.get('credential');
266395
+ if (!stored || !stored.secretId || !stored.authSource) {
266396
+ return null;
266397
+ }
266398
+ return (0, common_1.resolveCredential)(stored) || null;
266399
+ }
266400
+ catch (_a) {
266401
+ return null;
266402
+ }
266403
+ });
266404
+ }
264111
266405
  // 获取 credential 数据
264112
- function getCredentialData() {
266406
+ function getCredentialData(options) {
264113
266407
  return __awaiter(this, void 0, void 0, function* () {
266408
+ // 1. 如果有 cwd,优先从项目级存储读取 API Key 凭证
266409
+ if (options === null || options === void 0 ? void 0 : options.cwd) {
266410
+ const projectCredential = yield getProjectApiKeyCredential(options.cwd);
266411
+ if (projectCredential) {
266412
+ return projectCredential;
266413
+ }
266414
+ }
266415
+ // 2. 检查 CLOUDBASE_API_KEY 环境变量(优先于 TENCENTCLOUD_*)
266416
+ // 注意:环境变量的 API Key 需要在外部调用 exchangeApiKeyForCredential 后才能使用
266417
+ // 这里只返回已有的凭证,不主动触发 exchange
266418
+ // 3. 原有逻辑:全局 auth.json → TENCENTCLOUD_* 环境变量
264114
266419
  const localData = (yield exports.authStore.get('credential'));
264115
266420
  const cloudCredentail = resolveCredentialFormEnv();
264116
266421
  const credential = (0, common_1.resolveCredential)(localData) || cloudCredentail;
@@ -264196,11 +266501,38 @@ const isTokenExpired = (credential, gap = 120) => credential.accessTokenExpired
264196
266501
  function checkAndGetCredential(options = {}) {
264197
266502
  return __awaiter(this, void 0, void 0, function* () {
264198
266503
  // 从本地存储中读取 credential
264199
- const credential = yield getCredentialData();
266504
+ const credential = yield getCredentialData({ cwd: options.cwd });
264200
266505
  if (!credential) {
264201
266506
  return null;
264202
266507
  }
264203
- // 存在临时密钥信息
266508
+ // API Key 来源的凭证:过期后用 apiKey 重新换取
266509
+ if (credential.authSource === 'api_key' && credential.apiKey) {
266510
+ if (!isTokenExpired(credential)) {
266511
+ return wrapCheckAuth(credential, options);
266512
+ }
266513
+ // 过期了,用 apiKey 重新换取
266514
+ try {
266515
+ const refreshed = yield (0, api_key_1.exchangeApiKeyForCredential)({
266516
+ apiKey: credential.apiKey,
266517
+ envId: credential.envId
266518
+ });
266519
+ const newCredential = Object.assign(Object.assign({}, refreshed), { authSource: 'api_key', apiKey: credential.apiKey });
266520
+ // 存储到项目级存储(如果有 cwd)
266521
+ if (options.cwd) {
266522
+ const store = (0, project_store_1.getProjectStore)(options.cwd, { _: 'CloudBase API Key 凭据,请勿分享', credential: {} }, 'auth');
266523
+ yield store.set('credential', newCredential);
266524
+ }
266525
+ else {
266526
+ yield exports.authStore.set('credential', newCredential);
266527
+ }
266528
+ return wrapCheckAuth(newCredential, options);
266529
+ }
266530
+ catch (e) {
266531
+ // API Key 换取失败,返回 null
266532
+ return null;
266533
+ }
266534
+ }
266535
+ // 存在临时密钥信息(Web Auth / Device Flow)
264204
266536
  if (credential.refreshToken) {
264205
266537
  // 临时密钥在 2 小时有效期内,可以直接使用
264206
266538
  if (!isTokenExpired(credential)) {
@@ -264241,9 +266573,9 @@ function checkAndGetCredential(options = {}) {
264241
266573
  }
264242
266574
  exports.checkAndGetCredential = checkAndGetCredential;
264243
266575
  // 获取身份认证信息,不校验
264244
- function getCredentialWithoutCheck() {
266576
+ function getCredentialWithoutCheck(options) {
264245
266577
  return __awaiter(this, void 0, void 0, function* () {
264246
- const credential = yield getCredentialData();
266578
+ const credential = yield getCredentialData({ cwd: options === null || options === void 0 ? void 0 : options.cwd });
264247
266579
  if (!credential) {
264248
266580
  return null;
264249
266581
  }