cc-ding 0.4.0 → 1.0.0
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/dist/bin/cc-ding.js +5 -5
- package/dist/src/biz/api-key-manager.js +3 -3
- package/dist/src/biz/cc-ding-cli.js +65 -66
- package/dist/src/biz/claude-process.js +33 -32
- package/dist/src/biz/claude-sdk.js +3 -2
- package/dist/src/biz/command-route.js +1 -1
- package/dist/src/biz/commands.js +6 -6
- package/dist/src/biz/cron.js +6 -6
- package/dist/src/biz/doctor.js +2 -2
- package/dist/src/biz/image.js +8 -8
- package/dist/src/biz/lock.js +1 -1
- package/dist/src/biz/menu.js +2 -2
- package/dist/src/biz/messaging.js +5 -5
- package/dist/src/biz/notify.js +1 -1
- package/dist/src/biz/platform.js +2 -2
- package/dist/src/biz/quote.js +5 -5
- package/dist/src/biz/recorder.js +9 -9
- package/dist/src/biz/secrets.js +1 -1
- package/dist/src/biz/session.js +13 -13
- package/dist/src/biz/task.js +23 -22
- package/dist/src/biz/todo.js +6 -6
- package/dist/src/common.js +1 -1
- package/dist/src/constants.js +1 -1
- package/package.json +4 -5
|
@@ -1,90 +1,89 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`;
|
|
3
|
-
`),msgType:"markdown"});return}for(const
|
|
4
|
-
`);await(0,
|
|
1
|
+
"use strict";var F=exports&&exports.__importDefault||function(E){return E&&E.__esModule?E:{default:E}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DingClaude=void 0;const B=require("child_process"),Q=require("utils-ok"),S=F(require("fs")),G=F(require("os")),N=F(require("path")),Y=require("../common"),A=require("./quote"),K=require("./messaging"),j=require("./image"),I=require("./commands"),V=require("./messaging"),x=require("./claude-process"),z=require("./recorder"),M=require("./menu"),c=require("./session"),b=require("./task"),C=require("./todo"),X=require("./commands"),L=require("./api-key-manager"),Z=require("./secrets"),v=require("./command-route"),P=require("./cron"),_=require("./platform"),J=(0,Y.projUtil)().getPkgVersion();class ee{constructor(d){this.resolvedPhones={},this.activeSessions=new Map,this.pendingAuthRequests=new Map,this.recorderModeConversations=new Set,this.DEFAULT_SESSION_MAX_CONCURRENCY=5,this.DEFAULT_TASK_HANDLER_COUNT=1,this.DEFAULT_TASK_QUEUE_SIZE=50,this.sendDingMessage=i=>(0,V.sendDingMessage)(this,i),this.sendClaudeResponseToDing=(i,o,a,s)=>(0,V.sendClaudeResponseToDing)(this,i,o,a,s),this.parseClaudeStreamLine=x.parseClaudeStreamLine,this.interruptClaudeProcess=(i,o)=>(0,x.interruptClaudeProcess)(i,o),this.executeClaudeQuery=(i,o,a)=>(0,x.executeClaudeQuery)(this,i,o,a),this.getClientDir=()=>(0,c.getClientDir)(this),this.getClientConfig=()=>(0,c.getClientConfig)(this),this.authCheck=(i,o)=>(0,c.authCheck)(this,i,o),this.isOwner=i=>(0,c.isOwner)(this,i),this.isAdmin=i=>(0,c.isAdmin)(this,i),this.debugLog=(i,...o)=>(0,c.debugLog)(this,i,...o),this.hashConversationId=i=>(0,c.hashConversationId)(this,i),this.getConversationConfig=i=>(0,c.getConversationConfig)(this,i),this.getConversationDir=i=>(0,c.getConversationDir)(this,i),this.getSessionsDir=i=>(0,c.getSessionsDir)(this,i),this.getTasksDir=i=>(0,c.getTasksDir)(this,i),this.getSessionDir=i=>(0,c.getSessionDir)(this,i),this.getSessionId=c.getSessionId,this.formatSessionInfo=i=>(0,c.formatSessionInfo)(this,i),this.readSessionLogTail=(i,o)=>(0,c.readSessionLogTail)(this,i,o),this.findActiveSession=i=>(0,c.findActiveSession)(this,i),this.findHistorySession=(i,o)=>(0,c.findHistorySession)(this,i,o),this.findLatestSession=i=>(0,c.findLatestSession)(this,i),this.updateSessionFile=(i,o)=>(0,c.updateSessionFile)(this,i,o),this.appendSessionLog=c.appendSessionLog,this.getActiveSessionsFile=i=>(0,c.getActiveSessionsFile)(this,i),this.saveActiveSession=i=>(0,c.saveActiveSession)(this,i),this.loadActiveSessions=()=>(0,c.loadActiveSessions)(this),this.endSession=(i,o)=>(0,c.endSession)(this,i,o),this.switchToSession=(i,o,a,s,h)=>(0,c.switchToSession)(this,i,o,a,s,h),this.startNewSession=i=>(0,c.startNewSession)(this,i),this.handleSessionMessage=i=>(0,c.handleSessionMessage)(this,i),this.cleanCache=(i,o=!0)=>(0,c.cleanCache)(this,i,o),this.formatTaskInfo=()=>(0,b.formatTaskInfo)(this),this.cancelTask=(i,o)=>(0,b.cancelTask)(this,i,o),this.countTodoTask=()=>(0,b.countTodoTask)(this),this.getOneTodoTask=()=>(0,b.getOneTodoTask)(this),this.finishTask=i=>(0,b.finishTask)(this,i),this.handleTask=()=>(0,b.handleTask)(this),this.runTaskHandlerLoop=()=>(0,b.runTaskHandlerLoop)(this),this.saveTask=i=>(0,b.saveTask)(this,i),this.clientId=d,this.config=(0,c.getClientConfig)(this);try{this.dingStreamClient=new Q.DingStreamClient({clientId:d,clientSecret:(0,Z.resolveSecret)(this.config.clientSecret),keepAlive:!0,debug:this.config.debug??!1})}catch(i){console.error("Error: DingStreamClient init failed.",i),process.exit(1)}this.cronEngine=new P.CronEngine(this)}async requireOwnerOrAdmin(d,i,o){return this.isOwner(o)||this.isAdmin(o)?!0:(await this.sendDingMessage({conversationId:d,sessionWebhook:i,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u6216\u7BA1\u7406\u5458\u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}appendBashAudit(d,i,o){try{const a=N.default.join(this.getClientDir(),"bash-audit.log"),s=`[${(0,c.timestamp)()}] conversation=${d} user=${i} cmd=${JSON.stringify(o)}
|
|
2
|
+
`;S.default.appendFileSync(a,s,{encoding:"utf-8",mode:(0,_.isWindows)()?void 0:384})}catch(a){console.error("\u5199\u5165 bash \u5BA1\u8BA1\u65E5\u5FD7\u5931\u8D25:",a)}}async requireOwner(d,i,o){return this.isOwner(o)?!0:(await this.sendDingMessage({conversationId:d,sessionWebhook:i,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}async requireOwnerOrSingleChat(d,i,o,a){return this.isOwner(o)||a?.conversationType==="1"?!0:(await this.sendDingMessage({conversationId:d,sessionWebhook:i,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}async handleAuthRequest(d){const{senderStaffId:i,senderNick:o,conversationId:a,conversationType:s,conversationTitle:h,sessionWebhook:n}=d;if(!this.config.ownerConversationId){await this.sendDingMessage({conversationId:a,sessionWebhook:n,content:["\u62B1\u6B49,\u60A8\u6682\u65E0\u4F7F\u7528\u6743\u9650","\u8BF7\u5C06\u4EE5\u4E0B\u4FE1\u606F\u53D1\u9001\u7ED9\u673A\u5668\u4EBA\u7BA1\u7406\u5458,\u7531\u7BA1\u7406\u5458\u901A\u8FC7\u547D\u4EE4\u6CE8\u518C:",`- **\u7FA4ID:** \`${a}\``,`- **\u6CE8\u518C\u547D\u4EE4:** \`/cfg --conversationId ${a}\``].join(`
|
|
3
|
+
`),msgType:"markdown"});return}for(const U of this.pendingAuthRequests.values())if(U.senderStaffId===i&&U.conversationId===a){await this.sendDingMessage({conversationId:a,sessionWebhook:n,content:"\u23F3 \u6388\u6743\u7533\u8BF7\u5DF2\u53D1\u9001\uFF0C\u8BF7\u7B49\u5F85\u7BA1\u7406\u5458\u5BA1\u6279...",msgType:"markdown"});return}const l=`r${Date.now().toString(36)}`,w={id:l,senderStaffId:i,senderNick:o,conversationId:a,conversationType:s,conversationTitle:h,requestTime:Date.now()};this.pendingAuthRequests.set(l,w),console.log(`[${(0,c.timestamp)()}] \u65B0\u6388\u6743\u7533\u8BF7: id=${l}, userId=${i}, \u6635\u79F0=${o}, \u4F1A\u8BDD=${a}`);const k=["\u{1F4CB} **\u6536\u5230\u6388\u6743\u7533\u8BF7**",`- **\u7528\u6237ID:** ${i}`,`- **\u6635\u79F0:** ${o}`,`- **\u4F1A\u8BDDID:** ${a}`,h?`- **\u4F1A\u8BDD\u6807\u9898:** ${h}`:"",`- **\u4F1A\u8BDD\u7C7B\u578B:** ${s==="1"?"\u5355\u804A":s==="2"?"\u7FA4\u804A":s||"-"}`,"",`\u56DE\u590D \`/auth approve ${l}\` \u901A\u8FC7`,`\u56DE\u590D \`/auth reject ${l}\` \u62D2\u7EDD`].filter(Boolean).join(`
|
|
4
|
+
`);await(0,K.sendOwnerMessage)(this,k,"markdown")?await this.sendDingMessage({conversationId:a,sessionWebhook:n,content:"\u2705 \u5DF2\u5411\u7BA1\u7406\u5458\u53D1\u9001\u6388\u6743\u7533\u8BF7\uFF0C\u8BF7\u7B49\u5F85\u5BA1\u6279...",msgType:"markdown"}):(this.pendingAuthRequests.delete(l),await this.sendDingMessage({conversationId:a,sessionWebhook:n,content:"\u274C \u6388\u6743\u7533\u8BF7\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u624B\u52A8\u6388\u6743",msgType:"markdown"}))}async handleCronCommand(d,i){const{conversationId:o,sessionWebhook:a,senderStaffId:s,senderNick:h,conversationConfig:n}=i;switch(d.type){case"list":{const l=await this.getOrCreateLogSession(o,a,s,h,n,!0),w=this.cronEngine.listJobs(o);l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user","/cron list"),this.appendSessionLog(l.sessionDir,"assistant",`\u5217\u51FA ${w.length} \u4E2A\u5B9A\u65F6\u4EFB\u52A1`)),await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:(0,P.formatCronJobList)(w),msgType:"markdown"});return}case"delete":{const l=this.cronEngine.removeJob(d.id),w=await this.getOrCreateLogSession(o,a,s,h,n);w.sessionDir&&(this.appendSessionLog(w.sessionDir,"user",`/cron delete ${d.id}`),this.appendSessionLog(w.sessionDir,"assistant",l?`\u5220\u9664\u5B9A\u65F6\u4EFB\u52A1 ${d.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${d.id}`)),await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:l?`\u2705 \u5B9A\u65F6\u4EFB\u52A1 **${d.id}** \u5DF2\u5220\u9664`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${d.id}`,msgType:"markdown"});return}case"pause":{const l=this.cronEngine.toggleJob(d.id,!1),w=await this.getOrCreateLogSession(o,a,s,h,n);w.sessionDir&&(this.appendSessionLog(w.sessionDir,"user",`/cron pause ${d.id}`),this.appendSessionLog(w.sessionDir,"assistant",l?`\u6682\u505C\u5B9A\u65F6\u4EFB\u52A1 ${d.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${d.id}`)),await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:l?`\u23F8\uFE0F \u5B9A\u65F6\u4EFB\u52A1 **${d.id}** \u5DF2\u6682\u505C`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${d.id}`,msgType:"markdown"});return}case"resume":{const l=this.cronEngine.toggleJob(d.id,!0),w=await this.getOrCreateLogSession(o,a,s,h,n);w.sessionDir&&(this.appendSessionLog(w.sessionDir,"user",`/cron resume ${d.id}`),this.appendSessionLog(w.sessionDir,"assistant",l?`\u6062\u590D\u5B9A\u65F6\u4EFB\u52A1 ${d.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${d.id}`)),await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:l?`\u25B6\uFE0F \u5B9A\u65F6\u4EFB\u52A1 **${d.id}** \u5DF2\u6062\u590D`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${d.id}`,msgType:"markdown"});return}case"create_cron":{if(!(0,P.isValidCronExpression)(d.cronExpression)){await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u274C \u65E0\u6548\u7684cron\u8868\u8FBE\u5F0F: \`${d.cronExpression}\`
|
|
5
5
|
|
|
6
|
-
\u{1F4A1} \u683C\u5F0F: \`\u5206 \u65F6 \u65E5 \u6708 \u5468\`\uFF0C\u5982 \`0 9 * * *\``,msgType:"markdown"});return}if(!this.hasNotifyCapability(
|
|
6
|
+
\u{1F4A1} \u683C\u5F0F: \`\u5206 \u65F6 \u65E5 \u6708 \u5468\`\uFF0C\u5982 \`0 9 * * *\``,msgType:"markdown"});return}if(!this.hasNotifyCapability(i.conversationConfig)){await this.sendCronNoNotifyError(o,a);return}const l=this.cronEngine.addJob({conversationId:o,cronExpression:d.cronExpression,description:this.sanitizeLogContent(d.prompt.substring(0,50)),prompt:d.prompt,senderStaffId:s,senderNick:h}),w=await this.getOrCreateLogSession(o,a,s,h,n);w.sessionDir&&(this.appendSessionLog(w.sessionDir,"user",`/cron ${d.cronExpression} ${this.sanitizeLogContent(d.prompt)}`),this.appendSessionLog(w.sessionDir,"assistant",`\u521B\u5EFA\u5B9A\u65F6\u4EFB\u52A1: ${l.id} [${l.cronExpression}] ${l.description}`)),await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:(0,P.formatCronJobInfo)(l),msgType:"markdown"});return}case"create_nl":{if(!this.hasNotifyCapability(i.conversationConfig)){await this.sendCronNoNotifyError(o,a);return}await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:"\u23F3 \u6B63\u5728\u5206\u6790\u5B9A\u65F6\u4EFB\u52A1\u63CF\u8FF0..."});const l=await this.cronEngine.analyzeAndCreate(o,d.input,s,h),w=await this.getOrCreateLogSession(o,a,s,h,n);l.job?(w.sessionDir&&(this.appendSessionLog(w.sessionDir,"user",`/cron ${this.sanitizeLogContent(d.input)}`),this.appendSessionLog(w.sessionDir,"assistant",`\u521B\u5EFA\u5B9A\u65F6\u4EFB\u52A1: ${l.job.id} [${l.job.cronExpression}] ${l.job.description}`)),await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:(0,P.formatCronJobInfo)(l.job),msgType:"markdown"})):(w.sessionDir&&(this.appendSessionLog(w.sessionDir,"user",`/cron ${this.sanitizeLogContent(d.input)}`),this.appendSessionLog(w.sessionDir,"assistant",`\u5B9A\u65F6\u4EFB\u52A1\u5206\u6790\u5931\u8D25: ${l.error}`)),await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u274C \u5B9A\u65F6\u4EFB\u52A1\u5206\u6790\u5931\u8D25: ${l.error}
|
|
7
7
|
|
|
8
|
-
\u{1F4A1} \u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u6307\u5B9Acron\u8868\u8FBE\u5F0F: \`/cron 0 9 * * * \u4EFB\u52A1\u63CF\u8FF0\``,msgType:"markdown"}));return}}}async handleMenuCommand(
|
|
8
|
+
\u{1F4A1} \u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u6307\u5B9Acron\u8868\u8FBE\u5F0F: \`/cron 0 9 * * * \u4EFB\u52A1\u63CF\u8FF0\``,msgType:"markdown"}));return}}}async handleMenuCommand(d,i){const{conversationId:o,sessionWebhook:a,senderStaffId:s}=i;if((d.type==="add"||d.type==="del")&&d.isGlobal&&!this.isOwner(s)){await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:"\u274C \u5168\u5C40\u83DC\u5355\u4EC5 owner \u53EF\u7BA1\u7406",msgType:"markdown"});return}switch(d.type){case"show":{const h=(0,M.getMergedMenu)(this,o,s),n=(0,M.loadMenuData)(this).global.length;h.length>0&&(0,M.setPendingSelection)(o,s,a,h),await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:(0,M.formatMenuDisplay)(h,n),msgType:"markdown"});return}case"add":{const h=(0,M.addMenuItem)(this,o,s,d.isGlobal,"",d.command);await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u2705 \u5DF2\u6DFB\u52A0${d.isGlobal?"\u5168\u5C40":"\u4E2A\u4EBA"}\u5FEB\u6377\u6307\u4EE4: **${h.label}** \u2192 \`${h.command}\``,msgType:"markdown"});return}case"del":{const h=(0,M.deleteMenuItem)(this,o,s,d.isGlobal,String(d.index));await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:h.success?`\u2705 \u5DF2\u5220\u9664${d.isGlobal?"\u5168\u5C40":"\u4E2A\u4EBA"}\u5FEB\u6377\u6307\u4EE4: **${h.deletedItem.label}**`:`\u26A0\uFE0F ${h.error}`,msgType:"markdown"});return}case"list":{await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:(0,M.formatMenuList)(this,o,s,d.isGlobal),msgType:"markdown"});return}case"trigger":{(0,M.setUserTrigger)(this,s,d.word),await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u2705 \u83DC\u5355\u89E6\u53D1\u8BCD\u5DF2\u8BBE\u7F6E\u4E3A \`${d.word}\`\uFF0C\u53D1\u9001\u8BE5\u8BCD\u5373\u53EF\u5524\u8D77\u83DC\u5355`,msgType:"markdown"});return}}}async handleTodoCommand(d,i){const{conversationId:o,sessionWebhook:a,senderStaffId:s,senderNick:h}=i;if(d.type==="mode"){(0,C.setIdMode)(this,o,d.mode);const n=d.mode==="staffId"?"\u5DE5\u53F7(staffId)":"\u9489\u9489ID(dingtalkId)";await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u2705 \u7528\u6237\u6807\u8BC6\u6A21\u5F0F\u5DF2\u5207\u6362\u4E3A: **${n}**
|
|
9
9
|
|
|
10
|
-
\u65B0\u6DFB\u52A0\u7684\u5F85\u529E\u5C06\u4F7F\u7528\u6B64\u6A21\u5F0F\u8BB0\u5F55\u8D1F\u8D23\u4EBA`,msgType:"markdown"});return}if(
|
|
10
|
+
\u65B0\u6DFB\u52A0\u7684\u5F85\u529E\u5C06\u4F7F\u7528\u6B64\u6A21\u5F0F\u8BB0\u5F55\u8D1F\u8D23\u4EBA`,msgType:"markdown"});return}if(d.type==="list"){const n=(0,C.getSortedTodoItems)(this,o),l=(0,C.getReminderHour)(this,o),k=(0,C.getIdMode)(this,o)==="staffId"?"\u5DE5\u53F7\u6A21\u5F0F":"\u9489\u9489ID\u6A21\u5F0F",y=(0,C.formatTodoList)(n,l),U=`\u{1F4CC} \u5F53\u524D\u6807\u8BC6\u6A21\u5F0F: **${k}**
|
|
11
11
|
|
|
12
|
-
${y}`;await this.sendDingMessage({conversationId:
|
|
13
|
-
`),
|
|
14
|
-
...(\u8F93\u51FA\u5DF2\u622A\u65AD)`:
|
|
15
|
-
`,"utf-8"),{sessionDir
|
|
12
|
+
${y}`;await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:U,msgType:"markdown"});return}if(d.type==="remind"){(0,C.setReminderHour)(this,o,d.hour);const n=d.hour===null?"\u23F0 \u6BCF\u65E5\u63D0\u9192\u5DF2\u5173\u95ED":`\u23F0 \u6BCF\u65E5\u63D0\u9192\u5DF2\u8BBE\u7F6E\u4E3A ${d.hour}:00`;await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:n});return}if(d.type==="done"){const n=(0,C.doneTodoItem)(this,o,d.index);n.success&&n.item?await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u2705 \u5DF2\u5B8C\u6210: ~~${n.item.content}~~ _@${n.item.assigneeNick}_`,msgType:"markdown"}):await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u274C ${n.error}`});return}if(d.type==="remove"){if(d.index==="all"){const n=(0,C.clearAllTodoItems)(this,o);n.success?await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u{1F5D1}\uFE0F \u5DF2\u6E05\u7A7A ${n.count} \u6761\u5F85\u529E`}):await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u274C ${n.error}`})}else{const n=(0,C.deleteTodoItem)(this,o,d.index);n.success&&n.item?await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u{1F5D1}\uFE0F \u5DF2\u5220\u9664: ~~${n.item.content}~~`,msgType:"markdown"}):await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u274C ${n.error}`})}return}if(d.type==="add"){const n=(0,C.getIdMode)(this,o),l=d.assigneeId||s,w=d.assigneeNick||h,k=d.deadline&&(0,C.parseDeadline)(d.deadline)||(0,C.getDefaultDeadline)(),y=(0,C.addTodoItem)(this,o,{content:d.content,assigneeStaffId:l,assigneeNick:w,deadline:k,assigneeIdType:n}),f=(0,C.getSortedTodoItems)(this,o).findIndex(R=>R.content===y.content&&R.createdAt===y.createdAt)+1,W=(0,C.formatTodoItemCreated)(y,f);await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:W,msgType:"markdown"});return}}sanitizeLogContent(d){return d.replace(/\n/g,"\\n").replace(/\r/g,"\\r")}sanitizeOutput(d){const i=d.replace(/\r\n/g,`
|
|
13
|
+
`),o=8e3;return i.length>o?i.substring(0,o)+`
|
|
14
|
+
...(\u8F93\u51FA\u5DF2\u622A\u65AD)`:i}truncateMsg(d,i=100){const o=d.replace(/\n/g," ").trim();return o.length>i?o.slice(0,i)+"...":o}async getOrCreateLogSession(d,i,o,a,s,h=!1){const n=this.findActiveSession(d);if(n)return{sessionDir:this.getSessionDir(n.session.session),isNew:!1};if(h)return{sessionDir:null,isNew:!1};const l=Date.now(),w={conversationId:d,sessionWebhook:i,startTime:l,startTimeStr:Q.dateUtil.mm(l).format("YYYY-MM-DD-HH-mm-ss"),startStaffId:o,startNickName:`[cron]${a}`},k=this.getSessionDir(w);return S.default.mkdirSync(k,{recursive:!0}),S.default.writeFileSync(`${k}/session.json`,JSON.stringify(w,null,2),"utf-8"),S.default.appendFileSync(`${k}/session.log`,`[${(0,c.timestamp)()}] [SYSTEM]: \u521B\u5EFA\u4F1A\u8BDD\u7528\u4E8E\u8BB0\u5F55 /cron \u547D\u4EE4\u64CD\u4F5C
|
|
15
|
+
`,"utf-8"),{sessionDir:k,isNew:!0}}hasNotifyCapability(d){return!!(d.dingToken||this.config.defaultDingToken)}async sendCronNoNotifyError(d,i){await this.sendDingMessage({conversationId:d,sessionWebhook:i,content:"\u274C \u5F53\u524D\u7FA4\u672A\u914D\u7F6E dingToken \u4E14\u65E0\u5BA2\u6237\u7AEF\u7EA7 defaultDingToken, \u5B9A\u65F6\u4EFB\u52A1\u65E0\u6CD5\u4E3B\u52A8\u53D1\u9001\u6D88\u606F, \u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u914D\u7F6E",msgType:"markdown"})}async botMsgGetCallback(d){this.dingStreamClient.socketCallBackResponse(d.headers.messageId,"");const i=JSON.parse(d.data),{senderNick:o,senderStaffId:a,conversationId:s,conversationTitle:h,sessionWebhook:n,msgtype:l,conversationType:w}=i,k=i.text?.content?.trim()??"";if(this.debugLog(`\u6536\u5230\u6D88\u606F: \u7FA4=${h}(${s}), \u53D1\u9001\u8005=${o}(${a}), \u7C7B\u578B=${l}, \u5185\u5BB9=${k.substring(0,50)}`),!this.authCheck(a,s)){await this.handleAuthRequest({senderStaffId:a,senderNick:o,conversationId:s,conversationType:w,conversationTitle:i.conversationTitle,sessionWebhook:n});return}const y=this.getConversationConfig(s);let U=(0,I.parseRecorderCommandEnhanced)(k);if(U==="exit"&&/^\/(?:exit|e)$/i.test(k)&&!this.recorderModeConversations.has(s)&&(U=null),U!==null){if(!this.isOwner(a)||w!=="1"){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u274C Recorder \u6A21\u5F0F\u4EC5\u9650 owner \u5355\u804A\u4F7F\u7528",msgType:"markdown"});return}if(U==="on"){this.recorderModeConversations.add(s);const e=(0,z.getRecorderDir)(this,s);console.log(`[${(0,c.timestamp)()}] [recorder] \u5F00\u542F recorder \u6A21\u5F0F: conversationId=${s}, dir=${e}`),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u{1F534} Recorder \u6A21\u5F0F\u5DF2\u5F00\u542F
|
|
16
16
|
- \u6240\u6709\u6D88\u606F\u5C06\u88AB\u5206\u7C7B\u8BB0\u5F55\u5230\u672C\u5730
|
|
17
17
|
- \u4FDD\u5B58\u76EE\u5F55: \`${e}\`
|
|
18
|
-
- \u53D1\u9001 \`/recorder exit\` \u5173\u95ED`,msgType:"markdown"})}else this.recorderModeConversations.delete(s),console.log(`[${(0,
|
|
19
|
-
\u{1F4A1} \u53EF\u7F16\u8F91 config.json \u8865\u5145\u66F4\u591A\u914D\u7F6E`),await this.sendDingMessage({conversationId:s,sessionWebhook:
|
|
20
|
-
`),msgType:"markdown"})}),(0,
|
|
18
|
+
- \u53D1\u9001 \`/recorder exit\` \u5173\u95ED`,msgType:"markdown"})}else this.recorderModeConversations.delete(s),console.log(`[${(0,c.timestamp)()}] [recorder] \u5173\u95ED recorder \u6A21\u5F0F: conversationId=${s}`),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u2B1C Recorder \u6A21\u5F0F\u5DF2\u5173\u95ED\uFF0C\u6062\u590D\u6B63\u5E38\u5904\u7406",msgType:"markdown"});return}if(this.recorderModeConversations.has(s)){try{await(0,z.recordMessage)(this,i,s),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u2705 \u5DF2\u8BB0\u5F55 ${l}`})}catch(e){console.error(`[${(0,c.timestamp)()}] [recorder] \u8BB0\u5F55\u6D88\u606F\u5931\u8D25:`,e),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u274C \u8BB0\u5F55\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`})}return}let f;if(l==="picture"&&i.pictureDownloadCode){const e=this.getConversationDir(s),r=y?.useLocalOcr!==!1,t=await(0,j.processPictureMessage)(this,i.pictureDownloadCode,i.robotCode,e,r,k||void 0);if(!t){await this.sendDingMessage({conversationId:s,sessionWebhook:n,atUserId:a,content:"\u26A0\uFE0F \u56FE\u7247\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u6216\u4F7F\u7528\u6587\u5B57\u63CF\u8FF0"});return}f=t}else if(l==="richText"&&i.content?.richText){const e=this.getConversationDir(s),r=y?.useLocalOcr!==!1;f=await(0,j.processRichTextMessage)(this,i.content.richText,i.robotCode,e,r)}else if(l==="file"){const e=(0,j.extractDownloadCode)(i);if(e){const r=this.getConversationDir(s),t=await(0,j.processFileMessage)(this,e,i.robotCode,r,k||void 0);if(!t){await this.sendDingMessage({conversationId:s,sessionWebhook:n,atUserId:a,content:"\u26A0\uFE0F \u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5"});return}f=t}else{await this.sendDingMessage({conversationId:s,sessionWebhook:n,atUserId:a,content:"\u26A0\uFE0F \u65E0\u6CD5\u83B7\u53D6\u6587\u4EF6\u4E0B\u8F7D\u94FE\u63A5\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001"});return}}else{if(f=k,!f){const e=this.getConversationDir(s),r=y?.useLocalOcr!==!1,t=(0,A.extractQuoteInfo)(i);t&&(this.debugLog(`\u68C0\u6D4B\u5230\u5F15\u7528\u6D88\u606F(\u65E0\u6B63\u6587): quoteMessageId=${t.quoteMessageId}`),await(0,A.enrichQuoteInfo)(this,t,i,e,r),t.quoteText&&(f=(0,A.formatPromptWithQuote)("",t)))}if(!f)return}if(!f.startsWith("/")&&l==="text"&&k){const e=this.getConversationDir(s),r=y?.useLocalOcr!==!1,t=(0,A.extractQuoteInfo)(i);t&&(this.debugLog(`\u68C0\u6D4B\u5230\u5F15\u7528\u6D88\u606F: quoteMessageId=${t.quoteMessageId}`),await(0,A.enrichQuoteInfo)(this,t,i,e,r),t.quoteText&&(f=(0,A.formatPromptWithQuote)(f,t)))}if(l==="text"&&f&&!f.startsWith("/")){if(f.toLowerCase()===(0,M.getUserTrigger)(this,a).toLowerCase())f="/menu";else if(/^\d+$/.test(f)&&(0,M.hasPendingSelection)(s,a)){const e=(0,M.getPendingSelection)(s,a);(0,M.clearPendingSelection)(s,a);const r=parseInt(f,10);if(r<1||r>e.mergedItems.length){await this.sendDingMessage({conversationId:s,sessionWebhook:n,atUserId:a,content:`\u26A0\uFE0F \u5E8F\u53F7\u65E0\u6548\uFF0C\u83DC\u5355\u5171 ${e.mergedItems.length} \u9879`});return}const t=e.mergedItems[r-1];console.log(`[${(0,c.timestamp)()}] [menu] ${o} \u9009\u62E9\u5FEB\u6377\u6307\u4EE4: ${t.label} \u2192 ${t.command}`),f=t.command}}const W=[(0,v.route)("/cfg",()=>(0,I.parseCfgCommand)(f),async e=>{if(e.conversationId&&!this.isOwner(a)){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u64CD\u4F5C\u5176\u4ED6\u7FA4\u7684\u914D\u7F6E",msgType:"markdown"});return}if(!await this.requireOwnerOrSingleChat(s,n,a,y))return;const r=e.conversationId||s,t=r!==s,g=t?this.config.conversations.find($=>$.conversationId===r):y,u=!!(e.dingToken||e.linkConversationId||e.whiteUserList&&e.whiteUserList.length>0||e.conversationTitle||e.atSender!==void 0||e.receiveReply!==void 0||e.preBash!==void 0||e.permissionMode!==void 0);if(g&&u){if(e.conversationTitle&&(g.conversationTitle=e.conversationTitle),w&&!t&&(g.conversationType=w),e.dingToken&&(g.dingToken=e.dingToken),e.linkConversationId&&(g.linkConversationId=e.linkConversationId),e.atSender!==void 0&&(g.atSender=e.atSender),e.receiveReply!==void 0&&(g.receiveReply=e.receiveReply),e.preBash!==void 0&&(g.preBash=e.preBash),e.permissionMode!==void 0&&(g.permissionMode=e.permissionMode),e.whiteUserList&&e.whiteUserList.length>0){g.whiteUserList=e.whiteUserList;for(const $ of e.whiteUserList)(0,c.isMobile)($)&&await(0,c.resolveUserId)(this,$)}(0,L.saveClientConfig)(this),console.log(`[${(0,c.timestamp)()}] \u5237\u65B0\u7FA4\u914D\u7F6E: ${g.conversationTitle||r}(${r})`)}else if(!g){const $={conversationId:r,conversationType:t?"1":w,conversationTitle:e.conversationTitle||(t?"":h)};if(e.dingToken&&($.dingToken=e.dingToken),e.linkConversationId&&($.linkConversationId=e.linkConversationId),e.atSender!==void 0&&($.atSender=e.atSender),e.receiveReply!==void 0&&($.receiveReply=e.receiveReply),e.preBash!==void 0&&($.preBash=e.preBash),e.permissionMode!==void 0&&($.permissionMode=e.permissionMode),e.whiteUserList&&e.whiteUserList.length>0){$.whiteUserList=e.whiteUserList;for(const T of e.whiteUserList)(0,c.isMobile)(T)&&await(0,c.resolveUserId)(this,T)}this.config.conversations.push($),(0,L.saveClientConfig)(this),console.log(`[${(0,c.timestamp)()}] \u6CE8\u518C\u65B0\u7FA4: ${$.conversationTitle||r}(${r}) \u7C7B\u578B=${$.conversationType||"-"}`)}const m=this.getConversationDir(r);S.default.existsSync(m)||(S.default.mkdirSync(m,{recursive:!0}),console.log(`[${(0,c.timestamp)()}] \u521B\u5EFA\u5DE5\u4F5C\u76EE\u5F55: ${m}`));const p=g||this.getConversationConfig(r),D=[g?"\u2705 \u7FA4\u914D\u7F6E\u5DF2\u5237\u65B0":"\u2705 \u7FA4\u5DF2\u6CE8\u518C",`- **\u7FA4\u540D\u79F0:** ${p?.conversationTitle||r}`,`- **\u7FA4ID:** ${r}`];if(p?.conversationType&&D.push(`- **\u4F1A\u8BDD\u7C7B\u578B:** ${p.conversationType==="1"?"\u5355\u804A":p.conversationType==="2"?"\u7FA4\u804A":p.conversationType}`),p?.dingToken?D.push(`- **dingToken:** ${p.dingToken.substring(0,8)}...`):D.push("- **dingToken:** (\u672A\u6307\u5B9A, \u4F7F\u7528 defaultDingToken)"),p?.linkConversationId&&D.push(`- **linkConversationId:** ${p.linkConversationId}`),p?.atSender===!1&&D.push("- **atSender:** false (\u4E0D @ \u53D1\u9001\u4EBA)"),p?.receiveReply===!1&&D.push("- **receiveReply:** false (\u4E0D\u56DE\u590D\u786E\u8BA4\u6D88\u606F)"),p?.permissionMode&&D.push(`- **permissionMode:** ${p.permissionMode}`),p?.whiteUserList?.length){const $=p.whiteUserList.map(T=>(0,c.isMobile)(T)?T:(0,c.userIdToPhone)(this,T)||T).join(", ");D.push(`- **whiteUserList:** ${$}`)}D.push(`- **\u5DE5\u4F5C\u76EE\u5F55:** ${m}`),D.push(`
|
|
19
|
+
\u{1F4A1} \u53EF\u7F16\u8F91 config.json \u8865\u5145\u66F4\u591A\u914D\u7F6E`),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:D.join(`
|
|
20
|
+
`),msgType:"markdown"})}),(0,v.route)("/help",()=>(0,I.parseHelpCommand)(f),async()=>{await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:(0,I.formatHelpOverview)(J,this.isOwner(a)),msgType:"markdown"})}),(0,v.route)("/version",()=>(0,I.parseVersionCommand)(f),async()=>{let e="\u672A\u5B89\u88C5";try{const{stdout:t}=await new Promise((g,u)=>{(0,B.exec)("claude --version",{timeout:5e3},(m,p,D)=>{m?u(m):g({stdout:p})})});e=t.trim()||"\u672A\u77E5"}catch{}const r=["### \u{1F4E6} cc-ding \u7248\u672C\u4FE1\u606F","",`- **cc-ding:** ${J}`,`- **Claude CLI:** ${e}`,`- **Node.js:** ${process.version}`,`- **\u7CFB\u7EDF:** ${G.default.platform()} ${G.default.release()}`].join(`
|
|
21
|
+
`);await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:r,msgType:"markdown"})}),(0,v.route)("cmd-help",()=>(0,I.parseCommandHelp)(f),async e=>{const r=(0,I.getCommandByName)(e);r?await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:(0,I.formatCommandHelp)(r),msgType:"markdown"}):await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u274C \u672A\u627E\u5230\u547D\u4EE4: **${e}**
|
|
21
22
|
|
|
22
|
-
\u{1F4A1} \u8F93\u5165 \`/help\` \u67E5\u770B\u6240\u6709\u53EF\u7528\u547D\u4EE4`,msgType:"markdown"})}),(0,
|
|
23
|
-
\u{1F4A1} \u6D3B\u8DC3\u4F1A\u8BDD\u5DF2\u4FDD\u7559`),
|
|
24
|
-
\u26A0\uFE0F \u9519\u8BEF: ${
|
|
25
|
-
`),msgType:"markdown"})}),(0,
|
|
23
|
+
\u{1F4A1} \u8F93\u5165 \`/help\` \u67E5\u770B\u6240\u6709\u53EF\u7528\u547D\u4EE4`,msgType:"markdown"})}),(0,v.route)("/reboot",()=>(0,I.parseRebootCommand)(f),async e=>{if(!await this.requireOwnerOrAdmin(s,n,a))return;if(e.tag&&!/^[\w.\-]+$/.test(e.tag)){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u274C \u65E0\u6548\u7684 tag\uFF0C\u4EC5\u5141\u8BB8\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u70B9\u3001\u6A2A\u7EBF\u548C\u4E0B\u5212\u7EBF",msgType:"markdown"});return}const r=e.tag?`@${e.tag}`:"@latest",t=e.update?`pnpm add -g cc-ding${r}`:null,g=`cc-ding-${this.clientId}`;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:t?`\u2705 \u66F4\u65B0\u5E76\u91CD\u542F\uFF0C\u6B63\u5728\u6267\u884C ${t}...`:"\u2705 cc-ding \u6B63\u5728\u91CD\u542F\u4E2D...",msgType:"markdown"});const u=N.default.join(this.getClientDir(),".reboot_pending");S.default.writeFileSync(u,JSON.stringify({conversationId:s,senderStaffId:a,sessionWebhook:n,update:e.update}),"utf-8"),setTimeout(()=>{console.log(`[${(0,c.timestamp)()}] \u6267\u884C pm2 restart ${g}${t?" (\u542B\u66F4\u65B0)":""}`),(0,B.exec)(`${t?`${t} && `:""}pm2 restart "${g}"`,{timeout:6e4},m=>{m&&console.error(`[${(0,c.timestamp)()}] pm2 restart \u5931\u8D25:`,m)})},1e3)})];for(const e of W)if(await e.tryHandle())return;if(!y){console.log(`\u672A\u6CE8\u518C\u7684\u673A\u5668\u4EBA,\u7FA4:${h},${s}`),this.isOwner(a)?await this.sendDingMessage({conversationId:s,sessionWebhook:n,atUserId:a,content:"\u26A0\uFE0F \u8BE5\u7FA4\u672A\u6CE8\u518C\uFF0C\u8BF7\u5148\u4F7F\u7528 `/cfg` \u547D\u4EE4\u6CE8\u518C",msgType:"markdown"}):await this.sendDingMessage({conversationId:s,sessionWebhook:n,atUserId:a,content:`\u62B1\u6B49,\u8BE5\u7FA4\u7684\u673A\u5668\u4EBA\u672A\u5728\u670D\u52A1\u7AEF\u6CE8\u518C,\u8BF7\u8054\u7CFB\u5E94\u7528\u673A\u5668\u4EBAowner\u6CE8\u518C(${s})...`});return}const R=[(0,v.route)("/clean",()=>(0,I.parseCleanCommand)(f),async e=>{if(e==="all"&&y?.conversationType!=="1"&&!this.isOwner(a)){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6E05\u9664\u6240\u6709\u7FA4\u7F13\u5B58",msgType:"markdown"});return}if(!await this.requireOwnerOrSingleChat(s,n,a,y))return;const r=e==="all"?null:s,t=this.cleanCache(r,!0),g=[];g.push("\u{1F9F9} \u7F13\u5B58\u6E05\u7406\u5B8C\u6210"),t.sessionsDeleted>0&&g.push(`- \u4F1A\u8BDD\u76EE\u5F55: ${t.sessionsDeleted} \u4E2A`),t.tasksDeleted>0&&g.push(`- \u4EFB\u52A1\u76EE\u5F55: ${t.tasksDeleted} \u4E2A`),t.imagesDeleted>0&&g.push(`- \u56FE\u7247\u6587\u4EF6: ${t.imagesDeleted} \u4E2A`),t.sessionsDeleted===0&&t.tasksDeleted===0&&t.imagesDeleted===0&&g.push("(\u65E0\u5386\u53F2\u6570\u636E)"),g.push(`
|
|
24
|
+
\u{1F4A1} \u6D3B\u8DC3\u4F1A\u8BDD\u5DF2\u4FDD\u7559`),t.errors.length>0&&g.push(`
|
|
25
|
+
\u26A0\uFE0F \u9519\u8BEF: ${t.errors.join("; ")}`),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:g.join(`
|
|
26
|
+
`),msgType:"markdown"})}),(0,v.route)("/reset-apikeycfg",()=>(0,I.parseResetApiKeyCfgCommand)(f),async()=>{if(!await this.requireOwner(s,n,a))return;if(!this.config.apiKeyCfg){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u26A0\uFE0F \u672A\u914D\u7F6E apiKeyCfg\uFF0C\u65E0\u9700\u91CD\u7F6E",msgType:"markdown"});return}(0,L.resetApiKeyCfg)(this);const e=this.config.apiKeyCfg.claudeSettings.filter(r=>r.isValid).length;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u2705 apiKeyCfg \u5DF2\u91CD\u7F6E
|
|
26
27
|
- \u6709\u6548 Key \u6570: ${e}/${this.config.apiKeyCfg.claudeSettings.length}
|
|
27
|
-
- \u91CD\u7F6E\u65F6\u95F4: ${this.config.apiKeyCfg.resetTime||"-"}`,msgType:"markdown"})}),(0,
|
|
28
|
-
- **\u7528\u6237ID:** ${
|
|
29
|
-
- **\u6635\u79F0:** ${
|
|
30
|
-
- **\u4F1A\u8BDDID:** ${
|
|
31
|
-
- **\u7528\u6237ID:** ${
|
|
32
|
-
- **\u6635\u79F0:** ${
|
|
33
|
-
`):"(\u672A\u914D\u7F6E\u7FA4\u7EA7\u767D\u540D\u5355\uFF0C\u4F7F\u7528\u5168\u5C40\u767D\u540D\u5355)";await this.sendDingMessage({conversationId:s,sessionWebhook:
|
|
34
|
-
${
|
|
35
|
-
`):"(\u672A\u914D\u7F6E\u7BA1\u7406\u5458)";await this.sendDingMessage({conversationId:s,sessionWebhook:
|
|
36
|
-
${
|
|
37
|
-
\u5F53\u524D\u767D\u540D\u5355: ${u.join(", ")}`,msgType:"markdown"});return}if(e.type==="del"){let
|
|
38
|
-
\u5F53\u524D\u767D\u540D\u5355: ${
|
|
28
|
+
- \u91CD\u7F6E\u65F6\u95F4: ${this.config.apiKeyCfg.resetTime||"-"}`,msgType:"markdown"})}),(0,v.route)("/auth",()=>(0,I.parseAuthCommand)(f),async e=>{if(!await this.requireOwner(s,n,a))return;if(e.type==="approve"||e.type==="reject"){const t=this.pendingAuthRequests.get(e.requestId);if(!t){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u274C \u672A\u627E\u5230\u6388\u6743\u7533\u8BF7: ${e.requestId}`,msgType:"markdown"});return}if(this.pendingAuthRequests.delete(e.requestId),e.type==="approve"){let g=this.config.conversations.find(u=>u.conversationId===t.conversationId);g||(g={conversationId:t.conversationId,conversationType:t.conversationType||"1",conversationTitle:t.conversationTitle},this.config.conversations.push(g)),g.whiteUserList||(g.whiteUserList=[]),g.whiteUserList.includes(t.senderStaffId)||g.whiteUserList.push(t.senderStaffId),(0,L.saveClientConfig)(this),console.log(`[${(0,c.timestamp)()}] \u6388\u6743\u7533\u8BF7\u901A\u8FC7\u5C06: id=${e.requestId}, userId=${t.senderStaffId}`),await(0,K.sendMessageToUser)(this,t.senderStaffId,"\u2705 \u60A8\u7684\u6388\u6743\u7533\u8BF7\u5DF2\u901A\u8FC7\uFF0C\u73B0\u5728\u53EF\u4EE5\u5F00\u59CB\u4F7F\u7528\u4E86","markdown"),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u2705 \u5DF2\u901A\u8FC7\u6388\u6743\u7533\u8BF7
|
|
29
|
+
- **\u7528\u6237ID:** ${t.senderStaffId}
|
|
30
|
+
- **\u6635\u79F0:** ${t.senderNick}
|
|
31
|
+
- **\u4F1A\u8BDDID:** ${t.conversationId}`,msgType:"markdown"})}else console.log(`[${(0,c.timestamp)()}] \u6388\u6743\u7533\u8BF7\u62D2\u7EDD: id=${e.requestId}, userId=${t.senderStaffId}`),await(0,K.sendMessageToUser)(this,t.senderStaffId,"\u274C \u60A8\u7684\u6388\u6743\u7533\u8BF7\u5DF2\u88AB\u62D2\u7EDD","markdown"),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u2705 \u5DF2\u62D2\u7EDD\u6388\u6743\u7533\u8BF7
|
|
32
|
+
- **\u7528\u6237ID:** ${t.senderStaffId}
|
|
33
|
+
- **\u6635\u79F0:** ${t.senderNick}`,msgType:"markdown"});return}const r=y.whiteUserList;if(e.type==="list"){const t=r&&r.length>0?r.map(g=>`- ${(0,c.userIdToPhone)(this,g)||g}`).join(`
|
|
34
|
+
`):"(\u672A\u914D\u7F6E\u7FA4\u7EA7\u767D\u540D\u5355\uFF0C\u4F7F\u7528\u5168\u5C40\u767D\u540D\u5355)";await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u{1F4CB} **\u5F53\u524D\u7FA4\u767D\u540D\u5355**
|
|
35
|
+
${t}`,msgType:"markdown"});return}if(e.type==="adminList"){const t=this.config.adminUserList&&this.config.adminUserList.length>0?this.config.adminUserList.map(g=>`- ${(0,c.userIdToPhone)(this,g)||g}`).join(`
|
|
36
|
+
`):"(\u672A\u914D\u7F6E\u7BA1\u7406\u5458)";await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u{1F451} **\u7BA1\u7406\u5458\u5217\u8868**
|
|
37
|
+
${t}`,msgType:"markdown"});return}if(e.type==="adminAdd"){let t=e.staffId;if((0,c.isMobile)(e.staffId)&&(t=await(0,c.resolveUserId)(this,e.staffId),!t)){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${e.staffId}`,msgType:"markdown"});return}if(this.config.adminUserList?.some(m=>(0,c.resolveToUserId)(this,m)===t)){const m=(0,c.userIdToPhone)(this,t)||t;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u26A0\uFE0F ${m} \u5DF2\u5728\u7BA1\u7406\u5458\u5217\u8868\u4E2D`,msgType:"markdown"});return}this.config.adminUserList||(this.config.adminUserList=[]),this.config.adminUserList.push(e.staffId),(0,L.saveClientConfig)(this);const u=(0,c.isMobile)(e.staffId)?e.staffId:(0,c.userIdToPhone)(this,e.staffId)||e.staffId;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u2705 \u5DF2\u6DFB\u52A0 ${u} \u5230\u7BA1\u7406\u5458\u5217\u8868`,msgType:"markdown"});return}if(e.type==="adminRm"){let t=e.staffId;if((0,c.isMobile)(e.staffId)&&(t=await(0,c.resolveUserId)(this,e.staffId),!t)){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${e.staffId}`,msgType:"markdown"});return}const g=this.config.adminUserList?.findIndex(p=>(0,c.resolveToUserId)(this,p)===t)??-1;if(g<0){const p=(0,c.userIdToPhone)(this,t)||t;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u26A0\uFE0F ${p} \u4E0D\u5728\u7BA1\u7406\u5458\u5217\u8868\u4E2D`,msgType:"markdown"});return}const u=this.config.adminUserList[g];this.config.adminUserList.splice(g,1),this.config.adminUserList.length===0&&delete this.config.adminUserList,(0,L.saveClientConfig)(this);const m=(0,c.userIdToPhone)(this,t)||u;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u2705 \u5DF2\u79FB\u9664 ${m}`,msgType:"markdown"});return}if(e.type==="add"){let t=e.staffId;if((0,c.isMobile)(e.staffId)&&(t=await(0,c.resolveUserId)(this,e.staffId),!t)){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${e.staffId}`,msgType:"markdown"});return}if(r?.some(p=>(0,c.resolveToUserId)(this,p)===t)){const p=(0,c.userIdToPhone)(this,t)||t;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u26A0\uFE0F ${p} \u5DF2\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}y.whiteUserList||(y.whiteUserList=[]),y.whiteUserList.push(e.staffId),(0,L.saveClientConfig)(this);const u=y.whiteUserList.map(p=>{const D=(0,c.resolveToUserId)(this,p);return(0,c.userIdToPhone)(this,D)||p}),m=(0,c.isMobile)(e.staffId)?e.staffId:(0,c.userIdToPhone)(this,e.staffId)||e.staffId;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u2705 \u5DF2\u6DFB\u52A0 ${m} \u5230\u5F53\u524D\u7FA4\u767D\u540D\u5355
|
|
38
|
+
\u5F53\u524D\u767D\u540D\u5355: ${u.join(", ")}`,msgType:"markdown"});return}if(e.type==="del"){let t=e.staffId;if((0,c.isMobile)(e.staffId)&&(t=await(0,c.resolveUserId)(this,e.staffId),!t)){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${e.staffId}`,msgType:"markdown"});return}const g=r?.findIndex(D=>(0,c.resolveToUserId)(this,D)===t)??-1;if(g<0){const D=(0,c.userIdToPhone)(this,t)||t;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u26A0\uFE0F ${D} \u4E0D\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}const u=y.whiteUserList[g];y.whiteUserList.splice(g,1),y.whiteUserList.length===0&&delete y.whiteUserList,(0,L.saveClientConfig)(this);const m=y.whiteUserList?.length?y.whiteUserList.map(D=>{const $=(0,c.resolveToUserId)(this,D);return(0,c.userIdToPhone)(this,$)||D}).join(", "):"(\u7A7A\uFF0C\u4F7F\u7528\u5168\u5C40\u767D\u540D\u5355)",p=(0,c.userIdToPhone)(this,t)||u;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u2705 \u5DF2\u79FB\u9664 ${p}
|
|
39
|
+
\u5F53\u524D\u767D\u540D\u5355: ${m}`,msgType:"markdown"});return}}),(0,v.route)("/open",()=>(0,I.parseOpenCommand)(f),async e=>{if(!await this.requireOwner(s,n,a))return;const r=this.getConversationDir(s),t=process.platform,g=(u,m,p)=>new Promise((D,$)=>{const T=(0,_.spawnCommand)(u,m,{cwd:p,detached:!0,stdio:"ignore"});T.once("error",$),T.once("spawn",()=>{T.unref(),D()})});try{if(e==="folder"){if(t==="darwin")await g("open",[r]);else if((0,_.isWindowsPlatform)(t))await g("explorer.exe",[r]);else if((0,_.commandExists)("xdg-open"))await g("xdg-open",[r]);else throw new Error("\u672A\u68C0\u6D4B\u5230\u53EF\u7528\u7684\u6587\u4EF6\u7BA1\u7406\u5668\u6253\u5F00\u547D\u4EE4");await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u{1F4C2} \u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u6253\u5F00:
|
|
39
40
|
\`\`\`
|
|
40
|
-
${
|
|
41
|
-
\`\`\``,msgType:"markdown"})
|
|
41
|
+
${r}
|
|
42
|
+
\`\`\``,msgType:"markdown"})}else if(e==="code"){if(!(0,_.commandExists)("code")){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u274C \u672A\u68C0\u6D4B\u5230 VS Code `code` \u547D\u4EE4\n\u8BF7\u5B89\u88C5 VS Code \u5E76\u786E\u8BA4 `code` \u5DF2\u52A0\u5165 PATH",msgType:"markdown"});return}await g("code",[r]),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u{1F4BB} \u5DF2\u5728 VS Code \u4E2D\u6253\u5F00:
|
|
42
43
|
\`\`\`
|
|
43
|
-
${
|
|
44
|
-
\`\`\``,msgType:"markdown"})}
|
|
44
|
+
${r}
|
|
45
|
+
\`\`\``,msgType:"markdown"})}else{if(t==="darwin")await g("open",["-a","Terminal",r]);else if((0,_.isWindowsPlatform)(t))await g("cmd.exe",["/K","cd","/d",r]);else if((0,_.commandExists)("x-terminal-emulator"))await g("x-terminal-emulator",[],r);else throw new Error("\u672A\u68C0\u6D4B\u5230\u53EF\u7528\u7684\u7EC8\u7AEF\u6253\u5F00\u547D\u4EE4");await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u{1F4BB} \u5DF2\u5728\u7EC8\u7AEF\u4E2D\u6253\u5F00:
|
|
45
46
|
\`\`\`
|
|
46
|
-
${
|
|
47
|
-
\`\`\``,msgType:"markdown"})}catch(u){await this.sendDingMessage({conversationId:s,sessionWebhook:
|
|
47
|
+
${r}
|
|
48
|
+
\`\`\``,msgType:"markdown"})}}catch(u){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u274C \u6253\u5F00\u5931\u8D25: ${u instanceof Error?u.message:String(u)}`,msgType:"markdown"})}}),(0,v.route)("/cron",()=>(0,I.parseCronCommand)(f),async e=>{await this.handleCronCommand(e,{conversationId:s,sessionWebhook:n,senderStaffId:a,senderNick:o,conversationConfig:y})}),(0,v.route)("/todo",()=>(0,X.parseTodoCommand)(f,i.atUsers),async e=>{await this.handleTodoCommand(e,{conversationId:s,sessionWebhook:n,senderStaffId:a,senderNick:o})}),(0,v.route)("/menu",()=>(0,I.parseMenuCommand)(f),async e=>{await this.handleMenuCommand(e,{conversationId:s,sessionWebhook:n,senderStaffId:a})}),(0,v.route)("/bash",()=>(0,I.parseBashCommand)(f),async e=>{if(!await this.requireOwnerOrAdmin(s,n,a))return;this.appendBashAudit(s,a,e);const r=this.getConversationDir(s),t=[];this.config.preBash&&t.push(this.config.preBash),y?.preBash&&t.push(y.preBash);const g=(0,_.isWindowsPlatform)()?" && ":" ; ",u=t.length>0?[...t,e].join(g):e,m=this;(0,B.exec)(u,{cwd:r,timeout:3e4,maxBuffer:1024*1024},async(p,D,$)=>{try{let T;if(p)T=`\u274C \u547D\u4EE4\u6267\u884C\u5931\u8D25
|
|
48
49
|
\`\`\`
|
|
49
50
|
${p.message}
|
|
50
|
-
|
|
51
|
+
\`\`\``,$&&(T+=`
|
|
51
52
|
|
|
52
53
|
**stderr:**
|
|
53
54
|
\`\`\`
|
|
54
|
-
${
|
|
55
|
-
\`\`\``);else{const
|
|
55
|
+
${m.sanitizeOutput($)}
|
|
56
|
+
\`\`\``);else{const O=D||"(\u65E0\u8F93\u51FA)";T=`\u2705 \u6267\u884C\u6210\u529F
|
|
56
57
|
\`\`\`
|
|
57
|
-
${
|
|
58
|
-
|
|
58
|
+
${m.sanitizeOutput(O)}
|
|
59
|
+
\`\`\``,$&&(T+=`
|
|
59
60
|
|
|
60
61
|
**stderr:**
|
|
61
62
|
\`\`\`
|
|
62
|
-
${
|
|
63
|
-
\`\`\``)}await
|
|
63
|
+
${m.sanitizeOutput($)}
|
|
64
|
+
\`\`\``)}await m.sendDingMessage({conversationId:s,sessionWebhook:n,content:T,msgType:"markdown"})}catch(T){console.error("[bash] \u53D1\u9001\u6D88\u606F\u5931\u8D25:",T)}})}),(0,v.route)("/new",()=>/^\/new(?:\s|$)/i.test(f),async()=>{const e=this.findActiveSession(s);e&&(console.log(`\u6536\u5230\u65B0\u4F1A\u8BDD\u547D\u4EE4\uFF0C\u7ED3\u675F\u65E7\u4F1A\u8BDD: \u7FA4=${e.session.session.conversationId}, \u4F1A\u8BDDID=${this.getSessionId(e.session.session)}`),this.interruptClaudeProcess(e.session,"\u65B0\u4F1A\u8BDD\u547D\u4EE4\u4E2D\u65AD\u6B63\u5728\u6267\u884C\u7684 Claude \u8FDB\u7A0B"),this.activeSessions.delete(e.key),this.saveActiveSession(e.key));const r=f.replace(/^\/new\s*/i,"").trim();r?await this.startNewSession({conversationId:s,sessionWebhook:n,senderStaffId:a,senderNick:o,message:r,conversationConfig:y}):await this.sendDingMessage({conversationId:s,sessionWebhook:n,atUserId:a,content:"\u{1F680} \u8BF7\u8F93\u5165\u60A8\u7684\u95EE\u9898\u5F00\u59CB\u65B0\u4F1A\u8BDD"})}),(0,v.route)("/resume",()=>(0,I.parseContinueSessionCommand)(f),async e=>{let r=e;if(!r){const t=(0,c.findLatestSession)(this,s);if(!t){await this.sendDingMessage({conversationId:s,sessionWebhook:n,atUserId:a,content:"\u26A0\uFE0F \u672A\u627E\u5230\u5DF2\u7ED3\u675F\u7684\u4F1A\u8BDD",msgType:"markdown"});return}r=(0,c.getSessionId)(t)}await this.switchToSession(s,n,r,a,y)}),(0,v.route)("/log",()=>(0,I.parseLogCommand)(f),async e=>{const r=this.readSessionLogTail(s,e);r?await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u{1F4CB} \u6700\u8FD1 ${e} \u884C\u65E5\u5FD7:
|
|
64
65
|
\`\`\`
|
|
65
|
-
${
|
|
66
|
-
\`\`\``,msgType:"markdown"}):await this.sendDingMessage({conversationId:s,sessionWebhook:
|
|
67
|
-
`+(0,
|
|
68
|
-
`+(0,
|
|
69
|
-
`+
|
|
70
|
-
\u65E0\u6D3B\u8DC3\u4F1A\u8BDD`)}(e==="all"||e==="task")&&
|
|
71
|
-
`+this.formatTaskInfo()),await this.sendDingMessage({conversationId:s,sessionWebhook:
|
|
66
|
+
${r}
|
|
67
|
+
\`\`\``,msgType:"markdown"}):await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u6D3B\u8DC3\u4F1A\u8BDD\u6216\u6682\u65E0\u65E5\u5FD7"})}),(0,v.route)("/info",()=>(0,I.parseInfoCommand)(f),async e=>{const r=[],t=this.getConversationDir(s);if((e==="all"||e==="robot")&&(r.push(`### \u{1F310} \u5168\u5C40\u6838\u5FC3\u914D\u7F6E
|
|
68
|
+
`+(0,I.formatGlobalConfig)(this.config)),r.push(`### \u{1F916} \u7FA4\u914D\u7F6E\u4FE1\u606F
|
|
69
|
+
`+(0,I.formatConversationInfo)(y,s,g=>(0,c.userIdToPhone)(this,g),t))),e==="all"||e==="session"){const g=this.formatSessionInfo(s);g?r.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\u4FE1\u606F
|
|
70
|
+
`+g):r.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\u4FE1\u606F
|
|
71
|
+
\u65E0\u6D3B\u8DC3\u4F1A\u8BDD`)}(e==="all"||e==="task")&&r.push(`### \u{1F4DD} \u4EFB\u52A1\u961F\u5217\u4FE1\u606F
|
|
72
|
+
`+this.formatTaskInfo()),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:r.join(`
|
|
72
73
|
|
|
73
|
-
`),msgType:"markdown"})}),(0,
|
|
74
|
+
`),msgType:"markdown"})}),(0,v.route)("/ls",()=>(0,I.parseLsCommand)(f),async e=>{const{target:r,depth:t}=e,g=this.getConversationDir(s);let u=g,m="\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55";if(r&&r!=="root")if(r.startsWith("./")||r.startsWith("../")||r.startsWith("/")){const D=N.default.resolve(g,r);if(S.default.existsSync(D)&&S.default.statSync(D).isDirectory()){if(!D.startsWith(g)){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u274C \u8DEF\u5F84\u8D85\u51FA\u5DE5\u4F5C\u76EE\u5F55\u8303\u56F4",msgType:"markdown"});return}u=D,m=r}else{await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u274C \u8DEF\u5F84\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55: **${r}**`,msgType:"markdown"});return}}else{const D=(0,I.findSubdirByName)(g,r);if(D)u=D,m=r;else{await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u274C \u672A\u627E\u5230\u540D\u4E3A **${r}** \u7684\u76EE\u5F55`,msgType:"markdown"});return}}const p=(0,I.getDirectoryStructure)(u,0,t);await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u{1F4C2} ${m} (\u5C55\u5F00${t}\u5C42):
|
|
74
75
|
\`\`\`
|
|
75
|
-
${
|
|
76
|
-
\`\`\``,msgType:"markdown"})}),(0,
|
|
77
|
-
${
|
|
78
|
-
`)}`,msgType:"markdown"})}return}case"front":{if(
|
|
79
|
-
1. **${u.senderNick||u.senderStaffId}:** ${this.truncateMsg(u.message)}`,msgType:"markdown"});return}case"rm":{if(
|
|
80
|
-
${
|
|
81
|
-
`)}`;
|
|
82
|
-
\u26A0\uFE0F \u5DF2\u5FFD\u7565\u65E0\u6548\u5E8F\u53F7: ${
|
|
83
|
-
|
|
84
|
-
`)}`,msgType:"markdown"});return}case"cancelAll":{if(o.length===0){await this.sendDingMessage({conversationId:s,sessionWebhook:i,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});return}const c=o.length;o.length=0,await this.sendDingMessage({conversationId:s,sessionWebhook:i,content:`\u2705 \u5DF2\u6E05\u7A7A\u6D88\u606F\u961F\u5217\uFF0C\u5171\u79FB\u9664 ${c} \u6761\u6D88\u606F`,msgType:"markdown"});return}}}),(0,command_route_1.route)("/!",()=>(0,commands_1.parseInterruptCommand)(l),async()=>{const e=this.findActiveSession(s);if(!e){await this.sendDingMessage({conversationId:s,sessionWebhook:i,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD"});return}const d=e.session;if(!d.currentProcess){await this.sendDingMessage({conversationId:s,sessionWebhook:i,content:"\u2139\uFE0F \u5F53\u524D\u6CA1\u6709\u6B63\u5728\u6267\u884C\u7684\u4EFB\u52A1"});return}(0,claude_process_1.interruptClaudeProcess)(d,`/!: ${n} \u4E2D\u65AD\u5F53\u524D\u4EFB\u52A1`);const o=d.messageQueue.length;await this.sendDingMessage({conversationId:s,sessionWebhook:i,content:o>0?`\u23F9 \u5DF2\u4E2D\u65AD\u5F53\u524D\u4EFB\u52A1\uFF0C\u5F00\u59CB\u5904\u7406\u961F\u5217\u4E2D\u7684 ${o} \u6761\u6D88\u606F`:"\u23F9 \u5DF2\u4E2D\u65AD\u5F53\u524D\u4EFB\u52A1"})}),(0,command_route_1.route)("/goon",()=>(0,commands_1.parseGoonCommand)(l),async()=>{const e=this.activeSessions.get(s);if(!e){await this.sendDingMessage({conversationId:s,sessionWebhook:i,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD"});return}if(e.currentProcess){console.log(`[${(0,session_1.timestamp)()}] /goon: \u7EC8\u6B62\u5F53\u524D Claude \u8FDB\u7A0B`),e.interrupted=!0,(0,platform_1.isWindows)()?e.currentProcess.kill():e.currentProcess.kill("SIGINT"),await this.sendDingMessage({conversationId:s,sessionWebhook:i,content:"\u{1F504} \u6B63\u5728\u91CD\u542F Claude \u8FDB\u7A0B..."}),e.goonPending=!1,e.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(this,e.session,"\u7EE7\u7EED",{senderNick:e.session.startNickName,senderStaffId:e.lastSenderStaffId,permissionMode:e.conversationConfig.permissionMode})}finally{e.isProcessing=!1}}else{console.log(`[${(0,session_1.timestamp)()}] /goon: \u65E0\u8FD0\u884C\u4E2D\u8FDB\u7A0B\uFF0C\u76F4\u63A5\u53D1\u9001"\u7EE7\u7EED"`),e.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(this,e.session,"\u7EE7\u7EED",{senderNick:n,senderStaffId:a,permissionMode:e.conversationConfig.permissionMode})}finally{e.isProcessing=!1}}}),(0,command_route_1.route)("/cc",()=>(0,commands_1.parseCcCommand)(l),async e=>{const d=this.activeSessions.get(s);if(!d){await this.sendDingMessage({conversationId:s,sessionWebhook:i,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u53D1\u9001\u6D88\u606F\u5F00\u59CB\u4F1A\u8BDD"});return}if(d.isProcessing){await this.sendDingMessage({conversationId:s,sessionWebhook:i,content:"\u23F3 \u6B63\u5728\u5904\u7406\u4E2D\uFF0C\u8BF7\u7A0D\u7B49..."});return}d.isProcessing=!0;try{d.conversationConfig.receiveReply!==!1&&await this.sendDingMessage({conversationId:s,sessionWebhook:i,atUserId:a,content:"\u{1F4E5} \u5DF2\u6536\u5230\uFF0C\u6B63\u5728\u5904\u7406..."}).catch(()=>{}),await(0,claude_process_1.executeClaudeQuery)(this,d.session,e,{senderNick:n,senderStaffId:a,permissionMode:d.conversationConfig.permissionMode})}finally{d.isProcessing=!1}}),(0,command_route_1.route)("/claude.md",()=>(0,commands_1.parseClaudeMdCommand)(l),async()=>{const e=this.getConversationDir(s),d=path_1.default.join(e,".claude","CLAUDE.md");if(fs_1.default.existsSync(d)){const o=fs_1.default.readFileSync(d,"utf-8"),c=o.length>8e3?o.substring(0,8e3)+`
|
|
85
|
-
...(\u5185\u5BB9\u8FC7\u957F\u5DF2\u622A\u65AD)`:o;await this.sendDingMessage({conversationId:s,sessionWebhook:i,content:`\u{1F4C4} **CLAUDE.md**
|
|
76
|
+
${p}
|
|
77
|
+
\`\`\``,msgType:"markdown"})}),(0,v.route)("/task cancel",()=>(0,b.parseTaskCancelCommand)(f)||null,async e=>{const r=this.cancelTask(e,s);await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:r,msgType:"markdown"})}),(0,v.route)("/task",()=>f.startsWith("/task ")||null,async()=>{const e=f.substring(6).trim();e&&(await this.sendDingMessage({conversationId:s,sessionWebhook:n,atUserId:a,content:"\u{1F4CB} \u4EFB\u52A1\u5DF2\u6536\u5230,\u5B8C\u6210\u540E\u6211\u4F1A\u56DE\u590D"}),await this.saveTask({conversationId:s,prompt:e,senderStaffId:a,senderNickName:o,sessionWebhook:n}))}),(0,v.route)("/mq",()=>(0,I.parseMqCommand)(f),async e=>{const t=this.findActiveSession(s)?.session.messageQueue??[];switch(e.type){case"list":{if(t.length===0)await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});else{const g=t.map((u,m)=>`${m+1}. **${u.senderNick||u.senderStaffId}:** ${this.truncateMsg(u.message)}`);await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u{1F4E8} \u6D88\u606F\u961F\u5217 (${t.length} \u6761)
|
|
78
|
+
${g.join(`
|
|
79
|
+
`)}`,msgType:"markdown"})}return}case"front":{if(t.length===0){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});return}let g=t.length-1;for(let m=t.length-1;m>=0;m--)if(t[m].senderStaffId===a){g=m;break}if(g===0){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u2139\uFE0F \u8BE5\u6D88\u606F\u5DF2\u5728\u961F\u9996\uFF0C\u65E0\u9700\u63D2\u961F",msgType:"markdown"});return}const[u]=t.splice(g,1);t.unshift(u),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u2705 \u5DF2\u63D2\u961F\u5230\u961F\u9996
|
|
80
|
+
1. **${u.senderNick||u.senderStaffId}:** ${this.truncateMsg(u.message)}`,msgType:"markdown"});return}case"rm":{if(t.length===0){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});return}if(e.all){const T=t.length;t.length=0,await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u2705 \u5DF2\u6E05\u7A7A\u6D88\u606F\u961F\u5217\uFF0C\u5171\u79FB\u9664 ${T} \u6761\u6D88\u606F`,msgType:"markdown"});return}const g=[...new Set(e.indices)],u=g.filter(T=>T>=1&&T<=t.length).sort((T,O)=>O-T),m=g.filter(T=>T<1||T>t.length);if(u.length===0){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u26A0\uFE0F \u5E8F\u53F7\u65E0\u6548\uFF0C\u5F53\u524D\u961F\u5217\u5171 ${t.length} \u6761`,msgType:"markdown"});return}const p=[];for(const T of u)p.unshift(t.splice(T-1,1)[0]);const D=p.map(T=>`- **${T.senderNick||T.senderStaffId}:** ${this.truncateMsg(T.message)}`);let $=`\u2705 \u5DF2\u5220\u9664 ${p.length} \u6761\u6D88\u606F
|
|
81
|
+
${D.join(`
|
|
82
|
+
`)}`;m.length>0&&($+=`
|
|
83
|
+
\u26A0\uFE0F \u5DF2\u5FFD\u7565\u65E0\u6548\u5E8F\u53F7: ${m.join(", ")}`),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:$,msgType:"markdown"});return}}}),(0,v.route)("/!",()=>(0,I.parseInterruptCommand)(f),async()=>{const e=this.findActiveSession(s);if(!e){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD"});return}const r=e.session;if(!r.currentProcess){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u2139\uFE0F \u5F53\u524D\u6CA1\u6709\u6B63\u5728\u6267\u884C\u7684\u4EFB\u52A1"});return}(0,x.interruptClaudeProcess)(r,`/!: ${o} \u4E2D\u65AD\u5F53\u524D\u4EFB\u52A1`);const t=r.messageQueue.length;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:t>0?`\u23F9 \u5DF2\u4E2D\u65AD\u5F53\u524D\u4EFB\u52A1\uFF0C\u5F00\u59CB\u5904\u7406\u961F\u5217\u4E2D\u7684 ${t} \u6761\u6D88\u606F`:"\u23F9 \u5DF2\u4E2D\u65AD\u5F53\u524D\u4EFB\u52A1"})}),(0,v.route)("/goon",()=>(0,I.parseGoonCommand)(f),async()=>{const e=this.activeSessions.get(s);if(!e){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD"});return}if(e.currentProcess){console.log(`[${(0,c.timestamp)()}] /goon: \u7EC8\u6B62\u5F53\u524D Claude \u8FDB\u7A0B`),e.interrupted=!0,(0,_.isWindows)()?e.currentProcess.kill():e.currentProcess.kill("SIGINT"),await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u{1F504} \u6B63\u5728\u91CD\u542F Claude \u8FDB\u7A0B..."}),e.goonPending=!1,e.isProcessing=!0;try{await(0,x.executeClaudeQuery)(this,e.session,"\u7EE7\u7EED",{senderNick:e.session.startNickName,senderStaffId:e.lastSenderStaffId,permissionMode:e.conversationConfig.permissionMode})}finally{e.isProcessing=!1}}else{console.log(`[${(0,c.timestamp)()}] /goon: \u65E0\u8FD0\u884C\u4E2D\u8FDB\u7A0B\uFF0C\u76F4\u63A5\u53D1\u9001"\u7EE7\u7EED"`),e.isProcessing=!0;try{await(0,x.executeClaudeQuery)(this,e.session,"\u7EE7\u7EED",{senderNick:o,senderStaffId:a,permissionMode:e.conversationConfig.permissionMode})}finally{e.isProcessing=!1}}}),(0,v.route)("/cc",()=>(0,I.parseCcCommand)(f),async e=>{const r=this.activeSessions.get(s);if(!r){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u53D1\u9001\u6D88\u606F\u5F00\u59CB\u4F1A\u8BDD"});return}if(r.isProcessing){await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:"\u23F3 \u6B63\u5728\u5904\u7406\u4E2D\uFF0C\u8BF7\u7A0D\u7B49..."});return}r.isProcessing=!0;try{r.conversationConfig.receiveReply!==!1&&await this.sendDingMessage({conversationId:s,sessionWebhook:n,atUserId:a,content:"\u{1F4E5} \u5DF2\u6536\u5230\uFF0C\u6B63\u5728\u5904\u7406..."}).catch(()=>{}),await(0,x.executeClaudeQuery)(this,r.session,e,{senderNick:o,senderStaffId:a,permissionMode:r.conversationConfig.permissionMode})}finally{r.isProcessing=!1}}),(0,v.route)("/claude.md",()=>(0,I.parseClaudeMdCommand)(f),async()=>{const e=this.getConversationDir(s),r=N.default.join(e,".claude","CLAUDE.md");if(S.default.existsSync(r)){const t=S.default.readFileSync(r,"utf-8"),g=t.length>8e3?t.substring(0,8e3)+`
|
|
84
|
+
...(\u5185\u5BB9\u8FC7\u957F\u5DF2\u622A\u65AD)`:t;await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u{1F4C4} **CLAUDE.md**
|
|
86
85
|
\`\`\`
|
|
87
|
-
${
|
|
88
|
-
\`\`\``,msgType:"markdown"})}else await this.sendDingMessage({conversationId:s,sessionWebhook:
|
|
89
|
-
\u8DEF\u5F84: \`${
|
|
90
|
-
**\u7248\u672C:** ${
|
|
86
|
+
${g}
|
|
87
|
+
\`\`\``,msgType:"markdown"})}else await this.sendDingMessage({conversationId:s,sessionWebhook:n,content:`\u26A0\uFE0F \u672A\u627E\u5230 CLAUDE.md
|
|
88
|
+
\u8DEF\u5F84: \`${r}\``,msgType:"markdown"})})];for(const e of R)if(await e.tryHandle())return;let q=f;const H=[];if(i.atUsers&&i.atUsers.length>0){const e=i.chatbotUserId;for(const r of i.atUsers){const t=r.staffId||r.dingtalkId;!t||t===a||t===e||t.startsWith("$:LWCP_v1:")||H.push(t)}}if(H.length>0)for(const e of H){const r=await(0,c.resolveUserIdName)(this,e),t=r?`${r}(${e})`:e;q=q.replace(/\u200b/g,t)}q.startsWith("/")&&!q.startsWith("/cc ")&&(q=` ${q}`),await this.handleSessionMessage({conversationId:s,sessionWebhook:n,senderStaffId:a,senderNick:o,message:q,conversationConfig:y})}async notifyPendingReboot(){const d=N.default.join(this.getClientDir(),".reboot_pending");if(S.default.existsSync(d))try{const i=JSON.parse(S.default.readFileSync(d,"utf-8"));S.default.unlinkSync(d);let o="\u2705 cc-ding \u5DF2\u91CD\u542F\u5B8C\u6210";i.update&&(o+=`
|
|
89
|
+
**\u7248\u672C:** ${J}`);let a;const s=this.activeSessions.get(i.conversationId);if(s)a=s.session.sessionWebhook;else if(i.sessionWebhook)a=i.sessionWebhook,console.log(`[${(0,c.timestamp)()}] \u91CD\u542F\u540E\u672A\u627E\u5230\u6D3B\u8DC3\u4F1A\u8BDD\uFF0C\u4F7F\u7528\u4FDD\u5B58\u7684 sessionWebhook \u53D1\u9001\u901A\u77E5`);else{console.log(`[${(0,c.timestamp)()}] \u91CD\u542F\u540E\u672A\u627E\u5230\u6D3B\u8DC3\u4F1A\u8BDD\u4E14\u65E0\u4FDD\u5B58\u7684 webhook\uFF0C\u8DF3\u8FC7\u901A\u77E5`);return}await this.sendDingMessage({conversationId:i.conversationId,sessionWebhook:a,content:o,msgType:"markdown",atUserId:i.senderStaffId}),console.log(`[${(0,c.timestamp)()}] \u91CD\u542F\u5B8C\u6210\u901A\u77E5\u5DF2\u53D1\u9001`)}catch(i){try{const o=S.default.readFileSync(d,"utf-8");console.error(`[${(0,c.timestamp)()}] .reboot_pending \u5185\u5BB9:`,o)}catch{}console.error(`[${(0,c.timestamp)()}] \u5904\u7406\u91CD\u542F\u901A\u77E5\u5931\u8D25:`,i);try{S.default.unlinkSync(d)}catch{}}}startConnectionWatchdog(){let o=Date.now();setInterval(()=>{const a=this.dingStreamClient;if(a.connected){o=Date.now();return}const s=Date.now()-o;if(s>=6e4){console.log(`[${(0,c.timestamp)()}] \u8FDE\u63A5\u76D1\u63A7: \u5DF2\u65AD\u5F00 ${s/1e3}s\uFF0C\u5F3A\u5236\u91CD\u65B0\u8FDE\u63A5`),o=Date.now();try{a.disconnect()}catch{}a.connect().catch(h=>{console.error(`[${(0,c.timestamp)()}] \u5F3A\u5236\u91CD\u8FDE\u5931\u8D25:`,h)})}else this.debugLog(`\u8FDE\u63A5\u76D1\u63A7: \u5DF2\u65AD\u5F00 ${s/1e3}s\uFF0C\u7B49\u5F85\u81EA\u52A8\u91CD\u8FDE...`)},3e4)}async run(){const d=Array.isArray(this.config.conversations)?this.config.conversations:[],i=this.config.taskHandlerCount??this.DEFAULT_TASK_HANDLER_COUNT,o=d.length>0;console.log(`[${(0,c.timestamp)()}] \u9489\u9489\u673A\u5668\u4EBA\u670D\u52A1\u542F\u52A8\uFF0CclientId: ${this.clientId}`),console.log(`[${(0,c.timestamp)()}] \u7FA4\u914D\u7F6E: ${d.map(h=>h.conversationTitle||h.conversationId).join(", ")}`),(0,L.startupCheck)(this),await(0,c.resolveAllPhonesInConfig)(this),this.config.apiKeyCfg&&((0,L.resetApiKeyCfg)(this),(0,L.scheduleApiKeyCfgDailyReset)(this)),this.loadActiveSessions(),(0,x.injectStartupContexts)(this),await this.notifyPendingReboot(),this.cronEngine.start(),(0,M.startSelectionCleanupTimer)(),this.startConnectionWatchdog(),o&&console.log(`[${(0,c.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u5668\u6570\u91CF: ${i}`),this.dingStreamClient.registerCallbackListener("/v1.0/im/bot/messages/get",async h=>{await this.botMsgGetCallback(h)});const a=[];if(o)for(let h=0;h<i;h++)console.log(`[${(0,c.timestamp)()}] \u542F\u52A8\u4EFB\u52A1\u5904\u7406\u5668 #${h+1}`),a.push(this.runTaskHandlerLoop().catch(n=>console.error(`\u4EFB\u52A1\u5904\u7406\u5668 #${h+1} \u9519\u8BEF:`,n)));const s=this.dingStreamClient.connect().catch(h=>{console.error("Fatal error",h),process.exit(1)});await Promise.all([s,...a])}}exports.DingClaude=ee;
|