chatccc 0.2.186 → 0.2.188
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/config.sample.json +39 -32
- package/package.json +1 -1
- package/src/__tests__/builtin-config.test.ts +33 -0
- package/src/__tests__/chrome-devtools-guard.test.ts +40 -0
- package/src/__tests__/config-reload.test.ts +30 -16
- package/src/__tests__/config-sample.test.ts +41 -19
- package/src/__tests__/feishu-avatar.test.ts +180 -115
- package/src/__tests__/orchestrator.test.ts +165 -17
- package/src/__tests__/session.test.ts +17 -7
- package/src/__tests__/web-ui.test.ts +22 -0
- package/src/adapters/codex-adapter.ts +26 -21
- package/src/builtin/cli.ts +8 -16
- package/src/builtin/index.ts +12 -11
- package/src/cards.ts +48 -7
- package/src/chrome-devtools-guard.ts +78 -2
- package/src/config.ts +158 -108
- package/src/feishu-api.ts +219 -190
- package/src/index.ts +2 -2
- package/src/orchestrator.ts +211 -19
- package/src/platform-adapter.ts +9 -1
- package/src/session.ts +92 -64
- package/src/web-ui.ts +32 -7
package/src/web-ui.ts
CHANGED
|
@@ -40,10 +40,11 @@ interface AppConfig {
|
|
|
40
40
|
path?: string;
|
|
41
41
|
command?: string;
|
|
42
42
|
model?: string;
|
|
43
|
+
alternativeModel?: string;
|
|
43
44
|
avatarBatteryMode?: string;
|
|
44
45
|
onDemandMonthlyBudget?: number;
|
|
45
46
|
};
|
|
46
|
-
codex?: { enabled?: boolean; defaultAgent?: boolean; path?: string; command?: string; model?: string; effort?: string };
|
|
47
|
+
codex?: { enabled?: boolean; defaultAgent?: boolean; path?: string; command?: string; model?: string; alternativeModel?: string; effort?: string };
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
// ---------------------------------------------------------------------------
|
|
@@ -380,6 +381,9 @@ export function unflattenConfig(flat: Record<string, unknown>): Record<string, u
|
|
|
380
381
|
} else if (key === "CHATCCC_CURSOR_MODEL") {
|
|
381
382
|
result.cursor = result.cursor || {};
|
|
382
383
|
(result.cursor as Record<string, unknown>).model = val;
|
|
384
|
+
} else if (key === "CHATCCC_CURSOR_ALTERNATIVE_MODEL") {
|
|
385
|
+
result.cursor = result.cursor || {};
|
|
386
|
+
(result.cursor as Record<string, unknown>).alternativeModel = val;
|
|
383
387
|
} else if (key === "CHATCCC_CURSOR_AVATAR_BATTERY_MODE") {
|
|
384
388
|
result.cursor = result.cursor || {};
|
|
385
389
|
(result.cursor as Record<string, unknown>).avatarBatteryMode = val;
|
|
@@ -398,6 +402,9 @@ export function unflattenConfig(flat: Record<string, unknown>): Record<string, u
|
|
|
398
402
|
} else if (key === "CHATCCC_CODEX_MODEL") {
|
|
399
403
|
result.codex = result.codex || {};
|
|
400
404
|
(result.codex as Record<string, unknown>).model = val;
|
|
405
|
+
} else if (key === "CHATCCC_CODEX_ALTERNATIVE_MODEL") {
|
|
406
|
+
result.codex = result.codex || {};
|
|
407
|
+
(result.codex as Record<string, unknown>).alternativeModel = val;
|
|
401
408
|
} else if (key === "CHATCCC_CODEX_EFFORT") {
|
|
402
409
|
result.codex = result.codex || {};
|
|
403
410
|
(result.codex as Record<string, unknown>).effort = val;
|
|
@@ -747,6 +754,10 @@ header .badge{font-size:13px;padding:4px 12px;border-radius:12px;font-weight:500
|
|
|
747
754
|
<label>模型</label>
|
|
748
755
|
<input type="text" id="field-CHATCCC_CURSOR_MODEL" placeholder="留空表示不传 --model">
|
|
749
756
|
</div>
|
|
757
|
+
<div class="form-group">
|
|
758
|
+
<label>备选模型(选填)</label>
|
|
759
|
+
<input type="text" id="field-CHATCCC_CURSOR_ALTERNATIVE_MODEL" placeholder="加入 /model 列表,便于会话内切换">
|
|
760
|
+
</div>
|
|
750
761
|
<div class="form-group">
|
|
751
762
|
<label>头像电池电量</label>
|
|
752
763
|
<select id="field-CHATCCC_CURSOR_AVATAR_BATTERY_MODE" onchange="onCursorBatteryModeChange('field-', this.value)" style="width:100%;padding:8px 12px;border:1px solid #cbd5e1;border-radius:8px;font-size:14px;outline:none">
|
|
@@ -785,6 +796,10 @@ header .badge{font-size:13px;padding:4px 12px;border-radius:12px;font-weight:500
|
|
|
785
796
|
<label>模型</label>
|
|
786
797
|
<input type="text" id="field-CHATCCC_CODEX_MODEL" placeholder="留空由 codex config.toml 决定">
|
|
787
798
|
</div>
|
|
799
|
+
<div class="form-group">
|
|
800
|
+
<label>备选模型(选填)</label>
|
|
801
|
+
<input type="text" id="field-CHATCCC_CODEX_ALTERNATIVE_MODEL" placeholder="加入 /model 列表,便于会话内切换">
|
|
802
|
+
</div>
|
|
788
803
|
<div class="form-group">
|
|
789
804
|
<label>努力程度 (Effort)</label>
|
|
790
805
|
<input type="text" id="field-CHATCCC_CODEX_EFFORT" placeholder="留空由 codex config.toml 决定">
|
|
@@ -891,6 +906,7 @@ header .badge{font-size:13px;padding:4px 12px;border-radius:12px;font-weight:500
|
|
|
891
906
|
<div class="section-detail">
|
|
892
907
|
<div class="config-row"><span class="key">CLI 路径</span><span class="val" id="cfg-CURSOR_PATH">-</span></div>
|
|
893
908
|
<div class="config-row"><span class="key">模型</span><span class="val" id="cfg-CURSOR_MODEL">-</span></div>
|
|
909
|
+
<div class="config-row"><span class="key">备选模型</span><span class="val" id="cfg-CURSOR_ALTERNATIVE_MODEL">-</span></div>
|
|
894
910
|
<div class="config-row"><span class="key">头像电池电量</span><span class="val" id="cfg-CURSOR_AVATAR_BATTERY_MODE">-</span></div>
|
|
895
911
|
<div class="config-row" id="cfg-CURSOR_ON_DEMAND_MONTHLY_BUDGET_ROW"><span class="key">每月On demand use预算</span><span class="val" id="cfg-CURSOR_ON_DEMAND_MONTHLY_BUDGET">-</span></div>
|
|
896
912
|
<label class="agent-default-row" style="margin-top:10px"><input type="checkbox" id="dash-default-cursor" onchange="setDashboardDefaultAgent('cursor', this.checked)"> 设为默认 Agent</label>
|
|
@@ -903,6 +919,7 @@ header .badge{font-size:13px;padding:4px 12px;border-radius:12px;font-weight:500
|
|
|
903
919
|
<div class="section-detail">
|
|
904
920
|
<div class="config-row"><span class="key">CLI 路径</span><span class="val" id="cfg-CODEX_PATH">-</span></div>
|
|
905
921
|
<div class="config-row"><span class="key">模型</span><span class="val" id="cfg-CODEX_MODEL">-</span></div>
|
|
922
|
+
<div class="config-row"><span class="key">备选模型</span><span class="val" id="cfg-CODEX_ALTERNATIVE_MODEL">-</span></div>
|
|
906
923
|
<div class="config-row"><span class="key">Effort</span><span class="val" id="cfg-CODEX_EFFORT">-</span></div>
|
|
907
924
|
<label class="agent-default-row" style="margin-top:10px"><input type="checkbox" id="dash-default-codex" onchange="setDashboardDefaultAgent('codex', this.checked)"> 设为默认 Agent</label>
|
|
908
925
|
<button class="btn btn-outline" style="margin-top:8px" onclick="editSection('codex')">编辑</button>
|
|
@@ -950,8 +967,8 @@ var step2InputBound = false;
|
|
|
950
967
|
|
|
951
968
|
const AGENT_FIELDS = {
|
|
952
969
|
claude: ['CHATCCC_ANTHROPIC_MODEL','CHATCCC_ANTHROPIC_SUBAGENT_MODEL','CHATCCC_ANTHROPIC_EFFORT','CHATCCC_ANTHROPIC_API_KEY','CHATCCC_ANTHROPIC_BASE_URL','CHATCCC_ANTHROPIC_MAX_TURN'],
|
|
953
|
-
cursor: ['CHATCCC_CURSOR_PATH','CHATCCC_CURSOR_MODEL','CHATCCC_CURSOR_AVATAR_BATTERY_MODE','CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET'],
|
|
954
|
-
codex: ['CHATCCC_CODEX_PATH','CHATCCC_CODEX_MODEL','CHATCCC_CODEX_EFFORT']
|
|
970
|
+
cursor: ['CHATCCC_CURSOR_PATH','CHATCCC_CURSOR_MODEL','CHATCCC_CURSOR_ALTERNATIVE_MODEL','CHATCCC_CURSOR_AVATAR_BATTERY_MODE','CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET'],
|
|
971
|
+
codex: ['CHATCCC_CODEX_PATH','CHATCCC_CODEX_MODEL','CHATCCC_CODEX_ALTERNATIVE_MODEL','CHATCCC_CODEX_EFFORT']
|
|
955
972
|
};
|
|
956
973
|
const FEISHU_FIELDS = ['CHATCCC_APP_ID','CHATCCC_APP_SECRET'];
|
|
957
974
|
const CHROME_DEVTOOLS_FIELDS = ['CHATCCC_CHROME_DEVTOOLS_ENABLED','CHATCCC_CHROME_DEVTOOLS_PORT','CHATCCC_CHROME_DEVTOOLS_PATH'];
|
|
@@ -1217,8 +1234,8 @@ function isAgentEnabled(node, keys) {
|
|
|
1217
1234
|
}
|
|
1218
1235
|
|
|
1219
1236
|
var CLAUDE_FALLBACK_KEYS = ['model','subagentModel','effort','maxTurn'];
|
|
1220
|
-
var CURSOR_FALLBACK_KEYS = ['path','command','model'];
|
|
1221
|
-
var CODEX_FALLBACK_KEYS = ['path','command','model','effort'];
|
|
1237
|
+
var CURSOR_FALLBACK_KEYS = ['path','command','model','alternativeModel'];
|
|
1238
|
+
var CODEX_FALLBACK_KEYS = ['path','command','model','alternativeModel','effort'];
|
|
1222
1239
|
|
|
1223
1240
|
function renderStep2() {
|
|
1224
1241
|
var c = state.config || {};
|
|
@@ -1230,6 +1247,7 @@ function renderStep2() {
|
|
|
1230
1247
|
if (c.cursor) {
|
|
1231
1248
|
prefillNested('field-CHATCCC_CURSOR_PATH', c.cursor.path || c.cursor.command);
|
|
1232
1249
|
prefillNested('field-CHATCCC_CURSOR_MODEL', c.cursor.model);
|
|
1250
|
+
prefillNested('field-CHATCCC_CURSOR_ALTERNATIVE_MODEL', c.cursor.alternativeModel);
|
|
1233
1251
|
var cursorMode = c.cursor.avatarBatteryMode || 'apiPercent';
|
|
1234
1252
|
var cursorModeInput = document.getElementById('field-CHATCCC_CURSOR_AVATAR_BATTERY_MODE');
|
|
1235
1253
|
if (cursorModeInput) cursorModeInput.value = cursorMode;
|
|
@@ -1245,6 +1263,7 @@ function renderStep2() {
|
|
|
1245
1263
|
if (c.codex) {
|
|
1246
1264
|
prefillNested('field-CHATCCC_CODEX_PATH', c.codex.path || c.codex.command);
|
|
1247
1265
|
prefillNested('field-CHATCCC_CODEX_MODEL', c.codex.model);
|
|
1266
|
+
prefillNested('field-CHATCCC_CODEX_ALTERNATIVE_MODEL', c.codex.alternativeModel);
|
|
1248
1267
|
prefillNested('field-CHATCCC_CODEX_EFFORT', c.codex.effort);
|
|
1249
1268
|
}
|
|
1250
1269
|
|
|
@@ -1385,6 +1404,7 @@ function renderStep3() {
|
|
|
1385
1404
|
lines.push('<h4 style="margin:10px 0 4px;color:#334155">Cursor</h4>');
|
|
1386
1405
|
if (vars.CHATCCC_CURSOR_PATH) lines.push('<div class="config-row"><span class="key">CLI 路径</span><span class="val">' + vars.CHATCCC_CURSOR_PATH + '</span></div>');
|
|
1387
1406
|
lines.push('<div class="config-row"><span class="key">模型</span><span class="val">' + (vars.CHATCCC_CURSOR_MODEL || '(留空)') + '</span></div>');
|
|
1407
|
+
lines.push('<div class="config-row"><span class="key">备选模型</span><span class="val">' + (vars.CHATCCC_CURSOR_ALTERNATIVE_MODEL || '(留空)') + '</span></div>');
|
|
1388
1408
|
lines.push('<div class="config-row"><span class="key">头像电池电量</span><span class="val">' + cursorBatteryModeLabel(vars.CHATCCC_CURSOR_AVATAR_BATTERY_MODE) + '</span></div>');
|
|
1389
1409
|
if (vars.CHATCCC_CURSOR_AVATAR_BATTERY_MODE === 'onDemandUse') {
|
|
1390
1410
|
lines.push('<div class="config-row"><span class="key">每月On demand use预算</span><span class="val">' + (vars.CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET || '1000') + '</span></div>');
|
|
@@ -1393,6 +1413,7 @@ function renderStep3() {
|
|
|
1393
1413
|
lines.push('<h4 style="margin:10px 0 4px;color:#334155">Codex</h4>');
|
|
1394
1414
|
if (vars.CHATCCC_CODEX_PATH) lines.push('<div class="config-row"><span class="key">CLI 路径</span><span class="val">' + vars.CHATCCC_CODEX_PATH + '</span></div>');
|
|
1395
1415
|
lines.push('<div class="config-row"><span class="key">模型</span><span class="val">' + (vars.CHATCCC_CODEX_MODEL || '(留空)') + '</span></div>');
|
|
1416
|
+
lines.push('<div class="config-row"><span class="key">备选模型</span><span class="val">' + (vars.CHATCCC_CODEX_ALTERNATIVE_MODEL || '(留空)') + '</span></div>');
|
|
1396
1417
|
lines.push('<div class="config-row"><span class="key">Effort</span><span class="val">' + (vars.CHATCCC_CODEX_EFFORT || '(留空)') + '</span></div>');
|
|
1397
1418
|
}
|
|
1398
1419
|
});
|
|
@@ -1578,6 +1599,7 @@ function updateDashboardUI() {
|
|
|
1578
1599
|
document.getElementById('cfg-ANTHROPIC_MAX_TURN').textContent = (c.claude && c.claude.maxTurn != null) ? String(c.claude.maxTurn) : '0';
|
|
1579
1600
|
document.getElementById('cfg-CURSOR_PATH').textContent = (c.cursor && (c.cursor.path || c.cursor.command)) || '-';
|
|
1580
1601
|
document.getElementById('cfg-CURSOR_MODEL').textContent = (c.cursor && c.cursor.model) || '(留空)';
|
|
1602
|
+
document.getElementById('cfg-CURSOR_ALTERNATIVE_MODEL').textContent = (c.cursor && c.cursor.alternativeModel) || '(留空)';
|
|
1581
1603
|
var cursorBatteryMode = (c.cursor && c.cursor.avatarBatteryMode) || 'apiPercent';
|
|
1582
1604
|
document.getElementById('cfg-CURSOR_AVATAR_BATTERY_MODE').textContent = cursorBatteryModeLabel(cursorBatteryMode);
|
|
1583
1605
|
var cursorBudgetRow = document.getElementById('cfg-CURSOR_ON_DEMAND_MONTHLY_BUDGET_ROW');
|
|
@@ -1585,6 +1607,7 @@ function updateDashboardUI() {
|
|
|
1585
1607
|
document.getElementById('cfg-CURSOR_ON_DEMAND_MONTHLY_BUDGET').textContent = String((c.cursor && c.cursor.onDemandMonthlyBudget) || 1000);
|
|
1586
1608
|
document.getElementById('cfg-CODEX_PATH').textContent = (c.codex && (c.codex.path || c.codex.command)) || 'codex';
|
|
1587
1609
|
document.getElementById('cfg-CODEX_MODEL').textContent = (c.codex && c.codex.model) || '(留空)';
|
|
1610
|
+
document.getElementById('cfg-CODEX_ALTERNATIVE_MODEL').textContent = (c.codex && c.codex.alternativeModel) || '(留空)';
|
|
1588
1611
|
document.getElementById('cfg-CODEX_EFFORT').textContent = (c.codex && c.codex.effort) || '(留空)';
|
|
1589
1612
|
}
|
|
1590
1613
|
|
|
@@ -1651,10 +1674,10 @@ function editSection(section) {
|
|
|
1651
1674
|
'CHATCCC_CHROME_DEVTOOLS_PATH': 'Chrome 路径(选填)',
|
|
1652
1675
|
'CHATCCC_ANTHROPIC_MODEL': '模型', 'CHATCCC_ANTHROPIC_SUBAGENT_MODEL': 'Subagent 模型', 'CHATCCC_ANTHROPIC_EFFORT': 'Effort',
|
|
1653
1676
|
'CHATCCC_ANTHROPIC_API_KEY': 'API Key', 'CHATCCC_ANTHROPIC_BASE_URL': 'Base URL', 'CHATCCC_ANTHROPIC_MAX_TURN': 'Max Turns (0=无限制)',
|
|
1654
|
-
'CHATCCC_CURSOR_PATH': 'CLI 路径', 'CHATCCC_CURSOR_MODEL': '模型',
|
|
1677
|
+
'CHATCCC_CURSOR_PATH': 'CLI 路径', 'CHATCCC_CURSOR_MODEL': '模型', 'CHATCCC_CURSOR_ALTERNATIVE_MODEL': '备选模型',
|
|
1655
1678
|
'CHATCCC_CURSOR_AVATAR_BATTERY_MODE': '头像电池电量',
|
|
1656
1679
|
'CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET': '每月On demand use预算',
|
|
1657
|
-
'CHATCCC_CODEX_PATH': 'CLI 路径', 'CHATCCC_CODEX_MODEL': '模型', 'CHATCCC_CODEX_EFFORT': 'Effort'
|
|
1680
|
+
'CHATCCC_CODEX_PATH': 'CLI 路径', 'CHATCCC_CODEX_MODEL': '模型', 'CHATCCC_CODEX_ALTERNATIVE_MODEL': '备选模型', 'CHATCCC_CODEX_EFFORT': 'Effort'
|
|
1658
1681
|
};
|
|
1659
1682
|
var hintMap = {
|
|
1660
1683
|
'CHATCCC_CHROME_DEVTOOLS_ENABLED': '依赖:本机 Google Chrome;ChatGPT 订阅到期查询需要在该 CDP Chrome 中登录 ChatGPT。',
|
|
@@ -1687,11 +1710,13 @@ function editSection(section) {
|
|
|
1687
1710
|
} else if (section === 'cursor' && state.config.cursor) {
|
|
1688
1711
|
if (key === 'CHATCCC_CURSOR_PATH') val = state.config.cursor.path || state.config.cursor.command || '';
|
|
1689
1712
|
else if (key === 'CHATCCC_CURSOR_MODEL') val = state.config.cursor.model || '';
|
|
1713
|
+
else if (key === 'CHATCCC_CURSOR_ALTERNATIVE_MODEL') val = state.config.cursor.alternativeModel || '';
|
|
1690
1714
|
else if (key === 'CHATCCC_CURSOR_AVATAR_BATTERY_MODE') val = state.config.cursor.avatarBatteryMode || 'apiPercent';
|
|
1691
1715
|
else if (key === 'CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET') val = (state.config.cursor.onDemandMonthlyBudget != null) ? String(state.config.cursor.onDemandMonthlyBudget) : '1000';
|
|
1692
1716
|
} else if (section === 'codex' && state.config.codex) {
|
|
1693
1717
|
if (key === 'CHATCCC_CODEX_PATH') val = state.config.codex.path || state.config.codex.command || '';
|
|
1694
1718
|
else if (key === 'CHATCCC_CODEX_MODEL') val = state.config.codex.model || '';
|
|
1719
|
+
else if (key === 'CHATCCC_CODEX_ALTERNATIVE_MODEL') val = state.config.codex.alternativeModel || '';
|
|
1695
1720
|
else if (key === 'CHATCCC_CODEX_EFFORT') val = state.config.codex.effort || '';
|
|
1696
1721
|
}
|
|
1697
1722
|
}
|