cc-ding 0.3.0-beta.1 → 0.3.1

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.
@@ -8,7 +8,7 @@ Examples:
8
8
  `).version((0,common_1.projUtil)().getPkgVersion()),program.command("init").description("\u521D\u59CB\u5316cc-ding\u914D\u7F6E\u6587\u4EF6, \u751F\u6210\u6700\u7B80config.json").requiredOption("-ci, --clientId <value>","clientId").requiredOption("-cs, --clientSecret <value>","clientSecret (\u9489\u9489Stream\u8FDE\u63A5\u5BC6\u94A5)").requiredOption("-m, --mobile <value>","mobile (\u81EA\u5DF1\u7684\u624B\u673A\u53F7, \u81EA\u52A8\u52A0\u5165\u767D\u540D\u5355)").option("-cn, --clientName <value>","clientName (\u673A\u5668\u4EBA\u540D\u79F0, \u53EF\u9009)").action(async e=>{const n=process.version.slice(1);parseInt(n.split(".")[0],10)<24&&(console.log(`
9
9
  \u274C Node \u7248\u672C\u8FC7\u4F4E\uFF0C\u65E0\u6CD5\u6267\u884C init \u547D\u4EE4`),console.log(` \u5F53\u524D\u7248\u672C\uFF1A${n}`),console.log(" \u8981\u6C42\uFF1ANode >= 24"),console.log(`
10
10
  \u{1F4A1} \u8BF7\u5347\u7EA7 Node \u7248\u672C\u540E\u91CD\u65B0\u8FD0\u884C
11
- `),process.exit(1));const i=`${`${(0,session_1.getHomeDir)()}/.cc-ding/${e.clientId}`}/config.json`;fs_1.default.existsSync(i)&&(console.log(`\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728: ${i}`),console.log("\u5982\u9700\u91CD\u65B0\u521D\u59CB\u5316, \u8BF7\u5148\u5220\u9664\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6"),process.exit(1));const t={clientName:e.clientName||"cc\u52A9\u624B",owner:e.mobile,whiteUserList:[e.mobile],clientSecret:e.clientSecret,defaultDingToken:"<\u515C\u5E95\u9489\u9489\u673A\u5668\u4EBAToken-\u7528\u4E8E\u65E0dingToken\u7FA4\u7684\u6D88\u606F\u63A5\u6536>",conversations:[],includeThinking:!1,resultOnly:!0,debug:!1,taskQueueSize:10,taskHandlerCount:1,sessionMaxConcurrency:20};(0,session_1.initClientDir)(e.clientId,t),console.log("\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210:",i),console.log(""),console.log("\u540E\u7EED\u6B65\u9AA4:"),console.log(" 1. \u7F16\u8F91 config.json \u6DFB\u52A0 conversations \u914D\u7F6E(\u7FA4\u804A\u9700\u914D\u7F6EdingToken)"),console.log(" 2. \u542F\u52A8\u673A\u5668\u4EBA: cc-ding run -ci",e.clientId),console.log(" 3. \u63A8\u8350PM2\u542F\u52A8:"),console.log(` pm2 start --name "cc-ding-${e.clientId}" npx -- -p cc-ding cc-ding run -ci ${e.clientId}`)}),program.command("run").description(`
11
+ `),process.exit(1));const i=`${`${(0,session_1.getHomeDir)()}/.cc-ding/${e.clientId}`}/config.json`;fs_1.default.existsSync(i)&&(console.log(`\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728: ${i}`),console.log("\u5982\u9700\u91CD\u65B0\u521D\u59CB\u5316, \u8BF7\u5148\u5220\u9664\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6"),process.exit(1));const c={clientName:e.clientName||"cc\u52A9\u624B",owner:e.mobile,whiteUserList:[e.mobile],clientSecret:e.clientSecret,defaultDingToken:"<\u515C\u5E95\u9489\u9489\u673A\u5668\u4EBAToken-\u7528\u4E8E\u65E0dingToken\u7FA4\u7684\u6D88\u606F\u63A5\u6536>",conversations:[],includeThinking:!1,resultOnly:!0,debug:!1,taskQueueSize:10,taskHandlerCount:1,sessionMaxConcurrency:20};(0,session_1.initClientDir)(e.clientId,c),console.log("\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210:",i),console.log(""),console.log("\u540E\u7EED\u6B65\u9AA4:"),console.log(" 1. \u7F16\u8F91 config.json \u6DFB\u52A0 conversations \u914D\u7F6E(\u7FA4\u804A\u9700\u914D\u7F6EdingToken)"),console.log(" 2. \u542F\u52A8\u673A\u5668\u4EBA: cc-ding run -ci",e.clientId),console.log(" 3. \u63A8\u8350PM2\u542F\u52A8:"),console.log(` pm2 start --name "cc-ding-${e.clientId}" npx -- -p cc-ding cc-ding run -ci ${e.clientId}`)}),program.command("run").description(`
12
12
  - \u529F\u80FD: \u9489\u9489\u673A\u5668\u4EBA\u5BF9\u63A5\u672C\u5730Claude, \u652F\u6301\u4F1A\u8BDD\u6A21\u5F0F\u548C\u4EFB\u52A1\u961F\u5217\u6A21\u5F0F
13
13
  - \u4F1A\u8BDD\u6570\u636E\u8DEF\u5F84: ~/.cc-ding/{clientId}/{MD5}/.sessions/{claudeSessionId}/session.{json|log}
14
14
  - \u4EFB\u52A1\u6570\u636E\u8DEF\u5F84: ~/.cc-ding/{clientId}/{MD5}/.tasks/{\u65F6\u95F4\u6233}/task.{json|log}
@@ -33,5 +33,5 @@ Examples:
33
33
  - 429\u81EA\u52A8\u5207\u6362: \u81EA\u52A8\u5207\u6362\u5230API Key\u6A21\u5F0F
34
34
  - Key\u8F6E\u6362: API Key\u9047\u5230429\u6216\u8FDE\u7EEDTPM\u4E0D\u7A33\u5B9A\u65F6\u81EA\u52A8\u6362Key
35
35
  - \u8DE8\u5929\u91CD\u7F6E: \u6BCF\u65E5\u81EA\u52A8\u91CD\u7F6EAPI Key\u72B6\u6001
36
- `).requiredOption("-ci, --clientId <value>","clientId").action(async e=>{(0,session_1.ensureClientDir)(e.clientId);const n=path_1.default.join((0,session_1.getHomeDir)(),".cc-ding",e.clientId);(0,lock_1.acquirePidLock)(n,e.clientId),await new cc_ding_cli_1.DingClaude(e.clientId).run()}),program.command("doctor").description("\u68C0\u67E5\u6307\u5B9Aclient\u7684\u914D\u7F6E\u6587\u4EF6schema\u5408\u6CD5\u6027\u548C\u6709\u6548\u6027").requiredOption("-ci, --clientId <value>","clientId").action(async e=>{const n=path_1.default.join((0,session_1.getHomeDir)(),".cc-ding",e.clientId),c=(0,doctor_1.runDoctor)(n);(0,doctor_1.printDoctorResults)(c)}),program.command("notify").description("\u901A\u8FC7\u9489\u9489\u673A\u5668\u4EBA\u53D1\u9001\u6D88\u606F\u5230\u6307\u5B9A\u7FA4").requiredOption("-ci, --clientId <value>","clientId").requiredOption("-c, --conversations <value>","\u76EE\u6807\u4F1A\u8BDDID\uFF08\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF09").requiredOption("-m, --message <value>","\u6D88\u606F\u5185\u5BB9").option("-at, --atUserIds <value>","@ \u6307\u5B9A\u7528\u6237\uFF08\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF09").option("-md, --markdown","\u4F7F\u7528 Markdown \u683C\u5F0F\u53D1\u9001",!1).action(async e=>{const n=e.conversations.split(",").map(i=>i.trim()).filter(Boolean),c=e.atUserIds?e.atUserIds.split(",").map(i=>i.trim()).filter(Boolean):[];console.log(`\u{1F4E4} \u53D1\u9001\u6D88\u606F\u5230 ${n.length} \u4E2A\u4F1A\u8BDD...`);const o=await(0,notify_1.sendNotify)({clientId:e.clientId,message:e.message,conversationIds:n,atUserIds:c,markdown:e.markdown});console.log(`
37
- \u2705 \u6210\u529F: ${o.success}, \u274C \u5931\u8D25: ${o.fail}`),process.exit(o.fail>0?1:0)}),program.parse(process.argv);
36
+ `).requiredOption("-ci, --clientId <value>","clientId").action(async e=>{(0,session_1.ensureClientDir)(e.clientId);const n=path_1.default.join((0,session_1.getHomeDir)(),".cc-ding",e.clientId);(0,lock_1.acquirePidLock)(n,e.clientId),await new cc_ding_cli_1.DingClaude(e.clientId).run()}),program.command("doctor").description("\u68C0\u67E5\u6307\u5B9Aclient\u7684\u914D\u7F6E\u6587\u4EF6schema\u5408\u6CD5\u6027\u548C\u6709\u6548\u6027").requiredOption("-ci, --clientId <value>","clientId").action(async e=>{const n=path_1.default.join((0,session_1.getHomeDir)(),".cc-ding",e.clientId),o=(0,doctor_1.runDoctor)(n);(0,doctor_1.printDoctorResults)(o)}),program.command("notify").description("\u901A\u8FC7\u9489\u9489\u673A\u5668\u4EBA\u53D1\u9001\u6D88\u606F\u5230\u6307\u5B9A\u7FA4\u6216\u5355\u804A").requiredOption("-ci, --clientId <value>","clientId").requiredOption("-c, --conversations <value>","\u76EE\u6807\u4F1A\u8BDDID\uFF08\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF09").requiredOption("-m, --message <value>","\u6D88\u606F\u5185\u5BB9").option("-at, --atUserIds <value>","@ \u6307\u5B9A\u7528\u6237\uFF08\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF09").option("-mo, --mobile <value>","\u5355\u804A\u76EE\u6807\u624B\u673A\u53F7\uFF08\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF0C\u4E0E conversations \u4E00\u4E00\u5BF9\u5E94\uFF09").option("-md, --markdown","\u4F7F\u7528 Markdown \u683C\u5F0F\u53D1\u9001",!1).action(async e=>{const n=e.conversations.split(",").map(c=>c.trim()).filter(Boolean),o=e.atUserIds?e.atUserIds.split(",").map(c=>c.trim()).filter(Boolean):[],t=e.mobile?e.mobile.split(",").map(c=>c.trim()).filter(Boolean):[];console.log(`\u{1F4E4} \u53D1\u9001\u6D88\u606F\u5230 ${n.length} \u4E2A\u4F1A\u8BDD...`);const i=await(0,notify_1.sendNotify)({clientId:e.clientId,message:e.message,conversationIds:n,atUserIds:o,mobiles:t,markdown:e.markdown});console.log(`
37
+ \u2705 \u6210\u529F: ${i.success}, \u274C \u5931\u8D25: ${i.fail}`),process.exit(i.fail>0?1:0)}),program.parse(process.argv);
@@ -1,80 +1,85 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(T,a,t,i){i===void 0&&(i=t);var o=Object.getOwnPropertyDescriptor(a,t);(!o||("get"in o?!a.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return a[t]}}),Object.defineProperty(T,i,o)}):(function(T,a,t,i){i===void 0&&(i=t),T[i]=a[t]})),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(T,a){Object.defineProperty(T,"default",{enumerable:!0,value:a})}):function(T,a){T.default=a}),__importStar=this&&this.__importStar||(function(){var T=function(a){return T=Object.getOwnPropertyNames||function(t){var i=[];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(i[i.length]=o);return i},T(a)};return function(a){if(a&&a.__esModule)return a;var t={};if(a!=null)for(var i=T(a),o=0;o<i.length;o++)i[o]!=="default"&&__createBinding(t,a,i[o]);return __setModuleDefault(t,a),t}})(),__importDefault=this&&this.__importDefault||function(T){return T&&T.__esModule?T:{default:T}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DingClaude=void 0;const child_process_1=require("child_process"),utils_ok_1=require("utils-ok"),fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),common_1=require("../common"),quote_1=require("./quote"),messaging_1=require("./messaging"),image_1=require("./image"),commands_1=require("./commands"),messaging_2=require("./messaging"),claude_process_1=require("./claude-process"),recorder_1=require("./recorder"),session_1=require("./session"),task_1=require("./task"),api_key_manager_1=require("./api-key-manager"),cron_1=require("./cron"),TOOL_VERSION=(0,common_1.projUtil)().getPkgVersion();class DingClaude{constructor(a){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=t=>(0,messaging_2.sendDingMessage)(this,t),this.sendClaudeResponseToDing=(t,i,o,s)=>(0,messaging_2.sendClaudeResponseToDing)(this,t,i,o,s),this.parseClaudeStreamLine=claude_process_1.parseClaudeStreamLine,this.interruptClaudeProcess=(t,i)=>(0,claude_process_1.interruptClaudeProcess)(t,i),this.executeClaudeQuery=(t,i,o)=>(0,claude_process_1.executeClaudeQuery)(this,t,i,o),this.getClientDir=()=>(0,session_1.getClientDir)(this),this.getClientConfig=()=>(0,session_1.getClientConfig)(this),this.authCheck=(t,i)=>(0,session_1.authCheck)(this,t,i),this.isOwner=t=>(0,session_1.isOwner)(this,t),this.debugLog=(t,...i)=>(0,session_1.debugLog)(this,t,...i),this.hashConversationId=t=>(0,session_1.hashConversationId)(this,t),this.getConversationConfig=t=>(0,session_1.getConversationConfig)(this,t),this.getConversationDir=t=>(0,session_1.getConversationDir)(this,t),this.getSessionsDir=t=>(0,session_1.getSessionsDir)(this,t),this.getTasksDir=t=>(0,session_1.getTasksDir)(this,t),this.getSessionDir=t=>(0,session_1.getSessionDir)(this,t),this.getSessionId=session_1.getSessionId,this.formatSessionInfo=t=>(0,session_1.formatSessionInfo)(this,t),this.readSessionLogTail=(t,i)=>(0,session_1.readSessionLogTail)(this,t,i),this.findActiveSession=t=>(0,session_1.findActiveSession)(this,t),this.findHistorySession=(t,i)=>(0,session_1.findHistorySession)(this,t,i),this.findLatestSession=t=>(0,session_1.findLatestSession)(this,t),this.updateSessionFile=(t,i)=>(0,session_1.updateSessionFile)(this,t,i),this.appendSessionLog=session_1.appendSessionLog,this.getActiveSessionsFile=t=>(0,session_1.getActiveSessionsFile)(this,t),this.saveActiveSession=t=>(0,session_1.saveActiveSession)(this,t),this.loadActiveSessions=()=>(0,session_1.loadActiveSessions)(this),this.endSession=(t,i)=>(0,session_1.endSession)(this,t,i),this.switchToSession=(t,i,o,s,u)=>(0,session_1.switchToSession)(this,t,i,o,s,u),this.startNewSession=t=>(0,session_1.startNewSession)(this,t),this.handleSessionMessage=t=>(0,session_1.handleSessionMessage)(this,t),this.cleanCache=(t,i=!0)=>(0,session_1.cleanCache)(this,t,i),this.formatTaskInfo=()=>(0,task_1.formatTaskInfo)(this),this.cancelTask=(t,i)=>(0,task_1.cancelTask)(this,t,i),this.countTodoTask=()=>(0,task_1.countTodoTask)(this),this.getOneTodoTask=()=>(0,task_1.getOneTodoTask)(this),this.finishTask=t=>(0,task_1.finishTask)(this,t),this.handleTask=()=>(0,task_1.handleTask)(this),this.runTaskHandlerLoop=()=>(0,task_1.runTaskHandlerLoop)(this),this.saveTask=t=>(0,task_1.saveTask)(this,t),this.clientId=a,this.config=(0,session_1.getClientConfig)(this);try{this.dingStreamClient=new utils_ok_1.DingStreamClient({clientId:a,clientSecret:this.config.clientSecret,keepAlive:!0,debug:this.config.debug??!1})}catch(t){console.error("Error: DingStreamClient init failed.",t),process.exit(1)}this.cronEngine=new cron_1.CronEngine(this)}async requireOwner(a,t,i){return this.isOwner(i)?!0:(await this.sendDingMessage({conversationId:a,sessionWebhook:t,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}async requireOwnerOrSingleChat(a,t,i,o){return this.isOwner(i)||o?.conversationType==="1"?!0:(await this.sendDingMessage({conversationId:a,sessionWebhook:t,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}async handleAuthRequest(a){const{senderStaffId:t,senderNick:i,conversationId:o,conversationType:s,conversationTitle:u,sessionWebhook:r}=a;if(!this.config.ownerConversationId){await this.sendDingMessage({conversationId:o,sessionWebhook:r,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:",`- **\u4F1A\u8BDDID:** \`${o}\``,`- **\u6CE8\u518C\u547D\u4EE4:** \`/cfg --conversationId ${o}\``].join(`
2
- `),msgType:"markdown"});return}for(const I of this.pendingAuthRequests.values())if(I.senderStaffId===t&&I.conversationId===o){await this.sendDingMessage({conversationId:o,sessionWebhook:r,content:"\u23F3 \u6388\u6743\u7533\u8BF7\u5DF2\u53D1\u9001\uFF0C\u8BF7\u7B49\u5F85\u7BA1\u7406\u5458\u5BA1\u6279...",msgType:"markdown"});return}const g=`r${Date.now().toString(36)}`,h={id:g,senderStaffId:t,senderNick:i,conversationId:o,conversationType:s,conversationTitle:u,requestTime:Date.now()};this.pendingAuthRequests.set(g,h),console.log(`[${(0,session_1.timestamp)()}] \u65B0\u6388\u6743\u7533\u8BF7: id=${g}, userId=${t}, \u6635\u79F0=${i}, \u4F1A\u8BDD=${o}`);const y=["\u{1F4CB} **\u6536\u5230\u6388\u6743\u7533\u8BF7**",`- **\u7528\u6237ID:** ${t}`,`- **\u6635\u79F0:** ${i}`,`- **\u4F1A\u8BDDID:** ${o}`,u?`- **\u4F1A\u8BDD\u6807\u9898:** ${u}`:"",`- **\u4F1A\u8BDD\u7C7B\u578B:** ${s==="1"?"\u5355\u804A":s==="2"?"\u7FA4\u804A":s||"-"}`,"",`\u56DE\u590D \`/auth approve ${g}\` \u901A\u8FC7`,`\u56DE\u590D \`/auth reject ${g}\` \u62D2\u7EDD`].filter(Boolean).join(`
3
- `);await(0,messaging_1.sendOwnerMessage)(this,y,"markdown")?await this.sendDingMessage({conversationId:o,sessionWebhook:r,content:"\u2705 \u5DF2\u5411\u7BA1\u7406\u5458\u53D1\u9001\u6388\u6743\u7533\u8BF7\uFF0C\u8BF7\u7B49\u5F85\u5BA1\u6279...",msgType:"markdown"}):(this.pendingAuthRequests.delete(g),await this.sendDingMessage({conversationId:o,sessionWebhook:r,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(a,t){const{conversationId:i,sessionWebhook:o,senderStaffId:s,senderNick:u,conversationConfig:r}=t;switch(a.type){case"list":{const g=await this.getOrCreateLogSession(i,o,s,u,r,!0),h=this.cronEngine.listJobs(i);g.sessionDir&&(this.appendSessionLog(g.sessionDir,"user","/cron list"),this.appendSessionLog(g.sessionDir,"assistant",`\u5217\u51FA ${h.length} \u4E2A\u5B9A\u65F6\u4EFB\u52A1`)),await this.sendDingMessage({conversationId:i,sessionWebhook:o,content:(0,cron_1.formatCronJobList)(h),msgType:"markdown"});return}case"delete":{const g=this.cronEngine.removeJob(a.id),h=await this.getOrCreateLogSession(i,o,s,u,r);h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron delete ${a.id}`),this.appendSessionLog(h.sessionDir,"assistant",g?`\u5220\u9664\u5B9A\u65F6\u4EFB\u52A1 ${a.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:o,content:g?`\u2705 \u5B9A\u65F6\u4EFB\u52A1 **${a.id}** \u5DF2\u5220\u9664`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`,msgType:"markdown"});return}case"pause":{const g=this.cronEngine.toggleJob(a.id,!1),h=await this.getOrCreateLogSession(i,o,s,u,r);h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron pause ${a.id}`),this.appendSessionLog(h.sessionDir,"assistant",g?`\u6682\u505C\u5B9A\u65F6\u4EFB\u52A1 ${a.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:o,content:g?`\u23F8\uFE0F \u5B9A\u65F6\u4EFB\u52A1 **${a.id}** \u5DF2\u6682\u505C`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`,msgType:"markdown"});return}case"resume":{const g=this.cronEngine.toggleJob(a.id,!0),h=await this.getOrCreateLogSession(i,o,s,u,r);h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron resume ${a.id}`),this.appendSessionLog(h.sessionDir,"assistant",g?`\u6062\u590D\u5B9A\u65F6\u4EFB\u52A1 ${a.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:o,content:g?`\u25B6\uFE0F \u5B9A\u65F6\u4EFB\u52A1 **${a.id}** \u5DF2\u6062\u590D`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`,msgType:"markdown"});return}case"create_cron":{if(!(0,cron_1.isValidCronExpression)(a.cronExpression)){await this.sendDingMessage({conversationId:i,sessionWebhook:o,content:`\u274C \u65E0\u6548\u7684cron\u8868\u8FBE\u5F0F: \`${a.cronExpression}\`
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(y,r,t,i){i===void 0&&(i=t);var a=Object.getOwnPropertyDescriptor(r,t);(!a||("get"in a?!r.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(y,i,a)}):(function(y,r,t,i){i===void 0&&(i=t),y[i]=r[t]})),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(y,r){Object.defineProperty(y,"default",{enumerable:!0,value:r})}):function(y,r){y.default=r}),__importStar=this&&this.__importStar||(function(){var y=function(r){return y=Object.getOwnPropertyNames||function(t){var i=[];for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&(i[i.length]=a);return i},y(r)};return function(r){if(r&&r.__esModule)return r;var t={};if(r!=null)for(var i=y(r),a=0;a<i.length;a++)i[a]!=="default"&&__createBinding(t,r,i[a]);return __setModuleDefault(t,r),t}})(),__importDefault=this&&this.__importDefault||function(y){return y&&y.__esModule?y:{default:y}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DingClaude=void 0;const child_process_1=require("child_process"),utils_ok_1=require("utils-ok"),fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),common_1=require("../common"),quote_1=require("./quote"),messaging_1=require("./messaging"),image_1=require("./image"),commands_1=require("./commands"),messaging_2=require("./messaging"),claude_process_1=require("./claude-process"),recorder_1=require("./recorder"),session_1=require("./session"),task_1=require("./task"),todo_1=require("./todo"),commands_2=require("./commands"),api_key_manager_1=require("./api-key-manager"),cron_1=require("./cron"),TOOL_VERSION=(0,common_1.projUtil)().getPkgVersion();class DingClaude{constructor(r){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=t=>(0,messaging_2.sendDingMessage)(this,t),this.sendClaudeResponseToDing=(t,i,a,e)=>(0,messaging_2.sendClaudeResponseToDing)(this,t,i,a,e),this.parseClaudeStreamLine=claude_process_1.parseClaudeStreamLine,this.interruptClaudeProcess=(t,i)=>(0,claude_process_1.interruptClaudeProcess)(t,i),this.executeClaudeQuery=(t,i,a)=>(0,claude_process_1.executeClaudeQuery)(this,t,i,a),this.getClientDir=()=>(0,session_1.getClientDir)(this),this.getClientConfig=()=>(0,session_1.getClientConfig)(this),this.authCheck=(t,i)=>(0,session_1.authCheck)(this,t,i),this.isOwner=t=>(0,session_1.isOwner)(this,t),this.isAdmin=t=>(0,session_1.isAdmin)(this,t),this.debugLog=(t,...i)=>(0,session_1.debugLog)(this,t,...i),this.hashConversationId=t=>(0,session_1.hashConversationId)(this,t),this.getConversationConfig=t=>(0,session_1.getConversationConfig)(this,t),this.getConversationDir=t=>(0,session_1.getConversationDir)(this,t),this.getSessionsDir=t=>(0,session_1.getSessionsDir)(this,t),this.getTasksDir=t=>(0,session_1.getTasksDir)(this,t),this.getSessionDir=t=>(0,session_1.getSessionDir)(this,t),this.getSessionId=session_1.getSessionId,this.formatSessionInfo=t=>(0,session_1.formatSessionInfo)(this,t),this.readSessionLogTail=(t,i)=>(0,session_1.readSessionLogTail)(this,t,i),this.findActiveSession=t=>(0,session_1.findActiveSession)(this,t),this.findHistorySession=(t,i)=>(0,session_1.findHistorySession)(this,t,i),this.findLatestSession=t=>(0,session_1.findLatestSession)(this,t),this.updateSessionFile=(t,i)=>(0,session_1.updateSessionFile)(this,t,i),this.appendSessionLog=session_1.appendSessionLog,this.getActiveSessionsFile=t=>(0,session_1.getActiveSessionsFile)(this,t),this.saveActiveSession=t=>(0,session_1.saveActiveSession)(this,t),this.loadActiveSessions=()=>(0,session_1.loadActiveSessions)(this),this.endSession=(t,i)=>(0,session_1.endSession)(this,t,i),this.switchToSession=(t,i,a,e,p)=>(0,session_1.switchToSession)(this,t,i,a,e,p),this.startNewSession=t=>(0,session_1.startNewSession)(this,t),this.handleSessionMessage=t=>(0,session_1.handleSessionMessage)(this,t),this.cleanCache=(t,i=!0)=>(0,session_1.cleanCache)(this,t,i),this.formatTaskInfo=()=>(0,task_1.formatTaskInfo)(this),this.cancelTask=(t,i)=>(0,task_1.cancelTask)(this,t,i),this.countTodoTask=()=>(0,task_1.countTodoTask)(this),this.getOneTodoTask=()=>(0,task_1.getOneTodoTask)(this),this.finishTask=t=>(0,task_1.finishTask)(this,t),this.handleTask=()=>(0,task_1.handleTask)(this),this.runTaskHandlerLoop=()=>(0,task_1.runTaskHandlerLoop)(this),this.saveTask=t=>(0,task_1.saveTask)(this,t),this.clientId=r,this.config=(0,session_1.getClientConfig)(this);try{this.dingStreamClient=new utils_ok_1.DingStreamClient({clientId:r,clientSecret:this.config.clientSecret,keepAlive:!0,debug:this.config.debug??!1})}catch(t){console.error("Error: DingStreamClient init failed.",t),process.exit(1)}this.cronEngine=new cron_1.CronEngine(this)}async requireOwnerOrAdmin(r,t,i){return this.isOwner(i)||this.isAdmin(i)?!0:(await this.sendDingMessage({conversationId:r,sessionWebhook:t,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u6216\u7BA1\u7406\u5458\u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}async requireOwner(r,t,i){return this.isOwner(i)?!0:(await this.sendDingMessage({conversationId:r,sessionWebhook:t,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}async requireOwnerOrSingleChat(r,t,i,a){return this.isOwner(i)||a?.conversationType==="1"?!0:(await this.sendDingMessage({conversationId:r,sessionWebhook:t,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}async handleAuthRequest(r){const{senderStaffId:t,senderNick:i,conversationId:a,conversationType:e,conversationTitle:p,sessionWebhook:o}=r;if(!this.config.ownerConversationId){await this.sendDingMessage({conversationId:a,sessionWebhook:o,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:",`- **\u4F1A\u8BDDID:** \`${a}\``,`- **\u6CE8\u518C\u547D\u4EE4:** \`/cfg --conversationId ${a}\``].join(`
2
+ `),msgType:"markdown"});return}for(const $ of this.pendingAuthRequests.values())if($.senderStaffId===t&&$.conversationId===a){await this.sendDingMessage({conversationId:a,sessionWebhook:o,content:"\u23F3 \u6388\u6743\u7533\u8BF7\u5DF2\u53D1\u9001\uFF0C\u8BF7\u7B49\u5F85\u7BA1\u7406\u5458\u5BA1\u6279...",msgType:"markdown"});return}const g=`r${Date.now().toString(36)}`,l={id:g,senderStaffId:t,senderNick:i,conversationId:a,conversationType:e,conversationTitle:p,requestTime:Date.now()};this.pendingAuthRequests.set(g,l),console.log(`[${(0,session_1.timestamp)()}] \u65B0\u6388\u6743\u7533\u8BF7: id=${g}, userId=${t}, \u6635\u79F0=${i}, \u4F1A\u8BDD=${a}`);const v=["\u{1F4CB} **\u6536\u5230\u6388\u6743\u7533\u8BF7**",`- **\u7528\u6237ID:** ${t}`,`- **\u6635\u79F0:** ${i}`,`- **\u4F1A\u8BDDID:** ${a}`,p?`- **\u4F1A\u8BDD\u6807\u9898:** ${p}`:"",`- **\u4F1A\u8BDD\u7C7B\u578B:** ${e==="1"?"\u5355\u804A":e==="2"?"\u7FA4\u804A":e||"-"}`,"",`\u56DE\u590D \`/auth approve ${g}\` \u901A\u8FC7`,`\u56DE\u590D \`/auth reject ${g}\` \u62D2\u7EDD`].filter(Boolean).join(`
3
+ `);await(0,messaging_1.sendOwnerMessage)(this,v,"markdown")?await this.sendDingMessage({conversationId:a,sessionWebhook:o,content:"\u2705 \u5DF2\u5411\u7BA1\u7406\u5458\u53D1\u9001\u6388\u6743\u7533\u8BF7\uFF0C\u8BF7\u7B49\u5F85\u5BA1\u6279...",msgType:"markdown"}):(this.pendingAuthRequests.delete(g),await this.sendDingMessage({conversationId:a,sessionWebhook:o,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(r,t){const{conversationId:i,sessionWebhook:a,senderStaffId:e,senderNick:p,conversationConfig:o}=t;switch(r.type){case"list":{const g=await this.getOrCreateLogSession(i,a,e,p,o,!0),l=this.cronEngine.listJobs(i);g.sessionDir&&(this.appendSessionLog(g.sessionDir,"user","/cron list"),this.appendSessionLog(g.sessionDir,"assistant",`\u5217\u51FA ${l.length} \u4E2A\u5B9A\u65F6\u4EFB\u52A1`)),await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:(0,cron_1.formatCronJobList)(l),msgType:"markdown"});return}case"delete":{const g=this.cronEngine.removeJob(r.id),l=await this.getOrCreateLogSession(i,a,e,p,o);l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron delete ${r.id}`),this.appendSessionLog(l.sessionDir,"assistant",g?`\u5220\u9664\u5B9A\u65F6\u4EFB\u52A1 ${r.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${r.id}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:g?`\u2705 \u5B9A\u65F6\u4EFB\u52A1 **${r.id}** \u5DF2\u5220\u9664`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${r.id}`,msgType:"markdown"});return}case"pause":{const g=this.cronEngine.toggleJob(r.id,!1),l=await this.getOrCreateLogSession(i,a,e,p,o);l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron pause ${r.id}`),this.appendSessionLog(l.sessionDir,"assistant",g?`\u6682\u505C\u5B9A\u65F6\u4EFB\u52A1 ${r.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${r.id}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:g?`\u23F8\uFE0F \u5B9A\u65F6\u4EFB\u52A1 **${r.id}** \u5DF2\u6682\u505C`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${r.id}`,msgType:"markdown"});return}case"resume":{const g=this.cronEngine.toggleJob(r.id,!0),l=await this.getOrCreateLogSession(i,a,e,p,o);l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron resume ${r.id}`),this.appendSessionLog(l.sessionDir,"assistant",g?`\u6062\u590D\u5B9A\u65F6\u4EFB\u52A1 ${r.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${r.id}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:g?`\u25B6\uFE0F \u5B9A\u65F6\u4EFB\u52A1 **${r.id}** \u5DF2\u6062\u590D`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${r.id}`,msgType:"markdown"});return}case"create_cron":{if(!(0,cron_1.isValidCronExpression)(r.cronExpression)){await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:`\u274C \u65E0\u6548\u7684cron\u8868\u8FBE\u5F0F: \`${r.cronExpression}\`
4
4
 
5
- \u{1F4A1} \u683C\u5F0F: \`\u5206 \u65F6 \u65E5 \u6708 \u5468\`\uFF0C\u5982 \`0 9 * * *\``,msgType:"markdown"});return}if(!this.hasNotifyCapability(t.conversationConfig)){await this.sendCronNoNotifyError(i,o);return}const g=this.cronEngine.addJob({conversationId:i,cronExpression:a.cronExpression,description:this.sanitizeLogContent(a.prompt.substring(0,50)),prompt:a.prompt,senderStaffId:s,senderNick:u}),h=await this.getOrCreateLogSession(i,o,s,u,r);h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron ${a.cronExpression} ${this.sanitizeLogContent(a.prompt)}`),this.appendSessionLog(h.sessionDir,"assistant",`\u521B\u5EFA\u5B9A\u65F6\u4EFB\u52A1: ${g.id} [${g.cronExpression}] ${g.description}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:o,content:(0,cron_1.formatCronJobInfo)(g),msgType:"markdown"});return}case"create_nl":{if(!this.hasNotifyCapability(t.conversationConfig)){await this.sendCronNoNotifyError(i,o);return}await this.sendDingMessage({conversationId:i,sessionWebhook:o,content:"\u23F3 \u6B63\u5728\u5206\u6790\u5B9A\u65F6\u4EFB\u52A1\u63CF\u8FF0..."});const g=await this.cronEngine.analyzeAndCreate(i,a.input,s,u),h=await this.getOrCreateLogSession(i,o,s,u,r);g.job?(h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron ${this.sanitizeLogContent(a.input)}`),this.appendSessionLog(h.sessionDir,"assistant",`\u521B\u5EFA\u5B9A\u65F6\u4EFB\u52A1: ${g.job.id} [${g.job.cronExpression}] ${g.job.description}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:o,content:(0,cron_1.formatCronJobInfo)(g.job),msgType:"markdown"})):(h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron ${this.sanitizeLogContent(a.input)}`),this.appendSessionLog(h.sessionDir,"assistant",`\u5B9A\u65F6\u4EFB\u52A1\u5206\u6790\u5931\u8D25: ${g.error}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:o,content:`\u274C \u5B9A\u65F6\u4EFB\u52A1\u5206\u6790\u5931\u8D25: ${g.error}
5
+ \u{1F4A1} \u683C\u5F0F: \`\u5206 \u65F6 \u65E5 \u6708 \u5468\`\uFF0C\u5982 \`0 9 * * *\``,msgType:"markdown"});return}if(!this.hasNotifyCapability(t.conversationConfig)){await this.sendCronNoNotifyError(i,a);return}const g=this.cronEngine.addJob({conversationId:i,cronExpression:r.cronExpression,description:this.sanitizeLogContent(r.prompt.substring(0,50)),prompt:r.prompt,senderStaffId:e,senderNick:p}),l=await this.getOrCreateLogSession(i,a,e,p,o);l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron ${r.cronExpression} ${this.sanitizeLogContent(r.prompt)}`),this.appendSessionLog(l.sessionDir,"assistant",`\u521B\u5EFA\u5B9A\u65F6\u4EFB\u52A1: ${g.id} [${g.cronExpression}] ${g.description}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:(0,cron_1.formatCronJobInfo)(g),msgType:"markdown"});return}case"create_nl":{if(!this.hasNotifyCapability(t.conversationConfig)){await this.sendCronNoNotifyError(i,a);return}await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:"\u23F3 \u6B63\u5728\u5206\u6790\u5B9A\u65F6\u4EFB\u52A1\u63CF\u8FF0..."});const g=await this.cronEngine.analyzeAndCreate(i,r.input,e,p),l=await this.getOrCreateLogSession(i,a,e,p,o);g.job?(l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron ${this.sanitizeLogContent(r.input)}`),this.appendSessionLog(l.sessionDir,"assistant",`\u521B\u5EFA\u5B9A\u65F6\u4EFB\u52A1: ${g.job.id} [${g.job.cronExpression}] ${g.job.description}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:(0,cron_1.formatCronJobInfo)(g.job),msgType:"markdown"})):(l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron ${this.sanitizeLogContent(r.input)}`),this.appendSessionLog(l.sessionDir,"assistant",`\u5B9A\u65F6\u4EFB\u52A1\u5206\u6790\u5931\u8D25: ${g.error}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:`\u274C \u5B9A\u65F6\u4EFB\u52A1\u5206\u6790\u5931\u8D25: ${g.error}
6
6
 
7
- \u{1F4A1} \u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u6307\u5B9Acron\u8868\u8FBE\u5F0F: \`/cron 0 9 * * * \u4EFB\u52A1\u63CF\u8FF0\``,msgType:"markdown"}));return}}}sanitizeLogContent(a){return a.replace(/\n/g,"\\n").replace(/\r/g,"\\r")}sanitizeOutput(a){const t=a.replace(/\r\n/g,`
7
+ \u{1F4A1} \u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u6307\u5B9Acron\u8868\u8FBE\u5F0F: \`/cron 0 9 * * * \u4EFB\u52A1\u63CF\u8FF0\``,msgType:"markdown"}));return}}}async handleTodoCommand(r,t){const{conversationId:i,sessionWebhook:a,senderStaffId:e,senderNick:p}=t;if(r.type==="mode"){(0,todo_1.setIdMode)(this,i,r.mode);const o=r.mode==="staffId"?"\u5DE5\u53F7(staffId)":"\u9489\u9489ID(dingtalkId)";await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:`\u2705 \u7528\u6237\u6807\u8BC6\u6A21\u5F0F\u5DF2\u5207\u6362\u4E3A: **${o}**
8
+
9
+ \u65B0\u6DFB\u52A0\u7684\u5F85\u529E\u5C06\u4F7F\u7528\u6B64\u6A21\u5F0F\u8BB0\u5F55\u8D1F\u8D23\u4EBA`,msgType:"markdown"});return}if(r.type==="list"){const o=(0,todo_1.getSortedTodoItems)(this,i),g=(0,todo_1.getReminderHour)(this,i),v=(0,todo_1.getIdMode)(this,i)==="staffId"?"\u5DE5\u53F7\u6A21\u5F0F":"\u9489\u9489ID\u6A21\u5F0F",C=(0,todo_1.formatTodoList)(o,g),$=`\u{1F4CC} \u5F53\u524D\u6807\u8BC6\u6A21\u5F0F: **${v}**
10
+
11
+ ${C}`;await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:$,msgType:"markdown"});return}if(r.type==="remind"){(0,todo_1.setReminderHour)(this,i,r.hour);const o=r.hour===null?"\u23F0 \u6BCF\u65E5\u63D0\u9192\u5DF2\u5173\u95ED":`\u23F0 \u6BCF\u65E5\u63D0\u9192\u5DF2\u8BBE\u7F6E\u4E3A ${r.hour}:00`;await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:o});return}if(r.type==="done"){const o=(0,todo_1.doneTodoItem)(this,i,r.index);o.success&&o.item?await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:`\u2705 \u5DF2\u5B8C\u6210: ~~${o.item.content}~~ _@${o.item.assigneeNick}_`,msgType:"markdown"}):await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:`\u274C ${o.error}`});return}if(r.type==="remove"){if(r.index==="all"){const o=(0,todo_1.clearAllTodoItems)(this,i);o.success?await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:`\u{1F5D1}\uFE0F \u5DF2\u6E05\u7A7A ${o.count} \u6761\u5F85\u529E`}):await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:`\u274C ${o.error}`})}else{const o=(0,todo_1.deleteTodoItem)(this,i,r.index);o.success&&o.item?await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:`\u{1F5D1}\uFE0F \u5DF2\u5220\u9664: ~~${o.item.content}~~`,msgType:"markdown"}):await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:`\u274C ${o.error}`})}return}if(r.type==="add"){const o=(0,todo_1.getIdMode)(this,i),g=r.assigneeId||e,l=r.assigneeNick||p,v=r.deadline&&(0,todo_1.parseDeadline)(r.deadline)||(0,todo_1.getDefaultDeadline)(),C=(0,todo_1.addTodoItem)(this,i,{content:r.content,assigneeStaffId:g,assigneeNick:l,deadline:v,assigneeIdType:o}),f=(0,todo_1.getSortedTodoItems)(this,i).findIndex(M=>M.content===C.content&&M.createdAt===C.createdAt)+1,c=(0,todo_1.formatTodoItemCreated)(C,f);await this.sendDingMessage({conversationId:i,sessionWebhook:a,content:c,msgType:"markdown"});return}}sanitizeLogContent(r){return r.replace(/\n/g,"\\n").replace(/\r/g,"\\r")}sanitizeOutput(r){const t=r.replace(/\r\n/g,`
8
12
  `),i=8e3;return t.length>i?t.substring(0,i)+`
9
- ...(\u8F93\u51FA\u5DF2\u622A\u65AD)`:t}truncateMsg(a,t=100){const i=a.replace(/\n/g," ").trim();return i.length>t?i.slice(0,t)+"...":i}async getOrCreateLogSession(a,t,i,o,s,u=!1){const r=this.findActiveSession(a);if(r)return{sessionDir:this.getSessionDir(r.session.session),isNew:!1};if(u)return{sessionDir:null,isNew:!1};const g=Date.now(),h={conversationId:a,sessionWebhook:t,startTime:g,startTimeStr:utils_ok_1.dateUtil.mm(g).format("YYYY-MM-DD-HH-mm-ss"),startStaffId:i,startNickName:`[cron]${o}`},y=this.getSessionDir(h);return fs_1.default.mkdirSync(y,{recursive:!0}),fs_1.default.writeFileSync(`${y}/session.json`,JSON.stringify(h,null,2),"utf-8"),fs_1.default.appendFileSync(`${y}/session.log`,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u521B\u5EFA\u4F1A\u8BDD\u7528\u4E8E\u8BB0\u5F55 /cron \u547D\u4EE4\u64CD\u4F5C
10
- `,"utf-8"),{sessionDir:y,isNew:!0}}hasNotifyCapability(a){return!!(a.dingToken||this.config.defaultDingToken)}async sendCronNoNotifyError(a,t){await this.sendDingMessage({conversationId:a,sessionWebhook:t,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(a){this.dingStreamClient.socketCallBackResponse(a.headers.messageId,"");const t=JSON.parse(a.data),{senderNick:i,senderStaffId:o,conversationId:s,conversationTitle:u,sessionWebhook:r,msgtype:g,conversationType:h}=t,y=t.text?.content?.trim()??"";if(this.debugLog(`\u6536\u5230\u6D88\u606F: \u7FA4=${u}(${s}), \u53D1\u9001\u8005=${i}(${o}), \u7C7B\u578B=${g}, \u5185\u5BB9=${y.substring(0,50)}`),!this.authCheck(o,s)){await this.handleAuthRequest({senderStaffId:o,senderNick:i,conversationId:s,conversationType:h,conversationTitle:t.conversationTitle,sessionWebhook:r});return}const w=this.getConversationConfig(s),I=(0,commands_1.parseRecorderCommand)(y);if(I!==null){if(!this.isOwner(o)||h!=="1"){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:"\u274C Recorder \u6A21\u5F0F\u4EC5\u9650 owner \u5355\u804A\u4F7F\u7528",msgType:"markdown"});return}if(I==="on"){this.recorderModeConversations.add(s);const e=(0,recorder_1.getRecorderDir)(this,s);console.log(`[${(0,session_1.timestamp)()}] [recorder] \u5F00\u542F recorder \u6A21\u5F0F: conversationId=${s}, dir=${e}`),await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u{1F534} Recorder \u6A21\u5F0F\u5DF2\u5F00\u542F
13
+ ...(\u8F93\u51FA\u5DF2\u622A\u65AD)`:t}truncateMsg(r,t=100){const i=r.replace(/\n/g," ").trim();return i.length>t?i.slice(0,t)+"...":i}async getOrCreateLogSession(r,t,i,a,e,p=!1){const o=this.findActiveSession(r);if(o)return{sessionDir:this.getSessionDir(o.session.session),isNew:!1};if(p)return{sessionDir:null,isNew:!1};const g=Date.now(),l={conversationId:r,sessionWebhook:t,startTime:g,startTimeStr:utils_ok_1.dateUtil.mm(g).format("YYYY-MM-DD-HH-mm-ss"),startStaffId:i,startNickName:`[cron]${a}`},v=this.getSessionDir(l);return fs_1.default.mkdirSync(v,{recursive:!0}),fs_1.default.writeFileSync(`${v}/session.json`,JSON.stringify(l,null,2),"utf-8"),fs_1.default.appendFileSync(`${v}/session.log`,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u521B\u5EFA\u4F1A\u8BDD\u7528\u4E8E\u8BB0\u5F55 /cron \u547D\u4EE4\u64CD\u4F5C
14
+ `,"utf-8"),{sessionDir:v,isNew:!0}}hasNotifyCapability(r){return!!(r.dingToken||this.config.defaultDingToken)}async sendCronNoNotifyError(r,t){await this.sendDingMessage({conversationId:r,sessionWebhook:t,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(r){this.dingStreamClient.socketCallBackResponse(r.headers.messageId,"");const t=JSON.parse(r.data),{senderNick:i,senderStaffId:a,conversationId:e,conversationTitle:p,sessionWebhook:o,msgtype:g,conversationType:l}=t,v=t.text?.content?.trim()??"";if(this.debugLog(`\u6536\u5230\u6D88\u606F: \u7FA4=${p}(${e}), \u53D1\u9001\u8005=${i}(${a}), \u7C7B\u578B=${g}, \u5185\u5BB9=${v.substring(0,50)}`),!this.authCheck(a,e)){await this.handleAuthRequest({senderStaffId:a,senderNick:i,conversationId:e,conversationType:l,conversationTitle:t.conversationTitle,sessionWebhook:o});return}const C=this.getConversationConfig(e),$=(0,commands_1.parseRecorderCommand)(v);if($!==null){if(!this.isOwner(a)||l!=="1"){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u274C Recorder \u6A21\u5F0F\u4EC5\u9650 owner \u5355\u804A\u4F7F\u7528",msgType:"markdown"});return}if($==="on"){this.recorderModeConversations.add(e);const s=(0,recorder_1.getRecorderDir)(this,e);console.log(`[${(0,session_1.timestamp)()}] [recorder] \u5F00\u542F recorder \u6A21\u5F0F: conversationId=${e}, dir=${s}`),await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u{1F534} Recorder \u6A21\u5F0F\u5DF2\u5F00\u542F
11
15
  - \u6240\u6709\u6D88\u606F\u5C06\u88AB\u5206\u7C7B\u8BB0\u5F55\u5230\u672C\u5730
12
- - \u4FDD\u5B58\u76EE\u5F55: \`${e}\`
13
- - \u53D1\u9001 \`/recorder exit\` \u5173\u95ED`,msgType:"markdown"})}else this.recorderModeConversations.delete(s),console.log(`[${(0,session_1.timestamp)()}] [recorder] \u5173\u95ED recorder \u6A21\u5F0F: conversationId=${s}`),await this.sendDingMessage({conversationId:s,sessionWebhook:r,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,recorder_1.recordMessage)(this,t,s),await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u2705 \u5DF2\u8BB0\u5F55 ${g}`})}catch(e){console.error(`[${(0,session_1.timestamp)()}] [recorder] \u8BB0\u5F55\u6D88\u606F\u5931\u8D25:`,e),await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u274C \u8BB0\u5F55\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`})}return}let l;if(g==="picture"&&t.pictureDownloadCode){const e=this.getConversationDir(s),n=w?.useLocalOcr!==!1,d=await(0,image_1.processPictureMessage)(this,t.pictureDownloadCode,t.robotCode,e,n,y||void 0);if(!d){await this.sendDingMessage({conversationId:s,sessionWebhook:r,atUserId:o,content:"\u26A0\uFE0F \u56FE\u7247\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u6216\u4F7F\u7528\u6587\u5B57\u63CF\u8FF0"});return}l=d}else if(g==="richText"&&t.content?.richText){const e=this.getConversationDir(s),n=w?.useLocalOcr!==!1;l=await(0,image_1.processRichTextMessage)(this,t.content.richText,t.robotCode,e,n)}else if(g==="file"){const e=(0,image_1.extractDownloadCode)(t);if(e){const n=this.getConversationDir(s),d=await(0,image_1.processFileMessage)(this,e,t.robotCode,n,y||void 0);if(!d){await this.sendDingMessage({conversationId:s,sessionWebhook:r,atUserId:o,content:"\u26A0\uFE0F \u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5"});return}l=d}else{await this.sendDingMessage({conversationId:s,sessionWebhook:r,atUserId:o,content:"\u26A0\uFE0F \u65E0\u6CD5\u83B7\u53D6\u6587\u4EF6\u4E0B\u8F7D\u94FE\u63A5\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001"});return}}else{if(l=y,!l){const e=(0,quote_1.extractQuoteInfo)(t);if(e){if(this.debugLog(`\u68C0\u6D4B\u5230\u5F15\u7528\u6D88\u606F(\u65E0\u6B63\u6587): quoteMessageId=${e.quoteMessageId}`),e.quoteMessageId&&!e.quoteText){const n=await(0,messaging_1.fetchQuotedMessage)(this,e.quoteMessageId);n&&(e.quoteText=n)}e.quoteText&&(l=(0,quote_1.formatPromptWithQuote)("",e))}}if(!l)return}if(!l.startsWith("/")&&g==="text"&&y){const e=(0,quote_1.extractQuoteInfo)(t);if(e){if(this.debugLog(`\u68C0\u6D4B\u5230\u5F15\u7528\u6D88\u606F: quoteMessageId=${e.quoteMessageId}`),e.quoteMessageId&&!e.quoteText){const n=await(0,messaging_1.fetchQuotedMessage)(this,e.quoteMessageId);n&&(e.quoteText=n)}e.quoteText&&(l=(0,quote_1.formatPromptWithQuote)(l,e))}}const c=(0,commands_1.parseCfgCommand)(l);if(c!==null){if(c.conversationId&&!this.isOwner(o)){await this.sendDingMessage({conversationId:s,sessionWebhook:r,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,r,o,w))return;const e=c.conversationId||s,n=e!==s,d=n?this.config.conversations.find(C=>C.conversationId===e):w,p=!!(c.dingToken||c.linkConversationId||c.whiteUserList&&c.whiteUserList.length>0||c.conversationTitle||c.atSender!==void 0||c.receiveReply!==void 0||c.preBash!==void 0||c.permissionMode!==void 0);if(d&&p){if(c.conversationTitle&&(d.conversationTitle=c.conversationTitle),h&&!n&&(d.conversationType=h),c.dingToken&&(d.dingToken=c.dingToken),c.linkConversationId&&(d.linkConversationId=c.linkConversationId),c.atSender!==void 0&&(d.atSender=c.atSender),c.receiveReply!==void 0&&(d.receiveReply=c.receiveReply),c.preBash!==void 0&&(d.preBash=c.preBash),c.permissionMode!==void 0&&(d.permissionMode=c.permissionMode),c.whiteUserList&&c.whiteUserList.length>0){d.whiteUserList=c.whiteUserList;for(const C of c.whiteUserList)(0,session_1.isMobile)(C)&&await(0,session_1.resolveUserId)(this,C)}(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u5237\u65B0\u7FA4\u914D\u7F6E: ${d.conversationTitle||e}(${e})`)}else if(!d){const C={conversationId:e,conversationType:n?"1":h,conversationTitle:c.conversationTitle||(n?"":u)};if(c.dingToken&&(C.dingToken=c.dingToken),c.linkConversationId&&(C.linkConversationId=c.linkConversationId),c.atSender!==void 0&&(C.atSender=c.atSender),c.receiveReply!==void 0&&(C.receiveReply=c.receiveReply),c.preBash!==void 0&&(C.preBash=c.preBash),c.permissionMode!==void 0&&(C.permissionMode=c.permissionMode),c.whiteUserList&&c.whiteUserList.length>0){C.whiteUserList=c.whiteUserList;for(const $ of c.whiteUserList)(0,session_1.isMobile)($)&&await(0,session_1.resolveUserId)(this,$)}this.config.conversations.push(C),(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u6CE8\u518C\u65B0\u7FA4: ${C.conversationTitle||e}(${e}) \u7C7B\u578B=${C.conversationType||"-"}`)}const D=this.getConversationDir(e);fs_1.default.existsSync(D)||(fs_1.default.mkdirSync(D,{recursive:!0}),console.log(`[${(0,session_1.timestamp)()}] \u521B\u5EFA\u5DE5\u4F5C\u76EE\u5F55: ${D}`));const m=d||this.getConversationConfig(e),f=[d?"\u2705 \u7FA4\u914D\u7F6E\u5DF2\u5237\u65B0":"\u2705 \u7FA4\u5DF2\u6CE8\u518C",`- **\u7FA4\u540D\u79F0:** ${m?.conversationTitle||e}`,`- **\u7FA4ID:** ${e}`];if(m?.conversationType&&f.push(`- **\u4F1A\u8BDD\u7C7B\u578B:** ${m.conversationType==="1"?"\u5355\u804A":m.conversationType==="2"?"\u7FA4\u804A":m.conversationType}`),m?.dingToken?f.push(`- **dingToken:** ${m.dingToken.substring(0,8)}...`):f.push("- **dingToken:** (\u672A\u6307\u5B9A, \u4F7F\u7528 defaultDingToken)"),m?.linkConversationId&&f.push(`- **linkConversationId:** ${m.linkConversationId}`),m?.atSender===!1&&f.push("- **atSender:** false (\u4E0D @ \u53D1\u9001\u4EBA)"),m?.receiveReply===!1&&f.push("- **receiveReply:** false (\u4E0D\u56DE\u590D\u786E\u8BA4\u6D88\u606F)"),m?.permissionMode&&f.push(`- **permissionMode:** ${m.permissionMode}`),m?.whiteUserList?.length){const C=m.whiteUserList.map($=>(0,session_1.isMobile)($)?$:(0,session_1.userIdToPhone)(this,$)||$).join(", ");f.push(`- **whiteUserList:** ${C}`)}f.push(`- **\u5DE5\u4F5C\u76EE\u5F55:** ${D}`),f.push(`
14
- \u{1F4A1} \u53EF\u7F16\u8F91 config.json \u8865\u5145\u66F4\u591A\u914D\u7F6E`),await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:f.join(`
15
- `),msgType:"markdown"});return}if((0,commands_1.parseHelpCommand)(l)){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:(0,commands_1.formatHelpOverview)(TOOL_VERSION,this.isOwner(o)),msgType:"markdown"});return}if((0,commands_1.parseVersionCommand)(l)){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`**\u7248\u672C:** ${TOOL_VERSION}`,msgType:"markdown"});return}const M=(0,commands_1.parseCommandHelp)(l);if(M){const e=(0,commands_1.getCommandByName)(M);e?await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:(0,commands_1.formatCommandHelp)(e),msgType:"markdown"}):await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u274C \u672A\u627E\u5230\u547D\u4EE4: **${M}**
16
+ - \u4FDD\u5B58\u76EE\u5F55: \`${s}\`
17
+ - \u53D1\u9001 \`/recorder exit\` \u5173\u95ED`,msgType:"markdown"})}else this.recorderModeConversations.delete(e),console.log(`[${(0,session_1.timestamp)()}] [recorder] \u5173\u95ED recorder \u6A21\u5F0F: conversationId=${e}`),await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u2B1C Recorder \u6A21\u5F0F\u5DF2\u5173\u95ED\uFF0C\u6062\u590D\u6B63\u5E38\u5904\u7406",msgType:"markdown"});return}if(this.recorderModeConversations.has(e)){try{await(0,recorder_1.recordMessage)(this,t,e),await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u2705 \u5DF2\u8BB0\u5F55 ${g}`})}catch(s){console.error(`[${(0,session_1.timestamp)()}] [recorder] \u8BB0\u5F55\u6D88\u606F\u5931\u8D25:`,s),await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u274C \u8BB0\u5F55\u5931\u8D25: ${s instanceof Error?s.message:String(s)}`})}return}let f;if(g==="picture"&&t.pictureDownloadCode){const s=this.getConversationDir(e),n=C?.useLocalOcr!==!1,d=await(0,image_1.processPictureMessage)(this,t.pictureDownloadCode,t.robotCode,s,n,v||void 0);if(!d){await this.sendDingMessage({conversationId:e,sessionWebhook:o,atUserId:a,content:"\u26A0\uFE0F \u56FE\u7247\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u6216\u4F7F\u7528\u6587\u5B57\u63CF\u8FF0"});return}f=d}else if(g==="richText"&&t.content?.richText){const s=this.getConversationDir(e),n=C?.useLocalOcr!==!1;f=await(0,image_1.processRichTextMessage)(this,t.content.richText,t.robotCode,s,n)}else if(g==="file"){const s=(0,image_1.extractDownloadCode)(t);if(s){const n=this.getConversationDir(e),d=await(0,image_1.processFileMessage)(this,s,t.robotCode,n,v||void 0);if(!d){await this.sendDingMessage({conversationId:e,sessionWebhook:o,atUserId:a,content:"\u26A0\uFE0F \u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5"});return}f=d}else{await this.sendDingMessage({conversationId:e,sessionWebhook:o,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=v,!f){const s=(0,quote_1.extractQuoteInfo)(t);if(s){if(this.debugLog(`\u68C0\u6D4B\u5230\u5F15\u7528\u6D88\u606F(\u65E0\u6B63\u6587): quoteMessageId=${s.quoteMessageId}`),s.quoteMessageId&&!s.quoteText){const n=await(0,messaging_1.fetchQuotedMessage)(this,s.quoteMessageId);n&&(s.quoteText=n)}s.quoteText&&(f=(0,quote_1.formatPromptWithQuote)("",s))}}if(!f)return}if(!f.startsWith("/")&&g==="text"&&v){const s=(0,quote_1.extractQuoteInfo)(t);if(s){if(this.debugLog(`\u68C0\u6D4B\u5230\u5F15\u7528\u6D88\u606F: quoteMessageId=${s.quoteMessageId}`),s.quoteMessageId&&!s.quoteText){const n=await(0,messaging_1.fetchQuotedMessage)(this,s.quoteMessageId);n&&(s.quoteText=n)}s.quoteText&&(f=(0,quote_1.formatPromptWithQuote)(f,s))}}const c=(0,commands_1.parseCfgCommand)(f);if(c!==null){if(c.conversationId&&!this.isOwner(a)){await this.sendDingMessage({conversationId:e,sessionWebhook:o,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(e,o,a,C))return;const s=c.conversationId||e,n=s!==e,d=n?this.config.conversations.find(D=>D.conversationId===s):C,u=!!(c.dingToken||c.linkConversationId||c.whiteUserList&&c.whiteUserList.length>0||c.conversationTitle||c.atSender!==void 0||c.receiveReply!==void 0||c.preBash!==void 0||c.permissionMode!==void 0);if(d&&u){if(c.conversationTitle&&(d.conversationTitle=c.conversationTitle),l&&!n&&(d.conversationType=l),c.dingToken&&(d.dingToken=c.dingToken),c.linkConversationId&&(d.linkConversationId=c.linkConversationId),c.atSender!==void 0&&(d.atSender=c.atSender),c.receiveReply!==void 0&&(d.receiveReply=c.receiveReply),c.preBash!==void 0&&(d.preBash=c.preBash),c.permissionMode!==void 0&&(d.permissionMode=c.permissionMode),c.whiteUserList&&c.whiteUserList.length>0){d.whiteUserList=c.whiteUserList;for(const D of c.whiteUserList)(0,session_1.isMobile)(D)&&await(0,session_1.resolveUserId)(this,D)}(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u5237\u65B0\u7FA4\u914D\u7F6E: ${d.conversationTitle||s}(${s})`)}else if(!d){const D={conversationId:s,conversationType:n?"1":l,conversationTitle:c.conversationTitle||(n?"":p)};if(c.dingToken&&(D.dingToken=c.dingToken),c.linkConversationId&&(D.linkConversationId=c.linkConversationId),c.atSender!==void 0&&(D.atSender=c.atSender),c.receiveReply!==void 0&&(D.receiveReply=c.receiveReply),c.preBash!==void 0&&(D.preBash=c.preBash),c.permissionMode!==void 0&&(D.permissionMode=c.permissionMode),c.whiteUserList&&c.whiteUserList.length>0){D.whiteUserList=c.whiteUserList;for(const I of c.whiteUserList)(0,session_1.isMobile)(I)&&await(0,session_1.resolveUserId)(this,I)}this.config.conversations.push(D),(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u6CE8\u518C\u65B0\u7FA4: ${D.conversationTitle||s}(${s}) \u7C7B\u578B=${D.conversationType||"-"}`)}const T=this.getConversationDir(s);fs_1.default.existsSync(T)||(fs_1.default.mkdirSync(T,{recursive:!0}),console.log(`[${(0,session_1.timestamp)()}] \u521B\u5EFA\u5DE5\u4F5C\u76EE\u5F55: ${T}`));const m=d||this.getConversationConfig(s),w=[d?"\u2705 \u7FA4\u914D\u7F6E\u5DF2\u5237\u65B0":"\u2705 \u7FA4\u5DF2\u6CE8\u518C",`- **\u7FA4\u540D\u79F0:** ${m?.conversationTitle||s}`,`- **\u7FA4ID:** ${s}`];if(m?.conversationType&&w.push(`- **\u4F1A\u8BDD\u7C7B\u578B:** ${m.conversationType==="1"?"\u5355\u804A":m.conversationType==="2"?"\u7FA4\u804A":m.conversationType}`),m?.dingToken?w.push(`- **dingToken:** ${m.dingToken.substring(0,8)}...`):w.push("- **dingToken:** (\u672A\u6307\u5B9A, \u4F7F\u7528 defaultDingToken)"),m?.linkConversationId&&w.push(`- **linkConversationId:** ${m.linkConversationId}`),m?.atSender===!1&&w.push("- **atSender:** false (\u4E0D @ \u53D1\u9001\u4EBA)"),m?.receiveReply===!1&&w.push("- **receiveReply:** false (\u4E0D\u56DE\u590D\u786E\u8BA4\u6D88\u606F)"),m?.permissionMode&&w.push(`- **permissionMode:** ${m.permissionMode}`),m?.whiteUserList?.length){const D=m.whiteUserList.map(I=>(0,session_1.isMobile)(I)?I:(0,session_1.userIdToPhone)(this,I)||I).join(", ");w.push(`- **whiteUserList:** ${D}`)}w.push(`- **\u5DE5\u4F5C\u76EE\u5F55:** ${T}`),w.push(`
18
+ \u{1F4A1} \u53EF\u7F16\u8F91 config.json \u8865\u5145\u66F4\u591A\u914D\u7F6E`),await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:w.join(`
19
+ `),msgType:"markdown"});return}if((0,commands_1.parseHelpCommand)(f)){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:(0,commands_1.formatHelpOverview)(TOOL_VERSION,this.isOwner(a)),msgType:"markdown"});return}if((0,commands_1.parseVersionCommand)(f)){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`**\u7248\u672C:** ${TOOL_VERSION}`,msgType:"markdown"});return}const M=(0,commands_1.parseCommandHelp)(f);if(M){const s=(0,commands_1.getCommandByName)(M);s?await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:(0,commands_1.formatCommandHelp)(s),msgType:"markdown"}):await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u274C \u672A\u627E\u5230\u547D\u4EE4: **${M}**
16
20
 
17
- \u{1F4A1} \u8F93\u5165 \`/help\` \u67E5\u770B\u6240\u6709\u53EF\u7528\u547D\u4EE4`,msgType:"markdown"});return}const S=(0,commands_1.parseRebootCommand)(l);if(S){if(!await this.requireOwner(s,r,o))return;if(S.tag&&!/^[\w.\-]+$/.test(S.tag)){await this.sendDingMessage({conversationId:s,sessionWebhook:r,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 e=S.tag?`@${S.tag}`:"",n=S.update?`pnpm add -g cc-ding${e}`:null,d=`cc-ding-${this.clientId}`;await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:n?`\u2705 \u66F4\u65B0\u5E76\u91CD\u542F\uFF0C\u6B63\u5728\u6267\u884C ${n}...`:"\u2705 cc-ding \u6B63\u5728\u91CD\u542F\u4E2D...",msgType:"markdown"});const p=path_1.default.join(this.getClientDir(),".reboot_pending");fs_1.default.writeFileSync(p,JSON.stringify({conversationId:s,senderStaffId:o,sessionWebhook:r,update:S.update}),"utf-8"),setTimeout(()=>{console.log(`[${(0,session_1.timestamp)()}] \u6267\u884C pm2 restart ${d}${n?" (\u542B\u66F4\u65B0)":""}`),(0,child_process_1.exec)(`${n?`${n} && `:""}pm2 restart "${d}"`,{timeout:6e4},D=>{D&&console.error(`[${(0,session_1.timestamp)()}] pm2 restart \u5931\u8D25:`,D)})},1e3);return}if(!w){console.log(`\u672A\u6CE8\u518C\u7684\u673A\u5668\u4EBA,\u7FA4:${u},${s}`),this.isOwner(o)?await this.sendDingMessage({conversationId:s,sessionWebhook:r,atUserId:o,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:r,atUserId:o,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 L=(0,commands_1.parseCleanCommand)(l);if(L!==null){if(L==="all"&&w?.conversationType!=="1"&&!this.isOwner(o)){await this.sendDingMessage({conversationId:s,sessionWebhook:r,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,r,o,w))return;const e=L==="all"?null:s,n=this.cleanCache(e,!0),d=[];d.push("\u{1F9F9} \u7F13\u5B58\u6E05\u7406\u5B8C\u6210"),n.sessionsDeleted>0&&d.push(`- \u4F1A\u8BDD\u76EE\u5F55: ${n.sessionsDeleted} \u4E2A`),n.tasksDeleted>0&&d.push(`- \u4EFB\u52A1\u76EE\u5F55: ${n.tasksDeleted} \u4E2A`),n.imagesDeleted>0&&d.push(`- \u56FE\u7247\u6587\u4EF6: ${n.imagesDeleted} \u4E2A`),n.sessionsDeleted===0&&n.tasksDeleted===0&&n.imagesDeleted===0&&d.push("(\u65E0\u5386\u53F2\u6570\u636E)"),d.push(`
21
+ \u{1F4A1} \u8F93\u5165 \`/help\` \u67E5\u770B\u6240\u6709\u53EF\u7528\u547D\u4EE4`,msgType:"markdown"});return}const S=(0,commands_1.parseRebootCommand)(f);if(S){if(!await this.requireOwnerOrAdmin(e,o,a))return;if(S.tag&&!/^[\w.\-]+$/.test(S.tag)){await this.sendDingMessage({conversationId:e,sessionWebhook:o,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 s=S.tag?`@${S.tag}`:"",n=S.update?`pnpm add -g cc-ding${s}`:null,d=`cc-ding-${this.clientId}`;await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:n?`\u2705 \u66F4\u65B0\u5E76\u91CD\u542F\uFF0C\u6B63\u5728\u6267\u884C ${n}...`:"\u2705 cc-ding \u6B63\u5728\u91CD\u542F\u4E2D...",msgType:"markdown"});const u=path_1.default.join(this.getClientDir(),".reboot_pending");fs_1.default.writeFileSync(u,JSON.stringify({conversationId:e,senderStaffId:a,sessionWebhook:o,update:S.update}),"utf-8"),setTimeout(()=>{console.log(`[${(0,session_1.timestamp)()}] \u6267\u884C pm2 restart ${d}${n?" (\u542B\u66F4\u65B0)":""}`),(0,child_process_1.exec)(`${n?`${n} && `:""}pm2 restart "${d}"`,{timeout:6e4},T=>{T&&console.error(`[${(0,session_1.timestamp)()}] pm2 restart \u5931\u8D25:`,T)})},1e3);return}if(!C){console.log(`\u672A\u6CE8\u518C\u7684\u673A\u5668\u4EBA,\u7FA4:${p},${e}`),this.isOwner(a)?await this.sendDingMessage({conversationId:e,sessionWebhook:o,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:e,sessionWebhook:o,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(${e})...`});return}const L=(0,commands_1.parseCleanCommand)(f);if(L!==null){if(L==="all"&&C?.conversationType!=="1"&&!this.isOwner(a)){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6E05\u9664\u6240\u6709\u7FA4\u7F13\u5B58",msgType:"markdown"});return}if(!await this.requireOwnerOrSingleChat(e,o,a,C))return;const s=L==="all"?null:e,n=this.cleanCache(s,!0),d=[];d.push("\u{1F9F9} \u7F13\u5B58\u6E05\u7406\u5B8C\u6210"),n.sessionsDeleted>0&&d.push(`- \u4F1A\u8BDD\u76EE\u5F55: ${n.sessionsDeleted} \u4E2A`),n.tasksDeleted>0&&d.push(`- \u4EFB\u52A1\u76EE\u5F55: ${n.tasksDeleted} \u4E2A`),n.imagesDeleted>0&&d.push(`- \u56FE\u7247\u6587\u4EF6: ${n.imagesDeleted} \u4E2A`),n.sessionsDeleted===0&&n.tasksDeleted===0&&n.imagesDeleted===0&&d.push("(\u65E0\u5386\u53F2\u6570\u636E)"),d.push(`
18
22
  \u{1F4A1} \u6D3B\u8DC3\u4F1A\u8BDD\u5DF2\u4FDD\u7559`),n.errors.length>0&&d.push(`
19
- \u26A0\uFE0F \u9519\u8BEF: ${n.errors.join("; ")}`),await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:d.join(`
20
- `),msgType:"markdown"});return}if((0,commands_1.parseResetApiKeyCfgCommand)(l)){if(!await this.requireOwner(s,r,o))return;if(!this.config.apiKeyCfg){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:"\u26A0\uFE0F \u672A\u914D\u7F6E apiKeyCfg\uFF0C\u65E0\u9700\u91CD\u7F6E",msgType:"markdown"});return}(0,api_key_manager_1.resetApiKeyCfg)(this);const e=this.config.apiKeyCfg.claudeSettings.filter(n=>n.isValid).length;await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u2705 apiKeyCfg \u5DF2\u91CD\u7F6E
21
- - \u6709\u6548 Key \u6570: ${e}/${this.config.apiKeyCfg.claudeSettings.length}
22
- - \u91CD\u7F6E\u65F6\u95F4: ${this.config.apiKeyCfg.resetTime||"-"}`,msgType:"markdown"});return}const v=(0,commands_1.parseAuthCommand)(l);if(v){if(!await this.requireOwner(s,r,o))return;if(v.type==="approve"||v.type==="reject"){const n=this.pendingAuthRequests.get(v.requestId);if(!n){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u274C \u672A\u627E\u5230\u6388\u6743\u7533\u8BF7: ${v.requestId}`,msgType:"markdown"});return}if(this.pendingAuthRequests.delete(v.requestId),v.type==="approve"){let d=this.config.conversations.find(p=>p.conversationId===n.conversationId);d||(d={conversationId:n.conversationId,conversationType:n.conversationType||"1",conversationTitle:n.conversationTitle},this.config.conversations.push(d)),d.whiteUserList||(d.whiteUserList=[]),d.whiteUserList.includes(n.senderStaffId)||d.whiteUserList.push(n.senderStaffId),(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u6388\u6743\u7533\u8BF7\u901A\u8FC7\u5C06: id=${v.requestId}, userId=${n.senderStaffId}`),await(0,messaging_1.sendMessageToUser)(this,n.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:r,content:`\u2705 \u5DF2\u901A\u8FC7\u6388\u6743\u7533\u8BF7
23
+ \u26A0\uFE0F \u9519\u8BEF: ${n.errors.join("; ")}`),await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:d.join(`
24
+ `),msgType:"markdown"});return}if((0,commands_1.parseResetApiKeyCfgCommand)(f)){if(!await this.requireOwner(e,o,a))return;if(!this.config.apiKeyCfg){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u26A0\uFE0F \u672A\u914D\u7F6E apiKeyCfg\uFF0C\u65E0\u9700\u91CD\u7F6E",msgType:"markdown"});return}(0,api_key_manager_1.resetApiKeyCfg)(this);const s=this.config.apiKeyCfg.claudeSettings.filter(n=>n.isValid).length;await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u2705 apiKeyCfg \u5DF2\u91CD\u7F6E
25
+ - \u6709\u6548 Key \u6570: ${s}/${this.config.apiKeyCfg.claudeSettings.length}
26
+ - \u91CD\u7F6E\u65F6\u95F4: ${this.config.apiKeyCfg.resetTime||"-"}`,msgType:"markdown"});return}const h=(0,commands_1.parseAuthCommand)(f);if(h){if(!await this.requireOwner(e,o,a))return;if(h.type==="approve"||h.type==="reject"){const n=this.pendingAuthRequests.get(h.requestId);if(!n){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u274C \u672A\u627E\u5230\u6388\u6743\u7533\u8BF7: ${h.requestId}`,msgType:"markdown"});return}if(this.pendingAuthRequests.delete(h.requestId),h.type==="approve"){let d=this.config.conversations.find(u=>u.conversationId===n.conversationId);d||(d={conversationId:n.conversationId,conversationType:n.conversationType||"1",conversationTitle:n.conversationTitle},this.config.conversations.push(d)),d.whiteUserList||(d.whiteUserList=[]),d.whiteUserList.includes(n.senderStaffId)||d.whiteUserList.push(n.senderStaffId),(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u6388\u6743\u7533\u8BF7\u901A\u8FC7\u5C06: id=${h.requestId}, userId=${n.senderStaffId}`),await(0,messaging_1.sendMessageToUser)(this,n.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:e,sessionWebhook:o,content:`\u2705 \u5DF2\u901A\u8FC7\u6388\u6743\u7533\u8BF7
23
27
  - **\u7528\u6237ID:** ${n.senderStaffId}
24
28
  - **\u6635\u79F0:** ${n.senderNick}
25
- - **\u4F1A\u8BDDID:** ${n.conversationId}`,msgType:"markdown"})}else console.log(`[${(0,session_1.timestamp)()}] \u6388\u6743\u7533\u8BF7\u62D2\u7EDD: id=${v.requestId}, userId=${n.senderStaffId}`),await(0,messaging_1.sendMessageToUser)(this,n.senderStaffId,"\u274C \u60A8\u7684\u6388\u6743\u7533\u8BF7\u5DF2\u88AB\u62D2\u7EDD","markdown"),await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u2705 \u5DF2\u62D2\u7EDD\u6388\u6743\u7533\u8BF7
29
+ - **\u4F1A\u8BDDID:** ${n.conversationId}`,msgType:"markdown"})}else console.log(`[${(0,session_1.timestamp)()}] \u6388\u6743\u7533\u8BF7\u62D2\u7EDD: id=${h.requestId}, userId=${n.senderStaffId}`),await(0,messaging_1.sendMessageToUser)(this,n.senderStaffId,"\u274C \u60A8\u7684\u6388\u6743\u7533\u8BF7\u5DF2\u88AB\u62D2\u7EDD","markdown"),await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u2705 \u5DF2\u62D2\u7EDD\u6388\u6743\u7533\u8BF7
26
30
  - **\u7528\u6237ID:** ${n.senderStaffId}
27
- - **\u6635\u79F0:** ${n.senderNick}`,msgType:"markdown"});return}const e=w.whiteUserList;if(v.type==="list"){const n=e&&e.length>0?e.map(d=>`- ${(0,session_1.userIdToPhone)(this,d)||d}`).join(`
28
- `):"(\u672A\u914D\u7F6E\u7FA4\u7EA7\u767D\u540D\u5355\uFF0C\u4F7F\u7528\u5168\u5C40\u767D\u540D\u5355)";await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u{1F4CB} **\u5F53\u524D\u7FA4\u767D\u540D\u5355**
29
- ${n}`,msgType:"markdown"});return}if(v.type==="add"){let n=v.staffId;if((0,session_1.isMobile)(v.staffId)&&(n=await(0,session_1.resolveUserId)(this,v.staffId),!n)){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${v.staffId}`,msgType:"markdown"});return}if(e?.some(m=>(0,session_1.resolveToUserId)(this,m)===n)){const m=(0,session_1.userIdToPhone)(this,n)||n;await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u26A0\uFE0F ${m} \u5DF2\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}w.whiteUserList||(w.whiteUserList=[]),w.whiteUserList.push(v.staffId),(0,api_key_manager_1.saveClientConfig)(this);const p=w.whiteUserList.map(m=>{const f=(0,session_1.resolveToUserId)(this,m);return(0,session_1.userIdToPhone)(this,f)||m}),D=(0,session_1.isMobile)(v.staffId)?v.staffId:(0,session_1.userIdToPhone)(this,v.staffId)||v.staffId;await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u2705 \u5DF2\u6DFB\u52A0 ${D} \u5230\u5F53\u524D\u7FA4\u767D\u540D\u5355
30
- \u5F53\u524D\u767D\u540D\u5355: ${p.join(", ")}`,msgType:"markdown"});return}if(v.type==="del"){let n=v.staffId;if((0,session_1.isMobile)(v.staffId)&&(n=await(0,session_1.resolveUserId)(this,v.staffId),!n)){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${v.staffId}`,msgType:"markdown"});return}const d=e?.findIndex(f=>(0,session_1.resolveToUserId)(this,f)===n)??-1;if(d<0){const f=(0,session_1.userIdToPhone)(this,n)||n;await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u26A0\uFE0F ${f} \u4E0D\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}const p=w.whiteUserList[d];w.whiteUserList.splice(d,1),w.whiteUserList.length===0&&delete w.whiteUserList,(0,api_key_manager_1.saveClientConfig)(this);const D=w.whiteUserList?.length?w.whiteUserList.map(f=>{const C=(0,session_1.resolveToUserId)(this,f);return(0,session_1.userIdToPhone)(this,C)||f}).join(", "):"(\u7A7A\uFF0C\u4F7F\u7528\u5168\u5C40\u767D\u540D\u5355)",m=(0,session_1.userIdToPhone)(this,n)||p;await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u2705 \u5DF2\u79FB\u9664 ${m}
31
- \u5F53\u524D\u767D\u540D\u5355: ${D}`,msgType:"markdown"});return}}const b=(0,commands_1.parseOpenCommand)(l);if(b!==null){if(!await this.requireOwner(s,r,o))return;const e=this.getConversationDir(s),{exec:n}=await Promise.resolve().then(()=>__importStar(require("child_process"))),d=process.platform;try{b==="folder"?(n(d==="darwin"?`open "${e}"`:`explorer "${e}"`),await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u{1F4C2} \u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u6253\u5F00:
31
+ - **\u6635\u79F0:** ${n.senderNick}`,msgType:"markdown"});return}const s=C.whiteUserList;if(h.type==="list"){const n=s&&s.length>0?s.map(d=>`- ${(0,session_1.userIdToPhone)(this,d)||d}`).join(`
32
+ `):"(\u672A\u914D\u7F6E\u7FA4\u7EA7\u767D\u540D\u5355\uFF0C\u4F7F\u7528\u5168\u5C40\u767D\u540D\u5355)";await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u{1F4CB} **\u5F53\u524D\u7FA4\u767D\u540D\u5355**
33
+ ${n}`,msgType:"markdown"});return}if(h.type==="adminList"){const n=this.config.adminUserList&&this.config.adminUserList.length>0?this.config.adminUserList.map(d=>`- ${(0,session_1.userIdToPhone)(this,d)||d}`).join(`
34
+ `):"(\u672A\u914D\u7F6E\u7BA1\u7406\u5458)";await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u{1F451} **\u7BA1\u7406\u5458\u5217\u8868**
35
+ ${n}`,msgType:"markdown"});return}if(h.type==="adminAdd"){let n=h.staffId;if((0,session_1.isMobile)(h.staffId)&&(n=await(0,session_1.resolveUserId)(this,h.staffId),!n)){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${h.staffId}`,msgType:"markdown"});return}if(this.config.adminUserList?.some(T=>(0,session_1.resolveToUserId)(this,T)===n)){const T=(0,session_1.userIdToPhone)(this,n)||n;await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u26A0\uFE0F ${T} \u5DF2\u5728\u7BA1\u7406\u5458\u5217\u8868\u4E2D`,msgType:"markdown"});return}this.config.adminUserList||(this.config.adminUserList=[]),this.config.adminUserList.push(h.staffId),(0,api_key_manager_1.saveClientConfig)(this);const u=(0,session_1.isMobile)(h.staffId)?h.staffId:(0,session_1.userIdToPhone)(this,h.staffId)||h.staffId;await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u2705 \u5DF2\u6DFB\u52A0 ${u} \u5230\u7BA1\u7406\u5458\u5217\u8868`,msgType:"markdown"});return}if(h.type==="adminRm"){let n=h.staffId;if((0,session_1.isMobile)(h.staffId)&&(n=await(0,session_1.resolveUserId)(this,h.staffId),!n)){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${h.staffId}`,msgType:"markdown"});return}const d=this.config.adminUserList?.findIndex(m=>(0,session_1.resolveToUserId)(this,m)===n)??-1;if(d<0){const m=(0,session_1.userIdToPhone)(this,n)||n;await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u26A0\uFE0F ${m} \u4E0D\u5728\u7BA1\u7406\u5458\u5217\u8868\u4E2D`,msgType:"markdown"});return}const u=this.config.adminUserList[d];this.config.adminUserList.splice(d,1),this.config.adminUserList.length===0&&delete this.config.adminUserList,(0,api_key_manager_1.saveClientConfig)(this);const T=(0,session_1.userIdToPhone)(this,n)||u;await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u2705 \u5DF2\u79FB\u9664 ${T}`,msgType:"markdown"});return}if(h.type==="add"){let n=h.staffId;if((0,session_1.isMobile)(h.staffId)&&(n=await(0,session_1.resolveUserId)(this,h.staffId),!n)){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${h.staffId}`,msgType:"markdown"});return}if(s?.some(m=>(0,session_1.resolveToUserId)(this,m)===n)){const m=(0,session_1.userIdToPhone)(this,n)||n;await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u26A0\uFE0F ${m} \u5DF2\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}C.whiteUserList||(C.whiteUserList=[]),C.whiteUserList.push(h.staffId),(0,api_key_manager_1.saveClientConfig)(this);const u=C.whiteUserList.map(m=>{const w=(0,session_1.resolveToUserId)(this,m);return(0,session_1.userIdToPhone)(this,w)||m}),T=(0,session_1.isMobile)(h.staffId)?h.staffId:(0,session_1.userIdToPhone)(this,h.staffId)||h.staffId;await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u2705 \u5DF2\u6DFB\u52A0 ${T} \u5230\u5F53\u524D\u7FA4\u767D\u540D\u5355
36
+ \u5F53\u524D\u767D\u540D\u5355: ${u.join(", ")}`,msgType:"markdown"});return}if(h.type==="del"){let n=h.staffId;if((0,session_1.isMobile)(h.staffId)&&(n=await(0,session_1.resolveUserId)(this,h.staffId),!n)){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${h.staffId}`,msgType:"markdown"});return}const d=s?.findIndex(w=>(0,session_1.resolveToUserId)(this,w)===n)??-1;if(d<0){const w=(0,session_1.userIdToPhone)(this,n)||n;await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u26A0\uFE0F ${w} \u4E0D\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}const u=C.whiteUserList[d];C.whiteUserList.splice(d,1),C.whiteUserList.length===0&&delete C.whiteUserList,(0,api_key_manager_1.saveClientConfig)(this);const T=C.whiteUserList?.length?C.whiteUserList.map(w=>{const D=(0,session_1.resolveToUserId)(this,w);return(0,session_1.userIdToPhone)(this,D)||w}).join(", "):"(\u7A7A\uFF0C\u4F7F\u7528\u5168\u5C40\u767D\u540D\u5355)",m=(0,session_1.userIdToPhone)(this,n)||u;await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u2705 \u5DF2\u79FB\u9664 ${m}
37
+ \u5F53\u524D\u767D\u540D\u5355: ${T}`,msgType:"markdown"});return}}const b=(0,commands_1.parseOpenCommand)(f);if(b!==null){if(!await this.requireOwner(e,o,a))return;const s=this.getConversationDir(e),{exec:n}=await Promise.resolve().then(()=>__importStar(require("child_process"))),d=process.platform;try{b==="folder"?(n(d==="darwin"?`open "${s}"`:`explorer "${s}"`),await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u{1F4C2} \u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u6253\u5F00:
32
38
  \`\`\`
33
- ${e}
34
- \`\`\``,msgType:"markdown"})):b==="code"?n("which code",p=>{if(p){this.sendDingMessage({conversationId:s,sessionWebhook:r,content:"\u274C \u672A\u68C0\u6D4B\u5230 VS Code `code` \u547D\u4EE4\n\u8BF7\u5B89\u88C5 VS Code \u5E76\u901A\u8FC7 Command Palette \u5B89\u88C5 Shell Command",msgType:"markdown"});return}n(`code "${e}"`),this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u{1F4BB} \u5DF2\u5728 VS Code \u4E2D\u6253\u5F00:
39
+ ${s}
40
+ \`\`\``,msgType:"markdown"})):b==="code"?n("which code",u=>{if(u){this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u274C \u672A\u68C0\u6D4B\u5230 VS Code `code` \u547D\u4EE4\n\u8BF7\u5B89\u88C5 VS Code \u5E76\u901A\u8FC7 Command Palette \u5B89\u88C5 Shell Command",msgType:"markdown"});return}n(`code "${s}"`),this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u{1F4BB} \u5DF2\u5728 VS Code \u4E2D\u6253\u5F00:
35
41
  \`\`\`
36
- ${e}
37
- \`\`\``,msgType:"markdown"})}):(d==="darwin"?n(`open -a Terminal "${e}"`):n(`start cmd /k "cd /d ${e}"`,{shell:"cmd.exe"}),await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u{1F4BB} \u5DF2\u5728\u7EC8\u7AEF\u4E2D\u6253\u5F00:
42
+ ${s}
43
+ \`\`\``,msgType:"markdown"})}):(d==="darwin"?n(`open -a Terminal "${s}"`):n(`start cmd /k "cd /d ${s}"`,{shell:"cmd.exe"}),await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u{1F4BB} \u5DF2\u5728\u7EC8\u7AEF\u4E2D\u6253\u5F00:
38
44
  \`\`\`
39
- ${e}
40
- \`\`\``,msgType:"markdown"}))}catch(p){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u274C \u6253\u5F00\u5931\u8D25: ${p instanceof Error?p.message:String(p)}`,msgType:"markdown"})}return}const x=(0,commands_1.parseCronCommand)(l);if(x){await this.handleCronCommand(x,{conversationId:s,sessionWebhook:r,senderStaffId:o,senderNick:i,conversationConfig:w});return}const U=(0,commands_1.parseBashCommand)(l);if(U!==null){const e=this.getConversationDir(s),n=[];this.config.preBash&&n.push(this.config.preBash),w?.preBash&&n.push(w.preBash);const d=n.length>0?`${n.join(" ; ")} ; ${U}`:U,p=this;(0,child_process_1.exec)(d,{cwd:e,timeout:3e4,maxBuffer:1024*1024},async(D,m,f)=>{try{let C;if(D)C=`\u274C \u547D\u4EE4\u6267\u884C\u5931\u8D25
45
+ ${s}
46
+ \`\`\``,msgType:"markdown"}))}catch(u){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u274C \u6253\u5F00\u5931\u8D25: ${u instanceof Error?u.message:String(u)}`,msgType:"markdown"})}return}const N=(0,commands_1.parseCronCommand)(f);if(N){await this.handleCronCommand(N,{conversationId:e,sessionWebhook:o,senderStaffId:a,senderNick:i,conversationConfig:C});return}const A=(0,commands_2.parseTodoCommand)(f,t.atUsers);if(A!==null){await this.handleTodoCommand(A,{conversationId:e,sessionWebhook:o,senderStaffId:a,senderNick:i});return}const U=(0,commands_1.parseBashCommand)(f);if(U!==null){const s=this.getConversationDir(e),n=[];this.config.preBash&&n.push(this.config.preBash),C?.preBash&&n.push(C.preBash);const d=n.length>0?`${n.join(" ; ")} ; ${U}`:U,u=this;(0,child_process_1.exec)(d,{cwd:s,timeout:3e4,maxBuffer:1024*1024},async(T,m,w)=>{try{let D;if(T)D=`\u274C \u547D\u4EE4\u6267\u884C\u5931\u8D25
41
47
  \`\`\`
42
- ${D.message}
43
- \`\`\``,f&&(C+=`
48
+ ${T.message}
49
+ \`\`\``,w&&(D+=`
44
50
 
45
51
  **stderr:**
46
52
  \`\`\`
47
- ${p.sanitizeOutput(f)}
48
- \`\`\``);else{const $=m||"(\u65E0\u8F93\u51FA)";C=`\u2705 \u6267\u884C\u6210\u529F
53
+ ${u.sanitizeOutput(w)}
54
+ \`\`\``);else{const I=m||"(\u65E0\u8F93\u51FA)";D=`\u2705 \u6267\u884C\u6210\u529F
49
55
  \`\`\`
50
- ${p.sanitizeOutput($)}
51
- \`\`\``,f&&(C+=`
56
+ ${u.sanitizeOutput(I)}
57
+ \`\`\``,w&&(D+=`
52
58
 
53
59
  **stderr:**
54
60
  \`\`\`
55
- ${p.sanitizeOutput(f)}
56
- \`\`\``)}await p.sendDingMessage({conversationId:s,sessionWebhook:r,content:C,msgType:"markdown"})}catch(C){console.error("[bash] \u53D1\u9001\u6D88\u606F\u5931\u8D25:",C)}});return}if(/^\/new(?:\s|$)/i.test(l)){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 n=l.replace(/^\/new\s*/i,"").trim();n?await this.startNewSession({conversationId:s,sessionWebhook:r,senderStaffId:o,senderNick:i,message:n,conversationConfig:w}):await this.sendDingMessage({conversationId:s,sessionWebhook:r,atUserId:o,content:"\u{1F680} \u8BF7\u8F93\u5165\u60A8\u7684\u95EE\u9898\u5F00\u59CB\u65B0\u4F1A\u8BDD"});return}const N=(0,commands_1.parseContinueSessionCommand)(l);if(N!==null&&w){let e=N;if(!e){const n=(0,session_1.findLatestSession)(this,s);if(!n){await this.sendDingMessage({conversationId:s,sessionWebhook:r,atUserId:o,content:"\u26A0\uFE0F \u672A\u627E\u5230\u5DF2\u7ED3\u675F\u7684\u4F1A\u8BDD",msgType:"markdown"});return}e=(0,session_1.getSessionId)(n)}await this.switchToSession(s,r,e,o,w);return}const _=(0,commands_1.parseLogCommand)(l);if(_!==null){const e=this.readSessionLogTail(s,_);e?await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u{1F4CB} \u6700\u8FD1 ${_} \u884C\u65E5\u5FD7:
61
+ ${u.sanitizeOutput(w)}
62
+ \`\`\``)}await u.sendDingMessage({conversationId:e,sessionWebhook:o,content:D,msgType:"markdown"})}catch(D){console.error("[bash] \u53D1\u9001\u6D88\u606F\u5931\u8D25:",D)}});return}if(/^\/new(?:\s|$)/i.test(f)){const s=this.findActiveSession(e);s&&(console.log(`\u6536\u5230\u65B0\u4F1A\u8BDD\u547D\u4EE4\uFF0C\u7ED3\u675F\u65E7\u4F1A\u8BDD: \u7FA4=${s.session.session.conversationId}, \u4F1A\u8BDDID=${this.getSessionId(s.session.session)}`),this.interruptClaudeProcess(s.session,"\u65B0\u4F1A\u8BDD\u547D\u4EE4\u4E2D\u65AD\u6B63\u5728\u6267\u884C\u7684 Claude \u8FDB\u7A0B"),this.activeSessions.delete(s.key),this.saveActiveSession(s.key));const n=f.replace(/^\/new\s*/i,"").trim();n?await this.startNewSession({conversationId:e,sessionWebhook:o,senderStaffId:a,senderNick:i,message:n,conversationConfig:C}):await this.sendDingMessage({conversationId:e,sessionWebhook:o,atUserId:a,content:"\u{1F680} \u8BF7\u8F93\u5165\u60A8\u7684\u95EE\u9898\u5F00\u59CB\u65B0\u4F1A\u8BDD"});return}const E=(0,commands_1.parseContinueSessionCommand)(f);if(E!==null&&C){let s=E;if(!s){const n=(0,session_1.findLatestSession)(this,e);if(!n){await this.sendDingMessage({conversationId:e,sessionWebhook:o,atUserId:a,content:"\u26A0\uFE0F \u672A\u627E\u5230\u5DF2\u7ED3\u675F\u7684\u4F1A\u8BDD",msgType:"markdown"});return}s=(0,session_1.getSessionId)(n)}await this.switchToSession(e,o,s,a,C);return}const _=(0,commands_1.parseLogCommand)(f);if(_!==null){const s=this.readSessionLogTail(e,_);s?await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u{1F4CB} \u6700\u8FD1 ${_} \u884C\u65E5\u5FD7:
57
63
  \`\`\`
58
- ${e}
59
- \`\`\``,msgType:"markdown"}):await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u6D3B\u8DC3\u4F1A\u8BDD\u6216\u6682\u65E0\u65E5\u5FD7"});return}const k=(0,commands_1.parseInfoCommand)(l);if(k!==null){const e=[],n=this.getConversationDir(s);if((k==="all"||k==="robot")&&(e.push(`### \u{1F310} \u5168\u5C40\u6838\u5FC3\u914D\u7F6E
60
- `+(0,commands_1.formatGlobalConfig)(this.config)),e.push(`### \u{1F916} \u7FA4\u914D\u7F6E\u4FE1\u606F
61
- `+(0,commands_1.formatConversationInfo)(w,s,d=>(0,session_1.userIdToPhone)(this,d),n))),k==="all"||k==="session"){const d=this.formatSessionInfo(s);d?e.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\u4FE1\u606F
62
- `+d):e.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\u4FE1\u606F
63
- \u65E0\u6D3B\u8DC3\u4F1A\u8BDD`)}(k==="all"||k==="task")&&e.push(`### \u{1F4DD} \u4EFB\u52A1\u961F\u5217\u4FE1\u606F
64
- `+this.formatTaskInfo()),await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:e.join(`
64
+ ${s}
65
+ \`\`\``,msgType:"markdown"}):await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u6D3B\u8DC3\u4F1A\u8BDD\u6216\u6682\u65E0\u65E5\u5FD7"});return}const k=(0,commands_1.parseInfoCommand)(f);if(k!==null){const s=[],n=this.getConversationDir(e);if((k==="all"||k==="robot")&&(s.push(`### \u{1F310} \u5168\u5C40\u6838\u5FC3\u914D\u7F6E
66
+ `+(0,commands_1.formatGlobalConfig)(this.config)),s.push(`### \u{1F916} \u7FA4\u914D\u7F6E\u4FE1\u606F
67
+ `+(0,commands_1.formatConversationInfo)(C,e,d=>(0,session_1.userIdToPhone)(this,d),n))),k==="all"||k==="session"){const d=this.formatSessionInfo(e);d?s.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\u4FE1\u606F
68
+ `+d):s.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\u4FE1\u606F
69
+ \u65E0\u6D3B\u8DC3\u4F1A\u8BDD`)}(k==="all"||k==="task")&&s.push(`### \u{1F4DD} \u4EFB\u52A1\u961F\u5217\u4FE1\u606F
70
+ `+this.formatTaskInfo()),await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:s.join(`
65
71
 
66
- `),msgType:"markdown"});return}const P=(0,commands_1.parseLsCommand)(l);if(P!==null){const{target:e,depth:n}=P,d=this.getConversationDir(s);let p=d,D="\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55";if(e&&e!=="root")if(e.startsWith("./")||e.startsWith("../")||e.startsWith("/")){const f=path_1.default.resolve(d,e);if(fs_1.default.existsSync(f)&&fs_1.default.statSync(f).isDirectory()){if(!f.startsWith(d)){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:"\u274C \u8DEF\u5F84\u8D85\u51FA\u5DE5\u4F5C\u76EE\u5F55\u8303\u56F4",msgType:"markdown"});return}p=f,D=e}else{await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u274C \u8DEF\u5F84\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55: **${e}**`,msgType:"markdown"});return}}else{const f=(0,commands_1.findSubdirByName)(d,e);if(f)p=f,D=e;else{await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u274C \u672A\u627E\u5230\u540D\u4E3A **${e}** \u7684\u76EE\u5F55`,msgType:"markdown"});return}}const m=(0,commands_1.getDirectoryStructure)(p,0,n);await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u{1F4C2} ${D} (\u5C55\u5F00${n}\u5C42):
72
+ `),msgType:"markdown"});return}const P=(0,commands_1.parseLsCommand)(f);if(P!==null){const{target:s,depth:n}=P,d=this.getConversationDir(e);let u=d,T="\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55";if(s&&s!=="root")if(s.startsWith("./")||s.startsWith("../")||s.startsWith("/")){const w=path_1.default.resolve(d,s);if(fs_1.default.existsSync(w)&&fs_1.default.statSync(w).isDirectory()){if(!w.startsWith(d)){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u274C \u8DEF\u5F84\u8D85\u51FA\u5DE5\u4F5C\u76EE\u5F55\u8303\u56F4",msgType:"markdown"});return}u=w,T=s}else{await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u274C \u8DEF\u5F84\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55: **${s}**`,msgType:"markdown"});return}}else{const w=(0,commands_1.findSubdirByName)(d,s);if(w)u=w,T=s;else{await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u274C \u672A\u627E\u5230\u540D\u4E3A **${s}** \u7684\u76EE\u5F55`,msgType:"markdown"});return}}const m=(0,commands_1.getDirectoryStructure)(u,0,n);await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u{1F4C2} ${T} (\u5C55\u5F00${n}\u5C42):
67
73
  \`\`\`
68
74
  ${m}
69
- \`\`\``,msgType:"markdown"});return}const A=(0,task_1.parseTaskCancelCommand)(l);if(A){const e=this.cancelTask(A,s);await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:e,msgType:"markdown"});return}if(l.startsWith("/task ")){const e=l.substring(6).trim();e&&(await this.sendDingMessage({conversationId:s,sessionWebhook:r,atUserId:o,content:"\u{1F4CB} \u4EFB\u52A1\u5DF2\u6536\u5230,\u5B8C\u6210\u540E\u6211\u4F1A\u56DE\u590D"}),await this.saveTask({conversationId:s,prompt:e,senderStaffId:o,senderNickName:i,sessionWebhook:r}));return}const O=(0,commands_1.parseMqCommand)(l);if(O){const n=this.findActiveSession(s)?.session.messageQueue??[];switch(O.type){case"list":{if(n.length===0)await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});else{const d=n.map((p,D)=>`${D+1}. **${p.senderNick||p.senderStaffId}:** ${this.truncateMsg(p.message)}`);await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u{1F4E8} \u6D88\u606F\u961F\u5217 (${n.length} \u6761)
75
+ \`\`\``,msgType:"markdown"});return}const R=(0,task_1.parseTaskCancelCommand)(f);if(R){const s=this.cancelTask(R,e);await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:s,msgType:"markdown"});return}if(f.startsWith("/task ")){const s=f.substring(6).trim();s&&(await this.sendDingMessage({conversationId:e,sessionWebhook:o,atUserId:a,content:"\u{1F4CB} \u4EFB\u52A1\u5DF2\u6536\u5230,\u5B8C\u6210\u540E\u6211\u4F1A\u56DE\u590D"}),await this.saveTask({conversationId:e,prompt:s,senderStaffId:a,senderNickName:i,sessionWebhook:o}));return}const O=(0,commands_1.parseMqCommand)(f);if(O){const n=this.findActiveSession(e)?.session.messageQueue??[];switch(O.type){case"list":{if(n.length===0)await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});else{const d=n.map((u,T)=>`${T+1}. **${u.senderNick||u.senderStaffId}:** ${this.truncateMsg(u.message)}`);await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u{1F4E8} \u6D88\u606F\u961F\u5217 (${n.length} \u6761)
70
76
  ${d.join(`
71
- `)}`,msgType:"markdown"})}return}case"cancel":{if(n.length===0){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});return}const d=Math.min(O.count,n.length),D=n.splice(n.length-d,d).map((m,f)=>`${f+1}. **${m.senderNick||m.senderStaffId}:** ${this.truncateMsg(m.message)}`);await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u2705 \u5DF2\u4ECE\u961F\u5C3E\u79FB\u9664 ${d} \u6761\u6D88\u606F
72
- ${D.join(`
73
- `)}`,msgType:"markdown"});return}case"cancelAll":{if(n.length===0){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});return}const d=n.length;n.length=0,await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u2705 \u5DF2\u6E05\u7A7A\u6D88\u606F\u961F\u5217\uFF0C\u5171\u79FB\u9664 ${d} \u6761\u6D88\u606F`,msgType:"markdown"});return}}}if((0,commands_1.parseGoonCommand)(l)){const e=this.activeSessions.get(s);if(!e){await this.sendDingMessage({conversationId:s,sessionWebhook:r,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,e.currentProcess.kill("SIGINT"),await this.sendDingMessage({conversationId:s,sessionWebhook:r,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:i,senderStaffId:o,permissionMode:e.conversationConfig.permissionMode})}finally{e.isProcessing=!1}}return}const E=(0,commands_1.parseCcCommand)(l);if(E!==null){const e=this.activeSessions.get(s);if(!e){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u53D1\u9001\u6D88\u606F\u5F00\u59CB\u4F1A\u8BDD"});return}if(e.isProcessing){await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:"\u23F3 \u6B63\u5728\u5904\u7406\u4E2D\uFF0C\u8BF7\u7A0D\u7B49..."});return}e.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(this,e.session,E,{senderNick:i,senderStaffId:o,permissionMode:e.conversationConfig.permissionMode})}finally{e.isProcessing=!1}return}if((0,commands_1.parseClaudeMdCommand)(l)){const e=this.getConversationDir(s),n=path_1.default.join(e,".claude","CLAUDE.md");if(fs_1.default.existsSync(n)){const d=fs_1.default.readFileSync(n,"utf-8"),p=d.length>8e3?d.substring(0,8e3)+`
74
- ...(\u5185\u5BB9\u8FC7\u957F\u5DF2\u622A\u65AD)`:d;await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u{1F4C4} **CLAUDE.md**
77
+ `)}`,msgType:"markdown"})}return}case"cancel":{if(n.length===0){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});return}const d=Math.min(O.count,n.length),T=n.splice(n.length-d,d).map((m,w)=>`${w+1}. **${m.senderNick||m.senderStaffId}:** ${this.truncateMsg(m.message)}`);await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u2705 \u5DF2\u4ECE\u961F\u5C3E\u79FB\u9664 ${d} \u6761\u6D88\u606F
78
+ ${T.join(`
79
+ `)}`,msgType:"markdown"});return}case"cancelAll":{if(n.length===0){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});return}const d=n.length;n.length=0,await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u2705 \u5DF2\u6E05\u7A7A\u6D88\u606F\u961F\u5217\uFF0C\u5171\u79FB\u9664 ${d} \u6761\u6D88\u606F`,msgType:"markdown"});return}}}if((0,commands_1.parseGoonCommand)(f)){const s=this.activeSessions.get(e);if(!s){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD"});return}if(s.currentProcess){console.log(`[${(0,session_1.timestamp)()}] /goon: \u7EC8\u6B62\u5F53\u524D Claude \u8FDB\u7A0B`),s.interrupted=!0,s.currentProcess.kill("SIGINT"),await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u{1F504} \u6B63\u5728\u91CD\u542F Claude \u8FDB\u7A0B..."}),s.goonPending=!1,s.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(this,s.session,"\u7EE7\u7EED",{senderNick:s.session.startNickName,senderStaffId:s.lastSenderStaffId,permissionMode:s.conversationConfig.permissionMode})}finally{s.isProcessing=!1}}else{console.log(`[${(0,session_1.timestamp)()}] /goon: \u65E0\u8FD0\u884C\u4E2D\u8FDB\u7A0B\uFF0C\u76F4\u63A5\u53D1\u9001"\u7EE7\u7EED"`),s.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(this,s.session,"\u7EE7\u7EED",{senderNick:i,senderStaffId:a,permissionMode:s.conversationConfig.permissionMode})}finally{s.isProcessing=!1}}return}const j=(0,commands_1.parseCcCommand)(f);if(j!==null){const s=this.activeSessions.get(e);if(!s){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u53D1\u9001\u6D88\u606F\u5F00\u59CB\u4F1A\u8BDD"});return}if(s.isProcessing){await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:"\u23F3 \u6B63\u5728\u5904\u7406\u4E2D\uFF0C\u8BF7\u7A0D\u7B49..."});return}s.isProcessing=!0;try{s.conversationConfig.receiveReply!==!1&&await this.sendDingMessage({conversationId:e,sessionWebhook:o,atUserId:a,content:"\u{1F4E5} \u5DF2\u6536\u5230\uFF0C\u6B63\u5728\u5904\u7406..."}).catch(()=>{}),await(0,claude_process_1.executeClaudeQuery)(this,s.session,j,{senderNick:i,senderStaffId:a,permissionMode:s.conversationConfig.permissionMode})}finally{s.isProcessing=!1}return}if((0,commands_1.parseClaudeMdCommand)(f)){const s=this.getConversationDir(e),n=path_1.default.join(s,".claude","CLAUDE.md");if(fs_1.default.existsSync(n)){const d=fs_1.default.readFileSync(n,"utf-8"),u=d.length>8e3?d.substring(0,8e3)+`
80
+ ...(\u5185\u5BB9\u8FC7\u957F\u5DF2\u622A\u65AD)`:d;await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u{1F4C4} **CLAUDE.md**
75
81
  \`\`\`
76
- ${p}
77
- \`\`\``,msgType:"markdown"})}else await this.sendDingMessage({conversationId:s,sessionWebhook:r,content:`\u26A0\uFE0F \u672A\u627E\u5230 CLAUDE.md
78
- \u8DEF\u5F84: \`${n}\``,msgType:"markdown"});return}let q=l;if(t.atUsers&&t.atUsers.length>0){const e=t.atUsers.filter(n=>n.staffId!==o).map(n=>`@${n.staffId}`).join(", ");e&&(q=`[\u63D0\u53CA\u7528\u6237: ${e}]
79
- ${q}`)}await this.handleSessionMessage({conversationId:s,sessionWebhook:r,senderStaffId:o,senderNick:i,message:q,conversationConfig:w})}async notifyPendingReboot(){const a=path_1.default.join(this.getClientDir(),".reboot_pending");if(fs_1.default.existsSync(a))try{const t=JSON.parse(fs_1.default.readFileSync(a,"utf-8"));fs_1.default.unlinkSync(a);let i="\u2705 cc-ding \u5DF2\u91CD\u542F\u5B8C\u6210";t.update&&(i+=`
80
- **\u7248\u672C:** ${TOOL_VERSION}`);let o;const s=this.activeSessions.get(t.conversationId);if(s)o=s.session.sessionWebhook;else if(t.sessionWebhook)o=t.sessionWebhook,console.log(`[${(0,session_1.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,session_1.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:t.conversationId,sessionWebhook:o,content:i,msgType:"markdown",atUserId:t.senderStaffId}),console.log(`[${(0,session_1.timestamp)()}] \u91CD\u542F\u5B8C\u6210\u901A\u77E5\u5DF2\u53D1\u9001`)}catch(t){try{const i=fs_1.default.readFileSync(a,"utf-8");console.error(`[${(0,session_1.timestamp)()}] .reboot_pending \u5185\u5BB9:`,i)}catch{}console.error(`[${(0,session_1.timestamp)()}] \u5904\u7406\u91CD\u542F\u901A\u77E5\u5931\u8D25:`,t);try{fs_1.default.unlinkSync(a)}catch{}}}async run(){const a=Array.isArray(this.config.conversations)?this.config.conversations:[],t=this.config.taskHandlerCount??this.DEFAULT_TASK_HANDLER_COUNT,i=a.length>0;console.log(`[${(0,session_1.timestamp)()}] \u9489\u9489\u673A\u5668\u4EBA\u670D\u52A1\u542F\u52A8\uFF0CclientId: ${this.clientId}`),console.log(`[${(0,session_1.timestamp)()}] \u7FA4\u914D\u7F6E: ${a.map(u=>u.conversationTitle||u.conversationId).join(", ")}`),(0,api_key_manager_1.startupCheck)(this),await(0,session_1.resolveAllPhonesInConfig)(this),this.config.apiKeyCfg&&((0,api_key_manager_1.resetApiKeyCfg)(this),(0,api_key_manager_1.scheduleApiKeyCfgDailyReset)(this)),this.loadActiveSessions(),await this.notifyPendingReboot(),this.cronEngine.start(),i&&console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u5668\u6570\u91CF: ${t}`),this.dingStreamClient.registerCallbackListener("/v1.0/im/bot/messages/get",async u=>{await this.botMsgGetCallback(u)});const o=[];if(i)for(let u=0;u<t;u++)console.log(`[${(0,session_1.timestamp)()}] \u542F\u52A8\u4EFB\u52A1\u5904\u7406\u5668 #${u+1}`),o.push(this.runTaskHandlerLoop().catch(r=>console.error(`\u4EFB\u52A1\u5904\u7406\u5668 #${u+1} \u9519\u8BEF:`,r)));const s=this.dingStreamClient.connect().catch(u=>{console.error("Fatal error",u),process.exit(1)});await Promise.all([s,...o])}}exports.DingClaude=DingClaude;
82
+ ${u}
83
+ \`\`\``,msgType:"markdown"})}else await this.sendDingMessage({conversationId:e,sessionWebhook:o,content:`\u26A0\uFE0F \u672A\u627E\u5230 CLAUDE.md
84
+ \u8DEF\u5F84: \`${n}\``,msgType:"markdown"});return}let q=f;const x=[];if(t.atUsers&&t.atUsers.length>0){const s=t.chatbotUserId;for(const n of t.atUsers){const d=n.staffId||n.dingtalkId;!d||d===a||d===s||d.startsWith("$:LWCP_v1:")||x.push(d)}}if(x.length>0)for(const s of x){const n=await(0,session_1.resolveUserIdName)(this,s),d=n?`${n}(${s})`:s;q=q.replace(/\u200b/g,d)}await this.handleSessionMessage({conversationId:e,sessionWebhook:o,senderStaffId:a,senderNick:i,message:q,conversationConfig:C})}async notifyPendingReboot(){const r=path_1.default.join(this.getClientDir(),".reboot_pending");if(fs_1.default.existsSync(r))try{const t=JSON.parse(fs_1.default.readFileSync(r,"utf-8"));fs_1.default.unlinkSync(r);let i="\u2705 cc-ding \u5DF2\u91CD\u542F\u5B8C\u6210";t.update&&(i+=`
85
+ **\u7248\u672C:** ${TOOL_VERSION}`);let a;const e=this.activeSessions.get(t.conversationId);if(e)a=e.session.sessionWebhook;else if(t.sessionWebhook)a=t.sessionWebhook,console.log(`[${(0,session_1.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,session_1.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:t.conversationId,sessionWebhook:a,content:i,msgType:"markdown",atUserId:t.senderStaffId}),console.log(`[${(0,session_1.timestamp)()}] \u91CD\u542F\u5B8C\u6210\u901A\u77E5\u5DF2\u53D1\u9001`)}catch(t){try{const i=fs_1.default.readFileSync(r,"utf-8");console.error(`[${(0,session_1.timestamp)()}] .reboot_pending \u5185\u5BB9:`,i)}catch{}console.error(`[${(0,session_1.timestamp)()}] \u5904\u7406\u91CD\u542F\u901A\u77E5\u5931\u8D25:`,t);try{fs_1.default.unlinkSync(r)}catch{}}}startConnectionWatchdog(){let i=Date.now();setInterval(()=>{const a=this.dingStreamClient;if(a.connected){i=Date.now();return}const e=Date.now()-i;if(e>=6e4){console.log(`[${(0,session_1.timestamp)()}] \u8FDE\u63A5\u76D1\u63A7: \u5DF2\u65AD\u5F00 ${e/1e3}s\uFF0C\u5F3A\u5236\u91CD\u65B0\u8FDE\u63A5`),i=Date.now();try{a.disconnect()}catch{}a.connect().catch(p=>{console.error(`[${(0,session_1.timestamp)()}] \u5F3A\u5236\u91CD\u8FDE\u5931\u8D25:`,p)})}else this.debugLog(`\u8FDE\u63A5\u76D1\u63A7: \u5DF2\u65AD\u5F00 ${e/1e3}s\uFF0C\u7B49\u5F85\u81EA\u52A8\u91CD\u8FDE...`)},3e4)}async run(){const r=Array.isArray(this.config.conversations)?this.config.conversations:[],t=this.config.taskHandlerCount??this.DEFAULT_TASK_HANDLER_COUNT,i=r.length>0;console.log(`[${(0,session_1.timestamp)()}] \u9489\u9489\u673A\u5668\u4EBA\u670D\u52A1\u542F\u52A8\uFF0CclientId: ${this.clientId}`),console.log(`[${(0,session_1.timestamp)()}] \u7FA4\u914D\u7F6E: ${r.map(p=>p.conversationTitle||p.conversationId).join(", ")}`),(0,api_key_manager_1.startupCheck)(this),await(0,session_1.resolveAllPhonesInConfig)(this),this.config.apiKeyCfg&&((0,api_key_manager_1.resetApiKeyCfg)(this),(0,api_key_manager_1.scheduleApiKeyCfgDailyReset)(this)),this.loadActiveSessions(),(0,claude_process_1.injectStartupContexts)(this),await this.notifyPendingReboot(),this.cronEngine.start(),this.startConnectionWatchdog(),i&&console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u5668\u6570\u91CF: ${t}`),this.dingStreamClient.registerCallbackListener("/v1.0/im/bot/messages/get",async p=>{await this.botMsgGetCallback(p)});const a=[];if(i)for(let p=0;p<t;p++)console.log(`[${(0,session_1.timestamp)()}] \u542F\u52A8\u4EFB\u52A1\u5904\u7406\u5668 #${p+1}`),a.push(this.runTaskHandlerLoop().catch(o=>console.error(`\u4EFB\u52A1\u5904\u7406\u5668 #${p+1} \u9519\u8BEF:`,o)));const e=this.dingStreamClient.connect().catch(p=>{console.error("Fatal error",p),process.exit(1)});await Promise.all([e,...a])}}exports.DingClaude=DingClaude;