cc-ding 0.0.5 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cc-ding.js +36 -1
- package/dist/resource/ocr-arm64 +0 -0
- package/dist/resource/ocr-x64 +0 -0
- package/dist/src/biz/api-key-manager.js +3 -1
- package/dist/src/biz/cc-ding-cli.js +85 -1
- package/dist/src/biz/claude-process.js +39 -1
- package/dist/src/biz/commands.js +6 -1
- package/dist/src/biz/cron.js +21 -1
- package/dist/src/biz/doctor.js +2 -1
- package/dist/src/biz/image.js +12 -1
- package/dist/src/biz/lock.js +1 -1
- package/dist/src/biz/messaging.js +6 -1
- package/dist/src/biz/notify.js +1 -0
- package/dist/src/biz/quote.js +5 -1
- package/dist/src/biz/recorder.js +9 -0
- package/dist/src/biz/session.js +13 -1
- package/dist/src/biz/task.js +24 -1
- package/dist/src/biz/types.js +1 -1
- package/dist/src/common.js +1 -1
- package/dist/src/constants.js +1 -1
- package/package.json +7 -5
- package/resource/ocr-arm64 +0 -0
- package/resource/ocr-x64 +0 -0
|
@@ -1 +1,39 @@
|
|
|
1
|
-
'use strict';const a3_0x296b7e=a3_0x4d0a;(function(_0x51455f,_0x524c0f){const _0x135bf4=a3_0x4d0a,_0x5322c5=_0x51455f();while(!![]){try{const _0x512d8e=parseInt(_0x135bf4(0x1ab))/0x1+-parseInt(_0x135bf4(0x1b9))/0x2*(parseInt(_0x135bf4(0x19e))/0x3)+-parseInt(_0x135bf4(0x182))/0x4+-parseInt(_0x135bf4(0x1ae))/0x5*(parseInt(_0x135bf4(0x195))/0x6)+-parseInt(_0x135bf4(0x112))/0x7+parseInt(_0x135bf4(0x187))/0x8*(parseInt(_0x135bf4(0x172))/0x9)+parseInt(_0x135bf4(0x1a5))/0xa*(parseInt(_0x135bf4(0x1bc))/0xb);if(_0x512d8e===_0x524c0f)break;else _0x5322c5['push'](_0x5322c5['shift']());}catch(_0x209236){_0x5322c5['push'](_0x5322c5['shift']());}}}(a3_0x3a88,0xc105b));var __importDefault=this&&this['__importDefault']||function(_0x23e370){return _0x23e370&&_0x23e370['__esModule']?_0x23e370:{'default':_0x23e370};};Object['defineProperty'](exports,a3_0x296b7e(0x141),{'value':!![]}),exports['resolveClaudeSettingsPath']=resolveClaudeSettingsPath,exports['isRetryableApiError']=isRetryableApiError,exports[a3_0x296b7e(0x19b)]=parseClaudeStreamLine,exports[a3_0x296b7e(0x12d)]=interruptClaudeProcess,exports['executeClaudeQuery']=executeClaudeQuery;const fs_1=__importDefault(require('fs')),path_1=__importDefault(require('path')),readline_1=__importDefault(require(a3_0x296b7e(0x1af))),child_process_1=require('child_process'),messaging_1=require(a3_0x296b7e(0x163)),session_1=require('./session'),api_key_manager_1=require(a3_0x296b7e(0x128)),MAX_FAST_FAIL=0x14,API_RETRY_DELAY_MS=0x2710,FAST_FAIL_THRESHOLD_MS=0x2710;function resolveClaudeSettingsPath(_0x548b3f,_0x9babb6,_0x16dca6){const _0x5767e7=a3_0x296b7e,_0x53a933=(0x0,api_key_manager_1[_0x5767e7(0x171)])(_0x9babb6);if(_0x53a933)return _0x53a933;if(_0x548b3f[_0x5767e7(0x119)][_0x5767e7(0x133)]){const _0x4eaa0e=(0x0,api_key_manager_1['readApiKeyFromSettings'])(_0x9babb6);let _0x5a410c=null;_0x4eaa0e&&(_0x5a410c=_0x548b3f[_0x5767e7(0x119)][_0x5767e7(0x133)][_0x5767e7(0x18a)][_0x5767e7(0x1b1)](_0x5572d2=>_0x5572d2[_0x5767e7(0x1b2)]===_0x4eaa0e&&_0x5572d2['isValid'])||null);!_0x5a410c&&(_0x5a410c=(0x0,api_key_manager_1['pickValidApiKey'])(_0x548b3f));if(_0x5a410c)return(0x0,api_key_manager_1['ensureSettingsWithApiKey'])(_0x9babb6,_0x5a410c);}if(_0x548b3f[_0x5767e7(0x119)][_0x5767e7(0x133)])return undefined;if(_0x16dca6)return _0x16dca6;const _0x1fbb1f=path_1['default'][_0x5767e7(0x130)](_0x9babb6,_0x5767e7(0x199),_0x5767e7(0x1b5));if(fs_1[_0x5767e7(0x16f)][_0x5767e7(0x115)](_0x1fbb1f))return console['log']('['+(0x0,session_1[_0x5767e7(0x138)])()+_0x5767e7(0x12a)+_0x1fbb1f),_0x1fbb1f;return undefined;}function a3_0x3a88(){const _0x22a13e=['lastSenderStaffId','content','output','.claude','subtype','parseClaudeStreamLine','SIGINT','command','3KXxRmD','push','input',']\x20[SYSTEM]:\x20TPM\x20限流,','\x20(重试)','settingLabel','权限不足','10VmnJoe','description','getSessionDir','system','user','trim','1292839zwGtFq','permission_required','Claude\x20进程退出,代码:\x20','281330rpizKY','readline','toString','find','apiKey','--verbose','init','settings.json','requests\x20per\x20minute','catch','isFastFail','1283038TSaWdX','Claude\x20stdout:\x20','需要授权','14930949dGjxxV','isAuthenticationError','3459197XcMHhP','some','--resume','existsSync','--permission-mode',']\x20用户主动中断,忽略错误',']\x20检测到认证错误(401),通知用户','config','claudeSessionId','/session.log','rotateApiKey','session_id',']\x20[ERROR]:\x20','currentProcess','now',']\x20执行\x20Claude\x20查询[原生claude\x20模式]:\x20','overloaded','stringify','log','没有权限',']\x20TPM\x20限流连续快速失败\x20','prompt','./api-key-manager','TPM\x20限流,快速失败连续\x20',']\x20自动检测到\x20settings.json:\x20','stdout','not\x20authorized','interruptClaudeProcess','utf-8','conversationId','join','authorize','warn','apiKeyCfg','assistant',']\x20检测到\x20TPM\x20限流(快速失败),','thinking','tokens\x20per\x20minute','timestamp',']\x20Claude\x20返回了空的\x20result\x20且\x20responseBuffer\x20也为空,无内容可发送','error','length','tool_use',']\x20[SYSTEM]:\x20Claude\x20查询启动',']\x20TPM\x20限流快速失败连续','claude','includes','__esModule','requires\x20permission','spawn','getReplyWebhook',']\x20[SYSTEM]:\x20Claude\x20会话已失效,清除旧会话并重新发起\x0a',']\x20发送\x22继续\x22重试\x20(快速失败连续','kill','appendSessionLog','activeSessions','settings','close','tool','too\x20many\x20requests','result','toLowerCase','stderr','getConversationDir','permission\x20denied','\x0a```','发送钉钉消息失败:',']\x20Claude\x20进程退出,代码:\x20','write','readApiKeyFromSettings','message','parse',']\x20[WARN]:\x20','capacity','--agent','type','appendFileSync','rpm\x20limit','mkdirSync','has','RetryableApiError','./messaging','⚠️\x20Claude\x20需要授权,请人工介入',']\x20Claude\x20会话已失效:\x20','data','ratelimit','line','text','isArray','file_path',']\x20检测到需要授权,通知用户','sendClaudeResponseToDing','Claude\x20进程错误:','default','createInterface','getForceEnabledSettingsPath','9FMFBao','⚠️\x20认证失败(401),API\x20Key\x20无效或服务未授权,请检查配置','ConversationNotFoundError','--output-format','includeThinking','发送消息:\x20','debugLog','stream-json','pipe','s\x20后重试\x0a','...',']\x20[SYSTEM]:\x20API\x20Key\x20配额耗尽(429),切换到新\x20Key\x0a','bypassPermissions','test','query','Retryable\x20API\x20error\x20(TPM\x20limit\x20etc.)','24984FYUJMN','⚠️\x20Claude\x20处理完成但未返回任何内容,请重试或换种方式提问','isQuotaExhaustedError','sessionId','interrupted','1460904zXUROV','startStaffId','getReplyConversationId','claudeSettings','pattern','add','access\x20denied','get','substring','unknown','needs\x20permission','sendDingMessage',']\x20从\x20settings-ding.json\x20恢复\x20Claude\x20Setting:\x20',']\x20Claude\x20进程正常退出但未产生任何回复内容','96MApDuz'];a3_0x3a88=function(){return _0x22a13e;};return a3_0x3a88();}function a3_0x4d0a(_0x2bb193,_0x578fe2){_0x2bb193=_0x2bb193-0x111;const _0x3a8877=a3_0x3a88();let _0x4d0a0e=_0x3a8877[_0x2bb193];return _0x4d0a0e;}function isRetryableApiError(_0x1be766){const _0xb89e94=a3_0x296b7e;if(/\b429\b/[_0xb89e94(0x17f)](_0x1be766)&&!(0x0,api_key_manager_1[_0xb89e94(0x184)])(_0x1be766))return!![];if(/API\s*Error.*422/i['test'](_0x1be766))return!![];if(/\b422\b.*(?:TPM|额度超限|rate\s*limit|tokens?\s*per\s*minute)/i['test'](_0x1be766))return!![];if(/(?:TPM|额度超限).*\b422\b/i['test'](_0x1be766))return!![];const _0x11f469=_0x1be766['toLowerCase'](),_0x34b850=['rate\x20limit','rate_limit',_0xb89e94(0x167),_0xb89e94(0x14d),_0xb89e94(0x137),_0xb89e94(0x1b6),_0xb89e94(0x15f),_0xb89e94(0x122),_0xb89e94(0x15b),'temporarily\x20unavailable'];return _0x34b850['some'](_0x27c5cd=>_0x11f469[_0xb89e94(0x140)](_0x27c5cd));}function sleep(_0x32adb5){return new Promise(_0x2b79a7=>setTimeout(_0x2b79a7,_0x32adb5));}class RetryableApiError extends Error{constructor(_0x4b72ec,_0x2b9749=''){const _0x594ac1=a3_0x296b7e;super(_0x594ac1(0x181)+(_0x4b72ec?'\x20[fast\x20fail]':'')),this['name']=_0x594ac1(0x162),this['isFastFail']=_0x4b72ec,this[_0x594ac1(0x198)]=_0x2b9749;}}class ConversationNotFoundError extends Error{constructor(){const _0x48e856=a3_0x296b7e;super('Claude\x20conversation\x20not\x20found'),this['name']=_0x48e856(0x174);}}function isPermissionError(_0x56e3ae){const _0x2b9204=a3_0x296b7e,_0x13849b=_0x56e3ae[_0x2b9204(0x14f)](),_0x49b9b0=[_0x2b9204(0x152),_0x2b9204(0x1ac),_0x2b9204(0x191),_0x2b9204(0x142),'authorization\x20required',_0x2b9204(0x131),_0x2b9204(0x12c),_0x2b9204(0x18d),_0x2b9204(0x1bb),_0x2b9204(0x1a4),_0x2b9204(0x125)];return _0x49b9b0[_0x2b9204(0x113)](_0x507657=>_0x13849b[_0x2b9204(0x140)](_0x507657));}function isConversationNotFoundError(_0x5eeb23){const _0x59bb51=a3_0x296b7e;return/no conversation found with session id/i[_0x59bb51(0x17f)](_0x5eeb23);}function parseClaudeStreamLine(_0x2e4617,_0x45a4a0=![]){const _0x211b40=a3_0x296b7e;if(!_0x2e4617[_0x211b40(0x1aa)]())return null;try{const _0x29e78d=JSON[_0x211b40(0x159)](_0x2e4617);if(_0x29e78d[_0x211b40(0x15d)]==='system'&&_0x29e78d[_0x211b40(0x19a)]===_0x211b40(0x1b4)&&_0x29e78d[_0x211b40(0x11d)])return{'type':_0x211b40(0x1a8),'sessionId':_0x29e78d[_0x211b40(0x11d)]};if(_0x29e78d[_0x211b40(0x15d)]===_0x211b40(0x134)){const _0xac971a=_0x29e78d[_0x211b40(0x158)]?.['content'];if(Array['isArray'](_0xac971a)){const _0x1c0027=[];for(const _0x47137e of _0xac971a){if(_0x47137e[_0x211b40(0x15d)]==='text'&&_0x47137e['text'])_0x1c0027[_0x211b40(0x19f)](_0x47137e[_0x211b40(0x169)]);else _0x47137e[_0x211b40(0x15d)]===_0x211b40(0x136)&&_0x47137e[_0x211b40(0x136)]&&_0x45a4a0&&_0x1c0027[_0x211b40(0x19f)]('💭\x20**思考过程**\x0a```\x0a'+_0x47137e[_0x211b40(0x136)]+_0x211b40(0x153));}if(_0x1c0027[_0x211b40(0x13b)]>0x0)return{'type':_0x211b40(0x134),'content':_0x1c0027[_0x211b40(0x130)]('\x0a')};}else{if(_0x29e78d[_0x211b40(0x197)])return{'type':'assistant','content':typeof _0x29e78d[_0x211b40(0x197)]==='string'?_0x29e78d[_0x211b40(0x197)]:JSON[_0x211b40(0x123)](_0x29e78d[_0x211b40(0x197)])};}return{'type':'assistant'};}if(_0x29e78d[_0x211b40(0x15d)]==='result'){const _0x364298=_0x29e78d[_0x211b40(0x14e)]||'';return{'type':_0x211b40(0x14e),'content':typeof _0x364298==='string'?_0x364298:JSON[_0x211b40(0x123)](_0x364298)};}return{'type':_0x29e78d[_0x211b40(0x15d)]||'unknown'};}catch{return{'type':_0x211b40(0x169),'content':_0x2e4617};}}function interruptClaudeProcess(_0x413ee7,_0x34c327){const _0x3bba5e=a3_0x296b7e;if(!_0x413ee7[_0x3bba5e(0x11f)])return![];return console[_0x3bba5e(0x124)]('['+(0x0,session_1[_0x3bba5e(0x138)])()+']\x20'+_0x34c327),_0x413ee7[_0x3bba5e(0x186)]=!![],_0x413ee7[_0x3bba5e(0x11f)][_0x3bba5e(0x147)](_0x3bba5e(0x19c)),!![];}function runClaudeOnce(_0x512ffa,_0x5ecd05,_0x460e32,_0x1effd8,_0x2dd3b0,_0x10aa34,_0x40be32){const _0xac5f48=a3_0x296b7e;let _0x839b91=_0x512ffa[_0xac5f48(0x1a7)](_0x5ecd05),_0x3ddd19=_0x839b91+_0xac5f48(0x11b);!fs_1[_0xac5f48(0x16f)][_0xac5f48(0x115)](_0x839b91)&&fs_1[_0xac5f48(0x16f)][_0xac5f48(0x160)](_0x839b91,{'recursive':!![]});const _0x1ae1e5=Date[_0xac5f48(0x120)]();return new Promise((_0xb1d9aa,_0x54d565)=>{const _0x37a9b4=_0xac5f48,_0x2c4b10=(0x0,child_process_1[_0x37a9b4(0x143)])(_0x1effd8,_0x460e32,{'cwd':_0x2dd3b0,'stdio':[_0x37a9b4(0x17a),'pipe',_0x37a9b4(0x17a)]}),_0x7404f4=_0x512ffa['activeSessions'][_0x37a9b4(0x18e)](_0x5ecd05['conversationId']);_0x7404f4&&(_0x7404f4[_0x37a9b4(0x11f)]=_0x2c4b10);fs_1[_0x37a9b4(0x16f)][_0x37a9b4(0x15e)](_0x3ddd19,'['+(0x0,session_1[_0x37a9b4(0x138)])()+_0x37a9b4(0x13d)+(_0x40be32?_0x37a9b4(0x1a2):'')+'\x0a',_0x37a9b4(0x12e)),_0x2c4b10['stdin']?.[_0x37a9b4(0x156)](_0x10aa34+'\x0a'),_0x2c4b10['stdin']?.['end']();let _0x5c8626=!_0x40be32&&!!_0x5ecd05[_0x37a9b4(0x11a)],_0x48fe7f=[],_0x3f1770='',_0x4ea2f1='',_0xc54f86=![];const _0x315011=new Set(),_0x2e8dee=readline_1[_0x37a9b4(0x16f)][_0x37a9b4(0x170)]({'input':_0x2c4b10[_0x37a9b4(0x12b)]});_0x2e8dee['on'](_0x37a9b4(0x168),_0x33c97c=>{const _0xceb9d9=_0x37a9b4;_0x4ea2f1+=_0x33c97c+'\x0a',_0x512ffa[_0xceb9d9(0x178)](_0xceb9d9(0x1ba)+_0x33c97c[_0xceb9d9(0x18f)](0x0,0xc8)+(_0x33c97c[_0xceb9d9(0x13b)]>0xc8?'...':''));if(_0x512ffa['config']['debug'])try{fs_1['default'][_0xceb9d9(0x15e)](_0x3ddd19,'['+(0x0,session_1[_0xceb9d9(0x138)])()+']\x20[RAW]:\x20'+_0x33c97c+'\x0a',_0xceb9d9(0x12e));}catch{}const _0x459f24=parseClaudeStreamLine(_0x33c97c,_0x512ffa[_0xceb9d9(0x119)][_0xceb9d9(0x176)]??![]);if(_0x459f24){_0x459f24[_0xceb9d9(0x15d)]===_0xceb9d9(0x1a8)&&_0x459f24['sessionId']&&!_0x5c8626&&(_0x512ffa['updateSessionFile'](_0x5ecd05,{'claudeSessionId':_0x459f24[_0xceb9d9(0x185)]}),_0x5c8626=!![],_0x839b91=_0x512ffa[_0xceb9d9(0x1a7)](_0x5ecd05),_0x3ddd19=_0x839b91+_0xceb9d9(0x11b));if(_0x459f24[_0xceb9d9(0x15d)]===_0xceb9d9(0x134)){try{const _0x419ff8=JSON[_0xceb9d9(0x159)](_0x33c97c),_0x1b10f8=_0x419ff8?.[_0xceb9d9(0x158)]?.['content'];if(Array[_0xceb9d9(0x16a)](_0x1b10f8))for(const _0x3dd178 of _0x1b10f8){if(_0x3dd178[_0xceb9d9(0x15d)]===_0xceb9d9(0x13c)&&_0x3dd178['id']&&!_0x315011[_0xceb9d9(0x161)](_0x3dd178['id'])){_0x315011[_0xceb9d9(0x18c)](_0x3dd178['id']);const _0x2b1662=_0x3dd178['name']||_0xceb9d9(0x190);let _0xbbc96a='';if(_0x3dd178[_0xceb9d9(0x1a0)]){if(_0x3dd178[_0xceb9d9(0x1a0)][_0xceb9d9(0x19d)])_0xbbc96a=_0x3dd178[_0xceb9d9(0x1a0)][_0xceb9d9(0x19d)][_0xceb9d9(0x18f)](0x0,0xc8);else{if(_0x3dd178[_0xceb9d9(0x1a0)]['file_path'])_0xbbc96a=_0x3dd178[_0xceb9d9(0x1a0)][_0xceb9d9(0x16b)];else{if(_0x3dd178[_0xceb9d9(0x1a0)][_0xceb9d9(0x18b)])_0xbbc96a=_0x3dd178['input']['pattern'];else{if(_0x3dd178[_0xceb9d9(0x1a0)][_0xceb9d9(0x180)])_0xbbc96a=_0x3dd178[_0xceb9d9(0x1a0)]['query'];else{if(_0x3dd178[_0xceb9d9(0x1a0)][_0xceb9d9(0x1a6)])_0xbbc96a=_0x3dd178[_0xceb9d9(0x1a0)]['description'];else{if(_0x3dd178['input'][_0xceb9d9(0x127)])_0xbbc96a=_0x3dd178['input'][_0xceb9d9(0x127)][_0xceb9d9(0x18f)](0x0,0xc8);else _0xbbc96a=JSON['stringify'](_0x3dd178[_0xceb9d9(0x1a0)])[_0xceb9d9(0x18f)](0x0,0xc8);}}}}}}_0x512ffa[_0xceb9d9(0x148)](_0x839b91,_0xceb9d9(0x14c),''+_0x2b1662+(_0xbbc96a?':\x20'+_0xbbc96a:''));}}}catch{}_0x459f24[_0xceb9d9(0x197)]&&_0x48fe7f['push'](_0x459f24['content']);}if(_0x459f24[_0xceb9d9(0x15d)]===_0xceb9d9(0x14e)){const _0x2b809e=_0x512ffa[_0xceb9d9(0x119)]['resultOnly']??!![],_0x5c314f=(_0x459f24['content']||'')[_0xceb9d9(0x1aa)](),_0x4a42f7=_0x48fe7f['join']('\x0a')[_0xceb9d9(0x1aa)](),_0x38ef62=_0x2b809e?_0x5c314f||_0x4a42f7:_0x4a42f7;if(_0x38ef62){try{_0x512ffa[_0xceb9d9(0x148)](_0x839b91,'assistant',_0x38ef62);}catch{}const _0x4680d6=_0x512ffa[_0xceb9d9(0x149)][_0xceb9d9(0x18e)](_0x5ecd05[_0xceb9d9(0x12f)]),_0x11825e=_0x4680d6?.[_0xceb9d9(0x196)]||_0x5ecd05[_0xceb9d9(0x188)];_0xc54f86=!![],(0x0,messaging_1['sendClaudeResponseToDing'])(_0x512ffa,(0x0,session_1['getReplyConversationId'])(_0x5ecd05),(0x0,session_1[_0xceb9d9(0x144)])(_0x5ecd05),_0x11825e,_0x38ef62)[_0xceb9d9(0x1b7)](_0x2d875d=>console['error'](_0xceb9d9(0x154),_0x2d875d));}else console[_0xceb9d9(0x132)]('['+(0x0,session_1['timestamp'])()+_0xceb9d9(0x139));_0x48fe7f=[];}}}),_0x2c4b10[_0x37a9b4(0x150)]?.['on'](_0x37a9b4(0x166),_0x1bed29=>{const _0x12943f=_0x37a9b4,_0x56b6e8=_0x1bed29[_0x12943f(0x1b0)]();_0x3f1770+=_0x56b6e8;if((0x0,api_key_manager_1[_0x12943f(0x184)])(_0x56b6e8)){console[_0x12943f(0x124)]('['+(0x0,session_1[_0x12943f(0x138)])()+']\x20[Claude\x20stderr]\x20配额耗尽错误(429):\x20'+_0x56b6e8['trim']());try{fs_1['default'][_0x12943f(0x15e)](_0x3ddd19,'['+(0x0,session_1[_0x12943f(0x138)])()+']\x20[WARN]:\x20'+_0x56b6e8,_0x12943f(0x12e));}catch{}}else{if(isRetryableApiError(_0x56b6e8)){console[_0x12943f(0x124)]('['+(0x0,session_1['timestamp'])()+']\x20[Claude\x20stderr]\x20可重试API错误(422\x20TPM限流):\x20'+_0x56b6e8[_0x12943f(0x1aa)]());try{fs_1[_0x12943f(0x16f)][_0x12943f(0x15e)](_0x3ddd19,'['+(0x0,session_1[_0x12943f(0x138)])()+_0x12943f(0x15a)+_0x56b6e8,_0x12943f(0x12e));}catch{}}else{console[_0x12943f(0x13a)]('[Claude\x20stderr]:\x20'+_0x56b6e8);try{fs_1[_0x12943f(0x16f)][_0x12943f(0x15e)](_0x3ddd19,'['+(0x0,session_1['timestamp'])()+_0x12943f(0x11e)+_0x56b6e8,_0x12943f(0x12e));}catch{}}}}),_0x2c4b10['on'](_0x37a9b4(0x14b),_0x18c197=>{const _0x259e56=_0x37a9b4;console[_0x259e56(0x124)]('['+(0x0,session_1[_0x259e56(0x138)])()+_0x259e56(0x155)+_0x18c197);try{fs_1['default'][_0x259e56(0x15e)](_0x3ddd19,'['+(0x0,session_1['timestamp'])()+']\x20[SYSTEM]:\x20Claude\x20查询结束,退出码:\x20'+_0x18c197+'\x0a',_0x259e56(0x12e));}catch{}const _0x5703b3=_0x512ffa[_0x259e56(0x149)][_0x259e56(0x18e)](_0x5ecd05[_0x259e56(0x12f)]);_0x5703b3&&(_0x5703b3['currentProcess']=undefined);if(_0x48fe7f['length']>0x0){const _0x15f997=_0x48fe7f[_0x259e56(0x130)]('\x0a')[_0x259e56(0x1aa)]();if(_0x15f997){try{_0x512ffa['appendSessionLog'](_0x839b91,_0x259e56(0x134),_0x15f997);}catch{}const _0x559a16=_0x5703b3?.['lastSenderStaffId']||_0x5ecd05[_0x259e56(0x188)];_0xc54f86=!![],(0x0,messaging_1[_0x259e56(0x16d)])(_0x512ffa,(0x0,session_1['getReplyConversationId'])(_0x5ecd05),(0x0,session_1[_0x259e56(0x144)])(_0x5ecd05),_0x559a16,_0x15f997)[_0x259e56(0x1b7)](_0x286359=>console[_0x259e56(0x13a)](_0x259e56(0x154),_0x286359));}}if(_0x18c197===0x0&&!_0xc54f86&&!_0x5703b3?.[_0x259e56(0x186)]){console[_0x259e56(0x132)]('['+(0x0,session_1[_0x259e56(0x138)])()+_0x259e56(0x194));try{fs_1['default']['appendFileSync'](_0x3ddd19,'['+(0x0,session_1[_0x259e56(0x138)])()+']\x20[WARN]:\x20Claude\x20进程正常退出但未产生任何回复内容\x0a',_0x259e56(0x12e));}catch{}const _0x11bc3f=_0x5703b3?.[_0x259e56(0x196)]||_0x5ecd05[_0x259e56(0x188)];(0x0,messaging_1['sendDingMessage'])(_0x512ffa,{'conversationId':(0x0,session_1[_0x259e56(0x189)])(_0x5ecd05),'sessionWebhook':(0x0,session_1[_0x259e56(0x144)])(_0x5ecd05),'atUserId':_0x11bc3f,'content':_0x259e56(0x183)})[_0x259e56(0x1b7)](_0x523e40=>console[_0x259e56(0x13a)]('发送钉钉消息失败:',_0x523e40));}if(_0x18c197===0x0){_0xb1d9aa(0x0);return;}if(_0x5703b3?.[_0x259e56(0x186)]){console['log']('['+(0x0,session_1[_0x259e56(0x138)])()+_0x259e56(0x117)),_0x5703b3[_0x259e56(0x186)]=![],_0xb1d9aa(0x0);return;}const _0x39f0f0=_0x3f1770+'\x0a'+_0x4ea2f1;if((0x0,api_key_manager_1[_0x259e56(0x184)])(_0x39f0f0)){const _0x545358=Date[_0x259e56(0x120)]()-_0x1ae1e5,_0xfadd16=_0x545358<FAST_FAIL_THRESHOLD_MS;console[_0x259e56(0x124)]('['+(0x0,session_1['timestamp'])()+']\x20检测到配额耗尽错误(429),stdout匹配='+(0x0,api_key_manager_1[_0x259e56(0x184)])(_0x4ea2f1)+',\x20stderr匹配='+(0x0,api_key_manager_1[_0x259e56(0x184)])(_0x3f1770)),_0x54d565(new RetryableApiError(_0xfadd16,_0x39f0f0));return;}if((0x0,api_key_manager_1[_0x259e56(0x111)])(_0x39f0f0)){console[_0x259e56(0x124)]('['+(0x0,session_1[_0x259e56(0x138)])()+_0x259e56(0x118));const _0x5aebb8=_0x5703b3?.['lastSenderStaffId']||_0x5ecd05[_0x259e56(0x188)];(0x0,messaging_1[_0x259e56(0x192)])(_0x512ffa,{'conversationId':(0x0,session_1[_0x259e56(0x189)])(_0x5ecd05),'sessionWebhook':(0x0,session_1[_0x259e56(0x144)])(_0x5ecd05),'atUserId':_0x5aebb8,'content':_0x259e56(0x173)})['catch'](_0x5ae09d=>console['error']('发送钉钉消息失败:',_0x5ae09d)),_0xb1d9aa(_0x18c197??0x1);return;}if(isRetryableApiError(_0x39f0f0)){const _0x2806d0=Date[_0x259e56(0x120)]()-_0x1ae1e5,_0x47e9d7=_0x2806d0<FAST_FAIL_THRESHOLD_MS;_0x54d565(new RetryableApiError(_0x47e9d7,_0x39f0f0));return;}if(isPermissionError(_0x39f0f0)){console[_0x259e56(0x124)]('['+(0x0,session_1[_0x259e56(0x138)])()+_0x259e56(0x16c));const _0x1736a3=_0x5703b3?.[_0x259e56(0x196)]||_0x5ecd05[_0x259e56(0x188)];(0x0,messaging_1['sendDingMessage'])(_0x512ffa,{'conversationId':(0x0,session_1[_0x259e56(0x189)])(_0x5ecd05),'sessionWebhook':(0x0,session_1[_0x259e56(0x144)])(_0x5ecd05),'atUserId':_0x1736a3,'content':_0x259e56(0x164)})[_0x259e56(0x1b7)](_0x1c0aec=>console['error'](_0x259e56(0x154),_0x1c0aec)),_0xb1d9aa(_0x18c197??0x1);return;}if(_0x5ecd05['claudeSessionId']&&isConversationNotFoundError(_0x39f0f0)){console[_0x259e56(0x124)]('['+(0x0,session_1[_0x259e56(0x138)])()+_0x259e56(0x165)+_0x5ecd05[_0x259e56(0x11a)]+',通知外层重新发起新会话'),_0x54d565(new ConversationNotFoundError());return;}_0x54d565(new Error(_0x259e56(0x1ad)+_0x18c197));}),_0x2c4b10['on'](_0x37a9b4(0x13a),_0x2823d8=>{const _0x272aae=_0x37a9b4;console[_0x272aae(0x13a)](_0x272aae(0x16e),_0x2823d8),fs_1['default']['appendFileSync'](_0x3ddd19,'['+(0x0,session_1[_0x272aae(0x138)])()+']\x20[ERROR]:\x20进程错误:\x20'+_0x2823d8[_0x272aae(0x158)]+'\x0a',_0x272aae(0x12e)),_0x54d565(_0x2823d8);});});}async function executeClaudeQuery(_0x263a41,_0x577d15,_0x4a443e,_0x53fdef){const _0x1de6cc=a3_0x296b7e,{skill:_0x38f4f5,agent:_0x245f69,senderNick:_0x3ff261,senderStaffId:_0x8ca160}=_0x53fdef||{};let _0x3a256c=_0x263a41[_0x1de6cc(0x1a7)](_0x577d15),_0xaa67b6=_0x3a256c+_0x1de6cc(0x11b);const _0x3a2a82=_0x263a41[_0x1de6cc(0x151)](_0x577d15[_0x1de6cc(0x12f)]);fs_1['default'][_0x1de6cc(0x160)](_0x3a256c,{'recursive':!![]});let _0x5baf19=null;const _0x4597ac=(0x0,api_key_manager_1[_0x1de6cc(0x157)])(_0x3a2a82);_0x4597ac&&_0x263a41[_0x1de6cc(0x119)]['apiKeyCfg']&&(_0x5baf19=_0x263a41['config'][_0x1de6cc(0x133)][_0x1de6cc(0x18a)]['find'](_0x91d791=>_0x91d791['apiKey']===_0x4597ac&&_0x91d791['isValid'])||null,_0x5baf19&&console['log']('['+(0x0,session_1[_0x1de6cc(0x138)])()+_0x1de6cc(0x193)+(0x0,api_key_manager_1[_0x1de6cc(0x1a3)])(_0x5baf19)));const _0xca352b=(0x0,api_key_manager_1[_0x1de6cc(0x171)])(_0x3a2a82);if(!_0xca352b&&_0x263a41[_0x1de6cc(0x119)][_0x1de6cc(0x133)]){_0x5baf19=(0x0,api_key_manager_1['pickValidApiKey'])(_0x263a41);if(!_0x5baf19){const _0x5ab7da=_0x8ca160||_0x577d15['startStaffId'];await(0x0,messaging_1[_0x1de6cc(0x192)])(_0x263a41,{'conversationId':(0x0,session_1[_0x1de6cc(0x189)])(_0x577d15),'sessionWebhook':(0x0,session_1['getReplyWebhook'])(_0x577d15),'atUserId':_0x5ab7da,'content':'⚠️\x20当前无可用配额(无可用\x20API\x20Key),请明天再试或联系管理员'});return;}}const _0x20d306=_0x3ff261&&_0x8ca160?_0x3ff261+'('+_0x8ca160+')':_0x1de6cc(0x190),_0xc72bb2=_0x4a443e+'\x20──\x20消息来自:\x20'+_0x20d306;_0x263a41['appendSessionLog'](_0x3a256c,_0x1de6cc(0x1a9),_0xc72bb2);const _0x41451d=_0x1de6cc(0x13f),_0x54a779=[_0x1de6cc(0x116),_0x1de6cc(0x17e),'--print',_0x1de6cc(0x175),_0x1de6cc(0x179),_0x1de6cc(0x1b3)];_0x245f69&&_0x54a779[_0x1de6cc(0x19f)](_0x1de6cc(0x15c),_0x245f69);const _0x4013d6=_0x38f4f5?'/'+_0x38f4f5+'\x20'+_0xc72bb2:_0xc72bb2;let _0x10e6fb=0x0;while(!![]){const _0x41b020=_0x10e6fb>0x0,_0x30e0b3=[..._0x54a779];_0x577d15['claudeSessionId']&&(_0x30e0b3[_0x1de6cc(0x19f)](_0x1de6cc(0x114),_0x577d15[_0x1de6cc(0x11a)]),!_0x41b020&&console[_0x1de6cc(0x124)]('['+(0x0,session_1['timestamp'])()+']\x20恢复\x20Claude\x20会话:\x20'+_0x577d15[_0x1de6cc(0x11a)]));const _0x4d7a84=resolveClaudeSettingsPath(_0x263a41,_0x3a2a82,_0x53fdef?.[_0x1de6cc(0x14a)]);_0x4d7a84&&_0x30e0b3[_0x1de6cc(0x19f)]('--settings',_0x4d7a84);let _0x10abc8;_0x41b020?(_0x10abc8='继续',console[_0x1de6cc(0x124)]('['+(0x0,session_1[_0x1de6cc(0x138)])()+_0x1de6cc(0x146)+_0x10e6fb+'/'+MAX_FAST_FAIL+'次)'),fs_1[_0x1de6cc(0x16f)][_0x1de6cc(0x15e)](_0xaa67b6,'['+(0x0,session_1[_0x1de6cc(0x138)])()+']\x20[SYSTEM]:\x20TPM\x20限流,发送\x22继续\x22重试\x20(快速失败连续'+_0x10e6fb+'/'+MAX_FAST_FAIL+')\x0a',_0x1de6cc(0x12e))):_0x10abc8=_0x4013d6;console[_0x1de6cc(0x124)]('['+(0x0,session_1[_0x1de6cc(0x138)])()+_0x1de6cc(0x121)+_0x41451d+'\x20'+_0x30e0b3['join']('\x20')),_0x263a41['debugLog'](_0x1de6cc(0x177)+_0x10abc8[_0x1de6cc(0x18f)](0x0,0x64)+_0x1de6cc(0x17c));try{await runClaudeOnce(_0x263a41,_0x577d15,_0x30e0b3,_0x41451d,_0x3a2a82,_0x10abc8,_0x41b020);return;}catch(_0x53996d){_0x3a256c=_0x263a41[_0x1de6cc(0x1a7)](_0x577d15),_0xaa67b6=_0x3a256c+_0x1de6cc(0x11b);if(_0x53996d instanceof RetryableApiError){if((0x0,api_key_manager_1[_0x1de6cc(0x184)])(_0x53996d[_0x1de6cc(0x198)])&&_0x263a41[_0x1de6cc(0x119)][_0x1de6cc(0x133)]){if(_0x5baf19){const _0x439108=(0x0,api_key_manager_1['rotateApiKey'])(_0x263a41,_0x5baf19[_0x1de6cc(0x1b2)]);if(_0x439108){_0x5baf19=_0x439108,_0x10e6fb=0x0,console[_0x1de6cc(0x124)]('['+(0x0,session_1[_0x1de6cc(0x138)])()+']\x20API\x20Key\x20配额耗尽(429),切换到新\x20Key:\x20'+(0x0,api_key_manager_1[_0x1de6cc(0x1a3)])(_0x439108)),fs_1[_0x1de6cc(0x16f)]['appendFileSync'](_0xaa67b6,'['+(0x0,session_1[_0x1de6cc(0x138)])()+_0x1de6cc(0x17d),_0x1de6cc(0x12e));continue;}}const _0x701beb=_0x8ca160||_0x577d15[_0x1de6cc(0x188)];await(0x0,messaging_1[_0x1de6cc(0x192)])(_0x263a41,{'conversationId':(0x0,session_1['getReplyConversationId'])(_0x577d15),'sessionWebhook':(0x0,session_1[_0x1de6cc(0x144)])(_0x577d15),'atUserId':_0x701beb,'content':'⚠️\x20当前无可用配额/API\x20Key,请明天再试或联系管理员'});return;}if(_0x53996d[_0x1de6cc(0x1b8)]){_0x10e6fb++;if(_0x10e6fb>=MAX_FAST_FAIL){if(_0x5baf19&&_0x263a41[_0x1de6cc(0x119)][_0x1de6cc(0x133)]){const _0x42db8c=(0x0,api_key_manager_1[_0x1de6cc(0x11c)])(_0x263a41,_0x5baf19[_0x1de6cc(0x1b2)]);if(_0x42db8c){_0x5baf19=_0x42db8c,_0x10e6fb=0x0,console[_0x1de6cc(0x124)]('['+(0x0,session_1[_0x1de6cc(0x138)])()+_0x1de6cc(0x126)+MAX_FAST_FAIL+'\x20次,切换到新\x20Key:\x20'+(0x0,api_key_manager_1[_0x1de6cc(0x1a3)])(_0x42db8c)),fs_1[_0x1de6cc(0x16f)][_0x1de6cc(0x15e)](_0xaa67b6,'['+(0x0,session_1[_0x1de6cc(0x138)])()+']\x20[SYSTEM]:\x20TPM\x20限流连续快速失败,切换到新\x20Key\x0a',_0x1de6cc(0x12e));continue;}}console[_0x1de6cc(0x124)]('['+(0x0,session_1[_0x1de6cc(0x138)])()+_0x1de6cc(0x13e)+MAX_FAST_FAIL+'次,放弃'),fs_1['default']['appendFileSync'](_0xaa67b6,'['+(0x0,session_1['timestamp'])()+']\x20[SYSTEM]:\x20TPM\x20限流快速失败连续'+MAX_FAST_FAIL+'次,放弃\x0a','utf-8');throw new Error(_0x1de6cc(0x129)+MAX_FAST_FAIL+'\x20次');}console['log']('['+(0x0,session_1[_0x1de6cc(0x138)])()+_0x1de6cc(0x135)+API_RETRY_DELAY_MS/0x3e8+'s\x20后重试\x20('+_0x10e6fb+'/'+MAX_FAST_FAIL+')');}else _0x10e6fb=0x0,console[_0x1de6cc(0x124)]('['+(0x0,session_1[_0x1de6cc(0x138)])()+']\x20检测到\x20TPM\x20限流(进程已运行一段时间),重置快速失败计数,'+API_RETRY_DELAY_MS/0x3e8+'s\x20后重试');fs_1[_0x1de6cc(0x16f)][_0x1de6cc(0x15e)](_0xaa67b6,'['+(0x0,session_1['timestamp'])()+_0x1de6cc(0x1a1)+API_RETRY_DELAY_MS/0x3e8+_0x1de6cc(0x17b),_0x1de6cc(0x12e)),await sleep(API_RETRY_DELAY_MS);continue;}if(_0x53996d instanceof ConversationNotFoundError){console[_0x1de6cc(0x124)]('['+(0x0,session_1['timestamp'])()+']\x20Claude\x20会话失效,清除\x20claudeSessionId\x20并重新发起'),fs_1[_0x1de6cc(0x16f)][_0x1de6cc(0x15e)](_0xaa67b6,'['+(0x0,session_1[_0x1de6cc(0x138)])()+_0x1de6cc(0x145),_0x1de6cc(0x12e));_0x577d15[_0x1de6cc(0x11a)]&&(_0x577d15[_0x1de6cc(0x11a)]=undefined,_0x263a41['updateSessionFile'](_0x577d15,{}));_0x10e6fb=0x0;continue;}throw _0x53996d;}}}
|
|
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**
|
|
4
|
+
\`\`\`
|
|
5
|
+
${S.thinking}
|
|
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
|
|
21
|
+
|
|
22
|
+
\u{1F4CB} \u6700\u8FD1\u91CD\u8BD5\u8BB0\u5F55\uFF1A
|
|
23
|
+
${f}
|
|
24
|
+
|
|
25
|
+
\u{1F4DD} \u6700\u8FD1\u65E5\u5FD7\uFF1A
|
|
26
|
+
\`\`\`
|
|
27
|
+
${n}
|
|
28
|
+
\`\`\`
|
|
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}}}
|
package/dist/src/biz/commands.js
CHANGED
|
@@ -1 +1,6 @@
|
|
|
1
|
-
'use strict';const a4_0x2c04fa=a4_0x4b4e;(function(_0x113ccc,_0x532c2d){const _0x217ba3=a4_0x4b4e,_0x3d0b40=_0x113ccc();while(!![]){try{const _0x56d54b=-parseInt(_0x217ba3(0x210))/0x1+parseInt(_0x217ba3(0x1bc))/0x2+-parseInt(_0x217ba3(0x1f3))/0x3+parseInt(_0x217ba3(0x18b))/0x4*(-parseInt(_0x217ba3(0x1af))/0x5)+parseInt(_0x217ba3(0x231))/0x6+-parseInt(_0x217ba3(0x225))/0x7*(parseInt(_0x217ba3(0x19e))/0x8)+-parseInt(_0x217ba3(0x1dd))/0x9;if(_0x56d54b===_0x532c2d)break;else _0x3d0b40['push'](_0x3d0b40['shift']());}catch(_0x4907ec){_0x3d0b40['push'](_0x3d0b40['shift']());}}}(a4_0x52ea,0x8f374));var __importDefault=this&&this['__importDefault']||function(_0x233b21){const _0x17c293=a4_0x4b4e;return _0x233b21&&_0x233b21[_0x17c293(0x186)]?_0x233b21:{'default':_0x233b21};};Object['defineProperty'](exports,'__esModule',{'value':!![]}),exports[a4_0x2c04fa(0x1f0)]=parseHelpCommand,exports[a4_0x2c04fa(0x1cb)]=parseCommandHelp,exports['getCommandByName']=getCommandByName,exports['formatHelpOverview']=formatHelpOverview,exports['formatCommandHelp']=formatCommandHelp,exports[a4_0x2c04fa(0x1c8)]=parseEndCommand,exports['parseInfoCommand']=parseInfoCommand,exports['formatConversationInfo']=formatConversationInfo,exports[a4_0x2c04fa(0x235)]=formatGlobalConfig,exports[a4_0x2c04fa(0x19d)]=parseLogCommand,exports['parseLsCommand']=parseLsCommand,exports[a4_0x2c04fa(0x19b)]=findSubdirByName,exports[a4_0x2c04fa(0x1ae)]=getDirectoryStructure,exports[a4_0x2c04fa(0x20a)]=parseContinueSessionCommand,exports[a4_0x2c04fa(0x207)]=parseCronCommand,exports['parsePwdCommand']=parsePwdCommand,exports[a4_0x2c04fa(0x21a)]=parseVersionCommand,exports['parseMkdirCommand']=parseMkdirCommand,exports['parseTouchCommand']=parseTouchCommand,exports[a4_0x2c04fa(0x1d3)]=parseRmCommand,exports['parseOpenCommand']=parseOpenCommand,exports[a4_0x2c04fa(0x1ea)]=parseCleanCommand,exports[a4_0x2c04fa(0x245)]=parseResetApiKeyCfgCommand,exports['parseCfgCommand']=parseCfgCommand,exports[a4_0x2c04fa(0x1c4)]=parseBashCommand,exports[a4_0x2c04fa(0x19a)]=parseMqCommand,exports[a4_0x2c04fa(0x1ee)]=parseAuthCommand;const fs_1=__importDefault(require('fs')),path_1=__importDefault(require(a4_0x2c04fa(0x221))),COMMAND_REGISTRY=[{'name':a4_0x2c04fa(0x229),'description':a4_0x2c04fa(0x197),'usage':a4_0x2c04fa(0x229),'examples':[a4_0x2c04fa(0x229)],'category':'系统'},{'name':a4_0x2c04fa(0x1c3),'description':a4_0x2c04fa(0x1cf),'usage':'/info\x20[robot|session|task]','examples':[a4_0x2c04fa(0x1c3),a4_0x2c04fa(0x1bb),a4_0x2c04fa(0x1db),a4_0x2c04fa(0x1ce)],'category':'系统'},{'name':a4_0x2c04fa(0x21c),'description':a4_0x2c04fa(0x243),'usage':a4_0x2c04fa(0x1bf),'examples':['/log',a4_0x2c04fa(0x1d4)],'category':'会话'},{'name':a4_0x2c04fa(0x17c),'description':a4_0x2c04fa(0x1be),'usage':'/new\x20[初始消息]','examples':['/new','/new\x20帮我分析一下这个项目'],'category':'会话'},{'name':a4_0x2c04fa(0x1d9),'description':a4_0x2c04fa(0x1d1),'usage':'/resume\x20[会话ID]','examples':[a4_0x2c04fa(0x1d9),'/resume\x20abc123'],'category':'会话'},{'name':a4_0x2c04fa(0x217),'description':a4_0x2c04fa(0x192),'usage':a4_0x2c04fa(0x217),'examples':['/end'],'category':'会话'},{'name':a4_0x2c04fa(0x244),'description':a4_0x2c04fa(0x236),'usage':'/task\x20<任务描述>','examples':[a4_0x2c04fa(0x23b)],'category':'任务'},{'name':a4_0x2c04fa(0x1e9),'description':a4_0x2c04fa(0x1b4),'usage':a4_0x2c04fa(0x1cd),'examples':[a4_0x2c04fa(0x1e9),'/mq\x20-n\x201','/mq\x20-n\x203',a4_0x2c04fa(0x1a5)],'category':'任务'},{'name':a4_0x2c04fa(0x234),'description':a4_0x2c04fa(0x18c),'usage':a4_0x2c04fa(0x23f),'examples':[a4_0x2c04fa(0x1e2),'/cron\x200\x209\x20*\x20*\x20*\x20查看dima任务','/cron\x20list',a4_0x2c04fa(0x1a7),a4_0x2c04fa(0x1b2)],'category':'任务'},{'name':a4_0x2c04fa(0x1aa),'description':a4_0x2c04fa(0x21e),'usage':a4_0x2c04fa(0x1aa),'examples':[a4_0x2c04fa(0x1aa)],'category':'文件'},{'name':a4_0x2c04fa(0x1b8),'description':'查看工作目录结构','usage':a4_0x2c04fa(0x1e7),'examples':['/ls',a4_0x2c04fa(0x18a),a4_0x2c04fa(0x205)],'category':'文件'},{'name':'/mkdir','description':'在工作目录下创建文件夹(支持相对路径,不能超出工作目录范围)','usage':a4_0x2c04fa(0x1e5),'examples':[a4_0x2c04fa(0x17a),a4_0x2c04fa(0x201),a4_0x2c04fa(0x18d)],'category':'文件'},{'name':'/touch','description':'在工作目录下创建空文件(支持相对路径,不能超出工作目录范围)','usage':a4_0x2c04fa(0x187),'examples':[a4_0x2c04fa(0x20b),a4_0x2c04fa(0x188),a4_0x2c04fa(0x179)],'category':'文件'},{'name':a4_0x2c04fa(0x212),'description':'删除工作目录下的文件或目录(支持相对路径,不能超出工作目录范围)','usage':a4_0x2c04fa(0x1ca),'examples':[a4_0x2c04fa(0x18f),'/rm\x20src/old.ts',a4_0x2c04fa(0x184)],'category':'文件'},{'name':'/version','description':a4_0x2c04fa(0x228),'usage':a4_0x2c04fa(0x226),'examples':['/version'],'category':'系统'},{'name':a4_0x2c04fa(0x1a8),'description':a4_0x2c04fa(0x194),'usage':a4_0x2c04fa(0x1f8),'examples':[a4_0x2c04fa(0x1a8),a4_0x2c04fa(0x1da)],'category':'管理','ownerOnly':!![]},{'name':a4_0x2c04fa(0x1c9),'description':a4_0x2c04fa(0x181),'usage':a4_0x2c04fa(0x1c9),'examples':[a4_0x2c04fa(0x1c9)],'category':'管理','ownerOnly':!![]},{'name':a4_0x2c04fa(0x1ad),'description':a4_0x2c04fa(0x22a),'usage':a4_0x2c04fa(0x1ad),'examples':[a4_0x2c04fa(0x1ad)],'category':'管理','ownerOnly':!![]},{'name':a4_0x2c04fa(0x230),'description':a4_0x2c04fa(0x1ef),'usage':'/cfg\x20[--conversationId\x20xxx]\x20[--dingToken\x20xxx]\x20[--linkConversationId\x20yyy]\x20[--whiteUserList\x20138xxxx,139xxxx]\x20[--conversationTitle\x20名称]\x20[--atSender\x20true|false]\x20[--receiveReply\x20true|false]\x20[--preBash\x20\x22命令\x22]','examples':[a4_0x2c04fa(0x230),a4_0x2c04fa(0x19c),a4_0x2c04fa(0x1e4),a4_0x2c04fa(0x1e3),a4_0x2c04fa(0x242),'/cfg\x20--receiveReply\x20false',a4_0x2c04fa(0x191),a4_0x2c04fa(0x223)],'category':'管理','ownerOnly':!![]},{'name':a4_0x2c04fa(0x185),'description':a4_0x2c04fa(0x21b),'usage':'/bash\x20<命令>','examples':[a4_0x2c04fa(0x21d),a4_0x2c04fa(0x209),a4_0x2c04fa(0x219)],'category':'文件'},{'name':'/auth','description':a4_0x2c04fa(0x1e0),'usage':'/auth\x20[add|del\x20<手机号或userId>]','examples':[a4_0x2c04fa(0x1fd),a4_0x2c04fa(0x22e),a4_0x2c04fa(0x183)],'category':'管理','ownerOnly':!![]}],CATEGORY_DISPLAY=[{'category':'会话','icon':'💬'},{'category':'任务','icon':'📋'},{'category':'文件','icon':'📂'},{'category':'系统','icon':'⚙️'},{'category':'管理','icon':'🔧'}];function parseHelpCommand(_0x1ab63e){const _0x39c70f=a4_0x2c04fa;return _0x1ab63e[_0x39c70f(0x1a6)]()[_0x39c70f(0x22b)]()===_0x39c70f(0x229);}function parseCommandHelp(_0x464c74){const _0x39334b=a4_0x2c04fa,_0x4f95f6=_0x464c74[_0x39334b(0x1a6)](),_0x257881=_0x4f95f6[_0x39334b(0x233)](/^(\/\w+)\s+--help$/i);if(!_0x257881)return null;return _0x257881[0x1][_0x39334b(0x22b)]();}function getCommandByName(_0x1e78fe){const _0x25cda7=a4_0x2c04fa,_0x470eb4=_0x1e78fe['toLowerCase']();return COMMAND_REGISTRY[_0x25cda7(0x1fe)](_0xe5490d=>_0xe5490d['name'][_0x25cda7(0x22b)]()===_0x470eb4||_0xe5490d[_0x25cda7(0x216)]?.[_0x25cda7(0x1c2)](_0x39b13f=>_0x39b13f[_0x25cda7(0x22b)]()===_0x470eb4));}function formatHelpOverview(_0x494260,_0x4df8d9){const _0x44a026=a4_0x2c04fa,_0x21d83d=COMMAND_REGISTRY[_0x44a026(0x1a0)](_0x36017f=>_0x4df8d9||!_0x36017f[_0x44a026(0x1c1)]),_0x3810bb=[_0x44a026(0x1ed),'----',_0x44a026(0x1d0)+_0x494260,'-\x20**作者:**\x20yihuineng','-\x20**Github:**\x20https://github.com/yihuineng/cc-ding',_0x44a026(0x196)];for(const {category:_0x2c5487,icon:_0x4227a6}of CATEGORY_DISPLAY){const _0x4446d2=_0x21d83d['filter'](_0x1e73a8=>_0x1e73a8[_0x44a026(0x1f7)]===_0x2c5487);if(_0x4446d2[_0x44a026(0x1a9)]===0x0)continue;_0x3810bb['push'](_0x4227a6+'\x20**'+_0x2c5487+'**');for(const _0x54dffa of _0x4446d2){_0x3810bb[_0x44a026(0x1f9)](_0x44a026(0x1f1)+_0x54dffa[_0x44a026(0x195)]+'`\x20'+_0x54dffa['description']);}_0x3810bb['push']('');}return _0x3810bb[_0x44a026(0x1f9)](_0x44a026(0x204)),_0x3810bb[_0x44a026(0x1dc)]('\x0a');}function formatCommandHelp(_0x2f3141){const _0x396e86=a4_0x2c04fa,_0x4b2b50=[_0x396e86(0x175)+_0x2f3141[_0x396e86(0x195)],'','**描述:**\x20'+_0x2f3141[_0x396e86(0x1f5)],'',_0x396e86(0x1eb)+_0x2f3141[_0x396e86(0x239)]+'`'];_0x2f3141[_0x396e86(0x216)]?.[_0x396e86(0x1a9)]&&_0x4b2b50['push']('',_0x396e86(0x240)+_0x2f3141[_0x396e86(0x216)][_0x396e86(0x1dc)](',\x20'));_0x4b2b50[_0x396e86(0x1f9)]('',_0x396e86(0x199));for(const _0x46810b of _0x2f3141[_0x396e86(0x17b)]){_0x4b2b50[_0x396e86(0x1f9)]('-\x20`'+_0x46810b+'`');}return _0x4b2b50[_0x396e86(0x1dc)]('\x0a');}function parseEndCommand(_0x2c4c98){const _0xda1585=a4_0x2c04fa;return _0x2c4c98[_0xda1585(0x1a6)]()[_0xda1585(0x22b)]()===_0xda1585(0x217);}function parseInfoCommand(_0x426a6c){const _0x2ce0fe=a4_0x2c04fa,_0x5d9ebd=_0x426a6c['trim']()[_0x2ce0fe(0x22b)]();if(_0x5d9ebd===_0x2ce0fe(0x1c3))return _0x2ce0fe(0x211);if(_0x5d9ebd==='/info\x20robot')return _0x2ce0fe(0x1e6);if(_0x5d9ebd==='/info\x20session')return _0x2ce0fe(0x17f);if(_0x5d9ebd==='/info\x20task')return'task';return null;}function formatConversationInfo(_0x1351b4,_0x4b0ee0,_0x3803b0,_0x49d006){const _0x3fc88d=a4_0x2c04fa,_0x2ca17a=[_0x3fc88d(0x20d)+_0x4b0ee0];if(_0x1351b4['conversationTitle'])_0x2ca17a['push'](_0x3fc88d(0x215)+_0x1351b4['conversationTitle']);if(_0x1351b4[_0x3fc88d(0x180)])_0x2ca17a['push'](_0x3fc88d(0x1ac)+(_0x1351b4[_0x3fc88d(0x180)]==='1'?'单聊':_0x1351b4[_0x3fc88d(0x180)]==='2'?'群聊':_0x1351b4[_0x3fc88d(0x180)]));if(_0x49d006)_0x2ca17a['push'](_0x3fc88d(0x1e8)+_0x49d006+'`');if(_0x1351b4[_0x3fc88d(0x1f2)])_0x2ca17a[_0x3fc88d(0x1f9)](_0x3fc88d(0x1e1)+_0x1351b4[_0x3fc88d(0x1f2)]);if(_0x1351b4['agent'])_0x2ca17a[_0x3fc88d(0x1f9)](_0x3fc88d(0x19f)+_0x1351b4[_0x3fc88d(0x238)]);if(_0x1351b4[_0x3fc88d(0x1ba)])_0x2ca17a[_0x3fc88d(0x1f9)](_0x3fc88d(0x220)+_0x1351b4[_0x3fc88d(0x1ba)][_0x3fc88d(0x1fc)](0x0,0x8)+_0x3fc88d(0x178));if(_0x1351b4[_0x3fc88d(0x1ec)]?.[_0x3fc88d(0x1a9)]){const _0x15320f=_0x1351b4[_0x3fc88d(0x1ec)][_0x3fc88d(0x1d6)](_0x1442d2=>{const _0x55c082=_0x3803b0?.(_0x1442d2);return _0x55c082||_0x1442d2;})['join'](',\x20');_0x2ca17a[_0x3fc88d(0x1f9)](_0x3fc88d(0x173)+_0x15320f);}if(_0x1351b4[_0x3fc88d(0x1df)]===![])_0x2ca17a[_0x3fc88d(0x1f9)]('-\x20**atSender:**\x20false');if(_0x1351b4[_0x3fc88d(0x213)]===![])_0x2ca17a[_0x3fc88d(0x1f9)](_0x3fc88d(0x218));if(_0x1351b4[_0x3fc88d(0x176)]===![])_0x2ca17a[_0x3fc88d(0x1f9)](_0x3fc88d(0x20f));if(_0x1351b4[_0x3fc88d(0x232)]?.[_0x3fc88d(0x174)])_0x2ca17a[_0x3fc88d(0x1f9)](_0x3fc88d(0x172)+_0x1351b4[_0x3fc88d(0x232)][_0x3fc88d(0x174)]);if(_0x1351b4[_0x3fc88d(0x1fa)])_0x2ca17a[_0x3fc88d(0x1f9)](_0x3fc88d(0x1a2)+_0x1351b4[_0x3fc88d(0x1fa)]+'`');return _0x2ca17a['join']('\x0a');}function formatGlobalConfig(_0x4f1ba3){const _0x3e94a1=a4_0x2c04fa,_0x582cee=['-\x20**clientName:**\x20'+(_0x4f1ba3[_0x3e94a1(0x1b0)]||'-'),_0x3e94a1(0x227)+(_0x4f1ba3[_0x3e94a1(0x1d2)]??0x5),_0x3e94a1(0x1fb)+(_0x4f1ba3['taskHandlerCount']??0x1),_0x3e94a1(0x23a)+(_0x4f1ba3['taskQueueSize']??0x32),_0x3e94a1(0x177)+(_0x4f1ba3['includeThinking']??![]),'-\x20**resultOnly:**\x20'+(_0x4f1ba3[_0x3e94a1(0x1d8)]??!![])];if(_0x4f1ba3[_0x3e94a1(0x193)])_0x582cee[_0x3e94a1(0x1f9)](_0x3e94a1(0x20c)+_0x4f1ba3[_0x3e94a1(0x193)][_0x3e94a1(0x1fc)](0x0,0x8)+_0x3e94a1(0x178));if(_0x4f1ba3[_0x3e94a1(0x1d7)])_0x582cee[_0x3e94a1(0x1f9)](_0x3e94a1(0x1b5)+_0x4f1ba3[_0x3e94a1(0x1d7)]);if(_0x4f1ba3[_0x3e94a1(0x1ec)]?.[_0x3e94a1(0x1a9)])_0x582cee[_0x3e94a1(0x1f9)](_0x3e94a1(0x171)+_0x4f1ba3['whiteUserList']['join'](',\x20'));if(_0x4f1ba3[_0x3e94a1(0x222)]){const _0x4320df=_0x4f1ba3[_0x3e94a1(0x222)][_0x3e94a1(0x1c6)][_0x3e94a1(0x1a0)](_0x17c651=>_0x17c651['isValid'])[_0x3e94a1(0x1a9)];_0x582cee[_0x3e94a1(0x1f9)]('-\x20**apiKeyCfg:**\x20'+_0x4320df+'/'+_0x4f1ba3['apiKeyCfg']['claudeSettings']['length']+_0x3e94a1(0x203)),_0x582cee[_0x3e94a1(0x1f9)]('\x20\x20-\x20**最近重置:**\x20'+(_0x4f1ba3[_0x3e94a1(0x222)][_0x3e94a1(0x1b9)]||'-'));}return _0x582cee[_0x3e94a1(0x1dc)]('\x0a');}function parseLogCommand(_0x1802f2){const _0x249850=_0x1802f2['trim'](),_0x246caa=_0x249850['match'](/^\/log(?:\s+(\d+))?$/i);if(!_0x246caa)return null;const _0x41b842=parseInt(_0x246caa[0x1],0xa);return isNaN(_0x41b842)||_0x41b842<=0x0?0xa:_0x41b842;}function parseLsCommand(_0x13ba37){const _0x360fbf=a4_0x2c04fa,_0x20ebdb=_0x13ba37[_0x360fbf(0x1a6)](),_0x5b7fa1=_0x20ebdb[_0x360fbf(0x233)](/^\/ls(?:\s+(.+))?$/i);if(!_0x5b7fa1)return null;if(_0x5b7fa1[0x1]===undefined)return{'target':'','depth':0x1};const _0x527262=_0x5b7fa1[0x1][_0x360fbf(0x1a6)]()[_0x360fbf(0x1c5)](/\s+/),_0x5879ef=_0x527262[0x0]||'',_0x15ee6c=_0x527262[0x1]?parseInt(_0x527262[0x1],0xa):0x1;return{'target':_0x5879ef,'depth':isNaN(_0x15ee6c)||_0x15ee6c<0x0?0x1:Math[_0x360fbf(0x22d)](_0x15ee6c,0x5)};}function findSubdirByName(_0x57772f,_0x268790,_0x35974e=0x3){const _0x312764=a4_0x2c04fa,_0x510a95=[{'dir':_0x57772f,'depth':0x0}];while(_0x510a95[_0x312764(0x1a9)]>0x0){const {dir:_0x19b53c,depth:_0x87a3be}=_0x510a95[_0x312764(0x20e)]();if(_0x87a3be>_0x35974e)continue;try{const _0x28dca1=fs_1[_0x312764(0x17d)]['readdirSync'](_0x19b53c,{'withFileTypes':!![]});for(const _0x272351 of _0x28dca1){if(!_0x272351[_0x312764(0x1cc)]()||_0x272351['name']['startsWith']('.'))continue;if(_0x272351['name']===_0x268790)return path_1[_0x312764(0x17d)][_0x312764(0x1dc)](_0x19b53c,_0x272351['name']);_0x510a95[_0x312764(0x1f9)]({'dir':path_1[_0x312764(0x17d)][_0x312764(0x1dc)](_0x19b53c,_0x272351[_0x312764(0x195)]),'depth':_0x87a3be+0x1});}}catch{continue;}}return null;}function getDirectoryStructure(_0x394490,_0xec51e1=0x0,_0x6170f1=0x1){const _0x239bcb=a4_0x2c04fa;try{const _0x2e5a92=fs_1[_0x239bcb(0x17d)][_0x239bcb(0x23c)](_0x394490,{'withFileTypes':!![]})['filter'](_0x5e2171=>!_0x5e2171['name']['startsWith']('.'));if(_0x2e5a92[_0x239bcb(0x1a9)]===0x0)return _0xec51e1===0x0?'📂\x20目录为空':'';_0x2e5a92[_0x239bcb(0x23e)]((_0x52c4bb,_0x8fc557)=>{const _0x592e28=_0x239bcb;if(_0x52c4bb['isDirectory']()!==_0x8fc557[_0x592e28(0x1cc)]())return _0x52c4bb[_0x592e28(0x1cc)]()?-0x1:0x1;return _0x52c4bb[_0x592e28(0x195)][_0x592e28(0x21f)](_0x8fc557['name']);});const _0x295727=[],_0x4bbdc5='.\x20'[_0x239bcb(0x200)](_0xec51e1);for(const _0x4d6966 of _0x2e5a92){const _0x3c2329=_0x4d6966['isDirectory']()?_0x239bcb(0x1b3):_0x239bcb(0x190),_0x33e359=_0x4d6966[_0x239bcb(0x1cc)]()?'/':'';_0x295727[_0x239bcb(0x1f9)](''+_0x4bbdc5+_0x3c2329+_0x4d6966[_0x239bcb(0x195)]+_0x33e359);if(_0x4d6966[_0x239bcb(0x1cc)]()&&_0xec51e1<_0x6170f1){const _0x13e57f=path_1[_0x239bcb(0x17d)][_0x239bcb(0x1dc)](_0x394490,_0x4d6966[_0x239bcb(0x195)]),_0x4b8ddf=getDirectoryStructure(_0x13e57f,_0xec51e1+0x1,_0x6170f1);_0x4b8ddf&&_0x295727[_0x239bcb(0x1f9)](_0x4b8ddf);}}return _0x295727[_0x239bcb(0x1dc)]('\x0a');}catch{return _0xec51e1===0x0?_0x239bcb(0x1d5):'';}}function parseContinueSessionCommand(_0x2922d1){const _0x2b64cb=a4_0x2c04fa,_0x19d28b=_0x2922d1[_0x2b64cb(0x1a6)]()['match'](/^\/resume(?:\s+(\S+))?$/i);if(!_0x19d28b)return null;return _0x19d28b[0x1]!==undefined?_0x19d28b[0x1]:'';}function looksLikeCronExpression(_0x14bc67){const _0x400e73=a4_0x2c04fa,_0x4041a8=_0x14bc67[_0x400e73(0x1a6)]()['split'](/\s+/);if(_0x4041a8[_0x400e73(0x1a9)]!==0x5)return![];return _0x4041a8[_0x400e73(0x1bd)](_0x9aedce=>/^[\d*/\-]+$/['test'](_0x9aedce));}function parseCronCommand(_0x106d08){const _0x3ab9c1=a4_0x2c04fa,_0x4adcb9=_0x106d08[_0x3ab9c1(0x1a6)]();if(!_0x4adcb9[_0x3ab9c1(0x22b)]()[_0x3ab9c1(0x198)](_0x3ab9c1(0x234)))return null;const _0x3007d2=_0x4adcb9[_0x3ab9c1(0x1fc)](0x5)[_0x3ab9c1(0x1a6)]();if(!_0x3007d2)return null;if(/^(list|ls)$/i[_0x3ab9c1(0x202)](_0x3007d2))return{'type':_0x3ab9c1(0x208)};const _0x3a5f2c=_0x3007d2[_0x3ab9c1(0x233)](/^(?:delete|rm)\s+(\S+)$/i);if(_0x3a5f2c)return{'type':_0x3ab9c1(0x206),'id':_0x3a5f2c[0x1]};const _0x5dffce=_0x3007d2[_0x3ab9c1(0x233)](/^pause\s+(\S+)$/i);if(_0x5dffce)return{'type':_0x3ab9c1(0x237),'id':_0x5dffce[0x1]};const _0x4e056e=_0x3007d2['match'](/^resume\s+(\S+)$/i);if(_0x4e056e)return{'type':_0x3ab9c1(0x22f),'id':_0x4e056e[0x1]};const _0x556597=_0x3007d2[_0x3ab9c1(0x233)](/^(\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s+(.+)$/);if(_0x556597&&looksLikeCronExpression(_0x556597[0x1]))return{'type':_0x3ab9c1(0x22c),'cronExpression':_0x556597[0x1],'prompt':_0x556597[0x2]};return{'type':_0x3ab9c1(0x1ff),'input':_0x3007d2};}function parsePwdCommand(_0x42b1f9){return _0x42b1f9['trim']()==='/pwd';}function a4_0x4b4e(_0xba8c06,_0x53aee4){_0xba8c06=_0xba8c06-0x171;const _0x52eaeb=a4_0x52ea();let _0x4b4eea=_0x52eaeb[_0xba8c06];return _0x4b4eea;}function parseVersionCommand(_0x524f89){const _0x105147=a4_0x2c04fa;return _0x524f89['trim']()===_0x105147(0x226);}function parsePathCommand(_0x416f0b,_0x114e7c){const _0x8addb6=a4_0x2c04fa,_0x34e62b=_0x416f0b[_0x8addb6(0x1a6)](),_0xfb288d=_0x34e62b['match'](new RegExp(_0x8addb6(0x214)+_0x114e7c+'\x5cs+(.+)$'));if(!_0xfb288d)return null;const _0x2059b7=_0xfb288d[0x1][_0x8addb6(0x1a6)]();return _0x2059b7||null;}function parseMkdirCommand(_0x2e170d){const _0x53666f=a4_0x2c04fa;return parsePathCommand(_0x2e170d,_0x53666f(0x1ab));}function parseTouchCommand(_0x17ce71){const _0x166756=a4_0x2c04fa;return parsePathCommand(_0x17ce71,_0x166756(0x224));}function parseRmCommand(_0x27f467){return parsePathCommand(_0x27f467,'rm');}function a4_0x52ea(){const _0xfa9cff=['filter','/clean\x20all','-\x20**preBash:**\x20`','add','--atSender','/mq\x20-all','trim','/cron\x20pause\x20cron_123','/open','length','/pwd','mkdir','-\x20**会话类型:**\x20','/reset-apikeycfg','getDirectoryStructure','4835eoXbMV','clientName','conversationTitle','/cron\x20delete\x20cron_123','📁\x20','查看和管理当前会话消息队列(排队中的消息)','-\x20**owner:**\x20','current','replace','/ls','resetTime','dingToken','/info\x20robot','1260502CeJwzW','every','开始新的对话会话(结束当前会话)','/log\x20[行数]','cancel','ownerOnly','some','/info','parseBashCommand','split','claudeSettings','yes','parseEndCommand','/clean','/rm\x20<相对路径>','parseCommandHelp','isDirectory','/mq\x20|\x20/mq\x20-n\x20<数量>\x20|\x20/mq\x20-all','/info\x20task','查看群配置、会话和任务信息','-\x20**版本:**\x20','继续指定的历史会话(可指定会话ID,不指定则恢复最近一个)','sessionMaxConcurrency','parseRmCommand','/log\x2020','❌\x20无法读取目录','map','owner','resultOnly','/resume','/open\x20shell','/info\x20session','join','229311XbiyMV','true','atSender','管理当前群白名单(add/del,默认list)','-\x20**关联会话ID:**\x20','/cron\x20每天早上9点查看dima任务','/cfg\x20--whiteUserList\x2013800138000','/cfg\x20--conversationTitle\x20工作群','/mkdir\x20<相对路径>','robot','/ls\x20[目标目录]\x20[展开层数]','-\x20**工作目录:**\x20`','/mq','parseCleanCommand','**用法:**\x20`','whiteUserList','###\x20🤗','parseAuthCommand','注册当前群到配置,或刷新指定字段(已注册群)','parseHelpCommand','-\x20`','linkConversationId','1624077TTvdXV','shell','description','--dingToken','category','/open\x20[shell]','push','preBash','-\x20**taskHandlerCount:**\x20','substring','/auth','find','create_nl','repeat','/mkdir\x20src/components','test','\x20有效','💡\x20输入\x20`/{命令}\x20--help`\x20查看命令详细用法','/ls\x20product\x201','delete','parseCronCommand','list','/bash\x20pwd','parseContinueSessionCommand','/touch\x20README.md','-\x20**defaultDingToken:**\x20','-\x20**群ID:**\x20','shift','-\x20**本地OCR:**\x20关闭','260307mGklSQ','all','/rm','receiveReply','^\x5c/','-\x20**群名称:**\x20','aliases','/end','-\x20**receiveReply:**\x20false\x20(不回复确认消息)','/bash\x20git\x20status','parseVersionCommand','在工作目录执行\x20bash\x20命令(如配置了\x20preBash\x20全局/群级别,将叠加前置执行)','/log','/bash\x20ls\x20-la','显示当前工作目录的绝对路径','localeCompare','-\x20**dingToken:**\x20','path','apiKeyCfg','/cfg\x20--conversationId\x20targetConvId\x20--dingToken\x20xxx\x20--conversationTitle\x20目标群','touch','14UlRYPW','/version','-\x20**sessionMaxConcurrency:**\x20','查看工具版本信息','/help','重置API\x20Key配置(将所有Key标记为有效)','toLowerCase','create_cron','min','/auth\x20add\x2013800138000','resume','/cfg','5274612YmbEYq','taskCfg','match','/cron','formatGlobalConfig','提交任务到队列','pause','agent','usage','-\x20**taskQueueSize:**\x20','/task\x20帮我重构登录模块','readdirSync','del','sort','/cron\x20<自然语言描述>\x20|\x20/cron\x20<cron表达式>\x20<任务描述>\x20|\x20/cron\x20list|pause|resume|delete\x20<id>','**别名:**\x20','--conversationTitle','/cfg\x20--atSender\x20false','查看最近会话日志','/task','parseResetApiKeyCfgCommand','conversationId','--preBash','-\x20**全局白名单:**\x20','-\x20**taskSkill:**\x20','-\x20**群白名单:**\x20','skill','###\x20📖\x20','useLocalOcr','-\x20**includeThinking:**\x20','...','/touch\x20./config.json','/mkdir\x20src','examples','/new','default','--conversationId','session','conversationType','清除历史会话和缓存(.sessions/.tasks/.images)','folder','/auth\x20del\x2013800138000','/rm\x20./docs/obsolete/','/bash','__esModule','/touch\x20<相对路径>','/touch\x20src/cc-ding-cli.ts','--whiteUserList','/ls\x20root\x202','8CpoaYR','创建和管理定时任务(Claude自动分析自然语言)','/mkdir\x20./docs','--receiveReply','/rm\x20temp.txt','📄\x20','/cfg\x20--preBash\x20\x22source\x20.env\x22','结束当前会话','defaultDingToken','在文件管理器或终端中打开工作目录','name','----','查看所有可用命令','startsWith','**示例:**','parseMqCommand','findSubdirByName','/cfg\x20--dingToken\x20myToken\x20--whiteUserList\x2013800138000,13900139000','parseLogCommand','374648pqyLiY','-\x20**agent:**\x20'];a4_0x52ea=function(){return _0xfa9cff;};return a4_0x52ea();}function parseOpenCommand(_0x24768d){const _0x2b6e01=a4_0x2c04fa,_0x4ada47=_0x24768d[_0x2b6e01(0x1a6)]()[_0x2b6e01(0x22b)]();if(_0x4ada47==='/open')return _0x2b6e01(0x182);if(_0x4ada47==='/open\x20shell')return _0x2b6e01(0x1f4);return null;}function parseCleanCommand(_0x4f82e3){const _0x12c3d2=a4_0x2c04fa,_0x589daf=_0x4f82e3['trim']()[_0x12c3d2(0x22b)]();if(_0x589daf===_0x12c3d2(0x1c9))return _0x12c3d2(0x1b6);if(_0x589daf===_0x12c3d2(0x1a1))return _0x12c3d2(0x211);return null;}function parseResetApiKeyCfgCommand(_0x2de0a7){const _0x5de75d=a4_0x2c04fa;return _0x2de0a7['trim']()[_0x5de75d(0x22b)]()==='/reset-apikeycfg';}function parseCfgCommand(_0x4f1c7d){const _0x624d84=a4_0x2c04fa,_0x27fadc=_0x4f1c7d['trim']();if(!/^\/cfg(?:\s|$)/i[_0x624d84(0x202)](_0x27fadc))return null;const _0x56a233=_0x27fadc[_0x624d84(0x1fc)](0x4)[_0x624d84(0x1a6)]();if(!_0x56a233)return{};if(/^--help$/i[_0x624d84(0x202)](_0x56a233))return null;const _0x3c430d={},_0x64a4=_0x56a233[_0x624d84(0x1c5)](/\s+/);for(let _0x3ec26d=0x0;_0x3ec26d<_0x64a4[_0x624d84(0x1a9)];_0x3ec26d++){const _0x2fa933=_0x64a4[_0x3ec26d];if(_0x2fa933===_0x624d84(0x1f6)&&_0x64a4[_0x3ec26d+0x1])_0x3c430d[_0x624d84(0x1ba)]=_0x64a4[++_0x3ec26d];else{if(_0x2fa933==='--linkConversationId'&&_0x64a4[_0x3ec26d+0x1])_0x3c430d['linkConversationId']=_0x64a4[++_0x3ec26d];else{if(_0x2fa933===_0x624d84(0x17e)&&_0x64a4[_0x3ec26d+0x1])_0x3c430d[_0x624d84(0x246)]=_0x64a4[++_0x3ec26d];else{if(_0x2fa933===_0x624d84(0x189)&&_0x64a4[_0x3ec26d+0x1])_0x3c430d[_0x624d84(0x1ec)]=_0x64a4[++_0x3ec26d][_0x624d84(0x1c5)](',')['map'](_0x4ab01b=>_0x4ab01b[_0x624d84(0x1a6)]())[_0x624d84(0x1a0)](Boolean);else{if(_0x2fa933===_0x624d84(0x241)&&_0x64a4[_0x3ec26d+0x1]){const _0x48154c=[];while(_0x3ec26d+0x1<_0x64a4[_0x624d84(0x1a9)]&&!_0x64a4[_0x3ec26d+0x1][_0x624d84(0x198)]('--')){_0x48154c['push'](_0x64a4[++_0x3ec26d]);}_0x48154c[_0x624d84(0x1a9)]>0x0&&(_0x3c430d[_0x624d84(0x1b1)]=_0x48154c['join']('\x20'));}else{if(_0x2fa933===_0x624d84(0x1a4)&&_0x64a4[_0x3ec26d+0x1]){const _0x4ef25a=_0x64a4[++_0x3ec26d][_0x624d84(0x22b)]();_0x3c430d[_0x624d84(0x1df)]=_0x4ef25a==='true'||_0x4ef25a==='1'||_0x4ef25a===_0x624d84(0x1c7);}else{if(_0x2fa933===_0x624d84(0x18e)&&_0x64a4[_0x3ec26d+0x1]){const _0x942419=_0x64a4[++_0x3ec26d][_0x624d84(0x22b)]();_0x3c430d['receiveReply']=_0x942419===_0x624d84(0x1de)||_0x942419==='1'||_0x942419==='yes';}else{if(_0x2fa933===_0x624d84(0x247)&&_0x64a4[_0x3ec26d+0x1]){const _0x3189b2=[];while(_0x3ec26d+0x1<_0x64a4['length']&&!_0x64a4[_0x3ec26d+0x1]['startsWith']('--')){_0x3189b2[_0x624d84(0x1f9)](_0x64a4[++_0x3ec26d]);}_0x3189b2[_0x624d84(0x1a9)]>0x0&&(_0x3c430d[_0x624d84(0x1fa)]=_0x3189b2[_0x624d84(0x1dc)]('\x20')[_0x624d84(0x1b7)](/^["']|["']$/g,''));}}}}}}}}}return _0x3c430d;}function parseBashCommand(_0x22c1bb){const _0x566869=a4_0x2c04fa,_0x2aae48=_0x22c1bb[_0x566869(0x1a6)](),_0x4a4f37=_0x2aae48[_0x566869(0x233)](/^\/bash\s+(.+)$/i);if(!_0x4a4f37)return null;const _0x709973=_0x4a4f37[0x1]['trim']();return _0x709973||null;}function parseMqCommand(_0x554b65){const _0x1b69c7=a4_0x2c04fa,_0x53c51a=_0x554b65['trim']();if(!/^\/mq(?:\s|$)/i[_0x1b69c7(0x202)](_0x53c51a)&&_0x53c51a['toLowerCase']()!==_0x1b69c7(0x1e9))return null;const _0x2821a8=_0x53c51a[_0x1b69c7(0x1fc)](0x3)[_0x1b69c7(0x1a6)]();if(!_0x2821a8)return{'type':'list'};const _0x110caa=_0x2821a8[_0x1b69c7(0x233)](/^-n\s+(\d+)$/i);if(_0x110caa){const _0x5990b8=parseInt(_0x110caa[0x1],0xa);return _0x5990b8>0x0?{'type':_0x1b69c7(0x1c0),'count':_0x5990b8}:{'type':_0x1b69c7(0x208)};}if(/^-all$/i['test'](_0x2821a8))return{'type':'cancelAll'};return null;}function parseAuthCommand(_0x2da8df){const _0x3daf68=a4_0x2c04fa,_0x38aca6=_0x2da8df[_0x3daf68(0x1a6)](),_0x300933=_0x38aca6[_0x3daf68(0x233)](/^\/auth\s+add\s+(\S+)$/i);if(_0x300933)return{'type':_0x3daf68(0x1a3),'staffId':_0x300933[0x1]};const _0x3ff06b=_0x38aca6[_0x3daf68(0x233)](/^\/auth\s+del(?:ete)?\s+(\S+)$/i);if(_0x3ff06b)return{'type':_0x3daf68(0x23d),'staffId':_0x3ff06b[0x1]};if(/^\/auth(?:\s+list)?$/i[_0x3daf68(0x202)](_0x38aca6))return{'type':_0x3daf68(0x208)};return null;}
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseHelpCommand=parseHelpCommand,exports.parseCommandHelp=parseCommandHelp,exports.getCommandByName=getCommandByName,exports.formatHelpOverview=formatHelpOverview,exports.formatCommandHelp=formatCommandHelp,exports.parseEndCommand=parseEndCommand,exports.parseInfoCommand=parseInfoCommand,exports.formatConversationInfo=formatConversationInfo,exports.formatGlobalConfig=formatGlobalConfig,exports.parseLogCommand=parseLogCommand,exports.parseLsCommand=parseLsCommand,exports.findSubdirByName=findSubdirByName,exports.getDirectoryStructure=getDirectoryStructure,exports.parseContinueSessionCommand=parseContinueSessionCommand,exports.parseCronCommand=parseCronCommand,exports.parsePwdCommand=parsePwdCommand,exports.parseVersionCommand=parseVersionCommand,exports.parseMkdirCommand=parseMkdirCommand,exports.parseTouchCommand=parseTouchCommand,exports.parseRmCommand=parseRmCommand,exports.parseOpenCommand=parseOpenCommand,exports.parseCleanCommand=parseCleanCommand,exports.parseResetApiKeyCfgCommand=parseResetApiKeyCfgCommand,exports.parseCfgCommand=parseCfgCommand,exports.parseBashCommand=parseBashCommand,exports.parseMqCommand=parseMqCommand,exports.parseAuthCommand=parseAuthCommand,exports.parseRecorderCommand=parseRecorderCommand,exports.parseGoonCommand=parseGoonCommand,exports.parseCcCommand=parseCcCommand,exports.parseClaudeMdCommand=parseClaudeMdCommand;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),COMMAND_REGISTRY=[{name:"/help",description:"\u67E5\u770B\u6240\u6709\u53EF\u7528\u547D\u4EE4",usage:"/help",examples:["/help"],category:"\u7CFB\u7EDF"},{name:"/info",description:"\u67E5\u770B\u7FA4\u914D\u7F6E\u3001\u4F1A\u8BDD\u548C\u4EFB\u52A1\u4FE1\u606F",usage:"/info [robot|session|task]",examples:["/info","/info robot","/info session","/info task"],category:"\u7CFB\u7EDF"},{name:"/log",description:"\u67E5\u770B\u6700\u8FD1\u4F1A\u8BDD\u65E5\u5FD7",usage:"/log [\u884C\u6570]",examples:["/log","/log 20"],category:"\u4F1A\u8BDD"},{name:"/new",description:"\u5F00\u59CB\u65B0\u7684\u5BF9\u8BDD\u4F1A\u8BDD(\u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD)",usage:"/new [\u521D\u59CB\u6D88\u606F]",examples:["/new","/new \u5E2E\u6211\u5206\u6790\u4E00\u4E0B\u8FD9\u4E2A\u9879\u76EE"],category:"\u4F1A\u8BDD"},{name:"/resume",description:"\u7EE7\u7EED\u6307\u5B9A\u7684\u5386\u53F2\u4F1A\u8BDD(\u53EF\u6307\u5B9A\u4F1A\u8BDDID,\u4E0D\u6307\u5B9A\u5219\u6062\u590D\u6700\u8FD1\u4E00\u4E2A)",usage:"/resume [\u4F1A\u8BDDID]",examples:["/resume","/resume abc123"],category:"\u4F1A\u8BDD"},{name:"/end",description:"\u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD",usage:"/end",examples:["/end"],category:"\u4F1A\u8BDD"},{name:"/goon",description:'\u5F3A\u5236\u91CD\u542F Claude \u8FDB\u7A0B\u5E76\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C',usage:"/goon",examples:["/goon"],category:"\u4F1A\u8BDD"},{name:"/cc",description:"\u76F4\u63A5\u900F\u4F20\u6D88\u606F\u7ED9 Claude\uFF08\u4E0D\u9644\u52A0\u53D1\u9001\u4EBA\u4FE1\u606F\uFF09",usage:"/cc <\u6D88\u606F>",examples:["/cc \u7EE7\u7EED","/cc /compact"],category:"\u4F1A\u8BDD"},{name:"/task",description:"\u63D0\u4EA4\u4EFB\u52A1\u5230\u961F\u5217",usage:"/task <\u4EFB\u52A1\u63CF\u8FF0>",examples:["/task \u5E2E\u6211\u91CD\u6784\u767B\u5F55\u6A21\u5757"],category:"\u4EFB\u52A1"},{name:"/mq",description:"\u67E5\u770B\u548C\u7BA1\u7406\u5F53\u524D\u4F1A\u8BDD\u6D88\u606F\u961F\u5217(\u6392\u961F\u4E2D\u7684\u6D88\u606F)",usage:"/mq | /mq -n <\u6570\u91CF> | /mq -all",examples:["/mq","/mq -n 1","/mq -n 3","/mq -all"],category:"\u4EFB\u52A1"},{name:"/cron",description:"\u521B\u5EFA\u548C\u7BA1\u7406\u5B9A\u65F6\u4EFB\u52A1(Claude\u81EA\u52A8\u5206\u6790\u81EA\u7136\u8BED\u8A00)",usage:"/cron <\u81EA\u7136\u8BED\u8A00\u63CF\u8FF0> | /cron <cron\u8868\u8FBE\u5F0F> <\u4EFB\u52A1\u63CF\u8FF0> | /cron list|pause|resume|delete <id>",examples:["/cron \u6BCF\u5929\u65E9\u4E0A9\u70B9\u67E5\u770Bdima\u4EFB\u52A1","/cron 0 9 * * * \u67E5\u770Bdima\u4EFB\u52A1","/cron list","/cron pause cron_123","/cron delete cron_123"],category:"\u4EFB\u52A1"},{name:"/pwd",description:"\u663E\u793A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u7684\u7EDD\u5BF9\u8DEF\u5F84",usage:"/pwd",examples:["/pwd"],category:"\u6587\u4EF6"},{name:"/ls",description:"\u67E5\u770B\u5DE5\u4F5C\u76EE\u5F55\u7ED3\u6784",usage:"/ls [\u76EE\u6807\u76EE\u5F55] [\u5C55\u5F00\u5C42\u6570]",examples:["/ls","/ls root 2","/ls product 1"],category:"\u6587\u4EF6"},{name:"/mkdir",description:"\u5728\u5DE5\u4F5C\u76EE\u5F55\u4E0B\u521B\u5EFA\u6587\u4EF6\u5939\uFF08\u652F\u6301\u76F8\u5BF9\u8DEF\u5F84\uFF0C\u4E0D\u80FD\u8D85\u51FA\u5DE5\u4F5C\u76EE\u5F55\u8303\u56F4\uFF09",usage:"/mkdir <\u76F8\u5BF9\u8DEF\u5F84>",examples:["/mkdir src","/mkdir src/components","/mkdir ./docs"],category:"\u6587\u4EF6"},{name:"/touch",description:"\u5728\u5DE5\u4F5C\u76EE\u5F55\u4E0B\u521B\u5EFA\u7A7A\u6587\u4EF6\uFF08\u652F\u6301\u76F8\u5BF9\u8DEF\u5F84\uFF0C\u4E0D\u80FD\u8D85\u51FA\u5DE5\u4F5C\u76EE\u5F55\u8303\u56F4\uFF09",usage:"/touch <\u76F8\u5BF9\u8DEF\u5F84>",examples:["/touch README.md","/touch src/cc-ding-cli.ts","/touch ./config.json"],category:"\u6587\u4EF6"},{name:"/rm",description:"\u5220\u9664\u5DE5\u4F5C\u76EE\u5F55\u4E0B\u7684\u6587\u4EF6\u6216\u76EE\u5F55\uFF08\u652F\u6301\u76F8\u5BF9\u8DEF\u5F84\uFF0C\u4E0D\u80FD\u8D85\u51FA\u5DE5\u4F5C\u76EE\u5F55\u8303\u56F4\uFF09",usage:"/rm <\u76F8\u5BF9\u8DEF\u5F84>",examples:["/rm temp.txt","/rm src/old.ts","/rm ./docs/obsolete/"],category:"\u6587\u4EF6"},{name:"/claude.md",description:"\u67E5\u770B\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u7684 CLAUDE.md \u6587\u4EF6\u5185\u5BB9",usage:"/claude.md",examples:["/claude.md"],category:"\u6587\u4EF6"},{name:"/version",description:"\u67E5\u770B\u5DE5\u5177\u7248\u672C\u4FE1\u606F",usage:"/version",examples:["/version"],category:"\u7CFB\u7EDF"},{name:"/open",description:"\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u3001\u7EC8\u7AEF\u6216VS Code\u4E2D\u6253\u5F00\u5DE5\u4F5C\u76EE\u5F55",usage:"/open [shell|code]",examples:["/open","/open shell","/open code"],category:"\u7BA1\u7406",ownerOnly:!0},{name:"/clean",description:"\u6E05\u9664\u5386\u53F2\u4F1A\u8BDD\u548C\u7F13\u5B58(.sessions/.tasks/.images/.playwright-cli)",usage:"/clean",examples:["/clean"],category:"\u7BA1\u7406",ownerOnly:!0},{name:"/reset-apikeycfg",description:"\u91CD\u7F6EAPI Key\u914D\u7F6E(\u5C06\u6240\u6709Key\u6807\u8BB0\u4E3A\u6709\u6548)",usage:"/reset-apikeycfg",examples:["/reset-apikeycfg"],category:"\u7BA1\u7406",ownerOnly:!0},{name:"/cfg",description:"\u6CE8\u518C\u5F53\u524D\u7FA4\u5230\u914D\u7F6E\uFF0C\u6216\u5237\u65B0\u6307\u5B9A\u5B57\u6BB5(\u5DF2\u6CE8\u518C\u7FA4)",usage:'/cfg [--conversationId xxx] [--dingToken xxx] [--linkConversationId yyy] [--whiteUserList 138xxxx,139xxxx] [--conversationTitle \u540D\u79F0] [--atSender true|false] [--receiveReply true|false] [--preBash "\u547D\u4EE4"]',examples:["/cfg","/cfg --dingToken myToken --whiteUserList 13800138000,13900139000","/cfg --conversationTitle \u5DE5\u4F5C\u7FA4","/cfg --whiteUserList 13800138000","/cfg --atSender false","/cfg --receiveReply false",'/cfg --preBash "source .env"',"/cfg --conversationId targetConvId --dingToken xxx --conversationTitle \u76EE\u6807\u7FA4"],category:"\u7BA1\u7406",ownerOnly:!0},{name:"/bash",description:"\u5728\u5DE5\u4F5C\u76EE\u5F55\u6267\u884C bash \u547D\u4EE4\uFF08\u5982\u914D\u7F6E\u4E86 preBash \u5168\u5C40/\u7FA4\u7EA7\u522B\uFF0C\u5C06\u53E0\u52A0\u524D\u7F6E\u6267\u884C\uFF09",usage:"/bash <\u547D\u4EE4>",examples:["/bash ls -la","/bash pwd","/bash git status"],category:"\u6587\u4EF6"},{name:"/auth",description:"\u7BA1\u7406\u5F53\u524D\u7FA4\u767D\u540D\u5355(add/del/approve/reject,\u9ED8\u8BA4list)",usage:"/auth [add|del <\u624B\u673A\u53F7\u6216userId>] | /auth [approve|reject <requestId>]",examples:["/auth","/auth add 13800138000","/auth del 13800138000","/auth approve r1234","/auth reject r1234"],category:"\u7BA1\u7406",ownerOnly:!0},{name:"/recorder",description:"Recorder \u6A21\u5F0F\uFF1A\u8BB0\u5F55\u6240\u6709\u6D88\u606F\u5230\u672C\u5730\uFF08\u4EC5 owner \u5355\u804A\uFF09",usage:"/recorder [on|exit]",examples:["/recorder on","/recorder exit"],category:"\u7BA1\u7406",ownerOnly:!0}],CATEGORY_DISPLAY=[{category:"\u4F1A\u8BDD",icon:"\u{1F4AC}"},{category:"\u4EFB\u52A1",icon:"\u{1F4CB}"},{category:"\u6587\u4EF6",icon:"\u{1F4C2}"},{category:"\u7CFB\u7EDF",icon:"\u2699\uFE0F"},{category:"\u7BA1\u7406",icon:"\u{1F527}"}];function parseHelpCommand(e){return e.trim().toLowerCase()==="/help"}function parseCommandHelp(e){const s=e.trim().match(/^(\/\w+)\s+--help$/i);return s?s[1].toLowerCase():null}function getCommandByName(e){const t=e.toLowerCase();return COMMAND_REGISTRY.find(s=>s.name.toLowerCase()===t||s.aliases?.some(r=>r.toLowerCase()===t))}function formatHelpOverview(e,t){const s=COMMAND_REGISTRY.filter(n=>t||!n.ownerOnly),r=["### \u{1F917}","----",`- **\u7248\u672C:** ${e}`,"- **\u4F5C\u8005:** yihuineng","- **Github:** https://github.com/yihuineng/cc-ding","----"];for(const{category:n,icon:o}of CATEGORY_DISPLAY){const a=s.filter(i=>i.category===n);if(a.length!==0){r.push(`${o} **${n}**`);for(const i of a)r.push(`- \`${i.name}\` ${i.description}`);r.push("")}}return r.push("\u{1F4A1} \u8F93\u5165 `/{\u547D\u4EE4} --help` \u67E5\u770B\u547D\u4EE4\u8BE6\u7EC6\u7528\u6CD5"),r.join(`
|
|
2
|
+
`)}function formatCommandHelp(e){const t=[`### \u{1F4D6} ${e.name}`,"",`**\u63CF\u8FF0:** ${e.description}`,"",`**\u7528\u6CD5:** \`${e.usage}\``];e.aliases?.length&&t.push("",`**\u522B\u540D:** ${e.aliases.join(", ")}`),t.push("","**\u793A\u4F8B:**");for(const s of e.examples)t.push(`- \`${s}\``);return t.join(`
|
|
3
|
+
`)}function parseEndCommand(e){return e.trim().toLowerCase()==="/end"}function parseInfoCommand(e){const t=e.trim().toLowerCase();return t==="/info"?"all":t==="/info robot"?"robot":t==="/info session"?"session":t==="/info task"?"task":null}function formatConversationInfo(e,t,s,r){const n=[`- **\u7FA4ID:** ${t}`];if(e.conversationTitle&&n.push(`- **\u7FA4\u540D\u79F0:** ${e.conversationTitle}`),e.conversationType&&n.push(`- **\u4F1A\u8BDD\u7C7B\u578B:** ${e.conversationType==="1"?"\u5355\u804A":e.conversationType==="2"?"\u7FA4\u804A":e.conversationType}`),r&&n.push(`- **\u5DE5\u4F5C\u76EE\u5F55:** \`${r}\``),e.linkConversationId&&n.push(`- **\u5173\u8054\u4F1A\u8BDDID:** ${e.linkConversationId}`),e.agent&&n.push(`- **agent:** ${e.agent}`),e.dingToken&&n.push(`- **dingToken:** ${e.dingToken.substring(0,8)}...`),e.whiteUserList?.length){const o=e.whiteUserList.map(a=>s?.(a)||a).join(", ");n.push(`- **\u7FA4\u767D\u540D\u5355:** ${o}`)}return e.atSender===!1&&n.push("- **atSender:** false"),e.receiveReply===!1&&n.push("- **receiveReply:** false (\u4E0D\u56DE\u590D\u786E\u8BA4\u6D88\u606F)"),e.useLocalOcr===!1&&n.push("- **\u672C\u5730OCR:** \u5173\u95ED"),e.taskCfg?.skill&&n.push(`- **taskSkill:** ${e.taskCfg.skill}`),e.preBash&&n.push(`- **preBash:** \`${e.preBash}\``),n.join(`
|
|
4
|
+
`)}function formatGlobalConfig(e){const t=[`- **clientName:** ${e.clientName||"-"}`,`- **sessionMaxConcurrency:** ${e.sessionMaxConcurrency??5}`,`- **taskHandlerCount:** ${e.taskHandlerCount??1}`,`- **taskQueueSize:** ${e.taskQueueSize??50}`,`- **includeThinking:** ${e.includeThinking??!1}`,`- **resultOnly:** ${e.resultOnly??!0}`];if(e.defaultDingToken&&t.push(`- **defaultDingToken:** ${e.defaultDingToken.substring(0,8)}...`),e.owner&&t.push(`- **owner:** ${e.owner}`),e.whiteUserList?.length&&t.push(`- **\u5168\u5C40\u767D\u540D\u5355:** ${e.whiteUserList.join(", ")}`),e.apiKeyCfg){const s=e.apiKeyCfg.claudeSettings.filter(r=>r.isValid).length;t.push(`- **apiKeyCfg:** ${s}/${e.apiKeyCfg.claudeSettings.length} \u6709\u6548`),t.push(` - **\u6700\u8FD1\u91CD\u7F6E:** ${e.apiKeyCfg.resetTime||"-"}`)}return t.join(`
|
|
5
|
+
`)}function parseLogCommand(e){const s=e.trim().match(/^\/log(?:\s+(\d+))?$/i);if(!s)return null;const r=parseInt(s[1],10);return isNaN(r)||r<=0?10:r}function parseLsCommand(e){const s=e.trim().match(/^\/ls(?:\s+(.+))?$/i);if(!s)return null;if(s[1]===void 0)return{target:"",depth:1};const r=s[1].trim().split(/\s+/),n=r[0]||"",o=r[1]?parseInt(r[1],10):1;return{target:n,depth:isNaN(o)||o<0?1:Math.min(o,5)}}function findSubdirByName(e,t,s=3){const r=[{dir:e,depth:0}];for(;r.length>0;){const{dir:n,depth:o}=r.shift();if(!(o>s))try{const a=fs_1.default.readdirSync(n,{withFileTypes:!0});for(const i of a)if(!(!i.isDirectory()||i.name.startsWith("."))){if(i.name===t)return path_1.default.join(n,i.name);r.push({dir:path_1.default.join(n,i.name),depth:o+1})}}catch{continue}}return null}function getDirectoryStructure(e,t=0,s=1){try{const r=fs_1.default.readdirSync(e,{withFileTypes:!0}).filter(a=>!a.name.startsWith("."));if(r.length===0)return t===0?"\u{1F4C2} \u76EE\u5F55\u4E3A\u7A7A":"";r.sort((a,i)=>a.isDirectory()!==i.isDirectory()?a.isDirectory()?-1:1:a.name.localeCompare(i.name));const n=[],o=". ".repeat(t);for(const a of r){const i=a.isDirectory()?"\u{1F4C1} ":"\u{1F4C4} ",m=a.isDirectory()?"/":"";if(n.push(`${o}${i}${a.name}${m}`),a.isDirectory()&&t<s){const u=path_1.default.join(e,a.name),c=getDirectoryStructure(u,t+1,s);c&&n.push(c)}}return n.join(`
|
|
6
|
+
`)}catch{return t===0?"\u274C \u65E0\u6CD5\u8BFB\u53D6\u76EE\u5F55":""}}function parseContinueSessionCommand(e){const t=e.trim().match(/^\/resume(?:\s+(\S+))?$/i);return t?t[1]!==void 0?t[1]:"":null}function looksLikeCronExpression(e){const t=e.trim().split(/\s+/);return t.length!==5?!1:t.every(s=>/^[\d*/\-]+$/.test(s))}function parseCronCommand(e){const t=e.trim();if(!t.toLowerCase().startsWith("/cron"))return null;const s=t.substring(5).trim();if(!s)return null;if(/^(list|ls)$/i.test(s))return{type:"list"};const r=s.match(/^(?:delete|rm)\s+(\S+)$/i);if(r)return{type:"delete",id:r[1]};const n=s.match(/^pause\s+(\S+)$/i);if(n)return{type:"pause",id:n[1]};const o=s.match(/^resume\s+(\S+)$/i);if(o)return{type:"resume",id:o[1]};const a=s.match(/^(\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s+(.+)$/);return a&&looksLikeCronExpression(a[1])?{type:"create_cron",cronExpression:a[1],prompt:a[2]}:{type:"create_nl",input:s}}function parsePwdCommand(e){return e.trim()==="/pwd"}function parseVersionCommand(e){return e.trim()==="/version"}function parsePathCommand(e,t){const r=e.trim().match(new RegExp(`^\\/${t}\\s+(.+)$`));return r&&r[1].trim()||null}function parseMkdirCommand(e){return parsePathCommand(e,"mkdir")}function parseTouchCommand(e){return parsePathCommand(e,"touch")}function parseRmCommand(e){return parsePathCommand(e,"rm")}function parseOpenCommand(e){const t=e.trim().toLowerCase();return t==="/open"?"folder":t==="/open shell"?"shell":t==="/open code"?"code":null}function parseCleanCommand(e){const t=e.trim().toLowerCase();return t==="/clean"?"current":t==="/clean all"?"all":null}function parseResetApiKeyCfgCommand(e){return e.trim().toLowerCase()==="/reset-apikeycfg"}function parseCfgCommand(e){const t=e.trim();if(!/^\/cfg(?:\s|$)/i.test(t))return null;const s=t.substring(4).trim();if(!s)return{};if(/^--help$/i.test(s))return null;const r={},n=s.split(/\s+/);for(let o=0;o<n.length;o++){const a=n[o];if(a==="--dingToken"&&n[o+1])r.dingToken=n[++o];else if(a==="--linkConversationId"&&n[o+1])r.linkConversationId=n[++o];else if(a==="--conversationId"&&n[o+1])r.conversationId=n[++o];else if(a==="--whiteUserList"&&n[o+1])r.whiteUserList=n[++o].split(",").map(i=>i.trim()).filter(Boolean);else if(a==="--conversationTitle"&&n[o+1]){const i=[];for(;o+1<n.length&&!n[o+1].startsWith("--");)i.push(n[++o]);i.length>0&&(r.conversationTitle=i.join(" "))}else if(a==="--atSender"&&n[o+1]){const i=n[++o].toLowerCase();r.atSender=i==="true"||i==="1"||i==="yes"}else if(a==="--receiveReply"&&n[o+1]){const i=n[++o].toLowerCase();r.receiveReply=i==="true"||i==="1"||i==="yes"}else if(a==="--preBash"&&n[o+1]){const i=[];for(;o+1<n.length&&!n[o+1].startsWith("--");)i.push(n[++o]);i.length>0&&(r.preBash=i.join(" ").replace(/^["']|["']$/g,""))}}return r}function parseBashCommand(e){const s=e.trim().match(/^\/bash\s+(.+)$/i);return s&&s[1].trim()||null}function parseMqCommand(e){const t=e.trim();if(!/^\/mq(?:\s|$)/i.test(t)&&t.toLowerCase()!=="/mq")return null;const s=t.substring(3).trim();if(!s)return{type:"list"};const r=s.match(/^-n\s+(\d+)$/i);if(r){const n=parseInt(r[1],10);return n>0?{type:"cancel",count:n}:{type:"list"}}return/^-all$/i.test(s)?{type:"cancelAll"}:null}function parseAuthCommand(e){const t=e.trim(),s=t.match(/^\/auth\s+add\s+(\S+)$/i);if(s)return{type:"add",staffId:s[1]};const r=t.match(/^\/auth\s+del(?:ete)?\s+(\S+)$/i);if(r)return{type:"del",staffId:r[1]};const n=t.match(/^\/auth\s+approve\s+(\S+)$/i);if(n)return{type:"approve",requestId:n[1]};const o=t.match(/^\/auth\s+reject\s+(\S+)$/i);return o?{type:"reject",requestId:o[1]}:/^\/auth(?:\s+list)?$/i.test(t)?{type:"list"}:null}function parseRecorderCommand(e){const t=e.trim();return/^\/recorder\s+on$/i.test(t)?"on":/^\/recorder\s+exit$/i.test(t)?"exit":null}function parseGoonCommand(e){return/^\/goon$/i.test(e.trim())}function parseCcCommand(e){const t=e.trim().match(/^\/cc\s+(.+)$/is);return t?t[1]:null}function parseClaudeMdCommand(e){return/^\/claude\.md$/i.test(e.trim())}
|
package/dist/src/biz/cron.js
CHANGED
|
@@ -1 +1,21 @@
|
|
|
1
|
-
'use strict';const a5_0x59dbf1=a5_0x382f;(function(_0x4abce1,_0x263d11){const _0x1d6797=a5_0x382f,_0x33f3b6=_0x4abce1();while(!![]){try{const _0x20bf76=-parseInt(_0x1d6797(0x106))/0x1+-parseInt(_0x1d6797(0x116))/0x2*(-parseInt(_0x1d6797(0x8f))/0x3)+-parseInt(_0x1d6797(0xd3))/0x4*(parseInt(_0x1d6797(0x123))/0x5)+parseInt(_0x1d6797(0xa1))/0x6*(parseInt(_0x1d6797(0xf3))/0x7)+-parseInt(_0x1d6797(0x8e))/0x8*(parseInt(_0x1d6797(0xc9))/0x9)+-parseInt(_0x1d6797(0x10b))/0xa*(-parseInt(_0x1d6797(0x11d))/0xb)+-parseInt(_0x1d6797(0xf1))/0xc*(-parseInt(_0x1d6797(0xdd))/0xd);if(_0x20bf76===_0x263d11)break;else _0x33f3b6['push'](_0x33f3b6['shift']());}catch(_0x443bf8){_0x33f3b6['push'](_0x33f3b6['shift']());}}}(a5_0x1834,0xbaeb7));var __importDefault=this&&this[a5_0x59dbf1(0x83)]||function(_0x3a452a){return _0x3a452a&&_0x3a452a['__esModule']?_0x3a452a:{'default':_0x3a452a};};Object[a5_0x59dbf1(0xf2)](exports,a5_0x59dbf1(0x10a),{'value':!![]}),exports[a5_0x59dbf1(0xf0)]=void 0x0,exports[a5_0x59dbf1(0x10f)]=isValidCronExpression,exports[a5_0x59dbf1(0xef)]=formatCronJobList,exports['formatCronJobInfo']=formatCronJobInfo;const fs_1=__importDefault(require('fs')),readline_1=__importDefault(require(a5_0x59dbf1(0xc0))),child_process_1=require(a5_0x59dbf1(0xc3)),utils_ok_1=require(a5_0x59dbf1(0x11e)),messaging_1=require('./messaging'),claude_process_1=require(a5_0x59dbf1(0xeb)),task_1=require(a5_0x59dbf1(0xc8)),session_1=require('./session');function getCronFile(_0x24b578){const _0x490937=a5_0x59dbf1;return(0x0,session_1[_0x490937(0x128)])(_0x24b578)+_0x490937(0xd7);}function a5_0x1834(){const _0x2efadf=['resolveClaudeSettingsPath','map','MAX_CONCURRENT_JOBS','getJob','skill','executeJob','💡\x20`/cron\x20pause\x20<id>`\x20暂停\x20|\x20`/cron\x20resume\x20<id>`\x20恢复\x20|\x20`/cron\x20delete\x20<id>`\x20删除','getSessionDir','senderNick',']\x20定时任务\x20','error','Claude\x20配额已耗尽(429),请稍后重试或明天再试','set','-\x20**创建时间:**\x20','data','claude','cron_','\x20的会话配置不存在,\x20跳过执行','cronExpression','getConversationDir','some','stringify','parse','includes','-\x20**Cron:**\x20`',']\x20Cron分析:\x20','getDate','readline','YYYY-MM-DD-HH-mm-ss','split','child_process','every','trim',']\x20新增定时任务:\x20','-\x20**创建者:**\x20','./task','114651kXmTJl','JSON\x20解析失败',']\x20删除定时任务:\x20','format','filter','checkJobsAt','已恢复',']\x20Cron执行失败:\x20','destroy','tick','188JMrrMC','\x20的会话有活跃session,\x20降级到任务队列','stopScheduler','activeSessions','/cron.json','replace','timestamp','message','prompt','warn','11863813aiaMex','-\x20任务:\x20','pipe','-\x20**状态:**\x20','\x20无通知能力(无dingToken且无defaultDingToken),\x20跳过执行','delete','-\x20上次执行:\x20','findIndex',']\x20Cron任务\x20','log','defaultDingToken','startScheduler','createdAt','-\x20创建者:\x20','./claude-process','getHours','has','timer','formatCronJobList','CronEngine','12rWBbRV','defineProperty','4305JtapPF',']\x20Cron引擎已启动,\x20共\x20','Claude\x20认证失败(401),请检查\x20API\x20Key\x20配置','/session.json','\x20启用)','getMinutes','--permission-mode','findActiveSession','enqueueAsTask','--output-format','lastCheckedTime','listJobs','utf-8','\x20已降级到任务队列:\x20','default','分析以下定时任务描述,提取cron表达式和任务内容。\x0a\x0a用户输入:\x20{INPUT}\x0a\x0a请严格返回以下JSON格式(不要返回其他任何内容):\x0a{\x22cron\x22:\x225位cron表达式(分\x20时\x20日\x20月\x20周)\x22,\x22prompt\x22:\x22要执行的任务提示词\x22,\x22desc\x22:\x22简短的中文描述\x22}\x0a\x0a常见cron格式:\x0a-\x20每天早上9点:\x20\x220\x209\x20*\x20*\x20*\x22\x0a-\x20每周一早上9点:\x20\x220\x209\x20*\x20*\x201\x22\x0a-\x20工作日早上9点:\x20\x220\x209\x20*\x20*\x201-5\x22\x0a-\x20每小时:\x20\x220\x20*\x20*\x20*\x20*\x22\x0a-\x20每30分钟:\x20\x22*/30\x20*\x20*\x20*\x20*\x22\x0a-\x20每天中午12点:\x20\x220\x2012\x20*\x20*\x20*\x22\x0a-\x20每月1号早上9点:\x20\x220\x209\x201\x20*\x20*\x22\x0a-\x20每周五下午3点:\x20\x220\x2015\x20*\x20*\x205\x22','\x20降级到任务队列失败:','desc','spawn','330865dBaeLm','agent','getConversationConfig','\x20个任务\x20(','__esModule','12680bUmhty','toString','line','stdout','isValidCronExpression','[cron]','--verbose','/session.log','-\x20**任务:**\x20','),\x20跳过\x20','{INPUT}','10AGFPYz','getMonth','content','splice','readFileSync','saveActiveSession','###\x20⏰\x20定时任务\x20','5412OyyBkF','utils-ok','writeFileSync','--print','find','persist','106940rxcvss','removeJob','stdin','enabled','runningJobIds','getClientDir','description','分析超时(60s)','write',']\x20[SYSTEM]:\x20定时任务触发:\x20','push','type','isArray','start','analyzeAndCreate','__importDefault','✅\x20启用','Claude\x20返回格式不正确','mkdirSync','-\x20**上次执行:**\x20','result','now','saveTask','lastRunAt','conversationId','length','696YXNuEn','669453cEmYgg','jobs','Claude\x20TPM\x20限流(422),请稍后重试','add','match','size','senderStaffId','createInterface','addJob','-\x20Cron:\x20`','toggleJob','dingToken','-\x20描述:\x20','⏸️\x20暂停','substring','executeClaudeQuery','###\x20⏰\x20定时任务列表\x0a','test','5442LGMxlj','end','分析失败\x20(退出码:\x20','cron'];a5_0x1834=function(){return _0x2efadf;};return a5_0x1834();}function loadCronJobs(_0x316fbe){const _0x501350=a5_0x59dbf1,_0x29d0ff=getCronFile(_0x316fbe);try{const _0x55c0eb=JSON['parse'](fs_1[_0x501350(0x101)][_0x501350(0x11a)](_0x29d0ff,_0x501350(0xff)));return Array[_0x501350(0x12f)](_0x55c0eb)?_0x55c0eb:_0x55c0eb[_0x501350(0x90)]||[];}catch{return[];}}function saveCronJobs(_0x809671,_0x40e2bd){const _0x478616=a5_0x59dbf1,_0x57048f=getCronFile(_0x809671);fs_1['default'][_0x478616(0x11f)](_0x57048f,JSON[_0x478616(0xba)](_0x40e2bd,null,0x2),'utf-8');}function matchesCronField(_0x147d46,_0x449ac0,_0x157100,_0xbc0f75){const _0x143902=a5_0x59dbf1;if(_0x147d46==='*')return!![];if(_0x147d46['includes'](','))return _0x147d46['split'](',')[_0x143902(0xb9)](_0x1be736=>matchesCronField(_0x1be736[_0x143902(0xc5)](),_0x449ac0,_0x157100,_0xbc0f75));if(_0x147d46[_0x143902(0xbc)]('/')){const _0x219f1a=_0x147d46['indexOf']('/'),_0xae628c=_0x147d46['substring'](0x0,_0x219f1a),_0x13281a=parseInt(_0x147d46[_0x143902(0x9d)](_0x219f1a+0x1),0xa);if(isNaN(_0x13281a)||_0x13281a<=0x0)return![];let _0x2958b0=_0x157100,_0x140ffa=_0xbc0f75;if(_0xae628c!=='*'){if(_0xae628c[_0x143902(0xbc)]('-')){const _0x270bf3=_0xae628c[_0x143902(0xc2)]('-')['map'](Number);_0x2958b0=_0x270bf3[0x0],_0x140ffa=_0x270bf3[0x1];}else _0x2958b0=parseInt(_0xae628c,0xa),_0x140ffa=_0xbc0f75;}if(_0x449ac0<_0x2958b0||_0x449ac0>_0x140ffa)return![];return(_0x449ac0-_0x2958b0)%_0x13281a===0x0;}if(_0x147d46[_0x143902(0xbc)]('-')){const _0x245c61=_0x147d46[_0x143902(0xc2)]('-')[_0x143902(0xa6)](Number);return _0x449ac0>=_0x245c61[0x0]&&_0x449ac0<=_0x245c61[0x1];}const _0x4c263f=parseInt(_0x147d46,0xa);return!isNaN(_0x4c263f)&&_0x449ac0===_0x4c263f;}function matchesCron(_0x5cf30e,_0x1f43a7){const _0x4476c3=a5_0x59dbf1,_0x255f18=_0x5cf30e['trim']()['split'](/\s+/);if(_0x255f18[_0x4476c3(0x8d)]!==0x5)return![];const _0x1f9122=_0x1f43a7[_0x4476c3(0xf8)](),_0x6d3fe2=_0x1f43a7[_0x4476c3(0xec)](),_0x46b939=_0x1f43a7[_0x4476c3(0xbf)](),_0x4a13b6=_0x1f43a7[_0x4476c3(0x117)]()+0x1,_0x722b01=_0x1f43a7['getDay']();if(!matchesCronField(_0x255f18[0x0],_0x1f9122,0x0,0x3b))return![];if(!matchesCronField(_0x255f18[0x1],_0x6d3fe2,0x0,0x17))return![];if(!matchesCronField(_0x255f18[0x3],_0x4a13b6,0x1,0xc))return![];const _0xda065e=matchesCronField(_0x255f18[0x2],_0x46b939,0x1,0x1f),_0x24a04b=matchesCronField(_0x255f18[0x4],_0x722b01,0x0,0x7)||_0x722b01===0x0&&matchesCronField(_0x255f18[0x4],0x7,0x0,0x7),_0xba3034=_0x255f18[0x2]==='*',_0x4685b2=_0x255f18[0x4]==='*';if(_0xba3034&&_0x4685b2)return!![];if(_0xba3034)return _0x24a04b;if(_0x4685b2)return _0xda065e;return _0xda065e||_0x24a04b;}function isValidCronExpression(_0x51ac30){const _0x3cecc5=a5_0x59dbf1,_0x34a57b=_0x51ac30[_0x3cecc5(0xc5)]()[_0x3cecc5(0xc2)](/\s+/);if(_0x34a57b[_0x3cecc5(0x8d)]!==0x5)return![];const _0x50eb09=/^(\*|\d+|\d+-\d+|\*\/\d+|\d+\/\d+|\d+-\d+\/\d+|\d+(,\d+)+)$/;return _0x34a57b[_0x3cecc5(0xc4)](_0x440c8f=>_0x50eb09[_0x3cecc5(0xa0)](_0x440c8f));}function a5_0x382f(_0x524585,_0x1d1ffc){_0x524585=_0x524585-0x83;const _0x183444=a5_0x1834();let _0x382f41=_0x183444[_0x524585];return _0x382f41;}const ANALYSIS_PROMPT=a5_0x59dbf1(0x102);async function analyzeCronWithClaude(_0x209126,_0x5925d8,_0x328279){const _0xc8f6dd=a5_0x59dbf1,_0x5486d1=_0x209126[_0xc8f6dd(0xb8)](_0x5925d8),_0x49108d=_0xc8f6dd(0xb4),_0x1c4310=ANALYSIS_PROMPT[_0xc8f6dd(0xd8)](_0xc8f6dd(0x115),_0x328279),_0x1a9dfe=[_0xc8f6dd(0xf9),'bypassPermissions',_0xc8f6dd(0x120),_0xc8f6dd(0xfc),'stream-json',_0xc8f6dd(0x111)],_0x717bc6=(0x0,claude_process_1[_0xc8f6dd(0xa5)])(_0x209126,_0x5486d1);return _0x717bc6&&_0x1a9dfe['push']('--settings',_0x717bc6),console[_0xc8f6dd(0xe6)]('['+(0x0,session_1[_0xc8f6dd(0xd9)])()+_0xc8f6dd(0xbe)+_0x49108d+'\x20'+_0x1a9dfe['join']('\x20')),new Promise((_0x56b5d4,_0x5c59ae)=>{const _0x3bfdac=_0xc8f6dd,_0x2ff4f9=(0x0,child_process_1[_0x3bfdac(0x105)])(_0x49108d,_0x1a9dfe,{'cwd':_0x5486d1,'stdio':[_0x3bfdac(0xdf),'pipe','pipe']});_0x2ff4f9[_0x3bfdac(0x125)]?.[_0x3bfdac(0x12b)](_0x1c4310+'\x0a'),_0x2ff4f9['stdin']?.[_0x3bfdac(0xa2)]();let _0x54c052='',_0x8619dd='';const _0xc8b1b9=readline_1['default'][_0x3bfdac(0x96)]({'input':_0x2ff4f9[_0x3bfdac(0x10e)]});_0xc8b1b9['on'](_0x3bfdac(0x10d),_0x230037=>{const _0x1ae422=_0x3bfdac,_0x351780=(0x0,claude_process_1['parseClaudeStreamLine'])(_0x230037);_0x351780?.[_0x1ae422(0x12e)]===_0x1ae422(0x88)&&_0x351780['content']&&(_0x54c052=_0x351780[_0x1ae422(0x118)]);}),_0x2ff4f9['stderr']?.['on'](_0x3bfdac(0xb3),_0x5abbb0=>{const _0x4b3e9c=_0x3bfdac;_0x8619dd+=_0x5abbb0[_0x4b3e9c(0x10c)]();});const _0x12e37f=setTimeout(()=>{const _0x1aa08c=_0x3bfdac;_0x2ff4f9['kill'](),_0x5c59ae(new Error(_0x1aa08c(0x12a)));},0xea60);_0x2ff4f9['on']('close',_0x5c9401=>{const _0x85e6af=_0x3bfdac;clearTimeout(_0x12e37f);if(_0x5c9401===0x0&&_0x54c052)try{const _0x1ab5c5=_0x54c052[_0x85e6af(0x93)](/\{[\s\S]*\}/);if(_0x1ab5c5){const _0x3ffdcc=JSON[_0x85e6af(0xbb)](_0x1ab5c5[0x0]);if(_0x3ffdcc[_0x85e6af(0xa4)]&&_0x3ffdcc[_0x85e6af(0xdb)]){_0x56b5d4(_0x3ffdcc);return;}}_0x5c59ae(new Error(_0x85e6af(0x85)));}catch{_0x5c59ae(new Error(_0x85e6af(0xca)));}else{const _0x1ae31e=_0x8619dd[_0x85e6af(0xc5)]()?'\x20('+_0x8619dd[_0x85e6af(0xc5)]()['substring'](0x0,0xc8)+')':'';console[_0x85e6af(0xaf)]('['+(0x0,session_1['timestamp'])()+']\x20Cron分析进程退出('+_0x5c9401+')'+_0x1ae31e);const _0x26a3a3=_0x8619dd;if(/\b429\b/[_0x85e6af(0xa0)](_0x26a3a3))_0x5c59ae(new Error(_0x85e6af(0xb0)));else{if(/\b422\b/['test'](_0x26a3a3)||/TPM|额度超限/i['test'](_0x26a3a3))_0x5c59ae(new Error(_0x85e6af(0x91)));else{if(/\b401\b/[_0x85e6af(0xa0)](_0x26a3a3)||/auth|认证|permission/i['test'](_0x26a3a3))_0x5c59ae(new Error(_0x85e6af(0xf5)));else _0x5c9401===0x1&&!_0x54c052&&!_0x8619dd[_0x85e6af(0xc5)]()?_0x5c59ae(new Error('Claude\x20进程异常退出,无输出。请检查\x20claude\x20命令是否可用')):_0x5c59ae(new Error(_0x85e6af(0xa3)+_0x5c9401+')'+_0x1ae31e));}}}}),_0x2ff4f9['on'](_0x3bfdac(0xaf),_0x317587=>{const _0x1a4941=_0x3bfdac;clearTimeout(_0x12e37f),_0x5c59ae(new Error('启动\x20Claude\x20进程失败:\x20'+_0x317587[_0x1a4941(0xda)]));});});}function formatCronJobList(_0x527bfa){const _0x5d1f24=a5_0x59dbf1;if(_0x527bfa[_0x5d1f24(0x8d)]===0x0)return'📭\x20暂无定时任务';const _0x287044=[_0x5d1f24(0x9f)];for(const _0x107e04 of _0x527bfa){const _0x2ee181=_0x107e04[_0x5d1f24(0x126)]?'✅':'⏸️',_0xccbd14=_0x107e04[_0x5d1f24(0x8b)]||'-';_0x287044[_0x5d1f24(0x12d)]('**'+_0x2ee181+'\x20'+_0x107e04['id']+'**'),_0x287044['push'](_0x5d1f24(0x98)+_0x107e04[_0x5d1f24(0xb7)]+'`'),_0x287044[_0x5d1f24(0x12d)](_0x5d1f24(0x9b)+_0x107e04[_0x5d1f24(0x129)]),_0x287044[_0x5d1f24(0x12d)](_0x5d1f24(0xde)+_0x107e04[_0x5d1f24(0xdb)]),_0x287044[_0x5d1f24(0x12d)](_0x5d1f24(0xea)+_0x107e04[_0x5d1f24(0xad)]),_0x287044[_0x5d1f24(0x12d)](_0x5d1f24(0xe3)+_0xccbd14),_0x287044[_0x5d1f24(0x12d)]('');}return _0x287044[_0x5d1f24(0x12d)](_0x5d1f24(0xab)),_0x287044['join']('\x0a');}function formatCronJobInfo(_0x250a99){const _0x5a23c4=a5_0x59dbf1,_0xcf4e06=_0x250a99[_0x5a23c4(0x126)]?_0x5a23c4(0x84):_0x5a23c4(0x9c);return[_0x5a23c4(0x11c)+_0x250a99['id'],'',_0x5a23c4(0xe0)+_0xcf4e06,_0x5a23c4(0xbd)+_0x250a99['cronExpression']+'`','-\x20**描述:**\x20'+_0x250a99['description'],_0x5a23c4(0x113)+_0x250a99[_0x5a23c4(0xdb)],_0x5a23c4(0xc7)+_0x250a99[_0x5a23c4(0xad)],_0x5a23c4(0xb2)+_0x250a99[_0x5a23c4(0xe9)],_0x5a23c4(0x87)+(_0x250a99[_0x5a23c4(0x8b)]||'-')]['join']('\x0a');}class CronEngine{constructor(_0xfda968){const _0x130317=a5_0x59dbf1;this[_0x130317(0x90)]=[],this[_0x130317(0xee)]=null,this['lastCheckedTime']=-0x1,this['runningJobIds']=new Set(),this[_0x130317(0xa7)]=0x3,this['dc']=_0xfda968,this[_0x130317(0x90)]=loadCronJobs(_0xfda968);}[a5_0x59dbf1(0x130)](){const _0xf88d23=a5_0x59dbf1;this[_0xf88d23(0xe8)]();const _0x1381dd=this[_0xf88d23(0x90)][_0xf88d23(0xcd)](_0x49d061=>_0x49d061['enabled'])[_0xf88d23(0x8d)];console[_0xf88d23(0xe6)]('['+(0x0,session_1[_0xf88d23(0xd9)])()+_0xf88d23(0xf4)+this[_0xf88d23(0x90)][_0xf88d23(0x8d)]+_0xf88d23(0x109)+_0x1381dd+_0xf88d23(0xf7));}[a5_0x59dbf1(0xd1)](){const _0x50804f=a5_0x59dbf1;this[_0x50804f(0xd5)]();}[a5_0x59dbf1(0x97)](_0x33ba57){const _0x261cbb=a5_0x59dbf1,_0x1c0023={'id':_0x261cbb(0xb5)+Date[_0x261cbb(0x89)](),'conversationId':_0x33ba57['conversationId'],'cronExpression':_0x33ba57[_0x261cbb(0xb7)],'description':_0x33ba57[_0x261cbb(0x129)],'prompt':_0x33ba57[_0x261cbb(0xdb)],'enabled':!![],'createdAt':(0x0,session_1[_0x261cbb(0xd9)])(),'senderStaffId':_0x33ba57[_0x261cbb(0x95)],'senderNick':_0x33ba57['senderNick']};return this['jobs'][_0x261cbb(0x12d)](_0x1c0023),this['persist'](),console[_0x261cbb(0xe6)]('['+(0x0,session_1[_0x261cbb(0xd9)])()+_0x261cbb(0xc6)+_0x1c0023['id']+'\x20['+_0x1c0023[_0x261cbb(0xb7)]+']\x20'+_0x1c0023['description']),_0x1c0023;}[a5_0x59dbf1(0x124)](_0x4a1bef){const _0x37f317=a5_0x59dbf1,_0x3c5cc5=this[_0x37f317(0x90)][_0x37f317(0xe4)](_0xfa8122=>_0xfa8122['id']===_0x4a1bef);if(_0x3c5cc5===-0x1)return![];const _0x34a2c3=this[_0x37f317(0x90)][_0x37f317(0x119)](_0x3c5cc5,0x1)[0x0];return this[_0x37f317(0x122)](),console['log']('['+(0x0,session_1[_0x37f317(0xd9)])()+_0x37f317(0xcb)+_0x34a2c3['id']),!![];}[a5_0x59dbf1(0x99)](_0x4a2568,_0x15f091){const _0x5f4587=a5_0x59dbf1,_0x53d620=this[_0x5f4587(0x90)][_0x5f4587(0x121)](_0x35faca=>_0x35faca['id']===_0x4a2568);if(!_0x53d620)return![];return _0x53d620[_0x5f4587(0x126)]=_0x15f091,this[_0x5f4587(0x122)](),console[_0x5f4587(0xe6)]('['+(0x0,session_1['timestamp'])()+_0x5f4587(0xae)+_0x53d620['id']+'\x20'+(_0x15f091?_0x5f4587(0xcf):'已暂停')),!![];}[a5_0x59dbf1(0xfe)](_0x626f2f){const _0x2c9700=a5_0x59dbf1;if(_0x626f2f)return this[_0x2c9700(0x90)]['filter'](_0x594667=>_0x594667[_0x2c9700(0x8c)]===_0x626f2f);return[...this[_0x2c9700(0x90)]];}[a5_0x59dbf1(0xa8)](_0x1cd453){const _0x24670b=a5_0x59dbf1;return this[_0x24670b(0x90)][_0x24670b(0x121)](_0x2cc681=>_0x2cc681['id']===_0x1cd453);}async[a5_0x59dbf1(0x131)](_0x5e9ee2,_0x2a80bb,_0xdbe967,_0x5b71bf){const _0x27910b=a5_0x59dbf1;try{const _0x592dea=await analyzeCronWithClaude(this['dc'],_0x5e9ee2,_0x2a80bb);if(!isValidCronExpression(_0x592dea[_0x27910b(0xa4)]))return{'error':'Claude\x20返回的cron表达式无效:\x20'+_0x592dea[_0x27910b(0xa4)]};const _0x575149=this[_0x27910b(0x97)]({'conversationId':_0x5e9ee2,'cronExpression':_0x592dea[_0x27910b(0xa4)],'description':_0x592dea[_0x27910b(0x104)]||_0x2a80bb['substring'](0x0,0x32),'prompt':_0x592dea[_0x27910b(0xdb)],'senderStaffId':_0xdbe967,'senderNick':_0x5b71bf});return{'job':_0x575149};}catch(_0x5cd2f3){return{'error':_0x5cd2f3 instanceof Error?_0x5cd2f3[_0x27910b(0xda)]:String(_0x5cd2f3)};}}[a5_0x59dbf1(0x122)](){const _0x4671ad=a5_0x59dbf1;saveCronJobs(this['dc'],this[_0x4671ad(0x90)]);}[a5_0x59dbf1(0xe8)](){const _0x1f0ca6=a5_0x59dbf1,_0x159acf=Date[_0x1f0ca6(0x89)](),_0x4d5847=0xea60-_0x159acf%0xea60;setTimeout(()=>{const _0x41fd2f=_0x1f0ca6;this[_0x41fd2f(0xd2)](),this['timer']=setInterval(()=>this[_0x41fd2f(0xd2)](),0xea60);},_0x4d5847);}[a5_0x59dbf1(0xd5)](){const _0x30093d=a5_0x59dbf1;this[_0x30093d(0xee)]&&(clearInterval(this[_0x30093d(0xee)]),this[_0x30093d(0xee)]=null);}[a5_0x59dbf1(0xd2)](){const _0x6ee405=a5_0x59dbf1,_0x4e3b61=Date['now'](),_0x222cfa=this[_0x6ee405(0xfd)]<0x0?_0x4e3b61-_0x4e3b61%0xea60:this[_0x6ee405(0xfd)]+0xea60-this[_0x6ee405(0xfd)]%0xea60,_0x347d54=_0x4e3b61-_0x4e3b61%0xea60;for(let _0x1ab54a=_0x222cfa;_0x1ab54a<=_0x347d54;_0x1ab54a+=0xea60){const _0x513302=new Date(_0x1ab54a);if(!this[_0x6ee405(0xce)](_0x513302))break;}this['lastCheckedTime']=_0x4e3b61;}['checkJobsAt'](_0x5de139){const _0x3f2cb3=a5_0x59dbf1;if(this[_0x3f2cb3(0x127)][_0x3f2cb3(0x94)]>=this[_0x3f2cb3(0xa7)])return console[_0x3f2cb3(0xdc)]('['+(0x0,session_1[_0x3f2cb3(0xd9)])()+']\x20Cron并发上限('+this[_0x3f2cb3(0xa7)]+_0x3f2cb3(0x114)+_0x5de139['toISOString']()+'\x20的检查'),![];for(const _0x4d65d3 of this[_0x3f2cb3(0x90)]){if(!_0x4d65d3[_0x3f2cb3(0x126)])continue;if(this['runningJobIds'][_0x3f2cb3(0xed)](_0x4d65d3['id']))continue;if(this[_0x3f2cb3(0x127)][_0x3f2cb3(0x94)]>=this[_0x3f2cb3(0xa7)])break;if(!matchesCron(_0x4d65d3[_0x3f2cb3(0xb7)],_0x5de139))continue;console[_0x3f2cb3(0xe6)]('['+(0x0,session_1[_0x3f2cb3(0xd9)])()+']\x20Cron触发:\x20'+_0x4d65d3['id']+'\x20['+_0x4d65d3['cronExpression']+']\x20'+_0x4d65d3[_0x3f2cb3(0x129)]),this[_0x3f2cb3(0xaa)](_0x4d65d3)['catch'](_0x1289c2=>{const _0x53356e=_0x3f2cb3;console[_0x53356e(0xaf)]('['+(0x0,session_1[_0x53356e(0xd9)])()+_0x53356e(0xd0)+_0x4d65d3['id'],_0x1289c2);});}return!![];}async[a5_0x59dbf1(0xaa)](_0x1dbf74){const _0x1445cb=a5_0x59dbf1;this['runningJobIds'][_0x1445cb(0x92)](_0x1dbf74['id']);try{const _0x35615a=this['dc'][_0x1445cb(0x108)](_0x1dbf74[_0x1445cb(0x8c)]);if(!_0x35615a){console[_0x1445cb(0xdc)]('['+(0x0,session_1[_0x1445cb(0xd9)])()+_0x1445cb(0xe5)+_0x1dbf74['id']+_0x1445cb(0xb6));return;}const _0x5e6683=!!(_0x35615a[_0x1445cb(0x9a)]||this['dc']['config'][_0x1445cb(0xe7)]);if(!_0x5e6683){console['warn']('['+(0x0,session_1[_0x1445cb(0xd9)])()+']\x20Cron任务\x20'+_0x1dbf74['id']+_0x1445cb(0xe1));return;}const _0x2b4deb=(0x0,session_1[_0x1445cb(0xfa)])(this['dc'],_0x1dbf74[_0x1445cb(0x8c)]);if(_0x2b4deb){console['log']('['+(0x0,session_1[_0x1445cb(0xd9)])()+_0x1445cb(0xe5)+_0x1dbf74['id']+_0x1445cb(0xd4)),await this[_0x1445cb(0xfb)](_0x1dbf74);return;}const _0x4f68e1=Date[_0x1445cb(0x89)](),_0x2ac028={'conversationId':_0x1dbf74['conversationId'],'sessionWebhook':'','startTime':_0x4f68e1,'startTimeStr':utils_ok_1['dateUtil']['mm'](_0x4f68e1)[_0x1445cb(0xcc)](_0x1445cb(0xc1)),'startStaffId':_0x1dbf74[_0x1445cb(0x95)],'startNickName':_0x1445cb(0x110)+_0x1dbf74[_0x1445cb(0xad)]},_0x3f6177=(0x0,session_1[_0x1445cb(0xac)])(this['dc'],_0x2ac028);fs_1[_0x1445cb(0x101)][_0x1445cb(0x86)](_0x3f6177,{'recursive':!![]}),fs_1['default']['writeFileSync'](_0x3f6177+_0x1445cb(0xf6),JSON[_0x1445cb(0xba)](_0x2ac028,null,0x2),_0x1445cb(0xff)),this['dc']['activeSessions'][_0x1445cb(0xb1)](_0x1dbf74[_0x1445cb(0x8c)],{'session':_0x2ac028,'lastSenderStaffId':_0x1dbf74[_0x1445cb(0x95)],'isProcessing':!![],'messageQueue':[],'conversationConfig':_0x35615a}),(0x0,session_1[_0x1445cb(0x11b)])(this['dc'],_0x1dbf74[_0x1445cb(0x8c)]),console[_0x1445cb(0xe6)]('['+(0x0,session_1[_0x1445cb(0xd9)])()+_0x1445cb(0xe5)+_0x1dbf74['id']+'\x20开始执行:\x20'+_0x1dbf74['description']),fs_1['default']['appendFileSync'](_0x3f6177+_0x1445cb(0x112),'['+(0x0,session_1['timestamp'])()+_0x1445cb(0x12c)+_0x1dbf74[_0x1445cb(0x129)]+'\x0a',_0x1445cb(0xff));try{await(0x0,claude_process_1[_0x1445cb(0x9e)])(this['dc'],_0x2ac028,_0x1dbf74[_0x1445cb(0xdb)],{'skill':_0x35615a['taskCfg']?.[_0x1445cb(0xa9)],'agent':_0x35615a[_0x1445cb(0x107)],'senderNick':_0x1dbf74[_0x1445cb(0xad)],'senderStaffId':_0x1dbf74[_0x1445cb(0x95)]});}catch(_0x3b4dca){console[_0x1445cb(0xaf)]('['+(0x0,session_1[_0x1445cb(0xd9)])()+']\x20Cron执行Claude查询失败:\x20'+_0x1dbf74['id'],_0x3b4dca),await(0x0,messaging_1['sendDingMessage'])(this['dc'],{'conversationId':_0x1dbf74[_0x1445cb(0x8c)],'sessionWebhook':'','atUserId':_0x1dbf74['senderStaffId'],'content':'❌\x20定时任务执行失败:\x20'+(_0x3b4dca instanceof Error?_0x3b4dca[_0x1445cb(0xda)]:String(_0x3b4dca))});}finally{this['dc'][_0x1445cb(0xd6)][_0x1445cb(0xe2)](_0x1dbf74[_0x1445cb(0x8c)]),(0x0,session_1[_0x1445cb(0x11b)])(this['dc'],_0x1dbf74[_0x1445cb(0x8c)]);}_0x1dbf74[_0x1445cb(0x8b)]=(0x0,session_1[_0x1445cb(0xd9)])(),this[_0x1445cb(0x122)]();}finally{this[_0x1445cb(0x127)][_0x1445cb(0xe2)](_0x1dbf74['id']);}}async[a5_0x59dbf1(0xfb)](_0x45340f){const _0xd0af65=a5_0x59dbf1;try{await(0x0,task_1[_0xd0af65(0x8a)])(this['dc'],{'conversationId':_0x45340f[_0xd0af65(0x8c)],'prompt':_0x45340f[_0xd0af65(0xdb)],'senderStaffId':_0x45340f[_0xd0af65(0x95)],'senderNickName':_0xd0af65(0x110)+_0x45340f['senderNick'],'sessionWebhook':'','type':_0xd0af65(0xa4)}),console[_0xd0af65(0xe6)]('['+(0x0,session_1['timestamp'])()+_0xd0af65(0xe5)+_0x45340f['id']+_0xd0af65(0x100)+_0x45340f['description']);}catch(_0x28b57c){console[_0xd0af65(0xaf)]('['+(0x0,session_1[_0xd0af65(0xd9)])()+_0xd0af65(0xe5)+_0x45340f['id']+_0xd0af65(0x103),_0x28b57c);}_0x45340f['lastRunAt']=(0x0,session_1[_0xd0af65(0xd9)])(),this[_0xd0af65(0x122)]();}}exports[a5_0x59dbf1(0xf0)]=CronEngine;
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.CronEngine=void 0,exports.isValidCronExpression=isValidCronExpression,exports.formatCronJobList=formatCronJobList,exports.formatCronJobInfo=formatCronJobInfo;const fs_1=__importDefault(require("fs")),readline_1=__importDefault(require("readline")),child_process_1=require("child_process"),utils_ok_1=require("utils-ok"),messaging_1=require("./messaging"),claude_process_1=require("./claude-process"),task_1=require("./task"),session_1=require("./session");function getCronFile(s){return`${(0,session_1.getClientDir)(s)}/cron.json`}function loadCronJobs(s){const t=getCronFile(s);try{const e=JSON.parse(fs_1.default.readFileSync(t,"utf-8"));return Array.isArray(e)?e:e.jobs||[]}catch{return[]}}function saveCronJobs(s,t){const e=getCronFile(s);fs_1.default.writeFileSync(e,JSON.stringify(t,null,2),"utf-8")}function matchesCronField(s,t,e,r){if(s==="*")return!0;if(s.includes(","))return s.split(",").some(n=>matchesCronField(n.trim(),t,e,r));if(s.includes("/")){const n=s.indexOf("/"),o=s.substring(0,n),d=parseInt(s.substring(n+1),10);if(isNaN(d)||d<=0)return!1;let a=e,c=r;if(o!=="*")if(o.includes("-")){const u=o.split("-").map(Number);a=u[0],c=u[1]}else a=parseInt(o,10),c=r;return t<a||t>c?!1:(t-a)%d===0}if(s.includes("-")){const n=s.split("-").map(Number);return t>=n[0]&&t<=n[1]}const i=parseInt(s,10);return!isNaN(i)&&t===i}function matchesCron(s,t){const e=s.trim().split(/\s+/);if(e.length!==5)return!1;const r=t.getMinutes(),i=t.getHours(),n=t.getDate(),o=t.getMonth()+1,d=t.getDay();if(!matchesCronField(e[0],r,0,59)||!matchesCronField(e[1],i,0,23)||!matchesCronField(e[3],o,1,12))return!1;const a=matchesCronField(e[2],n,1,31),c=matchesCronField(e[4],d,0,7)||d===0&&matchesCronField(e[4],7,0,7),u=e[2]==="*",h=e[4]==="*";return u&&h?!0:u?c:h?a:a||c}function isValidCronExpression(s){const t=s.trim().split(/\s+/);if(t.length!==5)return!1;const e=/^(\*|\d+|\d+-\d+|\*\/\d+|\d+\/\d+|\d+-\d+\/\d+|\d+(,\d+)+)$/;return t.every(r=>e.test(r))}const ANALYSIS_PROMPT=`\u5206\u6790\u4EE5\u4E0B\u5B9A\u65F6\u4EFB\u52A1\u63CF\u8FF0\uFF0C\u63D0\u53D6cron\u8868\u8FBE\u5F0F\u548C\u4EFB\u52A1\u5185\u5BB9\u3002
|
|
2
|
+
|
|
3
|
+
\u7528\u6237\u8F93\u5165: {INPUT}
|
|
4
|
+
|
|
5
|
+
\u8BF7\u4E25\u683C\u8FD4\u56DE\u4EE5\u4E0BJSON\u683C\u5F0F\uFF08\u4E0D\u8981\u8FD4\u56DE\u5176\u4ED6\u4EFB\u4F55\u5185\u5BB9\uFF09\uFF1A
|
|
6
|
+
{"cron":"5\u4F4Dcron\u8868\u8FBE\u5F0F(\u5206 \u65F6 \u65E5 \u6708 \u5468)","prompt":"\u8981\u6267\u884C\u7684\u4EFB\u52A1\u63D0\u793A\u8BCD","desc":"\u7B80\u77ED\u7684\u4E2D\u6587\u63CF\u8FF0"}
|
|
7
|
+
|
|
8
|
+
\u5E38\u89C1cron\u683C\u5F0F\uFF1A
|
|
9
|
+
- \u6BCF\u5929\u65E9\u4E0A9\u70B9: "0 9 * * *"
|
|
10
|
+
- \u6BCF\u5468\u4E00\u65E9\u4E0A9\u70B9: "0 9 * * 1"
|
|
11
|
+
- \u5DE5\u4F5C\u65E5\u65E9\u4E0A9\u70B9: "0 9 * * 1-5"
|
|
12
|
+
- \u6BCF\u5C0F\u65F6: "0 * * * *"
|
|
13
|
+
- \u6BCF30\u5206\u949F: "*/30 * * * *"
|
|
14
|
+
- \u6BCF\u5929\u4E2D\u534812\u70B9: "0 12 * * *"
|
|
15
|
+
- \u6BCF\u67081\u53F7\u65E9\u4E0A9\u70B9: "0 9 1 * *"
|
|
16
|
+
- \u6BCF\u5468\u4E94\u4E0B\u53483\u70B9: "0 15 * * 5"`;async function analyzeCronWithClaude(s,t,e){const r=s.getConversationDir(t),i="claude",n=ANALYSIS_PROMPT.replace("{INPUT}",e),o=["--permission-mode","bypassPermissions","--print","--output-format","stream-json","--verbose"],d=(0,claude_process_1.resolveClaudeSettingsPath)(s,r);return d&&o.push("--settings",d),console.log(`[${(0,session_1.timestamp)()}] Cron\u5206\u6790: ${i} ${o.join(" ")}`),new Promise((a,c)=>{const u=(0,child_process_1.spawn)(i,o,{cwd:r,stdio:["pipe","pipe","pipe"]});u.stdin?.write(`${n}
|
|
17
|
+
`),u.stdin?.end();let h="",m="";readline_1.default.createInterface({input:u.stdout}).on("line",l=>{const f=(0,claude_process_1.parseClaudeStreamLine)(l);f?.type==="result"&&f.content&&(h=f.content)}),u.stderr?.on("data",l=>{m+=l.toString()});const g=setTimeout(()=>{u.kill(),c(new Error("\u5206\u6790\u8D85\u65F6(60s)"))},6e4);u.on("close",l=>{if(clearTimeout(g),l===0&&h)try{const f=h.match(/\{[\s\S]*\}/);if(f){const p=JSON.parse(f[0]);if(p.cron&&p.prompt){a(p);return}}c(new Error("Claude \u8FD4\u56DE\u683C\u5F0F\u4E0D\u6B63\u786E"))}catch{c(new Error("JSON \u89E3\u6790\u5931\u8D25"))}else{const f=m.trim()?` (${m.trim().substring(0,200)})`:"";console.error(`[${(0,session_1.timestamp)()}] Cron\u5206\u6790\u8FDB\u7A0B\u9000\u51FA(${l})${f}`);const p=m;/\b429\b/.test(p)?c(new Error("Claude \u914D\u989D\u5DF2\u8017\u5C3D(429)\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u6216\u660E\u5929\u518D\u8BD5")):/\b422\b/.test(p)||/TPM|额度超限/i.test(p)?c(new Error("Claude TPM \u9650\u6D41(422)\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")):/\b401\b/.test(p)||/auth|认证|permission/i.test(p)?c(new Error("Claude \u8BA4\u8BC1\u5931\u8D25(401)\uFF0C\u8BF7\u68C0\u67E5 API Key \u914D\u7F6E")):l===1&&!h&&!m.trim()?c(new Error("Claude \u8FDB\u7A0B\u5F02\u5E38\u9000\u51FA\uFF0C\u65E0\u8F93\u51FA\u3002\u8BF7\u68C0\u67E5 claude \u547D\u4EE4\u662F\u5426\u53EF\u7528")):c(new Error(`\u5206\u6790\u5931\u8D25 (\u9000\u51FA\u7801: ${l})${f}`))}}),u.on("error",l=>{clearTimeout(g),c(new Error(`\u542F\u52A8 Claude \u8FDB\u7A0B\u5931\u8D25: ${l.message}`))})})}function formatCronJobList(s){if(s.length===0)return"\u{1F4ED} \u6682\u65E0\u5B9A\u65F6\u4EFB\u52A1";const t=[`### \u23F0 \u5B9A\u65F6\u4EFB\u52A1\u5217\u8868
|
|
18
|
+
`];for(const e of s){const r=e.enabled?"\u2705":"\u23F8\uFE0F",i=e.lastRunAt||"-";t.push(`**${r} ${e.id}**`),t.push(`- Cron: \`${e.cronExpression}\``),t.push(`- \u63CF\u8FF0: ${e.description}`),t.push(`- \u4EFB\u52A1: ${e.prompt}`),t.push(`- \u521B\u5EFA\u8005: ${e.senderNick}`),t.push(`- \u4E0A\u6B21\u6267\u884C: ${i}`),t.push("")}return t.push("\u{1F4A1} `/cron pause <id>` \u6682\u505C | `/cron resume <id>` \u6062\u590D | `/cron delete <id>` \u5220\u9664"),t.join(`
|
|
19
|
+
`)}function formatCronJobInfo(s){const t=s.enabled?"\u2705 \u542F\u7528":"\u23F8\uFE0F \u6682\u505C";return[`### \u23F0 \u5B9A\u65F6\u4EFB\u52A1 ${s.id}`,"",`- **\u72B6\u6001:** ${t}`,`- **Cron:** \`${s.cronExpression}\``,`- **\u63CF\u8FF0:** ${s.description}`,`- **\u4EFB\u52A1:** ${s.prompt}`,`- **\u521B\u5EFA\u8005:** ${s.senderNick}`,`- **\u521B\u5EFA\u65F6\u95F4:** ${s.createdAt}`,`- **\u4E0A\u6B21\u6267\u884C:** ${s.lastRunAt||"-"}`].join(`
|
|
20
|
+
`)}class CronEngine{constructor(t){this.jobs=[],this.timer=null,this.lastCheckedTime=-1,this.runningJobIds=new Set,this.MAX_CONCURRENT_JOBS=3,this.dc=t,this.jobs=loadCronJobs(t)}start(){this.startScheduler();const t=this.jobs.filter(e=>e.enabled).length;console.log(`[${(0,session_1.timestamp)()}] Cron\u5F15\u64CE\u5DF2\u542F\u52A8, \u5171 ${this.jobs.length} \u4E2A\u4EFB\u52A1 (${t} \u542F\u7528)`)}destroy(){this.stopScheduler()}addJob(t){const e={id:`cron_${Date.now()}`,conversationId:t.conversationId,cronExpression:t.cronExpression,description:t.description,prompt:t.prompt,enabled:!0,createdAt:(0,session_1.timestamp)(),senderStaffId:t.senderStaffId,senderNick:t.senderNick};return this.jobs.push(e),this.persist(),console.log(`[${(0,session_1.timestamp)()}] \u65B0\u589E\u5B9A\u65F6\u4EFB\u52A1: ${e.id} [${e.cronExpression}] ${e.description}`),e}removeJob(t){const e=this.jobs.findIndex(i=>i.id===t);if(e===-1)return!1;const r=this.jobs.splice(e,1)[0];return this.persist(),console.log(`[${(0,session_1.timestamp)()}] \u5220\u9664\u5B9A\u65F6\u4EFB\u52A1: ${r.id}`),!0}toggleJob(t,e){const r=this.jobs.find(i=>i.id===t);return r?(r.enabled=e,this.persist(),console.log(`[${(0,session_1.timestamp)()}] \u5B9A\u65F6\u4EFB\u52A1 ${r.id} ${e?"\u5DF2\u6062\u590D":"\u5DF2\u6682\u505C"}`),!0):!1}listJobs(t){return t?this.jobs.filter(e=>e.conversationId===t):[...this.jobs]}getJob(t){return this.jobs.find(e=>e.id===t)}async analyzeAndCreate(t,e,r,i){try{const n=await analyzeCronWithClaude(this.dc,t,e);return isValidCronExpression(n.cron)?{job:this.addJob({conversationId:t,cronExpression:n.cron,description:n.desc||e.substring(0,50),prompt:n.prompt,senderStaffId:r,senderNick:i})}:{error:`Claude \u8FD4\u56DE\u7684cron\u8868\u8FBE\u5F0F\u65E0\u6548: ${n.cron}`}}catch(n){return{error:n instanceof Error?n.message:String(n)}}}persist(){saveCronJobs(this.dc,this.jobs)}startScheduler(){const e=6e4-Date.now()%6e4;setTimeout(()=>{this.tick(),this.timer=setInterval(()=>this.tick(),6e4)},e)}stopScheduler(){this.timer&&(clearInterval(this.timer),this.timer=null)}tick(){const t=Date.now(),e=this.lastCheckedTime<0?t-t%6e4:this.lastCheckedTime+6e4-this.lastCheckedTime%6e4,r=t-t%6e4;for(let i=e;i<=r;i+=6e4){const n=new Date(i);if(!this.checkJobsAt(n))break}this.lastCheckedTime=t}checkJobsAt(t){if(this.runningJobIds.size>=this.MAX_CONCURRENT_JOBS)return console.warn(`[${(0,session_1.timestamp)()}] Cron\u5E76\u53D1\u4E0A\u9650(${this.MAX_CONCURRENT_JOBS}), \u8DF3\u8FC7 ${t.toISOString()} \u7684\u68C0\u67E5`),!1;for(const e of this.jobs)if(e.enabled&&!this.runningJobIds.has(e.id)){if(this.runningJobIds.size>=this.MAX_CONCURRENT_JOBS)break;matchesCron(e.cronExpression,t)&&(console.log(`[${(0,session_1.timestamp)()}] Cron\u89E6\u53D1: ${e.id} [${e.cronExpression}] ${e.description}`),this.executeJob(e).catch(r=>{console.error(`[${(0,session_1.timestamp)()}] Cron\u6267\u884C\u5931\u8D25: ${e.id}`,r)}))}return!0}async executeJob(t){this.runningJobIds.add(t.id);try{const e=this.dc.getConversationConfig(t.conversationId);if(!e){console.warn(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u7684\u4F1A\u8BDD\u914D\u7F6E\u4E0D\u5B58\u5728, \u8DF3\u8FC7\u6267\u884C`);return}if(!!!(e.dingToken||this.dc.config.defaultDingToken)){console.warn(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u65E0\u901A\u77E5\u80FD\u529B(\u65E0dingToken\u4E14\u65E0defaultDingToken), \u8DF3\u8FC7\u6267\u884C`);return}if((0,session_1.findActiveSession)(this.dc,t.conversationId)){console.log(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u7684\u4F1A\u8BDD\u6709\u6D3B\u8DC3session, \u964D\u7EA7\u5230\u4EFB\u52A1\u961F\u5217`),await this.enqueueAsTask(t);return}const n=Date.now(),o={conversationId:t.conversationId,sessionWebhook:"",startTime:n,startTimeStr:utils_ok_1.dateUtil.mm(n).format("YYYY-MM-DD-HH-mm-ss"),startStaffId:t.senderStaffId,startNickName:`[cron]${t.senderNick}`},d=(0,session_1.getSessionDir)(this.dc,o);fs_1.default.mkdirSync(d,{recursive:!0}),fs_1.default.writeFileSync(`${d}/session.json`,JSON.stringify(o,null,2),"utf-8"),this.dc.activeSessions.set(t.conversationId,{session:o,lastSenderStaffId:t.senderStaffId,isProcessing:!0,messageQueue:[],conversationConfig:e}),(0,session_1.saveActiveSession)(this.dc,t.conversationId),console.log(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u5F00\u59CB\u6267\u884C: ${t.description}`),fs_1.default.appendFileSync(`${d}/session.log`,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u5B9A\u65F6\u4EFB\u52A1\u89E6\u53D1: ${t.description}
|
|
21
|
+
`,"utf-8");try{await(0,claude_process_1.executeClaudeQuery)(this.dc,o,t.prompt,{skill:e.taskCfg?.skill,agent:e.agent,senderNick:t.senderNick,senderStaffId:t.senderStaffId})}catch(a){console.error(`[${(0,session_1.timestamp)()}] Cron\u6267\u884CClaude\u67E5\u8BE2\u5931\u8D25: ${t.id}`,a),await(0,messaging_1.sendDingMessage)(this.dc,{conversationId:t.conversationId,sessionWebhook:"",atUserId:t.senderStaffId,content:`\u274C \u5B9A\u65F6\u4EFB\u52A1\u6267\u884C\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`})}finally{this.dc.activeSessions.delete(t.conversationId),(0,session_1.saveActiveSession)(this.dc,t.conversationId)}t.lastRunAt=(0,session_1.timestamp)(),this.persist()}finally{this.runningJobIds.delete(t.id)}}async enqueueAsTask(t){try{await(0,task_1.saveTask)(this.dc,{conversationId:t.conversationId,prompt:t.prompt,senderStaffId:t.senderStaffId,senderNickName:`[cron]${t.senderNick}`,sessionWebhook:"",type:"cron"}),console.log(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u5DF2\u964D\u7EA7\u5230\u4EFB\u52A1\u961F\u5217: ${t.description}`)}catch(e){console.error(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u964D\u7EA7\u5230\u4EFB\u52A1\u961F\u5217\u5931\u8D25:`,e)}t.lastRunAt=(0,session_1.timestamp)(),this.persist()}}exports.CronEngine=CronEngine;
|
package/dist/src/biz/doctor.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
'use strict';function a6_0x544a(){const _0x25c12e=['5298552KYwVSG','缺少必填字段:\x20','__esModule','dingToken','keys','test','cron.json\x20共\x20','2177472mMGAhA','push','model','getHomeDir','split','\x20警告,\x20','\x20apiKey\x20重复:\x20','.doctor-check','cron.json\x20格式异常,无法解析为任务数组','客户端目录不可写:\x20','conversations\x20应为数组','whiteUserList','settings-tpl.json','\x20启用)','config.json\x20不存在','default','settings-tpl.json\x20缺少\x20env\x20字段','./session','PASS','config.json','(空)','claudeSettings','readFileSync','====================================\x0a','settings-tpl.json\x20不存在,创建\x20settings-ding.json\x20时将使用空模板','客户端目录存在:\x20','clientSecret','object',']\x20缺少\x20prompt','kill','.cc-ding','config.json\x20解析成功','join','utf-8','claude\x20命令不可用,请确认\x20Claude\x20Code\x20CLI\x20已安装','conversationId','进程运行中\x20(PID:\x20','Node\x20版本:','defineProperty','execSync','slice','exit','\x20仍为占位符:\x20','level','cronExpression','owner:\x20','1851292UzNjNI','\x20缺少\x20conversationId','isValid','settings-tpl.json\x20解析失败:\x20','boolean','isArray','has','settingLabel','cron.json','version','\x20为空数组','./api-key-manager',']\x20conversationId\x20\x22','apiKeyCfg.claudeSettings\x20不是数组','apiKeyCfg\x20未配置,无法使用\x20API\x20Key\x20池化轮换',']\x20缺少\x20id','string','settings-tpl.json\x20有效,env\x20包含:\x20','length','existsSync','WARN','7SujfPf','11915320zyVAzR','trim','12LITSim','30243590uLpoUK','2424505YjPrGT','some','resetTime',']\x20缺少\x20cronExpression','settings-tpl.json\x20根元素不是对象','runDoctor','which\x20claude','apiKeyCfg.claudeSettings\x20为空,无备用\x20Key','owner','defaultDingToken','PID\x20锁文件读取异常:\x20','conversations\x20为空数组,可通过\x20/reg\x20命令动态注册','add','enabled','\x20缺少\x20model','\x20个定时任务\x20(','conversations[','\x20linkConversationId\x20\x22','baseUrl','env','cron.json[','unlinkSync','\x20通过,\x20','\x20\x20❌\x20存在致命问题,请修复后重新运行','------------------------------------','jobs','\x20\x20✅\x20所有检查通过','filter','\x20项,有效\x20','apiKeyCfg','message','conversations','apiKey','\x20个群配置','9AhrxeS','path','log','prompt','cron.json\x20不存在\x20(无定时任务)','\x20缺少\x20baseUrl','\x20致命','\x22\x20未在\x20conversations\x20中找到','apiKeyCfg.claudeSettings[','1253209afdfNt','parse','printDoctorResults','FATAL','无运行中的进程','linkConversationId','startsWith','owner\x20未配置,管理命令(/clean,\x20/open,\x20/reset-apikeycfg,\x20/reg,\x20/auth)不可用','apiKeyCfg.resetTime:\x20','\x20conversationId\x20仍为占位符:\x20','claude\x20命令可用','\x20isValid\x20类型异常:\x20'];a6_0x544a=function(){return _0x25c12e;};return a6_0x544a();}const a6_0x3a40ed=a6_0x13b7;(function(_0x48f8b4,_0x13739b){const _0x3dc24b=a6_0x13b7,_0xe595c5=_0x48f8b4();while(!![]){try{const _0x44b77e=parseInt(_0x3dc24b(0xd2))/0x1+parseInt(_0x3dc24b(0xe5))/0x2+-parseInt(_0x3dc24b(0xc9))/0x3*(-parseInt(_0x3dc24b(0x8d))/0x4)+-parseInt(_0x3dc24b(0xa7))/0x5*(-parseInt(_0x3dc24b(0xa5))/0x6)+-parseInt(_0x3dc24b(0xa2))/0x7*(parseInt(_0x3dc24b(0xa3))/0x8)+parseInt(_0x3dc24b(0xde))/0x9+-parseInt(_0x3dc24b(0xa6))/0xa;if(_0x44b77e===_0x13739b)break;else _0xe595c5['push'](_0xe595c5['shift']());}catch(_0x3d9213){_0xe595c5['push'](_0xe595c5['shift']());}}}(a6_0x544a,0xbd402));var __importDefault=this&&this['__importDefault']||function(_0x4e9f65){const _0x34cca0=a6_0x13b7;return _0x4e9f65&&_0x4e9f65[_0x34cca0(0xe0)]?_0x4e9f65:{'default':_0x4e9f65};};function a6_0x13b7(_0x1519f4,_0xbc0dcf){_0x1519f4=_0x1519f4-0x6f;const _0x544aa1=a6_0x544a();let _0x13b7a2=_0x544aa1[_0x1519f4];return _0x13b7a2;}Object[a6_0x3a40ed(0x85)](exports,a6_0x3a40ed(0xe0),{'value':!![]}),exports[a6_0x3a40ed(0xd4)]=printDoctorResults,exports[a6_0x3a40ed(0xac)]=runDoctor;const session_1=require(a6_0x3a40ed(0x70)),api_key_manager_1=require(a6_0x3a40ed(0x98)),fs_1=__importDefault(require('fs')),path_1=__importDefault(require(a6_0x3a40ed(0xca))),child_process_1=require('child_process');function printDoctorResults(_0x570f49){const _0x1f9ace=a6_0x3a40ed;console['log'](''),console[_0x1f9ace(0xcb)]('==========\x20cc-ding\x20doctor\x20==========');const _0x22d4c8=_0x570f49[_0x1f9ace(0xa8)](_0x5f49e6=>_0x5f49e6[_0x1f9ace(0x8a)]==='FATAL');for(const _0x4788a0 of _0x570f49){const _0x235fa5=_0x4788a0[_0x1f9ace(0x8a)]===_0x1f9ace(0x71)?'✓':_0x4788a0[_0x1f9ace(0x8a)]===_0x1f9ace(0xd5)?'✗':'⚠',_0x47eb56=_0x4788a0[_0x1f9ace(0x8a)]===_0x1f9ace(0x71)?'':'['+_0x4788a0['level']+']\x20';console['log']('\x20\x20'+_0x235fa5+'\x20'+_0x47eb56+_0x4788a0[_0x1f9ace(0xc5)]);}const _0x22d544=_0x570f49[_0x1f9ace(0xc2)](_0x4bbb1c=>_0x4bbb1c[_0x1f9ace(0x8a)]===_0x1f9ace(0x71))[_0x1f9ace(0x9f)],_0x3a815a=_0x570f49[_0x1f9ace(0xc2)](_0x47bfe2=>_0x47bfe2['level']==='WARN')[_0x1f9ace(0x9f)],_0x1775a5=_0x570f49[_0x1f9ace(0xc2)](_0x5dda35=>_0x5dda35[_0x1f9ace(0x8a)]===_0x1f9ace(0xd5))[_0x1f9ace(0x9f)];console['log'](_0x1f9ace(0xbf)),console[_0x1f9ace(0xcb)]('\x20\x20合计:\x20'+_0x22d544+_0x1f9ace(0xbd)+_0x3a815a+_0x1f9ace(0xea)+_0x1775a5+_0x1f9ace(0xcf));_0x22d4c8?console['log'](_0x1f9ace(0xbe)):console['log'](_0x1f9ace(0xc1));console[_0x1f9ace(0xcb)](_0x1f9ace(0x76));if(_0x22d4c8)process[_0x1f9ace(0x88)](0x1);}function runDoctor(_0x10accd){const _0x203b71=a6_0x3a40ed,_0xd47475=[],_0x293ae1=process[_0x203b71(0x96)][_0x203b71(0x87)](0x1),_0x354108=parseInt(_0x293ae1[_0x203b71(0xe9)]('.')[0x0],0xa);_0x354108<0x18?_0xd47475[_0x203b71(0xe6)](check('FATAL','Node\x20版本过低:'+_0x293ae1+',要求\x20Node\x20>=\x2024')):_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0x71),_0x203b71(0x84)+_0x293ae1));if(!fs_1[_0x203b71(0xf4)][_0x203b71(0xa0)](_0x10accd))return _0xd47475[_0x203b71(0xe6)](check('FATAL','客户端目录不存在:\x20'+_0x10accd)),_0xd47475;_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0x71),_0x203b71(0x78)+_0x10accd));const _0x42a453=path_1['default'][_0x203b71(0x7f)](_0x10accd,'.pid.lock');if(fs_1[_0x203b71(0xf4)][_0x203b71(0xa0)](_0x42a453))try{const _0x2d592d=parseInt(fs_1['default']['readFileSync'](_0x42a453,_0x203b71(0x80))[_0x203b71(0xa4)](),0xa);if(!isNaN(_0x2d592d))try{process[_0x203b71(0x7c)](_0x2d592d,0x0),_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0x71),_0x203b71(0x83)+_0x2d592d+')'));}catch{_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),'锁文件存在但进程\x20'+_0x2d592d+'\x20已退出(过期锁文件)'));}}catch{_0xd47475[_0x203b71(0xe6)](check('WARN',_0x203b71(0xb1)+_0x42a453));}else _0xd47475[_0x203b71(0xe6)](check(_0x203b71(0x71),_0x203b71(0xd6)));const _0x4e10c8=path_1['default'][_0x203b71(0x7f)](_0x10accd,_0x203b71(0x72));if(!fs_1[_0x203b71(0xf4)]['existsSync'](_0x4e10c8))return _0xd47475['push'](check(_0x203b71(0xd5),_0x203b71(0xf3))),_0xd47475;let _0x321b32;try{_0x321b32=JSON[_0x203b71(0xd3)](fs_1[_0x203b71(0xf4)][_0x203b71(0x75)](_0x4e10c8,_0x203b71(0x80)));}catch(_0x16803f){return _0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xd5),'config.json\x20解析失败:\x20'+(_0x16803f instanceof Error?_0x16803f['message']:_0x16803f))),_0xd47475;}_0xd47475[_0x203b71(0xe6)](check('PASS',_0x203b71(0x7e)));const _0x6b5c08=[{'key':_0x203b71(0x79),'label':'clientSecret'},{'key':_0x203b71(0xb0),'label':_0x203b71(0xb0)},{'key':_0x203b71(0xf0),'label':_0x203b71(0xf0),'isArr':!![]},{'key':_0x203b71(0xaf),'label':'owner'}];for(const {key:_0x53cc43,label:_0x560667,isArr:_0x50d9b9}of _0x6b5c08){const _0x3e78b0=_0x321b32[_0x53cc43];if(_0x3e78b0===undefined||_0x3e78b0===null||_0x3e78b0==='')_0xd47475['push'](check(_0x203b71(0xd5),_0x203b71(0xdf)+_0x560667));else{if(_0x50d9b9&&!Array[_0x203b71(0x92)](_0x3e78b0))_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xd5),_0x560667+'\x20应为数组'));else{if(_0x53cc43!==_0x203b71(0xc6)&&_0x50d9b9&&_0x3e78b0[_0x203b71(0x9f)]===0x0)_0xd47475[_0x203b71(0xe6)](check('WARN',_0x560667+_0x203b71(0x97)));else!_0x50d9b9&&typeof _0x3e78b0==='string'&&_0x3e78b0[_0x203b71(0xd8)]('<')?_0xd47475['push'](check(_0x203b71(0xd5),_0x560667+_0x203b71(0x89)+_0x3e78b0)):_0xd47475['push'](check(_0x203b71(0x71),_0x560667+'\x20✓'));}}}_0x321b32[_0x203b71(0xaf)]?_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0x71),_0x203b71(0x8c)+_0x321b32[_0x203b71(0xaf)])):_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xd5),_0x203b71(0xd9)));const _0x82ea59=[_0x203b71(0x79),_0x203b71(0xb0)];for(const _0x5bbedf of _0x82ea59){const _0x2dc0a4=_0x321b32[_0x5bbedf];typeof _0x2dc0a4===_0x203b71(0x9d)&&/^<.*>$/[_0x203b71(0xe3)](_0x2dc0a4[_0x203b71(0xa4)]())&&_0xd47475['push'](check(_0x203b71(0xd5),_0x5bbedf+_0x203b71(0x89)+_0x2dc0a4));}const _0x28a875=new Set();if(!Array['isArray'](_0x321b32[_0x203b71(0xc6)]))_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xd5),_0x203b71(0xef)));else{if(_0x321b32[_0x203b71(0xc6)][_0x203b71(0x9f)]===0x0)_0xd47475[_0x203b71(0xe6)](check('PASS',_0x203b71(0xb2)));else{for(let _0x57e361=0x0;_0x57e361<_0x321b32[_0x203b71(0xc6)]['length'];_0x57e361++){const _0x2f3516=_0x321b32[_0x203b71(0xc6)][_0x57e361],_0x45e63a=_0x203b71(0xb7)+_0x57e361+']';if(!_0x2f3516[_0x203b71(0x82)])_0xd47475[_0x203b71(0xe6)](check('FATAL',_0x45e63a+_0x203b71(0x8e)));else{if(typeof _0x2f3516['conversationId']===_0x203b71(0x9d)&&/^<.*>$/['test'](_0x2f3516[_0x203b71(0x82)][_0x203b71(0xa4)]()))_0xd47475[_0x203b71(0xe6)](check('FATAL',_0x45e63a+_0x203b71(0xdb)+_0x2f3516['conversationId']));else _0x28a875[_0x203b71(0x93)](_0x2f3516[_0x203b71(0x82)])?_0xd47475[_0x203b71(0xe6)](check('WARN',_0x45e63a+'\x20conversationId\x20重复:\x20'+_0x2f3516[_0x203b71(0x82)])):_0x28a875[_0x203b71(0xb3)](_0x2f3516['conversationId']);}_0x2f3516[_0x203b71(0xd7)]&&!_0x321b32[_0x203b71(0xc6)][_0x203b71(0xa8)](_0x103f23=>_0x103f23[_0x203b71(0x82)]===_0x2f3516['linkConversationId'])&&_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),_0x45e63a+_0x203b71(0xb8)+_0x2f3516[_0x203b71(0xd7)]+_0x203b71(0xd0))),_0x2f3516[_0x203b71(0xe1)]&&typeof _0x2f3516[_0x203b71(0xe1)]===_0x203b71(0x9d)&&/^<.*>$/[_0x203b71(0xe3)](_0x2f3516[_0x203b71(0xe1)]['trim']())&&_0xd47475['push'](check(_0x203b71(0xa1),_0x45e63a+'\x20dingToken\x20仍为占位符'));}_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0x71),'conversations\x20共\x20'+_0x321b32[_0x203b71(0xc6)][_0x203b71(0x9f)]+_0x203b71(0xc8)));}}if(_0x321b32[_0x203b71(0xc4)]){const _0x3aa5e5=_0x321b32[_0x203b71(0xc4)];_0x3aa5e5[_0x203b71(0xa9)]&&_0xd47475['push'](check(_0x203b71(0x71),_0x203b71(0xda)+_0x3aa5e5[_0x203b71(0xa9)]));if(!Array[_0x203b71(0x92)](_0x3aa5e5['claudeSettings']))_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),_0x203b71(0x9a)));else{if(_0x3aa5e5[_0x203b71(0x74)][_0x203b71(0x9f)]===0x0)_0xd47475[_0x203b71(0xe6)](check('WARN',_0x203b71(0xae)));else{const _0x478b2d=new Set();for(let _0x5ccbf9=0x0;_0x5ccbf9<_0x3aa5e5[_0x203b71(0x74)][_0x203b71(0x9f)];_0x5ccbf9++){const _0x2f5cc0=_0x3aa5e5['claudeSettings'][_0x5ccbf9],_0x19afb4=_0x203b71(0xd1)+_0x5ccbf9+']';if(!_0x2f5cc0[_0x203b71(0xc7)])_0xd47475['push'](check(_0x203b71(0xd5),_0x19afb4+'\x20缺少\x20apiKey'));else _0x478b2d['has'](_0x2f5cc0[_0x203b71(0xc7)])?_0xd47475['push'](check(_0x203b71(0xa1),_0x19afb4+_0x203b71(0xeb)+(0x0,api_key_manager_1[_0x203b71(0x94)])(_0x2f5cc0))):_0x478b2d[_0x203b71(0xb3)](_0x2f5cc0[_0x203b71(0xc7)]);if(!_0x2f5cc0[_0x203b71(0xb9)])_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),_0x19afb4+_0x203b71(0xce)));if(!_0x2f5cc0[_0x203b71(0xe7)])_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),_0x19afb4+_0x203b71(0xb5)));if(typeof _0x2f5cc0[_0x203b71(0x8f)]!==_0x203b71(0x91))_0xd47475[_0x203b71(0xe6)](check('WARN',_0x19afb4+_0x203b71(0xdd)+typeof _0x2f5cc0['isValid']));}const _0x276cbf=_0x3aa5e5[_0x203b71(0x74)][_0x203b71(0xc2)](_0x15c027=>_0x15c027[_0x203b71(0x8f)])[_0x203b71(0x9f)];_0xd47475[_0x203b71(0xe6)](check('PASS','apiKeyCfg.claudeSettings\x20共\x20'+_0x3aa5e5[_0x203b71(0x74)]['length']+_0x203b71(0xc3)+_0x276cbf));}}}else _0xd47475['push'](check(_0x203b71(0xa1),_0x203b71(0x9b)));const _0x207dbb=path_1[_0x203b71(0xf4)][_0x203b71(0x7f)](_0x10accd,_0x203b71(0x95));if(fs_1[_0x203b71(0xf4)]['existsSync'](_0x207dbb))try{const _0x5693d4=JSON['parse'](fs_1[_0x203b71(0xf4)]['readFileSync'](_0x207dbb,_0x203b71(0x80))),_0x2be6ed=Array[_0x203b71(0x92)](_0x5693d4)?_0x5693d4:_0x5693d4[_0x203b71(0xc0)];if(Array['isArray'](_0x2be6ed)){const _0x18d8a4=_0x2be6ed['filter'](_0x197da5=>_0x197da5[_0x203b71(0xb4)]!==![])[_0x203b71(0x9f)];_0xd47475[_0x203b71(0xe6)](check('PASS',_0x203b71(0xe4)+_0x2be6ed[_0x203b71(0x9f)]+_0x203b71(0xb6)+_0x18d8a4+_0x203b71(0xf2)));for(let _0x59b5e2=0x0;_0x59b5e2<_0x2be6ed[_0x203b71(0x9f)];_0x59b5e2++){const _0x6869ce=_0x2be6ed[_0x59b5e2];if(!_0x6869ce['id'])_0xd47475[_0x203b71(0xe6)](check('WARN',_0x203b71(0xbb)+_0x59b5e2+_0x203b71(0x9c)));if(!_0x6869ce[_0x203b71(0x8b)])_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),_0x203b71(0xbb)+_0x59b5e2+_0x203b71(0xaa)));if(!_0x6869ce[_0x203b71(0xcc)])_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),_0x203b71(0xbb)+_0x59b5e2+_0x203b71(0x7b)));if(!_0x6869ce[_0x203b71(0x82)])_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),_0x203b71(0xbb)+_0x59b5e2+']\x20缺少\x20conversationId'));else!_0x28a875[_0x203b71(0x93)](_0x6869ce[_0x203b71(0x82)])&&_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),'cron.json['+_0x59b5e2+_0x203b71(0x99)+_0x6869ce[_0x203b71(0x82)]+'\x22\x20未在\x20config.json\x20conversations\x20中找到'));}}else _0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),_0x203b71(0xed)));}catch(_0x477636){_0xd47475['push'](check('WARN','cron.json\x20解析失败:\x20'+(_0x477636 instanceof Error?_0x477636[_0x203b71(0xc5)]:_0x477636)));}else _0xd47475[_0x203b71(0xe6)](check('PASS',_0x203b71(0xcd)));const _0x3af983=path_1[_0x203b71(0xf4)][_0x203b71(0x7f)]((0x0,session_1[_0x203b71(0xe8)])(),_0x203b71(0x7d),_0x203b71(0xf1));if(fs_1[_0x203b71(0xf4)][_0x203b71(0xa0)](_0x3af983))try{const _0x5df39a=JSON['parse'](fs_1[_0x203b71(0xf4)][_0x203b71(0x75)](_0x3af983,_0x203b71(0x80)));if(typeof _0x5df39a!=='object'||_0x5df39a===null)_0xd47475['push'](check(_0x203b71(0xa1),_0x203b71(0xab)));else{if(!_0x5df39a[_0x203b71(0xba)]||typeof _0x5df39a[_0x203b71(0xba)]!==_0x203b71(0x7a))_0xd47475['push'](check(_0x203b71(0xa1),_0x203b71(0x6f)));else{const _0x387cae=Object[_0x203b71(0xe2)](_0x5df39a[_0x203b71(0xba)]);_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0x71),_0x203b71(0x9e)+(_0x387cae[_0x203b71(0x7f)](',\x20')||_0x203b71(0x73))));}}}catch(_0x114b9b){_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),_0x203b71(0x90)+(_0x114b9b instanceof Error?_0x114b9b['message']:_0x114b9b)));}else _0xd47475[_0x203b71(0xe6)](check(_0x203b71(0xa1),_0x203b71(0x77)));try{(0x0,child_process_1[_0x203b71(0x86)])(_0x203b71(0xad),{'stdio':'pipe'}),_0xd47475[_0x203b71(0xe6)](check(_0x203b71(0x71),_0x203b71(0xdc)));}catch{_0xd47475['push'](check(_0x203b71(0xd5),_0x203b71(0x81)));}try{const _0x5b772f=path_1[_0x203b71(0xf4)][_0x203b71(0x7f)](_0x10accd,_0x203b71(0xec));fs_1['default']['writeFileSync'](_0x5b772f,'ok',_0x203b71(0x80)),fs_1[_0x203b71(0xf4)][_0x203b71(0xbc)](_0x5b772f),_0xd47475['push'](check(_0x203b71(0x71),'客户端目录可写'));}catch(_0x1e2f04){_0xd47475['push'](check('FATAL',_0x203b71(0xee)+(_0x1e2f04 instanceof Error?_0x1e2f04['message']:_0x1e2f04)));}return _0xd47475;}function check(_0x11bd06,_0x5c2349){return{'level':_0x11bd06,'message':_0x5c2349};}
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.printDoctorResults=printDoctorResults,exports.runDoctor=runDoctor;const session_1=require("./session"),api_key_manager_1=require("./api-key-manager"),fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),child_process_1=require("child_process");function printDoctorResults(t){console.log(""),console.log("========== cc-ding doctor ==========");const e=t.some(i=>i.level==="FATAL");for(const i of t){const r=i.level==="PASS"?"\u2713":i.level==="FATAL"?"\u2717":"\u26A0",f=i.level==="PASS"?"":`[${i.level}] `;console.log(` ${r} ${f}${i.message}`)}const a=t.filter(i=>i.level==="PASS").length,h=t.filter(i=>i.level==="WARN").length,u=t.filter(i=>i.level==="FATAL").length;console.log("------------------------------------"),console.log(` \u5408\u8BA1: ${a} \u901A\u8FC7, ${h} \u8B66\u544A, ${u} \u81F4\u547D`),console.log(e?" \u274C \u5B58\u5728\u81F4\u547D\u95EE\u9898\uFF0C\u8BF7\u4FEE\u590D\u540E\u91CD\u65B0\u8FD0\u884C":" \u2705 \u6240\u6709\u68C0\u67E5\u901A\u8FC7"),console.log(`====================================
|
|
2
|
+
`),e&&process.exit(1)}function runDoctor(t){const e=[],a=process.version.slice(1);if(parseInt(a.split(".")[0],10)<24?e.push(check("FATAL",`Node \u7248\u672C\u8FC7\u4F4E\uFF1A${a}\uFF0C\u8981\u6C42 Node >= 24`)):e.push(check("PASS",`Node \u7248\u672C\uFF1A${a}`)),!fs_1.default.existsSync(t))return e.push(check("FATAL",`\u5BA2\u6237\u7AEF\u76EE\u5F55\u4E0D\u5B58\u5728: ${t}`)),e;e.push(check("PASS",`\u5BA2\u6237\u7AEF\u76EE\u5F55\u5B58\u5728: ${t}`));const u=path_1.default.join(t,".pid.lock");if(fs_1.default.existsSync(u))try{const s=parseInt(fs_1.default.readFileSync(u,"utf-8").trim(),10);if(!isNaN(s))try{process.kill(s,0),e.push(check("PASS",`\u8FDB\u7A0B\u8FD0\u884C\u4E2D (PID: ${s})`))}catch{e.push(check("WARN",`\u9501\u6587\u4EF6\u5B58\u5728\u4F46\u8FDB\u7A0B ${s} \u5DF2\u9000\u51FA\uFF08\u8FC7\u671F\u9501\u6587\u4EF6\uFF09`))}}catch{e.push(check("WARN",`PID \u9501\u6587\u4EF6\u8BFB\u53D6\u5F02\u5E38: ${u}`))}else e.push(check("PASS","\u65E0\u8FD0\u884C\u4E2D\u7684\u8FDB\u7A0B"));const i=path_1.default.join(t,"config.json");if(!fs_1.default.existsSync(i))return e.push(check("FATAL","config.json \u4E0D\u5B58\u5728")),e;let r;try{r=JSON.parse(fs_1.default.readFileSync(i,"utf-8"))}catch(s){return e.push(check("FATAL",`config.json \u89E3\u6790\u5931\u8D25: ${s instanceof Error?s.message:s}`)),e}e.push(check("PASS","config.json \u89E3\u6790\u6210\u529F"));const f=[{key:"clientSecret",label:"clientSecret"},{key:"defaultDingToken",label:"defaultDingToken"},{key:"whiteUserList",label:"whiteUserList",isArr:!0},{key:"owner",label:"owner"}];for(const{key:s,label:n,isArr:l}of f){const o=r[s];o==null||o===""?e.push(check("FATAL",`\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5: ${n}`)):l&&!Array.isArray(o)?e.push(check("FATAL",`${n} \u5E94\u4E3A\u6570\u7EC4`)):s!=="conversations"&&l&&o.length===0?e.push(check("WARN",`${n} \u4E3A\u7A7A\u6570\u7EC4`)):!l&&typeof o=="string"&&o.startsWith("<")?e.push(check("FATAL",`${n} \u4ECD\u4E3A\u5360\u4F4D\u7B26: ${o}`)):e.push(check("PASS",`${n} \u2713`))}r.owner?e.push(check("PASS",`owner: ${r.owner}`)):e.push(check("FATAL","owner \u672A\u914D\u7F6E\uFF0C\u7BA1\u7406\u547D\u4EE4\uFF08/clean, /open, /reset-apikeycfg, /reg, /auth\uFF09\u4E0D\u53EF\u7528"));const S=["clientSecret","defaultDingToken"];for(const s of S){const n=r[s];typeof n=="string"&&/^<.*>$/.test(n.trim())&&e.push(check("FATAL",`${s} \u4ECD\u4E3A\u5360\u4F4D\u7B26: ${n}`))}const d=new Set;if(!Array.isArray(r.conversations))e.push(check("FATAL","conversations \u5E94\u4E3A\u6570\u7EC4"));else if(r.conversations.length===0)e.push(check("PASS","conversations \u4E3A\u7A7A\u6570\u7EC4\uFF0C\u53EF\u901A\u8FC7 /reg \u547D\u4EE4\u52A8\u6001\u6CE8\u518C"));else{for(let s=0;s<r.conversations.length;s++){const n=r.conversations[s],l=`conversations[${s}]`;n.conversationId?typeof n.conversationId=="string"&&/^<.*>$/.test(n.conversationId.trim())?e.push(check("FATAL",`${l} conversationId \u4ECD\u4E3A\u5360\u4F4D\u7B26: ${n.conversationId}`)):d.has(n.conversationId)?e.push(check("WARN",`${l} conversationId \u91CD\u590D: ${n.conversationId}`)):d.add(n.conversationId):e.push(check("FATAL",`${l} \u7F3A\u5C11 conversationId`)),n.linkConversationId&&!r.conversations.some(o=>o.conversationId===n.linkConversationId)&&e.push(check("WARN",`${l} linkConversationId "${n.linkConversationId}" \u672A\u5728 conversations \u4E2D\u627E\u5230`)),n.dingToken&&typeof n.dingToken=="string"&&/^<.*>$/.test(n.dingToken.trim())&&e.push(check("WARN",`${l} dingToken \u4ECD\u4E3A\u5360\u4F4D\u7B26`))}e.push(check("PASS",`conversations \u5171 ${r.conversations.length} \u4E2A\u7FA4\u914D\u7F6E`))}if(r.apiKeyCfg){const s=r.apiKeyCfg;if(s.resetTime&&e.push(check("PASS",`apiKeyCfg.resetTime: ${s.resetTime}`)),!Array.isArray(s.claudeSettings))e.push(check("WARN","apiKeyCfg.claudeSettings \u4E0D\u662F\u6570\u7EC4"));else if(s.claudeSettings.length===0)e.push(check("WARN","apiKeyCfg.claudeSettings \u4E3A\u7A7A\uFF0C\u65E0\u5907\u7528 Key"));else{const n=new Set;for(let o=0;o<s.claudeSettings.length;o++){const c=s.claudeSettings[o],p=`apiKeyCfg.claudeSettings[${o}]`;c.apiKey?n.has(c.apiKey)?e.push(check("WARN",`${p} apiKey \u91CD\u590D: ${(0,api_key_manager_1.settingLabel)(c)}`)):n.add(c.apiKey):e.push(check("FATAL",`${p} \u7F3A\u5C11 apiKey`)),c.baseUrl||e.push(check("WARN",`${p} \u7F3A\u5C11 baseUrl`)),c.model||e.push(check("WARN",`${p} \u7F3A\u5C11 model`)),typeof c.isValid!="boolean"&&e.push(check("WARN",`${p} isValid \u7C7B\u578B\u5F02\u5E38: ${typeof c.isValid}`))}const l=s.claudeSettings.filter(o=>o.isValid).length;e.push(check("PASS",`apiKeyCfg.claudeSettings \u5171 ${s.claudeSettings.length} \u9879\uFF0C\u6709\u6548 ${l}`))}}else e.push(check("WARN","apiKeyCfg \u672A\u914D\u7F6E\uFF0C\u65E0\u6CD5\u4F7F\u7528 API Key \u6C60\u5316\u8F6E\u6362"));const A=path_1.default.join(t,"cron.json");if(fs_1.default.existsSync(A))try{const s=JSON.parse(fs_1.default.readFileSync(A,"utf-8")),n=Array.isArray(s)?s:s.jobs;if(Array.isArray(n)){const l=n.filter(o=>o.enabled!==!1).length;e.push(check("PASS",`cron.json \u5171 ${n.length} \u4E2A\u5B9A\u65F6\u4EFB\u52A1 (${l} \u542F\u7528)`));for(let o=0;o<n.length;o++){const c=n[o];c.id||e.push(check("WARN",`cron.json[${o}] \u7F3A\u5C11 id`)),c.cronExpression||e.push(check("WARN",`cron.json[${o}] \u7F3A\u5C11 cronExpression`)),c.prompt||e.push(check("WARN",`cron.json[${o}] \u7F3A\u5C11 prompt`)),c.conversationId?d.has(c.conversationId)||e.push(check("WARN",`cron.json[${o}] conversationId "${c.conversationId}" \u672A\u5728 config.json conversations \u4E2D\u627E\u5230`)):e.push(check("WARN",`cron.json[${o}] \u7F3A\u5C11 conversationId`))}}else e.push(check("WARN","cron.json \u683C\u5F0F\u5F02\u5E38\uFF0C\u65E0\u6CD5\u89E3\u6790\u4E3A\u4EFB\u52A1\u6570\u7EC4"))}catch(s){e.push(check("WARN",`cron.json \u89E3\u6790\u5931\u8D25: ${s instanceof Error?s.message:s}`))}else e.push(check("PASS","cron.json \u4E0D\u5B58\u5728 (\u65E0\u5B9A\u65F6\u4EFB\u52A1)"));const g=path_1.default.join((0,session_1.getHomeDir)(),".cc-ding","settings-tpl.json");if(fs_1.default.existsSync(g))try{const s=JSON.parse(fs_1.default.readFileSync(g,"utf-8"));if(typeof s!="object"||s===null)e.push(check("WARN","settings-tpl.json \u6839\u5143\u7D20\u4E0D\u662F\u5BF9\u8C61"));else if(!s.env||typeof s.env!="object")e.push(check("WARN","settings-tpl.json \u7F3A\u5C11 env \u5B57\u6BB5"));else{const n=Object.keys(s.env);e.push(check("PASS",`settings-tpl.json \u6709\u6548\uFF0Cenv \u5305\u542B: ${n.join(", ")||"(\u7A7A)"}`))}}catch(s){e.push(check("WARN",`settings-tpl.json \u89E3\u6790\u5931\u8D25: ${s instanceof Error?s.message:s}`))}else e.push(check("WARN","settings-tpl.json \u4E0D\u5B58\u5728\uFF0C\u521B\u5EFA settings-ding.json \u65F6\u5C06\u4F7F\u7528\u7A7A\u6A21\u677F"));try{(0,child_process_1.execSync)("which claude",{stdio:"pipe"}),e.push(check("PASS","claude \u547D\u4EE4\u53EF\u7528"))}catch{e.push(check("FATAL","claude \u547D\u4EE4\u4E0D\u53EF\u7528\uFF0C\u8BF7\u786E\u8BA4 Claude Code CLI \u5DF2\u5B89\u88C5"))}try{const s=path_1.default.join(t,".doctor-check");fs_1.default.writeFileSync(s,"ok","utf-8"),fs_1.default.unlinkSync(s),e.push(check("PASS","\u5BA2\u6237\u7AEF\u76EE\u5F55\u53EF\u5199"))}catch(s){e.push(check("FATAL",`\u5BA2\u6237\u7AEF\u76EE\u5F55\u4E0D\u53EF\u5199: ${s instanceof Error?s.message:s}`))}return e}function check(t,e){return{level:t,message:e}}
|
package/dist/src/biz/image.js
CHANGED
|
@@ -1 +1,12 @@
|
|
|
1
|
-
'use strict';const a7_0x41fe2d=a7_0x1b59;(function(_0x3573b3,_0x25dc4f){const _0x485875=a7_0x1b59,_0x264e3f=_0x3573b3();while(!![]){try{const _0x61788e=-parseInt(_0x485875(0x128))/0x1*(parseInt(_0x485875(0x105))/0x2)+-parseInt(_0x485875(0x139))/0x3*(parseInt(_0x485875(0xee))/0x4)+-parseInt(_0x485875(0x11b))/0x5+parseInt(_0x485875(0xdc))/0x6+parseInt(_0x485875(0xfe))/0x7+-parseInt(_0x485875(0x100))/0x8*(-parseInt(_0x485875(0xf7))/0x9)+parseInt(_0x485875(0x109))/0xa*(-parseInt(_0x485875(0x116))/0xb);if(_0x61788e===_0x25dc4f)break;else _0x264e3f['push'](_0x264e3f['shift']());}catch(_0x78aa14){_0x264e3f['push'](_0x264e3f['shift']());}}}(a7_0x226c,0x5811e));var __importDefault=this&&this[a7_0x41fe2d(0x111)]||function(_0x2752f5){const _0x476bfd=a7_0x41fe2d;return _0x2752f5&&_0x2752f5[_0x476bfd(0xe3)]?_0x2752f5:{'default':_0x2752f5};};Object['defineProperty'](exports,a7_0x41fe2d(0xe3),{'value':!![]}),exports['runOcr']=runOcr,exports[a7_0x41fe2d(0xfa)]=processPictureMessage,exports[a7_0x41fe2d(0x132)]=processRichTextMessage;const child_process_1=require(a7_0x41fe2d(0x11d)),fs_1=__importDefault(require('fs')),path_1=__importDefault(require(a7_0x41fe2d(0xe9))),urllib_1=__importDefault(require(a7_0x41fe2d(0xd9))),session_1=require(a7_0x41fe2d(0x13a)),common_1=require('../common'),MAX_IMAGE_SIZE=0xa*0x400*0x400,DING_API_BASE=a7_0x41fe2d(0x12d),OCR_PREAMBLE='以下图片\x20OCR\x20识别结果来自对用户消息中图片的预处理(非用户原始输入),如识别不准确可直接查看原图路径',OCR_BIN_DIR=(0x0,common_1['projUtil'])()[a7_0x41fe2d(0x101)](),cachedOcrBinPath=((()=>{const _0x1428f0=a7_0x41fe2d;if(process[_0x1428f0(0x129)]===_0x1428f0(0x102))return null;const _0x5259f4=process[_0x1428f0(0xf8)];if(_0x5259f4===_0x1428f0(0xd8))return path_1[_0x1428f0(0x130)][_0x1428f0(0xf9)](OCR_BIN_DIR,'ocr-arm64');if(_0x5259f4===_0x1428f0(0xea))return path_1[_0x1428f0(0x130)]['join'](OCR_BIN_DIR,_0x1428f0(0x10f));return null;})());let ocrBinExists=null;async function runOcr(_0x16e663){const _0x831bc4=a7_0x41fe2d;if(!cachedOcrBinPath)return console[_0x831bc4(0x11e)]('['+(0x0,session_1['timestamp'])()+_0x831bc4(0x112)+process[_0x831bc4(0x129)]+'/'+process[_0x831bc4(0xf8)]+_0x831bc4(0x126)),null;ocrBinExists===null&&(ocrBinExists=fs_1[_0x831bc4(0x130)][_0x831bc4(0xe4)](cachedOcrBinPath),!ocrBinExists&&console[_0x831bc4(0x12f)]('['+(0x0,session_1[_0x831bc4(0xef)])()+_0x831bc4(0x12a)+cachedOcrBinPath));if(!ocrBinExists)return null;return new Promise(_0x5889b9=>{(0x0,child_process_1['execFile'])(cachedOcrBinPath,[_0x16e663],{'timeout':0x7530,'maxBuffer':0x5*0x400*0x400},(_0xece488,_0x2e7d3a,_0x3c5e45)=>{const _0x2222f2=a7_0x1b59;if(_0xece488){console[_0x2222f2(0x12f)]('['+(0x0,session_1['timestamp'])()+_0x2222f2(0x10a)+_0xece488[_0x2222f2(0x12c)]);if(_0x3c5e45)console[_0x2222f2(0x12f)]('['+(0x0,session_1[_0x2222f2(0xef)])()+_0x2222f2(0x114)+_0x3c5e45[_0x2222f2(0x137)](0x0,0xc8));_0x5889b9(null);return;}try{const _0x577cd2=JSON[_0x2222f2(0xe8)](_0x2e7d3a);if(!Array['isArray'](_0x577cd2)||_0x577cd2[_0x2222f2(0xdf)]===0x0){console[_0x2222f2(0x11e)]('['+(0x0,session_1['timestamp'])()+_0x2222f2(0xe0)),_0x5889b9(null);return;}const _0x259ef5=_0x577cd2[_0x2222f2(0x11f)](_0x1f606e=>_0x1f606e['word'])['filter'](Boolean)[_0x2222f2(0xf9)]('\x20');console['log']('['+(0x0,session_1['timestamp'])()+_0x2222f2(0xfd)+_0x259ef5[_0x2222f2(0x137)](0x0,0xc8)+(_0x259ef5[_0x2222f2(0xdf)]>0xc8?_0x2222f2(0x133):'')),_0x5889b9(_0x259ef5||null);}catch{console[_0x2222f2(0x12f)]('['+(0x0,session_1[_0x2222f2(0xef)])()+_0x2222f2(0xe1)+_0x2e7d3a['substring'](0x0,0xc8)),_0x5889b9(null);}});});}const MAGIC_NUMBERS=[{'bytes':[0x89,0x50,0x4e,0x47],'mediaType':a7_0x41fe2d(0x121),'ext':a7_0x41fe2d(0x138)},{'bytes':[0xff,0xd8,0xff],'mediaType':a7_0x41fe2d(0x10d),'ext':a7_0x41fe2d(0x127)},{'bytes':[0x47,0x49,0x46],'mediaType':a7_0x41fe2d(0xf6),'ext':a7_0x41fe2d(0xfb)},{'bytes':[0x52,0x49,0x46,0x46],'mediaType':'image/webp','ext':a7_0x41fe2d(0x104)}];function a7_0x1b59(_0x1ab61b,_0x20e9af){_0x1ab61b=_0x1ab61b-0xd8;const _0x226c89=a7_0x226c();let _0x1b59ba=_0x226c89[_0x1ab61b];return _0x1b59ba;}function detectImageMediaType(_0x2700ca){const _0x5e24e8=a7_0x41fe2d;for(const {bytes:_0x4a8122,mediaType:_0x154743,ext:_0x4f19f7}of MAGIC_NUMBERS){if(_0x2700ca[_0x5e24e8(0xdf)]>=_0x4a8122[_0x5e24e8(0xdf)]&&_0x4a8122['every']((_0x44d15,_0x507e2a)=>_0x2700ca[_0x507e2a]===_0x44d15))return{'mediaType':_0x154743,'ext':_0x4f19f7};}return{'mediaType':_0x5e24e8(0x10d),'ext':'jpg'};}function a7_0x226c(){const _0x26ab40=['411219boxKFS','arch','join','processPictureMessage','gif','mention',']\x20OCR\x20识别结果:\x20','3661189BNsZJY','downloadCode','8rDuVGc','getResourcePath','win32',']\x20图片已保存:\x20','webp','3506jtdWeK','userId','[图片\x20OCR]','type','200OBfPzv',']\x20OCR\x20执行失败:\x20','\x0a---','set','image/jpeg','application/json','ocr-x64','POST','__importDefault',']\x20当前平台(','[图片\x20',']\x20OCR\x20stderr:\x20',']\x20downloadImageBuffer\x20下载失败:','118052ksZpFm','now','pictureDownloadCode','\x20超过限制\x20','[��片下载失败]','1420160XgCLKn','text','child_process','log','map','then','image/png','picture','get','[富文本消息内容为空]','dingStreamClient',')不支持本地OCR,使用模型识别','jpg','86eyoSFZ','platform',']\x20OCR\x20二进制不存在:\x20','\x20OCR]','message','https://api.dingtalk.com',']\x20图片大小\x20','warn','default','test','processRichTextMessage','...','all','[图片]','json','substring','png','40311cfHFen','./session',',\x20data=',']\x20downloadImageBuffer\x20下载失败:\x20status=','arm64','urllib','getImageDownloadUrl\x20响应无\x20downloadUrl:\x20','data','2729298Nbtctx','\x0a---\x0a','filePath','length',']\x20OCR\x20无识别结果',']\x20OCR\x20输出解析失败:\x20','slice','__esModule','existsSync',']\x20图片保存失败:\x20','debugLog','getAccessToken','parse','path','x64','writeFileSync','getImageDownloadUrl\x20API\x20返回非200:\x20status=','status','4oCGDYS','timestamp','trim','.images','push','request','/v1.0/robot/messageFiles/download','stringify','image/gif'];a7_0x226c=function(){return _0x26ab40;};return a7_0x226c();}async function getImageDownloadUrl(_0x522940,_0x28cff4,_0x1bc020){const _0x32c67d=a7_0x41fe2d;try{const _0x59e02c=await _0x522940[_0x32c67d(0x125)][_0x32c67d(0xe7)](),_0x2e8473=DING_API_BASE+_0x32c67d(0xf4),_0x5cbc46=await urllib_1[_0x32c67d(0x130)][_0x32c67d(0xf3)](_0x2e8473,{'method':_0x32c67d(0x110),'headers':{'x-acs-dingtalk-access-token':_0x59e02c,'Content-Type':_0x32c67d(0x10e)},'data':{'downloadCode':_0x28cff4,'robotCode':_0x1bc020},'dataType':_0x32c67d(0x136),'timeout':0x2710});if(_0x5cbc46[_0x32c67d(0xed)]!==0xc8||!_0x5cbc46[_0x32c67d(0xdb)])return _0x522940[_0x32c67d(0xe6)](_0x32c67d(0xec)+_0x5cbc46[_0x32c67d(0xed)]+_0x32c67d(0x13b)+JSON[_0x32c67d(0xf5)](_0x5cbc46[_0x32c67d(0xdb)])),null;const _0x1f4552=_0x5cbc46[_0x32c67d(0xdb)],_0x28aabe=_0x1f4552?.['downloadUrl'];if(!_0x28aabe)return _0x522940[_0x32c67d(0xe6)](_0x32c67d(0xda)+JSON['stringify'](_0x1f4552)),null;return _0x28aabe;}catch(_0x3d2e2b){return console['warn']('['+(0x0,session_1[_0x32c67d(0xef)])()+']\x20getImageDownloadUrl\x20请求失败:',_0x3d2e2b),null;}}async function downloadImageBuffer(_0x24ed98){const _0x3d502f=a7_0x41fe2d;try{const _0x416f6f=await urllib_1['default'][_0x3d502f(0xf3)](_0x24ed98,{'method':'GET','dataType':'buffer','timeout':0x7530});if(_0x416f6f[_0x3d502f(0xed)]!==0xc8)return console[_0x3d502f(0x12f)]('['+(0x0,session_1[_0x3d502f(0xef)])()+_0x3d502f(0x13c)+_0x416f6f['status']),null;const _0x103bc9=_0x416f6f['data'];if(!_0x103bc9||_0x103bc9[_0x3d502f(0xdf)]===0x0)return console[_0x3d502f(0x12f)]('['+(0x0,session_1['timestamp'])()+']\x20downloadImageBuffer\x20下载结果为空'),null;if(_0x103bc9[_0x3d502f(0xdf)]>MAX_IMAGE_SIZE)return console[_0x3d502f(0x12f)]('['+(0x0,session_1[_0x3d502f(0xef)])()+_0x3d502f(0x12e)+_0x103bc9['length']+_0x3d502f(0x119)+MAX_IMAGE_SIZE),null;return _0x103bc9;}catch(_0x3f1460){return console[_0x3d502f(0x12f)]('['+(0x0,session_1['timestamp'])()+_0x3d502f(0x115),_0x3f1460),null;}}async function downloadAndProcessImage(_0x306d96,_0x3ea299,_0x21ef65,_0x3f5515){const _0x2c2119=a7_0x41fe2d,_0x30393e=await getImageDownloadUrl(_0x306d96,_0x3ea299,_0x21ef65);if(!_0x30393e)return null;const _0x4a103a=await downloadImageBuffer(_0x30393e);if(!_0x4a103a)return null;const {mediaType:_0x42a9cb,ext:_0x2c0c9f}=detectImageMediaType(_0x4a103a),_0x229fa3=path_1[_0x2c2119(0x130)][_0x2c2119(0xf9)](_0x3f5515,_0x2c2119(0xf1)),_0x21436b=_0x3ea299[_0x2c2119(0xe2)](-0x8),_0x5276de=Date[_0x2c2119(0x117)]()+'-'+_0x21436b+'.'+_0x2c0c9f,_0x1246e0=path_1[_0x2c2119(0x130)][_0x2c2119(0xf9)](_0x229fa3,_0x5276de);try{fs_1[_0x2c2119(0x130)]['mkdirSync'](_0x229fa3,{'recursive':!![]}),fs_1['default'][_0x2c2119(0xeb)](_0x1246e0,_0x4a103a);}catch(_0x5168ef){return console[_0x2c2119(0x12f)]('['+(0x0,session_1[_0x2c2119(0xef)])()+_0x2c2119(0xe5)+_0x1246e0,_0x5168ef),null;}return console[_0x2c2119(0x11e)]('['+(0x0,session_1[_0x2c2119(0xef)])()+_0x2c2119(0x103)+_0x1246e0+'\x20('+_0x42a9cb+',\x20'+_0x4a103a[_0x2c2119(0xdf)]+'\x20bytes)'),{'mediaType':_0x42a9cb,'filePath':_0x1246e0,'sizeBytes':_0x4a103a[_0x2c2119(0xdf)]};}async function buildImagePrompt(_0x222c7e,_0x459769,_0x2b1d17){const _0x2a8221=a7_0x41fe2d,_0x4b6367=_0x2b1d17!=null?_0x2a8221(0x113)+_0x2b1d17+']':_0x2a8221(0x135);if(_0x459769){const _0x4fb720=await runOcr(_0x222c7e[_0x2a8221(0xde)]);if(_0x4fb720){const _0x3e2f2c=_0x2b1d17!=null?'[图片\x20'+_0x2b1d17+_0x2a8221(0x12b):_0x2a8221(0x107);return _0x4b6367+'\x20'+_0x222c7e[_0x2a8221(0xde)]+'\x0a'+_0x3e2f2c+_0x2a8221(0xdd)+_0x4fb720+_0x2a8221(0x10b);}console[_0x2a8221(0x12f)]('['+(0x0,session_1[_0x2a8221(0xef)])()+']\x20OCR\x20失败,仅传原图路径:\x20'+_0x222c7e[_0x2a8221(0xde)]);}return _0x4b6367+'\x20'+_0x222c7e[_0x2a8221(0xde)];}async function processPictureMessage(_0x529eea,_0x4f06b2,_0x3394e1,_0x44a2bc,_0xaaf1b5=!![],_0xe1f0bd){const _0x1a25c2=a7_0x41fe2d,_0x1cb713=await downloadAndProcessImage(_0x529eea,_0x4f06b2,_0x3394e1,_0x44a2bc);if(!_0x1cb713)return null;const _0x2a4278=await buildImagePrompt(_0x1cb713,_0xaaf1b5),_0x1588da=[];_0xaaf1b5&&_0x1588da[_0x1a25c2(0xf2)](OCR_PREAMBLE);if(_0xe1f0bd)_0x1588da[_0x1a25c2(0xf2)](_0xe1f0bd);return _0x1588da[_0x1a25c2(0xf2)](_0x2a4278),_0x1588da[_0x1a25c2(0xf9)]('\x0a');}async function processRichTextMessage(_0x45f067,_0x2dbf62,_0x180a64,_0xef99b5,_0x2b859f=!![]){const _0x4f8535=a7_0x41fe2d,_0x16cde3=_0x2dbf62['filter'](_0x2aa056=>_0x2aa056[_0x4f8535(0x108)]===_0x4f8535(0x122)&&(_0x2aa056[_0x4f8535(0xff)]||_0x2aa056['pictureDownloadCode']))[_0x4f8535(0xdf)],_0x11667b=_0x2dbf62[_0x4f8535(0x11f)](async(_0x3e5980,_0x38db71)=>{const _0x361334=_0x4f8535;if(_0x3e5980['type']==='picture'){const _0x2123bc=_0x3e5980[_0x361334(0xff)]||_0x3e5980[_0x361334(0x118)];if(_0x2123bc){const _0x48a6b2=await downloadAndProcessImage(_0x45f067,_0x2123bc,_0x180a64,_0xef99b5);return{'index':_0x38db71,'result':_0x48a6b2};}}return{'index':_0x38db71,'result':null};}),_0x52a2a4=await Promise[_0x4f8535(0x134)](_0x11667b),_0x79afda=new Map();for(const {index:_0x46bf23,result:_0x3d9da4}of _0x52a2a4){_0x79afda[_0x4f8535(0x10c)](_0x46bf23,_0x3d9da4);}const _0x580444=new Map();if(_0x2b859f&&_0x16cde3>0x0){const _0x4dea07=[];for(const [_0xab1c32,_0x1a1811]of _0x79afda){_0x1a1811&&_0x4dea07['push'](runOcr(_0x1a1811[_0x4f8535(0xde)])[_0x4f8535(0x120)](_0x5e586e=>({'index':_0xab1c32,'ocrText':_0x5e586e})));}const _0x50b6d2=await Promise[_0x4f8535(0x134)](_0x4dea07);for(const {index:_0x229a59,ocrText:_0x1020e1}of _0x50b6d2){_0x580444[_0x4f8535(0x10c)](_0x229a59,_0x1020e1);}}const _0x4006ba=[];let _0x1e6f32=0x0;for(let _0x194c8c=0x0;_0x194c8c<_0x2dbf62[_0x4f8535(0xdf)];_0x194c8c++){const _0xd1725b=_0x2dbf62[_0x194c8c];if(_0xd1725b[_0x4f8535(0x108)]===_0x4f8535(0x11c)&&_0xd1725b['text']){if(/^@\S+$/[_0x4f8535(0x131)](_0xd1725b[_0x4f8535(0x11c)][_0x4f8535(0xf0)]()))continue;_0x4006ba[_0x4f8535(0xf2)](_0xd1725b['text']);}else{if(_0xd1725b[_0x4f8535(0x108)]===_0x4f8535(0xfc)&&_0xd1725b[_0x4f8535(0x106)])_0x4006ba[_0x4f8535(0xf2)]('@'+_0xd1725b[_0x4f8535(0x106)]);else{if(_0xd1725b[_0x4f8535(0x108)]==='picture'){const _0x205eb1=_0x79afda[_0x4f8535(0x123)](_0x194c8c);if(_0x205eb1){_0x1e6f32++;const _0x1a5bec=_0x16cde3>0x1?_0x1e6f32:undefined,_0x392802=_0x2b859f?_0x580444[_0x4f8535(0x123)](_0x194c8c):null,_0x2d5a99=_0x1a5bec!=null?'[图片\x20'+_0x1a5bec+']':_0x4f8535(0x135);if(_0x392802){const _0xc03772=_0x1a5bec!=null?_0x4f8535(0x113)+_0x1a5bec+'\x20OCR]':_0x4f8535(0x107);_0x4006ba[_0x4f8535(0xf2)](_0x2d5a99+'\x20'+_0x205eb1['filePath']+'\x0a'+_0xc03772+_0x4f8535(0xdd)+_0x392802+_0x4f8535(0x10b));}else _0x4006ba[_0x4f8535(0xf2)](_0x2d5a99+'\x20'+_0x205eb1[_0x4f8535(0xde)]);}else{const _0x283a5c=_0xd1725b[_0x4f8535(0xff)]||_0xd1725b[_0x4f8535(0x118)];_0x283a5c&&_0x4006ba[_0x4f8535(0xf2)](_0x4f8535(0x11a));}}}}}const _0x1b611e=_0x4006ba[_0x4f8535(0xf9)]('\x0a')||_0x4f8535(0x124);if(_0x2b859f&&_0x1e6f32>0x0)return OCR_PREAMBLE+'\x0a'+_0x1b611e;return _0x1b611e;}
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.runOcr=runOcr,exports.getImageDownloadUrl=getImageDownloadUrl,exports.downloadImageBuffer=downloadImageBuffer,exports.processPictureMessage=processPictureMessage,exports.processRichTextMessage=processRichTextMessage;const child_process_1=require("child_process"),fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),urllib_1=__importDefault(require("urllib")),session_1=require("./session"),common_1=require("../common"),MAX_IMAGE_SIZE=10*1024*1024,DING_API_BASE="https://api.dingtalk.com",OCR_PREAMBLE="\u4EE5\u4E0B\u56FE\u7247 OCR \u8BC6\u522B\u7ED3\u679C\u6765\u81EA\u5BF9\u7528\u6237\u6D88\u606F\u4E2D\u56FE\u7247\u7684\u9884\u5904\u7406(\u975E\u7528\u6237\u539F\u59CB\u8F93\u5165)\uFF0C\u5982\u8BC6\u522B\u4E0D\u51C6\u786E\u53EF\u76F4\u63A5\u67E5\u770B\u539F\u56FE\u8DEF\u5F84",OCR_BIN_DIR=(0,common_1.projUtil)().getResourcePath(),cachedOcrBinPath=(()=>{if(process.platform==="win32")return null;const e=process.arch;return e==="arm64"?path_1.default.join(OCR_BIN_DIR,"ocr-arm64"):e==="x64"?path_1.default.join(OCR_BIN_DIR,"ocr-x64"):null})();let ocrBinExists=null;async function runOcr(e){return cachedOcrBinPath?(ocrBinExists===null&&(ocrBinExists=fs_1.default.existsSync(cachedOcrBinPath),ocrBinExists||console.warn(`[${(0,session_1.timestamp)()}] OCR \u4E8C\u8FDB\u5236\u4E0D\u5B58\u5728: ${cachedOcrBinPath}`)),ocrBinExists?new Promise(t=>{(0,child_process_1.execFile)(cachedOcrBinPath,[e],{timeout:3e4,maxBuffer:5*1024*1024},(o,a,s)=>{if(o){console.warn(`[${(0,session_1.timestamp)()}] OCR \u6267\u884C\u5931\u8D25: ${o.message}`),s&&console.warn(`[${(0,session_1.timestamp)()}] OCR stderr: ${s.substring(0,200)}`),t(null);return}try{const n=JSON.parse(a);if(!Array.isArray(n)||n.length===0){console.log(`[${(0,session_1.timestamp)()}] OCR \u65E0\u8BC6\u522B\u7ED3\u679C`),t(null);return}const l=n.map(f=>f.word).filter(Boolean).join(" ");console.log(`[${(0,session_1.timestamp)()}] OCR \u8BC6\u522B\u7ED3\u679C: ${l.substring(0,200)}${l.length>200?"...":""}`),t(l||null)}catch{console.warn(`[${(0,session_1.timestamp)()}] OCR \u8F93\u51FA\u89E3\u6790\u5931\u8D25: ${a.substring(0,200)}`),t(null)}})}):null):(console.log(`[${(0,session_1.timestamp)()}] \u5F53\u524D\u5E73\u53F0(${process.platform}/${process.arch})\u4E0D\u652F\u6301\u672C\u5730OCR\uFF0C\u4F7F\u7528\u6A21\u578B\u8BC6\u522B`),null)}const MAGIC_NUMBERS=[{bytes:[137,80,78,71],mediaType:"image/png",ext:"png"},{bytes:[255,216,255],mediaType:"image/jpeg",ext:"jpg"},{bytes:[71,73,70],mediaType:"image/gif",ext:"gif"},{bytes:[82,73,70,70],mediaType:"image/webp",ext:"webp"}];function detectImageMediaType(e){for(const{bytes:t,mediaType:o,ext:a}of MAGIC_NUMBERS)if(e.length>=t.length&&t.every((s,n)=>e[n]===s))return{mediaType:o,ext:a};return{mediaType:"image/jpeg",ext:"jpg"}}async function getImageDownloadUrl(e,t,o){try{const a=await e.dingStreamClient.getAccessToken(),s=`${DING_API_BASE}/v1.0/robot/messageFiles/download`,n=await urllib_1.default.request(s,{method:"POST",headers:{"x-acs-dingtalk-access-token":a,"Content-Type":"application/json"},data:{downloadCode:t,robotCode:o},dataType:"json",timeout:1e4});if(n.status!==200||!n.data)return e.debugLog(`getImageDownloadUrl API \u8FD4\u56DE\u975E200: status=${n.status}, data=${JSON.stringify(n.data)}`),null;const l=n.data,f=l?.downloadUrl;return f||(e.debugLog(`getImageDownloadUrl \u54CD\u5E94\u65E0 downloadUrl: ${JSON.stringify(l)}`),null)}catch(a){return console.warn(`[${(0,session_1.timestamp)()}] getImageDownloadUrl \u8BF7\u6C42\u5931\u8D25:`,a),null}}async function downloadImageBuffer(e){try{const t=await urllib_1.default.request(e,{method:"GET",dataType:"buffer",timeout:3e4});if(t.status!==200)return console.warn(`[${(0,session_1.timestamp)()}] downloadImageBuffer \u4E0B\u8F7D\u5931\u8D25: status=${t.status}`),null;const o=t.data;return!o||o.length===0?(console.warn(`[${(0,session_1.timestamp)()}] downloadImageBuffer \u4E0B\u8F7D\u7ED3\u679C\u4E3A\u7A7A`),null):o.length>MAX_IMAGE_SIZE?(console.warn(`[${(0,session_1.timestamp)()}] \u56FE\u7247\u5927\u5C0F ${o.length} \u8D85\u8FC7\u9650\u5236 ${MAX_IMAGE_SIZE}`),null):o}catch(t){return console.warn(`[${(0,session_1.timestamp)()}] downloadImageBuffer \u4E0B\u8F7D\u5931\u8D25:`,t),null}}async function downloadAndProcessImage(e,t,o,a){const s=await getImageDownloadUrl(e,t,o);if(!s)return null;const n=await downloadImageBuffer(s);if(!n)return null;const{mediaType:l,ext:f}=detectImageMediaType(n),u=path_1.default.join(a,".images"),g=t.slice(-8),d=`${Date.now()}-${g}.${f}`,p=path_1.default.join(u,d);try{fs_1.default.mkdirSync(u,{recursive:!0}),fs_1.default.writeFileSync(p,n)}catch($){return console.warn(`[${(0,session_1.timestamp)()}] \u56FE\u7247\u4FDD\u5B58\u5931\u8D25: ${p}`,$),null}return console.log(`[${(0,session_1.timestamp)()}] \u56FE\u7247\u5DF2\u4FDD\u5B58: ${p} (${l}, ${n.length} bytes)`),{mediaType:l,filePath:p,sizeBytes:n.length}}async function buildImagePrompt(e,t,o){const a=o!=null?`[\u56FE\u7247 ${o}]`:"[\u56FE\u7247]";if(t){const s=await runOcr(e.filePath);if(s){const n=o!=null?`[\u56FE\u7247 ${o} OCR]`:"[\u56FE\u7247 OCR]";return`${a} ${e.filePath}
|
|
2
|
+
${n}
|
|
3
|
+
---
|
|
4
|
+
${s}
|
|
5
|
+
---`}console.warn(`[${(0,session_1.timestamp)()}] OCR \u5931\u8D25\uFF0C\u4EC5\u4F20\u539F\u56FE\u8DEF\u5F84: ${e.filePath}`)}return`${a} ${e.filePath}`}async function processPictureMessage(e,t,o,a,s=!0,n){const l=await downloadAndProcessImage(e,t,o,a);if(!l)return null;const f=await buildImagePrompt(l,s),u=[];return s&&u.push(OCR_PREAMBLE),n&&u.push(n),u.push(f),u.join(`
|
|
6
|
+
`)}async function processRichTextMessage(e,t,o,a,s=!0){const n=t.filter(r=>r.type==="picture"&&(r.downloadCode||r.pictureDownloadCode)).length,l=t.map(async(r,i)=>{if(r.type==="picture"){const m=r.downloadCode||r.pictureDownloadCode;if(m){const c=await downloadAndProcessImage(e,m,o,a);return{index:i,result:c}}}return{index:i,result:null}}),f=await Promise.all(l),u=new Map;for(const{index:r,result:i}of f)u.set(r,i);const g=new Map;if(s&&n>0){const r=[];for(const[m,c]of u)c&&r.push(runOcr(c.filePath).then(w=>({index:m,ocrText:w})));const i=await Promise.all(r);for(const{index:m,ocrText:c}of i)g.set(m,c)}const d=[];let p=0;for(let r=0;r<t.length;r++){const i=t[r];if(i.type==="text"&&i.text){if(/^@\S+$/.test(i.text.trim()))continue;d.push(i.text)}else if(i.type==="mention"&&i.userId)d.push(`@${i.userId}`);else if(i.type==="picture"){const m=u.get(r);if(m){p++;const c=n>1?p:void 0,w=s?g.get(r):null,h=c!=null?`[\u56FE\u7247 ${c}]`:"[\u56FE\u7247]";if(w){const x=c!=null?`[\u56FE\u7247 ${c} OCR]`:"[\u56FE\u7247 OCR]";d.push(`${h} ${m.filePath}
|
|
7
|
+
${x}
|
|
8
|
+
---
|
|
9
|
+
${w}
|
|
10
|
+
---`)}else d.push(`${h} ${m.filePath}`)}else(i.downloadCode||i.pictureDownloadCode)&&d.push("[\uFFFD\uFFFD\u7247\u4E0B\u8F7D\u5931\u8D25]")}}const $=d.join(`
|
|
11
|
+
`)||"[\u5BCC\u6587\u672C\u6D88\u606F\u5185\u5BB9\u4E3A\u7A7A]";return s&&p>0?`${OCR_PREAMBLE}
|
|
12
|
+
${$}`:$}
|
package/dist/src/biz/lock.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.acquirePidLock=acquirePidLock;const session_1=require("./session"),fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path"));function acquirePidLock(e,r){const t=path_1.default.join(e,".pid.lock");if(fs_1.default.existsSync(t))try{const s=parseInt(fs_1.default.readFileSync(t,"utf-8").trim(),10);if(!isNaN(s))try{process.kill(s,0),console.error(`[FATAL] clientId "${r}" \u5DF2\u6709\u8FD0\u884C\u4E2D\u7684\u8FDB\u7A0B (PID: ${s})`),console.error(` \u5982\u9700\u5F3A\u5236\u542F\u52A8\uFF0C\u8BF7\u5148\u505C\u6B62\u5DF2\u6709\u8FDB\u7A0B\u6216\u5220\u9664\u9501\u6587\u4EF6: ${t}`),process.exit(1)}catch{console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u8FC7\u671F\u9501\u6587\u4EF6 (PID: ${s} \u5DF2\u9000\u51FA)\uFF0C\u81EA\u52A8\u6E05\u7406`)}}catch{}fs_1.default.writeFileSync(t,String(process.pid),"utf-8");const i=()=>{try{fs_1.default.unlinkSync(t)}catch{}};process.on("exit",i),process.on("SIGINT",()=>{i(),process.exit(130)}),process.on("SIGTERM",()=>{i(),process.exit(143)})}
|