cc-ding 0.0.1 → 0.0.2
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 +182 -3
- package/dist/bin/cc-ding.js +1 -1
- package/dist/src/biz/api-key-manager.js +1 -1
- package/dist/src/biz/cc-ding-cli.js +1 -1
- package/dist/src/biz/claude-process.js +1 -1
- package/dist/src/biz/commands.js +1 -1
- package/dist/src/biz/cron.js +1 -1
- package/dist/src/biz/doctor.js +1 -1
- package/dist/src/biz/image.js +1 -1
- package/dist/src/biz/lock.js +1 -1
- package/dist/src/biz/messaging.js +1 -1
- package/dist/src/biz/quote.js +1 -1
- package/dist/src/biz/session.js +1 -1
- package/dist/src/biz/task.js +1 -1
- package/dist/src/biz/types.js +1 -1
- package/dist/src/common.js +1 -1
- package/dist/src/constants.js +1 -1
- package/package.json +11 -11
package/README.md
CHANGED
|
@@ -1,10 +1,189 @@
|
|
|
1
1
|
# cc-ding
|
|
2
2
|
|
|
3
|
-
钉钉机器人对接本地Claude
|
|
3
|
+
钉钉机器人对接本地 Claude Code 工具,支持群聊多轮对话、任务队列、定时任务等功能。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 安装
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
|
|
8
|
+
pnpm i cc-ding -g
|
|
9
9
|
cc-ding --help
|
|
10
10
|
```
|
|
11
|
+
|
|
12
|
+
## 快速开始
|
|
13
|
+
|
|
14
|
+
### 1. 初始化配置
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
cc-ding init -ci {clientId} -cs {clientSecret} -m {手机号}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
- `-ci, --clientId`: 钉钉应用的 ClientId
|
|
21
|
+
- `-cs, --clientSecret`: 钉钉 Stream 连接密钥
|
|
22
|
+
- `-m, --mobile`: 自己的手机号(自动加入白名单)
|
|
23
|
+
- `-cn, --clientName`: 机器人名称(可选,默认 "cc助手")
|
|
24
|
+
|
|
25
|
+
### 2. 编辑配置
|
|
26
|
+
|
|
27
|
+
配置文件位于 `~/.cc-ding/{clientId}/config.json`,需要添加 `conversations` 配置(群聊需配置 `dingToken`)。
|
|
28
|
+
|
|
29
|
+
### 3. 启动机器人
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# 直接启动
|
|
33
|
+
cc-ding run -ci {clientId}
|
|
34
|
+
|
|
35
|
+
# 推荐:PM2 方式启动
|
|
36
|
+
pm2 start --name "cc-ding-{clientId}" npx -- -p cc-ding cc-ding run -ci {clientId}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 数据存储路径
|
|
40
|
+
|
|
41
|
+
| 数据类型 | 路径 |
|
|
42
|
+
|---------|------|
|
|
43
|
+
| 会话数据 | `~/.cc-ding/{clientId}/{MD5}/.sessions/{claudeSessionId}/session.{json\|log}` |
|
|
44
|
+
| 任务数据 | `~/.cc-ding/{clientId}/{MD5}/.tasks/{时间戳}/task.{json\|log}` |
|
|
45
|
+
| 定时任务 | `~/.cc-ding/{clientId}/cron.json` |
|
|
46
|
+
| 图片缓存 | `~/.cc-ding/{clientId}/{MD5}/.images/` |
|
|
47
|
+
| 手机号映射 | `~/.cc-ding/{clientId}/phone-map.json` |
|
|
48
|
+
|
|
49
|
+
## 功能特性
|
|
50
|
+
|
|
51
|
+
### 会话模式
|
|
52
|
+
|
|
53
|
+
- **会话ID**: 由 Claude 分配的 `claudeSessionId`
|
|
54
|
+
- **结束会话**: `/end`
|
|
55
|
+
- **新会话**: `/new [初始消息]` 强制结束当前会话并开启新会话
|
|
56
|
+
- **恢复会话**: `/resume [会话ID]` 恢复指定历史会话,不指定则恢复最近一个
|
|
57
|
+
- **会话持久化**: 活跃会话自动保存到 `active.json`,服务重启后自动恢复
|
|
58
|
+
- **群内多用户**: 允许群内所有白名单用户参与对话
|
|
59
|
+
|
|
60
|
+
### 任务模式
|
|
61
|
+
|
|
62
|
+
- 使用 `/task <任务描述>` 提交任务到队列
|
|
63
|
+
- 任务按队列顺序执行,完成后自动回复
|
|
64
|
+
- 使用 `/task cancel` 取消任务
|
|
65
|
+
|
|
66
|
+
### 定时任务
|
|
67
|
+
|
|
68
|
+
- `/cron <自然语言描述>` — Claude 自动分析并生成 cron 表达式
|
|
69
|
+
- `/cron 0 9 * * * 任务描述` — 直接指定 cron 表达式
|
|
70
|
+
- `/cron list` — 查看定时任务列表
|
|
71
|
+
- `/cron pause <id>` / `/cron resume <id>` — 暂停/恢复定时任务
|
|
72
|
+
- `/cron delete <id>` — 删除定时任务
|
|
73
|
+
|
|
74
|
+
### 图片消息支持
|
|
75
|
+
|
|
76
|
+
- 支持接收钉钉图片消息(`picture`)和富文本消息(`richText`,含内嵌图片)
|
|
77
|
+
- 图片自动下载保存到会话目录下的 `.images/` 目录
|
|
78
|
+
- `useLocalOcr`: 默认开启,使用本地 OCR 识别图片文字,同时传入原图路径供 Claude 自主查看
|
|
79
|
+
- 配置方式:`conversations[].useLocalOcr = false` 可关闭 OCR(适用于支持图片识别的模型)
|
|
80
|
+
|
|
81
|
+
### API Key 池化管理(可选)
|
|
82
|
+
|
|
83
|
+
配置 `apiKeyCfg` 后启用:
|
|
84
|
+
|
|
85
|
+
- **429 自动切换**: 自动切换到可用的 API Key
|
|
86
|
+
- **Key 轮换**: 遇到 429 或连续 TPM 不稳定时自动换 Key
|
|
87
|
+
- **跨天重置**: 每日 0 点自动重置 API Key 状态
|
|
88
|
+
|
|
89
|
+
### 白名单管理
|
|
90
|
+
|
|
91
|
+
- 全局白名单:`config.json` 中的 `whiteUserList`
|
|
92
|
+
- 群级白名单:`conversations[].whiteUserList`(优先级高于全局)
|
|
93
|
+
- 支持手机号和 userId 两种格式,手机号自动解析为 userId
|
|
94
|
+
- `/auth` 命令管理群级白名单(`/auth` 查看、`/auth add <手机号>`、`/auth del <手机号>`)
|
|
95
|
+
|
|
96
|
+
### 关联群功能
|
|
97
|
+
|
|
98
|
+
- 通过 `linkConversationId` 实现多个群共享同一个 Claude 会话上下文
|
|
99
|
+
- 关联群的消息会自动路由到同一个活跃会话
|
|
100
|
+
|
|
101
|
+
## 命令列表
|
|
102
|
+
|
|
103
|
+
### 💬 会话
|
|
104
|
+
|
|
105
|
+
| 命令 | 描述 |
|
|
106
|
+
|------|------|
|
|
107
|
+
| `/help` | 查看所有可用命令 |
|
|
108
|
+
| `/log [行数]` | 查看最近会话日志 |
|
|
109
|
+
| `/new [初始消息]` | 开始新的对话会话 |
|
|
110
|
+
| `/resume [会话ID]` | 继续指定的历史会话 |
|
|
111
|
+
| `/end` | 结束当前会话 |
|
|
112
|
+
|
|
113
|
+
### 📋 任务
|
|
114
|
+
|
|
115
|
+
| 命令 | 描述 |
|
|
116
|
+
|------|------|
|
|
117
|
+
| `/task <描述>` | 提交任务到队列 |
|
|
118
|
+
| `/cron <描述>` | 创建和管理定时任务 |
|
|
119
|
+
|
|
120
|
+
### 📂 文件
|
|
121
|
+
|
|
122
|
+
| 命令 | 描述 |
|
|
123
|
+
|------|------|
|
|
124
|
+
| `/pwd` | 显示当前工作目录的绝对路径 |
|
|
125
|
+
| `/ls [目录] [层数]` | 查看工作目录结构 |
|
|
126
|
+
| `/mkdir <路径>` | 创建文件夹 |
|
|
127
|
+
| `/touch <路径>` | 创建空文件 |
|
|
128
|
+
| `/rm <路径>` | 删除文件或目录 |
|
|
129
|
+
|
|
130
|
+
### ⚙️ 系统
|
|
131
|
+
|
|
132
|
+
| 命令 | 描述 |
|
|
133
|
+
|------|------|
|
|
134
|
+
| `/info [robot\|session\|task]` | 查看群配置、会话和任务信息 |
|
|
135
|
+
| `/version` | 查看工具版本信息 |
|
|
136
|
+
|
|
137
|
+
### 🔧 管理(仅 owner)
|
|
138
|
+
|
|
139
|
+
| 命令 | 描述 |
|
|
140
|
+
|------|------|
|
|
141
|
+
| `/open [shell]` | 在文件管理器或终端中打开工作目录 |
|
|
142
|
+
| `/clean [all]` | 清除历史会话和缓存 |
|
|
143
|
+
| `/reset-apikeycfg` | 重置 API Key 配置 |
|
|
144
|
+
| `/reg` | 注册当前群到配置 |
|
|
145
|
+
| `/auth [add\|del <用户>]` | 管理当前群白名单 |
|
|
146
|
+
|
|
147
|
+
## 配置文件示例
|
|
148
|
+
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"clientName": "cc助手",
|
|
152
|
+
"owner": "你的手机号",
|
|
153
|
+
"whiteUserList": ["你的手机号"],
|
|
154
|
+
"clientSecret": "钉钉Stream连接密钥",
|
|
155
|
+
"defaultDingToken": "兜底钉钉机器人Token",
|
|
156
|
+
"conversations": [
|
|
157
|
+
{
|
|
158
|
+
"conversationId": "群ID",
|
|
159
|
+
"conversationTitle": "群名称",
|
|
160
|
+
"dingToken": "群机器人Token",
|
|
161
|
+
"whiteUserList": ["工号1", "工号2"],
|
|
162
|
+
"agent": "指定agent(可选)",
|
|
163
|
+
"useLocalOcr": true,
|
|
164
|
+
"taskCfg": {
|
|
165
|
+
"skill": "指定技能(可选)"
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
],
|
|
169
|
+
"taskQueueSize": 50,
|
|
170
|
+
"taskHandlerCount": 1,
|
|
171
|
+
"sessionMaxConcurrency": 20,
|
|
172
|
+
"includeThinking": false,
|
|
173
|
+
"resultOnly": true,
|
|
174
|
+
"debug": false
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 开发
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
pnpm install
|
|
182
|
+
pnpm run lint
|
|
183
|
+
pnpm run test
|
|
184
|
+
pnpm run build
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## 系统要求
|
|
188
|
+
|
|
189
|
+
- Node.js >= 24
|
package/dist/bin/cc-ding.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';const
|
|
2
|
+
'use strict';const a0_0x4cc741=a0_0x5569;(function(_0xc13db6,_0x5bd255){const _0x20599a=a0_0x5569,_0x473481=_0xc13db6();while(!![]){try{const _0x2e52bb=parseInt(_0x20599a(0x221))/0x1+-parseInt(_0x20599a(0x1dc))/0x2*(-parseInt(_0x20599a(0x1f8))/0x3)+parseInt(_0x20599a(0x1de))/0x4+parseInt(_0x20599a(0x1da))/0x5*(-parseInt(_0x20599a(0x1d8))/0x6)+parseInt(_0x20599a(0x1fb))/0x7*(parseInt(_0x20599a(0x1fc))/0x8)+parseInt(_0x20599a(0x211))/0x9+-parseInt(_0x20599a(0x200))/0xa*(parseInt(_0x20599a(0x1db))/0xb);if(_0x2e52bb===_0x5bd255)break;else _0x473481['push'](_0x473481['shift']());}catch(_0x2d38f0){_0x473481['push'](_0x473481['shift']());}}}(a0_0x4f0a,0x719a4));function a0_0x5569(_0x3594a3,_0x30436d){_0x3594a3=_0x3594a3-0x1d8;const _0x4f0af2=a0_0x4f0a();let _0x5569c7=_0x4f0af2[_0x3594a3];return _0x5569c7;}var __importDefault=this&&this[a0_0x4cc741(0x1f1)]||function(_0x4e7e90){const _0x3dae7f=a0_0x4cc741;return _0x4e7e90&&_0x4e7e90[_0x3dae7f(0x219)]?_0x4e7e90:{'default':_0x4e7e90};};Object[a0_0x4cc741(0x20a)](exports,a0_0x4cc741(0x219),{'value':!![]});function a0_0x4f0a(){const _0x560e0b=['1199ZiGbuO','1765166jtlvgn','../src/biz/doctor','1579836FkKmnv','doctor','Caught\x20exception:\x20','../src/common','如需重新初始化,\x20请先删除已有配置文件','配置文件已存在:\x20','version','printDoctorResults','\x20\x202.\x20启动机器人:\x20cc-ding\x20run\x20-ci','/config.json','run','after','clientId','../src/biz/cc-ding-cli','addHelpText','loadEnv','default','ensureClientDir','before','__importDefault','\x20\x20\x20\x20\x20pm2\x20start\x20--name\x20\x22cc-ding-','\x22\x20npx\x20--\x20-p\x20cc-ding\x20cc-ding\x20run\x20-ci\x20','split','action','mobile\x20(自己的手机号,\x20自动加入白名单)','\x0a💡\x20请升级\x20Node\x20版本后重新运行\x0a','3qzfqed','-ci,\x20--clientId\x20<value>','path','7VffFks','2529832bfDslf','mobile','\x0a\x20\x20\x20\x20cc-ding\x20for\x20connect\x20ClaudeCode\x20to\x20DingDingRobot\x0a\x20\x20','join','203470lWSKkC','acquirePidLock','初始化cc-ding配置文件,\x20生成最简config.json','requiredOption','slice','<兜底钉钉机器人Token-用于无dingToken群的消息接收>','-cs,\x20--clientSecret\x20<value>','runDoctor','option','setMaxListeners','defineProperty','Command','/.cc-ding/','command','argv','clientSecret\x20(钉钉Stream连接密钥)','projUtil','5281938XuZDpx','exit','检查指定client的配置文件schema合法性和有效性','existsSync','\x20\x201.\x20编辑\x20config.json\x20添加\x20conversations\x20配置(群聊需配置dingToken)','description','\x20\x203.\x20推荐PM2启动:','clientName\x20(机器人名称,\x20可选)','__esModule','initClientDir','getHomeDir','../src/biz/lock','log','.cc-ding','配置文件已生成:','\x20\x20要求:Node\x20>=\x2024','547634WaDmpC','135444WzVmZx','-cn,\x20--clientName\x20<value>','10oMpRYM'];a0_0x4f0a=function(){return _0x560e0b;};return a0_0x4f0a();}const common_1=require(a0_0x4cc741(0x1e1)),commander_1=require('commander'),session_1=require('../src/biz/session'),path_1=__importDefault(require(a0_0x4cc741(0x1fa))),cc_ding_cli_1=require(a0_0x4cc741(0x1eb)),lock_1=require(a0_0x4cc741(0x21c)),doctor_1=require(a0_0x4cc741(0x1dd)),fs_1=__importDefault(require('fs'));(0x0,common_1[a0_0x4cc741(0x1ed)])(),process['removeAllListeners']('warning'),process[a0_0x4cc741(0x209)](0x0),process['on']('uncaughtException',function(_0x51abac){const _0x1eece2=a0_0x4cc741;console[_0x1eece2(0x21d)](_0x1eece2(0x1e0)+_0x51abac),process['exit'](0x1);});const program=new commander_1[(a0_0x4cc741(0x20b))]();program[a0_0x4cc741(0x1ec)](a0_0x4cc741(0x1f0),a0_0x4cc741(0x1fe))[a0_0x4cc741(0x1ec)](a0_0x4cc741(0x1e9),'\x0aExamples:\x0a\x20\x20$\x20cc-ding\x20init\x20-ci\x20{clientId}\x20-cs\x20{clientSecret}\x20-m\x20{mobile}\x0a\x20\x20$\x20cc-ding\x20run\x20-ci\x20{clientId}\x0a')[a0_0x4cc741(0x1e4)]((0x0,common_1[a0_0x4cc741(0x210)])()['getPkgVersion']()),program['command']('init')[a0_0x4cc741(0x216)](a0_0x4cc741(0x202))[a0_0x4cc741(0x203)](a0_0x4cc741(0x1f9),'clientId')['requiredOption'](a0_0x4cc741(0x206),a0_0x4cc741(0x20f))[a0_0x4cc741(0x203)]('-m,\x20--mobile\x20<value>',a0_0x4cc741(0x1f6))[a0_0x4cc741(0x208)](a0_0x4cc741(0x1d9),a0_0x4cc741(0x218))[a0_0x4cc741(0x1f5)](async _0x1ca0e6=>{const _0x38923d=a0_0x4cc741,_0x2d6fd6=process[_0x38923d(0x1e4)][_0x38923d(0x204)](0x1),_0x3871e0=parseInt(_0x2d6fd6[_0x38923d(0x1f4)]('.')[0x0],0xa);_0x3871e0<0x18&&(console['log']('\x0a❌\x20Node\x20版本过低,无法执行\x20init\x20命令'),console['log']('\x20\x20当前版本:'+_0x2d6fd6),console[_0x38923d(0x21d)](_0x38923d(0x220)),console[_0x38923d(0x21d)](_0x38923d(0x1f7)),process[_0x38923d(0x212)](0x1));const _0x3e81d1=(0x0,session_1[_0x38923d(0x21b)])()+_0x38923d(0x20c)+_0x1ca0e6[_0x38923d(0x1ea)],_0x56ab74=_0x3e81d1+_0x38923d(0x1e7);fs_1['default'][_0x38923d(0x214)](_0x56ab74)&&(console[_0x38923d(0x21d)](_0x38923d(0x1e3)+_0x56ab74),console[_0x38923d(0x21d)](_0x38923d(0x1e2)),process[_0x38923d(0x212)](0x1));const _0x5542ab={'clientName':_0x1ca0e6['clientName']||'cc助手','owner':_0x1ca0e6['mobile'],'whiteUserList':[_0x1ca0e6[_0x38923d(0x1fd)]],'clientSecret':_0x1ca0e6['clientSecret'],'defaultDingToken':_0x38923d(0x205),'conversations':[],'includeThinking':![],'resultOnly':!![],'debug':![],'taskQueueSize':0xa,'taskHandlerCount':0x1,'sessionMaxConcurrency':0x14};(0x0,session_1[_0x38923d(0x21a)])(_0x1ca0e6['clientId'],_0x5542ab),console[_0x38923d(0x21d)](_0x38923d(0x21f),_0x56ab74),console[_0x38923d(0x21d)](''),console[_0x38923d(0x21d)]('后续步骤:'),console[_0x38923d(0x21d)](_0x38923d(0x215)),console['log'](_0x38923d(0x1e6),_0x1ca0e6[_0x38923d(0x1ea)]),console['log'](_0x38923d(0x217)),console[_0x38923d(0x21d)](_0x38923d(0x1f2)+_0x1ca0e6['clientId']+_0x38923d(0x1f3)+_0x1ca0e6['clientId']);}),program[a0_0x4cc741(0x20d)](a0_0x4cc741(0x1e8))['description']('\x0a\x20\x20\x20\x20\x20\x20\x20\x20-\x20功能:\x20钉钉机器人对接本地Claude,\x20支持会话模式和任务队列模式\x0a\x20\x20\x20\x20\x20\x20\x20\x20-\x20会话数据路径:\x20~/.cc-ding/{clientId}/{MD5}/.sessions/{claudeSessionId}/session.{json|log}\x0a\x20\x20\x20\x20\x20\x20\x20\x20-\x20任务数据路径:\x20~/.cc-ding/{clientId}/{MD5}/.tasks/{时间戳}/task.{json|log}\x0a\x20\x20\x20\x20\x20\x20\x20\x20-\x20定时任务数据:\x20~/.cc-ding/{clientId}/cron.json\x0a\x20\x20\x20\x20\x20\x20\x20\x20-\x20启动方式:\x20pm2\x20start\x20--name\x20\x22cc-ding-{clientId}\x22\x20npx\x20--\x20-p\x20cc-ding\x20run\x20-ci\x20{clientId}\x0a\x20\x20\x20\x20\x20\x20\x20\x20-\x20会话模式说明\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20会话ID:\x20由\x20Claude\x20分配的\x20claudeSessionId\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20结束会话:\x20/end\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20新会话:\x20/new\x20[初始消息]\x20强制结束当前会话并开启新会话\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20恢复会话:\x20/resume\x20[会话ID]\x20恢复指定历史会话,\x20不指定则恢复最近一个\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20会话持久化:\x20活跃会话自动保存到\x20active.json,\x20服务重启后自动恢复\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20群内多用户:\x20允许群内所有白名单用户参与对话\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20/help:\x20查看所有可用命令(含版本、作者、文档链接);\x20/{命令}\x20--help\x20查看命令详细用法\x0a\x20\x20\x20\x20\x20\x20\x20\x20-\x20图片消息支持\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20支持接收钉钉图片消息(picture)和富文本消息(richText,\x20含内嵌图片)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20图片自动下载保存到\x20<会话目录>/.images/\x20下\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20useLocalOcr:\x20默认开启,\x20使用本地OCR识别图片文字,\x20同时传入原图路径供Claude自主查看\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20配置方式:\x20conversations[].useLocalOcr\x20=\x20false\x20可关闭OCR(适用于支持图片识别的模型)\x0a\x20\x20\x20\x20\x20\x20\x20\x20-\x20任务模式说明\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20任务ID:\x20任务接收时间戳\x0a\x20\x20\x20\x20\x20\x20\x20\x20-\x20API\x20Key\x20池化管理(可选,\x20配置apiKeyCfg后启用)\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20429自动切换:\x20自动切换到API\x20Key模式\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20Key轮换:\x20API\x20Key遇到429或连续TPM不稳定时自动换Key\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\x20跨天重置:\x20每日自动重置API\x20Key状态\x0a\x20\x20\x20\x20\x20\x20')[a0_0x4cc741(0x203)](a0_0x4cc741(0x1f9),a0_0x4cc741(0x1ea))[a0_0x4cc741(0x1f5)](async _0x5ce423=>{const _0x6fab84=a0_0x4cc741;(0x0,session_1[_0x6fab84(0x1ef)])(_0x5ce423['clientId']);const _0x405f2e=path_1['default'][_0x6fab84(0x1ff)]((0x0,session_1[_0x6fab84(0x21b)])(),'.cc-ding',_0x5ce423[_0x6fab84(0x1ea)]);(0x0,lock_1[_0x6fab84(0x201)])(_0x405f2e,_0x5ce423[_0x6fab84(0x1ea)]),await new cc_ding_cli_1['DingClaude'](_0x5ce423[_0x6fab84(0x1ea)])['run']();}),program['command'](a0_0x4cc741(0x1df))[a0_0x4cc741(0x216)](a0_0x4cc741(0x213))['requiredOption']('-ci,\x20--clientId\x20<value>',a0_0x4cc741(0x1ea))['action'](async _0x391673=>{const _0x50d982=a0_0x4cc741,_0x3ee462=path_1[_0x50d982(0x1ee)][_0x50d982(0x1ff)]((0x0,session_1['getHomeDir'])(),_0x50d982(0x21e),_0x391673['clientId']),_0x204b37=(0x0,doctor_1[_0x50d982(0x207)])(_0x3ee462);(0x0,doctor_1[_0x50d982(0x1e5)])(_0x204b37);}),program['parse'](process[a0_0x4cc741(0x20e)]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';const a1_0x16c992=a1_0x47d2;(function(_0x54667e,_0x1950fc){const _0x1cdfd4=a1_0x47d2,_0x3bf4c5=_0x54667e();while(!![]){try{const _0x426a83=-parseInt(_0x1cdfd4(0x22c))/0x1*(parseInt(_0x1cdfd4(0x251))/0x2)+parseInt(_0x1cdfd4(0x220))/0x3*(parseInt(_0x1cdfd4(0x266))/0x4)+-parseInt(_0x1cdfd4(0x21f))/0x5+-parseInt(_0x1cdfd4(0x216))/0x6*(parseInt(_0x1cdfd4(0x243))/0x7)+-parseInt(_0x1cdfd4(0x206))/0x8*(parseInt(_0x1cdfd4(0x20c))/0x9)+parseInt(_0x1cdfd4(0x249))/0xa*(-parseInt(_0x1cdfd4(0x254))/0xb)+parseInt(_0x1cdfd4(0x1f3))/0xc;if(_0x426a83===_0x1950fc)break;else _0x3bf4c5['push'](_0x3bf4c5['shift']());}catch(_0x56e524){_0x3bf4c5['push'](_0x3bf4c5['shift']());}}}(a1_0x5085,0x719f9));var __importDefault=this&&this[a1_0x16c992(0x210)]||function(_0x45ea32){return _0x45ea32&&_0x45ea32['__esModule']?_0x45ea32:{'default':_0x45ea32};};Object[a1_0x16c992(0x20d)](exports,'__esModule',{'value':!![]}),exports[a1_0x16c992(0x261)]=saveClientConfig,exports[a1_0x16c992(0x23f)]=resetApiKeyCfg,exports[a1_0x16c992(0x271)]=scheduleApiKeyCfgDailyReset,exports['settingLabel']=settingLabel,exports[a1_0x16c992(0x276)]=rotateApiKey,exports['pickValidApiKey']=pickValidApiKey,exports['ensureSettingsWithApiKey']=ensureSettingsWithApiKey,exports[a1_0x16c992(0x221)]=isQuotaExhaustedError,exports['isAuthenticationError']=isAuthenticationError,exports[a1_0x16c992(0x26c)]=readApiKeyFromSettings,exports['getForceEnabledSettingsPath']=getForceEnabledSettingsPath,exports[a1_0x16c992(0x207)]=startupCheck;const fs_1=__importDefault(require('fs')),path_1=__importDefault(require(a1_0x16c992(0x265))),child_process_1=require(a1_0x16c992(0x234)),session_1=require(a1_0x16c992(0x205)),utils_ok_1=require(a1_0x16c992(0x20a));function saveClientConfig(_0x5db16c){const _0x1e1b40=a1_0x16c992,_0x583b4d=_0x5db16c[_0x1e1b40(0x22e)]()+'/config.json';try{fs_1['default'][_0x1e1b40(0x267)](_0x583b4d,JSON[_0x1e1b40(0x21e)](_0x5db16c[_0x1e1b40(0x24e)],null,0x2),'utf-8');}catch(_0x33d99b){console[_0x1e1b40(0x223)]('['+(0x0,session_1['timestamp'])()+']\x20保存\x20config.json\x20失败:',_0x33d99b);}}function a1_0x47d2(_0x1fba32,_0x1d5f82){_0x1fba32=_0x1fba32-0x1f1;const _0x508572=a1_0x5085();let _0x47d2fd=_0x508572[_0x1fba32];return _0x47d2fd;}function resetApiKeyCfg(_0x5e5ce3){const _0x389268=a1_0x16c992,_0x398c29=_0x5e5ce3[_0x389268(0x24e)]['apiKeyCfg'];if(!_0x398c29)return;const _0x4c5706=new Date();_0x398c29['resetTime']=utils_ok_1[_0x389268(0x239)]['mm'](_0x4c5706[_0x389268(0x24a)]())[_0x389268(0x277)](_0x389268(0x214));let _0x18aed3=0x0;for(const _0x121380 of _0x398c29[_0x389268(0x274)]){!_0x121380[_0x389268(0x24b)]&&(_0x121380[_0x389268(0x24b)]=!![],_0x18aed3++);}_0x18aed3>0x0&&console[_0x389268(0x1fa)]('['+(0x0,session_1['timestamp'])()+']\x20'+_0x18aed3+_0x389268(0x21b)),saveClientConfig(_0x5e5ce3),console[_0x389268(0x1fa)]('['+(0x0,session_1[_0x389268(0x26b)])()+_0x389268(0x241));}function scheduleApiKeyCfgDailyReset(_0x38c4a1){const _0x42d3c3=()=>{const _0x3eb0e4=a1_0x47d2,_0x39a44c=new Date(),_0x300bb8=new Date(_0x39a44c[_0x3eb0e4(0x1fe)](),_0x39a44c[_0x3eb0e4(0x208)](),_0x39a44c['getDate']()+0x1,0x0,0x0,0x0,0x0),_0x4b2f9c=_0x300bb8[_0x3eb0e4(0x24a)]()-_0x39a44c[_0x3eb0e4(0x24a)]();setTimeout(()=>{const _0x40da59=_0x3eb0e4;console[_0x40da59(0x1fa)]('['+(0x0,session_1['timestamp'])()+_0x40da59(0x257)),resetApiKeyCfg(_0x38c4a1),_0x42d3c3();},_0x4b2f9c),console[_0x3eb0e4(0x1fa)]('['+(0x0,session_1[_0x3eb0e4(0x26b)])()+_0x3eb0e4(0x219)+_0x300bb8['toISOString']());};_0x42d3c3();}function settingLabel(_0x2c96d0){const _0x2afad7=a1_0x16c992;return _0x2c96d0[_0x2afad7(0x215)]?_0x2c96d0[_0x2afad7(0x215)]:_0x2afad7(0x25b)+_0x2c96d0['apiKey']['slice'](-0x6);}function findSettingLabel(_0x1e7fd3,_0x1ce1f1){const _0x11df7d=a1_0x16c992,_0x36060e=_0x1e7fd3[_0x11df7d(0x25e)](_0x5e8f92=>_0x5e8f92[_0x11df7d(0x222)]===_0x1ce1f1);return _0x36060e?settingLabel(_0x36060e):_0x11df7d(0x25b)+_0x1ce1f1[_0x11df7d(0x231)](-0x6);}function rotateApiKey(_0x8f643b,_0x27405b){const _0x355f0a=a1_0x16c992,_0x5bb8b9=_0x8f643b['config'][_0x355f0a(0x225)];if(!_0x5bb8b9)return null;for(const _0x334b7c of _0x5bb8b9['claudeSettings']){if(_0x334b7c['apiKey']===_0x27405b&&_0x334b7c[_0x355f0a(0x24b)]){_0x334b7c[_0x355f0a(0x24b)]=![];break;}}const _0x70ceb3=_0x5bb8b9['claudeSettings'][_0x355f0a(0x21d)](_0x5e172f=>_0x5e172f['isValid'])[_0x355f0a(0x245)],_0xd4a4e=findSettingLabel(_0x5bb8b9[_0x355f0a(0x274)],_0x27405b);return console[_0x355f0a(0x1fa)]('['+(0x0,session_1[_0x355f0a(0x26b)])()+_0x355f0a(0x24d)+_0xd4a4e+',\x20剩余有效:\x20'+_0x70ceb3),saveClientConfig(_0x8f643b),pickValidApiKey(_0x8f643b);}function pickValidApiKey(_0x3bd97b){const _0x3e9347=a1_0x16c992,_0x364603=_0x3bd97b[_0x3e9347(0x24e)][_0x3e9347(0x225)];if(!_0x364603)return null;const _0x41a741=_0x364603['claudeSettings'][_0x3e9347(0x21d)](_0x26d6db=>_0x26d6db[_0x3e9347(0x24b)]);if(_0x41a741['length']===0x0)return null;return _0x41a741[Math['floor'](Math['random']()*_0x41a741['length'])];}function a1_0x5085(){const _0x1db872=['isArray','linkConversationId','baseUrl','YYYY-MM-DD\x20HH:mm:ss','memo','2790516rJVkqC','ANTHROPIC_AUTH_TOKEN','apiKeyCfg\x20上次重置时间:\x20',']\x20apiKeyCfg\x20每日重置已调度,下次重置:\x20',',创建\x20settings-ding.json\x20时将使用空模板','\x20个已失效\x20Claude\x20Setting\x20重新标记为有效','keys','filter','stringify','4095935DrOQVQ','390xDuOCr','isQuotaExhaustedError','apiKey','error','clientSecret\x20(钉钉\x20Stream\x20Client\x20密钥)','apiKeyCfg','settings-tpl.json','add','object','settings-ding.json','level',',强制使用该配置','68477wdoQVR','claude\x20命令不可用,请确认\x20Claude\x20Code\x20CLI\x20已安装','getClientDir',']\x20已写入\x20Claude\x20配置到\x20','\x20致命','slice','settings-tpl.json\x20不存在:\x20','conversationId','child_process','[WARN]\x20','mkdirSync','dingSecret\x20(钉钉加签密钥)','\x20—\x20','dateUtil',']\x20检测到\x20settings-ding.json\x20FORCE_ENABLE=',']\x20==========\x20启动自检\x20==========','conversations[','exit','getConversationDir','resetApiKeyCfg','parse',']\x20apiKeyCfg\x20已重置\x20(所有\x20Claude\x20Setting\x20isValid=true)','\x20缺少\x20baseUrl','7JbjgGz','dingSecret','length','conversations\x20(群配置列表)','conversations','test','70gqQDWa','getTime','isValid','\x20缺少\x20conversationId',']\x20Claude\x20Setting\x20已失效:\x20','config','FATAL','\x20linkConversationId\x20\x22','2muFZUB',',\x20smallModel:\x20','WARN','781671WngTlw','env','settings-tpl.json\x20有效,env\x20包含:\x20',']\x20定时重置\x20apiKeyCfg\x20(每天0点)','.healthcheck','join','.claude','...','some','\x20项,有效\x20','find','which\x20claude','utf-8','saveClientConfig','\x20通过,\x20','message','[FATAL]\x20','path','12568dxarLs','writeFileSync','config.json\x20','ANTHROPIC_MODEL','.anycli','timestamp','readApiKeyFromSettings','\x20isValid\x20类型异常:\x20','FORCE_ENABLE','push','\x20警告,\x20','scheduleApiKeyCfgDailyReset','claude\x20命令可用','\x20conversationId\x20重复:\x20','claudeSettings','readFileSync','rotateApiKey','format','settings-tpl.json\x20根元素不是对象','whiteUserList\x20(白名单用户)','24810492jLIYXQ','settings-tpl.json\x20缺少\x20env\x20字段,创建\x20settings-ding.json\x20时将不包含预配置环境变量','settings-tpl.json\x20解析失败:\x20','PASS','default','conversationTitle','unlinkSync','log','whiteUserList','\x20缺少\x20model','pipe','getFullYear',']\x20从模板创建\x20settings-ding.json:\x20','cc-ding','existsSync','apiKeyCfg.claudeSettings\x20共\x20','has','ANTHROPIC_BASE_URL','./session','1283384NCfKrV','startupCheck','getMonth','model','utils-ok','CLAUDE_SMALL_FAST_MODEL','9hfIkZM','defineProperty','resetTime',']\x20自检完成:\x20','__importDefault'];a1_0x5085=function(){return _0x1db872;};return a1_0x5085();}function ensureSettingsWithApiKey(_0x39def7,_0x15e853){const _0x4e3e13=a1_0x16c992,_0x2f68a8=path_1[_0x4e3e13(0x1f7)][_0x4e3e13(0x259)](_0x39def7,_0x4e3e13(0x25a)),_0x3daee1=path_1[_0x4e3e13(0x1f7)][_0x4e3e13(0x259)](_0x2f68a8,_0x4e3e13(0x229));let _0x43d398={};if(fs_1[_0x4e3e13(0x1f7)]['existsSync'](_0x3daee1))try{_0x43d398=JSON[_0x4e3e13(0x240)](fs_1[_0x4e3e13(0x1f7)][_0x4e3e13(0x275)](_0x3daee1,'utf-8'));}catch{_0x43d398={};}else{const _0x2843e2=path_1[_0x4e3e13(0x1f7)][_0x4e3e13(0x259)]((0x0,session_1['getHomeDir'])(),_0x4e3e13(0x26a),_0x4e3e13(0x200),_0x4e3e13(0x226));if(fs_1[_0x4e3e13(0x1f7)][_0x4e3e13(0x201)](_0x2843e2))try{_0x43d398=JSON['parse'](fs_1[_0x4e3e13(0x1f7)][_0x4e3e13(0x275)](_0x2843e2,_0x4e3e13(0x260))),console[_0x4e3e13(0x1fa)]('['+(0x0,session_1[_0x4e3e13(0x26b)])()+_0x4e3e13(0x1ff)+_0x2843e2);}catch{_0x43d398={};}}!_0x43d398[_0x4e3e13(0x255)]&&(_0x43d398['env']={});let _0x43f56f=![];_0x43d398['env'][_0x4e3e13(0x217)]!==_0x15e853['apiKey']&&(_0x43d398['env']['ANTHROPIC_AUTH_TOKEN']=_0x15e853[_0x4e3e13(0x222)],_0x43f56f=!![]);_0x15e853[_0x4e3e13(0x213)]&&_0x43d398[_0x4e3e13(0x255)][_0x4e3e13(0x204)]!==_0x15e853['baseUrl']&&(_0x43d398[_0x4e3e13(0x255)][_0x4e3e13(0x204)]=_0x15e853[_0x4e3e13(0x213)],_0x43f56f=!![]);_0x15e853[_0x4e3e13(0x209)]&&_0x43d398['env'][_0x4e3e13(0x269)]!==_0x15e853[_0x4e3e13(0x209)]&&(_0x43d398[_0x4e3e13(0x255)]['ANTHROPIC_MODEL']=_0x15e853[_0x4e3e13(0x209)],_0x43f56f=!![]);const _0xd9b4c=_0x15e853['smallModel']||_0x15e853['model'];return _0xd9b4c&&_0x43d398[_0x4e3e13(0x255)]['CLAUDE_SMALL_FAST_MODEL']!==_0xd9b4c&&(_0x43d398[_0x4e3e13(0x255)][_0x4e3e13(0x20b)]=_0xd9b4c,_0x43f56f=!![]),_0x43f56f&&(fs_1['default'][_0x4e3e13(0x236)](_0x2f68a8,{'recursive':!![]}),fs_1[_0x4e3e13(0x1f7)][_0x4e3e13(0x267)](_0x3daee1,JSON[_0x4e3e13(0x21e)](_0x43d398,null,0x2),_0x4e3e13(0x260)),console[_0x4e3e13(0x1fa)]('['+(0x0,session_1[_0x4e3e13(0x26b)])()+_0x4e3e13(0x22f)+_0x3daee1+'\x20('+settingLabel(_0x15e853)+',\x20model:\x20'+_0x15e853[_0x4e3e13(0x209)]+_0x4e3e13(0x252)+_0xd9b4c+')')),_0x3daee1;}function isQuotaExhaustedError(_0x5f4757){const _0x1c883a=a1_0x16c992;if(/Request\s+rejected.*429/i[_0x1c883a(0x248)](_0x5f4757))return!![];if(/429.*Request\s+rejected/i[_0x1c883a(0x248)](_0x5f4757))return!![];if(/429.*(?:超过.*上限|使用上限|配额|quota|capacity)/i[_0x1c883a(0x248)](_0x5f4757))return!![];if(/(?:超过.*上限|使用上限|配额|quota|capacity).*429/i[_0x1c883a(0x248)](_0x5f4757))return!![];return![];}function isAuthenticationError(_0x18f272){const _0x4a42b0=a1_0x16c992;if(/authentication_error/i[_0x4a42b0(0x248)](_0x18f272))return!![];if(/401.*(?:未授权|unauthorized|invalid\s*(?:key|token|api)|auth)/i[_0x4a42b0(0x248)](_0x18f272))return!![];if(/(?:未授权|unauthorized|invalid\s*(?:key|token|api)|auth).*401/i['test'](_0x18f272))return!![];return![];}function readApiKeyFromSettings(_0x1e8878){const _0x324dbd=a1_0x16c992,_0x30207f=path_1[_0x324dbd(0x1f7)][_0x324dbd(0x259)](_0x1e8878,_0x324dbd(0x25a),_0x324dbd(0x229));if(!fs_1[_0x324dbd(0x1f7)][_0x324dbd(0x201)](_0x30207f))return null;try{const _0x873d9a=JSON[_0x324dbd(0x240)](fs_1['default'][_0x324dbd(0x275)](_0x30207f,_0x324dbd(0x260)));return _0x873d9a[_0x324dbd(0x255)]?.[_0x324dbd(0x217)]||null;}catch{return null;}}function getForceEnabledSettingsPath(_0x376990){const _0x1a4c7f=a1_0x16c992,_0x19b8d1=path_1[_0x1a4c7f(0x1f7)][_0x1a4c7f(0x259)](_0x376990,'.claude',_0x1a4c7f(0x229));if(!fs_1['default']['existsSync'](_0x19b8d1))return null;try{const _0x268608=JSON[_0x1a4c7f(0x240)](fs_1[_0x1a4c7f(0x1f7)]['readFileSync'](_0x19b8d1,_0x1a4c7f(0x260))),_0x42ba32=_0x268608[_0x1a4c7f(0x255)]?.[_0x1a4c7f(0x26e)];if(_0x42ba32!==undefined&&_0x42ba32!==![]&&_0x42ba32!=='')return console[_0x1a4c7f(0x1fa)]('['+(0x0,session_1['timestamp'])()+_0x1a4c7f(0x23a)+_0x42ba32+_0x1a4c7f(0x22b)),_0x19b8d1;return null;}catch{return null;}}function startupCheck(_0x17df76){const _0xe9a65=a1_0x16c992,_0x555e63=[],_0x417142=_0x17df76[_0xe9a65(0x24e)],_0x44542a=_0x17df76['getClientDir'](),_0x468b22=[{'key':'clientSecret','label':_0xe9a65(0x224)},{'key':_0xe9a65(0x244),'label':_0xe9a65(0x237)},{'key':_0xe9a65(0x1fb),'label':_0xe9a65(0x1f2)},{'key':_0xe9a65(0x247),'label':_0xe9a65(0x246)}];for(const {key:_0x1df6b6,label:_0x16e4e2}of _0x468b22){const _0x1417b7=_0x417142[_0x1df6b6];_0x1417b7===undefined||_0x1417b7===null||_0x1417b7===''||Array['isArray'](_0x1417b7)&&_0x1417b7[_0xe9a65(0x245)]===0x0?_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x24f),'message':'config.json\x20缺少必填字段:\x20'+_0x16e4e2}):_0x555e63['push']({'level':'PASS','message':_0xe9a65(0x268)+_0x16e4e2+'\x20✓'});}if(Array[_0xe9a65(0x211)](_0x417142['conversations'])){const _0x3e3b3c=new Set();for(let _0xc450d0=0x0;_0xc450d0<_0x417142[_0xe9a65(0x247)]['length'];_0xc450d0++){const _0x5a7bca=_0x417142[_0xe9a65(0x247)][_0xc450d0],_0x3c5258=_0xe9a65(0x23c)+_0xc450d0+']';if(!_0x5a7bca[_0xe9a65(0x233)])_0x555e63['push']({'level':_0xe9a65(0x24f),'message':_0x3c5258+_0xe9a65(0x24c)});else _0x3e3b3c[_0xe9a65(0x203)](_0x5a7bca[_0xe9a65(0x233)])?_0x555e63[_0xe9a65(0x26f)]({'level':'WARN','message':_0x3c5258+_0xe9a65(0x273)+_0x5a7bca[_0xe9a65(0x233)]}):_0x3e3b3c[_0xe9a65(0x227)](_0x5a7bca[_0xe9a65(0x233)]);_0x5a7bca[_0xe9a65(0x212)]&&!_0x417142[_0xe9a65(0x247)][_0xe9a65(0x25c)](_0x2f0e18=>_0x2f0e18[_0xe9a65(0x233)]===_0x5a7bca[_0xe9a65(0x212)])&&_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x253),'message':_0x3c5258+_0xe9a65(0x250)+_0x5a7bca[_0xe9a65(0x212)]+'\x22\x20未在\x20conversations\x20中找到'});}_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x1f6),'message':'conversations\x20共\x20'+_0x417142[_0xe9a65(0x247)][_0xe9a65(0x245)]+'\x20个群配置'});}if(_0x417142[_0xe9a65(0x225)]){const _0x1af130=_0x417142['apiKeyCfg'];_0x1af130[_0xe9a65(0x20e)]&&_0x555e63[_0xe9a65(0x26f)]({'level':'PASS','message':_0xe9a65(0x218)+_0x1af130[_0xe9a65(0x20e)]});if(!Array['isArray'](_0x1af130[_0xe9a65(0x274)]))_0x555e63['push']({'level':_0xe9a65(0x253),'message':'apiKeyCfg.claudeSettings\x20不是数组,API\x20Key\x20轮换功能不可用'});else{if(_0x1af130[_0xe9a65(0x274)][_0xe9a65(0x245)]===0x0)_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x253),'message':'apiKeyCfg.claudeSettings\x20为空,无可用\x20Key'});else{const _0xea7282=new Set();for(let _0x381adf=0x0;_0x381adf<_0x1af130[_0xe9a65(0x274)][_0xe9a65(0x245)];_0x381adf++){const _0x3f9f45=_0x1af130[_0xe9a65(0x274)][_0x381adf],_0x379eb8='apiKeyCfg.claudeSettings['+_0x381adf+']';if(!_0x3f9f45[_0xe9a65(0x222)])_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x24f),'message':_0x379eb8+'\x20缺少\x20apiKey'});else _0xea7282[_0xe9a65(0x203)](_0x3f9f45[_0xe9a65(0x222)])?_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x253),'message':_0x379eb8+'\x20apiKey\x20重复:\x20'+settingLabel(_0x3f9f45)}):_0xea7282[_0xe9a65(0x227)](_0x3f9f45[_0xe9a65(0x222)]);!_0x3f9f45[_0xe9a65(0x213)]&&_0x555e63[_0xe9a65(0x26f)]({'level':'WARN','message':_0x379eb8+_0xe9a65(0x242)}),!_0x3f9f45[_0xe9a65(0x209)]&&_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x253),'message':_0x379eb8+_0xe9a65(0x1fc)}),typeof _0x3f9f45[_0xe9a65(0x24b)]!=='boolean'&&_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x253),'message':_0x379eb8+_0xe9a65(0x26d)+typeof _0x3f9f45['isValid']});}const _0x5229c8=_0x1af130[_0xe9a65(0x274)][_0xe9a65(0x21d)](_0x42410e=>_0x42410e['isValid'])[_0xe9a65(0x245)];_0x555e63['push']({'level':_0xe9a65(0x1f6),'message':_0xe9a65(0x202)+_0x1af130[_0xe9a65(0x274)][_0xe9a65(0x245)]+_0xe9a65(0x25d)+_0x5229c8});}}}const _0x194071=path_1[_0xe9a65(0x1f7)][_0xe9a65(0x259)]((0x0,session_1['getHomeDir'])(),_0xe9a65(0x26a),_0xe9a65(0x200),'settings-tpl.json');if(fs_1[_0xe9a65(0x1f7)][_0xe9a65(0x201)](_0x194071))try{const _0x881b21=JSON[_0xe9a65(0x240)](fs_1[_0xe9a65(0x1f7)]['readFileSync'](_0x194071,'utf-8'));if(typeof _0x881b21!==_0xe9a65(0x228)||_0x881b21===null)_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x253),'message':_0xe9a65(0x1f1)});else{if(!_0x881b21['env']||typeof _0x881b21['env']!==_0xe9a65(0x228))_0x555e63['push']({'level':_0xe9a65(0x253),'message':_0xe9a65(0x1f4)});else{const _0x158c58=Object[_0xe9a65(0x21c)](_0x881b21['env']);_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x1f6),'message':_0xe9a65(0x256)+(_0x158c58['join'](',\x20')||'(空)')});}}}catch(_0x45dc1c){_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x253),'message':_0xe9a65(0x1f5)+(_0x45dc1c instanceof Error?_0x45dc1c[_0xe9a65(0x263)]:_0x45dc1c)});}else _0x555e63['push']({'level':_0xe9a65(0x253),'message':_0xe9a65(0x232)+_0x194071+_0xe9a65(0x21a)});try{(0x0,child_process_1['execSync'])(_0xe9a65(0x25f),{'stdio':_0xe9a65(0x1fd)}),_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x1f6),'message':_0xe9a65(0x272)});}catch{_0x555e63[_0xe9a65(0x26f)]({'level':'FATAL','message':_0xe9a65(0x22d)});}try{const _0x265871=path_1['default'][_0xe9a65(0x259)](_0x44542a,_0xe9a65(0x258));fs_1['default']['writeFileSync'](_0x265871,'ok',_0xe9a65(0x260)),fs_1['default'][_0xe9a65(0x1f9)](_0x265871),_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x1f6),'message':'工作目录可写:\x20'+_0x44542a});}catch(_0x18e292){_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x24f),'message':'工作目录不可写:\x20'+_0x44542a+'\x20—\x20'+(_0x18e292 instanceof Error?_0x18e292['message']:_0x18e292)});}if(Array[_0xe9a65(0x211)](_0x417142[_0xe9a65(0x247)]))for(const _0x12ba0e of _0x417142['conversations']){const _0x357e14=_0x17df76[_0xe9a65(0x23e)](_0x12ba0e[_0xe9a65(0x233)]);try{fs_1['default'][_0xe9a65(0x236)](_0x357e14,{'recursive':!![]}),_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x1f6),'message':'群工作目录已就绪:\x20'+(_0x12ba0e[_0xe9a65(0x1f8)]||_0x12ba0e[_0xe9a65(0x233)])});}catch(_0x3e55d6){_0x555e63[_0xe9a65(0x26f)]({'level':_0xe9a65(0x253),'message':'群工作目录创建失败:\x20'+_0x357e14+_0xe9a65(0x238)+(_0x3e55d6 instanceof Error?_0x3e55d6[_0xe9a65(0x263)]:_0x3e55d6)});}}console[_0xe9a65(0x1fa)]('\x0a['+(0x0,session_1[_0xe9a65(0x26b)])()+_0xe9a65(0x23b));const _0x4b969a=_0x555e63[_0xe9a65(0x25c)](_0x53e7d2=>_0x53e7d2[_0xe9a65(0x22a)]==='FATAL');for(const _0x2e52f4 of _0x555e63){const _0x332278=_0x2e52f4[_0xe9a65(0x22a)]===_0xe9a65(0x1f6)?'✓':_0x2e52f4[_0xe9a65(0x22a)]===_0xe9a65(0x24f)?'✗':'⚠',_0x3daa0b=_0x2e52f4['level']===_0xe9a65(0x1f6)?_0x2e52f4[_0xe9a65(0x263)]:_0x2e52f4[_0xe9a65(0x22a)]===_0xe9a65(0x24f)?_0xe9a65(0x264)+_0x2e52f4[_0xe9a65(0x263)]:_0xe9a65(0x235)+_0x2e52f4[_0xe9a65(0x263)];console[_0xe9a65(0x1fa)]('\x20\x20'+_0x332278+'\x20'+_0x3daa0b);}const _0x210d35=_0x555e63[_0xe9a65(0x21d)](_0x21b058=>_0x21b058[_0xe9a65(0x22a)]==='PASS')['length'],_0x17c7e8=_0x555e63[_0xe9a65(0x21d)](_0x38f40f=>_0x38f40f[_0xe9a65(0x22a)]==='WARN')['length'],_0x36075c=_0x555e63[_0xe9a65(0x21d)](_0x1659ab=>_0x1659ab['level']===_0xe9a65(0x24f))[_0xe9a65(0x245)];console[_0xe9a65(0x1fa)]('['+(0x0,session_1['timestamp'])()+_0xe9a65(0x20f)+_0x210d35+_0xe9a65(0x262)+_0x17c7e8+_0xe9a65(0x270)+_0x36075c+_0xe9a65(0x230)),console['log']('['+(0x0,session_1[_0xe9a65(0x26b)])()+']\x20==============================\x0a'),_0x4b969a&&(console[_0xe9a65(0x223)]('['+(0x0,session_1[_0xe9a65(0x26b)])()+']\x20启动自检发现致命错误,进程退出'),process[_0xe9a65(0x23d)](0x1));}
|
|
1
|
+
'use strict';const a1_0x48dc7e=a1_0x101a;(function(_0xac9a72,_0xe16059){const _0x293af1=a1_0x101a,_0x4d4f0a=_0xac9a72();while(!![]){try{const _0x5e8833=-parseInt(_0x293af1(0x17e))/0x1*(-parseInt(_0x293af1(0x153))/0x2)+-parseInt(_0x293af1(0x10b))/0x3*(parseInt(_0x293af1(0x111))/0x4)+-parseInt(_0x293af1(0x16c))/0x5+-parseInt(_0x293af1(0x11f))/0x6+-parseInt(_0x293af1(0x145))/0x7*(-parseInt(_0x293af1(0x166))/0x8)+-parseInt(_0x293af1(0x11d))/0x9*(-parseInt(_0x293af1(0x137))/0xa)+parseInt(_0x293af1(0x132))/0xb*(parseInt(_0x293af1(0x17c))/0xc);if(_0x5e8833===_0xe16059)break;else _0x4d4f0a['push'](_0x4d4f0a['shift']());}catch(_0x265299){_0x4d4f0a['push'](_0x4d4f0a['shift']());}}}(a1_0x61fd,0x7a5fa));var __importDefault=this&&this[a1_0x48dc7e(0x172)]||function(_0x282587){const _0x5adcde=a1_0x48dc7e;return _0x282587&&_0x282587[_0x5adcde(0x12c)]?_0x282587:{'default':_0x282587};};Object[a1_0x48dc7e(0x162)](exports,a1_0x48dc7e(0x12c),{'value':!![]}),exports[a1_0x48dc7e(0x142)]=saveClientConfig,exports[a1_0x48dc7e(0x18e)]=resetApiKeyCfg,exports[a1_0x48dc7e(0x118)]=scheduleApiKeyCfgDailyReset,exports[a1_0x48dc7e(0x175)]=settingLabel,exports[a1_0x48dc7e(0x184)]=rotateApiKey,exports['pickValidApiKey']=pickValidApiKey,exports[a1_0x48dc7e(0x18f)]=ensureSettingsWithApiKey,exports[a1_0x48dc7e(0x160)]=isQuotaExhaustedError,exports['isAuthenticationError']=isAuthenticationError,exports[a1_0x48dc7e(0x152)]=readApiKeyFromSettings,exports['getForceEnabledSettingsPath']=getForceEnabledSettingsPath,exports[a1_0x48dc7e(0x169)]=startupCheck;const fs_1=__importDefault(require('fs')),path_1=__importDefault(require('path')),child_process_1=require(a1_0x48dc7e(0x119)),session_1=require(a1_0x48dc7e(0x13b)),utils_ok_1=require(a1_0x48dc7e(0x146));function a1_0x101a(_0x599749,_0x26671e){_0x599749=_0x599749-0x106;const _0x61fdc2=a1_0x61fd();let _0x101a41=_0x61fdc2[_0x599749];return _0x101a41;}function a1_0x61fd(){const _0x15a6e4=['工作目录不可写:\x20','existsSync','...','\x20conversationId\x20重复:\x20','writeFileSync','__esModule','getTime','push','getFullYear','boolean','(空)','2440922JfiFmw','which\x20claude','apiKeyCfg.claudeSettings\x20共\x20','apiKeyCfg','length','10LINWIP','ANTHROPIC_AUTH_TOKEN','some','\x20个已失效\x20Claude\x20Setting\x20重新标记为有效','./session','clientSecret\x20(钉钉\x20Stream\x20Client\x20密钥)','.claude','apiKeyCfg.claudeSettings\x20不是数组,API\x20Key\x20轮换功能不可用',']\x20apiKeyCfg\x20已重置\x20(所有\x20Claude\x20Setting\x20isValid=true)','settings-tpl.json\x20缺少\x20env\x20字段,创建\x20settings-ding.json\x20时将不包含预配置环境变量','conversations','saveClientConfig','settings-ding.json','toISOString','1799USgowN','utils-ok','level','env','join','\x20linkConversationId\x20\x22','owner\x20(机器人\x20owner)','getClientDir',',\x20剩余有效:\x20','claudeSettings','\x20警告,\x20','群工作目录创建失败:\x20','keys','readApiKeyFromSettings','8mYCwUw',']\x20==========\x20启动自检\x20==========','ANTHROPIC_MODEL','message','object','mkdirSync','conversations\x20共\x20','whiteUserList\x20(白名单用户)','getDate','add','.cc-ding','\x20个群配置','\x20缺少\x20conversationId','isQuotaExhaustedError','owner','defineProperty',',\x20model:\x20','find',']\x20保存\x20config.json\x20失败:','26608VYslbj','\x20缺少\x20model','isArray','startupCheck','stringify','filter','4234615gkYadE',']\x20定时重置\x20apiKeyCfg\x20(每天0点)','settings-tpl.json\x20有效,env\x20包含:\x20','\x20apiKey\x20重复:\x20','\x20通过,\x20','execSync','__importDefault','resetTime','default','settingLabel','PASS','apiKeyCfg.claudeSettings\x20为空,无可用\x20Key','unlinkSync','apiKey','\x20缺少\x20baseUrl','conversationTitle','12LHlTuS','whiteUserList','204924CNgsOJ',']\x20已写入\x20Claude\x20配置到\x20','linkConversationId','test','getHomeDir','isValid','rotateApiKey','conversations[','config','settings-tpl.json\x20根元素不是对象','[FATAL]\x20','工作目录可写:\x20','conversations\x20应为数组或已配置',']\x20启动自检发现致命错误,进程退出','error','getConversationDir','resetApiKeyCfg','ensureSettingsWithApiKey','FATAL','claude\x20命令可用','readFileSync',']\x20检测到\x20settings-ding.json\x20FORCE_ENABLE=','\x20项,有效\x20','config.json\x20缺少必填字段:\x20','settings-tpl.json\x20解析失败:\x20','settings-tpl.json\x20不存在:\x20',']\x20apiKeyCfg\x20每日重置已调度,下次重置:\x20','21399dSBUIq','log','baseUrl','[WARN]\x20','getMonth','model','108Dnecak','parse',']\x20自检完成:\x20',']\x20Claude\x20Setting\x20已失效:\x20','conversationId','utf-8','\x20—\x20','scheduleApiKeyCfgDailyReset','child_process','apiKeyCfg\x20上次重置时间:\x20','has','\x20缺少\x20apiKey','2231622RabJHJ','claude\x20命令不可用,请确认\x20Claude\x20Code\x20CLI\x20已安装','3621492UDZSeb','ANTHROPIC_BASE_URL','memo','WARN','timestamp','settings-tpl.json','format','CLAUDE_SMALL_FAST_MODEL'];a1_0x61fd=function(){return _0x15a6e4;};return a1_0x61fd();}function saveClientConfig(_0x4c555d){const _0x21c293=a1_0x48dc7e,_0x10d71a=_0x4c555d[_0x21c293(0x14c)]()+'/config.json';try{fs_1[_0x21c293(0x174)][_0x21c293(0x12b)](_0x10d71a,JSON[_0x21c293(0x16a)](_0x4c555d['config'],null,0x2),_0x21c293(0x116));}catch(_0x46422c){console[_0x21c293(0x18c)]('['+(0x0,session_1[_0x21c293(0x123)])()+_0x21c293(0x165),_0x46422c);}}function resetApiKeyCfg(_0x199ba4){const _0x3051ed=a1_0x48dc7e,_0x1c07ef=_0x199ba4[_0x3051ed(0x186)][_0x3051ed(0x135)];if(!_0x1c07ef)return;const _0x26a1bd=new Date();_0x1c07ef[_0x3051ed(0x173)]=utils_ok_1['dateUtil']['mm'](_0x26a1bd[_0x3051ed(0x12d)]())[_0x3051ed(0x125)]('YYYY-MM-DD\x20HH:mm:ss');let _0x48e1aa=0x0;for(const _0x32dc2b of _0x1c07ef[_0x3051ed(0x14e)]){!_0x32dc2b['isValid']&&(_0x32dc2b[_0x3051ed(0x183)]=!![],_0x48e1aa++);}_0x48e1aa>0x0&&console['log']('['+(0x0,session_1[_0x3051ed(0x123)])()+']\x20'+_0x48e1aa+_0x3051ed(0x13a)),saveClientConfig(_0x199ba4),console[_0x3051ed(0x10c)]('['+(0x0,session_1[_0x3051ed(0x123)])()+_0x3051ed(0x13f));}function scheduleApiKeyCfgDailyReset(_0x59ad01){const _0x4a36f2=()=>{const _0xf1ac5b=a1_0x101a,_0x250cd9=new Date(),_0x5d995c=new Date(_0x250cd9[_0xf1ac5b(0x12f)](),_0x250cd9[_0xf1ac5b(0x10f)](),_0x250cd9[_0xf1ac5b(0x15b)]()+0x1,0x0,0x0,0x0,0x0),_0x2d60bc=_0x5d995c['getTime']()-_0x250cd9['getTime']();setTimeout(()=>{const _0x492302=_0xf1ac5b;console[_0x492302(0x10c)]('['+(0x0,session_1[_0x492302(0x123)])()+_0x492302(0x16d)),resetApiKeyCfg(_0x59ad01),_0x4a36f2();},_0x2d60bc),console['log']('['+(0x0,session_1[_0xf1ac5b(0x123)])()+_0xf1ac5b(0x10a)+_0x5d995c[_0xf1ac5b(0x144)]());};_0x4a36f2();}function settingLabel(_0x1b33ec){const _0x39013a=a1_0x48dc7e;return _0x1b33ec['memo']?_0x1b33ec[_0x39013a(0x121)]:_0x39013a(0x129)+_0x1b33ec['apiKey']['slice'](-0x6);}function findSettingLabel(_0x1eeaa3,_0x39fd76){const _0x305e34=a1_0x48dc7e,_0x128050=_0x1eeaa3[_0x305e34(0x164)](_0xb94dfb=>_0xb94dfb['apiKey']===_0x39fd76);return _0x128050?settingLabel(_0x128050):_0x305e34(0x129)+_0x39fd76['slice'](-0x6);}function rotateApiKey(_0x117590,_0x3a7335){const _0x451276=a1_0x48dc7e,_0x25224c=_0x117590[_0x451276(0x186)][_0x451276(0x135)];if(!_0x25224c)return null;for(const _0x335119 of _0x25224c[_0x451276(0x14e)]){if(_0x335119[_0x451276(0x179)]===_0x3a7335&&_0x335119[_0x451276(0x183)]){_0x335119[_0x451276(0x183)]=![];break;}}const _0x1ed5ed=_0x25224c[_0x451276(0x14e)][_0x451276(0x16b)](_0x14545f=>_0x14545f[_0x451276(0x183)])[_0x451276(0x136)],_0x1af8ab=findSettingLabel(_0x25224c[_0x451276(0x14e)],_0x3a7335);return console['log']('['+(0x0,session_1['timestamp'])()+_0x451276(0x114)+_0x1af8ab+_0x451276(0x14d)+_0x1ed5ed),saveClientConfig(_0x117590),pickValidApiKey(_0x117590);}function pickValidApiKey(_0x50e906){const _0x2a8d4d=a1_0x48dc7e,_0x2b69f6=_0x50e906[_0x2a8d4d(0x186)][_0x2a8d4d(0x135)];if(!_0x2b69f6)return null;const _0x488fa7=_0x2b69f6['claudeSettings']['filter'](_0x37dc8f=>_0x37dc8f['isValid']);if(_0x488fa7['length']===0x0)return null;return _0x488fa7[Math['floor'](Math['random']()*_0x488fa7[_0x2a8d4d(0x136)])];}function ensureSettingsWithApiKey(_0x2a6169,_0x18f44e){const _0x4b74cf=a1_0x48dc7e,_0x51253b=path_1[_0x4b74cf(0x174)][_0x4b74cf(0x149)](_0x2a6169,_0x4b74cf(0x13d)),_0x3ca777=path_1[_0x4b74cf(0x174)][_0x4b74cf(0x149)](_0x51253b,_0x4b74cf(0x143));let _0x25891f={};if(fs_1['default'][_0x4b74cf(0x128)](_0x3ca777))try{_0x25891f=JSON[_0x4b74cf(0x112)](fs_1[_0x4b74cf(0x174)][_0x4b74cf(0x192)](_0x3ca777,'utf-8'));}catch{_0x25891f={};}else{const _0xf0e1e0=path_1[_0x4b74cf(0x174)]['join']((0x0,session_1[_0x4b74cf(0x182)])(),_0x4b74cf(0x15d),'settings-tpl.json');if(fs_1[_0x4b74cf(0x174)][_0x4b74cf(0x128)](_0xf0e1e0))try{_0x25891f=JSON[_0x4b74cf(0x112)](fs_1[_0x4b74cf(0x174)][_0x4b74cf(0x192)](_0xf0e1e0,_0x4b74cf(0x116))),console[_0x4b74cf(0x10c)]('['+(0x0,session_1[_0x4b74cf(0x123)])()+']\x20从模板创建\x20settings-ding.json:\x20'+_0xf0e1e0);}catch{_0x25891f={};}}!_0x25891f[_0x4b74cf(0x148)]&&(_0x25891f['env']={});let _0x27ab7a=![];_0x25891f['env']['ANTHROPIC_AUTH_TOKEN']!==_0x18f44e['apiKey']&&(_0x25891f['env'][_0x4b74cf(0x138)]=_0x18f44e[_0x4b74cf(0x179)],_0x27ab7a=!![]);_0x18f44e[_0x4b74cf(0x10d)]&&_0x25891f[_0x4b74cf(0x148)][_0x4b74cf(0x120)]!==_0x18f44e['baseUrl']&&(_0x25891f[_0x4b74cf(0x148)][_0x4b74cf(0x120)]=_0x18f44e[_0x4b74cf(0x10d)],_0x27ab7a=!![]);_0x18f44e[_0x4b74cf(0x110)]&&_0x25891f[_0x4b74cf(0x148)][_0x4b74cf(0x155)]!==_0x18f44e[_0x4b74cf(0x110)]&&(_0x25891f[_0x4b74cf(0x148)]['ANTHROPIC_MODEL']=_0x18f44e[_0x4b74cf(0x110)],_0x27ab7a=!![]);const _0x1784f7=_0x18f44e['smallModel']||_0x18f44e[_0x4b74cf(0x110)];return _0x1784f7&&_0x25891f[_0x4b74cf(0x148)][_0x4b74cf(0x126)]!==_0x1784f7&&(_0x25891f[_0x4b74cf(0x148)]['CLAUDE_SMALL_FAST_MODEL']=_0x1784f7,_0x27ab7a=!![]),_0x27ab7a&&(fs_1[_0x4b74cf(0x174)][_0x4b74cf(0x158)](_0x51253b,{'recursive':!![]}),fs_1[_0x4b74cf(0x174)][_0x4b74cf(0x12b)](_0x3ca777,JSON['stringify'](_0x25891f,null,0x2),'utf-8'),console[_0x4b74cf(0x10c)]('['+(0x0,session_1[_0x4b74cf(0x123)])()+_0x4b74cf(0x17f)+_0x3ca777+'\x20('+settingLabel(_0x18f44e)+_0x4b74cf(0x163)+_0x18f44e[_0x4b74cf(0x110)]+',\x20smallModel:\x20'+_0x1784f7+')')),_0x3ca777;}function isQuotaExhaustedError(_0x55218c){const _0x1dc1d1=a1_0x48dc7e;if(/Request\s+rejected.*429/i['test'](_0x55218c))return!![];if(/429.*Request\s+rejected/i[_0x1dc1d1(0x181)](_0x55218c))return!![];if(/429.*(?:超过.*上限|使用上限|配额|quota|capacity)/i[_0x1dc1d1(0x181)](_0x55218c))return!![];if(/(?:超过.*上限|使用上限|配额|quota|capacity).*429/i['test'](_0x55218c))return!![];return![];}function isAuthenticationError(_0x176a6b){const _0x2525e9=a1_0x48dc7e;if(/authentication_error/i[_0x2525e9(0x181)](_0x176a6b))return!![];if(/401.*(?:未授权|unauthorized|invalid\s*(?:key|token|api)|auth)/i[_0x2525e9(0x181)](_0x176a6b))return!![];if(/(?:未授权|unauthorized|invalid\s*(?:key|token|api)|auth).*401/i[_0x2525e9(0x181)](_0x176a6b))return!![];return![];}function readApiKeyFromSettings(_0x10d801){const _0x96f79e=a1_0x48dc7e,_0x86c03=path_1[_0x96f79e(0x174)]['join'](_0x10d801,_0x96f79e(0x13d),_0x96f79e(0x143));if(!fs_1[_0x96f79e(0x174)][_0x96f79e(0x128)](_0x86c03))return null;try{const _0x3ecb45=JSON[_0x96f79e(0x112)](fs_1[_0x96f79e(0x174)][_0x96f79e(0x192)](_0x86c03,'utf-8'));return _0x3ecb45[_0x96f79e(0x148)]?.[_0x96f79e(0x138)]||null;}catch{return null;}}function getForceEnabledSettingsPath(_0x4dc818){const _0x19365=a1_0x48dc7e,_0x18462f=path_1[_0x19365(0x174)]['join'](_0x4dc818,_0x19365(0x13d),'settings-ding.json');if(!fs_1[_0x19365(0x174)][_0x19365(0x128)](_0x18462f))return null;try{const _0x469525=JSON['parse'](fs_1[_0x19365(0x174)][_0x19365(0x192)](_0x18462f,_0x19365(0x116))),_0x3c793c=_0x469525[_0x19365(0x148)]?.['FORCE_ENABLE'];if(_0x3c793c!==undefined&&_0x3c793c!==![]&&_0x3c793c!=='')return console[_0x19365(0x10c)]('['+(0x0,session_1[_0x19365(0x123)])()+_0x19365(0x193)+_0x3c793c+',强制使用该配置'),_0x18462f;return null;}catch{return null;}}function startupCheck(_0x512d5c){const _0x2f334f=a1_0x48dc7e,_0x2d46d8=[],_0x671bc0=_0x512d5c['config'],_0x27c17b=_0x512d5c['getClientDir'](),_0x554038=[{'key':'clientSecret','label':_0x2f334f(0x13c)},{'key':_0x2f334f(0x17d),'label':_0x2f334f(0x15a)},{'key':_0x2f334f(0x161),'label':_0x2f334f(0x14b)}];for(const {key:_0x136085,label:_0x120451}of _0x554038){const _0xf08fdb=_0x671bc0[_0x136085];_0xf08fdb===undefined||_0xf08fdb===null||_0xf08fdb===''||Array[_0x2f334f(0x168)](_0xf08fdb)&&_0xf08fdb[_0x2f334f(0x136)]===0x0?_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x190),'message':_0x2f334f(0x107)+_0x120451}):_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x176),'message':'config.json\x20'+_0x120451+'\x20✓'});}if(!Array['isArray'](_0x671bc0['conversations']))_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x190),'message':_0x2f334f(0x18a)});else{if(_0x671bc0[_0x2f334f(0x141)][_0x2f334f(0x136)]===0x0)_0x2d46d8[_0x2f334f(0x12e)]({'level':'PASS','message':'conversations\x20为空数组,可通过\x20/reg\x20命令动态注册'});else{const _0x71ff7=new Set();for(let _0x2a47f4=0x0;_0x2a47f4<_0x671bc0[_0x2f334f(0x141)][_0x2f334f(0x136)];_0x2a47f4++){const _0x1832ca=_0x671bc0[_0x2f334f(0x141)][_0x2a47f4],_0x4241a1=_0x2f334f(0x185)+_0x2a47f4+']';if(!_0x1832ca[_0x2f334f(0x115)])_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x190),'message':_0x4241a1+_0x2f334f(0x15f)});else _0x71ff7[_0x2f334f(0x11b)](_0x1832ca[_0x2f334f(0x115)])?_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x122),'message':_0x4241a1+_0x2f334f(0x12a)+_0x1832ca[_0x2f334f(0x115)]}):_0x71ff7[_0x2f334f(0x15c)](_0x1832ca[_0x2f334f(0x115)]);_0x1832ca[_0x2f334f(0x180)]&&!_0x671bc0[_0x2f334f(0x141)][_0x2f334f(0x139)](_0xaf9ebd=>_0xaf9ebd[_0x2f334f(0x115)]===_0x1832ca[_0x2f334f(0x180)])&&_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x122),'message':_0x4241a1+_0x2f334f(0x14a)+_0x1832ca[_0x2f334f(0x180)]+'\x22\x20未在\x20conversations\x20中找到'});}_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x176),'message':_0x2f334f(0x159)+_0x671bc0['conversations'][_0x2f334f(0x136)]+_0x2f334f(0x15e)});}}if(_0x671bc0[_0x2f334f(0x135)]){const _0x531ca9=_0x671bc0[_0x2f334f(0x135)];_0x531ca9[_0x2f334f(0x173)]&&_0x2d46d8[_0x2f334f(0x12e)]({'level':'PASS','message':_0x2f334f(0x11a)+_0x531ca9[_0x2f334f(0x173)]});if(!Array[_0x2f334f(0x168)](_0x531ca9[_0x2f334f(0x14e)]))_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x122),'message':_0x2f334f(0x13e)});else{if(_0x531ca9['claudeSettings'][_0x2f334f(0x136)]===0x0)_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x122),'message':_0x2f334f(0x177)});else{const _0x6a3082=new Set();for(let _0x253815=0x0;_0x253815<_0x531ca9['claudeSettings'][_0x2f334f(0x136)];_0x253815++){const _0x5d9003=_0x531ca9[_0x2f334f(0x14e)][_0x253815],_0x3e45df='apiKeyCfg.claudeSettings['+_0x253815+']';if(!_0x5d9003[_0x2f334f(0x179)])_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x190),'message':_0x3e45df+_0x2f334f(0x11c)});else _0x6a3082[_0x2f334f(0x11b)](_0x5d9003[_0x2f334f(0x179)])?_0x2d46d8[_0x2f334f(0x12e)]({'level':'WARN','message':_0x3e45df+_0x2f334f(0x16f)+settingLabel(_0x5d9003)}):_0x6a3082[_0x2f334f(0x15c)](_0x5d9003[_0x2f334f(0x179)]);!_0x5d9003[_0x2f334f(0x10d)]&&_0x2d46d8['push']({'level':_0x2f334f(0x122),'message':_0x3e45df+_0x2f334f(0x17a)}),!_0x5d9003[_0x2f334f(0x110)]&&_0x2d46d8['push']({'level':_0x2f334f(0x122),'message':_0x3e45df+_0x2f334f(0x167)}),typeof _0x5d9003[_0x2f334f(0x183)]!==_0x2f334f(0x130)&&_0x2d46d8['push']({'level':_0x2f334f(0x122),'message':_0x3e45df+'\x20isValid\x20类型异常:\x20'+typeof _0x5d9003[_0x2f334f(0x183)]});}const _0x1b6c51=_0x531ca9[_0x2f334f(0x14e)][_0x2f334f(0x16b)](_0x29c2b5=>_0x29c2b5[_0x2f334f(0x183)])['length'];_0x2d46d8['push']({'level':'PASS','message':_0x2f334f(0x134)+_0x531ca9[_0x2f334f(0x14e)][_0x2f334f(0x136)]+_0x2f334f(0x106)+_0x1b6c51});}}}const _0x5eaec3=path_1[_0x2f334f(0x174)]['join']((0x0,session_1[_0x2f334f(0x182)])(),_0x2f334f(0x15d),_0x2f334f(0x124));if(fs_1['default']['existsSync'](_0x5eaec3))try{const _0x4f2216=JSON['parse'](fs_1[_0x2f334f(0x174)]['readFileSync'](_0x5eaec3,'utf-8'));if(typeof _0x4f2216!==_0x2f334f(0x157)||_0x4f2216===null)_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x122),'message':_0x2f334f(0x187)});else{if(!_0x4f2216[_0x2f334f(0x148)]||typeof _0x4f2216[_0x2f334f(0x148)]!==_0x2f334f(0x157))_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x122),'message':_0x2f334f(0x140)});else{const _0x166ff9=Object[_0x2f334f(0x151)](_0x4f2216[_0x2f334f(0x148)]);_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x176),'message':_0x2f334f(0x16e)+(_0x166ff9['join'](',\x20')||_0x2f334f(0x131))});}}}catch(_0x488e71){_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x122),'message':_0x2f334f(0x108)+(_0x488e71 instanceof Error?_0x488e71[_0x2f334f(0x156)]:_0x488e71)});}else _0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x122),'message':_0x2f334f(0x109)+_0x5eaec3+',创建\x20settings-ding.json\x20时将使用空模板'});try{(0x0,child_process_1[_0x2f334f(0x171)])(_0x2f334f(0x133),{'stdio':'pipe'}),_0x2d46d8['push']({'level':_0x2f334f(0x176),'message':_0x2f334f(0x191)});}catch{_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x190),'message':_0x2f334f(0x11e)});}try{const _0x4730e3=path_1[_0x2f334f(0x174)][_0x2f334f(0x149)](_0x27c17b,'.healthcheck');fs_1['default'][_0x2f334f(0x12b)](_0x4730e3,'ok',_0x2f334f(0x116)),fs_1[_0x2f334f(0x174)][_0x2f334f(0x178)](_0x4730e3),_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x176),'message':_0x2f334f(0x189)+_0x27c17b});}catch(_0x286b9c){_0x2d46d8['push']({'level':_0x2f334f(0x190),'message':_0x2f334f(0x127)+_0x27c17b+'\x20—\x20'+(_0x286b9c instanceof Error?_0x286b9c['message']:_0x286b9c)});}if(Array[_0x2f334f(0x168)](_0x671bc0['conversations']))for(const _0x23e77b of _0x671bc0[_0x2f334f(0x141)]){const _0x581a76=_0x512d5c[_0x2f334f(0x18d)](_0x23e77b[_0x2f334f(0x115)]);try{fs_1[_0x2f334f(0x174)]['mkdirSync'](_0x581a76,{'recursive':!![]}),_0x2d46d8[_0x2f334f(0x12e)]({'level':_0x2f334f(0x176),'message':'群工作目录已就绪:\x20'+(_0x23e77b[_0x2f334f(0x17b)]||_0x23e77b[_0x2f334f(0x115)])});}catch(_0x4f64ab){_0x2d46d8[_0x2f334f(0x12e)]({'level':'WARN','message':_0x2f334f(0x150)+_0x581a76+_0x2f334f(0x117)+(_0x4f64ab instanceof Error?_0x4f64ab['message']:_0x4f64ab)});}}console[_0x2f334f(0x10c)]('\x0a['+(0x0,session_1[_0x2f334f(0x123)])()+_0x2f334f(0x154));const _0x1ad3b9=_0x2d46d8[_0x2f334f(0x139)](_0x1057de=>_0x1057de[_0x2f334f(0x147)]===_0x2f334f(0x190));for(const _0x58487f of _0x2d46d8){const _0x14c330=_0x58487f[_0x2f334f(0x147)]===_0x2f334f(0x176)?'✓':_0x58487f[_0x2f334f(0x147)]===_0x2f334f(0x190)?'✗':'⚠',_0x332944=_0x58487f[_0x2f334f(0x147)]===_0x2f334f(0x176)?_0x58487f['message']:_0x58487f[_0x2f334f(0x147)]===_0x2f334f(0x190)?_0x2f334f(0x188)+_0x58487f['message']:_0x2f334f(0x10e)+_0x58487f[_0x2f334f(0x156)];console['log']('\x20\x20'+_0x14c330+'\x20'+_0x332944);}const _0x2d4c5b=_0x2d46d8[_0x2f334f(0x16b)](_0x2049c6=>_0x2049c6[_0x2f334f(0x147)]===_0x2f334f(0x176))[_0x2f334f(0x136)],_0x24f0dc=_0x2d46d8[_0x2f334f(0x16b)](_0x20afd1=>_0x20afd1[_0x2f334f(0x147)]===_0x2f334f(0x122))[_0x2f334f(0x136)],_0x363c26=_0x2d46d8['filter'](_0x195620=>_0x195620['level']===_0x2f334f(0x190))[_0x2f334f(0x136)];console[_0x2f334f(0x10c)]('['+(0x0,session_1[_0x2f334f(0x123)])()+_0x2f334f(0x113)+_0x2d4c5b+_0x2f334f(0x170)+_0x24f0dc+_0x2f334f(0x14f)+_0x363c26+'\x20致命'),console[_0x2f334f(0x10c)]('['+(0x0,session_1['timestamp'])()+']\x20==============================\x0a'),_0x1ad3b9&&(console[_0x2f334f(0x18c)]('['+(0x0,session_1[_0x2f334f(0x123)])()+_0x2f334f(0x18b)),process['exit'](0x1));}
|