cc-ding 0.1.0 → 0.3.0-beta

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,78 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(T,i,s,n){n===void 0&&(n=s);var o=Object.getOwnPropertyDescriptor(i,s);(!o||("get"in o?!i.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return i[s]}}),Object.defineProperty(T,n,o)}):(function(T,i,s,n){n===void 0&&(n=s),T[n]=i[s]})),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(T,i){Object.defineProperty(T,"default",{enumerable:!0,value:i})}):function(T,i){T.default=i}),__importStar=this&&this.__importStar||(function(){var T=function(i){return T=Object.getOwnPropertyNames||function(s){var n=[];for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&(n[n.length]=o);return n},T(i)};return function(i){if(i&&i.__esModule)return i;var s={};if(i!=null)for(var n=T(i),o=0;o<n.length;o++)n[o]!=="default"&&__createBinding(s,i,n[o]);return __setModuleDefault(s,i),s}})(),__importDefault=this&&this.__importDefault||function(T){return T&&T.__esModule?T:{default:T}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DingClaude=void 0;const child_process_1=require("child_process"),utils_ok_1=require("utils-ok"),fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),common_1=require("../common"),quote_1=require("./quote"),messaging_1=require("./messaging"),image_1=require("./image"),commands_1=require("./commands"),messaging_2=require("./messaging"),claude_process_1=require("./claude-process"),recorder_1=require("./recorder"),session_1=require("./session"),task_1=require("./task"),api_key_manager_1=require("./api-key-manager"),cron_1=require("./cron"),TOOL_VERSION=(0,common_1.projUtil)().getPkgVersion();class DingClaude{constructor(i){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=s=>(0,messaging_2.sendDingMessage)(this,s),this.sendClaudeResponseToDing=(s,n,o,e)=>(0,messaging_2.sendClaudeResponseToDing)(this,s,n,o,e),this.parseClaudeStreamLine=claude_process_1.parseClaudeStreamLine,this.interruptClaudeProcess=(s,n)=>(0,claude_process_1.interruptClaudeProcess)(s,n),this.executeClaudeQuery=(s,n,o)=>(0,claude_process_1.executeClaudeQuery)(this,s,n,o),this.getClientDir=()=>(0,session_1.getClientDir)(this),this.getClientConfig=()=>(0,session_1.getClientConfig)(this),this.authCheck=(s,n)=>(0,session_1.authCheck)(this,s,n),this.isOwner=s=>(0,session_1.isOwner)(this,s),this.debugLog=(s,...n)=>(0,session_1.debugLog)(this,s,...n),this.hashConversationId=s=>(0,session_1.hashConversationId)(this,s),this.getConversationConfig=s=>(0,session_1.getConversationConfig)(this,s),this.getConversationDir=s=>(0,session_1.getConversationDir)(this,s),this.getSessionsDir=s=>(0,session_1.getSessionsDir)(this,s),this.getTasksDir=s=>(0,session_1.getTasksDir)(this,s),this.getSessionDir=s=>(0,session_1.getSessionDir)(this,s),this.getSessionId=session_1.getSessionId,this.formatSessionInfo=s=>(0,session_1.formatSessionInfo)(this,s),this.readSessionLogTail=(s,n)=>(0,session_1.readSessionLogTail)(this,s,n),this.findActiveSession=s=>(0,session_1.findActiveSession)(this,s),this.findHistorySession=(s,n)=>(0,session_1.findHistorySession)(this,s,n),this.findLatestSession=s=>(0,session_1.findLatestSession)(this,s),this.updateSessionFile=(s,n)=>(0,session_1.updateSessionFile)(this,s,n),this.appendSessionLog=session_1.appendSessionLog,this.getActiveSessionsFile=s=>(0,session_1.getActiveSessionsFile)(this,s),this.saveActiveSession=s=>(0,session_1.saveActiveSession)(this,s),this.loadActiveSessions=()=>(0,session_1.loadActiveSessions)(this),this.endSession=(s,n)=>(0,session_1.endSession)(this,s,n),this.switchToSession=(s,n,o,e,c)=>(0,session_1.switchToSession)(this,s,n,o,e,c),this.startNewSession=s=>(0,session_1.startNewSession)(this,s),this.handleSessionMessage=s=>(0,session_1.handleSessionMessage)(this,s),this.cleanCache=(s,n=!0)=>(0,session_1.cleanCache)(this,s,n),this.formatTaskInfo=()=>(0,task_1.formatTaskInfo)(this),this.cancelTask=(s,n)=>(0,task_1.cancelTask)(this,s,n),this.countTodoTask=()=>(0,task_1.countTodoTask)(this),this.getOneTodoTask=()=>(0,task_1.getOneTodoTask)(this),this.finishTask=s=>(0,task_1.finishTask)(this,s),this.handleTask=()=>(0,task_1.handleTask)(this),this.runTaskHandlerLoop=()=>(0,task_1.runTaskHandlerLoop)(this),this.saveTask=s=>(0,task_1.saveTask)(this,s),this.clientId=i,this.config=(0,session_1.getClientConfig)(this);try{this.dingStreamClient=new utils_ok_1.DingStreamClient({clientId:i,clientSecret:this.config.clientSecret,keepAlive:!0,debug:this.config.debug??!1})}catch(s){console.error("Error: DingStreamClient init failed.",s),process.exit(1)}this.cronEngine=new cron_1.CronEngine(this)}async requireOwner(i,s,n){return this.isOwner(n)?!0:(await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}async requireOwnerOrSingleChat(i,s,n,o){return this.isOwner(n)||o?.conversationType==="1"?!0:(await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}async handleAuthRequest(i){const{senderStaffId:s,senderNick:n,conversationId:o,conversationType:e,conversationTitle:c,sessionWebhook:a}=i;if(!this.config.ownerConversationId){await this.sendDingMessage({conversationId:o,sessionWebhook:a,content:["\u62B1\u6B49,\u60A8\u6682\u65E0\u4F7F\u7528\u6743\u9650","\u8BF7\u5C06\u4EE5\u4E0B\u4FE1\u606F\u53D1\u9001\u7ED9\u673A\u5668\u4EBA\u7BA1\u7406\u5458,\u7531\u7BA1\u7406\u5458\u901A\u8FC7\u547D\u4EE4\u6CE8\u518C:",`- **\u4F1A\u8BDDID:** \`${o}\``,`- **\u6CE8\u518C\u547D\u4EE4:** \`/cfg --conversationId ${o}\``].join(`
2
- `),msgType:"markdown"});return}for(const k of this.pendingAuthRequests.values())if(k.senderStaffId===s&&k.conversationId===o){await this.sendDingMessage({conversationId:o,sessionWebhook:a,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:s,senderNick:n,conversationId:o,conversationType:e,conversationTitle:c,requestTime:Date.now()};this.pendingAuthRequests.set(g,l),console.log(`[${(0,session_1.timestamp)()}] \u65B0\u6388\u6743\u7533\u8BF7: id=${g}, userId=${s}, \u6635\u79F0=${n}, \u4F1A\u8BDD=${o}`);const v=["\u{1F4CB} **\u6536\u5230\u6388\u6743\u7533\u8BF7**",`- **\u7528\u6237ID:** ${s}`,`- **\u6635\u79F0:** ${n}`,`- **\u4F1A\u8BDDID:** ${o}`,c?`- **\u4F1A\u8BDD\u6807\u9898:** ${c}`:"",`- **\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:o,sessionWebhook:a,content:"\u2705 \u5DF2\u5411\u7BA1\u7406\u5458\u53D1\u9001\u6388\u6743\u7533\u8BF7\uFF0C\u8BF7\u7B49\u5F85\u5BA1\u6279...",msgType:"markdown"}):(this.pendingAuthRequests.delete(g),await this.sendDingMessage({conversationId:o,sessionWebhook:a,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(i,s){const{conversationId:n,sessionWebhook:o,senderStaffId:e,senderNick:c,conversationConfig:a}=s;switch(i.type){case"list":{const g=await this.getOrCreateLogSession(n,o,e,c,a,!0),l=this.cronEngine.listJobs(n);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:n,sessionWebhook:o,content:(0,cron_1.formatCronJobList)(l),msgType:"markdown"});return}case"delete":{const g=this.cronEngine.removeJob(i.id),l=await this.getOrCreateLogSession(n,o,e,c,a);l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron delete ${i.id}`),this.appendSessionLog(l.sessionDir,"assistant",g?`\u5220\u9664\u5B9A\u65F6\u4EFB\u52A1 ${i.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${i.id}`)),await this.sendDingMessage({conversationId:n,sessionWebhook:o,content:g?`\u2705 \u5B9A\u65F6\u4EFB\u52A1 **${i.id}** \u5DF2\u5220\u9664`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${i.id}`,msgType:"markdown"});return}case"pause":{const g=this.cronEngine.toggleJob(i.id,!1),l=await this.getOrCreateLogSession(n,o,e,c,a);l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron pause ${i.id}`),this.appendSessionLog(l.sessionDir,"assistant",g?`\u6682\u505C\u5B9A\u65F6\u4EFB\u52A1 ${i.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${i.id}`)),await this.sendDingMessage({conversationId:n,sessionWebhook:o,content:g?`\u23F8\uFE0F \u5B9A\u65F6\u4EFB\u52A1 **${i.id}** \u5DF2\u6682\u505C`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${i.id}`,msgType:"markdown"});return}case"resume":{const g=this.cronEngine.toggleJob(i.id,!0),l=await this.getOrCreateLogSession(n,o,e,c,a);l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron resume ${i.id}`),this.appendSessionLog(l.sessionDir,"assistant",g?`\u6062\u590D\u5B9A\u65F6\u4EFB\u52A1 ${i.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${i.id}`)),await this.sendDingMessage({conversationId:n,sessionWebhook:o,content:g?`\u25B6\uFE0F \u5B9A\u65F6\u4EFB\u52A1 **${i.id}** \u5DF2\u6062\u590D`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${i.id}`,msgType:"markdown"});return}case"create_cron":{if(!(0,cron_1.isValidCronExpression)(i.cronExpression)){await this.sendDingMessage({conversationId:n,sessionWebhook:o,content:`\u274C \u65E0\u6548\u7684cron\u8868\u8FBE\u5F0F: \`${i.cronExpression}\`
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?(function(y,a,t,i){i===void 0&&(i=t);var r=Object.getOwnPropertyDescriptor(a,t);(!r||("get"in r?!a.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return a[t]}}),Object.defineProperty(y,i,r)}):(function(y,a,t,i){i===void 0&&(i=t),y[i]=a[t]})),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?(function(y,a){Object.defineProperty(y,"default",{enumerable:!0,value:a})}):function(y,a){y.default=a}),__importStar=this&&this.__importStar||(function(){var y=function(a){return y=Object.getOwnPropertyNames||function(t){var i=[];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[i.length]=r);return i},y(a)};return function(a){if(a&&a.__esModule)return a;var t={};if(a!=null)for(var i=y(a),r=0;r<i.length;r++)i[r]!=="default"&&__createBinding(t,a,i[r]);return __setModuleDefault(t,a),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"),api_key_manager_1=require("./api-key-manager"),cron_1=require("./cron"),TOOL_VERSION=(0,common_1.projUtil)().getPkgVersion();class DingClaude{constructor(a){this.resolvedPhones={},this.activeSessions=new Map,this.pendingAuthRequests=new Map,this.recorderModeConversations=new Set,this.DEFAULT_SESSION_MAX_CONCURRENCY=5,this.DEFAULT_TASK_HANDLER_COUNT=1,this.DEFAULT_TASK_QUEUE_SIZE=50,this.sendDingMessage=t=>(0,messaging_2.sendDingMessage)(this,t),this.sendClaudeResponseToDing=(t,i,r,s)=>(0,messaging_2.sendClaudeResponseToDing)(this,t,i,r,s),this.parseClaudeStreamLine=claude_process_1.parseClaudeStreamLine,this.interruptClaudeProcess=(t,i)=>(0,claude_process_1.interruptClaudeProcess)(t,i),this.executeClaudeQuery=(t,i,r)=>(0,claude_process_1.executeClaudeQuery)(this,t,i,r),this.getClientDir=()=>(0,session_1.getClientDir)(this),this.getClientConfig=()=>(0,session_1.getClientConfig)(this),this.authCheck=(t,i)=>(0,session_1.authCheck)(this,t,i),this.isOwner=t=>(0,session_1.isOwner)(this,t),this.debugLog=(t,...i)=>(0,session_1.debugLog)(this,t,...i),this.hashConversationId=t=>(0,session_1.hashConversationId)(this,t),this.getConversationConfig=t=>(0,session_1.getConversationConfig)(this,t),this.getConversationDir=t=>(0,session_1.getConversationDir)(this,t),this.getSessionsDir=t=>(0,session_1.getSessionsDir)(this,t),this.getTasksDir=t=>(0,session_1.getTasksDir)(this,t),this.getSessionDir=t=>(0,session_1.getSessionDir)(this,t),this.getSessionId=session_1.getSessionId,this.formatSessionInfo=t=>(0,session_1.formatSessionInfo)(this,t),this.readSessionLogTail=(t,i)=>(0,session_1.readSessionLogTail)(this,t,i),this.findActiveSession=t=>(0,session_1.findActiveSession)(this,t),this.findHistorySession=(t,i)=>(0,session_1.findHistorySession)(this,t,i),this.findLatestSession=t=>(0,session_1.findLatestSession)(this,t),this.updateSessionFile=(t,i)=>(0,session_1.updateSessionFile)(this,t,i),this.appendSessionLog=session_1.appendSessionLog,this.getActiveSessionsFile=t=>(0,session_1.getActiveSessionsFile)(this,t),this.saveActiveSession=t=>(0,session_1.saveActiveSession)(this,t),this.loadActiveSessions=()=>(0,session_1.loadActiveSessions)(this),this.endSession=(t,i)=>(0,session_1.endSession)(this,t,i),this.switchToSession=(t,i,r,s,f)=>(0,session_1.switchToSession)(this,t,i,r,s,f),this.startNewSession=t=>(0,session_1.startNewSession)(this,t),this.handleSessionMessage=t=>(0,session_1.handleSessionMessage)(this,t),this.cleanCache=(t,i=!0)=>(0,session_1.cleanCache)(this,t,i),this.formatTaskInfo=()=>(0,task_1.formatTaskInfo)(this),this.cancelTask=(t,i)=>(0,task_1.cancelTask)(this,t,i),this.countTodoTask=()=>(0,task_1.countTodoTask)(this),this.getOneTodoTask=()=>(0,task_1.getOneTodoTask)(this),this.finishTask=t=>(0,task_1.finishTask)(this,t),this.handleTask=()=>(0,task_1.handleTask)(this),this.runTaskHandlerLoop=()=>(0,task_1.runTaskHandlerLoop)(this),this.saveTask=t=>(0,task_1.saveTask)(this,t),this.clientId=a,this.config=(0,session_1.getClientConfig)(this);try{this.dingStreamClient=new utils_ok_1.DingStreamClient({clientId:a,clientSecret:this.config.clientSecret,keepAlive:!0,debug:this.config.debug??!1})}catch(t){console.error("Error: DingStreamClient init failed.",t),process.exit(1)}this.cronEngine=new cron_1.CronEngine(this)}async requireOwner(a,t,i){return this.isOwner(i)?!0:(await this.sendDingMessage({conversationId:a,sessionWebhook:t,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}async requireOwnerOrSingleChat(a,t,i,r){return this.isOwner(i)||r?.conversationType==="1"?!0:(await this.sendDingMessage({conversationId:a,sessionWebhook:t,content:"\u274C \u53EA\u6709\u673A\u5668\u4EBA owner \u624D\u80FD\u6267\u884C\u6B64\u64CD\u4F5C",msgType:"markdown"}),!1)}async handleAuthRequest(a){const{senderStaffId:t,senderNick:i,conversationId:r,conversationType:s,conversationTitle:f,sessionWebhook:o}=a;if(!this.config.ownerConversationId){await this.sendDingMessage({conversationId:r,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:** \`${r}\``,`- **\u6CE8\u518C\u547D\u4EE4:** \`/cfg --conversationId ${r}\``].join(`
2
+ `),msgType:"markdown"});return}for(const I of this.pendingAuthRequests.values())if(I.senderStaffId===t&&I.conversationId===r){await this.sendDingMessage({conversationId:r,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)}`,h={id:g,senderStaffId:t,senderNick:i,conversationId:r,conversationType:s,conversationTitle:f,requestTime:Date.now()};this.pendingAuthRequests.set(g,h),console.log(`[${(0,session_1.timestamp)()}] \u65B0\u6388\u6743\u7533\u8BF7: id=${g}, userId=${t}, \u6635\u79F0=${i}, \u4F1A\u8BDD=${r}`);const D=["\u{1F4CB} **\u6536\u5230\u6388\u6743\u7533\u8BF7**",`- **\u7528\u6237ID:** ${t}`,`- **\u6635\u79F0:** ${i}`,`- **\u4F1A\u8BDDID:** ${r}`,f?`- **\u4F1A\u8BDD\u6807\u9898:** ${f}`:"",`- **\u4F1A\u8BDD\u7C7B\u578B:** ${s==="1"?"\u5355\u804A":s==="2"?"\u7FA4\u804A":s||"-"}`,"",`\u56DE\u590D \`/auth approve ${g}\` \u901A\u8FC7`,`\u56DE\u590D \`/auth reject ${g}\` \u62D2\u7EDD`].filter(Boolean).join(`
3
+ `);await(0,messaging_1.sendOwnerMessage)(this,D,"markdown")?await this.sendDingMessage({conversationId:r,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:r,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(a,t){const{conversationId:i,sessionWebhook:r,senderStaffId:s,senderNick:f,conversationConfig:o}=t;switch(a.type){case"list":{const g=await this.getOrCreateLogSession(i,r,s,f,o,!0),h=this.cronEngine.listJobs(i);g.sessionDir&&(this.appendSessionLog(g.sessionDir,"user","/cron list"),this.appendSessionLog(g.sessionDir,"assistant",`\u5217\u51FA ${h.length} \u4E2A\u5B9A\u65F6\u4EFB\u52A1`)),await this.sendDingMessage({conversationId:i,sessionWebhook:r,content:(0,cron_1.formatCronJobList)(h),msgType:"markdown"});return}case"delete":{const g=this.cronEngine.removeJob(a.id),h=await this.getOrCreateLogSession(i,r,s,f,o);h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron delete ${a.id}`),this.appendSessionLog(h.sessionDir,"assistant",g?`\u5220\u9664\u5B9A\u65F6\u4EFB\u52A1 ${a.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:r,content:g?`\u2705 \u5B9A\u65F6\u4EFB\u52A1 **${a.id}** \u5DF2\u5220\u9664`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`,msgType:"markdown"});return}case"pause":{const g=this.cronEngine.toggleJob(a.id,!1),h=await this.getOrCreateLogSession(i,r,s,f,o);h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron pause ${a.id}`),this.appendSessionLog(h.sessionDir,"assistant",g?`\u6682\u505C\u5B9A\u65F6\u4EFB\u52A1 ${a.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:r,content:g?`\u23F8\uFE0F \u5B9A\u65F6\u4EFB\u52A1 **${a.id}** \u5DF2\u6682\u505C`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`,msgType:"markdown"});return}case"resume":{const g=this.cronEngine.toggleJob(a.id,!0),h=await this.getOrCreateLogSession(i,r,s,f,o);h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron resume ${a.id}`),this.appendSessionLog(h.sessionDir,"assistant",g?`\u6062\u590D\u5B9A\u65F6\u4EFB\u52A1 ${a.id}`:`\u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:r,content:g?`\u25B6\uFE0F \u5B9A\u65F6\u4EFB\u52A1 **${a.id}** \u5DF2\u6062\u590D`:`\u274C \u672A\u627E\u5230\u5B9A\u65F6\u4EFB\u52A1: ${a.id}`,msgType:"markdown"});return}case"create_cron":{if(!(0,cron_1.isValidCronExpression)(a.cronExpression)){await this.sendDingMessage({conversationId:i,sessionWebhook:r,content:`\u274C \u65E0\u6548\u7684cron\u8868\u8FBE\u5F0F: \`${a.cronExpression}\`
4
4
 
5
- \u{1F4A1} \u683C\u5F0F: \`\u5206 \u65F6 \u65E5 \u6708 \u5468\`\uFF0C\u5982 \`0 9 * * *\``,msgType:"markdown"});return}if(!this.hasNotifyCapability(s.conversationConfig)){await this.sendCronNoNotifyError(n,o);return}const g=this.cronEngine.addJob({conversationId:n,cronExpression:i.cronExpression,description:this.sanitizeLogContent(i.prompt.substring(0,50)),prompt:i.prompt,senderStaffId:e,senderNick:c}),l=await this.getOrCreateLogSession(n,o,e,c,a);l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron ${i.cronExpression} ${this.sanitizeLogContent(i.prompt)}`),this.appendSessionLog(l.sessionDir,"assistant",`\u521B\u5EFA\u5B9A\u65F6\u4EFB\u52A1: ${g.id} [${g.cronExpression}] ${g.description}`)),await this.sendDingMessage({conversationId:n,sessionWebhook:o,content:(0,cron_1.formatCronJobInfo)(g),msgType:"markdown"});return}case"create_nl":{if(!this.hasNotifyCapability(s.conversationConfig)){await this.sendCronNoNotifyError(n,o);return}await this.sendDingMessage({conversationId:n,sessionWebhook:o,content:"\u23F3 \u6B63\u5728\u5206\u6790\u5B9A\u65F6\u4EFB\u52A1\u63CF\u8FF0..."});const g=await this.cronEngine.analyzeAndCreate(n,i.input,e,c),l=await this.getOrCreateLogSession(n,o,e,c,a);g.job?(l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron ${this.sanitizeLogContent(i.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:n,sessionWebhook:o,content:(0,cron_1.formatCronJobInfo)(g.job),msgType:"markdown"})):(l.sessionDir&&(this.appendSessionLog(l.sessionDir,"user",`/cron ${this.sanitizeLogContent(i.input)}`),this.appendSessionLog(l.sessionDir,"assistant",`\u5B9A\u65F6\u4EFB\u52A1\u5206\u6790\u5931\u8D25: ${g.error}`)),await this.sendDingMessage({conversationId:n,sessionWebhook:o,content:`\u274C \u5B9A\u65F6\u4EFB\u52A1\u5206\u6790\u5931\u8D25: ${g.error}
5
+ \u{1F4A1} \u683C\u5F0F: \`\u5206 \u65F6 \u65E5 \u6708 \u5468\`\uFF0C\u5982 \`0 9 * * *\``,msgType:"markdown"});return}if(!this.hasNotifyCapability(t.conversationConfig)){await this.sendCronNoNotifyError(i,r);return}const g=this.cronEngine.addJob({conversationId:i,cronExpression:a.cronExpression,description:this.sanitizeLogContent(a.prompt.substring(0,50)),prompt:a.prompt,senderStaffId:s,senderNick:f}),h=await this.getOrCreateLogSession(i,r,s,f,o);h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron ${a.cronExpression} ${this.sanitizeLogContent(a.prompt)}`),this.appendSessionLog(h.sessionDir,"assistant",`\u521B\u5EFA\u5B9A\u65F6\u4EFB\u52A1: ${g.id} [${g.cronExpression}] ${g.description}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:r,content:(0,cron_1.formatCronJobInfo)(g),msgType:"markdown"});return}case"create_nl":{if(!this.hasNotifyCapability(t.conversationConfig)){await this.sendCronNoNotifyError(i,r);return}await this.sendDingMessage({conversationId:i,sessionWebhook:r,content:"\u23F3 \u6B63\u5728\u5206\u6790\u5B9A\u65F6\u4EFB\u52A1\u63CF\u8FF0..."});const g=await this.cronEngine.analyzeAndCreate(i,a.input,s,f),h=await this.getOrCreateLogSession(i,r,s,f,o);g.job?(h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron ${this.sanitizeLogContent(a.input)}`),this.appendSessionLog(h.sessionDir,"assistant",`\u521B\u5EFA\u5B9A\u65F6\u4EFB\u52A1: ${g.job.id} [${g.job.cronExpression}] ${g.job.description}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:r,content:(0,cron_1.formatCronJobInfo)(g.job),msgType:"markdown"})):(h.sessionDir&&(this.appendSessionLog(h.sessionDir,"user",`/cron ${this.sanitizeLogContent(a.input)}`),this.appendSessionLog(h.sessionDir,"assistant",`\u5B9A\u65F6\u4EFB\u52A1\u5206\u6790\u5931\u8D25: ${g.error}`)),await this.sendDingMessage({conversationId:i,sessionWebhook:r,content:`\u274C \u5B9A\u65F6\u4EFB\u52A1\u5206\u6790\u5931\u8D25: ${g.error}
6
6
 
7
- \u{1F4A1} \u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u6307\u5B9Acron\u8868\u8FBE\u5F0F: \`/cron 0 9 * * * \u4EFB\u52A1\u63CF\u8FF0\``,msgType:"markdown"}));return}}}sanitizeLogContent(i){return i.replace(/\n/g,"\\n").replace(/\r/g,"\\r")}sanitizeOutput(i){const s=i.replace(/\r\n/g,`
8
- `),n=8e3;return s.length>n?s.substring(0,n)+`
9
- ...(\u8F93\u51FA\u5DF2\u622A\u65AD)`:s}truncateMsg(i,s=100){const n=i.replace(/\n/g," ").trim();return n.length>s?n.slice(0,s)+"...":n}async getOrCreateLogSession(i,s,n,o,e,c=!1){const a=this.findActiveSession(i);if(a)return{sessionDir:this.getSessionDir(a.session.session),isNew:!1};if(c)return{sessionDir:null,isNew:!1};const g=Date.now(),l={conversationId:i,sessionWebhook:s,startTime:g,startTimeStr:utils_ok_1.dateUtil.mm(g).format("YYYY-MM-DD-HH-mm-ss"),startStaffId:n,startNickName:`[cron]${o}`},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
10
- `,"utf-8"),{sessionDir:v,isNew:!0}}hasNotifyCapability(i){return!!(i.dingToken||this.config.defaultDingToken)}async sendCronNoNotifyError(i,s){await this.sendDingMessage({conversationId:i,sessionWebhook:s,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"})}resolveAndValidatePath(i,s){const n=this.getConversationDir(i);if(s.startsWith("/"))return{absolutePath:"",error:"\u274C \u8DEF\u5F84\u4E0D\u80FD\u4F7F\u7528\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u4E0D\u80FD\u4EE5 / \u5F00\u5934\uFF09"};const o=path_1.default.resolve(n,s);return o.startsWith(n)?{absolutePath:o}:{absolutePath:"",error:"\u274C \u8DEF\u5F84\u8D85\u51FA\u5DE5\u4F5C\u76EE\u5F55\u8303\u56F4"}}async handleMkdirCommand(i,s,n){const{absolutePath:o,error:e}=this.resolveAndValidatePath(i,n);if(e){await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:e,msgType:"markdown"});return}try{fs_1.default.statSync(o).isDirectory()?await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:`\u26A0\uFE0F \u76EE\u5F55\u5DF2\u5B58\u5728: \`${n}\``,msgType:"markdown"}):await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:`\u274C \u8DEF\u5F84\u5DF2\u5B58\u5728\u4F46\u4E0D\u662F\u76EE\u5F55: \`${n}\``,msgType:"markdown"});return}catch{}try{fs_1.default.mkdirSync(o,{recursive:!0}),await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:`\u2705 \u76EE\u5F55\u521B\u5EFA\u6210\u529F: \`${n}\``,msgType:"markdown"})}catch(c){await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:`\u274C \u76EE\u5F55\u521B\u5EFA\u5931\u8D25: \`${n}\`
11
- \u539F\u56E0: ${c instanceof Error?c.message:String(c)}`,msgType:"markdown"})}}async handleRmCommand(i,s,n){const{absolutePath:o,error:e}=this.resolveAndValidatePath(i,n);if(e){await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:e,msgType:"markdown"});return}let c;try{c=fs_1.default.statSync(o)}catch{await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:`\u274C \u8DEF\u5F84\u4E0D\u5B58\u5728: \`${n}\``,msgType:"markdown"});return}const a=c.isDirectory();try{a?fs_1.default.rmSync(o,{recursive:!0,force:!0}):fs_1.default.unlinkSync(o),await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:`\u2705 \u5DF2\u5220\u9664${a?"\u76EE\u5F55":"\u6587\u4EF6"}: \`${n}\``,msgType:"markdown"})}catch(g){await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:`\u274C \u5220\u9664\u5931\u8D25: \`${n}\`
12
- \u539F\u56E0: ${g instanceof Error?g.message:String(g)}`,msgType:"markdown"})}}async handleTouchCommand(i,s,n){const{absolutePath:o,error:e}=this.resolveAndValidatePath(i,n);if(e){await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:e,msgType:"markdown"});return}try{const c=fs_1.default.statSync(o);c.isFile()?await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:`\u26A0\uFE0F \u6587\u4EF6\u5DF2\u5B58\u5728: \`${n}\`
13
- \u6700\u540E\u4FEE\u6539\u65F6\u95F4: ${utils_ok_1.dateUtil.mm(c.mtime).format("YYYY-MM-DD HH:mm:ss")}`,msgType:"markdown"}):await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:`\u274C \u8DEF\u5F84\u5DF2\u5B58\u5728\u4F46\u4E0D\u662F\u6587\u4EF6: \`${n}\``,msgType:"markdown"});return}catch{}try{const c=path_1.default.dirname(o);fs_1.default.mkdirSync(c,{recursive:!0}),fs_1.default.writeFileSync(o,"","utf-8"),await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:`\u2705 \u6587\u4EF6\u521B\u5EFA\u6210\u529F: \`${n}\``,msgType:"markdown"})}catch(c){await this.sendDingMessage({conversationId:i,sessionWebhook:s,content:`\u274C \u6587\u4EF6\u521B\u5EFA\u5931\u8D25: \`${n}\`
14
- \u539F\u56E0: ${c instanceof Error?c.message:String(c)}`,msgType:"markdown"})}}async botMsgGetCallback(i){this.dingStreamClient.socketCallBackResponse(i.headers.messageId,"");const s=JSON.parse(i.data),{senderNick:n,senderStaffId:o,conversationId:e,conversationTitle:c,sessionWebhook:a,msgtype:g,conversationType:l}=s,v=s.text?.content?.trim()??"";if(this.debugLog(`\u6536\u5230\u6D88\u606F: \u7FA4=${c}(${e}), \u53D1\u9001\u8005=${n}(${o}), \u7C7B\u578B=${g}, \u5185\u5BB9=${v.substring(0,50)}`),!this.authCheck(o,e)){await this.handleAuthRequest({senderStaffId:o,senderNick:n,conversationId:e,conversationType:l,conversationTitle:s.conversationTitle,sessionWebhook:a});return}const w=this.getConversationConfig(e),k=(0,commands_1.parseRecorderCommand)(v);if(k!==null){if(!this.isOwner(o)||l!=="1"){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:"\u274C Recorder \u6A21\u5F0F\u4EC5\u9650 owner \u5355\u804A\u4F7F\u7528",msgType:"markdown"});return}if(k==="on"){this.recorderModeConversations.add(e);const t=(0,recorder_1.getRecorderDir)(this,e);console.log(`[${(0,session_1.timestamp)()}] [recorder] \u5F00\u542F recorder \u6A21\u5F0F: conversationId=${e}, dir=${t}`),await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u{1F534} Recorder \u6A21\u5F0F\u5DF2\u5F00\u542F
7
+ \u{1F4A1} \u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u6307\u5B9Acron\u8868\u8FBE\u5F0F: \`/cron 0 9 * * * \u4EFB\u52A1\u63CF\u8FF0\``,msgType:"markdown"}));return}}}sanitizeLogContent(a){return a.replace(/\n/g,"\\n").replace(/\r/g,"\\r")}sanitizeOutput(a){const t=a.replace(/\r\n/g,`
8
+ `),i=8e3;return t.length>i?t.substring(0,i)+`
9
+ ...(\u8F93\u51FA\u5DF2\u622A\u65AD)`:t}truncateMsg(a,t=100){const i=a.replace(/\n/g," ").trim();return i.length>t?i.slice(0,t)+"...":i}async getOrCreateLogSession(a,t,i,r,s,f=!1){const o=this.findActiveSession(a);if(o)return{sessionDir:this.getSessionDir(o.session.session),isNew:!1};if(f)return{sessionDir:null,isNew:!1};const g=Date.now(),h={conversationId:a,sessionWebhook:t,startTime:g,startTimeStr:utils_ok_1.dateUtil.mm(g).format("YYYY-MM-DD-HH-mm-ss"),startStaffId:i,startNickName:`[cron]${r}`},D=this.getSessionDir(h);return fs_1.default.mkdirSync(D,{recursive:!0}),fs_1.default.writeFileSync(`${D}/session.json`,JSON.stringify(h,null,2),"utf-8"),fs_1.default.appendFileSync(`${D}/session.log`,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u521B\u5EFA\u4F1A\u8BDD\u7528\u4E8E\u8BB0\u5F55 /cron \u547D\u4EE4\u64CD\u4F5C
10
+ `,"utf-8"),{sessionDir:D,isNew:!0}}hasNotifyCapability(a){return!!(a.dingToken||this.config.defaultDingToken)}async sendCronNoNotifyError(a,t){await this.sendDingMessage({conversationId:a,sessionWebhook:t,content:"\u274C \u5F53\u524D\u7FA4\u672A\u914D\u7F6E dingToken \u4E14\u65E0\u5BA2\u6237\u7AEF\u7EA7 defaultDingToken, \u5B9A\u65F6\u4EFB\u52A1\u65E0\u6CD5\u4E3B\u52A8\u53D1\u9001\u6D88\u606F, \u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u914D\u7F6E",msgType:"markdown"})}async botMsgGetCallback(a){this.dingStreamClient.socketCallBackResponse(a.headers.messageId,"");const t=JSON.parse(a.data),{senderNick:i,senderStaffId:r,conversationId:s,conversationTitle:f,sessionWebhook:o,msgtype:g,conversationType:h}=t,D=t.text?.content?.trim()??"";if(this.debugLog(`\u6536\u5230\u6D88\u606F: \u7FA4=${f}(${s}), \u53D1\u9001\u8005=${i}(${r}), \u7C7B\u578B=${g}, \u5185\u5BB9=${D.substring(0,50)}`),!this.authCheck(r,s)){await this.handleAuthRequest({senderStaffId:r,senderNick:i,conversationId:s,conversationType:h,conversationTitle:t.conversationTitle,sessionWebhook:o});return}const w=this.getConversationConfig(s),I=(0,commands_1.parseRecorderCommand)(D);if(I!==null){if(!this.isOwner(r)||h!=="1"){await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:"\u274C Recorder \u6A21\u5F0F\u4EC5\u9650 owner \u5355\u804A\u4F7F\u7528",msgType:"markdown"});return}if(I==="on"){this.recorderModeConversations.add(s);const e=(0,recorder_1.getRecorderDir)(this,s);console.log(`[${(0,session_1.timestamp)()}] [recorder] \u5F00\u542F recorder \u6A21\u5F0F: conversationId=${s}, dir=${e}`),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u{1F534} Recorder \u6A21\u5F0F\u5DF2\u5F00\u542F
15
11
  - \u6240\u6709\u6D88\u606F\u5C06\u88AB\u5206\u7C7B\u8BB0\u5F55\u5230\u672C\u5730
16
- - \u4FDD\u5B58\u76EE\u5F55: \`${t}\`
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:a,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,s,e),await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u2705 \u5DF2\u8BB0\u5F55 ${g}`})}catch(t){console.error(`[${(0,session_1.timestamp)()}] [recorder] \u8BB0\u5F55\u6D88\u606F\u5931\u8D25:`,t),await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u274C \u8BB0\u5F55\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`})}return}let u;if(g==="picture"&&s.pictureDownloadCode){const t=this.getConversationDir(e),r=w?.useLocalOcr!==!1,d=await(0,image_1.processPictureMessage)(this,s.pictureDownloadCode,s.robotCode,t,r,v||void 0);if(!d){await this.sendDingMessage({conversationId:e,sessionWebhook:a,atUserId:o,content:"\u26A0\uFE0F \u56FE\u7247\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u6216\u4F7F\u7528\u6587\u5B57\u63CF\u8FF0"});return}u=d}else if(g==="richText"&&s.content?.richText){const t=this.getConversationDir(e),r=w?.useLocalOcr!==!1;u=await(0,image_1.processRichTextMessage)(this,s.content.richText,s.robotCode,t,r)}else if(u=v,!u)return;if(!u.startsWith("/")&&g==="text"){const t=(0,quote_1.extractQuoteInfo)(s);if(t){if(this.debugLog(`\u68C0\u6D4B\u5230\u5F15\u7528\u6D88\u606F: quoteMessageId=${t.quoteMessageId}`),t.quoteMessageId&&!t.quoteText){const r=await(0,messaging_1.fetchQuotedMessage)(this,t.quoteMessageId);r&&(t.quoteText=r)}t.quoteText&&(u=(0,quote_1.formatPromptWithQuote)(u,t))}}const h=(0,commands_1.parseCfgCommand)(u);if(h!==null){if(h.conversationId&&w?.conversationType!=="1"&&!this.isOwner(o)){await this.sendDingMessage({conversationId:e,sessionWebhook:a,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,a,o,w))return;const t=h.conversationId||e,r=t!==e,d=r?this.config.conversations.find(C=>C.conversationId===t):w,p=!!(h.dingToken||h.linkConversationId||h.whiteUserList&&h.whiteUserList.length>0||h.conversationTitle||h.atSender!==void 0||h.receiveReply!==void 0||h.preBash!==void 0);if(d&&p){if(h.conversationTitle&&(d.conversationTitle=h.conversationTitle),l&&!r&&(d.conversationType=l),h.dingToken&&(d.dingToken=h.dingToken),h.linkConversationId&&(d.linkConversationId=h.linkConversationId),h.atSender!==void 0&&(d.atSender=h.atSender),h.receiveReply!==void 0&&(d.receiveReply=h.receiveReply),h.preBash!==void 0&&(d.preBash=h.preBash),h.whiteUserList&&h.whiteUserList.length>0){d.whiteUserList=h.whiteUserList;for(const C of h.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||t}(${t})`)}else if(!d){const C={conversationId:t,conversationType:r?"1":l,conversationTitle:h.conversationTitle||(r?"":c)};if(h.dingToken&&(C.dingToken=h.dingToken),h.linkConversationId&&(C.linkConversationId=h.linkConversationId),h.atSender!==void 0&&(C.atSender=h.atSender),h.receiveReply!==void 0&&(C.receiveReply=h.receiveReply),h.preBash!==void 0&&(C.preBash=h.preBash),h.whiteUserList&&h.whiteUserList.length>0){C.whiteUserList=h.whiteUserList;for(const $ of h.whiteUserList)(0,session_1.isMobile)($)&&await(0,session_1.resolveUserId)(this,$)}this.config.conversations.push(C),(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u6CE8\u518C\u65B0\u7FA4: ${C.conversationTitle||t}(${t}) \u7C7B\u578B=${C.conversationType||"-"}`)}const D=this.getConversationDir(t);fs_1.default.existsSync(D)||(fs_1.default.mkdirSync(D,{recursive:!0}),console.log(`[${(0,session_1.timestamp)()}] \u521B\u5EFA\u5DE5\u4F5C\u76EE\u5F55: ${D}`));const m=d||this.getConversationConfig(t),f=[d?"\u2705 \u7FA4\u914D\u7F6E\u5DF2\u5237\u65B0":"\u2705 \u7FA4\u5DF2\u6CE8\u518C",`- **\u7FA4\u540D\u79F0:** ${m?.conversationTitle||t}`,`- **\u7FA4ID:** ${t}`];if(m?.conversationType&&f.push(`- **\u4F1A\u8BDD\u7C7B\u578B:** ${m.conversationType==="1"?"\u5355\u804A":m.conversationType==="2"?"\u7FA4\u804A":m.conversationType}`),m?.dingToken?f.push(`- **dingToken:** ${m.dingToken.substring(0,8)}...`):f.push("- **dingToken:** (\u672A\u6307\u5B9A, \u4F7F\u7528 defaultDingToken)"),m?.linkConversationId&&f.push(`- **linkConversationId:** ${m.linkConversationId}`),m?.atSender===!1&&f.push("- **atSender:** false (\u4E0D @ \u53D1\u9001\u4EBA)"),m?.receiveReply===!1&&f.push("- **receiveReply:** false (\u4E0D\u56DE\u590D\u786E\u8BA4\u6D88\u606F)"),m?.whiteUserList?.length){const C=m.whiteUserList.map($=>(0,session_1.isMobile)($)?$:(0,session_1.userIdToPhone)(this,$)||$).join(", ");f.push(`- **whiteUserList:** ${C}`)}f.push(`- **\u5DE5\u4F5C\u76EE\u5F55:** ${D}`),f.push(`
18
- \u{1F4A1} \u53EF\u7F16\u8F91 config.json \u8865\u5145\u66F4\u591A\u914D\u7F6E`),await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:f.join(`
19
- `),msgType:"markdown"});return}if((0,commands_1.parseHelpCommand)(u)){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:(0,commands_1.formatHelpOverview)(TOOL_VERSION,this.isOwner(o)),msgType:"markdown"});return}if((0,commands_1.parseVersionCommand)(u)){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`**\u7248\u672C:** ${TOOL_VERSION}`,msgType:"markdown"});return}const M=(0,commands_1.parseCommandHelp)(u);if(M){const t=(0,commands_1.getCommandByName)(M);t?await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:(0,commands_1.formatCommandHelp)(t),msgType:"markdown"}):await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u274C \u672A\u627E\u5230\u547D\u4EE4: **${M}**
12
+ - \u4FDD\u5B58\u76EE\u5F55: \`${e}\`
13
+ - \u53D1\u9001 \`/recorder exit\` \u5173\u95ED`,msgType:"markdown"})}else this.recorderModeConversations.delete(s),console.log(`[${(0,session_1.timestamp)()}] [recorder] \u5173\u95ED recorder \u6A21\u5F0F: conversationId=${s}`),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:"\u2B1C Recorder \u6A21\u5F0F\u5DF2\u5173\u95ED\uFF0C\u6062\u590D\u6B63\u5E38\u5904\u7406",msgType:"markdown"});return}if(this.recorderModeConversations.has(s)){try{await(0,recorder_1.recordMessage)(this,t,s),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u2705 \u5DF2\u8BB0\u5F55 ${g}`})}catch(e){console.error(`[${(0,session_1.timestamp)()}] [recorder] \u8BB0\u5F55\u6D88\u606F\u5931\u8D25:`,e),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u274C \u8BB0\u5F55\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`})}return}let l;if(g==="picture"&&t.pictureDownloadCode){const e=this.getConversationDir(s),n=w?.useLocalOcr!==!1,d=await(0,image_1.processPictureMessage)(this,t.pictureDownloadCode,t.robotCode,e,n,D||void 0);if(!d){await this.sendDingMessage({conversationId:s,sessionWebhook:o,atUserId:r,content:"\u26A0\uFE0F \u56FE\u7247\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5\u6216\u4F7F\u7528\u6587\u5B57\u63CF\u8FF0"});return}l=d}else if(g==="richText"&&t.content?.richText){const e=this.getConversationDir(s),n=w?.useLocalOcr!==!1;l=await(0,image_1.processRichTextMessage)(this,t.content.richText,t.robotCode,e,n)}else if(g==="file"){const e=(0,image_1.extractDownloadCode)(t);if(e){const n=this.getConversationDir(s),d=await(0,image_1.processFileMessage)(this,e,t.robotCode,n,D||void 0);if(!d){await this.sendDingMessage({conversationId:s,sessionWebhook:o,atUserId:r,content:"\u26A0\uFE0F \u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5"});return}l=d}else{await this.sendDingMessage({conversationId:s,sessionWebhook:o,atUserId:r,content:"\u26A0\uFE0F \u65E0\u6CD5\u83B7\u53D6\u6587\u4EF6\u4E0B\u8F7D\u94FE\u63A5\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001"});return}}else{if(l=D,!l){const e=(0,quote_1.extractQuoteInfo)(t);if(e){if(this.debugLog(`\u68C0\u6D4B\u5230\u5F15\u7528\u6D88\u606F(\u65E0\u6B63\u6587): quoteMessageId=${e.quoteMessageId}`),e.quoteMessageId&&!e.quoteText){const n=await(0,messaging_1.fetchQuotedMessage)(this,e.quoteMessageId);n&&(e.quoteText=n)}e.quoteText&&(l=(0,quote_1.formatPromptWithQuote)("",e))}}if(!l)return}if(!l.startsWith("/")&&g==="text"&&D){const e=(0,quote_1.extractQuoteInfo)(t);if(e){if(this.debugLog(`\u68C0\u6D4B\u5230\u5F15\u7528\u6D88\u606F: quoteMessageId=${e.quoteMessageId}`),e.quoteMessageId&&!e.quoteText){const n=await(0,messaging_1.fetchQuotedMessage)(this,e.quoteMessageId);n&&(e.quoteText=n)}e.quoteText&&(l=(0,quote_1.formatPromptWithQuote)(l,e))}}const c=(0,commands_1.parseCfgCommand)(l);if(c!==null){if(c.conversationId&&!this.isOwner(r)){await this.sendDingMessage({conversationId:s,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(s,o,r,w))return;const e=c.conversationId||s,n=e!==s,d=n?this.config.conversations.find(C=>C.conversationId===e):w,p=!!(c.dingToken||c.linkConversationId||c.whiteUserList&&c.whiteUserList.length>0||c.conversationTitle||c.atSender!==void 0||c.receiveReply!==void 0||c.preBash!==void 0||c.permissionMode!==void 0);if(d&&p){if(c.conversationTitle&&(d.conversationTitle=c.conversationTitle),h&&!n&&(d.conversationType=h),c.dingToken&&(d.dingToken=c.dingToken),c.linkConversationId&&(d.linkConversationId=c.linkConversationId),c.atSender!==void 0&&(d.atSender=c.atSender),c.receiveReply!==void 0&&(d.receiveReply=c.receiveReply),c.preBash!==void 0&&(d.preBash=c.preBash),c.permissionMode!==void 0&&(d.permissionMode=c.permissionMode),c.whiteUserList&&c.whiteUserList.length>0){d.whiteUserList=c.whiteUserList;for(const C of c.whiteUserList)(0,session_1.isMobile)(C)&&await(0,session_1.resolveUserId)(this,C)}(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u5237\u65B0\u7FA4\u914D\u7F6E: ${d.conversationTitle||e}(${e})`)}else if(!d){const C={conversationId:e,conversationType:n?"1":h,conversationTitle:c.conversationTitle||(n?"":f)};if(c.dingToken&&(C.dingToken=c.dingToken),c.linkConversationId&&(C.linkConversationId=c.linkConversationId),c.atSender!==void 0&&(C.atSender=c.atSender),c.receiveReply!==void 0&&(C.receiveReply=c.receiveReply),c.preBash!==void 0&&(C.preBash=c.preBash),c.permissionMode!==void 0&&(C.permissionMode=c.permissionMode),c.whiteUserList&&c.whiteUserList.length>0){C.whiteUserList=c.whiteUserList;for(const $ of c.whiteUserList)(0,session_1.isMobile)($)&&await(0,session_1.resolveUserId)(this,$)}this.config.conversations.push(C),(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u6CE8\u518C\u65B0\u7FA4: ${C.conversationTitle||e}(${e}) \u7C7B\u578B=${C.conversationType||"-"}`)}const T=this.getConversationDir(e);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(e),u=[d?"\u2705 \u7FA4\u914D\u7F6E\u5DF2\u5237\u65B0":"\u2705 \u7FA4\u5DF2\u6CE8\u518C",`- **\u7FA4\u540D\u79F0:** ${m?.conversationTitle||e}`,`- **\u7FA4ID:** ${e}`];if(m?.conversationType&&u.push(`- **\u4F1A\u8BDD\u7C7B\u578B:** ${m.conversationType==="1"?"\u5355\u804A":m.conversationType==="2"?"\u7FA4\u804A":m.conversationType}`),m?.dingToken?u.push(`- **dingToken:** ${m.dingToken.substring(0,8)}...`):u.push("- **dingToken:** (\u672A\u6307\u5B9A, \u4F7F\u7528 defaultDingToken)"),m?.linkConversationId&&u.push(`- **linkConversationId:** ${m.linkConversationId}`),m?.atSender===!1&&u.push("- **atSender:** false (\u4E0D @ \u53D1\u9001\u4EBA)"),m?.receiveReply===!1&&u.push("- **receiveReply:** false (\u4E0D\u56DE\u590D\u786E\u8BA4\u6D88\u606F)"),m?.permissionMode&&u.push(`- **permissionMode:** ${m.permissionMode}`),m?.whiteUserList?.length){const C=m.whiteUserList.map($=>(0,session_1.isMobile)($)?$:(0,session_1.userIdToPhone)(this,$)||$).join(", ");u.push(`- **whiteUserList:** ${C}`)}u.push(`- **\u5DE5\u4F5C\u76EE\u5F55:** ${T}`),u.push(`
14
+ \u{1F4A1} \u53EF\u7F16\u8F91 config.json \u8865\u5145\u66F4\u591A\u914D\u7F6E`),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:u.join(`
15
+ `),msgType:"markdown"});return}if((0,commands_1.parseHelpCommand)(l)){await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:(0,commands_1.formatHelpOverview)(TOOL_VERSION,this.isOwner(r)),msgType:"markdown"});return}if((0,commands_1.parseVersionCommand)(l)){await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`**\u7248\u672C:** ${TOOL_VERSION}`,msgType:"markdown"});return}const M=(0,commands_1.parseCommandHelp)(l);if(M){const e=(0,commands_1.getCommandByName)(M);e?await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:(0,commands_1.formatCommandHelp)(e),msgType:"markdown"}):await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u274C \u672A\u627E\u5230\u547D\u4EE4: **${M}**
20
16
 
21
- \u{1F4A1} \u8F93\u5165 \`/help\` \u67E5\u770B\u6240\u6709\u53EF\u7528\u547D\u4EE4`,msgType:"markdown"});return}if(!w){console.log(`\u672A\u6CE8\u518C\u7684\u673A\u5668\u4EBA,\u7FA4:${c},${e}`),this.isOwner(o)?await this.sendDingMessage({conversationId:e,sessionWebhook:a,atUserId:o,content:"\u26A0\uFE0F \u8BE5\u7FA4\u672A\u6CE8\u518C\uFF0C\u8BF7\u5148\u4F7F\u7528 `/cfg` \u547D\u4EE4\u6CE8\u518C",msgType:"markdown"}):await this.sendDingMessage({conversationId:e,sessionWebhook:a,atUserId:o,content:`\u62B1\u6B49,\u8BE5\u7FA4\u7684\u673A\u5668\u4EBA\u672A\u5728\u670D\u52A1\u7AEF\u6CE8\u518C,\u8BF7\u8054\u7CFB\u5E94\u7528\u673A\u5668\u4EBAowner\u6CE8\u518C(${e})...`});return}const I=(0,commands_1.parseCleanCommand)(u);if(I!==null){if(I==="all"&&w?.conversationType!=="1"&&!this.isOwner(o)){await this.sendDingMessage({conversationId:e,sessionWebhook:a,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,a,o,w))return;const t=I==="all"?null:e,r=this.cleanCache(t,!0),d=[];d.push("\u{1F9F9} \u7F13\u5B58\u6E05\u7406\u5B8C\u6210"),r.sessionsDeleted>0&&d.push(`- \u4F1A\u8BDD\u76EE\u5F55: ${r.sessionsDeleted} \u4E2A`),r.tasksDeleted>0&&d.push(`- \u4EFB\u52A1\u76EE\u5F55: ${r.tasksDeleted} \u4E2A`),r.imagesDeleted>0&&d.push(`- \u56FE\u7247\u6587\u4EF6: ${r.imagesDeleted} \u4E2A`),r.sessionsDeleted===0&&r.tasksDeleted===0&&r.imagesDeleted===0&&d.push("(\u65E0\u5386\u53F2\u6570\u636E)"),d.push(`
22
- \u{1F4A1} \u6D3B\u8DC3\u4F1A\u8BDD\u5DF2\u4FDD\u7559`),r.errors.length>0&&d.push(`
23
- \u26A0\uFE0F \u9519\u8BEF: ${r.errors.join("; ")}`),await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:d.join(`
24
- `),msgType:"markdown"});return}if((0,commands_1.parseResetApiKeyCfgCommand)(u)){if(!await this.requireOwner(e,a,o))return;if(!this.config.apiKeyCfg){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:"\u26A0\uFE0F \u672A\u914D\u7F6E apiKeyCfg\uFF0C\u65E0\u9700\u91CD\u7F6E",msgType:"markdown"});return}(0,api_key_manager_1.resetApiKeyCfg)(this);const t=this.config.apiKeyCfg.claudeSettings.filter(r=>r.isValid).length;await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u2705 apiKeyCfg \u5DF2\u91CD\u7F6E
25
- - \u6709\u6548 Key \u6570: ${t}/${this.config.apiKeyCfg.claudeSettings.length}
26
- - \u91CD\u7F6E\u65F6\u95F4: ${this.config.apiKeyCfg.resetTime||"-"}`,msgType:"markdown"});return}const y=(0,commands_1.parseAuthCommand)(u);if(y){if(!await this.requireOwner(e,a,o))return;if(y.type==="approve"||y.type==="reject"){const r=this.pendingAuthRequests.get(y.requestId);if(!r){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u274C \u672A\u627E\u5230\u6388\u6743\u7533\u8BF7: ${y.requestId}`,msgType:"markdown"});return}if(this.pendingAuthRequests.delete(y.requestId),y.type==="approve"){let d=this.config.conversations.find(p=>p.conversationId===r.conversationId);d||(d={conversationId:r.conversationId,conversationType:r.conversationType||"1",conversationTitle:r.conversationTitle},this.config.conversations.push(d)),d.whiteUserList||(d.whiteUserList=[]),d.whiteUserList.includes(r.senderStaffId)||d.whiteUserList.push(r.senderStaffId),(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u6388\u6743\u7533\u8BF7\u901A\u8FC7: id=${y.requestId}, userId=${r.senderStaffId}`),await(0,messaging_1.sendMessageToUser)(this,r.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:a,content:`\u2705 \u5DF2\u901A\u8FC7\u6388\u6743\u7533\u8BF7
27
- - **\u7528\u6237ID:** ${r.senderStaffId}
28
- - **\u6635\u79F0:** ${r.senderNick}
29
- - **\u4F1A\u8BDDID:** ${r.conversationId}`,msgType:"markdown"})}else console.log(`[${(0,session_1.timestamp)()}] \u6388\u6743\u7533\u8BF7\u62D2\u7EDD: id=${y.requestId}, userId=${r.senderStaffId}`),await(0,messaging_1.sendMessageToUser)(this,r.senderStaffId,"\u274C \u60A8\u7684\u6388\u6743\u7533\u8BF7\u5DF2\u88AB\u62D2\u7EDD","markdown"),await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u2705 \u5DF2\u62D2\u7EDD\u6388\u6743\u7533\u8BF7
30
- - **\u7528\u6237ID:** ${r.senderStaffId}
31
- - **\u6635\u79F0:** ${r.senderNick}`,msgType:"markdown"});return}const t=w.whiteUserList;if(y.type==="list"){const r=t&&t.length>0?t.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:a,content:`\u{1F4CB} **\u5F53\u524D\u7FA4\u767D\u540D\u5355**
33
- ${r}`,msgType:"markdown"});return}if(y.type==="add"){let r=y.staffId;if((0,session_1.isMobile)(y.staffId)&&(r=await(0,session_1.resolveUserId)(this,y.staffId),!r)){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${y.staffId}`,msgType:"markdown"});return}if(t?.some(m=>(0,session_1.resolveToUserId)(this,m)===r)){const m=(0,session_1.userIdToPhone)(this,r)||r;await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u26A0\uFE0F ${m} \u5DF2\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}w.whiteUserList||(w.whiteUserList=[]),w.whiteUserList.push(y.staffId),(0,api_key_manager_1.saveClientConfig)(this);const p=w.whiteUserList.map(m=>{const f=(0,session_1.resolveToUserId)(this,m);return(0,session_1.userIdToPhone)(this,f)||m}),D=(0,session_1.isMobile)(y.staffId)?y.staffId:(0,session_1.userIdToPhone)(this,y.staffId)||y.staffId;await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u2705 \u5DF2\u6DFB\u52A0 ${D} \u5230\u5F53\u524D\u7FA4\u767D\u540D\u5355
34
- \u5F53\u524D\u767D\u540D\u5355: ${p.join(", ")}`,msgType:"markdown"});return}if(y.type==="del"){let r=y.staffId;if((0,session_1.isMobile)(y.staffId)&&(r=await(0,session_1.resolveUserId)(this,y.staffId),!r)){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${y.staffId}`,msgType:"markdown"});return}const d=t?.findIndex(f=>(0,session_1.resolveToUserId)(this,f)===r)??-1;if(d<0){const f=(0,session_1.userIdToPhone)(this,r)||r;await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u26A0\uFE0F ${f} \u4E0D\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}const p=w.whiteUserList[d];w.whiteUserList.splice(d,1),w.whiteUserList.length===0&&delete w.whiteUserList,(0,api_key_manager_1.saveClientConfig)(this);const D=w.whiteUserList?.length?w.whiteUserList.map(f=>{const C=(0,session_1.resolveToUserId)(this,f);return(0,session_1.userIdToPhone)(this,C)||f}).join(", "):"(\u7A7A\uFF0C\u4F7F\u7528\u5168\u5C40\u767D\u540D\u5355)",m=(0,session_1.userIdToPhone)(this,r)||p;await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u2705 \u5DF2\u79FB\u9664 ${m}
35
- \u5F53\u524D\u767D\u540D\u5355: ${D}`,msgType:"markdown"});return}}const L=(0,commands_1.parseOpenCommand)(u);if(L!==null){if(!await this.requireOwner(e,a,o))return;const t=this.getConversationDir(e),{exec:r}=await Promise.resolve().then(()=>__importStar(require("child_process"))),d=process.platform;try{L==="folder"?(r(d==="darwin"?`open "${t}"`:`explorer "${t}"`),await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u{1F4C2} \u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u6253\u5F00:
17
+ \u{1F4A1} \u8F93\u5165 \`/help\` \u67E5\u770B\u6240\u6709\u53EF\u7528\u547D\u4EE4`,msgType:"markdown"});return}const k=(0,commands_1.parseRebootCommand)(l);if(k){if(!await this.requireOwner(s,o,r))return;if(k.tag&&!/^[\w.\-]+$/.test(k.tag)){await this.sendDingMessage({conversationId:s,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 e=k.tag?`@${k.tag}`:"",n=k.update?`pnpm add -g cc-ding${e}`:null,d=`cc-ding-${this.clientId}`;await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:n?`\u2705 ${i} \u89E6\u53D1\u4E86\u91CD\u542F\u5E76\u66F4\u65B0\uFF0C\u6B63\u5728\u6267\u884C ${n}...`:`\u2705 ${i} \u89E6\u53D1\u4E86\u91CD\u542F\uFF0Ccc-ding \u6B63\u5728\u91CD\u542F\u4E2D...`,msgType:"markdown"});const p=path_1.default.join(this.getClientDir(),".reboot_pending");fs_1.default.writeFileSync(p,JSON.stringify({conversationId:s,senderStaffId:r}),"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(!w){console.log(`\u672A\u6CE8\u518C\u7684\u673A\u5668\u4EBA,\u7FA4:${f},${s}`),this.isOwner(r)?await this.sendDingMessage({conversationId:s,sessionWebhook:o,atUserId:r,content:"\u26A0\uFE0F \u8BE5\u7FA4\u672A\u6CE8\u518C\uFF0C\u8BF7\u5148\u4F7F\u7528 `/cfg` \u547D\u4EE4\u6CE8\u518C",msgType:"markdown"}):await this.sendDingMessage({conversationId:s,sessionWebhook:o,atUserId:r,content:`\u62B1\u6B49,\u8BE5\u7FA4\u7684\u673A\u5668\u4EBA\u672A\u5728\u670D\u52A1\u7AEF\u6CE8\u518C,\u8BF7\u8054\u7CFB\u5E94\u7528\u673A\u5668\u4EBAowner\u6CE8\u518C(${s})...`});return}const L=(0,commands_1.parseCleanCommand)(l);if(L!==null){if(L==="all"&&w?.conversationType!=="1"&&!this.isOwner(r)){await this.sendDingMessage({conversationId:s,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(s,o,r,w))return;const e=L==="all"?null:s,n=this.cleanCache(e,!0),d=[];d.push("\u{1F9F9} \u7F13\u5B58\u6E05\u7406\u5B8C\u6210"),n.sessionsDeleted>0&&d.push(`- \u4F1A\u8BDD\u76EE\u5F55: ${n.sessionsDeleted} \u4E2A`),n.tasksDeleted>0&&d.push(`- \u4EFB\u52A1\u76EE\u5F55: ${n.tasksDeleted} \u4E2A`),n.imagesDeleted>0&&d.push(`- \u56FE\u7247\u6587\u4EF6: ${n.imagesDeleted} \u4E2A`),n.sessionsDeleted===0&&n.tasksDeleted===0&&n.imagesDeleted===0&&d.push("(\u65E0\u5386\u53F2\u6570\u636E)"),d.push(`
18
+ \u{1F4A1} \u6D3B\u8DC3\u4F1A\u8BDD\u5DF2\u4FDD\u7559`),n.errors.length>0&&d.push(`
19
+ \u26A0\uFE0F \u9519\u8BEF: ${n.errors.join("; ")}`),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:d.join(`
20
+ `),msgType:"markdown"});return}if((0,commands_1.parseResetApiKeyCfgCommand)(l)){if(!await this.requireOwner(s,o,r))return;if(!this.config.apiKeyCfg){await this.sendDingMessage({conversationId:s,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 e=this.config.apiKeyCfg.claudeSettings.filter(n=>n.isValid).length;await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u2705 apiKeyCfg \u5DF2\u91CD\u7F6E
21
+ - \u6709\u6548 Key \u6570: ${e}/${this.config.apiKeyCfg.claudeSettings.length}
22
+ - \u91CD\u7F6E\u65F6\u95F4: ${this.config.apiKeyCfg.resetTime||"-"}`,msgType:"markdown"});return}const v=(0,commands_1.parseAuthCommand)(l);if(v){if(!await this.requireOwner(s,o,r))return;if(v.type==="approve"||v.type==="reject"){const n=this.pendingAuthRequests.get(v.requestId);if(!n){await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u274C \u672A\u627E\u5230\u6388\u6743\u7533\u8BF7: ${v.requestId}`,msgType:"markdown"});return}if(this.pendingAuthRequests.delete(v.requestId),v.type==="approve"){let d=this.config.conversations.find(p=>p.conversationId===n.conversationId);d||(d={conversationId:n.conversationId,conversationType:n.conversationType||"1",conversationTitle:n.conversationTitle},this.config.conversations.push(d)),d.whiteUserList||(d.whiteUserList=[]),d.whiteUserList.includes(n.senderStaffId)||d.whiteUserList.push(n.senderStaffId),(0,api_key_manager_1.saveClientConfig)(this),console.log(`[${(0,session_1.timestamp)()}] \u6388\u6743\u7533\u8BF7\u901A\u8FC7\u5C06: id=${v.requestId}, userId=${n.senderStaffId}`),await(0,messaging_1.sendMessageToUser)(this,n.senderStaffId,"\u2705 \u60A8\u7684\u6388\u6743\u7533\u8BF7\u5DF2\u901A\u8FC7\uFF0C\u73B0\u5728\u53EF\u4EE5\u5F00\u59CB\u4F7F\u7528\u4E86","markdown"),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u2705 \u5DF2\u901A\u8FC7\u6388\u6743\u7533\u8BF7
23
+ - **\u7528\u6237ID:** ${n.senderStaffId}
24
+ - **\u6635\u79F0:** ${n.senderNick}
25
+ - **\u4F1A\u8BDDID:** ${n.conversationId}`,msgType:"markdown"})}else console.log(`[${(0,session_1.timestamp)()}] \u6388\u6743\u7533\u8BF7\u62D2\u7EDD: id=${v.requestId}, userId=${n.senderStaffId}`),await(0,messaging_1.sendMessageToUser)(this,n.senderStaffId,"\u274C \u60A8\u7684\u6388\u6743\u7533\u8BF7\u5DF2\u88AB\u62D2\u7EDD","markdown"),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u2705 \u5DF2\u62D2\u7EDD\u6388\u6743\u7533\u8BF7
26
+ - **\u7528\u6237ID:** ${n.senderStaffId}
27
+ - **\u6635\u79F0:** ${n.senderNick}`,msgType:"markdown"});return}const e=w.whiteUserList;if(v.type==="list"){const n=e&&e.length>0?e.map(d=>`- ${(0,session_1.userIdToPhone)(this,d)||d}`).join(`
28
+ `):"(\u672A\u914D\u7F6E\u7FA4\u7EA7\u767D\u540D\u5355\uFF0C\u4F7F\u7528\u5168\u5C40\u767D\u540D\u5355)";await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u{1F4CB} **\u5F53\u524D\u7FA4\u767D\u540D\u5355**
29
+ ${n}`,msgType:"markdown"});return}if(v.type==="add"){let n=v.staffId;if((0,session_1.isMobile)(v.staffId)&&(n=await(0,session_1.resolveUserId)(this,v.staffId),!n)){await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${v.staffId}`,msgType:"markdown"});return}if(e?.some(m=>(0,session_1.resolveToUserId)(this,m)===n)){const m=(0,session_1.userIdToPhone)(this,n)||n;await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u26A0\uFE0F ${m} \u5DF2\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}w.whiteUserList||(w.whiteUserList=[]),w.whiteUserList.push(v.staffId),(0,api_key_manager_1.saveClientConfig)(this);const p=w.whiteUserList.map(m=>{const u=(0,session_1.resolveToUserId)(this,m);return(0,session_1.userIdToPhone)(this,u)||m}),T=(0,session_1.isMobile)(v.staffId)?v.staffId:(0,session_1.userIdToPhone)(this,v.staffId)||v.staffId;await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u2705 \u5DF2\u6DFB\u52A0 ${T} \u5230\u5F53\u524D\u7FA4\u767D\u540D\u5355
30
+ \u5F53\u524D\u767D\u540D\u5355: ${p.join(", ")}`,msgType:"markdown"});return}if(v.type==="del"){let n=v.staffId;if((0,session_1.isMobile)(v.staffId)&&(n=await(0,session_1.resolveUserId)(this,v.staffId),!n)){await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u26A0\uFE0F \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7: ${v.staffId}`,msgType:"markdown"});return}const d=e?.findIndex(u=>(0,session_1.resolveToUserId)(this,u)===n)??-1;if(d<0){const u=(0,session_1.userIdToPhone)(this,n)||n;await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u26A0\uFE0F ${u} \u4E0D\u5728\u5F53\u524D\u7FA4\u767D\u540D\u5355\u4E2D`,msgType:"markdown"});return}const p=w.whiteUserList[d];w.whiteUserList.splice(d,1),w.whiteUserList.length===0&&delete w.whiteUserList,(0,api_key_manager_1.saveClientConfig)(this);const T=w.whiteUserList?.length?w.whiteUserList.map(u=>{const C=(0,session_1.resolveToUserId)(this,u);return(0,session_1.userIdToPhone)(this,C)||u}).join(", "):"(\u7A7A\uFF0C\u4F7F\u7528\u5168\u5C40\u767D\u540D\u5355)",m=(0,session_1.userIdToPhone)(this,n)||p;await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u2705 \u5DF2\u79FB\u9664 ${m}
31
+ \u5F53\u524D\u767D\u540D\u5355: ${T}`,msgType:"markdown"});return}}const b=(0,commands_1.parseOpenCommand)(l);if(b!==null){if(!await this.requireOwner(s,o,r))return;const e=this.getConversationDir(s),{exec:n}=await Promise.resolve().then(()=>__importStar(require("child_process"))),d=process.platform;try{b==="folder"?(n(d==="darwin"?`open "${e}"`:`explorer "${e}"`),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u{1F4C2} \u5DF2\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u4E2D\u6253\u5F00:
36
32
  \`\`\`
37
- ${t}
38
- \`\`\``,msgType:"markdown"})):L==="code"?r("which code",p=>{if(p){this.sendDingMessage({conversationId:e,sessionWebhook:a,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}r(`code "${t}"`),this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u{1F4BB} \u5DF2\u5728 VS Code \u4E2D\u6253\u5F00:
33
+ ${e}
34
+ \`\`\``,msgType:"markdown"})):b==="code"?n("which code",p=>{if(p){this.sendDingMessage({conversationId:s,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 "${e}"`),this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u{1F4BB} \u5DF2\u5728 VS Code \u4E2D\u6253\u5F00:
39
35
  \`\`\`
40
- ${t}
41
- \`\`\``,msgType:"markdown"})}):(d==="darwin"?r(`open -a Terminal "${t}"`):r(`start cmd /k "cd /d ${t}"`,{shell:"cmd.exe"}),await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u{1F4BB} \u5DF2\u5728\u7EC8\u7AEF\u4E2D\u6253\u5F00:
36
+ ${e}
37
+ \`\`\``,msgType:"markdown"})}):(d==="darwin"?n(`open -a Terminal "${e}"`):n(`start cmd /k "cd /d ${e}"`,{shell:"cmd.exe"}),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u{1F4BB} \u5DF2\u5728\u7EC8\u7AEF\u4E2D\u6253\u5F00:
42
38
  \`\`\`
43
- ${t}
44
- \`\`\``,msgType:"markdown"}))}catch(p){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u274C \u6253\u5F00\u5931\u8D25: ${p instanceof Error?p.message:String(p)}`,msgType:"markdown"})}return}const b=(0,commands_1.parseCronCommand)(u);if(b){await this.handleCronCommand(b,{conversationId:e,sessionWebhook:a,senderStaffId:o,senderNick:n,conversationConfig:w});return}if((0,commands_1.parsePwdCommand)(u)){const t=this.getConversationDir(e);await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u{1F4C2} \u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55:
39
+ ${e}
40
+ \`\`\``,msgType:"markdown"}))}catch(p){await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u274C \u6253\u5F00\u5931\u8D25: ${p instanceof Error?p.message:String(p)}`,msgType:"markdown"})}return}const q=(0,commands_1.parseCronCommand)(l);if(q){await this.handleCronCommand(q,{conversationId:s,sessionWebhook:o,senderStaffId:r,senderNick:i,conversationConfig:w});return}const U=(0,commands_1.parseBashCommand)(l);if(U!==null){const e=this.getConversationDir(s),n=[];this.config.preBash&&n.push(this.config.preBash),w?.preBash&&n.push(w.preBash);const d=n.length>0?`${n.join(" ; ")} ; ${U}`:U,p=this;(0,child_process_1.exec)(d,{cwd:e,timeout:3e4,maxBuffer:1024*1024},async(T,m,u)=>{try{let C;if(T)C=`\u274C \u547D\u4EE4\u6267\u884C\u5931\u8D25
45
41
  \`\`\`
46
- ${t}
47
- \`\`\``,msgType:"markdown"});return}const q=(0,commands_1.parseMkdirCommand)(u);if(q!==null){await this.handleMkdirCommand(e,a,q);return}const A=(0,commands_1.parseTouchCommand)(u);if(A!==null){await this.handleTouchCommand(e,a,A);return}const E=(0,commands_1.parseRmCommand)(u);if(E!==null){await this.handleRmCommand(e,a,E);return}const U=(0,commands_1.parseBashCommand)(u);if(U!==null){const t=this.getConversationDir(e),r=[];this.config.preBash&&r.push(this.config.preBash),w?.preBash&&r.push(w.preBash);const d=r.length>0?`${r.join(" ; ")} ; ${U}`:U,p=this;(0,child_process_1.exec)(d,{cwd:t,timeout:3e4,maxBuffer:1024*1024},async(D,m,f)=>{try{let C;if(D)C=`\u274C \u547D\u4EE4\u6267\u884C\u5931\u8D25
48
- \`\`\`
49
- ${D.message}
50
- \`\`\``,f&&(C+=`
42
+ ${T.message}
43
+ \`\`\``,u&&(C+=`
51
44
 
52
45
  **stderr:**
53
46
  \`\`\`
54
- ${p.sanitizeOutput(f)}
47
+ ${p.sanitizeOutput(u)}
55
48
  \`\`\``);else{const $=m||"(\u65E0\u8F93\u51FA)";C=`\u2705 \u6267\u884C\u6210\u529F
56
49
  \`\`\`
57
50
  ${p.sanitizeOutput($)}
58
- \`\`\``,f&&(C+=`
51
+ \`\`\``,u&&(C+=`
59
52
 
60
53
  **stderr:**
61
54
  \`\`\`
62
- ${p.sanitizeOutput(f)}
63
- \`\`\``)}await p.sendDingMessage({conversationId:e,sessionWebhook:a,content:C,msgType:"markdown"})}catch(C){console.error("[bash] \u53D1\u9001\u6D88\u606F\u5931\u8D25:",C)}});return}if(/^\/new(?:\s|$)/i.test(u)){const t=this.findActiveSession(e);t&&(console.log(`\u6536\u5230\u65B0\u4F1A\u8BDD\u547D\u4EE4\uFF0C\u7ED3\u675F\u65E7\u4F1A\u8BDD: \u7FA4=${t.session.session.conversationId}, \u4F1A\u8BDDID=${this.getSessionId(t.session.session)}`),this.interruptClaudeProcess(t.session,"\u65B0\u4F1A\u8BDD\u547D\u4EE4\u4E2D\u65AD\u6B63\u5728\u6267\u884C\u7684 Claude \u8FDB\u7A0B"),this.activeSessions.delete(t.key),this.saveActiveSession(t.key));const r=u.replace(/^\/new\s*/i,"").trim();r?await this.startNewSession({conversationId:e,sessionWebhook:a,senderStaffId:o,senderNick:n,message:r,conversationConfig:w}):await this.sendDingMessage({conversationId:e,sessionWebhook:a,atUserId:o,content:"\u{1F680} \u8BF7\u8F93\u5165\u60A8\u7684\u95EE\u9898\u5F00\u59CB\u65B0\u4F1A\u8BDD"});return}const P=(0,commands_1.parseContinueSessionCommand)(u);if(P!==null&&w){let t=P;if(!t){const r=(0,session_1.findLatestSession)(this,e);if(!r){await this.sendDingMessage({conversationId:e,sessionWebhook:a,atUserId:o,content:"\u26A0\uFE0F \u672A\u627E\u5230\u5DF2\u7ED3\u675F\u7684\u4F1A\u8BDD",msgType:"markdown"});return}t=(0,session_1.getSessionId)(r)}await this.switchToSession(e,a,t,o,w);return}const _=(0,commands_1.parseLogCommand)(u);if(_!==null){const t=this.readSessionLogTail(e,_);t?await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u{1F4CB} \u6700\u8FD1 ${_} \u884C\u65E5\u5FD7:
55
+ ${p.sanitizeOutput(u)}
56
+ \`\`\``)}await p.sendDingMessage({conversationId:s,sessionWebhook:o,content:C,msgType:"markdown"})}catch(C){console.error("[bash] \u53D1\u9001\u6D88\u606F\u5931\u8D25:",C)}});return}if(/^\/new(?:\s|$)/i.test(l)){const e=this.findActiveSession(s);e&&(console.log(`\u6536\u5230\u65B0\u4F1A\u8BDD\u547D\u4EE4\uFF0C\u7ED3\u675F\u65E7\u4F1A\u8BDD: \u7FA4=${e.session.session.conversationId}, \u4F1A\u8BDDID=${this.getSessionId(e.session.session)}`),this.interruptClaudeProcess(e.session,"\u65B0\u4F1A\u8BDD\u547D\u4EE4\u4E2D\u65AD\u6B63\u5728\u6267\u884C\u7684 Claude \u8FDB\u7A0B"),this.activeSessions.delete(e.key),this.saveActiveSession(e.key));const n=l.replace(/^\/new\s*/i,"").trim();n?await this.startNewSession({conversationId:s,sessionWebhook:o,senderStaffId:r,senderNick:i,message:n,conversationConfig:w}):await this.sendDingMessage({conversationId:s,sessionWebhook:o,atUserId:r,content:"\u{1F680} \u8BF7\u8F93\u5165\u60A8\u7684\u95EE\u9898\u5F00\u59CB\u65B0\u4F1A\u8BDD"});return}const x=(0,commands_1.parseContinueSessionCommand)(l);if(x!==null&&w){let e=x;if(!e){const n=(0,session_1.findLatestSession)(this,s);if(!n){await this.sendDingMessage({conversationId:s,sessionWebhook:o,atUserId:r,content:"\u26A0\uFE0F \u672A\u627E\u5230\u5DF2\u7ED3\u675F\u7684\u4F1A\u8BDD",msgType:"markdown"});return}e=(0,session_1.getSessionId)(n)}await this.switchToSession(s,o,e,r,w);return}const _=(0,commands_1.parseLogCommand)(l);if(_!==null){const e=this.readSessionLogTail(s,_);e?await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u{1F4CB} \u6700\u8FD1 ${_} \u884C\u65E5\u5FD7:
64
57
  \`\`\`
65
- ${t}
66
- \`\`\``,msgType:"markdown"}):await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u6D3B\u8DC3\u4F1A\u8BDD\u6216\u6682\u65E0\u65E5\u5FD7"});return}const S=(0,commands_1.parseInfoCommand)(u);if(S!==null){const t=[],r=this.getConversationDir(e);if((S==="all"||S==="robot")&&(t.push(`### \u{1F310} \u5168\u5C40\u6838\u5FC3\u914D\u7F6E
67
- `+(0,commands_1.formatGlobalConfig)(this.config)),t.push(`### \u{1F916} \u7FA4\u914D\u7F6E\u4FE1\u606F
68
- `+(0,commands_1.formatConversationInfo)(w,e,d=>(0,session_1.userIdToPhone)(this,d),r))),S==="all"||S==="session"){const d=this.formatSessionInfo(e);d?t.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\u4FE1\u606F
69
- `+d):t.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\u4FE1\u606F
70
- \u65E0\u6D3B\u8DC3\u4F1A\u8BDD`)}(S==="all"||S==="task")&&t.push(`### \u{1F4DD} \u4EFB\u52A1\u961F\u5217\u4FE1\u606F
71
- `+this.formatTaskInfo()),await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:t.join(`
58
+ ${e}
59
+ \`\`\``,msgType:"markdown"}):await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u6D3B\u8DC3\u4F1A\u8BDD\u6216\u6682\u65E0\u65E5\u5FD7"});return}const S=(0,commands_1.parseInfoCommand)(l);if(S!==null){const e=[],n=this.getConversationDir(s);if((S==="all"||S==="robot")&&(e.push(`### \u{1F310} \u5168\u5C40\u6838\u5FC3\u914D\u7F6E
60
+ `+(0,commands_1.formatGlobalConfig)(this.config)),e.push(`### \u{1F916} \u7FA4\u914D\u7F6E\u4FE1\u606F
61
+ `+(0,commands_1.formatConversationInfo)(w,s,d=>(0,session_1.userIdToPhone)(this,d),n))),S==="all"||S==="session"){const d=this.formatSessionInfo(s);d?e.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\u4FE1\u606F
62
+ `+d):e.push(`### \u{1F4AC} \u5F53\u524D\u4F1A\u8BDD\u4FE1\u606F
63
+ \u65E0\u6D3B\u8DC3\u4F1A\u8BDD`)}(S==="all"||S==="task")&&e.push(`### \u{1F4DD} \u4EFB\u52A1\u961F\u5217\u4FE1\u606F
64
+ `+this.formatTaskInfo()),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:e.join(`
72
65
 
73
- `),msgType:"markdown"});return}const N=(0,commands_1.parseLsCommand)(u);if(N!==null){const{target:t,depth:r}=N,d=this.getConversationDir(e);let p=d,D="\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55";if(t&&t!=="root")if(t.startsWith("./")||t.startsWith("../")||t.startsWith("/")){const f=path_1.default.resolve(d,t);if(fs_1.default.existsSync(f)&&fs_1.default.statSync(f).isDirectory()){if(!f.startsWith(d)){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:"\u274C \u8DEF\u5F84\u8D85\u51FA\u5DE5\u4F5C\u76EE\u5F55\u8303\u56F4",msgType:"markdown"});return}p=f,D=t}else{await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u274C \u8DEF\u5F84\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55: **${t}**`,msgType:"markdown"});return}}else{const f=(0,commands_1.findSubdirByName)(d,t);if(f)p=f,D=t;else{await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u274C \u672A\u627E\u5230\u540D\u4E3A **${t}** \u7684\u76EE\u5F55`,msgType:"markdown"});return}}const m=(0,commands_1.getDirectoryStructure)(p,0,r);await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u{1F4C2} ${D} (\u5C55\u5F00${r}\u5C42):
66
+ `),msgType:"markdown"});return}const N=(0,commands_1.parseLsCommand)(l);if(N!==null){const{target:e,depth:n}=N,d=this.getConversationDir(s);let p=d,T="\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55";if(e&&e!=="root")if(e.startsWith("./")||e.startsWith("../")||e.startsWith("/")){const u=path_1.default.resolve(d,e);if(fs_1.default.existsSync(u)&&fs_1.default.statSync(u).isDirectory()){if(!u.startsWith(d)){await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:"\u274C \u8DEF\u5F84\u8D85\u51FA\u5DE5\u4F5C\u76EE\u5F55\u8303\u56F4",msgType:"markdown"});return}p=u,T=e}else{await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u274C \u8DEF\u5F84\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55: **${e}**`,msgType:"markdown"});return}}else{const u=(0,commands_1.findSubdirByName)(d,e);if(u)p=u,T=e;else{await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u274C \u672A\u627E\u5230\u540D\u4E3A **${e}** \u7684\u76EE\u5F55`,msgType:"markdown"});return}}const m=(0,commands_1.getDirectoryStructure)(p,0,n);await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u{1F4C2} ${T} (\u5C55\u5F00${n}\u5C42):
74
67
  \`\`\`
75
68
  ${m}
76
- \`\`\``,msgType:"markdown"});return}const x=(0,task_1.parseTaskCancelCommand)(u);if(x){const t=this.cancelTask(x,e);await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:t,msgType:"markdown"});return}if(u.startsWith("/task ")){const t=u.substring(6).trim();t&&(await this.sendDingMessage({conversationId:e,sessionWebhook:a,atUserId:o,content:"\u{1F4CB} \u4EFB\u52A1\u5DF2\u6536\u5230,\u5B8C\u6210\u540E\u6211\u4F1A\u56DE\u590D"}),await this.saveTask({conversationId:e,prompt:t,senderStaffId:o,senderNickName:n,sessionWebhook:a}));return}const O=(0,commands_1.parseMqCommand)(u);if(O){const r=this.findActiveSession(e)?.session.messageQueue??[];switch(O.type){case"list":{if(r.length===0)await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});else{const d=r.map((p,D)=>`${D+1}. **${p.senderNick||p.senderStaffId}:** ${this.truncateMsg(p.message)}`);await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u{1F4E8} \u6D88\u606F\u961F\u5217 (${r.length} \u6761)
69
+ \`\`\``,msgType:"markdown"});return}const A=(0,task_1.parseTaskCancelCommand)(l);if(A){const e=this.cancelTask(A,s);await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:e,msgType:"markdown"});return}if(l.startsWith("/task ")){const e=l.substring(6).trim();e&&(await this.sendDingMessage({conversationId:s,sessionWebhook:o,atUserId:r,content:"\u{1F4CB} \u4EFB\u52A1\u5DF2\u6536\u5230,\u5B8C\u6210\u540E\u6211\u4F1A\u56DE\u590D"}),await this.saveTask({conversationId:s,prompt:e,senderStaffId:r,senderNickName:i,sessionWebhook:o}));return}const O=(0,commands_1.parseMqCommand)(l);if(O){const n=this.findActiveSession(s)?.session.messageQueue??[];switch(O.type){case"list":{if(n.length===0)await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});else{const d=n.map((p,T)=>`${T+1}. **${p.senderNick||p.senderStaffId}:** ${this.truncateMsg(p.message)}`);await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u{1F4E8} \u6D88\u606F\u961F\u5217 (${n.length} \u6761)
77
70
  ${d.join(`
78
- `)}`,msgType:"markdown"})}return}case"cancel":{if(r.length===0){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});return}const d=Math.min(O.count,r.length),D=r.splice(r.length-d,d).map((m,f)=>`${f+1}. **${m.senderNick||m.senderStaffId}:** ${this.truncateMsg(m.message)}`);await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u2705 \u5DF2\u4ECE\u961F\u5C3E\u79FB\u9664 ${d} \u6761\u6D88\u606F
79
- ${D.join(`
80
- `)}`,msgType:"markdown"});return}case"cancelAll":{if(r.length===0){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:"\u{1F4ED} \u5F53\u524D\u65E0\u6392\u961F\u6D88\u606F",msgType:"markdown"});return}const d=r.length;r.length=0,await this.sendDingMessage({conversationId:e,sessionWebhook:a,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)(u)){const t=this.activeSessions.get(e);if(!t){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD"});return}if(t.currentProcess)console.log(`[${(0,session_1.timestamp)()}] /goon: \u7EC8\u6B62\u5F53\u524D Claude \u8FDB\u7A0B\u5E76\u6807\u8BB0 goonPending`),t.goonPending=!0,t.interrupted=!0,t.currentProcess.kill("SIGINT"),await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:"\u{1F504} \u6B63\u5728\u91CD\u542F Claude \u8FDB\u7A0B..."});else{console.log(`[${(0,session_1.timestamp)()}] /goon: \u65E0\u8FD0\u884C\u4E2D\u8FDB\u7A0B\uFF0C\u76F4\u63A5\u53D1\u9001"\u7EE7\u7EED"`),t.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(this,t.session,"\u7EE7\u7EED",{senderNick:n,senderStaffId:o})}finally{t.isProcessing=!1}}return}const R=(0,commands_1.parseCcCommand)(u);if(R!==null){const t=this.activeSessions.get(e);if(!t){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u53D1\u9001\u6D88\u606F\u5F00\u59CB\u4F1A\u8BDD"});return}if(t.isProcessing){await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:"\u23F3 \u6B63\u5728\u5904\u7406\u4E2D\uFF0C\u8BF7\u7A0D\u7B49..."});return}t.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(this,t.session,R,{senderNick:n,senderStaffId:o})}finally{t.isProcessing=!1}return}if((0,commands_1.parseClaudeMdCommand)(u)){const t=this.getConversationDir(e),r=path_1.default.join(t,".claude","CLAUDE.md");if(fs_1.default.existsSync(r)){const d=fs_1.default.readFileSync(r,"utf-8"),p=d.length>8e3?d.substring(0,8e3)+`
81
- ...(\u5185\u5BB9\u8FC7\u957F\u5DF2\u622A\u65AD)`:d;await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u{1F4C4} **CLAUDE.md**
71
+ `)}`,msgType:"markdown"})}return}case"cancel":{if(n.length===0){await this.sendDingMessage({conversationId:s,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,u)=>`${u+1}. **${m.senderNick||m.senderStaffId}:** ${this.truncateMsg(m.message)}`);await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u2705 \u5DF2\u4ECE\u961F\u5C3E\u79FB\u9664 ${d} \u6761\u6D88\u606F
72
+ ${T.join(`
73
+ `)}`,msgType:"markdown"});return}case"cancelAll":{if(n.length===0){await this.sendDingMessage({conversationId:s,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:s,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)(l)){const e=this.activeSessions.get(s);if(!e){await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:"\u26A0\uFE0F \u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u4F1A\u8BDD"});return}if(e.currentProcess){console.log(`[${(0,session_1.timestamp)()}] /goon: \u7EC8\u6B62\u5F53\u524D Claude \u8FDB\u7A0B`),e.interrupted=!0,e.currentProcess.kill("SIGINT"),await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:"\u{1F504} \u6B63\u5728\u91CD\u542F Claude \u8FDB\u7A0B..."}),e.goonPending=!1,e.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(this,e.session,"\u7EE7\u7EED",{senderNick:e.session.startNickName,senderStaffId:e.lastSenderStaffId,permissionMode:e.conversationConfig.permissionMode})}finally{e.isProcessing=!1}}else{console.log(`[${(0,session_1.timestamp)()}] /goon: \u65E0\u8FD0\u884C\u4E2D\u8FDB\u7A0B\uFF0C\u76F4\u63A5\u53D1\u9001"\u7EE7\u7EED"`),e.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(this,e.session,"\u7EE7\u7EED",{senderNick:i,senderStaffId:r,permissionMode:e.conversationConfig.permissionMode})}finally{e.isProcessing=!1}}return}const P=(0,commands_1.parseCcCommand)(l);if(P!==null){const e=this.activeSessions.get(s);if(!e){await this.sendDingMessage({conversationId:s,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(e.isProcessing){await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:"\u23F3 \u6B63\u5728\u5904\u7406\u4E2D\uFF0C\u8BF7\u7A0D\u7B49..."});return}e.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(this,e.session,P,{senderNick:i,senderStaffId:r,permissionMode:e.conversationConfig.permissionMode})}finally{e.isProcessing=!1}return}if((0,commands_1.parseClaudeMdCommand)(l)){const e=this.getConversationDir(s),n=path_1.default.join(e,".claude","CLAUDE.md");if(fs_1.default.existsSync(n)){const d=fs_1.default.readFileSync(n,"utf-8"),p=d.length>8e3?d.substring(0,8e3)+`
74
+ ...(\u5185\u5BB9\u8FC7\u957F\u5DF2\u622A\u65AD)`:d;await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u{1F4C4} **CLAUDE.md**
82
75
  \`\`\`
83
76
  ${p}
84
- \`\`\``,msgType:"markdown"})}else await this.sendDingMessage({conversationId:e,sessionWebhook:a,content:`\u26A0\uFE0F \u672A\u627E\u5230 CLAUDE.md
85
- \u8DEF\u5F84: \`${r}\``,msgType:"markdown"});return}await this.handleSessionMessage({conversationId:e,sessionWebhook:a,senderStaffId:o,senderNick:n,message:u,conversationConfig:w})}async run(){const i=Array.isArray(this.config.conversations)?this.config.conversations:[],s=this.config.taskHandlerCount??this.DEFAULT_TASK_HANDLER_COUNT,n=i.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: ${i.map(c=>c.conversationTitle||c.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(),this.cronEngine.start(),n&&console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u5668\u6570\u91CF: ${s}`),this.dingStreamClient.registerCallbackListener("/v1.0/im/bot/messages/get",async c=>{await this.botMsgGetCallback(c)});const o=[];if(n)for(let c=0;c<s;c++)console.log(`[${(0,session_1.timestamp)()}] \u542F\u52A8\u4EFB\u52A1\u5904\u7406\u5668 #${c+1}`),o.push(this.runTaskHandlerLoop().catch(a=>console.error(`\u4EFB\u52A1\u5904\u7406\u5668 #${c+1} \u9519\u8BEF:`,a)));const e=this.dingStreamClient.connect().catch(c=>{console.error("Fatal error",c),process.exit(1)});await Promise.all([e,...o])}}exports.DingClaude=DingClaude;
77
+ \`\`\``,msgType:"markdown"})}else await this.sendDingMessage({conversationId:s,sessionWebhook:o,content:`\u26A0\uFE0F \u672A\u627E\u5230 CLAUDE.md
78
+ \u8DEF\u5F84: \`${n}\``,msgType:"markdown"});return}await this.handleSessionMessage({conversationId:s,sessionWebhook:o,senderStaffId:r,senderNick:i,message:l,conversationConfig:w})}async notifyPendingReboot(){const a=path_1.default.join(this.getClientDir(),".reboot_pending");if(fs_1.default.existsSync(a))try{const t=JSON.parse(fs_1.default.readFileSync(a,"utf-8"));fs_1.default.unlinkSync(a);const i=this.activeSessions.get(t.conversationId);if(!i){console.log(`[${(0,session_1.timestamp)()}] \u91CD\u542F\u540E\u672A\u627E\u5230\u6D3B\u8DC3\u4F1A\u8BDD\uFF0C\u8DF3\u8FC7\u901A\u77E5`);return}await this.sendDingMessage({conversationId:t.conversationId,sessionWebhook:i.session.sessionWebhook,content:"\u2705 cc-ding \u5DF2\u91CD\u542F\u5B8C\u6210",msgType:"markdown",atUserId:t.senderStaffId}),console.log(`[${(0,session_1.timestamp)()}] \u91CD\u542F\u5B8C\u6210\u901A\u77E5\u5DF2\u53D1\u9001`)}catch(t){try{const i=fs_1.default.readFileSync(a,"utf-8");console.error(`[${(0,session_1.timestamp)()}] .reboot_pending \u5185\u5BB9:`,i)}catch{}console.error(`[${(0,session_1.timestamp)()}] \u5904\u7406\u91CD\u542F\u901A\u77E5\u5931\u8D25:`,t);try{fs_1.default.unlinkSync(a)}catch{}}}async run(){const a=Array.isArray(this.config.conversations)?this.config.conversations:[],t=this.config.taskHandlerCount??this.DEFAULT_TASK_HANDLER_COUNT,i=a.length>0;console.log(`[${(0,session_1.timestamp)()}] \u9489\u9489\u673A\u5668\u4EBA\u670D\u52A1\u542F\u52A8\uFF0CclientId: ${this.clientId}`),console.log(`[${(0,session_1.timestamp)()}] \u7FA4\u914D\u7F6E: ${a.map(f=>f.conversationTitle||f.conversationId).join(", ")}`),(0,api_key_manager_1.startupCheck)(this),await(0,session_1.resolveAllPhonesInConfig)(this),this.config.apiKeyCfg&&((0,api_key_manager_1.resetApiKeyCfg)(this),(0,api_key_manager_1.scheduleApiKeyCfgDailyReset)(this)),this.loadActiveSessions(),await this.notifyPendingReboot(),this.cronEngine.start(),i&&console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u5668\u6570\u91CF: ${t}`),this.dingStreamClient.registerCallbackListener("/v1.0/im/bot/messages/get",async f=>{await this.botMsgGetCallback(f)});const r=[];if(i)for(let f=0;f<t;f++)console.log(`[${(0,session_1.timestamp)()}] \u542F\u52A8\u4EFB\u52A1\u5904\u7406\u5668 #${f+1}`),r.push(this.runTaskHandlerLoop().catch(o=>console.error(`\u4EFB\u52A1\u5904\u7406\u5668 #${f+1} \u9519\u8BEF:`,o)));const s=this.dingStreamClient.connect().catch(f=>{console.error("Fatal error",f),process.exit(1)});await Promise.all([s,...r])}}exports.DingClaude=DingClaude;
@@ -1,39 +1,39 @@
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.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(t,e,r){const a=(0,api_key_manager_1.getForceEnabledSettingsPath)(e);if(a)return a;if(t.config.apiKeyCfg){const S=(0,api_key_manager_1.readApiKeyFromSettings)(e);let h=null;if(S&&(h=t.config.apiKeyCfg.claudeSettings.find(u=>u.apiKey===S&&u.isValid)||null),h||(h=(0,api_key_manager_1.pickValidApiKey)(t)),h)return(0,api_key_manager_1.ensureSettingsWithApiKey)(e,h)}if(t.config.apiKeyCfg)return;if(r)return r;const $=path_1.default.join(e,".claude","settings.json");if(fs_1.default.existsSync($))return console.log(`[${(0,session_1.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${$}`),$}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(a=>e.includes(a))}function sleep(t){return new Promise(e=>setTimeout(e,t))}class RetryableApiError extends Error{constructor(e,r=""){super(`Retryable API error (TPM limit etc.)${e?" [fast fail]":""}`),this.name="RetryableApiError",this.isFastFail=e,this.output=r}}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(a=>e.includes(a))}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 r=JSON.parse(t);if(r.type==="system"&&r.subtype==="init"&&r.session_id)return{type:"system",sessionId:r.session_id};if(r.type==="assistant"){const a=r.message?.content;if(Array.isArray(a)){const $=[];for(const S of a)S.type==="text"&&S.text?$.push(S.text):S.type==="thinking"&&S.thinking&&e&&$.push(`\u{1F4AD} **\u601D\u8003\u8FC7\u7A0B**
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,s){const a=(0,api_key_manager_1.getForceEnabledSettingsPath)(t);if(a)return a;if(e.config.apiKeyCfg){const S=(0,api_key_manager_1.readApiKeyFromSettings)(t);let h=null;if(S&&(h=e.config.apiKeyCfg.claudeSettings.find(l=>l.apiKey===S&&l.isValid)||null),h||(h=(0,api_key_manager_1.pickValidApiKey)(e)),h)return(0,api_key_manager_1.ensureSettingsWithApiKey)(t,h)}if(e.config.apiKeyCfg)return;if(s)return s;const $=path_1.default.join(t,".claude","settings.json");if(fs_1.default.existsSync($))return console.log(`[${(0,session_1.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${$}`),$}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(a=>t.includes(a))}function sleep(e){return new Promise(t=>setTimeout(t,e))}class RetryableApiError extends Error{constructor(t,s=""){super(`Retryable API error (TPM limit etc.)${t?" [fast fail]":""}`),this.name="RetryableApiError",this.isFastFail=t,this.output=s}}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(a=>t.includes(a))}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 s=JSON.parse(e);if(s.type==="system"&&s.subtype==="init"&&s.session_id)return{type:"system",sessionId:s.session_id};if(s.type==="assistant"){const a=s.message?.content;if(Array.isArray(a)){const $=[];for(const S of a)S.type==="text"&&S.text?$.push(S.text):S.type==="thinking"&&S.thinking&&t&&$.push(`\u{1F4AD} **\u601D\u8003\u8FC7\u7A0B**
4
4
  \`\`\`
5
5
  ${S.thinking}
6
6
  \`\`\``);if($.length>0)return{type:"assistant",content:$.join(`
7
- `)}}else if(r.content)return{type:"assistant",content:typeof r.content=="string"?r.content:JSON.stringify(r.content)};return{type:"assistant"}}if(r.type==="result"){const a=r.result||"";return{type:"result",content:typeof a=="string"?a:JSON.stringify(a)}}return{type:r.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,r,a,$,S,h){let u=t.getSessionDir(e),p=`${u}/session.log`;fs_1.default.existsSync(u)||fs_1.default.mkdirSync(u,{recursive:!0});const m=Date.now();return new Promise((I,d)=>{const w=(0,child_process_1.spawn)(a,r,{cwd:$,stdio:["pipe","pipe","pipe"]}),A=t.activeSessions.get(e.conversationId);A&&(A.currentProcess=w,A.lastActivityTime=Date.now()),fs_1.default.appendFileSync(p,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u542F\u52A8${h?" (\u91CD\u8BD5)":""}
8
- `,"utf-8"),w.stdin?.write(`${S}
9
- `),w.stdin?.end();let k=!h&&!!e.claudeSessionId,E=[],b="",M="",P=!1,g=!1,c=null;const C=new Set,T=()=>{A&&(A.lastActivityTime=Date.now())};c=setInterval(()=>{if(g){c&&clearInterval(c);return}const i=A?.lastActivityTime??m;if(Date.now()-i>=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(p,`[${(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{}c&&clearInterval(c),c=null;const l=A?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),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(s=>console.error("\u53D1\u9001 Watchdog \u901A\u77E5\u5931\u8D25:",s))}},WATCHDOG_CHECK_INTERVAL_MS),readline_1.default.createInterface({input:w.stdout}).on("line",i=>{if(M+=i+`
11
- `,T(),t.debugLog(`Claude stdout: ${i.substring(0,200)}${i.length>200?"...":""}`),t.config.debug)try{fs_1.default.appendFileSync(p,`[${(0,session_1.timestamp)()}] [RAW]: ${i}
12
- `,"utf-8")}catch{}const o=parseClaudeStreamLine(i,t.config.includeThinking??!1);if(o){if(o.type==="system"&&o.sessionId&&!k&&(t.updateSessionFile(e,{claudeSessionId:o.sessionId}),k=!0,u=t.getSessionDir(e),p=`${u}/session.log`),o.type==="assistant"){try{const s=JSON.parse(i)?.message?.content;if(Array.isArray(s)){for(const n of s)if(n.type==="tool_use"&&n.id&&!C.has(n.id)){C.add(n.id);const f=n.name||"unknown";let y="";n.input&&(n.input.command?y=n.input.command.substring(0,200):n.input.file_path?y=n.input.file_path:n.input.pattern?y=n.input.pattern:n.input.query?y=n.input.query:n.input.description?y=n.input.description:n.input.prompt?y=n.input.prompt.substring(0,200):y=JSON.stringify(n.input).substring(0,200)),t.appendSessionLog(u,"tool",`${f}${y?": "+y:""}`)}}}catch{}o.content&&E.push(o.content)}if(o.type==="result"){const l=t.config.resultOnly??!0,s=(o.content||"").trim(),n=E.join(`
13
- `).trim(),f=l&&s||n;if(f){try{t.appendSessionLog(u,"assistant",f)}catch{}const v=t.activeSessions.get(e.conversationId)?.lastSenderStaffId||e.startStaffId;P=!0,(0,messaging_1.sendClaudeResponseToDing)(t,(0,session_1.getReplyConversationId)(e),(0,session_1.getReplyWebhook)(e),v,f).catch(_=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",_))}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`);E=[]}}}),w.stderr?.on("data",i=>{const o=i.toString();if(b+=o,T(),(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(p,`[${(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(p,`[${(0,session_1.timestamp)()}] [WARN]: ${o}`,"utf-8")}catch{}}else{console.error(`[Claude stderr]: ${o}`);try{fs_1.default.appendFileSync(p,`[${(0,session_1.timestamp)()}] [ERROR]: ${o}`,"utf-8")}catch{}}}),w.on("close",i=>{g=!0,c&&(clearInterval(c),c=null),console.log(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${i}`);try{fs_1.default.appendFileSync(p,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u7ED3\u675F\uFF0C\u9000\u51FA\u7801: ${i}
14
- `,"utf-8")}catch{}const o=t.activeSessions.get(e.conversationId);if(o&&(o.currentProcess=void 0),E.length>0){const s=E.join(`
15
- `).trim();if(s){try{t.appendSessionLog(u,"assistant",s)}catch{}const n=o?.lastSenderStaffId||e.startStaffId;P=!0,(0,messaging_1.sendClaudeResponseToDing)(t,(0,session_1.getReplyConversationId)(e),(0,session_1.getReplyWebhook)(e),n,s).catch(f=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",f))}}if(i===0&&!P&&!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(p,`[${(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 s=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:s,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(n=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",n))}if(i===0){I(0);return}if(o?.interrupted){console.log(`[${(0,session_1.timestamp)()}] \u7528\u6237\u4E3B\u52A8\u4E2D\u65AD\uFF0C\u5FFD\u7565\u9519\u8BEF`),o.interrupted=!1,I(0);return}const l=b+`
17
- `+M;if((0,api_key_manager_1.isQuotaExhaustedError)(l)){const n=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)(M)}, stderr\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(b)}`),d(new RetryableApiError(n,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 s=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:s,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(n=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",n)),I(i??1);return}if(isRetryableApiError(l)){const n=Date.now()-m<FAST_FAIL_THRESHOLD_MS;d(new RetryableApiError(n,l));return}if(isPermissionError(l)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u9700\u8981\u6388\u6743\uFF0C\u901A\u77E5\u7528\u6237`);const s=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:s,content:"\u26A0\uFE0F Claude \u9700\u8981\u6388\u6743\uFF0C\u8BF7\u4EBA\u5DE5\u4ECB\u5165"}).catch(n=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",n)),I(i??1);return}if(e.claudeSessionId&&isConversationNotFoundError(l)){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`),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(p,`[${(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: ${i}`))}),w.on("error",i=>{g=!0,c&&(clearInterval(c),c=null),console.error("Claude \u8FDB\u7A0B\u9519\u8BEF:",i),fs_1.default.appendFileSync(p,`[${(0,session_1.timestamp)()}] [ERROR]: \u8FDB\u7A0B\u9519\u8BEF: ${i.message}
19
- `,"utf-8"),d(i)})})}async function executeClaudeQuery(t,e,r,a){const{skill:$,agent:S,senderNick:h,senderStaffId:u}=a||{};let p=t.getSessionDir(e),m=`${p}/session.log`;const I=t.getConversationDir(e.conversationId);fs_1.default.mkdirSync(p,{recursive:!0});let d=null;const w=(0,api_key_manager_1.readApiKeyFromSettings)(I);if(w&&t.config.apiKeyCfg&&(d=t.config.apiKeyCfg.claudeSettings.find(R=>R.apiKey===w&&R.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)(I)&&t.config.apiKeyCfg&&(d=(0,api_key_manager_1.pickValidApiKey)(t),!d)){const R=u||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:R,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 k=h&&u?`${h}(${u})`:"unknown",E=`${r} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${k}`;t.appendSessionLog(p,"user",E);const b="claude",M=["--permission-mode","bypassPermissions","--print","--output-format","stream-json","--verbose"];S&&M.push("--agent",S);const P=$?`/${$} ${E}`:E;let g=0,c=0,C=0;const T=[];for(;;){const R=g>0;if(c>=MAX_TOTAL_RETRIES||c>=3&&C>0&&Date.now()-C>MAX_RETRY_DURATION_MS){const s=c>=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 ${c} \u6B21\uFF09`;console.error(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF: ${s}`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF\uFF0C${s}\uFF0C\u7EC8\u6B62\u91CD\u8BD5
20
- `,"utf-8");const n=readLastLogLines(m,1),f=T.slice(-1)[0]||"",y=u||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:y,content:`\u{1F504} \u68C0\u6D4B\u5230 Claude \u9677\u5165\u65E0\u9650\u91CD\u8BD5\uFF0C\u5DF2\u7EC8\u6B62\uFF08${s}\uFF09
7
+ `)}}else if(s.content)return{type:"assistant",content:typeof s.content=="string"?s.content:JSON.stringify(s.content)};return{type:"assistant"}}if(s.type==="result"){const a=s.result||"";return{type:"result",content:typeof a=="string"?a:JSON.stringify(a)}}return{type:s.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,s,a,$,S,h){let l=e.getSessionDir(t),m=`${l}/session.log`;fs_1.default.existsSync(l)||fs_1.default.mkdirSync(l,{recursive:!0});const g=Date.now();return new Promise((I,p)=>{const v=(0,child_process_1.spawn)(a,s,{cwd:$,stdio:["pipe","pipe","pipe"]}),A=e.activeSessions.get(t.conversationId);A&&(A.currentProcess=v,A.lastActivityTime=Date.now()),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u542F\u52A8${h?" (\u91CD\u8BD5)":""}
8
+ `,"utf-8"),v.stdin?.write(`${S}
9
+ `),v.stdin?.end();let M=!h&&!!t.claudeSessionId,C=[],k="",T="",_=!1,y=!1,d=null;const w=new Set,R=()=>{A&&(A.lastActivityTime=Date.now())};d=setInterval(()=>{if(y){d&&clearInterval(d);return}const i=A?.lastActivityTime??g;if(Date.now()-i>=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(m,`[${(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{}d&&clearInterval(d),d=null;const r=A?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:r,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(c=>console.error("\u53D1\u9001 Watchdog \u901A\u77E5\u5931\u8D25:",c))}},WATCHDOG_CHECK_INTERVAL_MS),readline_1.default.createInterface({input:v.stdout}).on("line",i=>{if(T+=i+`
11
+ `,R(),e.debugLog(`Claude stdout: ${i.substring(0,200)}${i.length>200?"...":""}`),e.config.debug)try{fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [RAW]: ${i}
12
+ `,"utf-8")}catch{}const n=parseClaudeStreamLine(i,e.config.includeThinking??!1);if(n){if(n.type==="system"&&n.sessionId&&!M&&(e.updateSessionFile(t,{claudeSessionId:n.sessionId}),M=!0,l=e.getSessionDir(t),m=`${l}/session.log`),n.type==="assistant"){try{const c=JSON.parse(i)?.message?.content;if(Array.isArray(c)){for(const o of c)if(o.type==="tool_use"&&o.id&&!w.has(o.id)){w.add(o.id);const f=o.name||"unknown";let u="";o.input&&(o.input.command?u=o.input.command.substring(0,200):o.input.file_path?u=o.input.file_path:o.input.pattern?u=o.input.pattern:o.input.query?u=o.input.query:o.input.description?u=o.input.description:o.input.prompt?u=o.input.prompt.substring(0,200):u=JSON.stringify(o.input).substring(0,200)),e.appendSessionLog(l,"tool",`${f}${u?": "+u:""}`)}}}catch{}n.content&&C.push(n.content)}if(n.type==="result"){const r=e.config.resultOnly??!0,c=(n.content||"").trim(),o=C.join(`
13
+ `).trim(),f=r&&c||o;if(f&&!A?.interrupted){try{e.appendSessionLog(l,"assistant",f)}catch{}const E=e.activeSessions.get(t.conversationId)?.lastSenderStaffId||t.startStaffId;_=!0,(0,messaging_1.sendClaudeResponseToDing)(e,(0,session_1.getReplyConversationId)(t),(0,session_1.getReplyWebhook)(t),E,f).catch(P=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",P))}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=[]}}}),v.stderr?.on("data",i=>{const n=i.toString();if(k+=n,R(),(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(m,`[${(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(m,`[${(0,session_1.timestamp)()}] [WARN]: ${n}`,"utf-8")}catch{}}else{console.error(`[Claude stderr]: ${n}`);try{fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [ERROR]: ${n}`,"utf-8")}catch{}}}),v.on("close",i=>{y=!0,d&&(clearInterval(d),d=null),console.log(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${i}`);try{fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u7ED3\u675F\uFF0C\u9000\u51FA\u7801: ${i}
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 (${C.length} \u6BB5)`),n.interrupted=!1,C=[],I(0);return}if(C.length>0){const c=C.join(`
15
+ `).trim();if(c){try{e.appendSessionLog(l,"assistant",c)}catch{}const o=n?.lastSenderStaffId||t.startStaffId;_=!0,(0,messaging_1.sendClaudeResponseToDing)(e,(0,session_1.getReplyConversationId)(t),(0,session_1.getReplyWebhook)(t),o,c).catch(f=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",f))}}if(i===0&&!_&&!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(m,`[${(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 c=n?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:c,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(i===0){I(0);return}const r=k+`
17
+ `+T;if((0,api_key_manager_1.isQuotaExhaustedError)(r)){const o=Date.now()-g<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)(T)}, stderr\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(k)}`),p(new RetryableApiError(o,r));return}if((0,api_key_manager_1.isAuthenticationError)(r)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u901A\u77E5\u7528\u6237`);const c=n?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:c,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)),I(i??1);return}if(isRetryableApiError(r)){const o=Date.now()-g<FAST_FAIL_THRESHOLD_MS;p(new RetryableApiError(o,r));return}if(isPermissionError(r)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u9700\u8981\u6388\u6743\uFF0C\u901A\u77E5\u7528\u6237`);const c=n?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:c,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)),I(i??1);return}if(t.claudeSessionId&&isConversationNotFoundError(r)){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`),p(new ConversationNotFoundError);return}if(isContextWindowExceededError(r)){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(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u5C06\u81EA\u52A8 /compact
18
+ `,"utf-8")}catch{}p(new ContextWindowExceededError);return}p(new Error(`Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${i}`))}),v.on("error",i=>{y=!0,d&&(clearInterval(d),d=null),console.error("Claude \u8FDB\u7A0B\u9519\u8BEF:",i),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [ERROR]: \u8FDB\u7A0B\u9519\u8BEF: ${i.message}
19
+ `,"utf-8"),p(i)})})}async function executeClaudeQuery(e,t,s,a){const{skill:$,agent:S,senderNick:h,senderStaffId:l}=a||{};let m=e.getSessionDir(t),g=`${m}/session.log`;const I=e.getConversationDir(t.conversationId);fs_1.default.mkdirSync(m,{recursive:!0});let p=null;const v=(0,api_key_manager_1.readApiKeyFromSettings)(I);if(v&&e.config.apiKeyCfg&&(p=e.config.apiKeyCfg.claudeSettings.find(n=>n.apiKey===v&&n.isValid)||null,p&&console.log(`[${(0,session_1.timestamp)()}] \u4ECE settings-ding.json \u6062\u590D Claude Setting: ${(0,api_key_manager_1.settingLabel)(p)}`)),!(0,api_key_manager_1.getForceEnabledSettingsPath)(I)&&e.config.apiKeyCfg&&(p=(0,api_key_manager_1.pickValidApiKey)(e),!p)){const n=l||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 M=h&&l?`${s} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${h}(${l})`:s;e.appendSessionLog(m,"user",M);const C="claude",T=["--permission-mode",a?.permissionMode??"bypassPermissions","--print","--output-format","stream-json","--verbose"];S&&T.push("--agent",S);const _=$?`/${$} ${M}`:M;let y=0,d=0,w=0;const R=[],F=e.activeSessions.get(t.conversationId),i=n=>{const r=e.activeSessions.get(t.conversationId);return!r||r!==F?(console.log(`[${(0,session_1.timestamp)()}] \u4F1A\u8BDD\u5DF2\u88AB\u7EC8\u6B62\uFF0C${n}`),!1):r.goonPending?(console.log(`[${(0,session_1.timestamp)()}] \u6536\u5230 /goon \u8BF7\u6C42\uFF0C${n}`),!1):!0};for(;;){if(!i("\u505C\u6B62\u91CD\u8BD5"))return;const n=y>0;if(d>=MAX_TOTAL_RETRIES||d>=3&&w>0&&Date.now()-w>MAX_RETRY_DURATION_MS){const f=d>=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 ${d} \u6B21\uFF09`;console.error(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF: ${f}`),fs_1.default.appendFileSync(g,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF\uFF0C${f}\uFF0C\u7EC8\u6B62\u91CD\u8BD5
20
+ `,"utf-8");const u=readLastLogLines(g,1),E=R.slice(-1)[0]||"",P=l||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:P,content:`\u{1F504} \u68C0\u6D4B\u5230 Claude \u9677\u5165\u65E0\u9650\u91CD\u8BD5\uFF0C\u5DF2\u7EC8\u6B62\uFF08${f}\uFF09
21
21
 
22
22
  \u{1F4CB} \u6700\u8FD1\u91CD\u8BD5\u8BB0\u5F55\uFF1A
23
- ${f}
23
+ ${E}
24
24
 
25
25
  \u{1F4DD} \u6700\u8FD1\u65E5\u5FD7\uFF1A
26
26
  \`\`\`
27
- ${n}
27
+ ${u}
28
28
  \`\`\`
29
29
 
30
- \u{1F4A1} \u53EF\u5C1D\u8BD5\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD\uFF0C\u6216 /end \u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD`});return}const i=[...M];e.claudeSessionId&&(i.push("--resume",e.claudeSessionId),R||console.log(`[${(0,session_1.timestamp)()}] \u6062\u590D Claude \u4F1A\u8BDD: ${e.claudeSessionId}`));const o=resolveClaudeSettingsPath(t,I,a?.settings);o&&i.push("--settings",o);let l;R?(l="\u7EE7\u7EED",console.log(`[${(0,session_1.timestamp)()}] \u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${g}/${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${g}/${MAX_FAST_FAIL})
31
- `,"utf-8")):l=P,console.log(`[${(0,session_1.timestamp)()}] \u6267\u884C Claude \u67E5\u8BE2[\u539F\u751Fclaude \u6A21\u5F0F]: ${b} ${i.join(" ")}`),t.debugLog(`\u53D1\u9001\u6D88\u606F: ${l.substring(0,100)}...`);try{await runClaudeOnce(t,e,i,b,I,l,R);return}catch(s){if(p=t.getSessionDir(e),m=`${p}/session.log`,s instanceof RetryableApiError){if(c++,C=C||Date.now(),(0,api_key_manager_1.isQuotaExhaustedError)(s.output)&&t.config.apiKeyCfg){if(T.push(`[${(0,session_1.timestamp)()}] 429 \u914D\u989D\u8017\u5C3D\uFF0C\u5C1D\u8BD5\u8F6E\u6362 Key`),d){const f=(0,api_key_manager_1.rotateApiKey)(t,d.apiKey);if(f){d=f,g=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)(f)}`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key
32
- `,"utf-8");continue}}const n=u||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:n,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(g++,g>=MAX_FAST_FAIL){if(d&&t.config.apiKeyCfg){const n=(0,api_key_manager_1.rotateApiKey)(t,d.apiKey);if(n){d=n,g=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)(n)}`),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
33
- `,"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
34
- `,"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 (${g}/${MAX_FAST_FAIL})`)}else g=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`);fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5
35
- `,"utf-8"),T.push(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`),await sleep(API_RETRY_DELAY_MS);continue}if(s instanceof ConversationNotFoundError){c++,C=C||Date.now(),T.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
36
- `,"utf-8"),e.claudeSessionId&&(e.claudeSessionId=void 0,t.updateSessionFile(e,{})),g=0;continue}if(s instanceof ContextWindowExceededError){c++,C=C||Date.now(),T.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
37
- `,"utf-8");const n=u||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:n,content:"\u{1F4E6} \u4E0A\u4E0B\u6587\u8D85\u957F\uFF0C\u6B63\u5728\u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u540E\u7EE7\u7EED..."});const f=[...M];e.claudeSessionId&&f.push("--resume",e.claudeSessionId);const y=resolveClaudeSettingsPath(t,I,a?.settings);y&&f.push("--settings",y);try{await runClaudeOnce(t,e,f,b,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(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C
38
- `,"utf-8")}catch(v){throw console.error(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u5931\u8D25:`,v),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u5931\u8D25: ${v instanceof Error?v.message:String(v)}
39
- `,"utf-8"),await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:n,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: ${v instanceof Error?v.message:String(v)}`)}g=0;continue}throw s}}}
30
+ \u{1F4A1} \u53EF\u5C1D\u8BD5\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD\uFF0C\u6216 /end \u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD`});return}const r=[...T];t.claudeSessionId&&(r.push("--resume",t.claudeSessionId),n||console.log(`[${(0,session_1.timestamp)()}] \u6062\u590D Claude \u4F1A\u8BDD: ${t.claudeSessionId}`));const c=resolveClaudeSettingsPath(e,I,a?.settings);c&&r.push("--settings",c);let o;n?(o="\u7EE7\u7EED",console.log(`[${(0,session_1.timestamp)()}] \u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${y}/${MAX_FAST_FAIL}\u6B21)`),fs_1.default.appendFileSync(g,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${y}/${MAX_FAST_FAIL})
31
+ `,"utf-8")):o=_,console.log(`[${(0,session_1.timestamp)()}] \u6267\u884C Claude \u67E5\u8BE2[\u539F\u751Fclaude \u6A21\u5F0F]: ${C} ${r.join(" ")}`),e.debugLog(`\u53D1\u9001\u6D88\u606F: ${o.substring(0,100)}...`);try{await runClaudeOnce(e,t,r,C,I,o,n);return}catch(f){if(m=e.getSessionDir(t),g=`${m}/session.log`,f instanceof RetryableApiError){if(d++,w=w||Date.now(),(0,api_key_manager_1.isQuotaExhaustedError)(f.output)&&e.config.apiKeyCfg){if(R.push(`[${(0,session_1.timestamp)()}] 429 \u914D\u989D\u8017\u5C3D\uFF0C\u5C1D\u8BD5\u8F6E\u6362 Key`),p){const E=(0,api_key_manager_1.rotateApiKey)(e,p.apiKey);if(E){p=E,y=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)(E)}`),fs_1.default.appendFileSync(g,`[${(0,session_1.timestamp)()}] [SYSTEM]: API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key
32
+ `,"utf-8");continue}}const u=l||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:u,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(f.isFastFail){if(y++,y>=MAX_FAST_FAIL){if(p&&e.config.apiKeyCfg){const u=(0,api_key_manager_1.rotateApiKey)(e,p.apiKey);if(u){p=u,y=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)(u)}`),fs_1.default.appendFileSync(g,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25\uFF0C\u5207\u6362\u5230\u65B0 Key
33
+ `,"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(g,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03
34
+ `,"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 (${y}/${MAX_FAST_FAIL})`)}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${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`);if(fs_1.default.appendFileSync(g,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5
35
+ `,"utf-8"),R.push(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`),await sleep(API_RETRY_DELAY_MS),!i("\u505C\u6B62\u5F53\u524D\u91CD\u8BD5"))return;continue}if(f instanceof ConversationNotFoundError){d++,w=w||Date.now(),R.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(g,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u4F1A\u8BDD\u5DF2\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD\u5E76\u91CD\u65B0\u53D1\u8D77
36
+ `,"utf-8"),t.claudeSessionId&&(t.claudeSessionId=void 0,e.updateSessionFile(t,{})),y=0;continue}if(f instanceof ContextWindowExceededError){d++,w=w||Date.now(),R.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(g,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587
37
+ `,"utf-8");const u=l||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:u,content:"\u{1F4E6} \u4E0A\u4E0B\u6587\u8D85\u957F\uFF0C\u6B63\u5728\u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u540E\u7EE7\u7EED..."});const E=[...T];t.claudeSessionId&&E.push("--resume",t.claudeSessionId);const P=resolveClaudeSettingsPath(e,I,a?.settings);P&&E.push("--settings",P);try{await runClaudeOnce(e,t,E,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(g,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C
38
+ `,"utf-8")}catch(b){throw console.error(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u5931\u8D25:`,b),fs_1.default.appendFileSync(g,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u5931\u8D25: ${b instanceof Error?b.message:String(b)}
39
+ `,"utf-8"),await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:u,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)}`)}y=0;continue}throw f}}}