cc-ding 0.3.0 → 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.
@@ -1,85 +1,85 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(D,r,t,o){o===void 0&&(o=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(D,o,a)}):(function(D,r,t,o){o===void 0&&(o=t),D[o]=r[t]})),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(D,r){Object.defineProperty(D,"default",{enumerable:!0,value:r})}):function(D,r){D.default=r}),__importStar=this&&this.__importStar||(function(){var D=function(r){return D=Object.getOwnPropertyNames||function(t){var o=[];for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&(o[o.length]=a);return o},D(r)};return function(r){if(r&&r.__esModule)return r;var t={};if(r!=null)for(var o=D(r),a=0;a<o.length;a++)o[a]!=="default"&&__createBinding(t,r,o[a]);return __setModuleDefault(t,r),t}})(),__importDefault=this&&this.__importDefault||function(D){return D&&D.__esModule?D:{default:D}};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,o,a,e)=>(0,messaging_2.sendClaudeResponseToDing)(this,t,o,a,e),this.parseClaudeStreamLine=claude_process_1.parseClaudeStreamLine,this.interruptClaudeProcess=(t,o)=>(0,claude_process_1.interruptClaudeProcess)(t,o),this.executeClaudeQuery=(t,o,a)=>(0,claude_process_1.executeClaudeQuery)(this,t,o,a),this.getClientDir=()=>(0,session_1.getClientDir)(this),this.getClientConfig=()=>(0,session_1.getClientConfig)(this),this.authCheck=(t,o)=>(0,session_1.authCheck)(this,t,o),this.isOwner=t=>(0,session_1.isOwner)(this,t),this.isAdmin=t=>(0,session_1.isAdmin)(this,t),this.debugLog=(t,...o)=>(0,session_1.debugLog)(this,t,...o),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,o)=>(0,session_1.readSessionLogTail)(this,t,o),this.findActiveSession=t=>(0,session_1.findActiveSession)(this,t),this.findHistorySession=(t,o)=>(0,session_1.findHistorySession)(this,t,o),this.findLatestSession=t=>(0,session_1.findLatestSession)(this,t),this.updateSessionFile=(t,o)=>(0,session_1.updateSessionFile)(this,t,o),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,o)=>(0,session_1.endSession)(this,t,o),this.switchToSession=(t,o,a,e,w)=>(0,session_1.switchToSession)(this,t,o,a,e,w),this.startNewSession=t=>(0,session_1.startNewSession)(this,t),this.handleSessionMessage=t=>(0,session_1.handleSessionMessage)(this,t),this.cleanCache=(t,o=!0)=>(0,session_1.cleanCache)(this,t,o),this.formatTaskInfo=()=>(0,task_1.formatTaskInfo)(this),this.cancelTask=(t,o)=>(0,task_1.cancelTask)(this,t,o),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,o){return this.isOwner(o)||this.isAdmin(o)?!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,o){return this.isOwner(o)?!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,o,a){return this.isOwner(o)||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:o,conversationId:a,conversationType:e,conversationTitle:w,sessionWebhook:i}=r;if(!this.config.ownerConversationId){await this.sendDingMessage({conversationId:a,sessionWebhook:i,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:i,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:o,conversationId:a,conversationType:e,conversationTitle:w,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=${o}, \u4F1A\u8BDD=${a}`);const v=["\u{1F4CB} **\u6536\u5230\u6388\u6743\u7533\u8BF7**",`- **\u7528\u6237ID:** ${t}`,`- **\u6635\u79F0:** ${o}`,`- **\u4F1A\u8BDDID:** ${a}`,w?`- **\u4F1A\u8BDD\u6807\u9898:** ${w}`:"",`- **\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:i,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:i,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:o,sessionWebhook:a,senderStaffId:e,senderNick:w,conversationConfig:i}=t;switch(r.type){case"list":{const g=await this.getOrCreateLogSession(o,a,e,w,i,!0),l=this.cronEngine.listJobs(o);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:o,sessionWebhook:a,content:(0,cron_1.formatCronJobList)(l),msgType:"markdown"});return}case"delete":{const g=this.cronEngine.removeJob(r.id),l=await this.getOrCreateLogSession(o,a,e,w,i);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:o,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(o,a,e,w,i);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:o,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(o,a,e,w,i);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:o,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:o,sessionWebhook:a,content:`\u274C \u65E0\u6548\u7684cron\u8868\u8FBE\u5F0F: \`${r.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(o,a);return}const g=this.cronEngine.addJob({conversationId:o,cronExpression:r.cronExpression,description:this.sanitizeLogContent(r.prompt.substring(0,50)),prompt:r.prompt,senderStaffId:e,senderNick:w}),l=await this.getOrCreateLogSession(o,a,e,w,i);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:o,sessionWebhook:a,content:(0,cron_1.formatCronJobInfo)(g),msgType:"markdown"});return}case"create_nl":{if(!this.hasNotifyCapability(t.conversationConfig)){await this.sendCronNoNotifyError(o,a);return}await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:"\u23F3 \u6B63\u5728\u5206\u6790\u5B9A\u65F6\u4EFB\u52A1\u63CF\u8FF0..."});const g=await this.cronEngine.analyzeAndCreate(o,r.input,e,w),l=await this.getOrCreateLogSession(o,a,e,w,i);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:o,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:o,sessionWebhook:a,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}}}async handleTodoCommand(r,t){const{conversationId:o,sessionWebhook:a,senderStaffId:e,senderNick:w}=t;if(r.type==="mode"){(0,todo_1.setIdMode)(this,o,r.mode);const i=r.mode==="staffId"?"\u5DE5\u53F7(staffId)":"\u9489\u9489ID(dingtalkId)";await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u2705 \u7528\u6237\u6807\u8BC6\u6A21\u5F0F\u5DF2\u5207\u6362\u4E3A: **${i}**
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
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 i=(0,todo_1.getSortedTodoItems)(this,o),g=(0,todo_1.getReminderHour)(this,o),v=(0,todo_1.getIdMode)(this,o)==="staffId"?"\u5DE5\u53F7\u6A21\u5F0F":"\u9489\u9489ID\u6A21\u5F0F",T=(0,todo_1.formatTodoList)(i,g),$=`\u{1F4CC} \u5F53\u524D\u6807\u8BC6\u6A21\u5F0F: **${v}**
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
10
 
11
- ${T}`;await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:$,msgType:"markdown"});return}if(r.type==="remind"){(0,todo_1.setReminderHour)(this,o,r.hour);const i=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:o,sessionWebhook:a,content:i});return}if(r.type==="done"){const i=(0,todo_1.doneTodoItem)(this,o,r.index);i.success&&i.item?await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u2705 \u5DF2\u5B8C\u6210: ~~${i.item.content}~~ _@${i.item.assigneeNick}_`,msgType:"markdown"}):await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u274C ${i.error}`});return}if(r.type==="remove"){if(r.index==="all"){const i=(0,todo_1.clearAllTodoItems)(this,o);i.success?await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u{1F5D1}\uFE0F \u5DF2\u6E05\u7A7A ${i.count} \u6761\u5F85\u529E`}):await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u274C ${i.error}`})}else{const i=(0,todo_1.deleteTodoItem)(this,o,r.index);i.success&&i.item?await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u{1F5D1}\uFE0F \u5DF2\u5220\u9664: ~~${i.item.content}~~`,msgType:"markdown"}):await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:`\u274C ${i.error}`})}return}if(r.type==="add"){const i=(0,todo_1.getIdMode)(this,o),g=r.assigneeId||e,l=r.assigneeNick||w,v=r.deadline&&(0,todo_1.parseDeadline)(r.deadline)||(0,todo_1.getDefaultDeadline)(),T=(0,todo_1.addTodoItem)(this,o,{content:r.content,assigneeStaffId:g,assigneeNick:l,deadline:v,assigneeIdType:i}),f=(0,todo_1.getSortedTodoItems)(this,o).findIndex(M=>M.content===T.content&&M.createdAt===T.createdAt)+1,c=(0,todo_1.formatTodoItemCreated)(T,f);await this.sendDingMessage({conversationId:o,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,`
12
- `),o=8e3;return t.length>o?t.substring(0,o)+`
13
- ...(\u8F93\u51FA\u5DF2\u622A\u65AD)`:t}truncateMsg(r,t=100){const o=r.replace(/\n/g," ").trim();return o.length>t?o.slice(0,t)+"...":o}async getOrCreateLogSession(r,t,o,a,e,w=!1){const i=this.findActiveSession(r);if(i)return{sessionDir:this.getSessionDir(i.session.session),isNew:!1};if(w)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:o,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:o,senderStaffId:a,conversationId:e,conversationTitle:w,sessionWebhook:i,msgtype:g,conversationType:l}=t,v=t.text?.content?.trim()??"";if(this.debugLog(`\u6536\u5230\u6D88\u606F: \u7FA4=${w}(${e}), \u53D1\u9001\u8005=${o}(${a}), \u7C7B\u578B=${g}, \u5185\u5BB9=${v.substring(0,50)}`),!this.authCheck(a,e)){await this.handleAuthRequest({senderStaffId:a,senderNick:o,conversationId:e,conversationType:l,conversationTitle:t.conversationTitle,sessionWebhook:i});return}const T=this.getConversationConfig(e),$=(0,commands_1.parseRecorderCommand)(v);if($!==null){if(!this.isOwner(a)||l!=="1"){await this.sendDingMessage({conversationId:e,sessionWebhook:i,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:i,content:`\u{1F534} Recorder \u6A21\u5F0F\u5DF2\u5F00\u542F
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,`
12
+ `),i=8e3;return t.length>i?t.substring(0,i)+`
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
15
15
  - \u6240\u6709\u6D88\u606F\u5C06\u88AB\u5206\u7C7B\u8BB0\u5F55\u5230\u672C\u5730
16
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:i,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:i,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:i,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=T?.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:i,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=T?.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:i,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:i,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:i,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,i,a,T))return;const s=c.conversationId||e,n=s!==e,d=n?this.config.conversations.find(C=>C.conversationId===s):T,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 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||s}(${s})`)}else if(!d){const C={conversationId:s,conversationType:n?"1":l,conversationTitle:c.conversationTitle||(n?"":w)};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 I of c.whiteUserList)(0,session_1.isMobile)(I)&&await(0,session_1.resolveUserId)(this,I)}this.config.conversations.push(C),(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u6CE8\u518C\u65B0\u7FA4: ${C.conversationTitle||s}(${s}) \u7C7B\u578B=${C.conversationType||"-"}`)}const y=this.getConversationDir(s);fs_1.default.existsSync(y)||(fs_1.default.mkdirSync(y,{recursive:!0}),console.log(`[${(0,session_1.timestamp)()}] \u521B\u5EFA\u5DE5\u4F5C\u76EE\u5F55: ${y}`));const p=d||this.getConversationConfig(s),m=[d?"\u2705 \u7FA4\u914D\u7F6E\u5DF2\u5237\u65B0":"\u2705 \u7FA4\u5DF2\u6CE8\u518C",`- **\u7FA4\u540D\u79F0:** ${p?.conversationTitle||s}`,`- **\u7FA4ID:** ${s}`];if(p?.conversationType&&m.push(`- **\u4F1A\u8BDD\u7C7B\u578B:** ${p.conversationType==="1"?"\u5355\u804A":p.conversationType==="2"?"\u7FA4\u804A":p.conversationType}`),p?.dingToken?m.push(`- **dingToken:** ${p.dingToken.substring(0,8)}...`):m.push("- **dingToken:** (\u672A\u6307\u5B9A, \u4F7F\u7528 defaultDingToken)"),p?.linkConversationId&&m.push(`- **linkConversationId:** ${p.linkConversationId}`),p?.atSender===!1&&m.push("- **atSender:** false (\u4E0D @ \u53D1\u9001\u4EBA)"),p?.receiveReply===!1&&m.push("- **receiveReply:** false (\u4E0D\u56DE\u590D\u786E\u8BA4\u6D88\u606F)"),p?.permissionMode&&m.push(`- **permissionMode:** ${p.permissionMode}`),p?.whiteUserList?.length){const C=p.whiteUserList.map(I=>(0,session_1.isMobile)(I)?I:(0,session_1.userIdToPhone)(this,I)||I).join(", ");m.push(`- **whiteUserList:** ${C}`)}m.push(`- **\u5DE5\u4F5C\u76EE\u5F55:** ${y}`),m.push(`
18
- \u{1F4A1} \u53EF\u7F16\u8F91 config.json \u8865\u5145\u66F4\u591A\u914D\u7F6E`),await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:m.join(`
19
- `),msgType:"markdown"});return}if((0,commands_1.parseHelpCommand)(f)){await this.sendDingMessage({conversationId:e,sessionWebhook:i,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:i,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:i,content:(0,commands_1.formatCommandHelp)(s),msgType:"markdown"}):await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u274C \u672A\u627E\u5230\u547D\u4EE4: **${M}**
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}**
20
20
 
21
- \u{1F4A1} \u8F93\u5165 \`/help\` \u67E5\u770B\u6240\u6709\u53EF\u7528\u547D\u4EE4`,msgType:"markdown"});return}const k=(0,commands_1.parseRebootCommand)(f);if(k){if(!await this.requireOwnerOrAdmin(e,i,a))return;if(k.tag&&!/^[\w.\-]+$/.test(k.tag)){await this.sendDingMessage({conversationId:e,sessionWebhook:i,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=k.tag?`@${k.tag}`:"",n=k.update?`pnpm add -g cc-ding${s}`:null,d=`cc-ding-${this.clientId}`;await this.sendDingMessage({conversationId:e,sessionWebhook:i,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:i,update:k.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},y=>{y&&console.error(`[${(0,session_1.timestamp)()}] pm2 restart \u5931\u8D25:`,y)})},1e3);return}if(!T){console.log(`\u672A\u6CE8\u518C\u7684\u673A\u5668\u4EBA,\u7FA4:${w},${e}`),this.isOwner(a)?await this.sendDingMessage({conversationId:e,sessionWebhook:i,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:i,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"&&T?.conversationType!=="1"&&!this.isOwner(a)){await this.sendDingMessage({conversationId:e,sessionWebhook:i,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,i,a,T))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(`
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(`
22
22
  \u{1F4A1} \u6D3B\u8DC3\u4F1A\u8BDD\u5DF2\u4FDD\u7559`),n.errors.length>0&&d.push(`
23
- \u26A0\uFE0F \u9519\u8BEF: ${n.errors.join("; ")}`),await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:d.join(`
24
- `),msgType:"markdown"});return}if((0,commands_1.parseResetApiKeyCfgCommand)(f)){if(!await this.requireOwner(e,i,a))return;if(!this.config.apiKeyCfg){await this.sendDingMessage({conversationId:e,sessionWebhook:i,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:i,content:`\u2705 apiKeyCfg \u5DF2\u91CD\u7F6E
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
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,i,a))return;if(h.type==="approve"||h.type==="reject"){const n=this.pendingAuthRequests.get(h.requestId);if(!n){await this.sendDingMessage({conversationId:e,sessionWebhook:i,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:i,content:`\u2705 \u5DF2\u901A\u8FC7\u6388\u6743\u7533\u8BF7
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
27
27
  - **\u7528\u6237ID:** ${n.senderStaffId}
28
28
  - **\u6635\u79F0:** ${n.senderNick}
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:i,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
30
30
  - **\u7528\u6237ID:** ${n.senderStaffId}
31
- - **\u6635\u79F0:** ${n.senderNick}`,msgType:"markdown"});return}const s=T.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:i,content:`\u{1F4CB} **\u5F53\u524D\u7FA4\u767D\u540D\u5355**
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
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:i,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:i,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${h.staffId}`,msgType:"markdown"});return}if(this.config.adminUserList?.some(y=>(0,session_1.resolveToUserId)(this,y)===n)){const y=(0,session_1.userIdToPhone)(this,n)||n;await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u26A0\uFE0F ${y} \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:i,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:i,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${h.staffId}`,msgType:"markdown"});return}const d=this.config.adminUserList?.findIndex(p=>(0,session_1.resolveToUserId)(this,p)===n)??-1;if(d<0){const p=(0,session_1.userIdToPhone)(this,n)||n;await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u26A0\uFE0F ${p} \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 y=(0,session_1.userIdToPhone)(this,n)||u;await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u2705 \u5DF2\u79FB\u9664 ${y}`,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:i,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${h.staffId}`,msgType:"markdown"});return}if(s?.some(p=>(0,session_1.resolveToUserId)(this,p)===n)){const p=(0,session_1.userIdToPhone)(this,n)||n;await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u26A0\uFE0F ${p} \u5DF2\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}T.whiteUserList||(T.whiteUserList=[]),T.whiteUserList.push(h.staffId),(0,api_key_manager_1.saveClientConfig)(this);const u=T.whiteUserList.map(p=>{const m=(0,session_1.resolveToUserId)(this,p);return(0,session_1.userIdToPhone)(this,m)||p}),y=(0,session_1.isMobile)(h.staffId)?h.staffId:(0,session_1.userIdToPhone)(this,h.staffId)||h.staffId;await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u2705 \u5DF2\u6DFB\u52A0 ${y} \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:i,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${h.staffId}`,msgType:"markdown"});return}const d=s?.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:i,content:`\u26A0\uFE0F ${m} \u4E0D\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}const u=T.whiteUserList[d];T.whiteUserList.splice(d,1),T.whiteUserList.length===0&&delete T.whiteUserList,(0,api_key_manager_1.saveClientConfig)(this);const y=T.whiteUserList?.length?T.whiteUserList.map(m=>{const C=(0,session_1.resolveToUserId)(this,m);return(0,session_1.userIdToPhone)(this,C)||m}).join(", "):"(\u7A7A\uFF0C\u4F7F\u7528\u5168\u5C40\u767D\u540D\u5355)",p=(0,session_1.userIdToPhone)(this,n)||u;await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u2705 \u5DF2\u79FB\u9664 ${p}
37
- \u5F53\u524D\u767D\u540D\u5355: ${y}`,msgType:"markdown"});return}}const b=(0,commands_1.parseOpenCommand)(f);if(b!==null){if(!await this.requireOwner(e,i,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:i,content:`\u{1F4C2} \u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u6253\u5F00:
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:
38
38
  \`\`\`
39
39
  ${s}
40
- \`\`\``,msgType:"markdown"})):b==="code"?n("which code",u=>{if(u){this.sendDingMessage({conversationId:e,sessionWebhook:i,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:i,content:`\u{1F4BB} \u5DF2\u5728 VS Code \u4E2D\u6253\u5F00:
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:
41
41
  \`\`\`
42
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:i,content:`\u{1F4BB} \u5DF2\u5728\u7EC8\u7AEF\u4E2D\u6253\u5F00:
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:
44
44
  \`\`\`
45
45
  ${s}
46
- \`\`\``,msgType:"markdown"}))}catch(u){await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u274C \u6253\u5F00\u5931\u8D25: ${u instanceof Error?u.message:String(u)}`,msgType:"markdown"})}return}const A=(0,commands_1.parseCronCommand)(f);if(A){await this.handleCronCommand(A,{conversationId:e,sessionWebhook:i,senderStaffId:a,senderNick:o,conversationConfig:T});return}const P=(0,commands_2.parseTodoCommand)(f,t.atUsers);if(P!==null){await this.handleTodoCommand(P,{conversationId:e,sessionWebhook:i,senderStaffId:a,senderNick:o});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),T?.preBash&&n.push(T.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(y,p,m)=>{try{let C;if(y)C=`\u274C \u547D\u4EE4\u6267\u884C\u5931\u8D25
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
47
47
  \`\`\`
48
- ${y.message}
49
- \`\`\``,m&&(C+=`
48
+ ${T.message}
49
+ \`\`\``,w&&(D+=`
50
50
 
51
51
  **stderr:**
52
52
  \`\`\`
53
- ${u.sanitizeOutput(m)}
54
- \`\`\``);else{const I=p||"(\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
55
55
  \`\`\`
56
56
  ${u.sanitizeOutput(I)}
57
- \`\`\``,m&&(C+=`
57
+ \`\`\``,w&&(D+=`
58
58
 
59
59
  **stderr:**
60
60
  \`\`\`
61
- ${u.sanitizeOutput(m)}
62
- \`\`\``)}await u.sendDingMessage({conversationId:e,sessionWebhook:i,content:C,msgType:"markdown"})}catch(C){console.error("[bash] \u53D1\u9001\u6D88\u606F\u5931\u8D25:",C)}});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:i,senderStaffId:a,senderNick:o,message:n,conversationConfig:T}):await this.sendDingMessage({conversationId:e,sessionWebhook:i,atUserId:a,content:"\u{1F680} \u8BF7\u8F93\u5165\u60A8\u7684\u95EE\u9898\u5F00\u59CB\u65B0\u4F1A\u8BDD"});return}const N=(0,commands_1.parseContinueSessionCommand)(f);if(N!==null&&T){let s=N;if(!s){const n=(0,session_1.findLatestSession)(this,e);if(!n){await this.sendDingMessage({conversationId:e,sessionWebhook:i,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,i,s,a,T);return}const _=(0,commands_1.parseLogCommand)(f);if(_!==null){const s=this.readSessionLogTail(e,_);s?await this.sendDingMessage({conversationId:e,sessionWebhook:i,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:
63
63
  \`\`\`
64
64
  ${s}
65
- \`\`\``,msgType:"markdown"}):await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u6D3B\u8DC3\u4F1A\u8BDD\u6216\u6682\u65E0\u65E5\u5FD7"});return}const S=(0,commands_1.parseInfoCommand)(f);if(S!==null){const s=[],n=this.getConversationDir(e);if((S==="all"||S==="robot")&&(s.push(`### \u{1F310} \u5168\u5C40\u6838\u5FC3\u914D\u7F6E
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
66
  `+(0,commands_1.formatGlobalConfig)(this.config)),s.push(`### \u{1F916} \u7FA4\u914D\u7F6E\u4FE1\u606F
67
- `+(0,commands_1.formatConversationInfo)(T,e,d=>(0,session_1.userIdToPhone)(this,d),n))),S==="all"||S==="session"){const d=this.formatSessionInfo(e);d?s.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\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
68
  `+d):s.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\u4FE1\u606F
69
- \u65E0\u6D3B\u8DC3\u4F1A\u8BDD`)}(S==="all"||S==="task")&&s.push(`### \u{1F4DD} \u4EFB\u52A1\u961F\u5217\u4FE1\u606F
70
- `+this.formatTaskInfo()),await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:s.join(`
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(`
71
71
 
72
- `),msgType:"markdown"});return}const E=(0,commands_1.parseLsCommand)(f);if(E!==null){const{target:s,depth:n}=E,d=this.getConversationDir(e);let u=d,y="\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55";if(s&&s!=="root")if(s.startsWith("./")||s.startsWith("../")||s.startsWith("/")){const m=path_1.default.resolve(d,s);if(fs_1.default.existsSync(m)&&fs_1.default.statSync(m).isDirectory()){if(!m.startsWith(d)){await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:"\u274C \u8DEF\u5F84\u8D85\u51FA\u5DE5\u4F5C\u76EE\u5F55\u8303\u56F4",msgType:"markdown"});return}u=m,y=s}else{await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u274C \u8DEF\u5F84\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55: **${s}**`,msgType:"markdown"});return}}else{const m=(0,commands_1.findSubdirByName)(d,s);if(m)u=m,y=s;else{await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u274C \u672A\u627E\u5230\u540D\u4E3A **${s}** \u7684\u76EE\u5F55`,msgType:"markdown"});return}}const p=(0,commands_1.getDirectoryStructure)(u,0,n);await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u{1F4C2} ${y} (\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):
73
73
  \`\`\`
74
- ${p}
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:i,content:s,msgType:"markdown"});return}if(f.startsWith("/task ")){const s=f.substring(6).trim();s&&(await this.sendDingMessage({conversationId:e,sessionWebhook:i,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:o,sessionWebhook:i}));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:i,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});else{const d=n.map((u,y)=>`${y+1}. **${u.senderNick||u.senderStaffId}:** ${this.truncateMsg(u.message)}`);await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u{1F4E8} \u6D88\u606F\u961F\u5217 (${n.length} \u6761)
74
+ ${m}
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)
76
76
  ${d.join(`
77
- `)}`,msgType:"markdown"})}return}case"cancel":{if(n.length===0){await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});return}const d=Math.min(O.count,n.length),y=n.splice(n.length-d,d).map((p,m)=>`${m+1}. **${p.senderNick||p.senderStaffId}:** ${this.truncateMsg(p.message)}`);await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:`\u2705 \u5DF2\u4ECE\u961F\u5C3E\u79FB\u9664 ${d} \u6761\u6D88\u606F
78
- ${y.join(`
79
- `)}`,msgType:"markdown"});return}case"cancelAll":{if(n.length===0){await this.sendDingMessage({conversationId:e,sessionWebhook:i,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:i,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:i,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:i,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:o,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:i,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u53D1\u9001\u6D88\u606F\u5F00\u59CB\u4F1A\u8BDD"});return}if(s.isProcessing){await this.sendDingMessage({conversationId:e,sessionWebhook:i,content:"\u23F3 \u6B63\u5728\u5904\u7406\u4E2D\uFF0C\u8BF7\u7A0D\u7B49..."});return}s.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(this,s.session,j,{senderNick:o,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:i,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**
81
81
  \`\`\`
82
82
  ${u}
83
- \`\`\``,msgType:"markdown"})}else await this.sendDingMessage({conversationId:e,sessionWebhook:i,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:i,senderStaffId:a,senderNick:o,message:q,conversationConfig:T})}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 o="\u2705 cc-ding \u5DF2\u91CD\u542F\u5B8C\u6210";t.update&&(o+=`
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:o,msgType:"markdown",atUserId:t.senderStaffId}),console.log(`[${(0,session_1.timestamp)()}] \u91CD\u542F\u5B8C\u6210\u901A\u77E5\u5DF2\u53D1\u9001`)}catch(t){try{const o=fs_1.default.readFileSync(r,"utf-8");console.error(`[${(0,session_1.timestamp)()}] .reboot_pending \u5185\u5BB9:`,o)}catch{}console.error(`[${(0,session_1.timestamp)()}] \u5904\u7406\u91CD\u542F\u901A\u77E5\u5931\u8D25:`,t);try{fs_1.default.unlinkSync(r)}catch{}}}async run(){const r=Array.isArray(this.config.conversations)?this.config.conversations:[],t=this.config.taskHandlerCount??this.DEFAULT_TASK_HANDLER_COUNT,o=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(w=>w.conversationTitle||w.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(),o&&console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u5668\u6570\u91CF: ${t}`),this.dingStreamClient.registerCallbackListener("/v1.0/im/bot/messages/get",async w=>{await this.botMsgGetCallback(w)});const a=[];if(o)for(let w=0;w<t;w++)console.log(`[${(0,session_1.timestamp)()}] \u542F\u52A8\u4EFB\u52A1\u5904\u7406\u5668 #${w+1}`),a.push(this.runTaskHandlerLoop().catch(i=>console.error(`\u4EFB\u52A1\u5904\u7406\u5668 #${w+1} \u9519\u8BEF:`,i)));const e=this.dingStreamClient.connect().catch(w=>{console.error("Fatal error",w),process.exit(1)});await Promise.all([e,...a])}}exports.DingClaude=DingClaude;
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;
@@ -1,42 +1,42 @@
1
- "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveClaudeSettingsPath=resolveClaudeSettingsPath,exports.isRetryableApiError=isRetryableApiError,exports.parseClaudeStreamLine=parseClaudeStreamLine,exports.interruptClaudeProcess=interruptClaudeProcess,exports.executeClaudeQuery=executeClaudeQuery;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),readline_1=__importDefault(require("readline")),child_process_1=require("child_process"),messaging_1=require("./messaging"),session_1=require("./session"),api_key_manager_1=require("./api-key-manager"),MAX_FAST_FAIL=20,API_RETRY_DELAY_MS=1e4,FAST_FAIL_THRESHOLD_MS=1e4,MAX_TOTAL_RETRIES=10,MAX_RETRY_DURATION_MS=300*1e3,WATCHDOG_TIMEOUT_MS=300*1e3,WATCHDOG_CHECK_INTERVAL_MS=30*1e3;function resolveClaudeSettingsPath(e,t,i){const r=(0,api_key_manager_1.getForceEnabledSettingsPath)(t);if(r)return r;if(e.config.apiKeyCfg){const c=(0,api_key_manager_1.readApiKeyFromSettings)(t);let I=null;if(c&&(I=e.config.apiKeyCfg.claudeSettings.find(u=>u.apiKey===c&&u.isValid)||null),I||(I=(0,api_key_manager_1.pickValidApiKey)(e)),I)return(0,api_key_manager_1.ensureSettingsWithApiKey)(t,I)}if(e.config.apiKeyCfg)return;if(i)return i;const s=path_1.default.join(t,".claude","settings.json");if(fs_1.default.existsSync(s))return console.log(`[${(0,session_1.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${s}`),s}function isRetryableApiError(e){if(/\b429\b/.test(e)&&!(0,api_key_manager_1.isQuotaExhaustedError)(e)||/API\s*Error.*422/i.test(e)||/\b422\b.*(?:TPM|额度超限|rate\s*limit|tokens?\s*per\s*minute)/i.test(e)||/(?:TPM|额度超限).*\b422\b/i.test(e))return!0;const t=e.toLowerCase();return["rate limit","rate_limit","ratelimit","too many requests","tokens per minute","requests per minute","rpm limit","overloaded","capacity","temporarily unavailable"].some(r=>t.includes(r))}function sleep(e){return new Promise(t=>setTimeout(t,e))}class RetryableApiError extends Error{constructor(t,i=""){super(`Retryable API error (TPM limit etc.)${t?" [fast fail]":""}`),this.name="RetryableApiError",this.isFastFail=t,this.output=i}}class ConversationNotFoundError extends Error{constructor(){super("Claude conversation not found"),this.name="ConversationNotFoundError"}}class ContextWindowExceededError extends Error{constructor(){super("Context window exceeded: prompt tokens exceed maximum context window"),this.name="ContextWindowExceededError"}}function readLastLogLines(e,t){try{return fs_1.default.readFileSync(e,"utf-8").split(`
2
- `).filter(Boolean).slice(-t).join(`
3
- `)}catch{return""}}function isContextWindowExceededError(e){return/prompt tokens?\s*\(\s*\d+\s*\)\s*exceeds/i.test(e)||/exceeds?.*maximum context window/i.test(e)}function isPermissionError(e){const t=e.toLowerCase();return["permission denied","permission_required","needs permission","requires permission","authorization required","authorize","not authorized","access denied","\u9700\u8981\u6388\u6743","\u6743\u9650\u4E0D\u8DB3","\u6CA1\u6709\u6743\u9650"].some(r=>t.includes(r))}function isConversationNotFoundError(e){return/no conversation found with session id/i.test(e)}function parseClaudeStreamLine(e,t=!1){if(!e.trim())return null;try{const i=JSON.parse(e);if(i.type==="system"&&i.subtype==="init"&&i.session_id)return{type:"system",sessionId:i.session_id};if(i.type==="assistant"){const r=i.message?.content;if(Array.isArray(r)){const s=[];for(const c of r)c.type==="text"&&c.text?s.push(c.text):c.type==="thinking"&&c.thinking&&t&&s.push(`\u{1F4AD} **\u601D\u8003\u8FC7\u7A0B**
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveClaudeSettingsPath=resolveClaudeSettingsPath,exports.isRetryableApiError=isRetryableApiError,exports.parseClaudeStreamLine=parseClaudeStreamLine,exports.interruptClaudeProcess=interruptClaudeProcess,exports.injectStartupContexts=injectStartupContexts,exports.injectSessionContextIfChanged=injectSessionContextIfChanged,exports.executeClaudeQuery=executeClaudeQuery;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),readline_1=__importDefault(require("readline")),child_process_1=require("child_process"),messaging_1=require("./messaging"),session_1=require("./session"),api_key_manager_1=require("./api-key-manager"),MAX_FAST_FAIL=20,API_RETRY_DELAY_MS=1e4,FAST_FAIL_THRESHOLD_MS=1e4,MAX_TOTAL_RETRIES=10,MAX_RETRY_DURATION_MS=300*1e3,WATCHDOG_TIMEOUT_MS=300*1e3,WATCHDOG_CHECK_INTERVAL_MS=30*1e3,injectedContextCache=new Map;function resolveClaudeSettingsPath(t,e,n){const i=(0,api_key_manager_1.getForceEnabledSettingsPath)(e);if(i)return i;if(t.config.apiKeyCfg){const a=(0,api_key_manager_1.readApiKeyFromSettings)(e);let $=null;if(a&&($=t.config.apiKeyCfg.claudeSettings.find(c=>c.apiKey===a&&c.isValid)||null),$||($=(0,api_key_manager_1.pickValidApiKey)(t)),$)return(0,api_key_manager_1.ensureSettingsWithApiKey)(e,$)}if(t.config.apiKeyCfg)return;if(n)return n;const m=path_1.default.join(e,".claude","settings.json");if(fs_1.default.existsSync(m))return console.log(`[${(0,session_1.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${m}`),m}function isRetryableApiError(t){if(/\b429\b/.test(t)&&!(0,api_key_manager_1.isQuotaExhaustedError)(t)||/API\s*Error.*422/i.test(t)||/\b422\b.*(?:TPM|额度超限|rate\s*limit|tokens?\s*per\s*minute)/i.test(t)||/(?:TPM|额度超限).*\b422\b/i.test(t))return!0;const e=t.toLowerCase();return["rate limit","rate_limit","ratelimit","too many requests","tokens per minute","requests per minute","rpm limit","overloaded","capacity","temporarily unavailable"].some(i=>e.includes(i))}function sleep(t){return new Promise(e=>setTimeout(e,t))}class RetryableApiError extends Error{constructor(e,n=""){super(`Retryable API error (TPM limit etc.)${e?" [fast fail]":""}`),this.name="RetryableApiError",this.isFastFail=e,this.output=n}}class ConversationNotFoundError extends Error{constructor(){super("Claude conversation not found"),this.name="ConversationNotFoundError"}}class ContextWindowExceededError extends Error{constructor(){super("Context window exceeded: prompt tokens exceed maximum context window"),this.name="ContextWindowExceededError"}}function readLastLogLines(t,e){try{return fs_1.default.readFileSync(t,"utf-8").split(`
2
+ `).filter(Boolean).slice(-e).join(`
3
+ `)}catch{return""}}function isContextWindowExceededError(t){return/prompt tokens?\s*\(\s*\d+\s*\)\s*exceeds/i.test(t)||/exceeds?.*maximum context window/i.test(t)}function isPermissionError(t){const e=t.toLowerCase();return["permission denied","permission_required","needs permission","requires permission","authorization required","authorize","not authorized","access denied","\u9700\u8981\u6388\u6743","\u6743\u9650\u4E0D\u8DB3","\u6CA1\u6709\u6743\u9650"].some(i=>e.includes(i))}function isConversationNotFoundError(t){return/no conversation found with session id/i.test(t)}function parseClaudeStreamLine(t,e=!1){if(!t.trim())return null;try{const n=JSON.parse(t);if(n.type==="system"&&n.subtype==="init"&&n.session_id)return{type:"system",sessionId:n.session_id};if(n.type==="assistant"){const i=n.message?.content;if(Array.isArray(i)){const m=[];for(const a of i)a.type==="text"&&a.text?m.push(a.text):a.type==="thinking"&&a.thinking&&e&&m.push(`\u{1F4AD} **\u601D\u8003\u8FC7\u7A0B**
4
4
  \`\`\`
5
- ${c.thinking}
6
- \`\`\``);if(s.length>0)return{type:"assistant",content:s.join(`
7
- `)}}else if(i.content)return{type:"assistant",content:typeof i.content=="string"?i.content:JSON.stringify(i.content)};return{type:"assistant"}}if(i.type==="result"){const r=i.result||"";return{type:"result",content:typeof r=="string"?r:JSON.stringify(r)}}return{type:i.type||"unknown"}}catch{return{type:"text",content:e}}}function interruptClaudeProcess(e,t){return e.currentProcess?(console.log(`[${(0,session_1.timestamp)()}] ${t}`),e.interrupted=!0,e.currentProcess.kill("SIGINT"),!0):!1}function runClaudeOnce(e,t,i,r,s,c,I){let u=e.getSessionDir(t),S=`${u}/session.log`;fs_1.default.existsSync(u)||fs_1.default.mkdirSync(u,{recursive:!0});const m=Date.now();return new Promise((g,d)=>{const C=(0,child_process_1.spawn)(r,i,{cwd:s,stdio:["pipe","pipe","pipe"]}),v=e.activeSessions.get(t.conversationId);v&&(v.currentProcess=C,v.lastActivityTime=Date.now()),fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u542F\u52A8${I?" (\u91CD\u8BD5)":""}
8
- `,"utf-8"),C.stdin?.write(`${c}
9
- `),C.stdin?.end();let A=!I&&!!t.claudeSessionId,w=[],k="",R="",P=!1,h=!1,y=null;const E=new Set,M=()=>{v&&(v.lastActivityTime=Date.now())};y=setInterval(()=>{if(h){y&&clearInterval(y);return}const a=v?.lastActivityTime??m;if(Date.now()-a>=WATCHDOG_TIMEOUT_MS){console.warn(`[${(0,session_1.timestamp)()}] Watchdog: Claude \u8FDB\u7A0B ${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u901A\u77E5\u7528\u6237`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [SYSTEM]: Watchdog \u8D85\u65F6\uFF0C${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u5DF2\u901A\u77E5\u7528\u6237
10
- `,"utf-8")}catch{}y&&clearInterval(y),y=null;const l=v?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:l,content:`\u23F0 Claude \u8FDB\u7A0B\u8D85\u8FC7 ${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u54CD\u5E94\uFF0C\u53EF\u53D1\u9001 /goon \u5F3A\u5236\u91CD\u542F\u6062\u590D\uFF0C\u6216 /end \u7ED3\u675F\u4F1A\u8BDD`}).catch(p=>console.error("\u53D1\u9001 Watchdog \u901A\u77E5\u5931\u8D25:",p))}},WATCHDOG_CHECK_INTERVAL_MS),readline_1.default.createInterface({input:C.stdout}).on("line",a=>{if(R+=a+`
11
- `,M(),e.debugLog(`Claude stdout: ${a.substring(0,200)}${a.length>200?"...":""}`),e.config.debug)try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [RAW]: ${a}
12
- `,"utf-8")}catch{}const n=parseClaudeStreamLine(a,e.config.includeThinking??!1);if(n){if(n.type==="system"&&n.sessionId&&!A&&(e.updateSessionFile(t,{claudeSessionId:n.sessionId}),A=!0,u=e.getSessionDir(t),S=`${u}/session.log`),n.type==="assistant"){try{const p=JSON.parse(a)?.message?.content;if(Array.isArray(p)){for(const o of p)if(o.type==="tool_use"&&o.id&&!E.has(o.id)){E.add(o.id);const $=o.name||"unknown";let f="";o.input&&(o.input.command?f=o.input.command.substring(0,200):o.input.file_path?f=o.input.file_path:o.input.pattern?f=o.input.pattern:o.input.query?f=o.input.query:o.input.description?f=o.input.description:o.input.prompt?f=o.input.prompt.substring(0,200):f=JSON.stringify(o.input).substring(0,200)),e.appendSessionLog(u,"tool",`${$}${f?": "+f:""}`)}}}catch{}n.content&&w.push(n.content)}if(n.type==="result"){const l=e.config.resultOnly??!0,p=(n.content||"").trim(),o=w.join(`
13
- `).trim(),$=l&&p||o;if($&&!v?.interrupted){try{e.appendSessionLog(u,"assistant",$)}catch{}const T=e.activeSessions.get(t.conversationId)?.lastSenderStaffId||t.startStaffId;P=!0,(0,messaging_1.sendClaudeResponseToDing)(e,(0,session_1.getReplyConversationId)(t),(0,session_1.getReplyWebhook)(t),T,$).catch(x=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",x))}else console.warn(`[${(0,session_1.timestamp)()}] Claude \u8FD4\u56DE\u4E86\u7A7A\u7684 result \u4E14 responseBuffer \u4E5F\u4E3A\u7A7A\uFF0C\u65E0\u5185\u5BB9\u53EF\u53D1\u9001`);w=[]}}}),C.stderr?.on("data",a=>{const n=a.toString();if(k+=n,M(),(0,api_key_manager_1.isQuotaExhaustedError)(n)){console.log(`[${(0,session_1.timestamp)()}] [Claude stderr] \u914D\u989D\u8017\u5C3D\u9519\u8BEF(429): ${n.trim()}`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [WARN]: ${n}`,"utf-8")}catch{}}else if(isRetryableApiError(n)){console.log(`[${(0,session_1.timestamp)()}] [Claude stderr] \u53EF\u91CD\u8BD5API\u9519\u8BEF(422 TPM\u9650\u6D41): ${n.trim()}`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [WARN]: ${n}`,"utf-8")}catch{}}else{console.error(`[Claude stderr]: ${n}`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [ERROR]: ${n}`,"utf-8")}catch{}}}),C.on("close",a=>{h=!0,y&&(clearInterval(y),y=null),console.log(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${a}`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u7ED3\u675F\uFF0C\u9000\u51FA\u7801: ${a}
14
- `,"utf-8")}catch{}const n=e.activeSessions.get(t.conversationId);if(n&&(n.currentProcess=void 0),n?.interrupted){console.log(`[${(0,session_1.timestamp)()}] \u7528\u6237\u4E3B\u52A8\u4E2D\u65AD\uFF0C\u4E22\u5F03 responseBuffer (${w.length} \u6BB5)`),n.interrupted=!1,w=[],g(0);return}if(w.length>0){const p=w.join(`
15
- `).trim();if(p){try{e.appendSessionLog(u,"assistant",p)}catch{}const o=n?.lastSenderStaffId||t.startStaffId;P=!0,(0,messaging_1.sendClaudeResponseToDing)(e,(0,session_1.getReplyConversationId)(t),(0,session_1.getReplyWebhook)(t),o,p).catch($=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",$))}}if(a===0&&!P&&!n?.interrupted){console.warn(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [WARN]: Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9
16
- `,"utf-8")}catch{}const p=n?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:p,content:"\u26A0\uFE0F Claude \u5904\u7406\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u4EFB\u4F55\u5185\u5BB9\uFF0C\u8BF7\u91CD\u8BD5\u6216\u6362\u79CD\u65B9\u5F0F\u63D0\u95EE"}).catch(o=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",o))}if(a===0){g(0);return}const l=k+`
17
- `+R;if((0,api_key_manager_1.isQuotaExhaustedError)(l)){const o=Date.now()-m<FAST_FAIL_THRESHOLD_MS;console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u914D\u989D\u8017\u5C3D\u9519\u8BEF(429)\uFF0Cstdout\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(R)}, stderr\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(k)}`),d(new RetryableApiError(o,l));return}if((0,api_key_manager_1.isAuthenticationError)(l)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u901A\u77E5\u7528\u6237`);const p=n?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:p,content:"\u26A0\uFE0F \u8BA4\u8BC1\u5931\u8D25(401)\uFF0CAPI Key \u65E0\u6548\u6216\u670D\u52A1\u672A\u6388\u6743\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E"}).catch(o=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",o)),g(a??1);return}if(isRetryableApiError(l)){const o=Date.now()-m<FAST_FAIL_THRESHOLD_MS;d(new RetryableApiError(o,l));return}if(isPermissionError(l)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u9700\u8981\u6388\u6743\uFF0C\u901A\u77E5\u7528\u6237`);const p=n?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:p,content:"\u26A0\uFE0F Claude \u9700\u8981\u6388\u6743\uFF0C\u8BF7\u4EBA\u5DE5\u4ECB\u5165"}).catch(o=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",o)),g(a??1);return}if(t.claudeSessionId&&isConversationNotFoundError(l)){console.log(`[${(0,session_1.timestamp)()}] Claude \u4F1A\u8BDD\u5DF2\u5931\u6548: ${t.claudeSessionId}\uFF0C\u901A\u77E5\u5916\u5C42\u91CD\u65B0\u53D1\u8D77\u65B0\u4F1A\u8BDD`),d(new ConversationNotFoundError);return}if(isContextWindowExceededError(l)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\u9519\u8BEF(400)\uFF0C\u5C06\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u5C06\u81EA\u52A8 /compact
18
- `,"utf-8")}catch{}d(new ContextWindowExceededError);return}d(new Error(`Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${a}`))}),C.on("error",a=>{h=!0,y&&(clearInterval(y),y=null),console.error("Claude \u8FDB\u7A0B\u9519\u8BEF:",a),fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [ERROR]: \u8FDB\u7A0B\u9519\u8BEF: ${a.message}
19
- `,"utf-8"),d(a)})})}function injectSessionContext(e,t){const i=e.getConversationDir(t.conversationId),r=path_1.default.join(i,".claude");fs_1.default.existsSync(r)||fs_1.default.mkdirSync(r,{recursive:!0});const s=e.getConversationConfig(t.conversationId),c=e.config,I="<!-- cc-ding:session-context-start (DO NOT EDIT) -->",u="<!-- cc-ding:session-context-end (DO NOT EDIT) -->",m=[I,"# cc-ding Session Context","","## Client",`- clientId: \`${e.clientId}\``,c.clientName?`- clientName: ${c.clientName}`:"",`- owner: ${c.owner}`,"","## Conversation",`- conversationId: \`${t.conversationId}\``,s?.conversationType?`- conversationType: ${s.conversationType==="1"?"\u5355\u804A":"\u7FA4\u804A"}`:"",s?.conversationTitle?`- conversationTitle: ${s.conversationTitle}`:"",s?.linkConversationId?`- linkConversationId: \`${s.linkConversationId}\` (\u5173\u8054\u7FA4\uFF0C\u5171\u4EAB\u5DE5\u4F5C\u76EE\u5F55)`:"","","## Settings",s?.permissionMode?`- permissionMode: ${s.permissionMode}`:"",s?.agent?`- agent: ${s.agent}`:"",s?.taskCfg?.skill?`- taskCfg.skill: ${s.taskCfg.skill}`:"",c.resultOnly!==void 0?`- resultOnly: ${c.resultOnly}`:"",c.includeThinking!==void 0?`- includeThinking: ${c.includeThinking}`:"",c.preBash?`- preBash(\u5168\u5C40): \`${c.preBash}\``:"",s?.preBash?`- preBash(\u7FA4): \`${s.preBash}\``:"","","## DingTalk Context",'\u5F53 prompt \u4E2D\u5305\u542B "\u6D88\u606F\u6765\u81EA: xxx(\u7528\u6237ID)" \u65F6\uFF0C\u8BF4\u660E\u6D88\u606F\u6765\u81EA\u9489\u9489\u7528\u6237\u3002',"- \u56DE\u7B54\u65F6\u8981\u8003\u8651\u7528\u6237\u7684\u4F7F\u7528\u573A\u666F\uFF08\u9489\u9489\u804A\u5929\u754C\u9762\uFF0C\u975E\u7EC8\u7AEF\u73AF\u5883\uFF09","- \u7528\u6237\u4E00\u822C\u60C5\u51B5\u4E0B\u53EA\u80FD\u901A\u8FC7 cc-ding \u8FDB\u884C\u64CD\u4F5C","- cc-ding \u6587\u6863: https://github.com/yihuineng/cc-ding",u].filter(Boolean).join(`
5
+ ${a.thinking}
6
+ \`\`\``);if(m.length>0)return{type:"assistant",content:m.join(`
7
+ `)}}else if(n.content)return{type:"assistant",content:typeof n.content=="string"?n.content:JSON.stringify(n.content)};return{type:"assistant"}}if(n.type==="result"){const i=n.result||"";return{type:"result",content:typeof i=="string"?i:JSON.stringify(i)}}return{type:n.type||"unknown"}}catch{return{type:"text",content:t}}}function interruptClaudeProcess(t,e){return t.currentProcess?(console.log(`[${(0,session_1.timestamp)()}] ${e}`),t.interrupted=!0,t.currentProcess.kill("SIGINT"),!0):!1}function runClaudeOnce(t,e,n,i,m,a,$){let c=t.getSessionDir(e),u=`${c}/session.log`;fs_1.default.existsSync(c)||fs_1.default.mkdirSync(c,{recursive:!0});const y=Date.now();return new Promise((I,f)=>{const T=(0,child_process_1.spawn)(i,n,{cwd:m,stdio:["pipe","pipe","pipe"]}),E=t.activeSessions.get(e.conversationId);E&&(E.currentProcess=T,E.lastActivityTime=Date.now()),fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u542F\u52A8${$?" (\u91CD\u8BD5)":""}
8
+ `,"utf-8"),T.stdin?.write(`${a}
9
+ `),T.stdin?.end();let b=!$&&!!e.claudeSessionId,C=[],P="",x="",k=!1,h=!1,g=null;const v=new Set,A=()=>{E&&(E.lastActivityTime=Date.now())};g=setInterval(()=>{if(h){g&&clearInterval(g);return}const r=E?.lastActivityTime??y;if(Date.now()-r>=WATCHDOG_TIMEOUT_MS){console.warn(`[${(0,session_1.timestamp)()}] Watchdog: Claude \u8FDB\u7A0B ${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u901A\u77E5\u7528\u6237`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: Watchdog \u8D85\u65F6\uFF0C${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u5DF2\u901A\u77E5\u7528\u6237
10
+ `,"utf-8")}catch{}g&&clearInterval(g),g=null;const d=E?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:d,content:`\u23F0 Claude \u8FDB\u7A0B\u8D85\u8FC7 ${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u54CD\u5E94\uFF0C\u53EF\u53D1\u9001 /goon \u5F3A\u5236\u91CD\u542F\u6062\u590D\uFF0C\u6216 /end \u7ED3\u675F\u4F1A\u8BDD`}).catch(l=>console.error("\u53D1\u9001 Watchdog \u901A\u77E5\u5931\u8D25:",l))}},WATCHDOG_CHECK_INTERVAL_MS),readline_1.default.createInterface({input:T.stdout}).on("line",r=>{if(x+=r+`
11
+ `,A(),t.debugLog(`Claude stdout: ${r.substring(0,200)}${r.length>200?"...":""}`),t.config.debug)try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [RAW]: ${r}
12
+ `,"utf-8")}catch{}const o=parseClaudeStreamLine(r,t.config.includeThinking??!1);if(o){if(o.type==="system"&&o.sessionId&&!b&&(t.updateSessionFile(e,{claudeSessionId:o.sessionId}),b=!0,c=t.getSessionDir(e),u=`${c}/session.log`),o.type==="assistant"){try{const l=JSON.parse(r)?.message?.content;if(Array.isArray(l)){for(const s of l)if(s.type==="tool_use"&&s.id&&!v.has(s.id)){v.add(s.id);const S=s.name||"unknown";let p="";s.input&&(s.input.command?p=s.input.command.substring(0,200):s.input.file_path?p=s.input.file_path:s.input.pattern?p=s.input.pattern:s.input.query?p=s.input.query:s.input.description?p=s.input.description:s.input.prompt?p=s.input.prompt.substring(0,200):p=JSON.stringify(s.input).substring(0,200)),t.appendSessionLog(c,"tool",`${S}${p?": "+p:""}`)}}}catch{}o.content&&C.push(o.content)}if(o.type==="result"){const d=t.config.resultOnly??!0,l=(o.content||"").trim(),s=C.join(`
13
+ `).trim(),S=d&&l||s;if(S&&!E?.interrupted){try{t.appendSessionLog(c,"assistant",S)}catch{}const w=t.activeSessions.get(e.conversationId)?.lastSenderStaffId||e.startStaffId;k=!0,(0,messaging_1.sendClaudeResponseToDing)(t,(0,session_1.getReplyConversationId)(e),(0,session_1.getReplyWebhook)(e),w,S).catch(R=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",R))}else console.warn(`[${(0,session_1.timestamp)()}] Claude \u8FD4\u56DE\u4E86\u7A7A\u7684 result \u4E14 responseBuffer \u4E5F\u4E3A\u7A7A\uFF0C\u65E0\u5185\u5BB9\u53EF\u53D1\u9001`);C=[]}}}),T.stderr?.on("data",r=>{const o=r.toString();if(P+=o,A(),(0,api_key_manager_1.isQuotaExhaustedError)(o)){console.log(`[${(0,session_1.timestamp)()}] [Claude stderr] \u914D\u989D\u8017\u5C3D\u9519\u8BEF(429): ${o.trim()}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [WARN]: ${o}`,"utf-8")}catch{}}else if(isRetryableApiError(o)){console.log(`[${(0,session_1.timestamp)()}] [Claude stderr] \u53EF\u91CD\u8BD5API\u9519\u8BEF(422 TPM\u9650\u6D41): ${o.trim()}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [WARN]: ${o}`,"utf-8")}catch{}}else{console.error(`[Claude stderr]: ${o}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [ERROR]: ${o}`,"utf-8")}catch{}}}),T.on("close",r=>{h=!0,g&&(clearInterval(g),g=null),console.log(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${r}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u7ED3\u675F\uFF0C\u9000\u51FA\u7801: ${r}
14
+ `,"utf-8")}catch{}const o=t.activeSessions.get(e.conversationId);if(o&&(o.currentProcess=void 0),o?.interrupted){console.log(`[${(0,session_1.timestamp)()}] \u7528\u6237\u4E3B\u52A8\u4E2D\u65AD\uFF0C\u4E22\u5F03 responseBuffer (${C.length} \u6BB5)`),o.interrupted=!1,C=[],I(0);return}if(C.length>0){const l=C.join(`
15
+ `).trim();if(l){try{t.appendSessionLog(c,"assistant",l)}catch{}const s=o?.lastSenderStaffId||e.startStaffId;k=!0,(0,messaging_1.sendClaudeResponseToDing)(t,(0,session_1.getReplyConversationId)(e),(0,session_1.getReplyWebhook)(e),s,l).catch(S=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",S))}}if(r===0&&!k&&!o?.interrupted){console.warn(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [WARN]: Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9
16
+ `,"utf-8")}catch{}const l=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:l,content:"\u26A0\uFE0F Claude \u5904\u7406\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u4EFB\u4F55\u5185\u5BB9\uFF0C\u8BF7\u91CD\u8BD5\u6216\u6362\u79CD\u65B9\u5F0F\u63D0\u95EE"}).catch(s=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",s))}if(r===0){I(0);return}const d=P+`
17
+ `+x;if((0,api_key_manager_1.isQuotaExhaustedError)(d)){const s=Date.now()-y<FAST_FAIL_THRESHOLD_MS;console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u914D\u989D\u8017\u5C3D\u9519\u8BEF(429)\uFF0Cstdout\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(x)}, stderr\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(P)}`),f(new RetryableApiError(s,d));return}if((0,api_key_manager_1.isAuthenticationError)(d)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u901A\u77E5\u7528\u6237`);const l=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:l,content:"\u26A0\uFE0F \u8BA4\u8BC1\u5931\u8D25(401)\uFF0CAPI Key \u65E0\u6548\u6216\u670D\u52A1\u672A\u6388\u6743\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E"}).catch(s=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",s)),I(r??1);return}if(isRetryableApiError(d)){const s=Date.now()-y<FAST_FAIL_THRESHOLD_MS;f(new RetryableApiError(s,d));return}if(isPermissionError(d)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u9700\u8981\u6388\u6743\uFF0C\u901A\u77E5\u7528\u6237`);const l=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:l,content:"\u26A0\uFE0F Claude \u9700\u8981\u6388\u6743\uFF0C\u8BF7\u4EBA\u5DE5\u4ECB\u5165"}).catch(s=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",s)),I(r??1);return}if(e.claudeSessionId&&isConversationNotFoundError(d)){console.log(`[${(0,session_1.timestamp)()}] Claude \u4F1A\u8BDD\u5DF2\u5931\u6548: ${e.claudeSessionId}\uFF0C\u901A\u77E5\u5916\u5C42\u91CD\u65B0\u53D1\u8D77\u65B0\u4F1A\u8BDD`),f(new ConversationNotFoundError);return}if(isContextWindowExceededError(d)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\u9519\u8BEF(400)\uFF0C\u5C06\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u5C06\u81EA\u52A8 /compact
18
+ `,"utf-8")}catch{}f(new ContextWindowExceededError);return}f(new Error(`Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${r}`))}),T.on("error",r=>{h=!0,g&&(clearInterval(g),g=null),console.error("Claude \u8FDB\u7A0B\u9519\u8BEF:",r),fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [ERROR]: \u8FDB\u7A0B\u9519\u8BEF: ${r.message}
19
+ `,"utf-8"),f(r)})})}const START_MARK="<!-- cc-ding:session-context-start (DO NOT EDIT) -->",END_MARK="<!-- cc-ding:session-context-end (DO NOT EDIT) -->";function buildContextContent(t,e){const n=t.getConversationConfig(e),i=t.config;return[START_MARK,"# cc-ding Session Context","","## Client",`- clientId: \`${t.clientId}\``,i.clientName?`- clientName: ${i.clientName}`:"",`- owner: ${i.owner}`,"","## Conversation",`- conversationId: \`${e}\``,n?.conversationType?`- conversationType: ${n.conversationType==="1"?"\u5355\u804A":"\u7FA4\u804A"}`:"",n?.conversationTitle?`- conversationTitle: ${n.conversationTitle}`:"",n?.linkConversationId?`- linkConversationId: \`${n.linkConversationId}\` (\u5173\u8054\u7FA4\uFF0C\u5171\u4EAB\u5DE5\u4F5C\u76EE\u5F55)`:"","","## Settings",n?.permissionMode?`- permissionMode: ${n.permissionMode}`:"",n?.agent?`- agent: ${n.agent}`:"",n?.taskCfg?.skill?`- taskCfg.skill: ${n.taskCfg.skill}`:"",i.resultOnly!==void 0?`- resultOnly: ${i.resultOnly}`:"",i.includeThinking!==void 0?`- includeThinking: ${i.includeThinking}`:"",i.preBash?`- preBash(\u5168\u5C40): \`${i.preBash}\``:"",n?.preBash?`- preBash(\u7FA4): \`${n.preBash}\``:"","","## DingTalk Context",'\u5F53 prompt \u4E2D\u5305\u542B "\u6D88\u606F\u6765\u81EA: xxx(\u7528\u6237ID)" \u65F6\uFF0C\u8BF4\u660E\u6D88\u606F\u6765\u81EA\u9489\u9489\u7528\u6237\u3002',"- \u56DE\u7B54\u65F6\u8981\u8003\u8651\u7528\u6237\u7684\u4F7F\u7528\u573A\u666F\uFF08\u9489\u9489\u804A\u5929\u754C\u9762\uFF0C\u975E\u7EC8\u7AEF\u73AF\u5883\uFF09","- \u7528\u6237\u4E00\u822C\u60C5\u51B5\u4E0B\u53EA\u80FD\u901A\u8FC7 cc-ding \u8FDB\u884C\u64CD\u4F5C","- cc-ding \u6587\u6863: https://github.com/yihuineng/cc-ding",END_MARK].filter(Boolean).join(`
20
20
  `)+`
21
- `,g=path_1.default.join(r,"CLAUDE.md");if(!fs_1.default.existsSync(g)){fs_1.default.writeFileSync(g,m,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u5199\u5165 CLAUDE.md: ${g}`);return}const d=fs_1.default.readFileSync(g,"utf-8"),C=d.indexOf(I),v=d.indexOf(u);if(C!==-1&&v!==-1&&v>C){const A=d.substring(0,C),w=d.substring(v+u.length),k=A+m+w;fs_1.default.writeFileSync(g,k,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u66F4\u65B0: ${g}`)}else fs_1.default.writeFileSync(g,m+`
22
- `+d,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u8FFD\u52A0\u5230\u73B0\u6709 CLAUDE.md: ${g}`)}async function executeClaudeQuery(e,t,i,r){const{skill:s,agent:c,senderNick:I,senderStaffId:u}=r||{};let S=e.getSessionDir(t),m=`${S}/session.log`;const g=e.getConversationDir(t.conversationId);injectSessionContext(e,t),fs_1.default.mkdirSync(S,{recursive:!0});let d=null;const C=(0,api_key_manager_1.readApiKeyFromSettings)(g);if(C&&e.config.apiKeyCfg&&(d=e.config.apiKeyCfg.claudeSettings.find(n=>n.apiKey===C&&n.isValid)||null,d&&console.log(`[${(0,session_1.timestamp)()}] \u4ECE settings-ding.json \u6062\u590D Claude Setting: ${(0,api_key_manager_1.settingLabel)(d)}`)),!(0,api_key_manager_1.getForceEnabledSettingsPath)(g)&&e.config.apiKeyCfg&&(d=(0,api_key_manager_1.pickValidApiKey)(e),!d)){const n=u||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:n,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D\uFF08\u65E0\u53EF\u7528 API Key\uFF09\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}const A=I&&u?`${i} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${I}(${u})`:i;e.appendSessionLog(S,"user",A);const w="claude",R=["--permission-mode",r?.permissionMode??"bypassPermissions","--print","--output-format","stream-json","--verbose"];c&&R.push("--agent",c);const P=s?`/${s} ${A}`:A;let h=0,y=0,E=0;const M=[],D=e.activeSessions.get(t.conversationId),a=n=>{const l=e.activeSessions.get(t.conversationId);return!l||l!==D?(console.log(`[${(0,session_1.timestamp)()}] \u4F1A\u8BDD\u5DF2\u88AB\u7EC8\u6B62\uFF0C${n}`),!1):l.goonPending?(console.log(`[${(0,session_1.timestamp)()}] \u6536\u5230 /goon \u8BF7\u6C42\uFF0C${n}`),!1):!0};for(;;){if(!a("\u505C\u6B62\u91CD\u8BD5"))return;const n=h>0;if(y>=MAX_TOTAL_RETRIES||y>=3&&E>0&&Date.now()-E>MAX_RETRY_DURATION_MS){const $=y>=MAX_TOTAL_RETRIES?`\u603B\u91CD\u8BD5\u6B21\u6570\u5DF2\u8FBE ${MAX_TOTAL_RETRIES} \u6B21`:`\u91CD\u8BD5\u6301\u7EED\u65F6\u95F4\u8D85\u8FC7 ${MAX_RETRY_DURATION_MS/1e3}s\uFF08\u5DF2\u91CD\u8BD5 ${y} \u6B21\uFF09`;console.error(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF: ${$}`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF\uFF0C${$}\uFF0C\u7EC8\u6B62\u91CD\u8BD5
23
- `,"utf-8");const f=readLastLogLines(m,1),T=M.slice(-1)[0]||"",x=u||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:x,content:`\u{1F504} \u68C0\u6D4B\u5230 Claude \u9677\u5165\u65E0\u9650\u91CD\u8BD5\uFF0C\u5DF2\u7EC8\u6B62\uFF08${$}\uFF09
21
+ `}function writeContextToFile(t,e,n){const i=t.getConversationDir(e),m=path_1.default.join(i,".claude");fs_1.default.existsSync(m)||fs_1.default.mkdirSync(m,{recursive:!0});const a=path_1.default.join(m,"CLAUDE.md");if(!fs_1.default.existsSync(a)){fs_1.default.writeFileSync(a,n,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u6CE8\u5165 CLAUDE.md: ${a}`);return}const $=fs_1.default.readFileSync(a,"utf-8"),c=$.indexOf(START_MARK),u=$.indexOf(END_MARK);if(c!==-1&&u!==-1&&u>c){const y=$.substring(0,c),I=$.substring(u+END_MARK.length),f=y+n+I;fs_1.default.writeFileSync(a,f,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u66F4\u65B0: ${a}`)}else fs_1.default.writeFileSync(a,n+`
22
+ `+$,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u8FFD\u52A0\u5230\u73B0\u6709 CLAUDE.md: ${a}`)}function injectStartupContexts(t){const e=Array.isArray(t.config.conversations)?t.config.conversations:[];for(const n of e){const i=buildContextContent(t,n.conversationId);injectedContextCache.set(n.conversationId,i),writeContextToFile(t,n.conversationId,i)}}function injectSessionContextIfChanged(t,e){const n=e.conversationId,i=buildContextContent(t,n);injectedContextCache.get(n)!==i&&(injectedContextCache.set(n,i),writeContextToFile(t,n,i))}async function executeClaudeQuery(t,e,n,i){const{skill:m,agent:a,senderNick:$,senderStaffId:c}=i||{};let u=t.getSessionDir(e),y=`${u}/session.log`;const I=t.getConversationDir(e.conversationId);injectSessionContextIfChanged(t,e),fs_1.default.mkdirSync(u,{recursive:!0});let f=null;const T=(0,api_key_manager_1.readApiKeyFromSettings)(I);if(T&&t.config.apiKeyCfg&&(f=t.config.apiKeyCfg.claudeSettings.find(o=>o.apiKey===T&&o.isValid)||null,f&&console.log(`[${(0,session_1.timestamp)()}] \u4ECE settings-ding.json \u6062\u590D Claude Setting: ${(0,api_key_manager_1.settingLabel)(f)}`)),!(0,api_key_manager_1.getForceEnabledSettingsPath)(I)&&t.config.apiKeyCfg&&(f=(0,api_key_manager_1.pickValidApiKey)(t),!f)){const o=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:o,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D\uFF08\u65E0\u53EF\u7528 API Key\uFF09\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}const b=$&&c?`${n} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${$}(${c})`:n;t.appendSessionLog(u,"user",b);const C="claude",x=["--permission-mode",i?.permissionMode??"bypassPermissions","--print","--output-format","stream-json","--verbose"];a&&x.push("--agent",a);const k=m?`/${m} ${b}`:b;let h=0,g=0,v=0;const A=[],D=t.activeSessions.get(e.conversationId),r=o=>{const d=t.activeSessions.get(e.conversationId);return!d||d!==D?(console.log(`[${(0,session_1.timestamp)()}] \u4F1A\u8BDD\u5DF2\u88AB\u7EC8\u6B62\uFF0C${o}`),!1):d.goonPending?(console.log(`[${(0,session_1.timestamp)()}] \u6536\u5230 /goon \u8BF7\u6C42\uFF0C${o}`),!1):!0};for(;;){if(!r("\u505C\u6B62\u91CD\u8BD5"))return;const o=h>0;if(g>=MAX_TOTAL_RETRIES||g>=3&&v>0&&Date.now()-v>MAX_RETRY_DURATION_MS){const S=g>=MAX_TOTAL_RETRIES?`\u603B\u91CD\u8BD5\u6B21\u6570\u5DF2\u8FBE ${MAX_TOTAL_RETRIES} \u6B21`:`\u91CD\u8BD5\u6301\u7EED\u65F6\u95F4\u8D85\u8FC7 ${MAX_RETRY_DURATION_MS/1e3}s\uFF08\u5DF2\u91CD\u8BD5 ${g} \u6B21\uFF09`;console.error(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF: ${S}`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF\uFF0C${S}\uFF0C\u7EC8\u6B62\u91CD\u8BD5
23
+ `,"utf-8");const p=readLastLogLines(y,1),w=A.slice(-1)[0]||"",R=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:R,content:`\u{1F504} \u68C0\u6D4B\u5230 Claude \u9677\u5165\u65E0\u9650\u91CD\u8BD5\uFF0C\u5DF2\u7EC8\u6B62\uFF08${S}\uFF09
24
24
 
25
25
  \u{1F4CB} \u6700\u8FD1\u91CD\u8BD5\u8BB0\u5F55\uFF1A
26
- ${T}
26
+ ${w}
27
27
 
28
28
  \u{1F4DD} \u6700\u8FD1\u65E5\u5FD7\uFF1A
29
29
  \`\`\`
30
- ${f}
30
+ ${p}
31
31
  \`\`\`
32
32
 
33
- \u{1F4A1} \u53EF\u5C1D\u8BD5\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD\uFF0C\u6216 /end \u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD`});return}const l=[...R];t.claudeSessionId&&(l.push("--resume",t.claudeSessionId),n||console.log(`[${(0,session_1.timestamp)()}] \u6062\u590D Claude \u4F1A\u8BDD: ${t.claudeSessionId}`));const p=resolveClaudeSettingsPath(e,g,r?.settings);p&&l.push("--settings",p);let o;n?(o="\u7EE7\u7EED",console.log(`[${(0,session_1.timestamp)()}] \u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${h}/${MAX_FAST_FAIL}\u6B21)`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${h}/${MAX_FAST_FAIL})
34
- `,"utf-8")):o=P,console.log(`[${(0,session_1.timestamp)()}] \u6267\u884C Claude \u67E5\u8BE2[\u539F\u751Fclaude \u6A21\u5F0F]: ${w} ${l.join(" ")}`),e.debugLog(`\u53D1\u9001\u6D88\u606F: ${o.substring(0,100)}...`);try{await runClaudeOnce(e,t,l,w,g,o,n);return}catch($){if(S=e.getSessionDir(t),m=`${S}/session.log`,$ instanceof RetryableApiError){if(y++,E=E||Date.now(),(0,api_key_manager_1.isQuotaExhaustedError)($.output)&&e.config.apiKeyCfg){if(M.push(`[${(0,session_1.timestamp)()}] 429 \u914D\u989D\u8017\u5C3D\uFF0C\u5C1D\u8BD5\u8F6E\u6362 Key`),d){const T=(0,api_key_manager_1.rotateApiKey)(e,d.apiKey);if(T){d=T,h=0,console.log(`[${(0,session_1.timestamp)()}] API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(T)}`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key
35
- `,"utf-8");continue}}const f=u||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:f,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D/API Key\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}if($.isFastFail){if(h++,h>=MAX_FAST_FAIL){if(d&&e.config.apiKeyCfg){const f=(0,api_key_manager_1.rotateApiKey)(e,d.apiKey);if(f){d=f,h=0,console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25 ${MAX_FAST_FAIL} \u6B21\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(f)}`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25\uFF0C\u5207\u6362\u5230\u65B0 Key
36
- `,"utf-8");continue}}throw console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03
37
- `,"utf-8"),new Error(`TPM \u9650\u6D41\uFF0C\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED ${MAX_FAST_FAIL} \u6B21`)}console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5 (${h}/${MAX_FAST_FAIL})`)}else h=0,console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u8FDB\u7A0B\u5DF2\u8FD0\u884C\u4E00\u6BB5\u65F6\u95F4)\uFF0C\u91CD\u7F6E\u5FEB\u901F\u5931\u8D25\u8BA1\u6570\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`);if(fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5
38
- `,"utf-8"),M.push(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`),await sleep(API_RETRY_DELAY_MS),!a("\u505C\u6B62\u5F53\u524D\u91CD\u8BD5"))return;continue}if($ instanceof ConversationNotFoundError){y++,E=E||Date.now(),M.push(`[${(0,session_1.timestamp)()}] \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD`),console.log(`[${(0,session_1.timestamp)()}] Claude \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664 claudeSessionId \u5E76\u91CD\u65B0\u53D1\u8D77`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u4F1A\u8BDD\u5DF2\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD\u5E76\u91CD\u65B0\u53D1\u8D77
39
- `,"utf-8"),t.claudeSessionId&&(t.claudeSessionId=void 0,e.updateSessionFile(t,{})),h=0;continue}if($ instanceof ContextWindowExceededError){y++,E=E||Date.now(),M.push(`[${(0,session_1.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8 /compact`),console.log(`[${(0,session_1.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587
40
- `,"utf-8");const f=u||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:f,content:"\u{1F4E6} \u4E0A\u4E0B\u6587\u8D85\u957F\uFF0C\u6B63\u5728\u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u540E\u7EE7\u7EED..."});const T=[...R];t.claudeSessionId&&T.push("--resume",t.claudeSessionId);const x=resolveClaudeSettingsPath(e,g,r?.settings);x&&T.push("--settings",x);try{await runClaudeOnce(e,t,T,w,g,"/compact",!1),console.log(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C
41
- `,"utf-8")}catch(b){throw console.error(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u5931\u8D25:`,b),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u5931\u8D25: ${b instanceof Error?b.message:String(b)}
42
- `,"utf-8"),await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:f,content:"\u274C \u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u53D1\u9001 /compact \u6216 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD"}),new Error(`\u4E0A\u4E0B\u6587\u8D85\u957F\u4E14 /compact \u5931\u8D25: ${b instanceof Error?b.message:String(b)}`)}h=0;continue}throw $}}}
33
+ \u{1F4A1} \u53EF\u5C1D\u8BD5\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD\uFF0C\u6216 /end \u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD`});return}const d=[...x];e.claudeSessionId&&(d.push("--resume",e.claudeSessionId),o||console.log(`[${(0,session_1.timestamp)()}] \u6062\u590D Claude \u4F1A\u8BDD: ${e.claudeSessionId}`));const l=resolveClaudeSettingsPath(t,I,i?.settings);l&&d.push("--settings",l);let s;o?(s="\u7EE7\u7EED",console.log(`[${(0,session_1.timestamp)()}] \u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${h}/${MAX_FAST_FAIL}\u6B21)`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${h}/${MAX_FAST_FAIL})
34
+ `,"utf-8")):s=k,console.log(`[${(0,session_1.timestamp)()}] \u6267\u884C Claude \u67E5\u8BE2[\u539F\u751Fclaude \u6A21\u5F0F]: ${C} ${d.join(" ")}`),t.debugLog(`\u53D1\u9001\u6D88\u606F: ${s.substring(0,100)}...`);try{await runClaudeOnce(t,e,d,C,I,s,o);return}catch(S){if(u=t.getSessionDir(e),y=`${u}/session.log`,S instanceof RetryableApiError){if(g++,v=v||Date.now(),(0,api_key_manager_1.isQuotaExhaustedError)(S.output)&&t.config.apiKeyCfg){if(A.push(`[${(0,session_1.timestamp)()}] 429 \u914D\u989D\u8017\u5C3D\uFF0C\u5C1D\u8BD5\u8F6E\u6362 Key`),f){const w=(0,api_key_manager_1.rotateApiKey)(t,f.apiKey);if(w){f=w,h=0,console.log(`[${(0,session_1.timestamp)()}] API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(w)}`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key
35
+ `,"utf-8");continue}}const p=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:p,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D/API Key\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}if(S.isFastFail){if(h++,h>=MAX_FAST_FAIL){if(f&&t.config.apiKeyCfg){const p=(0,api_key_manager_1.rotateApiKey)(t,f.apiKey);if(p){f=p,h=0,console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25 ${MAX_FAST_FAIL} \u6B21\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(p)}`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25\uFF0C\u5207\u6362\u5230\u65B0 Key
36
+ `,"utf-8");continue}}throw console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03
37
+ `,"utf-8"),new Error(`TPM \u9650\u6D41\uFF0C\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED ${MAX_FAST_FAIL} \u6B21`)}console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5 (${h}/${MAX_FAST_FAIL})`)}else h=0,console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u8FDB\u7A0B\u5DF2\u8FD0\u884C\u4E00\u6BB5\u65F6\u95F4)\uFF0C\u91CD\u7F6E\u5FEB\u901F\u5931\u8D25\u8BA1\u6570\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`);if(fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5
38
+ `,"utf-8"),A.push(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`),await sleep(API_RETRY_DELAY_MS),!r("\u505C\u6B62\u5F53\u524D\u91CD\u8BD5"))return;continue}if(S instanceof ConversationNotFoundError){g++,v=v||Date.now(),A.push(`[${(0,session_1.timestamp)()}] \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD`),console.log(`[${(0,session_1.timestamp)()}] Claude \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664 claudeSessionId \u5E76\u91CD\u65B0\u53D1\u8D77`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u4F1A\u8BDD\u5DF2\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD\u5E76\u91CD\u65B0\u53D1\u8D77
39
+ `,"utf-8"),e.claudeSessionId&&(e.claudeSessionId=void 0,t.updateSessionFile(e,{})),h=0;continue}if(S instanceof ContextWindowExceededError){g++,v=v||Date.now(),A.push(`[${(0,session_1.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8 /compact`),console.log(`[${(0,session_1.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587
40
+ `,"utf-8");const p=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:p,content:"\u{1F4E6} \u4E0A\u4E0B\u6587\u8D85\u957F\uFF0C\u6B63\u5728\u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u540E\u7EE7\u7EED..."});const w=[...x];e.claudeSessionId&&w.push("--resume",e.claudeSessionId);const R=resolveClaudeSettingsPath(t,I,i?.settings);R&&w.push("--settings",R);try{await runClaudeOnce(t,e,w,C,I,"/compact",!1),console.log(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C
41
+ `,"utf-8")}catch(M){throw console.error(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u5931\u8D25:`,M),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u5931\u8D25: ${M instanceof Error?M.message:String(M)}
42
+ `,"utf-8"),await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:p,content:"\u274C \u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u53D1\u9001 /compact \u6216 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD"}),new Error(`\u4E0A\u4E0B\u6587\u8D85\u957F\u4E14 /compact \u5931\u8D25: ${M instanceof Error?M.message:String(M)}`)}h=0;continue}throw S}}}
@@ -3,4 +3,4 @@
3
3
  `),t.trim()}function splitMessage(e,t){const r=[];for(;e.length>t;){let n=e.lastIndexOf(`
4
4
  `,t);(n===-1||n<t*.5)&&(n=e.lastIndexOf("\u3002",t)),(n===-1||n<t*.5)&&(n=e.lastIndexOf(" ",t)),n===-1||n<t*.5?n=t:n+=1,r.push(e.substring(0,n).trim()),e=e.substring(n).trim()}return e.length>0&&r.push(e),r}async function sendDingMessage(e,t){const{conversationId:r,sessionWebhook:n,atUserId:o,content:s,msgType:a="text"}=t,i=e.config.conversations.find(d=>d.conversationId===r);let c=o;(i?.atSender===!1||i?.conversationType==="1")&&(c=void 0);const l=c?[c]:[],p=i?.dingToken;let g=s;c&&a==="markdown"&&(g=`${s}
5
5
  @${c}`);const f=a==="markdown"?{msgtype:"markdown",markdown:{title:g,text:g},at:{atUserIds:l,isAtAll:!1}}:{msgtype:"text",text:{content:s},at:{atUserIds:l,isAtAll:!1}};if(p){const d=await e.dingStreamClient.getAccessToken(),u=`https://oapi.dingtalk.com/robot/send?access_token=${p}`;try{await urllib_1.default.request(u,{method:"POST",data:f,contentType:"json",headers:{"x-acs-dingtalk-access-token":d},dataType:"json"})}catch(y){console.error("\u901A\u8FC7 dingToken \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",y)}}else if(n){const d=await e.dingStreamClient.getAccessToken();try{await urllib_1.default.request(n,{method:"POST",data:f,contentType:"json",headers:{"x-acs-dingtalk-access-token":d},dataType:"json"})}catch(u){console.error("\u901A\u8FC7 sessionWebhook \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",u)}}else if(e.config.defaultDingToken){const d=await e.dingStreamClient.getAccessToken(),u=`https://oapi.dingtalk.com/robot/send?access_token=${e.config.defaultDingToken}`;try{await urllib_1.default.request(u,{method:"POST",data:f,contentType:"json",headers:{"x-acs-dingtalk-access-token":d},dataType:"json"})}catch(y){console.error("\u901A\u8FC7 defaultDingToken \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",y)}}else console.error("\u672A\u80FD\u83B7\u53D6\u673A\u5668\u4EBA\u4FE1\u606F\u53D1\u9001\u9014\u5F84")}async function sendClaudeResponseToDing(e,t,r,n,o){const a=filterToolUseContent(o);if(!a){e.debugLog("\u8FC7\u6EE4\u540E\u5185\u5BB9\u4E3A\u7A7A\uFF0C\u8DF3\u8FC7\u53D1\u9001");return}if(a.length<=18e3)await sendDingMessage(e,{conversationId:t,sessionWebhook:r,atUserId:n,content:a,msgType:"markdown"});else{const i=splitMessage(a,18e3);for(let c=0;c<i.length;c++){const l=i.length>1?`**[${c+1}/${i.length}]**
6
- `:"";await sendDingMessage(e,{conversationId:t,sessionWebhook:r,atUserId:c===i.length-1?n:"",content:l+i[c],msgType:"markdown"}),c<i.length-1&&await utils_ok_1.baseUtil.sleep(500)}}}async function sendMessageToUser(e,t,r,n="text"){if(!e.config.enableMsgToUser)return console.log(`[sendMessageToUser] enableMsgToUser \u672A\u5F00\u542F\uFF0C\u8DF3\u8FC7\u53D1\u9001 (userId=${t})`),!1;try{const o=await e.dingStreamClient.getAccessToken(),s=n==="markdown"?"sampleMarkdown":"sampleText",a=JSON.stringify(n==="markdown"?{title:"notification",text:r}:{content:r}),i=await urllib_1.default.request(`${DING_API_BASE}/v1.0/robot/oToMessages/batchSend`,{method:"POST",data:{robotCode:e.clientId,userIds:[t],msgKey:s,msgParam:a},contentType:"json",headers:{"x-acs-dingtalk-access-token":o},dataType:"json"});return i.status===200?!0:(console.error(`sendMessageToUser API \u8FD4\u56DE\u975E200: status=${i.status}, userId=${t}`),!1)}catch(o){return console.error(`sendMessageToUser \u5931\u8D25 (userId=${t}):`,o),!1}}async function sendOwnerMessage(e,t,r="text"){const{ownerConversationId:n,owner:o}=e.config;if(!n||!o)return!1;const s=await queryUserIdByMobile(e,o);return s?sendMessageToUser(e,s,t,r):(console.error(`sendOwnerMessage: \u65E0\u6CD5\u5C06\u624B\u673A\u53F7 ${o} \u89E3\u6790\u4E3A Ding userId`),!1)}
6
+ `:"";await sendDingMessage(e,{conversationId:t,sessionWebhook:r,atUserId:c===i.length-1?n:"",content:l+i[c],msgType:"markdown"}),c<i.length-1&&await utils_ok_1.asyncUtil.sleep(500)}}}async function sendMessageToUser(e,t,r,n="text"){if(!e.config.enableMsgToUser)return console.log(`[sendMessageToUser] enableMsgToUser \u672A\u5F00\u542F\uFF0C\u8DF3\u8FC7\u53D1\u9001 (userId=${t})`),!1;try{const o=await e.dingStreamClient.getAccessToken(),s=n==="markdown"?"sampleMarkdown":"sampleText",a=JSON.stringify(n==="markdown"?{title:"notification",text:r}:{content:r}),i=await urllib_1.default.request(`${DING_API_BASE}/v1.0/robot/oToMessages/batchSend`,{method:"POST",data:{robotCode:e.clientId,userIds:[t],msgKey:s,msgParam:a},contentType:"json",headers:{"x-acs-dingtalk-access-token":o},dataType:"json"});return i.status===200?!0:(console.error(`sendMessageToUser API \u8FD4\u56DE\u975E200: status=${i.status}, userId=${t}`),!1)}catch(o){return console.error(`sendMessageToUser \u5931\u8D25 (userId=${t}):`,o),!1}}async function sendOwnerMessage(e,t,r="text"){const{ownerConversationId:n,owner:o}=e.config;if(!n||!o)return!1;const s=await queryUserIdByMobile(e,o);return s?sendMessageToUser(e,s,t,r):(console.error(`sendOwnerMessage: \u65E0\u6CD5\u5C06\u624B\u673A\u53F7 ${o} \u89E3\u6790\u4E3A Ding userId`),!1)}
@@ -1,24 +1,23 @@
1
- "use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.formatTaskInfo=formatTaskInfo,exports.countTodoTask=countTodoTask,exports.getOneTodoTask=getOneTodoTask,exports.finishTask=finishTask,exports.cancelTask=cancelTask,exports.parseTaskCancelCommand=parseTaskCancelCommand,exports.handleTask=handleTask,exports.runTaskHandlerLoop=runTaskHandlerLoop,exports.saveTask=saveTask;const utils_ok_1=require("utils-ok"),fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),child_process_1=require("child_process"),common_1=require("../common"),messaging_1=require("./messaging"),claude_process_1=require("./claude-process"),session_1=require("./session"),api_key_manager_1=require("./api-key-manager"),MAX_RETRY_COUNT=3;function formatTaskInfo(t){const e=[],i=[],s=[],r=[];for(const l of t.config.conversations){const o=(0,session_1.getTasksDir)(t,l.conversationId);if(!fs_1.default.existsSync(o))continue;const u=utils_ok_1.fileUtil.dirWalker(o);for(const p of u){const c=path_1.default.basename(p);try{const g=utils_ok_1.fileUtil.getJSON(p);if(!g)continue;c==="task.json"?e.push(g):c==="task-doing.json"?i.push(g):c==="task-done.json"?s.push(g):c==="task-failed.json"&&r.push(g)}catch{}}}e.sort((l,o)=>l.startTime-o.startTime),i.sort((l,o)=>l.startTime-o.startTime),s.sort((l,o)=>o.startTime-l.startTime),r.sort((l,o)=>o.startTime-l.startTime);const a=[];if(i.length>0){const l=i.map(o=>`#${o.startTime} ${o.senderNickName||o.senderStaffId}: ${taskDisplayName(o)}`);a.push(`**\u23F3 \u5904\u7406\u4E2D (${i.length})**
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.formatTaskInfo=formatTaskInfo,exports.countTodoTask=countTodoTask,exports.getOneTodoTask=getOneTodoTask,exports.finishTask=finishTask,exports.cancelTask=cancelTask,exports.parseTaskCancelCommand=parseTaskCancelCommand,exports.handleTask=handleTask,exports.runTaskHandlerLoop=runTaskHandlerLoop,exports.saveTask=saveTask;const utils_ok_1=require("utils-ok"),fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),child_process_1=require("child_process"),common_1=require("../common"),messaging_1=require("./messaging"),claude_process_1=require("./claude-process"),session_1=require("./session"),api_key_manager_1=require("./api-key-manager"),MAX_RETRY_COUNT=3;function formatTaskInfo(t){const e=[],i=[],s=[],r=[];for(const l of t.config.conversations){const n=(0,session_1.getTasksDir)(t,l.conversationId);if(!fs_1.default.existsSync(n))continue;const u=utils_ok_1.fileUtil.dirWalker(n);for(const m of u){const c=path_1.default.basename(m);try{const g=utils_ok_1.fileUtil.getJSON(m);if(!g)continue;c==="task.json"?e.push(g):c==="task-doing.json"?i.push(g):c==="task-done.json"?s.push(g):c==="task-failed.json"&&r.push(g)}catch{}}}e.sort((l,n)=>l.startTime-n.startTime),i.sort((l,n)=>l.startTime-n.startTime),s.sort((l,n)=>n.startTime-l.startTime),r.sort((l,n)=>n.startTime-l.startTime);const a=[];if(i.length>0){const l=i.map(n=>`#${n.startTime} ${n.senderNickName||n.senderStaffId}: ${taskDisplayName(n)}`);a.push(`**\u23F3 \u5904\u7406\u4E2D (${i.length})**
2
2
  ${l.join(`
3
3
  `)}`)}else a.push(`**\u23F3 \u5904\u7406\u4E2D**
4
- \u65E0`);if(e.length>0){const l=e.map(o=>`#${o.startTime} ${o.senderNickName||o.senderStaffId}: ${taskDisplayName(o)}`);a.push(`**\u{1F4CB} \u5F85\u529E\u961F\u5217 (${e.length})**
4
+ \u65E0`);if(e.length>0){const l=e.map(n=>`#${n.startTime} ${n.senderNickName||n.senderStaffId}: ${taskDisplayName(n)}`);a.push(`**\u{1F4CB} \u5F85\u529E\u961F\u5217 (${e.length})**
5
5
  ${l.join(`
6
6
  `)}`)}else a.push(`**\u{1F4CB} \u5F85\u529E\u961F\u5217**
7
- \u65E0`);const n=s.slice(0,5);if(n.length>0){const l=n.map(o=>`#${o.startTime} ${o.senderNickName||o.senderStaffId}: ${taskDisplayName(o)}`);a.push(`**\u2705 \u6700\u8FD1\u5B8C\u6210 (top ${n.length}/${s.length})**
7
+ \u65E0`);const o=s.slice(0,5);if(o.length>0){const l=o.map(n=>`#${n.startTime} ${n.senderNickName||n.senderStaffId}: ${taskDisplayName(n)}`);a.push(`**\u2705 \u6700\u8FD1\u5B8C\u6210 (top ${o.length}/${s.length})**
8
8
  ${l.join(`
9
9
  `)}`)}else a.push(`**\u2705 \u6700\u8FD1\u5B8C\u6210**
10
- \u65E0`);if(r.length>0){const l=r.map(o=>`#${o.startTime} ${o.senderNickName||o.senderStaffId}: ${taskDisplayName(o)}${o.retryCount?` (\u91CD\u8BD5${o.retryCount}\u6B21)`:""}`);a.push(`**\u274C \u5931\u8D25 (${r.length})**
10
+ \u65E0`);if(r.length>0){const l=r.map(n=>`#${n.startTime} ${n.senderNickName||n.senderStaffId}: ${taskDisplayName(n)}${n.retryCount?` (\u91CD\u8BD5${n.retryCount}\u6B21)`:""}`);a.push(`**\u274C \u5931\u8D25 (${r.length})**
11
11
  ${l.join(`
12
12
  `)}`)}return a.join(`
13
13
 
14
- `)}function truncatePrompt(t,e=80){const i=t.replace(/\n/g," ").trim();return i.length>e?i.slice(0,e)+"...":i}function taskDisplayName(t){return t.title?t.title:truncatePrompt(t.prompt)}async function preprocessTask(t,e,i){const s=(0,session_1.getConversationDir)(t,e),r="claude",a=["--permission-mode","bypassPermissions","--print"],n=(0,claude_process_1.resolveClaudeSettingsPath)(t,s);n&&a.push("--settings",n);const l=["\u8BF7\u5BF9\u4EE5\u4E0B\u4EFB\u52A1\u9700\u6C42\u8FDB\u884C\u9884\u5904\u7406\uFF0C\u751F\u6210\u7B80\u77ED\u6807\u9898\u548C\u4F18\u5316\u540E\u7684\u9700\u6C42\u63CF\u8FF0\u3002","\u76F4\u63A5\u8FD4\u56DEJSON\uFF0C\u4E0D\u8981markdown\u4EE3\u7801\u5757\u6216\u5176\u4ED6\u5185\u5BB9\u3002",'\u683C\u5F0F: {"title":"\u7B80\u77ED\u6807\u9898(15\u5B57\u4EE5\u5185)","promptSimply":"\u4F18\u5316\u540E\u7684\u9700\u6C42\u63CF\u8FF0\uFF0C\u4FDD\u7559\u539F\u59CB\u9700\u6C42\u7684\u6240\u6709\u5173\u952E\u4FE1\u606F\uFF0C\u4F7F\u63CF\u8FF0\u66F4\u6E05\u6670\u3001\u7ED3\u6784\u5316"}',"",`\u539F\u59CB\u9700\u6C42: ${i}`].join(`
15
- `);a.push(l);const o=3e4;return new Promise(u=>{let p="";const c=(0,child_process_1.spawn)(r,a,{cwd:s,stdio:["ignore","pipe","pipe"]}),g=setTimeout(()=>{c.kill("SIGTERM"),setTimeout(()=>{try{c.kill("SIGKILL")}catch{}},3e3)},o);c.stdout.on("data",f=>{p+=f.toString()}),c.stderr.on("data",()=>{}),c.on("close",f=>{if(clearTimeout(g),f!==0||!p.trim()){console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u5931\u8D25(\u9000\u51FA\u7801:${f})\uFF0C\u4F7F\u7528\u539F\u59CBprompt`),u(null);return}try{let d=p.trim();const j=d.match(/\{[\s\S]*\}/);j&&(d=j[0]);const m=JSON.parse(d);m.title&&m.promptSimply?(console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u5B8C\u6210: title="${m.title}"`),u({title:String(m.title),promptSimply:String(m.promptSimply)})):(console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u8FD4\u56DE\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u4F7F\u7528\u539F\u59CBprompt`),u(null))}catch(d){console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406JSON\u89E3\u6790\u5931\u8D25\uFF0C\u4F7F\u7528\u539F\u59CBprompt: ${d}`),u(null)}}),c.on("error",f=>{clearTimeout(g),console.error(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u8FDB\u7A0B\u9519\u8BEF:`,f),u(null)})})}function countTodoTask(t){let e=0;for(const i of t.config.conversations){const s=(0,session_1.getTasksDir)(t,i.conversationId);if(fs_1.default.existsSync(s)){const a=utils_ok_1.fileUtil.dirWalker(s).filter(n=>path_1.default.basename(n)==="task.json");e+=a.length}}return e}async function getOneTodoTask(t){for(const e of t.config.conversations){const i=(0,session_1.getTasksDir)(t,e.conversationId);if(!fs_1.default.existsSync(i))continue;const r=utils_ok_1.fileUtil.dirWalker(i).filter(n=>path_1.default.basename(n)==="task.json");if(r.length===0)continue;const a=r.map(n=>{try{const l=utils_ok_1.fileUtil.getJSON(n);return l?{file:n,task:l}:null}catch{return console.error(`\u4EFB\u52A1\u6587\u4EF6\u89E3\u6790\u5931\u8D25\uFF0C\u8DF3\u8FC7: ${n}`),null}}).filter(n=>n!==null).sort((n,l)=>n.task.startTime-l.task.startTime);if(a.length>0){const{file:n,task:l}=a[0];return common_1.utils.addSuffixToFile(n,"-doing"),l}}}async function finishTask(t,e){const i=`${e}/task-doing.json`;let s;try{s=utils_ok_1.fileUtil.getJSON(i)}catch(l){console.error(`\u8BFB\u53D6\u4EFB\u52A1\u6587\u4EF6\u5931\u8D25: ${i}`,l);return}const r=`${e}/result.md`,a=fs_1.default.existsSync(r)?utils_ok_1.fileUtil.getFileStr(r):"\u62B1\u6B49,\u4EFB\u52A1\u5904\u7406\u5F02\u5E38...";await(0,messaging_1.sendDingMessage)(t,{conversationId:s.conversationId,sessionWebhook:s.sessionWebhook,atUserId:s.senderStaffId,content:a,msgType:"markdown"});const n=i.replace("-doing.json","-done.json");utils_ok_1.fileUtil.rename(i,n)}async function failTask(t,e,i){const s=`${e}/task-doing.json`;let r;try{r=utils_ok_1.fileUtil.getJSON(s)}catch(n){console.error(`\u8BFB\u53D6\u4EFB\u52A1\u6587\u4EF6\u5931\u8D25: ${s}`,n);return}await(0,messaging_1.sendDingMessage)(t,{conversationId:r.conversationId,sessionWebhook:r.sessionWebhook,atUserId:r.senderStaffId,content:`\u274C \u4EFB\u52A1\u5931\u8D25: ${taskDisplayName(r)}
16
- \u539F\u56E0: ${i}`,msgType:"markdown"});const a=s.replace("-doing.json","-failed.json");utils_ok_1.fileUtil.rename(s,a)}async function resetTaskToTodo(t,e,i){const s=`${e}/task-doing.json`,r=`${e}/task.json`;if(!fs_1.default.existsSync(s))return!1;try{const a=utils_ok_1.fileUtil.getJSON(s),n=(a.retryCount||0)+1;if(n>=MAX_RETRY_COUNT)return console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u91CD\u8BD5\u6B21\u6570\u5DF2\u8FBE\u4E0A\u9650(${n}/${MAX_RETRY_COUNT})\uFF0C\u6807\u8BB0\u4E3A\u5931\u8D25: ${a.title||a.prompt}`),a.retryCount=n,fs_1.default.writeFileSync(s,JSON.stringify(a,null,2),"utf-8"),await failTask(t,e,`${i} (\u5DF2\u91CD\u8BD5${n}\u6B21)`),!1;a.retryCount=n,fs_1.default.writeFileSync(s,JSON.stringify(a,null,2),"utf-8"),console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u91CD\u7F6E\u4E3A\u5F85\u529E (\u91CD\u8BD5${n}/${MAX_RETRY_COUNT}): ${a.title||a.prompt}`)}catch(a){console.error(`[${(0,session_1.timestamp)()}] \u66F4\u65B0\u4EFB\u52A1\u91CD\u8BD5\u8BA1\u6570\u5931\u8D25:`,a)}return fs_1.default.existsSync(s)&&utils_ok_1.fileUtil.rename(s,r),!0}function cancelTask(t,e,i){const s=[],r=e.trim(),a=i?t.config.conversations.filter(u=>u.conversationId===i):t.config.conversations;for(const u of a){const p=(0,session_1.getTasksDir)(t,u.conversationId);if(!fs_1.default.existsSync(p))continue;const g=utils_ok_1.fileUtil.dirWalker(p).filter(f=>path_1.default.basename(f)==="task.json");for(const f of g)try{const d=utils_ok_1.fileUtil.getJSON(f);if(!d)continue;if(String(d.startTime)===r){s.push({file:f,task:d});continue}if(d.title&&d.title.includes(r)){s.push({file:f,task:d});continue}}catch{}}if(s.length===0)return`\u672A\u627E\u5230\u5339\u914D\u7684\u5F85\u529E\u4EFB\u52A1: ${r}`;let n=0;for(const{file:u,task:p}of s)try{fs_1.default.unlinkSync(u),n++,console.log(`[${(0,session_1.timestamp)()}] \u5DF2\u53D6\u6D88\u4EFB\u52A1: #${p.startTime} ${p.title||p.prompt}`)}catch(c){console.error(`[${(0,session_1.timestamp)()}] \u53D6\u6D88\u4EFB\u52A1\u5931\u8D25: ${u}`,c)}const l=s.slice(0,5).map(u=>`#${u.task.startTime} ${taskDisplayName(u.task)}`).join(`
17
- `),o=n>5?`
18
- ...\u5171\u53D6\u6D88 ${n} \u4E2A\u4EFB\u52A1`:"";return`\u5DF2\u53D6\u6D88 ${n} \u4E2A\u5F85\u529E\u4EFB\u52A1:
19
- ${l}${o}`}function parseTaskCancelCommand(t){const i=t.trim().match(/^\/task\s+cancel\s+(.+)$/i);return i?i[1].trim():null}function updateCmdArgsSettings(t,e){const i=t.indexOf("--settings");i!==-1&&t.splice(i,2),e&&t.push("--settings",e)}async function handleTask(t){const e=await getOneTodoTask(t);if(!e){(0,session_1.debugLog)(t,"\u672A\u53D1\u73B0\u5F85\u529E\u4EFB\u52A1...");return}const i=(0,session_1.getConversationConfig)(t,e.conversationId),s=(0,session_1.getConversationDir)(t,e.conversationId),r=`${(0,session_1.getTasksDir)(t,e.conversationId)}/${e.startTimeStr}`;if(!fs_1.default.existsSync(r)){console.error(`\u4EFB\u52A1\u76EE\u5F55\u4E0D\u5B58\u5728: ${r}`);return}e.type!=="cron"&&await(0,messaging_1.sendDingMessage)(t,{conversationId:e.conversationId,sessionWebhook:e.sessionWebhook,atUserId:e.senderStaffId,content:`\u{1F504} \u5F00\u59CB\u5904\u7406\u4EFB\u52A1: ${taskDisplayName(e)}`});const a=`${r}/result.md`,n=`${r}/task.log`;console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u4E2D: ${e.title||e.prompt}`);const l=e.senderNickName&&e.senderStaffId?`${e.senderNickName}(${e.senderStaffId}), `:"unknown",o=t.config.apiKeyCfg,u=(0,api_key_manager_1.getForceEnabledSettingsPath)(s);let p=!1,c=null;if(u)console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 FORCE_ENABLE\uFF0C\u5F3A\u5236\u4F7F\u7528 settings-ding.json`);else if(o){if(c=(0,api_key_manager_1.pickValidApiKey)(t),!c){console.log(`[${(0,session_1.timestamp)()}] \u65E0\u53EF\u7528\u914D\u989D\uFF0C\u4EFB\u52A1\u91CD\u7F6E\u4E3A\u5F85\u529E`),await resetTaskToTodo(t,r,"\u65E0\u53EF\u7528\u914D\u989D");return}p=!0,console.log(`[${(0,session_1.timestamp)()}] \u5207\u6362\u5230 API Key \u6A21\u5F0F`)}const g=i?.taskCfg?.skill,f=i?.agent,d=e.promptSimply||e.prompt,m=["--permission-mode","bypassPermissions","--print",`${g?`/${g}`:""} \u7528\u6237: ${l}, \u9700\u6C42: ${d}; \u6700\u540E\u5C06\u56DE\u590D\u5185\u5BB9\u4FDD\u5B58\u81F3: ${a}`.trim()];if(u)m.push("--settings",u);else if(p&&c){const $=(0,api_key_manager_1.ensureSettingsWithApiKey)(s,c);m.push("--settings",$)}else if(!o){const $=path_1.default.join(s,".claude","settings.json");fs_1.default.existsSync($)&&(m.push("--settings",$),console.log(`[${(0,session_1.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${$}`))}f&&m.push("--agent",f),(0,session_1.debugLog)(t,`\u6267\u884C\u547D\u4EE4: claude ${m.join(" ")}`);const O=600*1e3,N=20,x=1e4,D=1e4,I="claude",M=$=>{const k=Date.now();return new Promise(y=>{const _=[];let F=!1,P=!1;const C=(0,child_process_1.spawn)(I,$,{cwd:s,stdio:["ignore","pipe","pipe"]}),A=setTimeout(()=>{F||(P=!0,console.error("\u4EFB\u52A1\u6267\u884C\u8D85\u65F6(10\u5206\u949F)\uFF0C\u7EC8\u6B62\u8FDB\u7A0B"),C.kill("SIGTERM"),setTimeout(()=>{F||C.kill("SIGKILL")},5e3))},O);C.stdout.on("data",w=>{const v=w.toString();process.stdout.write(v),_.push(v)}),C.stderr.on("data",w=>{const v=w.toString();process.stderr.write(v),_.push(v)}),C.on("close",w=>{F=!0,clearTimeout(A),y({exitCode:w??1,output:_.join(""),elapsed:Date.now()-k,timedOut:P})}),C.on("error",w=>{console.error("\u8FDB\u7A0B\u6267\u884C\u9519\u8BEF:",w),_.push(`\u8FDB\u7A0B\u6267\u884C\u9519\u8BEF: ${w.message}`)})})};let h,S,b=!1,T=0;for(;;){const $=await M(m);if(h=$.exitCode,S=$.output,b=$.timedOut,h!==0){if(b){console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u6267\u884C\u8D85\u65F6\uFF0C\u91CD\u7F6E\u4E3A\u5F85\u529E`);const k=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${I} ${m.join(" ")}`,`[${(0,session_1.timestamp)()}] \u8D85\u65F6(${O/1e3}s)`,S].join(`
20
- `);fs_1.default.writeFileSync(n,k),await resetTaskToTodo(t,r,"\u6267\u884C\u8D85\u65F6");return}if((0,api_key_manager_1.isQuotaExhaustedError)(S)&&o){if(p){if(c){const y=(0,api_key_manager_1.rotateApiKey)(t,c.apiKey);if(y){c=y,T=0;const _=(0,api_key_manager_1.ensureSettingsWithApiKey)(s,c);updateCmdArgsSettings(m,_),console.log(`[${(0,session_1.timestamp)()}] API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(y)}`);continue}}}else if(c=(0,api_key_manager_1.pickValidApiKey)(t),c){p=!0,T=0;const y=(0,api_key_manager_1.ensureSettingsWithApiKey)(s,c);updateCmdArgsSettings(m,y),console.log(`[${(0,session_1.timestamp)()}] \u5207\u6362\u5230 API Key \u6A21\u5F0F`);continue}console.log(`[${(0,session_1.timestamp)()}] \u65E0\u53EF\u7528\u914D\u989D\uFF0C\u4EFB\u52A1\u91CD\u7F6E\u4E3A\u5F85\u529E`);const k=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${I} ${m.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,S].join(`
21
- `);fs_1.default.writeFileSync(n,k),await resetTaskToTodo(t,r,"\u65E0\u53EF\u7528\u914D\u989D(429)");return}if((0,api_key_manager_1.isAuthenticationError)(S)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u6807\u8BB0\u4EFB\u52A1\u5931\u8D25`);const k=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${I} ${m.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,S].join(`
22
- `);fs_1.default.writeFileSync(n,k),await failTask(t,r,"\u8BA4\u8BC1\u5931\u8D25(401)\uFF0CAPI Key \u65E0\u6548\u6216\u670D\u52A1\u672A\u6388\u6743");return}if((0,claude_process_1.isRetryableApiError)(S)){if($.elapsed<D&&p&&c&&o){if(T++,T>=N){const k=(0,api_key_manager_1.rotateApiKey)(t,c.apiKey);if(k){c=k,T=0;const y=(0,api_key_manager_1.ensureSettingsWithApiKey)(s,c);updateCmdArgsSettings(m,y),console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25 ${N} \u6B21\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(k)}`),await utils_ok_1.baseUtil.sleep(x);continue}}}else if($.elapsed<D){if(T++,T>=N){console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${N}\u6B21\uFF0C\u91CD\u7F6E\u4EFB\u52A1\u4E3A\u5F85\u529E`);const k=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${I} ${m.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,S].join(`
23
- `);fs_1.default.writeFileSync(n,k),await resetTaskToTodo(t,r,"TPM\u9650\u6D41\u5FEB\u901F\u5931\u8D25\u6B21\u6570\u8FC7\u591A");return}console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${x/1e3}s \u540E\u91CD\u8BD5 (${T}/${N})`)}else T=0,console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u8FDB\u7A0B\u5DF2\u8FD0\u884C\u4E00\u6BB5\u65F6\u95F4)\uFF0C\u91CD\u7F6E\u5FEB\u901F\u5931\u8D25\u8BA1\u6570\uFF0C${x/1e3}s \u540E\u91CD\u8BD5`);await utils_ok_1.baseUtil.sleep(x);continue}}break}const U=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${I} ${m.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,S].join(`
24
- `);if(fs_1.default.writeFileSync(n,U),h!==0){console.error(`\u547D\u4EE4\u6267\u884C\u5931\u8D25, \u9000\u51FA\u7801: ${h}`),await failTask(t,r,`\u6267\u884C\u5931\u8D25(\u9000\u51FA\u7801: ${h})`);return}if(fs_1.default.existsSync(a))console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u5B8C\u6210`);else{console.error("\u4EFB\u52A1\u672A\u6309\u9884\u671F\u5904\u7406"),await failTask(t,r,"\u672A\u751F\u6210\u7ED3\u679C\u6587\u4EF6");return}await finishTask(t,r)}async function runTaskHandlerLoop(t){for(;;)await handleTask(t).catch(e=>console.error(e)),await utils_ok_1.baseUtil.sleep(1e4)}async function saveTask(t,e){const{conversationId:i,prompt:s,senderStaffId:r,senderNickName:a,sessionWebhook:n,type:l="normal"}=e,o=Date.now(),u=utils_ok_1.dateUtil.mm(o).format("YYYY-MM-DD-HH-mm-ss"),p=`${(0,session_1.getTasksDir)(t,i)}/${u}`,c=`${p}/task.json`,g={conversationId:i,startTime:o,startTimeStr:u,prompt:s,senderStaffId:r,senderNickName:a||"",sessionWebhook:n,type:l};await utils_ok_1.fileUtil.saveFileStr(JSON.stringify(g,null,2),c),(0,session_1.debugLog)(t,`\u4EFB\u52A1\u5DF2\u4FDD\u5B58: ${c}`),preprocessTask(t,i,s).then(f=>{if(f)try{const d=`${p}/task-doing.json`,j=fs_1.default.existsSync(d)?d:fs_1.default.existsSync(c)?c:null;if(!j){console.log(`[${(0,session_1.timestamp)()}] \u9884\u5904\u7406\u5B8C\u6210\u4F46\u4EFB\u52A1\u6587\u4EF6\u5DF2\u4E0D\u5B58\u5728: ${p}`);return}const m=utils_ok_1.fileUtil.getJSON(j);m.title=f.title,m.promptSimply=f.promptSimply,fs_1.default.writeFileSync(j,JSON.stringify(m,null,2),"utf-8"),console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u7ED3\u679C\u5DF2\u66F4\u65B0: ${f.title}`)}catch(d){console.error(`[${(0,session_1.timestamp)()}] \u66F4\u65B0\u4EFB\u52A1\u9884\u5904\u7406\u7ED3\u679C\u5931\u8D25:`,d)}}).catch(f=>{console.error(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u5F02\u5E38:`,f)})}
14
+ `)}function truncatePrompt(t,e=80){const i=t.replace(/\n/g," ").trim();return i.length>e?i.slice(0,e)+"...":i}function taskDisplayName(t){return t.title?t.title:truncatePrompt(t.prompt)}async function preprocessTask(t,e,i){const s=(0,session_1.getConversationDir)(t,e),r="claude",a=["--permission-mode","bypassPermissions","--print"],o=(0,claude_process_1.resolveClaudeSettingsPath)(t,s);o&&a.push("--settings",o);const l=["\u8BF7\u5BF9\u4EE5\u4E0B\u4EFB\u52A1\u9700\u6C42\u8FDB\u884C\u9884\u5904\u7406\uFF0C\u751F\u6210\u7B80\u77ED\u6807\u9898\u548C\u4F18\u5316\u540E\u7684\u9700\u6C42\u63CF\u8FF0\u3002","\u76F4\u63A5\u8FD4\u56DEJSON\uFF0C\u4E0D\u8981markdown\u4EE3\u7801\u5757\u6216\u5176\u4ED6\u5185\u5BB9\u3002",'\u683C\u5F0F: {"title":"\u7B80\u77ED\u6807\u9898(15\u5B57\u4EE5\u5185)","promptSimply":"\u4F18\u5316\u540E\u7684\u9700\u6C42\u63CF\u8FF0\uFF0C\u4FDD\u7559\u539F\u59CB\u9700\u6C42\u7684\u6240\u6709\u5173\u952E\u4FE1\u606F\uFF0C\u4F7F\u63CF\u8FF0\u66F4\u6E05\u6670\u3001\u7ED3\u6784\u5316"}',"",`\u539F\u59CB\u9700\u6C42: ${i}`].join(`
15
+ `);a.push(l);const n=3e4;return new Promise(u=>{let m="";const c=(0,child_process_1.spawn)(r,a,{cwd:s,stdio:["ignore","pipe","pipe"]}),g=setTimeout(()=>{c.kill("SIGTERM"),setTimeout(()=>{try{c.kill("SIGKILL")}catch{}},3e3)},n);c.stdout.on("data",d=>{m+=d.toString()}),c.stderr.on("data",()=>{}),c.on("close",d=>{if(clearTimeout(g),d!==0||!m.trim()){console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u5931\u8D25(\u9000\u51FA\u7801:${d})\uFF0C\u4F7F\u7528\u539F\u59CBprompt`),u(null);return}try{let f=m.trim();const I=f.match(/\{[\s\S]*\}/);I&&(f=I[0]);const p=JSON.parse(f);p.title&&p.promptSimply?(console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u5B8C\u6210: title="${p.title}"`),u({title:String(p.title),promptSimply:String(p.promptSimply)})):(console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u8FD4\u56DE\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u4F7F\u7528\u539F\u59CBprompt`),u(null))}catch(f){console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406JSON\u89E3\u6790\u5931\u8D25\uFF0C\u4F7F\u7528\u539F\u59CBprompt: ${f}`),u(null)}}),c.on("error",d=>{clearTimeout(g),console.error(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u8FDB\u7A0B\u9519\u8BEF:`,d),u(null)})})}function countTodoTask(t){let e=0;for(const i of t.config.conversations){const s=(0,session_1.getTasksDir)(t,i.conversationId);if(fs_1.default.existsSync(s)){const a=utils_ok_1.fileUtil.dirWalker(s).filter(o=>path_1.default.basename(o)==="task.json");e+=a.length}}return e}async function getOneTodoTask(t){for(const e of t.config.conversations){const i=(0,session_1.getTasksDir)(t,e.conversationId);if(!fs_1.default.existsSync(i))continue;const r=utils_ok_1.fileUtil.dirWalker(i).filter(o=>path_1.default.basename(o)==="task.json");if(r.length===0)continue;const a=r.map(o=>{try{const l=utils_ok_1.fileUtil.getJSON(o);return l?{file:o,task:l}:null}catch{return console.error(`\u4EFB\u52A1\u6587\u4EF6\u89E3\u6790\u5931\u8D25\uFF0C\u8DF3\u8FC7: ${o}`),null}}).filter(o=>o!==null).sort((o,l)=>o.task.startTime-l.task.startTime);if(a.length>0){const{file:o,task:l}=a[0];return common_1.utils.addSuffixToFile(o,"-doing"),l}}}async function finishTask(t,e){const i=`${e}/task-doing.json`;let s;try{s=utils_ok_1.fileUtil.getJSON(i)}catch(l){console.error(`\u8BFB\u53D6\u4EFB\u52A1\u6587\u4EF6\u5931\u8D25: ${i}`,l);return}const r=`${e}/result.md`,a=fs_1.default.existsSync(r)?utils_ok_1.fileUtil.getFileStr(r):"\u62B1\u6B49,\u4EFB\u52A1\u5904\u7406\u5F02\u5E38...";await(0,messaging_1.sendDingMessage)(t,{conversationId:s.conversationId,sessionWebhook:s.sessionWebhook,atUserId:s.senderStaffId,content:a,msgType:"markdown"});const o=i.replace("-doing.json","-done.json");utils_ok_1.fileUtil.rename(i,o)}async function failTask(t,e,i){const s=`${e}/task-doing.json`;let r;try{r=utils_ok_1.fileUtil.getJSON(s)}catch(o){console.error(`\u8BFB\u53D6\u4EFB\u52A1\u6587\u4EF6\u5931\u8D25: ${s}`,o);return}await(0,messaging_1.sendDingMessage)(t,{conversationId:r.conversationId,sessionWebhook:r.sessionWebhook,atUserId:r.senderStaffId,content:`\u274C \u4EFB\u52A1\u5931\u8D25: ${taskDisplayName(r)}
16
+ \u539F\u56E0: ${i}`,msgType:"markdown"});const a=s.replace("-doing.json","-failed.json");utils_ok_1.fileUtil.rename(s,a)}async function resetTaskToTodo(t,e,i){const s=`${e}/task-doing.json`,r=`${e}/task.json`;if(!fs_1.default.existsSync(s))return!1;try{const a=utils_ok_1.fileUtil.getJSON(s),o=(a.retryCount||0)+1;if(o>=MAX_RETRY_COUNT)return console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u91CD\u8BD5\u6B21\u6570\u5DF2\u8FBE\u4E0A\u9650(${o}/${MAX_RETRY_COUNT})\uFF0C\u6807\u8BB0\u4E3A\u5931\u8D25: ${a.title||a.prompt}`),a.retryCount=o,fs_1.default.writeFileSync(s,JSON.stringify(a,null,2),"utf-8"),await failTask(t,e,`${i} (\u5DF2\u91CD\u8BD5${o}\u6B21)`),!1;a.retryCount=o,fs_1.default.writeFileSync(s,JSON.stringify(a,null,2),"utf-8"),console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u91CD\u7F6E\u4E3A\u5F85\u529E (\u91CD\u8BD5${o}/${MAX_RETRY_COUNT}): ${a.title||a.prompt}`)}catch(a){console.error(`[${(0,session_1.timestamp)()}] \u66F4\u65B0\u4EFB\u52A1\u91CD\u8BD5\u8BA1\u6570\u5931\u8D25:`,a)}return fs_1.default.existsSync(s)&&utils_ok_1.fileUtil.rename(s,r),!0}function cancelTask(t,e,i){const s=[],r=e.trim(),a=i?t.config.conversations.filter(u=>u.conversationId===i):t.config.conversations;for(const u of a){const m=(0,session_1.getTasksDir)(t,u.conversationId);if(!fs_1.default.existsSync(m))continue;const g=utils_ok_1.fileUtil.dirWalker(m).filter(d=>path_1.default.basename(d)==="task.json");for(const d of g)try{const f=utils_ok_1.fileUtil.getJSON(d);if(!f)continue;if(String(f.startTime)===r){s.push({file:d,task:f});continue}if(f.title&&f.title.includes(r)){s.push({file:d,task:f});continue}}catch{}}if(s.length===0)return`\u672A\u627E\u5230\u5339\u914D\u7684\u5F85\u529E\u4EFB\u52A1: ${r}`;let o=0;for(const{file:u,task:m}of s)try{fs_1.default.unlinkSync(u),o++,console.log(`[${(0,session_1.timestamp)()}] \u5DF2\u53D6\u6D88\u4EFB\u52A1: #${m.startTime} ${m.title||m.prompt}`)}catch(c){console.error(`[${(0,session_1.timestamp)()}] \u53D6\u6D88\u4EFB\u52A1\u5931\u8D25: ${u}`,c)}const l=s.slice(0,5).map(u=>`#${u.task.startTime} ${taskDisplayName(u.task)}`).join(`
17
+ `),n=o>5?`
18
+ ...\u5171\u53D6\u6D88 ${o} \u4E2A\u4EFB\u52A1`:"";return`\u5DF2\u53D6\u6D88 ${o} \u4E2A\u5F85\u529E\u4EFB\u52A1:
19
+ ${l}${n}`}function parseTaskCancelCommand(t){const i=t.trim().match(/^\/task\s+cancel\s+(.+)$/i);return i?i[1].trim():null}function updateCmdArgsSettings(t,e){const i=t.indexOf("--settings");i!==-1&&t.splice(i,2),e&&t.push("--settings",e)}async function handleTask(t){const e=await getOneTodoTask(t);if(!e){(0,session_1.debugLog)(t,"\u672A\u53D1\u73B0\u5F85\u529E\u4EFB\u52A1...");return}const i=(0,session_1.getConversationConfig)(t,e.conversationId),s=(0,session_1.getConversationDir)(t,e.conversationId),r=`${(0,session_1.getTasksDir)(t,e.conversationId)}/${e.startTimeStr}`;if(!fs_1.default.existsSync(r)){console.error(`\u4EFB\u52A1\u76EE\u5F55\u4E0D\u5B58\u5728: ${r}`);return}e.type!=="cron"&&await(0,messaging_1.sendDingMessage)(t,{conversationId:e.conversationId,sessionWebhook:e.sessionWebhook,atUserId:e.senderStaffId,content:`\u{1F504} \u5F00\u59CB\u5904\u7406\u4EFB\u52A1: ${taskDisplayName(e)}`});const a=`${r}/result.md`,o=`${r}/task.log`;console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u4E2D: ${e.title||e.prompt}`);const l=e.senderNickName&&e.senderStaffId?`${e.senderNickName}(${e.senderStaffId}), `:"unknown",n=t.config.apiKeyCfg,u=(0,api_key_manager_1.getForceEnabledSettingsPath)(s);let m=!1,c=null;if(u)console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 FORCE_ENABLE\uFF0C\u5F3A\u5236\u4F7F\u7528 settings-ding.json`);else if(n){if(c=(0,api_key_manager_1.pickValidApiKey)(t),!c){console.log(`[${(0,session_1.timestamp)()}] \u65E0\u53EF\u7528\u914D\u989D\uFF0C\u4EFB\u52A1\u91CD\u7F6E\u4E3A\u5F85\u529E`),await resetTaskToTodo(t,r,"\u65E0\u53EF\u7528\u914D\u989D");return}m=!0,console.log(`[${(0,session_1.timestamp)()}] \u5207\u6362\u5230 API Key \u6A21\u5F0F`)}const g=i?.taskCfg?.skill,d=i?.agent,f=e.promptSimply||e.prompt,p=["--permission-mode","bypassPermissions","--print",`${g?`/${g}`:""} \u7528\u6237: ${l}, \u9700\u6C42: ${f}; \u6700\u540E\u5C06\u56DE\u590D\u5185\u5BB9\u4FDD\u5B58\u81F3: ${a}`.trim()];if(u)p.push("--settings",u);else if(m&&c){const $=(0,api_key_manager_1.ensureSettingsWithApiKey)(s,c);p.push("--settings",$)}else if(!n){const $=path_1.default.join(s,".claude","settings.json");fs_1.default.existsSync($)&&(p.push("--settings",$),console.log(`[${(0,session_1.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${$}`))}d&&p.push("--agent",d),(0,session_1.debugLog)(t,`\u6267\u884C\u547D\u4EE4: claude ${p.join(" ")}`);const _=20,N=1e4,F=1e4,x=300*1e3,U=60*1e3,C="claude",b=$=>{const k=Date.now();return new Promise(S=>{const v=[];let O=!1,M=Date.now();const D=(0,child_process_1.spawn)(C,$,{cwd:s,stdio:["ignore","pipe","pipe"]}),A=setInterval(()=>{if(O){clearInterval(A);return}Date.now()-M>=x&&(console.warn(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1 Watchdog: ${x/1e3}s \u65E0\u65E5\u5FD7\u8F93\u51FA\uFF0C\u901A\u77E5\u7528\u6237`),clearInterval(A),(0,messaging_1.sendDingMessage)(t,{conversationId:e.conversationId,sessionWebhook:e.sessionWebhook,atUserId:e.senderStaffId,content:`\u23F0 \u4EFB\u52A1\u8D85\u8FC7 ${x/1e3}s \u65E0\u54CD\u5E94\uFF0C\u4ECD\u5728\u6267\u884C\u4E2D\uFF0C\u8BF7\u7A0D\u5019`}).catch(j=>console.error("\u53D1\u9001\u4EFB\u52A1 Watchdog \u901A\u77E5\u5931\u8D25:",j)))},U),P=()=>{M=Date.now()};D.stdout.on("data",T=>{const j=T.toString();process.stdout.write(j),v.push(j),P()}),D.stderr.on("data",T=>{const j=T.toString();process.stderr.write(j),v.push(j),P()}),D.on("close",T=>{O=!0,clearInterval(A),S({exitCode:T??1,output:v.join(""),elapsed:Date.now()-k})}),D.on("error",T=>{console.error("\u8FDB\u7A0B\u6267\u884C\u9519\u8BEF:",T),v.push(`\u8FDB\u7A0B\u6267\u884C\u9519\u8BEF: ${T.message}`)})})};let h,w,y=0;for(;;){const $=await b(p);if(h=$.exitCode,w=$.output,h!==0){if((0,api_key_manager_1.isQuotaExhaustedError)(w)&&n){if(m){if(c){const S=(0,api_key_manager_1.rotateApiKey)(t,c.apiKey);if(S){c=S,y=0;const v=(0,api_key_manager_1.ensureSettingsWithApiKey)(s,c);updateCmdArgsSettings(p,v),console.log(`[${(0,session_1.timestamp)()}] API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(S)}`);continue}}}else if(c=(0,api_key_manager_1.pickValidApiKey)(t),c){m=!0,y=0;const S=(0,api_key_manager_1.ensureSettingsWithApiKey)(s,c);updateCmdArgsSettings(p,S),console.log(`[${(0,session_1.timestamp)()}] \u5207\u6362\u5230 API Key \u6A21\u5F0F`);continue}console.log(`[${(0,session_1.timestamp)()}] \u65E0\u53EF\u7528\u914D\u989D\uFF0C\u4EFB\u52A1\u91CD\u7F6E\u4E3A\u5F85\u529E`);const k=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${C} ${p.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,w].join(`
20
+ `);fs_1.default.writeFileSync(o,k),await resetTaskToTodo(t,r,"\u65E0\u53EF\u7528\u914D\u989D(429)");return}if((0,api_key_manager_1.isAuthenticationError)(w)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u6807\u8BB0\u4EFB\u52A1\u5931\u8D25`);const k=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${C} ${p.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,w].join(`
21
+ `);fs_1.default.writeFileSync(o,k),await failTask(t,r,"\u8BA4\u8BC1\u5931\u8D25(401)\uFF0CAPI Key \u65E0\u6548\u6216\u670D\u52A1\u672A\u6388\u6743");return}if((0,claude_process_1.isRetryableApiError)(w)){if($.elapsed<F&&m&&c&&n){if(y++,y>=_){const k=(0,api_key_manager_1.rotateApiKey)(t,c.apiKey);if(k){c=k,y=0;const S=(0,api_key_manager_1.ensureSettingsWithApiKey)(s,c);updateCmdArgsSettings(p,S),console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25 ${_} \u6B21\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(k)}`),await utils_ok_1.asyncUtil.sleep(N);continue}}}else if($.elapsed<F){if(y++,y>=_){console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${_}\u6B21\uFF0C\u91CD\u7F6E\u4EFB\u52A1\u4E3A\u5F85\u529E`);const k=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${C} ${p.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,w].join(`
22
+ `);fs_1.default.writeFileSync(o,k),await resetTaskToTodo(t,r,"TPM\u9650\u6D41\u5FEB\u901F\u5931\u8D25\u6B21\u6570\u8FC7\u591A");return}console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${N/1e3}s \u540E\u91CD\u8BD5 (${y}/${_})`)}else y=0,console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u8FDB\u7A0B\u5DF2\u8FD0\u884C\u4E00\u6BB5\u65F6\u95F4)\uFF0C\u91CD\u7F6E\u5FEB\u901F\u5931\u8D25\u8BA1\u6570\uFF0C${N/1e3}s \u540E\u91CD\u8BD5`);await utils_ok_1.asyncUtil.sleep(N);continue}}break}const W=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${C} ${p.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,w].join(`
23
+ `);if(fs_1.default.writeFileSync(o,W),h!==0){console.error(`\u547D\u4EE4\u6267\u884C\u5931\u8D25, \u9000\u51FA\u7801: ${h}`),await failTask(t,r,`\u6267\u884C\u5931\u8D25(\u9000\u51FA\u7801: ${h})`);return}if(fs_1.default.existsSync(a))console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u5B8C\u6210`);else{console.error("\u4EFB\u52A1\u672A\u6309\u9884\u671F\u5904\u7406"),await failTask(t,r,"\u672A\u751F\u6210\u7ED3\u679C\u6587\u4EF6");return}await finishTask(t,r)}async function runTaskHandlerLoop(t){for(;;)await handleTask(t).catch(e=>console.error(e)),await utils_ok_1.asyncUtil.sleep(1e4)}async function saveTask(t,e){const{conversationId:i,prompt:s,senderStaffId:r,senderNickName:a,sessionWebhook:o,type:l="normal"}=e,n=Date.now(),u=utils_ok_1.dateUtil.mm(n).format("YYYY-MM-DD-HH-mm-ss"),m=`${(0,session_1.getTasksDir)(t,i)}/${u}`,c=`${m}/task.json`,g={conversationId:i,startTime:n,startTimeStr:u,prompt:s,senderStaffId:r,senderNickName:a||"",sessionWebhook:o,type:l};await utils_ok_1.fileUtil.saveFileStr(JSON.stringify(g,null,2),c),(0,session_1.debugLog)(t,`\u4EFB\u52A1\u5DF2\u4FDD\u5B58: ${c}`),preprocessTask(t,i,s).then(d=>{if(d)try{const f=`${m}/task-doing.json`,I=fs_1.default.existsSync(f)?f:fs_1.default.existsSync(c)?c:null;if(!I){console.log(`[${(0,session_1.timestamp)()}] \u9884\u5904\u7406\u5B8C\u6210\u4F46\u4EFB\u52A1\u6587\u4EF6\u5DF2\u4E0D\u5B58\u5728: ${m}`);return}const p=utils_ok_1.fileUtil.getJSON(I);p.title=d.title,p.promptSimply=d.promptSimply,fs_1.default.writeFileSync(I,JSON.stringify(p,null,2),"utf-8"),console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u7ED3\u679C\u5DF2\u66F4\u65B0: ${d.title}`)}catch(f){console.error(`[${(0,session_1.timestamp)()}] \u66F4\u65B0\u4EFB\u52A1\u9884\u5904\u7406\u7ED3\u679C\u5931\u8D25:`,f)}}).catch(d=>{console.error(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u5F02\u5E38:`,d)})}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-ding",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "本地Claude对接钉钉机器人工具套件",
5
5
  "keywords": [
6
6
  "cli",
@@ -13,7 +13,7 @@
13
13
  "dotenv": "^16.6.1",
14
14
  "shelljs": "^0.10.0",
15
15
  "urllib": "^4.9.0",
16
- "utils-ok": "^1.1.2"
16
+ "utils-ok": "^2.0.0"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@types/chai": "^5.2.3",
@@ -42,7 +42,7 @@
42
42
  "scripts": {
43
43
  "lint": "eslint . && tsc && npm run blacklint",
44
44
  "lint:fix": "eslint . --fix",
45
- "blacklint": "utils-ok blacklint -bd 'src bin'",
45
+ "blacklint": "utils-ok blacklint --blacklintDir 'src bin'",
46
46
  "test": "mocha 'test/**/*.test.ts'",
47
47
  "build": "npm run lint && sh build.sh",
48
48
  "prepublishOnly": "npm run build"