aws-runtime-bridge 1.9.189 → 1.9.192

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.
Files changed (47) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/dist/adapter/AcodeSdkAdapter.d.ts +13 -0
  3. package/dist/adapter/AcodeSdkAdapter.js +3 -3
  4. package/dist/config.d.ts +0 -31
  5. package/dist/config.js +2 -2
  6. package/dist/index.js +1 -1
  7. package/dist/routes/media-files.d.ts +19 -0
  8. package/dist/routes/media-files.js +2 -0
  9. package/dist/routes/plugin-ui.d.ts +17 -0
  10. package/dist/routes/plugin-ui.js +2 -0
  11. package/dist/routes/plugins.d.ts +3 -0
  12. package/dist/routes/plugins.js +1 -1
  13. package/dist/routes/terminal.d.ts +83 -0
  14. package/dist/routes/terminal.js +25 -25
  15. package/dist/scripts/migrate-user-scopes.js +1 -1
  16. package/dist/services/agent-capability-sync.js +1 -1
  17. package/dist/services/capability-config.d.ts +0 -1
  18. package/dist/services/capability-config.js +2 -2
  19. package/dist/services/instance-ai-config-service.js +1 -1
  20. package/dist/services/plugin-deployment.d.ts +2 -30
  21. package/dist/services/plugin-deployment.js +2 -2
  22. package/dist/services/plugin-handler-adapter.d.ts +10 -1
  23. package/dist/services/plugin-handler-adapter.js +2 -2
  24. package/dist/services/plugin-listener-runner.js +4 -4
  25. package/dist/services/plugin-loader.d.ts +7 -1
  26. package/dist/services/plugin-loader.js +1 -1
  27. package/dist/services/plugin-manager.d.ts +32 -12
  28. package/dist/services/plugin-manager.js +4 -4
  29. package/dist/services/plugin-manifest.d.ts +53 -3
  30. package/dist/services/plugin-manifest.js +1 -1
  31. package/dist/services/plugin-runtime.d.ts +8 -9
  32. package/dist/services/plugin-ui-status-runtime.d.ts +8 -0
  33. package/dist/services/plugin-ui-status-runtime.js +2 -0
  34. package/dist/services/plugin-ui-status.d.ts +96 -0
  35. package/dist/services/plugin-ui-status.js +2 -0
  36. package/dist/services/plugin-wecom-callback.d.ts +61 -0
  37. package/dist/services/plugin-wecom-callback.js +3 -0
  38. package/dist/services/user-scope.d.ts +1 -9
  39. package/dist/services/user-scope.js +1 -1
  40. package/package/acode/dist/plugin-types.d.ts +41 -1
  41. package/package/acode/dist/runtime.d.ts +17 -0
  42. package/package/acode/dist/runtime.js +20 -20
  43. package/package/aws-client-agent-mcp/dist/mcp-server.js +1 -1
  44. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +15 -0
  45. package/package/aws-client-agent-mcp/dist/mcp-tools.js +35 -5
  46. package/package/aws-client-agent-mcp/dist/tool-groups.js +2 -2
  47. package/package.json +1 -1
@@ -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 j,meetingDebugLog as k}from"./meeting-debug-log.js";import{MCP_TOOLS as U,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 D,officeWorkspaceRoot as q,packOfficeFile as F,resolveOfficeFile as O,writeOfficeFileAtomic as x,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 H,normalizeMemoryTypeName as Ee}from"./memory-store.js";import{ServerMemoryStore as ke}from"./server-memory-store.js";const Ie=3e3,Ce=3e4,L=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(),Fe={".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 De(R){return Fe[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 v{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;urgentGeneralHydrateRequested=!1;static MEETING_HYDRATE_RETRY_COUNT=3;static MEETING_HYDRATE_RETRY_DELAY_MS=150;static MEETING_HYDRATE_TIMEOUT_REARM_DELAY_MS=1e4;meetingHydrateTimeoutRearmDelayMs=v.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=v.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 H(v.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(v.buildRoleMemoryStorePath(this.initialRoleName));c.info(`[McpServer] \u5C1D\u8BD5\u4ECE\u9057\u7559\u76EE\u5F55\u8BFB\u53D6: ${s}`);try{const o=await new H(s).listByType("project_doc_memory");o.length>0&&(c.info(`[McpServer] \u4ECE\u9057\u7559\u76EE\u5F55\u8BFB\u53D6\u5230 ${o.length} \u6761\u9879\u76EE\u8BB0\u5FC6`),r=o)}catch(a){c.warn("[McpServer] \u8BFB\u53D6\u9057\u7559\u76EE\u5F55\u9879\u76EE\u8BB0\u5FC6\u5931\u8D25:",a instanceof Error?a.message:a)}}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(a){const o=a instanceof Error?a.message:String(a);o.includes("already exists")||o.includes("Memory already exists")||c.warn(`[McpServer] \u540C\u6B65\u9879\u76EE\u8BB0\u5FC6\u5931\u8D25 (${s.uri}): ${o}`),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=v.resolveRoleMemoryDirectoryName(),this.hasRoleName=!!process.env.AWS_ROLE_NAME;const e=v.resolveMemoryStorePaths();this.memoryStore=new ke(this.agentClient),this.roleMemoryStore=new H(e.rolePath),this.sessionContextMemoryStore=new H(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=v.GROUP_ENV_KEYS[e.key],{features:r,ok:n}=await this.fetchRuntimeFeaturesWithStatus();if(n&&Object.keys(r).length>0){const s=v.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",voice:"AWS_COLLABORATION_VOICE_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 v.PARENT_GATE_PREFIXES)if(e.startsWith(r))return t}}async filterDisabledGroups(){let e=U;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:U.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),a=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(a,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:a,writeFile:o}=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 a(u,{recursive:!0}),l=f.join(u,`${p}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.png`)}return await a(f.dirname(l),{recursive:!0}),await o(l,Buffer.from(i,"base64")),{...s,savedTo:l,temp:!t}}catch(a){return{...s,savedTo:null,saveError:a instanceof Error?a.message:String(a)}}}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(!v.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),a=typeof s?.snapshotJson=="string"?s.snapshotJson:"";if(!a)return s;const{mkdir:o,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)}`,T=f.join(W.tmpdir(),"pencil-export");await o(T,{recursive:!0});const h=f.join(T,`${u}-${_}.snapshot.json`);await l(h,a,"utf8");const S=t,d=n?f.resolve(i,n):f.join(T,`${u}-${_}.${S}`),{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 M=["export",h,"--snapshot","-f",t,"-o",d];r&&M.push("--node",r),t==="html"&&M.push("--html","standalone"),(t==="png"||t==="jpg"||t==="webp")&&(typeof e.scale=="number"&&e.scale>0&&M.push("--scale",String(e.scale)),typeof e.quality=="number"&&e.quality>0&&M.push("--quality",String(e.quality)));const P=[];let w=!1;for(const I of y)try{await this.runPencilCli(I.cmd,[I.entry,...M],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 b={...s};return delete b.snapshotJson,{...b,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,a,o)=>{if(s){const l=String(o||a||"").trim().split(/\r?\n/).filter(Boolean).slice(-3).join(" | ");i(new Error(l||s.message));return}n(String(a||""))})})}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(!v.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:a,writeFile:o,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 a(_,{recursive:!0});const T=t,h=r?f.resolve(n,r):f.join(_,`${p}-${u}.${T}`);await a(f.dirname(h),{recursive:!0}),await o(h,s,"utf8");let S=null;try{S=Math.ceil((await l(h)).size/1024)}catch{S=null}const d={...i};return delete d.docXml,{...d,format:t,savedTo:h,temp:!r,sizeKb:S}}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:a,writeFile:o}=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 a(u,{recursive:!0}),l=f.join(u,`${p}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.png`)}return await a(f.dirname(l),{recursive:!0}),await o(l,Buffer.from(n,"base64")),{...s,savedTo:l,temp:!i}}catch(a){return{...s,savedTo:null,saveError:a instanceof Error?a.message:String(a)}}}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=x(t,String(r.fileBase64));return{ok:!0,file:t,kind:D(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=F(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=F(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 a=Array.isArray(i?.warnings)&&i.warnings.length>0?{warnings:i.warnings}:{};if(typeof i?.fileBase64=="string"){const o=x(t,String(i.fileBase64));return{ok:!0,file:t,kind:D(O(t))??void 0,results:Array.isArray(i.results)?i.results:[],changed:!0,savedTo:o.absolutePath,sizeKb:o.sizeKb,...this.backupReceipt(o.backupPath),...a,...s}}return{ok:!0,results:Array.isArray(i?.results)?i.results:[],changed:!1,...a,...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 o=(typeof e.outputFile=="string"&&e.outputFile.trim()?e.outputFile.trim():"")||(i.annotate===!0&&r==="check"?this.deriveSiblingFileName(t,"-\u6807\u6CE8\u7248"):t),l=F(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=o!==t,u=p?ve(t,f.basename(o),String(m.fileBase64)):x(t,String(m.fileBase64)),{fileBase64:_,...T}=m;return{...T,file:t,...p?{outputFile:o,originalPreserved:!0}:{},kind:D(O(o))??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=F(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=x(t,String(n.fileBase64)),{fileBase64:s,...a}=n;return{...a,file:t,kind:D(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=F(t);let n=e.content;Array.isArray(n)&&n.length>0&&(n=await Promise.all(n.map(async o=>{if(typeof o=="object"&&o!==null&&o.type==="image"){const l={...o};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 o})));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 a=await this.agentClient.callAgentScopedTool("office_generate_from_template",i);if(a?.ok===!1)return a;if(typeof a?.fileBase64=="string"){const o=x(s,String(a.fileBase64)),{fileBase64:l,...m}=a;return{...m,file:s,template:s===t?void 0:t,kind:D(O(s))??void 0,savedTo:o.absolutePath,sizeKb:o.sizeKb,...this.backupReceipt(o.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"),a=r.extname(i).toLowerCase();try{if(a===".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(o){throw new Error(`\u89C4\u5219\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${e}\uFF08${o instanceof Error?o.message:String(o)}\uFF09`)}}async officeFileForward(e,t){const r=F(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=D(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 a;try{a=F(t)}catch(m){return{ok:!1,error:m instanceof Error?m.message:String(m)}}const o=await this.agentClient.callAgentScopedTool("office_open_document",{fileName:a.fileName,fileBase64:a.fileBase64,workspacePath:q(),sourcePath:t});if(!o||o.ok===!1)return o??{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 o.docId=="string"?o.docId:void 0,file:r,kind:i,sizeKb:s,workspacePath:q(),source:typeof o.source=="string"?o.source:"local",fileUrl:typeof o.fileUrl=="string"?o.fileUrl:void 0,version:typeof o.version=="number"?o.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=F(t),i=D(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 a=(await this.uploadAttachmentFiles([n.absolutePath]))[0],o=a.name,l={type:"office",name:o,kind:i,fileUrl:a.url,sizeKb:Math.ceil(a.size/1024),title:typeof e.title=="string"&&e.title.trim()?e.title.trim():o,filePath:t,workspacePath:q()};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,a={...t};delete a._aws_sub_agent,delete a._aws_silent_poll,delete a._aws_force_inject;const o=n?null:this.agentClient.getStatusReporter();o&&!i&&this.safeReportStatus(()=>o.reportToolUse(e,this.sanitizeToolUseArgs(e,a)));try{const l=await this.executeToolCall(e,a,{forceInject:s,signal:r});if(o&&!i){const m=this.stripAutoDelegateForReporting(l);m!==null&&(this.safeReportStatus(()=>o.reportToolResult(this.stripRenderImageForReporting(m))),this.safeReportStatus(()=>o.reportThinking()))}return l}catch(l){throw o&&!i&&this.safeReportStatus(()=>o.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"get_send_status":return await this.handleGetSendStatus(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"voice_guide":return await this.agentClient.callAgentScopedTool("voice_guide",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<v.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&&v.isPathWithin(t,n)?n:null;let a=null,o=t;for(;;){if(C.existsSync(f.join(o,".git"))){a=o;break}if(s!==null&&o===s)break;const m=f.dirname(o);if(m===o)break;o=m}const l=a??s??t;for(o=t;;){const m=f.join(o,".agentswork");if(C.existsSync(m))return m;if(o===l)break;const p=f.dirname(o);if(p===o)break;o=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 v.sanitizeRoleDirectoryName(process.env.AWS_ROLE_NAME||"")}static buildRoleMemoryStorePath(e){const t=process.env.AWS_WORKSPACE_PATH||process.cwd(),r=v.findAgentsworkDirSync(t);return f.join(r,"memory","memory",v.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=v.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",v.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=v.resolveRoleMemoryDirectoryName(),this.hasRoleName=!!process.env.AWS_ROLE_NAME;const e=v.resolveMemoryStorePaths();this.memoryStore=new ke(this.agentClient),this.roleMemoryStore=new H(e.rolePath),this.sessionContextMemoryStore=new H(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=v.GROUP_ENV_KEYS[e.key],{features:r,ok:n}=await this.fetchRuntimeFeaturesWithStatus();if(n&&Object.keys(r).length>0){const s=v.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",voice:"AWS_COLLABORATION_VOICE_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 v.PARENT_GATE_PREFIXES)if(e.startsWith(r))return t}}async filterDisabledGroups(){let e=U;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:U.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),a=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(a,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:a,writeFile:o}=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 a(u,{recursive:!0}),l=f.join(u,`${p}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.png`)}return await a(f.dirname(l),{recursive:!0}),await o(l,Buffer.from(i,"base64")),{...s,savedTo:l,temp:!t}}catch(a){return{...s,savedTo:null,saveError:a instanceof Error?a.message:String(a)}}}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(!v.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),a=typeof s?.snapshotJson=="string"?s.snapshotJson:"";if(!a)return s;const{mkdir:o,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)}`,T=f.join(W.tmpdir(),"pencil-export");await o(T,{recursive:!0});const h=f.join(T,`${u}-${_}.snapshot.json`);await l(h,a,"utf8");const S=t,d=n?f.resolve(i,n):f.join(T,`${u}-${_}.${S}`),{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 M=["export",h,"--snapshot","-f",t,"-o",d];r&&M.push("--node",r),t==="html"&&M.push("--html","standalone"),(t==="png"||t==="jpg"||t==="webp")&&(typeof e.scale=="number"&&e.scale>0&&M.push("--scale",String(e.scale)),typeof e.quality=="number"&&e.quality>0&&M.push("--quality",String(e.quality)));const P=[];let w=!1;for(const I of y)try{await this.runPencilCli(I.cmd,[I.entry,...M],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 b={...s};return delete b.snapshotJson,{...b,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,a,o)=>{if(s){const l=String(o||a||"").trim().split(/\r?\n/).filter(Boolean).slice(-3).join(" | ");i(new Error(l||s.message));return}n(String(a||""))})})}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(!v.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:a,writeFile:o,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 a(_,{recursive:!0});const T=t,h=r?f.resolve(n,r):f.join(_,`${p}-${u}.${T}`);await a(f.dirname(h),{recursive:!0}),await o(h,s,"utf8");let S=null;try{S=Math.ceil((await l(h)).size/1024)}catch{S=null}const d={...i};return delete d.docXml,{...d,format:t,savedTo:h,temp:!r,sizeKb:S}}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:a,writeFile:o}=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 a(u,{recursive:!0}),l=f.join(u,`${p}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.png`)}return await a(f.dirname(l),{recursive:!0}),await o(l,Buffer.from(n,"base64")),{...s,savedTo:l,temp:!i}}catch(a){return{...s,savedTo:null,saveError:a instanceof Error?a.message:String(a)}}}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=x(t,String(r.fileBase64));return{ok:!0,file:t,kind:D(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=F(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=F(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 a=Array.isArray(i?.warnings)&&i.warnings.length>0?{warnings:i.warnings}:{};if(typeof i?.fileBase64=="string"){const o=x(t,String(i.fileBase64));return{ok:!0,file:t,kind:D(O(t))??void 0,results:Array.isArray(i.results)?i.results:[],changed:!0,savedTo:o.absolutePath,sizeKb:o.sizeKb,...this.backupReceipt(o.backupPath),...a,...s}}return{ok:!0,results:Array.isArray(i?.results)?i.results:[],changed:!1,...a,...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 o=(typeof e.outputFile=="string"&&e.outputFile.trim()?e.outputFile.trim():"")||(i.annotate===!0&&r==="check"?this.deriveSiblingFileName(t,"-\u6807\u6CE8\u7248"):t),l=F(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=o!==t,u=p?ve(t,f.basename(o),String(m.fileBase64)):x(t,String(m.fileBase64)),{fileBase64:_,...T}=m;return{...T,file:t,...p?{outputFile:o,originalPreserved:!0}:{},kind:D(O(o))??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=F(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=x(t,String(n.fileBase64)),{fileBase64:s,...a}=n;return{...a,file:t,kind:D(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=F(t);let n=e.content;Array.isArray(n)&&n.length>0&&(n=await Promise.all(n.map(async o=>{if(typeof o=="object"&&o!==null&&o.type==="image"){const l={...o};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 o})));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 a=await this.agentClient.callAgentScopedTool("office_generate_from_template",i);if(a?.ok===!1)return a;if(typeof a?.fileBase64=="string"){const o=x(s,String(a.fileBase64)),{fileBase64:l,...m}=a;return{...m,file:s,template:s===t?void 0:t,kind:D(O(s))??void 0,savedTo:o.absolutePath,sizeKb:o.sizeKb,...this.backupReceipt(o.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"),a=r.extname(i).toLowerCase();try{if(a===".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(o){throw new Error(`\u89C4\u5219\u6587\u4EF6\u89E3\u6790\u5931\u8D25: ${e}\uFF08${o instanceof Error?o.message:String(o)}\uFF09`)}}async officeFileForward(e,t){const r=F(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=D(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 a;try{a=F(t)}catch(m){return{ok:!1,error:m instanceof Error?m.message:String(m)}}const o=await this.agentClient.callAgentScopedTool("office_open_document",{fileName:a.fileName,fileBase64:a.fileBase64,workspacePath:q(),sourcePath:t});if(!o||o.ok===!1)return o??{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 o.docId=="string"?o.docId:void 0,file:r,kind:i,sizeKb:s,workspacePath:q(),source:typeof o.source=="string"?o.source:"local",fileUrl:typeof o.fileUrl=="string"?o.fileUrl:void 0,version:typeof o.version=="number"?o.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=F(t),i=D(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 a=(await this.uploadAttachmentFiles([n.absolutePath]))[0],o=a.name,l={type:"office",name:o,kind:i,fileUrl:a.url,sizeKb:Math.ceil(a.size/1024),title:typeof e.title=="string"&&e.title.trim()?e.title.trim():o,filePath:t,workspacePath:q()};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,a={...t};delete a._aws_sub_agent,delete a._aws_silent_poll,delete a._aws_force_inject;const o=n?null:this.agentClient.getStatusReporter();o&&!i&&this.safeReportStatus(()=>o.reportToolUse(e,this.sanitizeToolUseArgs(e,a)));try{const l=await this.executeToolCall(e,a,{forceInject:s,signal:r});if(o&&!i){const m=this.stripAutoDelegateForReporting(l);m!==null&&(this.safeReportStatus(()=>o.reportToolResult(this.stripRenderImageForReporting(m))),this.safeReportStatus(()=>o.reportThinking()))}return l}catch(l){throw o&&!i&&this.safeReportStatus(()=>o.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"get_send_status":return await this.handleGetSendStatus(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"voice_guide":return await this.agentClient.callAgentScopedTool("voice_guide",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??""));case"generate_image":return await this.agentClient.callAgentScopedTool("generate_image",t);case"generate_video":return await this.agentClient.callAgentScopedTool("generate_video",t);case"query_media_task":return await this.agentClient.callAgentScopedTool("query_media_task",t);default:throw new Error(`Unknown tool: ${e}`)}}async fetchRuntimeFeaturesWithStatus(){const e=Date.now();if(this.featuresCache&&e-this.featuresCache.fetchedAt<v.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&&v.isPathWithin(t,n)?n:null;let a=null,o=t;for(;;){if(C.existsSync(f.join(o,".git"))){a=o;break}if(s!==null&&o===s)break;const m=f.dirname(o);if(m===o)break;o=m}const l=a??s??t;for(o=t;;){const m=f.join(o,".agentswork");if(C.existsSync(m))return m;if(o===l)break;const p=f.dirname(o);if(p===o)break;o=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 v.sanitizeRoleDirectoryName(process.env.AWS_ROLE_NAME||"")}static buildRoleMemoryStorePath(e){const t=process.env.AWS_WORKSPACE_PATH||process.cwd(),r=v.findAgentsworkDirSync(t);return f.join(r,"memory","memory",v.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=v.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",v.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 v.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(!v.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=o=>!!o&&typeof o=="object"&&"_acodeAutoDelegate"in o;if(!r.some(i))return e;const a=r.filter(o=>!i(o));return a.length===0&&n.length===0?null:{...t,directMessages:a}}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 a of t){const o=await this.calculateFileMd5(a);o&&(r[a]=o)}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(a=>{c.warn("[McpServer] \u5907\u4EFD project_doc_memory \u5230\u672C\u5730\u5931\u8D25:",a)}),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),a=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):a?.bound_files&&a.bound_files.length>0&&await this.validateBoundFilesExist(a.bound_files);const o=i.bound_files??a?.bound_files;let l,m;if(o&&o.length>0){l={};for(const u of o){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"&&a?.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 a=this.getOptionalMemoryType(e);return{deleted:await this.deleteMemorySingle(t,a)}}let n=0;const i=[],s=[];for(let a=0;a<r.length;a++){const o=r[a];if(typeof o!="object"||o===null){s.push({uri:String(o),reason:`memories[${a}] \u4E0D\u662F\u5BF9\u8C61`});continue}const l=o,m=typeof l.uri=="string"?l.uri:"";if(!m){s.push({uri:"",reason:`memories[${a}].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,a=await i.store.deleteMemory({...n,memory_type:s});return a&&(s==="project_doc_memory"&&this.removeProjectMemoryLocalBackup(e).catch(o=>{c.warn("[McpServer] \u5220\u9664 project_doc_memory \u672C\u5730\u5907\u4EFD\u5931\u8D25:",o)}),r||await this.reportMemoryStatsToServer()),a}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 a=await this.searchOwnMemories(s);if(r==="own")return a;const o=await this.memoryStore.searchMemory({...s,scope:"children"});return this.mergeSearchResults(a,o,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(a=>{const o=a.uri;return n.has(o)?!1:(n.add(o),!0)}).sort((a,o)=>o.updatedAt.localeCompare(a.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,a=await this.memoryStore.listByType(t),o=a.length,l=a.slice(i,i+s);return{memory_type:t,total:o,offset:i,limit:s,has_more:i+s<o,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",a=async()=>await this.memoryStore.listByFile(r,{memory_type:n,scope:"children"}).catch(()=>[]);if(s==="children"){const u=await a();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[o,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(o,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("/"),a=[],o=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),h="./"+s.slice(u).join("/"),S=f.join(r,..._);if(S===r)continue;const d=f.join(S,".agentswork");try{await l(d)}catch{continue}const g=f.join(d,"memory","memory");let E;try{E=(await m(g,{withFileTypes:!0})).filter(M=>M.isDirectory()).map(M=>M.name)}catch{continue}for(const y of E){const M=f.join(g,y);let P;try{P=await m(M)}catch{continue}for(const w of P){if(!w.endsWith(".json"))continue;const A=f.join(M,w);let b;try{b=await p(A,"utf-8")}catch{continue}let I;try{I=JSON.parse(b)}catch{continue}if(I.by_uri)for(const[$,N]of Object.entries(I.by_uri)){if(!N)continue;const z=N.id||$;o.has(z)||t&&N.memory_type!==t||N.bound_files&&N.bound_files.length>0&&N.bound_files.some(te=>this.normalizeBoundFilePath(te)===h)&&(o.add(z),a.push({...N,uri:N.uri||$}))}}}}return a.sort((u,_)=>String(_.updatedAt??"").localeCompare(String(u.updatedAt??""))),a}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:a,readFile:o}=await import("node:fs/promises");try{await s(i)}catch{return[]}let l;try{l=(await a(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 T;try{T=await a(_)}catch{continue}for(const h of T){if(!h.endsWith(".json"))continue;let S;try{S=JSON.parse(await o(f.join(_,h),"utf-8"))}catch{continue}if(S.by_uri)for(const[d,g]of Object.entries(S.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(M=>this.normalizeBoundFilePath(M)===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(o){c.warn("[McpServer] \u539F\u5B50\u8BA4\u9886\u8FC7\u671F\u8BB0\u5FC6\u5931\u8D25: %s",o instanceof Error?o.message:String(o))}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((o,l)=>{const m=new Date(o.expiresAt||o.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(o=>({uri:o.uri,title:o.title,domain:o.domain,path:o.path,memory_status:"recalling",contentPreview:typeof o.content=="string"&&o.content.length>200?o.content.substring(0,200)+"...":o.content,createdAt:o.createdAt,updatedAt:o.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
@@ -340,4 +340,19 @@ export declare const ACK_EMAIL_TOOL: Tool;
340
340
 
341
341
  export declare const VOICE_TOOL_NAMES: ReadonlySet<string>;
342
342
  export declare const EMAIL_TOOL_NAMES: ReadonlySet<string>;
343
+
344
+
345
+
346
+ export declare const GENERATE_IMAGE_TOOL: Tool;
347
+
348
+
349
+
350
+
351
+ export declare const GENERATE_VIDEO_TOOL: Tool;
352
+
353
+
354
+
355
+ export declare const QUERY_MEDIA_TASK_TOOL: Tool;
356
+
357
+ export declare const MEDIA_TOOL_NAMES: ReadonlySet<string>;
343
358
  export declare const MCP_TOOLS: Tool[];