@xmanrui/dsh-im 4.20.1 → 4.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -582,7 +582,7 @@ var React31 = __toESM(require("react"), 1);
582
582
  // package.json
583
583
  var package_default = {
584
584
  name: "@xmanrui/dsh-im",
585
- version: "4.20.1",
585
+ version: "4.20.2",
586
586
  description: "\u628A\u5341\u4E00\u79CD IM \u6E20\u9053\u548C\u516C\u7F51 AI Office \u63A5\u5165\u672C\u673A DeepSeek Harness\u3002 Connect eleven IM channels and a public AI Office to a local DeepSeek Harness.",
587
587
  keywords: [
588
588
  "deepseek-harness",
package/lib/index.js CHANGED
@@ -180,7 +180,7 @@ ${o}`:o}function Eo(n){return n instanceof uo?n.userMessage:null}import{createHa
180
180
  ${EQe(I.text,s)}`);c=oI([i,...g,t.join(`
181
181
  `)].join(`
182
182
 
183
- `)),s=Math.floor(s/2)}while(s>0&&(c.message.length>3e3||c.messages.length>3));return c}function BQe(n){let A=n?.code??n?.failure?.code;return A==="session-not-found"?S("\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u7684\u4F1A\u8BDD\u5DF2\u4E0D\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u7ED1\u5B9A\u4F1A\u8BDD\u3002"):A===Si||A==="workspace-bot-not-found"||A==="session-binding-changed"?S("\u4F1A\u8BDD\u3001\u5DE5\u4F5C\u533A\u6216\u673A\u5668\u4EBA\u72B6\u6001\u5DF2\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C /history\u3002"):A==="harness-api-not-found"?S("\u5F53\u524D Harness \u6682\u4E0D\u652F\u6301\u8BFB\u53D6\u4F1A\u8BDD\u5386\u53F2\u3002"):n?.name==="AbortError"?S("\u5386\u53F2\u8BFB\u53D6\u5DF2\u53D6\u6D88\u3002"):n?.name==="TimeoutError"||A==="harness-timeout"?S("\u8BFB\u53D6\u5386\u53F2\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"):S("\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u4F1A\u8BDD\u5386\u53F2\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")}function wi(n){return typeof n=="string"&&iq.test(n.trim())}async function Pa(n,A,o,a,{signal:e,isDirect:i=!1,hasImages:t=!1,hasFiles:r=!1}={}){if(!wi(n))return null;let s=iq.exec(n.trim())[1].trim();if(s&&(!/^\d+$/u.test(s)||/^0+$/u.test(s)))return oI(S(lQe));let c=s?Math.min(Number(s),dQe):3;if(!i)return oI(S("\u8BF7\u5728\u4E0E\u673A\u5668\u4EBA\u7684\u79C1\u804A\u4E2D\u4F7F\u7528 /history\u3002"));if(t||r)return oI(S("/history \u4EC5\u652F\u6301\u6587\u5B57\u547D\u4EE4\uFF0C\u8BF7\u79FB\u9664\u56FE\u7247\u6216\u6587\u4EF6\u540E\u91CD\u8BD5\u3002"));let g=o?.sessionFor?.(a);if(typeof g!="string"||!g)return oI(S("\u5F53\u524D\u804A\u5929\u5C1A\u672A\u7ED1\u5B9A\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u53D1\u9001\u6D88\u606F\u6216\u4F7F\u7528 /session \u7ED1\u5B9A\u4F1A\u8BDD\u3002"));try{let I=A?.workspaceSession?.(g,a);if(typeof I?.readHistory!="function")return oI(S("\u5F53\u524D Harness \u6682\u4E0D\u652F\u6301\u8BFB\u53D6\u4F1A\u8BDD\u5386\u53F2\u3002"));let d=AbortSignal.timeout(rq),B=e?AbortSignal.any([e,d]):d,f=Date.now()+rq,Q=new Map,y,m,b=[],T=!1;for(let N=0;N<hQe;N+=1){if(B.throwIfAborted(),Date.now()>=f)throw new DOMException("History read timed out","TimeoutError");let P=await I.readHistory({maxMessages:pQe,...y===void 0?{}:{beforeSeq:y},timeoutMs:Math.max(1,f-Date.now()),signal:B});if(B.throwIfAborted(),Date.now()>=f)throw new DOMException("History read timed out","TimeoutError");if(o.sessionFor(a)!==g){let K=new Error("Session binding changed during history read");throw K.code="session-binding-changed",K}if(!P||!Array.isArray(P.events)||typeof P.hasMore!="boolean")throw new TypeError("Invalid history page");let x=y??1/0;for(let K of P.events){let Y=K?.event;if(!Y||!Number.isSafeInteger(Y.seq)||Y.seq<0||typeof Y.type!="string"||!Y.type)throw new TypeError("Invalid history event");if(m!==void 0&&Y.seq>m)continue;let G=Q.get(Y.seq);if(G){if(!IQe(G,Y))throw new TypeError("Conflicting history events")}else{if(y!==void 0&&Y.seq>=y)throw new TypeError("Invalid history cursor");Q.set(Y.seq,Y)}x=Math.min(x,Y.seq)}let k=[...Q.values()].sort((K,Y)=>K.seq-Y.seq);if(m??=k.at(-1)?.seq,T=P.hasMore,T&&(!Number.isFinite(x)||x===y))throw new TypeError("History cursor did not advance");if(b=uQe(k).slice(-c),b.length>=c||!T)break;y=x}return b.length===0?oI(T?S("\u672C\u6B21\u6709\u9650\u8BFB\u53D6\u4E2D\u672A\u627E\u5230\u53EF\u9884\u89C8\u7684\u5386\u53F2\u6D88\u606F\u3002"):S("\u5F53\u524D\u4F1A\u8BDD\u6682\u65E0\u53EF\u9884\u89C8\u7684\u5386\u53F2\u6D88\u606F\u3002")):CQe(g,b,c,T)}catch(I){return oI(BQe(I))}}var Ll={name:"@xmanrui/dsh-im",version:"4.20.1",description:"\u628A\u5341\u4E00\u79CD IM \u6E20\u9053\u548C\u516C\u7F51 AI Office \u63A5\u5165\u672C\u673A DeepSeek Harness\u3002 Connect eleven IM channels and a public AI Office to a local DeepSeek Harness.",keywords:["deepseek-harness","dsh","dsh-plugin","ai-agent","im","instant-messaging","chatbot","feishu","lark","wechat","wecom","dingtalk","qq","slack","telegram","discord","whatsapp","imessage","ai-office"],author:"xmanrui (https://github.com/xmanrui)",contributors:[{name:"C3H3-AI",url:"https://github.com/C3H3-AI"},{name:"divingleee",url:"https://github.com/divingleee"},{name:"Chan-0312",url:"https://github.com/Chan-0312"},{name:"BuvkB",url:"https://github.com/BuvkB"},{name:"masucc",url:"https://github.com/masucc"},{name:"cherryFloris",url:"https://github.com/cherryFloris"},{name:"geekyfoxlab",url:"https://github.com/geekyfoxlab"},{name:"grloper",url:"https://github.com/grloper"},{name:"baijian",url:"https://github.com/baijian"},{name:"lyzhu86",url:"https://github.com/lyzhu86"}],license:"MIT",type:"module",repository:{type:"git",url:"git+https://github.com/xmanrui/dsh-im.git"},homepage:"https://github.com/xmanrui/dsh-im#readme",bugs:{url:"https://github.com/xmanrui/dsh-im/issues"},publishConfig:{access:"public"},bin:{"dsh-im":"bin/dsh-im.mjs"},main:"./lib/index.js",exports:{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},files:["assets","bin","cordis.patch.yml","lib","plugin-src","scripts","src","PROACTIVE_DELIVERY.md","PROACTIVE_DELIVERY.en.md","LICENSE","README.md","README.en.md","THIRD_PARTY_NOTICES.md"],dsh:{bundle:{patch:"./cordis.patch.yml"},client:{inject:["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-slots","@deepseek-ai/dsh-client-locale"],platform:"web"},compatibility:{dsh:"0.1.2-alpha.4 || 0.1.2-alpha.5 || 0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.5-alpha.1",dshReleases:{"0.1.2-alpha.4":"compatible","0.1.2-alpha.5":"compatible","0.1.2-rc.1":"compatible","0.1.3-alpha.1":"compatible","0.1.5-alpha.1":"compatible"},profiles:["web"]}},scripts:{build:"node plugin-src/client/build.mjs && node plugin-src/host/build.mjs",test:"node --test test/*.test.mjs test/channels/*/*.test.mjs",check:"npm run build && npm test && node scripts/verify-package.mjs"},engines:{node:">=22.19"},dependencies:{"@tencent-connect/qqbot-connector":"1.2.0","@tencent-connect/qqbot-nodejs":"1.0.4","@wecom/aibot-node-sdk":"1.0.7","dingtalk-stream":"2.1.4",qrcode:"1.5.4",undici:"7.29.0"},devDependencies:{"@deepseek-ai/cordis":"4.0.1","@larksuiteoapi/node-sdk":"1.73.0","@whiskeysockets/baileys":"7.0.0-rc14",esbuild:"0.25.9","https-proxy-agent":"5.0.1",react:"18.3.1","react-dom":"18.3.1","react-test-renderer":"18.3.1",semver:"7.8.5"},directories:{doc:"docs",lib:"lib",test:"test"}};var QQe=/^\/(?:stop|steer|version)(?=$|\s)/iu,yQe=/^\/stop(?=$|\s)/iu,mQe=/^\/version(?=$|\s)/iu,SQe="\u7528\u6CD5\uFF1A/stop\uFF08\u4E0D\u5E26\u53C2\u6570\uFF09",wQe="\u7528\u6CD5\uFF1A/version\uFF08\u4E0D\u5E26\u53C2\u6570\uFF09",DQe="\u7528\u6CD5\uFF1A/steer <\u8865\u5145\u6307\u4EE4>",bQe="\u63A7\u5236\u547D\u4EE4\u4EC5\u652F\u6301\u7EAF\u6587\u5B57\uFF0C\u8BF7\u79FB\u9664\u56FE\u7247\u540E\u91CD\u8BD5\u3002";function Qo(n,A={}){return{message:n,...A}}function oq(n){return n?{signal:n}:{}}function nq(n,A,o){if(typeof A?.sessionFor!="function")return null;let a=A.sessionFor(o);if(typeof a!="string"||!a)return null;if(typeof n?.workspaceSession!="function")throw new TypeError("Harness does not support workspace sessions");let e=n.workspaceSession(a,o);if(!e||typeof e!="object")throw new TypeError("Harness returned an invalid workspace session");return e}function oi(n){return typeof n=="string"&&QQe.test(n.trim())}async function Di(n,A,o,a,{signal:e,hasImages:i=!1,pendingInteraction:t=!1,control:r,deferredDelivery:s}={}){if(!oi(n))return null;let c=n.trim(),g=yQe.test(c),I=mQe.test(c);if(i)return Qo(S(bQe));if(I)return/^\/version$/iu.test(c)?Qo(`dsh-im v${Ll.version}`):Qo(S(wQe));if(g){if(!/^\/stop$/iu.test(c))return Qo(S(SQe));let y=nq(A,o,a);if(!y)return Qo(S("\u5F53\u524D\u804A\u5929\u6CA1\u6709\u6B63\u5728\u8FD0\u884C\u7684\u4EFB\u52A1\u3002"));if(typeof y.stopActiveTurn!="function")throw new TypeError("Harness session does not support stopping active turns");let m=await y.stopActiveTurn(r,oq(e));if(!m&&s){let b=await s.stop(a);if(b==="stopped")return Qo(S("\u5DF2\u8BF7\u6C42\u505C\u6B62\u540E\u53F0\u4EFB\u52A1\u3002"),{stopped:!0});if(b==="unavailable")return Qo(S("\u65E0\u6CD5\u5B89\u5168\u505C\u6B62\u540E\u53F0\u4EFB\u52A1\uFF0C\u8BF7\u5728 Harness \u4E2D\u67E5\u770B\u5E76\u505C\u6B62\u5BF9\u5E94\u4EFB\u52A1\u3002"))}return m?Qo(S("\u5DF2\u8BF7\u6C42\u505C\u6B62\u5F53\u524D\u4EFB\u52A1\u3002"),{stopped:!0}):Qo(S("\u5F53\u524D\u804A\u5929\u6CA1\u6709\u6B63\u5728\u8FD0\u884C\u7684\u4EFB\u52A1\u3002"))}let B=/^\/steer(?:\s+([\s\S]*))?$/iu.exec(c)?.[1]?.trim()??"";if(!B)return Qo(S(DQe));if(t)return Qo([S("\u5F53\u524D\u4EFB\u52A1\u6B63\u5728\u7B49\u5F85\u4F60\u7684\u56DE\u7B54\u6216\u5BA1\u6279\u3002"),"",S("\u8BF7\u5148\u5904\u7406\u5F53\u524D\u8BF7\u6C42\uFF0C\u6216\u8005\u53D1\u9001 /stop \u505C\u6B62\u4EFB\u52A1\u3002")].join(`
183
+ `)),s=Math.floor(s/2)}while(s>0&&(c.message.length>3e3||c.messages.length>3));return c}function BQe(n){let A=n?.code??n?.failure?.code;return A==="session-not-found"?S("\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u7684\u4F1A\u8BDD\u5DF2\u4E0D\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u7ED1\u5B9A\u4F1A\u8BDD\u3002"):A===Si||A==="workspace-bot-not-found"||A==="session-binding-changed"?S("\u4F1A\u8BDD\u3001\u5DE5\u4F5C\u533A\u6216\u673A\u5668\u4EBA\u72B6\u6001\u5DF2\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C /history\u3002"):A==="harness-api-not-found"?S("\u5F53\u524D Harness \u6682\u4E0D\u652F\u6301\u8BFB\u53D6\u4F1A\u8BDD\u5386\u53F2\u3002"):n?.name==="AbortError"?S("\u5386\u53F2\u8BFB\u53D6\u5DF2\u53D6\u6D88\u3002"):n?.name==="TimeoutError"||A==="harness-timeout"?S("\u8BFB\u53D6\u5386\u53F2\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"):S("\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u4F1A\u8BDD\u5386\u53F2\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")}function wi(n){return typeof n=="string"&&iq.test(n.trim())}async function Pa(n,A,o,a,{signal:e,isDirect:i=!1,hasImages:t=!1,hasFiles:r=!1}={}){if(!wi(n))return null;let s=iq.exec(n.trim())[1].trim();if(s&&(!/^\d+$/u.test(s)||/^0+$/u.test(s)))return oI(S(lQe));let c=s?Math.min(Number(s),dQe):3;if(!i)return oI(S("\u8BF7\u5728\u4E0E\u673A\u5668\u4EBA\u7684\u79C1\u804A\u4E2D\u4F7F\u7528 /history\u3002"));if(t||r)return oI(S("/history \u4EC5\u652F\u6301\u6587\u5B57\u547D\u4EE4\uFF0C\u8BF7\u79FB\u9664\u56FE\u7247\u6216\u6587\u4EF6\u540E\u91CD\u8BD5\u3002"));let g=o?.sessionFor?.(a);if(typeof g!="string"||!g)return oI(S("\u5F53\u524D\u804A\u5929\u5C1A\u672A\u7ED1\u5B9A\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u53D1\u9001\u6D88\u606F\u6216\u4F7F\u7528 /session \u7ED1\u5B9A\u4F1A\u8BDD\u3002"));try{let I=A?.workspaceSession?.(g,a);if(typeof I?.readHistory!="function")return oI(S("\u5F53\u524D Harness \u6682\u4E0D\u652F\u6301\u8BFB\u53D6\u4F1A\u8BDD\u5386\u53F2\u3002"));let d=AbortSignal.timeout(rq),B=e?AbortSignal.any([e,d]):d,f=Date.now()+rq,Q=new Map,y,m,b=[],T=!1;for(let N=0;N<hQe;N+=1){if(B.throwIfAborted(),Date.now()>=f)throw new DOMException("History read timed out","TimeoutError");let P=await I.readHistory({maxMessages:pQe,...y===void 0?{}:{beforeSeq:y},timeoutMs:Math.max(1,f-Date.now()),signal:B});if(B.throwIfAborted(),Date.now()>=f)throw new DOMException("History read timed out","TimeoutError");if(o.sessionFor(a)!==g){let K=new Error("Session binding changed during history read");throw K.code="session-binding-changed",K}if(!P||!Array.isArray(P.events)||typeof P.hasMore!="boolean")throw new TypeError("Invalid history page");let x=y??1/0;for(let K of P.events){let Y=K?.event;if(!Y||!Number.isSafeInteger(Y.seq)||Y.seq<0||typeof Y.type!="string"||!Y.type)throw new TypeError("Invalid history event");if(m!==void 0&&Y.seq>m)continue;let G=Q.get(Y.seq);if(G){if(!IQe(G,Y))throw new TypeError("Conflicting history events")}else{if(y!==void 0&&Y.seq>=y)throw new TypeError("Invalid history cursor");Q.set(Y.seq,Y)}x=Math.min(x,Y.seq)}let k=[...Q.values()].sort((K,Y)=>K.seq-Y.seq);if(m??=k.at(-1)?.seq,T=P.hasMore,T&&(!Number.isFinite(x)||x===y))throw new TypeError("History cursor did not advance");if(b=uQe(k).slice(-c),b.length>=c||!T)break;y=x}return b.length===0?oI(T?S("\u672C\u6B21\u6709\u9650\u8BFB\u53D6\u4E2D\u672A\u627E\u5230\u53EF\u9884\u89C8\u7684\u5386\u53F2\u6D88\u606F\u3002"):S("\u5F53\u524D\u4F1A\u8BDD\u6682\u65E0\u53EF\u9884\u89C8\u7684\u5386\u53F2\u6D88\u606F\u3002")):CQe(g,b,c,T)}catch(I){return oI(BQe(I))}}var Ll={name:"@xmanrui/dsh-im",version:"4.20.2",description:"\u628A\u5341\u4E00\u79CD IM \u6E20\u9053\u548C\u516C\u7F51 AI Office \u63A5\u5165\u672C\u673A DeepSeek Harness\u3002 Connect eleven IM channels and a public AI Office to a local DeepSeek Harness.",keywords:["deepseek-harness","dsh","dsh-plugin","ai-agent","im","instant-messaging","chatbot","feishu","lark","wechat","wecom","dingtalk","qq","slack","telegram","discord","whatsapp","imessage","ai-office"],author:"xmanrui (https://github.com/xmanrui)",contributors:[{name:"C3H3-AI",url:"https://github.com/C3H3-AI"},{name:"divingleee",url:"https://github.com/divingleee"},{name:"Chan-0312",url:"https://github.com/Chan-0312"},{name:"BuvkB",url:"https://github.com/BuvkB"},{name:"masucc",url:"https://github.com/masucc"},{name:"cherryFloris",url:"https://github.com/cherryFloris"},{name:"geekyfoxlab",url:"https://github.com/geekyfoxlab"},{name:"grloper",url:"https://github.com/grloper"},{name:"baijian",url:"https://github.com/baijian"},{name:"lyzhu86",url:"https://github.com/lyzhu86"}],license:"MIT",type:"module",repository:{type:"git",url:"git+https://github.com/xmanrui/dsh-im.git"},homepage:"https://github.com/xmanrui/dsh-im#readme",bugs:{url:"https://github.com/xmanrui/dsh-im/issues"},publishConfig:{access:"public"},bin:{"dsh-im":"bin/dsh-im.mjs"},main:"./lib/index.js",exports:{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},files:["assets","bin","cordis.patch.yml","lib","plugin-src","scripts","src","PROACTIVE_DELIVERY.md","PROACTIVE_DELIVERY.en.md","LICENSE","README.md","README.en.md","THIRD_PARTY_NOTICES.md"],dsh:{bundle:{patch:"./cordis.patch.yml"},client:{inject:["@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-slots","@deepseek-ai/dsh-client-locale"],platform:"web"},compatibility:{dsh:"0.1.2-alpha.4 || 0.1.2-alpha.5 || 0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.5-alpha.1",dshReleases:{"0.1.2-alpha.4":"compatible","0.1.2-alpha.5":"compatible","0.1.2-rc.1":"compatible","0.1.3-alpha.1":"compatible","0.1.5-alpha.1":"compatible"},profiles:["web"]}},scripts:{build:"node plugin-src/client/build.mjs && node plugin-src/host/build.mjs",test:"node --test test/*.test.mjs test/channels/*/*.test.mjs",check:"npm run build && npm test && node scripts/verify-package.mjs"},engines:{node:">=22.19"},dependencies:{"@tencent-connect/qqbot-connector":"1.2.0","@tencent-connect/qqbot-nodejs":"1.0.4","@wecom/aibot-node-sdk":"1.0.7","dingtalk-stream":"2.1.4",qrcode:"1.5.4",undici:"7.29.0"},devDependencies:{"@deepseek-ai/cordis":"4.0.1","@larksuiteoapi/node-sdk":"1.73.0","@whiskeysockets/baileys":"7.0.0-rc14",esbuild:"0.25.9","https-proxy-agent":"5.0.1",react:"18.3.1","react-dom":"18.3.1","react-test-renderer":"18.3.1",semver:"7.8.5"},directories:{doc:"docs",lib:"lib",test:"test"}};var QQe=/^\/(?:stop|steer|version)(?=$|\s)/iu,yQe=/^\/stop(?=$|\s)/iu,mQe=/^\/version(?=$|\s)/iu,SQe="\u7528\u6CD5\uFF1A/stop\uFF08\u4E0D\u5E26\u53C2\u6570\uFF09",wQe="\u7528\u6CD5\uFF1A/version\uFF08\u4E0D\u5E26\u53C2\u6570\uFF09",DQe="\u7528\u6CD5\uFF1A/steer <\u8865\u5145\u6307\u4EE4>",bQe="\u63A7\u5236\u547D\u4EE4\u4EC5\u652F\u6301\u7EAF\u6587\u5B57\uFF0C\u8BF7\u79FB\u9664\u56FE\u7247\u540E\u91CD\u8BD5\u3002";function Qo(n,A={}){return{message:n,...A}}function oq(n){return n?{signal:n}:{}}function nq(n,A,o){if(typeof A?.sessionFor!="function")return null;let a=A.sessionFor(o);if(typeof a!="string"||!a)return null;if(typeof n?.workspaceSession!="function")throw new TypeError("Harness does not support workspace sessions");let e=n.workspaceSession(a,o);if(!e||typeof e!="object")throw new TypeError("Harness returned an invalid workspace session");return e}function oi(n){return typeof n=="string"&&QQe.test(n.trim())}async function Di(n,A,o,a,{signal:e,hasImages:i=!1,pendingInteraction:t=!1,control:r,deferredDelivery:s}={}){if(!oi(n))return null;let c=n.trim(),g=yQe.test(c),I=mQe.test(c);if(i)return Qo(S(bQe));if(I)return/^\/version$/iu.test(c)?Qo(`dsh-im v${Ll.version}`):Qo(S(wQe));if(g){if(!/^\/stop$/iu.test(c))return Qo(S(SQe));let y=nq(A,o,a);if(!y)return Qo(S("\u5F53\u524D\u804A\u5929\u6CA1\u6709\u6B63\u5728\u8FD0\u884C\u7684\u4EFB\u52A1\u3002"));if(typeof y.stopActiveTurn!="function")throw new TypeError("Harness session does not support stopping active turns");let m=await y.stopActiveTurn(r,oq(e));if(!m&&s){let b=await s.stop(a);if(b==="stopped")return Qo(S("\u5DF2\u8BF7\u6C42\u505C\u6B62\u540E\u53F0\u4EFB\u52A1\u3002"),{stopped:!0});if(b==="unavailable")return Qo(S("\u65E0\u6CD5\u5B89\u5168\u505C\u6B62\u540E\u53F0\u4EFB\u52A1\uFF0C\u8BF7\u5728 Harness \u4E2D\u67E5\u770B\u5E76\u505C\u6B62\u5BF9\u5E94\u4EFB\u52A1\u3002"))}return m?Qo(S("\u5DF2\u8BF7\u6C42\u505C\u6B62\u5F53\u524D\u4EFB\u52A1\u3002"),{stopped:!0}):Qo(S("\u5F53\u524D\u804A\u5929\u6CA1\u6709\u6B63\u5728\u8FD0\u884C\u7684\u4EFB\u52A1\u3002"))}let B=/^\/steer(?:\s+([\s\S]*))?$/iu.exec(c)?.[1]?.trim()??"";if(!B)return Qo(S(DQe));if(t)return Qo([S("\u5F53\u524D\u4EFB\u52A1\u6B63\u5728\u7B49\u5F85\u4F60\u7684\u56DE\u7B54\u6216\u5BA1\u6279\u3002"),"",S("\u8BF7\u5148\u5904\u7406\u5F53\u524D\u8BF7\u6C42\uFF0C\u6216\u8005\u53D1\u9001 /stop \u505C\u6B62\u4EFB\u52A1\u3002")].join(`
184
184
  `));let f=nq(A,o,a);if(!f)return Qo(S("\u5F53\u524D\u804A\u5929\u6CA1\u6709\u7ED1\u5B9A\u4F1A\u8BDD\uFF0C\u65E0\u6CD5\u8865\u5145\u6307\u4EE4\u3002\u8BF7\u5148\u7ED1\u5B9A\u4F1A\u8BDD\u3002"));if(typeof f.steerActiveTurn!="function")throw new TypeError("Harness session does not support steering active turns");let Q=await f.steerActiveTurn(B,r,oq(e));return Qo(Q?S("\u5DF2\u63D0\u4EA4\u8865\u5145\u6307\u4EE4\uFF0CAgent \u4F1A\u5728\u4E0B\u4E00\u6B65\u8BFB\u53D6\u3002"):S("\u4EFB\u52A1\u5DF2\u7ED3\u675F\uFF0C\u6CA1\u6709\u6B63\u5728\u8FD0\u884C\u7684\u4EFB\u52A1\uFF0C\u65E0\u6CD5\u8865\u5145\u6307\u4EE4\u3002\u8BF7\u76F4\u63A5\u53D1\u9001\u6D88\u606F\u5F00\u59CB\u65B0\u4EFB\u52A1\u3002"))}var OQe=/^\/model(?=$|\s)/i,uq=/^\/models(?=$|\s)/i,Eq=/^\/reasoning(?=$|\s)/i,Cq=/^\/reasonings(?=$|\s)/i,Bq=/^\/reasoninglist(?=$|\s)/i,sq="\u7528\u6CD5\uFF1A/model <\u5E8F\u53F7\u6216 provider/model> [\u63A8\u7406\u7B49\u7EA7ID]",MQe="\u7528\u6CD5\uFF1A/models\uFF08\u4E0D\u5E26\u53C2\u6570\uFF09",_Qe="\u7528\u6CD5\uFF1A/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default]",TQe="\u7528\u6CD5\uFF1A/reasoninglist \u6216 /reasonings\uFF08\u4E0D\u5E26\u53C2\u6570\uFF09",fq="session-binding-changed",Qq="model-selection-mismatch",NQe=/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]+/gu;function mA(n){return{handled:!0,message:n,messages:xs(n)}}function bi(n){return typeof n!="string"?"":n.replace(NQe," ").replace(/\s+/gu," ").trim()}function RQe(n){return n?{signal:n}:{}}function kQe(n){if(n===void 0)return;if(!n||typeof n!="object"||!Array.isArray(n.efforts)||n.efforts.length===0)throw new TypeError("Harness returned invalid model reasoning metadata");let A=n.efforts.map(o=>{if(!o||typeof o!="object"||typeof o.id!="string"||!o.id||typeof o.name!="string"||!o.name||o.description!==void 0&&typeof o.description!="string")throw new TypeError("Harness returned an invalid reasoning effort");return{id:o.id,name:o.name,...o.description===void 0?{}:{description:o.description}}});if(n.defaultEffort!==void 0&&(typeof n.defaultEffort!="string"||!n.defaultEffort))throw new TypeError("Harness returned an invalid default reasoning effort");return{efforts:A,...n.defaultEffort===void 0?{}:{defaultEffort:n.defaultEffort}}}function yq(n,{requireCurrent:A=!1}={}){if(!n||typeof n!="object"||!Array.isArray(n.groups)||!Array.isArray(n.failures))throw new TypeError("Harness returned an invalid model catalog");let o=n.groups.map(i=>{if(!i||typeof i!="object"||typeof i.id!="string"||!i.id||typeof i.name!="string"||!i.name||!Array.isArray(i.models))throw new TypeError("Harness returned an invalid model provider group");return{id:i.id,name:i.name,models:i.models.map(t=>{if(!t||typeof t!="object"||typeof t.id!="string"||!t.id||typeof t.name!="string"||!t.name||t.description!==void 0&&typeof t.description!="string")throw new TypeError("Harness returned an invalid model");return{id:t.id,name:t.name,...t.description===void 0?{}:{description:t.description},...t.reasoning===void 0?{}:{reasoning:kQe(t.reasoning)}}})}}),a=n.failures.map(i=>{if(!i||typeof i!="object"||typeof i.id!="string"||!i.id||typeof i.name!="string"||!i.name)throw new TypeError("Harness returned an invalid model provider failure");return{id:i.id,name:i.name}}),e=null;if(n.current!==void 0){if(!n.current||typeof n.current!="object"||typeof n.current.provider!="string"||!n.current.provider||typeof n.current.model!="string"||!n.current.model||n.current.reasoningEffort!==void 0&&(typeof n.current.reasoningEffort!="string"||!n.current.reasoningEffort))throw new TypeError("Harness returned an invalid current model");e={provider:n.current.provider,model:n.current.model,...n.current.reasoningEffort===void 0?{}:{reasoningEffort:n.current.reasoningEffort}}}else if(A)throw new TypeError("Harness returned no current model");return{groups:o,failures:a,current:e}}function tg(n,A){return`${n}/${A}`}function mq(n,A){return n?.provider===A?.provider&&n?.model===A?.model}function vQe(n,A){return mq(n,A)&&n?.reasoningEffort===A?.reasoningEffort}function PQe(n,A){return mq(n,A)&&(A.reasoningEffort===void 0||n?.reasoningEffort===A.reasoningEffort)}function SN(n){if(!n?.provider||!n?.model)return"";let A=tg(n.provider,n.model);return n.reasoningEffort===void 0?A:`${A} \xB7 reasoningEffort=${bi(n.reasoningEffort)}`}function cq(n,A,o){let a=new Error(`Harness ${o} did not confirm the selected model`);return a.code=Qq,a.expected=n,a.actual=A,a.source=o,a}function Sq(){let n=new Error("Conversation binding changed during model selection");return n.code=fq,n}function gq(n,A,o){if((typeof n?.sessionFor=="function"?n.sessionFor(A):null)!==o)throw Sq()}function GQe(n,A){for(let o of n.groups)for(let a of o.models)if(tg(o.id,a.id)===A)return{provider:o.id,model:a.id};return null}function FQe(n,A){let o=0;for(let a of n.groups)for(let e of a.models)if(o+=1,o===A)return{provider:a.id,model:e.id};return null}function Iq(n){if(!/^\d+$/u.test(n))return null;let A=Number(n);return{index:Number.isSafeInteger(A)&&A>0?A:null}}function Om(n,A){return A?n.groups.find(({id:a})=>a===A.provider)?.models.find(({id:a})=>a===A.model)??null:null}function LQe(n,A){return n?.reasoning?.efforts?.[A-1]??null}function wN(n,A){return n?.reasoning?.efforts?.find(({id:o})=>o===A)??null}function Mm(n,A){return n?.reasoningEffort??A?.reasoning?.defaultEffort}function yC(n,A){if(A===void 0)return S("Default\uFF08\u7531\u6A21\u578B\u6216 Provider \u51B3\u5B9A\uFF09");let o=wN(n,A);if(!o)return bi(A);let a=bi(o.name),e=bi(o.id);return a===e?e:`${a} (${e})`}function wq(n){let A=Om(n,n.current);return yC(A,Mm(n.current,A))}function UQe(n,A,o){return n===A&&n===o?S("\uFF08\u5F53\u524D\u3001\u9ED8\u8BA4\uFF09"):n===A?S("\uFF08\u5F53\u524D\uFF09"):n===o?S("\uFF08\u9ED8\u8BA4\uFF09"):""}function lq(n){return[S("\u6A21\u578B\u5E8F\u53F7\u65E0\u6548\uFF1A{input}",{input:bi(n)}),"",S("\u8BF7\u53D1\u9001 /models \u67E5\u770B\u5E76\u8F93\u5165\u6709\u6548\u7684\u6B63\u6574\u6570\u5E8F\u53F7\u3002")].join(`
185
185
  `)}function dq(n){return[S("\u63A8\u7406\u7B49\u7EA7\u5E8F\u53F7\u65E0\u6548\uFF1A{input}",{input:bi(n)}),"",S("\u8BF7\u53D1\u9001 /reasoninglist \u67E5\u770B\u5E76\u8F93\u5165\u6709\u6548\u7684\u6B63\u6574\u6570\u5E8F\u53F7\u3002")].join(`
186
186
  `)}function QN(n,A,o){let a=[S("\u6A21\u578B\u4E0D\u652F\u6301\u63A8\u7406\u7B49\u7EA7\uFF1A{effort}",{effort:bi(A)}),"",bi(SN(n))],e=o?.reasoning?.efforts?.map(({id:i})=>bi(i))??[];return e.length>0?a.push(S("\u53EF\u7528\u63A8\u7406\u7B49\u7EA7\uFF1A{efforts}",{efforts:e.join(", ")})):a.push(S("\u8BE5\u6A21\u578B\u4E0D\u63D0\u4F9B\u53EF\u5207\u6362\u7684\u63A8\u7406\u7B49\u7EA7\u3002")),a.join(`
@@ -238,7 +238,7 @@ ${P}`:K;m&&await y.finish(Y)||await this.#F(c,Y,this.#L(A))}catch{this.#c.error?
238
238
  `,{encoding:"utf8",mode:384}),await rSe(o,n)}async function WN(n){if(typeof n!="string"||!n.trim()||!Ym(n.trim())){let a=new Error("\u5DE5\u4F5C\u533A\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84\u3002");throw a.code="workspace-not-absolute",a}let A=rh(n.trim()),o;try{o=await iSe(A)}catch(a){let e=new Error("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u4E0D\u5B58\u5728\u3002",{cause:a});throw e.code="workspace-not-found",e}if(!o.isDirectory()){let a=new Error("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u5FC5\u987B\u6307\u5411\u4E00\u4E2A\u76EE\u5F55\u3002");throw a.code="workspace-not-directory",a}return A}var zr=class{#t;#e;#A=1;#r={};#n={};#l={};#s=Object.create(null);#i={};#a=Object.create(null);#c=Object.create(null);#o=Object.create(null);#I=new Map;#d=1;#g=new Map;#p=1;#h=new Map;#u=1;#E=new Map;#C=new WeakMap;#B=new Set;#Q=Promise.resolve();#S=new Map;constructor(A,{defaultWorkspace:o=process.cwd()}={}){if(typeof A!="string"||!A)throw new TypeError("workspace store path is required");this.#t=A,this.#e=rh(o)}async load(){try{let A=dSe(JSON.parse(await tSe(this.#t,"utf8")));if(!A)throw new Error("dsh-im workspace config is invalid");this.#A=A.version,this.#r=A.workspaces,this.#n=A.agentPresets,this.#l=A.models,this.#s=A.aliases,this.#i=A.contextEnhancement,this.#a=A.deliveryTargets,this.#c=A.accessPolicies,this.#o=A.conversationWorkspaces}catch(A){if(A?.code!=="ENOENT")throw A;this.#A=1,this.#r={},this.#n={},this.#l={},this.#s=Object.create(null),this.#i={},this.#a=Object.create(null),this.#c=Object.create(null),this.#o=Object.create(null)}this.#I.clear(),this.#d=1,this.#g.clear(),this.#p=1,this.#h.clear(),this.#u=1,this.#E.clear(),this.#B.clear();for(let A of Object.keys(this.#r))this.#I.set(A,this.#m()),this.#h.set(A,this.#D());return this}has(A){let o=nA(A);return Object.hasOwn(this.#r,o)&&!this.#E.has(o)}listBotIds(){return Object.keys(this.#r).filter(A=>!this.#E.has(A)).sort()}incarnationFor(A){return this.#h.get(nA(A))??null}workspaceFor(A){return this.#r[nA(A)]??this.#e}hasConversationWorkspaceOverride(A,o){let a=nA(A);return!!o&&!!this.#o[a]?.[o]}conversationWorkspaceFor(A,o){let a=nA(A),e=this.#o[a]?.[o];return e||this.workspaceFor(a)}conversationGenerationFor(A,o){return typeof o!="string"||!o?null:this.#g.get(VN(A,o))??null}agentPresetFor(A){return this.#n[nA(A)]??null}modelFor(A){let o=this.#l[nA(A)];return o?{...o}:null}aliasFor(A){let o=nA(A);return this.has(o)&&Object.hasOwn(this.#s,o)?this.#s[o]:""}contextEnhancementFor(A){let o=nA(A);return this.has(o)&&Object.hasOwn(this.#i,o)?this.#i[o]:TN}accessPolicyFor(A){let o=nA(A);return this.has(o)&&Object.hasOwn(this.#c,o)?this.#c[o]:null}listDeliveryTargets(A){let o=nA(A);if(!this.has(o))throw qr("unknown-bot","Unknown bot");return Object.entries(this.#a[o]??{}).map(([a,e])=>Um(e,{targetId:a})).sort((a,e)=>a.targetId.localeCompare(e.targetId))}deliveryTargetFor(A,o){let a=nA(A),e=OC(o);if(!this.has(a))throw qr("unknown-bot","Unknown bot");let i=this.#a[a]?.[e];return i?Um(i,{targetId:e}):null}listSessionSyncTargets(){let A=[];for(let[o,a]of Object.entries(this.#a))if(this.has(o))for(let[e,i]of Object.entries(a)){let t=MC(i,{targetId:e,allowSessionSync:!0});t.sessionSync&&A.push({botId:o,targetId:e,conversationKey:t.sessionSync.conversationKey})}return A.sort((o,a)=>o.botId.localeCompare(a.botId)||o.targetId.localeCompare(a.targetId))}async createDeliveryTarget(A,o){let a=nA(A),e=MC(o);return this.#b(a,async()=>{if(!this.has(a))throw qr("unknown-bot","Unknown bot");if(Object.hasOwn(this.#a[a]??{},e.targetId))throw qr("target-conflict","Target already exists");let{targetId:i,...t}=e,r={...this.#a,[a]:{...this.#a[a]??{},[i]:t}},s=Math.max(this.#A,Vs);return await this.#T(this.#i,r,s),this.#a=r,this.#A=s,Um(t,{targetId:i})})}async updateDeliveryTarget(A,o,a){let e=nA(A),i=OC(o),t=MC(a,{targetId:i});return this.#b(e,async()=>{if(!this.has(e))throw qr("unknown-bot","Unknown bot");if(!Object.hasOwn(this.#a[e]??{},i))throw qr("unknown-target","Unknown target");let{targetId:r,...s}=t,c=this.#a[e][i],g=c.sessionSync&&gSe(c,s)?{...s,sessionSync:c.sessionSync}:s,I={...this.#a,[e]:{...this.#a[e],[i]:g}},d=Math.max(this.#A,Vs);return await this.#T(this.#i,I,d),this.#a=I,this.#A=d,Um(g,{targetId:i})})}async deleteDeliveryTarget(A,o){let a=nA(A),e=OC(o);return this.#b(a,async()=>{if(!this.has(a))throw qr("unknown-bot","Unknown bot");if(!Object.hasOwn(this.#a[a]??{},e))throw qr("unknown-target","Unknown target");let i={...this.#a[a]};delete i[e];let t={...this.#a};Object.keys(i).length>0?t[a]=i:delete t[a];let r=Math.max(this.#A,Vs);return await this.#T(this.#i,t,r),this.#a=t,this.#A=r,!0})}async setDeliveryTargetSessionSync(A,o,a){let e=nA(A),i=OC(o),t=a===null?null:Ah(a);return this.#b(e,async()=>{if(!this.has(e))throw qr("unknown-bot","Unknown bot");let r=this.#a[e]?.[i];if(!r)throw qr("unknown-target","Unknown target");if((r.sessionSync?.conversationKey??null)===t)return t!==null;let c={...r};t===null?delete c.sessionSync:c.sessionSync={conversationKey:t};let g={...this.#a,[e]:{...this.#a[e],[i]:c}};return await this.#T(this.#i,g,xm),this.#a=g,this.#A=xm,t!==null})}generationFor(A){return this.#I.get(nA(A))??null}async whenIdle(){await this.#Q}async whenBotIdle(A){let o=nA(A);for(;;){let a=this.#S.get(o);if(!a||(await a,this.#S.get(o)===a))return}}async ensure(A,{workspace:o=this.#e,defaultAgentPreset:a,initialAccessPolicy:e}={}){let i=nA(A),t=rh(o);return this.#b(i,async()=>{let r=!this.#r[i],s=e!==void 0&&!Object.hasOwn(this.#c,i);if(r||s){let c=s?nI(e):void 0,g=r?Vp(a):null,I=Object.hasOwn(this.#n,i),d=this.#n[i],B=s?{...this.#c,[i]:c}:this.#c;r&&(this.#r[i]=t,g&&(this.#n[i]=g),this.#I.set(i,this.#m()),this.#h.set(i,this.#D()));let f=s?Math.max(this.#A,Vs):this.#A;try{await this.#T(this.#i,this.#a,f,B)}catch(Q){throw r&&(delete this.#r[i],I?this.#n[i]=d:delete this.#n[i],this.#I.delete(i),this.#h.delete(i)),Q}this.#c=B,this.#A=f}else this.#I.has(i)||this.#I.set(i,this.#m());return this.#r[i]})}async setWorkspace(A,o,{clearSessions:a,incarnation:e}={}){let i=nA(A);if(!this.has(i)||e!==void 0&&e!==this.incarnationFor(i)){let r=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw r.code="workspace-bot-not-found",r}let t=await WN(o);return this.#b(i,async()=>{if(!this.has(i)||e!==void 0&&e!==this.incarnationFor(i)){let s=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw s.code="workspace-bot-not-found",s}if(t===this.workspaceFor(i))return t;let r=this.#r[i];this.#I.set(i,this.#m()),await a?.(),this.#r[i]=t;try{await this.#T()}catch(s){throw this.#r[i]=r,s}return t})}async setConversationWorkspace(A,o,a,{clearSession:e,incarnation:i}={}){let t=nA(A);if(typeof o!="string"||!o||o.length>1024||o.trim()!==o||/[\u0000-\u001f\u007f]/u.test(o))throw new TypeError("conversationKey is required");if(!this.has(t)||i!==void 0&&i!==this.incarnationFor(t)){let s=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw s.code="workspace-bot-not-found",s}let r=this.publishConversationWorkspaceSwitch(t,o);return this.applyConversationWorkspaceSwitch(t,o,a,{token:r,clearSession:e,incarnation:i})}async setAgentPreset(A,o,{incarnation:a}={}){let e=nA(A);if(!this.has(e)||a!==void 0&&a!==this.incarnationFor(e)){let t=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw t.code="workspace-bot-not-found",t}let i=Vp(o);return this.#b(e,async()=>{if(!this.has(e)||a!==void 0&&a!==this.incarnationFor(e)){let r=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw r.code="workspace-bot-not-found",r}let t=this.#n[e]??null;if(t===i)return i;i?this.#n[e]=i:delete this.#n[e];try{await this.#T()}catch(r){throw t?this.#n[e]=t:delete this.#n[e],r}return i})}async setModel(A,o,{incarnation:a}={}){let e=nA(A);if(!this.has(e)||a!==void 0&&a!==this.incarnationFor(e)){let t=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw t.code="workspace-bot-not-found",t}let i=Lm(o);return this.#b(e,async()=>{if(!this.has(e)||a!==void 0&&a!==this.incarnationFor(e)){let r=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw r.code="workspace-bot-not-found",r}let t=this.#l[e]??null;if(qN(t,i))return i?{...i}:null;i?this.#l[e]=i:delete this.#l[e];try{await this.#T()}catch(r){throw t?this.#l[e]=t:delete this.#l[e],r}return i?{...i}:null})}async setAlias(A,o,{incarnation:a}={}){let e=nA(A),i=a===void 0?this.incarnationFor(e):a,t=xl(o);return this.#b(e,async()=>{if(!this.has(e)||i!==this.incarnationFor(e)){let s=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw s.code="workspace-bot-not-found",s}let r={...this.#s};return t?r[e]=t:delete r[e],await this.#T(this.#i,this.#a,this.#A,this.#c,r),this.#s=r,t})}async setContextEnhancement(A,o,{incarnation:a}={}){let e=nA(A),i=a===void 0?this.incarnationFor(e):a,t=Hl(o);return this.#b(e,async()=>{if(!this.has(e)||i!==this.incarnationFor(e)){let s=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw s.code="workspace-bot-not-found",s}let r={...this.#i,[e]:t};return await this.#T(r),this.#i=r,t})}async setAccessPolicy(A,o,{incarnation:a}={}){let e=nA(A),i=a===void 0?this.incarnationFor(e):a,t=nI(o);return this.#b(e,async()=>{if(!this.has(e)||i!==this.incarnationFor(e)){let s=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw s.code="workspace-bot-not-found",s}let r={...this.#c,[e]:t};return await this.#T(this.#i,this.#a,Math.max(this.#A,Vs),r),this.#c=r,this.#A=Math.max(this.#A,Vs),t})}publishConversationWorkspaceSwitch(A,o){let a=nA(A);Ah(o);let e=this.#k();return this.#g.set(VN(a,o),e),e}isConversationWorkspaceSwitchCurrent(A,o,a){let e=nA(A);return Ah(o),this.#g.get(VN(e,o))===a}async applyConversationWorkspaceSwitch(A,o,a,{token:e,clearSession:i,sessionMatchesWorkspace:t,incarnation:r}={}){let s=nA(A),c=Ah(o);if(typeof e!="number")throw new TypeError("token is required");if(!this.has(s)||r!==void 0&&r!==this.incarnationFor(s)){let I=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw I.code="workspace-bot-not-found",I}let g=a===null?null:await WN(a);return this.#b(s,async()=>{let I=()=>{if(!this.has(s)||r!==void 0&&r!==this.incarnationFor(s)){let y=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw y.code="workspace-bot-not-found",y}if(!this.isConversationWorkspaceSwitchCurrent(s,c,e))throw pn("The conversation workspace changed before this switch could be committed.")};I();let d=this.#o[s],B=d?.[c],f=!!d&&Object.hasOwn(d,c);if(g===null?!f:f&&B===g){let y=await t?.(this.conversationWorkspaceFor(s,c));return I(),y===!1&&(await i?.(),I()),this.conversationWorkspaceFor(s,c)}let Q=g===null?(()=>{let y={...d};return delete y[c],y})():{...d,[c]:g};await i?.(),I(),Object.keys(Q).length>0?this.#o[s]=Q:delete this.#o[s];try{await this.#T()}catch(y){throw Object.keys(Q).length>0||f?this.#o[s]={...d??{},...f?{[c]:B}:{}}:delete this.#o[s],y}return this.conversationWorkspaceFor(s,c)})}async bindWorkspaceSession(A,o,{conversationKey:a,sessionId:e,clearSessions:i,clearSession:t,setSession:r,onConversationGeneration:s,incarnation:c,expectedGeneration:g,expectedConversationGeneration:I}={}){let d=nA(A);if(typeof a!="string"||!a||typeof e!="string"||!e)throw new TypeError("conversationKey and sessionId are required");if(typeof i!="function"||typeof r!="function")throw new TypeError("session state callbacks are required");if(!this.has(d)||c!==void 0&&c!==this.incarnationFor(d)){let y=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw y.code="workspace-bot-not-found",y}let B=I===void 0?this.conversationGenerationFor(d,a):I,f=()=>{if(B!==this.conversationGenerationFor(d,a))throw pn("The conversation workspace changed before the session binding could be committed.")},Q=await Km(await WN(o));return this.#b(d,async()=>{if(!this.has(d)||c!==void 0&&c!==this.incarnationFor(d)){let N=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw N.code="workspace-bot-not-found",N}if(g!==void 0&&g!==this.generationFor(d))throw pn("The bot workspace changed before the session binding could be committed.");f();let y=await XN(Q,this.workspaceFor(d)),m=this.#o[d],b=m?.[a],T=b!==void 0&&!await XN(Q,b);if(f(),!y||T){if(y&&typeof t!="function")throw new TypeError("clearSession is required to reconcile a conversation workspace");let N=this.#r[d];if(T&&(B=this.publishConversationWorkspaceSwitch(d,a),s?.(B)),y?await t(a):(this.#I.set(d,this.#m()),await i()),f(),y||(this.#r[d]=Q),T){let P={...m};delete P[a],Object.keys(P).length?this.#o[d]=P:delete this.#o[d]}try{await this.#T()}catch(P){throw this.#r[d]=N,T&&(this.#o[d]=m),P}}return f(),await r(a,e),f(),{workspace:Q,sessionId:e,generation:this.#I.get(d),conversationGeneration:B}})}async invalidateSessions(A,{clearSessions:o}={}){let a=nA(A);return this.#b(a,async()=>{this.#I.set(a,this.#m()),await o?.()})}async beginRemoval(A,{clearSessions:o}={}){let a=nA(A);return this.#b(a,async()=>{let e=this.#E.get(a);if(e)return e;let i=Object.freeze({});this.#E.set(a,i),this.#C.set(i,{botId:a,incarnation:this.incarnationFor(a)}),this.#I.set(a,this.#m());try{await o?.()}catch(t){throw this.#E.get(a)===i&&this.#E.delete(a),t}return i})}async abortRemoval(A){let{botId:o}=this.#O(A);return this.#b(o,async()=>this.#E.get(o)!==A?!1:(this.#E.delete(o),Object.hasOwn(this.#r,o)&&(this.#I.set(o,this.#m()),this.#h.has(o)||this.#h.set(o,this.#D())),!0))}async finishRemoval(A){let{botId:o,incarnation:a}=this.#O(A);return this.#b(o,async()=>this.#E.get(o)!==A?{removed:!1,persisted:!0,error:null,stale:!0}:this.incarnationFor(o)!==a?(this.#E.delete(o),{removed:!1,persisted:!0,error:null,stale:!0}):(this.#E.delete(o),this.#y(o)))}async retireAfterConfigCommit(A){let o=nA(A);return this.#b(o,async()=>(this.#E.delete(o),this.#y(o)))}flushPendingRemoval(A){if(this.#B.has(A))return this.#b(A,async()=>{this.#B.has(A)&&await this.#f()})}async remove(A){let o=await this.retireAfterConfigCommit(A);if(o.error)throw o.error;return o.removed}async reconcile(A){let o=new Set([...A].map(nA)),a=new Set([...Object.keys(this.#r),...Object.keys(this.#n),...Object.keys(this.#l),...Object.keys(this.#s),...Object.keys(this.#i),...Object.keys(this.#a),...Object.keys(this.#c),...Object.keys(this.#o),...this.#B]);for(let e of a)o.has(e)||await this.remove(e)}decorateStatus(A){return!A||typeof A!="object"||!Array.isArray(A.bots)?A:{...A,bots:A.bots.map(o=>o?.botId?{...o,...this.aliasFor(o.botId)?{bot:JN(o.bot,this.aliasFor(o.botId))}:{},workspace:this.workspaceFor(o.botId),agentPreset:this.agentPresetFor(o.botId),model:this.modelFor(o.botId),contextEnhancement:this.contextEnhancementFor(o.botId),accessPolicy:this.accessPolicyFor(o.botId)}:o)}}#m(){let A=this.#d;return this.#d+=1,A}#D(){let A=this.#u;return this.#u+=1,A}#k(){let A=this.#p;return this.#p+=1,A}#O(A){if(!A||typeof A!="object")throw new TypeError("Invalid workspace removal transaction");let o=this.#C.get(A);if(!o)throw new TypeError("Invalid workspace removal transaction");return o}async#y(A){let o=Object.hasOwn(this.#r,A),a=Object.hasOwn(this.#n,A),e=Object.hasOwn(this.#l,A),i=Object.hasOwn(this.#s,A),t=Object.hasOwn(this.#i,A),r=Object.hasOwn(this.#a,A),s=Object.hasOwn(this.#c,A),c=Object.hasOwn(this.#o,A),g=o||a||e||i||t||r||s||c||this.#B.has(A);if(delete this.#r[A],delete this.#n[A],delete this.#l[A],delete this.#s[A],delete this.#i[A],delete this.#a[A],delete this.#c[A],delete this.#o[A],this.#I.delete(A),this.#h.delete(A),!g)return{removed:!1,persisted:!0,error:null,stale:!1};try{return await this.#f(),{removed:o,persisted:!0,error:null,stale:!1}}catch(I){return this.#B.add(A),{removed:o,persisted:!1,error:I,stale:!1}}}async#b(A,o){let a=this.#Q.then(o,o),e=a.then(()=>{},()=>{});return this.#Q=e,this.#S.set(A,e),e.finally(()=>{this.#S.get(A)===e&&this.#S.delete(A)}),a}async#T(A=this.#i,o=this.#a,a=this.#A,e=this.#c,i=this.#s,t=this.#o){await hSe(this.#t,pSe({version:a,workspaces:this.#r,conversationWorkspaces:t,agentPresets:this.#n,models:this.#l,contextEnhancement:A,deliveryTargets:o,accessPolicies:e,aliases:i})),this.#B.clear()}async#f(){if(Object.keys(this.#r).length>0||Object.keys(this.#n).length>0||Object.keys(this.#l).length>0||Object.keys(this.#s).length>0||Object.keys(this.#i).length>0||Object.keys(this.#a).length>0||Object.keys(this.#c).length>0||Object.keys(this.#o).length>0){await this.#T();return}try{await aSe(this.#t),this.#B.clear()}catch(A){if(A?.code!=="ENOENT")throw A;this.#B.clear()}}};function _C(n){if(!n)return null;let A=typeof n=="function"?n():n;return A&&typeof A.then=="function"?A.then(qs):qs(A)}function Hm(n){if(!n)return null;let A=typeof n=="function"?n():n;return A&&typeof A.then=="function"?A.then(ss):ss(A)}function i4(){let n=new Error("Agent Preset \u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u7528\u3002");return n.code="agent-preset-unavailable",n}function uSe(){let n=new Error("\u6A21\u578B\u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u7528\u3002");return n.code="model-selection-unavailable",n}function Kl(n){if(n())return;let A=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw A.code="workspace-bot-not-found",A}function ZN(n,A,o,a){let e=i=>{let t=n.decorateStatus(i);if(!o&&!a||!t||typeof t!="object")return t;let r=([c,g])=>({...t,...c?{agentPresetCatalog:c}:{},...g?{modelCatalog:g}:{}}),s=[_C(o),Hm(a)];return s.some(c=>c&&typeof c.then=="function")?Promise.all(s).then(r):r(s)};return A&&typeof A.then=="function"?A.then(e):e(A)}function ESe(n){return Promise.resolve(n.status())}function ki(n,{workspaces:A,method:o="remove",botIdFromRemoved:a=t=>t?.botId,saveMethod:e="save",botIdFromSave:i=t=>t?.botId}){if(!n||!A||typeof n[o]!="function")throw new TypeError("configStore removal observer dependencies are required");return new Proxy(n,{get(t,r){let s=Reflect.get(t,r,t);return r===o?async(...c)=>{let g=await s.apply(t,c),I=g?a(g,c):null;return I&&await A.retireAfterConfigCommit(I),g}:r===e&&typeof s=="function"?(...c)=>{let g=A.flushPendingRemoval(i(c[0],c));return g?g.then(()=>s.apply(t,c)):s.apply(t,c)}:typeof s=="function"?s.bind(t):s}})}function vi(n,{botId:A,workspaces:o,state:a,agentPresetCatalog:e}={}){if(!n||!o||!a)throw new TypeError("harness, workspaces, and state are required");let i=o.incarnationFor(A),t=()=>o.has(A)&&o.incarnationFor(A)===i,r=async(N=e)=>{let P;try{P=await _C(N)??qs(null)}catch(x){throw Kl(t),x}return Kl(t),{agentPreset:o.agentPresetFor(A),agentPresetCatalog:P}},s=new Map,c=new Map,g=new Map;function I(N,P){return g.set(N,P),P.finally(()=>{g.get(N)===P&&(g.delete(N),t()&&y(N))})}function d(N){return o.conversationGenerationFor(A,N)??0}function B(N,P){N&&c.set(N,P===void 0?d(N):P)}function f(N,P){if(typeof N!="string"||!N)return!1;let x=c.get(N);return x!==void 0&&x!==d(N)?!0:P===void 0?!1:P!==d(N)}function Q(N,P=N?.conversationKey){return!!N&&(N.generation!==void 0&&N.generation!==o.generationFor(A)||N.conversationKey===P&&f(P,N.conversationGeneration))}function y(N){let P=a.sessionFor?.(N),x=s.get(P);x?.conversationKey===N&&x.generation===o.generationFor(A)&&s.set(P,{...x,conversationGeneration:d(N)})}async function m(N,P){let x=a.sessionFor?.(N);if(!x)return!0;let k=s.get(x)?.workspace,K=!1;if(!k&&typeof n.rpc=="function"){let Y=await n.rpc("workspace.list",{},3e4);if(!Array.isArray(Y?.items))throw new TypeError("Harness returned an invalid workspace list");let G=Y.items.filter(v=>Array.isArray(v?.sessionIds)&&v.sessionIds.includes(x));G.length===1&&typeof G[0].path=="string"&&Ym(G[0].path)&&(k=G[0].path)}else if(!k&&typeof n.listWorkspaceSessions=="function"){let Y=await n.listWorkspaceSessions(await Km(P));if(!Array.isArray(Y?.sessions))throw new TypeError("Harness returned an invalid workspace session list");K=Y.sessions.some(G=>G?.sessionId===x)}if(k&&(K=await XN(k,P)),a.sessionFor(N)!==x)throw pn("The session binding changed while its workspace was being checked.");return K}let b=new Proxy(n,{get(N,P){if(P==="agentPresetSettings")return async(k={})=>{k?.signal?.throwIfAborted(),Kl(t);let K=await r();return k?.signal?.throwIfAborted(),K};if(P==="updateAgentPreset")return async(k,K={})=>{K?.signal?.throwIfAborted(),Kl(t);let Y=k==="--default"?null:Vp(k),G=null;if(Y&&({agentPresetCatalog:G}=await r(),K?.signal?.throwIfAborted(),!G.items.some(v=>v.id===Y)))throw i4();if(await o.setAgentPreset(A,Y,{incarnation:i}),Kl(t),G)return{agentPreset:o.agentPresetFor(A),agentPresetCatalog:G};try{return await r()}catch(v){if(v?.code==="workspace-bot-not-found")throw v;return Kl(t),{agentPreset:o.agentPresetFor(A),agentPresetCatalog:qs(null)}}};if(P==="currentWorkspace")return()=>{if(!t()){let k=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw k.code="workspace-bot-not-found",k}return o.workspaceFor(A)};if(P==="assertWorkspaceScope")return()=>{if(!t()){let k=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw k.code="workspace-bot-not-found",k}};if((P==="listWorkspaces"||P==="listWorkspaceSessions"||P==="listModels")&&typeof N[P]=="function")return async(...k)=>{if(!t()){let Y=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw Y.code="workspace-bot-not-found",Y}let K=await N[P](...k);if(!t()){let Y=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw Y.code="workspace-bot-not-found",Y}return K};if(P==="switchWorkspace")return k=>{if(!t()){let K=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");return K.code="workspace-bot-not-found",Promise.reject(K)}return o.setWorkspace(A,k,{clearSessions:()=>a.clearSessions(),incarnation:i})};if(P==="currentConversationWorkspace")return k=>{if(!t()){let K=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw K.code="workspace-bot-not-found",K}return o.conversationWorkspaceFor(A,k)};if(P==="hasConversationWorkspaceOverride")return k=>(Kl(t),o.hasConversationWorkspaceOverride(A,k));if(P==="pendingConversationWorkspaceSwitch")return k=>g.get(k)??null;if(P==="conversationWorkspaceGeneration")return k=>d(k);if(P==="switchConversationWorkspace")return(k,K)=>{if(!t()){let G=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");return G.code="workspace-bot-not-found",Promise.reject(G)}let Y=o.publishConversationWorkspaceSwitch(A,k);return B(k,Y),I(k,o.applyConversationWorkspaceSwitch(A,k,K,{token:Y,sessionMatchesWorkspace:G=>m(k,G),clearSession:async()=>{await a.clearSession(k)},incarnation:i}))};if(P==="clearConversationWorkspace")return k=>{if(!t()){let Y=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");return Y.code="workspace-bot-not-found",Promise.reject(Y)}let K=o.publishConversationWorkspaceSwitch(A,k);return B(k,K),I(k,o.applyConversationWorkspaceSwitch(A,k,null,{token:K,sessionMatchesWorkspace:Y=>m(k,Y),clearSession:async()=>{await a.clearSession(k)},incarnation:i}))};if(P==="bindWorkspaceSession")return async(k,K)=>{if(typeof k!="string"||!k||typeof K!="string"||!K)throw new TypeError("conversationKey and sessionId are required");if(!t()){let F=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw F.code="workspace-bot-not-found",F}if(typeof N.adoptWorkspaceSession!="function")throw new TypeError("Harness does not support adopting workspace sessions");let Y=o.generationFor(A),G=o.conversationGenerationFor(A,k),v=await N.adoptWorkspaceSession(K);if(!t()){let F=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw F.code="workspace-bot-not-found",F}if(Y!==o.generationFor(A))throw pn("The bot workspace changed while the session was being adopted.");if(G!==o.conversationGenerationFor(A,k))throw pn("The conversation workspace changed while the session was being adopted.");if(!v||typeof v!="object"||v.sessionId!==K||typeof v.workspace!="string")throw new TypeError("Harness returned an invalid adopted workspace session");let j=await o.bindWorkspaceSession(A,v.workspace,{conversationKey:k,sessionId:K,clearSessions:()=>a.clearSessions(),clearSession:F=>a.clearSession(F),setSession:(F,R)=>a.setSession(F,R),onConversationGeneration:F=>B(k,F),incarnation:i,expectedGeneration:Y,expectedConversationGeneration:G});if(!t()){let F=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw F.code="workspace-bot-not-found",F}if(j.generation!==o.generationFor(A)||j.conversationGeneration!==o.conversationGenerationFor(A,k))throw pn("The bot workspace changed before the session binding completed.");return s.set(K,{generation:j.generation,workspace:j.workspace,conversationKey:k,conversationGeneration:j.conversationGeneration??0}),{...v,workspace:j.workspace,sessionId:j.sessionId}};if(P==="createSession")return async(k={})=>{let{inheritBotModel:K=!0,conversationKey:Y,...G}=k;for(;;){let Z=g.get(Y);if(Z&&await Z,await o.whenBotIdle(A),!g.has(Y))break}if(!t()){let Z=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw Z.code="workspace-bot-not-found",Z}let v=o.generationFor(A),j=Y?d(Y):null,F=o.agentPresetFor(A),R=K===!1?null:o.modelFor(A),L=o.conversationWorkspaceFor(A,Y),V=await N.createSession({...G,workspace:L,...F==null?{}:{agentPreset:F}});if(f(Y,j))throw pn("The conversation workspace changed while the session was being created.");if(R){if(typeof N.selectSessionModel!="function")throw new TypeError("Harness does not support model selection");let Z=await N.selectSessionModel(V,R,k.signal?{signal:k.signal}:{});if(!r4(Z?.selected,R)){let $=new Error("Harness did not confirm the selected model");throw $.code="model-selection-mismatch",$}}return s.set(V,{generation:v,workspace:L,conversationKey:Y,conversationGeneration:j}),V};if(P==="workspaceSession")return(k,K)=>{if(typeof k!="string"||!k)return null;let Y=s.get(k),G=Y?.generation??o.generationFor(A),v=typeof K=="string"&&K?K:Y?.conversationKey??null,j=v?Y?.conversationKey===v?Y.conversationGeneration:d(v):null,F=()=>t()&&G===o.generationFor(A)&&!f(v,j),R=async(V,Z,$)=>{if(!F())throw pn(`The bot workspace changed before this ${$} started.`);let ne=await N[V](k,...Z);if(!F())throw pn(`The bot workspace changed while this ${$} was running.`);return ne},L=async(V,Z,$)=>{if(!F())throw pn(`The bot workspace changed before this ${$} started.`);return N[V](k,...Z)};return Object.freeze({sessionId:k,async sessionExists(...V){if(!F())return!1;let Z=await N.sessionExists(k,...V);return F()&&Z},models(...V){return R("getSessionModels",V,"model listing")},readHistory(...V){return R("readSessionHistory",V,"history read")},...typeof N.renameSession=="function"?{renameTitle(...V){return L("renameSession",V,"title rename")}}:{},selectModel(...V){return R("selectSessionModel",V,"model selection")},isRunning(...V){return R("isSessionRunning",V,"run-state check")},hasActiveTurn(...V){return R("hasActiveTurn",V,"turn ownership check")},stopActiveTurn(...V){return L("stopActiveTurn",V,"turn stop")},stopDeferredTurn(...V){return L("stopDeferredTurn",V,"deferred turn stop")},steerActiveTurn(...V){return L("steerActiveTurn",V,"turn steering")},...typeof N.executeCommand=="function"?{executeCommand(...V){return L("executeCommand",V,"command execution")}}:{},ask(...V){if(!F())throw pn("The bot workspace changed before this prompt started.");return N.ask(k,...V)}})};if(P==="sessionExists")return(k,...K)=>{if(!t())return!1;let Y=s.get(k);return Q(Y)?!1:N.sessionExists(k,...K)};if(P==="ask")return(k,...K)=>{let Y=s.get(k);if(!t()||Q(Y)){let G=new Error("The bot workspace changed before this prompt started.");throw G.code=Si,G}return N.ask(k,...K)};if(P==="executeCommand"&&typeof N.executeCommand=="function")return(k,...K)=>{let Y=s.get(k);if(!t()||Q(Y)){let G=new Error("The bot workspace changed before this command started.");throw G.code=Si,G}return N.executeCommand(k,...K)};let x=Reflect.get(N,P,N);return typeof x=="function"?x.bind(N):x}}),T=new Proxy(a,{get(N,P){if(P===G0)return N;if(P==="sessionFor")return(k,...K)=>{if(!t())return null;let Y=N.sessionFor(k,...K);if(Y){let G=s.get(Y);if(Q(G,k))return null;G||s.set(Y,{generation:o.generationFor(A),conversationKey:k,conversationGeneration:d(k)})}return Y};if(P==="setSession")return(k,K,...Y)=>{let G=s.get(K);return!t()||Q(G,k)?!1:N.setSession(k,K,...Y)};let x=Reflect.get(N,P,N);return typeof x=="function"?x.bind(N):x}});return Object.freeze({harness:b,state:T})}function Pi(n,{workspaces:A,stateFor:o,agentPresetCatalog:a,modelCatalog:e}={}){if(!n||!A||typeof o!="function")throw new TypeError("controller, workspaces, and stateFor are required");let i=new Map,t=(Q,y)=>{let b=(i.get(Q)??Promise.resolve()).catch(()=>{}).then(y);return i.set(Q,b),b.finally(()=>{i.get(Q)===b&&i.delete(Q)})},r=Q=>ZN(A,Q,a,e),s=(Q,y)=>{let m=A.incarnationFor(Q);return t(Q,async()=>{if(!(await n.status())?.bots?.some(N=>N?.botId===Q)){let N=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw N.code="workspace-bot-not-found",N}let T=await o(Q);return await A.setWorkspace(Q,y,{clearSessions:()=>T.clearSessions(),incarnation:m}),r(await n.status())})},c=(Q,y)=>{let m=A.incarnationFor(Q),b=Vp(y);return t(Q,async()=>{if(!(await n.status())?.bots?.some(P=>P?.botId===Q)){let P=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw P.code="workspace-bot-not-found",P}let N=b&&a?await _C(a):null;if(b&&a&&!N?.items.some(P=>P.id===b))throw i4();return await A.setAgentPreset(Q,b,{incarnation:m}),ZN(A,await n.status(),N??a,e)})},g=(Q,y)=>{let m=A.incarnationFor(Q),b=Lm(y);return t(Q,async()=>{if(!(await n.status())?.bots?.some(x=>x?.botId===Q)){let x=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw x.code="workspace-bot-not-found",x}let N=b&&e?await Hm(e):null,P=zN(N,b);if(b&&(!e||!P))throw uSe();if(b?.reasoningEffort!==void 0&&!P.reasoning?.efforts.some(x=>x.id===b.reasoningEffort)){let x=new Error("\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6240\u9009\u601D\u8003\u5F3A\u5EA6\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u3002");throw x.code="model-reasoning-unavailable",x}return await A.setModel(Q,b,{incarnation:m}),ZN(A,await n.status(),a,N??e)})},I=(Q,y,m)=>{let b=A.incarnationFor(Q),T=xl(y);return t(Q,async()=>{let N=await r(await n.status());if(!N?.bots?.some(k=>k?.botId===Q)){let k=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw k.code="workspace-bot-not-found",k}let P={...N,bots:N.bots.map(k=>k.botId===Q?{...k,bot:JN(k.bot,T)}:k)},x=m?await m(P):P;return await A.setAlias(Q,T,{incarnation:b}),x})},d=(Q,y,m)=>{let b=A.incarnationFor(Q),T=Hl(y);return t(Q,async()=>{let N=await n.status();if(!N?.bots?.some(G=>G?.botId===Q)){let G=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw G.code="workspace-bot-not-found",G}let[P,x]=await Promise.all([_C(a),Hm(e)]),k=A.decorateStatus(N),K={...k,bots:k.bots.map(G=>G?.botId===Q?{...G,contextEnhancement:T}:G),...P?{agentPresetCatalog:P}:{},...x?{modelCatalog:x}:{}},Y=m?await m(K):K;return await A.setContextEnhancement(Q,T,{incarnation:b}),Y})},B=(Q,y,m)=>{let b=A.incarnationFor(Q),T=nI(y);return t(Q,async()=>{let N=await n.status();if(!N?.bots?.some(G=>G?.botId===Q)){let G=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw G.code="workspace-bot-not-found",G}let[P,x]=await Promise.all([_C(a),Hm(e)]),k=A.decorateStatus(N),K={...k,bots:k.bots.map(G=>G?.botId===Q?{...G,accessPolicy:T}:G),...P?{agentPresetCatalog:P}:{},...x?{modelCatalog:x}:{}},Y=m?await m(K):K;return await A.setAccessPolicy(Q,T,{incarnation:b}),Y})},f=(Q,y)=>t(Q,async()=>{let m=await A.beginRemoval(Q,{clearSessions:async()=>{try{let b=await o(Q);if(!b||typeof b.clearSessions!="function")throw new TypeError("bot state does not support session cleanup");await b.clearSessions()}catch(b){console.warn(`[dsh-im] ignored session cleanup failure while deleting bot ${Q}:`,b?.message??b)}}});try{let b=await y();return await A.finishRemoval(m),r(b)}catch(b){let T=await ESe(n).catch(()=>null);throw Array.isArray(T?.bots)&&!T.bots.some(P=>P?.botId===Q)?await A.finishRemoval(m):await A.abortRemoval(m),b}});return new Proxy(n,{get(Q,y){if(y==="updateWorkspace")return s;if(y==="updateAgentPreset")return c;if(y==="updateModel")return g;if(y==="updateAlias")return I;if(y==="updateContextEnhancement")return d;if(y==="updateAccessPolicy")return B;let m=Reflect.get(Q,y,Q);return typeof m!="function"?m:y==="deleteBot"?(b,...T)=>f(b,()=>m.call(Q,b,...T)):y==="disconnect"?async(...b)=>{let N=(await Q.status())?.bots?.[0]?.botId;return N?f(N,()=>m.apply(Q,b)):r(m.apply(Q,b))}:(...b)=>r(m.apply(Q,b))}})}var $N=new Set(["weixin","feishu","dingtalk","wecom","wecom-app","qq","slack","telegram","discord","whatsapp"]);function eR(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function CSe(n){return typeof n=="string"&&n.length>0&&n.length<=512&&n.trim()===n&&!/[\s:\u0000-\u001f\u007f]/u.test(n)}function tR(n,A){let o=`${A}:`;if(!n.startsWith(o))return null;let a=n.slice(o.length);return CSe(a)?a:null}function ih(n,A){for(let[o,a,e]of A){let i=tR(n,o);if(i)return{kind:a,route:{[e]:i}}}return null}function BSe(n){let A=tR(n,"p2p");return A?.startsWith("ou_")?{kind:"user",route:{openId:A}}:ih(n,[["group","group","chatId"]])}function fSe(n){let A=tR(n,"direct");if(A&&/^[A-Za-z0-9_-]{1,128}$/.test(A))return{kind:"conversation",route:{channelId:A}};let o=/^group:([^:]+):(\d{1,20}(?:\.\d{1,20})?)$/.exec(n);return!o||!/^[A-Za-z0-9_-]{1,128}$/.test(o[1])?null:{kind:"thread",route:{channelId:o[1],threadTs:o[2]}}}function QSe(n){let A=/^(direct|group):(-?\d+)(?::([1-9]\d*))?$/.exec(n);if(!A)return null;let o=Number(A[2]);if(!Number.isSafeInteger(o)||A[1]==="direct"&&A[3]!==void 0)return null;if(A[3]===void 0)return{kind:"chat",route:{chatId:A[2]}};let a=Number(A[3]);return!Number.isSafeInteger(a)||a<=0?null:{kind:"topic",route:{chatId:A[2],messageThreadId:a}}}function ySe(n){let A=/^(?:direct|group):(\d{1,32})$/.exec(n);return A?{kind:"channel",route:{channelId:A[1]}}:null}function mSe(n){let A=/^direct:(\d{5,32}@(s\.whatsapp\.net|lid))$/.exec(n);if(A)return{kind:"user",route:{jid:A[1]}};let o=/^group:(\d{5,32}(?:-\d{1,32})?@g\.us)$/.exec(n);return o?{kind:"group",route:{jid:o[1]}}:null}function o4(n,A){if(!$N.has(n)||typeof A!="string")return null;switch(n){case"weixin":return ih(A,[["p2p","user","toUserId"]]);case"feishu":return BSe(A);case"dingtalk":return ih(A,[["p2p","user","userId"],["group","group","openConversationId"]]);case"wecom":return ih(A,[["direct","user","chatId"],["group","group","chatId"]]);case"wecom-app":return ih(A,[["p2p","user","chatId"]]);case"qq":return ih(A,[["c2c","user","userOpenId"],["group","group","groupOpenId"]]);case"slack":return fSe(A);case"telegram":return QSe(A);case"discord":return ySe(A);case"whatsapp":return mSe(A);default:return null}}function SSe(n,A){let o=typeof A=="string"?A.indexOf(":"):-1,a=o>0?A.slice(0,o):"",e={weixin:"p2p",feishu:"p2p",dingtalk:"p2p",wecom:"direct","wecom-app":"p2p",qq:"c2c",slack:"direct",telegram:"direct",discord:"direct",whatsapp:"direct"}[n];return!e||a!==e?null:o4(n,A)}function a4(n){return!eR(n?.route)||typeof n.kind!="string"?null:JSON.stringify([n.kind,Object.keys(n.route).sort().map(A=>[A,n.route[A]])])}function TC(n,A,o){let a=SSe(n,A),e=a4(a);return e!==null&&e===a4(o)}function AR(n,A,o){if(!$N.has(n)||!eR(A))return null;let a=[];for(let[e,i]of Object.entries(A))if(!(typeof i!="string"||!i)&&(TC(n,e,o)&&a.push(e),a.length>1))return null;return a[0]??null}function n4(n,A){if(!$N.has(n)||!eR(A))return[];let o=[],a=new Set;for(let e of Object.keys(A)){let i=o4(n,e);if(!i)continue;let t=JSON.stringify(i);a.has(t)||(a.add(t),o.push(i))}return o}var wSe=new Set(["weixin","feishu","dingtalk","wecom","wecom-app","qq","slack","telegram","discord","whatsapp","imessage"]);function qm(n){return wSe.has(n)}function gI(n){let A=new Error(n);return A.code="invalid-target",A}function jm(n="Session sync is unavailable for this target"){let A=new Error(n);return A.code="session-sync-unavailable",A}function DSe(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function iR(n,A,o){if(!DSe(n))throw gI(`${o} must be an object`);if(Object.keys(n).find(e=>!A.includes(e))!==void 0)throw gI(`${o} contains an unknown field`)}function Jm(n,A){if(typeof n!="string"||!n||n.trim()!==n)throw gI(`${A} must be a non-empty string without surrounding whitespace`);return n}function bSe(n){if(typeof n!="string"||!n.trim()||n.trim().length>80)throw gI("target.name must contain 1 to 80 characters");return n.trim()}function Ws(n,A){iR(n,A,"route");let o={};for(let a of A)o[a]=Jm(n[a],`route.${a}`);return o}function cs(n,A){if(!A.includes(n))throw gI("target kind is not supported by this channel");return n}function OSe(n,A,o){switch(n){case"weixin":return cs(A,["user"]),Ws(o,["toUserId"]);case"feishu":return cs(A,["user","group"]),Ws(o,A==="user"?["openId"]:["chatId"]);case"dingtalk":return cs(A,["user","group"]),Ws(o,A==="user"?["userId"]:["openConversationId"]);case"wecom":return cs(A,["user","group"]),Ws(o,["chatId"]);case"wecom-app":return cs(A,["user"]),Ws(o,["chatId"]);case"qq":return cs(A,["user","group"]),Ws(o,A==="user"?["userOpenId"]:["groupOpenId"]);case"slack":return cs(A,["conversation","thread"]),Ws(o,A==="conversation"?["channelId"]:["channelId","threadTs"]);case"telegram":{cs(A,["chat","topic"]),iR(o,A==="chat"?["chatId"]:["chatId","messageThreadId"],"route");let a=Jm(o.chatId,"route.chatId");if(!/^-?\d+$/.test(a))throw gI("route.chatId must be a decimal string");if(A==="chat")return{chatId:a};if(!Number.isSafeInteger(o.messageThreadId)||o.messageThreadId<=0)throw gI("route.messageThreadId must be a positive integer");return{chatId:a,messageThreadId:o.messageThreadId}}case"discord":return cs(A,["channel"]),Ws(o,["channelId"]);case"whatsapp":{cs(A,["user","group"]);let a=Ws(o,["jid"]);if(!(A==="user"?/^\d{5,32}@(s\.whatsapp\.net|lid)$/.test(a.jid):/^\d{5,32}(?:-\d{1,32})?@g\.us$/.test(a.jid)))throw gI(`route.jid must be a ${A} WhatsApp JID`);return a}case"imessage":return cs(A,["user"]),Ws(o,["chatGuid"]);default:throw new TypeError(`Unsupported delivery channel: ${n}`)}}function ah(n,A,{targetIdRequired:o=!0}={}){if(!qm(n))throw new TypeError(`Unsupported delivery channel: ${n}`);iR(A,o?["targetId","name","kind","route"]:["name","kind","route"],"target");let a={};return o&&(a.targetId=Jm(A.targetId,"target.targetId")),A.name!==void 0&&(a.name=bSe(A.name)),a.kind=Jm(A.kind,"target.kind"),a.route=OSe(n,a.kind,A.route),a}function MSe(n){return{targetId:n.targetId,...n.name===void 0?{}:{name:n.name},kind:n.kind,route:n.route}}function rR(n,A){if(typeof n.listSessionSyncTargets!="function")return[];let o=n.listSessionSyncTargets();return A===void 0?o:o.filter(a=>a.botId===A)}function NC(n){if(!n||typeof n.snapshot!="function")return null;let A=n.snapshot()?.sessions;return A&&typeof A=="object"&&!Array.isArray(A)?A:null}function s4(n,A,o,a){return a?!TC(n,a.conversationKey,A)||!o?{enabled:!0,state:"unavailable"}:{enabled:!0,state:typeof o[a.conversationKey]=="string"&&o[a.conversationKey]?"active":"waiting"}:{enabled:!1,state:(o?AR(n,o,A):null)?"off":"unavailable"}}function Gi({channel:n,workspaces:A,coreController:o,stateFor:a}){if(!qm(n))throw new TypeError(`Unsupported delivery channel: ${n}`);if(!A||typeof A!="object")throw new TypeError("delivery adapter requires a workspace store");if(!o||typeof o!="object")throw new TypeError("delivery adapter requires a proactive text controller");if(typeof a!="function")throw new TypeError("delivery adapter requires a bot state getter");return Object.freeze({channel:n,ownsBot:e=>A.has(e),listBots:()=>A.listBotIds(),async listTargets(e){let i=A.listDeliveryTargets(e),t=new Map(rR(A,e).map(s=>[s.targetId,s])),r=null;try{r=NC(await a(e))}catch{}return i.map(s=>({...s,sessionSync:s4(n,s,r,t.get(s.targetId))}))},async listSuggestions(e){let i=await a(e);if(!i||typeof i.snapshot!="function")throw new TypeError("delivery suggestion state cannot be inspected");return n4(n,i.snapshot()?.sessions).map(r=>ah(n,r,{targetIdRequired:!1}))},createTarget:(e,i)=>A.createDeliveryTarget(e,ah(n,i)),updateTarget:(e,i,t)=>A.updateDeliveryTarget(e,i,ah(n,t,{targetIdRequired:!1})),deleteTarget:(e,i)=>A.deleteDeliveryTarget(e,i),async sendText(e,i,t,r={}){let s=ah(n,MSe(i));if(typeof o.sendProactiveText!="function")throw new TypeError("delivery controller cannot send proactive text");return await o.sendProactiveText(e,s,t,r),{sent:!0}},async setSessionSync(e,i,t){if(typeof A.setDeliveryTargetSessionSync!="function")throw jm();let r=A.deliveryTargetFor(e,i);if(!r){let g=new Error("Unknown target");throw g.code="unknown-target",g}if(!t){await A.setDeliveryTargetSessionSync(e,i,null);let g=null;try{g=NC(await a(e))}catch{}return s4(n,r,g,null)}let s=NC(await a(e)),c=AR(n,s,r);if(!c)throw jm();return await A.setDeliveryTargetSessionSync(e,i,c),{enabled:!0,state:"active"}},async listSessionSyncTargets(e){if(typeof e!="string"||!e)throw new TypeError("sessionId is required");let i=[];for(let t of rR(A)){let r=A.deliveryTargetFor(t.botId,t.targetId);if(!r||!TC(n,t.conversationKey,r))continue;let s;try{s=NC(await a(t.botId))}catch{continue}s?.[t.conversationKey]===e&&i.push({botId:t.botId,targetId:t.targetId})}return i},async sendSessionSyncText(e,i,t,r,s={}){if(typeof r!="string"||!r.trim())throw new TypeError("text is required");let c=rR(A,e).find(d=>d.targetId===i),g=A.deliveryTargetFor(e,i);if(!c||!g||!TC(n,c.conversationKey,g))throw jm("Session sync target is no longer enabled");if(NC(await a(e))?.[c.conversationKey]!==t)throw jm("Session sync target is no longer bound to this Session");if(typeof o.sendProactiveText!="function")throw new TypeError("delivery controller cannot send proactive text");return await o.sendProactiveText(e,g,r,s),{sent:!0}}})}var c4=Object.freeze([250,1e3,3e3,5e3,1e4,3e4]);function _Se(n){if(!Array.isArray(n)||n.length===0)return[...c4];let A=n.filter(o=>Number.isFinite(o)&&o>=0);return A.length>0?A:[...c4]}var zm=class{#t;#e;#A;#r;#n;#l;#s;#i=null;#a=null;#c=0;#o=!1;#I=!1;#d;#g;constructor({controller:A,harness:o,logger:a=console,retryDelaysMs:e,healthyIntervalMs:i=15e3,setTimeoutImpl:t=setTimeout,clearTimeoutImpl:r=clearTimeout}){if(!A||typeof A.initialize!="function"||typeof A.status!="function")throw new TypeError("ConnectionSupervisor requires a controller");if(!o||typeof o.ensureRunning!="function")throw new TypeError("ConnectionSupervisor requires a Harness client");this.#t=A,this.#e=o,this.#A=a,this.#r=_Se(e),this.#n=Number.isFinite(i)&&i>=0?i:15e3,this.#l=t,this.#s=r,this.#d=new Promise(s=>{this.#g=s})}get ready(){return this.#d}start(){return this.#I||this.#o?this:(this.#I=!0,this.#p(0),this)}async close(){this.#o||(this.#o=!0,this.#i!==null&&this.#s(this.#i),this.#i=null,await this.#a?.catch(()=>{}),this.#g?.(null),this.#g=null)}#p(A){this.#o||(this.#i=this.#l(()=>{this.#i=null,this.#h()},A),this.#i?.unref?.())}async#h(){if(this.#o||this.#a)return;let A=this.#u();this.#a=A;try{await A}finally{this.#a===A&&(this.#a=null)}}async#u(){try{if(await this.#e.ensureRunning(),this.#o)return;let A=await this.#t.initialize();if(this.#o)return;this.#g?.(A),this.#g=null;let{configured:o,connected:a}=A.totals;if(a<o){let e=this.#r[Math.min(this.#c,this.#r.length-1)];this.#c+=1,this.#A.warn?.(`[dsh-dingtalk] ${a}/${o} bots connected; retrying in ${e}ms`),this.#p(e);return}this.#c=0,this.#p(this.#n)}catch(A){if(this.#o)return;let o=this.#r[Math.min(this.#c,this.#r.length-1)];this.#c+=1,this.#A.warn?.(`[dsh-dingtalk] connection reconciliation failed; retrying in ${o}ms`,A),this.#p(o)}}};function aR(n){return new zm(n)}function Fi(n,A){if(A!==void 0){if(typeof A!="function")throw new TypeError("commandExecutor must be a function");return A}let o=n?.typertGateway;if(o){if(typeof o.invoke!="function")throw new TypeError("dsh-im requires a callable ctx.typertGateway");return async(a,e,i={})=>{let t={namespace:"commands",method:"execute",args:{agentId:a,line:e,images:[]},signal:i.signal};try{return await o.invoke(t)}catch(r){if(r?.name!=="TypertGatewayError"||!["arguments-invalid","gateway/arguments-invalid"].includes(r.code)||r.endpoint!=="commands/execute")throw r;let s;if(r.message==='typert gateway: commands/execute: args fields do not match the descriptor: unexpected "images"')s={agentId:a,line:e};else if(r.message==='typert gateway: commands/execute: args fields do not match the descriptor: missing "submittedAttachments"; unexpected "images"')s={agentId:a,line:e,submittedAttachments:[]};else throw r;return i.signal?.throwIfAborted(),o.invoke({...t,args:s})}}}}import{randomUUID as oR}from"node:crypto";var Vm=new WeakMap;function TSe(n){let A=n?.failure??(n?.isDSHRemoteError===!0?n:void 0);return A&&typeof A=="object"&&typeof A.code=="string"&&typeof A.message=="string"?{code:A.code,message:A.message,details:A.details&&typeof A.details=="object"?A.details:{}}:n?.name==="AbortError"||n?.name==="RemoteInvocationCancelled"?{code:"cancelled",message:n instanceof Error?n.message:"Harness request was cancelled",details:{}}:{code:"internal",message:n instanceof Error?n.message:String(n),details:{}}}function hn(n,A){return Promise.resolve().then(A).then(o=>({rpcId:n.rpcId,result:{ok:!0,value:o}}),o=>({rpcId:n.rpcId,result:{ok:!1,error:TSe(o)}}))}function g4(n,A,o,a){return{namespace:n,method:A,args:o,...a===void 0?{}:{signal:a}}}function Wm(n,A){let o=new Error(n);return o.name="UserQuestionError",o.code=A,o}function NSe(n){if(typeof n?.snapshotEvents=="function"){let o=n.snapshotEvents();if(Array.isArray(o))return o}let A=n?.events;return Array.isArray(A)?A:null}function RSe(n,A){return!n||typeof n!="object"||n.sessionId!==A.sessionId||!n.answer||typeof n.answer!="object"||!Array.isArray(n.answer.answers)||n.answer.answers.length!==A.questions.length?!1:n.answer.answers.every((o,a)=>{let e=A.questions[a];if(!o||typeof o!="object"||o.id!==e.id||!Array.isArray(o.selected)||o.selected.some(r=>typeof r!="string")||new Set(o.selected).size!==o.selected.length||o.custom!==void 0&&typeof o.custom!="string")return!1;let i=o.custom?.trim();if(i!==void 0&&!i||e.multiSelect!==!0&&(i!==void 0&&o.selected.length>0||o.selected.length>1))return!1;let t=new Set(e.options?.map(r=>r.label)??[]);return o.selected.every(r=>t.has(r))})}function kSe(n){if(n?.type==="event"&&n.event&&typeof n.event=="object")return[{event:n.event}];let A=n?.type==="chunks"?n.event:null;if(!A||typeof A!="object")throw new Error("Harness returned an invalid session history record");let{data:o}=A,a=A.type,e=a==="chunkrow/tool-call-chunks"?o?.args:o?.texts;if(!o||!Array.isArray(e)||e.length===0||e.some(t=>typeof t!="string")||!Array.isArray(o.dt)||o.dt.length!==e.length-1)throw new Error("Harness returned an invalid packed session chunk");let i=A.time;return e.map((t,r)=>{r>0&&(i+=o.dt[r-1]);let s;if(a==="chunkrow/text-chunks")s={type:"text-delta",index:o.index,text:t};else if(a==="chunkrow/reasoning-chunks")s={type:"reasoning-delta",index:o.index,text:t};else if(a==="chunkrow/tool-call-chunks")s={type:"tool-call-delta",index:o.index,id:o.id,...Object.hasOwn(o,"name")?{name:o.name}:{},argumentsDelta:t};else throw new Error(`Harness returned an unsupported packed session chunk: ${String(a)}`);return{event:{type:"assistant/chunk",seq:A.seq+r,time:i,data:{turn:o.turn,step:o.step,chunk:s}}}})}function nR(n){if(!Array.isArray(n))throw new Error("Harness returned invalid session history records");return n.flatMap(kSe)}var sR=class{#t=[];#e=null;#A=!1;#r;#n;#l;constructor(A,o){this.#r=A,this.#l=o,this.#n=()=>this.close(),A?.addEventListener("abort",this.#n,{once:!0}),A?.aborted&&this.close()}push(A){if(!this.#A)if(this.#e){let o=this.#e;this.#e=null,o({value:A,done:!1})}else this.#t.push(A)}next(){return this.#t.length>0?Promise.resolve({value:this.#t.shift(),done:!1}):this.#A?Promise.resolve({value:void 0,done:!0}):new Promise(A=>{this.#e=A})}return(){return this.close(),Promise.resolve({value:void 0,done:!0})}close(){if(!this.#A&&(this.#A=!0,this.#r?.removeEventListener("abort",this.#n),this.#l?.(),this.#l=null,this.#e)){let A=this.#e;this.#e=null,A({value:void 0,done:!0})}}[Symbol.asyncIterator](){return this}},cR=class{#t;#e;#A=new Set;#r=new Map;#n=new Map;#l=new Map;#s=new Map;#i=[];#a=!1;constructor(A,o,a){this.#t=o,this.#e=a,this.host=Object.freeze({describe:e=>hn(e,()=>({ready:!0,transport:"typert"}))}),this.workspace=Object.freeze({list:(e,i)=>hn(e,()=>this.#I(i)),create:(e,i)=>hn(e,()=>this.#c("workspace","create",{request:e.payload},i))}),this.sessions=Object.freeze({list:(e,i)=>hn(e,()=>this.#c("session","list",{_request:e.payload},i)),create:(e,i)=>hn(e,()=>this.#c("session","create",{request:e.payload},i)),history:(e,i)=>hn(e,()=>this.#g(e.payload,i)),prompt:(e,i)=>hn(e,()=>this.#c("session","prompt",{request:{requestId:e.rpcId,...e.payload}},i)),rename:(e,i)=>hn(e,()=>this.#c("session","rename",{request:e.payload},i)),cancel:(e,i)=>hn(e,()=>this.#c("session","cancel",{request:{sessionId:e.payload.sessionId}},i)),models:(e,i)=>hn(e,()=>this.#C(e.payload.sessionId,i)),selectModel:(e,i)=>hn(e,()=>this.#c("session","selectModel",{request:e.payload},i))}),this.llm=Object.freeze({models:(e,i)=>hn(e,async()=>{let t=await this.#E(i);return{groups:t.groups,failures:t.failures}})}),this.events=Object.freeze({mux:(e,i)=>this.#B(i)}),this.respond=e=>Promise.resolve(this.#y(e)),typeof A?.on=="function"&&(this.#i.push(A.on("session/event",(e,i)=>{let t=e?.id;typeof t!="string"||!i||typeof i!="object"||(Number.isSafeInteger(i.seq)&&this.#u(t,i.seq),this.#Q({type:"session/event",sessionId:t,event:i}))},{global:!0})),this.#i.push(A.on("agent/assistant-stream",({agent:e,frame:i})=>{this.#p(e,i)},{global:!0})),this.#i.push(A.on("agent/disposed",({agent:e})=>{let i=e?.session?.id;typeof i=="string"&&this.#s.delete(i)},{global:!0})),this.#i.push(A.on("approval/request",(e,i)=>this.#O(e,i),{global:!0,prepend:!0})),this.#i.push(A.on("user-questions/request",(e,i)=>this.#D(e,i),{global:!0,prepend:!0})))}async#c(A,o,a,e){return this.#t.invoke(g4(A,o,a,e))}async#o(A,o,a,e){let i=new AbortController,t=e?AbortSignal.any([e,i.signal]):i.signal,r;try{r=(await this.#t.stream(g4(A,o,a,t)))[Symbol.asyncIterator]();let c=await r.next();if(c.done)throw new Error(`Harness ${A}.${o} stream ended before its baseline`);return c.value}finally{i.abort(new DOMException("Baseline received","AbortError")),await Promise.resolve(r?.return?.()).catch(()=>{})}}async#I(A){let o=await this.#o("workspace","follow",{},A);if(o?.type!=="baseline"||!o.value||typeof o.value!="object")throw new Error("Harness workspace.follow returned no baseline");return o.value}async#d(A,o,a){let e=await this.#o("session","follow",{request:{address:{kind:"session",sessionId:A},maxMessages:o}},a);if(e?.type!=="snapshot"||!Number.isSafeInteger(e.cursor))throw new Error("Harness session.follow returned no snapshot");return this.#u(A,e.cursor),e}async#g(A,o){let{sessionId:a,maxMessages:e=50,beforeSeq:i}=A,t=this.#l.get(a);if(t===void 0){let s=await this.#d(a,e,o);if(t=this.#l.get(a)??s.cursor,i===void 0&&t===s.cursor)return{events:this.#h(a,nR(s.records)),hasMore:s.hasMore===!0,...s.projections===void 0?{}:{projections:s.projections}}}let r=await this.#c("session","page",{request:{address:{kind:"session",sessionId:a},throughSeq:t,maxMessages:e,...i===void 0?{}:{beforeSeq:i}}},o);return{events:i===void 0?this.#h(a,nR(r.records)):nR(r.records),hasMore:r.hasMore===!0}}#p(A,o){let a=A?.session?.id;if(typeof a!="string"||!o||typeof o!="object")return;if(o.type==="start"){let i=A?.session?.seq,t=Number.isSafeInteger(i)&&i>=0?i-1:this.#l.get(a)??-1;this.#s.set(a,{attemptId:o.attemptId,turn:o.turn,step:o.step,startedAfterSeq:t,entries:[]});return}let e=this.#s.get(a);if(!(!e||e.attemptId!==o.attemptId)){if(o.type==="end"){this.#s.delete(a);return}o.type!=="chunk"||o.index!==e.entries.length||e.entries.push({type:"transient",event:{type:"assistant/chunk",seq:e.startedAfterSeq+1-1/(o.index+2),time:o.time,data:{turn:e.turn,step:e.step,chunk:o.chunk}}})}}#h(A,o){let a=this.#s.get(A)?.entries??[];return a.length===0?o:[...o,...a]}#u(A,o){let a=this.#l.get(A);(a===void 0||o>a)&&this.#l.set(A,o)}#E(A){return this.#c("session","modelCatalog",{},A)}async#C(A,o){let[a,e]=await Promise.all([this.#E(o),this.#c("session","list",{_request:{}},o)]),i=e?.items?.find(s=>s?.sessionId===A);if(!i){let s=new Error(`session "${A}" not found`);throw s.failure={code:"session-not-found",message:s.message,details:{sessionId:A}},s}let t=i.projections?.values?.modelSelection,r=t?.next??t?.lastUsed??a.default;return{current:r,routable:a.routableProviders.includes(r.provider),groups:a.groups,failures:a.failures}}#B(A){let o;o=new sR(A,()=>this.#A.delete(o)),this.#A.add(o);for(let a of this.#r.values())o.push(this.#m(a));for(let a of this.#n.values())o.push(this.#k(a));return o}#Q(A,o=oR()){let a={rpcId:o,payload:A};for(let e of this.#A)e.push(a)}#S(A){let o=A?.session,a=o?.id??A?.id,e=NSe(o);return typeof a!="string"||!e?null:VJ(this.#e,a,e)?{sessionId:a,events:e}:null}#m(A){return{rpcId:A.rpcId,payload:{type:"question/requested",sessionId:A.sessionId,questions:A.questions}}}#D(A,o){let a=this.#S(A?.agent);return a?A.signal?.aborted?Promise.reject(Wm("ask_user_question was aborted before the user answered","ASK_ABORTED")):new Promise((e,i)=>{let t={rpcId:oR(),sessionId:a.sessionId,questions:A.questions,signal:A.signal,settle:(s,c)=>{this.#r.delete(t.rpcId)&&(A.signal?.removeEventListener("abort",r),this.#Q({type:"question/resolved",sessionId:t.sessionId,questionRpcId:t.rpcId,outcome:s}),s==="answered"?e(c):i(c))}},r=()=>t.settle("cancelled",Wm("ask_user_question was aborted before the user answered","ASK_ABORTED"));this.#r.set(t.rpcId,t),A.signal?.addEventListener("abort",r,{once:!0}),this.#Q(this.#m(t).payload,t.rpcId)}):o()}#k(A){return{rpcId:A.rpcId,payload:{type:"approval/requested",sessionId:A.sessionId,approvalId:A.approvalId,toolName:A.toolName,...A.callId===void 0?{}:{callId:A.callId},...A.reason===void 0?{}:{reason:A.reason}}}}#O(A,o){let a=this.#S(A?.agent);if(!a)return o();if(A.signal?.aborted)return Promise.resolve("cancelled");let e=new Set([...this.#n.values()].map(r=>r.approvalId)),i=new Set,t;for(let r=a.events.length-1;r>=0;r-=1){let s=a.events[r];if(s.type==="approval/decided")i.add(s.data?.id);else if(s.type==="approval/asked"){let c=s.data?.id;if(!c||i.has(c)||e.has(c)||(A.callId??null)!==(s.data?.callId??null))continue;t=c;break}}return t===void 0?o():new Promise(r=>{let s={rpcId:oR(),sessionId:a.sessionId,approvalId:t,toolName:A.toolName,callId:A.callId,reason:A.reason,settle:g=>{this.#n.delete(s.rpcId)&&(A.signal?.removeEventListener("abort",c),this.#Q({type:"approval/resolved",sessionId:s.sessionId,approvalId:s.approvalId,outcome:g}),r(g))}},c=()=>s.settle("cancelled");this.#n.set(s.rpcId,s),A.signal?.addEventListener("abort",c,{once:!0}),this.#Q(this.#k(s).payload,s.rpcId)})}#y(A){let o=this.#n.get(A?.rpcId);if(o){let i=A?.result?.value;return A?.result?.ok!==!0||!i||typeof i!="object"||i.sessionId!==o.sessionId||i.approvalId!==o.approvalId||i.outcome!=="allowed-once"&&i.outcome!=="rejected"?{accepted:!1,reason:"bad-response"}:(o.settle(i.outcome),{accepted:!0})}let a=this.#r.get(A?.rpcId);if(!a)return{accepted:!1,reason:"not-pending"};if(A?.result?.ok!==!0)return A?.result?.error?.code!=="cancelled"?{accepted:!1,reason:"bad-response"}:(a.settle("cancelled",Wm("the user cancelled ask_user_question","ASK_CANCELLED")),{accepted:!0});if(!RSe(A.result.value,a))return{accepted:!1,reason:"bad-response"};let e={answers:A.result.value.answer.answers.map(i=>({id:i.id,selected:[...i.selected],...i.custom===void 0?{}:{custom:i.custom}}))};return a.settle("answered",e),{accepted:!0}}dispose(){if(!this.#a){this.#a=!0;for(let A of[...this.#A])A.close();this.#s.clear();for(let A of[...this.#n.values()])A.settle("cancelled");for(let A of[...this.#r.values()])A.settle("cancelled",Wm("dsh-im interaction adapter was disposed","ASK_ABORTED"));for(let A of this.#i.splice(0).reverse())A?.()}}};function I4(n){let A=n?.root??n;if(!A||!["object","function"].includes(typeof A))throw new TypeError("dsh-im requires a Cordis Host context");let o=Vm.get(A);if(o)return o;let a=n?.typertGateway;if(!a||typeof a.invoke!="function"||typeof a.stream!="function")throw new TypeError("dsh-im requires the modern Host Typert gateway");let e=new cR(n,a,A);return Vm.set(A,e),typeof n.effect=="function"&&n.effect(()=>()=>{Vm.get(A)===e&&Vm.delete(A),e.dispose()},"dsh-im: modern Harness compatibility API"),e}function vSe(n,A){return n&&Object.hasOwn(n,A)?n[A]:typeof n?.get=="function"?n.get(A):void 0}function Vr(n,A={}){return A.harnessBaseUrl!==void 0?{baseUrl:new URL(A.harnessBaseUrl)}:{apiProxy:vSe(n,"apiProxy")??I4(n),interactionScope:n.root??n}}import{randomUUID as PSe}from"node:crypto";function GSe(n){if(typeof n?.get!="function")return;let A;try{A=n.get("agents")}catch{return}if(A!=null){if(typeof A.get!="function")throw new TypeError('dsh-im requires a callable AgentRegistry when ctx.get("agents") is present');return A}}function FSe(n,A,o){if(n?.status!=="running")return!1;let a=typeof n?.session?.snapshotEvents=="function"?n.session.snapshotEvents():n?.session?.events;if(!Array.isArray(a))return!1;let e=null,i=!1;for(let t of a){if(t?.type==="turn/start"){e=t.data?.turn??null,i=!1;continue}if(t?.type==="turn/end"&&t.data?.turn===e){e=null,i=!1;continue}e===A&&t?.type==="user/message"&&t.data?.source?.rpcId===o&&(i=!0)}return e===A&&i}function l4(n){if(!n||typeof n!="object"||Object.isFrozen(n))return n;for(let A of Object.values(n))l4(A);return Object.freeze(n)}function LSe(n,A){return l4({id:PSe(),role:"user",content:[{type:"text",text:n}],source:{kind:"user",rpcId:A}})}function USe(n){let A=new Error("Session is busy with an active turn or maintenance task",{cause:n});return A.code="agent-busy",A}function HSe(n){return({sessionId:A,expectedTurn:o,promptRpcId:a,inputRpcId:e,action:i,text:t})=>{let r=n.get(A);if(r){if(!FSe(r,o,a))return!1;if(i==="stop")return r.cancel({kind:"user"},{keepInbox:!0}),!0;if(i==="steer")return typeof t!="string"||!t.trim()||typeof e!="string"||!e?!1:(r.inject(LSe(t,e)),!0);throw new TypeError(`Unsupported Harness control action: ${String(i)}`)}}}function xSe(n){return({sessionId:A,operation:o})=>{if(typeof o!="function")throw new TypeError("maintenance operation is required");let a=n.get(A);if(!a)return o();try{return a.runMaintenance(e=>{if(n.get(A)!==a){let i=new Error("Session agent changed before maintenance started");throw i.code="agent-unavailable",i}return o(e)})}catch(e){throw USe(e)}}}function KSe(n,{inboundTtlService:A}={}){return({sessionId:o,workspace:a,files:e,signal:i})=>{let r=n.get(o)?.session?.header?.cwd,s=typeof r=="string"&&r?r:a;if(typeof s!="string"||!s)throw new uo("inbound-file-workspace-unavailable","The Harness Session workspace is unavailable for inbound files.");let c=wJ({files:e},{workspace:s,signal:i,...A?{retention:A.stagingRetention()}:{},...typeof A?.trackDirectory=="function"?{onStagedDirectory:g=>A.trackDirectory(g)}:{}});return A?c.then(g=>g&&A.trackStaged(g)):c}}function Li(n,A={}){let{controlExecutor:o,sessionMaintenanceExecutor:a,fileIngressExecutor:e,inboundTtlService:i}=A;if(o!==void 0&&typeof o!="function")throw new TypeError("controlExecutor must be a function");if(a!==void 0&&typeof a!="function")throw new TypeError("sessionMaintenanceExecutor must be a function");if(e!==void 0&&typeof e!="function")throw new TypeError("fileIngressExecutor must be a function");if(i!==void 0&&(typeof i?.stagingRetention!="function"||typeof i?.trackStaged!="function"))throw new TypeError("inboundTtlService must expose stagingRetention() and trackStaged()");let t=o&&a&&e?void 0:GSe(n);return{controlExecutor:o??(t?HSe(t):void 0),sessionMaintenanceExecutor:a??(t?xSe(t):void 0),fileIngressExecutor:e??KSe(t??{get:()=>{}},{inboundTtlService:i})}}import{homedir as owe}from"node:os";import{join as nwe,resolve as E4}from"node:path";import{randomUUID as jSe}from"node:crypto";import{mkdir as JSe,readdir as qSe,readFile as zSe,rename as VSe,unlink as p4,writeFile as WSe}from"node:fs/promises";import{basename as ZSe,dirname as h4,join as XSe}from"node:path";var YSe=/^[+-]?\d+$/;function RC(n){let A=n;if(typeof A=="string"){let o=A.trim();if(!YSe.test(o))return null;A=Number(o)}return typeof A!="number"||!Number.isInteger(A)?null:A===-1?-1:A>=0&&A<=8760?A:null}var d4=1,$Se=-1;function ewe(){let n=new Error("Invalid inbound attachment TTL hours.");return n.code="inbound-ttl-invalid",n}async function twe(n,A){await JSe(h4(n),{recursive:!0,mode:448});let o=`${n}.${jSe()}.tmp`;try{await WSe(o,`${JSON.stringify(A,null,2)}
239
239
  `,{encoding:"utf8",mode:384,flag:"wx"}),await VSe(o,n)}finally{await p4(o).catch(a=>{if(a.code!=="ENOENT")throw a})}}var Zm=class{#t;#e=168;constructor(A){if(typeof A!="string"||!A)throw new TypeError("inbound TTL store path is required");this.#t=A}async load(){let A;try{A=await zSe(this.#t,"utf8")}catch(o){if(o?.code!=="ENOENT")throw o;return this.#e=168,await this.#A(),this}return this.#e=this.#r(A)??$Se,await this.#A(),this}async#A(){let A=h4(this.#t),o=`${ZSe(this.#t)}.`;try{let a=await qSe(A);await Promise.all(a.filter(e=>e.startsWith(o)&&e.endsWith(".tmp")).map(e=>p4(XSe(A,e)).catch(()=>{})))}catch{}}#r(A){let o;try{o=JSON.parse(A)}catch{return null}return!o||typeof o!="object"||Array.isArray(o)||o.version!==d4?null:o.inboundAttachmentTtlHours===void 0?168:RC(o.inboundAttachmentTtlHours)}getTtlHours(){return this.#e}async setTtlHours(A){let o=RC(A);if(o===null)throw ewe();return await twe(this.#t,{version:d4,inboundAttachmentTtlHours:o}),this.#e=o,o}};import{realpathSync as Awe}from"node:fs";import{resolve as rwe}from"node:path";var iwe=30*6e4,awe=1440*6e4;function u4({store:n,logger:A=console,intervalMs:o=iwe}={}){if(!n||typeof n.getTtlHours!="function")throw new TypeError("createInboundTtlService requires a store exposing getTtlHours()");let a=new Map,e=new Set,i=null,t=()=>{f().catch(b=>{A.error?.("[dsh-im] inbound attachment sweep failed",b)})};function r(b){if(typeof b!="function")throw new TypeError("inbound TTL workspace provider must be a function");let T=e.size===0;return e.add(b),T&&i&&t(),()=>{e.delete(b)}}function s(){return n.getTtlHours()===0?"turn":"persistent"}function c(b){try{return Awe(b)}catch{return null}}function g(b,{now:T=()=>Date.now()}={}){if(typeof b!="string"||!b)return;let N=T();a.set(b,N);let P=c(b);P&&P!==b&&a.set(P,N)}function I(b){a.delete(b);let T=c(b);T&&T!==b&&a.delete(T)}function d(b){let T=a.get(b);return T===void 0?!1:Date.now()-T>=awe?(a.delete(b),!1):!0}function B(b){if(!b||typeof b!="object")return b;let{directory:T}=b;if(typeof T!="string"||!T)return b;g(T);let N=typeof b.cleanup=="function"?b.cleanup:null;return Object.freeze({...b,async cleanup(){try{await N?.call(b)}finally{I(T)}}})}async function f(){let b=n.getTtlHours();if(b===-1)return{deletedDirectories:0,sweptWorkspaces:0};let T=new Set;for(let k of e)try{let K=await k();for(let Y of Array.isArray(K)?K:[])typeof Y=="string"&&Y&&T.add(rwe(Y))}catch(K){A.warn?.("[dsh-im] inbound TTL workspace provider failed",K)}let N=k=>d(k)||c(k)!==null&&d(c(k)),P=0,x=0;for(let k of T)try{let K=await DJ(k,b,{isTracked:N});P+=K.deleted,x+=1}catch(K){A.warn?.(`[dsh-im] inbound attachment sweep failed under ${k}`,K)}return P>0&&A.info?.(`[dsh-im] inbound attachment sweep deleted ${P} directories across ${x} workspaces (ttl ${b}h)`),{deletedDirectories:P,sweptWorkspaces:x}}function Q(){i||(t(),i=setInterval(t,o),i.unref?.())}function y(){i&&(clearInterval(i),i=setInterval(t,o),i.unref?.())}function m(){i&&(clearInterval(i),i=null)}return Object.freeze({registerWorkspaceProvider:r,stagingRetention:s,trackDirectory:g,trackStaged:B,sweepNow:f,start:Q,resetSweepSchedule:y,stop:m})}var Xm=new Map;function swe(n={}){let A=E4(n.dshHome??process.env.DSH_HOME??nwe(owe(),".dsh"));return E4(A,"integrations","dsh-im","settings.json")}function Wr(n,A={}){let o=swe(A),a=Xm.get(o);if(a)return a.runtime;let e=typeof n?.logger=="function"?n.logger("dsh-im:inbound-ttl"):n?.logger??console,i=new Zm(o),t=u4({store:i,logger:e}),r=Object.freeze({store:i,service:t}),s={runtime:r};return Xm.set(o,s),i.load().then(()=>t.start(),c=>e.error?.("[dsh-im] unable to load inbound attachment settings; sweeping stays disabled",c)),typeof n?.effect=="function"&&n.effect(()=>()=>{Xm.get(o)===s&&(Xm.delete(o),t.stop())},"dsh-im: stop inbound attachment TTL sweeper"),r}function Ui(n,A,{workspaces:o,configStore:a,defaultWorkspace:e,botIdFrom:i=t=>t?.botId}={}){if(!A||typeof A.registerWorkspaceProvider!="function"||!o||typeof o.workspaceFor!="function"||typeof e!="string"||!e)return;let t=A.registerWorkspaceProvider(()=>{let r=typeof a?.list=="function"?a.list():[],s=[e];for(let c of Array.isArray(r)?r:[])try{s.push(o.workspaceFor(i(c)))}catch{}return s});return typeof n?.effect=="function"&&n.effect(()=>t,"dsh-im: unregister inbound TTL workspaces"),t}function C4(n){return n.map(A=>({id:A,canExecuteCommands:!0}))}function ig(n=[]){return km({mode:"open",open:{defaultCanExecuteCommands:!0,commandPermissionOverrides:[]},allowlist:{users:C4(n)}})}function II(n=[]){return km({mode:"allowlist",open:{defaultCanExecuteCommands:!1,commandPermissionOverrides:[]},allowlist:{users:C4(n)}})}function ag(n){return[...new Set((Array.isArray(n)?n:[n]).filter(A=>typeof A=="string"||typeof A=="number"||typeof A=="bigint").map(A=>String(A).trim()).filter(Boolean))]}function cwe(n){return ag(n).map(A=>`${A.replace(/^\+/,"")}@s.whatsapp.net`)}function er(n,A={}){let o=String(n??"").trim().toLowerCase();if(o==="weixin")return rg({direct:II(),group:II()});if(o==="feishu"){let e=ag(A.ownerOpenIds??A.ownerOpenId).includes("*")?ig():II();return rg({direct:e,group:e})}if(o==="qq"){let a=ag(A.ownerUserOpenid);return rg({direct:a.includes("*")?ig():II(),group:ig()})}if(o==="telegram"){let a=ag(A.allowedUsers);return(A.accessMode??"compatible")==="private-allowlist"?rg({direct:II(a),group:II()}):rg({direct:ig(a),group:ig()})}if(o==="whatsapp"){let a=A.accessMode??"self-only",e=cwe(A.allowedNumbers);return a==="open"?rg({direct:ig(e),group:ig()}):rg({direct:II(a==="private-allowlist"?e:[]),group:II()})}if(["dingtalk","wecom","wecom-app","slack","discord","imessage"].includes(o))return rg({direct:ig(),group:ig()});throw new TypeError(`Unsupported access-policy channel: ${n}`)}function gwe(n,A={}){let o=String(n??"").trim().toLowerCase();if(o==="weixin")return ag(A.ownerUserId);if(o==="feishu")return ag(A.ownerOpenIds??A.ownerOpenId).filter(a=>a!=="*");if(o==="dingtalk"){let a=Array.isArray(A.approvedSenders)?A.approvedSenders:[];return ag(a.map(e=>e?.staffId))}return o==="qq"?ag(A.ownerUserOpenid).filter(a=>a!=="*"):o==="whatsapp"?ag(A.accountJid):[]}function Hi(n,A,{channel:o,config:a,equals:e}={}){if(!n||typeof n.accessPolicyFor!="function")throw new TypeError("A workspace store with access policies is required");let i=new Set(gwe(o,a)),t=typeof e=="function"?e:(r,s)=>r===s;return Object.freeze({botId:A,getSettings:()=>n.accessPolicyFor(A),isPrivileged(r,s){if(!["direct","group"].includes(s))return!1;let c=Array.isArray(r)?r:[r];try{return c.some(g=>typeof g=="string"&&[...i].some(I=>t(g.trim(),I)===!0))}catch{return!1}}})}function dwe(n){let A=Yl(n.dshHome??process.env.DSH_HOME??kC(lwe(),".dsh")),o=Yl(n.dataDir??kC(A,"integrations","dsh-dingtalk"));return{root:o,config:Yl(n.configPath??kC(o,"config.json")),bots:Yl(n.botsDir??kC(o,"bots")),workspaces:Yl(n.workspacesPath??kC(o,"workspaces.json"))}}async function IR(n,A={},o={}){if(!n?.credentials)throw new TypeError("dsh-dingtalk requires ctx.credentials");let a=Vr(n,A),e=o.ConfigStore??lm,i=o.DeviceAuth??pm,t=o.StateStore??Rm,r=o.HarnessClient??Fm,s=o.Controller??gC,c=o.Runtime??bC,g=o.createConnectionSupervisor??aR,I=typeof n.logger=="function"?n.logger("dsh-dingtalk"):n.logger??console,d=()=>Mi(n),B=dwe(A),f=await new e(B.config).load(),Q=Yl(A.workspace??process.cwd()),y=o.WorkspaceStore??zr,m=o.workspaces??await new y(B.workspaces,{defaultWorkspace:Q}).load(),b=typeof f.list=="function",T=b?f.list():[];b&&await m.reconcile(T.map(te=>te.botId)),await Promise.all(T.map(te=>m.ensure(te.botId,{defaultAgentPreset:A.agentPreset,initialAccessPolicy:er("dingtalk",te)})));let N=typeof f.remove=="function"?ki(f,{workspaces:m}):f,P=o.deviceAuth??new i({baseUrl:A.registrationBaseUrl}),x=new Map,k=te=>Yl(B.bots,te,"state.json"),K=async te=>{let pe=x.get(te);return pe||(pe=await new t(k(te)).load(),x.set(te,pe)),pe},Y=Fi(n,o.commandExecutor),G=o.inboundTtl??Wr(n,A),v=G?.service??G;Ui(n,v,{workspaces:m,configStore:N,defaultWorkspace:Q});let{controlExecutor:j,sessionMaintenanceExecutor:F,fileIngressExecutor:R}=Li(n,{controlExecutor:o.controlExecutor,sessionMaintenanceExecutor:o.sessionMaintenanceExecutor,fileIngressExecutor:o.fileIngressExecutor,inboundTtlService:v}),L=new r({...a,workspace:Q,autostart:!1,dshBin:A.dshBin??"dsh",...Y?{commandExecutor:Y}:{},...j?{controlExecutor:j}:{},...F?{sessionMaintenanceExecutor:F}:{},...R?{fileIngressExecutor:R}:{}}),V=()=>Ri(L),Z=new s({deviceAuth:P,credentials:n.credentials,configStore:N,logger:I,createRuntime:async({botId:te,config:pe,clientSecret:me})=>{let we=await K(te);await m.ensure(te,{defaultAgentPreset:A.agentPreset,initialAccessPolicy:er("dingtalk",pe)});let Re=vi(L,{botId:te,workspaces:m,state:we,agentPresetCatalog:d});return new c({config:pe,clientSecret:me,harness:Re.harness,state:Re.state,contextEnhancement:{botId:te,getSettings:()=>m.contextEnhancementFor(te)},accessPolicy:Hi(m,te,{channel:"dingtalk",config:pe}),replyTimeoutMs:A.replyTimeoutMs??6e5,maxMessageChars:A.maxMessageChars??4e3,connectTimeoutMs:A.connectTimeoutMs??15e3,logger:{error:(...Ce)=>I.error?.(`[${te}]`,...Ce),warn:(...Ce)=>I.warn?.(`[${te}]`,...Ce),info:(...Ce)=>I.info?.(`[${te}]`,...Ce),debug:(...Ce)=>I.debug?.(`[${te}]`,...Ce)}})},deleteState:async({botId:te})=>{let pe=x.get(te);if(x.delete(te),pe&&typeof pe.remove=="function")await pe.remove();else try{await Iwe(k(te))}catch(me){if(me?.code!=="ENOENT")throw me}}}),$=Pi(Z,{workspaces:m,stateFor:K,agentPresetCatalog:d,modelCatalog:V}),ne=g({controller:$,harness:L,logger:I,retryDelaysMs:A.retryDelaysMs,healthyIntervalMs:A.healthyIntervalMs}).start();return{controller:$,deliveryAdapter:Gi({channel:"dingtalk",workspaces:m,coreController:Z,stateFor:K}),ready:ne.ready,async close(){await ne.close(),await $.close(),L.stopManagedProcess()}}}function xi(n){try{return!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).length!==2||typeof n.botId!="string"||!/^[A-Za-z0-9_-]{1,128}$/.test(n.botId)?!1:(xl(n.alias),!0)}catch{return!1}}var pwe=new Set(["loopback","trusted-host"]);function vA(n){if(n===void 0)return"trusted-host";if(pwe.has(n))return n;throw new TypeError('dsh-im rpcAuthority must be "loopback" or "trusted-host"')}function hwe(n){if(!/^\/[A-Za-z0-9._~-]+$/.test(n))throw new TypeError("Invalid IM RPC channel");return`dsh-im${n}`}function B4(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function f4(n){if(!n)return!1;try{let A=new URL(`http://${n}`);if(A.username||A.password||A.pathname!=="/"||A.search||A.hash)return!1;let o=A.hostname.replace(/\.$/,"");return o==="localhost"||o==="[::1]"||/^127\.\d+\.\d+\.\d+$/.test(o)}catch{return!1}}function uwe(n){if(!f4(n.headers.get("host")))return!1;let A=n.headers.get("origin");if(A===null)return!0;try{let o=new URL(A);return["http:","https:"].includes(o.protocol)&&f4(o.host)}catch{return!1}}function Q4(n,A){let o=A.ok===!1?{...A,error:{...A.error,details:A.error.details??{}}}:A;return Response.json({type:"server-response",rpcId:n,result:o})}function SA(n,A,o,{authority:a}={}){let e=vA(a),i=hwe(A);if(typeof n?.connection?.fetch?.register!="function")throw new TypeError("DSH Host Connection Fetch registry is required");return n.connection.fetch.register({path:`/api/${i}`,methods:["POST"],requestBody:"buffered",async fetch(t){if(e==="loopback"&&!uwe(t))return new Response("forbidden",{status:403});if(t.method!=="POST")return new Response("method not allowed",{status:405});if(t.headers.get("content-type")?.split(";",1)[0].trim().toLowerCase()!=="application/json")return new Response("content type must be application/json",{status:415});let r;try{r=await t.json()}catch{return new Response("body is not JSON",{status:400})}let s=typeof r?.rpcId=="string"?r.rpcId:"invalid-request",c=r?.payload;if(!B4(r)||r.type!=="client-request"||typeof r.rpcId!="string"||r.method!==i||!B4(c)||typeof c.method!="string"||!Object.hasOwn(c,"payload"))return Q4(s,{ok:!1,error:{code:"gateway/bad-request",message:"Invalid IM management request."}});try{return Q4(s,await o(c.method,c.payload,t.signal))}catch{return new Response("IM management handler failed",{status:500})}}})}import Bwe from"qrcode";var La="bot.context-enhancement.set";function Ki(n){try{return!n||typeof n!="object"||Array.isArray(n)||Reflect.ownKeys(n).length!==2||!Object.hasOwn(n,"botId")||!Object.hasOwn(n,"config")||typeof n.botId!="string"||!/^[A-Za-z0-9_-]{1,128}$/.test(n.botId)?!1:(Hl(n.config),!0)}catch{return!1}}var Yi="bot.access-policy.set";function ji(n){try{return!n||typeof n!="object"||Array.isArray(n)||Reflect.ownKeys(n).length!==2||!Object.hasOwn(n,"botId")||!Object.hasOwn(n,"policy")||typeof n.botId!="string"||!/^[A-Za-z0-9_-]{1,128}$/.test(n.botId)?!1:(nI(n.policy),!0)}catch{return!1}}import{isAbsolute as Ewe}from"node:path";var Ua="bot.workspace.set";function Ji(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)&&Object.keys(n).every(A=>["botId","workspace"].includes(A))&&typeof n.botId=="string"&&/^[A-Za-z0-9_-]{1,128}$/.test(n.botId)&&typeof n.workspace=="string"&&n.workspace.length<=4096&&Ewe(n.workspace.trim())}function Ha(n){return["workspace-not-absolute","workspace-not-found","workspace-not-directory","workspace-bot-not-found","agent-preset-invalid","agent-preset-unavailable","model-selection-invalid","model-selection-unavailable","model-reasoning-unavailable","context-enhancement-invalid"].includes(n?.code)?{code:n.code,message:n.message}:null}var xa="bot.preset.set";function Cwe(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function qi(n){return Cwe(n)&&Object.keys(n).every(A=>["botId","agentPreset"].includes(A))&&typeof n.botId=="string"&&/^[A-Za-z0-9_-]{1,128}$/.test(n.botId)&&(n.agentPreset===null||typeof n.agentPreset=="string"&&DN.test(n.agentPreset))}var Ka="bot.model.set";function y4(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function zi(n){return!y4(n)||!Object.keys(n).every(A=>["botId","model"].includes(A))||typeof n.botId!="string"||!/^[A-Za-z0-9_-]{1,128}$/.test(n.botId)?!1:n.model===null?!0:y4(n.model)&&Object.keys(n.model).every(A=>["provider","model","reasoningEffort"].includes(A))&&cI(n.model)!==null}var eS="/dingtalk",NA=Object.freeze({status:"connection.status",beginProvisioning:"provision.begin",pollProvisioning:"provision.poll",cancelProvisioning:"provision.cancel",bindCredentials:"bot.bind-credentials",reconnectBot:"bot.reconnect",deleteBot:"bot.delete",setWorkspace:Ua,setModel:Ka,setAgentPreset:xa,setContextEnhancement:La,setAccessPolicy:Yi,setAlias:si,approveSender:"bot.sender.approve",revokeSender:"bot.sender.revoke"}),S4=Object.freeze(Object.values(NA)),fwe=new Set(["clientSecret","client_secret","deviceCode","device_code","secretRef","staffId","senderStaffId","verificationUrl","verificationUri","userCode"]);function tS(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function lI(n,A){return tS(n)&&Object.keys(n).every(o=>A.includes(o))}function jl(n){return typeof n=="string"&&/^[A-Za-z0-9_-]{1,128}$/.test(n)}function m4(n,A){return typeof n=="string"&&n.trim().length>0&&n.length<=A}function Qwe(n,A){return tS(A)?n===NA.status?lI(A,[])?null:"connection.status does not accept fields.":n===NA.beginProvisioning?lI(A,["locale"])&&(A.locale===void 0||A.locale==="zh-CN")?null:"provision.begin received unsupported fields.":[NA.pollProvisioning,NA.cancelProvisioning].includes(n)?lI(A,["attemptId"])&&jl(A.attemptId)?null:`${n} requires an attemptId.`:n===NA.bindCredentials?lI(A,["clientId","clientSecret"])&&m4(A.clientId,256)&&m4(A.clientSecret,1024)?null:"bot.bind-credentials requires Client ID and Client Secret.":n===NA.reconnectBot?lI(A,["botId","sendTest"])&&jl(A.botId)&&(A.sendTest===void 0||A.sendTest===!0)?null:"bot.reconnect requires a botId and optional sendTest=true.":n===NA.deleteBot?lI(A,["botId","confirm"])&&jl(A.botId)&&A.confirm===!0?null:"bot.delete requires a botId and confirm=true.":n===NA.setWorkspace?Ji(A)?null:"\u8BF7\u8F93\u5165\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84\u3002":n===NA.setModel?zi(A)?null:"\u8BF7\u9009\u62E9\u6709\u6548\u6A21\u578B\u3002":n===NA.setAgentPreset?qi(A)?null:"\u8BF7\u9009\u62E9 Agent Preset\u3002":n===NA.setContextEnhancement?Ki(A)?null:"\u8BF7\u63D0\u4EA4\u6709\u6548\u7684\u4E0A\u4E0B\u6587\u589E\u5F3A\u8BBE\u7F6E\u3002":n===NA.setAccessPolicy?ji(A)?null:"\u8BF7\u63D0\u4EA4\u6709\u6548\u7684\u8BBF\u95EE\u8BBE\u7F6E\u3002":n===NA.setAlias?xi(A)?null:"\u8BF7\u8F93\u5165\u6709\u6548\u7684\u522B\u540D\uFF08\u6700\u591A 80 \u4E2A\u5B57\u7B26\uFF09\u3002":n===NA.approveSender?lI(A,["botId","requestId","confirm"])&&jl(A.botId)&&jl(A.requestId)&&A.confirm===!0?null:"bot.sender.approve requires botId, requestId, and confirm=true.":n===NA.revokeSender?lI(A,["botId","senderKey","confirm"])&&jl(A.botId)&&jl(A.senderKey)&&A.confirm===!0?null:"bot.sender.revoke requires botId, senderKey, and confirm=true.":"Unknown DingTalk endpoint.":"Payload must be an object."}function $m(n){return{ok:!1,error:{code:"bad-request",message:n}}}function vC(){return{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}}function ywe(){return{ok:!1,error:{code:"dingtalk-operation-failed",message:"\u9489\u9489\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"}}}function mwe(n){if(n?.name!=="DingtalkPublicConnectionError"||!tS(n.publicError))return null;let A=n.publicError,o=typeof A.code=="string"&&/^[a-z][a-z\d-]{1,79}$/.test(A.code)?A.code:null,a=typeof A.message=="string"&&A.message.trim()?A.message.trim().slice(0,240):null,e=typeof A.hint=="string"&&A.hint.trim()?A.hint.trim().slice(0,480):null,i=typeof A.referenceId=="string"&&/^DT-CONN-[A-F0-9]{8}$/.test(A.referenceId)?A.referenceId:null;return o&&a&&e&&i?{code:o,message:a,hint:e,referenceId:i}:null}function oh(n){if(Array.isArray(n))return n.map(oh);if(!tS(n))return n;let A={};for(let[o,a]of Object.entries(n))fwe.has(o)||(A[o]=oh(a));return A}async function Swe(n){return Bwe.toDataURL(n,{type:"image/png",errorCorrectionLevel:"M",margin:2,width:320})}async function lR(n,A){return!n||typeof n.verificationUrl!="string"?oh(n):oh({...n,qrCodeDataUrl:await A(n.verificationUrl)})}async function un(n,A){let o=structuredClone(n);return o?.provisioning&&(o.provisioning=await lR(o.provisioning,A)),oh(o)}function wwe(n){for(let A of["status","startProvisioning","registrationStatus","cancelProvisioning","bindCredentials","reconnectBot","deleteBot","approveSender","revokeSender"])if(typeof n?.[A]!="function")throw new TypeError(`A complete DingTalk controller is required (${A})`)}function AS(n,{encodeQr:A=Swe}={}){wwe(n);let o=new Map,a=e=>{let i=o.get(e);return i||(o.size>=16&&o.delete(o.keys().next().value),i=Promise.resolve().then(()=>A(e)),o.set(e,i)),i};return async(e,i,t)=>{if(t?.aborted)return vC();if(!S4.includes(e))return $m("Unknown DingTalk endpoint.");let r=Qwe(e,i);if(r)return $m(r);try{let s;if(e===NA.status)s=await un(await n.status(),a);else if(e===NA.beginProvisioning){let c=await n.startProvisioning({signal:t});if(t?.aborted)return await n.cancelProvisioning(c.attemptId),vC();s=await lR(c,a)}else if(e===NA.pollProvisioning){let c=await n.registrationStatus(i.attemptId);if(!c)return $m("The provisioning attempt no longer exists.");s=await lR(c,a)}else if(e===NA.cancelProvisioning){if(s=await n.cancelProvisioning(i.attemptId),!s)return $m("The provisioning attempt no longer exists.");s=oh(s)}else if(e===NA.bindCredentials)s=await un(await n.bindCredentials(i),a);else if(e===NA.reconnectBot){let c=await n.reconnectBot(i.botId);if(t?.aborted)return vC();let g;if(i.sendTest===!0)if(!c?.bots?.some(d=>d?.botId===i.botId&&d?.connected===!0)||typeof n.sendConnectionTest!="function")g=jA(ZA("\u9489\u9489\u673A\u5668\u4EBA"));else try{await n.sendConnectionTest(i.botId),g=jA()}catch(d){g=jA(d)}s=await un({...c,...g?{testMessage:g}:{}},a)}else if(e===NA.deleteBot)s=await un(await n.deleteBot(i.botId),a);else if(e===NA.setWorkspace){if(typeof n.updateWorkspace!="function")throw new Error("Workspace update is unavailable");s=await un(await n.updateWorkspace(i.botId,i.workspace),a)}else if(e===NA.setModel){if(typeof n.updateModel!="function")throw new Error("Model update is unavailable");s=await un(await n.updateModel(i.botId,i.model),a)}else if(e===NA.setContextEnhancement){if(typeof n.updateContextEnhancement!="function")throw new Error("Context enhancement update is unavailable");s=await n.updateContextEnhancement(i.botId,i.config,c=>un(c,a))}else if(e===NA.setAlias){if(typeof n.updateAlias!="function")throw new Error("Alias update is unavailable");s=await n.updateAlias(i.botId,i.alias,c=>un(c,a))}else if(e===NA.setAccessPolicy){if(typeof n.updateAccessPolicy!="function")throw new Error("Access policy update is unavailable");s=await n.updateAccessPolicy(i.botId,i.policy,c=>un(c,a))}else if(e===NA.setAgentPreset){if(typeof n.updateAgentPreset!="function")throw new Error("Agent preset update is unavailable");s=await un(await n.updateAgentPreset(i.botId,i.agentPreset),a)}else e===NA.approveSender?s=await un(await n.approveSender(i.botId,i.requestId),a):s=await un(await n.revokeSender(i.botId,i.senderKey),a);return t?.aborted?vC():{ok:!0,value:s}}catch(s){let c=Ha(s),g=mwe(s);return t?.aborted?vC():c?{ok:!1,error:c}:g?{ok:!1,error:g}:ywe()}}}function dR(n,A,o,a){return SA(n,eS,AS(A,o),{authority:vA(a)})}var w4={weixin:"\u5FAE\u4FE1",feishu:"\u98DE\u4E66",dingtalk:"\u9489\u9489",wecom:"\u4F01\u4E1A\u5FAE\u4FE1","wecom-app":"\u4F01\u4E1A\u5FAE\u4FE1\u5E94\u7528",qq:"QQ",slack:"Slack",telegram:"Telegram",discord:"Discord",whatsapp:"WhatsApp",office:"AI Office"},Dwe=new Set(["dsh-weixin config contains invalid account data","dsh-feishu config contains an invalid bot entry","dsh-feishu config contains duplicate bot identities","dsh-feishu config is incomplete or invalid","dsh-dingtalk config contains invalid bot data",...["Enterprise WeChat","Enterprise WeChat app","QQ","Slack","Telegram","Discord"].map(n=>`dsh-im ${n} config contains invalid bot data`),"dsh-im WhatsApp config contains invalid account data","dsh-im AI Office config is invalid","dsh-im workspace config is invalid"]);function D4(n){return{code:`${n}-initializing`,message:S("{channel}\u6B63\u5728\u521D\u59CB\u5316\uFF0C\u8BF7\u7A0D\u540E\u91CD\u65B0\u8BFB\u53D6\u3002",{channel:S(w4[n])}),details:{}}}function rS(n,A){let o={channel:S(w4[n]),id:n};return A instanceof SyntaxError||Dwe.has(A?.message)?{code:`${n}-startup-config-invalid`,message:n==="office"?S("{channel}\u914D\u7F6E\u683C\u5F0F\u9519\u8BEF\u3002\u8BF7\u68C0\u67E5\u5176\u6570\u636E\u76EE\u5F55\u4E2D\u7684 config.json\uFF0C\u4FEE\u590D\u540E\u91CD\u542F DSH\u3002\u8BE6\u7EC6\u539F\u56E0\u8BF7\u67E5\u770B\u542F\u52A8\u65E5\u5FD7\u3002",o):S("{channel}\u914D\u7F6E\u683C\u5F0F\u9519\u8BEF\u3002\u8BF7\u68C0\u67E5\u5176\u6570\u636E\u76EE\u5F55\u4E2D\u7684 config.json \u548C workspaces.json\uFF0C\u4FEE\u590D\u540E\u91CD\u542F DSH\u3002\u8BE6\u7EC6\u539F\u56E0\u8BF7\u67E5\u770B\u542F\u52A8\u65E5\u5FD7\u3002",o),details:{}}:A?.code==="EACCES"||A?.code==="EPERM"?{code:`${n}-startup-permission-denied`,message:S("\u65E0\u6CD5\u8BFB\u53D6\u6216\u5199\u5165{channel}\u914D\u7F6E\u3002\u8BF7\u68C0\u67E5\u5176\u6570\u636E\u76EE\u5F55\u7684\u8BBF\u95EE\u6743\u9650\uFF0C\u4FEE\u590D\u540E\u91CD\u542F DSH\u3002\u8BE6\u7EC6\u539F\u56E0\u8BF7\u67E5\u770B\u542F\u52A8\u65E5\u5FD7\u3002",o),details:{}}:{code:`${n}-startup-failed`,message:S("{channel}\u521D\u59CB\u5316\u5931\u8D25\u3002\u8BF7\u67E5\u770B DSH \u542F\u52A8\u65E5\u5FD7\u4E2D failed to activate {id} \u540E\u7684\u9519\u8BEF\uFF0C\u4FEE\u590D\u540E\u91CD\u542F DSH\u3002",o),details:{}}}function bwe(n,A,o,a){if(typeof o?.refreshCommandMenus!="function")return;let e=Im(()=>{Promise.resolve().then(()=>o.refreshCommandMenus()).catch(i=>a.warn?.(`[dsh-im] failed to re-send the ${A} command menu after a language change`,i))});n.effect(()=>e,`dsh-im: follow the host language for ${A} command menus`)}async function Tr(n,A,{channel:o,rpcChannel:a,createProduction:e,createHandler:i,reportStartupError:t}){let r=D4(o),s=async()=>({ok:!1,error:r}),c=SA(n,a,(Q,y,m)=>m?.aborted?{ok:!1,error:{code:"cancelled",message:"The request was cancelled.",details:{}}}:s(Q,y,m),{authority:vA(A.rpcAuthority)}),g=typeof n.logger=="function"?n.logger(`dsh-im:${o}`):n.logger??console,I,d,B,f=()=>B??=(async()=>{try{await d?.()}finally{await I?.close()}})();try{I=await e(),d=A.deliveryService&&I.deliveryAdapter?A.deliveryService.registerAdapter(I.deliveryAdapter):void 0;let Q=i(I.controller);n.effect(()=>f,`dsh-im: close ${o} connections`),bwe(n,o,I.controller,g),s=Q}catch(Q){r=t?t(Q,!1):rS(o,Q),t||g.error?.(`[dsh-im] failed to activate ${o}; management RPC remains available`,Q);try{await f()}catch(y){t?t(y,!0):g.error?.(`[dsh-im] failed to close partially initialized ${o} resources`,y)}}return c}async function b4(n,A={}){return A?.controller?dR(n,A.controller,A.rpcOptions,A.rpcAuthority):Tr(n,A,{channel:"dingtalk",rpcChannel:eS,createProduction:()=>IR(n,A,A.internals),createHandler:o=>AS(o,A.rpcOptions)})}import{createHash as Owe}from"node:crypto";import{mkdir as Mwe,readFile as _we,rename as Twe,unlink as Nwe,writeFile as Rwe}from"node:fs/promises";import{dirname as kwe}from"node:path";var pR=Object.freeze({version:1,bots:Object.freeze([])});function og(n){return typeof n=="string"&&n.trim()?n.trim():null}function O4(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Jl(n,{botPrefix:A,tokenRefPrefix:o}){let a=og(n);if(!a)throw new TypeError("platformId is required");let e=Owe("sha256").update(a).digest("hex").slice(0,24);return{botId:`${A}_${e}`,tokenRef:`${o}_${e.toUpperCase()}`}}function nh(n,A){let o=og(n)??"";return o.length<=10?o?`${o.slice(0,3)}\u2022\u2022\u2022`:A:`${o.slice(0,6)}\u2022\u2022\u2022\u2022${o.slice(-4)}`}var dI=class{#t;#e;#A;#r;#n;#l;#s;#i=pR;#a=Promise.resolve();constructor(A,{channel:o,botPrefix:a,tokenRefPrefix:e,normalizeBotExtension:i=()=>({})}){if(typeof i!="function")throw new TypeError("normalizeBotExtension must be a function");this.#t=A,this.#e=o,this.#A=a,this.#r=e,this.#n=i,this.#l=new RegExp(`^${O4(a)}_[a-f0-9]{24}$`),this.#s=new RegExp(`^${O4(e)}_[A-F0-9]{24}$`)}async load(){try{let A=this.#o(JSON.parse(await _we(this.#t,"utf8")));if(!A)throw new Error(`dsh-im ${this.#e} config contains invalid bot data`);this.#i=A}catch(A){if(A?.code!=="ENOENT")throw A;this.#i=pR}return this}list(){return structuredClone(this.#i.bots)}get(A){let o=this.#i.bots.find(a=>a.botId===A);return o?structuredClone(o):null}getByPlatformId(A){let o=this.#i.bots.find(a=>a.platformId===A);return o?structuredClone(o):null}async save(A){let o=this.#c(A);if(!o)throw new Error(`Refusing to persist incomplete ${this.#e} bot data`);return this.#I(a=>{let e=a.find(r=>r.platformId===o.platformId&&r.botId!==o.botId),i=a.find(r=>r.tokenRef===o.tokenRef&&r.botId!==o.botId);if(e||i)throw new Error(`Duplicate ${this.#e} bot identity`);let t=a.findIndex(r=>r.botId===o.botId);return t===-1?a.push(o):a[t]=o,structuredClone(o)})}async remove(A){if(!this.#l.test(A))throw new TypeError(`Invalid ${this.#e} bot id`);return this.#I(o=>{let a=o.findIndex(i=>i.botId===A);if(a===-1)return null;let[e]=o.splice(a,1);return structuredClone(e)})}async clear(){let A=this.#a.then(async()=>{try{await Nwe(this.#t)}catch(o){if(o?.code!=="ENOENT")throw o}this.#i=pR});this.#a=A.then(()=>{},()=>{}),await A}#c(A){if(!A||typeof A!="object")return null;let o=og(A.platformId),a=og(A.botId),e=og(A.tokenRef),i=og(A.name);if(!o||!a||!e||!i||!this.#l.test(a)||!this.#s.test(e))return null;let t=Jl(o,{botPrefix:this.#A,tokenRefPrefix:this.#r});if(t.botId!==a||t.tokenRef!==e)return null;let r=this.#n(A);return!r||typeof r!="object"||Array.isArray(r)?null:Object.freeze({botId:a,platformId:o,tokenRef:e,name:i,username:og(A.username),createdAt:og(A.createdAt)??new Date().toISOString(),connectedAt:og(A.connectedAt),...r})}#o(A){if(!A||A.version!==1||!Array.isArray(A.bots))return null;let o=A.bots.map(t=>this.#c(t));if(o.some(t=>t===null))return null;let a=new Set,e=new Set,i=new Set;for(let t of o){if(a.has(t.botId)||e.has(t.platformId)||i.has(t.tokenRef))return null;a.add(t.botId),e.add(t.platformId),i.add(t.tokenRef)}return Object.freeze({version:1,bots:Object.freeze(o)})}async#I(A){let o,a=this.#a.then(async()=>{let e=[...this.#i.bots];o=A(e);let i=Object.freeze({version:1,bots:Object.freeze(e)});await this.#d(i),this.#i=i});return this.#a=a.then(()=>{},()=>{}),await a,o}async#d(A){await Mwe(kwe(this.#t),{recursive:!0,mode:448});let o=`${this.#t}.tmp`;await Rwe(o,`${JSON.stringify(A,null,2)}
240
240
  `,{encoding:"utf8",mode:384}),await Twe(o,this.#t)}};var M4=Object.freeze({botPrefix:"discord",tokenRefPrefix:"DSH_DISCORD_BOT_TOKEN"});function _4(n){return Jl(n,M4)}function T4(n){return nh(n,S("Discord\u673A\u5668\u4EBA"))}var iS=class extends dI{constructor(A){super(A,{channel:"Discord",...M4})}};function PC(n){return typeof n=="string"&&n.trim()?n.trim():null}function GC(n,A){return Object.freeze({code:n,message:A})}var pI=class{#t;#e;#A;#r;#n;#l;#s;#i;#a;#c=new Map;#o=new Map;#I=new Map;#d=0;#g=!1;constructor({descriptor:A,credentials:o,configStore:a,inspectToken:e,deriveIdentity:i,maskPlatformId:t,createRuntime:r,deleteState:s=async()=>{},logger:c=console}){if(!A?.key||!A?.label||!A?.connectionLabel)throw new TypeError("TokenBotController requires a channel descriptor");if(!o||typeof o.resolve!="function"||typeof o.set!="function"||typeof o.unset!="function")throw new TypeError(`${A.label} requires the DSH credential provider`);if(!a||typeof a.list!="function"||typeof a.save!="function"||typeof a.remove!="function")throw new TypeError(`${A.label} requires a config store`);if(typeof e!="function"||typeof i!="function"||typeof t!="function"||typeof r!="function")throw new TypeError(`${A.label} controller dependencies are incomplete`);this.#t=A,this.#e=o,this.#A=a,this.#r=e,this.#n=i,this.#l=t,this.#s=r,this.#i=s,this.#a=c}async initialize(){if(this.#g)return this.status();for(let A of this.#A.list())await this.#C(A.botId,async()=>{if(this.#g||this.#c.get(A.botId)?.status?.ready)return;let o=await this.#u(A.tokenRef);if(!o){this.#o.set(A.botId,GC("missing-token",S("{label}\u673A\u5668\u4EBA\u51ED\u636E\u7F3A\u5931\uFF0C\u8BF7\u79FB\u9664\u540E\u91CD\u65B0\u63A5\u5165\u3002",{label:this.#t.label})));return}try{await this.#p(A,o),this.#o.delete(A.botId)}catch(a){this.#o.set(A.botId,GC("connection-failed",S("{label}\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002",{label:this.#t.label}))),this.#a.warn?.(`[dsh-im:${this.#t.key}] bot ${A.botId} failed to initialize:`,a)}finally{this.#B()}});return this.status()}async bindCredentials({token:A}={}){if(this.#g)throw new Error(`${this.#t.label} controller is closed`);let o=PC(A);if(!o)throw new TypeError(`${this.#t.label} Bot Token is required`);let a=await this.#r(o),e=PC(a?.platformId),i=PC(a?.name);if(!e||!i)throw new Error(`${this.#t.label} returned an invalid bot identity`);let t=this.#n(e);return await this.#C(t.botId,async()=>{if(this.#g)throw new Error(`${this.#t.label} controller is closed`);let r=this.#A.getByPlatformId(e),s=await this.#e.resolve(t.tokenRef).catch(()=>{}),c={botId:t.botId,platformId:e,tokenRef:t.tokenRef,name:i,username:PC(a.username),createdAt:r?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()};await this.#e.set(t.tokenRef,o);try{await this.#A.save(c)}catch(g){throw await this.#E(t.tokenRef,s),g}try{await this.#p(c,o),this.#o.delete(t.botId)}catch(g){this.#o.set(t.botId,GC("connection-failed",S("{label}\u673A\u5668\u4EBA\u5DF2\u63A5\u5165\uFF0C\u6D88\u606F\u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002",{label:this.#t.label}))),this.#a.warn?.(`[dsh-im:${this.#t.key}] bot ${t.botId} credential connection failed:`,g)}this.#B()}),this.status()}async reconnectBot(A){let o=this.#A.get(A);if(!o)throw new Error(`Unknown ${this.#t.label} bot`);return await this.#C(A,async()=>{let a=await this.#u(o.tokenRef);if(!a)throw new Error(`${this.#t.label} bot token is missing`);try{await this.#p(o,a),this.#o.delete(A)}catch(e){throw this.#o.set(A,GC("connection-failed",S("{label}\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{label:this.#t.label}))),e}finally{this.#B()}}),this.status()}async updateBotConfig(A,o){if(this.#g)throw new Error(`${this.#t.label} controller is closed`);if(typeof o!="function")throw new TypeError("Bot config update must be a function");return await this.#C(A,async()=>{if(this.#g)throw new Error(`${this.#t.label} controller is closed`);let a=this.#A.get(A);if(!a)throw new Error(`Unknown ${this.#t.label} bot`);let e=await this.#u(a.tokenRef);if(!e)throw new Error(`${this.#t.label} bot token is missing`);if(this.#g)throw new Error(`${this.#t.label} controller is closed`);let i=o(a),t=await this.#A.save(i);try{await this.#p(t,e),this.#o.delete(A)}catch(r){throw this.#o.set(A,GC("connection-failed",S("{label}\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{label:this.#t.label}))),r}finally{this.#B()}}),this.status()}async sendConnectionTest(A){let o=this.#A.get(A);if(!o)throw new Error(`Unknown ${this.#t.label} bot`);return this.#C(A,async()=>{let a=this.#c.get(A);if(!a?.status?.ready||typeof a.sendConnectionTest!="function"){let i=new Error(S("{label}\u673A\u5668\u4EBA\u5C1A\u672A\u8FDE\u63A5",{label:this.#t.label}));throw i.code="test-target-unavailable",i}let e=S("{name}\uFF08{id}\uFF09",{name:o.name,id:this.#l(o.platformId)});return await a.sendConnectionTest(yi(e,S("{label}\u673A\u5668\u4EBA",{label:this.#t.label}))),{sent:!0}})}async sendProactiveText(A,o,a,e={}){if(!this.#A.get(A))throw new Error(`Unknown ${this.#t.label} bot`);return this.#C(A,async()=>{let t=this.#c.get(A);if(!t?.status?.ready||typeof t.sendProactiveText!="function"){let r=new Error(S("{label}\u673A\u5668\u4EBA\u5C1A\u672A\u8FDE\u63A5",{label:this.#t.label}));throw r.code="bot-not-connected",r}return t.sendProactiveText(o,a,e)})}async deleteBot(A){let o=this.#A.get(A);if(!o)throw new Error(`Unknown ${this.#t.label} bot`);return await this.#C(A,async()=>{let a=await this.#e.resolve(o.tokenRef).catch(()=>{});await this.#h(A);try{await this.#e.unset(o.tokenRef),await this.#A.remove(A)}catch(e){throw a?.value&&(await this.#e.set(o.tokenRef,a.value).catch(()=>{}),await this.#p(o,a.value).catch(()=>{})),new Error(`Unable to remove the ${this.#t.label} bot safely.`,{cause:e})}await this.#i({botId:A,config:o}).catch(e=>{this.#a.warn?.(`[dsh-im:${this.#t.key}] bot ${A} state cleanup failed:`,e)}),this.#o.delete(A),this.#B()}),this.status()}status(){let A=this.#A.list().map(a=>{let e=this.#c.get(a.botId)?.status??null,i=e?.ready===!0&&e.connectionState==="connected"&&e.harnessReachable===!0,t=i?"connected":e?.connectionState==="connecting"?"connecting":this.#o.has(a.botId)||e?.connectionState==="failed"?"error":"offline";return{botId:a.botId,state:t,connected:i,configured:!0,bot:{name:a.name,username:a.username,idMasked:this.#l(a.platformId)},health:{status:i?"healthy":t==="error"?"error":"offline",summary:i?S("{label}{connectionLabel}\u8FD0\u884C\u6B63\u5E38",{label:this.#t.label,connectionLabel:S(this.#t.connectionLabel)}):t==="error"?S("{label}\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5",{label:this.#t.label}):S("{label}\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF",{label:this.#t.label}),lastCheckedAt:e?.lastCheckedAt??null,lastConnectedAt:e?.lastConnectedAt??null},stats:{messagesReceived:e?.messagesReceived??0,messagesReplied:e?.messagesReplied??0},lastMessageError:jr(e?.lastMessageError),error:structuredClone(this.#o.get(a.botId)??null)}}),o=A.filter(a=>a.connected).length;return{schemaVersion:1,revision:this.#d,state:A.length===0?"disconnected":o===A.length?"connected":o>0?"degraded":"offline",bots:A,totals:{configured:A.length,connected:o}}}async refreshCommandMenus(){return this.#g?0:(await Promise.all([...this.#c].map(async([o,a])=>{if(typeof a?.refreshCommandMenu!="function")return!1;try{return await a.refreshCommandMenu()===!0}catch(e){return this.#a.warn?.(`[dsh-im:${this.#t.key}] bot ${o} command menu refresh failed:`,e),!1}}))).filter(Boolean).length}async close(){this.#g||(this.#g=!0,await Promise.allSettled([...this.#I.values()]),await Promise.allSettled([...this.#c.keys()].map(A=>this.#h(A))))}async#p(A,o){if(this.#g)throw new Error(`${this.#t.label} controller is closed`);if(await this.#h(A.botId),this.#g)throw new Error(`${this.#t.label} controller is closed`);let a=await this.#s({botId:A.botId,config:A,token:o});if(!a||typeof a.start!="function"||typeof a.stop!="function")throw new TypeError(`createRuntime returned an invalid ${this.#t.label} runtime`);this.#c.set(A.botId,a);try{await a.start()}catch(e){throw await a.stop().catch(()=>{}),this.#c.delete(A.botId),e}}async#h(A){let o=this.#c.get(A);this.#c.delete(A),await o?.stop().catch(a=>{this.#a.warn?.(`[dsh-im:${this.#t.key}] bot ${A} failed to stop cleanly:`,a)})}async#u(A){let o=await this.#e.resolve(A).catch(()=>{});return PC(o?.value)}async#E(A,o){o?.value?await this.#e.set(A,o.value).catch(()=>{}):await this.#e.unset(A).catch(()=>{})}#C(A,o){let i=(this.#I.get(A)??Promise.resolve()).catch(()=>{}).then(o).finally(()=>{this.#I.get(A)===i&&this.#I.delete(A)});return this.#I.set(A,i),i}#B(){this.#d+=1}};import{createHash as vwe}from"node:crypto";var Pwe="https://discord.com/api/v10/",Gwe=12e4,Fwe=new Set([50001,50013]),Lwe=new Set([40005]);function Zs(n){return typeof n=="string"&&n.trim()?n.trim():null}function N4(n,A){let o=AbortSignal.timeout(A);return n?AbortSignal.any([n,o]):o}function hR(n){return n?.reason instanceof Error?n.reason:new DOMException("The operation was aborted","AbortError")}function Uwe(n,A){if(!Number.isInteger(n)||n<1)throw new TypeError(`${A} must be a positive integer`);return n}function k4(n,A){return A?.providerCode!==void 0&&(n.providerCode=A.providerCode),A?.retry_after!==void 0&&(n.retry_after=A.retry_after,n.retryAfter=A.retry_after),Number.isInteger(A?.status)&&(n.status=A.status),n}function Hwe(n){let A=Number(n?.providerCode),o=Number(n?.status),a=Zs(n?.message)??"",e="artifact-provider-rejected",i="Discord rejected the attachment.";o===401||o===403||Fwe.has(A)?(e="artifact-permission-required",i="Discord denied permission to send the attachment."):o===413||Lwe.has(A)||/(?:request|attachment|file).{0,24}too large/i.test(a)?(e="artifact-too-large",i="The attachment exceeds Discord's size limit."):o===429?(e="artifact-rate-limited",i="Discord rate-limited attachment delivery."):o>=500&&(e="artifact-delivery-uncertain",i="Discord attachment delivery result is uncertain.");let t=new Error(i,{cause:n});return t.code=e,k4(t,n)}function xwe(n){let A=new Error("Discord attachment delivery result is uncertain",{cause:n});return A.code="artifact-delivery-uncertain",k4(A,n)}function Kwe(n,A){return new Promise((o,a)=>{if(A?.aborted){a(A.reason??new DOMException("Aborted","AbortError"));return}let e=setTimeout(o,n);e?.unref?.(),A?.addEventListener("abort",()=>{clearTimeout(e),a(A.reason??new DOMException("Aborted","AbortError"))},{once:!0})})}function Vi(n,A){let o=Zs(n);if(!o||!/^\d{5,30}$/.test(o))throw new TypeError(`Invalid Discord ${A}`);return o}function R4(n){let A=Zs(n);if(!A)throw new TypeError("A Discord reaction emoji is required");return A}function Ywe(n){return typeof n=="string"&&/^[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{4,}\.[A-Za-z0-9_-]{20,}$/.test(n.trim())}var FC=class{#t;#e;#A;#r;constructor({token:A,fetchImpl:o=fetch,baseUrl:a=Pwe,fileUploadTimeoutMs:e=Gwe}){if(!Ywe(A))throw new TypeError("Discord Bot Token is invalid");if(typeof o!="function")throw new TypeError("DiscordApi requires fetch");this.#t=A.trim(),this.#e=o,this.#A=new URL(a),this.#r=Uwe(e,"fileUploadTimeoutMs")}getCurrentUser(A={}){return this.#n("users/@me",{...A,method:"GET"})}getGatewayBot(A={}){return this.#n("gateway/bot",{...A,method:"GET"})}getChannel({channelId:A,signal:o}={}){return this.#n(`channels/${Vi(A,"channel id")}`,{method:"GET",signal:o})}getMessage({channelId:A,messageId:o,signal:a}={}){return this.#n(`channels/${Vi(A,"channel id")}/messages/${Vi(o,"message id")}`,{method:"GET",signal:a})}startThreadFromMessage({channelId:A,messageId:o,name:a,signal:e}={}){let i=Zs(a);if(!i||[...i].length>100)throw new TypeError("Discord thread name must contain 1-100 characters");if(e?.aborted)throw hR(e);return this.#n(`channels/${Vi(A,"channel id")}/messages/${Vi(o,"message id")}/threads`,{method:"POST",signal:e,body:{name:i}})}createMessage({channelId:A,content:o,replyToMessageId:a,signal:e}){return this.#n(`channels/${Vi(A,"channel id")}/messages`,{method:"POST",signal:e,body:{content:o,allowed_mentions:{parse:[],replied_user:!1},...a?{message_reference:{message_id:Vi(a,"message id"),channel_id:Vi(A,"channel id"),fail_if_not_exists:!1}}:{}}})}async createFileMessage({channelId:A,file:o,replyToMessageId:a,signal:e}){if(!o||typeof o!="object"||typeof o.fileName!="string"||!o.fileName||!Buffer.isBuffer(o.bytes))throw new TypeError("A Discord attachment is required");let i=Zs(o.deliveryKey)??Zs(o.artifactId),t=i?vwe("sha256").update(i).digest("hex").slice(0,25):void 0,r=new FormData;r.append("payload_json",JSON.stringify({allowed_mentions:{parse:[],replied_user:!1},attachments:[{id:0,filename:o.fileName}],...t?{nonce:t,enforce_nonce:!0}:{},...a?{message_reference:{message_id:Vi(a,"message id"),channel_id:Vi(A,"channel id"),fail_if_not_exists:!1}}:{}})),r.append("files[0]",new Blob([o.bytes],{type:o.mediaType??"application/octet-stream"}),o.fileName);let s=Vi(A,"channel id");if(e?.aborted)throw hR(e);let c=N4(e,this.#r);try{return await this.#n(`channels/${s}/messages`,{method:"POST",signal:c,timeoutMs:this.#r,body:r,multipart:!0})}catch(g){throw e?.aborted?hR(e):g?.code?.startsWith?.("discord-")?Hwe(g):xwe(g)}}editMessage({channelId:A,messageId:o,content:a,signal:e}){return this.#n(`channels/${Vi(A,"channel id")}/messages/${Vi(o,"message id")}`,{method:"PATCH",signal:e,body:{content:a,allowed_mentions:{parse:[],replied_user:!1}}})}sendTyping({channelId:A,signal:o}){return this.#n(`channels/${Vi(A,"channel id")}/typing`,{method:"POST",signal:o,expectBody:!1})}async addOwnReaction({channelId:A,messageId:o,emoji:a,signal:e}={}){let i=R4(a);return await this.#n(`channels/${Vi(A,"channel id")}/messages/${Vi(o,"message id")}/reactions/${encodeURIComponent(i)}/@me`,{method:"PUT",signal:e,expectBody:!1,retry:!1}),i}removeOwnReaction({channelId:A,messageId:o,emoji:a,signal:e}={}){let i=R4(a);return this.#n(`channels/${Vi(A,"channel id")}/messages/${Vi(o,"message id")}/reactions/${encodeURIComponent(i)}/@me`,{method:"DELETE",signal:e,expectBody:!1,retry:!1})}async#n(A,{method:o,body:a,signal:e,timeoutMs:i=15e3,expectBody:t=!0,retry:r=!0,multipart:s=!1}){let c;try{c=await this.#e(new URL(A,this.#A),{method:o,headers:{authorization:`Bot ${this.#t}`,...s?{}:{"content-type":"application/json"},"user-agent":"DeepSeek-Harness-dsh-im (https://github.com/xmanrui/dsh-im, 1.1.0)"},...a===void 0?{}:{body:s?a:JSON.stringify(a)},signal:N4(e,i),redirect:"error"})}catch(I){throw I?.name==="AbortError"||I?.name==="TimeoutError"?I:new Error(`Discord ${o} transport failed`)}let g=null;if(t||c.status===429||!c.ok)try{g=await c.json()}catch{if(t){let I=new Error(`Discord ${o} returned invalid JSON`);throw I.status=c?.status,I}}if(c.status===429&&r){let I=Math.min(1e4,Math.max(50,Number(g?.retry_after)*1e3||1e3));return await Kwe(I,e),this.#n(A,{method:o,body:a,signal:e,timeoutMs:i,expectBody:t,retry:!1,multipart:s})}if(!c.ok){let I=new Error(Zs(g?.message)??`Discord API failed with HTTP ${c.status}`);I.code=`discord-${c.status}`,I.status=c.status,(Number.isInteger(g?.code)||typeof g?.code=="string")&&(I.providerCode=g.code);let d=Number(g?.retry_after);throw Number.isFinite(d)&&d>=0&&(I.retry_after=d,I.retryAfter=d),I}return t?g:null}};async function v4(n,A={}){let a=await new FC({token:n,...A}).getCurrentUser();if(!a?.id||a?.bot!==!0)throw new Error("Discord token does not belong to a bot");return{platformId:String(a.id),name:Zs(a.global_name)??Zs(a.username)??S("Discord\u673A\u5668\u4EBA"),username:Zs(a.username)}}var jwe=Object.freeze(["telegram","slack","discord","whatsapp"]);function Nr(n,A,o,{aliases:a=[],...e}={}){return Object.freeze({name:n,description:A,channels:jwe,menuVisible:!0,...e,aliases:Object.freeze(a.map(i=>Object.freeze({menuVisible:!0,...typeof i=="string"?{name:i}:i}))),help:Object.freeze(o)})}var sh=Object.freeze([Nr("new","\u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD",["/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"]),Nr("compact","\u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587",["/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"]),Nr("history","\u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u4EC5\u79C1\u804A\uFF09",["/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09"],{privateOnly:!0}),Nr("workspace","\u5207\u6362\u5DE5\u4F5C\u533A",["/workspace \u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A"],{aliases:["ws"]}),Nr("conv","\u8BBE\u7F6E\u5F53\u524D\u5BF9\u8BDD\u4E13\u5C5E\u5DE5\u4F5C\u533A",["/conv \u6216 /conversation \u67E5\u770B\u5F53\u524D\u5BF9\u8BDD\u5DE5\u4F5C\u533A","/conv \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84\u6216\u5E8F\u53F7 \u8BBE\u7F6E\u5F53\u524D\u5BF9\u8BDD\u4E13\u5C5E\u5DE5\u4F5C\u533A","/conv clear \u6E05\u9664\u4E13\u5C5E\u5DE5\u4F5C\u533A\uFF0C\u56DE\u5230 bot \u9ED8\u8BA4\u5DE5\u4F5C\u533A"],{aliases:["conversation","thread"]}),Nr("workspacelist","\u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84",["/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84","/ws\u3001/wsl\u3001/workspaces \u5DE5\u4F5C\u533A\u547D\u4EE4\u522B\u540D"],{aliases:["workspaces","wsl"]}),Nr("sessionlist","\u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898",["/sessionlist \u6216 /sessions [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898","/sessionlist --limit N \u4EC5\u5217\u51FA\u5F53\u524D\u5DE5\u4F5C\u533A\u524D N \u4E2A\u4F1A\u8BDD"],{aliases:["sessions"]}),Nr("session","\u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD",["/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"]),Nr("models","\u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B",["/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"]),Nr("reasoninglist","\u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7",["/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7"],{aliases:["reasonings"]}),Nr("reasoning","\u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7",["/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7"]),Nr("model","\u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B",["/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B","\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]"]),Nr("presetlist","\u5217\u51FA\u53EF\u7528 Agent Preset",["/presetlist \u6216 /presets \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset"],{aliases:["presets"]}),Nr("preset","\u67E5\u770B\u6216\u8BBE\u7F6E\u65B0\u4F1A\u8BDD Agent Preset",["/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset","\u7EAF\u6570\u5B57 ID\uFF1A/preset id:<ID>","/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"]),Nr("stop","\u505C\u6B62\u5F53\u524D\u4EFB\u52A1",["/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1"]),Nr("steer","\u7EA0\u504F\u5F53\u524D\u4EFB\u52A1",["/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"]),Nr("batch","\u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF09",["/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09"],{privateOnly:!0}),Nr("send","\u63D0\u4EA4\u5F53\u524D\u6279\u6B21",["/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21"],{privateOnly:!0}),Nr("cancel","\u53D6\u6D88\u5F53\u524D\u6279\u6B21",["/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21"],{privateOnly:!0}),Nr("status","\u68C0\u67E5\u8FDE\u63A5\u72B6\u6001",["/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"]),Nr("version","\u67E5\u770B\u63D2\u4EF6\u7248\u672C",["/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C"]),Nr("help","\u663E\u793A\u5E2E\u52A9",["/help \u663E\u793A\u672C\u5E2E\u52A9"])]);function uR(n,A=sh){return A.filter(o=>o.enabled!==!1&&o.channels.includes(n))}function P4(n,A=sh){return uR(n,A).flatMap(o=>o.help.map(a=>S(a)))}var Jwe=Object.freeze({success(){},error(){},clear(){},settled:()=>Promise.resolve()});function G4(n,A){!n||typeof n!="object"||(n[A]=(n[A]??0)+1)}async function qwe(n,A){let o=AbortSignal.timeout(A),a,e=new Promise((i,t)=>{a=()=>t(o.reason??new DOMException("Timed out","TimeoutError")),o.addEventListener("abort",a,{once:!0})});try{return await Promise.race([n(o),e])}finally{o.removeEventListener("abort",a)}}function aS({adapter:n,target:A,reactions:o,status:a,logger:e=console,label:i="channel",timeoutMs:t=2e3}={}){if(!A||typeof n?.addReaction!="function"||typeof n?.removeReaction!="function"||typeof o?.processing!="string"||!o.processing||!Number.isSafeInteger(t)||t<=0)return Jwe;let r=null,s=!1,c=async(B,f)=>{try{let Q=await qwe(f,t);return G4(a,B==="add"?"reactionsAdded":"reactionsRemoved"),{ok:!0,value:Q}}catch(Q){return G4(a,"reactionErrors"),e.warn?.(`[dsh-im:${i}] status reaction ${B} failed:`,Q?.message??Q?.name??String(Q)),{ok:!1,value:null}}},g=async B=>{if(r!==null){let Q=r;r=null,await c("remove",y=>n.removeReaction(A,Q,{signal:y}))}if(typeof B!="string"||!B)return;let f=await c("add",Q=>n.addReaction(A,B,{signal:Q}));f.ok&&f.value!==void 0&&f.value!==null&&(r=f.value)},I=g(o.processing),d=B=>{s||(s=!0,I=I.then(()=>g(B),()=>g(B)),I.catch(()=>{}))};return Object.freeze({success:()=>d(o.success),error:()=>d(o.error),clear:()=>d(null),settled:()=>I})}var F4="\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002",zwe="\u4EFB\u52A1\u5DF2\u5B8C\u6210\u3002";function to(n){return typeof n=="string"?n.trim():""}function Vwe(n,A,o){return A.actor===o&&(n.kind!=="group"||n.addressed===!0)&&!yA(n)&&!uA(n)&&!!to(n.content)}function Wwe(n,A,o){let a=String(n??S("\u7ED3\u679C\u6587\u4EF6")).replace(/[\r\n]+/g," ").trim().slice(0,255)||S("\u7ED3\u679C\u6587\u4EF6");switch(A?.code){case"artifact-delivery-uncertain":return S("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u7684\u53D1\u9001\u7ED3\u679C\u672A\u80FD\u786E\u8BA4\uFF0C\u8BF7\u5148\u68C0\u67E5\u804A\u5929\u5185\u662F\u5426\u5DF2\u6536\u5230\uFF0C\u4E0D\u8981\u7ACB\u5373\u91CD\u8BD5\u3002",{name:a});case"artifact-permission-required":return o?.key==="slack"?S("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46 Slack \u5E94\u7528\u7F3A\u5C11 files:write \u6743\u9650\u3002\u8BF7\u66F4\u65B0 Manifest\u3001\u91CD\u65B0\u5B89\u88C5\u5E94\u7528\u5E76\u91CD\u65B0\u8FDE\u63A5\u673A\u5668\u4EBA\u540E\u91CD\u8BD5\u3002",{name:a}):o?.key==="discord"?S("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u673A\u5668\u4EBA\u7F3A\u5C11 Discord \u7684 Send Messages\u3001Attach Files \u6216 Read Message History \u6743\u9650\u3002",{name:a}):o?.key==="telegram"?S("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46 Telegram \u4E0D\u5141\u8BB8\u673A\u5668\u4EBA\u5728\u5F53\u524D\u804A\u5929\u53D1\u9001\u6587\u6863\uFF0C\u8BF7\u68C0\u67E5\u804A\u5929\u6743\u9650\u3002",{name:a}):S("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u5F53\u524D\u673A\u5668\u4EBA\u6CA1\u6709\u6587\u4EF6\u53D1\u9001\u6743\u9650\uFF0C\u8BF7\u68C0\u67E5\u6E20\u9053\u6743\u9650\u3002",{name:a});case"artifact-too-large":return S("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u8D85\u8FC7\u5F53\u524D\u6E20\u9053\u5927\u5C0F\u4E0A\u9650\uFF0C\u672A\u53D1\u9001\u3002",{name:a});case"artifact-empty":return S("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u4E3A\u7A7A\uFF0C\u672A\u53D1\u9001\u3002",{name:a});case"artifact-invalid":case"artifact-changed":case"artifact-unavailable":return S("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u6216\u51C6\u5907\u53D1\u9001\uFF0C\u8BF7\u786E\u8BA4\u6587\u4EF6\u4ECD\u53EF\u8BBF\u95EE\u540E\u91CD\u8BD5\u3002",{name:a});case"artifact-rate-limited":return S("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u6682\u65F6\u88AB\u5F53\u524D\u6E20\u9053\u9650\u6D41\uFF0C\u672A\u80FD\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:a});case"artifact-provider-rejected":return S("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u5F53\u524D\u6E20\u9053\u62D2\u7EDD\u4E86\u8BE5\u6587\u4EF6\u6216\u6587\u4EF6\u6D88\u606F\u3002",{name:a});default:return S("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u5F53\u524D\u6E20\u9053\u6682\u65F6\u672A\u80FD\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:a})}}function Ya(){return{messagesReceived:0,messagesReplied:0,messagesRejected:0,lastMessageAt:null,lastReplyAt:null,lastRejectedAt:null,lastError:null,lastMessageError:null,reactionsAdded:0,reactionsRemoved:0,reactionErrors:0}}var En=class{#t;#e;#A;#r;#n;#l;#s;#i;#a;#c;#o;#I;#d=new Map;#g=new Map;#p=new Map;#h=new Map;#u=new Set;#E=new Set;#C;#B=new Ga;constructor({descriptor:A,bot:o,harness:a,state:e,contextEnhancement:i,accessPolicy:t,status:r=Ya(),logger:s=console,replyTimeoutMs:c=6e5,signal:g,keepaliveIntervalMs:I=4e3}){if(!A?.key||!A?.label)throw new TypeError("A channel descriptor is required");if(!o||typeof o.sendText!="function")throw new TypeError("A bot client is required");if(!a||!e)throw new TypeError("Harness client and state store are required");this.#t=A,this.#e=o,this.#A=a,this.#r=e,this.#l=i,this.#s=t,this.#i=r,this.#a=s,this.#c=c,this.#o=g,this.#I=I,this.#n=fo({harness:a,state:e,signal:g,logger:s,deliver:(d,B)=>this.#D(d,B)}),this.#C=new va({label:A.key,logger:s})}get status(){return structuredClone(this.#i)}accept(A,{contextSnapshot:o,accessDecision:a}={}){if(this.#o?.aborted)return Promise.resolve();let e=to(A?.conversationId),i=A?.kind==="group"?"group":"direct",t={...A,kind:i,conversationId:e},r=to(t.messageId),s=to(t.senderId);if(!r||!s||!e||t.senderIsBot===!0||this.#r.hasSeen(r)||this.#h.has(r))return Promise.resolve();if(i==="group"&&t.addressed!==!0)return this.#i.messagesRejected+=1,this.#i.lastRejectedAt=new Date().toISOString(),this.#h.set(r,null),this.#S(t,r,null);if(this.#s||a){let I=yA(t),d=uA(t),B=a??Hr(this.#s,{conversationType:i,senderIds:[s,to(t.senderAlternateId)].filter(Boolean),text:t.content,hasImages:I,hasFiles:d});if(!B.allowed)return this.#i.messagesRejected+=1,this.#i.lastRejectedAt=new Date().toISOString(),this.#h.set(r,null),this.#S(t,r,B.reason==="command-not-allowed"?S(fa):null,{recordReceived:B.reason==="command-not-allowed"})}this.#h.set(r,o===void 0?Jr(this.#l,A?.kind):o);let c=aS({adapter:this.#e,target:t.kind==="direct"||t.addressed===!0?t.reactionTarget:null,reactions:this.#t.reactions,status:this.#i,logger:this.#a,label:this.#t.key});t.statusReaction=c;let g=this.#Q(t,r,s);return g.then(()=>c.success(),()=>c.error()),g}#Q(A,o,a){A.kind==="direct"&&po(this.#r,A.connectionTestTarget??A.replyTarget);let e=`${A.kind}:${A.conversationId}`,i=this.#g.get(e),t=to(A.content),r=Fa(t);if(r&&A.kind==="group"&&A.addressed===!0)return this.#S(A,o,zs());if(r&&A.kind==="direct"){if(/^\/batch$/iu.test(t)&&(this.#d.has(e)||i||this.#C.hasPending(e)))return this.#S(A,o,yo());let d=this.#B.handle(e,t,{plainText:!!t&&A.plainText!==!1&&!yA(A)&&!uA(A)&&!_r(A)});if(d.handled)return d.kind==="submit"?this.#m({...A,content:d.prompt,batchSubmission:{token:d.token}},o,a,e):this.#S(A,o,d.message)}else if(A.kind==="direct"&&this.#B.status(e).phase==="collecting"){let I=this.#B.handle(e,t,{plainText:!!t&&A.plainText!==!1&&!yA(A)&&!uA(A)&&!_r(A)});if(I.handled)return this.#S(A,o,I.message)}let c=A.kind==="direct"&&this.#B.status(e).phase==="collecting"?null:wi(t)?Pa:uA(A)?null:oi(t)?Di:Oi(t)?Ca:_i(t)?Ti:null;if(c&&(A.kind!=="group"||A.addressed===!0)){let I;return I=this.#k(A,o,e,c).finally(()=>{this.#h.delete(o),this.#E.delete(I)}),this.#E.add(I),I}let g=this.#C.claimReply({key:e,actor:a,messageId:o,text:yA(A)||uA(A)?"":A.content,addressed:A.kind!=="group"||A.addressed===!0,hasPendingQuestion:!!i,questionCompletion:i?.submitting||i?.claimedReplyMessageId?i.queue:null,isQuestionPending:()=>this.#g.has(e),send:I=>this.#e.sendText(A.replyTarget,I)});if(g){let I;return I=g.process(async()=>this.#r.hasSeen(o)?!1:(await this.#r.markSeen(o),this.#i.messagesReceived+=1,this.#i.lastMessageAt=new Date().toISOString(),!0)).finally(()=>{this.#h.delete(o),this.#u.delete(I)}),this.#u.add(I),I}if(i&&i.actor!==a)return this.#m(A,o,a,e);if(i?.submitting||i?.claimedReplyMessageId)return this.#m(A,o,a,e);if(i){Vwe(A,i,a)&&(i.claimedReplyMessageId=o);let d=(i.queue??Promise.resolve()).catch(()=>{}).then(()=>this.#b(A,o,a,e,i)).finally(()=>{this.#h.delete(o),i.claimedReplyMessageId===o&&(i.claimedReplyMessageId=null),i.queue===d&&(i.queue=null)});return i.queue=d,d}return this.#m(A,o,a,e)}#S(A,o,a,{recordReceived:e=!0}={}){let i;return i=(async()=>{this.#r.hasSeen(o)||(await this.#r.markSeen(o),e&&(this.#i.messagesReceived+=1,this.#i.lastMessageAt=new Date().toISOString()),a&&await this.#e.sendText(A.replyTarget,a),this.#i.lastError=null)})().catch(async t=>{if(this.#o?.aborted){A.statusReaction?.clear();return}A.statusReaction?.error(),this.#i.lastError=t?.message??String(t);let r=Nt(this.#i,t);this.#a.error?.(`[dsh-im:${this.#t.key}] failed to process a batch input message [${r.referenceId}]:`,t)}).finally(()=>{this.#h.delete(o),this.#E.delete(i)}),this.#E.add(i),i}#m(A,o,a,e,{releaseMessageId:i=!0,alreadyRecorded:t=!1}={}){let s=(this.#d.get(e)??Promise.resolve()).catch(()=>{}).then(()=>this.#y(A,o,a,e,{alreadyRecorded:t})).finally(()=>{i&&this.#h.delete(o),this.#d.get(e)===s&&this.#d.delete(e)});return this.#d.set(e,s),s}async#D(A,o){let a=Bo(o);return typeof this.#e.sendDelivery=="function"?this.#e.sendDelivery(A.target,ns(a,o.found?"markdown":"plain")):this.#e.sendText(A.target,a)}async waitForIdle(){await Promise.allSettled([...this.#d.values(),...[...this.#g.values()].flatMap(A=>A.queue?[A.queue]:[]),...this.#u,...this.#E]),await this.#n.whenIdle()}async#k(A,o,a,e){if(this.#r.hasSeen(o))return;await this.#r.markSeen(o),this.#i.messagesReceived+=1,this.#i.lastMessageAt=new Date().toISOString();let i=A.replyTarget;try{let t=await e(to(A.content),this.#A,this.#r,a,{signal:this.#o,isDirect:A.kind==="direct",hasImages:yA(A),hasFiles:uA(A),pendingInteraction:this.#g.has(a)||this.#C.hasPending(a),control:{owner:this,key:a},deferredDelivery:this.#n});t?.stopped&&await Promise.allSettled([this.#R(a),this.#C.closeRoute(a)]);for(let r of t?.messages??[t?.message])r&&await this.#e.sendText(i,r);this.#i.lastError=null}catch(t){if(t?.code==="turn-stopped"||this.#o?.aborted){A.statusReaction?.clear();return}A.statusReaction?.error(),this.#i.lastError=t?.message??String(t);let r=Nt(this.#i,t);this.#a.error?.(`[dsh-im:${this.#t.key}] failed to process a command [${r.referenceId}]:`,t),await this.#e.sendText(i,tA(r)).catch(()=>{})}}sendConnectionTest(A){return In({state:this.#r,text:A,channelLabel:S("{label}\u673A\u5668\u4EBA",{label:this.#t.label}),send:(o,a)=>this.#e.sendText(o,a)})}sendProactiveText(A,o,{signal:a}={}){return a?.throwIfAborted(),this.#e.sendText(A,o)}async#O(A,o,a=[],e){let i=await mo({artifacts:a,baseReceipt:e,deliveryId:o,channelKey:this.#t.key,signal:this.#o,sendImage:typeof this.#e.sendImage=="function"?t=>this.#e.sendImage(A,t):void 0,sendFile:typeof this.#e.sendFile=="function"?t=>this.#e.sendFile(A,t):void 0,onFailure:(t,r)=>Nt(this.#i,r,{userMessage:Wwe(t?.fileName,r,this.#t),reason:r?.code}),sendFailureNotice:(t,r,s)=>this.#e.sendText(A,tA(s)),logger:this.#a});return this.#i.artifactsSent=(this.#i.artifactsSent??0)+i.artifactsSent,this.#i.artifactSendErrors=(this.#i.artifactSendErrors??0)+i.artifactSendErrors,{receipt:i.receipt,userVisible:i.userVisible,artifactSendErrors:i.artifactSendErrors}}async#y(A,o,a,e,{alreadyRecorded:i=!1}={}){if(!i){if(this.#r.hasSeen(o))return;await this.#r.markSeen(o),this.#i.messagesReceived+=1,this.#i.lastMessageAt=new Date().toISOString()}let t=A.replyTarget,r=to(A.content),s=A.batchSubmission,c=null,g=!1,I=null,d=()=>{I!==null&&clearInterval(I),I=null};try{if(this.#o?.throwIfAborted(),A.kind==="group"&&A.addressed!==!0){this.#i.messagesRejected+=1,this.#i.lastRejectedAt=new Date().toISOString();return}let B=yA(A),f=uA(A),Q=_r(A);if(!r&&!B&&!f&&!Q){await this.#e.sendText(t,S("\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u548C\u6587\u4EF6\u6D88\u606F\u3002"));return}let y=r.toLowerCase();if(!B&&!f&&y==="/help"){await this.#e.sendText(t,[S("{label}\u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002",{label:this.#t.label}),"",S("\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002"),...P4(this.#t.key)].join(`
241
- `));return}if(!B&&!f&&y==="/status"){await this.#A.ensureRunning({signal:this.#o}),await this.#e.sendText(t,S("{label}\u673A\u5668\u4EBA\u4E0E DeepSeek Harness \u8FDE\u63A5\u6B63\u5E38\u3002",{label:this.#t.label}));return}let m=!B&&!f?await ha(r,this.#A,e):null;if(m){for(let V of m.messages??[m.message])await this.#e.sendText(t,V);return}if(!B&&!f&&y==="/new"){await this.#r.clearSession(e),await this.#e.sendText(t,S("\u5DF2\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002\u8BF7\u53D1\u9001\u4F60\u7684\u95EE\u9898\u3002"));return}let b=!B&&!f?await ai(r,this.#A,this.#r,e,{signal:this.#o}):null;if(b){await this.#e.sendText(t,b.message);return}await this.#e.sendTyping?.(t).catch(V=>{this.#a.warn?.(`[dsh-im:${this.#t.key}] typing indicator failed:`,V)});let T=!1;if(typeof this.#e.openDeliveryStream=="function")try{c=await this.#e.openDeliveryStream(t),g=!0}catch(V){this.#a.warn?.(`[dsh-im:${this.#t.key}] unable to start a semantic reply stream; using final delivery:`,V)}else if(typeof this.#e.openStream=="function")try{c=await this.#e.openStream(t)}catch(V){this.#a.warn?.(`[dsh-im:${this.#t.key}] unable to start a streamed reply; using text:`,V)}let N=B||Q?await eo(A,{signal:this.#o}):void 0,P=this.#h.get(o),x=!1;if(P){let V=N??r,Z=A.contextSource?.();N=$a(V,P,()=>({channel:this.#t.key,senderId:a,senderName:Z?.senderName,conversationTitle:Z?.conversationTitle,chatId:Z?.chatId??A.conversationId,threadId:Z?.threadId})),x=N!==V}if(c&&c.keepalive===!0&&typeof c.refresh=="function"){let V=!1;I=setInterval(async()=>{if(!V){V=!0;try{await Promise.allSettled([this.#e.sendTyping?.(t),c.refresh()])}catch{}finally{V=!1}}},this.#I),I.unref?.()}let{answer:k,artifacts:K=[]}=await pa({deferredDelivery:()=>({coordinator:this.#n,target:this.#t.key==="whatsapp"?{jid:t.jid,selfChat:t.selfChat}:t}),harness:this.#A,state:this.#r,key:e,text:r,content:N,contextEnhanced:x,createOptions:this.#o?{signal:this.#o}:void 0,existsOptions:this.#o?{signal:this.#o}:void 0,askOptions:{timeoutMs:this.#c,signal:this.#o,control:{owner:this,key:e},onUpdate:c?async V=>{let Z=V.type==="text"?V.text:V.type==="tool"?S("\u6B63\u5728\u4F7F\u7528{name}\u2026",{name:V.name}):V.text;if(Z){let $=V.type==="text"?"markdown":"plain";await c.update(g?ns(Z,$):Z)}}:void 0,onInteraction:V=>this.#T(V,{key:e,actor:a,target:t,requiresMention:A.kind==="group"&&A.requiresMention!==!1}),onInteractionResolved:V=>this.#f(V),files:A.files}});d(),s&&this.#B.complete(e,s.token);let Y=!to(k)&&K.length>0,G=Y?S(zwe):k,v=Y?"plain":"markdown",j=null,F=null;if(c)try{let V=await c.finish(g?ns(G,v):G);T=!0,F=kA({deliveryId:o,presentation:V?.presentation??c.presentation??`${this.#t.key}-stream`,providerMessageIds:[...Ur(c),...Ur(V)],deliveryOutcome:V?.deliveryOutcome,reason:V?.reason})}catch(V){c.cancel?.(),this.#a.warn?.(`[dsh-im:${this.#t.key}] streamed reply finalization failed; using text:`,V)}if(!T)try{let V=typeof this.#e.sendDelivery=="function"?await this.#e.sendDelivery(t,ns(G,v)):await this.#e.sendText(t,G);F=kA({deliveryId:o,presentation:V?.presentation??`${this.#t.key}-text`,providerMessageIds:Ur(V),deliveryOutcome:V?.deliveryOutcome,reason:V?.reason})}catch(V){j=mr(V)}let R=F?.deliveryOutcome==="unknown";F?.deliveryOutcome==="failed"?j=mr(new Error(`Final text delivery failed (${F.reason??"unknown"})`),{uncertain:!1}):R&&(j=mr(new Error(`Final text delivery outcome is unknown (${F.reason??"unknown"})`)));let L=await this.#O(t,o,K,F);if(j&&(!L.userVisible||R))throw j.deliveryReceipt=L.receipt,j;return j&&L.artifactSendErrors===0&&Nt(this.#i,j),L.userVisible&&(this.#i.messagesReplied+=1,this.#i.lastReplyAt=new Date().toISOString(),this.#i.lastError=null,!j&&L.artifactSendErrors===0&&da(this.#i)),L.receipt}catch(B){d();let f=B?.code==="turn-stopped";s&&f&&this.#B.complete(e,s.token);let Q=s&&!f?this.#B.fail(e,s.token):null;if(f){if(A.statusReaction?.clear(),c)try{await c.finish(S("\u5DF2\u505C\u6B62\u3002"))}catch{c.cancel?.()}return}if(this.#o?.aborted){A.statusReaction?.clear(),c?.cancel?.();return}A.statusReaction?.error(),this.#i.lastError=B?.message??String(B);let y=async P=>{let x=typeof c?.fail=="function"?"fail":typeof c?.finish=="function"?"finish":null;if(!x)return!1;try{let k=await c[x](P);return x==="fail"?!!k&&k.deliveryOutcome!=="failed":k!==!1&&k?.deliveryOutcome!=="failed"}catch(k){return this.#a.warn?.(`[dsh-im:${this.#t.key}] unable to finalize the failed stream:`,k),!1}},m=ho(B),b=Eo(B),T=Nt(this.#i,B,{userMessage:b??m,reason:Na(B)?.reason}),N=Q?.retained?`${tA(T)}
241
+ `));return}if(!B&&!f&&y==="/status"){await this.#A.ensureRunning({signal:this.#o}),await this.#e.sendText(t,S("{label}\u673A\u5668\u4EBA\u4E0E DeepSeek Harness \u8FDE\u63A5\u6B63\u5E38\u3002",{label:this.#t.label}));return}let m=!B&&!f?await ha(r,this.#A,e):null;if(m){for(let V of m.messages??[m.message])await this.#e.sendText(t,V);return}if(!B&&!f&&y==="/new"){await this.#r.clearSession(e),await this.#e.sendText(t,S("\u5DF2\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002\u8BF7\u53D1\u9001\u4F60\u7684\u95EE\u9898\u3002"));return}let b=!B&&!f?await ai(r,this.#A,this.#r,e,{signal:this.#o}):null;if(b){await this.#e.sendText(t,b.message);return}await this.#e.sendTyping?.(t).catch(V=>{this.#a.warn?.(`[dsh-im:${this.#t.key}] typing indicator failed:`,V)});let T=!1;if(typeof this.#e.openDeliveryStream=="function")try{c=await this.#e.openDeliveryStream(t),g=!0}catch(V){this.#a.warn?.(`[dsh-im:${this.#t.key}] unable to start a semantic reply stream; using final delivery:`,V)}else if(typeof this.#e.openStream=="function")try{c=await this.#e.openStream(t)}catch(V){this.#a.warn?.(`[dsh-im:${this.#t.key}] unable to start a streamed reply; using text:`,V)}let N=B||Q?await eo(A,{signal:this.#o}):void 0,P=this.#h.get(o),x=!1;if(P){let V=N??r,Z=A.contextSource?.();N=$a(V,P,()=>({channel:this.#t.key,senderId:a,senderName:Z?.senderName,conversationTitle:Z?.conversationTitle,chatId:Z?.chatId??A.conversationId,threadId:Z?.threadId})),x=N!==V}if(c&&c.keepalive===!0&&typeof c.refresh=="function"){let V=!1;I=setInterval(async()=>{if(!V){V=!0;try{await Promise.allSettled([this.#e.sendTyping?.(t),c.refresh()])}catch{}finally{V=!1}}},this.#I),I.unref?.()}let{answer:k,artifacts:K=[]}=await pa({deferredDelivery:()=>({coordinator:this.#n,target:this.#t.key==="whatsapp"?{jid:t.jid,selfChat:t.selfChat}:t}),harness:this.#A,state:this.#r,key:e,text:r,content:N,contextEnhanced:x,createOptions:this.#o?{signal:this.#o}:void 0,existsOptions:this.#o?{signal:this.#o}:void 0,askOptions:{timeoutMs:this.#c,signal:this.#o,control:{owner:this,key:e},onUpdate:c?async V=>{let Z=V.type==="text"?V.text:V.type==="tool"?S("\u6B63\u5728\u4F7F\u7528{name}\u2026",{name:V.name}):V.text;if(Z){let $=V.type==="text"?"markdown":"plain";await c.update(g?ns(Z,$):Z)}}:void 0,onInteraction:async V=>(c?.keepalive===!0&&typeof c.stopPreview=="function"&&(d(),await c.stopPreview()),this.#T(V,{key:e,actor:a,target:t,requiresMention:A.kind==="group"&&A.requiresMention!==!1})),onInteractionResolved:V=>this.#f(V),files:A.files}});d(),s&&this.#B.complete(e,s.token);let Y=!to(k)&&K.length>0,G=Y?S(zwe):k,v=Y?"plain":"markdown",j=null,F=null;if(c)try{let V=await c.finish(g?ns(G,v):G);T=!0,F=kA({deliveryId:o,presentation:V?.presentation??c.presentation??`${this.#t.key}-stream`,providerMessageIds:[...Ur(c),...Ur(V)],deliveryOutcome:V?.deliveryOutcome,reason:V?.reason})}catch(V){c.cancel?.(),this.#a.warn?.(`[dsh-im:${this.#t.key}] streamed reply finalization failed; using text:`,V)}if(!T)try{let V=typeof this.#e.sendDelivery=="function"?await this.#e.sendDelivery(t,ns(G,v)):await this.#e.sendText(t,G);F=kA({deliveryId:o,presentation:V?.presentation??`${this.#t.key}-text`,providerMessageIds:Ur(V),deliveryOutcome:V?.deliveryOutcome,reason:V?.reason})}catch(V){j=mr(V)}let R=F?.deliveryOutcome==="unknown";F?.deliveryOutcome==="failed"?j=mr(new Error(`Final text delivery failed (${F.reason??"unknown"})`),{uncertain:!1}):R&&(j=mr(new Error(`Final text delivery outcome is unknown (${F.reason??"unknown"})`)));let L=await this.#O(t,o,K,F);if(j&&(!L.userVisible||R))throw j.deliveryReceipt=L.receipt,j;return j&&L.artifactSendErrors===0&&Nt(this.#i,j),L.userVisible&&(this.#i.messagesReplied+=1,this.#i.lastReplyAt=new Date().toISOString(),this.#i.lastError=null,!j&&L.artifactSendErrors===0&&da(this.#i)),L.receipt}catch(B){d();let f=B?.code==="turn-stopped";s&&f&&this.#B.complete(e,s.token);let Q=s&&!f?this.#B.fail(e,s.token):null;if(f){if(A.statusReaction?.clear(),c)try{await c.finish(S("\u5DF2\u505C\u6B62\u3002"))}catch{c.cancel?.()}return}if(this.#o?.aborted){A.statusReaction?.clear(),c?.cancel?.();return}A.statusReaction?.error(),this.#i.lastError=B?.message??String(B);let y=async P=>{let x=typeof c?.fail=="function"?"fail":typeof c?.finish=="function"?"finish":null;if(!x)return!1;try{let k=await c[x](P);return x==="fail"?!!k&&k.deliveryOutcome!=="failed":k!==!1&&k?.deliveryOutcome!=="failed"}catch(k){return this.#a.warn?.(`[dsh-im:${this.#t.key}] unable to finalize the failed stream:`,k),!1}},m=ho(B),b=Eo(B),T=Nt(this.#i,B,{userMessage:b??m,reason:Na(B)?.reason}),N=Q?.retained?`${tA(T)}
242
242
 
243
243
  ${Q.message}`:tA(T);if(this.#a.error?.(`[dsh-im:${this.#t.key}] failed to process a message [${T.referenceId}]:`,B),await y(N))return B.deliveryReceipt;c?.cancel?.();try{await this.#e.sendText(t,N)}catch(P){this.#a.error?.(`[dsh-im:${this.#t.key}] failed to send the safe error reply:`,P)}return B.deliveryReceipt}finally{d(),await Promise.allSettled([this.#R(e),this.#C.closeRoute(e)])}}async#b(A,o,a,e,i){if(this.#o?.aborted){A.statusReaction?.clear();return}let t=this.#g.get(e),r=i.claimedReplyMessageId===o;if(!t||t!==i||t.submitting)return r&&(!t||t!==i)?this.#_(A,o):this.#m(A,o,a,e,{releaseMessageId:!1});if(this.#r.hasSeen(o))return;if(await this.#r.markSeen(o),this.#i.messagesReceived+=1,this.#i.lastMessageAt=new Date().toISOString(),A.kind==="group"&&A.addressed!==!0){this.#i.messagesRejected+=1,this.#i.lastRejectedAt=new Date().toISOString();return}let s=A.replyTarget,c=to(A.content);if(!c||yA(A)||uA(A)){try{await this.#e.sendText(s,S("\u8BF7\u7528\u6587\u5B57\u56DE\u7B54\u5F53\u524D\u95EE\u9898\u3002"))}catch(d){this.#a.error?.(`[dsh-im:${this.#t.key}] failed to reject a non-text interaction reply:`,d)}return}let g=this.#g.get(e);if(!g||g!==i||g.submitting)return r&&(!g||g!==i)?this.#_(A,o,{alreadyRecorded:!0}):this.#m(A,o,a,e,{releaseMessageId:!1,alreadyRecorded:!0});if(g.target=s,g.needsPresentation){let d=g.presentationTask!==null;try{await this.#w(g)}catch(f){A.statusReaction?.error(),this.#i.lastError=S("{label}\u4EA4\u4E92\u95EE\u9898\u53D1\u9001\u5931\u8D25\u3002",{label:this.#t.label}),this.#a.error?.(`[dsh-im:${this.#t.key}] failed to retry an interaction question:`,f),g.interaction.reconnect?.();return}let B=this.#g.get(e);if(!B||B!==i||B.submitting)return r&&(!B||B!==i)?this.#_(A,o,{alreadyRecorded:!0}):this.#m(A,o,a,e,{releaseMessageId:!1,alreadyRecorded:!0});if(!d)return}let I=g.questions[g.index];if(I){if(g.answers.push(ka(I,c)),g.index+=1,g.index<g.questions.length){g.claimedReplyMessageId===o&&(g.claimedReplyMessageId=null),g.needsPresentation=!0;try{await this.#w(g)}catch(d){A.statusReaction?.error(),this.#i.lastError=S("{label}\u4EA4\u4E92\u95EE\u9898\u53D1\u9001\u5931\u8D25\u3002",{label:this.#t.label}),this.#a.error?.(`[dsh-im:${this.#t.key}] failed to send the next interaction question:`,d),g.interaction.reconnect?.()}return}g.submitting=!0;try{await g.interaction.respond({ok:!0,value:{sessionId:g.sessionId,answer:{answers:g.answers}}}),this.#N(e,g.interactionId),this.#i.lastError=null}catch(d){if(d?.code==="interaction-not-pending"){if(this.#N(e,g.interactionId),this.#o?.aborted){A.statusReaction?.clear();return}try{await this.#e.sendText(s,S(F4))}catch(B){this.#a.error?.(`[dsh-im:${this.#t.key}] failed to send an expired interaction notice:`,B)}return}if(this.#o?.aborted){A.statusReaction?.clear();return}if(this.#g.get(e)!==g){A.statusReaction?.clear();return}A.statusReaction?.error(),g.submitting=!1,g.answers.pop(),g.index-=1,this.#i.lastError=S("\u56DE\u7B54\u63D0\u4EA4\u5931\u8D25\u3002"),this.#a.error?.(`[dsh-im:${this.#t.key}] failed to answer a Harness interaction:`,d);try{await this.#e.sendText(s,S("\u56DE\u7B54\u63D0\u4EA4\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001\u5F53\u524D\u95EE\u9898\u7684\u7B54\u6848\u3002"))}catch(B){this.#a.error?.(`[dsh-im:${this.#t.key}] failed to send an interaction retry notice:`,B)}}}}async#T(A,{key:o,actor:a,target:e,requiresMention:i}){if(A?.kind==="approval")return this.#C.handleRequested(A,{key:o,actor:a,requiresMention:i,send:g=>this.#e.sendText(e,g)});if(A?.kind!=="question")return;let t=A?.payload?.questions,r=to(A?.interactionId)||to(A?.rpcId);if(!to(A?.rpcId)||!r||!to(A?.sessionId)||!Array.isArray(t)||t.length===0||t.some(g=>!Ra(g))){this.#a.warn?.(`[dsh-im:${this.#t.key}] ignored an invalid Harness question interaction`);return}if(A.recovered===!0){await this.#U(A,`${this.#t.label} safely cancelled an interaction left by an earlier client.`);try{await this.#e.sendText(e,S("\u68C0\u6D4B\u5230\u8FD9\u4E2A Session \u4E2D\u9057\u7559\u7684\u5F85\u56DE\u7B54\u95EE\u9898\uFF0C\u5DF2\u5B89\u5168\u53D6\u6D88\u5E76\u7EE7\u7EED\u5904\u7406\u4F60\u521A\u624D\u7684\u6D88\u606F\u3002"))}catch(g){this.#a.error?.(`[dsh-im:${this.#t.key}] failed to send an interaction recovery notice:`,g)}return}let s=this.#g.get(o);if(s?.interactionId===r){s.interaction=A,s.needsPresentation&&await this.#w(s);return}if(this.#p.has(r))return;if(s){this.#a.warn?.(`[dsh-im:${this.#t.key}] cancelled a second pending Harness question`),await this.#U(A,`${this.#t.label} is already handling another user interaction.`);return}let c={kind:"question",interactionId:r,sessionId:A.sessionId,interaction:A,actor:a,requiresMention:i,questions:t,answers:[],index:0,target:e,queue:null,claimedReplyMessageId:null,submitting:!1,needsPresentation:!0,presentationTask:null};this.#g.set(o,c),this.#p.set(r,o),await this.#w(c)}async#f(A){if(A?.kind==="approval"){await this.#C.handleResolved(A);return}let o=to(A?.interactionId);if(A?.kind!=="question"||!o)return;let a=this.#p.get(o);a&&this.#N(a,o)}#w(A){if(A.presentationTask)return A.presentationTask;let o=A.questions[A.index];if(!o)return Promise.resolve();let a=(async()=>{await this.#e.sendText(A.target,ua(o,A.index,A.questions.length,{requiresMention:A.requiresMention})),A.needsPresentation=!1})();return A.presentationTask=a,a.then(()=>{A.presentationTask===a&&(A.presentationTask=null)},()=>{A.presentationTask===a&&(A.presentationTask=null)}),a}async#_(A,o,{alreadyRecorded:a=!1}={}){if(!a){if(this.#r.hasSeen(o))return;await this.#r.markSeen(o),this.#i.messagesReceived+=1,this.#i.lastMessageAt=new Date().toISOString()}try{await this.#e.sendText(A.replyTarget,S(F4))}catch(e){this.#a.error?.(`[dsh-im:${this.#t.key}] failed to send an expired interaction notice:`,e)}}#G(A,o){let a=this.#g.get(A);return!a||o!==void 0&&a.interactionId!==o?null:(this.#g.delete(A),this.#p.delete(a.interactionId),a)}#N(A,o){return this.#G(A,o)!==null}async#U(A,o){try{await A.respond({ok:!1,error:{code:"cancelled",message:o,details:{}}},{signal:AbortSignal.timeout(5e3)})}catch(a){if(a?.code!=="interaction-not-pending")throw a}}async#R(A){let o=this.#G(A);if(!(!o||o.kind!=="question"))try{await this.#U(o.interaction,`The ${this.#t.label} interaction ended before the user answered.`)}catch(a){this.#a.warn?.(`[dsh-im:${this.#t.key}] failed to cancel a pending Harness interaction:`,a)}}};var ER=Object.freeze({key:"discord",label:"Discord",connectionLabel:" Gateway \u957F\u8FDE\u63A5",reactions:Object.freeze({processing:"\u{1F440}",success:"\u2705",error:"\u274C"})}),oS=class extends En{constructor(A){super({descriptor:ER,...A})}};var LC=class extends pI{constructor(A){super({...A,descriptor:ER,inspectToken:A.inspectToken??v4,deriveIdentity:_4,maskPlatformId:T4})}};var nS=class extends XA{constructor(A){super({...A,rpcIdPrefix:"discord",logPrefix:"dsh-discord"})}};function Xs(n,A){let o=typeof n=="string"?n.trim():"";if(!o)return[];let a=[],e=o;for(;e.length>A;){let i=e.lastIndexOf(`
244
244
  `,A);i<Math.floor(A*.55)&&(i=e.lastIndexOf(" ",A)),i<Math.floor(A*.55)&&(i=A),a.push(e.slice(0,i).trim()),e=e.slice(i).trimStart()}return e&&a.push(e),a}function ch({initialText:n=S("\u6B63\u5728\u5904\u7406\u2026"),limit:A,updateIntervalMs:o=800,create:a,edit:e,sendRemainder:i,messageIdForResult:t=()=>null,logger:r=console}){let s,c=[],g=null,I=null,d=null,B=!1,f=n,Q=()=>{B||I!==null||d||!g||(I=setTimeout(()=>{I=null;let y=g;g=null;let m=Xs(y,A)[0]??n;d=Promise.resolve(m===f?void 0:e(s,m)).then(()=>{f=m}).catch(b=>r.warn?.("[dsh-im] streamed message update failed:",b)).finally(()=>{d=null,Q()})},o),I?.unref?.())};return{get messageId(){return s},get providerMessageIds(){return[...c]},async start(){return s=await a(n),(typeof s=="string"&&s.trim()||Number.isSafeInteger(s))&&c.push(String(s)),this},update(y){B||typeof y!="string"||!y.trim()||(g=y,Q())},async finish(y){if(B)throw new Error("Message stream is already closed");B=!0,I!==null&&clearTimeout(I),I=null,g=null,await d?.catch(()=>{});let m=Xs(y,A),b=m[0]??S("\u5904\u7406\u5B8C\u6210\u3002");b!==f&&await e(s,b),f=b;for(let T of m.slice(1)){let N=await i(T),P=t(N);(typeof P=="string"&&P.trim()||Number.isSafeInteger(P))&&c.push(String(P))}},cancel(){B=!0,g=null,I!==null&&clearTimeout(I),I=null}}}async function L4(n){try{await n?.body?.cancel?.()}catch{}}function Zwe(n,A){return!Array.isArray(A)||A.some(o=>typeof o=="string"&&(n.hostname===o||o.startsWith(".")&&(n.hostname===o.slice(1)||n.hostname.endsWith(o))))}async function gh(n,{fetchImpl:A=fetch,headers:o,signal:a,allowedHosts:e}={}){let i=new URL(n);if(i.protocol!=="https:")throw new Error("File download URL must use HTTPS");if(!Zwe(i,e))throw new Error("File download URL is not hosted by the messaging platform");let t=await A(i,{method:"GET",headers:o,signal:a,redirect:"manual"});if(Number.isInteger(t?.status)&&t.status>=300&&t.status<400){await L4(t);let r=new Error(`File download redirect was blocked (HTTP ${t.status})`);throw r.code="file-redirect-blocked",r}if(!t?.ok){await L4(t);let r=new Error(`File download failed with HTTP ${t?.status??"unknown"}`);throw r.code="file-http-error",r.status=t?.status,r}if(t.body?.[Symbol.asyncIterator])return{stream:t.body};if(typeof t.arrayBuffer=="function"){let r=Buffer.from(await t.arrayBuffer());return{stream:(async function*(){yield r})()}}throw new Error("File download returned no readable body")}var Xwe=37377,$we=5e3,U4=Object.freeze([1e3,3e3,5e3,1e4,3e4]),eDe=0,tDe=5,ADe=10,rDe=11,iDe=12,aDe=new Set([ADe,rDe,iDe]),oDe=new Set(["image/jpeg","image/png","image/webp","image/gif"]),nDe=new Map([[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".png","image/png"],[".webp","image/webp"],[".gif","image/gif"]]),Y4=Object.freeze(["cdn.discordapp.com"]);function sDe(n){let A=new URL(n);if(A.protocol!=="wss:")throw new Error("Discord returned an insecure Gateway URL");return A.searchParams.set("v","10"),A.searchParams.set("encoding","json"),A.href}function CR(n,A,o){if(typeof n.addEventListener=="function")n.addEventListener(A,o);else if(typeof n.on=="function")n.on(A,o);else throw new TypeError("Discord WebSocket does not support events")}function cDe(n){return typeof n=="string"?n:typeof n?.data=="string"?n.data:Buffer.isBuffer(n)?n.toString("utf8"):Buffer.isBuffer(n?.data)?n.data.toString("utf8"):null}function gDe(n){if(n===4004){let o=new Error(S("Discord Bot Token \u65E0\u6548\uFF0C\u8BF7\u91CD\u65B0\u586B\u5199\u3002"));return o.code="discord-401",o}if(n===4013||n===4014){let o=new Error(S("Discord Gateway Intents \u914D\u7F6E\u4E0D\u6B63\u786E\uFF0C\u8BF7\u68C0\u67E5 Developer Portal \u7684 Bot \u8BBE\u7F6E\u3002"));return o.code="discord-intents",o}let A=new Error(`Discord Gateway closed (${n||"unknown"})`);return A.code="discord-gateway-closed",A}function j4(n,A){return typeof n!="string"?"":n.replace(new RegExp(`<@!?${A}>`,"g"),"").trim()}function IDe(n,A){return[...j4(n?.content??"",A).replace(/\s+/g," ").trim()||"DeepSeek Harness"].slice(0,100).join("")}function QR(n){return aDe.has(Number(n?.type))}function J4(n,A){return QR(n)&&String(n?.id??"")===String(A?.id??"")&&String(n?.parent_id??"")===String(A?.channel_id??"")}function BR(n,A){return n?.id&&A?.(n),n}function ql(n,A,o,{fromSourceMessage:a=!1,fallback:e=null,notice:i=null}={}){let t=String(A?.id??n.conversationId),r=QR(A),s=r&&String(A?.owner_id??"")===String(o),c=r&&A?.parent_id?String(A.parent_id):t;return{...n,conversationId:t,addressed:n.addressed||s,requiresMention:r?!s:n.kind==="group",replyTarget:{channelId:t,...!a&&n.replyTarget?.replyToMessageId?{replyToMessageId:n.replyTarget.replyToMessageId}:{},...i?{notice:i}:{}},connectionTestTarget:{channelId:t},conversationRoute:{peerId:c,...r?{threadId:t,managed:s}:{},...e?{fallback:e}:{}}}}function lDe(n){let A=Number(n?.status);return!Number.isInteger(A)||A>=500}function H4(n){let A=new Error("Discord Thread creation result is uncertain",{cause:n});return A.code="discord-thread-create-uncertain",A}async function dDe(n,A,{signal:o,onChannel:a}={}){try{let e=BR(await n.getChannel({channelId:String(A.id),signal:o}),a);return J4(e,A)?e:null}catch(e){if(e?.status===404)return null;throw e}}async function x4(n,A,o){try{await n.createMessage({channelId:A.replyTarget.channelId,replyToMessageId:A.replyTarget.replyToMessageId,content:S("Thread \u521B\u5EFA\u7ED3\u679C\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\u3002\u82E5\u5DF2\u521B\u5EFA\uFF0C\u8BF7\u5728\u5BF9\u5E94 Thread \u4E2D\u91CD\u8BD5\uFF1B\u82E5\u672A\u521B\u5EFA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u65B0 @\u673A\u5668\u4EBA\u3002"),signal:o})}catch(a){if(o?.aborted)throw o.reason??a}}function q4(n){let A=typeof n?.content_type=="string"?n.content_type.split(";",1)[0].trim().toLowerCase():"";if(oDe.has(A))return A;let o=typeof n?.filename=="string"?n.filename.toLowerCase():"";for(let[a,e]of nDe)if(o.endsWith(a))return e;return null}function z4(n){return Number.isSafeInteger(n)&&n>=0?n:void 0}function pDe(n,A){let o=q4(n);return!o||typeof n?.url!="string"?null:{name:typeof n.filename=="string"?n.filename:void 0,mediaType:o,size:z4(n.size),load:a=>dn(n.url,{...a,fetchImpl:A,allowedHosts:Y4})}}function hDe(n,A){if(q4(n)||typeof n?.url!="string"||!n.url)return null;let o=typeof n.content_type=="string"&&n.content_type?n.content_type.split(";",1)[0].trim().toLowerCase():void 0;return{name:typeof n.filename=="string"&&n.filename?n.filename:String(n.id??"discord-file"),...o?{mediaType:o}:{},size:z4(n.size),load:({signal:a}={})=>gh(n.url,{fetchImpl:A,signal:a,allowedHosts:Y4})}}function uDe(n){if(!n||typeof n!="object")return null;let A=typeof n.content_type=="string"?n.content_type.split(";",1)[0].trim().toLowerCase():"",o=A.startsWith("image/")?"image":A.startsWith("audio/")?"audio":A.startsWith("video/")?"video":"file",a=typeof n.filename=="string"&&n.filename?n.filename:void 0;return{kind:o,...a?{name:a}:{}}}function K4(n,A){if(!n||typeof n!="object")return null;let o=typeof n.id=="string"&&n.id?n.id:A,a=typeof n.author?.id=="string"&&n.author.id?n.author.id:void 0,e=[n.member?.nick,n.author?.global_name,n.author?.username].find(t=>typeof t=="string"&&t.trim()),i=Array.isArray(n.attachments)?n.attachments.map(uDe).filter(Boolean):[];return Array.isArray(n.sticker_items)&&i.push(...n.sticker_items.map(t=>({kind:"image",...typeof t?.name=="string"&&t.name?{name:t.name}:{}}))),{...o?{messageId:String(o)}:{},...a?{authorId:a}:{},...e?{authorName:e}:{},content:typeof n.content=="string"?n.content:"",attachments:i}}function EDe(n,A){let o=String(n?.channel_id??""),a=typeof n?.message_reference?.message_id=="string"&&n.message_reference.message_id?n.message_reference.message_id:void 0,e=n?.message_reference?.channel_id;if(e!==void 0&&String(e)!==o)return{...a?{messageId:a}:{},unavailableReason:"not-found"};if(Object.hasOwn(n??{},"referenced_message")){if(n.referenced_message===null)return{...a?{messageId:a}:{},unavailableReason:"deleted"};if(n.referenced_message&&typeof n.referenced_message=="object"){let i=typeof n.referenced_message.id=="string"&&n.referenced_message.id?n.referenced_message.id:void 0;return String(n.referenced_message.channel_id??"")!==o||!i||a&&i!==a?{...a?{messageId:a}:{},unavailableReason:"not-found"}:K4(n.referenced_message,a)??void 0}}if(a)return typeof A!="function"?{messageId:a,unavailableReason:"not-delivered"}:{messageId:a,load:async({signal:i}={})=>{let t=await A({channelId:o,messageId:a,signal:i});return!t||String(t.id??"")!==a||String(t.channel_id??"")!==o?null:K4(t,a)}}}function V4(n,A,{fetchImpl:o=fetch,loadReply:a}={}){if(!n?.id||!n?.channel_id||!n?.author?.id||Number(n.type)===21)return null;let e=!n.guild_id,i=e||n.mentions?.some(r=>String(r?.id)===String(A)),t=EDe(n,a);return{messageId:String(n.id),senderId:String(n.author.id),contextSource:()=>({senderName:[n.member?.nick,n.author.global_name,n.author.username].find(r=>typeof r=="string"&&r.trim())}),senderIsBot:n.author.bot===!0,kind:e?"direct":"group",conversationId:String(n.channel_id),content:j4(n.content??"",A),plainText:(!Array.isArray(n.attachments)||n.attachments.length===0)&&(!Array.isArray(n.sticker_items)||n.sticker_items.length===0)&&!n.poll,images:Array.isArray(n.attachments)?n.attachments.map(r=>pDe(r,o)).filter(Boolean):[],files:Array.isArray(n.attachments)?n.attachments.map(r=>hDe(r,o)).filter(Boolean):[],...t?{replyTo:t}:{},addressed:i,replyTarget:{channelId:String(n.channel_id),replyToMessageId:String(n.id)},reactionTarget:{channelId:String(n.channel_id),messageId:String(n.id)},connectionTestTarget:{channelId:String(n.channel_id)}}}async function CDe(n,A,{api:o,channel:a,fetchImpl:e=fetch,signal:i,onChannel:t}={}){let r=V4(n,A,{fetchImpl:e,loadReply:typeof o?.getMessage=="function"?I=>o.getMessage(I):void 0});if(!r||r.senderIsBot)return r;if(i?.throwIfAborted(),r.kind==="direct")return ql(r,{id:r.conversationId,type:1},A);if(!o||typeof o.getChannel!="function")throw new TypeError("Discord route resolution requires the Discord API");let s=BR(a??await o.getChannel({channelId:r.conversationId,signal:i}),t);if(QR(s)||!r.addressed)return ql(r,s,A);let c=Number(s?.type);if(c!==eDe&&c!==tDe)return ql(r,s,A,{fallback:"unsupported-channel",notice:"\u5F53\u524D\u9891\u9053\u4E0D\u652F\u6301\u81EA\u52A8\u521B\u5EFA Thread\uFF0C\u5DF2\u76F4\u63A5\u5728\u5F53\u524D\u9891\u9053\u56DE\u590D\u3002"});i?.throwIfAborted();let g;try{if(g=BR(await o.startThreadFromMessage({channelId:r.conversationId,messageId:r.messageId,name:IDe(n,A),signal:i}),t),!J4(g,n))throw new Error("Discord returned an invalid thread for the source message")}catch(I){let d;try{d=await dDe(o,n,{signal:AbortSignal.timeout($we),onChannel:t})}catch(B){throw i?.aborted?i.reason??I:(await x4(o,r,i),H4(B))}if(d)return ql(r,d,A,{fromSourceMessage:!0});if(i?.aborted)throw i.reason??I;if(lDe(I))throw await x4(o,r,i),H4(I);return ql(r,s,A,{fallback:"thread-create-failed",notice:"\u65E0\u6CD5\u521B\u5EFA Thread\uFF0C\u5DF2\u76F4\u63A5\u5728\u5F53\u524D\u9891\u9053\u56DE\u590D\u3002"})}return ql(r,g,A,{fromSourceMessage:!0})}var fR=class{#t;#e;#A=new WeakSet;constructor({api:A,signal:o}){this.#t=A,this.#e=o}async sendText(A,o){let a=!this.#A.has(A)&&A?.notice?String(A.notice):null,e=Xs(a?`${a}
@@ -436,7 +436,7 @@ ${T}`:x),await c()}catch(x){this.#a.error?.("[dsh-im:qq] failed to send the safe
436
436
  `,{encoding:"utf8",mode:384}),await dYe(t,this.#t),this.#e=i});return this.#A=a.then(()=>{},()=>{}),await a,o}};var BYe="https://slack.com/api/",Of="files.slack.com",fYe="slack.com",eee="/files-pri/",QYe=Object.freeze([Of]),yYe="/upload/",mYe=12e4;function hc(n){return typeof n=="string"&&n.trim()?n.trim():null}function tee(n,A){let o=AbortSignal.timeout(A);return n?AbortSignal.any([n,o]):o}function Df(n){return n?.reason instanceof Error?n.reason:new DOMException("The operation was aborted","AbortError")}function SYe(n,A){if(!Number.isInteger(n)||n<1)throw new TypeError(`${A} must be a positive integer`);return n}function Aee(n,A){return A?.providerCode!==void 0&&(n.providerCode=A.providerCode),Number.isInteger(A?.status)&&(n.status=A.status),n}function kd(n){let A="artifact-provider-failed",o="Slack file upload preparation failed";n?.code==="slack-file_upload_size_restricted"?(A="artifact-too-large",o="Slack rejected the result file because it is too large"):n?.code==="slack-missing-scope"?(A="artifact-permission-required",o="Slack file delivery requires the files:write scope"):n?.code?.startsWith?.("slack-")&&(A="artifact-provider-rejected",o="Slack rejected file upload preparation");let a=new Error(o,{cause:n});return a.code=A,Aee(a,n)}function wYe(n){let A=new Error("Slack file completion result is uncertain",{cause:n});return A.code="artifact-delivery-uncertain",Aee(A,n)}function DYe(n){return Number.isInteger(n)&&n>=300&&n<400}async function G2(n){try{await n?.body?.cancel?.()}catch{}}function bYe(n){let A=new URL(n);if(A.protocol!=="https:")throw new Error("Image download URL must use HTTPS");if(A.username||A.password||A.port&&A.port!=="443")throw new Error("Image download URL is not hosted by the messaging platform");if(A.hostname===fYe&&A.pathname.startsWith(eee)&&(A.hostname=Of),A.hostname!==Of||!A.pathname.startsWith(eee))throw new Error("Image download URL is not hosted by the messaging platform");return A.hash="",A}function OYe(n){let A=new URL(n);if(A.protocol!=="https:"||A.username||A.password||A.port&&A.port!=="443"||A.hostname!==Of||!A.pathname.startsWith(yYe))throw new Error("Slack returned an unsafe file upload URL");return A.hash="",A}function MYe(n,A){let o=n?.headers?.get?.("location");if(!o)return null;try{return new URL(o,A)}catch{return null}}function _Ye(n){let A=n?.headers?.get?.("x-oauth-scopes");return A==null?null:new Set(A.split(",").map(o=>o.trim()).filter(Boolean))}function TYe(n){return n?.protocol==="https:"&&!n.username&&!n.password&&(!n.port||n.port==="443")&&n.hostname.endsWith(".slack.com")&&n.hostname!==Of&&n.pathname==="/"&&n.searchParams.has("redir")}function NYe(n,A){return new Promise((o,a)=>{if(A?.aborted){a(A.reason??new DOMException("Aborted","AbortError"));return}let e=setTimeout(o,n);e?.unref?.(),A?.addEventListener("abort",()=>{clearTimeout(e),a(A.reason??new DOMException("Aborted","AbortError"))},{once:!0})})}function Tn(n,A){let o=hc(n);if(!o||!/^[A-Z][A-Z0-9]{4,30}$/i.test(o))throw new TypeError(`Invalid Slack ${A}`);return o}function fs(n,A){let o=hc(n);if(!o)throw new TypeError(`Slack ${A} is required`);return o}function bf(n,{trim:A=!0}={}){let o=typeof n=="string"?n:"",a=A?o.trim():o;if(!a)throw new TypeError("Slack message text is required");return a.replace(/<@([A-Z0-9]+)>/gi,"@$1").replace(/<!(channel|here|everyone)(?:\^[^>]*)?>/gi,"@$1")}function RYe(n,A,o){let a=hc(A?.error)??"unknown_error",e=new Error(`Slack ${n} failed: ${a.replaceAll("_"," ")}`);return e.providerCode=a,["invalid_auth","not_authed","token_revoked","account_inactive"].includes(a)?e.code=o==="app"?"slack-invalid-app-token":"slack-invalid-bot-token":a==="missing_scope"?e.code="slack-missing-scope":a==="method_not_supported_for_channel_type"||a==="channel_type_not_supported"||a==="deprecated_endpoint"?e.code="slack-stream-unavailable":e.code=`slack-${a}`,e}function ree(n){return typeof n=="string"&&/^xoxb-[A-Za-z0-9-]{16,}$/.test(n.trim())}function iee(n){return typeof n=="string"&&/^xapp-[A-Za-z0-9-]{16,}$/.test(n.trim())}var Mf=class{#t;#e;#A;#r;#n=null;#l;constructor({botToken:A,appToken:o,fetchImpl:a=fetch,baseUrl:e=BYe,fileUploadTimeoutMs:i=mYe}){if(A!==void 0&&!ree(A))throw new TypeError("Slack Bot Token is invalid");if(o!==void 0&&!iee(o))throw new TypeError("Slack App Token is invalid");if(!A&&!o)throw new TypeError("SlackApi requires a token");if(typeof a!="function")throw new TypeError("SlackApi requires fetch");this.#t=A?.trim(),this.#e=o?.trim(),this.#A=a,this.#r=new URL(e),this.#l=SYe(i,"fileUploadTimeoutMs")}authTest(A={}){return this.#i("auth.test",{...A,tokenKind:"bot"})}openConnection(A={}){return this.#i("apps.connections.open",{...A,tokenKind:"app",body:void 0})}async fileInfo({fileId:A,signal:o}={}){let a=await this.#i("files.info",{tokenKind:"bot",signal:o,body:{file:Tn(A,"file id")}});if(!a?.file||typeof a.file!="object"||Array.isArray(a.file))throw new Error("Slack files.info returned no file object");return a.file}async getMessage({channelId:A,messageTs:o,signal:a}={}){let e=fs(o,"message timestamp"),i=await this.#i("conversations.history",{tokenKind:"bot",signal:a,body:{channel:Tn(A,"channel id"),oldest:e,latest:e,inclusive:!0,limit:1}});return Array.isArray(i?.messages)?i.messages.find(t=>String(t?.ts??"")===e)??null:null}postMessage({channelId:A,text:o,threadTs:a,signal:e}){return this.#i("chat.postMessage",{tokenKind:"bot",signal:e,body:{channel:Tn(A,"channel id"),text:bf(o),...a?{thread_ts:hc(a)}:{},mrkdwn:!0,link_names:!1,unfurl_links:!1,unfurl_media:!1}})}updateMessage({channelId:A,ts:o,text:a,signal:e}){return this.#i("chat.update",{tokenKind:"bot",signal:e,body:{channel:Tn(A,"channel id"),ts:fs(o,"message timestamp"),text:bf(a),parse:"none",link_names:!1}})}addReaction({channelId:A,messageTs:o,emojiName:a,signal:e,timeoutMs:i}){return this.#i("reactions.add",{tokenKind:"bot",signal:e,timeoutMs:i,retry:!1,body:{channel:Tn(A,"channel id"),timestamp:fs(o,"message timestamp"),name:fs(a,"reaction name")}})}removeReaction({channelId:A,messageTs:o,emojiName:a,signal:e,timeoutMs:i}){return this.#i("reactions.remove",{tokenKind:"bot",signal:e,timeoutMs:i,retry:!1,body:{channel:Tn(A,"channel id"),timestamp:fs(o,"message timestamp"),name:fs(a,"reaction name")}})}startStream({channelId:A,threadTs:o,recipientTeamId:a,recipientUserId:e,markdownText:i,signal:t}){return this.#i("chat.startStream",{tokenKind:"bot",signal:t,body:{channel:Tn(A,"channel id"),thread_ts:fs(o,"thread timestamp"),...a?{recipient_team_id:Tn(a,"team id")}:{},...e?{recipient_user_id:Tn(e,"user id")}:{},...hc(i)?{markdown_text:bf(i)}:{}}})}appendStream({channelId:A,ts:o,markdownText:a,signal:e}){return this.#i("chat.appendStream",{tokenKind:"bot",signal:e,body:{channel:Tn(A,"channel id"),ts:fs(o,"stream timestamp"),markdown_text:bf(a,{trim:!1})}})}stopStream({channelId:A,ts:o,markdownText:a,signal:e}){return this.#i("chat.stopStream",{tokenKind:"bot",signal:e,body:{channel:Tn(A,"channel id"),ts:fs(o,"stream timestamp"),...hc(a)?{markdown_text:bf(a,{trim:!1})}:{}}})}async uploadFile({channelId:A,threadTs:o,file:a,signal:e}){if(!a||typeof a!="object"||typeof a.fileName!="string"||!a.fileName||!Buffer.isBuffer(a.bytes))throw new TypeError("A Slack file is required");if(e?.aborted)throw Df(e);let i=tee(e,this.#l),t;try{t=await this.#i("files.getUploadURLExternal",{tokenKind:"bot",signal:i,timeoutMs:this.#l,body:{filename:a.fileName,length:a.bytes.byteLength}})}catch(I){throw e?.aborted?Df(e):kd(I)}let r,s;try{r=fs(t?.file_id,"file id"),s=OYe(t?.upload_url)}catch(I){throw kd(I)}let c;try{c=await this.#A(s,{method:"POST",headers:{"content-type":a.mediaType??"application/octet-stream"},body:a.bytes,signal:i,redirect:"error"})}catch(I){throw e?.aborted?Df(e):kd(I)}if(!Number.isInteger(c?.status))throw kd(new Error("Slack file upload returned an invalid response"));if(c.status!==200){await G2(c);let I=new Error(`Slack file upload failed with HTTP ${c.status}`);throw I.status=c.status,c.status===413?I.code="artifact-too-large":c.status===429?I.code="artifact-rate-limited":I.code="artifact-provider-rejected",I}await G2(c);let g;try{g={files:[{id:r,title:a.fileName}],channel_id:Tn(A,"channel id"),...o?{thread_ts:fs(o,"thread timestamp")}:{}}}catch(I){throw kd(I)}if(i.aborted)throw e?.aborted?Df(e):kd(i.reason);try{let I=await this.#i("files.completeUploadExternal",{tokenKind:"bot",signal:i,timeoutMs:this.#l,retry:!1,body:g});if(!Array.isArray(I?.files)||!I.files.some(d=>hc(d?.id)===r))throw new Error("Slack file completion did not confirm the uploaded file");return I}catch(I){throw e?.aborted?Df(e):I?.code==="slack-missing-scope"?kd(I):wYe(I)}}async downloadFile({url:A,signal:o,maxBytes:a}){return this.#s({url:A,signal:o,maxBytes:a,stream:!1})}async downloadFileStream({url:A,signal:o}){return this.#s({url:A,signal:o,stream:!0})}async#s({url:A,signal:o,maxBytes:a,stream:e}){if(!this.#t)throw new TypeError("Slack bot token is required for file download");let i=bYe(A),r={fetchImpl:async(s,c)=>{let g=await this.#A(s,c);if(!DYe(g?.status))return g;let I=MYe(g,s);if(this.#n&&!this.#n.has("files:read")||TYe(I))throw await G2(g),new DA("slack-file-access-required","Slack redirected a private file request to the workspace because file access was not granted",S("Slack \u672A\u6388\u6743\u673A\u5668\u4EBA\u8BFB\u53D6\u8BE5\u6587\u4EF6\u3002\u8BF7\u4E3A\u5E94\u7528\u6DFB\u52A0 files:read \u540E\u91CD\u65B0\u5B89\u88C5\uFF0C\u518D\u91CD\u65B0\u53D1\u9001\u56FE\u7247\u3002"));return g},headers:{authorization:`Bearer ${this.#t}`},signal:o,allowedHosts:QYe};return e?gh(i,r):dn(i,{...r,maxBytes:a})}async#i(A,{tokenKind:o,body:a,signal:e,timeoutMs:i=15e3,retry:t=!0}){let r=o==="app"?this.#e:this.#t;if(!r)throw new TypeError(`Slack ${o} token is required for ${A}`);let s=A==="files.getUploadURLExternal"||A==="files.info",c;try{c=await this.#A(new URL(A,this.#r),{method:"POST",headers:{authorization:`Bearer ${r}`,"content-type":a===void 0||s?"application/x-www-form-urlencoded;charset=utf-8":"application/json;charset=utf-8","user-agent":"DeepSeek-Harness-dsh-im (https://github.com/xmanrui/dsh-im, 0.2.2)"},...a===void 0?{}:{body:s?new URLSearchParams(a).toString():JSON.stringify(a)},signal:tee(e,i),redirect:"error"})}catch(I){throw I?.name==="AbortError"||I?.name==="TimeoutError"?I:new Error(`Slack ${A} transport failed`)}if(o==="bot"){let I=_Ye(c);I&&(this.#n=I)}let g;try{g=await c.json()}catch{throw new Error(`Slack ${A} returned invalid JSON`)}if(c.status===429&&t){let I=Number(c.headers.get("retry-after"))||1;return await NYe(Math.min(1e4,Math.max(100,I*1e3)),e),this.#i(A,{tokenKind:o,body:a,signal:e,timeoutMs:i,retry:!1})}if(!c.ok||g?.ok!==!0){let I=RYe(A,g,o);throw I.status=c.status,I}return g}};async function aee({botToken:n,appToken:A},o={}){if(!ree(n)){let r=new TypeError(S("Slack Bot Token \u5FC5\u987B\u4EE5 xoxb- \u5F00\u5934\u3002"));throw r.code="slack-invalid-bot-token",r}if(!iee(A)){let r=new TypeError(S("Slack App Token \u5FC5\u987B\u4EE5 xapp- \u5F00\u5934\u3002"));throw r.code="slack-invalid-app-token",r}let a=new Mf({botToken:n,appToken:A,...o}),[e,i]=await Promise.all([a.authTest(),a.openConnection()]);if(!e?.team_id||!e?.user_id||!e?.bot_id)throw new Error(S("Slack Bot Token \u6CA1\u6709\u8FD4\u56DE\u5B8C\u6574\u7684\u673A\u5668\u4EBA\u8EAB\u4EFD\u3002"));let t;try{t=new URL(i?.url)}catch{t=null}if(!t||t.protocol!=="wss:"){let r=new Error(S("Slack App Token \u65E0\u6CD5\u521B\u5EFA Socket Mode \u8FDE\u63A5\uFF0C\u8BF7\u786E\u8BA4\u5DF2\u542F\u7528 Socket Mode \u548C connections:write\u3002"));throw r.code="slack-socket-mode",r}return{platformId:`${e.team_id}:${e.user_id}`,name:hc(e.user)??"DeepSeek Harness",username:hc(e.user),teamId:String(e.team_id),teamName:hc(e.team)}}var F2=Object.freeze({key:"slack",label:"Slack",connectionLabel:" Socket Mode \u957F\u8FDE\u63A5",reactions:Object.freeze({processing:"eyes",success:"white_check_mark",error:"x"})}),db=class extends En{constructor(A){super({descriptor:F2,...A})}};function Sg(n){return typeof n=="string"&&n.trim()?n.trim():null}function pb(n,A){return Object.freeze({code:n,message:A})}var _f=class{#t;#e;#A;#r;#n;#l;#s=new Map;#i=new Map;#a=new Map;#c=0;#o=!1;constructor({credentials:A,configStore:o,inspectCredentials:a=aee,createRuntime:e,deleteState:i=async()=>{},logger:t=console}){if(!A||typeof A.resolve!="function"||typeof A.set!="function"||typeof A.unset!="function")throw new TypeError("Slack requires the DSH credential provider");if(!o||typeof o.list!="function"||typeof o.save!="function"||typeof o.remove!="function")throw new TypeError("Slack requires a config store");if(typeof a!="function"||typeof e!="function")throw new TypeError("Slack controller dependencies are incomplete");this.#t=A,this.#e=o,this.#A=a,this.#r=e,this.#n=i,this.#l=t}async initialize(){if(this.#o)return this.status();for(let A of this.#e.list())await this.#h(A.botId,async()=>{if(this.#o||this.#s.get(A.botId)?.status?.ready)return;let o=await this.#g(A);if(!o){this.#i.set(A.botId,pb("missing-token",S("Slack\u673A\u5668\u4EBA\u51ED\u636E\u7F3A\u5931\uFF0C\u8BF7\u79FB\u9664\u540E\u91CD\u65B0\u63A5\u5165\u3002")));return}try{await this.#I(A,o),this.#i.delete(A.botId)}catch(a){this.#i.set(A.botId,pb("connection-failed",S("Slack Socket Mode \u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002"))),this.#l.warn?.(`[dsh-im:slack] bot ${A.botId} failed to initialize:`,a)}finally{this.#u()}});return this.status()}async bindCredentials({botToken:A,appToken:o}={}){if(this.#o)throw new Error("Slack controller is closed");let a=Sg(A),e=Sg(o);if(!a||!e)throw new TypeError("Slack Bot Token and App Token are required");let i=await this.#A({botToken:a,appToken:e}),t=Sg(i?.platformId),r=Sg(i?.name);if(!t||!r)throw new Error("Slack returned an invalid bot identity");let s=v2(t);return await this.#h(s.botId,async()=>{if(this.#o)throw new Error("Slack controller is closed");let c=this.#e.getByPlatformId(t),g=await this.#t.resolve(s.botTokenRef).catch(()=>{}),I=await this.#t.resolve(s.appTokenRef).catch(()=>{}),d={...s,platformId:t,name:r,username:Sg(i.username),teamId:Sg(i.teamId),teamName:Sg(i.teamName),createdAt:c?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()};try{await this.#t.set(s.botTokenRef,a),await this.#t.set(s.appTokenRef,e),await this.#e.save(d)}catch(B){throw await Promise.all([this.#p(s.botTokenRef,g),this.#p(s.appTokenRef,I)]),B}try{await this.#I(d,{botToken:a,appToken:e}),this.#i.delete(s.botId)}catch(B){this.#i.set(s.botId,pb("connection-failed",S("Slack\u673A\u5668\u4EBA\u5DF2\u63A5\u5165\uFF0CSocket Mode \u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002"))),this.#l.warn?.(`[dsh-im:slack] bot ${s.botId} credential connection failed:`,B)}this.#u()}),this.status()}async reconnectBot(A){let o=this.#e.get(A);if(!o)throw new Error("Unknown Slack bot");return await this.#h(A,async()=>{let a=await this.#g(o);if(!a)throw new Error("Slack bot credentials are missing");try{await this.#I(o,a),this.#i.delete(A)}catch(e){throw this.#i.set(A,pb("connection-failed",S("Slack Socket Mode \u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u68C0\u67E5\u4E24\u4E2A Token\u3002"))),e}finally{this.#u()}}),this.status()}async sendConnectionTest(A){let o=this.#e.get(A);if(!o)throw new Error("Unknown Slack bot");return this.#h(A,async()=>{let a=this.#s.get(A);if(!a?.status?.ready||typeof a.sendConnectionTest!="function"){let e=new Error(S("Slack\u673A\u5668\u4EBA\u5C1A\u672A\u8FDE\u63A5"));throw e.code="test-target-unavailable",e}return await a.sendConnectionTest(yi(`${o.name}\uFF08${P2(o.platformId)}\uFF09`,S("Slack\u673A\u5668\u4EBA"))),{sent:!0}})}async sendProactiveText(A,o,a,e={}){if(!this.#e.get(A))throw new Error("Unknown Slack bot");return this.#h(A,async()=>{let t=this.#s.get(A);if(!t?.status?.ready||typeof t.sendProactiveText!="function"){let r=new Error(S("Slack\u673A\u5668\u4EBA\u5C1A\u672A\u8FDE\u63A5"));throw r.code="bot-not-connected",r}return t.sendProactiveText(o,a,e)})}async deleteBot(A){let o=this.#e.get(A);if(!o)throw new Error("Unknown Slack bot");return await this.#h(A,async()=>{let a=await this.#t.resolve(o.botTokenRef).catch(()=>{}),e=await this.#t.resolve(o.appTokenRef).catch(()=>{});await this.#d(A);try{await this.#t.unset(o.botTokenRef),await this.#t.unset(o.appTokenRef),await this.#e.remove(A)}catch(i){throw await Promise.all([this.#p(o.botTokenRef,a),this.#p(o.appTokenRef,e)]),a?.value&&e?.value&&await this.#I(o,{botToken:a.value,appToken:e.value}).catch(()=>{}),new Error("Unable to remove the Slack bot safely.",{cause:i})}await this.#n({botId:A,config:o}).catch(i=>{this.#l.warn?.(`[dsh-im:slack] bot ${A} state cleanup failed:`,i)}),this.#i.delete(A),this.#u()}),this.status()}status(){let A=this.#e.list().map(a=>{let e=this.#s.get(a.botId)?.status??null,i=e?.ready===!0&&e.connectionState==="connected"&&e.harnessReachable===!0,t=i?"connected":e?.connectionState==="connecting"?"connecting":this.#i.has(a.botId)||e?.connectionState==="failed"?"error":"offline";return{botId:a.botId,state:t,connected:i,configured:!0,bot:{name:a.name,username:a.username,teamName:a.teamName,idMasked:P2(a.platformId)},health:{status:i?"healthy":t==="error"?"error":"offline",summary:i?S(`Slack${F2.connectionLabel}\u8FD0\u884C\u6B63\u5E38`):t==="error"?S("Slack\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5"):S("Slack\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF"),lastCheckedAt:e?.lastCheckedAt??null,lastConnectedAt:e?.lastConnectedAt??null},stats:{messagesReceived:e?.messagesReceived??0,messagesReplied:e?.messagesReplied??0},lastMessageError:jr(e?.lastMessageError),error:structuredClone(this.#i.get(a.botId)??null)}}),o=A.filter(a=>a.connected).length;return{schemaVersion:1,revision:this.#c,state:A.length===0?"disconnected":o===A.length?"connected":o>0?"degraded":"offline",bots:A,totals:{configured:A.length,connected:o}}}async close(){this.#o||(this.#o=!0,await Promise.allSettled([...this.#a.values()]),await Promise.allSettled([...this.#s.keys()].map(A=>this.#d(A))))}async#I(A,{botToken:o,appToken:a}){if(this.#o)throw new Error("Slack controller is closed");if(await this.#d(A.botId),this.#o)throw new Error("Slack controller is closed");let e=await this.#r({botId:A.botId,config:A,botToken:o,appToken:a});if(!e||typeof e.start!="function"||typeof e.stop!="function")throw new TypeError("createRuntime returned an invalid Slack runtime");this.#s.set(A.botId,e);try{await e.start()}catch(i){throw await e.stop().catch(()=>{}),this.#s.delete(A.botId),i}}async#d(A){let o=this.#s.get(A);this.#s.delete(A),await o?.stop().catch(a=>{this.#l.warn?.(`[dsh-im:slack] bot ${A} failed to stop cleanly:`,a)})}async#g(A){let[o,a]=await Promise.all([this.#t.resolve(A.botTokenRef).catch(()=>{}),this.#t.resolve(A.appTokenRef).catch(()=>{})]),e=Sg(o?.value),i=Sg(a?.value);return e&&i?{botToken:e,appToken:i}:null}async#p(A,o){o?.value?await this.#t.set(A,o.value).catch(()=>{}):await this.#t.unset(A).catch(()=>{})}#h(A,o){let i=(this.#a.get(A)??Promise.resolve()).catch(()=>{}).then(o).finally(()=>{this.#a.get(A)===i&&this.#a.delete(A)});return this.#a.set(A,i),i}#u(){this.#c+=1}};var hb=class extends XA{constructor(A){super({...A,rpcIdPrefix:"slack",logPrefix:"dsh-slack"})}};var oee=Object.freeze([1e3,3e3,5e3,1e4,3e4]),U2=38e3,nee=11e3,cee=new Set(["image/jpeg","image/png","image/webp","image/gif"]);function L2(n,A,o){if(typeof n.addEventListener=="function")n.addEventListener(A,o);else if(typeof n.on=="function")n.on(A,o);else throw new TypeError("Slack WebSocket does not support events")}function kYe(n){let A=n?.data??n;return typeof A=="string"?A:Buffer.isBuffer(A)?A.toString("utf8"):A instanceof ArrayBuffer?Buffer.from(A).toString("utf8"):ArrayBuffer.isView(A)?Buffer.from(A.buffer,A.byteOffset,A.byteLength).toString("utf8"):null}function vYe(n){let A=new URL(n);if(A.protocol!=="wss:")throw new Error("Slack returned an insecure Socket Mode URL");return A.href}function gee(n){return typeof n=="string"?n.replaceAll("&amp;","&").replaceAll("&lt;","<").replaceAll("&gt;",">"):""}function PYe(n,A){return gee(n).replace(new RegExp(`<@${A}>`,"gi"),"").trim()}function H2(n){return typeof n?.url_private_download=="string"&&n.url_private_download?n.url_private_download:n?.url_private}function GYe(n){if(!n||typeof n!="object")return null;let A=typeof n.mimetype=="string"?n.mimetype.toLowerCase():"",o=A.startsWith("image/")?"image":A.startsWith("audio/")?"audio":A.startsWith("video/")?"video":"file",a=typeof n.name=="string"&&n.name?n.name:typeof n.title=="string"&&n.title?n.title:void 0;return{kind:o,...a?{name:a}:{}}}function FYe(n,A){if(!n||String(n.ts??"")!==A)return null;let o=typeof n.user=="string"&&n.user?n.user:typeof n.bot_id=="string"&&n.bot_id?n.bot_id:void 0,a=typeof n.username=="string"&&n.username?n.username:void 0;return{messageId:A,...o?{authorId:o}:{},...a?{authorName:a}:{},content:gee(n.text??""),attachments:Array.isArray(n.files)?n.files.map(GYe).filter(Boolean):[]}}function LYe(n,A){let o=typeof n?.thread_ts=="string"?n.thread_ts:"";if(!(!o||o===String(n?.ts??"")))return{messageId:o,load:async({signal:a}={})=>{try{let e=await A({channelId:String(n.channel),messageTs:o,signal:a});return FYe(e,o)}catch(e){if(e?.code==="slack-missing-scope")return{messageId:o,unavailableReason:"permission-denied"};throw e}}}}function UYe(n,A){let o=typeof n?.mimetype=="string"?n.mimetype.toLowerCase():"",a=H2(n);return!cee.has(o)||typeof a!="string"||!a?null:{name:typeof n.name=="string"?n.name:void 0,mediaType:o,size:Number.isSafeInteger(n.size)&&n.size>=0?n.size:void 0,load:e=>A(a,e)}}function HYe(n,A,o){let a=typeof n?.mimetype=="string"&&n.mimetype?n.mimetype.toLowerCase():void 0,e=H2(n);if(cee.has(a))return null;let i=n?.file_access==="check_file_info"&&typeof n?.id=="string"&&n.id;return(typeof e!="string"||!e)&&!i?null:{name:typeof n?.name=="string"&&n.name?n.name:typeof n?.title=="string"&&n.title?n.title:i?n.id:"slack-file",...a?{mediaType:a}:{},size:Number.isSafeInteger(n?.size)&&n.size>=0?n.size:void 0,load:async({signal:t}={})=>{if(!i)return A(e,{signal:t});let r=await o(n.id,{signal:t}),s=H2(r);if(typeof s!="string"||!s)throw new Error("Slack files.info returned no downloadable URL");let c=await A(s,{signal:t}),g=typeof r?.name=="string"&&r.name?r.name:typeof r?.title=="string"&&r.title?r.title:n.id,I=typeof r?.mimetype=="string"&&r.mimetype?r.mimetype.toLowerCase():void 0;return Buffer.isBuffer(c)||c instanceof Uint8Array?{data:c,name:g,...I?{mediaType:I}:{}}:{...c,name:g,...I?{mediaType:I}:{}}}}}function xYe(n,A,{loadFile:o=async()=>{throw new Error("Slack file downloader is unavailable")},loadFileStream:a=o,loadFileInfo:e=async()=>{throw new Error("Slack file metadata loader is unavailable")},loadReply:i=async()=>{throw new Error("Slack reply loader is unavailable")}}={}){let t=n?.event;if(!t||!n?.event_id||!t.channel||!t.user||!t.ts)return null;let r=t.type==="message"&&t.channel_type==="im",s=t.type==="app_mention";if(!r&&!s||t.subtype&&t.subtype!=="file_share"||t.bot_id||t.app_id)return null;let c=String(t.thread_ts??t.ts),g=LYe(t,i);return{messageId:String(n.event_id),senderId:String(t.user),senderIsBot:String(t.user)===String(A),kind:r?"direct":"group",conversationId:r?String(t.channel):`${t.channel}:${c}`,contextSource:()=>({chatId:String(t.channel),threadId:t.thread_ts?String(t.thread_ts):void 0}),content:PYe(t.text??"",A),plainText:!Array.isArray(t.files)||t.files.length===0,images:Array.isArray(t.files)?t.files.map(I=>UYe(I,o)).filter(Boolean):[],files:Array.isArray(t.files)?t.files.map(I=>HYe(I,a,e)).filter(Boolean):[],...g?{replyTo:g}:{},addressed:r||s,reactionTarget:{channelId:String(t.channel),messageTs:String(t.ts)},replyTarget:{channelId:String(t.channel),threadTs:c,recipientUserId:String(t.user),recipientTeamId:String(t.user_team??n.team_id??"")},connectionTestTarget:{channelId:String(t.channel)}}}function KYe(n){if(typeof n!="string")return!1;let A="__DSH_IM_TOOL_NAME__",o=S("\u6B63\u5728\u4F7F\u7528{name}\u2026",{name:A}),a=o.indexOf(A);if(a<0)return!1;let e=o.slice(0,a),i=o.slice(a+A.length),t=n.trim();return t.startsWith(e)&&t.endsWith(i)&&t.length>e.length+i.length}async function see(n,A,o,a,e){if(a)for(let i=0;i<a.length;i+=nee)await n.appendStream({channelId:A.channelId,ts:o,markdownText:a.slice(i,i+nee),signal:e})}async function YYe({api:n,target:A,signal:o,logger:a}){let e=await n.startStream({channelId:A.channelId,threadTs:A.threadTs,recipientTeamId:A.recipientTeamId||void 0,recipientUserId:A.recipientUserId||void 0,signal:o}),i=typeof e?.ts=="string"?e.ts:null;if(!i)throw new Error("Slack did not return a streaming message timestamp");let t="",r="",s=null,c=null,g=!1,I=!1,d=[i],B=async Q=>{let y=Xs(Q,U2)[0]??"";if(!y||!y.startsWith(t))return;let m=y.slice(t.length);m&&(await see(n,A,i,m,o),t=y)},f=()=>{I||g||s!==null||c||!r||(s=setTimeout(()=>{s=null;let Q=r;r="",c=B(Q).catch(y=>{g=!0,a.warn?.("[dsh-im:slack] streaming append failed:",y)}).finally(()=>{c=null,f()})},350),s?.unref?.())};return{messageId:i,get providerMessageIds(){return[...d]},update(Q){I||g||typeof Q!="string"||!Q.trim()||KYe(Q)||(r=Q,f())},async finish(Q){if(I)throw new Error("Slack message stream is already closed");I=!0,s!==null&&clearTimeout(s),s=null,r="",await c?.catch(()=>{});let y=Xs(Q,U2),m=y[0]??S("\u5904\u7406\u5B8C\u6210\u3002");!g&&m.startsWith(t)?(await see(n,A,i,m.slice(t.length),o),await n.stopStream({channelId:A.channelId,ts:i,signal:o})):(await n.stopStream({channelId:A.channelId,ts:i,signal:o}).catch(()=>{}),await n.updateMessage({channelId:A.channelId,ts:i,text:m,signal:o}));for(let b of y.slice(1)){let T=await n.postMessage({channelId:A.channelId,threadTs:A.threadTs,text:b,signal:o});typeof T?.ts=="string"&&T.ts&&d.push(T.ts)}},cancel(){I=!0,r="",s!==null&&clearTimeout(s),s=null,n.stopStream({channelId:A.channelId,ts:i,signal:o}).catch(()=>{})}}}var x2=class{#t;#e;#A;constructor({api:A,signal:o,logger:a}){this.#t=A,this.#e=o,this.#A=a}async sendText(A,o){let a=Xs(o,U2),e=[];for(let i of a){let t=await this.#t.postMessage({channelId:A.channelId,threadTs:A.threadTs,text:i,signal:this.#e});typeof t?.ts=="string"&&t.ts&&e.push(t.ts)}return{providerMessageIds:e}}async addReaction(A,o,{signal:a}={}){let e=String(o??"").trim();return await this.#t.addReaction({channelId:A.channelId,messageTs:A.messageTs,emojiName:e,signal:a??this.#e}),e}removeReaction(A,o,{signal:a}={}){return this.#t.removeReaction({channelId:A.channelId,messageTs:A.messageTs,emojiName:o,signal:a??this.#e})}openStream(A){return YYe({api:this.#t,target:A,signal:this.#e,logger:this.#A})}sendFile(A,o){return this.#t.uploadFile({channelId:A.channelId,threadTs:A.threadTs,file:o,signal:this.#e})}};function jYe(){return{startedAt:null,ready:!1,connectionState:"idle",harnessReachable:!1,lastCheckedAt:null,lastConnectedAt:null,lastError:null,...Ya()}}var Tf=class{#t;#e;#A;#r;#n;#l;#s;#i;#a;#c;#o;#I;#d=jYe();#g=null;#p=null;#h=null;#u=null;#E=null;#C=null;#B=0;#Q=0;#S=!0;#m=null;constructor({config:A,botToken:o,appToken:a,harness:e,state:i,contextEnhancement:t,accessPolicy:r,logger:s=console,replyTimeoutMs:c=6e5,connectTimeoutMs:g=2e4,createApi:I=B=>new Mf(B),createWebSocket:d=B=>new WebSocket(B)}){if(!A||!o||!a||!e||!i)throw new TypeError("SlackRuntime requires config, both tokens, Harness, and state");if(typeof d!="function")throw new TypeError("SlackRuntime requires WebSocket");this.#t=A,this.#e=o,this.#A=a,this.#r=e,this.#n=i,this.#l=t,this.#s=r,this.#i=s,this.#a=c,this.#c=g,this.#o=I,this.#I=d}get status(){return structuredClone(this.#d)}async sendConnectionTest(A){if(!this.#d.ready||!this.#p){let o=new Error("Slack bot is not connected");throw o.code="test-target-unavailable",o}return this.#p.sendConnectionTest(A)}async sendProactiveText(A,o,a={}){if(!this.#d.ready||!this.#p){let t=new Error("Slack bot is not connected");throw t.code="bot-not-connected",t}let e=typeof A?.route?.channelId=="string"?A.route.channelId.trim():"",i=typeof A?.route?.threadTs=="string"?A.route.threadTs.trim():"";if(!e||A?.kind!=="conversation"&&A?.kind!=="thread"||A.kind==="thread"&&!i||A.kind==="conversation"&&i){let t=new TypeError("Invalid Slack proactive delivery target");throw t.code="invalid-target",t}return this.#p.sendProactiveText({channelId:e,...i?{threadTs:i}:{}},o,a)}async start(){return this.#d.ready&&this.#u?this.status:this.#m?this.#m:(this.#m=this.#D().finally(()=>{this.#m=null}),this.#m)}async#D(){await this.stop(),this.#S=!1,this.#B=0,this.#d.startedAt=new Date().toISOString(),this.#d.connectionState="connecting",this.#d.lastError=null,await this.#r.ensureRunning(),this.#d.harnessReachable=!0;let A=new AbortController;this.#h=A;let o=this.#o({botToken:this.#e,appToken:this.#A});this.#g=o;try{let a=await o.authTest({signal:A.signal});if(`${a?.team_id}:${a?.user_id}`!==this.#t.platformId)throw new Error("Slack Bot Token identity does not match the saved bot");let e=new x2({api:o,signal:A.signal,logger:this.#i});this.#p=new db({bot:e,harness:this.#r,state:this.#n,contextEnhancement:this.#l,accessPolicy:this.#s,status:this.#d,logger:this.#i,replyTimeoutMs:this.#a,signal:A.signal});let i;try{await Promise.race([this.#k(),new Promise((t,r)=>{i=setTimeout(()=>r(new Error("Slack Socket Mode did not become ready in time")),this.#c),i?.unref?.()})])}finally{clearTimeout(i)}return this.status}catch(a){throw this.#d.ready=!1,this.#d.connectionState="failed",this.#d.lastError=a?.message??String(a),await this.stop(),a}}async#k(){if(this.#S)throw new Error("Slack runtime is stopped");let A=await this.#g.openConnection({signal:this.#h?.signal});return this.#O(A?.url)}#O(A){if(this.#S)return Promise.reject(new Error("Slack runtime is stopped"));let o=++this.#Q,a=this.#I(vYe(A));this.#u=a;let e=!1;return new Promise((i,t)=>{let r=s=>{if(e||o!==this.#Q)return;e=!0,this.#E=s?.connection_info?.app_id??null,this.#B=0;let c=Date.now();this.#d.ready=!0,this.#d.connectionState="connected",this.#d.lastCheckedAt=c,this.#d.lastConnectedAt=c,this.#d.lastError=null,i()};L2(a,"message",s=>{if(o!==this.#Q||this.#S)return;let c=kYe(s);if(!c)return;let g;try{g=JSON.parse(c)}catch{this.#i.warn?.("[dsh-im:slack] ignored malformed Socket Mode JSON");return}if(g.type==="hello"){r(g);return}if(g.envelope_id&&a.readyState===1&&(a.send(JSON.stringify({envelope_id:g.envelope_id})),this.#d.lastCheckedAt=Date.now()),g.type==="disconnect"){a.close(4e3,"Slack requested reconnect");return}if(g.type!=="events_api"||g.payload?.type!=="event_callback"||this.#E&&g.payload.api_app_id&&g.payload.api_app_id!==this.#E)return;let I=xYe(g.payload,this.#t.platformId.split(":")[1],{loadFile:(B,f)=>this.#g.downloadFile({url:B,...f}),loadFileStream:(B,f)=>this.#g.downloadFileStream({url:B,...f}),loadFileInfo:(B,f)=>this.#g.fileInfo({fileId:B,...f}),loadReply:B=>this.#g.getMessage(B)}),d=this.#p;I&&d&&d.accept(I).catch(B=>{o!==this.#Q||this.#S||this.#i.error?.(`[dsh-im:slack] bot ${this.#t.botId} message handling failed:`,B)})}),L2(a,"close",(s={})=>{if(o!==this.#Q)return;if(this.#u===a&&(this.#u=null),this.#S){e||t(new DOMException("Stopped","AbortError"));return}let c=Number(s.code)||0,g=new Error(`Slack Socket Mode closed (${c||"unknown"})`);this.#d.ready=!1,this.#d.connectionState="connecting",this.#d.lastError=g.message,e||(e=!0,t(g)),this.#y()}),L2(a,"error",()=>{o!==this.#Q||this.#S||(this.#d.lastError="Slack Socket Mode WebSocket error")})})}#y(){if(this.#S||this.#C!==null)return;let A=oee[Math.min(this.#B,oee.length-1)];this.#B+=1,this.#C=setTimeout(()=>{this.#C=null,this.#k().catch(o=>{this.#S||(this.#i.warn?.("[dsh-im:slack] Socket Mode reconnect failed:",o),this.#y())})},A),this.#C?.unref?.()}async stop(){this.#S=!0,this.#Q+=1,this.#h?.abort(),this.#h=null,this.#C!==null&&clearTimeout(this.#C),this.#C=null;let A=this.#u,o=this.#p;this.#u=null,this.#p=null,this.#g=null,this.#E=null;try{A&&A.readyState<2&&A.close(1e3,"Plugin stopped")}catch(a){this.#i.warn?.(`[dsh-im:slack] bot ${this.#t.botId} failed to close Socket Mode:`,a)}return await Promise.race([o?.waitForIdle()??Promise.resolve(),new Promise(a=>setTimeout(a,2e3))]),this.#d.ready=!1,this.#d.connectionState="idle",this.status}};var ub=class extends Cn{};async function K2(n,A={},o={}){if(!n?.credentials)throw new TypeError("dsh-im slack requires ctx.credentials");let a=Vr(n,A),e=o.ConfigStore??lb,i=o.StateStore??ub,t=o.HarnessClient??hb,r=o.Controller??_f,s=o.Runtime??Tf,c=o.createConnectionSupervisor??Ih,g=typeof n.logger=="function"?n.logger("dsh-im:slack"):n.logger??console,I=()=>Mi(n),d=mR(A,"slack"),B=await new e(d.config).load(),f=Iee(A.workspace??process.cwd()),Q=o.WorkspaceStore??zr,y=o.workspaces??await new Q(d.workspaces,{defaultWorkspace:f}).load(),m=B.list();await y.reconcile(m.map(Z=>Z.botId)),await Promise.all(m.map(Z=>y.ensure(Z.botId,{defaultAgentPreset:A.agentPreset,initialAccessPolicy:er("slack",Z)})));let b=typeof B.remove=="function"?ki(B,{workspaces:y}):B,T=new Map,N=Z=>Iee(d.bots,Z,"state.json"),P=async Z=>{let $=T.get(Z);return $||($=await new i(N(Z)).load(),T.set(Z,$)),$},x=Fi(n,o.commandExecutor),k=o.inboundTtl??Wr(n,A),K=k?.service??k;Ui(n,K,{workspaces:y,configStore:b,defaultWorkspace:f});let{controlExecutor:Y,sessionMaintenanceExecutor:G,fileIngressExecutor:v}=Li(n,{controlExecutor:o.controlExecutor,sessionMaintenanceExecutor:o.sessionMaintenanceExecutor,fileIngressExecutor:o.fileIngressExecutor,inboundTtlService:K}),j=new t({...a,workspace:f,autostart:!1,dshBin:A.dshBin??"dsh",...x?{commandExecutor:x}:{},...Y?{controlExecutor:Y}:{},...G?{sessionMaintenanceExecutor:G}:{},...v?{fileIngressExecutor:v}:{}}),F=()=>Ri(j),R=new r({credentials:n.credentials,configStore:b,logger:g,...o.inspectCredentials?{inspectCredentials:o.inspectCredentials}:{},createRuntime:async({botId:Z,config:$,botToken:ne,appToken:te})=>{let pe=await P(Z);await y.ensure(Z,{defaultAgentPreset:A.agentPreset,initialAccessPolicy:er("slack",$)});let me=vi(j,{botId:Z,workspaces:y,state:pe,agentPresetCatalog:I});return new s({config:$,botToken:ne,appToken:te,harness:me.harness,state:me.state,contextEnhancement:{botId:Z,getSettings:()=>y.contextEnhancementFor(Z)},accessPolicy:Hi(y,Z,{channel:"slack",config:$}),replyTimeoutMs:A.replyTimeoutMs??6e5,connectTimeoutMs:A.connectTimeoutMs??2e4,logger:{error:(...we)=>g.error?.(`[${Z}]`,...we),warn:(...we)=>g.warn?.(`[${Z}]`,...we),info:(...we)=>g.info?.(`[${Z}]`,...we),debug:(...we)=>g.debug?.(`[${Z}]`,...we)}})},deleteState:async({botId:Z})=>{let $=T.get(Z);if(T.delete(Z),$&&typeof $.remove=="function")await $.remove();else try{await JYe(N(Z))}catch(ne){if(ne?.code!=="ENOENT")throw ne}}}),L=Pi(R,{workspaces:y,stateFor:P,agentPresetCatalog:I,modelCatalog:F}),V=c({channel:"slack",controller:L,harness:j,logger:g,retryDelaysMs:A.retryDelaysMs,healthyIntervalMs:A.healthyIntervalMs}).start();return{controller:L,deliveryAdapter:Gi({channel:"slack",workspaces:y,coreController:R,stateFor:P}),ready:V.ready,async close(){await V.close(),await L.close(),j.stopManagedProcess()}}}var Cb="/slack",xr=Object.freeze({status:"connection.status",bindCredentials:"bot.bind-credentials",reconnectBot:"bot.reconnect",deleteBot:"bot.delete",setWorkspace:Ua,setModel:Ka,setAgentPreset:xa,setContextEnhancement:La,setAccessPolicy:Yi,setAlias:si}),dee=Object.freeze(Object.values(xr)),qYe=new Set(["token","botToken","appToken","botTokenRef","appTokenRef","tokenRef","platformId","secret","secretRef"]);function j2(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function Eb(n,A){return j2(n)&&Object.keys(n).every(o=>A.includes(o))}function lee(n){return typeof n=="string"&&/^slack_[a-f0-9]{24}$/.test(n)}function zYe(n){return typeof n=="string"&&/^xoxb-[A-Za-z0-9-]{16,}$/.test(n.trim())&&n.length<=4096}function VYe(n){return typeof n=="string"&&/^xapp-[A-Za-z0-9-]{16,}$/.test(n.trim())&&n.length<=4096}function WYe(n,A){return j2(A)?n===xr.status?Eb(A,[])?null:"connection.status does not accept fields.":n===xr.bindCredentials?Eb(A,["botToken","appToken"])&&zYe(A.botToken)&&VYe(A.appToken)?null:"bot.bind-credentials requires xoxb Bot Token and xapp App Token.":n===xr.reconnectBot?Eb(A,["botId","sendTest"])&&lee(A.botId)&&(A.sendTest===void 0||typeof A.sendTest=="boolean")?null:"bot.reconnect requires a botId.":n===xr.deleteBot?Eb(A,["botId","confirm"])&&lee(A.botId)&&A.confirm===!0?null:"bot.delete requires a botId and confirm=true.":n===xr.setWorkspace?Ji(A)?null:"\u8BF7\u8F93\u5165\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84\u3002":n===xr.setModel?zi(A)?null:"\u8BF7\u9009\u62E9\u6709\u6548\u6A21\u578B\u3002":n===xr.setAgentPreset?qi(A)?null:"\u8BF7\u9009\u62E9 Agent Preset\u3002":n===xr.setContextEnhancement?Ki(A)?null:"\u8BF7\u63D0\u4EA4\u6709\u6548\u7684\u4E0A\u4E0B\u6587\u589E\u5F3A\u8BBE\u7F6E\u3002":n===xr.setAccessPolicy?ji(A)?null:"\u8BF7\u63D0\u4EA4\u6709\u6548\u7684\u8BBF\u95EE\u8BBE\u7F6E\u3002":n===xr.setAlias?xi(A)?null:"\u8BF7\u8F93\u5165\u6709\u6548\u7684\u522B\u540D\uFF08\u6700\u591A 80 \u4E2A\u5B57\u7B26\uFF09\u3002":"Unknown Slack endpoint.":"Payload must be an object."}function Y2(n){if(Array.isArray(n))return n.map(Y2);if(!j2(n))return n;let A={};for(let[o,a]of Object.entries(n))qYe.has(o)||(A[o]=Y2(a));return A}function ZYe(n){let A=Ha(n);return A||(n?.code==="slack-invalid-bot-token"?{code:"invalid-bot-token",message:"Slack Bot Token \u65E0\u6548\uFF0C\u8BF7\u786E\u8BA4\u4F7F\u7528\u4EE5 xoxb- \u5F00\u5934\u7684\u4EE4\u724C\u3002"}:n?.code==="slack-invalid-app-token"?{code:"invalid-app-token",message:"Slack App Token \u65E0\u6548\uFF0C\u8BF7\u786E\u8BA4\u4F7F\u7528\u4EE5 xapp- \u5F00\u5934\u7684\u4EE4\u724C\u3002"}:n?.code==="slack-missing-scope"?{code:"missing-scope",message:"Slack \u5E94\u7528\u6743\u9650\u4E0D\u5B8C\u6574\uFF0C\u8BF7\u91CD\u65B0\u5BFC\u5165 Manifest \u5E76\u5B89\u88C5\u5230\u5DE5\u4F5C\u533A\u3002"}:n?.code==="slack-socket-mode"?{code:"socket-mode-unavailable",message:n.message}:{code:"slack-operation-failed",message:"Slack \u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"})}function Bb(n){for(let A of["status","bindCredentials","reconnectBot","deleteBot"])if(typeof n?.[A]!="function")throw new TypeError(`A complete Slack controller is required (${A})`);return async(A,o,a)=>{if(a?.aborted)return{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}};if(!dee.includes(A))return{ok:!1,error:{code:"bad-request",message:"Unknown Slack endpoint."}};let e=WYe(A,o);if(e)return{ok:!1,error:{code:"bad-request",message:e}};try{let i;if(A===xr.status)i=await n.status();else if(A===xr.bindCredentials)i=await n.bindCredentials(o);else if(A===xr.reconnectBot){if(i=await n.reconnectBot(o.botId),a?.aborted)return{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}};if(o.sendTest===!0){let t=null;try{if(i?.bots?.find(r=>r?.botId===o.botId)?.connected!==!0){let r=new Error("Bot is not connected");throw r.code="test-target-unavailable",r}if(typeof n.sendConnectionTest!="function"){let r=new Error("Connection test is unavailable");throw r.code="test-target-unavailable",r}await n.sendConnectionTest(o.botId)}catch(r){t=r}i={...i,testMessage:jA(t)}}}else if(A===xr.setWorkspace){if(typeof n.updateWorkspace!="function")throw new Error("Workspace update is unavailable");i=await n.updateWorkspace(o.botId,o.workspace)}else if(A===xr.setModel){if(typeof n.updateModel!="function")throw new Error("Model update is unavailable");i=await n.updateModel(o.botId,o.model)}else if(A===xr.setContextEnhancement){if(typeof n.updateContextEnhancement!="function")throw new Error("Context enhancement update is unavailable");i=await n.updateContextEnhancement(o.botId,o.config)}else if(A===xr.setAlias){if(typeof n.updateAlias!="function")throw new Error("Alias update is unavailable");i=await n.updateAlias(o.botId,o.alias)}else if(A===xr.setAccessPolicy){if(typeof n.updateAccessPolicy!="function")throw new Error("Access policy update is unavailable");i=await n.updateAccessPolicy(o.botId,o.policy)}else if(A===xr.setAgentPreset){if(typeof n.updateAgentPreset!="function")throw new Error("Agent preset update is unavailable");i=await n.updateAgentPreset(o.botId,o.agentPreset)}else i=await n.deleteBot(o.botId);return a?.aborted?{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}:{ok:!0,value:Y2(i)}}catch(i){return a?.aborted?{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}:{ok:!1,error:ZYe(i)}}}}function J2(n,A,o){return SA(n,Cb,Bb(A),{authority:vA(o)})}async function pee(n,A={}){return A?.controller?J2(n,A.controller,A.rpcAuthority):Tr(n,A,{channel:"slack",rpcChannel:Cb,createProduction:()=>K2(n,A,A.internals??{}),createHandler:o=>Bb(o)})}var hee=Object.freeze({botPrefix:"telegram",tokenRefPrefix:"DSH_TELEGRAM_BOT_TOKEN"}),q2=Object.freeze({compatible:"compatible",privateAllowlist:"private-allowlist"}),XYe=/^[1-9]\d{0,15}$/;function uee(n){if(n===void 0)return Object.freeze([]);if(!Array.isArray(n))throw new TypeError("allowedUsers must be an array of numeric Telegram User IDs");let A=n.map(o=>{let a=typeof o=="number"&&Number.isSafeInteger(o)?String(o):typeof o=="string"?o.trim():"";if(!XYe.test(a))throw new TypeError("allowedUsers contains an invalid Telegram User ID");return a});return Object.freeze([...new Set(A)])}function Qb(n={}){if(!n||typeof n!="object"||Array.isArray(n))throw new TypeError("Telegram access policy must be an object");let A=n.accessMode??q2.compatible;if(!Object.values(q2).includes(A))throw new TypeError("Telegram accessMode must be compatible or private-allowlist");return Object.freeze({accessMode:A,allowedUsers:uee(n.allowedUsers)})}function $Ye(n){let A=Object.hasOwn(n,"accessMode"),o=Object.hasOwn(n,"allowedUsers");if(!A&&!o)return{};try{let a=Qb(n);return{...A?{accessMode:a.accessMode}:{},...o||A?{allowedUsers:a.allowedUsers}:{}}}catch{return null}}function Eee(n){return Jl(n,hee)}function Cee(n){return nh(n,S("Telegram\u673A\u5668\u4EBA"))}var fb=class extends dI{constructor(A){super(A,{channel:"Telegram",...hee,normalizeBotExtension:$Ye})}async save(A){let o=A?.platformId?this.getByPlatformId(String(A.platformId)):null;return super.save({...o,...A})}};var yb=class extends XA{constructor(A){super({...A,rpcIdPrefix:"telegram",logPrefix:"dsh-telegram"})}};var e1e="https://api.telegram.org/",Bee=Object.freeze(["api.telegram.org"]),t1e=12e4;function Qs(n){return typeof n=="string"&&n.trim()?n.trim():null}function fee(n,A){let o=AbortSignal.timeout(A);return n?AbortSignal.any([n,o]):o}function z2(n){return n?.reason instanceof Error?n.reason:new DOMException("The operation was aborted","AbortError")}function A1e(n,A){if(!Number.isInteger(n)||n<1)throw new TypeError(`${A} must be a positive integer`);return n}function yee(n,A){return A?.providerCode!==void 0&&(n.providerCode=A.providerCode),A?.retry_after!==void 0&&(n.retry_after=A.retry_after,n.retryAfter=A.retry_after),Number.isInteger(A?.status)&&(n.status=A.status),n}function V2(n){if(!n||typeof n!="object"||Array.isArray(n))throw new TypeError("A Telegram rich message is required");let A=["markdown","html","blocks"].filter(a=>n[a]!==void 0);if(A.length!==1)throw new TypeError("A Telegram rich message requires exactly one format");let o=A[0];if((o==="markdown"||o==="html")&&(typeof n[o]!="string"||!n[o].trim()))throw new TypeError("Telegram rich message text is invalid");if(o==="blocks"&&!Array.isArray(n.blocks))throw new TypeError("Telegram rich message blocks are invalid");return n}function r1e(n,A="document"){let o=Number(n?.providerCode),a=Number(n?.status),e=Qs(n?.message)??"",i="artifact-provider-rejected",t=`Telegram rejected the ${A}.`;o===401||o===403||a===401||a===403?(i="artifact-permission-required",t=`Telegram denied permission to send the ${A}.`):o===413||a===413||/(?:file|request|entity).{0,20}(?:too (?:big|large)|size limit)|too (?:big|large)/i.test(e)?(i="artifact-too-large",t=`The ${A} exceeds Telegram's size limit.`):o===429||a===429?(i="artifact-rate-limited",t=`Telegram rate-limited ${A} delivery.`):(o>=500||a>=500)&&(i="artifact-delivery-uncertain",t=`Telegram ${A} delivery result is uncertain.`);let r=new Error(t,{cause:n});return r.code=i,yee(r,n)}function Qee(n,A="document"){let o=new Error(`Telegram ${A} delivery result is uncertain`,{cause:n});return o.code="artifact-delivery-uncertain",yee(o,n)}function i1e(n){return typeof n=="string"&&/^\d{5,20}:[A-Za-z0-9_-]{20,}$/.test(n.trim())}var a1e=/^[a-z0-9_]{1,32}$/;function o1e(n){return!!n&&typeof n=="object"&&!Array.isArray(n)&&typeof n.command=="string"&&a1e.test(n.command)&&typeof n.description=="string"&&n.description.trim().length>=1&&[...n.description].length<=256}function W2(n,{allowEmpty:A=!1}={}){if(!Array.isArray(n)||!A&&n.length===0||n.length>100||n.some(o=>!o1e(o))||new Set(n.map(o=>o.command)).size!==n.length)throw new TypeError("Telegram bot commands are invalid")}var Z2=Object.freeze({type:"commands"}),Nf=class{#t;#e;#A;#r;#n;constructor({token:A,fetchImpl:o=fetch,FormDataImpl:a=globalThis.FormData,baseUrl:e=e1e,fileUploadTimeoutMs:i=t1e}){if(!i1e(A))throw new TypeError("Telegram Bot Token is invalid");if(typeof o!="function")throw new TypeError("TelegramApi requires fetch");if(typeof a!="function")throw new TypeError("TelegramApi requires FormData");this.#t=A.trim(),this.#e=o,this.#A=a,this.#r=new URL(e),this.#n=A1e(i,"fileUploadTimeoutMs")}async getMe(A={}){return this.#i("getMe",{},A)}async getWebhookInfo(A={}){return this.#i("getWebhookInfo",{},A)}async getUpdates({offset:A,timeout:o=25,signal:a}={}){let e={timeout:o,limit:100,allowed_updates:["message"],...Number.isSafeInteger(A)?{offset:A}:{}};return this.#i("getUpdates",e,{signal:a,timeoutMs:Math.max(1e4,(o+10)*1e3)})}async getFile({fileId:A,signal:o}={}){let a=Qs(A);if(!a||!/^[A-Za-z0-9_-]{1,512}$/.test(a))throw new TypeError("Telegram file id is invalid");return this.#i("getFile",{file_id:a},{signal:o})}async downloadFile({fileId:A,signal:o,maxBytes:a}={}){let e=await this.#l(A,o);return dn(e,{fetchImpl:this.#e,signal:o,maxBytes:a,allowedHosts:Bee})}async downloadFileStream({fileId:A,signal:o}={}){let a=await this.#l(A,o);return gh(a,{fetchImpl:this.#e,signal:o,allowedHosts:Bee})}async#l(A,o){let a=await this.getFile({fileId:A,signal:o}),e=Qs(a?.file_path);if(!e||e.startsWith("/")||e.includes("\\")||e.includes("?")||e.includes("#"))throw new Error("Telegram returned an invalid file path");let i;try{i=e.split("/").map(r=>decodeURIComponent(r))}catch{throw new Error("Telegram returned an invalid file path")}if(i.some(r=>!r||r==="."||r===".."))throw new Error("Telegram returned an invalid file path");let t=new URL(this.#r);return t.pathname=`/file/bot${this.#t}/${e}`,t}async sendMessage({chatId:A,text:o,replyToMessageId:a,messageThreadId:e,signal:i}){return this.#i("sendMessage",{chat_id:A,text:o,link_preview_options:{is_disabled:!0},...a?{reply_parameters:{message_id:a,allow_sending_without_reply:!0}}:{},...e?{message_thread_id:e}:{}},{signal:i})}async setMessageReaction({chatId:A,messageId:o,emoji:a,signal:e,timeoutMs:i}){let t=Qs(a);return this.#i("setMessageReaction",{chat_id:A,message_id:o,reaction:t?[{type:"emoji",emoji:t}]:[]},{signal:e,timeoutMs:i})}async sendRichMessage({chatId:A,richMessage:o,replyToMessageId:a,messageThreadId:e,signal:i}){return this.#i("sendRichMessage",{chat_id:A,rich_message:V2(o),...a?{reply_parameters:{message_id:a,allow_sending_without_reply:!0}}:{},...e?{message_thread_id:e}:{}},{signal:i})}async sendRichMessageDraft({chatId:A,draftId:o,richMessage:a,messageThreadId:e,signal:i}){if(!Number.isSafeInteger(o)||o===0)throw new TypeError("Telegram rich message draft id must be a non-zero integer");return this.#i("sendRichMessageDraft",{chat_id:A,draft_id:o,rich_message:V2(a),...e?{message_thread_id:e}:{}},{signal:i})}async sendDocument({chatId:A,file:o,replyToMessageId:a,messageThreadId:e,signal:i}){return this.#s("sendDocument","document","document",{chatId:A,file:o,replyToMessageId:a,messageThreadId:e,signal:i})}async sendPhoto({chatId:A,file:o,replyToMessageId:a,messageThreadId:e,signal:i}){return this.#s("sendPhoto","photo","photo",{chatId:A,file:o,replyToMessageId:a,messageThreadId:e,signal:i})}async#s(A,o,a,{chatId:e,file:i,replyToMessageId:t,messageThreadId:r,signal:s}){if(!i||typeof i!="object"||typeof i.fileName!="string"||!i.fileName||!Buffer.isBuffer(i.bytes))throw new TypeError(`A Telegram ${a} is required`);let c=new this.#A;if(c.append("chat_id",String(e)),c.append(o,new Blob([i.bytes],{type:i.mediaType??"application/octet-stream"}),i.fileName),t&&c.append("reply_parameters",JSON.stringify({message_id:t,allow_sending_without_reply:!0})),r&&c.append("message_thread_id",String(r)),s?.aborted)throw z2(s);let g=fee(s,this.#n);try{return await this.#i(A,c,{signal:g,timeoutMs:this.#n,multipart:!0})}catch(I){throw s?.aborted?z2(s):I?.deliveryOutcome==="unknown"?Qee(I?.cause??I,a):I?.code?.startsWith?.("telegram-")?r1e(I,a):Qee(I,a)}}async editMessageText({chatId:A,messageId:o,text:a,richMessage:e,signal:i}){if(a===void 0==(e===void 0))throw new TypeError("Telegram message edit requires exactly one of text or richMessage");return this.#i("editMessageText",{chat_id:A,message_id:o,...a===void 0?{rich_message:V2(e)}:{text:a,link_preview_options:{is_disabled:!0}}},{signal:i})}async sendChatAction({chatId:A,messageThreadId:o,signal:a}){return this.#i("sendChatAction",{chat_id:A,action:"typing",...o?{message_thread_id:o}:{}},{signal:a})}async setMyCommands({commands:A,scope:o,languageCode:a,signal:e}={}){return W2(A),this.#i("setMyCommands",{commands:A,...o?{scope:o}:{},...Qs(a)?{language_code:Qs(a)}:{}},{signal:e})}async deleteMyCommands({scope:A,languageCode:o,signal:a}={}){return this.#i("deleteMyCommands",{...A?{scope:A}:{},...Qs(o)?{language_code:Qs(o)}:{}},{signal:a})}async setChatMenuButton({menuButton:A=Z2,signal:o}={}){if(!A||typeof A!="object"||Array.isArray(A))throw new TypeError("Telegram menu button is invalid");return this.#i("setChatMenuButton",{menu_button:A},{signal:o})}async#i(A,o,{signal:a,timeoutMs:e=15e3,multipart:i=!1}={}){if(a?.aborted)throw z2(a);let t=new URL(this.#r);t.pathname=`${t.pathname.replace(/\/$/,"")}/bot${this.#t}/${A}`;let r;try{r=await this.#e(t,{method:"POST",...i?{}:{headers:{"content-type":"application/json"}},body:i?o:JSON.stringify(o),signal:fee(a,e),redirect:"error"})}catch(c){let g=new Error(`Telegram ${A} transport failed`,{cause:c});throw g.code=c?.name==="TimeoutError"?"telegram-timeout":c?.name==="AbortError"?"telegram-aborted-after-dispatch":"telegram-transport-error",g.deliveryOutcome="unknown",g}let s;try{s=await r.json()}catch{let c=new Error(`Telegram ${A} returned invalid JSON`);throw c.status=r?.status,c.code="telegram-response-invalid",c.deliveryOutcome="unknown",c}if(!r.ok||s?.ok!==!0){let c=Qs(s?.description),g=new Error(c??`Telegram ${A} failed`);g.code=Number.isInteger(s?.error_code)?`telegram-${s.error_code}`:"telegram-api-error",g.status=r.status,Number.isInteger(s?.error_code)&&(g.providerCode=s.error_code);let I=Number(s?.parameters?.retry_after);throw Number.isFinite(I)&&I>=0&&(g.retry_after=I,g.retryAfter=I),g}return s.result}};async function mee(n,A={}){let a=await new Nf({token:n,...A}).getMe();if(!a?.id||a?.is_bot!==!0)throw new Error("Telegram token does not belong to a bot");return{platformId:String(a.id),name:Qs([a.first_name,a.last_name].filter(Boolean).join(" "))??S("Telegram\u673A\u5668\u4EBA"),username:Qs(a.username)}}var X2=Object.freeze({key:"telegram",label:"Telegram",connectionLabel:" Bot API \u957F\u8F6E\u8BE2",reactions:Object.freeze({processing:"\u{1F440}",success:"\u{1F44D}",error:"\u{1F44E}"})}),mb=class extends En{constructor(A){super({descriptor:X2,...A})}};var Rf=class extends pI{#t;constructor(A){super({...A,descriptor:X2,inspectToken:A.inspectToken??mee,deriveIdentity:Eee,maskPlatformId:Cee}),this.#t=A.configStore}status(){let A=super.status();return{...A,bots:A.bots.map(o=>{let a=this.#t.get(o.botId),e=Qb(a??{});return{...o,accessPolicy:e}})}}async setAccessPolicy(A,o){let a=Qb(o);return this.updateBotConfig(A,e=>({...e,...a}))}};import{randomInt as p1e}from"node:crypto";import{EnvHttpProxyAgent as n1e,FormData as s1e,fetch as c1e}from"undici";var g1e=4;function See(){let n=new n1e({connections:g1e}),A=!1;return{fetchImpl:(o,a={})=>c1e(o,{...a,dispatcher:n}),FormDataImpl:s1e,async destroy(){A||(A=!0,await n.destroy())}}}function eU(n){if(typeof n!="string"||!n.trim())throw new TypeError("Telegram message text must be a non-empty string");return n}function tU(n){return n==="&"?5:n==="<"||n===">"?4:1}function $2(n){return Array.from(n).reduce((A,o)=>A+tU(o),0)}function I1e(n,A,o,a){let e=A+Math.floor(a*.5);for(let i=o-1;i>=e;i-=1)if(n[i]===`
437
437
  `||n[i]===" ")return i+1;return o}function AU(n,A,o=()=>1){if(typeof n!="string")throw new TypeError("Telegram message text must be a string");if(!n)return[];let a=Array.from(n),e=[],i=0;for(;i<a.length;){let t=i,r=0;for(;t<a.length;){let s=o(a[t]);if(r+s>A)break;r+=s,t+=1}if(t===i)throw new Error("Telegram message character exceeds the chunk limit");t<a.length&&(t=I1e(a,i,t,A)),e.push(a.slice(i,t).join("")),i=t}return e}function l1e(n){return[...n.matchAll(/^```[^\n]*(?:\n|$)/gm)]}function Dee(n){let A=l1e(n);if(A.length%2!==0)throw new Error("Telegram Rich Markdown contains an unfinished code fence");return A}function kf(n){return n.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function wee(n,A){return AU(n,A,tU).map(o=>({source:o,markdown:kf(o)}))}function d1e(n,A,o,a){let e=n.slice(A.length,n.length-o.length),i=$2(A)+Math.max($2(o),$2("```"))+1,t=a-i;if(t<1)throw new Error("Telegram Rich Markdown code fence exceeds the limit");let r=AU(e,t,tU);return r.map((s,c)=>{let g=c===r.length-1,I=s.endsWith(`
438
438
  `)?"":`
439
- `,d=g?o:"```",B=`${c===0?A:""}${s}${g?o:""}`,f=kf(`${A}${s}${I}${d}`);if(Array.from(f).length>a)throw new Error("Telegram Rich Markdown code block exceeds the limit");return{source:B,markdown:f}})}function rU(n){let A=eU(n);return Dee(A),kf(A)}function iU(n,A=3e4){if(!Number.isInteger(A)||A<128||A>32768)throw new TypeError("Telegram Rich Markdown limit is invalid");let o=eU(n),a=Dee(o),e=kf(o);if(Array.from(e).length<=A)return[{source:o,markdown:e}];let i=[],t=0;for(let r=0;r<a.length;r+=2){let s=a[r],c=a[r+1];s.index>t&&i.push(...wee(o.slice(t,s.index),A));let g=c.index+c[0].length,I=o.slice(s.index,g),d=kf(I);Array.from(d).length<=A?i.push({source:I,markdown:d}):i.push(...d1e(I,s[0],c[0],A)),t=g}return t<o.length&&i.push(...wee(o.slice(t),A)),i}function aU(n,A=4e3){if(!Number.isInteger(A)||A<1||A>4096)throw new TypeError("Telegram regular message limit is invalid");return AU(eU(n),A,o=>o.length)}function bee(n,A){return uR("telegram",n).filter(o=>o.menuVisible!==!1).flatMap(o=>[o,...o.aliases??[]].filter(a=>a.menuVisible!==!1&&a.enabled!==!1&&(!a.channels||a.channels.includes("telegram"))).map(a=>({command:a.name,description:A(a.description??o.description)})))}function h1e(n=sh){let A=bee(n,S);return W2(A,{allowEmpty:!0}),A}var QMt=Object.freeze(bee(sh,n=>n).map(n=>Object.freeze(n)));function u1e(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function E1e(n,A){return A?[[n?.text,n?.entities],[n?.caption,n?.caption_entities]].some(([o,a])=>typeof o=="string"&&Array.isArray(a)&&a.some(e=>e?.type!=="mention"||!Number.isInteger(e.offset)||!Number.isInteger(e.length)?!1:o.slice(e.offset,e.offset+e.length).toLowerCase()===`@${A.toLowerCase()}`)):!1}function C1e(n,A){return!A||typeof n!="string"?n:n.replace(new RegExp(`@${u1e(A)}\\b`,"ig"),"").trim()}var B1e=new Set(["image/jpeg","image/png","image/webp","image/gif"]),f1e=new Map([[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".png","image/png"],[".webp","image/webp"],[".gif","image/gif"]]);function sU(n){let A=n?.mime_type??n?.mimetype,o=typeof A=="string"?A.toLowerCase():"";if(B1e.has(o))return o;let a=typeof n?.file_name=="string"?n.file_name.toLowerCase():"";for(let[e,i]of f1e)if(a.endsWith(e))return i;return null}function cU(n){return Number.isSafeInteger(n)&&n>=0?n:void 0}function wb(n){return cU(n?.file_size)??(Number(n?.width)||0)*(Number(n?.height)||0)}function Q1e(n,A){let o,a,e;if(Array.isArray(n?.photo)&&n.photo.length>0)o=n.photo.reduce((i,t)=>wb(t)>wb(i)?t:i),a="image/jpeg",e=`${o.file_unique_id??o.file_id??"telegram-photo"}.jpg`;else if(n?.document){let i=sU(n.document);if(!i)return null;o=n.document,a=i,e=typeof o.file_name=="string"?o.file_name:void 0}return!o||typeof o.file_id!="string"?null:{name:e,mediaType:a,size:cU(o.file_size),load:i=>A(o.file_id,i)}}function y1e(n,A){let o=n?.document;if(!o||sU(o)||typeof o.file_id!="string"||!o.file_id)return null;let a=typeof o.mime_type=="string"&&o.mime_type?o.mime_type.toLowerCase():void 0;return{name:typeof o.file_name=="string"&&o.file_name?o.file_name:String(o.file_unique_id??o.file_id),...a?{mediaType:a}:{},size:cU(o.file_size),load:({signal:e}={})=>A(o.file_id,{signal:e})}}function Sb(n,A){if(!A||typeof A!="object")return null;let o=typeof A.file_name=="string"&&A.file_name?A.file_name:void 0;return{kind:n,...o?{name:o}:{}}}function m1e(n){let A=[];if(Array.isArray(n?.photo)&&n.photo.length>0){let o=n.photo.reduce((a,e)=>wb(e)>wb(a)?e:a);A.push(Sb("image",o))}else n?.document&&A.push(Sb(sU(n.document)?"image":"file",n.document));for(let[o,a]of[["audio","audio"],["voice","audio"],["video","video"],["video_note","video"],["animation","video"]])n?.[o]&&A.push(Sb(a,n[o]));return n?.sticker&&A.push(Sb(n.sticker.is_video===!0?"video":"image",n.sticker)),A.filter(Boolean)}function S1e(n,{quote:A,loadReplyContent:o}={}){if((!n||typeof n!="object")&&(!A||typeof A!="object"))return;let a=n?.from?.id===void 0?void 0:String(n.from.id),e=[n?.from?.first_name,n?.from?.last_name].filter(g=>typeof g=="string"&&g.trim()).map(g=>g.trim()).join(" ")||(typeof n?.from?.username=="string"&&n.from.username?n.from.username:void 0),i=typeof n?.text=="string"?n.text:typeof n?.caption=="string"?n.caption:typeof A?.text=="string"?A.text:"",t=m1e(n),r=Number.isSafeInteger(n?.message_id)?String(n.message_id):void 0,s=Number.isSafeInteger(n?.date)&&n.date>=0?n.date*1e3:void 0,c=!i.trim()&&t.length===0&&typeof o=="function"?({signal:g}={})=>o({...r?{messageId:r}:{},...s===void 0?{}:{createdAt:s}},{signal:g}):null;return{...r?{messageId:r}:{},...a?{authorId:a}:{},...e?{authorName:e}:{},...i.trim()?{content:i}:{},...t.length>0?{attachments:t}:{},...c?{load:c}:{},...!i.trim()&&t.length===0&&!c?{unavailableReason:"not-delivered"}:{}}}function w1e(n,{botId:A,username:o,loadFile:a=async()=>{throw new Error("Telegram file downloader is unavailable")},loadFileStream:e=a,loadReplyContent:i}){let t=n?.message,r=t?.chat?.id,s=t?.from?.id,c=t?.message_id;if(!Number.isSafeInteger(n?.update_id)||r===void 0||s===void 0||!Number.isSafeInteger(c)||!["private","group","supergroup"].includes(t.chat?.type))return null;let g=t.chat.type==="private",I=g||String(t.reply_to_message?.from?.id??"")===String(A)||E1e(t,o),d=Number.isSafeInteger(t.message_thread_id)?t.message_thread_id:void 0,B=Q1e(t,a),f=y1e(t,e),Q=d===void 0?String(r):`${r}:${d}`,y=`${g?"direct":"group"}:${Q}`,m=S1e(t.reply_to_message??t.external_reply,{quote:t.quote,...typeof i=="function"?{loadReplyContent:(b,T)=>i({conversationKey:y,...b},T)}:{}});return{messageId:String(n.update_id),senderId:String(s),contextSource:()=>({senderName:[t.from?.first_name,t.from?.last_name].filter(b=>typeof b=="string"&&b.trim()).map(b=>b.trim()).join(" ")||t.from?.username,conversationTitle:g?void 0:t.chat?.title,chatId:String(r),threadId:d===void 0?void 0:String(d)}),senderIsBot:t.from?.is_bot===!0,kind:g?"direct":"group",conversationId:Q,content:C1e(t.text??t.caption??"",o),plainText:typeof t.text=="string",images:B?[B]:[],files:f?[f]:[],...m?{replyTo:m}:{},addressed:I,reactionTarget:{chatId:r,messageId:c},replyTarget:{chatId:r,chatType:t.chat.type,replyToMessageId:c,messageThreadId:d},connectionTestTarget:{chatId:r,messageThreadId:d}}}function oU(n){return Number.isSafeInteger(n?.message_id)?String(n.message_id):null}function vf(n){let A=Number(n?.providerCode),o=Number(n?.status),a=n?.deliveryOutcome==="unknown"||A>=500||o>=500||["telegram-timeout","telegram-aborted-after-dispatch","telegram-transport-error","telegram-response-invalid"].includes(n?.code);return{outcome:a?"unknown":"failed",reason:typeof n?.code=="string"&&n.code?n.code:a?"telegram-delivery-uncertain":"telegram-provider-rejected"}}function ko(n,A,o="sent",a){return{presentation:n,providerMessageIds:[...new Set(A)],deliveryOutcome:o,...a?{reason:a}:{}}}var Db=class{#t;#e;#A;#r;#n;#l=!1;#s=null;#i=null;#a=!1;#c=Promise.resolve();constructor({update:A,finish:o,fail:a,providerMessageIds:e=[],presentation:i,logger:t,keepalive:r=!1}){this.#t=A,this.#e=o,this.#A=a,this.#n=e,this.presentation=i,this.#r=t,this.#a=r===!0}get providerMessageIds(){return[...this.#n]}get keepalive(){return this.#a}#o(A){let o=this.#c.then(A);return this.#c=o.catch(()=>{}),o}update(A){return this.#o(async()=>{if(this.#l)return;let o=ns(A);this.#i=o;let a=`${o.format}:${o.text}`;if(a!==this.#s){this.#s=a;try{return await this.#t(o)}catch(e){this.#r.warn?.("[dsh-im:telegram] rich stream update failed:",e);return}}})}refresh(){return this.#o(async()=>{if(!(this.#l||!this.#a||!this.#i))try{return await this.#t(this.#i)}catch(A){this.#r.warn?.("[dsh-im:telegram] rich stream refresh failed:",A);return}})}finish(A){return this.#o(async()=>{if(this.#l)throw new Error("Message stream is already closed");this.#l=!0;let o=await this.#e(ns(A));return this.#n.push(...o?.providerMessageIds??[]),o})}fail(A){return this.#o(async()=>{if(this.#l)return;this.#l=!0;let o=await this.#A(ns(A,"plain"));return this.#n.push(...o?.providerMessageIds??[]),o})}cancel(){this.#l=!0}},nU=class{#t;#e;#A;constructor({api:A,signal:o,logger:a=console}){this.#t=A,this.#e=o,this.#A=a}async sendText(A,o){let a=aU(o),e=[];for(let[i,t]of a.entries()){let r=await this.#t.sendMessage({chatId:A.chatId,text:t,replyToMessageId:i===0?A.replyToMessageId:void 0,messageThreadId:A.messageThreadId,signal:this.#e});Number.isSafeInteger(r?.message_id)&&e.push(String(r.message_id))}return{providerMessageIds:e}}async addReaction(A,o,{signal:a}={}){let e=String(o??"").trim();return await this.#t.setMessageReaction({chatId:A.chatId,messageId:A.messageId,emoji:e,signal:a??this.#e}),e}removeReaction(A,o,{signal:a}={}){return this.#t.setMessageReaction({chatId:A.chatId,messageId:A.messageId,signal:a??this.#e})}sendTyping(A){return this.#t.sendChatAction({chatId:A.chatId,messageThreadId:A.messageThreadId,signal:this.#e})}sendFile(A,o){return this.#t.sendDocument({chatId:A.chatId,file:o,replyToMessageId:A.replyToMessageId,messageThreadId:A.messageThreadId,signal:this.#e})}sendImage(A,o){return this.#t.sendPhoto({chatId:A.chatId,file:o,replyToMessageId:A.replyToMessageId,messageThreadId:A.messageThreadId,signal:this.#e})}async#r(A,o,{placeholderMessageId:a}={}){let e=aU(o),i=a===void 0?[]:[String(a)],t=0;if(a!==void 0)try{await this.#t.editMessageText({chatId:A.chatId,messageId:a,text:e[0],signal:this.#e}),t=1}catch(r){let s=vf(r);if(s.outcome==="unknown")return ko("text-fallback",i,"unknown",s.reason);let c=await this.#r(A,o),g=c.deliveryOutcome==="sent"?S("\u56DE\u590D\u5DF2\u53D1\u9001\u3002"):c.deliveryOutcome==="unknown"?S("\u56DE\u590D\u53D1\u9001\u7ED3\u679C\u672A\u80FD\u786E\u8BA4\u3002"):S("\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002");try{await this.#t.editMessageText({chatId:A.chatId,messageId:a,text:g,signal:this.#e})}catch(I){this.#A.warn?.("[dsh-im:telegram] unable to replace the processing placeholder:",I)}return ko("text-fallback",[...i,...c.providerMessageIds],c.deliveryOutcome,c.reason)}for(let r=t;r<e.length;r+=1)try{let s=await this.#t.sendMessage({chatId:A.chatId,text:e[r],replyToMessageId:r===0?A.replyToMessageId:void 0,messageThreadId:A.messageThreadId,signal:this.#e}),c=oU(s);c&&i.push(c)}catch(s){let c=vf(s);return ko("text-fallback",i,c.outcome,c.reason)}return ko("text-fallback",i)}async#n(A,o){if(o.format==="plain")return this.#r(A,o.text);let a;try{a=iU(o.text)}catch{return this.#r(A,o.text)}let e=[];for(let[i,t]of a.entries())try{let r=await this.#t.sendRichMessage({chatId:A.chatId,richMessage:{markdown:t.markdown},replyToMessageId:i===0?A.replyToMessageId:void 0,messageThreadId:A.messageThreadId,signal:this.#e}),s=oU(r);s&&e.push(s)}catch(r){let s=vf(r);if(s.outcome==="unknown")return ko("telegram-rich-final",e,"unknown",s.reason);let c=a.slice(i).map(I=>I.source).join(""),g=await this.#r({...A,replyToMessageId:i===0?A.replyToMessageId:void 0},c);return ko(g.presentation,[...e,...g.providerMessageIds],g.deliveryOutcome,g.reason)}return ko("telegram-rich-final",e)}async#l(A,o,a){if(a.format==="plain")return this.#r(A,a.text,{placeholderMessageId:o});let e;try{e=iU(a.text)}catch{return this.#r(A,a.text,{placeholderMessageId:o})}let i=[String(o)];try{await this.#t.editMessageText({chatId:A.chatId,messageId:o,richMessage:{markdown:e[0].markdown},signal:this.#e})}catch(t){let r=vf(t);return r.outcome==="unknown"?ko("telegram-rich-final",i,"unknown",r.reason):this.#r(A,a.text,{placeholderMessageId:o})}for(let[t,r]of e.slice(1).entries())try{let s=await this.#t.sendRichMessage({chatId:A.chatId,richMessage:{markdown:r.markdown},messageThreadId:A.messageThreadId,signal:this.#e}),c=oU(s);c&&i.push(c)}catch(s){let c=vf(s);if(c.outcome==="unknown")return ko("telegram-rich-final",i,"unknown",c.reason);let g=e.slice(t+1).map(d=>d.source).join(""),I=await this.#r({...A,replyToMessageId:void 0},g);return ko(I.presentation,[...i,...I.providerMessageIds],I.deliveryOutcome,I.reason)}return ko("telegram-rich-final",i)}sendDelivery(A,o){return this.#n(A,ns(o))}async openDeliveryStream(A){if(A.chatType==="private"){let e=p1e(1,2147483647),i=async r=>{let s={markdown:rU(r.text)};return await this.#t.sendRichMessageDraft({chatId:A.chatId,draftId:e,richMessage:s,messageThreadId:A.messageThreadId,signal:this.#e}),ko("telegram-rich-draft",[])},t=new Db({update:i,finish:r=>this.#n(A,r),fail:r=>this.#r(A,r.text),presentation:"telegram-rich-draft",keepalive:!0,logger:this.#A});return await t.update(ns(S("\u6B63\u5728\u5904\u7406\u2026"),"plain")),t}let a=(await this.#t.sendMessage({chatId:A.chatId,text:S("\u6B63\u5728\u5904\u7406\u2026"),replyToMessageId:A.replyToMessageId,messageThreadId:A.messageThreadId,signal:this.#e}))?.message_id;if(!Number.isSafeInteger(a))throw new Error("Telegram did not return a placeholder message id");return new Db({update:async e=>e.format==="plain"?(await this.#t.editMessageText({chatId:A.chatId,messageId:a,text:e.text,signal:this.#e}),ko("text-fallback",[String(a)])):(await this.#t.editMessageText({chatId:A.chatId,messageId:a,richMessage:{markdown:rU(e.text)},signal:this.#e}),ko("telegram-rich-draft",[String(a)])),finish:e=>this.#l(A,a,e),fail:e=>this.#r(A,e.text,{placeholderMessageId:a}),providerMessageIds:[String(a)],presentation:"telegram-regular",logger:this.#A})}async openStream(A){return ch({limit:4e3,create:async a=>(await this.#t.sendMessage({chatId:A.chatId,text:a,replyToMessageId:A.replyToMessageId,messageThreadId:A.messageThreadId,signal:this.#e})).message_id,edit:(a,e)=>this.#t.editMessageText({chatId:A.chatId,messageId:a,text:e,signal:this.#e}),sendRemainder:a=>this.#t.sendMessage({chatId:A.chatId,text:a,messageThreadId:A.messageThreadId,signal:this.#e}),messageIdForResult:a=>a?.message_id}).start()}};function D1e(){return{startedAt:null,ready:!1,connectionState:"idle",harnessReachable:!1,lastCheckedAt:null,lastConnectedAt:null,lastError:null,...Ya()}}var Pf=class{#t;#e;#A;#r;#n;#l;#s;#i;#a;#c;#o;#I=D1e();#d=null;#g=null;#p=null;#h=null;#u=null;#E=null;#C=!1;#B=!1;constructor({config:A,token:o,harness:a,state:e,contextEnhancement:i,accessPolicy:t,logger:r=console,replyTimeoutMs:s=6e5,createApi:c=d=>new Nf(d),createHttpTransport:g=See,commandCatalog:I=sh}){if(!A||!o||!a||!e)throw new TypeError("TelegramRuntime requires config, token, Harness, and state");this.#t=A,this.#e=o,this.#A=a,this.#r=e,this.#n=i,this.#l=t,this.#s=r,this.#i=s,this.#a=c,this.#c=g,this.#o=I}get status(){return structuredClone(this.#I)}async sendConnectionTest(A){if(!this.#I.ready||!this.#p){let o=new Error("Telegram bot is not connected");throw o.code="test-target-unavailable",o}return this.#p.sendConnectionTest(A)}async sendProactiveText(A,o,a={}){if(!this.#I.ready||!this.#p){let r=new Error("Telegram bot is not connected");throw r.code="bot-not-connected",r}let e=typeof A?.route?.chatId=="string"?A.route.chatId.trim():"",i=Number(e),t=A?.route?.messageThreadId;if(!/^-?\d+$/.test(e)||!Number.isSafeInteger(i)||A?.kind!=="chat"&&A?.kind!=="topic"||A.kind==="topic"&&(!Number.isSafeInteger(t)||t<=0)||A.kind==="chat"&&t!==void 0){let r=new TypeError("Invalid Telegram proactive delivery target");throw r.code="invalid-target",r}return this.#p.sendProactiveText({chatId:i,...A.kind==="topic"?{messageThreadId:t}:{}},o,a)}async start(){return this.#I.ready&&this.#u?this.status:this.#E?this.#E:(this.#E=this.#Q().finally(()=>{this.#E=null}),this.#E)}async#Q(){await this.stop(),this.#C=!0,this.#I.startedAt=new Date().toISOString(),this.#I.connectionState="connecting",this.#I.lastError=null,await this.#A.ensureRunning(),this.#I.harnessReachable=!0;let A=new AbortController;this.#h=A;try{let o=this.#c();this.#d=o;let a=this.#a({token:this.#e,fetchImpl:o.fetchImpl,FormDataImpl:o.FormDataImpl});this.#g=a;let e=await a.getMe({signal:A.signal});if(String(e?.id??"")!==this.#t.platformId||e?.is_bot!==!0)throw new Error("Telegram token identity does not match the saved bot");let i=await a.getWebhookInfo({signal:A.signal});if(typeof i?.url=="string"&&i.url){let c=new Error(S("\u8BE5 Telegram \u673A\u5668\u4EBA\u5DF2\u914D\u7F6E Webhook\uFF0C\u8BF7\u5148\u5728\u539F\u670D\u52A1\u4E2D\u79FB\u9664 Webhook \u540E\u91CD\u8BD5\u3002"));throw c.code="webhook-configured",c}try{await this.#S(a,A.signal),await a.setChatMenuButton({menuButton:Z2,signal:A.signal})}catch(c){this.#s.warn?.(`[dsh-im:telegram] bot ${this.#t.botId} command menu setup failed:`,c)}let t=new nU({api:a,signal:A.signal,logger:this.#s});this.#p=new mb({bot:t,harness:this.#A,state:this.#r,contextEnhancement:this.#n,accessPolicy:this.#l,status:this.#I,logger:this.#s,replyTimeoutMs:this.#i,signal:A.signal});let r=this.#r.cursor();if(r===null){let c=await a.getUpdates({offset:-1,timeout:0,signal:A.signal});r=c.length>0?c.at(-1).update_id+1:0,await this.#r.setCursor(r)}let s=Date.now();if(this.#I.ready=!0,this.#I.connectionState="connected",this.#I.lastCheckedAt=s,this.#I.lastConnectedAt=s,this.#B){this.#B=!1;try{await this.#S(a,A.signal)}catch(c){this.#s.warn?.(`[dsh-im:telegram] bot ${this.#t.botId} command menu catch-up failed:`,c)}}return this.#u=this.#D(r,A.signal),this.#u.catch(c=>{A.signal.aborted||(this.#I.ready=!1,this.#I.connectionState="failed",this.#I.lastError=c?.message??String(c),this.#s.error?.(`[dsh-im:telegram] bot ${this.#t.botId} polling stopped:`,c))}),this.status}catch(o){throw this.#I.ready=!1,this.#I.connectionState="failed",this.#I.lastError=o?.message??String(o),await this.stop(),o}finally{this.#C=!1,this.#B=!1}}async#S(A,o){let a=h1e(this.#o);a.length>0?await A.setMyCommands({commands:a,signal:o}):await A.deleteMyCommands({signal:o})}async refreshCommandMenu(){let A=this.#g,o=this.#h?.signal;if(!this.#I.ready||!A||!o||o.aborted)return this.#C&&(this.#B=!0),!1;try{return await this.#S(A,o),!0}catch(a){return this.#s.warn?.(`[dsh-im:telegram] bot ${this.#t.botId} command menu refresh failed:`,a),!1}}async#m(A,{signal:o}={}){let a=typeof A?.conversationKey=="string"?A.conversationKey.trim():"",e=Number(A?.createdAt);if(!a||!Number.isFinite(e))return{unavailableReason:"not-delivered"};let i=this.#r.sessionFor(a),t=typeof i=="string"&&i?this.#A.workspaceSession?.(i,a):null,r=await $p({session:t,quotedAt:e,signal:o});return r?{content:r}:{unavailableReason:"not-delivered"}}async#D(A,o){let a=A;for(;!o.aborted;){let e=await this.#g.getUpdates({offset:a,timeout:25,signal:o});if(this.#I.lastCheckedAt=Date.now(),o.aborted)return;let i=e.map(t=>{let r=t?.message?.chat?.type;return{update:t,contextSnapshot:Jr(this.#n,r==="private"?"direct":r==="group"||r==="supergroup"?"group":null)}});for(let{update:t,contextSnapshot:r}of i){if(o.aborted)return;let s=w1e(t,{botId:this.#t.platformId,username:this.#t.username,loadFile:(c,g)=>this.#g.downloadFile({fileId:c,...g}),loadFileStream:(c,g)=>this.#g.downloadFileStream({fileId:c,...g}),loadReplyContent:(c,g)=>this.#m(c,g)});s&&this.#p.accept(s,{contextSnapshot:r}).catch(c=>{o.aborted||this.#s.error?.(`[dsh-im:telegram] bot ${this.#t.botId} message handling failed:`,c)}),a=t.update_id+1,await this.#r.setCursor(a)}}}async stop(){let A=this.#u,o=this.#p,a=this.#d;this.#h?.abort(),this.#h=null,this.#u=null,this.#d=null,this.#g=null,this.#p=null,await Promise.race([A?.catch(()=>{})??Promise.resolve(),new Promise(e=>setTimeout(e,2e3))]),await Promise.race([o?.waitForIdle()??Promise.resolve(),new Promise(e=>setTimeout(e,2e3))]);try{await a?.destroy()}catch{this.#s.warn?.("[dsh-im:telegram] Telegram HTTP transport cleanup failed")}return this.#I.ready=!1,this.#I.connectionState="idle",this.status}};var bb=class extends Cn{};function gU(n,A={},o={}){return lh(n,A,o,{channel:"telegram",ConfigStore:fb,StateStore:bb,HarnessClient:yb,Controller:Rf,Runtime:Pf})}var Ob="/telegram",Oee=lr,b1e=Object.freeze(Object.values(Oee));function Mb(n){return Vl(n,{channel:"Telegram"})}function IU(n,A,o){return SA(n,Ob,Mb(A),{authority:vA(o)})}async function Mee(n,A={}){return A?.controller?IU(n,A.controller,A.rpcAuthority):Tr(n,A,{channel:"telegram",rpcChannel:Ob,createProduction:()=>gU(n,A,A.internals??{}),createHandler:o=>Mb(o)})}import{unlink as Q3e}from"node:fs/promises";import{homedir as y3e}from"node:os";import{join as jf,resolve as Fd}from"node:path";import{createHash as O1e}from"node:crypto";import{mkdir as M1e,readFile as _1e,rename as T1e,unlink as N1e,writeFile as R1e}from"node:fs/promises";import{dirname as k1e}from"node:path";var lU=Object.freeze({version:1,bots:Object.freeze([])});function vd(n){return typeof n=="string"&&n.trim()?n.trim():null}function _ee(n){let A=vd(n);return A&&/^wecom_[a-f0-9]{24}$/.test(A)?A:null}function v1e(n){let A=vd(n);return A&&/^DSH_WECOM_BOT_SECRET_[A-F0-9]{24}$/.test(A)?A:null}function Tb(n){let A=vd(n);if(!A)throw new TypeError("Enterprise WeChat bot ID is required");let o=O1e("sha256").update(A).digest("hex").slice(0,24);return{botId:`wecom_${o}`,secretRef:`DSH_WECOM_BOT_SECRET_${o.toUpperCase()}`}}function dU(n){let A=vd(n)??"";return A?A.length<=10?`${A.slice(0,3)}\u2022\u2022\u2022`:`${A.slice(0,6)}\u2022\u2022\u2022\u2022${A.slice(-4)}`:S("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA")}function Tee(n){if(!n||typeof n!="object")return null;let A=_ee(n.botId),o=vd(n.remoteBotId),a=v1e(n.secretRef);if(!A||!o||!a)return null;let e=Tb(o);return e.botId!==A||e.secretRef!==a?null:Object.freeze({botId:A,remoteBotId:o,secretRef:a,createdAt:vd(n.createdAt)??new Date().toISOString(),connectedAt:vd(n.connectedAt)})}function P1e(n){if(!n||n.version!==1||!Array.isArray(n.bots))return null;let A=n.bots.map(Tee);if(A.some(i=>i===null))return null;let o=new Set,a=new Set,e=new Set;for(let i of A){if(o.has(i.botId)||a.has(i.remoteBotId)||e.has(i.secretRef))return null;o.add(i.botId),a.add(i.remoteBotId),e.add(i.secretRef)}return Object.freeze({version:1,bots:Object.freeze(A)})}var _b=class{#t;#e=lU;#A=Promise.resolve();constructor(A){this.#t=A}async load(){try{let A=P1e(JSON.parse(await _1e(this.#t,"utf8")));if(!A)throw new Error("dsh-im Enterprise WeChat config contains invalid bot data");this.#e=A}catch(A){if(A?.code!=="ENOENT")throw A;this.#e=lU}return this}list(){return structuredClone(this.#e.bots)}get(A){let o=this.#e.bots.find(a=>a.botId===A);return o?structuredClone(o):null}getByRemoteBotId(A){let o=this.#e.bots.find(a=>a.remoteBotId===A);return o?structuredClone(o):null}async save(A){let o=Tee(A);if(!o)throw new Error("Refusing to persist incomplete Enterprise WeChat bot data");return this.#r(a=>{let e=a.find(r=>r.remoteBotId===o.remoteBotId&&r.botId!==o.botId),i=a.find(r=>r.secretRef===o.secretRef&&r.botId!==o.botId);if(e||i)throw new Error("Duplicate Enterprise WeChat bot identity");let t=a.findIndex(r=>r.botId===o.botId);return t===-1?a.push(o):a[t]=o,structuredClone(o)})}async remove(A){if(!_ee(A))throw new TypeError("Invalid Enterprise WeChat bot ID");return this.#r(o=>{let a=o.findIndex(i=>i.botId===A);if(a===-1)return null;let[e]=o.splice(a,1);return structuredClone(e)})}async clear(){let A=this.#A.then(async()=>{try{await N1e(this.#t)}catch(o){if(o?.code!=="ENOENT")throw o}this.#e=lU});this.#A=A.then(()=>{},()=>{}),await A}async#r(A){let o,a=this.#A.then(async()=>{let e=[...this.#e.bots];o=A(e);let i=Object.freeze({version:1,bots:Object.freeze(e)});await this.#n(i),this.#e=i});return this.#A=a.then(()=>{},()=>{}),await a,o}async#n(A){await M1e(k1e(this.#t),{recursive:!0,mode:448});let o=`${this.#t}.tmp`;await R1e(o,`${JSON.stringify(A,null,2)}
439
+ `,d=g?o:"```",B=`${c===0?A:""}${s}${g?o:""}`,f=kf(`${A}${s}${I}${d}`);if(Array.from(f).length>a)throw new Error("Telegram Rich Markdown code block exceeds the limit");return{source:B,markdown:f}})}function rU(n){let A=eU(n);return Dee(A),kf(A)}function iU(n,A=3e4){if(!Number.isInteger(A)||A<128||A>32768)throw new TypeError("Telegram Rich Markdown limit is invalid");let o=eU(n),a=Dee(o),e=kf(o);if(Array.from(e).length<=A)return[{source:o,markdown:e}];let i=[],t=0;for(let r=0;r<a.length;r+=2){let s=a[r],c=a[r+1];s.index>t&&i.push(...wee(o.slice(t,s.index),A));let g=c.index+c[0].length,I=o.slice(s.index,g),d=kf(I);Array.from(d).length<=A?i.push({source:I,markdown:d}):i.push(...d1e(I,s[0],c[0],A)),t=g}return t<o.length&&i.push(...wee(o.slice(t),A)),i}function aU(n,A=4e3){if(!Number.isInteger(A)||A<1||A>4096)throw new TypeError("Telegram regular message limit is invalid");return AU(eU(n),A,o=>o.length)}function bee(n,A){return uR("telegram",n).filter(o=>o.menuVisible!==!1).flatMap(o=>[o,...o.aliases??[]].filter(a=>a.menuVisible!==!1&&a.enabled!==!1&&(!a.channels||a.channels.includes("telegram"))).map(a=>({command:a.name,description:A(a.description??o.description)})))}function h1e(n=sh){let A=bee(n,S);return W2(A,{allowEmpty:!0}),A}var QMt=Object.freeze(bee(sh,n=>n).map(n=>Object.freeze(n)));function u1e(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function E1e(n,A){return A?[[n?.text,n?.entities],[n?.caption,n?.caption_entities]].some(([o,a])=>typeof o=="string"&&Array.isArray(a)&&a.some(e=>e?.type!=="mention"||!Number.isInteger(e.offset)||!Number.isInteger(e.length)?!1:o.slice(e.offset,e.offset+e.length).toLowerCase()===`@${A.toLowerCase()}`)):!1}function C1e(n,A){return!A||typeof n!="string"?n:n.replace(new RegExp(`@${u1e(A)}\\b`,"ig"),"").trim()}var B1e=new Set(["image/jpeg","image/png","image/webp","image/gif"]),f1e=new Map([[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".png","image/png"],[".webp","image/webp"],[".gif","image/gif"]]);function sU(n){let A=n?.mime_type??n?.mimetype,o=typeof A=="string"?A.toLowerCase():"";if(B1e.has(o))return o;let a=typeof n?.file_name=="string"?n.file_name.toLowerCase():"";for(let[e,i]of f1e)if(a.endsWith(e))return i;return null}function cU(n){return Number.isSafeInteger(n)&&n>=0?n:void 0}function wb(n){return cU(n?.file_size)??(Number(n?.width)||0)*(Number(n?.height)||0)}function Q1e(n,A){let o,a,e;if(Array.isArray(n?.photo)&&n.photo.length>0)o=n.photo.reduce((i,t)=>wb(t)>wb(i)?t:i),a="image/jpeg",e=`${o.file_unique_id??o.file_id??"telegram-photo"}.jpg`;else if(n?.document){let i=sU(n.document);if(!i)return null;o=n.document,a=i,e=typeof o.file_name=="string"?o.file_name:void 0}return!o||typeof o.file_id!="string"?null:{name:e,mediaType:a,size:cU(o.file_size),load:i=>A(o.file_id,i)}}function y1e(n,A){let o=n?.document;if(!o||sU(o)||typeof o.file_id!="string"||!o.file_id)return null;let a=typeof o.mime_type=="string"&&o.mime_type?o.mime_type.toLowerCase():void 0;return{name:typeof o.file_name=="string"&&o.file_name?o.file_name:String(o.file_unique_id??o.file_id),...a?{mediaType:a}:{},size:cU(o.file_size),load:({signal:e}={})=>A(o.file_id,{signal:e})}}function Sb(n,A){if(!A||typeof A!="object")return null;let o=typeof A.file_name=="string"&&A.file_name?A.file_name:void 0;return{kind:n,...o?{name:o}:{}}}function m1e(n){let A=[];if(Array.isArray(n?.photo)&&n.photo.length>0){let o=n.photo.reduce((a,e)=>wb(e)>wb(a)?e:a);A.push(Sb("image",o))}else n?.document&&A.push(Sb(sU(n.document)?"image":"file",n.document));for(let[o,a]of[["audio","audio"],["voice","audio"],["video","video"],["video_note","video"],["animation","video"]])n?.[o]&&A.push(Sb(a,n[o]));return n?.sticker&&A.push(Sb(n.sticker.is_video===!0?"video":"image",n.sticker)),A.filter(Boolean)}function S1e(n,{quote:A,loadReplyContent:o}={}){if((!n||typeof n!="object")&&(!A||typeof A!="object"))return;let a=n?.from?.id===void 0?void 0:String(n.from.id),e=[n?.from?.first_name,n?.from?.last_name].filter(g=>typeof g=="string"&&g.trim()).map(g=>g.trim()).join(" ")||(typeof n?.from?.username=="string"&&n.from.username?n.from.username:void 0),i=typeof n?.text=="string"?n.text:typeof n?.caption=="string"?n.caption:typeof A?.text=="string"?A.text:"",t=m1e(n),r=Number.isSafeInteger(n?.message_id)?String(n.message_id):void 0,s=Number.isSafeInteger(n?.date)&&n.date>=0?n.date*1e3:void 0,c=!i.trim()&&t.length===0&&typeof o=="function"?({signal:g}={})=>o({...r?{messageId:r}:{},...s===void 0?{}:{createdAt:s}},{signal:g}):null;return{...r?{messageId:r}:{},...a?{authorId:a}:{},...e?{authorName:e}:{},...i.trim()?{content:i}:{},...t.length>0?{attachments:t}:{},...c?{load:c}:{},...!i.trim()&&t.length===0&&!c?{unavailableReason:"not-delivered"}:{}}}function w1e(n,{botId:A,username:o,loadFile:a=async()=>{throw new Error("Telegram file downloader is unavailable")},loadFileStream:e=a,loadReplyContent:i}){let t=n?.message,r=t?.chat?.id,s=t?.from?.id,c=t?.message_id;if(!Number.isSafeInteger(n?.update_id)||r===void 0||s===void 0||!Number.isSafeInteger(c)||!["private","group","supergroup"].includes(t.chat?.type))return null;let g=t.chat.type==="private",I=g||String(t.reply_to_message?.from?.id??"")===String(A)||E1e(t,o),d=Number.isSafeInteger(t.message_thread_id)?t.message_thread_id:void 0,B=Q1e(t,a),f=y1e(t,e),Q=d===void 0?String(r):`${r}:${d}`,y=`${g?"direct":"group"}:${Q}`,m=S1e(t.reply_to_message??t.external_reply,{quote:t.quote,...typeof i=="function"?{loadReplyContent:(b,T)=>i({conversationKey:y,...b},T)}:{}});return{messageId:String(n.update_id),senderId:String(s),contextSource:()=>({senderName:[t.from?.first_name,t.from?.last_name].filter(b=>typeof b=="string"&&b.trim()).map(b=>b.trim()).join(" ")||t.from?.username,conversationTitle:g?void 0:t.chat?.title,chatId:String(r),threadId:d===void 0?void 0:String(d)}),senderIsBot:t.from?.is_bot===!0,kind:g?"direct":"group",conversationId:Q,content:C1e(t.text??t.caption??"",o),plainText:typeof t.text=="string",images:B?[B]:[],files:f?[f]:[],...m?{replyTo:m}:{},addressed:I,reactionTarget:{chatId:r,messageId:c},replyTarget:{chatId:r,chatType:t.chat.type,replyToMessageId:c,messageThreadId:d},connectionTestTarget:{chatId:r,messageThreadId:d}}}function oU(n){return Number.isSafeInteger(n?.message_id)?String(n.message_id):null}function vf(n){let A=Number(n?.providerCode),o=Number(n?.status),a=n?.deliveryOutcome==="unknown"||A>=500||o>=500||["telegram-timeout","telegram-aborted-after-dispatch","telegram-transport-error","telegram-response-invalid"].includes(n?.code);return{outcome:a?"unknown":"failed",reason:typeof n?.code=="string"&&n.code?n.code:a?"telegram-delivery-uncertain":"telegram-provider-rejected"}}function ko(n,A,o="sent",a){return{presentation:n,providerMessageIds:[...new Set(A)],deliveryOutcome:o,...a?{reason:a}:{}}}var Db=class{#t;#e;#A;#r;#n;#l=!1;#s=null;#i=null;#a=!1;#c=!1;#o=Promise.resolve();constructor({update:A,finish:o,fail:a,providerMessageIds:e=[],presentation:i,logger:t,keepalive:r=!1}){this.#t=A,this.#e=o,this.#A=a,this.#n=e,this.presentation=i,this.#r=t,this.#a=r===!0}get providerMessageIds(){return[...this.#n]}get keepalive(){return this.#a}#I(A){let o=this.#o.then(A);return this.#o=o.catch(()=>{}),o}stopPreview(){return this.#c=!0,this.#I(()=>{})}update(A){return this.#I(async()=>{if(this.#l||this.#c)return;let o=ns(A);this.#i=o;let a=`${o.format}:${o.text}`;if(a!==this.#s){this.#s=a;try{return await this.#t(o)}catch(e){this.#r.warn?.("[dsh-im:telegram] rich stream update failed:",e);return}}})}refresh(){return this.#I(async()=>{if(!(this.#l||this.#c||!this.#a||!this.#i))try{return await this.#t(this.#i)}catch(A){this.#r.warn?.("[dsh-im:telegram] rich stream refresh failed:",A);return}})}finish(A){return this.#I(async()=>{if(this.#l)throw new Error("Message stream is already closed");this.#l=!0;let o=await this.#e(ns(A));return this.#n.push(...o?.providerMessageIds??[]),o})}fail(A){return this.#I(async()=>{if(this.#l)return;this.#l=!0;let o=await this.#A(ns(A,"plain"));return this.#n.push(...o?.providerMessageIds??[]),o})}cancel(){this.#l=!0}},nU=class{#t;#e;#A;constructor({api:A,signal:o,logger:a=console}){this.#t=A,this.#e=o,this.#A=a}async sendText(A,o){let a=aU(o),e=[];for(let[i,t]of a.entries()){let r=await this.#t.sendMessage({chatId:A.chatId,text:t,replyToMessageId:i===0?A.replyToMessageId:void 0,messageThreadId:A.messageThreadId,signal:this.#e});Number.isSafeInteger(r?.message_id)&&e.push(String(r.message_id))}return{providerMessageIds:e}}async addReaction(A,o,{signal:a}={}){let e=String(o??"").trim();return await this.#t.setMessageReaction({chatId:A.chatId,messageId:A.messageId,emoji:e,signal:a??this.#e}),e}removeReaction(A,o,{signal:a}={}){return this.#t.setMessageReaction({chatId:A.chatId,messageId:A.messageId,signal:a??this.#e})}sendTyping(A){return this.#t.sendChatAction({chatId:A.chatId,messageThreadId:A.messageThreadId,signal:this.#e})}sendFile(A,o){return this.#t.sendDocument({chatId:A.chatId,file:o,replyToMessageId:A.replyToMessageId,messageThreadId:A.messageThreadId,signal:this.#e})}sendImage(A,o){return this.#t.sendPhoto({chatId:A.chatId,file:o,replyToMessageId:A.replyToMessageId,messageThreadId:A.messageThreadId,signal:this.#e})}async#r(A,o,{placeholderMessageId:a}={}){let e=aU(o),i=a===void 0?[]:[String(a)],t=0;if(a!==void 0)try{await this.#t.editMessageText({chatId:A.chatId,messageId:a,text:e[0],signal:this.#e}),t=1}catch(r){let s=vf(r);if(s.outcome==="unknown")return ko("text-fallback",i,"unknown",s.reason);let c=await this.#r(A,o),g=c.deliveryOutcome==="sent"?S("\u56DE\u590D\u5DF2\u53D1\u9001\u3002"):c.deliveryOutcome==="unknown"?S("\u56DE\u590D\u53D1\u9001\u7ED3\u679C\u672A\u80FD\u786E\u8BA4\u3002"):S("\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002");try{await this.#t.editMessageText({chatId:A.chatId,messageId:a,text:g,signal:this.#e})}catch(I){this.#A.warn?.("[dsh-im:telegram] unable to replace the processing placeholder:",I)}return ko("text-fallback",[...i,...c.providerMessageIds],c.deliveryOutcome,c.reason)}for(let r=t;r<e.length;r+=1)try{let s=await this.#t.sendMessage({chatId:A.chatId,text:e[r],replyToMessageId:r===0?A.replyToMessageId:void 0,messageThreadId:A.messageThreadId,signal:this.#e}),c=oU(s);c&&i.push(c)}catch(s){let c=vf(s);return ko("text-fallback",i,c.outcome,c.reason)}return ko("text-fallback",i)}async#n(A,o){if(o.format==="plain")return this.#r(A,o.text);let a;try{a=iU(o.text)}catch{return this.#r(A,o.text)}let e=[];for(let[i,t]of a.entries())try{let r=await this.#t.sendRichMessage({chatId:A.chatId,richMessage:{markdown:t.markdown},replyToMessageId:i===0?A.replyToMessageId:void 0,messageThreadId:A.messageThreadId,signal:this.#e}),s=oU(r);s&&e.push(s)}catch(r){let s=vf(r);if(s.outcome==="unknown")return ko("telegram-rich-final",e,"unknown",s.reason);let c=a.slice(i).map(I=>I.source).join(""),g=await this.#r({...A,replyToMessageId:i===0?A.replyToMessageId:void 0},c);return ko(g.presentation,[...e,...g.providerMessageIds],g.deliveryOutcome,g.reason)}return ko("telegram-rich-final",e)}async#l(A,o,a){if(a.format==="plain")return this.#r(A,a.text,{placeholderMessageId:o});let e;try{e=iU(a.text)}catch{return this.#r(A,a.text,{placeholderMessageId:o})}let i=[String(o)];try{await this.#t.editMessageText({chatId:A.chatId,messageId:o,richMessage:{markdown:e[0].markdown},signal:this.#e})}catch(t){let r=vf(t);return r.outcome==="unknown"?ko("telegram-rich-final",i,"unknown",r.reason):this.#r(A,a.text,{placeholderMessageId:o})}for(let[t,r]of e.slice(1).entries())try{let s=await this.#t.sendRichMessage({chatId:A.chatId,richMessage:{markdown:r.markdown},messageThreadId:A.messageThreadId,signal:this.#e}),c=oU(s);c&&i.push(c)}catch(s){let c=vf(s);if(c.outcome==="unknown")return ko("telegram-rich-final",i,"unknown",c.reason);let g=e.slice(t+1).map(d=>d.source).join(""),I=await this.#r({...A,replyToMessageId:void 0},g);return ko(I.presentation,[...i,...I.providerMessageIds],I.deliveryOutcome,I.reason)}return ko("telegram-rich-final",i)}sendDelivery(A,o){return this.#n(A,ns(o))}async openDeliveryStream(A){if(A.chatType==="private"){let e=p1e(1,2147483647),i=async r=>{let s={markdown:rU(r.text)};return await this.#t.sendRichMessageDraft({chatId:A.chatId,draftId:e,richMessage:s,messageThreadId:A.messageThreadId,signal:this.#e}),ko("telegram-rich-draft",[])},t=new Db({update:i,finish:r=>this.#n(A,r),fail:r=>this.#r(A,r.text),presentation:"telegram-rich-draft",keepalive:!0,logger:this.#A});return await t.update(ns(S("\u6B63\u5728\u5904\u7406\u2026"),"plain")),t}let a=(await this.#t.sendMessage({chatId:A.chatId,text:S("\u6B63\u5728\u5904\u7406\u2026"),replyToMessageId:A.replyToMessageId,messageThreadId:A.messageThreadId,signal:this.#e}))?.message_id;if(!Number.isSafeInteger(a))throw new Error("Telegram did not return a placeholder message id");return new Db({update:async e=>e.format==="plain"?(await this.#t.editMessageText({chatId:A.chatId,messageId:a,text:e.text,signal:this.#e}),ko("text-fallback",[String(a)])):(await this.#t.editMessageText({chatId:A.chatId,messageId:a,richMessage:{markdown:rU(e.text)},signal:this.#e}),ko("telegram-rich-draft",[String(a)])),finish:e=>this.#l(A,a,e),fail:e=>this.#r(A,e.text,{placeholderMessageId:a}),providerMessageIds:[String(a)],presentation:"telegram-regular",logger:this.#A})}async openStream(A){return ch({limit:4e3,create:async a=>(await this.#t.sendMessage({chatId:A.chatId,text:a,replyToMessageId:A.replyToMessageId,messageThreadId:A.messageThreadId,signal:this.#e})).message_id,edit:(a,e)=>this.#t.editMessageText({chatId:A.chatId,messageId:a,text:e,signal:this.#e}),sendRemainder:a=>this.#t.sendMessage({chatId:A.chatId,text:a,messageThreadId:A.messageThreadId,signal:this.#e}),messageIdForResult:a=>a?.message_id}).start()}};function D1e(){return{startedAt:null,ready:!1,connectionState:"idle",harnessReachable:!1,lastCheckedAt:null,lastConnectedAt:null,lastError:null,...Ya()}}var Pf=class{#t;#e;#A;#r;#n;#l;#s;#i;#a;#c;#o;#I=D1e();#d=null;#g=null;#p=null;#h=null;#u=null;#E=null;#C=!1;#B=!1;constructor({config:A,token:o,harness:a,state:e,contextEnhancement:i,accessPolicy:t,logger:r=console,replyTimeoutMs:s=6e5,createApi:c=d=>new Nf(d),createHttpTransport:g=See,commandCatalog:I=sh}){if(!A||!o||!a||!e)throw new TypeError("TelegramRuntime requires config, token, Harness, and state");this.#t=A,this.#e=o,this.#A=a,this.#r=e,this.#n=i,this.#l=t,this.#s=r,this.#i=s,this.#a=c,this.#c=g,this.#o=I}get status(){return structuredClone(this.#I)}async sendConnectionTest(A){if(!this.#I.ready||!this.#p){let o=new Error("Telegram bot is not connected");throw o.code="test-target-unavailable",o}return this.#p.sendConnectionTest(A)}async sendProactiveText(A,o,a={}){if(!this.#I.ready||!this.#p){let r=new Error("Telegram bot is not connected");throw r.code="bot-not-connected",r}let e=typeof A?.route?.chatId=="string"?A.route.chatId.trim():"",i=Number(e),t=A?.route?.messageThreadId;if(!/^-?\d+$/.test(e)||!Number.isSafeInteger(i)||A?.kind!=="chat"&&A?.kind!=="topic"||A.kind==="topic"&&(!Number.isSafeInteger(t)||t<=0)||A.kind==="chat"&&t!==void 0){let r=new TypeError("Invalid Telegram proactive delivery target");throw r.code="invalid-target",r}return this.#p.sendProactiveText({chatId:i,...A.kind==="topic"?{messageThreadId:t}:{}},o,a)}async start(){return this.#I.ready&&this.#u?this.status:this.#E?this.#E:(this.#E=this.#Q().finally(()=>{this.#E=null}),this.#E)}async#Q(){await this.stop(),this.#C=!0,this.#I.startedAt=new Date().toISOString(),this.#I.connectionState="connecting",this.#I.lastError=null,await this.#A.ensureRunning(),this.#I.harnessReachable=!0;let A=new AbortController;this.#h=A;try{let o=this.#c();this.#d=o;let a=this.#a({token:this.#e,fetchImpl:o.fetchImpl,FormDataImpl:o.FormDataImpl});this.#g=a;let e=await a.getMe({signal:A.signal});if(String(e?.id??"")!==this.#t.platformId||e?.is_bot!==!0)throw new Error("Telegram token identity does not match the saved bot");let i=await a.getWebhookInfo({signal:A.signal});if(typeof i?.url=="string"&&i.url){let c=new Error(S("\u8BE5 Telegram \u673A\u5668\u4EBA\u5DF2\u914D\u7F6E Webhook\uFF0C\u8BF7\u5148\u5728\u539F\u670D\u52A1\u4E2D\u79FB\u9664 Webhook \u540E\u91CD\u8BD5\u3002"));throw c.code="webhook-configured",c}try{await this.#S(a,A.signal),await a.setChatMenuButton({menuButton:Z2,signal:A.signal})}catch(c){this.#s.warn?.(`[dsh-im:telegram] bot ${this.#t.botId} command menu setup failed:`,c)}let t=new nU({api:a,signal:A.signal,logger:this.#s});this.#p=new mb({bot:t,harness:this.#A,state:this.#r,contextEnhancement:this.#n,accessPolicy:this.#l,status:this.#I,logger:this.#s,replyTimeoutMs:this.#i,signal:A.signal});let r=this.#r.cursor();if(r===null){let c=await a.getUpdates({offset:-1,timeout:0,signal:A.signal});r=c.length>0?c.at(-1).update_id+1:0,await this.#r.setCursor(r)}let s=Date.now();if(this.#I.ready=!0,this.#I.connectionState="connected",this.#I.lastCheckedAt=s,this.#I.lastConnectedAt=s,this.#B){this.#B=!1;try{await this.#S(a,A.signal)}catch(c){this.#s.warn?.(`[dsh-im:telegram] bot ${this.#t.botId} command menu catch-up failed:`,c)}}return this.#u=this.#D(r,A.signal),this.#u.catch(c=>{A.signal.aborted||(this.#I.ready=!1,this.#I.connectionState="failed",this.#I.lastError=c?.message??String(c),this.#s.error?.(`[dsh-im:telegram] bot ${this.#t.botId} polling stopped:`,c))}),this.status}catch(o){throw this.#I.ready=!1,this.#I.connectionState="failed",this.#I.lastError=o?.message??String(o),await this.stop(),o}finally{this.#C=!1,this.#B=!1}}async#S(A,o){let a=h1e(this.#o);a.length>0?await A.setMyCommands({commands:a,signal:o}):await A.deleteMyCommands({signal:o})}async refreshCommandMenu(){let A=this.#g,o=this.#h?.signal;if(!this.#I.ready||!A||!o||o.aborted)return this.#C&&(this.#B=!0),!1;try{return await this.#S(A,o),!0}catch(a){return this.#s.warn?.(`[dsh-im:telegram] bot ${this.#t.botId} command menu refresh failed:`,a),!1}}async#m(A,{signal:o}={}){let a=typeof A?.conversationKey=="string"?A.conversationKey.trim():"",e=Number(A?.createdAt);if(!a||!Number.isFinite(e))return{unavailableReason:"not-delivered"};let i=this.#r.sessionFor(a),t=typeof i=="string"&&i?this.#A.workspaceSession?.(i,a):null,r=await $p({session:t,quotedAt:e,signal:o});return r?{content:r}:{unavailableReason:"not-delivered"}}async#D(A,o){let a=A;for(;!o.aborted;){let e=await this.#g.getUpdates({offset:a,timeout:25,signal:o});if(this.#I.lastCheckedAt=Date.now(),o.aborted)return;let i=e.map(t=>{let r=t?.message?.chat?.type;return{update:t,contextSnapshot:Jr(this.#n,r==="private"?"direct":r==="group"||r==="supergroup"?"group":null)}});for(let{update:t,contextSnapshot:r}of i){if(o.aborted)return;let s=w1e(t,{botId:this.#t.platformId,username:this.#t.username,loadFile:(c,g)=>this.#g.downloadFile({fileId:c,...g}),loadFileStream:(c,g)=>this.#g.downloadFileStream({fileId:c,...g}),loadReplyContent:(c,g)=>this.#m(c,g)});s&&this.#p.accept(s,{contextSnapshot:r}).catch(c=>{o.aborted||this.#s.error?.(`[dsh-im:telegram] bot ${this.#t.botId} message handling failed:`,c)}),a=t.update_id+1,await this.#r.setCursor(a)}}}async stop(){let A=this.#u,o=this.#p,a=this.#d;this.#h?.abort(),this.#h=null,this.#u=null,this.#d=null,this.#g=null,this.#p=null,await Promise.race([A?.catch(()=>{})??Promise.resolve(),new Promise(e=>setTimeout(e,2e3))]),await Promise.race([o?.waitForIdle()??Promise.resolve(),new Promise(e=>setTimeout(e,2e3))]);try{await a?.destroy()}catch{this.#s.warn?.("[dsh-im:telegram] Telegram HTTP transport cleanup failed")}return this.#I.ready=!1,this.#I.connectionState="idle",this.status}};var bb=class extends Cn{};function gU(n,A={},o={}){return lh(n,A,o,{channel:"telegram",ConfigStore:fb,StateStore:bb,HarnessClient:yb,Controller:Rf,Runtime:Pf})}var Ob="/telegram",Oee=lr,b1e=Object.freeze(Object.values(Oee));function Mb(n){return Vl(n,{channel:"Telegram"})}function IU(n,A,o){return SA(n,Ob,Mb(A),{authority:vA(o)})}async function Mee(n,A={}){return A?.controller?IU(n,A.controller,A.rpcAuthority):Tr(n,A,{channel:"telegram",rpcChannel:Ob,createProduction:()=>gU(n,A,A.internals??{}),createHandler:o=>Mb(o)})}import{unlink as Q3e}from"node:fs/promises";import{homedir as y3e}from"node:os";import{join as jf,resolve as Fd}from"node:path";import{createHash as O1e}from"node:crypto";import{mkdir as M1e,readFile as _1e,rename as T1e,unlink as N1e,writeFile as R1e}from"node:fs/promises";import{dirname as k1e}from"node:path";var lU=Object.freeze({version:1,bots:Object.freeze([])});function vd(n){return typeof n=="string"&&n.trim()?n.trim():null}function _ee(n){let A=vd(n);return A&&/^wecom_[a-f0-9]{24}$/.test(A)?A:null}function v1e(n){let A=vd(n);return A&&/^DSH_WECOM_BOT_SECRET_[A-F0-9]{24}$/.test(A)?A:null}function Tb(n){let A=vd(n);if(!A)throw new TypeError("Enterprise WeChat bot ID is required");let o=O1e("sha256").update(A).digest("hex").slice(0,24);return{botId:`wecom_${o}`,secretRef:`DSH_WECOM_BOT_SECRET_${o.toUpperCase()}`}}function dU(n){let A=vd(n)??"";return A?A.length<=10?`${A.slice(0,3)}\u2022\u2022\u2022`:`${A.slice(0,6)}\u2022\u2022\u2022\u2022${A.slice(-4)}`:S("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA")}function Tee(n){if(!n||typeof n!="object")return null;let A=_ee(n.botId),o=vd(n.remoteBotId),a=v1e(n.secretRef);if(!A||!o||!a)return null;let e=Tb(o);return e.botId!==A||e.secretRef!==a?null:Object.freeze({botId:A,remoteBotId:o,secretRef:a,createdAt:vd(n.createdAt)??new Date().toISOString(),connectedAt:vd(n.connectedAt)})}function P1e(n){if(!n||n.version!==1||!Array.isArray(n.bots))return null;let A=n.bots.map(Tee);if(A.some(i=>i===null))return null;let o=new Set,a=new Set,e=new Set;for(let i of A){if(o.has(i.botId)||a.has(i.remoteBotId)||e.has(i.secretRef))return null;o.add(i.botId),a.add(i.remoteBotId),e.add(i.secretRef)}return Object.freeze({version:1,bots:Object.freeze(A)})}var _b=class{#t;#e=lU;#A=Promise.resolve();constructor(A){this.#t=A}async load(){try{let A=P1e(JSON.parse(await _1e(this.#t,"utf8")));if(!A)throw new Error("dsh-im Enterprise WeChat config contains invalid bot data");this.#e=A}catch(A){if(A?.code!=="ENOENT")throw A;this.#e=lU}return this}list(){return structuredClone(this.#e.bots)}get(A){let o=this.#e.bots.find(a=>a.botId===A);return o?structuredClone(o):null}getByRemoteBotId(A){let o=this.#e.bots.find(a=>a.remoteBotId===A);return o?structuredClone(o):null}async save(A){let o=Tee(A);if(!o)throw new Error("Refusing to persist incomplete Enterprise WeChat bot data");return this.#r(a=>{let e=a.find(r=>r.remoteBotId===o.remoteBotId&&r.botId!==o.botId),i=a.find(r=>r.secretRef===o.secretRef&&r.botId!==o.botId);if(e||i)throw new Error("Duplicate Enterprise WeChat bot identity");let t=a.findIndex(r=>r.botId===o.botId);return t===-1?a.push(o):a[t]=o,structuredClone(o)})}async remove(A){if(!_ee(A))throw new TypeError("Invalid Enterprise WeChat bot ID");return this.#r(o=>{let a=o.findIndex(i=>i.botId===A);if(a===-1)return null;let[e]=o.splice(a,1);return structuredClone(e)})}async clear(){let A=this.#A.then(async()=>{try{await N1e(this.#t)}catch(o){if(o?.code!=="ENOENT")throw o}this.#e=lU});this.#A=A.then(()=>{},()=>{}),await A}async#r(A){let o,a=this.#A.then(async()=>{let e=[...this.#e.bots];o=A(e);let i=Object.freeze({version:1,bots:Object.freeze(e)});await this.#n(i),this.#e=i});return this.#A=a.then(()=>{},()=>{}),await a,o}async#n(A){await M1e(k1e(this.#t),{recursive:!0,mode:448});let o=`${this.#t}.tmp`;await R1e(o,`${JSON.stringify(A,null,2)}
440
440
  `,{encoding:"utf8",mode:384}),await T1e(o,this.#t)}};var Nb=class extends XA{constructor(A){super({...A,rpcIdPrefix:"wecom",logPrefix:"dsh-wecom"})}};var G1e="https://work.weixin.qq.com/ai/qc/generate",F1e="https://work.weixin.qq.com/ai/qc/query_result";function Nee(){return process.platform==="win32"?2:process.platform==="linux"?3:1}function fu(n){return typeof n=="string"&&n.trim()?n.trim():null}function L1e(n){let A=fu(n);if(!A)return null;try{let o=new URL(A);return o.protocol==="https:"&&o.hostname==="work.weixin.qq.com"&&(!o.port||o.port==="443")?o.href:null}catch{return null}}function U1e(n,A){return n?AbortSignal.any([n,AbortSignal.timeout(A)]):AbortSignal.timeout(A)}async function Ree(n,A,o){let a=await n(A,{method:"GET",redirect:"error",signal:U1e(o,1e4),headers:{accept:"application/json"}});if(!a.ok)throw new Error(`Enterprise WeChat QR service returned HTTP ${a.status}`);return a.json()}var Rb=class{#t;#e;#A;#r;constructor({fetch:A=globalThis.fetch,clock:o=()=>Date.now(),source:a="deepseek-harness",platform:e=Nee()}={}){if(typeof A!="function")throw new TypeError("A fetch implementation is required");this.#t=A,this.#e=o,this.#A=a,this.#r=[1,2,3].includes(e)?e:Nee()}async start({signal:A}={}){let o=new URL(G1e);o.searchParams.set("source",this.#A),o.searchParams.set("plat",String(this.#r));let a=await Ree(this.#t,o,A),e=fu(a?.data?.scode),i=L1e(a?.data?.auth_url);if(!e||!i)throw new Error("Enterprise WeChat QR service returned invalid data");return{scode:e,verificationUrl:i,expiresAt:this.#e()+3e5,pollIntervalMs:3e3}}async poll({scode:A,signal:o}={}){let a=fu(A);if(!a)throw new TypeError("Enterprise WeChat QR poll code is required");let e=new URL(F1e);e.searchParams.set("scode",a);let i=await Ree(this.#t,e,o),t=fu(i?.data?.status)?.toLowerCase();if(t==="success"){let r=fu(i?.data?.bot_info?.botid),s=fu(i?.data?.bot_info?.secret);if(!r||!s)throw new Error("Enterprise WeChat QR result omitted bot credentials");return{status:"success",remoteBotId:r,secret:s}}return["expired","timeout"].includes(t)?{status:"expired"}:["fail","failed","error"].includes(t)?{status:"failed"}:{status:"waiting"}}};import{mkdir as H1e,readFile as x1e,rename as K1e,unlink as Y1e,writeFile as j1e}from"node:fs/promises";import{dirname as J1e}from"node:path";var kb=Object.freeze({version:1,sessions:{},seenMessageIds:[]});function q1e(n){if(!n||typeof n!="object")return structuredClone(kb);let A={};if(n.sessions&&typeof n.sessions=="object"&&!Array.isArray(n.sessions))for(let[o,a]of Object.entries(n.sessions))typeof o=="string"&&typeof a=="string"&&a&&(A[o]=a);return{version:1,sessions:A,...n.deferred?{deferred:So(n.deferred)}:{},seenMessageIds:Array.isArray(n.seenMessageIds)?n.seenMessageIds.filter(o=>typeof o=="string").slice(-1e3):[]}}var vb=class{#t;#e=structuredClone(kb);#A=Promise.resolve();#r=wo(()=>this.#e,()=>this.#n());constructor(A){this.#t=A}async load(){try{this.#e=q1e(JSON.parse(await x1e(this.#t,"utf8")))}catch(A){if(A?.code!=="ENOENT")throw A;this.#e=structuredClone(kb),await this.#n()}return this}deferredEntries(){return this.#r.entries()}putDeferred(A){return this.#r.put(A)}patchDeferred(A,o){return this.#r.patch(A,o)}removeDeferred(A){return this.#r.remove(A)}sessionFor(A){return this.#e.sessions[A]??null}async setSession(A,o){this.#e.sessions[A]=o,await this.#n()}async clearSession(A){delete this.#e.sessions[A],await this.#n()}async clearSessions(){this.#e.sessions={},await this.#n()}hasSeen(A){return this.#e.seenMessageIds.includes(A)}async markSeen(A){this.hasSeen(A)||(this.#e.seenMessageIds.push(A),this.#e.seenMessageIds.length>1e3&&this.#e.seenMessageIds.splice(0,this.#e.seenMessageIds.length-1e3),await this.#n())}snapshot(){return structuredClone(this.#e)}async remove(){try{await Y1e(this.#t)}catch(A){if(A?.code!=="ENOENT")throw A}this.#e=structuredClone(kb)}async#n(){let A=`${JSON.stringify(this.#e,null,2)}
441
441
  `,o=this.#A.then(async()=>{await H1e(J1e(this.#t),{recursive:!0,mode:448});let a=`${this.#t}.tmp`;await j1e(a,A,{encoding:"utf8",mode:384}),await K1e(a,this.#t)});this.#A=o.then(()=>{},()=>{}),await o}};import{randomUUID as z1e}from"node:crypto";var kee=new Set(["pending","connecting"]),Gf=new Set(["connected","failed","cancelled","expired"]);function Pd(n){return typeof n=="string"&&n.trim()?n.trim():null}function vo(n,A){return Object.freeze({code:n,message:A})}function Gd(n){return n?{attemptId:n.id,status:n.state,pollIntervalMs:n.pollIntervalMs,qrRevision:n.qrRevision,...n.verificationUrl?{verificationUrl:n.verificationUrl}:{},...n.expiresAt?{expiresAt:n.expiresAt}:{},...n.botId?{botId:n.botId}:{},...n.error?{error:structuredClone(n.error)}:{}}:null}var Ff=class{#t;#e;#A;#r;#n;#l;#s=new Map;#i=new Map;#a=new Map;#c=null;#o=new Map;#I=0;#d=!1;constructor({qrAuth:A,credentials:o,configStore:a,createRuntime:e,deleteState:i=async()=>{},logger:t=console}){if(!A||typeof A.start!="function"||typeof A.poll!="function")throw new TypeError("Enterprise WeChat QR auth is required");if(!o||typeof o.resolve!="function"||typeof o.set!="function"||typeof o.unset!="function")throw new TypeError("WecomController requires the DSH credential provider");if(!a||typeof a.list!="function"||typeof a.save!="function"||typeof a.remove!="function")throw new TypeError("WecomController requires a config store");if(typeof e!="function")throw new TypeError("createRuntime is required");this.#t=A,this.#e=o,this.#A=a,this.#r=e,this.#n=i,this.#l=t}async initialize(){if(this.#d)return this.status();for(let A of this.#A.list())await this.#Q(A.botId,async()=>{let o=this.#s.get(A.botId)?.status;if(this.#d||o?.ready||o?.wecomConnectionState==="connecting")return;let a=await this.#C(A.secretRef);if(!a){this.#i.set(A.botId,vo("missing-secret",S("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u51ED\u636E\u7F3A\u5931\uFF0C\u8BF7\u79FB\u9664\u540E\u91CD\u65B0\u626B\u7801\u3002")));return}try{await this.#u(A,a),this.#i.delete(A.botId)}catch{this.#i.set(A.botId,vo("connection-failed",S("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002"))),this.#l.warn?.(`[dsh-im:wecom] bot ${A.botId} failed to initialize`)}finally{this.#m()}});return this.status()}async startProvisioning(){if(this.#d)throw new Error("Enterprise WeChat controller is closed");this.#c&&await this.cancelProvisioning(this.#c);let A={id:z1e(),state:"pending",createdAt:Date.now(),expiresAt:null,pollIntervalMs:3e3,qrRevision:1,verificationUrl:null,scode:null,botId:null,error:null,controller:new AbortController,polling:null,transition:null};this.#a.set(A.id,A),this.#c=A.id,this.#m();try{let o=await this.#t.start({signal:A.controller.signal});if(A.scode=Pd(o.scode),A.verificationUrl=Pd(o.verificationUrl),A.expiresAt=Number(o.expiresAt),A.pollIntervalMs=Math.min(1e4,Math.max(500,Number(o.pollIntervalMs)||3e3)),!A.scode||!A.verificationUrl||!Number.isFinite(A.expiresAt))throw new Error("Enterprise WeChat QR auth returned incomplete data");return this.#m(),Gd(A)}catch(o){throw A.state=A.controller.signal.aborted?"cancelled":"failed",A.error=A.controller.signal.aborted?vo("cancelled",S("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002")):vo("qr-start-failed",S("\u65E0\u6CD5\u751F\u6210\u4F01\u4E1A\u5FAE\u4FE1\u4E8C\u7EF4\u7801\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")),this.#S(A),o}}async registrationStatus(A){let o=this.#a.get(A);if(!o||Gf.has(o.state))return Gd(o);if(o.state==="connecting")return await o.transition?.catch(()=>{}),Gd(o);if(Date.now()>=o.expiresAt)return o.state="expired",o.error=vo("expired",S("\u4F01\u4E1A\u5FAE\u4FE1\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u3002")),o.controller.abort(),this.#S(o),Gd(o);if(!o.polling){let a=this.#g(o).finally(()=>{o.polling===a&&(o.polling=null)});o.polling=a}return await o.polling.catch(()=>{}),Gd(o)}async bindCredentials({botId:A,secret:o}={}){if(this.#d)throw new Error("Enterprise WeChat controller is closed");let a=Pd(A),e=Pd(o);if(!a||!e)throw new TypeError("Enterprise WeChat Bot ID and Secret are required");if(this.#c&&await this.cancelProvisioning(this.#c),this.#d)throw new Error("Enterprise WeChat controller is closed");let i=Tb(a);return await this.#Q(i.botId,async()=>{if(this.#d)throw new Error("Enterprise WeChat controller is closed");let t=this.#A.getByRemoteBotId(a),r=await this.#e.resolve(i.secretRef).catch(()=>{});if(this.#d)throw new Error("Enterprise WeChat controller is closed");let s={botId:i.botId,remoteBotId:a,secretRef:i.secretRef,createdAt:t?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()};await this.#e.set(i.secretRef,e);try{await this.#A.save(s)}catch(c){throw await this.#B(i.secretRef,r),c}try{await this.#u(s,e),this.#i.delete(i.botId)}catch{this.#i.set(i.botId,vo("connection-failed",S("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u5DF2\u7ED1\u5B9A\uFF0C\u6D88\u606F\u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002"))),this.#l.warn?.(`[dsh-im:wecom] bot ${i.botId} credential connection failed`)}this.#m()}),this.status()}async cancelProvisioning(A){let o=this.#a.get(A);return o?(Gf.has(o.state)||(o.controller.abort(),await Promise.allSettled([o.polling,o.transition].filter(Boolean)),Gf.has(o.state)||(o.state="cancelled"),o.error??=vo("cancelled",S("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002")),this.#S(o)),Gd(o)):null}async reconnectBot(A){let o=this.#A.get(A);if(!o)throw new Error("Unknown Enterprise WeChat bot");return await this.#Q(A,async()=>{let a=await this.#C(o.secretRef);if(!a)throw new Error("Enterprise WeChat bot secret is missing");try{await this.#u(o,a),this.#i.delete(A)}catch(e){throw this.#i.set(A,vo("connection-failed",S("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"))),e}finally{this.#m()}}),this.status()}async sendConnectionTest(A){let o=this.#A.get(A);if(!o)throw new Error("Unknown Enterprise WeChat bot");return this.#Q(A,async()=>{let a=this.#s.get(A);if(!a?.status?.ready||typeof a.sendConnectionTest!="function")throw ZA(S("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA"));return a.sendConnectionTest(yi(S("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\uFF08{botId}\uFF09",{botId:dU(o.remoteBotId)})))})}async sendProactiveText(A,o,a,e={}){if(!this.#A.get(A))throw new Error("Unknown Enterprise WeChat bot");return this.#Q(A,async()=>{let t=this.#s.get(A);if(!t?.status?.ready||typeof t.sendProactiveText!="function"){let r=new Error(S("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF"));throw r.code="bot-not-connected",r}return t.sendProactiveText(o,a,e)})}async deleteBot(A){let o=this.#A.get(A);if(!o)throw new Error("Unknown Enterprise WeChat bot");return await this.#Q(A,async()=>{let a=await this.#e.resolve(o.secretRef).catch(()=>{});await this.#E(A);try{await this.#e.unset(o.secretRef),await this.#A.remove(A)}catch(e){throw a?.value&&(await this.#e.set(o.secretRef,a.value).catch(()=>{}),await this.#u(o,a.value).catch(()=>{})),new Error("Unable to remove the Enterprise WeChat bot safely.",{cause:e})}await this.#n({botId:A,config:o}).catch(e=>{this.#l.warn?.(`[dsh-im:wecom] bot ${A} state cleanup failed:`,e)}),this.#i.delete(A),this.#m()}),this.status()}status(){let A=this.#A.list().map(e=>{let i=this.#s.get(e.botId)?.status??null,t=i?.ready===!0&&i.wecomConnectionState==="connected"&&i.harnessReachable===!0,r=t?"connected":i?.wecomConnectionState==="connecting"?"connecting":this.#i.has(e.botId)||i?.wecomConnectionState==="failed"?"error":"offline";return{botId:e.botId,state:r,connected:t,configured:!0,bot:{name:S("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA"),appIdMasked:dU(e.remoteBotId)},health:{status:t?"healthy":r==="error"?"error":"offline",summary:t?S("\u4F01\u4E1A\u5FAE\u4FE1 WebSocket \u957F\u8FDE\u63A5\u8FD0\u884C\u6B63\u5E38"):r==="error"?S("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5"):S("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF"),lastCheckedAt:i?.lastCheckedAt??null,lastConnectedAt:i?.lastConnectedAt??null},stats:{messagesReceived:i?.messagesReceived??0,messagesReplied:i?.messagesReplied??0},lastMessageError:jr(i?.lastMessageError),error:structuredClone(this.#i.get(e.botId)??null)}}),o=A.filter(e=>e.connected).length,a=this.#c?this.#a.get(this.#c):null;return{schemaVersion:1,revision:this.#I,state:a&&kee.has(a.state)?"provisioning":A.length===0?"disconnected":o===A.length?"connected":o>0?"degraded":"offline",bots:A,totals:{configured:A.length,connected:o},...a&&kee.has(a.state)?{provisioning:Gd(a)}:{}}}async close(){this.#d||(this.#d=!0,this.#c&&await this.cancelProvisioning(this.#c),await Promise.allSettled([...this.#o.values()]),await Promise.allSettled([...this.#s.keys()].map(A=>this.#E(A))))}async#g(A){try{let o=await this.#t.poll({scode:A.scode,signal:A.controller.signal});if(A.controller.signal.aborted||Gf.has(A.state)||o.status==="waiting")return;if(o.status==="expired"){A.state="expired",A.error=vo("expired",S("\u4F01\u4E1A\u5FAE\u4FE1\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u3002")),this.#S(A);return}if(o.status!=="success"){A.state="failed",A.error=vo("qr-connect-failed",S("\u4F01\u4E1A\u5FAE\u4FE1\u626B\u7801\u6CA1\u6709\u5B8C\u6210\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801\u3002")),this.#S(A);return}A.state="connecting",A.verificationUrl=null,A.expiresAt=null,A.scode=null,this.#m();let a=this.#p(A,o);A.transition=a,await a}catch{if(A.controller.signal.aborted)return;A.state="failed",A.error=vo("qr-connect-failed",S("\u4F01\u4E1A\u5FAE\u4FE1\u626B\u7801\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801\u3002")),this.#l.warn?.("[dsh-im:wecom] QR polling failed"),this.#S(A)}}async#p(A,o){try{let a=Pd(o.remoteBotId),e=Pd(o.secret);if(!a||!e)throw new Error("Enterprise WeChat authorization returned incomplete credentials");A.botId=await this.#h(A,{remoteBotId:a,secret:e}),A.state="connected",A.error=null}catch{A.controller.signal.aborted?(A.state="cancelled",A.error=vo("cancelled",S("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002"))):(A.state="failed",A.error=vo("activation-failed",S("\u4F01\u4E1A\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u65E0\u6CD5\u5B89\u5168\u4FDD\u5B58\u63A5\u5165\u914D\u7F6E\u3002")),this.#l.error?.("[dsh-im:wecom] provisioning failed"))}finally{this.#S(A)}}async#h(A,{remoteBotId:o,secret:a}){let e=Tb(o),i=this.#A.getByRemoteBotId(o),t=await this.#e.resolve(e.secretRef).catch(()=>{}),r={botId:e.botId,remoteBotId:o,secretRef:e.secretRef,createdAt:i?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()};return this.#Q(e.botId,async()=>{await this.#e.set(e.secretRef,a);try{if(A.controller.signal.aborted)throw new DOMException("Cancelled","AbortError");await this.#A.save(r)}catch(s){throw await this.#B(e.secretRef,t),s}try{if(A.controller.signal.aborted)throw new DOMException("Cancelled","AbortError");await this.#u(r,a),this.#i.delete(e.botId)}catch(s){if(A.controller.signal.aborted)throw await this.#E(e.botId),i?await this.#A.save(i).catch(()=>{}):await this.#A.remove(e.botId).catch(()=>null)&&await this.#n({botId:e.botId,config:r}).catch(g=>{this.#l.warn?.("[dsh-im:wecom] cancelled bot state cleanup failed:",g)}),await this.#B(e.secretRef,t),s;this.#i.set(e.botId,vo("connection-failed",S("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u5DF2\u7ED1\u5B9A\uFF0C\u6D88\u606F\u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002"))),this.#l.warn?.(`[dsh-im:wecom] bot ${e.botId} activation connection failed`)}return this.#m(),e.botId})}async#u(A,o){if(this.#d)throw new Error("Enterprise WeChat controller is closed");if(await this.#E(A.botId),this.#d)throw new Error("Enterprise WeChat controller is closed");let a=await this.#r({botId:A.botId,config:A,secret:o});if(!a||typeof a.start!="function"||typeof a.stop!="function")throw new TypeError("createRuntime returned an invalid Enterprise WeChat runtime");this.#s.set(A.botId,a);try{await a.start()}catch(e){throw await a.stop().catch(()=>{}),this.#s.delete(A.botId),e}}async#E(A){let o=this.#s.get(A);this.#s.delete(A),await o?.stop().catch(a=>{this.#l.warn?.(`[dsh-im:wecom] bot ${A} failed to stop cleanly:`,a)})}async#C(A){let o=await this.#e.resolve(A).catch(()=>{});return Pd(o?.value)}async#B(A,o){o?.value?await this.#e.set(A,o.value).catch(()=>{}):await this.#e.unset(A).catch(()=>{})}#Q(A,o){let i=(this.#o.get(A)??Promise.resolve()).catch(()=>{}).then(o).finally(()=>{this.#o.get(A)===i&&this.#o.delete(A)});return this.#o.set(A,i),i}#S(A){A.scode=null,A.verificationUrl=null,A.expiresAt=null,this.#c===A.id&&(this.#c=null),this.#m();let o=[...this.#a.values()].filter(a=>Gf.has(a.state));for(;o.length>16;)this.#a.delete(o.shift().id)}#m(){this.#I+=1}};import{WSAuthFailureError as h3e,WSClient as u3e,WSReconnectExhaustedError as E3e}from"@wecom/aibot-node-sdk";import{generateReqId as W1e}from"@wecom/aibot-node-sdk";import{randomUUID as Z1e}from"node:crypto";function Pb(n,A){if(n?.wecomOperation||n?.name==="AbortError"||n instanceof TypeError||n instanceof ReferenceError||n instanceof SyntaxError)return n;let o=n?.errcode??n?.body?.errcode??n?.providerCode,a=typeof o=="number"||typeof o=="string"&&/^-?\d+$/u.test(o)?Number(o):NaN,e=Number.isSafeInteger(a)&&a!==0,i=n?.message==="WebSocket not connected, unable to send data",t=mr(n,{uncertain:!e&&!i});return a===48002&&(t.code="channel-permission"),a===45009&&(t.code="channel-rate-limit"),e&&(t.providerCode=a),t.wecomOperation=A,t.message=`Enterprise WeChat ${A} failed (${t.code}, provider=${t.providerCode??"-"})`,t}function Lf(n){if(n?.wecomOperation)return{operation:n.wecomOperation,code:n.code,providerCode:n.providerCode,status:n.status}}var V1e=/^\/m(?:enu)?(?:\s+(sessions|workspaces|models|presets)(?:\s+(\d+))?)?$/iu;function Qu(n){let A=V1e.exec(n.trim());return A?{section:A[1]?.toLowerCase()??"main",page:Number(A[2]??0)}:null}function Uf(n,A=80){return[...String(n??"").replace(/[\p{Cc}\p{Cf}]/gu," ")].slice(0,A).join("")}function Gb(n,A,o,a,e,i){let t=o.filter(([,s])=>s!==e),r=t.slice(0,t.length>9?8:9);return{key:n,title:A,entries:[[a||S("\u4FDD\u6301\u5F53\u524D"),null],...r,...t.length>9?[[S("\u66F4\u591A\u9009\u9879\u2026"),i]]:[]]}}function vee({sessions:n=[],models:A=[],presets:o=[],sessionId:a,currentModel:e,currentPreset:i,presetLabel:t}={}){return{title:S("\u{1F916} \u52A9\u624B\u4E2D\u5FC3"),description:S("\u9009\u62E9\u4F1A\u8BDD\u3001\u6A21\u578B\u6216\u9884\u8BBE\u540E\uFF0C\u70B9\u51FB\u5E94\u7528\u8BBE\u7F6E\u3002"),selectors:[Gb("session",S("\u4F1A\u8BDD"),n,n.find(([,r])=>r===`/session ${a}`)?.[0]||S("\u65B0\u4F1A\u8BDD"),`/session ${a}`,"/menu sessions"),Gb("model",S("\u6A21\u578B"),A,A.find(([,r])=>r===e)?.[0]||S("\u8DDF\u968F\u9ED8\u8BA4\u6A21\u578B"),e,"/menu models"),Gb("preset",S("\u9884\u8BBE"),o,t||S("\u8DDF\u968F Host \u9ED8\u8BA4"),i,"/menu presets")],entries:[[S("\u5E94\u7528\u8BBE\u7F6E"),"apply"]]}}function Pee({workspace:n,workspaces:A=[]}={}){return{title:S("\u5DE5\u4F5C\u533A\u4E0E\u4EFB\u52A1"),selectors:[Gb("workspace",S("\u5DE5\u4F5C\u533A"),A,n,`/workspace ${n}`,"/menu workspaces")],entries:[[S("\u5207\u6362\u5DE5\u4F5C\u533A"),"select:workspace"],[S("\u{1F195} \u65B0\u4F1A\u8BDD"),"/new"],[S("\u23F9 \u505C\u6B62"),"/stop"],[S("\u{1F4D0} \u538B\u7F29"),"/compact"],[S("\u{1F4CA} \u72B6\u6001"),"/status"],[S("\u{1F4D6} \u5E2E\u52A9"),"/help"]]}}function Gee({title:n,section:A,entries:o,page:a=0,description:e=""}){let i=Math.max(1,Math.ceil(o.length/10)),t=Math.min(Math.max(0,a),i-1),r=o.slice(t*10,t*10+10),s=r.length?[[S("\u5E94\u7528\u9009\u62E9"),"select:choice"]]:[];return t>0&&s.push([S("\u4E0A\u4E00\u9875"),`/menu ${A} ${t-1}`]),t+1<i&&s.push([S("\u4E0B\u4E00\u9875"),`/menu ${A} ${t+1}`]),s.push([S("\u8FD4\u56DE"),"/menu"]),{title:n,description:`${t+1} / ${i}${e?` \xB7 ${e}`:""}`,detail:r.length?"":S("\u6682\u65E0\u53EF\u7528\u9009\u9879\u3002"),selectors:r.length?[{key:"choice",title:n,entries:r}]:[],entries:s}}function pU(n,A){let o=n.selectors?.map(e=>({question_key:e.key,title:Uf(e.title,13),selected_id:"0",option_list:e.entries.map(([i],t)=>({id:String(t),text:Uf(i,60)}))}))??[],a=o.length>1;return{card_type:a?"multiple_interaction":"button_interaction",task_id:A,main_title:{title:Uf(n.title,36),...n.description?{desc:Uf(n.description,100)}:{}},...n.detail?{sub_title_text:n.detail.slice(0,500)}:{},...a?{select_list:o,submit_button:{text:n.entries[0][0],key:"0"}}:{...o.length?{button_selection:o[0]}:{},button_list:n.entries.map(([e],i)=>({text:Uf(e,36),key:String(i),style:i===0?1:2}))}}}function Fee(n){return[n.title,n.description,n.detail,...n.selectors?.flatMap(A=>A.entries.filter(([,o])=>o).map(([o,a])=>`${o}\uFF1A${a}`))??[],...n.entries.filter(([,A])=>A.startsWith("/")).map(([A,o])=>`${A}\uFF1A${o}`)].filter(Boolean).join(`
442
442
  `)}var CU=12e4;function Lee(){return[S("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002"),"",S("\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002"),S("/menu \u6216 /m \u6253\u5F00\u53EF\u70B9\u51FB\u7684\u529F\u80FD\u83DC\u5355"),S("/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"),S("/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"),S("/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09"),S("/workspace \u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A"),S("/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84"),S("/ws\u3001/wsl\u3001/workspaces \u5DE5\u4F5C\u533A\u547D\u4EE4\u522B\u540D"),S("/sessionlist \u6216 /sessions [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"),S("/sessionlist --limit N \u4EC5\u5217\u51FA\u5F53\u524D\u5DE5\u4F5C\u533A\u524D N \u4E2A\u4F1A\u8BDD"),S("/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"),S("/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"),S("/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7"),S("/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7"),S("/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B"),S("\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]"),S("/presetlist \u6216 /presets \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset"),S("/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset"),S("\u7EAF\u6570\u5B57 ID\uFF1A/preset id:<ID>"),S("/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"),S("/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1"),S("/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"),S("/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09"),S("/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21"),S("/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21"),S("/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"),S("/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C"),S("/help \u663E\u793A\u672C\u5E2E\u52A9")].join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xmanrui/dsh-im",
3
- "version": "4.20.1",
3
+ "version": "4.20.2",
4
4
  "description": "把十一种 IM 渠道和公网 AI Office 接入本机 DeepSeek Harness。 Connect eleven IM channels and a public AI Office to a local DeepSeek Harness.",
5
5
  "keywords": [
6
6
  "deepseek-harness",
@@ -744,12 +744,18 @@ export class TextHarnessBridge {
744
744
  : progress);
745
745
  }
746
746
  } : undefined,
747
- onInteraction: (interaction) => this.#handleInteraction(interaction, {
748
- key: conversationKey,
749
- actor: senderId,
750
- target,
751
- requiresMention: message.kind === 'group' && message.requiresMention !== false,
752
- }),
747
+ onInteraction: async (interaction) => {
748
+ if (stream?.keepalive === true && typeof stream.stopPreview === 'function') {
749
+ stopKeepalive();
750
+ await stream.stopPreview();
751
+ }
752
+ return this.#handleInteraction(interaction, {
753
+ key: conversationKey,
754
+ actor: senderId,
755
+ target,
756
+ requiresMention: message.kind === 'group' && message.requiresMention !== false,
757
+ });
758
+ },
753
759
  onInteractionResolved: (resolution) => this.#handleInteractionResolved(resolution),
754
760
  files: message.files,
755
761
  },
@@ -327,6 +327,7 @@ class TelegramDeliveryStream {
327
327
  #lastUpdate = null;
328
328
  #lastBlock = null;
329
329
  #keepalive = false;
330
+ #previewStopped = false;
330
331
  #chain = Promise.resolve();
331
332
 
332
333
  constructor({
@@ -367,9 +368,17 @@ class TelegramDeliveryStream {
367
368
  return run;
368
369
  }
369
370
 
371
+ // Live drafts can block the user's composer. Drain any pending draft before
372
+ // the regular question/approval message clears it, and keep this turn's
373
+ // preview stopped so late progress cannot block the answer again.
374
+ stopPreview() {
375
+ this.#previewStopped = true;
376
+ return this.#enqueue(() => undefined);
377
+ }
378
+
370
379
  update(value) {
371
380
  return this.#enqueue(async () => {
372
- if (this.#closed) return undefined;
381
+ if (this.#closed || this.#previewStopped) return undefined;
373
382
  const block = createTextDeliveryBlock(value);
374
383
  this.#lastBlock = block;
375
384
  const key = `${block.format}:${block.text}`;
@@ -390,7 +399,7 @@ class TelegramDeliveryStream {
390
399
  * never overtakes a later finish(). No-op for carriers without keepalive. */
391
400
  refresh() {
392
401
  return this.#enqueue(async () => {
393
- if (this.#closed || !this.#keepalive || !this.#lastBlock) return undefined;
402
+ if (this.#closed || this.#previewStopped || !this.#keepalive || !this.#lastBlock) return undefined;
394
403
  try {
395
404
  return await this.#update(this.#lastBlock);
396
405
  } catch (error) {