base_parts_ai 1.0.45 → 1.0.47

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  ## 下载发布的包
3
- https://registry.npmjs.org/base_parts_ai/-/base_parts_ai-1.0.43.tgz
3
+ https://registry.npmjs.org/base_parts_ai/-/base_parts_ai-1.0.45.tgz
4
4
 
5
5
  ## 然后放在jdwfiles目录下
6
6
  https://jdwfiles.oss-cn-hangzhou.aliyuncs.com/npm_pkg/base_parts_ai-1.0.34.tgz
package/lib/ai_utils.js CHANGED
@@ -8,7 +8,7 @@
8
8
  var fs = require('fs');
9
9
  var path = require('path');
10
10
  var http = require('http');
11
- var { execSync } = require('child_process');
11
+ var { execSync, spawnSync } = require('child_process');
12
12
 
13
13
  // ============================================================
14
14
  // AI 渠道列表(运行时由 fetchConfig 从服务端拉取填充)
@@ -24,6 +24,51 @@ var noticeList = [];
24
24
  // jcc.json 中保存最后一次手动输入 Token 的内部字段名
25
25
  var LAST_MANUAL_AUTH_TOKEN_KEY = '__lastManualAuthToken';
26
26
 
27
+ /**
28
+ * 从当前入口文件名推断正在运行的 CLI 命令名
29
+ * @returns {string} jcc、jcx 或空字符串
30
+ */
31
+ function getCurrentCliName() {
32
+ var entryName = path.basename(process.argv[1] || '').toLowerCase();
33
+ if (entryName === 'jcx' || entryName === 'jcx.js') return 'jcx';
34
+ if (entryName === 'jcc' || entryName === 'jcc.js') return 'jcc';
35
+ return '';
36
+ }
37
+
38
+ /**
39
+ * 升级完成后重新运行当前 CLI,并保留本次传入的全部参数
40
+ * @returns {void}
41
+ */
42
+ function rerunCurrentCli() {
43
+ var cliName = getCurrentCliName();
44
+ if (!cliName) {
45
+ console.log('[fetchConfig] 升级完成,未识别当前 CLI,请重新运行');
46
+ process.exit(0);
47
+ }
48
+
49
+ // 传递临时环境变量,避免新进程在版本缓存异常时反复触发升级。
50
+ var childEnv = Object.assign({}, process.env, {
51
+ BASE_PARTS_AI_SKIP_SELF_UPDATE: '1',
52
+ });
53
+ var args = process.argv.slice(2);
54
+ console.log('[fetchConfig] 升级完成,正在重新运行: ' + cliName + (args.length ? ' ' + args.join(' ') : ''));
55
+ var result = spawnSync(cliName, args, {
56
+ stdio: 'inherit',
57
+ shell: process.platform === 'win32',
58
+ env: childEnv,
59
+ });
60
+
61
+ if (result.error) {
62
+ console.warn('[fetchConfig] 重新运行失败:', result.error.message);
63
+ process.exit(1);
64
+ }
65
+ if (result.signal) {
66
+ console.warn('[fetchConfig] 重新运行被信号中断:', result.signal);
67
+ process.exit(1);
68
+ }
69
+ process.exit(typeof result.status === 'number' ? result.status : 0);
70
+ }
71
+
27
72
  /**
28
73
  * 从服务端拉取渠道配置,并检查 jcc 自身是否需要升级
29
74
  * @param {object} buildCfg getBuildCfg 返回的配置对象
@@ -76,7 +121,7 @@ function fetchConfig(buildCfg) {
76
121
  }
77
122
  return false;
78
123
  }
79
- if (newVer && semverGt(newVer, currentVer)) {
124
+ if (newVer && process.env.BASE_PARTS_AI_SKIP_SELF_UPDATE !== '1' && semverGt(newVer, currentVer)) {
80
125
  console.log('[fetchConfig] 检测到新版本 jcc: ' + newVer + '(当前 ' + currentVer + ')');
81
126
  var confirmed = "yes"
82
127
  // confirmed = await select({
@@ -93,8 +138,7 @@ function fetchConfig(buildCfg) {
93
138
  try {
94
139
  var tgzUrl = 'https://jdwfiles.oss-cn-hangzhou.aliyuncs.com/npm_pkg/base_parts_ai-' + newVer + '.tgz';
95
140
  execSync('npm install -g ' + tgzUrl + ' --force --registry=https://registry.npmmirror.com', { stdio: 'inherit' });
96
- console.log('[fetchConfig] 升级完成,请重新运行 jcc');
97
- process.exit(0);
141
+ rerunCurrentCli();
98
142
  } catch (e) {
99
143
  console.warn('[fetchConfig] 自动升级失败:', e.message);
100
144
  }
package/lib/setapi_cx.js CHANGED
@@ -151,6 +151,33 @@ function ensureSandboxMode(toml) {
151
151
  return stringifyTomlConfig(config);
152
152
  }
153
153
 
154
+ /**
155
+ * 强制删除 Codex TUI 编辑器 insert_newline 配置,交给官方默认行为处理
156
+ * @param {string} toml TOML 内容
157
+ * @returns {string}
158
+ */
159
+ function removeEditorInsertNewlineKeymap(toml) {
160
+ var config = parseTomlConfig(toml);
161
+ var tui = config.tui;
162
+ var keymap = tui && typeof tui === 'object' && !Array.isArray(tui) ? tui.keymap : null;
163
+ var editor = keymap && typeof keymap === 'object' && !Array.isArray(keymap) ? keymap.editor : null;
164
+
165
+ // 只删除官方已支持的 insert_newline,保留用户其它 TUI 快捷键配置。
166
+ if (editor && typeof editor === 'object' && !Array.isArray(editor)) {
167
+ delete editor.insert_newline;
168
+ if (isEmptyObject(editor)) {
169
+ delete keymap.editor;
170
+ }
171
+ if (isEmptyObject(keymap)) {
172
+ delete tui.keymap;
173
+ }
174
+ if (isEmptyObject(tui)) {
175
+ delete config.tui;
176
+ }
177
+ }
178
+ return stringifyTomlConfig(config);
179
+ }
180
+
154
181
  /**
155
182
  * 删除顶层 model_provider 字段,保留其它配置段落
156
183
  * @param {string} toml TOML 内容
@@ -418,6 +445,7 @@ async function setapiCx(cmd, buildCfg) {
418
445
  toml = wireApi ? setJcodexWireApi(toml, wireApi) : removeJcodexWireApi(toml);
419
446
  }
420
447
  toml = ensureSandboxMode(toml);
448
+ toml = removeEditorInsertNewlineKeymap(toml);
421
449
  writeTextFile(buildCfg.codexConfigPath, toml);
422
450
 
423
451
  await refreshAgentsFile(buildCfg.codexAgentsPath);
@@ -437,6 +465,7 @@ setapiCx._private = {
437
465
  escapeTomlString: escapeTomlString,
438
466
  hasTopLevelKey: hasTopLevelKey,
439
467
  ensureSandboxMode: ensureSandboxMode,
468
+ removeEditorInsertNewlineKeymap: removeEditorInsertNewlineKeymap,
440
469
  removeTopLevelModelProvider: removeTopLevelModelProvider,
441
470
  removeJcodexProviderBlock: removeJcodexProviderBlock,
442
471
  removeJcodexWireApi: removeJcodexWireApi,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "base_parts_ai",
3
- "version": "1.0.45",
3
+ "version": "1.0.47",
4
4
  "description": "jaskle base_parts_ai",
5
5
  "main": "./main.js",
6
6
  "registry": true,
package/test_jcx.js CHANGED
@@ -172,6 +172,23 @@ async function runTests() {
172
172
  if (!ok) { process.exit(1); }
173
173
  })();
174
174
 
175
+ // ============================================================
176
+ // 测试 2.2:强制删除 TUI 编辑器换行快捷键
177
+ // ============================================================
178
+ console.log('\n======= jcx Test 2.2: 强制删除 TUI keymap insert_newline =======');
179
+ (function () {
180
+ var original = '[tui]\ntheme = "dark"\n\n[tui.keymap.editor]\ninsert_newline = "enter"\naccept_completion = "tab"\n';
181
+ var updated = privateApi.removeEditorInsertNewlineKeymap(original);
182
+ var ok = true;
183
+ ok = ok && updated.indexOf('[tui]') !== -1;
184
+ ok = ok && updated.indexOf('theme = "dark"') !== -1;
185
+ ok = ok && updated.indexOf('[tui.keymap.editor]') !== -1;
186
+ ok = ok && updated.indexOf('accept_completion = "tab"') !== -1;
187
+ ok = ok && updated.indexOf('insert_newline') === -1;
188
+ console.log('✅ Test 2.2 通过:', ok);
189
+ if (!ok) { process.exit(1); }
190
+ })();
191
+
175
192
  // ============================================================
176
193
  // 测试 3:空 base_url 删除顶层 model_provider,保留 provider 段
177
194
  // ============================================================
@@ -218,6 +235,7 @@ async function runTests() {
218
235
  ok = ok && toml.indexOf('sandbox_mode = "danger-full-access"') !== -1;
219
236
  ok = ok && toml.indexOf('base_url = "https://forced.example.com/v1"') !== -1;
220
237
  ok = ok && toml.indexOf('wire_api = "wire-forced-provider-key"') !== -1;
238
+ ok = ok && toml.indexOf('insert_newline') === -1;
221
239
  ok = ok && agents.indexOf('cli=cx') !== -1;
222
240
  ok = ok && agents.indexOf('cli=cx-' + utils.getAiTipOsParam()) !== -1;
223
241
  console.log('✅ Test 4 通过:', ok);