diff --git a/README.en.md b/README.en.md index d658457..650b2f0 100644 --- a/README.en.md +++ b/README.en.md @@ -181,7 +181,7 @@ Do not modify the same profile through a terminal or plugin market during instal | `/reasoning` | Show the current Session model and reasoning effort. | | `/reasoning ` | Switch the current model's reasoning effort. | | `/reasoning --default` | Restore the current model's default reasoning effort. | -| `/presetlist` | List the Host's currently available Agent Presets, marking the Host default and this bot's selection. | +| `/presetlist`, `/presets` | Equivalent aliases that list the Host's currently available Agent Presets, marking the Host default and this bot's selection. | | `/preset` | Show this bot's Agent Preset setting for new Sessions. | | `/preset ` | Set this bot's Agent Preset; use `/preset id:` for a numeric ID. | | `/preset --default` | Clear this bot's explicit selection so later new Sessions follow the Host default. | @@ -194,7 +194,7 @@ Do not modify the same profile through a terminal or plugin market during instal | `/compact` | Immediately compact older context in the Session bound to the current chat. | | `/workspace ` | Switch the current bot's Harness workspace. | | `/workspacelist` | List workspace absolute paths that still exist on the current Harness Host. | -| `/sessionlist [workspace number or absolute path]` | List every registered session ID and title in the selected workspace; omit the argument to use the current workspace. | +| `/sessionlist [workspace number or absolute path]`, `/sessions [...]` | Equivalent aliases that list every registered session ID and title in the selected workspace; omit the argument to use the current workspace. | | `/session ` | Bind the current chat to an existing Harness session. | | `/history [count]` | Preview recent messages from the bound Session in a direct chat; defaults to 3, capped at 5. | | Interactive question | Reply with an option number, option label, or custom text; separate multiple choices with commas. | @@ -214,7 +214,7 @@ If the Slack desktop app has no native Slash Command registered with the same na - Bare `/model` shows the current Session model and reasoning effort. With arguments, it accepts a number from `/models` or an exact full model ID, followed optionally by an exact reasoning effort ID published in that target model's metadata, for example `/model 2 max`. When the effort is omitted, Harness resolves the target model's current default. If the chat has no Session yet, a valid switch creates and binds a blank Session without prompting the model. - `/reasoninglist` and `/reasonings` are equivalent. They list the efforts from the current model's metadata and mark the current and default values. `/reasoning` shows the current value; `/reasoning ` accepts a listed number or an exact metadata ID; `/reasoning --default` lets Harness resolve the current model's default again. Every `/reasoning...` command requires an existing Session and never creates one or prompts the model. - The model or reasoning effort cannot be changed while a task is running or waiting for an approval or question answer. Wait for it to finish or use `/stop` first. A change takes effect on the next model request and keeps Harness's default-saving semantics: Harness attempts to save the accepted model and effort as the default selection for future Sessions, while other existing Sessions remain unchanged. A Session containing images cannot switch to a model that does not accept image input. -- `/presetlist` takes no arguments and never creates a Session. It reads the Host's currently available Agent Presets every time, showing their names, stable IDs, the Host default, and this bot's selection. A selected Preset that has been deleted or become broken is retained and marked unavailable instead of being cleared automatically. Only safe names and IDs are shown; paths, errors, and other Host internals are never exposed. +- `/presetlist` and `/presets` are equivalent. They take no arguments and never create a Session. Each reads the Host's currently available Agent Presets, showing their names, stable IDs, the Host default, and this bot's selection. A selected Preset that has been deleted or become broken is retained and marked unavailable instead of being cleared automatically. Only safe names and IDs are shown; paths, errors, and other Host internals are never exposed. - Bare `/preset` shows this bot's setting for future new Sessions; it does not inspect or change the current Session. With an argument, it accepts a number from the most recent `/presetlist` in this chat or an exact ID; use `/preset id:` for a numeric ID. A numbered selection resolves the ID from that displayed list and then validates it against the latest Host catalog, asking for a fresh list if it has changed. - `/preset --default` clears this bot's explicit override so future Sessions resolve the Host default when they are created. Explicitly selecting an ID that currently matches the Host default pins that ID instead. Following the Host default remains available even while the catalog cannot be read. - An Agent Preset change is bot-wide: it affects future new Sessions in every chat for this bot, but never modifies, stops, unbinds, or rebuilds an existing Session and never runs `/new` automatically. If this chat already has a Session, ordinary messages keep using it; the first ordinary message after `/new` creates a Session with the new setting. Presets can still be queried or changed while a task is running or awaiting interaction because the command does not touch that Session. @@ -225,8 +225,8 @@ If the Slack desktop app has no native Slash Command registered with the same na - `/compact` acts only on the Harness Session already bound to the current chat and is never sent to the model. The bot reports the applicable status when the chat has no Session yet, the Session is generating a reply, or there is no compactable history. - The path must be an existing absolute directory. The bot returns an actionable error and the correct usage when validation fails. - `/workspacelist` takes no arguments. It combines the Harness global registry with the current bot's path. When that current path still exists and is safe to display, it appears first and is marked as current. Any listed path can be copied directly into `/workspace`. -- A numeric `/sessionlist` argument uses the same freshly resolved order as `/workspacelist` at command execution time. An absolute path can also select a workspace directly, and the result echoes the resolved path. -- `/sessionlist` includes every session registered to the selected workspace. Archived sessions are marked as archived; blank and subagent sessions are included when they belong to that workspace; sessions without a title are shown as `No title yet`. Any listed ID can be passed directly to `/session Session ID`. +- `/sessionlist` and `/sessions` are equivalent. A numeric argument uses the same freshly resolved order as `/workspacelist` at command execution time. An absolute path can also select a workspace directly, and the result echoes the resolved path. +- Both session-list aliases include every session registered to the selected workspace. Archived sessions are marked as archived; blank and subagent sessions are included when they belong to that workspace; sessions without a title are shown as `No title yet`. Any listed ID can be passed directly to `/session Session ID`. - `/session` accepts exactly one Session ID obtained from `/sessionlist`. It neither creates a session nor immediately prompts the model; later messages in the current chat continue the bound session. Regular archived sessions can be bound without being unarchived, while subagent sessions cannot be bound. - `/history` works identically in direct chats on all nine channels. It only reads the Session already bound to this chat: it never creates a Session, prompts the model, or interrupts running tasks or pending interactions. It returns the latest 3 messages by default. `/history N` accepts a positive integer, caps values above 5 at 5, and returns fewer when fewer are available. Zero, negative, fractional, nonnumeric, and multiple arguments show usage; commands with images or files are rejected. While collecting batch input, use `/send` or `/cancel` first. - A user message or a final assistant reply counts as one history item, not one turn or day. The latest N items are displayed oldest first. Tool events, reasoning, injected content, and unfinished assistant output are omitted; old attachments are not downloaded or resent. Long text is marked as truncated, with at most 3 text segments per reply and no automatic pagination. After binding a Session, send `/history` manually; binding never replays history automatically. Message text may still contain sensitive information from the original conversation, so expose the bot only to trusted users. diff --git a/README.md b/README.md index 06ff620..c009e3c 100644 --- a/README.md +++ b/README.md @@ -184,7 +184,7 @@ dsh plugin --profile web add -w --save-exact @xmanrui/dsh-im@3.1.0 --registry=ht | `/reasoning` | 查看当前会话的模型和推理等级。 | | `/reasoning <序号或等级ID>` | 切换当前模型的推理等级。 | | `/reasoning --default` | 恢复当前模型的默认推理等级。 | -| `/presetlist` | 按序号列出 Host 当前可用的 Agent Preset,并标记 Host 默认项和当前机器人的选择。 | +| `/presetlist`、`/presets` | 两个等价命令;按序号列出 Host 当前可用的 Agent Preset,并标记 Host 默认项和当前机器人的选择。 | | `/preset` | 查看当前机器人的新会话 Agent Preset 设置。 | | `/preset <序号或 Preset ID>` | 设置当前机器人的 Agent Preset;纯数字 ID 使用 `/preset id:`。 | | `/preset --default` | 清除当前机器人的显式选择,让后续新 Session 跟随 Host 默认。 | @@ -197,7 +197,7 @@ dsh plugin --profile web add -w --save-exact @xmanrui/dsh-im@3.1.0 --registry=ht | `/compact` | 立即压缩当前聊天绑定会话的较早上下文。 | | `/workspace <工作区绝对路径>` | 切换当前机器人的 Harness 工作区。 | | `/workspacelist` | 列出当前 Harness Host 上仍然存在的工作区绝对路径。 | -| `/sessionlist [工作区序号或绝对路径]` | 列出指定工作区登记的所有会话 ID 和标题;省略参数时使用当前工作区。 | +| `/sessionlist [工作区序号或绝对路径]`、`/sessions [...]` | 两个等价命令;列出指定工作区登记的所有会话 ID 和标题,省略参数时使用当前工作区。 | | `/session ` | 将当前聊天绑定到指定的已有 Harness 会话。 | | `/history [数量]` | 在私聊中查看当前绑定会话的最近历史消息,默认 3 条,最多 5 条。 | | 交互式提问 | 回复选项序号、选项文字或自定义文字;多选时用逗号分隔。 | @@ -217,7 +217,7 @@ Slack 桌面端若未注册同名的原生 Slash Command,会拦截直接以 `/ - `/model` 不带参数时查看当前会话的模型和推理等级;带参数时接受 `/models` 列出的序号或精确完整模型 ID,并可追加目标模型元数据公布的精确推理等级 ID,例如 `/model 2 max`。省略推理等级时,由 Harness 解析目标模型的当前默认值。聊天尚无会话时,有效的切换命令会创建并绑定一个空白会话,但不会触发模型回复。 - `/reasoninglist` 和 `/reasonings` 完全等价,按当前模型的元数据列出可选推理等级并标记当前值和默认值。`/reasoning` 查看当前值;`/reasoning <序号或等级ID>` 接受列表序号或元数据中的精确 ID;`/reasoning --default` 让 Harness 重新采用当前模型的默认推理等级。所有 `/reasoning...` 命令都要求当前聊天已有 Session,不会自行创建 Session 或触发模型回复。 - 正在运行任务或等待审批、问题回答时不能修改模型或推理等级;请等待完成,或先使用 `/stop`。修改从下一次模型请求起生效,并沿用 Harness 的默认保存语义:Harness 会尝试把已接受的模型和推理等级保存为以后新会话的默认选择,已有其他会话不受影响。含图片的会话无法切换到不支持图片输入的模型。 -- `/presetlist` 不需要参数,也不会创建会话。它每次都读取 Host 当前可用的 Agent Preset,显示名称、稳定 ID、Host 默认项和当前机器人的选择;已删除或损坏的当前选择会保留并标记为“已不可用”,不会被自动清除。列表只公开安全的名称和 ID,不公开 Preset 路径、错误或其他 Host 内部字段。 +- `/presetlist` 和 `/presets` 完全等价,不需要参数,也不会创建会话。它们每次都读取 Host 当前可用的 Agent Preset,显示名称、稳定 ID、Host 默认项和当前机器人的选择;已删除或损坏的当前选择会保留并标记为“已不可用”,不会被自动清除。列表只公开安全的名称和 ID,不公开 Preset 路径、错误或其他 Host 内部字段。 - `/preset` 不带参数时查看当前机器人的“新会话设置”,不是查看或修改当前 Session。带参数时接受最近一次 `/presetlist` 在当前聊天中显示的序号或完整 ID;纯数字 ID 使用 `/preset id:`。选择序号时会先按该次列表解析 ID,再用 Host 最新目录复验,目录已经变化时会要求重新列出。 - `/preset --default` 清除当前机器人的显式覆盖值,让以后新建的 Session 在创建时跟随 Host 当前默认;显式选择一个恰好等于 Host 默认的 ID 则会固定该 ID。目录暂时不可读时仍可恢复为跟随 Host 默认。 - Agent Preset 修改是机器人级配置,会影响该机器人所有聊天以后创建的新 Session,但不会修改、停止、解绑或重建已有 Session,也不会自动执行 `/new`。若当前聊天已有会话,继续发送消息仍使用原 Session;发送 `/new` 后的下一条普通消息才会按新设置创建 Session。任务正在运行或等待交互时也可查询或修改 Preset,因为命令不会触碰当前 Session。 @@ -228,8 +228,8 @@ Slack 桌面端若未注册同名的原生 Slash Command,会拦截直接以 `/ - `/compact` 只作用于当前聊天已经绑定的 Harness 会话,不会把命令发送给模型。当前聊天尚未创建会话、会话正在生成回复或没有可压缩历史时,机器人会直接返回对应状态。 - 只接受已经存在的绝对目录;路径无效时机器人会返回具体提示和正确用法。 - `/workspacelist` 不需要参数。它合并 Harness 全局登记项与当前机器人的路径;当前路径仍存在且可安全显示时会排在首位并标记为“当前”。结果可直接复制到 `/workspace` 命令。 -- `/sessionlist` 的数字参数按命令执行时与 `/workspacelist` 相同的最新顺序解析;也可使用绝对路径直接指定工作区。结果会回显最终选中的路径。 -- `/sessionlist` 会列出该工作区登记的所有会话。已归档会话会标记为“已归档”;空白会话和子代理会话在它们归属该工作区时也会列出;没有标题的会话显示为“暂无标题”。结果中的 ID 可直接用于 `/session Session ID`。 +- `/sessionlist` 和 `/sessions` 完全等价。数字参数按命令执行时与 `/workspacelist` 相同的最新顺序解析;也可使用绝对路径直接指定工作区。结果会回显最终选中的路径。 +- 两个会话列表命令都会列出该工作区登记的所有会话。已归档会话会标记为“已归档”;空白会话和子代理会话在它们归属该工作区时也会列出;没有标题的会话显示为“暂无标题”。结果中的 ID 可直接用于 `/session Session ID`。 - `/session` 只接受一个由 `/sessionlist` 获得的 Session ID。它不会新建会话或立即向模型发送消息;绑定成功后,当前聊天的后续消息会继续该会话。普通归档会话可以绑定但不会自动取消归档,子代理会话不能绑定。 - `/history` 在九个渠道的私聊中统一可用,只读取当前聊天已经绑定的会话,不新建会话、不调用模型,也不影响正在运行的任务或待处理交互。默认返回最近 3 条;`/history N` 接受正整数,超过 5 自动按 5 条处理,数量不足时返回实际条数。零、负数、小数、非数字和多个参数会提示用法,附带图片或文件时会拒绝处理;批量输入收集中请先 `/send` 或 `/cancel`。 - 历史预览中,一条用户消息或一条助手最终回复各算一条,不按轮次或天数计数。先取最新 N 条,再按从旧到新的顺序显示;不展示工具、推理、注入内容或尚未完成的助手片段,不下载或重发历史附件。长正文会截断并注明,全部结果最多发送 3 段文字,不自动翻页。绑定会话后可手动发送 `/history`,不会自动重发历史。正文仍可能包含会话原有的敏感信息,请只向可信用户开放机器人。 diff --git a/docs/方案/渠道原生能力建设方案.md b/docs/方案/渠道原生能力建设方案.md index ebeb2c4..1955a47 100644 --- a/docs/方案/渠道原生能力建设方案.md +++ b/docs/方案/渠道原生能力建设方案.md @@ -72,7 +72,7 @@ dsh-im 已经是一个具有九渠道多机器人管理、工作区与 Session | 图片交付 | `dsh_im_return_file` 返回 `image/*` 时,九渠道均优先使用现有平台原生图片路径;确定性失败才复用既有文件附件降级,不增加配置、白名单或双消息补发 | | Harness 会话 | 按机器人与聊天持久绑定 Session;支持工作区切换、Session 列表与绑定、模型查询与切换、停止、纠偏和上下文压缩 | | Agent Preset | 每机器人独立选择或跟随 Host 默认;只影响之后新建 Session,不改变已有会话和在途回复 | -| 控制命令 | `/help`、`/new`、`/status`、`/models`、`/model`、`/presetlist`、`/preset`、`/stop`、`/steer`、`/compact`、`/workspace`、`/workspacelist`、`/sessionlist`、`/session` | +| 控制命令 | `/help`、`/new`、`/status`、`/models`、`/model`、`/presetlist`(别名 `/presets`)、`/preset`、`/stop`、`/steer`、`/compact`、`/workspace`、`/workspacelist`、`/sessionlist`(别名 `/sessions`)、`/session` | | Harness 交互 | 九渠道已经能够用文字完成问题与审批;Actor/Route 所有权、FIFO、重放去重、跨端解决、取消和失败重试已有大量自动化覆盖 | | 回复体验 | 飞书/钉钉卡片流、企业微信/Slack 原生或准原生流、QQ Markdown 与按渠道收敛的 Turn Feed、Telegram/Discord 编辑消息、WhatsApp typing + 最终消息;失败时已有安全恢复路径 | | 运维可靠性 | 连接测试、自动重连、状态持久化、多机器人生命周期、并发竞态、工作区代际隔离、删除清理和敏感错误脱敏均已有测试资产 | diff --git a/lib/index.js b/lib/index.js index 96045ba..665a43e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -75,7 +75,7 @@ ${m}`,j="",U="",z=Math.min(R,r);FU(f)&&(j+=Bse(f,F,r),T=T.slice(f.length),z-=f.l ${m}${j} ${_}`),Q.pop(),`{${j}}`}case"number":return isFinite(f)?String(f):t?t(f):"null";case"boolean":return f===!0?"true":"false";case"undefined":return;case"bigint":if(i)return String(f);default:return t?t(f):void 0}}function I(B,f,Q){switch(typeof f){case"string":return oI(f);case"object":{if(f===null)return"null";if(typeof f.toJSON=="function"){if(f=f.toJSON(B),typeof f!="object")return I(B,f,Q);if(f===null)return"null"}if(Q.indexOf(f)!==-1)return o;let y="",m=f.length!==void 0;if(m&&Array.isArray(f)){if(f.length===0)return"[]";if(Ar){let q=f.length-r-1;y+=`,"... ${zl(q)} not stringified"`}return Q.pop(),`[${y}]`}let _=Object.keys(f),T=_.length;if(T===0)return"{}";if(Ar){let j=T-r;y+=`${R}"...":"${zl(j)} not stringified"`}return Q.pop(),`{${y}}`}case"number":return isFinite(f)?String(f):t?t(f):"null";case"boolean":return f===!0?"true":"false";case"undefined":return;case"bigint":if(i)return String(f);default:return t?t(f):void 0}}function d(B,f,Q){if(arguments.length>1){let y="";if(typeof Q=="number"?y=" ".repeat(Math.min(Q,10)):typeof Q=="string"&&(y=Q.slice(0,10)),f!=null){if(typeof f=="function")return s("",{"":B},[],f,y,"");if(Array.isArray(f))return g("",B,[],CVe(f),y,"")}if(y.length!==0)return c("",B,[],y,"")}return I("",B,[])}return d}});var wse=$((lNA,Dse)=>{"use strict";var HU=Symbol.for("pino.metadata"),{DEFAULT_LEVELS:Sse}=fb(),BVe=Sse.info;function fVe(n,t){n=n||[],t=t||{dedupe:!1};let o=Object.create(Sse);o.silent=1/0,t.levels&&typeof t.levels=="object"&&Object.keys(t.levels).forEach(I=>{o[I]=t.levels[I]});let i={write:e,add:r,remove:s,emit:a,flushSync:A,end:g,minLevel:0,lastId:0,streams:[],clone:c,[HU]:!0,streamLevels:o};return Array.isArray(n)?n.forEach(r,i):r.call(i,n),n=null,i;function e(I){let d,B=this.lastLevel,{streams:f}=this,Q=0,y;for(let m=QVe(f.length,t.dedupe);mVe(m,f.length,t.dedupe);m=yVe(m,t.dedupe))if(d=f[m],d.level<=B){if(Q!==0&&Q!==d.level)break;if(y=d.stream,y[HU]){let{lastTime:_,lastMsg:T,lastObj:R,lastLogger:F}=this;y.lastLevel=B,y.lastTime=_,y.lastMsg=T,y.lastObj=R,y.lastLogger=F}y.write(I),t.dedupe&&(Q=d.level)}else if(!t.dedupe)break}function a(...I){for(let{stream:d}of this.streams)typeof d.emit=="function"&&d.emit(...I)}function A(){for(let{stream:I}of this.streams)typeof I.flushSync=="function"&&I.flushSync()}function r(I){if(!I)return i;let d=typeof I.write=="function"||I.stream,B=I.write?I:I.stream;if(!d)throw Error("stream object needs to implement either StreamEntry or DestinationStream interface");let{streams:f,streamLevels:Q}=this,y;typeof I.levelVal=="number"?y=I.levelVal:typeof I.level=="string"?y=Q[I.level]:typeof I.level=="number"?y=I.level:y=BVe;let m={stream:B,level:y,levelVal:void 0,id:++i.lastId};return f.unshift(m),f.sort(mse),this.minLevel=f[0].level,i}function s(I){let{streams:d}=this,B=d.findIndex(f=>f.id===I);return B>=0&&(d.splice(B,1),d.sort(mse),this.minLevel=d.length>0?d[0].level:-1),i}function g(){for(let{stream:I}of this.streams)typeof I.flushSync=="function"&&I.flushSync(),I.end()}function c(I){let d=new Array(this.streams.length);for(let B=0;B=0:n{"use strict";var SVe=Xe("node:os"),kse=sU(),DVe=gU(),wVe=lU(),vse=Bne(),OVe=use(),Pse=zh(),{configure:bVe}=yse(),{assertDefaultLevelFound:MVe,mappings:Gse,genLsCache:_Ve,genLevelComparison:TVe,assertLevelComparison:NVe}=NU(),{DEFAULT_LEVELS:Fse,SORTING_ORDER:RVe}=fb(),{createArgsNormalizer:kVe,asChindings:vVe,buildSafeSonicBoom:Ose,buildFormatters:PVe,stringify:KU,normalizeDestFileDescriptor:bse,noop:GVe}=Bb(),{version:FVe}=RU(),{chindingsSym:Mse,redactFmtSym:LVe,serializersSym:_se,timeSym:UVe,timeSliceIndexSym:HVe,streamSym:KVe,stringifySym:Tse,stringifySafeSym:xU,stringifiersSym:Nse,setLevelSym:xVe,endSym:YVe,formatOptsSym:jVe,messageKeySym:JVe,errorKeySym:qVe,nestedKeySym:zVe,mixinSym:VVe,levelCompSym:WVe,useOnlyCustomLevelsSym:ZVe,formattersSym:Rse,hooksSym:XVe,nestedKeyStrSym:$Ve,mixinMergeStrategySym:eWe,msgPrefixSym:AWe}=Pse,{epochTime:Lse,nullTime:tWe}=vse,{pid:rWe}=process,aWe=SVe.hostname(),iWe=kse.err,oWe={level:"info",levelComparison:RVe.ASC,levels:Fse,messageKey:"msg",errorKey:"err",nestedKey:null,enabled:!0,base:{pid:rWe,hostname:aWe},serializers:Object.assign(Object.create(null),{err:iWe}),formatters:Object.assign(Object.create(null),{bindings(n){return n},level(n,t){return{level:t}}}),hooks:{logMethod:void 0,streamWrite:void 0},timestamp:Lse,name:void 0,redact:null,customLevels:null,useOnlyCustomLevels:!1,depthLimit:5,edgeLimit:100},nWe=kVe(oWe),sWe=Object.assign(Object.create(null),kse);function YU(...n){let t={},{opts:o,stream:i}=nWe(t,DVe(),...n);o.level&&typeof o.level=="string"&&Fse[o.level.toLowerCase()]!==void 0&&(o.level=o.level.toLowerCase());let{redact:e,crlf:a,serializers:A,timestamp:r,messageKey:s,errorKey:g,nestedKey:c,base:I,name:d,level:B,customLevels:f,levelComparison:Q,mixin:y,mixinMergeStrategy:m,useOnlyCustomLevels:_,formatters:T,hooks:R,depthLimit:F,edgeLimit:j,onChild:U,msgPrefix:z}=o,q=bVe({maximumDepth:F,maximumBreadth:j}),x=PVe(T.level,T.bindings,T.log),G=KU.bind({[xU]:q}),J=e?wVe(e,G):{},H=e?{stringify:J[LVe]}:{stringify:G},N="}"+(a?`\r `:` -`),k=vVe.bind(null,{[Mse]:"",[_se]:A,[Nse]:J,[Tse]:KU,[xU]:q,[Rse]:x}),V="";I!==null&&(d===void 0?V=k(I):V=k(Object.assign({},I,{name:d})));let te=r instanceof Function?r:r?Lse:tWe,ie=te().indexOf(":")+1;if(_&&!f)throw Error("customLevels is required if useOnlyCustomLevels is set true");if(y&&typeof y!="function")throw Error(`Unknown mixin type "${typeof y}" - expected "function"`);if(z&&typeof z!="string")throw Error(`Unknown msgPrefix type "${typeof z}" - expected "string"`);MVe(B,f,_);let we=Gse(f,_);typeof i.emit=="function"&&i.emit("message",{code:"PINO_CONFIG",config:{levels:we,messageKey:s,errorKey:g}}),NVe(Q);let se=TVe(Q);return Object.assign(t,{levels:we,[WVe]:se,[ZVe]:_,[KVe]:i,[UVe]:te,[HVe]:ie,[Tse]:KU,[xU]:q,[Nse]:J,[YVe]:N,[jVe]:H,[JVe]:s,[qVe]:g,[zVe]:c,[$Ve]:c?`,${JSON.stringify(c)}:{`:"",[_se]:A,[VVe]:y,[eWe]:m,[Mse]:V,[Rse]:x,[XVe]:R,silent:GVe,onChild:U,[AWe]:z}),Object.setPrototypeOf(t,OVe()),_Ve(t),t[xVe](B),t}Xo.exports=YU;Xo.exports.destination=(n=process.stdout.fd)=>typeof n=="object"?(n.dest=bse(n.dest||process.stdout.fd),Ose(n)):Ose({dest:bse(n),minLength:0});Xo.exports.transport=wU();Xo.exports.multistream=wse();Xo.exports.levels=Gse();Xo.exports.stdSerializers=sWe;Xo.exports.stdTimeFunctions=Object.assign({},vse);Xo.exports.symbols=Pse;Xo.exports.version=FVe;Xo.exports.default=YU;Xo.exports.pino=YU});import{unlink as Dhe}from"node:fs/promises";import{homedir as whe}from"node:os";import{join as QE,resolve as EI}from"node:path";import{createHash as Sce,randomUUID as aK}from"node:crypto";import{mkdir as Dce,readFile as wce,rename as Oce,unlink as rK,writeFile as bce}from"node:fs/promises";import{dirname as Mce}from"node:path";var HH={"\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002":"This question has already been answered from another client; no further reply is needed.","\u4EFB\u52A1\u5DF2\u5B8C\u6210\u3002":"Task completed.",\u7ED3\u679C\u6587\u4EF6:"result file","\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":'The delivery result of the result file "{name}" could not be confirmed. Please check whether it already arrived in the chat before retrying.',"\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":'The result file "{name}" was generated, but the Slack app is missing the files:write permission. Please update the Manifest, reinstall the app, reconnect the bot, and try again.',"\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":'The result file "{name}" was generated, but the bot is missing the Discord Send Messages, Attach Files, or Read Message History permission.',"\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":'The result file "{name}" was generated, but Telegram does not allow the bot to send documents in this chat. Please check the chat permissions.',"\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":'The result file "{name}" was generated, but the bot does not have permission to send files. Please check the channel permissions.',"\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u8D85\u8FC7\u5F53\u524D\u6E20\u9053\u5927\u5C0F\u4E0A\u9650\uFF0C\u672A\u53D1\u9001\u3002":'The result file "{name}" exceeds the size limit of this channel and was not sent.',"\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u4E3A\u7A7A\uFF0C\u672A\u53D1\u9001\u3002":'The result file "{name}" is empty and was not sent.',"\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":'The result file "{name}" cannot be read or prepared for sending right now. Please make sure the file is still accessible and try again.',"\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":'The result file "{name}" was temporarily rate-limited by this channel and could not be sent. Please try again later.',"\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":'The result file "{name}" was generated, but this channel rejected the file or file message.',"\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":'The result file "{name}" was generated, but this channel could not send it right now. Please try again later.',"\u6D88\u606F\u5904\u7406\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"Failed to process the message. Please try again later.","\u5361\u7247\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u67E5\u770B\u540E\u7EED\u6D88\u606F\u3002":"This card has ended. Please check the next message.","\u5DE5\u5177\u8C03\u7528\u300C{name}\u300D\u672A\u6210\u529F\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u5177\u914D\u7F6E\u6216\u7A0D\u540E\u91CD\u8BD5\u3002":'Tool call "{name}" did not succeed. Check the tool configuration or try again later.',"\u65E0\u6CD5\u8FDE\u63A5\u5904\u7406\u670D\u52A1\uFF0C\u6D88\u606F\u5C1A\u672A\u63D0\u4EA4\u3002\u8BF7\u786E\u8BA4 DeepSeek Harness \u6B63\u5728\u8FD0\u884C\u540E\u91CD\u8BD5\u3002":"Could not connect to the processing service, so the message was not submitted. Make sure DeepSeek Harness is running, then try again.","\u5904\u7406\u670D\u52A1\u54CD\u5E94\u8D85\u65F6\uFF0C\u6D88\u606F\u5C1A\u672A\u5F00\u59CB\u5904\u7406\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The processing service timed out before the message started. Please try again later.","\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\u4EFB\u52A1\u72B6\u6001\uFF0C\u4EFB\u52A1\u53EF\u80FD\u5DF2\u7ECF\u5F00\u59CB\u3002\u8BF7\u5148\u7B49\u5F85\u6216\u53D1\u9001 /stop\uFF0C\u4E0D\u8981\u7ACB\u5373\u91CD\u590D\u63D0\u4EA4\u3002":"The task status could not be confirmed and the task may have started. Wait or send /stop before submitting it again.","\u6D88\u606F\u63D0\u4EA4\u7ED3\u679C\u672A\u80FD\u786E\u8BA4\uFF0C\u4EFB\u52A1\u53EF\u80FD\u5DF2\u7ECF\u5F00\u59CB\u3002\u8BF7\u5148\u7B49\u5F85\u6216\u53D1\u9001 /status \u67E5\u770B\u72B6\u6001\uFF0C\u4E0D\u8981\u7ACB\u5373\u91CD\u590D\u63D0\u4EA4\u3002":"The message submission could not be confirmed and the task may have started. Wait or send /status before submitting it again.","\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u4EFB\u52A1\u8FDB\u5EA6\uFF0C\u4EFB\u52A1\u53EF\u80FD\u4ECD\u5728\u8FD0\u884C\u3002\u8BF7\u5148\u7B49\u5F85\u6216\u53D1\u9001 /stop\uFF0C\u4E0D\u8981\u7ACB\u5373\u91CD\u590D\u63D0\u4EA4\u3002":"Task progress is temporarily unavailable and the task may still be running. Wait or send /stop before submitting it again.","\u5904\u7406\u670D\u52A1\u62D2\u7EDD\u4E86\u673A\u5668\u4EBA\u8FDE\u63A5\u3002\u8BF7\u7BA1\u7406\u5458\u68C0\u67E5 Harness \u5730\u5740\u3001\u4EE3\u7406\u6216\u8BBF\u95EE\u914D\u7F6E\u540E\u91CD\u8BD5\u3002":"The processing service rejected the bot connection. Ask an administrator to check the Harness address, proxy, or access settings.","\u673A\u5668\u4EBA\u4E0E DeepSeek Harness \u7684\u63A5\u53E3\u4E0D\u517C\u5BB9\u3002\u8BF7\u7BA1\u7406\u5458\u68C0\u67E5 Harness \u5730\u5740\u5E76\u66F4\u65B0\u76F8\u5173\u7248\u672C\u3002":"The bot and DeepSeek Harness use incompatible APIs. Ask an administrator to check the Harness address and update the related components.","DeepSeek Harness \u6682\u65F6\u65E0\u6CD5\u5B8C\u6210\u8BF7\u6C42\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"DeepSeek Harness could not complete the request. Please try again later.","\u7B49\u5F85\u6A21\u578B\u56DE\u590D\u8D85\u65F6\uFF0C\u4EFB\u52A1\u53EF\u80FD\u4ECD\u5728\u8FD0\u884C\u3002\u8BF7\u5148\u7B49\u5F85\u6216\u53D1\u9001 /stop\uFF0C\u4E0D\u8981\u7ACB\u5373\u91CD\u590D\u63D0\u4EA4\u3002":"Waiting for the model reply timed out and the task may still be running. Wait or send /stop before submitting it again.","\u6A21\u578B\u51ED\u636E\u7F3A\u5931\u6216\u5DF2\u5931\u6548\u3002\u8BF7\u7BA1\u7406\u5458\u68C0\u67E5\u6A21\u578B\u914D\u7F6E\u540E\u91CD\u8BD5\u3002":"The model credentials are missing or invalid. Ask an administrator to check the model settings.","\u6A21\u578B\u989D\u5EA6\u6216\u4F59\u989D\u4E0D\u8DB3\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u7BA1\u7406\u5458\u8865\u5145\u989D\u5EA6\u6216\u5207\u6362\u6A21\u578B\u540E\u91CD\u8BD5\u3002":"The model quota or balance is insufficient. Ask an administrator to add quota or switch models, then try again.","\u6A21\u578B\u670D\u52A1\u6B63\u5728\u9650\u6D41\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The model service is rate-limiting requests. Please try again later.","\u5F53\u524D\u4F1A\u8BDD\u5185\u5BB9\u8D85\u8FC7\u6A21\u578B\u4E0A\u4E0B\u6587\u4E0A\u9650\u3002\u8BF7\u53D1\u9001 /compact \u6216 /new \u540E\u91CD\u8BD5\u3002":"This conversation exceeds the model context limit. Send /compact or /new, then try again.","\u5F53\u524D\u6A21\u578B\u4E0D\u5B58\u5728\u6216\u6682\u4E0D\u53EF\u7528\u3002\u8BF7\u53D1\u9001 /models \u67E5\u770B\u5E76\u4F7F\u7528 /model \u5207\u6362\u6A21\u578B\u3002":"The current model does not exist or is unavailable. Send /models and use /model to switch models.","\u5F53\u524D\u6A21\u578B\u4E0D\u5B58\u5728\u6216\u4E0D\u652F\u6301\u6240\u9009\u914D\u7F6E\u3002\u8BF7\u53D1\u9001 /models\uFF0C\u5E76\u4F7F\u7528 /model \u91CD\u65B0\u9009\u62E9\u3002":"The current model does not exist or does not support the selected settings. Send /models and use /model to choose again.","\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u8FD9\u7C7B\u5185\u5BB9\u6216\u6240\u9009\u914D\u7F6E\u3002\u8BF7\u8C03\u6574\u5185\u5BB9\u3001\u6A21\u578B\u6216\u63A8\u7406\u7B49\u7EA7\u540E\u91CD\u8BD5\u3002":"The current model does not support this content or the selected settings. Adjust the content, model, or reasoning effort and try again.","\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6240\u9009\u914D\u7F6E\u3002\u8BF7\u5207\u6362\u6A21\u578B\u6216\u63A8\u7406\u7B49\u7EA7\u540E\u91CD\u8BD5\u3002":"The current model does not support the selected settings. Switch the model or reasoning effort, then try again.","\u6A21\u578B\u670D\u52A1\u54CD\u5E94\u8D85\u65F6\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The model service timed out and the task did not finish. Please try again later.","\u6682\u65F6\u65E0\u6CD5\u8FDE\u63A5\u6A21\u578B\u670D\u52A1\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The model service is temporarily unreachable and the task did not finish. Please try again later.","\u6A21\u578B\u670D\u52A1\u6682\u65F6\u5F02\u5E38\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The model service is temporarily unavailable and the task did not finish. Please try again later.","\u6A21\u578B\u56DE\u590D\u4E2D\u65AD\u6216\u683C\u5F0F\u5F02\u5E38\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u91CD\u8BD5\u3002":"The model reply was interrupted or malformed, so the task did not finish. Please try again.","\u6A21\u578B\u6CA1\u6709\u8FD4\u56DE\u53EF\u663E\u793A\u7684\u5185\u5BB9\u3002\u8BF7\u91CD\u8BD5\uFF1B\u82E5\u6301\u7EED\u53D1\u751F\uFF0C\u8BF7\u5207\u6362\u6A21\u578B\u3002":"The model returned no displayable content. Try again, or switch models if this keeps happening.","\u6A21\u578B\u62D2\u7EDD\u5904\u7406\u5F53\u524D\u5185\u5BB9\u3002\u8BF7\u8C03\u6574\u95EE\u9898\u5185\u5BB9\u540E\u91CD\u8BD5\u3002":"The model rejected the current content. Revise the request and try again.","\u6A21\u578B\u8FBE\u5230\u8F93\u51FA\u957F\u5EA6\u4E0A\u9650\uFF0C\u4F46\u6CA1\u6709\u751F\u6210\u53EF\u663E\u793A\u7684\u7ED3\u679C\u3002\u8BF7\u7F29\u5C0F\u4EFB\u52A1\u8303\u56F4\u540E\u91CD\u8BD5\u3002":"The model reached its output limit without producing a displayable result. Reduce the task scope and try again.","\u4EFB\u52A1\u6B63\u5728\u7B49\u5F85\u65E0\u6CD5\u5728\u5F53\u524D\u6E20\u9053\u5B8C\u6210\u7684\u64CD\u4F5C\u3002\u8BF7\u5728 DeepSeek Harness \u4E2D\u5904\u7406\u540E\u518D\u8BD5\u3002":"The task is waiting for an action that cannot be completed in this channel. Handle it in DeepSeek Harness, then try again.","\u4EFB\u52A1\u88AB\u610F\u5916\u4E2D\u65AD\uFF0C\u672C\u6B21\u672A\u5B8C\u6210\u3002\u8BF7\u91CD\u8BD5\u3002":"The task was unexpectedly interrupted and did not finish. Please try again.","\u5F53\u524D\u4F1A\u8BDD\u5DF2\u4E0D\u5B58\u5728\u3002\u8BF7\u53D1\u9001 /new \u521B\u5EFA\u65B0\u4F1A\u8BDD\u540E\u91CD\u8BD5\u3002":"The current Session no longer exists. Send /new to create one, then try again.","\u5F53\u524D\u4F1A\u8BDD\u4ECD\u5728\u5904\u7406\u4E0A\u4E00\u9879\u4EFB\u52A1\u3002\u8BF7\u7B49\u5F85\u5B8C\u6210\uFF0C\u6216\u53D1\u9001 /stop \u540E\u91CD\u8BD5\u3002":"The current Session is still processing the previous task. Wait for it to finish, or send /stop before trying again.","\u5DE5\u4F5C\u533A\u6216\u4F1A\u8BDD\u72B6\u6001\u521A\u521A\u53D1\u751F\u53D8\u5316\u3002\u8BF7\u91CD\u65B0\u53D1\u9001\u8FD9\u6761\u6D88\u606F\u3002":"The Workspace or Session state just changed. Please send this message again.","\u5F53\u524D\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728\u6216\u6682\u4E0D\u53EF\u7528\u3002\u8BF7\u91CD\u65B0\u9009\u62E9\u5DE5\u4F5C\u533A\u540E\u91CD\u8BD5\u3002":"The current Workspace does not exist or is unavailable. Select another Workspace and try again.","\u5F53\u524D Agent Preset \u4E0D\u5B58\u5728\u6216\u6682\u4E0D\u53EF\u7528\u3002\u8BF7\u53D1\u9001 /presetlist \u540E\u91CD\u65B0\u9009\u62E9\u3002":"The current Agent Preset does not exist or is unavailable. Send /presetlist and select another one.","\u56DE\u590D\u5DF2\u7ECF\u751F\u6210\uFF0C\u4F46\u673A\u5668\u4EBA\u6CA1\u6709\u53D1\u9001\u6743\u9650\u3002\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u68C0\u67E5\u6E20\u9053\u6743\u9650\u6216\u91CD\u65B0\u7ED1\u5B9A\u673A\u5668\u4EBA\u3002":"The reply was generated, but the bot cannot send it. Ask an administrator to check channel permissions or reconnect the bot.","\u56DE\u590D\u5DF2\u7ECF\u751F\u6210\uFF0C\u4F46\u5F53\u524D\u6E20\u9053\u6B63\u5728\u9650\u6D41\uFF0C\u6682\u65F6\u65E0\u6CD5\u53D1\u9001\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The reply was generated, but this channel is rate-limiting messages. Please try again later.","\u56DE\u590D\u53D1\u9001\u7ED3\u679C\u672A\u80FD\u786E\u8BA4\u3002\u8BF7\u5148\u68C0\u67E5\u804A\u5929\u5185\u662F\u5426\u5DF2\u7ECF\u6536\u5230\uFF0C\u4E0D\u8981\u7ACB\u5373\u91CD\u590D\u63D0\u4EA4\u3002":"Reply delivery could not be confirmed. Check whether it already arrived before submitting the task again.","\u56DE\u590D\u5DF2\u7ECF\u751F\u6210\uFF0C\u4F46\u5F53\u524D\u6E20\u9053\u6682\u65F6\u65E0\u6CD5\u53D1\u9001\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The reply was generated, but this channel could not send it. Please try again later.","\u5F53\u524D\u6D88\u606F\u5305\u542B\u65E0\u6CD5\u5904\u7406\u7684\u56FE\u7247\u6216\u6587\u4EF6\u3002\u8BF7\u8C03\u6574\u540E\u91CD\u65B0\u53D1\u9001\u3002":"This message contains an image or file that cannot be processed. Adjust it and send it again.","\u4EFB\u52A1\u672A\u5B8C\u6210\uFF0C\u6682\u65F6\u65E0\u6CD5\u786E\u5B9A\u539F\u56E0\u3002\u8BF7\u91CD\u8BD5\uFF1B\u82E5\u6301\u7EED\u53D1\u751F\uFF0C\u8BF7\u5C06\u53C2\u8003\u53F7\u63D0\u4F9B\u7ED9\u7BA1\u7406\u5458\u3002":"The task did not finish and the cause could not be determined. Try again; if it persists, give the reference ID to an administrator.","\u9519\u8BEF\u7801\uFF1A{code}\uFF1B\u53C2\u8003\u53F7\uFF1A{referenceId}":"Error code: {code}; reference: {referenceId}","{label}\u673A\u5668\u4EBA":"{label} bot","\u76EE\u524D\u652F\u6301\u6587\u5B57\u548C\u56FE\u7247\u6D88\u606F\u3002":"Only text and image messages are supported at the moment.","\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u548C\u6587\u4EF6\u6D88\u606F\u3002":"Only text, image, and file messages are supported at the moment.","\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u3001\u6587\u4EF6\u548C\u8BED\u97F3\u8F6C\u5199\u6D88\u606F\u3002":"Only text, image, file, and voice-transcription messages are supported at the moment.","\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u3001\u6587\u4EF6\uFF0C\u4EE5\u53CA\u5FAE\u4FE1\u5DF2\u8F6C\u6210\u6587\u5B57\u7684\u8BED\u97F3\u6D88\u606F\u3002":"Only text, image, file, and voice messages already transcribed to text by WeChat are supported at the moment.","\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u6216\u56FE\u7247\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002":"Send text or an image directly to continue the current session.","\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002":"Send text, an image, or a file directly to continue the current session.","\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u3001\u6587\u4EF6\u6216\u5E26\u6587\u5B57\u8BC6\u522B\u7ED3\u679C\u7684\u8BED\u97F3\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002":"Send text, an image, a file, or a voice message already transcribed to text to continue the current session.","{label}\u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002":"The {label} bot is connected to DeepSeek Harness.","/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD":"/new Start a brand-new session","/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587":"/compact Compact the earlier context of the current session","/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A":"/workspace Switch workspace","/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84":"/workspacelist List absolute workspace paths","/sessionlist [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898":"/sessionlist [workspace index or absolute path] List session IDs and titles","/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD":"/session Bind this chat to the specified session","/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B":"/models List all available models by index","/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7":"/reasoninglist or /reasonings List reasoning efforts for the current model by index","/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7":"/reasoning [index, effort ID, or --default] Show or switch the current reasoning effort","/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B":"/model [index or full model ID] Show or switch the model of the current session","/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B":"/model [index or full model ID] [reasoning effort ID] Show or switch the current Session model","\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2":"Example: send /models first, then /model 2","\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]":"Example: send /models first, then /model 2 [reasoning effort ID]","/presetlist \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset":"/presetlist List available Agent Presets by index","/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset":"/preset [index or full ID] Show or set the Agent Preset of this bot","\u7EAF\u6570\u5B57 ID\uFF1A/preset id:":"Numeric-only ID: /preset id:","/preset --default \u8DDF\u968F Host \u9ED8\u8BA4":"/preset --default Follow the Host default","/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1":"/stop Stop the current task","/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1":"/steer Steer the current task","/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001":"/status Check the connection status","/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C":"/version Show the plugin version","/help \u663E\u793A\u672C\u5E2E\u52A9":"/help Show this help","{label}\u673A\u5668\u4EBA\u4E0E DeepSeek Harness \u8FDE\u63A5\u6B63\u5E38\u3002":"The {label} bot is connected to DeepSeek Harness and working normally.","{label}\u673A\u5668\u4EBA\u51ED\u636E\u7F3A\u5931\uFF0C\u8BF7\u79FB\u9664\u540E\u91CD\u65B0\u63A5\u5165\u3002":"{label} bot credentials are missing. Remove the bot and connect it again.","{label}\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002":"The {label} connection is not ready yet. The plugin will retry automatically.","{label}\u673A\u5668\u4EBA\u5DF2\u63A5\u5165\uFF0C\u6D88\u606F\u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002":"The {label} bot is connected, but its message connection is not ready yet.","{label}\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The {label} connection is still not ready. Please try again later.","{label}\u673A\u5668\u4EBA\u5C1A\u672A\u8FDE\u63A5":"The {label} bot is not connected yet","{name}\uFF08{id}\uFF09":"{name} ({id})","{label}{connectionLabel}\u8FD0\u884C\u6B63\u5E38":"The {label}{connectionLabel} is running normally","{label}\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5":"The {label} connection is not ready. The plugin will retry automatically","{label}\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF":"The {label} connection is currently offline","\u5DF2\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002\u8BF7\u53D1\u9001\u4F60\u7684\u95EE\u9898\u3002":"A new session has started. Please send your question.","\u6B63\u5728\u4F7F\u7528{name}\u2026":"Using {name}\u2026","\u5DF2\u505C\u6B62\u3002":"Stopped.","\u8BF7\u7528\u6587\u5B57\u56DE\u7B54\u5F53\u524D\u95EE\u9898\u3002":"Please answer the current question with text.","{label}\u4EA4\u4E92\u95EE\u9898\u53D1\u9001\u5931\u8D25\u3002":"Failed to send the {label} interaction question.","\u56DE\u7B54\u63D0\u4EA4\u5931\u8D25\u3002":"Failed to submit the answer.","\u56DE\u7B54\u63D0\u4EA4\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001\u5F53\u524D\u95EE\u9898\u7684\u7B54\u6848\u3002":"Failed to submit the answer. Please resend your answer to the current question.","\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":"A pending question left over in this Session was detected. It has been safely cancelled, and your latest message is being processed."};var KH={"\u7528\u6CD5\uFF1A/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7\uFF08/session N\uFF09":"Usage: /session Session ID or the session index in the current Workspace (/session N)","\u7528\u6CD5\uFF1A\n/sessionlist \u5217\u51FA\u5F53\u524D\u5DE5\u4F5C\u533A\u4F1A\u8BDD\n/sessionlist \u5DE5\u4F5C\u533A\u5E8F\u53F7 \u6309 /workspacelist \u5E8F\u53F7\u5217\u51FA\u4F1A\u8BDD\n/sessionlist \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5217\u51FA\u6307\u5B9A\u5DE5\u4F5C\u533A\u4F1A\u8BDD":`Usage: +`),k=vVe.bind(null,{[Mse]:"",[_se]:A,[Nse]:J,[Tse]:KU,[xU]:q,[Rse]:x}),V="";I!==null&&(d===void 0?V=k(I):V=k(Object.assign({},I,{name:d})));let te=r instanceof Function?r:r?Lse:tWe,ie=te().indexOf(":")+1;if(_&&!f)throw Error("customLevels is required if useOnlyCustomLevels is set true");if(y&&typeof y!="function")throw Error(`Unknown mixin type "${typeof y}" - expected "function"`);if(z&&typeof z!="string")throw Error(`Unknown msgPrefix type "${typeof z}" - expected "string"`);MVe(B,f,_);let we=Gse(f,_);typeof i.emit=="function"&&i.emit("message",{code:"PINO_CONFIG",config:{levels:we,messageKey:s,errorKey:g}}),NVe(Q);let se=TVe(Q);return Object.assign(t,{levels:we,[WVe]:se,[ZVe]:_,[KVe]:i,[UVe]:te,[HVe]:ie,[Tse]:KU,[xU]:q,[Nse]:J,[YVe]:N,[jVe]:H,[JVe]:s,[qVe]:g,[zVe]:c,[$Ve]:c?`,${JSON.stringify(c)}:{`:"",[_se]:A,[VVe]:y,[eWe]:m,[Mse]:V,[Rse]:x,[XVe]:R,silent:GVe,onChild:U,[AWe]:z}),Object.setPrototypeOf(t,OVe()),_Ve(t),t[xVe](B),t}Xo.exports=YU;Xo.exports.destination=(n=process.stdout.fd)=>typeof n=="object"?(n.dest=bse(n.dest||process.stdout.fd),Ose(n)):Ose({dest:bse(n),minLength:0});Xo.exports.transport=wU();Xo.exports.multistream=wse();Xo.exports.levels=Gse();Xo.exports.stdSerializers=sWe;Xo.exports.stdTimeFunctions=Object.assign({},vse);Xo.exports.symbols=Pse;Xo.exports.version=FVe;Xo.exports.default=YU;Xo.exports.pino=YU});import{unlink as Dhe}from"node:fs/promises";import{homedir as whe}from"node:os";import{join as QE,resolve as EI}from"node:path";import{createHash as Sce,randomUUID as aK}from"node:crypto";import{mkdir as Dce,readFile as wce,rename as Oce,unlink as rK,writeFile as bce}from"node:fs/promises";import{dirname as Mce}from"node:path";var HH={"\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002":"This question has already been answered from another client; no further reply is needed.","\u4EFB\u52A1\u5DF2\u5B8C\u6210\u3002":"Task completed.",\u7ED3\u679C\u6587\u4EF6:"result file","\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":'The delivery result of the result file "{name}" could not be confirmed. Please check whether it already arrived in the chat before retrying.',"\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":'The result file "{name}" was generated, but the Slack app is missing the files:write permission. Please update the Manifest, reinstall the app, reconnect the bot, and try again.',"\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":'The result file "{name}" was generated, but the bot is missing the Discord Send Messages, Attach Files, or Read Message History permission.',"\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":'The result file "{name}" was generated, but Telegram does not allow the bot to send documents in this chat. Please check the chat permissions.',"\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":'The result file "{name}" was generated, but the bot does not have permission to send files. Please check the channel permissions.',"\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u8D85\u8FC7\u5F53\u524D\u6E20\u9053\u5927\u5C0F\u4E0A\u9650\uFF0C\u672A\u53D1\u9001\u3002":'The result file "{name}" exceeds the size limit of this channel and was not sent.',"\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u4E3A\u7A7A\uFF0C\u672A\u53D1\u9001\u3002":'The result file "{name}" is empty and was not sent.',"\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":'The result file "{name}" cannot be read or prepared for sending right now. Please make sure the file is still accessible and try again.',"\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":'The result file "{name}" was temporarily rate-limited by this channel and could not be sent. Please try again later.',"\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":'The result file "{name}" was generated, but this channel rejected the file or file message.',"\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":'The result file "{name}" was generated, but this channel could not send it right now. Please try again later.',"\u6D88\u606F\u5904\u7406\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"Failed to process the message. Please try again later.","\u5361\u7247\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u67E5\u770B\u540E\u7EED\u6D88\u606F\u3002":"This card has ended. Please check the next message.","\u5DE5\u5177\u8C03\u7528\u300C{name}\u300D\u672A\u6210\u529F\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u5177\u914D\u7F6E\u6216\u7A0D\u540E\u91CD\u8BD5\u3002":'Tool call "{name}" did not succeed. Check the tool configuration or try again later.',"\u65E0\u6CD5\u8FDE\u63A5\u5904\u7406\u670D\u52A1\uFF0C\u6D88\u606F\u5C1A\u672A\u63D0\u4EA4\u3002\u8BF7\u786E\u8BA4 DeepSeek Harness \u6B63\u5728\u8FD0\u884C\u540E\u91CD\u8BD5\u3002":"Could not connect to the processing service, so the message was not submitted. Make sure DeepSeek Harness is running, then try again.","\u5904\u7406\u670D\u52A1\u54CD\u5E94\u8D85\u65F6\uFF0C\u6D88\u606F\u5C1A\u672A\u5F00\u59CB\u5904\u7406\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The processing service timed out before the message started. Please try again later.","\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\u4EFB\u52A1\u72B6\u6001\uFF0C\u4EFB\u52A1\u53EF\u80FD\u5DF2\u7ECF\u5F00\u59CB\u3002\u8BF7\u5148\u7B49\u5F85\u6216\u53D1\u9001 /stop\uFF0C\u4E0D\u8981\u7ACB\u5373\u91CD\u590D\u63D0\u4EA4\u3002":"The task status could not be confirmed and the task may have started. Wait or send /stop before submitting it again.","\u6D88\u606F\u63D0\u4EA4\u7ED3\u679C\u672A\u80FD\u786E\u8BA4\uFF0C\u4EFB\u52A1\u53EF\u80FD\u5DF2\u7ECF\u5F00\u59CB\u3002\u8BF7\u5148\u7B49\u5F85\u6216\u53D1\u9001 /status \u67E5\u770B\u72B6\u6001\uFF0C\u4E0D\u8981\u7ACB\u5373\u91CD\u590D\u63D0\u4EA4\u3002":"The message submission could not be confirmed and the task may have started. Wait or send /status before submitting it again.","\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u4EFB\u52A1\u8FDB\u5EA6\uFF0C\u4EFB\u52A1\u53EF\u80FD\u4ECD\u5728\u8FD0\u884C\u3002\u8BF7\u5148\u7B49\u5F85\u6216\u53D1\u9001 /stop\uFF0C\u4E0D\u8981\u7ACB\u5373\u91CD\u590D\u63D0\u4EA4\u3002":"Task progress is temporarily unavailable and the task may still be running. Wait or send /stop before submitting it again.","\u5904\u7406\u670D\u52A1\u62D2\u7EDD\u4E86\u673A\u5668\u4EBA\u8FDE\u63A5\u3002\u8BF7\u7BA1\u7406\u5458\u68C0\u67E5 Harness \u5730\u5740\u3001\u4EE3\u7406\u6216\u8BBF\u95EE\u914D\u7F6E\u540E\u91CD\u8BD5\u3002":"The processing service rejected the bot connection. Ask an administrator to check the Harness address, proxy, or access settings.","\u673A\u5668\u4EBA\u4E0E DeepSeek Harness \u7684\u63A5\u53E3\u4E0D\u517C\u5BB9\u3002\u8BF7\u7BA1\u7406\u5458\u68C0\u67E5 Harness \u5730\u5740\u5E76\u66F4\u65B0\u76F8\u5173\u7248\u672C\u3002":"The bot and DeepSeek Harness use incompatible APIs. Ask an administrator to check the Harness address and update the related components.","DeepSeek Harness \u6682\u65F6\u65E0\u6CD5\u5B8C\u6210\u8BF7\u6C42\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"DeepSeek Harness could not complete the request. Please try again later.","\u7B49\u5F85\u6A21\u578B\u56DE\u590D\u8D85\u65F6\uFF0C\u4EFB\u52A1\u53EF\u80FD\u4ECD\u5728\u8FD0\u884C\u3002\u8BF7\u5148\u7B49\u5F85\u6216\u53D1\u9001 /stop\uFF0C\u4E0D\u8981\u7ACB\u5373\u91CD\u590D\u63D0\u4EA4\u3002":"Waiting for the model reply timed out and the task may still be running. Wait or send /stop before submitting it again.","\u6A21\u578B\u51ED\u636E\u7F3A\u5931\u6216\u5DF2\u5931\u6548\u3002\u8BF7\u7BA1\u7406\u5458\u68C0\u67E5\u6A21\u578B\u914D\u7F6E\u540E\u91CD\u8BD5\u3002":"The model credentials are missing or invalid. Ask an administrator to check the model settings.","\u6A21\u578B\u989D\u5EA6\u6216\u4F59\u989D\u4E0D\u8DB3\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u7BA1\u7406\u5458\u8865\u5145\u989D\u5EA6\u6216\u5207\u6362\u6A21\u578B\u540E\u91CD\u8BD5\u3002":"The model quota or balance is insufficient. Ask an administrator to add quota or switch models, then try again.","\u6A21\u578B\u670D\u52A1\u6B63\u5728\u9650\u6D41\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The model service is rate-limiting requests. Please try again later.","\u5F53\u524D\u4F1A\u8BDD\u5185\u5BB9\u8D85\u8FC7\u6A21\u578B\u4E0A\u4E0B\u6587\u4E0A\u9650\u3002\u8BF7\u53D1\u9001 /compact \u6216 /new \u540E\u91CD\u8BD5\u3002":"This conversation exceeds the model context limit. Send /compact or /new, then try again.","\u5F53\u524D\u6A21\u578B\u4E0D\u5B58\u5728\u6216\u6682\u4E0D\u53EF\u7528\u3002\u8BF7\u53D1\u9001 /models \u67E5\u770B\u5E76\u4F7F\u7528 /model \u5207\u6362\u6A21\u578B\u3002":"The current model does not exist or is unavailable. Send /models and use /model to switch models.","\u5F53\u524D\u6A21\u578B\u4E0D\u5B58\u5728\u6216\u4E0D\u652F\u6301\u6240\u9009\u914D\u7F6E\u3002\u8BF7\u53D1\u9001 /models\uFF0C\u5E76\u4F7F\u7528 /model \u91CD\u65B0\u9009\u62E9\u3002":"The current model does not exist or does not support the selected settings. Send /models and use /model to choose again.","\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u8FD9\u7C7B\u5185\u5BB9\u6216\u6240\u9009\u914D\u7F6E\u3002\u8BF7\u8C03\u6574\u5185\u5BB9\u3001\u6A21\u578B\u6216\u63A8\u7406\u7B49\u7EA7\u540E\u91CD\u8BD5\u3002":"The current model does not support this content or the selected settings. Adjust the content, model, or reasoning effort and try again.","\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u6240\u9009\u914D\u7F6E\u3002\u8BF7\u5207\u6362\u6A21\u578B\u6216\u63A8\u7406\u7B49\u7EA7\u540E\u91CD\u8BD5\u3002":"The current model does not support the selected settings. Switch the model or reasoning effort, then try again.","\u6A21\u578B\u670D\u52A1\u54CD\u5E94\u8D85\u65F6\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The model service timed out and the task did not finish. Please try again later.","\u6682\u65F6\u65E0\u6CD5\u8FDE\u63A5\u6A21\u578B\u670D\u52A1\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The model service is temporarily unreachable and the task did not finish. Please try again later.","\u6A21\u578B\u670D\u52A1\u6682\u65F6\u5F02\u5E38\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The model service is temporarily unavailable and the task did not finish. Please try again later.","\u6A21\u578B\u56DE\u590D\u4E2D\u65AD\u6216\u683C\u5F0F\u5F02\u5E38\uFF0C\u672C\u6B21\u4EFB\u52A1\u672A\u5B8C\u6210\u3002\u8BF7\u91CD\u8BD5\u3002":"The model reply was interrupted or malformed, so the task did not finish. Please try again.","\u6A21\u578B\u6CA1\u6709\u8FD4\u56DE\u53EF\u663E\u793A\u7684\u5185\u5BB9\u3002\u8BF7\u91CD\u8BD5\uFF1B\u82E5\u6301\u7EED\u53D1\u751F\uFF0C\u8BF7\u5207\u6362\u6A21\u578B\u3002":"The model returned no displayable content. Try again, or switch models if this keeps happening.","\u6A21\u578B\u62D2\u7EDD\u5904\u7406\u5F53\u524D\u5185\u5BB9\u3002\u8BF7\u8C03\u6574\u95EE\u9898\u5185\u5BB9\u540E\u91CD\u8BD5\u3002":"The model rejected the current content. Revise the request and try again.","\u6A21\u578B\u8FBE\u5230\u8F93\u51FA\u957F\u5EA6\u4E0A\u9650\uFF0C\u4F46\u6CA1\u6709\u751F\u6210\u53EF\u663E\u793A\u7684\u7ED3\u679C\u3002\u8BF7\u7F29\u5C0F\u4EFB\u52A1\u8303\u56F4\u540E\u91CD\u8BD5\u3002":"The model reached its output limit without producing a displayable result. Reduce the task scope and try again.","\u4EFB\u52A1\u6B63\u5728\u7B49\u5F85\u65E0\u6CD5\u5728\u5F53\u524D\u6E20\u9053\u5B8C\u6210\u7684\u64CD\u4F5C\u3002\u8BF7\u5728 DeepSeek Harness \u4E2D\u5904\u7406\u540E\u518D\u8BD5\u3002":"The task is waiting for an action that cannot be completed in this channel. Handle it in DeepSeek Harness, then try again.","\u4EFB\u52A1\u88AB\u610F\u5916\u4E2D\u65AD\uFF0C\u672C\u6B21\u672A\u5B8C\u6210\u3002\u8BF7\u91CD\u8BD5\u3002":"The task was unexpectedly interrupted and did not finish. Please try again.","\u5F53\u524D\u4F1A\u8BDD\u5DF2\u4E0D\u5B58\u5728\u3002\u8BF7\u53D1\u9001 /new \u521B\u5EFA\u65B0\u4F1A\u8BDD\u540E\u91CD\u8BD5\u3002":"The current Session no longer exists. Send /new to create one, then try again.","\u5F53\u524D\u4F1A\u8BDD\u4ECD\u5728\u5904\u7406\u4E0A\u4E00\u9879\u4EFB\u52A1\u3002\u8BF7\u7B49\u5F85\u5B8C\u6210\uFF0C\u6216\u53D1\u9001 /stop \u540E\u91CD\u8BD5\u3002":"The current Session is still processing the previous task. Wait for it to finish, or send /stop before trying again.","\u5DE5\u4F5C\u533A\u6216\u4F1A\u8BDD\u72B6\u6001\u521A\u521A\u53D1\u751F\u53D8\u5316\u3002\u8BF7\u91CD\u65B0\u53D1\u9001\u8FD9\u6761\u6D88\u606F\u3002":"The Workspace or Session state just changed. Please send this message again.","\u5F53\u524D\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728\u6216\u6682\u4E0D\u53EF\u7528\u3002\u8BF7\u91CD\u65B0\u9009\u62E9\u5DE5\u4F5C\u533A\u540E\u91CD\u8BD5\u3002":"The current Workspace does not exist or is unavailable. Select another Workspace and try again.","\u5F53\u524D Agent Preset \u4E0D\u5B58\u5728\u6216\u6682\u4E0D\u53EF\u7528\u3002\u8BF7\u53D1\u9001 /presetlist \u540E\u91CD\u65B0\u9009\u62E9\u3002":"The current Agent Preset does not exist or is unavailable. Send /presetlist and select another one.","\u56DE\u590D\u5DF2\u7ECF\u751F\u6210\uFF0C\u4F46\u673A\u5668\u4EBA\u6CA1\u6709\u53D1\u9001\u6743\u9650\u3002\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u68C0\u67E5\u6E20\u9053\u6743\u9650\u6216\u91CD\u65B0\u7ED1\u5B9A\u673A\u5668\u4EBA\u3002":"The reply was generated, but the bot cannot send it. Ask an administrator to check channel permissions or reconnect the bot.","\u56DE\u590D\u5DF2\u7ECF\u751F\u6210\uFF0C\u4F46\u5F53\u524D\u6E20\u9053\u6B63\u5728\u9650\u6D41\uFF0C\u6682\u65F6\u65E0\u6CD5\u53D1\u9001\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The reply was generated, but this channel is rate-limiting messages. Please try again later.","\u56DE\u590D\u53D1\u9001\u7ED3\u679C\u672A\u80FD\u786E\u8BA4\u3002\u8BF7\u5148\u68C0\u67E5\u804A\u5929\u5185\u662F\u5426\u5DF2\u7ECF\u6536\u5230\uFF0C\u4E0D\u8981\u7ACB\u5373\u91CD\u590D\u63D0\u4EA4\u3002":"Reply delivery could not be confirmed. Check whether it already arrived before submitting the task again.","\u56DE\u590D\u5DF2\u7ECF\u751F\u6210\uFF0C\u4F46\u5F53\u524D\u6E20\u9053\u6682\u65F6\u65E0\u6CD5\u53D1\u9001\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The reply was generated, but this channel could not send it. Please try again later.","\u5F53\u524D\u6D88\u606F\u5305\u542B\u65E0\u6CD5\u5904\u7406\u7684\u56FE\u7247\u6216\u6587\u4EF6\u3002\u8BF7\u8C03\u6574\u540E\u91CD\u65B0\u53D1\u9001\u3002":"This message contains an image or file that cannot be processed. Adjust it and send it again.","\u4EFB\u52A1\u672A\u5B8C\u6210\uFF0C\u6682\u65F6\u65E0\u6CD5\u786E\u5B9A\u539F\u56E0\u3002\u8BF7\u91CD\u8BD5\uFF1B\u82E5\u6301\u7EED\u53D1\u751F\uFF0C\u8BF7\u5C06\u53C2\u8003\u53F7\u63D0\u4F9B\u7ED9\u7BA1\u7406\u5458\u3002":"The task did not finish and the cause could not be determined. Try again; if it persists, give the reference ID to an administrator.","\u9519\u8BEF\u7801\uFF1A{code}\uFF1B\u53C2\u8003\u53F7\uFF1A{referenceId}":"Error code: {code}; reference: {referenceId}","{label}\u673A\u5668\u4EBA":"{label} bot","\u76EE\u524D\u652F\u6301\u6587\u5B57\u548C\u56FE\u7247\u6D88\u606F\u3002":"Only text and image messages are supported at the moment.","\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u548C\u6587\u4EF6\u6D88\u606F\u3002":"Only text, image, and file messages are supported at the moment.","\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u3001\u6587\u4EF6\u548C\u8BED\u97F3\u8F6C\u5199\u6D88\u606F\u3002":"Only text, image, file, and voice-transcription messages are supported at the moment.","\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u3001\u6587\u4EF6\uFF0C\u4EE5\u53CA\u5FAE\u4FE1\u5DF2\u8F6C\u6210\u6587\u5B57\u7684\u8BED\u97F3\u6D88\u606F\u3002":"Only text, image, file, and voice messages already transcribed to text by WeChat are supported at the moment.","\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u6216\u56FE\u7247\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002":"Send text or an image directly to continue the current session.","\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002":"Send text, an image, or a file directly to continue the current session.","\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u3001\u6587\u4EF6\u6216\u5E26\u6587\u5B57\u8BC6\u522B\u7ED3\u679C\u7684\u8BED\u97F3\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002":"Send text, an image, a file, or a voice message already transcribed to text to continue the current session.","{label}\u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002":"The {label} bot is connected to DeepSeek Harness.","/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD":"/new Start a brand-new session","/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587":"/compact Compact the earlier context of the current session","/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A":"/workspace Switch workspace","/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84":"/workspacelist List absolute workspace paths","/sessionlist [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898":"/sessionlist [workspace index or absolute path] List session IDs and titles","/sessionlist \u6216 /sessions [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898":"/sessionlist or /sessions [workspace index or absolute path] List session IDs and titles","/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD":"/session Bind this chat to the specified session","/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B":"/models List all available models by index","/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7":"/reasoninglist or /reasonings List reasoning efforts for the current model by index","/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7":"/reasoning [index, effort ID, or --default] Show or switch the current reasoning effort","/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B":"/model [index or full model ID] Show or switch the model of the current session","/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B":"/model [index or full model ID] [reasoning effort ID] Show or switch the current Session model","\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2":"Example: send /models first, then /model 2","\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]":"Example: send /models first, then /model 2 [reasoning effort ID]","/presetlist \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset":"/presetlist List available Agent Presets by index","/presetlist \u6216 /presets \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset":"/presetlist or /presets List available Agent Presets by index","/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset":"/preset [index or full ID] Show or set the Agent Preset of this bot","\u7EAF\u6570\u5B57 ID\uFF1A/preset id:":"Numeric-only ID: /preset id:","/preset --default \u8DDF\u968F Host \u9ED8\u8BA4":"/preset --default Follow the Host default","/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1":"/stop Stop the current task","/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1":"/steer Steer the current task","/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001":"/status Check the connection status","/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C":"/version Show the plugin version","/help \u663E\u793A\u672C\u5E2E\u52A9":"/help Show this help","{label}\u673A\u5668\u4EBA\u4E0E DeepSeek Harness \u8FDE\u63A5\u6B63\u5E38\u3002":"The {label} bot is connected to DeepSeek Harness and working normally.","{label}\u673A\u5668\u4EBA\u51ED\u636E\u7F3A\u5931\uFF0C\u8BF7\u79FB\u9664\u540E\u91CD\u65B0\u63A5\u5165\u3002":"{label} bot credentials are missing. Remove the bot and connect it again.","{label}\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002":"The {label} connection is not ready yet. The plugin will retry automatically.","{label}\u673A\u5668\u4EBA\u5DF2\u63A5\u5165\uFF0C\u6D88\u606F\u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002":"The {label} bot is connected, but its message connection is not ready yet.","{label}\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The {label} connection is still not ready. Please try again later.","{label}\u673A\u5668\u4EBA\u5C1A\u672A\u8FDE\u63A5":"The {label} bot is not connected yet","{name}\uFF08{id}\uFF09":"{name} ({id})","{label}{connectionLabel}\u8FD0\u884C\u6B63\u5E38":"The {label}{connectionLabel} is running normally","{label}\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5":"The {label} connection is not ready. The plugin will retry automatically","{label}\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF":"The {label} connection is currently offline","\u5DF2\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002\u8BF7\u53D1\u9001\u4F60\u7684\u95EE\u9898\u3002":"A new session has started. Please send your question.","\u6B63\u5728\u4F7F\u7528{name}\u2026":"Using {name}\u2026","\u5DF2\u505C\u6B62\u3002":"Stopped.","\u8BF7\u7528\u6587\u5B57\u56DE\u7B54\u5F53\u524D\u95EE\u9898\u3002":"Please answer the current question with text.","{label}\u4EA4\u4E92\u95EE\u9898\u53D1\u9001\u5931\u8D25\u3002":"Failed to send the {label} interaction question.","\u56DE\u7B54\u63D0\u4EA4\u5931\u8D25\u3002":"Failed to submit the answer.","\u56DE\u7B54\u63D0\u4EA4\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001\u5F53\u524D\u95EE\u9898\u7684\u7B54\u6848\u3002":"Failed to submit the answer. Please resend your answer to the current question.","\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":"A pending question left over in this Session was detected. It has been safely cancelled, and your latest message is being processed."};var KH={"\u7528\u6CD5\uFF1A/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7\uFF08/session N\uFF09":"Usage: /session Session ID or the session index in the current Workspace (/session N)","\u7528\u6CD5\uFF1A\n/sessionlist \u5217\u51FA\u5F53\u524D\u5DE5\u4F5C\u533A\u4F1A\u8BDD\n/sessionlist \u5DE5\u4F5C\u533A\u5E8F\u53F7 \u6309 /workspacelist \u5E8F\u53F7\u5217\u51FA\u4F1A\u8BDD\n/sessionlist \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5217\u51FA\u6307\u5B9A\u5DE5\u4F5C\u533A\u4F1A\u8BDD":`Usage: /sessionlist List Sessions in the current Workspace /sessionlist Workspace index List Sessions by /workspacelist index /sessionlist Workspace absolute path List Sessions in the given Workspace`,"\u5DE5\u4F5C\u533A\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84\u3002\n{usage}":`The Workspace must be an absolute path. @@ -115,7 +115,7 @@ Send /send to retry or /cancel to cancel.`};var YH={"\u5317\u6C47\u661F\u6CB3 AI {url}`,"\u6388\u6743\u94FE\u63A5\u5DF2\u8FC7\u671F\uFF1B\u5E73\u53F0\u672A\u8FD4\u56DE\u6210\u529F\u7ED3\u679C\uFF0C\u65E0\u6CD5\u786E\u8BA4\u5DF2\u4FEE\u590D\u3002\u53D1\u9001 /repair \u751F\u6210\u65B0\u94FE\u63A5\u3002":"The authorization link expired; the platform returned no success, so the repair cannot be confirmed. Send /repair for a new link.","\u5DF2\u53D6\u6D88\u672C\u6B21\u4FEE\u590D\u6388\u6743\uFF0C\u672A\u786E\u8BA4\u5B8C\u6210\u4FEE\u590D\u3002":"Repair authorization was cancelled; the repair was not confirmed.","\u4F60\u5DF2\u53D6\u6D88\u6216\u62D2\u7EDD\u6388\u6743\uFF0C\u6CA1\u6709\u786E\u8BA4\u4FEE\u590D\uFF1B\u53D1\u9001 /repair \u53EF\u91CD\u8BD5\u3002":"You cancelled or declined authorization, so the repair was not confirmed. Send /repair to retry.","\u6388\u6743\u5DF2\u63D0\u4EA4\uFF0C\u4F46\u672A\u6536\u5230\u6D4B\u8BD5\u6309\u94AE\u56DE\u8C03\u3002\u53EF\u80FD\u5C1A\u672A\u70B9\u51FB\u6216\u914D\u7F6E\u4ECD\u5728\u4F20\u64AD\uFF1B\u7A0D\u540E\u53D1\u9001 /repair verify \u67E5\u8BE2\uFF0C\u4E0D\u8981\u76F2\u76EE\u91CD\u590D\u6388\u6743\u3002":"Authorization was submitted, but no test-button callback arrived. It may not have been tapped yet, or the config is still propagating. Send /repair verify later to check; do not authorize blindly again.","\u4FEE\u590D\u6D41\u7A0B\u6682\u65F6\u5931\u8D25\uFF0C\u73B0\u6709\u673A\u5668\u4EBA\u8FDE\u63A5\u4E0D\u53D7\u5F71\u54CD\uFF1B\u53D1\u9001 /repair \u53EF\u91CD\u8BD5\u3002":"The repair flow failed for now; the existing bot connection is unaffected. Send /repair to retry.","\u6388\u6743\u5DF2\u786E\u8BA4\uFF0C\u6B63\u5728\u7B49\u5F85\u4E13\u7528\u6D4B\u8BD5\u6309\u94AE\u7684\u771F\u5B9E\u56DE\u8C03\uFF1B\u56DE\u8C03\u5230\u8FBE\u524D\u4E0D\u4F1A\u5BA3\u544A\u6210\u529F\u3002":"Authorization confirmed. Waiting for the real callback from the dedicated test button; success is not declared until it arrives.","\u6388\u6743\u5C1A\u672A\u5B8C\u6210\uFF0C\u6682\u65F6\u4E0D\u80FD\u9A8C\u8BC1\u5361\u7247\u6309\u94AE\u3002\u8BF7\u5148\u6253\u5F00\u6388\u6743\u94FE\u63A5\u5E76\u786E\u8BA4\u3002":"Authorization is not complete, so the card buttons cannot be verified yet. Open the authorization link and confirm first.","\u4FEE\u590D\u4EFB\u52A1\u6B63\u5728\u7B49\u5F85\u6388\u6743{remaining}\u3002\u53D1\u9001 /repair qr \u53EF\u83B7\u53D6\u4E8C\u7EF4\u7801\uFF0C/repair cancel \u53EF\u53D6\u6D88\u3002":"The repair task is waiting for authorization{remaining}. Send /repair qr for the QR code, or /repair cancel to cancel.","\uFF0C\u5269\u4F59\u7EA6 {minutes} \u5206\u949F":", about {minutes} minutes left","\u8FD9\u4E2A\u83DC\u5355\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u56DE\u590D /m \u91CD\u65B0\u6253\u5F00\u3002":"This menu has expired. Send /m to reopen it.","\u83DC\u5355\u6CA1\u6709\u8FD9\u4E2A\u7F16\u53F7\uFF0C\u56DE\u590D /m \u91CD\u65B0\u6253\u5F00\u3002":"This menu has no such number. Send /m to reopen it.","\u672C\u9875\u53EA\u6709 {count} \u4E2A\u4F1A\u8BDD\uFF0C\u56DE\u590D /sessionlist \u91CD\u65B0\u67E5\u770B\u3002":"This page has only {count} sessions. Send /sessionlist to view them again.","\u53EA\u6709 {count} \u4E2A\u5DE5\u4F5C\u533A\uFF0C\u56DE\u590D /workspacelist \u91CD\u65B0\u67E5\u770B\u3002":"There are only {count} workspaces. Send /workspacelist to view them again.","\u5173\u6CE8\u5217\u8868\u53EA\u6709 {count} \u4E2A\u4F1A\u8BDD\u3002":"The watch list has only {count} sessions.","\u5DF2\u7ED1\u5B9A\u4F1A\u8BDD\u300C{title}\u300D\nID\uFF1A{id}":`Session bound: "{title}" ID: {id}`,"\u7ED1\u5B9A\u5931\u8D25\uFF1A{message}":"Binding failed: {message}","\u5207\u6362\u5931\u8D25\uFF1A{message}":"Switch failed: {message}","\u7528\u6CD5\uFF1A/watch ":"Usage: /watch ","\u5F53\u524D\u673A\u5668\u4EBA\u6CA1\u6709\u53EF\u7528\u7684\u5DE5\u4F5C\u533A\uFF0C\u65E0\u6CD5\u6309\u5E8F\u53F7\u89E3\u6790\u4F1A\u8BDD\u3002":"This bot has no available workspace, so sessions cannot be resolved by index.","\u5F53\u524D\u5DE5\u4F5C\u533A\u53EA\u6709 {count} \u4E2A\u4F1A\u8BDD\u3002":"The current workspace has only {count} sessions.","\u6CA1\u6709\u627E\u5230\u8FD9\u4E2A\u4F1A\u8BDD\uFF0C\u8BF7\u7528 /sessionlist \u67E5\u770B\u53EF\u7528\u4F1A\u8BDD\u3002":"Session not found. Use /sessionlist to see the available sessions.","\u5F53\u524D\u72B6\u6001\u5B58\u50A8\u4E0D\u652F\u6301\u5173\u6CE8\u3002":"The current state store does not support watching.","\u65E0\u6CD5\u89E3\u6790\u4F1A\u8BDD\uFF1A{message}":"Could not resolve the session: {message}","\u6BCF\u4E2A\u804A\u5929\u6700\u591A\u5173\u6CE8 {count} \u4E2A\u4F1A\u8BDD\u3002":"Each chat can watch at most {count} sessions.","\u5173\u6CE8\u5217\u8868\u91CC\u6CA1\u6709\u8FD9\u4E2A\u4F1A\u8BDD\uFF0C\u56DE\u590D /watchlist \u67E5\u770B\u3002":"This session is not in the watch list. Send /watchlist to view it.","\u5DF2\u5173\u6CE8\u4F1A\u8BDD\u300C{title}\u300D\uFF0C\u4EFB\u52A1\u5B8C\u6210\u4F1A\u63A8\u9001\u7ED3\u679C\u3002":'Watching session "{title}"; results are pushed when the task completes.',"\u5173\u6CE8\u5931\u8D25\uFF1A{message}":"Could not watch: {message}","\u5DF2\u53D6\u6D88\u5173\u6CE8\u300C{title}\u300D\u3002":'Unwatched "{title}".',"\u53D6\u6D88\u5931\u8D25\uFF1A{message}":"Could not unwatch: {message}","\u98DE\u4E66\u4EA4\u4E92\u95EE\u9898\u53D1\u9001\u5931\u8D25\u3002":"Failed to send the Feishu interaction question.","\u5F53\u524D\u4EFB\u52A1\u4ECD\u5728\u8FD0\u884C\uFF0C\u8BF7\u5148\u505C\u6B62\u4EFB\u52A1\u6216\u7B49\u5F85\u4EFB\u52A1\u5B8C\u6210\u540E\u518D\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002":"The current task is still running. Stop it or wait for it to finish before starting a new session.","\u8BF7\u8F93\u5165\u8865\u5145\u6307\u4EE4\u540E\u518D\u63D0\u4EA4\u3002":"Enter an instruction before submitting.","\u64CD\u4F5C\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5\u3002":"Too many card actions are pending. Please try again shortly.","\u5361\u7247\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"The card action failed. Please try again later.","\u8BF7\u5148\u9009\u62E9\u81F3\u5C11\u4E00\u4E2A\u4F1A\u8BDD\u3002":"Select at least one session first.","\u5DF2\u6279\u91CF\u5173\u6CE8 {count} \u4E2A\u4F1A\u8BDD\u3002":"Now watching {count} sessions.","\u5DF2\u6279\u91CF\u5173\u6CE8 {count} \u4E2A\u4F1A\u8BDD\uFF0C\u53E6\u6709 {failed} \u4E2A\u672A\u6210\u529F\u3002":"Now watching {count} sessions; {failed} could not be processed.","\u5DF2\u5173\u6CE8\uFF08\u6216\u5DF2\u8FBE\u5173\u6CE8\u4E0A\u9650\uFF09\u3002":"Sessions are already watched, or the watch limit has been reached.","\u5DF2\u53D6\u6D88\u5173\u6CE8 {count} \u4E2A\u4F1A\u8BDD\u3002":"Stopped watching {count} sessions.","\u5DF2\u53D6\u6D88\u5173\u6CE8 {count} \u4E2A\u4F1A\u8BDD\uFF0C\u53E6\u6709 {failed} \u4E2A\u672A\u6210\u529F\u3002":"Stopped watching {count} sessions; {failed} could not be processed.","\u6240\u9009\u4F1A\u8BDD\u5747\u672A\u5904\u7406\u6210\u529F\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"None of the selected sessions could be processed. Please try again later.","\u6240\u9009\u4F1A\u8BDD\u5DF2\u5728\u5173\u6CE8\u5217\u8868\u4E2D\u3002":"The selected sessions are already being watched.","\u6240\u9009\u4F1A\u8BDD\u5DF2\u4E0D\u5728\u5173\u6CE8\u5217\u8868\u4E2D\u3002":"The selected sessions are no longer in the watch list.","\u672A\u53D6\u6D88\u4EFB\u4F55\u5173\u6CE8\u3002":"No watches were removed.","\u5F53\u524D\u6CA1\u6709\u7ED1\u5B9A\u7684\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u4ECE\u4F1A\u8BDD\u5217\u8868\u9009\u62E9\u3002":"No session is currently bound. Select one from the session list first.","\u5DF2\u5C31\u7EEA\uFF0C\u76F4\u63A5\u53D1\u6D88\u606F\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002":"Ready. Send a message to continue the current session.","\u4FEE\u590D\u9700\u5728\u79C1\u804A\u4E2D\u9A8C\u8BC1\u63A5\u5165\u8005\u8EAB\u4EFD\uFF0C\u8BF7\u76F4\u63A5\u53D1\u9001 /repair \u5F00\u59CB\u3002":"Repair must verify the owner in a direct chat. Send /repair there to begin.","\u6682\u65F6\u65E0\u6CD5\u83B7\u53D6\u9884\u8BBE\u5217\u8868\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"Could not load the preset list. Please try again later.","\u6682\u65F6\u65E0\u6CD5\u83B7\u53D6\u7CFB\u7EDF\u72B6\u6001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"Could not load system status. Please try again later.",\u8FDE\u63A5\u6B63\u5E38:"Connected","\u9884\u8BBE\uFF1A{preset}":"Preset: {preset}",\u672A\u77E5:"Unknown","/stop \u6267\u884C\u5B8C\u6210\u3002":"/stop completed.","\u505C\u6B62\u4EFB\u52A1\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"Could not stop the task. Please try again later.","\u5DF2\u63D0\u4EA4\u8865\u5145\u6307\u4EE4\u3002":"Instruction submitted.","\u9884\u8BBE\u91CD\u7F6E\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"Could not reset the preset. Please try again later.","\u9884\u8BBE\u5207\u6362\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002":"Could not switch the preset. Please try again later.","\u{1F916} \u52A9\u624B\u4E2D\u5FC3":"\u{1F916} Assistant center","**\u8BBE\u7F6E**":"**Settings**",\u5207\u6362\u4F1A\u8BDD:"Switch session","\u9009\u62E9\u4F1A\u8BDD\uFF08\u5F53\u524D\u672A\u7ED1\u5B9A\uFF09":"Select a session (none currently bound)",\u8DDF\u968F\u9ED8\u8BA4:"Follow default",\u5207\u6362\u9884\u8BBE:"Switch preset",\u5207\u6362\u6A21\u578B:"Switch model","\u5F53\u524D\u5DE5\u4F5C\u533A\u6682\u65E0\u53EF\u7528\u4F1A\u8BDD\u3002":"There are no available sessions in the current workspace.","\u{1F916} \u5207\u6362\u9884\u8BBE":"\u{1F916} Switch preset","\u{1F9E0} \u5207\u6362\u6A21\u578B":"\u{1F9E0} Switch model","\u{1F195} \u65B0\u4F1A\u8BDD":"\u{1F195} New session","\u{1F4CB} \u4F1A\u8BDD/\u5173\u6CE8":"\u{1F4CB} Sessions / watches","\u{1F5C2} \u5DE5\u4F5C\u533A\u5217\u8868":"\u{1F5C2} Workspace list","**\u4EFB\u52A1\u63A7\u5236**":"**Task controls**","\u23F9 \u505C\u6B62":"\u23F9 Stop","\u{1F4D0} \u538B\u7F29":"\u{1F4D0} Compact","**\u8865\u5145\u6307\u4EE4**":"**Steer task**",\u9009\u62E9\u8865\u5145\u6307\u4EE4:"Choose an instruction",\u7EE7\u7EED:"Continue",\u52A0\u901F\u8FD0\u884C:"Move faster",\u603B\u7ED3\u5F53\u524D\u8FDB\u5C55:"Summarize current progress",\u66F4\u7B80\u6D01\u4E9B:"Be more concise",\u66F4\u8BE6\u7EC6\u4E9B:"Be more detailed","\u270F\uFE0F \u66F4\u591A / \u81EA\u5B9A\u4E49\u2026":"\u270F\uFE0F More / custom\u2026","\u{1F5C4} \u5F52\u6863\uFF1A{state}":"\u{1F5C4} Archived: {state}",\u5DF2\u663E\u793A:"shown",\u5DF2\u9690\u85CF:"hidden",\u5207\u6362\u5F52\u6863\u663E\u793A:"Toggle archived sessions","\u{1F4CA} \u72B6\u6001":"\u{1F4CA} Status","\u{1F4D6} \u5E2E\u52A9":"\u{1F4D6} Help","**\u6570\u5B57\u515C\u5E95**\n**1**\u5DE5\u4F5C\u533A\u5217\u8868 \xB7 **2**\u65B0\u4F1A\u8BDD \xB7 **3**\u4F1A\u8BDD\u5217\u8868 \xB7 **4**\u72B6\u6001\n**5**\u{1F527}\u8865\u5168\u6743\u9650 \xB7 **6**\u5E2E\u52A9":`**Number fallback** **1** Workspace list \xB7 **2** New session \xB7 **3** Session list \xB7 **4** Status -**5** \u{1F527} Complete permissions \xB7 **6** Help`,"\u8DDF\u968F Host \u9ED8\u8BA4{default}":"Follow Host default{default}","**\u5F53\u524D**\uFF1A{value}":"**Current**: {value}","**Host \u9ED8\u8BA4**\uFF1A{value}":"**Host default**: {value}",\u672A\u8BBE\u7F6E:"Not set",\u9009\u62E9\u9884\u8BBE:"Select a preset","\u{1F504} \u8DDF\u968F\u9ED8\u8BA4":"\u{1F504} Follow default","\u5F53\u524D\u6CA1\u6709\u53EF\u9009\u62E9\u7684\u9884\u8BBE\u3002":"There are no presets to choose from.","\u{1F916} \u9884\u8BBE\u5217\u8868":"\u{1F916} Preset list","**\u5F53\u524D\u6A21\u578B**\uFF1A{model}":"**Current model**: {model}",\u9009\u62E9\u6A21\u578B:"Select a model","\u{1F9E0} \u6A21\u578B\u5217\u8868":"\u{1F9E0} Model list","{icon} \u98DE\u4E66\u673A\u5668\u4EBA{state}":"{icon} Feishu bot {state}",\u5DF2\u8FDE\u63A5:"connected",\u672A\u8FDE\u63A5:"disconnected","\u{1F4C2} \u5DE5\u4F5C\u533A\uFF1A`{workspace}`":"\u{1F4C2} Workspace: `{workspace}`","\u{1F916} \u9884\u8BBE\uFF1A{preset}":"\u{1F916} Preset: {preset}","\u{1F9E0} \u6A21\u578B\uFF1A{model}":"\u{1F9E0} Model: {model}","\u{1F4AC} \u4F1A\u8BDD\uFF1A{count} \u4E2A":"\u{1F4AC} Sessions: {count}","\u{1F4CA} \u7CFB\u7EDF\u72B6\u6001":"\u{1F4CA} System status","\u{1F4CB} \u4F1A\u8BDD / \u5DE5\u4F5C\u533A":"\u{1F4CB} Sessions / workspace","/sessionlist \u5217\u51FA\u5DE5\u4F5C\u533A\u4F1A\u8BDD":"/sessionlist List workspace sessions","/session ID \u7ED1\u5B9A\u5DF2\u6709\u4F1A\u8BDD":"/session ID Bind an existing session","/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A":"/workspacelist List workspaces","/workspace \u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A":"/workspace PATH Switch workspace","/new \u5F00\u542F\u5168\u65B0\u4F1A\u8BDD":"/new Start a new session","\u{1F4CA} \u72B6\u6001 / \u538B\u7F29":"\u{1F4CA} Status / compact","/status \u8FDE\u63A5\u72B6\u6001":"/status Connection status","`/version` \u2014 \u67E5\u770B\u63D2\u4EF6\u7248\u672C":"`/version` \u2014 show the plugin version","/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u4E0A\u4E0B\u6587":"/compact Compact the current session context","/archived on/off \u4F1A\u8BDD\u5217\u8868\u663E\u793A/\u9690\u85CF\u5F52\u6863":"/archived on/off Show/hide archived sessions","\u{1F441} \u5173\u6CE8":"\u{1F441} Watches","/watch ID \u5173\u6CE8\u4F1A\u8BDD\uFF08\u5B8C\u6210\u540E\u63A8\u9001\uFF09":"/watch ID Watch a session (push on completion)","/watchlist \u5173\u6CE8\u5217\u8868":"/watchlist List watched sessions","/unwatch ID \u53D6\u6D88\u5173\u6CE8":"/unwatch ID Stop watching a session","\u{1F4E6} \u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF09":"\u{1F4E6} Batch input (direct messages only)","\u{1F916} \u9884\u8BBE / \u6A21\u578B":"\u{1F916} Presets / models","/models \u5217\u51FA\u6A21\u578B":"/models List models","\u{1F3AE} \u4EFB\u52A1\u63A7\u5236":"\u{1F3AE} Task controls","/steer \u6307\u4EE4 \u7ED9 Agent \u8865\u5145\u6307\u4EE4":"/steer INSTRUCTION Steer the Agent","**\u{1F4CB} \u5361\u7247\u529F\u80FD**\n\n1. \u4F1A\u8BDD\u4E0B\u62C9 \u2014 \u5207\u6362\u5F53\u524D\u7ED1\u5B9A\u4F1A\u8BDD\n2. \u5DE5\u4F5C\u533A\u4E0B\u62C9 \u2014 \u5207\u6362\u5DE5\u4F5C\u533A\n3. \u{1F916} \u9884\u8BBE\u4E0B\u62C9 \u2014 \u5207\u6362 Agent \u9884\u8BBE\n4. \u{1F9E0} \u6A21\u578B\u4E0B\u62C9 \u2014 \u5207\u6362\u6A21\u578B\n5. \u{1F195} \u65B0\u4F1A\u8BDD \u2014 \u5F00\u542F\u5168\u65B0\u4F1A\u8BDD\n6. \u{1F4CB} \u4F1A\u8BDD/\u5173\u6CE8 \u2014 \u67E5\u770B/\u7ED1\u5B9A\u4F1A\u8BDD\uFF0C\u7BA1\u7406\u5173\u6CE8\n7. \u23F9 \u505C\u6B62 \u2014 \u505C\u6B62\u5F53\u524D\u4EFB\u52A1\n8. \u{1F4D0} \u538B\u7F29 \u2014 \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u4E0A\u4E0B\u6587\n9. \u8865\u5145\u6307\u4EE4 \u2014 \u7ED9 Agent \u53D1\u9001\u6307\u4EE4\n10. \u{1F5C4} \u5F52\u6863\u5207\u6362 \u2014 \u663E\u793A/\u9690\u85CF\u5F52\u6863\u4F1A\u8BDD\n11. \u{1F4CA} \u72B6\u6001 \u2014 \u67E5\u770B\u7CFB\u7EDF\u8FDE\u63A5\u72B6\u6001\n12. \u{1F4D6} \u5E2E\u52A9 \u2014 \u67E5\u770B\u672C\u5E2E\u52A9":`**\u{1F4CB} Card features** +**5** \u{1F527} Complete permissions \xB7 **6** Help`,"\u8DDF\u968F Host \u9ED8\u8BA4{default}":"Follow Host default{default}","**\u5F53\u524D**\uFF1A{value}":"**Current**: {value}","**Host \u9ED8\u8BA4**\uFF1A{value}":"**Host default**: {value}",\u672A\u8BBE\u7F6E:"Not set",\u9009\u62E9\u9884\u8BBE:"Select a preset","\u{1F504} \u8DDF\u968F\u9ED8\u8BA4":"\u{1F504} Follow default","\u5F53\u524D\u6CA1\u6709\u53EF\u9009\u62E9\u7684\u9884\u8BBE\u3002":"There are no presets to choose from.","\u{1F916} \u9884\u8BBE\u5217\u8868":"\u{1F916} Preset list","**\u5F53\u524D\u6A21\u578B**\uFF1A{model}":"**Current model**: {model}",\u9009\u62E9\u6A21\u578B:"Select a model","\u{1F9E0} \u6A21\u578B\u5217\u8868":"\u{1F9E0} Model list","{icon} \u98DE\u4E66\u673A\u5668\u4EBA{state}":"{icon} Feishu bot {state}",\u5DF2\u8FDE\u63A5:"connected",\u672A\u8FDE\u63A5:"disconnected","\u{1F4C2} \u5DE5\u4F5C\u533A\uFF1A`{workspace}`":"\u{1F4C2} Workspace: `{workspace}`","\u{1F916} \u9884\u8BBE\uFF1A{preset}":"\u{1F916} Preset: {preset}","\u{1F9E0} \u6A21\u578B\uFF1A{model}":"\u{1F9E0} Model: {model}","\u{1F4AC} \u4F1A\u8BDD\uFF1A{count} \u4E2A":"\u{1F4AC} Sessions: {count}","\u{1F4CA} \u7CFB\u7EDF\u72B6\u6001":"\u{1F4CA} System status","\u{1F4CB} \u4F1A\u8BDD / \u5DE5\u4F5C\u533A":"\u{1F4CB} Sessions / workspace","/sessionlist \u5217\u51FA\u5DE5\u4F5C\u533A\u4F1A\u8BDD":"/sessionlist List workspace sessions","/sessionlist \u6216 /sessions \u5217\u51FA\u5DE5\u4F5C\u533A\u4F1A\u8BDD":"/sessionlist or /sessions List workspace sessions","/session ID \u7ED1\u5B9A\u5DF2\u6709\u4F1A\u8BDD":"/session ID Bind an existing session","/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A":"/workspacelist List workspaces","/workspace \u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A":"/workspace PATH Switch workspace","/new \u5F00\u542F\u5168\u65B0\u4F1A\u8BDD":"/new Start a new session","\u{1F4CA} \u72B6\u6001 / \u538B\u7F29":"\u{1F4CA} Status / compact","/status \u8FDE\u63A5\u72B6\u6001":"/status Connection status","`/version` \u2014 \u67E5\u770B\u63D2\u4EF6\u7248\u672C":"`/version` \u2014 show the plugin version","/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u4E0A\u4E0B\u6587":"/compact Compact the current session context","/archived on/off \u4F1A\u8BDD\u5217\u8868\u663E\u793A/\u9690\u85CF\u5F52\u6863":"/archived on/off Show/hide archived sessions","\u{1F441} \u5173\u6CE8":"\u{1F441} Watches","/watch ID \u5173\u6CE8\u4F1A\u8BDD\uFF08\u5B8C\u6210\u540E\u63A8\u9001\uFF09":"/watch ID Watch a session (push on completion)","/watchlist \u5173\u6CE8\u5217\u8868":"/watchlist List watched sessions","/unwatch ID \u53D6\u6D88\u5173\u6CE8":"/unwatch ID Stop watching a session","\u{1F4E6} \u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF09":"\u{1F4E6} Batch input (direct messages only)","\u{1F916} \u9884\u8BBE / \u6A21\u578B":"\u{1F916} Presets / models","/models \u5217\u51FA\u6A21\u578B":"/models List models","/presetlist \u6216 /presets \u5217\u51FA\u53EF\u7528 Agent Preset":"/presetlist or /presets List available Agent Presets","\u{1F3AE} \u4EFB\u52A1\u63A7\u5236":"\u{1F3AE} Task controls","/steer \u6307\u4EE4 \u7ED9 Agent \u8865\u5145\u6307\u4EE4":"/steer INSTRUCTION Steer the Agent","**\u{1F4CB} \u5361\u7247\u529F\u80FD**\n\n1. \u4F1A\u8BDD\u4E0B\u62C9 \u2014 \u5207\u6362\u5F53\u524D\u7ED1\u5B9A\u4F1A\u8BDD\n2. \u5DE5\u4F5C\u533A\u4E0B\u62C9 \u2014 \u5207\u6362\u5DE5\u4F5C\u533A\n3. \u{1F916} \u9884\u8BBE\u4E0B\u62C9 \u2014 \u5207\u6362 Agent \u9884\u8BBE\n4. \u{1F9E0} \u6A21\u578B\u4E0B\u62C9 \u2014 \u5207\u6362\u6A21\u578B\n5. \u{1F195} \u65B0\u4F1A\u8BDD \u2014 \u5F00\u542F\u5168\u65B0\u4F1A\u8BDD\n6. \u{1F4CB} \u4F1A\u8BDD/\u5173\u6CE8 \u2014 \u67E5\u770B/\u7ED1\u5B9A\u4F1A\u8BDD\uFF0C\u7BA1\u7406\u5173\u6CE8\n7. \u23F9 \u505C\u6B62 \u2014 \u505C\u6B62\u5F53\u524D\u4EFB\u52A1\n8. \u{1F4D0} \u538B\u7F29 \u2014 \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u4E0A\u4E0B\u6587\n9. \u8865\u5145\u6307\u4EE4 \u2014 \u7ED9 Agent \u53D1\u9001\u6307\u4EE4\n10. \u{1F5C4} \u5F52\u6863\u5207\u6362 \u2014 \u663E\u793A/\u9690\u85CF\u5F52\u6863\u4F1A\u8BDD\n11. \u{1F4CA} \u72B6\u6001 \u2014 \u67E5\u770B\u7CFB\u7EDF\u8FDE\u63A5\u72B6\u6001\n12. \u{1F4D6} \u5E2E\u52A9 \u2014 \u67E5\u770B\u672C\u5E2E\u52A9":`**\u{1F4CB} Card features** 1. Session dropdown \u2014 switch the bound session 2. Workspace dropdown \u2014 switch workspace @@ -128,7 +128,7 @@ ID: {id}`,"\u7ED1\u5B9A\u5931\u8D25\uFF1A{message}":"Binding failed: {message}", 9. Steer task \u2014 send an instruction to the Agent 10. \u{1F5C4} Archived toggle \u2014 show or hide archived sessions 11. \u{1F4CA} Status \u2014 view connection status -12. \u{1F4D6} Help \u2014 view this help`,"**\u2328\uFE0F \u6587\u672C\u547D\u4EE4**\n\n`/m` \u2014 \u6253\u5F00\u83DC\u5355\u5361\u7247\n`/new` \u2014 \u5F00\u542F\u5168\u65B0\u4F1A\u8BDD\n`/session ID` \u2014 \u7ED1\u5B9A\u5DF2\u6709\u4F1A\u8BDD\n`/sessionlist [\u5DE5\u4F5C\u533A]` \u2014 \u5217\u51FA\u4F1A\u8BDD\n`/workspace \u8DEF\u5F84` \u2014 \u5207\u6362\u5DE5\u4F5C\u533A\n`/workspacelist` \u2014 \u5217\u51FA\u5DE5\u4F5C\u533A\n`/status` \u2014 \u67E5\u770B\u8FDE\u63A5\u72B6\u6001\n`/compact` \u2014 \u538B\u7F29\u4E0A\u4E0B\u6587\n`/stop` \u2014 \u505C\u6B62\u5F53\u524D\u4EFB\u52A1\n`/steer \u6307\u4EE4` \u2014 \u8865\u5145\u6307\u4EE4\n`/watch ID` \u2014 \u5173\u6CE8\u4F1A\u8BDD\n`/watchlist` \u2014 \u5173\u6CE8\u5217\u8868\n`/unwatch ID` \u2014 \u53D6\u6D88\u5173\u6CE8\n`/archived on/off` \u2014 \u5F52\u6863\u663E\u9690\n`/presetlist` \u2014 \u5217\u51FA\u9884\u8BBE\n`/preset [\u5E8F\u53F7/ID]` \u2014 \u5207\u6362\u9884\u8BBE\n`/preset --default` \u2014 \u8DDF\u968F\u9ED8\u8BA4\n`/models` \u2014 \u5217\u51FA\u6A21\u578B\n`/reasoninglist` \u6216 `/reasonings` \u2014 \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7\n`/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default]` \u2014 \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7\n`/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID]` \u2014 \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B\n`/batch` \u2014 \u5F00\u542F\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09\n`/send` \u2014 \u63D0\u4EA4\u5F53\u524D\u6279\u6B21\n`/cancel` \u2014 \u53D6\u6D88\u5F53\u524D\u6279\u6B21\n`/repair` \u2014 \u8865\u5168\u98DE\u4E66\u6743\u9650\u4E0E\u5361\u7247\u56DE\u8C03":"**\u2328\uFE0F Text commands**\n\n`/m` \u2014 open the menu card\n`/new` \u2014 start a new session\n`/session ID` \u2014 bind an existing session\n`/sessionlist [workspace]` \u2014 list sessions\n`/workspace PATH` \u2014 switch workspace\n`/workspacelist` \u2014 list workspaces\n`/status` \u2014 view connection status\n`/compact` \u2014 compact context\n`/stop` \u2014 stop the current task\n`/steer INSTRUCTION` \u2014 steer the task\n`/watch ID` \u2014 watch a session\n`/watchlist` \u2014 list watched sessions\n`/unwatch ID` \u2014 stop watching\n`/archived on/off` \u2014 show or hide archived sessions\n`/presetlist` \u2014 list presets\n`/preset [index/ID]` \u2014 switch preset\n`/preset --default` \u2014 follow default\n`/models` \u2014 list models\n`/reasoninglist` or `/reasonings` \u2014 list reasoning efforts for the current model\n`/reasoning [index, effort ID, or --default]` \u2014 show or switch reasoning effort\n`/model [index or full model ID] [reasoning effort ID]` \u2014 show or switch the current Session model\n`/batch` \u2014 start batch input (direct messages only, up to 10 text messages)\n`/send` \u2014 submit the current batch\n`/cancel` \u2014 cancel the current batch\n`/repair` \u2014 complete Feishu permissions and the card callback","**\u{1F4A1} \u6570\u5B57\u515C\u5E95**\n\u56DE\u590D\u6570\u5B57\u5FEB\u901F\u64CD\u4F5C\uFF1A\n**1**\u5DE5\u4F5C\u533A\u5217\u8868 \xB7 **2**\u65B0\u4F1A\u8BDD \xB7 **3**\u4F1A\u8BDD/\u5173\u6CE8\n**4**\u72B6\u6001 \xB7 **5**\u8865\u5168\u6743\u9650 \xB7 **6**\u5E2E\u52A9":`**\u{1F4A1} Number fallback** +12. \u{1F4D6} Help \u2014 view this help`,"**\u2328\uFE0F \u6587\u672C\u547D\u4EE4**\n\n`/m` \u2014 \u6253\u5F00\u83DC\u5355\u5361\u7247\n`/new` \u2014 \u5F00\u542F\u5168\u65B0\u4F1A\u8BDD\n`/session ID` \u2014 \u7ED1\u5B9A\u5DF2\u6709\u4F1A\u8BDD\n`/sessionlist [\u5DE5\u4F5C\u533A]` \u6216 `/sessions [\u5DE5\u4F5C\u533A]` \u2014 \u5217\u51FA\u4F1A\u8BDD\n`/workspace \u8DEF\u5F84` \u2014 \u5207\u6362\u5DE5\u4F5C\u533A\n`/workspacelist` \u2014 \u5217\u51FA\u5DE5\u4F5C\u533A\n`/status` \u2014 \u67E5\u770B\u8FDE\u63A5\u72B6\u6001\n`/compact` \u2014 \u538B\u7F29\u4E0A\u4E0B\u6587\n`/stop` \u2014 \u505C\u6B62\u5F53\u524D\u4EFB\u52A1\n`/steer \u6307\u4EE4` \u2014 \u8865\u5145\u6307\u4EE4\n`/watch ID` \u2014 \u5173\u6CE8\u4F1A\u8BDD\n`/watchlist` \u2014 \u5173\u6CE8\u5217\u8868\n`/unwatch ID` \u2014 \u53D6\u6D88\u5173\u6CE8\n`/archived on/off` \u2014 \u5F52\u6863\u663E\u9690\n`/presetlist` \u6216 `/presets` \u2014 \u5217\u51FA\u9884\u8BBE\n`/preset [\u5E8F\u53F7/ID]` \u2014 \u5207\u6362\u9884\u8BBE\n`/preset --default` \u2014 \u8DDF\u968F\u9ED8\u8BA4\n`/models` \u2014 \u5217\u51FA\u6A21\u578B\n`/reasoninglist` \u6216 `/reasonings` \u2014 \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7\n`/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default]` \u2014 \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7\n`/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID]` \u2014 \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B\n`/batch` \u2014 \u5F00\u542F\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09\n`/send` \u2014 \u63D0\u4EA4\u5F53\u524D\u6279\u6B21\n`/cancel` \u2014 \u53D6\u6D88\u5F53\u524D\u6279\u6B21\n`/repair` \u2014 \u8865\u5168\u98DE\u4E66\u6743\u9650\u4E0E\u5361\u7247\u56DE\u8C03":"**\u2328\uFE0F Text commands**\n\n`/m` \u2014 open the menu card\n`/new` \u2014 start a new session\n`/session ID` \u2014 bind an existing session\n`/sessionlist [workspace]` or `/sessions [workspace]` \u2014 list sessions\n`/workspace PATH` \u2014 switch workspace\n`/workspacelist` \u2014 list workspaces\n`/status` \u2014 view connection status\n`/compact` \u2014 compact context\n`/stop` \u2014 stop the current task\n`/steer INSTRUCTION` \u2014 steer the task\n`/watch ID` \u2014 watch a session\n`/watchlist` \u2014 list watched sessions\n`/unwatch ID` \u2014 stop watching\n`/archived on/off` \u2014 show or hide archived sessions\n`/presetlist` or `/presets` \u2014 list presets\n`/preset [index/ID]` \u2014 switch preset\n`/preset --default` \u2014 follow default\n`/models` \u2014 list models\n`/reasoninglist` or `/reasonings` \u2014 list reasoning efforts for the current model\n`/reasoning [index, effort ID, or --default]` \u2014 show or switch reasoning effort\n`/model [index or full model ID] [reasoning effort ID]` \u2014 show or switch the current Session model\n`/batch` \u2014 start batch input (direct messages only, up to 10 text messages)\n`/send` \u2014 submit the current batch\n`/cancel` \u2014 cancel the current batch\n`/repair` \u2014 complete Feishu permissions and the card callback","**\u{1F4A1} \u6570\u5B57\u515C\u5E95**\n\u56DE\u590D\u6570\u5B57\u5FEB\u901F\u64CD\u4F5C\uFF1A\n**1**\u5DE5\u4F5C\u533A\u5217\u8868 \xB7 **2**\u65B0\u4F1A\u8BDD \xB7 **3**\u4F1A\u8BDD/\u5173\u6CE8\n**4**\u72B6\u6001 \xB7 **5**\u8865\u5168\u6743\u9650 \xB7 **6**\u5E2E\u52A9":`**\u{1F4A1} Number fallback** Reply with a number for a quick action: **1** Workspace list \xB7 **2** New session \xB7 **3** Sessions/watches **4** Status \xB7 **5** Complete permissions \xB7 **6** Help`,"\u4ECE\u4E0B\u65B9\u4E0B\u62C9\u9009\u62E9\u8865\u5145\u6307\u4EE4\uFF1B\u6700\u540E\u4E00\u9879\u53EF\u81EA\u5B9A\u4E49\u8F93\u5165\u3002":"Choose an instruction below; the last option lets you enter a custom one.","\u5F53\u524D\u6CA1\u6709\u7ED1\u5B9A\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u7ED1\u5B9A\u4F1A\u8BDD\u518D\u8865\u5145\u6307\u4EE4\u3002":"No session is bound. Bind one before steering the task.","\u2795 \u8865\u5145\u6307\u4EE4":"\u2795 Steer task","\u8F93\u5165\u8865\u5145\u6307\u4EE4\u540E\u70B9\u300C\u63D0\u4EA4\u300D\uFF0C\u53D1\u9001\u7ED9\u5F53\u524D\u8FD0\u884C\u7684\u4EFB\u52A1\u3002":"Enter an instruction and press Submit to send it to the running task.",\u8F93\u5165\u4F60\u7684\u8865\u5145\u6307\u4EE4:"Enter your instruction",\u63D0\u4EA4:"Submit","\u2795 \u81EA\u5B9A\u4E49\u6307\u4EE4":"\u2795 Custom instruction","\u{1F916} \u52A9\u624B\u83DC\u5355":"\u{1F916} Assistant menu","**\u70B9\u51FB\u6309\u94AE\u6216\u76F4\u63A5\u56DE\u590D\u6570\u5B57**":"**Tap a button or reply with a number**","1 \xB7 \u4F1A\u8BDD\u5217\u8868":"1 \xB7 Sessions","2 \xB7 \u5DE5\u4F5C\u533A":"2 \xB7 Workspace","3 \xB7 \u65B0\u4F1A\u8BDD":"3 \xB7 New session","4 \xB7 \u72B6\u6001":"4 \xB7 Status","5 \xB7 \u5E2E\u52A9":"5 \xB7 Help","**6 \xB7 \u8865\u5168\u6743\u9650**\uFF08\u8BF7\u76F4\u63A5\u56DE\u590D\u6570\u5B57 **6**\uFF09":"**6 \xB7 Complete permissions** (reply with the number **6**)","7 \xB7 \u5173\u6CE8\u5217\u8868":"7 \xB7 Watch list","\u{1F9EA} \u9A8C\u8BC1\u5361\u7247\u6309\u94AE":"\u{1F9EA} Verify card buttons","\u6388\u6743\u5DF2\u63D0\u4EA4\u3002\u8BF7\u70B9\u51FB\u4E0B\u65B9\u6309\u94AE\uFF1B\u673A\u5668\u4EBA\u771F\u5B9E\u6536\u5230\u56DE\u8C03\u540E\u624D\u4F1A\u5224\u5B9A\u4FEE\u590D\u6210\u529F\u3002":"Authorization submitted. Tap the button below; the repair is confirmed only after the bot receives the real callback.",\u5B8C\u6210\u9A8C\u8BC1:"Finish verification","**\u5DE5\u4F5C\u533A**\uFF1A{workspace}\n\u5171 **{total}** \u4E2A\u4F1A\u8BDD{paging}":`**Workspace**: {workspace} @@ -145,7 +145,7 @@ ${n}`:n)}function gM(n,t,o){return{cardParamMap:{flowStatus:t,msgContent:cE(n,o) `:/^\s{0,3}(?:[-*+] |\d+[.)] |#{1,6} |\||> )/.test(o[a+1])?`${e} `:`${e}
`}).join("")}function cM(n,t){if(!n||typeof n!="object"||n.errcode!==0)throw new gt("registration-rejected",`\u9489\u9489\u626B\u7801${t}\u5931\u8D25\u3002`);return n}function IM(n,t){let o=Number(n);return Number.isFinite(o)&&o>0?o:t}function OK({fetchImpl:n=fetch,registrationBaseUrl:t=process.env.DINGTALK_REGISTRATION_BASE_URL||QK,registrationSource:o=process.env.DINGTALK_REGISTRATION_SOURCE||cIe,now:i=()=>Date.now(),cardMinIntervalMs:e=50,cardBackoffMs:a=1e3,delay:A=fIe}={}){if(typeof n!="function")throw new TypeError("fetchImpl must be a function");if(typeof i!="function")throw new TypeError("now must be a function");if(!Number.isFinite(e)||e<0)throw new TypeError("cardMinIntervalMs must be a non-negative number");if(!Number.isFinite(a)||a<0)throw new TypeError("cardBackoffMs must be a non-negative number");if(typeof A!="function")throw new TypeError("delay must be a function");let r=lM(t,{label:"\u9489\u9489\u6CE8\u518C\u670D\u52A1",requireSubdomain:!1}),s=new URL(gIe),g=WA(o);if(!g)throw new TypeError("registrationSource is required");let c=new Map,I=new Map,d=new Map,B=Promise.resolve(),f=0,Q=(U,z)=>new URL(z.replace(/^\//,""),U);async function y({clientId:U,clientSecret:z,signal:q,requestKind:x="normal"}){let G=WA(U),J=WA(z);if(!G||!J)throw new TypeError("clientId and clientSecret are required");let H=c.get(G);if(H&&H.expiresAt>i())return H.token;let N=x==="reaction"?d:I;if(N.has(G))return N.get(G);let V=(async()=>{let te=await Ln(n,Q(s,"v1.0/oauth2/accessToken"),{body:{appKey:G,appSecret:J},signal:q,action:"\u9274\u6743"}),ie=WA(te?.accessToken);if(!ie)throw new gt("invalid-access-token","\u9489\u9489\u670D\u52A1\u6CA1\u6709\u8FD4\u56DE\u8BBF\u95EE\u4EE4\u724C\u3002");let we=IM(te?.expireIn??te?.expiresIn,7200),se=Math.max(1e3,(we-60)*1e3);return c.set(G,{token:ie,expiresAt:i()+se}),ie})().finally(()=>N.delete(G));return N.set(G,V),V}async function m({clientId:U,clientSecret:z,robotCode:q,messageId:x,conversationId:G,reactionName:J=II,signal:H},N){let k=WA(U),V=WA(z),te=WA(q)??k,ie=WA(x),we=WA(G),se=WA(J);if(!k||!V)throw new TypeError("clientId and clientSecret are required");if(!te)throw new TypeError("robotCode is required");if(!ie||!we)throw new TypeError("messageId and conversationId are required");if(!se)throw new TypeError("reactionName is required");let Ne=await y({clientId:k,clientSecret:V,signal:H,requestKind:"reaction"}),fe=await Ln(n,Q(s,`v1.0/robot/emotion/${N}`),{body:{robotCode:te,openMsgId:ie,openConversationId:we,emotionType:2,emotionName:se,textEmotion:{emotionId:dIe,emotionName:se,text:se,backgroundId:hIe}},headers:{"x-acs-dingtalk-access-token":Ne},signal:H,timeoutMs:pIe,action:N==="reply"?"\u6D88\u606F\u72B6\u6001\u6DFB\u52A0":"\u6D88\u606F\u72B6\u6001\u64A4\u56DE"}),Se=fe?.success===!1?IE(fe?.code??fe?.errcode)??"rejected":sM(fe);if(Se)throw new gt("reaction-rejected","\u9489\u9489\u670D\u52A1\u62D2\u7EDD\u4E86\u6D88\u606F\u72B6\u6001\u8BF7\u6C42\u3002",{providerCode:Se});return!0}async function _({clientId:U,clientSecret:z,robotCode:q,downloadCode:x,signal:G,kind:J}){let H=WA(q),N=WA(x);if(!H||!N)throw new TypeError("robotCode and downloadCode are required");let k=await y({clientId:U,clientSecret:z,signal:G}),V;try{V=await Ln(n,Q(s,"v1.0/robot/messageFiles/download"),{body:{downloadCode:N,robotCode:H},headers:{"x-acs-dingtalk-access-token":k},signal:G,action:`${J==="image"?"\u56FE\u7247":"\u6587\u4EF6"}\u4E0B\u8F7D\u5730\u5740`})}catch(ie){throw G?.aborted?ie:new gt(`${J}-download-address-failed`,`\u9489\u9489${J==="image"?"\u56FE\u7247":"\u6587\u4EF6"}\u4E0B\u8F7D\u5730\u5740\u83B7\u53D6\u5931\u8D25\u3002`,{cause:ie,status:ie?.status,providerCode:ie?.providerCode})}let te=WA(V?.downloadUrl??V?.download_url);if(!te)throw new gt(`invalid-${J}-download`,`\u9489\u9489\u670D\u52A1\u6CA1\u6709\u8FD4\u56DE${J==="image"?"\u56FE\u7247":"\u6587\u4EF6"}\u4E0B\u8F7D\u5730\u5740\u3002`);return BIe(te)}function T(U){let z=async()=>{let x=Math.max(0,f-i());x>0&&await A(x,U),f=Math.max(f,i())+e},q=B.then(z,z);return B=q.catch(()=>{}),q}async function R(U,z){await T(z.signal);try{return await Ln(n,Q(s,U),z)}catch(q){if(!(q instanceof gt)||q.status!==403)throw q;return await A(a,z.signal),await T(z.signal),Ln(n,Q(s,U),z)}}async function F({clientId:U,clientSecret:z,cardInstanceId:q,text:x,target:G,signal:J}){let H=WA(q),N=WA(x);if(!H)throw new TypeError("cardInstanceId is required");if(!N)throw new TypeError("text is required");let V={"x-acs-dingtalk-access-token":await y({clientId:U,clientSecret:z,signal:J})},te=[R("v1.0/card/streaming",{method:"PUT",body:{outTrackId:H,guid:sE(),key:"msgContent",content:cE(N,G),isFull:!0,isFinalize:!1,isError:!0},headers:V,signal:J,action:"AI Card \u5931\u8D25\u6536\u53E3"}),R("v1.0/card/instances",{method:"PUT",body:{outTrackId:H,cardData:gM(N,"5",G),cardUpdateOptions:{updateCardDataByKey:!0}},headers:V,signal:J,action:"AI Card \u5931\u8D25\u72B6\u6001"})],ie=await Promise.allSettled(te);if(ie.every(({status:we})=>we==="rejected"))throw ie[0].reason;return!0}async function j({clientId:U,clientSecret:z,target:q,file:x,signal:G},{uploadType:J,messageKey:H,createMessageParams:N}){if(!x||typeof x!="object"||typeof x.fileName!="string"||!x.fileName||!Buffer.isBuffer(x.bytes))throw new TypeError("A DingTalk file is required");let k=yIe(q),V;try{V=await y({clientId:U,clientSecret:z,signal:G})}catch(ve){if(G?.aborted)throw Un(G);let aA=Number(ve?.status),Ce=ve?.code==="http-error"&&aA>=400&&aA<500?"artifact-provider-rejected":"artifact-provider-failed";throw gE(ve,{fallback:Ce})}let te=new URL("media/upload",QK);te.searchParams.set("access_token",V),te.searchParams.set("type",J);let ie=new FormData;ie.append("media",new Blob([x.bytes],{type:x.mediaType??"application/octet-stream"}),x.fileName);let we;try{we=await QIe(n,te,{body:ie,signal:G})}catch(ve){if(G?.aborted)throw Un(G);let aA=Number(ve?.status),Ce=ve?.code==="http-error"&&aA>=400&&aA<500?"artifact-provider-rejected":"artifact-provider-failed";throw gE(ve,{fallback:Ce})}let se=sM(we),Ne=WA(we?.media_id);if(se||!Ne)throw gE(new gt("upload-rejected","\u9489\u9489\u670D\u52A1\u62D2\u7EDD\u4E86\u6587\u4EF6\u4E0A\u4F20\u3002",{providerCode:se??"missing-media-id"}));G?.throwIfAborted();let fe={robotCode:k.robotCode,msgKey:H,msgParam:JSON.stringify(N(Ne,x)),...k.type==="group"?{openConversationId:k.openConversationId}:{userIds:[k.userId]}},Se=k.type==="group"?"v1.0/robot/groupMessages/send":"v1.0/robot/oToMessages/batchSend",Ke;try{Ke=await Ln(n,Q(s,Se),{body:fe,headers:{"x-acs-dingtalk-access-token":V},signal:G,action:"\u6587\u4EF6\u6D88\u606F\u53D1\u9001"})}catch(ve){throw uIe(ve,G)}let rA=sM(Ke);if(rA)throw gE(new gt("send-rejected","\u9489\u9489\u670D\u52A1\u62D2\u7EDD\u4E86\u6587\u4EF6\u6D88\u606F\u3002",{providerCode:rA}));return Ke}return Object.freeze({async beginRegistration({signal:U}={}){let z=cM(await Ln(n,Q(r,"app/registration/init"),{body:{source:g},signal:U,action:"\u521D\u59CB\u5316"}),"\u521D\u59CB\u5316"),q=WA(z.nonce);if(!q)throw new gt("invalid-registration","\u9489\u9489\u626B\u7801\u521D\u59CB\u5316\u7F3A\u5C11 nonce\u3002");let x=cM(await Ln(n,Q(r,"app/registration/begin"),{body:{nonce:q},signal:U,action:"\u521B\u5EFA"}),"\u521B\u5EFA"),G=WA(x.device_code),J=WA(x.verification_uri_complete);if(!G||!J)throw new gt("invalid-registration","\u9489\u9489\u626B\u7801\u670D\u52A1\u8FD4\u56DE\u7684\u4FE1\u606F\u4E0D\u5B8C\u6574\u3002");let H=lM(J,{label:"\u9489\u9489\u626B\u7801",requireSubdomain:!1}).toString();return{deviceCode:G,userCode:WA(x.user_code)??void 0,verificationUri:WA(x.verification_uri)??void 0,verificationUriComplete:H,expiresInSeconds:IM(x.expires_in,7200),intervalSeconds:IM(x.interval,5)}},async pollRegistration({deviceCode:U,signal:z}={}){let q=WA(U);if(!q)throw new TypeError("deviceCode is required");let x=cM(await Ln(n,Q(r,"app/registration/poll"),{body:{device_code:q},signal:z,action:"\u72B6\u6001\u67E5\u8BE2"}),"\u72B6\u6001\u67E5\u8BE2"),G=WA(x.status)?.toUpperCase();if(!G||!EIe.has(G))throw new gt("invalid-registration-status","\u9489\u9489\u626B\u7801\u670D\u52A1\u8FD4\u56DE\u4E86\u65E0\u6CD5\u8BC6\u522B\u7684\u72B6\u6001\u3002");let J={status:G,failReason:WA(x.fail_reason)??void 0};if(G==="SUCCESS"&&(J.clientId=WA(x.client_id)??void 0,J.clientSecret=WA(x.client_secret)??void 0,!J.clientId||!J.clientSecret))throw new gt("missing-credentials","\u9489\u9489\u626B\u7801\u5DF2\u786E\u8BA4\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u673A\u5668\u4EBA\u51ED\u636E\u3002");return J},accessToken:y,async addReaction(U){return m(U,"reply")},async recallReaction(U){return m(U,"recall")},async addThinkingReaction(U){return m({...U,reactionName:II},"reply")},async recallThinkingReaction(U){return m({...U,reactionName:II},"recall")},async downloadImage({clientId:U,clientSecret:z,robotCode:q,downloadCode:x,signal:G,maxBytes:J}){let H=await _({clientId:U,clientSecret:z,robotCode:q,downloadCode:x,signal:G,kind:"image"});try{return await ho(H,{fetchImpl:n,signal:G,maxBytes:J})}catch(N){throw G?.aborted||N instanceof ut?N:new gt("image-content-download-failed","\u9489\u9489\u56FE\u7247\u5185\u5BB9\u4E0B\u8F7D\u5931\u8D25\u3002",{cause:N})}},async downloadFile({clientId:U,clientSecret:z,robotCode:q,downloadCode:x,signal:G}){let J=await _({clientId:U,clientSecret:z,robotCode:q,downloadCode:x,signal:G,kind:"file"});if(J.protocol!=="https:")throw new gt("invalid-file-download","\u9489\u9489\u670D\u52A1\u8FD4\u56DE\u4E86\u65E0\u6548\u7684\u6587\u4EF6\u4E0B\u8F7D\u5730\u5740\u3002");try{let H=await n(J,{method:"GET",redirect:"follow",signal:G});if(!H?.ok)throw await H?.body?.cancel?.().catch?.(()=>{}),new gt("file-content-download-failed",`\u9489\u9489\u6587\u4EF6\u5185\u5BB9\u4E0B\u8F7D\u5931\u8D25\uFF08HTTP ${H?.status??"unknown"}\uFF09\u3002`,{status:H?.status});return Buffer.from(await H.arrayBuffer())}catch(H){throw G?.aborted?Un(G):H instanceof gt?H:new gt("file-content-download-failed","\u9489\u9489\u6587\u4EF6\u5185\u5BB9\u4E0B\u8F7D\u5931\u8D25\u3002",{cause:H})}},async createAiCard({clientId:U,clientSecret:z,target:q,initialText:x,signal:G}){let J=WA(U),H=WA(z),N=WA(x);if(!J||!H)throw new TypeError("clientId and clientSecret are required");if(!N)throw new TypeError("initialText is required");let k=SIe(q),V=await y({clientId:J,clientSecret:H,signal:G}),te=`dsh_${sE()}`,ie={"x-acs-dingtalk-access-token":V},we=!1;try{await R("v1.0/card/instances",{body:{cardTemplateId:IIe,outTrackId:te,cardData:{cardParamMap:{config:JSON.stringify({autoLayout:!0})}},callbackType:"STREAM",cardAtUserIds:k.atUserIds?Object.keys(k.atUserIds):void 0,imGroupOpenSpaceModel:{supportForward:!0},imRobotOpenSpaceModel:{supportForward:!0}},headers:ie,signal:G,action:"AI Card \u521B\u5EFA"}),await R("v1.0/card/instances/deliver",{body:DIe(te,k,J),headers:ie,signal:G,action:"AI Card \u6295\u653E"}),we=!0,await R("v1.0/card/instances",{method:"PUT",body:{outTrackId:te,cardData:gM(N,"2",k)},headers:ie,signal:G,action:"AI Card \u542F\u52A8"}),await R("v1.0/card/streaming",{method:"PUT",body:{outTrackId:te,guid:sE(),key:"msgContent",content:cE(N,k).replace(/\n+$/,""),isFull:!0,isFinalize:!1,isError:!1},headers:ie,signal:G,action:"AI Card \u542F\u52A8"})}catch(se){if(we){let Ne=AbortSignal.timeout(5e3);await F({clientId:J,clientSecret:H,cardInstanceId:te,text:D("\u5361\u7247\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u67E5\u770B\u540E\u7EED\u6D88\u606F\u3002"),target:k,signal:Ne}).catch(()=>{})}throw se}return{cardInstanceId:te}},async updateAiCard({clientId:U,clientSecret:z,cardInstanceId:q,text:x,target:G,signal:J}){let H=WA(q),N=WA(x);if(!H)throw new TypeError("cardInstanceId is required");if(!N)throw new TypeError("text is required");let k=await y({clientId:U,clientSecret:z,signal:J});return await R("v1.0/card/streaming",{method:"PUT",body:{outTrackId:H,guid:sE(),key:"msgContent",content:cE(N,G).replace(/\n+$/,""),isFull:!0,isFinalize:!1,isError:!1},headers:{"x-acs-dingtalk-access-token":k},signal:J,action:"AI Card \u66F4\u65B0"}),!0},async finishAiCard({clientId:U,clientSecret:z,cardInstanceId:q,text:x,target:G,signal:J}){let H=WA(q),N=WA(x);if(!H)throw new TypeError("cardInstanceId is required");if(!N)throw new TypeError("text is required");let V={"x-acs-dingtalk-access-token":await y({clientId:U,clientSecret:z,signal:J})},te=cE(N,G);await R("v1.0/card/streaming",{method:"PUT",body:{outTrackId:H,guid:sE(),key:"msgContent",content:te,isFull:!0,isFinalize:!0,isError:!1},headers:V,signal:J,action:"AI Card \u5B8C\u6210"});let ie=!0,we={method:"PUT",body:{outTrackId:H,cardData:gM(N,"3",G),cardUpdateOptions:{updateCardDataByKey:!0}},headers:V,signal:J,action:"AI Card \u6536\u53E3"};try{await R("v1.0/card/instances",we)}catch{try{await R("v1.0/card/instances",we)}catch{ie=!1}}return{delivered:!0,completed:ie}},failAiCard:F,async sendText({clientId:U,clientSecret:z,sessionWebhook:q,text:x,at:G,signal:J}){let H=WA(x);if(!H)throw new TypeError("text is required");let N=Vg(q),k=await y({clientId:U,clientSecret:z,signal:J}),V=G&&typeof G=="object"&&(Array.isArray(G.atUserIds)&&G.atUserIds.length>0||Array.isArray(G.atMobiles)&&G.atMobiles.length>0||G.isAtAll===!0)?{at:G}:{},te=await Ln(n,N,{body:{msgtype:"text",text:{content:H},...V},headers:{"x-acs-dingtalk-access-token":k},signal:J,action:"\u6D88\u606F\u56DE\u590D"});if(te?.errcode!==void 0&&te.errcode!==0||te?.code!==void 0&&te.code!==0)throw new gt("send-rejected","\u9489\u9489\u670D\u52A1\u62D2\u7EDD\u4E86\u56DE\u590D\u6D88\u606F\u3002");return!0},async sendFile(U){return j(U,{uploadType:"file",messageKey:"sampleFile",createMessageParams:(z,q)=>({mediaId:z,fileName:q.fileName,fileType:mIe(q.fileName)})})},async sendImage(U){return j(U,{uploadType:"image",messageKey:"sampleImageMsg",createMessageParams:z=>({photoURL:z})})},clearAccessToken(U){let z=WA(U);z&&c.delete(z)}})}var OIe=500,bIe="\u5361\u7247\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u67E5\u770B\u540E\u7EED\u6D88\u606F\u3002";function pM(n,t){if(typeof n!="string")throw new TypeError(`${t} must be a string`);return n}function bK(n,t){if(typeof n!="string"||!n.trim())throw new TypeError(`${t} is required`);return n.trim()}function MK({api:n,clientId:t,clientSecret:o,target:i,signal:e,logger:a=console,updateIntervalMs:A=OIe,clock:r=()=>Date.now(),timer:s={setTimeout:(g,c)=>globalThis.setTimeout(g,c),clearTimeout:g=>globalThis.clearTimeout(g)}}={}){if(!n||typeof n.createAiCard!="function"||typeof n.updateAiCard!="function"||typeof n.finishAiCard!="function")throw new TypeError("DingTalk AI Card API is required");let g=bK(t,"clientId"),c=bK(o,"clientSecret");if(i==null)throw new TypeError("target is required");if(!Number.isFinite(A)||A<0)throw new TypeError("updateIntervalMs must be a non-negative number");if(typeof r!="function")throw new TypeError("clock must be a function");if(typeof s?.setTimeout!="function"||typeof s?.clearTimeout!="function")throw new TypeError("timer must provide setTimeout and clearTimeout");let I=()=>{let N=r();if(!Number.isFinite(N))throw new TypeError("clock must return a finite timestamp");return N};I();let d=e?.aborted?"aborted":"idle",B=null,f=null,Q=null,y=null,m=null,_=null,T=0,R=()=>{Q!==null&&(s.clearTimeout(Q),Q=null)},F=()=>e?.removeEventListener("abort",q),j=N=>{d=N,f=null,R(),F()},U=()=>!B||typeof n.failAiCard!="function"?Promise.resolve(!1):(_||(_=n.failAiCard({...B,text:D(bIe),signal:AbortSignal.timeout(5e3)}).then(()=>!0,()=>!1)),_),z=N=>{d==="failed"||d==="finished"||d==="aborted"||(U(),j("failed"),a?.error?.(`[dsh-dingtalk] AI Card ${N} failed`))};function q(){d==="finished"||d==="failed"||d==="aborted"||(U(),j("aborted"))}d!=="aborted"&&e?.addEventListener("abort",q,{once:!0});let x=()=>{if(d!=="active"||y||f===null)return;let N=Math.max(0,T+A-I());if(N>0){Q=s.setTimeout(()=>{Q=null,x()},N);return}let k=f;f=null,y=(async()=>{try{await n.updateAiCard({...B,text:k,finished:!1}),T=I()}catch{if(e?.aborted||d==="aborted")return;z("update")}})().finally(()=>{y=null,d==="active"&&f!==null&&x()})};return Object.freeze({start:async N=>{if(pM(N,"initialText"),d!=="idle")return!1;d="starting";try{let k=await n.createAiCard({clientId:g,clientSecret:c,target:i,initialText:N,signal:e}),V=typeof k?.cardInstanceId=="string"?k.cardInstanceId.trim():"";if(!V)throw new TypeError("DingTalk did not return a card instance id");return B=Object.freeze({clientId:g,clientSecret:c,target:i,cardInstanceId:V,signal:e}),d!=="starting"?(U(),!1):(T=I(),d="active",!0)}catch{return e?.aborted||d==="aborted"?(j("aborted"),!1):(z("creation"),!1)}},push:N=>{pM(N,"progressText"),d==="active"&&(f=N,!Q&&!y&&x())},finish:N=>{if(pM(N,"finalText"),d==="finished")return Promise.resolve(!0);if(d==="finishing")return m;if(d!=="active")return Promise.resolve(!1);d="finishing",f=null,R();let k=y;return m=(async()=>{if(k&&await k,d!=="finishing")return!1;try{return await n.finishAiCard({...B,text:N}),d!=="finishing"?!1:(j("finished"),!0)}catch{return e?.aborted||d==="aborted"?(j("aborted"),!1):(z("finish"),!1)}})(),m}})}function Ff(n){return typeof n=="string"&&n.trim()?n.trim():null}function ci(n){return n&&typeof n.id=="string"&&typeof n.question=="string"&&(n.header===void 0||typeof n.header=="string")&&(n.detail===void 0||typeof n.detail=="string")&&(n.multiSelect===void 0||typeof n.multiSelect=="boolean")&&(n.options===void 0||Array.isArray(n.options)&&n.options.every(t=>t&&typeof t.label=="string"&&(t.description===void 0||typeof t.description=="string")))}function Ii(n,t,o,{requiresMention:i=!1}={}){let e=[],a=o>1?`\uFF08${t+1}/${o}\uFF09`:"";e.push(D("DeepSeek Harness \u9700\u8981\u4F60\u8865\u5145\u4FE1\u606F{progress}\uFF1A",{progress:a})),Ff(n.header)&&e.push("",n.header.trim()),e.push("",Ff(n.question)??D("\u8BF7\u8F93\u5165\u4F60\u7684\u56DE\u7B54\u3002")),Ff(n.detail)&&e.push("",n.detail.trim());let A=Array.isArray(n.options)?n.options:[];return A.length>0?(e.push(""),A.forEach((r,s)=>{let g=typeof r?.label=="string"?r.label:"",c=Ff(r?.description);e.push(`${s+1}. ${g}${c?` \u2014 ${c}`:""}`)}),e.push("",n.multiSelect===!0?D("\u8BF7\u56DE\u590D\u9009\u9879\u5E8F\u53F7\u6216\u6587\u5B57\uFF1B\u591A\u9009\u7528\u9017\u53F7\u5206\u9694\uFF0C\u4E5F\u53EF\u8865\u5145\u5176\u4ED6\u5185\u5BB9\u3002"):D("\u8BF7\u56DE\u590D\u4E00\u4E2A\u9009\u9879\u5E8F\u53F7\u6216\u6587\u5B57\uFF0C\u4E5F\u53EF\u76F4\u63A5\u8F93\u5165\u5176\u4ED6\u7B54\u6848\u3002"))):e.push("",D("\u8BF7\u76F4\u63A5\u56DE\u590D\u4F60\u7684\u7B54\u6848\u3002")),i&&e.push("",D("\u7FA4\u804A\u4E2D\u8BF7 @\u673A\u5668\u4EBA \u540E\u53D1\u9001\u7B54\u6848\u3002")),e.join(` `)}function _K(n,t){let o=n.trim();if(!o)return null;if(/^\d+$/.test(o)){let e=t[Number(o)-1];return typeof e?.label=="string"?e.label:null}let i=t.find(e=>e?.label===o);return typeof i?.label=="string"?i.label:null}function li(n,t){let o=Array.isArray(n.options)?n.options:[];if(o.length===0)return{id:n.id,selected:[],custom:t};let i=_K(t,o);if(n.multiSelect!==!0)return i?{id:n.id,selected:[i]}:{id:n.id,selected:[],custom:t};if(i)return{id:n.id,selected:[i]};let e=[],a=[];for(let A of t.split(/[,,、;;\n]+/)){let r=A.trim();if(!r)continue;let s=_K(r,o);s?e.includes(s)||e.push(s):a.push(r)}return{id:n.id,selected:e,...a.length>0?{custom:a.join("\u3001")}:{}}}var MIe=new Map([["\u6279\u51C6","allowed-once"],["\u540C\u610F","allowed-once"],["yes","allowed-once"],["\u62D2\u7EDD","rejected"],["\u4E0D\u540C\u610F","rejected"],["no","rejected"]]),dM="\u8BF7\u7CBE\u51C6\u56DE\u590D\u300C\u6279\u51C6\u300D\u6216\u300C\u62D2\u7EDD\u300D\uFF08\u4E5F\u652F\u6301\uFF1A\u540C\u610F / \u4E0D\u540C\u610F / yes / no\uFF09\u3002",_Ie="\u8BF7\u5148\u5B8C\u6210\u5F53\u524D\u95EE\u9898\uFF0C\u518D\u7CBE\u51C6\u56DE\u590D\u300C\u6279\u51C6\u300D\u6216\u300C\u62D2\u7EDD\u300D\u3002",Ap="\u8BE5\u5BA1\u6279\u5DF2\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u590D\u3002",TIe=5*6e4,NIe=2048;function _a(n){return typeof n=="string"?n.trim():""}function hM(n){return _a(n).replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g,"")}function RIe(n){return MIe.get(_a(n).toLowerCase())??null}function NK(n){return n?.type==="approval/requested"&&!!_a(n.sessionId)&&!!_a(n.approvalId)&&!!_a(n.toolName)&&(n.callId===void 0||!!_a(n.callId))&&(n.reason===void 0||typeof n.reason=="string")}function kIe(n){let t=n?.arguments;if(t!==null&&typeof t=="object")try{return JSON.stringify(t,null,2)}catch{return null}if(typeof t!="string")return null;let o=hM(t);if(!o)return t===""?"{}":null;try{return JSON.stringify(JSON.parse(o),null,2)}catch{return o}}function EM(n,{toolCall:t,requiresMention:o=!1,maxArgumentsLength:i=6e3}={}){if(!NK(n))return null;let e=_a(n.callId);if(!e||_a(t?.callId)!==e||_a(t?.name)!==_a(n.toolName))return null;let a=kIe(t);if(!a||a.length>i)return null;let A=[D("DeepSeek Harness \u9700\u8981\u4F60\u7684\u5BA1\u6279\uFF1A"),"",D("\u5DE5\u5177\uFF1A{tool}",{tool:hM(n.toolName)}),D("\u64CD\u4F5C\u53C2\u6570\uFF1A"),a],r=hM(n.reason);return r&&A.push(D("\u539F\u56E0\uFF1A{reason}",{reason:r})),A.push("",D(dM)),o&&A.push("",D("\u7FA4\u804A\u4E2D\u8BF7 @\u673A\u5668\u4EBA \u540E\u53D1\u9001\u5BA1\u6279\u51B3\u5B9A\u3002")),A.join(` -`)}function TK(n,t){return{ok:!0,value:{sessionId:n.sessionId,approvalId:n.approvalId,outcome:t}}}function Lf(n){return n==="allowed-once"?D("\u5DF2\u6279\u51C6\uFF0C\u4EC5\u5BF9\u672C\u6B21\u64CD\u4F5C\u6709\u6548\u3002"):n==="rejected"?D("\u5DF2\u62D2\u7EDD\u6B64\u6B21\u64CD\u4F5C\u3002"):D(Ap)}var pi=class{#e;#A;#t=new Map;#r=new Map;#c=new Map;constructor({label:t="IM",logger:o=console}={}){this.#e=t,this.#A=o}hasPending(t){return this.#r.get(t)?.items.some(o=>!o.inactive)===!0}claimReply({key:t,actor:o,text:i,addressed:e=!0,hasPendingQuestion:a=!1,questionCompletion:A,isQuestionPending:r,send:s}){let c=this.#r.get(t)?.items[0],I=RIe(i),d=(f,Q=!1)=>({...Q?{resolved:!0}:{},process:async y=>{typeof y=="function"&&await y()===!1||await s(f)}}),B=a&&c&&A&&typeof A.then=="function";return a&&!B?null:!c||c.inactive?(this.#c.get(t)??0)<=Date.now()?(this.#c.delete(t),null):I?d(D(Ap),!0):null:c.actor!==o||c.requiresMention&&e!==!0?I?d(D("\u53EA\u6709\u53D1\u8D77\u5F53\u524D\u4EFB\u52A1\u7684\u7528\u6237\u53EF\u4EE5\u5904\u7406\u8FD9\u6761\u5BA1\u6279\u3002")):null:{process:async f=>{let Q=c.presented,m=(c.replyTail??Promise.resolve()).catch(()=>{}).then(async()=>{if(!(typeof f=="function"&&await f()===!1)){if(B){if(await A.catch(()=>{}),c.inactive||c.resolving)return;if(typeof r=="function"&&r()){await s(D(_Ie));return}}if(await c.activationTask?.catch(()=>{}),await c.presentationTask?.catch(()=>{}),c.inactive||c.resolving){await s(D(Ap));return}if(c.send=s,!Q||!c.presented){if(c.presented||await this.#a(c),c.inactive||c.resolving)return;await s(D(dM));return}if(c.submitting){await s(D("\u5BA1\u6279\u51B3\u5B9A\u6B63\u5728\u63D0\u4EA4\uFF0C\u8BF7\u7A0D\u5019\u3002"));return}if(!I){await s(D(dM));return}await this.#n(c,I)}});c.replyTail=m;try{await m}finally{c.replyTail===m&&(c.replyTail=null)}}}}async handleRequested(t,o){if(t?.kind!=="approval")return!1;let i=t.payload,e=_a(i?.approvalId);if(!_a(t.rpcId)||!_a(t.sessionId)||!e||!NK(i)||i.sessionId!==t.sessionId||typeof t.respond!="function")return this.#A.warn?.(`[dsh-im:${this.#e}] ignored an invalid Harness approval`),!0;if(t.recovered===!0)return await this.#I(t,i),!0;let a=this.#t.get(e);if(a)return a.interaction=t,a.toolCall=t.toolCall,a.presented||await this.#a(a),!0;let A=o?.send,r=_a(o?.key),s=_a(o?.actor);if(!r||!s||typeof A!="function")return this.#A.warn?.(`[dsh-im:${this.#e}] ignored an approval without a reply route`),await this.#I(t,i),!0;let g=EM(i,{toolCall:t.toolCall,requiresMention:o.requiresMention===!0});if(!g){let d=await this.#I(t,i);return await A(d?D("\u65E0\u6CD5\u5B8C\u6574\u5C55\u793A\u8FD9\u6B21\u64CD\u4F5C\uFF0C\u5DF2\u5B89\u5168\u62D2\u7EDD\u6B64\u6B21\u5BA1\u6279\u3002"):D(Ap)),!0}let c={approvalId:e,sessionId:t.sessionId,interaction:t,toolCall:t.toolCall,key:r,actor:s,requiresMention:o.requiresMention===!0,send:A,text:g,presented:!1,presentationTask:null,deliveryCompleted:!1,replyTail:null,submitting:!1,inactive:!1,resolving:!1,closedOutcome:null,resolutionNotified:!1,activationTask:null};this.#t.set(e,c);let I=this.#r.get(r)??{items:[]};return I.items.push(c),this.#r.set(r,I),I.items[0]===c&&await this.#a(c),!0}async handleResolved(t){if(t?.kind!=="approval")return!1;let o=this.#t.get(_a(t.interactionId));if(!o||(o.resolving=!0,o.activationTask&&await o.activationTask.catch(()=>{}),o.inactive||this.#t.get(o.approvalId)!==o))return!0;let i=o.presentationTask,e=o.presented||i,a=o.send,A=this.#l(o);return await this.#o(A,async()=>{let r=o.presented;i&&(r=await i.then(()=>!0,()=>!1)),e&&r&&(o.resolutionNotified=!0,await a(Lf(t.outcome)).catch(()=>{}))}),!0}async closeRoute(t){let o=this.#r.get(t);if(!o)return;let i=[...o.items];for(let e of i)this.#l(e);await Promise.all(i.map(async e=>{try{await e.interaction.respond(TK(e,"rejected"),{signal:AbortSignal.timeout(5e3)}),e.closedOutcome="rejected",(e.presented||e.deliveryCompleted)&&!e.resolutionNotified&&(e.resolutionNotified=!0,await e.send(Lf("rejected")).catch(()=>{}))}catch(a){a?.code==="interaction-not-pending"?(e.closedOutcome="resolved",(e.presented||e.deliveryCompleted)&&!e.resolutionNotified&&(e.resolutionNotified=!0,await e.send(D(Ap)).catch(()=>{}))):this.#A.warn?.(`[dsh-im:${this.#e}] failed to reject a closing approval:`,a)}}))}async#a(t){if(this.#r.get(t.key)?.items[0]!==t||t.inactive||t.resolving||t.presented||(await t.activationTask?.catch(()=>{}),this.#r.get(t.key)?.items[0]!==t||t.inactive||t.resolving||t.presented))return;if(t.presentationTask)return t.presentationTask;let o=Promise.resolve().then(()=>t.send(t.text));t.presentationTask=o;try{await o,t.deliveryCompleted=!0,t.inactive?t.closedOutcome&&!t.resolutionNotified&&(t.resolutionNotified=!0,await t.send(Lf(t.closedOutcome)).catch(()=>{})):t.presented=!0}finally{t.presentationTask===o&&(t.presentationTask=null)}}async#n(t,o){t.submitting=!0;try{await t.interaction.respond(TK(t,o))}catch(a){if(a?.code==="interaction-not-pending"){let A=t.send,r=this.#l(t);await this.#o(r,async()=>{t.resolutionNotified||await A(D(Ap)).catch(()=>{})});return}if(t.inactive)return;t.submitting=!1,this.#A.error?.(`[dsh-im:${this.#e}] failed to submit an approval:`,a),await t.send(D("\u5BA1\u6279\u63D0\u4EA4\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u56DE\u590D\u300C\u6279\u51C6\u300D\u6216\u300C\u62D2\u7EDD\u300D\u3002")).catch(()=>{});return}let i=t.send,e=this.#l(t);await this.#o(e,async()=>{t.resolutionNotified||await i(Lf(o)).catch(()=>{})})}async#o(t,o){let i,e=new Promise(a=>{i=a});t&&(t.activationTask=e);try{await o()}finally{i(),t?.activationTask===e&&(t.activationTask=null)}await this.#g(t)}async#g(t){if(t)try{await this.#a(t)}catch(o){this.#A.error?.(`[dsh-im:${this.#e}] failed to present the next approval:`,o);try{t.interaction.reconnect?.()}catch{}}}#l(t){if(t.inactive)return null;t.inactive=!0,this.#i(t.key),this.#t.delete(t.approvalId);let o=this.#r.get(t.key);if(!o)return null;let i=o.items[0]===t,e=o.items.indexOf(t);return e!==-1&&o.items.splice(e,1),o.items.length===0?(this.#r.delete(t.key),null):i?o.items[0]:null}#i(t){let o=Date.now();for(let[i,e]of this.#c)e<=o&&this.#c.delete(i);for(this.#c.delete(t),this.#c.set(t,o+TIe);this.#c.size>NIe;)this.#c.delete(this.#c.keys().next().value)}async#I(t,o){try{return await t.respond({ok:!0,value:{sessionId:t.sessionId,approvalId:o.approvalId,outcome:"rejected"}},{signal:AbortSignal.timeout(5e3)}),!0}catch(i){if(i?.code==="interaction-not-pending")return!1;throw i}}};var CM=new WeakMap;function vIe(n){let t=CM.get(n);return t||(t=new Map,CM.set(n,t)),t}async function js(n,t,o){let i=typeof n;if(i!=="object"&&i!=="function"||n===null)throw new TypeError("state is required");if(typeof t!="string"||!t)throw new TypeError("conversation key is required");if(typeof o!="function")throw new TypeError("operation is required");let e=vIe(n),a=e.get(t)??Promise.resolve(),A,r=new Promise(s=>{A=s});e.set(t,r),await a;try{return await o()}finally{A(),e.get(t)===r&&(e.delete(t),e.size===0&&CM.delete(n))}}var Ta="workspace-session-stale";function RK(n,t){return typeof n.workspaceSession=="function"?n.workspaceSession(t):Object.freeze({sessionId:t,sessionExists:(...o)=>n.sessionExists(t,...o),models:(...o)=>n.getSessionModels(t,...o),selectModel:(...o)=>n.selectSessionModel(t,...o),isRunning:(...o)=>n.isSessionRunning(t,...o),hasActiveTurn:(...o)=>n.hasActiveTurn(t,...o),stopActiveTurn:(...o)=>n.stopActiveTurn(t,...o),steerActiveTurn:(...o)=>n.steerActiveTurn(t,...o),ask:(...o)=>n.ask(t,...o)})}async function PIe(n,t){return t===void 0?n.sessionExists():n.sessionExists(t)}async function GIe(n,t){return t===void 0?n.createSession():n.createSession(t)}async function di({harness:n,state:t,key:o,text:i,content:e,createOptions:a,existsOptions:A,askOptions:r}){for(;;)try{let s=await js(t,o,async()=>{let B=t.sessionFor(o),f=B?RK(n,B):null;if(!f||!await PIe(f,A)){if(B=await GIe(n,a),await t.setSession(o,B)===!1)return null;f=RK(n,B)}return{sessionId:B,session:f}});if(!s)continue;let g=[],c=typeof r=="object"&&typeof r?.onArtifact=="function"?r.onArtifact:null,I=typeof r=="number"?{timeoutMs:r}:{...r};I.onArtifact=async B=>{g.push(B),await c?.(B)};let d=await s.session.ask(e??i,I);return{sessionId:s.sessionId,answer:d,...g.length>0?{artifacts:g}:{}}}catch(s){if(s?.code!==Ta)throw s}}var FIe=/^\/compact(?=$|\s)([\s\S]*)$/i,LIe="\u7528\u6CD5\uFF1A/compact\uFF08\u4E0D\u5E26\u53C2\u6570\uFF09",kK=new Map([["No compactable history yet.","\u6682\u65E0\u53EF\u538B\u7F29\u7684\u5386\u53F2\u8BB0\u5F55\u3002"],["Compaction is unavailable because this process has an active compaction, or the agent is not idle.","\u5F53\u524D\u4F1A\u8BDD\u6B63\u5728\u751F\u6210\u56DE\u590D\u6216\u6267\u884C\u538B\u7F29\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"],["Compaction cancelled.","\u4E0A\u4E0B\u6587\u538B\u7F29\u5DF2\u53D6\u6D88\u3002"],["The history selected for compaction changed before it could be replaced. The conversation is unchanged; the attempt is recorded in the session log.","\u538B\u7F29\u671F\u95F4\u4F1A\u8BDD\u5386\u53F2\u53D1\u751F\u53D8\u5316\uFF0C\u672C\u6B21\u672A\u4FEE\u6539\u4F1A\u8BDD\uFF0C\u8BF7\u91CD\u8BD5\u3002"],["Compaction could not produce a useful summary. The conversation is unchanged; the attempt is recorded in the session log.","\u672A\u80FD\u751F\u6210\u6709\u6548\u7684\u538B\u7F29\u6458\u8981\uFF0C\u672C\u6B21\u672A\u4FEE\u6539\u4F1A\u8BDD\u3002"],["Compaction did not finish cleanly; some session history may have changed. Inspect the current session state before retrying.","\u4E0A\u4E0B\u6587\u538B\u7F29\u672A\u6B63\u5E38\u5B8C\u6210\uFF0C\u90E8\u5206\u4F1A\u8BDD\u5386\u53F2\u53EF\u80FD\u5DF2\u53D8\u5316\uFF0C\u8BF7\u68C0\u67E5\u4F1A\u8BDD\u540E\u518D\u91CD\u8BD5\u3002"],["Compaction finished, but the session could not be saved.","\u4E0A\u4E0B\u6587\u5DF2\u538B\u7F29\uFF0C\u4F46\u4F1A\u8BDD\u4FDD\u5B58\u5931\u8D25\u3002"]]);function lI(n){return{handled:!0,message:n,messages:[n]}}function UIe(n){if(!n||typeof n!="object"||!["success","error"].includes(n.kind)||n.text!==void 0&&typeof n.text!="string")throw new TypeError("Harness returned an invalid /compact result");let t=n.text?.trim()??"",o=/^Compacted (\d+) history items \(~(\d+) tokens\)\.$/u.exec(t);return o?D("\u5DF2\u538B\u7F29 {count} \u6761\u5386\u53F2\u8BB0\u5F55\uFF08\u7EA6 {tokens} \u4E2A token\uFF09\u3002",{count:o[1],tokens:o[2]}):kK.has(t)?D(kK.get(t)):t||(n.kind==="success"?D("\u4E0A\u4E0B\u6587\u538B\u7F29\u5B8C\u6210\u3002"):D("\u4E0A\u4E0B\u6587\u538B\u7F29\u5931\u8D25\u3002"))}function HIe(n){let t=n?.code??n?.failure?.code;return t==="session-not-found"?D("\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u7684\u4F1A\u8BDD\u5DF2\u4E0D\u5B58\u5728\uFF0C\u8BF7\u53D1\u9001\u65B0\u6D88\u606F\u5F00\u542F\u4F1A\u8BDD\u3002"):t==="agent-busy"?D("\u5F53\u524D\u4F1A\u8BDD\u6B63\u5728\u751F\u6210\u56DE\u590D\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"):t==="cancelled"||n?.name==="AbortError"?D("\u4E0A\u4E0B\u6587\u538B\u7F29\u5DF2\u53D6\u6D88\u3002"):t===Ta||t==="workspace-bot-not-found"?D("\u5DE5\u4F5C\u533A\u6216\u673A\u5668\u4EBA\u72B6\u6001\u5DF2\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u8BD5\u3002"):t==="commands-unavailable"?D("\u5F53\u524D Harness \u6682\u4E0D\u652F\u6301\u4ECE\u673A\u5668\u4EBA\u6267\u884C\u4E0A\u4E0B\u6587\u538B\u7F29\u3002"):D("\u4E0A\u4E0B\u6587\u538B\u7F29\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")}async function hi(n,t,o,i,e={}){if(typeof n!="string")return null;let a=FIe.exec(n.trim());if(!a)return null;if(a[1].trim())return lI(D(LIe));if(typeof o?.sessionFor!="function")return lI(D("\u5F53\u524D\u673A\u5668\u4EBA\u6CA1\u6709\u53EF\u7528\u7684\u4F1A\u8BDD\u72B6\u6001\u3002"));let A=o.sessionFor(i);if(typeof A!="string"||!A)return lI(D("\u5F53\u524D\u804A\u5929\u8FD8\u6CA1\u6709\u53EF\u538B\u7F29\u7684\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u53D1\u9001\u4E00\u6761\u6D88\u606F\u3002"));if(typeof t?.executeCommand!="function")return lI(D("\u5F53\u524D\u673A\u5668\u4EBA\u6682\u4E0D\u652F\u6301\u4E0A\u4E0B\u6587\u538B\u7F29\u3002"));try{let r=await t.executeCommand(A,"/compact",e);return lI(r===void 0?D("\u5F53\u524D Harness \u672A\u6CE8\u518C /compact \u547D\u4EE4\uFF0C\u8BF7\u786E\u8BA4\u4E0A\u4E0B\u6587\u538B\u7F29\u7EC4\u4EF6\u5DF2\u542F\u7528\u3002"):UIe(r?.result))}catch(r){return lI(HIe(r))}}import{isDeepStrictEqual as ale}from"node:util";import{realpath as GK,stat as FK}from"node:fs/promises";import{isAbsolute as LK,resolve as KIe}from"node:path";var xIe=/^\/workspace(?:\s+([\s\S]+))?$/i,YIe=/^\/workspacelist(?:\s+([\s\S]+))?$/i,jIe=/^\/sessionlist(?:\s+([\s\S]+))?$/i,JIe=/^\/session(?=$|\s)/i,qIe=/^\/session[ \t]+([^\s]+)$/i,zIe=4096,VIe=1800,WIe=256,UK=/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]/u,ZIe=/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]+/gu,HK="\u7528\u6CD5\uFF1A/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7\uFF08/session N\uFF09",tp=["\u7528\u6CD5\uFF1A","/sessionlist \u5217\u51FA\u5F53\u524D\u5DE5\u4F5C\u533A\u4F1A\u8BDD","/sessionlist \u5DE5\u4F5C\u533A\u5E8F\u53F7 \u6309 /workspacelist \u5E8F\u53F7\u5217\u51FA\u4F1A\u8BDD","/sessionlist \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5217\u51FA\u6307\u5B9A\u5DE5\u4F5C\u533A\u4F1A\u8BDD"].join(` +`)}function TK(n,t){return{ok:!0,value:{sessionId:n.sessionId,approvalId:n.approvalId,outcome:t}}}function Lf(n){return n==="allowed-once"?D("\u5DF2\u6279\u51C6\uFF0C\u4EC5\u5BF9\u672C\u6B21\u64CD\u4F5C\u6709\u6548\u3002"):n==="rejected"?D("\u5DF2\u62D2\u7EDD\u6B64\u6B21\u64CD\u4F5C\u3002"):D(Ap)}var pi=class{#e;#A;#t=new Map;#r=new Map;#c=new Map;constructor({label:t="IM",logger:o=console}={}){this.#e=t,this.#A=o}hasPending(t){return this.#r.get(t)?.items.some(o=>!o.inactive)===!0}claimReply({key:t,actor:o,text:i,addressed:e=!0,hasPendingQuestion:a=!1,questionCompletion:A,isQuestionPending:r,send:s}){let c=this.#r.get(t)?.items[0],I=RIe(i),d=(f,Q=!1)=>({...Q?{resolved:!0}:{},process:async y=>{typeof y=="function"&&await y()===!1||await s(f)}}),B=a&&c&&A&&typeof A.then=="function";return a&&!B?null:!c||c.inactive?(this.#c.get(t)??0)<=Date.now()?(this.#c.delete(t),null):I?d(D(Ap),!0):null:c.actor!==o||c.requiresMention&&e!==!0?I?d(D("\u53EA\u6709\u53D1\u8D77\u5F53\u524D\u4EFB\u52A1\u7684\u7528\u6237\u53EF\u4EE5\u5904\u7406\u8FD9\u6761\u5BA1\u6279\u3002")):null:{process:async f=>{let Q=c.presented,m=(c.replyTail??Promise.resolve()).catch(()=>{}).then(async()=>{if(!(typeof f=="function"&&await f()===!1)){if(B){if(await A.catch(()=>{}),c.inactive||c.resolving)return;if(typeof r=="function"&&r()){await s(D(_Ie));return}}if(await c.activationTask?.catch(()=>{}),await c.presentationTask?.catch(()=>{}),c.inactive||c.resolving){await s(D(Ap));return}if(c.send=s,!Q||!c.presented){if(c.presented||await this.#a(c),c.inactive||c.resolving)return;await s(D(dM));return}if(c.submitting){await s(D("\u5BA1\u6279\u51B3\u5B9A\u6B63\u5728\u63D0\u4EA4\uFF0C\u8BF7\u7A0D\u5019\u3002"));return}if(!I){await s(D(dM));return}await this.#n(c,I)}});c.replyTail=m;try{await m}finally{c.replyTail===m&&(c.replyTail=null)}}}}async handleRequested(t,o){if(t?.kind!=="approval")return!1;let i=t.payload,e=_a(i?.approvalId);if(!_a(t.rpcId)||!_a(t.sessionId)||!e||!NK(i)||i.sessionId!==t.sessionId||typeof t.respond!="function")return this.#A.warn?.(`[dsh-im:${this.#e}] ignored an invalid Harness approval`),!0;if(t.recovered===!0)return await this.#I(t,i),!0;let a=this.#t.get(e);if(a)return a.interaction=t,a.toolCall=t.toolCall,a.presented||await this.#a(a),!0;let A=o?.send,r=_a(o?.key),s=_a(o?.actor);if(!r||!s||typeof A!="function")return this.#A.warn?.(`[dsh-im:${this.#e}] ignored an approval without a reply route`),await this.#I(t,i),!0;let g=EM(i,{toolCall:t.toolCall,requiresMention:o.requiresMention===!0});if(!g){let d=await this.#I(t,i);return await A(d?D("\u65E0\u6CD5\u5B8C\u6574\u5C55\u793A\u8FD9\u6B21\u64CD\u4F5C\uFF0C\u5DF2\u5B89\u5168\u62D2\u7EDD\u6B64\u6B21\u5BA1\u6279\u3002"):D(Ap)),!0}let c={approvalId:e,sessionId:t.sessionId,interaction:t,toolCall:t.toolCall,key:r,actor:s,requiresMention:o.requiresMention===!0,send:A,text:g,presented:!1,presentationTask:null,deliveryCompleted:!1,replyTail:null,submitting:!1,inactive:!1,resolving:!1,closedOutcome:null,resolutionNotified:!1,activationTask:null};this.#t.set(e,c);let I=this.#r.get(r)??{items:[]};return I.items.push(c),this.#r.set(r,I),I.items[0]===c&&await this.#a(c),!0}async handleResolved(t){if(t?.kind!=="approval")return!1;let o=this.#t.get(_a(t.interactionId));if(!o||(o.resolving=!0,o.activationTask&&await o.activationTask.catch(()=>{}),o.inactive||this.#t.get(o.approvalId)!==o))return!0;let i=o.presentationTask,e=o.presented||i,a=o.send,A=this.#l(o);return await this.#o(A,async()=>{let r=o.presented;i&&(r=await i.then(()=>!0,()=>!1)),e&&r&&(o.resolutionNotified=!0,await a(Lf(t.outcome)).catch(()=>{}))}),!0}async closeRoute(t){let o=this.#r.get(t);if(!o)return;let i=[...o.items];for(let e of i)this.#l(e);await Promise.all(i.map(async e=>{try{await e.interaction.respond(TK(e,"rejected"),{signal:AbortSignal.timeout(5e3)}),e.closedOutcome="rejected",(e.presented||e.deliveryCompleted)&&!e.resolutionNotified&&(e.resolutionNotified=!0,await e.send(Lf("rejected")).catch(()=>{}))}catch(a){a?.code==="interaction-not-pending"?(e.closedOutcome="resolved",(e.presented||e.deliveryCompleted)&&!e.resolutionNotified&&(e.resolutionNotified=!0,await e.send(D(Ap)).catch(()=>{}))):this.#A.warn?.(`[dsh-im:${this.#e}] failed to reject a closing approval:`,a)}}))}async#a(t){if(this.#r.get(t.key)?.items[0]!==t||t.inactive||t.resolving||t.presented||(await t.activationTask?.catch(()=>{}),this.#r.get(t.key)?.items[0]!==t||t.inactive||t.resolving||t.presented))return;if(t.presentationTask)return t.presentationTask;let o=Promise.resolve().then(()=>t.send(t.text));t.presentationTask=o;try{await o,t.deliveryCompleted=!0,t.inactive?t.closedOutcome&&!t.resolutionNotified&&(t.resolutionNotified=!0,await t.send(Lf(t.closedOutcome)).catch(()=>{})):t.presented=!0}finally{t.presentationTask===o&&(t.presentationTask=null)}}async#n(t,o){t.submitting=!0;try{await t.interaction.respond(TK(t,o))}catch(a){if(a?.code==="interaction-not-pending"){let A=t.send,r=this.#l(t);await this.#o(r,async()=>{t.resolutionNotified||await A(D(Ap)).catch(()=>{})});return}if(t.inactive)return;t.submitting=!1,this.#A.error?.(`[dsh-im:${this.#e}] failed to submit an approval:`,a),await t.send(D("\u5BA1\u6279\u63D0\u4EA4\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u56DE\u590D\u300C\u6279\u51C6\u300D\u6216\u300C\u62D2\u7EDD\u300D\u3002")).catch(()=>{});return}let i=t.send,e=this.#l(t);await this.#o(e,async()=>{t.resolutionNotified||await i(Lf(o)).catch(()=>{})})}async#o(t,o){let i,e=new Promise(a=>{i=a});t&&(t.activationTask=e);try{await o()}finally{i(),t?.activationTask===e&&(t.activationTask=null)}await this.#g(t)}async#g(t){if(t)try{await this.#a(t)}catch(o){this.#A.error?.(`[dsh-im:${this.#e}] failed to present the next approval:`,o);try{t.interaction.reconnect?.()}catch{}}}#l(t){if(t.inactive)return null;t.inactive=!0,this.#i(t.key),this.#t.delete(t.approvalId);let o=this.#r.get(t.key);if(!o)return null;let i=o.items[0]===t,e=o.items.indexOf(t);return e!==-1&&o.items.splice(e,1),o.items.length===0?(this.#r.delete(t.key),null):i?o.items[0]:null}#i(t){let o=Date.now();for(let[i,e]of this.#c)e<=o&&this.#c.delete(i);for(this.#c.delete(t),this.#c.set(t,o+TIe);this.#c.size>NIe;)this.#c.delete(this.#c.keys().next().value)}async#I(t,o){try{return await t.respond({ok:!0,value:{sessionId:t.sessionId,approvalId:o.approvalId,outcome:"rejected"}},{signal:AbortSignal.timeout(5e3)}),!0}catch(i){if(i?.code==="interaction-not-pending")return!1;throw i}}};var CM=new WeakMap;function vIe(n){let t=CM.get(n);return t||(t=new Map,CM.set(n,t)),t}async function js(n,t,o){let i=typeof n;if(i!=="object"&&i!=="function"||n===null)throw new TypeError("state is required");if(typeof t!="string"||!t)throw new TypeError("conversation key is required");if(typeof o!="function")throw new TypeError("operation is required");let e=vIe(n),a=e.get(t)??Promise.resolve(),A,r=new Promise(s=>{A=s});e.set(t,r),await a;try{return await o()}finally{A(),e.get(t)===r&&(e.delete(t),e.size===0&&CM.delete(n))}}var Ta="workspace-session-stale";function RK(n,t){return typeof n.workspaceSession=="function"?n.workspaceSession(t):Object.freeze({sessionId:t,sessionExists:(...o)=>n.sessionExists(t,...o),models:(...o)=>n.getSessionModels(t,...o),selectModel:(...o)=>n.selectSessionModel(t,...o),isRunning:(...o)=>n.isSessionRunning(t,...o),hasActiveTurn:(...o)=>n.hasActiveTurn(t,...o),stopActiveTurn:(...o)=>n.stopActiveTurn(t,...o),steerActiveTurn:(...o)=>n.steerActiveTurn(t,...o),ask:(...o)=>n.ask(t,...o)})}async function PIe(n,t){return t===void 0?n.sessionExists():n.sessionExists(t)}async function GIe(n,t){return t===void 0?n.createSession():n.createSession(t)}async function di({harness:n,state:t,key:o,text:i,content:e,createOptions:a,existsOptions:A,askOptions:r}){for(;;)try{let s=await js(t,o,async()=>{let B=t.sessionFor(o),f=B?RK(n,B):null;if(!f||!await PIe(f,A)){if(B=await GIe(n,a),await t.setSession(o,B)===!1)return null;f=RK(n,B)}return{sessionId:B,session:f}});if(!s)continue;let g=[],c=typeof r=="object"&&typeof r?.onArtifact=="function"?r.onArtifact:null,I=typeof r=="number"?{timeoutMs:r}:{...r};I.onArtifact=async B=>{g.push(B),await c?.(B)};let d=await s.session.ask(e??i,I);return{sessionId:s.sessionId,answer:d,...g.length>0?{artifacts:g}:{}}}catch(s){if(s?.code!==Ta)throw s}}var FIe=/^\/compact(?=$|\s)([\s\S]*)$/i,LIe="\u7528\u6CD5\uFF1A/compact\uFF08\u4E0D\u5E26\u53C2\u6570\uFF09",kK=new Map([["No compactable history yet.","\u6682\u65E0\u53EF\u538B\u7F29\u7684\u5386\u53F2\u8BB0\u5F55\u3002"],["Compaction is unavailable because this process has an active compaction, or the agent is not idle.","\u5F53\u524D\u4F1A\u8BDD\u6B63\u5728\u751F\u6210\u56DE\u590D\u6216\u6267\u884C\u538B\u7F29\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"],["Compaction cancelled.","\u4E0A\u4E0B\u6587\u538B\u7F29\u5DF2\u53D6\u6D88\u3002"],["The history selected for compaction changed before it could be replaced. The conversation is unchanged; the attempt is recorded in the session log.","\u538B\u7F29\u671F\u95F4\u4F1A\u8BDD\u5386\u53F2\u53D1\u751F\u53D8\u5316\uFF0C\u672C\u6B21\u672A\u4FEE\u6539\u4F1A\u8BDD\uFF0C\u8BF7\u91CD\u8BD5\u3002"],["Compaction could not produce a useful summary. The conversation is unchanged; the attempt is recorded in the session log.","\u672A\u80FD\u751F\u6210\u6709\u6548\u7684\u538B\u7F29\u6458\u8981\uFF0C\u672C\u6B21\u672A\u4FEE\u6539\u4F1A\u8BDD\u3002"],["Compaction did not finish cleanly; some session history may have changed. Inspect the current session state before retrying.","\u4E0A\u4E0B\u6587\u538B\u7F29\u672A\u6B63\u5E38\u5B8C\u6210\uFF0C\u90E8\u5206\u4F1A\u8BDD\u5386\u53F2\u53EF\u80FD\u5DF2\u53D8\u5316\uFF0C\u8BF7\u68C0\u67E5\u4F1A\u8BDD\u540E\u518D\u91CD\u8BD5\u3002"],["Compaction finished, but the session could not be saved.","\u4E0A\u4E0B\u6587\u5DF2\u538B\u7F29\uFF0C\u4F46\u4F1A\u8BDD\u4FDD\u5B58\u5931\u8D25\u3002"]]);function lI(n){return{handled:!0,message:n,messages:[n]}}function UIe(n){if(!n||typeof n!="object"||!["success","error"].includes(n.kind)||n.text!==void 0&&typeof n.text!="string")throw new TypeError("Harness returned an invalid /compact result");let t=n.text?.trim()??"",o=/^Compacted (\d+) history items \(~(\d+) tokens\)\.$/u.exec(t);return o?D("\u5DF2\u538B\u7F29 {count} \u6761\u5386\u53F2\u8BB0\u5F55\uFF08\u7EA6 {tokens} \u4E2A token\uFF09\u3002",{count:o[1],tokens:o[2]}):kK.has(t)?D(kK.get(t)):t||(n.kind==="success"?D("\u4E0A\u4E0B\u6587\u538B\u7F29\u5B8C\u6210\u3002"):D("\u4E0A\u4E0B\u6587\u538B\u7F29\u5931\u8D25\u3002"))}function HIe(n){let t=n?.code??n?.failure?.code;return t==="session-not-found"?D("\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u7684\u4F1A\u8BDD\u5DF2\u4E0D\u5B58\u5728\uFF0C\u8BF7\u53D1\u9001\u65B0\u6D88\u606F\u5F00\u542F\u4F1A\u8BDD\u3002"):t==="agent-busy"?D("\u5F53\u524D\u4F1A\u8BDD\u6B63\u5728\u751F\u6210\u56DE\u590D\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"):t==="cancelled"||n?.name==="AbortError"?D("\u4E0A\u4E0B\u6587\u538B\u7F29\u5DF2\u53D6\u6D88\u3002"):t===Ta||t==="workspace-bot-not-found"?D("\u5DE5\u4F5C\u533A\u6216\u673A\u5668\u4EBA\u72B6\u6001\u5DF2\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u8BD5\u3002"):t==="commands-unavailable"?D("\u5F53\u524D Harness \u6682\u4E0D\u652F\u6301\u4ECE\u673A\u5668\u4EBA\u6267\u884C\u4E0A\u4E0B\u6587\u538B\u7F29\u3002"):D("\u4E0A\u4E0B\u6587\u538B\u7F29\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")}async function hi(n,t,o,i,e={}){if(typeof n!="string")return null;let a=FIe.exec(n.trim());if(!a)return null;if(a[1].trim())return lI(D(LIe));if(typeof o?.sessionFor!="function")return lI(D("\u5F53\u524D\u673A\u5668\u4EBA\u6CA1\u6709\u53EF\u7528\u7684\u4F1A\u8BDD\u72B6\u6001\u3002"));let A=o.sessionFor(i);if(typeof A!="string"||!A)return lI(D("\u5F53\u524D\u804A\u5929\u8FD8\u6CA1\u6709\u53EF\u538B\u7F29\u7684\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u53D1\u9001\u4E00\u6761\u6D88\u606F\u3002"));if(typeof t?.executeCommand!="function")return lI(D("\u5F53\u524D\u673A\u5668\u4EBA\u6682\u4E0D\u652F\u6301\u4E0A\u4E0B\u6587\u538B\u7F29\u3002"));try{let r=await t.executeCommand(A,"/compact",e);return lI(r===void 0?D("\u5F53\u524D Harness \u672A\u6CE8\u518C /compact \u547D\u4EE4\uFF0C\u8BF7\u786E\u8BA4\u4E0A\u4E0B\u6587\u538B\u7F29\u7EC4\u4EF6\u5DF2\u542F\u7528\u3002"):UIe(r?.result))}catch(r){return lI(HIe(r))}}import{isDeepStrictEqual as ale}from"node:util";import{realpath as GK,stat as FK}from"node:fs/promises";import{isAbsolute as LK,resolve as KIe}from"node:path";var xIe=/^\/workspace(?:\s+([\s\S]+))?$/i,YIe=/^\/workspacelist(?:\s+([\s\S]+))?$/i,jIe=/^\/(?:sessionlist|sessions)(?:\s+([\s\S]+))?$/i,JIe=/^\/session(?=$|\s)/i,qIe=/^\/session[ \t]+([^\s]+)$/i,zIe=4096,VIe=1800,WIe=256,UK=/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]/u,ZIe=/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]+/gu,HK="\u7528\u6CD5\uFF1A/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7\uFF08/session N\uFF09",tp=["\u7528\u6CD5\uFF1A","/sessionlist \u5217\u51FA\u5F53\u524D\u5DE5\u4F5C\u533A\u4F1A\u8BDD","/sessionlist \u5DE5\u4F5C\u533A\u5E8F\u53F7 \u6309 /workspacelist \u5E8F\u53F7\u5217\u51FA\u4F1A\u8BDD","/sessionlist \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5217\u51FA\u6307\u5B9A\u5DE5\u4F5C\u533A\u4F1A\u8BDD"].join(` `);function Gt(n,t=[n]){return{handled:!0,message:n,messages:t}}function rp(n){return typeof n!="string"||n.length>zIe||!LK(n)||UK.test(n)?null:KIe(n)}function Uf(n){return typeof n!="string"?"":n.replace(ZIe," ").replace(/\s+/gu," ").trim()}function vK(n){return typeof n=="string"&&n.length>0&&n.length<=WIe&&!new RegExp("\\p{White_Space}","u").test(n)&&!UK.test(n)}async function uM(n){let t=await Promise.all(n.map(async o=>{let i=rp(o);if(!i)return null;try{return(await FK(i)).isDirectory()?rp(await GK(i)):null}catch{return null}}));return[...new Set(t.filter(Boolean))]}async function BM(n){if(typeof n!="string"||!LK(n.trim()))return{error:D(`\u5DE5\u4F5C\u533A\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84\u3002 {usage}`,{usage:D(tp)})};let t=rp(n.trim());if(!t)return{error:D(`\u5DE5\u4F5C\u533A\u8DEF\u5F84\u5305\u542B\u4E0D\u652F\u6301\u7684\u5B57\u7B26\u6216\u957F\u5EA6\u8D85\u8FC7\u9650\u5236\u3002 {usage}`,{usage:D(tp)})};let o;try{o=await FK(t)}catch{return{error:D(`\u5DE5\u4F5C\u533A\u8DEF\u5F84\u4E0D\u5B58\u5728\u3002 @@ -189,12 +189,12 @@ ${cle(I.text,s)}`);g=Wg([a,...c,A.join(` {model} \u63A8\u7406\u7B49\u7EA7\uFF1A{effort} -\u540E\u7EED\u6D88\u606F\u5C06\u4F7F\u7528\u8BE5\u6A21\u578B\u548C\u63A8\u7406\u7B49\u7EA7\u3002`,{model:qs(Q.provider,Q.model),effort:pE(f,xf(Q,f))}))})}catch(I){return ht(ap(I,"select"))}}var wM=/^[a-z0-9][a-z0-9-]*$/,fZe=Object.freeze({defaultId:"",items:Object.freeze([])});function zs(n){if(n==null||typeof n!="string")return null;let t=n.trim();return wM.test(t)?t:null}function op(n){if(n==null||n==="")return null;let t=zs(n);if(!t){let o=new Error(D("Agent Preset \u65E0\u6548\u3002"));throw o.code="agent-preset-invalid",o}return t}function xle(n){if(typeof n=="string"){let i=zs(n);return i?{id:i,label:i}:null}if(!n||typeof n!="object"||n.broken!==void 0)return null;let t=zs(n.id);if(!t)return null;let o=typeof n.name=="string"&&n.name.trim()?n.name.trim().slice(0,128):typeof n.label=="string"&&n.label.trim()?n.label.trim().slice(0,128):t;return{id:t,label:o}}function Hn(n){if(!n||typeof n!="object"||Array.isArray(n))return{defaultId:"",items:[]};let t=[],o=new Set;for(let i of Array.isArray(n.items)?n.items:[]){let e=xle(i);!e||o.has(e.id)||(o.add(e.id),t.push(e))}return{defaultId:zs(n.defaultId)??"",items:t}}async function Na(n){try{let t=typeof n?.get=="function"?n.get("agentPresets"):n?.agentPresets;if(!t||typeof t.list!="function")return{defaultId:"",items:[]};let o=await t.list();return Hn({defaultId:typeof t.defaultId=="string"?t.defaultId:"",items:Array.isArray(o)?o:[]})}catch{return{defaultId:"",items:[]}}}var Yle=/^\/preset(?=$|\s)/iu,px=/^\/presetlist(?=$|\s)/iu,jle="\u7528\u6CD5\uFF1A/presetlist\uFF08\u4E0D\u5E26\u53C2\u6570\uFF09",bM=["\u7528\u6CD5\uFF1A","/preset \u67E5\u770B\u5F53\u524D\u8BBE\u7F6E","/preset <\u5E8F\u53F7> \u6309\u6700\u8FD1\u4E00\u6B21 /presetlist \u7684\u5E8F\u53F7\u9009\u62E9","/preset \u6309 Agent Preset ID \u9009\u62E9","/preset id:<\u7EAF\u6570\u5B57 ID> \u9009\u62E9\u7EAF\u6570\u5B57 ID","/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"].join(` +\u540E\u7EED\u6D88\u606F\u5C06\u4F7F\u7528\u8BE5\u6A21\u578B\u548C\u63A8\u7406\u7B49\u7EA7\u3002`,{model:qs(Q.provider,Q.model),effort:pE(f,xf(Q,f))}))})}catch(I){return ht(ap(I,"select"))}}var wM=/^[a-z0-9][a-z0-9-]*$/,fZe=Object.freeze({defaultId:"",items:Object.freeze([])});function zs(n){if(n==null||typeof n!="string")return null;let t=n.trim();return wM.test(t)?t:null}function op(n){if(n==null||n==="")return null;let t=zs(n);if(!t){let o=new Error(D("Agent Preset \u65E0\u6548\u3002"));throw o.code="agent-preset-invalid",o}return t}function xle(n){if(typeof n=="string"){let i=zs(n);return i?{id:i,label:i}:null}if(!n||typeof n!="object"||n.broken!==void 0)return null;let t=zs(n.id);if(!t)return null;let o=typeof n.name=="string"&&n.name.trim()?n.name.trim().slice(0,128):typeof n.label=="string"&&n.label.trim()?n.label.trim().slice(0,128):t;return{id:t,label:o}}function Hn(n){if(!n||typeof n!="object"||Array.isArray(n))return{defaultId:"",items:[]};let t=[],o=new Set;for(let i of Array.isArray(n.items)?n.items:[]){let e=xle(i);!e||o.has(e.id)||(o.add(e.id),t.push(e))}return{defaultId:zs(n.defaultId)??"",items:t}}async function Na(n){try{let t=typeof n?.get=="function"?n.get("agentPresets"):n?.agentPresets;if(!t||typeof t.list!="function")return{defaultId:"",items:[]};let o=await t.list();return Hn({defaultId:typeof t.defaultId=="string"?t.defaultId:"",items:Array.isArray(o)?o:[]})}catch{return{defaultId:"",items:[]}}}var Yle=/^\/preset(?=$|\s)/iu,px=/^\/(?:presetlist|presets)(?=$|\s)/iu,jle="\u7528\u6CD5\uFF1A/presetlist\uFF08\u4E0D\u5E26\u53C2\u6570\uFF09",bM=["\u7528\u6CD5\uFF1A","/preset \u67E5\u770B\u5F53\u524D\u8BBE\u7F6E","/preset <\u5E8F\u53F7> \u6309\u6700\u8FD1\u4E00\u6B21 /presetlist \u7684\u5E8F\u53F7\u9009\u62E9","/preset \u6309 Agent Preset ID \u9009\u62E9","/preset id:<\u7EAF\u6570\u5B57 ID> \u9009\u62E9\u7EAF\u6570\u5B57 ID","/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"].join(` `),Jle=/[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]+/gu,Ix=new WeakMap,qle=15*6e4,zle=256;function an(n){return{handled:!0,message:n,messages:Js(n)}}function Vle(n){return typeof n!="string"?"":n.replace(Jle," ").replace(/\s+/gu," ").trim()}function Wle(n){return n?{signal:n}:{}}function dx(n){if(!n||typeof n!="object"||Array.isArray(n)||!n.agentPresetCatalog||typeof n.agentPresetCatalog!="object"||!Array.isArray(n.agentPresetCatalog.items))throw new TypeError("Harness returned invalid Agent Preset settings");let t=n.agentPreset===null?null:zs(n.agentPreset);if(n.agentPreset!==null&&t===null)throw new TypeError("Harness returned an invalid current Agent Preset");return{agentPreset:t,agentPresetCatalog:Hn(n.agentPresetCatalog)}}function Yf(n){let t=Vle(n.label)||n.id;return D("{label}\uFF08{id}\uFF09",{label:t,id:n.id})}function MM(n,t){return n.items.find(o=>o.id===t)??null}function Zle(n){if(!n.defaultId)return D("\u672A\u8BBE\u7F6E\u6216\u5F53\u524D\u4E0D\u53EF\u7528");let t=MM(n,n.defaultId);return t?Yf(t):D("{id}\uFF08\u5F53\u524D\u4E0D\u53EF\u7528\uFF09",{id:n.defaultId})}function _M(n){let{agentPreset:t,agentPresetCatalog:o}=n;if(t===null){let e=MM(o,o.defaultId);return e?D("\u8DDF\u968F Host \u9ED8\u8BA4\uFF1A{preset}",{preset:Yf(e)}):D("\u8DDF\u968F Host \u9ED8\u8BA4\uFF08Host \u9ED8\u8BA4\u5F53\u524D\u4E0D\u53EF\u7528\uFF09")}let i=MM(o,t);return i?Yf(i):D("{id}\uFF08\u5DF2\u4E0D\u53EF\u7528\uFF09",{id:t})}function Xle(n){return[D("\u5F53\u524D\u673A\u5668\u4EBA\u7528\u4E8E\u65B0\u4F1A\u8BDD\u7684 Agent Preset\uFF1A"),_M(n),"",D("\u5DF2\u6709\u4F1A\u8BDD\u4E0D\u4F1A\u53D7\u6B64\u8BBE\u7F6E\u5F71\u54CD\u3002"),D("\u67E5\u770B\u53EF\u7528\u9879\uFF1A/presetlist"),D("\u6062\u590D\u8DDF\u968F Host \u9ED8\u8BA4\uFF1A/preset --default")].join(` `)}function $le(n){let{agentPreset:t,agentPresetCatalog:o}=n,i=[D("\u5F53\u524D\u673A\u5668\u4EBA\u7528\u4E8E\u65B0\u4F1A\u8BDD\u7684 Agent Preset\uFF1A"),_M(n),"",D("Host \u9ED8\u8BA4\uFF1A{preset}",{preset:Zle(o)}),"",D("\u53EF\u7528 Agent Preset\uFF08{count}\uFF09\uFF1A",{count:o.items.length})];return o.items.length===0?i.push(D("\u5F53\u524D\u6CA1\u6709\u53EF\u7528 Agent Preset\u3002")):o.items.forEach((e,a)=>{let A=[];e.id===o.defaultId&&A.push(D("Host \u9ED8\u8BA4")),e.id===t&&A.push(D("\u5F53\u524D\u9009\u62E9")),t===null&&e.id===o.defaultId&&A.push(D("\u5F53\u524D\u751F\u6548"));let r=A.length>0?`\uFF08${A.join("\uFF0C")}\uFF09`:"";i.push(`${a+1}. ${Yf(e)}${r}`)}),i.push("",D("\u9009\u62E9\uFF1A/preset <\u5E8F\u53F7\u6216 ID>"),D("\u7EAF\u6570\u5B57 ID\uFF1A/preset id:"),D("\u6062\u590D\u8DDF\u968F Host \u9ED8\u8BA4\uFF1A/preset --default")),i.join(` `)}function epe(n){return[D("\u5F53\u524D\u673A\u5668\u4EBA\u7528\u4E8E\u65B0\u4F1A\u8BDD\u7684 Agent Preset \u5DF2\u8BBE\u7F6E\u4E3A\uFF1A"),_M(n),"",D("\u5DF2\u6709\u4F1A\u8BDD\u4E0D\u53D8\u3002\u82E5\u5F53\u524D\u804A\u5929\u5DF2\u6709\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u53D1\u9001 /new\uFF0C\u518D\u53D1\u9001\u666E\u901A\u6D88\u606F\uFF0C\u624D\u4F1A\u4F7F\u7528\u65B0\u8BBE\u7F6E\u521B\u5EFA\u4F1A\u8BDD\u3002")].join(` `)}function hx(n,{create:t=!1}={}){if((typeof n!="object"||n===null)&&typeof n!="function")return null;let o=Ix.get(n);return!o&&t&&(o=new Map,Ix.set(n,o)),o??null}function Ape(n,t){for(let[o,i]of n)i.expiresAt<=t&&n.delete(o)}function tpe(n,t,o){let i=hx(n,{create:!0});if(!i)return;let e=Date.now();for(Ape(i,e),i.delete(t),i.set(t,{expiresAt:e+qle,ids:o.map(a=>a.id)});i.size>zle;){let a=i.keys().next();if(a.done)break;i.delete(a.value)}}function rpe(n,t){let o=hx(n),i=o?.get(t);return!o||!i?null:i.expiresAt<=Date.now()?(o.delete(t),null):(o.delete(t),o.set(t,i),i.ids)}function ape(n,t,o){if(!/^\d+$/u.test(o))return{numeric:!1,id:null};let i=Number(o);if(!Number.isSafeInteger(i)||i<1)return{numeric:!0,error:D("Agent Preset \u5E8F\u53F7\u65E0\u6548\uFF0C\u8BF7\u5148\u6267\u884C /presetlist\u3002")};let e=rpe(n,t);if(!e)return{numeric:!0,error:D("\u8BF7\u5148\u6267\u884C /presetlist\uFF0C\u518D\u6309\u5217\u8868\u5E8F\u53F7\u9009\u62E9 Agent Preset\u3002")};let a=e[i-1];return a?{numeric:!0,id:a}:{numeric:!0,error:D("Agent Preset \u5E8F\u53F7\u4E0D\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C /presetlist\u3002")}}function ipe(n){return n?.code??n?.failure?.code}function OM(n,t){let o=ipe(n);return o==="agent-preset-invalid"?D(`Agent Preset ID \u683C\u5F0F\u65E0\u6548\u3002 -{usage}`,{usage:D(bM)}):o==="agent-preset-unavailable"?D("Agent Preset \u4E0D\u5B58\u5728\u6216\u5F53\u524D\u4E0D\u53EF\u7528\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C /presetlist\u3002"):o===Ta||o==="workspace-bot-not-found"?D("\u5DE5\u4F5C\u533A\u6216\u673A\u5668\u4EBA\u72B6\u6001\u5DF2\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u8BD5\u3002"):o==="cancelled"||n?.name==="AbortError"?t==="list"?D("\u83B7\u53D6 Agent Preset \u5217\u8868\u5DF2\u53D6\u6D88\u3002"):t==="current"?D("\u83B7\u53D6 Agent Preset \u8BBE\u7F6E\u5DF2\u53D6\u6D88\u3002"):D("Agent Preset \u4FEE\u6539\u5DF2\u53D6\u6D88\u3002"):t==="list"?D("\u6682\u65F6\u65E0\u6CD5\u83B7\u53D6 Agent Preset \u5217\u8868\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"):t==="current"?D("\u6682\u65F6\u65E0\u6CD5\u83B7\u53D6 Agent Preset \u8BBE\u7F6E\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"):D("Agent Preset \u4FEE\u6539\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")}async function lx(n,t){if(typeof n?.agentPresetSettings!="function")throw new TypeError("Harness does not support Agent Preset settings");return dx(await n.agentPresetSettings(t))}async function ope(n,t,o){if(typeof n?.updateAgentPreset!="function")throw new TypeError("Harness does not support updating Agent Preset settings");return dx(await n.updateAgentPreset(t,o))}function qi(n){if(typeof n!="string")return!1;let t=n.trim();return px.test(t)||Yle.test(t)}async function ui(n,t,o,i,e={}){if(!qi(n))return null;let a=n.trim();if(e.hasImages)return an(D("Agent Preset \u547D\u4EE4\u4EC5\u652F\u6301\u7EAF\u6587\u5B57\uFF0C\u8BF7\u79FB\u9664\u56FE\u7247\u540E\u91CD\u8BD5\u3002"));let A=Wle(e.signal);if(px.test(a)){if(!/^\/presetlist[ \t]*$/iu.test(a))return an(D(jle));try{let c=await lx(t,A);return tpe(o,i,c.agentPresetCatalog.items),an($le(c))}catch(c){return an(OM(c,"list"))}}let r=/^\/preset(?:[ \t]+([^\s]+))?[ \t]*$/iu.exec(a);if(!r)return an(D(bM));let s=r[1];if(!s)try{return an(Xle(await lx(t,A)))}catch(c){return an(OM(c,"current"))}let g;if(s.toLowerCase()==="--default")g=null;else{let c=/^id:(\d+)$/iu.exec(s);if(c)g=c[1];else{let I=ape(o,i,s);if(I.numeric){if(I.error)return an(I.error);g=I.id}else if(g=zs(s),!g)return an(D(`Agent Preset ID \u683C\u5F0F\u65E0\u6548\u3002 +{usage}`,{usage:D(bM)}):o==="agent-preset-unavailable"?D("Agent Preset \u4E0D\u5B58\u5728\u6216\u5F53\u524D\u4E0D\u53EF\u7528\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C /presetlist\u3002"):o===Ta||o==="workspace-bot-not-found"?D("\u5DE5\u4F5C\u533A\u6216\u673A\u5668\u4EBA\u72B6\u6001\u5DF2\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u8BD5\u3002"):o==="cancelled"||n?.name==="AbortError"?t==="list"?D("\u83B7\u53D6 Agent Preset \u5217\u8868\u5DF2\u53D6\u6D88\u3002"):t==="current"?D("\u83B7\u53D6 Agent Preset \u8BBE\u7F6E\u5DF2\u53D6\u6D88\u3002"):D("Agent Preset \u4FEE\u6539\u5DF2\u53D6\u6D88\u3002"):t==="list"?D("\u6682\u65F6\u65E0\u6CD5\u83B7\u53D6 Agent Preset \u5217\u8868\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"):t==="current"?D("\u6682\u65F6\u65E0\u6CD5\u83B7\u53D6 Agent Preset \u8BBE\u7F6E\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"):D("Agent Preset \u4FEE\u6539\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")}async function lx(n,t){if(typeof n?.agentPresetSettings!="function")throw new TypeError("Harness does not support Agent Preset settings");return dx(await n.agentPresetSettings(t))}async function ope(n,t,o){if(typeof n?.updateAgentPreset!="function")throw new TypeError("Harness does not support updating Agent Preset settings");return dx(await n.updateAgentPreset(t,o))}function qi(n){if(typeof n!="string")return!1;let t=n.trim();return px.test(t)||Yle.test(t)}async function ui(n,t,o,i,e={}){if(!qi(n))return null;let a=n.trim();if(e.hasImages)return an(D("Agent Preset \u547D\u4EE4\u4EC5\u652F\u6301\u7EAF\u6587\u5B57\uFF0C\u8BF7\u79FB\u9664\u56FE\u7247\u540E\u91CD\u8BD5\u3002"));let A=Wle(e.signal);if(px.test(a)){if(!/^\/(?:presetlist|presets)[ \t]*$/iu.test(a))return an(D(jle));try{let c=await lx(t,A);return tpe(o,i,c.agentPresetCatalog.items),an($le(c))}catch(c){return an(OM(c,"list"))}}let r=/^\/preset(?:[ \t]+([^\s]+))?[ \t]*$/iu.exec(a);if(!r)return an(D(bM));let s=r[1];if(!s)try{return an(Xle(await lx(t,A)))}catch(c){return an(OM(c,"current"))}let g;if(s.toLowerCase()==="--default")g=null;else{let c=/^id:(\d+)$/iu.exec(s);if(c)g=c[1];else{let I=ape(o,i,s);if(I.numeric){if(I.error)return an(I.error);g=I.id}else if(g=zs(s),!g)return an(D(`Agent Preset ID \u683C\u5F0F\u65E0\u6548\u3002 {usage}`,{usage:D(bM)}))}}try{return await js(o,i,async()=>an(epe(await ope(t,g,A))))}catch(c){return an(OM(c,"update"))}}var Ex=Object.freeze(["channel","conversationType","senderId","senderName","botId"]),Cx=8e3;var TM=Object.freeze({groupEnabled:!1,directEnabled:!1,fields:Object.freeze(["senderId"]),guidance:""}),ux=["groupEnabled","directEnabled","fields","guidance"],npe=new Set(["wecom","weixin","feishu","dingtalk","qq","slack","telegram","discord","whatsapp"]),spe={channel:16,conversationType:6,senderId:256,senderName:256,botId:128},gpe=/[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/g;function jf(n){let t=new TypeError(n);return t.code="context-enhancement-invalid",t}function np(n){if(!n||typeof n!="object"||Array.isArray(n)||![Object.prototype,null].includes(Object.getPrototypeOf(n))||Reflect.ownKeys(n).length!==ux.length||!ux.every(a=>Object.hasOwn(n,a)))throw jf("\u8BF7\u63D0\u4EA4\u5B8C\u6574\u7684\u4E0A\u4E0B\u6587\u589E\u5F3A\u8BBE\u7F6E\u3002");let{groupEnabled:t,directEnabled:o,fields:i,guidance:e}=n;if(typeof t!="boolean"||typeof o!="boolean")throw jf("\u7FA4\u804A\u548C\u79C1\u804A\u5F00\u5173\u5FC5\u987B\u662F\u5E03\u5C14\u503C\u3002");if(!Array.isArray(i)||![...i].every(a=>Ex.includes(a)))throw jf("\u6765\u6E90\u5B57\u6BB5\u53EA\u80FD\u9009\u62E9\u5DF2\u5B9A\u4E49\u7684\u4E94\u4E2A\u5B57\u6BB5\u3002");if(typeof e!="string"||e.length>Cx)throw jf(`\u589E\u5F3A\u63D0\u793A\u8BCD\u4E0D\u5F97\u8D85\u8FC7 ${Cx} \u4E2A\u5B57\u7B26\u3002`);return Object.freeze({groupEnabled:t,directEnabled:o,fields:Object.freeze(Ex.filter(a=>i.includes(a))),guidance:e.trim()?e:""})}function sp(n){try{return np(n)}catch{return TM}}function Zr(n,t){if(t!=="group"&&t!=="direct")return null;try{let o=n?.getSettings?.(),i=t==="group"?"groupEnabled":"directEnabled";if(o?.[i]!==!0)return null;let e=sp(o);return e[i]!==!0?null:Object.freeze({config:e,botId:n.botId,conversationType:t})}catch{return null}}function cpe(n,t){if(t==="senderId"&&(typeof n=="bigint"||Number.isFinite(n))&&(n=String(n)),typeof n!="string")return;let o=n.replace(gpe,"").trim().slice(0,spe[t]);if(!(!o||t==="channel"&&!npe.has(o)))return o}function Ipe(n,t){let{fields:o}=n.config,e=o.some(r=>["channel","senderId","senderName"].includes(r))?t?.():null,a={};for(let r of o){let s=r==="botId"||r==="conversationType"?n[r]:e?.[r],g=cpe(s,r);g!==void 0&&(a[r]=g)}return Object.keys(a).length===0?"":`${JSON.stringify(a).replace(/[<>&]/g,r=>({"<":"\\u003c",">":"\\u003e","&":"\\u0026"})[r])}`}function lpe(n){return n.trim()?` ${n.replace(/<\/?dsh_im_source_guidance\b[^>]*(?:>|$)/gi,o=>o.replace(//g,">"))} `:""}function fo(n,t,o){if(!t)return n;try{let i=[Ipe(t,o),lpe(t.config.guidance)].filter(Boolean);if(i.length===0)return n;let e=i.join(` @@ -216,7 +216,7 @@ ${o}`);return[D("\u4EE5\u4E0B\u662F\u7528\u6237\u901A\u8FC7\u6279\u91CF\u8F93\u5 \u8BF7\u518D\u6B21\u53D1\u9001 /send \u91CD\u8BD5\u6216 /cancel \u53D6\u6D88\u3002`,{count:e})})}};import{createWriteStream as Cpe}from"node:fs";import{mkdir as upe,mkdtemp as Bpe,rm as fx,writeFile as fpe}from"node:fs/promises";import{isAbsolute as Qx,join as NM,relative as Qpe,resolve as yx}from"node:path";import{pipeline as ype}from"node:stream/promises";var mpe=NM(".dsh-im","inbound"),mo=class extends Error{constructor(t,o,i=D("\u6587\u4EF6\u63A5\u6536\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001\u540E\u518D\u8BD5\u3002"),e={}){super(o,e),this.name="InboundFileError",this.code=t,this.userMessage=i}};function RM(n){return Array.isArray(n?.files)?n.files.filter(Boolean):[]}function mx(n,t){return typeof n!="string"?t:n.replaceAll("\\","/").split("/").at(-1)?.replace(/[\u0000-\u001f\u007f]/g,"").trim()||t}function Spe(n,t){let o=mx(n,"file").replace(/[^\p{L}\p{N}._ -]/gu,"_").replace(/^\.+/,"").slice(0,160)||"file";return`${String(t+1).padStart(2,"0")}-${o}`}function Dpe(n){if(Buffer.isBuffer(n)||n instanceof Uint8Array)return{data:Buffer.from(n)};let t=n?.data??n?.buffer;if(Buffer.isBuffer(t)||t instanceof Uint8Array)return{data:Buffer.from(t),name:n?.name??n?.filename,mediaType:n?.mediaType??n?.mimetype};let o=n?.stream??n;return o&&typeof o[Symbol.asyncIterator]=="function"?{stream:o,name:n?.name??n?.filename,mediaType:n?.mediaType??n?.mimetype}:null}function Ft(n){return RM(n).length>0}function gp(n,{signal:t}={}){let o=RM(n);return o.length===0?n:{...n,files:o.map(i=>{if(i?.data!==void 0||typeof i?.load!="function")return i;let e;try{e=Promise.resolve(i.load({signal:t}))}catch(a){e=Promise.reject(a)}return e.catch(()=>{}),{...i,async load({signal:a}={}){a?.throwIfAborted();let A=await e;return a?.throwIfAborted(),A}}})}}async function Sx(n,{workspace:t,signal:o}={}){let i=RM(n);if(i.length===0)return null;if(typeof t!="string"||!Qx(t))throw new mo("inbound-file-workspace-unavailable","The Harness Session workspace is unavailable for inbound files.");o?.throwIfAborted();let e=yx(t,mpe);await upe(e,{recursive:!0,mode:448});let a=await Bpe(NM(e,"turn-")),A=[];try{for(let[r,s]of i.entries()){o?.throwIfAborted();let g;try{g=s?.data===void 0?await s?.load?.({signal:o}):s.data}catch(f){throw o?.aborted?f:new mo("inbound-file-download-failed",`Unable to download inbound file ${r+1}: ${f?.message??String(f)}`,D("\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001\u540E\u518D\u8BD5\u3002"),{cause:f})}let c=Dpe(g);if(!c)throw new mo("inbound-file-data-invalid",`Inbound file ${r+1} returned no readable data.`);let I=mx(c.name??s?.name,`file-${r+1}`),d=NM(a,Spe(I,r));if(c.data)await fpe(d,c.data,{mode:384,signal:o});else try{await ype(c.stream,Cpe(d,{flags:"wx",mode:384}),{signal:o})}catch(f){throw o?.aborted?f:new mo("inbound-file-download-failed",`Unable to stream inbound file ${r+1}: ${f?.message??String(f)}`,D("\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001\u540E\u518D\u8BD5\u3002"),{cause:f})}let B=Qpe(yx(t),d);if(!B||B.startsWith("..")||Qx(B))throw new mo("inbound-file-path-invalid","The staged inbound file escaped the Harness Session workspace.");A.push(Object.freeze({name:I,path:B,...typeof(c.mediaType??s?.mediaType)=="string"&&(c.mediaType??s.mediaType).trim()?{mediaType:(c.mediaType??s.mediaType).trim()}:{}}))}return Object.freeze({files:Object.freeze(A),async cleanup(){await fx(a,{recursive:!0,force:!0})}})}catch(r){throw await fx(a,{recursive:!0,force:!0}).catch(()=>{}),r}}function Dx(n,t){if(!t?.files?.length)return n;let o=["",JSON.stringify({description:"Files uploaded with this user message. Paths are relative to the current Harness workspace.",files:t.files}),""].join(` `);if(Array.isArray(n))return[...n,{type:"text",text:o}];let i=typeof n=="string"?n.trim():"";return i?`${i} -${o}`:o}function So(n){return n instanceof mo?n.userMessage:null}import{createHash as Tx,randomUUID as Nx}from"node:crypto";import{constants as dE}from"node:fs";import{copyFile as wpe,lstat as wx,mkdtemp as Ope,open as Rx,realpath as bpe,unlink as kx}from"node:fs/promises";import{tmpdir as Mpe}from"node:os";import{basename as _pe,extname as Tpe,isAbsolute as Npe,join as vx,resolve as Rpe}from"node:path";var zf="dsh_im_return_file",qf="dsh-im-outbound-artifact",kM=64*1024,kpe=new Map([[".csv","text/csv"],[".doc","application/msword"],[".docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],[".gif","image/gif"],[".html","text/html"],[".jpeg","image/jpeg"],[".jpg","image/jpeg"],[".json","application/json"],[".md","text/markdown"],[".pdf","application/pdf"],[".png","image/png"],[".rar","application/vnd.rar"],[".txt","text/plain"],[".webp","image/webp"],[".xls","application/vnd.ms-excel"],[".xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],[".xml","application/xml"],[".zip","application/zip"]]),Zs=new WeakMap,Px=new WeakMap,hE=new WeakMap,Ox;function vpe(){return Ox??=Ope(vx(Mpe(),"dsh-im-outbound-")),Ox}function Ws(n,t){let o=new Error(t);return o.code=n,o}function bx(n){let t=n?.session?.events;if(!Array.isArray(t))return null;let o=null;for(let i of t)i?.type==="turn/start"?o=Number.isInteger(i.data?.turn)?i.data.turn:null:i?.type==="turn/end"&&i.data?.turn===o&&(o=null);return Number.isInteger(o)&&o>=0?o:null}function Mx(n){let t=n?.id??n?.header?.id;return typeof t=="string"&&t?t:null}function Vs(n,t){return`${n}\0${t}`}function _x(n,t){return`${n}\0${t}`}function Ppe(n){let t=String(n??"").replace(/[\u0000-\u001f\u007f]/g," ").replace(new RegExp("\\p{Cf}","gu"),"").replace(/\s+/g," ").trim();return t?[...t].slice(0,255).join(""):"result.bin"}function Gpe(n){return kpe.get(Tpe(n).toLowerCase())??"application/octet-stream"}function Fpe(n){return Tx("sha256").update(n).digest("hex")}function Lpe(n,t){return typeof n?.dev=="bigint"&&typeof n?.ino=="bigint"&&typeof n?.size=="bigint"&&typeof n?.mtimeNs=="bigint"&&typeof n?.ctimeNs=="bigint"&&n.dev===t?.dev&&n.ino===t?.ino&&n.size===t?.size&&n.mtimeNs===t?.mtimeNs&&n.ctimeNs===t?.ctimeNs}async function Upe(n,t){let o;try{o=await Rx(n,dE.O_RDONLY);let i=Tx("sha256"),e=o.createReadStream({autoClose:!1,highWaterMark:kM,...t?{signal:t}:{}});for await(let a of e)t?.throwIfAborted(),i.update(a);return i.digest("hex")}finally{await o?.close().catch(()=>{})}}async function Hpe(n,t,{signal:o,errorCode:i="artifact-changed",errorMessage:e="The result file changed while it was being read."}={}){let a=()=>Ws(i,e);if(!Number.isSafeInteger(t)||t<0)throw a();o?.throwIfAborted();let A;try{A=Buffer.allocUnsafe(t)}catch{throw a()}if(typeof n?.createReadStream=="function"){let g=n.createReadStream({autoClose:!1,start:0,end:t,highWaterMark:kM,...o?{signal:o}:{}}),c=0;for await(let I of g){o?.throwIfAborted();let d=Buffer.isBuffer(I)?I:Buffer.from(I);if(c+d.length>t)throw a();d.copy(A,c),c+=d.length}if(c!==t)throw a();return A}let r=0;for(;rg)throw a();r+=I}o?.throwIfAborted();let s=Buffer.allocUnsafe(1);if((await n.read(s,0,1,t))?.bytesRead!==0)throw a();return A}async function Kpe(n,t,o){o?.throwIfAborted();let i;try{let e=Npe(t)?t:Rpe(n,t),a=await bpe(e);if(!(await wx(a,{bigint:!0})).isFile())throw Ws("artifact-not-file","The requested path is not a file.");let r=await vpe();i=vx(r,`${Nx()}.artifact`),await wpe(a,i,dE.COPYFILE_EXCL),o?.throwIfAborted();let s=await wx(i,{bigint:!0}),g=Number(s.size);if(!s.isFile()||!Number.isSafeInteger(g)||g<0)throw Ws("artifact-unavailable","The file could not be prepared for delivery.");let c=Ppe(_pe(e));return Object.freeze({fileName:c,mediaType:Gpe(c),size:g,digest:await Upe(i,o),storagePath:i})}catch(e){throw i&&await kx(i).catch(()=>{}),e?.code?.startsWith?.("artifact-")?e:o?.aborted?o.reason??e:Ws("artifact-unavailable","The requested file is unavailable.")}}function Gx(n){return Object.freeze({artifactId:n.artifactId,fileName:n.fileName,size:n.size})}function Jf(n){return n.artifactId}function xn(n){let t=Zs.get(n);if(!t)return;if(t.releaseRequested=!0,t.materializing>0){t.cleanupRequested=!0;return}let o=[...hE.get(n)??[]];if(o.length>0){t.cleanupDeferred||(t.cleanupDeferred=!0,Promise.allSettled(o).finally(()=>{t.cleanupDeferred=!1,xn(n)}));return}Zs.delete(n),hE.delete(n),t.onCleanup?.(),kx(t.path).catch(()=>{})}var vM=class{#e=new Map;#A=new Map;#t=new Map;#r=new Map;#c=new Map;#a=new Map;#n=new Map;#o=new Map;#g;constructor({uuid:t=Nx}={}){if(typeof t!="function")throw new TypeError("uuid must be a function");this.#g=t}openConsumer(t,o){if(typeof t!="string"||!t||typeof o!="string"||!o)throw new TypeError("sessionId and promptRpcId are required");let i=_x(t,o),e={sessionId:t,promptRpcId:o,turn:null,released:!1};return this.#a.set(i,e),()=>{if(!e.released&&(e.released=!0,this.#a.get(i)===e&&this.#a.delete(i),e.turn!==null)){let a=Vs(t,e.turn);this.#n.get(a)===e&&this.#n.delete(a),this.discard(t,e.turn)}}}observeSessionEvent(t,o){let i=Mx(t);if(!i||!o||typeof o!="object")return;if(o.type==="turn/start"){let A=o.data?.turn;Number.isInteger(A)&&A>=0&&this.#o.set(i,A);return}if(o.type==="user/message"){let A=o.data?.source?.rpcId,r=this.#o.get(i)??bx({session:t});if(typeof A!="string"||!A||!Number.isInteger(r))return;this.#o.set(i,r);let s=this.#a.get(_x(i,A));if(!s||s.released)return;s.turn=r,this.#n.set(Vs(i,r),s);return}if(o.type!=="turn/end")return;let e=o.data?.turn;if(!Number.isInteger(e)||e<0)return;this.#o.get(i)===e&&this.#o.delete(i);let a=this.#n.get(Vs(i,e));(!a||a.released)&&this.discard(i,e)}disposeSession(t){let o=Mx(t);if(!o)return;let i=`${o}\0`,e=new Set;for(let a of[this.#e,this.#A])for(let[A,r]of a)if(A.startsWith(i)){for(let s of r.values())e.add(s);a.delete(A)}for(let[a,A]of this.#a)a.startsWith(i)&&(A.released=!0,this.#a.delete(a));for(let a of this.#n.keys())a.startsWith(i)&&this.#n.delete(a);this.#o.delete(o);for(let a of e)xn(a)}async stage(t,o){let i=t?.path;if(typeof i!="string"||!i.trim())throw new TypeError("A file path is required.");let e=o?.agent,a=e?.session?.header?.id,A=e?.session?.header?.cwd,r=bx(e);if(typeof a!="string"||!a||typeof A!="string"||!A||r===null)throw Ws("artifact-context-required","A live Harness Session is required to return a file.");let s=await Kpe(A,i,o?.signal),{storagePath:g,...c}=s,I=Object.freeze({kind:qf,schemaVersion:1,artifactId:this.#g(),deliveryKey:this.#g(),...c,source:"managed-temp",registeredBy:Object.freeze({kind:"tool-result",eventId:typeof o?.callId=="string"?o.callId:"unknown",toolName:zf}),origin:Object.freeze({sessionId:a,turn:r,callId:typeof o?.callId=="string"?o.callId:null}),createdAt:Date.now()});Zs.set(I,{path:g,materializing:0,materialized:!1,releaseRequested:!1,cleanupRequested:!1,cleanupDeferred:!1,onCleanup:()=>this.#I(I)});let d=Vs(a,r),B=this.#A.get(d);return B||(B=new Map,this.#A.set(d,B)),B.set(Jf(I),I),I}commit(t){if(t?.kind!==qf||!Zs.has(t))return null;let o=Vs(t.origin.sessionId,t.origin.turn),i=Jf(t),e=this.#A.get(o);if(e?.get(i)!==t)return null;e.delete(i),e.size===0&&this.#A.delete(o);let a=this.#e.get(o);return a||(a=new Map,this.#e.set(o,a)),a.set(i,t),Gx(t)}release(t){if(t?.kind!==qf)return;let o=Vs(t.origin.sessionId,t.origin.turn),i=Jf(t),e=this.#A.get(o);e?.get(i)===t&&e.delete(i),e?.size===0&&this.#A.delete(o),xn(t)}take(t,o,{signal:i}={}){let e=Vs(t,o),a=this.#e.get(e);if(this.#e.delete(e),!a)return[];if(i?.aborted){for(let s of a.values())xn(s);return[]}let A=this.#t.get(e)??new Map;this.#t.set(e,A);let r=[];for(let[s,g]of a)Zs.has(g)&&(A.set(s,g),r.push(g));if(A.size===0)this.#t.delete(e);else if(!this.#l(e,i))return[];return r}discard(t,o){if(typeof t!="string"||!Number.isInteger(o))return;let i=Vs(t,o),e=new Set([...this.#e.get(i)?.values()??[],...this.#A.get(i)?.values()??[]]);this.#e.delete(i),this.#A.delete(i);for(let a of e)xn(a)}clear(){let t=new Set;for(let o of this.#e.values())for(let i of o.values())t.add(i);for(let o of this.#A.values())for(let i of o.values())t.add(i);for(let o of this.#t.values())for(let i of o.values())t.add(i);for(let o of t)xn(o);this.#e.clear(),this.#A.clear(),this.#t.clear();for(let o of this.#r.keys())this.#i(o);for(let o of this.#a.values())o.released=!0;this.#a.clear(),this.#n.clear(),this.#o.clear()}#l(t,o){if(!o)return!0;this.#i(t);let i=this.#c.get(o);return i||(i={turnKeys:new Set,onAbort:null},i.onAbort=()=>{for(let e of[...i.turnKeys])for(let a of this.#t.get(e)?.values()??[])xn(a)},this.#c.set(o,i),o.addEventListener("abort",i.onAbort,{once:!0})),i.turnKeys.add(t),this.#r.set(t,o),o.aborted?(i.onAbort(),!1):!0}#i(t){let o=this.#r.get(t);if(!o)return;this.#r.delete(t);let i=this.#c.get(o);i?.turnKeys.delete(t),i?.turnKeys.size===0&&(o.removeEventListener("abort",i.onAbort),this.#c.delete(o))}#I(t){let o=Vs(t.origin.sessionId,t.origin.turn),i=Jf(t),e=this.#e.get(o);e?.get(i)===t&&e.delete(i),e?.size===0&&this.#e.delete(o);let a=this.#A.get(o);a?.get(i)===t&&a.delete(i),a?.size===0&&this.#A.delete(o);let A=this.#t.get(o);A?.get(i)===t&&A.delete(i),A?.size===0&&(this.#t.delete(o),this.#i(o))}},dI=new vM;function xpe({registry:n=dI}={}){let t=new WeakMap,o=new Map,i=(A,r)=>{let s=o.get(A);s||(s={artifacts:[]},o.set(A,s)),s.artifacts.push(r)},e=Object.freeze({name:zf,description:"Send a readable file or generated image to the user through the current conversation. Existing and newly created files are both valid.",parameters:{type:"object",additionalProperties:!1,properties:{path:{type:"string",description:"Absolute path, or a path relative to the current workspace."}},required:["path"]},output:{schema:{type:"object",additionalProperties:!1,properties:{artifactId:{type:"string"},fileName:{type:"string"},size:{type:"number"}},required:["artifactId","fileName","size"]},render:(A,r)=>[{type:"text",text:`Registered ${r.fileName} (${r.size} bytes) for IM delivery.`}]},async execute(A,r){let s=await n.stage(A,r);return t.set(r,s),Gx(s)}});return Object.freeze({definition:e,onResult:(A,r)=>{if(A?.name===zf){let g=t.get(A);if(!g)return;if(t.delete(A),r?.isError){n.release(g);return}A.parent===void 0?n.commit(g):i(A.parent,g);return}let s=o.get(A?.token);if(s){if(o.delete(A.token),r?.isError){for(let g of s.artifacts)n.release(g);return}if(A.parent!==void 0){for(let g of s.artifacts)i(A.parent,g);return}for(let g of s.artifacts)n.commit(g)}}})}function PM(n,{registry:t=dI}={}){if(typeof n?.tools?.register!="function"||typeof n?.systemPrompt?.section!="function"||typeof n?.on!="function")return!1;let o=xpe({registry:t});return n.tools.register(o.definition),n.on("tools/result",o.onResult),n.on("session/event",(i,e)=>t.observeSessionEvent(i,e)),n.on("session/disposed",i=>t.disposeSession(i)),n.systemPrompt.section({name:"dsh-im:return-file",order:115,text:`When the user asks to receive a file or generated image, call ${zf} with its path. Existing files can be sent directly; do not recreate or rename a file solely for delivery.`}),!0}async function Fx(n,{signal:t}={}){if(t?.aborted&&(xn(n),t.throwIfAborted()),n?.kind!==qf||n.schemaVersion!==1||!Zs.has(n)||typeof n.digest!="string"||!Number.isSafeInteger(n.size)||n.size<0)throw Ws("artifact-invalid","The file registration is invalid.");let o=Zs.get(n);o.materializing+=1;let i,e=!1;try{let a=Number.isInteger(dE.O_NOFOLLOW)?dE.O_NOFOLLOW:0;i=await Rx(o.path,dE.O_RDONLY|a);let A=await i.stat({bigint:!0});if(!A.isFile()||A.size!==BigInt(n.size))throw Ws("artifact-invalid","The file registration is invalid.");let r=await Hpe(i,n.size,{signal:t,errorCode:"artifact-invalid",errorMessage:"The file registration is invalid."}),s=await i.stat({bigint:!0});if(!Lpe(A,s)||r.byteLength!==n.size||Fpe(r)!==n.digest)throw Ws("artifact-invalid","The file registration is invalid.");t?.throwIfAborted(),e=!0;let g=Object.freeze({artifactId:n.artifactId,deliveryKey:n.deliveryKey,fileName:n.fileName,mediaType:n.mediaType,size:n.size,bytes:r});return Px.set(g,n),o.materialized=!0,g}catch(a){throw a?.code?.startsWith?.("artifact-")?a:t?.aborted?t.reason??a:Ws("artifact-invalid","The file registration is invalid.")}finally{await i?.close().catch(()=>{}),o.materializing-=1,(!e||o.cleanupRequested)&&xn(n)}}function on(n,t){let o=Px.get(n);if(!o||!Zs.has(o)||!t||typeof t.then!="function")return t;let i=hE.get(o)??new Set,e=Promise.resolve(t).then(()=>{},()=>{});return i.add(e),hE.set(o,i),e.finally(()=>{i.delete(e),i.size===0&&hE.delete(o)}),t}function GM(n){let t=Zs.get(n);t&&(t.releaseRequested=!0),xn(n)}var Ype=new Set(["sent","rejected","failed","unknown"]),jpe=new Set(["sent","failed","unknown"]),Jpe=new Set(["plain","markdown"]),qpe=new Set(["artifact-changed","artifact-context-required","artifact-empty","artifact-invalid","artifact-not-file","artifact-permission-required","artifact-provider-rejected","artifact-too-large","artifact-unavailable"]);function Ra(n){if(!n||typeof n!="object")return[];let t=Array.isArray(n.providerMessageIds)?n.providerMessageIds.filter(e=>typeof e=="string"&&e.trim()||Number.isSafeInteger(e)).map(String):[],i=[n.message_id,n.messageId,n.id,n.ts,n.message?.message_id,n.message?.messageId,n.message?.id,n.message?.ts,n.key?.id,n.data?.message_id,n.body?.msgid,n.body?.message_id].find(e=>typeof e=="string"&&e.trim()||Number.isSafeInteger(e));return i!==void 0&&t.push(String(i)),[...new Set(t)]}function cp(n,t){if(typeof n!="string"||!n.trim())throw new TypeError(`${t} must be a non-empty string`);return n}function Yn(n,t="plain"){let o=typeof n=="string"?{kind:"text",text:n,format:t}:n;if(!o||typeof o!="object"||Array.isArray(o)||o.kind!=="text"||typeof o.text!="string"||!o.text.trim())throw new TypeError("text delivery block must contain non-empty text");if(!Jpe.has(o.format))throw new TypeError("text delivery format must be plain or markdown");return Object.freeze({kind:"text",text:o.text,format:o.format})}function zpe(n){if(!Array.isArray(n))throw new TypeError("providerMessageIds must be an array");let t=[],o=new Set;for(let i of n){let e=cp(i,"providerMessageId");o.has(e)||(o.add(e),t.push(e))}return Object.freeze(t)}function Vpe(n){if(!Array.isArray(n))throw new TypeError("artifacts must be an array");return Object.freeze(n.map(t=>{if(!t||typeof t!="object")throw new TypeError("artifact result must be an object");let o=cp(t.artifactId,"artifactId");if(!Ype.has(t.outcome))throw new TypeError("artifact outcome must be sent, rejected, failed, or unknown");let i=t.reason===void 0?void 0:cp(t.reason,"artifact reason");return Object.freeze({artifactId:o,outcome:t.outcome,...i===void 0?{}:{reason:i}})}))}function Wpe(n){let t=typeof n=="string"?n:n?.code;return t==="artifact-delivery-uncertain"?"unknown":qpe.has(t)?"rejected":"failed"}function Wt({deliveryId:n,presentation:t,providerMessageIds:o=[],artifacts:i=[],deliveryOutcome:e,reason:a}){if(e!==void 0&&!jpe.has(e))throw new TypeError("deliveryOutcome must be sent, failed, or unknown");let A=a===void 0?void 0:cp(a,"delivery reason");return Object.freeze({schemaVersion:1,deliveryId:cp(n,"deliveryId"),presentation:cp(t,"presentation"),providerMessageIds:zpe(o),...e===void 0?{}:{deliveryOutcome:e},...A===void 0?{}:{reason:A},artifacts:Vpe(i)})}function Lx({artifactId:n,deliveryId:t,error:o,presentation:i="text-fallback",providerMessageIds:e=[]}){let a=typeof o=="string"?o:o?.code,A=typeof a=="string"&&a?a:"artifact-provider-failed";return Wt({deliveryId:t,presentation:i,providerMessageIds:e,artifacts:[{artifactId:n,outcome:Wpe(o),reason:A}]})}function Ux({deliveryId:n,presentation:t,receipts:o}){if(!Array.isArray(o)||o.length===0)throw new TypeError("receipts must contain at least one delivery receipt");let i=[],e=new Map,a,A;for(let r of o){if(!r||r.schemaVersion!==1)throw new TypeError("receipt must use DeliveryReceipt schema version 1");i.push(...r.providerMessageIds??[]),a===void 0&&r.deliveryOutcome!==void 0&&(a=r.deliveryOutcome,A=r.reason);for(let s of r.artifacts??[])e.set(s.artifactId,s)}return Wt({deliveryId:n,presentation:t,providerMessageIds:i,deliveryOutcome:a,reason:A,artifacts:[...e.values()]})}function Zpe(){let n=new Error("Native file delivery is unavailable");return n.code="artifact-provider-unavailable",n}function FM(n,t){return t?.aborted||n?.name==="AbortError"||n?.code==="ABORT_ERR"}function Hx(n){return Array.isArray(n)?[...new Set(n.filter(t=>typeof t=="string"&&t.trim()||Number.isSafeInteger(t)).map(String))]:Ra(n)}async function Xpe(n,{sendFile:t,sendImage:o,signal:i}){if(n.mediaType?.startsWith("image/")&&typeof o=="function")try{return{presentation:"image",result:await o(n)}}catch(e){if(FM(e,i)||e?.code==="artifact-delivery-uncertain")throw e}if(i?.throwIfAborted(),typeof t!="function")throw Zpe();return{presentation:"file",result:await t(n)}}async function Do({artifacts:n=[],baseReceipt:t=null,deliveryId:o,aggregatePresentation:i,alwaysMerge:e=!1,channelKey:a,signal:A,sendFile:r,sendImage:s,sendFailureNotice:g,onFailure:c,logger:I}){let d=t?[t]:[],B=!!t&&t.deliveryOutcome!=="failed",f=!1,Q=0,y=0,m=0;try{for(;m0&&(_=Ux({deliveryId:o??t?.deliveryId??n[0]?.deliveryKey,presentation:i??`${a}-${t?"text-and-files":"files"}`,receipts:d})),{receipt:_,userVisible:B,failureNoticeVisible:f,artifactsSent:Q,artifactSendErrors:y}}var $pe="\u5DF2\u8FDE\u63A5 DeepSeek Harness\uFF0C\u6B63\u5728\u601D\u8003\u2026",LM="\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002",ede=["\u9489\u9489\u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002","","\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002","/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD","/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587","/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09","/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A","/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84","/sessionlist [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898","/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD","/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B","/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7","/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7","/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]","/presetlist \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 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:","/preset --default \u8DDF\u968F Host \u9ED8\u8BA4","/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1","/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1","/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09","/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21","/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21","/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001","/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C","/help \u663E\u793A\u672C\u5E2E\u52A9"];function Ade(){return ede.map(n=>D(n)).join(` +${o}`:o}function So(n){return n instanceof mo?n.userMessage:null}import{createHash as Tx,randomUUID as Nx}from"node:crypto";import{constants as dE}from"node:fs";import{copyFile as wpe,lstat as wx,mkdtemp as Ope,open as Rx,realpath as bpe,unlink as kx}from"node:fs/promises";import{tmpdir as Mpe}from"node:os";import{basename as _pe,extname as Tpe,isAbsolute as Npe,join as vx,resolve as Rpe}from"node:path";var zf="dsh_im_return_file",qf="dsh-im-outbound-artifact",kM=64*1024,kpe=new Map([[".csv","text/csv"],[".doc","application/msword"],[".docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],[".gif","image/gif"],[".html","text/html"],[".jpeg","image/jpeg"],[".jpg","image/jpeg"],[".json","application/json"],[".md","text/markdown"],[".pdf","application/pdf"],[".png","image/png"],[".rar","application/vnd.rar"],[".txt","text/plain"],[".webp","image/webp"],[".xls","application/vnd.ms-excel"],[".xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],[".xml","application/xml"],[".zip","application/zip"]]),Zs=new WeakMap,Px=new WeakMap,hE=new WeakMap,Ox;function vpe(){return Ox??=Ope(vx(Mpe(),"dsh-im-outbound-")),Ox}function Ws(n,t){let o=new Error(t);return o.code=n,o}function bx(n){let t=n?.session?.events;if(!Array.isArray(t))return null;let o=null;for(let i of t)i?.type==="turn/start"?o=Number.isInteger(i.data?.turn)?i.data.turn:null:i?.type==="turn/end"&&i.data?.turn===o&&(o=null);return Number.isInteger(o)&&o>=0?o:null}function Mx(n){let t=n?.id??n?.header?.id;return typeof t=="string"&&t?t:null}function Vs(n,t){return`${n}\0${t}`}function _x(n,t){return`${n}\0${t}`}function Ppe(n){let t=String(n??"").replace(/[\u0000-\u001f\u007f]/g," ").replace(new RegExp("\\p{Cf}","gu"),"").replace(/\s+/g," ").trim();return t?[...t].slice(0,255).join(""):"result.bin"}function Gpe(n){return kpe.get(Tpe(n).toLowerCase())??"application/octet-stream"}function Fpe(n){return Tx("sha256").update(n).digest("hex")}function Lpe(n,t){return typeof n?.dev=="bigint"&&typeof n?.ino=="bigint"&&typeof n?.size=="bigint"&&typeof n?.mtimeNs=="bigint"&&typeof n?.ctimeNs=="bigint"&&n.dev===t?.dev&&n.ino===t?.ino&&n.size===t?.size&&n.mtimeNs===t?.mtimeNs&&n.ctimeNs===t?.ctimeNs}async function Upe(n,t){let o;try{o=await Rx(n,dE.O_RDONLY);let i=Tx("sha256"),e=o.createReadStream({autoClose:!1,highWaterMark:kM,...t?{signal:t}:{}});for await(let a of e)t?.throwIfAborted(),i.update(a);return i.digest("hex")}finally{await o?.close().catch(()=>{})}}async function Hpe(n,t,{signal:o,errorCode:i="artifact-changed",errorMessage:e="The result file changed while it was being read."}={}){let a=()=>Ws(i,e);if(!Number.isSafeInteger(t)||t<0)throw a();o?.throwIfAborted();let A;try{A=Buffer.allocUnsafe(t)}catch{throw a()}if(typeof n?.createReadStream=="function"){let g=n.createReadStream({autoClose:!1,start:0,end:t,highWaterMark:kM,...o?{signal:o}:{}}),c=0;for await(let I of g){o?.throwIfAborted();let d=Buffer.isBuffer(I)?I:Buffer.from(I);if(c+d.length>t)throw a();d.copy(A,c),c+=d.length}if(c!==t)throw a();return A}let r=0;for(;rg)throw a();r+=I}o?.throwIfAborted();let s=Buffer.allocUnsafe(1);if((await n.read(s,0,1,t))?.bytesRead!==0)throw a();return A}async function Kpe(n,t,o){o?.throwIfAborted();let i;try{let e=Npe(t)?t:Rpe(n,t),a=await bpe(e);if(!(await wx(a,{bigint:!0})).isFile())throw Ws("artifact-not-file","The requested path is not a file.");let r=await vpe();i=vx(r,`${Nx()}.artifact`),await wpe(a,i,dE.COPYFILE_EXCL),o?.throwIfAborted();let s=await wx(i,{bigint:!0}),g=Number(s.size);if(!s.isFile()||!Number.isSafeInteger(g)||g<0)throw Ws("artifact-unavailable","The file could not be prepared for delivery.");let c=Ppe(_pe(e));return Object.freeze({fileName:c,mediaType:Gpe(c),size:g,digest:await Upe(i,o),storagePath:i})}catch(e){throw i&&await kx(i).catch(()=>{}),e?.code?.startsWith?.("artifact-")?e:o?.aborted?o.reason??e:Ws("artifact-unavailable","The requested file is unavailable.")}}function Gx(n){return Object.freeze({artifactId:n.artifactId,fileName:n.fileName,size:n.size})}function Jf(n){return n.artifactId}function xn(n){let t=Zs.get(n);if(!t)return;if(t.releaseRequested=!0,t.materializing>0){t.cleanupRequested=!0;return}let o=[...hE.get(n)??[]];if(o.length>0){t.cleanupDeferred||(t.cleanupDeferred=!0,Promise.allSettled(o).finally(()=>{t.cleanupDeferred=!1,xn(n)}));return}Zs.delete(n),hE.delete(n),t.onCleanup?.(),kx(t.path).catch(()=>{})}var vM=class{#e=new Map;#A=new Map;#t=new Map;#r=new Map;#c=new Map;#a=new Map;#n=new Map;#o=new Map;#g;constructor({uuid:t=Nx}={}){if(typeof t!="function")throw new TypeError("uuid must be a function");this.#g=t}openConsumer(t,o){if(typeof t!="string"||!t||typeof o!="string"||!o)throw new TypeError("sessionId and promptRpcId are required");let i=_x(t,o),e={sessionId:t,promptRpcId:o,turn:null,released:!1};return this.#a.set(i,e),()=>{if(!e.released&&(e.released=!0,this.#a.get(i)===e&&this.#a.delete(i),e.turn!==null)){let a=Vs(t,e.turn);this.#n.get(a)===e&&this.#n.delete(a),this.discard(t,e.turn)}}}observeSessionEvent(t,o){let i=Mx(t);if(!i||!o||typeof o!="object")return;if(o.type==="turn/start"){let A=o.data?.turn;Number.isInteger(A)&&A>=0&&this.#o.set(i,A);return}if(o.type==="user/message"){let A=o.data?.source?.rpcId,r=this.#o.get(i)??bx({session:t});if(typeof A!="string"||!A||!Number.isInteger(r))return;this.#o.set(i,r);let s=this.#a.get(_x(i,A));if(!s||s.released)return;s.turn=r,this.#n.set(Vs(i,r),s);return}if(o.type!=="turn/end")return;let e=o.data?.turn;if(!Number.isInteger(e)||e<0)return;this.#o.get(i)===e&&this.#o.delete(i);let a=this.#n.get(Vs(i,e));(!a||a.released)&&this.discard(i,e)}disposeSession(t){let o=Mx(t);if(!o)return;let i=`${o}\0`,e=new Set;for(let a of[this.#e,this.#A])for(let[A,r]of a)if(A.startsWith(i)){for(let s of r.values())e.add(s);a.delete(A)}for(let[a,A]of this.#a)a.startsWith(i)&&(A.released=!0,this.#a.delete(a));for(let a of this.#n.keys())a.startsWith(i)&&this.#n.delete(a);this.#o.delete(o);for(let a of e)xn(a)}async stage(t,o){let i=t?.path;if(typeof i!="string"||!i.trim())throw new TypeError("A file path is required.");let e=o?.agent,a=e?.session?.header?.id,A=e?.session?.header?.cwd,r=bx(e);if(typeof a!="string"||!a||typeof A!="string"||!A||r===null)throw Ws("artifact-context-required","A live Harness Session is required to return a file.");let s=await Kpe(A,i,o?.signal),{storagePath:g,...c}=s,I=Object.freeze({kind:qf,schemaVersion:1,artifactId:this.#g(),deliveryKey:this.#g(),...c,source:"managed-temp",registeredBy:Object.freeze({kind:"tool-result",eventId:typeof o?.callId=="string"?o.callId:"unknown",toolName:zf}),origin:Object.freeze({sessionId:a,turn:r,callId:typeof o?.callId=="string"?o.callId:null}),createdAt:Date.now()});Zs.set(I,{path:g,materializing:0,materialized:!1,releaseRequested:!1,cleanupRequested:!1,cleanupDeferred:!1,onCleanup:()=>this.#I(I)});let d=Vs(a,r),B=this.#A.get(d);return B||(B=new Map,this.#A.set(d,B)),B.set(Jf(I),I),I}commit(t){if(t?.kind!==qf||!Zs.has(t))return null;let o=Vs(t.origin.sessionId,t.origin.turn),i=Jf(t),e=this.#A.get(o);if(e?.get(i)!==t)return null;e.delete(i),e.size===0&&this.#A.delete(o);let a=this.#e.get(o);return a||(a=new Map,this.#e.set(o,a)),a.set(i,t),Gx(t)}release(t){if(t?.kind!==qf)return;let o=Vs(t.origin.sessionId,t.origin.turn),i=Jf(t),e=this.#A.get(o);e?.get(i)===t&&e.delete(i),e?.size===0&&this.#A.delete(o),xn(t)}take(t,o,{signal:i}={}){let e=Vs(t,o),a=this.#e.get(e);if(this.#e.delete(e),!a)return[];if(i?.aborted){for(let s of a.values())xn(s);return[]}let A=this.#t.get(e)??new Map;this.#t.set(e,A);let r=[];for(let[s,g]of a)Zs.has(g)&&(A.set(s,g),r.push(g));if(A.size===0)this.#t.delete(e);else if(!this.#l(e,i))return[];return r}discard(t,o){if(typeof t!="string"||!Number.isInteger(o))return;let i=Vs(t,o),e=new Set([...this.#e.get(i)?.values()??[],...this.#A.get(i)?.values()??[]]);this.#e.delete(i),this.#A.delete(i);for(let a of e)xn(a)}clear(){let t=new Set;for(let o of this.#e.values())for(let i of o.values())t.add(i);for(let o of this.#A.values())for(let i of o.values())t.add(i);for(let o of this.#t.values())for(let i of o.values())t.add(i);for(let o of t)xn(o);this.#e.clear(),this.#A.clear(),this.#t.clear();for(let o of this.#r.keys())this.#i(o);for(let o of this.#a.values())o.released=!0;this.#a.clear(),this.#n.clear(),this.#o.clear()}#l(t,o){if(!o)return!0;this.#i(t);let i=this.#c.get(o);return i||(i={turnKeys:new Set,onAbort:null},i.onAbort=()=>{for(let e of[...i.turnKeys])for(let a of this.#t.get(e)?.values()??[])xn(a)},this.#c.set(o,i),o.addEventListener("abort",i.onAbort,{once:!0})),i.turnKeys.add(t),this.#r.set(t,o),o.aborted?(i.onAbort(),!1):!0}#i(t){let o=this.#r.get(t);if(!o)return;this.#r.delete(t);let i=this.#c.get(o);i?.turnKeys.delete(t),i?.turnKeys.size===0&&(o.removeEventListener("abort",i.onAbort),this.#c.delete(o))}#I(t){let o=Vs(t.origin.sessionId,t.origin.turn),i=Jf(t),e=this.#e.get(o);e?.get(i)===t&&e.delete(i),e?.size===0&&this.#e.delete(o);let a=this.#A.get(o);a?.get(i)===t&&a.delete(i),a?.size===0&&this.#A.delete(o);let A=this.#t.get(o);A?.get(i)===t&&A.delete(i),A?.size===0&&(this.#t.delete(o),this.#i(o))}},dI=new vM;function xpe({registry:n=dI}={}){let t=new WeakMap,o=new Map,i=(A,r)=>{let s=o.get(A);s||(s={artifacts:[]},o.set(A,s)),s.artifacts.push(r)},e=Object.freeze({name:zf,description:"Send a readable file or generated image to the user through the current conversation. Existing and newly created files are both valid.",parameters:{type:"object",additionalProperties:!1,properties:{path:{type:"string",description:"Absolute path, or a path relative to the current workspace."}},required:["path"]},output:{schema:{type:"object",additionalProperties:!1,properties:{artifactId:{type:"string"},fileName:{type:"string"},size:{type:"number"}},required:["artifactId","fileName","size"]},render:(A,r)=>[{type:"text",text:`Registered ${r.fileName} (${r.size} bytes) for IM delivery.`}]},async execute(A,r){let s=await n.stage(A,r);return t.set(r,s),Gx(s)}});return Object.freeze({definition:e,onResult:(A,r)=>{if(A?.name===zf){let g=t.get(A);if(!g)return;if(t.delete(A),r?.isError){n.release(g);return}A.parent===void 0?n.commit(g):i(A.parent,g);return}let s=o.get(A?.token);if(s){if(o.delete(A.token),r?.isError){for(let g of s.artifacts)n.release(g);return}if(A.parent!==void 0){for(let g of s.artifacts)i(A.parent,g);return}for(let g of s.artifacts)n.commit(g)}}})}function PM(n,{registry:t=dI}={}){if(typeof n?.tools?.register!="function"||typeof n?.systemPrompt?.section!="function"||typeof n?.on!="function")return!1;let o=xpe({registry:t});return n.tools.register(o.definition),n.on("tools/result",o.onResult),n.on("session/event",(i,e)=>t.observeSessionEvent(i,e)),n.on("session/disposed",i=>t.disposeSession(i)),n.systemPrompt.section({name:"dsh-im:return-file",order:115,text:`When the user asks to receive a file or generated image, call ${zf} with its path. Existing files can be sent directly; do not recreate or rename a file solely for delivery.`}),!0}async function Fx(n,{signal:t}={}){if(t?.aborted&&(xn(n),t.throwIfAborted()),n?.kind!==qf||n.schemaVersion!==1||!Zs.has(n)||typeof n.digest!="string"||!Number.isSafeInteger(n.size)||n.size<0)throw Ws("artifact-invalid","The file registration is invalid.");let o=Zs.get(n);o.materializing+=1;let i,e=!1;try{let a=Number.isInteger(dE.O_NOFOLLOW)?dE.O_NOFOLLOW:0;i=await Rx(o.path,dE.O_RDONLY|a);let A=await i.stat({bigint:!0});if(!A.isFile()||A.size!==BigInt(n.size))throw Ws("artifact-invalid","The file registration is invalid.");let r=await Hpe(i,n.size,{signal:t,errorCode:"artifact-invalid",errorMessage:"The file registration is invalid."}),s=await i.stat({bigint:!0});if(!Lpe(A,s)||r.byteLength!==n.size||Fpe(r)!==n.digest)throw Ws("artifact-invalid","The file registration is invalid.");t?.throwIfAborted(),e=!0;let g=Object.freeze({artifactId:n.artifactId,deliveryKey:n.deliveryKey,fileName:n.fileName,mediaType:n.mediaType,size:n.size,bytes:r});return Px.set(g,n),o.materialized=!0,g}catch(a){throw a?.code?.startsWith?.("artifact-")?a:t?.aborted?t.reason??a:Ws("artifact-invalid","The file registration is invalid.")}finally{await i?.close().catch(()=>{}),o.materializing-=1,(!e||o.cleanupRequested)&&xn(n)}}function on(n,t){let o=Px.get(n);if(!o||!Zs.has(o)||!t||typeof t.then!="function")return t;let i=hE.get(o)??new Set,e=Promise.resolve(t).then(()=>{},()=>{});return i.add(e),hE.set(o,i),e.finally(()=>{i.delete(e),i.size===0&&hE.delete(o)}),t}function GM(n){let t=Zs.get(n);t&&(t.releaseRequested=!0),xn(n)}var Ype=new Set(["sent","rejected","failed","unknown"]),jpe=new Set(["sent","failed","unknown"]),Jpe=new Set(["plain","markdown"]),qpe=new Set(["artifact-changed","artifact-context-required","artifact-empty","artifact-invalid","artifact-not-file","artifact-permission-required","artifact-provider-rejected","artifact-too-large","artifact-unavailable"]);function Ra(n){if(!n||typeof n!="object")return[];let t=Array.isArray(n.providerMessageIds)?n.providerMessageIds.filter(e=>typeof e=="string"&&e.trim()||Number.isSafeInteger(e)).map(String):[],i=[n.message_id,n.messageId,n.id,n.ts,n.message?.message_id,n.message?.messageId,n.message?.id,n.message?.ts,n.key?.id,n.data?.message_id,n.body?.msgid,n.body?.message_id].find(e=>typeof e=="string"&&e.trim()||Number.isSafeInteger(e));return i!==void 0&&t.push(String(i)),[...new Set(t)]}function cp(n,t){if(typeof n!="string"||!n.trim())throw new TypeError(`${t} must be a non-empty string`);return n}function Yn(n,t="plain"){let o=typeof n=="string"?{kind:"text",text:n,format:t}:n;if(!o||typeof o!="object"||Array.isArray(o)||o.kind!=="text"||typeof o.text!="string"||!o.text.trim())throw new TypeError("text delivery block must contain non-empty text");if(!Jpe.has(o.format))throw new TypeError("text delivery format must be plain or markdown");return Object.freeze({kind:"text",text:o.text,format:o.format})}function zpe(n){if(!Array.isArray(n))throw new TypeError("providerMessageIds must be an array");let t=[],o=new Set;for(let i of n){let e=cp(i,"providerMessageId");o.has(e)||(o.add(e),t.push(e))}return Object.freeze(t)}function Vpe(n){if(!Array.isArray(n))throw new TypeError("artifacts must be an array");return Object.freeze(n.map(t=>{if(!t||typeof t!="object")throw new TypeError("artifact result must be an object");let o=cp(t.artifactId,"artifactId");if(!Ype.has(t.outcome))throw new TypeError("artifact outcome must be sent, rejected, failed, or unknown");let i=t.reason===void 0?void 0:cp(t.reason,"artifact reason");return Object.freeze({artifactId:o,outcome:t.outcome,...i===void 0?{}:{reason:i}})}))}function Wpe(n){let t=typeof n=="string"?n:n?.code;return t==="artifact-delivery-uncertain"?"unknown":qpe.has(t)?"rejected":"failed"}function Wt({deliveryId:n,presentation:t,providerMessageIds:o=[],artifacts:i=[],deliveryOutcome:e,reason:a}){if(e!==void 0&&!jpe.has(e))throw new TypeError("deliveryOutcome must be sent, failed, or unknown");let A=a===void 0?void 0:cp(a,"delivery reason");return Object.freeze({schemaVersion:1,deliveryId:cp(n,"deliveryId"),presentation:cp(t,"presentation"),providerMessageIds:zpe(o),...e===void 0?{}:{deliveryOutcome:e},...A===void 0?{}:{reason:A},artifacts:Vpe(i)})}function Lx({artifactId:n,deliveryId:t,error:o,presentation:i="text-fallback",providerMessageIds:e=[]}){let a=typeof o=="string"?o:o?.code,A=typeof a=="string"&&a?a:"artifact-provider-failed";return Wt({deliveryId:t,presentation:i,providerMessageIds:e,artifacts:[{artifactId:n,outcome:Wpe(o),reason:A}]})}function Ux({deliveryId:n,presentation:t,receipts:o}){if(!Array.isArray(o)||o.length===0)throw new TypeError("receipts must contain at least one delivery receipt");let i=[],e=new Map,a,A;for(let r of o){if(!r||r.schemaVersion!==1)throw new TypeError("receipt must use DeliveryReceipt schema version 1");i.push(...r.providerMessageIds??[]),a===void 0&&r.deliveryOutcome!==void 0&&(a=r.deliveryOutcome,A=r.reason);for(let s of r.artifacts??[])e.set(s.artifactId,s)}return Wt({deliveryId:n,presentation:t,providerMessageIds:i,deliveryOutcome:a,reason:A,artifacts:[...e.values()]})}function Zpe(){let n=new Error("Native file delivery is unavailable");return n.code="artifact-provider-unavailable",n}function FM(n,t){return t?.aborted||n?.name==="AbortError"||n?.code==="ABORT_ERR"}function Hx(n){return Array.isArray(n)?[...new Set(n.filter(t=>typeof t=="string"&&t.trim()||Number.isSafeInteger(t)).map(String))]:Ra(n)}async function Xpe(n,{sendFile:t,sendImage:o,signal:i}){if(n.mediaType?.startsWith("image/")&&typeof o=="function")try{return{presentation:"image",result:await o(n)}}catch(e){if(FM(e,i)||e?.code==="artifact-delivery-uncertain")throw e}if(i?.throwIfAborted(),typeof t!="function")throw Zpe();return{presentation:"file",result:await t(n)}}async function Do({artifacts:n=[],baseReceipt:t=null,deliveryId:o,aggregatePresentation:i,alwaysMerge:e=!1,channelKey:a,signal:A,sendFile:r,sendImage:s,sendFailureNotice:g,onFailure:c,logger:I}){let d=t?[t]:[],B=!!t&&t.deliveryOutcome!=="failed",f=!1,Q=0,y=0,m=0;try{for(;m0&&(_=Ux({deliveryId:o??t?.deliveryId??n[0]?.deliveryKey,presentation:i??`${a}-${t?"text-and-files":"files"}`,receipts:d})),{receipt:_,userVisible:B,failureNoticeVisible:f,artifactsSent:Q,artifactSendErrors:y}}var $pe="\u5DF2\u8FDE\u63A5 DeepSeek Harness\uFF0C\u6B63\u5728\u601D\u8003\u2026",LM="\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002",ede=["\u9489\u9489\u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002","","\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002","/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD","/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587","/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09","/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A","/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84","/sessionlist \u6216 /sessions [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898","/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD","/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B","/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7","/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7","/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]","/presetlist \u6216 /presets \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 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:","/preset --default \u8DDF\u968F Host \u9ED8\u8BA4","/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1","/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1","/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09","/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21","/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21","/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001","/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C","/help \u663E\u793A\u672C\u5E2E\u52A9"];function Ade(){return ede.map(n=>D(n)).join(` `)}function mt(n){return typeof n=="string"&&n.trim()?n.trim():null}function tde(n){let t=Ra(n),o=mt(n?.processQueryKey);return o&&!t.includes(o)&&t.push(o),t}function Vf(n){let t=[],o=new Set,i=n;for(;i&&typeof i=="object"&&t.length<3&&!o.has(i);){o.add(i);let e=mt(i.name)?.slice(0,80),a=mt(i.code)?.slice(0,80),A=mt(i.providerCode)?.slice(0,160),r=Number.isInteger(i.status)?i.status:void 0;t.push({...e?{name:e}:{},...a?{code:a}:{},...A?{providerCode:A}:{},...r?{status:r}:{}}),i=i.cause}return t}function rde(n){let t=n,o=new Set;for(;t&&typeof t=="object"&&!o.has(t);){if(o.add(t),t.code==="image-download-address-failed")return D("\u9489\u9489\u672A\u80FD\u6362\u53D6\u56FE\u7247\u4E0B\u8F7D\u5730\u5740\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001\uFF1B\u82E5\u6301\u7EED\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u673A\u5668\u4EBA\u7684\u201C\u4F01\u4E1A\u5185\u673A\u5668\u4EBA\u53D1\u9001\u6D88\u606F\u6743\u9650\u201D\u3002");if(t.code==="invalid-image-download")return D("\u9489\u9489\u6CA1\u6709\u8FD4\u56DE\u56FE\u7247\u4E0B\u8F7D\u5730\u5740\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001\u3002");if(t.code==="image-content-download-failed")return D("\u9489\u9489\u8FD4\u56DE\u7684\u56FE\u7247\u4E34\u65F6\u5730\u5740\u65E0\u6CD5\u8BFB\u53D6\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001\u3002");t=t.cause}return Co(n)}function Kx(n){return mt(n?.senderStaffId)??mt(n?.senderId)}function ade(n){if(n?.content&&typeof n.content=="object")return n.content;if(typeof n?.content!="string")return null;try{let t=JSON.parse(n.content);return t&&typeof t=="object"?t:null}catch{return null}}function ide(n){let t=n?.richText??n?.rich_text;return Array.isArray(t)?t:[]}function ode(n){return typeof n?.text=="string"?mt(n.text):typeof n?.text?.content=="string"?mt(n.text.content):String(n?.type).toLowerCase()==="text"&&typeof n?.content=="string"?mt(n.content):null}function UM(n){return mt(n?.downloadCode)??mt(n?.pictureDownloadCode)}function HM(n,{api:t,clientId:o,clientSecret:i}={}){let e=String(n?.msgtype??"").toLowerCase(),a=ade(n),A=e==="richtext"?ide(a):[],r=e==="text"?mt(n?.text?.content)??"":A.map(ode).filter(Boolean).join(` `),s=[];if(e==="picture"){let c=UM(a);c&&s.push(c)}else if(e==="richtext")for(let c of A){if(String(c?.type??"").toLowerCase()!=="picture")continue;let I=UM(c);I&&s.push(I)}let g=e==="file"?UM(a):null;return{content:r,images:s.map((c,I)=>({name:I===0?"image":`image-${I+1}`,load:({signal:d,maxBytes:B})=>{if(typeof t?.downloadImage!="function")throw new Error("DingTalk API does not support image downloads");return t.downloadImage({clientId:o,clientSecret:i,robotCode:n?.robotCode,downloadCode:c,signal:d,maxBytes:B})}})),files:g?[{name:mt(a?.fileName??a?.file_name)??"file",load:({signal:c}={})=>{if(typeof t?.downloadFile!="function")throw new Error("DingTalk API does not support file downloads");return t.downloadFile({clientId:o,clientSecret:i,robotCode:n?.robotCode,downloadCode:g,signal:c})}}]:[]}}function nde(n,t){if(String(n?.conversationType)==="2"){let o=mt(n?.conversationId);if(!o)throw new Error("DingTalk group message has no conversation id");return`group:${o}`}return`p2p:${t}`}function sde(n,t){return String(n?.conversationType)==="2"?{type:"group",openConversationId:mt(n?.conversationId),atUserIds:{[t]:mt(n?.senderNick)??t}}:{type:"user",userId:t}}function gde(n,t,o){let i=mt(n?.robotCode)??o;return String(n?.conversationType)==="2"?{type:"group",openConversationId:mt(n?.conversationId),robotCode:i}:{type:"user",userId:t,robotCode:i}}function cde(n,t){let o=String(n??D("\u7ED3\u679C\u6587\u4EF6")).replace(/[\r\n]+/g," ").trim()||D("\u7ED3\u679C\u6587\u4EF6");switch(t?.code){case"artifact-delivery-uncertain":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\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:o});case"artifact-permission-required":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u9489\u9489\u5E94\u7528\u6216\u673A\u5668\u4EBA\u7F3A\u5C11\u6587\u4EF6\u6D88\u606F\u6743\u9650\u3002\u8BF7\u5F00\u901A\u5E94\u7528 qyapi_base \u6743\u9650\uFF0C\u5E76\u786E\u8BA4\u673A\u5668\u4EBA\u5177\u5907\u6587\u4EF6\u6D88\u606F\u53D1\u9001\u80FD\u529B\u3002",{name:o});case"artifact-too-large":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u8D85\u8FC7\u5F53\u524D\u9489\u9489\u673A\u5668\u4EBA\u53EF\u53D1\u9001\u7684\u6587\u4EF6\u5927\u5C0F\uFF0C\u672A\u53D1\u9001\u3002",{name:o});case"artifact-rate-limited":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u6682\u65F6\u88AB\u9489\u9489\u9650\u6D41\uFF0C\u672A\u80FD\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o});case"artifact-provider-rejected":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u9489\u9489\u62D2\u7EDD\u4E86\u8BE5\u6587\u4EF6\u6D88\u606F\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u7C7B\u578B\u548C\u673A\u5668\u4EBA\u6587\u4EF6\u6D88\u606F\u914D\u7F6E\u3002",{name:o});case"artifact-invalid":case"artifact-changed":case"artifact-unavailable":return D("\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:o});default:return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u6682\u65F6\u672A\u80FD\u901A\u8FC7\u9489\u9489\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o})}}function Ide(n){return n?.type==="text"&&mt(n.text)?n.text:n?.type==="tool"?n.name==="web_search"?D("_\u6B63\u5728\u641C\u7D22\u7F51\u7EDC\u5E76\u6574\u7406\u4FE1\u606F\u2026_"):D("_\u6B63\u5728\u4F7F\u7528 {name}\u2026_",{name:mt(n.name)??D("\u5DE5\u5177")}):D("_{text}_",{text:mt(n?.text)??D("\u6B63\u5728\u5904\u7406\u2026")})}function lde(n,t,o){if(t.needsPresentation||!t.questions[t.index]||t.actor!==o||String(n?.conversationType)==="2"&&n?.isInAtList!==!0||n?.msgtype!=="text"||!mt(n?.text?.content))return!1;try{return Vg(n.sessionWebhook),!0}catch{return!1}}function pde(n){n.stats??={};for(let t of["messagesReceived","messagesReplied","messagesRejected","messagesIgnored","reactionsAdded","reactionsRemoved","reactionErrors"])n[t]??=0,n.stats[t]=n[t];n.pendingSenders??=[]}function ka(n,t){n[t]=(n[t]??0)+1,n.stats??={},n.stats[t]=n[t]}function KM({pendingSenders:n=[]}={}){return{messagesReceived:0,messagesReplied:0,messagesRejected:0,messagesIgnored:0,reactionsAdded:0,reactionsRemoved:0,reactionErrors:0,lastMessageAt:null,lastReplyAt:null,lastRejectedAt:null,lastError:null,lastMessageError:null,pendingSenders:structuredClone(n),stats:{messagesReceived:0,messagesReplied:0,messagesRejected:0,messagesIgnored:0,reactionsAdded:0,reactionsRemoved:0,reactionErrors:0}}}var Wf=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l;#i;#I;#s=new Map;#p=new Map;#d=new Map;#h=new Set;#E=new Set;#C=new Map;#B;#u=new Bi;constructor({api:t,clientId:o,clientSecret:i,harness:e,state:a,contextEnhancement:A,status:r=KM(),logger:s=console,replyTimeoutMs:g=6e5,reactionTimeoutMs:c=5e3,maxMessageChars:I=4e3,signal:d}){if(!t||typeof t.sendText!="function")throw new TypeError("DingTalk API is required");if(!mt(o)||!mt(i))throw new TypeError("DingTalk app credentials are required");if(!e||!a)throw new TypeError("Harness client and state store are required");this.#e=t,this.#A=o.trim(),this.#t=i.trim(),this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s,this.#B=new pi({label:"DingTalk",logger:s}),this.#g=g,this.#l=Number.isFinite(c)&&c>0?Math.floor(c):5e3,this.#i=I,this.#I=d,pde(this.#n),this.#k()}get status(){return this.#k(),structuredClone(this.#n)}accept(t,{contextSnapshot:o}={}){if(this.#I?.aborted)return Promise.resolve();let i=mt(t?.msgId),e=Kx(t);if(!i||!e||this.#c.hasSeen(i)||this.#C.has(i))return Promise.resolve();this.#C.set(i,o===void 0?Zr(this.#a,t.conversationType==="1"||t.conversationType===1?"direct":t.conversationType==="2"||t.conversationType===2?"group":null):o);let a;try{a=nde(t,e)}catch{return this.#C.delete(i),ka(this.#n,"messagesRejected"),this.#n.lastRejectedAt=new Date().toISOString(),Promise.resolve()}let A=null;try{A=Vg(t.sessionWebhook)}catch{}A&&String(t.conversationType)!=="2"&&lo(this.#c,{sessionWebhook:A});let r=this.#p.get(a),s=HM(t,{api:this.#e,clientId:this.#A,clientSecret:this.#t}),g=mt(s.content)??"",c=String(t.conversationType)!=="2"||t?.isInAtList===!0,I=String(t.conversationType)!=="2",d=A&&c?this.#S(t):null,B=_=>Promise.resolve(_).then(T=>(this.#Q(d,this.#I?.aborted?"clear":"success"),T),T=>{throw this.#Q(d,this.#I?.aborted||T?.name==="AbortError"||T?.code==="turn-stopped"?"clear":"error"),T}),f=String(t?.msgtype).toLowerCase()==="text"&&Qo(g),Q=this.#u.status(a);if(f&&!I&&A&&c)return B(this.#b(i,A,{message:Kn()},d));if(I&&A&&(f||Q.phase==="collecting")){let T=/^\/batch$/iu.test(g)&&Q.phase==="idle"&&(this.#s.has(a)||r||this.#B.hasPending(a))?{handled:!0,kind:"busy",message:yo()}:this.#u.handle(a,g,{plainText:!!g&&String(t?.msgtype).toLowerCase()==="text"&&!Ft(s)&&!Vt(s)});if(T.handled)return T.kind==="submit"?B(this.#y({...t,msgtype:"text",text:{content:T.prompt}},i,e,a,{batchSubmission:T,statusReaction:d})):B(this.#b(i,A,T,d))}let y=Ei(g)?xi:Ft(s)?null:Yi(g)?Ci:ji(g)?Ji:qi(g)?ui:null;if(y&&A&&c){let _;return _=this.#f(t,i,a,A,s,y).catch(T=>{if(T?.code==="turn-stopped"||this.#I?.aborted){this.#Q(d,"clear");return}this.#Q(d,"error"),this.#n.lastError=T?.message??String(T);let R=At(this.#n,T);return this.#o.error?.(`[dsh-dingtalk] failed to process a command [${R.referenceId}]`,Vf(T)),this.#N(A,dt(R),this.#v(t)).catch(()=>{})}).finally(()=>{this.#C.delete(i),this.#E.delete(_)}),this.#E.add(_),B(_)}let m=this.#B.claimReply({key:a,actor:e,messageId:i,text:A&&t?.msgtype==="text"?mt(t?.text?.content)??"":"",addressed:String(t?.conversationType)!=="2"||t?.isInAtList===!0,hasPendingQuestion:!!r,questionCompletion:r?.submitting||r?.claimedReplyMessageId?r.queue:null,isQuestionPending:()=>this.#p.has(a),send:A?_=>this.#N(A,_,this.#v(t)):async()=>{}});if(m){let _;return _=m.process(async()=>this.#c.hasSeen(i)?!1:(await this.#c.markSeen(i),ka(this.#n,"messagesReceived"),this.#n.lastMessageAt=new Date().toISOString(),A||(ka(this.#n,"messagesRejected"),this.#n.lastRejectedAt=new Date().toISOString(),this.#n.lastError=D("\u9489\u9489\u6D88\u606F\u6CA1\u6709\u5B89\u5168\u7684\u56DE\u590D\u5730\u5740\u3002")),!0)).catch(T=>{if(this.#I?.aborted){this.#Q(d,"clear");return}this.#Q(d,"error"),this.#n.lastError=D("\u9489\u9489\u5BA1\u6279\u5904\u7406\u5931\u8D25\u3002"),this.#o.error?.("[dsh-dingtalk] failed to process an approval reply",T)}).finally(()=>{this.#C.delete(i),this.#h.delete(_)}),this.#h.add(_),B(_)}if(r&&r.actor!==e)return B(this.#y(t,i,e,a,{statusReaction:d}));if(r?.submitting||r?.claimedReplyMessageId)return B(this.#y(t,i,e,a,{statusReaction:d}));if(r){lde(t,r,e)&&(r.claimedReplyMessageId=i);let T=(r.queue??Promise.resolve()).catch(()=>{}).then(()=>this.#w(t,i,e,a,r,d)).finally(()=>{this.#C.delete(i),r.claimedReplyMessageId===i&&(r.claimedReplyMessageId=null),r.queue===T&&(r.queue=null)});return r.queue=T,B(T)}return B(this.#y(t,i,e,a,{statusReaction:d}))}#m(t,o,i,e){let a=new AbortController,A=Promise.resolve().then(()=>this.#e[t]({clientId:this.#A,clientSecret:this.#t,...o,reactionName:i,signal:a.signal})),r,s=new Promise((g,c)=>{r=setTimeout(()=>{let I=new DOMException("DingTalk reaction timed out","TimeoutError");a.abort(I),c(I)},this.#l),r.unref?.()});return Promise.race([A,s]).then(()=>(ka(this.#n,e==="add"?"reactionsAdded":"reactionsRemoved"),!0)).catch(g=>(ka(this.#n,"reactionErrors"),this.#o.debug?.(`[dsh-dingtalk] ${t} failed`,Vf(g)),!1)).finally(()=>clearTimeout(r))}#S(t){if(typeof this.#e.addReaction!="function"||typeof this.#e.recallReaction!="function")return null;let o=mt(t?.msgId),i=mt(t?.conversationId);if(!o||!i)return null;let e={messageId:o,conversationId:i,robotCode:mt(t?.robotCode)??this.#A};return{target:e,attached:this.#m("addReaction",e,II,"add"),terminal:!1}}#Q(t,o){if(!t||t.terminal)return;t.terminal=!0;let i=o==="success"?mK:o==="error"?SK:null;t.attached.then(async e=>{let a=await this.#m("recallReaction",t.target,II,"remove");(!e||!a)&&(await new Promise(A=>{setTimeout(A,Math.min(1e3,this.#l)).unref?.()}),a=await this.#m("recallReaction",t.target,II,"remove")||a),!(!a||!i||this.#I?.aborted)&&await this.#m("addReaction",t.target,i,"add")}).catch(()=>{})}#y(t,o,i,e,{releaseMessageId:a=!0,alreadyRecorded:A=!1,batchSubmission:r=null,statusReaction:s=null}={}){let g=!1;try{Vg(t.sessionWebhook),g=!0}catch{}let c=String(t.conversationType)!=="2"||t.isInAtList===!0,I=g&&c?gp(HM(t,{api:this.#e,clientId:this.#A,clientSecret:this.#t}),{signal:this.#I}):void 0,B=(this.#s.get(e)??Promise.resolve()).catch(()=>{}).then(()=>this.#R(t,o,i,e,{alreadyRecorded:A,preparedMessage:I,batchSubmission:r,statusReaction:s})).finally(()=>{a&&this.#C.delete(o),this.#s.get(e)===B&&this.#s.delete(e)});return this.#s.set(e,B),B}async waitForIdle(){await Promise.allSettled([...this.#s.values(),...[...this.#p.values()].flatMap(t=>t.queue?[t.queue]:[]),...this.#h,...this.#E])}async#f(t,o,i,e,a,A){if(this.#I?.throwIfAborted(),this.#c.hasSeen(o))return;await this.#c.markSeen(o),ka(this.#n,"messagesReceived"),this.#n.lastMessageAt=new Date().toISOString();let r=await A(mt(a.content)??"",this.#r,this.#c,i,{signal:this.#I,isDirect:String(t.conversationType)==="1",hasImages:Vt(a),hasFiles:Ft(a),pendingInteraction:this.#p.has(i)||this.#B.hasPending(i),control:{owner:this,key:i}});r?.stopped&&await Promise.allSettled([this.#U(i),this.#B.closeRoute(i)]);for(let s of r?.messages??[r?.message])s&&await this.#N(e,s,this.#v(t));this.#n.lastError=null}#b(t,o,i,e){let a;return a=Promise.resolve().then(async()=>{this.#c.hasSeen(t)||(await this.#c.markSeen(t),ka(this.#n,"messagesReceived"),this.#n.lastMessageAt=new Date().toISOString(),i.message&&await this.#N(o,i.message),this.#n.lastError=null)}).catch(async A=>{if(this.#I?.aborted){this.#Q(e,"clear");return}this.#Q(e,"error"),this.#n.lastError=A?.message??String(A);let r=At(this.#n,A);this.#o.error?.(`[dsh-dingtalk] failed to process a batch input message [${r.referenceId}]`,Vf(A)),await this.#N(o,dt(r)).catch(()=>{})}).finally(()=>{this.#C.delete(t),this.#E.delete(a)}),this.#E.add(a),a}async#R(t,o,i,e,{alreadyRecorded:a=!1,preparedMessage:A,batchSubmission:r=null,statusReaction:s=null}={}){if(this.#I?.throwIfAborted(),!a){if(this.#c.hasSeen(o))return;await this.#c.markSeen(o),ka(this.#n,"messagesReceived"),this.#n.lastMessageAt=new Date().toISOString()}if(String(t.conversationType)==="2"&&t.isInAtList!==!0){ka(this.#n,"messagesIgnored");return}let g;try{g=Vg(t.sessionWebhook)}catch{ka(this.#n,"messagesRejected"),this.#n.lastRejectedAt=new Date().toISOString(),this.#n.lastError=D("\u9489\u9489\u6D88\u606F\u6CA1\u6709\u5B89\u5168\u7684\u56DE\u590D\u5730\u5740\u3002");return}let c=A??HM(t,{api:this.#e,clientId:this.#A,clientSecret:this.#t}),I=c.content,d=Vt(c),B=Ft(c),f=String(t?.msgtype).toLowerCase()==="text",Q=null,y=!1,m=r===null;try{if(!I&&!d&&!B){await this.#N(g,D("\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u548C\u6587\u4EF6\u6D88\u606F\u3002"),this.#v(t));return}let _=I.toLowerCase();if(f&&!d&&!B&&_==="/help"){await this.#N(g,Ade(),this.#v(t));return}if(f&&!d&&!B&&_==="/status"){await this.#r.ensureRunning({signal:this.#I}),await this.#N(g,D("\u9489\u9489\u673A\u5668\u4EBA\u4E0E DeepSeek Harness \u8FDE\u63A5\u6B63\u5E38\u3002"),this.#v(t));return}if(f&&!d&&!B&&_==="/new"){await this.#c.clearSession(e),await this.#N(g,D("\u5DF2\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002\u8BF7\u53D1\u9001\u4F60\u7684\u95EE\u9898\u3002"),this.#v(t));return}let T=f&&!d&&!B?await uo(I,this.#r,e):null;if(T){for(let N of T.messages??[T.message])await this.#N(g,N,this.#v(t));return}let R=f&&!d&&!B?await hi(I,this.#r,this.#c,e,{signal:this.#I}):null;if(R){await this.#N(g,R.message,this.#v(t));return}let F=d?await Eo(c,{signal:this.#I}):void 0,j=this.#C.get(o);j&&(F=fo(F??I,j,()=>({channel:"dingtalk",senderId:i,senderName:t.senderNick}))),typeof this.#e.createAiCard=="function"&&typeof this.#e.updateAiCard=="function"&&typeof this.#e.finishAiCard=="function"&&(Q=MK({api:this.#e,clientId:this.#A,clientSecret:this.#t,target:sde(t,i),signal:this.#I,logger:this.#o}),y=await Q.start(D($pe)));let{answer:U,artifacts:z=[]}=await di({harness:this.#r,state:this.#c,key:e,...F!==void 0?{content:F}:{text:I},createOptions:{signal:this.#I},existsOptions:{signal:this.#I},askOptions:{timeoutMs:this.#g,signal:this.#I,control:{owner:this,key:e},onUpdate:y?N=>Q.push(Ide(N)):void 0,onInteraction:N=>this.#D(N,{key:e,actor:i,sessionWebhook:g,requiresMention:String(t.conversationType)==="2"}),onInteractionResolved:N=>this.#M(N),files:c.files}});r&&(this.#u.complete(e,r.token),m=!0);let q=typeof U=="string"&&U.trim()?U:z.length>0?D("\u7ED3\u679C\u6587\u4EF6\u5DF2\u751F\u6210\u3002"):U,x=null,G=null,J=!1;try{J=y&&await Q.finish(q),J?G=Wt({deliveryId:o,presentation:"dingtalk-card"}):G=Wt({deliveryId:o,presentation:"dingtalk-text",providerMessageIds:await this.#N(g,q,this.#v(t))})}catch(N){x=ba(N)}let H=await this.#Y(gde(t,i,this.#A),g,o,z,G);if(x&&!H.userVisible)throw x;return x&&H.artifactSendErrors===0&&At(this.#n,x),ka(this.#n,"messagesReplied"),this.#n.lastReplyAt=new Date().toISOString(),this.#n.lastError=null,!x&&H.artifactSendErrors===0&&po(this.#n),H.receipt}catch(_){let T=null;if(!m&&r&&(_?.code==="turn-stopped"?this.#u.complete(e,r.token):T=this.#u.fail(e,r.token).message??null,m=!0),_?.code==="turn-stopped"){this.#Q(s,"clear"),y&&await Q.finish(D("\u5DF2\u505C\u6B62\u3002")).catch(()=>{});return}if(this.#I?.aborted){this.#Q(s,"clear");return}this.#Q(s,"error"),this.#n.lastError=_?.message??String(_);let R=So(_)??rde(_),F=At(this.#n,_,{userMessage:R,reason:Ki(_)?.reason});this.#o.error?.(`[dsh-dingtalk] failed to process an inbound message [${F.referenceId}]`,Vf(_));try{let j=dt(F),U=T?`${j} @@ -225,7 +225,7 @@ ${T}`:j;y&&await Q.finish(U)||await this.#N(g,U,this.#v(t))}catch{this.#o.error? `).trim();I&&I!==this.#a&&(this.#a=I,i({type:"text",text:I}));continue}if(a.type==="assistant/message"){let r=xde(a);r&&r!==this.#a&&(this.#a=r,i({type:"text",text:r}));continue}if(a.type==="tool/call"){let r=fi(a.data?.name)??D("\u5DE5\u5177"),s=fi(a.data?.callId)??fi(a.data?.subCallId);s&&this.#g.set(s,r),this.#l=r,i({type:"tool",name:r,...s?{callId:s}:{}})}else if(a.type==="tool/result"){let r=fi(a.data?.message?.source?.callId)??fi(a.data?.callId)??fi(a.data?.subCallId),s=(r?this.#g.get(r):null)??this.#l,g=Yde(a.data?.error);i({type:"status",text:D("\u6B63\u5728\u6574\u7406\u7ED3\u679C\u2026"),...s?{toolName:s}:{},...g?{error:g}:{}})}}}}}return o}consume(t){return this.consumeAll(t).at(-1)??null}},nn=class extends Error{constructor(t,o){super(`${t}: ${o?.message??"unknown Harness RPC error"}`),this.name="HarnessRpcError",this.method=t,this.code=o?.code??"internal",this.details=o?.details??{}}},jn=class extends Error{constructor(t,o,{cause:i,status:e}={}){let a=Number.isInteger(e)?`, HTTP ${e}`:"";super(`Harness ${o} transport failed (${t}${a})`,{cause:i}),this.name="HarnessTransportError",this.code=t,this.method=o,Number.isInteger(e)&&(this.status=e)}},jM=class extends Error{constructor(t){super("Harness health RPC was rejected",{cause:t}),this.name="HarnessHealthError",this.code="harness-rpc-rejected",this.method="host.describe"}},lp=class extends Error{constructor(t,o){super(o),this.name="HarnessInteractionError",this.code=t}},Jn=class extends Error{constructor(t,{reason:o,providerCode:i}={}){super(`Harness turn failed (${t})`),this.name="HarnessTurnError",this.code=t,this.promptAccepted=!0,o&&typeof o=="object"&&(this.reason=o),typeof i=="string"&&i&&(this.providerCode=i)}};function Zx(n){let t=fi(n?.kind)??fi(n);if(t==="error"){let o=n?.error??n?.failure;return new Jn("harness-turn-failed",{reason:n,providerCode:fi(o?.code)??void 0})}return t==="max-tokens"?new Jn("model-max-tokens",{reason:n}):t==="blocked"?new Jn("turn-blocked",{reason:n}):["interrupted","stopped","cancelled","canceled"].includes(t)?new Jn("turn-interrupted",{reason:n}):t==="aborted"?new Jn("turn-aborted",{reason:n}):t==="completed"?new Jn("model-empty-response",{reason:n}):new Jn("harness-turn-failed",{reason:n})}function jde(n){return n==null?!0:(fi(n?.kind)??fi(n))==="completed"}var pr=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l;#i;#I;#s;#p;#d;#h=null;#E;#C;#B;#u;constructor({baseUrl:t,apiProxy:o,interactionScope:i=o,workspace:e,agentPreset:a,autostart:A=!1,dshBin:r="dsh",fetchImpl:s=fetch,createWebSocket:g=m=>new WebSocket(m),interactionReconnectDelayMs:c=500,rpcIdPrefix:I="im",logPrefix:d="dsh-im",commandExecutor:B,controlExecutor:f,sessionMaintenanceExecutor:Q,fileIngressExecutor:y}){if(typeof g!="function")throw new TypeError("createWebSocket must be a function");if(!Number.isFinite(c)||c<0)throw new TypeError("interactionReconnectDelayMs must be a non-negative number");if(typeof I!="string"||!I.trim())throw new TypeError("rpcIdPrefix must be a non-empty string");if(typeof d!="string"||!d.trim())throw new TypeError("logPrefix must be a non-empty string");if(B!==void 0&&typeof B!="function")throw new TypeError("commandExecutor must be a function");if(f!==void 0&&typeof f!="function")throw new TypeError("controlExecutor must be a function");if(Q!==void 0&&typeof Q!="function")throw new TypeError("sessionMaintenanceExecutor must be a function");if(y!==void 0&&typeof y!="function")throw new TypeError("fileIngressExecutor must be a function");if(this.#e=t===void 0?null:new URL(t),this.#A=this.#e?null:o,!this.#e&&(!this.#A||typeof this.#A!="object"))throw new TypeError("HarnessClient requires the current Host apiProxy or an explicit baseUrl");if(this.#A&&(!i||!["object","function"].includes(typeof i)))throw new TypeError("interactionScope must identify the current Host");this.#t=e,this.#r=a??void 0,this.#c=!!(this.#e&&A),this.#a=r,this.#n=s,this.#o=g,this.#g=c,this.#l=I.trim(),this.#i=d.trim(),this.#I=B,this.#s=f,this.#p=Q,this.#d=y,this.#E=Xx(this.#e?.origin??i),this.#C=this.#E.ownerships,this.#B=this.#E.claims,this.#u=this.#E.controls}async rpc(t,o={},i=3e4,e={}){let a=e.rpcId??`${this.#l}-${xM()}`,A=AbortSignal.timeout(i),r=e.signal?AbortSignal.any([e.signal,A]):A,s;try{if(this.#A){let[g,c,I]=t.split("."),d={host:"host",workspace:"workspace",session:"sessions",llm:"llm"}[g],B=d&&this.#A[d];if(I!==void 0||!Object.hasOwn(B??{},c)||typeof B[c]!="function")throw new jn("harness-api-not-found",t);s={type:"server-response",...await qx(()=>B[c]({rpcId:a,payload:o},r),r)}}else{let g=await this.#n(new URL(`/api/${t}`,this.#e),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({type:"client-request",rpcId:a,method:t,payload:o}),signal:r});if(!g.ok){let c=await Pde(g,this.#e.hostname);throw new jn(c,t,{status:g.status})}try{s=await g.json()}catch(c){throw new jn("harness-response-invalid",t,{cause:c})}}}catch(g){throw e.signal?.aborted||g instanceof jn?g:new jn(A.aborted?"harness-timeout":"harness-connect-failed",t,{cause:g})}if(s?.type!=="server-response"||s?.rpcId!==a)throw new jn("harness-response-invalid",t,{cause:new Error(`Harness returned an invalid response for ${t}`)});if(!s.result||typeof s.result!="object"||typeof s.result.ok!="boolean")throw new jn("harness-response-invalid",t,{cause:new Error(`Harness returned an invalid result for ${t}`)});if(!s.result?.ok)throw new nn(t,s.result?.error);return s.result.value}async health(t={}){try{return await this.rpc("host.describe",{},5e3,t),!0}catch(o){throw o instanceof nn?new jM(o):o}}async ensureRunning(t={}){try{return await this.health(t)}catch(e){if(!this.#c)throw e}if(!this.#h||this.#h.exitCode!==null){let e=this.#e.port||(this.#e.protocol==="https:"?"443":"80");this.#h=Mde(this.#a,["web","--host",this.#e.hostname,"--port",e],{cwd:this.#t,env:process.env,stdio:["ignore","inherit","inherit"]}),this.#h.on("error",a=>{console.error(`[${this.#i}] failed to start Harness:`,a.message)})}let o=Date.now()+6e4,i;for(;Date.now(){let r=A&&i.signal?AbortSignal.any([A,i.signal]):A??i.signal;return this.rpc("session.selectModel",{sessionId:t,provider:o.provider,model:o.model,...o.reasoningEffort===void 0?{}:{reasoningEffort:o.reasoningEffort}},3e4,r?{...i,signal:r}:i)},a=this.#p?await this.#p({sessionId:t,operation:e}):await e();if(!a||typeof a!="object"||!YM(a.selected))throw new Error("Harness returned an invalid response for session.selectModel");return a}async isSessionRunning(t,o={}){if(typeof t!="string"||!t)throw new TypeError("sessionId is required");await this.ensureRunning(o);let i=await this.rpc("session.list",{},3e4,o);if(!i||typeof i!="object"||!Array.isArray(i.items))throw new Error("Harness returned an invalid response for session.list");for(let e of i.items)if(!e||typeof e!="object"||typeof e.sessionId!="string"||!e.sessionId||typeof e.running!="boolean")throw new Error("Harness returned an invalid response for session.list");return i.items.find(e=>e.sessionId===t)?.running??!1}async adoptWorkspaceSession(t,o={}){return jx(this,t,o)}async workspaceId(t={}){let{workspace:o=this.#t,...i}=t,{items:e}=await this.rpc("workspace.list",{},3e4,i),a=e.find(r=>r.path===o);return a?a.workspaceId:(await this.rpc("workspace.create",{path:o},3e4,i)).workspace.workspaceId}async createSession(t={}){let{agentPreset:o,...i}=t;await this.ensureRunning(i);let a={workspaceId:await this.workspaceId(i)},A=o!==void 0?o:this.#r;return A!=null&&(a.agentPreset=A),(await this.rpc("session.create",a,3e4,i)).sessionId}async executeCommand(t,o,i={}){if(typeof t!="string"||!t)throw new TypeError("sessionId is required");if(typeof o!="string"||!o)throw new TypeError("command line is required");if(!this.#I){let e=new Error("Harness command execution is unavailable");throw e.code="commands-unavailable",e}try{return await this.#I(t,o,i)}catch(e){throw e?.failure&&typeof e.failure=="object"?new nn("commands.execute",e.failure):e}}async readSessionHistory(t,{maxMessages:o=50,beforeSeq:i,timeoutMs:e=1e4,...a}={}){if(typeof t!="string"||!t)throw new TypeError("sessionId is required");if(!Number.isSafeInteger(o)||o<1||i!==void 0&&(!Number.isSafeInteger(i)||i<0))throw new TypeError("Invalid history pagination");return this.rpc("session.history",{sessionId:t,maxMessages:o,...i===void 0?{}:{beforeSeq:i}},e,a)}async sessionExists(t,o={}){try{return await this.rpc("session.history",{sessionId:t,maxMessages:1},3e4,o),!0}catch(i){if(i instanceof nn&&i.code==="session-not-found")return!1;throw i}}async respondInteraction(t,o,i={}){if(typeof t!="string"||!t)throw new TypeError("rpcId is required");if(!o||typeof o!="object"||typeof o.ok!="boolean")throw new TypeError("A Harness RPC result is required");let e=AbortSignal.timeout(i.timeoutMs??3e4),a=i.signal?AbortSignal.any([i.signal,e]):e,A={type:"client-response",rpcId:t,result:o},r;if(this.#A)r=await qx(()=>this.#A.respond(A),a);else{let g=await this.#n(new URL("/api/respond",this.#e),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(A),signal:a});if(!g.ok)throw new Error(`Harness transport respond failed: HTTP ${g.status}`);r=await g.json()}if(r?.accepted===!0)return r;if(r?.accepted!==!1||r.reason!=="bad-response"&&r.reason!=="not-pending")throw new Error("Harness returned an invalid interaction response receipt");let s=r.reason;throw new lp(`interaction-${s}`,`Harness interaction response was rejected (${s})`)}async watchInteractions(t,{signal:o,onInteraction:i,onResolved:e,onOpen:a,ownership:A}={}){if(typeof t!="string"||!t)throw new TypeError("sessionId is required");if(!o||typeof o.addEventListener!="function")throw new TypeError("watchInteractions requires an AbortSignal");if(i!==void 0&&typeof i!="function")throw new TypeError("onInteraction must be a function");if(e!==void 0&&typeof e!="function")throw new TypeError("onResolved must be a function");if(a!==void 0&&typeof a!="function")throw new TypeError("onOpen must be a function");for(;!o.aborted;){try{await this.#P(t,{signal:o,onInteraction:i,onResolved:e,onOpen:a,ownership:A})}catch(r){if(o.aborted)return;console.warn(`[${this.#i}] Harness interaction stream disconnected:`,r.message)}if(o.aborted)return;try{await BE(this.#g,o)}catch{if(o.aborted)return;throw new Error("Harness interaction reconnect wait failed")}}}#m(t,o){let i=this.#C.get(t)??new Set;o.order=this.#E.nextOrder,this.#E.nextOrder+=1,i.add(o),this.#C.set(t,i)}#S(t,o){let i=this.#C.get(t);i?.delete(o),i?.size===0&&this.#C.delete(t);for(let[e,a]of this.#B)a.ownership===o&&this.#B.delete(e)}#Q(t){if(!t.control)return;let o=this.#u.get(t.control.owner);o||(o=new Map,this.#u.set(t.control.owner,o));let i=o.get(t.control.key)??new Set;i.add(t),o.set(t.control.key,i)}#y(t){if(!t.control)return;let o=this.#u.get(t.control.owner),i=o?.get(t.control.key);i?.delete(t),i?.size===0&&o.delete(t.control.key),o?.size===0&&this.#u.delete(t.control.owner)}#f(t,o){let i=zx(o);return i?[...this.#u.get(i.owner)?.get(i.key)??[]].filter(a=>a.sessionId===t).sort((a,A)=>a.order-A.order):[]}#b(t,o){return this.#f(t,o).find(i=>i.started&&i.active&&!i.completed&&i.turn!==null)??null}async#R(t,o,i){let e=this.#f(t,o);if(e.length===0)return null;try{let a=await this.rpc("session.history",{sessionId:t,maxMessages:50},3e4,i);this.#w(t,a.events??[])}catch(a){if(!(a instanceof nn)||a.code!=="session-not-found")throw a;for(let A of e)A.active=!1,A.completed=!0;return null}return this.#b(t,o)}async hasActiveTurn(t,o,i={}){if(typeof t!="string"||!t)throw new TypeError("sessionId is required");return!!await this.#R(t,o,i)}async stopActiveTurn(t,o,i={}){if(typeof t!="string"||!t)throw new TypeError("sessionId is required");let e=await this.#R(t,o,i);if(!e)return!1;if(e.stopRequested)return!0;if(this.#b(t,o)!==e)return!1;e.stopRequested=!0;try{if(this.#s){let a=this.#s({sessionId:t,expectedTurn:e.turn,promptRpcId:e.promptRpcId,action:"stop"});if(a&&typeof a.then=="function")throw new TypeError("controlExecutor must return synchronously");if(a!==void 0){if(typeof a!="boolean")throw new TypeError("controlExecutor must return a boolean or undefined");return a||(e.stopRequested=!1),a}}return await this.rpc("session.cancel",{sessionId:t,keepInbox:!0},3e4,i),!0}catch(a){if(this.#b(t,o)===e&&(e.stopRequested=!1),a instanceof nn&&a.code==="session-not-found")return!1;throw a}}async steerActiveTurn(t,o,i,e={}){if(typeof t!="string"||!t)throw new TypeError("sessionId is required");if(typeof o!="string"||!o.trim())throw new TypeError("Steering text is required");let a=await this.#R(t,i,e);if(!a||a.stopRequested||this.#b(t,i)!==a)return!1;if(this.#s){let A=this.#s({sessionId:t,expectedTurn:a.turn,promptRpcId:a.promptRpcId,action:"steer",text:o});if(A&&typeof A.then=="function")throw new TypeError("controlExecutor must return synchronously");if(A!==void 0){if(typeof A!="boolean")throw new TypeError("controlExecutor must return a boolean or undefined");return A}}return await this.rpc("session.prompt",{sessionId:t,mode:"steer",content:[{type:"text",text:o}],clientTimeZone:Intl.DateTimeFormat().resolvedOptions().timeZone},3e4,e),!0}#w(t,o){for(let i of this.#C.get(t)??[])$x(i,o)}async#D(t,o){let i=await this.rpc("session.history",{sessionId:t,maxMessages:50},3e4,{signal:o});this.#w(t,i.events??[])}#M(t,o,i){let e=this.#B.get(o);if(e&&this.#C.get(t)?.has(e.ownership))return e;let a=[...this.#C.get(t)??[]],A=a.filter(s=>s.active).sort((s,g)=>s.order-g.order);if(A.length>0)return{ownership:A[0],recovered:!1};let r=a.filter(s=>!s.started&&!s.completed).sort((s,g)=>s.order-g.order)[0]??null;return r?{ownership:r,recovered:!0}:null}async ask(t,o,i={}){typeof i=="number"&&(i={timeoutMs:i});let e=i.timeoutMs??6e5,a=i.signal,A=typeof i.onUpdate=="function"?i.onUpdate:null,r=i.progressMode==="all"?"all":"latest",s=typeof i.onArtifact=="function"?i.onArtifact:null,g=typeof i.onInteraction=="function"?i.onInteraction:void 0,c=typeof i.onInteractionResolved=="function"?i.onInteractionResolved:void 0,I=zx(i.control),d=Array.isArray(i.files)?i.files.filter(Boolean):[];await this.ensureRunning({signal:a});let B=await this.rpc("session.history",{sessionId:t,maxMessages:1},3e4,{signal:a}),f=Math.max(-1,...(B.events??[]).map(({event:J})=>J.seq??-1)),Q=`${this.#l}-${xM()}`,y=new Ip({promptRpcId:Q,afterSeq:f}),m=g||c?new AbortController:null,_=m?a?AbortSignal.any([a,m.signal]):m.signal:null,T=m||I?{sessionId:t,promptRpcId:Q,active:!1,started:!1,completed:!1,stopRequested:!1,turn:null,openTurn:null,lastSeq:f,reconnect:null,order:-1,toolCalls:new Map,control:I}:null,R=null,F=!1,j=0,U=null,z=!1,q=!1,x=async()=>{if(!s||F||y.turn===null)return j;F=!0;let J=dI.take(t,y.turn,{signal:a});for(let H of J)try{await s(H),j+=1}catch(N){dI.release(H),console.warn(`[${this.#i}] ignored an artifact handoff failure:`,N.message)}return j};T&&(this.#m(t,T),this.#Q(T));let G=dI.openConsumer(t,Q);try{if(d.length>0){if(!this.#d)throw new mo("inbound-file-ingress-unavailable","Harness file ingress is unavailable in this Host process.");let N=(await this.rpc("session.list",{},3e4,{signal:a}))?.items?.find(k=>k?.sessionId===t)?.cwd;U=await this.#d({sessionId:t,workspace:N,files:d,signal:a}),o=Dx(o,U)}if(_){let H,N=new Promise(k=>{H=k});R=this.watchInteractions(t,{signal:_,onInteraction:g,onResolved:c,onOpen:H,ownership:T}),R.catch(()=>{}),await Promise.race([N,BE(3e4,_).then(()=>{throw new Error("Harness interaction stream did not open within 30 seconds")})])}let J=typeof o=="string"?[{type:"text",text:o}]:o;if(!Array.isArray(J)||J.length===0)throw new TypeError("Harness prompt content is required");await this.rpc("session.prompt",{sessionId:t,mode:"queue",content:J,clientTimeZone:Intl.DateTimeFormat().resolvedOptions().timeZone},3e4,{rpcId:Q,signal:a}),z=!0;try{let H=Date.now()+e;for(;Date.now()0)return"";throw T?.stopRequested?Wx():Zx(y.reason)}throw new Jn("harness-reply-timeout")}catch(H){if(!T?.stopRequested)throw H;if(y.answer)return y.answer;throw H?.code==="turn-stopped"?H:Wx()}}finally{U&&(!z||q)&&await U.cleanup().catch(J=>{console.warn(`[${this.#i}] unable to clean inbound files:`,J.message)}),G(),T&&(this.#y(T),this.#S(t,T)),y.turn!==null&&dI.discard(t,y.turn),m?.abort(new DOMException("Harness turn finished","AbortError")),R&&await R.catch(()=>{})}}async#P(t,{signal:o,onInteraction:i,onResolved:e,onOpen:a,ownership:A}){let r=!1,s=null,g=Promise.resolve(),c=A==null,I=[],d=()=>{},B=m=>{d=m,A&&(A.reconnect=d);try{a?.()}catch(_){console.warn(`[${this.#i}] ignored an interaction open callback failure:`,_.message)}A&&this.#D(t,o).then(()=>{if(!r){c=!0;for(let _ of I.splice(0))Q(_)}}).catch(_=>{s??=_,d()})},f=(m,_)=>{m&&(g=g.then(()=>m(_)).catch(T=>{s??=T,d()}))},Q=m=>{let _=m.payload;if(A&&_.type==="session/event"){this.#w(t,[_.event]);return}if(_.type==="question/requested"||_.type==="approval/requested"){let T=_.type==="question/requested"?"question":"approval",R=T==="question"?m.rpcId:_.approvalId,F=`${T}:${R}`;if(A){let U=this.#M(t,F,T);if(U?.ownership!==A)return;this.#B.set(F,U)}let j=T==="approval"&&A&&typeof _.callId=="string"?this.#B.get(F)?.ownership.toolCalls.get(_.callId):void 0;f(i,Object.freeze({kind:T,interactionId:R,rpcId:m.rpcId,sessionId:t,payload:_,recovered:A?this.#B.get(F)?.recovered===!0:!1,...j?{toolCall:j}:{},reconnect:d,respond:(U,z={})=>this.respondInteraction(m.rpcId,U,{...z,signal:z.signal??o})}));return}if(_.type==="question/resolved"||_.type==="approval/resolved"){let T=_.type==="question/resolved"?"question":"approval",R=T==="question"?_.questionRpcId:_.approvalId,F=`${T}:${R}`;if(A){if(this.#B.get(F)?.ownership!==A)return;this.#B.delete(F)}f(e,Object.freeze({kind:T,interactionId:R,sessionId:t,outcome:_.outcome,payload:_}))}},y=m=>{try{let _=m?.payload;if(m?.type!=="server-request"||typeof m.rpcId!="string"||!_||typeof _!="object"||m.method!==_.type)throw new Error("invalid server-request envelope");if(_.sessionId!==t)return;c?Q(m):I.push(m)}catch(_){console.warn(`[${this.#i}] ignored a malformed Harness interaction frame:`,_.message)}};try{await this.#_({signal:o,onOpen:B,onEnvelope:y})}finally{r=!0,A?.reconnect===d&&(A.reconnect=null),o.aborted||await g}if(!o.aborted&&s)throw s}async watchHarnessEvents({signal:t,onSessionEvent:o,onReconnect:i}={}){if(typeof o!="function")throw new TypeError("watchHarnessEvents requires onSessionEvent");if(!t||typeof t.addEventListener!="function")throw new TypeError("watchHarnessEvents requires an AbortSignal");if(i!==void 0&&typeof i!="function")throw new TypeError("onReconnect must be a function");for(;!t.aborted;){try{await this.#_({signal:t,onOpen:()=>{try{i?.()}catch(e){console.warn(`[${this.#i}] mux reconnect hook failed:`,e.message)}},onEnvelope:e=>{try{let a=e?.payload;if(e?.type!=="server-request"||!a||typeof a!="object"||e.method!==a.type||a.type!=="session/event"||typeof a.sessionId!="string"||!a.event||typeof a.event!="object")return;o({sessionId:a.sessionId,event:a.event})}catch(a){console.warn(`[${this.#i}] ignored a malformed global mux frame:`,a.message)}}})}catch(e){if(t.aborted)return;console.warn(`[${this.#i}] Harness event mux disconnected:`,e.message)}if(t.aborted)return;try{await BE(this.#g,t)}catch{if(t.aborted)return;throw new Error("Harness event mux reconnect wait failed")}}}#_(t){return Jx({apiProxy:this.#A,baseUrl:this.#e,createWebSocket:this.#o,rpcId:`${this.#l}-${xM()}`,...t,onMalformed:o=>{console.warn(`[${this.#i}] ignored a malformed Harness mux frame:`,o.message)}})}stopManagedProcess(){this.#h?.exitCode===null&&this.#h.kill("SIGTERM")}};var Xf=class extends pr{constructor(t){super({...t,rpcIdPrefix:"dingtalk",logPrefix:"dsh-dingtalk"})}};import{randomUUID as Jde}from"node:crypto";import{mkdir as qde,readFile as zde,rename as Vde,unlink as Wde,writeFile as Zde}from"node:fs/promises";import{dirname as Xde}from"node:path";var $f=Object.freeze({version:1,sessions:{},seenMessageIds:[],pendingSenders:{}});function dr(n){return typeof n=="string"&&n.trim()?n.trim():null}function AY(n){return(dr(n)??D("\u9489\u9489\u7528\u6237")).slice(0,100)}function $de(n,t){if(!n||typeof n!="object")return null;let o=dr(n.requestId)??dr(t),i=dr(n.staffId),e=dr(n.requestedAt)??dr(n.lastSeenAt),a=dr(n.lastSeenAt)??e;return!o||!i||!e||!a?null:{requestId:o,staffId:i,displayName:AY(n.displayName??n.nick),requestedAt:e,lastSeenAt:a}}function ehe(n){if(!n||typeof n!="object")return structuredClone($f);let t={};if(n.sessions&&typeof n.sessions=="object"&&!Array.isArray(n.sessions))for(let[e,a]of Object.entries(n.sessions)){let A=dr(e),r=dr(a);A&&r&&(t[A]=r)}let o={},i=Array.isArray(n.pendingSenders)?n.pendingSenders.map(e=>[e?.requestId,e]):Object.entries(n.pendingSenders&&typeof n.pendingSenders=="object"?n.pendingSenders:{});for(let[e,a]of i){let A=$de(a,e);if(!A)continue;let r=Object.values(o).find(s=>s.staffId===A.staffId);(!r||r.lastSeenAtnew Date().toISOString()}={}){if(!dr(t))throw new TypeError("state path is required");if(typeof o!="function"||typeof i!="function")throw new TypeError("idFactory and now must be functions");this.#e=t,this.#r=o,this.#c=i}async load(){try{this.#A=ehe(JSON.parse(await zde(this.#e,"utf8")))}catch(t){if(t?.code!=="ENOENT")throw t;this.#A=structuredClone($f),await this.#a()}return this}sessionFor(t){return this.#A.sessions[t]??null}async setSession(t,o){let i=dr(t),e=dr(o);if(!i||!e)throw new TypeError("key and sessionId are required");this.#A.sessions[i]=e,await this.#a()}async clearSession(t){let o=dr(t);!o||!(o in this.#A.sessions)||(delete this.#A.sessions[o],await this.#a())}async clearSessions(){this.#A.sessions={},await this.#a()}hasSeen(t){let o=dr(t);return!!(o&&this.#A.seenMessageIds.includes(o))}async markSeen(t){let o=dr(t);if(!o)throw new TypeError("messageId is required");this.hasSeen(o)||(this.#A.seenMessageIds.push(o),this.#A.seenMessageIds.length>1e3&&this.#A.seenMessageIds.splice(0,this.#A.seenMessageIds.length-1e3),await this.#a())}pendingSenders(){return Object.values(this.#A.pendingSenders).sort((t,o)=>t.requestedAt.localeCompare(o.requestedAt)).map(t=>structuredClone(t))}pendingSender(t){let o=dr(t),i=o?this.#A.pendingSenders[o]:null;return i?structuredClone(i):null}async recordPendingSender(t,o,i){let e=t&&typeof t=="object"?t:{staffId:t,displayName:o,lastSeenAt:i},a=dr(e.staffId);if(!a)throw new TypeError("staffId is required");let A=dr(e.lastSeenAt)??dr(e.requestedAt)??this.#c(),r=Object.values(this.#A.pendingSenders).find(g=>g.staffId===a),s={requestId:r?.requestId??`ding_sender_${this.#r()}`,staffId:a,displayName:AY(e.displayName??e.nick??o),requestedAt:r?.requestedAt??A,lastSeenAt:A};return this.#A.pendingSenders[s.requestId]=s,await this.#a(),structuredClone(s)}async removePendingSender(t){let o=dr(t);return!o||!this.#A.pendingSenders[o]?!1:(delete this.#A.pendingSenders[o],await this.#a(),!0)}async removePendingSenderByStaffId(t){let o=dr(t),i=o?Object.values(this.#A.pendingSenders).find(e=>e.staffId===o):null;return i?this.removePendingSender(i.requestId):!1}snapshot(){return structuredClone(this.#A)}async remove(){await this.#t;try{await Wde(this.#e)}catch(t){if(t?.code!=="ENOENT")throw t}this.#A=structuredClone($f)}async#a(){let t=`${JSON.stringify(this.#A,null,2)} `,o=this.#t.then(async()=>{await qde(Xde(this.#e),{recursive:!0,mode:448});let i=`${this.#e}.tmp`;await Zde(i,t,{encoding:"utf8",mode:384}),await Vde(i,this.#e)});this.#t=o.then(()=>{},()=>{}),await o}};import{mkdir as Ahe,readFile as the,realpath as rhe,rename as ahe,stat as ihe,unlink as ohe,writeFile as nhe}from"node:fs/promises";import{dirname as she,isAbsolute as aY,resolve as fE}from"node:path";var J9e=Object.freeze({version:1,workspaces:Object.freeze({})});function hI(n){let t=new Error(n);return t.code=Ta,t}async function JM(n){return fE(await rhe(n))}async function ghe(n,t){if(n===t)return!0;try{return await JM(n)===await JM(t)}catch{return!1}}function va(n){if(typeof n!="string"||!/^[A-Za-z0-9_-]{1,128}$/.test(n))throw new TypeError("Invalid bot id");return n}function che(n){if(!n||n.version!==1||!n.workspaces||typeof n.workspaces!="object"||Array.isArray(n.workspaces))return null;let t={};for(let[e,a]of Object.entries(n.workspaces)){if(!/^[A-Za-z0-9_-]{1,128}$/.test(e)||typeof a!="string"||!aY(a))return null;t[e]=fE(a)}let o={};if(n.agentPresets!==void 0){if(!n.agentPresets||typeof n.agentPresets!="object"||Array.isArray(n.agentPresets))return null;for(let[e,a]of Object.entries(n.agentPresets)){if(!/^[A-Za-z0-9_-]{1,128}$/.test(e))return null;try{let A=op(a);if(!A)return null;o[e]=A}catch{return null}}}let i=Object.create(null);if(n.contextEnhancement&&typeof n.contextEnhancement=="object"&&!Array.isArray(n.contextEnhancement))for(let[e,a]of Object.entries(n.contextEnhancement))/^[A-Za-z0-9_-]{1,128}$/.test(e)&&(i[e]=sp(a));return{version:1,workspaces:t,agentPresets:o,contextEnhancement:i}}async function tY(n){if(typeof n!="string"||!n.trim()||!aY(n.trim())){let i=new Error("\u5DE5\u4F5C\u533A\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84\u3002");throw i.code="workspace-not-absolute",i}let t=fE(n.trim()),o;try{o=await ihe(t)}catch(i){let e=new Error("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u4E0D\u5B58\u5728\u3002",{cause:i});throw e.code="workspace-not-found",e}if(!o.isDirectory()){let i=new Error("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u5FC5\u987B\u6307\u5411\u4E00\u4E2A\u76EE\u5F55\u3002");throw i.code="workspace-not-directory",i}return t}var $r=class{#e;#A;#t={};#r={};#c={};#a=new Map;#n=1;#o=new Map;#g=1;#l=new Map;#i=new WeakMap;#I=new Set;#s=Promise.resolve();#p=new Map;constructor(t,{defaultWorkspace:o=process.cwd()}={}){if(typeof t!="string"||!t)throw new TypeError("workspace store path is required");this.#e=t,this.#A=fE(o)}async load(){try{let t=che(JSON.parse(await the(this.#e,"utf8")));if(!t)throw new Error("dsh-im workspace config is invalid");this.#t=t.workspaces,this.#r=t.agentPresets,this.#c=t.contextEnhancement}catch(t){if(t?.code!=="ENOENT")throw t;this.#t={},this.#r={},this.#c={}}this.#a.clear(),this.#n=1,this.#o.clear(),this.#g=1,this.#l.clear(),this.#I.clear();for(let t of Object.keys(this.#t))this.#a.set(t,this.#d()),this.#o.set(t,this.#h());return this}has(t){let o=va(t);return Object.hasOwn(this.#t,o)&&!this.#l.has(o)}incarnationFor(t){return this.#o.get(va(t))??null}workspaceFor(t){return this.#t[va(t)]??this.#A}agentPresetFor(t){return this.#r[va(t)]??null}contextEnhancementFor(t){let o=va(t);return this.has(o)&&Object.hasOwn(this.#c,o)?this.#c[o]:TM}generationFor(t){return this.#a.get(va(t))??null}async whenIdle(){await this.#s}async whenBotIdle(t){let o=va(t);for(;;){let i=this.#p.get(o);if(!i||(await i,this.#p.get(o)===i))return}}async ensure(t,{workspace:o=this.#A,defaultAgentPreset:i}={}){let e=va(t),a=fE(o);return this.#B(e,async()=>{if(this.#t[e])this.#a.has(e)||this.#a.set(e,this.#d());else{let A=op(i),r=Object.hasOwn(this.#r,e),s=this.#r[e];this.#t[e]=a,A&&(this.#r[e]=A),this.#a.set(e,this.#d()),this.#o.set(e,this.#h());try{await this.#u()}catch(g){throw delete this.#t[e],r?this.#r[e]=s:delete this.#r[e],this.#a.delete(e),this.#o.delete(e),g}}return this.#t[e]})}async setWorkspace(t,o,{clearSessions:i,incarnation:e}={}){let a=va(t);if(!this.has(a)||e!==void 0&&e!==this.incarnationFor(a)){let r=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw r.code="workspace-bot-not-found",r}let A=await tY(o);return this.#B(a,async()=>{if(!this.has(a)||e!==void 0&&e!==this.incarnationFor(a)){let s=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw s.code="workspace-bot-not-found",s}if(A===this.workspaceFor(a))return A;let r=this.#t[a];this.#a.set(a,this.#d()),await i?.(),this.#t[a]=A;try{await this.#u()}catch(s){throw this.#t[a]=r,s}return A})}async setAgentPreset(t,o,{incarnation:i}={}){let e=va(t);if(!this.has(e)||i!==void 0&&i!==this.incarnationFor(e)){let A=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw A.code="workspace-bot-not-found",A}let a=op(o);return this.#B(e,async()=>{if(!this.has(e)||i!==void 0&&i!==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 A=this.#r[e]??null;if(A===a)return a;a?this.#r[e]=a:delete this.#r[e];try{await this.#u()}catch(r){throw A?this.#r[e]=A:delete this.#r[e],r}return a})}async setContextEnhancement(t,o,{incarnation:i}={}){let e=va(t),a=i===void 0?this.incarnationFor(e):i,A=np(o);return this.#B(e,async()=>{if(!this.has(e)||a!==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]:A};return await this.#u(r),this.#c=r,A})}async bindWorkspaceSession(t,o,{conversationKey:i,sessionId:e,clearSessions:a,setSession:A,incarnation:r,expectedGeneration:s}={}){let g=va(t);if(typeof i!="string"||!i||typeof e!="string"||!e)throw new TypeError("conversationKey and sessionId are required");if(typeof a!="function"||typeof A!="function")throw new TypeError("session state callbacks are required");if(!this.has(g)||r!==void 0&&r!==this.incarnationFor(g)){let I=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw I.code="workspace-bot-not-found",I}let c=await JM(await tY(o));return this.#B(g,async()=>{if(!this.has(g)||r!==void 0&&r!==this.incarnationFor(g)){let I=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw I.code="workspace-bot-not-found",I}if(s!==void 0&&s!==this.generationFor(g))throw hI("The bot workspace changed before the session binding could be committed.");if(!await ghe(c,this.workspaceFor(g))){let I=this.#t[g];this.#a.set(g,this.#d()),await a(),this.#t[g]=c;try{await this.#u()}catch(d){throw this.#t[g]=I,d}}return await A(i,e),{workspace:c,sessionId:e,generation:this.#a.get(g)}})}async invalidateSessions(t,{clearSessions:o}={}){let i=va(t);return this.#B(i,async()=>{this.#a.set(i,this.#d()),await o?.()})}async beginRemoval(t,{clearSessions:o}={}){let i=va(t);return this.#B(i,async()=>{let e=this.#l.get(i);if(e)return e;let a=Object.freeze({});this.#l.set(i,a),this.#i.set(a,{botId:i,incarnation:this.incarnationFor(i)}),this.#a.set(i,this.#d());try{await o?.()}catch(A){throw this.#l.get(i)===a&&this.#l.delete(i),A}return a})}async abortRemoval(t){let{botId:o}=this.#E(t);return this.#B(o,async()=>this.#l.get(o)!==t?!1:(this.#l.delete(o),Object.hasOwn(this.#t,o)&&(this.#a.set(o,this.#d()),this.#o.has(o)||this.#o.set(o,this.#h())),!0))}async finishRemoval(t){let{botId:o,incarnation:i}=this.#E(t);return this.#B(o,async()=>this.#l.get(o)!==t?{removed:!1,persisted:!0,error:null,stale:!0}:this.incarnationFor(o)!==i?(this.#l.delete(o),{removed:!1,persisted:!0,error:null,stale:!0}):(this.#l.delete(o),this.#C(o)))}async retireAfterConfigCommit(t){let o=va(t);return this.#B(o,async()=>(this.#l.delete(o),this.#C(o)))}flushPendingRemoval(t){if(this.#I.has(t))return this.#B(t,async()=>{this.#I.has(t)&&await this.#m()})}async remove(t){let o=await this.retireAfterConfigCommit(t);if(o.error)throw o.error;return o.removed}async reconcile(t){let o=new Set([...t].map(va)),i=new Set([...Object.keys(this.#t),...Object.keys(this.#r),...Object.keys(this.#c),...this.#I]);for(let e of i)o.has(e)||await this.remove(e)}decorateStatus(t){return!t||typeof t!="object"||!Array.isArray(t.bots)?t:{...t,bots:t.bots.map(o=>o?.botId?{...o,workspace:this.workspaceFor(o.botId),agentPreset:this.agentPresetFor(o.botId),contextEnhancement:this.contextEnhancementFor(o.botId)}:o)}}#d(){let t=this.#n;return this.#n+=1,t}#h(){let t=this.#g;return this.#g+=1,t}#E(t){if(!t||typeof t!="object")throw new TypeError("Invalid workspace removal transaction");let o=this.#i.get(t);if(!o)throw new TypeError("Invalid workspace removal transaction");return o}async#C(t){let o=Object.hasOwn(this.#t,t),i=Object.hasOwn(this.#r,t),e=Object.hasOwn(this.#c,t),a=o||i||e||this.#I.has(t);if(delete this.#t[t],delete this.#r[t],delete this.#c[t],this.#a.delete(t),this.#o.delete(t),!a)return{removed:!1,persisted:!0,error:null,stale:!1};try{return await this.#m(),{removed:o,persisted:!0,error:null,stale:!1}}catch(A){return this.#I.add(t),{removed:o,persisted:!1,error:A,stale:!1}}}async#B(t,o){let i=this.#s.then(o,o),e=i.then(()=>{},()=>{});return this.#s=e,this.#p.set(t,e),e.finally(()=>{this.#p.get(t)===e&&this.#p.delete(t)}),i}async#u(t=this.#c){let o={version:1,workspaces:this.#t};Object.keys(this.#r).length>0&&(o.agentPresets=this.#r),Object.keys(t).length>0&&(o.contextEnhancement=t),await Ahe(she(this.#e),{recursive:!0,mode:448});let i=`${this.#e}.tmp`;await nhe(i,`${JSON.stringify(o,null,2)} `,{encoding:"utf8",mode:384}),await ahe(i,this.#e),this.#I.clear()}async#m(){if(Object.keys(this.#t).length>0||Object.keys(this.#r).length>0||Object.keys(this.#c).length>0){await this.#u();return}try{await ohe(this.#e),this.#I.clear()}catch(t){if(t?.code!=="ENOENT")throw t;this.#I.clear()}}};function AQ(n){if(!n)return null;let t=typeof n=="function"?n():n;return t&&typeof t.then=="function"?t.then(Hn):Hn(t)}function iY(){let n=new Error("Agent Preset \u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u7528\u3002");return n.code="agent-preset-unavailable",n}function pp(n){if(n())return;let t=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw t.code="workspace-bot-not-found",t}function rY(n,t,o){let i=e=>{let a=n.decorateStatus(e);if(!o||!a||typeof a!="object")return a;let A=s=>s?{...a,agentPresetCatalog:s}:a,r=AQ(o);return r&&typeof r.then=="function"?r.then(A):A(r)};return t&&typeof t.then=="function"?t.then(i):i(t)}function Ihe(n){return Promise.resolve(n.status())}function Pa(n,{workspaces:t,method:o="remove",botIdFromRemoved:i=A=>A?.botId,saveMethod:e="save",botIdFromSave:a=A=>A?.botId}){if(!n||!t||typeof n[o]!="function")throw new TypeError("configStore removal observer dependencies are required");return new Proxy(n,{get(A,r){let s=Reflect.get(A,r,A);return r===o?async(...g)=>{let c=await s.apply(A,g),I=c?i(c,g):null;return I&&await t.retireAfterConfigCommit(I),c}:r===e&&typeof s=="function"?(...g)=>{let c=t.flushPendingRemoval(a(g[0],g));return c?c.then(()=>s.apply(A,g)):s.apply(A,g)}:typeof s=="function"?s.bind(A):s}})}function Ga(n,{botId:t,workspaces:o,state:i,agentPresetCatalog:e}={}){if(!n||!o||!i)throw new TypeError("harness, workspaces, and state are required");let a=o.incarnationFor(t),A=()=>o.has(t)&&o.incarnationFor(t)===a,r=async(I=e)=>{let d;try{d=await AQ(I)??Hn(null)}catch(B){throw pp(A),B}return pp(A),{agentPreset:o.agentPresetFor(t),agentPresetCatalog:d}},s=new Map,g=new Proxy(n,{get(I,d){if(d==="agentPresetSettings")return async(f={})=>{f?.signal?.throwIfAborted(),pp(A);let Q=await r();return f?.signal?.throwIfAborted(),Q};if(d==="updateAgentPreset")return async(f,Q={})=>{Q?.signal?.throwIfAborted(),pp(A);let y=f==="--default"?null:op(f),m=null;if(y&&({agentPresetCatalog:m}=await r(),Q?.signal?.throwIfAborted(),!m.items.some(_=>_.id===y)))throw iY();if(await o.setAgentPreset(t,y,{incarnation:a}),pp(A),m)return{agentPreset:o.agentPresetFor(t),agentPresetCatalog:m};try{return await r()}catch(_){if(_?.code==="workspace-bot-not-found")throw _;return pp(A),{agentPreset:o.agentPresetFor(t),agentPresetCatalog:Hn(null)}}};if(d==="currentWorkspace")return()=>{if(!A()){let f=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw f.code="workspace-bot-not-found",f}return o.workspaceFor(t)};if(d==="assertWorkspaceScope")return()=>{if(!A()){let f=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw f.code="workspace-bot-not-found",f}};if((d==="listWorkspaces"||d==="listWorkspaceSessions"||d==="listModels")&&typeof I[d]=="function")return async(...f)=>{if(!A()){let y=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw y.code="workspace-bot-not-found",y}let Q=await I[d](...f);if(!A()){let y=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw y.code="workspace-bot-not-found",y}return Q};if(d==="switchWorkspace")return f=>{if(!A()){let Q=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");return Q.code="workspace-bot-not-found",Promise.reject(Q)}return o.setWorkspace(t,f,{clearSessions:()=>i.clearSessions(),incarnation:a})};if(d==="bindWorkspaceSession")return async(f,Q)=>{if(typeof f!="string"||!f||typeof Q!="string"||!Q)throw new TypeError("conversationKey and sessionId are required");if(!A()){let T=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw T.code="workspace-bot-not-found",T}if(typeof I.adoptWorkspaceSession!="function")throw new TypeError("Harness does not support adopting workspace sessions");let y=o.generationFor(t),m=await I.adoptWorkspaceSession(Q);if(!A()){let T=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw T.code="workspace-bot-not-found",T}if(y!==o.generationFor(t))throw hI("The bot workspace changed while the session was being adopted.");if(!m||typeof m!="object"||m.sessionId!==Q||typeof m.workspace!="string")throw new TypeError("Harness returned an invalid adopted workspace session");let _=await o.bindWorkspaceSession(t,m.workspace,{conversationKey:f,sessionId:Q,clearSessions:()=>i.clearSessions(),setSession:(T,R)=>i.setSession(T,R),incarnation:a,expectedGeneration:y});if(!A()){let T=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw T.code="workspace-bot-not-found",T}if(_.generation!==o.generationFor(t))throw hI("The bot workspace changed before the session binding completed.");return s.set(Q,_.generation),{...m,workspace:_.workspace,sessionId:_.sessionId}};if(d==="createSession")return async(f={})=>{if(await o.whenBotIdle(t),!A()){let _=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw _.code="workspace-bot-not-found",_}let Q=o.generationFor(t),y=o.agentPresetFor(t),m=await I.createSession({...f,workspace:o.workspaceFor(t),...y==null?{}:{agentPreset:y}});return s.set(m,Q),m};if(d==="workspaceSession")return f=>{if(typeof f!="string"||!f)throw new TypeError("sessionId is required");let Q=s.get(f)??o.generationFor(t);s.delete(f);let y=()=>A()&&Q===o.generationFor(t),m=async(T,R,F)=>{if(!y())throw hI(`The bot workspace changed before this ${F} started.`);let j=await I[T](f,...R);if(!y())throw hI(`The bot workspace changed while this ${F} was running.`);return j},_=async(T,R,F)=>{if(!y())throw hI(`The bot workspace changed before this ${F} started.`);return I[T](f,...R)};return Object.freeze({sessionId:f,async sessionExists(...T){if(!y())return!1;let R=await I.sessionExists(f,...T);return y()&&R},models(...T){return m("getSessionModels",T,"model listing")},readHistory(...T){return m("readSessionHistory",T,"history read")},selectModel(...T){return m("selectSessionModel",T,"model selection")},isRunning(...T){return m("isSessionRunning",T,"run-state check")},hasActiveTurn(...T){return m("hasActiveTurn",T,"turn ownership check")},stopActiveTurn(...T){return _("stopActiveTurn",T,"turn stop")},steerActiveTurn(...T){return _("steerActiveTurn",T,"turn steering")},ask(...T){if(!y())throw hI("The bot workspace changed before this prompt started.");return I.ask(f,...T)}})};if(d==="sessionExists")return(f,...Q)=>{if(!A())return!1;let y=s.get(f);return y!==void 0&&y!==o.generationFor(t)?(s.delete(f),!1):I.sessionExists(f,...Q)};if(d==="ask")return(f,...Q)=>{let y=s.get(f);if(s.delete(f),!A()||y!==void 0&&y!==o.generationFor(t)){let m=new Error("The bot workspace changed before this prompt started.");throw m.code=Ta,m}return I.ask(f,...Q)};if(d==="executeCommand"&&typeof I.executeCommand=="function")return(f,...Q)=>{let y=s.get(f);if(s.delete(f),!A()||y!==void 0&&y!==o.generationFor(t)){let m=new Error("The bot workspace changed before this command started.");throw m.code=Ta,m}return I.executeCommand(f,...Q)};let B=Reflect.get(I,d,I);return typeof B=="function"?B.bind(I):B}}),c=new Proxy(i,{get(I,d){if(d===iM)return I;if(d==="sessionFor")return(f,...Q)=>{if(!A())return null;let y=I.sessionFor(f,...Q);return y&&!s.has(y)&&s.set(y,o.generationFor(t)),y};if(d==="setSession")return(f,Q,...y)=>{let m=s.get(Q);return!A()||m!==void 0&&m!==o.generationFor(t)?(s.delete(Q),!1):I.setSession(f,Q,...y)};let B=Reflect.get(I,d,I);return typeof B=="function"?B.bind(I):B}});return Object.freeze({harness:g,state:c})}function Fa(n,{workspaces:t,stateFor:o,agentPresetCatalog:i}={}){if(!n||!t||typeof o!="function")throw new TypeError("controller, workspaces, and stateFor are required");let e=new Map,a=(I,d)=>{let f=(e.get(I)??Promise.resolve()).catch(()=>{}).then(d);return e.set(I,f),f.finally(()=>{e.get(I)===f&&e.delete(I)})},A=I=>rY(t,I,i),r=(I,d)=>{let B=t.incarnationFor(I);return a(I,async()=>{if(!(await n.status())?.bots?.some(y=>y?.botId===I)){let y=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw y.code="workspace-bot-not-found",y}let Q=await o(I);return await t.setWorkspace(I,d,{clearSessions:()=>Q.clearSessions(),incarnation:B}),A(await n.status())})},s=(I,d)=>{let B=t.incarnationFor(I),f=op(d);return a(I,async()=>{if(!(await n.status())?.bots?.some(m=>m?.botId===I)){let m=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw m.code="workspace-bot-not-found",m}let y=f&&i?await AQ(i):null;if(f&&i&&!y?.items.some(m=>m.id===f))throw iY();return await t.setAgentPreset(I,f,{incarnation:B}),rY(t,await n.status(),y??i)})},g=(I,d,B)=>{let f=t.incarnationFor(I),Q=np(d);return a(I,async()=>{let y=await n.status();if(!y?.bots?.some(F=>F?.botId===I)){let F=new Error("\u627E\u4E0D\u5230\u8981\u4FEE\u6539\u7684\u673A\u5668\u4EBA\u3002");throw F.code="workspace-bot-not-found",F}let m=await AQ(i),_=t.decorateStatus(y),T={..._,bots:_.bots.map(F=>F?.botId===I?{...F,contextEnhancement:Q}:F),...m?{agentPresetCatalog:m}:{}},R=B?await B(T):T;return await t.setContextEnhancement(I,Q,{incarnation:f}),R})},c=(I,d)=>a(I,async()=>{let B=await t.beginRemoval(I,{clearSessions:async()=>{try{let f=await o(I);if(!f||typeof f.clearSessions!="function")throw new TypeError("bot state does not support session cleanup");await f.clearSessions()}catch(f){console.warn(`[dsh-im] ignored session cleanup failure while deleting bot ${I}:`,f?.message??f)}}});try{let f=await d();return await t.finishRemoval(B),A(f)}catch(f){let Q=await Ihe(n).catch(()=>null);throw Array.isArray(Q?.bots)&&!Q.bots.some(m=>m?.botId===I)?await t.finishRemoval(B):await t.abortRemoval(B),f}});return new Proxy(n,{get(I,d){if(d==="updateWorkspace")return r;if(d==="updateAgentPreset")return s;if(d==="updateContextEnhancement")return g;let B=Reflect.get(I,d,I);return typeof B!="function"?B:d==="deleteBot"?(f,...Q)=>c(f,()=>B.call(I,f,...Q)):d==="disconnect"?async(...f)=>{let y=(await I.status())?.bots?.[0]?.botId;return y?c(y,()=>B.apply(I,f)):A(B.apply(I,f))}:(...f)=>A(B.apply(I,f))}})}var oY=Object.freeze([250,1e3,3e3,5e3,1e4,3e4]);function lhe(n){if(!Array.isArray(n)||n.length===0)return[...oY];let t=n.filter(o=>Number.isFinite(o)&&o>=0);return t.length>0?t:[...oY]}var tQ=class{#e;#A;#t;#r;#c;#a;#n;#o=null;#g=null;#l=0;#i=!1;#I=!1;#s;#p;constructor({controller:t,harness:o,logger:i=console,retryDelaysMs:e,healthyIntervalMs:a=15e3,setTimeoutImpl:A=setTimeout,clearTimeoutImpl:r=clearTimeout}){if(!t||typeof t.initialize!="function"||typeof t.status!="function")throw new TypeError("ConnectionSupervisor requires a controller");if(!o||typeof o.ensureRunning!="function")throw new TypeError("ConnectionSupervisor requires a Harness client");this.#e=t,this.#A=o,this.#t=i,this.#r=lhe(e),this.#c=Number.isFinite(a)&&a>=0?a:15e3,this.#a=A,this.#n=r,this.#s=new Promise(s=>{this.#p=s})}get ready(){return this.#s}start(){return this.#I||this.#i?this:(this.#I=!0,this.#d(0),this)}async close(){this.#i||(this.#i=!0,this.#o!==null&&this.#n(this.#o),this.#o=null,await this.#g?.catch(()=>{}),this.#p?.(null),this.#p=null)}#d(t){this.#i||(this.#o=this.#a(()=>{this.#o=null,this.#h()},t),this.#o?.unref?.())}async#h(){if(this.#i||this.#g)return;let t=this.#E();this.#g=t;try{await t}finally{this.#g===t&&(this.#g=null)}}async#E(){try{if(await this.#A.ensureRunning(),this.#i)return;let t=await this.#e.initialize();if(this.#i)return;this.#p?.(t),this.#p=null;let{configured:o,connected:i}=t.totals;if(i{let A={namespace:"commands",method:"execute",args:{agentId:i,line:e,images:[]},signal:a.signal};try{return await o.invoke(A)}catch(r){if(r?.name!=="TypertGatewayError"||r.code!=="arguments-invalid"||r.endpoint!=="commands/execute"||r.message!=='typert gateway: commands/execute: args fields do not match the descriptor: unexpected "images"')throw r;return a.signal?.throwIfAborted(),o.invoke({...A,args:{agentId:i,line:e}})}}}}import{randomUUID as zM}from"node:crypto";var rQ=new WeakMap;function phe(n){let t=n?.failure;return t&&typeof t=="object"&&typeof t.code=="string"&&typeof t.message=="string"?{code:t.code,message:t.message,details:t.details&&typeof t.details=="object"?t.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 sn(n,t){return Promise.resolve().then(t).then(o=>({rpcId:n.rpcId,result:{ok:!0,value:o}}),o=>({rpcId:n.rpcId,result:{ok:!1,error:phe(o)}}))}function nY(n,t,o,i){return{namespace:n,method:t,args:o,...i===void 0?{}:{signal:i}}}function aQ(n,t){let o=new Error(n);return o.name="UserQuestionError",o.code=t,o}function dhe(n,t){return!n||typeof n!="object"||n.sessionId!==t.sessionId||!n.answer||typeof n.answer!="object"||!Array.isArray(n.answer.answers)||n.answer.answers.length!==t.questions.length?!1:n.answer.answers.every((o,i)=>{let e=t.questions[i];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 a=o.custom?.trim();if(a!==void 0&&!a||e.multiSelect!==!0&&(a!==void 0&&o.selected.length>0||o.selected.length>1))return!1;let A=new Set(e.options?.map(r=>r.label)??[]);return o.selected.every(r=>A.has(r))})}function hhe(n){if(n?.type==="event"&&n.event&&typeof n.event=="object")return[{event:n.event}];let t=n?.type==="chunks"?n.event:null;if(!t||typeof t!="object")throw new Error("Harness returned an invalid session history record");let{data:o}=t,i=t.type,e=i==="chunkrow/tool-call-chunks"?o?.args:o?.texts;if(!o||!Array.isArray(e)||e.length===0||e.some(A=>typeof A!="string")||!Array.isArray(o.dt)||o.dt.length!==e.length-1)throw new Error("Harness returned an invalid packed session chunk");let a=t.time;return e.map((A,r)=>{r>0&&(a+=o.dt[r-1]);let s;if(i==="chunkrow/text-chunks")s={type:"text-delta",index:o.index,text:A};else if(i==="chunkrow/reasoning-chunks")s={type:"reasoning-delta",index:o.index,text:A};else if(i==="chunkrow/tool-call-chunks")s={type:"tool-call-delta",index:o.index,id:o.id,...Object.hasOwn(o,"name")?{name:o.name}:{},argumentsDelta:A};else throw new Error(`Harness returned an unsupported packed session chunk: ${String(i)}`);return{event:{type:"assistant/chunk",seq:t.seq+r,time:a,data:{turn:o.turn,step:o.step,chunk:s}}}})}function sY(n){if(!Array.isArray(n))throw new Error("Harness returned invalid session history records");return n.flatMap(hhe)}var VM=class{#e=[];#A=null;#t=!1;#r;#c;#a;constructor(t,o){this.#r=t,this.#a=o,this.#c=()=>this.close(),t?.addEventListener("abort",this.#c,{once:!0}),t?.aborted&&this.close()}push(t){if(!this.#t)if(this.#A){let o=this.#A;this.#A=null,o({value:t,done:!1})}else this.#e.push(t)}next(){return this.#e.length>0?Promise.resolve({value:this.#e.shift(),done:!1}):this.#t?Promise.resolve({value:void 0,done:!0}):new Promise(t=>{this.#A=t})}return(){return this.close(),Promise.resolve({value:void 0,done:!0})}close(){if(!this.#t&&(this.#t=!0,this.#r?.removeEventListener("abort",this.#c),this.#a?.(),this.#a=null,this.#A)){let t=this.#A;this.#A=null,t({value:void 0,done:!0})}}[Symbol.asyncIterator](){return this}},WM=class{#e;#A;#t=new Set;#r=new Map;#c=new Map;#a=new Map;#n=[];#o=!1;constructor(t,o,i){this.#e=o,this.#A=i,this.host=Object.freeze({describe:e=>sn(e,()=>({ready:!0,transport:"typert"}))}),this.workspace=Object.freeze({list:(e,a)=>sn(e,()=>this.#i(a)),create:(e,a)=>sn(e,()=>this.#g("workspace","create",{request:e.payload},a))}),this.sessions=Object.freeze({list:(e,a)=>sn(e,()=>this.#g("session","list",{_request:e.payload},a)),create:(e,a)=>sn(e,()=>this.#g("session","create",{request:e.payload},a)),history:(e,a)=>sn(e,()=>this.#s(e.payload,a)),prompt:(e,a)=>sn(e,()=>this.#g("session","prompt",{request:{requestId:e.rpcId,...e.payload}},a)),cancel:(e,a)=>sn(e,()=>this.#g("session","cancel",{request:{sessionId:e.payload.sessionId}},a)),models:(e,a)=>sn(e,()=>this.#h(e.payload.sessionId,a)),selectModel:(e,a)=>sn(e,()=>this.#g("session","selectModel",{request:e.payload},a))}),this.llm=Object.freeze({models:(e,a)=>sn(e,async()=>{let A=await this.#d(a);return{groups:A.groups,failures:A.failures}})}),this.events=Object.freeze({mux:(e,a)=>this.#E(a)}),this.respond=e=>Promise.resolve(this.#y(e)),typeof t?.on=="function"&&(this.#n.push(t.on("session/event",(e,a)=>{let A=e?.id;typeof A!="string"||!a||typeof a!="object"||(Number.isSafeInteger(a.seq)&&this.#p(A,a.seq),this.#C({type:"session/event",sessionId:A,event:a}))},{global:!0})),this.#n.push(t.on("approval/request",(e,a)=>this.#Q(e,a),{global:!0,prepend:!0})),this.#n.push(t.on("user-questions/request",(e,a)=>this.#m(e,a),{global:!0,prepend:!0})))}async#g(t,o,i,e){return this.#e.invoke(nY(t,o,i,e))}async#l(t,o,i,e){let a=new AbortController,A=e?AbortSignal.any([e,a.signal]):a.signal,r;try{r=(await this.#e.stream(nY(t,o,i,A)))[Symbol.asyncIterator]();let g=await r.next();if(g.done)throw new Error(`Harness ${t}.${o} stream ended before its baseline`);return g.value}finally{a.abort(new DOMException("Baseline received","AbortError")),await Promise.resolve(r?.return?.()).catch(()=>{})}}async#i(t){let o=await this.#l("workspace","follow",{},t);if(o?.type!=="baseline"||!o.value||typeof o.value!="object")throw new Error("Harness workspace.follow returned no baseline");return o.value}async#I(t,o,i){let e=await this.#l("session","follow",{request:{address:{kind:"session",sessionId:t},maxMessages:o}},i);if(e?.type!=="snapshot"||!Number.isSafeInteger(e.cursor))throw new Error("Harness session.follow returned no snapshot");return this.#p(t,e.cursor),e}async#s(t,o){let{sessionId:i,maxMessages:e=50,beforeSeq:a}=t,A=this.#a.get(i);if(A===void 0){let s=await this.#I(i,e,o);if(A=this.#a.get(i)??s.cursor,a===void 0&&A===s.cursor)return{events:sY(s.records),hasMore:s.hasMore===!0,...s.projections===void 0?{}:{projections:s.projections}}}let r=await this.#g("session","page",{request:{address:{kind:"session",sessionId:i},throughSeq:A,maxMessages:e,...a===void 0?{}:{beforeSeq:a}}},o);return{events:sY(r.records),hasMore:r.hasMore===!0}}#p(t,o){let i=this.#a.get(t);(i===void 0||o>i)&&this.#a.set(t,o)}#d(t){return this.#g("session","modelCatalog",{},t)}async#h(t,o){let[i,e]=await Promise.all([this.#d(o),this.#g("session","list",{_request:{}},o)]),a=e?.items?.find(s=>s?.sessionId===t);if(!a){let s=new Error(`session "${t}" not found`);throw s.failure={code:"session-not-found",message:s.message,details:{sessionId:t}},s}let A=a.projections?.values?.modelSelection,r=A?.next??A?.lastUsed??i.default;return{current:r,routable:i.routableProviders.includes(r.provider),groups:i.groups,failures:i.failures}}#E(t){let o;o=new VM(t,()=>this.#t.delete(o)),this.#t.add(o);for(let i of this.#r.values())o.push(this.#u(i));for(let i of this.#c.values())o.push(this.#S(i));return o}#C(t,o=zM()){let i={rpcId:o,payload:t};for(let e of this.#t)e.push(i)}#B(t){let o=t?.session?.id??t?.id;return typeof o!="string"||!t?.session||!Array.isArray(t.session.events)?null:eY(this.#A,o,t.session.events)?{sessionId:o,session:t.session}:null}#u(t){return{rpcId:t.rpcId,payload:{type:"question/requested",sessionId:t.sessionId,questions:t.questions}}}#m(t,o){let i=this.#B(t?.agent);return i?t.signal?.aborted?Promise.reject(aQ("ask_user_question was aborted before the user answered","ASK_ABORTED")):new Promise((e,a)=>{let A={rpcId:zM(),sessionId:i.sessionId,questions:t.questions,signal:t.signal,settle:(s,g)=>{this.#r.delete(A.rpcId)&&(t.signal?.removeEventListener("abort",r),this.#C({type:"question/resolved",sessionId:A.sessionId,questionRpcId:A.rpcId,outcome:s}),s==="answered"?e(g):a(g))}},r=()=>A.settle("cancelled",aQ("ask_user_question was aborted before the user answered","ASK_ABORTED"));this.#r.set(A.rpcId,A),t.signal?.addEventListener("abort",r,{once:!0}),this.#C(this.#u(A).payload,A.rpcId)}):o()}#S(t){return{rpcId:t.rpcId,payload:{type:"approval/requested",sessionId:t.sessionId,approvalId:t.approvalId,toolName:t.toolName,...t.callId===void 0?{}:{callId:t.callId},...t.reason===void 0?{}:{reason:t.reason}}}}#Q(t,o){let i=this.#B(t?.agent);if(!i)return o();if(t.signal?.aborted)return Promise.resolve("cancelled");let e=new Set([...this.#c.values()].map(r=>r.approvalId)),a=new Set,A;for(let r=i.session.events.length-1;r>=0;r-=1){let s=i.session.events[r];if(s.type==="approval/decided")a.add(s.data?.id);else if(s.type==="approval/asked"){let g=s.data?.id;if(!g||a.has(g)||e.has(g)||(t.callId??null)!==(s.data?.callId??null))continue;A=g;break}}return A===void 0?o():new Promise(r=>{let s={rpcId:zM(),sessionId:i.sessionId,approvalId:A,toolName:t.toolName,callId:t.callId,reason:t.reason,settle:c=>{this.#c.delete(s.rpcId)&&(t.signal?.removeEventListener("abort",g),this.#C({type:"approval/resolved",sessionId:s.sessionId,approvalId:s.approvalId,outcome:c}),r(c))}},g=()=>s.settle("cancelled");this.#c.set(s.rpcId,s),t.signal?.addEventListener("abort",g,{once:!0}),this.#C(this.#S(s).payload,s.rpcId)})}#y(t){let o=this.#c.get(t?.rpcId);if(o){let a=t?.result?.value;return t?.result?.ok!==!0||!a||typeof a!="object"||a.sessionId!==o.sessionId||a.approvalId!==o.approvalId||a.outcome!=="allowed-once"&&a.outcome!=="rejected"?{accepted:!1,reason:"bad-response"}:(o.settle(a.outcome),{accepted:!0})}let i=this.#r.get(t?.rpcId);if(!i)return{accepted:!1,reason:"not-pending"};if(t?.result?.ok!==!0)return t?.result?.error?.code!=="cancelled"?{accepted:!1,reason:"bad-response"}:(i.settle("cancelled",aQ("the user cancelled ask_user_question","ASK_CANCELLED")),{accepted:!0});if(!dhe(t.result.value,i))return{accepted:!1,reason:"bad-response"};let e={answers:t.result.value.answer.answers.map(a=>({id:a.id,selected:[...a.selected],...a.custom===void 0?{}:{custom:a.custom}}))};return i.settle("answered",e),{accepted:!0}}dispose(){if(!this.#o){this.#o=!0;for(let t of[...this.#t])t.close();for(let t of[...this.#c.values()])t.settle("cancelled");for(let t of[...this.#r.values()])t.settle("cancelled",aQ("dsh-im interaction adapter was disposed","ASK_ABORTED"));for(let t of this.#n.splice(0).reverse())t?.()}}};function gY(n){let t=n?.root??n;if(!t||!["object","function"].includes(typeof t))throw new TypeError("dsh-im requires a Cordis Host context");let o=rQ.get(t);if(o)return o;let i=n?.typertGateway;if(!i||typeof i.invoke!="function"||typeof i.stream!="function")throw new TypeError("dsh-im requires the modern Host Typert gateway");let e=new WM(n,i,t);return rQ.set(t,e),typeof n.effect=="function"&&n.effect(()=>()=>{rQ.get(t)===e&&rQ.delete(t),e.dispose()},"dsh-im: modern Harness compatibility API"),e}function Ehe(n,t){return n&&Object.hasOwn(n,t)?n[t]:typeof n?.get=="function"?n.get(t):void 0}function ea(n,t={}){return t.harnessBaseUrl!==void 0?{baseUrl:new URL(t.harnessBaseUrl)}:{apiProxy:Ehe(n,"apiProxy")??gY(n),interactionScope:n.root??n}}import{randomUUID as Che}from"node:crypto";function uhe(n){if(typeof n?.get!="function")return;let t;try{t=n.get("agents")}catch{return}if(t!=null){if(typeof t.get!="function")throw new TypeError('dsh-im requires a callable AgentRegistry when ctx.get("agents") is present');return t}}function Bhe(n,t,o){if(n?.status!=="running")return!1;let i=n?.session?.events;if(!Array.isArray(i))return!1;let e=null,a=!1;for(let A of i){if(A?.type==="turn/start"){e=A.data?.turn??null,a=!1;continue}if(A?.type==="turn/end"&&A.data?.turn===e){e=null,a=!1;continue}e===t&&A?.type==="user/message"&&A.data?.source?.rpcId===o&&(a=!0)}return e===t&&a}function cY(n){if(!n||typeof n!="object"||Object.isFrozen(n))return n;for(let t of Object.values(n))cY(t);return Object.freeze(n)}function fhe(n){return cY({id:Che(),role:"user",content:[{type:"text",text:n}],source:{kind:"user"}})}function Qhe(n){let t=new Error("Session is busy with an active turn or maintenance task",{cause:n});return t.code="agent-busy",t}function yhe(n){return({sessionId:t,expectedTurn:o,promptRpcId:i,action:e,text:a})=>{let A=n.get(t);if(A){if(!Bhe(A,o,i))return!1;if(e==="stop")return A.cancel({kind:"user"},{keepInbox:!0}),!0;if(e==="steer")return typeof a!="string"||!a.trim()?!1:(A.inject(fhe(a)),!0);throw new TypeError(`Unsupported Harness control action: ${String(e)}`)}}}function mhe(n){return({sessionId:t,operation:o})=>{if(typeof o!="function")throw new TypeError("maintenance operation is required");let i=n.get(t);if(!i)return o();try{return i.runMaintenance(e=>{if(n.get(t)!==i){let a=new Error("Session agent changed before maintenance started");throw a.code="agent-unavailable",a}return o(e)})}catch(e){throw Qhe(e)}}}function She(n){return({sessionId:t,workspace:o,files:i,signal:e})=>{let A=n.get(t)?.session?.header?.cwd,r=typeof A=="string"&&A?A:o;if(typeof r!="string"||!r)throw new mo("inbound-file-workspace-unavailable","The Harness Session workspace is unavailable for inbound files.");return Sx({files:i},{workspace:r,signal:e})}}function Ua(n,t={}){let{controlExecutor:o,sessionMaintenanceExecutor:i,fileIngressExecutor:e}=t;if(o!==void 0&&typeof o!="function")throw new TypeError("controlExecutor must be a function");if(i!==void 0&&typeof i!="function")throw new TypeError("sessionMaintenanceExecutor must be a function");if(e!==void 0&&typeof e!="function")throw new TypeError("fileIngressExecutor must be a function");let a=o&&i&&e?void 0:uhe(n);return{controlExecutor:o??(a?yhe(a):void 0),sessionMaintenanceExecutor:i??(a?mhe(a):void 0),fileIngressExecutor:e??She(a??{get:()=>{}})}}function Ohe(n){let t=EI(n.dshHome??process.env.DSH_HOME??QE(whe(),".dsh")),o=EI(n.dataDir??QE(t,"integrations","dsh-dingtalk"));return{root:o,config:EI(n.configPath??QE(o,"config.json")),bots:EI(n.botsDir??QE(o,"bots")),workspaces:EI(n.workspacesPath??QE(o,"workspaces.json"))}}async function ZM(n,t={},o={}){if(!n?.credentials)throw new TypeError("dsh-dingtalk requires ctx.credentials");let i=ea(n,t),e=o.ConfigStore??kf,a=o.DeviceAuth??Pf,A=o.StateStore??eQ,r=o.HarnessClient??Xf,s=o.Controller??nE,g=o.Runtime??EE,c=o.createConnectionSupervisor??qM,I=typeof n.logger=="function"?n.logger("dsh-dingtalk"):n.logger??console,d=()=>Na(n),B=Ohe(t),f=await new e(B.config).load(),Q=EI(t.workspace??process.cwd()),y=o.WorkspaceStore??$r,m=o.workspaces??await new y(B.workspaces,{defaultWorkspace:Q}).load(),_=typeof f.list=="function",T=_?f.list():[];_&&await m.reconcile(T.map(te=>te.botId)),await Promise.all(T.map(te=>m.ensure(te.botId,{defaultAgentPreset:t.agentPreset})));let R=typeof f.remove=="function"?Pa(f,{workspaces:m}):f,F=o.deviceAuth??new a({baseUrl:t.registrationBaseUrl}),j=new Map,U=te=>EI(B.bots,te,"state.json"),z=async te=>{let ie=j.get(te);return ie||(ie=await new A(U(te)).load(),j.set(te,ie)),ie},q=La(n,o.commandExecutor),{controlExecutor:x,sessionMaintenanceExecutor:G,fileIngressExecutor:J}=Ua(n,{controlExecutor:o.controlExecutor,sessionMaintenanceExecutor:o.sessionMaintenanceExecutor,fileIngressExecutor:o.fileIngressExecutor}),H=new r({...i,workspace:Q,autostart:!1,dshBin:t.dshBin??"dsh",...q?{commandExecutor:q}:{},...x?{controlExecutor:x}:{},...G?{sessionMaintenanceExecutor:G}:{},...J?{fileIngressExecutor:J}:{}}),N=new s({deviceAuth:F,credentials:n.credentials,configStore:R,logger:I,createRuntime:async({botId:te,config:ie,clientSecret:we})=>{let se=await z(te);await m.ensure(te,{defaultAgentPreset:t.agentPreset});let Ne=Ga(H,{botId:te,workspaces:m,state:se,agentPresetCatalog:d});return new g({config:ie,clientSecret:we,harness:Ne.harness,state:Ne.state,contextEnhancement:{botId:te,getSettings:()=>m.contextEnhancementFor(te)},replyTimeoutMs:t.replyTimeoutMs??6e5,maxMessageChars:t.maxMessageChars??4e3,connectTimeoutMs:t.connectTimeoutMs??15e3,logger:{error:(...fe)=>I.error?.(`[${te}]`,...fe),warn:(...fe)=>I.warn?.(`[${te}]`,...fe),info:(...fe)=>I.info?.(`[${te}]`,...fe),debug:(...fe)=>I.debug?.(`[${te}]`,...fe)}})},deleteState:async({botId:te})=>{let ie=j.get(te);if(j.delete(te),ie&&typeof ie.remove=="function")await ie.remove();else try{await Dhe(U(te))}catch(we){if(we?.code!=="ENOENT")throw we}}}),k=Fa(N,{workspaces:m,stateFor:z,agentPresetCatalog:d}),V=c({controller:k,harness:H,logger:I,retryDelaysMs:t.retryDelaysMs,healthyIntervalMs:t.healthyIntervalMs}).start();return{controller:k,ready:V.ready,async close(){await V.close(),await k.close(),H.stopManagedProcess()}}}import The from"qrcode";var Qi="bot.context-enhancement.set";function Ha(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:(np(n.config),!0)}catch{return!1}}var bhe=new Set(["loopback","trusted-host"]);function Or(n){if(n===void 0)return"loopback";if(bhe.has(n))return n;throw new TypeError('dsh-im rpcAuthority must be "loopback" or "trusted-host"')}import{isAbsolute as Mhe}from"node:path";var yi="bot.workspace.set";function Ka(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)&&Object.keys(n).every(t=>["botId","workspace"].includes(t))&&typeof n.botId=="string"&&/^[A-Za-z0-9_-]{1,128}$/.test(n.botId)&&typeof n.workspace=="string"&&n.workspace.length<=4096&&Mhe(n.workspace.trim())}function xa(n){return["workspace-not-absolute","workspace-not-found","workspace-not-directory","workspace-bot-not-found","agent-preset-invalid","agent-preset-unavailable","context-enhancement-invalid"].includes(n?.code)?{code:n.code,message:n.message}:null}var mi="bot.preset.set";function _he(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function Ya(n){return _he(n)&&Object.keys(n).every(t=>["botId","agentPreset"].includes(t))&&typeof n.botId=="string"&&/^[A-Za-z0-9_-]{1,128}$/.test(n.botId)&&(n.agentPreset===null||typeof n.agentPreset=="string"&&wM.test(n.agentPreset))}var lY="/dingtalk",Ht=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:yi,setAgentPreset:mi,setContextEnhancement:Qi,approveSender:"bot.sender.approve",revokeSender:"bot.sender.revoke"}),pY=Object.freeze(Object.values(Ht)),Nhe=new Set(["clientSecret","client_secret","deviceCode","device_code","secretRef","staffId","senderStaffId","verificationUrl","verificationUri","userCode"]);function $M(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function Zg(n,t){return $M(n)&&Object.keys(n).every(o=>t.includes(o))}function CI(n){return typeof n=="string"&&/^[A-Za-z0-9_-]{1,128}$/.test(n)}function IY(n,t){return typeof n=="string"&&n.trim().length>0&&n.length<=t}function Rhe(n,t){return $M(t)?n===Ht.status?Zg(t,[])?null:"connection.status does not accept fields.":n===Ht.beginProvisioning?Zg(t,["locale"])&&(t.locale===void 0||t.locale==="zh-CN")?null:"provision.begin received unsupported fields.":[Ht.pollProvisioning,Ht.cancelProvisioning].includes(n)?Zg(t,["attemptId"])&&CI(t.attemptId)?null:`${n} requires an attemptId.`:n===Ht.bindCredentials?Zg(t,["clientId","clientSecret"])&&IY(t.clientId,256)&&IY(t.clientSecret,1024)?null:"bot.bind-credentials requires Client ID and Client Secret.":n===Ht.reconnectBot?Zg(t,["botId","sendTest"])&&CI(t.botId)&&(t.sendTest===void 0||t.sendTest===!0)?null:"bot.reconnect requires a botId and optional sendTest=true.":n===Ht.deleteBot?Zg(t,["botId","confirm"])&&CI(t.botId)&&t.confirm===!0?null:"bot.delete requires a botId and confirm=true.":n===Ht.setWorkspace?Ka(t)?null:"\u8BF7\u8F93\u5165\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84\u3002":n===Ht.setAgentPreset?Ya(t)?null:"\u8BF7\u9009\u62E9 Agent Preset\u3002":n===Ht.setContextEnhancement?Ha(t)?null:"\u8BF7\u63D0\u4EA4\u6709\u6548\u7684\u4E0A\u4E0B\u6587\u589E\u5F3A\u8BBE\u7F6E\u3002":n===Ht.approveSender?Zg(t,["botId","requestId","confirm"])&&CI(t.botId)&&CI(t.requestId)&&t.confirm===!0?null:"bot.sender.approve requires botId, requestId, and confirm=true.":n===Ht.revokeSender?Zg(t,["botId","senderKey","confirm"])&&CI(t.botId)&&CI(t.senderKey)&&t.confirm===!0?null:"bot.sender.revoke requires botId, senderKey, and confirm=true.":"Unknown DingTalk endpoint.":"Payload must be an object."}function iQ(n){return{ok:!1,error:{code:"bad-request",message:n}}}function yE(){return{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}}function khe(){return{ok:!1,error:{code:"dingtalk-operation-failed",message:"\u9489\u9489\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"}}}function dp(n){if(Array.isArray(n))return n.map(dp);if(!$M(n))return n;let t={};for(let[o,i]of Object.entries(n))Nhe.has(o)||(t[o]=dp(i));return t}async function vhe(n){return The.toDataURL(n,{type:"image/png",errorCorrectionLevel:"M",margin:2,width:320})}async function XM(n,t){return!n||typeof n.verificationUrl!="string"?dp(n):dp({...n,qrCodeDataUrl:await t(n.verificationUrl)})}async function Xs(n,t){let o=structuredClone(n);return o?.provisioning&&(o.provisioning=await XM(o.provisioning,t)),dp(o)}function Phe(n){for(let t of["status","startProvisioning","registrationStatus","cancelProvisioning","bindCredentials","reconnectBot","deleteBot","approveSender","revokeSender"])if(typeof n?.[t]!="function")throw new TypeError(`A complete DingTalk controller is required (${t})`)}function dY(n,{encodeQr:t=vhe}={}){Phe(n);let o=new Map,i=e=>{let a=o.get(e);return a||(o.size>=16&&o.delete(o.keys().next().value),a=Promise.resolve().then(()=>t(e)),o.set(e,a)),a};return async(e,a,A)=>{if(A?.aborted)return yE();if(!pY.includes(e))return iQ("Unknown DingTalk endpoint.");let r=Rhe(e,a);if(r)return iQ(r);try{let s;if(e===Ht.status)s=await Xs(await n.status(),i);else if(e===Ht.beginProvisioning){let g=await n.startProvisioning({signal:A});if(A?.aborted)return await n.cancelProvisioning(g.attemptId),yE();s=await XM(g,i)}else if(e===Ht.pollProvisioning){let g=await n.registrationStatus(a.attemptId);if(!g)return iQ("The provisioning attempt no longer exists.");s=await XM(g,i)}else if(e===Ht.cancelProvisioning){if(s=await n.cancelProvisioning(a.attemptId),!s)return iQ("The provisioning attempt no longer exists.");s=dp(s)}else if(e===Ht.bindCredentials)s=await Xs(await n.bindCredentials(a),i);else if(e===Ht.reconnectBot){let g=await n.reconnectBot(a.botId);if(A?.aborted)return yE();let c;if(a.sendTest===!0)if(!g?.bots?.some(d=>d?.botId===a.botId&&d?.connected===!0)||typeof n.sendConnectionTest!="function")c=ir(lr("\u9489\u9489\u673A\u5668\u4EBA"));else try{await n.sendConnectionTest(a.botId),c=ir()}catch(d){c=ir(d)}s=await Xs({...g,...c?{testMessage:c}:{}},i)}else if(e===Ht.deleteBot)s=await Xs(await n.deleteBot(a.botId),i);else if(e===Ht.setWorkspace){if(typeof n.updateWorkspace!="function")throw new Error("Workspace update is unavailable");s=await Xs(await n.updateWorkspace(a.botId,a.workspace),i)}else if(e===Ht.setContextEnhancement){if(typeof n.updateContextEnhancement!="function")throw new Error("Context enhancement update is unavailable");s=await n.updateContextEnhancement(a.botId,a.config,g=>Xs(g,i))}else if(e===Ht.setAgentPreset){if(typeof n.updateAgentPreset!="function")throw new Error("Agent preset update is unavailable");s=await Xs(await n.updateAgentPreset(a.botId,a.agentPreset),i)}else e===Ht.approveSender?s=await Xs(await n.approveSender(a.botId,a.requestId),i):s=await Xs(await n.revokeSender(a.botId,a.senderKey),i);return A?.aborted?yE():{ok:!0,value:s}}catch(s){let g=xa(s);return A?.aborted?yE():g?{ok:!1,error:g}:khe()}}}function oQ(n,t,o,i){if(!n?.connection?.rpc||typeof n.connection.rpc.handle!="function")throw new TypeError("DSH Host Connection RPC is required");return n.connection.rpc.handle(lY,dY(t,o),{authority:Or(i)})}async function hY(n,t={}){if(t?.controller)return oQ(n,t.controller,t.rpcOptions,t.rpcAuthority);let o=await ZM(n,t,t.internals),i=oQ(n,o.controller,t.rpcOptions,t.rpcAuthority);return n.effect(()=>async()=>{await o.close()},"dsh-dingtalk: close bot connections"),i}import{createHash as Ghe}from"node:crypto";import{mkdir as Fhe,readFile as Lhe,rename as Uhe,unlink as Hhe,writeFile as Khe}from"node:fs/promises";import{dirname as xhe}from"node:path";var e_=Object.freeze({version:1,bots:Object.freeze([])});function $s(n){return typeof n=="string"&&n.trim()?n.trim():null}function EY(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function mE(n,{botPrefix:t,tokenRefPrefix:o}){let i=$s(n);if(!i)throw new TypeError("platformId is required");let e=Ghe("sha256").update(i).digest("hex").slice(0,24);return{botId:`${t}_${e}`,tokenRef:`${o}_${e.toUpperCase()}`}}function nQ(n,t){let o=$s(n)??"";return o.length<=10?o?`${o.slice(0,3)}\u2022\u2022\u2022`:t:`${o.slice(0,6)}\u2022\u2022\u2022\u2022${o.slice(-4)}`}var hp=class{#e;#A;#t;#r;#c;#a;#n;#o=e_;#g=Promise.resolve();constructor(t,{channel:o,botPrefix:i,tokenRefPrefix:e,normalizeBotExtension:a=()=>({})}){if(typeof a!="function")throw new TypeError("normalizeBotExtension must be a function");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=new RegExp(`^${EY(i)}_[a-f0-9]{24}$`),this.#n=new RegExp(`^${EY(e)}_[A-F0-9]{24}$`)}async load(){try{let t=this.#i(JSON.parse(await Lhe(this.#e,"utf8")));if(!t)throw new Error(`dsh-im ${this.#A} config contains invalid bot data`);this.#o=t}catch(t){if(t?.code!=="ENOENT")throw t;this.#o=e_}return this}list(){return structuredClone(this.#o.bots)}get(t){let o=this.#o.bots.find(i=>i.botId===t);return o?structuredClone(o):null}getByPlatformId(t){let o=this.#o.bots.find(i=>i.platformId===t);return o?structuredClone(o):null}async save(t){let o=this.#l(t);if(!o)throw new Error(`Refusing to persist incomplete ${this.#A} bot data`);return this.#I(i=>{let e=i.find(r=>r.platformId===o.platformId&&r.botId!==o.botId),a=i.find(r=>r.tokenRef===o.tokenRef&&r.botId!==o.botId);if(e||a)throw new Error(`Duplicate ${this.#A} bot identity`);let A=i.findIndex(r=>r.botId===o.botId);return A===-1?i.push(o):i[A]=o,structuredClone(o)})}async remove(t){if(!this.#a.test(t))throw new TypeError(`Invalid ${this.#A} bot id`);return this.#I(o=>{let i=o.findIndex(a=>a.botId===t);if(i===-1)return null;let[e]=o.splice(i,1);return structuredClone(e)})}async clear(){let t=this.#g.then(async()=>{try{await Hhe(this.#e)}catch(o){if(o?.code!=="ENOENT")throw o}this.#o=e_});this.#g=t.then(()=>{},()=>{}),await t}#l(t){if(!t||typeof t!="object")return null;let o=$s(t.platformId),i=$s(t.botId),e=$s(t.tokenRef),a=$s(t.name);if(!o||!i||!e||!a||!this.#a.test(i)||!this.#n.test(e))return null;let A=mE(o,{botPrefix:this.#t,tokenRefPrefix:this.#r});if(A.botId!==i||A.tokenRef!==e)return null;let r=this.#c(t);return!r||typeof r!="object"||Array.isArray(r)?null:Object.freeze({botId:i,platformId:o,tokenRef:e,name:a,username:$s(t.username),createdAt:$s(t.createdAt)??new Date().toISOString(),connectedAt:$s(t.connectedAt),...r})}#i(t){if(!t||t.version!==1||!Array.isArray(t.bots))return null;let o=t.bots.map(A=>this.#l(A));if(o.some(A=>A===null))return null;let i=new Set,e=new Set,a=new Set;for(let A of o){if(i.has(A.botId)||e.has(A.platformId)||a.has(A.tokenRef))return null;i.add(A.botId),e.add(A.platformId),a.add(A.tokenRef)}return Object.freeze({version:1,bots:Object.freeze(o)})}async#I(t){let o,i=this.#g.then(async()=>{let e=[...this.#o.bots];o=t(e);let a=Object.freeze({version:1,bots:Object.freeze(e)});await this.#s(a),this.#o=a});return this.#g=i.then(()=>{},()=>{}),await i,o}async#s(t){await Fhe(xhe(this.#e),{recursive:!0,mode:448});let o=`${this.#e}.tmp`;await Khe(o,`${JSON.stringify(t,null,2)} -`,{encoding:"utf8",mode:384}),await Uhe(o,this.#e)}};var CY=Object.freeze({botPrefix:"discord",tokenRefPrefix:"DSH_DISCORD_BOT_TOKEN"});function uY(n){return mE(n,CY)}function BY(n){return nQ(n,D("Discord\u673A\u5668\u4EBA"))}var sQ=class extends hp{constructor(t){super(t,{channel:"Discord",...CY})}};function SE(n){return typeof n=="string"&&n.trim()?n.trim():null}function DE(n,t){return Object.freeze({code:n,message:t})}var Ep=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l=new Map;#i=new Map;#I=new Map;#s=0;#p=!1;constructor({descriptor:t,credentials:o,configStore:i,inspectToken:e,deriveIdentity:a,maskPlatformId:A,createRuntime:r,deleteState:s=async()=>{},logger:g=console}){if(!t?.key||!t?.label||!t?.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(`${t.label} requires the DSH credential provider`);if(!i||typeof i.list!="function"||typeof i.save!="function"||typeof i.remove!="function")throw new TypeError(`${t.label} requires a config store`);if(typeof e!="function"||typeof a!="function"||typeof A!="function"||typeof r!="function")throw new TypeError(`${t.label} controller dependencies are incomplete`);this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s,this.#g=g}async initialize(){if(this.#p)return this.status();for(let t of this.#t.list())await this.#B(t.botId,async()=>{if(this.#p||this.#l.get(t.botId)?.status?.ready)return;let o=await this.#E(t.tokenRef);if(!o){this.#i.set(t.botId,DE("missing-token",D("{label}\u673A\u5668\u4EBA\u51ED\u636E\u7F3A\u5931\uFF0C\u8BF7\u79FB\u9664\u540E\u91CD\u65B0\u63A5\u5165\u3002",{label:this.#e.label})));return}try{await this.#d(t,o),this.#i.delete(t.botId)}catch(i){this.#i.set(t.botId,DE("connection-failed",D("{label}\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002",{label:this.#e.label}))),this.#g.warn?.(`[dsh-im:${this.#e.key}] bot ${t.botId} failed to initialize:`,i)}finally{this.#u()}});return this.status()}async bindCredentials({token:t}={}){if(this.#p)throw new Error(`${this.#e.label} controller is closed`);let o=SE(t);if(!o)throw new TypeError(`${this.#e.label} Bot Token is required`);let i=await this.#r(o),e=SE(i?.platformId),a=SE(i?.name);if(!e||!a)throw new Error(`${this.#e.label} returned an invalid bot identity`);let A=this.#c(e);return await this.#B(A.botId,async()=>{if(this.#p)throw new Error(`${this.#e.label} controller is closed`);let r=this.#t.getByPlatformId(e),s=await this.#A.resolve(A.tokenRef).catch(()=>{}),g={botId:A.botId,platformId:e,tokenRef:A.tokenRef,name:a,username:SE(i.username),createdAt:r?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()};await this.#A.set(A.tokenRef,o);try{await this.#t.save(g)}catch(c){throw await this.#C(A.tokenRef,s),c}try{await this.#d(g,o),this.#i.delete(A.botId)}catch(c){this.#i.set(A.botId,DE("connection-failed",D("{label}\u673A\u5668\u4EBA\u5DF2\u63A5\u5165\uFF0C\u6D88\u606F\u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002",{label:this.#e.label}))),this.#g.warn?.(`[dsh-im:${this.#e.key}] bot ${A.botId} credential connection failed:`,c)}this.#u()}),this.status()}async reconnectBot(t){let o=this.#t.get(t);if(!o)throw new Error(`Unknown ${this.#e.label} bot`);return await this.#B(t,async()=>{let i=await this.#E(o.tokenRef);if(!i)throw new Error(`${this.#e.label} bot token is missing`);try{await this.#d(o,i),this.#i.delete(t)}catch(e){throw this.#i.set(t,DE("connection-failed",D("{label}\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{label:this.#e.label}))),e}finally{this.#u()}}),this.status()}async updateBotConfig(t,o){if(this.#p)throw new Error(`${this.#e.label} controller is closed`);if(typeof o!="function")throw new TypeError("Bot config update must be a function");return await this.#B(t,async()=>{if(this.#p)throw new Error(`${this.#e.label} controller is closed`);let i=this.#t.get(t);if(!i)throw new Error(`Unknown ${this.#e.label} bot`);let e=await this.#E(i.tokenRef);if(!e)throw new Error(`${this.#e.label} bot token is missing`);if(this.#p)throw new Error(`${this.#e.label} controller is closed`);let a=o(i),A=await this.#t.save(a);try{await this.#d(A,e),this.#i.delete(t)}catch(r){throw this.#i.set(t,DE("connection-failed",D("{label}\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{label:this.#e.label}))),r}finally{this.#u()}}),this.status()}async sendConnectionTest(t){let o=this.#t.get(t);if(!o)throw new Error(`Unknown ${this.#e.label} bot`);return this.#B(t,async()=>{let i=this.#l.get(t);if(!i?.status?.ready||typeof i.sendConnectionTest!="function"){let a=new Error(D("{label}\u673A\u5668\u4EBA\u5C1A\u672A\u8FDE\u63A5",{label:this.#e.label}));throw a.code="test-target-unavailable",a}let e=D("{name}\uFF08{id}\uFF09",{name:o.name,id:this.#a(o.platformId)});return await i.sendConnectionTest(Oa(e,D("{label}\u673A\u5668\u4EBA",{label:this.#e.label}))),{sent:!0}})}async deleteBot(t){let o=this.#t.get(t);if(!o)throw new Error(`Unknown ${this.#e.label} bot`);return await this.#B(t,async()=>{let i=await this.#A.resolve(o.tokenRef).catch(()=>{});await this.#h(t);try{await this.#A.unset(o.tokenRef),await this.#t.remove(t)}catch(e){throw i?.value&&(await this.#A.set(o.tokenRef,i.value).catch(()=>{}),await this.#d(o,i.value).catch(()=>{})),new Error(`Unable to remove the ${this.#e.label} bot safely.`,{cause:e})}await this.#o({botId:t,config:o}).catch(e=>{this.#g.warn?.(`[dsh-im:${this.#e.key}] bot ${t} state cleanup failed:`,e)}),this.#i.delete(t),this.#u()}),this.status()}status(){let t=this.#t.list().map(i=>{let e=this.#l.get(i.botId)?.status??null,a=e?.ready===!0&&e.connectionState==="connected"&&e.harnessReachable===!0,A=a?"connected":e?.connectionState==="connecting"?"connecting":this.#i.has(i.botId)||e?.connectionState==="failed"?"error":"offline";return{botId:i.botId,state:A,connected:a,configured:!0,bot:{name:i.name,username:i.username,idMasked:this.#a(i.platformId)},health:{status:a?"healthy":A==="error"?"error":"offline",summary:a?D("{label}{connectionLabel}\u8FD0\u884C\u6B63\u5E38",{label:this.#e.label,connectionLabel:D(this.#e.connectionLabel)}):A==="error"?D("{label}\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5",{label:this.#e.label}):D("{label}\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF",{label:this.#e.label}),lastCheckedAt:e?.lastCheckedAt??null,lastConnectedAt:e?.lastConnectedAt??null},stats:{messagesReceived:e?.messagesReceived??0,messagesReplied:e?.messagesReplied??0},lastMessageError:zr(e?.lastMessageError),error:structuredClone(this.#i.get(i.botId)??null)}}),o=t.filter(i=>i.connected).length;return{schemaVersion:1,revision:this.#s,state:t.length===0?"disconnected":o===t.length?"connected":o>0?"degraded":"offline",bots:t,totals:{configured:t.length,connected:o}}}async close(){this.#p||(this.#p=!0,await Promise.allSettled([...this.#I.values()]),await Promise.allSettled([...this.#l.keys()].map(t=>this.#h(t))))}async#d(t,o){if(this.#p)throw new Error(`${this.#e.label} controller is closed`);if(await this.#h(t.botId),this.#p)throw new Error(`${this.#e.label} controller is closed`);let i=await this.#n({botId:t.botId,config:t,token:o});if(!i||typeof i.start!="function"||typeof i.stop!="function")throw new TypeError(`createRuntime returned an invalid ${this.#e.label} runtime`);this.#l.set(t.botId,i);try{await i.start()}catch(e){throw await i.stop().catch(()=>{}),this.#l.delete(t.botId),e}}async#h(t){let o=this.#l.get(t);this.#l.delete(t),await o?.stop().catch(i=>{this.#g.warn?.(`[dsh-im:${this.#e.key}] bot ${t} failed to stop cleanly:`,i)})}async#E(t){let o=await this.#A.resolve(t).catch(()=>{});return SE(o?.value)}async#C(t,o){o?.value?await this.#A.set(t,o.value).catch(()=>{}):await this.#A.unset(t).catch(()=>{})}#B(t,o){let a=(this.#I.get(t)??Promise.resolve()).catch(()=>{}).then(o).finally(()=>{this.#I.get(t)===a&&this.#I.delete(t)});return this.#I.set(t,a),a}#u(){this.#s+=1}};import{createHash as Yhe}from"node:crypto";var jhe="https://discord.com/api/v10/",Jhe=12e4,qhe=new Set([50001,50013]),zhe=new Set([40005]);function qn(n){return typeof n=="string"&&n.trim()?n.trim():null}function fY(n,t){let o=AbortSignal.timeout(t);return n?AbortSignal.any([n,o]):o}function A_(n){return n?.reason instanceof Error?n.reason:new DOMException("The operation was aborted","AbortError")}function Vhe(n,t){if(!Number.isInteger(n)||n<1)throw new TypeError(`${t} must be a positive integer`);return n}function yY(n,t){return t?.providerCode!==void 0&&(n.providerCode=t.providerCode),t?.retry_after!==void 0&&(n.retry_after=t.retry_after,n.retryAfter=t.retry_after),Number.isInteger(t?.status)&&(n.status=t.status),n}function Whe(n){let t=Number(n?.providerCode),o=Number(n?.status),i=qn(n?.message)??"",e="artifact-provider-rejected",a="Discord rejected the attachment.";o===401||o===403||qhe.has(t)?(e="artifact-permission-required",a="Discord denied permission to send the attachment."):o===413||zhe.has(t)||/(?:request|attachment|file).{0,24}too large/i.test(i)?(e="artifact-too-large",a="The attachment exceeds Discord's size limit."):o===429?(e="artifact-rate-limited",a="Discord rate-limited attachment delivery."):o>=500&&(e="artifact-delivery-uncertain",a="Discord attachment delivery result is uncertain.");let A=new Error(a,{cause:n});return A.code=e,yY(A,n)}function Zhe(n){let t=new Error("Discord attachment delivery result is uncertain",{cause:n});return t.code="artifact-delivery-uncertain",yY(t,n)}function Xhe(n,t){return new Promise((o,i)=>{if(t?.aborted){i(t.reason??new DOMException("Aborted","AbortError"));return}let e=setTimeout(o,n);e?.unref?.(),t?.addEventListener("abort",()=>{clearTimeout(e),i(t.reason??new DOMException("Aborted","AbortError"))},{once:!0})})}function ja(n,t){let o=qn(n);if(!o||!/^\d{5,30}$/.test(o))throw new TypeError(`Invalid Discord ${t}`);return o}function QY(n){let t=qn(n);if(!t)throw new TypeError("A Discord reaction emoji is required");return t}function $he(n){return typeof n=="string"&&/^[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{4,}\.[A-Za-z0-9_-]{20,}$/.test(n.trim())}var wE=class{#e;#A;#t;#r;constructor({token:t,fetchImpl:o=fetch,baseUrl:i=jhe,fileUploadTimeoutMs:e=Jhe}){if(!$he(t))throw new TypeError("Discord Bot Token is invalid");if(typeof o!="function")throw new TypeError("DiscordApi requires fetch");this.#e=t.trim(),this.#A=o,this.#t=new URL(i),this.#r=Vhe(e,"fileUploadTimeoutMs")}getCurrentUser(t={}){return this.#c("users/@me",{...t,method:"GET"})}getGatewayBot(t={}){return this.#c("gateway/bot",{...t,method:"GET"})}getChannel({channelId:t,signal:o}={}){return this.#c(`channels/${ja(t,"channel id")}`,{method:"GET",signal:o})}startThreadFromMessage({channelId:t,messageId:o,name:i,signal:e}={}){let a=qn(i);if(!a||[...a].length>100)throw new TypeError("Discord thread name must contain 1-100 characters");if(e?.aborted)throw A_(e);return this.#c(`channels/${ja(t,"channel id")}/messages/${ja(o,"message id")}/threads`,{method:"POST",signal:e,body:{name:a}})}createMessage({channelId:t,content:o,replyToMessageId:i,signal:e}){return this.#c(`channels/${ja(t,"channel id")}/messages`,{method:"POST",signal:e,body:{content:o,allowed_mentions:{parse:[],replied_user:!1},...i?{message_reference:{message_id:ja(i,"message id"),channel_id:ja(t,"channel id"),fail_if_not_exists:!1}}:{}}})}async createFileMessage({channelId:t,file:o,replyToMessageId:i,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 a=qn(o.deliveryKey)??qn(o.artifactId),A=a?Yhe("sha256").update(a).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}],...A?{nonce:A,enforce_nonce:!0}:{},...i?{message_reference:{message_id:ja(i,"message id"),channel_id:ja(t,"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=ja(t,"channel id");if(e?.aborted)throw A_(e);let g=fY(e,this.#r);try{return await this.#c(`channels/${s}/messages`,{method:"POST",signal:g,timeoutMs:this.#r,body:r,multipart:!0})}catch(c){throw e?.aborted?A_(e):c?.code?.startsWith?.("discord-")?Whe(c):Zhe(c)}}editMessage({channelId:t,messageId:o,content:i,signal:e}){return this.#c(`channels/${ja(t,"channel id")}/messages/${ja(o,"message id")}`,{method:"PATCH",signal:e,body:{content:i,allowed_mentions:{parse:[],replied_user:!1}}})}sendTyping({channelId:t,signal:o}){return this.#c(`channels/${ja(t,"channel id")}/typing`,{method:"POST",signal:o,expectBody:!1})}async addOwnReaction({channelId:t,messageId:o,emoji:i,signal:e}={}){let a=QY(i);return await this.#c(`channels/${ja(t,"channel id")}/messages/${ja(o,"message id")}/reactions/${encodeURIComponent(a)}/@me`,{method:"PUT",signal:e,expectBody:!1,retry:!1}),a}removeOwnReaction({channelId:t,messageId:o,emoji:i,signal:e}={}){let a=QY(i);return this.#c(`channels/${ja(t,"channel id")}/messages/${ja(o,"message id")}/reactions/${encodeURIComponent(a)}/@me`,{method:"DELETE",signal:e,expectBody:!1,retry:!1})}async#c(t,{method:o,body:i,signal:e,timeoutMs:a=15e3,expectBody:A=!0,retry:r=!0,multipart:s=!1}){let g;try{g=await this.#A(new URL(t,this.#t),{method:o,headers:{authorization:`Bot ${this.#e}`,...s?{}:{"content-type":"application/json"},"user-agent":"DeepSeek-Harness-dsh-im (https://github.com/xmanrui/dsh-im, 1.1.0)"},...i===void 0?{}:{body:s?i:JSON.stringify(i)},signal:fY(e,a),redirect:"error"})}catch(I){throw I?.name==="AbortError"||I?.name==="TimeoutError"?I:new Error(`Discord ${o} transport failed`)}let c=null;if(A||g.status===429||!g.ok)try{c=await g.json()}catch{if(A){let I=new Error(`Discord ${o} returned invalid JSON`);throw I.status=g?.status,I}}if(g.status===429&&r){let I=Math.min(1e4,Math.max(50,Number(c?.retry_after)*1e3||1e3));return await Xhe(I,e),this.#c(t,{method:o,body:i,signal:e,timeoutMs:a,expectBody:A,retry:!1,multipart:s})}if(!g.ok){let I=new Error(qn(c?.message)??`Discord API failed with HTTP ${g.status}`);I.code=`discord-${g.status}`,I.status=g.status,(Number.isInteger(c?.code)||typeof c?.code=="string")&&(I.providerCode=c.code);let d=Number(c?.retry_after);throw Number.isFinite(d)&&d>=0&&(I.retry_after=d,I.retryAfter=d),I}return A?c:null}};async function mY(n,t={}){let i=await new wE({token:n,...t}).getCurrentUser();if(!i?.id||i?.bot!==!0)throw new Error("Discord token does not belong to a bot");return{platformId:String(i.id),name:qn(i.global_name)??qn(i.username)??D("Discord\u673A\u5668\u4EBA"),username:qn(i.username)}}var eEe=Object.freeze({success(){},error(){},clear(){},settled:()=>Promise.resolve()});function SY(n,t){!n||typeof n!="object"||(n[t]=(n[t]??0)+1)}async function AEe(n,t){let o=AbortSignal.timeout(t),i,e=new Promise((a,A)=>{i=()=>A(o.reason??new DOMException("Timed out","TimeoutError")),o.addEventListener("abort",i,{once:!0})});try{return await Promise.race([n(o),e])}finally{o.removeEventListener("abort",i)}}function gQ({adapter:n,target:t,reactions:o,status:i,logger:e=console,label:a="channel",timeoutMs:A=2e3}={}){if(!t||typeof n?.addReaction!="function"||typeof n?.removeReaction!="function"||typeof o?.processing!="string"||!o.processing||!Number.isSafeInteger(A)||A<=0)return eEe;let r=null,s=!1,g=async(B,f)=>{try{let Q=await AEe(f,A);return SY(i,B==="add"?"reactionsAdded":"reactionsRemoved"),{ok:!0,value:Q}}catch(Q){return SY(i,"reactionErrors"),e.warn?.(`[dsh-im:${a}] status reaction ${B} failed:`,Q?.message??Q?.name??String(Q)),{ok:!1,value:null}}},c=async B=>{if(r!==null){let Q=r;r=null,await g("remove",y=>n.removeReaction(t,Q,{signal:y}))}if(typeof B!="string"||!B)return;let f=await g("add",Q=>n.addReaction(t,B,{signal:Q}));f.ok&&f.value!==void 0&&f.value!==null&&(r=f.value)},I=c(o.processing),d=B=>{s||(s=!0,I=I.then(()=>c(B),()=>c(B)),I.catch(()=>{}))};return Object.freeze({success:()=>d(o.success),error:()=>d(o.error),clear:()=>d(null),settled:()=>I})}var DY="\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002",tEe="\u4EFB\u52A1\u5DF2\u5B8C\u6210\u3002";function Si(n){return typeof n=="string"?n.trim():""}function rEe(n,t,o){return t.actor===o&&(n.kind!=="group"||n.addressed===!0)&&!Vt(n)&&!Ft(n)&&!!Si(n.content)}function aEe(n,t,o){let i=String(n??D("\u7ED3\u679C\u6587\u4EF6")).replace(/[\r\n]+/g," ").trim().slice(0,255)||D("\u7ED3\u679C\u6587\u4EF6");switch(t?.code){case"artifact-delivery-uncertain":return D("\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:i});case"artifact-permission-required":return o?.key==="slack"?D("\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:i}):o?.key==="discord"?D("\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:i}):o?.key==="telegram"?D("\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:i}):D("\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:i});case"artifact-too-large":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u8D85\u8FC7\u5F53\u524D\u6E20\u9053\u5927\u5C0F\u4E0A\u9650\uFF0C\u672A\u53D1\u9001\u3002",{name:i});case"artifact-empty":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u4E3A\u7A7A\uFF0C\u672A\u53D1\u9001\u3002",{name:i});case"artifact-invalid":case"artifact-changed":case"artifact-unavailable":return D("\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:i});case"artifact-rate-limited":return D("\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:i});case"artifact-provider-rejected":return D("\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:i});default:return D("\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:i})}}function zi(){return{messagesReceived:0,messagesReplied:0,messagesRejected:0,lastMessageAt:null,lastReplyAt:null,lastRejectedAt:null,lastError:null,lastMessageError:null,reactionsAdded:0,reactionsRemoved:0,reactionErrors:0}}var zn=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l=new Map;#i=new Map;#I=new Map;#s=new Map;#p=new Set;#d=new Set;#h;#E=new Bi;constructor({descriptor:t,bot:o,harness:i,state:e,contextEnhancement:a,status:A=zi(),logger:r=console,replyTimeoutMs:s=6e5,signal:g}){if(!t?.key||!t?.label)throw new TypeError("A channel descriptor is required");if(!o||typeof o.sendText!="function")throw new TypeError("A bot client is required");if(!i||!e)throw new TypeError("Harness client and state store are required");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s,this.#g=g,this.#h=new pi({label:t.key,logger:r})}get status(){return structuredClone(this.#a)}accept(t,{contextSnapshot:o}={}){if(this.#g?.aborted)return Promise.resolve();let i=Si(t?.conversationId),e=t?.kind==="group"?"group":"direct",a={...t,kind:e,conversationId:i},A=Si(a.messageId),r=Si(a.senderId);if(!A||!r||!i||a.senderIsBot===!0||this.#r.hasSeen(A)||this.#s.has(A))return Promise.resolve();this.#s.set(A,o===void 0?Zr(this.#c,t?.kind):o);let s=gQ({adapter:this.#A,target:a.kind==="direct"||a.addressed===!0?a.reactionTarget:null,reactions:this.#e.reactions,status:this.#a,logger:this.#n,label:this.#e.key});a.statusReaction=s;let g=this.#C(a,A,r);return g.then(()=>s.success(),()=>s.error()),g}#C(t,o,i){t.kind==="direct"&&lo(this.#r,t.connectionTestTarget??t.replyTarget);let e=`${t.kind}:${t.conversationId}`,a=this.#i.get(e),A=Si(t.content),r=Qo(A);if(r&&t.kind==="group"&&t.addressed===!0)return this.#B(t,o,Kn());if(r&&t.kind==="direct"){if(/^\/batch$/iu.test(A)&&(this.#l.has(e)||a||this.#h.hasPending(e)))return this.#B(t,o,yo());let d=this.#E.handle(e,A,{plainText:!!A&&t.plainText!==!1&&!Vt(t)&&!Ft(t)});if(d.handled)return d.kind==="submit"?this.#u({...t,content:d.prompt,batchSubmission:{token:d.token}},o,i,e):this.#B(t,o,d.message)}else if(t.kind==="direct"&&this.#E.status(e).phase==="collecting"){let I=this.#E.handle(e,A,{plainText:!!A&&t.plainText!==!1&&!Vt(t)&&!Ft(t)});if(I.handled)return this.#B(t,o,I.message)}let g=t.kind==="direct"&&this.#E.status(e).phase==="collecting"?null:Ei(A)?xi:Ft(t)?null:Yi(A)?Ci:ji(A)?Ji:qi(A)?ui:null;if(g&&(t.kind!=="group"||t.addressed===!0)){let I;return I=this.#m(t,o,e,g).finally(()=>{this.#s.delete(o),this.#d.delete(I)}),this.#d.add(I),I}let c=this.#h.claimReply({key:e,actor:i,messageId:o,text:Vt(t)||Ft(t)?"":t.content,addressed:t.kind!=="group"||t.addressed===!0,hasPendingQuestion:!!a,questionCompletion:a?.submitting||a?.claimedReplyMessageId?a.queue:null,isQuestionPending:()=>this.#i.has(e),send:I=>this.#A.sendText(t.replyTarget,I)});if(c){let I;return I=c.process(async()=>this.#r.hasSeen(o)?!1:(await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString(),!0)).finally(()=>{this.#s.delete(o),this.#p.delete(I)}),this.#p.add(I),I}if(a&&a.actor!==i)return this.#u(t,o,i,e);if(a?.submitting||a?.claimedReplyMessageId)return this.#u(t,o,i,e);if(a){rEe(t,a,i)&&(a.claimedReplyMessageId=o);let d=(a.queue??Promise.resolve()).catch(()=>{}).then(()=>this.#y(t,o,i,e,a)).finally(()=>{this.#s.delete(o),a.claimedReplyMessageId===o&&(a.claimedReplyMessageId=null),a.queue===d&&(a.queue=null)});return a.queue=d,d}return this.#u(t,o,i,e)}#B(t,o,i){let e;return e=(async()=>{this.#r.hasSeen(o)||(await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString(),i&&await this.#A.sendText(t.replyTarget,i),this.#a.lastError=null)})().catch(async a=>{if(this.#g?.aborted){t.statusReaction?.clear();return}t.statusReaction?.error(),this.#a.lastError=a?.message??String(a);let A=At(this.#a,a);this.#n.error?.(`[dsh-im:${this.#e.key}] failed to process a batch input message [${A.referenceId}]:`,a)}).finally(()=>{this.#s.delete(o),this.#d.delete(e)}),this.#d.add(e),e}#u(t,o,i,e,{releaseMessageId:a=!0,alreadyRecorded:A=!1}={}){let s=(this.#l.get(e)??Promise.resolve()).catch(()=>{}).then(()=>this.#Q(t,o,i,e,{alreadyRecorded:A})).finally(()=>{a&&this.#s.delete(o),this.#l.get(e)===s&&this.#l.delete(e)});return this.#l.set(e,s),s}async waitForIdle(){await Promise.allSettled([...this.#l.values(),...[...this.#i.values()].flatMap(t=>t.queue?[t.queue]:[]),...this.#p,...this.#d])}async#m(t,o,i,e){if(this.#r.hasSeen(o))return;await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString();let a=t.replyTarget;try{let A=await e(Si(t.content),this.#t,this.#r,i,{signal:this.#g,isDirect:t.kind==="direct",hasImages:Vt(t),hasFiles:Ft(t),pendingInteraction:this.#i.has(i)||this.#h.hasPending(i),control:{owner:this,key:i}});A?.stopped&&await Promise.allSettled([this.#_(i),this.#h.closeRoute(i)]);for(let r of A?.messages??[A?.message])r&&await this.#A.sendText(a,r);this.#a.lastError=null}catch(A){if(A?.code==="turn-stopped"||this.#g?.aborted){t.statusReaction?.clear();return}t.statusReaction?.error(),this.#a.lastError=A?.message??String(A);let r=At(this.#a,A);this.#n.error?.(`[dsh-im:${this.#e.key}] failed to process a command [${r.referenceId}]:`,A),await this.#A.sendText(a,dt(r)).catch(()=>{})}}sendConnectionTest(t){return qg({state:this.#r,text:t,channelLabel:D("{label}\u673A\u5668\u4EBA",{label:this.#e.label}),send:(o,i)=>this.#A.sendText(o,i)})}async#S(t,o,i=[],e){let a=await Do({artifacts:i,baseReceipt:e,deliveryId:o,channelKey:this.#e.key,signal:this.#g,sendImage:typeof this.#A.sendImage=="function"?A=>this.#A.sendImage(t,A):void 0,sendFile:typeof this.#A.sendFile=="function"?A=>this.#A.sendFile(t,A):void 0,onFailure:(A,r)=>At(this.#a,r,{userMessage:aEe(A?.fileName,r,this.#e),reason:r?.code}),sendFailureNotice:(A,r,s)=>this.#A.sendText(t,dt(s)),logger:this.#n});return this.#a.artifactsSent=(this.#a.artifactsSent??0)+a.artifactsSent,this.#a.artifactSendErrors=(this.#a.artifactSendErrors??0)+a.artifactSendErrors,{receipt:a.receipt,userVisible:a.userVisible,artifactSendErrors:a.artifactSendErrors}}async#Q(t,o,i,e,{alreadyRecorded:a=!1}={}){if(!a){if(this.#r.hasSeen(o))return;await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString()}let A=t.replyTarget,r=Si(t.content),s=t.batchSubmission,g=null,c=!1;try{if(this.#g?.throwIfAborted(),t.kind==="group"&&t.addressed!==!0){this.#a.messagesRejected+=1,this.#a.lastRejectedAt=new Date().toISOString();return}let I=Vt(t),d=Ft(t);if(!r&&!I&&!d){await this.#A.sendText(A,D("\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u548C\u6587\u4EF6\u6D88\u606F\u3002"));return}let B=r.toLowerCase();if(!I&&!d&&B==="/help"){await this.#A.sendText(A,[D("{label}\u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002",{label:this.#e.label}),"",D("\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002"),D("/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"),D("/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"),D("/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09"),D("/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A"),D("/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84"),D("/sessionlist [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"),D("/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"),D("/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"),D("/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7"),D("/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7"),D("/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B"),D("\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]"),D("/presetlist \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset"),D("/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset"),D("\u7EAF\u6570\u5B57 ID\uFF1A/preset id:"),D("/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"),D("/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1"),D("/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"),D("/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09"),D("/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21"),D("/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21"),D("/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"),D("/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C"),D("/help \u663E\u793A\u672C\u5E2E\u52A9")].join(` +`,{encoding:"utf8",mode:384}),await Uhe(o,this.#e)}};var CY=Object.freeze({botPrefix:"discord",tokenRefPrefix:"DSH_DISCORD_BOT_TOKEN"});function uY(n){return mE(n,CY)}function BY(n){return nQ(n,D("Discord\u673A\u5668\u4EBA"))}var sQ=class extends hp{constructor(t){super(t,{channel:"Discord",...CY})}};function SE(n){return typeof n=="string"&&n.trim()?n.trim():null}function DE(n,t){return Object.freeze({code:n,message:t})}var Ep=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l=new Map;#i=new Map;#I=new Map;#s=0;#p=!1;constructor({descriptor:t,credentials:o,configStore:i,inspectToken:e,deriveIdentity:a,maskPlatformId:A,createRuntime:r,deleteState:s=async()=>{},logger:g=console}){if(!t?.key||!t?.label||!t?.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(`${t.label} requires the DSH credential provider`);if(!i||typeof i.list!="function"||typeof i.save!="function"||typeof i.remove!="function")throw new TypeError(`${t.label} requires a config store`);if(typeof e!="function"||typeof a!="function"||typeof A!="function"||typeof r!="function")throw new TypeError(`${t.label} controller dependencies are incomplete`);this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s,this.#g=g}async initialize(){if(this.#p)return this.status();for(let t of this.#t.list())await this.#B(t.botId,async()=>{if(this.#p||this.#l.get(t.botId)?.status?.ready)return;let o=await this.#E(t.tokenRef);if(!o){this.#i.set(t.botId,DE("missing-token",D("{label}\u673A\u5668\u4EBA\u51ED\u636E\u7F3A\u5931\uFF0C\u8BF7\u79FB\u9664\u540E\u91CD\u65B0\u63A5\u5165\u3002",{label:this.#e.label})));return}try{await this.#d(t,o),this.#i.delete(t.botId)}catch(i){this.#i.set(t.botId,DE("connection-failed",D("{label}\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002",{label:this.#e.label}))),this.#g.warn?.(`[dsh-im:${this.#e.key}] bot ${t.botId} failed to initialize:`,i)}finally{this.#u()}});return this.status()}async bindCredentials({token:t}={}){if(this.#p)throw new Error(`${this.#e.label} controller is closed`);let o=SE(t);if(!o)throw new TypeError(`${this.#e.label} Bot Token is required`);let i=await this.#r(o),e=SE(i?.platformId),a=SE(i?.name);if(!e||!a)throw new Error(`${this.#e.label} returned an invalid bot identity`);let A=this.#c(e);return await this.#B(A.botId,async()=>{if(this.#p)throw new Error(`${this.#e.label} controller is closed`);let r=this.#t.getByPlatformId(e),s=await this.#A.resolve(A.tokenRef).catch(()=>{}),g={botId:A.botId,platformId:e,tokenRef:A.tokenRef,name:a,username:SE(i.username),createdAt:r?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()};await this.#A.set(A.tokenRef,o);try{await this.#t.save(g)}catch(c){throw await this.#C(A.tokenRef,s),c}try{await this.#d(g,o),this.#i.delete(A.botId)}catch(c){this.#i.set(A.botId,DE("connection-failed",D("{label}\u673A\u5668\u4EBA\u5DF2\u63A5\u5165\uFF0C\u6D88\u606F\u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002",{label:this.#e.label}))),this.#g.warn?.(`[dsh-im:${this.#e.key}] bot ${A.botId} credential connection failed:`,c)}this.#u()}),this.status()}async reconnectBot(t){let o=this.#t.get(t);if(!o)throw new Error(`Unknown ${this.#e.label} bot`);return await this.#B(t,async()=>{let i=await this.#E(o.tokenRef);if(!i)throw new Error(`${this.#e.label} bot token is missing`);try{await this.#d(o,i),this.#i.delete(t)}catch(e){throw this.#i.set(t,DE("connection-failed",D("{label}\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{label:this.#e.label}))),e}finally{this.#u()}}),this.status()}async updateBotConfig(t,o){if(this.#p)throw new Error(`${this.#e.label} controller is closed`);if(typeof o!="function")throw new TypeError("Bot config update must be a function");return await this.#B(t,async()=>{if(this.#p)throw new Error(`${this.#e.label} controller is closed`);let i=this.#t.get(t);if(!i)throw new Error(`Unknown ${this.#e.label} bot`);let e=await this.#E(i.tokenRef);if(!e)throw new Error(`${this.#e.label} bot token is missing`);if(this.#p)throw new Error(`${this.#e.label} controller is closed`);let a=o(i),A=await this.#t.save(a);try{await this.#d(A,e),this.#i.delete(t)}catch(r){throw this.#i.set(t,DE("connection-failed",D("{label}\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{label:this.#e.label}))),r}finally{this.#u()}}),this.status()}async sendConnectionTest(t){let o=this.#t.get(t);if(!o)throw new Error(`Unknown ${this.#e.label} bot`);return this.#B(t,async()=>{let i=this.#l.get(t);if(!i?.status?.ready||typeof i.sendConnectionTest!="function"){let a=new Error(D("{label}\u673A\u5668\u4EBA\u5C1A\u672A\u8FDE\u63A5",{label:this.#e.label}));throw a.code="test-target-unavailable",a}let e=D("{name}\uFF08{id}\uFF09",{name:o.name,id:this.#a(o.platformId)});return await i.sendConnectionTest(Oa(e,D("{label}\u673A\u5668\u4EBA",{label:this.#e.label}))),{sent:!0}})}async deleteBot(t){let o=this.#t.get(t);if(!o)throw new Error(`Unknown ${this.#e.label} bot`);return await this.#B(t,async()=>{let i=await this.#A.resolve(o.tokenRef).catch(()=>{});await this.#h(t);try{await this.#A.unset(o.tokenRef),await this.#t.remove(t)}catch(e){throw i?.value&&(await this.#A.set(o.tokenRef,i.value).catch(()=>{}),await this.#d(o,i.value).catch(()=>{})),new Error(`Unable to remove the ${this.#e.label} bot safely.`,{cause:e})}await this.#o({botId:t,config:o}).catch(e=>{this.#g.warn?.(`[dsh-im:${this.#e.key}] bot ${t} state cleanup failed:`,e)}),this.#i.delete(t),this.#u()}),this.status()}status(){let t=this.#t.list().map(i=>{let e=this.#l.get(i.botId)?.status??null,a=e?.ready===!0&&e.connectionState==="connected"&&e.harnessReachable===!0,A=a?"connected":e?.connectionState==="connecting"?"connecting":this.#i.has(i.botId)||e?.connectionState==="failed"?"error":"offline";return{botId:i.botId,state:A,connected:a,configured:!0,bot:{name:i.name,username:i.username,idMasked:this.#a(i.platformId)},health:{status:a?"healthy":A==="error"?"error":"offline",summary:a?D("{label}{connectionLabel}\u8FD0\u884C\u6B63\u5E38",{label:this.#e.label,connectionLabel:D(this.#e.connectionLabel)}):A==="error"?D("{label}\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5",{label:this.#e.label}):D("{label}\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF",{label:this.#e.label}),lastCheckedAt:e?.lastCheckedAt??null,lastConnectedAt:e?.lastConnectedAt??null},stats:{messagesReceived:e?.messagesReceived??0,messagesReplied:e?.messagesReplied??0},lastMessageError:zr(e?.lastMessageError),error:structuredClone(this.#i.get(i.botId)??null)}}),o=t.filter(i=>i.connected).length;return{schemaVersion:1,revision:this.#s,state:t.length===0?"disconnected":o===t.length?"connected":o>0?"degraded":"offline",bots:t,totals:{configured:t.length,connected:o}}}async close(){this.#p||(this.#p=!0,await Promise.allSettled([...this.#I.values()]),await Promise.allSettled([...this.#l.keys()].map(t=>this.#h(t))))}async#d(t,o){if(this.#p)throw new Error(`${this.#e.label} controller is closed`);if(await this.#h(t.botId),this.#p)throw new Error(`${this.#e.label} controller is closed`);let i=await this.#n({botId:t.botId,config:t,token:o});if(!i||typeof i.start!="function"||typeof i.stop!="function")throw new TypeError(`createRuntime returned an invalid ${this.#e.label} runtime`);this.#l.set(t.botId,i);try{await i.start()}catch(e){throw await i.stop().catch(()=>{}),this.#l.delete(t.botId),e}}async#h(t){let o=this.#l.get(t);this.#l.delete(t),await o?.stop().catch(i=>{this.#g.warn?.(`[dsh-im:${this.#e.key}] bot ${t} failed to stop cleanly:`,i)})}async#E(t){let o=await this.#A.resolve(t).catch(()=>{});return SE(o?.value)}async#C(t,o){o?.value?await this.#A.set(t,o.value).catch(()=>{}):await this.#A.unset(t).catch(()=>{})}#B(t,o){let a=(this.#I.get(t)??Promise.resolve()).catch(()=>{}).then(o).finally(()=>{this.#I.get(t)===a&&this.#I.delete(t)});return this.#I.set(t,a),a}#u(){this.#s+=1}};import{createHash as Yhe}from"node:crypto";var jhe="https://discord.com/api/v10/",Jhe=12e4,qhe=new Set([50001,50013]),zhe=new Set([40005]);function qn(n){return typeof n=="string"&&n.trim()?n.trim():null}function fY(n,t){let o=AbortSignal.timeout(t);return n?AbortSignal.any([n,o]):o}function A_(n){return n?.reason instanceof Error?n.reason:new DOMException("The operation was aborted","AbortError")}function Vhe(n,t){if(!Number.isInteger(n)||n<1)throw new TypeError(`${t} must be a positive integer`);return n}function yY(n,t){return t?.providerCode!==void 0&&(n.providerCode=t.providerCode),t?.retry_after!==void 0&&(n.retry_after=t.retry_after,n.retryAfter=t.retry_after),Number.isInteger(t?.status)&&(n.status=t.status),n}function Whe(n){let t=Number(n?.providerCode),o=Number(n?.status),i=qn(n?.message)??"",e="artifact-provider-rejected",a="Discord rejected the attachment.";o===401||o===403||qhe.has(t)?(e="artifact-permission-required",a="Discord denied permission to send the attachment."):o===413||zhe.has(t)||/(?:request|attachment|file).{0,24}too large/i.test(i)?(e="artifact-too-large",a="The attachment exceeds Discord's size limit."):o===429?(e="artifact-rate-limited",a="Discord rate-limited attachment delivery."):o>=500&&(e="artifact-delivery-uncertain",a="Discord attachment delivery result is uncertain.");let A=new Error(a,{cause:n});return A.code=e,yY(A,n)}function Zhe(n){let t=new Error("Discord attachment delivery result is uncertain",{cause:n});return t.code="artifact-delivery-uncertain",yY(t,n)}function Xhe(n,t){return new Promise((o,i)=>{if(t?.aborted){i(t.reason??new DOMException("Aborted","AbortError"));return}let e=setTimeout(o,n);e?.unref?.(),t?.addEventListener("abort",()=>{clearTimeout(e),i(t.reason??new DOMException("Aborted","AbortError"))},{once:!0})})}function ja(n,t){let o=qn(n);if(!o||!/^\d{5,30}$/.test(o))throw new TypeError(`Invalid Discord ${t}`);return o}function QY(n){let t=qn(n);if(!t)throw new TypeError("A Discord reaction emoji is required");return t}function $he(n){return typeof n=="string"&&/^[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{4,}\.[A-Za-z0-9_-]{20,}$/.test(n.trim())}var wE=class{#e;#A;#t;#r;constructor({token:t,fetchImpl:o=fetch,baseUrl:i=jhe,fileUploadTimeoutMs:e=Jhe}){if(!$he(t))throw new TypeError("Discord Bot Token is invalid");if(typeof o!="function")throw new TypeError("DiscordApi requires fetch");this.#e=t.trim(),this.#A=o,this.#t=new URL(i),this.#r=Vhe(e,"fileUploadTimeoutMs")}getCurrentUser(t={}){return this.#c("users/@me",{...t,method:"GET"})}getGatewayBot(t={}){return this.#c("gateway/bot",{...t,method:"GET"})}getChannel({channelId:t,signal:o}={}){return this.#c(`channels/${ja(t,"channel id")}`,{method:"GET",signal:o})}startThreadFromMessage({channelId:t,messageId:o,name:i,signal:e}={}){let a=qn(i);if(!a||[...a].length>100)throw new TypeError("Discord thread name must contain 1-100 characters");if(e?.aborted)throw A_(e);return this.#c(`channels/${ja(t,"channel id")}/messages/${ja(o,"message id")}/threads`,{method:"POST",signal:e,body:{name:a}})}createMessage({channelId:t,content:o,replyToMessageId:i,signal:e}){return this.#c(`channels/${ja(t,"channel id")}/messages`,{method:"POST",signal:e,body:{content:o,allowed_mentions:{parse:[],replied_user:!1},...i?{message_reference:{message_id:ja(i,"message id"),channel_id:ja(t,"channel id"),fail_if_not_exists:!1}}:{}}})}async createFileMessage({channelId:t,file:o,replyToMessageId:i,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 a=qn(o.deliveryKey)??qn(o.artifactId),A=a?Yhe("sha256").update(a).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}],...A?{nonce:A,enforce_nonce:!0}:{},...i?{message_reference:{message_id:ja(i,"message id"),channel_id:ja(t,"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=ja(t,"channel id");if(e?.aborted)throw A_(e);let g=fY(e,this.#r);try{return await this.#c(`channels/${s}/messages`,{method:"POST",signal:g,timeoutMs:this.#r,body:r,multipart:!0})}catch(c){throw e?.aborted?A_(e):c?.code?.startsWith?.("discord-")?Whe(c):Zhe(c)}}editMessage({channelId:t,messageId:o,content:i,signal:e}){return this.#c(`channels/${ja(t,"channel id")}/messages/${ja(o,"message id")}`,{method:"PATCH",signal:e,body:{content:i,allowed_mentions:{parse:[],replied_user:!1}}})}sendTyping({channelId:t,signal:o}){return this.#c(`channels/${ja(t,"channel id")}/typing`,{method:"POST",signal:o,expectBody:!1})}async addOwnReaction({channelId:t,messageId:o,emoji:i,signal:e}={}){let a=QY(i);return await this.#c(`channels/${ja(t,"channel id")}/messages/${ja(o,"message id")}/reactions/${encodeURIComponent(a)}/@me`,{method:"PUT",signal:e,expectBody:!1,retry:!1}),a}removeOwnReaction({channelId:t,messageId:o,emoji:i,signal:e}={}){let a=QY(i);return this.#c(`channels/${ja(t,"channel id")}/messages/${ja(o,"message id")}/reactions/${encodeURIComponent(a)}/@me`,{method:"DELETE",signal:e,expectBody:!1,retry:!1})}async#c(t,{method:o,body:i,signal:e,timeoutMs:a=15e3,expectBody:A=!0,retry:r=!0,multipart:s=!1}){let g;try{g=await this.#A(new URL(t,this.#t),{method:o,headers:{authorization:`Bot ${this.#e}`,...s?{}:{"content-type":"application/json"},"user-agent":"DeepSeek-Harness-dsh-im (https://github.com/xmanrui/dsh-im, 1.1.0)"},...i===void 0?{}:{body:s?i:JSON.stringify(i)},signal:fY(e,a),redirect:"error"})}catch(I){throw I?.name==="AbortError"||I?.name==="TimeoutError"?I:new Error(`Discord ${o} transport failed`)}let c=null;if(A||g.status===429||!g.ok)try{c=await g.json()}catch{if(A){let I=new Error(`Discord ${o} returned invalid JSON`);throw I.status=g?.status,I}}if(g.status===429&&r){let I=Math.min(1e4,Math.max(50,Number(c?.retry_after)*1e3||1e3));return await Xhe(I,e),this.#c(t,{method:o,body:i,signal:e,timeoutMs:a,expectBody:A,retry:!1,multipart:s})}if(!g.ok){let I=new Error(qn(c?.message)??`Discord API failed with HTTP ${g.status}`);I.code=`discord-${g.status}`,I.status=g.status,(Number.isInteger(c?.code)||typeof c?.code=="string")&&(I.providerCode=c.code);let d=Number(c?.retry_after);throw Number.isFinite(d)&&d>=0&&(I.retry_after=d,I.retryAfter=d),I}return A?c:null}};async function mY(n,t={}){let i=await new wE({token:n,...t}).getCurrentUser();if(!i?.id||i?.bot!==!0)throw new Error("Discord token does not belong to a bot");return{platformId:String(i.id),name:qn(i.global_name)??qn(i.username)??D("Discord\u673A\u5668\u4EBA"),username:qn(i.username)}}var eEe=Object.freeze({success(){},error(){},clear(){},settled:()=>Promise.resolve()});function SY(n,t){!n||typeof n!="object"||(n[t]=(n[t]??0)+1)}async function AEe(n,t){let o=AbortSignal.timeout(t),i,e=new Promise((a,A)=>{i=()=>A(o.reason??new DOMException("Timed out","TimeoutError")),o.addEventListener("abort",i,{once:!0})});try{return await Promise.race([n(o),e])}finally{o.removeEventListener("abort",i)}}function gQ({adapter:n,target:t,reactions:o,status:i,logger:e=console,label:a="channel",timeoutMs:A=2e3}={}){if(!t||typeof n?.addReaction!="function"||typeof n?.removeReaction!="function"||typeof o?.processing!="string"||!o.processing||!Number.isSafeInteger(A)||A<=0)return eEe;let r=null,s=!1,g=async(B,f)=>{try{let Q=await AEe(f,A);return SY(i,B==="add"?"reactionsAdded":"reactionsRemoved"),{ok:!0,value:Q}}catch(Q){return SY(i,"reactionErrors"),e.warn?.(`[dsh-im:${a}] status reaction ${B} failed:`,Q?.message??Q?.name??String(Q)),{ok:!1,value:null}}},c=async B=>{if(r!==null){let Q=r;r=null,await g("remove",y=>n.removeReaction(t,Q,{signal:y}))}if(typeof B!="string"||!B)return;let f=await g("add",Q=>n.addReaction(t,B,{signal:Q}));f.ok&&f.value!==void 0&&f.value!==null&&(r=f.value)},I=c(o.processing),d=B=>{s||(s=!0,I=I.then(()=>c(B),()=>c(B)),I.catch(()=>{}))};return Object.freeze({success:()=>d(o.success),error:()=>d(o.error),clear:()=>d(null),settled:()=>I})}var DY="\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002",tEe="\u4EFB\u52A1\u5DF2\u5B8C\u6210\u3002";function Si(n){return typeof n=="string"?n.trim():""}function rEe(n,t,o){return t.actor===o&&(n.kind!=="group"||n.addressed===!0)&&!Vt(n)&&!Ft(n)&&!!Si(n.content)}function aEe(n,t,o){let i=String(n??D("\u7ED3\u679C\u6587\u4EF6")).replace(/[\r\n]+/g," ").trim().slice(0,255)||D("\u7ED3\u679C\u6587\u4EF6");switch(t?.code){case"artifact-delivery-uncertain":return D("\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:i});case"artifact-permission-required":return o?.key==="slack"?D("\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:i}):o?.key==="discord"?D("\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:i}):o?.key==="telegram"?D("\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:i}):D("\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:i});case"artifact-too-large":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u8D85\u8FC7\u5F53\u524D\u6E20\u9053\u5927\u5C0F\u4E0A\u9650\uFF0C\u672A\u53D1\u9001\u3002",{name:i});case"artifact-empty":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u4E3A\u7A7A\uFF0C\u672A\u53D1\u9001\u3002",{name:i});case"artifact-invalid":case"artifact-changed":case"artifact-unavailable":return D("\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:i});case"artifact-rate-limited":return D("\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:i});case"artifact-provider-rejected":return D("\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:i});default:return D("\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:i})}}function zi(){return{messagesReceived:0,messagesReplied:0,messagesRejected:0,lastMessageAt:null,lastReplyAt:null,lastRejectedAt:null,lastError:null,lastMessageError:null,reactionsAdded:0,reactionsRemoved:0,reactionErrors:0}}var zn=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l=new Map;#i=new Map;#I=new Map;#s=new Map;#p=new Set;#d=new Set;#h;#E=new Bi;constructor({descriptor:t,bot:o,harness:i,state:e,contextEnhancement:a,status:A=zi(),logger:r=console,replyTimeoutMs:s=6e5,signal:g}){if(!t?.key||!t?.label)throw new TypeError("A channel descriptor is required");if(!o||typeof o.sendText!="function")throw new TypeError("A bot client is required");if(!i||!e)throw new TypeError("Harness client and state store are required");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s,this.#g=g,this.#h=new pi({label:t.key,logger:r})}get status(){return structuredClone(this.#a)}accept(t,{contextSnapshot:o}={}){if(this.#g?.aborted)return Promise.resolve();let i=Si(t?.conversationId),e=t?.kind==="group"?"group":"direct",a={...t,kind:e,conversationId:i},A=Si(a.messageId),r=Si(a.senderId);if(!A||!r||!i||a.senderIsBot===!0||this.#r.hasSeen(A)||this.#s.has(A))return Promise.resolve();this.#s.set(A,o===void 0?Zr(this.#c,t?.kind):o);let s=gQ({adapter:this.#A,target:a.kind==="direct"||a.addressed===!0?a.reactionTarget:null,reactions:this.#e.reactions,status:this.#a,logger:this.#n,label:this.#e.key});a.statusReaction=s;let g=this.#C(a,A,r);return g.then(()=>s.success(),()=>s.error()),g}#C(t,o,i){t.kind==="direct"&&lo(this.#r,t.connectionTestTarget??t.replyTarget);let e=`${t.kind}:${t.conversationId}`,a=this.#i.get(e),A=Si(t.content),r=Qo(A);if(r&&t.kind==="group"&&t.addressed===!0)return this.#B(t,o,Kn());if(r&&t.kind==="direct"){if(/^\/batch$/iu.test(A)&&(this.#l.has(e)||a||this.#h.hasPending(e)))return this.#B(t,o,yo());let d=this.#E.handle(e,A,{plainText:!!A&&t.plainText!==!1&&!Vt(t)&&!Ft(t)});if(d.handled)return d.kind==="submit"?this.#u({...t,content:d.prompt,batchSubmission:{token:d.token}},o,i,e):this.#B(t,o,d.message)}else if(t.kind==="direct"&&this.#E.status(e).phase==="collecting"){let I=this.#E.handle(e,A,{plainText:!!A&&t.plainText!==!1&&!Vt(t)&&!Ft(t)});if(I.handled)return this.#B(t,o,I.message)}let g=t.kind==="direct"&&this.#E.status(e).phase==="collecting"?null:Ei(A)?xi:Ft(t)?null:Yi(A)?Ci:ji(A)?Ji:qi(A)?ui:null;if(g&&(t.kind!=="group"||t.addressed===!0)){let I;return I=this.#m(t,o,e,g).finally(()=>{this.#s.delete(o),this.#d.delete(I)}),this.#d.add(I),I}let c=this.#h.claimReply({key:e,actor:i,messageId:o,text:Vt(t)||Ft(t)?"":t.content,addressed:t.kind!=="group"||t.addressed===!0,hasPendingQuestion:!!a,questionCompletion:a?.submitting||a?.claimedReplyMessageId?a.queue:null,isQuestionPending:()=>this.#i.has(e),send:I=>this.#A.sendText(t.replyTarget,I)});if(c){let I;return I=c.process(async()=>this.#r.hasSeen(o)?!1:(await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString(),!0)).finally(()=>{this.#s.delete(o),this.#p.delete(I)}),this.#p.add(I),I}if(a&&a.actor!==i)return this.#u(t,o,i,e);if(a?.submitting||a?.claimedReplyMessageId)return this.#u(t,o,i,e);if(a){rEe(t,a,i)&&(a.claimedReplyMessageId=o);let d=(a.queue??Promise.resolve()).catch(()=>{}).then(()=>this.#y(t,o,i,e,a)).finally(()=>{this.#s.delete(o),a.claimedReplyMessageId===o&&(a.claimedReplyMessageId=null),a.queue===d&&(a.queue=null)});return a.queue=d,d}return this.#u(t,o,i,e)}#B(t,o,i){let e;return e=(async()=>{this.#r.hasSeen(o)||(await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString(),i&&await this.#A.sendText(t.replyTarget,i),this.#a.lastError=null)})().catch(async a=>{if(this.#g?.aborted){t.statusReaction?.clear();return}t.statusReaction?.error(),this.#a.lastError=a?.message??String(a);let A=At(this.#a,a);this.#n.error?.(`[dsh-im:${this.#e.key}] failed to process a batch input message [${A.referenceId}]:`,a)}).finally(()=>{this.#s.delete(o),this.#d.delete(e)}),this.#d.add(e),e}#u(t,o,i,e,{releaseMessageId:a=!0,alreadyRecorded:A=!1}={}){let s=(this.#l.get(e)??Promise.resolve()).catch(()=>{}).then(()=>this.#Q(t,o,i,e,{alreadyRecorded:A})).finally(()=>{a&&this.#s.delete(o),this.#l.get(e)===s&&this.#l.delete(e)});return this.#l.set(e,s),s}async waitForIdle(){await Promise.allSettled([...this.#l.values(),...[...this.#i.values()].flatMap(t=>t.queue?[t.queue]:[]),...this.#p,...this.#d])}async#m(t,o,i,e){if(this.#r.hasSeen(o))return;await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString();let a=t.replyTarget;try{let A=await e(Si(t.content),this.#t,this.#r,i,{signal:this.#g,isDirect:t.kind==="direct",hasImages:Vt(t),hasFiles:Ft(t),pendingInteraction:this.#i.has(i)||this.#h.hasPending(i),control:{owner:this,key:i}});A?.stopped&&await Promise.allSettled([this.#_(i),this.#h.closeRoute(i)]);for(let r of A?.messages??[A?.message])r&&await this.#A.sendText(a,r);this.#a.lastError=null}catch(A){if(A?.code==="turn-stopped"||this.#g?.aborted){t.statusReaction?.clear();return}t.statusReaction?.error(),this.#a.lastError=A?.message??String(A);let r=At(this.#a,A);this.#n.error?.(`[dsh-im:${this.#e.key}] failed to process a command [${r.referenceId}]:`,A),await this.#A.sendText(a,dt(r)).catch(()=>{})}}sendConnectionTest(t){return qg({state:this.#r,text:t,channelLabel:D("{label}\u673A\u5668\u4EBA",{label:this.#e.label}),send:(o,i)=>this.#A.sendText(o,i)})}async#S(t,o,i=[],e){let a=await Do({artifacts:i,baseReceipt:e,deliveryId:o,channelKey:this.#e.key,signal:this.#g,sendImage:typeof this.#A.sendImage=="function"?A=>this.#A.sendImage(t,A):void 0,sendFile:typeof this.#A.sendFile=="function"?A=>this.#A.sendFile(t,A):void 0,onFailure:(A,r)=>At(this.#a,r,{userMessage:aEe(A?.fileName,r,this.#e),reason:r?.code}),sendFailureNotice:(A,r,s)=>this.#A.sendText(t,dt(s)),logger:this.#n});return this.#a.artifactsSent=(this.#a.artifactsSent??0)+a.artifactsSent,this.#a.artifactSendErrors=(this.#a.artifactSendErrors??0)+a.artifactSendErrors,{receipt:a.receipt,userVisible:a.userVisible,artifactSendErrors:a.artifactSendErrors}}async#Q(t,o,i,e,{alreadyRecorded:a=!1}={}){if(!a){if(this.#r.hasSeen(o))return;await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString()}let A=t.replyTarget,r=Si(t.content),s=t.batchSubmission,g=null,c=!1;try{if(this.#g?.throwIfAborted(),t.kind==="group"&&t.addressed!==!0){this.#a.messagesRejected+=1,this.#a.lastRejectedAt=new Date().toISOString();return}let I=Vt(t),d=Ft(t);if(!r&&!I&&!d){await this.#A.sendText(A,D("\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u548C\u6587\u4EF6\u6D88\u606F\u3002"));return}let B=r.toLowerCase();if(!I&&!d&&B==="/help"){await this.#A.sendText(A,[D("{label}\u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002",{label:this.#e.label}),"",D("\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002"),D("/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"),D("/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"),D("/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09"),D("/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A"),D("/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84"),D("/sessionlist \u6216 /sessions [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"),D("/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"),D("/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"),D("/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7"),D("/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7"),D("/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B"),D("\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]"),D("/presetlist \u6216 /presets \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset"),D("/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset"),D("\u7EAF\u6570\u5B57 ID\uFF1A/preset id:"),D("/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"),D("/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1"),D("/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"),D("/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09"),D("/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21"),D("/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21"),D("/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"),D("/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C"),D("/help \u663E\u793A\u672C\u5E2E\u52A9")].join(` `));return}if(!I&&!d&&B==="/status"){await this.#t.ensureRunning({signal:this.#g}),await this.#A.sendText(A,D("{label}\u673A\u5668\u4EBA\u4E0E DeepSeek Harness \u8FDE\u63A5\u6B63\u5E38\u3002",{label:this.#e.label}));return}let f=!I&&!d?await uo(r,this.#t,e):null;if(f){for(let J of f.messages??[f.message])await this.#A.sendText(A,J);return}if(!I&&!d&&B==="/new"){await this.#r.clearSession(e),await this.#A.sendText(A,D("\u5DF2\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002\u8BF7\u53D1\u9001\u4F60\u7684\u95EE\u9898\u3002"));return}let Q=!I&&!d?await hi(r,this.#t,this.#r,e,{signal:this.#g}):null;if(Q){await this.#A.sendText(A,Q.message);return}await this.#A.sendTyping?.(A).catch(J=>{this.#n.warn?.(`[dsh-im:${this.#e.key}] typing indicator failed:`,J)});let y=!1;if(typeof this.#A.openDeliveryStream=="function")try{g=await this.#A.openDeliveryStream(A),c=!0}catch(J){this.#n.warn?.(`[dsh-im:${this.#e.key}] unable to start a semantic reply stream; using final delivery:`,J)}else if(typeof this.#A.openStream=="function")try{g=await this.#A.openStream(A)}catch(J){this.#n.warn?.(`[dsh-im:${this.#e.key}] unable to start a streamed reply; using text:`,J)}let m=I?await Eo(t,{signal:this.#g}):void 0,_=this.#s.get(o);_&&(m=fo(m??r,_,()=>({channel:this.#e.key,senderId:i,senderName:t.contextSource?.()?.senderName})));let{answer:T,artifacts:R=[]}=await di({harness:this.#t,state:this.#r,key:e,text:r,content:m,createOptions:this.#g?{signal:this.#g}:void 0,existsOptions:this.#g?{signal:this.#g}:void 0,askOptions:{timeoutMs:this.#o,signal:this.#g,control:{owner:this,key:e},onUpdate:g?async J=>{let H=J.type==="text"?J.text:J.type==="tool"?D("\u6B63\u5728\u4F7F\u7528{name}\u2026",{name:J.name}):J.text;if(H){let N=J.type==="text"?"markdown":"plain";await g.update(c?Yn(H,N):H)}}:void 0,onInteraction:J=>this.#f(J,{key:e,actor:i,target:A,requiresMention:t.kind==="group"&&t.requiresMention!==!1}),onInteractionResolved:J=>this.#b(J),files:t.files}});s&&this.#E.complete(e,s.token);let F=!Si(T)&&R.length>0,j=F?D(tEe):T,U=F?"plain":"markdown",z=null,q=null;if(g)try{let J=await g.finish(c?Yn(j,U):j);y=!0,q=Wt({deliveryId:o,presentation:J?.presentation??g.presentation??`${this.#e.key}-stream`,providerMessageIds:[...Ra(g),...Ra(J)],deliveryOutcome:J?.deliveryOutcome,reason:J?.reason})}catch(J){g.cancel?.(),this.#n.warn?.(`[dsh-im:${this.#e.key}] streamed reply finalization failed; using text:`,J)}if(!y)try{let J=typeof this.#A.sendDelivery=="function"?await this.#A.sendDelivery(A,Yn(j,U)):await this.#A.sendText(A,j);q=Wt({deliveryId:o,presentation:J?.presentation??`${this.#e.key}-text`,providerMessageIds:Ra(J),deliveryOutcome:J?.deliveryOutcome,reason:J?.reason})}catch(J){z=ba(J)}let x=q?.deliveryOutcome==="unknown";q?.deliveryOutcome==="failed"?z=ba(new Error(`Final text delivery failed (${q.reason??"unknown"})`),{uncertain:!1}):x&&(z=ba(new Error(`Final text delivery outcome is unknown (${q.reason??"unknown"})`)));let G=await this.#S(A,o,R,q);if(z&&(!G.userVisible||x))throw z.deliveryReceipt=G.receipt,z;return z&&G.artifactSendErrors===0&&At(this.#a,z),G.userVisible&&(this.#a.messagesReplied+=1,this.#a.lastReplyAt=new Date().toISOString(),this.#a.lastError=null,!z&&G.artifactSendErrors===0&&po(this.#a)),G.receipt}catch(I){let d=I?.code==="turn-stopped";s&&d&&this.#E.complete(e,s.token);let B=s&&!d?this.#E.fail(e,s.token):null;if(d){if(t.statusReaction?.clear(),g)try{await g.finish(D("\u5DF2\u505C\u6B62\u3002"))}catch{g.cancel?.()}return}if(this.#g?.aborted){t.statusReaction?.clear(),g?.cancel?.();return}t.statusReaction?.error(),this.#a.lastError=I?.message??String(I);let f=async T=>{let R=typeof g?.fail=="function"?"fail":typeof g?.finish=="function"?"finish":null;if(!R)return!1;try{let F=await g[R](T);return R==="fail"?!!F&&F.deliveryOutcome!=="failed":F!==!1&&F?.deliveryOutcome!=="failed"}catch(F){return this.#n.warn?.(`[dsh-im:${this.#e.key}] unable to finalize the failed stream:`,F),!1}},Q=Co(I),y=So(I),m=At(this.#a,I,{userMessage:y??Q,reason:Ki(I)?.reason}),_=B?.retained?`${dt(m)} ${B.message}`:dt(m);if(this.#n.error?.(`[dsh-im:${this.#e.key}] failed to process a message [${m.referenceId}]:`,I),await f(_))return I.deliveryReceipt;g?.cancel?.();try{await this.#A.sendText(A,_)}catch(T){this.#n.error?.(`[dsh-im:${this.#e.key}] failed to send the safe error reply:`,T)}return I.deliveryReceipt}finally{await Promise.allSettled([this.#_(e),this.#h.closeRoute(e)])}}async#y(t,o,i,e,a){if(this.#g?.aborted){t.statusReaction?.clear();return}let A=this.#i.get(e),r=a.claimedReplyMessageId===o;if(!A||A!==a||A.submitting)return r&&(!A||A!==a)?this.#w(t,o):this.#u(t,o,i,e,{releaseMessageId:!1});if(this.#r.hasSeen(o))return;if(await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString(),t.kind==="group"&&t.addressed!==!0){this.#a.messagesRejected+=1,this.#a.lastRejectedAt=new Date().toISOString();return}let s=t.replyTarget,g=Si(t.content);if(!g||Vt(t)||Ft(t)){try{await this.#A.sendText(s,D("\u8BF7\u7528\u6587\u5B57\u56DE\u7B54\u5F53\u524D\u95EE\u9898\u3002"))}catch(d){this.#n.error?.(`[dsh-im:${this.#e.key}] failed to reject a non-text interaction reply:`,d)}return}let c=this.#i.get(e);if(!c||c!==a||c.submitting)return r&&(!c||c!==a)?this.#w(t,o,{alreadyRecorded:!0}):this.#u(t,o,i,e,{releaseMessageId:!1,alreadyRecorded:!0});if(c.target=s,c.needsPresentation){let d=c.presentationTask!==null;try{await this.#R(c)}catch(f){t.statusReaction?.error(),this.#a.lastError=D("{label}\u4EA4\u4E92\u95EE\u9898\u53D1\u9001\u5931\u8D25\u3002",{label:this.#e.label}),this.#n.error?.(`[dsh-im:${this.#e.key}] failed to retry an interaction question:`,f),c.interaction.reconnect?.();return}let B=this.#i.get(e);if(!B||B!==a||B.submitting)return r&&(!B||B!==a)?this.#w(t,o,{alreadyRecorded:!0}):this.#u(t,o,i,e,{releaseMessageId:!1,alreadyRecorded:!0});if(!d)return}let I=c.questions[c.index];if(I){if(c.answers.push(li(I,g)),c.index+=1,c.indexthis.#A.sendText(e,c)});if(t?.kind!=="question")return;let A=t?.payload?.questions,r=Si(t?.interactionId)||Si(t?.rpcId);if(!Si(t?.rpcId)||!r||!Si(t?.sessionId)||!Array.isArray(A)||A.length===0||A.some(c=>!ci(c))){this.#n.warn?.(`[dsh-im:${this.#e.key}] ignored an invalid Harness question interaction`);return}if(t.recovered===!0){await this.#P(t,`${this.#e.label} safely cancelled an interaction left by an earlier client.`);try{await this.#A.sendText(e,D("\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(c){this.#n.error?.(`[dsh-im:${this.#e.key}] failed to send an interaction recovery notice:`,c)}return}let s=this.#i.get(o);if(s?.interactionId===r){s.interaction=t,s.needsPresentation&&await this.#R(s);return}if(this.#I.has(r))return;if(s){this.#n.warn?.(`[dsh-im:${this.#e.key}] cancelled a second pending Harness question`),await this.#P(t,`${this.#e.label} is already handling another user interaction.`);return}let g={kind:"question",interactionId:r,sessionId:t.sessionId,interaction:t,actor:i,requiresMention:a,questions:A,answers:[],index:0,target:e,queue:null,claimedReplyMessageId:null,submitting:!1,needsPresentation:!0,presentationTask:null};this.#i.set(o,g),this.#I.set(r,o),await this.#R(g)}async#b(t){if(t?.kind==="approval"){await this.#h.handleResolved(t);return}let o=Si(t?.interactionId);if(t?.kind!=="question"||!o)return;let i=this.#I.get(o);i&&this.#M(i,o)}#R(t){if(t.presentationTask)return t.presentationTask;let o=t.questions[t.index];if(!o)return Promise.resolve();let i=(async()=>{await this.#A.sendText(t.target,Ii(o,t.index,t.questions.length,{requiresMention:t.requiresMention})),t.needsPresentation=!1})();return t.presentationTask=i,i.then(()=>{t.presentationTask===i&&(t.presentationTask=null)},()=>{t.presentationTask===i&&(t.presentationTask=null)}),i}async#w(t,o,{alreadyRecorded:i=!1}={}){if(!i){if(this.#r.hasSeen(o))return;await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString()}try{await this.#A.sendText(t.replyTarget,D(DY))}catch(e){this.#n.error?.(`[dsh-im:${this.#e.key}] failed to send an expired interaction notice:`,e)}}#D(t,o){let i=this.#i.get(t);return!i||o!==void 0&&i.interactionId!==o?null:(this.#i.delete(t),this.#I.delete(i.interactionId),i)}#M(t,o){return this.#D(t,o)!==null}async#P(t,o){try{await t.respond({ok:!1,error:{code:"cancelled",message:o,details:{}}},{signal:AbortSignal.timeout(5e3)})}catch(i){if(i?.code!=="interaction-not-pending")throw i}}async#_(t){let o=this.#D(t);if(!(!o||o.kind!=="question"))try{await this.#P(o.interaction,`The ${this.#e.label} interaction ended before the user answered.`)}catch(i){this.#n.warn?.(`[dsh-im:${this.#e.key}] failed to cancel a pending Harness interaction:`,i)}}};var t_=Object.freeze({key:"discord",label:"Discord",connectionLabel:" Gateway \u957F\u8FDE\u63A5",reactions:Object.freeze({processing:"\u{1F440}",success:"\u2705",error:"\u274C"})}),cQ=class extends zn{constructor(t){super({descriptor:t_,...t})}};var OE=class extends Ep{constructor(t){super({...t,descriptor:t_,inspectToken:t.inspectToken??mY,deriveIdentity:uY,maskPlatformId:BY})}};var IQ=class extends pr{constructor(t){super({...t,rpcIdPrefix:"discord",logPrefix:"dsh-discord"})}};function Vn(n,t){let o=typeof n=="string"?n.trim():"";if(!o)return[];let i=[],e=o;for(;e.length>t;){let a=e.lastIndexOf(` @@ -337,9 +337,9 @@ ${a.join(` **1**\u5DE5\u4F5C\u533A\u5217\u8868 \xB7 **2**\u65B0\u4F1A\u8BDD \xB7 **3**\u4F1A\u8BDD\u5217\u8868 \xB7 **4**\u72B6\u6001 **5**\u{1F527}\u8865\u5168\u6743\u9650 \xB7 **6**\u5E2E\u52A9`))}),ko(D("\u{1F916} \u52A9\u624B\u4E2D\u5FC3"),B)}function YV(n){let{items:t,defaultId:o}=n,i=n._currentId,e=t.find(s=>s.id===i),a=t.find(s=>s.id===o),A=i===null?D("\u8DDF\u968F Host \u9ED8\u8BA4{default}",{default:a?`\uFF08${a.label}\uFF09`:""}):e?`${e.label}\uFF08${e.id}\uFF09`:D("{id}\uFF08\u5DF2\u4E0D\u53EF\u7528\uFF09",{id:i}),r=[{tag:"div",text:Ct(D("**\u5F53\u524D**\uFF1A{value}",{value:A}))},{tag:"div",text:Ct(D("**Host \u9ED8\u8BA4**\uFF1A{value}",{value:a?`${a.label}\uFF08${a.id}\uFF09`:D("\u672A\u8BBE\u7F6E")}))},{tag:"hr"}];if(t.length>=1){let s=t.map(g=>({text:{tag:"plain_text",content:`${g.label}\uFF08${g.id}\uFF09${g.id===i?" \u2713":""}`},value:g.id}));r.push({tag:"select_static",name:"preset_pick",placeholder:{tag:"plain_text",content:D("\u9009\u62E9\u9884\u8BBE")},initial_index:i===null?0:hd(s,i),options:s,behaviors:[{type:"callback",value:{action:"preset_pick"}}]},{tag:"hr"},qI(D("\u{1F504} \u8DDF\u968F\u9ED8\u8BA4"),"preset_default",D("\u{1F519} \u8FD4\u56DE\u83DC\u5355"),"back_to_menu"))}else r.push({tag:"div",text:Ct(D("\u5F53\u524D\u6CA1\u6709\u53EF\u9009\u62E9\u7684\u9884\u8BBE\u3002"))},zI());return ko(D("\u{1F916} \u9884\u8BBE\u5217\u8868"),r)}function jV(n){let{groups:t,current:o}=n,i=o?`${o.provider}/${o.model}`:null,e=[{tag:"div",text:Ct(D("**\u5F53\u524D\u6A21\u578B**\uFF1A{model}",{model:i||D("\u672A\u8BBE\u7F6E")}))},{tag:"hr"}],a=0;for(let A of t)a+=A.models.length;if(a===0)e.push({tag:"div",text:Ct(D("\u5F53\u524D\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u3002"))},zI());else{for(let r of t){let s=r.models.map(g=>{let c=`${r.id}/${g.id}`;return`${c}${c===i?" \u2713":""}`});e.push({tag:"div",text:Ct(`**${r.name}** ${s.join(` -`)}`)})}let A=[];for(let r of t)for(let s of r.models)A.push({value:`${r.id}/${s.id}`,text:{tag:"plain_text",content:`${r.name} - ${s.name}`}});e.push({tag:"hr"},{tag:"select_static",name:"model_pick",placeholder:{tag:"plain_text",content:D("\u9009\u62E9\u6A21\u578B")},initial_index:i===null?0:hd(A,i),options:A.map(r=>({text:{tag:"plain_text",content:`${r.text.content}${r.value===i?" \u2713":""}`},value:r.value})),behaviors:[{type:"callback",value:{action:"model_pick"}}]},{tag:"hr"},zI())}return ko(D("\u{1F9E0} \u6A21\u578B\u5217\u8868"),e)}function JV(n){let t=[{tag:"div",text:Ct(D("{icon} \u98DE\u4E66\u673A\u5668\u4EBA{state}",{icon:n.connected?"\u2705":"\u274C",state:n.connected?D("\u5DF2\u8FDE\u63A5"):D("\u672A\u8FDE\u63A5")}))},{tag:"div",text:Ct(D("\u{1F4C2} \u5DE5\u4F5C\u533A\uFF1A`{workspace}`",{workspace:n.workspace||D("\u672A\u8BBE\u7F6E")}))},{tag:"div",text:Ct(D("\u{1F916} \u9884\u8BBE\uFF1A{preset}",{preset:n.preset||D("\u672A\u8BBE\u7F6E")}))},{tag:"div",text:Ct(D("\u{1F9E0} \u6A21\u578B\uFF1A{model}",{model:n.model||D("\u672A\u8BBE\u7F6E")}))},{tag:"div",text:Ct(D("\u{1F4AC} \u4F1A\u8BDD\uFF1A{count} \u4E2A",{count:n.sessionCount}))},{tag:"hr"},zI()];return ko(D("\u{1F4CA} \u7CFB\u7EDF\u72B6\u6001"),t)}function qV(){return["\u{1F916} \u52A9\u624B\u83DC\u5355\uFF08\u56DE\u590D\u6570\u5B57\u5373\u53EF\uFF0C\u65E0\u9700\u8BB0\u547D\u4EE4\uFF09","","\u{1F4CB} \u4F1A\u8BDD / \u5DE5\u4F5C\u533A","/sessionlist \u5217\u51FA\u5DE5\u4F5C\u533A\u4F1A\u8BDD","/session ID \u7ED1\u5B9A\u5DF2\u6709\u4F1A\u8BDD","/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A","/workspace \u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A","/new \u5F00\u542F\u5168\u65B0\u4F1A\u8BDD","","\u{1F4CA} \u72B6\u6001 / \u538B\u7F29","/status \u8FDE\u63A5\u72B6\u6001","/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C","/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u4E0A\u4E0B\u6587","/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09","/archived on/off \u4F1A\u8BDD\u5217\u8868\u663E\u793A/\u9690\u85CF\u5F52\u6863","","\u{1F441} \u5173\u6CE8","/watch ID \u5173\u6CE8\u4F1A\u8BDD\uFF08\u5B8C\u6210\u540E\u63A8\u9001\uFF09","/watchlist \u5173\u6CE8\u5217\u8868","/unwatch ID \u53D6\u6D88\u5173\u6CE8","","\u{1F916} \u9884\u8BBE / \u6A21\u578B","/presetlist \u5217\u51FA\u53EF\u7528 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:","/preset --default \u8DDF\u968F Host \u9ED8\u8BA4","/models \u5217\u51FA\u6A21\u578B","/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7","/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7","/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B","","\u{1F4E6} \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","/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21","/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21","","\u{1F3AE} \u4EFB\u52A1\u63A7\u5236","/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1","/steer \u6307\u4EE4 \u7ED9 Agent \u8865\u5145\u6307\u4EE4","/repair \u8865\u5168\u98DE\u4E66\u6743\u9650\u4E0E\u5361\u7247\u56DE\u8C03"].map(n=>D(n)).join(` +`)}`)})}let A=[];for(let r of t)for(let s of r.models)A.push({value:`${r.id}/${s.id}`,text:{tag:"plain_text",content:`${r.name} - ${s.name}`}});e.push({tag:"hr"},{tag:"select_static",name:"model_pick",placeholder:{tag:"plain_text",content:D("\u9009\u62E9\u6A21\u578B")},initial_index:i===null?0:hd(A,i),options:A.map(r=>({text:{tag:"plain_text",content:`${r.text.content}${r.value===i?" \u2713":""}`},value:r.value})),behaviors:[{type:"callback",value:{action:"model_pick"}}]},{tag:"hr"},zI())}return ko(D("\u{1F9E0} \u6A21\u578B\u5217\u8868"),e)}function JV(n){let t=[{tag:"div",text:Ct(D("{icon} \u98DE\u4E66\u673A\u5668\u4EBA{state}",{icon:n.connected?"\u2705":"\u274C",state:n.connected?D("\u5DF2\u8FDE\u63A5"):D("\u672A\u8FDE\u63A5")}))},{tag:"div",text:Ct(D("\u{1F4C2} \u5DE5\u4F5C\u533A\uFF1A`{workspace}`",{workspace:n.workspace||D("\u672A\u8BBE\u7F6E")}))},{tag:"div",text:Ct(D("\u{1F916} \u9884\u8BBE\uFF1A{preset}",{preset:n.preset||D("\u672A\u8BBE\u7F6E")}))},{tag:"div",text:Ct(D("\u{1F9E0} \u6A21\u578B\uFF1A{model}",{model:n.model||D("\u672A\u8BBE\u7F6E")}))},{tag:"div",text:Ct(D("\u{1F4AC} \u4F1A\u8BDD\uFF1A{count} \u4E2A",{count:n.sessionCount}))},{tag:"hr"},zI()];return ko(D("\u{1F4CA} \u7CFB\u7EDF\u72B6\u6001"),t)}function qV(){return["\u{1F916} \u52A9\u624B\u83DC\u5355\uFF08\u56DE\u590D\u6570\u5B57\u5373\u53EF\uFF0C\u65E0\u9700\u8BB0\u547D\u4EE4\uFF09","","\u{1F4CB} \u4F1A\u8BDD / \u5DE5\u4F5C\u533A","/sessionlist \u6216 /sessions \u5217\u51FA\u5DE5\u4F5C\u533A\u4F1A\u8BDD","/session ID \u7ED1\u5B9A\u5DF2\u6709\u4F1A\u8BDD","/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A","/workspace \u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A","/new \u5F00\u542F\u5168\u65B0\u4F1A\u8BDD","","\u{1F4CA} \u72B6\u6001 / \u538B\u7F29","/status \u8FDE\u63A5\u72B6\u6001","/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C","/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u4E0A\u4E0B\u6587","/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09","/archived on/off \u4F1A\u8BDD\u5217\u8868\u663E\u793A/\u9690\u85CF\u5F52\u6863","","\u{1F441} \u5173\u6CE8","/watch ID \u5173\u6CE8\u4F1A\u8BDD\uFF08\u5B8C\u6210\u540E\u63A8\u9001\uFF09","/watchlist \u5173\u6CE8\u5217\u8868","/unwatch ID \u53D6\u6D88\u5173\u6CE8","","\u{1F916} \u9884\u8BBE / \u6A21\u578B","/presetlist \u6216 /presets \u5217\u51FA\u53EF\u7528 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:","/preset --default \u8DDF\u968F Host \u9ED8\u8BA4","/models \u5217\u51FA\u6A21\u578B","/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7","/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7","/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B","","\u{1F4E6} \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","/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21","/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21","","\u{1F3AE} \u4EFB\u52A1\u63A7\u5236","/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1","/steer \u6307\u4EE4 \u7ED9 Agent \u8865\u5145\u6307\u4EE4","/repair \u8865\u5168\u98DE\u4E66\u6743\u9650\u4E0E\u5361\u7247\u56DE\u8C03"].map(n=>D(n)).join(` `)}var pNe=["**\u{1F4CB} \u5361\u7247\u529F\u80FD**","","1. \u4F1A\u8BDD\u4E0B\u62C9 \u2014 \u5207\u6362\u5F53\u524D\u7ED1\u5B9A\u4F1A\u8BDD","2. \u5DE5\u4F5C\u533A\u4E0B\u62C9 \u2014 \u5207\u6362\u5DE5\u4F5C\u533A","3. \u{1F916} \u9884\u8BBE\u4E0B\u62C9 \u2014 \u5207\u6362 Agent \u9884\u8BBE","4. \u{1F9E0} \u6A21\u578B\u4E0B\u62C9 \u2014 \u5207\u6362\u6A21\u578B","5. \u{1F195} \u65B0\u4F1A\u8BDD \u2014 \u5F00\u542F\u5168\u65B0\u4F1A\u8BDD","6. \u{1F4CB} \u4F1A\u8BDD/\u5173\u6CE8 \u2014 \u67E5\u770B/\u7ED1\u5B9A\u4F1A\u8BDD\uFF0C\u7BA1\u7406\u5173\u6CE8","7. \u23F9 \u505C\u6B62 \u2014 \u505C\u6B62\u5F53\u524D\u4EFB\u52A1","8. \u{1F4D0} \u538B\u7F29 \u2014 \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u4E0A\u4E0B\u6587","9. \u8865\u5145\u6307\u4EE4 \u2014 \u7ED9 Agent \u53D1\u9001\u6307\u4EE4","10. \u{1F5C4} \u5F52\u6863\u5207\u6362 \u2014 \u663E\u793A/\u9690\u85CF\u5F52\u6863\u4F1A\u8BDD","11. \u{1F4CA} \u72B6\u6001 \u2014 \u67E5\u770B\u7CFB\u7EDF\u8FDE\u63A5\u72B6\u6001","12. \u{1F4D6} \u5E2E\u52A9 \u2014 \u67E5\u770B\u672C\u5E2E\u52A9"].join(` -`),dNe=["**\u2328\uFE0F \u6587\u672C\u547D\u4EE4**","","`/m` \u2014 \u6253\u5F00\u83DC\u5355\u5361\u7247","`/new` \u2014 \u5F00\u542F\u5168\u65B0\u4F1A\u8BDD","`/session ID` \u2014 \u7ED1\u5B9A\u5DF2\u6709\u4F1A\u8BDD","`/sessionlist [\u5DE5\u4F5C\u533A]` \u2014 \u5217\u51FA\u4F1A\u8BDD","`/workspace \u8DEF\u5F84` \u2014 \u5207\u6362\u5DE5\u4F5C\u533A","`/workspacelist` \u2014 \u5217\u51FA\u5DE5\u4F5C\u533A","`/status` \u2014 \u67E5\u770B\u8FDE\u63A5\u72B6\u6001","`/compact` \u2014 \u538B\u7F29\u4E0A\u4E0B\u6587","`/stop` \u2014 \u505C\u6B62\u5F53\u524D\u4EFB\u52A1","`/steer \u6307\u4EE4` \u2014 \u8865\u5145\u6307\u4EE4","`/watch ID` \u2014 \u5173\u6CE8\u4F1A\u8BDD","`/watchlist` \u2014 \u5173\u6CE8\u5217\u8868","`/unwatch ID` \u2014 \u53D6\u6D88\u5173\u6CE8","`/archived on/off` \u2014 \u5F52\u6863\u663E\u9690","`/presetlist` \u2014 \u5217\u51FA\u9884\u8BBE","`/preset [\u5E8F\u53F7/ID]` \u2014 \u5207\u6362\u9884\u8BBE","`/preset --default` \u2014 \u8DDF\u968F\u9ED8\u8BA4","`/models` \u2014 \u5217\u51FA\u6A21\u578B","`/reasoninglist` \u6216 `/reasonings` \u2014 \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7","`/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default]` \u2014 \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7","`/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID]` \u2014 \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B","`/batch` \u2014 \u5F00\u542F\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09","`/send` \u2014 \u63D0\u4EA4\u5F53\u524D\u6279\u6B21","`/cancel` \u2014 \u53D6\u6D88\u5F53\u524D\u6279\u6B21","`/repair` \u2014 \u8865\u5168\u98DE\u4E66\u6743\u9650\u4E0E\u5361\u7247\u56DE\u8C03"].join(` +`),dNe=["**\u2328\uFE0F \u6587\u672C\u547D\u4EE4**","","`/m` \u2014 \u6253\u5F00\u83DC\u5355\u5361\u7247","`/new` \u2014 \u5F00\u542F\u5168\u65B0\u4F1A\u8BDD","`/session ID` \u2014 \u7ED1\u5B9A\u5DF2\u6709\u4F1A\u8BDD","`/sessionlist [\u5DE5\u4F5C\u533A]` \u6216 `/sessions [\u5DE5\u4F5C\u533A]` \u2014 \u5217\u51FA\u4F1A\u8BDD","`/workspace \u8DEF\u5F84` \u2014 \u5207\u6362\u5DE5\u4F5C\u533A","`/workspacelist` \u2014 \u5217\u51FA\u5DE5\u4F5C\u533A","`/status` \u2014 \u67E5\u770B\u8FDE\u63A5\u72B6\u6001","`/compact` \u2014 \u538B\u7F29\u4E0A\u4E0B\u6587","`/stop` \u2014 \u505C\u6B62\u5F53\u524D\u4EFB\u52A1","`/steer \u6307\u4EE4` \u2014 \u8865\u5145\u6307\u4EE4","`/watch ID` \u2014 \u5173\u6CE8\u4F1A\u8BDD","`/watchlist` \u2014 \u5173\u6CE8\u5217\u8868","`/unwatch ID` \u2014 \u53D6\u6D88\u5173\u6CE8","`/archived on/off` \u2014 \u5F52\u6863\u663E\u9690","`/presetlist` \u6216 `/presets` \u2014 \u5217\u51FA\u9884\u8BBE","`/preset [\u5E8F\u53F7/ID]` \u2014 \u5207\u6362\u9884\u8BBE","`/preset --default` \u2014 \u8DDF\u968F\u9ED8\u8BA4","`/models` \u2014 \u5217\u51FA\u6A21\u578B","`/reasoninglist` \u6216 `/reasonings` \u2014 \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7","`/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default]` \u2014 \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7","`/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID]` \u2014 \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B","`/batch` \u2014 \u5F00\u542F\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09","`/send` \u2014 \u63D0\u4EA4\u5F53\u524D\u6279\u6B21","`/cancel` \u2014 \u53D6\u6D88\u5F53\u524D\u6279\u6B21","`/repair` \u2014 \u8865\u5168\u98DE\u4E66\u6743\u9650\u4E0E\u5361\u7247\u56DE\u8C03"].join(` `),hNe=["**\u{1F4A1} \u6570\u5B57\u515C\u5E95**","\u56DE\u590D\u6570\u5B57\u5FEB\u901F\u64CD\u4F5C\uFF1A","**1**\u5DE5\u4F5C\u533A\u5217\u8868 \xB7 **2**\u65B0\u4F1A\u8BDD \xB7 **3**\u4F1A\u8BDD/\u5173\u6CE8","**4**\u72B6\u6001 \xB7 **5**\u8865\u5168\u6743\u9650 \xB7 **6**\u5E2E\u52A9"].join(` `);function zV(n=[]){let t=Array.isArray(n)&&n.length>0?` `+n.join(` @@ -347,11 +347,11 @@ ${s.join(` `)+t)},{tag:"hr"},{tag:"div",text:Ct(D(hNe))},{tag:"hr"},zI()];return ko(D("\u{1F4D6} \u5E2E\u52A9"),o)}function VV(n){if(typeof n!="string"||!/^[A-Za-z0-9_-]{16,128}$/.test(n))throw new TypeError("A safe card-action probe nonce is required");return ko(D("\u{1F9EA} \u9A8C\u8BC1\u5361\u7247\u6309\u94AE"),[{tag:"div",text:Ct(D("\u6388\u6743\u5DF2\u63D0\u4EA4\u3002\u8BF7\u70B9\u51FB\u4E0B\u65B9\u6309\u94AE\uFF1B\u673A\u5668\u4EBA\u771F\u5B9E\u6536\u5230\u56DE\u8C03\u540E\u624D\u4F1A\u5224\u5B9A\u4FEE\u590D\u6210\u529F\u3002"))},{tag:"column_set",flex_mode:"none",columns:[{tag:"column",width:"weighted",weight:1,elements:[{tag:"button",text:Qm(D("\u5B8C\u6210\u9A8C\u8BC1")),type:"primary",width:"fill",behaviors:[{type:"callback",value:{action:"repair_verify",nonce:n}}]}]}]}])}function WV(n,t,o,i,e=new Set){let a=o*dc,A=t.slice(a,a+dc),r=Math.max(1,Math.ceil(i/dc)),s=I=>typeof e?.has=="function"&&e.has(I),g=(I,d)=>({tag:"column_set",flex_mode:"none",horizontal_spacing:"default",columns:[{tag:"column",width:"90px",vertical_align:"center",elements:[I]},{tag:"column",width:"weighted",weight:1,vertical_align:"center",elements:[d]}]}),c=[{tag:"div",text:Ct(D(`**\u5DE5\u4F5C\u533A**\uFF1A{workspace} \u5171 **{total}** \u4E2A\u4F1A\u8BDD{paging}`,{workspace:`\`${n}\``,total:i,paging:i>dc?D("\uFF08\u7B2C {page}/{pageCount} \u9875\uFF09",{page:o+1,pageCount:r}):""}))},...A.map((I,d)=>{let B=`${d+1}. ${qC(I.title)}${I.archived===!0?D("\uFF08\u5DF2\u5F52\u6863\uFF09"):""}`,f=s(I.sessionId);return g(fm(f?D("\u2B50 \u53D6\u6D88\u5173\u6CE8"):D("\u2606 \u5173\u6CE8"),f?`unwatch:${I.sessionId}`:`watch:${I.sessionId}`),fm(B,`use:${I.sessionId}`))})];return o>0&&c.push(ns(D("\u25C0 \u4E0A\u4E00\u9875"),`sessions:${o-1}`)),o+1ns(`${e+1}. ${i}${i===t?D("\uFF08\u5F53\u524D\uFF09"):""}`,`workspace:${i}`)),{tag:"hr"},zI()];return ko(D("\u{1F5C2} \u5DE5\u4F5C\u533A"),o)}function ENe(n,t){let o=new Set(n.map(e=>e.sessionId)),i=(Array.isArray(t)?t:[]).filter(e=>e?.sessionId&&!o.has(e.sessionId)).slice(0,30).map(e=>({text:{tag:"plain_text",content:qC(e.title??e.sessionId)},value:e.sessionId}));return i.length===0?null:{tag:"multi_select_static",name:"watch_add",placeholder:{tag:"plain_text",content:D("\u52FE\u9009\u8981\u5173\u6CE8\u7684\u4F1A\u8BDD")},options:i,behaviors:[{type:"callback",value:{action:"watch_add",kind:"multi"}}]}}function CNe(n){let t=n.slice(0,30).map(o=>({text:{tag:"plain_text",content:qC(o.title)},value:o.sessionId}));return t.length===0?null:{tag:"multi_select_static",name:"watch_remove",placeholder:{tag:"plain_text",content:D("\u52FE\u9009\u8981\u53D6\u6D88\u5173\u6CE8\u7684\u4F1A\u8BDD")},options:t,behaviors:[{type:"callback",value:{action:"watch_remove",kind:"multi"}}]}}function XV(n,t){let o=Array.isArray(n)?n:[],i=ENe(o,t),e=CNe(o),a=[];return o.length===0?a.push({tag:"div",text:Ct(D("\u5F53\u524D\u6CA1\u6709\u5173\u6CE8\u7684\u4F1A\u8BDD\u3002\u4EFB\u52A1\u5B8C\u6210\u4F1A\u81EA\u52A8\u63A8\u9001\u7ED3\u679C\u3002"))}):a.push({tag:"div",text:Ct(D("\u5F53\u524D\u5173\u6CE8 **{count}** \u4E2A\u4F1A\u8BDD\uFF1A",{count:o.length}))}),i&&a.push({tag:"hr"},{tag:"div",text:Ct(D("**\u2795 \u6DFB\u52A0\u5173\u6CE8**\uFF08\u591A\u9009\u4E0B\u62C9\u52FE\u9009\uFF09"))},i),e&&a.push({tag:"hr"},{tag:"div",text:Ct(D("**\u2796 \u53D6\u6D88\u5173\u6CE8**\uFF08\u591A\u9009\u4E0B\u62C9\u52FE\u9009\uFF09"))},e),a.push({tag:"hr"},qI(D("\u{1F4CB} \u4F1A\u8BDD\u5217\u8868"),"sessions",D("\u{1F519} \u8FD4\u56DE\u83DC\u5355"),"back_to_menu")),ko(D("\u{1F441} \u5173\u6CE8\u5217\u8868"),a)}function $V(n,t,o){let i=o==="completed"?D("\u5DF2\u5B8C\u6210"):o==="stopped"?D("\u5DF2\u505C\u6B62"):o==="aborted"?D("\u5DF2\u4E2D\u6B62"):o==="cancelled"?D("\u5DF2\u53D6\u6D88"):D("\u5DF2\u7ED3\u675F");return ko(D("\u2705 \u4EFB\u52A1\u5B8C\u6210"),[{tag:"div",text:Ct(`**${qC(t)}** \`${n}\``)},{tag:"div",text:Ct(D("**\u72B6\u6001**\uFF1A{reason}",{reason:i}))},{tag:"hr"},qI(D("\u{1F4CB} \u4F1A\u8BDD\u5217\u8868"),"sessions",D("\u{1F519} \u8FD4\u56DE\u83DC\u5355"),"back_to_menu"),{tag:"div",text:Ct(D("\u7ED1\u5B9A\u8BE5\u4F1A\u8BDD\u540E\u53EF\u7EE7\u7EED\u8FFD\u95EE\uFF0C\u8F93\u5165\u6587\u5B57\u5373\u53EF\u3002"))}])}var eW=["\u7EE7\u7EED","\u52A0\u901F\u8FD0\u884C","\u603B\u7ED3\u5F53\u524D\u8FDB\u5C55","\u66F4\u7B80\u6D01\u4E9B","\u66F4\u8BE6\u7EC6\u4E9B"],zC="__steer_custom__";function AW({hasSession:n}){let t=n?D("\u4ECE\u4E0B\u65B9\u4E0B\u62C9\u9009\u62E9\u8865\u5145\u6307\u4EE4\uFF1B\u6700\u540E\u4E00\u9879\u53EF\u81EA\u5B9A\u4E49\u8F93\u5165\u3002"):D("\u5F53\u524D\u6CA1\u6709\u7ED1\u5B9A\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u7ED1\u5B9A\u4F1A\u8BDD\u518D\u8865\u5145\u6307\u4EE4\u3002"),o=eW.map(e=>({text:{tag:"plain_text",content:D(e)},value:D(e)}));o.push({text:{tag:"plain_text",content:D("\u270F\uFE0F \u66F4\u591A / \u81EA\u5B9A\u4E49\u2026")},value:zC});let i=[{tag:"div",text:Ct(t)},{tag:"hr"},{tag:"select_static",name:"steer_quick",placeholder:{tag:"plain_text",content:D("\u9009\u62E9\u8865\u5145\u6307\u4EE4")},initial_index:0,options:o,behaviors:[{type:"callback",value:{action:"steer",source:"quick"}}]},{tag:"hr"},ns(D("\u{1F519} \u8FD4\u56DE\u83DC\u5355"),"back_to_menu")];return ko(D("\u2795 \u8865\u5145\u6307\u4EE4"),i)}function Qv(){let n=[{tag:"div",text:Ct(D("\u8F93\u5165\u8865\u5145\u6307\u4EE4\u540E\u70B9\u300C\u63D0\u4EA4\u300D\uFF0C\u53D1\u9001\u7ED9\u5F53\u524D\u8FD0\u884C\u7684\u4EFB\u52A1\u3002"))},{tag:"hr"},{tag:"form",name:"steer_form",elements:[{tag:"input",name:"steer_text",placeholder:{tag:"plain_text",content:D("\u8F93\u5165\u4F60\u7684\u8865\u5145\u6307\u4EE4")}},{tag:"button",name:"steer_submit",text:{tag:"plain_text",content:D("\u63D0\u4EA4")},type:"primary",width:"fill",form_action_type:"submit",behaviors:[{type:"callback",value:{action:"steer",source:"form"}}]}]},{tag:"hr"},ns(D("\u{1F519} \u8FD4\u56DE\u83DC\u5355"),"back_to_menu")];return ko(D("\u2795 \u81EA\u5B9A\u4E49\u6307\u4EE4"),n)}import{mkdir as uNe,readFile as BNe,rename as fNe,writeFile as QNe}from"node:fs/promises";import{dirname as yNe}from"node:path";var mNe=Object.freeze({version:1,sessions:{},seenMessageIds:[],watches:{},includeArchivedSessions:!1}),mm=20;function yv(n){return n&&typeof n=="object"&&typeof n.sessionId=="string"&&n.sessionId.length>0&&typeof n.chatId=="string"&&n.chatId.length>0}var ym=class{#e;#A=structuredClone(mNe);#t=Promise.resolve();constructor(t){this.#e=t}async load(){try{let t=JSON.parse(await BNe(this.#e,"utf8"));this.#A={version:1,sessions:t.sessions&&typeof t.sessions=="object"?t.sessions:{},seenMessageIds:Array.isArray(t.seenMessageIds)?t.seenMessageIds.slice(-1e3):[],watches:t.watches&&typeof t.watches=="object"?t.watches:{},includeArchivedSessions:typeof t.includeArchivedSessions=="boolean"?t.includeArchivedSessions:!1}}catch(t){if(t?.code!=="ENOENT")throw t;await this.#r()}return this}sessionFor(t){return this.#A.sessions[t]??null}async setSession(t,o){this.#A.sessions[t]=o,await this.#r()}async clearSession(t){delete this.#A.sessions[t],await this.#r()}async clearSessions(){this.#A.sessions={},await this.#r()}hasSeen(t){return this.#A.seenMessageIds.includes(t)}async markSeen(t){this.hasSeen(t)||(this.#A.seenMessageIds.push(t),this.#A.seenMessageIds.length>1e3&&this.#A.seenMessageIds.splice(0,this.#A.seenMessageIds.length-1e3),await this.#r())}snapshot(){return structuredClone(this.#A)}watchEntries(t){let o=this.#A.watches[t];return Array.isArray(o)?o.filter(yv):[]}watchEntry(t,o){return this.watchEntries(t).find(i=>i.sessionId===o)??null}async setWatch(t,o){let i=this.#A.watches[t]??[],e=i.findIndex(a=>a.sessionId===o.sessionId);e===-1?(i.length>=mm&&i.shift(),i.push(o)):i[e]=o,this.#A.watches[t]=i,await this.#r()}async removeWatch(t,o){let i=this.#A.watches[t]??[];this.#A.watches[t]=i.filter(e=>e.sessionId!==o),await this.#r()}async clearWatches(t){delete this.#A.watches[t],await this.#r()}keysWatching(t){return Object.entries(this.#A.watches).filter(([,o])=>Array.isArray(o)&&o.some(i=>yv(i)&&i.sessionId===t)).map(([o])=>o)}watchedSessionIds(){let t=new Set;for(let o of Object.values(this.#A.watches))if(Array.isArray(o))for(let i of o)yv(i)&&t.add(i.sessionId);return[...t]}includesArchivedSessions(){return this.#A.includeArchivedSessions===!0}async setIncludeArchivedSessions(t){this.#A.includeArchivedSessions=t===!0,await this.#r()}async#r(){let t=JSON.stringify(this.#A,null,2)+` -`;this.#t=this.#t.then(async()=>{await uNe(yNe(this.#e),{recursive:!0,mode:448});let o=`${this.#e}.tmp`;await QNe(o,t,{encoding:"utf8",mode:384}),await fNe(o,this.#e)}),await this.#t}};var hc=Object.freeze({MENTION:"mention",ALL:"all"});function eo(n){return n===hc.ALL?hc.ALL:hc.MENTION}function Sm(n){return n===hc.MENTION||n===hc.ALL}var Dm=()=>D("\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002"),DNe=30*6e4,wNe=/^\/m(?:enu)?$/i,ONe=/^\/repair(?:\s|$)/i,bNe=/^\/repair(?:\s+(qr|status|cancel|verify))?\s*$/i,tW=/^\/watch(?:\s+([^\s]+))?$/i,rW=/^\/unwatch(?:\s+([^\s]+))?$/i,MNe=/^\/watchlist$/i,_Ne=/^\/sessionlist(?:\s|$)/i,TNe=/^\/workspacelist$/i,NNe=/^\d{1,2}$/,RNe=10*6e4,kNe=50,vNe=8,PNe=8,GNe=10*6e4,aW=400,FNe=10*6e4,LNe=100,UNe=50,HNe=500,KNe=5e3,xNe=5e3,YNe=15e3,jNe=1e3,gW=new Set(["starting","qr_ready","polling","slow_down","domain_switched"]),mv=new Set([...gW,"saving"]),wm=new Set(["succeeded","expired","cancelled","error"]),JNe=new Set(["accounts.feishu.cn","open.feishu.cn","accounts.larksuite.com","open.larksuite.com"]),iW=/^\/archived(?:\s+(on|off))?$/i,qNe=/^\/(?:m(?:enu)?|new|help|status|compact|sessionlist(?:\s|$)|workspacelist|watchlist|archived(?:\s+(on|off))?)$/i,zNe=["/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD","/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84","/sessionlist [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"];function VC(n){switch(n?.code){case"workspace-not-absolute":return D("\u5DE5\u4F5C\u533A\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84\u3002");case"workspace-not-found":return D("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u4E0D\u5B58\u5728\u3002");case"workspace-not-directory":return D("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u5FC5\u987B\u6307\u5411\u4E00\u4E2A\u76EE\u5F55\u3002");case"workspace-bot-not-found":return D("\u673A\u5668\u4EBA\u6B63\u5728\u79FB\u9664\u6216\u5DF2\u91CD\u65B0\u63A5\u5165\uFF0C\u65E0\u6CD5\u64CD\u4F5C\u539F\u4F1A\u8BDD\u7684\u5DE5\u4F5C\u533A\u3002");default:return D("\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")}}function VNe(n,t){let o=String(n??D("\u7ED3\u679C\u6587\u4EF6")).replace(/[\r\n]+/g," ").trim()||D("\u7ED3\u679C\u6587\u4EF6");switch(t?.code){case"artifact-permission-required":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u673A\u5668\u4EBA\u7F3A\u5C11\u98DE\u4E66\u6587\u4EF6\u4E0A\u4F20\u6743\u9650 im:resource\u3002\u8BF7\u79C1\u804A\u673A\u5668\u4EBA\u6267\u884C /repair \u547D\u4EE4\uFF0C\u6216\u8005\u5728\u300CIM\u673A\u5668\u4EBA\u300D\u8BBE\u7F6E\u9875\u70B9\u51FB\u201C\u8865\u5168\u6743\u9650\u201D\u6309\u94AE\u5E76\u626B\u7801\u3002\u5B8C\u6210\u98DE\u4E66\u8981\u6C42\u7684\u53D1\u5E03\u5BA1\u6279\u540E\u91CD\u8BD5\u3002",{name:o});case"artifact-too-large":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u8D85\u8FC7\u98DE\u4E66 30 MB \u4E0A\u9650\uFF0C\u672A\u53D1\u9001\u3002",{name:o});case"artifact-empty":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u4E3A\u7A7A\uFF0C\u98DE\u4E66\u4E0D\u5141\u8BB8\u53D1\u9001\u7A7A\u6587\u4EF6\u3002",{name:o});case"artifact-changed":case"artifact-invalid":case"artifact-unavailable":return D("\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:o});case"artifact-rate-limited":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u6682\u65F6\u88AB\u98DE\u4E66\u9650\u6D41\uFF0C\u672A\u80FD\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o});case"artifact-delivery-uncertain":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\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:o});default:return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u6682\u65F6\u672A\u80FD\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o})}}function Om(n,t){return typeof n=="string"&&n.trim()?n:t.length>0?D("\u7ED3\u679C\u6587\u4EF6\u5DF2\u751F\u6210\u3002"):n}function CA(n){return typeof n=="string"&&n.trim()?n.trim():null}function oW(n){if(n&&typeof n=="object"&&!Array.isArray(n))return n;if(typeof n!="string"||!n.trim())return{};try{let t=JSON.parse(n);return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function ZC(n){if(n==null)return null;if(Array.isArray(n)){for(let o of n){let i=ZC(o);if(i!==null)return i}return null}if(n&&typeof n=="object")return"value"in n?ZC(n.value):"option"in n?ZC(n.option):null;if(typeof n!="string")return null;let t=n.trim();if(!t)return null;if(t.startsWith("[")||t.startsWith("{")||t.startsWith('"'))try{let o=JSON.parse(t);if(o!==n)return ZC(o)}catch{}return t}function dg(n){if(n==null)return[];if(Array.isArray(n))return n.flatMap(o=>dg(o));if(n&&typeof n=="object")return"value"in n?dg(n.value):"option"in n?dg(n.option):[];if(typeof n!="string")return[];let t=n.trim();if(!t)return[];if(t.startsWith("[")||t.startsWith("{")||t.startsWith('"'))try{let o=JSON.parse(t);if(o!==n)return dg(o)}catch{}return t.split(",").map(o=>o.trim()).filter(Boolean)}function En(n){return Number.isSafeInteger(n)&&n>=-1}function XC(n){return Number.isSafeInteger(n)&&n>=0}function Mm(n){return Number.isSafeInteger(n?.watchStartedAt)&&n.watchStartedAt>=0?n.watchStartedAt:null}function bm(n){return n&&(Mm(n)!==null||!En(n.lastSeq))}function WNe(n){return(Array.isArray(n?.events)?n.events:[]).map(t=>t?.event??t).filter(t=>t&&typeof t=="object"&&XC(t.seq)).sort((t,o)=>t.seq-o.seq)}function $C(n){return CA(n?.sender?.sender_id?.open_id)??CA(n?.sender?.sender_id?.user_id)}function ZNe(n){return CA(n?.sender?.sender_id?.open_id)}function nW(n,t){return new Promise((o,i)=>{if(t?.aborted){i(t.reason??new DOMException("Aborted","AbortError"));return}let e=setTimeout(a,n);e.unref?.();function a(){t?.removeEventListener("abort",A),o()}function A(){clearTimeout(e),i(t.reason??new DOMException("Aborted","AbortError"))}t?.addEventListener("abort",A,{once:!0})})}function WC(n,{botId:t}={}){let o=n&&typeof n=="object"?n:{},i=o.registration&&typeof o.registration=="object"?o.registration:o,e=CA(i.operation)??CA(o.operation);if(e&&e!=="callback_repair")throw new Error("The active Feishu operation is not a callback repair");let a=CA(i.botId)??CA(o.botId);if(t&&a&&a!==t)throw new Error("The Feishu repair belongs to another bot");let A=CA(i.state),r=i.attemptId??i.attempt,s=typeof r=="string"||Number.isFinite(r)?String(r):null;if(!A||!s)throw new Error("Feishu returned an invalid repair status");let g=CA(i.verificationUrl)??CA(i.qrCodeUrl),c=Number(i.expiresAt),I=Number(i.remainingSeconds),d=Number(i.pollIntervalMs)||Number(i.pollIntervalSeconds)*1e3;return{state:A,attemptId:s,botId:a,verificationUrl:g,expiresAt:Number.isFinite(c)?c:null,remainingSeconds:Number.isFinite(I)?I:null,pollIntervalMs:Number.isFinite(d)&&d>0?d:null,error:i.error&&typeof i.error=="object"?{code:CA(i.error.code),message:CA(i.error.message)}:null}}function sW(n,t){let o=new URL(n);if(o.protocol!=="https:"||!JNe.has(o.hostname))throw new Error("Feishu returned an untrusted repair URL");if(o.searchParams.get("tp")!=="sdk"||o.searchParams.get("clientID")!==t||o.searchParams.has("createOnly"))throw new Error("Feishu returned an invalid existing-app repair URL");if(o.toString().includes("{{client_id}}")||o.toString().includes("%7B%7Bclient_id%7D%7D"))throw new Error("Feishu returned an unresolved client id placeholder");return o.toString()}function XNe(n,t){return t.needsPresentation!==!0&&t.questions[t.index]&&$C(n)===t.actor&&n?.message?.message_type==="text"&&CA(dd(n))}function $Ne(n){for(let t of["messagesReceived","messagesReplied","messagesRejected"])n[t]??=0;n.lastMessageAt??=null,n.lastReplyAt??=null,n.lastRejectedAt??=null,n.lastError??=null,n.lastMessageError??=null}var _m=class{#e;#A;#t;#r;#c;#a=new Map;#n=new Bi;#o=new Map;#g=new Map;#l=new Map;#i=new Map;#I=new Set;#s=new Set;#p=new Set;#d=new Map;#h=new Map;#E=new Map;#C=new Map;#B=new Map;#u=new Map;#m=new Map;#S=new Map;#Q=new Map;#y;#f;#b;#R;#w;#D;#M;#P;#_;#L;#T;#U=null;#k=0;#v;#N;#Y=new Map;#H=new Map;#q=null;#z=new Map;#F=new Map;#K=new Map;#G=new Map;#$;constructor({client:t,channel:o,harness:i,state:e,contextEnhancement:a,status:A,allowedSenderOpenIds:r=new Set,botId:s,appId:g,botOpenId:c,groupResponseMode:I=hc.ALL,repair:d,repairPollIntervalMs:B=jNe,repairLinkWaitMs:f=YNe,cardDataTimeoutMs:Q=xNe,replyTimeoutMs:y=6e5,logger:m=console,signal:_}){if(!t||!i||!e||!A)throw new TypeError("Feishu bridge dependencies are required");if(d!=null){if(!d||typeof d.start!="function"||typeof d.status!="function"||typeof d.cancel!="function")throw new TypeError("Feishu repair capability requires start/status/cancel");if(!CA(s)||!CA(g))throw new TypeError("Feishu repair capability requires botId and appId")}if(!Number.isFinite(B)||B<=0||!Number.isFinite(f)||f<=0||!Number.isFinite(Q)||Q<=0)throw new TypeError("Feishu timing values must be positive numbers");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#f=A,this.#b=r,this.#M=CA(s),this.#P=CA(g),this.#_=CA(c),this.#L=eo(I),this.#T=d??null,this.#v=B,this.#N=f,this.#$=Q,this.#R=y,this.#w=m,this.#y=new pi({label:"Feishu",logger:m}),this.#D=_,$Ne(this.#f),typeof this.#t?.watchHarnessEvents=="function"&&queueMicrotask(()=>this.#Ne())}setGroupResponseMode(t){this.#L=eo(t)}#Ae(t){if(t?.message?.chat_type==="p2p")return!0;let o=Array.isArray(t?.message?.mentions)?t.message.mentions:[];return this.#_?o.some(i=>i?.id?.open_id===this.#_||i?.open_id===this.#_):o.length>0}accept(t){if(this.#D?.aborted)return Promise.resolve();let o=CA(t?.message?.message_id);if(!o||HV(t))return Promise.resolve();if(!KV(t,this.#b))return this.#f.messagesRejected+=1,this.#f.lastRejectedAt=new Date().toISOString(),this.#w.warn?.("[dsh-feishu] ignored a message from a sender outside the allowlist"),Promise.resolve();let i=this.#Ae(t);if(t?.message?.chat_type!=="p2p"&&this.#L===hc.MENTION&&!i||this.#r.hasSeen(o)||this.#i.has(o))return Promise.resolve();let e;try{e=LV(t)}catch{return this.#f.messagesRejected+=1,this.#f.lastRejectedAt=new Date().toISOString(),Promise.resolve()}if(t.message.chat_type==="p2p"){let f=CA(t.message.chat_id);f&&lo(this.#r,{chatId:f})}this.#i.set(o,Zr(this.#c,t.message.chat_type==="p2p"?"direct":t.message.chat_type==="group"?"group":null));let a=this.#CA(o),A=fv(t,this.#e),r=CA(A.content)??"",s=t.message.message_type==="text"?CA(dd(t))??"":"",g=t.message.message_type==="text"&&Qo(s),c=this.#o.get(e),I=this.#n.status(e);if(g&&t.message.chat_type!=="p2p")return this.#te(t,o,a,{message:Kn()});if(t.message.chat_type==="p2p"&&(g||I.phase==="collecting")){let Q=/^\/batch$/iu.test(s)&&I.phase==="idle"&&(this.#a.has(e)||c||this.#y.hasPending(e))?{handled:!0,kind:"busy",message:yo()}:this.#n.handle(e,s,{plainText:t.message.message_type==="text"&&!!s});if(Q.handled){if(Q.kind==="submit"){let y={...t,batchSubmission:{token:Q.token},message:{...t.message,message_type:"text",content:JSON.stringify({text:Q.prompt}),mentions:[]}};return this.#j(y,o,e,a)}return this.#te(t,o,a,Q)}}if(qNe.test(r))return Promise.resolve().then(()=>this.#De(t,e,{alreadyRecorded:!1})).then(()=>this.#ee(o,a,"DONE")).catch(Q=>this.#J(t,o,a,Q)).finally(()=>this.#i.delete(o));let d=Ei(r)?xi:Ft(A)?null:Yi(r)?Ci:ji(r)?Ji:qi(r)?ui:null;if(d&&(i||d===xi)){let f=this.#Le(t,o,e,A,d),Q;return Q=f.then(()=>this.#ee(o,a,"DONE")).catch(y=>this.#J(t,o,a,y)).finally(()=>{this.#i.delete(o),this.#s.delete(Q)}),this.#s.add(Q),Q}if(this.#Qe(t,e))return Promise.resolve().then(()=>this.#ye(t,o)).then(()=>this.#ee(o,a,"DONE")).catch(Q=>this.#J(t,o,a,Q)).finally(()=>this.#i.delete(o));let B=this.#y.claimReply({key:e,actor:$C(t),messageId:o,text:dd(t)??"",addressed:i,hasPendingQuestion:!!c,questionCompletion:c?.submitting||c?.claimedReplyMessageId?c.queue:null,isQuestionPending:()=>this.#o.has(e),send:f=>this.#O(t.message.chat_id,f)});if(B){let f=B.process(async()=>this.#r.hasSeen(o)?!1:(await this.#r.markSeen(o),this.#f.lastMessageAt=new Date().toISOString(),this.#f.messagesReceived+=1,!0)),Q;return Q=f.then(()=>this.#ee(o,a,"DONE")).catch(y=>this.#J(t,o,a,y)).finally(()=>{this.#i.delete(o),this.#I.delete(Q)}),this.#I.add(Q),Q}if(c&&$C(t)!==c.actor)return this.#j(t,o,e,a);if(c?.submitting||c?.claimedReplyMessageId)return this.#j(t,o,e,a);if(c){XNe(t,c)&&(c.claimedReplyMessageId=o);let Q=(c.queue??Promise.resolve()).catch(()=>{}).then(()=>this.#pA(t,o,e,c,a));c.queue=Q;let y=()=>{c.claimedReplyMessageId===o&&(c.claimedReplyMessageId=null),c.queue===Q&&(c.queue=null)},m;return m=Q.then(()=>(y(),this.#ee(o,a,"DONE")),_=>(y(),this.#J(t,o,a,_))).finally(()=>{y(),this.#i.delete(o),this.#I.delete(m)}),this.#I.add(m),m}return this.#j(t,o,e,a)}#te(t,o,i,e){let a;return a=Promise.resolve().then(async()=>{this.#r.hasSeen(o)||(await this.#r.markSeen(o),this.#f.lastMessageAt=new Date().toISOString(),this.#f.messagesReceived+=1,e?.message&&await this.#O(t.message.chat_id,e.message),this.#f.lastError=null)}).then(()=>this.#ee(o,i,"DONE")).catch(A=>this.#J(t,o,i,A)).finally(()=>{this.#i.delete(o),this.#s.delete(a)}),this.#s.add(a),a}#j(t,o,i,e,{releaseMessageId:a=!0,alreadyRecorded:A=!1,finalize:r=!0}={}){let g=(this.#a.get(i)??Promise.resolve()).catch(()=>{}).then(()=>this.#De(t,i,{alreadyRecorded:A})),c=r?g.then(async d=>(await this.#ee(o,e,"DONE"),d)).catch(d=>this.#J(t,o,e,d)):g,I;return I=c.finally(()=>{a&&this.#i.delete(o),this.#a.get(i)===I&&this.#a.delete(i)}),this.#a.set(i,I),I}#X(t,{logLabel:o="operation",logLevel:i="warn",userMessage:e,reason:a}={}){this.#f.lastError=t?.message??String(t);let A=At(this.#f,t,{userMessage:e,reason:a});return this.#w?.[i]?.(`[dsh-feishu] ${o} failed [${A.referenceId}]:`,t?.message??String(t)),A}async#x(t,o,i={}){let e=this.#X(o,i),a=i.appendMessage?`${dt(e)} +`;this.#t=this.#t.then(async()=>{await uNe(yNe(this.#e),{recursive:!0,mode:448});let o=`${this.#e}.tmp`;await QNe(o,t,{encoding:"utf8",mode:384}),await fNe(o,this.#e)}),await this.#t}};var hc=Object.freeze({MENTION:"mention",ALL:"all"});function eo(n){return n===hc.ALL?hc.ALL:hc.MENTION}function Sm(n){return n===hc.MENTION||n===hc.ALL}var Dm=()=>D("\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002"),DNe=30*6e4,wNe=/^\/m(?:enu)?$/i,ONe=/^\/repair(?:\s|$)/i,bNe=/^\/repair(?:\s+(qr|status|cancel|verify))?\s*$/i,tW=/^\/watch(?:\s+([^\s]+))?$/i,rW=/^\/unwatch(?:\s+([^\s]+))?$/i,MNe=/^\/watchlist$/i,_Ne=/^\/(?:sessionlist|sessions)(?:\s|$)/i,TNe=/^\/workspacelist$/i,NNe=/^\d{1,2}$/,RNe=10*6e4,kNe=50,vNe=8,PNe=8,GNe=10*6e4,aW=400,FNe=10*6e4,LNe=100,UNe=50,HNe=500,KNe=5e3,xNe=5e3,YNe=15e3,jNe=1e3,gW=new Set(["starting","qr_ready","polling","slow_down","domain_switched"]),mv=new Set([...gW,"saving"]),wm=new Set(["succeeded","expired","cancelled","error"]),JNe=new Set(["accounts.feishu.cn","open.feishu.cn","accounts.larksuite.com","open.larksuite.com"]),iW=/^\/archived(?:\s+(on|off))?$/i,qNe=/^\/(?:m(?:enu)?|new|help|status|compact|(?:sessionlist|sessions)(?:\s|$)|workspacelist|watchlist|archived(?:\s+(on|off))?)$/i,zNe=["/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD","/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84","/sessionlist \u6216 /sessions [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"];function VC(n){switch(n?.code){case"workspace-not-absolute":return D("\u5DE5\u4F5C\u533A\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84\u3002");case"workspace-not-found":return D("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u4E0D\u5B58\u5728\u3002");case"workspace-not-directory":return D("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u5FC5\u987B\u6307\u5411\u4E00\u4E2A\u76EE\u5F55\u3002");case"workspace-bot-not-found":return D("\u673A\u5668\u4EBA\u6B63\u5728\u79FB\u9664\u6216\u5DF2\u91CD\u65B0\u63A5\u5165\uFF0C\u65E0\u6CD5\u64CD\u4F5C\u539F\u4F1A\u8BDD\u7684\u5DE5\u4F5C\u533A\u3002");default:return D("\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")}}function VNe(n,t){let o=String(n??D("\u7ED3\u679C\u6587\u4EF6")).replace(/[\r\n]+/g," ").trim()||D("\u7ED3\u679C\u6587\u4EF6");switch(t?.code){case"artifact-permission-required":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u673A\u5668\u4EBA\u7F3A\u5C11\u98DE\u4E66\u6587\u4EF6\u4E0A\u4F20\u6743\u9650 im:resource\u3002\u8BF7\u79C1\u804A\u673A\u5668\u4EBA\u6267\u884C /repair \u547D\u4EE4\uFF0C\u6216\u8005\u5728\u300CIM\u673A\u5668\u4EBA\u300D\u8BBE\u7F6E\u9875\u70B9\u51FB\u201C\u8865\u5168\u6743\u9650\u201D\u6309\u94AE\u5E76\u626B\u7801\u3002\u5B8C\u6210\u98DE\u4E66\u8981\u6C42\u7684\u53D1\u5E03\u5BA1\u6279\u540E\u91CD\u8BD5\u3002",{name:o});case"artifact-too-large":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u8D85\u8FC7\u98DE\u4E66 30 MB \u4E0A\u9650\uFF0C\u672A\u53D1\u9001\u3002",{name:o});case"artifact-empty":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u4E3A\u7A7A\uFF0C\u98DE\u4E66\u4E0D\u5141\u8BB8\u53D1\u9001\u7A7A\u6587\u4EF6\u3002",{name:o});case"artifact-changed":case"artifact-invalid":case"artifact-unavailable":return D("\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:o});case"artifact-rate-limited":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u6682\u65F6\u88AB\u98DE\u4E66\u9650\u6D41\uFF0C\u672A\u80FD\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o});case"artifact-delivery-uncertain":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\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:o});default:return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u6682\u65F6\u672A\u80FD\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o})}}function Om(n,t){return typeof n=="string"&&n.trim()?n:t.length>0?D("\u7ED3\u679C\u6587\u4EF6\u5DF2\u751F\u6210\u3002"):n}function CA(n){return typeof n=="string"&&n.trim()?n.trim():null}function oW(n){if(n&&typeof n=="object"&&!Array.isArray(n))return n;if(typeof n!="string"||!n.trim())return{};try{let t=JSON.parse(n);return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function ZC(n){if(n==null)return null;if(Array.isArray(n)){for(let o of n){let i=ZC(o);if(i!==null)return i}return null}if(n&&typeof n=="object")return"value"in n?ZC(n.value):"option"in n?ZC(n.option):null;if(typeof n!="string")return null;let t=n.trim();if(!t)return null;if(t.startsWith("[")||t.startsWith("{")||t.startsWith('"'))try{let o=JSON.parse(t);if(o!==n)return ZC(o)}catch{}return t}function dg(n){if(n==null)return[];if(Array.isArray(n))return n.flatMap(o=>dg(o));if(n&&typeof n=="object")return"value"in n?dg(n.value):"option"in n?dg(n.option):[];if(typeof n!="string")return[];let t=n.trim();if(!t)return[];if(t.startsWith("[")||t.startsWith("{")||t.startsWith('"'))try{let o=JSON.parse(t);if(o!==n)return dg(o)}catch{}return t.split(",").map(o=>o.trim()).filter(Boolean)}function En(n){return Number.isSafeInteger(n)&&n>=-1}function XC(n){return Number.isSafeInteger(n)&&n>=0}function Mm(n){return Number.isSafeInteger(n?.watchStartedAt)&&n.watchStartedAt>=0?n.watchStartedAt:null}function bm(n){return n&&(Mm(n)!==null||!En(n.lastSeq))}function WNe(n){return(Array.isArray(n?.events)?n.events:[]).map(t=>t?.event??t).filter(t=>t&&typeof t=="object"&&XC(t.seq)).sort((t,o)=>t.seq-o.seq)}function $C(n){return CA(n?.sender?.sender_id?.open_id)??CA(n?.sender?.sender_id?.user_id)}function ZNe(n){return CA(n?.sender?.sender_id?.open_id)}function nW(n,t){return new Promise((o,i)=>{if(t?.aborted){i(t.reason??new DOMException("Aborted","AbortError"));return}let e=setTimeout(a,n);e.unref?.();function a(){t?.removeEventListener("abort",A),o()}function A(){clearTimeout(e),i(t.reason??new DOMException("Aborted","AbortError"))}t?.addEventListener("abort",A,{once:!0})})}function WC(n,{botId:t}={}){let o=n&&typeof n=="object"?n:{},i=o.registration&&typeof o.registration=="object"?o.registration:o,e=CA(i.operation)??CA(o.operation);if(e&&e!=="callback_repair")throw new Error("The active Feishu operation is not a callback repair");let a=CA(i.botId)??CA(o.botId);if(t&&a&&a!==t)throw new Error("The Feishu repair belongs to another bot");let A=CA(i.state),r=i.attemptId??i.attempt,s=typeof r=="string"||Number.isFinite(r)?String(r):null;if(!A||!s)throw new Error("Feishu returned an invalid repair status");let g=CA(i.verificationUrl)??CA(i.qrCodeUrl),c=Number(i.expiresAt),I=Number(i.remainingSeconds),d=Number(i.pollIntervalMs)||Number(i.pollIntervalSeconds)*1e3;return{state:A,attemptId:s,botId:a,verificationUrl:g,expiresAt:Number.isFinite(c)?c:null,remainingSeconds:Number.isFinite(I)?I:null,pollIntervalMs:Number.isFinite(d)&&d>0?d:null,error:i.error&&typeof i.error=="object"?{code:CA(i.error.code),message:CA(i.error.message)}:null}}function sW(n,t){let o=new URL(n);if(o.protocol!=="https:"||!JNe.has(o.hostname))throw new Error("Feishu returned an untrusted repair URL");if(o.searchParams.get("tp")!=="sdk"||o.searchParams.get("clientID")!==t||o.searchParams.has("createOnly"))throw new Error("Feishu returned an invalid existing-app repair URL");if(o.toString().includes("{{client_id}}")||o.toString().includes("%7B%7Bclient_id%7D%7D"))throw new Error("Feishu returned an unresolved client id placeholder");return o.toString()}function XNe(n,t){return t.needsPresentation!==!0&&t.questions[t.index]&&$C(n)===t.actor&&n?.message?.message_type==="text"&&CA(dd(n))}function $Ne(n){for(let t of["messagesReceived","messagesReplied","messagesRejected"])n[t]??=0;n.lastMessageAt??=null,n.lastReplyAt??=null,n.lastRejectedAt??=null,n.lastError??=null,n.lastMessageError??=null}var _m=class{#e;#A;#t;#r;#c;#a=new Map;#n=new Bi;#o=new Map;#g=new Map;#l=new Map;#i=new Map;#I=new Set;#s=new Set;#p=new Set;#d=new Map;#h=new Map;#E=new Map;#C=new Map;#B=new Map;#u=new Map;#m=new Map;#S=new Map;#Q=new Map;#y;#f;#b;#R;#w;#D;#M;#P;#_;#L;#T;#U=null;#k=0;#v;#N;#Y=new Map;#H=new Map;#q=null;#z=new Map;#F=new Map;#K=new Map;#G=new Map;#$;constructor({client:t,channel:o,harness:i,state:e,contextEnhancement:a,status:A,allowedSenderOpenIds:r=new Set,botId:s,appId:g,botOpenId:c,groupResponseMode:I=hc.ALL,repair:d,repairPollIntervalMs:B=jNe,repairLinkWaitMs:f=YNe,cardDataTimeoutMs:Q=xNe,replyTimeoutMs:y=6e5,logger:m=console,signal:_}){if(!t||!i||!e||!A)throw new TypeError("Feishu bridge dependencies are required");if(d!=null){if(!d||typeof d.start!="function"||typeof d.status!="function"||typeof d.cancel!="function")throw new TypeError("Feishu repair capability requires start/status/cancel");if(!CA(s)||!CA(g))throw new TypeError("Feishu repair capability requires botId and appId")}if(!Number.isFinite(B)||B<=0||!Number.isFinite(f)||f<=0||!Number.isFinite(Q)||Q<=0)throw new TypeError("Feishu timing values must be positive numbers");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#f=A,this.#b=r,this.#M=CA(s),this.#P=CA(g),this.#_=CA(c),this.#L=eo(I),this.#T=d??null,this.#v=B,this.#N=f,this.#$=Q,this.#R=y,this.#w=m,this.#y=new pi({label:"Feishu",logger:m}),this.#D=_,$Ne(this.#f),typeof this.#t?.watchHarnessEvents=="function"&&queueMicrotask(()=>this.#Ne())}setGroupResponseMode(t){this.#L=eo(t)}#Ae(t){if(t?.message?.chat_type==="p2p")return!0;let o=Array.isArray(t?.message?.mentions)?t.message.mentions:[];return this.#_?o.some(i=>i?.id?.open_id===this.#_||i?.open_id===this.#_):o.length>0}accept(t){if(this.#D?.aborted)return Promise.resolve();let o=CA(t?.message?.message_id);if(!o||HV(t))return Promise.resolve();if(!KV(t,this.#b))return this.#f.messagesRejected+=1,this.#f.lastRejectedAt=new Date().toISOString(),this.#w.warn?.("[dsh-feishu] ignored a message from a sender outside the allowlist"),Promise.resolve();let i=this.#Ae(t);if(t?.message?.chat_type!=="p2p"&&this.#L===hc.MENTION&&!i||this.#r.hasSeen(o)||this.#i.has(o))return Promise.resolve();let e;try{e=LV(t)}catch{return this.#f.messagesRejected+=1,this.#f.lastRejectedAt=new Date().toISOString(),Promise.resolve()}if(t.message.chat_type==="p2p"){let f=CA(t.message.chat_id);f&&lo(this.#r,{chatId:f})}this.#i.set(o,Zr(this.#c,t.message.chat_type==="p2p"?"direct":t.message.chat_type==="group"?"group":null));let a=this.#CA(o),A=fv(t,this.#e),r=CA(A.content)??"",s=t.message.message_type==="text"?CA(dd(t))??"":"",g=t.message.message_type==="text"&&Qo(s),c=this.#o.get(e),I=this.#n.status(e);if(g&&t.message.chat_type!=="p2p")return this.#te(t,o,a,{message:Kn()});if(t.message.chat_type==="p2p"&&(g||I.phase==="collecting")){let Q=/^\/batch$/iu.test(s)&&I.phase==="idle"&&(this.#a.has(e)||c||this.#y.hasPending(e))?{handled:!0,kind:"busy",message:yo()}:this.#n.handle(e,s,{plainText:t.message.message_type==="text"&&!!s});if(Q.handled){if(Q.kind==="submit"){let y={...t,batchSubmission:{token:Q.token},message:{...t.message,message_type:"text",content:JSON.stringify({text:Q.prompt}),mentions:[]}};return this.#j(y,o,e,a)}return this.#te(t,o,a,Q)}}if(qNe.test(r))return Promise.resolve().then(()=>this.#De(t,e,{alreadyRecorded:!1})).then(()=>this.#ee(o,a,"DONE")).catch(Q=>this.#J(t,o,a,Q)).finally(()=>this.#i.delete(o));let d=Ei(r)?xi:Ft(A)?null:Yi(r)?Ci:ji(r)?Ji:qi(r)?ui:null;if(d&&(i||d===xi)){let f=this.#Le(t,o,e,A,d),Q;return Q=f.then(()=>this.#ee(o,a,"DONE")).catch(y=>this.#J(t,o,a,y)).finally(()=>{this.#i.delete(o),this.#s.delete(Q)}),this.#s.add(Q),Q}if(this.#Qe(t,e))return Promise.resolve().then(()=>this.#ye(t,o)).then(()=>this.#ee(o,a,"DONE")).catch(Q=>this.#J(t,o,a,Q)).finally(()=>this.#i.delete(o));let B=this.#y.claimReply({key:e,actor:$C(t),messageId:o,text:dd(t)??"",addressed:i,hasPendingQuestion:!!c,questionCompletion:c?.submitting||c?.claimedReplyMessageId?c.queue:null,isQuestionPending:()=>this.#o.has(e),send:f=>this.#O(t.message.chat_id,f)});if(B){let f=B.process(async()=>this.#r.hasSeen(o)?!1:(await this.#r.markSeen(o),this.#f.lastMessageAt=new Date().toISOString(),this.#f.messagesReceived+=1,!0)),Q;return Q=f.then(()=>this.#ee(o,a,"DONE")).catch(y=>this.#J(t,o,a,y)).finally(()=>{this.#i.delete(o),this.#I.delete(Q)}),this.#I.add(Q),Q}if(c&&$C(t)!==c.actor)return this.#j(t,o,e,a);if(c?.submitting||c?.claimedReplyMessageId)return this.#j(t,o,e,a);if(c){XNe(t,c)&&(c.claimedReplyMessageId=o);let Q=(c.queue??Promise.resolve()).catch(()=>{}).then(()=>this.#pA(t,o,e,c,a));c.queue=Q;let y=()=>{c.claimedReplyMessageId===o&&(c.claimedReplyMessageId=null),c.queue===Q&&(c.queue=null)},m;return m=Q.then(()=>(y(),this.#ee(o,a,"DONE")),_=>(y(),this.#J(t,o,a,_))).finally(()=>{y(),this.#i.delete(o),this.#I.delete(m)}),this.#I.add(m),m}return this.#j(t,o,e,a)}#te(t,o,i,e){let a;return a=Promise.resolve().then(async()=>{this.#r.hasSeen(o)||(await this.#r.markSeen(o),this.#f.lastMessageAt=new Date().toISOString(),this.#f.messagesReceived+=1,e?.message&&await this.#O(t.message.chat_id,e.message),this.#f.lastError=null)}).then(()=>this.#ee(o,i,"DONE")).catch(A=>this.#J(t,o,i,A)).finally(()=>{this.#i.delete(o),this.#s.delete(a)}),this.#s.add(a),a}#j(t,o,i,e,{releaseMessageId:a=!0,alreadyRecorded:A=!1,finalize:r=!0}={}){let g=(this.#a.get(i)??Promise.resolve()).catch(()=>{}).then(()=>this.#De(t,i,{alreadyRecorded:A})),c=r?g.then(async d=>(await this.#ee(o,e,"DONE"),d)).catch(d=>this.#J(t,o,e,d)):g,I;return I=c.finally(()=>{a&&this.#i.delete(o),this.#a.get(i)===I&&this.#a.delete(i)}),this.#a.set(i,I),I}#X(t,{logLabel:o="operation",logLevel:i="warn",userMessage:e,reason:a}={}){this.#f.lastError=t?.message??String(t);let A=At(this.#f,t,{userMessage:e,reason:a});return this.#w?.[i]?.(`[dsh-feishu] ${o} failed [${A.referenceId}]:`,t?.message??String(t)),A}async#x(t,o,i={}){let e=this.#X(o,i),a=i.appendMessage?`${dt(e)} ${i.appendMessage}`:dt(e);return await this.#O(t,a).catch(()=>{}),e}async#J(t,o,i,e){if(e?.code==="turn-stopped"){await this.#Fe(o,i),e?.batchInputMessage&&await this.#O(t.message.chat_id,e.batchInputMessage).catch(()=>{});return}if(this.#D?.aborted){await this.#Fe(o,i);return}let a=So(e)??Co(e),A=this.#X(e,{logLabel:"message handling",logLevel:"error",userMessage:a,reason:Ki(e)?.reason});await this.#ee(o,i,"ERROR");let r=e?.batchInputMessage?`${dt(A)} -${e.batchInputMessage}`:dt(A);await this.#O(t.message.chat_id,r).catch(()=>{})}async waitForIdle(){for(;;){let t=[...this.#a.values(),...[...this.#o.values()].flatMap(o=>o.queue?[o.queue]:[]),...this.#I,...this.#s,...this.#p,...this.#z.values(),...[...this.#F.values()].map(o=>o.promise)];if(t.length===0||(await Promise.allSettled(t),this.#a.size===0&&this.#I.size===0&&this.#s.size===0&&this.#p.size===0&&this.#z.size===0&&this.#F.size===0&&![...this.#o.values()].some(o=>o.queue)))return}}#V(){let t=AbortSignal.timeout(this.#$);return this.#D?AbortSignal.any([this.#D,t]):t}#ae(t){return this.#o.has(t)||this.#y.hasPending(t)}async#Le(t,o,i,e,a){if(this.#D?.throwIfAborted(),this.#r.hasSeen(o))return;await this.#r.markSeen(o),this.#f.lastMessageAt=new Date().toISOString(),this.#f.messagesReceived+=1;let A=await a(CA(e.content)??"",this.#t,this.#r,i,{signal:this.#D,isDirect:t.message.chat_type==="p2p",hasImages:Vt(e),hasFiles:Ft(e),pendingInteraction:this.#ae(i),control:{owner:this,key:i}});A?.stopped&&await Promise.allSettled([this.#Se(i),this.#y.closeRoute(i)]);for(let r of A?.messages??[A?.message])r&&await this.#O(t.message.chat_id,r);this.#f.lastError=null}async#De(t,o,{alreadyRecorded:i=!1}={}){this.#D?.throwIfAborted();let e=t.message.message_id;if(!i){if(this.#r.hasSeen(e))return;await this.#r.markSeen(e),this.#f.lastMessageAt=new Date().toISOString(),this.#f.messagesReceived+=1}let a=fv(t,this.#e),A=a.content,r=Vt(a),s=Ft(a),g=!r&&!s&&A?A.trim():null;if(!A&&!r&&!s){await this.#O(t.message.chat_id,D("\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u548C\u6587\u4EF6\u6D88\u606F\u3002"));return}if(g!==null&&ONe.test(g)){await this.#we(t,g);return}if(g==="/help"){await this.#O(t.message.chat_id,qV());return}if(wNe.test(g)){await this.#Z(o,t.message.chat_id);return}if(g==="/new"){if(this.#a.has(o)||this.#ae(o)){await this.#O(t.message.chat_id,D("\u5F53\u524D\u4EFB\u52A1\u4ECD\u5728\u8FD0\u884C\uFF0C\u8BF7\u5148\u505C\u6B62\u4EFB\u52A1\u6216\u7B49\u5F85\u4EFB\u52A1\u5B8C\u6210\u540E\u518D\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002"));return}await this.#r.clearSession(o),await this.#O(t.message.chat_id,D("\u5DF2\u5F00\u542F\u5168\u65B0 Harness \u4F1A\u8BDD\u3002")),await this.#Z(o,t.message.chat_id);return}if(g==="/status"){await this.#$e(o,t.message.chat_id);return}if(g==="/compact"){let f=await hi(g,this.#t,this.#r,o,{signal:this.#D});f&&await this.#O(t.message.chat_id,f.message);return}if(_Ne.test(g)){let f=g.slice(12).trim()||null;await this.#ce({chatId:t.message.chat_id,key:o},f,0);return}if(TNe.test(g)){await this.#Me({chatId:t.message.chat_id,key:o});return}if(tW.test(g)){let f=(tW.exec(g)?.[1]??"").trim()||null;await this.#Ee(o,t.message.chat_id,f);return}if(rW.test(g)){let f=(rW.exec(g)?.[1]??"").trim()||null;await this.#Ce(o,t.message.chat_id,f);return}if(MNe.test(g)){await this.#ue(o,t.message.chat_id);return}if(iW.test(g)){let Q=iW.exec(g)[1]?.toLowerCase();if(Q!=="on"&&Q!=="off"){await this.#O(t.message.chat_id,D("\u7528\u6CD5\uFF1A/archived on\uFF08\u5305\u542B\u5F52\u6863\u4F1A\u8BDD\uFF09\u6216 /archived off\uFF08\u9690\u85CF\u5F52\u6863\u4F1A\u8BDD\uFF09"));return}typeof this.#r?.setIncludeArchivedSessions=="function"&&await this.#r.setIncludeArchivedSessions(Q==="on"),await this.#O(t.message.chat_id,Q==="on"?D("\u5DF2\u5F00\u542F\uFF1A\u4F1A\u8BDD\u5217\u8868\u5305\u542B\u5F52\u6863\u4F1A\u8BDD\u3002"):D("\u5DF2\u5173\u95ED\uFF1A\u4F1A\u8BDD\u5217\u8868\u9690\u85CF\u5F52\u6863\u4F1A\u8BDD\u3002"));return}if(NNe.test(g)){let f=this.#qe(o);if(f){await this.#ze(f,Number(g),{chatId:t.message.chat_id,key:o,event:t});return}}let c=g===null?null:await uo(A,this.#t,o);if(c){for(let f of c.messages??[c.message])await this.#O(t.message.chat_id,f);return}let I=g===null?null:await hi(g,this.#t,this.#r,o,{signal:this.#D});if(I){await this.#O(t.message.chat_id,I.message);return}this.#w.info?.(`[dsh-feishu] processing ${t.message.chat_type} message ${e}`);let d=t.batchSubmission??null,B=!1;try{let{receipt:f,artifactSendErrors:Q,textDeliveryErrors:y=0}=await this.#lA(t,o,a,{onAskComplete:d?()=>{B=this.#n.complete(o,d.token).completed}:void 0});return this.#f.messagesReplied+=1,this.#f.lastReplyAt=new Date().toISOString(),this.#f.lastError=null,y===0&&Q===0&&po(this.#f),f}catch(f){if(d&&!B){if(f?.code==="turn-stopped")throw this.#n.complete(o,d.token),f;let Q=this.#n.fail(o,d.token);if(Q.retained){let y=new Error(f?.message??String(f),{cause:f});throw y.code=f?.code,y.providerCode=f?.providerCode,y.method=f?.method,Number.isInteger(f?.status)&&(y.status=f.status),y.batchInputMessage=Q.message,y}}throw f}finally{await this.#Se(o),await this.#y.closeRoute(o)}}async#we(t,o){if(t?.message?.chat_type!=="p2p"){await this.#O(t.message.chat_id,D("\u4E3A\u907F\u514D\u6388\u6743\u94FE\u63A5\u66B4\u9732\uFF0C\u8BF7\u79C1\u804A\u673A\u5668\u4EBA\u53D1\u9001 /repair\u3002"));return}let i=ZNe(t);if(!i){await this.#O(t.message.chat_id,D("\u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u53D1\u9001\u8005\uFF0C\u672A\u53D1\u8D77\u4FEE\u590D\u3002"));return}if(!this.#T){await this.#O(t.message.chat_id,D("\u5F53\u524D Host \u7248\u672C\u6682\u4E0D\u652F\u6301\u804A\u5929\u5185\u4FEE\u590D\uFF0C\u8BF7\u5148\u66F4\u65B0\u63D2\u4EF6\u3002"));return}let e=bNe.exec(o);if(!e){await this.#O(t.message.chat_id,D("\u7528\u6CD5\uFF1A/repair\u3001/repair qr\u3001/repair status\u3001/repair cancel \u6216 /repair verify"));return}let a=e[1]?.toLowerCase()??"start",A=t.message.chat_id;if(a==="start"){await this.#Ue({actorOpenId:i,chatId:A});return}let r=this.#U;if(!r){await this.#O(A,D("\u5F53\u524D Runtime \u6CA1\u6709\u53EF\u6062\u590D\u7684\u4FEE\u590D\u4EFB\u52A1\u8BB0\u5F55\uFF08\u673A\u5668\u4EBA\u53EF\u80FD\u521A\u5B8C\u6210\u5BC6\u94A5\u66F4\u65B0\u5E76\u91CD\u542F\uFF09\u3002\u672C\u547D\u4EE4\u4E0D\u4F1A\u542F\u52A8\u65B0\u7684\u6388\u6743\uFF1B\u8BF7\u67E5\u770B\u673A\u5668\u4EBA\u53D1\u9001\u7684\u9A8C\u8BC1\u7ED3\u679C\uFF0C\u786E\u8BA4\u4E0A\u4E00\u6B21\u4EFB\u52A1\u5DF2\u7ED3\u675F\u540E\u518D\u53D1\u9001 /repair\u3002"));return}if(r.actorOpenId!==i){await this.#O(A,D("\u53E6\u4E00\u4F4D\u7528\u6237\u6B63\u5728\u4FEE\u590D\u8BE5\u673A\u5668\u4EBA\uFF0C\u672C\u6B21\u4E0D\u4F1A\u663E\u793A\u5176\u6388\u6743\u4FE1\u606F\u3002"));return}if(a==="cancel"){let g;try{let c=await this.#T.cancel(this.#ge(r));g=WC(c,{botId:this.#M}),r.snapshot=g}catch{await this.#O(A,D("\u6682\u65F6\u65E0\u6CD5\u53D6\u6D88\u4FEE\u590D\u4EFB\u52A1\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"));return}g.state==="cancelled"&&(r.stopped=!0,this.#k+=1),await this.#O(A,this.#re(g));return}let s;try{s=await this.#pe(r)}catch{await this.#O(A,D("\u6682\u65F6\u65E0\u6CD5\u67E5\u8BE2\u4FEE\u590D\u72B6\u6001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"));return}if(a==="qr"){if(!mv.has(s.state)||!r.verificationUrl){await this.#O(A,this.#re(s,{verificationFocused:!0}));return}await this.#Ye(A,r.verificationUrl,s);return}await this.#O(A,this.#re(s,{verificationFocused:a==="verify"}))}#ge(t){return{botId:this.#M,attemptId:t.attemptId,actorOpenId:t.actorOpenId,chatId:t.chatId}}async#Ue({actorOpenId:t,chatId:o}){let i=this.#U,e=!1;if(i&&mv.has(i.snapshot.state)){if(i.actorOpenId!==t){await this.#O(o,D("\u53E6\u4E00\u4F4D\u7528\u6237\u6B63\u5728\u4FEE\u590D\u8BE5\u673A\u5668\u4EBA\uFF0C\u672C\u6B21\u4E0D\u4F1A\u663E\u793A\u5176\u6388\u6743\u4FE1\u606F\u3002"));return}let r;try{r=await this.#pe(i)}catch{await this.#O(o,D("\u6682\u65F6\u65E0\u6CD5\u67E5\u8BE2\u4FEE\u590D\u72B6\u6001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"));return}if(r.state==="saving"){await this.#O(o,this.#re(r));return}if(gW.has(r.state)){let s;try{s=WC(await this.#T.cancel(this.#ge(i)),{botId:this.#M}),i.snapshot=s}catch{await this.#O(o,D("\u6682\u65F6\u65E0\u6CD5\u53D6\u6D88\u65E7\u4FEE\u590D\u4EFB\u52A1\uFF0C\u672A\u751F\u6210\u65B0\u94FE\u63A5\uFF1B\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"));return}if(!wm.has(s.state)){await this.#O(o,this.#re(s));return}i.stopped=!0,this.#k+=1,e=s.state==="cancelled"}else wm.has(r.state)&&(i.stopped=!0,this.#k+=1)}let a;try{a=WC(await this.#T.start({botId:this.#M,actorOpenId:t,chatId:o}),{botId:this.#M}),a=await this.#He(a,{actorOpenId:t,chatId:o})}catch{await this.#O(o,D("\u4FEE\u590D\u6D41\u7A0B\u6682\u65F6\u5931\u8D25\uFF0C\u73B0\u6709\u673A\u5668\u4EBA\u8FDE\u63A5\u4E0D\u53D7\u5F71\u54CD\uFF1B\u8BF7\u7A0D\u540E\u53D1\u9001 /repair \u91CD\u8BD5\u3002"));return}let A={attemptId:a.attemptId,actorOpenId:t,chatId:o,snapshot:a,verificationUrl:null,stopped:!1,announcedSaving:!1,announcedTerminal:!1};if(this.#U=A,a.verificationUrl)try{A.verificationUrl=sW(a.verificationUrl,this.#P)}catch{A.stopped=!0,await this.#T.cancel(this.#ge(A)).catch(()=>{}),await this.#O(o,D("\u98DE\u4E66\u8FD4\u56DE\u4E86\u65E0\u6CD5\u5B89\u5168\u9A8C\u8BC1\u7684\u6388\u6743\u94FE\u63A5\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u4FEE\u590D\u3002"));return}if(wm.has(a.state)){A.announcedTerminal=!0,a.state!=="succeeded"&&await this.#O(o,this.#re(a));return}if(!A.verificationUrl){A.stopped=!0,await this.#O(o,D("\u98DE\u4E66\u672A\u8FD4\u56DE\u6388\u6743\u94FE\u63A5\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u4FEE\u590D\u3002"));return}await this.#xe(o,A.verificationUrl,a,{restarted:e}),this.#Ke(A)}async#He(t,o){let i=t,e=Date.now()+this.#N;for(;!i.verificationUrl&&mv.has(i.state);){if(Date.now()>=e)throw new Error("Feishu repair link timed out");await nW(Math.min(100,this.#v),this.#D),i=WC(await this.#T.status({botId:this.#M,attemptId:i.attemptId,actorOpenId:o.actorOpenId,chatId:o.chatId}),{botId:this.#M})}return i}async#pe(t){let o=WC(await this.#T.status(this.#ge(t)),{botId:this.#M});if(o.attemptId!==t.attemptId)throw new Error("Feishu repair attempt changed unexpectedly");return t.snapshot=o,o.verificationUrl&&(t.verificationUrl=sW(o.verificationUrl,this.#P)),o}#Ke(t){let o=++this.#k;(async()=>{for(;!t.stopped&&this.#U===t&&this.#k===o&&!this.#D?.aborted;){let i=Math.max(250,Math.min(1e4,t.snapshot.pollIntervalMs??this.#v));if(await nW(i,this.#D),t.stopped||this.#U!==t||this.#k!==o)return;let e=await this.#pe(t);if(e.state==="saving"&&!t.announcedSaving&&(t.announcedSaving=!0,await this.#O(t.chatId,D("\u6388\u6743\u5DF2\u786E\u8BA4\uFF0C\u6B63\u5728\u53D1\u9001\u5E76\u7B49\u5F85\u6D4B\u8BD5\u6309\u94AE\u56DE\u8C03\uFF1B\u6536\u5230\u771F\u5B9E\u56DE\u8C03\u540E\u624D\u4F1A\u5B8C\u6210\u3002"))),wm.has(e.state)){t.stopped=!0,e.state!=="succeeded"&&!t.announcedTerminal&&(t.announcedTerminal=!0,await this.#O(t.chatId,this.#re(e)));return}}})().catch(async()=>{this.#D?.aborted||t.stopped||this.#U!==t||(t.stopped=!0,this.#w.warn?.("[dsh-feishu] callback repair status monitoring failed"),await this.#O(t.chatId,D("\u4FEE\u590D\u72B6\u6001\u67E5\u8BE2\u4E2D\u65AD\uFF0C\u73B0\u6709\u673A\u5668\u4EBA\u8FDE\u63A5\u4E0D\u53D7\u5F71\u54CD\uFF1B\u53D1\u9001 /repair status \u91CD\u8BD5\u67E5\u8BE2\u3002")).catch(()=>{}))})}async#xe(t,o,i,{restarted:e=!1}={}){let a=i.remainingSeconds??(i.expiresAt?Math.max(0,Math.ceil((i.expiresAt-Date.now())/1e3)):null),A=a===null?D("\u94FE\u63A5\u4E3A\u77ED\u671F\u6709\u6548"):D("\u94FE\u63A5\u7EA6 {minutes} \u5206\u949F\u540E\u8FC7\u671F",{minutes:Math.max(1,Math.ceil(a/60))});await this.#O(t,[e?D("\u65E7\u6388\u6743\u94FE\u63A5\u5DF2\u4F5C\u5E9F\uFF0C\u5DF2\u751F\u6210\u65B0\u7684\u4FEE\u590D\u94FE\u63A5\u3002"):D("\u{1F527} \u51C6\u5907\u8865\u5168\u6743\u9650\u4E0E\u56DE\u8C03\u3002"),D("\u672C\u6B21\u6700\u591A\u589E\u91CF\u6DFB\u52A0\u4E09\u9879\uFF1A\u5361\u7247\u56DE\u8C03 card.action.trigger\uFF1B\u98DE\u4E66\u663E\u793A\u4E3A\u201C\u83B7\u53D6\u5355\u804A\u3001\u7FA4\u7EC4\u6D88\u606F\u201D\u7684\u79DF\u6237\u6743\u9650 im:message:readonly\uFF08\u7528\u4E8E\u8BFB\u53D6\u7528\u6237\u6D88\u606F\u4E2D\u7684\u56FE\u7247\u6216\u6587\u4EF6\uFF09\uFF1B\u4EE5\u53CA im:resource\uFF08\u7528\u4E8E\u4E0A\u4F20\u673A\u5668\u4EBA\u53D1\u9001\u7684\u56FE\u7247\u6216\u6587\u4EF6\uFF09\u3002\u786E\u8BA4\u9875\u53EA\u4F1A\u663E\u793A\u5F53\u524D\u7F3A\u5C11\u7684\u9879\uFF1B\u82E5\u51FA\u73B0\u4E0A\u8FF0\u8303\u56F4\u4E4B\u5916\u7684\u914D\u7F6E\uFF0C\u8BF7\u53D6\u6D88\u3002"),"",D("\u5F53\u524D\u8BBE\u5907\u76F4\u63A5\u6253\u5F00\uFF1A"),o,"",D("\u82E5\u8981\u7528\u53E6\u4E00\u53F0\u8BBE\u5907\u626B\u7801\uFF0C\u53D1\u9001 /repair qr\u3002{expiry}\u3002",{expiry:A})].join(` +${e.batchInputMessage}`:dt(A);await this.#O(t.message.chat_id,r).catch(()=>{})}async waitForIdle(){for(;;){let t=[...this.#a.values(),...[...this.#o.values()].flatMap(o=>o.queue?[o.queue]:[]),...this.#I,...this.#s,...this.#p,...this.#z.values(),...[...this.#F.values()].map(o=>o.promise)];if(t.length===0||(await Promise.allSettled(t),this.#a.size===0&&this.#I.size===0&&this.#s.size===0&&this.#p.size===0&&this.#z.size===0&&this.#F.size===0&&![...this.#o.values()].some(o=>o.queue)))return}}#V(){let t=AbortSignal.timeout(this.#$);return this.#D?AbortSignal.any([this.#D,t]):t}#ae(t){return this.#o.has(t)||this.#y.hasPending(t)}async#Le(t,o,i,e,a){if(this.#D?.throwIfAborted(),this.#r.hasSeen(o))return;await this.#r.markSeen(o),this.#f.lastMessageAt=new Date().toISOString(),this.#f.messagesReceived+=1;let A=await a(CA(e.content)??"",this.#t,this.#r,i,{signal:this.#D,isDirect:t.message.chat_type==="p2p",hasImages:Vt(e),hasFiles:Ft(e),pendingInteraction:this.#ae(i),control:{owner:this,key:i}});A?.stopped&&await Promise.allSettled([this.#Se(i),this.#y.closeRoute(i)]);for(let r of A?.messages??[A?.message])r&&await this.#O(t.message.chat_id,r);this.#f.lastError=null}async#De(t,o,{alreadyRecorded:i=!1}={}){this.#D?.throwIfAborted();let e=t.message.message_id;if(!i){if(this.#r.hasSeen(e))return;await this.#r.markSeen(e),this.#f.lastMessageAt=new Date().toISOString(),this.#f.messagesReceived+=1}let a=fv(t,this.#e),A=a.content,r=Vt(a),s=Ft(a),g=!r&&!s&&A?A.trim():null;if(!A&&!r&&!s){await this.#O(t.message.chat_id,D("\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u548C\u6587\u4EF6\u6D88\u606F\u3002"));return}if(g!==null&&ONe.test(g)){await this.#we(t,g);return}if(g==="/help"){await this.#O(t.message.chat_id,qV());return}if(wNe.test(g)){await this.#Z(o,t.message.chat_id);return}if(g==="/new"){if(this.#a.has(o)||this.#ae(o)){await this.#O(t.message.chat_id,D("\u5F53\u524D\u4EFB\u52A1\u4ECD\u5728\u8FD0\u884C\uFF0C\u8BF7\u5148\u505C\u6B62\u4EFB\u52A1\u6216\u7B49\u5F85\u4EFB\u52A1\u5B8C\u6210\u540E\u518D\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002"));return}await this.#r.clearSession(o),await this.#O(t.message.chat_id,D("\u5DF2\u5F00\u542F\u5168\u65B0 Harness \u4F1A\u8BDD\u3002")),await this.#Z(o,t.message.chat_id);return}if(g==="/status"){await this.#$e(o,t.message.chat_id);return}if(g==="/compact"){let f=await hi(g,this.#t,this.#r,o,{signal:this.#D});f&&await this.#O(t.message.chat_id,f.message);return}if(_Ne.test(g)){let f=g.replace(/^\/(?:sessionlist|sessions)/i,"").trim()||null;await this.#ce({chatId:t.message.chat_id,key:o},f,0);return}if(TNe.test(g)){await this.#Me({chatId:t.message.chat_id,key:o});return}if(tW.test(g)){let f=(tW.exec(g)?.[1]??"").trim()||null;await this.#Ee(o,t.message.chat_id,f);return}if(rW.test(g)){let f=(rW.exec(g)?.[1]??"").trim()||null;await this.#Ce(o,t.message.chat_id,f);return}if(MNe.test(g)){await this.#ue(o,t.message.chat_id);return}if(iW.test(g)){let Q=iW.exec(g)[1]?.toLowerCase();if(Q!=="on"&&Q!=="off"){await this.#O(t.message.chat_id,D("\u7528\u6CD5\uFF1A/archived on\uFF08\u5305\u542B\u5F52\u6863\u4F1A\u8BDD\uFF09\u6216 /archived off\uFF08\u9690\u85CF\u5F52\u6863\u4F1A\u8BDD\uFF09"));return}typeof this.#r?.setIncludeArchivedSessions=="function"&&await this.#r.setIncludeArchivedSessions(Q==="on"),await this.#O(t.message.chat_id,Q==="on"?D("\u5DF2\u5F00\u542F\uFF1A\u4F1A\u8BDD\u5217\u8868\u5305\u542B\u5F52\u6863\u4F1A\u8BDD\u3002"):D("\u5DF2\u5173\u95ED\uFF1A\u4F1A\u8BDD\u5217\u8868\u9690\u85CF\u5F52\u6863\u4F1A\u8BDD\u3002"));return}if(NNe.test(g)){let f=this.#qe(o);if(f){await this.#ze(f,Number(g),{chatId:t.message.chat_id,key:o,event:t});return}}let c=g===null?null:await uo(A,this.#t,o);if(c){for(let f of c.messages??[c.message])await this.#O(t.message.chat_id,f);return}let I=g===null?null:await hi(g,this.#t,this.#r,o,{signal:this.#D});if(I){await this.#O(t.message.chat_id,I.message);return}this.#w.info?.(`[dsh-feishu] processing ${t.message.chat_type} message ${e}`);let d=t.batchSubmission??null,B=!1;try{let{receipt:f,artifactSendErrors:Q,textDeliveryErrors:y=0}=await this.#lA(t,o,a,{onAskComplete:d?()=>{B=this.#n.complete(o,d.token).completed}:void 0});return this.#f.messagesReplied+=1,this.#f.lastReplyAt=new Date().toISOString(),this.#f.lastError=null,y===0&&Q===0&&po(this.#f),f}catch(f){if(d&&!B){if(f?.code==="turn-stopped")throw this.#n.complete(o,d.token),f;let Q=this.#n.fail(o,d.token);if(Q.retained){let y=new Error(f?.message??String(f),{cause:f});throw y.code=f?.code,y.providerCode=f?.providerCode,y.method=f?.method,Number.isInteger(f?.status)&&(y.status=f.status),y.batchInputMessage=Q.message,y}}throw f}finally{await this.#Se(o),await this.#y.closeRoute(o)}}async#we(t,o){if(t?.message?.chat_type!=="p2p"){await this.#O(t.message.chat_id,D("\u4E3A\u907F\u514D\u6388\u6743\u94FE\u63A5\u66B4\u9732\uFF0C\u8BF7\u79C1\u804A\u673A\u5668\u4EBA\u53D1\u9001 /repair\u3002"));return}let i=ZNe(t);if(!i){await this.#O(t.message.chat_id,D("\u65E0\u6CD5\u8BC6\u522B\u5F53\u524D\u53D1\u9001\u8005\uFF0C\u672A\u53D1\u8D77\u4FEE\u590D\u3002"));return}if(!this.#T){await this.#O(t.message.chat_id,D("\u5F53\u524D Host \u7248\u672C\u6682\u4E0D\u652F\u6301\u804A\u5929\u5185\u4FEE\u590D\uFF0C\u8BF7\u5148\u66F4\u65B0\u63D2\u4EF6\u3002"));return}let e=bNe.exec(o);if(!e){await this.#O(t.message.chat_id,D("\u7528\u6CD5\uFF1A/repair\u3001/repair qr\u3001/repair status\u3001/repair cancel \u6216 /repair verify"));return}let a=e[1]?.toLowerCase()??"start",A=t.message.chat_id;if(a==="start"){await this.#Ue({actorOpenId:i,chatId:A});return}let r=this.#U;if(!r){await this.#O(A,D("\u5F53\u524D Runtime \u6CA1\u6709\u53EF\u6062\u590D\u7684\u4FEE\u590D\u4EFB\u52A1\u8BB0\u5F55\uFF08\u673A\u5668\u4EBA\u53EF\u80FD\u521A\u5B8C\u6210\u5BC6\u94A5\u66F4\u65B0\u5E76\u91CD\u542F\uFF09\u3002\u672C\u547D\u4EE4\u4E0D\u4F1A\u542F\u52A8\u65B0\u7684\u6388\u6743\uFF1B\u8BF7\u67E5\u770B\u673A\u5668\u4EBA\u53D1\u9001\u7684\u9A8C\u8BC1\u7ED3\u679C\uFF0C\u786E\u8BA4\u4E0A\u4E00\u6B21\u4EFB\u52A1\u5DF2\u7ED3\u675F\u540E\u518D\u53D1\u9001 /repair\u3002"));return}if(r.actorOpenId!==i){await this.#O(A,D("\u53E6\u4E00\u4F4D\u7528\u6237\u6B63\u5728\u4FEE\u590D\u8BE5\u673A\u5668\u4EBA\uFF0C\u672C\u6B21\u4E0D\u4F1A\u663E\u793A\u5176\u6388\u6743\u4FE1\u606F\u3002"));return}if(a==="cancel"){let g;try{let c=await this.#T.cancel(this.#ge(r));g=WC(c,{botId:this.#M}),r.snapshot=g}catch{await this.#O(A,D("\u6682\u65F6\u65E0\u6CD5\u53D6\u6D88\u4FEE\u590D\u4EFB\u52A1\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"));return}g.state==="cancelled"&&(r.stopped=!0,this.#k+=1),await this.#O(A,this.#re(g));return}let s;try{s=await this.#pe(r)}catch{await this.#O(A,D("\u6682\u65F6\u65E0\u6CD5\u67E5\u8BE2\u4FEE\u590D\u72B6\u6001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"));return}if(a==="qr"){if(!mv.has(s.state)||!r.verificationUrl){await this.#O(A,this.#re(s,{verificationFocused:!0}));return}await this.#Ye(A,r.verificationUrl,s);return}await this.#O(A,this.#re(s,{verificationFocused:a==="verify"}))}#ge(t){return{botId:this.#M,attemptId:t.attemptId,actorOpenId:t.actorOpenId,chatId:t.chatId}}async#Ue({actorOpenId:t,chatId:o}){let i=this.#U,e=!1;if(i&&mv.has(i.snapshot.state)){if(i.actorOpenId!==t){await this.#O(o,D("\u53E6\u4E00\u4F4D\u7528\u6237\u6B63\u5728\u4FEE\u590D\u8BE5\u673A\u5668\u4EBA\uFF0C\u672C\u6B21\u4E0D\u4F1A\u663E\u793A\u5176\u6388\u6743\u4FE1\u606F\u3002"));return}let r;try{r=await this.#pe(i)}catch{await this.#O(o,D("\u6682\u65F6\u65E0\u6CD5\u67E5\u8BE2\u4FEE\u590D\u72B6\u6001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"));return}if(r.state==="saving"){await this.#O(o,this.#re(r));return}if(gW.has(r.state)){let s;try{s=WC(await this.#T.cancel(this.#ge(i)),{botId:this.#M}),i.snapshot=s}catch{await this.#O(o,D("\u6682\u65F6\u65E0\u6CD5\u53D6\u6D88\u65E7\u4FEE\u590D\u4EFB\u52A1\uFF0C\u672A\u751F\u6210\u65B0\u94FE\u63A5\uFF1B\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"));return}if(!wm.has(s.state)){await this.#O(o,this.#re(s));return}i.stopped=!0,this.#k+=1,e=s.state==="cancelled"}else wm.has(r.state)&&(i.stopped=!0,this.#k+=1)}let a;try{a=WC(await this.#T.start({botId:this.#M,actorOpenId:t,chatId:o}),{botId:this.#M}),a=await this.#He(a,{actorOpenId:t,chatId:o})}catch{await this.#O(o,D("\u4FEE\u590D\u6D41\u7A0B\u6682\u65F6\u5931\u8D25\uFF0C\u73B0\u6709\u673A\u5668\u4EBA\u8FDE\u63A5\u4E0D\u53D7\u5F71\u54CD\uFF1B\u8BF7\u7A0D\u540E\u53D1\u9001 /repair \u91CD\u8BD5\u3002"));return}let A={attemptId:a.attemptId,actorOpenId:t,chatId:o,snapshot:a,verificationUrl:null,stopped:!1,announcedSaving:!1,announcedTerminal:!1};if(this.#U=A,a.verificationUrl)try{A.verificationUrl=sW(a.verificationUrl,this.#P)}catch{A.stopped=!0,await this.#T.cancel(this.#ge(A)).catch(()=>{}),await this.#O(o,D("\u98DE\u4E66\u8FD4\u56DE\u4E86\u65E0\u6CD5\u5B89\u5168\u9A8C\u8BC1\u7684\u6388\u6743\u94FE\u63A5\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u4FEE\u590D\u3002"));return}if(wm.has(a.state)){A.announcedTerminal=!0,a.state!=="succeeded"&&await this.#O(o,this.#re(a));return}if(!A.verificationUrl){A.stopped=!0,await this.#O(o,D("\u98DE\u4E66\u672A\u8FD4\u56DE\u6388\u6743\u94FE\u63A5\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u4FEE\u590D\u3002"));return}await this.#xe(o,A.verificationUrl,a,{restarted:e}),this.#Ke(A)}async#He(t,o){let i=t,e=Date.now()+this.#N;for(;!i.verificationUrl&&mv.has(i.state);){if(Date.now()>=e)throw new Error("Feishu repair link timed out");await nW(Math.min(100,this.#v),this.#D),i=WC(await this.#T.status({botId:this.#M,attemptId:i.attemptId,actorOpenId:o.actorOpenId,chatId:o.chatId}),{botId:this.#M})}return i}async#pe(t){let o=WC(await this.#T.status(this.#ge(t)),{botId:this.#M});if(o.attemptId!==t.attemptId)throw new Error("Feishu repair attempt changed unexpectedly");return t.snapshot=o,o.verificationUrl&&(t.verificationUrl=sW(o.verificationUrl,this.#P)),o}#Ke(t){let o=++this.#k;(async()=>{for(;!t.stopped&&this.#U===t&&this.#k===o&&!this.#D?.aborted;){let i=Math.max(250,Math.min(1e4,t.snapshot.pollIntervalMs??this.#v));if(await nW(i,this.#D),t.stopped||this.#U!==t||this.#k!==o)return;let e=await this.#pe(t);if(e.state==="saving"&&!t.announcedSaving&&(t.announcedSaving=!0,await this.#O(t.chatId,D("\u6388\u6743\u5DF2\u786E\u8BA4\uFF0C\u6B63\u5728\u53D1\u9001\u5E76\u7B49\u5F85\u6D4B\u8BD5\u6309\u94AE\u56DE\u8C03\uFF1B\u6536\u5230\u771F\u5B9E\u56DE\u8C03\u540E\u624D\u4F1A\u5B8C\u6210\u3002"))),wm.has(e.state)){t.stopped=!0,e.state!=="succeeded"&&!t.announcedTerminal&&(t.announcedTerminal=!0,await this.#O(t.chatId,this.#re(e)));return}}})().catch(async()=>{this.#D?.aborted||t.stopped||this.#U!==t||(t.stopped=!0,this.#w.warn?.("[dsh-feishu] callback repair status monitoring failed"),await this.#O(t.chatId,D("\u4FEE\u590D\u72B6\u6001\u67E5\u8BE2\u4E2D\u65AD\uFF0C\u73B0\u6709\u673A\u5668\u4EBA\u8FDE\u63A5\u4E0D\u53D7\u5F71\u54CD\uFF1B\u53D1\u9001 /repair status \u91CD\u8BD5\u67E5\u8BE2\u3002")).catch(()=>{}))})}async#xe(t,o,i,{restarted:e=!1}={}){let a=i.remainingSeconds??(i.expiresAt?Math.max(0,Math.ceil((i.expiresAt-Date.now())/1e3)):null),A=a===null?D("\u94FE\u63A5\u4E3A\u77ED\u671F\u6709\u6548"):D("\u94FE\u63A5\u7EA6 {minutes} \u5206\u949F\u540E\u8FC7\u671F",{minutes:Math.max(1,Math.ceil(a/60))});await this.#O(t,[e?D("\u65E7\u6388\u6743\u94FE\u63A5\u5DF2\u4F5C\u5E9F\uFF0C\u5DF2\u751F\u6210\u65B0\u7684\u4FEE\u590D\u94FE\u63A5\u3002"):D("\u{1F527} \u51C6\u5907\u8865\u5168\u6743\u9650\u4E0E\u56DE\u8C03\u3002"),D("\u672C\u6B21\u6700\u591A\u589E\u91CF\u6DFB\u52A0\u4E09\u9879\uFF1A\u5361\u7247\u56DE\u8C03 card.action.trigger\uFF1B\u98DE\u4E66\u663E\u793A\u4E3A\u201C\u83B7\u53D6\u5355\u804A\u3001\u7FA4\u7EC4\u6D88\u606F\u201D\u7684\u79DF\u6237\u6743\u9650 im:message:readonly\uFF08\u7528\u4E8E\u8BFB\u53D6\u7528\u6237\u6D88\u606F\u4E2D\u7684\u56FE\u7247\u6216\u6587\u4EF6\uFF09\uFF1B\u4EE5\u53CA im:resource\uFF08\u7528\u4E8E\u4E0A\u4F20\u673A\u5668\u4EBA\u53D1\u9001\u7684\u56FE\u7247\u6216\u6587\u4EF6\uFF09\u3002\u786E\u8BA4\u9875\u53EA\u4F1A\u663E\u793A\u5F53\u524D\u7F3A\u5C11\u7684\u9879\uFF1B\u82E5\u51FA\u73B0\u4E0A\u8FF0\u8303\u56F4\u4E4B\u5916\u7684\u914D\u7F6E\uFF0C\u8BF7\u53D6\u6D88\u3002"),"",D("\u5F53\u524D\u8BBE\u5907\u76F4\u63A5\u6253\u5F00\uFF1A"),o,"",D("\u82E5\u8981\u7528\u53E6\u4E00\u53F0\u8BBE\u5907\u626B\u7801\uFF0C\u53D1\u9001 /repair qr\u3002{expiry}\u3002",{expiry:A})].join(` `))}async#Ye(t,o,i){try{let e=await SNe.toBuffer(o,{errorCorrectionLevel:"M",margin:1,width:480,type:"png"}),a=await this.#e.im.v1.image.create({data:{image_type:"message",image:e}}),A=CA(a?.image_key)??CA(a?.data?.image_key);if(!A)throw new Error("Feishu QR upload returned no image key");let r=i.remainingSeconds??(i.expiresAt?Math.max(0,Math.ceil((i.expiresAt-Date.now())/1e3)):null),s=r===null?"":D("\uFF08\u5269\u4F59\u7EA6 {minutes} \u5206\u949F\uFF09",{minutes:Math.max(1,Math.ceil(r/60))});await this.#O(t,D("\u8BF7\u7528\u53E6\u4E00\u53F0\u8BBE\u5907\u626B\u7801\u5B8C\u6210\u6388\u6743{remaining}\u3002",{remaining:s}));let g=await this.#e.im.v1.message.create({params:{receive_id_type:"chat_id"},data:{receive_id:t,msg_type:"image",content:JSON.stringify({image_key:A})}});if(g?.code&&g.code!==0)throw new Error("Feishu QR message send failed")}catch{await this.#O(t,D(`\u4E8C\u7EF4\u7801\u6682\u65F6\u65E0\u6CD5\u53D1\u9001\uFF0C\u8BF7\u76F4\u63A5\u6253\u5F00\u6388\u6743\u94FE\u63A5\uFF1A {url}`,{url:o}))}}#re(t,{verificationFocused:o=!1}={}){if(t.state==="succeeded")return D("\u2705 \u4FEE\u590D\u5B8C\u6210\uFF1A\u5DF2\u5B9E\u6D4B\u6536\u5230 card.action.trigger\uFF0C\u83DC\u5355\u6309\u94AE\u73B0\u5728\u53EF\u7528\u3002");if(t.state==="expired"||t.error?.code==="expired_token")return D("\u6388\u6743\u94FE\u63A5\u5DF2\u8FC7\u671F\uFF1B\u5E73\u53F0\u672A\u8FD4\u56DE\u6210\u529F\u7ED3\u679C\uFF0C\u65E0\u6CD5\u786E\u8BA4\u5DF2\u4FEE\u590D\u3002\u53D1\u9001 /repair \u751F\u6210\u65B0\u94FE\u63A5\u3002");if(t.state==="cancelled"||t.error?.code==="abort")return D("\u5DF2\u53D6\u6D88\u672C\u6B21\u4FEE\u590D\u6388\u6743\uFF0C\u672A\u786E\u8BA4\u5B8C\u6210\u4FEE\u590D\u3002");if(t.error?.code==="access_denied")return D("\u4F60\u5DF2\u53D6\u6D88\u6216\u62D2\u7EDD\u6388\u6743\uFF0C\u6CA1\u6709\u786E\u8BA4\u4FEE\u590D\uFF1B\u53D1\u9001 /repair \u53EF\u91CD\u8BD5\u3002");if(t.error?.code==="card_action_probe_timeout"||t.error?.code==="card-action-probe-timeout")return D("\u6388\u6743\u5DF2\u63D0\u4EA4\uFF0C\u4F46\u672A\u6536\u5230\u6D4B\u8BD5\u6309\u94AE\u56DE\u8C03\u3002\u53EF\u80FD\u5C1A\u672A\u70B9\u51FB\u6216\u914D\u7F6E\u4ECD\u5728\u4F20\u64AD\uFF1B\u7A0D\u540E\u53D1\u9001 /repair verify \u67E5\u8BE2\uFF0C\u4E0D\u8981\u76F2\u76EE\u91CD\u590D\u6388\u6743\u3002");if(t.state==="error")return D("\u4FEE\u590D\u6D41\u7A0B\u6682\u65F6\u5931\u8D25\uFF0C\u73B0\u6709\u673A\u5668\u4EBA\u8FDE\u63A5\u4E0D\u53D7\u5F71\u54CD\uFF1B\u53D1\u9001 /repair \u53EF\u91CD\u8BD5\u3002");if(t.state==="saving")return D("\u6388\u6743\u5DF2\u786E\u8BA4\uFF0C\u6B63\u5728\u7B49\u5F85\u4E13\u7528\u6D4B\u8BD5\u6309\u94AE\u7684\u771F\u5B9E\u56DE\u8C03\uFF1B\u56DE\u8C03\u5230\u8FBE\u524D\u4E0D\u4F1A\u5BA3\u544A\u6210\u529F\u3002");if(o)return D("\u6388\u6743\u5C1A\u672A\u5B8C\u6210\uFF0C\u6682\u65F6\u4E0D\u80FD\u9A8C\u8BC1\u5361\u7247\u6309\u94AE\u3002\u8BF7\u5148\u6253\u5F00\u6388\u6743\u94FE\u63A5\u5E76\u786E\u8BA4\u3002");let i=t.remainingSeconds===null?"":D("\uFF0C\u5269\u4F59\u7EA6 {minutes} \u5206\u949F",{minutes:Math.max(1,Math.ceil(t.remainingSeconds/60))});return D("\u4FEE\u590D\u4EFB\u52A1\u6B63\u5728\u7B49\u5F85\u6388\u6743{remaining}\u3002\u53D1\u9001 /repair qr \u53EF\u83B7\u53D6\u4E8C\u7EF4\u7801\uFF0C/repair cancel \u53EF\u53D6\u6D88\u3002",{remaining:i})}onCardAction(t){let o=CA(t?.operator?.open_id)??CA(t?.operator?.user_id)??CA(t?.operator?.operator_id?.open_id)??CA(t?.operator?.operator_id?.user_id)??CA(t?.open_id)??CA(t?.user_id);if(!(o!==null&&(this.#b.has("*")||this.#b.has(o))))return this.#w.warn?.("[dsh-feishu] ignoring card action from an unallowed sender"),Promise.resolve();let e=oW(t?.action?.value),a=oW(t?.action?.form_value),A=CA(e.action)??CA(t?.action?.action);if(!A)return Promise.resolve();let r=ZC(t?.action?.option)??(A.endsWith("_pick")?dg(t?.action?.options)[0]:null),s=[...new Set([...dg(e.options),...dg(t?.action?.options),...dg(a[A]),...A==="watch_add"||A==="watch_remove"?dg(t?.action?.option):[]])],g=A==="workspace_pick"&&typeof r=="string"?`workspace:${r}`:A==="session_pick"&&typeof r=="string"?`use:${r}`:A==="preset_pick"&&typeof r=="string"?`preset:select:${r}`:A==="model_pick"&&typeof r=="string"?`model:select:${r}`:A==="archive_pick"&&typeof r=="string"?`archive:${r}`:A==="steer_pick"&&typeof r=="string"?`steer:${r}`:A,c=CA(t?.context?.open_message_id)??CA(t?.open_message_id)??CA(t?.message_id),I=c?this.#H.get(c):null;if(!I){let F=CA(t?.context?.open_chat_id)??CA(t?.open_chat_id)??CA(t?.chat_id);return F&&this.#O(F,D("\u8FD9\u4E2A\u83DC\u5355\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u56DE\u590D /m \u91CD\u65B0\u6253\u5F00\u3002")).catch(()=>{}),Promise.resolve()}this.#H.delete(c),this.#H.set(c,I);let d={...I,messageId:c,selections:s,operatorOpenId:o},B=CA(e.source),f=CA(a.steer_text),Q=CA(t?.event_id)??CA(t?.header?.event_id)??CA(t?.uuid)??CA(t?.header?.uuid),y=JSON.stringify({messageId:c,resolvedAction:g,option:r,multiValues:s,source:B,formText:f}),m=g==="stop",_=g.startsWith("steer:")?g.slice(6):null,R=A==="steer"&&B==="quick"&&r!==null&&r!==zC||A==="steer"&&B==="form"&&f!==null||_!==null&&_!==""&&!(_==="custom"||_===zC);return this.#Je(d,y,async()=>{if(A==="steer"){if(B==="quick"&&r){if(r===zC){await this.#W(d.chatId,Qv(),{key:d.key,updateMessageId:d.messageId});return}await this.#de(d,r);return}if(B==="form"){if(f){await this.#de(d,f);return}await this.#O(d.chatId,D("\u8BF7\u8F93\u5165\u8865\u5145\u6307\u4EE4\u540E\u518D\u63D0\u4EA4\u3002"));return}}await this.#ie(g,d)},{lane:m||R?"control":"regular",coalesceStop:m,eventId:Q,operatorOpenId:o})}#Oe(t=Date.now()){for(let[o,i]of this.#S)i<=t&&this.#S.delete(o);for(;this.#S.size>aW;){let o=this.#S.keys().next().value;if(o===void 0)break;this.#S.delete(o)}}#be(t,o=Date.now()){t&&(this.#S.delete(t),this.#S.set(t,o+GNe),this.#Oe(o))}#je(t){let o=t.key,i=Date.now(),e=this.#Q.get(o);if(e?.task||e&&i-e.at{}).finally(()=>{this.#p.delete(a);let A=this.#Q.get(o);A?.task===a&&this.#Q.set(o,{at:A.at,task:null})}),this.#Q.delete(o),this.#Q.set(o,{at:i,task:a}),this.#p.add(a);this.#Q.size>200;){let A=this.#Q.keys().next().value;if(A===void 0)break;this.#Q.delete(A)}return a}#Je(t,o,i,{lane:e="regular",coalesceStop:a=!1,eventId:A=null,operatorOpenId:r=null}={}){let s=t.key,g=A?`${s}\0${r??""}\0event:${A}`:null,c=g??`${s}\0${r??""}\0action:${o}`,I=Date.now();if(this.#Oe(I),g&&(this.#S.get(g)??0)>I)return Promise.resolve();let d=this.#B.get(c);if(d)return d;if(a){let j=this.#u.get(s);if(j){if(g)for(this.#m.delete(g),this.#m.set(g,j);this.#m.size>aW;){let U=this.#m.keys().next().value;if(U===void 0)break;this.#m.delete(U)}return j}}let B=e==="control",f=B?this.#h:this.#d,Q=B?this.#C:this.#E,y=B?PNe:vNe,m=Q.get(s)??0,_=a?y+1:y;if(m>=_)return this.#je(t);let T=f.get(s)??Promise.resolve();Q.set(s,m+1);let R,F=!1;return R=T.catch(()=>{}).then(async()=>{this.#D?.throwIfAborted(),F=!0,await i()}).catch(async j=>{this.#D?.aborted||await this.#x(t.chatId,j,{logLabel:"card action"})}).finally(()=>{if(this.#B.get(c)===R&&this.#B.delete(c),F&&g&&this.#be(g),a&&this.#u.get(s)===R&&this.#u.delete(s),a){let U=Date.now();for(let[z,q]of this.#m)q===R&&(this.#m.delete(z),this.#be(z,U))}f.get(s)===R&&f.delete(s);let j=(Q.get(s)??1)-1;j>0?Q.set(s,j):Q.delete(s),this.#p.delete(R)}),this.#B.set(c,R),a&&this.#u.set(s,R),this.#p.add(R),f.set(s,R),R}async#ie(t,{chatId:o,key:i,messageId:e=null,sessionWorkspace:a=null,sessionPage:A=0,selections:r=[]}){if(t==="sessions"||/^sessions:\d+$/.test(t)){let s=t==="sessions"?0:Number(t.slice(9));await this.#ce({chatId:o,key:i},a,s,{updateMessageId:e});return}if(t==="workspaces"){await this.#Me({chatId:o,key:i},{updateMessageId:e});return}if(t==="watchlist"){await this.#ue(i,o,{updateMessageId:e});return}if(t==="watch_add"||t==="watch_remove"){if(r.length===0){await this.#O(o,D("\u8BF7\u5148\u9009\u62E9\u81F3\u5C11\u4E00\u4E2A\u4F1A\u8BDD\u3002"));return}let s=0,g=0;if(t==="watch_add"){let I=new Map;try{I=await this.#gA(a)}catch(d){this.#w.warn?.("[dsh-feishu] batch watch validation failed:",d.message)}for(let d of r){let B=I.get(d);if(!B){g+=1;continue}let f=await this.#Ee(i,o,d,{notify:!1,validatedTarget:B});f.changed?s+=1:f.ok||(g+=1)}}else for(let I of r){let d=await this.#Ce(i,o,I,{notify:!1});d.changed?s+=1:d.ok||(g+=1)}let c=s>0&&g>0?t==="watch_add"?D("\u5DF2\u6279\u91CF\u5173\u6CE8 {count} \u4E2A\u4F1A\u8BDD\uFF0C\u53E6\u6709 {failed} \u4E2A\u672A\u6210\u529F\u3002",{count:s,failed:g}):D("\u5DF2\u53D6\u6D88\u5173\u6CE8 {count} \u4E2A\u4F1A\u8BDD\uFF0C\u53E6\u6709 {failed} \u4E2A\u672A\u6210\u529F\u3002",{count:s,failed:g}):s>0?t==="watch_add"?D("\u5DF2\u6279\u91CF\u5173\u6CE8 {count} \u4E2A\u4F1A\u8BDD\u3002",{count:s}):D("\u5DF2\u53D6\u6D88\u5173\u6CE8 {count} \u4E2A\u4F1A\u8BDD\u3002",{count:s}):g>0?D("\u6240\u9009\u4F1A\u8BDD\u5747\u672A\u5904\u7406\u6210\u529F\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"):t==="watch_add"?D("\u6240\u9009\u4F1A\u8BDD\u5DF2\u5728\u5173\u6CE8\u5217\u8868\u4E2D\u3002"):D("\u6240\u9009\u4F1A\u8BDD\u5DF2\u4E0D\u5728\u5173\u6CE8\u5217\u8868\u4E2D\u3002");try{await this.#ue(i,o,{updateMessageId:e})}catch(I){this.#w.warn?.("[dsh-feishu] watch list refresh failed:",I.message)}await this.#O(o,c).catch(I=>{this.#w.warn?.("[dsh-feishu] watch batch summary failed:",I.message)});return}if(t==="new"){if(this.#a.has(i)||this.#ae(i)){await this.#O(o,D("\u5F53\u524D\u4EFB\u52A1\u4ECD\u5728\u8FD0\u884C\uFF0C\u8BF7\u5148\u505C\u6B62\u4EFB\u52A1\u6216\u7B49\u5F85\u4EFB\u52A1\u5B8C\u6210\u540E\u518D\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002"));return}await this.#r.clearSession(i),await this.#O(o,D("\u5DF2\u5F00\u542F\u5168\u65B0 Harness \u4F1A\u8BDD\u3002")),await this.#Z(i,o,{updateMessageId:e});return}if(t==="use:current"){let s=this.#r.sessionFor(i);if(typeof s!="string"||!s){await this.#O(o,D("\u5F53\u524D\u6CA1\u6709\u7ED1\u5B9A\u7684\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u4ECE\u4F1A\u8BDD\u5217\u8868\u9009\u62E9\u3002"));return}await this.#O(o,D("\u5DF2\u5C31\u7EEA\uFF0C\u76F4\u63A5\u53D1\u6D88\u606F\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002"));return}if(t==="archive_toggle"||t==="archive:on"||t==="archive:off"){let s=t==="archive:on"?!0:t==="archive:off"?!1:!(this.#r?.includesArchivedSessions?.()??!1);await this.#r?.setIncludeArchivedSessions?.(s),await this.#O(o,s?D("\u5DF2\u5F00\u542F\uFF1A\u4F1A\u8BDD\u5217\u8868\u5305\u542B\u5F52\u6863\u4F1A\u8BDD\u3002"):D("\u5DF2\u5173\u95ED\uFF1A\u4F1A\u8BDD\u5217\u8868\u9690\u85CF\u5F52\u6863\u4F1A\u8BDD\u3002")),await this.#Z(i,o,{updateMessageId:e});return}if(t==="repair"){await this.#O(o,D("\u4FEE\u590D\u9700\u5728\u79C1\u804A\u4E2D\u9A8C\u8BC1\u63A5\u5165\u8005\u8EAB\u4EFD\uFF0C\u8BF7\u76F4\u63A5\u53D1\u9001 /repair \u5F00\u59CB\u3002"));return}if(t==="compact"){await this.#tA(i,o);return}if(t==="stop"){await this.#rA(i,o);return}if(t==="steer"){await this.#aA(i,o,{updateMessageId:e});return}if(t.startsWith("steer:")){let s=t.slice(6);if(s==="custom"){await this.#W(o,Qv(),{key:i,updateMessageId:e});return}await this.#de({key:i,chatId:o},s);return}if(t==="presets"){await this.#Ze(i,o,{updateMessageId:e});return}if(t==="models"){await this.#Xe(i,o,{updateMessageId:e});return}if(t==="status"){await this.#eA(i,o,{updateMessageId:e});return}if(t==="help"){await this.#AA(i,o,{updateMessageId:e});return}if(t==="back_to_menu"){await this.#Z(i,o,{updateMessageId:e});return}if(t==="preset_default"){await this.#Te(i,o,{updateMessageId:e});return}if(t.startsWith("preset:select:")){let s=t.slice(14);if(s===Bm){await this.#Te(i,o,{updateMessageId:e});return}await this.#iA(i,o,s,{updateMessageId:e});return}if(t.startsWith("model:select:")){let s=t.slice(13);await this.#oA(i,o,s,{updateMessageId:e});return}if(t.startsWith("use:")){await this.#Ve(i,o,t.slice(4),{updateMessageId:e});return}if(t.startsWith("workspace:")){await this.#We(i,o,t.slice(10),{updateMessageId:e});return}if(t.startsWith("unwatch:")){(await this.#Ce(i,o,t.slice(8))).ok&&e&&await this.#ce({chatId:o,key:i},a,A,{updateMessageId:e});return}if(t.startsWith("watch:")){let s=t.slice(6);(await this.#Ee(i,o,s,{workspaceHint:a})).ok&&e&&await this.#ce({chatId:o,key:i},a,A,{updateMessageId:e})}}#oe(t,o){if(this.#Y.size>=kNe){let i=this.#Y.keys().next().value;i!==void 0&&this.#Y.delete(i)}this.#Y.delete(t),this.#Y.set(t,{...o,expiresAt:Date.now()+RNe})}#qe(t){let o=this.#Y.get(t);return o?o.expiresAto.archived!==!0):t}async#ce({chatId:t,key:o},i,e=0,{updateMessageId:a=null}={}){try{let A=this.#V(),r=await fM(i??"",this.#t,{signal:A});if(r.error){await this.#O(t,r.error);return}let s=await this.#t.listWorkspaceSessions(r.workspace,{signal:A}),g=this.#ne(Array.isArray(s?.sessions)?s.sessions:[]),c=s?.workspace??r.workspace;if(g.length===0){await this.#O(t,D(`\u5DE5\u4F5C\u533A\uFF1A{workspace} \u8BE5\u5DE5\u4F5C\u533A\u6682\u65E0\u4F1A\u8BDD\u3002`,{workspace:c}));return}let I=Math.ceil(g.length/dc),d=Number.isSafeInteger(e)&&e>0?Math.min(e,I-1):0,B=new Set((this.#r.watchEntries?.(o)??[]).map(Q=>Q.sessionId)),f=g.slice(d*dc,(d+1)*dc);this.#oe(o,{kind:"sessions",sessions:f.map(Q=>({...Q,watched:B.has(Q.sessionId)}))}),await this.#W(t,WV(c,g,d,g.length,B),{key:o,updateMessageId:a,sessionWorkspace:r.workspace,sessionPage:d})}catch(A){await this.#x(t,A,{logLabel:"session list"})}}async#Me({chatId:t,key:o},{updateMessageId:i=null}={}){try{let{current:e,paths:a}=await lE(this.#t,{signal:this.#V()});this.#oe(o,{kind:"workspaces",paths:a}),await this.#W(t,ZV(a,e),{key:o,updateMessageId:i})}catch(e){await this.#x(t,e,{logLabel:"workspace list"})}}async#Ve(t,o,i,{updateMessageId:e=null}={}){try{let a=await this.#t.bindWorkspaceSession(t,i),A=String(a?.title??"").replace(/\s+/gu," ").trim()||D("\u6682\u65E0\u6807\u9898");await this.#O(o,[D(`\u5DF2\u7ED1\u5B9A\u4F1A\u8BDD\u300C{title}\u300D @@ -382,7 +382,7 @@ ${s}`,r=[s]):(A=g,r.push(s))}return a.push({markdown:A,plain:a.length===0?A:r.jo ${c}`;d.length>i?(A.length>0&&a.push({markdown:A,plain:A}),A=c):A=d;return}r();let I=c;for(;I.length>i;){let d=qv(I,i),B=I.slice(0,d);a.push({markdown:B,plain:B}),I=I.slice(d)}A=I},g=c=>{let I=c;for(;I.length>i;){r();let d=qv(I,i),B=I.slice(0,d);a.push({markdown:B,plain:B}),I=I.slice(d)}s(I)};for(let c=0;cc.length>0||I.length>0)}function $Re(){let n=Date.now()%1e8,t=Math.floor(Math.random()*65536);return(n^t)%65536}function eke(n){return n instanceof URe&&n.httpStatus>=400&&n.httpStatus<500&&KRe.has(Number(n.bizCode))}function r6(n,t,o,i){return typeof n?.send=="function"?n.send({target:t,msgType:0,content:o,extra:{msg_seq:i}}):n.sendText(t,o)}async function o6(n,t,o,{logger:i}={}){let e=XRe(o),a=[],A=$Re(),r=t?.msgId?xRe[t.scope]:null,s=r!==null&&e.length>r,g=s?r-1:e.length,c=t?.msgId?{scope:t.scope,targetId:t.targetId}:t,I=!1,d=async()=>{if(!(I||!t?.msgId)){I=!0;try{a.push(await r6(n,t,YRe(),A+e.length&65535))}catch(B){i?.warn?.("[dsh-im:qq] unable to send partial reply notice:",B)}}};for(let[B,f]of e.entries()){let Q=A+B&65535,y=s&&B>=g?c:t;if(typeof n?.send=="function")try{a.push(await n.send({target:y,msgType:2,markdown:{content:f.markdown},extra:{msg_seq:Q}}));continue}catch(m){if(!eke(m)){if(i?.warn?.("[dsh-im:qq] markdown delivery outcome is uncertain; refusing a duplicate-prone retry:",m),a.length===0)throw m;await d();break}i?.warn?.("[dsh-im:qq] markdown delivery failed; retrying as plain text:",m)}if(f.plain.length!==0)try{a.push(await r6(n,y,f.plain,Q))}catch(m){if(a.length===0)throw m;await d();break}}return a}function iS(){return D("\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002")}var oS=12e4,Ake=Object.freeze([".myqcloud.com",".qpic.cn",".qq.com",".qq.com.cn",".tencentcos.com",".ugcimg.cn"]),tke=/\.(?:gif|jpe?g|png|webp)$/i;function rke(){return[D("QQ \u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002"),"",D("\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002"),D("/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"),D("/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"),D("/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09"),D("/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A"),D("/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84"),D("/sessionlist [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"),D("/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"),D("/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"),D("/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7"),D("/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7"),D("/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B"),D("\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]"),D("/presetlist \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset"),D("/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset"),D("\u7EAF\u6570\u5B57 ID\uFF1A/preset id:"),D("/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"),D("/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1"),D("/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"),D("/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09"),D("/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21"),D("/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21"),D("/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"),D("/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C"),D("/help \u663E\u793A\u672C\u5E2E\u52A9")].join(` +`);f.length<=i?s(f):(r(),a.push(...ZRe(B,i))),c=d;continue}g(e[c]),c+=1}return r(),a.filter(({markdown:c,plain:I})=>c.length>0||I.length>0)}function $Re(){let n=Date.now()%1e8,t=Math.floor(Math.random()*65536);return(n^t)%65536}function eke(n){return n instanceof URe&&n.httpStatus>=400&&n.httpStatus<500&&KRe.has(Number(n.bizCode))}function r6(n,t,o,i){return typeof n?.send=="function"?n.send({target:t,msgType:0,content:o,extra:{msg_seq:i}}):n.sendText(t,o)}async function o6(n,t,o,{logger:i}={}){let e=XRe(o),a=[],A=$Re(),r=t?.msgId?xRe[t.scope]:null,s=r!==null&&e.length>r,g=s?r-1:e.length,c=t?.msgId?{scope:t.scope,targetId:t.targetId}:t,I=!1,d=async()=>{if(!(I||!t?.msgId)){I=!0;try{a.push(await r6(n,t,YRe(),A+e.length&65535))}catch(B){i?.warn?.("[dsh-im:qq] unable to send partial reply notice:",B)}}};for(let[B,f]of e.entries()){let Q=A+B&65535,y=s&&B>=g?c:t;if(typeof n?.send=="function")try{a.push(await n.send({target:y,msgType:2,markdown:{content:f.markdown},extra:{msg_seq:Q}}));continue}catch(m){if(!eke(m)){if(i?.warn?.("[dsh-im:qq] markdown delivery outcome is uncertain; refusing a duplicate-prone retry:",m),a.length===0)throw m;await d();break}i?.warn?.("[dsh-im:qq] markdown delivery failed; retrying as plain text:",m)}if(f.plain.length!==0)try{a.push(await r6(n,y,f.plain,Q))}catch(m){if(a.length===0)throw m;await d();break}}return a}function iS(){return D("\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002")}var oS=12e4,Ake=Object.freeze([".myqcloud.com",".qpic.cn",".qq.com",".qq.com.cn",".tencentcos.com",".ugcimg.cn"]),tke=/\.(?:gif|jpe?g|png|webp)$/i;function rke(){return[D("QQ \u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002"),"",D("\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002"),D("/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"),D("/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"),D("/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09"),D("/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A"),D("/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84"),D("/sessionlist \u6216 /sessions [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"),D("/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"),D("/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"),D("/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7"),D("/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7"),D("/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B"),D("\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]"),D("/presetlist \u6216 /presets \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset"),D("/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset"),D("\u7EAF\u6570\u5B57 ID\uFF1A/preset id:"),D("/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"),D("/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1"),D("/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"),D("/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09"),D("/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21"),D("/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21"),D("/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"),D("/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C"),D("/help \u663E\u793A\u672C\u5E2E\u52A9")].join(` `)}function ake(n){return`${n.kind}:${n.kind==="group"?n.groupOpenid:n.senderId}`}function su(n){return typeof n?.content=="string"?n.content.trim():""}function s6(n){let t=Ao(n?.content_type??n?.contentType);return t?t.split(";",1)[0].trim().toLowerCase():null}function Wv(n){return s6(n)?.startsWith("image/")===!0||tke.test(Ao(n?.filename)??"")}function nu(n){return Array.isArray(n?.attachments)&&n.attachments.some(Wv)}function fd(n){return Array.isArray(n?.attachments)&&n.attachments.some(t=>!Wv(t))}async function ike(n,{fetchImpl:t,signal:o}){let i=n.startsWith("//")?`https:${n}`:n,e=await t(new URL(i),{method:"GET",signal:o,redirect:"follow"});if(!e?.ok)throw await e?.body?.cancel?.().catch?.(()=>{}),new Error(`QQ file download failed with HTTP ${e?.status??"unknown"}`);return Buffer.from(await e.arrayBuffer())}function n6(n,{fetchImpl:t=fetch}={}){if(typeof t!="function")throw new TypeError("fetchImpl must be a function");let o=[],i=[];for(let e of n?.attachments??[]){let a=Ao(e?.url),A=Ao(e?.filename)??void 0,r=s6(e),s=Number(e?.size);if(Wv(e)){o.push({...A?{name:A}:{},...r?.startsWith("image/")?{mediaType:r}:{},...Number.isFinite(s)&&s>=0?{size:s}:{},load:({signal:g,maxBytes:c})=>{if(!a)throw new Error("QQ image attachment has no download URL");return ho(a,{fetchImpl:t,signal:g,maxBytes:c,allowedHosts:Ake})}});continue}i.push({name:A??(i.length===0?"file":`file-${i.length+1}`),...r?.includes("/")?{mediaType:r}:{},...Number.isFinite(s)&&s>=0?{size:s}:{},load:({signal:g}={})=>{if(!a)throw new Error("QQ file attachment has no download URL");return ike(a,{fetchImpl:t,signal:g})}})}return{content:su(n),images:o,files:i}}function Ao(n){return typeof n=="string"&&n.trim()?n.trim():null}function oke(n,t){let o=String(n??D("\u7ED3\u679C\u6587\u4EF6")).replace(/[\r\n]+/g," ").trim()||D("\u7ED3\u679C\u6587\u4EF6");if(t?.name==="UploadDailyLimitExceededError")return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46 QQ \u4ECA\u65E5\u6587\u4EF6\u4E0A\u4F20\u989D\u5EA6\u5DF2\u7528\u5B8C\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o});switch(t?.code){case"artifact-delivery-uncertain":return D("\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:o});case"artifact-permission-required":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u5F53\u524D QQ \u673A\u5668\u4EBA\u6CA1\u6709\u6587\u4EF6\u6D88\u606F\u6743\u9650\u3002",{name:o});case"artifact-too-large":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u8D85\u8FC7\u5F53\u524D QQ \u673A\u5668\u4EBA\u53EF\u53D1\u9001\u7684\u6587\u4EF6\u5927\u5C0F\uFF0C\u672A\u53D1\u9001\u3002",{name:o});case"artifact-empty":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u4E3A\u7A7A\uFF0CQQ \u4E0D\u5141\u8BB8\u53D1\u9001\u7A7A\u6587\u4EF6\u3002",{name:o});case"artifact-changed":case"artifact-invalid":case"artifact-unavailable":return D("\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:o});case"artifact-rate-limited":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u6682\u65F6\u88AB QQ \u9650\u6D41\uFF0C\u672A\u80FD\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o});case"artifact-provider-rejected":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46 QQ \u62D2\u7EDD\u4E86\u8BE5\u6587\u4EF6\u6216\u6587\u4EF6\u6D88\u606F\u3002",{name:o});default:return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u6682\u65F6\u672A\u80FD\u901A\u8FC7 QQ \u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o})}}function nke(n,t){return typeof n=="string"&&n.trim()?n:t.length>0?D("\u7ED3\u679C\u6587\u4EF6\u5DF2\u751F\u6210\u3002"):n}function g6(n,{dispatched:t=!1}={}){if(n?.code?.startsWith?.("artifact-"))return n;if(n?.name==="UploadDailyLimitExceededError"){let e=new Error("QQ daily file upload limit exceeded",{cause:n});return e.name=n.name,e.code="artifact-rate-limited",e}let o=Number(n?.httpStatus),i=new Error("QQ file delivery failed",{cause:n});return o===401||o===403?i.code="artifact-permission-required":o===413?i.code="artifact-too-large":o===429?i.code="artifact-rate-limited":[400,404,405,406,410,415,422].includes(o)?i.code="artifact-provider-rejected":i.code=t?"artifact-delivery-uncertain":"artifact-provider-failed",i}function Zv(n){return n?.reason instanceof Error?n.reason:new DOMException("The operation was aborted","AbortError")}function c6(n,t){return t?(t.throwIfAborted(),new Promise((o,i)=>{let e=!1,a=(r,s)=>{e||(e=!0,t.removeEventListener("abort",A),r(s))},A=()=>a(i,Zv(t));t.addEventListener("abort",A,{once:!0}),Promise.resolve(n).then(r=>a(o,r),r=>a(i,r)),t.aborted&&A()})):n}async function ske(n,t,o,{signal:i,timeoutMs:e=oS}={}){if(i?.throwIfAborted(),typeof n?.sendImage!="function"){let a=new Error("QQ image delivery is unavailable");throw a.code="artifact-provider-unavailable",a}try{let a=AbortSignal.timeout(e),A=i?AbortSignal.any([i,a]):a,r=n.sendImage(t,{buffer:o.bytes},{onProgress:()=>i?.throwIfAborted()});return on(o,r),await c6(r,A)}catch(a){throw i?.aborted?Zv(i):g6(a,{dispatched:!0})}}async function gke(n,t,o,{signal:i,timeoutMs:e=oS}={}){if(i?.throwIfAborted(),typeof n?.sendFile!="function"){let a=new Error("QQ file delivery is unavailable");throw a.code="artifact-provider-unavailable",a}try{let a=AbortSignal.timeout(e),A=i?AbortSignal.any([i,a]):a,r=n.sendFile(t,{buffer:o.bytes},{fileName:o.fileName,onProgress:()=>i?.throwIfAborted()});return on(o,r),await c6(r,A)}catch(a){throw i?.aborted?Zv(i):g6(a,{dispatched:!0})}}function cke(n,t){return t.questions[t.index]&&Ao(n?.senderId)===t.actor&&(n.kind!=="group"||n.rawEventType==="GROUP_AT_MESSAGE_CREATE")&&!nu(n)&&!fd(n)&&Ao(su(n))}function Xv(){return{messagesReceived:0,messagesReplied:0,messagesRejected:0,artifactsSent:0,artifactSendErrors:0,lastMessageAt:null,lastReplyAt:null,lastRejectedAt:null,lastError:null,lastMessageError:null}}var nS=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l;#i;#I=new Map;#s=new Map;#p=new Map;#d=new Map;#h=new Set;#E=new Set;#C;#B=new Bi;constructor({bot:t,ownerUserOpenid:o,harness:i,state:e,contextEnhancement:a,status:A=Xv(),logger:r=console,replyTimeoutMs:s=6e5,signal:g,fetchImpl:c=fetch,fileUploadTimeoutMs:I=oS}){if(!t||typeof t.sendText!="function")throw new TypeError("QQ bot client is required");if(!o)throw new TypeError("QQ scanner identity is required");if(!i||!e)throw new TypeError("Harness client and state store are required");if(typeof c!="function")throw new TypeError("fetchImpl must be a function");if(!Number.isInteger(I)||I<1)throw new TypeError("fileUploadTimeoutMs must be a positive integer");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s,this.#g=g,this.#l=c,this.#i=Math.min(I,oS),this.#C=new pi({label:"qq",logger:r})}get status(){return structuredClone(this.#a)}accept(t){if(this.#g?.aborted)return Promise.resolve();let o=Ao(t?.messageId),i=Ao(t?.senderId);if(!o||!i||t?.senderIsBot===!0||!["c2c","group"].includes(t?.kind)||this.#r.hasSeen(o)||this.#d.has(o))return Promise.resolve();let e=ake(t);this.#d.set(o,Zr(this.#c,t.kind==="c2c"?"direct":"group")),t.kind==="c2c"&&(this.#A==="*"||i===this.#A)&&t.replyTarget?.scope==="c2c"&&Ao(t.replyTarget.targetId)===i&&lo(this.#r,t.replyTarget);let a=this.#s.get(e),A=su(t),r=this.#A==="*"||i===this.#A,s=t.kind!=="group"||t.rawEventType==="GROUP_AT_MESSAGE_CREATE",g=Qo(A),c=this.#B.status(e);if(g&&r&&s&&t.kind==="group")return this.#S(t,o,{message:Kn()});if(r&&t.kind==="c2c"&&(g||c.phase==="collecting")){let f=/^\/batch$/iu.test(A)&&c.phase==="idle"&&(this.#I.has(e)||a||this.#C.hasPending(e))?{handled:!0,kind:"busy",message:yo()}:this.#B.handle(e,A,{plainText:!!A&&!nu(t)&&!fd(t)});if(f.handled)return f.kind==="submit"?this.#u({...t,content:f.prompt,attachments:[]},o,e,{batchSubmission:f}):this.#S(t,o,f)}let I=Ei(A)?xi:fd(t)?null:Yi(A)?Ci:ji(A)?Ji:qi(A)?ui:null;if(I&&r&&s){let B;return B=this.#m(t,o,e,A,I).catch(f=>{if(f?.code==="turn-stopped"||this.#g?.aborted)return;this.#a.lastError=f?.message??String(f);let Q=At(this.#a,f);return this.#n.error?.(`[dsh-im:qq] failed to process a command [${Q.referenceId}]:`,f),this.#e.sendText(t.replyTarget,dt(Q)).catch(()=>{})}).finally(()=>{this.#d.delete(o),this.#E.delete(B)}),this.#E.add(B),B}let d=this.#C.claimReply({key:e,actor:i,messageId:o,text:nu(t)||fd(t)?"":su(t),addressed:t.kind!=="group"||t.rawEventType==="GROUP_AT_MESSAGE_CREATE",hasPendingQuestion:!!a,questionCompletion:a?.submitting||a?.claimedReplyMessageId?a.queue:null,isQuestionPending:()=>this.#s.has(e),send:B=>this.#e.sendText(t.replyTarget,B)});if(d){let B;return B=d.process(async()=>this.#r.hasSeen(o)?!1:(await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString(),!0)).finally(()=>{this.#d.delete(o),this.#h.delete(B)}),this.#h.add(B),B}if(a&&i!==a.actor)return this.#u(t,o,e);if(a?.submitting||a?.claimedReplyMessageId)return this.#u(t,o,e);if(a){cke(t,a)&&(a.claimedReplyMessageId=o);let f=(a.queue??Promise.resolve()).catch(()=>{}).then(()=>this.#f(t,o,e,a)).catch(Q=>this.#L(t,o,Q)).finally(()=>{this.#d.delete(o),a.claimedReplyMessageId===o&&(a.claimedReplyMessageId=null),a.queue===f&&(a.queue=null)});return a.queue=f,f}return this.#u(t,o,e)}#u(t,o,i,{releaseMessageId:e=!0,alreadyRecorded:a=!1,batchSubmission:A=null}={}){let r=this.#A==="*"||t.senderId===this.#A,s=t.kind!=="group"||t.rawEventType==="GROUP_AT_MESSAGE_CREATE",g=r&&s?gp(n6(t,{fetchImpl:this.#l}),{signal:this.#g}):void 0,I=(this.#I.get(i)??Promise.resolve()).catch(()=>{}).then(()=>this.#y(t,i,{alreadyRecorded:a,preparedMessage:g,batchSubmission:A})).finally(()=>{e&&this.#d.delete(o),this.#I.get(i)===I&&this.#I.delete(i)});return this.#I.set(i,I),I}async waitForIdle(){await Promise.allSettled([...this.#I.values(),...[...this.#s.values()].flatMap(t=>t.queue?[t.queue]:[]),...this.#h,...this.#E])}async#m(t,o,i,e,a){if(this.#g?.throwIfAborted(),this.#r.hasSeen(o))return;await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString();let A=await a(e,this.#t,this.#r,i,{signal:this.#g,isDirect:t.kind==="c2c",hasImages:nu(t),hasFiles:fd(t),pendingInteraction:this.#s.has(i)||this.#C.hasPending(i),control:{owner:this,key:i}});A?.stopped&&await Promise.allSettled([this.#_(i),this.#C.closeRoute(i)]);for(let r of A?.messages??[A?.message])r&&await this.#e.sendText(t.replyTarget,r);this.#a.lastError=null}#S(t,o,i){let e;return e=Promise.resolve().then(async()=>{this.#r.hasSeen(o)||(await this.#r.markSeen(o),this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString(),i.message&&await this.#e.sendText(t.replyTarget,i.message),this.#a.lastError=null)}).catch(async a=>{if(this.#g?.aborted)return;this.#a.lastError=a?.message??String(a);let A=At(this.#a,a);this.#n.error?.(`[dsh-im:qq] failed to process a batch input message [${A.referenceId}]:`,a),await this.#e.sendText(t.replyTarget,dt(A)).catch(()=>{})}).finally(()=>{this.#d.delete(o),this.#E.delete(e)}),this.#E.add(e),e}async#Q(t,o,i=[],e=null){if(i.length===0)return{receipt:e,failureNoticeVisible:!1,artifactSendErrors:0};let a=await Do({artifacts:i,baseReceipt:e,deliveryId:o,aggregatePresentation:e?"qq-text-and-files":"qq-files",alwaysMerge:!0,channelKey:"qq",signal:this.#g,sendImage:A=>ske(this.#e,t,A,{signal:this.#g,timeoutMs:this.#i}),sendFile:A=>gke(this.#e,t,A,{signal:this.#g,timeoutMs:this.#i}),onFailure:(A,r)=>At(this.#a,r,{userMessage:oke(A?.fileName,r),reason:r?.code}),sendFailureNotice:(A,r,s)=>this.#e.sendText(t,dt(s)),logger:this.#n});return this.#a.artifactsSent=(this.#a.artifactsSent??0)+a.artifactsSent,this.#a.artifactSendErrors=(this.#a.artifactSendErrors??0)+a.artifactSendErrors,{receipt:a.receipt,failureNoticeVisible:a.failureNoticeVisible,artifactSendErrors:a.artifactSendErrors}}async#y(t,o,{alreadyRecorded:i=!1,preparedMessage:e,batchSubmission:a=null}={}){if(this.#g?.aborted)return;let A=Ao(t?.messageId),r=Ao(t?.senderId);if(!A||!r||t.senderIsBot===!0||!["c2c","group"].includes(t.kind))return;if(!i){if(this.#r.hasSeen(A))return;this.#a.messagesReceived+=1,this.#a.lastMessageAt=new Date().toISOString()}let s=i,g=async()=>{s||(await this.#r.markSeen(A),s=!0)};if(this.#A!=="*"&&r!==this.#A){this.#a.messagesRejected+=1,this.#a.lastRejectedAt=new Date().toISOString();return}if(t.kind==="group"&&t.rawEventType!=="GROUP_AT_MESSAGE_CREATE")return;let c=t.replyTarget,I=e??n6(t,{fetchImpl:this.#l}),d=I.content,B=Vt(I),f=Ft(I),Q=null,y=a===null;try{if(!d&&!B&&!f){await this.#e.sendText(c,D("\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u548C\u6587\u4EF6\u6D88\u606F\u3002")),await g();return}let m=d.toLowerCase();if(!B&&!f&&m==="/help"){await this.#e.sendText(c,rke()),await g();return}if(!B&&!f&&m==="/status"){await this.#t.ensureRunning({signal:this.#g}),await this.#e.sendText(c,D("QQ \u673A\u5668\u4EBA\u4E0E DeepSeek Harness \u8FDE\u63A5\u6B63\u5E38\u3002")),await g();return}if(!B&&!f&&m==="/new"){await this.#r.clearSession(o),await this.#e.sendText(c,D("\u5DF2\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002\u8BF7\u53D1\u9001\u4F60\u7684\u95EE\u9898\u3002")),await g();return}let _=B||f?null:await uo(d,this.#t,o);if(_){for(let k of _.messages??[_.message])await this.#e.sendText(c,k);await g();return}let T=B||f?null:await hi(d,this.#t,this.#r,o,{signal:this.#g});if(T){await this.#e.sendText(c,T.message),await g();return}let R=B?await Eo(I,{signal:this.#g}):void 0,F=this.#d.get(A);F&&(R=fo(R??d,F,()=>({channel:"qq",senderId:r,senderName:t.kind==="group"?t.senderName:void 0})));let j=[],U,z=[];try{await g(),{answer:U,artifacts:z=[]}=await di({harness:this.#t,state:this.#r,key:o,...R!==void 0?{content:R}:{text:d},createOptions:{signal:this.#g},existsOptions:{signal:this.#g},askOptions:{timeoutMs:this.#o,signal:this.#g,control:{owner:this,key:o},progressMode:"all",onUpdate:k=>{if(k.error){let V=(Ao(k.toolName)??D("\u5DE5\u5177")).replace(/[\r\n]+/gu," ").slice(0,80);j.push(D("\u5DE5\u5177\u8C03\u7528\u300C{name}\u300D\u672A\u6210\u529F\uFF0C\u8BF7\u68C0\u67E5\u5DE5\u5177\u914D\u7F6E\u6216\u7A0D\u540E\u91CD\u8BD5\u3002",{name:V}))}},onInteraction:k=>this.#b(k,{key:o,actor:r,target:c,requiresMention:t.kind==="group"}),onInteractionResolved:k=>this.#R(k),files:I.files}}),a&&(this.#B.complete(o,a.token),y=!0)}finally{await Promise.allSettled([this.#_(o),this.#C.closeRoute(o)])}this.#g?.throwIfAborted();let q=nke(U,z),x=j.length>0?`${q} --- @@ -396,9 +396,9 @@ ${_}`:F),await g()}catch(F){this.#n.error?.("[dsh-im:qq] failed to send the safe `,{encoding:"utf8",mode:384}),await kke(A,this.#e),this.#A=a});return this.#t=i.then(()=>{},()=>{}),await i,o}};var Uke="https://slack.com/api/",pu="files.slack.com",Hke="slack.com",u6="/files-pri/",Kke=Object.freeze([pu]),xke="/upload/",Yke=12e4;function Is(n){return typeof n=="string"&&n.trim()?n.trim():null}function B6(n,t){let o=AbortSignal.timeout(t);return n?AbortSignal.any([n,o]):o}function Iu(n){return n?.reason instanceof Error?n.reason:new DOMException("The operation was aborted","AbortError")}function jke(n,t){if(!Number.isInteger(n)||n<1)throw new TypeError(`${t} must be a positive integer`);return n}function f6(n,t){return t?.providerCode!==void 0&&(n.providerCode=t.providerCode),Number.isInteger(t?.status)&&(n.status=t.status),n}function Al(n){let t="artifact-provider-failed",o="Slack file upload preparation failed";n?.code==="slack-file_upload_size_restricted"?(t="artifact-too-large",o="Slack rejected the result file because it is too large"):n?.code==="slack-missing-scope"?(t="artifact-permission-required",o="Slack file delivery requires the files:write scope"):n?.code?.startsWith?.("slack-")&&(t="artifact-provider-rejected",o="Slack rejected file upload preparation");let i=new Error(o,{cause:n});return i.code=t,f6(i,n)}function Jke(n){let t=new Error("Slack file completion result is uncertain",{cause:n});return t.code="artifact-delivery-uncertain",f6(t,n)}function qke(n){return Number.isInteger(n)&&n>=300&&n<400}async function nP(n){try{await n?.body?.cancel?.()}catch{}}function zke(n){let t=new URL(n);if(t.protocol!=="https:")throw new Error("Image download URL must use HTTPS");if(t.username||t.password||t.port&&t.port!=="443")throw new Error("Image download URL is not hosted by the messaging platform");if(t.hostname===Hke&&t.pathname.startsWith(u6)&&(t.hostname=pu),t.hostname!==pu||!t.pathname.startsWith(u6))throw new Error("Image download URL is not hosted by the messaging platform");return t.hash="",t}function Vke(n){let t=new URL(n);if(t.protocol!=="https:"||t.username||t.password||t.port&&t.port!=="443"||t.hostname!==pu||!t.pathname.startsWith(xke))throw new Error("Slack returned an unsafe file upload URL");return t.hash="",t}function Wke(n,t){let o=n?.headers?.get?.("location");if(!o)return null;try{return new URL(o,t)}catch{return null}}function Zke(n){let t=n?.headers?.get?.("x-oauth-scopes");return t==null?null:new Set(t.split(",").map(o=>o.trim()).filter(Boolean))}function Xke(n){return n?.protocol==="https:"&&!n.username&&!n.password&&(!n.port||n.port==="443")&&n.hostname.endsWith(".slack.com")&&n.hostname!==pu&&n.pathname==="/"&&n.searchParams.has("redir")}function $ke(n,t){return new Promise((o,i)=>{if(t?.aborted){i(t.reason??new DOMException("Aborted","AbortError"));return}let e=setTimeout(o,n);e?.unref?.(),t?.addEventListener("abort",()=>{clearTimeout(e),i(t.reason??new DOMException("Aborted","AbortError"))},{once:!0})})}function Bn(n,t){let o=Is(n);if(!o||!/^[A-Z][A-Z0-9]{4,30}$/i.test(o))throw new TypeError(`Invalid Slack ${t}`);return o}function cs(n,t){let o=Is(n);if(!o)throw new TypeError(`Slack ${t} is required`);return o}function lu(n,{trim:t=!0}={}){let o=typeof n=="string"?n:"",i=t?o.trim():o;if(!i)throw new TypeError("Slack message text is required");return i.replace(/<@([A-Z0-9]+)>/gi,"@$1").replace(/]*)?>/gi,"@$1")}function eve(n,t,o){let i=Is(t?.error)??"unknown_error",e=new Error(`Slack ${n} failed: ${i.replaceAll("_"," ")}`);return e.providerCode=i,["invalid_auth","not_authed","token_revoked","account_inactive"].includes(i)?e.code=o==="app"?"slack-invalid-app-token":"slack-invalid-bot-token":i==="missing_scope"?e.code="slack-missing-scope":i==="method_not_supported_for_channel_type"||i==="channel_type_not_supported"||i==="deprecated_endpoint"?e.code="slack-stream-unavailable":e.code=`slack-${i}`,e}function Q6(n){return typeof n=="string"&&/^xoxb-[A-Za-z0-9-]{16,}$/.test(n.trim())}function y6(n){return typeof n=="string"&&/^xapp-[A-Za-z0-9-]{16,}$/.test(n.trim())}var du=class{#e;#A;#t;#r;#c=null;#a;constructor({botToken:t,appToken:o,fetchImpl:i=fetch,baseUrl:e=Uke,fileUploadTimeoutMs:a=Yke}){if(t!==void 0&&!Q6(t))throw new TypeError("Slack Bot Token is invalid");if(o!==void 0&&!y6(o))throw new TypeError("Slack App Token is invalid");if(!t&&!o)throw new TypeError("SlackApi requires a token");if(typeof i!="function")throw new TypeError("SlackApi requires fetch");this.#e=t?.trim(),this.#A=o?.trim(),this.#t=i,this.#r=new URL(e),this.#a=jke(a,"fileUploadTimeoutMs")}authTest(t={}){return this.#o("auth.test",{...t,tokenKind:"bot"})}openConnection(t={}){return this.#o("apps.connections.open",{...t,tokenKind:"app",body:void 0})}async fileInfo({fileId:t,signal:o}={}){let i=await this.#o("files.info",{tokenKind:"bot",signal:o,body:{file:Bn(t,"file id")}});if(!i?.file||typeof i.file!="object"||Array.isArray(i.file))throw new Error("Slack files.info returned no file object");return i.file}postMessage({channelId:t,text:o,threadTs:i,signal:e}){return this.#o("chat.postMessage",{tokenKind:"bot",signal:e,body:{channel:Bn(t,"channel id"),text:lu(o),...i?{thread_ts:Is(i)}:{},mrkdwn:!0,link_names:!1,unfurl_links:!1,unfurl_media:!1}})}updateMessage({channelId:t,ts:o,text:i,signal:e}){return this.#o("chat.update",{tokenKind:"bot",signal:e,body:{channel:Bn(t,"channel id"),ts:cs(o,"message timestamp"),text:lu(i),parse:"none",link_names:!1}})}addReaction({channelId:t,messageTs:o,emojiName:i,signal:e,timeoutMs:a}){return this.#o("reactions.add",{tokenKind:"bot",signal:e,timeoutMs:a,retry:!1,body:{channel:Bn(t,"channel id"),timestamp:cs(o,"message timestamp"),name:cs(i,"reaction name")}})}removeReaction({channelId:t,messageTs:o,emojiName:i,signal:e,timeoutMs:a}){return this.#o("reactions.remove",{tokenKind:"bot",signal:e,timeoutMs:a,retry:!1,body:{channel:Bn(t,"channel id"),timestamp:cs(o,"message timestamp"),name:cs(i,"reaction name")}})}startStream({channelId:t,threadTs:o,recipientTeamId:i,recipientUserId:e,markdownText:a,signal:A}){return this.#o("chat.startStream",{tokenKind:"bot",signal:A,body:{channel:Bn(t,"channel id"),thread_ts:cs(o,"thread timestamp"),...i?{recipient_team_id:Bn(i,"team id")}:{},...e?{recipient_user_id:Bn(e,"user id")}:{},...Is(a)?{markdown_text:lu(a)}:{}}})}appendStream({channelId:t,ts:o,markdownText:i,signal:e}){return this.#o("chat.appendStream",{tokenKind:"bot",signal:e,body:{channel:Bn(t,"channel id"),ts:cs(o,"stream timestamp"),markdown_text:lu(i,{trim:!1})}})}stopStream({channelId:t,ts:o,markdownText:i,signal:e}){return this.#o("chat.stopStream",{tokenKind:"bot",signal:e,body:{channel:Bn(t,"channel id"),ts:cs(o,"stream timestamp"),...Is(i)?{markdown_text:lu(i,{trim:!1})}:{}}})}async uploadFile({channelId:t,threadTs:o,file:i,signal:e}){if(!i||typeof i!="object"||typeof i.fileName!="string"||!i.fileName||!Buffer.isBuffer(i.bytes))throw new TypeError("A Slack file is required");if(e?.aborted)throw Iu(e);let a=B6(e,this.#a),A;try{A=await this.#o("files.getUploadURLExternal",{tokenKind:"bot",signal:a,timeoutMs:this.#a,body:{filename:i.fileName,length:i.bytes.byteLength}})}catch(I){throw e?.aborted?Iu(e):Al(I)}let r,s;try{r=cs(A?.file_id,"file id"),s=Vke(A?.upload_url)}catch(I){throw Al(I)}let g;try{g=await this.#t(s,{method:"POST",headers:{"content-type":i.mediaType??"application/octet-stream"},body:i.bytes,signal:a,redirect:"error"})}catch(I){throw e?.aborted?Iu(e):Al(I)}if(!Number.isInteger(g?.status))throw Al(new Error("Slack file upload returned an invalid response"));if(g.status!==200){await nP(g);let I=new Error(`Slack file upload failed with HTTP ${g.status}`);throw I.status=g.status,g.status===413?I.code="artifact-too-large":g.status===429?I.code="artifact-rate-limited":I.code="artifact-provider-rejected",I}await nP(g);let c;try{c={files:[{id:r,title:i.fileName}],channel_id:Bn(t,"channel id"),...o?{thread_ts:cs(o,"thread timestamp")}:{}}}catch(I){throw Al(I)}if(a.aborted)throw e?.aborted?Iu(e):Al(a.reason);try{let I=await this.#o("files.completeUploadExternal",{tokenKind:"bot",signal:a,timeoutMs:this.#a,retry:!1,body:c});if(!Array.isArray(I?.files)||!I.files.some(d=>Is(d?.id)===r))throw new Error("Slack file completion did not confirm the uploaded file");return I}catch(I){throw e?.aborted?Iu(e):I?.code==="slack-missing-scope"?Al(I):Jke(I)}}async downloadFile({url:t,signal:o,maxBytes:i}){return this.#n({url:t,signal:o,maxBytes:i,stream:!1})}async downloadFileStream({url:t,signal:o}){return this.#n({url:t,signal:o,stream:!0})}async#n({url:t,signal:o,maxBytes:i,stream:e}){if(!this.#e)throw new TypeError("Slack bot token is required for file download");let a=zke(t),r={fetchImpl:async(s,g)=>{let c=await this.#t(s,g);if(!qke(c?.status))return c;let I=Wke(c,s);if(this.#c&&!this.#c.has("files:read")||Xke(I))throw await nP(c),new ut("slack-file-access-required","Slack redirected a private file request to the workspace because file access was not granted",D("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 c},headers:{authorization:`Bearer ${this.#e}`},signal:o,allowedHosts:Kke};return e?Cp(a,r):ho(a,{...r,maxBytes:i})}async#o(t,{tokenKind:o,body:i,signal:e,timeoutMs:a=15e3,retry:A=!0}){let r=o==="app"?this.#A:this.#e;if(!r)throw new TypeError(`Slack ${o} token is required for ${t}`);let s=t==="files.getUploadURLExternal"||t==="files.info",g;try{g=await this.#t(new URL(t,this.#r),{method:"POST",headers:{authorization:`Bearer ${r}`,"content-type":i===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)"},...i===void 0?{}:{body:s?new URLSearchParams(i).toString():JSON.stringify(i)},signal:B6(e,a),redirect:"error"})}catch(I){throw I?.name==="AbortError"||I?.name==="TimeoutError"?I:new Error(`Slack ${t} transport failed`)}if(o==="bot"){let I=Zke(g);I&&(this.#c=I)}let c;try{c=await g.json()}catch{throw new Error(`Slack ${t} returned invalid JSON`)}if(g.status===429&&A){let I=Number(g.headers.get("retry-after"))||1;return await $ke(Math.min(1e4,Math.max(100,I*1e3)),e),this.#o(t,{tokenKind:o,body:i,signal:e,timeoutMs:a,retry:!1})}if(!g.ok||c?.ok!==!0){let I=eve(t,c,o);throw I.status=g.status,I}return c}};async function m6({botToken:n,appToken:t},o={}){if(!Q6(n)){let r=new TypeError(D("Slack Bot Token \u5FC5\u987B\u4EE5 xoxb- \u5F00\u5934\u3002"));throw r.code="slack-invalid-bot-token",r}if(!y6(t)){let r=new TypeError(D("Slack App Token \u5FC5\u987B\u4EE5 xapp- \u5F00\u5934\u3002"));throw r.code="slack-invalid-app-token",r}let i=new du({botToken:n,appToken:t,...o}),[e,a]=await Promise.all([i.authTest(),i.openConnection()]);if(!e?.team_id||!e?.user_id||!e?.bot_id)throw new Error(D("Slack Bot Token \u6CA1\u6709\u8FD4\u56DE\u5B8C\u6574\u7684\u673A\u5668\u4EBA\u8EAB\u4EFD\u3002"));let A;try{A=new URL(a?.url)}catch{A=null}if(!A||A.protocol!=="wss:"){let r=new Error(D("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:Is(e.user)??"DeepSeek Harness",username:Is(e.user),teamId:String(e.team_id),teamName:Is(e.team)}}var sP=Object.freeze({key:"slack",label:"Slack",connectionLabel:" Socket Mode \u957F\u8FDE\u63A5",reactions:Object.freeze({processing:"eyes",success:"white_check_mark",error:"x"})}),dS=class extends zn{constructor(t){super({descriptor:sP,...t})}};function Cg(n){return typeof n=="string"&&n.trim()?n.trim():null}function hS(n,t){return Object.freeze({code:n,message:t})}var hu=class{#e;#A;#t;#r;#c;#a;#n=new Map;#o=new Map;#g=new Map;#l=0;#i=!1;constructor({credentials:t,configStore:o,inspectCredentials:i=m6,createRuntime:e,deleteState:a=async()=>{},logger:A=console}){if(!t||typeof t.resolve!="function"||typeof t.set!="function"||typeof t.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 i!="function"||typeof e!="function")throw new TypeError("Slack controller dependencies are incomplete");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A}async initialize(){if(this.#i)return this.status();for(let t of this.#A.list())await this.#h(t.botId,async()=>{if(this.#i||this.#n.get(t.botId)?.status?.ready)return;let o=await this.#p(t);if(!o){this.#o.set(t.botId,hS("missing-token",D("Slack\u673A\u5668\u4EBA\u51ED\u636E\u7F3A\u5931\uFF0C\u8BF7\u79FB\u9664\u540E\u91CD\u65B0\u63A5\u5165\u3002")));return}try{await this.#I(t,o),this.#o.delete(t.botId)}catch(i){this.#o.set(t.botId,hS("connection-failed",D("Slack Socket Mode \u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002"))),this.#a.warn?.(`[dsh-im:slack] bot ${t.botId} failed to initialize:`,i)}finally{this.#E()}});return this.status()}async bindCredentials({botToken:t,appToken:o}={}){if(this.#i)throw new Error("Slack controller is closed");let i=Cg(t),e=Cg(o);if(!i||!e)throw new TypeError("Slack Bot Token and App Token are required");let a=await this.#t({botToken:i,appToken:e}),A=Cg(a?.platformId),r=Cg(a?.name);if(!A||!r)throw new Error("Slack returned an invalid bot identity");let s=iP(A);return await this.#h(s.botId,async()=>{if(this.#i)throw new Error("Slack controller is closed");let g=this.#A.getByPlatformId(A),c=await this.#e.resolve(s.botTokenRef).catch(()=>{}),I=await this.#e.resolve(s.appTokenRef).catch(()=>{}),d={...s,platformId:A,name:r,username:Cg(a.username),teamId:Cg(a.teamId),teamName:Cg(a.teamName),createdAt:g?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()};try{await this.#e.set(s.botTokenRef,i),await this.#e.set(s.appTokenRef,e),await this.#A.save(d)}catch(B){throw await Promise.all([this.#d(s.botTokenRef,c),this.#d(s.appTokenRef,I)]),B}try{await this.#I(d,{botToken:i,appToken:e}),this.#o.delete(s.botId)}catch(B){this.#o.set(s.botId,hS("connection-failed",D("Slack\u673A\u5668\u4EBA\u5DF2\u63A5\u5165\uFF0CSocket Mode \u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002"))),this.#a.warn?.(`[dsh-im:slack] bot ${s.botId} credential connection failed:`,B)}this.#E()}),this.status()}async reconnectBot(t){let o=this.#A.get(t);if(!o)throw new Error("Unknown Slack bot");return await this.#h(t,async()=>{let i=await this.#p(o);if(!i)throw new Error("Slack bot credentials are missing");try{await this.#I(o,i),this.#o.delete(t)}catch(e){throw this.#o.set(t,hS("connection-failed",D("Slack Socket Mode \u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u68C0\u67E5\u4E24\u4E2A Token\u3002"))),e}finally{this.#E()}}),this.status()}async sendConnectionTest(t){let o=this.#A.get(t);if(!o)throw new Error("Unknown Slack bot");return this.#h(t,async()=>{let i=this.#n.get(t);if(!i?.status?.ready||typeof i.sendConnectionTest!="function"){let e=new Error(D("Slack\u673A\u5668\u4EBA\u5C1A\u672A\u8FDE\u63A5"));throw e.code="test-target-unavailable",e}return await i.sendConnectionTest(Oa(`${o.name}\uFF08${oP(o.platformId)}\uFF09`,D("Slack\u673A\u5668\u4EBA"))),{sent:!0}})}async deleteBot(t){let o=this.#A.get(t);if(!o)throw new Error("Unknown Slack bot");return await this.#h(t,async()=>{let i=await this.#e.resolve(o.botTokenRef).catch(()=>{}),e=await this.#e.resolve(o.appTokenRef).catch(()=>{});await this.#s(t);try{await this.#e.unset(o.botTokenRef),await this.#e.unset(o.appTokenRef),await this.#A.remove(t)}catch(a){throw await Promise.all([this.#d(o.botTokenRef,i),this.#d(o.appTokenRef,e)]),i?.value&&e?.value&&await this.#I(o,{botToken:i.value,appToken:e.value}).catch(()=>{}),new Error("Unable to remove the Slack bot safely.",{cause:a})}await this.#c({botId:t,config:o}).catch(a=>{this.#a.warn?.(`[dsh-im:slack] bot ${t} state cleanup failed:`,a)}),this.#o.delete(t),this.#E()}),this.status()}status(){let t=this.#A.list().map(i=>{let e=this.#n.get(i.botId)?.status??null,a=e?.ready===!0&&e.connectionState==="connected"&&e.harnessReachable===!0,A=a?"connected":e?.connectionState==="connecting"?"connecting":this.#o.has(i.botId)||e?.connectionState==="failed"?"error":"offline";return{botId:i.botId,state:A,connected:a,configured:!0,bot:{name:i.name,username:i.username,teamName:i.teamName,idMasked:oP(i.platformId)},health:{status:a?"healthy":A==="error"?"error":"offline",summary:a?D(`Slack${sP.connectionLabel}\u8FD0\u884C\u6B63\u5E38`):A==="error"?D("Slack\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5"):D("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:zr(e?.lastMessageError),error:structuredClone(this.#o.get(i.botId)??null)}}),o=t.filter(i=>i.connected).length;return{schemaVersion:1,revision:this.#l,state:t.length===0?"disconnected":o===t.length?"connected":o>0?"degraded":"offline",bots:t,totals:{configured:t.length,connected:o}}}async close(){this.#i||(this.#i=!0,await Promise.allSettled([...this.#g.values()]),await Promise.allSettled([...this.#n.keys()].map(t=>this.#s(t))))}async#I(t,{botToken:o,appToken:i}){if(this.#i)throw new Error("Slack controller is closed");if(await this.#s(t.botId),this.#i)throw new Error("Slack controller is closed");let e=await this.#r({botId:t.botId,config:t,botToken:o,appToken:i});if(!e||typeof e.start!="function"||typeof e.stop!="function")throw new TypeError("createRuntime returned an invalid Slack runtime");this.#n.set(t.botId,e);try{await e.start()}catch(a){throw await e.stop().catch(()=>{}),this.#n.delete(t.botId),a}}async#s(t){let o=this.#n.get(t);this.#n.delete(t),await o?.stop().catch(i=>{this.#a.warn?.(`[dsh-im:slack] bot ${t} failed to stop cleanly:`,i)})}async#p(t){let[o,i]=await Promise.all([this.#e.resolve(t.botTokenRef).catch(()=>{}),this.#e.resolve(t.appTokenRef).catch(()=>{})]),e=Cg(o?.value),a=Cg(i?.value);return e&&a?{botToken:e,appToken:a}:null}async#d(t,o){o?.value?await this.#e.set(t,o.value).catch(()=>{}):await this.#e.unset(t).catch(()=>{})}#h(t,o){let a=(this.#g.get(t)??Promise.resolve()).catch(()=>{}).then(o).finally(()=>{this.#g.get(t)===a&&this.#g.delete(t)});return this.#g.set(t,a),a}#E(){this.#l+=1}};var ES=class extends pr{constructor(t){super({...t,rpcIdPrefix:"slack",logPrefix:"dsh-slack"})}};var S6=Object.freeze([1e3,3e3,5e3,1e4,3e4]),cP=38e3,D6=11e3,O6=new Set(["image/jpeg","image/png","image/webp","image/gif"]);function gP(n,t,o){if(typeof n.addEventListener=="function")n.addEventListener(t,o);else if(typeof n.on=="function")n.on(t,o);else throw new TypeError("Slack WebSocket does not support events")}function Ave(n){let t=n?.data??n;return typeof t=="string"?t:Buffer.isBuffer(t)?t.toString("utf8"):t instanceof ArrayBuffer?Buffer.from(t).toString("utf8"):ArrayBuffer.isView(t)?Buffer.from(t.buffer,t.byteOffset,t.byteLength).toString("utf8"):null}function tve(n){let t=new URL(n);if(t.protocol!=="wss:")throw new Error("Slack returned an insecure Socket Mode URL");return t.href}function rve(n){return typeof n=="string"?n.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">"):""}function ave(n,t){return rve(n).replace(new RegExp(`<@${t}>`,"gi"),"").trim()}function IP(n){return typeof n?.url_private_download=="string"&&n.url_private_download?n.url_private_download:n?.url_private}function ive(n,t){let o=typeof n?.mimetype=="string"?n.mimetype.toLowerCase():"",i=IP(n);return!O6.has(o)||typeof i!="string"||!i?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=>t(i,e)}}function ove(n,t,o){let i=typeof n?.mimetype=="string"&&n.mimetype?n.mimetype.toLowerCase():void 0,e=IP(n);if(O6.has(i))return null;let a=n?.file_access==="check_file_info"&&typeof n?.id=="string"&&n.id;return(typeof e!="string"||!e)&&!a?null:{name:typeof n?.name=="string"&&n.name?n.name:typeof n?.title=="string"&&n.title?n.title:a?n.id:"slack-file",...i?{mediaType:i}:{},size:Number.isSafeInteger(n?.size)&&n.size>=0?n.size:void 0,load:async({signal:A}={})=>{if(!a)return t(e,{signal:A});let r=await o(n.id,{signal:A}),s=IP(r);if(typeof s!="string"||!s)throw new Error("Slack files.info returned no downloadable URL");let g=await t(s,{signal:A}),c=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(g)||g instanceof Uint8Array?{data:g,name:c,...I?{mediaType:I}:{}}:{...g,name:c,...I?{mediaType:I}:{}}}}}function nve(n,t,{loadFile:o=async()=>{throw new Error("Slack file downloader is unavailable")},loadFileStream:i=o,loadFileInfo:e=async()=>{throw new Error("Slack file metadata loader is unavailable")}}={}){let a=n?.event;if(!a||!n?.event_id||!a.channel||!a.user||!a.ts)return null;let A=a.type==="message"&&a.channel_type==="im",r=a.type==="app_mention";if(!A&&!r||a.subtype&&a.subtype!=="file_share"||a.bot_id||a.app_id)return null;let s=String(a.thread_ts??a.ts);return{messageId:String(n.event_id),senderId:String(a.user),senderIsBot:String(a.user)===String(t),kind:A?"direct":"group",conversationId:A?String(a.channel):`${a.channel}:${s}`,content:ave(a.text??"",t),plainText:!Array.isArray(a.files)||a.files.length===0,images:Array.isArray(a.files)?a.files.map(g=>ive(g,o)).filter(Boolean):[],files:Array.isArray(a.files)?a.files.map(g=>ove(g,i,e)).filter(Boolean):[],addressed:A||r,reactionTarget:{channelId:String(a.channel),messageTs:String(a.ts)},replyTarget:{channelId:String(a.channel),threadTs:s,recipientUserId:String(a.user),recipientTeamId:String(a.user_team??n.team_id??"")},connectionTestTarget:{channelId:String(a.channel)}}}function sve(n){if(typeof n!="string")return!1;let t="__DSH_IM_TOOL_NAME__",o=D("\u6B63\u5728\u4F7F\u7528{name}\u2026",{name:t}),i=o.indexOf(t);if(i<0)return!1;let e=o.slice(0,i),a=o.slice(i+t.length),A=n.trim();return A.startsWith(e)&&A.endsWith(a)&&A.length>e.length+a.length}async function w6(n,t,o,i,e){if(i)for(let a=0;a{let y=Vn(Q,cP)[0]??"";if(!y||!y.startsWith(A))return;let m=y.slice(A.length);m&&(await w6(n,t,a,m,o),A=y)},f=()=>{I||c||s!==null||g||!r||(s=setTimeout(()=>{s=null;let Q=r;r="",g=B(Q).catch(y=>{c=!0,i.warn?.("[dsh-im:slack] streaming append failed:",y)}).finally(()=>{g=null,f()})},350),s?.unref?.())};return{messageId:a,get providerMessageIds(){return[...d]},update(Q){I||c||typeof Q!="string"||!Q.trim()||sve(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 g?.catch(()=>{});let y=Vn(Q,cP),m=y[0]??D("\u5904\u7406\u5B8C\u6210\u3002");!c&&m.startsWith(A)?(await w6(n,t,a,m.slice(A.length),o),await n.stopStream({channelId:t.channelId,ts:a,signal:o})):(await n.stopStream({channelId:t.channelId,ts:a,signal:o}).catch(()=>{}),await n.updateMessage({channelId:t.channelId,ts:a,text:m,signal:o}));for(let _ of y.slice(1)){let T=await n.postMessage({channelId:t.channelId,threadTs:t.threadTs,text:_,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:t.channelId,ts:a,signal:o}).catch(()=>{})}}}var lP=class{#e;#A;#t;constructor({api:t,signal:o,logger:i}){this.#e=t,this.#A=o,this.#t=i}async sendText(t,o){let i=Vn(o,cP),e=[];for(let a of i){let A=await this.#e.postMessage({channelId:t.channelId,threadTs:t.threadTs,text:a,signal:this.#A});typeof A?.ts=="string"&&A.ts&&e.push(A.ts)}return{providerMessageIds:e}}async addReaction(t,o,{signal:i}={}){let e=String(o??"").trim();return await this.#e.addReaction({channelId:t.channelId,messageTs:t.messageTs,emojiName:e,signal:i??this.#A}),e}removeReaction(t,o,{signal:i}={}){return this.#e.removeReaction({channelId:t.channelId,messageTs:t.messageTs,emojiName:o,signal:i??this.#A})}openStream(t){return gve({api:this.#e,target:t,signal:this.#A,logger:this.#t})}sendFile(t,o){return this.#e.uploadFile({channelId:t.channelId,threadTs:t.threadTs,file:o,signal:this.#A})}};function cve(){return{startedAt:null,ready:!1,connectionState:"idle",harnessReachable:!1,lastCheckedAt:null,lastConnectedAt:null,lastError:null,...zi()}}var Eu=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l;#i;#I=cve();#s=null;#p=null;#d=null;#h=null;#E=null;#C=null;#B=0;#u=0;#m=!0;#S=null;constructor({config:t,botToken:o,appToken:i,harness:e,state:a,contextEnhancement:A,logger:r=console,replyTimeoutMs:s=6e5,connectTimeoutMs:g=2e4,createApi:c=d=>new du(d),createWebSocket:I=d=>new WebSocket(d)}){if(!t||!o||!i||!e||!a)throw new TypeError("SlackRuntime requires config, both tokens, Harness, and state");if(typeof I!="function")throw new TypeError("SlackRuntime requires WebSocket");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s,this.#g=g,this.#l=c,this.#i=I}get status(){return structuredClone(this.#I)}async sendConnectionTest(t){if(!this.#I.ready||!this.#p){let o=new Error("Slack bot is not connected");throw o.code="test-target-unavailable",o}return this.#p.sendConnectionTest(t)}async start(){return this.#I.ready&&this.#h?this.status:this.#S?this.#S:(this.#S=this.#Q().finally(()=>{this.#S=null}),this.#S)}async#Q(){await this.stop(),this.#m=!1,this.#B=0,this.#I.startedAt=new Date().toISOString(),this.#I.connectionState="connecting",this.#I.lastError=null,await this.#r.ensureRunning(),this.#I.harnessReachable=!0;let t=new AbortController;this.#d=t;let o=this.#l({botToken:this.#A,appToken:this.#t});this.#s=o;try{let i=await o.authTest({signal:t.signal});if(`${i?.team_id}:${i?.user_id}`!==this.#e.platformId)throw new Error("Slack Bot Token identity does not match the saved bot");let e=new lP({api:o,signal:t.signal,logger:this.#n});this.#p=new dS({bot:e,harness:this.#r,state:this.#c,contextEnhancement:this.#a,status:this.#I,logger:this.#n,replyTimeoutMs:this.#o,signal:t.signal});let a;try{await Promise.race([this.#y(),new Promise((A,r)=>{a=setTimeout(()=>r(new Error("Slack Socket Mode did not become ready in time")),this.#g),a?.unref?.()})])}finally{clearTimeout(a)}return this.status}catch(i){throw this.#I.ready=!1,this.#I.connectionState="failed",this.#I.lastError=i?.message??String(i),await this.stop(),i}}async#y(){if(this.#m)throw new Error("Slack runtime is stopped");let t=await this.#s.openConnection({signal:this.#d?.signal});return this.#f(t?.url)}#f(t){if(this.#m)return Promise.reject(new Error("Slack runtime is stopped"));let o=++this.#u,i=this.#i(tve(t));this.#h=i;let e=!1;return new Promise((a,A)=>{let r=s=>{if(e||o!==this.#u)return;e=!0,this.#E=s?.connection_info?.app_id??null,this.#B=0;let g=Date.now();this.#I.ready=!0,this.#I.connectionState="connected",this.#I.lastCheckedAt=g,this.#I.lastConnectedAt=g,this.#I.lastError=null,a()};gP(i,"message",s=>{if(o!==this.#u||this.#m)return;let g=Ave(s);if(!g)return;let c;try{c=JSON.parse(g)}catch{this.#n.warn?.("[dsh-im:slack] ignored malformed Socket Mode JSON");return}if(c.type==="hello"){r(c);return}if(c.envelope_id&&i.readyState===1&&(i.send(JSON.stringify({envelope_id:c.envelope_id})),this.#I.lastCheckedAt=Date.now()),c.type==="disconnect"){i.close(4e3,"Slack requested reconnect");return}if(c.type!=="events_api"||c.payload?.type!=="event_callback"||this.#E&&c.payload.api_app_id&&c.payload.api_app_id!==this.#E)return;let I=nve(c.payload,this.#e.platformId.split(":")[1],{loadFile:(B,f)=>this.#s.downloadFile({url:B,...f}),loadFileStream:(B,f)=>this.#s.downloadFileStream({url:B,...f}),loadFileInfo:(B,f)=>this.#s.fileInfo({fileId:B,...f})}),d=this.#p;I&&d&&d.accept(I).catch(B=>{o!==this.#u||this.#m||this.#n.error?.(`[dsh-im:slack] bot ${this.#e.botId} message handling failed:`,B)})}),gP(i,"close",(s={})=>{if(o!==this.#u)return;if(this.#h===i&&(this.#h=null),this.#m){e||A(new DOMException("Stopped","AbortError"));return}let g=Number(s.code)||0,c=new Error(`Slack Socket Mode closed (${g||"unknown"})`);this.#I.ready=!1,this.#I.connectionState="connecting",this.#I.lastError=c.message,e||(e=!0,A(c)),this.#b()}),gP(i,"error",()=>{o!==this.#u||this.#m||(this.#I.lastError="Slack Socket Mode WebSocket error")})})}#b(){if(this.#m||this.#C!==null)return;let t=S6[Math.min(this.#B,S6.length-1)];this.#B+=1,this.#C=setTimeout(()=>{this.#C=null,this.#y().catch(o=>{this.#m||(this.#n.warn?.("[dsh-im:slack] Socket Mode reconnect failed:",o),this.#b())})},t),this.#C?.unref?.()}async stop(){this.#m=!0,this.#u+=1,this.#d?.abort(),this.#d=null,this.#C!==null&&clearTimeout(this.#C),this.#C=null;let t=this.#h,o=this.#p;this.#h=null,this.#p=null,this.#s=null,this.#E=null;try{t&&t.readyState<2&&t.close(1e3,"Plugin stopped")}catch(i){this.#n.warn?.(`[dsh-im:slack] bot ${this.#e.botId} failed to close Socket Mode:`,i)}return await Promise.race([o?.waitForIdle()??Promise.resolve(),new Promise(i=>setTimeout(i,2e3))]),this.#I.ready=!1,this.#I.connectionState="idle",this.status}};var CS=class extends Wn{};async function pP(n,t={},o={}){if(!n?.credentials)throw new TypeError("dsh-im slack requires ctx.credentials");let i=ea(n,t),e=o.ConfigStore??pS,a=o.StateStore??CS,A=o.HarnessClient??ES,r=o.Controller??hu,s=o.Runtime??Eu,g=o.createConnectionSupervisor??up,c=typeof n.logger=="function"?n.logger("dsh-im:slack"):n.logger??console,I=()=>Na(n),d=s_(t,"slack"),B=await new e(d.config).load(),f=b6(t.workspace??process.cwd()),Q=o.WorkspaceStore??$r,y=o.workspaces??await new Q(d.workspaces,{defaultWorkspace:f}).load(),m=B.list();await y.reconcile(m.map(N=>N.botId)),await Promise.all(m.map(N=>y.ensure(N.botId,{defaultAgentPreset:t.agentPreset})));let _=typeof B.remove=="function"?Pa(B,{workspaces:y}):B,T=new Map,R=N=>b6(d.bots,N,"state.json"),F=async N=>{let k=T.get(N);return k||(k=await new a(R(N)).load(),T.set(N,k)),k},j=La(n,o.commandExecutor),{controlExecutor:U,sessionMaintenanceExecutor:z,fileIngressExecutor:q}=Ua(n,{controlExecutor:o.controlExecutor,sessionMaintenanceExecutor:o.sessionMaintenanceExecutor,fileIngressExecutor:o.fileIngressExecutor}),x=new A({...i,workspace:f,autostart:!1,dshBin:t.dshBin??"dsh",...j?{commandExecutor:j}:{},...U?{controlExecutor:U}:{},...z?{sessionMaintenanceExecutor:z}:{},...q?{fileIngressExecutor:q}:{}}),G=new r({credentials:n.credentials,configStore:_,logger:c,...o.inspectCredentials?{inspectCredentials:o.inspectCredentials}:{},createRuntime:async({botId:N,config:k,botToken:V,appToken:te})=>{let ie=await F(N);await y.ensure(N,{defaultAgentPreset:t.agentPreset});let we=Ga(x,{botId:N,workspaces:y,state:ie,agentPresetCatalog:I});return new s({config:k,botToken:V,appToken:te,harness:we.harness,state:we.state,contextEnhancement:{botId:N,getSettings:()=>y.contextEnhancementFor(N)},replyTimeoutMs:t.replyTimeoutMs??6e5,connectTimeoutMs:t.connectTimeoutMs??2e4,logger:{error:(...se)=>c.error?.(`[${N}]`,...se),warn:(...se)=>c.warn?.(`[${N}]`,...se),info:(...se)=>c.info?.(`[${N}]`,...se),debug:(...se)=>c.debug?.(`[${N}]`,...se)}})},deleteState:async({botId:N})=>{let k=T.get(N);if(T.delete(N),k&&typeof k.remove=="function")await k.remove();else try{await Ive(R(N))}catch(V){if(V?.code!=="ENOENT")throw V}}}),J=Fa(G,{workspaces:y,stateFor:F,agentPresetCatalog:I}),H=g({channel:"slack",controller:J,harness:x,logger:c,retryDelaysMs:t.retryDelaysMs,healthyIntervalMs:t.healthyIntervalMs}).start();return{controller:J,ready:H.ready,async close(){await H.close(),await J.close(),x.stopManagedProcess()}}}var _6="/slack",ei=Object.freeze({status:"connection.status",bindCredentials:"bot.bind-credentials",reconnectBot:"bot.reconnect",deleteBot:"bot.delete",setWorkspace:yi,setAgentPreset:mi,setContextEnhancement:Qi}),T6=Object.freeze(Object.values(ei)),lve=new Set(["token","botToken","appToken","botTokenRef","appTokenRef","tokenRef","platformId","secret","secretRef"]);function hP(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function uS(n,t){return hP(n)&&Object.keys(n).every(o=>t.includes(o))}function M6(n){return typeof n=="string"&&/^slack_[a-f0-9]{24}$/.test(n)}function pve(n){return typeof n=="string"&&/^xoxb-[A-Za-z0-9-]{16,}$/.test(n.trim())&&n.length<=4096}function dve(n){return typeof n=="string"&&/^xapp-[A-Za-z0-9-]{16,}$/.test(n.trim())&&n.length<=4096}function hve(n,t){return hP(t)?n===ei.status?uS(t,[])?null:"connection.status does not accept fields.":n===ei.bindCredentials?uS(t,["botToken","appToken"])&&pve(t.botToken)&&dve(t.appToken)?null:"bot.bind-credentials requires xoxb Bot Token and xapp App Token.":n===ei.reconnectBot?uS(t,["botId","sendTest"])&&M6(t.botId)&&(t.sendTest===void 0||typeof t.sendTest=="boolean")?null:"bot.reconnect requires a botId.":n===ei.deleteBot?uS(t,["botId","confirm"])&&M6(t.botId)&&t.confirm===!0?null:"bot.delete requires a botId and confirm=true.":n===ei.setWorkspace?Ka(t)?null:"\u8BF7\u8F93\u5165\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84\u3002":n===ei.setAgentPreset?Ya(t)?null:"\u8BF7\u9009\u62E9 Agent Preset\u3002":n===ei.setContextEnhancement?Ha(t)?null:"\u8BF7\u63D0\u4EA4\u6709\u6548\u7684\u4E0A\u4E0B\u6587\u589E\u5F3A\u8BBE\u7F6E\u3002":"Unknown Slack endpoint.":"Payload must be an object."}function dP(n){if(Array.isArray(n))return n.map(dP);if(!hP(n))return n;let t={};for(let[o,i]of Object.entries(n))lve.has(o)||(t[o]=dP(i));return t}function Eve(n){let t=xa(n);return t||(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 N6(n){for(let t of["status","bindCredentials","reconnectBot","deleteBot"])if(typeof n?.[t]!="function")throw new TypeError(`A complete Slack controller is required (${t})`);return async(t,o,i)=>{if(i?.aborted)return{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}};if(!T6.includes(t))return{ok:!1,error:{code:"bad-request",message:"Unknown Slack endpoint."}};let e=hve(t,o);if(e)return{ok:!1,error:{code:"bad-request",message:e}};try{let a;if(t===ei.status)a=await n.status();else if(t===ei.bindCredentials)a=await n.bindCredentials(o);else if(t===ei.reconnectBot){if(a=await n.reconnectBot(o.botId),i?.aborted)return{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}};if(o.sendTest===!0){let A=null;try{if(a?.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){A=r}a={...a,testMessage:ir(A)}}}else if(t===ei.setWorkspace){if(typeof n.updateWorkspace!="function")throw new Error("Workspace update is unavailable");a=await n.updateWorkspace(o.botId,o.workspace)}else if(t===ei.setContextEnhancement){if(typeof n.updateContextEnhancement!="function")throw new Error("Context enhancement update is unavailable");a=await n.updateContextEnhancement(o.botId,o.config)}else if(t===ei.setAgentPreset){if(typeof n.updateAgentPreset!="function")throw new Error("Agent preset update is unavailable");a=await n.updateAgentPreset(o.botId,o.agentPreset)}else a=await n.deleteBot(o.botId);return i?.aborted?{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}:{ok:!0,value:dP(a)}}catch(a){return i?.aborted?{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}:{ok:!1,error:Eve(a)}}}}function BS(n,t,o){if(!n?.connection?.rpc||typeof n.connection.rpc.handle!="function")throw new TypeError("DSH Host Connection RPC is required");return n.connection.rpc.handle(_6,N6(t),{authority:Or(o)})}async function R6(n,t={}){if(t?.controller)return BS(n,t.controller,t.rpcAuthority);let o=await pP(n,t,t.internals??{}),i=BS(n,o.controller,t.rpcAuthority);return n.effect(()=>async()=>o.close(),"dsh-im: close Slack bot connections"),i}var k6=Object.freeze({botPrefix:"telegram",tokenRefPrefix:"DSH_TELEGRAM_BOT_TOKEN"}),Cu=Object.freeze({compatible:"compatible",privateAllowlist:"private-allowlist"}),Cve=/^[1-9]\d{0,15}$/;function v6(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 t=n.map(o=>{let i=typeof o=="number"&&Number.isSafeInteger(o)?String(o):typeof o=="string"?o.trim():"";if(!Cve.test(i))throw new TypeError("allowedUsers contains an invalid Telegram User ID");return i});return Object.freeze([...new Set(t)])}function uc(n={}){if(!n||typeof n!="object"||Array.isArray(n))throw new TypeError("Telegram access policy must be an object");let t=n.accessMode??Cu.compatible;if(!Object.values(Cu).includes(t))throw new TypeError("Telegram accessMode must be compatible or private-allowlist");return Object.freeze({accessMode:t,allowedUsers:v6(n.allowedUsers)})}function uve(n){let t=Object.hasOwn(n,"accessMode"),o=Object.hasOwn(n,"allowedUsers");if(!t&&!o)return{};try{let i=uc(n);return{...t?{accessMode:i.accessMode}:{},...o||t?{allowedUsers:i.allowedUsers}:{}}}catch{return null}}function P6(n){return mE(n,k6)}function G6(n){return nQ(n,D("Telegram\u673A\u5668\u4EBA"))}var fS=class extends hp{constructor(t){super(t,{channel:"Telegram",...k6,normalizeBotExtension:uve})}async save(t){let o=t?.platformId?this.getByPlatformId(String(t.platformId)):null;return super.save({...o,...t})}};var QS=class extends pr{constructor(t){super({...t,rpcIdPrefix:"telegram",logPrefix:"dsh-telegram"})}};var Bve="https://api.telegram.org/",F6=Object.freeze(["api.telegram.org"]),fve=12e4;function ug(n){return typeof n=="string"&&n.trim()?n.trim():null}function L6(n,t){let o=AbortSignal.timeout(t);return n?AbortSignal.any([n,o]):o}function EP(n){return n?.reason instanceof Error?n.reason:new DOMException("The operation was aborted","AbortError")}function Qve(n,t){if(!Number.isInteger(n)||n<1)throw new TypeError(`${t} must be a positive integer`);return n}function H6(n,t){return t?.providerCode!==void 0&&(n.providerCode=t.providerCode),t?.retry_after!==void 0&&(n.retry_after=t.retry_after,n.retryAfter=t.retry_after),Number.isInteger(t?.status)&&(n.status=t.status),n}function CP(n){if(!n||typeof n!="object"||Array.isArray(n))throw new TypeError("A Telegram rich message is required");let t=["markdown","html","blocks"].filter(i=>n[i]!==void 0);if(t.length!==1)throw new TypeError("A Telegram rich message requires exactly one format");let o=t[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 yve(n,t="document"){let o=Number(n?.providerCode),i=Number(n?.status),e=ug(n?.message)??"",a="artifact-provider-rejected",A=`Telegram rejected the ${t}.`;o===401||o===403||i===401||i===403?(a="artifact-permission-required",A=`Telegram denied permission to send the ${t}.`):o===413||i===413||/(?:file|request|entity).{0,20}(?:too (?:big|large)|size limit)|too (?:big|large)/i.test(e)?(a="artifact-too-large",A=`The ${t} exceeds Telegram's size limit.`):o===429||i===429?(a="artifact-rate-limited",A=`Telegram rate-limited ${t} delivery.`):(o>=500||i>=500)&&(a="artifact-delivery-uncertain",A=`Telegram ${t} delivery result is uncertain.`);let r=new Error(A,{cause:n});return r.code=a,H6(r,n)}function U6(n,t="document"){let o=new Error(`Telegram ${t} delivery result is uncertain`,{cause:n});return o.code="artifact-delivery-uncertain",H6(o,n)}function mve(n){return typeof n=="string"&&/^\d{5,20}:[A-Za-z0-9_-]{20,}$/.test(n.trim())}var Sve=/^[a-z0-9_]{1,32}$/;function Dve(n){return!!n&&typeof n=="object"&&!Array.isArray(n)&&typeof n.command=="string"&&Sve.test(n.command)&&typeof n.description=="string"&&n.description.length>=1&&n.description.length<=256}var uP=Object.freeze({type:"commands"}),uu=class{#e;#A;#t;#r;constructor({token:t,fetchImpl:o=fetch,baseUrl:i=Bve,fileUploadTimeoutMs:e=fve}){if(!mve(t))throw new TypeError("Telegram Bot Token is invalid");if(typeof o!="function")throw new TypeError("TelegramApi requires fetch");this.#e=t.trim(),this.#A=o,this.#t=new URL(i),this.#r=Qve(e,"fileUploadTimeoutMs")}async getMe(t={}){return this.#n("getMe",{},t)}async getWebhookInfo(t={}){return this.#n("getWebhookInfo",{},t)}async getUpdates({offset:t,timeout:o=25,signal:i}={}){let e={timeout:o,limit:100,allowed_updates:["message"],...Number.isSafeInteger(t)?{offset:t}:{}};return this.#n("getUpdates",e,{signal:i,timeoutMs:Math.max(1e4,(o+10)*1e3)})}async getFile({fileId:t,signal:o}={}){let i=ug(t);if(!i||!/^[A-Za-z0-9_-]{1,512}$/.test(i))throw new TypeError("Telegram file id is invalid");return this.#n("getFile",{file_id:i},{signal:o})}async downloadFile({fileId:t,signal:o,maxBytes:i}={}){let e=await this.#c(t,o);return ho(e,{fetchImpl:this.#A,signal:o,maxBytes:i,allowedHosts:F6})}async downloadFileStream({fileId:t,signal:o}={}){let i=await this.#c(t,o);return Cp(i,{fetchImpl:this.#A,signal:o,allowedHosts:F6})}async#c(t,o){let i=await this.getFile({fileId:t,signal:o}),e=ug(i?.file_path);if(!e||e.startsWith("/")||e.includes("\\")||e.includes("?")||e.includes("#"))throw new Error("Telegram returned an invalid file path");let a;try{a=e.split("/").map(r=>decodeURIComponent(r))}catch{throw new Error("Telegram returned an invalid file path")}if(a.some(r=>!r||r==="."||r===".."))throw new Error("Telegram returned an invalid file path");let A=new URL(this.#t);return A.pathname=`/file/bot${this.#e}/${e}`,A}async sendMessage({chatId:t,text:o,replyToMessageId:i,messageThreadId:e,signal:a}){return this.#n("sendMessage",{chat_id:t,text:o,link_preview_options:{is_disabled:!0},...i?{reply_parameters:{message_id:i,allow_sending_without_reply:!0}}:{},...e?{message_thread_id:e}:{}},{signal:a})}async setMessageReaction({chatId:t,messageId:o,emoji:i,signal:e,timeoutMs:a}){let A=ug(i);return this.#n("setMessageReaction",{chat_id:t,message_id:o,reaction:A?[{type:"emoji",emoji:A}]:[]},{signal:e,timeoutMs:a})}async sendRichMessage({chatId:t,richMessage:o,replyToMessageId:i,messageThreadId:e,signal:a}){return this.#n("sendRichMessage",{chat_id:t,rich_message:CP(o),...i?{reply_parameters:{message_id:i,allow_sending_without_reply:!0}}:{},...e?{message_thread_id:e}:{}},{signal:a})}async sendRichMessageDraft({chatId:t,draftId:o,richMessage:i,messageThreadId:e,signal:a}){if(!Number.isSafeInteger(o)||o===0)throw new TypeError("Telegram rich message draft id must be a non-zero integer");return this.#n("sendRichMessageDraft",{chat_id:t,draft_id:o,rich_message:CP(i),...e?{message_thread_id:e}:{}},{signal:a})}async sendDocument({chatId:t,file:o,replyToMessageId:i,messageThreadId:e,signal:a}){return this.#a("sendDocument","document","document",{chatId:t,file:o,replyToMessageId:i,messageThreadId:e,signal:a})}async sendPhoto({chatId:t,file:o,replyToMessageId:i,messageThreadId:e,signal:a}){return this.#a("sendPhoto","photo","photo",{chatId:t,file:o,replyToMessageId:i,messageThreadId:e,signal:a})}async#a(t,o,i,{chatId:e,file:a,replyToMessageId:A,messageThreadId:r,signal:s}){if(!a||typeof a!="object"||typeof a.fileName!="string"||!a.fileName||!Buffer.isBuffer(a.bytes))throw new TypeError(`A Telegram ${i} is required`);let g=new FormData;if(g.append("chat_id",String(e)),g.append(o,new Blob([a.bytes],{type:a.mediaType??"application/octet-stream"}),a.fileName),A&&g.append("reply_parameters",JSON.stringify({message_id:A,allow_sending_without_reply:!0})),r&&g.append("message_thread_id",String(r)),s?.aborted)throw EP(s);let c=L6(s,this.#r);try{return await this.#n(t,g,{signal:c,timeoutMs:this.#r,multipart:!0})}catch(I){throw s?.aborted?EP(s):I?.deliveryOutcome==="unknown"?U6(I?.cause??I,i):I?.code?.startsWith?.("telegram-")?yve(I,i):U6(I,i)}}async editMessageText({chatId:t,messageId:o,text:i,richMessage:e,signal:a}){if(i===void 0==(e===void 0))throw new TypeError("Telegram message edit requires exactly one of text or richMessage");return this.#n("editMessageText",{chat_id:t,message_id:o,...i===void 0?{rich_message:CP(e)}:{text:i,link_preview_options:{is_disabled:!0}}},{signal:a})}async sendChatAction({chatId:t,messageThreadId:o,signal:i}){return this.#n("sendChatAction",{chat_id:t,action:"typing",...o?{message_thread_id:o}:{}},{signal:i})}async setMyCommands({commands:t,scope:o,languageCode:i,signal:e}={}){if(!Array.isArray(t)||t.length===0||t.some(a=>!Dve(a)))throw new TypeError("Telegram bot commands are invalid");return this.#n("setMyCommands",{commands:t,...o?{scope:o}:{},...ug(i)?{language_code:ug(i)}:{}},{signal:e})}async setChatMenuButton({menuButton:t=uP,signal:o}={}){if(!t||typeof t!="object"||Array.isArray(t))throw new TypeError("Telegram menu button is invalid");return this.#n("setChatMenuButton",{menu_button:t},{signal:o})}async#n(t,o,{signal:i,timeoutMs:e=15e3,multipart:a=!1}={}){if(i?.aborted)throw EP(i);let A=new URL(this.#t);A.pathname=`${A.pathname.replace(/\/$/,"")}/bot${this.#e}/${t}`;let r;try{r=await this.#A(A,{method:"POST",...a?{}:{headers:{"content-type":"application/json"}},body:a?o:JSON.stringify(o),signal:L6(i,e),redirect:"error"})}catch(g){let c=new Error(`Telegram ${t} transport failed`,{cause:g});throw c.code=g?.name==="TimeoutError"?"telegram-timeout":g?.name==="AbortError"?"telegram-aborted-after-dispatch":"telegram-transport-error",c.deliveryOutcome="unknown",c}let s;try{s=await r.json()}catch{let g=new Error(`Telegram ${t} returned invalid JSON`);throw g.status=r?.status,g.code="telegram-response-invalid",g.deliveryOutcome="unknown",g}if(!r.ok||s?.ok!==!0){let g=ug(s?.description),c=new Error(g??`Telegram ${t} failed`);c.code=Number.isInteger(s?.error_code)?`telegram-${s.error_code}`:"telegram-api-error",c.status=r.status,Number.isInteger(s?.error_code)&&(c.providerCode=s.error_code);let I=Number(s?.parameters?.retry_after);throw Number.isFinite(I)&&I>=0&&(c.retry_after=I,c.retryAfter=I),c}return s.result}};async function K6(n,t={}){let i=await new uu({token:n,...t}).getMe();if(!i?.id||i?.is_bot!==!0)throw new Error("Telegram token does not belong to a bot");return{platformId:String(i.id),name:ug([i.first_name,i.last_name].filter(Boolean).join(" "))??D("Telegram\u673A\u5668\u4EBA"),username:ug(i.username)}}var BP=Object.freeze({key:"telegram",label:"Telegram",connectionLabel:" Bot API \u957F\u8F6E\u8BE2",reactions:Object.freeze({processing:"\u{1F440}",success:"\u{1F44D}",error:"\u{1F44E}"})}),yS=class extends zn{constructor(t){super({descriptor:BP,...t})}};var Bu=class extends Ep{#e;constructor(t){super({...t,descriptor:BP,inspectToken:t.inspectToken??K6,deriveIdentity:P6,maskPlatformId:G6}),this.#e=t.configStore}status(){let t=super.status();return{...t,bots:t.bots.map(o=>{let i=this.#e.get(o.botId),e=uc(i??{});return{...o,accessPolicy:e}})}}async setAccessPolicy(t,o){let i=uc(o);return this.updateBotConfig(t,e=>({...e,...i}))}};import{randomInt as Mve}from"node:crypto";function QP(n){if(typeof n!="string"||!n.trim())throw new TypeError("Telegram message text must be a non-empty string");return n}function yP(n){return n==="&"?5:n==="<"||n===">"?4:1}function fP(n){return Array.from(n).reduce((t,o)=>t+yP(o),0)}function wve(n,t,o,i){let e=t+Math.floor(i*.5);for(let a=o-1;a>=e;a-=1)if(n[a]===` `||n[a]===" ")return a+1;return o}function mP(n,t,o=()=>1){if(typeof n!="string")throw new TypeError("Telegram message text must be a string");if(!n)return[];let i=Array.from(n),e=[],a=0;for(;at)break;r+=s,A+=1}if(A===a)throw new Error("Telegram message character exceeds the chunk limit");A",">")}function x6(n,t){return mP(n,t,yP).map(o=>({source:o,markdown:fu(o)}))}function bve(n,t,o,i){let e=n.slice(t.length,n.length-o.length),a=fP(t)+Math.max(fP(o),fP("```"))+1,A=i-a;if(A<1)throw new Error("Telegram Rich Markdown code fence exceeds the limit");let r=mP(e,A,yP);return r.map((s,g)=>{let c=g===r.length-1,I=s.endsWith(` `)?"":` -`,d=c?o:"```",B=`${g===0?t:""}${s}${c?o:""}`,f=fu(`${t}${s}${I}${d}`);if(Array.from(f).length>i)throw new Error("Telegram Rich Markdown code block exceeds the limit");return{source:B,markdown:f}})}function SP(n){let t=QP(n);return Y6(t),fu(t)}function DP(n,t=3e4){if(!Number.isInteger(t)||t<128||t>32768)throw new TypeError("Telegram Rich Markdown limit is invalid");let o=QP(n),i=Y6(o),e=fu(o);if(Array.from(e).length<=t)return[{source:o,markdown:e}];let a=[],A=0;for(let r=0;rA&&a.push(...x6(o.slice(A,s.index),t));let c=g.index+g[0].length,I=o.slice(s.index,c),d=fu(I);Array.from(d).length<=t?a.push({source:I,markdown:d}):a.push(...bve(I,s[0],g[0],t)),A=c}return A4096)throw new TypeError("Telegram regular message limit is invalid");return mP(QP(n),t,o=>o.length)}var _ve=Object.freeze([{command:"new",description:"\u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"},{command:"compact",description:"\u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"},{command:"workspace",description:"\u5207\u6362\u5DE5\u4F5C\u533A"},{command:"workspacelist",description:"\u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84"},{command:"sessionlist",description:"\u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"},{command:"session",description:"\u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"},{command:"models",description:"\u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"},{command:"model",description:"\u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B"},{command:"presetlist",description:"\u5217\u51FA\u53EF\u7528 Agent Preset"},{command:"preset",description:"\u67E5\u770B\u6216\u8BBE\u7F6E\u65B0\u4F1A\u8BDD Agent Preset"},{command:"stop",description:"\u505C\u6B62\u5F53\u524D\u4EFB\u52A1"},{command:"steer",description:"\u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"},{command:"batch",description:"\u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF09"},{command:"send",description:"\u63D0\u4EA4\u5F53\u524D\u6279\u6B21"},{command:"cancel",description:"\u53D6\u6D88\u5F53\u524D\u6279\u6B21"},{command:"status",description:"\u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"},{command:"version",description:"\u67E5\u770B\u63D2\u4EF6\u7248\u672C"},{command:"help",description:"\u663E\u793A\u5E2E\u52A9"}]);function Tve(){return _ve.map(n=>({...n,description:D(n.description)}))}function Nve(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Rve(n,t){return t?[[n?.text,n?.entities],[n?.caption,n?.caption_entities]].some(([o,i])=>typeof o=="string"&&Array.isArray(i)&&i.some(e=>e?.type!=="mention"||!Number.isInteger(e.offset)||!Number.isInteger(e.length)?!1:o.slice(e.offset,e.offset+e.length).toLowerCase()===`@${t.toLowerCase()}`)):!1}function kve(n,t){return!t||typeof n!="string"?n:n.replace(new RegExp(`@${Nve(t)}\\b`,"ig"),"").trim()}var vve=new Set(["image/jpeg","image/png","image/webp","image/gif"]),Pve=new Map([[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".png","image/png"],[".webp","image/webp"],[".gif","image/gif"]]);function J6(n){let t=n?.mime_type??n?.mimetype,o=typeof t=="string"?t.toLowerCase():"";if(vve.has(o))return o;let i=typeof n?.file_name=="string"?n.file_name.toLowerCase():"";for(let[e,a]of Pve)if(i.endsWith(e))return a;return null}function MP(n){return Number.isSafeInteger(n)&&n>=0?n:void 0}function j6(n){return MP(n?.file_size)??(Number(n?.width)||0)*(Number(n?.height)||0)}function Gve(n,t){let o,i,e;if(Array.isArray(n?.photo)&&n.photo.length>0)o=n.photo.reduce((a,A)=>j6(A)>j6(a)?A:a),i="image/jpeg",e=`${o.file_unique_id??o.file_id??"telegram-photo"}.jpg`;else if(n?.document){let a=J6(n.document);if(!a)return null;o=n.document,i=a,e=typeof o.file_name=="string"?o.file_name:void 0}return!o||typeof o.file_id!="string"?null:{name:e,mediaType:i,size:MP(o.file_size),load:a=>t(o.file_id,a)}}function Fve(n,t){let o=n?.document;if(!o||J6(o)||typeof o.file_id!="string"||!o.file_id)return null;let i=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),...i?{mediaType:i}:{},size:MP(o.file_size),load:({signal:e}={})=>t(o.file_id,{signal:e})}}function Lve(n,{botId:t,username:o,loadFile:i=async()=>{throw new Error("Telegram file downloader is unavailable")},loadFileStream:e=i}){let a=n?.message,A=a?.chat?.id,r=a?.from?.id,s=a?.message_id;if(!Number.isSafeInteger(n?.update_id)||A===void 0||r===void 0||!Number.isSafeInteger(s)||!["private","group","supergroup"].includes(a.chat?.type))return null;let g=a.chat.type==="private",c=g||String(a.reply_to_message?.from?.id??"")===String(t)||Rve(a,o),I=Number.isSafeInteger(a.message_thread_id)?a.message_thread_id:void 0,d=Gve(a,i),B=Fve(a,e);return{messageId:String(n.update_id),senderId:String(r),contextSource:()=>({senderName:[a.from?.first_name,a.from?.last_name].filter(f=>typeof f=="string"&&f.trim()).map(f=>f.trim()).join(" ")||a.from?.username}),senderIsBot:a.from?.is_bot===!0,kind:g?"direct":"group",conversationId:I===void 0?String(A):`${A}:${I}`,content:kve(a.text??a.caption??"",o),plainText:typeof a.text=="string",images:d?[d]:[],files:B?[B]:[],addressed:c,reactionTarget:{chatId:A,messageId:s},replyTarget:{chatId:A,chatType:a.chat.type,replyToMessageId:s,messageThreadId:I},connectionTestTarget:{chatId:A,messageThreadId:I}}}function Uve(n,{accessMode:t=Cu.compatible,allowedPrivateUserIds:o=new Set}={}){return t!==Cu.privateAllowlist?!0:n?.kind==="direct"&&o instanceof Set&&o.has(String(n.senderId))}function OP(n){return Number.isSafeInteger(n?.message_id)?String(n.message_id):null}function Qu(n){let t=Number(n?.providerCode),o=Number(n?.status),i=n?.deliveryOutcome==="unknown"||t>=500||o>=500||["telegram-timeout","telegram-aborted-after-dispatch","telegram-transport-error","telegram-response-invalid"].includes(n?.code);return{outcome:i?"unknown":"failed",reason:typeof n?.code=="string"&&n.code?n.code:i?"telegram-delivery-uncertain":"telegram-provider-rejected"}}function Ti(n,t,o="sent",i){return{presentation:n,providerMessageIds:[...new Set(t)],deliveryOutcome:o,...i?{reason:i}:{}}}var mS=class{#e;#A;#t;#r;#c;#a=!1;#n=null;constructor({update:t,finish:o,fail:i,providerMessageIds:e=[],presentation:a,logger:A}){this.#e=t,this.#A=o,this.#t=i,this.#c=e,this.presentation=a,this.#r=A}get providerMessageIds(){return[...this.#c]}async update(t){if(this.#a)return;let o=Yn(t),i=`${o.format}:${o.text}`;if(i!==this.#n){this.#n=i;try{return await this.#e(o)}catch(e){this.#r.warn?.("[dsh-im:telegram] rich stream update failed:",e);return}}}async finish(t){if(this.#a)throw new Error("Message stream is already closed");this.#a=!0;let o=await this.#A(Yn(t));return this.#c.push(...o?.providerMessageIds??[]),o}async fail(t){if(this.#a)return;this.#a=!0;let o=await this.#t(Yn(t,"plain"));return this.#c.push(...o?.providerMessageIds??[]),o}cancel(){this.#a=!0}},bP=class{#e;#A;#t;constructor({api:t,signal:o,logger:i=console}){this.#e=t,this.#A=o,this.#t=i}async sendText(t,o){let i=wP(o),e=[];for(let[a,A]of i.entries()){let r=await this.#e.sendMessage({chatId:t.chatId,text:A,replyToMessageId:a===0?t.replyToMessageId:void 0,messageThreadId:t.messageThreadId,signal:this.#A});Number.isSafeInteger(r?.message_id)&&e.push(String(r.message_id))}return{providerMessageIds:e}}async addReaction(t,o,{signal:i}={}){let e=String(o??"").trim();return await this.#e.setMessageReaction({chatId:t.chatId,messageId:t.messageId,emoji:e,signal:i??this.#A}),e}removeReaction(t,o,{signal:i}={}){return this.#e.setMessageReaction({chatId:t.chatId,messageId:t.messageId,signal:i??this.#A})}sendTyping(t){return this.#e.sendChatAction({chatId:t.chatId,messageThreadId:t.messageThreadId,signal:this.#A})}sendFile(t,o){return this.#e.sendDocument({chatId:t.chatId,file:o,replyToMessageId:t.replyToMessageId,messageThreadId:t.messageThreadId,signal:this.#A})}sendImage(t,o){return this.#e.sendPhoto({chatId:t.chatId,file:o,replyToMessageId:t.replyToMessageId,messageThreadId:t.messageThreadId,signal:this.#A})}async#r(t,o,{placeholderMessageId:i}={}){let e=wP(o),a=i===void 0?[]:[String(i)],A=0;if(i!==void 0)try{await this.#e.editMessageText({chatId:t.chatId,messageId:i,text:e[0],signal:this.#A}),A=1}catch(r){let s=Qu(r);if(s.outcome==="unknown")return Ti("text-fallback",a,"unknown",s.reason);let g=await this.#r(t,o),c=g.deliveryOutcome==="sent"?"\u56DE\u590D\u5DF2\u53D1\u9001\u3002":g.deliveryOutcome==="unknown"?"\u56DE\u590D\u53D1\u9001\u7ED3\u679C\u672A\u80FD\u786E\u8BA4\u3002":"\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002";try{await this.#e.editMessageText({chatId:t.chatId,messageId:i,text:c,signal:this.#A})}catch(I){this.#t.warn?.("[dsh-im:telegram] unable to replace the processing placeholder:",I)}return Ti("text-fallback",[...a,...g.providerMessageIds],g.deliveryOutcome,g.reason)}for(let r=A;rI.source).join(""),c=await this.#r({...t,replyToMessageId:a===0?t.replyToMessageId:void 0},g);return Ti(c.presentation,[...e,...c.providerMessageIds],c.deliveryOutcome,c.reason)}return Ti("telegram-rich-final",e)}async#a(t,o,i){if(i.format==="plain")return this.#r(t,i.text,{placeholderMessageId:o});let e;try{e=DP(i.text)}catch{return this.#r(t,i.text,{placeholderMessageId:o})}let a=[String(o)];try{await this.#e.editMessageText({chatId:t.chatId,messageId:o,richMessage:{markdown:e[0].markdown},signal:this.#A})}catch(A){let r=Qu(A);return r.outcome==="unknown"?Ti("telegram-rich-final",a,"unknown",r.reason):this.#r(t,i.text,{placeholderMessageId:o})}for(let[A,r]of e.slice(1).entries())try{let s=await this.#e.sendRichMessage({chatId:t.chatId,richMessage:{markdown:r.markdown},messageThreadId:t.messageThreadId,signal:this.#A}),g=OP(s);g&&a.push(g)}catch(s){let g=Qu(s);if(g.outcome==="unknown")return Ti("telegram-rich-final",a,"unknown",g.reason);let c=e.slice(A+1).map(d=>d.source).join(""),I=await this.#r({...t,replyToMessageId:void 0},c);return Ti(I.presentation,[...a,...I.providerMessageIds],I.deliveryOutcome,I.reason)}return Ti("telegram-rich-final",a)}sendDelivery(t,o){return this.#c(t,Yn(o))}async openDeliveryStream(t){if(t.chatType==="private"){let e=Mve(1,2147483647),a=async r=>{let s={markdown:SP(r.text)};return await this.#e.sendRichMessageDraft({chatId:t.chatId,draftId:e,richMessage:s,messageThreadId:t.messageThreadId,signal:this.#A}),Ti("telegram-rich-draft",[])},A=new mS({update:a,finish:r=>this.#c(t,r),fail:r=>this.#r(t,r.text),presentation:"telegram-rich-draft",logger:this.#t});return await A.update(Yn("\u6B63\u5728\u5904\u7406\u2026","plain")),A}let i=(await this.#e.sendMessage({chatId:t.chatId,text:"\u6B63\u5728\u5904\u7406\u2026",replyToMessageId:t.replyToMessageId,messageThreadId:t.messageThreadId,signal:this.#A}))?.message_id;if(!Number.isSafeInteger(i))throw new Error("Telegram did not return a placeholder message id");return new mS({update:async e=>e.format==="plain"?(await this.#e.editMessageText({chatId:t.chatId,messageId:i,text:e.text,signal:this.#A}),Ti("text-fallback",[String(i)])):(await this.#e.editMessageText({chatId:t.chatId,messageId:i,richMessage:{markdown:SP(e.text)},signal:this.#A}),Ti("telegram-rich-draft",[String(i)])),finish:e=>this.#a(t,i,e),fail:e=>this.#r(t,e.text,{placeholderMessageId:i}),providerMessageIds:[String(i)],presentation:"telegram-regular",logger:this.#t})}async openStream(t){return lQ({limit:4e3,create:async i=>(await this.#e.sendMessage({chatId:t.chatId,text:i,replyToMessageId:t.replyToMessageId,messageThreadId:t.messageThreadId,signal:this.#A})).message_id,edit:(i,e)=>this.#e.editMessageText({chatId:t.chatId,messageId:i,text:e,signal:this.#A}),sendRemainder:i=>this.#e.sendMessage({chatId:t.chatId,text:i,messageThreadId:t.messageThreadId,signal:this.#A}),messageIdForResult:i=>i?.message_id}).start()}};function Hve(){return{startedAt:null,ready:!1,connectionState:"idle",harnessReachable:!1,lastCheckedAt:null,lastConnectedAt:null,lastError:null,...zi()}}var yu=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l;#i=Hve();#I=null;#s=null;#p=null;#d=null;#h=null;constructor({config:t,token:o,harness:i,state:e,contextEnhancement:a,logger:A=console,replyTimeoutMs:r=6e5,createApi:s=g=>new uu(g)}){if(!t||!o||!i||!e)throw new TypeError("TelegramRuntime requires config, token, Harness, and state");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s;let g=uc(t);this.#g=g.accessMode,this.#l=new Set(g.allowedUsers)}get status(){return structuredClone(this.#i)}async sendConnectionTest(t){if(!this.#i.ready||!this.#s){let o=new Error("Telegram bot is not connected");throw o.code="test-target-unavailable",o}return this.#s.sendConnectionTest(t)}async start(){return this.#i.ready&&this.#d?this.status:this.#h?this.#h:(this.#h=this.#E().finally(()=>{this.#h=null}),this.#h)}async#E(){await this.stop(),this.#i.startedAt=new Date().toISOString(),this.#i.connectionState="connecting",this.#i.lastError=null,await this.#t.ensureRunning(),this.#i.harnessReachable=!0;let t=new AbortController;this.#p=t;let o=this.#o({token:this.#A});this.#I=o;try{let i=await o.getMe({signal:t.signal});if(String(i?.id??"")!==this.#e.platformId||i?.is_bot!==!0)throw new Error("Telegram token identity does not match the saved bot");let e=await o.getWebhookInfo({signal:t.signal});if(typeof e?.url=="string"&&e.url){let s=new Error(D("\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 s.code="webhook-configured",s}try{await o.setMyCommands({commands:Tve(),signal:t.signal}),await o.setChatMenuButton({menuButton:uP,signal:t.signal})}catch(s){this.#a.warn?.(`[dsh-im:telegram] bot ${this.#e.botId} command menu setup failed:`,s)}let a=new bP({api:o,signal:t.signal,logger:this.#a});this.#s=new yS({bot:a,harness:this.#t,state:this.#r,contextEnhancement:this.#c,status:this.#i,logger:this.#a,replyTimeoutMs:this.#n,signal:t.signal});let A=this.#r.cursor();if(A===null){let s=await o.getUpdates({offset:-1,timeout:0,signal:t.signal});A=s.length>0?s.at(-1).update_id+1:0,await this.#r.setCursor(A)}let r=Date.now();return this.#i.ready=!0,this.#i.connectionState="connected",this.#i.lastCheckedAt=r,this.#i.lastConnectedAt=r,this.#d=this.#C(A,t.signal),this.#d.catch(s=>{t.signal.aborted||(this.#i.ready=!1,this.#i.connectionState="failed",this.#i.lastError=s?.message??String(s),this.#a.error?.(`[dsh-im:telegram] bot ${this.#e.botId} polling stopped:`,s))}),this.status}catch(i){throw this.#i.ready=!1,this.#i.connectionState="failed",this.#i.lastError=i?.message??String(i),await this.stop(),i}}async#C(t,o){let i=t;for(;!o.aborted;){let e=await this.#I.getUpdates({offset:i,timeout:25,signal:o});if(this.#i.lastCheckedAt=Date.now(),o.aborted)return;let a=e.map(A=>{let r=A?.message?.chat?.type;return{update:A,contextSnapshot:Zr(this.#c,r==="private"?"direct":r==="group"||r==="supergroup"?"group":null)}});for(let{update:A,contextSnapshot:r}of a){if(o.aborted)return;let s=Lve(A,{botId:this.#e.platformId,username:this.#e.username,loadFile:(g,c)=>this.#I.downloadFile({fileId:g,...c}),loadFileStream:(g,c)=>this.#I.downloadFileStream({fileId:g,...c})});s&&Uve(s,{accessMode:this.#g,allowedPrivateUserIds:this.#l})?this.#s.accept(s,{contextSnapshot:r}).catch(g=>{o.aborted||this.#a.error?.(`[dsh-im:telegram] bot ${this.#e.botId} message handling failed:`,g)}):s&&(this.#i.messagesRejected+=1,this.#i.lastRejectedAt=new Date().toISOString()),i=A.update_id+1,await this.#r.setCursor(i)}}}async stop(){let t=this.#d,o=this.#s;return this.#p?.abort(),this.#p=null,this.#d=null,this.#I=null,this.#s=null,await Promise.race([t?.catch(()=>{})??Promise.resolve(),new Promise(i=>setTimeout(i,2e3))]),await Promise.race([o?.waitForIdle()??Promise.resolve(),new Promise(i=>setTimeout(i,2e3))]),this.#i.ready=!1,this.#i.connectionState="idle",this.status}};var SS=class extends Wn{};function _P(n,t={},o={}){return hQ(n,t,o,{channel:"telegram",ConfigStore:fS,StateStore:SS,HarnessClient:QS,Controller:Bu,Runtime:yu})}var q6="/telegram",TP=Object.freeze({...Aa,setAccessPolicy:"bot.access-policy.set"}),Kve=Object.freeze(Object.values(TP));function z6(n){if(typeof n?.setAccessPolicy!="function")throw new TypeError("A complete Telegram controller is required (setAccessPolicy)");let t=CQ(n,{channel:"Telegram"});return async(o,i,e)=>{if(o!==TP.setAccessPolicy)return t(o,i,e);if(e?.aborted)return{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}};let a=i&&typeof i=="object"&&!Array.isArray(i)?Object.keys(i):[];if(a.length!==3||!a.every(r=>["botId","accessMode","allowedUsers"].includes(r))||typeof i.botId!="string"||!/^[A-Za-z0-9_-]{1,128}$/.test(i.botId))return{ok:!1,error:{code:"bad-request",message:"bot.access-policy.set requires a valid policy."}};let A;try{A=uc(i)}catch{return{ok:!1,error:{code:"bad-request",message:"\u8BF7\u8F93\u5165\u6709\u6548\u7684 Telegram \u8BBF\u95EE\u6A21\u5F0F\u548C\u6570\u5B57 User ID\u3002"}}}try{let r=await n.setAccessPolicy(i.botId,A);return e?.aborted?{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}:{ok:!0,value:r}}catch{return e?.aborted?{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}:{ok:!1,error:{code:"telegram-operation-failed",message:"Telegram \u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"}}}}}function DS(n,t,o){if(!n?.connection?.rpc||typeof n.connection.rpc.handle!="function")throw new TypeError("DSH Host Connection RPC is required");return n.connection.rpc.handle(q6,z6(t),{authority:Or(o)})}async function V6(n,t={}){if(t?.controller)return DS(n,t.controller,t.rpcAuthority);let o=await _P(n,t,t.internals??{}),i=DS(n,o.controller,t.rpcAuthority);return n.effect(()=>async()=>o.close(),"dsh-im: close Telegram bot connections"),i}import{unlink as RPe}from"node:fs/promises";import{homedir as kPe}from"node:os";import{join as Ou,resolve as il}from"node:path";import{createHash as xve}from"node:crypto";import{mkdir as Yve,readFile as jve,rename as Jve,unlink as qve,writeFile as zve}from"node:fs/promises";import{dirname as Vve}from"node:path";var NP=Object.freeze({version:1,bots:Object.freeze([])});function tl(n){return typeof n=="string"&&n.trim()?n.trim():null}function W6(n){let t=tl(n);return t&&/^wecom_[a-f0-9]{24}$/.test(t)?t:null}function Wve(n){let t=tl(n);return t&&/^DSH_WECOM_BOT_SECRET_[A-F0-9]{24}$/.test(t)?t:null}function OS(n){let t=tl(n);if(!t)throw new TypeError("Enterprise WeChat bot ID is required");let o=xve("sha256").update(t).digest("hex").slice(0,24);return{botId:`wecom_${o}`,secretRef:`DSH_WECOM_BOT_SECRET_${o.toUpperCase()}`}}function RP(n){let t=tl(n)??"";return t?t.length<=10?`${t.slice(0,3)}\u2022\u2022\u2022`:`${t.slice(0,6)}\u2022\u2022\u2022\u2022${t.slice(-4)}`:D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA")}function Z6(n){if(!n||typeof n!="object")return null;let t=W6(n.botId),o=tl(n.remoteBotId),i=Wve(n.secretRef);if(!t||!o||!i)return null;let e=OS(o);return e.botId!==t||e.secretRef!==i?null:Object.freeze({botId:t,remoteBotId:o,secretRef:i,createdAt:tl(n.createdAt)??new Date().toISOString(),connectedAt:tl(n.connectedAt)})}function Zve(n){if(!n||n.version!==1||!Array.isArray(n.bots))return null;let t=n.bots.map(Z6);if(t.some(a=>a===null))return null;let o=new Set,i=new Set,e=new Set;for(let a of t){if(o.has(a.botId)||i.has(a.remoteBotId)||e.has(a.secretRef))return null;o.add(a.botId),i.add(a.remoteBotId),e.add(a.secretRef)}return Object.freeze({version:1,bots:Object.freeze(t)})}var wS=class{#e;#A=NP;#t=Promise.resolve();constructor(t){this.#e=t}async load(){try{let t=Zve(JSON.parse(await jve(this.#e,"utf8")));if(!t)throw new Error("dsh-im Enterprise WeChat config contains invalid bot data");this.#A=t}catch(t){if(t?.code!=="ENOENT")throw t;this.#A=NP}return this}list(){return structuredClone(this.#A.bots)}get(t){let o=this.#A.bots.find(i=>i.botId===t);return o?structuredClone(o):null}getByRemoteBotId(t){let o=this.#A.bots.find(i=>i.remoteBotId===t);return o?structuredClone(o):null}async save(t){let o=Z6(t);if(!o)throw new Error("Refusing to persist incomplete Enterprise WeChat bot data");return this.#r(i=>{let e=i.find(r=>r.remoteBotId===o.remoteBotId&&r.botId!==o.botId),a=i.find(r=>r.secretRef===o.secretRef&&r.botId!==o.botId);if(e||a)throw new Error("Duplicate Enterprise WeChat bot identity");let A=i.findIndex(r=>r.botId===o.botId);return A===-1?i.push(o):i[A]=o,structuredClone(o)})}async remove(t){if(!W6(t))throw new TypeError("Invalid Enterprise WeChat bot ID");return this.#r(o=>{let i=o.findIndex(a=>a.botId===t);if(i===-1)return null;let[e]=o.splice(i,1);return structuredClone(e)})}async clear(){let t=this.#t.then(async()=>{try{await qve(this.#e)}catch(o){if(o?.code!=="ENOENT")throw o}this.#A=NP});this.#t=t.then(()=>{},()=>{}),await t}async#r(t){let o,i=this.#t.then(async()=>{let e=[...this.#A.bots];o=t(e);let a=Object.freeze({version:1,bots:Object.freeze(e)});await this.#c(a),this.#A=a});return this.#t=i.then(()=>{},()=>{}),await i,o}async#c(t){await Yve(Vve(this.#e),{recursive:!0,mode:448});let o=`${this.#e}.tmp`;await zve(o,`${JSON.stringify(t,null,2)} +`,d=c?o:"```",B=`${g===0?t:""}${s}${c?o:""}`,f=fu(`${t}${s}${I}${d}`);if(Array.from(f).length>i)throw new Error("Telegram Rich Markdown code block exceeds the limit");return{source:B,markdown:f}})}function SP(n){let t=QP(n);return Y6(t),fu(t)}function DP(n,t=3e4){if(!Number.isInteger(t)||t<128||t>32768)throw new TypeError("Telegram Rich Markdown limit is invalid");let o=QP(n),i=Y6(o),e=fu(o);if(Array.from(e).length<=t)return[{source:o,markdown:e}];let a=[],A=0;for(let r=0;rA&&a.push(...x6(o.slice(A,s.index),t));let c=g.index+g[0].length,I=o.slice(s.index,c),d=fu(I);Array.from(d).length<=t?a.push({source:I,markdown:d}):a.push(...bve(I,s[0],g[0],t)),A=c}return A4096)throw new TypeError("Telegram regular message limit is invalid");return mP(QP(n),t,o=>o.length)}var _ve=Object.freeze([{command:"new",description:"\u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"},{command:"compact",description:"\u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"},{command:"workspace",description:"\u5207\u6362\u5DE5\u4F5C\u533A"},{command:"workspacelist",description:"\u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84"},{command:"sessionlist",description:"\u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"},{command:"sessions",description:"\u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"},{command:"session",description:"\u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"},{command:"models",description:"\u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"},{command:"model",description:"\u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B"},{command:"presetlist",description:"\u5217\u51FA\u53EF\u7528 Agent Preset"},{command:"presets",description:"\u5217\u51FA\u53EF\u7528 Agent Preset"},{command:"preset",description:"\u67E5\u770B\u6216\u8BBE\u7F6E\u65B0\u4F1A\u8BDD Agent Preset"},{command:"stop",description:"\u505C\u6B62\u5F53\u524D\u4EFB\u52A1"},{command:"steer",description:"\u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"},{command:"batch",description:"\u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF09"},{command:"send",description:"\u63D0\u4EA4\u5F53\u524D\u6279\u6B21"},{command:"cancel",description:"\u53D6\u6D88\u5F53\u524D\u6279\u6B21"},{command:"status",description:"\u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"},{command:"version",description:"\u67E5\u770B\u63D2\u4EF6\u7248\u672C"},{command:"help",description:"\u663E\u793A\u5E2E\u52A9"}]);function Tve(){return _ve.map(n=>({...n,description:D(n.description)}))}function Nve(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Rve(n,t){return t?[[n?.text,n?.entities],[n?.caption,n?.caption_entities]].some(([o,i])=>typeof o=="string"&&Array.isArray(i)&&i.some(e=>e?.type!=="mention"||!Number.isInteger(e.offset)||!Number.isInteger(e.length)?!1:o.slice(e.offset,e.offset+e.length).toLowerCase()===`@${t.toLowerCase()}`)):!1}function kve(n,t){return!t||typeof n!="string"?n:n.replace(new RegExp(`@${Nve(t)}\\b`,"ig"),"").trim()}var vve=new Set(["image/jpeg","image/png","image/webp","image/gif"]),Pve=new Map([[".jpg","image/jpeg"],[".jpeg","image/jpeg"],[".png","image/png"],[".webp","image/webp"],[".gif","image/gif"]]);function J6(n){let t=n?.mime_type??n?.mimetype,o=typeof t=="string"?t.toLowerCase():"";if(vve.has(o))return o;let i=typeof n?.file_name=="string"?n.file_name.toLowerCase():"";for(let[e,a]of Pve)if(i.endsWith(e))return a;return null}function MP(n){return Number.isSafeInteger(n)&&n>=0?n:void 0}function j6(n){return MP(n?.file_size)??(Number(n?.width)||0)*(Number(n?.height)||0)}function Gve(n,t){let o,i,e;if(Array.isArray(n?.photo)&&n.photo.length>0)o=n.photo.reduce((a,A)=>j6(A)>j6(a)?A:a),i="image/jpeg",e=`${o.file_unique_id??o.file_id??"telegram-photo"}.jpg`;else if(n?.document){let a=J6(n.document);if(!a)return null;o=n.document,i=a,e=typeof o.file_name=="string"?o.file_name:void 0}return!o||typeof o.file_id!="string"?null:{name:e,mediaType:i,size:MP(o.file_size),load:a=>t(o.file_id,a)}}function Fve(n,t){let o=n?.document;if(!o||J6(o)||typeof o.file_id!="string"||!o.file_id)return null;let i=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),...i?{mediaType:i}:{},size:MP(o.file_size),load:({signal:e}={})=>t(o.file_id,{signal:e})}}function Lve(n,{botId:t,username:o,loadFile:i=async()=>{throw new Error("Telegram file downloader is unavailable")},loadFileStream:e=i}){let a=n?.message,A=a?.chat?.id,r=a?.from?.id,s=a?.message_id;if(!Number.isSafeInteger(n?.update_id)||A===void 0||r===void 0||!Number.isSafeInteger(s)||!["private","group","supergroup"].includes(a.chat?.type))return null;let g=a.chat.type==="private",c=g||String(a.reply_to_message?.from?.id??"")===String(t)||Rve(a,o),I=Number.isSafeInteger(a.message_thread_id)?a.message_thread_id:void 0,d=Gve(a,i),B=Fve(a,e);return{messageId:String(n.update_id),senderId:String(r),contextSource:()=>({senderName:[a.from?.first_name,a.from?.last_name].filter(f=>typeof f=="string"&&f.trim()).map(f=>f.trim()).join(" ")||a.from?.username}),senderIsBot:a.from?.is_bot===!0,kind:g?"direct":"group",conversationId:I===void 0?String(A):`${A}:${I}`,content:kve(a.text??a.caption??"",o),plainText:typeof a.text=="string",images:d?[d]:[],files:B?[B]:[],addressed:c,reactionTarget:{chatId:A,messageId:s},replyTarget:{chatId:A,chatType:a.chat.type,replyToMessageId:s,messageThreadId:I},connectionTestTarget:{chatId:A,messageThreadId:I}}}function Uve(n,{accessMode:t=Cu.compatible,allowedPrivateUserIds:o=new Set}={}){return t!==Cu.privateAllowlist?!0:n?.kind==="direct"&&o instanceof Set&&o.has(String(n.senderId))}function OP(n){return Number.isSafeInteger(n?.message_id)?String(n.message_id):null}function Qu(n){let t=Number(n?.providerCode),o=Number(n?.status),i=n?.deliveryOutcome==="unknown"||t>=500||o>=500||["telegram-timeout","telegram-aborted-after-dispatch","telegram-transport-error","telegram-response-invalid"].includes(n?.code);return{outcome:i?"unknown":"failed",reason:typeof n?.code=="string"&&n.code?n.code:i?"telegram-delivery-uncertain":"telegram-provider-rejected"}}function Ti(n,t,o="sent",i){return{presentation:n,providerMessageIds:[...new Set(t)],deliveryOutcome:o,...i?{reason:i}:{}}}var mS=class{#e;#A;#t;#r;#c;#a=!1;#n=null;constructor({update:t,finish:o,fail:i,providerMessageIds:e=[],presentation:a,logger:A}){this.#e=t,this.#A=o,this.#t=i,this.#c=e,this.presentation=a,this.#r=A}get providerMessageIds(){return[...this.#c]}async update(t){if(this.#a)return;let o=Yn(t),i=`${o.format}:${o.text}`;if(i!==this.#n){this.#n=i;try{return await this.#e(o)}catch(e){this.#r.warn?.("[dsh-im:telegram] rich stream update failed:",e);return}}}async finish(t){if(this.#a)throw new Error("Message stream is already closed");this.#a=!0;let o=await this.#A(Yn(t));return this.#c.push(...o?.providerMessageIds??[]),o}async fail(t){if(this.#a)return;this.#a=!0;let o=await this.#t(Yn(t,"plain"));return this.#c.push(...o?.providerMessageIds??[]),o}cancel(){this.#a=!0}},bP=class{#e;#A;#t;constructor({api:t,signal:o,logger:i=console}){this.#e=t,this.#A=o,this.#t=i}async sendText(t,o){let i=wP(o),e=[];for(let[a,A]of i.entries()){let r=await this.#e.sendMessage({chatId:t.chatId,text:A,replyToMessageId:a===0?t.replyToMessageId:void 0,messageThreadId:t.messageThreadId,signal:this.#A});Number.isSafeInteger(r?.message_id)&&e.push(String(r.message_id))}return{providerMessageIds:e}}async addReaction(t,o,{signal:i}={}){let e=String(o??"").trim();return await this.#e.setMessageReaction({chatId:t.chatId,messageId:t.messageId,emoji:e,signal:i??this.#A}),e}removeReaction(t,o,{signal:i}={}){return this.#e.setMessageReaction({chatId:t.chatId,messageId:t.messageId,signal:i??this.#A})}sendTyping(t){return this.#e.sendChatAction({chatId:t.chatId,messageThreadId:t.messageThreadId,signal:this.#A})}sendFile(t,o){return this.#e.sendDocument({chatId:t.chatId,file:o,replyToMessageId:t.replyToMessageId,messageThreadId:t.messageThreadId,signal:this.#A})}sendImage(t,o){return this.#e.sendPhoto({chatId:t.chatId,file:o,replyToMessageId:t.replyToMessageId,messageThreadId:t.messageThreadId,signal:this.#A})}async#r(t,o,{placeholderMessageId:i}={}){let e=wP(o),a=i===void 0?[]:[String(i)],A=0;if(i!==void 0)try{await this.#e.editMessageText({chatId:t.chatId,messageId:i,text:e[0],signal:this.#A}),A=1}catch(r){let s=Qu(r);if(s.outcome==="unknown")return Ti("text-fallback",a,"unknown",s.reason);let g=await this.#r(t,o),c=g.deliveryOutcome==="sent"?"\u56DE\u590D\u5DF2\u53D1\u9001\u3002":g.deliveryOutcome==="unknown"?"\u56DE\u590D\u53D1\u9001\u7ED3\u679C\u672A\u80FD\u786E\u8BA4\u3002":"\u6D88\u606F\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002";try{await this.#e.editMessageText({chatId:t.chatId,messageId:i,text:c,signal:this.#A})}catch(I){this.#t.warn?.("[dsh-im:telegram] unable to replace the processing placeholder:",I)}return Ti("text-fallback",[...a,...g.providerMessageIds],g.deliveryOutcome,g.reason)}for(let r=A;rI.source).join(""),c=await this.#r({...t,replyToMessageId:a===0?t.replyToMessageId:void 0},g);return Ti(c.presentation,[...e,...c.providerMessageIds],c.deliveryOutcome,c.reason)}return Ti("telegram-rich-final",e)}async#a(t,o,i){if(i.format==="plain")return this.#r(t,i.text,{placeholderMessageId:o});let e;try{e=DP(i.text)}catch{return this.#r(t,i.text,{placeholderMessageId:o})}let a=[String(o)];try{await this.#e.editMessageText({chatId:t.chatId,messageId:o,richMessage:{markdown:e[0].markdown},signal:this.#A})}catch(A){let r=Qu(A);return r.outcome==="unknown"?Ti("telegram-rich-final",a,"unknown",r.reason):this.#r(t,i.text,{placeholderMessageId:o})}for(let[A,r]of e.slice(1).entries())try{let s=await this.#e.sendRichMessage({chatId:t.chatId,richMessage:{markdown:r.markdown},messageThreadId:t.messageThreadId,signal:this.#A}),g=OP(s);g&&a.push(g)}catch(s){let g=Qu(s);if(g.outcome==="unknown")return Ti("telegram-rich-final",a,"unknown",g.reason);let c=e.slice(A+1).map(d=>d.source).join(""),I=await this.#r({...t,replyToMessageId:void 0},c);return Ti(I.presentation,[...a,...I.providerMessageIds],I.deliveryOutcome,I.reason)}return Ti("telegram-rich-final",a)}sendDelivery(t,o){return this.#c(t,Yn(o))}async openDeliveryStream(t){if(t.chatType==="private"){let e=Mve(1,2147483647),a=async r=>{let s={markdown:SP(r.text)};return await this.#e.sendRichMessageDraft({chatId:t.chatId,draftId:e,richMessage:s,messageThreadId:t.messageThreadId,signal:this.#A}),Ti("telegram-rich-draft",[])},A=new mS({update:a,finish:r=>this.#c(t,r),fail:r=>this.#r(t,r.text),presentation:"telegram-rich-draft",logger:this.#t});return await A.update(Yn("\u6B63\u5728\u5904\u7406\u2026","plain")),A}let i=(await this.#e.sendMessage({chatId:t.chatId,text:"\u6B63\u5728\u5904\u7406\u2026",replyToMessageId:t.replyToMessageId,messageThreadId:t.messageThreadId,signal:this.#A}))?.message_id;if(!Number.isSafeInteger(i))throw new Error("Telegram did not return a placeholder message id");return new mS({update:async e=>e.format==="plain"?(await this.#e.editMessageText({chatId:t.chatId,messageId:i,text:e.text,signal:this.#A}),Ti("text-fallback",[String(i)])):(await this.#e.editMessageText({chatId:t.chatId,messageId:i,richMessage:{markdown:SP(e.text)},signal:this.#A}),Ti("telegram-rich-draft",[String(i)])),finish:e=>this.#a(t,i,e),fail:e=>this.#r(t,e.text,{placeholderMessageId:i}),providerMessageIds:[String(i)],presentation:"telegram-regular",logger:this.#t})}async openStream(t){return lQ({limit:4e3,create:async i=>(await this.#e.sendMessage({chatId:t.chatId,text:i,replyToMessageId:t.replyToMessageId,messageThreadId:t.messageThreadId,signal:this.#A})).message_id,edit:(i,e)=>this.#e.editMessageText({chatId:t.chatId,messageId:i,text:e,signal:this.#A}),sendRemainder:i=>this.#e.sendMessage({chatId:t.chatId,text:i,messageThreadId:t.messageThreadId,signal:this.#A}),messageIdForResult:i=>i?.message_id}).start()}};function Hve(){return{startedAt:null,ready:!1,connectionState:"idle",harnessReachable:!1,lastCheckedAt:null,lastConnectedAt:null,lastError:null,...zi()}}var yu=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l;#i=Hve();#I=null;#s=null;#p=null;#d=null;#h=null;constructor({config:t,token:o,harness:i,state:e,contextEnhancement:a,logger:A=console,replyTimeoutMs:r=6e5,createApi:s=g=>new uu(g)}){if(!t||!o||!i||!e)throw new TypeError("TelegramRuntime requires config, token, Harness, and state");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s;let g=uc(t);this.#g=g.accessMode,this.#l=new Set(g.allowedUsers)}get status(){return structuredClone(this.#i)}async sendConnectionTest(t){if(!this.#i.ready||!this.#s){let o=new Error("Telegram bot is not connected");throw o.code="test-target-unavailable",o}return this.#s.sendConnectionTest(t)}async start(){return this.#i.ready&&this.#d?this.status:this.#h?this.#h:(this.#h=this.#E().finally(()=>{this.#h=null}),this.#h)}async#E(){await this.stop(),this.#i.startedAt=new Date().toISOString(),this.#i.connectionState="connecting",this.#i.lastError=null,await this.#t.ensureRunning(),this.#i.harnessReachable=!0;let t=new AbortController;this.#p=t;let o=this.#o({token:this.#A});this.#I=o;try{let i=await o.getMe({signal:t.signal});if(String(i?.id??"")!==this.#e.platformId||i?.is_bot!==!0)throw new Error("Telegram token identity does not match the saved bot");let e=await o.getWebhookInfo({signal:t.signal});if(typeof e?.url=="string"&&e.url){let s=new Error(D("\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 s.code="webhook-configured",s}try{await o.setMyCommands({commands:Tve(),signal:t.signal}),await o.setChatMenuButton({menuButton:uP,signal:t.signal})}catch(s){this.#a.warn?.(`[dsh-im:telegram] bot ${this.#e.botId} command menu setup failed:`,s)}let a=new bP({api:o,signal:t.signal,logger:this.#a});this.#s=new yS({bot:a,harness:this.#t,state:this.#r,contextEnhancement:this.#c,status:this.#i,logger:this.#a,replyTimeoutMs:this.#n,signal:t.signal});let A=this.#r.cursor();if(A===null){let s=await o.getUpdates({offset:-1,timeout:0,signal:t.signal});A=s.length>0?s.at(-1).update_id+1:0,await this.#r.setCursor(A)}let r=Date.now();return this.#i.ready=!0,this.#i.connectionState="connected",this.#i.lastCheckedAt=r,this.#i.lastConnectedAt=r,this.#d=this.#C(A,t.signal),this.#d.catch(s=>{t.signal.aborted||(this.#i.ready=!1,this.#i.connectionState="failed",this.#i.lastError=s?.message??String(s),this.#a.error?.(`[dsh-im:telegram] bot ${this.#e.botId} polling stopped:`,s))}),this.status}catch(i){throw this.#i.ready=!1,this.#i.connectionState="failed",this.#i.lastError=i?.message??String(i),await this.stop(),i}}async#C(t,o){let i=t;for(;!o.aborted;){let e=await this.#I.getUpdates({offset:i,timeout:25,signal:o});if(this.#i.lastCheckedAt=Date.now(),o.aborted)return;let a=e.map(A=>{let r=A?.message?.chat?.type;return{update:A,contextSnapshot:Zr(this.#c,r==="private"?"direct":r==="group"||r==="supergroup"?"group":null)}});for(let{update:A,contextSnapshot:r}of a){if(o.aborted)return;let s=Lve(A,{botId:this.#e.platformId,username:this.#e.username,loadFile:(g,c)=>this.#I.downloadFile({fileId:g,...c}),loadFileStream:(g,c)=>this.#I.downloadFileStream({fileId:g,...c})});s&&Uve(s,{accessMode:this.#g,allowedPrivateUserIds:this.#l})?this.#s.accept(s,{contextSnapshot:r}).catch(g=>{o.aborted||this.#a.error?.(`[dsh-im:telegram] bot ${this.#e.botId} message handling failed:`,g)}):s&&(this.#i.messagesRejected+=1,this.#i.lastRejectedAt=new Date().toISOString()),i=A.update_id+1,await this.#r.setCursor(i)}}}async stop(){let t=this.#d,o=this.#s;return this.#p?.abort(),this.#p=null,this.#d=null,this.#I=null,this.#s=null,await Promise.race([t?.catch(()=>{})??Promise.resolve(),new Promise(i=>setTimeout(i,2e3))]),await Promise.race([o?.waitForIdle()??Promise.resolve(),new Promise(i=>setTimeout(i,2e3))]),this.#i.ready=!1,this.#i.connectionState="idle",this.status}};var SS=class extends Wn{};function _P(n,t={},o={}){return hQ(n,t,o,{channel:"telegram",ConfigStore:fS,StateStore:SS,HarnessClient:QS,Controller:Bu,Runtime:yu})}var q6="/telegram",TP=Object.freeze({...Aa,setAccessPolicy:"bot.access-policy.set"}),Kve=Object.freeze(Object.values(TP));function z6(n){if(typeof n?.setAccessPolicy!="function")throw new TypeError("A complete Telegram controller is required (setAccessPolicy)");let t=CQ(n,{channel:"Telegram"});return async(o,i,e)=>{if(o!==TP.setAccessPolicy)return t(o,i,e);if(e?.aborted)return{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}};let a=i&&typeof i=="object"&&!Array.isArray(i)?Object.keys(i):[];if(a.length!==3||!a.every(r=>["botId","accessMode","allowedUsers"].includes(r))||typeof i.botId!="string"||!/^[A-Za-z0-9_-]{1,128}$/.test(i.botId))return{ok:!1,error:{code:"bad-request",message:"bot.access-policy.set requires a valid policy."}};let A;try{A=uc(i)}catch{return{ok:!1,error:{code:"bad-request",message:"\u8BF7\u8F93\u5165\u6709\u6548\u7684 Telegram \u8BBF\u95EE\u6A21\u5F0F\u548C\u6570\u5B57 User ID\u3002"}}}try{let r=await n.setAccessPolicy(i.botId,A);return e?.aborted?{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}:{ok:!0,value:r}}catch{return e?.aborted?{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}:{ok:!1,error:{code:"telegram-operation-failed",message:"Telegram \u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"}}}}}function DS(n,t,o){if(!n?.connection?.rpc||typeof n.connection.rpc.handle!="function")throw new TypeError("DSH Host Connection RPC is required");return n.connection.rpc.handle(q6,z6(t),{authority:Or(o)})}async function V6(n,t={}){if(t?.controller)return DS(n,t.controller,t.rpcAuthority);let o=await _P(n,t,t.internals??{}),i=DS(n,o.controller,t.rpcAuthority);return n.effect(()=>async()=>o.close(),"dsh-im: close Telegram bot connections"),i}import{unlink as RPe}from"node:fs/promises";import{homedir as kPe}from"node:os";import{join as Ou,resolve as il}from"node:path";import{createHash as xve}from"node:crypto";import{mkdir as Yve,readFile as jve,rename as Jve,unlink as qve,writeFile as zve}from"node:fs/promises";import{dirname as Vve}from"node:path";var NP=Object.freeze({version:1,bots:Object.freeze([])});function tl(n){return typeof n=="string"&&n.trim()?n.trim():null}function W6(n){let t=tl(n);return t&&/^wecom_[a-f0-9]{24}$/.test(t)?t:null}function Wve(n){let t=tl(n);return t&&/^DSH_WECOM_BOT_SECRET_[A-F0-9]{24}$/.test(t)?t:null}function OS(n){let t=tl(n);if(!t)throw new TypeError("Enterprise WeChat bot ID is required");let o=xve("sha256").update(t).digest("hex").slice(0,24);return{botId:`wecom_${o}`,secretRef:`DSH_WECOM_BOT_SECRET_${o.toUpperCase()}`}}function RP(n){let t=tl(n)??"";return t?t.length<=10?`${t.slice(0,3)}\u2022\u2022\u2022`:`${t.slice(0,6)}\u2022\u2022\u2022\u2022${t.slice(-4)}`:D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA")}function Z6(n){if(!n||typeof n!="object")return null;let t=W6(n.botId),o=tl(n.remoteBotId),i=Wve(n.secretRef);if(!t||!o||!i)return null;let e=OS(o);return e.botId!==t||e.secretRef!==i?null:Object.freeze({botId:t,remoteBotId:o,secretRef:i,createdAt:tl(n.createdAt)??new Date().toISOString(),connectedAt:tl(n.connectedAt)})}function Zve(n){if(!n||n.version!==1||!Array.isArray(n.bots))return null;let t=n.bots.map(Z6);if(t.some(a=>a===null))return null;let o=new Set,i=new Set,e=new Set;for(let a of t){if(o.has(a.botId)||i.has(a.remoteBotId)||e.has(a.secretRef))return null;o.add(a.botId),i.add(a.remoteBotId),e.add(a.secretRef)}return Object.freeze({version:1,bots:Object.freeze(t)})}var wS=class{#e;#A=NP;#t=Promise.resolve();constructor(t){this.#e=t}async load(){try{let t=Zve(JSON.parse(await jve(this.#e,"utf8")));if(!t)throw new Error("dsh-im Enterprise WeChat config contains invalid bot data");this.#A=t}catch(t){if(t?.code!=="ENOENT")throw t;this.#A=NP}return this}list(){return structuredClone(this.#A.bots)}get(t){let o=this.#A.bots.find(i=>i.botId===t);return o?structuredClone(o):null}getByRemoteBotId(t){let o=this.#A.bots.find(i=>i.remoteBotId===t);return o?structuredClone(o):null}async save(t){let o=Z6(t);if(!o)throw new Error("Refusing to persist incomplete Enterprise WeChat bot data");return this.#r(i=>{let e=i.find(r=>r.remoteBotId===o.remoteBotId&&r.botId!==o.botId),a=i.find(r=>r.secretRef===o.secretRef&&r.botId!==o.botId);if(e||a)throw new Error("Duplicate Enterprise WeChat bot identity");let A=i.findIndex(r=>r.botId===o.botId);return A===-1?i.push(o):i[A]=o,structuredClone(o)})}async remove(t){if(!W6(t))throw new TypeError("Invalid Enterprise WeChat bot ID");return this.#r(o=>{let i=o.findIndex(a=>a.botId===t);if(i===-1)return null;let[e]=o.splice(i,1);return structuredClone(e)})}async clear(){let t=this.#t.then(async()=>{try{await qve(this.#e)}catch(o){if(o?.code!=="ENOENT")throw o}this.#A=NP});this.#t=t.then(()=>{},()=>{}),await t}async#r(t){let o,i=this.#t.then(async()=>{let e=[...this.#A.bots];o=t(e);let a=Object.freeze({version:1,bots:Object.freeze(e)});await this.#c(a),this.#A=a});return this.#t=i.then(()=>{},()=>{}),await i,o}async#c(t){await Yve(Vve(this.#e),{recursive:!0,mode:448});let o=`${this.#e}.tmp`;await zve(o,`${JSON.stringify(t,null,2)} `,{encoding:"utf8",mode:384}),await Jve(o,this.#e)}};var bS=class extends pr{constructor(t){super({...t,rpcIdPrefix:"wecom",logPrefix:"dsh-wecom"})}};var Xve="https://work.weixin.qq.com/ai/qc/generate",$ve="https://work.weixin.qq.com/ai/qc/query_result";function X6(){return process.platform==="win32"?2:process.platform==="linux"?3:1}function md(n){return typeof n=="string"&&n.trim()?n.trim():null}function ePe(n){let t=md(n);if(!t)return null;try{let o=new URL(t);return o.protocol==="https:"&&o.hostname==="work.weixin.qq.com"&&(!o.port||o.port==="443")?o.href:null}catch{return null}}function APe(n,t){return n?AbortSignal.any([n,AbortSignal.timeout(t)]):AbortSignal.timeout(t)}async function $6(n,t,o){let i=await n(t,{method:"GET",redirect:"error",signal:APe(o,1e4),headers:{accept:"application/json"}});if(!i.ok)throw new Error(`Enterprise WeChat QR service returned HTTP ${i.status}`);return i.json()}var MS=class{#e;#A;#t;#r;constructor({fetch:t=globalThis.fetch,clock:o=()=>Date.now(),source:i="deepseek-harness",platform:e=X6()}={}){if(typeof t!="function")throw new TypeError("A fetch implementation is required");this.#e=t,this.#A=o,this.#t=i,this.#r=[1,2,3].includes(e)?e:X6()}async start({signal:t}={}){let o=new URL(Xve);o.searchParams.set("source",this.#t),o.searchParams.set("plat",String(this.#r));let i=await $6(this.#e,o,t),e=md(i?.data?.scode),a=ePe(i?.data?.auth_url);if(!e||!a)throw new Error("Enterprise WeChat QR service returned invalid data");return{scode:e,verificationUrl:a,expiresAt:this.#A()+3e5,pollIntervalMs:3e3}}async poll({scode:t,signal:o}={}){let i=md(t);if(!i)throw new TypeError("Enterprise WeChat QR poll code is required");let e=new URL($ve);e.searchParams.set("scode",i);let a=await $6(this.#e,e,o),A=md(a?.data?.status)?.toLowerCase();if(A==="success"){let r=md(a?.data?.bot_info?.botid),s=md(a?.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(A)?{status:"expired"}:["fail","failed","error"].includes(A)?{status:"failed"}:{status:"waiting"}}};import{mkdir as tPe,readFile as rPe,rename as aPe,unlink as iPe,writeFile as oPe}from"node:fs/promises";import{dirname as nPe}from"node:path";var _S=Object.freeze({version:1,sessions:{},seenMessageIds:[]});function sPe(n){if(!n||typeof n!="object")return structuredClone(_S);let t={};if(n.sessions&&typeof n.sessions=="object"&&!Array.isArray(n.sessions))for(let[o,i]of Object.entries(n.sessions))typeof o=="string"&&typeof i=="string"&&i&&(t[o]=i);return{version:1,sessions:t,seenMessageIds:Array.isArray(n.seenMessageIds)?n.seenMessageIds.filter(o=>typeof o=="string").slice(-1e3):[]}}var TS=class{#e;#A=structuredClone(_S);#t=Promise.resolve();constructor(t){this.#e=t}async load(){try{this.#A=sPe(JSON.parse(await rPe(this.#e,"utf8")))}catch(t){if(t?.code!=="ENOENT")throw t;this.#A=structuredClone(_S),await this.#r()}return this}sessionFor(t){return this.#A.sessions[t]??null}async setSession(t,o){this.#A.sessions[t]=o,await this.#r()}async clearSession(t){delete this.#A.sessions[t],await this.#r()}async clearSessions(){this.#A.sessions={},await this.#r()}hasSeen(t){return this.#A.seenMessageIds.includes(t)}async markSeen(t){this.hasSeen(t)||(this.#A.seenMessageIds.push(t),this.#A.seenMessageIds.length>1e3&&this.#A.seenMessageIds.splice(0,this.#A.seenMessageIds.length-1e3),await this.#r())}async remove(){try{await iPe(this.#e)}catch(t){if(t?.code!=="ENOENT")throw t}this.#A=structuredClone(_S)}async#r(){let t=`${JSON.stringify(this.#A,null,2)} -`,o=this.#t.then(async()=>{await tPe(nPe(this.#e),{recursive:!0,mode:448});let i=`${this.#e}.tmp`;await oPe(i,t,{encoding:"utf8",mode:384}),await aPe(i,this.#e)});this.#t=o.then(()=>{},()=>{}),await o}};import{randomUUID as gPe}from"node:crypto";var e5=new Set(["pending","connecting"]),mu=new Set(["connected","failed","cancelled","expired"]);function rl(n){return typeof n=="string"&&n.trim()?n.trim():null}function Ni(n,t){return Object.freeze({code:n,message:t})}function al(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 Su=class{#e;#A;#t;#r;#c;#a;#n=new Map;#o=new Map;#g=new Map;#l=null;#i=new Map;#I=0;#s=!1;constructor({qrAuth:t,credentials:o,configStore:i,createRuntime:e,deleteState:a=async()=>{},logger:A=console}){if(!t||typeof t.start!="function"||typeof t.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(!i||typeof i.list!="function"||typeof i.save!="function"||typeof i.remove!="function")throw new TypeError("WecomController requires a config store");if(typeof e!="function")throw new TypeError("createRuntime is required");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A}async initialize(){if(this.#s)return this.status();for(let t of this.#t.list())await this.#m(t.botId,async()=>{let o=this.#n.get(t.botId)?.status;if(this.#s||o?.ready||o?.wecomConnectionState==="connecting")return;let i=await this.#B(t.secretRef);if(!i){this.#o.set(t.botId,Ni("missing-secret",D("\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.#E(t,i),this.#o.delete(t.botId)}catch{this.#o.set(t.botId,Ni("connection-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002"))),this.#a.warn?.(`[dsh-im:wecom] bot ${t.botId} failed to initialize`)}finally{this.#Q()}});return this.status()}async startProvisioning(){if(this.#s)throw new Error("Enterprise WeChat controller is closed");this.#l&&await this.cancelProvisioning(this.#l);let t={id:gPe(),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.#g.set(t.id,t),this.#l=t.id,this.#Q();try{let o=await this.#e.start({signal:t.controller.signal});if(t.scode=rl(o.scode),t.verificationUrl=rl(o.verificationUrl),t.expiresAt=Number(o.expiresAt),t.pollIntervalMs=Math.min(1e4,Math.max(500,Number(o.pollIntervalMs)||3e3)),!t.scode||!t.verificationUrl||!Number.isFinite(t.expiresAt))throw new Error("Enterprise WeChat QR auth returned incomplete data");return this.#Q(),al(t)}catch(o){throw t.state=t.controller.signal.aborted?"cancelled":"failed",t.error=t.controller.signal.aborted?Ni("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002")):Ni("qr-start-failed",D("\u65E0\u6CD5\u751F\u6210\u4F01\u4E1A\u5FAE\u4FE1\u4E8C\u7EF4\u7801\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")),this.#S(t),o}}async registrationStatus(t){let o=this.#g.get(t);if(!o||mu.has(o.state))return al(o);if(o.state==="connecting")return await o.transition?.catch(()=>{}),al(o);if(Date.now()>=o.expiresAt)return o.state="expired",o.error=Ni("expired",D("\u4F01\u4E1A\u5FAE\u4FE1\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u3002")),o.controller.abort(),this.#S(o),al(o);if(!o.polling){let i=this.#p(o).finally(()=>{o.polling===i&&(o.polling=null)});o.polling=i}return await o.polling.catch(()=>{}),al(o)}async bindCredentials({botId:t,secret:o}={}){if(this.#s)throw new Error("Enterprise WeChat controller is closed");let i=rl(t),e=rl(o);if(!i||!e)throw new TypeError("Enterprise WeChat Bot ID and Secret are required");if(this.#l&&await this.cancelProvisioning(this.#l),this.#s)throw new Error("Enterprise WeChat controller is closed");let a=OS(i);return await this.#m(a.botId,async()=>{if(this.#s)throw new Error("Enterprise WeChat controller is closed");let A=this.#t.getByRemoteBotId(i),r=await this.#A.resolve(a.secretRef).catch(()=>{});if(this.#s)throw new Error("Enterprise WeChat controller is closed");let s={botId:a.botId,remoteBotId:i,secretRef:a.secretRef,createdAt:A?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()};await this.#A.set(a.secretRef,e);try{await this.#t.save(s)}catch(g){throw await this.#u(a.secretRef,r),g}try{await this.#E(s,e),this.#o.delete(a.botId)}catch{this.#o.set(a.botId,Ni("connection-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u5DF2\u7ED1\u5B9A\uFF0C\u6D88\u606F\u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002"))),this.#a.warn?.(`[dsh-im:wecom] bot ${a.botId} credential connection failed`)}this.#Q()}),this.status()}async cancelProvisioning(t){let o=this.#g.get(t);return o?(mu.has(o.state)||(o.controller.abort(),await Promise.allSettled([o.polling,o.transition].filter(Boolean)),mu.has(o.state)||(o.state="cancelled"),o.error??=Ni("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002")),this.#S(o)),al(o)):null}async reconnectBot(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Enterprise WeChat bot");return await this.#m(t,async()=>{let i=await this.#B(o.secretRef);if(!i)throw new Error("Enterprise WeChat bot secret is missing");try{await this.#E(o,i),this.#o.delete(t)}catch(e){throw this.#o.set(t,Ni("connection-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"))),e}finally{this.#Q()}}),this.status()}async sendConnectionTest(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Enterprise WeChat bot");return this.#m(t,async()=>{let i=this.#n.get(t);if(!i?.status?.ready||typeof i.sendConnectionTest!="function")throw lr(D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA"));return i.sendConnectionTest(Oa(D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\uFF08{botId}\uFF09",{botId:RP(o.remoteBotId)})))})}async deleteBot(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Enterprise WeChat bot");return await this.#m(t,async()=>{let i=await this.#A.resolve(o.secretRef).catch(()=>{});await this.#C(t);try{await this.#A.unset(o.secretRef),await this.#t.remove(t)}catch(e){throw i?.value&&(await this.#A.set(o.secretRef,i.value).catch(()=>{}),await this.#E(o,i.value).catch(()=>{})),new Error("Unable to remove the Enterprise WeChat bot safely.",{cause:e})}await this.#c({botId:t,config:o}).catch(e=>{this.#a.warn?.(`[dsh-im:wecom] bot ${t} state cleanup failed:`,e)}),this.#o.delete(t),this.#Q()}),this.status()}status(){let t=this.#t.list().map(e=>{let a=this.#n.get(e.botId)?.status??null,A=a?.ready===!0&&a.wecomConnectionState==="connected"&&a.harnessReachable===!0,r=A?"connected":a?.wecomConnectionState==="connecting"?"connecting":this.#o.has(e.botId)||a?.wecomConnectionState==="failed"?"error":"offline";return{botId:e.botId,state:r,connected:A,configured:!0,bot:{name:D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA"),appIdMasked:RP(e.remoteBotId)},health:{status:A?"healthy":r==="error"?"error":"offline",summary:A?D("\u4F01\u4E1A\u5FAE\u4FE1 WebSocket \u957F\u8FDE\u63A5\u8FD0\u884C\u6B63\u5E38"):r==="error"?D("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5"):D("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF"),lastCheckedAt:a?.lastCheckedAt??null,lastConnectedAt:a?.lastConnectedAt??null},stats:{messagesReceived:a?.messagesReceived??0,messagesReplied:a?.messagesReplied??0},lastMessageError:zr(a?.lastMessageError),error:structuredClone(this.#o.get(e.botId)??null)}}),o=t.filter(e=>e.connected).length,i=this.#l?this.#g.get(this.#l):null;return{schemaVersion:1,revision:this.#I,state:i&&e5.has(i.state)?"provisioning":t.length===0?"disconnected":o===t.length?"connected":o>0?"degraded":"offline",bots:t,totals:{configured:t.length,connected:o},...i&&e5.has(i.state)?{provisioning:al(i)}:{}}}async close(){this.#s||(this.#s=!0,this.#l&&await this.cancelProvisioning(this.#l),await Promise.allSettled([...this.#i.values()]),await Promise.allSettled([...this.#n.keys()].map(t=>this.#C(t))))}async#p(t){try{let o=await this.#e.poll({scode:t.scode,signal:t.controller.signal});if(t.controller.signal.aborted||mu.has(t.state)||o.status==="waiting")return;if(o.status==="expired"){t.state="expired",t.error=Ni("expired",D("\u4F01\u4E1A\u5FAE\u4FE1\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u3002")),this.#S(t);return}if(o.status!=="success"){t.state="failed",t.error=Ni("qr-connect-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u626B\u7801\u6CA1\u6709\u5B8C\u6210\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801\u3002")),this.#S(t);return}t.state="connecting",t.verificationUrl=null,t.expiresAt=null,t.scode=null,this.#Q();let i=this.#d(t,o);t.transition=i,await i}catch{if(t.controller.signal.aborted)return;t.state="failed",t.error=Ni("qr-connect-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u626B\u7801\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801\u3002")),this.#a.warn?.("[dsh-im:wecom] QR polling failed"),this.#S(t)}}async#d(t,o){try{let i=rl(o.remoteBotId),e=rl(o.secret);if(!i||!e)throw new Error("Enterprise WeChat authorization returned incomplete credentials");t.botId=await this.#h(t,{remoteBotId:i,secret:e}),t.state="connected",t.error=null}catch{t.controller.signal.aborted?(t.state="cancelled",t.error=Ni("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002"))):(t.state="failed",t.error=Ni("activation-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u65E0\u6CD5\u5B89\u5168\u4FDD\u5B58\u63A5\u5165\u914D\u7F6E\u3002")),this.#a.error?.("[dsh-im:wecom] provisioning failed"))}finally{this.#S(t)}}async#h(t,{remoteBotId:o,secret:i}){let e=OS(o),a=this.#t.getByRemoteBotId(o),A=await this.#A.resolve(e.secretRef).catch(()=>{}),r={botId:e.botId,remoteBotId:o,secretRef:e.secretRef,createdAt:a?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()};return this.#m(e.botId,async()=>{await this.#A.set(e.secretRef,i);try{if(t.controller.signal.aborted)throw new DOMException("Cancelled","AbortError");await this.#t.save(r)}catch(s){throw await this.#u(e.secretRef,A),s}try{if(t.controller.signal.aborted)throw new DOMException("Cancelled","AbortError");await this.#E(r,i),this.#o.delete(e.botId)}catch(s){if(t.controller.signal.aborted)throw await this.#C(e.botId),a?await this.#t.save(a).catch(()=>{}):await this.#t.remove(e.botId).catch(()=>null)&&await this.#c({botId:e.botId,config:r}).catch(c=>{this.#a.warn?.("[dsh-im:wecom] cancelled bot state cleanup failed:",c)}),await this.#u(e.secretRef,A),s;this.#o.set(e.botId,Ni("connection-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u5DF2\u7ED1\u5B9A\uFF0C\u6D88\u606F\u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002"))),this.#a.warn?.(`[dsh-im:wecom] bot ${e.botId} activation connection failed`)}return this.#Q(),e.botId})}async#E(t,o){if(this.#s)throw new Error("Enterprise WeChat controller is closed");if(await this.#C(t.botId),this.#s)throw new Error("Enterprise WeChat controller is closed");let i=await this.#r({botId:t.botId,config:t,secret:o});if(!i||typeof i.start!="function"||typeof i.stop!="function")throw new TypeError("createRuntime returned an invalid Enterprise WeChat runtime");this.#n.set(t.botId,i);try{await i.start()}catch(e){throw await i.stop().catch(()=>{}),this.#n.delete(t.botId),e}}async#C(t){let o=this.#n.get(t);this.#n.delete(t),await o?.stop().catch(i=>{this.#a.warn?.(`[dsh-im:wecom] bot ${t} failed to stop cleanly:`,i)})}async#B(t){let o=await this.#A.resolve(t).catch(()=>{});return rl(o?.value)}async#u(t,o){o?.value?await this.#A.set(t,o.value).catch(()=>{}):await this.#A.unset(t).catch(()=>{})}#m(t,o){let a=(this.#i.get(t)??Promise.resolve()).catch(()=>{}).then(o).finally(()=>{this.#i.get(t)===a&&this.#i.delete(t)});return this.#i.set(t,a),a}#S(t){t.scode=null,t.verificationUrl=null,t.expiresAt=null,this.#l===t.id&&(this.#l=null),this.#Q();let o=[...this.#g.values()].filter(i=>mu.has(i.state));for(;o.length>16;)this.#g.delete(o.shift().id)}#Q(){this.#I+=1}};import{WSAuthFailureError as OPe,WSClient as bPe,WSReconnectExhaustedError as MPe}from"@wecom/aibot-node-sdk";import{generateReqId as cPe}from"@wecom/aibot-node-sdk";var GP=12e4;function IPe(){return[D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002"),"",D("\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002"),D("/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"),D("/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"),D("/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09"),D("/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A"),D("/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84"),D("/sessionlist [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"),D("/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"),D("/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"),D("/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7"),D("/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7"),D("/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B"),D("\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]"),D("/presetlist \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset"),D("/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset"),D("\u7EAF\u6570\u5B57 ID\uFF1A/preset id:"),D("/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"),D("/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1"),D("/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"),D("/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09"),D("/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21"),D("/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21"),D("/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"),D("/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C"),D("/help \u663E\u793A\u672C\u5E2E\u52A9")].join(` +`,o=this.#t.then(async()=>{await tPe(nPe(this.#e),{recursive:!0,mode:448});let i=`${this.#e}.tmp`;await oPe(i,t,{encoding:"utf8",mode:384}),await aPe(i,this.#e)});this.#t=o.then(()=>{},()=>{}),await o}};import{randomUUID as gPe}from"node:crypto";var e5=new Set(["pending","connecting"]),mu=new Set(["connected","failed","cancelled","expired"]);function rl(n){return typeof n=="string"&&n.trim()?n.trim():null}function Ni(n,t){return Object.freeze({code:n,message:t})}function al(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 Su=class{#e;#A;#t;#r;#c;#a;#n=new Map;#o=new Map;#g=new Map;#l=null;#i=new Map;#I=0;#s=!1;constructor({qrAuth:t,credentials:o,configStore:i,createRuntime:e,deleteState:a=async()=>{},logger:A=console}){if(!t||typeof t.start!="function"||typeof t.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(!i||typeof i.list!="function"||typeof i.save!="function"||typeof i.remove!="function")throw new TypeError("WecomController requires a config store");if(typeof e!="function")throw new TypeError("createRuntime is required");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A}async initialize(){if(this.#s)return this.status();for(let t of this.#t.list())await this.#m(t.botId,async()=>{let o=this.#n.get(t.botId)?.status;if(this.#s||o?.ready||o?.wecomConnectionState==="connecting")return;let i=await this.#B(t.secretRef);if(!i){this.#o.set(t.botId,Ni("missing-secret",D("\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.#E(t,i),this.#o.delete(t.botId)}catch{this.#o.set(t.botId,Ni("connection-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002"))),this.#a.warn?.(`[dsh-im:wecom] bot ${t.botId} failed to initialize`)}finally{this.#Q()}});return this.status()}async startProvisioning(){if(this.#s)throw new Error("Enterprise WeChat controller is closed");this.#l&&await this.cancelProvisioning(this.#l);let t={id:gPe(),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.#g.set(t.id,t),this.#l=t.id,this.#Q();try{let o=await this.#e.start({signal:t.controller.signal});if(t.scode=rl(o.scode),t.verificationUrl=rl(o.verificationUrl),t.expiresAt=Number(o.expiresAt),t.pollIntervalMs=Math.min(1e4,Math.max(500,Number(o.pollIntervalMs)||3e3)),!t.scode||!t.verificationUrl||!Number.isFinite(t.expiresAt))throw new Error("Enterprise WeChat QR auth returned incomplete data");return this.#Q(),al(t)}catch(o){throw t.state=t.controller.signal.aborted?"cancelled":"failed",t.error=t.controller.signal.aborted?Ni("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002")):Ni("qr-start-failed",D("\u65E0\u6CD5\u751F\u6210\u4F01\u4E1A\u5FAE\u4FE1\u4E8C\u7EF4\u7801\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002")),this.#S(t),o}}async registrationStatus(t){let o=this.#g.get(t);if(!o||mu.has(o.state))return al(o);if(o.state==="connecting")return await o.transition?.catch(()=>{}),al(o);if(Date.now()>=o.expiresAt)return o.state="expired",o.error=Ni("expired",D("\u4F01\u4E1A\u5FAE\u4FE1\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u3002")),o.controller.abort(),this.#S(o),al(o);if(!o.polling){let i=this.#p(o).finally(()=>{o.polling===i&&(o.polling=null)});o.polling=i}return await o.polling.catch(()=>{}),al(o)}async bindCredentials({botId:t,secret:o}={}){if(this.#s)throw new Error("Enterprise WeChat controller is closed");let i=rl(t),e=rl(o);if(!i||!e)throw new TypeError("Enterprise WeChat Bot ID and Secret are required");if(this.#l&&await this.cancelProvisioning(this.#l),this.#s)throw new Error("Enterprise WeChat controller is closed");let a=OS(i);return await this.#m(a.botId,async()=>{if(this.#s)throw new Error("Enterprise WeChat controller is closed");let A=this.#t.getByRemoteBotId(i),r=await this.#A.resolve(a.secretRef).catch(()=>{});if(this.#s)throw new Error("Enterprise WeChat controller is closed");let s={botId:a.botId,remoteBotId:i,secretRef:a.secretRef,createdAt:A?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()};await this.#A.set(a.secretRef,e);try{await this.#t.save(s)}catch(g){throw await this.#u(a.secretRef,r),g}try{await this.#E(s,e),this.#o.delete(a.botId)}catch{this.#o.set(a.botId,Ni("connection-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u5DF2\u7ED1\u5B9A\uFF0C\u6D88\u606F\u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002"))),this.#a.warn?.(`[dsh-im:wecom] bot ${a.botId} credential connection failed`)}this.#Q()}),this.status()}async cancelProvisioning(t){let o=this.#g.get(t);return o?(mu.has(o.state)||(o.controller.abort(),await Promise.allSettled([o.polling,o.transition].filter(Boolean)),mu.has(o.state)||(o.state="cancelled"),o.error??=Ni("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002")),this.#S(o)),al(o)):null}async reconnectBot(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Enterprise WeChat bot");return await this.#m(t,async()=>{let i=await this.#B(o.secretRef);if(!i)throw new Error("Enterprise WeChat bot secret is missing");try{await this.#E(o,i),this.#o.delete(t)}catch(e){throw this.#o.set(t,Ni("connection-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"))),e}finally{this.#Q()}}),this.status()}async sendConnectionTest(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Enterprise WeChat bot");return this.#m(t,async()=>{let i=this.#n.get(t);if(!i?.status?.ready||typeof i.sendConnectionTest!="function")throw lr(D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA"));return i.sendConnectionTest(Oa(D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\uFF08{botId}\uFF09",{botId:RP(o.remoteBotId)})))})}async deleteBot(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Enterprise WeChat bot");return await this.#m(t,async()=>{let i=await this.#A.resolve(o.secretRef).catch(()=>{});await this.#C(t);try{await this.#A.unset(o.secretRef),await this.#t.remove(t)}catch(e){throw i?.value&&(await this.#A.set(o.secretRef,i.value).catch(()=>{}),await this.#E(o,i.value).catch(()=>{})),new Error("Unable to remove the Enterprise WeChat bot safely.",{cause:e})}await this.#c({botId:t,config:o}).catch(e=>{this.#a.warn?.(`[dsh-im:wecom] bot ${t} state cleanup failed:`,e)}),this.#o.delete(t),this.#Q()}),this.status()}status(){let t=this.#t.list().map(e=>{let a=this.#n.get(e.botId)?.status??null,A=a?.ready===!0&&a.wecomConnectionState==="connected"&&a.harnessReachable===!0,r=A?"connected":a?.wecomConnectionState==="connecting"?"connecting":this.#o.has(e.botId)||a?.wecomConnectionState==="failed"?"error":"offline";return{botId:e.botId,state:r,connected:A,configured:!0,bot:{name:D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA"),appIdMasked:RP(e.remoteBotId)},health:{status:A?"healthy":r==="error"?"error":"offline",summary:A?D("\u4F01\u4E1A\u5FAE\u4FE1 WebSocket \u957F\u8FDE\u63A5\u8FD0\u884C\u6B63\u5E38"):r==="error"?D("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5"):D("\u4F01\u4E1A\u5FAE\u4FE1\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF"),lastCheckedAt:a?.lastCheckedAt??null,lastConnectedAt:a?.lastConnectedAt??null},stats:{messagesReceived:a?.messagesReceived??0,messagesReplied:a?.messagesReplied??0},lastMessageError:zr(a?.lastMessageError),error:structuredClone(this.#o.get(e.botId)??null)}}),o=t.filter(e=>e.connected).length,i=this.#l?this.#g.get(this.#l):null;return{schemaVersion:1,revision:this.#I,state:i&&e5.has(i.state)?"provisioning":t.length===0?"disconnected":o===t.length?"connected":o>0?"degraded":"offline",bots:t,totals:{configured:t.length,connected:o},...i&&e5.has(i.state)?{provisioning:al(i)}:{}}}async close(){this.#s||(this.#s=!0,this.#l&&await this.cancelProvisioning(this.#l),await Promise.allSettled([...this.#i.values()]),await Promise.allSettled([...this.#n.keys()].map(t=>this.#C(t))))}async#p(t){try{let o=await this.#e.poll({scode:t.scode,signal:t.controller.signal});if(t.controller.signal.aborted||mu.has(t.state)||o.status==="waiting")return;if(o.status==="expired"){t.state="expired",t.error=Ni("expired",D("\u4F01\u4E1A\u5FAE\u4FE1\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u3002")),this.#S(t);return}if(o.status!=="success"){t.state="failed",t.error=Ni("qr-connect-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u626B\u7801\u6CA1\u6709\u5B8C\u6210\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801\u3002")),this.#S(t);return}t.state="connecting",t.verificationUrl=null,t.expiresAt=null,t.scode=null,this.#Q();let i=this.#d(t,o);t.transition=i,await i}catch{if(t.controller.signal.aborted)return;t.state="failed",t.error=Ni("qr-connect-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u626B\u7801\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801\u3002")),this.#a.warn?.("[dsh-im:wecom] QR polling failed"),this.#S(t)}}async#d(t,o){try{let i=rl(o.remoteBotId),e=rl(o.secret);if(!i||!e)throw new Error("Enterprise WeChat authorization returned incomplete credentials");t.botId=await this.#h(t,{remoteBotId:i,secret:e}),t.state="connected",t.error=null}catch{t.controller.signal.aborted?(t.state="cancelled",t.error=Ni("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002"))):(t.state="failed",t.error=Ni("activation-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u65E0\u6CD5\u5B89\u5168\u4FDD\u5B58\u63A5\u5165\u914D\u7F6E\u3002")),this.#a.error?.("[dsh-im:wecom] provisioning failed"))}finally{this.#S(t)}}async#h(t,{remoteBotId:o,secret:i}){let e=OS(o),a=this.#t.getByRemoteBotId(o),A=await this.#A.resolve(e.secretRef).catch(()=>{}),r={botId:e.botId,remoteBotId:o,secretRef:e.secretRef,createdAt:a?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()};return this.#m(e.botId,async()=>{await this.#A.set(e.secretRef,i);try{if(t.controller.signal.aborted)throw new DOMException("Cancelled","AbortError");await this.#t.save(r)}catch(s){throw await this.#u(e.secretRef,A),s}try{if(t.controller.signal.aborted)throw new DOMException("Cancelled","AbortError");await this.#E(r,i),this.#o.delete(e.botId)}catch(s){if(t.controller.signal.aborted)throw await this.#C(e.botId),a?await this.#t.save(a).catch(()=>{}):await this.#t.remove(e.botId).catch(()=>null)&&await this.#c({botId:e.botId,config:r}).catch(c=>{this.#a.warn?.("[dsh-im:wecom] cancelled bot state cleanup failed:",c)}),await this.#u(e.secretRef,A),s;this.#o.set(e.botId,Ni("connection-failed",D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u5DF2\u7ED1\u5B9A\uFF0C\u6D88\u606F\u8FDE\u63A5\u6682\u672A\u5C31\u7EEA\u3002"))),this.#a.warn?.(`[dsh-im:wecom] bot ${e.botId} activation connection failed`)}return this.#Q(),e.botId})}async#E(t,o){if(this.#s)throw new Error("Enterprise WeChat controller is closed");if(await this.#C(t.botId),this.#s)throw new Error("Enterprise WeChat controller is closed");let i=await this.#r({botId:t.botId,config:t,secret:o});if(!i||typeof i.start!="function"||typeof i.stop!="function")throw new TypeError("createRuntime returned an invalid Enterprise WeChat runtime");this.#n.set(t.botId,i);try{await i.start()}catch(e){throw await i.stop().catch(()=>{}),this.#n.delete(t.botId),e}}async#C(t){let o=this.#n.get(t);this.#n.delete(t),await o?.stop().catch(i=>{this.#a.warn?.(`[dsh-im:wecom] bot ${t} failed to stop cleanly:`,i)})}async#B(t){let o=await this.#A.resolve(t).catch(()=>{});return rl(o?.value)}async#u(t,o){o?.value?await this.#A.set(t,o.value).catch(()=>{}):await this.#A.unset(t).catch(()=>{})}#m(t,o){let a=(this.#i.get(t)??Promise.resolve()).catch(()=>{}).then(o).finally(()=>{this.#i.get(t)===a&&this.#i.delete(t)});return this.#i.set(t,a),a}#S(t){t.scode=null,t.verificationUrl=null,t.expiresAt=null,this.#l===t.id&&(this.#l=null),this.#Q();let o=[...this.#g.values()].filter(i=>mu.has(i.state));for(;o.length>16;)this.#g.delete(o.shift().id)}#Q(){this.#I+=1}};import{WSAuthFailureError as OPe,WSClient as bPe,WSReconnectExhaustedError as MPe}from"@wecom/aibot-node-sdk";import{generateReqId as cPe}from"@wecom/aibot-node-sdk";var GP=12e4;function IPe(){return[D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002"),"",D("\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u6216\u6587\u4EF6\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002"),D("/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"),D("/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"),D("/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09"),D("/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A"),D("/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84"),D("/sessionlist \u6216 /sessions [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"),D("/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"),D("/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"),D("/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7"),D("/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7"),D("/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B"),D("\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]"),D("/presetlist \u6216 /presets \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset"),D("/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset"),D("\u7EAF\u6570\u5B57 ID\uFF1A/preset id:"),D("/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"),D("/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1"),D("/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"),D("/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09"),D("/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21"),D("/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21"),D("/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"),D("/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C"),D("/help \u663E\u793A\u672C\u5E2E\u52A9")].join(` `)}var lPe=18e3,A5=5*1024*1024,a5=4;function Ca(n){return typeof n=="string"&&n.trim()?n.trim():null}function ls(n){return n?.body&&typeof n.body=="object"?n.body:{}}function t5(n){let t=ls(n);return t.chattype==="group"?`group:${t.chatid}`:`direct:${t.from?.userid}`}function UP(n){let t=ls(n),o="";return t.msgtype==="text"?o=typeof t.text?.content=="string"?t.text.content.trim():"":t.msgtype==="voice"?o=typeof t.voice?.content=="string"?t.voice.content.trim():"":t.msgtype==="mixed"&&Array.isArray(t.mixed?.msg_item)&&(o=t.mixed.msg_item.filter(i=>i?.msgtype==="text"&&typeof i.text?.content=="string").map(i=>i.text.content).join(` `).trim()),t.chattype==="group"?o.replace(/^\s*@\S+(?:\s+|$)/u,"").trim():o}function pPe(n){let t=ls(n);return t.msgtype==="image"?[t.image]:t.msgtype!=="mixed"||!Array.isArray(t.mixed?.msg_item)?[]:t.mixed.msg_item.filter(o=>o?.msgtype==="image").map(o=>o.image)}function dPe(n){let t=ls(n);return t.msgtype==="file"&&t.file&&typeof t.file=="object"?[t.file]:[]}function hPe(n,t){let o=Ca(t?.url);if(!o)return null;let i=Ca(t?.aeskey)??void 0;return{async load({signal:e,maxBytes:a}){if(e?.throwIfAborted(),typeof n?.downloadFile!="function")throw new Error("Enterprise WeChat image download is unavailable");let A=await n.downloadFile(o,i);e?.throwIfAborted();let r=A?.buffer;if(!Buffer.isBuffer(r)&&!(r instanceof Uint8Array))throw new Error("Enterprise WeChat image download returned no data");let s=Buffer.from(r);if(Number.isFinite(a)&&s.length>a)throw new ut("image-too-large",`Enterprise WeChat image exceeds ${a} bytes`,D("\u56FE\u7247\u8D85\u8FC7 5 MB\uFF0C\u8BF7\u538B\u7F29\u540E\u91CD\u8BD5\u3002"));return{data:s,name:A?.filename}}}}function EPe(n,t){let o=Ca(t?.url);if(!o)return null;let i=Ca(t?.aeskey)??void 0;return{name:Ca(t?.filename??t?.file_name??t?.name)??"file",async load({signal:e}={}){if(e?.throwIfAborted(),typeof n?.downloadFile!="function")throw new Error("Enterprise WeChat file download is unavailable");let a=await n.downloadFile(o,i);e?.throwIfAborted();let A=a?.buffer??a?.data;if(!Buffer.isBuffer(A)&&!(A instanceof Uint8Array))throw new Error("Enterprise WeChat file download returned no data");return{data:Buffer.from(A),...Ca(a?.filename)?{name:a.filename.trim()}:{}}}}}function kP(n,t){return{content:UP(n),images:pPe(n).map(o=>hPe(t,o)).filter(Boolean),files:dPe(n).map(o=>EPe(t,o)).filter(Boolean)}}function CPe(n,t){return!Array.isArray(n?.files)||n.files.length===0?n:{...n,files:n.files.map(o=>{let i=o.load({signal:t});return i.catch(()=>{}),{...o,async load({signal:e}={}){e?.throwIfAborted();let a=await i;return e?.throwIfAborted(),a}}})}}function uPe(n,t){return Vt(n)?{...n,images:n.images.map(o=>{let i=o.load({signal:t,maxBytes:A5});return i.catch(()=>{}),{...o,async load({signal:e,maxBytes:a=A5}={}){e?.throwIfAborted();let A=await i;e?.throwIfAborted();let r=A?.data??A?.buffer??A;if((Buffer.isBuffer(r)||r instanceof Uint8Array?r.length:0)>a)throw new ut("image-too-large",`Enterprise WeChat image exceeds ${a} bytes`,D("\u56FE\u7247\u8D85\u8FC7 5 MB\uFF0C\u8BF7\u538B\u7F29\u540E\u91CD\u8BD5\u3002"));return A}}})}:n}function BPe(n){return{...n,images:n.images.map(t=>({...t,async load(){throw new ut("image-queue-full",`Enterprise WeChat already has ${a5} prefetched images`,D("\u5F53\u524D\u5F85\u5904\u7406\u56FE\u7247\u8F83\u591A\uFF0C\u8BF7\u7A0D\u540E\u91CD\u65B0\u53D1\u9001\u3002"))}}))}}function FP(n){return ls(n).msgtype==="text"?UP(n):""}function fPe(n){return ls(n).msgtype==="text"&&!!Ca(UP(n))}function NS(n,t=lPe){let o=String(n??"").trim();if(!o)return[];let i=[],e="",a=0;for(let A of o){let r=Buffer.byteLength(A);e&&a+r>t?(i.push(e),e=A,a=r):(e+=A,a+=r)}return e&&i.push(e),i}function QPe(n){return n?.type==="tool"?D("\u6B63\u5728\u4F7F\u7528{name}\u2026",{name:n.name}):n?.text}function Du(n,t="",{finish:o=!1}={}){let i=String(n??"").replace(/<\/?think>/gi,"").trim(),e=String(t??"").trim();if(!i)return e;let a=o||e?`${i}`:`${i}`;return e?`${a} ${e}`:a}function yPe(n,t){let o=String(n??D("\u7ED3\u679C\u6587\u4EF6")).replace(/[\r\n]+/g," ").trim()||D("\u7ED3\u679C\u6587\u4EF6");switch(t?.code){case"artifact-delivery-uncertain":return D("\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:o});case"artifact-permission-required":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u4F01\u4E1A\u5FAE\u4FE1\u667A\u80FD\u673A\u5668\u4EBA\u7F3A\u5C11\u7D20\u6750\u4E0A\u4F20\u6216\u6587\u4EF6\u6D88\u606F\u80FD\u529B\uFF0C\u8BF7\u68C0\u67E5\u673A\u5668\u4EBA\u6743\u9650\u3002",{name:o});case"artifact-too-large":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u8D85\u8FC7\u5F53\u524D\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u53EF\u53D1\u9001\u7684\u6587\u4EF6\u5927\u5C0F\uFF0C\u672A\u53D1\u9001\u3002",{name:o});case"artifact-empty":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u4E3A\u7A7A\uFF0C\u4F01\u4E1A\u5FAE\u4FE1\u4E0D\u5141\u8BB8\u53D1\u9001\u7A7A\u6587\u4EF6\u3002",{name:o});case"artifact-changed":case"artifact-invalid":case"artifact-unavailable":return D("\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:o});case"artifact-rate-limited":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u6682\u65F6\u88AB\u4F01\u4E1A\u5FAE\u4FE1\u9650\u6D41\uFF0C\u672A\u80FD\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o});case"artifact-provider-rejected":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u4F01\u4E1A\u5FAE\u4FE1\u62D2\u7EDD\u4E86\u8BE5\u6587\u4EF6\u6216\u6587\u4EF6\u6D88\u606F\u3002",{name:o});default:return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u6682\u65F6\u672A\u80FD\u901A\u8FC7\u4F01\u4E1A\u5FAE\u4FE1\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o})}}function LP(n){return n?.reason instanceof Error?n.reason:new DOMException("The operation was aborted","AbortError")}function r5(n,t){return t?(t.throwIfAborted(),new Promise((o,i)=>{let e=!1,a=(r,s)=>{e||(e=!0,t.removeEventListener("abort",A),r(s))},A=()=>a(i,LP(t));t.addEventListener("abort",A,{once:!0}),Promise.resolve(n).then(r=>a(o,r),r=>a(i,r)),t.aborted&&A()})):n}function vP(n,{dispatched:t=!1}={}){if(n?.code?.startsWith?.("artifact-"))return n;let o=Number(n?.httpStatus??n?.status??n?.response?.status),i=Number(n?.providerCode??n?.errcode??n?.body?.errcode),e=new Error("Enterprise WeChat file delivery failed",{cause:n});return o===401||o===403||i===48002?e.code="artifact-permission-required":o===413?e.code="artifact-too-large":o===429||i===45009?e.code="artifact-rate-limited":Number.isFinite(i)&&i!==0?e.code="artifact-provider-rejected":e.code=t?"artifact-delivery-uncertain":"artifact-provider-failed",Number.isFinite(o)&&(e.status=o),Number.isFinite(i)&&(e.providerCode=i),e}async function i5(n,t,o,i,{signal:e,timeoutMs:a=GP}={}){if(e?.throwIfAborted(),typeof n?.uploadMedia!="function"||typeof n?.sendMediaMessage!="function"){let d=new Error(`Enterprise WeChat ${i} delivery is unavailable`);throw d.code="artifact-provider-unavailable",d}let A=AbortSignal.timeout(a),r=e?AbortSignal.any([e,A]):A,s;try{let d=n.uploadMedia(o.bytes,{type:i,filename:o.fileName});on(o,d),s=await r5(d,r)}catch(d){throw e?.aborted?LP(e):vP(d)}e?.throwIfAborted();let g=Ca(s?.media_id);if(!g){let d=new Error(`Enterprise WeChat ${i} upload returned no media id`);throw d.code="artifact-provider-rejected",d}let c;try{let d=n.sendMediaMessage(t,i,g);on(o,d),c=await r5(d,r)}catch(d){throw e?.aborted?LP(e):vP(d,{dispatched:!0})}e?.throwIfAborted();let I=Number(c?.body?.errcode??c?.errcode);if(Number.isFinite(I)&&I!==0)throw vP({providerCode:I});return c}function mPe(n,t,o,i){return i5(n,t,o,"image",i)}function SPe(n,t,o,i){return i5(n,t,o,"file",i)}function DPe(n,t){return typeof n=="string"&&n.trim()?n:t.length>0?D("\u7ED3\u679C\u6587\u4EF6\u5DF2\u751F\u6210\u3002"):D("\u4EFB\u52A1\u5DF2\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u751F\u6210\u53EF\u663E\u793A\u7684\u6587\u672C\u3002")}function PP(n){return Ca(n?.body?.msgid)??Ca(n?.body?.message_id)}function wPe(n,t){return t.questions[t.index]&&Ca(ls(n).from?.userid)===t.actor&&Ca(FP(n))}function HP(){return{messagesReceived:0,messagesReplied:0,messagesRejected:0,artifactsSent:0,artifactSendErrors:0,lastMessageAt:null,lastReplyAt:null,lastRejectedAt:null,lastError:null,lastMessageError:null}}var RS=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l;#i=new Map;#I=new Map;#s=new Map;#p=new Map;#d=new Set;#h=new Set;#E;#C=new Bi;#B=0;constructor({client:t,harness:o,state:i,contextEnhancement:e,status:a=HP(),logger:A=console,replyTimeoutMs:r=6e5,generateStreamId:s=cPe,fileUploadTimeoutMs:g=GP,signal:c}){if(!t||typeof t.replyStream!="function"||typeof t.sendMessage!="function")throw new TypeError("Enterprise WeChat client is required");if(!o||!i)throw new TypeError("Harness client and state store are required");if(!Number.isInteger(g)||g<1)throw new TypeError("fileUploadTimeoutMs must be a positive integer");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s,this.#l=Math.min(g,GP),this.#g=c,this.#E=new pi({label:"wecom",logger:A})}get status(){return structuredClone(this.#c)}accept(t){if(this.#g?.aborted)return Promise.resolve();let o=ls(t),i=Ca(o.msgid),e=Ca(o.from?.userid),a=o.chattype==="group"?Ca(o.chatid):e;if(!i||!e||!a||!["single","group"].includes(o.chattype)||this.#t.hasSeen(i)||this.#p.has(i))return Promise.resolve();let A=t5(t);this.#p.set(i,Zr(this.#r,o.chattype==="single"?"direct":"group")),o.chattype==="single"&&lo(this.#t,{chatId:a});let r=this.#I.get(A),s=kP(t,this.#e),g=Ca(s.content)??"",c=Qo(g),I=this.#C.status(A);if(c&&o.chattype==="group")return this.#m(t,i,a,{message:Kn()});if(o.chattype==="single"&&(c||I.phase==="collecting")){let Q=/^\/batch$/iu.test(g)&&I.phase==="idle"&&(this.#i.has(A)||r||this.#E.hasPending(A))?{handled:!0,kind:"busy",message:yo()}:this.#C.handle(A,g,{plainText:fPe(t)});if(Q.handled)return Q.kind==="submit"?this.#u({...t,body:{...o,msgtype:"text",text:{content:Q.prompt}}},i,A,{batchSubmission:Q}):this.#m(t,i,a,Q)}let d=Ei(g)?xi:Ft(s)?null:Yi(g)?Ci:ji(g)?Ji:qi(g)?ui:null;if(d){let f;return f=this.#S(t,i,a,A,s,d).catch(Q=>{if(Q?.code==="turn-stopped"||this.#g?.aborted)return;this.#c.lastError=Q?.message??String(Q);let y=At(this.#c,Q);return this.#a.error?.(`[dsh-im:wecom] failed to process a command [${y.referenceId}]`),this.#y(t,a,dt(y)).catch(()=>{})}).finally(()=>{this.#p.delete(i),this.#h.delete(f)}),this.#h.add(f),f}let B=this.#E.claimReply({key:A,actor:e,messageId:i,text:FP(t),addressed:!0,hasPendingQuestion:!!r,questionCompletion:r?.submitting||r?.claimedReplyMessageId?r.queue:null,isQuestionPending:()=>this.#I.has(A),send:f=>this.#y(t,a,f)});if(B){let f;return f=B.process(async()=>this.#t.hasSeen(i)?!1:(await this.#t.markSeen(i),this.#c.messagesReceived+=1,this.#c.lastMessageAt=new Date().toISOString(),!0)).finally(()=>{this.#p.delete(i),this.#d.delete(f)}),this.#d.add(f),f}if(r&&r.actor!==e)return this.#u(t,i,A);if(r?.submitting||r?.claimedReplyMessageId)return this.#u(t,i,A);if(r){wPe(t,r)&&(r.claimedReplyMessageId=i);let Q=(r.queue??Promise.resolve()).catch(()=>{}).then(()=>this.#R(t,i,e,a,A,r)).finally(()=>{this.#p.delete(i),r.claimedReplyMessageId===i&&(r.claimedReplyMessageId=null),r.queue===Q&&(r.queue=null)});return r.queue=Q,Q}return this.#u(t,i,A)}#u(t,o,i,{releaseMessageId:e=!0,alreadyRecorded:a=!1,batchSubmission:A=null}={}){let r=kP(t,this.#e),s=r.images.length,g=0,c=r;s>0&&(this.#B+s<=a5?(g=s,this.#B+=g,c=uPe(r,this.#g)):c=BPe(r)),c=CPe(c,this.#g);let d=(this.#i.get(i)??Promise.resolve()).catch(()=>{}).then(()=>this.#b(t,{alreadyRecorded:a,preparedMessage:c,batchSubmission:A})).finally(()=>{this.#B-=g,e&&this.#p.delete(o),this.#i.get(i)===d&&this.#i.delete(i)});return this.#i.set(i,d),d}#m(t,o,i,e){let a;return a=Promise.resolve().then(async()=>{this.#t.hasSeen(o)||(await this.#t.markSeen(o),this.#c.messagesReceived+=1,this.#c.lastMessageAt=new Date().toISOString(),e.message&&await this.#y(t,i,e.message),this.#c.lastError=null)}).catch(async A=>{if(this.#g?.aborted)return;this.#c.lastError=A?.message??String(A);let r=At(this.#c,A);this.#a.error?.(`[dsh-im:wecom] failed to process a batch input message [${r.referenceId}]`),await this.#y(t,i,dt(r)).catch(()=>{})}).finally(()=>{this.#p.delete(o),this.#h.delete(a)}),this.#h.add(a),a}async waitForIdle(){await Promise.allSettled([...this.#i.values(),...[...this.#I.values()].flatMap(t=>t.queue?[t.queue]:[]),...this.#d,...this.#h])}async#S(t,o,i,e,a,A){if(this.#g?.throwIfAborted(),this.#t.hasSeen(o))return;await this.#t.markSeen(o),this.#c.messagesReceived+=1,this.#c.lastMessageAt=new Date().toISOString();let r=await A(a.content,this.#A,this.#t,e,{signal:this.#g,isDirect:ls(t).chattype==="single",hasImages:Vt(a),hasFiles:Ft(a),pendingInteraction:this.#I.has(e)||this.#E.hasPending(e),control:{owner:this,key:e}});r?.stopped&&await Promise.allSettled([this.#T(e),this.#E.closeRoute(e)]);for(let s of r?.messages??[r?.message])s&&await this.#y(t,i,s);this.#c.lastError=null}async#Q(t,o){let i=[];for(let e of NS(o)){this.#g?.throwIfAborted();let a=await this.#e.sendMessage(t,{msgtype:"markdown",markdown:{content:e}}),A=PP(a);A&&i.push(A)}return i}async#y(t,o,i){this.#g?.throwIfAborted();let e=NS(i);if(e.length!==0)try{await this.#e.replyStream(t,this.#o("stream"),e[0],!0);for(let a of e.slice(1))await this.#e.sendMessage(o,{msgtype:"markdown",markdown:{content:a}})}catch{await this.#Q(o,i)}}async#f(t,o,i=[],e=null){if(i.length===0)return{receipt:e,failureNoticeVisible:!1,artifactSendErrors:0};let a=await Do({artifacts:i,baseReceipt:e,deliveryId:o,aggregatePresentation:e?"wecom-text-and-files":"wecom-files",alwaysMerge:!0,channelKey:"wecom",signal:this.#g,sendImage:A=>mPe(this.#e,t,A,{signal:this.#g,timeoutMs:this.#l}),sendFile:A=>SPe(this.#e,t,A,{signal:this.#g,timeoutMs:this.#l}),onFailure:(A,r)=>At(this.#c,r,{userMessage:yPe(A?.fileName,r),reason:r?.code}),sendFailureNotice:(A,r,s)=>this.#Q(t,dt(s)),logger:this.#a});return this.#c.artifactsSent=(this.#c.artifactsSent??0)+a.artifactsSent,this.#c.artifactSendErrors=(this.#c.artifactSendErrors??0)+a.artifactSendErrors,{receipt:a.receipt,failureNoticeVisible:a.failureNoticeVisible,artifactSendErrors:a.artifactSendErrors}}async#b(t,{alreadyRecorded:o=!1,preparedMessage:i,batchSubmission:e=null}={}){if(this.#g?.aborted)return;let a=ls(t),A=typeof a.msgid=="string"?a.msgid:"",r=typeof a.from?.userid=="string"?a.from.userid:"",s=a.chattype==="group"?a.chatid:r;if(!A||!r||!s||!["single","group"].includes(a.chattype))return;if(!o){if(this.#t.hasSeen(A))return;this.#c.messagesReceived+=1,this.#c.lastMessageAt=new Date().toISOString()}let g=i??kP(t,this.#e),c=g.content,I=Vt(g),d=Ft(g),B=t5(t),f=null,Q=!1,y=D("\u6B63\u5728\u601D\u8003\u4E2D\u2026"),m="",_=e===null,T=!1;try{if(!c&&!I&&!d){await this.#y(t,s,D("\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u3001\u6587\u4EF6\u548C\u8BED\u97F3\u8F6C\u5199\u6D88\u606F\u3002")),await this.#t.markSeen(A);return}let R=c.toLowerCase();if(!I&&!d&&R==="/help"){await this.#y(t,s,IPe()),await this.#t.markSeen(A);return}if(!I&&!d&&R==="/status"){await this.#A.ensureRunning({signal:this.#g}),await this.#y(t,s,D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA\u4E0E DeepSeek Harness \u8FDE\u63A5\u6B63\u5E38\u3002")),await this.#t.markSeen(A);return}if(!I&&!d&&R==="/new"){await this.#t.clearSession(B),await this.#y(t,s,D("\u5DF2\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002\u8BF7\u53D1\u9001\u4F60\u7684\u95EE\u9898\u3002")),await this.#t.markSeen(A);return}let F=I||d?null:await uo(c,this.#A,B);if(F){for(let ie of F.messages??[F.message])await this.#y(t,s,ie);await this.#t.markSeen(A);return}let j=I||d?null:await hi(c,this.#A,this.#t,B,{signal:this.#g});if(j){await this.#y(t,s,j.message),await this.#t.markSeen(A);return}f=this.#o("stream");try{await this.#e.replyStream(t,f,Du(y),!1),Q=!0}catch(ie){this.#a.warn?.("[dsh-im:wecom] unable to start a stream; using an active reply:",ie)}let U=I?await Eo(g,{signal:this.#g}):void 0,z=this.#p.get(A);z&&(U=fo(U??c,z,()=>({channel:"wecom",senderId:r}))),await this.#t.markSeen(A),T=!0;let{answer:q,artifacts:x=[]}=await di({harness:this.#A,state:this.#t,key:B,text:c,content:U,createOptions:{signal:this.#g},existsOptions:{signal:this.#g},askOptions:{timeoutMs:this.#n,signal:this.#g,control:{owner:this,key:B},onUpdate:Q&&typeof this.#e.replyStreamNonBlocking=="function"?async ie=>{ie?.type==="text"?m=ie.text:y=QPe(ie)||y;let we=NS(Du(y,m))[0];we&&await this.#e.replyStreamNonBlocking(t,f,we,!1)}:void 0,onInteraction:ie=>this.#w(ie,{key:B,actor:r,chatId:s,requiresMention:a.chattype==="group"}),onInteractionResolved:ie=>this.#D(ie),files:g.files}});e&&(this.#C.complete(B,e.token),_=!0),this.#g?.throwIfAborted();let G=DPe(q,x),J=NS(Du(y,G,{finish:!0})),H=!1,N=null,k=null;try{if(Q&&J.length>0)try{let ie=[],we=await this.#e.replyStream(t,f,J[0],!0),se=PP(we);se&&ie.push(se);for(let Ne of J.slice(1)){let fe=await this.#e.sendMessage(s,{msgtype:"markdown",markdown:{content:Ne}}),Se=PP(fe);Se&&ie.push(Se)}H=!0,N=Wt({deliveryId:A,presentation:"wecom-text",providerMessageIds:ie})}catch(ie){this.#a.warn?.("[dsh-im:wecom] stream finalization failed; using an active reply:",ie)}if(!H){let ie=await this.#Q(s,G);N=Wt({deliveryId:A,presentation:"wecom-text",providerMessageIds:ie})}}catch(ie){k=ba(ie),this.#a.warn?.("[dsh-im:wecom] final text delivery failed; continuing with result files:",ie)}let V=await this.#f(s,A,x,N),te=V.receipt?.artifacts?.some(({outcome:ie})=>ie==="sent"||ie==="unknown");if(k&&!te&&!V.failureNoticeVisible)throw k;return k&&V.artifactSendErrors===0&&At(this.#c,k),T||await this.#t.markSeen(A),this.#c.messagesReplied+=1,this.#c.lastReplyAt=new Date().toISOString(),this.#c.lastError=null,!k&&V.artifactSendErrors===0&&po(this.#c),V.receipt}catch(R){let F=null;if(!_&&e&&(R?.code==="turn-stopped"?this.#C.complete(B,e.token):F=this.#C.fail(B,e.token).message??null,_=!0),R?.code==="turn-stopped"){Q&&f&&await this.#e.replyStream(t,f,Du(y,D("\u5DF2\u505C\u6B62\u3002"),{finish:!0}),!0).catch(()=>{}),T||await this.#t.markSeen(A);return}if(this.#g?.aborted)return;this.#c.lastError=R?.message??String(R);let j=So(R)??Co(R),U=At(this.#c,R,{userMessage:j,reason:Ki(R)?.reason});this.#a.error?.(`[dsh-im:wecom] failed to process an inbound message [${U.referenceId}]`);let z=dt(U),q=F?`${z} @@ -406,7 +406,7 @@ ${e}`:a}function yPe(n,t){let o=String(n??D("\u7ED3\u679C\u6587\u4EF6")).replace ${F}`:z;try{Q&&f?await this.#e.replyStream(t,f,Du(y,q,{finish:!0}),!0):await this.#y(t,s,q),T||await this.#t.markSeen(A)}catch{this.#a.error?.("[dsh-im:wecom] failed to send the safe error reply")}}finally{await Promise.allSettled([this.#T(B),this.#E.closeRoute(B)])}}async#R(t,o,i,e,a,A){if(this.#g?.aborted)return;let r=this.#I.get(a),s=A.claimedReplyMessageId===o;if(!r||r!==A||r.submitting)return s&&(!r||r!==A)?this.#P(t,o,e):this.#u(t,o,a,{releaseMessageId:!1});if(this.#t.hasSeen(o))return;await this.#t.markSeen(o),this.#c.messagesReceived+=1,this.#c.lastMessageAt=new Date().toISOString();let g=Ca(FP(t));if(!g){await this.#y(t,e,D("\u8BF7\u7528\u6587\u5B57\u56DE\u7B54\u5F53\u524D\u95EE\u9898\u3002")).catch(()=>{});return}let c=this.#I.get(a);if(!c||c!==A||c.submitting){if(s&&(!c||c!==A)){await this.#y(t,e,D("\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002")).catch(()=>{});return}return this.#u(t,o,a,{releaseMessageId:!1,alreadyRecorded:!0})}if(c.actor!==i)return this.#u(t,o,a,{releaseMessageId:!1,alreadyRecorded:!0});if(c.chatId=e,c.needsPresentation){try{await this.#M(c)}catch{this.#c.lastError=D("\u4F01\u4E1A\u5FAE\u4FE1\u4EA4\u4E92\u95EE\u9898\u53D1\u9001\u5931\u8D25\u3002"),this.#a.error?.("[dsh-im:wecom] failed to retry an interaction question"),c.interaction.reconnect?.();return}let d=this.#I.get(a);if(!d||d!==A||d.submitting){if(s&&(!d||d!==A)){await this.#y(t,e,D("\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002")).catch(()=>{});return}return this.#u(t,o,a,{releaseMessageId:!1,alreadyRecorded:!0})}}let I=c.questions[c.index];if(I){if(c.answers.push(li(I,g)),c.index+=1,c.index{});return}if(this.#I.get(a)!==c)return;c.submitting=!1,c.answers.pop(),c.index-=1,this.#c.lastError=D("\u56DE\u7B54\u63D0\u4EA4\u5931\u8D25\u3002"),this.#a.error?.("[dsh-im:wecom] failed to answer a Harness interaction"),await this.#y(t,e,D("\u56DE\u7B54\u63D0\u4EA4\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u53D1\u9001\u5F53\u524D\u95EE\u9898\u7684\u7B54\u6848\u3002")).catch(()=>{})}}}async#w(t,{key:o,actor:i,chatId:e,requiresMention:a}){if(t?.kind==="approval")return this.#E.handleRequested(t,{key:o,actor:i,requiresMention:a,send:c=>this.#Q(e,c)});if(t?.kind!=="question")return;let A=t?.payload?.questions,r=typeof t?.interactionId=="string"?t.interactionId:t?.rpcId;if(typeof t?.rpcId!="string"||typeof r!="string"||typeof t.sessionId!="string"||!Array.isArray(A)||A.length===0||A.some(c=>!ci(c))){this.#a.warn?.("[dsh-im:wecom] ignored an invalid Harness question interaction");return}if(t.recovered===!0){await t.respond({ok:!1,error:{code:"cancelled",message:"Enterprise WeChat safely cancelled an interaction left by an earlier client.",details:{}}}),await this.#Q(e,D("\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(()=>{});return}let s=this.#I.get(o);if(s?.interactionId===r){s.interaction=t,s.needsPresentation&&await this.#M(s);return}if(this.#s.has(r))return;if(s){this.#a.warn?.("[dsh-im:wecom] cancelled a second pending Harness question"),await t.respond({ok:!1,error:{code:"cancelled",message:"Enterprise WeChat is already handling another user interaction.",details:{}}});return}let g={kind:"question",interactionId:r,sessionId:t.sessionId,interaction:t,actor:i,requiresMention:a,questions:A,answers:[],index:0,chatId:e,queue:null,claimedReplyMessageId:null,submitting:!1,needsPresentation:!0,presentationPromise:null};this.#I.set(o,g),this.#s.set(g.interactionId,o),await this.#M(g)}async#D(t){if(t?.kind==="approval"){await this.#E.handleResolved(t);return}let o=t?.interactionId;if(t?.kind!=="question"||typeof o!="string")return;let i=this.#s.get(o);i&&this.#L(i,o)}#M(t){if(!t.needsPresentation)return Promise.resolve();if(t.presentationPromise)return t.presentationPromise;let o=t.questions[t.index];if(!o)return Promise.resolve();let i=this.#Q(t.chatId,Ii(o,t.index,t.questions.length,{requiresMention:t.requiresMention})).then(()=>{t.needsPresentation=!1}).finally(()=>{t.presentationPromise===i&&(t.presentationPromise=null)});return t.presentationPromise=i,i}async#P(t,o,i){this.#t.hasSeen(o)||(await this.#t.markSeen(o),this.#c.messagesReceived+=1,this.#c.lastMessageAt=new Date().toISOString(),await this.#y(t,i,D("\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002")).catch(()=>{}))}#_(t,o){let i=this.#I.get(t);return!i||o!==void 0&&i.interactionId!==o?null:(this.#I.delete(t),this.#s.delete(i.interactionId),i)}#L(t,o){return this.#_(t,o)!==null}async#T(t){let o=this.#_(t);if(!(!o||o.kind!=="question"))try{await o.interaction.respond({ok:!1,error:{code:"cancelled",message:"The Enterprise WeChat interaction ended before the user answered.",details:{}}},{signal:AbortSignal.timeout(5e3)})}catch(i){i?.code!=="interaction-not-pending"&&this.#a.warn?.("[dsh-im:wecom] failed to cancel a pending Harness interaction")}}};function _Pe(){let n=new Error("Enterprise WeChat WebSocket authentication timed out");return n.code="connect-timeout",n}function TPe(){return{startedAt:null,ready:!1,wecomConnectionState:"idle",harnessReachable:!1,lastCheckedAt:null,lastConnectedAt:null,lastError:null,...HP()}}var wu=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l;#i=TPe();#I=null;#s=null;#p=null;#d=null;#h=null;constructor({config:t,secret:o,harness:i,state:e,contextEnhancement:a,logger:A=console,replyTimeoutMs:r=6e5,connectTimeoutMs:s=2e4,maxReconnectAttempts:g=10,createClient:c=I=>new bPe(I)}){if(!t||!o||!i||!e)throw new TypeError("WecomRuntime requires config, secret, Harness, and state");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s,this.#g=g,this.#l=c}get status(){return structuredClone(this.#i)}async start(){if(this.#i.ready&&this.#I)return this.status;if(this.#p)return this.#p;this.#h?.abort(new DOMException("Enterprise WeChat runtime replaced","AbortError"));let t=new AbortController;return this.#d=t,this.#h=t,this.#p=this.#E(t.signal).finally(()=>{this.#d===t&&(this.#d=null),this.#p=null}),this.#p}async#E(t){await this.#C(),t.throwIfAborted(),this.#i.startedAt=new Date().toISOString(),this.#i.wecomConnectionState="connecting",this.#i.lastError=null,await this.#t.ensureRunning(),this.#i.harnessReachable=!0;let o={debug(){},info(){},warn(){},error(){}},i=this.#l({botId:this.#e.remoteBotId,secret:this.#A,logger:o,maxReconnectAttempts:this.#g});if(!i||typeof i.connect!="function"||typeof i.disconnect!="function")throw new TypeError("Enterprise WeChat client factory returned an invalid client");this.#I=i,this.#s=new RS({client:i,harness:this.#t,state:this.#r,contextEnhancement:this.#c,status:this.#i,logger:this.#a,replyTimeoutMs:this.#n,signal:t});let e,a,A=!1,r=new Promise((f,Q)=>{e=f,a=Q}),s=()=>{if(this.#I!==i||t.aborted)return;A=!0;let f=Date.now();this.#i.ready=!0,this.#i.wecomConnectionState="connected",this.#i.lastCheckedAt=f,this.#i.lastConnectedAt=f,this.#i.lastError=null,e()},g=()=>{this.#I===i&&(this.#i.ready=!1,this.#i.wecomConnectionState="connecting",this.#i.lastCheckedAt=Date.now())},c=()=>{this.#I===i&&(this.#i.ready=!1,this.#i.wecomConnectionState="connecting",this.#i.lastCheckedAt=Date.now())},I=f=>{if(this.#I!==i)return;let Q=f instanceof OPe||f instanceof MPe;!A&&Q&&a(f),Q&&(this.#i.ready=!1,this.#i.wecomConnectionState="failed"),this.#i.lastError=Q?f.name:"connection-error",this.#a.warn?.(`[dsh-im:wecom] bot ${this.#e.botId} connection error`)},d=f=>this.#s?.accept(f);i.on("authenticated",s),i.on("disconnected",g),i.on("reconnecting",c),i.on("error",I),i.on("message",d);let B;try{return i.connect(),await Promise.race([r,new Promise((f,Q)=>{t.addEventListener("abort",()=>Q(t.reason),{once:!0})}),new Promise((f,Q)=>{B=setTimeout(()=>Q(_Pe()),this.#o)})]),this.status}catch(f){throw t.aborted?(await this.#C(),f):(this.#i.ready=!1,this.#i.wecomConnectionState="failed",this.#i.lastError=f?.message??String(f),await this.#C(),f)}finally{clearTimeout(B)}}async stop(){let t=this.#p;return this.#d?.abort(new DOMException("Enterprise WeChat runtime stopped","AbortError")),this.#h?.abort(new DOMException("Enterprise WeChat runtime stopped","AbortError")),this.#h=null,await this.#C(),await t?.catch(()=>{}),this.status}async sendConnectionTest(t){return qg({state:this.#r,text:t,channelLabel:D("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA"),send:async({chatId:o},i)=>{if(!this.#i.ready||!this.#I)throw new Error("Enterprise WeChat runtime is not connected");await this.#I.sendMessage(o,{msgtype:"markdown",markdown:{content:i}})}})}async#C(){let t=this.#I,o=this.#s;this.#I=null,this.#s=null;try{t?.disconnect(),t?.removeAllListeners?.()}catch{this.#a.warn?.(`[dsh-im:wecom] bot ${this.#e.botId} failed to stop cleanly`)}await o?.waitForIdle(),this.#i.ready=!1,this.#i.wecomConnectionState="idle"}};var o5=Object.freeze([250,1e3,3e3,5e3,1e4,3e4]);function NPe(n){if(!Array.isArray(n)||n.length===0)return[...o5];let t=n.filter(o=>Number.isFinite(o)&&o>=0);return t.length>0?t:[...o5]}var kS=class{#e;#A;#t;#r;#c;#a;#n;#o=null;#g=null;#l=0;#i=!1;#I=!1;#s;#p;constructor({controller:t,harness:o,logger:i=console,retryDelaysMs:e,healthyIntervalMs:a=15e3,setTimeoutImpl:A=setTimeout,clearTimeoutImpl:r=clearTimeout}){if(!t||typeof t.initialize!="function"||typeof t.status!="function")throw new TypeError("ConnectionSupervisor requires a controller");if(!o||typeof o.ensureRunning!="function")throw new TypeError("ConnectionSupervisor requires a Harness client");this.#e=t,this.#A=o,this.#t=i,this.#r=NPe(e),this.#c=Number.isFinite(a)&&a>=0?a:15e3,this.#a=A,this.#n=r,this.#s=new Promise(s=>{this.#p=s})}get ready(){return this.#s}start(){return this.#I||this.#i?this:(this.#I=!0,this.#d(0),this)}async close(){this.#i||(this.#i=!0,this.#o!==null&&this.#n(this.#o),this.#o=null,await this.#g?.catch(()=>{}),this.#p?.(null),this.#p=null)}#d(t){this.#i||(this.#o=this.#a(()=>{this.#o=null,this.#h()},t),this.#o?.unref?.())}async#h(){if(this.#i||this.#g)return;let t=this.#E();this.#g=t;try{await t}finally{this.#g===t&&(this.#g=null)}}async#E(){try{if(await this.#A.ensureRunning(),this.#i)return;let t=await this.#e.initialize();if(this.#i)return;this.#p?.(t),this.#p=null;let{configured:o,connected:i}=t.totals;if(iNa(n),B=vPe(t),f=await new e(B.config).load(),Q=il(t.workspace??process.cwd()),y=o.WorkspaceStore??$r,m=o.workspaces??await new y(B.workspaces,{defaultWorkspace:Q}).load(),_=f.list();await m.reconcile(_.map(V=>V.botId)),await Promise.all(_.map(V=>m.ensure(V.botId,{defaultAgentPreset:t.agentPreset})));let T=typeof f.remove=="function"?Pa(f,{workspaces:m}):f,R=o.qrAuth??new g({source:t.qrSource??"deepseek-harness",platform:t.qrPlatform}),F=new Map,j=V=>il(B.bots,V,"state.json"),U=async V=>{let te=F.get(V);return te||(te=await new a(j(V)).load(),F.set(V,te)),te},z=La(n,o.commandExecutor),{controlExecutor:q,sessionMaintenanceExecutor:x,fileIngressExecutor:G}=Ua(n,{controlExecutor:o.controlExecutor,sessionMaintenanceExecutor:o.sessionMaintenanceExecutor,fileIngressExecutor:o.fileIngressExecutor}),J=new A({...i,workspace:Q,autostart:!1,dshBin:t.dshBin??"dsh",...z?{commandExecutor:z}:{},...q?{controlExecutor:q}:{},...x?{sessionMaintenanceExecutor:x}:{},...G?{fileIngressExecutor:G}:{}}),H=new r({qrAuth:R,credentials:n.credentials,configStore:T,logger:I,createRuntime:async({botId:V,config:te,secret:ie})=>{let we=await U(V);await m.ensure(V,{defaultAgentPreset:t.agentPreset});let se=Ga(J,{botId:V,workspaces:m,state:we,agentPresetCatalog:d});return new s({config:te,secret:ie,harness:se.harness,state:se.state,contextEnhancement:{botId:V,getSettings:()=>m.contextEnhancementFor(V)},replyTimeoutMs:t.replyTimeoutMs??6e5,connectTimeoutMs:t.connectTimeoutMs??2e4,maxReconnectAttempts:t.maxReconnectAttempts??10,logger:{error:(...Ne)=>I.error?.(`[${V}]`,...Ne),warn:(...Ne)=>I.warn?.(`[${V}]`,...Ne),info:(...Ne)=>I.info?.(`[${V}]`,...Ne),debug:(...Ne)=>I.debug?.(`[${V}]`,...Ne)}})},deleteState:async({botId:V})=>{let te=F.get(V);if(F.delete(V),te&&typeof te.remove=="function")await te.remove();else try{await RPe(j(V))}catch(ie){if(ie?.code!=="ENOENT")throw ie}}}),N=Fa(H,{workspaces:m,stateFor:U,agentPresetCatalog:d}),k=c({controller:N,harness:J,logger:I,retryDelaysMs:t.retryDelaysMs,healthyIntervalMs:t.healthyIntervalMs}).start();return{controller:N,ready:k.ready,async close(){await k.close(),await N.close(),J.stopManagedProcess()}}}import PPe from"qrcode";var s5="/wecom",yr=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:yi,setAgentPreset:mi,setContextEnhancement:Qi}),g5=Object.freeze(Object.values(yr)),GPe=new Set(["secret","secretRef","scode","remoteBotId","verificationUrl","bot_info","botid"]);function JP(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function Sd(n,t){return JP(n)&&Object.keys(n).every(o=>t.includes(o))}function YP(n){return typeof n=="string"&&/^[A-Za-z0-9_-]{1,128}$/.test(n)}function n5(n,t){return typeof n=="string"&&n.trim().length>0&&n.length<=t}function FPe(n,t){return JP(t)?n===yr.status?Sd(t,[])?null:"connection.status does not accept fields.":n===yr.beginProvisioning?Sd(t,["locale"])&&(t.locale===void 0||t.locale==="zh-CN")?null:"provision.begin received unsupported fields.":[yr.pollProvisioning,yr.cancelProvisioning].includes(n)?Sd(t,["attemptId"])&&YP(t.attemptId)?null:`${n} requires an attemptId.`:n===yr.bindCredentials?Sd(t,["botId","secret"])&&n5(t.botId,512)&&n5(t.secret,1024)?null:"bot.bind-credentials requires Bot ID and Secret.":n===yr.reconnectBot?Sd(t,["botId","sendTest"])&&YP(t.botId)&&(t.sendTest===void 0||t.sendTest===!0)?null:"bot.reconnect requires a botId and optional sendTest=true.":n===yr.deleteBot?Sd(t,["botId","confirm"])&&YP(t.botId)&&t.confirm===!0?null:"bot.delete requires a botId and confirm=true.":n===yr.setWorkspace?Ka(t)?null:"\u8BF7\u8F93\u5165\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84\u3002":n===yr.setAgentPreset?Ya(t)?null:"\u8BF7\u9009\u62E9 Agent Preset\u3002":n===yr.setContextEnhancement?Ha(t)?null:"\u8BF7\u63D0\u4EA4\u6709\u6548\u7684\u4E0A\u4E0B\u6587\u589E\u5F3A\u8BBE\u7F6E\u3002":"Unknown Enterprise WeChat endpoint.":"Payload must be an object."}function Dd(n){if(Array.isArray(n))return n.map(Dd);if(!JP(n))return n;let t={};for(let[o,i]of Object.entries(n))GPe.has(o)||(t[o]=Dd(i));return t}async function LPe(n){return PPe.toDataURL(n,{type:"image/png",errorCorrectionLevel:"M",margin:2,width:320})}async function jP(n,t){return!n||typeof n.verificationUrl!="string"?Dd(n):Dd({...n,qrCodeDataUrl:await t(n.verificationUrl)})}async function ol(n,t){let o=structuredClone(n);return o?.provisioning&&(o.provisioning=await jP(o.provisioning,t)),Dd(o)}function c5(n,{encodeQr:t=LPe}={}){for(let e of["status","startProvisioning","registrationStatus","cancelProvisioning","bindCredentials","reconnectBot","deleteBot"])if(typeof n?.[e]!="function")throw new TypeError(`A complete Enterprise WeChat controller is required (${e})`);let o=new Map,i=e=>{let a=o.get(e);return a||(o.size>=16&&o.delete(o.keys().next().value),a=Promise.resolve().then(()=>t(e)),o.set(e,a)),a};return async(e,a,A)=>{if(A?.aborted)return{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}};if(!g5.includes(e))return{ok:!1,error:{code:"bad-request",message:"Unknown Enterprise WeChat endpoint."}};let r=FPe(e,a);if(r)return{ok:!1,error:{code:"bad-request",message:r}};try{let s;if(e===yr.status)s=await ol(await n.status(),i);else if(e===yr.beginProvisioning)s=await jP(await n.startProvisioning(),i);else if(e===yr.pollProvisioning){let g=await n.registrationStatus(a.attemptId);if(!g)return{ok:!1,error:{code:"bad-request",message:"The provisioning attempt no longer exists."}};s=await jP(g,i)}else if(e===yr.cancelProvisioning)s=Dd(await n.cancelProvisioning(a.attemptId));else if(e===yr.bindCredentials)s=await ol(await n.bindCredentials(a),i);else if(e===yr.reconnectBot){let g=await n.reconnectBot(a.botId);if(A?.aborted)return{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}};let c;if(a.sendTest===!0)if(!g?.bots?.some(d=>d?.botId===a.botId&&d?.connected===!0)||typeof n.sendConnectionTest!="function")c=ir(lr("\u4F01\u4E1A\u5FAE\u4FE1\u673A\u5668\u4EBA"));else try{await n.sendConnectionTest(a.botId),c=ir()}catch(d){c=ir(d)}s=await ol({...g,...c?{testMessage:c}:{}},i)}else if(e===yr.setWorkspace){if(typeof n.updateWorkspace!="function")throw new Error("Workspace update is unavailable");s=await ol(await n.updateWorkspace(a.botId,a.workspace),i)}else if(e===yr.setContextEnhancement){if(typeof n.updateContextEnhancement!="function")throw new Error("Context enhancement update is unavailable");s=await n.updateContextEnhancement(a.botId,a.config,g=>ol(g,i))}else if(e===yr.setAgentPreset){if(typeof n.updateAgentPreset!="function")throw new Error("Agent preset update is unavailable");s=await ol(await n.updateAgentPreset(a.botId,a.agentPreset),i)}else s=await ol(await n.deleteBot(a.botId),i);return A?.aborted?{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}:{ok:!0,value:s}}catch(s){let g=xa(s);return A?.aborted?{ok:!1,error:{code:"cancelled",message:"The request was cancelled."}}:{ok:!1,error:g??{code:"wecom-operation-failed",message:"\u4F01\u4E1A\u5FAE\u4FE1\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"}}}}}function vS(n,t,o,i){if(!n?.connection?.rpc||typeof n.connection.rpc.handle!="function")throw new TypeError("DSH Host Connection RPC is required");return n.connection.rpc.handle(s5,c5(t,o),{authority:Or(i)})}async function I5(n,t={}){if(t?.controller)return vS(n,t.controller,t.rpcOptions,t.rpcAuthority);let o=await xP(n,t,t.internals),i=vS(n,o.controller,t.rpcOptions,t.rpcAuthority);return n.effect(()=>async()=>o.close(),"dsh-im: close Enterprise WeChat bot connections"),i}import{unlink as xGe}from"node:fs/promises";import{homedir as YGe}from"node:os";import{join as ku,resolve as gl}from"node:path";import{createHash as oGe}from"node:crypto";import{mkdir as nGe,readFile as sGe,rename as gGe,unlink as cGe,writeFile as IGe}from"node:fs/promises";import{dirname as lGe}from"node:path";import{createCipheriv as UPe,createDecipheriv as HPe,createHash as l5,randomBytes as zP,randomUUID as p5}from"node:crypto";var PS="https://ilinkai.weixin.qq.com/",KPe="2.4.6",xPe="3",E5="https://novac2c.cdn.weixin.qq.com/c2c",nl=1800,VP="novac2c.cdn.weixin.qq.com",YPe="bot",jPe=2<<16|1024|6,JPe=15e3,d5=35e3,qPe=3,zPe=new Set(["wait","scaned","confirmed","expired","scaned_but_redirect","need_verifycode","verify_code_blocked","binded_redirect"]),NA=class extends Error{constructor(t,o,i={}){super(o,i),this.name="WeixinApiError",this.code=t,this.status=i.status,this.providerCode=i.providerCode}};function bt(n){return typeof n=="string"&&n.trim()?n.trim():null}function C5(n){let t=n==null?null:String(n).trim();return t&&/^-?[A-Za-z0-9_.:-]{1,160}$/.test(t)?t:void 0}function u5(n,t){return Number.isInteger(t?.status)&&(n.status=t.status),t?.providerCode!==void 0&&(n.providerCode=t.providerCode),n}function bu(n,{fallback:t="artifact-provider-rejected"}={}){if(n?.code?.startsWith?.("artifact-"))return n;let o=Number(n?.status),i=C5(n?.providerCode),e=i??"",a=t,A="Weixin could not prepare the file for delivery.";o===401||o===403||i==="401"||i==="403"||/(?:permission|forbidden|unauthor|access.?denied)/i.test(e)?(a="artifact-permission-required",A="Weixin denied permission to send the file."):o===413||i==="413"||/(?:too.?large|size.?limit)/i.test(e)?(a="artifact-too-large",A="The file exceeds Weixin's size limit."):o===429||i==="429"||/(?:rate.?limit|too.?many)/i.test(e)?(a="artifact-rate-limited",A="Weixin rate-limited file delivery."):t==="artifact-provider-rejected"&&(A="Weixin rejected the file message.");let r=new Error(A,{cause:n});return r.code=a,u5(r,n)}function VPe(n){let t=new Error("Weixin file delivery result is uncertain",{cause:n});return t.code="artifact-delivery-uncertain",u5(t,n)}function qP(n){if(!n||typeof n!="object")return null;for(let t of["ret","errcode"])if(n[t]!==void 0&&n[t]!==0&&n[t]!=="0")return C5(n[t])??"rejected";return null}function WPe(n,t){if(t?.aborted)throw wd(t);let o=Number(n?.status);return n?.code==="network-error"||n?.code==="timeout"||n?.code==="invalid-response"||o>=500&&o<600?VPe(n):bu(n)}function ZPe(n){let t=bt(n);return!t||t.length%4!==0||!/^[A-Za-z0-9+/]+={0,2}$/.test(t)?null:Buffer.from(t,"base64")}function B5(n){let t=bt(n?.aeskey);if(t){if(!/^[0-9a-fA-F]{32}$/.test(t))throw new NA("invalid-image-key","\u5FAE\u4FE1\u56FE\u7247\u7684\u52A0\u5BC6\u5BC6\u94A5\u65E0\u6548\u3002");return Buffer.from(t,"hex")}let o=ZPe(n?.media?.aes_key);if(o?.length===16)return o;if(o?.length===32&&/^[0-9a-fA-F]{32}$/.test(o.toString("ascii")))return Buffer.from(o.toString("ascii"),"hex");throw new NA("invalid-image-key","\u5FAE\u4FE1\u56FE\u7247\u7684\u52A0\u5BC6\u5BC6\u94A5\u65E0\u6548\u3002")}function f5(n,t){let o=Buffer.from(n),i=Buffer.from(t);if(i.length!==16||o.length===0||o.length%16!==0)throw new NA("invalid-image-ciphertext","\u5FAE\u4FE1\u56FE\u7247\u7684\u52A0\u5BC6\u6570\u636E\u65E0\u6548\u3002");try{let e=HPe("aes-128-ecb",i,null);return Buffer.concat([e.update(o),e.final()])}catch(e){throw new NA("image-decryption-failed","\u5FAE\u4FE1\u56FE\u7247\u89E3\u5BC6\u5931\u8D25\u3002",{cause:e})}}function Q5(n){let t=bt(n?.encrypt_query_param);if(t)return`${E5}/download?encrypted_query_param=${encodeURIComponent(t)}`;let o=bt(n?.full_url);if(!o)throw new NA("missing-image-url","\u5FAE\u4FE1\u56FE\u7247\u6CA1\u6709\u53EF\u7528\u7684\u4E0B\u8F7D\u5730\u5740\u3002");let i;try{i=new URL(o)}catch{throw new NA("invalid-image-url","\u5FAE\u4FE1\u56FE\u7247\u7684\u4E0B\u8F7D\u5730\u5740\u65E0\u6548\u3002")}if(i.protocol!=="https:"||i.hostname!==VP||i.port&&i.port!=="443"||!i.pathname.startsWith("/c2c/"))throw new NA("untrusted-image-url","\u5FAE\u4FE1\u56FE\u7247\u7684\u4E0B\u8F7D\u5730\u5740\u4E0D\u53D7\u4FE1\u4EFB\u3002");return i.username="",i.password="",i.hash="",i.toString()}function WP(n,{fetchImpl:t=fetch}={}){if(typeof t!="function")throw new TypeError("fetchImpl must be a function");let o=[];for(let i of n?.item_list??[]){let e=i?.image_item;!e||typeof e!="object"||o.push({name:o.length===0?"image":`image-${o.length+1}`,load:async({signal:a,maxBytes:A})=>{let r=B5(e),s=Q5(e.media),g=await ho(s,{fetchImpl:t,signal:a,maxBytes:A+16,allowedHosts:[VP]});return f5(g,r)}})}return o}async function XPe(n,{fetchImpl:t,signal:o}){let i=await t(new URL(n),{method:"GET",signal:o,redirect:"manual"});if(!i?.ok)throw await i?.body?.cancel?.().catch?.(()=>{}),new NA("file-download-failed",`\u5FAE\u4FE1\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF08HTTP ${i?.status??"unknown"}\uFF09\u3002`,{status:i?.status});return Buffer.from(await i.arrayBuffer())}function ZP(n,{fetchImpl:t=fetch}={}){if(typeof t!="function")throw new TypeError("fetchImpl must be a function");let o=[];for(let i of n?.item_list??[]){let e=i?.file_item;if(!e||typeof e!="object")continue;let a=Number(e.len);o.push({name:bt(e.file_name)??(o.length===0?"file":`file-${o.length+1}`),...Number.isFinite(a)&&a>=0?{size:a}:{},load:async({signal:A}={})=>{A?.throwIfAborted();let r=B5(e),s=Q5(e.media),g=await XPe(s,{fetchImpl:t,signal:A});return A?.throwIfAborted(),f5(g,r)}})}return o}function XP(n){let t=n.toLowerCase().replace(/\.$/,"");return t==="weixin.qq.com"||t.endsWith(".weixin.qq.com")||t==="wechat.com"||t.endsWith(".wechat.com")}function Od(n){let t;try{t=new URL(n)}catch{throw new NA("invalid-base-url","\u5FAE\u4FE1\u670D\u52A1\u8FD4\u56DE\u4E86\u65E0\u6548\u7684\u8FDE\u63A5\u5730\u5740\u3002")}if(t.protocol!=="https:"||!XP(t.hostname)||t.port!==""&&t.port!=="443")throw new NA("untrusted-base-url","\u5FAE\u4FE1\u670D\u52A1\u8FD4\u56DE\u4E86\u4E0D\u53D7\u4FE1\u4EFB\u7684\u8FDE\u63A5\u5730\u5740\u3002");return t.username="",t.password="",t.search="",t.hash="",t.pathname.endsWith("/")||(t.pathname+="/"),t.toString()}function $Pe(n){let t=bt(n);if(!t)throw new NA("invalid-qr","\u5FAE\u4FE1\u670D\u52A1\u6CA1\u6709\u8FD4\u56DE\u626B\u7801\u5730\u5740\u3002");let o;try{o=new URL(t)}catch{throw new NA("invalid-qr","\u5FAE\u4FE1\u670D\u52A1\u8FD4\u56DE\u4E86\u65E0\u6548\u7684\u626B\u7801\u5730\u5740\u3002")}if(o.protocol!=="https:"||!XP(o.hostname))throw new NA("untrusted-qr","\u5FAE\u4FE1\u670D\u52A1\u8FD4\u56DE\u4E86\u4E0D\u53D7\u4FE1\u4EFB\u7684\u626B\u7801\u5730\u5740\u3002");return o.toString()}function y5(){return{"iLink-App-Id":YPe,"iLink-App-ClientVersion":String(jPe)}}function eGe(n){let t={...y5(),"content-type":"application/json",AuthorizationType:"ilink_bot_token","X-WECHAT-UIN":Buffer.from(String(zP(4).readUInt32BE(0)),"utf8").toString("base64")};return bt(n)&&(t.Authorization=`Bearer ${n.trim()}`),t}function Bc(){return{channel_version:KPe,bot_agent:"DeepSeekHarness/1.1.0"}}function AGe(n){return Math.ceil((n+1)/16)*16}function h5(n){let t;try{t=new URL(n)}catch{throw new NA("invalid-upload-url","\u5FAE\u4FE1\u670D\u52A1\u8FD4\u56DE\u4E86\u65E0\u6548\u7684\u6587\u4EF6\u4E0A\u4F20\u5730\u5740\u3002")}if(t.protocol!=="https:"||t.hostname!==VP||t.port&&t.port!=="443"||t.pathname!=="/c2c/upload"||t.username||t.password)throw new NA("untrusted-upload-url","\u5FAE\u4FE1\u670D\u52A1\u8FD4\u56DE\u4E86\u4E0D\u53D7\u4FE1\u4EFB\u7684\u6587\u4EF6\u4E0A\u4F20\u5730\u5740\u3002");return t.hash="",t}function tGe(n,t){let o=bt(n?.upload_full_url);if(o)return h5(o);let i=bt(n?.upload_param);if(!i)throw new NA("missing-upload-url","\u5FAE\u4FE1\u670D\u52A1\u6CA1\u6709\u8FD4\u56DE\u6587\u4EF6\u4E0A\u4F20\u5730\u5740\u3002");let e=new URL(`${E5}/upload`);return e.searchParams.set("encrypted_query_param",i),e.searchParams.set("filekey",t),h5(e)}function rGe(n,t){let o=UPe("aes-128-ecb",t,null);return Buffer.concat([o.update(n),o.final()])}async function aGe(n,t,o,{signal:i}={}){let e;for(let a=1;a<=qPe;a+=1){i?.throwIfAborted();try{let A=await n(t,{method:"POST",headers:{"content-type":"application/octet-stream"},body:o,signal:i?AbortSignal.any([i,AbortSignal.timeout(6e4)]):AbortSignal.timeout(6e4),redirect:"error"});if(A.status>=400&&A.status<500)throw new NA("upload-rejected",`\u5FAE\u4FE1\u6587\u4EF6\u4E0A\u4F20\u88AB\u62D2\u7EDD\uFF08HTTP ${A.status}\uFF09\u3002`,{status:A.status});if(A.status!==200)throw new NA("upload-failed",`\u5FAE\u4FE1\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\uFF08HTTP ${A.status}\uFF09\u3002`,{status:A.status});let r=bt(A.headers.get("x-encrypted-param"));if(await A.body?.cancel?.().catch(()=>{}),!r)throw new NA("invalid-upload-response","\u5FAE\u4FE1\u6587\u4EF6\u4E0A\u4F20\u54CD\u5E94\u7F3A\u5C11\u4E0B\u8F7D\u53C2\u6570\u3002");return r}catch(A){if(i?.aborted)throw wd(i);if(A instanceof NA&&(A.code==="upload-rejected"||A.status<500))throw A;e=A}}throw e instanceof NA?e:new NA("upload-failed","\u5FAE\u4FE1\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\u3002",{cause:e})}function wd(n){return n?.reason instanceof Error?n.reason:new DOMException("The operation was aborted","AbortError")}async function ps(n,{method:t,baseUrl:o,endpoint:i,body:e,token:a,timeoutMs:A=JPe,signal:r,authenticated:s=!0}){let g=Od(o),c=new URL(i,g);if(!XP(c.hostname))throw new NA("untrusted-endpoint","\u62D2\u7EDD\u8BBF\u95EE\u4E0D\u53D7\u4FE1\u4EFB\u7684\u5FAE\u4FE1\u670D\u52A1\u5730\u5740\u3002");let I=new AbortController,d=!1,B=()=>I.abort(r?.reason);if(r?.aborted)throw wd(r);r?.addEventListener("abort",B,{once:!0});let f=A>0?setTimeout(()=>{d=!0,I.abort()},A):null;try{let Q=await n(c,{method:t,headers:s?eGe(a):y5(),...e===void 0?{}:{body:JSON.stringify(e)},signal:I.signal});if(!Q.ok)throw new NA("http-error",`\u5FAE\u4FE1\u670D\u52A1\u8BF7\u6C42\u5931\u8D25\uFF08HTTP ${Q.status}\uFF09\u3002`,{status:Q.status});try{return await Q.json()}catch(y){throw new NA("invalid-response","\u5FAE\u4FE1\u670D\u52A1\u8FD4\u56DE\u4E86\u65E0\u6CD5\u89E3\u6790\u7684\u54CD\u5E94\u3002",{cause:y})}}catch(Q){throw r?.aborted?wd(r):d?new NA("timeout","\u5FAE\u4FE1\u670D\u52A1\u8BF7\u6C42\u8D85\u65F6\u3002",{cause:Q}):Q instanceof NA?Q:new NA("network-error","\u6682\u65F6\u65E0\u6CD5\u8BBF\u95EE\u5FAE\u4FE1\u670D\u52A1\u3002",{cause:Q})}finally{f&&clearTimeout(f),r?.removeEventListener("abort",B)}}function iGe(n){if(!n||typeof n!="object"||!zPe.has(n.status))throw new NA("invalid-login-status","\u5FAE\u4FE1\u670D\u52A1\u8FD4\u56DE\u4E86\u65E0\u6CD5\u8BC6\u522B\u7684\u626B\u7801\u72B6\u6001\u3002");return n}function m5({fetchImpl:n=fetch}={}){if(typeof n!="function")throw new TypeError("fetchImpl must be a function");async function t({baseUrl:o,token:i,toUserId:e,file:a,contextToken:A,runId:r,signal:s},{mediaType:g,createItem:c}){let I=bt(e);if(!I||!a||typeof a!="object"||typeof a.fileName!="string"||!a.fileName||!Buffer.isBuffer(a.bytes))throw new TypeError("toUserId and a file are required");s?.throwIfAborted();let d=zP(16).toString("hex"),B=zP(16),f=l5("md5").update(a.bytes).digest("hex"),Q;try{Q=await ps(n,{method:"POST",baseUrl:o,endpoint:"ilink/bot/getuploadurl",token:i,signal:s,body:{filekey:d,media_type:g,to_user_id:I,rawsize:a.bytes.byteLength,rawfilemd5:f,filesize:AGe(a.bytes.byteLength),no_need_thumb:!0,aeskey:B.toString("hex"),base_info:Bc()}})}catch(x){if(s?.aborted)throw wd(s);let G=Number(x?.status),J=x?.code==="http-error"&&G>=400&&G<500?"artifact-provider-rejected":"artifact-provider-failed";throw bu(x,{fallback:J})}let y=qP(Q);if(y)throw bu(new NA("upload-url-rejected","\u5FAE\u4FE1\u670D\u52A1\u62D2\u7EDD\u4E86\u6587\u4EF6\u4E0A\u4F20\u8BF7\u6C42\u3002",{providerCode:y}));let m=tGe(Q,d),_=rGe(a.bytes,B),T;try{T=await aGe(n,m,_,{signal:s})}catch(x){if(s?.aborted)throw wd(s);let G=Number(x?.status),J=x?.code==="upload-rejected"||G>=400&&G<500?"artifact-provider-rejected":"artifact-provider-failed";throw bu(x,{fallback:J})}s?.throwIfAborted();let R=bt(a.deliveryKey)??bt(a.artifactId)??p5(),F=g===3?R:`${R}\0${g}`,j=`dsh-weixin-${l5("sha256").update(F).digest("hex").slice(0,32)}`,U={encrypt_query_param:T,aes_key:Buffer.from(B.toString("hex")).toString("base64"),encrypt_type:1},z;try{z=await ps(n,{method:"POST",baseUrl:o,endpoint:"ilink/bot/sendmessage",token:i,signal:s,body:{msg:{from_user_id:"",to_user_id:I,client_id:j,message_type:2,message_state:2,item_list:[c({file:a,media:U,ciphertextSize:_.byteLength})],...bt(A)?{context_token:A.trim()}:{},...bt(r)?{run_id:r.trim()}:{}},base_info:Bc()}})}catch(x){throw WPe(x,s)}let q=qP(z);if(q)throw bu(new NA("send-rejected","\u5FAE\u4FE1\u670D\u52A1\u62D2\u7EDD\u4E86\u6587\u4EF6\u6D88\u606F\u3002",{providerCode:q}));return{messageId:j}}return Object.freeze({inboundImages(o){return WP(o,{fetchImpl:n})},inboundFiles(o){return ZP(o,{fetchImpl:n})},async beginLogin({localTokens:o=[],botType:i=xPe,signal:e}={}){let a=[...new Set(o.map(bt).filter(Boolean))].slice(-10),A=await ps(n,{method:"POST",baseUrl:PS,endpoint:`ilink/bot/get_bot_qrcode?bot_type=${encodeURIComponent(i)}`,body:{local_token_list:a},timeoutMs:1e4,signal:e}),r=bt(A?.qrcode);if(!r)throw new NA("invalid-qr","\u5FAE\u4FE1\u670D\u52A1\u6CA1\u6709\u8FD4\u56DE\u4E8C\u7EF4\u7801\u4EE4\u724C\u3002");return{qrcode:r,qrcodeUrl:$Pe(A.qrcode_img_content)}},async pollLogin({qrcode:o,baseUrl:i=PS,verifyCode:e,signal:a}){let A=bt(o);if(!A)throw new TypeError("qrcode is required");let r=`ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(A)}`;bt(e)&&(r+=`&verify_code=${encodeURIComponent(e.trim())}`);let s=await ps(n,{method:"GET",baseUrl:i,endpoint:r,timeoutMs:d5,signal:a,authenticated:!1});return iGe(s)},async getUpdates({baseUrl:o,token:i,getUpdatesBuf:e="",timeoutMs:a,signal:A}){try{return await ps(n,{method:"POST",baseUrl:o,endpoint:"ilink/bot/getupdates",body:{get_updates_buf:e,base_info:Bc()},token:i,timeoutMs:a??d5,signal:A})}catch(r){if(r instanceof NA&&r.code==="timeout")return{ret:0,msgs:[],get_updates_buf:e};throw r}},async getConfig({baseUrl:o,token:i,toUserId:e,contextToken:a,signal:A}){let r=bt(e);if(!r)throw new TypeError("toUserId is required");let s=await ps(n,{method:"POST",baseUrl:o,endpoint:"ilink/bot/getconfig",token:i,signal:A,timeoutMs:1e4,body:{ilink_user_id:r,...bt(a)?{context_token:a.trim()}:{},base_info:Bc()}});if(s?.ret!==void 0&&s.ret!==0)throw new NA("config-rejected","\u5FAE\u4FE1\u670D\u52A1\u62D2\u7EDD\u4E86\u673A\u5668\u4EBA\u914D\u7F6E\u8BF7\u6C42\u3002");return{typingTicket:bt(s?.typing_ticket)}},async sendTyping({baseUrl:o,token:i,toUserId:e,typingTicket:a,status:A,signal:r}){let s=bt(e),g=bt(a);if(!s||!g)throw new TypeError("toUserId and typingTicket are required");if(A!==1&&A!==2)throw new TypeError("typing status must be 1 or 2");let c=await ps(n,{method:"POST",baseUrl:o,endpoint:"ilink/bot/sendtyping",token:i,signal:r,timeoutMs:1e4,body:{ilink_user_id:s,typing_ticket:g,status:A,base_info:Bc()}});if(c?.ret!==void 0&&c.ret!==0)throw new NA("typing-rejected","\u5FAE\u4FE1\u670D\u52A1\u62D2\u7EDD\u4E86\u8F93\u5165\u72B6\u6001\u8BF7\u6C42\u3002");return!0},async sendText({baseUrl:o,token:i,toUserId:e,text:a,contextToken:A,runId:r,signal:s}){let g=bt(e),c=bt(a);if(!g||!c)throw new TypeError("toUserId and text are required");let I=await ps(n,{method:"POST",baseUrl:o,endpoint:"ilink/bot/sendmessage",token:i,signal:s,body:{msg:{from_user_id:"",to_user_id:g,client_id:`dsh-weixin-${p5()}`,message_type:2,message_state:2,item_list:[{type:1,text_item:{text:c}}],...bt(A)?{context_token:A.trim()}:{},...bt(r)?{run_id:r.trim()}:{}},base_info:Bc()}}),d=qP(I);if(d)throw new NA("send-rejected","\u5FAE\u4FE1\u670D\u52A1\u62D2\u7EDD\u4E86\u56DE\u590D\u6D88\u606F\u3002",{providerCode:d});return!0},async sendFile(o){return t(o,{mediaType:3,createItem:({file:i,media:e})=>({type:4,file_item:{media:e,file_name:i.fileName,len:String(i.bytes.byteLength)}})})},async sendImage(o){return t(o,{mediaType:1,createItem:({media:i,ciphertextSize:e})=>({type:2,image_item:{media:i,mid_size:e}})})},async notifyStart({baseUrl:o,token:i,signal:e}){let a=await ps(n,{method:"POST",baseUrl:o,endpoint:"ilink/bot/msg/notifystart",token:i,signal:e,timeoutMs:1e4,body:{base_info:Bc()}});if(a?.ret!==void 0&&a.ret!==0)throw new NA("start-rejected","\u5FAE\u4FE1\u8D26\u53F7\u8FDE\u63A5\u542F\u52A8\u5931\u8D25\u3002");return a},async notifyStop({baseUrl:o,token:i,signal:e}){return ps(n,{method:"POST",baseUrl:o,endpoint:"ilink/bot/msg/notifystop",token:i,signal:e,timeoutMs:1e4,body:{base_info:Bc()}})}})}function sl(n){for(let t of n?.item_list??[]){if(t?.type===1&&typeof t.text_item?.text=="string"){let o=t.text_item.text.trim();if(o)return o}if(t?.type===3&&typeof t.voice_item?.text=="string"){let o=t.voice_item.text.trim();if(o)return o}}return null}function $P(n){return n?.message_id!==void 0&&n.message_id!==null?String(n.message_id):bt(n?.client_id)}function S5(n,t=nl){if(n.length<=t)return[n];let o=[],i=n;for(;i.length>t;){let e=i.lastIndexOf(` `,t);ea===null))return null;let o=new Set,i=new Set,e=new Set;for(let a of t){if(o.has(a.botId)||i.has(a.accountId)||e.has(a.tokenRef))return null;o.add(a.botId),i.add(a.accountId),e.add(a.tokenRef)}return Object.freeze({version:1,accounts:Object.freeze(t)})}var GS=class{#e;#A=eG;#t=Promise.resolve();constructor(t){this.#e=t}async load(){try{let t=dGe(JSON.parse(await sGe(this.#e,"utf8")));if(!t)throw new Error("dsh-weixin config contains invalid account data");this.#A=t}catch(t){if(t?.code!=="ENOENT")throw t;this.#A=eG}return this}list(){return structuredClone(this.#A.accounts)}get(t){let o=this.#A.accounts.find(i=>i.botId===t);return o?structuredClone(o):null}getByAccountId(t){let o=this.#A.accounts.find(i=>i.accountId===t);return o?structuredClone(o):null}async save(t){let o=w5(t);if(!o)throw new Error("Refusing to persist incomplete dsh-weixin account data");return this.#r(i=>{let e=i.find(r=>r.accountId===o.accountId&&r.botId!==o.botId),a=i.find(r=>r.tokenRef===o.tokenRef&&r.botId!==o.botId);if(e||a)throw new Error("Duplicate Weixin account identity");let A=i.findIndex(r=>r.botId===o.botId);return A===-1?i.push(o):i[A]=o,structuredClone(o)})}async remove(t){if(!D5(t))throw new TypeError("Invalid Weixin bot id");return this.#r(o=>{let i=o.findIndex(a=>a.botId===t);if(i===-1)return null;let[e]=o.splice(i,1);return structuredClone(e)})}async clear(){let t=this.#t.then(async()=>{try{await cGe(this.#e)}catch(o){if(o?.code!=="ENOENT")throw o}this.#A=eG});this.#t=t.then(()=>{},()=>{}),await t}async#r(t){let o,i=this.#t.then(async()=>{let e=[...this.#A.accounts];o=t(e);let a=Object.freeze({version:1,accounts:Object.freeze(e)});await this.#c(a),this.#A=a});return this.#t=i.then(()=>{},()=>{}),await i,o}async#c(t){await nGe(lGe(this.#e),{recursive:!0,mode:448});let o=`${this.#e}.tmp`;await IGe(o,`${JSON.stringify(t,null,2)} `,{encoding:"utf8",mode:384}),await gGe(o,this.#e)}};var FS=class extends pr{constructor(t){super({...t,rpcIdPrefix:"weixin",logPrefix:"dsh-weixin"})}};import{mkdir as hGe,readFile as EGe,rename as CGe,unlink as uGe,writeFile as BGe}from"node:fs/promises";import{dirname as fGe}from"node:path";var LS=Object.freeze({version:1,sessions:{},seenMessageIds:[],getUpdatesBuf:""});function QGe(n){if(!n||typeof n!="object")return structuredClone(LS);let t={};if(n.sessions&&typeof n.sessions=="object"&&!Array.isArray(n.sessions))for(let[o,i]of Object.entries(n.sessions))typeof o=="string"&&typeof i=="string"&&i&&(t[o]=i);return{version:1,sessions:t,seenMessageIds:Array.isArray(n.seenMessageIds)?n.seenMessageIds.filter(o=>typeof o=="string").slice(-1e3):[],getUpdatesBuf:typeof n.getUpdatesBuf=="string"?n.getUpdatesBuf:""}}var US=class{#e;#A=structuredClone(LS);#t=Promise.resolve();constructor(t){this.#e=t}async load(){try{this.#A=QGe(JSON.parse(await EGe(this.#e,"utf8")))}catch(t){if(t?.code!=="ENOENT")throw t;this.#A=structuredClone(LS),await this.#r()}return this}sessionFor(t){return this.#A.sessions[t]??null}async setSession(t,o){this.#A.sessions[t]=o,await this.#r()}async clearSession(t){delete this.#A.sessions[t],await this.#r()}async clearSessions(){this.#A.sessions={},await this.#r()}hasSeen(t){return this.#A.seenMessageIds.includes(t)}async markSeen(t){this.hasSeen(t)||(this.#A.seenMessageIds.push(t),this.#A.seenMessageIds.length>1e3&&this.#A.seenMessageIds.splice(0,this.#A.seenMessageIds.length-1e3),await this.#r())}getUpdatesBuf(){return this.#A.getUpdatesBuf}async setGetUpdatesBuf(t){typeof t!="string"||t===this.#A.getUpdatesBuf||(this.#A.getUpdatesBuf=t,await this.#r())}snapshot(){return structuredClone(this.#A)}async remove(){try{await uGe(this.#e)}catch(t){if(t?.code!=="ENOENT")throw t}this.#A=structuredClone(LS)}async#r(){let t=`${JSON.stringify(this.#A,null,2)} -`,o=this.#t.then(async()=>{await hGe(fGe(this.#e),{recursive:!0,mode:448});let i=`${this.#e}.tmp`;await BGe(i,t,{encoding:"utf8",mode:384}),await CGe(i,this.#e)});this.#t=o.then(()=>{},()=>{}),await o}};import{randomUUID as yGe}from"node:crypto";var O5=new Set(["starting","pending","scanned","needs_verification","connecting"]),HS=new Set(["connected","expired","failed","cancelled"]),b5=5*6e4,T5=Object.freeze({"credential-read-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u65E0\u6CD5\u8BFB\u53D6\u73B0\u6709\u767B\u5F55\u51ED\u636E\u3002\u8BF7\u68C0\u67E5 DSH \u51ED\u636E\u5B58\u50A8\u3002","credential-save-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u767B\u5F55\u51ED\u636E\u65E0\u6CD5\u5199\u5165 DSH \u51ED\u636E\u5B58\u50A8\u3002\u8BF7\u68C0\u67E5\u51ED\u636E\u5B58\u50A8\u662F\u5426\u53EF\u5199\u3002","account-config-save-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u8D26\u53F7\u914D\u7F6E\u65E0\u6CD5\u5199\u5165\u672C\u673A\u3002\u8BF7\u68C0\u67E5 DSH_HOME \u76EE\u5F55\u6743\u9650\u3002","runtime-prepare-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u65E0\u6CD5\u521D\u59CB\u5316\u8D26\u53F7\u72B6\u6001\u6216\u5DE5\u4F5C\u533A\u3002\u8BF7\u68C0\u67E5 DSH_HOME \u548C\u5DE5\u4F5C\u533A\u76EE\u5F55\u3002","harness-connect-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u63D2\u4EF6\u65E0\u6CD5\u8FDE\u63A5\u672C\u673A Harness\u3002\u8BF7\u68C0\u67E5 dsh web \u5730\u5740\u548C\u7AEF\u53E3\u3002","harness-timeout":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u5065\u5EB7\u68C0\u67E5\u8D85\u65F6\u3002\u8BF7\u786E\u8BA4 dsh web \u672A\u963B\u585E\u3002","harness-auth-required":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u5065\u5EB7\u68C0\u67E5\u9700\u8981\u8EAB\u4EFD\u8BA4\u8BC1\u3002\u8BF7\u68C0\u67E5\u4EE3\u7406\u3001\u7F51\u5173\u6216\u81EA\u5B9A\u4E49\u9274\u6743\u914D\u7F6E\u3002","harness-proxy-auth-required":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u672C\u673A Harness \u8BF7\u6C42\u88AB\u4EE3\u7406\u8981\u6C42\u8BA4\u8BC1\u3002\u8BF7\u8BA9\u56DE\u73AF\u5730\u5740\u7ED5\u8FC7\u4EE3\u7406\uFF0C\u5E76\u68C0\u67E5 NO_PROXY \u914D\u7F6E\u3002","harness-loopback-forbidden":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u5F02\u5E38\u62D2\u7EDD\u4E86\u56DE\u73AF\u5730\u5740\u7684\u5065\u5EB7\u68C0\u67E5\u3002\u8BF7\u68C0\u67E5 HTTP \u4EE3\u7406\u3001Harness \u6E90\u7801\u7248\u672C\u548C\u6784\u5EFA\u4EA7\u7269\u3002","harness-host-untrusted":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u7684 Host \u4FE1\u4EFB\u68C0\u67E5\u62D2\u7EDD\u4E86\u975E\u56DE\u73AF\u5730\u5740\u8BF7\u6C42\u3002\u8BF7\u68C0\u67E5 harnessBaseUrl \u4E0E trustedHosts \u914D\u7F6E\u3002","harness-request-forbidden":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u5065\u5EB7\u68C0\u67E5\u6536\u5230\u4E86\u975E Harness \u6807\u51C6\u7684 403 \u62D2\u7EDD\u54CD\u5E94\u3002\u8BF7\u68C0\u67E5\u4EE3\u7406\u6216\u7F51\u5173\u914D\u7F6E\u3002","harness-api-not-found":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u627E\u4E0D\u5230 Harness \u5065\u5EB7\u68C0\u67E5\u63A5\u53E3\u3002\u8BF7\u786E\u8BA4 Harness \u4E0E\u63D2\u4EF6\u7248\u672C\u517C\u5BB9\u3002","harness-http-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u5065\u5EB7\u68C0\u67E5\u8FD4\u56DE\u670D\u52A1\u9519\u8BEF\u3002\u8BF7\u67E5\u770B dsh web \u65E5\u5FD7\u3002","harness-response-invalid":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u8FD4\u56DE\u4E86\u65E0\u6CD5\u8BC6\u522B\u7684\u54CD\u5E94\u3002\u8BF7\u786E\u8BA4 Harness \u4E0E\u63D2\u4EF6\u7248\u672C\u517C\u5BB9\u3002","harness-rpc-rejected":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u62D2\u7EDD\u4E86\u5065\u5EB7\u68C0\u67E5\u8BF7\u6C42\u3002\u8BF7\u67E5\u770B dsh web \u65E5\u5FD7\u3002","harness-check-unknown-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u5065\u5EB7\u68C0\u67E5\u53D1\u751F\u672A\u77E5\u9519\u8BEF\u3002\u8BF7\u67E5\u770B dsh web \u65E5\u5FD7\u3002","connection-start-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u6D88\u606F\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25\u3002\u8BF7\u67E5\u770B dsh web \u65E5\u5FD7\u540E\u91CD\u8BD5\u3002"});function bd(n){return typeof n=="string"&&n.trim()?n.trim():null}function mGe(){return new DOMException("Provisioning was cancelled","AbortError")}function M5(n,t){let o=bd(n);return o?Od(o.includes("://")?o:`https://${o}`):Od(t)}function Mu(n){return n?{attemptId:n.id,status:n.state,...n.verificationUrl?{verificationUrl:n.verificationUrl}:{},...n.expiresAt?{expiresAt:n.expiresAt}:{},pollIntervalMs:1e3,...n.state==="needs_verification"?{verificationRequired:!0}:{},...n.botId?{botId:n.botId}:{},...n.alreadyConnected?{alreadyConnected:!0}:{},...n.error?{error:structuredClone(n.error)}:{}}:null}function Ai(n,t){return Object.freeze({code:n,message:t})}function _u(n,t){let o=new Error(`Weixin activation failed during ${n}`,{cause:t});return o.name="WeixinActivationStageError",o.code=n,o}function SGe(n){if(n instanceof NA)return Ai(n.code,n.message);let t=T5[n?.code];return t?Ai(n.code,D(t)):Ai("activation-unknown-failed",D("\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u6FC0\u6D3B\u8FC7\u7A0B\u4E2D\u53D1\u751F\u672A\u77E5\u9519\u8BEF\u3002\u8BF7\u67E5\u770B dsh web \u65E5\u5FD7\u3002"))}function _5(n,t){return n instanceof NA||T5[n?.code]?n:_u(t,n)}var Tu=class{#e;#A;#t;#r;#c;#a;#n=new Map;#o=new Map;#g=new Map;#l=null;#i=new Map;#I=0;#s=!1;constructor({api:t,credentials:o,configStore:i,createRuntime:e,deleteState:a=async()=>{},logger:A=console}){if(!t||typeof t.beginLogin!="function"||typeof t.pollLogin!="function")throw new TypeError("WeixinController requires a Weixin API client");if(!o||typeof o.resolve!="function"||typeof o.set!="function"||typeof o.unset!="function")throw new TypeError("WeixinController requires the DSH credential provider");if(!i||typeof i.list!="function"||typeof i.save!="function"||typeof i.remove!="function")throw new TypeError("WeixinController requires a config store");if(typeof e!="function")throw new TypeError("createRuntime is required");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A}async initialize(){if(this.#s)return this.status();for(let t of this.#t.list())this.#n.get(t.botId)?.status?.ready!==!0&&await this.#m(t.botId,async()=>{let i=this.#t.get(t.botId);if(!(!i||this.#s))try{let e=await this.#C(i.tokenRef);if(!e){this.#o.set(i.botId,Ai("missing-token",D("\u767B\u5F55\u51ED\u636E\u7F3A\u5931\uFF0C\u8BF7\u79FB\u9664\u8D26\u53F7\u540E\u91CD\u65B0\u626B\u7801\u3002")));return}await this.#h(i,e),this.#o.delete(i.botId)}catch(e){this.#o.set(i.botId,Ai("connection-failed",D("\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002"))),this.#a.warn?.(`[dsh-weixin] account ${i.botId} failed to initialize:`,e)}finally{this.#Q()}});return this.status()}async startProvisioning(){if(this.#s)throw new Error("dsh-weixin controller is closed");this.#l&&await this.cancelProvisioning(this.#l);let t={id:yGe(),state:"starting",createdAt:Date.now(),expiresAt:Date.now()+b5,controller:new AbortController,pendingVerifyCode:null,verifyResolve:null,currentBaseUrl:PS,error:null,botId:null,task:null};this.#g.set(t.id,t),this.#l=t.id,this.#Q();try{let o=(await Promise.all(this.#t.list().slice(-10).map(async e=>this.#C(e.tokenRef)))).filter(Boolean),i=await this.#e.beginLogin({localTokens:o,signal:t.controller.signal});return this.#u(t),t.qrcode=i.qrcode,t.verificationUrl=i.qrcodeUrl,t.state="pending",t.expiresAt=Date.now()+b5,this.#Q(),t.task=this.#p(t),Mu(t)}catch(o){throw t.controller.signal.aborted?(t.state="cancelled",t.error=Ai("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002"))):(t.state="failed",t.error=Ai(o instanceof NA?o.code:"qr-start-failed",o instanceof NA?o.message:D("\u65E0\u6CD5\u751F\u6210\u5FAE\u4FE1\u4E8C\u7EF4\u7801\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"))),this.#l===t.id&&(this.#l=null),this.#Q(),o}}registrationStatus(t){return Mu(this.#g.get(t))}async submitVerification(t,o){let i=this.#g.get(t);if(!i||i.state!=="needs_verification")throw new Error("The provisioning attempt is not waiting for a verification code");let e=bd(o);if(!e||!/^\d{4,8}$/.test(e))throw new TypeError("Verification code must contain 4 to 8 digits");return i.pendingVerifyCode=e,i.state="scanned",i.verifyResolve?.(),i.verifyResolve=null,this.#Q(),Mu(i)}async cancelProvisioning(t){let o=this.#g.get(t);return o?(HS.has(o.state)||(o.controller.abort(),o.verifyResolve?.(),o.verifyResolve=null,await o.task?.catch(()=>{}),HS.has(o.state)||(o.state="cancelled"),o.error??=Ai("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002"))),this.#l===o.id&&(this.#l=null),this.#Q(),Mu(o)):null}async reconnectBot(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Weixin account");return await this.#m(t,async()=>{let i=await this.#C(o.tokenRef);if(!i)throw new Error("The Weixin token is missing");try{await this.#h(o,i),this.#o.delete(t)}catch(e){throw this.#o.set(t,Ai("connection-failed",D("\u5FAE\u4FE1\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"))),e}finally{this.#Q()}}),this.status()}async sendConnectionTest(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Weixin account");return this.#m(t,async()=>{let i=this.#n.get(t);if(!i?.status?.ready||typeof i.sendConnectionTest!="function")throw lr(D("\u5FAE\u4FE1\u673A\u5668\u4EBA"));return i.sendConnectionTest(Oa(D("\u5FAE\u4FE1\u673A\u5668\u4EBA\uFF08{name}\uFF09",{name:tG(o.accountId)})))})}async deleteBot(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Weixin account");return await this.#m(t,async()=>{let i=await this.#A.resolve(o.tokenRef).catch(()=>{});await this.#E(t);try{await this.#A.unset(o.tokenRef),await this.#t.remove(t)}catch(e){throw i?.value&&(await this.#A.set(o.tokenRef,i.value).catch(()=>{}),await this.#h(o,i.value).catch(()=>{})),new Error("Unable to remove the Weixin account safely.",{cause:e})}try{await this.#c({botId:t,config:o})}catch(e){this.#a.warn?.(`[dsh-weixin] account ${t} state cleanup failed:`,e)}this.#o.delete(t),this.#Q()}),this.status()}status(){let t=this.#t.list().map(e=>{let a=this.#n.get(e.botId)?.status??null,A=a?.ready===!0&&a.weixinConnectionState==="connected"&&a.harnessReachable===!0,r=A?"connected":a?.weixinConnectionState==="connecting"?"connecting":this.#o.has(e.botId)||a?.weixinConnectionState==="failed"?"error":"offline",s=this.#o.get(e.botId)??(r==="error"?Ai("connection-failed",D("\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002")):null);return{botId:e.botId,state:r,connected:A,configured:!0,bot:{name:D("\u5FAE\u4FE1\u673A\u5668\u4EBA"),accountIdMasked:tG(e.accountId)},health:{status:A?"healthy":r==="error"?"error":"offline",summary:A?D("\u5FAE\u4FE1\u6D88\u606F\u957F\u8F6E\u8BE2\u8FD0\u884C\u6B63\u5E38"):r==="error"?D("\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5"):D("\u5FAE\u4FE1\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF"),lastCheckedAt:a?.lastCheckedAt??null},stats:{messagesReceived:a?.messagesReceived??0,messagesReplied:a?.messagesReplied??0},lastMessageError:zr(a?.lastMessageError),error:s?structuredClone(s):null}}),o=t.filter(e=>e.connected).length,i=this.#l?this.#g.get(this.#l):null;return{schemaVersion:1,revision:this.#I,state:i&&O5.has(i.state)?"provisioning":t.length===0?"disconnected":o===t.length?"connected":o>0?"degraded":"offline",bots:t,totals:{configured:t.length,connected:o},...i&&O5.has(i.state)?{provisioning:Mu(i)}:{}}}async close(){this.#s||(this.#s=!0,this.#l&&await this.cancelProvisioning(this.#l),await Promise.allSettled([...this.#n.keys()].map(t=>this.#E(t))))}async#p(t){try{for(;!t.controller.signal.aborted&&Date.now(){t.verifyResolve=i,t.controller.signal.aborted&&i()}),t.verifyResolve=null,this.#u(t));let o=await this.#e.pollLogin({qrcode:t.qrcode,baseUrl:t.currentBaseUrl,verifyCode:t.pendingVerifyCode,signal:t.controller.signal});if(this.#u(t),o.status==="wait")t.state="pending";else if(o.status==="scaned")t.pendingVerifyCode=null,t.state="scanned";else if(o.status==="need_verifycode")t.pendingVerifyCode=null,t.state="needs_verification";else if(o.status==="verify_code_blocked"){t.state="failed",t.error=Ai("verification-blocked",D("\u914D\u5BF9\u7801\u591A\u6B21\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801\u3002"));break}else if(o.status==="expired"){t.state="expired",t.error=Ai("expired",D("\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u3002"));break}else if(o.status==="scaned_but_redirect")t.currentBaseUrl=M5(o.redirect_host,t.currentBaseUrl),t.state="scanned";else if(o.status==="binded_redirect"){let i=this.#t.list().find(e=>this.#n.get(e.botId)?.status?.ready===!0)??this.#t.list()[0];i?(t.state="connected",t.botId=i.botId,t.alreadyConnected=!0):(t.state="failed",t.error=Ai("already-bound",D("\u8BE5\u5FAE\u4FE1\u8D26\u53F7\u5DF2\u7ED1\u5B9A\uFF0C\u4F46\u672C\u673A\u6CA1\u6709\u53EF\u6062\u590D\u7684\u51ED\u636E\u3002")));break}else if(o.status==="confirmed"){let i=bd(o.bot_token),e=bd(o.ilink_bot_id),a=bd(o.ilink_user_id);if(!i||!e||!a)throw new NA("incomplete-login",D("\u5FAE\u4FE1\u6388\u6743\u6210\u529F\uFF0C\u4F46\u8FD4\u56DE\u7684\u8D26\u53F7\u51ED\u636E\u4E0D\u5B8C\u6574\u3002"));t.state="connecting",this.#Q();let A=M5(o.baseurl,t.currentBaseUrl);t.botId=await this.#d(t,{token:i,accountId:e,ownerUserId:a,baseUrl:A}),t.state="connected",t.error=null;break}this.#Q()}!t.controller.signal.aborted&&Date.now()>=t.expiresAt&&!HS.has(t.state)&&(t.state="expired",t.error=Ai("expired",D("\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u3002")))}catch(o){t.controller.signal.aborted||o?.name==="AbortError"?(t.state="cancelled",t.error=Ai("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002"))):(t.state="failed",t.error=SGe(o),this.#a.error?.("[dsh-weixin] provisioning failed:",o))}finally{t.pendingVerifyCode=null,t.verifyResolve?.(),t.verifyResolve=null,this.#l===t.id&&(this.#l=null),this.#Q(),this.#S()}}async#d(t,{token:o,accountId:i,ownerUserId:e,baseUrl:a}){let A=AG(i),r=this.#t.getByAccountId(i),s={botId:A.botId,accountId:i,tokenRef:A.tokenRef,ownerUserId:e,baseUrl:a,createdAt:r?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()},g;try{g=await this.#A.resolve(A.tokenRef)}catch(c){throw _u("credential-read-failed",c)}return this.#m(A.botId,async()=>{try{try{await this.#A.set(A.tokenRef,o)}catch(c){throw _u("credential-save-failed",c)}this.#u(t);try{await this.#t.save(s)}catch(c){throw _u("account-config-save-failed",c)}return this.#u(t),await this.#h(s,o),this.#u(t),this.#o.delete(A.botId),this.#Q(),A.botId}catch(c){throw await this.#E(A.botId),r?await this.#t.save(r).catch(()=>{}):this.#t.get(A.botId)&&await this.#t.remove(A.botId).catch(()=>null)&&await this.#c({botId:A.botId,config:s}).catch(d=>{this.#a.warn?.("[dsh-weixin] failed to clean up cancelled bot state:",d)}),await this.#B(A.tokenRef,g),r&&g?.value&&await this.#h(r,g.value).catch(()=>{}),c}})}async#h(t,o){await this.#E(t.botId);let i;try{i=await this.#r({botId:t.botId,config:t,token:o})}catch(e){throw _5(e,"runtime-prepare-failed")}if(!i||typeof i.start!="function"||typeof i.stop!="function")throw _u("runtime-prepare-failed",new TypeError("createRuntime returned an invalid Weixin runtime"));try{await i.start(),this.#n.set(t.botId,i)}catch(e){throw await i.stop().catch(()=>{}),_5(e,"connection-start-failed")}}async#E(t){let o=this.#n.get(t);this.#n.delete(t),await o?.stop().catch(i=>{this.#a.warn?.(`[dsh-weixin] account ${t} failed to stop cleanly:`,i)})}async#C(t){let o=await this.#A.resolve(t).catch(()=>{});return bd(o?.value)}async#B(t,o){try{o?.value?await this.#A.set(t,o.value):await this.#A.unset(t)}catch(i){this.#a.error?.(`[dsh-weixin] failed to restore credential ${t}:`,i)}}#u(t){if(t.controller.signal.aborted||this.#l!==t.id)throw mGe()}#m(t,o){let a=(this.#i.get(t)??Promise.resolve()).catch(()=>{}).then(o).finally(()=>{this.#i.get(t)===a&&this.#i.delete(t)});return this.#i.set(t,a),a}#S(){for(let[t,o]of this.#g)t!==this.#l&&HS.has(o.state)&&this.#g.size>16&&this.#g.delete(t)}#Q(){this.#I+=1}};var KS=()=>D("\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002"),DGe=5e3,rG=6e4,k5=Symbol("weixin-send-diagnostic"),wGe=()=>[D("\u5FAE\u4FE1\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002"),"",D("\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u3001\u6587\u4EF6\u6216\u5E26\u6587\u5B57\u8BC6\u522B\u7ED3\u679C\u7684\u8BED\u97F3\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002"),D("/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"),D("/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"),D("/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09"),D("/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A"),D("/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84"),D("/sessionlist [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"),D("/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"),D("/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"),D("/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7"),D("/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7"),D("/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B"),D("\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]"),D("/presetlist \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset"),D("/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset"),D("\u7EAF\u6570\u5B57 ID\uFF1A/preset id:"),D("/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"),D("/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1"),D("/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"),D("/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09"),D("/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21"),D("/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21"),D("/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"),D("/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C"),D("/help \u663E\u793A\u672C\u5E2E\u52A9")].join(` +`,o=this.#t.then(async()=>{await hGe(fGe(this.#e),{recursive:!0,mode:448});let i=`${this.#e}.tmp`;await BGe(i,t,{encoding:"utf8",mode:384}),await CGe(i,this.#e)});this.#t=o.then(()=>{},()=>{}),await o}};import{randomUUID as yGe}from"node:crypto";var O5=new Set(["starting","pending","scanned","needs_verification","connecting"]),HS=new Set(["connected","expired","failed","cancelled"]),b5=5*6e4,T5=Object.freeze({"credential-read-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u65E0\u6CD5\u8BFB\u53D6\u73B0\u6709\u767B\u5F55\u51ED\u636E\u3002\u8BF7\u68C0\u67E5 DSH \u51ED\u636E\u5B58\u50A8\u3002","credential-save-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u767B\u5F55\u51ED\u636E\u65E0\u6CD5\u5199\u5165 DSH \u51ED\u636E\u5B58\u50A8\u3002\u8BF7\u68C0\u67E5\u51ED\u636E\u5B58\u50A8\u662F\u5426\u53EF\u5199\u3002","account-config-save-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u8D26\u53F7\u914D\u7F6E\u65E0\u6CD5\u5199\u5165\u672C\u673A\u3002\u8BF7\u68C0\u67E5 DSH_HOME \u76EE\u5F55\u6743\u9650\u3002","runtime-prepare-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u65E0\u6CD5\u521D\u59CB\u5316\u8D26\u53F7\u72B6\u6001\u6216\u5DE5\u4F5C\u533A\u3002\u8BF7\u68C0\u67E5 DSH_HOME \u548C\u5DE5\u4F5C\u533A\u76EE\u5F55\u3002","harness-connect-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u63D2\u4EF6\u65E0\u6CD5\u8FDE\u63A5\u672C\u673A Harness\u3002\u8BF7\u68C0\u67E5 dsh web \u5730\u5740\u548C\u7AEF\u53E3\u3002","harness-timeout":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u5065\u5EB7\u68C0\u67E5\u8D85\u65F6\u3002\u8BF7\u786E\u8BA4 dsh web \u672A\u963B\u585E\u3002","harness-auth-required":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u5065\u5EB7\u68C0\u67E5\u9700\u8981\u8EAB\u4EFD\u8BA4\u8BC1\u3002\u8BF7\u68C0\u67E5\u4EE3\u7406\u3001\u7F51\u5173\u6216\u81EA\u5B9A\u4E49\u9274\u6743\u914D\u7F6E\u3002","harness-proxy-auth-required":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u672C\u673A Harness \u8BF7\u6C42\u88AB\u4EE3\u7406\u8981\u6C42\u8BA4\u8BC1\u3002\u8BF7\u8BA9\u56DE\u73AF\u5730\u5740\u7ED5\u8FC7\u4EE3\u7406\uFF0C\u5E76\u68C0\u67E5 NO_PROXY \u914D\u7F6E\u3002","harness-loopback-forbidden":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u5F02\u5E38\u62D2\u7EDD\u4E86\u56DE\u73AF\u5730\u5740\u7684\u5065\u5EB7\u68C0\u67E5\u3002\u8BF7\u68C0\u67E5 HTTP \u4EE3\u7406\u3001Harness \u6E90\u7801\u7248\u672C\u548C\u6784\u5EFA\u4EA7\u7269\u3002","harness-host-untrusted":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u7684 Host \u4FE1\u4EFB\u68C0\u67E5\u62D2\u7EDD\u4E86\u975E\u56DE\u73AF\u5730\u5740\u8BF7\u6C42\u3002\u8BF7\u68C0\u67E5 harnessBaseUrl \u4E0E trustedHosts \u914D\u7F6E\u3002","harness-request-forbidden":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u5065\u5EB7\u68C0\u67E5\u6536\u5230\u4E86\u975E Harness \u6807\u51C6\u7684 403 \u62D2\u7EDD\u54CD\u5E94\u3002\u8BF7\u68C0\u67E5\u4EE3\u7406\u6216\u7F51\u5173\u914D\u7F6E\u3002","harness-api-not-found":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u627E\u4E0D\u5230 Harness \u5065\u5EB7\u68C0\u67E5\u63A5\u53E3\u3002\u8BF7\u786E\u8BA4 Harness \u4E0E\u63D2\u4EF6\u7248\u672C\u517C\u5BB9\u3002","harness-http-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u5065\u5EB7\u68C0\u67E5\u8FD4\u56DE\u670D\u52A1\u9519\u8BEF\u3002\u8BF7\u67E5\u770B dsh web \u65E5\u5FD7\u3002","harness-response-invalid":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u8FD4\u56DE\u4E86\u65E0\u6CD5\u8BC6\u522B\u7684\u54CD\u5E94\u3002\u8BF7\u786E\u8BA4 Harness \u4E0E\u63D2\u4EF6\u7248\u672C\u517C\u5BB9\u3002","harness-rpc-rejected":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u62D2\u7EDD\u4E86\u5065\u5EB7\u68C0\u67E5\u8BF7\u6C42\u3002\u8BF7\u67E5\u770B dsh web \u65E5\u5FD7\u3002","harness-check-unknown-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46 Harness \u5065\u5EB7\u68C0\u67E5\u53D1\u751F\u672A\u77E5\u9519\u8BEF\u3002\u8BF7\u67E5\u770B dsh web \u65E5\u5FD7\u3002","connection-start-failed":"\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u6D88\u606F\u8FDE\u63A5\u521D\u59CB\u5316\u5931\u8D25\u3002\u8BF7\u67E5\u770B dsh web \u65E5\u5FD7\u540E\u91CD\u8BD5\u3002"});function bd(n){return typeof n=="string"&&n.trim()?n.trim():null}function mGe(){return new DOMException("Provisioning was cancelled","AbortError")}function M5(n,t){let o=bd(n);return o?Od(o.includes("://")?o:`https://${o}`):Od(t)}function Mu(n){return n?{attemptId:n.id,status:n.state,...n.verificationUrl?{verificationUrl:n.verificationUrl}:{},...n.expiresAt?{expiresAt:n.expiresAt}:{},pollIntervalMs:1e3,...n.state==="needs_verification"?{verificationRequired:!0}:{},...n.botId?{botId:n.botId}:{},...n.alreadyConnected?{alreadyConnected:!0}:{},...n.error?{error:structuredClone(n.error)}:{}}:null}function Ai(n,t){return Object.freeze({code:n,message:t})}function _u(n,t){let o=new Error(`Weixin activation failed during ${n}`,{cause:t});return o.name="WeixinActivationStageError",o.code=n,o}function SGe(n){if(n instanceof NA)return Ai(n.code,n.message);let t=T5[n?.code];return t?Ai(n.code,D(t)):Ai("activation-unknown-failed",D("\u5FAE\u4FE1\u5DF2\u6388\u6743\uFF0C\u4F46\u6FC0\u6D3B\u8FC7\u7A0B\u4E2D\u53D1\u751F\u672A\u77E5\u9519\u8BEF\u3002\u8BF7\u67E5\u770B dsh web \u65E5\u5FD7\u3002"))}function _5(n,t){return n instanceof NA||T5[n?.code]?n:_u(t,n)}var Tu=class{#e;#A;#t;#r;#c;#a;#n=new Map;#o=new Map;#g=new Map;#l=null;#i=new Map;#I=0;#s=!1;constructor({api:t,credentials:o,configStore:i,createRuntime:e,deleteState:a=async()=>{},logger:A=console}){if(!t||typeof t.beginLogin!="function"||typeof t.pollLogin!="function")throw new TypeError("WeixinController requires a Weixin API client");if(!o||typeof o.resolve!="function"||typeof o.set!="function"||typeof o.unset!="function")throw new TypeError("WeixinController requires the DSH credential provider");if(!i||typeof i.list!="function"||typeof i.save!="function"||typeof i.remove!="function")throw new TypeError("WeixinController requires a config store");if(typeof e!="function")throw new TypeError("createRuntime is required");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A}async initialize(){if(this.#s)return this.status();for(let t of this.#t.list())this.#n.get(t.botId)?.status?.ready!==!0&&await this.#m(t.botId,async()=>{let i=this.#t.get(t.botId);if(!(!i||this.#s))try{let e=await this.#C(i.tokenRef);if(!e){this.#o.set(i.botId,Ai("missing-token",D("\u767B\u5F55\u51ED\u636E\u7F3A\u5931\uFF0C\u8BF7\u79FB\u9664\u8D26\u53F7\u540E\u91CD\u65B0\u626B\u7801\u3002")));return}await this.#h(i,e),this.#o.delete(i.botId)}catch(e){this.#o.set(i.botId,Ai("connection-failed",D("\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002"))),this.#a.warn?.(`[dsh-weixin] account ${i.botId} failed to initialize:`,e)}finally{this.#Q()}});return this.status()}async startProvisioning(){if(this.#s)throw new Error("dsh-weixin controller is closed");this.#l&&await this.cancelProvisioning(this.#l);let t={id:yGe(),state:"starting",createdAt:Date.now(),expiresAt:Date.now()+b5,controller:new AbortController,pendingVerifyCode:null,verifyResolve:null,currentBaseUrl:PS,error:null,botId:null,task:null};this.#g.set(t.id,t),this.#l=t.id,this.#Q();try{let o=(await Promise.all(this.#t.list().slice(-10).map(async e=>this.#C(e.tokenRef)))).filter(Boolean),i=await this.#e.beginLogin({localTokens:o,signal:t.controller.signal});return this.#u(t),t.qrcode=i.qrcode,t.verificationUrl=i.qrcodeUrl,t.state="pending",t.expiresAt=Date.now()+b5,this.#Q(),t.task=this.#p(t),Mu(t)}catch(o){throw t.controller.signal.aborted?(t.state="cancelled",t.error=Ai("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002"))):(t.state="failed",t.error=Ai(o instanceof NA?o.code:"qr-start-failed",o instanceof NA?o.message:D("\u65E0\u6CD5\u751F\u6210\u5FAE\u4FE1\u4E8C\u7EF4\u7801\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"))),this.#l===t.id&&(this.#l=null),this.#Q(),o}}registrationStatus(t){return Mu(this.#g.get(t))}async submitVerification(t,o){let i=this.#g.get(t);if(!i||i.state!=="needs_verification")throw new Error("The provisioning attempt is not waiting for a verification code");let e=bd(o);if(!e||!/^\d{4,8}$/.test(e))throw new TypeError("Verification code must contain 4 to 8 digits");return i.pendingVerifyCode=e,i.state="scanned",i.verifyResolve?.(),i.verifyResolve=null,this.#Q(),Mu(i)}async cancelProvisioning(t){let o=this.#g.get(t);return o?(HS.has(o.state)||(o.controller.abort(),o.verifyResolve?.(),o.verifyResolve=null,await o.task?.catch(()=>{}),HS.has(o.state)||(o.state="cancelled"),o.error??=Ai("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002"))),this.#l===o.id&&(this.#l=null),this.#Q(),Mu(o)):null}async reconnectBot(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Weixin account");return await this.#m(t,async()=>{let i=await this.#C(o.tokenRef);if(!i)throw new Error("The Weixin token is missing");try{await this.#h(o,i),this.#o.delete(t)}catch(e){throw this.#o.set(t,Ai("connection-failed",D("\u5FAE\u4FE1\u8FDE\u63A5\u4ECD\u672A\u5C31\u7EEA\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002"))),e}finally{this.#Q()}}),this.status()}async sendConnectionTest(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Weixin account");return this.#m(t,async()=>{let i=this.#n.get(t);if(!i?.status?.ready||typeof i.sendConnectionTest!="function")throw lr(D("\u5FAE\u4FE1\u673A\u5668\u4EBA"));return i.sendConnectionTest(Oa(D("\u5FAE\u4FE1\u673A\u5668\u4EBA\uFF08{name}\uFF09",{name:tG(o.accountId)})))})}async deleteBot(t){let o=this.#t.get(t);if(!o)throw new Error("Unknown Weixin account");return await this.#m(t,async()=>{let i=await this.#A.resolve(o.tokenRef).catch(()=>{});await this.#E(t);try{await this.#A.unset(o.tokenRef),await this.#t.remove(t)}catch(e){throw i?.value&&(await this.#A.set(o.tokenRef,i.value).catch(()=>{}),await this.#h(o,i.value).catch(()=>{})),new Error("Unable to remove the Weixin account safely.",{cause:e})}try{await this.#c({botId:t,config:o})}catch(e){this.#a.warn?.(`[dsh-weixin] account ${t} state cleanup failed:`,e)}this.#o.delete(t),this.#Q()}),this.status()}status(){let t=this.#t.list().map(e=>{let a=this.#n.get(e.botId)?.status??null,A=a?.ready===!0&&a.weixinConnectionState==="connected"&&a.harnessReachable===!0,r=A?"connected":a?.weixinConnectionState==="connecting"?"connecting":this.#o.has(e.botId)||a?.weixinConnectionState==="failed"?"error":"offline",s=this.#o.get(e.botId)??(r==="error"?Ai("connection-failed",D("\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5\u3002")):null);return{botId:e.botId,state:r,connected:A,configured:!0,bot:{name:D("\u5FAE\u4FE1\u673A\u5668\u4EBA"),accountIdMasked:tG(e.accountId)},health:{status:A?"healthy":r==="error"?"error":"offline",summary:A?D("\u5FAE\u4FE1\u6D88\u606F\u957F\u8F6E\u8BE2\u8FD0\u884C\u6B63\u5E38"):r==="error"?D("\u5FAE\u4FE1\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u63D2\u4EF6\u4F1A\u81EA\u52A8\u91CD\u8BD5"):D("\u5FAE\u4FE1\u8FDE\u63A5\u5F53\u524D\u79BB\u7EBF"),lastCheckedAt:a?.lastCheckedAt??null},stats:{messagesReceived:a?.messagesReceived??0,messagesReplied:a?.messagesReplied??0},lastMessageError:zr(a?.lastMessageError),error:s?structuredClone(s):null}}),o=t.filter(e=>e.connected).length,i=this.#l?this.#g.get(this.#l):null;return{schemaVersion:1,revision:this.#I,state:i&&O5.has(i.state)?"provisioning":t.length===0?"disconnected":o===t.length?"connected":o>0?"degraded":"offline",bots:t,totals:{configured:t.length,connected:o},...i&&O5.has(i.state)?{provisioning:Mu(i)}:{}}}async close(){this.#s||(this.#s=!0,this.#l&&await this.cancelProvisioning(this.#l),await Promise.allSettled([...this.#n.keys()].map(t=>this.#E(t))))}async#p(t){try{for(;!t.controller.signal.aborted&&Date.now(){t.verifyResolve=i,t.controller.signal.aborted&&i()}),t.verifyResolve=null,this.#u(t));let o=await this.#e.pollLogin({qrcode:t.qrcode,baseUrl:t.currentBaseUrl,verifyCode:t.pendingVerifyCode,signal:t.controller.signal});if(this.#u(t),o.status==="wait")t.state="pending";else if(o.status==="scaned")t.pendingVerifyCode=null,t.state="scanned";else if(o.status==="need_verifycode")t.pendingVerifyCode=null,t.state="needs_verification";else if(o.status==="verify_code_blocked"){t.state="failed",t.error=Ai("verification-blocked",D("\u914D\u5BF9\u7801\u591A\u6B21\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u4E8C\u7EF4\u7801\u3002"));break}else if(o.status==="expired"){t.state="expired",t.error=Ai("expired",D("\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u3002"));break}else if(o.status==="scaned_but_redirect")t.currentBaseUrl=M5(o.redirect_host,t.currentBaseUrl),t.state="scanned";else if(o.status==="binded_redirect"){let i=this.#t.list().find(e=>this.#n.get(e.botId)?.status?.ready===!0)??this.#t.list()[0];i?(t.state="connected",t.botId=i.botId,t.alreadyConnected=!0):(t.state="failed",t.error=Ai("already-bound",D("\u8BE5\u5FAE\u4FE1\u8D26\u53F7\u5DF2\u7ED1\u5B9A\uFF0C\u4F46\u672C\u673A\u6CA1\u6709\u53EF\u6062\u590D\u7684\u51ED\u636E\u3002")));break}else if(o.status==="confirmed"){let i=bd(o.bot_token),e=bd(o.ilink_bot_id),a=bd(o.ilink_user_id);if(!i||!e||!a)throw new NA("incomplete-login",D("\u5FAE\u4FE1\u6388\u6743\u6210\u529F\uFF0C\u4F46\u8FD4\u56DE\u7684\u8D26\u53F7\u51ED\u636E\u4E0D\u5B8C\u6574\u3002"));t.state="connecting",this.#Q();let A=M5(o.baseurl,t.currentBaseUrl);t.botId=await this.#d(t,{token:i,accountId:e,ownerUserId:a,baseUrl:A}),t.state="connected",t.error=null;break}this.#Q()}!t.controller.signal.aborted&&Date.now()>=t.expiresAt&&!HS.has(t.state)&&(t.state="expired",t.error=Ai("expired",D("\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u751F\u6210\u3002")))}catch(o){t.controller.signal.aborted||o?.name==="AbortError"?(t.state="cancelled",t.error=Ai("cancelled",D("\u626B\u7801\u7ED1\u5B9A\u5DF2\u53D6\u6D88\u3002"))):(t.state="failed",t.error=SGe(o),this.#a.error?.("[dsh-weixin] provisioning failed:",o))}finally{t.pendingVerifyCode=null,t.verifyResolve?.(),t.verifyResolve=null,this.#l===t.id&&(this.#l=null),this.#Q(),this.#S()}}async#d(t,{token:o,accountId:i,ownerUserId:e,baseUrl:a}){let A=AG(i),r=this.#t.getByAccountId(i),s={botId:A.botId,accountId:i,tokenRef:A.tokenRef,ownerUserId:e,baseUrl:a,createdAt:r?.createdAt??new Date().toISOString(),connectedAt:new Date().toISOString()},g;try{g=await this.#A.resolve(A.tokenRef)}catch(c){throw _u("credential-read-failed",c)}return this.#m(A.botId,async()=>{try{try{await this.#A.set(A.tokenRef,o)}catch(c){throw _u("credential-save-failed",c)}this.#u(t);try{await this.#t.save(s)}catch(c){throw _u("account-config-save-failed",c)}return this.#u(t),await this.#h(s,o),this.#u(t),this.#o.delete(A.botId),this.#Q(),A.botId}catch(c){throw await this.#E(A.botId),r?await this.#t.save(r).catch(()=>{}):this.#t.get(A.botId)&&await this.#t.remove(A.botId).catch(()=>null)&&await this.#c({botId:A.botId,config:s}).catch(d=>{this.#a.warn?.("[dsh-weixin] failed to clean up cancelled bot state:",d)}),await this.#B(A.tokenRef,g),r&&g?.value&&await this.#h(r,g.value).catch(()=>{}),c}})}async#h(t,o){await this.#E(t.botId);let i;try{i=await this.#r({botId:t.botId,config:t,token:o})}catch(e){throw _5(e,"runtime-prepare-failed")}if(!i||typeof i.start!="function"||typeof i.stop!="function")throw _u("runtime-prepare-failed",new TypeError("createRuntime returned an invalid Weixin runtime"));try{await i.start(),this.#n.set(t.botId,i)}catch(e){throw await i.stop().catch(()=>{}),_5(e,"connection-start-failed")}}async#E(t){let o=this.#n.get(t);this.#n.delete(t),await o?.stop().catch(i=>{this.#a.warn?.(`[dsh-weixin] account ${t} failed to stop cleanly:`,i)})}async#C(t){let o=await this.#A.resolve(t).catch(()=>{});return bd(o?.value)}async#B(t,o){try{o?.value?await this.#A.set(t,o.value):await this.#A.unset(t)}catch(i){this.#a.error?.(`[dsh-weixin] failed to restore credential ${t}:`,i)}}#u(t){if(t.controller.signal.aborted||this.#l!==t.id)throw mGe()}#m(t,o){let a=(this.#i.get(t)??Promise.resolve()).catch(()=>{}).then(o).finally(()=>{this.#i.get(t)===a&&this.#i.delete(t)});return this.#i.set(t,a),a}#S(){for(let[t,o]of this.#g)t!==this.#l&&HS.has(o.state)&&this.#g.size>16&&this.#g.delete(t)}#Q(){this.#I+=1}};var KS=()=>D("\u8FD9\u4E2A\u95EE\u9898\u5DF2\u5728\u5176\u4ED6\u5BA2\u6237\u7AEF\u5904\u7406\uFF0C\u65E0\u9700\u518D\u6B21\u56DE\u7B54\u3002"),DGe=5e3,rG=6e4,k5=Symbol("weixin-send-diagnostic"),wGe=()=>[D("\u5FAE\u4FE1\u5DF2\u8FDE\u63A5 DeepSeek Harness\u3002"),"",D("\u76F4\u63A5\u53D1\u9001\u6587\u5B57\u3001\u56FE\u7247\u3001\u6587\u4EF6\u6216\u5E26\u6587\u5B57\u8BC6\u522B\u7ED3\u679C\u7684\u8BED\u97F3\u5373\u53EF\u7EE7\u7EED\u5F53\u524D\u4F1A\u8BDD\u3002"),D("/new \u5F00\u542F\u4E00\u4E2A\u5168\u65B0\u4F1A\u8BDD"),D("/compact \u538B\u7F29\u5F53\u524D\u4F1A\u8BDD\u7684\u8F83\u65E9\u4E0A\u4E0B\u6587"),D("/history [\u6570\u91CF] \u67E5\u770B\u6700\u8FD1\u5386\u53F2\u6D88\u606F\uFF08\u9ED8\u8BA4 3 \u6761\uFF0C\u6700\u591A 5 \u6761\uFF09"),D("/workspace \u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84 \u5207\u6362\u5DE5\u4F5C\u533A"),D("/workspacelist \u5217\u51FA\u5DE5\u4F5C\u533A\u7EDD\u5BF9\u8DEF\u5F84"),D("/sessionlist \u6216 /sessions [\u5DE5\u4F5C\u533A\u5E8F\u53F7\u6216\u7EDD\u5BF9\u8DEF\u5F84] \u5217\u51FA\u4F1A\u8BDD ID \u548C\u6807\u9898"),D("/session Session ID \u6216\u5F53\u524D\u5DE5\u4F5C\u533A\u5E8F\u53F7 \u5C06\u5F53\u524D\u804A\u5929\u7ED1\u5B9A\u5230\u6307\u5B9A\u4F1A\u8BDD"),D("/models \u6309\u5E8F\u53F7\u5217\u51FA\u6240\u6709\u53EF\u7528\u6A21\u578B"),D("/reasoninglist \u6216 /reasonings \u6309\u5E8F\u53F7\u5217\u51FA\u5F53\u524D\u6A21\u578B\u53EF\u7528\u63A8\u7406\u7B49\u7EA7"),D("/reasoning [\u5E8F\u53F7\u3001\u7B49\u7EA7ID\u6216 --default] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u63A8\u7406\u7B49\u7EA7"),D("/model [\u5E8F\u53F7\u6216\u5B8C\u6574\u6A21\u578BID] [\u63A8\u7406\u7B49\u7EA7ID] \u67E5\u770B\u6216\u5207\u6362\u5F53\u524D\u4F1A\u8BDD\u6A21\u578B"),D("\u793A\u4F8B\uFF1A\u5148\u53D1 /models\uFF0C\u518D\u53D1 /model 2 [\u63A8\u7406\u7B49\u7EA7ID]"),D("/presetlist \u6216 /presets \u6309\u5E8F\u53F7\u5217\u51FA\u53EF\u7528 Agent Preset"),D("/preset [\u5E8F\u53F7\u6216\u5B8C\u6574ID] \u67E5\u770B\u6216\u8BBE\u7F6E\u5F53\u524D\u673A\u5668\u4EBA Agent Preset"),D("\u7EAF\u6570\u5B57 ID\uFF1A/preset id:"),D("/preset --default \u8DDF\u968F Host \u9ED8\u8BA4"),D("/stop \u505C\u6B62\u5F53\u524D\u4EFB\u52A1"),D("/steer \u8865\u5145\u6307\u4EE4 \u7EA0\u504F\u5F53\u524D\u4EFB\u52A1"),D("/batch \u5F00\u59CB\u6279\u91CF\u8F93\u5165\uFF08\u4EC5\u79C1\u804A\uFF0C\u6700\u591A 10 \u6761\u6587\u5B57\uFF09"),D("/send \u63D0\u4EA4\u5F53\u524D\u6279\u6B21"),D("/cancel \u53D6\u6D88\u5F53\u524D\u6279\u6B21"),D("/status \u68C0\u67E5\u8FDE\u63A5\u72B6\u6001"),D("/version \u67E5\u770B\u63D2\u4EF6\u7248\u672C"),D("/help \u663E\u793A\u672C\u5E2E\u52A9")].join(` `);function OGe(n){return`p2p:${n}`}function Gr(n){return typeof n=="string"&&n.trim()?n.trim():null}function Nu(n){let t=n==null?"":String(n).trim();return/^-?[A-Za-z0-9_.:-]{1,160}$/u.test(t)?t:"-"}function bGe(n){try{return Nu(new URL(n).hostname.toLowerCase())}catch{return"-"}}function MGe({baseUrl:n,text:t,chunk:o,chunkIndex:i,chunkCount:e,maxMessageChars:a,contextToken:A,runId:r,error:s}){let g=Number(s?.status??s?.httpStatus),c=Number.isInteger(g)?String(g):s?.code==="send-rejected"?"2xx":"-";return["endpoint=sendmessage",`host=${bGe(n)}`,`chunk=${i+1}/${e}`,`chunkChars=${o.length}`,`chunkUtf8Bytes=${Buffer.byteLength(o,"utf8")}`,`totalChars=${t.length}`,`totalUtf8Bytes=${Buffer.byteLength(t,"utf8")}`,`limitChars=${a}`,`contextToken=${A?"yes":"no"}`,`runId=${r?"yes":"no"}`,`http=${c}`,`provider=${Nu(s?.providerCode)}`,`cause=${Nu(s?.code??s?.name)}`].join(" ")}function _Ge(n,t){let o=MGe({...t,error:n}),i=new Error(`Weixin text delivery failed (${o})`,{cause:n}),e=Nu(n?.code);i.code=e==="-"?"weixin-send-failed":e;let a=Number(n?.status??n?.httpStatus);Number.isInteger(a)&&(i.status=a);let A=Nu(n?.providerCode);return A!=="-"&&(i.providerCode=A),i[k5]=o,i}function N5(n){let t=n;for(let o=0;t&&o<5;o+=1){let i=t[k5];if(typeof i=="string"&&i)return{reason:"weixin-send-failed",userMessage:[D("\u56DE\u590D\u5DF2\u7ECF\u751F\u6210\uFF0C\u4F46\u5FAE\u4FE1\u53D1\u9001\u5931\u8D25\uFF0C\u53EF\u80FD\u53EA\u6536\u5230\u90E8\u5206\u5185\u5BB9\u3002\u8BF7\u5C06\u4E0B\u9762\u7684\u8BCA\u65AD\u4FE1\u606F\u5B8C\u6574\u53CD\u9988\u7ED9\u7BA1\u7406\u5458\u3002"),D("\u5FAE\u4FE1\u53D1\u9001\u8BCA\u65AD\uFF1A{diagnostic}",{diagnostic:i})].join(` `)};t=t.cause}}function R5(n,t){return{content:sl(n)??"",images:typeof t?.inboundImages=="function"?t.inboundImages(n):WP(n),files:typeof t?.inboundFiles=="function"?t.inboundFiles(n):ZP(n)}}function xS(n){return Array.isArray(n?.item_list)&&n.item_list.some(t=>t?.image_item&&typeof t.image_item=="object")}function YS(n){return Array.isArray(n?.item_list)&&n.item_list.some(t=>t?.file_item&&typeof t.file_item=="object")}function TGe(n){return Array.isArray(n?.item_list)&&n.item_list.length>0&&n.item_list.every(t=>t?.type===1&&typeof t.text_item?.text=="string")&&!!Gr(sl(n))}function NGe(n,t){return t.questions[t.index]&&Gr(n?.from_user_id)===t.actor&&!xS(n)&&!YS(n)&&Gr(sl(n))}function RGe(n,t){let o=String(n??D("\u7ED3\u679C\u6587\u4EF6")).replace(/[\r\n]+/g," ").trim()||D("\u7ED3\u679C\u6587\u4EF6");switch(t?.code){case"artifact-delivery-uncertain":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\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:o});case"artifact-permission-required":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u5FAE\u4FE1\u673A\u5668\u4EBA\u5F53\u524D\u6CA1\u6709\u6587\u4EF6\u6D88\u606F\u53D1\u9001\u6743\u9650\uFF0C\u8BF7\u68C0\u67E5\u673A\u5668\u4EBA\u6587\u4EF6\u6D88\u606F\u80FD\u529B\u3002",{name:o});case"artifact-too-large":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u8D85\u8FC7\u5F53\u524D\u5FAE\u4FE1\u4F1A\u8BDD\u53EF\u53D1\u9001\u7684\u6587\u4EF6\u5927\u5C0F\uFF0C\u672A\u53D1\u9001\u3002",{name:o});case"artifact-rate-limited":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u6682\u65F6\u88AB\u5FAE\u4FE1\u9650\u6D41\uFF0C\u672A\u80FD\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o});case"artifact-provider-rejected":return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u5FAE\u4FE1\u62D2\u7EDD\u4E86\u8BE5\u6587\u4EF6\u6D88\u606F\u3002",{name:o});case"artifact-invalid":case"artifact-changed":case"artifact-unavailable":return D("\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:o});default:return D("\u7ED3\u679C\u6587\u4EF6\u300C{name}\u300D\u5DF2\u751F\u6210\uFF0C\u4F46\u6682\u65F6\u672A\u80FD\u901A\u8FC7\u5FAE\u4FE1\u53D1\u9001\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002",{name:o})}}function aG(){return{messagesReceived:0,messagesReplied:0,messagesRejected:0,lastMessageAt:null,lastReplyAt:null,lastRejectedAt:null,lastError:null,lastMessageError:null}}var jS=class{#e;#A;#t;#r;#c;#a;#n;#o;#g;#l;#i;#I;#s;#p=new Map;#d=new Map;#h=new Map;#E=new Map;#C=new Set;#B=new Set;#u;#m=new Bi;#S=null;#Q=null;#y=null;#f=0;#b=Promise.resolve();#R=!1;#w=0;#D=!1;constructor({api:t,baseUrl:o,token:i,ownerUserId:e,harness:a,state:A,contextEnhancement:r,status:s=aG(),logger:g=console,replyTimeoutMs:c=6e5,maxMessageChars:I=nl,typingKeepaliveMs:d=DGe,signal:B}){if(!t||typeof t.sendText!="function")throw new TypeError("Weixin API is required");if(!o||!i||!e)throw new TypeError("Weixin account credentials are required");if(!a||!A)throw new TypeError("Harness client and state store are required");if(!Number.isFinite(d)||d<=0)throw new TypeError("typingKeepaliveMs must be a positive number");this.#e=t,this.#A=o,this.#t=i,this.#r=e,this.#c=a,this.#a=A,this.#n=r,this.#o=s,this.#g=g,this.#l=c,this.#i=I,this.#I=d,this.#s=B,this.#u=new pi({label:"weixin",logger:g})}get status(){return structuredClone(this.#o)}accept(t){if(this.#s?.aborted||t?.message_type===2)return Promise.resolve();let o=$P(t),i=Gr(t?.from_user_id);if(!o||!i||this.#a.hasSeen(o)||this.#E.has(o))return Promise.resolve();this.#E.set(o,Zr(this.#n,"direct")),i===this.#r&&lo(this.#a,{toUserId:i});let e=OGe(i),a=Gr(t?.context_token)??void 0,A=Gr(t?.run_id)??void 0,r=this.#d.get(e),s=Gr(sl(t))??"",g=Qo(s),c=this.#m.status(e);if(i===this.#r&&(g||c.phase==="collecting")){let f=/^\/batch$/iu.test(s)&&c.phase==="idle"&&(this.#p.has(e)||r||this.#u.hasPending(e))?{handled:!0,kind:"busy",message:yo()}:this.#m.handle(e,s,{plainText:TGe(t)});if(f.handled)return f.kind==="submit"?this.#M({...t,item_list:[{type:1,text_item:{text:f.prompt}}]},o,e,{batchSubmission:f}):this.#P(t,o,e,i,a,A,f)}let I=Ei(s)?xi:YS(t)?null:Yi(s)?Ci:ji(s)?Ji:qi(s)?ui:null;if(I&&i===this.#r){let B;return B=this.#_(t,o,e,i,a,A,s,I).catch(f=>{if(f?.code==="turn-stopped"||this.#s?.aborted)return;this.#o.lastError=f?.message??String(f);let Q=At(this.#o,f);return this.#g.error?.(`[dsh-weixin] failed to process a command [${Q.referenceId}]:`,f),this.#K(e,i,dt(Q),a,A).catch(()=>{})}).finally(()=>{this.#E.delete(o),this.#B.delete(B)}),this.#B.add(B),B}let d=this.#u.claimReply({key:e,actor:i,messageId:o,text:xS(t)||YS(t)?"":sl(t),addressed:!0,hasPendingQuestion:!!r,questionCompletion:r?.submitting||r?.claimedReplyMessageId?r.queue:null,isQuestionPending:()=>this.#d.has(e),send:B=>this.#F(i,B,a,A)});if(d){let B;return B=d.process(async()=>this.#a.hasSeen(o)?!1:(await this.#a.markSeen(o),this.#o.messagesReceived+=1,this.#o.lastMessageAt=new Date().toISOString(),!0)).finally(()=>{this.#E.delete(o),this.#C.delete(B)}),this.#C.add(B),B}if(r?.submitting||r?.claimedReplyMessageId)return this.#M(t,o,e);if(r){NGe(t,r)&&(r.claimedReplyMessageId=o);let f=(r.queue??Promise.resolve()).catch(()=>{}).then(()=>this.#T(t,o,e,r)).catch(Q=>this.#z(t,o,Q)).finally(()=>{this.#E.delete(o),r.claimedReplyMessageId===o&&(r.claimedReplyMessageId=null),r.queue===f&&(r.queue=null)});return r.queue=f,f}return this.#M(t,o,e)}#M(t,o,i,{releaseMessageId:e=!0,alreadyRecorded:a=!1,batchSubmission:A=null}={}){let r=t.from_user_id===this.#r?gp(R5(t,this.#e),{signal:this.#s}):void 0,g=(this.#p.get(i)??Promise.resolve()).catch(()=>{}).then(()=>this.#L(t,i,{alreadyRecorded:a,preparedMessage:r,batchSubmission:A})).finally(()=>{e&&this.#E.delete(o),this.#p.get(i)===g&&this.#p.delete(i)});return this.#p.set(i,g),g}#P(t,o,i,e,a,A,r){let s;return s=Promise.resolve().then(async()=>{this.#a.hasSeen(o)||(await this.#a.markSeen(o),this.#o.messagesReceived+=1,this.#o.lastMessageAt=new Date().toISOString(),r.message&&await this.#K(i,e,r.message,a,A),this.#o.lastError=null)}).catch(async g=>{if(this.#s?.aborted)return;this.#o.lastError=g?.message??String(g);let c=At(this.#o,g);this.#g.error?.(`[dsh-weixin] failed to process a batch input message [${c.referenceId}]:`,g),await this.#K(i,e,dt(c),a,A).catch(()=>{})}).finally(()=>{this.#E.delete(o),this.#B.delete(s)}),this.#B.add(s),s}async waitForIdle(){await Promise.allSettled([...this.#p.values(),...[...this.#d.values()].flatMap(t=>t.queue?[t.queue]:[]),...this.#C,...this.#B,this.#b])}async close(){this.#R=!0,await this.#Ae({signal:AbortSignal.timeout(5e3)})}async#_(t,o,i,e,a,A,r,s){if(this.#s?.throwIfAborted(),this.#a.hasSeen(o))return;await this.#a.markSeen(o),this.#o.messagesReceived+=1,this.#o.lastMessageAt=new Date().toISOString();let g=await s(r,this.#c,this.#a,i,{signal:this.#s,isDirect:!0,hasImages:xS(t),hasFiles:YS(t),pendingInteraction:this.#d.has(i)||this.#u.hasPending(i),control:{owner:this,key:i}});g?.stopped&&await Promise.allSettled([this.#q(i),this.#u.closeRoute(i)]);for(let c of g?.messages??[g?.message])c&&(g?.stopped?await this.#F(e,c,a,A):await this.#K(i,e,c,a,A));this.#o.lastError=null}async#L(t,o,{alreadyRecorded:i=!1,preparedMessage:e,batchSubmission:a=null}={}){this.#s?.throwIfAborted();let A=$P(t),r=Gr(t?.from_user_id);if(!A||!r)return;if(!i){if(this.#a.hasSeen(A))return;this.#o.messagesReceived+=1,this.#o.lastMessageAt=new Date().toISOString()}if(r!==this.#r){this.#o.messagesRejected+=1,this.#o.lastRejectedAt=new Date().toISOString();return}let s=typeof t.context_token=="string"?t.context_token:void 0,g=typeof t.run_id=="string"?t.run_id:void 0,c=a===null,I=!1;try{let d=e??R5(t,this.#e),B=d.content,f=Vt(d),Q=Ft(d);if(!B&&!f&&!Q){await this.#F(r,D("\u76EE\u524D\u652F\u6301\u6587\u5B57\u3001\u56FE\u7247\u3001\u6587\u4EF6\uFF0C\u4EE5\u53CA\u5FAE\u4FE1\u5DF2\u8F6C\u6210\u6587\u5B57\u7684\u8BED\u97F3\u6D88\u606F\u3002"),s,g),await this.#a.markSeen(A);return}let y=B.trim().toLowerCase();if(!f&&!Q&&y==="/help"){await this.#F(r,wGe(),s,g),await this.#a.markSeen(A);return}if(!f&&!Q&&y==="/status"){await this.#c.ensureRunning({signal:this.#s}),await this.#F(r,D("\u5FAE\u4FE1\u4E0E DeepSeek Harness \u8FDE\u63A5\u6B63\u5E38\u3002"),s,g),await this.#a.markSeen(A);return}if(!f&&!Q&&y==="/new"){await this.#a.clearSession(o),await this.#F(r,D("\u5DF2\u5F00\u542F\u65B0\u4F1A\u8BDD\u3002\u8BF7\u53D1\u9001\u4F60\u7684\u95EE\u9898\u3002"),s,g),await this.#a.markSeen(A);return}let m=f||Q?null:await uo(B,this.#c,o);if(m){for(let q of m.messages??[m.message])await this.#F(r,q,s,g);await this.#a.markSeen(A);return}let _=f||Q?null:await hi(B,this.#c,this.#a,o,{signal:this.#s});if(_){await this.#F(r,_.message,s,g),await this.#a.markSeen(A);return}let T,R=[];await this.#$(r,s);try{let q=f?await Eo(d,{signal:this.#s}):void 0,x=this.#E.get(A);x&&(q=fo(q??B,x,()=>({channel:"weixin",senderId:r}))),await this.#a.markSeen(A),I=!0,{answer:T,artifacts:R=[]}=await di({harness:this.#c,state:this.#a,key:o,...q!==void 0?{content:q}:{text:B},createOptions:{signal:this.#s},existsOptions:{signal:this.#s},askOptions:{timeoutMs:this.#l,signal:this.#s,control:{owner:this,key:o},onUpdate:()=>this.#X(o,r,s),onInteraction:G=>this.#U(G,{key:o,actor:r,contextToken:s,runId:g}),onInteractionResolved:async G=>{await this.#k(G),await this.#X(o,r,s)},files:d.files}}),a&&(this.#m.complete(o,a.token),c=!0)}finally{await Promise.allSettled([this.#Ae(),this.#q(o),this.#u.closeRoute(o)])}let F=typeof T=="string"&&T.trim()?T:R.length>0?D("\u7ED3\u679C\u6587\u4EF6\u5DF2\u751F\u6210\u3002"):T,j=null,U=null;try{U=Wt({deliveryId:A,presentation:"weixin-text",providerMessageIds:await this.#F(r,F,s,g)})}catch(q){j=ba(q)}let z=await this.#x(r,A,R,s,g,U);if(j&&!z.userVisible)throw j;return j&&z.artifactSendErrors===0&&At(this.#o,j,N5(j)),I||await this.#a.markSeen(A),this.#o.messagesReplied+=1,this.#o.lastReplyAt=new Date().toISOString(),this.#o.lastError=null,!j&&z.artifactSendErrors===0&&po(this.#o),z.receipt}catch(d){let B=null;if(!c&&a&&(d?.code==="turn-stopped"?this.#m.complete(o,a.token):B=this.#m.fail(o,a.token).message??null,c=!0),d?.code==="turn-stopped"){I||await this.#a.markSeen(A);return}if(this.#s?.aborted)return;this.#o.lastError=d?.message??String(d);let f=So(d)??Co(d),Q=Ki(d),y=N5(d),m=At(this.#o,d,{userMessage:f??y?.userMessage,reason:Q?.reason??y?.reason});this.#g.error?.(`[dsh-weixin] failed to process an inbound message [${m.referenceId}]:`,d);try{await this.#F(r,B?`${dt(m)} diff --git a/src/channels/dingtalk/dingtalk-bridge.mjs b/src/channels/dingtalk/dingtalk-bridge.mjs index ee32d5a..2d36b87 100644 --- a/src/channels/dingtalk/dingtalk-bridge.mjs +++ b/src/channels/dingtalk/dingtalk-bridge.mjs @@ -72,14 +72,14 @@ const HELP_TEXT_LINES = [ '/history [数量] 查看最近历史消息(默认 3 条,最多 5 条)', '/workspace 工作区绝对路径 切换工作区', '/workspacelist 列出工作区绝对路径', - '/sessionlist [工作区序号或绝对路径] 列出会话 ID 和标题', + '/sessionlist 或 /sessions [工作区序号或绝对路径] 列出会话 ID 和标题', '/session Session ID 或当前工作区序号 将当前聊天绑定到指定会话', '/models 按序号列出所有可用模型', '/reasoninglist 或 /reasonings 按序号列出当前模型可用推理等级', '/reasoning [序号、等级ID或 --default] 查看或切换当前推理等级', '/model [序号或完整模型ID] [推理等级ID] 查看或切换当前会话模型', '示例:先发 /models,再发 /model 2 [推理等级ID]', - '/presetlist 按序号列出可用 Agent Preset', + '/presetlist 或 /presets 按序号列出可用 Agent Preset', '/preset [序号或完整ID] 查看或设置当前机器人 Agent Preset', '纯数字 ID:/preset id:', '/preset --default 跟随 Host 默认', diff --git a/src/channels/feishu/bridge.mjs b/src/channels/feishu/bridge.mjs index 3687057..5452782 100644 --- a/src/channels/feishu/bridge.mjs +++ b/src/channels/feishu/bridge.mjs @@ -93,7 +93,7 @@ const REPAIR_COMMAND = /^\/repair(?:\s+(qr|status|cancel|verify))?\s*$/i; const WATCH_COMMAND = /^\/watch(?:\s+([^\s]+))?$/i; const UNWATCH_COMMAND = /^\/unwatch(?:\s+([^\s]+))?$/i; const WATCHLIST_COMMAND = /^\/watchlist$/i; -const SESSION_LIST_PREFIX = /^\/sessionlist(?:\s|$)/i; +const SESSION_LIST_PREFIX = /^\/(?:sessionlist|sessions)(?:\s|$)/i; const WORKSPACE_LIST_COMMAND = /^\/workspacelist$/i; const NUMBER_REPLY = /^\d{1,2}$/; /** A displayed menu stays number-tappable for this long. */ @@ -133,13 +133,13 @@ const REPAIR_URL_HOSTS = new Set([ const ARCHIVED_COMMAND = /^\/archived(?:\s+(on|off))?$/i; /** Matches fast card commands that should not be queued behind a running task. */ -const CARD_COMMAND = /^\/(?:m(?:enu)?|new|help|status|compact|sessionlist(?:\s|$)|workspacelist|watchlist|archived(?:\s+(on|off))?)$/i; +const CARD_COMMAND = /^\/(?:m(?:enu)?|new|help|status|compact|(?:sessionlist|sessions)(?:\s|$)|workspacelist|watchlist|archived(?:\s+(on|off))?)$/i; /** Canonical workspace/session help advertised by every bridge family. */ const WORKSPACE_HELP_LINES = [ '/session Session ID 或当前工作区序号 将当前聊天绑定到指定会话', '/workspacelist 列出工作区绝对路径', - '/sessionlist [工作区序号或绝对路径] 列出会话 ID 和标题', + '/sessionlist 或 /sessions [工作区序号或绝对路径] 列出会话 ID 和标题', ]; /** Safe user-facing text for bind/workspace failures (no raw messages). */ @@ -1005,7 +1005,7 @@ export class FeishuHarnessBridge { return; } if (SESSION_LIST_PREFIX.test(commandText)) { - const selector = commandText.slice('/sessionlist'.length).trim() || null; + const selector = commandText.replace(/^\/(?:sessionlist|sessions)/i, '').trim() || null; await this.#showSessions({ chatId: event.message.chat_id, key }, selector, 0); return; } diff --git a/src/channels/feishu/feishu-cards.mjs b/src/channels/feishu/feishu-cards.mjs index 70bbbce..6b72346 100644 --- a/src/channels/feishu/feishu-cards.mjs +++ b/src/channels/feishu/feishu-cards.mjs @@ -487,7 +487,7 @@ export function menuHelpText() { '🤖 助手菜单(回复数字即可,无需记命令)', '', '📋 会话 / 工作区', - '/sessionlist 列出工作区会话', + '/sessionlist 或 /sessions 列出工作区会话', '/session ID 绑定已有会话', '/workspacelist 列出工作区', '/workspace 路径 切换工作区', @@ -506,7 +506,7 @@ export function menuHelpText() { '/unwatch ID 取消关注', '', '🤖 预设 / 模型', - '/presetlist 列出可用 Agent Preset', + '/presetlist 或 /presets 列出可用 Agent Preset', '/preset [序号或完整ID] 查看或设置当前机器人 Agent Preset', '纯数字 ID:/preset id:', '/preset --default 跟随 Host 默认', @@ -553,7 +553,7 @@ const HELP_TEXT_COMMANDS = [ '`/m` — 打开菜单卡片', '`/new` — 开启全新会话', '`/session ID` — 绑定已有会话', - '`/sessionlist [工作区]` — 列出会话', + '`/sessionlist [工作区]` 或 `/sessions [工作区]` — 列出会话', '`/workspace 路径` — 切换工作区', '`/workspacelist` — 列出工作区', '`/status` — 查看连接状态', @@ -564,7 +564,7 @@ const HELP_TEXT_COMMANDS = [ '`/watchlist` — 关注列表', '`/unwatch ID` — 取消关注', '`/archived on/off` — 归档显隐', - '`/presetlist` — 列出预设', + '`/presetlist` 或 `/presets` — 列出预设', '`/preset [序号/ID]` — 切换预设', '`/preset --default` — 跟随默认', '`/models` — 列出模型', diff --git a/src/channels/qq/qq-bridge.mjs b/src/channels/qq/qq-bridge.mjs index 2173e08..eee68b5 100644 --- a/src/channels/qq/qq-bridge.mjs +++ b/src/channels/qq/qq-bridge.mjs @@ -83,14 +83,14 @@ function helpText() { t('/history [数量] 查看最近历史消息(默认 3 条,最多 5 条)'), t('/workspace 工作区绝对路径 切换工作区'), t('/workspacelist 列出工作区绝对路径'), - t('/sessionlist [工作区序号或绝对路径] 列出会话 ID 和标题'), + t('/sessionlist 或 /sessions [工作区序号或绝对路径] 列出会话 ID 和标题'), t('/session Session ID 或当前工作区序号 将当前聊天绑定到指定会话'), t('/models 按序号列出所有可用模型'), t('/reasoninglist 或 /reasonings 按序号列出当前模型可用推理等级'), t('/reasoning [序号、等级ID或 --default] 查看或切换当前推理等级'), t('/model [序号或完整模型ID] [推理等级ID] 查看或切换当前会话模型'), t('示例:先发 /models,再发 /model 2 [推理等级ID]'), - t('/presetlist 按序号列出可用 Agent Preset'), + t('/presetlist 或 /presets 按序号列出可用 Agent Preset'), t('/preset [序号或完整ID] 查看或设置当前机器人 Agent Preset'), t('纯数字 ID:/preset id:'), t('/preset --default 跟随 Host 默认'), diff --git a/src/channels/shared/i18n-en/feishu.mjs b/src/channels/shared/i18n-en/feishu.mjs index a724708..67df616 100644 --- a/src/channels/shared/i18n-en/feishu.mjs +++ b/src/channels/shared/i18n-en/feishu.mjs @@ -223,6 +223,8 @@ export default { '📊 系统状态': '📊 System status', '📋 会话 / 工作区': '📋 Sessions / workspace', '/sessionlist 列出工作区会话': '/sessionlist List workspace sessions', + '/sessionlist 或 /sessions 列出工作区会话': + '/sessionlist or /sessions List workspace sessions', '/session ID 绑定已有会话': '/session ID Bind an existing session', '/workspacelist 列出工作区': '/workspacelist List workspaces', '/workspace 路径 切换工作区': '/workspace PATH Switch workspace', @@ -239,12 +241,14 @@ export default { '📦 批量输入(仅私聊)': '📦 Batch input (direct messages only)', '🤖 预设 / 模型': '🤖 Presets / models', '/models 列出模型': '/models List models', + '/presetlist 或 /presets 列出可用 Agent Preset': + '/presetlist or /presets List available Agent Presets', '🎮 任务控制': '🎮 Task controls', '/steer 指令 给 Agent 补充指令': '/steer INSTRUCTION Steer the Agent', '**📋 卡片功能**\n\n1. 会话下拉 — 切换当前绑定会话\n2. 工作区下拉 — 切换工作区\n3. 🤖 预设下拉 — 切换 Agent 预设\n4. 🧠 模型下拉 — 切换模型\n5. 🆕 新会话 — 开启全新会话\n6. 📋 会话/关注 — 查看/绑定会话,管理关注\n7. ⏹ 停止 — 停止当前任务\n8. 📐 压缩 — 压缩当前会话上下文\n9. 补充指令 — 给 Agent 发送指令\n10. 🗄 归档切换 — 显示/隐藏归档会话\n11. 📊 状态 — 查看系统连接状态\n12. 📖 帮助 — 查看本帮助': '**📋 Card features**\n\n1. Session dropdown — switch the bound session\n2. Workspace dropdown — switch workspace\n3. 🤖 Preset dropdown — switch Agent Preset\n4. 🧠 Model dropdown — switch model\n5. 🆕 New session — start fresh\n6. 📋 Sessions/watches — view or bind sessions and manage watches\n7. ⏹ Stop — stop the current task\n8. 📐 Compact — compact the current session context\n9. Steer task — send an instruction to the Agent\n10. 🗄 Archived toggle — show or hide archived sessions\n11. 📊 Status — view connection status\n12. 📖 Help — view this help', - '**⌨️ 文本命令**\n\n`/m` — 打开菜单卡片\n`/new` — 开启全新会话\n`/session ID` — 绑定已有会话\n`/sessionlist [工作区]` — 列出会话\n`/workspace 路径` — 切换工作区\n`/workspacelist` — 列出工作区\n`/status` — 查看连接状态\n`/compact` — 压缩上下文\n`/stop` — 停止当前任务\n`/steer 指令` — 补充指令\n`/watch ID` — 关注会话\n`/watchlist` — 关注列表\n`/unwatch ID` — 取消关注\n`/archived on/off` — 归档显隐\n`/presetlist` — 列出预设\n`/preset [序号/ID]` — 切换预设\n`/preset --default` — 跟随默认\n`/models` — 列出模型\n`/reasoninglist` 或 `/reasonings` — 按序号列出当前模型可用推理等级\n`/reasoning [序号、等级ID或 --default]` — 查看或切换当前推理等级\n`/model [序号或完整模型ID] [推理等级ID]` — 查看或切换当前会话模型\n`/batch` — 开启批量输入(仅私聊,最多 10 条文字)\n`/send` — 提交当前批次\n`/cancel` — 取消当前批次\n`/repair` — 补全飞书权限与卡片回调': - '**⌨️ Text commands**\n\n`/m` — open the menu card\n`/new` — start a new session\n`/session ID` — bind an existing session\n`/sessionlist [workspace]` — list sessions\n`/workspace PATH` — switch workspace\n`/workspacelist` — list workspaces\n`/status` — view connection status\n`/compact` — compact context\n`/stop` — stop the current task\n`/steer INSTRUCTION` — steer the task\n`/watch ID` — watch a session\n`/watchlist` — list watched sessions\n`/unwatch ID` — stop watching\n`/archived on/off` — show or hide archived sessions\n`/presetlist` — list presets\n`/preset [index/ID]` — switch preset\n`/preset --default` — follow default\n`/models` — list models\n`/reasoninglist` or `/reasonings` — list reasoning efforts for the current model\n`/reasoning [index, effort ID, or --default]` — show or switch reasoning effort\n`/model [index or full model ID] [reasoning effort ID]` — show or switch the current Session model\n`/batch` — start batch input (direct messages only, up to 10 text messages)\n`/send` — submit the current batch\n`/cancel` — cancel the current batch\n`/repair` — complete Feishu permissions and the card callback', + '**⌨️ 文本命令**\n\n`/m` — 打开菜单卡片\n`/new` — 开启全新会话\n`/session ID` — 绑定已有会话\n`/sessionlist [工作区]` 或 `/sessions [工作区]` — 列出会话\n`/workspace 路径` — 切换工作区\n`/workspacelist` — 列出工作区\n`/status` — 查看连接状态\n`/compact` — 压缩上下文\n`/stop` — 停止当前任务\n`/steer 指令` — 补充指令\n`/watch ID` — 关注会话\n`/watchlist` — 关注列表\n`/unwatch ID` — 取消关注\n`/archived on/off` — 归档显隐\n`/presetlist` 或 `/presets` — 列出预设\n`/preset [序号/ID]` — 切换预设\n`/preset --default` — 跟随默认\n`/models` — 列出模型\n`/reasoninglist` 或 `/reasonings` — 按序号列出当前模型可用推理等级\n`/reasoning [序号、等级ID或 --default]` — 查看或切换当前推理等级\n`/model [序号或完整模型ID] [推理等级ID]` — 查看或切换当前会话模型\n`/batch` — 开启批量输入(仅私聊,最多 10 条文字)\n`/send` — 提交当前批次\n`/cancel` — 取消当前批次\n`/repair` — 补全飞书权限与卡片回调': + '**⌨️ Text commands**\n\n`/m` — open the menu card\n`/new` — start a new session\n`/session ID` — bind an existing session\n`/sessionlist [workspace]` or `/sessions [workspace]` — list sessions\n`/workspace PATH` — switch workspace\n`/workspacelist` — list workspaces\n`/status` — view connection status\n`/compact` — compact context\n`/stop` — stop the current task\n`/steer INSTRUCTION` — steer the task\n`/watch ID` — watch a session\n`/watchlist` — list watched sessions\n`/unwatch ID` — stop watching\n`/archived on/off` — show or hide archived sessions\n`/presetlist` or `/presets` — list presets\n`/preset [index/ID]` — switch preset\n`/preset --default` — follow default\n`/models` — list models\n`/reasoninglist` or `/reasonings` — list reasoning efforts for the current model\n`/reasoning [index, effort ID, or --default]` — show or switch reasoning effort\n`/model [index or full model ID] [reasoning effort ID]` — show or switch the current Session model\n`/batch` — start batch input (direct messages only, up to 10 text messages)\n`/send` — submit the current batch\n`/cancel` — cancel the current batch\n`/repair` — complete Feishu permissions and the card callback', '**💡 数字兜底**\n回复数字快速操作:\n**1**工作区列表 · **2**新会话 · **3**会话/关注\n**4**状态 · **5**补全权限 · **6**帮助': '**💡 Number fallback**\nReply with a number for a quick action:\n**1** Workspace list · **2** New session · **3** Sessions/watches\n**4** Status · **5** Complete permissions · **6** Help', '从下方下拉选择补充指令;最后一项可自定义输入。': diff --git a/src/channels/shared/i18n-en/shared-a.mjs b/src/channels/shared/i18n-en/shared-a.mjs index 7696400..d538fd4 100644 --- a/src/channels/shared/i18n-en/shared-a.mjs +++ b/src/channels/shared/i18n-en/shared-a.mjs @@ -124,6 +124,8 @@ export default { '/workspacelist 列出工作区绝对路径': '/workspacelist List absolute workspace paths', '/sessionlist [工作区序号或绝对路径] 列出会话 ID 和标题': '/sessionlist [workspace index or absolute path] List session IDs and titles', + '/sessionlist 或 /sessions [工作区序号或绝对路径] 列出会话 ID 和标题': + '/sessionlist or /sessions [workspace index or absolute path] List session IDs and titles', '/session Session ID 或当前工作区序号 将当前聊天绑定到指定会话': '/session Bind this chat to the specified session', '/models 按序号列出所有可用模型': '/models List all available models by index', @@ -139,6 +141,8 @@ export default { '示例:先发 /models,再发 /model 2 [推理等级ID]': 'Example: send /models first, then /model 2 [reasoning effort ID]', '/presetlist 按序号列出可用 Agent Preset': '/presetlist List available Agent Presets by index', + '/presetlist 或 /presets 按序号列出可用 Agent Preset': + '/presetlist or /presets List available Agent Presets by index', '/preset [序号或完整ID] 查看或设置当前机器人 Agent Preset': '/preset [index or full ID] Show or set the Agent Preset of this bot', '纯数字 ID:/preset id:': 'Numeric-only ID: /preset id:', diff --git a/src/channels/shared/preset-command.mjs b/src/channels/shared/preset-command.mjs index ae5d32f..f0f406a 100644 --- a/src/channels/shared/preset-command.mjs +++ b/src/channels/shared/preset-command.mjs @@ -8,7 +8,7 @@ import { splitWorkspaceCommandMessage } from './workspace-command.mjs'; import { WORKSPACE_SESSION_STALE } from './workspace-session.mjs'; const PRESET_COMMAND = /^\/preset(?=$|\s)/iu; -const PRESET_LIST_COMMAND = /^\/presetlist(?=$|\s)/iu; +const PRESET_LIST_COMMAND = /^\/(?:presetlist|presets)(?=$|\s)/iu; const PRESET_LIST_USAGE = '用法:/presetlist(不带参数)'; const PRESET_USAGE = [ '用法:', @@ -257,7 +257,7 @@ export async function runPresetCommand(text, harness, state, key, options = {}) const requestOptions = rpcOptions(options.signal); if (PRESET_LIST_COMMAND.test(command)) { - if (!/^\/presetlist[ \t]*$/iu.test(command)) return commandResult(t(PRESET_LIST_USAGE)); + if (!/^\/(?:presetlist|presets)[ \t]*$/iu.test(command)) return commandResult(t(PRESET_LIST_USAGE)); try { const current = await settings(harness, requestOptions); saveSnapshot(state, key, current.agentPresetCatalog.items); diff --git a/src/channels/shared/text-harness-bridge.mjs b/src/channels/shared/text-harness-bridge.mjs index fc010df..3399ccd 100644 --- a/src/channels/shared/text-harness-bridge.mjs +++ b/src/channels/shared/text-harness-bridge.mjs @@ -542,14 +542,14 @@ export class TextHarnessBridge { t('/history [数量] 查看最近历史消息(默认 3 条,最多 5 条)'), t('/workspace 工作区绝对路径 切换工作区'), t('/workspacelist 列出工作区绝对路径'), - t('/sessionlist [工作区序号或绝对路径] 列出会话 ID 和标题'), + t('/sessionlist 或 /sessions [工作区序号或绝对路径] 列出会话 ID 和标题'), t('/session Session ID 或当前工作区序号 将当前聊天绑定到指定会话'), t('/models 按序号列出所有可用模型'), t('/reasoninglist 或 /reasonings 按序号列出当前模型可用推理等级'), t('/reasoning [序号、等级ID或 --default] 查看或切换当前推理等级'), t('/model [序号或完整模型ID] [推理等级ID] 查看或切换当前会话模型'), t('示例:先发 /models,再发 /model 2 [推理等级ID]'), - t('/presetlist 按序号列出可用 Agent Preset'), + t('/presetlist 或 /presets 按序号列出可用 Agent Preset'), t('/preset [序号或完整ID] 查看或设置当前机器人 Agent Preset'), t('纯数字 ID:/preset id:'), t('/preset --default 跟随 Host 默认'), diff --git a/src/channels/shared/workspace-command.mjs b/src/channels/shared/workspace-command.mjs index 2d99c79..1d1699b 100644 --- a/src/channels/shared/workspace-command.mjs +++ b/src/channels/shared/workspace-command.mjs @@ -6,7 +6,7 @@ import { WORKSPACE_SESSION_STALE } from './workspace-session.mjs'; const WORKSPACE_COMMAND = /^\/workspace(?:\s+([\s\S]+))?$/i; const WORKSPACE_LIST_COMMAND = /^\/workspacelist(?:\s+([\s\S]+))?$/i; -const SESSION_LIST_COMMAND = /^\/sessionlist(?:\s+([\s\S]+))?$/i; +const SESSION_LIST_COMMAND = /^\/(?:sessionlist|sessions)(?:\s+([\s\S]+))?$/i; const SESSION_BIND_PREFIX = /^\/session(?=$|\s)/i; const SESSION_BIND_COMMAND = /^\/session[ \t]+([^\s]+)$/i; const MAX_WORKSPACE_PATH_LENGTH = 4_096; diff --git a/src/channels/telegram/telegram-runtime.mjs b/src/channels/telegram/telegram-runtime.mjs index fee13a4..9b0eee3 100644 --- a/src/channels/telegram/telegram-runtime.mjs +++ b/src/channels/telegram/telegram-runtime.mjs @@ -22,10 +22,12 @@ export const TELEGRAM_COMMAND_MENU = Object.freeze([ { command: 'workspace', description: '切换工作区' }, { command: 'workspacelist', description: '列出工作区绝对路径' }, { command: 'sessionlist', description: '列出会话 ID 和标题' }, + { command: 'sessions', description: '列出会话 ID 和标题' }, { command: 'session', description: '将当前聊天绑定到指定会话' }, { command: 'models', description: '按序号列出所有可用模型' }, { command: 'model', description: '查看或切换当前会话模型' }, { command: 'presetlist', description: '列出可用 Agent Preset' }, + { command: 'presets', description: '列出可用 Agent Preset' }, { command: 'preset', description: '查看或设置新会话 Agent Preset' }, { command: 'stop', description: '停止当前任务' }, { command: 'steer', description: '纠偏当前任务' }, diff --git a/src/channels/wecom/wecom-bridge.mjs b/src/channels/wecom/wecom-bridge.mjs index f8a6e0f..15935ae 100644 --- a/src/channels/wecom/wecom-bridge.mjs +++ b/src/channels/wecom/wecom-bridge.mjs @@ -66,14 +66,14 @@ function helpText() { t('/history [数量] 查看最近历史消息(默认 3 条,最多 5 条)'), t('/workspace 工作区绝对路径 切换工作区'), t('/workspacelist 列出工作区绝对路径'), - t('/sessionlist [工作区序号或绝对路径] 列出会话 ID 和标题'), + t('/sessionlist 或 /sessions [工作区序号或绝对路径] 列出会话 ID 和标题'), t('/session Session ID 或当前工作区序号 将当前聊天绑定到指定会话'), t('/models 按序号列出所有可用模型'), t('/reasoninglist 或 /reasonings 按序号列出当前模型可用推理等级'), t('/reasoning [序号、等级ID或 --default] 查看或切换当前推理等级'), t('/model [序号或完整模型ID] [推理等级ID] 查看或切换当前会话模型'), t('示例:先发 /models,再发 /model 2 [推理等级ID]'), - t('/presetlist 按序号列出可用 Agent Preset'), + t('/presetlist 或 /presets 按序号列出可用 Agent Preset'), t('/preset [序号或完整ID] 查看或设置当前机器人 Agent Preset'), t('纯数字 ID:/preset id:'), t('/preset --default 跟随 Host 默认'), diff --git a/src/channels/weixin/weixin-bridge.mjs b/src/channels/weixin/weixin-bridge.mjs index 7582075..d6d80d2 100644 --- a/src/channels/weixin/weixin-bridge.mjs +++ b/src/channels/weixin/weixin-bridge.mjs @@ -73,14 +73,14 @@ const HELP_TEXT = () => [ t('/history [数量] 查看最近历史消息(默认 3 条,最多 5 条)'), t('/workspace 工作区绝对路径 切换工作区'), t('/workspacelist 列出工作区绝对路径'), - t('/sessionlist [工作区序号或绝对路径] 列出会话 ID 和标题'), + t('/sessionlist 或 /sessions [工作区序号或绝对路径] 列出会话 ID 和标题'), t('/session Session ID 或当前工作区序号 将当前聊天绑定到指定会话'), t('/models 按序号列出所有可用模型'), t('/reasoninglist 或 /reasonings 按序号列出当前模型可用推理等级'), t('/reasoning [序号、等级ID或 --default] 查看或切换当前推理等级'), t('/model [序号或完整模型ID] [推理等级ID] 查看或切换当前会话模型'), t('示例:先发 /models,再发 /model 2 [推理等级ID]'), - t('/presetlist 按序号列出可用 Agent Preset'), + t('/presetlist 或 /presets 按序号列出可用 Agent Preset'), t('/preset [序号或完整ID] 查看或设置当前机器人 Agent Preset'), t('纯数字 ID:/preset id:'), t('/preset --default 跟随 Host 默认'), diff --git a/test/channels/feishu/bridge.test.mjs b/test/channels/feishu/bridge.test.mjs index c968fac..6a731fe 100644 --- a/test/channels/feishu/bridge.test.mjs +++ b/test/channels/feishu/bridge.test.mjs @@ -3768,7 +3768,7 @@ test('preset card selection does not expose internal update errors', async () => function cards(messages) { return messages.filter((m) => m.msgType === 'interactive'); } -test('session list paginates by page number across 25 sessions', async () => { +test('/sessions alias uses the interactive session list and paginates across 25 sessions', async () => { const fixture = stateFixture(); const sent = []; const bridge = new FeishuHarnessBridge({ @@ -3782,7 +3782,7 @@ test('session list paginates by page number across 25 sessions', async () => { allowedSenderOpenIds: new Set(['ou_owner']), }); - await bridge.accept(event('sessions-open', '/sessionlist', { senderOpenId: 'ou_owner' })); + await bridge.accept(event('sessions-open', ' /SESSIONS ', { senderOpenId: 'ou_owner' })); await bridge.waitForIdle(); assert.equal(cards(sent).length, 1); const page0 = cards(sent).at(-1).content; @@ -3870,7 +3870,7 @@ test('session pagination preserves an explicitly selected workspace', async () = allowedSenderOpenIds: new Set(['ou_owner']), }); - await bridge.accept(event('selected-workspace-open', '/sessionlist 2', { senderOpenId: 'ou_owner' })); + await bridge.accept(event('selected-workspace-open', '/sessions 2', { senderOpenId: 'ou_owner' })); await bridge.waitForIdle(); assert.equal(useActionsFromCard(cards(sent).at(-1).content)[0], 'selected-01'); diff --git a/test/channels/feishu/feishu-cards.test.mjs b/test/channels/feishu/feishu-cards.test.mjs index 30e0515..e3ec0ad 100644 --- a/test/channels/feishu/feishu-cards.test.mjs +++ b/test/channels/feishu/feishu-cards.test.mjs @@ -67,6 +67,8 @@ test('menu exposes the increased command set and keeps permission completion num test('menu and card help advertise Agent Preset, reasoning, and batch commands', () => { const help = menuHelpText(); assert.match(help, /\/presetlist/); + assert.match(help, /\/presets/); + assert.match(help, /\/sessions/); assert.match(help, /\/preset \[序号或完整ID\]/); assert.match(help, /\/preset id:/); assert.match(help, /\/preset --default/); @@ -79,6 +81,8 @@ test('menu and card help advertise Agent Preset, reasoning, and batch commands', assert.match(help, /\/version/); const card = helpCard(); + assert.match(card, /\/presets/); + assert.match(card, /\/sessions/); assert.match(card, /\/reasoninglist/); assert.match(card, /\/reasonings/); assert.match(card, /\/reasoning \[序号、等级ID或 --default\]/); diff --git a/test/channels/telegram/telegram.test.mjs b/test/channels/telegram/telegram.test.mjs index 09da7a6..caf507a 100644 --- a/test/channels/telegram/telegram.test.mjs +++ b/test/channels/telegram/telegram.test.mjs @@ -218,9 +218,10 @@ test('Telegram API registers the command menu and commands-type menu button', as await api.setChatMenuButton(); assert.equal(calls.length, 2); assert.deepEqual( - TELEGRAM_COMMAND_MENU.filter(({ command }) => command === 'presetlist' || command === 'preset'), + TELEGRAM_COMMAND_MENU.filter(({ command }) => ['presetlist', 'presets', 'preset'].includes(command)), [ { command: 'presetlist', description: '列出可用 Agent Preset' }, + { command: 'presets', description: '列出可用 Agent Preset' }, { command: 'preset', description: '查看或设置新会话 Agent Preset' }, ], ); diff --git a/test/preset-command.test.mjs b/test/preset-command.test.mjs index e7463fa..2381a18 100644 --- a/test/preset-command.test.mjs +++ b/test/preset-command.test.mjs @@ -46,20 +46,35 @@ function fixture({ return { calls, harness, state: {}, selected: () => selected }; } -test('isPresetCommand recognizes only /presetlist and /preset command prefixes', () => { +test('isPresetCommand recognizes /presets, /presetlist, and /preset command prefixes', () => { for (const command of [ - '/presetlist', ' /PRESETLIST ', '/presetlist ignored', + '/presetlist', ' /PRESETLIST ', '/presetlist ignored', '/presets', ' /PRESETS ', '/preset', '/PrEsEt coding', ]) { assert.equal(isPresetCommand(command), true, command); } for (const value of [ - null, '', 'preset', '/presetx', '/presetlisting', 'hello /preset', + null, '', 'preset', '/presetx', '/presetlisting', '/presetss', 'hello /preset', ]) { assert.equal(isPresetCommand(value), false, String(value)); } }); +test('/presets reuses /presetlist validation, listing, and snapshot behavior', async () => { + const { calls, harness, state } = fixture({ agentPreset: 'coding' }); + const listed = await runPresetCommand(' /PRESETS ', harness, state, 'direct:alias'); + + assert.match(listed.message, /2\. Coding(coding)(当前选择)/); + assert.deepEqual(calls, [['agentPresetSettings', {}]]); + + const selected = await runPresetCommand('/preset 1', harness, state, 'direct:alias'); + assert.match(selected.message, /Standard(standard)/); + assert.deepEqual(calls.at(-1), ['updateAgentPreset', 'standard', {}]); + + const invalid = await runPresetCommand('/presets unexpected', harness, state, 'direct:alias'); + assert.match(invalid.message, /用法:\/presetlist/); +}); + test('/presetlist dynamically lists, annotates, and snapshots presets without updating', async () => { const { calls, harness, state } = fixture({ agentPreset: 'coding' }); const signal = new AbortController().signal; diff --git a/test/workspace.test.mjs b/test/workspace.test.mjs index cb8a9ec..ab16b81 100644 --- a/test/workspace.test.mjs +++ b/test/workspace.test.mjs @@ -1068,6 +1068,30 @@ test('/sessionlist supports the current workspace, list numbers, and absolute pa assert.equal(workspaceListCalls, 1, 'only numeric selection needs the workspace registry order'); }); +test('/sessions reuses /sessionlist parsing for current, numbered, and absolute workspaces', async (t) => { + const { defaultWorkspace, alternateWorkspace } = await fixture(t); + const calls = []; + const harness = { + currentWorkspace() { return defaultWorkspace; }, + async listWorkspaces() { return [alternateWorkspace]; }, + async listWorkspaceSessions(workspace) { + calls.push(workspace); + return { workspace, sessions: [] }; + }, + }; + + await runWorkspaceCommand(' /SESSIONS ', harness); + await runWorkspaceCommand('/sessions 2', harness); + await runWorkspaceCommand(`/sessions ${alternateWorkspace}`, harness); + + assert.deepEqual(calls, [defaultWorkspace, alternateWorkspace, alternateWorkspace]); + assert.equal(await runWorkspaceCommand('/sessionsx', harness), null); + assert.match( + (await runWorkspaceCommand('/sessions relative/path', harness)).message, + /工作区必须是绝对路径/, + ); +}); + test('/sessionlist returns actionable and safe errors', async (t) => { const { root, defaultWorkspace } = await fixture(t); const file = join(root, 'not-a-workspace.txt'); @@ -1226,7 +1250,7 @@ test('all nine channel bridge families advertise and fan out workspace command r for (const file of bridgeFiles) { const source = await readFile(new URL(file, import.meta.url), 'utf8'); assert.match(source, /\/workspacelist 列出工作区绝对路径/); - assert.match(source, /\/sessionlist \[工作区序号或绝对路径\] 列出会话 ID 和标题/); + assert.match(source, /\/sessionlist 或 \/sessions \[工作区序号或绝对路径\] 列出会话 ID 和标题/); assert.match(source, /workspaceCommand\.messages \?\? \[workspaceCommand\.message\]/); } });