cc-ding 1.0.6 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,57 +1,61 @@
1
- "use strict";var B=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveClaudeSettingsPath=J,exports.isRetryableApiError=V,exports.parseClaudeStreamLine=ie,exports.interruptClaudeProcess=Ce,exports.injectStartupContexts=Ie,exports.injectSessionContextIfChanged=ce,exports.refreshSessionContext=ve,exports.executeClaudeQuery=we;const a=B(require("fs")),O=B(require("path")),de=B(require("readline")),ue=require("child_process"),le=require("util"),pe=require("crypto"),fe=(0,le.promisify)(ue.exec),R=require("./messaging"),n=require("./session"),y=require("./api-key-manager"),Z=require("./secrets"),j=require("./platform"),F=20,L=1e4,ee=1e4,H=10,te=300*1e3,Y=300*1e3,ge=30*1e3,Q=new Map;function J(e,t,o){const s=(0,y.getForceEnabledSettingsPath)(t);if(s)return s;if(e.config.apiKeyCfg){const u=(0,y.readApiKeyFromSettings)(t);let $=null;if(u&&($=e.config.apiKeyCfg.claudeSettings.find(p=>(0,Z.resolveSecret)(p.apiKey)===u&&p.isValid)||null),$||($=(0,y.pickValidApiKey)(e)),$)return(0,y.ensureSettingsWithApiKey)(t,$)}if(e.config.apiKeyCfg)return;if(o)return o;const l=O.default.join(t,".claude","settings.json");if(a.default.existsSync(l))return console.log(`[${(0,n.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${l}`),l}function V(e){if(/\b429\b/.test(e)&&!(0,y.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(s=>t.includes(s))}function me(e){return new Promise(t=>setTimeout(t,e))}class z 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 ne extends Error{constructor(){super("Claude conversation not found"),this.name="ConversationNotFoundError"}}class oe extends Error{constructor(){super("Context window exceeded: prompt tokens exceed maximum context window"),this.name="ContextWindowExceededError"}}function ye(e,t){try{return a.default.readFileSync(e,"utf-8").split(`
1
+ "use strict";var Z=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.WatchdogTimeoutError=void 0,exports.resolveClaudeSettingsPath=te,exports.isRetryableApiError=ne,exports.parseClaudeStreamLine=fe,exports.interruptClaudeProcess=ge,exports.injectStartupContexts=xe,exports.injectSessionContextIfChanged=$e,exports.refreshSessionContext=De,exports.executeClaudeQuery=We;const a=Z(require("fs")),Y=Z(require("path")),Ie=Z(require("readline")),Ce=require("child_process"),ve=require("util"),we=require("crypto"),ae=(0,ve.promisify)(Ce.exec),T=require("./messaging"),Re=require("./streaming"),n=require("./session"),h=require("./api-key-manager"),ce=require("./secrets"),J=require("./platform"),Te=require("./watchdog"),L=20,Q=1e4,de=1e4,ee=10,ue=300*1e3,V=new Map;function te(e,t,o){const i=(0,h.getForceEnabledSettingsPath)(t);if(i)return i;if(e.config.apiKeyCfg){const l=(0,h.readApiKeyFromSettings)(t);let v=null;if(l&&(v=e.config.apiKeyCfg.claudeSettings.find(d=>(0,ce.resolveSecret)(d.apiKey)===l&&d.isValid)||null),v||(v=(0,h.pickValidApiKey)(e)),v)return(0,h.ensureSettingsWithApiKey)(t,v)}if(e.config.apiKeyCfg)return;if(o)return o;const g=Y.default.join(t,".claude","settings.json");if(a.default.existsSync(g))return console.log(`[${(0,n.timestamp)()}] \u81EA\u52A8\u68C0\u6D4B\u5230 settings.json: ${g}`),g}function ne(e){if(/\b429\b/.test(e)&&!(0,h.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 Ee(e){return new Promise(t=>setTimeout(t,e))}class oe 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 le extends Error{constructor(){super("Claude conversation not found"),this.name="ConversationNotFoundError"}}class H extends Error{constructor(){super("Watchdog timeout: process inactive for too long"),this.name="WatchdogTimeoutError"}}exports.WatchdogTimeoutError=H;class pe extends Error{constructor(){super("Context window exceeded: prompt tokens exceed maximum context window"),this.name="ContextWindowExceededError"}}function Me(e,t){try{return a.default.readFileSync(e,"utf-8").split(`
2
2
  `).filter(Boolean).slice(-t).join(`
3
- `)}catch{return""}}function Se(e){return/prompt tokens?\s*\(\s*\d+\s*\)\s*exceeds/i.test(e)||/exceeds?.*maximum context window/i.test(e)}function $e(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(s=>t.includes(s))}function he(e){return/no conversation found with session id/i.test(e)}function ie(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 s=o.message?.content;if(Array.isArray(s)){const l=[];for(const u of s)u.type==="text"&&u.text?l.push(u.text):u.type==="thinking"&&u.thinking&&t&&l.push(`\u{1F4AD} **\u601D\u8003\u8FC7\u7A0B**
3
+ `)}catch{return""}}function ke(e){return/prompt tokens?\s*\(\s*\d+\s*\)\s*exceeds/i.test(e)||/exceeds?.*maximum context window/i.test(e)}function Ae(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 be(e){return/no conversation found with session id/i.test(e)}function fe(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 g=[];for(const l of i)l.type==="text"&&l.text?g.push(l.text):l.type==="thinking"&&l.thinking&&t&&g.push(`\u{1F4AD} **\u601D\u8003\u8FC7\u7A0B**
4
4
  \`\`\`
5
- ${u.thinking}
6
- \`\`\``);if(l.length>0)return{type:"assistant",content:l.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 s=o.result||"";return{type:"result",content:typeof s=="string"?s:JSON.stringify(s)}}return{type:o.type||"unknown"}}catch{return{type:"text",content:e}}}function Ce(e,t){return e.currentProcess?(console.log(`[${(0,n.timestamp)()}] ${t}`),e.interrupted=!0,(0,j.isWindows)()?e.currentProcess.kill():e.currentProcess.kill("SIGINT"),!0):!1}function se(e,t,o,s,l,u,$){let p=e.getSessionDir(t),h=`${p}/session.log`;a.default.existsSync(p)||a.default.mkdirSync(p,{recursive:!0});const T=Date.now();return new Promise((A,f)=>{const w=(0,j.spawnCommand)(s,o,{cwd:l,stdio:["pipe","pipe","pipe"]}),g=e.activeSessions.get(t.conversationId);g&&(g.currentProcess=w,g.lastActivityTime=Date.now()),a.default.appendFileSync(h,`[${(0,n.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u542F\u52A8${$?" (\u91CD\u8BD5)":""}
8
- `,"utf-8"),w.stdin?.write(`${u}
9
- `),w.stdin?.end();let q=!$&&!!t.claudeSessionId,P=[],_="",k="",W=!1,N=!1,C=null;const E=new Set,b=()=>{g&&(g.lastActivityTime=Date.now())};C=setInterval(()=>{if(N){C&&clearInterval(C);return}const d=g?.lastActivityTime??T;if(Date.now()-d>=Y){console.warn(`[${(0,n.timestamp)()}] Watchdog: Claude \u8FDB\u7A0B ${Y/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u901A\u77E5\u7528\u6237`);try{a.default.appendFileSync(h,`[${(0,n.timestamp)()}] [SYSTEM]: Watchdog \u8D85\u65F6\uFF0C${Y/1e3}s \u65E0\u6D3B\u52A8\uFF0C\u5DF2\u901A\u77E5\u7528\u6237
10
- `,"utf-8")}catch{}C&&clearInterval(C),C=null;const I=g?.lastSenderStaffId||t.startStaffId;(0,R.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:I,content:`\u23F0 Claude \u8FDB\u7A0B\u8D85\u8FC7 ${Y/1e3}s \u65E0\u54CD\u5E94\uFF0C\u53EF\u53D1\u9001 /goon \u5F3A\u5236\u91CD\u542F\u6062\u590D\uFF0C\u6216 /end \u7ED3\u675F\u4F1A\u8BDD`}).catch(r=>console.error("\u53D1\u9001 Watchdog \u901A\u77E5\u5931\u8D25:",r))}},ge),de.default.createInterface({input:w.stdout}).on("line",d=>{if(k+=d+`
11
- `,b(),e.debugLog(`Claude stdout: ${d.substring(0,200)}${d.length>200?"...":""}`),e.config.debug)try{a.default.appendFileSync(h,`[${(0,n.timestamp)()}] [RAW]: ${d}
12
- `,"utf-8")}catch{}const c=ie(d,e.config.includeThinking??!1);if(c){if(c.type==="system"&&c.sessionId&&!q&&(e.updateSessionFile(t,{claudeSessionId:c.sessionId}),q=!0,p=e.getSessionDir(t),h=`${p}/session.log`),c.type==="assistant"){try{const r=JSON.parse(d)?.message?.content;if(Array.isArray(r)){for(const i of r)if(i.type==="tool_use"&&i.id&&!E.has(i.id)){E.add(i.id);const S=i.name||"unknown";let m="";i.input&&(i.input.command?m=i.input.command.substring(0,200):i.input.file_path?m=i.input.file_path:i.input.pattern?m=i.input.pattern:i.input.query?m=i.input.query:i.input.description?m=i.input.description:i.input.prompt?m=i.input.prompt.substring(0,200):m=JSON.stringify(i.input).substring(0,200)),e.appendSessionLog(p,"tool",`${S}${m?": "+m:""}`)}}}catch{}c.content&&P.push(c.content)}if(c.type==="result"){const I=e.config.resultOnly??!0,r=(c.content||"").trim(),i=P.join(`
13
- `).trim(),S=I&&r||i;if(S&&!g?.interrupted){try{e.appendSessionLog(p,"assistant",S)}catch{}const v=e.activeSessions.get(t.conversationId)?.lastSenderStaffId||t.startStaffId;W=!0,(0,R.sendClaudeResponseToDing)(e,(0,n.getReplyConversationId)(t),(0,n.getReplyWebhook)(t),v,S).catch(M=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",M))}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`);P=[]}}}),w.stderr?.on("data",d=>{const c=d.toString();if(_+=c,b(),(0,y.isQuotaExhaustedError)(c)){console.log(`[${(0,n.timestamp)()}] [Claude stderr] \u914D\u989D\u8017\u5C3D\u9519\u8BEF(429): ${c.trim()}`);try{a.default.appendFileSync(h,`[${(0,n.timestamp)()}] [WARN]: ${c}`,"utf-8")}catch{}}else if(V(c)){console.log(`[${(0,n.timestamp)()}] [Claude stderr] \u53EF\u91CD\u8BD5API\u9519\u8BEF(422 TPM\u9650\u6D41): ${c.trim()}`);try{a.default.appendFileSync(h,`[${(0,n.timestamp)()}] [WARN]: ${c}`,"utf-8")}catch{}}else{console.error(`[Claude stderr]: ${c}`);try{a.default.appendFileSync(h,`[${(0,n.timestamp)()}] [ERROR]: ${c}`,"utf-8")}catch{}}}),w.on("close",d=>{N=!0,C&&(clearInterval(C),C=null),console.log(`[${(0,n.timestamp)()}] Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${d}`);try{a.default.appendFileSync(h,`[${(0,n.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u7ED3\u675F\uFF0C\u9000\u51FA\u7801: ${d}
14
- `,"utf-8")}catch{}const c=e.activeSessions.get(t.conversationId);if(c&&(c.currentProcess=void 0),c?.interrupted){console.log(`[${(0,n.timestamp)()}] \u7528\u6237\u4E3B\u52A8\u4E2D\u65AD\uFF0C\u4E22\u5F03 responseBuffer (${P.length} \u6BB5)`),c.interrupted=!1,P=[],A(0);return}if(P.length>0){const r=P.join(`
15
- `).trim();if(r){try{e.appendSessionLog(p,"assistant",r)}catch{}const i=c?.lastSenderStaffId||t.startStaffId;W=!0,(0,R.sendClaudeResponseToDing)(e,(0,n.getReplyConversationId)(t),(0,n.getReplyWebhook)(t),i,r).catch(S=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",S))}}if(d===0&&!W&&!c?.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(h,`[${(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 r=c?.lastSenderStaffId||t.startStaffId;(0,R.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:r,content:"\u26A0\uFE0F Claude \u5904\u7406\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u4EFB\u4F55\u5185\u5BB9"}).catch(i=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",i))}if(d===0){A(0);return}const I=_+`
17
- `+k;if((0,y.isQuotaExhaustedError)(I)){const i=Date.now()-T<ee;console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u914D\u989D\u8017\u5C3D\u9519\u8BEF(429)\uFF0Cstdout\u5339\u914D=${(0,y.isQuotaExhaustedError)(k)}, stderr\u5339\u914D=${(0,y.isQuotaExhaustedError)(_)}`),f(new z(i,I));return}if((0,y.isAuthenticationError)(I)){console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u901A\u77E5\u7528\u6237`);const r=c?.lastSenderStaffId||t.startStaffId;(0,R.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:r,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(i=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",i)),A(d??1);return}if(V(I)){const i=Date.now()-T<ee;f(new z(i,I));return}if($e(I)){console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u9700\u8981\u6388\u6743\uFF0C\u901A\u77E5\u7528\u6237`);const r=c?.lastSenderStaffId||t.startStaffId;(0,R.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:r,content:"\u26A0\uFE0F Claude \u9700\u8981\u6388\u6743\uFF0C\u8BF7\u4EBA\u5DE5\u4ECB\u5165"}).catch(i=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",i)),A(d??1);return}if(t.claudeSessionId&&he(I)){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`),f(new ne);return}if(Se(I)){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(h,`[${(0,n.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u5C06\u81EA\u52A8 /compact
18
- `,"utf-8")}catch{}f(new oe);return}f(new Error(`Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${d}`))}),w.on("error",d=>{N=!0,C&&(clearInterval(C),C=null),console.error("Claude \u8FDB\u7A0B\u9519\u8BEF:",d),a.default.appendFileSync(h,`[${(0,n.timestamp)()}] [ERROR]: \u8FDB\u7A0B\u9519\u8BEF: ${d.message}
19
- `,"utf-8"),f(d)})})}const re="<!-- cc-ding:session-context-start (DO NOT EDIT) -->",G="<!-- cc-ding:session-context-end (DO NOT EDIT) -->";function X(e,t){const o=e.getConversationConfig(t),s=e.config;return[re,"# cc-ding Session Context","## Client",`- clientId: \`${e.clientId}\``,s.clientName?`- clientName: ${s.clientName}`:"",`- owner: ${s.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}`:"",s.resultOnly!==void 0?`- resultOnly: ${s.resultOnly}`:"",s.includeThinking!==void 0?`- includeThinking: ${s.includeThinking}`:"",s.preBash?`- preBash(\u5168\u5C40): \`${s.preBash}\``:"",o?.preBash?`- preBash(\u7FA4): \`${o.preBash}\``:"",o?.qaMode?"- qaMode: true (\u95EE\u7B54\u6A21\u5F0F\uFF0C\u4EC5\u56DE\u7B54\u95EE\u9898\uFF0C\u7981\u6B62\u6267\u884C\u547D\u4EE4\u3001\u5199\u5165\u6587\u4EF6\u6216\u8FD0\u884C\u4EE3\u7801)":"",o?.qaMode&&o.qaCfg?.docs?.length?`- qaDocs: ${o.qaCfg.docs.join(", ")}`:"","## 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",G].filter(Boolean).join(`
5
+ ${l.thinking}
6
+ \`\`\``);if(g.length>0)return{type:"assistant",content:g.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 ge(e,t){return e.currentProcess?(console.log(`[${(0,n.timestamp)()}] ${t}`),e.interrupted=!0,(0,J.isWindows)()?e.currentProcess.kill():e.currentProcess.kill("SIGINT"),!0):!1}function me(e,t,o,i,g,l,v,d){let E=e.getSessionDir(t),S=`${E}/session.log`;a.default.existsSync(E)||a.default.mkdirSync(E,{recursive:!0});const x=Date.now();return new Promise((m,w)=>{const y=(0,J.spawnCommand)(i,o,{cwd:g,stdio:["pipe","pipe","pipe"]}),M=e.activeSessions.get(t.conversationId);M&&(M.currentProcess=y,M.lastActivityTime=Date.now()),a.default.appendFileSync(S,`[${(0,n.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u542F\u52A8${v?" (\u91CD\u8BD5)":""}
8
+ `,"utf-8"),y.stdin?.write(`${l}
9
+ `),y.stdin?.end();let X=!v&&!!t.claudeSessionId,b=[],P="",O="",K=!1,U=!1;const B=new Set,z=()=>{M&&(M.lastActivityTime=Date.now())},_=new Te.AgentWatchdog(e,t,M,{killChild:()=>{M?.currentProcess&&ge(M,"Watchdog: \u81EA\u52A8\u7EC8\u6B62\u8D85\u65F6\u8FDB\u7A0B")},onTimeout:(c,r,u)=>{console.warn(`[${(0,n.timestamp)()}] Watchdog: Claude \u8FDB\u7A0B ${u}s \u65E0\u6D3B\u52A8\uFF0C\u6267\u884C\u81EA\u52A8\u6062\u590D`);try{a.default.appendFileSync(S,`[${(0,n.timestamp)()}] [SYSTEM]: Watchdog \u8D85\u65F6\uFF0C${u}s \u65E0\u6D3B\u52A8\uFF0C\u81EA\u52A8 kill \u8FDB\u7A0B\u5E76\u6062\u590D
10
+ `,"utf-8")}catch{}U=!0,M?.currentProcess||w(new H)},onRecoveryFailed:c=>{console.warn(`[${(0,n.timestamp)()}] Watchdog: \u5DF2\u8FBE\u6700\u5927\u81EA\u52A8\u6062\u590D\u6B21\u6570 ${c}`);try{a.default.appendFileSync(S,`[${(0,n.timestamp)()}] [SYSTEM]: Watchdog \u8D85\u65F6\uFF0C\u5DF2\u8FBE\u6700\u5927\u81EA\u52A8\u6062\u590D\u6B21\u6570 ${c}
11
+ `,"utf-8")}catch{}}},x);_.start(),Ie.default.createInterface({input:y.stdout}).on("line",c=>{if(O+=c+`
12
+ `,z(),e.debugLog(`Claude stdout: ${c.substring(0,200)}${c.length>200?"...":""}`),e.config.debug)try{a.default.appendFileSync(S,`[${(0,n.timestamp)()}] [RAW]: ${c}
13
+ `,"utf-8")}catch{}const r=fe(c,e.config.includeThinking??!1);if(r){if(r.type==="system"&&r.sessionId&&!X&&(e.updateSessionFile(t,{claudeSessionId:r.sessionId}),X=!0,E=e.getSessionDir(t),S=`${E}/session.log`),r.type==="assistant"){try{const p=JSON.parse(c)?.message?.content;if(Array.isArray(p)){for(const s of p)if(s.type==="tool_use"&&s.id&&!B.has(s.id)){B.add(s.id);const R=s.name||"unknown";let I="";s.input&&(s.input.command?I=s.input.command.substring(0,200):s.input.file_path?I=s.input.file_path:s.input.pattern?I=s.input.pattern:s.input.query?I=s.input.query:s.input.description?I=s.input.description:s.input.prompt?I=s.input.prompt.substring(0,200):I=JSON.stringify(s.input).substring(0,200)),e.appendSessionLog(E,"tool",`${R}${I?": "+I:""}`)}}}catch{}if(r.content&&(b.push(r.content),d&&!d.failed)){const u=b.join(`
14
+ `).trim();u&&d.update(u).catch(()=>{})}}if(r.type==="result"){const u=e.config.resultOnly??!0,p=(r.content||"").trim(),s=b.join(`
15
+ `).trim(),R=u&&p||s;if(R&&!M?.interrupted){try{e.appendSessionLog(E,"assistant",R)}catch{}if(d&&!d.permissionDenied)d.finalize(R).then(I=>{if(!I||d.failed||d.permissionDenied){const f=e.activeSessions.get(t.conversationId)?.lastSenderStaffId||t.startStaffId;K=!0,(0,T.sendClaudeResponseToDing)(e,(0,n.getReplyConversationId)(t),(0,n.getReplyWebhook)(t),f,R).catch(k=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",k))}}).catch(()=>{const q=e.activeSessions.get(t.conversationId)?.lastSenderStaffId||t.startStaffId;K=!0,(0,T.sendClaudeResponseToDing)(e,(0,n.getReplyConversationId)(t),(0,n.getReplyWebhook)(t),q,R).catch(f=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",f))});else{const q=e.activeSessions.get(t.conversationId)?.lastSenderStaffId||t.startStaffId;K=!0,(0,T.sendClaudeResponseToDing)(e,(0,n.getReplyConversationId)(t),(0,n.getReplyWebhook)(t),q,R).catch(f=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",f))}}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`);b=[]}}}),y.stderr?.on("data",c=>{const r=c.toString();if(P+=r,z(),(0,h.isQuotaExhaustedError)(r)){console.log(`[${(0,n.timestamp)()}] [Claude stderr] \u914D\u989D\u8017\u5C3D\u9519\u8BEF(429): ${r.trim()}`);try{a.default.appendFileSync(S,`[${(0,n.timestamp)()}] [WARN]: ${r}`,"utf-8")}catch{}}else if(ne(r)){console.log(`[${(0,n.timestamp)()}] [Claude stderr] \u53EF\u91CD\u8BD5API\u9519\u8BEF(422 TPM\u9650\u6D41): ${r.trim()}`);try{a.default.appendFileSync(S,`[${(0,n.timestamp)()}] [WARN]: ${r}`,"utf-8")}catch{}}else{console.error(`[Claude stderr]: ${r}`);try{a.default.appendFileSync(S,`[${(0,n.timestamp)()}] [ERROR]: ${r}`,"utf-8")}catch{}}}),y.on("close",c=>{_.markSettled(),_.markSettled(),_.stop(),console.log(`[${(0,n.timestamp)()}] Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${c}`);try{a.default.appendFileSync(S,`[${(0,n.timestamp)()}] [SYSTEM]: Claude \u67E5\u8BE2\u7ED3\u675F\uFF0C\u9000\u51FA\u7801: ${c}
16
+ `,"utf-8")}catch{}const r=e.activeSessions.get(t.conversationId);if(r&&(r.currentProcess=void 0),U){console.log(`[${(0,n.timestamp)()}] Watchdog \u89E6\u53D1\u7684\u8FDB\u7A0B\u9000\u51FA\uFF0Creject WatchdogTimeoutError`),w(new H);return}if(r?.interrupted){console.log(`[${(0,n.timestamp)()}] \u7528\u6237\u4E3B\u52A8\u4E2D\u65AD\uFF0C\u4E22\u5F03 responseBuffer (${b.length} \u6BB5)`),r.interrupted=!1,b=[],m(0);return}if(b.length>0){const p=b.join(`
17
+ `).trim();if(p){try{e.appendSessionLog(E,"assistant",p)}catch{}if(d&&!d.permissionDenied)d.finalize(p).then(s=>{if(!s||d.failed||d.permissionDenied){const R=r?.lastSenderStaffId||t.startStaffId;K=!0,(0,T.sendClaudeResponseToDing)(e,(0,n.getReplyConversationId)(t),(0,n.getReplyWebhook)(t),R,p).catch(I=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",I))}}).catch(()=>{const s=r?.lastSenderStaffId||t.startStaffId;K=!0,(0,T.sendClaudeResponseToDing)(e,(0,n.getReplyConversationId)(t),(0,n.getReplyWebhook)(t),s,p).catch(R=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",R))});else{const s=r?.lastSenderStaffId||t.startStaffId;K=!0,(0,T.sendClaudeResponseToDing)(e,(0,n.getReplyConversationId)(t),(0,n.getReplyWebhook)(t),s,p).catch(R=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",R))}}}if(c===0&&!K&&!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(S,`[${(0,n.timestamp)()}] [WARN]: Claude \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9
18
+ `,"utf-8")}catch{}const p=r?.lastSenderStaffId||t.startStaffId;(0,T.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:p,content:"\u26A0\uFE0F Claude \u5904\u7406\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u4EFB\u4F55\u5185\u5BB9"}).catch(s=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",s))}if(c===0){m(0);return}const u=P+`
19
+ `+O;if((0,h.isQuotaExhaustedError)(u)){const s=Date.now()-x<de;console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u914D\u989D\u8017\u5C3D\u9519\u8BEF(429)\uFF0Cstdout\u5339\u914D=${(0,h.isQuotaExhaustedError)(O)}, stderr\u5339\u914D=${(0,h.isQuotaExhaustedError)(P)}`),w(new oe(s,u));return}if((0,h.isAuthenticationError)(u)){console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u8BA4\u8BC1\u9519\u8BEF(401)\uFF0C\u901A\u77E5\u7528\u6237`);const p=r?.lastSenderStaffId||t.startStaffId;(0,T.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:p,content:"\u26A0\uFE0F \u8BA4\u8BC1\u5931\u8D25(401)\uFF0CAPI Key \u65E0\u6548\u6216\u670D\u52A1\u672A\u6388\u6743\uFF0C\u8BF7\u68C0\u67E5\u914D\u7F6E"}).catch(s=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",s)),m(c??1);return}if(ne(u)){const s=Date.now()-x<de;w(new oe(s,u));return}if(Ae(u)){console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u9700\u8981\u6388\u6743\uFF0C\u901A\u77E5\u7528\u6237`);const p=r?.lastSenderStaffId||t.startStaffId;(0,T.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:p,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)),m(c??1);return}if(t.claudeSessionId&&be(u)){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`),w(new le);return}if(ke(u)){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(S,`[${(0,n.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u5C06\u81EA\u52A8 /compact
20
+ `,"utf-8")}catch{}w(new pe);return}w(new Error(`Claude \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${c}`))}),y.on("error",c=>{_.markSettled(),_.markSettled(),_.stop(),console.error("Claude \u8FDB\u7A0B\u9519\u8BEF:",c),a.default.appendFileSync(S,`[${(0,n.timestamp)()}] [ERROR]: \u8FDB\u7A0B\u9519\u8BEF: ${c.message}
21
+ `,"utf-8"),w(c)})})}const Se="<!-- cc-ding:session-context-start (DO NOT EDIT) -->",ie="<!-- cc-ding:session-context-end (DO NOT EDIT) -->";function se(e,t){const o=e.getConversationConfig(t),i=e.config;return[Se,"# 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}\``:"",o?.qaMode?"- qaMode: true (\u95EE\u7B54\u6A21\u5F0F\uFF0C\u4EC5\u56DE\u7B54\u95EE\u9898\uFF0C\u7981\u6B62\u6267\u884C\u547D\u4EE4\u3001\u5199\u5165\u6587\u4EF6\u6216\u8FD0\u884C\u4EE3\u7801)":"",o?.qaMode&&o.qaCfg?.docs?.length?`- qaDocs: ${o.qaCfg.docs.join(", ")}`:"","## 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",ie].filter(Boolean).join(`
20
22
  `)+`
21
- `}function ae(e,t,o){const s=e.getConversationDir(t),l=O.default.join(s,".claude");a.default.existsSync(l)||a.default.mkdirSync(l,{recursive:!0});const u=O.default.join(l,"CLAUDE.md");if(!a.default.existsSync(u)){a.default.writeFileSync(u,o,"utf-8"),console.log(`[${(0,n.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u6CE8\u5165 CLAUDE.md: ${u}`);return}const $=a.default.readFileSync(u,"utf-8"),p=$.indexOf(re),h=$.indexOf(G);if(p!==-1&&h!==-1&&h>p){const T=$.substring(0,p),A=$.substring(h+G.length),f=T+o+A;a.default.writeFileSync(u,f,"utf-8"),console.log(`[${(0,n.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u66F4\u65B0: ${u}`)}else a.default.writeFileSync(u,o+`
22
- `+$,"utf-8"),console.log(`[${(0,n.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u8FFD\u52A0\u5230\u73B0\u6709 CLAUDE.md: ${u}`)}function Ie(e){const t=Array.isArray(e.config.conversations)?e.config.conversations:[];for(const o of t){const s=X(e,o.conversationId);Q.set(o.conversationId,s),ae(e,o.conversationId,s)}}function ce(e,t){const o=t.conversationId,s=X(e,o);Q.get(o)!==s&&(Q.set(o,s),ae(e,o,s))}function ve(e,t){Q.delete(t);const o=X(e,t),s=e.getConversationDir(t),l=O.default.join(s,".claude");a.default.existsSync(l)||a.default.mkdirSync(l,{recursive:!0});const u=O.default.join(l,"CLAUDE.md");a.default.writeFileSync(u,o,"utf-8"),console.log(`[${(0,n.timestamp)()}] QA \u6A21\u5F0F\u5207\u6362\uFF0CCLAUDE.md \u5DF2\u5237\u65B0: ${u}`)}async function we(e,t,o,s){const{skill:l,agent:u,senderNick:$,senderStaffId:p,newSessionId:h,conversationConfig:T}=s||{};let A=e.getSessionDir(t),f=`${A}/session.log`;const w=e.getConversationDir(t.conversationId);ce(e,t),a.default.mkdirSync(A,{recursive:!0});let g=null;const q=(0,y.readApiKeyFromSettings)(w);if(q&&e.config.apiKeyCfg&&(g=e.config.apiKeyCfg.claudeSettings.find(r=>(0,Z.resolveSecret)(r.apiKey)===q&&r.isValid)||null,g&&console.log(`[${(0,n.timestamp)()}] \u4ECE settings-ding.json \u6062\u590D Claude Setting: ${(0,y.settingLabel)(g)}`)),!(0,y.getForceEnabledSettingsPath)(w)&&e.config.apiKeyCfg&&(g=(0,y.pickValidApiKey)(e),!g)){const r=p||t.startStaffId;await(0,R.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:r,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D\uFF08\u65E0\u53EF\u7528 API Key\uFF09\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}const _=$&&p?`${o} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${$}(${p})`:o;e.appendSessionLog(A,"user",_);const k="claude";if(!(0,j.commandExists)(k)){const r=(0,j.formatClaudeCommandMissingMessage)(k);console.error(`[${(0,n.timestamp)()}] ${r.replace(/\n/g," ")}`),a.default.appendFileSync(f,`[${(0,n.timestamp)()}] [ERROR]: ${r}
23
- `,"utf-8"),await(0,R.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:p||t.startStaffId,content:`\u274C ${r}`});return}let W=l?`/${l} ${_}`:_;if(T?.qaMode){if(s.permissionMode="plan",T.qaCfg?.autoPull&&T.qaCfg.gitRepos?.length)try{for(const S of T.qaCfg.gitRepos){const m=O.default.join(w,S);a.default.existsSync(O.default.join(m,".git"))?(await fe("git pull",{cwd:m,timeout:6e4}),console.log(`[${(0,n.timestamp)()}] QA \u6A21\u5F0F git pull: ${S}`)):console.log(`[${(0,n.timestamp)()}] QA \u6A21\u5F0F\u8DF3\u8FC7\u975E git \u76EE\u5F55: ${S}`)}}catch(S){console.error(`[${(0,n.timestamp)()}] QA \u6A21\u5F0F git pull \u5931\u8D25:`,S)}const r=`\u3010\u91CD\u8981\u89C4\u5219\u3011\u5F53\u524D\u4E3A\u95EE\u7B54\u6A21\u5F0F\uFF0C\u8BF7\u4E25\u683C\u9075\u5B88\uFF1A
23
+ `}function ye(e,t,o){const i=e.getConversationDir(t),g=Y.default.join(i,".claude");a.default.existsSync(g)||a.default.mkdirSync(g,{recursive:!0});const l=Y.default.join(g,"CLAUDE.md");if(!a.default.existsSync(l)){a.default.writeFileSync(l,o,"utf-8"),console.log(`[${(0,n.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u6CE8\u5165 CLAUDE.md: ${l}`);return}const v=a.default.readFileSync(l,"utf-8"),d=v.indexOf(Se),E=v.indexOf(ie);if(d!==-1&&E!==-1&&E>d){const S=v.substring(0,d),x=v.substring(E+ie.length),m=S+o+x;a.default.writeFileSync(l,m,"utf-8"),console.log(`[${(0,n.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u66F4\u65B0: ${l}`)}else a.default.writeFileSync(l,o+`
24
+ `+v,"utf-8"),console.log(`[${(0,n.timestamp)()}] cc-ding \u4E0A\u4E0B\u6587\u5DF2\u8FFD\u52A0\u5230\u73B0\u6709 CLAUDE.md: ${l}`)}function xe(e){const t=Array.isArray(e.config.conversations)?e.config.conversations:[];for(const o of t){const i=se(e,o.conversationId);V.set(o.conversationId,i),ye(e,o.conversationId,i)}}function $e(e,t){const o=t.conversationId,i=se(e,o);V.get(o)!==i&&(V.set(o,i),ye(e,o,i))}function De(e,t){V.delete(t);const o=se(e,t),i=e.getConversationDir(t),g=Y.default.join(i,".claude");a.default.existsSync(g)||a.default.mkdirSync(g,{recursive:!0});const l=Y.default.join(g,"CLAUDE.md");a.default.writeFileSync(l,o,"utf-8"),console.log(`[${(0,n.timestamp)()}] QA \u6A21\u5F0F\u5207\u6362\uFF0CCLAUDE.md \u5DF2\u5237\u65B0: ${l}`)}async function We(e,t,o,i){const{skill:g,agent:l,senderNick:v,senderStaffId:d,newSessionId:E,conversationConfig:S}=i||{};let x=e.getSessionDir(t),m=`${x}/session.log`;const w=e.getConversationDir(t.conversationId);$e(e,t),a.default.mkdirSync(x,{recursive:!0});let y=null;const M=(0,h.readApiKeyFromSettings)(w);if(M&&e.config.apiKeyCfg&&(y=e.config.apiKeyCfg.claudeSettings.find(f=>(0,ce.resolveSecret)(f.apiKey)===M&&f.isValid)||null,y&&console.log(`[${(0,n.timestamp)()}] \u4ECE settings-ding.json \u6062\u590D Claude Setting: ${(0,h.settingLabel)(y)}`)),!(0,h.getForceEnabledSettingsPath)(w)&&e.config.apiKeyCfg&&(y=(0,h.pickValidApiKey)(e),!y)){const f=d||t.startStaffId;await(0,T.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:f,content:"\u26A0\uFE0F \u5F53\u524D\u65E0\u53EF\u7528\u914D\u989D\uFF08\u65E0\u53EF\u7528 API Key\uFF09\uFF0C\u8BF7\u660E\u5929\u518D\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458"});return}const b=v&&d?`${o} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${v}(${d})`:o;e.appendSessionLog(x,"user",b);const P="claude";if(!(0,J.commandExists)(P)){const f=(0,J.formatClaudeCommandMissingMessage)(P);console.error(`[${(0,n.timestamp)()}] ${f.replace(/\n/g," ")}`),a.default.appendFileSync(m,`[${(0,n.timestamp)()}] [ERROR]: ${f}
25
+ `,"utf-8"),await(0,T.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:d||t.startStaffId,content:`\u274C ${f}`});return}let O=g?`/${g} ${b}`:b;if(S?.qaMode){if(i.permissionMode="plan",S.qaCfg?.autoPull&&S.qaCfg.gitRepos?.length)try{for(const D of S.qaCfg.gitRepos){const C=D.replace(/\/$/,"").replace(/\.git$/,"").split("/").pop()||D,$=Y.default.join(w,C);a.default.existsSync(Y.default.join($,".git"))?(await ae("git pull",{cwd:$,timeout:6e4}),console.log(`[${(0,n.timestamp)()}] QA \u6A21\u5F0F git pull: ${C}`)):(await ae(`git clone ${D}`,{cwd:w,timeout:12e4}),console.log(`[${(0,n.timestamp)()}] QA \u6A21\u5F0F git clone: ${D} -> ${C}`))}}catch(D){console.error(`[${(0,n.timestamp)()}] QA \u6A21\u5F0F git \u64CD\u4F5C\u5931\u8D25:`,D)}const f=`\u3010\u91CD\u8981\u89C4\u5219\u3011\u5F53\u524D\u4E3A\u95EE\u7B54\u6A21\u5F0F\uFF0C\u8BF7\u4E25\u683C\u9075\u5B88\uFF1A
24
26
  1. \u4EC5\u56DE\u7B54\u95EE\u9898\uFF0C\u4E0D\u8981\u6267\u884C\u4EFB\u4F55\u547D\u4EE4
25
27
  2. \u4E0D\u8981\u4FEE\u6539\u6216\u5199\u5165\u4EFB\u4F55\u6587\u4EF6
26
28
  3. \u4E0D\u8981\u5C1D\u8BD5\u8FD0\u884C\u4EE3\u7801\u3001\u811A\u672C\u6216\u5DE5\u5177
27
- 4. \u4E0D\u8981\u8FDB\u884C git push\u3001commit \u7B49\u5199\u64CD\u4F5C`,i=T.qaCfg?.docs?.length?`
29
+ 4. \u4E0D\u8981\u8FDB\u884C git push\u3001commit \u7B49\u5199\u64CD\u4F5C`,k=S.qaCfg?.docs?.length?`
28
30
 
29
31
  \u3010\u53C2\u8003\u8D44\u6599\u94FE\u63A5\u3011
30
- ${T.qaCfg.docs.map((S,m)=>`${m+1}. ${S}`).join(`
32
+ ${S.qaCfg.docs.map((D,N)=>`${N+1}. ${D}`).join(`
31
33
  `)}
32
- \u4F60\u53EF\u4EE5\u4F7F\u7528 WebFetch \u5DE5\u5177\u8BBF\u95EE\u4E0A\u8FF0\u94FE\u63A5\u83B7\u53D6\u8BE6\u7EC6\u5185\u5BB9`:"";W=`${r}${i}
34
+ \u4F60\u53EF\u4EE5\u4F7F\u7528 WebFetch \u5DE5\u5177\u8BBF\u95EE\u4E0A\u8FF0\u94FE\u63A5\u83B7\u53D6\u8BE6\u7EC6\u5185\u5BB9`:"";O=`${f}${k}
33
35
 
34
36
  ---
35
37
 
36
38
  \u7528\u6237\u95EE\u9898\uFF1A
37
- ${W}`}const C=["--permission-mode",s?.permissionMode??"bypassPermissions","--print","--output-format","stream-json","--verbose"];u&&C.push("--agent",u);let E=0,b=0,x=0;const d=[],c=e.activeSessions.get(t.conversationId),I=r=>{const i=e.activeSessions.get(t.conversationId);return!i||i!==c?(console.log(`[${(0,n.timestamp)()}] \u4F1A\u8BDD\u5DF2\u88AB\u7EC8\u6B62\uFF0C${r}`),!1):i.goonPending?(console.log(`[${(0,n.timestamp)()}] \u6536\u5230 /goon \u8BF7\u6C42\uFF0C${r}`),!1):!0};for(;;){if(!I("\u505C\u6B62\u91CD\u8BD5"))return;const r=E>0;if(b>=H||b>=3&&x>0&&Date.now()-x>te){const v=b>=H?`\u603B\u91CD\u8BD5\u6B21\u6570\u5DF2\u8FBE ${H} \u6B21`:`\u91CD\u8BD5\u6301\u7EED\u65F6\u95F4\u8D85\u8FC7 ${te/1e3}s\uFF08\u5DF2\u91CD\u8BD5 ${b} \u6B21\uFF09`;console.error(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF: ${v}`),a.default.appendFileSync(f,`[${(0,n.timestamp)()}] [SYSTEM]: \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF\uFF0C${v}\uFF0C\u7EC8\u6B62\u91CD\u8BD5
38
- `,"utf-8");const M=ye(f,1),D=d.slice(-1)[0]||"",U=p||t.startStaffId;await(0,R.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:U,content:`\u{1F504} \u68C0\u6D4B\u5230 Claude \u9677\u5165\u65E0\u9650\u91CD\u8BD5\uFF0C\u5DF2\u7EC8\u6B62\uFF08${v}\uFF09
39
+ ${O}`}const U=["--permission-mode",i?.permissionMode??"bypassPermissions","--print","--output-format","stream-json","--verbose"];l&&U.push("--agent",l);const B=i?.model,z=e.getConversationConfig(t.conversationId)?.model,_=e.config.model,G=B||z||_;G&&U.push("--model",G);let c=0,r=0,u=0;const p=[],s=e.activeSessions.get(t.conversationId);s&&(s.autoRecoveryAttempts=0);const R=f=>{const k=e.activeSessions.get(t.conversationId);return!k||k!==s?(console.log(`[${(0,n.timestamp)()}] \u4F1A\u8BDD\u5DF2\u88AB\u7EC8\u6B62\uFF0C${f}`),!1):k.goonPending?(console.log(`[${(0,n.timestamp)()}] \u6536\u5230 /goon \u8BF7\u6C42\uFF0C${f}`),!1):!0},I=e.getConversationConfig(t.conversationId);let q=null;for(I?.streaming&&e.config.cardTemplateId&&s&&(q=await Re.StreamingCard.create({self:e,cardTemplateId:e.config.cardTemplateId,cardTemplateKey:e.config.cardTemplateKey,conversationId:t.conversationId,conversationType:I.conversationType,senderStaffId:s.lastSenderStaffId||t.startStaffId}),q||console.log(`[${(0,n.timestamp)()}] StreamingCard \u521B\u5EFA\u5931\u8D25\uFF0C\u4F7F\u7528\u666E\u901A\u6D88\u606F\u6A21\u5F0F`));;){if(!R("\u505C\u6B62\u91CD\u8BD5"))return;const f=c>0;if(r>=ee||r>=3&&u>0&&Date.now()-u>ue){const C=r>=ee?`\u603B\u91CD\u8BD5\u6B21\u6570\u5DF2\u8FBE ${ee} \u6B21`:`\u91CD\u8BD5\u6301\u7EED\u65F6\u95F4\u8D85\u8FC7 ${ue/1e3}s\uFF08\u5DF2\u91CD\u8BD5 ${r} \u6B21\uFF09`;console.error(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF: ${C}`),a.default.appendFileSync(m,`[${(0,n.timestamp)()}] [SYSTEM]: \u68C0\u6D4B\u5230\u65E0\u9650\u91CD\u8BD5\u5FAA\u73AF\uFF0C${C}\uFF0C\u7EC8\u6B62\u91CD\u8BD5
40
+ `,"utf-8");const $=Me(m,1),W=p.slice(-1)[0]||"",A=d||t.startStaffId;await(0,T.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:A,content:`\u{1F504} \u68C0\u6D4B\u5230 Claude \u9677\u5165\u65E0\u9650\u91CD\u8BD5\uFF0C\u5DF2\u7EC8\u6B62\uFF08${C}\uFF09
39
41
 
40
42
  \u{1F4CB} \u6700\u8FD1\u91CD\u8BD5\u8BB0\u5F55\uFF1A
41
- ${D}
43
+ ${W}
42
44
 
43
45
  \u{1F4DD} \u6700\u8FD1\u65E5\u5FD7\uFF1A
44
46
  \`\`\`
45
- ${M}
47
+ ${$}
46
48
  \`\`\`
47
49
 
48
- \u{1F4A1} \u53EF\u5C1D\u8BD5\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD\uFF0C\u6216 /end \u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD`});return}const i=[...C];if(t.claudeSessionId)i.push("--resume",t.claudeSessionId),r||console.log(`[${(0,n.timestamp)()}] \u6062\u590D Claude \u4F1A\u8BDD: ${t.claudeSessionId}`);else if(!r){const v=h||(0,pe.randomUUID)();i.push("--session-id",v),i.push("--name",`cc-ding-${v.substring(0,8)}`),console.log(`[${(0,n.timestamp)()}] \u521B\u5EFA Claude \u4F1A\u8BDD(\u663E\u5F0F session-id): ${v}`)}const S=J(e,w,s?.settings);S&&i.push("--settings",S);let m;r?(m="\u7EE7\u7EED",console.log(`[${(0,n.timestamp)()}] \u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${E}/${F}\u6B21)`),a.default.appendFileSync(f,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${E}/${F})
49
- `,"utf-8")):m=W,console.log(`[${(0,n.timestamp)()}] \u6267\u884C Claude \u67E5\u8BE2[\u539F\u751Fclaude \u6A21\u5F0F]: ${k} ${i.join(" ")}`),e.debugLog(`\u53D1\u9001\u6D88\u606F: ${m.substring(0,100)}...`);try{await se(e,t,i,k,w,m,r);return}catch(v){if(A=e.getSessionDir(t),f=`${A}/session.log`,v instanceof z){if(b++,x=x||Date.now(),(0,y.isQuotaExhaustedError)(v.output)&&e.config.apiKeyCfg){if(d.push(`[${(0,n.timestamp)()}] 429 \u914D\u989D\u8017\u5C3D\uFF0C\u5C1D\u8BD5\u8F6E\u6362 Key`),g){const D=(0,y.rotateApiKey)(e,g.apiKey);if(D){g=D,E=0,console.log(`[${(0,n.timestamp)()}] API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,y.settingLabel)(D)}`),a.default.appendFileSync(f,`[${(0,n.timestamp)()}] [SYSTEM]: API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key
50
- `,"utf-8");continue}}const M=p||t.startStaffId;await(0,R.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:M,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(v.isFastFail){if(E++,E>=F){if(g&&e.config.apiKeyCfg){const M=(0,y.rotateApiKey)(e,g.apiKey);if(M){g=M,E=0,console.log(`[${(0,n.timestamp)()}] TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25 ${F} \u6B21\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,y.settingLabel)(M)}`),a.default.appendFileSync(f,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25\uFF0C\u5207\u6362\u5230\u65B0 Key
51
- `,"utf-8");continue}}throw console.log(`[${(0,n.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${F}\u6B21\uFF0C\u653E\u5F03`),a.default.appendFileSync(f,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${F}\u6B21\uFF0C\u653E\u5F03
52
- `,"utf-8"),new Error(`TPM \u9650\u6D41\uFF0C\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED ${F} \u6B21`)}console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${L/1e3}s \u540E\u91CD\u8BD5 (${E}/${F})`)}else E=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${L/1e3}s \u540E\u91CD\u8BD5`);if(a.default.appendFileSync(f,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C${L/1e3}s \u540E\u91CD\u8BD5
53
- `,"utf-8"),d.push(`[${(0,n.timestamp)()}] TPM \u9650\u6D41\uFF0C${L/1e3}s \u540E\u91CD\u8BD5`),await me(L),!I("\u505C\u6B62\u5F53\u524D\u91CD\u8BD5"))return;continue}if(v instanceof ne){b++,x=x||Date.now(),d.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(f,`[${(0,n.timestamp)()}] [SYSTEM]: Claude \u4F1A\u8BDD\u5DF2\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD\u5E76\u91CD\u65B0\u53D1\u8D77
54
- `,"utf-8"),t.claudeSessionId&&(t.claudeSessionId=void 0,e.updateSessionFile(t,{})),E=0;continue}if(v instanceof oe){b++,x=x||Date.now(),d.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(f,`[${(0,n.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587
55
- `,"utf-8");const M=p||t.startStaffId;await(0,R.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:M,content:"\u{1F4E6} \u4E0A\u4E0B\u6587\u8D85\u957F\uFF0C\u6B63\u5728\u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u540E\u7EE7\u7EED..."});const D=[...C];t.claudeSessionId&&D.push("--resume",t.claudeSessionId);const U=J(e,w,s?.settings);U&&D.push("--settings",U);try{await se(e,t,D,k,w,"/compact",!1),console.log(`[${(0,n.timestamp)()}] /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C`),a.default.appendFileSync(f,`[${(0,n.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C
56
- `,"utf-8")}catch(K){throw console.error(`[${(0,n.timestamp)()}] /compact \u6267\u884C\u5931\u8D25:`,K),a.default.appendFileSync(f,`[${(0,n.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u5931\u8D25: ${K instanceof Error?K.message:String(K)}
57
- `,"utf-8"),await(0,R.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:M,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: ${K instanceof Error?K.message:String(K)}`)}E=0;continue}throw v}}}
50
+ \u{1F4A1} \u53EF\u5C1D\u8BD5\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4F1A\u8BDD\uFF0C\u6216 /end \u7ED3\u675F\u5F53\u524D\u4F1A\u8BDD`});return}const k=[...U];if(t.claudeSessionId)k.push("--resume",t.claudeSessionId),f||console.log(`[${(0,n.timestamp)()}] \u6062\u590D Claude \u4F1A\u8BDD: ${t.claudeSessionId}`);else if(!f){const C=E||(0,we.randomUUID)();k.push("--session-id",C),console.log(`[${(0,n.timestamp)()}] \u521B\u5EFA Claude \u4F1A\u8BDD(\u663E\u5F0F session-id): ${C}`)}const D=te(e,w,i?.settings);D&&k.push("--settings",D);let N;f?(N="\u7EE7\u7EED",console.log(`[${(0,n.timestamp)()}] \u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${c}/${L}\u6B21)`),a.default.appendFileSync(m,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u91CD\u8BD5 (\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${c}/${L})
51
+ `,"utf-8")):N=O,console.log(`[${(0,n.timestamp)()}] \u6267\u884C Claude \u67E5\u8BE2[\u539F\u751Fclaude \u6A21\u5F0F]: ${P} ${k.join(" ")}`),e.debugLog(`\u53D1\u9001\u6D88\u606F: ${N.substring(0,100)}...`);try{await me(e,t,k,P,w,N,f,q);return}catch(C){if(x=e.getSessionDir(t),m=`${x}/session.log`,C instanceof oe){if(r++,u=u||Date.now(),(0,h.isQuotaExhaustedError)(C.output)&&e.config.apiKeyCfg){if(p.push(`[${(0,n.timestamp)()}] 429 \u914D\u989D\u8017\u5C3D\uFF0C\u5C1D\u8BD5\u8F6E\u6362 Key`),y){const W=(0,h.rotateApiKey)(e,y.apiKey);if(W){y=W,c=0,console.log(`[${(0,n.timestamp)()}] API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,h.settingLabel)(W)}`),a.default.appendFileSync(m,`[${(0,n.timestamp)()}] [SYSTEM]: API Key \u914D\u989D\u8017\u5C3D(429)\uFF0C\u5207\u6362\u5230\u65B0 Key
52
+ `,"utf-8");continue}}const $=d||t.startStaffId;await(0,T.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:$,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(C.isFastFail){if(c++,c>=L){if(y&&e.config.apiKeyCfg){const $=(0,h.rotateApiKey)(e,y.apiKey);if($){y=$,c=0,console.log(`[${(0,n.timestamp)()}] TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25 ${L} \u6B21\uFF0C\u5207\u6362\u5230\u65B0 Key: ${(0,h.settingLabel)($)}`),a.default.appendFileSync(m,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u8FDE\u7EED\u5FEB\u901F\u5931\u8D25\uFF0C\u5207\u6362\u5230\u65B0 Key
53
+ `,"utf-8");continue}}throw console.log(`[${(0,n.timestamp)()}] TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${L}\u6B21\uFF0C\u653E\u5F03`),a.default.appendFileSync(m,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED${L}\u6B21\uFF0C\u653E\u5F03
54
+ `,"utf-8"),new Error(`TPM \u9650\u6D41\uFF0C\u5FEB\u901F\u5931\u8D25\u8FDE\u7EED ${L} \u6B21`)}console.log(`[${(0,n.timestamp)()}] \u68C0\u6D4B\u5230 TPM \u9650\u6D41(\u5FEB\u901F\u5931\u8D25)\uFF0C${Q/1e3}s \u540E\u91CD\u8BD5 (${c}/${L})`)}else c=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${Q/1e3}s \u540E\u91CD\u8BD5`);if(a.default.appendFileSync(m,`[${(0,n.timestamp)()}] [SYSTEM]: TPM \u9650\u6D41\uFF0C${Q/1e3}s \u540E\u91CD\u8BD5
55
+ `,"utf-8"),p.push(`[${(0,n.timestamp)()}] TPM \u9650\u6D41\uFF0C${Q/1e3}s \u540E\u91CD\u8BD5`),await Ee(Q),!R("\u505C\u6B62\u5F53\u524D\u91CD\u8BD5"))return;continue}if(C instanceof le){r++,u=u||Date.now(),p.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(m,`[${(0,n.timestamp)()}] [SYSTEM]: Claude \u4F1A\u8BDD\u5DF2\u5931\u6548\uFF0C\u6E05\u9664\u65E7\u4F1A\u8BDD\u5E76\u91CD\u65B0\u53D1\u8D77
56
+ `,"utf-8"),t.claudeSessionId&&(t.claudeSessionId=void 0,e.updateSessionFile(t,{})),c=0;continue}if(C instanceof H){const $=e.activeSessions.get(t.conversationId),W=e.getConversationConfig(t.conversationId),A=e.config.maxAutoRecovery??2,F=W?.maxTurnTimeMins??e.config.maxTurnTimeMins??5,re=$?.autoRecoveryAttempts??0;if(re<A){const j=re+1;$&&($.autoRecoveryAttempts=j),r++,u=u||Date.now(),p.push(`[${(0,n.timestamp)()}] Watchdog \u8D85\u65F6\uFF0C\u81EA\u52A8\u6062\u590D ${j}/${A}`),console.log(`[${(0,n.timestamp)()}] Watchdog \u8D85\u65F6\uFF0C\u81EA\u52A8\u6062\u590D ${j}/${A}\uFF0C\u53D1\u9001"\u7EE7\u7EED"`),a.default.appendFileSync(m,`[${(0,n.timestamp)()}] [SYSTEM]: Watchdog \u8D85\u65F6\uFF0C\u81EA\u52A8\u6062\u590D ${j}/${A}
57
+ `,"utf-8");const he=d||t.startStaffId;await(0,T.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:he,content:` Claude \u8FDB\u7A0B\u8D85\u8FC7 ${F} \u5206\u949F\u65E0\u54CD\u5E94\uFF0C\u5DF2\u81EA\u52A8\u91CD\u542F\u6062\u590D\uFF08${j}/${A}\uFF09\uFF0C\u7EE7\u7EED\u6267\u884C\u4E2D...`}),c=0,$&&($.interrupted=!1);continue}else{console.log(`[${(0,n.timestamp)()}] Watchdog \u8D85\u65F6\uFF0C\u5DF2\u8FBE\u6700\u5927\u81EA\u52A8\u6062\u590D\u6B21\u6570 ${A}\uFF0C\u901A\u77E5\u7528\u6237`),a.default.appendFileSync(m,`[${(0,n.timestamp)()}] [SYSTEM]: Watchdog \u8D85\u65F6\uFF0C\u5DF2\u8FBE\u6700\u5927\u81EA\u52A8\u6062\u590D\u6B21\u6570 ${A}
58
+ `,"utf-8");const j=d||t.startStaffId;await(0,T.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:j,content:`\u23F0 Claude \u8FDB\u7A0B\u5DF2\u8D85\u8FC7 ${F} \u5206\u949F\u65E0\u54CD\u5E94\uFF0C\u5DF2\u5C1D\u8BD5\u81EA\u52A8\u6062\u590D ${A} \u6B21\u4F46\u4ECD\u8D85\u65F6\u3002\u8BF7\u53D1\u9001 /goon \u624B\u52A8\u91CD\u542F\uFF0C\u6216 /end \u7ED3\u675F\u4F1A\u8BDD`});return}}if(C instanceof pe){r++,u=u||Date.now(),p.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(m,`[${(0,n.timestamp)()}] [SYSTEM]: \u4E0A\u4E0B\u6587\u7A97\u53E3\u8D85\u957F\uFF0C\u81EA\u52A8\u53D1\u9001 /compact \u538B\u7F29\u4E0A\u4E0B\u6587
59
+ `,"utf-8");const $=d||t.startStaffId;await(0,T.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:$,content:"\u{1F4E6} \u4E0A\u4E0B\u6587\u8D85\u957F\uFF0C\u6B63\u5728\u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587(/compact)\u540E\u7EE7\u7EED..."});const W=[...U];t.claudeSessionId&&W.push("--resume",t.claudeSessionId);const A=te(e,w,i?.settings);A&&W.push("--settings",A);try{await me(e,t,W,P,w,"/compact",!1),console.log(`[${(0,n.timestamp)()}] /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C`),a.default.appendFileSync(m,`[${(0,n.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u6210\u529F\uFF0C\u53D1\u9001"\u7EE7\u7EED"\u6062\u590D\u6267\u884C
60
+ `,"utf-8")}catch(F){throw console.error(`[${(0,n.timestamp)()}] /compact \u6267\u884C\u5931\u8D25:`,F),a.default.appendFileSync(m,`[${(0,n.timestamp)()}] [SYSTEM]: /compact \u6267\u884C\u5931\u8D25: ${F instanceof Error?F.message:String(F)}
61
+ `,"utf-8"),await(0,T.sendDingMessage)(e,{conversationId:(0,n.getReplyConversationId)(t),sessionWebhook:(0,n.getReplyWebhook)(t),atUserId:$,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)}`)}c=0;continue}throw C}}}
@@ -0,0 +1,6 @@
1
+ "use strict";var _=exports&&exports.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.CodexAgent=void 0;const D=_(require("readline")),C=_(require("fs")),v=require("./messaging"),d=require("./session"),w=require("./platform"),x=require("./watchdog");function b(u){if(!u.trim())return null;try{const t=JSON.parse(u),e=t.type||"";if(e==="thread.started"&&t.thread_id)return{type:"system",threadId:t.thread_id};if(e==="item.completed"&&t.item){const n=t.item;if(n.type==="message"&&n.role==="assistant"){const p=[];if(Array.isArray(n.content))for(const g of n.content)g.type==="output_text"&&g.text&&p.push(g.text);if(p.length>0)return{type:"assistant",content:p.join(`
2
+ `)}}if(n.type==="function_call_output")return{type:"tool"}}return e==="turn.completed"?{type:"result"}:e==="turn.failed"?{type:"error",content:t.error?.message||"unknown error"}:e==="error"?{type:"error",content:t.message||t.error||"unknown error"}:{type:e||"unknown"}}catch{return{type:"text",content:u}}}class R{constructor(){this.type="codex"}async executeQuery(t,e,n){const p=t.getConversationConfig(e.conversationId),g=t.getSessionDir(e),i=t.getConversationDir(e.conversationId);C.default.mkdirSync(g,{recursive:!0});const S=n.senderNick&&n.senderStaffId?`${n.senderNick}(${n.senderStaffId})`:"unknown",c=!n.rawMessage&&n.message.startsWith("/")?` ${n.message}`:n.message,h=n.rawMessage?n.message:`${c} \u2500\u2500 \u6D88\u606F\u6765\u81EA: ${S}`;(0,d.appendSessionLog)(g,"user",h);const o=["exec"],m=p?.model||t.config.model;e.agentSessionId?(o.push("resume","--skip-git-repo-check"),o.push("-c","sandbox_mode=full-auto"),o.push("-c","approval_policy=never"),m&&o.push("--model",m),o.push(e.agentSessionId),o.push("--json","-")):(o.push("--skip-git-repo-check"),o.push("--sandbox","full-auto"),o.push("-c","approval_policy=never"),m&&o.push("--model",m),o.push("--json","--cd",i,"-")),console.log(`[${(0,d.timestamp)()}] \u6267\u884C Codex \u67E5\u8BE2: codex ${o.join(" ")}`),await this.runCodexOnce(t,e,o,i,h)}interrupt(t,e){return t.currentProcess?(console.log(`[${(0,d.timestamp)()}] ${e}`),t.interrupted=!0,t.currentProcess.kill("SIGINT"),!0):!1}getEntryCommand(){return"codex"}async runCodexOnce(t,e,n,p,g){const i=t.activeSessions.get(e.conversationId),S=Date.now(),c=(0,w.spawnCommand)("codex",n,{cwd:p,stdio:["pipe","pipe","pipe"],env:{...process.env}});i&&(i.currentProcess=c,i.lastActivityTime=S),c.stdin?.write(g+`
3
+ `),c.stdin?.end();const h=[];let o=!1;const m=()=>{i&&(i.lastActivityTime=Date.now())},l=new x.AgentWatchdog(t,e,i,{killChild:()=>{try{c.kill("SIGTERM")}catch{}setTimeout(()=>{try{c.kill("SIGKILL")}catch{}},2e3)},onTimeout:(f,y,$)=>{(0,x.defaultWatchdogOnTimeout)(t,e,f,y,$,"codex")},onRecoveryFailed:f=>{(0,x.defaultWatchdogOnRecoveryFailed)(t,e,f,"codex")}},S);return l.start(),new Promise((f,y)=>{D.default.createInterface({input:c.stdout}).on("line",s=>{m(),t.debugLog(`Codex stdout: ${s.substring(0,200)}`);const r=b(s);if(r){if(r.type==="system"&&r.threadId&&(e.agentSessionId||t.updateSessionFile(e,{agentSessionId:r.threadId}),console.log(`[${(0,d.timestamp)()}] Codex thread_id: ${r.threadId}`)),r.type==="assistant"&&r.content&&h.push(r.content),r.type==="result"){l.markSettled(),l.stop();const a=h.join(`
4
+ `).trim();if(a&&!i?.interrupted){try{(0,d.appendSessionLog)(p,"assistant",a)}catch{}const k=i?.lastSenderStaffId||e.startStaffId;o=!0,(0,v.sendClaudeResponseToDing)(t,e.currentConversationId||e.conversationId,e.currentWebhook||e.sessionWebhook,k,a).catch(I=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",I))}f()}if(r.type==="error"){l.markSettled(),l.stop();const a=i?.lastSenderStaffId||e.startStaffId;(0,v.sendDingMessage)(t,{conversationId:e.currentConversationId||e.conversationId,sessionWebhook:e.currentWebhook||e.sessionWebhook,atUserId:a,content:`\u274C Codex \u6267\u884C\u5931\u8D25: ${r.content}`}).catch(()=>{}),f()}}}),c.stderr?.on("data",s=>{const r=s.toString();m(),console.error(`[Codex stderr]: ${r}`);try{const a=t.getSessionDir(e);C.default.appendFileSync(`${a}/session.log`,`[${(0,d.timestamp)()}] [ERROR]: ${r}`,"utf-8")}catch{}}),c.on("close",s=>{l.markSettled(),l.stop(),console.log(`[${(0,d.timestamp)()}] Codex \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${s}`);const r=t.activeSessions.get(e.conversationId);if(r&&(r.currentProcess=void 0),r?.interrupted){r.interrupted=!1,h.length=0,f();return}if(o){if(s===0){f();return}y(new Error(`Codex \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${s}`));return}if(h.length>0){const a=h.join(`
5
+ `).trim();if(a){try{const I=t.getSessionDir(e);(0,d.appendSessionLog)(I,"assistant",a)}catch{}const k=r?.lastSenderStaffId||e.startStaffId;(0,v.sendClaudeResponseToDing)(t,e.currentConversationId||e.conversationId,e.currentWebhook||e.sessionWebhook,k,a).catch(I=>console.error("\u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",I))}}if(s===0&&!r?.interrupted){console.warn(`[${(0,d.timestamp)()}] Codex \u8FDB\u7A0B\u6B63\u5E38\u9000\u51FA\u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u56DE\u590D\u5185\u5BB9`);const a=r?.lastSenderStaffId||e.startStaffId;(0,v.sendDingMessage)(t,{conversationId:e.currentConversationId||e.conversationId,sessionWebhook:e.currentWebhook||e.sessionWebhook,atUserId:a,content:"\u26A0\uFE0F Codex \u5904\u7406\u5B8C\u6210\u4F46\u672A\u8FD4\u56DE\u4EFB\u4F55\u5185\u5BB9"}).catch(()=>{})}if(s===0){f();return}y(new Error(`Codex \u8FDB\u7A0B\u9000\u51FA\uFF0C\u4EE3\u7801: ${s}`))}),c.on("error",s=>{l.markSettled(),l.stop(),console.error("Codex \u8FDB\u7A0B\u9519\u8BEF:",s);try{const r=t.getSessionDir(e);C.default.appendFileSync(`${r}/session.log`,`[${(0,d.timestamp)()}] [ERROR]: \u8FDB\u7A0B\u9519\u8BEF: ${s.message}
6
+ `,"utf-8")}catch{}y(s)})})}}exports.CodexAgent=R;
@@ -1,6 +1,6 @@
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=b,exports.getCommandByName=I,exports.formatHelpOverview=k,exports.formatCommandHelp=q,exports.parseEndCommand=M,exports.parseInfoCommand=S,exports.formatConversationInfo=L,exports.formatGlobalConfig=T,exports.parseLogCommand=v,exports.parseLsCommand=D,exports.findSubdirByName=R,exports.getDirectoryStructure=$,exports.parseContinueSessionCommand=O,exports.parseCronCommand=A,exports.parseVersionCommand=B,exports.parseOpenCommand=_,exports.parseCleanCommand=G,exports.parseResetApiKeyCfgCommand=N,exports.parseCfgCommand=P,exports.parseBashCommand=H,exports.parseMqCommand=U,exports.parseAuthCommand=E,exports.parseGoonCommand=K,exports.parseCcCommand=W,exports.parseClaudeMdCommand=F,exports.parseInterruptCommand=Q,exports.parseDestroyCommand=V,exports.parseFreedomCommand=Y,exports.parseQaCommand=z,exports.parseTodoCommand=J,exports.parseMenuCommand=X,exports.parseRebootCommand=Z,exports.parseRecorderCommandEnhanced=ee;const y=g(require("fs")),c=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] [--qaGitRepos \u76EE\u5F551,\u76EE\u5F552] [--qaDocs url1,url2] [--qaAutoPull true|false]',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 --qaGitRepos cc-ding,my-project --qaAutoPull true","/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",description:"Recorder \u6A21\u5F0F\uFF1A\u8BB0\u5F55\u6240\u6709\u6D88\u606F\u5230\u672C\u5730\uFF08\u4EC5 owner \u5355\u804A\uFF0C\u53D1\u9001 /recorder exit \u9000\u51FA\uFF09",usage:"/recorder [on|exit]",examples:["/recorder on","/recorder 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\uFF08\u652F\u6301 /! /\uFF01 ! \uFF01\uFF09",usage:"/! | /\uFF01 | ! | \uFF01",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},{name:"/destroy",description:"\u6CE8\u9500\u5F53\u524D\u7FA4\u673A\u5668\u4EBA\uFF0C\u5220\u9664\u5DE5\u4F5C\u76EE\u5F55\u548C\u914D\u7F6E",usage:"/destroy [--conversationId xxx]",examples:["/destroy","/destroy --conversationId targetConvId"],category:"\u7BA1\u7406",ownerOnly:!0},{name:"/freedom",description:"\u81EA\u7531\u6A21\u5F0F\uFF1A\u5F00\u542F\u540E\u6240\u6709\u7FA4\u6210\u5458\u5747\u53EF\u4F7F\u7528\u673A\u5668\u4EBA\uFF08\u8DF3\u8FC7\u767D\u540D\u5355\u9650\u5236\uFF09",usage:"/freedom | /freedom exit",examples:["/freedom","/freedom exit"],category:"\u7BA1\u7406",ownerOnly:!0},{name:"/qa",description:"\u95EE\u7B54\u6A21\u5F0F\uFF1A\u5F00\u542F\u540E Claude \u4EE5\u53EA\u8BFB plan \u6A21\u5F0F\u8FD0\u884C\uFF0C\u6240\u6709\u7FA4\u6210\u5458\u5747\u53EF\u4F7F\u7528",usage:"/qa | /qa exit",examples:["/qa","/qa exit"],category:"\u7BA1\u7406"}],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 b(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(r=>r.toLowerCase()===t))}function k(e,t){const s=C.filter(n=>t||!n.ownerOnly),r=["### \u{1F917}","----",`- **\u7248\u672C:** ${e}`,"- **\u4F5C\u8005:** yihuineng","- **Github:** https://github.com/yihuineng/cc-ding","----"];for(const{category:n,icon:i}of x){const a=s.filter(o=>o.category===n);if(a.length!==0){r.push(`${i} **${n}**`);for(const o of a)r.push(`- \`${o.name}\` ${o.description}`);r.push("")}}return r.push("\u{1F4A1} \u8F93\u5165 `/{\u547D\u4EE4} --help` \u67E5\u770B\u547D\u4EE4\u8BE6\u7EC6\u7528\u6CD5"),r.join(`
2
- `)}function q(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 M(e){return e.trim().toLowerCase()==="/end"}function S(e){const t=e.trim().toLowerCase();return t==="/info"?"all":t==="/info robot"?"robot":t==="/info session"?"session":t==="/info task"?"task":null}function L(e,t,s,r){const n=[`- **\u7FA4ID:** ${t}`];if(e.conversationTitle&&n.push(`- **\u7FA4\u540D\u79F0:** ${e.conversationTitle}`),e.conversationType&&n.push(`- **\u4F1A\u8BDD\u7C7B\u578B:** ${e.conversationType==="1"?"\u5355\u804A":e.conversationType==="2"?"\u7FA4\u804A":e.conversationType}`),r&&n.push(`- **\u5DE5\u4F5C\u76EE\u5F55:** \`${r}\``),e.linkConversationId&&n.push(`- **\u5173\u8054\u4F1A\u8BDDID:** ${e.linkConversationId}`),e.agent&&n.push(`- **agent:** ${e.agent}`),e.dingToken&&n.push(`- **dingToken:** ${e.dingToken.substring(0,8)}...`),e.whiteUserList?.length){const i=e.whiteUserList.map(a=>s?.(a)||a).join(", ");n.push(`- **\u7FA4\u767D\u540D\u5355:** ${i}`)}return e.atSender===!1&&n.push("- **atSender:** false"),e.receiveReply===!1&&n.push("- **receiveReply:** false (\u4E0D\u56DE\u590D\u786E\u8BA4\u6D88\u606F)"),e.freedomMode&&n.push("- **freedomMode:** \u5DF2\u5F00\u542F\uFF08\u8DF3\u8FC7\u767D\u540D\u5355\u9650\u5236\uFF09"),e.useLocalOcr===!1&&n.push("- **\u672C\u5730OCR:** \u5173\u95ED"),e.permissionMode&&n.push(`- **permissionMode:** ${e.permissionMode}`),e.taskCfg?.skill&&n.push(`- **taskSkill:** ${e.taskCfg.skill}`),e.preBash&&n.push(`- **preBash:** \`${e.preBash}\``),e.qaMode&&n.push("- **qaMode:** \u5DF2\u5F00\u542F\uFF08\u53EA\u8BFB\u95EE\u7B54\u6A21\u5F0F\uFF0C\u6240\u6709\u7FA4\u6210\u5458\u53EF\u7528\uFF09"),e.qaCfg?.gitRepos?.length&&n.push(`- **qaGitRepos:** ${e.qaCfg.gitRepos.join(", ")}`),e.qaCfg?.docs?.length&&n.push(`- **qaDocs:** ${e.qaCfg.docs.join(", ")}`),e.qaCfg?.autoPull&&n.push("- **qaAutoPull:** \u5DF2\u5F00\u542F"),n.join(`
4
- `)}function T(e){const t=[`- **clientName:** ${e.clientName||"-"}`,`- **sessionMaxConcurrency:** ${e.sessionMaxConcurrency??5}`,`- **taskHandlerCount:** ${e.taskHandlerCount??1}`,`- **taskQueueSize:** ${e.taskQueueSize??50}`,`- **includeThinking:** ${e.includeThinking??!1}`,`- **resultOnly:** ${e.resultOnly??!0}`];if(e.defaultDingToken&&t.push(`- **defaultDingToken:** ${e.defaultDingToken.substring(0,8)}...`),e.owner&&t.push(`- **owner:** ${e.owner}`),e.whiteUserList?.length&&t.push(`- **\u5168\u5C40\u767D\u540D\u5355:** ${e.whiteUserList.join(", ")}`),e.apiKeyCfg){const s=e.apiKeyCfg.claudeSettings.filter(r=>r.isValid).length;t.push(`- **apiKeyCfg:** ${s}/${e.apiKeyCfg.claudeSettings.length} \u6709\u6548`),t.push(` - **\u6700\u8FD1\u91CD\u7F6E:** ${e.apiKeyCfg.resetTime||"-"}`)}return t.join(`
5
- `)}function v(e){const s=e.trim().match(/^\/log(?:\s+(\d+))?$/i);if(!s)return null;const r=parseInt(s[1],10);return isNaN(r)||r<=0?10:r}function D(e){const s=e.trim().match(/^\/ls(?:\s+(.+))?$/i);if(!s)return null;if(s[1]===void 0)return{target:"",depth:1};const r=s[1].trim().split(/\s+/),n=r[0]||"",i=r[1]?parseInt(r[1],10):1;return{target:n,depth:isNaN(i)||i<0?1:Math.min(i,5)}}function R(e,t,s=3){const r=[{dir:e,depth:0}];for(;r.length>0;){const{dir:n,depth:i}=r.shift();if(!(i>s))try{const a=y.default.readdirSync(n,{withFileTypes:!0});for(const o of a)if(!(!o.isDirectory()||o.name.startsWith("."))){if(o.name===t)return c.default.join(n,o.name);r.push({dir:c.default.join(n,o.name),depth:i+1})}}catch{continue}}return null}function $(e,t=0,s=1){try{const r=y.default.readdirSync(e,{withFileTypes:!0}).filter(a=>!a.name.startsWith("."));if(r.length===0)return t===0?"\u{1F4C2} \u76EE\u5F55\u4E3A\u7A7A":"";r.sort((a,o)=>a.isDirectory()!==o.isDirectory()?a.isDirectory()?-1:1:a.name.localeCompare(o.name));const n=[],i=". ".repeat(t);for(const a of r){const o=a.isDirectory()?"\u{1F4C1} ":"\u{1F4C4} ",m=a.isDirectory()?"/":"";if(n.push(`${i}${o}${a.name}${m}`),a.isDirectory()&&t<s){const u=c.default.join(e,a.name),d=$(u,t+1,s);d&&n.push(d)}}return n.join(`
6
- `)}catch{return t===0?"\u274C \u65E0\u6CD5\u8BFB\u53D6\u76EE\u5F55":""}}function O(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 A(e){const t=e.trim();if(!t.toLowerCase().startsWith("/cron"))return null;const s=t.substring(5).trim();if(!s)return null;if(/^(list|ls)$/i.test(s))return{type:"list"};const r=s.match(/^(?:delete|rm)\s+(\S+)$/i);if(r)return{type:"delete",id:r[1]};const n=s.match(/^pause\s+(\S+)$/i);if(n)return{type:"pause",id:n[1]};const i=s.match(/^resume\s+(\S+)$/i);if(i)return{type:"resume",id:i[1]};const a=s.match(/^(\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s+(.+)$/);return a&&j(a[1])?{type:"create_cron",cronExpression:a[1],prompt:a[2]}:{type:"create_nl",input:s}}function B(e){return e.trim()==="/version"}function _(e){const t=e.trim().toLowerCase();return t==="/open"?"folder":t==="/open shell"?"shell":t==="/open code"?"code":null}function G(e){const t=e.trim().toLowerCase();return t==="/clean"?"current":t==="/clean all"?"all":null}function N(e){return e.trim().toLowerCase()==="/reset-apikeycfg"}function P(e){const t=e.trim();if(!/^\/cfg(?:\s|$)/i.test(t))return null;const s=t.substring(4).trim();if(!s)return{};if(/^--help$/i.test(s))return null;const r={},n=s.split(/\s+/);for(let i=0;i<n.length;i++){const a=n[i];if(a==="--dingToken"&&n[i+1])r.dingToken=n[++i];else if(a==="--linkConversationId"&&n[i+1])r.linkConversationId=n[++i];else if(a==="--conversationId"&&n[i+1])r.conversationId=n[++i];else if(a==="--whiteUserList"&&n[i+1])r.whiteUserList=n[++i].split(",").map(o=>o.trim()).filter(Boolean);else if(a==="--conversationTitle"&&n[i+1]){const o=[];for(;i+1<n.length&&!n[i+1].startsWith("--");)o.push(n[++i]);o.length>0&&(r.conversationTitle=o.join(" "))}else if(a==="--atSender"&&n[i+1]){const o=n[++i].toLowerCase();r.atSender=o==="true"||o==="1"||o==="yes"}else if(a==="--receiveReply"&&n[i+1]){const o=n[++i].toLowerCase();r.receiveReply=o==="true"||o==="1"||o==="yes"}else if(a==="--preBash"&&n[i+1]){const o=[];for(;i+1<n.length&&!n[i+1].startsWith("--");)o.push(n[++i]);o.length>0&&(r.preBash=o.join(" ").replace(/^["']|["']$/g,""))}else if(a==="--permissionMode"&&n[i+1])r.permissionMode=n[++i];else if(a==="--qaGitRepos"&&n[i+1])r.qaGitRepos=n[++i].split(",").map(o=>o.trim()).filter(Boolean);else if(a==="--qaDocs"&&n[i+1])r.qaDocs=n[++i].split(",").map(o=>o.trim()).filter(Boolean);else if(a==="--qaAutoPull"&&n[i+1]){const o=n[++i].toLowerCase();r.qaAutoPull=o==="true"||o==="1"||o==="yes"}}return r}function H(e){const s=e.trim().match(/^\/bash\s+(.+)$/i);return s&&s[1].trim()||null}function U(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 r=s.match(/^rm\s+(.+)$/i);if(r){const n=r[1].trim(),i=[],a=n.match(/^(\d+)\s*-\s*(\d+)$/);if(a){const m=parseInt(a[1],10),u=parseInt(a[2],10);if(m>0&&u>=m){for(let d=m;d<=u;d++)i.push(d);return{type:"rm",indices:i}}}const o=n.split(/\s+/);for(const m of o){const u=parseInt(m,10);u>0&&i.push(u)}if(i.length>0)return{type:"rm",indices:i}}return null}function E(e){const t=e.trim(),s=t.match(/^\/auth\s+admin\s+add\s+(\S+)$/i);if(s)return{type:"adminAdd",staffId:s[1]};const r=t.match(/^\/auth\s+admin\s+(?:rm|del)\s+(\S+)$/i);if(r)return{type:"adminRm",staffId:r[1]};if(/^\/auth\s+admin(?:\s+list)?$/i.test(t))return{type:"adminList"};const n=t.match(/^\/auth\s+add\s+(\S+)$/i);if(n)return{type:"add",staffId:n[1]};const i=t.match(/^\/auth\s+(?:del(?:ete)?|rm)\s+(\S+)$/i);if(i)return{type:"del",staffId:i[1]};const a=t.match(/^\/auth\s+approve\s+(\S+)$/i);if(a)return{type:"approve",requestId:a[1]};const o=t.match(/^\/auth\s+reject\s+(\S+)$/i);return o?{type:"reject",requestId:o[1]}:/^\/auth(?:\s+list)?$/i.test(t)?{type:"list"}:null}function K(e){return/^\/goon$/i.test(e.trim())}function W(e){const s=e.trim().match(/^\/cc\s+(.+)$/i);if(!s)return null;const r=s[1].trim();return r.startsWith("/")?r:`/${r}`}function F(e){return/^\/claude\.md$/i.test(e.trim())}function Q(e){const t=e.trim();return t==="/!"||t==="/\uFF01"||t==="!"||t==="\uFF01"}function V(e){const t=e.trim();if(!/^\/destroy(\b|$)/.test(t))return null;const s=t.substring(8).trim();if(!s)return{};if(/^--help$/i.test(s))return null;const r={},n=s.split(/\s+/);for(let i=0;i<n.length;i++)n[i]==="--conversationId"&&n[i+1]&&(r.conversationId=n[++i]);return r}function Y(e){const t=e.trim();if(!/^\/freedom(\b|$)/i.test(t))return null;const s=t.substring(8).trim().toLowerCase();return s?s==="exit"?{action:"exit"}:null:{action:"enter"}}function z(e){const t=e.trim();if(!/^\/qa(\b|$)/i.test(t))return null;const s=t.substring(3).trim().toLowerCase();return s?s==="exit"?{action:"exit"}:null:{action:"enter"}}function J(e,t){const s=e.trim();if(!/^\/todo(?:\s|$)/i.test(s)&&s.toLowerCase()!=="/todo")return null;const r=s.substring(5).trim();if(/^list$/i.test(r))return{type:"list"};if(!r)return{type:"list"};const n=r.match(/^mode\s+(staffId|dingtalkId)$/i);if(n)return{type:"mode",mode:n[1]};const i=r.match(/^done\s+(\d+)$/i);if(i)return{type:"done",index:parseInt(i[1],10)};if(/^rm\s+all$/i.test(r))return{type:"remove",index:"all"};const a=r.match(/^rm\s+(\d+)$/i);if(a)return{type:"remove",index:parseInt(a[1],10)};if(/^remind\s+-1$/i.test(r))return{type:"remind",hour:null};const o=r.match(/^remind\s+(\d+)$/i);if(o){const l=parseInt(o[1],10);return l>=0&&l<=23?{type:"remind",hour:l}:null}let m=r,u,d,p;const f=m.match(/@(\S+)/);if(f){const l=f[1];m=m.replace(/@\S+/,"").trim(),u=l,d=l}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 X(e){const t=e.trim();if(!/^\/menu(?:\s|$)/i.test(t)&&t.toLowerCase()!=="/menu")return null;const s=t.substring(5).trim(),r=s.startsWith("-g "),n=r?s.substring(3).trim():s;if(!s)return{type:"show"};if(r&&!n)return{type:"list",isGlobal:!0};const i=n.match(/^trigger\s+(\S+)$/i);if(i&&!r)return{type:"trigger",word:i[1]};const a=n.match(/^add\s+(.+)$/i);if(a)return{type:"add",command:a[1].trim(),isGlobal:r};const o=n.match(/^del(?:ete)?\s+(\d+)$/i);return o?{type:"del",index:parseInt(o[1],10),isGlobal:r}:/^list$/i.test(n)?{type:"list",isGlobal:r}:r?null:{type:"show"}}function Z(e){const t=e.trim();if(!/^\/reboot(?:\s|$)/i.test(t))return null;const s=t.substring(7).trim();if(!s)return{update:!1};const r=s.match(/^--update(?:\s+(\S+))?$/i);return r?{update:!0,tag:r[1]}:null}function ee(e){const t=e.trim();return/^\/recorder\s+on$/i.test(t)?"on":/^\/recorder\s+exit$/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=b,exports.parseCommandHelp=M,exports.getCommandByName=w,exports.formatHelpOverview=I,exports.formatCommandHelp=k,exports.parseEndCommand=S,exports.parseInfoCommand=q,exports.formatConversationInfo=L,exports.formatGlobalConfig=T,exports.parseLogCommand=v,exports.parseLsCommand=R,exports.findSubdirByName=D,exports.getDirectoryStructure=$,exports.parseContinueSessionCommand=j,exports.parseCronCommand=B,exports.parseVersionCommand=_,exports.parseOpenCommand=U,exports.parseCleanCommand=O,exports.parseResetApiKeyCfgCommand=W,exports.parseCfgCommand=N,exports.parseBashCommand=P,exports.parseMqCommand=H,exports.parseAuthCommand=E,exports.parseGoonCommand=G,exports.parseCcCommand=K,exports.parseClaudeMdCommand=Q,exports.parseInterruptCommand=F,exports.parseDestroyCommand=V,exports.parseFreedomCommand=z,exports.parseQaCommand=Y,exports.parseTodoCommand=J,exports.parseMenuCommand=X,exports.parseRebootCommand=Z,exports.parseRecorderCommandEnhanced=ee,exports.parseTimerCommand=te,exports.parseModelCommand=re;const y=g(require("fs")),h=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:"/timer",description:"\u8BBE\u7F6E\u4E00\u6B21\u6027\u5EF6\u65F6\u63D0\u9192\uFF0C\u5230\u671F\u540E\u81EA\u52A8\u6267\u884C",usage:"/timer <5m|1h30m|2d> <\u63D0\u9192\u5185\u5BB9> | /timer list | /timer cancel <id>",examples:["/timer 5m \u63D0\u9192\u6211\u68C0\u67E5\u90E8\u7F72","/timer 1h30m \u603B\u7ED3\u4ECA\u5929\u7684PR","/timer 2d \u9879\u76EE\u91CC\u7A0B\u7891\u68C0\u67E5","/timer list","/timer cancel timer_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"},{name:"/clean",description:"\u6E05\u9664\u5386\u53F2\u4F1A\u8BDD\u548C\u7F13\u5B58(.sessions/.tasks/.images/.playwright-cli)",usage:"/clean",examples:["/clean"],category:"\u7BA1\u7406"},{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"},{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] [--enableMsgToUser true|false] [--ensureAt true|false] [--model model-name]',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"},{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"},{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",description:"Recorder \u6A21\u5F0F\uFF1A\u8BB0\u5F55\u6240\u6709\u6D88\u606F\u5230\u672C\u5730\uFF08\u4EC5 owner/\u7BA1\u7406\u5458\u5355\u804A\uFF0C\u53D1\u9001 /recorder exit \u9000\u51FA\uFF09",usage:"/recorder [on|exit]",examples:["/recorder on","/recorder exit"],category:"\u7BA1\u7406"},{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\uFF08\u652F\u6301 /! /\uFF01 ! \uFF01\uFF09",usage:"/! | /\uFF01 | ! | \uFF01",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"},{name:"/destroy",description:"\u6CE8\u9500\u5F53\u524D\u7FA4\u673A\u5668\u4EBA\uFF0C\u5220\u9664\u5DE5\u4F5C\u76EE\u5F55\u548C\u914D\u7F6E",usage:"/destroy [--conversationId xxx]",examples:["/destroy","/destroy --conversationId targetConvId"],category:"\u7BA1\u7406"},{name:"/freedom",description:"\u81EA\u7531\u6A21\u5F0F\uFF1A\u5F00\u542F\u540E\u6240\u6709\u7FA4\u6210\u5458\u5747\u53EF\u4F7F\u7528\u673A\u5668\u4EBA\uFF08\u8DF3\u8FC7\u767D\u540D\u5355\u9650\u5236\uFF09",usage:"/freedom | /freedom exit",examples:["/freedom","/freedom exit"],category:"\u7BA1\u7406"},{name:"/qa",description:"\u95EE\u7B54\u6A21\u5F0F\uFF1A\u5F00\u542F\u540E Claude \u4EE5\u53EA\u8BFB plan \u6A21\u5F0F\u8FD0\u884C\uFF0C\u6240\u6709\u7FA4\u6210\u5458\u5747\u53EF\u4F7F\u7528",usage:"/qa | /qa exit | /qa --gitRepos https://github.com/a/b | /qa --docs url1,url2 | /qa --autoPull true|false",examples:["/qa","/qa exit","/qa --gitRepos https://github.com/user/repo.git","/qa --docs https://example.com/doc --autoPull true"],category:"\u7BA1\u7406"},{name:"/model",description:"\u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u4F7F\u7528\u7684 Claude \u6A21\u578B",usage:"/model | /model list | /model <model-name> | /model add <model-name> | /model rm <model-name>",examples:["/model","/model list","/model claude-sonnet-4-20250514","/model add claude-3-7-sonnet-20250219","/model rm claude-haiku-4-20251001"],category:"\u7BA1\u7406"}],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 b(e){return e.trim().toLowerCase()==="/help"}function M(e){const s=e.trim().match(/^(\/\w+)\s+--help$/i);return s?s[1].toLowerCase():null}function w(e){const t=e.toLowerCase();return C.find(s=>s.name.toLowerCase()===t||s.aliases?.some(n=>n.toLowerCase()===t))}function I(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 a=s.filter(o=>o.category===r);if(a.length!==0){n.push(`${i} **${r}**`);for(const o of a)n.push(`- \`${o.name}\` ${o.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 k(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 q(e){const t=e.trim().toLowerCase();return t==="/info"?"all":t==="/info robot"?"robot":t==="/info session"?"session":t==="/info task"?"task":null}function L(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.model&&r.push(`- **model:** ${e.model}`),e.dingToken&&r.push(`- **dingToken:** ${e.dingToken.substring(0,8)}...`),e.whiteUserList?.length){const i=e.whiteUserList.map(a=>s?.(a)||a).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.freedomMode&&r.push("- **freedomMode:** \u5DF2\u5F00\u542F\uFF08\u8DF3\u8FC7\u767D\u540D\u5355\u9650\u5236\uFF09"),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}\``),e.qaMode&&r.push("- **qaMode:** \u5DF2\u5F00\u542F\uFF08\u53EA\u8BFB\u95EE\u7B54\u6A21\u5F0F\uFF0C\u6240\u6709\u7FA4\u6210\u5458\u53EF\u7528\uFF09"),e.qaCfg?.gitRepos?.length&&r.push(`- **QA gitRepos:** ${e.qaCfg.gitRepos.join(", ")}`),e.qaCfg?.docs?.length&&r.push(`- **QA docs:** ${e.qaCfg.docs.join(", ")}`),e.qaCfg?.autoPull&&r.push("- **QA autoPull:** \u5DF2\u5F00\u542F"),e.ensureAt&&r.push("- **ensureAt:** \u5DF2\u5F00\u542F\uFF08\u8FFD\u52A0 text \u6D88\u606F\u786E\u4FDD @ \u901A\u77E5\u751F\u6548\uFF09"),r.join(`
4
+ `)}function T(e){const t=[`- **clientName:** ${e.clientName||"-"}`,`- **model:** ${e.model||"(\u9ED8\u8BA4)"}`,`- **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.push(`- **enableMsgToUser:** ${e.enableMsgToUser??!1} (\u79C1\u804A\u6D88\u606F\u5F00\u5173)`),t.join(`
5
+ `)}function v(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 R(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 D(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 a=y.default.readdirSync(r,{withFileTypes:!0});for(const o of a)if(!(!o.isDirectory()||o.name.startsWith("."))){if(o.name===t)return h.default.join(r,o.name);n.push({dir:h.default.join(r,o.name),depth:i+1})}}catch{continue}}return null}function $(e,t=0,s=1){try{const n=y.default.readdirSync(e,{withFileTypes:!0}).filter(a=>!a.name.startsWith("."));if(n.length===0)return t===0?"\u{1F4C2} \u76EE\u5F55\u4E3A\u7A7A":"";n.sort((a,o)=>a.isDirectory()!==o.isDirectory()?a.isDirectory()?-1:1:a.name.localeCompare(o.name));const r=[],i=". ".repeat(t);for(const a of n){const o=a.isDirectory()?"\u{1F4C1} ":"\u{1F4C4} ",m=a.isDirectory()?"/":"";if(r.push(`${i}${o}${a.name}${m}`),a.isDirectory()&&t<s){const d=h.default.join(e,a.name),l=$(d,t+1,s);l&&r.push(l)}}return r.join(`
6
+ `)}catch{return t===0?"\u274C \u65E0\u6CD5\u8BFB\u53D6\u76EE\u5F55":""}}function j(e){const t=e.trim().match(/^\/resume(?:\s+(\S+))?$/i);return t?t[1]!==void 0?t[1]:"":null}function A(e){const t=e.trim().split(/\s+/);return t.length!==5?!1:t.every(s=>/^[\d*/\-]+$/.test(s))}function B(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 a=s.match(/^(\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s+(.+)$/);return a&&A(a[1])?{type:"create_cron",cronExpression:a[1],prompt:a[2]}:{type:"create_nl",input:s}}function _(e){return e.trim().toLowerCase()==="/version"}function U(e){const t=e.trim().toLowerCase();return t==="/open"?"folder":t==="/open shell"?"shell":t==="/open code"?"code":null}function O(e){const t=e.trim().toLowerCase();return t==="/clean"?"current":t==="/clean all"?"all":null}function W(e){return e.trim().toLowerCase()==="/reset-apikeycfg"}function N(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 a=r[i];if(a==="--dingToken"&&r[i+1])n.dingToken=r[++i];else if(a==="--linkConversationId"&&r[i+1])n.linkConversationId=r[++i];else if(a==="--conversationId"&&r[i+1])n.conversationId=r[++i];else if(a==="--whiteUserList"&&r[i+1])n.whiteUserList=r[++i].split(",").map(o=>o.trim()).filter(Boolean);else if(a==="--conversationTitle"&&r[i+1]){const o=[];for(;i+1<r.length&&!r[i+1].startsWith("--");)o.push(r[++i]);o.length>0&&(n.conversationTitle=o.join(" "))}else if(a==="--atSender"&&r[i+1]){const o=r[++i].toLowerCase();n.atSender=o==="true"||o==="1"||o==="yes"}else if(a==="--receiveReply"&&r[i+1]){const o=r[++i].toLowerCase();n.receiveReply=o==="true"||o==="1"||o==="yes"}else if(a==="--preBash"&&r[i+1]){const o=[];for(;i+1<r.length&&!r[i+1].startsWith("--");)o.push(r[++i]);o.length>0&&(n.preBash=o.join(" ").replace(/^["']|["']$/g,""))}else if(a==="--permissionMode"&&r[i+1])n.permissionMode=r[++i];else if(a==="--streaming"&&r[i+1]){const o=r[++i].toLowerCase();n.streaming=o==="true"||o==="1"||o==="yes"}else if(a==="--cardTemplateId"&&r[i+1])n.cardTemplateId=r[++i];else if(a==="--model"&&r[i+1])n.model=r[++i];else if(a==="--enableMsgToUser"&&r[i+1]){const o=r[++i].toLowerCase();n.enableMsgToUser=o==="true"||o==="1"||o==="yes"}else if(a==="--ensureAt"&&r[i+1]){const o=r[++i].toLowerCase();n.ensureAt=o==="true"||o==="1"||o==="yes"}else a==="--reload"&&(n.reload=!0)}return n}function P(e){const s=e.trim().match(/^\/bash\s+(.+)$/i);return s&&s[1].trim()||null}function H(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=[],a=r.match(/^(\d+)\s*-\s*(\d+)$/);if(a){const m=parseInt(a[1],10),d=parseInt(a[2],10);if(m>0&&d>=m){for(let l=m;l<=d;l++)i.push(l);return{type:"rm",indices:i}}}const o=r.split(/\s+/);for(const m of o){const d=parseInt(m,10);d>0&&i.push(d)}if(i.length>0)return{type:"rm",indices:i}}return null}function E(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 a=t.match(/^\/auth\s+approve\s+(\S+)$/i);if(a)return{type:"approve",requestId:a[1]};const o=t.match(/^\/auth\s+reject\s+(\S+)$/i);return o?{type:"reject",requestId:o[1]}:/^\/auth(?:\s+list)?$/i.test(t)?{type:"list"}:null}function G(e){return/^\/goon$/i.test(e.trim())}function K(e){const s=e.trim().match(/^\/cc\s+(.+)$/i);if(!s)return null;const n=s[1].trim();return n.startsWith("/")?n:`/${n}`}function Q(e){return/^\/claude\.md$/i.test(e.trim())}function F(e){const t=e.trim();return t==="/!"||t==="/\uFF01"||t==="!"||t==="\uFF01"?"":t.startsWith("!!")||t.startsWith("\uFF01\uFF01")?!1:t.startsWith("!")||t.startsWith("\uFF01")||t.startsWith("/!")||t.startsWith("/\uFF01")?t:!1}function V(e){const t=e.trim();if(!/^\/destroy(\b|$)/.test(t))return null;const s=t.substring(8).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++)r[i]==="--conversationId"&&r[i+1]&&(n.conversationId=r[++i]);return n}function z(e){const t=e.trim();if(!/^\/freedom(\b|$)/i.test(t))return null;const s=t.substring(8).trim().toLowerCase();return s?s==="exit"?{action:"exit"}:null:{action:"enter"}}function Y(e){const t=e.trim();if(!/^\/qa(\b|$)/i.test(t))return null;const s=t.substring(3).trim();if(!s)return{action:"enter"};if(s.toLowerCase()==="exit")return{action:"exit"};const r=s.split(/\s+/),i={action:"config"};let a=!1;for(let o=0;o<r.length;o++){const m=r[o];if(m==="--gitRepos"&&r[o+1])i.gitRepos=r[++o].split(",").map(d=>d.trim()).filter(Boolean),a=!0;else if(m==="--docs"&&r[o+1])i.docs=r[++o].split(",").map(d=>d.trim()).filter(Boolean),a=!0;else if(m==="--autoPull"&&r[o+1]){const d=r[++o].toLowerCase();i.autoPull=d==="true"||d==="1"||d==="yes",a=!0}else return null}return a?i:null}function J(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 a=n.match(/^rm\s+(\d+)$/i);if(a)return{type:"remove",index:parseInt(a[1],10)};if(/^remind\s+-1$/i.test(n))return{type:"remind",hour:null};const o=n.match(/^remind\s+(\d+)$/i);if(o){const u=parseInt(o[1],10);return u>=0&&u<=23?{type:"remind",hour:u}:null}let m=n,d,l,c;const p=m.match(/@(\S+)/);if(p){const u=p[1];m=m.replace(/@\S+/,"").trim(),d=u,l=u}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:l,deadline:c}:null}function X(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 a=r.match(/^add\s+(.+)$/i);if(a)return{type:"add",command:a[1].trim(),isGlobal:n};const o=r.match(/^del(?:ete)?\s+(\d+)$/i);return o?{type:"del",index:parseInt(o[1],10),isGlobal:n}:/^list$/i.test(r)?{type:"list",isGlobal:n}:n?null:{type:"show"}}function Z(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 ee(e){const t=e.trim();return/^\/recorder\s+on$/i.test(t)?"on":/^\/recorder\s+exit$/i.test(t)?"exit":null}function te(e){const t=e.trim();if(!/^\/timer(\b|$)/i.test(t))return null;const s=t.substring(6).trim();if(!s)return null;if(/^(list|ls)$/i.test(s))return{action:"list"};const n=s.match(/^(?:cancel|rm|del(?:ete)?)\s+(\S+)$/i);if(n)return{action:"cancel",id:n[1]};const r=/^(\d+[dhms](?:\s*\d+[dhms])*)\s+(.+)$/,i=s.match(r);if(!i)return null;const a=i[1].replace(/\s+/g,""),o=i[2].trim();if(!o)return null;const m=a.replace(/(\d+)d/g,"$1d").replace(/(\d+)h/g,"$1h").replace(/(\d+)m/g,"$1m").replace(/(\d+)s/g,"$1s"),d=/^(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/,l=m.match(d);if(!l)return null;const c=parseInt(l[1]||"0",10),p=parseInt(l[2]||"0",10),f=parseInt(l[3]||"0",10),u=parseInt(l[4]||"0",10);return c===0&&p===0&&f===0&&u===0?null:{action:"add",delayMs:((c*24+p)*60+f)*60*1e3+u*1e3,prompt:o,description:o}}function re(e){const t=e.trim();if(!/^\/model(\b|$)/i.test(t))return null;const s=t.substring(6).trim();if(!s||/^(list|ls)$/i.test(s))return{action:"list"};const n=s.match(/^(?:add)\s+(\S+)$/i);if(n)return{action:"add",model:n[1]};const r=s.match(/^(?:rm|del(?:ete)?)\s+(\S+)$/i);if(r)return{action:"remove",model:r[1]};const i=s.match(/^(\S+)$/);return i?{action:"set",model:i[1]}:null}
@@ -1,6 +1,6 @@
1
- "use strict";var $=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.fetchQuotedMessage=U,exports.queryDingUser=A,exports.queryUserIdByMobile=w,exports.queryUserIdByJobNumber=j,exports.filterToolUseContent=_,exports.splitMessage=M,exports.sendDingMessage=p,exports.sendClaudeResponseToDing=N,exports.sendMessageToUser=O,exports.sendOwnerMessage=P;const I=require("utils-ok"),u=$(require("urllib")),m=require("./secrets"),h="https://api.dingtalk.com",k="https://oapi.dingtalk.com";async function U(e,n){try{const o=await e.dingStreamClient.getAccessToken(),r=`${h}/v1.0/im/api/messages/${encodeURIComponent(n)}`,s=await u.default.request(r,{method:"GET",headers:{"x-acs-dingtalk-access-token":o},dataType:"json",timeout:5e3});if(s.status!==200||!s.data)return e.debugLog(`fetchQuotedMessage API \u8FD4\u56DE\u975E200: status=${s.status}, data=${JSON.stringify(s.data)}`),null;const t=s.data;if(t.text&&typeof t.text=="object"){const a=t.text.content;if(typeof a=="string"&&a)return a.trim()}if(typeof t.content=="string"&&t.content)try{const a=JSON.parse(t.content);if(typeof a=="string")return a.trim();if(a.text)return String(a.text).trim();if(a.content)return String(a.content).trim()}catch{return t.content.trim()}if(t.body&&typeof t.body=="object"){const a=t.body;if(typeof a.content=="string"&&a.content)return a.content.trim()}return e.debugLog(`fetchQuotedMessage \u65E0\u6CD5\u4ECE\u54CD\u5E94\u4E2D\u63D0\u53D6\u6587\u672C: keys=${Object.keys(t).join(",")}`),null}catch(o){return console.warn("fetchQuotedMessage \u8BF7\u6C42\u5931\u8D25:",o),null}}async function A(e,n){try{const o=await e.dingStreamClient.getAccessToken(),r=`${k}/topapi/v2/user/get?access_token=${o}`,s=await u.default.request(r,{method:"POST",data:{userid:n},contentType:"json",dataType:"json",timeout:5e3});if(s.status!==200||!s.data)return e.debugLog(`queryDingUser API \u8FD4\u56DE\u975E200: status=${s.status}, data=${JSON.stringify(s.data)}`),null;const t=s.data;return t.errcode!==0?(console.warn(`queryDingUser \u63A5\u53E3\u8FD4\u56DE\u9519\u8BEF: errcode=${t.errcode}, errmsg=${t.errmsg}`),null):t.result||null}catch(o){return console.warn("queryDingUser \u8BF7\u6C42\u5931\u8D25:",o),null}}async function w(e,n){try{const o=await e.dingStreamClient.getAccessToken(),r=`${k}/topapi/v2/user/getbymobile?access_token=${o}`,s=await u.default.request(r,{method:"POST",data:{mobile:n},contentType:"json",dataType:"json",timeout:5e3});if(s.status!==200||!s.data)return e.debugLog(`queryUserIdByMobile API \u8FD4\u56DE\u975E200: status=${s.status}, data=${JSON.stringify(s.data)}`),null;const t=s.data;return t.errcode!==0?(console.warn(`queryUserIdByMobile \u63A5\u53E3\u8FD4\u56DE\u9519\u8BEF: errcode=${t.errcode}, errmsg=${t.errmsg}`),null):t.result?.userid||null}catch(o){return console.warn("queryUserIdByMobile \u8BF7\u6C42\u5931\u8D25:",o),null}}async function j(e,n){try{const o=await e.dingStreamClient.getAccessToken(),r=`${k}/topapi/v2/user/getbyjobnumber?access_token=${o}`,s=await u.default.request(r,{method:"POST",data:{job_number:n},contentType:"json",dataType:"json",timeout:5e3});if(s.status!==200||!s.data)return e.debugLog(`queryUserIdByJobNumber API \u8FD4\u56DE\u975E200: status=${s.status}, data=${JSON.stringify(s.data)}`),null;const t=s.data;return t.errcode!==0?(console.warn(`queryUserIdByJobNumber \u63A5\u53E3\u8FD4\u56DE\u9519\u8BEF: errcode=${t.errcode}, errmsg=${t.errmsg}`),null):t.result?.userid||null}catch(o){return console.warn("queryUserIdByJobNumber \u8BF7\u6C42\u5931\u8D25:",o),null}}const S=["Write","Read","Edit","Bash","Grep","Glob","Agent","Skill","WebFetch","WebSearch","TaskOutput","AskUserQuestion","EnterPlanMode","ExitPlanMode","TaskCreate","TaskGet","TaskUpdate","TaskList","EnterWorktree","ExitWorktree","CronCreate","CronDelete","CronList","LSP","NotebookEdit"].join("|"),q=new RegExp(`<(${S})[^>]*\\/>`,"g"),E=new RegExp(`<(${S})[^>]*>[\\s\\S]*?<\\/\\1>`,"g"),C=/\n{3,}/g;function _(e){let n=e.replace(q,"");return n=n.replace(E,""),n=n.replace(C,`
1
+ "use strict";var b=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.cacheUserName=q,exports.getCachedUserName=S,exports.restoreMentions=N,exports.fetchQuotedMessage=E,exports.queryDingUser=x,exports.queryUserIdByMobile=$,exports.queryUserIdByJobNumber=P,exports.filterToolUseContent=O,exports.splitMessage=_,exports.sendDingMessage=T,exports.sendClaudeResponseToDing=B,exports.sendMessageToUser=C,exports.sendOwnerMessage=J,exports.isImageFile=R,exports.uploadMediaToDingTalk=F,exports.sendGroupImageMessage=Q,exports.sendGroupFileMessage=W;const U=require("utils-ok"),i=b(require("urllib")),j=b(require("fs")),A=b(require("path")),w=require("./secrets"),f="https://api.dingtalk.com",h="https://oapi.dingtalk.com",M=new Map;function q(e,t){e&&t&&M.set(e,t)}function S(e){return M.get(e)}function N(e,t){let o=e;for(const n of t){const s=n.staffId||n.dingtalkId;if(!s)continue;const r=n.displayName||S(s);r&&(o=o.replace(/\u200b/g,`${r}(${s})`))}return o}async function E(e,t){try{const o=await e.dingStreamClient.getAccessToken(),n=`${f}/v1.0/im/api/messages/${encodeURIComponent(t)}`,s=await i.default.request(n,{method:"GET",headers:{"x-acs-dingtalk-access-token":o},dataType:"json",timeout:5e3});if(s.status!==200||!s.data)return e.debugLog(`fetchQuotedMessage API \u8FD4\u56DE\u975E200: status=${s.status}, data=${JSON.stringify(s.data)}`),null;const r=s.data;if(r.text&&typeof r.text=="object"){const a=r.text.content;if(typeof a=="string"&&a)return a.trim()}if(typeof r.content=="string"&&r.content)try{const a=JSON.parse(r.content);if(typeof a=="string")return a.trim();if(a.text)return String(a.text).trim();if(a.content)return String(a.content).trim()}catch{return r.content.trim()}if(r.body&&typeof r.body=="object"){const a=r.body;if(typeof a.content=="string"&&a.content)return a.content.trim()}return e.debugLog(`fetchQuotedMessage \u65E0\u6CD5\u4ECE\u54CD\u5E94\u4E2D\u63D0\u53D6\u6587\u672C: keys=${Object.keys(r).join(",")}`),null}catch(o){return console.warn("fetchQuotedMessage \u8BF7\u6C42\u5931\u8D25:",o),null}}async function x(e,t){try{const o=await e.dingStreamClient.getAccessToken(),n=`${h}/topapi/v2/user/get?access_token=${o}`,s=await i.default.request(n,{method:"POST",data:{userid:t},contentType:"json",dataType:"json",timeout:5e3});if(s.status!==200||!s.data)return e.debugLog(`queryDingUser API \u8FD4\u56DE\u975E200: status=${s.status}, data=${JSON.stringify(s.data)}`),null;const r=s.data;return r.errcode!==0?(console.warn(`queryDingUser \u63A5\u53E3\u8FD4\u56DE\u9519\u8BEF: errcode=${r.errcode}, errmsg=${r.errmsg}`),null):r.result||null}catch(o){return console.warn("queryDingUser \u8BF7\u6C42\u5931\u8D25:",o),null}}async function $(e,t){try{const o=await e.dingStreamClient.getAccessToken(),n=`${h}/topapi/v2/user/getbymobile?access_token=${o}`,s=await i.default.request(n,{method:"POST",data:{mobile:t},contentType:"json",dataType:"json",timeout:5e3});if(s.status!==200||!s.data)return e.debugLog(`queryUserIdByMobile API \u8FD4\u56DE\u975E200: status=${s.status}, data=${JSON.stringify(s.data)}`),null;const r=s.data;return r.errcode!==0?(console.warn(`queryUserIdByMobile \u63A5\u53E3\u8FD4\u56DE\u9519\u8BEF: errcode=${r.errcode}, errmsg=${r.errmsg}`),null):r.result?.userid||null}catch(o){return console.warn("queryUserIdByMobile \u8BF7\u6C42\u5931\u8D25:",o),null}}async function P(e,t){try{const o=await e.dingStreamClient.getAccessToken(),n=`${h}/topapi/v2/user/getbyjobnumber?access_token=${o}`,s=await i.default.request(n,{method:"POST",data:{job_number:t},contentType:"json",dataType:"json",timeout:5e3});if(s.status!==200||!s.data)return e.debugLog(`queryUserIdByJobNumber API \u8FD4\u56DE\u975E200: status=${s.status}, data=${JSON.stringify(s.data)}`),null;const r=s.data;return r.errcode!==0?(console.warn(`queryUserIdByJobNumber \u63A5\u53E3\u8FD4\u56DE\u9519\u8BEF: errcode=${r.errcode}, errmsg=${r.errmsg}`),null):r.result?.userid||null}catch(o){return console.warn("queryUserIdByJobNumber \u8BF7\u6C42\u5931\u8D25:",o),null}}const I=["Write","Read","Edit","Bash","Grep","Glob","Agent","Skill","WebFetch","WebSearch","TaskOutput","AskUserQuestion","EnterPlanMode","ExitPlanMode","TaskCreate","TaskGet","TaskUpdate","TaskList","EnterWorktree","ExitWorktree","CronCreate","CronDelete","CronList","LSP","NotebookEdit"].join("|"),D=new RegExp(`<(${I})[^>]*\\/>`,"g"),v=new RegExp(`<(${I})[^>]*>[\\s\\S]*?<\\/\\1>`,"g"),G=/\n{3,}/g;function O(e){let t=e.replace(D,"");return t=t.replace(v,""),t=t.replace(G,`
2
2
 
3
- `),n.trim()}function M(e,n){const o=[];for(;e.length>n;){let r=e.lastIndexOf(`
4
- `,n);(r===-1||r<n*.5)&&(r=e.lastIndexOf("\u3002",n)),(r===-1||r<n*.5)&&(r=e.lastIndexOf(" ",n)),r===-1||r<n*.5?r=n:r+=1,o.push(e.substring(0,r).trim()),e=e.substring(r).trim()}return e.length>0&&o.push(e),o}async function p(e,n){const{conversationId:o,sessionWebhook:r,atUserId:s,content:t,msgType:a="text"}=n,c=e.config.conversations.find(d=>d.conversationId===o);let i=s;(c?.atSender===!1||c?.conversationType==="1")&&(i=void 0);const g=i?[i]:[],b=(0,m.resolveSecret)(c?.dingToken);let y=t;i&&a==="markdown"&&(y=`${t}
5
- @${i}`);const f=a==="markdown"?{msgtype:"markdown",markdown:{title:y,text:y},at:{atUserIds:g,isAtAll:!1}}:{msgtype:"text",text:{content:t},at:{atUserIds:g,isAtAll:!1}};if(b){const d=await e.dingStreamClient.getAccessToken(),l=`https://oapi.dingtalk.com/robot/send?access_token=${b}`;try{await u.default.request(l,{method:"POST",data:f,contentType:"json",headers:{"x-acs-dingtalk-access-token":d},dataType:"json"})}catch(T){console.error("\u901A\u8FC7 dingToken \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",T)}}else if(r){const d=await e.dingStreamClient.getAccessToken();try{await u.default.request(r,{method:"POST",data:f,contentType:"json",headers:{"x-acs-dingtalk-access-token":d},dataType:"json"})}catch(l){console.error("\u901A\u8FC7 sessionWebhook \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",l)}}else if(e.config.defaultDingToken){const d=await e.dingStreamClient.getAccessToken(),l=`https://oapi.dingtalk.com/robot/send?access_token=${(0,m.resolveSecret)(e.config.defaultDingToken)}`;try{await u.default.request(l,{method:"POST",data:f,contentType:"json",headers:{"x-acs-dingtalk-access-token":d},dataType:"json"})}catch(T){console.error("\u901A\u8FC7 defaultDingToken \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",T)}}else console.error("\u672A\u80FD\u83B7\u53D6\u673A\u5668\u4EBA\u4FE1\u606F\u53D1\u9001\u9014\u5F84")}async function N(e,n,o,r,s){const a=_(s);if(!a){e.debugLog("\u8FC7\u6EE4\u540E\u5185\u5BB9\u4E3A\u7A7A\uFF0C\u8DF3\u8FC7\u53D1\u9001");return}if(a.length<=18e3)await p(e,{conversationId:n,sessionWebhook:o,atUserId:r,content:a,msgType:"markdown"});else{const c=M(a,18e3);for(let i=0;i<c.length;i++){const g=c.length>1?`**[${i+1}/${c.length}]**
6
- `:"";await p(e,{conversationId:n,sessionWebhook:o,atUserId:i===c.length-1?r:"",content:g+c[i],msgType:"markdown"}),i<c.length-1&&await I.asyncUtil.sleep(500)}}}async function O(e,n,o,r="text"){if(!e.config.enableMsgToUser)return console.log(`[sendMessageToUser] enableMsgToUser \u672A\u5F00\u542F\uFF0C\u8DF3\u8FC7\u53D1\u9001 (userId=${n})`),!1;try{const s=await e.dingStreamClient.getAccessToken(),t=r==="markdown"?"sampleMarkdown":"sampleText",a=JSON.stringify(r==="markdown"?{title:"notification",text:o}:{content:o}),c=await u.default.request(`${h}/v1.0/robot/oToMessages/batchSend`,{method:"POST",data:{robotCode:e.clientId,userIds:[n],msgKey:t,msgParam:a},contentType:"json",headers:{"x-acs-dingtalk-access-token":s},dataType:"json"});return c.status===200?!0:(console.error(`sendMessageToUser API \u8FD4\u56DE\u975E200: status=${c.status}, userId=${n}`),!1)}catch(s){return console.error(`sendMessageToUser \u5931\u8D25 (userId=${n}):`,s),!1}}async function P(e,n,o="text"){const{ownerConversationId:r,owner:s}=e.config;if(!r||!s)return!1;const t=await w(e,s);return t?O(e,t,n,o):(console.error(`sendOwnerMessage: \u65E0\u6CD5\u5C06\u624B\u673A\u53F7 ${s} \u89E3\u6790\u4E3A Ding userId`),!1)}
3
+ `),t.trim()}function _(e,t){const o=[];for(;e.length>t;){let n=e.lastIndexOf(`
4
+ `,t);(n===-1||n<t*.5)&&(n=e.lastIndexOf("\u3002",t)),(n===-1||n<t*.5)&&(n=e.lastIndexOf(" ",t)),n===-1||n<t*.5?n=t:n+=1,o.push(e.substring(0,n).trim()),e=e.substring(n).trim()}return e.length>0&&o.push(e),o}async function T(e,t){const{conversationId:o,sessionWebhook:n,atUserId:s,content:r,msgType:a="text"}=t,d=e.config.conversations.find(l=>l.conversationId===o);let c=s;(d?.atSender===!1||d?.conversationType==="1")&&(c=void 0);const u=c?[c]:[],y=(0,w.resolveSecret)(d?.dingToken);let m=r;c&&a==="markdown"&&(m=`${r}
5
+ @${c}`);const p=a==="markdown"?{msgtype:"markdown",markdown:{title:m,text:m},at:{atUserIds:u,isAtAll:!1}}:{msgtype:"text",text:{content:r},at:{atUserIds:u,isAtAll:!1}};if(y){const l=await e.dingStreamClient.getAccessToken(),g=`https://oapi.dingtalk.com/robot/send?access_token=${y}`;try{await i.default.request(g,{method:"POST",data:p,contentType:"json",headers:{"x-acs-dingtalk-access-token":l},dataType:"json"})}catch(k){console.error("\u901A\u8FC7 dingToken \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",k)}}else if(n){const l=await e.dingStreamClient.getAccessToken();try{await i.default.request(n,{method:"POST",data:p,contentType:"json",headers:{"x-acs-dingtalk-access-token":l},dataType:"json"})}catch(g){console.error("\u901A\u8FC7 sessionWebhook \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",g)}}else if(e.config.defaultDingToken){const l=await e.dingStreamClient.getAccessToken(),g=`https://oapi.dingtalk.com/robot/send?access_token=${(0,w.resolveSecret)(e.config.defaultDingToken)}`;try{await i.default.request(g,{method:"POST",data:p,contentType:"json",headers:{"x-acs-dingtalk-access-token":l},dataType:"json"})}catch(k){console.error("\u901A\u8FC7 defaultDingToken \u53D1\u9001\u9489\u9489\u6D88\u606F\u5931\u8D25:",k)}}else console.error("\u672A\u80FD\u83B7\u53D6\u673A\u5668\u4EBA\u4FE1\u606F\u53D1\u9001\u9014\u5F84")}async function B(e,t,o,n,s){const a=O(s);if(!a){e.debugLog("\u8FC7\u6EE4\u540E\u5185\u5BB9\u4E3A\u7A7A\uFF0C\u8DF3\u8FC7\u53D1\u9001");return}if(a.length<=18e3)await T(e,{conversationId:t,sessionWebhook:o,atUserId:n,content:a,msgType:"markdown"});else{const c=_(a,18e3);for(let u=0;u<c.length;u++){const y=c.length>1?`**[${u+1}/${c.length}]**
6
+ `:"";await T(e,{conversationId:t,sessionWebhook:o,atUserId:u===c.length-1?n:"",content:y+c[u],msgType:"markdown"}),u<c.length-1&&await U.asyncUtil.sleep(500)}}e.config.conversations.find(c=>c.conversationId===t)?.ensureAt&&n&&await T(e,{conversationId:t,sessionWebhook:o,atUserId:n,content:"",msgType:"text"})}async function C(e,t,o,n="text"){if(!e.config.enableMsgToUser)return console.log(`[sendMessageToUser] enableMsgToUser \u672A\u5F00\u542F\uFF0C\u8DF3\u8FC7\u53D1\u9001 (userId=${t})`),!1;try{const s=await e.dingStreamClient.getAccessToken(),r=n==="markdown"?"sampleMarkdown":"sampleText",a=JSON.stringify(n==="markdown"?{title:"notification",text:o}:{content:o}),d=await i.default.request(`${f}/v1.0/robot/oToMessages/batchSend`,{method:"POST",data:{robotCode:e.clientId,userIds:[t],msgKey:r,msgParam:a},contentType:"json",headers:{"x-acs-dingtalk-access-token":s},dataType:"json"});return d.status===200?!0:(console.error(`sendMessageToUser API \u8FD4\u56DE\u975E200: status=${d.status}, userId=${t}`),!1)}catch(s){return console.error(`sendMessageToUser \u5931\u8D25 (userId=${t}):`,s),!1}}async function J(e,t,o="text"){const{ownerConversationId:n,owner:s}=e.config;if(!n||!s)return!1;const r=await $(e,s);return r?C(e,r,t,o):(console.error(`sendOwnerMessage: \u65E0\u6CD5\u5C06\u624B\u673A\u53F7 ${s} \u89E3\u6790\u4E3A Ding userId`),!1)}const L=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg"]);function R(e){const t=A.default.extname(e).toLowerCase();return L.has(t)}async function F(e,t){try{const o=await e.dingStreamClient.getAccessToken(),n=`${f}/v1.0/robot/messageFiles/upload`,s=await i.default.request(n,{method:"POST",headers:{"x-acs-dingtalk-access-token":o},data:{file:j.default.createReadStream(t)},contentType:"multipart/form-data",dataType:"json",timeout:3e4});if(s.status!==200||!s.data)return console.error(`uploadMediaToDingTalk \u8FD4\u56DE\u975E200: status=${s.status}`),null;const r=s.data;return r.downloadCode||r.mediaId||null}catch(o){return console.error(`uploadMediaToDingTalk \u5931\u8D25: ${t}`,o),null}}async function Q(e,t,o){try{const n=await e.dingStreamClient.getAccessToken(),s=`${f}/v1.0/im/groupMessages/send`;return(await i.default.request(s,{method:"POST",data:{robotCode:e.clientId,openConversationId:t,msgKey:"sampleImageMsg",msgParam:JSON.stringify({mediaId:o})},contentType:"json",headers:{"x-acs-dingtalk-access-token":n},dataType:"json",timeout:1e4})).status===200}catch(n){return console.error(`sendGroupImageMessage \u5931\u8D25: ${t}`,n),!1}}async function W(e,t,o,n){try{const s=await e.dingStreamClient.getAccessToken(),r=`${f}/v1.0/im/groupMessages/send`;return(await i.default.request(r,{method:"POST",data:{robotCode:e.clientId,openConversationId:t,msgKey:"sampleFileMsg",msgParam:JSON.stringify({mediaId:o,fileName:n})},contentType:"json",headers:{"x-acs-dingtalk-access-token":s},dataType:"json",timeout:1e4})).status===200}catch(s){return console.error(`sendGroupFileMessage \u5931\u8D25: ${t}`,s),!1}}
@@ -0,0 +1 @@
1
+ "use strict";var a=exports&&exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.loadModelOptions=c,exports.addModelOptions=m,exports.removeModelOptions=M,exports.initModelOptions=v,exports.resolveCurrentModel=g,exports.setGlobalModel=C,exports.setConversationModel=h;const s=a(require("fs")),u=a(require("path")),i=["claude-sonnet-4-20250514","claude-opus-4-20250514","claude-haiku-4-20251001"];function f(e){const n=e.getClientDir();return u.default.join(n,"model.json")}function d(e){const n=f(e);try{if(s.default.existsSync(n)){const t=s.default.readFileSync(n,"utf-8"),o=JSON.parse(t);return{models:Array.isArray(o.models)?o.models:[...i],defaultModel:o.defaultModel}}}catch(t){console.warn("[model] \u52A0\u8F7D model.json \u5931\u8D25:",t)}return{models:[...i],defaultModel:void 0}}function r(e,n){const t=f(e);try{const o=u.default.dirname(t);s.default.existsSync(o)||s.default.mkdirSync(o,{recursive:!0}),s.default.writeFileSync(t,JSON.stringify(n,null,2),"utf-8")}catch(o){console.warn("[model] \u4FDD\u5B58 model.json \u5931\u8D25:",o)}}function c(e){return d(e).models}function m(e,n){const t=d(e),o=new Set(t.models);for(const l of n)o.add(l);return t.models=Array.from(o),r(e,t),t.models}function M(e,n){const t=d(e),o=new Set(n.map(l=>l.trim()));return t.models=t.models.filter(l=>!o.has(l)),t.defaultModel&&o.has(t.defaultModel)&&(t.defaultModel=void 0),r(e,t),t.models}function v(e){const n=d(e),t=new Set(n.models);let o=!1;for(const l of i)t.has(l)||(n.models.push(l),o=!0);return o&&r(e,n),n.models}function g(e,n){const t=e.getConversationConfig(n);if(t?.model)return t.model;if(e.config.model)return e.config.model;const o=d(e);if(o.defaultModel)return o.defaultModel}function C(e,n){const t=d(e);t.defaultModel=n,r(e,t),e.config.model=n;const{saveClientConfig:o}=require("./api-key-manager");o(e)}function h(e,n,t){const o=e.getConversationConfig(n);if(o){o.model=t;const{saveClientConfig:l}=require("./api-key-manager");l(e)}}
@@ -0,0 +1,11 @@
1
+ "use strict";var g=exports&&exports.__importDefault||function(l){return l&&l.__esModule?l:{default:l}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.SendQueueProcessor=void 0,exports.writeSendSignal=y;const r=g(require("fs")),m=g(require("path")),w=g(require("os")),d=require("./session"),u=require("./messaging");function y(l,s){const t=w.default.homedir(),n=m.default.join(t,".cc-ding",l,".send-queue");r.default.mkdirSync(n,{recursive:!0});const e=`${Date.now()}_${Math.random().toString(36).substring(2,8)}.json`;r.default.writeFileSync(m.default.join(n,e),JSON.stringify(s),"utf-8")}class S{constructor(s){this.timer=null,this.dc=s,this.queueDir=m.default.join(s.getClientDir(),".send-queue"),r.default.existsSync(this.queueDir)||r.default.mkdirSync(this.queueDir,{recursive:!0})}start(){this.timer=setInterval(()=>{this.processQueue().catch(s=>{console.error(`[${(0,d.timestamp)()}] SendQueueProcessor \u5904\u7406\u5F02\u5E38:`,s)})},1e3),this.timer.unref?.(),this.processQueue().catch(s=>{console.error(`[${(0,d.timestamp)()}] SendQueueProcessor \u542F\u52A8\u5904\u7406\u5F02\u5E38:`,s)})}destroy(){this.timer&&(clearInterval(this.timer),this.timer=null)}async processQueue(){if(!r.default.existsSync(this.queueDir))return;const s=r.default.readdirSync(this.queueDir).filter(t=>t.endsWith(".json"));if(s.length!==0){s.sort();for(const t of s){const n=m.default.join(this.queueDir,t);let e;try{const a=r.default.readFileSync(n,"utf-8");e=JSON.parse(a)}catch(a){console.warn(`[${(0,d.timestamp)()}] \u4FE1\u53F7\u6587\u4EF6\u89E3\u6790\u5931\u8D25\uFF0C\u8DF3\u8FC7: ${n}`,a),r.default.unlinkSync(n);continue}const o=this.dc.config.conversations.find(a=>a.conversationId===e.conversationId);if(!o){console.warn(`[${(0,d.timestamp)()}] \u4F1A\u8BDD ${e.conversationId} \u672A\u6CE8\u518C\uFF0C\u8DF3\u8FC7\u4FE1\u53F7: ${t}`),r.default.unlinkSync(n);continue}const i=await this.handleSignal(e,o);try{r.default.unlinkSync(n)}catch{}i||console.warn(`[${(0,d.timestamp)()}] \u4FE1\u53F7\u5904\u7406\u5931\u8D25: ${t}`)}}}async handleSignal(s,t){const{conversationId:n,caption:e}=s,o=t.dingToken||"",i=t.conversationType==="1";return s.type==="image"?await this.handleImage(s,n,o,e,i):await this.handleFile(s,n,o,e,i)}async handleImage(s,t,n,e,o){const i=s.path;if(!r.default.existsSync(i))return console.warn(`[${(0,d.timestamp)()}] \u56FE\u7247\u6587\u4EF6\u4E0D\u5B58\u5728: ${i}`),!1;const a=await(0,u.uploadMediaToDingTalk)(this.dc,i);if(!a)return console.warn(`[${(0,d.timestamp)()}] \u56FE\u7247\u4E0A\u4F20\u5931\u8D25: ${i}`),await(0,u.sendDingMessage)(this.dc,{conversationId:t,sessionWebhook:n,content:`\u{1F4CE} \u56FE\u7247\u4E0A\u4F20\u5931\u8D25\uFF0C\u6587\u4EF6\u8DEF\u5F84: \`${i}\`${e?`
2
+ \u8BF4\u660E: ${e}`:""}`,msgType:"markdown"}),!1;if(o){const f=e?`![${e}](${a})
3
+ ${e}`:`![](${a})`;await(0,u.sendDingMessage)(this.dc,{conversationId:t,sessionWebhook:n,content:f,msgType:"markdown"})}else if(await(0,u.sendGroupImageMessage)(this.dc,t,a))e&&await(0,u.sendDingMessage)(this.dc,{conversationId:t,sessionWebhook:n,content:e,msgType:"markdown"});else{console.warn(`[${(0,d.timestamp)()}] sendGroupImageMessage \u5931\u8D25\uFF0C\u964D\u7EA7\u5230 markdown`);const c=e?`![${e}](${a})
4
+ ${e}`:`![](${a})`;await(0,u.sendDingMessage)(this.dc,{conversationId:t,sessionWebhook:n,content:c,msgType:"markdown"})}return!0}async handleFile(s,t,n,e,o){const i=s.path;if(!r.default.existsSync(i))return console.warn(`[${(0,d.timestamp)()}] \u6587\u4EF6\u4E0D\u5B58\u5728: ${i}`),!1;if((0,u.isImageFile)(i))return await this.handleImage(s,t,n,e,o);const a=await(0,u.uploadMediaToDingTalk)(this.dc,i),f=m.default.basename(i),c=r.default.statSync(i).size;if(!a){console.warn(`[${(0,d.timestamp)()}] \u6587\u4EF6\u4E0A\u4F20\u5931\u8D25: ${i}`);const $=c>1024*1024?`${(c/(1024*1024)).toFixed(1)}MB`:`${(c/1024).toFixed(1)}KB`;return await(0,u.sendDingMessage)(this.dc,{conversationId:t,sessionWebhook:n,content:`\u{1F4CE} \u6587\u4EF6\u4E0A\u4F20\u5931\u8D25
5
+ \u6587\u4EF6\u540D: ${f}
6
+ \u5927\u5C0F: ${$}
7
+ \u8DEF\u5F84: \`${i}\`${e?`
8
+ \u8BF4\u660E: ${e}`:""}`,msgType:"markdown"}),!1}if(o){const $=c>1048576?`${(c/1048576).toFixed(1)}MB`:`${(c/1024).toFixed(1)}KB`,h=`\u{1F4CE} **${f}** (${$})${e?`
9
+ ${e}`:""}
10
+ \`${i}\``;await(0,u.sendDingMessage)(this.dc,{conversationId:t,sessionWebhook:n,content:h,msgType:"markdown"})}else if(await(0,u.sendGroupFileMessage)(this.dc,t,a,f))e&&await(0,u.sendDingMessage)(this.dc,{conversationId:t,sessionWebhook:n,content:e,msgType:"markdown"});else{console.warn(`[${(0,d.timestamp)()}] sendGroupFileMessage \u5931\u8D25\uFF0C\u964D\u7EA7\u5230 markdown`);const h=c>1024*1024?`${(c/(1024*1024)).toFixed(1)}MB`:`${(c/1024).toFixed(1)}KB`;await(0,u.sendDingMessage)(this.dc,{conversationId:t,sessionWebhook:n,content:`\u{1F4CE} **${f}** (${h})${e?`
11
+ ${e}`:""}`,msgType:"markdown"})}return!0}}exports.SendQueueProcessor=S;