aws-runtime-bridge 1.9.181 → 1.9.182

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,33 @@ files 白名单),供调度中心「查看本次更新内容」弹窗按 `##
5
5
  展示。发布新版本时须在仓库中先写好 `## v<version>` 段(prepack-guard 校验缺段
6
6
  即阻断发布);Bridge 自更新成功后的运行时追加仅作为包内缺段时的兜底。
7
7
 
8
+ ## v1.9.182
9
+
10
+ _发布日期:2026-11-01_
11
+
12
+ ### 新增:配对成功即生效,无需重启 Bridge
13
+
14
+ `awsb pair` 成功写盘后,CLI 会调用本机运行中 Bridge 的回环端点
15
+ `POST /runtime/pair-applied`,让它立即用磁盘上的最新配置重新注册并重建隧道。
16
+ 此前配对只写盘、长期运行的 Bridge 只在启动时注册,不重启就永远显示「隧道未连接」。
17
+
18
+ - 端点只认回环来源(与 `/binding/request-token` 同口径),并做单飞防抖:
19
+ 上一轮注册未结束时直接复用,不会并发跑两趟 autoRegister;
20
+ - 立即应答、注册在后台进行(含重试可能耗时数秒),面板「等待连接」轮询如实反映结果;
21
+ - Bridge 未运行(首次安装尚未启动服务)或是旧版本(404)时通知静默失败,
22
+ CLI 回落为原有的 `awsb service restart` 提示。
23
+
24
+ ### 修复:transcribe_voice 工具有声明无分发
25
+
26
+ `aws-client-agent-mcp` 早已声明 `transcribe_voice` 工具,但 `mcp-server` 的分发
27
+ 分支漏接,调用一律落到 Unknown tool。ASR 推理在服务端容器执行,这里补上
28
+ `callAgentScopedTool` 转发(自动注入 agentId),agent 侧语音复听/转写校验恢复可用。
29
+
30
+ ### 调整:voice.emotion 说明对齐云端指令级情绪
31
+
32
+ 工具描述从「只影响语速与句间停顿」改为区分链路:云端合成按自然语言指令真正
33
+ 改变语气(开心/兴奋/平静/低落/郑重),本地兜底只有语速与句间停顿。
34
+
8
35
  ## v1.9.181
9
36
 
10
37
  _发布日期:2026-11-01_
@@ -1,4 +1,4 @@
1
- import{execFile as ne}from"node:child_process";import y from"node:fs";import B from"node:os";import V from"node:path";import{Router as ae}from"express";import{getBridgeVersion as re,getRuntimeHomeDir as se,getUserHomeDir as oe}from"../config.js";import{getAccessControlEntries as ie,isValidIpEntry as de,parseAllowIps as le,refreshAccessControlCache as ce}from"../services/access-control.js";import{getAgentProcessManager as P}from"../services/agent-process-manager.js";import{autoRegister as ue,getRegistrationState as $,getAutoRegisterConfigFilePath as A}from"../services/auto-register.js";import{createSession as ge,getPanelCredentials as D,validateSession as H,destroySession as W,validateCredentials as J,hasConfiguredCredentials as R,isDefaultCredentials as pe,setPanelCredentials as fe,getAllSessions as me,getActiveSessionCount as he,checkLoginAllowed as be,recordLoginFailure as ve,recordLoginSuccess as ye}from"../services/panel-auth.js";import{getRuntimeBindingPublicState as q,getRuntimePairingCode as xe,normalizeSchedulerBaseUrl as we}from"../services/runtime-binding.js";import{collectSystemMetrics as ke}from"../services/system-metrics.js";import{loadPersistedSessions as Se}from"../services/terminal-persistence.js";import{runExclusiveConfigWrite as G}from"../utils/config-write-queue.js";import{createLogger as Ie,getRecentLogs as Be}from"../utils/logger.js";import{buildTargetKey as T}from"../utils/target-identity.js";import{DASHBOARD_FAVICON_DATA_URI as Y,DASHBOARD_FAVICON_LINK as O}from"./dashboard-icon.js";import{THEME_CSS as j,THEME_BOOT_SCRIPT as z,THEME_FAB_SCRIPT as X}from"./dashboard-theme.js";import{sdkSessions as Ce}from"./terminal.js";const x=Ie("dashboard");let N=null;const Ee=1e4;let M=null,U=null;const Ae=3e4;async function F(){ke().then(t=>{M={data:t,ts:Date.now()}}).catch(()=>{}),P().discoverAllProcesses().then(t=>{U={data:t,ts:Date.now()}}).catch(()=>{}),P().cleanupStaleRegistry().catch(()=>{})}const Te=12e4;let C=null,k=null;function Pe(){k&&(clearTimeout(k),k=null),k=setTimeout(Re,Te),k.unref?.(),C===null&&(C=setInterval(F,Ae),C.unref?.(),F())}function Re(){C&&(clearInterval(C),C=null),k&&(clearTimeout(k),k=null)}const Q=re();async function Ne(){const t=await import("node:fs/promises"),n=(await import("node:path")).join(se(),".aws-bridge","lifecycle-state.json");try{const a=await t.readFile(n,"utf8"),o=JSON.parse(a),r=Array.isArray(o.operations)?o.operations:[];return r.length===0?null:(r.sort((s,d)=>new Date(d.updatedAt).getTime()-new Date(s.updatedAt).getTime()),r[0]||null)}catch{return null}}const f=ae(),Ue=["/runtime/login","/runtime/logout","/runtime/credentials-status","/runtime/change-credentials","/runtime/server-config","/runtime/access-control","/runtime/node-info","/runtime/logs","/runtime/re-register","/runtime/admin","/runtime/kill-process","/runtime/dashboard","/login","/setup"];function Le(t){return t==="/"?!0:Ue.some(e=>t===e||t.startsWith(`${e}/`))}f.use((t,e,n)=>{Le(t.path)&&Pe(),n()});const Z="panel_sid";function Ke(t){const e={};if(!t)return e;for(const n of t.split(";")){const a=n.indexOf("=");if(a===-1)continue;const o=n.slice(0,a).trim(),r=n.slice(a+1).trim();o&&(e[o]=r)}return e}function L(t){return Ke(t.headers.cookie)[Z]}function ee(t,e,n){const a=t.secure||t.headers["x-forwarded-proto"]==="https";return`${Z}=${e}; HttpOnly; SameSite=Lax; Path=/${a?"; Secure":""}; Max-Age=${n}`}function v(t,e){const n=L(t);return n&&H(n)?!0:t.xhr||t.headers.accept?.includes("application/json")?(e.status(401).json({ok:!1,error:"unauthorized",needLogin:!0}),!1):(e.redirect("/login"),!1)}f.post("/runtime/login",(t,e)=>{const n=t.socket.remoteAddress||"unknown",a=be(n);if(!a.allowed){e.status(429).set("Retry-After",String(a.retryAfterSec)).json({ok:!1,error:"too many failed login attempts, try again later",retryAfterSec:a.retryAfterSec});return}const{username:o,password:r}=t.body||{};if(!o||!r){e.status(400).json({ok:!1,error:"username and password required"});return}if(!J(String(o),String(r))){ve(n),e.status(401).json({ok:!1,error:"invalid credentials"});return}ye(n);const s=ge(),d=!R();e.setHeader("Set-Cookie",ee(t,s,86400)),e.json({ok:!0,needSetup:d})}),f.post("/runtime/logout",(t,e)=>{const n=L(t);n&&W(n),e.setHeader("Set-Cookie",ee(t,"",0)),e.json({ok:!0})}),f.get("/runtime/credentials-status",(t,e)=>{if(!v(t,e))return;const n=D();e.json({ok:!0,isDefault:pe(),configured:R(),username:n.username})}),f.post("/runtime/change-credentials",async(t,e)=>{if(!v(t,e))return;const{username:n,password:a,passwordConfirm:o,oldPassword:r}=t.body||{};if(a&&String(a).trim()){if(String(a)!==String(o)){e.status(400).json({ok:!1,error:"passwords do not match"});return}if(R()){if(!r){e.status(400).json({ok:!1,error:"old password required"});return}const d=D();if(!J(d.username,String(r))){e.status(403).json({ok:!1,error:"old password is incorrect"});return}}}if(!n||!String(n).trim()){e.status(400).json({ok:!1,error:"username required"});return}const s=a&&String(a).trim()?String(a).trim():D().password;try{await fe(String(n).trim(),s),e.json({ok:!0})}catch(d){const l=d;x.error("Failed to change panel credentials:",l.message),e.status(500).json({ok:!1,error:l.message})}});function te(t){const e=typeof t=="string"?t.trim():"";if(e)return e.length<8?"\u2022\u2022\u2022\u2022":"\u2022\u2022\u2022\u2022"+e.slice(-4)}function _(t){const e=Array.isArray(t.autoRegisterTargets)?t.autoRegisterTargets.filter(a=>!!(a&&typeof a=="object"&&!Array.isArray(a))):[];return e.length>0?e:["serverUrl","schedulerBaseUrl","userKey"].some(a=>!!String(t[a]??"").trim())?[t]:[]}const De=["enabled","serverUrl","schedulerBaseUrl","tenantId","userKey","connectionKey","password","instanceName","instanceId","projectId","roleName","workspacePath","registerAddr","registerIp","virtualIp","tunnel","preferSameLanIp","maxRetries","retryInterval"];function He(t){const e={};for(const n of De)t[n]!==void 0&&(e[n]=t[n]);return e}function Oe(t,e){const n=String(t.connectionKey??"").trim()||String(e??"").trim();return{serverUrl:String(t.serverUrl??t.schedulerBaseUrl??"").trim(),tenantId:String(t.tenantId??"").trim(),instanceName:String(t.instanceName??"").trim(),instanceId:String(t.instanceId??"").trim()||void 0,registerAddr:String(t.registerAddr??"").trim(),tunnel:typeof t.tunnel=="boolean"?t.tunnel:void 0,userKeyMasked:te(t.userKey),userKeySet:!!String(t.userKey??"").trim(),connectionKeyMasked:te(n),connectionKeySet:!!n,targetKey:T(String(t.serverUrl??t.schedulerBaseUrl??"").trim(),t.userKey)}}function je(t){return we(t)??String(t||"").trim()}f.get("/runtime/server-config",(t,e)=>{if(!v(t,e))return;const n=A();let a={};if(y.existsSync(n))try{a=JSON.parse(y.readFileSync(n,"utf-8"))}catch{e.status(500).json({ok:!1,error:"config.json is not valid JSON; fix it manually first"});return}const o=String(a.connectionKey??"").trim()||void 0,r=_(a).map(s=>Oe(s,o));e.json({ok:!0,targets:r})}),f.get("/runtime/server-config/connection-key",(t,e)=>{if(!v(t,e))return;const n=String((t.query||{}).targetKey??"").trim();if(!n){e.status(400).json({ok:!1,error:"targetKey is required"});return}const a=A();if(!y.existsSync(a)){e.status(404).json({ok:!1,error:"config.json not found"});return}let o;try{o=JSON.parse(y.readFileSync(a,"utf-8"))}catch{e.status(500).json({ok:!1,error:"config.json is not valid JSON"});return}const r=String(o.connectionKey??"").trim()||void 0,s=_(o).find(l=>T(String(l.serverUrl??l.schedulerBaseUrl??"").trim(),l.userKey)===n),d=String(s?.connectionKey??"").trim()||r||"";if(!d){e.status(404).json({ok:!1,error:"\u8BE5\u76EE\u6807\u5C1A\u672A\u914D\u7F6E\u8FDE\u63A5\u5BC6\u94A5\uFF1B\u542F\u52A8\u4E00\u6B21 Bridge \u4F1A\u81EA\u52A8\u751F\u6210\u5E76\u5199\u5165 config.json"});return}e.setHeader("Cache-Control","no-store"),e.json({ok:!0,connectionKey:d})});function K(t,e){const n=new Error(e);return n.status=t,n}f.post("/runtime/server-config",async(t,e)=>{if(!v(t,e))return;const n=(t.body||{}).targets;if(!Array.isArray(n)){e.status(400).json({ok:!1,error:"targets array is required"});return}const a=[];for(let o=0;o<n.length;o++){const r=n[o];if(!r||typeof r!="object"||Array.isArray(r)){e.status(400).json({ok:!1,error:`targets[${o}] must be an object`});return}const s=r,d=String(s.serverUrl??s.schedulerBaseUrl??"").trim();if(!d){e.status(400).json({ok:!1,error:`targets[${o}].serverUrl is required`});return}try{const w=new URL(d);if(!["http:","https:"].includes(w.protocol))throw new Error("protocol must be http or https")}catch{e.status(400).json({ok:!1,error:`targets[${o}].serverUrl must be a valid http(s) URL`});return}const l=s.tunnel;let m;if(l==="auto"||l===""||l===null||l===void 0)m=void 0;else if(l===!0||l==="true")m=!0;else if(l===!1||l==="false")m=!1;else{e.status(400).json({ok:!1,error:`targets[${o}].tunnel must be auto, true or false`});return}const h=String(s.originalServerUrl??"").trim();a.push({serverUrl:d,originalServerUrl:h&&h!==d?h:"",originalTargetKey:String(s.originalTargetKey??"").trim(),userKey:String(s.userKey??"").trim(),tenantId:String(s.tenantId??"").trim(),instanceName:String(s.instanceName??"").trim(),connectionKey:String(s.connectionKey??"").trim(),registerAddr:String(s.registerAddr??"").trim(),tunnel:m})}try{const o=A();await G(o,()=>{let r={};if(y.existsSync(o))try{r=JSON.parse(y.readFileSync(o,"utf-8"))}catch{throw K(500,"config.json is not valid JSON; fix it manually first")}const s=String(r.connectionKey??"").trim(),d=_(r),l=d.length>0&&d[0]===r,m=new Map;for(const i of d){const u=T(String(i.serverUrl??i.schedulerBaseUrl??"").trim(),i.userKey);m.set(u,l?He(i):i)}const h=[];for(const i of a){let u;const b=g=>{const c=m.get(g);return c&&m.delete(g),c},S=(g,c)=>T(g,c),E=g=>{const c=`${je(g)}#`;return[...m.keys()].filter(I=>I.startsWith(c))};if(i.originalTargetKey&&(u=b(i.originalTargetKey)),!u&&i.originalServerUrl&&(u=b(S(i.originalServerUrl,i.userKey)),!u)){const g=E(i.originalServerUrl);g.length===1&&(u=b(g[0]))}if(u||(u=b(S(i.serverUrl,i.userKey))),!u){const g=E(i.serverUrl);g.length>=1&&(u=b(g[0]))}const p=u?{...u}:{};if(p.serverUrl=i.serverUrl,p.tenantId=i.tenantId,p.instanceName=i.instanceName,p.registerAddr=i.registerAddr,i.tunnel===void 0?delete p.tunnel:p.tunnel=i.tunnel,i.userKey)p.userKey=i.userKey;else if(!String(p.userKey??"").trim())throw K(400,`userKey is required for ${i.serverUrl} (new target without inheritable userKey)`);i.connectionKey?p.connectionKey=i.connectionKey:!String(p.connectionKey??"").trim()&&s&&(p.connectionKey=s),h.push(p)}const w=new Map;for(let i=0;i<h.length;i++){const u=h[i],b=T(String(u.serverUrl??u.schedulerBaseUrl??"").trim(),u.userKey),S=w.get(b);if(S!==void 0)throw K(400,`duplicate target: ${String(u.serverUrl??"")} appears in both targets[${S}] and targets[${i}] with the same API key; the same scheduler address can be added multiple times only with different API keys`);w.set(b,i)}r.autoRegisterTargets=h;for(const i of["enabled","serverUrl","schedulerBaseUrl","tenantId","userKey","connectionKey","password","instanceName","instanceId","registerAddr","registerIp","virtualIp","tunnel"])delete r[i];y.mkdirSync(V.dirname(o),{recursive:!0}),y.writeFileSync(o,JSON.stringify(r,null,2),"utf-8")}),x.info("Server connection config updated via panel",{configPath:o,targetCount:a.length}),e.json({ok:!0})}catch(o){const r=o,s=Number(r.status)||500;s>=500&&x.error("Failed to save server connection config:",r.message),e.status(s).json({ok:!1,error:r.message})}}),f.get("/runtime/access-control",(t,e)=>{v(t,e)&&e.json({ok:!0,allowIps:ie(),defaultAllowIps:["0.0.0.0"]})}),f.post("/runtime/access-control",async(t,e)=>{if(!v(t,e))return;const n=(t.body||{}).allowIps;if(typeof n!="string"&&!Array.isArray(n)){e.status(400).json({ok:!1,error:"allowIps must be a string or an array"});return}const a=le(n),o=a.filter(r=>!de(r));if(o.length>0){e.status(400).json({ok:!1,error:`invalid IP/CIDR entries: ${o.join(", ")}`});return}try{const r=A();await G(r,()=>{let s={};if(y.existsSync(r))try{s=JSON.parse(y.readFileSync(r,"utf-8"))}catch{throw K(500,"config.json is not valid JSON; fix it manually first")}const d=s.accessControl&&typeof s.accessControl=="object"&&!Array.isArray(s.accessControl)?{...s.accessControl}:{};d.allowIps=a,s.accessControl=d,y.mkdirSync(V.dirname(r),{recursive:!0}),y.writeFileSync(r,JSON.stringify(s,null,2),"utf-8"),ce()}),x.info("Access control config updated via panel",{configPath:r,entryCount:a.length}),e.json({ok:!0,allowIps:a})}catch(r){const s=r,d=Number(s.status)||500;d>=500&&x.error("Failed to save access control config:",s.message),e.status(d).json({ok:!1,error:s.message})}}),f.get("/runtime/node-info",(t,e)=>{if(!v(t,e))return;const n=q(),a=$();e.json({ok:!0,hostname:B.hostname(),platform:B.platform(),arch:B.arch(),uptime:Math.floor(process.uptime()),nodeVersion:process.version,bridgeVersion:Q,configPath:A(),homeDir:oe(),bindingStatus:n.status,paired:n.paired,instanceId:n.instanceId||a.instanceId,schedulerBaseUrl:n.schedulerBaseUrl,registered:a.registered,pairingCode:n.pairingCode,activeSessions:he()})}),f.get("/runtime/logs",(t,e)=>{if(!v(t,e))return;const n=t.query.level||void 0,a=Math.min(Number(t.query.count)||200,500),r=n&&["debug","info","warn","error"].includes(n)?n:void 0,s=Be(a,r);e.json({ok:!0,logs:s})}),f.post("/runtime/re-register",async(t,e)=>{if(v(t,e))try{const n=await ue();e.json({ok:n})}catch(n){const a=n;e.status(500).json({ok:!1,error:a.message})}}),f.get("/runtime/admin/sessions",(t,e)=>{if(!v(t,e))return;const n=me().map(a=>({token:a.token.slice(0,8)+"...",createdAt:new Date(a.createdAt).toISOString(),lastUsedAt:new Date(a.lastUsedAt).toISOString(),age:Math.floor((Date.now()-a.createdAt)/1e3)}));e.json({ok:!0,sessions:n})}),f.post("/runtime/admin/sessions/:token/destroy",(t,e)=>{v(t,e)&&(W(t.params.token),e.json({ok:!0}))});function ze(t){return new Promise((e,n)=>{const a=B.platform()==="win32",o=a?"taskkill":"kill",r=a?["/PID",String(t),"/F"]:["-9",String(t)];ne(o,r,{timeout:5e3},s=>s?n(s):e())})}f.post("/runtime/kill-process",async(t,e)=>{if(!v(t,e))return;const n=Number(t.body.pid);if(!n||!Number.isInteger(n)||n<=0){e.status(400).json({ok:!1,error:"Invalid PID"});return}const a=P(),o=()=>{const s=new Set,d=U?.data??[];for(const l of d)typeof l.pid=="number"&&s.add(l.pid);for(const l of a.getAllManagedProcesses())typeof l.pid=="number"&&s.add(l.pid);return s};let r=o();if(r.size===0)try{U={data:await a.discoverAllProcesses(),ts:Date.now()},r=o()}catch{}if(!r.has(n)){x.warn("Rejected kill-process for unrecognized PID",{pid:n}),e.status(404).json({ok:!1,error:"PID is not a bridge-discovered or registered agent process"});return}try{await ze(n),x.info("Killed process",{pid:n}),e.json({ok:!0})}catch(s){const d=s;x.warn("Failed to kill process",{pid:n,error:d.message}),e.status(500).json({ok:!1,error:d.message})}}),f.get("/runtime/dashboard",async(t,e)=>{if(v(t,e)){if(N&&Date.now()-N.ts<Ee)return void e.json(N.data);try{const n=M?.data??null,a=U?.data??null;M||F();const[o,r,s]=await Promise.all([Promise.resolve(q()),Promise.resolve($()),Se().catch(()=>[])]),l=P().getAllManagedProcesses(),m=Array.from(Ce.entries()).map(([p,g])=>({sessionId:p,agentId:g.agentId,workspacePath:g.workspacePath,runtimeStatus:g.currentRuntimeStatus||"running",runtimeActionType:g.currentRuntimeActionType,runtimeActionLabel:g.currentRuntimeActionLabel,providerId:g.providerId}));let h={managed:0,orphan:0,unknown:0},w=[];if(a){h={managed:a.filter(c=>c.managementStatus==="managed").length,orphan:a.filter(c=>c.managementStatus==="orphan").length,unknown:a.filter(c=>c.managementStatus==="unknown").length};const p=new Map(l.map(c=>[c.pid,c]));w=a.map(c=>{const I=p.get(c.pid);return{agentId:c.agentId||I?.agentId,pid:c.pid,managementStatus:c.managementStatus,sessionId:I?.sessionId,state:I?.state,command:c.command,cwd:c.cwd,startedAt:c.startedAt}});const g={managed:0,orphan:1,unknown:2};w.sort((c,I)=>(g[c.managementStatus]??9)-(g[I.managementStatus]??9))}const i=new Set(m.map(p=>p.sessionId)),u=s.filter(p=>!i.has(p.sessionId)),b=o,S=await Ne(),E={ok:!0,collectedAt:new Date().toISOString(),bridge:{version:Q,hostname:B.hostname(),platform:B.platform(),arch:B.arch(),uptime:Math.floor(process.uptime()),nodeVersion:process.version},binding:{status:b.status,paired:b.paired,instanceId:b.instanceId,userId:b.userId,schedulerBaseUrl:b.schedulerBaseUrl,pairingCode:xe()},registration:{registered:r.registered,instanceId:r.instanceId,lastAttempt:r.lastAttempt?.toISOString(),error:r.error},metrics:n,sessions:{active:m,activeCount:m.length,persisted:u,persistedCount:u.length,total:m.length+u.length},processes:{...h,total:h.managed+h.orphan+h.unknown,list:w,registryCount:l.length},lifecycleOperation:S};N={data:E,ts:Date.now()},e.json(E)}catch(n){const a=n;x.error("Dashboard aggregation failed:",a.message),e.status(500).json({ok:!1,error:a.message})}}}),f.get("/login",(t,e)=>{e.type("text/html; charset=utf-8"),e.send(Fe)}),f.get("/",(t,e)=>{const n=L(t);if(!n||!H(n)){e.redirect("/login");return}if(!R()){e.redirect("/setup");return}const a=t.query.lang==="en"?"en":"zh";e.type("text/html; charset=utf-8"),e.send(Me.replace("{{LANG}}",a))}),f.get("/setup",(t,e)=>{const n=L(t);if(!n||!H(n)){e.redirect("/login");return}e.type("text/html; charset=utf-8"),e.send(_e)});const Me=`<!DOCTYPE html>
1
+ import{execFile as re}from"node:child_process";import y from"node:fs";import B from"node:os";import $ from"node:path";import{Router as se}from"express";import{getBridgeVersion as oe,getRuntimeHomeDir as ie,getUserHomeDir as de}from"../config.js";import{getAccessControlEntries as le,isValidIpEntry as ce,parseAllowIps as ue,refreshAccessControlCache as ge}from"../services/access-control.js";import{getAgentProcessManager as P}from"../services/agent-process-manager.js";import{autoRegister as W,getRegistrationState as J,getAutoRegisterConfigFilePath as A}from"../services/auto-register.js";import{createSession as pe,getPanelCredentials as D,validateSession as H,destroySession as q,validateCredentials as G,hasConfiguredCredentials as R,isDefaultCredentials as fe,setPanelCredentials as me,getAllSessions as he,getActiveSessionCount as be,checkLoginAllowed as ve,recordLoginFailure as ye,recordLoginSuccess as xe}from"../services/panel-auth.js";import{getRuntimeBindingPublicState as Y,getRuntimePairingCode as we,normalizeSchedulerBaseUrl as ke}from"../services/runtime-binding.js";import{collectSystemMetrics as Se}from"../services/system-metrics.js";import{loadPersistedSessions as Ie}from"../services/terminal-persistence.js";import{runExclusiveConfigWrite as X}from"../utils/config-write-queue.js";import{createLogger as Be,getRecentLogs as Ce}from"../utils/logger.js";import{buildTargetKey as T}from"../utils/target-identity.js";import{DASHBOARD_FAVICON_DATA_URI as Q,DASHBOARD_FAVICON_LINK as O}from"./dashboard-icon.js";import{THEME_CSS as j,THEME_BOOT_SCRIPT as z,THEME_FAB_SCRIPT as Z}from"./dashboard-theme.js";import{sdkSessions as Ee}from"./terminal.js";const x=Be("dashboard");let N=null;const Ae=1e4;let M=null,U=null;const Te=3e4;async function F(){Se().then(t=>{M={data:t,ts:Date.now()}}).catch(()=>{}),P().discoverAllProcesses().then(t=>{U={data:t,ts:Date.now()}}).catch(()=>{}),P().cleanupStaleRegistry().catch(()=>{})}const Pe=12e4;let C=null,k=null;function Re(){k&&(clearTimeout(k),k=null),k=setTimeout(Ne,Pe),k.unref?.(),C===null&&(C=setInterval(F,Te),C.unref?.(),F())}function Ne(){C&&(clearInterval(C),C=null),k&&(clearTimeout(k),k=null)}const ee=oe();async function Ue(){const t=await import("node:fs/promises"),n=(await import("node:path")).join(ie(),".aws-bridge","lifecycle-state.json");try{const a=await t.readFile(n,"utf8"),o=JSON.parse(a),r=Array.isArray(o.operations)?o.operations:[];return r.length===0?null:(r.sort((s,d)=>new Date(d.updatedAt).getTime()-new Date(s.updatedAt).getTime()),r[0]||null)}catch{return null}}const p=se(),Le=["/runtime/login","/runtime/logout","/runtime/credentials-status","/runtime/change-credentials","/runtime/server-config","/runtime/access-control","/runtime/node-info","/runtime/logs","/runtime/re-register","/runtime/admin","/runtime/kill-process","/runtime/dashboard","/login","/setup"];function Ke(t){return t==="/"?!0:Le.some(e=>t===e||t.startsWith(`${e}/`))}p.use((t,e,n)=>{Ke(t.path)&&Re(),n()});const te="panel_sid";function De(t){const e={};if(!t)return e;for(const n of t.split(";")){const a=n.indexOf("=");if(a===-1)continue;const o=n.slice(0,a).trim(),r=n.slice(a+1).trim();o&&(e[o]=r)}return e}function L(t){return De(t.headers.cookie)[te]}function ne(t,e,n){const a=t.secure||t.headers["x-forwarded-proto"]==="https";return`${te}=${e}; HttpOnly; SameSite=Lax; Path=/${a?"; Secure":""}; Max-Age=${n}`}function v(t,e){const n=L(t);return n&&H(n)?!0:t.xhr||t.headers.accept?.includes("application/json")?(e.status(401).json({ok:!1,error:"unauthorized",needLogin:!0}),!1):(e.redirect("/login"),!1)}p.post("/runtime/login",(t,e)=>{const n=t.socket.remoteAddress||"unknown",a=ve(n);if(!a.allowed){e.status(429).set("Retry-After",String(a.retryAfterSec)).json({ok:!1,error:"too many failed login attempts, try again later",retryAfterSec:a.retryAfterSec});return}const{username:o,password:r}=t.body||{};if(!o||!r){e.status(400).json({ok:!1,error:"username and password required"});return}if(!G(String(o),String(r))){ye(n),e.status(401).json({ok:!1,error:"invalid credentials"});return}xe(n);const s=pe(),d=!R();e.setHeader("Set-Cookie",ne(t,s,86400)),e.json({ok:!0,needSetup:d})}),p.post("/runtime/logout",(t,e)=>{const n=L(t);n&&q(n),e.setHeader("Set-Cookie",ne(t,"",0)),e.json({ok:!0})}),p.get("/runtime/credentials-status",(t,e)=>{if(!v(t,e))return;const n=D();e.json({ok:!0,isDefault:fe(),configured:R(),username:n.username})}),p.post("/runtime/change-credentials",async(t,e)=>{if(!v(t,e))return;const{username:n,password:a,passwordConfirm:o,oldPassword:r}=t.body||{};if(a&&String(a).trim()){if(String(a)!==String(o)){e.status(400).json({ok:!1,error:"passwords do not match"});return}if(R()){if(!r){e.status(400).json({ok:!1,error:"old password required"});return}const d=D();if(!G(d.username,String(r))){e.status(403).json({ok:!1,error:"old password is incorrect"});return}}}if(!n||!String(n).trim()){e.status(400).json({ok:!1,error:"username required"});return}const s=a&&String(a).trim()?String(a).trim():D().password;try{await me(String(n).trim(),s),e.json({ok:!0})}catch(d){const l=d;x.error("Failed to change panel credentials:",l.message),e.status(500).json({ok:!1,error:l.message})}});function ae(t){const e=typeof t=="string"?t.trim():"";if(e)return e.length<8?"\u2022\u2022\u2022\u2022":"\u2022\u2022\u2022\u2022"+e.slice(-4)}function _(t){const e=Array.isArray(t.autoRegisterTargets)?t.autoRegisterTargets.filter(a=>!!(a&&typeof a=="object"&&!Array.isArray(a))):[];return e.length>0?e:["serverUrl","schedulerBaseUrl","userKey"].some(a=>!!String(t[a]??"").trim())?[t]:[]}const He=["enabled","serverUrl","schedulerBaseUrl","tenantId","userKey","connectionKey","password","instanceName","instanceId","projectId","roleName","workspacePath","registerAddr","registerIp","virtualIp","tunnel","preferSameLanIp","maxRetries","retryInterval"];function Oe(t){const e={};for(const n of He)t[n]!==void 0&&(e[n]=t[n]);return e}function je(t,e){const n=String(t.connectionKey??"").trim()||String(e??"").trim();return{serverUrl:String(t.serverUrl??t.schedulerBaseUrl??"").trim(),tenantId:String(t.tenantId??"").trim(),instanceName:String(t.instanceName??"").trim(),instanceId:String(t.instanceId??"").trim()||void 0,registerAddr:String(t.registerAddr??"").trim(),tunnel:typeof t.tunnel=="boolean"?t.tunnel:void 0,userKeyMasked:ae(t.userKey),userKeySet:!!String(t.userKey??"").trim(),connectionKeyMasked:ae(n),connectionKeySet:!!n,targetKey:T(String(t.serverUrl??t.schedulerBaseUrl??"").trim(),t.userKey)}}function ze(t){return ke(t)??String(t||"").trim()}p.get("/runtime/server-config",(t,e)=>{if(!v(t,e))return;const n=A();let a={};if(y.existsSync(n))try{a=JSON.parse(y.readFileSync(n,"utf-8"))}catch{e.status(500).json({ok:!1,error:"config.json is not valid JSON; fix it manually first"});return}const o=String(a.connectionKey??"").trim()||void 0,r=_(a).map(s=>je(s,o));e.json({ok:!0,targets:r})}),p.get("/runtime/server-config/connection-key",(t,e)=>{if(!v(t,e))return;const n=String((t.query||{}).targetKey??"").trim();if(!n){e.status(400).json({ok:!1,error:"targetKey is required"});return}const a=A();if(!y.existsSync(a)){e.status(404).json({ok:!1,error:"config.json not found"});return}let o;try{o=JSON.parse(y.readFileSync(a,"utf-8"))}catch{e.status(500).json({ok:!1,error:"config.json is not valid JSON"});return}const r=String(o.connectionKey??"").trim()||void 0,s=_(o).find(l=>T(String(l.serverUrl??l.schedulerBaseUrl??"").trim(),l.userKey)===n),d=String(s?.connectionKey??"").trim()||r||"";if(!d){e.status(404).json({ok:!1,error:"\u8BE5\u76EE\u6807\u5C1A\u672A\u914D\u7F6E\u8FDE\u63A5\u5BC6\u94A5\uFF1B\u542F\u52A8\u4E00\u6B21 Bridge \u4F1A\u81EA\u52A8\u751F\u6210\u5E76\u5199\u5165 config.json"});return}e.setHeader("Cache-Control","no-store"),e.json({ok:!0,connectionKey:d})});function K(t,e){const n=new Error(e);return n.status=t,n}p.post("/runtime/server-config",async(t,e)=>{if(!v(t,e))return;const n=(t.body||{}).targets;if(!Array.isArray(n)){e.status(400).json({ok:!1,error:"targets array is required"});return}const a=[];for(let o=0;o<n.length;o++){const r=n[o];if(!r||typeof r!="object"||Array.isArray(r)){e.status(400).json({ok:!1,error:`targets[${o}] must be an object`});return}const s=r,d=String(s.serverUrl??s.schedulerBaseUrl??"").trim();if(!d){e.status(400).json({ok:!1,error:`targets[${o}].serverUrl is required`});return}try{const w=new URL(d);if(!["http:","https:"].includes(w.protocol))throw new Error("protocol must be http or https")}catch{e.status(400).json({ok:!1,error:`targets[${o}].serverUrl must be a valid http(s) URL`});return}const l=s.tunnel;let m;if(l==="auto"||l===""||l===null||l===void 0)m=void 0;else if(l===!0||l==="true")m=!0;else if(l===!1||l==="false")m=!1;else{e.status(400).json({ok:!1,error:`targets[${o}].tunnel must be auto, true or false`});return}const h=String(s.originalServerUrl??"").trim();a.push({serverUrl:d,originalServerUrl:h&&h!==d?h:"",originalTargetKey:String(s.originalTargetKey??"").trim(),userKey:String(s.userKey??"").trim(),tenantId:String(s.tenantId??"").trim(),instanceName:String(s.instanceName??"").trim(),connectionKey:String(s.connectionKey??"").trim(),registerAddr:String(s.registerAddr??"").trim(),tunnel:m})}try{const o=A();await X(o,()=>{let r={};if(y.existsSync(o))try{r=JSON.parse(y.readFileSync(o,"utf-8"))}catch{throw K(500,"config.json is not valid JSON; fix it manually first")}const s=String(r.connectionKey??"").trim(),d=_(r),l=d.length>0&&d[0]===r,m=new Map;for(const i of d){const u=T(String(i.serverUrl??i.schedulerBaseUrl??"").trim(),i.userKey);m.set(u,l?Oe(i):i)}const h=[];for(const i of a){let u;const b=g=>{const c=m.get(g);return c&&m.delete(g),c},S=(g,c)=>T(g,c),E=g=>{const c=`${ze(g)}#`;return[...m.keys()].filter(I=>I.startsWith(c))};if(i.originalTargetKey&&(u=b(i.originalTargetKey)),!u&&i.originalServerUrl&&(u=b(S(i.originalServerUrl,i.userKey)),!u)){const g=E(i.originalServerUrl);g.length===1&&(u=b(g[0]))}if(u||(u=b(S(i.serverUrl,i.userKey))),!u){const g=E(i.serverUrl);g.length>=1&&(u=b(g[0]))}const f=u?{...u}:{};if(f.serverUrl=i.serverUrl,f.tenantId=i.tenantId,f.instanceName=i.instanceName,f.registerAddr=i.registerAddr,i.tunnel===void 0?delete f.tunnel:f.tunnel=i.tunnel,i.userKey)f.userKey=i.userKey;else if(!String(f.userKey??"").trim())throw K(400,`userKey is required for ${i.serverUrl} (new target without inheritable userKey)`);i.connectionKey?f.connectionKey=i.connectionKey:!String(f.connectionKey??"").trim()&&s&&(f.connectionKey=s),h.push(f)}const w=new Map;for(let i=0;i<h.length;i++){const u=h[i],b=T(String(u.serverUrl??u.schedulerBaseUrl??"").trim(),u.userKey),S=w.get(b);if(S!==void 0)throw K(400,`duplicate target: ${String(u.serverUrl??"")} appears in both targets[${S}] and targets[${i}] with the same API key; the same scheduler address can be added multiple times only with different API keys`);w.set(b,i)}r.autoRegisterTargets=h;for(const i of["enabled","serverUrl","schedulerBaseUrl","tenantId","userKey","connectionKey","password","instanceName","instanceId","registerAddr","registerIp","virtualIp","tunnel"])delete r[i];y.mkdirSync($.dirname(o),{recursive:!0}),y.writeFileSync(o,JSON.stringify(r,null,2),"utf-8")}),x.info("Server connection config updated via panel",{configPath:o,targetCount:a.length}),e.json({ok:!0})}catch(o){const r=o,s=Number(r.status)||500;s>=500&&x.error("Failed to save server connection config:",r.message),e.status(s).json({ok:!1,error:r.message})}}),p.get("/runtime/access-control",(t,e)=>{v(t,e)&&e.json({ok:!0,allowIps:le(),defaultAllowIps:["0.0.0.0"]})}),p.post("/runtime/access-control",async(t,e)=>{if(!v(t,e))return;const n=(t.body||{}).allowIps;if(typeof n!="string"&&!Array.isArray(n)){e.status(400).json({ok:!1,error:"allowIps must be a string or an array"});return}const a=ue(n),o=a.filter(r=>!ce(r));if(o.length>0){e.status(400).json({ok:!1,error:`invalid IP/CIDR entries: ${o.join(", ")}`});return}try{const r=A();await X(r,()=>{let s={};if(y.existsSync(r))try{s=JSON.parse(y.readFileSync(r,"utf-8"))}catch{throw K(500,"config.json is not valid JSON; fix it manually first")}const d=s.accessControl&&typeof s.accessControl=="object"&&!Array.isArray(s.accessControl)?{...s.accessControl}:{};d.allowIps=a,s.accessControl=d,y.mkdirSync($.dirname(r),{recursive:!0}),y.writeFileSync(r,JSON.stringify(s,null,2),"utf-8"),ge()}),x.info("Access control config updated via panel",{configPath:r,entryCount:a.length}),e.json({ok:!0,allowIps:a})}catch(r){const s=r,d=Number(s.status)||500;d>=500&&x.error("Failed to save access control config:",s.message),e.status(d).json({ok:!1,error:s.message})}}),p.get("/runtime/node-info",(t,e)=>{if(!v(t,e))return;const n=Y(),a=J();e.json({ok:!0,hostname:B.hostname(),platform:B.platform(),arch:B.arch(),uptime:Math.floor(process.uptime()),nodeVersion:process.version,bridgeVersion:ee,configPath:A(),homeDir:de(),bindingStatus:n.status,paired:n.paired,instanceId:n.instanceId||a.instanceId,schedulerBaseUrl:n.schedulerBaseUrl,registered:a.registered,pairingCode:n.pairingCode,activeSessions:be()})}),p.get("/runtime/logs",(t,e)=>{if(!v(t,e))return;const n=t.query.level||void 0,a=Math.min(Number(t.query.count)||200,500),r=n&&["debug","info","warn","error"].includes(n)?n:void 0,s=Ce(a,r);e.json({ok:!0,logs:s})}),p.post("/runtime/re-register",async(t,e)=>{if(v(t,e))try{const n=await W();e.json({ok:n})}catch(n){const a=n;e.status(500).json({ok:!1,error:a.message})}});let V=!1;function Me(t){const e=t.ip||t.socket.remoteAddress||"";return e==="127.0.0.1"||e==="::1"||e==="::ffff:127.0.0.1"}p.post("/runtime/pair-applied",(t,e)=>{if(!Me(t)){e.status(403).json({ok:!1,error:"loopback request required"});return}if(V){e.json({ok:!0,started:!1});return}V=!0,W().then(n=>{x.info(n?"[runtime-bridge] \u914D\u5BF9\u540E\u7ACB\u5373\u91CD\u6CE8\u518C\u6210\u529F":"[runtime-bridge] \u914D\u5BF9\u540E\u7ACB\u5373\u91CD\u6CE8\u518C\u672A\u6210\u529F\uFF08\u8BF7\u67E5\u770B AutoRegister \u65E5\u5FD7\uFF09")}).catch(n=>{x.warn("[runtime-bridge] \u914D\u5BF9\u540E\u7ACB\u5373\u91CD\u6CE8\u518C\u51FA\u9519:",n.message)}).finally(()=>{V=!1}),e.json({ok:!0,started:!0})}),p.get("/runtime/admin/sessions",(t,e)=>{if(!v(t,e))return;const n=he().map(a=>({token:a.token.slice(0,8)+"...",createdAt:new Date(a.createdAt).toISOString(),lastUsedAt:new Date(a.lastUsedAt).toISOString(),age:Math.floor((Date.now()-a.createdAt)/1e3)}));e.json({ok:!0,sessions:n})}),p.post("/runtime/admin/sessions/:token/destroy",(t,e)=>{v(t,e)&&(q(t.params.token),e.json({ok:!0}))});function Fe(t){return new Promise((e,n)=>{const a=B.platform()==="win32",o=a?"taskkill":"kill",r=a?["/PID",String(t),"/F"]:["-9",String(t)];re(o,r,{timeout:5e3},s=>s?n(s):e())})}p.post("/runtime/kill-process",async(t,e)=>{if(!v(t,e))return;const n=Number(t.body.pid);if(!n||!Number.isInteger(n)||n<=0){e.status(400).json({ok:!1,error:"Invalid PID"});return}const a=P(),o=()=>{const s=new Set,d=U?.data??[];for(const l of d)typeof l.pid=="number"&&s.add(l.pid);for(const l of a.getAllManagedProcesses())typeof l.pid=="number"&&s.add(l.pid);return s};let r=o();if(r.size===0)try{U={data:await a.discoverAllProcesses(),ts:Date.now()},r=o()}catch{}if(!r.has(n)){x.warn("Rejected kill-process for unrecognized PID",{pid:n}),e.status(404).json({ok:!1,error:"PID is not a bridge-discovered or registered agent process"});return}try{await Fe(n),x.info("Killed process",{pid:n}),e.json({ok:!0})}catch(s){const d=s;x.warn("Failed to kill process",{pid:n,error:d.message}),e.status(500).json({ok:!1,error:d.message})}}),p.get("/runtime/dashboard",async(t,e)=>{if(v(t,e)){if(N&&Date.now()-N.ts<Ae)return void e.json(N.data);try{const n=M?.data??null,a=U?.data??null;M||F();const[o,r,s]=await Promise.all([Promise.resolve(Y()),Promise.resolve(J()),Ie().catch(()=>[])]),l=P().getAllManagedProcesses(),m=Array.from(Ee.entries()).map(([f,g])=>({sessionId:f,agentId:g.agentId,workspacePath:g.workspacePath,runtimeStatus:g.currentRuntimeStatus||"running",runtimeActionType:g.currentRuntimeActionType,runtimeActionLabel:g.currentRuntimeActionLabel,providerId:g.providerId}));let h={managed:0,orphan:0,unknown:0},w=[];if(a){h={managed:a.filter(c=>c.managementStatus==="managed").length,orphan:a.filter(c=>c.managementStatus==="orphan").length,unknown:a.filter(c=>c.managementStatus==="unknown").length};const f=new Map(l.map(c=>[c.pid,c]));w=a.map(c=>{const I=f.get(c.pid);return{agentId:c.agentId||I?.agentId,pid:c.pid,managementStatus:c.managementStatus,sessionId:I?.sessionId,state:I?.state,command:c.command,cwd:c.cwd,startedAt:c.startedAt}});const g={managed:0,orphan:1,unknown:2};w.sort((c,I)=>(g[c.managementStatus]??9)-(g[I.managementStatus]??9))}const i=new Set(m.map(f=>f.sessionId)),u=s.filter(f=>!i.has(f.sessionId)),b=o,S=await Ue(),E={ok:!0,collectedAt:new Date().toISOString(),bridge:{version:ee,hostname:B.hostname(),platform:B.platform(),arch:B.arch(),uptime:Math.floor(process.uptime()),nodeVersion:process.version},binding:{status:b.status,paired:b.paired,instanceId:b.instanceId,userId:b.userId,schedulerBaseUrl:b.schedulerBaseUrl,pairingCode:we()},registration:{registered:r.registered,instanceId:r.instanceId,lastAttempt:r.lastAttempt?.toISOString(),error:r.error},metrics:n,sessions:{active:m,activeCount:m.length,persisted:u,persistedCount:u.length,total:m.length+u.length},processes:{...h,total:h.managed+h.orphan+h.unknown,list:w,registryCount:l.length},lifecycleOperation:S};N={data:E,ts:Date.now()},e.json(E)}catch(n){const a=n;x.error("Dashboard aggregation failed:",a.message),e.status(500).json({ok:!1,error:a.message})}}}),p.get("/login",(t,e)=>{e.type("text/html; charset=utf-8"),e.send(Ve)}),p.get("/",(t,e)=>{const n=L(t);if(!n||!H(n)){e.redirect("/login");return}if(!R()){e.redirect("/setup");return}const a=t.query.lang==="en"?"en":"zh";e.type("text/html; charset=utf-8"),e.send(_e.replace("{{LANG}}",a))}),p.get("/setup",(t,e)=>{const n=L(t);if(!n||!H(n)){e.redirect("/login");return}e.type("text/html; charset=utf-8"),e.send($e)});const _e=`<!DOCTYPE html>
2
2
  <html lang="{{LANG}}">
3
3
  <head>
4
4
  <meta charset="UTF-8">
@@ -684,7 +684,7 @@ ${z}
684
684
  <!-- \u2550\u2550 \u9876\u680F\uFF1A\u54C1\u724C + \u8FD0\u884C\u5143\u4FE1\u606F + \u5168\u5C40\u64CD\u4F5C \u2550\u2550 -->
685
685
  <header class="topbar">
686
686
  <div class="brand">
687
- <img class="brand-mark" src="${Y}" alt="">
687
+ <img class="brand-mark" src="${Q}" alt="">
688
688
  <span>AgentsWorkStudio</span>
689
689
  </div>
690
690
  <div class="topbar-meta">
@@ -3425,7 +3425,7 @@ if (schedPrefill) {
3425
3425
  }
3426
3426
  </script>
3427
3427
  </body>
3428
- </html>`,Fe=`<!DOCTYPE html>
3428
+ </html>`,Ve=`<!DOCTYPE html>
3429
3429
  <html lang="zh-CN">
3430
3430
  <head>
3431
3431
  <meta charset="UTF-8">
@@ -3551,7 +3551,7 @@ ${z}
3551
3551
  <button type="button" class="theme-fab" id="themeFab" onclick="toggleThemeFab()" title="\u5207\u6362\u4E3B\u9898">&#x263D;</button>
3552
3552
  <div class="login-card">
3553
3553
  <div class="login-brand">
3554
- <img class="brand-mark" src="${Y}" alt="AgentsWorkStudio Bridge">
3554
+ <img class="brand-mark" src="${Q}" alt="AgentsWorkStudio Bridge">
3555
3555
  <span class="login-brand-name">AgentsWorkStudio</span>
3556
3556
  </div>
3557
3557
  <h1>Bridge \u63A7\u5236\u53F0</h1>
@@ -3627,9 +3627,9 @@ document.getElementById("loginForm").addEventListener("keydown", function(e) {
3627
3627
  if (e.key === "Enter") doLogin(e);
3628
3628
  });
3629
3629
  </script>
3630
- ${X}
3630
+ ${Z}
3631
3631
  </body>
3632
- </html>`,_e=`<!DOCTYPE html>
3632
+ </html>`,$e=`<!DOCTYPE html>
3633
3633
  <html lang="zh-CN">
3634
3634
  <head>
3635
3635
  <meta charset="UTF-8">
@@ -3910,7 +3910,7 @@ async function doSkip() {
3910
3910
 
3911
3911
  document.getElementById("setupForm").addEventListener("submit", doSave);
3912
3912
  </script>
3913
- ${X}
3913
+ ${Z}
3914
3914
  </body>
3915
- </html>`;export{f as dashboardRouter,Pe as noteDashboardActivity};
3915
+ </html>`;export{p as dashboardRouter,Re as noteDashboardActivity};
3916
3916
 
@@ -78,5 +78,20 @@ export declare function resolvePairTarget(config: Record<string, unknown>, optio
78
78
 
79
79
 
80
80
 
81
+
82
+ export declare function readRunningBridgePort(): number | null;
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+ export declare function notifyRunningBridgeAfterPair(): Promise<boolean>;
91
+
92
+
93
+
94
+
95
+
81
96
  export declare function pairBridge(options: PairBridgeOptions): Promise<PairBridgeResult>;
82
97
  export {};
@@ -1,2 +1,2 @@
1
- import{randomBytes as N}from"node:crypto";import{existsSync as B,mkdirSync as x,readFileSync as E,writeFileSync as K}from"node:fs";import R from"node:os";import A from"node:path";import P from"axios";import{getActiveBridgeHttpPort as k,getAutoRegisterConfigFilePath as b,schedulerBaseUrl as C}from"../config.js";import{runExclusiveConfigWrite as F}from"../utils/config-write-queue.js";import{logger as S}from"../utils/logger.js";import{normalizeTargetServerUrl as I}from"../utils/target-identity.js";const j="awsp_";function w(t){if(!B(t))return{};try{return JSON.parse(E(t,"utf-8"))}catch(s){throw new Error(`\u65E0\u6CD5\u89E3\u6790\u914D\u7F6E\u6587\u4EF6 ${t}: ${s.message}`)}}function $(t){return Array.isArray(t.autoRegisterTargets)?t.autoRegisterTargets.filter(s=>!!(s&&typeof s=="object"&&!Array.isArray(s))):[]}function q(){return`bridge-${N(6).toString("hex")}`}function O(t,s){return/^https?:\/\//i.test(t)?t:/:[0-9]+$/.test(t)?`http://${t}`:`http://${t}:${s}`}function _(t,s){const o=$(t),h=s.serverUrl?.trim(),e=h?I(h):"",m=String(s.instanceId||"").trim(),v=String(s.targetIdentity||"").trim();let n=-1,c=t,g=!1;if(o.length>0){const d=o.map((a,T)=>({item:a,itemIndex:T})).filter(({item:a})=>!e||I(a.serverUrl||a.schedulerBaseUrl)===e);let u=d;if(m){const a=d.filter(({item:T})=>String(T.instanceId||"").trim()===m);if(a.length>1)throw new Error(`\u5339\u914D\u5230\u591A\u4E2A instanceId=${m} \u7684\u914D\u5BF9\u76EE\u6807\uFF0C\u8BF7\u68C0\u67E5 config.json`);a.length===1?u=a:(u=[],g=!0)}else if(v){if(u=d.filter(({item:a})=>String(a.credentialId||a.userKey||"").trim()===v),u.length>1)throw new Error("\u5339\u914D\u5230\u591A\u4E2A\u914D\u5BF9\u76EE\u6807\uFF0C\u8BF7\u7528 --instance-id \u6216 --target-identity \u7CBE\u786E\u6307\u5B9A");if(u.length===0)throw new Error("\u6307\u5B9A targetIdentity \u7684\u914D\u5BF9\u76EE\u6807\u4E0D\u5B58\u5728")}else if(d.length>1)throw new Error("\u5B58\u5728\u591A\u4E2A\u6CE8\u518C\u76EE\u6807\uFF0C\u8BF7\u7528 --server-url \u642D\u914D --instance-id / --target-identity \u6307\u5B9A\u672C\u6B21\u914D\u5BF9\u76EE\u6807");if(g)n=o.length;else if(n=u[0]?.itemIndex??-1,n<0){if(!e)throw new Error("\u65E0\u6CD5\u786E\u5B9A\u914D\u5BF9\u76EE\u6807\uFF0C\u8BF7\u7528 --server-url \u6307\u5B9A");c={serverUrl:h},n=o.length,g=!0}else c=o[n]||{}}const y=I(h||c.serverUrl||c.schedulerBaseUrl||C);if(!y)throw new Error("\u65E0\u6CD5\u786E\u5B9A\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\uFF0C\u8BF7\u7528 --server-url \u6307\u5B9A");const i=s.registerAddr||String(c.registerAddr||c.registerIp||c.virtualIp||"").trim(),l=c.tunnel===!0?!0:c.tunnel===!1?!1:!i;let r=m||String(c.instanceId||"").trim()||void 0,f;if(l){r||(r=q());const d=new URL(y);f=`${d.protocol}//${d.host}/tunnel/${r}`}else f=O(i,k());const p=String(c.connectionKey||"").trim(),U=s.instanceName?.trim()||String(c.instanceName||"").trim()||R.hostname();return{index:n,target:c,serverUrl:y,tunnel:l,instanceId:r,connectionKey:p,instanceName:U,runtimeBridgeBaseUrl:f,isNewTarget:g}}async function M(t,s){return(await P.post(t,s,{headers:{"Content-Type":"application/json"},timeout:15e3})).data}async function V(t){const s=String(t.ticket||"").trim();if(!s.startsWith(j))return{success:!1,error:"\u914D\u5BF9\u7968\u636E\u683C\u5F0F\u4E0D\u6B63\u786E\uFF08\u5E94\u4EE5 awsp_ \u5F00\u5934\uFF09\uFF0C\u8BF7\u4ECE\u7BA1\u7406\u9875\u91CD\u65B0\u590D\u5236"};const o=t.configPath||b(),h=w(o);let e;try{e=_(h,t)}catch(i){return{success:!1,error:i.message}}const m={pairingTicket:s,instanceName:e.instanceName,runtimeBridgeBaseUrl:e.runtimeBridgeBaseUrl};e.instanceId&&(m.instanceId=e.instanceId);const v=t.postPair||M;let n;try{n=await v(`${e.serverUrl}/api/instances/pair`,m)}catch(i){const l=i;return{success:!1,error:l.response?.data?.message||l.message||"\u914D\u5BF9\u8BF7\u6C42\u5931\u8D25"}}if(!n?.success||!n.machineToken||!n.instanceId)return{success:!1,error:n?.message||"\u8C03\u5EA6\u4E2D\u5FC3\u672A\u8FD4\u56DE\u673A\u5668\u51ED\u636E"};const c=String(n.connectionKey||"").trim();if(!c)return{success:!1,error:"\u8C03\u5EA6\u4E2D\u5FC3\u672A\u8FD4\u56DE\u8FDE\u63A5\u5BC6\u94A5\uFF08server \u7248\u672C\u8FC7\u65E7\uFF1F\uFF09\uFF0C\u8BF7\u5347\u7EA7 server \u540E\u91CD\u8BD5"};const g=n.instanceId,y=n.instanceName||e.instanceName;try{await F(o,()=>{const i=w(o),l=$(i);let r;if(Array.isArray(i.autoRegisterTargets)&&l.length>0){const f=l.filter(a=>I(a.serverUrl||a.schedulerBaseUrl)===I(e.serverUrl)),p=String(e.target.userKey||"").trim(),U=e.instanceId?f.filter(a=>String(a.instanceId||"").trim()===e.instanceId):[],d=p?f.filter(a=>String(a.userKey||"").trim()===p):[];if(U.length>1||d.length>1)throw new Error(`\u914D\u5BF9\u5199\u56DE\u5931\u8D25\uFF1A\u5339\u914D\u5230\u591A\u4E2A\u76EE\u6807\uFF08server=${e.serverUrl}\uFF09\uFF0C\u8BF7\u7528 instanceId / target identity \u7CBE\u786E\u6307\u5B9A`);const u=U[0]||d[0]||(f.length===1&&!e.isNewTarget?f[0]:void 0);u?r=u:!e.isNewTarget&&e.index>=0&&l[e.index]?r=l[e.index]:(r={serverUrl:e.serverUrl},l.push(r),i.autoRegisterTargets=l)}else r=i;r.serverUrl=r.serverUrl||e.serverUrl,r.instanceName=r.instanceName||y,r.instanceId=g,r.credentialId=g,delete r.credentialRef,r.credentialType=n.credentialType||"MACHINE_TOKEN",r.machineToken=n.machineToken,r.connectionKey=c,n.tenantId&&(r.tenantId=n.tenantId),n.userId&&(r.userId=n.userId),Array.isArray(i.autoRegisterTargets)&&i.autoRegisterTargets.length>0&&String(i.connectionKey||"").trim()&&delete i.connectionKey,x(A.dirname(o),{recursive:!0}),K(o,JSON.stringify(i,null,2),"utf-8")})}catch(i){return{success:!1,error:i.message}}return e.instanceId&&e.instanceId!==g&&S.info(`[Pair] server \u5DF2\u6309\u7968\u636E\u786E\u5B9A\u5B9E\u4F8B id\uFF1A${g}\uFF08\u672C\u5730\u6B64\u524D\u4E3A ${e.instanceId}\uFF09\uFF0Cconfig.json \u5DF2\u5199\u56DE\u65B0 id`),S.info(`[Pair] \u914D\u5BF9\u6210\u529F: server=${e.serverUrl}, instanceId=${g}, machineToken \u5DF2\u5199\u5165 ${o}`),{success:!0,instanceId:g,serverUrl:e.serverUrl}}export{V as pairBridge,_ as resolvePairTarget};
1
+ import{randomBytes as E}from"node:crypto";import{existsSync as N,mkdirSync as P,readFileSync as S,writeFileSync as x}from"node:fs";import A from"node:os";import _ from"node:path";import w from"axios";import{getActiveBridgeHttpPort as K,getAutoRegisterConfigFilePath as k,getBridgeRuntimePropertiesFilePath as b,schedulerBaseUrl as F}from"../config.js";import{runExclusiveConfigWrite as O}from"../utils/config-write-queue.js";import{logger as R}from"../utils/logger.js";import{normalizeTargetServerUrl as h}from"../utils/target-identity.js";const C="awsp_";function B(r){if(!N(r))return{};try{return JSON.parse(S(r,"utf-8"))}catch(n){throw new Error(`\u65E0\u6CD5\u89E3\u6790\u914D\u7F6E\u6587\u4EF6 ${r}: ${n.message}`)}}function $(r){return Array.isArray(r.autoRegisterTargets)?r.autoRegisterTargets.filter(n=>!!(n&&typeof n=="object"&&!Array.isArray(n))):[]}function M(){return`bridge-${E(6).toString("hex")}`}function j(r,n){return/^https?:\/\//i.test(r)?r:/:[0-9]+$/.test(r)?`http://${r}`:`http://${r}:${n}`}function q(r,n){const s=$(r),l=n.serverUrl?.trim(),e=l?h(l):"",f=String(n.instanceId||"").trim(),y=String(n.targetIdentity||"").trim();let i=-1,c=r,g=!1;if(s.length>0){const d=s.map((o,U)=>({item:o,itemIndex:U})).filter(({item:o})=>!e||h(o.serverUrl||o.schedulerBaseUrl)===e);let m=d;if(f){const o=d.filter(({item:U})=>String(U.instanceId||"").trim()===f);if(o.length>1)throw new Error(`\u5339\u914D\u5230\u591A\u4E2A instanceId=${f} \u7684\u914D\u5BF9\u76EE\u6807\uFF0C\u8BF7\u68C0\u67E5 config.json`);o.length===1?m=o:(m=[],g=!0)}else if(y){if(m=d.filter(({item:o})=>String(o.credentialId||o.userKey||"").trim()===y),m.length>1)throw new Error("\u5339\u914D\u5230\u591A\u4E2A\u914D\u5BF9\u76EE\u6807\uFF0C\u8BF7\u7528 --instance-id \u6216 --target-identity \u7CBE\u786E\u6307\u5B9A");if(m.length===0)throw new Error("\u6307\u5B9A targetIdentity \u7684\u914D\u5BF9\u76EE\u6807\u4E0D\u5B58\u5728")}else if(d.length>1)throw new Error("\u5B58\u5728\u591A\u4E2A\u6CE8\u518C\u76EE\u6807\uFF0C\u8BF7\u7528 --server-url \u642D\u914D --instance-id / --target-identity \u6307\u5B9A\u672C\u6B21\u914D\u5BF9\u76EE\u6807");if(g)i=s.length;else if(i=m[0]?.itemIndex??-1,i<0){if(!e)throw new Error("\u65E0\u6CD5\u786E\u5B9A\u914D\u5BF9\u76EE\u6807\uFF0C\u8BF7\u7528 --server-url \u6307\u5B9A");c={serverUrl:l},i=s.length,g=!0}else c=s[i]||{}}const p=h(l||c.serverUrl||c.schedulerBaseUrl||F);if(!p)throw new Error("\u65E0\u6CD5\u786E\u5B9A\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\uFF0C\u8BF7\u7528 --server-url \u6307\u5B9A");const a=n.registerAddr||String(c.registerAddr||c.registerIp||c.virtualIp||"").trim(),u=c.tunnel===!0?!0:c.tunnel===!1?!1:!a;let t=f||String(c.instanceId||"").trim()||void 0,I;if(u){t||(t=M());const d=new URL(p);I=`${d.protocol}//${d.host}/tunnel/${t}`}else I=j(a,K());const v=String(c.connectionKey||"").trim(),T=n.instanceName?.trim()||String(c.instanceName||"").trim()||A.hostname();return{index:i,target:c,serverUrl:p,tunnel:u,instanceId:t,connectionKey:v,instanceName:T,runtimeBridgeBaseUrl:I,isNewTarget:g}}async function G(r,n){return(await w.post(r,n,{headers:{"Content-Type":"application/json"},timeout:15e3})).data}const Y=2500,D=1e3;function z(){try{const r=b();if(!N(r))return null;const s=S(r,"utf-8").split(/\r?\n/).find(e=>/^port\s*[=:]/.test(e.trim()));if(!s)return null;const l=Number(s.split(/[=:]/)[1]?.trim());return Number.isInteger(l)&&l>=1&&l<=65535?l:null}catch{return null}}async function re(){const r=z();if(!r)return!1;const n=`http://127.0.0.1:${r}/runtime/pair-applied`;for(let s=1;s<=2;s+=1)try{return(await w.post(n,{},{timeout:Y})).data?.ok===!0}catch(l){if(l.response?.status===404)return!1;s<2&&await new Promise(f=>setTimeout(f,D))}return!1}async function te(r){const n=String(r.ticket||"").trim();if(!n.startsWith(C))return{success:!1,error:"\u914D\u5BF9\u7968\u636E\u683C\u5F0F\u4E0D\u6B63\u786E\uFF08\u5E94\u4EE5 awsp_ \u5F00\u5934\uFF09\uFF0C\u8BF7\u4ECE\u7BA1\u7406\u9875\u91CD\u65B0\u590D\u5236"};const s=r.configPath||k(),l=B(s);let e;try{e=q(l,r)}catch(a){return{success:!1,error:a.message}}const f={pairingTicket:n,instanceName:e.instanceName,runtimeBridgeBaseUrl:e.runtimeBridgeBaseUrl};e.instanceId&&(f.instanceId=e.instanceId);const y=r.postPair||G;let i;try{i=await y(`${e.serverUrl}/api/instances/pair`,f)}catch(a){const u=a;return{success:!1,error:u.response?.data?.message||u.message||"\u914D\u5BF9\u8BF7\u6C42\u5931\u8D25"}}if(!i?.success||!i.machineToken||!i.instanceId)return{success:!1,error:i?.message||"\u8C03\u5EA6\u4E2D\u5FC3\u672A\u8FD4\u56DE\u673A\u5668\u51ED\u636E"};const c=String(i.connectionKey||"").trim();if(!c)return{success:!1,error:"\u8C03\u5EA6\u4E2D\u5FC3\u672A\u8FD4\u56DE\u8FDE\u63A5\u5BC6\u94A5\uFF08server \u7248\u672C\u8FC7\u65E7\uFF1F\uFF09\uFF0C\u8BF7\u5347\u7EA7 server \u540E\u91CD\u8BD5"};const g=i.instanceId,p=i.instanceName||e.instanceName;try{await O(s,()=>{const a=B(s),u=$(a);let t;if(Array.isArray(a.autoRegisterTargets)&&u.length>0){const I=u.filter(o=>h(o.serverUrl||o.schedulerBaseUrl)===h(e.serverUrl)),v=String(e.target.userKey||"").trim(),T=e.instanceId?I.filter(o=>String(o.instanceId||"").trim()===e.instanceId):[],d=v?I.filter(o=>String(o.userKey||"").trim()===v):[];if(T.length>1||d.length>1)throw new Error(`\u914D\u5BF9\u5199\u56DE\u5931\u8D25\uFF1A\u5339\u914D\u5230\u591A\u4E2A\u76EE\u6807\uFF08server=${e.serverUrl}\uFF09\uFF0C\u8BF7\u7528 instanceId / target identity \u7CBE\u786E\u6307\u5B9A`);const m=T[0]||d[0]||(I.length===1&&!e.isNewTarget?I[0]:void 0);m?t=m:!e.isNewTarget&&e.index>=0&&u[e.index]?t=u[e.index]:(t={serverUrl:e.serverUrl},u.push(t),a.autoRegisterTargets=u)}else t=a;t.serverUrl=t.serverUrl||e.serverUrl,t.instanceName=t.instanceName||p,t.instanceId=g,t.credentialId=g,delete t.credentialRef,t.credentialType=i.credentialType||"MACHINE_TOKEN",t.machineToken=i.machineToken,t.connectionKey=c,i.tenantId&&(t.tenantId=i.tenantId),i.userId&&(t.userId=i.userId),Array.isArray(a.autoRegisterTargets)&&a.autoRegisterTargets.length>0&&String(a.connectionKey||"").trim()&&delete a.connectionKey,P(_.dirname(s),{recursive:!0}),x(s,JSON.stringify(a,null,2),"utf-8")})}catch(a){return{success:!1,error:a.message}}return e.instanceId&&e.instanceId!==g&&R.info(`[Pair] server \u5DF2\u6309\u7968\u636E\u786E\u5B9A\u5B9E\u4F8B id\uFF1A${g}\uFF08\u672C\u5730\u6B64\u524D\u4E3A ${e.instanceId}\uFF09\uFF0Cconfig.json \u5DF2\u5199\u56DE\u65B0 id`),R.info(`[Pair] \u914D\u5BF9\u6210\u529F: server=${e.serverUrl}, instanceId=${g}, machineToken \u5DF2\u5199\u5165 ${s}`),{success:!0,instanceId:g,serverUrl:e.serverUrl}}export{re as notifyRunningBridgeAfterPair,te as pairBridge,z as readRunningBridgePort,q as resolvePairTarget};
2
2
 
@@ -59,6 +59,12 @@ export interface CliCommandOptions {
59
59
 
60
60
 
61
61
 
62
+ notifyRunningBridge?: () => Promise<boolean>;
63
+
64
+
65
+
66
+
67
+
62
68
  assumeYes?: boolean;
63
69
 
64
70
 
@@ -1,7 +1,7 @@
1
- import{spawnSync as w}from"node:child_process";import{existsSync as g,mkdirSync as T,readFileSync as G,rmSync as q,unlinkSync as N,writeFileSync as B}from"node:fs";import W from"node:os";import l from"node:path";import{createInterface as te}from"node:readline/promises";import{fileURLToPath as V}from"node:url";import{getRuntimeHomeDir as ne,isDesktopAppMode as K}from"../config.js";import{pairBridge as ie}from"./bridge-pairing.js";import{configureStartupConfig as se,printConfigExampleCommand as ae}from"./startup-config-wizard.js";import{createWindowsServiceManager as ue,isNodeWindowsAvailable as de}from"./windows-service-manager.js";const b="awsb.service",A=`/etc/systemd/system/${b}`,Y="awsb",m=`${Y}.exe`;function L(){return l.join(ne(),".aws-bridge","log")}const J=l.join(L(),"awsb.out.log"),U="com.agentsworkstudio.awsb",_=l.join(W.homedir(),"Library","LaunchAgents",`${U}.plist`),M=l.join(L(),"awsb.out.log");function oe(){const e=V(import.meta.url);return l.resolve(l.dirname(e),"..","..")}function ce(e=oe()){const r=l.join(e,"package.json");return JSON.parse(G(r,"utf-8")).version||"unknown"}function I(e,r){const t=w(e,r,{shell:process.platform==="win32",stdio:"inherit"});return{status:t.status,error:t.error}}function le(){try{const e=w("npm",["root","-g"],{shell:process.platform==="win32",encoding:"utf-8",stdio:["ignore","pipe","ignore"]});if(e.status===0&&e.stdout){const r=e.stdout.trim();if(r)return r}}catch{}return null}function O(e){try{const r=new SharedArrayBuffer(4);Atomics.wait(new Int32Array(r),0,0,e)}catch{const r=Date.now()+e;for(;Date.now()<r;);}}function F(e){if(process.platform!=="win32")return null;try{const r=w("sc.exe",["query",e],{shell:!0,encoding:"utf-8",stdio:["ignore","pipe","ignore"]});if(r.status!==0||!r.stdout)return null;const t=r.stdout.match(/STATE\s*:\s*\d+\s+(\S+)/);return t?t[1]:null}catch{return null}}function Q(e,r,t=15e3,i=500){const s=Date.now()+t;for(;Date.now()<s;){const n=e(r);if(n===null||n==="STOPPED")return!0;O(i)}return!1}function me(e){process.stdout.write(`${e}
2
- `)}function fe(e){process.stderr.write(`${e}
3
- `)}function ge(e){return e==="-v"||e==="--version"||e==="version"}function he(e){return`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function z(){return process.argv[1]?l.resolve(process.argv[1]):V(import.meta.url)}function we(e){return["[Unit]","Description=AgentsWorkStudio Runtime Bridge","After=network-online.target","Wants=network-online.target","","[Service]","Type=simple","Environment=AWS_BRIDGE_SKIP_SETUP=true",`ExecStart=${[process.execPath,e].map(t=>he(t)).join(" ")}`,"Restart=on-failure","RestartSec=5s","","[Install]","WantedBy=multi-user.target",""].join(`
4
- `)}function y(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function be(e,r={}){const t=r.userHomeDir??W.homedir(),i=r.logPath??M,s=i.replace(/\.out\.log$/,".err.log");return['<?xml version="1.0" encoding="UTF-8"?>','<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">','<plist version="1.0">',"<dict>"," <key>Label</key>",` <string>${y(U)}</string>`," <key>ProgramArguments</key>"," <array>",` <string>${y(process.execPath)}</string>`,` <string>${y(e)}</string>`," </array>"," <key>EnvironmentVariables</key>"," <dict>"," <key>AWS_BRIDGE_SKIP_SETUP</key>"," <string>true</string>"," <key>AWS_RUNTIME_HOME_DIR</key>",` <string>${y(t)}</string>`," </dict>"," <key>RunAtLoad</key>"," <true/>"," <key>KeepAlive</key>"," <true/>"," <key>StandardOutPath</key>",` <string>${y(i)}</string>`," <key>StandardErrorPath</key>",` <string>${y(s)}</string>`,"</dict>","</plist>",""].join(`
5
- `)}function C(e,r){return e("systemctl",r)}function x(e,r){return r.error?`[runtime-bridge] ${e}\u5931\u8D25: ${r.error.message}`:`[runtime-bridge] ${e}\u5931\u8D25\uFF0Csystemctl \u9000\u51FA\u7801: ${r.status??"unknown"}`}function o(e){return!e.error&&e.status===0}function $(e,r){return e==="linux"?!0:(r("[runtime-bridge] service \u547D\u4EE4\u4EC5\u652F\u6301 Linux systemd \u73AF\u5883\u3002"),!1)}function E(e,r){return e==="darwin"?!0:(r("[runtime-bridge] service \u547D\u4EE4\u4EC5\u652F\u6301 macOS launchd \u73AF\u5883\u3002"),!1)}function X(e){e("Usage: awsb service <install|uninstall|start|stop|restart>")}function Ce(e){e("Usage: awsb <command> [options]"),e(""),e("\u547D\u4EE4:"),e(" -v, --version, version \u663E\u793A\u7248\u672C\u53F7"),e(" update [--yes|-y|--no-kill] \u66F4\u65B0\u5230\u6700\u65B0\u7248\u672C"),e(" config [example|minimal] \u914D\u7F6E\u8FD0\u884C\u53C2\u6570"),e(" pair --ticket <ticket> \u7528\u7BA1\u7406\u9875\u7684\u4E00\u6B21\u6027\u7968\u636E\u914D\u5BF9\uFF0C\u6362\u53D6\u673A\u5668\u51ED\u636E"),e(" service <install|uninstall|start|stop|restart> \u7BA1\u7406\u7CFB\u7EDF\u670D\u52A1"),e(" log [--follow|-f] \u67E5\u770B\u670D\u52A1\u65E5\u5FD7"),e(" -h, --help, help \u663E\u793A\u672C\u5E2E\u52A9")}async function xe(e,r,t,i){const s=e.slice(1);if(s.includes("-h")||s.includes("--help"))return t("\u7528\u6CD5: awsb pair --ticket awsp_xxx [--server-url http://host:port] [--instance-id bridge-xxx] [--target-identity credential-id] [--instance-name name] [--register-addr host:port]"),{handled:!0,exitCode:0};const n=c=>{const f=s.indexOf(c);if(!(f<0))return s[f+1]?.trim()||void 0},u=n("--ticket")||s.find(c=>c.startsWith("awsp_"));if(!u)return i("\u7F3A\u5C11\u914D\u5BF9\u7968\u636E\u3002\u7528\u6CD5: awsb pair --ticket awsp_xxx [--server-url URL]"),{handled:!0,exitCode:1};const d=r.pair||ie;let a;try{a=await d({ticket:u,serverUrl:n("--server-url"),instanceId:n("--instance-id"),targetIdentity:n("--target-identity"),instanceName:n("--instance-name"),registerAddr:n("--register-addr")})}catch(c){return i(`\u914D\u5BF9\u5931\u8D25: ${c.message}`),{handled:!0,exitCode:1}}return a.success?(t("\u2713 \u914D\u5BF9\u6210\u529F\uFF0C\u673A\u5668\u51ED\u636E\u5DF2\u5199\u5165 config.json\uFF08\u660E\u6587\u4E0D\u663E\u793A\uFF09"),t(` \u5B9E\u4F8B ID: ${a.instanceId||"(\u672A\u77E5)"}`),t(` \u8C03\u5EA6\u4E2D\u5FC3: ${a.serverUrl||"(\u672A\u77E5)"}`),t(" \u8BF7\u91CD\u542F Bridge \u4F7F\u65B0\u914D\u7F6E\u751F\u6548\uFF1Aawsb service restart\uFF08\u6216\u91CD\u65B0\u542F\u52A8 awsb\uFF09"),{handled:!0,exitCode:0}):(i(`\u914D\u5BF9\u5931\u8D25: ${a.error||"\u672A\u77E5\u9519\u8BEF"}`),{handled:!0,exitCode:1})}function ve(e){if(!$(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=we(e.executablePath);try{T(l.dirname(e.serviceUnitPath),{recursive:!0}),B(e.serviceUnitPath,r,{encoding:"utf-8",mode:420})}catch(n){const u=n instanceof Error?n:new Error(String(n));return e.stderr(`[runtime-bridge] \u5199\u5165 systemd unit \u5931\u8D25: ${u.message}`),{handled:!0,exitCode:1}}const t=C(e.runCommand,["daemon-reload"]);if(!o(t))return e.stderr(x("\u91CD\u8F7D systemd",t)),{handled:!0,exitCode:t.status??1};const i=C(e.runCommand,["enable",b]);if(!o(i))return e.stderr(x("\u542F\u7528 awsb \u5F00\u673A\u81EA\u542F",i)),{handled:!0,exitCode:i.status??1};const s=C(e.runCommand,["is-active","--quiet",b]);if(s.error)return e.stderr(x("\u68C0\u67E5 awsb \u670D\u52A1\u72B6\u6001",s)),{handled:!0,exitCode:1};if(s.status!==0){const n=C(e.runCommand,["start",b]);return o(n)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u5B89\u88C5\u3001\u5DF2\u542F\u7528\u5F00\u673A\u81EA\u542F\u5E76\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(x("\u542F\u52A8 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1})}return e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u5B89\u88C5\u5E76\u5DF2\u542F\u7528\u5F00\u673A\u81EA\u542F\uFF1B\u670D\u52A1\u5DF2\u5728\u8FD0\u884C\u3002"),{handled:!0,exitCode:0}}function Se(e){if(!$(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=g(e.serviceUnitPath),t=C(e.runCommand,["is-active","--quiet",b]);if(t.error)return e.stderr(x("\u68C0\u67E5 awsb \u670D\u52A1\u72B6\u6001",t)),{handled:!0,exitCode:1};if(t.status===0){const n=C(e.runCommand,["stop",b]);if(!o(n))return e.stderr(x("\u505C\u6B62 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1}}const i=C(e.runCommand,["disable",b]);if(i.error||i.status!==0&&r)return e.stderr(x("\u7981\u7528 awsb \u5F00\u673A\u81EA\u542F",i)),{handled:!0,exitCode:i.status??1};if(r)try{N(e.serviceUnitPath)}catch(n){const u=n instanceof Error?n:new Error(String(n));return e.stderr(`[runtime-bridge] \u5220\u9664 systemd unit \u5931\u8D25: ${u.message}`),{handled:!0,exitCode:1}}else e.stdout("[runtime-bridge] awsb systemd unit \u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u5220\u9664\u3002");const s=C(e.runCommand,["daemon-reload"]);return o(s)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}):(e.stderr(x("\u91CD\u8F7D systemd",s)),{handled:!0,exitCode:s.status??1})}function ye(e){if(!$(e.platform,e.stderr))return{handled:!0,exitCode:1};if(!g(e.serviceUnitPath))return e.stderr("[runtime-bridge] awsb systemd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const r=C(e.runCommand,["restart",b]);return o(r)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u91CD\u542F\u3002"),{handled:!0,exitCode:0}):(e.stderr(x("\u91CD\u542F awsb \u670D\u52A1",r)),{handled:!0,exitCode:r.status??1})}function Pe(e){if(!$(e.platform,e.stderr))return{handled:!0,exitCode:1};if(!g(e.serviceUnitPath))return e.stderr("[runtime-bridge] awsb systemd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const r=C(e.runCommand,["start",b]);return o(r)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(x("\u542F\u52A8 awsb \u670D\u52A1",r)),{handled:!0,exitCode:r.status??1})}function pe(e){if(!$(e.platform,e.stderr))return{handled:!0,exitCode:1};if(!g(e.serviceUnitPath))return e.stderr("[runtime-bridge] awsb systemd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const r=C(e.runCommand,["stop",b]);return o(r)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u505C\u6B62\u3002"),{handled:!0,exitCode:0}):(e.stderr(x("\u505C\u6B62 awsb \u670D\u52A1",r)),{handled:!0,exitCode:r.status??1})}function $e(e){return e(`[runtime-bridge] \u672A\u68C0\u6D4B\u5230 node-windows \u6A21\u5757\u3002\u8BF7\u91CD\u65B0\u5B89\u88C5 aws-runtime-bridge\uFF1A
6
- npm install -g aws-runtime-bridge`),{handled:!0,exitCode:1}}async function j(e){const r=e.windowsServiceManager;if(!r&&!de())return $e(e.stderr);const t=e.windowsServiceLogPath||J,i=l.dirname(e.executablePath),s=W.homedir();try{await(r||ue()).install({name:Y,description:"awsb runtime bridge",script:e.executablePath,workingDirectory:i,env:[{name:"AWS_BRIDGE_SKIP_SETUP",value:"true"},{name:"AWS_RUNTIME_HOME_DIR",value:s}],logpath:L()})}catch(a){const c=a instanceof Error?a:new Error(String(a));return e.stderr(`[runtime-bridge] \u5B89\u88C5 Windows \u670D\u52A1\u5931\u8D25: ${c.message}`),{handled:!0,exitCode:1}}const n=e.runCommand("sc.exe",["start",m]);if(!o(n))return e.stderr(`[runtime-bridge] \u542F\u52A8 Windows \u670D\u52A1\u5931\u8D25: ${n.error?.message??`\u9000\u51FA\u7801 ${n.status??"unknown"}`}`),{handled:!0,exitCode:n.status??1};const u=["failure",m,"reset=","86400","actions=","restart/5000/restart/10000/restart/30000"],d=e.runCommand("sc.exe",u);return o(d)?e.stdout("[runtime-bridge] \u5DF2\u914D\u7F6E awsb \u670D\u52A1\u5931\u8D25\u81EA\u52A8\u91CD\u542F\uFF085s/10s/30s\uFF09\u3002"):e.stderr(`[runtime-bridge] \u914D\u7F6E\u670D\u52A1\u5931\u8D25\u81EA\u52A8\u91CD\u542F\u672A\u751F\u6548\uFF08\u53EF\u5FFD\u7565\uFF09: ${d.error?.message??`\u9000\u51FA\u7801 ${d.status??"unknown"}`}`),e.stdout(`[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u5B89\u88C5\u5E76\u5DF2\u542F\u52A8\uFF08\u65E5\u5FD7: ${t}\uFF09\u3002`),{handled:!0,exitCode:0}}function Ee(e){const r=i=>e.runCommand("sc.exe",i);r(["stop",m]);const t=r(["delete",m]);return o(t)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u5378\u8F7D Windows \u670D\u52A1\u5931\u8D25: ${t.error?.message??`\u9000\u51FA\u7801 ${t.status??"unknown"}`}`),{handled:!0,exitCode:t.status??1})}async function ke(e){e.runCommand("sc.exe",["stop",m]);const r=e.queryWindowsServiceState||F;return Q(r,m)||e.stdout("[runtime-bridge] \u7B49\u5F85 Windows \u670D\u52A1\u505C\u6B62\u8D85\u65F6\uFF0C\u4ECD\u5C1D\u8BD5\u542F\u52A8\uFF08\u53EF\u80FD\u62A5 1056\uFF09\u3002"),Z(e,"\u91CD\u542F")}async function Re(e){return Z(e,"\u542F\u52A8")}const De=2,We=1056;async function Z(e,r){const t=e.runCommand("sc.exe",["start",m]);if(o(t))return e.stdout(`[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2${r}\u3002`),{handled:!0,exitCode:0};if(t.status===We)return e.stdout(`[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u5728\u8FD0\u884C\u4E2D\uFF08\u65E0\u9700${r}\uFF09\u3002`),{handled:!0,exitCode:0};if(t.status===De){e.stdout("[runtime-bridge] \u68C0\u6D4B\u5230 Windows \u670D\u52A1\u4E8C\u8FDB\u5236\u6587\u4EF6\u4E22\u5931\uFF08winsw.exe\uFF09\uFF0C\u6B63\u5728\u91CD\u5EFA..."),e.runCommand("sc.exe",["delete",m]);try{const i=await j(e);return i.exitCode!==0&&e.stderr(`[runtime-bridge] ${r} Windows \u670D\u52A1\u5931\u8D25\u4E14\u81EA\u52A8\u91CD\u5EFA\u5931\u8D25\u3002\u8BF7\u624B\u52A8\u6267\u884C \`awsb service uninstall && awsb service install\` \u4FEE\u590D\u3002`),i}catch(i){const s=i instanceof Error?i:new Error(String(i));return e.stderr(`[runtime-bridge] ${r} Windows \u670D\u52A1\u5931\u8D25\u4E14\u81EA\u52A8\u91CD\u5EFA\u5F02\u5E38: ${s.message}\u3002\u8BF7\u624B\u52A8\u6267\u884C \`awsb service uninstall && awsb service install\` \u4FEE\u590D\u3002`),{handled:!0,exitCode:1}}}return e.stderr(`[runtime-bridge] ${r} Windows \u670D\u52A1\u5931\u8D25: ${t.error?.message??`\u9000\u51FA\u7801 ${t.status??"unknown"}`}`),{handled:!0,exitCode:t.status??1}}function _e(e){const r=e.runCommand("sc.exe",["stop",m]);return o(r)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u505C\u6B62\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u505C\u6B62 Windows \u670D\u52A1\u5931\u8D25: ${r.error?.message??`\u9000\u51FA\u7801 ${r.status??"unknown"}`}`),{handled:!0,exitCode:r.status??1})}function Ie(){return`gui/${process.getuid?.()??0}`}function k(e){return e.launchdDomainTarget||Ie()}function R(e){return`${e}/${U}`}function D(e,r){return r.error?`[runtime-bridge] ${e}\u5931\u8D25: ${r.error.message}`:`[runtime-bridge] ${e}\u5931\u8D25\uFF0Claunchctl \u9000\u51FA\u7801: ${r.status??"unknown"}`}function Te(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||_,t=e.launchdLogPath||M,i=be(e.executablePath,{userHomeDir:W.homedir(),logPath:t});try{T(l.dirname(r),{recursive:!0}),T(l.dirname(t),{recursive:!0}),B(r,i,{encoding:"utf-8",mode:420})}catch(u){const d=u instanceof Error?u:new Error(String(u));return e.stderr(`[runtime-bridge] \u5199\u5165 launchd plist \u5931\u8D25: ${d.message}`),{handled:!0,exitCode:1}}const s=k(e);e.runCommand("launchctl",["bootout",R(s)]);const n=e.runCommand("launchctl",["bootstrap",s,r]);return o(n)?(e.stdout(`[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u5B89\u88C5\u5E76\u5DF2\u542F\u52A8\uFF08\u65E5\u5FD7: ${t}\uFF09\u3002`),{handled:!0,exitCode:0}):(e.stderr(D("\u5B89\u88C5 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1})}function Ne(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||_,t=k(e),i=R(t),s=e.runCommand("launchctl",["bootout",i]);if(s.error)return e.stderr(D("\u5378\u8F7D awsb \u670D\u52A1",s)),{handled:!0,exitCode:1};if(g(r))try{N(r)}catch(n){const u=n instanceof Error?n:new Error(String(n));return e.stderr(`[runtime-bridge] \u5220\u9664 launchd plist \u5931\u8D25: ${u.message}`),{handled:!0,exitCode:1}}else e.stdout("[runtime-bridge] awsb launchd plist \u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u5220\u9664\u3002");return e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}}function Ae(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||_;if(!g(r))return e.stderr("[runtime-bridge] awsb launchd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const t=k(e),i=R(t),s=e.runCommand("launchctl",["kickstart",i]);if(o(s))return e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0};const n=e.runCommand("launchctl",["bootstrap",t,r]);return o(n)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(D("\u542F\u52A8 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1})}function Le(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=k(e),t=e.runCommand("launchctl",["bootout",R(r)]);return o(t)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u505C\u6B62\u3002"),{handled:!0,exitCode:0}):(e.stderr(D("\u505C\u6B62 awsb \u670D\u52A1",t)),{handled:!0,exitCode:t.status??1})}function Ue(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||_;if(!g(r))return e.stderr("[runtime-bridge] awsb launchd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const t=k(e);e.runCommand("launchctl",["bootout",R(t)]);const i=e.runCommand("launchctl",["bootstrap",t,r]);return o(i)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u91CD\u542F\u3002"),{handled:!0,exitCode:0}):(e.stderr(D("\u91CD\u542F awsb \u670D\u52A1",i)),{handled:!0,exitCode:i.status??1})}async function Me(e,r,t,i){const s=e[1];if(K())return i("[runtime-bridge] \u684C\u9762\u7248\u4E0D\u652F\u6301 service \u547D\u4EE4\uFF0C\u8BF7\u4F7F\u7528\u684C\u9762\u5E94\u7528\u7684\u6258\u76D8\u83DC\u5355\u7BA1\u7406\u542F\u52A8\u4E0E\u5F00\u673A\u81EA\u542F\u3002"),{handled:!0,exitCode:1};if(!s||s==="-h"||s==="--help"||s==="help")return X(t),{handled:!0,exitCode:s?0:1};const n={stdout:t,stderr:i,runCommand:r.runCommand||I,platform:r.platform||process.platform,serviceUnitPath:r.serviceUnitPath||A,executablePath:r.executablePath||z(),windowsServiceManager:r.windowsServiceManager,launchdPlistPath:r.launchdPlistPath,launchdLogPath:r.launchdLogPath,launchdDomainTarget:r.launchdDomainTarget,queryWindowsServiceState:r.queryWindowsServiceState||F};return n.platform!=="linux"&&n.platform!=="win32"&&n.platform!=="darwin"?(i("[runtime-bridge] service \u547D\u4EE4\u4EC5\u652F\u6301 Linux systemd\u3001Windows \u670D\u52A1\u4E0E macOS launchd \u73AF\u5883\u3002"),{handled:!0,exitCode:1}):s==="install"?n.platform==="win32"?await j(n):n.platform==="darwin"?Te(n):ve(n):s==="uninstall"?n.platform==="win32"?Ee(n):n.platform==="darwin"?Ne(n):Se(n):s==="restart"?n.platform==="win32"?ke(n):n.platform==="darwin"?Ue(n):ye(n):s==="start"?n.platform==="win32"?Re(n):n.platform==="darwin"?Ae(n):Pe(n):s==="stop"?n.platform==="win32"?_e(n):n.platform==="darwin"?Le(n):pe(n):(i(`[runtime-bridge] \u672A\u77E5 service \u5B50\u547D\u4EE4: ${s}`),X(t),{handled:!0,exitCode:1})}function ee(e){return e?e.split(/\r?\n/).map(r=>r.trim()).filter(r=>/^\d+$/.test(r)).map(Number):[]}function Oe(e){try{if(e==="win32"){const t=w("powershell",["-NoProfile","-Command",`Get-CimInstance Win32_Process -Filter "Name='node.exe'" | Where-Object { $_.CommandLine -like '*aws-runtime-bridge*' -and $_.ProcessId -ne ${process.pid} } | ForEach-Object { $_.ProcessId }`],{encoding:"utf-8"}),i=Fe(e);return je([...ee(t.stdout),...i]).filter(s=>s!==process.pid)}const r=w("pgrep",["-f","aws-runtime-bridge"],{encoding:"utf-8"});return ee(r.stdout).filter(t=>t!==process.pid)}catch{return[]}}function Fe(e){if(e!=="win32")return[];try{const r=w("sc.exe",["query",m],{encoding:"utf-8",shell:!0,stdio:["ignore","pipe","ignore"]});if(r.status!==0||!r.stdout)return[];const t=r.stdout.match(/STATE\s*:\s*\d+\s+(\S+)/);if(!t)return[];const i=t[1];if(i!=="RUNNING"&&i!=="START_PENDING"&&i!=="STOP_PENDING")return[];const s=w("tasklist",["/FI","IMAGENAME eq awsb.exe","/FO","CSV","/NH"],{encoding:"utf-8",shell:!0,stdio:["ignore","pipe","ignore"]});return s.status!==0||!s.stdout?[]:s.stdout.split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0).map(n=>{const u=n.match(/^"awsb\.exe","(\d+)"/i);return u?Number(u[1]):NaN}).filter(n=>Number.isFinite(n)&&n>0)}catch{return[]}}function je(e){const r=new Set,t=[];for(const i of e)r.has(i)||(r.add(i),t.push(i));return t}function He(e,r,t=1e4,i=250){if(r==="win32"){if(Be(e,r)){w("sc.exe",["stop",m],{stdio:"ignore",shell:!0}),Q(F,m);return}w("taskkill",["/PID",String(e),"/F","/T"],{stdio:"ignore"}),qe(Ge,e,r,t,i);return}w("kill",["-9",String(e)],{stdio:"ignore"})}function Ge(e,r){if(r!=="win32"||!Number.isFinite(e)||e<=0)return!0;try{const t=w("tasklist",["/FI",`PID eq ${e}`,"/NH"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return t.status!==0||!t.stdout?!0:!t.stdout.includes(String(e))}catch{return!0}}function qe(e,r,t,i=1e4,s=250){const n=Date.now()+i;for(;Date.now()<n;){if(e(r,t))return!0;O(s)}return e(r,t)}function Be(e,r){if(r!=="win32"||!Number.isFinite(e)||e<=0)return!1;try{const t=w("powershell",["-NoProfile","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${e}" -ErrorAction SilentlyContinue).Name`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return t.status!==0||!t.stdout?!1:/^awsb\.exe$/i.test(t.stdout.trim())}catch{return!1}}function Ve(e){if(!process.stdin.isTTY)return Promise.resolve("n");const r=te({input:process.stdin,output:process.stdout});return r.question(e).finally(()=>r.close())}function Ke(e,r=3,t=500){let i;for(let s=0;s<=r;s+=1)try{q(e,{recursive:!0,force:!0});return}catch(n){i=n instanceof Error?n:new Error(String(n)),s<r&&O(t*2**s)}throw i??new Error(`\u65E0\u6CD5\u5220\u9664\u76EE\u5F55: ${e}`)}function Ye(e){const r=l.join(e,"aws-runtime-bridge","node_modules"),t=l.join(r,"fsevents");if(g(t))try{q(t,{recursive:!0,force:!0})}catch{}const i=l.join(r,".package-lock.json");if(g(i))try{G(i,"utf-8").includes("fsevents")&&N(i)}catch{}}async function Je(e,r,t){const i=e.runCommand||I,s=e.platform||process.platform,n=e.findRunningBridgeProcesses||Oe,u=e.prompt||Ve,d=e.killBridgeProcess||He,a=e.globalModulePath||le;r("[runtime-bridge] \u6B63\u5728\u66F4\u65B0 aws-runtime-bridge \u5230\u6700\u65B0\u7248\u672C...");let c=!1;if(e.skipKill)c=!0,r("[runtime-bridge] \u5DF2\u6307\u5B9A --no-kill\uFF0C\u8DF3\u8FC7\u8FD0\u884C\u8FDB\u7A0B\u68C0\u6D4B\uFF0C\u5C06\u4EE5 --force \u65B9\u5F0F\u5B89\u88C5\u3002");else{const v=n(s).filter(h=>h!==process.pid);if(v.length>0)if(r(`[runtime-bridge] \u68C0\u6D4B\u5230 aws-runtime-bridge \u6B63\u5728\u8FD0\u884C (PID: ${v.join(", ")})\uFF0C\u66F4\u65B0\u65F6\u8FD9\u4E9B\u8FDB\u7A0B\u53EF\u80FD\u5360\u7528\u6587\u4EF6\u5BFC\u81F4\u8986\u76D6\u5931\u8D25\u3002`),e.assumeYes){r("[runtime-bridge] \u975E\u4EA4\u4E92\u6A21\u5F0F(--yes)\uFF0C\u81EA\u52A8\u5173\u95ED\u4E0A\u8FF0\u8FDB\u7A0B\u4EE5\u7EE7\u7EED\u66F4\u65B0...");for(const h of v)try{d(h,s),r(`[runtime-bridge] \u5DF2\u5173\u95ED\u8FDB\u7A0B PID: ${h}`)}catch(S){const p=S instanceof Error?S:new Error(String(S));t(`[runtime-bridge] \u5173\u95ED\u8FDB\u7A0B PID ${h} \u5931\u8D25: ${p.message}`)}}else{const h=(await u("\u662F\u5426\u5173\u95ED\u4E0A\u8FF0\u8FDB\u7A0B\u4EE5\u7EE7\u7EED\u66F4\u65B0? (y/N) ")).trim().toLowerCase();if(h==="y"||h==="yes")for(const S of v)try{d(S,s),r(`[runtime-bridge] \u5DF2\u5173\u95ED\u8FDB\u7A0B PID: ${S}`)}catch(p){const re=p instanceof Error?p:new Error(String(p));t(`[runtime-bridge] \u5173\u95ED\u8FDB\u7A0B PID ${S} \u5931\u8D25: ${re.message}`)}else c=!0,r("[runtime-bridge] \u5DF2\u9009\u62E9\u4E0D\u5173\u95ED\u8FDB\u7A0B\uFF0C\u5C06\u4EE5 --force \u65B9\u5F0F\u5F3A\u5236\u5B89\u88C5\uFF08\u82E5\u6587\u4EF6\u4ECD\u88AB\u5360\u7528\u53EF\u80FD\u4F1A\u6709\u8B66\u544A\uFF09\u3002")}}const f=a();if(f){const v=l.join(f,"aws-runtime-bridge");if(g(v)){r("[runtime-bridge] \u6E05\u7406\u65E7\u7248\u672C\u6B8B\u7559\u76EE\u5F55...");try{Ke(v)}catch(h){const S=h instanceof Error?h:new Error(String(h));t(`[runtime-bridge] \u6E05\u7406\u6B8B\u7559\u76EE\u5F55\u5931\u8D25\uFF08\u5C06\u5C1D\u8BD5\u7EE7\u7EED\u5B89\u88C5\uFF09: ${S.message}`),Ye(f)}}}const H=["install","-g","aws-runtime-bridge@latest","--omit=optional"];c&&H.push("--force");const P=i("npm",H);if(P.error)return t(`[runtime-bridge] \u66F4\u65B0\u5931\u8D25: ${P.error.message}`),{handled:!0,exitCode:1};if(P.status!==0)return t(`[runtime-bridge] \u66F4\u65B0\u5931\u8D25\uFF0Cnpm \u9000\u51FA\u7801: ${P.status??"unknown"}`),{handled:!0,exitCode:P.status??1};if(s==="win32"){const v=await Qe(e,r,t);if(v.exitCode!==0)return v}return r("[runtime-bridge] \u66F4\u65B0\u5B8C\u6210\u3002\u8BF7\u91CD\u65B0\u8FD0\u884C awsb -v \u67E5\u770B\u5F53\u524D\u7248\u672C\u3002"),{handled:!0,exitCode:0}}async function Qe(e,r,t){const i=e.runCommand||I,s=i("sc.exe",["query",m]);if(!o(s))return{handled:!0,exitCode:0};r("[runtime-bridge] \u68C0\u6D4B\u5230 Windows \u670D\u52A1\u5DF2\u6CE8\u518C\uFF0C\u6B63\u5728\u91CD\u5EFA\u670D\u52A1\u6587\u4EF6\uFF08daemon/winsw.exe\uFF09..."),i("sc.exe",["stop",m]);const n=i("sc.exe",["delete",m]);o(n)||t(`[runtime-bridge] \u5220\u9664\u65E7 SCM \u8BB0\u5F55\u5931\u8D25: ${n.error?.message??`\u9000\u51FA\u7801 ${n.status??"unknown"}`}\uFF08\u5C1D\u8BD5\u7EE7\u7EED\u5B89\u88C5\uFF09`);const u={stdout:r,stderr:t,runCommand:i,platform:"win32",serviceUnitPath:e.serviceUnitPath||A,executablePath:e.executablePath||z(),windowsServiceManager:e.windowsServiceManager};try{return(await j(u)).exitCode!==0?(t("[runtime-bridge] \u91CD\u5EFA Windows \u670D\u52A1\u6587\u4EF6\u5931\u8D25\u3002\u5305\u5DF2\u66F4\u65B0\uFF0C\u8BF7\u624B\u52A8\u6267\u884C `awsb service uninstall && awsb service install` \u4FEE\u590D\u670D\u52A1\u3002"),{handled:!0,exitCode:0}):(r("[runtime-bridge] Windows \u670D\u52A1\u6587\u4EF6\u5DF2\u91CD\u5EFA\u3002"),{handled:!0,exitCode:0})}catch(d){const a=d instanceof Error?d:new Error(String(d));return t(`[runtime-bridge] \u91CD\u5EFA Windows \u670D\u52A1\u6587\u4EF6\u5F02\u5E38: ${a.message}\u3002\u5305\u5DF2\u66F4\u65B0\uFF0C\u8BF7\u624B\u52A8\u6267\u884C \`awsb service uninstall && awsb service install\` \u4FEE\u590D\u670D\u52A1\u3002`),{handled:!0,exitCode:0}}}function ze(e,r,t){const s=(e.argv||process.argv.slice(2)).slice(1).some(a=>a==="--follow"||a==="-f"),n=e.platform||process.platform,u=e.runCommand||I,d=e.serviceUnitPath||A;if(n==="linux"){if(!g(d))return t("[runtime-bridge] awsb \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF08awsb service install\uFF09\uFF0C\u65E0\u65E5\u5FD7\u53EF\u67E5\u770B\u3002"),{handled:!0,exitCode:1};const a=["-u",b];s?a.push("-f"):a.push("-n","200","--no-pager");const c=u("journalctl",a);return c.error?(t(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${c.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:c.status??0}}if(n==="win32"){const a=e.windowsServiceLogPath||J;if(!g(a))return t(`[runtime-bridge] \u5C1A\u672A\u751F\u6210\u65E5\u5FD7\u6587\u4EF6: ${a}\u3002\u8BF7\u5148\u6267\u884C \`awsb service install\` \u5E76\u8FD0\u884C\u670D\u52A1\u3002`),{handled:!0,exitCode:1};const c=`Get-Content -Encoding UTF8 -Tail 200 "${a}"`+(s?" -Wait":""),f=u("powershell",["-NoProfile","-Command",c]);return f.error?(t(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${f.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:f.status??0}}if(n==="darwin"){const a=e.launchdLogPath||M;if(!g(a))return t(`[runtime-bridge] \u5C1A\u672A\u751F\u6210\u65E5\u5FD7\u6587\u4EF6: ${a}\u3002\u8BF7\u5148\u6267\u884C \`awsb service install\` \u5E76\u8FD0\u884C\u670D\u52A1\u3002`),{handled:!0,exitCode:1};const f=u("tail",s?["-f",a]:["-n","200",a]);return f.error?(t(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${f.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:f.status??0}}return t("[runtime-bridge] awsb log \u4EC5\u652F\u6301 Linux systemd\u3001Windows \u670D\u52A1\u4E0E macOS launchd \u73AF\u5883\u3002"),{handled:!0,exitCode:1}}async function dr(e={}){const r=e.argv||process.argv.slice(2),t=r[0],i=e.stdout||me,s=e.stderr||fe;if(t===void 0)return{handled:!1,exitCode:0};if(t==="-h"||t==="--help"||t==="help")return Ce(i),{handled:!0,exitCode:0};if(ge(t))return i(`aws-runtime-bridge ${ce(e.packageRoot)}`),{handled:!0,exitCode:0};if(t==="update"){if(K())return s("[runtime-bridge] \u684C\u9762\u7248\u4E0D\u652F\u6301 awsb update\uFF0C\u8BF7\u901A\u8FC7\u684C\u9762\u5E94\u7528\u7684\u66F4\u65B0\u63D0\u793A\u5347\u7EA7\u3002"),{handled:!0,exitCode:1};const n=r.includes("--yes")||r.includes("-y"),u=r.includes("--no-kill"),d=n||u?{...e,assumeYes:n,skipKill:u}:e;return await Je(d,i,s)}if(t==="config"){const n=r[1];if(n==="example"||n==="minimal"||n==="--minimal"||n==="-m")return{handled:!0,exitCode:await(e.configureExample||ae)()==="created"?0:1};const d=await(e.configure||se)();return{handled:!0,exitCode:d==="configured"||d==="created"?0:1}}return t==="pair"?await xe(r,e,i,s):t==="service"?await Me(r,e,i,s):t==="log"?ze(e,i,s):(s(`[runtime-bridge] \u672A\u77E5\u547D\u4EE4: ${t}`),s("[runtime-bridge] \u8BF7\u8FD0\u884C `awsb --help` \u67E5\u770B\u652F\u6301\u7684\u547D\u4EE4\u3002"),{handled:!0,exitCode:1})}export{be as createLaunchdPlistContent,we as createSystemdUnitContent,Oe as defaultFindRunningBridgeProcesses,He as defaultKillBridgeProcess,Ge as defaultProcessIsGone,dr as handleCliCommand,ce as readPackageVersion,Ke as removeDirWithRetry,Ye as removeUpdateFseventsResidue,qe as waitForProcessGone};
1
+ import{spawnSync as w}from"node:child_process";import{existsSync as f,mkdirSync as N,readFileSync as H,rmSync as G,unlinkSync as A,writeFileSync as q}from"node:fs";import _ from"node:os";import c from"node:path";import{createInterface as te}from"node:readline/promises";import{fileURLToPath as V}from"node:url";import{getRuntimeHomeDir as ne,isDesktopAppMode as K}from"../config.js";import{notifyRunningBridgeAfterPair as ie,pairBridge as se}from"./bridge-pairing.js";import{configureStartupConfig as ae,printConfigExampleCommand as ue}from"./startup-config-wizard.js";import{createWindowsServiceManager as de,isNodeWindowsAvailable as oe}from"./windows-service-manager.js";const b="awsb.service",L=`/etc/systemd/system/${b}`,Y="awsb",l=`${Y}.exe`;function U(){return c.join(ne(),".aws-bridge","log")}const J=c.join(U(),"awsb.out.log"),M="com.agentsworkstudio.awsb",I=c.join(_.homedir(),"Library","LaunchAgents",`${M}.plist`),O=c.join(U(),"awsb.out.log");function ce(){const e=V(import.meta.url);return c.resolve(c.dirname(e),"..","..")}function le(e=ce()){const r=c.join(e,"package.json");return JSON.parse(H(r,"utf-8")).version||"unknown"}function T(e,r){const t=w(e,r,{shell:process.platform==="win32",stdio:"inherit"});return{status:t.status,error:t.error}}function me(){try{const e=w("npm",["root","-g"],{shell:process.platform==="win32",encoding:"utf-8",stdio:["ignore","pipe","ignore"]});if(e.status===0&&e.stdout){const r=e.stdout.trim();if(r)return r}}catch{}return null}function F(e){try{const r=new SharedArrayBuffer(4);Atomics.wait(new Int32Array(r),0,0,e)}catch{const r=Date.now()+e;for(;Date.now()<r;);}}function j(e){if(process.platform!=="win32")return null;try{const r=w("sc.exe",["query",e],{shell:!0,encoding:"utf-8",stdio:["ignore","pipe","ignore"]});if(r.status!==0||!r.stdout)return null;const t=r.stdout.match(/STATE\s*:\s*\d+\s+(\S+)/);return t?t[1]:null}catch{return null}}function Q(e,r,t=15e3,i=500){const s=Date.now()+t;for(;Date.now()<s;){const n=e(r);if(n===null||n==="STOPPED")return!0;F(i)}return!1}function fe(e){process.stdout.write(`${e}
2
+ `)}function ge(e){process.stderr.write(`${e}
3
+ `)}function he(e){return e==="-v"||e==="--version"||e==="version"}function we(e){return`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function z(){return process.argv[1]?c.resolve(process.argv[1]):V(import.meta.url)}function be(e){return["[Unit]","Description=AgentsWorkStudio Runtime Bridge","After=network-online.target","Wants=network-online.target","","[Service]","Type=simple","Environment=AWS_BRIDGE_SKIP_SETUP=true",`ExecStart=${[process.execPath,e].map(t=>we(t)).join(" ")}`,"Restart=on-failure","RestartSec=5s","","[Install]","WantedBy=multi-user.target",""].join(`
4
+ `)}function p(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Ce(e,r={}){const t=r.userHomeDir??_.homedir(),i=r.logPath??O,s=i.replace(/\.out\.log$/,".err.log");return['<?xml version="1.0" encoding="UTF-8"?>','<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">','<plist version="1.0">',"<dict>"," <key>Label</key>",` <string>${p(M)}</string>`," <key>ProgramArguments</key>"," <array>",` <string>${p(process.execPath)}</string>`,` <string>${p(e)}</string>`," </array>"," <key>EnvironmentVariables</key>"," <dict>"," <key>AWS_BRIDGE_SKIP_SETUP</key>"," <string>true</string>"," <key>AWS_RUNTIME_HOME_DIR</key>",` <string>${p(t)}</string>`," </dict>"," <key>RunAtLoad</key>"," <true/>"," <key>KeepAlive</key>"," <true/>"," <key>StandardOutPath</key>",` <string>${p(i)}</string>`," <key>StandardErrorPath</key>",` <string>${p(s)}</string>`,"</dict>","</plist>",""].join(`
5
+ `)}function C(e,r){return e("systemctl",r)}function x(e,r){return r.error?`[runtime-bridge] ${e}\u5931\u8D25: ${r.error.message}`:`[runtime-bridge] ${e}\u5931\u8D25\uFF0Csystemctl \u9000\u51FA\u7801: ${r.status??"unknown"}`}function o(e){return!e.error&&e.status===0}function E(e,r){return e==="linux"?!0:(r("[runtime-bridge] service \u547D\u4EE4\u4EC5\u652F\u6301 Linux systemd \u73AF\u5883\u3002"),!1)}function R(e,r){return e==="darwin"?!0:(r("[runtime-bridge] service \u547D\u4EE4\u4EC5\u652F\u6301 macOS launchd \u73AF\u5883\u3002"),!1)}function X(e){e("Usage: awsb service <install|uninstall|start|stop|restart>")}function xe(e){e("Usage: awsb <command> [options]"),e(""),e("\u547D\u4EE4:"),e(" -v, --version, version \u663E\u793A\u7248\u672C\u53F7"),e(" update [--yes|-y|--no-kill] \u66F4\u65B0\u5230\u6700\u65B0\u7248\u672C"),e(" config [example|minimal] \u914D\u7F6E\u8FD0\u884C\u53C2\u6570"),e(" pair --ticket <ticket> \u7528\u7BA1\u7406\u9875\u7684\u4E00\u6B21\u6027\u7968\u636E\u914D\u5BF9\uFF0C\u6362\u53D6\u673A\u5668\u51ED\u636E"),e(" service <install|uninstall|start|stop|restart> \u7BA1\u7406\u7CFB\u7EDF\u670D\u52A1"),e(" log [--follow|-f] \u67E5\u770B\u670D\u52A1\u65E5\u5FD7"),e(" -h, --help, help \u663E\u793A\u672C\u5E2E\u52A9")}async function ve(e,r,t,i){const s=e.slice(1);if(s.includes("-h")||s.includes("--help"))return t("\u7528\u6CD5: awsb pair --ticket awsp_xxx [--server-url http://host:port] [--instance-id bridge-xxx] [--target-identity credential-id] [--instance-name name] [--register-addr host:port]"),{handled:!0,exitCode:0};const n=y=>{const P=s.indexOf(y);if(!(P<0))return s[P+1]?.trim()||void 0},u=n("--ticket")||s.find(y=>y.startsWith("awsp_"));if(!u)return i("\u7F3A\u5C11\u914D\u5BF9\u7968\u636E\u3002\u7528\u6CD5: awsb pair --ticket awsp_xxx [--server-url URL]"),{handled:!0,exitCode:1};const d=r.pair||se;let a;try{a=await d({ticket:u,serverUrl:n("--server-url"),instanceId:n("--instance-id"),targetIdentity:n("--target-identity"),instanceName:n("--instance-name"),registerAddr:n("--register-addr")})}catch(y){return i(`\u914D\u5BF9\u5931\u8D25: ${y.message}`),{handled:!0,exitCode:1}}return a.success?(t("\u2713 \u914D\u5BF9\u6210\u529F\uFF0C\u673A\u5668\u51ED\u636E\u5DF2\u5199\u5165 config.json\uFF08\u660E\u6587\u4E0D\u663E\u793A\uFF09"),t(` \u5B9E\u4F8B ID: ${a.instanceId||"(\u672A\u77E5)"}`),t(` \u8C03\u5EA6\u4E2D\u5FC3: ${a.serverUrl||"(\u672A\u77E5)"}`),await(r.notifyRunningBridge||ie)()?(t(" \u5DF2\u901A\u77E5\u8FD0\u884C\u4E2D\u7684 Bridge \u7ACB\u5373\u7528\u65B0\u51ED\u636E\u6CE8\u518C\uFF08\u65E0\u9700\u91CD\u542F\uFF09\uFF0C"),t(" \u7A0D\u5019\u9762\u677F\u5373\u663E\u793A\u300C\u8FDE\u901A\u6B63\u5E38\u300D\uFF1B\u82E5\u957F\u65F6\u95F4\u672A\u6062\u590D\uFF0C\u518D\u6267\u884C awsb service restart")):t(" \u8BF7\u91CD\u542F Bridge \u4F7F\u65B0\u914D\u7F6E\u751F\u6548\uFF1Aawsb service restart\uFF08\u6216\u91CD\u65B0\u542F\u52A8 awsb\uFF09"),{handled:!0,exitCode:0}):(i(`\u914D\u5BF9\u5931\u8D25: ${a.error||"\u672A\u77E5\u9519\u8BEF"}`),{handled:!0,exitCode:1})}function Se(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=be(e.executablePath);try{N(c.dirname(e.serviceUnitPath),{recursive:!0}),q(e.serviceUnitPath,r,{encoding:"utf-8",mode:420})}catch(n){const u=n instanceof Error?n:new Error(String(n));return e.stderr(`[runtime-bridge] \u5199\u5165 systemd unit \u5931\u8D25: ${u.message}`),{handled:!0,exitCode:1}}const t=C(e.runCommand,["daemon-reload"]);if(!o(t))return e.stderr(x("\u91CD\u8F7D systemd",t)),{handled:!0,exitCode:t.status??1};const i=C(e.runCommand,["enable",b]);if(!o(i))return e.stderr(x("\u542F\u7528 awsb \u5F00\u673A\u81EA\u542F",i)),{handled:!0,exitCode:i.status??1};const s=C(e.runCommand,["is-active","--quiet",b]);if(s.error)return e.stderr(x("\u68C0\u67E5 awsb \u670D\u52A1\u72B6\u6001",s)),{handled:!0,exitCode:1};if(s.status!==0){const n=C(e.runCommand,["start",b]);return o(n)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u5B89\u88C5\u3001\u5DF2\u542F\u7528\u5F00\u673A\u81EA\u542F\u5E76\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(x("\u542F\u52A8 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1})}return e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u5B89\u88C5\u5E76\u5DF2\u542F\u7528\u5F00\u673A\u81EA\u542F\uFF1B\u670D\u52A1\u5DF2\u5728\u8FD0\u884C\u3002"),{handled:!0,exitCode:0}}function ye(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=f(e.serviceUnitPath),t=C(e.runCommand,["is-active","--quiet",b]);if(t.error)return e.stderr(x("\u68C0\u67E5 awsb \u670D\u52A1\u72B6\u6001",t)),{handled:!0,exitCode:1};if(t.status===0){const n=C(e.runCommand,["stop",b]);if(!o(n))return e.stderr(x("\u505C\u6B62 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1}}const i=C(e.runCommand,["disable",b]);if(i.error||i.status!==0&&r)return e.stderr(x("\u7981\u7528 awsb \u5F00\u673A\u81EA\u542F",i)),{handled:!0,exitCode:i.status??1};if(r)try{A(e.serviceUnitPath)}catch(n){const u=n instanceof Error?n:new Error(String(n));return e.stderr(`[runtime-bridge] \u5220\u9664 systemd unit \u5931\u8D25: ${u.message}`),{handled:!0,exitCode:1}}else e.stdout("[runtime-bridge] awsb systemd unit \u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u5220\u9664\u3002");const s=C(e.runCommand,["daemon-reload"]);return o(s)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}):(e.stderr(x("\u91CD\u8F7D systemd",s)),{handled:!0,exitCode:s.status??1})}function Pe(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};if(!f(e.serviceUnitPath))return e.stderr("[runtime-bridge] awsb systemd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const r=C(e.runCommand,["restart",b]);return o(r)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u91CD\u542F\u3002"),{handled:!0,exitCode:0}):(e.stderr(x("\u91CD\u542F awsb \u670D\u52A1",r)),{handled:!0,exitCode:r.status??1})}function pe(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};if(!f(e.serviceUnitPath))return e.stderr("[runtime-bridge] awsb systemd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const r=C(e.runCommand,["start",b]);return o(r)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(x("\u542F\u52A8 awsb \u670D\u52A1",r)),{handled:!0,exitCode:r.status??1})}function $e(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};if(!f(e.serviceUnitPath))return e.stderr("[runtime-bridge] awsb systemd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const r=C(e.runCommand,["stop",b]);return o(r)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u505C\u6B62\u3002"),{handled:!0,exitCode:0}):(e.stderr(x("\u505C\u6B62 awsb \u670D\u52A1",r)),{handled:!0,exitCode:r.status??1})}function Ee(e){return e(`[runtime-bridge] \u672A\u68C0\u6D4B\u5230 node-windows \u6A21\u5757\u3002\u8BF7\u91CD\u65B0\u5B89\u88C5 aws-runtime-bridge\uFF1A
6
+ npm install -g aws-runtime-bridge`),{handled:!0,exitCode:1}}async function B(e){const r=e.windowsServiceManager;if(!r&&!oe())return Ee(e.stderr);const t=e.windowsServiceLogPath||J,i=c.dirname(e.executablePath),s=_.homedir();try{await(r||de()).install({name:Y,description:"awsb runtime bridge",script:e.executablePath,workingDirectory:i,env:[{name:"AWS_BRIDGE_SKIP_SETUP",value:"true"},{name:"AWS_RUNTIME_HOME_DIR",value:s}],logpath:U()})}catch(a){const m=a instanceof Error?a:new Error(String(a));return e.stderr(`[runtime-bridge] \u5B89\u88C5 Windows \u670D\u52A1\u5931\u8D25: ${m.message}`),{handled:!0,exitCode:1}}const n=e.runCommand("sc.exe",["start",l]);if(!o(n))return e.stderr(`[runtime-bridge] \u542F\u52A8 Windows \u670D\u52A1\u5931\u8D25: ${n.error?.message??`\u9000\u51FA\u7801 ${n.status??"unknown"}`}`),{handled:!0,exitCode:n.status??1};const u=["failure",l,"reset=","86400","actions=","restart/5000/restart/10000/restart/30000"],d=e.runCommand("sc.exe",u);return o(d)?e.stdout("[runtime-bridge] \u5DF2\u914D\u7F6E awsb \u670D\u52A1\u5931\u8D25\u81EA\u52A8\u91CD\u542F\uFF085s/10s/30s\uFF09\u3002"):e.stderr(`[runtime-bridge] \u914D\u7F6E\u670D\u52A1\u5931\u8D25\u81EA\u52A8\u91CD\u542F\u672A\u751F\u6548\uFF08\u53EF\u5FFD\u7565\uFF09: ${d.error?.message??`\u9000\u51FA\u7801 ${d.status??"unknown"}`}`),e.stdout(`[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u5B89\u88C5\u5E76\u5DF2\u542F\u52A8\uFF08\u65E5\u5FD7: ${t}\uFF09\u3002`),{handled:!0,exitCode:0}}function Re(e){const r=i=>e.runCommand("sc.exe",i);r(["stop",l]);const t=r(["delete",l]);return o(t)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u5378\u8F7D Windows \u670D\u52A1\u5931\u8D25: ${t.error?.message??`\u9000\u51FA\u7801 ${t.status??"unknown"}`}`),{handled:!0,exitCode:t.status??1})}async function ke(e){e.runCommand("sc.exe",["stop",l]);const r=e.queryWindowsServiceState||j;return Q(r,l)||e.stdout("[runtime-bridge] \u7B49\u5F85 Windows \u670D\u52A1\u505C\u6B62\u8D85\u65F6\uFF0C\u4ECD\u5C1D\u8BD5\u542F\u52A8\uFF08\u53EF\u80FD\u62A5 1056\uFF09\u3002"),Z(e,"\u91CD\u542F")}async function De(e){return Z(e,"\u542F\u52A8")}const We=2,_e=1056;async function Z(e,r){const t=e.runCommand("sc.exe",["start",l]);if(o(t))return e.stdout(`[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2${r}\u3002`),{handled:!0,exitCode:0};if(t.status===_e)return e.stdout(`[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u5728\u8FD0\u884C\u4E2D\uFF08\u65E0\u9700${r}\uFF09\u3002`),{handled:!0,exitCode:0};if(t.status===We){e.stdout("[runtime-bridge] \u68C0\u6D4B\u5230 Windows \u670D\u52A1\u4E8C\u8FDB\u5236\u6587\u4EF6\u4E22\u5931\uFF08winsw.exe\uFF09\uFF0C\u6B63\u5728\u91CD\u5EFA..."),e.runCommand("sc.exe",["delete",l]);try{const i=await B(e);return i.exitCode!==0&&e.stderr(`[runtime-bridge] ${r} Windows \u670D\u52A1\u5931\u8D25\u4E14\u81EA\u52A8\u91CD\u5EFA\u5931\u8D25\u3002\u8BF7\u624B\u52A8\u6267\u884C \`awsb service uninstall && awsb service install\` \u4FEE\u590D\u3002`),i}catch(i){const s=i instanceof Error?i:new Error(String(i));return e.stderr(`[runtime-bridge] ${r} Windows \u670D\u52A1\u5931\u8D25\u4E14\u81EA\u52A8\u91CD\u5EFA\u5F02\u5E38: ${s.message}\u3002\u8BF7\u624B\u52A8\u6267\u884C \`awsb service uninstall && awsb service install\` \u4FEE\u590D\u3002`),{handled:!0,exitCode:1}}}return e.stderr(`[runtime-bridge] ${r} Windows \u670D\u52A1\u5931\u8D25: ${t.error?.message??`\u9000\u51FA\u7801 ${t.status??"unknown"}`}`),{handled:!0,exitCode:t.status??1}}function Ie(e){const r=e.runCommand("sc.exe",["stop",l]);return o(r)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u505C\u6B62\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u505C\u6B62 Windows \u670D\u52A1\u5931\u8D25: ${r.error?.message??`\u9000\u51FA\u7801 ${r.status??"unknown"}`}`),{handled:!0,exitCode:r.status??1})}function Te(){return`gui/${process.getuid?.()??0}`}function k(e){return e.launchdDomainTarget||Te()}function D(e){return`${e}/${M}`}function W(e,r){return r.error?`[runtime-bridge] ${e}\u5931\u8D25: ${r.error.message}`:`[runtime-bridge] ${e}\u5931\u8D25\uFF0Claunchctl \u9000\u51FA\u7801: ${r.status??"unknown"}`}function Ne(e){if(!R(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||I,t=e.launchdLogPath||O,i=Ce(e.executablePath,{userHomeDir:_.homedir(),logPath:t});try{N(c.dirname(r),{recursive:!0}),N(c.dirname(t),{recursive:!0}),q(r,i,{encoding:"utf-8",mode:420})}catch(u){const d=u instanceof Error?u:new Error(String(u));return e.stderr(`[runtime-bridge] \u5199\u5165 launchd plist \u5931\u8D25: ${d.message}`),{handled:!0,exitCode:1}}const s=k(e);e.runCommand("launchctl",["bootout",D(s)]);const n=e.runCommand("launchctl",["bootstrap",s,r]);return o(n)?(e.stdout(`[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u5B89\u88C5\u5E76\u5DF2\u542F\u52A8\uFF08\u65E5\u5FD7: ${t}\uFF09\u3002`),{handled:!0,exitCode:0}):(e.stderr(W("\u5B89\u88C5 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1})}function Ae(e){if(!R(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||I,t=k(e),i=D(t),s=e.runCommand("launchctl",["bootout",i]);if(s.error)return e.stderr(W("\u5378\u8F7D awsb \u670D\u52A1",s)),{handled:!0,exitCode:1};if(f(r))try{A(r)}catch(n){const u=n instanceof Error?n:new Error(String(n));return e.stderr(`[runtime-bridge] \u5220\u9664 launchd plist \u5931\u8D25: ${u.message}`),{handled:!0,exitCode:1}}else e.stdout("[runtime-bridge] awsb launchd plist \u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u5220\u9664\u3002");return e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}}function Le(e){if(!R(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||I;if(!f(r))return e.stderr("[runtime-bridge] awsb launchd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const t=k(e),i=D(t),s=e.runCommand("launchctl",["kickstart",i]);if(o(s))return e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0};const n=e.runCommand("launchctl",["bootstrap",t,r]);return o(n)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(W("\u542F\u52A8 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1})}function Ue(e){if(!R(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=k(e),t=e.runCommand("launchctl",["bootout",D(r)]);return o(t)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u505C\u6B62\u3002"),{handled:!0,exitCode:0}):(e.stderr(W("\u505C\u6B62 awsb \u670D\u52A1",t)),{handled:!0,exitCode:t.status??1})}function Me(e){if(!R(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||I;if(!f(r))return e.stderr("[runtime-bridge] awsb launchd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const t=k(e);e.runCommand("launchctl",["bootout",D(t)]);const i=e.runCommand("launchctl",["bootstrap",t,r]);return o(i)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u91CD\u542F\u3002"),{handled:!0,exitCode:0}):(e.stderr(W("\u91CD\u542F awsb \u670D\u52A1",i)),{handled:!0,exitCode:i.status??1})}async function Oe(e,r,t,i){const s=e[1];if(K())return i("[runtime-bridge] \u684C\u9762\u7248\u4E0D\u652F\u6301 service \u547D\u4EE4\uFF0C\u8BF7\u4F7F\u7528\u684C\u9762\u5E94\u7528\u7684\u6258\u76D8\u83DC\u5355\u7BA1\u7406\u542F\u52A8\u4E0E\u5F00\u673A\u81EA\u542F\u3002"),{handled:!0,exitCode:1};if(!s||s==="-h"||s==="--help"||s==="help")return X(t),{handled:!0,exitCode:s?0:1};const n={stdout:t,stderr:i,runCommand:r.runCommand||T,platform:r.platform||process.platform,serviceUnitPath:r.serviceUnitPath||L,executablePath:r.executablePath||z(),windowsServiceManager:r.windowsServiceManager,launchdPlistPath:r.launchdPlistPath,launchdLogPath:r.launchdLogPath,launchdDomainTarget:r.launchdDomainTarget,queryWindowsServiceState:r.queryWindowsServiceState||j};return n.platform!=="linux"&&n.platform!=="win32"&&n.platform!=="darwin"?(i("[runtime-bridge] service \u547D\u4EE4\u4EC5\u652F\u6301 Linux systemd\u3001Windows \u670D\u52A1\u4E0E macOS launchd \u73AF\u5883\u3002"),{handled:!0,exitCode:1}):s==="install"?n.platform==="win32"?await B(n):n.platform==="darwin"?Ne(n):Se(n):s==="uninstall"?n.platform==="win32"?Re(n):n.platform==="darwin"?Ae(n):ye(n):s==="restart"?n.platform==="win32"?ke(n):n.platform==="darwin"?Me(n):Pe(n):s==="start"?n.platform==="win32"?De(n):n.platform==="darwin"?Le(n):pe(n):s==="stop"?n.platform==="win32"?Ie(n):n.platform==="darwin"?Ue(n):$e(n):(i(`[runtime-bridge] \u672A\u77E5 service \u5B50\u547D\u4EE4: ${s}`),X(t),{handled:!0,exitCode:1})}function ee(e){return e?e.split(/\r?\n/).map(r=>r.trim()).filter(r=>/^\d+$/.test(r)).map(Number):[]}function Fe(e){try{if(e==="win32"){const t=w("powershell",["-NoProfile","-Command",`Get-CimInstance Win32_Process -Filter "Name='node.exe'" | Where-Object { $_.CommandLine -like '*aws-runtime-bridge*' -and $_.ProcessId -ne ${process.pid} } | ForEach-Object { $_.ProcessId }`],{encoding:"utf-8"}),i=je(e);return Be([...ee(t.stdout),...i]).filter(s=>s!==process.pid)}const r=w("pgrep",["-f","aws-runtime-bridge"],{encoding:"utf-8"});return ee(r.stdout).filter(t=>t!==process.pid)}catch{return[]}}function je(e){if(e!=="win32")return[];try{const r=w("sc.exe",["query",l],{encoding:"utf-8",shell:!0,stdio:["ignore","pipe","ignore"]});if(r.status!==0||!r.stdout)return[];const t=r.stdout.match(/STATE\s*:\s*\d+\s+(\S+)/);if(!t)return[];const i=t[1];if(i!=="RUNNING"&&i!=="START_PENDING"&&i!=="STOP_PENDING")return[];const s=w("tasklist",["/FI","IMAGENAME eq awsb.exe","/FO","CSV","/NH"],{encoding:"utf-8",shell:!0,stdio:["ignore","pipe","ignore"]});return s.status!==0||!s.stdout?[]:s.stdout.split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0).map(n=>{const u=n.match(/^"awsb\.exe","(\d+)"/i);return u?Number(u[1]):NaN}).filter(n=>Number.isFinite(n)&&n>0)}catch{return[]}}function Be(e){const r=new Set,t=[];for(const i of e)r.has(i)||(r.add(i),t.push(i));return t}function He(e,r,t=1e4,i=250){if(r==="win32"){if(Ve(e,r)){w("sc.exe",["stop",l],{stdio:"ignore",shell:!0}),Q(j,l);return}w("taskkill",["/PID",String(e),"/F","/T"],{stdio:"ignore"}),qe(Ge,e,r,t,i);return}w("kill",["-9",String(e)],{stdio:"ignore"})}function Ge(e,r){if(r!=="win32"||!Number.isFinite(e)||e<=0)return!0;try{const t=w("tasklist",["/FI",`PID eq ${e}`,"/NH"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return t.status!==0||!t.stdout?!0:!t.stdout.includes(String(e))}catch{return!0}}function qe(e,r,t,i=1e4,s=250){const n=Date.now()+i;for(;Date.now()<n;){if(e(r,t))return!0;F(s)}return e(r,t)}function Ve(e,r){if(r!=="win32"||!Number.isFinite(e)||e<=0)return!1;try{const t=w("powershell",["-NoProfile","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${e}" -ErrorAction SilentlyContinue).Name`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return t.status!==0||!t.stdout?!1:/^awsb\.exe$/i.test(t.stdout.trim())}catch{return!1}}function Ke(e){if(!process.stdin.isTTY)return Promise.resolve("n");const r=te({input:process.stdin,output:process.stdout});return r.question(e).finally(()=>r.close())}function Ye(e,r=3,t=500){let i;for(let s=0;s<=r;s+=1)try{G(e,{recursive:!0,force:!0});return}catch(n){i=n instanceof Error?n:new Error(String(n)),s<r&&F(t*2**s)}throw i??new Error(`\u65E0\u6CD5\u5220\u9664\u76EE\u5F55: ${e}`)}function Je(e){const r=c.join(e,"aws-runtime-bridge","node_modules"),t=c.join(r,"fsevents");if(f(t))try{G(t,{recursive:!0,force:!0})}catch{}const i=c.join(r,".package-lock.json");if(f(i))try{H(i,"utf-8").includes("fsevents")&&A(i)}catch{}}async function Qe(e,r,t){const i=e.runCommand||T,s=e.platform||process.platform,n=e.findRunningBridgeProcesses||Fe,u=e.prompt||Ke,d=e.killBridgeProcess||He,a=e.globalModulePath||me;r("[runtime-bridge] \u6B63\u5728\u66F4\u65B0 aws-runtime-bridge \u5230\u6700\u65B0\u7248\u672C...");let m=!1;if(e.skipKill)m=!0,r("[runtime-bridge] \u5DF2\u6307\u5B9A --no-kill\uFF0C\u8DF3\u8FC7\u8FD0\u884C\u8FDB\u7A0B\u68C0\u6D4B\uFF0C\u5C06\u4EE5 --force \u65B9\u5F0F\u5B89\u88C5\u3002");else{const v=n(s).filter(h=>h!==process.pid);if(v.length>0)if(r(`[runtime-bridge] \u68C0\u6D4B\u5230 aws-runtime-bridge \u6B63\u5728\u8FD0\u884C (PID: ${v.join(", ")})\uFF0C\u66F4\u65B0\u65F6\u8FD9\u4E9B\u8FDB\u7A0B\u53EF\u80FD\u5360\u7528\u6587\u4EF6\u5BFC\u81F4\u8986\u76D6\u5931\u8D25\u3002`),e.assumeYes){r("[runtime-bridge] \u975E\u4EA4\u4E92\u6A21\u5F0F(--yes)\uFF0C\u81EA\u52A8\u5173\u95ED\u4E0A\u8FF0\u8FDB\u7A0B\u4EE5\u7EE7\u7EED\u66F4\u65B0...");for(const h of v)try{d(h,s),r(`[runtime-bridge] \u5DF2\u5173\u95ED\u8FDB\u7A0B PID: ${h}`)}catch(S){const $=S instanceof Error?S:new Error(String(S));t(`[runtime-bridge] \u5173\u95ED\u8FDB\u7A0B PID ${h} \u5931\u8D25: ${$.message}`)}}else{const h=(await u("\u662F\u5426\u5173\u95ED\u4E0A\u8FF0\u8FDB\u7A0B\u4EE5\u7EE7\u7EED\u66F4\u65B0? (y/N) ")).trim().toLowerCase();if(h==="y"||h==="yes")for(const S of v)try{d(S,s),r(`[runtime-bridge] \u5DF2\u5173\u95ED\u8FDB\u7A0B PID: ${S}`)}catch($){const re=$ instanceof Error?$:new Error(String($));t(`[runtime-bridge] \u5173\u95ED\u8FDB\u7A0B PID ${S} \u5931\u8D25: ${re.message}`)}else m=!0,r("[runtime-bridge] \u5DF2\u9009\u62E9\u4E0D\u5173\u95ED\u8FDB\u7A0B\uFF0C\u5C06\u4EE5 --force \u65B9\u5F0F\u5F3A\u5236\u5B89\u88C5\uFF08\u82E5\u6587\u4EF6\u4ECD\u88AB\u5360\u7528\u53EF\u80FD\u4F1A\u6709\u8B66\u544A\uFF09\u3002")}}const g=a();if(g){const v=c.join(g,"aws-runtime-bridge");if(f(v)){r("[runtime-bridge] \u6E05\u7406\u65E7\u7248\u672C\u6B8B\u7559\u76EE\u5F55...");try{Ye(v)}catch(h){const S=h instanceof Error?h:new Error(String(h));t(`[runtime-bridge] \u6E05\u7406\u6B8B\u7559\u76EE\u5F55\u5931\u8D25\uFF08\u5C06\u5C1D\u8BD5\u7EE7\u7EED\u5B89\u88C5\uFF09: ${S.message}`),Je(g)}}}const y=["install","-g","aws-runtime-bridge@latest","--omit=optional"];m&&y.push("--force");const P=i("npm",y);if(P.error)return t(`[runtime-bridge] \u66F4\u65B0\u5931\u8D25: ${P.error.message}`),{handled:!0,exitCode:1};if(P.status!==0)return t(`[runtime-bridge] \u66F4\u65B0\u5931\u8D25\uFF0Cnpm \u9000\u51FA\u7801: ${P.status??"unknown"}`),{handled:!0,exitCode:P.status??1};if(s==="win32"){const v=await ze(e,r,t);if(v.exitCode!==0)return v}return r("[runtime-bridge] \u66F4\u65B0\u5B8C\u6210\u3002\u8BF7\u91CD\u65B0\u8FD0\u884C awsb -v \u67E5\u770B\u5F53\u524D\u7248\u672C\u3002"),{handled:!0,exitCode:0}}async function ze(e,r,t){const i=e.runCommand||T,s=i("sc.exe",["query",l]);if(!o(s))return{handled:!0,exitCode:0};r("[runtime-bridge] \u68C0\u6D4B\u5230 Windows \u670D\u52A1\u5DF2\u6CE8\u518C\uFF0C\u6B63\u5728\u91CD\u5EFA\u670D\u52A1\u6587\u4EF6\uFF08daemon/winsw.exe\uFF09..."),i("sc.exe",["stop",l]);const n=i("sc.exe",["delete",l]);o(n)||t(`[runtime-bridge] \u5220\u9664\u65E7 SCM \u8BB0\u5F55\u5931\u8D25: ${n.error?.message??`\u9000\u51FA\u7801 ${n.status??"unknown"}`}\uFF08\u5C1D\u8BD5\u7EE7\u7EED\u5B89\u88C5\uFF09`);const u={stdout:r,stderr:t,runCommand:i,platform:"win32",serviceUnitPath:e.serviceUnitPath||L,executablePath:e.executablePath||z(),windowsServiceManager:e.windowsServiceManager};try{return(await B(u)).exitCode!==0?(t("[runtime-bridge] \u91CD\u5EFA Windows \u670D\u52A1\u6587\u4EF6\u5931\u8D25\u3002\u5305\u5DF2\u66F4\u65B0\uFF0C\u8BF7\u624B\u52A8\u6267\u884C `awsb service uninstall && awsb service install` \u4FEE\u590D\u670D\u52A1\u3002"),{handled:!0,exitCode:0}):(r("[runtime-bridge] Windows \u670D\u52A1\u6587\u4EF6\u5DF2\u91CD\u5EFA\u3002"),{handled:!0,exitCode:0})}catch(d){const a=d instanceof Error?d:new Error(String(d));return t(`[runtime-bridge] \u91CD\u5EFA Windows \u670D\u52A1\u6587\u4EF6\u5F02\u5E38: ${a.message}\u3002\u5305\u5DF2\u66F4\u65B0\uFF0C\u8BF7\u624B\u52A8\u6267\u884C \`awsb service uninstall && awsb service install\` \u4FEE\u590D\u670D\u52A1\u3002`),{handled:!0,exitCode:0}}}function Xe(e,r,t){const s=(e.argv||process.argv.slice(2)).slice(1).some(a=>a==="--follow"||a==="-f"),n=e.platform||process.platform,u=e.runCommand||T,d=e.serviceUnitPath||L;if(n==="linux"){if(!f(d))return t("[runtime-bridge] awsb \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF08awsb service install\uFF09\uFF0C\u65E0\u65E5\u5FD7\u53EF\u67E5\u770B\u3002"),{handled:!0,exitCode:1};const a=["-u",b];s?a.push("-f"):a.push("-n","200","--no-pager");const m=u("journalctl",a);return m.error?(t(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${m.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:m.status??0}}if(n==="win32"){const a=e.windowsServiceLogPath||J;if(!f(a))return t(`[runtime-bridge] \u5C1A\u672A\u751F\u6210\u65E5\u5FD7\u6587\u4EF6: ${a}\u3002\u8BF7\u5148\u6267\u884C \`awsb service install\` \u5E76\u8FD0\u884C\u670D\u52A1\u3002`),{handled:!0,exitCode:1};const m=`Get-Content -Encoding UTF8 -Tail 200 "${a}"`+(s?" -Wait":""),g=u("powershell",["-NoProfile","-Command",m]);return g.error?(t(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${g.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:g.status??0}}if(n==="darwin"){const a=e.launchdLogPath||O;if(!f(a))return t(`[runtime-bridge] \u5C1A\u672A\u751F\u6210\u65E5\u5FD7\u6587\u4EF6: ${a}\u3002\u8BF7\u5148\u6267\u884C \`awsb service install\` \u5E76\u8FD0\u884C\u670D\u52A1\u3002`),{handled:!0,exitCode:1};const g=u("tail",s?["-f",a]:["-n","200",a]);return g.error?(t(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${g.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:g.status??0}}return t("[runtime-bridge] awsb log \u4EC5\u652F\u6301 Linux systemd\u3001Windows \u670D\u52A1\u4E0E macOS launchd \u73AF\u5883\u3002"),{handled:!0,exitCode:1}}async function or(e={}){const r=e.argv||process.argv.slice(2),t=r[0],i=e.stdout||fe,s=e.stderr||ge;if(t===void 0)return{handled:!1,exitCode:0};if(t==="-h"||t==="--help"||t==="help")return xe(i),{handled:!0,exitCode:0};if(he(t))return i(`aws-runtime-bridge ${le(e.packageRoot)}`),{handled:!0,exitCode:0};if(t==="update"){if(K())return s("[runtime-bridge] \u684C\u9762\u7248\u4E0D\u652F\u6301 awsb update\uFF0C\u8BF7\u901A\u8FC7\u684C\u9762\u5E94\u7528\u7684\u66F4\u65B0\u63D0\u793A\u5347\u7EA7\u3002"),{handled:!0,exitCode:1};const n=r.includes("--yes")||r.includes("-y"),u=r.includes("--no-kill"),d=n||u?{...e,assumeYes:n,skipKill:u}:e;return await Qe(d,i,s)}if(t==="config"){const n=r[1];if(n==="example"||n==="minimal"||n==="--minimal"||n==="-m")return{handled:!0,exitCode:await(e.configureExample||ue)()==="created"?0:1};const d=await(e.configure||ae)();return{handled:!0,exitCode:d==="configured"||d==="created"?0:1}}return t==="pair"?await ve(r,e,i,s):t==="service"?await Oe(r,e,i,s):t==="log"?Xe(e,i,s):(s(`[runtime-bridge] \u672A\u77E5\u547D\u4EE4: ${t}`),s("[runtime-bridge] \u8BF7\u8FD0\u884C `awsb --help` \u67E5\u770B\u652F\u6301\u7684\u547D\u4EE4\u3002"),{handled:!0,exitCode:1})}export{Ce as createLaunchdPlistContent,be as createSystemdUnitContent,Fe as defaultFindRunningBridgeProcesses,He as defaultKillBridgeProcess,Ge as defaultProcessIsGone,or as handleCliCommand,le as readPackageVersion,Ye as removeDirWithRetry,Je as removeUpdateFseventsResidue,qe as waitForProcessGone};
7
7
 
@@ -1,6 +1,6 @@
1
1
  import C from"node:fs";import W from"node:os";import f from"node:path";import{execFile as re}from"node:child_process";import{fileURLToPath as ie}from"node:url";import{Server as ne}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as se}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as oe,ListToolsRequestSchema as ae}from"@modelcontextprotocol/sdk/types.js";import{AgentClient as ce,PollLongPollTimeoutError as le}from"./agent-client.js";import{normalizeServerHttpBase as me,McpToolError as de}from"./http-client.js";import{MCP_SERVER_NAME as ue,MCP_SERVER_VERSION as fe,REGISTER_MAX_RETRIES as B,REGISTER_RETRY_INTERVAL_MS as pe,DEGRADED_MODE_ENABLED as G,DEGRADED_MODE_RETRY_INTERVAL_MS as he,DEGRADED_MODE_MAX_RETRIES as ge}from"./constants.js";import{resolveAcodeDataHome as K}from"./config.js";import{logger as c}from"./logger.js";import{meetingDebugFingerprints as L,meetingDebugLog as k}from"./meeting-debug-log.js";import{MCP_TOOLS as H,MEMORY_TOOL_NAMES as Y}from"./mcp-tools.js";import{TOOL_GROUPS as ye,buildToolGroupManifest as _e,findToolGroupByToolName as we,normalizeFeatureState as J}from"./tool-groups.js";import{MessageBuffer as Se}from"./message-buffer.js";import{ContextManager as Me}from"./context-manager.js";import{officeKindOf as F,officeWorkspaceRoot as z,packOfficeFile as D,resolveOfficeFile as O,writeOfficeFileAtomic as j,writeOfficeFileAtomicAs as ve}from"./office/office-workspace.js";import{prepareOfficeImageCommands as be,officeResolveImageSource as Te}from"./office/office-image.js";import{prepareOfficeEquationCommands as Ae}from"./office/office-equation.js";import{MEMORY_TYPE_GUIDE as V,MemoryCapacityError as Re,MemoryStore as U,normalizeMemoryTypeName as Ee}from"./memory-store.js";import{ServerMemoryStore as ke}from"./server-memory-store.js";const Ie=3e3,Ce=3e4,x=10,X=(()=>{const R=Number.parseInt(process.env.AWS_MCP_FILE_CHANGE_RENOTIFY_COOLDOWN_MS||"",10);return Number.isFinite(R)&&R>0?R:30*6e4})(),Z=500,Pe=30,$e=new Set(["<",">",":",'"',"/","\\","|","?","*"]),Oe=200*1024*1024;function Ne(R=process.env.AWS_ATTACHMENT_MAX_SIZE_MB){const e=Number(R);return Number.isFinite(e)&&e>0?Math.floor(e)*1024*1024:Oe}const Q=Ne(),De={".pdf":"application/pdf",".txt":"text/plain",".md":"text/markdown",".csv":"text/csv",".json":"application/json",".html":"text/html",".xml":"application/xml",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".zip":"application/zip",".gz":"application/gzip",".tar":"application/x-tar",".7z":"application/x-7z-compressed",".rar":"application/vnd.rar",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".mp3":"audio/mpeg",".mp4":"video/mp4"};function Fe(R){return De[f.extname(R).toLowerCase()]||"application/octet-stream"}function ee(R,e){return e.startsWith("image/")?"message_image":"message_file"}function Le(R){return(R||"").replace(/[|[\]\r\n]/g,"_").trim()||"\u6587\u4EF6"}function Be(R){if(!Number.isFinite(R)||R<=0)return"0 B";const e=["B","KB","MB","GB"],t=Math.min(e.length-1,Math.floor(Math.log(R)/Math.log(1024)));return`${Number.parseFloat((R/1024**t).toFixed(2))} ${e[t]}`}function je(R){return`[\u6587\u4EF6: ${Le(R.name)} | ${R.url} | ${R.mediaType||"application/octet-stream"} | ${Be(R.size)}]`}function xe(R){return C.existsSync(f.join(R,"packages","cli","dist","index.mjs"))||C.existsSync(f.join(R,"packages","cli","src","index.ts"))}function We(R){const e=[],t=String(process.env.AWS_OPEN_PENCIL_HOME||"").trim();t&&e.push(f.resolve(t));const r=f.resolve(R);e.push(f.join(r,"open-pencil")),e.push(f.resolve(ie(new URL("../../../../open-pencil",import.meta.url))));for(let i=f.dirname(r);e.push(f.join(i,"open-pencil")),f.dirname(i)!==i;i=f.dirname(i));return{home:e.find(xe)??e[0],searched:e}}class b{server;agentClient;messageBuffer;memoryStore;roleMemoryStore;sessionContextMemoryStore;initialRoleName="";hasRoleName=!1;contextManager;isSubAgent;fileChangeNotifyHistory=new Map;featuresCache=null;static FEATURES_CACHE_TTL_MS=5e3;leaseRenewalTimer=null;activeLeaseUris=new Set;static LEASE_DURATION_MINUTES=10;static LEASE_RENEW_INTERVAL_MS=6e4;profileSynced=!1;urgentMeetingHydrateRequested=!1;urgentTaskHydrateRequested=!1;taskHydrateRetryBudget=0;static MEETING_HYDRATE_RETRY_COUNT=3;static MEETING_HYDRATE_RETRY_DELAY_MS=150;static MEETING_HYDRATE_TIMEOUT_REARM_DELAY_MS=1e4;meetingHydrateTimeoutRearmDelayMs=b.MEETING_HYDRATE_TIMEOUT_REARM_DELAY_MS;static MEETING_HYDRATE_POLL_TIMEOUT_MS=65e3;static MEETING_PREEMPTIVE_JOIN_WAIT_MS=45e3;static TASK_HYDRATE_RETRY_BUDGET=1;pendingPollMessage=null;syncRoleMemoryStore(e){if(c.info(`[McpServer] syncRoleMemoryStore \u88AB\u8C03\u7528: displayName=${e.displayName}, roleName="${e.roleName??"(\u7A7A)"}", id=${e.id}`),!e.roleName){c.warn(`[McpServer] syncRoleMemoryStore: profile.roleName \u4E3A\u7A7A\uFF0ChasRoleName \u4FDD\u6301 false\u3002profile=${JSON.stringify({id:e.id,displayName:e.displayName,roleName:e.roleName,instanceName:e.instanceName})}`);return}const t=b.sanitizeRoleDirectoryName(e.roleName);this.hasRoleName=!0,t!==this.initialRoleName&&(c.info(`[McpServer] \u89D2\u8272\u76EE\u5F55\u4E0E\u521D\u59CB\u503C\u4E0D\u4E00\u81F4\uFF0C\u91CD\u5EFA roleMemoryStore: "${this.initialRoleName}" -> "${t}"`),this.roleMemoryStore=new U(b.buildRoleMemoryStorePath(t)),this.initialRoleName=t)}maybeSyncPermanentMemoryToServer(){this.doMaybeSyncPermanentMemoryToServer().catch(e=>{c.warn("[McpServer] maybeSyncPermanentMemoryToServer \u5F02\u5E38: %s, stack=%s",e instanceof Error?e.message:String(e),e instanceof Error?e.stack:"(no stack)")})}async doMaybeSyncPermanentMemoryToServer(){c.info("[McpServer] maybeSyncPermanentMemoryToServer \u5F00\u59CB\uFF0CinitialRoleName="+this.initialRoleName);let e;try{e=await this.memoryStore.getStats()}catch(s){c.warn("[McpServer] \u83B7\u53D6 server \u8BB0\u5FC6\u7EDF\u8BA1\u5931\u8D25\uFF0C\u8DF3\u8FC7\u540C\u6B65:",s instanceof Error?s.message:s);return}const t=e.by_type.project_doc_memory?.count??0;c.info(`[McpServer] server memory \u8BA1\u6570=${t}`);let r=[];try{r=await this.roleMemoryStore.listByType("project_doc_memory"),c.info(`[McpServer] \u89D2\u8272\u5B50\u76EE\u5F55\u8BFB\u53D6\u5230 ${r.length} \u6761\u9879\u76EE\u8BB0\u5FC6`)}catch(s){c.warn("[McpServer] \u8BFB\u53D6\u89D2\u8272\u5B50\u76EE\u5F55\u9879\u76EE\u8BB0\u5FC6\u5931\u8D25:",s instanceof Error?s.message:s)}if(r.length===0){const s=f.dirname(b.buildRoleMemoryStorePath(this.initialRoleName));c.info(`[McpServer] \u5C1D\u8BD5\u4ECE\u9057\u7559\u76EE\u5F55\u8BFB\u53D6: ${s}`);try{const a=await new U(s).listByType("project_doc_memory");a.length>0&&(c.info(`[McpServer] \u4ECE\u9057\u7559\u76EE\u5F55\u8BFB\u53D6\u5230 ${a.length} \u6761\u9879\u76EE\u8BB0\u5FC6`),r=a)}catch(o){c.warn("[McpServer] \u8BFB\u53D6\u9057\u7559\u76EE\u5F55\u9879\u76EE\u8BB0\u5FC6\u5931\u8D25:",o instanceof Error?o.message:o)}}if(r.length===0){c.info("[McpServer] \u672C\u5730\u4E5F\u65E0\u9879\u76EE\u8BB0\u5FC6\uFF0C\u8DF3\u8FC7\u540C\u6B65");return}if(t>=r.length){c.info(`[McpServer] \u670D\u52A1\u7AEF\u5DF2\u6709 ${t} \u6761 >= \u672C\u5730 ${r.length} \u6761\uFF0C\u65E0\u9700\u56DE\u586B`);return}c.info(`[McpServer] \u68C0\u6D4B\u5230\u7F3A\u91CF\uFF1A\u672C\u5730 ${r.length} \u6761 > \u670D\u52A1\u7AEF ${t} \u6761\uFF0C\u5F00\u59CB\u589E\u91CF\u56DE\u586B`);let n=0,i=0;for(const s of r)try{await this.memoryStore.createMemory({memory_type:"project_doc_memory",uri:s.uri,title:s.title,content:s.content,keywords:s.keywords,bound_files:s.bound_files,file_md5_map:s.file_md5_map,last_check_time:s.last_check_time}),n++,c.info(`[McpServer] \u540C\u6B65\u9879\u76EE\u8BB0\u5FC6\u6210\u529F: ${s.uri}`)}catch(o){const a=o instanceof Error?o.message:String(o);a.includes("already exists")||a.includes("Memory already exists")||c.warn(`[McpServer] \u540C\u6B65\u9879\u76EE\u8BB0\u5FC6\u5931\u8D25 (${s.uri}): ${a}`),i++}c.info(`[McpServer] \u9879\u76EE\u8BB0\u5FC6\u540C\u6B65\u5B8C\u6210: \u6210\u529F ${n}, \u8DF3\u8FC7 ${i}, \u5171 ${r.length}`),await this.reportMemoryStatsToServer()}normalizeBoundFilePath(e){const t=String(e||"").trim().replace(/\\/g,"/");if(!t)return t;const r=t.startsWith("@/")?t.substring(1):t;return r.startsWith("./")?r:`./${r.replace(/^\/+/,"")}`}normalizeBoundFiles(e){return!e||!Array.isArray(e)?e:e.map(t=>this.normalizeBoundFilePath(String(t)))}async validateBoundFilesExist(e){if(!e||e.length===0)return;const t=process.env.AWS_WORKSPACE_PATH||process.cwd(),{access:r}=await import("node:fs/promises"),n=[];for(const i of e)try{const s=f.resolve(t,i);await r(s)}catch{n.push(i)}if(n.length>0)throw new Error(`\u7ED1\u5B9A\u7684\u6587\u4EF6\u4E0D\u5B58\u5728\uFF0C\u8BF7\u786E\u8BA4\u6587\u4EF6\u8DEF\u5F84\u6B63\u786E\u540E\u518D\u91CD\u65B0\u63D0\u4EA4:
2
2
  ${n.map(i=>` - ${i}`).join(`
3
- `)}`)}toMemoryWriteResult(e){return{id:e.id,uri:e.uri,domain:e.domain,path:e.path,title:e.title,memory_type:e.memory_type,createdAt:e.createdAt,updatedAt:e.updatedAt,version:e.version,keywords:e.keywords,bound_files:e.bound_files}}toMemoryRecordWithMetadata(e){return{id:e.id,uri:e.uri,domain:e.domain,path:e.path,title:e.title,content:e.content,memory_type:e.memory_type,createdAt:e.createdAt,updatedAt:e.updatedAt,version:e.version,keywords:e.keywords,bound_files:e.bound_files,file_md5_map:e.file_md5_map,memory_status:e.memory_status,updating_agent_id:e.updating_agent_id,last_check_time:e.last_check_time,path_prefix:e.path_prefix,readonly:e.readonly,source_agent_id:e.source_agent_id,source_display_name:e.source_display_name,source_role_name:e.source_role_name,source_workspace_path:e.source_workspace_path}}constructor(){this.agentClient=new ce,this.messageBuffer=new Se,this.initialRoleName=b.resolveRoleMemoryDirectoryName(),this.hasRoleName=!!process.env.AWS_ROLE_NAME;const e=b.resolveMemoryStorePaths();this.memoryStore=new ke(this.agentClient),this.roleMemoryStore=new U(e.rolePath),this.sessionContextMemoryStore=new U(f.join(f.dirname(e.rolePath),"..","session_context")),this.isSubAgent=process.env.AWS_SUB_AGENT==="true",this.contextManager=new Me(this.sessionContextMemoryStore),this.server=new ne({name:ue,version:fe},{capabilities:{tools:{}},instructions:_e()}),this.setupHandlers()}async resolveGroupConfigState(e){if(!e.featureKey)return"expanded";const t=b.GROUP_ENV_KEYS[e.key],{features:r,ok:n}=await this.fetchRuntimeFeaturesWithStatus();if(n&&Object.keys(r).length>0){const s=b.parentGateOf(e.featureKey);return s&&J(r[s])==="disabled"?"disabled":J(r[e.featureKey])??e.defaultState}if(!t)return e.defaultState;const i=process.env[t];return i==="collapsed"?"collapsed":i==="1"||i==="expanded"?"expanded":i===void 0||i===""?e.defaultState:"disabled"}async isToolGroupEnabled(e){return await this.resolveGroupConfigState(e)!=="disabled"}static GROUP_ENV_KEYS={launch:"AWS_LAUNCH_CONFIG_TOOLS",hire:"AWS_HIRE_TOOLS",pencil:"AWS_PENCIL_TOOLS",draw:"AWS_DRAW_TOOLS",office:"AWS_OFFICE_TOOLS",task:"AWS_COLLABORATION_TASK_TOOLS",meeting:"AWS_COLLABORATION_MEETING_TOOLS",debug:"AWS_COLLABORATION_DEBUG_TOOLS",fileHistory:"AWS_COLLABORATION_FILE_HISTORY_TOOLS",abilityMarket:"AWS_ABILITY_MARKET_TOOLS",abilityDev:"AWS_ABILITY_DEV_TOOLS"};static PARENT_GATE_PREFIXES=[["agentSys","agentSys."],["collaboration","collaboration."]];static parentGateOf(e){if(e){for(const[t,r]of b.PARENT_GATE_PREFIXES)if(e.startsWith(r))return t}}async filterDisabledGroups(){let e=H;for(const t of ye)await this.resolveGroupConfigState(t)==="disabled"&&(e=e.filter(n=>!t.toolNames.has(n.name)));return e}setupHandlers(){this.server.setRequestHandler(ae,async()=>this.isSubAgent?{tools:H.filter(e=>Y.has(e.name))}:{tools:await this.filterDisabledGroups()}),this.server.setRequestHandler(oe,async(e,t)=>{const{name:r,arguments:n}=e.params;try{const i=await this.handleToolCall(r,n,t?.signal);return{content:this.buildToolResultContent(i)}}catch(i){const s=i instanceof Error?i.message:String(i),o=i instanceof Re?{error:s,...i.details}:i instanceof de&&(i.errorCode||i.field)?{error:s,...i.errorCode?{errorCode:i.errorCode}:{},...i.field?{field:i.field}:{}}:{error:s};return c.error("[McpServer] \u5DE5\u5177\u8C03\u7528\u5F02\u5E38: tool=%s, error=%s, stack=%s",r,s,i instanceof Error?i.stack:"(no stack)"),{content:[{type:"text",text:JSON.stringify(o,null,2)}],isError:!0}}})}async handlePencilExportImage(e){const t=typeof e.savePath=="string"?e.savePath.trim():"",r=await this.agentClient.callAgentScopedTool("pencil_export_image",e),n=typeof r?.image=="string"?r.image:"";if(!n)return r;const i=n.startsWith("data:")?n.slice(n.indexOf(",")+1):n,s={...r};delete s.image,delete s.mimeType,s.sizeKb=Math.ceil(i.length*3/4/1024);try{const{mkdir:o,writeFile:a}=await import("node:fs/promises");let l;if(t){const m=f.resolve(process.env.AWS_WORKSPACE_PATH||process.cwd());l=f.resolve(m,t)}else{const p=(typeof r?.docId=="string"?r.docId:"").replace(/[^a-zA-Z0-9_-]/g,"").slice(0,40)||"doc",u=f.join(W.tmpdir(),"pencil-export");await o(u,{recursive:!0}),l=f.join(u,`${p}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.png`)}return await o(f.dirname(l),{recursive:!0}),await a(l,Buffer.from(i,"base64")),{...s,savedTo:l,temp:!t}}catch(o){return{...s,savedTo:null,saveError:o instanceof Error?o.message:String(o)}}}static PENCIL_EXPORT_FORMATS=new Set(["svg","html","png","jpg","webp","pptx","fig","jsx"]);async handlePencilExportDocument(e){const t=typeof e.format=="string"&&e.format.trim()?e.format.trim().toLowerCase():"svg";if(!b.PENCIL_EXPORT_FORMATS.has(t))throw new Error(`\u4E0D\u652F\u6301\u7684\u5BFC\u51FA\u683C\u5F0F: ${t}\uFF08\u652F\u6301 svg/html/png/jpg/webp/pptx/fig/jsx\uFF1Bpdf \u6682\u4E0D\u652F\u6301\uFF09`);const r=typeof e.nodeId=="string"&&e.nodeId.trim()?e.nodeId.trim():"";if(t==="jsx"&&!r)throw new Error("jsx \u5BFC\u51FA\u9700\u8981\u4F20 nodeId\uFF08\u6765\u81EA pencil_get_tree\uFF09\uFF0C\u5B83\u6309\u5355\u8282\u70B9\u751F\u6210 React \u7EC4\u4EF6");const n=typeof e.savePath=="string"?e.savePath.trim():"",i=f.resolve(process.env.AWS_WORKSPACE_PATH||process.cwd()),s=await this.agentClient.callAgentScopedTool("pencil_export_document",e),o=typeof s?.snapshotJson=="string"?s.snapshotJson:"";if(!o)return s;const{mkdir:a,writeFile:l,stat:m}=await import("node:fs/promises"),u=(typeof s?.docId=="string"?s.docId:"").replace(/[^a-zA-Z0-9_-]/g,"").slice(0,40)||"doc",_=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,v=f.join(W.tmpdir(),"pencil-export");await a(v,{recursive:!0});const M=f.join(v,`${u}-${_}.snapshot.json`);await l(M,o,"utf8");const h=t,d=n?f.resolve(i,n):f.join(v,`${u}-${_}.${h}`),{home:g,searched:E}=We(i),y=[{cmd:process.execPath,entry:f.join(g,"packages","cli","dist","index.mjs"),cwd:g},{cmd:"bun",entry:f.join(g,"packages","cli","src","index.ts"),cwd:g}].filter(I=>C.existsSync(I.entry));if(y.length===0)throw new Error(`\u672A\u627E\u5230 open-pencil CLI\uFF08\u5DF2\u67E5\u627E\u76EE\u5F55\uFF1A${E.join("\uFF1B")}\uFF09\uFF0C\u8BF7\u786E\u8BA4\u5B89\u88C5\u5E03\u5C40\u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF AWS_OPEN_PENCIL_HOME \u6307\u5411 open-pencil \u4ED3\u5E93\u6839\u76EE\u5F55`);const S=["export",M,"--snapshot","-f",t,"-o",d];r&&S.push("--node",r),t==="html"&&S.push("--html","standalone"),(t==="png"||t==="jpg"||t==="webp")&&(typeof e.scale=="number"&&e.scale>0&&S.push("--scale",String(e.scale)),typeof e.quality=="number"&&e.quality>0&&S.push("--quality",String(e.quality)));const P=[];let w=!1;for(const I of y)try{await this.runPencilCli(I.cmd,[I.entry,...S],I.cwd),w=!0;break}catch($){P.push(`${f.basename(I.cmd)}: ${$ instanceof Error?$.message:String($)}`)}if(!w)throw new Error(`\u753B\u5E03\u5BFC\u51FA\u5931\u8D25\uFF08format=${t}\uFF09\uFF1A${P.join("\uFF1B")||"\u672A\u77E5\u9519\u8BEF"}`);let A=null;try{A=Math.ceil((await m(d)).size/1024)}catch{A=null}const T={...s};return delete T.snapshotJson,{...T,format:t,savedTo:d,temp:!n,sizeKb:A}}runPencilCli(e,t,r){return new Promise((n,i)=>{re(e,t,{cwd:r,timeout:18e4,maxBuffer:16*1024*1024},(s,o,a)=>{if(s){const l=String(a||o||"").trim().split(/\r?\n/).filter(Boolean).slice(-3).join(" | ");i(new Error(l||s.message));return}n(String(o||""))})})}static DRAW_EXPORT_FORMATS=new Set(["xml","drawio"]);async handleDrawExportDocument(e){const t=typeof e.format=="string"&&e.format.trim()?e.format.trim().toLowerCase():"xml";if(t==="svg"||t==="png"||t==="jpg"||t==="webp")throw new Error(`${t} \u5BFC\u51FA\u9700\u8981\u7ED8\u56FE\u6E32\u67D3\u7BA1\u7EBF\uFF08\u9636\u6BB5 2\uFF09\uFF1B\u672C\u8F6E\u8BF7\u7528 format=xml \u5BFC\u51FA draw.io <mxfile> \u539F\u6587\uFF0C\u6216\u7528\u6587\u4EF6\u8BFB\u53D6\u5DE5\u5177\u67E5\u770B XML/\u5728\u652F\u6301 draw.io \u7684\u7F16\u8F91\u5668\u4E2D\u6253\u5F00`);if(!b.DRAW_EXPORT_FORMATS.has(t))throw new Error(`\u4E0D\u652F\u6301\u7684\u5BFC\u51FA\u683C\u5F0F: ${t}\uFF08\u672C\u8F6E\u652F\u6301 xml/drawio\uFF09`);const r=typeof e.savePath=="string"?e.savePath.trim():"",n=f.resolve(process.env.AWS_WORKSPACE_PATH||process.cwd()),i=await this.agentClient.callAgentScopedTool("draw_export_document",e),s=typeof i?.docXml=="string"?i.docXml:"";if(!s)return i;const{mkdir:o,writeFile:a,stat:l}=await import("node:fs/promises"),p=(typeof i?.docId=="string"?i.docId:"").replace(/[^a-zA-Z0-9_-]/g,"").slice(0,40)||"doc",u=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,_=f.join(W.tmpdir(),"draw-export");await o(_,{recursive:!0});const v=t,M=r?f.resolve(n,r):f.join(_,`${p}-${u}.${v}`);await o(f.dirname(M),{recursive:!0}),await a(M,s,"utf8");let h=null;try{h=Math.ceil((await l(M)).size/1024)}catch{h=null}const d={...i};return delete d.docXml,{...d,format:t,savedTo:M,temp:!r,sizeKb:h}}async handleDrawExportImage(e){const t=await this.agentClient.callAgentScopedTool("draw_export_image",e),r=typeof t?.image=="string"?t.image:"";if(!r)return t;const n=r.startsWith("data:")?r.slice(r.indexOf(",")+1):r,i=typeof e.savePath=="string"?e.savePath.trim():"",s={...t};delete s.image,delete s.mimeType,s.sizeKb=Math.ceil(n.length*3/4/1024);try{const{mkdir:o,writeFile:a}=await import("node:fs/promises");let l;if(i){const m=f.resolve(process.env.AWS_WORKSPACE_PATH||process.cwd());l=f.resolve(m,i)}else{const p=(typeof t?.docId=="string"?t.docId:"").replace(/[^a-zA-Z0-9_-]/g,"").slice(0,40)||"doc",u=f.join(W.tmpdir(),"draw-export");await o(u,{recursive:!0}),l=f.join(u,`${p}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.png`)}return await o(f.dirname(l),{recursive:!0}),await a(l,Buffer.from(n,"base64")),{...s,savedTo:l,temp:!i}}catch(o){return{...s,savedTo:null,saveError:o instanceof Error?o.message:String(o)}}}async handleOfficeTool(e,t){switch(e){case"office_create":return await this.officeCreate(t);case"office_view":return await this.officeView(t);case"office_edit":return await this.officeEdit(t);case"office_validate":case"office_preview":return await this.officeFileForward(e,t);case"office_format":return await this.officeFormat(t);case"office_apply_profile":return await this.officeApplyProfile(t);case"office_generate_from_template":return await this.officeGenerateFromTemplate(t);case"office_open_document":return await this.officeOpenDocument(t);case"office_close_document":return await this.officeCloseDocument(t);case"office_list_open":return await this.officeListOpen(t);case"office_list_documents":return await this.officeListDocuments(t);case"office_delete_document":return await this.officeDeleteDocument(t);case"office_share_document":return await this.officeShareDocument(t);case"office_unshare_document":return await this.officeUnshareDocument(t);case"office_get_changes":return await this.officeGetChanges(t);default:throw new Error(`\u672A\u77E5\u7684 office \u5DE5\u5177: ${e}`)}}officeFileArg(e){const t=typeof e.file=="string"?e.file.trim():"";if(!t)throw new Error("file \u4E0D\u80FD\u4E3A\u7A7A");return t}backupReceipt(e){return e?{backupPath:e,backupHint:`\u5DF2\u81EA\u52A8\u5907\u4EFD\u539F\u6587\u4EF6\u5230 ${e}\uFF08\u4FDD\u7559\u6700\u8FD1\u82E5\u5E72\u4EFD\uFF09\uFF0C\u5982\u9700\u56DE\u6EDA\u53EF\u76F4\u63A5\u590D\u5236\u8986\u76D6`}:{}}async officeCreate(e){const t=this.officeFileArg(e),r=await this.agentClient.callAgentScopedTool("office_create",{fileName:f.basename(O(t)),locale:typeof e.locale=="string"&&e.locale.trim()?e.locale.trim():void 0,template:typeof e.template=="string"&&e.template.trim()?e.template.trim():void 0});if(r?.ok===!1||typeof r?.fileBase64!="string")return r;const n=j(t,String(r.fileBase64));return{ok:!0,file:t,kind:F(O(t))??void 0,savedTo:n.absolutePath,sizeKb:n.sizeKb,docId:typeof r.docId=="string"?r.docId:void 0,source:typeof r.source=="string"?r.source:void 0,fileUrl:typeof r.fileUrl=="string"?r.fileUrl:void 0,message:typeof r.message=="string"?r.message:`\u5DF2\u521B\u5EFA\u7A7A\u767D\u6587\u6863: ${t}`,hint:"\u6587\u6863\u5DF2\u540C\u6B65\u5230\u4E91\u6587\u6863\uFF08\u53EF\u5728 Dashboard \u9762\u677F\u67E5\u770B\u4E0E\u534F\u4F5C\uFF09\u3002\u7528 office_view \u4E86\u89E3\u7ED3\u6784\u540E\u5373\u53EF office_edit \u5199\u5165\u5185\u5BB9"}}async officeView(e){const t=D(this.officeFileArg(e)),r={fileName:t.fileName,fileBase64:t.fileBase64,mode:typeof e.mode=="string"&&e.mode.trim()?e.mode.trim():"text",start:typeof e.start=="number"?e.start:void 0,maxLines:typeof e.maxLines=="number"?e.maxLines:void 0,limit:typeof e.limit=="number"?e.limit:void 0,query:typeof e.query=="string"&&e.query.trim()?e.query.trim():void 0};return Array.isArray(e.paths)&&e.paths.length>0&&(r.paths=e.paths),await this.agentClient.callAgentScopedTool("office_view",r)}async officeEdit(e){const t=this.officeFileArg(e);if(!Array.isArray(e.commands)||e.commands.length===0)throw new Error("commands \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4");await be(e.commands,process.env.AWS_WORKSPACE_PATH||process.cwd()),Ae(e.commands);const r=D(t),n=typeof e.docId=="string"&&e.docId.trim()?e.docId.trim():void 0,i=await this.agentClient.callAgentScopedTool("office_edit",{fileName:r.fileName,fileBase64:r.fileBase64,commands:e.commands,bestEffort:e.bestEffort===!0,docId:n});if(i?.ok===!1)return i;const s={};typeof i?.docId=="string"&&(s.docId=i.docId),typeof i?.version=="number"&&(s.version=i.version),typeof i?.fileUrl=="string"&&(s.fileUrl=i.fileUrl);const o=Array.isArray(i?.warnings)&&i.warnings.length>0?{warnings:i.warnings}:{};if(typeof i?.fileBase64=="string"){const a=j(t,String(i.fileBase64));return{ok:!0,file:t,kind:F(O(t))??void 0,results:Array.isArray(i.results)?i.results:[],changed:!0,savedTo:a.absolutePath,sizeKb:a.sizeKb,...this.backupReceipt(a.backupPath),...o,...s}}return{ok:!0,results:Array.isArray(i?.results)?i.results:[],changed:!1,...o,...s}}async officeFormat(e){const t=this.officeFileArg(e),r=typeof e.action=="string"?e.action.trim():"",n=r==="dryRun"||r==="dryrun";if(!["check","fix","dryRun"].includes(r))throw new Error('action \u5FC5\u987B\u662F "check"\u3001"fix" \u6216 "dryRun"');const i={action:r,annotate:e.annotate===!0};if(typeof e.preset=="string"&&e.preset.trim()&&(i.preset=e.preset.trim()),e.rules&&typeof e.rules=="object"&&(i.rules=e.rules),typeof e.rulesFile=="string"&&e.rulesFile.trim()&&(i.rules=await this.readOfficeRulesFile(e.rulesFile.trim())),e.mergePreset===!0&&(i.mergePreset=!0),Array.isArray(e.exclude)&&e.exclude.length>0&&(i.exclude=e.exclude),!i.preset&&!i.rules)throw new Error("\u9700\u8981 preset\u3001rulesFile \u6216 rules \u4E4B\u4E00\u63D0\u4F9B\u683C\u5F0F\u89C4\u5219");const a=(typeof e.outputFile=="string"&&e.outputFile.trim()?e.outputFile.trim():"")||(i.annotate===!0&&r==="check"?this.deriveSiblingFileName(t,"-\u6807\u6CE8\u7248"):t),l=D(t),m=await this.agentClient.callAgentScopedTool("office_format",{fileName:l.fileName,fileBase64:l.fileBase64,...i});if(m?.ok===!1)return m;if(typeof m?.fileBase64=="string"&&!n&&(r==="fix"||i.annotate===!0)){const p=a!==t,u=p?ve(t,f.basename(a),String(m.fileBase64)):j(t,String(m.fileBase64)),{fileBase64:_,...v}=m;return{...v,file:t,...p?{outputFile:a,originalPreserved:!0}:{},kind:F(O(a))??void 0,savedTo:u.absolutePath,sizeKb:u.sizeKb,...this.backupReceipt(u.backupPath)}}if(typeof m?.fileBase64=="string"){const{fileBase64:p,...u}=m;return u}return m}deriveSiblingFileName(e,t){const r=O(e),n=f.extname(r),s=`${f.basename(r,n)}${t}${n}`;return f.isAbsolute(e)?f.join(f.dirname(r),s):s}async officeApplyProfile(e){const t=this.officeFileArg(e);if(typeof e.profile!="object"||e.profile===null)throw new Error("profile \u5FC5\u987B\u662F\u975E\u7A7A\u5BF9\u8C61");const r=D(t),n=await this.agentClient.callAgentScopedTool("office_apply_profile",{fileName:r.fileName,fileBase64:r.fileBase64,profile:e.profile});if(n?.ok===!1)return n;if(typeof n?.fileBase64=="string"&&n?.changed===!0){const i=j(t,String(n.fileBase64)),{fileBase64:s,...o}=n;return{...o,file:t,kind:F(O(t))??void 0,savedTo:i.absolutePath,sizeKb:i.sizeKb,...this.backupReceipt(i.backupPath)}}return{ok:!0,changed:!1,file:t,message:"\u6587\u6863\u683C\u5F0F\u5DF2\u4E0E Profile \u4E00\u81F4\uFF0C\u65E0\u9700\u4FEE\u6539"}}async officeGenerateFromTemplate(e){const t=this.officeFileArg(e),r=D(t);let n=e.content;Array.isArray(n)&&n.length>0&&(n=await Promise.all(n.map(async a=>{if(typeof a=="object"&&a!==null&&a.type==="image"){const l={...a};if(typeof l.source=="string"){const m=await Te(l.source,process.env.AWS_WORKSPACE_PATH||process.cwd());l.imageBase64=m.base64,l.imageName=m.name,delete l.source}}return a})));const i={fileName:r.fileName,fileBase64:r.fileBase64};e.variables&&typeof e.variables=="object"&&(i.variables=e.variables),Array.isArray(n)&&n.length>0&&(i.content=n),e.profile&&typeof e.profile=="object"&&(i.profile=e.profile);const s=typeof e.outputFile=="string"&&e.outputFile.trim()?e.outputFile.trim():t;s!==t&&(i.outputFileName=f.basename(O(s)),i.skipCloudSync=!0);const o=await this.agentClient.callAgentScopedTool("office_generate_from_template",i);if(o?.ok===!1)return o;if(typeof o?.fileBase64=="string"){const a=j(s,String(o.fileBase64)),{fileBase64:l,...m}=o;return{...m,file:s,template:s===t?void 0:t,kind:F(O(s))??void 0,savedTo:a.absolutePath,sizeKb:a.sizeKb,...this.backupReceipt(a.backupPath)}}return{ok:!0,changed:!1,file:t,message:"\u6A21\u677F\u672A\u53D1\u73B0\u5360\u4F4D\u7B26\u6216\u5185\u5BB9\u6E05\u5355\u4E3A\u7A7A"}}async readOfficeRulesFile(e){const t=await import("node:fs"),r=await import("node:path"),n=process.env.AWS_WORKSPACE_PATH||process.cwd(),i=r.resolve(n,e);if(!t.existsSync(i)||!t.statSync(i).isFile())throw new Error(`\u89C4\u5219\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}\uFF08\u89E3\u6790\u4E3A ${i}\uFF09`);const s=t.readFileSync(i,"utf8"),o=r.extname(i).toLowerCase();try{if(o===".json")return JSON.parse(s);const l=(await import("yaml")).parse(s);if(!l||typeof l!="object"||Array.isArray(l))throw new Error("\u89C4\u5219\u6587\u4EF6\u5185\u5BB9\u5FC5\u987B\u662F\u5BF9\u8C61\uFF08\u542B rules[]/page/roles\uFF09");return l}catch(a){throw new Error(`\u89C4\u5219\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${e}\uFF08${a instanceof Error?a.message:String(a)}\uFF09`)}}async officeFileForward(e,t){const r=D(this.officeFileArg(t));return await this.agentClient.callAgentScopedTool(e,{fileName:r.fileName,fileBase64:r.fileBase64})}officeOpenFiles=[];async officeOpenDocument(e){const t=this.officeFileArg(e),r=O(t);if(!C.existsSync(r))return{ok:!1,error:`\u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`};const n=C.statSync(r);if(!n.isFile())return{ok:!1,error:`\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6: ${t}`};const i=F(r);if(!i)return{ok:!1,error:`\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B: ${t}\uFF08\u4EC5\u652F\u6301 .docx/.docm\u3001.xlsx/.xlsm\u3001.pptx/.pptm\uFF09`};const s=Math.ceil(n.size/1024);let o;try{o=D(t)}catch(m){return{ok:!1,error:m instanceof Error?m.message:String(m)}}const a=await this.agentClient.callAgentScopedTool("office_open_document",{fileName:o.fileName,fileBase64:o.fileBase64,workspacePath:z(),sourcePath:t});if(!a||a.ok===!1)return a??{ok:!1,error:"\u4E0A\u884C\u4E3A\u4E91\u6587\u6863\u5931\u8D25\uFF08\u670D\u52A1\u7AEF\u672A\u8FD4\u56DE\u7ED3\u679C\uFF09"};const l=this.officeOpenFiles.findIndex(m=>m.file===r);return l>=0?this.officeOpenFiles[l]={file:r,kind:i,sizeKb:s}:this.officeOpenFiles.push({file:r,kind:i,sizeKb:s}),{ok:!0,docId:typeof a.docId=="string"?a.docId:void 0,file:r,kind:i,sizeKb:s,workspacePath:z(),source:typeof a.source=="string"?a.source:"local",fileUrl:typeof a.fileUrl=="string"?a.fileUrl:void 0,version:typeof a.version=="number"?a.version:void 0,message:"\u5DF2\u4E0A\u4F20\u5E76\u6253\u5F00\u4E3A\u4E91\u6587\u6863\u3002\u5982\u9700\u8986\u76D6\u672C\u5730\u6587\u4EF6\uFF0C\u8BF7\u7F16\u8F91\u597D\u540E\u5BFC\u51FA\u8986\u76D6\u3002"}}async officeCloseDocument(e){return{ok:!0,closed:!0,message:"\u5DF2\u5173\u95ED Office \u6587\u6863\u9884\u89C8\u9762\u677F"}}async officeListOpen(e){return{ok:!0,files:this.officeOpenFiles,count:this.officeOpenFiles.length}}async officeListDocuments(e){const t=await this.agentClient.callAgentScopedTool("office_list_documents",{});return t&&t.ok!==!1&&typeof t.count!="number"&&Array.isArray(t.documents)?{...t,count:t.documents.length}:t}async officeDeleteDocument(e){const t=this.officeRequiredDocId(e);return await this.agentClient.callAgentScopedTool("office_delete_document",{docId:t})}async officeShareDocument(e){const t=this.officeRequiredDocId(e);if(!Array.isArray(e.members)||e.members.length===0)throw new Error("members \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4\uFF08\u6BCF\u9879 {agentId, permission?: read|write}\uFF09");const r=typeof e.name=="string"&&e.name.trim()?e.name.trim():void 0;return await this.agentClient.callAgentScopedTool("office_share_document",{docId:t,members:e.members,name:r})}async officeUnshareDocument(e){const t=this.officeRequiredDocId(e),r=Array.isArray(e.agentIds)?e.agentIds:void 0;return await this.agentClient.callAgentScopedTool("office_unshare_document",{docId:t,agentIds:r})}async officeGetChanges(e){const t=this.officeRequiredDocId(e),r=typeof e.sinceVersion=="number"?e.sinceVersion:void 0;return await this.agentClient.callAgentScopedTool("office_get_changes",{docId:t,sinceVersion:r})}officeRequiredDocId(e){const t=typeof e.docId=="string"?e.docId.trim():"";if(!t)throw new Error("docId \u4E0D\u80FD\u4E3A\u7A7A");return t}async buildOfficeCardPayload(e){const t=typeof e.filePath=="string"?e.filePath.trim():"",r=typeof e.docId=="string"?e.docId.trim():"";if(t&&r)throw new Error(`office \u5361\u7247 filePath \u4E0E docId \u53EA\u80FD\u4E8C\u9009\u4E00\uFF08filePath=${t}, docId=${r}\uFF09`);if(!t&&!r)throw(typeof e.fileUrl=="string"?e.fileUrl.trim():"")?new Error("office \u5361\u7247\u4E0D\u63A5\u53D7\u76F4\u63A5\u4F20 fileUrl\uFF0C\u8BF7\u4F20 filePath\uFF08\u5DE5\u4F5C\u533A\u6587\u4EF6\u8DEF\u5F84\uFF09\u6216 docId\uFF08\u4E91\u6587\u6863 id\uFF09\u4E4B\u4E00"):new Error("office \u5361\u7247\u5FC5\u987B\u63D0\u4F9B filePath\uFF08\u5DE5\u4F5C\u533A\u6587\u4EF6\u8DEF\u5F84\uFF09\u6216 docId\uFF08\u4E91\u6587\u6863 id\uFF09\u4E4B\u4E00");if(r){const m={type:"office",docId:r};return typeof e.title=="string"&&e.title.trim()&&(m.title=e.title.trim()),typeof e.description=="string"&&e.description.trim()&&(m.description=e.description.trim()),m}const n=D(t),i=F(n.absolutePath);if(!i)throw new Error(`office \u5361\u7247\u4EC5\u652F\u6301 docx/xlsx/pptx \u6587\u6863\uFF08\u542B .docm/.xlsm/.pptm\uFF09: ${t}`);const o=(await this.uploadAttachmentFiles([n.absolutePath]))[0],a=o.name,l={type:"office",name:a,kind:i,fileUrl:o.url,sizeKb:Math.ceil(o.size/1024),title:typeof e.title=="string"&&e.title.trim()?e.title.trim():a,filePath:t,workspacePath:z()};return typeof e.description=="string"&&e.description.trim()&&(l.description=e.description.trim()),l}async prepareCardForSend(e){if(!e)return e;let t;if(typeof e=="string")try{t=JSON.parse(e)}catch{return e}else if(typeof e=="object")t=e;else return e;return t?.type!=="office"?e:await this.buildOfficeCardPayload(t)}stripRenderImageForReporting(e){if(e&&typeof e=="object"&&!Array.isArray(e)){const t=e;let r=null;if(typeof t.image=="string"){const i=t.image.length,s=Math.ceil(i*3/4/1024);r={...t,image:`<PNG base64 \u5DF2\u7701\u7565\uFF0C\u7EA6 ${s}KB\uFF0C\u6B63\u6587\u89C1 t_pencil_doc.render_image>`}}const n=r??t;if(typeof n.snapshotJson=="string"){const i=Math.ceil(n.snapshotJson.length/1024);r={...n,snapshotJson:`<GraphSnapshot JSON \u5DF2\u7701\u7565\uFF0C\u7EA6 ${i}KB\uFF0C\u6743\u5A01\u6570\u636E\u89C1 t_pencil_doc.snapshot>`}}if(r)return r}return e}buildToolResultContent(e){if(e&&typeof e=="object"&&!Array.isArray(e)){const t=e;if(typeof t.image=="string"&&typeof t.mimeType=="string"){const r={...t};delete r.image;const n=[{type:"image",data:t.image,mimeType:t.mimeType}];return Object.keys(r).length>0&&n.push({type:"text",text:JSON.stringify(r,null,2)}),n}}return[{type:"text",text:JSON.stringify(e,null,2)}]}async handleToolCall(e,t,r){const n=t?._aws_sub_agent===!0,i=t?._aws_silent_poll===!0,s=t?._aws_force_inject===!0,o={...t};delete o._aws_sub_agent,delete o._aws_silent_poll,delete o._aws_force_inject;const a=n?null:this.agentClient.getStatusReporter();a&&!i&&this.safeReportStatus(()=>a.reportToolUse(e,this.sanitizeToolUseArgs(e,o)));try{const l=await this.executeToolCall(e,o,{forceInject:s,signal:r});if(a&&!i){const m=this.stripAutoDelegateForReporting(l);m!==null&&(this.safeReportStatus(()=>a.reportToolResult(this.stripRenderImageForReporting(m))),this.safeReportStatus(()=>a.reportThinking()))}return l}catch(l){throw a&&!i&&this.safeReportStatus(()=>a.reportToolError(l)),l}}async reconcilePanelActionWithAuthority(){const e=this.agentClient.getStatusReporter();if(!e)return!1;if(typeof e.getCurrentStatus=="function"){const r=e.getCurrentStatus();if(r.actionDetail!=null&&r.actionDetail.includes("poll_message"))return!1}let t=null;try{t=await this.agentClient.fetchCurrentAction()}catch(r){return c.warn("[McpServer] \u67E5\u8BE2 bridge \u5F53\u524D\u52A8\u4F5C\u5931\u8D25\uFF08\u8DF3\u8FC7\u9762\u677F\u77EB\u6B63\uFF09: %s",r instanceof Error?r.message:String(r)),!1}return!t?.found||t.hasActiveBlockingToolCall!==!0?!1:(this.safeReportStatus(()=>e.reportToolUse("poll_message",{})),c.info("[McpServer] \u9762\u677F\u72B6\u6001\u4E0E\u6743\u5A01\u72B6\u6001\u4E0D\u4E00\u81F4\uFF08\u6743\u5A01: \u963B\u585E\u578B\u8C03\u7528\u5728\u98DE, \u672C\u5730: %s/%s\uFF09\uFF0C\u5DF2\u8865\u53D1 poll_message \u4E8B\u4EF6\u77EB\u6B63",e.getCurrentStatus?.().status??"(none)",e.getCurrentStatus?.().actionDetail??"(none)"),!0)}safeReportStatus(e){try{e()}catch(t){c.warn("[McpServer] \u72B6\u6001\u4E0A\u62A5\u5931\u8D25\uFF08\u5DF2\u5FFD\u7565\uFF0C\u4E0D\u5F71\u54CD\u5DE5\u5177\u8C03\u7528\uFF09: %s",t instanceof Error?t.message:String(t))}}async executeToolCall(e,t,r={}){if(this.isSubAgent&&!Y.has(e))throw new Error(`Sub-agent is not allowed to call tool: ${e}`);const n=we(e);if(n&&await this.resolveGroupConfigState(n)==="disabled")throw new Error(`${n.label}\u80FD\u529B\u672A\u5F00\u542F\uFF08\u8BF7\u5148\u5728\u80FD\u529B\u914D\u7F6E\u4E2D\u5F00\u542F\u300C${n.label}\u300D\u540E\u518D\u8C03\u7528 ${e}\uFF09`);switch(e){case"get_colleague":return await this.agentClient.discoverColleagues();case"get_group_rooms":return await this.agentClient.discoverGroupRooms();case"get_profile":return await this.agentClient.getProfile();case"hire_colleague":return await this.handleHireColleague(t);case"send_group":return await this.handleSendGroup(t);case"send_private":return await this.handleSendPrivate(t);case"poll_message":return await this.handlePollMessage(r.signal);case"get_message":return this.handleGetMessage(r.forceInject===!0);case"get_dm_history":return await this.handleGetDmHistory(t);case"get_group_history":return await this.handleGetGroupHistory(t);case"create_meeting":case"leave_meeting":case"end_meeting":case"meeting_speak":case"get_meeting_info":case"my_meetings":return await this.agentClient.callAgentScopedTool(e,t);case"pencil_create_document":case"pencil_list_documents":case"pencil_open_document":case"pencil_close_document":case"pencil_get_tree":case"pencil_get_changes":case"pencil_create_nodes":case"pencil_update_nodes":case"pencil_delete_nodes":case"pencil_share_document":case"pencil_revoke_share":case"pencil_delete_document":case"pencil_rename_document":return await this.agentClient.callAgentScopedTool(e,t);case"pencil_export_image":return await this.handlePencilExportImage(t);case"pencil_export_document":return await this.handlePencilExportDocument(t);case"draw_create_document":case"draw_list_documents":case"draw_open_document":case"draw_close_document":case"draw_get_diagram":case"draw_get_changes":case"draw_create_cells":case"draw_update_cells":case"draw_delete_cells":case"draw_share_document":case"draw_revoke_share":case"draw_delete_document":case"draw_rename_document":return await this.agentClient.callAgentScopedTool(e,t);case"draw_export_image":return await this.handleDrawExportImage(t);case"draw_export_document":return await this.handleDrawExportDocument(t);case"office_create":case"office_view":case"office_edit":case"office_validate":case"office_preview":case"office_format":case"office_apply_profile":case"office_generate_from_template":case"office_open_document":case"office_close_document":case"office_list_open":case"office_list_documents":case"office_delete_document":case"office_share_document":case"office_unshare_document":case"office_get_changes":return await this.handleOfficeTool(e,t);case"my_task":return await this.agentClient.getMyTasks();case"create_task_instance_comment":return await this.handleCreateTaskInstanceComment(t);case"submit_task_result":return await this.handleSubmitTaskResult(t);case"start_task_rollback":return await this.handleStartTaskRollback(t);case"finish_task_rollback":return await this.handleFinishTaskRollback(t);case"list_task_node_iterations":return await this.agentClient.listTaskNodeIterations(t);case"create_memory":return await this.handleCreateMemory(t);case"read_memory":return await this.handleReadMemory(t);case"update_memory":return await this.handleUpdateMemory(t);case"delete_memory":return await this.handleDeleteMemory(t);case"search_memory":return await this.handleSearchMemory(t);case"list_memories":return await this.handleListMemories(t);case"get_memory_stats":return await this.handleGetMemoryStats(t);case"list_memories_by_file":return await this.handleListMemoriesByFile(t);case"abandon_memory_update":return await this.handleAbandonMemoryUpdate(t);case"memory_recurrence":return await this.handleMemoryRecurrence(t);case"memory_recurrence_complete":return await this.handleMemoryRecurrenceComplete(t);case"get_debug_log_config":return await this.agentClient.getDebugLogConfig();case"query_debug_logs":return await this.agentClient.queryDebugLogs(t);case"query_file_changes_history":return await this.agentClient.queryFileChangesHistory(t);case"list_colleague_events":return await this.agentClient.listColleagueEvents(t);case"launch_config_list":return await this.agentClient.listLaunchConfigs();case"launch_config_create":return await this.agentClient.createLaunchConfig(t);case"launch_config_update":return await this.agentClient.updateLaunchConfig(t);case"launch_config_delete":return await this.agentClient.deleteLaunchConfig(String(t?.configId??""));case"launch_config_start":return await this.agentClient.startLaunchConfig(t);case"launch_config_restart":return await this.agentClient.restartLaunchConfig(t);case"launch_config_stop":return await this.agentClient.stopLaunchConfig(String(t?.configId??""));case"launch_config_logs":return await this.agentClient.getLaunchLogs(t);case"launch_config_status":return await this.agentClient.listLaunchRuns();case"list_ability_market":return await this.agentClient.listAbilityMarket(t);case"install_ability_market_item":return await this.agentClient.installAbilityMarketItem(t);case"uninstall_ability_market_item":return await this.agentClient.uninstallAbilityMarketItem(t);case"ability_dev_ide":return await this.agentClient.abilityDevIde(t);case"formal_ability":return await this.agentClient.formalAbility(t);case"list_my_abilities":return await this.agentClient.listMyAbilities(t);case"list_project_members":return await this.agentClient.listProjectMembers();case"send_email":return await this.agentClient.sendEmail(t);case"list_emails":return await this.agentClient.listEmails(t);case"read_email":return await this.agentClient.readEmail(String(t?.mailId??""));case"reply_email":return await this.agentClient.replyEmail(t);case"ack_email":return await this.agentClient.ackEmail(String(t?.mailId??""));default:throw new Error(`Unknown tool: ${e}`)}}async fetchRuntimeFeaturesWithStatus(){const e=Date.now();if(this.featuresCache&&e-this.featuresCache.fetchedAt<b.FEATURES_CACHE_TTL_MS)return{features:this.featuresCache.features,ok:this.featuresCache.ok};let t={},r=!1;try{t=await this.agentClient.getRuntimeFeatures(),r=!0}catch(n){c.warn("[McpServer] \u83B7\u53D6\u80FD\u529B\u5F00\u5173\u5931\u8D25\uFF0C\u6309\u542F\u52A8\u671F env \u515C\u5E95: %s",n instanceof Error?n.message:String(n))}return this.featuresCache={features:t,ok:r,fetchedAt:e},{features:t,ok:r}}static MEMORY_TYPES=["instance_hotspot_memory","instance_permanent_memory","project_doc_memory","session_context"];static MEMORY_TOOL_NAMES=new Set(["create_memory","read_memory","update_memory","delete_memory","search_memory","list_memories","get_memory_stats","list_memories_by_file","abandon_memory_update","memory_recurrence","memory_recurrence_complete"]);static findAgentsworkDirSync(e){const t=f.resolve(e),r=String(process.env.AWS_PROJECT_ROOT||"").trim(),n=r?f.resolve(r):null,s=n!==null&&b.isPathWithin(t,n)?n:null;let o=null,a=t;for(;;){if(C.existsSync(f.join(a,".git"))){o=a;break}if(s!==null&&a===s)break;const m=f.dirname(a);if(m===a)break;a=m}const l=o??s??t;for(a=t;;){const m=f.join(a,".agentswork");if(C.existsSync(m))return m;if(a===l)break;const p=f.dirname(a);if(p===a)break;a=p}return f.join(l,".agentswork")}static isPathWithin(e,t){const r=f.relative(t,e);return r===""||!r.startsWith(`..${f.sep}`)&&r!==".."&&!f.isAbsolute(r)}static sanitizeRoleDirectoryName(e){return String(e||"").trim().split("").map(r=>$e.has(r)||r.charCodeAt(0)<32?"_":r).join("").replace(/^\.+|\.+$/g,"").trim()||"default-role"}static resolveRoleMemoryDirectoryName(){return b.sanitizeRoleDirectoryName(process.env.AWS_ROLE_NAME||"")}static buildRoleMemoryStorePath(e){const t=process.env.AWS_WORKSPACE_PATH||process.cwd(),r=b.findAgentsworkDirSync(t);return f.join(r,"memory","memory",b.sanitizeRoleDirectoryName(e))}static resolveMemoryStorePaths(){const e=String(process.env.AWS_MEMORY_STORE_PATH||"").trim();if(e)return{instancePath:e,rolePath:e};const t=process.env.AWS_WORKSPACE_PATH||process.cwd(),r=b.findAgentsworkDirSync(t),n=String(process.env.AWS_INSTANCE_MEMORY_STORE_PATH||"").trim()||f.join(r,"memory","server-managed"),i=String(process.env.AWS_ROLE_MEMORY_STORE_PATH||"").trim()||f.join(r,"memory","memory",b.resolveRoleMemoryDirectoryName());return{instancePath:n,rolePath:i}}getRequiredString(e,t){const r=e[t];if(typeof r!="string"||r.trim().length===0)throw new Error(`${t} is required`);return r}getOptionalString(e,t){const r=e[t];return typeof r=="string"?r:void 0}getOptionalNumber(e,t){const r=e[t];return typeof r=="number"?r:void 0}getOptionalStringArray(e,t){const r=e[t];return Array.isArray(r)?r.map(n=>String(n)):void 0}getOptionalMemoryType(e){const t=e.memory_type;if(t!==void 0)return this.parseMemoryType(t)}parseMemoryType(e){if(typeof e!="string")throw new Error(`Invalid memory_type: ${String(e)}
3
+ `)}`)}toMemoryWriteResult(e){return{id:e.id,uri:e.uri,domain:e.domain,path:e.path,title:e.title,memory_type:e.memory_type,createdAt:e.createdAt,updatedAt:e.updatedAt,version:e.version,keywords:e.keywords,bound_files:e.bound_files}}toMemoryRecordWithMetadata(e){return{id:e.id,uri:e.uri,domain:e.domain,path:e.path,title:e.title,content:e.content,memory_type:e.memory_type,createdAt:e.createdAt,updatedAt:e.updatedAt,version:e.version,keywords:e.keywords,bound_files:e.bound_files,file_md5_map:e.file_md5_map,memory_status:e.memory_status,updating_agent_id:e.updating_agent_id,last_check_time:e.last_check_time,path_prefix:e.path_prefix,readonly:e.readonly,source_agent_id:e.source_agent_id,source_display_name:e.source_display_name,source_role_name:e.source_role_name,source_workspace_path:e.source_workspace_path}}constructor(){this.agentClient=new ce,this.messageBuffer=new Se,this.initialRoleName=b.resolveRoleMemoryDirectoryName(),this.hasRoleName=!!process.env.AWS_ROLE_NAME;const e=b.resolveMemoryStorePaths();this.memoryStore=new ke(this.agentClient),this.roleMemoryStore=new U(e.rolePath),this.sessionContextMemoryStore=new U(f.join(f.dirname(e.rolePath),"..","session_context")),this.isSubAgent=process.env.AWS_SUB_AGENT==="true",this.contextManager=new Me(this.sessionContextMemoryStore),this.server=new ne({name:ue,version:fe},{capabilities:{tools:{}},instructions:_e()}),this.setupHandlers()}async resolveGroupConfigState(e){if(!e.featureKey)return"expanded";const t=b.GROUP_ENV_KEYS[e.key],{features:r,ok:n}=await this.fetchRuntimeFeaturesWithStatus();if(n&&Object.keys(r).length>0){const s=b.parentGateOf(e.featureKey);return s&&J(r[s])==="disabled"?"disabled":J(r[e.featureKey])??e.defaultState}if(!t)return e.defaultState;const i=process.env[t];return i==="collapsed"?"collapsed":i==="1"||i==="expanded"?"expanded":i===void 0||i===""?e.defaultState:"disabled"}async isToolGroupEnabled(e){return await this.resolveGroupConfigState(e)!=="disabled"}static GROUP_ENV_KEYS={launch:"AWS_LAUNCH_CONFIG_TOOLS",hire:"AWS_HIRE_TOOLS",pencil:"AWS_PENCIL_TOOLS",draw:"AWS_DRAW_TOOLS",office:"AWS_OFFICE_TOOLS",task:"AWS_COLLABORATION_TASK_TOOLS",meeting:"AWS_COLLABORATION_MEETING_TOOLS",debug:"AWS_COLLABORATION_DEBUG_TOOLS",fileHistory:"AWS_COLLABORATION_FILE_HISTORY_TOOLS",abilityMarket:"AWS_ABILITY_MARKET_TOOLS",abilityDev:"AWS_ABILITY_DEV_TOOLS"};static PARENT_GATE_PREFIXES=[["agentSys","agentSys."],["collaboration","collaboration."]];static parentGateOf(e){if(e){for(const[t,r]of b.PARENT_GATE_PREFIXES)if(e.startsWith(r))return t}}async filterDisabledGroups(){let e=H;for(const t of ye)await this.resolveGroupConfigState(t)==="disabled"&&(e=e.filter(n=>!t.toolNames.has(n.name)));return e}setupHandlers(){this.server.setRequestHandler(ae,async()=>this.isSubAgent?{tools:H.filter(e=>Y.has(e.name))}:{tools:await this.filterDisabledGroups()}),this.server.setRequestHandler(oe,async(e,t)=>{const{name:r,arguments:n}=e.params;try{const i=await this.handleToolCall(r,n,t?.signal);return{content:this.buildToolResultContent(i)}}catch(i){const s=i instanceof Error?i.message:String(i),o=i instanceof Re?{error:s,...i.details}:i instanceof de&&(i.errorCode||i.field)?{error:s,...i.errorCode?{errorCode:i.errorCode}:{},...i.field?{field:i.field}:{}}:{error:s};return c.error("[McpServer] \u5DE5\u5177\u8C03\u7528\u5F02\u5E38: tool=%s, error=%s, stack=%s",r,s,i instanceof Error?i.stack:"(no stack)"),{content:[{type:"text",text:JSON.stringify(o,null,2)}],isError:!0}}})}async handlePencilExportImage(e){const t=typeof e.savePath=="string"?e.savePath.trim():"",r=await this.agentClient.callAgentScopedTool("pencil_export_image",e),n=typeof r?.image=="string"?r.image:"";if(!n)return r;const i=n.startsWith("data:")?n.slice(n.indexOf(",")+1):n,s={...r};delete s.image,delete s.mimeType,s.sizeKb=Math.ceil(i.length*3/4/1024);try{const{mkdir:o,writeFile:a}=await import("node:fs/promises");let l;if(t){const m=f.resolve(process.env.AWS_WORKSPACE_PATH||process.cwd());l=f.resolve(m,t)}else{const p=(typeof r?.docId=="string"?r.docId:"").replace(/[^a-zA-Z0-9_-]/g,"").slice(0,40)||"doc",u=f.join(W.tmpdir(),"pencil-export");await o(u,{recursive:!0}),l=f.join(u,`${p}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.png`)}return await o(f.dirname(l),{recursive:!0}),await a(l,Buffer.from(i,"base64")),{...s,savedTo:l,temp:!t}}catch(o){return{...s,savedTo:null,saveError:o instanceof Error?o.message:String(o)}}}static PENCIL_EXPORT_FORMATS=new Set(["svg","html","png","jpg","webp","pptx","fig","jsx"]);async handlePencilExportDocument(e){const t=typeof e.format=="string"&&e.format.trim()?e.format.trim().toLowerCase():"svg";if(!b.PENCIL_EXPORT_FORMATS.has(t))throw new Error(`\u4E0D\u652F\u6301\u7684\u5BFC\u51FA\u683C\u5F0F: ${t}\uFF08\u652F\u6301 svg/html/png/jpg/webp/pptx/fig/jsx\uFF1Bpdf \u6682\u4E0D\u652F\u6301\uFF09`);const r=typeof e.nodeId=="string"&&e.nodeId.trim()?e.nodeId.trim():"";if(t==="jsx"&&!r)throw new Error("jsx \u5BFC\u51FA\u9700\u8981\u4F20 nodeId\uFF08\u6765\u81EA pencil_get_tree\uFF09\uFF0C\u5B83\u6309\u5355\u8282\u70B9\u751F\u6210 React \u7EC4\u4EF6");const n=typeof e.savePath=="string"?e.savePath.trim():"",i=f.resolve(process.env.AWS_WORKSPACE_PATH||process.cwd()),s=await this.agentClient.callAgentScopedTool("pencil_export_document",e),o=typeof s?.snapshotJson=="string"?s.snapshotJson:"";if(!o)return s;const{mkdir:a,writeFile:l,stat:m}=await import("node:fs/promises"),u=(typeof s?.docId=="string"?s.docId:"").replace(/[^a-zA-Z0-9_-]/g,"").slice(0,40)||"doc",_=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,v=f.join(W.tmpdir(),"pencil-export");await a(v,{recursive:!0});const M=f.join(v,`${u}-${_}.snapshot.json`);await l(M,o,"utf8");const h=t,d=n?f.resolve(i,n):f.join(v,`${u}-${_}.${h}`),{home:g,searched:E}=We(i),y=[{cmd:process.execPath,entry:f.join(g,"packages","cli","dist","index.mjs"),cwd:g},{cmd:"bun",entry:f.join(g,"packages","cli","src","index.ts"),cwd:g}].filter(I=>C.existsSync(I.entry));if(y.length===0)throw new Error(`\u672A\u627E\u5230 open-pencil CLI\uFF08\u5DF2\u67E5\u627E\u76EE\u5F55\uFF1A${E.join("\uFF1B")}\uFF09\uFF0C\u8BF7\u786E\u8BA4\u5B89\u88C5\u5E03\u5C40\u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF AWS_OPEN_PENCIL_HOME \u6307\u5411 open-pencil \u4ED3\u5E93\u6839\u76EE\u5F55`);const S=["export",M,"--snapshot","-f",t,"-o",d];r&&S.push("--node",r),t==="html"&&S.push("--html","standalone"),(t==="png"||t==="jpg"||t==="webp")&&(typeof e.scale=="number"&&e.scale>0&&S.push("--scale",String(e.scale)),typeof e.quality=="number"&&e.quality>0&&S.push("--quality",String(e.quality)));const P=[];let w=!1;for(const I of y)try{await this.runPencilCli(I.cmd,[I.entry,...S],I.cwd),w=!0;break}catch($){P.push(`${f.basename(I.cmd)}: ${$ instanceof Error?$.message:String($)}`)}if(!w)throw new Error(`\u753B\u5E03\u5BFC\u51FA\u5931\u8D25\uFF08format=${t}\uFF09\uFF1A${P.join("\uFF1B")||"\u672A\u77E5\u9519\u8BEF"}`);let A=null;try{A=Math.ceil((await m(d)).size/1024)}catch{A=null}const T={...s};return delete T.snapshotJson,{...T,format:t,savedTo:d,temp:!n,sizeKb:A}}runPencilCli(e,t,r){return new Promise((n,i)=>{re(e,t,{cwd:r,timeout:18e4,maxBuffer:16*1024*1024},(s,o,a)=>{if(s){const l=String(a||o||"").trim().split(/\r?\n/).filter(Boolean).slice(-3).join(" | ");i(new Error(l||s.message));return}n(String(o||""))})})}static DRAW_EXPORT_FORMATS=new Set(["xml","drawio"]);async handleDrawExportDocument(e){const t=typeof e.format=="string"&&e.format.trim()?e.format.trim().toLowerCase():"xml";if(t==="svg"||t==="png"||t==="jpg"||t==="webp")throw new Error(`${t} \u5BFC\u51FA\u9700\u8981\u7ED8\u56FE\u6E32\u67D3\u7BA1\u7EBF\uFF08\u9636\u6BB5 2\uFF09\uFF1B\u672C\u8F6E\u8BF7\u7528 format=xml \u5BFC\u51FA draw.io <mxfile> \u539F\u6587\uFF0C\u6216\u7528\u6587\u4EF6\u8BFB\u53D6\u5DE5\u5177\u67E5\u770B XML/\u5728\u652F\u6301 draw.io \u7684\u7F16\u8F91\u5668\u4E2D\u6253\u5F00`);if(!b.DRAW_EXPORT_FORMATS.has(t))throw new Error(`\u4E0D\u652F\u6301\u7684\u5BFC\u51FA\u683C\u5F0F: ${t}\uFF08\u672C\u8F6E\u652F\u6301 xml/drawio\uFF09`);const r=typeof e.savePath=="string"?e.savePath.trim():"",n=f.resolve(process.env.AWS_WORKSPACE_PATH||process.cwd()),i=await this.agentClient.callAgentScopedTool("draw_export_document",e),s=typeof i?.docXml=="string"?i.docXml:"";if(!s)return i;const{mkdir:o,writeFile:a,stat:l}=await import("node:fs/promises"),p=(typeof i?.docId=="string"?i.docId:"").replace(/[^a-zA-Z0-9_-]/g,"").slice(0,40)||"doc",u=`${Date.now()}-${Math.random().toString(36).slice(2,8)}`,_=f.join(W.tmpdir(),"draw-export");await o(_,{recursive:!0});const v=t,M=r?f.resolve(n,r):f.join(_,`${p}-${u}.${v}`);await o(f.dirname(M),{recursive:!0}),await a(M,s,"utf8");let h=null;try{h=Math.ceil((await l(M)).size/1024)}catch{h=null}const d={...i};return delete d.docXml,{...d,format:t,savedTo:M,temp:!r,sizeKb:h}}async handleDrawExportImage(e){const t=await this.agentClient.callAgentScopedTool("draw_export_image",e),r=typeof t?.image=="string"?t.image:"";if(!r)return t;const n=r.startsWith("data:")?r.slice(r.indexOf(",")+1):r,i=typeof e.savePath=="string"?e.savePath.trim():"",s={...t};delete s.image,delete s.mimeType,s.sizeKb=Math.ceil(n.length*3/4/1024);try{const{mkdir:o,writeFile:a}=await import("node:fs/promises");let l;if(i){const m=f.resolve(process.env.AWS_WORKSPACE_PATH||process.cwd());l=f.resolve(m,i)}else{const p=(typeof t?.docId=="string"?t.docId:"").replace(/[^a-zA-Z0-9_-]/g,"").slice(0,40)||"doc",u=f.join(W.tmpdir(),"draw-export");await o(u,{recursive:!0}),l=f.join(u,`${p}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.png`)}return await o(f.dirname(l),{recursive:!0}),await a(l,Buffer.from(n,"base64")),{...s,savedTo:l,temp:!i}}catch(o){return{...s,savedTo:null,saveError:o instanceof Error?o.message:String(o)}}}async handleOfficeTool(e,t){switch(e){case"office_create":return await this.officeCreate(t);case"office_view":return await this.officeView(t);case"office_edit":return await this.officeEdit(t);case"office_validate":case"office_preview":return await this.officeFileForward(e,t);case"office_format":return await this.officeFormat(t);case"office_apply_profile":return await this.officeApplyProfile(t);case"office_generate_from_template":return await this.officeGenerateFromTemplate(t);case"office_open_document":return await this.officeOpenDocument(t);case"office_close_document":return await this.officeCloseDocument(t);case"office_list_open":return await this.officeListOpen(t);case"office_list_documents":return await this.officeListDocuments(t);case"office_delete_document":return await this.officeDeleteDocument(t);case"office_share_document":return await this.officeShareDocument(t);case"office_unshare_document":return await this.officeUnshareDocument(t);case"office_get_changes":return await this.officeGetChanges(t);default:throw new Error(`\u672A\u77E5\u7684 office \u5DE5\u5177: ${e}`)}}officeFileArg(e){const t=typeof e.file=="string"?e.file.trim():"";if(!t)throw new Error("file \u4E0D\u80FD\u4E3A\u7A7A");return t}backupReceipt(e){return e?{backupPath:e,backupHint:`\u5DF2\u81EA\u52A8\u5907\u4EFD\u539F\u6587\u4EF6\u5230 ${e}\uFF08\u4FDD\u7559\u6700\u8FD1\u82E5\u5E72\u4EFD\uFF09\uFF0C\u5982\u9700\u56DE\u6EDA\u53EF\u76F4\u63A5\u590D\u5236\u8986\u76D6`}:{}}async officeCreate(e){const t=this.officeFileArg(e),r=await this.agentClient.callAgentScopedTool("office_create",{fileName:f.basename(O(t)),locale:typeof e.locale=="string"&&e.locale.trim()?e.locale.trim():void 0,template:typeof e.template=="string"&&e.template.trim()?e.template.trim():void 0});if(r?.ok===!1||typeof r?.fileBase64!="string")return r;const n=j(t,String(r.fileBase64));return{ok:!0,file:t,kind:F(O(t))??void 0,savedTo:n.absolutePath,sizeKb:n.sizeKb,docId:typeof r.docId=="string"?r.docId:void 0,source:typeof r.source=="string"?r.source:void 0,fileUrl:typeof r.fileUrl=="string"?r.fileUrl:void 0,message:typeof r.message=="string"?r.message:`\u5DF2\u521B\u5EFA\u7A7A\u767D\u6587\u6863: ${t}`,hint:"\u6587\u6863\u5DF2\u540C\u6B65\u5230\u4E91\u6587\u6863\uFF08\u53EF\u5728 Dashboard \u9762\u677F\u67E5\u770B\u4E0E\u534F\u4F5C\uFF09\u3002\u7528 office_view \u4E86\u89E3\u7ED3\u6784\u540E\u5373\u53EF office_edit \u5199\u5165\u5185\u5BB9"}}async officeView(e){const t=D(this.officeFileArg(e)),r={fileName:t.fileName,fileBase64:t.fileBase64,mode:typeof e.mode=="string"&&e.mode.trim()?e.mode.trim():"text",start:typeof e.start=="number"?e.start:void 0,maxLines:typeof e.maxLines=="number"?e.maxLines:void 0,limit:typeof e.limit=="number"?e.limit:void 0,query:typeof e.query=="string"&&e.query.trim()?e.query.trim():void 0};return Array.isArray(e.paths)&&e.paths.length>0&&(r.paths=e.paths),await this.agentClient.callAgentScopedTool("office_view",r)}async officeEdit(e){const t=this.officeFileArg(e);if(!Array.isArray(e.commands)||e.commands.length===0)throw new Error("commands \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4");await be(e.commands,process.env.AWS_WORKSPACE_PATH||process.cwd()),Ae(e.commands);const r=D(t),n=typeof e.docId=="string"&&e.docId.trim()?e.docId.trim():void 0,i=await this.agentClient.callAgentScopedTool("office_edit",{fileName:r.fileName,fileBase64:r.fileBase64,commands:e.commands,bestEffort:e.bestEffort===!0,docId:n});if(i?.ok===!1)return i;const s={};typeof i?.docId=="string"&&(s.docId=i.docId),typeof i?.version=="number"&&(s.version=i.version),typeof i?.fileUrl=="string"&&(s.fileUrl=i.fileUrl);const o=Array.isArray(i?.warnings)&&i.warnings.length>0?{warnings:i.warnings}:{};if(typeof i?.fileBase64=="string"){const a=j(t,String(i.fileBase64));return{ok:!0,file:t,kind:F(O(t))??void 0,results:Array.isArray(i.results)?i.results:[],changed:!0,savedTo:a.absolutePath,sizeKb:a.sizeKb,...this.backupReceipt(a.backupPath),...o,...s}}return{ok:!0,results:Array.isArray(i?.results)?i.results:[],changed:!1,...o,...s}}async officeFormat(e){const t=this.officeFileArg(e),r=typeof e.action=="string"?e.action.trim():"",n=r==="dryRun"||r==="dryrun";if(!["check","fix","dryRun"].includes(r))throw new Error('action \u5FC5\u987B\u662F "check"\u3001"fix" \u6216 "dryRun"');const i={action:r,annotate:e.annotate===!0};if(typeof e.preset=="string"&&e.preset.trim()&&(i.preset=e.preset.trim()),e.rules&&typeof e.rules=="object"&&(i.rules=e.rules),typeof e.rulesFile=="string"&&e.rulesFile.trim()&&(i.rules=await this.readOfficeRulesFile(e.rulesFile.trim())),e.mergePreset===!0&&(i.mergePreset=!0),Array.isArray(e.exclude)&&e.exclude.length>0&&(i.exclude=e.exclude),!i.preset&&!i.rules)throw new Error("\u9700\u8981 preset\u3001rulesFile \u6216 rules \u4E4B\u4E00\u63D0\u4F9B\u683C\u5F0F\u89C4\u5219");const a=(typeof e.outputFile=="string"&&e.outputFile.trim()?e.outputFile.trim():"")||(i.annotate===!0&&r==="check"?this.deriveSiblingFileName(t,"-\u6807\u6CE8\u7248"):t),l=D(t),m=await this.agentClient.callAgentScopedTool("office_format",{fileName:l.fileName,fileBase64:l.fileBase64,...i});if(m?.ok===!1)return m;if(typeof m?.fileBase64=="string"&&!n&&(r==="fix"||i.annotate===!0)){const p=a!==t,u=p?ve(t,f.basename(a),String(m.fileBase64)):j(t,String(m.fileBase64)),{fileBase64:_,...v}=m;return{...v,file:t,...p?{outputFile:a,originalPreserved:!0}:{},kind:F(O(a))??void 0,savedTo:u.absolutePath,sizeKb:u.sizeKb,...this.backupReceipt(u.backupPath)}}if(typeof m?.fileBase64=="string"){const{fileBase64:p,...u}=m;return u}return m}deriveSiblingFileName(e,t){const r=O(e),n=f.extname(r),s=`${f.basename(r,n)}${t}${n}`;return f.isAbsolute(e)?f.join(f.dirname(r),s):s}async officeApplyProfile(e){const t=this.officeFileArg(e);if(typeof e.profile!="object"||e.profile===null)throw new Error("profile \u5FC5\u987B\u662F\u975E\u7A7A\u5BF9\u8C61");const r=D(t),n=await this.agentClient.callAgentScopedTool("office_apply_profile",{fileName:r.fileName,fileBase64:r.fileBase64,profile:e.profile});if(n?.ok===!1)return n;if(typeof n?.fileBase64=="string"&&n?.changed===!0){const i=j(t,String(n.fileBase64)),{fileBase64:s,...o}=n;return{...o,file:t,kind:F(O(t))??void 0,savedTo:i.absolutePath,sizeKb:i.sizeKb,...this.backupReceipt(i.backupPath)}}return{ok:!0,changed:!1,file:t,message:"\u6587\u6863\u683C\u5F0F\u5DF2\u4E0E Profile \u4E00\u81F4\uFF0C\u65E0\u9700\u4FEE\u6539"}}async officeGenerateFromTemplate(e){const t=this.officeFileArg(e),r=D(t);let n=e.content;Array.isArray(n)&&n.length>0&&(n=await Promise.all(n.map(async a=>{if(typeof a=="object"&&a!==null&&a.type==="image"){const l={...a};if(typeof l.source=="string"){const m=await Te(l.source,process.env.AWS_WORKSPACE_PATH||process.cwd());l.imageBase64=m.base64,l.imageName=m.name,delete l.source}}return a})));const i={fileName:r.fileName,fileBase64:r.fileBase64};e.variables&&typeof e.variables=="object"&&(i.variables=e.variables),Array.isArray(n)&&n.length>0&&(i.content=n),e.profile&&typeof e.profile=="object"&&(i.profile=e.profile);const s=typeof e.outputFile=="string"&&e.outputFile.trim()?e.outputFile.trim():t;s!==t&&(i.outputFileName=f.basename(O(s)),i.skipCloudSync=!0);const o=await this.agentClient.callAgentScopedTool("office_generate_from_template",i);if(o?.ok===!1)return o;if(typeof o?.fileBase64=="string"){const a=j(s,String(o.fileBase64)),{fileBase64:l,...m}=o;return{...m,file:s,template:s===t?void 0:t,kind:F(O(s))??void 0,savedTo:a.absolutePath,sizeKb:a.sizeKb,...this.backupReceipt(a.backupPath)}}return{ok:!0,changed:!1,file:t,message:"\u6A21\u677F\u672A\u53D1\u73B0\u5360\u4F4D\u7B26\u6216\u5185\u5BB9\u6E05\u5355\u4E3A\u7A7A"}}async readOfficeRulesFile(e){const t=await import("node:fs"),r=await import("node:path"),n=process.env.AWS_WORKSPACE_PATH||process.cwd(),i=r.resolve(n,e);if(!t.existsSync(i)||!t.statSync(i).isFile())throw new Error(`\u89C4\u5219\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}\uFF08\u89E3\u6790\u4E3A ${i}\uFF09`);const s=t.readFileSync(i,"utf8"),o=r.extname(i).toLowerCase();try{if(o===".json")return JSON.parse(s);const l=(await import("yaml")).parse(s);if(!l||typeof l!="object"||Array.isArray(l))throw new Error("\u89C4\u5219\u6587\u4EF6\u5185\u5BB9\u5FC5\u987B\u662F\u5BF9\u8C61\uFF08\u542B rules[]/page/roles\uFF09");return l}catch(a){throw new Error(`\u89C4\u5219\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${e}\uFF08${a instanceof Error?a.message:String(a)}\uFF09`)}}async officeFileForward(e,t){const r=D(this.officeFileArg(t));return await this.agentClient.callAgentScopedTool(e,{fileName:r.fileName,fileBase64:r.fileBase64})}officeOpenFiles=[];async officeOpenDocument(e){const t=this.officeFileArg(e),r=O(t);if(!C.existsSync(r))return{ok:!1,error:`\u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`};const n=C.statSync(r);if(!n.isFile())return{ok:!1,error:`\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6: ${t}`};const i=F(r);if(!i)return{ok:!1,error:`\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B: ${t}\uFF08\u4EC5\u652F\u6301 .docx/.docm\u3001.xlsx/.xlsm\u3001.pptx/.pptm\uFF09`};const s=Math.ceil(n.size/1024);let o;try{o=D(t)}catch(m){return{ok:!1,error:m instanceof Error?m.message:String(m)}}const a=await this.agentClient.callAgentScopedTool("office_open_document",{fileName:o.fileName,fileBase64:o.fileBase64,workspacePath:z(),sourcePath:t});if(!a||a.ok===!1)return a??{ok:!1,error:"\u4E0A\u884C\u4E3A\u4E91\u6587\u6863\u5931\u8D25\uFF08\u670D\u52A1\u7AEF\u672A\u8FD4\u56DE\u7ED3\u679C\uFF09"};const l=this.officeOpenFiles.findIndex(m=>m.file===r);return l>=0?this.officeOpenFiles[l]={file:r,kind:i,sizeKb:s}:this.officeOpenFiles.push({file:r,kind:i,sizeKb:s}),{ok:!0,docId:typeof a.docId=="string"?a.docId:void 0,file:r,kind:i,sizeKb:s,workspacePath:z(),source:typeof a.source=="string"?a.source:"local",fileUrl:typeof a.fileUrl=="string"?a.fileUrl:void 0,version:typeof a.version=="number"?a.version:void 0,message:"\u5DF2\u4E0A\u4F20\u5E76\u6253\u5F00\u4E3A\u4E91\u6587\u6863\u3002\u5982\u9700\u8986\u76D6\u672C\u5730\u6587\u4EF6\uFF0C\u8BF7\u7F16\u8F91\u597D\u540E\u5BFC\u51FA\u8986\u76D6\u3002"}}async officeCloseDocument(e){return{ok:!0,closed:!0,message:"\u5DF2\u5173\u95ED Office \u6587\u6863\u9884\u89C8\u9762\u677F"}}async officeListOpen(e){return{ok:!0,files:this.officeOpenFiles,count:this.officeOpenFiles.length}}async officeListDocuments(e){const t=await this.agentClient.callAgentScopedTool("office_list_documents",{});return t&&t.ok!==!1&&typeof t.count!="number"&&Array.isArray(t.documents)?{...t,count:t.documents.length}:t}async officeDeleteDocument(e){const t=this.officeRequiredDocId(e);return await this.agentClient.callAgentScopedTool("office_delete_document",{docId:t})}async officeShareDocument(e){const t=this.officeRequiredDocId(e);if(!Array.isArray(e.members)||e.members.length===0)throw new Error("members \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4\uFF08\u6BCF\u9879 {agentId, permission?: read|write}\uFF09");const r=typeof e.name=="string"&&e.name.trim()?e.name.trim():void 0;return await this.agentClient.callAgentScopedTool("office_share_document",{docId:t,members:e.members,name:r})}async officeUnshareDocument(e){const t=this.officeRequiredDocId(e),r=Array.isArray(e.agentIds)?e.agentIds:void 0;return await this.agentClient.callAgentScopedTool("office_unshare_document",{docId:t,agentIds:r})}async officeGetChanges(e){const t=this.officeRequiredDocId(e),r=typeof e.sinceVersion=="number"?e.sinceVersion:void 0;return await this.agentClient.callAgentScopedTool("office_get_changes",{docId:t,sinceVersion:r})}officeRequiredDocId(e){const t=typeof e.docId=="string"?e.docId.trim():"";if(!t)throw new Error("docId \u4E0D\u80FD\u4E3A\u7A7A");return t}async buildOfficeCardPayload(e){const t=typeof e.filePath=="string"?e.filePath.trim():"",r=typeof e.docId=="string"?e.docId.trim():"";if(t&&r)throw new Error(`office \u5361\u7247 filePath \u4E0E docId \u53EA\u80FD\u4E8C\u9009\u4E00\uFF08filePath=${t}, docId=${r}\uFF09`);if(!t&&!r)throw(typeof e.fileUrl=="string"?e.fileUrl.trim():"")?new Error("office \u5361\u7247\u4E0D\u63A5\u53D7\u76F4\u63A5\u4F20 fileUrl\uFF0C\u8BF7\u4F20 filePath\uFF08\u5DE5\u4F5C\u533A\u6587\u4EF6\u8DEF\u5F84\uFF09\u6216 docId\uFF08\u4E91\u6587\u6863 id\uFF09\u4E4B\u4E00"):new Error("office \u5361\u7247\u5FC5\u987B\u63D0\u4F9B filePath\uFF08\u5DE5\u4F5C\u533A\u6587\u4EF6\u8DEF\u5F84\uFF09\u6216 docId\uFF08\u4E91\u6587\u6863 id\uFF09\u4E4B\u4E00");if(r){const m={type:"office",docId:r};return typeof e.title=="string"&&e.title.trim()&&(m.title=e.title.trim()),typeof e.description=="string"&&e.description.trim()&&(m.description=e.description.trim()),m}const n=D(t),i=F(n.absolutePath);if(!i)throw new Error(`office \u5361\u7247\u4EC5\u652F\u6301 docx/xlsx/pptx \u6587\u6863\uFF08\u542B .docm/.xlsm/.pptm\uFF09: ${t}`);const o=(await this.uploadAttachmentFiles([n.absolutePath]))[0],a=o.name,l={type:"office",name:a,kind:i,fileUrl:o.url,sizeKb:Math.ceil(o.size/1024),title:typeof e.title=="string"&&e.title.trim()?e.title.trim():a,filePath:t,workspacePath:z()};return typeof e.description=="string"&&e.description.trim()&&(l.description=e.description.trim()),l}async prepareCardForSend(e){if(!e)return e;let t;if(typeof e=="string")try{t=JSON.parse(e)}catch{return e}else if(typeof e=="object")t=e;else return e;return t?.type!=="office"?e:await this.buildOfficeCardPayload(t)}stripRenderImageForReporting(e){if(e&&typeof e=="object"&&!Array.isArray(e)){const t=e;let r=null;if(typeof t.image=="string"){const i=t.image.length,s=Math.ceil(i*3/4/1024);r={...t,image:`<PNG base64 \u5DF2\u7701\u7565\uFF0C\u7EA6 ${s}KB\uFF0C\u6B63\u6587\u89C1 t_pencil_doc.render_image>`}}const n=r??t;if(typeof n.snapshotJson=="string"){const i=Math.ceil(n.snapshotJson.length/1024);r={...n,snapshotJson:`<GraphSnapshot JSON \u5DF2\u7701\u7565\uFF0C\u7EA6 ${i}KB\uFF0C\u6743\u5A01\u6570\u636E\u89C1 t_pencil_doc.snapshot>`}}if(r)return r}return e}buildToolResultContent(e){if(e&&typeof e=="object"&&!Array.isArray(e)){const t=e;if(typeof t.image=="string"&&typeof t.mimeType=="string"){const r={...t};delete r.image;const n=[{type:"image",data:t.image,mimeType:t.mimeType}];return Object.keys(r).length>0&&n.push({type:"text",text:JSON.stringify(r,null,2)}),n}}return[{type:"text",text:JSON.stringify(e,null,2)}]}async handleToolCall(e,t,r){const n=t?._aws_sub_agent===!0,i=t?._aws_silent_poll===!0,s=t?._aws_force_inject===!0,o={...t};delete o._aws_sub_agent,delete o._aws_silent_poll,delete o._aws_force_inject;const a=n?null:this.agentClient.getStatusReporter();a&&!i&&this.safeReportStatus(()=>a.reportToolUse(e,this.sanitizeToolUseArgs(e,o)));try{const l=await this.executeToolCall(e,o,{forceInject:s,signal:r});if(a&&!i){const m=this.stripAutoDelegateForReporting(l);m!==null&&(this.safeReportStatus(()=>a.reportToolResult(this.stripRenderImageForReporting(m))),this.safeReportStatus(()=>a.reportThinking()))}return l}catch(l){throw a&&!i&&this.safeReportStatus(()=>a.reportToolError(l)),l}}async reconcilePanelActionWithAuthority(){const e=this.agentClient.getStatusReporter();if(!e)return!1;if(typeof e.getCurrentStatus=="function"){const r=e.getCurrentStatus();if(r.actionDetail!=null&&r.actionDetail.includes("poll_message"))return!1}let t=null;try{t=await this.agentClient.fetchCurrentAction()}catch(r){return c.warn("[McpServer] \u67E5\u8BE2 bridge \u5F53\u524D\u52A8\u4F5C\u5931\u8D25\uFF08\u8DF3\u8FC7\u9762\u677F\u77EB\u6B63\uFF09: %s",r instanceof Error?r.message:String(r)),!1}return!t?.found||t.hasActiveBlockingToolCall!==!0?!1:(this.safeReportStatus(()=>e.reportToolUse("poll_message",{})),c.info("[McpServer] \u9762\u677F\u72B6\u6001\u4E0E\u6743\u5A01\u72B6\u6001\u4E0D\u4E00\u81F4\uFF08\u6743\u5A01: \u963B\u585E\u578B\u8C03\u7528\u5728\u98DE, \u672C\u5730: %s/%s\uFF09\uFF0C\u5DF2\u8865\u53D1 poll_message \u4E8B\u4EF6\u77EB\u6B63",e.getCurrentStatus?.().status??"(none)",e.getCurrentStatus?.().actionDetail??"(none)"),!0)}safeReportStatus(e){try{e()}catch(t){c.warn("[McpServer] \u72B6\u6001\u4E0A\u62A5\u5931\u8D25\uFF08\u5DF2\u5FFD\u7565\uFF0C\u4E0D\u5F71\u54CD\u5DE5\u5177\u8C03\u7528\uFF09: %s",t instanceof Error?t.message:String(t))}}async executeToolCall(e,t,r={}){if(this.isSubAgent&&!Y.has(e))throw new Error(`Sub-agent is not allowed to call tool: ${e}`);const n=we(e);if(n&&await this.resolveGroupConfigState(n)==="disabled")throw new Error(`${n.label}\u80FD\u529B\u672A\u5F00\u542F\uFF08\u8BF7\u5148\u5728\u80FD\u529B\u914D\u7F6E\u4E2D\u5F00\u542F\u300C${n.label}\u300D\u540E\u518D\u8C03\u7528 ${e}\uFF09`);switch(e){case"get_colleague":return await this.agentClient.discoverColleagues();case"get_group_rooms":return await this.agentClient.discoverGroupRooms();case"get_profile":return await this.agentClient.getProfile();case"hire_colleague":return await this.handleHireColleague(t);case"send_group":return await this.handleSendGroup(t);case"send_private":return await this.handleSendPrivate(t);case"poll_message":return await this.handlePollMessage(r.signal);case"get_message":return this.handleGetMessage(r.forceInject===!0);case"get_dm_history":return await this.handleGetDmHistory(t);case"get_group_history":return await this.handleGetGroupHistory(t);case"transcribe_voice":return await this.agentClient.callAgentScopedTool("transcribe_voice",t);case"create_meeting":case"leave_meeting":case"end_meeting":case"meeting_speak":case"get_meeting_info":case"my_meetings":return await this.agentClient.callAgentScopedTool(e,t);case"pencil_create_document":case"pencil_list_documents":case"pencil_open_document":case"pencil_close_document":case"pencil_get_tree":case"pencil_get_changes":case"pencil_create_nodes":case"pencil_update_nodes":case"pencil_delete_nodes":case"pencil_share_document":case"pencil_revoke_share":case"pencil_delete_document":case"pencil_rename_document":return await this.agentClient.callAgentScopedTool(e,t);case"pencil_export_image":return await this.handlePencilExportImage(t);case"pencil_export_document":return await this.handlePencilExportDocument(t);case"draw_create_document":case"draw_list_documents":case"draw_open_document":case"draw_close_document":case"draw_get_diagram":case"draw_get_changes":case"draw_create_cells":case"draw_update_cells":case"draw_delete_cells":case"draw_share_document":case"draw_revoke_share":case"draw_delete_document":case"draw_rename_document":return await this.agentClient.callAgentScopedTool(e,t);case"draw_export_image":return await this.handleDrawExportImage(t);case"draw_export_document":return await this.handleDrawExportDocument(t);case"office_create":case"office_view":case"office_edit":case"office_validate":case"office_preview":case"office_format":case"office_apply_profile":case"office_generate_from_template":case"office_open_document":case"office_close_document":case"office_list_open":case"office_list_documents":case"office_delete_document":case"office_share_document":case"office_unshare_document":case"office_get_changes":return await this.handleOfficeTool(e,t);case"my_task":return await this.agentClient.getMyTasks();case"create_task_instance_comment":return await this.handleCreateTaskInstanceComment(t);case"submit_task_result":return await this.handleSubmitTaskResult(t);case"start_task_rollback":return await this.handleStartTaskRollback(t);case"finish_task_rollback":return await this.handleFinishTaskRollback(t);case"list_task_node_iterations":return await this.agentClient.listTaskNodeIterations(t);case"create_memory":return await this.handleCreateMemory(t);case"read_memory":return await this.handleReadMemory(t);case"update_memory":return await this.handleUpdateMemory(t);case"delete_memory":return await this.handleDeleteMemory(t);case"search_memory":return await this.handleSearchMemory(t);case"list_memories":return await this.handleListMemories(t);case"get_memory_stats":return await this.handleGetMemoryStats(t);case"list_memories_by_file":return await this.handleListMemoriesByFile(t);case"abandon_memory_update":return await this.handleAbandonMemoryUpdate(t);case"memory_recurrence":return await this.handleMemoryRecurrence(t);case"memory_recurrence_complete":return await this.handleMemoryRecurrenceComplete(t);case"get_debug_log_config":return await this.agentClient.getDebugLogConfig();case"query_debug_logs":return await this.agentClient.queryDebugLogs(t);case"query_file_changes_history":return await this.agentClient.queryFileChangesHistory(t);case"list_colleague_events":return await this.agentClient.listColleagueEvents(t);case"launch_config_list":return await this.agentClient.listLaunchConfigs();case"launch_config_create":return await this.agentClient.createLaunchConfig(t);case"launch_config_update":return await this.agentClient.updateLaunchConfig(t);case"launch_config_delete":return await this.agentClient.deleteLaunchConfig(String(t?.configId??""));case"launch_config_start":return await this.agentClient.startLaunchConfig(t);case"launch_config_restart":return await this.agentClient.restartLaunchConfig(t);case"launch_config_stop":return await this.agentClient.stopLaunchConfig(String(t?.configId??""));case"launch_config_logs":return await this.agentClient.getLaunchLogs(t);case"launch_config_status":return await this.agentClient.listLaunchRuns();case"list_ability_market":return await this.agentClient.listAbilityMarket(t);case"install_ability_market_item":return await this.agentClient.installAbilityMarketItem(t);case"uninstall_ability_market_item":return await this.agentClient.uninstallAbilityMarketItem(t);case"ability_dev_ide":return await this.agentClient.abilityDevIde(t);case"formal_ability":return await this.agentClient.formalAbility(t);case"list_my_abilities":return await this.agentClient.listMyAbilities(t);case"list_project_members":return await this.agentClient.listProjectMembers();case"send_email":return await this.agentClient.sendEmail(t);case"list_emails":return await this.agentClient.listEmails(t);case"read_email":return await this.agentClient.readEmail(String(t?.mailId??""));case"reply_email":return await this.agentClient.replyEmail(t);case"ack_email":return await this.agentClient.ackEmail(String(t?.mailId??""));default:throw new Error(`Unknown tool: ${e}`)}}async fetchRuntimeFeaturesWithStatus(){const e=Date.now();if(this.featuresCache&&e-this.featuresCache.fetchedAt<b.FEATURES_CACHE_TTL_MS)return{features:this.featuresCache.features,ok:this.featuresCache.ok};let t={},r=!1;try{t=await this.agentClient.getRuntimeFeatures(),r=!0}catch(n){c.warn("[McpServer] \u83B7\u53D6\u80FD\u529B\u5F00\u5173\u5931\u8D25\uFF0C\u6309\u542F\u52A8\u671F env \u515C\u5E95: %s",n instanceof Error?n.message:String(n))}return this.featuresCache={features:t,ok:r,fetchedAt:e},{features:t,ok:r}}static MEMORY_TYPES=["instance_hotspot_memory","instance_permanent_memory","project_doc_memory","session_context"];static MEMORY_TOOL_NAMES=new Set(["create_memory","read_memory","update_memory","delete_memory","search_memory","list_memories","get_memory_stats","list_memories_by_file","abandon_memory_update","memory_recurrence","memory_recurrence_complete"]);static findAgentsworkDirSync(e){const t=f.resolve(e),r=String(process.env.AWS_PROJECT_ROOT||"").trim(),n=r?f.resolve(r):null,s=n!==null&&b.isPathWithin(t,n)?n:null;let o=null,a=t;for(;;){if(C.existsSync(f.join(a,".git"))){o=a;break}if(s!==null&&a===s)break;const m=f.dirname(a);if(m===a)break;a=m}const l=o??s??t;for(a=t;;){const m=f.join(a,".agentswork");if(C.existsSync(m))return m;if(a===l)break;const p=f.dirname(a);if(p===a)break;a=p}return f.join(l,".agentswork")}static isPathWithin(e,t){const r=f.relative(t,e);return r===""||!r.startsWith(`..${f.sep}`)&&r!==".."&&!f.isAbsolute(r)}static sanitizeRoleDirectoryName(e){return String(e||"").trim().split("").map(r=>$e.has(r)||r.charCodeAt(0)<32?"_":r).join("").replace(/^\.+|\.+$/g,"").trim()||"default-role"}static resolveRoleMemoryDirectoryName(){return b.sanitizeRoleDirectoryName(process.env.AWS_ROLE_NAME||"")}static buildRoleMemoryStorePath(e){const t=process.env.AWS_WORKSPACE_PATH||process.cwd(),r=b.findAgentsworkDirSync(t);return f.join(r,"memory","memory",b.sanitizeRoleDirectoryName(e))}static resolveMemoryStorePaths(){const e=String(process.env.AWS_MEMORY_STORE_PATH||"").trim();if(e)return{instancePath:e,rolePath:e};const t=process.env.AWS_WORKSPACE_PATH||process.cwd(),r=b.findAgentsworkDirSync(t),n=String(process.env.AWS_INSTANCE_MEMORY_STORE_PATH||"").trim()||f.join(r,"memory","server-managed"),i=String(process.env.AWS_ROLE_MEMORY_STORE_PATH||"").trim()||f.join(r,"memory","memory",b.resolveRoleMemoryDirectoryName());return{instancePath:n,rolePath:i}}getRequiredString(e,t){const r=e[t];if(typeof r!="string"||r.trim().length===0)throw new Error(`${t} is required`);return r}getOptionalString(e,t){const r=e[t];return typeof r=="string"?r:void 0}getOptionalNumber(e,t){const r=e[t];return typeof r=="number"?r:void 0}getOptionalStringArray(e,t){const r=e[t];return Array.isArray(r)?r.map(n=>String(n)):void 0}getOptionalMemoryType(e){const t=e.memory_type;if(t!==void 0)return this.parseMemoryType(t)}parseMemoryType(e){if(typeof e!="string")throw new Error(`Invalid memory_type: ${String(e)}
4
4
  ${V}`);const t=Ee(e);if(!t)throw new Error(`Invalid memory_type: ${e}
5
5
  ${V}`);return t}isMemoryType(e){return b.MEMORY_TYPES.some(t=>t===e)}isAgentWritableMemoryType(e){return e==="instance_hotspot_memory"||e==="instance_permanent_memory"||e==="project_doc_memory"}getMemoryStoreForType(e){return this.memoryStore}async readMemoryFromScopedStores(e){if(e.memory_type)return await this.memoryStore.readMemory(e);const t=await this.memoryStore.readMemory({...e,memory_type:"project_doc_memory"}).catch(()=>null);return t||await this.memoryStore.readMemory(e)}async backupProjectMemoryToLocal(e){try{const t=await this.memoryStore.readMemory({uri:e.uri,memory_type:"project_doc_memory"});t&&(await this.roleMemoryStore.deleteMemory({uri:e.uri,memory_type:"project_doc_memory"}).catch(()=>{}),await this.roleMemoryStore.createMemory(t))}catch(t){c.warn("[McpServer] backupProjectMemoryToLocal \u5931\u8D25: uri=%s",e.uri,t)}}async removeProjectMemoryLocalBackup(e){try{await this.roleMemoryStore.deleteMemory({uri:e,memory_type:"project_doc_memory"})}catch(t){c.warn("[McpServer] removeProjectMemoryLocalBackup \u5931\u8D25: uri=%s",e,t)}}async findMemoryStoreForMutation(e){return e.memory_type?{store:this.memoryStore,memory_type:e.memory_type}:await this.memoryStore.readMemory({uri:e.uri,memory_type:"project_doc_memory"}).catch(()=>null)?{store:this.memoryStore,memory_type:"project_doc_memory"}:{store:this.memoryStore}}async reportMemoryStatsToServer(){const e=await this.memoryStore.getStats();try{await this.agentClient.reportMemoryStats(e)}catch(t){c.warn("[McpServer] \u4E0A\u62A5 memory \u7EDF\u8BA1\u5931\u8D25:",t)}}sanitizeToolUseArgs(e,t){if(!b.MEMORY_TOOL_NAMES.has(e))return t;const r={},n=this.getOptionalString(t,"uri"),i=this.getOptionalString(t,"memory_type"),s=this.getOptionalNumber(t,"limit");return n&&(r.uri=n),i&&(r.memory_type=i),typeof s=="number"&&(r.limit=s),e==="search_memory"&&(r.queryProvided=typeof t.query=="string"&&t.query.length>0,t.keyword_mode!==void 0&&(r.keyword_mode=t.keyword_mode)),r}stripAutoDelegateForReporting(e){if(!e||typeof e!="object")return e;const t=e,r=Array.isArray(t.directMessages)?t.directMessages:[],n=Array.isArray(t.groupMessages)?t.groupMessages:[],i=a=>!!a&&typeof a=="object"&&"_acodeAutoDelegate"in a;if(!r.some(i))return e;const o=r.filter(a=>!i(a));return o.length===0&&n.length===0?null:{...t,directMessages:o}}async handleCreateMemory(e){const t=this.normalizeBoundFiles(this.getOptionalStringArray(e,"bound_files"));await this.validateBoundFilesExist(t);let r,n;if(t&&t.length>0){r={};for(const o of t){const a=await this.calculateFileMd5(o);a&&(r[o]=a)}n=new Date().toISOString()}const i={memory_type:this.parseMemoryType(this.getRequiredString(e,"memory_type")),uri:this.getRequiredString(e,"uri"),title:this.getOptionalString(e,"title"),content:this.getRequiredString(e,"content"),keywords:this.getOptionalStringArray(e,"keywords"),bound_files:t,file_md5_map:r,last_check_time:n},s=await this.memoryStore.createMemory(i);return i.memory_type==="project_doc_memory"&&this.backupProjectMemoryToLocal(i).catch(o=>{c.warn("[McpServer] \u5907\u4EFD project_doc_memory \u5230\u672C\u5730\u5931\u8D25:",o)}),await this.reportMemoryStatsToServer(),this.toMemoryWriteResult(s)}async handleReadMemory(e){const t={uri:this.getRequiredString(e,"uri"),memory_type:this.getOptionalMemoryType(e)};return await this.readMemoryFromScopedStores(t)}async handleUpdateMemory(e){const t=typeof e.old_string=="string"||typeof e.new_string=="string",r=typeof e.old_string=="string"&&typeof e.new_string=="string",n=this.getOptionalString(e,"append");if(t&&!r)throw new Error("old_string and new_string must be provided together");const i={uri:this.getRequiredString(e,"uri"),memory_type:this.getOptionalMemoryType(e),title:this.getOptionalString(e,"title"),old_string:this.getOptionalString(e,"old_string"),new_string:this.getOptionalString(e,"new_string"),append:n,keywords:this.getOptionalStringArray(e,"keywords"),bound_files:this.normalizeBoundFiles(this.getOptionalStringArray(e,"bound_files"))},s=await this.findMemoryStoreForMutation(i),o=await s.store.readMemory({uri:i.uri,memory_type:s.memory_type??i.memory_type});i.bound_files!==void 0?await this.validateBoundFilesExist(i.bound_files):o?.bound_files&&o.bound_files.length>0&&await this.validateBoundFilesExist(o.bound_files);const a=i.bound_files??o?.bound_files;let l,m;if(a&&a.length>0){l={};for(const u of a){const _=await this.calculateFileMd5(u);_&&(l[u]=_)}m=new Date().toISOString()}const p=await s.store.updateMemory({...i,memory_type:s.memory_type??i.memory_type,file_md5_map:l,last_check_time:m});if(s.memory_type==="project_doc_memory"&&this.backupProjectMemoryToLocal({...i,memory_type:"project_doc_memory",file_md5_map:l,last_check_time:m}).catch(u=>{c.warn("[McpServer] \u5907\u4EFD project_doc_memory \u66F4\u65B0\u5230\u672C\u5730\u5931\u8D25:",u)}),await this.reportMemoryStatsToServer(),s.memory_type==="project_doc_memory"&&o?.memory_status==="updating")try{await this.memoryStore.releaseMemoryClaim(i.uri),this.activeLeaseUris.delete(i.uri),this.activeLeaseUris.size===0&&this.stopLeaseRenewal()}catch(u){c.warn("[McpServer] \u91CA\u653E memory claim \u5931\u8D25: uri=%s, error=%s",i.uri,u instanceof Error?u.message:String(u))}return this.toMemoryWriteResult(p)}async handleDeleteMemory(e){const t=typeof e.uri=="string"?e.uri:void 0,r=Array.isArray(e.memories)?e.memories:void 0;if(t&&r&&r.length>0)throw new Error("delete_memory \u4E0D\u652F\u6301\u540C\u65F6\u4F20\u5165 uri \u548C memories\uFF0C\u8BF7\u4E8C\u9009\u4E00");if(!t&&(!r||r.length===0))throw new Error("delete_memory \u9700\u8981 uri \u6216 memories \u53C2\u6570");if(t){const o=this.getOptionalMemoryType(e);return{deleted:await this.deleteMemorySingle(t,o)}}let n=0;const i=[],s=[];for(let o=0;o<r.length;o++){const a=r[o];if(typeof a!="object"||a===null){s.push({uri:String(a),reason:`memories[${o}] \u4E0D\u662F\u5BF9\u8C61`});continue}const l=a,m=typeof l.uri=="string"?l.uri:"";if(!m){s.push({uri:"",reason:`memories[${o}].uri \u7F3A\u5931`});continue}const p=typeof l.memory_type=="string"?this.parseMemoryType(l.memory_type):void 0;try{await this.deleteMemorySingle(m,p,!0)?n++:i.push(m)}catch(u){s.push({uri:m,reason:u instanceof Error?u.message:String(u)})}}return n>0&&await this.reportMemoryStatsToServer(),{deleted:n,not_found:i,failed:s}}async deleteMemorySingle(e,t,r=!1){const n={uri:e,memory_type:t},i=await this.findMemoryStoreForMutation(n),s=i.memory_type??n.memory_type,o=await i.store.deleteMemory({...n,memory_type:s});return o&&(s==="project_doc_memory"&&this.removeProjectMemoryLocalBackup(e).catch(a=>{c.warn("[McpServer] \u5220\u9664 project_doc_memory \u672C\u5730\u5907\u4EFD\u5931\u8D25:",a)}),r||await this.reportMemoryStatsToServer()),o}async handleSearchMemory(e){const t=this.getOptionalString(e,"scope"),r=t==="children"||t==="all"?t:"own",n=this.getOptionalString(e,"keyword_mode"),i=n==="all"?"all":n==="any"?"any":void 0,s={query:this.getRequiredString(e,"query"),limit:this.getOptionalNumber(e,"limit"),memory_type:this.getOptionalMemoryType(e),keywords:this.getOptionalStringArray(e,"keywords"),keyword_mode:i,scope:r};if(r==="children")return await this.memoryStore.searchMemory(s);const o=await this.searchOwnMemories(s);if(r==="own")return o;const a=await this.memoryStore.searchMemory({...s,scope:"children"});return this.mergeSearchResults(o,a,s.limit)}async searchOwnMemories(e){return await this.memoryStore.searchMemory(e)}mergeSearchResults(e,t,r){const n=new Set,i=typeof r=="number"&&r>0?r:10,s=[...e.results,...t.results].filter(o=>{const a=o.uri;return n.has(a)?!1:(n.add(a),!0)}).sort((o,a)=>a.updatedAt.localeCompare(o.updatedAt)).slice(0,i);return{query:e.query||t.query,results:s}}async handleListMemories(e){const t=this.getRequiredString(e,"memory_type"),r=this.getOptionalNumber(e,"offset"),n=this.getOptionalNumber(e,"limit"),i=Math.max(0,Math.floor(r??0)),s=n!==void 0&&n>=1?Math.floor(n):Pe,o=await this.memoryStore.listByType(t),a=o.length,l=o.slice(i,i+s);return{memory_type:t,total:a,offset:i,limit:s,has_more:i+s<a,memories:l}}async handleGetMemoryStats(e){const t=await this.memoryStore.getStats(),r=this.getOptionalMemoryType(e);return r?{memory_type:r,total:t.by_type[r].count,by_type:{[r]:t.by_type[r]}}:t}async handleListMemoriesByFile(e){const t=this.getRequiredString(e,"file_path"),r=this.normalizeBoundFilePath(t),n=this.getOptionalMemoryType(e),i=this.getOptionalString(e,"scope"),s=i==="own"||i==="children"?i:"all",o=async()=>await this.memoryStore.listByFile(r,{memory_type:n,scope:"children"}).catch(()=>[]);if(s==="children"){const u=await o();return{file_path:r,count:u.length,memories:u.map(_=>this.toMemoryRecordWithMetadata(_))}}if(s==="own"){const u=await this.collectOwnMemoriesByFile(r,n);return{file_path:r,count:u.length,memories:u.map(_=>this.toMemoryRecordWithMetadata(_))}}const[a,l,m]=await Promise.all([this.memoryStore.listByFile(r,{memory_type:n,scope:"all"}).catch(()=>[]),this.searchChildMemoriesByFileLocal(r,n).catch(()=>[]),this.searchPeerMemoriesByFileLocal(r,n).catch(()=>[])]),p=this.mergeIdDedupe(this.mergeIdDedupe(a,l),m);return{file_path:r,count:p.length,memories:p.map(u=>this.toMemoryRecordWithMetadata(u))}}mergeIdDedupe(e,t){const r=new Set;for(const i of e)i.id&&r.add(i.id);const n=[...e];for(const i of t)i.id&&!r.has(i.id)&&(n.push(i),r.add(i.id));return n.sort((i,s)=>s.updatedAt.localeCompare(i.updatedAt)),n}async searchChildMemoriesByFileLocal(e,t){const r=process.env.AWS_WORKSPACE_PATH||process.cwd(),n=this.normalizeBoundFilePath(e),s=(n.startsWith("./")?n.substring(2):n).split("/"),o=[],a=new Set,{access:l,readdir:m,readFile:p}=await import("node:fs/promises");for(let u=s.length-1;u>=1;u--){const _=s.slice(0,u),M="./"+s.slice(u).join("/"),h=f.join(r,..._);if(h===r)continue;const d=f.join(h,".agentswork");try{await l(d)}catch{continue}const g=f.join(d,"memory","memory");let E;try{E=(await m(g,{withFileTypes:!0})).filter(S=>S.isDirectory()).map(S=>S.name)}catch{continue}for(const y of E){const S=f.join(g,y);let P;try{P=await m(S)}catch{continue}for(const w of P){if(!w.endsWith(".json"))continue;const A=f.join(S,w);let T;try{T=await p(A,"utf-8")}catch{continue}let I;try{I=JSON.parse(T)}catch{continue}if(I.by_uri)for(const[$,N]of Object.entries(I.by_uri)){if(!N)continue;const q=N.id||$;a.has(q)||t&&N.memory_type!==t||N.bound_files&&N.bound_files.length>0&&N.bound_files.some(te=>this.normalizeBoundFilePath(te)===M)&&(a.add(q),o.push({...N,uri:N.uri||$}))}}}}return o.sort((u,_)=>String(_.updatedAt??"").localeCompare(String(u.updatedAt??""))),o}async searchPeerMemoriesByFileLocal(e,t){if(!this.hasRoleName||!this.initialRoleName)return[];const r=process.env.AWS_WORKSPACE_PATH||process.cwd(),n=this.normalizeBoundFilePath(e),i=f.join(r,".agentswork","memory","memory"),{access:s,readdir:o,readFile:a}=await import("node:fs/promises");try{await s(i)}catch{return[]}let l;try{l=(await o(i,{withFileTypes:!0})).filter(_=>_.isDirectory()).map(_=>_.name)}catch{return[]}const m=[],p=new Set;for(const u of l){if(u===this.initialRoleName)continue;const _=f.join(i,u);let v;try{v=await o(_)}catch{continue}for(const M of v){if(!M.endsWith(".json"))continue;let h;try{h=JSON.parse(await a(f.join(_,M),"utf-8"))}catch{continue}if(h.by_uri)for(const[d,g]of Object.entries(h.by_uri)){if(!g)continue;const E=g.id||d;p.has(E)||g.memory_type==="project_doc_memory"&&(t&&g.memory_type!==t||g.bound_files&&g.bound_files.length>0&&g.bound_files.some(S=>this.normalizeBoundFilePath(S)===n)&&(p.add(E),m.push({...g,uri:g.uri||d,readonly:!0,source_role_name:u})))}}}return m.sort((u,_)=>String(_.updatedAt??"").localeCompare(String(u.updatedAt??""))),m}async collectOwnMemoriesByFile(e,t){return await this.memoryStore.listByFile(e,{memory_type:t})}async handleAbandonMemoryUpdate(e){const t=this.getRequiredString(e,"uri"),r=this.getOptionalMemoryType(e),n=await this.memoryStore.readMemory({uri:t,memory_type:r});return n?.bound_files&&n.bound_files.length>0&&await this.validateBoundFilesExist(n.bound_files),await this.memoryStore.releaseMemoryClaim(t),n?.memory_type==="project_doc_memory"&&this.backupProjectMemoryToLocal({uri:t,memory_type:"project_doc_memory"}).catch(i=>{c.info(`[McpServer] abandon_memory_update: \u540C\u6B65\u672C\u5730\u5907\u4EFD\u5931\u8D25: ${t}`,i)}),this.activeLeaseUris.delete(t),this.activeLeaseUris.size===0&&this.stopLeaseRenewal(),{success:!0,uri:t,message:"Memory \u66F4\u65B0\u72B6\u6001\u5DF2\u6E05\u9664"}}async handleMemoryRecurrence(e){const t=Math.max(1,e?.limit??10);try{((await this.memoryStore.markExpiredMemoriesRecalling()).uris?.length??0)>0&&this.startLeaseRenewal()}catch(a){c.warn("[McpServer] \u539F\u5B50\u8BA4\u9886\u8FC7\u671F\u8BB0\u5FC6\u5931\u8D25: %s",a instanceof Error?a.message:String(a))}const r=await this.memoryStore.listExpiredRecentlyMemories();if(r.length===0)return{memories:[],count:0,limit:t,remaining:0,totalExpired:0,message:"\u6CA1\u6709\u5F85\u56DE\u5FC6\u7684\u5373\u5C06\u9057\u5FD8\u8BB0\u5FC6\u3002"};const i=[...r].sort((a,l)=>{const m=new Date(a.expiresAt||a.createdAt||0).getTime(),p=new Date(l.expiresAt||l.createdAt||0).getTime();return m-p}).slice(0,t),s=Math.max(0,r.length-i.length);return{memories:i.map(a=>({uri:a.uri,title:a.title,domain:a.domain,path:a.path,memory_status:"recalling",contentPreview:typeof a.content=="string"&&a.content.length>200?a.content.substring(0,200)+"...":a.content,createdAt:a.createdAt,updatedAt:a.updatedAt})),count:i.length,limit:t,remaining:s,totalExpired:r.length,message:s>0?`\u672C\u6B21\u5904\u7406 ${i.length} \u6761\u5373\u5C06\u9057\u5FD8\u7684\u8BB0\u5FC6\uFF08\u6700\u65E9\u8FC7\u671F\u4F18\u5148\uFF09\uFF0C\u5269\u4F59 ${s} \u6761\u5F85\u5904\u7406\u3002
6
6
  \u8BF7\u5BA1\u67E5\u540E\u51B3\u5B9A\uFF08update_memory \u7EED\u671F\u5237\u65B0 24h TTL / \u4E0D\u5904\u7406\uFF09\uFF0C
@@ -18,7 +18,7 @@ MCP \u5DE5\u5177\uFF08poll_message/get_message\uFF09\u4E0D\u518D\u8FD4\u56DE sys
18
18
 
19
19
  ## \u8FD4\u56DE\u5B57\u6BB5
20
20
  targetAgentId\u3001isSelf\u3001events[]\uFF08index\u3001timestamp\u3001category\u3001status\u3001actionType\u3001actionLabel\u3001actionDetail\u3001parentId\u3001sourceEventType\uFF09\u3001hasMore\u3001nextBeforeIndex\u3001nextSinceIndex\u3001limit\u3002
21
- \u4E8B\u4EF6\u53EA\u542B\u6458\u8981\uFF08\u4E0D\u542B\u5DE5\u5177\u8FD4\u56DE\u6570\u636E\u4E0E\u547D\u4EE4\u8F93\u51FA\u539F\u6587\uFF09\u3002actionDetail \u5F62\u5982\u300Cagents-work-studio/read_file\u300D\u8FD9\u7C7B\u300CMCP\u670D\u52A1\u5668/\u5DE5\u5177\u540D\u300D\uFF0CparentId \u975E\u7A7A\u8868\u793A\u8BE5\u4E8B\u4EF6\u6302\u5728\u53E6\u4E00\u4E8B\u4EF6\u4E0B\uFF08\u5982\u4E0A\u4E0B\u6587\u538B\u7F29\u5B50\u4E8B\u4EF6\uFF09\u3002`,inputSchema:{type:"object",properties:{targetAgentId:{type:"string",description:"\u76EE\u6807 Agent \u5B9E\u4F8B ID\uFF08\u6765\u81EA get_colleague \u8FD4\u56DE\u7684 id\uFF09\u3002\u4E0D\u4F20 = \u67E5\u8BE2\u81EA\u5DF1\u7684\u65F6\u95F4\u7EBF\u3002"},beforeIndex:{type:"number",description:"\u5411\u4E0A\u7FFB\u5386\u53F2\uFF1A\u53EA\u8FD4\u56DE event_index \u5C0F\u4E8E\u8BE5\u503C\u7684\u4E8B\u4EF6\uFF08\u4E0D\u5305\u542B\uFF09\u3002\u4E0B\u6B21\u4F20\u8FD4\u56DE\u7684 nextBeforeIndex\u3002"},sinceIndex:{type:"number",description:"\u589E\u91CF\u8F6E\u8BE2\uFF1A\u53EA\u8FD4\u56DE event_index \u5927\u4E8E\u7B49\u4E8E\u8BE5\u503C\u7684\u65B0\u4E8B\u4EF6\u3002\u4E0B\u6B21\u4F20\u8FD4\u56DE\u7684 nextSinceIndex\u3002"},limit:{type:"number",description:"\u6BCF\u9875\u6761\u6570\uFF0C\u9ED8\u8BA4 20\uFF0C\u6700\u5927 100\u3002"}},required:[]}},it=new Set(["list_colleague_events"]),S={name:"hire_colleague",description:"\u5411\u4EBA\u4E8B\u90E8\u53D1\u8D77\u62DB\u8058\u540C\u4E8B\u8BF7\u6C42\uFF0C\u6309\u521B\u5EFA\u89D2\u8272\u5B9E\u4F8B\u6240\u9700\u53C2\u6570\u521B\u5EFA\u65B0\u7684 Agent \u540C\u4E8B\u3002\u652F\u6301\u5355\u4E2A\u62DB\u8058\uFF08\u9876\u5C42\u76F4\u63A5\u4F20\u521B\u5EFA\u53C2\u6570\uFF09\u4E0E\u6279\u91CF\u62DB\u8058\uFF08\u4F20 items \u6570\u7EC4\uFF0C\u4E00\u6B21\u63D0\u4EA4\u591A\u4E2A\u5F85\u5BA1\u6279\u62DB\u8058\u9879\uFF0C\u7531\u5BA1\u6279\u4EBA\u9010\u9879\u6279\u51C6\u6216\u62D2\u7EDD\u540E\u7EDF\u4E00\u8FD4\u56DE\u7ED3\u679C\uFF09\u3002",inputSchema:{type:"object",properties:{projectId:{type:"string",description:"\u9879\u76EE ID\uFF0C\u4E0D\u4F20\u65F6\u7531\u670D\u52A1\u7AEF\u6309\u9ED8\u8BA4\u903B\u8F91\u5904\u7406\u3002"},roleName:{type:"string",description:"\u89D2\u8272\u540D\u3002\u4E0E newRoleName \u4E8C\u9009\u4E00\uFF0C\u4F18\u5148\u6309\u670D\u52A1\u7AEF\u73B0\u6709\u521B\u5EFA\u89C4\u5219\u5904\u7406\u3002"},newRoleName:{type:"string",description:"\u65B0\u89D2\u8272\u540D\u3002\u7528\u4E8E\u9700\u8981\u663E\u5F0F\u521B\u5EFA\u65B0\u89D2\u8272\u5B9E\u4F8B\u65F6\u4F20\u5165\u3002"},displayName:{type:"string",description:"\u65B0\u540C\u4E8B\u663E\u793A\u540D\u3002"},description:{type:"string",description:"\u65B0\u540C\u4E8B\u89D2\u8272\u63CF\u8FF0\uFF08\u7B80\u77ED\uFF0C\u7528\u4E8E\u89D2\u8272\u5217\u8868\u4E0E\u5BA1\u6279\u5361\u7247\u5C55\u793A\uFF09\u3002"},prompt:{type:"string",description:"\u65B0\u540C\u4E8B\u804C\u8D23\u8BF4\u660E\u6216\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002"},workspacePath:{type:"string",description:"\u65B0\u540C\u4E8B\u5DE5\u4F5C\u76EE\u5F55\u3002"},myYmlPath:{type:"string",description:"my.yml \u8DEF\u5F84\uFF0C\u53EF\u9009\u3002"},myYmlContent:{type:"string",description:"my.yml \u5185\u5BB9\uFF0C\u53EF\u9009\u3002"},runtimeSkillEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 skill\u3002"},runtimeMcpEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 MCP\u3002"},runtimeCcSwitchEnabledTools:{type:"string",description:"\u521D\u59CB\u5316\u542F\u7528\u7684\u5DE5\u5177\u5217\u8868 JSON \u5B57\u7B26\u4E32\u3002"},items:{type:"array",description:"\u5F85\u6279\u91CF\u62DB\u8058\u7684\u540C\u4E8B\u5217\u8868\uFF08\u53EF\u9009\uFF09\u3002\u4E0D\u4F20\u65F6\u4E3A\u5355\u4E2A\u62DB\u8058\uFF08\u4F7F\u7528\u9876\u5C42\u53C2\u6570\uFF09\uFF1B\u4F20\u6B64\u6570\u7EC4\u65F6\u4E3A\u6279\u91CF\u62DB\u8058\uFF0C\u6BCF\u4E00\u9879\u5BF9\u5E94\u4E00\u4E2A\u5F85\u5BA1\u6279\u7684\u62DB\u8058\u8BF7\u6C42\uFF0C\u9876\u5C42\u5176\u4F59\u521B\u5EFA\u53C2\u6570\u5C06\u88AB\u5FFD\u7565\u3002",items:{type:"object",properties:{roleName:{type:"string",description:"\u89D2\u8272\u540D\u3002\u4E0E newRoleName \u4E8C\u9009\u4E00\uFF0C\u4F18\u5148\u6309\u670D\u52A1\u7AEF\u73B0\u6709\u521B\u5EFA\u89C4\u5219\u5904\u7406\u3002"},newRoleName:{type:"string",description:"\u65B0\u89D2\u8272\u540D\u3002\u7528\u4E8E\u9700\u8981\u663E\u5F0F\u521B\u5EFA\u65B0\u89D2\u8272\u5B9E\u4F8B\u65F6\u4F20\u5165\u3002"},displayName:{type:"string",description:"\u65B0\u540C\u4E8B\u663E\u793A\u540D\u3002"},description:{type:"string",description:"\u65B0\u540C\u4E8B\u89D2\u8272\u63CF\u8FF0\uFF08\u7B80\u77ED\uFF0C\u7528\u4E8E\u89D2\u8272\u5217\u8868\u4E0E\u5BA1\u6279\u5361\u7247\u5C55\u793A\uFF09\u3002"},prompt:{type:"string",description:"\u65B0\u540C\u4E8B\u804C\u8D23\u8BF4\u660E\u6216\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002"},workspacePath:{type:"string",description:"\u65B0\u540C\u4E8B\u5DE5\u4F5C\u76EE\u5F55\u3002"},myYmlPath:{type:"string",description:"my.yml \u8DEF\u5F84\uFF0C\u53EF\u9009\u3002"},myYmlContent:{type:"string",description:"my.yml \u5185\u5BB9\uFF0C\u53EF\u9009\u3002"},runtimeSkillEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 skill\u3002"},runtimeMcpEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 MCP\u3002"},runtimeCcSwitchEnabledTools:{type:"string",description:"\u521D\u59CB\u5316\u542F\u7528\u7684\u5DE5\u5177\u5217\u8868 JSON \u5B57\u7B26\u4E32\u3002"}},required:["workspacePath"]},minItems:1}}}},t={type:"array",items:{type:"object",properties:{messageId:{type:"string",description:"\u88AB\u5F15\u7528\u6D88\u606F\u7684\u7A33\u5B9A ID\uFF08\u6765\u81EA\u6D88\u606F\u7684 msgId\uFF1B\u79C1\u4FE1\u4E3A\u5B57\u7B26\u4E32 id\uFF0C\u7FA4\u6D88\u606F\u4E3A\u6570\u5B57 id \u7684\u5B57\u7B26\u4E32\u5F62\u5F0F\uFF09"},senderId:{type:"string",description:"\u88AB\u5F15\u7528\u6D88\u606F\u7684\u53D1\u9001\u8005 ID\uFF08senderId\uFF09"},senderName:{type:"string",description:"\u88AB\u5F15\u7528\u6D88\u606F\u7684\u53D1\u9001\u8005\u663E\u793A\u540D\uFF08\u7528\u4E8E\u6765\u6E90\u8FA8\u8BC6\u4E0E\u5F15\u7528\u5361\u7247\u5C55\u793A\uFF09"},snapshot:{type:"string",description:"\u88AB\u5F15\u7528\u7684\u539F\u6587\u5FEB\u7167\uFF08\u53EF\u9009\uFF0C\u5EFA\u8BAE \u2264200 \u5B57\u7B26\uFF0C\u670D\u52A1\u7AEF\u4F1A\u622A\u65AD\uFF09\u3002\u5F15\u7528\u7247\u6BB5\u65F6\u5FC5\u987B\u9010\u5B57\u6458\u5F55\u88AB\u5F15\u7528\u6D88\u606F\u4E2D\u7684\u8BE5\u7247\u6BB5\u2014\u2014\u7981\u6B62\u6539\u5199\u6216\u8F6C\u8FF0\uFF0C\u524D\u7AEF\u6309\u9010\u5B57\u5339\u914D\u5728\u539F\u6D88\u606F\u91CC\u5B9A\u4F4D\u5E76\u9AD8\u4EAE\u8FD9\u6BB5\u6587\u5B57\uFF1B\u5F15\u7528\u6574\u6761\u6D88\u606F\u65F6\u586B\u539F\u6587\u5F00\u5934\u6458\u8981\u3002\u539F\u6D88\u606F\u88AB\u64A4\u56DE\u6216\u65E0\u6743\u8BFB\u53D6\u65F6\u7528\u4E8E\u964D\u7EA7\u5C55\u793A\uFF0C\u4E0D\u4F2A\u9020\u5185\u5BB9\u3002"},prefix:{type:"string",description:"\u53EF\u9009\uFF08\u226416 \u5B57\u7B26\uFF0C\u9010\u5B57\u6458\u5F55\uFF09\uFF1A\u547D\u4E2D\u7247\u6BB5\u7D27\u90BB\u7684\u524D\u6587\u3002\u8BE5\u7247\u6BB5\u5728\u539F\u6D88\u606F\u4E2D\u591A\u6B21\u51FA\u73B0\u65F6\uFF08\u5982\u4E24\u4E2A\u300C\u4F60\u597D\u300D\uFF09\uFF0C\u7528\u4E8E\u7CBE\u786E\u5B9A\u4F4D\u4F60\u5F15\u7528\u7684\u662F\u54EA\u4E00\u6B21\uFF1B\u7701\u7565\u5219\u805A\u7126\u9996\u6B21\u51FA\u73B0\u3002"},suffix:{type:"string",description:"\u53EF\u9009\uFF08\u226416 \u5B57\u7B26\uFF0C\u9010\u5B57\u6458\u5F55\uFF09\uFF1A\u547D\u4E2D\u7247\u6BB5\u7D27\u90BB\u7684\u540E\u6587\uFF0C\u4E0E prefix \u914D\u5408\u5B9A\u4F4D\uFF08\u7247\u6BB5\u4F4D\u4E8E\u6D88\u606F\u5F00\u5934\u6CA1\u6709\u524D\u6587\u65F6\u9760 suffix \u6D88\u6B67\u4E49\uFF09\uFF1B\u7701\u7565\u5219\u805A\u7126\u9996\u6B21\u51FA\u73B0\u3002"},pos:{type:"number",description:"\u53EF\u9009\uFF08\u975E\u8D1F\u6574\u6570\uFF09\uFF1A\u5F15\u7528\u5361\u7247\u5728\u672C\u6D88\u606F\u6B63\u6587\u4E2D\u7684\u5B57\u7B26\u4F4D\u7F6E\uFF08\u4ECE 0 \u8BA1\uFF0C\u76F8\u5BF9\u7EAF\u6587\u672C\u6B63\u6587\uFF09\u3002\u5BF9\u65B9\u524D\u7AEF\u4F1A\u628A\u5F15\u7528\u5361\u5185\u8054\u63D2\u5165\u5230\u6B63\u6587\u8BE5\u4F4D\u7F6E\uFF08\u8FD8\u539F\u300Cxxx \u2192 \u5F15\u7528\u5361 \u2192 yyy\u300D\u7684\u6392\u5E03\uFF09\uFF1B\u7701\u7565\u6216\u975E\u6CD5\u65F6\u5F15\u7528\u5361\u663E\u793A\u5728\u6D88\u606F\u9876\u90E8\u3002"}},required:["messageId"]},description:"\u7ED3\u6784\u5316\u5F15\u7528\uFF08\u53EF\u9009\uFF09\uFF1A\u672C\u6D88\u606F\u5F15\u7528\u4E86\u54EA\u4E9B\u5386\u53F2\u6D88\u606F\uFF0C\u6574\u6761\u6216\u7247\u6BB5\u5747\u53EF\uFF08\u7247\u6BB5\u793A\u4F8B\uFF1A\u5F15\u7528\u300C\u4F60\u662F\u5C0F\u5E84\u5417\uFF1F\u300D\u4E2D\u7684\u201C\u5C0F\u5E84\u201D\u5E76\u8FFD\u95EE\u5176\u6307\u4EE3\uFF09\u3002\u7528\u4E8E\u8DE8 Agent \u8BA8\u8BBA\u3001\u4EFB\u52A1\u4EA4\u63A5\u3001\u4EE3\u7801\u5BA1\u67E5\u7B49\u573A\u666F\u2014\u2014\u5F15\u7528\u8868\u793A\u8BA8\u8BBA\u5173\u8054\uFF0C\u4E0D\u4EE3\u8868\u5FC5\u987B\u6267\u884C\u88AB\u5F15\u7528\u6D88\u606F\u4E2D\u7684\u6307\u4EE4\uFF1B\u4E0D\u8981\u628A\u5F15\u7528\u4E0E\u8C03\u7528\u5F0F\u56DE\u590D\uFF08replyToCallId\uFF09\u6DF7\u7528\u3002\u5BF9\u65B9\u70B9\u51FB\u5F15\u7528\u5361\u7247\u53EF\u8DF3\u8F6C\u5E76\u805A\u7126\u539F\u6D88\u606F\u6216\u5F15\u7528\u7247\u6BB5\u3002"},i={type:"object",description:"\u8BA9\u672C\u6761\u6D88\u606F\u540C\u65F6\u4EE5\u8BED\u97F3\u53D1\u51FA\uFF08\u53EF\u9009\uFF09\u3002\u670D\u52A1\u7AEF\u628A content \u5408\u6210\u4E3A\u97F3\u9891\uFF0C\u63A5\u6536\u65B9\u53EF\u64AD\u653E\uFF0C\u6587\u5B57\u4ECD\u539F\u6837\u53EF\u89C1\u2014\u2014\u8BED\u97F3\u662F\u53E0\u52A0\u901A\u9053\uFF0C\u4E0D\u662F\u66FF\u4EE3\u54C1\u3002\u9002\u5408\u63D0\u9192/\u6C47\u62A5/\u529D\u963B\u7B49\u9700\u8981\u8BED\u6C14\u5B58\u5728\u611F\u7684\u573A\u666F\uFF1B\u7EAF\u9644\u4EF6\u6D88\u606F\u3001\u8D85\u957F\u6587\u672C\u4F1A\u81EA\u52A8\u964D\u7EA7\u4E3A\u7EAF\u6587\u5B57\u5E76\u5728\u7ED3\u679C\u91CC\u56DE\u62A5\u539F\u56E0\uFF08voice.ok=false + reason\uFF09\u3002",properties:{emotion:{type:"string",enum:["neutral","happy","excited","calm","sad","serious"],description:"\u60C5\u7EEA\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 neutral\uFF09\u3002\u53EA\u5F71\u54CD\u8BED\u901F\u4E0E\u53E5\u95F4\u505C\u987F\uFF1Ahappy \u8F7B\u5FEB\u3001excited \u6025\u4FC3\u6709\u529B\u3001calm \u8212\u7F13\u3001sad \u4F4E\u6C89\u3001serious \u90D1\u91CD\u3002\u4E0D\u8981\u4E3A\u666E\u901A\u6C47\u62A5\u5F3A\u52A0\u60C5\u7EEA\uFF0C\u62FF\u4E0D\u51C6\u5C31\u7528 neutral\u3002"},speaker:{type:"string",description:"\u97F3\u8272 id\uFF08\u53EF\u9009\uFF0C\u975E\u8D1F\u6574\u6570\uFF09\u3002\u4E0D\u4F20\u65F6\u6309\u4F60\u7684\u8EAB\u4EFD\u81EA\u52A8\u5206\u914D\u4E00\u4E2A\u56FA\u5B9A\u97F3\u8272\u2014\u2014\u540C\u4E00 agent \u6BCF\u6B21\u8BF4\u8BDD\u97F3\u8272\u4E00\u81F4\uFF0C\u4E0D\u540C agent \u58F0\u97F3\u4E0D\u540C\u3002\u901A\u5E38\u4E0D\u9700\u8981\u4F20\u3002"}}},L={name:"send_group",description:"\u5411\u7FA4\u804A\u53D1\u9001\u6D88\u606F\uFF0C\u6240\u6709\u5728\u7EBF\u53C2\u4E0E\u8005\u90FD\u80FD\u6536\u5230\u3002\u9ED8\u8BA4\u53D1\u5230\u9879\u76EE\u516C\u5171\u7FA4\u804A\uFF08\u5168\u9879\u76EE\u53EF\u89C1\uFF09\uFF0C\u56E0\u6B64\u52A1\u5FC5\u5148\u9009\u597D\u76EE\u6807\u7FA4\uFF1A\u5148\u7528 get_group_rooms \u67E5\u770B\u53EF\u53D1\u73B0\u7684\u7FA4\u7EC4\uFF0C\u4F18\u5148\u9009\u62E9\u80FD\u8986\u76D6\u76EE\u6807\u53D7\u4F17\u7684\u6700\u5C0F\u7FA4\u7EC4\u2014\u2014\u53EA\u6D89\u53CA\u67D0\u4E2A\u5C0F\u7EC4/\u56E2\u961F\u65F6\uFF0C\u5FC5\u987B\u4F20\u8BE5\u5C0F\u7EC4\u7FA4\u7684 roomId\uFF08roomType=inner_group\uFF09\u53D1\u5230\u5C0F\u7EC4\u7FA4\uFF0C\u4E0D\u8981\u9ED8\u8BA4\u53D1\u5230\u9879\u76EE\u516C\u5171\u7FA4\uFF1B\u53EA\u6709\u786E\u5B9E\u8981\u901A\u77E5\u5168\u9879\u76EE\u65F6\u624D\u53D1\u516C\u5171\u7FA4\u804A\uFF08\u4E0D\u4F20 roomId\uFF09\u3002\u56DE\u590D\u7FA4\u6D88\u606F\u65F6\u5EFA\u8BAE\u4F20\u5165\u6D88\u606F\u4E2D\u7684 projectId \u4E0E roomId\uFF0C\u786E\u4FDD\u56DE\u590D\u5230\u6B63\u786E\u7684\u7FA4\u804A\u3002\u652F\u6301\u53D1\u9001 pencil/draw/office \u5361\u7247\uFF08pencil/draw \u6587\u6863\u5176\u4ED6 Agent \u62FF\u5230 docId \u5373\u53EF\u8BFB\u53D6\uFF1Boffice \u6587\u4EF6\u5361\u7247\u7528 card.filePath\uFF08\u5DE5\u4F5C\u533A\u6587\u6863\uFF09\u6216 card.docId\uFF08\u4E91\u6587\u6863\uFF09\u6307\u5B9A\u6587\u4EF6\uFF0C\u53D1\u9001\u524D\u4F1A\u6821\u9A8C\u6587\u4EF6\u5B58\u5728/\u4E91\u6587\u6863\u6709\u6548\uFF09\u3002\u53EF\u4F20 voice \u8BA9\u672C\u6761\u540C\u65F6\u4EE5\u8BED\u97F3\u53D1\u51FA\uFF08\u6587\u5B57\u4ECD\u539F\u6837\u53EF\u89C1\uFF09\u3002",inputSchema:{type:"object",properties:{content:{type:"string",description:'\u6D88\u606F\u5185\u5BB9\u3002\u7EAF\u53D1\u9001\u6587\u4EF6\u65F6\u4F20\u7A7A\u5B57\u7B26\u4E32\uFF08content \u4E0E attachments \u81F3\u5C11\u5176\u4E00\u975E\u7A7A\uFF09\u3002\u4F20\u4E86 voice \u65F6\u8FD9\u6BB5\u6587\u5B57\u4E5F\u4F1A\u88AB\u5FF5\u51FA\u6765\u2014\u2014\u652F\u6301 <break time="600ms"/> \u63A7\u5236\u505C\u987F\uFF0C\u4F46\u8BF7\u4F20\u81EA\u7136\u53E3\u8BED\uFF08\u4E66\u9762\u957F\u53E5\u542C\u611F\u5F88\u5DEE\uFF09\uFF0C\u4E14\u4E0D\u8981\u8D85\u8FC7 600 \u5B57\u3002'},projectId:{type:"string",description:"\u76EE\u6807\u9879\u76EE ID\uFF08\u53EF\u9009\uFF09\u3002\u4E0D\u4F20\u5219\u4F7F\u7528 Agent \u6240\u5C5E\u9879\u76EE\uFF08\u7531\u670D\u52A1\u7AEF\u51B3\u5B9A\uFF09\u3002\u56DE\u590D\u7FA4\u6D88\u606F\u65F6\u5E94\u4F20\u5165\u6D88\u606F\u4E2D\u7684 projectId\uFF0C\u786E\u4FDD\u56DE\u590D\u5230\u6B63\u786E\u7684\u9879\u76EE\u7FA4\u804A\u3002"},roomId:{type:"string",description:"\u76EE\u6807\u7FA4\u804A\u623F\u95F4 ID\uFF08\u53EF\u9009\uFF09\u3002\u4E0D\u4F20\u5219\u53D1\u5230\u9879\u76EE\u516C\u5171\u7FA4\u804A\uFF08\u5168\u9879\u76EE\u53EF\u89C1\uFF09\u3002\u9009\u62E9\u6700\u5C0F\u7FA4\u7EC4\uFF1A\u6D88\u606F\u53EA\u6D89\u53CA\u67D0\u4E2A\u5C0F\u7EC4/\u56E2\u961F\u65F6\uFF0C\u5FC5\u987B\u4F20\u8BE5\u5C0F\u7EC4\u7FA4\u7684 roomId\uFF08\u6765\u81EA get_group_rooms \u7684 inner_group \u7FA4\u7EC4\u6216\u7FA4\u6D88\u606F\u4E2D\u7684 roomId\uFF09\uFF0C\u907F\u514D\u628A\u5C0F\u7EC4\u6D88\u606F\u8BEF\u53D1\u5230\u9879\u76EE\u516C\u5171\u7FA4\uFF1B\u53EA\u6709\u9700\u8981\u901A\u77E5\u5168\u9879\u76EE\u65F6\u624D\u7701\u7565 roomId\u3002\u56DE\u590D\u7FA4\u6D88\u606F\u65F6\u5E94\u4F20\u5165\u8BE5\u6D88\u606F\u7684 roomId\u3002"},attachments:{type:"array",items:{type:"string"},description:"\u968F\u6D88\u606F\u53D1\u9001\u7684\u6587\u4EF6\u8DEF\u5F84\u5217\u8868\uFF08\u53EF\u9009\uFF09\u3002\u652F\u6301\u5DE5\u4F5C\u533A\u5185\u76F8\u5BF9\u8DEF\u5F84\uFF08\u5982 report.xlsx\u3001docs/\u62A5\u544A.pdf\uFF09\u6216\u672C\u673A\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u53EF\u4E3A\u5DE5\u4F5C\u533A\u5916\u6587\u4EF6\uFF0C\u5982 D:/tmp/data.zip\uFF09\uFF0C\u6587\u4EF6\u5C06\u88AB\u4E0A\u4F20\u5E76\u4EE5\u6587\u4EF6\u94FE\u63A5\u5F62\u5F0F\u9644\u5728\u6D88\u606F\u4E2D\uFF0C\u63A5\u6536\u65B9\u53EF\u901A\u8FC7\u94FE\u63A5\u4E0B\u8F7D\u3002\u5355\u4E2A\u6587\u4EF6\u9ED8\u8BA4\u4E0D\u8D85\u8FC7 200MB\uFF08\u53D7\u670D\u52A1\u7AEF AWS_FILE_MAX_SIZE_BYTES \u7EA6\u675F\uFF09\u3002"},card:{type:"object",description:'\u5361\u7247\uFF1A\u6587\u6863/\u6587\u4EF6\u5F15\u7528\uFF08\u53EF\u9009\uFF09\u3002pencil/draw \u4F20 {type, docId}\uFF0C\u53D1\u9001\u540E\u5176\u4ED6 Agent \u62FF\u5230 docId \u5373\u53EF\u7528 pencil_get_tree/draw_get_diagram \u8BFB\u53D6\uFF0C\u65E0\u9700\u9080\u8BF7\uFF1Boffice \u4F20 {type:"office", filePath} \u6216 {type:"office", docId}\uFF08\u4E8C\u9009\u4E00\uFF0C\u4E0D\u53EF\u540C\u65F6\u4F20\uFF09\uFF0C\u628A Office \u6587\u6863\uFF08docx/xlsx/pptx\uFF09\u4F5C\u4E3A\u53EF\u4E0B\u8F7D+\u53EF\u5728\u7EBF\u9884\u89C8\u7684\u6587\u4EF6\u5361\u7247\u53D1\u9001\u3002filePath \u4E3A\u5DE5\u4F5C\u533A\u6587\u6863\u8DEF\u5F84\uFF08\u53D1\u9001\u524D\u6821\u9A8C\u6587\u4EF6\u5B58\u5728\u5E76\u4E0A\u4F20\uFF0C\u4E0D\u5B58\u5728\u5219\u53D1\u9001\u5931\u8D25\uFF09\uFF1BdocId \u4E3A\u4E91\u6587\u6863 id\uFF08\u53D1\u9001\u65F6\u670D\u52A1\u7AEF\u6821\u9A8C\u6709\u6548\u6027\uFF0C\u63A5\u6536\u65B9\u53EF\u76F4\u63A5\u5728 Office \u9762\u677F\u6253\u5F00\uFF09\uFF1B\u4E0D\u8981\u4F20 fileUrl/previewUrl\uFF1A\u6587\u4EF6\u5730\u5740\u4E0E\u5728\u7EBF\u9884\u89C8\u5730\u5740\u5747\u7531\u670D\u52A1\u7AEF\u6821\u9A8C/\u751F\u6210\u3002',properties:{type:{type:"string",enum:["pencil","draw","office"],description:"\u5361\u7247\u7C7B\u578B\uFF1Apencil \u8BBE\u8BA1\u753B\u5E03\u3001draw \u7ED8\u56FE\u6587\u6863 \u6216 office \u6587\u4EF6\uFF08Office \u6587\u6863\u4EE5\u6587\u4EF6\u5361\u7247\u5206\u4EAB\uFF09"},docId:{type:"string",description:"\u6587\u6863 ID\uFF1Apencil/draw \u5361\u7247\u5FC5\u586B\uFF08\u6765\u81EA pencil_create_document/draw_create_document \u6216 list \u5DE5\u5177\uFF09\uFF1Boffice \u5361\u7247\u4E0E filePath \u4E8C\u9009\u4E00\uFF08\u4E91\u6587\u6863 id\uFF0C\u5982 od-xxx\uFF0C\u53D1\u9001\u65F6\u670D\u52A1\u7AEF\u6821\u9A8C\u6709\u6548\u6027\uFF09"},filePath:{type:"string",description:"Office \u5361\u7247\u4E0E docId \u4E8C\u9009\u4E00\uFF1A\u5DE5\u4F5C\u533A Office \u6587\u6863\u8DEF\u5F84\uFF08\u5982 report.docx\uFF09\uFF0C\u53D1\u9001\u524D\u6821\u9A8C\u6587\u4EF6\u5B58\u5728\u5E76\u4E0A\u4F20\uFF0C\u4E0D\u5B58\u5728\u5219\u53D1\u9001\u5931\u8D25"},title:{type:"string",description:"\u5361\u7247\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u53D6\u6587\u6863\u540D\u79F0\uFF09"},description:{type:"string",description:"\u5361\u7247\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09"}},required:["type"]},replyTo:t,voice:i},required:["content"]}},A={name:"send_private",description:'\u53D1\u9001\u79C1\u4FE1\u7ED9\u6307\u5B9A\u7528\u6237\u3002\u652F\u6301\u4E24\u79CD\u6A21\u5F0F\uFF1A\u901A\u77E5\u5F0F\uFF08waitReply=false\uFF09\u548C\u8C03\u7528\u5F0F\uFF08waitReply=true\uFF0C\u963B\u585E\u7B49\u5F85\u56DE\u590D\uFF09\u3002\u652F\u6301\u53D1\u9001 pencil/draw/office \u5361\u7247\uFF08pencil/draw \u6587\u6863\u5176\u4ED6 Agent \u62FF\u5230 docId \u5373\u53EF\u8BFB\u53D6\uFF1Boffice \u6587\u4EF6\u5361\u7247\u7528 card.filePath\uFF08\u5DE5\u4F5C\u533A\u6587\u6863\uFF09\u6216 card.docId\uFF08\u4E91\u6587\u6863\uFF09\u6307\u5B9A\u6587\u4EF6\uFF0C\u53D1\u9001\u524D\u4F1A\u6821\u9A8C\u6587\u4EF6\u5B58\u5728/\u4E91\u6587\u6863\u6709\u6548\uFF09\u3002\u53D1\u73B0\u540C\u4E8B\u6B63\u5728\u505A\u9519\u65B9\u5411\u3001\u5FC5\u987B\u7ACB\u523B\u7EA0\u6B63\u65F6\u53EF\u4F20 priority:"force" \u53D1\u9001\u5F3A\u5236\u6D88\u606F\uFF1A\u5BF9\u65B9 runtime \u4F1A\u5728\u4E0B\u4E00\u4E2A\u8FED\u4EE3\u8FB9\u754C\u628A\u6D88\u606F\u76F4\u63A5\u6CE8\u5165\u5BF9\u8BDD\uFF0C\u65E0\u9700\u7B49\u5176\u8F6E\u8BE2\u3002force \u5FC5\u987B\u643A\u5E26 ref\uFF08\u5F15\u7528\u7684\u4EFB\u52A1/\u8282\u70B9/\u6D88\u606F\uFF09\u8BF4\u660E\u4F9D\u636E\uFF0C\u5E76\u53D7\u51B7\u5374\u4E0E\u914D\u989D\u7EA6\u675F\uFF1B\u8D85\u9650\u4F1A\u964D\u7EA7\u4E3A\u666E\u901A\u6D88\u606F\u5E76\u5728\u7ED3\u679C\u91CC\u8FD4\u56DE degraded + degradeReason\u3002\u53EF\u4F20 voice \u8BA9\u672C\u6761\u540C\u65F6\u4EE5\u8BED\u97F3\u53D1\u51FA\uFF08\u6587\u5B57\u4ECD\u539F\u6837\u53EF\u89C1\uFF09\u3002',inputSchema:{type:"object",properties:{targetId:{type:"string",description:"\u76EE\u6807\u7528\u6237ID"},content:{type:"string",description:'\u6D88\u606F\u5185\u5BB9\u3002\u7EAF\u53D1\u9001\u6587\u4EF6\u65F6\u4F20\u7A7A\u5B57\u7B26\u4E32\uFF08content \u4E0E attachments \u81F3\u5C11\u5176\u4E00\u975E\u7A7A\uFF09\u3002\u4F20\u4E86 voice \u65F6\u8FD9\u6BB5\u6587\u5B57\u4E5F\u4F1A\u88AB\u5FF5\u51FA\u6765\u2014\u2014\u652F\u6301 <break time="600ms"/> \u63A7\u5236\u505C\u987F\uFF0C\u4F46\u8BF7\u4F20\u81EA\u7136\u53E3\u8BED\uFF08\u4E66\u9762\u957F\u53E5\u542C\u611F\u5F88\u5DEE\uFF09\uFF0C\u4E14\u4E0D\u8981\u8D85\u8FC7 600 \u5B57\u3002'},waitReply:{type:"boolean",description:"\u662F\u5426\u7B49\u5F85\u5BF9\u65B9\u56DE\u590D\uFF08\u8C03\u7528\u5F0F\uFF09\u3002\u4E3Atrue\u65F6\u4F1A\u963B\u585E\u7B49\u5F85\u56DE\u590D\uFF0C\u9ED8\u8BA4\u6C38\u4E45\u963B\u585E\u76F4\u5230\u6536\u5230\u56DE\u590D"},replyToCallId:{type:"string",description:"\u56DE\u590D\u7684\u8C03\u7528ID\uFF1A\u4EC5\u5F53\u88AB\u56DE\u590D\u6D88\u606F\u7684 requireReply=true \u65F6\uFF0C\u4F20\u8BE5\u6D88\u606F\u7684 callId \u5B57\u6BB5\uFF08\u4E0D\u662F msgId\uFF09\u3002\u666E\u901A\u6D88\u606F\u6CA1\u6709 callId\uFF0C\u4E0D\u8981\u4F20 msgId\uFF1B\u8981\u5F15\u7528\u666E\u901A\u6D88\u606F\u8BF7\u7528 replyTo\uFF08messageId \u4F20 msgId\uFF09\u3002\u4F20\u5165\u65E0\u6548\u7684 replyToCallId \u4F1A\u88AB\u670D\u52A1\u7AEF\u964D\u7EA7\u4E3A\u666E\u901A\u79C1\u4FE1\u5E76\u8FD4\u56DE warning\u3002"},timeoutMs:{type:"number",description:"\u7B49\u5F85\u56DE\u590D\u7684\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF0C\u53EF\u9009\uFF09\u3002\u672A\u6307\u5B9A\u6216\u22640\u65F6\u6C38\u4E45\u963B\u585E\u7B49\u5F85\uFF0C>0\u65F6\u6309\u6307\u5B9A\u65F6\u95F4\u8D85\u65F6"},attachments:{type:"array",items:{type:"string"},description:"\u968F\u6D88\u606F\u53D1\u9001\u7684\u6587\u4EF6\u8DEF\u5F84\u5217\u8868\uFF08\u53EF\u9009\uFF09\u3002\u652F\u6301\u5DE5\u4F5C\u533A\u5185\u76F8\u5BF9\u8DEF\u5F84\uFF08\u5982 report.xlsx\u3001docs/\u62A5\u544A.pdf\uFF09\u6216\u672C\u673A\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u53EF\u4E3A\u5DE5\u4F5C\u533A\u5916\u6587\u4EF6\uFF0C\u5982 D:/tmp/data.zip\uFF09\uFF0C\u6587\u4EF6\u5C06\u88AB\u4E0A\u4F20\u5E76\u4EE5\u6587\u4EF6\u94FE\u63A5\u5F62\u5F0F\u9644\u5728\u6D88\u606F\u4E2D\uFF0C\u63A5\u6536\u65B9\u53EF\u901A\u8FC7\u94FE\u63A5\u4E0B\u8F7D\u3002\u5355\u4E2A\u6587\u4EF6\u9ED8\u8BA4\u4E0D\u8D85\u8FC7 200MB\uFF08\u53D7\u670D\u52A1\u7AEF AWS_FILE_MAX_SIZE_BYTES \u7EA6\u675F\uFF09\u3002"},card:{type:"object",description:'\u5361\u7247\uFF1A\u6587\u6863/\u6587\u4EF6\u5F15\u7528\uFF08\u53EF\u9009\uFF09\u3002pencil/draw \u4F20 {type, docId}\uFF0C\u53D1\u9001\u540E\u5176\u4ED6 Agent \u62FF\u5230 docId \u5373\u53EF\u7528 pencil_get_tree/draw_get_diagram \u8BFB\u53D6\uFF0C\u65E0\u9700\u9080\u8BF7\uFF1Boffice \u4F20 {type:"office", filePath} \u6216 {type:"office", docId}\uFF08\u4E8C\u9009\u4E00\uFF0C\u4E0D\u53EF\u540C\u65F6\u4F20\uFF09\uFF0C\u628A Office \u6587\u6863\uFF08docx/xlsx/pptx\uFF09\u4F5C\u4E3A\u53EF\u4E0B\u8F7D+\u53EF\u5728\u7EBF\u9884\u89C8\u7684\u6587\u4EF6\u5361\u7247\u53D1\u9001\u3002filePath \u4E3A\u5DE5\u4F5C\u533A\u6587\u6863\u8DEF\u5F84\uFF08\u53D1\u9001\u524D\u6821\u9A8C\u6587\u4EF6\u5B58\u5728\u5E76\u4E0A\u4F20\uFF0C\u4E0D\u5B58\u5728\u5219\u53D1\u9001\u5931\u8D25\uFF09\uFF1BdocId \u4E3A\u4E91\u6587\u6863 id\uFF08\u53D1\u9001\u65F6\u670D\u52A1\u7AEF\u6821\u9A8C\u6709\u6548\u6027\uFF0C\u63A5\u6536\u65B9\u53EF\u76F4\u63A5\u5728 Office \u9762\u677F\u6253\u5F00\uFF09\uFF1B\u4E0D\u8981\u4F20 fileUrl/previewUrl\uFF1A\u6587\u4EF6\u5730\u5740\u4E0E\u5728\u7EBF\u9884\u89C8\u5730\u5740\u5747\u7531\u670D\u52A1\u7AEF\u6821\u9A8C/\u751F\u6210\u3002',properties:{type:{type:"string",enum:["pencil","draw","office"],description:"\u5361\u7247\u7C7B\u578B\uFF1Apencil \u8BBE\u8BA1\u753B\u5E03\u3001draw \u7ED8\u56FE\u6587\u6863 \u6216 office \u6587\u4EF6\uFF08Office \u6587\u6863\u4EE5\u6587\u4EF6\u5361\u7247\u5206\u4EAB\uFF09"},docId:{type:"string",description:"\u6587\u6863 ID\uFF1Apencil/draw \u5361\u7247\u5FC5\u586B\uFF08\u6765\u81EA pencil_create_document/draw_create_document \u6216 list \u5DE5\u5177\uFF09\uFF1Boffice \u5361\u7247\u4E0E filePath \u4E8C\u9009\u4E00\uFF08\u4E91\u6587\u6863 id\uFF0C\u5982 od-xxx\uFF0C\u53D1\u9001\u65F6\u670D\u52A1\u7AEF\u6821\u9A8C\u6709\u6548\u6027\uFF09"},filePath:{type:"string",description:"Office \u5361\u7247\u4E0E docId \u4E8C\u9009\u4E00\uFF1A\u5DE5\u4F5C\u533A Office \u6587\u6863\u8DEF\u5F84\uFF08\u5982 report.docx\uFF09\uFF0C\u53D1\u9001\u524D\u6821\u9A8C\u6587\u4EF6\u5B58\u5728\u5E76\u4E0A\u4F20\uFF0C\u4E0D\u5B58\u5728\u5219\u53D1\u9001\u5931\u8D25"},title:{type:"string",description:"\u5361\u7247\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u53D6\u6587\u6863\u540D\u79F0\uFF09"},description:{type:"string",description:"\u5361\u7247\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09"}},required:["type"]},replyTo:t,voice:i,priority:{type:"string",enum:["normal","force"],description:"\u6D88\u606F\u7B49\u7EA7\u3002normal\uFF08\u9ED8\u8BA4\uFF09= \u666E\u901A\u6D88\u606F\uFF0C\u7B49\u5BF9\u65B9\u8F6E\u8BE2\uFF1Bforce = \u5F3A\u5236\u6D88\u606F\uFF0C\u5BF9\u65B9 runtime \u5728\u4E0B\u4E00\u4E2A\u8FED\u4EE3\u8FB9\u754C\u7ACB\u5373\u6CE8\u5165\u5BF9\u8BDD\uFF08\u7528\u4E8E\u7D27\u6025\u7EA0\u504F\uFF1A\u907F\u514D\u5BF9\u65B9\u628A\u9519\u8BEF\u65B9\u5411\u505A\u5B8C\u624D\u6536\u5230\u7EA0\u6B63\uFF09\u3002force \u5FC5\u987B\u540C\u65F6\u4F20 ref\uFF0C\u4E14\u540C\u4E00\u63A5\u6536\u65B9\u6709\u51B7\u5374\uFF08\u9ED8\u8BA4 60s \u4E00\u6761\uFF09\u3001\u53D1\u9001\u65B9\u6709\u914D\u989D\uFF08\u9ED8\u8BA4 10 \u6761/\u5206\u949F\uFF09\uFF1B\u8D85\u9650\u81EA\u52A8\u964D\u7EA7\u4E3A\u666E\u901A\u6D88\u606F\u5E76\u5728\u7ED3\u679C\u4E2D\u8FD4\u56DE degraded + degradeReason\u3002waitReply=true \u7684\u8C03\u7528\u5F0F\u6D88\u606F\u672C\u8EAB\u5C31\u4F1A\u5524\u9192\u5BF9\u65B9\uFF0C\u4E0D\u9700\u8981\u4E5F\u4E0D\u652F\u6301 force\u3002"},intent:{type:"string",enum:["stop","redirect","constraint"],description:"\u5F3A\u5236\u6D88\u606F\u610F\u56FE\uFF08\u4EC5 priority=force \u65F6\u6709\u610F\u4E49\uFF09\uFF1Astop \u7ACB\u5373\u505C\u6B62\u5F53\u524D\u5DE5\u4F5C | redirect \u6539\u65B9\u5411 | constraint \u8865\u5145\u5FC5\u987B\u9075\u5B88\u7684\u7EA6\u675F\u3002\u5E2E\u52A9\u63A5\u6536\u65B9\u7406\u89E3\u4E3A\u4EC0\u4E48\u88AB\u6253\u65AD\u3002"},ref:{type:"object",description:'\u5F3A\u5236\u6D88\u606F\u7684\u4F9D\u636E\u5F15\u7528\uFF08priority=force \u65F6\u5FC5\u586B\uFF09\uFF1A\u6307\u51FA\u4F60\u5728\u7EA0\u6B63\u54EA\u4EF6\u4E8B\u3002\u81F3\u5C11\u5305\u542B\u4E0B\u5217\u4E4B\u4E00\uFF0C\u8D8A\u5177\u4F53\u8D8A\u597D\u3002\u4F8B\u5982 {"taskInstanceId":"...","nodeId":"..."} \u6216 {"messageId":"..."}\u3002\u65E0\u4F9D\u636E\u7684\u6253\u65AD\u4F1A\u88AB\u670D\u52A1\u7AEF\u964D\u7EA7\u3002',properties:{taskInstanceId:{type:"string",description:"\u4EFB\u52A1\u5B9E\u4F8B ID"},nodeId:{type:"string",description:"\u4EFB\u52A1\u8282\u70B9 ID"},messageId:{type:"string",description:"\u76F8\u5173\u79C1\u4FE1 msgId"}}},reason:{type:"string",description:"\u5F3A\u5236\u6D88\u606F\u539F\u56E0\uFF08\u4EBA\u7C7B\u53EF\u8BFB\uFF0C\u9762\u677F\u5C55\u793A\u4E0E\u5BA1\u8BA1\u7528\uFF09\uFF1A\u4E00\u53E5\u8BDD\u8BF4\u660E\u4E3A\u4EC0\u4E48\u8981\u6253\u65AD\uFF0C\u4F8B\u5982\u300C\u4EFB\u52A1 A \u7684\u9A8C\u6536\u6807\u51C6\u5DF2\u53D8\u66F4\u4E3A\u2026\u2026\uFF0C\u7EE7\u7EED\u6309\u65E7\u6807\u51C6\u4F1A\u8FD4\u5DE5\u300D\u3002"}},required:["targetId","content"]}},e=`\u6D88\u606F\u53EF\u80FD\u643A\u5E26 replyTo \u5B57\u6BB5\uFF08JSON \u6570\u7EC4 [{messageId,senderId,senderName,snapshot,prefix,suffix,pos}]\uFF09\uFF0C\u8868\u793A\u8BE5\u6D88\u606F\u5F15\u7528\u4E86\u54EA\u4E9B\u5386\u53F2\u6D88\u606F\uFF08\u8BA8\u8BBA\u5173\u8054\uFF0C\u4E0E replyToCallId \u8C03\u7528\u56DE\u6267\u65E0\u5173\uFF09\u3002
21
+ \u4E8B\u4EF6\u53EA\u542B\u6458\u8981\uFF08\u4E0D\u542B\u5DE5\u5177\u8FD4\u56DE\u6570\u636E\u4E0E\u547D\u4EE4\u8F93\u51FA\u539F\u6587\uFF09\u3002actionDetail \u5F62\u5982\u300Cagents-work-studio/read_file\u300D\u8FD9\u7C7B\u300CMCP\u670D\u52A1\u5668/\u5DE5\u5177\u540D\u300D\uFF0CparentId \u975E\u7A7A\u8868\u793A\u8BE5\u4E8B\u4EF6\u6302\u5728\u53E6\u4E00\u4E8B\u4EF6\u4E0B\uFF08\u5982\u4E0A\u4E0B\u6587\u538B\u7F29\u5B50\u4E8B\u4EF6\uFF09\u3002`,inputSchema:{type:"object",properties:{targetAgentId:{type:"string",description:"\u76EE\u6807 Agent \u5B9E\u4F8B ID\uFF08\u6765\u81EA get_colleague \u8FD4\u56DE\u7684 id\uFF09\u3002\u4E0D\u4F20 = \u67E5\u8BE2\u81EA\u5DF1\u7684\u65F6\u95F4\u7EBF\u3002"},beforeIndex:{type:"number",description:"\u5411\u4E0A\u7FFB\u5386\u53F2\uFF1A\u53EA\u8FD4\u56DE event_index \u5C0F\u4E8E\u8BE5\u503C\u7684\u4E8B\u4EF6\uFF08\u4E0D\u5305\u542B\uFF09\u3002\u4E0B\u6B21\u4F20\u8FD4\u56DE\u7684 nextBeforeIndex\u3002"},sinceIndex:{type:"number",description:"\u589E\u91CF\u8F6E\u8BE2\uFF1A\u53EA\u8FD4\u56DE event_index \u5927\u4E8E\u7B49\u4E8E\u8BE5\u503C\u7684\u65B0\u4E8B\u4EF6\u3002\u4E0B\u6B21\u4F20\u8FD4\u56DE\u7684 nextSinceIndex\u3002"},limit:{type:"number",description:"\u6BCF\u9875\u6761\u6570\uFF0C\u9ED8\u8BA4 20\uFF0C\u6700\u5927 100\u3002"}},required:[]}},it=new Set(["list_colleague_events"]),S={name:"hire_colleague",description:"\u5411\u4EBA\u4E8B\u90E8\u53D1\u8D77\u62DB\u8058\u540C\u4E8B\u8BF7\u6C42\uFF0C\u6309\u521B\u5EFA\u89D2\u8272\u5B9E\u4F8B\u6240\u9700\u53C2\u6570\u521B\u5EFA\u65B0\u7684 Agent \u540C\u4E8B\u3002\u652F\u6301\u5355\u4E2A\u62DB\u8058\uFF08\u9876\u5C42\u76F4\u63A5\u4F20\u521B\u5EFA\u53C2\u6570\uFF09\u4E0E\u6279\u91CF\u62DB\u8058\uFF08\u4F20 items \u6570\u7EC4\uFF0C\u4E00\u6B21\u63D0\u4EA4\u591A\u4E2A\u5F85\u5BA1\u6279\u62DB\u8058\u9879\uFF0C\u7531\u5BA1\u6279\u4EBA\u9010\u9879\u6279\u51C6\u6216\u62D2\u7EDD\u540E\u7EDF\u4E00\u8FD4\u56DE\u7ED3\u679C\uFF09\u3002",inputSchema:{type:"object",properties:{projectId:{type:"string",description:"\u9879\u76EE ID\uFF0C\u4E0D\u4F20\u65F6\u7531\u670D\u52A1\u7AEF\u6309\u9ED8\u8BA4\u903B\u8F91\u5904\u7406\u3002"},roleName:{type:"string",description:"\u89D2\u8272\u540D\u3002\u4E0E newRoleName \u4E8C\u9009\u4E00\uFF0C\u4F18\u5148\u6309\u670D\u52A1\u7AEF\u73B0\u6709\u521B\u5EFA\u89C4\u5219\u5904\u7406\u3002"},newRoleName:{type:"string",description:"\u65B0\u89D2\u8272\u540D\u3002\u7528\u4E8E\u9700\u8981\u663E\u5F0F\u521B\u5EFA\u65B0\u89D2\u8272\u5B9E\u4F8B\u65F6\u4F20\u5165\u3002"},displayName:{type:"string",description:"\u65B0\u540C\u4E8B\u663E\u793A\u540D\u3002"},description:{type:"string",description:"\u65B0\u540C\u4E8B\u89D2\u8272\u63CF\u8FF0\uFF08\u7B80\u77ED\uFF0C\u7528\u4E8E\u89D2\u8272\u5217\u8868\u4E0E\u5BA1\u6279\u5361\u7247\u5C55\u793A\uFF09\u3002"},prompt:{type:"string",description:"\u65B0\u540C\u4E8B\u804C\u8D23\u8BF4\u660E\u6216\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002"},workspacePath:{type:"string",description:"\u65B0\u540C\u4E8B\u5DE5\u4F5C\u76EE\u5F55\u3002"},myYmlPath:{type:"string",description:"my.yml \u8DEF\u5F84\uFF0C\u53EF\u9009\u3002"},myYmlContent:{type:"string",description:"my.yml \u5185\u5BB9\uFF0C\u53EF\u9009\u3002"},runtimeSkillEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 skill\u3002"},runtimeMcpEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 MCP\u3002"},runtimeCcSwitchEnabledTools:{type:"string",description:"\u521D\u59CB\u5316\u542F\u7528\u7684\u5DE5\u5177\u5217\u8868 JSON \u5B57\u7B26\u4E32\u3002"},items:{type:"array",description:"\u5F85\u6279\u91CF\u62DB\u8058\u7684\u540C\u4E8B\u5217\u8868\uFF08\u53EF\u9009\uFF09\u3002\u4E0D\u4F20\u65F6\u4E3A\u5355\u4E2A\u62DB\u8058\uFF08\u4F7F\u7528\u9876\u5C42\u53C2\u6570\uFF09\uFF1B\u4F20\u6B64\u6570\u7EC4\u65F6\u4E3A\u6279\u91CF\u62DB\u8058\uFF0C\u6BCF\u4E00\u9879\u5BF9\u5E94\u4E00\u4E2A\u5F85\u5BA1\u6279\u7684\u62DB\u8058\u8BF7\u6C42\uFF0C\u9876\u5C42\u5176\u4F59\u521B\u5EFA\u53C2\u6570\u5C06\u88AB\u5FFD\u7565\u3002",items:{type:"object",properties:{roleName:{type:"string",description:"\u89D2\u8272\u540D\u3002\u4E0E newRoleName \u4E8C\u9009\u4E00\uFF0C\u4F18\u5148\u6309\u670D\u52A1\u7AEF\u73B0\u6709\u521B\u5EFA\u89C4\u5219\u5904\u7406\u3002"},newRoleName:{type:"string",description:"\u65B0\u89D2\u8272\u540D\u3002\u7528\u4E8E\u9700\u8981\u663E\u5F0F\u521B\u5EFA\u65B0\u89D2\u8272\u5B9E\u4F8B\u65F6\u4F20\u5165\u3002"},displayName:{type:"string",description:"\u65B0\u540C\u4E8B\u663E\u793A\u540D\u3002"},description:{type:"string",description:"\u65B0\u540C\u4E8B\u89D2\u8272\u63CF\u8FF0\uFF08\u7B80\u77ED\uFF0C\u7528\u4E8E\u89D2\u8272\u5217\u8868\u4E0E\u5BA1\u6279\u5361\u7247\u5C55\u793A\uFF09\u3002"},prompt:{type:"string",description:"\u65B0\u540C\u4E8B\u804C\u8D23\u8BF4\u660E\u6216\u7CFB\u7EDF\u63D0\u793A\u8BCD\u3002"},workspacePath:{type:"string",description:"\u65B0\u540C\u4E8B\u5DE5\u4F5C\u76EE\u5F55\u3002"},myYmlPath:{type:"string",description:"my.yml \u8DEF\u5F84\uFF0C\u53EF\u9009\u3002"},myYmlContent:{type:"string",description:"my.yml \u5185\u5BB9\uFF0C\u53EF\u9009\u3002"},runtimeSkillEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 skill\u3002"},runtimeMcpEnabled:{type:"boolean",description:"\u662F\u5426\u542F\u7528 MCP\u3002"},runtimeCcSwitchEnabledTools:{type:"string",description:"\u521D\u59CB\u5316\u542F\u7528\u7684\u5DE5\u5177\u5217\u8868 JSON \u5B57\u7B26\u4E32\u3002"}},required:["workspacePath"]},minItems:1}}}},t={type:"array",items:{type:"object",properties:{messageId:{type:"string",description:"\u88AB\u5F15\u7528\u6D88\u606F\u7684\u7A33\u5B9A ID\uFF08\u6765\u81EA\u6D88\u606F\u7684 msgId\uFF1B\u79C1\u4FE1\u4E3A\u5B57\u7B26\u4E32 id\uFF0C\u7FA4\u6D88\u606F\u4E3A\u6570\u5B57 id \u7684\u5B57\u7B26\u4E32\u5F62\u5F0F\uFF09"},senderId:{type:"string",description:"\u88AB\u5F15\u7528\u6D88\u606F\u7684\u53D1\u9001\u8005 ID\uFF08senderId\uFF09"},senderName:{type:"string",description:"\u88AB\u5F15\u7528\u6D88\u606F\u7684\u53D1\u9001\u8005\u663E\u793A\u540D\uFF08\u7528\u4E8E\u6765\u6E90\u8FA8\u8BC6\u4E0E\u5F15\u7528\u5361\u7247\u5C55\u793A\uFF09"},snapshot:{type:"string",description:"\u88AB\u5F15\u7528\u7684\u539F\u6587\u5FEB\u7167\uFF08\u53EF\u9009\uFF0C\u5EFA\u8BAE \u2264200 \u5B57\u7B26\uFF0C\u670D\u52A1\u7AEF\u4F1A\u622A\u65AD\uFF09\u3002\u5F15\u7528\u7247\u6BB5\u65F6\u5FC5\u987B\u9010\u5B57\u6458\u5F55\u88AB\u5F15\u7528\u6D88\u606F\u4E2D\u7684\u8BE5\u7247\u6BB5\u2014\u2014\u7981\u6B62\u6539\u5199\u6216\u8F6C\u8FF0\uFF0C\u524D\u7AEF\u6309\u9010\u5B57\u5339\u914D\u5728\u539F\u6D88\u606F\u91CC\u5B9A\u4F4D\u5E76\u9AD8\u4EAE\u8FD9\u6BB5\u6587\u5B57\uFF1B\u5F15\u7528\u6574\u6761\u6D88\u606F\u65F6\u586B\u539F\u6587\u5F00\u5934\u6458\u8981\u3002\u539F\u6D88\u606F\u88AB\u64A4\u56DE\u6216\u65E0\u6743\u8BFB\u53D6\u65F6\u7528\u4E8E\u964D\u7EA7\u5C55\u793A\uFF0C\u4E0D\u4F2A\u9020\u5185\u5BB9\u3002"},prefix:{type:"string",description:"\u53EF\u9009\uFF08\u226416 \u5B57\u7B26\uFF0C\u9010\u5B57\u6458\u5F55\uFF09\uFF1A\u547D\u4E2D\u7247\u6BB5\u7D27\u90BB\u7684\u524D\u6587\u3002\u8BE5\u7247\u6BB5\u5728\u539F\u6D88\u606F\u4E2D\u591A\u6B21\u51FA\u73B0\u65F6\uFF08\u5982\u4E24\u4E2A\u300C\u4F60\u597D\u300D\uFF09\uFF0C\u7528\u4E8E\u7CBE\u786E\u5B9A\u4F4D\u4F60\u5F15\u7528\u7684\u662F\u54EA\u4E00\u6B21\uFF1B\u7701\u7565\u5219\u805A\u7126\u9996\u6B21\u51FA\u73B0\u3002"},suffix:{type:"string",description:"\u53EF\u9009\uFF08\u226416 \u5B57\u7B26\uFF0C\u9010\u5B57\u6458\u5F55\uFF09\uFF1A\u547D\u4E2D\u7247\u6BB5\u7D27\u90BB\u7684\u540E\u6587\uFF0C\u4E0E prefix \u914D\u5408\u5B9A\u4F4D\uFF08\u7247\u6BB5\u4F4D\u4E8E\u6D88\u606F\u5F00\u5934\u6CA1\u6709\u524D\u6587\u65F6\u9760 suffix \u6D88\u6B67\u4E49\uFF09\uFF1B\u7701\u7565\u5219\u805A\u7126\u9996\u6B21\u51FA\u73B0\u3002"},pos:{type:"number",description:"\u53EF\u9009\uFF08\u975E\u8D1F\u6574\u6570\uFF09\uFF1A\u5F15\u7528\u5361\u7247\u5728\u672C\u6D88\u606F\u6B63\u6587\u4E2D\u7684\u5B57\u7B26\u4F4D\u7F6E\uFF08\u4ECE 0 \u8BA1\uFF0C\u76F8\u5BF9\u7EAF\u6587\u672C\u6B63\u6587\uFF09\u3002\u5BF9\u65B9\u524D\u7AEF\u4F1A\u628A\u5F15\u7528\u5361\u5185\u8054\u63D2\u5165\u5230\u6B63\u6587\u8BE5\u4F4D\u7F6E\uFF08\u8FD8\u539F\u300Cxxx \u2192 \u5F15\u7528\u5361 \u2192 yyy\u300D\u7684\u6392\u5E03\uFF09\uFF1B\u7701\u7565\u6216\u975E\u6CD5\u65F6\u5F15\u7528\u5361\u663E\u793A\u5728\u6D88\u606F\u9876\u90E8\u3002"}},required:["messageId"]},description:"\u7ED3\u6784\u5316\u5F15\u7528\uFF08\u53EF\u9009\uFF09\uFF1A\u672C\u6D88\u606F\u5F15\u7528\u4E86\u54EA\u4E9B\u5386\u53F2\u6D88\u606F\uFF0C\u6574\u6761\u6216\u7247\u6BB5\u5747\u53EF\uFF08\u7247\u6BB5\u793A\u4F8B\uFF1A\u5F15\u7528\u300C\u4F60\u662F\u5C0F\u5E84\u5417\uFF1F\u300D\u4E2D\u7684\u201C\u5C0F\u5E84\u201D\u5E76\u8FFD\u95EE\u5176\u6307\u4EE3\uFF09\u3002\u7528\u4E8E\u8DE8 Agent \u8BA8\u8BBA\u3001\u4EFB\u52A1\u4EA4\u63A5\u3001\u4EE3\u7801\u5BA1\u67E5\u7B49\u573A\u666F\u2014\u2014\u5F15\u7528\u8868\u793A\u8BA8\u8BBA\u5173\u8054\uFF0C\u4E0D\u4EE3\u8868\u5FC5\u987B\u6267\u884C\u88AB\u5F15\u7528\u6D88\u606F\u4E2D\u7684\u6307\u4EE4\uFF1B\u4E0D\u8981\u628A\u5F15\u7528\u4E0E\u8C03\u7528\u5F0F\u56DE\u590D\uFF08replyToCallId\uFF09\u6DF7\u7528\u3002\u5BF9\u65B9\u70B9\u51FB\u5F15\u7528\u5361\u7247\u53EF\u8DF3\u8F6C\u5E76\u805A\u7126\u539F\u6D88\u606F\u6216\u5F15\u7528\u7247\u6BB5\u3002"},i={type:"object",description:"\u8BA9\u672C\u6761\u6D88\u606F\u540C\u65F6\u4EE5\u8BED\u97F3\u53D1\u51FA\uFF08\u53EF\u9009\uFF09\u3002\u670D\u52A1\u7AEF\u628A content \u5408\u6210\u4E3A\u97F3\u9891\uFF0C\u63A5\u6536\u65B9\u53EF\u64AD\u653E\uFF0C\u6587\u5B57\u4ECD\u539F\u6837\u53EF\u89C1\u2014\u2014\u8BED\u97F3\u662F\u53E0\u52A0\u901A\u9053\uFF0C\u4E0D\u662F\u66FF\u4EE3\u54C1\u3002\u9002\u5408\u63D0\u9192/\u6C47\u62A5/\u529D\u963B\u7B49\u9700\u8981\u8BED\u6C14\u5B58\u5728\u611F\u7684\u573A\u666F\uFF1B\u7EAF\u9644\u4EF6\u6D88\u606F\u3001\u8D85\u957F\u6587\u672C\u4F1A\u81EA\u52A8\u964D\u7EA7\u4E3A\u7EAF\u6587\u5B57\u5E76\u5728\u7ED3\u679C\u91CC\u56DE\u62A5\u539F\u56E0\uFF08voice.ok=false + reason\uFF09\u3002",properties:{emotion:{type:"string",enum:["neutral","happy","excited","calm","sad","serious"],description:"\u60C5\u7EEA\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4 neutral\uFF09\u3002\u4E91\u7AEF\u5408\u6210\u65F6\u6309\u6307\u4EE4\u6539\u53D8\u8BED\u6C14\uFF08happy \u5F00\u5FC3\u3001excited \u5174\u594B\u6FC0\u52A8\u3001calm \u5E73\u9759\u8212\u7F13\u3001sad \u4F4E\u843D\u4F24\u611F\u3001serious \u4E25\u8083\u90D1\u91CD\uFF09\uFF1B\u672C\u5730\u515C\u5E95\u53EA\u6709\u8BED\u901F\u4E0E\u53E5\u95F4\u505C\u987F\u3002\u4E0D\u8981\u4E3A\u666E\u901A\u6C47\u62A5\u5F3A\u52A0\u60C5\u7EEA\uFF0C\u62FF\u4E0D\u51C6\u5C31\u7528 neutral\u3002"},speaker:{type:"string",description:"\u97F3\u8272 id\uFF08\u53EF\u9009\uFF0C\u975E\u8D1F\u6574\u6570\uFF09\u3002\u4E0D\u4F20\u65F6\u6309\u4F60\u7684\u8EAB\u4EFD\u81EA\u52A8\u5206\u914D\u4E00\u4E2A\u56FA\u5B9A\u97F3\u8272\u2014\u2014\u540C\u4E00 agent \u6BCF\u6B21\u8BF4\u8BDD\u97F3\u8272\u4E00\u81F4\uFF0C\u4E0D\u540C agent \u58F0\u97F3\u4E0D\u540C\u3002\u901A\u5E38\u4E0D\u9700\u8981\u4F20\u3002"}}},L={name:"send_group",description:"\u5411\u7FA4\u804A\u53D1\u9001\u6D88\u606F\uFF0C\u6240\u6709\u5728\u7EBF\u53C2\u4E0E\u8005\u90FD\u80FD\u6536\u5230\u3002\u9ED8\u8BA4\u53D1\u5230\u9879\u76EE\u516C\u5171\u7FA4\u804A\uFF08\u5168\u9879\u76EE\u53EF\u89C1\uFF09\uFF0C\u56E0\u6B64\u52A1\u5FC5\u5148\u9009\u597D\u76EE\u6807\u7FA4\uFF1A\u5148\u7528 get_group_rooms \u67E5\u770B\u53EF\u53D1\u73B0\u7684\u7FA4\u7EC4\uFF0C\u4F18\u5148\u9009\u62E9\u80FD\u8986\u76D6\u76EE\u6807\u53D7\u4F17\u7684\u6700\u5C0F\u7FA4\u7EC4\u2014\u2014\u53EA\u6D89\u53CA\u67D0\u4E2A\u5C0F\u7EC4/\u56E2\u961F\u65F6\uFF0C\u5FC5\u987B\u4F20\u8BE5\u5C0F\u7EC4\u7FA4\u7684 roomId\uFF08roomType=inner_group\uFF09\u53D1\u5230\u5C0F\u7EC4\u7FA4\uFF0C\u4E0D\u8981\u9ED8\u8BA4\u53D1\u5230\u9879\u76EE\u516C\u5171\u7FA4\uFF1B\u53EA\u6709\u786E\u5B9E\u8981\u901A\u77E5\u5168\u9879\u76EE\u65F6\u624D\u53D1\u516C\u5171\u7FA4\u804A\uFF08\u4E0D\u4F20 roomId\uFF09\u3002\u56DE\u590D\u7FA4\u6D88\u606F\u65F6\u5EFA\u8BAE\u4F20\u5165\u6D88\u606F\u4E2D\u7684 projectId \u4E0E roomId\uFF0C\u786E\u4FDD\u56DE\u590D\u5230\u6B63\u786E\u7684\u7FA4\u804A\u3002\u652F\u6301\u53D1\u9001 pencil/draw/office \u5361\u7247\uFF08pencil/draw \u6587\u6863\u5176\u4ED6 Agent \u62FF\u5230 docId \u5373\u53EF\u8BFB\u53D6\uFF1Boffice \u6587\u4EF6\u5361\u7247\u7528 card.filePath\uFF08\u5DE5\u4F5C\u533A\u6587\u6863\uFF09\u6216 card.docId\uFF08\u4E91\u6587\u6863\uFF09\u6307\u5B9A\u6587\u4EF6\uFF0C\u53D1\u9001\u524D\u4F1A\u6821\u9A8C\u6587\u4EF6\u5B58\u5728/\u4E91\u6587\u6863\u6709\u6548\uFF09\u3002\u53EF\u4F20 voice \u8BA9\u672C\u6761\u540C\u65F6\u4EE5\u8BED\u97F3\u53D1\u51FA\uFF08\u6587\u5B57\u4ECD\u539F\u6837\u53EF\u89C1\uFF09\u3002",inputSchema:{type:"object",properties:{content:{type:"string",description:'\u6D88\u606F\u5185\u5BB9\u3002\u7EAF\u53D1\u9001\u6587\u4EF6\u65F6\u4F20\u7A7A\u5B57\u7B26\u4E32\uFF08content \u4E0E attachments \u81F3\u5C11\u5176\u4E00\u975E\u7A7A\uFF09\u3002\u4F20\u4E86 voice \u65F6\u8FD9\u6BB5\u6587\u5B57\u4E5F\u4F1A\u88AB\u5FF5\u51FA\u6765\u2014\u2014\u652F\u6301 <break time="600ms"/> \u63A7\u5236\u505C\u987F\uFF0C\u4F46\u8BF7\u4F20\u81EA\u7136\u53E3\u8BED\uFF08\u4E66\u9762\u957F\u53E5\u542C\u611F\u5F88\u5DEE\uFF09\uFF0C\u4E14\u4E0D\u8981\u8D85\u8FC7 600 \u5B57\u3002'},projectId:{type:"string",description:"\u76EE\u6807\u9879\u76EE ID\uFF08\u53EF\u9009\uFF09\u3002\u4E0D\u4F20\u5219\u4F7F\u7528 Agent \u6240\u5C5E\u9879\u76EE\uFF08\u7531\u670D\u52A1\u7AEF\u51B3\u5B9A\uFF09\u3002\u56DE\u590D\u7FA4\u6D88\u606F\u65F6\u5E94\u4F20\u5165\u6D88\u606F\u4E2D\u7684 projectId\uFF0C\u786E\u4FDD\u56DE\u590D\u5230\u6B63\u786E\u7684\u9879\u76EE\u7FA4\u804A\u3002"},roomId:{type:"string",description:"\u76EE\u6807\u7FA4\u804A\u623F\u95F4 ID\uFF08\u53EF\u9009\uFF09\u3002\u4E0D\u4F20\u5219\u53D1\u5230\u9879\u76EE\u516C\u5171\u7FA4\u804A\uFF08\u5168\u9879\u76EE\u53EF\u89C1\uFF09\u3002\u9009\u62E9\u6700\u5C0F\u7FA4\u7EC4\uFF1A\u6D88\u606F\u53EA\u6D89\u53CA\u67D0\u4E2A\u5C0F\u7EC4/\u56E2\u961F\u65F6\uFF0C\u5FC5\u987B\u4F20\u8BE5\u5C0F\u7EC4\u7FA4\u7684 roomId\uFF08\u6765\u81EA get_group_rooms \u7684 inner_group \u7FA4\u7EC4\u6216\u7FA4\u6D88\u606F\u4E2D\u7684 roomId\uFF09\uFF0C\u907F\u514D\u628A\u5C0F\u7EC4\u6D88\u606F\u8BEF\u53D1\u5230\u9879\u76EE\u516C\u5171\u7FA4\uFF1B\u53EA\u6709\u9700\u8981\u901A\u77E5\u5168\u9879\u76EE\u65F6\u624D\u7701\u7565 roomId\u3002\u56DE\u590D\u7FA4\u6D88\u606F\u65F6\u5E94\u4F20\u5165\u8BE5\u6D88\u606F\u7684 roomId\u3002"},attachments:{type:"array",items:{type:"string"},description:"\u968F\u6D88\u606F\u53D1\u9001\u7684\u6587\u4EF6\u8DEF\u5F84\u5217\u8868\uFF08\u53EF\u9009\uFF09\u3002\u652F\u6301\u5DE5\u4F5C\u533A\u5185\u76F8\u5BF9\u8DEF\u5F84\uFF08\u5982 report.xlsx\u3001docs/\u62A5\u544A.pdf\uFF09\u6216\u672C\u673A\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u53EF\u4E3A\u5DE5\u4F5C\u533A\u5916\u6587\u4EF6\uFF0C\u5982 D:/tmp/data.zip\uFF09\uFF0C\u6587\u4EF6\u5C06\u88AB\u4E0A\u4F20\u5E76\u4EE5\u6587\u4EF6\u94FE\u63A5\u5F62\u5F0F\u9644\u5728\u6D88\u606F\u4E2D\uFF0C\u63A5\u6536\u65B9\u53EF\u901A\u8FC7\u94FE\u63A5\u4E0B\u8F7D\u3002\u5355\u4E2A\u6587\u4EF6\u9ED8\u8BA4\u4E0D\u8D85\u8FC7 200MB\uFF08\u53D7\u670D\u52A1\u7AEF AWS_FILE_MAX_SIZE_BYTES \u7EA6\u675F\uFF09\u3002"},card:{type:"object",description:'\u5361\u7247\uFF1A\u6587\u6863/\u6587\u4EF6\u5F15\u7528\uFF08\u53EF\u9009\uFF09\u3002pencil/draw \u4F20 {type, docId}\uFF0C\u53D1\u9001\u540E\u5176\u4ED6 Agent \u62FF\u5230 docId \u5373\u53EF\u7528 pencil_get_tree/draw_get_diagram \u8BFB\u53D6\uFF0C\u65E0\u9700\u9080\u8BF7\uFF1Boffice \u4F20 {type:"office", filePath} \u6216 {type:"office", docId}\uFF08\u4E8C\u9009\u4E00\uFF0C\u4E0D\u53EF\u540C\u65F6\u4F20\uFF09\uFF0C\u628A Office \u6587\u6863\uFF08docx/xlsx/pptx\uFF09\u4F5C\u4E3A\u53EF\u4E0B\u8F7D+\u53EF\u5728\u7EBF\u9884\u89C8\u7684\u6587\u4EF6\u5361\u7247\u53D1\u9001\u3002filePath \u4E3A\u5DE5\u4F5C\u533A\u6587\u6863\u8DEF\u5F84\uFF08\u53D1\u9001\u524D\u6821\u9A8C\u6587\u4EF6\u5B58\u5728\u5E76\u4E0A\u4F20\uFF0C\u4E0D\u5B58\u5728\u5219\u53D1\u9001\u5931\u8D25\uFF09\uFF1BdocId \u4E3A\u4E91\u6587\u6863 id\uFF08\u53D1\u9001\u65F6\u670D\u52A1\u7AEF\u6821\u9A8C\u6709\u6548\u6027\uFF0C\u63A5\u6536\u65B9\u53EF\u76F4\u63A5\u5728 Office \u9762\u677F\u6253\u5F00\uFF09\uFF1B\u4E0D\u8981\u4F20 fileUrl/previewUrl\uFF1A\u6587\u4EF6\u5730\u5740\u4E0E\u5728\u7EBF\u9884\u89C8\u5730\u5740\u5747\u7531\u670D\u52A1\u7AEF\u6821\u9A8C/\u751F\u6210\u3002',properties:{type:{type:"string",enum:["pencil","draw","office"],description:"\u5361\u7247\u7C7B\u578B\uFF1Apencil \u8BBE\u8BA1\u753B\u5E03\u3001draw \u7ED8\u56FE\u6587\u6863 \u6216 office \u6587\u4EF6\uFF08Office \u6587\u6863\u4EE5\u6587\u4EF6\u5361\u7247\u5206\u4EAB\uFF09"},docId:{type:"string",description:"\u6587\u6863 ID\uFF1Apencil/draw \u5361\u7247\u5FC5\u586B\uFF08\u6765\u81EA pencil_create_document/draw_create_document \u6216 list \u5DE5\u5177\uFF09\uFF1Boffice \u5361\u7247\u4E0E filePath \u4E8C\u9009\u4E00\uFF08\u4E91\u6587\u6863 id\uFF0C\u5982 od-xxx\uFF0C\u53D1\u9001\u65F6\u670D\u52A1\u7AEF\u6821\u9A8C\u6709\u6548\u6027\uFF09"},filePath:{type:"string",description:"Office \u5361\u7247\u4E0E docId \u4E8C\u9009\u4E00\uFF1A\u5DE5\u4F5C\u533A Office \u6587\u6863\u8DEF\u5F84\uFF08\u5982 report.docx\uFF09\uFF0C\u53D1\u9001\u524D\u6821\u9A8C\u6587\u4EF6\u5B58\u5728\u5E76\u4E0A\u4F20\uFF0C\u4E0D\u5B58\u5728\u5219\u53D1\u9001\u5931\u8D25"},title:{type:"string",description:"\u5361\u7247\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u53D6\u6587\u6863\u540D\u79F0\uFF09"},description:{type:"string",description:"\u5361\u7247\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09"}},required:["type"]},replyTo:t,voice:i},required:["content"]}},A={name:"send_private",description:'\u53D1\u9001\u79C1\u4FE1\u7ED9\u6307\u5B9A\u7528\u6237\u3002\u652F\u6301\u4E24\u79CD\u6A21\u5F0F\uFF1A\u901A\u77E5\u5F0F\uFF08waitReply=false\uFF09\u548C\u8C03\u7528\u5F0F\uFF08waitReply=true\uFF0C\u963B\u585E\u7B49\u5F85\u56DE\u590D\uFF09\u3002\u652F\u6301\u53D1\u9001 pencil/draw/office \u5361\u7247\uFF08pencil/draw \u6587\u6863\u5176\u4ED6 Agent \u62FF\u5230 docId \u5373\u53EF\u8BFB\u53D6\uFF1Boffice \u6587\u4EF6\u5361\u7247\u7528 card.filePath\uFF08\u5DE5\u4F5C\u533A\u6587\u6863\uFF09\u6216 card.docId\uFF08\u4E91\u6587\u6863\uFF09\u6307\u5B9A\u6587\u4EF6\uFF0C\u53D1\u9001\u524D\u4F1A\u6821\u9A8C\u6587\u4EF6\u5B58\u5728/\u4E91\u6587\u6863\u6709\u6548\uFF09\u3002\u53D1\u73B0\u540C\u4E8B\u6B63\u5728\u505A\u9519\u65B9\u5411\u3001\u5FC5\u987B\u7ACB\u523B\u7EA0\u6B63\u65F6\u53EF\u4F20 priority:"force" \u53D1\u9001\u5F3A\u5236\u6D88\u606F\uFF1A\u5BF9\u65B9 runtime \u4F1A\u5728\u4E0B\u4E00\u4E2A\u8FED\u4EE3\u8FB9\u754C\u628A\u6D88\u606F\u76F4\u63A5\u6CE8\u5165\u5BF9\u8BDD\uFF0C\u65E0\u9700\u7B49\u5176\u8F6E\u8BE2\u3002force \u5FC5\u987B\u643A\u5E26 ref\uFF08\u5F15\u7528\u7684\u4EFB\u52A1/\u8282\u70B9/\u6D88\u606F\uFF09\u8BF4\u660E\u4F9D\u636E\uFF0C\u5E76\u53D7\u51B7\u5374\u4E0E\u914D\u989D\u7EA6\u675F\uFF1B\u8D85\u9650\u4F1A\u964D\u7EA7\u4E3A\u666E\u901A\u6D88\u606F\u5E76\u5728\u7ED3\u679C\u91CC\u8FD4\u56DE degraded + degradeReason\u3002\u53EF\u4F20 voice \u8BA9\u672C\u6761\u540C\u65F6\u4EE5\u8BED\u97F3\u53D1\u51FA\uFF08\u6587\u5B57\u4ECD\u539F\u6837\u53EF\u89C1\uFF09\u3002',inputSchema:{type:"object",properties:{targetId:{type:"string",description:"\u76EE\u6807\u7528\u6237ID"},content:{type:"string",description:'\u6D88\u606F\u5185\u5BB9\u3002\u7EAF\u53D1\u9001\u6587\u4EF6\u65F6\u4F20\u7A7A\u5B57\u7B26\u4E32\uFF08content \u4E0E attachments \u81F3\u5C11\u5176\u4E00\u975E\u7A7A\uFF09\u3002\u4F20\u4E86 voice \u65F6\u8FD9\u6BB5\u6587\u5B57\u4E5F\u4F1A\u88AB\u5FF5\u51FA\u6765\u2014\u2014\u652F\u6301 <break time="600ms"/> \u63A7\u5236\u505C\u987F\uFF0C\u4F46\u8BF7\u4F20\u81EA\u7136\u53E3\u8BED\uFF08\u4E66\u9762\u957F\u53E5\u542C\u611F\u5F88\u5DEE\uFF09\uFF0C\u4E14\u4E0D\u8981\u8D85\u8FC7 600 \u5B57\u3002'},waitReply:{type:"boolean",description:"\u662F\u5426\u7B49\u5F85\u5BF9\u65B9\u56DE\u590D\uFF08\u8C03\u7528\u5F0F\uFF09\u3002\u4E3Atrue\u65F6\u4F1A\u963B\u585E\u7B49\u5F85\u56DE\u590D\uFF0C\u9ED8\u8BA4\u6C38\u4E45\u963B\u585E\u76F4\u5230\u6536\u5230\u56DE\u590D"},replyToCallId:{type:"string",description:"\u56DE\u590D\u7684\u8C03\u7528ID\uFF1A\u4EC5\u5F53\u88AB\u56DE\u590D\u6D88\u606F\u7684 requireReply=true \u65F6\uFF0C\u4F20\u8BE5\u6D88\u606F\u7684 callId \u5B57\u6BB5\uFF08\u4E0D\u662F msgId\uFF09\u3002\u666E\u901A\u6D88\u606F\u6CA1\u6709 callId\uFF0C\u4E0D\u8981\u4F20 msgId\uFF1B\u8981\u5F15\u7528\u666E\u901A\u6D88\u606F\u8BF7\u7528 replyTo\uFF08messageId \u4F20 msgId\uFF09\u3002\u4F20\u5165\u65E0\u6548\u7684 replyToCallId \u4F1A\u88AB\u670D\u52A1\u7AEF\u964D\u7EA7\u4E3A\u666E\u901A\u79C1\u4FE1\u5E76\u8FD4\u56DE warning\u3002"},timeoutMs:{type:"number",description:"\u7B49\u5F85\u56DE\u590D\u7684\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF0C\u53EF\u9009\uFF09\u3002\u672A\u6307\u5B9A\u6216\u22640\u65F6\u6C38\u4E45\u963B\u585E\u7B49\u5F85\uFF0C>0\u65F6\u6309\u6307\u5B9A\u65F6\u95F4\u8D85\u65F6"},attachments:{type:"array",items:{type:"string"},description:"\u968F\u6D88\u606F\u53D1\u9001\u7684\u6587\u4EF6\u8DEF\u5F84\u5217\u8868\uFF08\u53EF\u9009\uFF09\u3002\u652F\u6301\u5DE5\u4F5C\u533A\u5185\u76F8\u5BF9\u8DEF\u5F84\uFF08\u5982 report.xlsx\u3001docs/\u62A5\u544A.pdf\uFF09\u6216\u672C\u673A\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u53EF\u4E3A\u5DE5\u4F5C\u533A\u5916\u6587\u4EF6\uFF0C\u5982 D:/tmp/data.zip\uFF09\uFF0C\u6587\u4EF6\u5C06\u88AB\u4E0A\u4F20\u5E76\u4EE5\u6587\u4EF6\u94FE\u63A5\u5F62\u5F0F\u9644\u5728\u6D88\u606F\u4E2D\uFF0C\u63A5\u6536\u65B9\u53EF\u901A\u8FC7\u94FE\u63A5\u4E0B\u8F7D\u3002\u5355\u4E2A\u6587\u4EF6\u9ED8\u8BA4\u4E0D\u8D85\u8FC7 200MB\uFF08\u53D7\u670D\u52A1\u7AEF AWS_FILE_MAX_SIZE_BYTES \u7EA6\u675F\uFF09\u3002"},card:{type:"object",description:'\u5361\u7247\uFF1A\u6587\u6863/\u6587\u4EF6\u5F15\u7528\uFF08\u53EF\u9009\uFF09\u3002pencil/draw \u4F20 {type, docId}\uFF0C\u53D1\u9001\u540E\u5176\u4ED6 Agent \u62FF\u5230 docId \u5373\u53EF\u7528 pencil_get_tree/draw_get_diagram \u8BFB\u53D6\uFF0C\u65E0\u9700\u9080\u8BF7\uFF1Boffice \u4F20 {type:"office", filePath} \u6216 {type:"office", docId}\uFF08\u4E8C\u9009\u4E00\uFF0C\u4E0D\u53EF\u540C\u65F6\u4F20\uFF09\uFF0C\u628A Office \u6587\u6863\uFF08docx/xlsx/pptx\uFF09\u4F5C\u4E3A\u53EF\u4E0B\u8F7D+\u53EF\u5728\u7EBF\u9884\u89C8\u7684\u6587\u4EF6\u5361\u7247\u53D1\u9001\u3002filePath \u4E3A\u5DE5\u4F5C\u533A\u6587\u6863\u8DEF\u5F84\uFF08\u53D1\u9001\u524D\u6821\u9A8C\u6587\u4EF6\u5B58\u5728\u5E76\u4E0A\u4F20\uFF0C\u4E0D\u5B58\u5728\u5219\u53D1\u9001\u5931\u8D25\uFF09\uFF1BdocId \u4E3A\u4E91\u6587\u6863 id\uFF08\u53D1\u9001\u65F6\u670D\u52A1\u7AEF\u6821\u9A8C\u6709\u6548\u6027\uFF0C\u63A5\u6536\u65B9\u53EF\u76F4\u63A5\u5728 Office \u9762\u677F\u6253\u5F00\uFF09\uFF1B\u4E0D\u8981\u4F20 fileUrl/previewUrl\uFF1A\u6587\u4EF6\u5730\u5740\u4E0E\u5728\u7EBF\u9884\u89C8\u5730\u5740\u5747\u7531\u670D\u52A1\u7AEF\u6821\u9A8C/\u751F\u6210\u3002',properties:{type:{type:"string",enum:["pencil","draw","office"],description:"\u5361\u7247\u7C7B\u578B\uFF1Apencil \u8BBE\u8BA1\u753B\u5E03\u3001draw \u7ED8\u56FE\u6587\u6863 \u6216 office \u6587\u4EF6\uFF08Office \u6587\u6863\u4EE5\u6587\u4EF6\u5361\u7247\u5206\u4EAB\uFF09"},docId:{type:"string",description:"\u6587\u6863 ID\uFF1Apencil/draw \u5361\u7247\u5FC5\u586B\uFF08\u6765\u81EA pencil_create_document/draw_create_document \u6216 list \u5DE5\u5177\uFF09\uFF1Boffice \u5361\u7247\u4E0E filePath \u4E8C\u9009\u4E00\uFF08\u4E91\u6587\u6863 id\uFF0C\u5982 od-xxx\uFF0C\u53D1\u9001\u65F6\u670D\u52A1\u7AEF\u6821\u9A8C\u6709\u6548\u6027\uFF09"},filePath:{type:"string",description:"Office \u5361\u7247\u4E0E docId \u4E8C\u9009\u4E00\uFF1A\u5DE5\u4F5C\u533A Office \u6587\u6863\u8DEF\u5F84\uFF08\u5982 report.docx\uFF09\uFF0C\u53D1\u9001\u524D\u6821\u9A8C\u6587\u4EF6\u5B58\u5728\u5E76\u4E0A\u4F20\uFF0C\u4E0D\u5B58\u5728\u5219\u53D1\u9001\u5931\u8D25"},title:{type:"string",description:"\u5361\u7247\u6807\u9898\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u53D6\u6587\u6863\u540D\u79F0\uFF09"},description:{type:"string",description:"\u5361\u7247\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09"}},required:["type"]},replyTo:t,voice:i,priority:{type:"string",enum:["normal","force"],description:"\u6D88\u606F\u7B49\u7EA7\u3002normal\uFF08\u9ED8\u8BA4\uFF09= \u666E\u901A\u6D88\u606F\uFF0C\u7B49\u5BF9\u65B9\u8F6E\u8BE2\uFF1Bforce = \u5F3A\u5236\u6D88\u606F\uFF0C\u5BF9\u65B9 runtime \u5728\u4E0B\u4E00\u4E2A\u8FED\u4EE3\u8FB9\u754C\u7ACB\u5373\u6CE8\u5165\u5BF9\u8BDD\uFF08\u7528\u4E8E\u7D27\u6025\u7EA0\u504F\uFF1A\u907F\u514D\u5BF9\u65B9\u628A\u9519\u8BEF\u65B9\u5411\u505A\u5B8C\u624D\u6536\u5230\u7EA0\u6B63\uFF09\u3002force \u5FC5\u987B\u540C\u65F6\u4F20 ref\uFF0C\u4E14\u540C\u4E00\u63A5\u6536\u65B9\u6709\u51B7\u5374\uFF08\u9ED8\u8BA4 60s \u4E00\u6761\uFF09\u3001\u53D1\u9001\u65B9\u6709\u914D\u989D\uFF08\u9ED8\u8BA4 10 \u6761/\u5206\u949F\uFF09\uFF1B\u8D85\u9650\u81EA\u52A8\u964D\u7EA7\u4E3A\u666E\u901A\u6D88\u606F\u5E76\u5728\u7ED3\u679C\u4E2D\u8FD4\u56DE degraded + degradeReason\u3002waitReply=true \u7684\u8C03\u7528\u5F0F\u6D88\u606F\u672C\u8EAB\u5C31\u4F1A\u5524\u9192\u5BF9\u65B9\uFF0C\u4E0D\u9700\u8981\u4E5F\u4E0D\u652F\u6301 force\u3002"},intent:{type:"string",enum:["stop","redirect","constraint"],description:"\u5F3A\u5236\u6D88\u606F\u610F\u56FE\uFF08\u4EC5 priority=force \u65F6\u6709\u610F\u4E49\uFF09\uFF1Astop \u7ACB\u5373\u505C\u6B62\u5F53\u524D\u5DE5\u4F5C | redirect \u6539\u65B9\u5411 | constraint \u8865\u5145\u5FC5\u987B\u9075\u5B88\u7684\u7EA6\u675F\u3002\u5E2E\u52A9\u63A5\u6536\u65B9\u7406\u89E3\u4E3A\u4EC0\u4E48\u88AB\u6253\u65AD\u3002"},ref:{type:"object",description:'\u5F3A\u5236\u6D88\u606F\u7684\u4F9D\u636E\u5F15\u7528\uFF08priority=force \u65F6\u5FC5\u586B\uFF09\uFF1A\u6307\u51FA\u4F60\u5728\u7EA0\u6B63\u54EA\u4EF6\u4E8B\u3002\u81F3\u5C11\u5305\u542B\u4E0B\u5217\u4E4B\u4E00\uFF0C\u8D8A\u5177\u4F53\u8D8A\u597D\u3002\u4F8B\u5982 {"taskInstanceId":"...","nodeId":"..."} \u6216 {"messageId":"..."}\u3002\u65E0\u4F9D\u636E\u7684\u6253\u65AD\u4F1A\u88AB\u670D\u52A1\u7AEF\u964D\u7EA7\u3002',properties:{taskInstanceId:{type:"string",description:"\u4EFB\u52A1\u5B9E\u4F8B ID"},nodeId:{type:"string",description:"\u4EFB\u52A1\u8282\u70B9 ID"},messageId:{type:"string",description:"\u76F8\u5173\u79C1\u4FE1 msgId"}}},reason:{type:"string",description:"\u5F3A\u5236\u6D88\u606F\u539F\u56E0\uFF08\u4EBA\u7C7B\u53EF\u8BFB\uFF0C\u9762\u677F\u5C55\u793A\u4E0E\u5BA1\u8BA1\u7528\uFF09\uFF1A\u4E00\u53E5\u8BDD\u8BF4\u660E\u4E3A\u4EC0\u4E48\u8981\u6253\u65AD\uFF0C\u4F8B\u5982\u300C\u4EFB\u52A1 A \u7684\u9A8C\u6536\u6807\u51C6\u5DF2\u53D8\u66F4\u4E3A\u2026\u2026\uFF0C\u7EE7\u7EED\u6309\u65E7\u6807\u51C6\u4F1A\u8FD4\u5DE5\u300D\u3002"}},required:["targetId","content"]}},e=`\u6D88\u606F\u53EF\u80FD\u643A\u5E26 replyTo \u5B57\u6BB5\uFF08JSON \u6570\u7EC4 [{messageId,senderId,senderName,snapshot,prefix,suffix,pos}]\uFF09\uFF0C\u8868\u793A\u8BE5\u6D88\u606F\u5F15\u7528\u4E86\u54EA\u4E9B\u5386\u53F2\u6D88\u606F\uFF08\u8BA8\u8BBA\u5173\u8054\uFF0C\u4E0E replyToCallId \u8C03\u7528\u56DE\u6267\u65E0\u5173\uFF09\u3002
22
22
  \u3010\u5F15\u7528\u56DE\u6267\u3011\u56DE\u590D\u6216\u8FFD\u95EE\u67D0\u6761\u6D88\u606F\u65F6\uFF0C\u53EF\u5728 send_private/send_group \u7684 replyTo \u4E2D\u56DE\u4F20\u5F15\u7528\uFF08messageId \u53D6\u8BE5\u6D88\u606F\u7684 msgId\uFF09\uFF1A\u5F15\u7528\u6574\u6761\u6D88\u606F\u65F6 snapshot \u4F20\u539F\u6587\u5F00\u5934\u6458\u8981\uFF1B\u5F15\u7528\u7247\u6BB5\u65F6 snapshot \u5FC5\u987B\u9010\u5B57\u6458\u5F55\u88AB\u5F15\u7528\u6D88\u606F\u4E2D\u7684\u8BE5\u7247\u6BB5\uFF08\u2264200 \u5B57\u7B26\uFF0C\u7981\u6B62\u6539\u5199\u6216\u8F6C\u8FF0\uFF09\uFF0C\u5BF9\u65B9\u70B9\u51FB\u5F15\u7528\u5361\u7247\u5373\u53EF\u8DF3\u8F6C\u5E76\u805A\u7126\u539F\u6D88\u606F\u6216\u547D\u4E2D\u7247\u6BB5\u3002\u82E5\u8BE5\u7247\u6BB5\u5728\u539F\u6D88\u606F\u4E2D\u591A\u6B21\u51FA\u73B0\uFF08\u5982\u4E24\u4E2A\u300C\u4F60\u597D\u300D\uFF09\uFF0C\u518D\u9644\u4E0A\u7247\u6BB5\u524D\u540E\u5404 \u226416 \u5B57\u7B26\u7684\u539F\u6587\u4E0A\u4E0B\u6587 prefix/suffix\uFF08\u9010\u5B57\uFF09\u5373\u53EF\u7CBE\u786E\u5B9A\u4F4D\u5230\u4F60\u6307\u7684\u90A3\u6B21\uFF1B\u7701\u7565\u5219\u805A\u7126\u9996\u6B21\u51FA\u73B0\u3002\u82E5\u60F3\u8BA9\u5F15\u7528\u5361\u5185\u8054\u663E\u793A\u5728\u4F60\u6B63\u6587\u4E2D\u7684\u6307\u5B9A\u4F4D\u7F6E\uFF0C\u9644\u4E0A pos\uFF08\u4ECE 0 \u8BA1\u7684\u5B57\u7B26\u4F4D\u7F6E\uFF09\uFF1B\u7701\u7565\u6216\u975E\u6CD5\u65F6\u5361\u7247\u663E\u793A\u5728\u6D88\u606F\u9876\u90E8\u3002`,w={name:"poll_message",description:`\u83B7\u53D6\u672A\u8BFB\u6D88\u606F\uFF08\u5305\u62EC\u7FA4\u6D88\u606F\u548C\u79C1\u4FE1\uFF09\uFF0C\u6301\u7EED\u963B\u585E\u7B49\u5F85\u76F4\u5230\u6709\u65B0\u6D88\u606F\uFF0C\u8FD9\u662F\u83B7\u53D6\u6D88\u606F\u7684\u4E3B\u8981\u63A5\u53E3\u3002
23
23
 
24
24
  \u3010\u8FD4\u56DE\u503C\u8BF4\u660E\u3011
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aws-runtime-bridge",
3
- "version": "1.9.181",
3
+ "version": "1.9.182",
4
4
  "description": "AgentsWorkStudio runtime bridge service for machine-level agent runtime integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",