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.
@@ -1,42 +1,42 @@
1
- "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveClaudeSettingsPath=resolveClaudeSettingsPath,exports.isRetryableApiError=isRetryableApiError,exports.parseClaudeStreamLine=parseClaudeStreamLine,exports.interruptClaudeProcess=interruptClaudeProcess,exports.executeClaudeQuery=executeClaudeQuery;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),readline_1=__importDefault(require("readline")),child_process_1=require("child_process"),messaging_1=require("./messaging"),session_1=require("./session"),api_key_manager_1=require("./api-key-manager"),MAX_FAST_FAIL=20,API_RETRY_DELAY_MS=1e4,FAST_FAIL_THRESHOLD_MS=1e4,MAX_TOTAL_RETRIES=10,MAX_RETRY_DURATION_MS=300*1e3,WATCHDOG_TIMEOUT_MS=300*1e3,WATCHDOG_CHECK_INTERVAL_MS=30*1e3;function resolveClaudeSettingsPath(e,t,i){const r=(0,api_key_manager_1.getForceEnabledSettingsPath)(t);if(r)return r;if(e.config.apiKeyCfg){const c=(0,api_key_manager_1.readApiKeyFromSettings)(t);let I=null;if(c&&(I=e.config.apiKeyCfg.claudeSettings.find(u=>u.apiKey===c&&u.isValid)||null),I||(I=(0,api_key_manager_1.pickValidApiKey)(e)),I)return(0,api_key_manager_1.ensureSettingsWithApiKey)(t,I)}if(e.config.apiKeyCfg)return;if(i)return i;const s=path_1.default.join(t,".claude","settings.json");if(fs_1.default.existsSync(s))return console.log(`[${(0,session_1.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${s}`),s}function isRetryableApiError(e){if(/\b429\b/.test(e)&&!(0,api_key_manager_1.isQuotaExhaustedError)(e)||/API\s*Error.*422/i.test(e)||/\b422\b.*(?:TPM|额度超限|rate\s*limit|tokens?\s*per\s*minute)/i.test(e)||/(?:TPM|额度超限).*\b422\b/i.test(e))return!0;const t=e.toLowerCase();return["rate limit","rate_limit","ratelimit","too many requests","tokens per minute","requests per minute","rpm limit","overloaded","capacity","temporarily unavailable"].some(r=>t.includes(r))}function sleep(e){return new Promise(t=>setTimeout(t,e))}class RetryableApiError extends Error{constructor(t,i=""){super(`Retryable API error (TPM limit etc.)${t?" [fast fail]":""}`),this.name="RetryableApiError",this.isFastFail=t,this.output=i}}class ConversationNotFoundError extends Error{constructor(){super("Claude conversation not found"),this.name="ConversationNotFoundError"}}class ContextWindowExceededError extends Error{constructor(){super("Context window exceeded: prompt tokens exceed maximum context window"),this.name="ContextWindowExceededError"}}function readLastLogLines(e,t){try{return fs_1.default.readFileSync(e,"utf-8").split(`
2
- `).filter(Boolean).slice(-t).join(`
3
- `)}catch{return""}}function isContextWindowExceededError(e){return/prompt tokens?\s*\(\s*\d+\s*\)\s*exceeds/i.test(e)||/exceeds?.*maximum context window/i.test(e)}function isPermissionError(e){const t=e.toLowerCase();return["permission denied","permission_required","needs permission","requires permission","authorization required","authorize","not authorized","access denied","\u9700\u8981\u6388\u6743","\u6743\u9650\u4E0D\u8DB3","\u6CA1\u6709\u6743\u9650"].some(r=>t.includes(r))}function isConversationNotFoundError(e){return/no conversation found with session id/i.test(e)}function parseClaudeStreamLine(e,t=!1){if(!e.trim())return null;try{const i=JSON.parse(e);if(i.type==="system"&&i.subtype==="init"&&i.session_id)return{type:"system",sessionId:i.session_id};if(i.type==="assistant"){const r=i.message?.content;if(Array.isArray(r)){const s=[];for(const c of r)c.type==="text"&&c.text?s.push(c.text):c.type==="thinking"&&c.thinking&&t&&s.push(`\u{1F4AD} **\u601D\u8003\u8FC7\u7A0B**
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveClaudeSettingsPath=resolveClaudeSettingsPath,exports.isRetryableApiError=isRetryableApiError,exports.parseClaudeStreamLine=parseClaudeStreamLine,exports.interruptClaudeProcess=interruptClaudeProcess,exports.injectStartupContexts=injectStartupContexts,exports.injectSessionContextIfChanged=injectSessionContextIfChanged,exports.executeClaudeQuery=executeClaudeQuery;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),readline_1=__importDefault(require("readline")),child_process_1=require("child_process"),messaging_1=require("./messaging"),session_1=require("./session"),api_key_manager_1=require("./api-key-manager"),MAX_FAST_FAIL=20,API_RETRY_DELAY_MS=1e4,FAST_FAIL_THRESHOLD_MS=1e4,MAX_TOTAL_RETRIES=10,MAX_RETRY_DURATION_MS=300*1e3,WATCHDOG_TIMEOUT_MS=300*1e3,WATCHDOG_CHECK_INTERVAL_MS=30*1e3,injectedContextCache=new Map;function resolveClaudeSettingsPath(t,e,n){const i=(0,api_key_manager_1.getForceEnabledSettingsPath)(e);if(i)return i;if(t.config.apiKeyCfg){const a=(0,api_key_manager_1.readApiKeyFromSettings)(e);let $=null;if(a&&($=t.config.apiKeyCfg.claudeSettings.find(c=>c.apiKey===a&&c.isValid)||null),$||($=(0,api_key_manager_1.pickValidApiKey)(t)),$)return(0,api_key_manager_1.ensureSettingsWithApiKey)(e,$)}if(t.config.apiKeyCfg)return;if(n)return n;const m=path_1.default.join(e,".claude","settings.json");if(fs_1.default.existsSync(m))return console.log(`[${(0,session_1.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${m}`),m}function isRetryableApiError(t){if(/\b429\b/.test(t)&&!(0,api_key_manager_1.isQuotaExhaustedError)(t)||/API\s*Error.*422/i.test(t)||/\b422\b.*(?:TPM|额度超限|rate\s*limit|tokens?\s*per\s*minute)/i.test(t)||/(?:TPM|额度超限).*\b422\b/i.test(t))return!0;const e=t.toLowerCase();return["rate limit","rate_limit","ratelimit","too many requests","tokens per minute","requests per minute","rpm limit","overloaded","capacity","temporarily unavailable"].some(i=>e.includes(i))}function sleep(t){return new Promise(e=>setTimeout(e,t))}class RetryableApiError extends Error{constructor(e,n=""){super(`Retryable API error (TPM limit etc.)${e?" [fast fail]":""}`),this.name="RetryableApiError",this.isFastFail=e,this.output=n}}class ConversationNotFoundError extends Error{constructor(){super("Claude conversation not found"),this.name="ConversationNotFoundError"}}class ContextWindowExceededError extends Error{constructor(){super("Context window exceeded: prompt tokens exceed maximum context window"),this.name="ContextWindowExceededError"}}function readLastLogLines(t,e){try{return fs_1.default.readFileSync(t,"utf-8").split(`
2
+ `).filter(Boolean).slice(-e).join(`
3
+ `)}catch{return""}}function isContextWindowExceededError(t){return/prompt tokens?\s*\(\s*\d+\s*\)\s*exceeds/i.test(t)||/exceeds?.*maximum context window/i.test(t)}function isPermissionError(t){const e=t.toLowerCase();return["permission denied","permission_required","needs permission","requires permission","authorization required","authorize","not authorized","access denied","\u9700\u8981\u6388\u6743","\u6743\u9650\u4E0D\u8DB3","\u6CA1\u6709\u6743\u9650"].some(i=>e.includes(i))}function isConversationNotFoundError(t){return/no conversation found with session id/i.test(t)}function parseClaudeStreamLine(t,e=!1){if(!t.trim())return null;try{const n=JSON.parse(t);if(n.type==="system"&&n.subtype==="init"&&n.session_id)return{type:"system",sessionId:n.session_id};if(n.type==="assistant"){const i=n.message?.content;if(Array.isArray(i)){const m=[];for(const a of i)a.type==="text"&&a.text?m.push(a.text):a.type==="thinking"&&a.thinking&&e&&m.push(`\u{1F4AD} **\u601D\u8003\u8FC7\u7A0B**
4
4
  \`\`\`
5
- ${c.thinking}
6
- \`\`\``);if(s.length>0)return{type:"assistant",content:s.join(`
7
- `)}}else if(i.content)return{type:"assistant",content:typeof i.content=="string"?i.content:JSON.stringify(i.content)};return{type:"assistant"}}if(i.type==="result"){const r=i.result||"";return{type:"result",content:typeof r=="string"?r:JSON.stringify(r)}}return{type:i.type||"unknown"}}catch{return{type:"text",content:e}}}function interruptClaudeProcess(e,t){return e.currentProcess?(console.log(`[${(0,session_1.timestamp)()}] ${t}`),e.interrupted=!0,e.currentProcess.kill("SIGINT"),!0):!1}function runClaudeOnce(e,t,i,r,s,c,I){let u=e.getSessionDir(t),S=`${u}/session.log`;fs_1.default.existsSync(u)||fs_1.default.mkdirSync(u,{recursive:!0});const m=Date.now();return new Promise((g,d)=>{const C=(0,child_process_1.spawn)(r,i,{cwd:s,stdio:["pipe","pipe","pipe"]}),v=e.activeSessions.get(t.conversationId);v&&(v.currentProcess=C,v.lastActivityTime=Date.now()),fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u542F\u52A8${I?" (\u91CD\u8BD5)":""}
8
- `,"utf-8"),C.stdin?.write(`${c}
9
- `),C.stdin?.end();let A=!I&&!!t.claudeSessionId,w=[],k="",R="",P=!1,h=!1,y=null;const E=new Set,M=()=>{v&&(v.lastActivityTime=Date.now())};y=setInterval(()=>{if(h){y&&clearInterval(y);return}const a=v?.lastActivityTime??m;if(Date.now()-a>=WATCHDOG_TIMEOUT_MS){console.warn(`[${(0,session_1.timestamp)()}] Watchdog: Claude \u8FDB\u7A0B ${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u901A\u77E5\u7528\u6237`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [SYSTEM]: Watchdog \u8D85\u65F6\uFF0C${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u5DF2\u901A\u77E5\u7528\u6237
10
- `,"utf-8")}catch{}y&&clearInterval(y),y=null;const l=v?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:l,content:`\u23F0 Claude \u8FDB\u7A0B\u8D85\u8FC7 ${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u54CD\u5E94\uFF0C\u53EF\u53D1\u9001 /goon \u5F3A\u5236\u91CD\u542F\u6062\u590D\uFF0C\u6216 /end \u7ED3\u675F\u4F1A\u8BDD`}).catch(p=>console.error("\u53D1\u9001 Watchdog \u901A\u77E5\u5931\u8D25:",p))}},WATCHDOG_CHECK_INTERVAL_MS),readline_1.default.createInterface({input:C.stdout}).on("line",a=>{if(R+=a+`
11
- `,M(),e.debugLog(`Claude stdout: ${a.substring(0,200)}${a.length>200?"...":""}`),e.config.debug)try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [RAW]: ${a}
12
- `,"utf-8")}catch{}const n=parseClaudeStreamLine(a,e.config.includeThinking??!1);if(n){if(n.type==="system"&&n.sessionId&&!A&&(e.updateSessionFile(t,{claudeSessionId:n.sessionId}),A=!0,u=e.getSessionDir(t),S=`${u}/session.log`),n.type==="assistant"){try{const p=JSON.parse(a)?.message?.content;if(Array.isArray(p)){for(const o of p)if(o.type==="tool_use"&&o.id&&!E.has(o.id)){E.add(o.id);const $=o.name||"unknown";let f="";o.input&&(o.input.command?f=o.input.command.substring(0,200):o.input.file_path?f=o.input.file_path:o.input.pattern?f=o.input.pattern:o.input.query?f=o.input.query:o.input.description?f=o.input.description:o.input.prompt?f=o.input.prompt.substring(0,200):f=JSON.stringify(o.input).substring(0,200)),e.appendSessionLog(u,"tool",`${$}${f?": "+f:""}`)}}}catch{}n.content&&w.push(n.content)}if(n.type==="result"){const l=e.config.resultOnly??!0,p=(n.content||"").trim(),o=w.join(`
13
- `).trim(),$=l&&p||o;if($&&!v?.interrupted){try{e.appendSessionLog(u,"assistant",$)}catch{}const T=e.activeSessions.get(t.conversationId)?.lastSenderStaffId||t.startStaffId;P=!0,(0,messaging_1.sendClaudeResponseToDing)(e,(0,session_1.getReplyConversationId)(t),(0,session_1.getReplyWebhook)(t),T,$).catch(x=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",x))}else console.warn(`[${(0,session_1.timestamp)()}] Claude \u8FD4\u56DE\u4E86\u7A7A\u7684 result \u4E14 responseBuffer \u4E5F\u4E3A\u7A7A\uFF0C\u65E0\u5185\u5BB9\u53EF\u53D1\u9001`);w=[]}}}),C.stderr?.on("data",a=>{const n=a.toString();if(k+=n,M(),(0,api_key_manager_1.isQuotaExhaustedError)(n)){console.log(`[${(0,session_1.timestamp)()}] [Claude stderr] \u914D\u989D\u8017\u5C3D\u9519\u8BEF(429): ${n.trim()}`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [WARN]: ${n}`,"utf-8")}catch{}}else if(isRetryableApiError(n)){console.log(`[${(0,session_1.timestamp)()}] [Claude stderr] \u53EF\u91CD\u8BD5API\u9519\u8BEF(422 TPM\u9650\u6D41): ${n.trim()}`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [WARN]: ${n}`,"utf-8")}catch{}}else{console.error(`[Claude stderr]: ${n}`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [ERROR]: ${n}`,"utf-8")}catch{}}}),C.on("close",a=>{h=!0,y&&(clearInterval(y),y=null),console.log(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${a}`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u7ED3\u675F\uFF0C\u9000\u51FA\u7801: ${a}
14
- `,"utf-8")}catch{}const n=e.activeSessions.get(t.conversationId);if(n&&(n.currentProcess=void 0),n?.interrupted){console.log(`[${(0,session_1.timestamp)()}] \u7528\u6237\u4E3B\u52A8\u4E2D\u65AD\uFF0C\u4E22\u5F03 responseBuffer (${w.length} \u6BB5)`),n.interrupted=!1,w=[],g(0);return}if(w.length>0){const p=w.join(`
15
- `).trim();if(p){try{e.appendSessionLog(u,"assistant",p)}catch{}const o=n?.lastSenderStaffId||t.startStaffId;P=!0,(0,messaging_1.sendClaudeResponseToDing)(e,(0,session_1.getReplyConversationId)(t),(0,session_1.getReplyWebhook)(t),o,p).catch($=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",$))}}if(a===0&&!P&&!n?.interrupted){console.warn(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [WARN]: Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9
16
- `,"utf-8")}catch{}const p=n?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:p,content:"\u26A0\uFE0F Claude \u5904\u7406\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u4EFB\u4F55\u5185\u5BB9\uFF0C\u8BF7\u91CD\u8BD5\u6216\u6362\u79CD\u65B9\u5F0F\u63D0\u95EE"}).catch(o=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",o))}if(a===0){g(0);return}const l=k+`
17
- `+R;if((0,api_key_manager_1.isQuotaExhaustedError)(l)){const o=Date.now()-m<FAST_FAIL_THRESHOLD_MS;console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u914D\u989D\u8017\u5C3D\u9519\u8BEF(429)\uFF0Cstdout\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(R)}, stderr\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(k)}`),d(new RetryableApiError(o,l));return}if((0,api_key_manager_1.isAuthenticationError)(l)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u901A\u77E5\u7528\u6237`);const p=n?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:p,content:"\u26A0\uFE0F \u8BA4\u8BC1\u5931\u8D25(401)\uFF0CAPI Key \u65E0\u6548\u6216\u670D\u52A1\u672A\u6388\u6743\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E"}).catch(o=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",o)),g(a??1);return}if(isRetryableApiError(l)){const o=Date.now()-m<FAST_FAIL_THRESHOLD_MS;d(new RetryableApiError(o,l));return}if(isPermissionError(l)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u9700\u8981\u6388\u6743\uFF0C\u901A\u77E5\u7528\u6237`);const p=n?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:p,content:"\u26A0\uFE0F Claude \u9700\u8981\u6388\u6743\uFF0C\u8BF7\u4EBA\u5DE5\u4ECB\u5165"}).catch(o=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",o)),g(a??1);return}if(t.claudeSessionId&&isConversationNotFoundError(l)){console.log(`[${(0,session_1.timestamp)()}] Claude \u4F1A\u8BDD\u5DF2\u5931\u6548: ${t.claudeSessionId}\uFF0C\u901A\u77E5\u5916\u5C42\u91CD\u65B0\u53D1\u8D77\u65B0\u4F1A\u8BDD`),d(new ConversationNotFoundError);return}if(isContextWindowExceededError(l)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\u9519\u8BEF(400)\uFF0C\u5C06\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587`);try{fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u5C06\u81EA\u52A8 /compact
18
- `,"utf-8")}catch{}d(new ContextWindowExceededError);return}d(new Error(`Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${a}`))}),C.on("error",a=>{h=!0,y&&(clearInterval(y),y=null),console.error("Claude \u8FDB\u7A0B\u9519\u8BEF:",a),fs_1.default.appendFileSync(S,`[${(0,session_1.timestamp)()}] [ERROR]: \u8FDB\u7A0B\u9519\u8BEF: ${a.message}
19
- `,"utf-8"),d(a)})})}function injectSessionContext(e,t){const i=e.getConversationDir(t.conversationId),r=path_1.default.join(i,".claude");fs_1.default.existsSync(r)||fs_1.default.mkdirSync(r,{recursive:!0});const s=e.getConversationConfig(t.conversationId),c=e.config,I="<!-- cc-ding:session-context-start (DO NOT EDIT) -->",u="<!-- cc-ding:session-context-end (DO NOT EDIT) -->",m=[I,"# cc-ding Session Context","","## Client",`- clientId: \`${e.clientId}\``,c.clientName?`- clientName: ${c.clientName}`:"",`- owner: ${c.owner}`,"","## Conversation",`- conversationId: \`${t.conversationId}\``,s?.conversationType?`- conversationType: ${s.conversationType==="1"?"\u5355\u804A":"\u7FA4\u804A"}`:"",s?.conversationTitle?`- conversationTitle: ${s.conversationTitle}`:"",s?.linkConversationId?`- linkConversationId: \`${s.linkConversationId}\` (\u5173\u8054\u7FA4\uFF0C\u5171\u4EAB\u5DE5\u4F5C\u76EE\u5F55)`:"","","## Settings",s?.permissionMode?`- permissionMode: ${s.permissionMode}`:"",s?.agent?`- agent: ${s.agent}`:"",s?.taskCfg?.skill?`- taskCfg.skill: ${s.taskCfg.skill}`:"",c.resultOnly!==void 0?`- resultOnly: ${c.resultOnly}`:"",c.includeThinking!==void 0?`- includeThinking: ${c.includeThinking}`:"",c.preBash?`- preBash(\u5168\u5C40): \`${c.preBash}\``:"",s?.preBash?`- preBash(\u7FA4): \`${s.preBash}\``:"",u].filter(Boolean).join(`
5
+ ${a.thinking}
6
+ \`\`\``);if(m.length>0)return{type:"assistant",content:m.join(`
7
+ `)}}else if(n.content)return{type:"assistant",content:typeof n.content=="string"?n.content:JSON.stringify(n.content)};return{type:"assistant"}}if(n.type==="result"){const i=n.result||"";return{type:"result",content:typeof i=="string"?i:JSON.stringify(i)}}return{type:n.type||"unknown"}}catch{return{type:"text",content:t}}}function interruptClaudeProcess(t,e){return t.currentProcess?(console.log(`[${(0,session_1.timestamp)()}] ${e}`),t.interrupted=!0,t.currentProcess.kill("SIGINT"),!0):!1}function runClaudeOnce(t,e,n,i,m,a,$){let c=t.getSessionDir(e),u=`${c}/session.log`;fs_1.default.existsSync(c)||fs_1.default.mkdirSync(c,{recursive:!0});const y=Date.now();return new Promise((I,f)=>{const T=(0,child_process_1.spawn)(i,n,{cwd:m,stdio:["pipe","pipe","pipe"]}),E=t.activeSessions.get(e.conversationId);E&&(E.currentProcess=T,E.lastActivityTime=Date.now()),fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u542F\u52A8${$?" (\u91CD\u8BD5)":""}
8
+ `,"utf-8"),T.stdin?.write(`${a}
9
+ `),T.stdin?.end();let b=!$&&!!e.claudeSessionId,C=[],P="",x="",k=!1,h=!1,g=null;const v=new Set,A=()=>{E&&(E.lastActivityTime=Date.now())};g=setInterval(()=>{if(h){g&&clearInterval(g);return}const r=E?.lastActivityTime??y;if(Date.now()-r>=WATCHDOG_TIMEOUT_MS){console.warn(`[${(0,session_1.timestamp)()}] Watchdog: Claude \u8FDB\u7A0B ${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u901A\u77E5\u7528\u6237`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: Watchdog \u8D85\u65F6\uFF0C${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u5DF2\u901A\u77E5\u7528\u6237
10
+ `,"utf-8")}catch{}g&&clearInterval(g),g=null;const d=E?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:d,content:`\u23F0 Claude \u8FDB\u7A0B\u8D85\u8FC7 ${WATCHDOG_TIMEOUT_MS/1e3}s \u65E0\u54CD\u5E94\uFF0C\u53EF\u53D1\u9001 /goon \u5F3A\u5236\u91CD\u542F\u6062\u590D\uFF0C\u6216 /end \u7ED3\u675F\u4F1A\u8BDD`}).catch(l=>console.error("\u53D1\u9001 Watchdog \u901A\u77E5\u5931\u8D25:",l))}},WATCHDOG_CHECK_INTERVAL_MS),readline_1.default.createInterface({input:T.stdout}).on("line",r=>{if(x+=r+`
11
+ `,A(),t.debugLog(`Claude stdout: ${r.substring(0,200)}${r.length>200?"...":""}`),t.config.debug)try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [RAW]: ${r}
12
+ `,"utf-8")}catch{}const o=parseClaudeStreamLine(r,t.config.includeThinking??!1);if(o){if(o.type==="system"&&o.sessionId&&!b&&(t.updateSessionFile(e,{claudeSessionId:o.sessionId}),b=!0,c=t.getSessionDir(e),u=`${c}/session.log`),o.type==="assistant"){try{const l=JSON.parse(r)?.message?.content;if(Array.isArray(l)){for(const s of l)if(s.type==="tool_use"&&s.id&&!v.has(s.id)){v.add(s.id);const S=s.name||"unknown";let p="";s.input&&(s.input.command?p=s.input.command.substring(0,200):s.input.file_path?p=s.input.file_path:s.input.pattern?p=s.input.pattern:s.input.query?p=s.input.query:s.input.description?p=s.input.description:s.input.prompt?p=s.input.prompt.substring(0,200):p=JSON.stringify(s.input).substring(0,200)),t.appendSessionLog(c,"tool",`${S}${p?": "+p:""}`)}}}catch{}o.content&&C.push(o.content)}if(o.type==="result"){const d=t.config.resultOnly??!0,l=(o.content||"").trim(),s=C.join(`
13
+ `).trim(),S=d&&l||s;if(S&&!E?.interrupted){try{t.appendSessionLog(c,"assistant",S)}catch{}const w=t.activeSessions.get(e.conversationId)?.lastSenderStaffId||e.startStaffId;k=!0,(0,messaging_1.sendClaudeResponseToDing)(t,(0,session_1.getReplyConversationId)(e),(0,session_1.getReplyWebhook)(e),w,S).catch(R=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",R))}else console.warn(`[${(0,session_1.timestamp)()}] Claude \u8FD4\u56DE\u4E86\u7A7A\u7684 result \u4E14 responseBuffer \u4E5F\u4E3A\u7A7A\uFF0C\u65E0\u5185\u5BB9\u53EF\u53D1\u9001`);C=[]}}}),T.stderr?.on("data",r=>{const o=r.toString();if(P+=o,A(),(0,api_key_manager_1.isQuotaExhaustedError)(o)){console.log(`[${(0,session_1.timestamp)()}] [Claude stderr] \u914D\u989D\u8017\u5C3D\u9519\u8BEF(429): ${o.trim()}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [WARN]: ${o}`,"utf-8")}catch{}}else if(isRetryableApiError(o)){console.log(`[${(0,session_1.timestamp)()}] [Claude stderr] \u53EF\u91CD\u8BD5API\u9519\u8BEF(422 TPM\u9650\u6D41): ${o.trim()}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [WARN]: ${o}`,"utf-8")}catch{}}else{console.error(`[Claude stderr]: ${o}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [ERROR]: ${o}`,"utf-8")}catch{}}}),T.on("close",r=>{h=!0,g&&(clearInterval(g),g=null),console.log(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${r}`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u7ED3\u675F\uFF0C\u9000\u51FA\u7801: ${r}
14
+ `,"utf-8")}catch{}const o=t.activeSessions.get(e.conversationId);if(o&&(o.currentProcess=void 0),o?.interrupted){console.log(`[${(0,session_1.timestamp)()}] \u7528\u6237\u4E3B\u52A8\u4E2D\u65AD\uFF0C\u4E22\u5F03 responseBuffer (${C.length} \u6BB5)`),o.interrupted=!1,C=[],I(0);return}if(C.length>0){const l=C.join(`
15
+ `).trim();if(l){try{t.appendSessionLog(c,"assistant",l)}catch{}const s=o?.lastSenderStaffId||e.startStaffId;k=!0,(0,messaging_1.sendClaudeResponseToDing)(t,(0,session_1.getReplyConversationId)(e),(0,session_1.getReplyWebhook)(e),s,l).catch(S=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",S))}}if(r===0&&!k&&!o?.interrupted){console.warn(`[${(0,session_1.timestamp)()}] Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [WARN]: Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9
16
+ `,"utf-8")}catch{}const l=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:l,content:"\u26A0\uFE0F Claude \u5904\u7406\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u4EFB\u4F55\u5185\u5BB9\uFF0C\u8BF7\u91CD\u8BD5\u6216\u6362\u79CD\u65B9\u5F0F\u63D0\u95EE"}).catch(s=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",s))}if(r===0){I(0);return}const d=P+`
17
+ `+x;if((0,api_key_manager_1.isQuotaExhaustedError)(d)){const s=Date.now()-y<FAST_FAIL_THRESHOLD_MS;console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u914D\u989D\u8017\u5C3D\u9519\u8BEF(429)\uFF0Cstdout\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(x)}, stderr\u5339\u914D=${(0,api_key_manager_1.isQuotaExhaustedError)(P)}`),f(new RetryableApiError(s,d));return}if((0,api_key_manager_1.isAuthenticationError)(d)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u901A\u77E5\u7528\u6237`);const l=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:l,content:"\u26A0\uFE0F \u8BA4\u8BC1\u5931\u8D25(401)\uFF0CAPI Key \u65E0\u6548\u6216\u670D\u52A1\u672A\u6388\u6743\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E"}).catch(s=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",s)),I(r??1);return}if(isRetryableApiError(d)){const s=Date.now()-y<FAST_FAIL_THRESHOLD_MS;f(new RetryableApiError(s,d));return}if(isPermissionError(d)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u9700\u8981\u6388\u6743\uFF0C\u901A\u77E5\u7528\u6237`);const l=o?.lastSenderStaffId||e.startStaffId;(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:l,content:"\u26A0\uFE0F Claude \u9700\u8981\u6388\u6743\uFF0C\u8BF7\u4EBA\u5DE5\u4ECB\u5165"}).catch(s=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",s)),I(r??1);return}if(e.claudeSessionId&&isConversationNotFoundError(d)){console.log(`[${(0,session_1.timestamp)()}] Claude \u4F1A\u8BDD\u5DF2\u5931\u6548: ${e.claudeSessionId}\uFF0C\u901A\u77E5\u5916\u5C42\u91CD\u65B0\u53D1\u8D77\u65B0\u4F1A\u8BDD`),f(new ConversationNotFoundError);return}if(isContextWindowExceededError(d)){console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\u9519\u8BEF(400)\uFF0C\u5C06\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587`);try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u5C06\u81EA\u52A8 /compact
18
+ `,"utf-8")}catch{}f(new ContextWindowExceededError);return}f(new Error(`Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${r}`))}),T.on("error",r=>{h=!0,g&&(clearInterval(g),g=null),console.error("Claude \u8FDB\u7A0B\u9519\u8BEF:",r),fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [ERROR]: \u8FDB\u7A0B\u9519\u8BEF: ${r.message}
19
+ `,"utf-8"),f(r)})})}const START_MARK="<!-- cc-ding:session-context-start (DO NOT EDIT) -->",END_MARK="<!-- cc-ding:session-context-end (DO NOT EDIT) -->";function buildContextContent(t,e){const n=t.getConversationConfig(e),i=t.config;return[START_MARK,"# cc-ding Session Context","","## Client",`- clientId: \`${t.clientId}\``,i.clientName?`- clientName: ${i.clientName}`:"",`- owner: ${i.owner}`,"","## Conversation",`- conversationId: \`${e}\``,n?.conversationType?`- conversationType: ${n.conversationType==="1"?"\u5355\u804A":"\u7FA4\u804A"}`:"",n?.conversationTitle?`- conversationTitle: ${n.conversationTitle}`:"",n?.linkConversationId?`- linkConversationId: \`${n.linkConversationId}\` (\u5173\u8054\u7FA4\uFF0C\u5171\u4EAB\u5DE5\u4F5C\u76EE\u5F55)`:"","","## Settings",n?.permissionMode?`- permissionMode: ${n.permissionMode}`:"",n?.agent?`- agent: ${n.agent}`:"",n?.taskCfg?.skill?`- taskCfg.skill: ${n.taskCfg.skill}`:"",i.resultOnly!==void 0?`- resultOnly: ${i.resultOnly}`:"",i.includeThinking!==void 0?`- includeThinking: ${i.includeThinking}`:"",i.preBash?`- preBash(\u5168\u5C40): \`${i.preBash}\``:"",n?.preBash?`- preBash(\u7FA4): \`${n.preBash}\``:"","","## DingTalk Context",'\u5F53 prompt \u4E2D\u5305\u542B "\u6D88\u606F\u6765\u81EA: xxx(\u7528\u6237ID)" \u65F6\uFF0C\u8BF4\u660E\u6D88\u606F\u6765\u81EA\u9489\u9489\u7528\u6237\u3002',"- \u56DE\u7B54\u65F6\u8981\u8003\u8651\u7528\u6237\u7684\u4F7F\u7528\u573A\u666F\uFF08\u9489\u9489\u804A\u5929\u754C\u9762\uFF0C\u975E\u7EC8\u7AEF\u73AF\u5883\uFF09","- \u7528\u6237\u4E00\u822C\u60C5\u51B5\u4E0B\u53EA\u80FD\u901A\u8FC7 cc-ding \u8FDB\u884C\u64CD\u4F5C","- cc-ding \u6587\u6863: https://github.com/yihuineng/cc-ding",END_MARK].filter(Boolean).join(`
20
20
  `)+`
21
- `,g=path_1.default.join(r,"CLAUDE.md");if(!fs_1.default.existsSync(g)){fs_1.default.writeFileSync(g,m,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u5199\u5165 CLAUDE.md: ${g}`);return}const d=fs_1.default.readFileSync(g,"utf-8"),C=d.indexOf(I),v=d.indexOf(u);if(C!==-1&&v!==-1&&v>C){const A=d.substring(0,C),w=d.substring(v+u.length),k=A+m+w;fs_1.default.writeFileSync(g,k,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u66F4\u65B0: ${g}`)}else fs_1.default.writeFileSync(g,m+`
22
- `+d,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u8FFD\u52A0\u5230\u73B0\u6709 CLAUDE.md: ${g}`)}async function executeClaudeQuery(e,t,i,r){const{skill:s,agent:c,senderNick:I,senderStaffId:u}=r||{};let S=e.getSessionDir(t),m=`${S}/session.log`;const g=e.getConversationDir(t.conversationId);injectSessionContext(e,t),fs_1.default.mkdirSync(S,{recursive:!0});let d=null;const C=(0,api_key_manager_1.readApiKeyFromSettings)(g);if(C&&e.config.apiKeyCfg&&(d=e.config.apiKeyCfg.claudeSettings.find(n=>n.apiKey===C&&n.isValid)||null,d&&console.log(`[${(0,session_1.timestamp)()}] \u4ECE settings-ding.json \u6062\u590D Claude Setting: ${(0,api_key_manager_1.settingLabel)(d)}`)),!(0,api_key_manager_1.getForceEnabledSettingsPath)(g)&&e.config.apiKeyCfg&&(d=(0,api_key_manager_1.pickValidApiKey)(e),!d)){const n=u||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:n,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D\uFF08\u65E0\u53EF\u7528 API Key\uFF09\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}const A=I&&u?`${i} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${I}(${u})`:i;e.appendSessionLog(S,"user",A);const w="claude",R=["--permission-mode",r?.permissionMode??"bypassPermissions","--print","--output-format","stream-json","--verbose"];c&&R.push("--agent",c);const P=s?`/${s} ${A}`:A;let h=0,y=0,E=0;const M=[],F=e.activeSessions.get(t.conversationId),a=n=>{const l=e.activeSessions.get(t.conversationId);return!l||l!==F?(console.log(`[${(0,session_1.timestamp)()}] \u4F1A\u8BDD\u5DF2\u88AB\u7EC8\u6B62\uFF0C${n}`),!1):l.goonPending?(console.log(`[${(0,session_1.timestamp)()}] \u6536\u5230 /goon \u8BF7\u6C42\uFF0C${n}`),!1):!0};for(;;){if(!a("\u505C\u6B62\u91CD\u8BD5"))return;const n=h>0;if(y>=MAX_TOTAL_RETRIES||y>=3&&E>0&&Date.now()-E>MAX_RETRY_DURATION_MS){const $=y>=MAX_TOTAL_RETRIES?`\u603B\u91CD\u8BD5\u6B21\u6570\u5DF2\u8FBE ${MAX_TOTAL_RETRIES} \u6B21`:`\u91CD\u8BD5\u6301\u7EED\u65F6\u95F4\u8D85\u8FC7 ${MAX_RETRY_DURATION_MS/1e3}s\uFF08\u5DF2\u91CD\u8BD5 ${y} \u6B21\uFF09`;console.error(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF: ${$}`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF\uFF0C${$}\uFF0C\u7EC8\u6B62\u91CD\u8BD5
23
- `,"utf-8");const f=readLastLogLines(m,1),T=M.slice(-1)[0]||"",x=u||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:x,content:`\u{1F504} \u68C0\u6D4B\u5230 Claude \u9677\u5165\u65E0\u9650\u91CD\u8BD5\uFF0C\u5DF2\u7EC8\u6B62\uFF08${$}\uFF09
21
+ `}function writeContextToFile(t,e,n){const i=t.getConversationDir(e),m=path_1.default.join(i,".claude");fs_1.default.existsSync(m)||fs_1.default.mkdirSync(m,{recursive:!0});const a=path_1.default.join(m,"CLAUDE.md");if(!fs_1.default.existsSync(a)){fs_1.default.writeFileSync(a,n,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u6CE8\u5165 CLAUDE.md: ${a}`);return}const $=fs_1.default.readFileSync(a,"utf-8"),c=$.indexOf(START_MARK),u=$.indexOf(END_MARK);if(c!==-1&&u!==-1&&u>c){const y=$.substring(0,c),I=$.substring(u+END_MARK.length),f=y+n+I;fs_1.default.writeFileSync(a,f,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u66F4\u65B0: ${a}`)}else fs_1.default.writeFileSync(a,n+`
22
+ `+$,"utf-8"),console.log(`[${(0,session_1.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u8FFD\u52A0\u5230\u73B0\u6709 CLAUDE.md: ${a}`)}function injectStartupContexts(t){const e=Array.isArray(t.config.conversations)?t.config.conversations:[];for(const n of e){const i=buildContextContent(t,n.conversationId);injectedContextCache.set(n.conversationId,i),writeContextToFile(t,n.conversationId,i)}}function injectSessionContextIfChanged(t,e){const n=e.conversationId,i=buildContextContent(t,n);injectedContextCache.get(n)!==i&&(injectedContextCache.set(n,i),writeContextToFile(t,n,i))}async function executeClaudeQuery(t,e,n,i){const{skill:m,agent:a,senderNick:$,senderStaffId:c}=i||{};let u=t.getSessionDir(e),y=`${u}/session.log`;const I=t.getConversationDir(e.conversationId);injectSessionContextIfChanged(t,e),fs_1.default.mkdirSync(u,{recursive:!0});let f=null;const T=(0,api_key_manager_1.readApiKeyFromSettings)(I);if(T&&t.config.apiKeyCfg&&(f=t.config.apiKeyCfg.claudeSettings.find(o=>o.apiKey===T&&o.isValid)||null,f&&console.log(`[${(0,session_1.timestamp)()}] \u4ECE settings-ding.json \u6062\u590D Claude Setting: ${(0,api_key_manager_1.settingLabel)(f)}`)),!(0,api_key_manager_1.getForceEnabledSettingsPath)(I)&&t.config.apiKeyCfg&&(f=(0,api_key_manager_1.pickValidApiKey)(t),!f)){const o=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:o,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D\uFF08\u65E0\u53EF\u7528 API Key\uFF09\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}const b=$&&c?`${n} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${$}(${c})`:n;t.appendSessionLog(u,"user",b);const C="claude",x=["--permission-mode",i?.permissionMode??"bypassPermissions","--print","--output-format","stream-json","--verbose"];a&&x.push("--agent",a);const k=m?`/${m} ${b}`:b;let h=0,g=0,v=0;const A=[],D=t.activeSessions.get(e.conversationId),r=o=>{const d=t.activeSessions.get(e.conversationId);return!d||d!==D?(console.log(`[${(0,session_1.timestamp)()}] \u4F1A\u8BDD\u5DF2\u88AB\u7EC8\u6B62\uFF0C${o}`),!1):d.goonPending?(console.log(`[${(0,session_1.timestamp)()}] \u6536\u5230 /goon \u8BF7\u6C42\uFF0C${o}`),!1):!0};for(;;){if(!r("\u505C\u6B62\u91CD\u8BD5"))return;const o=h>0;if(g>=MAX_TOTAL_RETRIES||g>=3&&v>0&&Date.now()-v>MAX_RETRY_DURATION_MS){const S=g>=MAX_TOTAL_RETRIES?`\u603B\u91CD\u8BD5\u6B21\u6570\u5DF2\u8FBE ${MAX_TOTAL_RETRIES} \u6B21`:`\u91CD\u8BD5\u6301\u7EED\u65F6\u95F4\u8D85\u8FC7 ${MAX_RETRY_DURATION_MS/1e3}s\uFF08\u5DF2\u91CD\u8BD5 ${g} \u6B21\uFF09`;console.error(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF: ${S}`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF\uFF0C${S}\uFF0C\u7EC8\u6B62\u91CD\u8BD5
23
+ `,"utf-8");const p=readLastLogLines(y,1),w=A.slice(-1)[0]||"",R=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:R,content:`\u{1F504} \u68C0\u6D4B\u5230 Claude \u9677\u5165\u65E0\u9650\u91CD\u8BD5\uFF0C\u5DF2\u7EC8\u6B62\uFF08${S}\uFF09
24
24
 
25
25
  \u{1F4CB} \u6700\u8FD1\u91CD\u8BD5\u8BB0\u5F55\uFF1A
26
- ${T}
26
+ ${w}
27
27
 
28
28
  \u{1F4DD} \u6700\u8FD1\u65E5\u5FD7\uFF1A
29
29
  \`\`\`
30
- ${f}
30
+ ${p}
31
31
  \`\`\`
32
32
 
33
- \u{1F4A1} \u53EF\u5C1D\u8BD5\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD\uFF0C\u6216 /end \u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD`});return}const l=[...R];t.claudeSessionId&&(l.push("--resume",t.claudeSessionId),n||console.log(`[${(0,session_1.timestamp)()}] \u6062\u590D Claude \u4F1A\u8BDD: ${t.claudeSessionId}`));const p=resolveClaudeSettingsPath(e,g,r?.settings);p&&l.push("--settings",p);let o;n?(o="\u7EE7\u7EED",console.log(`[${(0,session_1.timestamp)()}] \u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${h}/${MAX_FAST_FAIL}\u6B21)`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${h}/${MAX_FAST_FAIL})
34
- `,"utf-8")):o=P,console.log(`[${(0,session_1.timestamp)()}] \u6267\u884C Claude \u67E5\u8BE2[\u539F\u751Fclaude \u6A21\u5F0F]: ${w} ${l.join(" ")}`),e.debugLog(`\u53D1\u9001\u6D88\u606F: ${o.substring(0,100)}...`);try{await runClaudeOnce(e,t,l,w,g,o,n);return}catch($){if(S=e.getSessionDir(t),m=`${S}/session.log`,$ instanceof RetryableApiError){if(y++,E=E||Date.now(),(0,api_key_manager_1.isQuotaExhaustedError)($.output)&&e.config.apiKeyCfg){if(M.push(`[${(0,session_1.timestamp)()}] 429 \u914D\u989D\u8017\u5C3D\uFF0C\u5C1D\u8BD5\u8F6E\u6362 Key`),d){const T=(0,api_key_manager_1.rotateApiKey)(e,d.apiKey);if(T){d=T,h=0,console.log(`[${(0,session_1.timestamp)()}] API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(T)}`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key
35
- `,"utf-8");continue}}const f=u||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:f,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D/API Key\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}if($.isFastFail){if(h++,h>=MAX_FAST_FAIL){if(d&&e.config.apiKeyCfg){const f=(0,api_key_manager_1.rotateApiKey)(e,d.apiKey);if(f){d=f,h=0,console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25 ${MAX_FAST_FAIL} \u6B21\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(f)}`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25\uFF0C\u5207\u6362\u5230\u65B0 Key
36
- `,"utf-8");continue}}throw console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03
37
- `,"utf-8"),new Error(`TPM \u9650\u6D41\uFF0C\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED ${MAX_FAST_FAIL} \u6B21`)}console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5 (${h}/${MAX_FAST_FAIL})`)}else h=0,console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u8FDB\u7A0B\u5DF2\u8FD0\u884C\u4E00\u6BB5\u65F6\u95F4)\uFF0C\u91CD\u7F6E\u5FEB\u901F\u5931\u8D25\u8BA1\u6570\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`);if(fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5
38
- `,"utf-8"),M.push(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`),await sleep(API_RETRY_DELAY_MS),!a("\u505C\u6B62\u5F53\u524D\u91CD\u8BD5"))return;continue}if($ instanceof ConversationNotFoundError){y++,E=E||Date.now(),M.push(`[${(0,session_1.timestamp)()}] \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD`),console.log(`[${(0,session_1.timestamp)()}] Claude \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664 claudeSessionId \u5E76\u91CD\u65B0\u53D1\u8D77`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u4F1A\u8BDD\u5DF2\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD\u5E76\u91CD\u65B0\u53D1\u8D77
39
- `,"utf-8"),t.claudeSessionId&&(t.claudeSessionId=void 0,e.updateSessionFile(t,{})),h=0;continue}if($ instanceof ContextWindowExceededError){y++,E=E||Date.now(),M.push(`[${(0,session_1.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8 /compact`),console.log(`[${(0,session_1.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587
40
- `,"utf-8");const f=u||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:f,content:"\u{1F4E6} \u4E0A\u4E0B\u6587\u8D85\u957F\uFF0C\u6B63\u5728\u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u540E\u7EE7\u7EED..."});const T=[...R];t.claudeSessionId&&T.push("--resume",t.claudeSessionId);const x=resolveClaudeSettingsPath(e,g,r?.settings);x&&T.push("--settings",x);try{await runClaudeOnce(e,t,T,w,g,"/compact",!1),console.log(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C`),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C
41
- `,"utf-8")}catch(b){throw console.error(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u5931\u8D25:`,b),fs_1.default.appendFileSync(m,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u5931\u8D25: ${b instanceof Error?b.message:String(b)}
42
- `,"utf-8"),await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:f,content:"\u274C \u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u53D1\u9001 /compact \u6216 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD"}),new Error(`\u4E0A\u4E0B\u6587\u8D85\u957F\u4E14 /compact \u5931\u8D25: ${b instanceof Error?b.message:String(b)}`)}h=0;continue}throw $}}}
33
+ \u{1F4A1} \u53EF\u5C1D\u8BD5\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD\uFF0C\u6216 /end \u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD`});return}const d=[...x];e.claudeSessionId&&(d.push("--resume",e.claudeSessionId),o||console.log(`[${(0,session_1.timestamp)()}] \u6062\u590D Claude \u4F1A\u8BDD: ${e.claudeSessionId}`));const l=resolveClaudeSettingsPath(t,I,i?.settings);l&&d.push("--settings",l);let s;o?(s="\u7EE7\u7EED",console.log(`[${(0,session_1.timestamp)()}] \u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${h}/${MAX_FAST_FAIL}\u6B21)`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${h}/${MAX_FAST_FAIL})
34
+ `,"utf-8")):s=k,console.log(`[${(0,session_1.timestamp)()}] \u6267\u884C Claude \u67E5\u8BE2[\u539F\u751Fclaude \u6A21\u5F0F]: ${C} ${d.join(" ")}`),t.debugLog(`\u53D1\u9001\u6D88\u606F: ${s.substring(0,100)}...`);try{await runClaudeOnce(t,e,d,C,I,s,o);return}catch(S){if(u=t.getSessionDir(e),y=`${u}/session.log`,S instanceof RetryableApiError){if(g++,v=v||Date.now(),(0,api_key_manager_1.isQuotaExhaustedError)(S.output)&&t.config.apiKeyCfg){if(A.push(`[${(0,session_1.timestamp)()}] 429 \u914D\u989D\u8017\u5C3D\uFF0C\u5C1D\u8BD5\u8F6E\u6362 Key`),f){const w=(0,api_key_manager_1.rotateApiKey)(t,f.apiKey);if(w){f=w,h=0,console.log(`[${(0,session_1.timestamp)()}] API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(w)}`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key
35
+ `,"utf-8");continue}}const p=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:p,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D/API Key\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}if(S.isFastFail){if(h++,h>=MAX_FAST_FAIL){if(f&&t.config.apiKeyCfg){const p=(0,api_key_manager_1.rotateApiKey)(t,f.apiKey);if(p){f=p,h=0,console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25 ${MAX_FAST_FAIL} \u6B21\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,api_key_manager_1.settingLabel)(p)}`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25\uFF0C\u5207\u6362\u5230\u65B0 Key
36
+ `,"utf-8");continue}}throw console.log(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${MAX_FAST_FAIL}\u6B21\uFF0C\u653E\u5F03
37
+ `,"utf-8"),new Error(`TPM \u9650\u6D41\uFF0C\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED ${MAX_FAST_FAIL} \u6B21`)}console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5 (${h}/${MAX_FAST_FAIL})`)}else h=0,console.log(`[${(0,session_1.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u8FDB\u7A0B\u5DF2\u8FD0\u884C\u4E00\u6BB5\u65F6\u95F4)\uFF0C\u91CD\u7F6E\u5FEB\u901F\u5931\u8D25\u8BA1\u6570\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`);if(fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5
38
+ `,"utf-8"),A.push(`[${(0,session_1.timestamp)()}] TPM \u9650\u6D41\uFF0C${API_RETRY_DELAY_MS/1e3}s \u540E\u91CD\u8BD5`),await sleep(API_RETRY_DELAY_MS),!r("\u505C\u6B62\u5F53\u524D\u91CD\u8BD5"))return;continue}if(S instanceof ConversationNotFoundError){g++,v=v||Date.now(),A.push(`[${(0,session_1.timestamp)()}] \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD`),console.log(`[${(0,session_1.timestamp)()}] Claude \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664 claudeSessionId \u5E76\u91CD\u65B0\u53D1\u8D77`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u4F1A\u8BDD\u5DF2\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD\u5E76\u91CD\u65B0\u53D1\u8D77
39
+ `,"utf-8"),e.claudeSessionId&&(e.claudeSessionId=void 0,t.updateSessionFile(e,{})),h=0;continue}if(S instanceof ContextWindowExceededError){g++,v=v||Date.now(),A.push(`[${(0,session_1.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8 /compact`),console.log(`[${(0,session_1.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587
40
+ `,"utf-8");const p=c||e.startStaffId;await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:p,content:"\u{1F4E6} \u4E0A\u4E0B\u6587\u8D85\u957F\uFF0C\u6B63\u5728\u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u540E\u7EE7\u7EED..."});const w=[...x];e.claudeSessionId&&w.push("--resume",e.claudeSessionId);const R=resolveClaudeSettingsPath(t,I,i?.settings);R&&w.push("--settings",R);try{await runClaudeOnce(t,e,w,C,I,"/compact",!1),console.log(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C`),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C
41
+ `,"utf-8")}catch(M){throw console.error(`[${(0,session_1.timestamp)()}] /compact \u6267\u884C\u5931\u8D25:`,M),fs_1.default.appendFileSync(y,`[${(0,session_1.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u5931\u8D25: ${M instanceof Error?M.message:String(M)}
42
+ `,"utf-8"),await(0,messaging_1.sendDingMessage)(t,{conversationId:(0,session_1.getReplyConversationId)(e),sessionWebhook:(0,session_1.getReplyWebhook)(e),atUserId:p,content:"\u274C \u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u53D1\u9001 /compact \u6216 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD"}),new Error(`\u4E0A\u4E0B\u6587\u8D85\u957F\u4E14 /compact \u5931\u8D25: ${M instanceof Error?M.message:String(M)}`)}h=0;continue}throw S}}}
@@ -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 n of e.examples)t.push(`- \`${n}\``);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,n,s){const r=[`- **\u7FA4ID:** ${t}`];if(e.conversationTitle&&r.push(`- **\u7FA4\u540D\u79F0:** ${e.conversationTitle}`),e.conversationType&&r.push(`- **\u4F1A\u8BDD\u7C7B\u578B:** ${e.conversationType==="1"?"\u5355\u804A":e.conversationType==="2"?"\u7FA4\u804A":e.conversationType}`),s&&r.push(`- **\u5DE5\u4F5C\u76EE\u5F55:** \`${s}\``),e.linkConversationId&&r.push(`- **\u5173\u8054\u4F1A\u8BDDID:** ${e.linkConversationId}`),e.agent&&r.push(`- **agent:** ${e.agent}`),e.dingToken&&r.push(`- **dingToken:** ${e.dingToken.substring(0,8)}...`),e.whiteUserList?.length){const o=e.whiteUserList.map(i=>n?.(i)||i).join(", ");r.push(`- **\u7FA4\u767D\u540D\u5355:** ${o}`)}return e.atSender===!1&&r.push("- **atSender:** false"),e.receiveReply===!1&&r.push("- **receiveReply:** false (\u4E0D\u56DE\u590D\u786E\u8BA4\u6D88\u606F)"),e.useLocalOcr===!1&&r.push("- **\u672C\u5730OCR:** \u5173\u95ED"),e.permissionMode&&r.push(`- **permissionMode:** ${e.permissionMode}`),e.taskCfg?.skill&&r.push(`- **taskSkill:** ${e.taskCfg.skill}`),e.preBash&&r.push(`- **preBash:** \`${e.preBash}\``),r.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 n=e.apiKeyCfg.claudeSettings.filter(s=>s.isValid).length;t.push(`- **apiKeyCfg:** ${n}/${e.apiKeyCfg.claudeSettings.length} \u6709\u6548`),t.push(` - **\u6700\u8FD1\u91CD\u7F6E:** ${e.apiKeyCfg.resetTime||"-"}`)}return t.join(`
5
- `)}function parseLogCommand(e){const n=e.trim().match(/^\/log(?:\s+(\d+))?$/i);if(!n)return null;const s=parseInt(n[1],10);return isNaN(s)||s<=0?10:s}function parseLsCommand(e){const n=e.trim().match(/^\/ls(?:\s+(.+))?$/i);if(!n)return null;if(n[1]===void 0)return{target:"",depth:1};const s=n[1].trim().split(/\s+/),r=s[0]||"",o=s[1]?parseInt(s[1],10):1;return{target:r,depth:isNaN(o)||o<0?1:Math.min(o,5)}}function findSubdirByName(e,t,n=3){const s=[{dir:e,depth:0}];for(;s.length>0;){const{dir:r,depth:o}=s.shift();if(!(o>n))try{const i=fs_1.default.readdirSync(r,{withFileTypes:!0});for(const a of i)if(!(!a.isDirectory()||a.name.startsWith("."))){if(a.name===t)return path_1.default.join(r,a.name);s.push({dir:path_1.default.join(r,a.name),depth:o+1})}}catch{continue}}return null}function getDirectoryStructure(e,t=0,n=1){try{const s=fs_1.default.readdirSync(e,{withFileTypes:!0}).filter(i=>!i.name.startsWith("."));if(s.length===0)return t===0?"\u{1F4C2} \u76EE\u5F55\u4E3A\u7A7A":"";s.sort((i,a)=>i.isDirectory()!==a.isDirectory()?i.isDirectory()?-1:1:i.name.localeCompare(a.name));const r=[],o=". ".repeat(t);for(const i of s){const a=i.isDirectory()?"\u{1F4C1} ":"\u{1F4C4} ",d=i.isDirectory()?"/":"";if(r.push(`${o}${a}${i.name}${d}`),i.isDirectory()&&t<n){const u=path_1.default.join(e,i.name),m=getDirectoryStructure(u,t+1,n);m&&r.push(m)}}return r.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(n=>/^[\d*/\-]+$/.test(n))}function parseCronCommand(e){const t=e.trim();if(!t.toLowerCase().startsWith("/cron"))return null;const n=t.substring(5).trim();if(!n)return null;if(/^(list|ls)$/i.test(n))return{type:"list"};const s=n.match(/^(?:delete|rm)\s+(\S+)$/i);if(s)return{type:"delete",id:s[1]};const r=n.match(/^pause\s+(\S+)$/i);if(r)return{type:"pause",id:r[1]};const o=n.match(/^resume\s+(\S+)$/i);if(o)return{type:"resume",id:o[1]};const i=n.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:n}}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 n=t.substring(4).trim();if(!n)return{};if(/^--help$/i.test(n))return null;const s={},r=n.split(/\s+/);for(let o=0;o<r.length;o++){const i=r[o];if(i==="--dingToken"&&r[o+1])s.dingToken=r[++o];else if(i==="--linkConversationId"&&r[o+1])s.linkConversationId=r[++o];else if(i==="--conversationId"&&r[o+1])s.conversationId=r[++o];else if(i==="--whiteUserList"&&r[o+1])s.whiteUserList=r[++o].split(",").map(a=>a.trim()).filter(Boolean);else if(i==="--conversationTitle"&&r[o+1]){const a=[];for(;o+1<r.length&&!r[o+1].startsWith("--");)a.push(r[++o]);a.length>0&&(s.conversationTitle=a.join(" "))}else if(i==="--atSender"&&r[o+1]){const a=r[++o].toLowerCase();s.atSender=a==="true"||a==="1"||a==="yes"}else if(i==="--receiveReply"&&r[o+1]){const a=r[++o].toLowerCase();s.receiveReply=a==="true"||a==="1"||a==="yes"}else if(i==="--preBash"&&r[o+1]){const a=[];for(;o+1<r.length&&!r[o+1].startsWith("--");)a.push(r[++o]);a.length>0&&(s.preBash=a.join(" ").replace(/^["']|["']$/g,""))}else i==="--permissionMode"&&r[o+1]&&(s.permissionMode=r[++o])}return s}function parseBashCommand(e){const n=e.trim().match(/^\/bash\s+(.+)$/i);return n&&n[1].trim()||null}function parseMqCommand(e){const t=e.trim();if(!/^\/mq(?:\s|$)/i.test(t)&&t.toLowerCase()!=="/mq")return null;const n=t.substring(3).trim();if(!n)return{type:"list"};if(/^front$/i.test(n))return{type:"front"};const s=n.match(/^rm\s+(.+)$/i);if(s){const o=s[1].trim();if(/^all$/i.test(o))return{type:"cancelAll"};const i=[],a=o.match(/^(\d+)\s*-\s*(\d+)$/);if(a){const u=parseInt(a[1],10),m=parseInt(a[2],10);if(u>0&&m>=u){for(let c=u;c<=m;c++)i.push(c);return{type:"rm",indices:i}}}const d=o.split(/\s+/);for(const u of d){const m=parseInt(u,10);m>0&&i.push(m)}if(i.length>0)return{type:"rm",indices:i}}const r=n.match(/^-n\s+(\d+)$/i);if(r){const o=parseInt(r[1],10);return o>0?{type:"cancel",count:o}:{type:"list"}}return/^-all$/i.test(n)?{type:"cancelAll"}:null}function parseAuthCommand(e){const t=e.trim(),n=t.match(/^\/auth\s+admin\s+add\s+(\S+)$/i);if(n)return{type:"adminAdd",staffId:n[1]};const s=t.match(/^\/auth\s+admin\s+(?:rm|del)\s+(\S+)$/i);if(s)return{type:"adminRm",staffId:s[1]};if(/^\/auth\s+admin(?:\s+list)?$/i.test(t))return{type:"adminList"};const r=t.match(/^\/auth\s+add\s+(\S+)$/i);if(r)return{type:"add",staffId:r[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 n=e.trim().match(/^\/cc\s+(.+)$/i);if(!n)return null;const s=n[1].trim();return s.startsWith("/")?s:`/${s}`}function parseClaudeMdCommand(e){return/^\/claude\.md$/i.test(e.trim())}function parseInterruptCommand(e){return e.trim()==="/!"}function parseTodoCommand(e){const t=e.trim();if(!/^\/todo(?:\s|$)/i.test(t)&&t.toLowerCase()!=="/todo")return null;const n=t.substring(5).trim();if(/^list$/i.test(n))return{type:"list"};if(!n)return{type:"list"};const s=n.match(/^done\s+(\d+)$/i);if(s)return{type:"done",index:parseInt(s[1],10)};if(/^rm\s+all$/i.test(n))return{type:"remove",index:"all"};const r=n.match(/^rm\s+(\d+)$/i);if(r)return{type:"remove",index:parseInt(r[1],10)};if(/^remind\s+-1$/i.test(n))return{type:"remind",hour:null};const o=n.match(/^remind\s+(\d+)$/i);if(o){const c=parseInt(o[1],10);return c>=0&&c<=23?{type:"remind",hour:c}:null}let i=n,a,d;const u=i.match(/@(\S+)/);u&&(a=u[1],i=i.replace(/@\S+/,"").trim());const m=i.match(/\bddl\s+(.+)$/i);return m&&(d=m[1].trim(),i=i.replace(/\bddl\s+.+$/i,"").trim()),i?{type:"add",content:i,assigneeStaffId:a,deadline:d}:null}function parseMenuCommand(e){const t=e.trim();if(!/^\/menu(?:\s|$)/i.test(t)&&t.toLowerCase()!=="/menu")return null;const n=t.substring(5).trim(),s=n.startsWith("-g "),r=s?n.substring(3).trim():n;if(!n)return{type:"show"};if(s&&!r)return{type:"list",isGlobal:!0};const o=r.match(/^trigger\s+(\S+)$/i);if(o&&!s)return{type:"trigger",word:o[1]};const i=r.match(/^add\s+(.+)$/i);if(i)return{type:"add",command:i[1].trim(),isGlobal:s};const a=r.match(/^del(?:ete)?\s+(\d+)$/i);return a?{type:"del",index:parseInt(a[1],10),isGlobal:s}:/^list$/i.test(r)?{type:"list",isGlobal:s}:s?null:{type:"show"}}function parseRebootCommand(e){const t=e.trim();if(!/^\/reboot(?:\s|$)/i.test(t))return null;const n=t.substring(7).trim();if(!n)return{update:!1};const s=n.match(/^--update(?:\s+(\S+))?$/i);return s?{update:!0,tag:s[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}
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.baseUtil.sleep(500)}}}async function sendMessageToUser(e,t,r,n="text"){if(!e.config.enableMsgToUser)return console.log(`[sendMessageToUser] enableMsgToUser \u672A\u5F00\u542F\uFF0C\u8DF3\u8FC7\u53D1\u9001 (userId=${t})`),!1;try{const o=await e.dingStreamClient.getAccessToken(),s=n==="markdown"?"sampleMarkdown":"sampleText",a=JSON.stringify(n==="markdown"?{title:"notification",text:r}:{content:r}),i=await urllib_1.default.request(`${DING_API_BASE}/v1.0/robot/oToMessages/batchSend`,{method:"POST",data:{robotCode:e.clientId,userIds:[t],msgKey:s,msgParam:a},contentType:"json",headers:{"x-acs-dingtalk-access-token":o},dataType:"json"});return i.status===200?!0:(console.error(`sendMessageToUser API \u8FD4\u56DE\u975E200: status=${i.status}, userId=${t}`),!1)}catch(o){return console.error(`sendMessageToUser \u5931\u8D25 (userId=${t}):`,o),!1}}async function sendOwnerMessage(e,t,r="text"){const{ownerConversationId:n,owner:o}=e.config;if(!n||!o)return!1;const s=await queryUserIdByMobile(e,o);return s?sendMessageToUser(e,s,t,r):(console.error(`sendOwnerMessage: \u65E0\u6CD5\u5C06\u624B\u673A\u53F7 ${o} \u89E3\u6790\u4E3A Ding userId`),!1)}
6
+ `:"";await sendDingMessage(e,{conversationId:t,sessionWebhook:r,atUserId:c===i.length-1?n:"",content:l+i[c],msgType:"markdown"}),c<i.length-1&&await utils_ok_1.asyncUtil.sleep(500)}}}async function sendMessageToUser(e,t,r,n="text"){if(!e.config.enableMsgToUser)return console.log(`[sendMessageToUser] enableMsgToUser \u672A\u5F00\u542F\uFF0C\u8DF3\u8FC7\u53D1\u9001 (userId=${t})`),!1;try{const o=await e.dingStreamClient.getAccessToken(),s=n==="markdown"?"sampleMarkdown":"sampleText",a=JSON.stringify(n==="markdown"?{title:"notification",text:r}:{content:r}),i=await urllib_1.default.request(`${DING_API_BASE}/v1.0/robot/oToMessages/batchSend`,{method:"POST",data:{robotCode:e.clientId,userIds:[t],msgKey:s,msgParam:a},contentType:"json",headers:{"x-acs-dingtalk-access-token":o},dataType:"json"});return i.status===200?!0:(console.error(`sendMessageToUser API \u8FD4\u56DE\u975E200: status=${i.status}, userId=${t}`),!1)}catch(o){return console.error(`sendMessageToUser \u5931\u8D25 (userId=${t}):`,o),!1}}async function sendOwnerMessage(e,t,r="text"){const{ownerConversationId:n,owner:o}=e.config;if(!n||!o)return!1;const s=await queryUserIdByMobile(e,o);return s?sendMessageToUser(e,s,t,r):(console.error(`sendOwnerMessage: \u65E0\u6CD5\u5C06\u624B\u673A\u53F7 ${o} \u89E3\u6790\u4E3A Ding userId`),!1)}
@@ -1 +1 @@
1
- "use strict";var __importDefault=this&&this.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.sendNotify=sendNotify;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),urllib_1=__importDefault(require("urllib")),session_1=require("./session");async function sendNotify(s){const{clientId:p,message:l,conversationIds:r,atUserIds:n=[],markdown:y=!1}=s,_=path_1.default.join((0,session_1.getHomeDir)(),".cc-ding",p),c=path_1.default.join(_,"config.json");if(!fs_1.default.existsSync(c))return console.error(`\u274C \u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${c}`),{success:0,fail:r.length};let i;try{i=JSON.parse(fs_1.default.readFileSync(c,"utf-8"))}catch(e){return console.error(`\u274C \u914D\u7F6E\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${e instanceof Error?e.message:e}`),{success:0,fail:r.length}}let u=0,o=0;for(const e of r){const f=i.conversations.find(t=>t.conversationId===e),d=f?.dingToken||i.defaultDingToken;if(!d){console.error(` \u2717 \u4F1A\u8BDD ${e}: \u65E0 dingToken \u53EF\u7528`),o++;continue}try{const t=n.length>0?`${l} ${n.map(a=>`@${a}`).join(" ")}`:l,$=y?{msgtype:"markdown",markdown:{title:t,text:t},at:{atUserIds:n,isAtAll:!1}}:{msgtype:"text",text:{content:t},at:{atUserIds:n,isAtAll:!1}},h=`https://oapi.dingtalk.com/robot/send?access_token=${d}`,g=await urllib_1.default.request(h,{method:"POST",data:$,contentType:"json",dataType:"json"});if(g.status===200){const a=f?.conversationTitle||e;console.log(` \u2713 ${a}`),u++}else console.error(` \u2717 ${e}: HTTP ${g.status}`),o++}catch(t){console.error(` \u2717 ${e}: ${t instanceof Error?t.message:t}`),o++}}return{success:u,fail:o}}
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}}
@@ -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,n){const s=path_1.default.join(getHomeDir(),".cc-ding",e),t=path_1.default.join(s,"config.json");return fs_1.default.mkdirSync(s,{recursive:!0}),fs_1.default.writeFileSync(t,JSON.stringify(n,null,2),"utf-8"),t}function ensureClientDir(e){const n=path_1.default.join(getHomeDir(),".cc-ding",e),s=path_1.default.join(n,"config.json");if(fs_1.default.existsSync(s))return;console.log(`[${timestamp()}] \u5BA2\u6237\u7AEF\u76EE\u5F55\u672A\u521D\u59CB\u5316: ${n}`),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: ${s}`),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 n=`${getClientDir(e)}/config.json`;(0,assert_1.default)(fs_1.default.existsSync(n),`Could not find client config file: ${n}`);const s=utils_ok_1.fileUtil.getJSON(n);return(0,assert_1.default)(s.clientSecret,"config.json missing required field: clientSecret"),(0,assert_1.default)(s.whiteUserList,"config.json missing required field: whiteUserList"),s}function resolveToUserId(e,n){return isMobile(n)&&e.resolvedPhones[n]||n}function authCheck(e,n,s){if(isOwnerOrAdmin(e,n))return!0;if(s){const t=e.config.conversations.find(o=>o.conversationId===s);if(t?.whiteUserList&&t.whiteUserList.length>0)return t.whiteUserList.some(o=>resolveToUserId(e,o)===n)}return e.config.whiteUserList.some(t=>resolveToUserId(e,t)===n)}function isOwner(e,n){const s=e.config.owner;if(!s||!isMobile(s))return!1;const t=e.resolvedPhones[s];return!!t&&t===n}function isAdmin(e,n){return e.config.adminUserList?.length?e.config.adminUserList.some(s=>resolveToUserId(e,s)===n):!1}function isOwnerOrAdmin(e,n){return isOwner(e,n)||isAdmin(e,n)}function debugLog(e,n,...s){e.config.debug&&console.log(`[DEBUG] ${n}`,...s)}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 n=getPhoneMapFile(e);if(!fs_1.default.existsSync(n))return{};try{const s=JSON.parse(fs_1.default.readFileSync(n,"utf-8"));if(typeof s=="object"&&s!==null)return s}catch{}return{}}function savePhoneMap(e,n){const s=getPhoneMapFile(e);try{fs_1.default.writeFileSync(s,JSON.stringify(n,null,2),"utf-8")}catch(t){console.error("\u4FDD\u5B58 phone-map.json \u5931\u8D25:",t)}}function userIdToPhone(e,n){for(const[s,t]of Object.entries(e.resolvedPhones))if(t===n)return s;return null}async function resolveUserId(e,n){if(!n)return null;if(!isMobile(n))return n;if(e.resolvedPhones[n])return e.resolvedPhones[n];const s=await(0,messaging_1.queryUserIdByMobile)(e,n);return s&&(e.resolvedPhones[n]=s,savePhoneMap(e,e.resolvedPhones)),s}async function resolveAllPhonesInConfig(e){e.resolvedPhones=loadPhoneMap(e);const n=[],s=async t=>{if(e.resolvedPhones[t])return;const o=await(0,messaging_1.queryUserIdByMobile)(e,t);o&&(e.resolvedPhones[t]=o,n.push(t))};e.config.owner&&(isMobile(e.config.owner)?(await s(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 s(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 s(o),e.resolvedPhones[o]||console.warn(`[WARN] \u65E0\u6CD5\u89E3\u6790\u7FA4\u767D\u540D\u5355\u624B\u673A\u53F7: ${o}`));n.length>0&&savePhoneMap(e,e.resolvedPhones),console.log(`[\u624B\u673A\u89E3\u6790] \u5DF2\u52A0\u8F7D ${Object.keys(e.resolvedPhones).length} \u6761\u8BB0\u5F55 (${n.length} \u6761\u65B0\u89E3\u6790)`)}function hashConversationId(e,n){const t=getConversationConfig(e,n)?.linkConversationId||n;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,n){const s=e.activeSessions.get(n);if(s)return{key:n,session:s};const t=getConversationConfig(e,n);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,n){return e.config.conversations.find(s=>s.conversationId===n)}function getConversationDir(e,n){const s=hashConversationId(e,n);return`${getClientDir(e)}/${s}`}function getSessionsDir(e,n){return`${getConversationDir(e,n)}/.sessions`}function getTasksDir(e,n){return`${getConversationDir(e,n)}/.tasks`}function getImagesDir(e,n){return`${getConversationDir(e,n)}/.images`}function getSessionDir(e,n){const s=n.claudeSessionId||n.startTimeStr;return`${getSessionsDir(e,n.conversationId)}/${s}`}function getSessionId(e){return e.claudeSessionId||e.startTimeStr}function formatSessionInfo(e,n){const s=findActiveSession(e,n);if(!s)return null;const{session:t,isProcessing:o,messageQueue:i}=s.session;return[`- **\u4F1A\u8BDDID:** ${getSessionId(t)}`,`- **\u53D1\u8D77\u8005:** ${t.startNickName}(${t.startStaffId})`,`- **\u5F00\u59CB\u65F6\u95F4:** ${t.startTimeStr}`,`- **\u6700\u540E\u53D1\u9001\u8005:** ${s.session.lastSenderStaffId}`,`- **\u5904\u7406\u4E2D:** ${o}`,`- **\u6392\u961F\u6D88\u606F:** ${i?.length||0} \u6761`].join(`
2
- `)}function readSessionLogTail(e,n,s){const t=findActiveSession(e,n);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(c=>c.length>0).slice(-s).join(`
4
- `)}catch{return null}}function findHistorySession(e,n,s){const t=getSessionsDir(e,n),o=`${t}/${s}/session.json`;try{return utils_ok_1.fileUtil.getJSON(o)}catch{}const i=parseInt(s,10);if(!isNaN(i)&&i>0){const u=utils_ok_1.dateUtil.mm(i).format("YYYY-MM-DD-HH-mm-ss"),a=`${t}/${u}/session.json`;try{return utils_ok_1.fileUtil.getJSON(a)}catch{}}return null}function findLatestSession(e,n){const s=getSessionsDir(e,n);if(!fs_1.default.existsSync(s))return null;const t=findActiveSession(e,n),o=t?getSessionId(t.session.session):null;let i=null,u=0;try{const a=fs_1.default.readdirSync(s,{withFileTypes:!0});for(const c of a){if(!c.isDirectory())continue;const r=path_1.default.join(s,c.name,"session.json");if(fs_1.default.existsSync(r))try{const l=utils_ok_1.fileUtil.getJSON(r);if(o&&getSessionId(l)===o)continue;l.startTime>u&&(u=l.startTime,i=l)}catch{continue}}}catch{}return i}function updateSessionFile(e,n,s){if(s.claudeSessionId&&!n.claudeSessionId){const o=getSessionDir(e,n);n.claudeSessionId=s.claudeSessionId;const i=getSessionDir(e,n);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,n)}/session.json`;try{s.sessionWebhook&&(n.sessionWebhook=s.sessionWebhook),s.currentWebhook!==void 0&&(n.currentWebhook=s.currentWebhook||void 0),s.currentConversationId!==void 0&&(n.currentConversationId=s.currentConversationId||void 0),fs_1.default.writeFileSync(t,JSON.stringify(n,null,2),"utf-8");const o=s.claudeSessionId?"claudeSessionId":s.currentWebhook!==void 0?"currentWebhook":"sessionWebhook";console.log(`[${timestamp()}] \u4F1A\u8BDD\u6587\u4EF6\u5DF2\u4FDD\u5B58: ${o}`),saveActiveSession(e,n.conversationId)}catch(o){console.error("\u66F4\u65B0 session.json \u5931\u8D25:",o)}}function appendSessionLog(e,n,s){const t=`${e}/session.log`,i=`[${timestamp()}] [${n.toUpperCase()}]: ${s}
5
- `;try{fs_1.default.appendFileSync(t,i,"utf-8")}catch{}}function getActiveSessionsFile(e,n){return`${getSessionsDir(e,n)}/active.json`}function saveActiveSession(e,n){const s=e.activeSessions.get(n),t=getActiveSessionsFile(e,n);try{if(!s){fs_1.default.existsSync(t)&&fs_1.default.unlinkSync(t);return}const o={session:s.session,lastSenderStaffId:s.lastSenderStaffId,conversationConfig:s.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=${n}`)}catch(o){console.error(`\u6301\u4E45\u5316\u6D3B\u8DC3\u4F1A\u8BDD\u5931\u8D25: \u7FA4=${n}`,o)}}function loadActiveSessions(e){for(const n of e.config.conversations){const s=getActiveSessionsFile(e,n.conversationId);if(fs_1.default.existsSync(s))try{const t=utils_ok_1.fileUtil.getJSON(s);if(!t?.session){console.log(`\u6D3B\u8DC3\u4F1A\u8BDD\u6587\u4EF6\u65E0\u6548\uFF0C\u8DF3\u8FC7: ${s}`);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: ${s}`),fs_1.default.unlinkSync(s);continue}e.activeSessions.set(n.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=${n.conversationId}, \u4F1A\u8BDDID=${getSessionId(t.session)}`)}catch(t){console.error(`\u52A0\u8F7D\u6D3B\u8DC3\u4F1A\u8BDD\u5931\u8D25: ${s}`,t)}}}async function endSession(e,n,s){const t=findActiveSession(e,n);if(!t){console.log(`\u7FA4 ${n} \u65E0\u6D3B\u8DC3\u4F1A\u8BDD`);return}const{key:o,session:i}=t,{session:u}=i,a=getSessionDir(e,u),c=getSessionId(u);console.log(`\u7ED3\u675F\u4F1A\u8BDD: \u7FA4=${n}, \u4F1A\u8BDDID=${c}`),(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(`${a}/session.log`,`[${timestamp()}] [SYSTEM]: \u7ED3\u675F\u4F1A\u8BDD\u65F6\u4E2D\u65AD Claude \u8FDB\u7A0B
6
- `,"utf-8");const r=i.messageQueue?.length??0;r>0&&(i.messageQueue=[],console.log(`[${timestamp()}] \u7ED3\u675F\u4F1A\u8BDD\u65F6\u6E05\u7A7A\u6D88\u606F\u961F\u5217: \u7FA4=${n}, \u6E05\u7A7A${r}\u6761\u6D88\u606F`)),await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:s,atUserId:u.startStaffId,content:`\u{1F4AC} \u4F1A\u8BDD\u5DF2\u7ED3\u675F
7
- \u{1F4CB} \u4F1A\u8BDDID: ${c}${r>0?`
8
- \u{1F5D1}\uFE0F \u5DF2\u6E05\u7A7A\u6D88\u606F\u961F\u5217\uFF0C\u4E22\u5F03${r}\u6761\u5F85\u5904\u7406\u6D88\u606F`:""}`}),e.activeSessions.delete(o),saveActiveSession(e,o),fs_1.default.appendFileSync(`${a}/session.log`,`[${timestamp()}] [SYSTEM]: \u7528\u6237\u8BF7\u6C42\u7ED3\u675F\u4F1A\u8BDD
9
- `,"utf-8")}async function switchToSession(e,n,s,t,o,i){const u=findHistorySession(e,n,t);if(!u)return await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:s,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 a=getSessionDir(e,u);if(!fs_1.default.existsSync(a))return await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:s,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 c=findActiveSession(e,n);c&&(console.log(`\u5207\u6362\u4F1A\u8BDD\uFF0C\u5148\u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD: ${getSessionId(c.session.session)}`),(0,claude_process_1.interruptClaudeProcess)(c.session,"\u5207\u6362\u4F1A\u8BDD\u65F6\u4E2D\u65AD\u6B63\u5728\u6267\u884C\u7684 Claude \u8FDB\u7A0B"),e.activeSessions.delete(c.key),saveActiveSession(e,c.key),fs_1.default.appendFileSync(`${getSessionDir(e,c.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(n,{session:u,lastSenderStaffId:o,isProcessing:!1,messageQueue:[],conversationConfig:i}),saveActiveSession(e,n);const r=!!u.claudeSessionId,l=getSessionId(u);return await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:s,atUserId:o,content:`\u2705 \u5DF2\u5207\u6362\u5230\u5386\u53F2\u4F1A\u8BDD (\u4F1A\u8BDDID: ${l})
11
- ${r?"\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=${n}, \u4F1A\u8BDDID=${l}, \u6709Claude\u4E0A\u4E0B\u6587=${r}`),!0}async function startNewSession(e,n){const{conversationId:s,sessionWebhook:t,senderStaffId:o,senderNick:i,message:u,conversationConfig:a}=n,c=e.config.sessionMaxConcurrency??e.DEFAULT_SESSION_MAX_CONCURRENCY;if(e.activeSessions.size>=c){console.log(`\u8FBE\u5230\u6700\u5927\u5E76\u53D1\u6570 (${c})\uFF0C\u62D2\u7EDD\u65B0\u4F1A\u8BDD: \u7FA4=${s}`),await(0,messaging_1.sendDingMessage)(e,{conversationId:s,sessionWebhook:t,atUserId:o,content:"\u{1F92F} \u5F53\u524D\u7E41\u5FD9\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5..."});return}const r=Date.now(),l={conversationId:s,sessionWebhook:t,startTime:r,startTimeStr:utils_ok_1.dateUtil.mm(r).format("YYYY-MM-DD-HH-mm-ss"),startStaffId:o,startNickName:i};console.log(`\u521B\u5EFA\u65B0\u4F1A\u8BDD: \u7FA4=${s}, \u4F1A\u8BDDID=${getSessionId(l)}, \u53D1\u8D77\u8005=${o}, \u5F53\u524D\u5E76\u53D1=${e.activeSessions.size+1}/${c}`);const f=getSessionDir(e,l);fs_1.default.mkdirSync(f,{recursive:!0}),fs_1.default.writeFileSync(`${f}/session.json`,JSON.stringify(l,null,2),"utf-8"),e.activeSessions.set(s,{session:l,lastSenderStaffId:o,isProcessing:!0,messageQueue:[],conversationConfig:a}),saveActiveSession(e,s),a.receiveReply!==!1&&await(0,messaging_1.sendDingMessage)(e,{conversationId:s,sessionWebhook:t,atUserId:o,content:`\u{1F680} \u4F1A\u8BDD\u5DF2\u5F00\u59CB\uFF01
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,l,u,{skill:a.taskCfg?.skill,agent:a.agent,senderNick:i,senderStaffId:o,permissionMode:a.permissionMode})}catch(d){console.error("\u6267\u884C Claude \u67E5\u8BE2\u5931\u8D25:",d),await(0,messaging_1.sendDingMessage)(e,{conversationId:s,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(s);d&&(d.isProcessing=!1)}const g=e.activeSessions.get(s);g&&g.messageQueue.length>0&&await processMessageQueue(e,s)}async function processMessageQueue(e,n){const s=e.activeSessions.get(n);if(!s||s.messageQueue.length===0)return;const t=s.messageQueue.shift(),{message:o,senderStaffId:i,senderNick:u}=t,a=s.session.sessionWebhook;console.log(`\u5904\u7406\u961F\u5217\u6D88\u606F: \u7FA4=${n}, \u5269\u4F59 ${s.messageQueue.length} \u6761`),s.isProcessing=!0,s.lastSenderStaffId=i,saveActiveSession(e,n),s.conversationConfig.receiveReply!==!1&&await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:a,atUserId:i,content:"\u2705 \u6536\u5230\uFF0C\u6211\u6765\u5904\u7406..."}).catch(()=>{});try{await(0,claude_process_1.executeClaudeQuery)(e,s.session,o,{skill:s.conversationConfig.taskCfg?.skill,agent:s.conversationConfig.agent,senderNick:u,senderStaffId:i,permissionMode:s.conversationConfig.permissionMode})}catch(c){console.error("\u6267\u884C\u961F\u5217 Claude \u67E5\u8BE2\u5931\u8D25:",c),await(0,messaging_1.sendDingMessage)(e,{conversationId:n,sessionWebhook:a,atUserId:i,content:`\u274C \u5904\u7406\u6D88\u606F\u65F6\u53D1\u751F\u9519\u8BEF: ${c instanceof Error?c.message:String(c)}`})}finally{s.isProcessing=!1}if(s.goonPending){s.goonPending=!1,s.interrupted=!1,s.isProcessing=!0;try{await(0,claude_process_1.executeClaudeQuery)(e,s.session,"\u7EE7\u7EED",{senderNick:s.session.startNickName,senderStaffId:s.lastSenderStaffId,permissionMode:s.conversationConfig.permissionMode})}catch(c){console.error("goonPending \u6062\u590D\u6267\u884C\u5931\u8D25:",c)}finally{s.isProcessing=!1}}s.messageQueue.length>0&&await processMessageQueue(e,n)}async function handleSessionMessage(e,n){const{conversationId:s,sessionWebhook:t,senderStaffId:o,senderNick:i,message:u,conversationConfig:a}=n;if((0,commands_1.parseEndCommand)(u)){await endSession(e,s,t);return}const c=findActiveSession(e,s),r=c?.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=${s}, \u8DEF\u5F84=${l}`)),r.isProcessing){const g={message:u,senderStaffId:o,senderNick:i};r.messageQueue.push(g);const d=r.messageQueue.length;console.log(`\u4F1A\u8BDD ${s} \u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u6392\u961F\u7B2C ${d} \u6761`),await(0,messaging_1.sendDingMessage)(e,{conversationId:s,sessionWebhook:t,atUserId:o,content:`\u23F3 \u6B63\u5728\u5904\u7406\u4E2D\uFF0C\u5DF2\u52A0\u5165\u961F\u5217\uFF08\u6392\u961F\u7B2C ${d} \u6761\uFF09`});return}const f=r.session.conversationId===s;console.log(`\u8FFD\u52A0\u6D88\u606F\u5230\u6D3B\u8DC3\u4F1A\u8BDD: \u7FA4=${s}, \u4F1A\u8BDDID=${getSessionId(r.session)}${f?"":`(\u5173\u8054\u7FA4,\u4F1A\u8BDD\u5F52\u5C5E=${r.session.conversationId})`}`),r.lastSenderStaffId=o,r.isProcessing=!0,saveActiveSession(e,c.key),f&&t!==r.session.sessionWebhook&&(r.session.sessionWebhook=t,updateSessionFile(e,r.session,{sessionWebhook:t})),r.session.currentWebhook=t,r.session.currentConversationId=s,updateSessionFile(e,r.session,{currentWebhook:t,currentConversationId:s}),a.receiveReply!==!1&&await(0,messaging_1.sendDingMessage)(e,{conversationId:s,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:a.taskCfg?.skill,agent:a.agent,senderNick:i,senderStaffId:o,permissionMode:a.permissionMode})}catch(g){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:a.taskCfg?.skill,agent:a.agent,senderNick:i,senderStaffId:o,permissionMode:a.permissionMode});return}catch(d){console.error("\u91CD\u8BD5\u6267\u884C Claude \u67E5\u8BE2\u5931\u8D25:",d),await(0,messaging_1.sendDingMessage)(e,{conversationId:s,sessionWebhook:t,atUserId:o,content:`\u274C \u5904\u7406\u6D88\u606F\u65F6\u53D1\u751F\u9519\u8BEF: ${d instanceof Error?d.message:String(d)}`}),r.isProcessing=!1,await processMessageQueue(e,s);return}}console.error("\u6267\u884C Claude \u67E5\u8BE2\u5931\u8D25:",g),await(0,messaging_1.sendDingMessage)(e,{conversationId:s,sessionWebhook:t,atUserId:o,content:`\u274C \u5904\u7406\u6D88\u606F\u65F6\u53D1\u751F\u9519\u8BEF: ${g instanceof Error?g.message:String(g)}`})}finally{r.isProcessing=!1}await processMessageQueue(e,s)}else await startNewSession(e,{conversationId:s,sessionWebhook:t,senderStaffId:o,senderNick:i,message:u,conversationConfig:a})}function cleanCache(e,n,s=!0){const t={sessionsDeleted:0,tasksDeleted:0,imagesDeleted:0,errors:[]},o=n?[n]:e.config.conversations.map(i=>i.conversationId);for(const i of o){let u=null;if(s){const f=findActiveSession(e,i);f&&(u=getSessionId(f.session.session))}const a=getSessionsDir(e,i);if(fs_1.default.existsSync(a))try{const f=fs_1.default.readdirSync(a,{withFileTypes:!0});for(const g of f){if(!g.isDirectory()||u&&g.name===u)continue;const d=path_1.default.join(a,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: ${a}`)}const c=getTasksDir(e,i);if(fs_1.default.existsSync(c))try{const f=fs_1.default.readdirSync(c,{withFileTypes:!0});for(const g of f){if(!g.isDirectory())continue;const d=path_1.default.join(c,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: ${c}`)}const r=getImagesDir(e,i);if(fs_1.default.existsSync(r))try{const f=fs_1.default.readdirSync(r,{withFileTypes:!0});for(const g of f){const d=path_1.default.join(r,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: ${r}`)}const l=path_1.default.join(getConversationDir(e,i),".playwright-cli");if(fs_1.default.existsSync(l))try{fs_1.default.rmSync(l,{recursive:!0,force:!0})}catch{t.errors.push(`\u5220\u9664 playwright-cli \u7F13\u5B58\u5931\u8D25: ${l}`)}if(!s){const f=getActiveSessionsFile(e,i);if(fs_1.default.existsSync(f))try{fs_1.default.unlinkSync(f)}catch{t.errors.push(`\u5220\u9664\u6D3B\u8DC3\u4F1A\u8BDD\u6587\u4EF6\u5931\u8D25: ${f}`)}e.activeSessions.has(i)&&e.activeSessions.delete(i)}}return t}
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}