chatccc 0.2.272 → 0.2.276
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 +24 -22
- package/config.sample.json +4 -4
- package/deepccc-agent/README.md +147 -79
- package/deepccc-agent/package.json +68 -65
- package/dist/deepccc-agent/src/attachments.js +192 -0
- package/dist/deepccc-agent/src/cli.js +54 -13
- package/dist/deepccc-agent/src/config.js +49 -4
- package/dist/deepccc-agent/src/context.js +299 -16
- package/dist/deepccc-agent/src/file-tools.js +33 -0
- package/dist/deepccc-agent/src/index.js +48 -16
- package/dist/deepccc-agent/src/tool-protocol.js +14 -3
- package/dist/deepccc-agent/src/web-entry.js +72 -0
- package/dist/deepccc-agent/src/web-page.js +414 -0
- package/dist/deepccc-agent/src/web-runtime.js +331 -0
- package/dist/deepccc-agent/src/web-server.js +476 -0
- package/dist/deepccc-agent/src/web-session-store.js +162 -0
- package/dist/deepccc-agent/src/web-tool-presentation.js +123 -0
- package/dist/src/adapters/ccc-adapter.js +1 -0
- package/dist/src/agent-capability-grants.js +26 -0
- package/dist/src/agent-delegate-task.js +5 -2
- package/dist/src/agent-file-rpc.js +6 -1
- package/dist/src/agent-image-rpc.js +6 -1
- package/dist/src/agent-team/web/agent-team-page.js +250 -250
- package/dist/src/cards.js +7 -4
- package/dist/src/im-skills.js +9 -2
- package/dist/src/orchestrator.js +117 -29
- package/dist/src/session-name.js +15 -0
- package/dist/src/session.js +43 -7
- package/dist/src/web-ui.js +68 -51
- package/im-skills/feishu-skill/receive-send-file.md +3 -2
- package/im-skills/feishu-skill/receive-send-image.md +3 -2
- package/im-skills/feishu-skill/send-file.mjs +6 -5
- package/im-skills/feishu-skill/send-image.mjs +6 -5
- package/im-skills/feishu-skill/skill.md +4 -2
- package/package.json +76 -76
package/dist/src/web-ui.js
CHANGED
|
@@ -692,8 +692,9 @@ header{background:#0f172a;color:#fff;padding:16px 24px;display:flex;align-items:
|
|
|
692
692
|
header h1{font-size:20px;font-weight:600}
|
|
693
693
|
header .badge{font-size:13px;padding:4px 12px;border-radius:12px;font-weight:500}
|
|
694
694
|
.header-actions{display:flex;align-items:center;gap:12px}
|
|
695
|
-
.agent-team-entry{display:inline-flex;align-items:center;gap:8px;padding:9px 16px;border:1px solid rgba(255,255,255,.2);border-radius:999px;background:linear-gradient(135deg,#6366f1,#8b5cf6 55%,#d946ef);color:#fff;text-decoration:none;font-size:14px;font-weight:700;letter-spacing:.01em;box-shadow:0 8px 24px rgba(99,102,241,.38);transition:transform .18s ease,box-shadow .18s ease,filter .18s ease}
|
|
696
|
-
.
|
|
695
|
+
.agent-team-entry,.deepccc-web-entry{display:inline-flex;align-items:center;gap:8px;padding:9px 16px;border:1px solid rgba(255,255,255,.2);border-radius:999px;background:linear-gradient(135deg,#6366f1,#8b5cf6 55%,#d946ef);color:#fff;text-decoration:none;font-size:14px;font-weight:700;letter-spacing:.01em;box-shadow:0 8px 24px rgba(99,102,241,.38);transition:transform .18s ease,box-shadow .18s ease,filter .18s ease}
|
|
696
|
+
.deepccc-web-entry{background:linear-gradient(135deg,#171a23,#413a76);box-shadow:0 8px 24px rgba(42,38,78,.38)}
|
|
697
|
+
.agent-team-entry:hover,.deepccc-web-entry:hover{transform:translateY(-2px);box-shadow:0 12px 30px rgba(139,92,246,.52);filter:saturate(1.16)}
|
|
697
698
|
.agent-team-entry:focus-visible{outline:3px solid rgba(196,181,253,.65);outline-offset:3px}
|
|
698
699
|
.agent-team-entry .agent-team-icon{font-size:16px;line-height:1}
|
|
699
700
|
.badge-running{background:#16a34a;color:#fff}
|
|
@@ -769,14 +770,15 @@ header .badge{font-size:13px;padding:4px 12px;border-radius:12px;font-weight:500
|
|
|
769
770
|
@keyframes slideIn{from{transform:translateX(100%);opacity:0}to{transform:translateX(0);opacity:1}}
|
|
770
771
|
.spinner{display:inline-block;width:14px;height:14px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .6s linear infinite}
|
|
771
772
|
@keyframes spin{to{transform:rotate(360deg)}}
|
|
772
|
-
@media(max-width:520px){header{padding:12px 14px}.header-actions{gap:8px}.agent-team-entry{padding:8px 11px;font-size:13px}header .badge{padding:4px 8px}}
|
|
773
|
+
@media(max-width:520px){header{padding:12px 14px}.header-actions{gap:8px}.agent-team-entry,.deepccc-web-entry{padding:8px 11px;font-size:13px}header .badge{padding:4px 8px}.deepccc-web-entry span:last-child{display:none}}
|
|
773
774
|
</style>
|
|
774
775
|
</head>
|
|
775
776
|
<body>
|
|
776
777
|
<header>
|
|
777
778
|
<h1>ChatCCC</h1>
|
|
778
|
-
<div class="header-actions">
|
|
779
|
-
<
|
|
779
|
+
<div class="header-actions">
|
|
780
|
+
<button type="button" class="deepccc-web-entry" onclick="openDeepCccWeb()"><span aria-hidden="true">D</span><span>DeepCCC Web</span></button>
|
|
781
|
+
<a href="/agent-team" class="agent-team-entry"><span class="agent-team-icon" aria-hidden="true">✦</span>Agent Team <span aria-hidden="true">→</span></a>
|
|
780
782
|
<span id="header-badge" class="badge badge-stopped">未启动</span>
|
|
781
783
|
</div>
|
|
782
784
|
</header>
|
|
@@ -939,25 +941,25 @@ header .badge{font-size:13px;padding:4px 12px;border-radius:12px;font-weight:500
|
|
|
939
941
|
</select>
|
|
940
942
|
<div class="hint">开启时追加 DeepCCC 共同作者,不替换你的 Git Author。</div>
|
|
941
943
|
</div>
|
|
942
|
-
<div class="form-group">
|
|
943
|
-
<label>Effort(推理强度,选填)</label>
|
|
944
|
-
<select id="field-CHATCCC_CCC_EFFORT">
|
|
945
|
-
<option value="">跟随 DeepCCC 内核配置(默认)</option>
|
|
946
|
-
<option value="none">none - 直接作答,最省 token</option>
|
|
944
|
+
<div class="form-group">
|
|
945
|
+
<label>Effort(推理强度,选填)</label>
|
|
946
|
+
<select id="field-CHATCCC_CCC_EFFORT">
|
|
947
|
+
<option value="">跟随 DeepCCC 内核配置(默认)</option>
|
|
948
|
+
<option value="none">none - 直接作答,最省 token</option>
|
|
947
949
|
<option value="minimal">minimal</option>
|
|
948
950
|
<option value="low">low</option>
|
|
949
951
|
<option value="medium">medium</option>
|
|
950
952
|
<option value="high">high</option>
|
|
951
953
|
<option value="xhigh">xhigh</option>
|
|
952
|
-
<option value="max">max - 最强推理</option>
|
|
953
|
-
</select>
|
|
954
|
-
<div class="hint">留空时读取 ~/.deepccc/config.json 或 DEEPCCC_EFFORT;DeepCCC 也留空时使用模型服务端默认值。</div>
|
|
955
|
-
</div>
|
|
956
|
-
<div class="form-group">
|
|
957
|
-
<label>最大输出 Token(选填)</label>
|
|
958
|
-
<input type="number" id="field-CHATCCC_CCC_MAX_OUTPUT_TOKENS" min="1" step="1" placeholder="留空跟随 DeepCCC 内核配置">
|
|
959
|
-
<div class="hint">限制主对话单次输出长度。留空时读取 ~/.deepccc/config.json 或 DEEPCCC_MAX_OUTPUT_TOKENS;DeepCCC 也未配置时使用模型服务端默认值。</div>
|
|
960
|
-
</div>
|
|
954
|
+
<option value="max">max - 最强推理</option>
|
|
955
|
+
</select>
|
|
956
|
+
<div class="hint">留空时读取 ~/.deepccc/config.json 或 DEEPCCC_EFFORT;DeepCCC 也留空时使用模型服务端默认值。</div>
|
|
957
|
+
</div>
|
|
958
|
+
<div class="form-group">
|
|
959
|
+
<label>最大输出 Token(选填)</label>
|
|
960
|
+
<input type="number" id="field-CHATCCC_CCC_MAX_OUTPUT_TOKENS" min="1" step="1" placeholder="留空跟随 DeepCCC 内核配置">
|
|
961
|
+
<div class="hint">限制主对话单次输出长度。留空时读取 ~/.deepccc/config.json 或 DEEPCCC_MAX_OUTPUT_TOKENS;DeepCCC 也未配置时使用模型服务端默认值。</div>
|
|
962
|
+
</div>
|
|
961
963
|
<div class="form-group">
|
|
962
964
|
<label>上下文窗口(模型最大上下文)</label>
|
|
963
965
|
<select id="field-CHATCCC_CCC_CONTEXT_WINDOW" onchange="onContextWindowPresetChange('field-', this.value)">
|
|
@@ -1290,12 +1292,12 @@ header .badge{font-size:13px;padding:4px 12px;border-radius:12px;font-weight:500
|
|
|
1290
1292
|
<div class="config-row"><span class="key">API Key</span><span class="val" id="cfg-CCC_API_KEY">-</span></div>
|
|
1291
1293
|
<div class="config-row"><span class="key">Base URL</span><span class="val" id="cfg-CCC_BASE_URL">-</span></div>
|
|
1292
1294
|
<div class="config-row"><span class="key">API 协议</span><span class="val" id="cfg-CCC_PROVIDER">-</span></div>
|
|
1293
|
-
<div class="config-row"><span class="key">模型</span><span class="val" id="cfg-CCC_MODEL">-</span></div>
|
|
1294
|
-
<div class="config-row"><span class="key">子模型</span><span class="val" id="cfg-CCC_SUB_MODEL">-</span></div>
|
|
1295
|
-
<div class="config-row"><span class="key">备选模型</span><span class="val" id="cfg-CCC_ALTERNATIVE_MODEL">-</span></div>
|
|
1296
|
-
<div class="config-row"><span class="key">Effort</span><span class="val" id="cfg-CCC_EFFORT">-</span></div>
|
|
1297
|
-
<div class="config-row"><span class="key">最大输出 Token</span><span class="val" id="cfg-CCC_MAX_OUTPUT_TOKENS">-</span></div>
|
|
1298
|
-
<div class="config-row"><span class="key">Git 共同作者</span><span class="val" id="cfg-CCC_GIT_COAUTHOR">-</span></div>
|
|
1295
|
+
<div class="config-row"><span class="key">模型</span><span class="val" id="cfg-CCC_MODEL">-</span></div>
|
|
1296
|
+
<div class="config-row"><span class="key">子模型</span><span class="val" id="cfg-CCC_SUB_MODEL">-</span></div>
|
|
1297
|
+
<div class="config-row"><span class="key">备选模型</span><span class="val" id="cfg-CCC_ALTERNATIVE_MODEL">-</span></div>
|
|
1298
|
+
<div class="config-row"><span class="key">Effort</span><span class="val" id="cfg-CCC_EFFORT">-</span></div>
|
|
1299
|
+
<div class="config-row"><span class="key">最大输出 Token</span><span class="val" id="cfg-CCC_MAX_OUTPUT_TOKENS">-</span></div>
|
|
1300
|
+
<div class="config-row"><span class="key">Git 共同作者</span><span class="val" id="cfg-CCC_GIT_COAUTHOR">-</span></div>
|
|
1299
1301
|
<label class="agent-default-row" style="margin-top:10px"><input type="checkbox" id="dash-default-ccc" onchange="setDashboardDefaultAgent('ccc', this.checked)"> 设为默认 Agent</label>
|
|
1300
1302
|
<div class="hint" style="margin-top:6px;line-height:1.6">备选模型仅加入 /model 人工切换列表;保存后下一条消息或下个新会话生效。</div>
|
|
1301
1303
|
<button class="btn btn-outline" style="margin-top:8px" onclick="editSection('ccc')">编辑</button>
|
|
@@ -1346,7 +1348,7 @@ const AGENT_FIELDS = {
|
|
|
1346
1348
|
claude: ['CHATCCC_ANTHROPIC_MODEL','CHATCCC_ANTHROPIC_SUBAGENT_MODEL','CHATCCC_ANTHROPIC_EFFORT','CHATCCC_ANTHROPIC_API_KEY','CHATCCC_ANTHROPIC_BASE_URL','CHATCCC_ANTHROPIC_MAX_TURN'],
|
|
1347
1349
|
cursor: ['CHATCCC_CURSOR_PATH','CHATCCC_CURSOR_MODEL','CHATCCC_CURSOR_ALTERNATIVE_MODEL','CHATCCC_CURSOR_AVATAR_BATTERY_MODE','CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET'],
|
|
1348
1350
|
codex: ['CHATCCC_CODEX_PATH','CHATCCC_CODEX_MODEL','CHATCCC_CODEX_ALTERNATIVE_MODEL','CHATCCC_CODEX_EFFORT','CHATCCC_CODEX_FAST_MODE'],
|
|
1349
|
-
ccc: ['CHATCCC_CCC_API_KEY','CHATCCC_CCC_BASE_URL','CHATCCC_CCC_MODEL','CHATCCC_CCC_SUB_MODEL','CHATCCC_CCC_ALTERNATIVE_MODEL','CHATCCC_CCC_EFFORT','CHATCCC_CCC_MAX_OUTPUT_TOKENS','CHATCCC_CCC_PROVIDER','CHATCCC_CCC_GIT_COAUTHOR','CHATCCC_CCC_CONTEXT_WINDOW'],
|
|
1351
|
+
ccc: ['CHATCCC_CCC_API_KEY','CHATCCC_CCC_BASE_URL','CHATCCC_CCC_MODEL','CHATCCC_CCC_SUB_MODEL','CHATCCC_CCC_ALTERNATIVE_MODEL','CHATCCC_CCC_EFFORT','CHATCCC_CCC_MAX_OUTPUT_TOKENS','CHATCCC_CCC_PROVIDER','CHATCCC_CCC_GIT_COAUTHOR','CHATCCC_CCC_CONTEXT_WINDOW'],
|
|
1350
1352
|
dsh: ['CHATCCC_DSH_API_KEY','CHATCCC_DSH_BASE_URL','CHATCCC_DSH_MODEL','CHATCCC_DSH_SUB_MODEL','CHATCCC_DSH_ALTERNATIVE_MODEL','CHATCCC_DSH_PROVIDER','CHATCCC_DSH_MAX_TOKENS']
|
|
1351
1353
|
};
|
|
1352
1354
|
const FEISHU_FIELDS = ['CHATCCC_APP_ID','CHATCCC_APP_SECRET'];
|
|
@@ -1743,8 +1745,8 @@ function renderStep2() {
|
|
|
1743
1745
|
prefillNested('field-CHATCCC_CCC_MODEL', c.ccc.model);
|
|
1744
1746
|
prefillNested('field-CHATCCC_CCC_SUB_MODEL', c.ccc.subModel);
|
|
1745
1747
|
prefillNested('field-CHATCCC_CCC_ALTERNATIVE_MODEL', c.ccc.alternativeModel);
|
|
1746
|
-
prefillNested('field-CHATCCC_CCC_EFFORT', c.ccc.effort);
|
|
1747
|
-
prefillNested('field-CHATCCC_CCC_MAX_OUTPUT_TOKENS', c.ccc.maxOutputTokens);
|
|
1748
|
+
prefillNested('field-CHATCCC_CCC_EFFORT', c.ccc.effort);
|
|
1749
|
+
prefillNested('field-CHATCCC_CCC_MAX_OUTPUT_TOKENS', c.ccc.maxOutputTokens);
|
|
1748
1750
|
prefillContextWindow('field-', c.ccc.contextWindow);
|
|
1749
1751
|
}
|
|
1750
1752
|
if (c.dsh) {
|
|
@@ -1952,8 +1954,8 @@ function renderStep3() {
|
|
|
1952
1954
|
lines.push('<div class="config-row"><span class="key">模型</span><span class="val">' + (vars.CHATCCC_CCC_MODEL || '(留空)') + '</span></div>');
|
|
1953
1955
|
lines.push('<div class="config-row"><span class="key">子模型</span><span class="val">' + (vars.CHATCCC_CCC_SUB_MODEL || '(留空,跟随主模型)') + '</span></div>');
|
|
1954
1956
|
lines.push('<div class="config-row"><span class="key">备选模型</span><span class="val">' + (vars.CHATCCC_CCC_ALTERNATIVE_MODEL || '(留空)') + '</span></div>');
|
|
1955
|
-
lines.push('<div class="config-row"><span class="key">Effort</span><span class="val">' + (vars.CHATCCC_CCC_EFFORT || '(留空)') + '</span></div>');
|
|
1956
|
-
lines.push('<div class="config-row"><span class="key">最大输出 Token</span><span class="val">' + (vars.CHATCCC_CCC_MAX_OUTPUT_TOKENS || '(跟随 DeepCCC)') + '</span></div>');
|
|
1957
|
+
lines.push('<div class="config-row"><span class="key">Effort</span><span class="val">' + (vars.CHATCCC_CCC_EFFORT || '(留空)') + '</span></div>');
|
|
1958
|
+
lines.push('<div class="config-row"><span class="key">最大输出 Token</span><span class="val">' + (vars.CHATCCC_CCC_MAX_OUTPUT_TOKENS || '(跟随 DeepCCC)') + '</span></div>');
|
|
1957
1959
|
lines.push('<div class="config-row"><span class="key">上下文窗口</span><span class="val">' + contextWindowTokensLabel(vars.CHATCCC_CCC_CONTEXT_WINDOW || 1048576) + '</span></div>');
|
|
1958
1960
|
} else if (t === 'dsh') {
|
|
1959
1961
|
lines.push('<h4 style="margin:10px 0 4px;color:#334155">DeepSeek Harness</h4>');
|
|
@@ -2182,13 +2184,13 @@ function updateDashboardUI() {
|
|
|
2182
2184
|
document.getElementById('cfg-CCC_API_KEY').textContent = (c.ccc && c.ccc.DEEPSEEK_API_KEY) ? '***已设置***' : '(留空)';
|
|
2183
2185
|
document.getElementById('cfg-CCC_BASE_URL').textContent = (c.ccc && c.ccc.DEEPSEEK_BASE_URL) || '(留空)';
|
|
2184
2186
|
document.getElementById('cfg-CCC_PROVIDER').textContent = (c.ccc && c.ccc.provider) ? c.ccc.provider : '(跟随 DeepCCC 内核配置)';
|
|
2185
|
-
document.getElementById('cfg-CCC_MODEL').textContent = (c.ccc && c.ccc.model) || '(留空)';
|
|
2186
|
-
document.getElementById('cfg-CCC_SUB_MODEL').textContent = (c.ccc && c.ccc.subModel) || '(留空,跟随主模型)';
|
|
2187
|
-
document.getElementById('cfg-CCC_ALTERNATIVE_MODEL').textContent = (c.ccc && c.ccc.alternativeModel) || '(留空)';
|
|
2188
|
-
document.getElementById('cfg-CCC_EFFORT').textContent = (c.ccc && c.ccc.effort) || '(跟随 DeepCCC 内核配置)';
|
|
2189
|
-
document.getElementById('cfg-CCC_MAX_OUTPUT_TOKENS').textContent = c.ccc && c.ccc.maxOutputTokens
|
|
2190
|
-
? String(c.ccc.maxOutputTokens)
|
|
2191
|
-
: '(跟随 DeepCCC 内核配置)';
|
|
2187
|
+
document.getElementById('cfg-CCC_MODEL').textContent = (c.ccc && c.ccc.model) || '(留空)';
|
|
2188
|
+
document.getElementById('cfg-CCC_SUB_MODEL').textContent = (c.ccc && c.ccc.subModel) || '(留空,跟随主模型)';
|
|
2189
|
+
document.getElementById('cfg-CCC_ALTERNATIVE_MODEL').textContent = (c.ccc && c.ccc.alternativeModel) || '(留空)';
|
|
2190
|
+
document.getElementById('cfg-CCC_EFFORT').textContent = (c.ccc && c.ccc.effort) || '(跟随 DeepCCC 内核配置)';
|
|
2191
|
+
document.getElementById('cfg-CCC_MAX_OUTPUT_TOKENS').textContent = c.ccc && c.ccc.maxOutputTokens
|
|
2192
|
+
? String(c.ccc.maxOutputTokens)
|
|
2193
|
+
: '(跟随 DeepCCC 内核配置)';
|
|
2192
2194
|
document.getElementById('cfg-CCC_GIT_COAUTHOR').textContent = !c.ccc || c.ccc.gitCoAuthor == null
|
|
2193
2195
|
? '跟随 DeepCCC 全局设置(缺省开启)'
|
|
2194
2196
|
: (c.ccc.gitCoAuthor ? '强制开启' : '强制关闭');
|
|
@@ -2277,7 +2279,7 @@ function editSection(section) {
|
|
|
2277
2279
|
'CHATCCC_CCC_API_KEY': 'API Key', 'CHATCCC_CCC_BASE_URL': 'Base URL',
|
|
2278
2280
|
'CHATCCC_CCC_PROVIDER': 'API 协议(选填)',
|
|
2279
2281
|
'CHATCCC_CCC_GIT_COAUTHOR': 'Git 提交共同作者',
|
|
2280
|
-
'CHATCCC_CCC_MODEL': '模型', 'CHATCCC_CCC_SUB_MODEL': '子模型', 'CHATCCC_CCC_ALTERNATIVE_MODEL': '备选模型', 'CHATCCC_CCC_EFFORT': 'Effort', 'CHATCCC_CCC_MAX_OUTPUT_TOKENS': '最大输出 Token', 'CHATCCC_CCC_CONTEXT_WINDOW': '上下文窗口',
|
|
2282
|
+
'CHATCCC_CCC_MODEL': '模型', 'CHATCCC_CCC_SUB_MODEL': '子模型', 'CHATCCC_CCC_ALTERNATIVE_MODEL': '备选模型', 'CHATCCC_CCC_EFFORT': 'Effort', 'CHATCCC_CCC_MAX_OUTPUT_TOKENS': '最大输出 Token', 'CHATCCC_CCC_CONTEXT_WINDOW': '上下文窗口',
|
|
2281
2283
|
'CHATCCC_DSH_API_KEY': 'API Key', 'CHATCCC_DSH_BASE_URL': 'Base URL', 'CHATCCC_DSH_MODEL': '模型', 'CHATCCC_DSH_SUB_MODEL': '子模型', 'CHATCCC_DSH_ALTERNATIVE_MODEL': '备选模型', 'CHATCCC_DSH_PROVIDER': 'Provider 路由', 'CHATCCC_DSH_MAX_TOKENS': '单次最大输出 Tokens'
|
|
2282
2284
|
};
|
|
2283
2285
|
var hintMap = {
|
|
@@ -2285,9 +2287,9 @@ function editSection(section) {
|
|
|
2285
2287
|
'CHATCCC_CHROME_DEVTOOLS_ENABLED': '依赖:本机 Google Chrome;ChatGPT 订阅到期查询需要在该 CDP Chrome 中登录 ChatGPT。',
|
|
2286
2288
|
'CHATCCC_CHROME_DEVTOOLS_PORT': '默认 15166,健康检查端点为 http://127.0.0.1:15166/json/version。',
|
|
2287
2289
|
'CHATCCC_CHROME_DEVTOOLS_PATH': '选填。留空时自动探测 Google Chrome。',
|
|
2288
|
-
'CHATCCC_CCC_PROVIDER': '与 Base URL 强相关:OpenAI 兼容端点选 openai;Anthropic Messages 端点选 anthropic。留空 = 跟随 DeepCCC 内核配置(~/.deepccc/config.json 或 DEEPCCC_PROVIDER),改动需重启 ChatCCC 生效。',
|
|
2289
|
-
'CHATCCC_CCC_EFFORT': '留空 = 跟随 DeepCCC 内核配置(~/.deepccc/config.json 或 DEEPCCC_EFFORT);内核也留空时使用模型服务端默认值。',
|
|
2290
|
-
'CHATCCC_CCC_MAX_OUTPUT_TOKENS': '正整数;留空 = 跟随 DeepCCC 内核配置(~/.deepccc/config.json 或 DEEPCCC_MAX_OUTPUT_TOKENS);内核也未配置时使用模型服务端默认值。',
|
|
2290
|
+
'CHATCCC_CCC_PROVIDER': '与 Base URL 强相关:OpenAI 兼容端点选 openai;Anthropic Messages 端点选 anthropic。留空 = 跟随 DeepCCC 内核配置(~/.deepccc/config.json 或 DEEPCCC_PROVIDER),改动需重启 ChatCCC 生效。',
|
|
2291
|
+
'CHATCCC_CCC_EFFORT': '留空 = 跟随 DeepCCC 内核配置(~/.deepccc/config.json 或 DEEPCCC_EFFORT);内核也留空时使用模型服务端默认值。',
|
|
2292
|
+
'CHATCCC_CCC_MAX_OUTPUT_TOKENS': '正整数;留空 = 跟随 DeepCCC 内核配置(~/.deepccc/config.json 或 DEEPCCC_MAX_OUTPUT_TOKENS);内核也未配置时使用模型服务端默认值。',
|
|
2291
2293
|
'CHATCCC_CCC_GIT_COAUTHOR': '跟随全局时读取 ~/.deepccc/config.json 的 git.coAuthor.enabled(缺省为开启)。强制选项只影响 ChatCCC 内置 CCC Agent。',
|
|
2292
2294
|
'CHATCCC_CCC_CONTEXT_WINDOW': '压缩阈值自动 = 窗口 × 80%(超出即把较早消息压缩为摘要)。⚠️ 超过模型/服务端实际上限时请求会被 API 直接拒绝(context length exceeded),实际窗口以模型与所用服务端为准(如 litellm 代理的 max_input_tokens);单位 k = 1024 tokens,1M = 1,048,576 tokens。',
|
|
2293
2295
|
'CHATCCC_CCC_SUB_MODEL': '用于 DeepCCC 内部轻量环节(上下文压缩摘要生成、task 子代理任务)。留空 = 跟随主模型;改动需重启 ChatCCC 生效。'
|
|
@@ -2337,8 +2339,8 @@ function editSection(section) {
|
|
|
2337
2339
|
else if (key === 'CHATCCC_CCC_MODEL') val = state.config.ccc.model || '';
|
|
2338
2340
|
else if (key === 'CHATCCC_CCC_SUB_MODEL') val = state.config.ccc.subModel || '';
|
|
2339
2341
|
else if (key === 'CHATCCC_CCC_ALTERNATIVE_MODEL') val = state.config.ccc.alternativeModel || '';
|
|
2340
|
-
else if (key === 'CHATCCC_CCC_EFFORT') val = state.config.ccc.effort || '';
|
|
2341
|
-
else if (key === 'CHATCCC_CCC_MAX_OUTPUT_TOKENS') val = state.config.ccc.maxOutputTokens || '';
|
|
2342
|
+
else if (key === 'CHATCCC_CCC_EFFORT') val = state.config.ccc.effort || '';
|
|
2343
|
+
else if (key === 'CHATCCC_CCC_MAX_OUTPUT_TOKENS') val = state.config.ccc.maxOutputTokens || '';
|
|
2342
2344
|
else if (key === 'CHATCCC_CCC_CONTEXT_WINDOW') val = state.config.ccc.contextWindow || '1048576';
|
|
2343
2345
|
} else if (section === 'dsh' && state.config.dsh) {
|
|
2344
2346
|
if (key === 'CHATCCC_DSH_API_KEY') val = state.config.dsh.apiKey || '';
|
|
@@ -2403,15 +2405,15 @@ function editSection(section) {
|
|
|
2403
2405
|
var rowId = key === 'CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET'
|
|
2404
2406
|
? ' id="edit-cursor-on-demand-budget-row"'
|
|
2405
2407
|
: (section === 'chromeDevtools' && key !== 'CHATCCC_CHROME_DEVTOOLS_ENABLED' ? ' id="edit-row-' + key + '"' : '');
|
|
2406
|
-
var isNumber = key === 'CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET' || key === 'CHATCCC_CHROME_DEVTOOLS_PORT' || key === 'CHATCCC_CCC_MAX_OUTPUT_TOKENS';
|
|
2408
|
+
var isNumber = key === 'CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET' || key === 'CHATCCC_CHROME_DEVTOOLS_PORT' || key === 'CHATCCC_CCC_MAX_OUTPUT_TOKENS';
|
|
2407
2409
|
var inputType = isNumber ? 'number' : (isSecret ? 'password' : 'text');
|
|
2408
2410
|
var attrs = key === 'CHATCCC_CURSOR_ON_DEMAND_MONTHLY_BUDGET'
|
|
2409
2411
|
? ' min="1" step="1"'
|
|
2410
|
-
: key === 'CHATCCC_CHROME_DEVTOOLS_PORT'
|
|
2411
|
-
? ' min="1" max="65535" step="1" placeholder="15166"'
|
|
2412
|
-
: key === 'CHATCCC_CCC_MAX_OUTPUT_TOKENS'
|
|
2413
|
-
? ' min="1" step="1" placeholder="留空跟随 DeepCCC 内核配置"'
|
|
2414
|
-
: '';
|
|
2412
|
+
: key === 'CHATCCC_CHROME_DEVTOOLS_PORT'
|
|
2413
|
+
? ' min="1" max="65535" step="1" placeholder="15166"'
|
|
2414
|
+
: key === 'CHATCCC_CCC_MAX_OUTPUT_TOKENS'
|
|
2415
|
+
? ' min="1" step="1" placeholder="留空跟随 DeepCCC 内核配置"'
|
|
2416
|
+
: '';
|
|
2415
2417
|
html += '<div class="form-group"' + rowId + '><label>' + (labelMap[key] || key) + '</label>';
|
|
2416
2418
|
html += '<input type="' + inputType + '" id="edit-' + key + '"' + attrs + ' value="' + String(val).replace(/"/g,'"') + '">';
|
|
2417
2419
|
if (hintMap[key]) html += '<div class="hint" style="margin-top:6px;line-height:1.5">' + hintMap[key] + '</div>';
|
|
@@ -2593,8 +2595,18 @@ function installEngine(engineId) {
|
|
|
2593
2595
|
});
|
|
2594
2596
|
}
|
|
2595
2597
|
|
|
2596
|
-
// ---- Start ----
|
|
2597
|
-
|
|
2598
|
+
// ---- Start ----
|
|
2599
|
+
async function openDeepCccWeb() {
|
|
2600
|
+
try {
|
|
2601
|
+
var result = await api('/api/deepccc-web/start', 'POST');
|
|
2602
|
+
if (!result.ok) throw new Error(result.error || '启动失败');
|
|
2603
|
+
window.open(result.url, '_blank', 'noopener');
|
|
2604
|
+
} catch (error) {
|
|
2605
|
+
toast('DeepCCC Web 启动失败: ' + String(error), 'error');
|
|
2606
|
+
}
|
|
2607
|
+
}
|
|
2608
|
+
|
|
2609
|
+
init();
|
|
2598
2610
|
|
|
2599
2611
|
// 页面刷新后从持久化任务文件恢复每一步的安装进度。
|
|
2600
2612
|
setTimeout(function(){ engineRefreshStatus('claude'); engineRefreshStatus('dsh'); }, 300);
|
|
@@ -2627,6 +2639,11 @@ async function handleRequest(req, res) {
|
|
|
2627
2639
|
return handleStopService(req, res);
|
|
2628
2640
|
if (url === "/api/restart" && method === "POST")
|
|
2629
2641
|
return handleRestartService(req, res);
|
|
2642
|
+
if (url === "/api/deepccc-web/start" && method === "POST") {
|
|
2643
|
+
const { launchDeepCccWebProcess } = await import("../deepccc-agent/src/web-server.js");
|
|
2644
|
+
const handle = await launchDeepCccWebProcess({ reuseExisting: true, openBrowser: false, defaultCwd: process.cwd() });
|
|
2645
|
+
return jsonReply(res, 200, { ok: true, url: handle.url, port: handle.port, reused: handle.reused });
|
|
2646
|
+
}
|
|
2630
2647
|
if (url === "/api/validate" && method === "POST")
|
|
2631
2648
|
return handleValidate(req, res);
|
|
2632
2649
|
if (url === "/api/ilink/forget" && method === "POST")
|
|
@@ -9,7 +9,7 @@ Videos are sent as regular files (not media), which looks cleaner in Feishu.
|
|
|
9
9
|
### Script
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
node "{{send_file_script}}" --url "{{send_file_url}}" --session-id "{{session_id}}" --path "<absolute file path>" --caption "<optional caption>"
|
|
12
|
+
node "{{send_file_script}}" --url "{{send_file_url}}" --session-id "{{session_id}}" --grant "{{agent_capability_grant}}" --path "<absolute file path>" --caption "<optional caption>"
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
### Rules
|
|
@@ -17,6 +17,7 @@ node "{{send_file_script}}" --url "{{send_file_url}}" --session-id "{{session_id
|
|
|
17
17
|
- Use the node script above — never curl or raw HTTP.
|
|
18
18
|
- Save or choose a local file first.
|
|
19
19
|
- Use an absolute local path.
|
|
20
|
+
- Use only the session ID and capability grant shown above; they are a bound pair.
|
|
20
21
|
- Max file size: 30MB.
|
|
21
22
|
- Supported formats: .mp4 .mov .avi .mkv .webm .flv .mp3 .wav .ogg .aac .m4a .pdf .doc .docx .xls .xlsx .csv .ppt .pptx .txt .zip .tar .gz.
|
|
22
23
|
- Only send a file/video when the user asked for one or when it materially helps the answer.
|
|
@@ -61,4 +62,4 @@ If only `chat_id` and `file_key` are available:
|
|
|
61
62
|
node "{{download_video_script}}" --chat-id <chat_id> --file-key <file_key> --name <file_name>
|
|
62
63
|
```
|
|
63
64
|
|
|
64
|
-
Downloads are saved under `~/.chatccc/videos/downloads/`.
|
|
65
|
+
Downloads are saved under `~/.chatccc/videos/downloads/`.
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
### Script
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
node "{{send_image_script}}" --url "{{send_image_url}}" --session-id "{{session_id}}" --path "<absolute image path>" --caption "<optional caption>"
|
|
10
|
+
node "{{send_image_script}}" --url "{{send_image_url}}" --session-id "{{session_id}}" --grant "{{agent_capability_grant}}" --path "<absolute image path>" --caption "<optional caption>"
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
### Rules
|
|
@@ -15,6 +15,7 @@ node "{{send_image_script}}" --url "{{send_image_url}}" --session-id "{{session_
|
|
|
15
15
|
- Use the node script above — never curl or raw HTTP.
|
|
16
16
|
- Save or choose a local image file first.
|
|
17
17
|
- Use an absolute local path.
|
|
18
|
+
- Use only the session ID and capability grant shown above; they are a bound pair.
|
|
18
19
|
- Supported formats: .png, .jpg, .jpeg, .webp, .gif, .bmp.
|
|
19
20
|
- Max image size: 10MB.
|
|
20
21
|
- Only send an image when the user asked for one or when it materially helps the answer.
|
|
@@ -22,4 +23,4 @@ node "{{send_image_script}}" --url "{{send_image_url}}" --session-id "{{session_
|
|
|
22
23
|
|
|
23
24
|
## Receive Images
|
|
24
25
|
|
|
25
|
-
Images sent to the bot are automatically downloaded to `~/.chatccc/images/downloads/`. The message contains an `image_key` that maps to the cached file.
|
|
26
|
+
Images sent to the bot are automatically downloaded to `~/.chatccc/images/downloads/`. The message contains an `image_key` that maps to the cached file.
|
|
@@ -14,22 +14,23 @@ function parseArgs(argv) {
|
|
|
14
14
|
|
|
15
15
|
function usage() {
|
|
16
16
|
console.error(`Usage:
|
|
17
|
-
node ${basename(process.argv[1])} --url <url> --session-id <session_id> --path <absolute file path> [--caption <text>]`);
|
|
17
|
+
node ${basename(process.argv[1])} --url <url> --session-id <session_id> --grant <session_grant> --path <absolute file path> [--caption <text>]`);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
async function main() {
|
|
21
21
|
const args = parseArgs(process.argv.slice(2));
|
|
22
22
|
const url = args.url || process.env.CHATCCC_SEND_FILE_URL;
|
|
23
|
-
const sessionId = args["session-id"] || args.session_id || process.env.CHATCCC_SESSION_ID;
|
|
23
|
+
const sessionId = args["session-id"] || args.session_id || process.env.CHATCCC_SESSION_ID;
|
|
24
|
+
const grant = args.grant || process.env.CHATCCC_AGENT_CAPABILITY_GRANT;
|
|
24
25
|
const path = args.path;
|
|
25
26
|
const caption = args.caption || "";
|
|
26
27
|
|
|
27
|
-
if (!url || !sessionId || !path) {
|
|
28
|
+
if (!url || !sessionId || !grant || !path) {
|
|
28
29
|
usage();
|
|
29
30
|
process.exit(1);
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
const body = Buffer.from(JSON.stringify({ session_id: sessionId, path, caption }), "utf8");
|
|
33
|
+
const body = Buffer.from(JSON.stringify({ session_id: sessionId, grant, path, caption }), "utf8");
|
|
33
34
|
const response = await fetch(url, {
|
|
34
35
|
method: "POST",
|
|
35
36
|
headers: {
|
|
@@ -48,4 +49,4 @@ async function main() {
|
|
|
48
49
|
main().catch((err) => {
|
|
49
50
|
console.error(err instanceof Error ? err.message : String(err));
|
|
50
51
|
process.exit(1);
|
|
51
|
-
});
|
|
52
|
+
});
|
|
@@ -14,22 +14,23 @@ function parseArgs(argv) {
|
|
|
14
14
|
|
|
15
15
|
function usage() {
|
|
16
16
|
console.error(`Usage:
|
|
17
|
-
node ${basename(process.argv[1])} --url <url> --session-id <session_id> --path <absolute image path> [--caption <text>]`);
|
|
17
|
+
node ${basename(process.argv[1])} --url <url> --session-id <session_id> --grant <session_grant> --path <absolute image path> [--caption <text>]`);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
async function main() {
|
|
21
21
|
const args = parseArgs(process.argv.slice(2));
|
|
22
22
|
const url = args.url || process.env.CHATCCC_SEND_IMAGE_URL;
|
|
23
|
-
const sessionId = args["session-id"] || args.session_id || process.env.CHATCCC_SESSION_ID;
|
|
23
|
+
const sessionId = args["session-id"] || args.session_id || process.env.CHATCCC_SESSION_ID;
|
|
24
|
+
const grant = args.grant || process.env.CHATCCC_AGENT_CAPABILITY_GRANT;
|
|
24
25
|
const path = args.path;
|
|
25
26
|
const caption = args.caption || "";
|
|
26
27
|
|
|
27
|
-
if (!url || !sessionId || !path) {
|
|
28
|
+
if (!url || !sessionId || !grant || !path) {
|
|
28
29
|
usage();
|
|
29
30
|
process.exit(1);
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
const body = Buffer.from(JSON.stringify({ session_id: sessionId, path, caption }), "utf8");
|
|
33
|
+
const body = Buffer.from(JSON.stringify({ session_id: sessionId, grant, path, caption }), "utf8");
|
|
33
34
|
const response = await fetch(url, {
|
|
34
35
|
method: "POST",
|
|
35
36
|
headers: {
|
|
@@ -48,4 +49,4 @@ async function main() {
|
|
|
48
49
|
main().catch((err) => {
|
|
49
50
|
console.error(err instanceof Error ? err.message : String(err));
|
|
50
51
|
process.exit(1);
|
|
51
|
-
});
|
|
52
|
+
});
|
|
@@ -5,12 +5,13 @@ description: Feishu IM local skills for sending images, files, videos, and for c
|
|
|
5
5
|
|
|
6
6
|
Current working directory: {{cwd}}
|
|
7
7
|
Your session id: {{session_id}}
|
|
8
|
+
Your session capability grant: {{agent_capability_grant}}
|
|
8
9
|
Your Feishu open_id: {{open_id}}
|
|
9
10
|
|
|
10
11
|
Use local endpoints instead of calling Feishu Open Platform directly.
|
|
11
12
|
|
|
12
|
-
- **Send images**: POST `{{send_image_url}}` with `{"session_id":"{{session_id}}","path":"<absolute path>","caption":"<optional>"}` — read `{{im_skills_cache_dir}}/feishu-skill/receive-send-image.md`
|
|
13
|
-
- **Send files/videos**: POST `{{send_file_url}}` with `{"session_id":"{{session_id}}","path":"<absolute path>","caption":"<optional>"}` — read `{{im_skills_cache_dir}}/feishu-skill/receive-send-file.md`
|
|
13
|
+
- **Send images**: POST `{{send_image_url}}` with `{"session_id":"{{session_id}}","grant":"{{agent_capability_grant}}","path":"<absolute path>","caption":"<optional>"}` — read `{{im_skills_cache_dir}}/feishu-skill/receive-send-image.md`
|
|
14
|
+
- **Send files/videos**: POST `{{send_file_url}}` with `{"session_id":"{{session_id}}","grant":"{{agent_capability_grant}}","path":"<absolute path>","caption":"<optional>"}` — read `{{im_skills_cache_dir}}/feishu-skill/receive-send-file.md`
|
|
14
15
|
- **Create a new session (新建会话)**: POST `{{delegate_task_url}}` with `{"tool":"claude|cursor|codex|ccc|dsh","cwd":"<absolute path>","open_id":"{{open_id}}","prompt":"<optional first task>"}`. This creates a new Feishu group and session, and only adds you (the requester). `tool` and `prompt` are optional; omit `prompt` to just create the session without a first task.
|
|
15
16
|
- **Set default working directory (cd / 切换目录)**: POST `{{set_cwd_url}}` with `{"session_id":"{{session_id}}","dir":"<absolute path>"}`. This sets the default directory for future new sessions only; it does not change the current session.
|
|
16
17
|
|
|
@@ -24,3 +25,4 @@ How to map user requests to these endpoints:
|
|
|
24
25
|
- when ambiguous, prefer creating a new session (the more common intent for "切换到").
|
|
25
26
|
- Directory names may be fuzzy or relative; resolve them to an absolute local path (using your file tools) before calling either endpoint.
|
|
26
27
|
- `open_id` must always be passed as exactly {{open_id}}; do not invent it.
|
|
28
|
+
- The capability grant is bound to this session. Never reuse a grant with another session ID.
|
package/package.json
CHANGED
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "chatccc",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "Feishu bot bridge for Claude Code",
|
|
5
|
-
"license": "Apache-2.0",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"main": "./dist/src/index.js",
|
|
8
|
-
"bin": {
|
|
9
|
-
"chatccc": "bin/chatccc.mjs",
|
|
10
|
-
"cccagent": "bin/cccagent.mjs"
|
|
11
|
-
},
|
|
12
|
-
"files": [
|
|
13
|
-
"dist/",
|
|
14
|
-
"deepccc-agent/os-prompts/",
|
|
15
|
-
"bin/",
|
|
16
|
-
"scripts/postinstall-sharp-check.mjs",
|
|
17
|
-
"demo/ilink_echo_probe.ts",
|
|
18
|
-
"agent-prompts/",
|
|
19
|
-
"im-skills/",
|
|
20
|
-
".agents/skills/create-chatccc-feishu-app/",
|
|
21
|
-
".claude/skills/create-chatccc-feishu-app/",
|
|
22
|
-
".cursor/skills/create-chatccc-feishu-app/",
|
|
23
|
-
"images/img_readme_*.jpg",
|
|
24
|
-
"images/img_readme_*.png",
|
|
25
|
-
"images/avatars/status_*.png",
|
|
26
|
-
"images/avatars/badges/",
|
|
27
|
-
"images/avatars/combinations/",
|
|
28
|
-
"package.json",
|
|
29
|
-
"README.md",
|
|
30
|
-
"config.sample.json"
|
|
31
|
-
],
|
|
32
|
-
"scripts": {
|
|
33
|
-
"build": "node scripts/build.mjs",
|
|
34
|
-
"prepack": "npm run build",
|
|
35
|
-
"dev": "tsx src/index.ts",
|
|
36
|
-
"chatccc": "tsx src/index.ts",
|
|
37
|
-
"start": "tsx src/index.ts",
|
|
38
|
-
"demo:bot-test": "tsx demo/bot_test.ts",
|
|
39
|
-
"demo:bot-test:local": "tsx demo/bot_test.ts --local",
|
|
40
|
-
"demo:create-group": "tsx src/index.ts",
|
|
41
|
-
"demo:create-group:local": "tsx src/index.ts --local",
|
|
42
|
-
"demo:permission-check": "tsx demo/permission_check.ts",
|
|
43
|
-
"demo:claude-hi": "tsx demo/claude_say_hi.ts",
|
|
44
|
-
"demo:codex-hi": "tsx demo/codex_say_hi.ts",
|
|
45
|
-
"demo:codex-app-server-approval": "tsx demo/codex-app-server-approval/approval_demo.ts",
|
|
46
|
-
"demo:ilink-echo": "tsx demo/ilink_echo_probe.ts",
|
|
47
|
-
"claude-proxy": "tsx src/litellm-proxy.ts",
|
|
48
|
-
"test": "vitest run",
|
|
49
|
-
"test:deepccc": "vitest run --root deepccc-agent",
|
|
50
|
-
"test:watch": "vitest",
|
|
51
|
-
"postinstall": "node scripts/postinstall-sharp-check.mjs"
|
|
52
|
-
},
|
|
53
|
-
"dependencies": {
|
|
54
|
-
"@ai-sdk/anthropic": "^3.0.105",
|
|
55
|
-
"@ai-sdk/openai-compatible": "^2.0.47",
|
|
56
|
-
"@larksuiteoapi/node-sdk": "^1.59.0",
|
|
57
|
-
"@openilink/openilink-sdk-node": "^0.6.0",
|
|
58
|
-
"@vscode/ripgrep": "^1.18.0",
|
|
59
|
-
"ai": "^6.0.184",
|
|
60
|
-
"nodemailer": "^8.0.7",
|
|
61
|
-
"qrcode-terminal": "^0.12.0",
|
|
62
|
-
"sharp": "^0.34.5",
|
|
63
|
-
"ws": "^8.18.0"
|
|
64
|
-
},
|
|
65
|
-
"devDependencies": {
|
|
66
|
-
"@types/node": "^20.0.0",
|
|
67
|
-
"@types/qrcode-terminal": "^0.12.2",
|
|
68
|
-
"@types/ws": "^8.18.1",
|
|
69
|
-
"tsx": "^4.0.0",
|
|
70
|
-
"typescript": "^5.0.0",
|
|
71
|
-
"vitest": "^3.2.4"
|
|
72
|
-
},
|
|
73
|
-
"engines": {
|
|
74
|
-
"node": ">=20"
|
|
75
|
-
}
|
|
76
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "chatccc",
|
|
3
|
+
"version": "0.2.276",
|
|
4
|
+
"description": "Feishu bot bridge for Claude Code",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/src/index.js",
|
|
8
|
+
"bin": {
|
|
9
|
+
"chatccc": "bin/chatccc.mjs",
|
|
10
|
+
"cccagent": "bin/cccagent.mjs"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist/",
|
|
14
|
+
"deepccc-agent/os-prompts/",
|
|
15
|
+
"bin/",
|
|
16
|
+
"scripts/postinstall-sharp-check.mjs",
|
|
17
|
+
"demo/ilink_echo_probe.ts",
|
|
18
|
+
"agent-prompts/",
|
|
19
|
+
"im-skills/",
|
|
20
|
+
".agents/skills/create-chatccc-feishu-app/",
|
|
21
|
+
".claude/skills/create-chatccc-feishu-app/",
|
|
22
|
+
".cursor/skills/create-chatccc-feishu-app/",
|
|
23
|
+
"images/img_readme_*.jpg",
|
|
24
|
+
"images/img_readme_*.png",
|
|
25
|
+
"images/avatars/status_*.png",
|
|
26
|
+
"images/avatars/badges/",
|
|
27
|
+
"images/avatars/combinations/",
|
|
28
|
+
"package.json",
|
|
29
|
+
"README.md",
|
|
30
|
+
"config.sample.json"
|
|
31
|
+
],
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "node scripts/build.mjs",
|
|
34
|
+
"prepack": "npm run build",
|
|
35
|
+
"dev": "tsx src/index.ts",
|
|
36
|
+
"chatccc": "tsx src/index.ts",
|
|
37
|
+
"start": "tsx src/index.ts",
|
|
38
|
+
"demo:bot-test": "tsx demo/bot_test.ts",
|
|
39
|
+
"demo:bot-test:local": "tsx demo/bot_test.ts --local",
|
|
40
|
+
"demo:create-group": "tsx src/index.ts",
|
|
41
|
+
"demo:create-group:local": "tsx src/index.ts --local",
|
|
42
|
+
"demo:permission-check": "tsx demo/permission_check.ts",
|
|
43
|
+
"demo:claude-hi": "tsx demo/claude_say_hi.ts",
|
|
44
|
+
"demo:codex-hi": "tsx demo/codex_say_hi.ts",
|
|
45
|
+
"demo:codex-app-server-approval": "tsx demo/codex-app-server-approval/approval_demo.ts",
|
|
46
|
+
"demo:ilink-echo": "tsx demo/ilink_echo_probe.ts",
|
|
47
|
+
"claude-proxy": "tsx src/litellm-proxy.ts",
|
|
48
|
+
"test": "vitest run",
|
|
49
|
+
"test:deepccc": "vitest run --root deepccc-agent",
|
|
50
|
+
"test:watch": "vitest",
|
|
51
|
+
"postinstall": "node scripts/postinstall-sharp-check.mjs"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@ai-sdk/anthropic": "^3.0.105",
|
|
55
|
+
"@ai-sdk/openai-compatible": "^2.0.47",
|
|
56
|
+
"@larksuiteoapi/node-sdk": "^1.59.0",
|
|
57
|
+
"@openilink/openilink-sdk-node": "^0.6.0",
|
|
58
|
+
"@vscode/ripgrep": "^1.18.0",
|
|
59
|
+
"ai": "^6.0.184",
|
|
60
|
+
"nodemailer": "^8.0.7",
|
|
61
|
+
"qrcode-terminal": "^0.12.0",
|
|
62
|
+
"sharp": "^0.34.5",
|
|
63
|
+
"ws": "^8.18.0"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@types/node": "^20.0.0",
|
|
67
|
+
"@types/qrcode-terminal": "^0.12.2",
|
|
68
|
+
"@types/ws": "^8.18.1",
|
|
69
|
+
"tsx": "^4.0.0",
|
|
70
|
+
"typescript": "^5.0.0",
|
|
71
|
+
"vitest": "^3.2.4"
|
|
72
|
+
},
|
|
73
|
+
"engines": {
|
|
74
|
+
"node": ">=20"
|
|
75
|
+
}
|
|
76
|
+
}
|