ccman 3.3.14 → 3.3.15-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +77 -9
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ var init_package = __esm({
15
15
  "../core/package.json"() {
16
16
  package_default = {
17
17
  name: "@ccman/core",
18
- version: "3.3.14",
18
+ version: "3.3.15-beta.1",
19
19
  type: "module",
20
20
  description: "Core business logic for ccman - Manage Codex, Claude Code, Gemini CLI, OpenCode, OpenClaw, and MCP configurations",
21
21
  main: "./dist/index.js",
@@ -1219,6 +1219,47 @@ function loadExistingJSON(filePath) {
1219
1219
  return null;
1220
1220
  }
1221
1221
  }
1222
+ function isRecord(value) {
1223
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1224
+ }
1225
+ function forcePrimaryModelReasoning(models) {
1226
+ if (!Array.isArray(models))
1227
+ return models;
1228
+ return models.map((item) => {
1229
+ if (!isRecord(item))
1230
+ return item;
1231
+ const modelId = typeof item.id === "string" ? item.id : "";
1232
+ const modelName = typeof item.name === "string" ? item.name : "";
1233
+ if (modelId !== PRIMARY_MODEL_ID && modelName !== PRIMARY_MODEL_ID) {
1234
+ return item;
1235
+ }
1236
+ return {
1237
+ ...item,
1238
+ reasoning: true
1239
+ };
1240
+ });
1241
+ }
1242
+ function forceProviderPrimaryReasoning(providerConfig) {
1243
+ if (!isRecord(providerConfig))
1244
+ return void 0;
1245
+ return {
1246
+ ...providerConfig,
1247
+ models: forcePrimaryModelReasoning(providerConfig.models)
1248
+ };
1249
+ }
1250
+ function replaceProviderEntry(providers, providerName, nextProvider) {
1251
+ const result = { ...providers || {} };
1252
+ const target = providerName.toLowerCase();
1253
+ for (const key of Object.keys(result)) {
1254
+ if (key.toLowerCase() === target) {
1255
+ delete result[key];
1256
+ }
1257
+ }
1258
+ if (nextProvider) {
1259
+ result[providerName] = nextProvider;
1260
+ }
1261
+ return result;
1262
+ }
1222
1263
  function writeOpenClawConfig(provider) {
1223
1264
  const configPath = getOpenClawConfigPath();
1224
1265
  const modelsPath = getOpenClawModelsPath();
@@ -1238,6 +1279,9 @@ function writeOpenClawConfig(provider) {
1238
1279
  const existingOpenClawConfig = loadExistingJSON(configPath) || {};
1239
1280
  const existingModelsConfig = loadExistingJSON(modelsPath) || {};
1240
1281
  const mergedConfigModels = deepMerge(existingOpenClawConfig.models || {}, nextOpenClawConfig.models || {});
1282
+ const mergedConfigProviders = isRecord(mergedConfigModels.providers) ? mergedConfigModels.providers : void 0;
1283
+ const nextConfigProviders = isRecord(nextOpenClawConfig.models) && isRecord(nextOpenClawConfig.models.providers) ? nextOpenClawConfig.models.providers : void 0;
1284
+ mergedConfigModels.providers = replaceProviderEntry(mergedConfigProviders, providerName, forceProviderPrimaryReasoning(nextConfigProviders?.[providerName]));
1241
1285
  const mergedAgents = deepMerge(nextOpenClawConfig.agents || {}, existingOpenClawConfig.agents || {});
1242
1286
  const mergedDefaults = mergedAgents.defaults || {};
1243
1287
  const mergedModel = mergedDefaults.model || {};
@@ -1259,14 +1303,15 @@ function writeOpenClawConfig(provider) {
1259
1303
  }
1260
1304
  };
1261
1305
  const mergedProviders = deepMerge(existingModelsConfig.providers || {}, nextModelsConfig.providers || {});
1306
+ const nextModelsProviders = isRecord(nextModelsConfig.providers) ? nextModelsConfig.providers : void 0;
1262
1307
  const finalModelsConfig = {
1263
1308
  ...existingModelsConfig,
1264
- providers: mergedProviders
1309
+ providers: replaceProviderEntry(mergedProviders, providerName, forceProviderPrimaryReasoning(nextModelsProviders?.[providerName]))
1265
1310
  };
1266
1311
  writeJSON(configPath, finalOpenClawConfig);
1267
1312
  writeJSON(modelsPath, finalModelsConfig);
1268
1313
  }
1269
- var DEFAULT_PROVIDER_NAME, __filename5, __dirname5, OPENCLAW_CONFIG_TEMPLATE, OPENCLAW_MODELS_TEMPLATE;
1314
+ var DEFAULT_PROVIDER_NAME, PRIMARY_MODEL_ID, __filename5, __dirname5, OPENCLAW_CONFIG_TEMPLATE, OPENCLAW_MODELS_TEMPLATE;
1270
1315
  var init_openclaw2 = __esm({
1271
1316
  "../core/dist/writers/openclaw.js"() {
1272
1317
  "use strict";
@@ -1274,6 +1319,7 @@ var init_openclaw2 = __esm({
1274
1319
  init_file();
1275
1320
  init_template();
1276
1321
  DEFAULT_PROVIDER_NAME = "gmn";
1322
+ PRIMARY_MODEL_ID = "gpt-5.3-codex";
1277
1323
  __filename5 = fileURLToPath5(import.meta.url);
1278
1324
  __dirname5 = path8.dirname(__filename5);
1279
1325
  OPENCLAW_CONFIG_TEMPLATE = {
@@ -7097,7 +7143,7 @@ function importCommand(program2) {
7097
7143
  init_dist2();
7098
7144
  import chalk54 from "chalk";
7099
7145
  import inquirer38 from "inquirer";
7100
- var PROVIDER_NAME = "GMN";
7146
+ var DEFAULT_PROVIDER_NAME2 = "gmn";
7101
7147
  var VALID_PLATFORMS = ["codex", "opencode", "openclaw"];
7102
7148
  var DEFAULT_PLATFORMS = ["codex", "opencode"];
7103
7149
  var GMN_OPENAI_BASE_URL = "https://gmn.chuangzuoli.com";
@@ -7218,18 +7264,40 @@ async function resolvePlatforms(platformArg) {
7218
7264
  }
7219
7265
  return promptPlatforms();
7220
7266
  }
7221
- async function gmnCommand(apiKey, platformArg) {
7267
+ function resolveProviderName2(providerNameArg) {
7268
+ if (providerNameArg === void 0) {
7269
+ return DEFAULT_PROVIDER_NAME2;
7270
+ }
7271
+ const providerName = providerNameArg.trim();
7272
+ if (!providerName) {
7273
+ throw new Error("\u670D\u52A1\u5546\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");
7274
+ }
7275
+ if (providerName.toLowerCase() === DEFAULT_PROVIDER_NAME2) {
7276
+ return DEFAULT_PROVIDER_NAME2;
7277
+ }
7278
+ return providerName;
7279
+ }
7280
+ function findPreferredProvider(providers, targetName) {
7281
+ const exact = providers.find((p) => p.name.trim() === targetName);
7282
+ if (exact) return exact;
7283
+ const lowerTarget = targetName.toLowerCase();
7284
+ return providers.find((p) => p.name.trim().toLowerCase() === lowerTarget);
7285
+ }
7286
+ async function gmnCommand(apiKey, platformArg, providerNameArg) {
7222
7287
  printBanner();
7223
7288
  let platforms;
7289
+ let providerName;
7224
7290
  try {
7225
7291
  console.log(chalk54.cyan(`
7226
7292
  ${renderStep(1, TOTAL_STEPS, "\u9009\u62E9\u8981\u914D\u7F6E\u7684\u5DE5\u5177")}`));
7227
7293
  platforms = await resolvePlatforms(platformArg);
7294
+ providerName = resolveProviderName2(providerNameArg);
7228
7295
  } catch (error) {
7229
7296
  console.error(chalk54.red(`\u274C ${error.message}`));
7230
7297
  process.exit(1);
7231
7298
  }
7232
7299
  console.log(chalk54.gray(`\u5DF2\u9009\u62E9: ${platforms.join(", ")}`));
7300
+ console.log(chalk54.gray(`\u670D\u52A1\u5546\u540D\u79F0: ${providerName}`));
7233
7301
  printKeyNotice();
7234
7302
  let resolvedApiKey = apiKey?.trim();
7235
7303
  console.log(chalk54.cyan(`
@@ -7274,8 +7342,8 @@ ${renderStep(3, TOTAL_STEPS, "\u5F00\u59CB\u5199\u5165\u914D\u7F6E")}`));
7274
7342
  try {
7275
7343
  console.log(chalk54.gray(`\u2192 \u914D\u7F6E ${name}...`));
7276
7344
  const baseUrl = platformBaseUrls[platform];
7277
- const existing = manager.findByName(PROVIDER_NAME);
7278
- const provider = existing ? manager.edit(existing.id, { baseUrl, apiKey: resolvedApiKey }) : manager.add({ name: PROVIDER_NAME, baseUrl, apiKey: resolvedApiKey });
7345
+ const existing = findPreferredProvider(manager.list(), providerName);
7346
+ const provider = existing ? manager.edit(existing.id, { name: providerName, baseUrl, apiKey: resolvedApiKey }) : manager.add({ name: providerName, baseUrl, apiKey: resolvedApiKey });
7279
7347
  manager.switch(provider.id);
7280
7348
  completed += 1;
7281
7349
  console.log(chalk54.green(`\u2705 ${name}`));
@@ -7381,8 +7449,8 @@ sync.action(async () => {
7381
7449
  });
7382
7450
  exportCommand(program);
7383
7451
  importCommand(program);
7384
- program.command("gmn [apiKey]").description("\u914D\u7F6E GMN \u5230 Codex\u3001OpenCode\u3001OpenClaw").option("-p, --platform <platforms>", "\u6307\u5B9A\u5E73\u53F0 (codex,opencode,openclaw,all)").action(async (apiKey, options) => {
7385
- await gmnCommand(apiKey, options.platform);
7452
+ program.command("gmn [apiKey]").description("\u914D\u7F6E GMN \u5230 Codex\u3001OpenCode\u3001OpenClaw").option("-p, --platform <platforms>", "\u6307\u5B9A\u5E73\u53F0 (codex,opencode,openclaw,all)").option("-n, --name <providerName>", "\u6307\u5B9A\u670D\u52A1\u5546\u540D\u79F0\uFF08\u9ED8\u8BA4: gmn\uFF09").action(async (apiKey, options) => {
7453
+ await gmnCommand(apiKey, options.platform, options.name);
7386
7454
  });
7387
7455
  (async () => {
7388
7456
  if (!process.argv.slice(2).length) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccman",
3
- "version": "3.3.14",
3
+ "version": "3.3.15-beta.1",
4
4
  "type": "module",
5
5
  "description": "Manage Codex, Claude Code, Gemini CLI, OpenCode, OpenClaw, and MCP API service provider configurations",
6
6
  "main": "./dist/index.js",