cc-ding 0.3.0-beta.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/cc-ding.js +3 -3
- package/dist/src/biz/cc-ding-cli.js +59 -54
- package/dist/src/biz/claude-process.js +33 -33
- package/dist/src/biz/commands.js +6 -6
- package/dist/src/biz/messaging.js +1 -1
- package/dist/src/biz/notify.js +1 -1
- package/dist/src/biz/session.js +13 -13
- package/dist/src/biz/task.js +14 -15
- package/dist/src/biz/todo.js +4 -4
- package/package.json +3 -3
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
"use strict";var __importDefault=this&&this.__importDefault||function(
|
|
2
|
-
`).filter(Boolean).slice(-
|
|
3
|
-
`)}catch{return""}}function isContextWindowExceededError(
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveClaudeSettingsPath=resolveClaudeSettingsPath,exports.isRetryableApiError=isRetryableApiError,exports.parseClaudeStreamLine=parseClaudeStreamLine,exports.interruptClaudeProcess=interruptClaudeProcess,exports.injectStartupContexts=injectStartupContexts,exports.injectSessionContextIfChanged=injectSessionContextIfChanged,exports.executeClaudeQuery=executeClaudeQuery;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),readline_1=__importDefault(require("readline")),child_process_1=require("child_process"),messaging_1=require("./messaging"),session_1=require("./session"),api_key_manager_1=require("./api-key-manager"),MAX_FAST_FAIL=20,API_RETRY_DELAY_MS=1e4,FAST_FAIL_THRESHOLD_MS=1e4,MAX_TOTAL_RETRIES=10,MAX_RETRY_DURATION_MS=300*1e3,WATCHDOG_TIMEOUT_MS=300*1e3,WATCHDOG_CHECK_INTERVAL_MS=30*1e3,injectedContextCache=new Map;function resolveClaudeSettingsPath(t,e,n){const i=(0,api_key_manager_1.getForceEnabledSettingsPath)(e);if(i)return i;if(t.config.apiKeyCfg){const a=(0,api_key_manager_1.readApiKeyFromSettings)(e);let $=null;if(a&&($=t.config.apiKeyCfg.claudeSettings.find(c=>c.apiKey===a&&c.isValid)||null),$||($=(0,api_key_manager_1.pickValidApiKey)(t)),$)return(0,api_key_manager_1.ensureSettingsWithApiKey)(e,$)}if(t.config.apiKeyCfg)return;if(n)return n;const m=path_1.default.join(e,".claude","settings.json");if(fs_1.default.existsSync(m))return console.log(`[${(0,session_1.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${m}`),m}function isRetryableApiError(t){if(/\b429\b/.test(t)&&!(0,api_key_manager_1.isQuotaExhaustedError)(t)||/API\s*Error.*422/i.test(t)||/\b422\b.*(?:TPM|额度超限|rate\s*limit|tokens?\s*per\s*minute)/i.test(t)||/(?:TPM|额度超限).*\b422\b/i.test(t))return!0;const e=t.toLowerCase();return["rate limit","rate_limit","ratelimit","too many requests","tokens per minute","requests per minute","rpm limit","overloaded","capacity","temporarily unavailable"].some(i=>e.includes(i))}function sleep(t){return new Promise(e=>setTimeout(e,t))}class RetryableApiError extends Error{constructor(e,n=""){super(`Retryable API error (TPM limit etc.)${e?" [fast fail]":""}`),this.name="RetryableApiError",this.isFastFail=e,this.output=n}}class ConversationNotFoundError extends Error{constructor(){super("Claude conversation not found"),this.name="ConversationNotFoundError"}}class ContextWindowExceededError extends Error{constructor(){super("Context window exceeded: prompt tokens exceed maximum context window"),this.name="ContextWindowExceededError"}}function readLastLogLines(t,e){try{return fs_1.default.readFileSync(t,"utf-8").split(`
|
|
2
|
+
`).filter(Boolean).slice(-e).join(`
|
|
3
|
+
`)}catch{return""}}function isContextWindowExceededError(t){return/prompt tokens?\s*\(\s*\d+\s*\)\s*exceeds/i.test(t)||/exceeds?.*maximum context window/i.test(t)}function isPermissionError(t){const e=t.toLowerCase();return["permission denied","permission_required","needs permission","requires permission","authorization required","authorize","not authorized","access denied","\u9700\u8981\u6388\u6743","\u6743\u9650\u4E0D\u8DB3","\u6CA1\u6709\u6743\u9650"].some(i=>e.includes(i))}function isConversationNotFoundError(t){return/no conversation found with session id/i.test(t)}function parseClaudeStreamLine(t,e=!1){if(!t.trim())return null;try{const n=JSON.parse(t);if(n.type==="system"&&n.subtype==="init"&&n.session_id)return{type:"system",sessionId:n.session_id};if(n.type==="assistant"){const i=n.message?.content;if(Array.isArray(i)){const m=[];for(const a of i)a.type==="text"&&a.text?m.push(a.text):a.type==="thinking"&&a.thinking&&e&&m.push(`\u{1F4AD} **\u601D\u8003\u8FC7\u7A0B**
|
|
4
4
|
\`\`\`
|
|
5
|
-
${
|
|
6
|
-
\`\`\``);if(
|
|
7
|
-
`)}}else if(
|
|
8
|
-
`,"utf-8"),
|
|
9
|
-
`),
|
|
10
|
-
`,"utf-8")}catch{}
|
|
11
|
-
`,
|
|
12
|
-
`,"utf-8")}catch{}const
|
|
13
|
-
`).trim()
|
|
14
|
-
`,"utf-8")}catch{}const
|
|
15
|
-
`).trim();if(
|
|
16
|
-
`,"utf-8")}catch{}const
|
|
17
|
-
`+
|
|
18
|
-
`,"utf-8")}catch{}
|
|
19
|
-
`,"utf-8"),
|
|
5
|
+
${a.thinking}
|
|
6
|
+
\`\`\``);if(m.length>0)return{type:"assistant",content:m.join(`
|
|
7
|
+
`)}}else if(n.content)return{type:"assistant",content:typeof n.content=="string"?n.content:JSON.stringify(n.content)};return{type:"assistant"}}if(n.type==="result"){const i=n.result||"";return{type:"result",content:typeof i=="string"?i:JSON.stringify(i)}}return{type:n.type||"unknown"}}catch{return{type:"text",content:t}}}function interruptClaudeProcess(t,e){return t.currentProcess?(console.log(`[${(0,session_1.timestamp)()}] ${e}`),t.interrupted=!0,t.currentProcess.kill("SIGINT"),!0):!1}function runClaudeOnce(t,e,n,i,m,a,$){let c=t.getSessionDir(e),u=`${c}/session.log`;fs_1.default.existsSync(c)||fs_1.default.mkdirSync(c,{recursive:!0});const y=Date.now();return new Promise((I,f)=>{const T=(0,child_process_1.spawn)(i,n,{cwd:m,stdio:["pipe","pipe","pipe"]}),E=t.activeSessions.get(e.conversationId);E&&(E.currentProcess=T,E.lastActivityTime=Date.now()),fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u542F\u52A8${$?" (\u91CD\u8BD5)":""}
|
|
8
|
+
`,"utf-8"),T.stdin?.write(`${a}
|
|
9
|
+
`),T.stdin?.end();let b=!$&&!!e.claudeSessionId,C=[],P="",x="",k=!1,h=!1,g=null;const v=new Set,A=()=>{E&&(E.lastActivityTime=Date.now())};g=setInterval(()=>{if(h){g&&clearInterval(g);return}const r=E?.lastActivityTime??y;if(Date.now()-r>=WATCHDOG_TIMEOUT_MS){console.warn(`[${(0,session_1.timestamp)()}] Watchdog: Claude \u8FDB\u7A0B ${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u901A\u77E5\u7528\u6237`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: Watchdog \u8D85\u65F6\uFF0C${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u5DF2\u901A\u77E5\u7528\u6237
|
|
10
|
+
`,"utf-8")}catch{}g&&clearInterval(g),g=null;const d=E?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:d,content:`\u23F0 Claude \u8FDB\u7A0B\u8D85\u8FC7 ${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u54CD\u5E94\uFF0C\u53EF\u53D1\u9001 /goon \u5F3A\u5236\u91CD\u542F\u6062\u590D\uFF0C\u6216 /end \u7ED3\u675F\u4F1A\u8BDD`}).catch(l=>console.error("\u53D1\u9001 Watchdog \u901A\u77E5\u5931\u8D25:",l))}},WATCHDOG_CHECK_INTERVAL_MS),readline_1.default.createInterface({input:T.stdout}).on("line",r=>{if(x+=r+`
|
|
11
|
+
`,A(),t.debugLog(`Claude stdout: ${r.substring(0,200)}${r.length>200?"...":""}`),t.config.debug)try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [RAW]: ${r}
|
|
12
|
+
`,"utf-8")}catch{}const o=parseClaudeStreamLine(r,t.config.includeThinking??!1);if(o){if(o.type==="system"&&o.sessionId&&!b&&(t.updateSessionFile(e,{claudeSessionId:o.sessionId}),b=!0,c=t.getSessionDir(e),u=`${c}/session.log`),o.type==="assistant"){try{const l=JSON.parse(r)?.message?.content;if(Array.isArray(l)){for(const s of l)if(s.type==="tool_use"&&s.id&&!v.has(s.id)){v.add(s.id);const S=s.name||"unknown";let p="";s.input&&(s.input.command?p=s.input.command.substring(0,200):s.input.file_path?p=s.input.file_path:s.input.pattern?p=s.input.pattern:s.input.query?p=s.input.query:s.input.description?p=s.input.description:s.input.prompt?p=s.input.prompt.substring(0,200):p=JSON.stringify(s.input).substring(0,200)),t.appendSessionLog(c,"tool",`${S}${p?": "+p:""}`)}}}catch{}o.content&&C.push(o.content)}if(o.type==="result"){const d=t.config.resultOnly??!0,l=(o.content||"").trim(),s=C.join(`
|
|
13
|
+
`).trim(),S=d&&l||s;if(S&&!E?.interrupted){try{t.appendSessionLog(c,"assistant",S)}catch{}const w=t.activeSessions.get(e.conversationId)?.lastSenderStaffId||e.startStaffId;k=!0,(0,messaging_1.sendClaudeResponseToDing)(t,(0,session_1.getReplyConversationId)(e),(0,session_1.getReplyWebhook)(e),w,S).catch(R=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",R))}else console.warn(`[${(0,session_1.timestamp)()}] Claude \u8FD4\u56DE\u4E86\u7A7A\u7684 result \u4E14 responseBuffer \u4E5F\u4E3A\u7A7A\uFF0C\u65E0\u5185\u5BB9\u53EF\u53D1\u9001`);C=[]}}}),T.stderr?.on("data",r=>{const o=r.toString();if(P+=o,A(),(0,api_key_manager_1.isQuotaExhaustedError)(o)){console.log(`[${(0,session_1.timestamp)()}] [Claude stderr] \u914D\u989D\u8017\u5C3D\u9519\u8BEF(429): ${o.trim()}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [WARN]: ${o}`,"utf-8")}catch{}}else if(isRetryableApiError(o)){console.log(`[${(0,session_1.timestamp)()}] [Claude stderr] \u53EF\u91CD\u8BD5API\u9519\u8BEF(422 TPM\u9650\u6D41): ${o.trim()}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [WARN]: ${o}`,"utf-8")}catch{}}else{console.error(`[Claude stderr]: ${o}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [ERROR]: ${o}`,"utf-8")}catch{}}}),T.on("close",r=>{h=!0,g&&(clearInterval(g),g=null),console.log(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${r}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u7ED3\u675F\uFF0C\u9000\u51FA\u7801: ${r}
|
|
14
|
+
`,"utf-8")}catch{}const o=t.activeSessions.get(e.conversationId);if(o&&(o.currentProcess=void 0),o?.interrupted){console.log(`[${(0,session_1.timestamp)()}] \u7528\u6237\u4E3B\u52A8\u4E2D\u65AD\uFF0C\u4E22\u5F03 responseBuffer (${C.length} \u6BB5)`),o.interrupted=!1,C=[],I(0);return}if(C.length>0){const l=C.join(`
|
|
15
|
+
`).trim();if(l){try{t.appendSessionLog(c,"assistant",l)}catch{}const s=o?.lastSenderStaffId||e.startStaffId;k=!0,(0,messaging_1.sendClaudeResponseToDing)(t,(0,session_1.getReplyConversationId)(e),(0,session_1.getReplyWebhook)(e),s,l).catch(S=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",S))}}if(r===0&&!k&&!o?.interrupted){console.warn(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [WARN]: Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9
|
|
16
|
+
`,"utf-8")}catch{}const l=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:l,content:"\u26A0\uFE0F Claude \u5904\u7406\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u4EFB\u4F55\u5185\u5BB9\uFF0C\u8BF7\u91CD\u8BD5\u6216\u6362\u79CD\u65B9\u5F0F\u63D0\u95EE"}).catch(s=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",s))}if(r===0){I(0);return}const d=P+`
|
|
17
|
+
`+x;if((0,api_key_manager_1.isQuotaExhaustedError)(d)){const s=Date.now()-y<FAST_FAIL_THRESHOLD_MS;console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u914D\u989D\u8017\u5C3D\u9519\u8BEF(429)\uFF0Cstdout\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(x)}, stderr\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(P)}`),f(new RetryableApiError(s,d));return}if((0,api_key_manager_1.isAuthenticationError)(d)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u901A\u77E5\u7528\u6237`);const l=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:l,content:"\u26A0\uFE0F \u8BA4\u8BC1\u5931\u8D25(401)\uFF0CAPI Key \u65E0\u6548\u6216\u670D\u52A1\u672A\u6388\u6743\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E"}).catch(s=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",s)),I(r??1);return}if(isRetryableApiError(d)){const s=Date.now()-y<FAST_FAIL_THRESHOLD_MS;f(new RetryableApiError(s,d));return}if(isPermissionError(d)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u9700\u8981\u6388\u6743\uFF0C\u901A\u77E5\u7528\u6237`);const l=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:l,content:"\u26A0\uFE0F Claude \u9700\u8981\u6388\u6743\uFF0C\u8BF7\u4EBA\u5DE5\u4ECB\u5165"}).catch(s=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",s)),I(r??1);return}if(e.claudeSessionId&&isConversationNotFoundError(d)){console.log(`[${(0,session_1.timestamp)()}] Claude \u4F1A\u8BDD\u5DF2\u5931\u6548: ${e.claudeSessionId}\uFF0C\u901A\u77E5\u5916\u5C42\u91CD\u65B0\u53D1\u8D77\u65B0\u4F1A\u8BDD`),f(new ConversationNotFoundError);return}if(isContextWindowExceededError(d)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\u9519\u8BEF(400)\uFF0C\u5C06\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u5C06\u81EA\u52A8 /compact
|
|
18
|
+
`,"utf-8")}catch{}f(new ContextWindowExceededError);return}f(new Error(`Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${r}`))}),T.on("error",r=>{h=!0,g&&(clearInterval(g),g=null),console.error("Claude \u8FDB\u7A0B\u9519\u8BEF:",r),fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [ERROR]: \u8FDB\u7A0B\u9519\u8BEF: ${r.message}
|
|
19
|
+
`,"utf-8"),f(r)})})}const START_MARK="<!-- cc-ding:session-context-start (DO NOT EDIT) -->",END_MARK="<!-- cc-ding:session-context-end (DO NOT EDIT) -->";function buildContextContent(t,e){const n=t.getConversationConfig(e),i=t.config;return[START_MARK,"# cc-ding Session Context","","## Client",`- clientId: \`${t.clientId}\``,i.clientName?`- clientName: ${i.clientName}`:"",`- owner: ${i.owner}`,"","## Conversation",`- conversationId: \`${e}\``,n?.conversationType?`- conversationType: ${n.conversationType==="1"?"\u5355\u804A":"\u7FA4\u804A"}`:"",n?.conversationTitle?`- conversationTitle: ${n.conversationTitle}`:"",n?.linkConversationId?`- linkConversationId: \`${n.linkConversationId}\` (\u5173\u8054\u7FA4\uFF0C\u5171\u4EAB\u5DE5\u4F5C\u76EE\u5F55)`:"","","## Settings",n?.permissionMode?`- permissionMode: ${n.permissionMode}`:"",n?.agent?`- agent: ${n.agent}`:"",n?.taskCfg?.skill?`- taskCfg.skill: ${n.taskCfg.skill}`:"",i.resultOnly!==void 0?`- resultOnly: ${i.resultOnly}`:"",i.includeThinking!==void 0?`- includeThinking: ${i.includeThinking}`:"",i.preBash?`- preBash(\u5168\u5C40): \`${i.preBash}\``:"",n?.preBash?`- preBash(\u7FA4): \`${n.preBash}\``:"","","## DingTalk Context",'\u5F53 prompt \u4E2D\u5305\u542B "\u6D88\u606F\u6765\u81EA: xxx(\u7528\u6237ID)" \u65F6\uFF0C\u8BF4\u660E\u6D88\u606F\u6765\u81EA\u9489\u9489\u7528\u6237\u3002',"- \u56DE\u7B54\u65F6\u8981\u8003\u8651\u7528\u6237\u7684\u4F7F\u7528\u573A\u666F\uFF08\u9489\u9489\u804A\u5929\u754C\u9762\uFF0C\u975E\u7EC8\u7AEF\u73AF\u5883\uFF09","- \u7528\u6237\u4E00\u822C\u60C5\u51B5\u4E0B\u53EA\u80FD\u901A\u8FC7 cc-ding \u8FDB\u884C\u64CD\u4F5C","- cc-ding \u6587\u6863: https://github.com/yihuineng/cc-ding",END_MARK].filter(Boolean).join(`
|
|
20
20
|
`)+`
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
`,"utf-8");const
|
|
21
|
+
`}function writeContextToFile(t,e,n){const i=t.getConversationDir(e),m=path_1.default.join(i,".claude");fs_1.default.existsSync(m)||fs_1.default.mkdirSync(m,{recursive:!0});const a=path_1.default.join(m,"CLAUDE.md");if(!fs_1.default.existsSync(a)){fs_1.default.writeFileSync(a,n,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u6CE8\u5165 CLAUDE.md: ${a}`);return}const $=fs_1.default.readFileSync(a,"utf-8"),c=$.indexOf(START_MARK),u=$.indexOf(END_MARK);if(c!==-1&&u!==-1&&u>c){const y=$.substring(0,c),I=$.substring(u+END_MARK.length),f=y+n+I;fs_1.default.writeFileSync(a,f,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u66F4\u65B0: ${a}`)}else fs_1.default.writeFileSync(a,n+`
|
|
22
|
+
`+$,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u8FFD\u52A0\u5230\u73B0\u6709 CLAUDE.md: ${a}`)}function injectStartupContexts(t){const e=Array.isArray(t.config.conversations)?t.config.conversations:[];for(const n of e){const i=buildContextContent(t,n.conversationId);injectedContextCache.set(n.conversationId,i),writeContextToFile(t,n.conversationId,i)}}function injectSessionContextIfChanged(t,e){const n=e.conversationId,i=buildContextContent(t,n);injectedContextCache.get(n)!==i&&(injectedContextCache.set(n,i),writeContextToFile(t,n,i))}async function executeClaudeQuery(t,e,n,i){const{skill:m,agent:a,senderNick:$,senderStaffId:c}=i||{};let u=t.getSessionDir(e),y=`${u}/session.log`;const I=t.getConversationDir(e.conversationId);injectSessionContextIfChanged(t,e),fs_1.default.mkdirSync(u,{recursive:!0});let f=null;const T=(0,api_key_manager_1.readApiKeyFromSettings)(I);if(T&&t.config.apiKeyCfg&&(f=t.config.apiKeyCfg.claudeSettings.find(o=>o.apiKey===T&&o.isValid)||null,f&&console.log(`[${(0,session_1.timestamp)()}] \u4ECE settings-ding.json \u6062\u590D Claude Setting: ${(0,api_key_manager_1.settingLabel)(f)}`)),!(0,api_key_manager_1.getForceEnabledSettingsPath)(I)&&t.config.apiKeyCfg&&(f=(0,api_key_manager_1.pickValidApiKey)(t),!f)){const o=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:o,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D\uFF08\u65E0\u53EF\u7528 API Key\uFF09\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}const b=$&&c?`${n} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${$}(${c})`:n;t.appendSessionLog(u,"user",b);const C="claude",x=["--permission-mode",i?.permissionMode??"bypassPermissions","--print","--output-format","stream-json","--verbose"];a&&x.push("--agent",a);const k=m?`/${m} ${b}`:b;let h=0,g=0,v=0;const A=[],D=t.activeSessions.get(e.conversationId),r=o=>{const d=t.activeSessions.get(e.conversationId);return!d||d!==D?(console.log(`[${(0,session_1.timestamp)()}] \u4F1A\u8BDD\u5DF2\u88AB\u7EC8\u6B62\uFF0C${o}`),!1):d.goonPending?(console.log(`[${(0,session_1.timestamp)()}] \u6536\u5230 /goon \u8BF7\u6C42\uFF0C${o}`),!1):!0};for(;;){if(!r("\u505C\u6B62\u91CD\u8BD5"))return;const o=h>0;if(g>=MAX_TOTAL_RETRIES||g>=3&&v>0&&Date.now()-v>MAX_RETRY_DURATION_MS){const S=g>=MAX_TOTAL_RETRIES?`\u603B\u91CD\u8BD5\u6B21\u6570\u5DF2\u8FBE ${MAX_TOTAL_RETRIES} \u6B21`:`\u91CD\u8BD5\u6301\u7EED\u65F6\u95F4\u8D85\u8FC7 ${MAX_RETRY_DURATION_MS/1e3}s\uFF08\u5DF2\u91CD\u8BD5 ${g} \u6B21\uFF09`;console.error(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF: ${S}`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF\uFF0C${S}\uFF0C\u7EC8\u6B62\u91CD\u8BD5
|
|
23
|
+
`,"utf-8");const p=readLastLogLines(y,1),w=A.slice(-1)[0]||"",R=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:R,content:`\u{1F504} \u68C0\u6D4B\u5230 Claude \u9677\u5165\u65E0\u9650\u91CD\u8BD5\uFF0C\u5DF2\u7EC8\u6B62\uFF08${S}\uFF09
|
|
24
24
|
|
|
25
25
|
\u{1F4CB} \u6700\u8FD1\u91CD\u8BD5\u8BB0\u5F55\uFF1A
|
|
26
|
-
${
|
|
26
|
+
${w}
|
|
27
27
|
|
|
28
28
|
\u{1F4DD} \u6700\u8FD1\u65E5\u5FD7\uFF1A
|
|
29
29
|
\`\`\`
|
|
30
|
-
${
|
|
30
|
+
${p}
|
|
31
31
|
\`\`\`
|
|
32
32
|
|
|
33
|
-
\u{1F4A1} \u53EF\u5C1D\u8BD5\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD\uFF0C\u6216 /end \u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD`});return}const
|
|
34
|
-
`,"utf-8")):
|
|
35
|
-
`,"utf-8");continue}}const
|
|
36
|
-
`,"utf-8");continue}}throw console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03`),fs_1.default.appendFileSync(
|
|
37
|
-
`,"utf-8"),new Error(`TPM \u9650\u6D41\uFF0C\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED ${MAX_FAST_FAIL} \u6B21`)}console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5 (${h}/${MAX_FAST_FAIL})`)}else h=0,console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u8FDB\u7A0B\u5DF2\u8FD0\u884C\u4E00\u6BB5\u65F6\u95F4)\uFF0C\u91CD\u7F6E\u5FEB\u901F\u5931\u8D25\u8BA1\u6570\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`);if(fs_1.default.appendFileSync(
|
|
38
|
-
`,"utf-8"),
|
|
39
|
-
`,"utf-8"),
|
|
40
|
-
`,"utf-8");const
|
|
41
|
-
`,"utf-8")}catch(
|
|
42
|
-
`,"utf-8"),await(0,messaging_1.sendDingMessage)(
|
|
33
|
+
\u{1F4A1} \u53EF\u5C1D\u8BD5\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD\uFF0C\u6216 /end \u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD`});return}const d=[...x];e.claudeSessionId&&(d.push("--resume",e.claudeSessionId),o||console.log(`[${(0,session_1.timestamp)()}] \u6062\u590D Claude \u4F1A\u8BDD: ${e.claudeSessionId}`));const l=resolveClaudeSettingsPath(t,I,i?.settings);l&&d.push("--settings",l);let s;o?(s="\u7EE7\u7EED",console.log(`[${(0,session_1.timestamp)()}] \u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${h}/${MAX_FAST_FAIL}\u6B21)`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${h}/${MAX_FAST_FAIL})
|
|
34
|
+
`,"utf-8")):s=k,console.log(`[${(0,session_1.timestamp)()}] \u6267\u884C Claude \u67E5\u8BE2[\u539F\u751Fclaude \u6A21\u5F0F]: ${C} ${d.join(" ")}`),t.debugLog(`\u53D1\u9001\u6D88\u606F: ${s.substring(0,100)}...`);try{await runClaudeOnce(t,e,d,C,I,s,o);return}catch(S){if(u=t.getSessionDir(e),y=`${u}/session.log`,S instanceof RetryableApiError){if(g++,v=v||Date.now(),(0,api_key_manager_1.isQuotaExhaustedError)(S.output)&&t.config.apiKeyCfg){if(A.push(`[${(0,session_1.timestamp)()}] 429 \u914D\u989D\u8017\u5C3D\uFF0C\u5C1D\u8BD5\u8F6E\u6362 Key`),f){const w=(0,api_key_manager_1.rotateApiKey)(t,f.apiKey);if(w){f=w,h=0,console.log(`[${(0,session_1.timestamp)()}] API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(w)}`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key
|
|
35
|
+
`,"utf-8");continue}}const p=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:p,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D/API Key\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}if(S.isFastFail){if(h++,h>=MAX_FAST_FAIL){if(f&&t.config.apiKeyCfg){const p=(0,api_key_manager_1.rotateApiKey)(t,f.apiKey);if(p){f=p,h=0,console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25 ${MAX_FAST_FAIL} \u6B21\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(p)}`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25\uFF0C\u5207\u6362\u5230\u65B0 Key
|
|
36
|
+
`,"utf-8");continue}}throw console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03
|
|
37
|
+
`,"utf-8"),new Error(`TPM \u9650\u6D41\uFF0C\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED ${MAX_FAST_FAIL} \u6B21`)}console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5 (${h}/${MAX_FAST_FAIL})`)}else h=0,console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u8FDB\u7A0B\u5DF2\u8FD0\u884C\u4E00\u6BB5\u65F6\u95F4)\uFF0C\u91CD\u7F6E\u5FEB\u901F\u5931\u8D25\u8BA1\u6570\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`);if(fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5
|
|
38
|
+
`,"utf-8"),A.push(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`),await sleep(API_RETRY_DELAY_MS),!r("\u505C\u6B62\u5F53\u524D\u91CD\u8BD5"))return;continue}if(S instanceof ConversationNotFoundError){g++,v=v||Date.now(),A.push(`[${(0,session_1.timestamp)()}] \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD`),console.log(`[${(0,session_1.timestamp)()}] Claude \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664 claudeSessionId \u5E76\u91CD\u65B0\u53D1\u8D77`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u4F1A\u8BDD\u5DF2\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD\u5E76\u91CD\u65B0\u53D1\u8D77
|
|
39
|
+
`,"utf-8"),e.claudeSessionId&&(e.claudeSessionId=void 0,t.updateSessionFile(e,{})),h=0;continue}if(S instanceof ContextWindowExceededError){g++,v=v||Date.now(),A.push(`[${(0,session_1.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8 /compact`),console.log(`[${(0,session_1.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587
|
|
40
|
+
`,"utf-8");const p=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:p,content:"\u{1F4E6} \u4E0A\u4E0B\u6587\u8D85\u957F\uFF0C\u6B63\u5728\u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u540E\u7EE7\u7EED..."});const w=[...x];e.claudeSessionId&&w.push("--resume",e.claudeSessionId);const R=resolveClaudeSettingsPath(t,I,i?.settings);R&&w.push("--settings",R);try{await runClaudeOnce(t,e,w,C,I,"/compact",!1),console.log(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C
|
|
41
|
+
`,"utf-8")}catch(M){throw console.error(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u5931\u8D25:`,M),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u5931\u8D25: ${M instanceof Error?M.message:String(M)}
|
|
42
|
+
`,"utf-8"),await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:p,content:"\u274C \u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u53D1\u9001 /compact \u6216 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD"}),new Error(`\u4E0A\u4E0B\u6587\u8D85\u957F\u4E14 /compact \u5931\u8D25: ${M instanceof Error?M.message:String(M)}`)}h=0;continue}throw S}}}
|
package/dist/src/biz/commands.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
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.parseVersionCommand=parseVersionCommand,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,exports.parseInterruptCommand=parseInterruptCommand,exports.parseTodoCommand=parseTodoCommand,exports.parseMenuCommand=parseMenuCommand,exports.parseRebootCommand=parseRebootCommand,exports.parseRecorderCommandEnhanced=parseRecorderCommandEnhanced;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",usage:"/mq | /mq front | /mq rm <\u5E8F\u53F7> | /mq rm <1-3> | /mq -n <\u6570\u91CF> | /mq -all",examples:["/mq","/mq front","/mq rm 1","/mq rm 1-3","/mq rm 1 3 5","/mq -n 1","/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:"/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:"/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"] [--permissionMode mode]',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 --permissionMode auto","/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\u767D\u540D\u5355\u548C\u7BA1\u7406\u5458(add/del/rm/admin,\u9ED8\u8BA4list)",usage:"/auth [add|del|rm <\u624B\u673A\u53F7\u6216userId>] | /auth admin [add|rm <\u624B\u673A\u53F7\u6216userId>] | /auth [approve|reject <requestId>]",examples:["/auth","/auth add 13800138000","/auth rm 13800138000","/auth admin add 13800138000","/auth admin rm 13800138000","/auth admin","/auth approve r1234"],category:"\u7BA1\u7406",ownerOnly:!0},{name:"/recorder",aliases:["/r"],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","/r on","/r exit"],category:"\u7BA1\u7406",ownerOnly:!0},{name:"/todo",description:"\u5F85\u529E\u7BA1\u7406\uFF1A\u6DFB\u52A0/\u5B8C\u6210/\u5220\u9664/\u5217\u8868/\u63D0\u9192",usage:"/todo <\u5185\u5BB9> [@\u4EBA] [ddl \u622A\u6B62\u65F6\u95F4] | /todo done <\u5E8F\u53F7> | /todo rm <\u5E8F\u53F7|all> | /todo list | /todo remind <0-23>",examples:["/todo \u5B8C\u6210\u62A5\u544A ddl \u660E\u5929","/todo \u4FEE\u590Dbug @\u5F20\u4E09 ddl \u4E0B\u5468\u4E94","/todo done 1","/todo rm 2","/todo rm all","/todo list","/todo remind 9","/todo remind -1"],category:"\u4EFB\u52A1"},{name:"/menu",description:"\u5FEB\u6377\u6307\u4EE4\u83DC\u5355\uFF1A\u81EA\u5B9A\u4E49\u5E38\u7528\u6307\u4EE4\uFF0C\u56DE\u590D\u5E8F\u53F7\u6267\u884C",usage:"/menu add <\u6307\u4EE4> | /menu del <\u5E8F\u53F7> | /menu list | /menu trigger <\u8BCD> | /menu -g add/del/list",examples:["/menu add /help","/menu add /cron \u6BCF\u5929\u65E9\u4E0A9\u70B9\u67E5\u770Bdima","/menu del 1","/menu list","/menu trigger go","/menu -g add /info robot","/menu -g del 1"],category:"\u7CFB\u7EDF"},{name:"/!",description:"\u4E2D\u65AD\u5F53\u524D\u4EFB\u52A1\u5E76\u7ACB\u5373\u5904\u7406\u65B0\u6D88\u606F",usage:"/!",examples:["/!"],category:"\u4F1A\u8BDD"},{name:"/reboot",description:"\u91CD\u542F cc-ding \u5E94\u7528\uFF08\u9700 pm2 \u90E8\u7F72\uFF09",usage:"/reboot [--update [tag]]",examples:["/reboot","/reboot --update","/reboot --update beta"],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 n=e.trim().match(/^(\/\w+)\s+--help$/i);return n?n[1].toLowerCase():null}function getCommandByName(e){const t=e.toLowerCase();return COMMAND_REGISTRY.find(n=>n.name.toLowerCase()===t||n.aliases?.some(s=>s.toLowerCase()===t))}function formatHelpOverview(e,t){const n=COMMAND_REGISTRY.filter(r=>t||!r.ownerOnly),s=["### \u{1F917}","----",`- **\u7248\u672C:** ${e}`,"- **\u4F5C\u8005:** yihuineng","- **Github:** https://github.com/yihuineng/cc-ding","----"];for(const{category:r,icon:o}of CATEGORY_DISPLAY){const i=n.filter(a=>a.category===r);if(i.length!==0){s.push(`${o} **${r}**`);for(const a of i)s.push(`- \`${a.name}\` ${a.description}`);s.push("")}}return s.push("\u{1F4A1} \u8F93\u5165 `/{\u547D\u4EE4} --help` \u67E5\u770B\u547D\u4EE4\u8BE6\u7EC6\u7528\u6CD5"),s.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
|
|
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,
|
|
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
|
|
5
|
-
`)}function parseLogCommand(e){const
|
|
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(
|
|
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.parseVersionCommand=parseVersionCommand,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,exports.parseInterruptCommand=parseInterruptCommand,exports.parseTodoCommand=parseTodoCommand,exports.parseMenuCommand=parseMenuCommand,exports.parseRebootCommand=parseRebootCommand,exports.parseRecorderCommandEnhanced=parseRecorderCommandEnhanced;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",usage:"/mq | /mq front | /mq rm <\u5E8F\u53F7> | /mq rm <1-3> | /mq -n <\u6570\u91CF> | /mq -all",examples:["/mq","/mq front","/mq rm 1","/mq rm 1-3","/mq rm 1 3 5","/mq -n 1","/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:"/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:"/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"] [--permissionMode mode]',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 --permissionMode auto","/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\u767D\u540D\u5355\u548C\u7BA1\u7406\u5458(add/del/rm/admin,\u9ED8\u8BA4list)",usage:"/auth [add|del|rm <\u624B\u673A\u53F7\u6216userId>] | /auth admin [add|rm <\u624B\u673A\u53F7\u6216userId>] | /auth [approve|reject <requestId>]",examples:["/auth","/auth add 13800138000","/auth rm 13800138000","/auth admin add 13800138000","/auth admin rm 13800138000","/auth admin","/auth approve r1234"],category:"\u7BA1\u7406",ownerOnly:!0},{name:"/recorder",aliases:["/r"],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","/r on","/r exit"],category:"\u7BA1\u7406",ownerOnly:!0},{name:"/todo",description:"\u5F85\u529E\u7BA1\u7406\uFF1A\u6DFB\u52A0/\u5B8C\u6210/\u5220\u9664/\u5217\u8868/\u63D0\u9192/\u6A21\u5F0F\u5207\u6362",usage:"/todo <\u5185\u5BB9> [@\u4EBA] [ddl \u622A\u6B62\u65F6\u95F4] | /todo done <\u5E8F\u53F7> | /todo rm <\u5E8F\u53F7|all> | /todo list | /todo remind <0-23> | /todo mode <staffId|dingtalkId>",examples:["/todo \u5B8C\u6210\u62A5\u544A ddl \u660E\u5929","/todo \u4FEE\u590Dbug @\u5F20\u4E09 ddl \u4E0B\u5468\u4E94","/todo done 1","/todo rm 2","/todo rm all","/todo list","/todo remind 9","/todo remind -1","/todo mode dingtalkId"],category:"\u4EFB\u52A1"},{name:"/menu",description:"\u5FEB\u6377\u6307\u4EE4\u83DC\u5355\uFF1A\u81EA\u5B9A\u4E49\u5E38\u7528\u6307\u4EE4\uFF0C\u56DE\u590D\u5E8F\u53F7\u6267\u884C",usage:"/menu add <\u6307\u4EE4> | /menu del <\u5E8F\u53F7> | /menu list | /menu trigger <\u8BCD> | /menu -g add/del/list",examples:["/menu add /help","/menu add /cron \u6BCF\u5929\u65E9\u4E0A9\u70B9\u67E5\u770Bdima","/menu del 1","/menu list","/menu trigger go","/menu -g add /info robot","/menu -g del 1"],category:"\u7CFB\u7EDF"},{name:"/!",description:"\u4E2D\u65AD\u5F53\u524D\u4EFB\u52A1\u5E76\u7ACB\u5373\u5904\u7406\u65B0\u6D88\u606F",usage:"/!",examples:["/!"],category:"\u4F1A\u8BDD"},{name:"/reboot",description:"\u91CD\u542F cc-ding \u5E94\u7528\uFF08\u9700 pm2 \u90E8\u7F72\uFF09",usage:"/reboot [--update [tag]]",examples:["/reboot","/reboot --update","/reboot --update beta"],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 i=s.filter(a=>a.category===n);if(i.length!==0){r.push(`${o} **${n}**`);for(const a of i)r.push(`- \`${a.name}\` ${a.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(i=>s?.(i)||i).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.permissionMode&&n.push(`- **permissionMode:** ${e.permissionMode}`),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 i=fs_1.default.readdirSync(n,{withFileTypes:!0});for(const a of i)if(!(!a.isDirectory()||a.name.startsWith("."))){if(a.name===t)return path_1.default.join(n,a.name);r.push({dir:path_1.default.join(n,a.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(i=>!i.name.startsWith("."));if(r.length===0)return t===0?"\u{1F4C2} \u76EE\u5F55\u4E3A\u7A7A":"";r.sort((i,a)=>i.isDirectory()!==a.isDirectory()?i.isDirectory()?-1:1:i.name.localeCompare(a.name));const n=[],o=". ".repeat(t);for(const i of r){const a=i.isDirectory()?"\u{1F4C1} ":"\u{1F4C4} ",m=i.isDirectory()?"/":"";if(n.push(`${o}${a}${i.name}${m}`),i.isDirectory()&&t<s){const d=path_1.default.join(e,i.name),u=getDirectoryStructure(d,t+1,s);u&&n.push(u)}}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 i=s.match(/^(\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s+(.+)$/);return i&&looksLikeCronExpression(i[1])?{type:"create_cron",cronExpression:i[1],prompt:i[2]}:{type:"create_nl",input:s}}function parseVersionCommand(e){return e.trim()==="/version"}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 i=n[o];if(i==="--dingToken"&&n[o+1])r.dingToken=n[++o];else if(i==="--linkConversationId"&&n[o+1])r.linkConversationId=n[++o];else if(i==="--conversationId"&&n[o+1])r.conversationId=n[++o];else if(i==="--whiteUserList"&&n[o+1])r.whiteUserList=n[++o].split(",").map(a=>a.trim()).filter(Boolean);else if(i==="--conversationTitle"&&n[o+1]){const a=[];for(;o+1<n.length&&!n[o+1].startsWith("--");)a.push(n[++o]);a.length>0&&(r.conversationTitle=a.join(" "))}else if(i==="--atSender"&&n[o+1]){const a=n[++o].toLowerCase();r.atSender=a==="true"||a==="1"||a==="yes"}else if(i==="--receiveReply"&&n[o+1]){const a=n[++o].toLowerCase();r.receiveReply=a==="true"||a==="1"||a==="yes"}else if(i==="--preBash"&&n[o+1]){const a=[];for(;o+1<n.length&&!n[o+1].startsWith("--");)a.push(n[++o]);a.length>0&&(r.preBash=a.join(" ").replace(/^["']|["']$/g,""))}else i==="--permissionMode"&&n[o+1]&&(r.permissionMode=n[++o])}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"};if(/^front$/i.test(s))return{type:"front"};const r=s.match(/^rm\s+(.+)$/i);if(r){const o=r[1].trim();if(/^all$/i.test(o))return{type:"cancelAll"};const i=[],a=o.match(/^(\d+)\s*-\s*(\d+)$/);if(a){const d=parseInt(a[1],10),u=parseInt(a[2],10);if(d>0&&u>=d){for(let c=d;c<=u;c++)i.push(c);return{type:"rm",indices:i}}}const m=o.split(/\s+/);for(const d of m){const u=parseInt(d,10);u>0&&i.push(u)}if(i.length>0)return{type:"rm",indices:i}}const n=s.match(/^-n\s+(\d+)$/i);if(n){const o=parseInt(n[1],10);return o>0?{type:"cancel",count:o}:{type:"list"}}return/^-all$/i.test(s)?{type:"cancelAll"}:null}function parseAuthCommand(e){const t=e.trim(),s=t.match(/^\/auth\s+admin\s+add\s+(\S+)$/i);if(s)return{type:"adminAdd",staffId:s[1]};const r=t.match(/^\/auth\s+admin\s+(?:rm|del)\s+(\S+)$/i);if(r)return{type:"adminRm",staffId:r[1]};if(/^\/auth\s+admin(?:\s+list)?$/i.test(t))return{type:"adminList"};const n=t.match(/^\/auth\s+add\s+(\S+)$/i);if(n)return{type:"add",staffId:n[1]};const o=t.match(/^\/auth\s+(?:del(?:ete)?|rm)\s+(\S+)$/i);if(o)return{type:"del",staffId:o[1]};const i=t.match(/^\/auth\s+approve\s+(\S+)$/i);if(i)return{type:"approve",requestId:i[1]};const a=t.match(/^\/auth\s+reject\s+(\S+)$/i);return a?{type:"reject",requestId:a[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 s=e.trim().match(/^\/cc\s+(.+)$/i);if(!s)return null;const r=s[1].trim();return r.startsWith("/")?r:`/${r}`}function parseClaudeMdCommand(e){return/^\/claude\.md$/i.test(e.trim())}function parseInterruptCommand(e){return e.trim()==="/!"}function parseTodoCommand(e,t){const s=e.trim();if(!/^\/todo(?:\s|$)/i.test(s)&&s.toLowerCase()!=="/todo")return null;const r=s.substring(5).trim();if(/^list$/i.test(r))return{type:"list"};if(!r)return{type:"list"};const n=r.match(/^mode\s+(staffId|dingtalkId)$/i);if(n)return{type:"mode",mode:n[1]};const o=r.match(/^done\s+(\d+)$/i);if(o)return{type:"done",index:parseInt(o[1],10)};if(/^rm\s+all$/i.test(r))return{type:"remove",index:"all"};const i=r.match(/^rm\s+(\d+)$/i);if(i)return{type:"remove",index:parseInt(i[1],10)};if(/^remind\s+-1$/i.test(r))return{type:"remind",hour:null};const a=r.match(/^remind\s+(\d+)$/i);if(a){const l=parseInt(a[1],10);return l>=0&&l<=23?{type:"remind",hour:l}:null}let m=r,d,u,c;const p=m.match(/@(\S+)/);if(p){const l=p[1];m=m.replace(/@\S+/,"").trim(),d=l,u=l}const f=m.match(/\bddl\s+(.+)$/i);return f&&(c=f[1].trim(),m=m.replace(/\bddl\s+.+$/i,"").trim()),m?{type:"add",content:m,assigneeId:d,assigneeNick:u,deadline:c}:null}function parseMenuCommand(e){const t=e.trim();if(!/^\/menu(?:\s|$)/i.test(t)&&t.toLowerCase()!=="/menu")return null;const s=t.substring(5).trim(),r=s.startsWith("-g "),n=r?s.substring(3).trim():s;if(!s)return{type:"show"};if(r&&!n)return{type:"list",isGlobal:!0};const o=n.match(/^trigger\s+(\S+)$/i);if(o&&!r)return{type:"trigger",word:o[1]};const i=n.match(/^add\s+(.+)$/i);if(i)return{type:"add",command:i[1].trim(),isGlobal:r};const a=n.match(/^del(?:ete)?\s+(\d+)$/i);return a?{type:"del",index:parseInt(a[1],10),isGlobal:r}:/^list$/i.test(n)?{type:"list",isGlobal:r}:r?null:{type:"show"}}function parseRebootCommand(e){const t=e.trim();if(!/^\/reboot(?:\s|$)/i.test(t))return null;const s=t.substring(7).trim();if(!s)return{update:!1};const r=s.match(/^--update(?:\s+(\S+))?$/i);return r?{update:!0,tag:r[1]}:null}function parseRecorderCommandEnhanced(e){const t=e.trim().toLowerCase();return/^\/(?:recorder|r)\s+on$/i.test(t)?"on":/^\/(?:recorder|r)\s+(?:exit|e)$/i.test(t)||/^\/(?:exit|e)$/i.test(t)?"exit":null}
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
`),t.trim()}function splitMessage(e,t){const r=[];for(;e.length>t;){let n=e.lastIndexOf(`
|
|
4
4
|
`,t);(n===-1||n<t*.5)&&(n=e.lastIndexOf("\u3002",t)),(n===-1||n<t*.5)&&(n=e.lastIndexOf(" ",t)),n===-1||n<t*.5?n=t:n+=1,r.push(e.substring(0,n).trim()),e=e.substring(n).trim()}return e.length>0&&r.push(e),r}async function sendDingMessage(e,t){const{conversationId:r,sessionWebhook:n,atUserId:o,content:s,msgType:a="text"}=t,i=e.config.conversations.find(d=>d.conversationId===r);let c=o;(i?.atSender===!1||i?.conversationType==="1")&&(c=void 0);const l=c?[c]:[],p=i?.dingToken;let g=s;c&&a==="markdown"&&(g=`${s}
|
|
5
5
|
@${c}`);const f=a==="markdown"?{msgtype:"markdown",markdown:{title:g,text:g},at:{atUserIds:l,isAtAll:!1}}:{msgtype:"text",text:{content:s},at:{atUserIds:l,isAtAll:!1}};if(p){const d=await e.dingStreamClient.getAccessToken(),u=`https://oapi.dingtalk.com/robot/send?access_token=${p}`;try{await urllib_1.default.request(u,{method:"POST",data:f,contentType:"json",headers:{"x-acs-dingtalk-access-token":d},dataType:"json"})}catch(y){console.error("\u901A\u8FC7 dingToken \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",y)}}else if(n){const d=await e.dingStreamClient.getAccessToken();try{await urllib_1.default.request(n,{method:"POST",data:f,contentType:"json",headers:{"x-acs-dingtalk-access-token":d},dataType:"json"})}catch(u){console.error("\u901A\u8FC7 sessionWebhook \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",u)}}else if(e.config.defaultDingToken){const d=await e.dingStreamClient.getAccessToken(),u=`https://oapi.dingtalk.com/robot/send?access_token=${e.config.defaultDingToken}`;try{await urllib_1.default.request(u,{method:"POST",data:f,contentType:"json",headers:{"x-acs-dingtalk-access-token":d},dataType:"json"})}catch(y){console.error("\u901A\u8FC7 defaultDingToken \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",y)}}else console.error("\u672A\u80FD\u83B7\u53D6\u673A\u5668\u4EBA\u4FE1\u606F\u53D1\u9001\u9014\u5F84")}async function sendClaudeResponseToDing(e,t,r,n,o){const a=filterToolUseContent(o);if(!a){e.debugLog("\u8FC7\u6EE4\u540E\u5185\u5BB9\u4E3A\u7A7A\uFF0C\u8DF3\u8FC7\u53D1\u9001");return}if(a.length<=18e3)await sendDingMessage(e,{conversationId:t,sessionWebhook:r,atUserId:n,content:a,msgType:"markdown"});else{const i=splitMessage(a,18e3);for(let c=0;c<i.length;c++){const l=i.length>1?`**[${c+1}/${i.length}]**
|
|
6
|
-
`:"";await sendDingMessage(e,{conversationId:t,sessionWebhook:r,atUserId:c===i.length-1?n:"",content:l+i[c],msgType:"markdown"}),c<i.length-1&&await utils_ok_1.
|
|
6
|
+
`:"";await sendDingMessage(e,{conversationId:t,sessionWebhook:r,atUserId:c===i.length-1?n:"",content:l+i[c],msgType:"markdown"}),c<i.length-1&&await utils_ok_1.asyncUtil.sleep(500)}}}async function sendMessageToUser(e,t,r,n="text"){if(!e.config.enableMsgToUser)return console.log(`[sendMessageToUser] enableMsgToUser \u672A\u5F00\u542F\uFF0C\u8DF3\u8FC7\u53D1\u9001 (userId=${t})`),!1;try{const o=await e.dingStreamClient.getAccessToken(),s=n==="markdown"?"sampleMarkdown":"sampleText",a=JSON.stringify(n==="markdown"?{title:"notification",text:r}:{content:r}),i=await urllib_1.default.request(`${DING_API_BASE}/v1.0/robot/oToMessages/batchSend`,{method:"POST",data:{robotCode:e.clientId,userIds:[t],msgKey:s,msgParam:a},contentType:"json",headers:{"x-acs-dingtalk-access-token":o},dataType:"json"});return i.status===200?!0:(console.error(`sendMessageToUser API \u8FD4\u56DE\u975E200: status=${i.status}, userId=${t}`),!1)}catch(o){return console.error(`sendMessageToUser \u5931\u8D25 (userId=${t}):`,o),!1}}async function sendOwnerMessage(e,t,r="text"){const{ownerConversationId:n,owner:o}=e.config;if(!n||!o)return!1;const s=await queryUserIdByMobile(e,o);return s?sendMessageToUser(e,s,t,r):(console.error(`sendOwnerMessage: \u65E0\u6CD5\u5C06\u624B\u673A\u53F7 ${o} \u89E3\u6790\u4E3A Ding userId`),!1)}
|
package/dist/src/biz/notify.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __importDefault=this&&this.__importDefault||function(
|
|
1
|
+
"use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.sendNotify=sendNotify;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),os_1=__importDefault(require("os")),urllib_1=__importDefault(require("urllib")),DING_API_BASE="https://api.dingtalk.com",DING_OAPI_BASE="https://oapi.dingtalk.com";function getClientDir(e){return path_1.default.join(os_1.default.homedir(),".cc-ding",e)}function getPhoneMapFile(e){return path_1.default.join(getClientDir(e),"phone-map.json")}function loadPhoneMap(e){const n=getPhoneMapFile(e);if(!fs_1.default.existsSync(n))return{};try{const t=JSON.parse(fs_1.default.readFileSync(n,"utf-8"));if(typeof t=="object"&&t!==null)return t}catch{}return{}}function savePhoneMap(e,n){const t=getPhoneMapFile(e);try{fs_1.default.writeFileSync(t,JSON.stringify(n,null,2),"utf-8")}catch{}}async function getAccessToken(e,n){const t=await urllib_1.default.request(`${DING_API_BASE}/v1.0/oauth2/accessToken`,{method:"POST",data:{appKey:e,appSecret:n},contentType:"json",dataType:"json",timeout:1e4});if(t.status!==200||!t.data?.accessToken)throw new Error(`\u83B7\u53D6 accessToken \u5931\u8D25: ${JSON.stringify(t.data)}`);return t.data.accessToken}async function getUserIdByMobile(e,n){const t=await urllib_1.default.request(`${DING_OAPI_BASE}/topapi/v2/user/getbymobile?access_token=${e}`,{method:"POST",data:{mobile:n},contentType:"json",dataType:"json",timeout:5e3});if(t.status!==200||!t.data)return null;const r=t.data;return r.errcode!==0?null:r.result?.userid||null}async function sendToUser(e,n,t,r,c){const y=c?"sampleMarkdown":"sampleText",u=JSON.stringify(c?{title:"notification",text:r}:{content:r});return(await urllib_1.default.request(`${DING_API_BASE}/v1.0/robot/oToMessages/batchSend`,{method:"POST",data:{robotCode:n,userIds:[t],msgKey:y,msgParam:u},contentType:"json",headers:{"x-acs-dingtalk-access-token":e},dataType:"json"})).status===200}async function sendNotify(e){const{clientId:n,message:t,conversationIds:r,atUserIds:c=[],mobiles:y=[],markdown:u=!1}=e,T=getClientDir(n),g=path_1.default.join(T,"config.json");if(!fs_1.default.existsSync(g))return console.error(`\u274C \u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${g}`),{success:0,fail:r.length};let f;try{f=JSON.parse(fs_1.default.readFileSync(g,"utf-8"))}catch(a){return console.error(`\u274C \u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${a instanceof Error?a.message:a}`),{success:0,fail:r.length}}let m=0,i=0,d=null;const h=loadPhoneMap(n);for(const a of r){const p=f.conversations.find(o=>o.conversationId===a),l=p?.conversationTitle||a;if(p?.conversationType==="1"){const o=y[r.indexOf(a)]||p.mobile;if(!o){console.error(` \u2717 ${l}: \u5355\u804A\u7F3A\u5C11\u624B\u673A\u53F7\uFF08\u8BF7\u914D\u7F6E conversations[].mobile \u6216\u4F20 --mobile\uFF09`),i++;continue}try{d||(d=await getAccessToken(n,f.clientSecret));let s=h[o];if(s||(s=await getUserIdByMobile(d,o),s&&(h[o]=s,savePhoneMap(n,h))),!s){console.error(` \u2717 ${l}: \u65E0\u6CD5\u89E3\u6790\u624B\u673A\u53F7 ${o} \u4E3A userId`),i++;continue}await sendToUser(d,n,s,t,u)?(console.log(` \u2713 ${l}`),m++):(console.error(` \u2717 ${l}: API \u8FD4\u56DE\u5931\u8D25`),i++)}catch(s){console.error(` \u2717 ${l}: ${s instanceof Error?s.message:s}`),i++}continue}const $=p?.dingToken||f.defaultDingToken;if(!$){console.error(` \u2717 ${l}: \u65E0 dingToken \u53EF\u7528`),i++;continue}try{const o=c.length>0?`${t} ${c.map(S=>`@${S}`).join(" ")}`:t,s=u?{msgtype:"markdown",markdown:{title:o,text:o},at:{atUserIds:c,isAtAll:!1}}:{msgtype:"text",text:{content:o},at:{atUserIds:c,isAtAll:!1}},k=`https://oapi.dingtalk.com/robot/send?access_token=${$}`,b=await urllib_1.default.request(k,{method:"POST",data:s,contentType:"json",dataType:"json"});b.status===200?(console.log(` \u2713 ${l}`),m++):(console.error(` \u2717 ${a}: HTTP ${b.status}`),i++)}catch(o){console.error(` \u2717 ${a}: ${o instanceof Error?o.message:o}`),i++}}return{success:m,fail:i}}
|
package/dist/src/biz/session.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
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.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,
|
|
2
|
-
`)}function readSessionLogTail(e,n
|
|
3
|
-
`).filter(
|
|
4
|
-
`)}catch{return null}}function findHistorySession(e,n
|
|
5
|
-
`;try{fs_1.default.appendFileSync(t,i,"utf-8")}catch{}}function getActiveSessionsFile(e,
|
|
6
|
-
`,"utf-8");const
|
|
7
|
-
\u{1F4CB} \u4F1A\u8BDDID: ${
|
|
8
|
-
\u{1F5D1}\uFE0F \u5DF2\u6E05\u7A7A\u6D88\u606F\u961F\u5217\uFF0C\u4E22\u5F03${
|
|
9
|
-
`,"utf-8")}async function switchToSession(e,n,
|
|
10
|
-
`,"utf-8")),e.activeSessions.set(
|
|
11
|
-
${
|
|
12
|
-
\u{1F4A1} \u56DE\u590D /end \u53EF\u7ED3\u675F\u672C\u8F6E\u5BF9\u8BDD`}),console.log(`\u5DF2\u5207\u6362\u5230\u5386\u53F2\u4F1A\u8BDD: \u7FA4=${
|
|
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(`
|
|
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
|
+
`).filter(a=>a.length>0).slice(-n).join(`
|
|
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}
|
|
5
|
+
`;try{fs_1.default.appendFileSync(t,i,"utf-8")}catch{}}function getActiveSessionsFile(e,s){return`${getSessionsDir(e,s)}/active.json`}function saveActiveSession(e,s){const n=e.activeSessions.get(s),t=getActiveSessionsFile(e,s);try{if(!n){fs_1.default.existsSync(t)&&fs_1.default.unlinkSync(t);return}const o={session:n.session,lastSenderStaffId:n.lastSenderStaffId,conversationConfig:n.conversationConfig};fs_1.default.mkdirSync(path_1.default.dirname(t),{recursive:!0}),fs_1.default.writeFileSync(t,JSON.stringify(o,null,2),"utf-8"),debugLog(e,`\u6D3B\u8DC3\u4F1A\u8BDD\u5DF2\u6301\u4E45\u5316: \u7FA4=${s}`)}catch(o){console.error(`\u6301\u4E45\u5316\u6D3B\u8DC3\u4F1A\u8BDD\u5931\u8D25: \u7FA4=${s}`,o)}}function loadActiveSessions(e){for(const s of e.config.conversations){const n=getActiveSessionsFile(e,s.conversationId);if(fs_1.default.existsSync(n))try{const t=utils_ok_1.fileUtil.getJSON(n);if(!t?.session){console.log(`\u6D3B\u8DC3\u4F1A\u8BDD\u6587\u4EF6\u65E0\u6548\uFF0C\u8DF3\u8FC7: ${n}`);continue}const o=getSessionDir(e,t.session);if(!fs_1.default.existsSync(o)){console.log(`\u6D3B\u8DC3\u4F1A\u8BDD\u76EE\u5F55\u5DF2\u4E0D\u5B58\u5728\uFF0C\u6E05\u7406\u6301\u4E45\u5316\u6587\u4EF6: ${n}`),fs_1.default.unlinkSync(n);continue}e.activeSessions.set(s.conversationId,{session:t.session,lastSenderStaffId:t.lastSenderStaffId||t.session.startStaffId,isProcessing:!1,messageQueue:[],conversationConfig:t.conversationConfig}),console.log(`\u6062\u590D\u6D3B\u8DC3\u4F1A\u8BDD: \u7FA4=${s.conversationId}, \u4F1A\u8BDDID=${getSessionId(t.session)}`)}catch(t){console.error(`\u52A0\u8F7D\u6D3B\u8DC3\u4F1A\u8BDD\u5931\u8D25: ${n}`,t)}}}async function endSession(e,s,n){const t=findActiveSession(e,s);if(!t){console.log(`\u7FA4 ${s} \u65E0\u6D3B\u8DC3\u4F1A\u8BDD`);return}const{key:o,session:i}=t,{session:u}=i,c=getSessionDir(e,u),a=getSessionId(u);console.log(`\u7ED3\u675F\u4F1A\u8BDD: \u7FA4=${s}, \u4F1A\u8BDDID=${a}`),(0,claude_process_1.interruptClaudeProcess)(i,"\u7ED3\u675F\u4F1A\u8BDD\u65F6\u4E2D\u65AD\u6B63\u5728\u6267\u884C\u7684 Claude \u8FDB\u7A0B")&&fs_1.default.appendFileSync(`${c}/session.log`,`[${timestamp()}] [SYSTEM]: \u7ED3\u675F\u4F1A\u8BDD\u65F6\u4E2D\u65AD Claude \u8FDB\u7A0B
|
|
6
|
+
`,"utf-8");const f=i.messageQueue?.length??0;f>0&&(i.messageQueue=[],console.log(`[${timestamp()}] \u7ED3\u675F\u4F1A\u8BDD\u65F6\u6E05\u7A7A\u6D88\u606F\u961F\u5217: \u7FA4=${s}, \u6E05\u7A7A${f}\u6761\u6D88\u606F`)),await(0,messaging_1.sendDingMessage)(e,{conversationId:s,sessionWebhook:n,atUserId:u.startStaffId,content:`\u{1F4AC} \u4F1A\u8BDD\u5DF2\u7ED3\u675F
|
|
7
|
+
\u{1F4CB} \u4F1A\u8BDDID: ${a}${f>0?`
|
|
8
|
+
\u{1F5D1}\uFE0F \u5DF2\u6E05\u7A7A\u6D88\u606F\u961F\u5217\uFF0C\u4E22\u5F03${f}\u6761\u5F85\u5904\u7406\u6D88\u606F`:""}`}),e.activeSessions.delete(o),saveActiveSession(e,o),fs_1.default.appendFileSync(`${c}/session.log`,`[${timestamp()}] [SYSTEM]: \u7528\u6237\u8BF7\u6C42\u7ED3\u675F\u4F1A\u8BDD
|
|
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
|
+
`,"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
|
+
${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 l=getSessionDir(e,r);fs_1.default.mkdirSync(l,{recursive:!0}),fs_1.default.writeFileSync(`${l}/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,
|
|
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(d){console.error("\u6267\u884C Claude \u67E5\u8BE2\u5931\u8D25:",d),await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:t,atUserId:o,content:`\u274C \u5904\u7406\u6D88\u606F\u65F6\u53D1\u751F\u9519\u8BEF: ${d instanceof Error?d.message:String(d)}`})}finally{const d=e.activeSessions.get(n);d&&(d.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 l=getSessionDir(e,r.session);if(fs_1.default.existsSync(l)||(fs_1.default.mkdirSync(l,{recursive:!0}),fs_1.default.writeFileSync(`${l}/session.json`,JSON.stringify(r.session,null,2),"utf-8"),console.log(`\u4F1A\u8BDD\u76EE\u5F55\u5DF2\u91CD\u5EFA: \u7FA4=${n}, \u8DEF\u5F84=${l}`)),r.isProcessing){const d={message:u,senderStaffId:o,senderNick:i};r.messageQueue.push(d);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(d){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:",d),await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:t,atUserId:o,content:`\u274C \u5904\u7406\u6D88\u606F\u65F6\u53D1\u751F\u9519\u8BEF: ${d instanceof Error?d.message:String(d)}`})}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 l=findActiveSession(e,i);l&&(u=getSessionId(l.session.session))}const c=getSessionsDir(e,i);if(fs_1.default.existsSync(c))try{const l=fs_1.default.readdirSync(c,{withFileTypes:!0});for(const g of l){if(!g.isDirectory()||u&&g.name===u)continue;const d=path_1.default.join(c,g.name);try{fs_1.default.rmSync(d,{recursive:!0,force:!0}),t.sessionsDeleted++}catch{t.errors.push(`\u5220\u9664\u4F1A\u8BDD\u76EE\u5F55\u5931\u8D25: ${d}`)}}}catch{t.errors.push(`\u8BFB\u53D6sessions\u76EE\u5F55\u5931\u8D25: ${c}`)}const a=getTasksDir(e,i);if(fs_1.default.existsSync(a))try{const l=fs_1.default.readdirSync(a,{withFileTypes:!0});for(const g of l){if(!g.isDirectory())continue;const d=path_1.default.join(a,g.name);try{fs_1.default.rmSync(d,{recursive:!0,force:!0}),t.tasksDeleted++}catch{t.errors.push(`\u5220\u9664\u4EFB\u52A1\u76EE\u5F55\u5931\u8D25: ${d}`)}}}catch{t.errors.push(`\u8BFB\u53D6tasks\u76EE\u5F55\u5931\u8D25: ${a}`)}const f=getImagesDir(e,i);if(fs_1.default.existsSync(f))try{const l=fs_1.default.readdirSync(f,{withFileTypes:!0});for(const g of l){const d=path_1.default.join(f,g.name);try{fs_1.default.unlinkSync(d),t.imagesDeleted++}catch{t.errors.push(`\u5220\u9664\u56FE\u7247\u5931\u8D25: ${d}`)}}}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 l=getActiveSessionsFile(e,i);if(fs_1.default.existsSync(l))try{fs_1.default.unlinkSync(l)}catch{t.errors.push(`\u5220\u9664\u6D3B\u8DC3\u4F1A\u8BDD\u6587\u4EF6\u5931\u8D25: ${l}`)}e.activeSessions.has(i)&&e.activeSessions.delete(i)}}return t}
|