cc-ding 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,42 +1,43 @@
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.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"),secrets_1=require("./secrets"),platform_1=require("./platform"),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(e,t,n){const i=(0,api_key_manager_1.getForceEnabledSettingsPath)(t);if(i)return i;if(e.config.apiKeyCfg){const a=(0,api_key_manager_1.readApiKeyFromSettings)(t);let $=null;if(a&&($=e.config.apiKeyCfg.claudeSettings.find(c=>(0,secrets_1.resolveSecret)(c.apiKey)===a&&c.isValid)||null),$||($=(0,api_key_manager_1.pickValidApiKey)(e)),$)return(0,api_key_manager_1.ensureSettingsWithApiKey)(t,$)}if(e.config.apiKeyCfg)return;if(n)return n;const m=path_1.default.join(t,".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(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(i=>t.includes(i))}function sleep(e){return new Promise(t=>setTimeout(t,e))}class RetryableApiError extends Error{constructor(t,n=""){super(`Retryable API error (TPM limit etc.)${t?" [fast fail]":""}`),this.name="RetryableApiError",this.isFastFail=t,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(e,t){try{return fs_1.default.readFileSync(e,"utf-8").split(`
1
+ "use strict";var q=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveClaudeSettingsPath=H,exports.isRetryableApiError=J,exports.parseClaudeStreamLine=ne,exports.interruptClaudeProcess=ye,exports.injectStartupContexts=Se,exports.injectSessionContextIfChanged=ae,exports.executeClaudeQuery=$e;const a=q(require("fs")),j=q(require("path")),ce=q(require("readline")),de=require("crypto"),E=require("./messaging"),n=require("./session"),$=require("./api-key-manager"),X=require("./secrets"),N=require("./platform"),P=20,K=1e4,G=1e4,B=10,Z=300*1e3,U=300*1e3,ue=30*1e3,Q=new Map;function H(e,t,o){const i=(0,$.getForceEnabledSettingsPath)(t);if(i)return i;if(e.config.apiKeyCfg){const f=(0,$.readApiKeyFromSettings)(t);let h=null;if(f&&(h=e.config.apiKeyCfg.claudeSettings.find(m=>(0,X.resolveSecret)(m.apiKey)===f&&m.isValid)||null),h||(h=(0,$.pickValidApiKey)(e)),h)return(0,$.ensureSettingsWithApiKey)(t,h)}if(e.config.apiKeyCfg)return;if(o)return o;const y=j.default.join(t,".claude","settings.json");if(a.default.existsSync(y))return console.log(`[${(0,n.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${y}`),y}function J(e){if(/\b429\b/.test(e)&&!(0,$.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(i=>t.includes(i))}function le(e){return new Promise(t=>setTimeout(t,e))}class V extends Error{constructor(t,o=""){super(`Retryable API error (TPM limit etc.)${t?" [fast fail]":""}`),this.name="RetryableApiError",this.isFastFail=t,this.output=o}}class ee extends Error{constructor(){super("Claude conversation not found"),this.name="ConversationNotFoundError"}}class te extends Error{constructor(){super("Context window exceeded: prompt tokens exceed maximum context window"),this.name="ContextWindowExceededError"}}function pe(e,t){try{return a.default.readFileSync(e,"utf-8").split(`
2
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(i=>t.includes(i))}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 n=JSON.parse(e);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&&t&&m.push(`\u{1F4AD} **\u601D\u8003\u8FC7\u7A0B**
3
+ `)}catch{return""}}function fe(e){return/prompt tokens?\s*\(\s*\d+\s*\)\s*exceeds/i.test(e)||/exceeds?.*maximum context window/i.test(e)}function me(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(i=>t.includes(i))}function ge(e){return/no conversation found with session id/i.test(e)}function ne(e,t=!1){if(!e.trim())return null;try{const o=JSON.parse(e);if(o.type==="system"&&o.subtype==="init"&&o.session_id)return{type:"system",sessionId:o.session_id};if(o.type==="assistant"){const i=o.message?.content;if(Array.isArray(i)){const y=[];for(const f of i)f.type==="text"&&f.text?y.push(f.text):f.type==="thinking"&&f.thinking&&t&&y.push(`\u{1F4AD} **\u601D\u8003\u8FC7\u7A0B**
4
4
  \`\`\`
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:e}}}function interruptClaudeProcess(e,t){return e.currentProcess?(console.log(`[${(0,session_1.timestamp)()}] ${t}`),e.interrupted=!0,(0,platform_1.isWindows)()?e.currentProcess.kill():e.currentProcess.kill("SIGINT"),!0):!1}function runClaudeOnce(e,t,n,i,m,a,$){let c=e.getSessionDir(t),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 E=(0,child_process_1.spawn)(i,n,{cwd:m,stdio:["pipe","pipe","pipe"]}),T=e.activeSessions.get(t.conversationId);T&&(T.currentProcess=E,T.lastActivityTime=Date.now()),fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u542F\u52A8${$?" (\u91CD\u8BD5)":""}
8
- `,"utf-8"),E.stdin?.write(`${a}
9
- `),E.stdin?.end();let k=!$&&!!t.claudeSessionId,C=[],P="",x="",b=!1,h=!1,g=null;const v=new Set,A=()=>{T&&(T.lastActivityTime=Date.now())};g=setInterval(()=>{if(h){g&&clearInterval(g);return}const r=T?.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=T?.lastSenderStaffId||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),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:E.stdout}).on("line",r=>{if(x+=r+`
11
- `,A(),e.debugLog(`Claude stdout: ${r.substring(0,200)}${r.length>200?"...":""}`),e.config.debug)try{fs_1.default.appendFileSync(u,`[${(0,session_1.timestamp)()}] [RAW]: ${r}
12
- `,"utf-8")}catch{}const o=parseClaudeStreamLine(r,e.config.includeThinking??!1);if(o){if(o.type==="system"&&o.sessionId&&!k&&(e.updateSessionFile(t,{claudeSessionId:o.sessionId}),k=!0,c=e.getSessionDir(t),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)),e.appendSessionLog(c,"tool",`${S}${p?": "+p:""}`)}}}catch{}o.content&&C.push(o.content)}if(o.type==="result"){const d=e.config.resultOnly??!0,l=(o.content||"").trim(),s=C.join(`
13
- `).trim(),S=d&&l||s;if(S&&!T?.interrupted){try{e.appendSessionLog(c,"assistant",S)}catch{}const w=e.activeSessions.get(t.conversationId)?.lastSenderStaffId||t.startStaffId;b=!0,(0,messaging_1.sendClaudeResponseToDing)(e,(0,session_1.getReplyConversationId)(t),(0,session_1.getReplyWebhook)(t),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=[]}}}),E.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{}}}),E.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=e.activeSessions.get(t.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{e.appendSessionLog(c,"assistant",l)}catch{}const s=o?.lastSenderStaffId||t.startStaffId;b=!0,(0,messaging_1.sendClaudeResponseToDing)(e,(0,session_1.getReplyConversationId)(t),(0,session_1.getReplyWebhook)(t),s,l).catch(S=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",S))}}if(r===0&&!b&&!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||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),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||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),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||t.startStaffId;(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),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(t.claudeSessionId&&isConversationNotFoundError(d)){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`),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}`))}),E.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(e,t){const n=e.getConversationConfig(t),i=e.config;return[START_MARK,"# cc-ding Session Context","","## Client",`- clientId: \`${e.clientId}\``,i.clientName?`- clientName: ${i.clientName}`:"",`- owner: ${i.owner}`,"","## Conversation",`- conversationId: \`${t}\``,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(`
5
+ ${f.thinking}
6
+ \`\`\``);if(y.length>0)return{type:"assistant",content:y.join(`
7
+ `)}}else if(o.content)return{type:"assistant",content:typeof o.content=="string"?o.content:JSON.stringify(o.content)};return{type:"assistant"}}if(o.type==="result"){const i=o.result||"";return{type:"result",content:typeof i=="string"?i:JSON.stringify(i)}}return{type:o.type||"unknown"}}catch{return{type:"text",content:e}}}function ye(e,t){return e.currentProcess?(console.log(`[${(0,n.timestamp)()}] ${t}`),e.interrupted=!0,(0,N.isWindows)()?e.currentProcess.kill():e.currentProcess.kill("SIGINT"),!0):!1}function oe(e,t,o,i,y,f,h){let m=e.getSessionDir(t),I=`${m}/session.log`;a.default.existsSync(m)||a.default.mkdirSync(m,{recursive:!0});const T=Date.now();return new Promise((g,C)=>{const S=(0,N.spawnCommand)(i,o,{cwd:y,stdio:["pipe","pipe","pipe"]}),A=e.activeSessions.get(t.conversationId);A&&(A.currentProcess=S,A.lastActivityTime=Date.now()),a.default.appendFileSync(I,`[${(0,n.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u542F\u52A8${h?" (\u91CD\u8BD5)":""}
8
+ `,"utf-8"),S.stdin?.write(`${f}
9
+ `),S.stdin?.end();let Y=!h&&!!t.claudeSessionId,M=[],x="",O="",D=!1,W=!1,l=null;const k=new Set,R=()=>{A&&(A.lastActivityTime=Date.now())};l=setInterval(()=>{if(W){l&&clearInterval(l);return}const p=A?.lastActivityTime??T;if(Date.now()-p>=U){console.warn(`[${(0,n.timestamp)()}] Watchdog: Claude \u8FDB\u7A0B ${U/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u901A\u77E5\u7528\u6237`);try{a.default.appendFileSync(I,`[${(0,n.timestamp)()}] [SYSTEM]: Watchdog \u8D85\u65F6\uFF0C${U/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u5DF2\u901A\u77E5\u7528\u6237
10
+ `,"utf-8")}catch{}l&&clearInterval(l),l=null;const c=A?.lastSenderStaffId||t.startStaffId;(0,E.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:c,content:`\u23F0 Claude \u8FDB\u7A0B\u8D85\u8FC7 ${U/1e3}s \u65E0\u54CD\u5E94\uFF0C\u53EF\u53D1\u9001 /goon \u5F3A\u5236\u91CD\u542F\u6062\u590D\uFF0C\u6216 /end \u7ED3\u675F\u4F1A\u8BDD`}).catch(d=>console.error("\u53D1\u9001 Watchdog \u901A\u77E5\u5931\u8D25:",d))}},ue),ce.default.createInterface({input:S.stdout}).on("line",p=>{if(O+=p+`
11
+ `,R(),e.debugLog(`Claude stdout: ${p.substring(0,200)}${p.length>200?"...":""}`),e.config.debug)try{a.default.appendFileSync(I,`[${(0,n.timestamp)()}] [RAW]: ${p}
12
+ `,"utf-8")}catch{}const r=ne(p,e.config.includeThinking??!1);if(r){if(r.type==="system"&&r.sessionId&&!Y&&(e.updateSessionFile(t,{claudeSessionId:r.sessionId}),Y=!0,m=e.getSessionDir(t),I=`${m}/session.log`),r.type==="assistant"){try{const d=JSON.parse(p)?.message?.content;if(Array.isArray(d)){for(const s of d)if(s.type==="tool_use"&&s.id&&!k.has(s.id)){k.add(s.id);const v=s.name||"unknown";let u="";s.input&&(s.input.command?u=s.input.command.substring(0,200):s.input.file_path?u=s.input.file_path:s.input.pattern?u=s.input.pattern:s.input.query?u=s.input.query:s.input.description?u=s.input.description:s.input.prompt?u=s.input.prompt.substring(0,200):u=JSON.stringify(s.input).substring(0,200)),e.appendSessionLog(m,"tool",`${v}${u?": "+u:""}`)}}}catch{}r.content&&M.push(r.content)}if(r.type==="result"){const c=e.config.resultOnly??!0,d=(r.content||"").trim(),s=M.join(`
13
+ `).trim(),v=c&&d||s;if(v&&!A?.interrupted){try{e.appendSessionLog(m,"assistant",v)}catch{}const w=e.activeSessions.get(t.conversationId)?.lastSenderStaffId||t.startStaffId;D=!0,(0,E.sendClaudeResponseToDing)(e,(0,n.getReplyConversationId)(t),(0,n.getReplyWebhook)(t),w,v).catch(b=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",b))}else console.warn(`[${(0,n.timestamp)()}] Claude \u8FD4\u56DE\u4E86\u7A7A\u7684 result \u4E14 responseBuffer \u4E5F\u4E3A\u7A7A\uFF0C\u65E0\u5185\u5BB9\u53EF\u53D1\u9001`);M=[]}}}),S.stderr?.on("data",p=>{const r=p.toString();if(x+=r,R(),(0,$.isQuotaExhaustedError)(r)){console.log(`[${(0,n.timestamp)()}] [Claude stderr] \u914D\u989D\u8017\u5C3D\u9519\u8BEF(429): ${r.trim()}`);try{a.default.appendFileSync(I,`[${(0,n.timestamp)()}] [WARN]: ${r}`,"utf-8")}catch{}}else if(J(r)){console.log(`[${(0,n.timestamp)()}] [Claude stderr] \u53EF\u91CD\u8BD5API\u9519\u8BEF(422 TPM\u9650\u6D41): ${r.trim()}`);try{a.default.appendFileSync(I,`[${(0,n.timestamp)()}] [WARN]: ${r}`,"utf-8")}catch{}}else{console.error(`[Claude stderr]: ${r}`);try{a.default.appendFileSync(I,`[${(0,n.timestamp)()}] [ERROR]: ${r}`,"utf-8")}catch{}}}),S.on("close",p=>{W=!0,l&&(clearInterval(l),l=null),console.log(`[${(0,n.timestamp)()}] Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${p}`);try{a.default.appendFileSync(I,`[${(0,n.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u7ED3\u675F\uFF0C\u9000\u51FA\u7801: ${p}
14
+ `,"utf-8")}catch{}const r=e.activeSessions.get(t.conversationId);if(r&&(r.currentProcess=void 0),r?.interrupted){console.log(`[${(0,n.timestamp)()}] \u7528\u6237\u4E3B\u52A8\u4E2D\u65AD\uFF0C\u4E22\u5F03 responseBuffer (${M.length} \u6BB5)`),r.interrupted=!1,M=[],g(0);return}if(M.length>0){const d=M.join(`
15
+ `).trim();if(d){try{e.appendSessionLog(m,"assistant",d)}catch{}const s=r?.lastSenderStaffId||t.startStaffId;D=!0,(0,E.sendClaudeResponseToDing)(e,(0,n.getReplyConversationId)(t),(0,n.getReplyWebhook)(t),s,d).catch(v=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",v))}}if(p===0&&!D&&!r?.interrupted){console.warn(`[${(0,n.timestamp)()}] Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9`);try{a.default.appendFileSync(I,`[${(0,n.timestamp)()}] [WARN]: Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9
16
+ `,"utf-8")}catch{}const d=r?.lastSenderStaffId||t.startStaffId;(0,E.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:d,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(p===0){g(0);return}const c=x+`
17
+ `+O;if((0,$.isQuotaExhaustedError)(c)){const s=Date.now()-T<G;console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u914D\u989D\u8017\u5C3D\u9519\u8BEF(429)\uFF0Cstdout\u5339\u914D=${(0,$.isQuotaExhaustedError)(O)}, stderr\u5339\u914D=${(0,$.isQuotaExhaustedError)(x)}`),C(new V(s,c));return}if((0,$.isAuthenticationError)(c)){console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u901A\u77E5\u7528\u6237`);const d=r?.lastSenderStaffId||t.startStaffId;(0,E.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:d,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)),g(p??1);return}if(J(c)){const s=Date.now()-T<G;C(new V(s,c));return}if(me(c)){console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u9700\u8981\u6388\u6743\uFF0C\u901A\u77E5\u7528\u6237`);const d=r?.lastSenderStaffId||t.startStaffId;(0,E.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:d,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)),g(p??1);return}if(t.claudeSessionId&&ge(c)){console.log(`[${(0,n.timestamp)()}] Claude \u4F1A\u8BDD\u5DF2\u5931\u6548: ${t.claudeSessionId}\uFF0C\u901A\u77E5\u5916\u5C42\u91CD\u65B0\u53D1\u8D77\u65B0\u4F1A\u8BDD`),C(new ee);return}if(fe(c)){console.log(`[${(0,n.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{a.default.appendFileSync(I,`[${(0,n.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u5C06\u81EA\u52A8 /compact
18
+ `,"utf-8")}catch{}C(new te);return}C(new Error(`Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${p}`))}),S.on("error",p=>{W=!0,l&&(clearInterval(l),l=null),console.error("Claude \u8FDB\u7A0B\u9519\u8BEF:",p),a.default.appendFileSync(I,`[${(0,n.timestamp)()}] [ERROR]: \u8FDB\u7A0B\u9519\u8BEF: ${p.message}
19
+ `,"utf-8"),C(p)})})}const ie="<!-- cc-ding:session-context-start (DO NOT EDIT) -->",z="<!-- cc-ding:session-context-end (DO NOT EDIT) -->";function se(e,t){const o=e.getConversationConfig(t),i=e.config;return[ie,"# cc-ding Session Context","","## Client",`- clientId: \`${e.clientId}\``,i.clientName?`- clientName: ${i.clientName}`:"",`- owner: ${i.owner}`,"","## Conversation",`- conversationId: \`${t}\``,o?.conversationType?`- conversationType: ${o.conversationType==="1"?"\u5355\u804A":"\u7FA4\u804A"}`:"",o?.conversationTitle?`- conversationTitle: ${o.conversationTitle}`:"",o?.linkConversationId?`- linkConversationId: \`${o.linkConversationId}\` (\u5173\u8054\u7FA4\uFF0C\u5171\u4EAB\u5DE5\u4F5C\u76EE\u5F55)`:"","","## Settings",o?.permissionMode?`- permissionMode: ${o.permissionMode}`:"",o?.agent?`- agent: ${o.agent}`:"",o?.taskCfg?.skill?`- taskCfg.skill: ${o.taskCfg.skill}`:"",i.resultOnly!==void 0?`- resultOnly: ${i.resultOnly}`:"",i.includeThinking!==void 0?`- includeThinking: ${i.includeThinking}`:"",i.preBash?`- preBash(\u5168\u5C40): \`${i.preBash}\``:"",o?.preBash?`- preBash(\u7FA4): \`${o.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",z].filter(Boolean).join(`
20
20
  `)+`
21
- `}function writeContextToFile(e,t,n){const i=e.getConversationDir(t),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(e){const t=Array.isArray(e.config.conversations)?e.config.conversations:[];for(const n of t){const i=buildContextContent(e,n.conversationId);injectedContextCache.set(n.conversationId,i),writeContextToFile(e,n.conversationId,i)}}function injectSessionContextIfChanged(e,t){const n=t.conversationId,i=buildContextContent(e,n);injectedContextCache.get(n)!==i&&(injectedContextCache.set(n,i),writeContextToFile(e,n,i))}async function executeClaudeQuery(e,t,n,i){const{skill:m,agent:a,senderNick:$,senderStaffId:c}=i||{};let u=e.getSessionDir(t),y=`${u}/session.log`;const I=e.getConversationDir(t.conversationId);injectSessionContextIfChanged(e,t),fs_1.default.mkdirSync(u,{recursive:!0});let f=null;const E=(0,api_key_manager_1.readApiKeyFromSettings)(I);if(E&&e.config.apiKeyCfg&&(f=e.config.apiKeyCfg.claudeSettings.find(o=>(0,secrets_1.resolveSecret)(o.apiKey)===E&&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)&&e.config.apiKeyCfg&&(f=(0,api_key_manager_1.pickValidApiKey)(e),!f)){const o=c||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),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 k=$&&c?`${n} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${$}(${c})`:n;e.appendSessionLog(u,"user",k);const C="claude",x=["--permission-mode",i?.permissionMode??"acceptEdits","--print","--output-format","stream-json","--verbose"];a&&x.push("--agent",a);const b=m?`/${m} ${k}`:k;let h=0,g=0,v=0;const A=[],_=e.activeSessions.get(t.conversationId),r=o=>{const d=e.activeSessions.get(t.conversationId);return!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||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),atUserId:R,content:`\u{1F504} \u68C0\u6D4B\u5230 Claude \u9677\u5165\u65E0\u9650\u91CD\u8BD5\uFF0C\u5DF2\u7EC8\u6B62\uFF08${S}\uFF09
21
+ `}function re(e,t,o){const i=e.getConversationDir(t),y=j.default.join(i,".claude");a.default.existsSync(y)||a.default.mkdirSync(y,{recursive:!0});const f=j.default.join(y,"CLAUDE.md");if(!a.default.existsSync(f)){a.default.writeFileSync(f,o,"utf-8"),console.log(`[${(0,n.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u6CE8\u5165 CLAUDE.md: ${f}`);return}const h=a.default.readFileSync(f,"utf-8"),m=h.indexOf(ie),I=h.indexOf(z);if(m!==-1&&I!==-1&&I>m){const T=h.substring(0,m),g=h.substring(I+z.length),C=T+o+g;a.default.writeFileSync(f,C,"utf-8"),console.log(`[${(0,n.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u66F4\u65B0: ${f}`)}else a.default.writeFileSync(f,o+`
22
+ `+h,"utf-8"),console.log(`[${(0,n.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u8FFD\u52A0\u5230\u73B0\u6709 CLAUDE.md: ${f}`)}function Se(e){const t=Array.isArray(e.config.conversations)?e.config.conversations:[];for(const o of t){const i=se(e,o.conversationId);Q.set(o.conversationId,i),re(e,o.conversationId,i)}}function ae(e,t){const o=t.conversationId,i=se(e,o);Q.get(o)!==i&&(Q.set(o,i),re(e,o,i))}async function $e(e,t,o,i){const{skill:y,agent:f,senderNick:h,senderStaffId:m,newSessionId:I}=i||{};let T=e.getSessionDir(t),g=`${T}/session.log`;const C=e.getConversationDir(t.conversationId);ae(e,t),a.default.mkdirSync(T,{recursive:!0});let S=null;const A=(0,$.readApiKeyFromSettings)(C);if(A&&e.config.apiKeyCfg&&(S=e.config.apiKeyCfg.claudeSettings.find(c=>(0,X.resolveSecret)(c.apiKey)===A&&c.isValid)||null,S&&console.log(`[${(0,n.timestamp)()}] \u4ECE settings-ding.json \u6062\u590D Claude Setting: ${(0,$.settingLabel)(S)}`)),!(0,$.getForceEnabledSettingsPath)(C)&&e.config.apiKeyCfg&&(S=(0,$.pickValidApiKey)(e),!S)){const c=m||t.startStaffId;await(0,E.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:c,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D\uFF08\u65E0\u53EF\u7528 API Key\uFF09\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}const M=h&&m?`${o} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${h}(${m})`:o;e.appendSessionLog(T,"user",M);const x="claude";if(!(0,N.commandExists)(x)){const c=(0,N.formatClaudeCommandMissingMessage)(x);console.error(`[${(0,n.timestamp)()}] ${c.replace(/\n/g," ")}`),a.default.appendFileSync(g,`[${(0,n.timestamp)()}] [ERROR]: ${c}
23
+ `,"utf-8"),await(0,E.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:m||t.startStaffId,content:`\u274C ${c}`});return}const D=["--permission-mode",i?.permissionMode??"bypassPermissions","--print","--output-format","stream-json","--verbose"];f&&D.push("--agent",f);const W=y?`/${y} ${M}`:M;let l=0,k=0,R=0;const _=[],p=e.activeSessions.get(t.conversationId),r=c=>{const d=e.activeSessions.get(t.conversationId);return!d||d!==p?(console.log(`[${(0,n.timestamp)()}] \u4F1A\u8BDD\u5DF2\u88AB\u7EC8\u6B62\uFF0C${c}`),!1):d.goonPending?(console.log(`[${(0,n.timestamp)()}] \u6536\u5230 /goon \u8BF7\u6C42\uFF0C${c}`),!1):!0};for(;;){if(!r("\u505C\u6B62\u91CD\u8BD5"))return;const c=l>0;if(k>=B||k>=3&&R>0&&Date.now()-R>Z){const u=k>=B?`\u603B\u91CD\u8BD5\u6B21\u6570\u5DF2\u8FBE ${B} \u6B21`:`\u91CD\u8BD5\u6301\u7EED\u65F6\u95F4\u8D85\u8FC7 ${Z/1e3}s\uFF08\u5DF2\u91CD\u8BD5 ${k} \u6B21\uFF09`;console.error(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF: ${u}`),a.default.appendFileSync(g,`[${(0,n.timestamp)()}] [SYSTEM]: \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF\uFF0C${u}\uFF0C\u7EC8\u6B62\u91CD\u8BD5
24
+ `,"utf-8");const w=pe(g,1),b=_.slice(-1)[0]||"",L=m||t.startStaffId;await(0,E.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:L,content:`\u{1F504} \u68C0\u6D4B\u5230 Claude \u9677\u5165\u65E0\u9650\u91CD\u8BD5\uFF0C\u5DF2\u7EC8\u6B62\uFF08${u}\uFF09
24
25
 
25
26
  \u{1F4CB} \u6700\u8FD1\u91CD\u8BD5\u8BB0\u5F55\uFF1A
26
- ${w}
27
+ ${b}
27
28
 
28
29
  \u{1F4DD} \u6700\u8FD1\u65E5\u5FD7\uFF1A
29
30
  \`\`\`
30
- ${p}
31
+ ${w}
31
32
  \`\`\`
32
33
 
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];t.claudeSessionId&&(d.push("--resume",t.claudeSessionId),o||console.log(`[${(0,session_1.timestamp)()}] \u6062\u590D Claude \u4F1A\u8BDD: ${t.claudeSessionId}`));const l=resolveClaudeSettingsPath(e,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=b,console.log(`[${(0,session_1.timestamp)()}] \u6267\u884C Claude \u67E5\u8BE2[\u539F\u751Fclaude \u6A21\u5F0F]: ${C} ${d.join(" ")}`),e.debugLog(`\u53D1\u9001\u6D88\u606F: ${s.substring(0,100)}...`);try{await runClaudeOnce(e,t,d,C,I,s,o);return}catch(S){if(u=e.getSessionDir(t),y=`${u}/session.log`,S instanceof RetryableApiError){if(g++,v=v||Date.now(),(0,api_key_manager_1.isQuotaExhaustedError)(S.output)&&e.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)(e,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||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),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&&e.config.apiKeyCfg){const p=(0,api_key_manager_1.rotateApiKey)(e,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"),t.claudeSessionId&&(t.claudeSessionId=void 0,e.updateSessionFile(t,{})),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||t.startStaffId;await(0,messaging_1.sendDingMessage)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),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];t.claudeSessionId&&w.push("--resume",t.claudeSessionId);const R=resolveClaudeSettingsPath(e,I,i?.settings);R&&w.push("--settings",R);try{await runClaudeOnce(e,t,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)(e,{conversationId:(0,session_1.getReplyConversationId)(t),sessionWebhook:(0,session_1.getReplyWebhook)(t),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}}}
34
+ \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=[...D];if(t.claudeSessionId)d.push("--resume",t.claudeSessionId),c||console.log(`[${(0,n.timestamp)()}] \u6062\u590D Claude \u4F1A\u8BDD: ${t.claudeSessionId}`);else if(!c){const u=I||(0,de.randomUUID)();d.push("--session-id",u),d.push("--name",`cc-ding-${u.substring(0,8)}`),console.log(`[${(0,n.timestamp)()}] \u521B\u5EFA Claude \u4F1A\u8BDD(\u663E\u5F0F session-id): ${u}`)}const s=H(e,C,i?.settings);s&&d.push("--settings",s);let v;c?(v="\u7EE7\u7EED",console.log(`[${(0,n.timestamp)()}] \u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${l}/${P}\u6B21)`),a.default.appendFileSync(g,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${l}/${P})
35
+ `,"utf-8")):v=W,console.log(`[${(0,n.timestamp)()}] \u6267\u884C Claude \u67E5\u8BE2[\u539F\u751Fclaude \u6A21\u5F0F]: ${x} ${d.join(" ")}`),e.debugLog(`\u53D1\u9001\u6D88\u606F: ${v.substring(0,100)}...`);try{await oe(e,t,d,x,C,v,c);return}catch(u){if(T=e.getSessionDir(t),g=`${T}/session.log`,u instanceof V){if(k++,R=R||Date.now(),(0,$.isQuotaExhaustedError)(u.output)&&e.config.apiKeyCfg){if(_.push(`[${(0,n.timestamp)()}] 429 \u914D\u989D\u8017\u5C3D\uFF0C\u5C1D\u8BD5\u8F6E\u6362 Key`),S){const b=(0,$.rotateApiKey)(e,S.apiKey);if(b){S=b,l=0,console.log(`[${(0,n.timestamp)()}] API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,$.settingLabel)(b)}`),a.default.appendFileSync(g,`[${(0,n.timestamp)()}] [SYSTEM]: API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key
36
+ `,"utf-8");continue}}const w=m||t.startStaffId;await(0,E.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:w,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(u.isFastFail){if(l++,l>=P){if(S&&e.config.apiKeyCfg){const w=(0,$.rotateApiKey)(e,S.apiKey);if(w){S=w,l=0,console.log(`[${(0,n.timestamp)()}] TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25 ${P} \u6B21\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,$.settingLabel)(w)}`),a.default.appendFileSync(g,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25\uFF0C\u5207\u6362\u5230\u65B0 Key
37
+ `,"utf-8");continue}}throw console.log(`[${(0,n.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${P}\u6B21\uFF0C\u653E\u5F03`),a.default.appendFileSync(g,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${P}\u6B21\uFF0C\u653E\u5F03
38
+ `,"utf-8"),new Error(`TPM \u9650\u6D41\uFF0C\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED ${P} \u6B21`)}console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${K/1e3}s \u540E\u91CD\u8BD5 (${l}/${P})`)}else l=0,console.log(`[${(0,n.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${K/1e3}s \u540E\u91CD\u8BD5`);if(a.default.appendFileSync(g,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C${K/1e3}s \u540E\u91CD\u8BD5
39
+ `,"utf-8"),_.push(`[${(0,n.timestamp)()}] TPM \u9650\u6D41\uFF0C${K/1e3}s \u540E\u91CD\u8BD5`),await le(K),!r("\u505C\u6B62\u5F53\u524D\u91CD\u8BD5"))return;continue}if(u instanceof ee){k++,R=R||Date.now(),_.push(`[${(0,n.timestamp)()}] \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD`),console.log(`[${(0,n.timestamp)()}] Claude \u4F1A\u8BDD\u5931\u6548\uFF0C\u6E05\u9664 claudeSessionId \u5E76\u91CD\u65B0\u53D1\u8D77`),a.default.appendFileSync(g,`[${(0,n.timestamp)()}] [SYSTEM]: Claude \u4F1A\u8BDD\u5DF2\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD\u5E76\u91CD\u65B0\u53D1\u8D77
40
+ `,"utf-8"),t.claudeSessionId&&(t.claudeSessionId=void 0,e.updateSessionFile(t,{})),l=0;continue}if(u instanceof te){k++,R=R||Date.now(),_.push(`[${(0,n.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8 /compact`),console.log(`[${(0,n.timestamp)()}] \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587`),a.default.appendFileSync(g,`[${(0,n.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587
41
+ `,"utf-8");const w=m||t.startStaffId;await(0,E.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:w,content:"\u{1F4E6} \u4E0A\u4E0B\u6587\u8D85\u957F\uFF0C\u6B63\u5728\u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u540E\u7EE7\u7EED..."});const b=[...D];t.claudeSessionId&&b.push("--resume",t.claudeSessionId);const L=H(e,C,i?.settings);L&&b.push("--settings",L);try{await oe(e,t,b,x,C,"/compact",!1),console.log(`[${(0,n.timestamp)()}] /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C`),a.default.appendFileSync(g,`[${(0,n.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C
42
+ `,"utf-8")}catch(F){throw console.error(`[${(0,n.timestamp)()}] /compact \u6267\u884C\u5931\u8D25:`,F),a.default.appendFileSync(g,`[${(0,n.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u5931\u8D25: ${F instanceof Error?F.message:String(F)}
43
+ `,"utf-8"),await(0,E.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:w,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: ${F instanceof Error?F.message:String(F)}`)}l=0;continue}throw u}}}
@@ -1,2 +1,3 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runOneShotPrompt=runOneShotPrompt;const claude_agent_sdk_1=require("@anthropic-ai/claude-agent-sdk");async function runOneShotPrompt(i,c){const{cwd:d,settingsPath:o,timeoutMs:p=6e4}=c,r=new AbortController,n=setTimeout(()=>r.abort(),p);n.unref?.();let u="",l="",a=!1,s="";try{const e=(0,claude_agent_sdk_1.query)({prompt:i,options:{cwd:d,permissionMode:"default",allowedTools:[],maxTurns:1,abortController:r,stderr:t=>{u+=t},...o?{extraArgs:{settings:o}}:{}}});for await(const t of e)t.type==="result"&&(t.subtype==="success"?(l=t.result,a=!0):s=`result: ${t.subtype}`)}catch(e){s=e instanceof Error?e.message:String(e)}finally{clearTimeout(n)}return{ok:a,text:l,errorOutput:[u,s].filter(Boolean).join(`
2
- `),timedOut:r.signal.aborted}}
1
+ "use strict";var h=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.runOneShotPrompt=S;const M=h(require("readline")),a=require("./platform"),w=require("./claude-process");async function S(e,p){const{cwd:_,settingsPath:l,timeoutMs:O=6e4}=p;if(!(0,a.commandExists)("claude"))return{ok:!1,text:"",errorOutput:(0,a.formatClaudeCommandMissingMessage)("claude"),timedOut:!1};const c=["--output-format","stream-json","--max-turns","1","--permission-mode","default"];l&&c.push("--settings",l);let o="",d="",i=!1,s="",u=!1;try{const t=(0,a.spawnCommand)("claude",c,{cwd:_,stdio:["pipe","pipe","pipe"]});t.stdin.write(`${e}
2
+ `),t.stdin.end();const f=setTimeout(()=>{u=!0,t.kill("SIGTERM")},O);f.unref?.(),t.stderr.on("data",r=>{o+=r.toString()});const g=M.default.createInterface({input:t.stdout});for await(const r of g){const n=(0,w.parseClaudeStreamLine)(r);n?.type==="result"&&(d=n.content||"",i=!0)}const m=await new Promise(r=>{t.on("close",n=>{r(n)}),t.on("error",()=>{r(1)})});clearTimeout(f),u?s="One-shot prompt \u8D85\u65F6":!i&&m!==0&&(s=o.trim()||`\u5B50\u8FDB\u7A0B\u9000\u51FA\u7801: ${m}`)}catch(t){s=t instanceof Error?t.message:String(t)}return{ok:i,text:d,errorOutput:[o,s].filter(Boolean).join(`
3
+ `),timedOut:u}}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.route=route;function route(r,t,u){return{name:r,async tryHandle(){const e=t();return e==null||e===!1?!1:(await u(e),!0)}}}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.route=n;function n(r,t,u){return{name:r,async tryHandle(){const e=t();return e==null||e===!1?!1:(await u(e),!0)}}}
@@ -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.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\u4EC5 owner/\u7BA1\u7406\u5458\uFF0C\u6267\u884C\u5C06\u8BB0\u5F55\u5BA1\u8BA1\u65E5\u5FD7\uFF1B\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",ownerOnly:!0},{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\uFF0C\u5F55\u5236\u4E2D\u53EF\u53D1\u9001 /exit \u6216 /e \u5FEB\u6377\u9000\u51FA\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(n=>n.toLowerCase()===t))}function formatHelpOverview(e,t){const s=COMMAND_REGISTRY.filter(r=>t||!r.ownerOnly),n=["### \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=s.filter(a=>a.category===r);if(i.length!==0){n.push(`${o} **${r}**`);for(const a of i)n.push(`- \`${a.name}\` ${a.description}`);n.push("")}}return n.push("\u{1F4A1} \u8F93\u5165 `/{\u547D\u4EE4} --help` \u67E5\u770B\u547D\u4EE4\u8BE6\u7EC6\u7528\u6CD5"),n.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,n){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}`),n&&r.push(`- **\u5DE5\u4F5C\u76EE\u5F55:** \`${n}\``),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=>s?.(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 s=e.apiKeyCfg.claudeSettings.filter(n=>n.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 n=parseInt(s[1],10);return isNaN(n)||n<=0?10:n}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 n=s[1].trim().split(/\s+/),r=n[0]||"",o=n[1]?parseInt(n[1],10):1;return{target:r,depth:isNaN(o)||o<0?1:Math.min(o,5)}}function findSubdirByName(e,t,s=3){const n=[{dir:e,depth:0}];for(;n.length>0;){const{dir:r,depth:o}=n.shift();if(!(o>s))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);n.push({dir:path_1.default.join(r,a.name),depth:o+1})}}catch{continue}}return null}function getDirectoryStructure(e,t=0,s=1){try{const n=fs_1.default.readdirSync(e,{withFileTypes:!0}).filter(i=>!i.name.startsWith("."));if(n.length===0)return t===0?"\u{1F4C2} \u76EE\u5F55\u4E3A\u7A7A":"";n.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 n){const a=i.isDirectory()?"\u{1F4C1} ":"\u{1F4C4} ",m=i.isDirectory()?"/":"";if(r.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&&r.push(u)}}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(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 n=s.match(/^(?:delete|rm)\s+(\S+)$/i);if(n)return{type:"delete",id:n[1]};const r=s.match(/^pause\s+(\S+)$/i);if(r)return{type:"pause",id:r[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 n={},r=s.split(/\s+/);for(let o=0;o<r.length;o++){const i=r[o];if(i==="--dingToken"&&r[o+1])n.dingToken=r[++o];else if(i==="--linkConversationId"&&r[o+1])n.linkConversationId=r[++o];else if(i==="--conversationId"&&r[o+1])n.conversationId=r[++o];else if(i==="--whiteUserList"&&r[o+1])n.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&&(n.conversationTitle=a.join(" "))}else if(i==="--atSender"&&r[o+1]){const a=r[++o].toLowerCase();n.atSender=a==="true"||a==="1"||a==="yes"}else if(i==="--receiveReply"&&r[o+1]){const a=r[++o].toLowerCase();n.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&&(n.preBash=a.join(" ").replace(/^["']|["']$/g,""))}else i==="--permissionMode"&&r[o+1]&&(n.permissionMode=r[++o])}return n}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 n=s.match(/^rm\s+(.+)$/i);if(n){const o=n[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 r=s.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(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 n=t.match(/^\/auth\s+admin\s+(?:rm|del)\s+(\S+)$/i);if(n)return{type:"adminRm",staffId:n[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 parseGoonCommand(e){return/^\/goon$/i.test(e.trim())}function parseCcCommand(e){const s=e.trim().match(/^\/cc\s+(.+)$/i);if(!s)return null;const n=s[1].trim();return n.startsWith("/")?n:`/${n}`}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 n=s.substring(5).trim();if(/^list$/i.test(n))return{type:"list"};if(!n)return{type:"list"};const r=n.match(/^mode\s+(staffId|dingtalkId)$/i);if(r)return{type:"mode",mode:r[1]};const o=n.match(/^done\s+(\d+)$/i);if(o)return{type:"done",index:parseInt(o[1],10)};if(/^rm\s+all$/i.test(n))return{type:"remove",index:"all"};const i=n.match(/^rm\s+(\d+)$/i);if(i)return{type:"remove",index:parseInt(i[1],10)};if(/^remind\s+-1$/i.test(n))return{type:"remind",hour:null};const a=n.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=n,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(),n=s.startsWith("-g "),r=n?s.substring(3).trim():s;if(!s)return{type:"show"};if(n&&!r)return{type:"list",isGlobal:!0};const o=r.match(/^trigger\s+(\S+)$/i);if(o&&!n)return{type:"trigger",word:o[1]};const i=r.match(/^add\s+(.+)$/i);if(i)return{type:"add",command:i[1].trim(),isGlobal:n};const a=r.match(/^del(?:ete)?\s+(\d+)$/i);return a?{type:"del",index:parseInt(a[1],10),isGlobal:n}:/^list$/i.test(r)?{type:"list",isGlobal:n}:n?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 n=s.match(/^--update(?:\s+(\S+))?$/i);return n?{update:!0,tag:n[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 g=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseHelpCommand=w,exports.parseCommandHelp=k,exports.getCommandByName=I,exports.formatHelpOverview=b,exports.formatCommandHelp=M,exports.parseEndCommand=S,exports.parseInfoCommand=L,exports.formatConversationInfo=T,exports.formatGlobalConfig=v,exports.parseLogCommand=q,exports.parseLsCommand=D,exports.findSubdirByName=O,exports.getDirectoryStructure=$,exports.parseContinueSessionCommand=R,exports.parseCronCommand=_,exports.parseVersionCommand=B,exports.parseOpenCommand=A,exports.parseCleanCommand=N,exports.parseResetApiKeyCfgCommand=H,exports.parseCfgCommand=U,exports.parseBashCommand=E,exports.parseMqCommand=G,exports.parseAuthCommand=K,exports.parseGoonCommand=W,exports.parseCcCommand=P,exports.parseClaudeMdCommand=V,exports.parseInterruptCommand=Y,exports.parseTodoCommand=z,exports.parseMenuCommand=F,exports.parseRebootCommand=Q,exports.parseRecorderCommandEnhanced=J;const y=g(require("fs")),l=g(require("path")),C=[{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\u4EC5 owner/\u7BA1\u7406\u5458\uFF0C\u6267\u884C\u5C06\u8BB0\u5F55\u5BA1\u8BA1\u65E5\u5FD7\uFF1B\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",ownerOnly:!0},{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\uFF0C\u5F55\u5236\u4E2D\u53EF\u53D1\u9001 /exit \u6216 /e \u5FEB\u6377\u9000\u51FA\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}],x=[{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 w(e){return e.trim().toLowerCase()==="/help"}function k(e){const s=e.trim().match(/^(\/\w+)\s+--help$/i);return s?s[1].toLowerCase():null}function I(e){const t=e.toLowerCase();return C.find(s=>s.name.toLowerCase()===t||s.aliases?.some(n=>n.toLowerCase()===t))}function b(e,t){const s=C.filter(r=>t||!r.ownerOnly),n=["### \u{1F917}","----",`- **\u7248\u672C:** ${e}`,"- **\u4F5C\u8005:** yihuineng","- **Github:** https://github.com/yihuineng/cc-ding","----"];for(const{category:r,icon:i}of x){const o=s.filter(a=>a.category===r);if(o.length!==0){n.push(`${i} **${r}**`);for(const a of o)n.push(`- \`${a.name}\` ${a.description}`);n.push("")}}return n.push("\u{1F4A1} \u8F93\u5165 `/{\u547D\u4EE4} --help` \u67E5\u770B\u547D\u4EE4\u8BE6\u7EC6\u7528\u6CD5"),n.join(`
2
+ `)}function M(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 S(e){return e.trim().toLowerCase()==="/end"}function L(e){const t=e.trim().toLowerCase();return t==="/info"?"all":t==="/info robot"?"robot":t==="/info session"?"session":t==="/info task"?"task":null}function T(e,t,s,n){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}`),n&&r.push(`- **\u5DE5\u4F5C\u76EE\u5F55:** \`${n}\``),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 i=e.whiteUserList.map(o=>s?.(o)||o).join(", ");r.push(`- **\u7FA4\u767D\u540D\u5355:** ${i}`)}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 v(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(n=>n.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 q(e){const s=e.trim().match(/^\/log(?:\s+(\d+))?$/i);if(!s)return null;const n=parseInt(s[1],10);return isNaN(n)||n<=0?10:n}function D(e){const s=e.trim().match(/^\/ls(?:\s+(.+))?$/i);if(!s)return null;if(s[1]===void 0)return{target:"",depth:1};const n=s[1].trim().split(/\s+/),r=n[0]||"",i=n[1]?parseInt(n[1],10):1;return{target:r,depth:isNaN(i)||i<0?1:Math.min(i,5)}}function O(e,t,s=3){const n=[{dir:e,depth:0}];for(;n.length>0;){const{dir:r,depth:i}=n.shift();if(!(i>s))try{const o=y.default.readdirSync(r,{withFileTypes:!0});for(const a of o)if(!(!a.isDirectory()||a.name.startsWith("."))){if(a.name===t)return l.default.join(r,a.name);n.push({dir:l.default.join(r,a.name),depth:i+1})}}catch{continue}}return null}function $(e,t=0,s=1){try{const n=y.default.readdirSync(e,{withFileTypes:!0}).filter(o=>!o.name.startsWith("."));if(n.length===0)return t===0?"\u{1F4C2} \u76EE\u5F55\u4E3A\u7A7A":"";n.sort((o,a)=>o.isDirectory()!==a.isDirectory()?o.isDirectory()?-1:1:o.name.localeCompare(a.name));const r=[],i=". ".repeat(t);for(const o of n){const a=o.isDirectory()?"\u{1F4C1} ":"\u{1F4C4} ",m=o.isDirectory()?"/":"";if(r.push(`${i}${a}${o.name}${m}`),o.isDirectory()&&t<s){const u=l.default.join(e,o.name),d=$(u,t+1,s);d&&r.push(d)}}return r.join(`
6
+ `)}catch{return t===0?"\u274C \u65E0\u6CD5\u8BFB\u53D6\u76EE\u5F55":""}}function R(e){const t=e.trim().match(/^\/resume(?:\s+(\S+))?$/i);return t?t[1]!==void 0?t[1]:"":null}function j(e){const t=e.trim().split(/\s+/);return t.length!==5?!1:t.every(s=>/^[\d*/\-]+$/.test(s))}function _(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 n=s.match(/^(?:delete|rm)\s+(\S+)$/i);if(n)return{type:"delete",id:n[1]};const r=s.match(/^pause\s+(\S+)$/i);if(r)return{type:"pause",id:r[1]};const i=s.match(/^resume\s+(\S+)$/i);if(i)return{type:"resume",id:i[1]};const o=s.match(/^(\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s+(.+)$/);return o&&j(o[1])?{type:"create_cron",cronExpression:o[1],prompt:o[2]}:{type:"create_nl",input:s}}function B(e){return e.trim()==="/version"}function A(e){const t=e.trim().toLowerCase();return t==="/open"?"folder":t==="/open shell"?"shell":t==="/open code"?"code":null}function N(e){const t=e.trim().toLowerCase();return t==="/clean"?"current":t==="/clean all"?"all":null}function H(e){return e.trim().toLowerCase()==="/reset-apikeycfg"}function U(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 n={},r=s.split(/\s+/);for(let i=0;i<r.length;i++){const o=r[i];if(o==="--dingToken"&&r[i+1])n.dingToken=r[++i];else if(o==="--linkConversationId"&&r[i+1])n.linkConversationId=r[++i];else if(o==="--conversationId"&&r[i+1])n.conversationId=r[++i];else if(o==="--whiteUserList"&&r[i+1])n.whiteUserList=r[++i].split(",").map(a=>a.trim()).filter(Boolean);else if(o==="--conversationTitle"&&r[i+1]){const a=[];for(;i+1<r.length&&!r[i+1].startsWith("--");)a.push(r[++i]);a.length>0&&(n.conversationTitle=a.join(" "))}else if(o==="--atSender"&&r[i+1]){const a=r[++i].toLowerCase();n.atSender=a==="true"||a==="1"||a==="yes"}else if(o==="--receiveReply"&&r[i+1]){const a=r[++i].toLowerCase();n.receiveReply=a==="true"||a==="1"||a==="yes"}else if(o==="--preBash"&&r[i+1]){const a=[];for(;i+1<r.length&&!r[i+1].startsWith("--");)a.push(r[++i]);a.length>0&&(n.preBash=a.join(" ").replace(/^["']|["']$/g,""))}else o==="--permissionMode"&&r[i+1]&&(n.permissionMode=r[++i])}return n}function E(e){const s=e.trim().match(/^\/bash\s+(.+)$/i);return s&&s[1].trim()||null}function G(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"};if(/^rm$/i.test(s))return{type:"rm",all:!0};const n=s.match(/^rm\s+(.+)$/i);if(n){const r=n[1].trim(),i=[],o=r.match(/^(\d+)\s*-\s*(\d+)$/);if(o){const m=parseInt(o[1],10),u=parseInt(o[2],10);if(m>0&&u>=m){for(let d=m;d<=u;d++)i.push(d);return{type:"rm",indices:i}}}const a=r.split(/\s+/);for(const m of a){const u=parseInt(m,10);u>0&&i.push(u)}if(i.length>0)return{type:"rm",indices:i}}return null}function K(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 n=t.match(/^\/auth\s+admin\s+(?:rm|del)\s+(\S+)$/i);if(n)return{type:"adminRm",staffId:n[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 i=t.match(/^\/auth\s+(?:del(?:ete)?|rm)\s+(\S+)$/i);if(i)return{type:"del",staffId:i[1]};const o=t.match(/^\/auth\s+approve\s+(\S+)$/i);if(o)return{type:"approve",requestId:o[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 W(e){return/^\/goon$/i.test(e.trim())}function P(e){const s=e.trim().match(/^\/cc\s+(.+)$/i);if(!s)return null;const n=s[1].trim();return n.startsWith("/")?n:`/${n}`}function V(e){return/^\/claude\.md$/i.test(e.trim())}function Y(e){return e.trim()==="/!"}function z(e,t){const s=e.trim();if(!/^\/todo(?:\s|$)/i.test(s)&&s.toLowerCase()!=="/todo")return null;const n=s.substring(5).trim();if(/^list$/i.test(n))return{type:"list"};if(!n)return{type:"list"};const r=n.match(/^mode\s+(staffId|dingtalkId)$/i);if(r)return{type:"mode",mode:r[1]};const i=n.match(/^done\s+(\d+)$/i);if(i)return{type:"done",index:parseInt(i[1],10)};if(/^rm\s+all$/i.test(n))return{type:"remove",index:"all"};const o=n.match(/^rm\s+(\d+)$/i);if(o)return{type:"remove",index:parseInt(o[1],10)};if(/^remind\s+-1$/i.test(n))return{type:"remind",hour:null};const a=n.match(/^remind\s+(\d+)$/i);if(a){const c=parseInt(a[1],10);return c>=0&&c<=23?{type:"remind",hour:c}:null}let m=n,u,d,p;const f=m.match(/@(\S+)/);if(f){const c=f[1];m=m.replace(/@\S+/,"").trim(),u=c,d=c}const h=m.match(/\bddl\s+(.+)$/i);return h&&(p=h[1].trim(),m=m.replace(/\bddl\s+.+$/i,"").trim()),m?{type:"add",content:m,assigneeId:u,assigneeNick:d,deadline:p}:null}function F(e){const t=e.trim();if(!/^\/menu(?:\s|$)/i.test(t)&&t.toLowerCase()!=="/menu")return null;const s=t.substring(5).trim(),n=s.startsWith("-g "),r=n?s.substring(3).trim():s;if(!s)return{type:"show"};if(n&&!r)return{type:"list",isGlobal:!0};const i=r.match(/^trigger\s+(\S+)$/i);if(i&&!n)return{type:"trigger",word:i[1]};const o=r.match(/^add\s+(.+)$/i);if(o)return{type:"add",command:o[1].trim(),isGlobal:n};const a=r.match(/^del(?:ete)?\s+(\d+)$/i);return a?{type:"del",index:parseInt(a[1],10),isGlobal:n}:/^list$/i.test(r)?{type:"list",isGlobal:n}:n?null:{type:"show"}}function Q(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 n=s.match(/^--update(?:\s+(\S+))?$/i);return n?{update:!0,tag:n[1]}:null}function J(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,4 +1,4 @@
1
- "use strict";var __importDefault=this&&this.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.CronEngine=void 0,exports.isValidCronExpression=isValidCronExpression,exports.formatCronJobList=formatCronJobList,exports.formatCronJobInfo=formatCronJobInfo;const fs_1=__importDefault(require("fs")),utils_ok_1=require("utils-ok"),messaging_1=require("./messaging"),claude_process_1=require("./claude-process"),claude_sdk_1=require("./claude-sdk"),task_1=require("./task"),session_1=require("./session");function getCronFile(s){return`${(0,session_1.getClientDir)(s)}/cron.json`}function loadCronJobs(s){const t=getCronFile(s);try{const e=JSON.parse(fs_1.default.readFileSync(t,"utf-8"));return Array.isArray(e)?e:e.jobs||[]}catch{return[]}}function saveCronJobs(s,t){const e=getCronFile(s);fs_1.default.writeFileSync(e,JSON.stringify(t,null,2),"utf-8")}function matchesCronField(s,t,e,n){if(s==="*")return!0;if(s.includes(","))return s.split(",").some(r=>matchesCronField(r.trim(),t,e,n));if(s.includes("/")){const r=s.indexOf("/"),c=s.substring(0,r),i=parseInt(s.substring(r+1),10);if(isNaN(i)||i<=0)return!1;let a=e,d=n;if(c!=="*")if(c.includes("-")){const u=c.split("-").map(Number);a=u[0],d=u[1]}else a=parseInt(c,10),d=n;return t<a||t>d?!1:(t-a)%i===0}if(s.includes("-")){const r=s.split("-").map(Number);return t>=r[0]&&t<=r[1]}const o=parseInt(s,10);return!isNaN(o)&&t===o}function matchesCron(s,t){const e=s.trim().split(/\s+/);if(e.length!==5)return!1;const n=t.getMinutes(),o=t.getHours(),r=t.getDate(),c=t.getMonth()+1,i=t.getDay();if(!matchesCronField(e[0],n,0,59)||!matchesCronField(e[1],o,0,23)||!matchesCronField(e[3],c,1,12))return!1;const a=matchesCronField(e[2],r,1,31),d=matchesCronField(e[4],i,0,7)||i===0&&matchesCronField(e[4],7,0,7),u=e[2]==="*",l=e[4]==="*";return u&&l?!0:u?d:l?a:a||d}function isValidCronExpression(s){const t=s.trim().split(/\s+/);if(t.length!==5)return!1;const e=/^(\*|\d+|\d+-\d+|\*\/\d+|\d+\/\d+|\d+-\d+\/\d+|\d+(,\d+)+)$/;return t.every(n=>e.test(n))}const ANALYSIS_PROMPT=`\u5206\u6790\u4EE5\u4E0B\u5B9A\u65F6\u4EFB\u52A1\u63CF\u8FF0\uFF0C\u63D0\u53D6cron\u8868\u8FBE\u5F0F\u548C\u4EFB\u52A1\u5185\u5BB9\u3002
1
+ "use strict";var C=exports&&exports.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.CronEngine=void 0,exports.isValidCronExpression=$,exports.formatCronJobList=M,exports.formatCronJobInfo=_;const h=C(require("fs")),S=require("utils-ok"),I=require("./messaging"),p=require("./claude-process"),k=require("./claude-sdk"),N=require("./task"),i=require("./session");function g(s){return`${(0,i.getClientDir)(s)}/cron.json`}function y(s){const t=g(s);try{const e=JSON.parse(h.default.readFileSync(t,"utf-8"));return Array.isArray(e)?e:e.jobs||[]}catch{return[]}}function w(s,t){const e=g(s);h.default.writeFileSync(e,JSON.stringify(t,null,2),"utf-8")}function u(s,t,e,n){if(s==="*")return!0;if(s.includes(","))return s.split(",").some(r=>u(r.trim(),t,e,n));if(s.includes("/")){const r=s.indexOf("/"),a=s.substring(0,r),o=parseInt(s.substring(r+1),10);if(isNaN(o)||o<=0)return!1;let d=e,l=n;if(a!=="*")if(a.includes("-")){const f=a.split("-").map(Number);d=f[0],l=f[1]}else d=parseInt(a,10),l=n;return t<d||t>l?!1:(t-d)%o===0}if(s.includes("-")){const r=s.split("-").map(Number);return t>=r[0]&&t<=r[1]}const c=parseInt(s,10);return!isNaN(c)&&t===c}function v(s,t){const e=s.trim().split(/\s+/);if(e.length!==5)return!1;const n=t.getMinutes(),c=t.getHours(),r=t.getDate(),a=t.getMonth()+1,o=t.getDay();if(!u(e[0],n,0,59)||!u(e[1],c,0,23)||!u(e[3],a,1,12))return!1;const d=u(e[2],r,1,31),l=u(e[4],o,0,7)||o===0&&u(e[4],7,0,7),f=e[2]==="*",m=e[4]==="*";return f&&m?!0:f?l:m?d:d||l}function $(s){const t=s.trim().split(/\s+/);if(t.length!==5)return!1;const e=/^(\*|\d+|\d+-\d+|\*\/\d+|\d+\/\d+|\d+-\d+\/\d+|\d+(,\d+)+)$/;return t.every(n=>e.test(n))}const J=`\u5206\u6790\u4EE5\u4E0B\u5B9A\u65F6\u4EFB\u52A1\u63CF\u8FF0\uFF0C\u63D0\u53D6cron\u8868\u8FBE\u5F0F\u548C\u4EFB\u52A1\u5185\u5BB9\u3002
2
2
 
3
3
  \u7528\u6237\u8F93\u5165: {INPUT}
4
4
 
@@ -13,8 +13,8 @@
13
13
  - \u6BCF30\u5206\u949F: "*/30 * * * *"
14
14
  - \u6BCF\u5929\u4E2D\u534812\u70B9: "0 12 * * *"
15
15
  - \u6BCF\u67081\u53F7\u65E9\u4E0A9\u70B9: "0 9 1 * *"
16
- - \u6BCF\u5468\u4E94\u4E0B\u53483\u70B9: "0 15 * * 5"`;async function analyzeCronWithClaude(s,t,e){const n=s.getConversationDir(t),o=ANALYSIS_PROMPT.replace("{INPUT}",e),r=(0,claude_process_1.resolveClaudeSettingsPath)(s,n);console.log(`[${(0,session_1.timestamp)()}] Cron\u5206\u6790(Agent SDK): cwd=${n}`);const c=await(0,claude_sdk_1.runOneShotPrompt)(o,{cwd:n,settingsPath:r,timeoutMs:6e4});if(!c.ok){if(c.timedOut)throw new Error("\u5206\u6790\u8D85\u65F6(60s)");const i=c.errorOutput;throw console.error(`[${(0,session_1.timestamp)()}] Cron\u5206\u6790\u5931\u8D25: ${i.trim().substring(0,200)}`),/\b429\b/.test(i)?new Error("Claude \u914D\u989D\u5DF2\u8017\u5C3D(429)\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u6216\u660E\u5929\u518D\u8BD5"):/\b422\b/.test(i)||/TPM|额度超限/i.test(i)?new Error("Claude TPM \u9650\u6D41(422)\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5"):/\b401\b/.test(i)||/auth|认证|permission/i.test(i)?new Error("Claude \u8BA4\u8BC1\u5931\u8D25(401)\uFF0C\u8BF7\u68C0\u67E5 API Key \u914D\u7F6E"):new Error(`\u5206\u6790\u5931\u8D25: ${i.trim().substring(0,200)||"\u65E0\u8F93\u51FA\uFF0C\u8BF7\u68C0\u67E5 claude \u662F\u5426\u53EF\u7528"}`)}try{const i=c.text.match(/\{[\s\S]*\}/);if(i){const a=JSON.parse(i[0]);if(a.cron&&a.prompt)return a}}catch{throw new Error("JSON \u89E3\u6790\u5931\u8D25")}throw new Error("Claude \u8FD4\u56DE\u683C\u5F0F\u4E0D\u6B63\u786E")}function formatCronJobList(s){if(s.length===0)return"\u{1F4ED} \u6682\u65E0\u5B9A\u65F6\u4EFB\u52A1";const t=[`### \u23F0 \u5B9A\u65F6\u4EFB\u52A1\u5217\u8868
17
- `];for(const e of s){const n=e.enabled?"\u2705":"\u23F8\uFE0F",o=e.lastRunAt||"-";t.push(`**${n} ${e.id}**`),t.push(`- Cron: \`${e.cronExpression}\``),t.push(`- \u63CF\u8FF0: ${e.description}`),t.push(`- \u4EFB\u52A1: ${e.prompt}`),t.push(`- \u521B\u5EFA\u8005: ${e.senderNick}`),t.push(`- \u4E0A\u6B21\u6267\u884C: ${o}`),t.push("")}return t.push("\u{1F4A1} `/cron pause <id>` \u6682\u505C | `/cron resume <id>` \u6062\u590D | `/cron delete <id>` \u5220\u9664"),t.join(`
18
- `)}function formatCronJobInfo(s){const t=s.enabled?"\u2705 \u542F\u7528":"\u23F8\uFE0F \u6682\u505C";return[`### \u23F0 \u5B9A\u65F6\u4EFB\u52A1 ${s.id}`,"",`- **\u72B6\u6001:** ${t}`,`- **Cron:** \`${s.cronExpression}\``,`- **\u63CF\u8FF0:** ${s.description}`,`- **\u4EFB\u52A1:** ${s.prompt}`,`- **\u521B\u5EFA\u8005:** ${s.senderNick}`,`- **\u521B\u5EFA\u65F6\u95F4:** ${s.createdAt}`,`- **\u4E0A\u6B21\u6267\u884C:** ${s.lastRunAt||"-"}`].join(`
19
- `)}class CronEngine{constructor(t){this.jobs=[],this.timer=null,this.lastCheckedTime=-1,this.runningJobIds=new Set,this.MAX_CONCURRENT_JOBS=3,this.dc=t,this.jobs=loadCronJobs(t)}start(){this.startScheduler();const t=this.jobs.filter(e=>e.enabled).length;console.log(`[${(0,session_1.timestamp)()}] Cron\u5F15\u64CE\u5DF2\u542F\u52A8, \u5171 ${this.jobs.length} \u4E2A\u4EFB\u52A1 (${t} \u542F\u7528)`)}destroy(){this.stopScheduler()}addJob(t){const e={id:`cron_${Date.now()}`,conversationId:t.conversationId,cronExpression:t.cronExpression,description:t.description,prompt:t.prompt,enabled:!0,createdAt:(0,session_1.timestamp)(),senderStaffId:t.senderStaffId,senderNick:t.senderNick};return this.jobs.push(e),this.persist(),console.log(`[${(0,session_1.timestamp)()}] \u65B0\u589E\u5B9A\u65F6\u4EFB\u52A1: ${e.id} [${e.cronExpression}] ${e.description}`),e}removeJob(t){const e=this.jobs.findIndex(o=>o.id===t);if(e===-1)return!1;const n=this.jobs.splice(e,1)[0];return this.persist(),console.log(`[${(0,session_1.timestamp)()}] \u5220\u9664\u5B9A\u65F6\u4EFB\u52A1: ${n.id}`),!0}toggleJob(t,e){const n=this.jobs.find(o=>o.id===t);return n?(n.enabled=e,this.persist(),console.log(`[${(0,session_1.timestamp)()}] \u5B9A\u65F6\u4EFB\u52A1 ${n.id} ${e?"\u5DF2\u6062\u590D":"\u5DF2\u6682\u505C"}`),!0):!1}listJobs(t){return t?this.jobs.filter(e=>e.conversationId===t):[...this.jobs]}getJob(t){return this.jobs.find(e=>e.id===t)}async analyzeAndCreate(t,e,n,o){try{const r=await analyzeCronWithClaude(this.dc,t,e);return isValidCronExpression(r.cron)?{job:this.addJob({conversationId:t,cronExpression:r.cron,description:r.desc||e.substring(0,50),prompt:r.prompt,senderStaffId:n,senderNick:o})}:{error:`Claude \u8FD4\u56DE\u7684cron\u8868\u8FBE\u5F0F\u65E0\u6548: ${r.cron}`}}catch(r){return{error:r instanceof Error?r.message:String(r)}}}persist(){saveCronJobs(this.dc,this.jobs)}startScheduler(){const e=6e4-Date.now()%6e4;setTimeout(()=>{this.tick(),this.timer=setInterval(()=>this.tick(),6e4)},e)}stopScheduler(){this.timer&&(clearInterval(this.timer),this.timer=null)}tick(){const t=Date.now(),e=this.lastCheckedTime<0?t-t%6e4:this.lastCheckedTime+6e4-this.lastCheckedTime%6e4,n=t-t%6e4;for(let o=e;o<=n;o+=6e4){const r=new Date(o);if(!this.checkJobsAt(r))break}this.lastCheckedTime=t}checkJobsAt(t){if(this.runningJobIds.size>=this.MAX_CONCURRENT_JOBS)return console.warn(`[${(0,session_1.timestamp)()}] Cron\u5E76\u53D1\u4E0A\u9650(${this.MAX_CONCURRENT_JOBS}), \u8DF3\u8FC7 ${t.toISOString()} \u7684\u68C0\u67E5`),!1;for(const e of this.jobs)if(e.enabled&&!this.runningJobIds.has(e.id)){if(this.runningJobIds.size>=this.MAX_CONCURRENT_JOBS)break;matchesCron(e.cronExpression,t)&&(console.log(`[${(0,session_1.timestamp)()}] Cron\u89E6\u53D1: ${e.id} [${e.cronExpression}] ${e.description}`),this.executeJob(e).catch(n=>{console.error(`[${(0,session_1.timestamp)()}] Cron\u6267\u884C\u5931\u8D25: ${e.id}`,n)}))}return!0}async executeJob(t){this.runningJobIds.add(t.id);try{const e=this.dc.getConversationConfig(t.conversationId);if(!e){console.warn(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u7684\u4F1A\u8BDD\u914D\u7F6E\u4E0D\u5B58\u5728, \u8DF3\u8FC7\u6267\u884C`);return}if(!!!(e.dingToken||this.dc.config.defaultDingToken)){console.warn(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u65E0\u901A\u77E5\u80FD\u529B(\u65E0dingToken\u4E14\u65E0defaultDingToken), \u8DF3\u8FC7\u6267\u884C`);return}if((0,session_1.findActiveSession)(this.dc,t.conversationId)){console.log(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u7684\u4F1A\u8BDD\u6709\u6D3B\u8DC3session, \u964D\u7EA7\u5230\u4EFB\u52A1\u961F\u5217`),await this.enqueueAsTask(t);return}const r=Date.now(),c={conversationId:t.conversationId,sessionWebhook:"",startTime:r,startTimeStr:utils_ok_1.dateUtil.mm(r).format("YYYY-MM-DD-HH-mm-ss"),startStaffId:t.senderStaffId,startNickName:`[cron]${t.senderNick}`},i=(0,session_1.getSessionDir)(this.dc,c);fs_1.default.mkdirSync(i,{recursive:!0}),fs_1.default.writeFileSync(`${i}/session.json`,JSON.stringify(c,null,2),"utf-8"),this.dc.activeSessions.set(t.conversationId,{session:c,lastSenderStaffId:t.senderStaffId,isProcessing:!0,messageQueue:[],conversationConfig:e}),(0,session_1.saveActiveSession)(this.dc,t.conversationId),console.log(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u5F00\u59CB\u6267\u884C: ${t.description}`),fs_1.default.appendFileSync(`${i}/session.log`,`[${(0,session_1.timestamp)()}] [SYSTEM]: \u5B9A\u65F6\u4EFB\u52A1\u89E6\u53D1: ${t.description}
20
- `,"utf-8");try{await(0,claude_process_1.executeClaudeQuery)(this.dc,c,t.prompt,{skill:e.taskCfg?.skill,agent:e.agent,senderNick:t.senderNick,senderStaffId:t.senderStaffId,permissionMode:e.permissionMode})}catch(a){console.error(`[${(0,session_1.timestamp)()}] Cron\u6267\u884CClaude\u67E5\u8BE2\u5931\u8D25: ${t.id}`,a),await(0,messaging_1.sendDingMessage)(this.dc,{conversationId:t.conversationId,sessionWebhook:"",atUserId:t.senderStaffId,content:`\u274C \u5B9A\u65F6\u4EFB\u52A1\u6267\u884C\u5931\u8D25: ${a instanceof Error?a.message:String(a)}`})}finally{this.dc.activeSessions.delete(t.conversationId),(0,session_1.saveActiveSession)(this.dc,t.conversationId)}t.lastRunAt=(0,session_1.timestamp)(),this.persist()}finally{this.runningJobIds.delete(t.id)}}async enqueueAsTask(t){try{await(0,task_1.saveTask)(this.dc,{conversationId:t.conversationId,prompt:t.prompt,senderStaffId:t.senderStaffId,senderNickName:`[cron]${t.senderNick}`,sessionWebhook:"",type:"cron"}),console.log(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u5DF2\u964D\u7EA7\u5230\u4EFB\u52A1\u961F\u5217: ${t.description}`)}catch(e){console.error(`[${(0,session_1.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u964D\u7EA7\u5230\u4EFB\u52A1\u961F\u5217\u5931\u8D25:`,e)}t.lastRunAt=(0,session_1.timestamp)(),this.persist()}}exports.CronEngine=CronEngine;
16
+ - \u6BCF\u5468\u4E94\u4E0B\u53483\u70B9: "0 15 * * 5"`;async function b(s,t,e){const n=s.getConversationDir(t),c=J.replace("{INPUT}",e),r=(0,p.resolveClaudeSettingsPath)(s,n);console.log(`[${(0,i.timestamp)()}] Cron\u5206\u6790(Agent SDK): cwd=${n}`);const a=await(0,k.runOneShotPrompt)(c,{cwd:n,settingsPath:r,timeoutMs:6e4});if(!a.ok){if(a.timedOut)throw new Error("\u5206\u6790\u8D85\u65F6(60s)");const o=a.errorOutput;throw console.error(`[${(0,i.timestamp)()}] Cron\u5206\u6790\u5931\u8D25: ${o.trim().substring(0,200)}`),/\b429\b/.test(o)?new Error("Claude \u914D\u989D\u5DF2\u8017\u5C3D(429)\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u6216\u660E\u5929\u518D\u8BD5"):/\b422\b/.test(o)||/TPM|额度超限/i.test(o)?new Error("Claude TPM \u9650\u6D41(422)\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5"):/\b401\b/.test(o)||/auth|认证|permission/i.test(o)?new Error("Claude \u8BA4\u8BC1\u5931\u8D25(401)\uFF0C\u8BF7\u68C0\u67E5 API Key \u914D\u7F6E"):new Error(`\u5206\u6790\u5931\u8D25: ${o.trim().substring(0,200)||"\u65E0\u8F93\u51FA\uFF0C\u8BF7\u68C0\u67E5 claude \u662F\u5426\u53EF\u7528"}`)}try{const o=a.text.match(/\{[\s\S]*\}/);if(o){const d=JSON.parse(o[0]);if(d.cron&&d.prompt)return d}}catch{throw new Error("JSON \u89E3\u6790\u5931\u8D25")}throw new Error("Claude \u8FD4\u56DE\u683C\u5F0F\u4E0D\u6B63\u786E")}function M(s){if(s.length===0)return"\u{1F4ED} \u6682\u65E0\u5B9A\u65F6\u4EFB\u52A1";const t=[`### \u23F0 \u5B9A\u65F6\u4EFB\u52A1\u5217\u8868
17
+ `];for(const e of s){const n=e.enabled?"\u2705":"\u23F8\uFE0F",c=e.lastRunAt||"-";t.push(`**${n} ${e.id}**`),t.push(`- Cron: \`${e.cronExpression}\``),t.push(`- \u63CF\u8FF0: ${e.description}`),t.push(`- \u4EFB\u52A1: ${e.prompt}`),t.push(`- \u521B\u5EFA\u8005: ${e.senderNick}`),t.push(`- \u4E0A\u6B21\u6267\u884C: ${c}`),t.push("")}return t.push("\u{1F4A1} `/cron pause <id>` \u6682\u505C | `/cron resume <id>` \u6062\u590D | `/cron delete <id>` \u5220\u9664"),t.join(`
18
+ `)}function _(s){const t=s.enabled?"\u2705 \u542F\u7528":"\u23F8\uFE0F \u6682\u505C";return[`### \u23F0 \u5B9A\u65F6\u4EFB\u52A1 ${s.id}`,"",`- **\u72B6\u6001:** ${t}`,`- **Cron:** \`${s.cronExpression}\``,`- **\u63CF\u8FF0:** ${s.description}`,`- **\u4EFB\u52A1:** ${s.prompt}`,`- **\u521B\u5EFA\u8005:** ${s.senderNick}`,`- **\u521B\u5EFA\u65F6\u95F4:** ${s.createdAt}`,`- **\u4E0A\u6B21\u6267\u884C:** ${s.lastRunAt||"-"}`].join(`
19
+ `)}class E{constructor(t){this.jobs=[],this.timer=null,this.lastCheckedTime=-1,this.runningJobIds=new Set,this.MAX_CONCURRENT_JOBS=3,this.dc=t,this.jobs=y(t)}start(){this.startScheduler();const t=this.jobs.filter(e=>e.enabled).length;console.log(`[${(0,i.timestamp)()}] Cron\u5F15\u64CE\u5DF2\u542F\u52A8, \u5171 ${this.jobs.length} \u4E2A\u4EFB\u52A1 (${t} \u542F\u7528)`)}destroy(){this.stopScheduler()}addJob(t){const e={id:`cron_${Date.now()}`,conversationId:t.conversationId,cronExpression:t.cronExpression,description:t.description,prompt:t.prompt,enabled:!0,createdAt:(0,i.timestamp)(),senderStaffId:t.senderStaffId,senderNick:t.senderNick};return this.jobs.push(e),this.persist(),console.log(`[${(0,i.timestamp)()}] \u65B0\u589E\u5B9A\u65F6\u4EFB\u52A1: ${e.id} [${e.cronExpression}] ${e.description}`),e}removeJob(t){const e=this.jobs.findIndex(c=>c.id===t);if(e===-1)return!1;const n=this.jobs.splice(e,1)[0];return this.persist(),console.log(`[${(0,i.timestamp)()}] \u5220\u9664\u5B9A\u65F6\u4EFB\u52A1: ${n.id}`),!0}toggleJob(t,e){const n=this.jobs.find(c=>c.id===t);return n?(n.enabled=e,this.persist(),console.log(`[${(0,i.timestamp)()}] \u5B9A\u65F6\u4EFB\u52A1 ${n.id} ${e?"\u5DF2\u6062\u590D":"\u5DF2\u6682\u505C"}`),!0):!1}listJobs(t){return t?this.jobs.filter(e=>e.conversationId===t):[...this.jobs]}getJob(t){return this.jobs.find(e=>e.id===t)}async analyzeAndCreate(t,e,n,c){try{const r=await b(this.dc,t,e);return $(r.cron)?{job:this.addJob({conversationId:t,cronExpression:r.cron,description:r.desc||e.substring(0,50),prompt:r.prompt,senderStaffId:n,senderNick:c})}:{error:`Claude \u8FD4\u56DE\u7684cron\u8868\u8FBE\u5F0F\u65E0\u6548: ${r.cron}`}}catch(r){return{error:r instanceof Error?r.message:String(r)}}}persist(){w(this.dc,this.jobs)}startScheduler(){const e=6e4-Date.now()%6e4;setTimeout(()=>{this.tick(),this.timer=setInterval(()=>this.tick(),6e4)},e)}stopScheduler(){this.timer&&(clearInterval(this.timer),this.timer=null)}tick(){const t=Date.now(),e=this.lastCheckedTime<0?t-t%6e4:this.lastCheckedTime+6e4-this.lastCheckedTime%6e4,n=t-t%6e4;for(let c=e;c<=n;c+=6e4){const r=new Date(c);if(!this.checkJobsAt(r))break}this.lastCheckedTime=t}checkJobsAt(t){if(this.runningJobIds.size>=this.MAX_CONCURRENT_JOBS)return console.warn(`[${(0,i.timestamp)()}] Cron\u5E76\u53D1\u4E0A\u9650(${this.MAX_CONCURRENT_JOBS}), \u8DF3\u8FC7 ${t.toISOString()} \u7684\u68C0\u67E5`),!1;for(const e of this.jobs)if(e.enabled&&!this.runningJobIds.has(e.id)){if(this.runningJobIds.size>=this.MAX_CONCURRENT_JOBS)break;v(e.cronExpression,t)&&(console.log(`[${(0,i.timestamp)()}] Cron\u89E6\u53D1: ${e.id} [${e.cronExpression}] ${e.description}`),this.executeJob(e).catch(n=>{console.error(`[${(0,i.timestamp)()}] Cron\u6267\u884C\u5931\u8D25: ${e.id}`,n)}))}return!0}async executeJob(t){this.runningJobIds.add(t.id);try{const e=this.dc.getConversationConfig(t.conversationId);if(!e){console.warn(`[${(0,i.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u7684\u4F1A\u8BDD\u914D\u7F6E\u4E0D\u5B58\u5728, \u8DF3\u8FC7\u6267\u884C`);return}if(!!!(e.dingToken||this.dc.config.defaultDingToken)){console.warn(`[${(0,i.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u65E0\u901A\u77E5\u80FD\u529B(\u65E0dingToken\u4E14\u65E0defaultDingToken), \u8DF3\u8FC7\u6267\u884C`);return}if((0,i.findActiveSession)(this.dc,t.conversationId)){console.log(`[${(0,i.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u7684\u4F1A\u8BDD\u6709\u6D3B\u8DC3session, \u964D\u7EA7\u5230\u4EFB\u52A1\u961F\u5217`),await this.enqueueAsTask(t);return}const r=Date.now(),a={conversationId:t.conversationId,sessionWebhook:"",startTime:r,startTimeStr:S.dateUtil.mm(r).format("YYYY-MM-DD-HH-mm-ss"),startStaffId:t.senderStaffId,startNickName:`[cron]${t.senderNick}`},o=(0,i.getSessionDir)(this.dc,a);h.default.mkdirSync(o,{recursive:!0}),h.default.writeFileSync(`${o}/session.json`,JSON.stringify(a,null,2),"utf-8"),this.dc.activeSessions.set(t.conversationId,{session:a,lastSenderStaffId:t.senderStaffId,isProcessing:!0,messageQueue:[],conversationConfig:e}),(0,i.saveActiveSession)(this.dc,t.conversationId),console.log(`[${(0,i.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u5F00\u59CB\u6267\u884C: ${t.description}`),h.default.appendFileSync(`${o}/session.log`,`[${(0,i.timestamp)()}] [SYSTEM]: \u5B9A\u65F6\u4EFB\u52A1\u89E6\u53D1: ${t.description}
20
+ `,"utf-8");try{await(0,p.executeClaudeQuery)(this.dc,a,t.prompt,{skill:e.taskCfg?.skill,agent:e.agent,senderNick:t.senderNick,senderStaffId:t.senderStaffId,permissionMode:e.permissionMode})}catch(d){console.error(`[${(0,i.timestamp)()}] Cron\u6267\u884CClaude\u67E5\u8BE2\u5931\u8D25: ${t.id}`,d),await(0,I.sendDingMessage)(this.dc,{conversationId:t.conversationId,sessionWebhook:"",atUserId:t.senderStaffId,content:`\u274C \u5B9A\u65F6\u4EFB\u52A1\u6267\u884C\u5931\u8D25: ${d instanceof Error?d.message:String(d)}`})}finally{this.dc.activeSessions.delete(t.conversationId),(0,i.saveActiveSession)(this.dc,t.conversationId)}t.lastRunAt=(0,i.timestamp)(),this.persist()}finally{this.runningJobIds.delete(t.id)}}async enqueueAsTask(t){try{await(0,N.saveTask)(this.dc,{conversationId:t.conversationId,prompt:t.prompt,senderStaffId:t.senderStaffId,senderNickName:`[cron]${t.senderNick}`,sessionWebhook:"",type:"cron"}),console.log(`[${(0,i.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u5DF2\u964D\u7EA7\u5230\u4EFB\u52A1\u961F\u5217: ${t.description}`)}catch(e){console.error(`[${(0,i.timestamp)()}] Cron\u4EFB\u52A1 ${t.id} \u964D\u7EA7\u5230\u4EFB\u52A1\u961F\u5217\u5931\u8D25:`,e)}t.lastRunAt=(0,i.timestamp)(),this.persist()}}exports.CronEngine=E;
@@ -1,2 +1,2 @@
1
- "use strict";var __importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.printDoctorResults=printDoctorResults,exports.runDoctor=runDoctor;const session_1=require("./session"),api_key_manager_1=require("./api-key-manager"),fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),child_process_1=require("child_process");function printDoctorResults(t){console.log(""),console.log("========== cc-ding doctor ==========");const e=t.some(i=>i.level==="FATAL");for(const i of t){const r=i.level==="PASS"?"\u2713":i.level==="FATAL"?"\u2717":"\u26A0",f=i.level==="PASS"?"":`[${i.level}] `;console.log(` ${r} ${f}${i.message}`)}const a=t.filter(i=>i.level==="PASS").length,h=t.filter(i=>i.level==="WARN").length,u=t.filter(i=>i.level==="FATAL").length;console.log("------------------------------------"),console.log(` \u5408\u8BA1: ${a} \u901A\u8FC7, ${h} \u8B66\u544A, ${u} \u81F4\u547D`),console.log(e?" \u274C \u5B58\u5728\u81F4\u547D\u95EE\u9898\uFF0C\u8BF7\u4FEE\u590D\u540E\u91CD\u65B0\u8FD0\u884C":" \u2705 \u6240\u6709\u68C0\u67E5\u901A\u8FC7"),console.log(`====================================
2
- `),e&&process.exit(1)}function runDoctor(t){const e=[],a=process.version.slice(1);if(parseInt(a.split(".")[0],10)<24?e.push(check("FATAL",`Node \u7248\u672C\u8FC7\u4F4E\uFF1A${a}\uFF0C\u8981\u6C42 Node >= 24`)):e.push(check("PASS",`Node \u7248\u672C\uFF1A${a}`)),!fs_1.default.existsSync(t))return e.push(check("FATAL",`\u5BA2\u6237\u7AEF\u76EE\u5F55\u4E0D\u5B58\u5728: ${t}`)),e;e.push(check("PASS",`\u5BA2\u6237\u7AEF\u76EE\u5F55\u5B58\u5728: ${t}`));const u=path_1.default.join(t,".pid.lock");if(fs_1.default.existsSync(u))try{const s=parseInt(fs_1.default.readFileSync(u,"utf-8").trim(),10);if(!isNaN(s))try{process.kill(s,0),e.push(check("PASS",`\u8FDB\u7A0B\u8FD0\u884C\u4E2D (PID: ${s})`))}catch{e.push(check("WARN",`\u9501\u6587\u4EF6\u5B58\u5728\u4F46\u8FDB\u7A0B ${s} \u5DF2\u9000\u51FA\uFF08\u8FC7\u671F\u9501\u6587\u4EF6\uFF09`))}}catch{e.push(check("WARN",`PID \u9501\u6587\u4EF6\u8BFB\u53D6\u5F02\u5E38: ${u}`))}else e.push(check("PASS","\u65E0\u8FD0\u884C\u4E2D\u7684\u8FDB\u7A0B"));const i=path_1.default.join(t,"config.json");if(!fs_1.default.existsSync(i))return e.push(check("FATAL","config.json \u4E0D\u5B58\u5728")),e;let r;try{r=JSON.parse(fs_1.default.readFileSync(i,"utf-8"))}catch(s){return e.push(check("FATAL",`config.json \u89E3\u6790\u5931\u8D25: ${s instanceof Error?s.message:s}`)),e}e.push(check("PASS","config.json \u89E3\u6790\u6210\u529F"));const f=[{key:"clientSecret",label:"clientSecret"},{key:"defaultDingToken",label:"defaultDingToken"},{key:"whiteUserList",label:"whiteUserList",isArr:!0},{key:"owner",label:"owner"}];for(const{key:s,label:n,isArr:l}of f){const o=r[s];o==null||o===""?e.push(check("FATAL",`\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5: ${n}`)):l&&!Array.isArray(o)?e.push(check("FATAL",`${n} \u5E94\u4E3A\u6570\u7EC4`)):s!=="conversations"&&l&&o.length===0?e.push(check("WARN",`${n} \u4E3A\u7A7A\u6570\u7EC4`)):!l&&typeof o=="string"&&o.startsWith("<")?e.push(check("FATAL",`${n} \u4ECD\u4E3A\u5360\u4F4D\u7B26: ${o}`)):e.push(check("PASS",`${n} \u2713`))}r.owner?e.push(check("PASS",`owner: ${r.owner}`)):e.push(check("FATAL","owner \u672A\u914D\u7F6E\uFF0C\u7BA1\u7406\u547D\u4EE4\uFF08/clean, /open, /reset-apikeycfg, /reg, /auth\uFF09\u4E0D\u53EF\u7528"));const S=["clientSecret","defaultDingToken"];for(const s of S){const n=r[s];typeof n=="string"&&/^<.*>$/.test(n.trim())&&e.push(check("FATAL",`${s} \u4ECD\u4E3A\u5360\u4F4D\u7B26: ${n}`))}const d=new Set;if(!Array.isArray(r.conversations))e.push(check("FATAL","conversations \u5E94\u4E3A\u6570\u7EC4"));else if(r.conversations.length===0)e.push(check("PASS","conversations \u4E3A\u7A7A\u6570\u7EC4\uFF0C\u53EF\u901A\u8FC7 /reg \u547D\u4EE4\u52A8\u6001\u6CE8\u518C"));else{for(let s=0;s<r.conversations.length;s++){const n=r.conversations[s],l=`conversations[${s}]`;n.conversationId?typeof n.conversationId=="string"&&/^<.*>$/.test(n.conversationId.trim())?e.push(check("FATAL",`${l} conversationId \u4ECD\u4E3A\u5360\u4F4D\u7B26: ${n.conversationId}`)):d.has(n.conversationId)?e.push(check("WARN",`${l} conversationId \u91CD\u590D: ${n.conversationId}`)):d.add(n.conversationId):e.push(check("FATAL",`${l} \u7F3A\u5C11 conversationId`)),n.linkConversationId&&!r.conversations.some(o=>o.conversationId===n.linkConversationId)&&e.push(check("WARN",`${l} linkConversationId "${n.linkConversationId}" \u672A\u5728 conversations \u4E2D\u627E\u5230`)),n.dingToken&&typeof n.dingToken=="string"&&/^<.*>$/.test(n.dingToken.trim())&&e.push(check("WARN",`${l} dingToken \u4ECD\u4E3A\u5360\u4F4D\u7B26`))}e.push(check("PASS",`conversations \u5171 ${r.conversations.length} \u4E2A\u7FA4\u914D\u7F6E`))}if(r.apiKeyCfg){const s=r.apiKeyCfg;if(s.resetTime&&e.push(check("PASS",`apiKeyCfg.resetTime: ${s.resetTime}`)),!Array.isArray(s.claudeSettings))e.push(check("WARN","apiKeyCfg.claudeSettings \u4E0D\u662F\u6570\u7EC4"));else if(s.claudeSettings.length===0)e.push(check("WARN","apiKeyCfg.claudeSettings \u4E3A\u7A7A\uFF0C\u65E0\u5907\u7528 Key"));else{const n=new Set;for(let o=0;o<s.claudeSettings.length;o++){const c=s.claudeSettings[o],p=`apiKeyCfg.claudeSettings[${o}]`;c.apiKey?n.has(c.apiKey)?e.push(check("WARN",`${p} apiKey \u91CD\u590D: ${(0,api_key_manager_1.settingLabel)(c)}`)):n.add(c.apiKey):e.push(check("FATAL",`${p} \u7F3A\u5C11 apiKey`)),c.baseUrl||e.push(check("WARN",`${p} \u7F3A\u5C11 baseUrl`)),c.model||e.push(check("WARN",`${p} \u7F3A\u5C11 model`)),typeof c.isValid!="boolean"&&e.push(check("WARN",`${p} isValid \u7C7B\u578B\u5F02\u5E38: ${typeof c.isValid}`))}const l=s.claudeSettings.filter(o=>o.isValid).length;e.push(check("PASS",`apiKeyCfg.claudeSettings \u5171 ${s.claudeSettings.length} \u9879\uFF0C\u6709\u6548 ${l}`))}}else e.push(check("WARN","apiKeyCfg \u672A\u914D\u7F6E\uFF0C\u65E0\u6CD5\u4F7F\u7528 API Key \u6C60\u5316\u8F6E\u6362"));const A=path_1.default.join(t,"cron.json");if(fs_1.default.existsSync(A))try{const s=JSON.parse(fs_1.default.readFileSync(A,"utf-8")),n=Array.isArray(s)?s:s.jobs;if(Array.isArray(n)){const l=n.filter(o=>o.enabled!==!1).length;e.push(check("PASS",`cron.json \u5171 ${n.length} \u4E2A\u5B9A\u65F6\u4EFB\u52A1 (${l} \u542F\u7528)`));for(let o=0;o<n.length;o++){const c=n[o];c.id||e.push(check("WARN",`cron.json[${o}] \u7F3A\u5C11 id`)),c.cronExpression||e.push(check("WARN",`cron.json[${o}] \u7F3A\u5C11 cronExpression`)),c.prompt||e.push(check("WARN",`cron.json[${o}] \u7F3A\u5C11 prompt`)),c.conversationId?d.has(c.conversationId)||e.push(check("WARN",`cron.json[${o}] conversationId "${c.conversationId}" \u672A\u5728 config.json conversations \u4E2D\u627E\u5230`)):e.push(check("WARN",`cron.json[${o}] \u7F3A\u5C11 conversationId`))}}else e.push(check("WARN","cron.json \u683C\u5F0F\u5F02\u5E38\uFF0C\u65E0\u6CD5\u89E3\u6790\u4E3A\u4EFB\u52A1\u6570\u7EC4"))}catch(s){e.push(check("WARN",`cron.json \u89E3\u6790\u5931\u8D25: ${s instanceof Error?s.message:s}`))}else e.push(check("PASS","cron.json \u4E0D\u5B58\u5728 (\u65E0\u5B9A\u65F6\u4EFB\u52A1)"));const g=path_1.default.join((0,session_1.getHomeDir)(),".cc-ding","settings-tpl.json");if(fs_1.default.existsSync(g))try{const s=JSON.parse(fs_1.default.readFileSync(g,"utf-8"));if(typeof s!="object"||s===null)e.push(check("WARN","settings-tpl.json \u6839\u5143\u7D20\u4E0D\u662F\u5BF9\u8C61"));else if(!s.env||typeof s.env!="object")e.push(check("WARN","settings-tpl.json \u7F3A\u5C11 env \u5B57\u6BB5"));else{const n=Object.keys(s.env);e.push(check("PASS",`settings-tpl.json \u6709\u6548\uFF0Cenv \u5305\u542B: ${n.join(", ")||"(\u7A7A)"}`))}}catch(s){e.push(check("WARN",`settings-tpl.json \u89E3\u6790\u5931\u8D25: ${s instanceof Error?s.message:s}`))}else e.push(check("WARN","settings-tpl.json \u4E0D\u5B58\u5728\uFF0C\u521B\u5EFA settings-ding.json \u65F6\u5C06\u4F7F\u7528\u7A7A\u6A21\u677F"));try{(0,child_process_1.execSync)(process.platform==="win32"?"where claude":"which claude",{stdio:"pipe"}),e.push(check("PASS","claude \u547D\u4EE4\u53EF\u7528"))}catch{e.push(check("FATAL","claude \u547D\u4EE4\u4E0D\u53EF\u7528\uFF0C\u8BF7\u786E\u8BA4 Claude Code CLI \u5DF2\u5B89\u88C5"))}try{const s=path_1.default.join(t,".doctor-check");fs_1.default.writeFileSync(s,"ok","utf-8"),fs_1.default.unlinkSync(s),e.push(check("PASS","\u5BA2\u6237\u7AEF\u76EE\u5F55\u53EF\u5199"))}catch(s){e.push(check("FATAL",`\u5BA2\u6237\u7AEF\u76EE\u5F55\u4E0D\u53EF\u5199: ${s instanceof Error?s.message:s}`))}return e}function check(t,e){return{level:t,message:e}}
1
+ "use strict";var v=exports&&exports.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.printDoctorResults=I,exports.runDoctor=R;const N=require("./session"),F=require("./api-key-manager"),u=v(require("fs")),A=v(require("path")),T=require("./platform");function I(i){console.log(""),console.log("========== cc-ding doctor ==========");const e=i.some(r=>r.level==="FATAL");for(const r of i){const l=r.level==="PASS"?"\u2713":r.level==="FATAL"?"\u2717":"\u26A0",h=r.level==="PASS"?"":`[${r.level}] `;console.log(` ${l} ${h}${r.message}`)}const f=i.filter(r=>r.level==="PASS").length,S=i.filter(r=>r.level==="WARN").length,p=i.filter(r=>r.level==="FATAL").length;console.log("------------------------------------"),console.log(` \u5408\u8BA1: ${f} \u901A\u8FC7, ${S} \u8B66\u544A, ${p} \u81F4\u547D`),console.log(e?" \u274C \u5B58\u5728\u81F4\u547D\u95EE\u9898\uFF0C\u8BF7\u4FEE\u590D\u540E\u91CD\u65B0\u8FD0\u884C":" \u2705 \u6240\u6709\u68C0\u67E5\u901A\u8FC7"),console.log(`====================================
2
+ `),e&&process.exit(1)}function R(i){const e=[],f=process.version.slice(1);if(parseInt(f.split(".")[0],10)<24?e.push(s("FATAL",`Node \u7248\u672C\u8FC7\u4F4E\uFF1A${f}\uFF0C\u8981\u6C42 Node >= 24`)):e.push(s("PASS",`Node \u7248\u672C\uFF1A${f}`)),!u.default.existsSync(i))return e.push(s("FATAL",`\u5BA2\u6237\u7AEF\u76EE\u5F55\u4E0D\u5B58\u5728: ${i}`)),e;e.push(s("PASS",`\u5BA2\u6237\u7AEF\u76EE\u5F55\u5B58\u5728: ${i}`));const p=A.default.join(i,".pid.lock");if(u.default.existsSync(p))try{const n=parseInt(u.default.readFileSync(p,"utf-8").trim(),10);if(!isNaN(n))try{process.kill(n,0),e.push(s("PASS",`\u8FDB\u7A0B\u8FD0\u884C\u4E2D (PID: ${n})`))}catch{e.push(s("WARN",`\u9501\u6587\u4EF6\u5B58\u5728\u4F46\u8FDB\u7A0B ${n} \u5DF2\u9000\u51FA\uFF08\u8FC7\u671F\u9501\u6587\u4EF6\uFF09`))}}catch{e.push(s("WARN",`PID \u9501\u6587\u4EF6\u8BFB\u53D6\u5F02\u5E38: ${p}`))}else e.push(s("PASS","\u65E0\u8FD0\u884C\u4E2D\u7684\u8FDB\u7A0B"));const r=A.default.join(i,"config.json");if(!u.default.existsSync(r))return e.push(s("FATAL","config.json \u4E0D\u5B58\u5728")),e;let l;try{l=JSON.parse(u.default.readFileSync(r,"utf-8"))}catch(n){return e.push(s("FATAL",`config.json \u89E3\u6790\u5931\u8D25: ${n instanceof Error?n.message:n}`)),e}e.push(s("PASS","config.json \u89E3\u6790\u6210\u529F"));const h=[{key:"clientSecret",label:"clientSecret"},{key:"defaultDingToken",label:"defaultDingToken"},{key:"whiteUserList",label:"whiteUserList",isArr:!0},{key:"owner",label:"owner"}];for(const{key:n,label:o,isArr:a}of h){const t=l[n];t==null||t===""?e.push(s("FATAL",`\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5: ${o}`)):a&&!Array.isArray(t)?e.push(s("FATAL",`${o} \u5E94\u4E3A\u6570\u7EC4`)):n!=="conversations"&&a&&t.length===0?e.push(s("WARN",`${o} \u4E3A\u7A7A\u6570\u7EC4`)):!a&&typeof t=="string"&&t.startsWith("<")?e.push(s("FATAL",`${o} \u4ECD\u4E3A\u5360\u4F4D\u7B26: ${t}`)):e.push(s("PASS",`${o} \u2713`))}l.owner?e.push(s("PASS",`owner: ${l.owner}`)):e.push(s("FATAL","owner \u672A\u914D\u7F6E\uFF0C\u7BA1\u7406\u547D\u4EE4\uFF08/clean, /open, /reset-apikeycfg, /reg, /auth\uFF09\u4E0D\u53EF\u7528"));const j=["clientSecret","defaultDingToken"];for(const n of j){const o=l[n];typeof o=="string"&&/^<.*>$/.test(o.trim())&&e.push(s("FATAL",`${n} \u4ECD\u4E3A\u5360\u4F4D\u7B26: ${o}`))}const g=new Set;if(!Array.isArray(l.conversations))e.push(s("FATAL","conversations \u5E94\u4E3A\u6570\u7EC4"));else if(l.conversations.length===0)e.push(s("PASS","conversations \u4E3A\u7A7A\u6570\u7EC4\uFF0C\u53EF\u901A\u8FC7 /reg \u547D\u4EE4\u52A8\u6001\u6CE8\u518C"));else{for(let n=0;n<l.conversations.length;n++){const o=l.conversations[n],a=`conversations[${n}]`;o.conversationId?typeof o.conversationId=="string"&&/^<.*>$/.test(o.conversationId.trim())?e.push(s("FATAL",`${a} conversationId \u4ECD\u4E3A\u5360\u4F4D\u7B26: ${o.conversationId}`)):g.has(o.conversationId)?e.push(s("WARN",`${a} conversationId \u91CD\u590D: ${o.conversationId}`)):g.add(o.conversationId):e.push(s("FATAL",`${a} \u7F3A\u5C11 conversationId`)),o.linkConversationId&&!l.conversations.some(t=>t.conversationId===o.linkConversationId)&&e.push(s("WARN",`${a} linkConversationId "${o.linkConversationId}" \u672A\u5728 conversations \u4E2D\u627E\u5230`)),o.dingToken&&typeof o.dingToken=="string"&&/^<.*>$/.test(o.dingToken.trim())&&e.push(s("WARN",`${a} dingToken \u4ECD\u4E3A\u5360\u4F4D\u7B26`))}e.push(s("PASS",`conversations \u5171 ${l.conversations.length} \u4E2A\u7FA4\u914D\u7F6E`))}if(l.apiKeyCfg){const n=l.apiKeyCfg;if(n.resetTime&&e.push(s("PASS",`apiKeyCfg.resetTime: ${n.resetTime}`)),!Array.isArray(n.claudeSettings))e.push(s("WARN","apiKeyCfg.claudeSettings \u4E0D\u662F\u6570\u7EC4"));else if(n.claudeSettings.length===0)e.push(s("WARN","apiKeyCfg.claudeSettings \u4E3A\u7A7A\uFF0C\u65E0\u5907\u7528 Key"));else{const o=new Set;for(let t=0;t<n.claudeSettings.length;t++){const c=n.claudeSettings[t],d=`apiKeyCfg.claudeSettings[${t}]`;c.apiKey?o.has(c.apiKey)?e.push(s("WARN",`${d} apiKey \u91CD\u590D: ${(0,F.settingLabel)(c)}`)):o.add(c.apiKey):e.push(s("FATAL",`${d} \u7F3A\u5C11 apiKey`)),c.baseUrl||e.push(s("WARN",`${d} \u7F3A\u5C11 baseUrl`)),c.model||e.push(s("WARN",`${d} \u7F3A\u5C11 model`)),typeof c.isValid!="boolean"&&e.push(s("WARN",`${d} isValid \u7C7B\u578B\u5F02\u5E38: ${typeof c.isValid}`))}const a=n.claudeSettings.filter(t=>t.isValid).length;e.push(s("PASS",`apiKeyCfg.claudeSettings \u5171 ${n.claudeSettings.length} \u9879\uFF0C\u6709\u6548 ${a}`))}}else e.push(s("WARN","apiKeyCfg \u672A\u914D\u7F6E\uFF0C\u65E0\u6CD5\u4F7F\u7528 API Key \u6C60\u5316\u8F6E\u6362"));const y=A.default.join(i,"cron.json");if(u.default.existsSync(y))try{const n=JSON.parse(u.default.readFileSync(y,"utf-8")),o=Array.isArray(n)?n:n.jobs;if(Array.isArray(o)){const a=o.filter(t=>t.enabled!==!1).length;e.push(s("PASS",`cron.json \u5171 ${o.length} \u4E2A\u5B9A\u65F6\u4EFB\u52A1 (${a} \u542F\u7528)`));for(let t=0;t<o.length;t++){const c=o[t];c.id||e.push(s("WARN",`cron.json[${t}] \u7F3A\u5C11 id`)),c.cronExpression||e.push(s("WARN",`cron.json[${t}] \u7F3A\u5C11 cronExpression`)),c.prompt||e.push(s("WARN",`cron.json[${t}] \u7F3A\u5C11 prompt`)),c.conversationId?g.has(c.conversationId)||e.push(s("WARN",`cron.json[${t}] conversationId "${c.conversationId}" \u672A\u5728 config.json conversations \u4E2D\u627E\u5230`)):e.push(s("WARN",`cron.json[${t}] \u7F3A\u5C11 conversationId`))}}else e.push(s("WARN","cron.json \u683C\u5F0F\u5F02\u5E38\uFF0C\u65E0\u6CD5\u89E3\u6790\u4E3A\u4EFB\u52A1\u6570\u7EC4"))}catch(n){e.push(s("WARN",`cron.json \u89E3\u6790\u5931\u8D25: ${n instanceof Error?n.message:n}`))}else e.push(s("PASS","cron.json \u4E0D\u5B58\u5728 (\u65E0\u5B9A\u65F6\u4EFB\u52A1)"));const $=A.default.join((0,N.getHomeDir)(),".cc-ding","settings-tpl.json");if(u.default.existsSync($))try{const n=JSON.parse(u.default.readFileSync($,"utf-8"));if(typeof n!="object"||n===null)e.push(s("WARN","settings-tpl.json \u6839\u5143\u7D20\u4E0D\u662F\u5BF9\u8C61"));else if(!n.env||typeof n.env!="object")e.push(s("WARN","settings-tpl.json \u7F3A\u5C11 env \u5B57\u6BB5"));else{const o=Object.keys(n.env);e.push(s("PASS",`settings-tpl.json \u6709\u6548\uFF0Cenv \u5305\u542B: ${o.join(", ")||"(\u7A7A)"}`))}}catch(n){e.push(s("WARN",`settings-tpl.json \u89E3\u6790\u5931\u8D25: ${n instanceof Error?n.message:n}`))}else e.push(s("WARN","settings-tpl.json \u4E0D\u5B58\u5728\uFF0C\u521B\u5EFA settings-ding.json \u65F6\u5C06\u4F7F\u7528\u7A7A\u6A21\u677F"));(0,T.commandExists)("claude")?e.push(s("PASS","claude \u547D\u4EE4\u53EF\u7528")):e.push(s("FATAL","claude \u547D\u4EE4\u4E0D\u53EF\u7528\uFF0C\u8BF7\u786E\u8BA4 Claude Code CLI \u5DF2\u5B89\u88C5"));try{const n=A.default.join(i,".doctor-check");u.default.writeFileSync(n,"ok","utf-8"),u.default.unlinkSync(n),e.push(s("PASS","\u5BA2\u6237\u7AEF\u76EE\u5F55\u53EF\u5199"))}catch(n){e.push(s("FATAL",`\u5BA2\u6237\u7AEF\u76EE\u5F55\u4E0D\u53EF\u5199: ${n instanceof Error?n.message:n}`))}return e}function s(i,e){return{level:i,message:e}}