cc-ding 0.3.0 → 0.4.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/README.md +16 -4
- package/dist/src/biz/api-key-manager.js +3 -3
- package/dist/src/biz/cc-ding-cli.js +69 -64
- package/dist/src/biz/claude-process.js +32 -32
- package/dist/src/biz/claude-sdk.js +2 -0
- package/dist/src/biz/command-route.js +1 -0
- package/dist/src/biz/commands.js +5 -5
- package/dist/src/biz/cron.js +5 -6
- package/dist/src/biz/doctor.js +1 -1
- package/dist/src/biz/lock.js +1 -1
- package/dist/src/biz/messaging.js +5 -5
- package/dist/src/biz/notify.js +1 -1
- package/dist/src/biz/platform.js +2 -0
- package/dist/src/biz/secrets.js +1 -0
- package/dist/src/biz/session.js +3 -3
- package/dist/src/biz/task.js +22 -23
- package/package.json +7 -11
package/dist/src/biz/session.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.timestamp=timestamp,exports.getHomeDir=getHomeDir,exports.getClientDir=getClientDir,exports.initClientDir=initClientDir,exports.ensureClientDir=ensureClientDir,exports.getClientConfig=getClientConfig,exports.resolveToUserId=resolveToUserId,exports.authCheck=authCheck,exports.isOwner=isOwner,exports.isAdmin=isAdmin,exports.isOwnerOrAdmin=isOwnerOrAdmin,exports.debugLog=debugLog,exports.isMobile=isMobile,exports.getPhoneMapFile=getPhoneMapFile,exports.loadPhoneMap=loadPhoneMap,exports.savePhoneMap=savePhoneMap,exports.userIdToPhone=userIdToPhone,exports.getUserIdNameMapFile=getUserIdNameMapFile,exports.loadUserIdNameMap=loadUserIdNameMap,exports.saveUserIdNameMap=saveUserIdNameMap,exports.resolveUserIdName=resolveUserIdName,exports.resolveUserId=resolveUserId,exports.resolveAllPhonesInConfig=resolveAllPhonesInConfig,exports.hashConversationId=hashConversationId,exports.getReplyWebhook=getReplyWebhook,exports.getReplyConversationId=getReplyConversationId,exports.findActiveSession=findActiveSession,exports.getConversationConfig=getConversationConfig,exports.getConversationDir=getConversationDir,exports.getSessionsDir=getSessionsDir,exports.getTasksDir=getTasksDir,exports.getImagesDir=getImagesDir,exports.getSessionDir=getSessionDir,exports.getSessionId=getSessionId,exports.formatSessionInfo=formatSessionInfo,exports.readSessionLogTail=readSessionLogTail,exports.findHistorySession=findHistorySession,exports.findLatestSession=findLatestSession,exports.updateSessionFile=updateSessionFile,exports.appendSessionLog=appendSessionLog,exports.getActiveSessionsFile=getActiveSessionsFile,exports.saveActiveSession=saveActiveSession,exports.loadActiveSessions=loadActiveSessions,exports.endSession=endSession,exports.switchToSession=switchToSession,exports.startNewSession=startNewSession,exports.processMessageQueue=processMessageQueue,exports.handleSessionMessage=handleSessionMessage,exports.cleanCache=cleanCache;const utils_ok_1=require("utils-ok"),fs_1=__importDefault(require("fs")),os_1=__importDefault(require("os")),assert_1=__importDefault(require("assert")),crypto_1=__importDefault(require("crypto")),path_1=__importDefault(require("path")),commands_1=require("./commands"),messaging_1=require("./messaging"),claude_process_1=require("./claude-process");function timestamp(){return utils_ok_1.dateUtil.mm(Date.now()).format("YYYY-MM-DD HH:mm:ss")}function getHomeDir(){return os_1.default.homedir()}function getClientDir(e){return path_1.default.join(getHomeDir(),".cc-ding",e.clientId)}function initClientDir(e,s){const n=path_1.default.join(getHomeDir(),".cc-ding",e),t=path_1.default.join(n,"config.json");return fs_1.default.mkdirSync(n,{recursive:!0}),fs_1.default.writeFileSync(t,JSON.stringify(s,null,2),"utf-8"),t}function ensureClientDir(e){const s=path_1.default.join(getHomeDir(),".cc-ding",e),n=path_1.default.join(s,"config.json");if(fs_1.default.existsSync(n))return;console.log(`[${timestamp()}] \u5BA2\u6237\u7AEF\u76EE\u5F55\u672A\u521D\u59CB\u5316: ${s}`),console.log(`[${timestamp()}] \u6B63\u5728\u81EA\u52A8\u521D\u59CB\u5316...`),initClientDir(e,{clientName:"cc\u52A9\u624B",owner:"<owner\u624B\u673A\u53F7>",whiteUserList:[],clientSecret:"<clientSecret-\u9489\u9489Stream\u8FDE\u63A5\u5BC6\u94A5>",defaultDingToken:"<\u515C\u5E95\u9489\u9489\u673A\u5668\u4EBAToken>",conversations:[]}),console.log(`[${timestamp()}] \u5DF2\u751F\u6210\u9ED8\u8BA4\u914D\u7F6E\u6587\u4EF6: ${n}`),console.log(`[${timestamp()}] \u8BF7\u7F16\u8F91 config.json \u586B\u5199\u5FC5\u8981\u7684\u914D\u7F6E\u9879\u540E\u91CD\u65B0\u542F\u52A8`),process.exit(1)}function getClientConfig(e){const s=`${getClientDir(e)}/config.json`;(0,assert_1.default)(fs_1.default.existsSync(s),`Could not find client config file: ${s}`);const n=utils_ok_1.fileUtil.getJSON(s);return(0,assert_1.default)(n.clientSecret,"config.json missing required field: clientSecret"),(0,assert_1.default)(n.whiteUserList,"config.json missing required field: whiteUserList"),n}function resolveToUserId(e,s){return isMobile(s)&&e.resolvedPhones[s]||s}function authCheck(e,s,n){if(isOwnerOrAdmin(e,s))return!0;if(n){const t=e.config.conversations.find(o=>o.conversationId===n);if(t?.whiteUserList&&t.whiteUserList.length>0)return t.whiteUserList.some(o=>resolveToUserId(e,o)===s)}return e.config.whiteUserList.some(t=>resolveToUserId(e,t)===s)}function isOwner(e,s){const n=e.config.owner;if(!n||!isMobile(n))return!1;const t=e.resolvedPhones[n];return!!t&&t===s}function isAdmin(e,s){return e.config.adminUserList?.length?e.config.adminUserList.some(n=>resolveToUserId(e,n)===s):!1}function isOwnerOrAdmin(e,s){return isOwner(e,s)||isAdmin(e,s)}function debugLog(e,s,...n){e.config.debug&&console.log(`[DEBUG] ${s}`,...n)}const PHONE_RE=/^1\d{10}$/;function isMobile(e){return PHONE_RE.test(e)}function getPhoneMapFile(e){return path_1.default.join(getClientDir(e),"phone-map.json")}function loadPhoneMap(e){const s=getPhoneMapFile(e);if(!fs_1.default.existsSync(s))return{};try{const n=JSON.parse(fs_1.default.readFileSync(s,"utf-8"));if(typeof n=="object"&&n!==null)return n}catch{}return{}}function savePhoneMap(e,s){const n=getPhoneMapFile(e);try{fs_1.default.writeFileSync(n,JSON.stringify(s,null,2),"utf-8")}catch(t){console.error("\u4FDD\u5B58 phone-map.json \u5931\u8D25:",t)}}function userIdToPhone(e,s){for(const[n,t]of Object.entries(e.resolvedPhones))if(t===s)return n;return null}function getUserIdNameMapFile(e){return path_1.default.join(getClientDir(e),"user-id-name-map.json")}function loadUserIdNameMap(e){const s=getUserIdNameMapFile(e);if(!fs_1.default.existsSync(s))return{};try{const n=JSON.parse(fs_1.default.readFileSync(s,"utf-8"));if(typeof n=="object"&&n!==null)return n}catch{}return{}}function saveUserIdNameMap(e,s){const n=getUserIdNameMapFile(e);try{fs_1.default.writeFileSync(n,JSON.stringify(s,null,2),"utf-8")}catch(t){console.error("\u4FDD\u5B58 user-id-name-map.json \u5931\u8D25:",t)}}async function resolveUserIdName(e,s){if(!s)return null;const n=loadUserIdNameMap(e);if(n[s])return n[s];const t=await(0,messaging_1.queryDingUser)(e,s);return t&&t.name?(n[s]=t.name,saveUserIdNameMap(e,n),t.name):null}async function resolveUserId(e,s){if(!s)return null;if(!isMobile(s))return s;if(e.resolvedPhones[s])return e.resolvedPhones[s];const n=await(0,messaging_1.queryUserIdByMobile)(e,s);return n&&(e.resolvedPhones[s]=n,savePhoneMap(e,e.resolvedPhones)),n}async function resolveAllPhonesInConfig(e){e.resolvedPhones=loadPhoneMap(e);const s=[],n=async t=>{if(e.resolvedPhones[t])return;const o=await(0,messaging_1.queryUserIdByMobile)(e,t);o&&(e.resolvedPhones[t]=o,s.push(t))};e.config.owner&&(isMobile(e.config.owner)?(await n(e.config.owner),e.resolvedPhones[e.config.owner]||console.warn(`[WARN] \u65E0\u6CD5\u89E3\u6790 owner \u624B\u673A\u53F7: ${e.config.owner}`)):console.warn(`[WARN] owner \u5FC5\u987B\u4E3A\u624B\u673A\u53F7\uFF0C\u5F53\u524D\u503C\u65E0\u6548: ${e.config.owner}`));for(const t of e.config.whiteUserList)isMobile(t)&&(await n(t),e.resolvedPhones[t]||console.warn(`[WARN] \u65E0\u6CD5\u89E3\u6790 whiteUserList \u624B\u673A\u53F7: ${t}`));for(const t of e.config.conversations)if(t.whiteUserList)for(const o of t.whiteUserList)isMobile(o)&&(await n(o),e.resolvedPhones[o]||console.warn(`[WARN] \u65E0\u6CD5\u89E3\u6790\u7FA4\u767D\u540D\u5355\u624B\u673A\u53F7: ${o}`));s.length>0&&savePhoneMap(e,e.resolvedPhones),console.log(`[\u624B\u673A\u89E3\u6790] \u5DF2\u52A0\u8F7D ${Object.keys(e.resolvedPhones).length} \u6761\u8BB0\u5F55 (${s.length} \u6761\u65B0\u89E3\u6790)`)}function hashConversationId(e,s){const t=getConversationConfig(e,s)?.linkConversationId||s;return crypto_1.default.createHash("md5").update(t).digest("hex")}function getReplyWebhook(e){return e.currentWebhook||e.sessionWebhook}function getReplyConversationId(e){return e.currentConversationId||e.conversationId}function findActiveSession(e,s){const n=e.activeSessions.get(s);if(n)return{key:s,session:n};const t=getConversationConfig(e,s);if(t?.linkConversationId){for(const o of e.activeSessions)if(getConversationConfig(e,o[0])?.linkConversationId===t.linkConversationId)return{key:o[0],session:o[1]}}}function getConversationConfig(e,s){return e.config.conversations.find(n=>n.conversationId===s)}function getConversationDir(e,s){const n=hashConversationId(e,s);return`${getClientDir(e)}/${n}`}function getSessionsDir(e,s){return`${getConversationDir(e,s)}/.sessions`}function getTasksDir(e,s){return`${getConversationDir(e,s)}/.tasks`}function getImagesDir(e,s){return`${getConversationDir(e,s)}/.images`}function getSessionDir(e,s){const n=s.claudeSessionId||s.startTimeStr;return`${getSessionsDir(e,s.conversationId)}/${n}`}function getSessionId(e){return e.claudeSessionId||e.startTimeStr}function formatSessionInfo(e,s){const n=findActiveSession(e,s);if(!n)return null;const{session:t,isProcessing:o,messageQueue:i}=n.session;return[`- **\u4F1A\u8BDDID:** ${getSessionId(t)}`,`- **\u53D1\u8D77\u8005:** ${t.startNickName}(${t.startStaffId})`,`- **\u5F00\u59CB\u65F6\u95F4:** ${t.startTimeStr}`,`- **\u6700\u540E\u53D1\u9001\u8005:** ${n.session.lastSenderStaffId}`,`- **\u5904\u7406\u4E2D:** ${o}`,`- **\u6392\u961F\u6D88\u606F:** ${i?.length||0} \u6761`].join(`
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.timestamp=timestamp,exports.getHomeDir=getHomeDir,exports.getClientDir=getClientDir,exports.initClientDir=initClientDir,exports.ensureClientDir=ensureClientDir,exports.getClientConfig=getClientConfig,exports.resolveToUserId=resolveToUserId,exports.authCheck=authCheck,exports.isOwner=isOwner,exports.isAdmin=isAdmin,exports.isOwnerOrAdmin=isOwnerOrAdmin,exports.debugLog=debugLog,exports.isMobile=isMobile,exports.getPhoneMapFile=getPhoneMapFile,exports.loadPhoneMap=loadPhoneMap,exports.savePhoneMap=savePhoneMap,exports.userIdToPhone=userIdToPhone,exports.getUserIdNameMapFile=getUserIdNameMapFile,exports.loadUserIdNameMap=loadUserIdNameMap,exports.saveUserIdNameMap=saveUserIdNameMap,exports.resolveUserIdName=resolveUserIdName,exports.resolveUserId=resolveUserId,exports.resolveAllPhonesInConfig=resolveAllPhonesInConfig,exports.hashConversationId=hashConversationId,exports.getReplyWebhook=getReplyWebhook,exports.getReplyConversationId=getReplyConversationId,exports.findActiveSession=findActiveSession,exports.getConversationConfig=getConversationConfig,exports.getConversationDir=getConversationDir,exports.getSessionsDir=getSessionsDir,exports.getTasksDir=getTasksDir,exports.getImagesDir=getImagesDir,exports.getSessionDir=getSessionDir,exports.getSessionId=getSessionId,exports.formatSessionInfo=formatSessionInfo,exports.readSessionLogTail=readSessionLogTail,exports.findHistorySession=findHistorySession,exports.findLatestSession=findLatestSession,exports.updateSessionFile=updateSessionFile,exports.appendSessionLog=appendSessionLog,exports.getActiveSessionsFile=getActiveSessionsFile,exports.saveActiveSession=saveActiveSession,exports.loadActiveSessions=loadActiveSessions,exports.endSession=endSession,exports.switchToSession=switchToSession,exports.startNewSession=startNewSession,exports.processMessageQueue=processMessageQueue,exports.handleSessionMessage=handleSessionMessage,exports.cleanCache=cleanCache;const utils_ok_1=require("utils-ok"),fs_1=__importDefault(require("fs")),os_1=__importDefault(require("os")),assert_1=__importDefault(require("assert")),crypto_1=__importDefault(require("crypto")),path_1=__importDefault(require("path")),commands_1=require("./commands"),messaging_1=require("./messaging"),claude_process_1=require("./claude-process"),platform_1=require("./platform");function timestamp(){return utils_ok_1.dateUtil.mm(Date.now()).format("YYYY-MM-DD HH:mm:ss")}function getHomeDir(){return os_1.default.homedir()}function getClientDir(e){return path_1.default.join(getHomeDir(),".cc-ding",e.clientId)}function initClientDir(e,s){const n=path_1.default.join(getHomeDir(),".cc-ding",e),t=path_1.default.join(n,"config.json");return fs_1.default.mkdirSync(n,{recursive:!0}),fs_1.default.writeFileSync(t,JSON.stringify(s,null,2),{encoding:"utf-8",mode:(0,platform_1.isWindows)()?void 0:384}),(0,platform_1.isWindows)()||fs_1.default.chmodSync(t,384),t}function ensureClientDir(e){const s=path_1.default.join(getHomeDir(),".cc-ding",e),n=path_1.default.join(s,"config.json");if(fs_1.default.existsSync(n))return;console.log(`[${timestamp()}] \u5BA2\u6237\u7AEF\u76EE\u5F55\u672A\u521D\u59CB\u5316: ${s}`),console.log(`[${timestamp()}] \u6B63\u5728\u81EA\u52A8\u521D\u59CB\u5316...`),initClientDir(e,{clientName:"cc\u52A9\u624B",owner:"<owner\u624B\u673A\u53F7>",whiteUserList:[],clientSecret:"<clientSecret-\u9489\u9489Stream\u8FDE\u63A5\u5BC6\u94A5>",defaultDingToken:"<\u515C\u5E95\u9489\u9489\u673A\u5668\u4EBAToken>",conversations:[]}),console.log(`[${timestamp()}] \u5DF2\u751F\u6210\u9ED8\u8BA4\u914D\u7F6E\u6587\u4EF6: ${n}`),console.log(`[${timestamp()}] \u8BF7\u7F16\u8F91 config.json \u586B\u5199\u5FC5\u8981\u7684\u914D\u7F6E\u9879\u540E\u91CD\u65B0\u542F\u52A8`),process.exit(1)}function getClientConfig(e){const s=`${getClientDir(e)}/config.json`;(0,assert_1.default)(fs_1.default.existsSync(s),`Could not find client config file: ${s}`);const n=utils_ok_1.fileUtil.getJSON(s);return(0,assert_1.default)(n.clientSecret,"config.json missing required field: clientSecret"),(0,assert_1.default)(n.whiteUserList,"config.json missing required field: whiteUserList"),n}function resolveToUserId(e,s){return isMobile(s)&&e.resolvedPhones[s]||s}function authCheck(e,s,n){if(isOwnerOrAdmin(e,s))return!0;if(n){const t=e.config.conversations.find(o=>o.conversationId===n);if(t?.whiteUserList&&t.whiteUserList.length>0)return t.whiteUserList.some(o=>resolveToUserId(e,o)===s)}return e.config.whiteUserList.some(t=>resolveToUserId(e,t)===s)}function isOwner(e,s){const n=e.config.owner;if(!n||!isMobile(n))return!1;const t=e.resolvedPhones[n];return!!t&&t===s}function isAdmin(e,s){return e.config.adminUserList?.length?e.config.adminUserList.some(n=>resolveToUserId(e,n)===s):!1}function isOwnerOrAdmin(e,s){return isOwner(e,s)||isAdmin(e,s)}function debugLog(e,s,...n){e.config.debug&&console.log(`[DEBUG] ${s}`,...n)}const PHONE_RE=/^1\d{10}$/;function isMobile(e){return PHONE_RE.test(e)}function getPhoneMapFile(e){return path_1.default.join(getClientDir(e),"phone-map.json")}function loadPhoneMap(e){const s=getPhoneMapFile(e);if(!fs_1.default.existsSync(s))return{};try{const n=JSON.parse(fs_1.default.readFileSync(s,"utf-8"));if(typeof n=="object"&&n!==null)return n}catch{}return{}}function savePhoneMap(e,s){const n=getPhoneMapFile(e);try{fs_1.default.writeFileSync(n,JSON.stringify(s,null,2),"utf-8")}catch(t){console.error("\u4FDD\u5B58 phone-map.json \u5931\u8D25:",t)}}function userIdToPhone(e,s){for(const[n,t]of Object.entries(e.resolvedPhones))if(t===s)return n;return null}function getUserIdNameMapFile(e){return path_1.default.join(getClientDir(e),"user-id-name-map.json")}function loadUserIdNameMap(e){const s=getUserIdNameMapFile(e);if(!fs_1.default.existsSync(s))return{};try{const n=JSON.parse(fs_1.default.readFileSync(s,"utf-8"));if(typeof n=="object"&&n!==null)return n}catch{}return{}}function saveUserIdNameMap(e,s){const n=getUserIdNameMapFile(e);try{fs_1.default.writeFileSync(n,JSON.stringify(s,null,2),"utf-8")}catch(t){console.error("\u4FDD\u5B58 user-id-name-map.json \u5931\u8D25:",t)}}async function resolveUserIdName(e,s){if(!s)return null;const n=loadUserIdNameMap(e);if(n[s])return n[s];const t=await(0,messaging_1.queryDingUser)(e,s);return t&&t.name?(n[s]=t.name,saveUserIdNameMap(e,n),t.name):null}async function resolveUserId(e,s){if(!s)return null;if(!isMobile(s))return s;if(e.resolvedPhones[s])return e.resolvedPhones[s];const n=await(0,messaging_1.queryUserIdByMobile)(e,s);return n&&(e.resolvedPhones[s]=n,savePhoneMap(e,e.resolvedPhones)),n}async function resolveAllPhonesInConfig(e){e.resolvedPhones=loadPhoneMap(e);const s=[],n=async t=>{if(e.resolvedPhones[t])return;const o=await(0,messaging_1.queryUserIdByMobile)(e,t);o&&(e.resolvedPhones[t]=o,s.push(t))};e.config.owner&&(isMobile(e.config.owner)?(await n(e.config.owner),e.resolvedPhones[e.config.owner]||console.warn(`[WARN] \u65E0\u6CD5\u89E3\u6790 owner \u624B\u673A\u53F7: ${e.config.owner}`)):console.warn(`[WARN] owner \u5FC5\u987B\u4E3A\u624B\u673A\u53F7\uFF0C\u5F53\u524D\u503C\u65E0\u6548: ${e.config.owner}`));for(const t of e.config.whiteUserList)isMobile(t)&&(await n(t),e.resolvedPhones[t]||console.warn(`[WARN] \u65E0\u6CD5\u89E3\u6790 whiteUserList \u624B\u673A\u53F7: ${t}`));for(const t of e.config.conversations)if(t.whiteUserList)for(const o of t.whiteUserList)isMobile(o)&&(await n(o),e.resolvedPhones[o]||console.warn(`[WARN] \u65E0\u6CD5\u89E3\u6790\u7FA4\u767D\u540D\u5355\u624B\u673A\u53F7: ${o}`));s.length>0&&savePhoneMap(e,e.resolvedPhones),console.log(`[\u624B\u673A\u89E3\u6790] \u5DF2\u52A0\u8F7D ${Object.keys(e.resolvedPhones).length} \u6761\u8BB0\u5F55 (${s.length} \u6761\u65B0\u89E3\u6790)`)}function hashConversationId(e,s){const t=getConversationConfig(e,s)?.linkConversationId||s;return crypto_1.default.createHash("md5").update(t).digest("hex")}function getReplyWebhook(e){return e.currentWebhook||e.sessionWebhook}function getReplyConversationId(e){return e.currentConversationId||e.conversationId}function findActiveSession(e,s){const n=e.activeSessions.get(s);if(n)return{key:s,session:n};const t=getConversationConfig(e,s);if(t?.linkConversationId){for(const o of e.activeSessions)if(getConversationConfig(e,o[0])?.linkConversationId===t.linkConversationId)return{key:o[0],session:o[1]}}}function getConversationConfig(e,s){return e.config.conversations.find(n=>n.conversationId===s)}function getConversationDir(e,s){const n=hashConversationId(e,s);return`${getClientDir(e)}/${n}`}function getSessionsDir(e,s){return`${getConversationDir(e,s)}/.sessions`}function getTasksDir(e,s){return`${getConversationDir(e,s)}/.tasks`}function getImagesDir(e,s){return`${getConversationDir(e,s)}/.images`}function getSessionDir(e,s){const n=s.claudeSessionId||s.startTimeStr;return`${getSessionsDir(e,s.conversationId)}/${n}`}function getSessionId(e){return e.claudeSessionId||e.startTimeStr}function formatSessionInfo(e,s){const n=findActiveSession(e,s);if(!n)return null;const{session:t,isProcessing:o,messageQueue:i}=n.session;return[`- **\u4F1A\u8BDDID:** ${getSessionId(t)}`,`- **\u53D1\u8D77\u8005:** ${t.startNickName}(${t.startStaffId})`,`- **\u5F00\u59CB\u65F6\u95F4:** ${t.startTimeStr}`,`- **\u6700\u540E\u53D1\u9001\u8005:** ${n.session.lastSenderStaffId}`,`- **\u5904\u7406\u4E2D:** ${o}`,`- **\u6392\u961F\u6D88\u606F:** ${i?.length||0} \u6761`].join(`
|
|
2
2
|
`)}function readSessionLogTail(e,s,n){const t=findActiveSession(e,s);if(!t)return null;const o=t.session,i=`${getSessionDir(e,o.session)}/session.log`;if(!fs_1.default.existsSync(i))return null;try{return fs_1.default.readFileSync(i,"utf-8").split(`
|
|
3
3
|
`).filter(a=>a.length>0).slice(-n).join(`
|
|
4
4
|
`)}catch{return null}}function findHistorySession(e,s,n){const t=getSessionsDir(e,s),o=`${t}/${n}/session.json`;try{return utils_ok_1.fileUtil.getJSON(o)}catch{}const i=parseInt(n,10);if(!isNaN(i)&&i>0){const u=utils_ok_1.dateUtil.mm(i).format("YYYY-MM-DD-HH-mm-ss"),c=`${t}/${u}/session.json`;try{return utils_ok_1.fileUtil.getJSON(c)}catch{}}return null}function findLatestSession(e,s){const n=getSessionsDir(e,s);if(!fs_1.default.existsSync(n))return null;const t=findActiveSession(e,s),o=t?getSessionId(t.session.session):null;let i=null,u=0;try{const c=fs_1.default.readdirSync(n,{withFileTypes:!0});for(const a of c){if(!a.isDirectory())continue;const f=path_1.default.join(n,a.name,"session.json");if(fs_1.default.existsSync(f))try{const r=utils_ok_1.fileUtil.getJSON(f);if(o&&getSessionId(r)===o)continue;r.startTime>u&&(u=r.startTime,i=r)}catch{continue}}}catch{}return i}function updateSessionFile(e,s,n){if(n.claudeSessionId&&!s.claudeSessionId){const o=getSessionDir(e,s);s.claudeSessionId=n.claudeSessionId;const i=getSessionDir(e,s);o!==i&&fs_1.default.existsSync(o)&&(fs_1.default.renameSync(o,i),console.log(`[${timestamp()}] \u4F1A\u8BDD\u76EE\u5F55\u91CD\u547D\u540D: ${path_1.default.basename(o)} -> ${path_1.default.basename(i)}`))}const t=`${getSessionDir(e,s)}/session.json`;try{n.sessionWebhook&&(s.sessionWebhook=n.sessionWebhook),n.currentWebhook!==void 0&&(s.currentWebhook=n.currentWebhook||void 0),n.currentConversationId!==void 0&&(s.currentConversationId=n.currentConversationId||void 0),fs_1.default.writeFileSync(t,JSON.stringify(s,null,2),"utf-8");const o=n.claudeSessionId?"claudeSessionId":n.currentWebhook!==void 0?"currentWebhook":"sessionWebhook";console.log(`[${timestamp()}] \u4F1A\u8BDD\u6587\u4EF6\u5DF2\u4FDD\u5B58: ${o}`),saveActiveSession(e,s.conversationId)}catch(o){console.error("\u66F4\u65B0 session.json \u5931\u8D25:",o)}}function appendSessionLog(e,s,n){const t=`${e}/session.log`,i=`[${timestamp()}] [${s.toUpperCase()}]: ${n}
|
|
@@ -9,6 +9,6 @@
|
|
|
9
9
|
`,"utf-8")}async function switchToSession(e,s,n,t,o,i){const u=findHistorySession(e,s,t);if(!u)return await(0,messaging_1.sendDingMessage)(e,{conversationId:s,sessionWebhook:n,atUserId:o,content:`\u274C \u672A\u627E\u5230\u4F1A\u8BDD ${t}\uFF0C\u8BE5\u4F1A\u8BDD\u53EF\u80FD\u5DF2\u88AB\u6E05\u7406\uFF0C\u8BF7\u53D1\u9001\u65B0\u6D88\u606F\u5F00\u59CB\u65B0\u4F1A\u8BDD`}),!1;const c=getSessionDir(e,u);if(!fs_1.default.existsSync(c))return await(0,messaging_1.sendDingMessage)(e,{conversationId:s,sessionWebhook:n,atUserId:o,content:`\u274C \u4F1A\u8BDD ${t} \u7684\u6570\u636E\u5DF2\u88AB\u6E05\u7406\uFF0C\u65E0\u6CD5\u6062\u590D\uFF0C\u8BF7\u53D1\u9001\u65B0\u6D88\u606F\u5F00\u59CB\u65B0\u4F1A\u8BDD`}),!1;const a=findActiveSession(e,s);a&&(console.log(`\u5207\u6362\u4F1A\u8BDD\uFF0C\u5148\u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD: ${getSessionId(a.session.session)}`),(0,claude_process_1.interruptClaudeProcess)(a.session,"\u5207\u6362\u4F1A\u8BDD\u65F6\u4E2D\u65AD\u6B63\u5728\u6267\u884C\u7684 Claude \u8FDB\u7A0B"),e.activeSessions.delete(a.key),saveActiveSession(e,a.key),fs_1.default.appendFileSync(`${getSessionDir(e,a.session.session)}/session.log`,`[${timestamp()}] [SYSTEM]: \u4F1A\u8BDD\u88AB\u5207\u6362\u5230 ${t}\uFF0C\u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD
|
|
10
10
|
`,"utf-8")),e.activeSessions.set(s,{session:u,lastSenderStaffId:o,isProcessing:!1,messageQueue:[],conversationConfig:i}),saveActiveSession(e,s);const f=!!u.claudeSessionId,r=getSessionId(u);return await(0,messaging_1.sendDingMessage)(e,{conversationId:s,sessionWebhook:n,atUserId:o,content:`\u2705 \u5DF2\u5207\u6362\u5230\u5386\u53F2\u4F1A\u8BDD (\u4F1A\u8BDDID: ${r})
|
|
11
11
|
${f?"\u{1F504} \u5DF2\u6062\u590D\u5BF9\u8BDD\u4E0A\u4E0B\u6587":"\u26A0\uFE0F \u8BE5\u4F1A\u8BDD\u65E0\u5386\u53F2\u4E0A\u4E0B\u6587\uFF0C\u5C06\u4ECE\u5934\u5F00\u59CB"}
|
|
12
|
-
\u{1F4A1} \u56DE\u590D /end \u53EF\u7ED3\u675F\u672C\u8F6E\u5BF9\u8BDD`}),console.log(`\u5DF2\u5207\u6362\u5230\u5386\u53F2\u4F1A\u8BDD: \u7FA4=${s}, \u4F1A\u8BDDID=${r}, \u6709Claude\u4E0A\u4E0B\u6587=${f}`),!0}async function startNewSession(e,s){const{conversationId:n,sessionWebhook:t,senderStaffId:o,senderNick:i,message:u,conversationConfig:c}=s,a=e.config.sessionMaxConcurrency??e.DEFAULT_SESSION_MAX_CONCURRENCY;if(e.activeSessions.size>=a){console.log(`\u8FBE\u5230\u6700\u5927\u5E76\u53D1\u6570 (${a})\uFF0C\u62D2\u7EDD\u65B0\u4F1A\u8BDD: \u7FA4=${n}`),await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:t,atUserId:o,content:"\u{1F92F} \u5F53\u524D\u7E41\u5FD9\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5..."});return}const f=Date.now(),r={conversationId:n,sessionWebhook:t,startTime:f,startTimeStr:utils_ok_1.dateUtil.mm(f).format("YYYY-MM-DD-HH-mm-ss"),startStaffId:o,startNickName:i};console.log(`\u521B\u5EFA\u65B0\u4F1A\u8BDD: \u7FA4=${n}, \u4F1A\u8BDDID=${getSessionId(r)}, \u53D1\u8D77\u8005=${o}, \u5F53\u524D\u5E76\u53D1=${e.activeSessions.size+1}/${a}`);const
|
|
12
|
+
\u{1F4A1} \u56DE\u590D /end \u53EF\u7ED3\u675F\u672C\u8F6E\u5BF9\u8BDD`}),console.log(`\u5DF2\u5207\u6362\u5230\u5386\u53F2\u4F1A\u8BDD: \u7FA4=${s}, \u4F1A\u8BDDID=${r}, \u6709Claude\u4E0A\u4E0B\u6587=${f}`),!0}async function startNewSession(e,s){const{conversationId:n,sessionWebhook:t,senderStaffId:o,senderNick:i,message:u,conversationConfig:c}=s,a=e.config.sessionMaxConcurrency??e.DEFAULT_SESSION_MAX_CONCURRENCY;if(e.activeSessions.size>=a){console.log(`\u8FBE\u5230\u6700\u5927\u5E76\u53D1\u6570 (${a})\uFF0C\u62D2\u7EDD\u65B0\u4F1A\u8BDD: \u7FA4=${n}`),await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:t,atUserId:o,content:"\u{1F92F} \u5F53\u524D\u7E41\u5FD9\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5..."});return}const f=Date.now(),r={conversationId:n,sessionWebhook:t,startTime:f,startTimeStr:utils_ok_1.dateUtil.mm(f).format("YYYY-MM-DD-HH-mm-ss"),startStaffId:o,startNickName:i};console.log(`\u521B\u5EFA\u65B0\u4F1A\u8BDD: \u7FA4=${n}, \u4F1A\u8BDDID=${getSessionId(r)}, \u53D1\u8D77\u8005=${o}, \u5F53\u524D\u5E76\u53D1=${e.activeSessions.size+1}/${a}`);const d=getSessionDir(e,r);fs_1.default.mkdirSync(d,{recursive:!0}),fs_1.default.writeFileSync(`${d}/session.json`,JSON.stringify(r,null,2),"utf-8"),e.activeSessions.set(n,{session:r,lastSenderStaffId:o,isProcessing:!0,messageQueue:[],conversationConfig:c}),saveActiveSession(e,n),c.receiveReply!==!1&&await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:t,atUserId:o,content:`\u{1F680} \u4F1A\u8BDD\u5DF2\u5F00\u59CB\uFF01
|
|
13
13
|
\u5904\u7406\u4E2D...
|
|
14
|
-
\u{1F4A1} \u56DE\u590D /end \u53EF\u7ED3\u675F\u672C\u8F6E\u5BF9\u8BDD`});try{await(0,claude_process_1.executeClaudeQuery)(e,r,u,{skill:c.taskCfg?.skill,agent:c.agent,senderNick:i,senderStaffId:o,permissionMode:c.permissionMode})}catch(
|
|
14
|
+
\u{1F4A1} \u56DE\u590D /end \u53EF\u7ED3\u675F\u672C\u8F6E\u5BF9\u8BDD`});try{await(0,claude_process_1.executeClaudeQuery)(e,r,u,{skill:c.taskCfg?.skill,agent:c.agent,senderNick:i,senderStaffId:o,permissionMode:c.permissionMode})}catch(l){console.error("\u6267\u884C Claude \u67E5\u8BE2\u5931\u8D25:",l),await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:t,atUserId:o,content:`\u274C \u5904\u7406\u6D88\u606F\u65F6\u53D1\u751F\u9519\u8BEF: ${l instanceof Error?l.message:String(l)}`})}finally{const l=e.activeSessions.get(n);l&&(l.isProcessing=!1)}const g=e.activeSessions.get(n);g&&g.messageQueue.length>0&&await processMessageQueue(e,n)}async function processMessageQueue(e,s){const n=e.activeSessions.get(s);if(!n||n.messageQueue.length===0)return;const t=n.messageQueue.shift(),{message:o,senderStaffId:i,senderNick:u}=t,c=n.session.sessionWebhook;console.log(`\u5904\u7406\u961F\u5217\u6D88\u606F: \u7FA4=${s}, \u5269\u4F59 ${n.messageQueue.length} \u6761`),n.isProcessing=!0,n.lastSenderStaffId=i,saveActiveSession(e,s),n.conversationConfig.receiveReply!==!1&&await(0,messaging_1.sendDingMessage)(e,{conversationId:s,sessionWebhook:c,atUserId:i,content:"\u2705 \u6536\u5230\uFF0C\u6211\u6765\u5904\u7406..."}).catch(()=>{});try{await(0,claude_process_1.executeClaudeQuery)(e,n.session,o,{skill:n.conversationConfig.taskCfg?.skill,agent:n.conversationConfig.agent,senderNick:u,senderStaffId:i,permissionMode:n.conversationConfig.permissionMode})}catch(a){console.error("\u6267\u884C\u961F\u5217 Claude \u67E5\u8BE2\u5931\u8D25:",a),await(0,messaging_1.sendDingMessage)(e,{conversationId:s,sessionWebhook:c,atUserId:i,content:`\u274C \u5904\u7406\u6D88\u606F\u65F6\u53D1\u751F\u9519\u8BEF: ${a instanceof Error?a.message:String(a)}`})}finally{n.isProcessing=!1}if(n.goonPending){n.goonPending=!1,n.interrupted=!1,n.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(e,n.session,"\u7EE7\u7EED",{senderNick:n.session.startNickName,senderStaffId:n.lastSenderStaffId,permissionMode:n.conversationConfig.permissionMode})}catch(a){console.error("goonPending \u6062\u590D\u6267\u884C\u5931\u8D25:",a)}finally{n.isProcessing=!1}}n.messageQueue.length>0&&await processMessageQueue(e,s)}async function handleSessionMessage(e,s){const{conversationId:n,sessionWebhook:t,senderStaffId:o,senderNick:i,message:u,conversationConfig:c}=s,a=u.replace(/^\[提及用户: .+\]\n/,"");if((0,commands_1.parseEndCommand)(a)){await endSession(e,n,t);return}const f=findActiveSession(e,n),r=f?.session;if(r){const d=getSessionDir(e,r.session);if(fs_1.default.existsSync(d)||(fs_1.default.mkdirSync(d,{recursive:!0}),fs_1.default.writeFileSync(`${d}/session.json`,JSON.stringify(r.session,null,2),"utf-8"),console.log(`\u4F1A\u8BDD\u76EE\u5F55\u5DF2\u91CD\u5EFA: \u7FA4=${n}, \u8DEF\u5F84=${d}`)),r.isProcessing){const l={message:u,senderStaffId:o,senderNick:i};r.messageQueue.push(l);const S=r.messageQueue.length;console.log(`\u4F1A\u8BDD ${n} \u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u6392\u961F\u7B2C ${S} \u6761`),await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:t,atUserId:o,content:`\u23F3 \u6B63\u5728\u5904\u7406\u4E2D\uFF0C\u5DF2\u52A0\u5165\u961F\u5217\uFF08\u6392\u961F\u7B2C ${S} \u6761\uFF09`});return}const g=r.session.conversationId===n;console.log(`\u8FFD\u52A0\u6D88\u606F\u5230\u6D3B\u8DC3\u4F1A\u8BDD: \u7FA4=${n}, \u4F1A\u8BDDID=${getSessionId(r.session)}${g?"":`(\u5173\u8054\u7FA4,\u4F1A\u8BDD\u5F52\u5C5E=${r.session.conversationId})`}`),r.lastSenderStaffId=o,r.isProcessing=!0,saveActiveSession(e,f.key),g&&t!==r.session.sessionWebhook&&(r.session.sessionWebhook=t,updateSessionFile(e,r.session,{sessionWebhook:t})),r.session.currentWebhook=t,r.session.currentConversationId=n,updateSessionFile(e,r.session,{currentWebhook:t,currentConversationId:n}),c.receiveReply!==!1&&await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:t,atUserId:o,content:"\u2705 \u6536\u5230\uFF0C\u6211\u6765\u5904\u7406..."});try{await(0,claude_process_1.executeClaudeQuery)(e,r.session,u,{skill:c.taskCfg?.skill,agent:c.agent,senderNick:i,senderStaffId:o,permissionMode:c.permissionMode})}catch(l){if(r.session.claudeSessionId){console.log(`[\u4F1A\u8BDD\u6062\u590D\u5931\u8D25] \u6E05\u9664 claudeSessionId \u5E76\u91CD\u65B0\u53D1\u8D77: ${r.session.claudeSessionId}`),r.session.claudeSessionId=void 0,e.updateSessionFile(r.session,{});try{await(0,claude_process_1.executeClaudeQuery)(e,r.session,u,{skill:c.taskCfg?.skill,agent:c.agent,senderNick:i,senderStaffId:o,permissionMode:c.permissionMode});return}catch(S){console.error("\u91CD\u8BD5\u6267\u884C Claude \u67E5\u8BE2\u5931\u8D25:",S),await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:t,atUserId:o,content:`\u274C \u5904\u7406\u6D88\u606F\u65F6\u53D1\u751F\u9519\u8BEF: ${S instanceof Error?S.message:String(S)}`}),r.isProcessing=!1,await processMessageQueue(e,n);return}}console.error("\u6267\u884C Claude \u67E5\u8BE2\u5931\u8D25:",l),await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:t,atUserId:o,content:`\u274C \u5904\u7406\u6D88\u606F\u65F6\u53D1\u751F\u9519\u8BEF: ${l instanceof Error?l.message:String(l)}`})}finally{r.isProcessing=!1}await processMessageQueue(e,n)}else await startNewSession(e,{conversationId:n,sessionWebhook:t,senderStaffId:o,senderNick:i,message:u,conversationConfig:c})}function cleanCache(e,s,n=!0){const t={sessionsDeleted:0,tasksDeleted:0,imagesDeleted:0,errors:[]},o=s?[s]:e.config.conversations.map(i=>i.conversationId);for(const i of o){let u=null;if(n){const d=findActiveSession(e,i);d&&(u=getSessionId(d.session.session))}const c=getSessionsDir(e,i);if(fs_1.default.existsSync(c))try{const d=fs_1.default.readdirSync(c,{withFileTypes:!0});for(const g of d){if(!g.isDirectory()||u&&g.name===u)continue;const l=path_1.default.join(c,g.name);try{fs_1.default.rmSync(l,{recursive:!0,force:!0}),t.sessionsDeleted++}catch{t.errors.push(`\u5220\u9664\u4F1A\u8BDD\u76EE\u5F55\u5931\u8D25: ${l}`)}}}catch{t.errors.push(`\u8BFB\u53D6sessions\u76EE\u5F55\u5931\u8D25: ${c}`)}const a=getTasksDir(e,i);if(fs_1.default.existsSync(a))try{const d=fs_1.default.readdirSync(a,{withFileTypes:!0});for(const g of d){if(!g.isDirectory())continue;const l=path_1.default.join(a,g.name);try{fs_1.default.rmSync(l,{recursive:!0,force:!0}),t.tasksDeleted++}catch{t.errors.push(`\u5220\u9664\u4EFB\u52A1\u76EE\u5F55\u5931\u8D25: ${l}`)}}}catch{t.errors.push(`\u8BFB\u53D6tasks\u76EE\u5F55\u5931\u8D25: ${a}`)}const f=getImagesDir(e,i);if(fs_1.default.existsSync(f))try{const d=fs_1.default.readdirSync(f,{withFileTypes:!0});for(const g of d){const l=path_1.default.join(f,g.name);try{fs_1.default.unlinkSync(l),t.imagesDeleted++}catch{t.errors.push(`\u5220\u9664\u56FE\u7247\u5931\u8D25: ${l}`)}}}catch{t.errors.push(`\u8BFB\u53D6images\u76EE\u5F55\u5931\u8D25: ${f}`)}const r=path_1.default.join(getConversationDir(e,i),".playwright-cli");if(fs_1.default.existsSync(r))try{fs_1.default.rmSync(r,{recursive:!0,force:!0})}catch{t.errors.push(`\u5220\u9664 playwright-cli \u7F13\u5B58\u5931\u8D25: ${r}`)}if(!n){const d=getActiveSessionsFile(e,i);if(fs_1.default.existsSync(d))try{fs_1.default.unlinkSync(d)}catch{t.errors.push(`\u5220\u9664\u6D3B\u8DC3\u4F1A\u8BDD\u6587\u4EF6\u5931\u8D25: ${d}`)}e.activeSessions.has(i)&&e.activeSessions.delete(i)}}return t}
|
package/dist/src/biz/task.js
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
|
-
"use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.formatTaskInfo=formatTaskInfo,exports.countTodoTask=countTodoTask,exports.getOneTodoTask=getOneTodoTask,exports.finishTask=finishTask,exports.cancelTask=cancelTask,exports.parseTaskCancelCommand=parseTaskCancelCommand,exports.handleTask=handleTask,exports.runTaskHandlerLoop=runTaskHandlerLoop,exports.saveTask=saveTask;const utils_ok_1=require("utils-ok"),fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),child_process_1=require("child_process"),common_1=require("../common"),messaging_1=require("./messaging"),claude_process_1=require("./claude-process"),session_1=require("./session"),api_key_manager_1=require("./api-key-manager"),MAX_RETRY_COUNT=3;function formatTaskInfo(t){const e=[],
|
|
2
|
-
${
|
|
3
|
-
`)}`)}else
|
|
4
|
-
\u65E0`);if(e.length>0){const
|
|
5
|
-
${
|
|
6
|
-
`)}`)}else
|
|
7
|
-
\u65E0`);const n
|
|
8
|
-
${
|
|
9
|
-
`)}`)}else
|
|
10
|
-
\u65E0`);if(
|
|
11
|
-
${
|
|
12
|
-
`)}`)}return
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.notifyTaskQueue=notifyTaskQueue,exports.formatTaskInfo=formatTaskInfo,exports.countTodoTask=countTodoTask,exports.getOneTodoTask=getOneTodoTask,exports.finishTask=finishTask,exports.cancelTask=cancelTask,exports.parseTaskCancelCommand=parseTaskCancelCommand,exports.handleTask=handleTask,exports.runTaskHandlerLoop=runTaskHandlerLoop,exports.saveTask=saveTask;const utils_ok_1=require("utils-ok"),fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),child_process_1=require("child_process"),common_1=require("../common"),messaging_1=require("./messaging"),claude_process_1=require("./claude-process"),claude_sdk_1=require("./claude-sdk"),session_1=require("./session"),api_key_manager_1=require("./api-key-manager"),MAX_RETRY_COUNT=3,RETRY_NOTIFY_DELAY_MS=1e4,IDLE_SWEEP_INTERVAL_MS=6e4,taskWaiters=[];function notifyTaskQueue(){for(;taskWaiters.length>0;)taskWaiters.shift()()}function waitForTaskSignal(t){return new Promise(e=>{const o=()=>{clearTimeout(n),e()},n=setTimeout(()=>{const a=taskWaiters.indexOf(o);a!==-1&&taskWaiters.splice(a,1),e()},t);n.unref?.(),taskWaiters.push(o)})}function formatTaskInfo(t){const e=[],o=[],n=[],a=[];for(const i of t.config.conversations){const r=(0,session_1.getTasksDir)(t,i.conversationId);if(!fs_1.default.existsSync(r))continue;const u=utils_ok_1.fileUtil.dirWalker(r);for(const m of u){const c=path_1.default.basename(m);try{const g=utils_ok_1.fileUtil.getJSON(m);if(!g)continue;c==="task.json"?e.push(g):c==="task-doing.json"?o.push(g):c==="task-done.json"?n.push(g):c==="task-failed.json"&&a.push(g)}catch{}}}e.sort((i,r)=>i.startTime-r.startTime),o.sort((i,r)=>i.startTime-r.startTime),n.sort((i,r)=>r.startTime-i.startTime),a.sort((i,r)=>r.startTime-i.startTime);const l=[];if(o.length>0){const i=o.map(r=>`#${r.startTime} ${r.senderNickName||r.senderStaffId}: ${taskDisplayName(r)}`);l.push(`**\u23F3 \u5904\u7406\u4E2D (${o.length})**
|
|
2
|
+
${i.join(`
|
|
3
|
+
`)}`)}else l.push(`**\u23F3 \u5904\u7406\u4E2D**
|
|
4
|
+
\u65E0`);if(e.length>0){const i=e.map(r=>`#${r.startTime} ${r.senderNickName||r.senderStaffId}: ${taskDisplayName(r)}`);l.push(`**\u{1F4CB} \u5F85\u529E\u961F\u5217 (${e.length})**
|
|
5
|
+
${i.join(`
|
|
6
|
+
`)}`)}else l.push(`**\u{1F4CB} \u5F85\u529E\u961F\u5217**
|
|
7
|
+
\u65E0`);const s=n.slice(0,5);if(s.length>0){const i=s.map(r=>`#${r.startTime} ${r.senderNickName||r.senderStaffId}: ${taskDisplayName(r)}`);l.push(`**\u2705 \u6700\u8FD1\u5B8C\u6210 (top ${s.length}/${n.length})**
|
|
8
|
+
${i.join(`
|
|
9
|
+
`)}`)}else l.push(`**\u2705 \u6700\u8FD1\u5B8C\u6210**
|
|
10
|
+
\u65E0`);if(a.length>0){const i=a.map(r=>`#${r.startTime} ${r.senderNickName||r.senderStaffId}: ${taskDisplayName(r)}${r.retryCount?` (\u91CD\u8BD5${r.retryCount}\u6B21)`:""}`);l.push(`**\u274C \u5931\u8D25 (${a.length})**
|
|
11
|
+
${i.join(`
|
|
12
|
+
`)}`)}return l.join(`
|
|
13
13
|
|
|
14
|
-
`)}function truncatePrompt(t,e=80){const
|
|
15
|
-
`)
|
|
16
|
-
\u539F\u56E0: ${
|
|
17
|
-
`),
|
|
18
|
-
...\u5171\u53D6\u6D88 ${
|
|
19
|
-
${
|
|
20
|
-
`);fs_1.default.writeFileSync(
|
|
21
|
-
`);fs_1.default.writeFileSync(
|
|
22
|
-
`);fs_1.default.writeFileSync(
|
|
23
|
-
`);fs_1.default.writeFileSync(
|
|
24
|
-
`);if(fs_1.default.writeFileSync(n,U),h!==0){console.error(`\u547D\u4EE4\u6267\u884C\u5931\u8D25, \u9000\u51FA\u7801: ${h}`),await failTask(t,r,`\u6267\u884C\u5931\u8D25(\u9000\u51FA\u7801: ${h})`);return}if(fs_1.default.existsSync(a))console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u5B8C\u6210`);else{console.error("\u4EFB\u52A1\u672A\u6309\u9884\u671F\u5904\u7406"),await failTask(t,r,"\u672A\u751F\u6210\u7ED3\u679C\u6587\u4EF6");return}await finishTask(t,r)}async function runTaskHandlerLoop(t){for(;;)await handleTask(t).catch(e=>console.error(e)),await utils_ok_1.baseUtil.sleep(1e4)}async function saveTask(t,e){const{conversationId:i,prompt:s,senderStaffId:r,senderNickName:a,sessionWebhook:n,type:l="normal"}=e,o=Date.now(),u=utils_ok_1.dateUtil.mm(o).format("YYYY-MM-DD-HH-mm-ss"),p=`${(0,session_1.getTasksDir)(t,i)}/${u}`,c=`${p}/task.json`,g={conversationId:i,startTime:o,startTimeStr:u,prompt:s,senderStaffId:r,senderNickName:a||"",sessionWebhook:n,type:l};await utils_ok_1.fileUtil.saveFileStr(JSON.stringify(g,null,2),c),(0,session_1.debugLog)(t,`\u4EFB\u52A1\u5DF2\u4FDD\u5B58: ${c}`),preprocessTask(t,i,s).then(f=>{if(f)try{const d=`${p}/task-doing.json`,j=fs_1.default.existsSync(d)?d:fs_1.default.existsSync(c)?c:null;if(!j){console.log(`[${(0,session_1.timestamp)()}] \u9884\u5904\u7406\u5B8C\u6210\u4F46\u4EFB\u52A1\u6587\u4EF6\u5DF2\u4E0D\u5B58\u5728: ${p}`);return}const m=utils_ok_1.fileUtil.getJSON(j);m.title=f.title,m.promptSimply=f.promptSimply,fs_1.default.writeFileSync(j,JSON.stringify(m,null,2),"utf-8"),console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u7ED3\u679C\u5DF2\u66F4\u65B0: ${f.title}`)}catch(d){console.error(`[${(0,session_1.timestamp)()}] \u66F4\u65B0\u4EFB\u52A1\u9884\u5904\u7406\u7ED3\u679C\u5931\u8D25:`,d)}}).catch(f=>{console.error(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u5F02\u5E38:`,f)})}
|
|
14
|
+
`)}function truncatePrompt(t,e=80){const o=t.replace(/\n/g," ").trim();return o.length>e?o.slice(0,e)+"...":o}function taskDisplayName(t){return t.title?t.title:truncatePrompt(t.prompt)}async function preprocessTask(t,e,o){const n=(0,session_1.getConversationDir)(t,e),a=(0,claude_process_1.resolveClaudeSettingsPath)(t,n),l=["\u8BF7\u5BF9\u4EE5\u4E0B\u4EFB\u52A1\u9700\u6C42\u8FDB\u884C\u9884\u5904\u7406\uFF0C\u751F\u6210\u7B80\u77ED\u6807\u9898\u548C\u4F18\u5316\u540E\u7684\u9700\u6C42\u63CF\u8FF0\u3002","\u76F4\u63A5\u8FD4\u56DEJSON\uFF0C\u4E0D\u8981markdown\u4EE3\u7801\u5757\u6216\u5176\u4ED6\u5185\u5BB9\u3002",'\u683C\u5F0F: {"title":"\u7B80\u77ED\u6807\u9898(15\u5B57\u4EE5\u5185)","promptSimply":"\u4F18\u5316\u540E\u7684\u9700\u6C42\u63CF\u8FF0\uFF0C\u4FDD\u7559\u539F\u59CB\u9700\u6C42\u7684\u6240\u6709\u5173\u952E\u4FE1\u606F\uFF0C\u4F7F\u63CF\u8FF0\u66F4\u6E05\u6670\u3001\u7ED3\u6784\u5316"}',"",`\u539F\u59CB\u9700\u6C42: ${o}`].join(`
|
|
15
|
+
`),s=await(0,claude_sdk_1.runOneShotPrompt)(l,{cwd:n,settingsPath:a,timeoutMs:3e4});if(!s.ok||!s.text.trim()){const i=s.timedOut?"\u8D85\u65F6":s.errorOutput.trim().substring(0,100)||"\u65E0\u8F93\u51FA";return console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u5931\u8D25(${i})\uFF0C\u4F7F\u7528\u539F\u59CBprompt`),null}try{let i=s.text.trim();const r=i.match(/\{[\s\S]*\}/);r&&(i=r[0]);const u=JSON.parse(i);return u.title&&u.promptSimply?(console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u5B8C\u6210: title="${u.title}"`),{title:String(u.title),promptSimply:String(u.promptSimply)}):(console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u8FD4\u56DE\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u4F7F\u7528\u539F\u59CBprompt`),null)}catch(i){return console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406JSON\u89E3\u6790\u5931\u8D25\uFF0C\u4F7F\u7528\u539F\u59CBprompt: ${i}`),null}}function countTodoTask(t){let e=0;for(const o of t.config.conversations){const n=(0,session_1.getTasksDir)(t,o.conversationId);if(fs_1.default.existsSync(n)){const l=utils_ok_1.fileUtil.dirWalker(n).filter(s=>path_1.default.basename(s)==="task.json");e+=l.length}}return e}async function getOneTodoTask(t){for(const e of t.config.conversations){const o=(0,session_1.getTasksDir)(t,e.conversationId);if(!fs_1.default.existsSync(o))continue;const a=utils_ok_1.fileUtil.dirWalker(o).filter(s=>path_1.default.basename(s)==="task.json");if(a.length===0)continue;const l=a.map(s=>{try{const i=utils_ok_1.fileUtil.getJSON(s);return i?{file:s,task:i}:null}catch{return console.error(`\u4EFB\u52A1\u6587\u4EF6\u89E3\u6790\u5931\u8D25\uFF0C\u8DF3\u8FC7: ${s}`),null}}).filter(s=>s!==null).sort((s,i)=>s.task.startTime-i.task.startTime);if(l.length>0){const{file:s,task:i}=l[0];return common_1.utils.addSuffixToFile(s,"-doing"),i}}}async function finishTask(t,e){const o=`${e}/task-doing.json`;let n;try{n=utils_ok_1.fileUtil.getJSON(o)}catch(i){console.error(`\u8BFB\u53D6\u4EFB\u52A1\u6587\u4EF6\u5931\u8D25: ${o}`,i);return}const a=`${e}/result.md`,l=fs_1.default.existsSync(a)?utils_ok_1.fileUtil.getFileStr(a):"\u62B1\u6B49,\u4EFB\u52A1\u5904\u7406\u5F02\u5E38...";await(0,messaging_1.sendDingMessage)(t,{conversationId:n.conversationId,sessionWebhook:n.sessionWebhook,atUserId:n.senderStaffId,content:l,msgType:"markdown"});const s=o.replace("-doing.json","-done.json");utils_ok_1.fileUtil.rename(o,s)}async function failTask(t,e,o){const n=`${e}/task-doing.json`;let a;try{a=utils_ok_1.fileUtil.getJSON(n)}catch(s){console.error(`\u8BFB\u53D6\u4EFB\u52A1\u6587\u4EF6\u5931\u8D25: ${n}`,s);return}await(0,messaging_1.sendDingMessage)(t,{conversationId:a.conversationId,sessionWebhook:a.sessionWebhook,atUserId:a.senderStaffId,content:`\u274C \u4EFB\u52A1\u5931\u8D25: ${taskDisplayName(a)}
|
|
16
|
+
\u539F\u56E0: ${o}`,msgType:"markdown"});const l=n.replace("-doing.json","-failed.json");utils_ok_1.fileUtil.rename(n,l)}async function resetTaskToTodo(t,e,o){const n=`${e}/task-doing.json`,a=`${e}/task.json`;if(!fs_1.default.existsSync(n))return!1;try{const s=utils_ok_1.fileUtil.getJSON(n),i=(s.retryCount||0)+1;if(i>=MAX_RETRY_COUNT)return console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u91CD\u8BD5\u6B21\u6570\u5DF2\u8FBE\u4E0A\u9650(${i}/${MAX_RETRY_COUNT})\uFF0C\u6807\u8BB0\u4E3A\u5931\u8D25: ${s.title||s.prompt}`),s.retryCount=i,fs_1.default.writeFileSync(n,JSON.stringify(s,null,2),"utf-8"),await failTask(t,e,`${o} (\u5DF2\u91CD\u8BD5${i}\u6B21)`),!1;s.retryCount=i,fs_1.default.writeFileSync(n,JSON.stringify(s,null,2),"utf-8"),console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u91CD\u7F6E\u4E3A\u5F85\u529E (\u91CD\u8BD5${i}/${MAX_RETRY_COUNT}): ${s.title||s.prompt}`)}catch(s){console.error(`[${(0,session_1.timestamp)()}] \u66F4\u65B0\u4EFB\u52A1\u91CD\u8BD5\u8BA1\u6570\u5931\u8D25:`,s)}return fs_1.default.existsSync(n)&&utils_ok_1.fileUtil.rename(n,a),setTimeout(()=>notifyTaskQueue(),RETRY_NOTIFY_DELAY_MS).unref?.(),!0}function cancelTask(t,e,o){const n=[],a=e.trim(),l=o?t.config.conversations.filter(u=>u.conversationId===o):t.config.conversations;for(const u of l){const m=(0,session_1.getTasksDir)(t,u.conversationId);if(!fs_1.default.existsSync(m))continue;const g=utils_ok_1.fileUtil.dirWalker(m).filter(d=>path_1.default.basename(d)==="task.json");for(const d of g)try{const p=utils_ok_1.fileUtil.getJSON(d);if(!p)continue;if(String(p.startTime)===a){n.push({file:d,task:p});continue}if(p.title&&p.title.includes(a)){n.push({file:d,task:p});continue}}catch{}}if(n.length===0)return`\u672A\u627E\u5230\u5339\u914D\u7684\u5F85\u529E\u4EFB\u52A1: ${a}`;let s=0;for(const{file:u,task:m}of n)try{fs_1.default.unlinkSync(u),s++,console.log(`[${(0,session_1.timestamp)()}] \u5DF2\u53D6\u6D88\u4EFB\u52A1: #${m.startTime} ${m.title||m.prompt}`)}catch(c){console.error(`[${(0,session_1.timestamp)()}] \u53D6\u6D88\u4EFB\u52A1\u5931\u8D25: ${u}`,c)}const i=n.slice(0,5).map(u=>`#${u.task.startTime} ${taskDisplayName(u.task)}`).join(`
|
|
17
|
+
`),r=s>5?`
|
|
18
|
+
...\u5171\u53D6\u6D88 ${s} \u4E2A\u4EFB\u52A1`:"";return`\u5DF2\u53D6\u6D88 ${s} \u4E2A\u5F85\u529E\u4EFB\u52A1:
|
|
19
|
+
${i}${r}`}function parseTaskCancelCommand(t){const o=t.trim().match(/^\/task\s+cancel\s+(.+)$/i);return o?o[1].trim():null}function updateCmdArgsSettings(t,e){const o=t.indexOf("--settings");o!==-1&&t.splice(o,2),e&&t.push("--settings",e)}async function handleTask(t){const e=await getOneTodoTask(t);if(!e)return(0,session_1.debugLog)(t,"\u672A\u53D1\u73B0\u5F85\u529E\u4EFB\u52A1..."),!1;const o=(0,session_1.getConversationConfig)(t,e.conversationId),n=(0,session_1.getConversationDir)(t,e.conversationId),a=`${(0,session_1.getTasksDir)(t,e.conversationId)}/${e.startTimeStr}`;if(!fs_1.default.existsSync(a))return console.error(`\u4EFB\u52A1\u76EE\u5F55\u4E0D\u5B58\u5728: ${a}`),!0;e.type!=="cron"&&await(0,messaging_1.sendDingMessage)(t,{conversationId:e.conversationId,sessionWebhook:e.sessionWebhook,atUserId:e.senderStaffId,content:`\u{1F504} \u5F00\u59CB\u5904\u7406\u4EFB\u52A1: ${taskDisplayName(e)}`});const l=`${a}/result.md`,s=`${a}/task.log`;console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u4E2D: ${e.title||e.prompt}`);const i=e.senderNickName&&e.senderStaffId?`${e.senderNickName}(${e.senderStaffId}), `:"unknown",r=t.config.apiKeyCfg,u=(0,api_key_manager_1.getForceEnabledSettingsPath)(n);let m=!1,c=null;if(u)console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 FORCE_ENABLE\uFF0C\u5F3A\u5236\u4F7F\u7528 settings-ding.json`);else if(r){if(c=(0,api_key_manager_1.pickValidApiKey)(t),!c)return console.log(`[${(0,session_1.timestamp)()}] \u65E0\u53EF\u7528\u914D\u989D\uFF0C\u4EFB\u52A1\u91CD\u7F6E\u4E3A\u5F85\u529E`),await resetTaskToTodo(t,a,"\u65E0\u53EF\u7528\u914D\u989D"),!1;m=!0,console.log(`[${(0,session_1.timestamp)()}] \u5207\u6362\u5230 API Key \u6A21\u5F0F`)}const g=o?.taskCfg?.skill,d=o?.agent,p=e.promptSimply||e.prompt,j=`${g?`/${g}`:""} \u7528\u6237: ${i}, \u9700\u6C42: ${p}; \u6700\u540E\u5C06\u56DE\u590D\u5185\u5BB9\u4FDD\u5B58\u81F3: ${l}`.trim(),f=["--permission-mode",o?.permissionMode||"acceptEdits","--print",j];if(u)f.push("--settings",u);else if(m&&c){const $=(0,api_key_manager_1.ensureSettingsWithApiKey)(n,c);f.push("--settings",$)}else if(!r){const $=path_1.default.join(n,".claude","settings.json");fs_1.default.existsSync($)&&(f.push("--settings",$),console.log(`[${(0,session_1.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${$}`))}d&&f.push("--agent",d),(0,session_1.debugLog)(t,`\u6267\u884C\u547D\u4EE4: claude ${f.join(" ")}`);const v=20,x=1e4,O=1e4,C=300*1e3,P=60*1e3,N="claude",U=$=>{const k=Date.now();return new Promise(y=>{const _=[];let A=!1,M=Date.now();const D=(0,child_process_1.spawn)(N,$,{cwd:n,stdio:["ignore","pipe","pipe"]}),F=setInterval(()=>{if(A){clearInterval(F);return}Date.now()-M>=C&&(console.warn(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1 Watchdog: ${C/1e3}s \u65E0\u65E5\u5FD7\u8F93\u51FA\uFF0C\u901A\u77E5\u7528\u6237`),clearInterval(F),(0,messaging_1.sendDingMessage)(t,{conversationId:e.conversationId,sessionWebhook:e.sessionWebhook,atUserId:e.senderStaffId,content:`\u23F0 \u4EFB\u52A1\u8D85\u8FC7 ${C/1e3}s \u65E0\u54CD\u5E94\uFF0C\u4ECD\u5728\u6267\u884C\u4E2D\uFF0C\u8BF7\u7A0D\u5019`}).catch(I=>console.error("\u53D1\u9001\u4EFB\u52A1 Watchdog \u901A\u77E5\u5931\u8D25:",I)))},P),b=()=>{M=Date.now()};D.stdout.on("data",S=>{const I=S.toString();process.stdout.write(I),_.push(I),b()}),D.stderr.on("data",S=>{const I=S.toString();process.stderr.write(I),_.push(I),b()}),D.on("close",S=>{A=!0,clearInterval(F),y({exitCode:S??1,output:_.join(""),elapsed:Date.now()-k})}),D.on("error",S=>{console.error("\u8FDB\u7A0B\u6267\u884C\u9519\u8BEF:",S),_.push(`\u8FDB\u7A0B\u6267\u884C\u9519\u8BEF: ${S.message}`)})})};let h,w,T=0;for(;;){const $=await U(f);if(h=$.exitCode,w=$.output,h!==0){if((0,api_key_manager_1.isQuotaExhaustedError)(w)&&r){if(m){if(c){const y=(0,api_key_manager_1.rotateApiKey)(t,c.apiKey);if(y){c=y,T=0;const _=(0,api_key_manager_1.ensureSettingsWithApiKey)(n,c);updateCmdArgsSettings(f,_),console.log(`[${(0,session_1.timestamp)()}] API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(y)}`);continue}}}else if(c=(0,api_key_manager_1.pickValidApiKey)(t),c){m=!0,T=0;const y=(0,api_key_manager_1.ensureSettingsWithApiKey)(n,c);updateCmdArgsSettings(f,y),console.log(`[${(0,session_1.timestamp)()}] \u5207\u6362\u5230 API Key \u6A21\u5F0F`);continue}console.log(`[${(0,session_1.timestamp)()}] \u65E0\u53EF\u7528\u914D\u989D\uFF0C\u4EFB\u52A1\u91CD\u7F6E\u4E3A\u5F85\u529E`);const k=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${N} ${f.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,w].join(`
|
|
20
|
+
`);return fs_1.default.writeFileSync(s,k),await resetTaskToTodo(t,a,"\u65E0\u53EF\u7528\u914D\u989D(429)"),!1}if((0,api_key_manager_1.isAuthenticationError)(w)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u6807\u8BB0\u4EFB\u52A1\u5931\u8D25`);const k=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${N} ${f.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,w].join(`
|
|
21
|
+
`);return fs_1.default.writeFileSync(s,k),await failTask(t,a,"\u8BA4\u8BC1\u5931\u8D25(401)\uFF0CAPI Key \u65E0\u6548\u6216\u670D\u52A1\u672A\u6388\u6743"),!0}if((0,claude_process_1.isRetryableApiError)(w)){if($.elapsed<O&&m&&c&&r){if(T++,T>=v){const k=(0,api_key_manager_1.rotateApiKey)(t,c.apiKey);if(k){c=k,T=0;const y=(0,api_key_manager_1.ensureSettingsWithApiKey)(n,c);updateCmdArgsSettings(f,y),console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25 ${v} \u6B21\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(k)}`),await utils_ok_1.asyncUtil.sleep(x);continue}}}else if($.elapsed<O){if(T++,T>=v){console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${v}\u6B21\uFF0C\u91CD\u7F6E\u4EFB\u52A1\u4E3A\u5F85\u529E`);const k=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${N} ${f.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,w].join(`
|
|
22
|
+
`);return fs_1.default.writeFileSync(s,k),await resetTaskToTodo(t,a,"TPM\u9650\u6D41\u5FEB\u901F\u5931\u8D25\u6B21\u6570\u8FC7\u591A"),!1}console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${x/1e3}s \u540E\u91CD\u8BD5 (${T}/${v})`)}else T=0,console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u8FDB\u7A0B\u5DF2\u8FD0\u884C\u4E00\u6BB5\u65F6\u95F4)\uFF0C\u91CD\u7F6E\u5FEB\u901F\u5931\u8D25\u8BA1\u6570\uFF0C${x/1e3}s \u540E\u91CD\u8BD5`);await utils_ok_1.asyncUtil.sleep(x);continue}}break}const W=[`[${(0,session_1.timestamp)()}] \u6267\u884C\u547D\u4EE4: ${N} ${f.join(" ")}`,`[${(0,session_1.timestamp)()}] \u9000\u51FA\u7801: ${h}`,w].join(`
|
|
23
|
+
`);if(fs_1.default.writeFileSync(s,W),h!==0)return console.error(`\u547D\u4EE4\u6267\u884C\u5931\u8D25, \u9000\u51FA\u7801: ${h}`),await failTask(t,a,`\u6267\u884C\u5931\u8D25(\u9000\u51FA\u7801: ${h})`),!0;if(fs_1.default.existsSync(l))console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u5904\u7406\u5B8C\u6210`);else return console.error("\u4EFB\u52A1\u672A\u6309\u9884\u671F\u5904\u7406"),await failTask(t,a,"\u672A\u751F\u6210\u7ED3\u679C\u6587\u4EF6"),!0;return await finishTask(t,a),!0}async function runTaskHandlerLoop(t){for(;;)await handleTask(t).catch(o=>(console.error(o),!1))||await waitForTaskSignal(IDLE_SWEEP_INTERVAL_MS)}async function saveTask(t,e){const{conversationId:o,prompt:n,senderStaffId:a,senderNickName:l,sessionWebhook:s,type:i="normal"}=e,r=Date.now(),u=utils_ok_1.dateUtil.mm(r).format("YYYY-MM-DD-HH-mm-ss"),m=`${(0,session_1.getTasksDir)(t,o)}/${u}`,c=`${m}/task.json`,g={conversationId:o,startTime:r,startTimeStr:u,prompt:n,senderStaffId:a,senderNickName:l||"",sessionWebhook:s,type:i};await utils_ok_1.fileUtil.saveFileStr(JSON.stringify(g,null,2),c),(0,session_1.debugLog)(t,`\u4EFB\u52A1\u5DF2\u4FDD\u5B58: ${c}`),notifyTaskQueue(),preprocessTask(t,o,n).then(d=>{if(d)try{const p=`${m}/task-doing.json`,j=fs_1.default.existsSync(p)?p:fs_1.default.existsSync(c)?c:null;if(!j){console.log(`[${(0,session_1.timestamp)()}] \u9884\u5904\u7406\u5B8C\u6210\u4F46\u4EFB\u52A1\u6587\u4EF6\u5DF2\u4E0D\u5B58\u5728: ${m}`);return}const f=utils_ok_1.fileUtil.getJSON(j);f.title=d.title,f.promptSimply=d.promptSimply,fs_1.default.writeFileSync(j,JSON.stringify(f,null,2),"utf-8"),console.log(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u7ED3\u679C\u5DF2\u66F4\u65B0: ${d.title}`)}catch(p){console.error(`[${(0,session_1.timestamp)()}] \u66F4\u65B0\u4EFB\u52A1\u9884\u5904\u7406\u7ED3\u679C\u5931\u8D25:`,p)}}).catch(d=>{console.error(`[${(0,session_1.timestamp)()}] \u4EFB\u52A1\u9884\u5904\u7406\u5F02\u5E38:`,d)})}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cc-ding",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "本地Claude对接钉钉机器人工具套件",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -9,24 +9,25 @@
|
|
|
9
9
|
],
|
|
10
10
|
"main": "dist/index",
|
|
11
11
|
"dependencies": {
|
|
12
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.173",
|
|
12
13
|
"commander": "^7.2.0",
|
|
13
14
|
"dotenv": "^16.6.1",
|
|
14
15
|
"shelljs": "^0.10.0",
|
|
15
16
|
"urllib": "^4.9.0",
|
|
16
|
-
"utils-ok": "^
|
|
17
|
+
"utils-ok": "^2.0.0"
|
|
17
18
|
},
|
|
18
19
|
"devDependencies": {
|
|
19
20
|
"@types/chai": "^5.2.3",
|
|
20
21
|
"@types/mocha": "^9.1.1",
|
|
21
|
-
"@types/node": "^
|
|
22
|
+
"@types/node": "^24.0.0",
|
|
22
23
|
"@types/shelljs": "^0.10.0",
|
|
23
24
|
"blacklint": "^1.0.0",
|
|
24
25
|
"chai": "^6.2.2",
|
|
26
|
+
"esbuild": "^0.28.0",
|
|
25
27
|
"eslint": "^9.39.4",
|
|
26
28
|
"eslint-config-egg": "^14.1.0",
|
|
27
29
|
"globals": "^17.6.0",
|
|
28
30
|
"husky": "^8.0.3",
|
|
29
|
-
"esbuild": "^0.28.0",
|
|
30
31
|
"mocha": "^8.4.0",
|
|
31
32
|
"ts-node": "^10.9.2",
|
|
32
33
|
"typescript": "^5.9.3"
|
|
@@ -42,19 +43,14 @@
|
|
|
42
43
|
"scripts": {
|
|
43
44
|
"lint": "eslint . && tsc && npm run blacklint",
|
|
44
45
|
"lint:fix": "eslint . --fix",
|
|
45
|
-
"blacklint": "utils-ok blacklint
|
|
46
|
+
"blacklint": "utils-ok blacklint --blacklintDir 'src bin'",
|
|
46
47
|
"test": "mocha 'test/**/*.test.ts'",
|
|
47
|
-
"build": "npm run lint && sh build.sh",
|
|
48
|
+
"build": "npm run lint && npm run test && sh build.sh",
|
|
48
49
|
"prepublishOnly": "npm run build"
|
|
49
50
|
},
|
|
50
51
|
"files": [
|
|
51
52
|
"dist",
|
|
52
53
|
"resource"
|
|
53
54
|
],
|
|
54
|
-
"husky": {
|
|
55
|
-
"hooks": {
|
|
56
|
-
"pre-commit": "npm run lint"
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
55
|
"repository": "https://github.com/yihuineng/cc-ding.git"
|
|
60
56
|
}
|