aws-runtime-bridge 1.9.137 → 1.9.140

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 (110) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +4 -1
  2. package/dist/adapter/AcodeSdkAdapter.js +2 -2
  3. package/dist/adapter/ClaudeSdkAdapter.js +3 -3
  4. package/dist/adapter/CodexSdkAdapter.js +3 -3
  5. package/dist/adapter/OpencodeSdkAdapter.js +3 -3
  6. package/dist/browser/browser-pool.js +1 -1
  7. package/dist/browser/built-in-browser-tools.d.ts +1 -2
  8. package/dist/browser/built-in-browser-tools.js +1 -1
  9. package/dist/browser/ws-server.js +1 -1
  10. package/dist/config.d.ts +22 -6
  11. package/dist/config.js +2 -2
  12. package/dist/index.js +1 -1
  13. package/dist/middleware/auth.js +1 -1
  14. package/dist/remote-desktop/computer-control.d.ts +2 -2
  15. package/dist/remote-desktop/index.d.ts +1 -1
  16. package/dist/remote-desktop/index.js +2 -2
  17. package/dist/remote-desktop/screen-capture.js +1 -1
  18. package/dist/remote-desktop/session-manager.d.ts +2 -2
  19. package/dist/remote-desktop/session-manager.js +1 -1
  20. package/dist/remote-desktop/system-backend.js +3 -3
  21. package/dist/remote-desktop/types.d.ts +1 -1
  22. package/dist/remote-desktop/ui-automation.d.ts +2 -2
  23. package/dist/remote-desktop/ui-automation.js +5 -5
  24. package/dist/routes/ai-sources.js +1 -1
  25. package/dist/routes/background-tasks.js +5 -5
  26. package/dist/routes/browser-listeners.js +1 -1
  27. package/dist/routes/capabilities.js +1 -1
  28. package/dist/routes/dashboard.js +1 -1
  29. package/dist/routes/file-change-diff.js +3 -3
  30. package/dist/routes/file-diff-rollback.js +1 -1
  31. package/dist/routes/file-snapshot.js +1 -1
  32. package/dist/routes/git.js +20 -20
  33. package/dist/routes/instance.js +1 -1
  34. package/dist/routes/launch.js +1 -1
  35. package/dist/routes/mcp.js +1 -1
  36. package/dist/routes/plugins.js +1 -1
  37. package/dist/routes/properties.js +1 -1
  38. package/dist/routes/pty.d.ts +1 -1
  39. package/dist/routes/pty.js +1 -1
  40. package/dist/routes/runtime-binding.js +1 -1
  41. package/dist/routes/skills.js +1 -1
  42. package/dist/routes/sub-agents.js +1 -1
  43. package/dist/routes/task-context.js +1 -1
  44. package/dist/routes/terminal.js +27 -27
  45. package/dist/routes/yml.js +1 -1
  46. package/dist/services/access-control.js +1 -1
  47. package/dist/services/acode-bg-manager.js +1 -1
  48. package/dist/services/agent-capability-sync.js +1 -1
  49. package/dist/services/agent-process-manager.d.ts +1 -1
  50. package/dist/services/agent-process-manager.js +1 -1
  51. package/dist/services/ai-config-service.js +2 -2
  52. package/dist/services/ai-source-apply.d.ts +1 -1
  53. package/dist/services/auto-register.js +1 -1
  54. package/dist/services/aws-client-agent-mcp.d.ts +5 -0
  55. package/dist/services/aws-client-agent-mcp.js +2 -2
  56. package/dist/services/bridge-package-publish-hooks.js +1 -1
  57. package/dist/services/browser-session-manager.d.ts +3 -3
  58. package/dist/services/browser-session-manager.js +3 -3
  59. package/dist/services/capability-config.js +2 -2
  60. package/dist/services/cli-commands.js +2 -2
  61. package/dist/services/desktop-mcp-manager.js +1 -1
  62. package/dist/services/event-delta-pusher.d.ts +1 -1
  63. package/dist/services/fileSnapshotStore.js +1 -1
  64. package/dist/services/instance-ai-config-service.js +1 -1
  65. package/dist/services/instance-init-service.js +1 -1
  66. package/dist/services/instance-state.d.ts +1 -1
  67. package/dist/services/instance-state.js +1 -1
  68. package/dist/services/jdk-scanner.js +1 -1
  69. package/dist/services/launch-manager.js +1 -1
  70. package/dist/services/legacy-path-migration.d.ts +0 -2
  71. package/dist/services/legacy-path-migration.js +1 -1
  72. package/dist/services/lifecycle-state.js +2 -2
  73. package/dist/services/mcp-deploy.js +2 -2
  74. package/dist/services/orphan-monitor.js +1 -1
  75. package/dist/services/plugin-manager.d.ts +27 -5
  76. package/dist/services/plugin-manager.js +15 -9
  77. package/dist/services/process-detail.js +2 -2
  78. package/dist/services/process-detector.js +10 -10
  79. package/dist/services/process-registry.js +1 -1
  80. package/dist/services/process-top.js +2 -2
  81. package/dist/services/runtime-binding.js +4 -4
  82. package/dist/services/sdk-tool-file-change-recorder.js +1 -1
  83. package/dist/services/skill-manager.js +2 -2
  84. package/dist/services/startup-config-wizard.js +6 -6
  85. package/dist/services/system-metrics.js +1 -1
  86. package/dist/services/tunnel-client.js +1 -1
  87. package/dist/services/update-notifier.js +2 -2
  88. package/dist/services/windows-service-manager.js +1 -1
  89. package/dist/services/workspace-files.js +1 -1
  90. package/dist/services/workspaceTaskChangeWatcher.js +3 -3
  91. package/dist/utils/file-utils.js +2 -2
  92. package/dist/utils/instance-ai-config-debug-logger.js +1 -1
  93. package/dist/utils/mcp-utils.js +1 -1
  94. package/dist/utils/yaml-utils.js +1 -1
  95. package/package/acode/dist/cli.js +2 -2
  96. package/package/acode/dist/plugin-tools.js +3 -8
  97. package/package/acode/dist/plugin-types.d.ts +10 -0
  98. package/package/acode/dist/runtime.d.ts +4 -0
  99. package/package/acode/dist/runtime.js +18 -18
  100. package/package/acode/dist/types.d.ts +4 -0
  101. package/package/aws-client-agent-mcp/dist/http-client.js +1 -1
  102. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -1
  103. package/package/aws-client-agent-mcp/dist/mcp-server.js +10 -10
  104. package/package/aws-client-agent-mcp/dist/memory-tools.js +6 -6
  105. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +1 -1
  106. package/package/aws-client-agent-mcp/dist/server-memory-store.js +1 -1
  107. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +2 -0
  108. package/package/aws-client-agent-mcp/dist/status-reporter.js +3 -2
  109. package/package/aws-client-agent-mcp/dist/types.d.ts +1 -0
  110. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import{promises as f}from"node:fs";import r from"node:path";import{createHash as T}from"node:crypto";import J from"axios";import*as V from"diff";import{createLogger as Z}from"../utils/logger.js";import{resolveSchedulerBaseUrl as q,getRuntimeHomeDir as C}from"../config.js";import{getChangeCacheRetentionDays as I,setChangeCacheRetentionDays as Q}from"./change-cache-retention.js";import{getRuntimeAccessToken as H}from"./runtime-binding.js";const h=Z("workspace-task-change-watcher"),Y=new Set([".git","node_modules","__pycache__",".cache",".next","target","dist",".idea",".vscode",".agentswork-snapshots",".aws-bridge"]),ee=new Set([".lock",".log",".pid",".swp",".swo",".tmp"]),F=500,te=10*1024*1024,ne=".agentswork/change-cache",m="change-cache",ae=60*60*1e3,ie=24*60*60*1e3;let l=null,$=!1,E="",p=null;const g=new Map,u=new Map;let b=!1;function we(e){l&&l.taskNodeId!==e.taskNodeId&&z().catch(()=>{}),l=e,h.info(`Task context set: agent=${e.agentId}, taskInstance=${e.taskInstanceId}, node=${e.taskNodeId}`)}function Ce(){l&&(h.info(`Task context cleared: agent=${l.agentId}`),z().catch(()=>{})),l=null}function me(){return l}function Ee(){return l!==null}async function ke(e){const t=r.resolve(e.trim());try{if(!(await f.stat(t)).isDirectory())throw new Error(`Not a directory: ${t}`)}catch{throw new Error(`Workspace path does not exist or inaccessible: ${t}`)}if(p){try{p.close()}catch{}p=null}E=t,$=!0,h.info(`Workspace path set (fs.watch disabled, using tool interception only): ${E}`)}async function ye(){if($=!1,p){try{p.close()}catch{}p=null}g.clear(),u.clear(),E="",h.info("Workspace watch stopped")}function N(e,t,n){return T("sha256").update(`${e||"no-task"}:${t}:${n}`,"utf-8").digest("hex").slice(0,32)}function W(e){return T("sha256").update(r.resolve(e),"utf-8").digest("hex").slice(0,16)}function k(e){return r.join(C(),".aws-bridge",m,W(e))}function oe(e){return r.join(C(),m,W(e))}function j(e){return r.join(e,ne)}const U=new Set;async function M(e){if(!U.has(e)){U.add(e);try{const t=j(e),n=k(e);await f.access(t),await f.mkdir(r.dirname(n),{recursive:!0}),await f.rename(t,n),h.info(`Migrated legacy change-cache: ${t} -> ${n}`)}catch{}}}async function x(e,t,n){if(n===null)return;await M(e);const a=k(e);await f.mkdir(a,{recursive:!0});const i=r.join(a,`${t}.before`);await f.writeFile(i,n,"utf-8"),X(),h.debug(`Saved beforeContent cache: ${i}`)}async function B(e,t,n,a){const i=V.createPatch("file",n,a);await M(e);const o=k(e);await f.mkdir(o,{recursive:!0});const c=r.join(o,`${t}.diff`);await f.writeFile(c,i,"utf-8"),X(),h.debug(`Saved diff cache: ${c}`)}async function O(e,t){const n=[r.join(k(e),t),r.join(oe(e),t),r.join(j(e),t)];for(const a of n)try{return await f.readFile(a,"utf-8")}catch{}return null}async function De(e,t){return O(e,`${t}.before`)}async function Te(e,t){return O(e,`${t}.diff`)}let v=0,A=null,L=Promise.resolve();function S(){return L=L.then(()=>se()),L}async function se(){const e=I();if(!(e===null||e<=0))try{const t=[r.join(C(),".aws-bridge",m),r.join(C(),m)],n=Date.now()-e*24*60*60*1e3;let a=0;for(const i of t){let o=[];try{o=(await f.readdir(i)).filter(c=>!c.startsWith("."))}catch{continue}for(const c of o){const s=r.join(i,c);try{const d=await f.readdir(s);let w=!0;for(const D of d){if(!D.endsWith(".diff")&&!D.endsWith(".before")){w=!1;continue}const P=r.join(s,D);try{(await f.stat(P)).mtimeMs<n?(await f.unlink(P),a++):w=!1}catch{w=!1}}w&&await f.rmdir(s).catch(()=>{})}catch{}}}a>0&&h.info(`Change-cache TTL sweep: removed ${a} expired file(s), retentionDays=${e}`)}catch(t){h.warn(`Change-cache TTL sweep failed: ${t.message}`)}}function X(){const e=Date.now();e-v>=ae&&(v=e,S().catch(()=>{})),A||(A=setInterval(()=>{S().catch(()=>{})},ie),A.unref?.())}function Ie(e){const t=e.split(/[/\\]/);for(const a of t.slice(0,-1))if(Y.has(a))return!0;const n=r.extname(t[t.length-1]).toLowerCase();return!!ee.has(n)}async function _(e){try{return(await f.stat(e)).size>te?null:await f.readFile(e,"utf-8")}catch{return null}}function y(e){return e===null?null:T("sha256").update(e,"utf-8").digest("hex").slice(0,16)}async function $e(e,t){}function be(e,t,n){const a=g.get(n);if(a)t==="DELETE"||a.operation==="DELETE"?a.operation="DELETE":a.operation==="CREATE"&&t==="UPDATE"||(a.operation=t),a.timer&&clearTimeout(a.timer),a.timer=setTimeout(()=>{R(n).catch(()=>{})},F);else{let i=null;if(t==="UPDATE"||t==="DELETE")if(u.has(n))i=u.get(n)??null;else{_(n).then(c=>{c!==void 0&&u.set(n,c)}).catch(()=>{});return}const o={filePath:n,operation:t,timer:null,beforeContent:i};o.timer=setTimeout(()=>{R(n).catch(()=>{})},F),g.set(n,o)}}async function R(e){const t=g.get(e);if(!t)return;g.delete(e),t.timer&&clearTimeout(t.timer);const n=l;if(!n){if(t.operation==="DELETE")u.delete(e);else{const d=await _(e);d!==null&&u.set(e,d)}return}const a=r.relative(n.workspacePath,e).replace(/\\/g,"/");if(a.startsWith(".."))return;let i=t.beforeContent,o=null;t.operation==="DELETE"?(i=i??u.get(e)??null,o=null):(o=await _(e),t.operation==="UPDATE"&&i===null&&(i=u.get(e)??null)),t.operation==="DELETE"?u.delete(e):u.set(e,o);const c=new Date().toISOString(),s=N(n.taskInstanceId,a,c);t.operation==="UPDATE"&&i!==null&&o!==null?await B(n.workspacePath,s,i,o):t.operation==="DELETE"&&await x(n.workspacePath,s,i),await K(n,{workspacePath:n.workspacePath,filePath:a,operation:t.operation,beforeContent:i,afterContent:o,beforeHash:y(i),afterHash:y(o),timestamp:c,reason:G(t.operation,i,o)},s)}async function K(e,t,n){try{const a=q().url,i=H(a)||H();if(!i){h.warn("Cannot send change record: no auth token");return}const o=JSON.stringify({toolRecorded:!0,cacheKey:n,timestamp:t.timestamp}),s=(await J.post(`${a}/api/runtime/callback/task-file-changed`,{agentId:e.agentId,taskInstanceId:e.taskInstanceId,taskNodeId:e.taskNodeId,tenantId:e.tenantId,operation:t.operation,targetType:"FILE",targetPath:t.filePath,beforeHash:t.beforeHash,afterHash:t.afterHash,metadata:o,reason:t.reason,workspacePath:e.workspacePath},{headers:{"X-Runtime-Token":i},timeout:1e4})).data;if(s?.ignored===!0?h.warn(`Change record ignored by server: ${t.filePath} (${t.operation}), reason: ${String(s.reason??"unknown")}`):h.info(`Change record sent: ${t.filePath} (${t.operation})`),s&&s.changeCacheRetentionDays!==void 0){const d=I();Q(s.changeCacheRetentionDays),d!==I()&&(v=0,S().catch(()=>{}))}}catch(a){h.warn(`Failed to send change record: ${a.message}`)}}async function z(){if(b)return;b=!0;const e=Array.from(g.keys());for(const t of e)try{await R(t)}catch{}b=!1}function xe(){return g.size}function ve(){return $&&p!==null}function Ae(){return E}function G(e,t,n){const a=t?t.split(`
2
- `).length:0,i=n?n.split(`
3
- `).length:0;if(e==="CREATE")return`\u521B\u5EFA\u6587\u4EF6\uFF0C\u5171 ${i} \u884C`;if(e==="DELETE")return`\u5220\u9664\u6587\u4EF6\uFF0C\u539F ${a} \u884C`;if(a===i)return`\u4FEE\u6539\u6587\u4EF6\uFF08\u884C\u6570\u4E0D\u53D8\uFF0C${i} \u884C\uFF09`;const o=i-a;return`\u4FEE\u6539\u6587\u4EF6\uFF1A${a} \u884C -> ${i} \u884C\uFF08${o>0?"+":""}${o} \u884C\uFF09`}async function Le(e){const t=l,n=e.agentId||t?.agentId,a=e.workspacePath||t?.workspacePath;if(!n||!a){h.warn(`Agent file change skipped (no identity): ${e.filePath} (${e.operation})`);return}h.info(`Recording agent file change: ${e.filePath} (${e.operation}), taskNode=${t?.taskNodeId??"(no task)"}`);const i=t??{agentId:n,taskInstanceId:"",taskNodeId:"",tenantId:"",workspacePath:a,projectId:""},o=r.join(i.workspacePath,e.filePath),c=new Date().toISOString(),s=N(i.taskInstanceId,e.filePath,c);e.operation==="UPDATE"&&e.beforeContent!==null&&e.afterContent!==null?(await B(i.workspacePath,s,e.beforeContent,e.afterContent),await x(i.workspacePath,s,e.beforeContent)):e.operation==="DELETE"&&await x(i.workspacePath,s,e.beforeContent);const d=e.reason?.trim()||G(e.operation,e.beforeContent,e.afterContent);await K(i,{workspacePath:i.workspacePath,filePath:e.filePath,operation:e.operation,beforeContent:e.beforeContent,afterContent:e.afterContent,beforeHash:y(e.beforeContent),afterHash:y(e.afterContent),timestamp:c,reason:d},s)}export{Ce as clearTaskContext,xe as getPendingChangeCountForTest,me as getTaskContext,Ae as getWorkspaceRoot,Ee as hasActiveTask,ve as isWatching,De as readBeforeContentFromCache,Te as readDiffFromCache,Le as recordAgentFileChange,we as setTaskContext,ke as startWatching,ye as stopWatching,S as sweepExpiredChangeCache};
1
+ import{createHash as $}from"node:crypto";import{promises as r}from"node:fs";import s from"node:path";import G from"axios";import*as X from"diff";import{resolveSchedulerBaseUrl as J,getRuntimeHomeDir as C}from"../config.js";import{createLogger as V}from"../utils/logger.js";import{getChangeCacheRetentionDays as D,setChangeCacheRetentionDays as Z}from"./change-cache-retention.js";import{getRuntimeAccessToken as H}from"./runtime-binding.js";const h=V("workspace-task-change-watcher"),q=10*1024*1024,Q=".agentswork/change-cache",m="change-cache",Y=60*60*1e3,ee=24*60*60*1e3;let l=null,T=!1,k="",u=null;const g=new Map,d=new Map;let b=!1;function de(e){l&&l.taskNodeId!==e.taskNodeId&&K().catch(()=>{}),l=e,h.info(`Task context set: agent=${e.agentId}, taskInstance=${e.taskInstanceId}, node=${e.taskNodeId}`)}function pe(){l&&(h.info(`Task context cleared: agent=${l.agentId}`),K().catch(()=>{})),l=null}function ge(){return l}function we(){return l!==null}async function Ce(e){const t=s.resolve(e.trim());try{if(!(await r.stat(t)).isDirectory())throw new Error(`Not a directory: ${t}`)}catch{throw new Error(`Workspace path does not exist or inaccessible: ${t}`)}if(u){try{u.close()}catch{}u=null}k=t,T=!0,h.info(`Workspace path set (fs.watch disabled, using tool interception only): ${k}`)}async function me(){if(T=!1,u){try{u.close()}catch{}u=null}g.clear(),d.clear(),k="",h.info("Workspace watch stopped")}function L(e,t,a){return $("sha256").update(`${e||"no-task"}:${t}:${a}`,"utf-8").digest("hex").slice(0,32)}function F(e){return $("sha256").update(s.resolve(e),"utf-8").digest("hex").slice(0,16)}function y(e){return s.join(C(),".aws-bridge",m,F(e))}function te(e){return s.join(C(),m,F(e))}function N(e){return s.join(e,Q)}const W=new Set;async function j(e){if(!W.has(e)){W.add(e);try{const t=N(e),a=y(e);await r.access(t),await r.mkdir(s.dirname(a),{recursive:!0}),await r.rename(t,a),h.info(`Migrated legacy change-cache: ${t} -> ${a}`)}catch{}}}async function v(e,t,a){if(a===null)return;await j(e);const o=y(e);await r.mkdir(o,{recursive:!0});const n=s.join(o,`${t}.before`);await r.writeFile(n,a,"utf-8"),U(),h.debug(`Saved beforeContent cache: ${n}`)}async function _(e,t,a,o){const n=X.createPatch("file",a,o);await j(e);const i=y(e);await r.mkdir(i,{recursive:!0});const c=s.join(i,`${t}.diff`);await r.writeFile(c,n,"utf-8"),U(),h.debug(`Saved diff cache: ${c}`)}async function M(e,t){const a=[s.join(y(e),t),s.join(te(e),t),s.join(N(e),t)];for(const o of a)try{return await r.readFile(o,"utf-8")}catch{}return null}async function ke(e,t){return M(e,`${t}.before`)}async function ye(e,t){return M(e,`${t}.diff`)}let x=0,A=null,P=Promise.resolve();function R(){return P=P.then(()=>ne()),P}async function ne(){const e=D();if(!(e===null||e<=0))try{const t=[s.join(C(),".aws-bridge",m),s.join(C(),m)],a=Date.now()-e*24*60*60*1e3;let o=0;for(const n of t){let i=[];try{i=(await r.readdir(n)).filter(c=>!c.startsWith("."))}catch{continue}for(const c of i){const f=s.join(n,c);try{const p=await r.readdir(f);let w=!0;for(const E of p){if(!E.endsWith(".diff")&&!E.endsWith(".before")){w=!1;continue}const S=s.join(f,E);try{(await r.stat(S)).mtimeMs<a?(await r.unlink(S),o++):w=!1}catch{w=!1}}w&&await r.rmdir(f).catch(()=>{})}catch{}}}o>0&&h.info(`Change-cache TTL sweep: removed ${o} expired file(s), retentionDays=${e}`)}catch(t){h.warn(`Change-cache TTL sweep failed: ${t.message}`)}}function U(){const e=Date.now();e-x>=Y&&(x=e,R().catch(()=>{})),A||(A=setInterval(()=>{R().catch(()=>{})},ee),A.unref?.())}async function B(e){try{return(await r.stat(e)).size>q?null:await r.readFile(e,"utf-8")}catch{return null}}function I(e){return e===null?null:$("sha256").update(e,"utf-8").digest("hex").slice(0,16)}async function ae(e){const t=g.get(e);if(!t)return;g.delete(e),t.timer&&clearTimeout(t.timer);const a=l;if(!a){if(t.operation==="DELETE")d.delete(e);else{const p=await B(e);p!==null&&d.set(e,p)}return}const o=s.relative(a.workspacePath,e).replace(/\\/g,"/");if(o.startsWith(".."))return;let n=t.beforeContent,i=null;t.operation==="DELETE"?(n=n??d.get(e)??null,i=null):(i=await B(e),t.operation==="UPDATE"&&n===null&&(n=d.get(e)??null)),t.operation==="DELETE"?d.delete(e):d.set(e,i);const c=new Date().toISOString(),f=L(a.taskInstanceId,o,c);t.operation==="UPDATE"&&n!==null&&i!==null?await _(a.workspacePath,f,n,i):t.operation==="DELETE"&&await v(a.workspacePath,f,n),await O(a,{workspacePath:a.workspacePath,filePath:o,operation:t.operation,beforeContent:n,afterContent:i,beforeHash:I(n),afterHash:I(i),timestamp:c,reason:z(t.operation,n,i)},f)}async function O(e,t,a){try{const o=J().url,n=H(o)||H();if(!n){h.warn("Cannot send change record: no auth token");return}const i=JSON.stringify({toolRecorded:!0,cacheKey:a,timestamp:t.timestamp}),f=(await G.post(`${o}/api/runtime/callback/task-file-changed`,{agentId:e.agentId,taskInstanceId:e.taskInstanceId,taskNodeId:e.taskNodeId,tenantId:e.tenantId,operation:t.operation,targetType:"FILE",targetPath:t.filePath,beforeHash:t.beforeHash,afterHash:t.afterHash,metadata:i,reason:t.reason,workspacePath:e.workspacePath},{headers:{"X-Runtime-Token":n},timeout:1e4})).data;if(f?.ignored===!0?h.warn(`Change record ignored by server: ${t.filePath} (${t.operation}), reason: ${String(f.reason??"unknown")}`):h.info(`Change record sent: ${t.filePath} (${t.operation})`),f&&f.changeCacheRetentionDays!==void 0){const p=D();Z(f.changeCacheRetentionDays),p!==D()&&(x=0,R().catch(()=>{}))}}catch(o){h.warn(`Failed to send change record: ${o.message}`)}}async function K(){if(b)return;b=!0;const e=Array.from(g.keys());for(const t of e)try{await ae(t)}catch{}b=!1}function Ie(){return g.size}function Ee(){return T&&u!==null}function $e(){return k}function z(e,t,a){const o=t?t.split(`
2
+ `).length:0,n=a?a.split(`
3
+ `).length:0;if(e==="CREATE")return`\u521B\u5EFA\u6587\u4EF6\uFF0C\u5171 ${n} \u884C`;if(e==="DELETE")return`\u5220\u9664\u6587\u4EF6\uFF0C\u539F ${o} \u884C`;if(o===n)return`\u4FEE\u6539\u6587\u4EF6\uFF08\u884C\u6570\u4E0D\u53D8\uFF0C${n} \u884C\uFF09`;const i=n-o;return`\u4FEE\u6539\u6587\u4EF6\uFF1A${o} \u884C -> ${n} \u884C\uFF08${i>0?"+":""}${i} \u884C\uFF09`}async function De(e){const t=l,a=e.agentId||t?.agentId,o=e.workspacePath||t?.workspacePath;if(!a||!o){h.warn(`Agent file change skipped (no identity): ${e.filePath} (${e.operation})`);return}h.info(`Recording agent file change: ${e.filePath} (${e.operation}), taskNode=${t?.taskNodeId??"(no task)"}`);const n=t??{agentId:a,taskInstanceId:"",taskNodeId:"",tenantId:"",workspacePath:o,projectId:""},i=new Date().toISOString(),c=L(n.taskInstanceId,e.filePath,i);e.operation==="UPDATE"&&e.beforeContent!==null&&e.afterContent!==null?(await _(n.workspacePath,c,e.beforeContent,e.afterContent),await v(n.workspacePath,c,e.beforeContent)):e.operation==="DELETE"&&await v(n.workspacePath,c,e.beforeContent);const f=e.reason?.trim()||z(e.operation,e.beforeContent,e.afterContent);await O(n,{workspacePath:n.workspacePath,filePath:e.filePath,operation:e.operation,beforeContent:e.beforeContent,afterContent:e.afterContent,beforeHash:I(e.beforeContent),afterHash:I(e.afterContent),timestamp:i,reason:f},c)}export{pe as clearTaskContext,Ie as getPendingChangeCountForTest,ge as getTaskContext,$e as getWorkspaceRoot,we as hasActiveTask,Ee as isWatching,ke as readBeforeContentFromCache,ye as readDiffFromCache,De as recordAgentFileChange,de as setTaskContext,Ce as startWatching,me as stopWatching,R as sweepExpiredChangeCache};
4
4
 
@@ -1,3 +1,3 @@
1
- import{spawn as E}from"node:child_process";import{createHash as h}from"node:crypto";import{createWriteStream as B,mkdirSync as b,renameSync as z,rmSync as U,writeFileSync as k}from"node:fs";import{promises as c}from"node:fs";import a from"node:path";import{Readable as T,Transform as y}from"node:stream";import{pipeline as v}from"node:stream/promises";import F from"unzipper";import S from"axios";import{DEFAULT_SCHEDULER_BASE_URL as L,schedulerBaseUrl as _}from"../config.js";import{getRuntimeAccessToken as p,loadRuntimeBinding as A}from"../services/runtime-binding.js";const d=new Map;function g(){const e=String(process.env.AWS_RUNTIME_SCHEDULER_BASE_URL||"").trim();if(e)return e;const t=A(),r=String(t.schedulerBaseUrl||"").trim();return t.status==="paired"&&r?r:_||L}async function W(e){return await c.mkdir(e,{recursive:!0}),e}async function Y(e,t){const r=a.resolve(e),n=d.get(r)??Promise.resolve();let i;const o=new Promise(m=>{i=m}),s=n.then(()=>o);d.set(r,s),await n;try{return await t()}finally{i(),d.get(r)===s&&d.delete(r)}}function j(e){if(!e||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function w(e){return Array.isArray(e)?e.map(t=>w(t)):j(e)?Object.keys(e).sort().reduce((t,r)=>(t[r]=w(e[r]),t),{}):e}function N(e){return`${JSON.stringify(w(e),null,2)}
2
- `}function P(e){return String(e??"").replace(/[^a-zA-Z0-9_.-]/g,"_").replace(/^\.+/g,"").slice(0,128)}function x(e,t){const r=String(e??"").trim();if(!r||/[\\/]/.test(r))return t;const n=a.basename(r);return!n||n==="."||n===".."?t:n}async function C(e,t){await W(a.dirname(e));const r=a.dirname(e),n=a.basename(e),i=a.join(r,`.${n}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`);try{await c.writeFile(i,t,"utf-8"),await c.rename(i,e)}catch(o){throw await c.rm(i,{force:!0}).catch(()=>{}),o}}function ee(e,t){b(a.dirname(e),{recursive:!0});const r=a.dirname(e),n=a.basename(e),i=a.join(r,`.${n}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`);try{k(i,t,"utf-8"),z(i,e)}catch(o){try{U(i,{force:!0})}catch{}throw o}}async function re(e,t){await C(e,N(t))}async function te(e,t){if(!e||!e.downloadUrl)return null;const r=String(e.downloadUrl).trim();if(!r)return null;const n=g();let i=r;i.startsWith("/")&&(i=`${n}${i}`);const o=x(e.fileName,"skill-package.zip"),s=a.join(t,o),m=p(n)||p();if(!m)throw new Error("runtime access token is required to download skill package");const l=await S.get(i,{responseType:"arraybuffer",timeout:3e4,headers:{"X-Runtime-Token":m}}),u=Buffer.from(l.data);if(await c.writeFile(s,u),e.sha256&&h("sha256").update(u).digest("hex")!==String(e.sha256).trim().toLowerCase())throw new Error("skill zip checksum mismatch");return{fileName:o,outputPath:s,bytes:u.length}}async function ne(e,t){await new Promise((r,n)=>{const i=E(e,t,{stdio:["ignore","pipe","pipe"]});let o="";i.stderr?.on("data",s=>{o+=String(s||"")}),i.on("error",s=>{n(s)}),i.on("close",s=>{if(s!==0){n(new Error(o||`${e} exited with code ${s}`));return}r()})})}function ie(e){return String(e||"").replace(/'/g,"''")}const f={maxEntries:2e3,maxFileBytes:100*1024*1024,maxTotalBytes:200*1024*1024,maxPathLength:400,maxPathDepth:24};function D(e,t){const r=String(t||"").replace(/\\/g,"/");if(!r||r.startsWith("/")||/^[A-Za-z]:/.test(r)||r.split("/").includes(".."))throw new Error(`skill zip \u6761\u76EE\u8DEF\u5F84\u975E\u6CD5: ${t}`);if(r.length>f.maxPathLength)throw new Error(`skill zip \u6761\u76EE\u8DEF\u5F84\u8FC7\u957F: ${t}`);if(r.split("/").filter(Boolean).length>f.maxPathDepth)throw new Error(`skill zip \u6761\u76EE\u8DEF\u5F84\u8FC7\u6DF1: ${t}`);const n=a.resolve(e,r),i=a.resolve(e)+a.sep;if(n!==a.resolve(e)&&!n.startsWith(i))throw new Error(`skill zip \u6761\u76EE\u8D8A\u754C\uFF08zip-slip\uFF09: ${t}`);return n}function I(e,t){let r=0;return new y({transform(n,i,o){if(r+=n.length,r>e){o(new Error(`${t} \u8D85\u51FA\u4E0A\u9650\uFF08${e} \u5B57\u8282\uFF09`));return}o(null,n)}})}function O(e,t){let r=0;return{transform(){return new y({transform(n,i,o){if(r+=n.length,r>e){o(new Error(`${t} \u8D85\u51FA\u603B\u91CF\u4E0A\u9650\uFF08${e} \u5B57\u8282\uFF09`));return}o(null,n)}})}}}async function oe(e,t){await c.rm(t,{recursive:!0,force:!0}),await c.mkdir(t,{recursive:!0});const r=await c.readFile(e),n=T.from([r]),i=n.pipe(F.Parse({forceStream:!0}));let o=0,s=0;const m=O(f.maxTotalBytes,"skill zip \u89E3\u538B\u603B\u91CF");try{for await(const l of i){const u=D(t,l.path);if(l.type==="Directory"){await c.mkdir(u,{recursive:!0}),l.autodrain?.();continue}if(l.type!=="File"){l.autodrain?.();continue}if(o++,o>f.maxEntries)throw new Error(`skill zip \u6761\u76EE\u6570\u8D85\u51FA\u4E0A\u9650\uFF08${f.maxEntries}\uFF09`);if(s+=Number(l.size??0),s>f.maxTotalBytes)throw new Error(`skill zip \u603B\u91CF\u8D85\u51FA\u4E0A\u9650\uFF08${f.maxTotalBytes} \u5B57\u8282\uFF09`);await c.mkdir(a.dirname(u),{recursive:!0}),await v(l,I(f.maxFileBytes,`skill zip \u6761\u76EE ${l.path}`),m.transform(),B(u))}}catch(l){throw await c.rm(t,{recursive:!0,force:!0}).catch(()=>{}),l}finally{n.destroy(),i.destroy?.()}}async function se(e){const r=(await c.readdir(e,{withFileTypes:!0})).filter(n=>!n.name.startsWith("."));return r.length===1&&r[0].isDirectory()?a.join(e,r[0].name):e}async function ae(e,t){if(!e||!e.downloadUrl)return null;const r=String(e.downloadUrl).trim();if(!r)return null;const n=g();let i=r;i.startsWith("/")&&(i=`${n}${i}`);const o=x(e.fileName,"plugin-package.zip"),s=a.join(t,o),m=p(n)||p();if(!m)throw new Error("runtime access token is required to download plugin package");const l=await S.get(i,{responseType:"arraybuffer",timeout:3e4,headers:{"X-Runtime-Token":m}}),u=Buffer.from(l.data);if(await c.writeFile(s,u),e.sha256&&h("sha256").update(u).digest("hex")!==String(e.sha256).trim().toLowerCase())throw new Error(`plugin package sha256 mismatch: ${o}`);return{fileName:o,outputPath:s,bytes:u.length}}export{C as atomicWriteFile,ee as atomicWriteFileSync,re as atomicWriteJsonFile,ae as downloadPluginZip,te as downloadSkillZip,W as ensureDir,ie as escapePowerShellLiteral,oe as extractSkillZip,se as resolveSkillSourceDirFromExtractRoot,ne as runCommand,P as sanitizeAgentId,x as sanitizeArchiveFileName,N as stringifyStableJson,Y as withFileLock};
1
+ import{spawn as E}from"node:child_process";import{createHash as h}from"node:crypto";import{createWriteStream as B,mkdirSync as b,renameSync as z,rmSync as U,writeFileSync as k,promises as c}from"node:fs";import a from"node:path";import{Readable as T,Transform as y}from"node:stream";import{pipeline as v}from"node:stream/promises";import S from"axios";import F from"unzipper";import{DEFAULT_SCHEDULER_BASE_URL as L,schedulerBaseUrl as _}from"../config.js";import{getRuntimeAccessToken as p,loadRuntimeBinding as A}from"../services/runtime-binding.js";const d=new Map;function g(){const e=String(process.env.AWS_RUNTIME_SCHEDULER_BASE_URL||"").trim();if(e)return e;const t=A(),r=String(t.schedulerBaseUrl||"").trim();return t.status==="paired"&&r?r:_||L}async function W(e){return await c.mkdir(e,{recursive:!0}),e}async function Q(e,t){const r=a.resolve(e),n=d.get(r)??Promise.resolve();let i;const o=new Promise(m=>{i=m}),s=n.then(()=>o);d.set(r,s),await n;try{return await t()}finally{i(),d.get(r)===s&&d.delete(r)}}function j(e){if(!e||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function w(e){return Array.isArray(e)?e.map(t=>w(t)):j(e)?Object.keys(e).sort().reduce((t,r)=>(t[r]=w(e[r]),t),{}):e}function N(e){return`${JSON.stringify(w(e),null,2)}
2
+ `}function Y(e){return String(e??"").replace(/[^a-zA-Z0-9_.-]/g,"_").replace(/^\.+/g,"").slice(0,128)}function x(e,t){const r=String(e??"").trim();if(!r||/[\\/]/.test(r))return t;const n=a.basename(r);return!n||n==="."||n===".."?t:n}async function C(e,t){await W(a.dirname(e));const r=a.dirname(e),n=a.basename(e),i=a.join(r,`.${n}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`);try{await c.writeFile(i,t,"utf-8"),await c.rename(i,e)}catch(o){throw await c.rm(i,{force:!0}).catch(()=>{}),o}}function P(e,t){b(a.dirname(e),{recursive:!0});const r=a.dirname(e),n=a.basename(e),i=a.join(r,`.${n}.tmp-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`);try{k(i,t,"utf-8"),z(i,e)}catch(o){try{U(i,{force:!0})}catch{}throw o}}async function ee(e,t){await C(e,N(t))}async function re(e,t){if(!e||!e.downloadUrl)return null;const r=String(e.downloadUrl).trim();if(!r)return null;const n=g();let i=r;i.startsWith("/")&&(i=`${n}${i}`);const o=x(e.fileName,"skill-package.zip"),s=a.join(t,o),m=p(n)||p();if(!m)throw new Error("runtime access token is required to download skill package");const l=await S.get(i,{responseType:"arraybuffer",timeout:3e4,headers:{"X-Runtime-Token":m}}),u=Buffer.from(l.data);if(await c.writeFile(s,u),e.sha256&&h("sha256").update(u).digest("hex")!==String(e.sha256).trim().toLowerCase())throw new Error("skill zip checksum mismatch");return{fileName:o,outputPath:s,bytes:u.length}}async function te(e,t){await new Promise((r,n)=>{const i=E(e,t,{stdio:["ignore","pipe","pipe"]});let o="";i.stderr?.on("data",s=>{o+=String(s||"")}),i.on("error",s=>{n(s)}),i.on("close",s=>{if(s!==0){n(new Error(o||`${e} exited with code ${s}`));return}r()})})}function ne(e){return String(e||"").replace(/'/g,"''")}const f={maxEntries:2e3,maxFileBytes:100*1024*1024,maxTotalBytes:200*1024*1024,maxPathLength:400,maxPathDepth:24};function D(e,t){const r=String(t||"").replace(/\\/g,"/");if(!r||r.startsWith("/")||/^[A-Za-z]:/.test(r)||r.split("/").includes(".."))throw new Error(`skill zip \u6761\u76EE\u8DEF\u5F84\u975E\u6CD5: ${t}`);if(r.length>f.maxPathLength)throw new Error(`skill zip \u6761\u76EE\u8DEF\u5F84\u8FC7\u957F: ${t}`);if(r.split("/").filter(Boolean).length>f.maxPathDepth)throw new Error(`skill zip \u6761\u76EE\u8DEF\u5F84\u8FC7\u6DF1: ${t}`);const n=a.resolve(e,r),i=a.resolve(e)+a.sep;if(n!==a.resolve(e)&&!n.startsWith(i))throw new Error(`skill zip \u6761\u76EE\u8D8A\u754C\uFF08zip-slip\uFF09: ${t}`);return n}function I(e,t){let r=0;return new y({transform(n,i,o){if(r+=n.length,r>e){o(new Error(`${t} \u8D85\u51FA\u4E0A\u9650\uFF08${e} \u5B57\u8282\uFF09`));return}o(null,n)}})}function O(e,t){let r=0;return{transform(){return new y({transform(n,i,o){if(r+=n.length,r>e){o(new Error(`${t} \u8D85\u51FA\u603B\u91CF\u4E0A\u9650\uFF08${e} \u5B57\u8282\uFF09`));return}o(null,n)}})}}}async function ie(e,t){await c.rm(t,{recursive:!0,force:!0}),await c.mkdir(t,{recursive:!0});const r=await c.readFile(e),n=T.from([r]),i=n.pipe(F.Parse({forceStream:!0}));let o=0,s=0;const m=O(f.maxTotalBytes,"skill zip \u89E3\u538B\u603B\u91CF");try{for await(const l of i){const u=D(t,l.path);if(l.type==="Directory"){await c.mkdir(u,{recursive:!0}),l.autodrain?.();continue}if(l.type!=="File"){l.autodrain?.();continue}if(o++,o>f.maxEntries)throw new Error(`skill zip \u6761\u76EE\u6570\u8D85\u51FA\u4E0A\u9650\uFF08${f.maxEntries}\uFF09`);if(s+=Number(l.size??0),s>f.maxTotalBytes)throw new Error(`skill zip \u603B\u91CF\u8D85\u51FA\u4E0A\u9650\uFF08${f.maxTotalBytes} \u5B57\u8282\uFF09`);await c.mkdir(a.dirname(u),{recursive:!0}),await v(l,I(f.maxFileBytes,`skill zip \u6761\u76EE ${l.path}`),m.transform(),B(u))}}catch(l){throw await c.rm(t,{recursive:!0,force:!0}).catch(()=>{}),l}finally{n.destroy(),i.destroy?.()}}async function oe(e){const r=(await c.readdir(e,{withFileTypes:!0})).filter(n=>!n.name.startsWith("."));return r.length===1&&r[0].isDirectory()?a.join(e,r[0].name):e}async function se(e,t){if(!e||!e.downloadUrl)return null;const r=String(e.downloadUrl).trim();if(!r)return null;const n=g();let i=r;i.startsWith("/")&&(i=`${n}${i}`);const o=x(e.fileName,"plugin-package.zip"),s=a.join(t,o),m=p(n)||p();if(!m)throw new Error("runtime access token is required to download plugin package");const l=await S.get(i,{responseType:"arraybuffer",timeout:3e4,headers:{"X-Runtime-Token":m}}),u=Buffer.from(l.data);if(await c.writeFile(s,u),e.sha256&&h("sha256").update(u).digest("hex")!==String(e.sha256).trim().toLowerCase())throw new Error(`plugin package sha256 mismatch: ${o}`);return{fileName:o,outputPath:s,bytes:u.length}}export{C as atomicWriteFile,P as atomicWriteFileSync,ee as atomicWriteJsonFile,se as downloadPluginZip,re as downloadSkillZip,W as ensureDir,ne as escapePowerShellLiteral,ie as extractSkillZip,oe as resolveSkillSourceDirFromExtractRoot,te as runCommand,Y as sanitizeAgentId,x as sanitizeArchiveFileName,N as stringifyStableJson,Q as withFileLock};
3
3
 
@@ -1,4 +1,4 @@
1
- import n from"node:fs/promises";import a from"node:path";import g from"node:os";const c=a.join(g.userInfo().homedir,"Instance-ai-configuration-debug.log");class l{constructor(s=c){this.logPath=s}async log(s){try{const o=[`[${new Date().toISOString()}]`,`[${s.level.toUpperCase()}]`,`[${s.source}]`,`[${s.category}]`,s.message];s.sessionId&&o.push(`session=${s.sessionId}`),s.agentId&&o.push(`agent=${s.agentId}`);const i=o.join(" "),e=s.details?` ${JSON.stringify(s.details,null,2)}`:"";await n.appendFile(this.logPath,`${i}
1
+ import n from"node:fs/promises";import a from"node:os";import g from"node:path";const c=g.join(a.userInfo().homedir,"Instance-ai-configuration-debug.log");class l{constructor(s=c){this.logPath=s}async log(s){try{const o=[`[${new Date().toISOString()}]`,`[${s.level.toUpperCase()}]`,`[${s.source}]`,`[${s.category}]`,s.message];s.sessionId&&o.push(`session=${s.sessionId}`),s.agentId&&o.push(`agent=${s.agentId}`);const i=o.join(" "),e=s.details?` ${JSON.stringify(s.details,null,2)}`:"";await n.appendFile(this.logPath,`${i}
2
2
  ${e?`${e}
3
3
  `:""}`,"utf-8")}catch{}}async flush(){}}let t;function d(){return t||(t=new l),t}export{l as InstanceAiConfigDebugLogger,d as getInstanceAiConfigDebugLogger};
4
4
 
@@ -1,2 +1,2 @@
1
- import{randomUUID as o}from"node:crypto";import{parseBoolean as a}from"./validation.js";function m(n){if(!n||typeof n!="object")return null;const r=n,t=String(r.name||"").trim();return t?{id:String(r.id||o()),name:t,transport:String(r.transport||"stdio").trim().toLowerCase(),command:r.command==null?"":String(r.command),url:r.url==null?"":String(r.url),args:Array.isArray(r.args)?r.args.map(e=>String(e)):[],env:r.env&&typeof r.env=="object"?r.env:{},enabled:a(r.enabled,!0),installedAt:r.installedAt||new Date().toISOString()}:null}export{m as normalizeMcpPayload};
1
+ import{randomUUID as o}from"node:crypto";import{parseBoolean as i}from"./validation.js";function m(r){if(!r||typeof r!="object")return null;const n=r,t=String(n.name||"").trim();return t?{id:String(n.id||o()),name:t,transport:String(n.transport||"stdio").trim().toLowerCase(),command:n.command===null||n.command===void 0?"":String(n.command),url:n.url===null||n.url===void 0?"":String(n.url),args:Array.isArray(n.args)?n.args.map(e=>String(e)):[],env:n.env&&typeof n.env=="object"?n.env:{},enabled:i(n.enabled,!0),installedAt:n.installedAt||new Date().toISOString()}:null}export{m as normalizeMcpPayload};
2
2
 
@@ -1,2 +1,2 @@
1
- import f from"node:path";import{promises as m}from"node:fs";import*as g from"js-yaml";import{createLogger as y}from"./logger.js";const d=y("yaml-utils");function P(a,p){try{const n=g.load(a);if(!n||typeof n!="object")return null;const i=n.agent;if(!Array.isArray(i))return null;const r=p.replace(/\\/g,"/");for(const t of i){if(!t||typeof t!="object")continue;const o=t.path;if(typeof o!="string")continue;const u=o.replace(/\\/g,"/");if(u===r||r==="."&&(u==="."||u===""))return o}return null}catch{return null}}function S(a,p){try{const n=g.load(a);if(!n||typeof n!="object")return{content:a,isTemplate:!1,projectFromSibling:null};const i=n.agent;if(!Array.isArray(i))return{content:a,isTemplate:!1,projectFromSibling:null};const r=p.replace(/\\/g,"/");for(const e of i){if(!e||typeof e!="object")continue;const s=e,c=s.path;if(typeof c!="string")continue;const l=c.replace(/\\/g,"/");if(l===r||r==="."&&(l==="."||l==="")){const b={...s,path:l};return{content:g.dump({agent:[b]},{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1}),isTemplate:!1,projectFromSibling:null}}}let t=null;for(const e of i){if(!e||typeof e!="object")continue;const s=e;if(typeof s.project=="string"){t=s.project;break}}const o={agent:[{name:"",path:r,project:t||"",describe:"",prompt:""}]};return{content:g.dump(o,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1}),isTemplate:!0,projectFromSibling:t}}catch{return{content:a,isTemplate:!1,projectFromSibling:null}}}function w(a){const n={agent:[{name:"",path:String(a||".").trim().replace(/\\/g,"/")||".",project:"",describe:"",prompt:""}]};return g.dump(n,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1})}function z(a,p){try{const n=g.load(a);if(!n||typeof n!="object")return a;const i=n;if(!i.agent||!Array.isArray(i.agent))return a;let r=!1;for(const t of i.agent)if(t){const o=t.path;(o==null||String(o).trim()==="")&&(t.path=p,r=!0)}return r?g.dump(i,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1}):a}catch{return a}}async function F(a,p){const n=f.resolve(a),i=p.replace(/\//g,f.sep),r=f.resolve(n,i);let t=null;try{const e=await m.readFile(r,"utf-8");d.debug(`\u5DE5\u4F5C\u76EE\u5F55\u4E0B\u627E\u5230\u914D\u7F6E: ${r}`);const c=P(e,".");if(c)return d.debug(`\u5F53\u524D\u76EE\u5F55\u914D\u7F6E\u5339\u914D path: ${c}`),{content:e,resolvedPath:r,foundInParent:!1,matchedAgentPath:c};d.debug("\u5F53\u524D\u76EE\u5F55\u914D\u7F6E\u4E0D\u5339\u914D\uFF0C\u7EE7\u7EED\u5411\u4E0A\u67E5\u627E"),t={content:e,resolvedPath:r}}catch(e){if(e?.code!=="ENOENT")throw e}let o=n;const u=f.parse(o).root;for(;o&&o!==u;){const e=f.dirname(o);if(e===o)break;const s=f.relative(e,n),c=f.join(e,i);try{const l=await m.readFile(c,"utf-8");d.debug(`\u4E0A\u5C42\u627E\u5230\u914D\u7F6E\u6587\u4EF6: ${c}`);const h=P(l,s);if(d.debug(`\u76F8\u5BF9\u8DEF\u5F84: ${s}, \u5339\u914D\u7684agent path: ${h||"\u65E0"}`),h)return{content:l,resolvedPath:c,foundInParent:!0,matchedAgentPath:h};t={content:l,resolvedPath:c}}catch(l){if(l?.code!=="ENOENT")throw l}o=e}return t?(d.debug(`\u6240\u6709\u5C42\u7EA7\u90FD\u4E0D\u5339\u914D\uFF0C\u4F7F\u7528\u6700\u540E\u627E\u5230\u7684\u914D\u7F6E: ${t.resolvedPath}`),{content:t.content,resolvedPath:t.resolvedPath,foundInParent:t.resolvedPath!==r,matchedAgentPath:null}):(d.debug(`\u672A\u627E\u5230\u914D\u7F6E\uFF0C\u5C06\u5728\u5DE5\u4F5C\u76EE\u5F55\u521B\u5EFA: ${r}`),{content:null,resolvedPath:r,foundInParent:!1,matchedAgentPath:null})}export{z as autoFillPathInYml,S as extractAgentConfigOrTemplate,w as generateEmptyTemplate,P as hasMatchingAgentPath,F as loadYmlWithUpwardSearch};
1
+ import{promises as m}from"node:fs";import f from"node:path";import*as g from"js-yaml";import{createLogger as y}from"./logger.js";const d=y("yaml-utils");function P(a,p){try{const n=g.load(a);if(!n||typeof n!="object")return null;const i=n.agent;if(!Array.isArray(i))return null;const r=p.replace(/\\/g,"/");for(const t of i){if(!t||typeof t!="object")continue;const o=t.path;if(typeof o!="string")continue;const u=o.replace(/\\/g,"/");if(u===r||r==="."&&(u==="."||u===""))return o}return null}catch{return null}}function S(a,p){try{const n=g.load(a);if(!n||typeof n!="object")return{content:a,isTemplate:!1,projectFromSibling:null};const i=n.agent;if(!Array.isArray(i))return{content:a,isTemplate:!1,projectFromSibling:null};const r=p.replace(/\\/g,"/");for(const e of i){if(!e||typeof e!="object")continue;const s=e,c=s.path;if(typeof c!="string")continue;const l=c.replace(/\\/g,"/");if(l===r||r==="."&&(l==="."||l==="")){const b={...s,path:l};return{content:g.dump({agent:[b]},{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1}),isTemplate:!1,projectFromSibling:null}}}let t=null;for(const e of i){if(!e||typeof e!="object")continue;const s=e;if(typeof s.project=="string"){t=s.project;break}}const o={agent:[{name:"",path:r,project:t||"",describe:"",prompt:""}]};return{content:g.dump(o,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1}),isTemplate:!0,projectFromSibling:t}}catch{return{content:a,isTemplate:!1,projectFromSibling:null}}}function w(a){const n={agent:[{name:"",path:String(a||".").trim().replace(/\\/g,"/")||".",project:"",describe:"",prompt:""}]};return g.dump(n,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1})}function z(a,p){try{const n=g.load(a);if(!n||typeof n!="object")return a;const i=n;if(!i.agent||!Array.isArray(i.agent))return a;let r=!1;for(const t of i.agent)if(t){const o=t.path;(o==null||String(o).trim()==="")&&(t.path=p,r=!0)}return r?g.dump(i,{indent:2,lineWidth:-1,quotingType:'"',forceQuotes:!1}):a}catch{return a}}async function F(a,p){const n=f.resolve(a),i=p.replace(/\//g,f.sep),r=f.resolve(n,i);let t=null;try{const e=await m.readFile(r,"utf-8");d.debug(`\u5DE5\u4F5C\u76EE\u5F55\u4E0B\u627E\u5230\u914D\u7F6E: ${r}`);const c=P(e,".");if(c)return d.debug(`\u5F53\u524D\u76EE\u5F55\u914D\u7F6E\u5339\u914D path: ${c}`),{content:e,resolvedPath:r,foundInParent:!1,matchedAgentPath:c};d.debug("\u5F53\u524D\u76EE\u5F55\u914D\u7F6E\u4E0D\u5339\u914D\uFF0C\u7EE7\u7EED\u5411\u4E0A\u67E5\u627E"),t={content:e,resolvedPath:r}}catch(e){if(e?.code!=="ENOENT")throw e}let o=n;const u=f.parse(o).root;for(;o&&o!==u;){const e=f.dirname(o);if(e===o)break;const s=f.relative(e,n),c=f.join(e,i);try{const l=await m.readFile(c,"utf-8");d.debug(`\u4E0A\u5C42\u627E\u5230\u914D\u7F6E\u6587\u4EF6: ${c}`);const h=P(l,s);if(d.debug(`\u76F8\u5BF9\u8DEF\u5F84: ${s}, \u5339\u914D\u7684agent path: ${h||"\u65E0"}`),h)return{content:l,resolvedPath:c,foundInParent:!0,matchedAgentPath:h};t={content:l,resolvedPath:c}}catch(l){if(l?.code!=="ENOENT")throw l}o=e}return t?(d.debug(`\u6240\u6709\u5C42\u7EA7\u90FD\u4E0D\u5339\u914D\uFF0C\u4F7F\u7528\u6700\u540E\u627E\u5230\u7684\u914D\u7F6E: ${t.resolvedPath}`),{content:t.content,resolvedPath:t.resolvedPath,foundInParent:t.resolvedPath!==r,matchedAgentPath:null}):(d.debug(`\u672A\u627E\u5230\u914D\u7F6E\uFF0C\u5C06\u5728\u5DE5\u4F5C\u76EE\u5F55\u521B\u5EFA: ${r}`),{content:null,resolvedPath:r,foundInParent:!1,matchedAgentPath:null})}export{z as autoFillPathInYml,S as extractAgentConfigOrTemplate,w as generateEmptyTemplate,P as hasMatchingAgentPath,F as loadYmlWithUpwardSearch};
2
2
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{randomUUID as d}from"node:crypto";import a from"node:os";import m from"node:path";import{ACodeRuntime as p}from"./runtime.js";function o(t,s){const i=t.indexOf(s);if(i>=0)return t[i+1];const n=t.find(e=>e.startsWith(`${s}=`));return n?n.slice(s.length+1):void 0}async function f(){const t=process.argv.slice(2),s=m.resolve(o(t,"--cwd")||process.cwd()),i=o(t,"--config"),n=o(t,"--skills-dir"),e=o(t,"--prompt")||t.filter(c=>!c.startsWith("--")).join(" "),r=new p({sessionId:o(t,"--session-id")||d(),agentId:o(t,"--agent-id")||a.hostname(),workingDirectory:s,configPath:i,skillsDir:n,initialPrompt:e,model:o(t,"--model")});r.on("event",c=>{process.stdout.write(`${JSON.stringify(c)}
3
- `)}),await r.start(),await r.stop()}f().catch(t=>{const s=t instanceof Error?t.message:String(t);process.stderr.write(`[acode] ${s}
2
+ import{randomUUID as a}from"node:crypto";import p from"node:os";import m from"node:path";import{ACodeRuntime as f}from"./runtime.js";function s(t,i){const o=t.indexOf(i);if(o>=0)return t[o+1];const n=t.find(e=>e.startsWith(`${i}=`));return n?n.slice(i.length+1):void 0}async function l(){const t=process.argv.slice(2),i=m.resolve(s(t,"--cwd")||process.cwd()),o=s(t,"--config"),n=s(t,"--skills-dir"),e=s(t,"--plugins-dir"),d=s(t,"--prompt")||t.filter(c=>!c.startsWith("--")).join(" "),r=new f({sessionId:s(t,"--session-id")||a(),agentId:s(t,"--agent-id")||p.hostname(),workingDirectory:i,configPath:o,skillsDir:n,pluginsDir:e,initialPrompt:d,model:s(t,"--model")});r.on("event",c=>{process.stdout.write(`${JSON.stringify(c)}
3
+ `)}),await r.start(),await r.stop()}l().catch(t=>{const i=t instanceof Error?t.message:String(t);process.stderr.write(`[acode] ${i}
4
4
  `),process.exitCode=1});
5
5
 
@@ -1,14 +1,9 @@
1
- const d=/^[a-z0-9][a-z0-9-]*$/,y=`\u8C03\u7528\u63D2\u4EF6\u5C42\u6CE8\u5165\u7684\u5DE5\u5177\uFF08\u4E09\u65B9\u5DE5\u5177\u7ECF\u63D2\u4EF6\u63A5\u5165\u540E\u7684\u7EDF\u4E00\u8C03\u7528\u5165\u53E3\uFF09\u3002
1
+ const h=/^[a-z0-9][a-z0-9-]*$/,d=`\u8C03\u7528\u63D2\u4EF6\u5C42\u6CE8\u5165\u7684\u5DE5\u5177\uFF08\u4E09\u65B9\u5DE5\u5177\u7ECF\u63D2\u4EF6\u63A5\u5165\u540E\u7684\u7EDF\u4E00\u8C03\u7528\u5165\u53E3\uFF09\u3002
2
2
  \u63D2\u4EF6\u5DE5\u5177\u4E0D\u5728\u4F60\u7684\u9759\u6001\u5DE5\u5177\u5217\u8868\u4E2D\uFF1A\u53EF\u7528\u5DE5\u5177\u7684\u7D27\u51D1\u76EE\u5F55\u968F poll_message \u7ED3\u679C\u7684 pluginCatalog \u5B57\u6BB5\u8FD4\u56DE\uFF08\u542B\u63D2\u4EF6\u540D\u3001\u5DE5\u5177\u540D\u3001\u4E00\u53E5\u8BDD\u63CF\u8FF0\u3001\u5FC5\u586B\u53C2\u6570\uFF09\uFF0C\u63D2\u4EF6\u4E8B\u4EF6\u6D88\u606F\u5C3E\u90E8\u4F1A\u9644 toolHints \u63D0\u793A\u5EFA\u8BAE\u8C03\u7528\u7684\u5DE5\u5177\u3002
3
3
  \u7528\u6CD5\uFF1A
4
4
  - action=call\uFF08\u9ED8\u8BA4\uFF09\uFF1Atool \u4F20\u9650\u5B9A\u540D "\u63D2\u4EF6\u540D.\u5DE5\u5177\u540D"\uFF08\u5982 "wechat-cli.send_msg"\uFF09\uFF0Cparams \u4F20\u52A8\u6001\u53C2\u6570\u5BF9\u8C61\uFF1B\u53C2\u6570\u6309\u63D2\u4EF6\u58F0\u660E\u7684 JSON Schema \u6821\u9A8C\uFF0C\u6821\u9A8C\u5931\u8D25\u65F6\u8FD4\u56DE\u7ED3\u679C\u4F1A\u9644\u5E26\u5B8C\u6574 inputSchema\uFF0C\u8BF7\u4FEE\u6B63\u540E\u91CD\u8BD5\u3002
5
5
  - action=schema\uFF1Atool \u4F20\u9650\u5B9A\u540D\uFF08\u652F\u6301 "\u63D2\u4EF6\u540D.*"\uFF09\uFF0C\u8FD4\u56DE\u8BE5\u5DE5\u5177\uFF08\u6216\u63D2\u4EF6\u5168\u90E8\u5DE5\u5177\uFF09\u7684\u5B8C\u6574 JSON Schema \u5B9A\u4E49\u3002\u76EE\u5F55\u63CF\u8FF0\u4E0D\u591F\u7528\u3001\u6216\u53C2\u6570\u6821\u9A8C\u53CD\u590D\u5931\u8D25\u65F6\u5148\u53D6 schema\u3002
6
6
  - action=catalog\uFF1A\u8FD4\u56DE\u5F53\u524D\u5168\u90E8\u63D2\u4EF6\u7684\u7D27\u51D1\u76EE\u5F55\uFF08\u5B89\u88C5\u65B0\u63D2\u4EF6\u540E\u53EF\u7528\u5B83\u7ACB\u5373\u611F\u77E5\uFF09\u3002
7
- \u6CE8\u610F\uFF1A\u63D2\u4EF6\u672A\u5B89\u88C5/\u5DF2\u505C\u7528/\u5DE5\u5177\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u660E\u786E\u9519\u8BEF\uFF0C\u4E0D\u8981\u51ED\u7A7A\u7F16\u9020\u5DE5\u5177\u540D\u3002`,h=`\u7BA1\u7406\u63D2\u4EF6\u751F\u547D\u5468\u671F\uFF08\u5B89\u88C5/\u5378\u8F7D/\u91CD\u8F7D/\u542F\u505C/\u5217\u8868\uFF09\u3002\u4EC5\u5F53\u7528\u6237\u660E\u786E\u8981\u6C42\u5B89\u88C5\u3001\u79FB\u9664\u6216\u4FEE\u590D\u63D2\u4EF6\u65F6\u4F7F\u7528\u3002
8
- - action=list\uFF1A\u5217\u51FA\u5DF2\u5B89\u88C5\u63D2\u4EF6\uFF08\u72B6\u6001\u3001\u76D1\u542C\u5668\u5065\u5EB7\u3001\u5DE5\u5177\u6570\uFF09\u3002
9
- - action=install\uFF1Asource \u4E3A\u63D2\u4EF6\u6765\u6E90\uFF0C\u5F53\u524D\u652F\u6301 "local:<\u63D2\u4EF6\u76EE\u5F55\u4E0B\u7684\u8DEF\u5F84>"\uFF08\u63D2\u4EF6\u5FC5\u987B\u4F4D\u4E8E\u63D2\u4EF6\u6839\u76EE\u5F55\u5185\uFF0C\u4E0D\u5141\u8BB8\u4EFB\u610F\u7CFB\u7EDF\u8DEF\u5F84\uFF09\uFF1Bconfig \u4F20\u63D2\u4EF6 manifest \u91CC userConfig \u58F0\u660E\u7684\u914D\u7F6E\u503C\uFF08\u5982 wechat-cli \u7684 WECHAT_TOKEN\uFF09\u3002\u5B89\u88C5\u540E\u7ACB\u5373\u751F\u6548\uFF1A\u4E0B\u4E00\u6B21 poll_message \u7684 pluginCatalog \u5373\u53EF\u89C1\uFF0C\u76D1\u542C\u5668\u5F00\u59CB\u5411 poll_message \u6295\u9012\u4E8B\u4EF6\u3002
10
- - action=reload\uFF1A\u91CD\u8F7D\u6307\u5B9A\u63D2\u4EF6\uFF08\u6539\u8FC7\u63D2\u4EF6\u6587\u4EF6\u540E\u4F7F\u7528\uFF09\uFF0C\u539F\u5B50\u6362\u88C5\uFF0C\u76D1\u542C\u5668\u91CD\u542F\u3002
11
- - action=enable / disable\uFF1A\u505C\u7528/\u542F\u7528\uFF08disable \u4FDD\u7559\u5B89\u88C5\u4E0E\u914D\u7F6E\uFF0C\u4EC5\u505C\u6B62\u76D1\u542C\u4E0E\u5DE5\u5177\u8C03\u7528\uFF09\u3002
12
- - action=uninstall\uFF1A\u5378\u8F7D\u5E76\u5220\u9664\u63D2\u4EF6\u76EE\u5F55\uFF08\u4E0D\u53EF\u9006\uFF0C\u9700\u7528\u6237\u660E\u786E\u8981\u6C42\uFF09\u3002`;function _(e){const t=e.indexOf(".");if(t<=0||t>=e.length-1)return null;const i=e.slice(0,t),n=e.slice(t+1);return!d.test(i)||!n.trim()?null:{plugin:i,tool:n.trim()}}function C(e){const t=e.pluginBridge;return t?[S(t),b(t)]:[]}function S(e){return{kind:"builtin",toolName:"function_call",exposedName:"function_call",category:"plugin",description:y,inputSchema:{type:"object",properties:{action:{type:"string",enum:["call","schema","catalog"],default:"call",description:"call=\u8C03\u7528\u63D2\u4EF6\u5DE5\u5177\uFF1Bschema=\u53D6\u5B8C\u6574\u53C2\u6570\u5B9A\u4E49\uFF1Bcatalog=\u53D6\u63D2\u4EF6\u5DE5\u5177\u76EE\u5F55"},tool:{type:"string",description:'\u9650\u5B9A\u540D "\u63D2\u4EF6\u540D.\u5DE5\u5177\u540D"\uFF08\u5982 "wechat-cli.send_msg"\uFF09\uFF1Baction=schema \u65F6\u652F\u6301 "\u63D2\u4EF6\u540D.*" \u53D6\u6574\u7EC4\u5B9A\u4E49'},params:{type:"object",description:"call \u7684\u52A8\u6001\u53C2\u6570\u5BF9\u8C61\uFF0C\u6309\u63D2\u4EF6\u58F0\u660E\u7684 inputSchema \u6821\u9A8C"}},required:["tool"],additionalProperties:!1},async execute(t,i){const n=typeof t.action=="string"?t.action:"call",o=typeof t.tool=="string"?t.tool.trim():"";try{if(n==="catalog")return await e.getCatalog();if(!o)return{error:'\u7F3A\u5C11 tool \u53C2\u6570\uFF08\u9650\u5B9A\u540D "\u63D2\u4EF6\u540D.\u5DE5\u5177\u540D"\uFF09'};if(n==="schema"){if(o.endsWith(".*")){const r=o.slice(0,-2),m=await e.getCatalog(),g=m.plugins.find(u=>u.plugin===r);if(!g)return{error:`\u63D2\u4EF6 ${r} \u672A\u5B89\u88C5\u6216\u5DF2\u505C\u7528`,catalog:m.plugins};const f=await Promise.all(g.tools.map(u=>e.getToolSchema(`${r}.${u.name}`)));return{plugin:r,schemas:f.filter(Boolean)}}const p=await e.getToolSchema(o);return p||{error:`\u672A\u77E5\u63D2\u4EF6\u5DE5\u5177: ${o}\uFF08\u53EF\u5148 action=catalog \u67E5\u770B\u76EE\u5F55\uFF09`}}if(n!=="call")return{error:`\u672A\u77E5 action: ${n}\uFF08\u5141\u8BB8\uFF1Acall / schema / catalog\uFF09`};const a=_(o);if(!a)return{error:`tool \u9650\u5B9A\u540D\u4E0D\u5408\u6CD5: ${o}\uFF08\u5E94\u4E3A "\u63D2\u4EF6\u540D.\u5DE5\u5177\u540D"\uFF0C\u63D2\u4EF6\u540D\u4E3A kebab-case\uFF09`};const c=t.params&&typeof t.params=="object"&&!Array.isArray(t.params)?t.params:{},l=await e.invokeTool(a.plugin,a.tool,c,{toolCallId:i?.toolCallId});if(l.ok)return l.result??{ok:!0};const s={error:l.error??"\u63D2\u4EF6\u5DE5\u5177\u8C03\u7528\u5931\u8D25"};return l.inputSchema!==void 0&&(s.inputSchema=l.inputSchema),typeof l.durationMs=="number"&&(s.durationMs=l.durationMs),s}catch(a){return{error:`function_call \u5931\u8D25: ${a instanceof Error?a.message:String(a)}`}}}}}function b(e){return{kind:"builtin",toolName:"plugin_manage",exposedName:"plugin_manage",category:"plugin",description:h,inputSchema:{type:"object",properties:{action:{type:"string",enum:["install","uninstall","reload","enable","disable","list"],description:"\u751F\u547D\u5468\u671F\u52A8\u4F5C"},name:{type:"string",description:"\u63D2\u4EF6\u540D\uFF08uninstall/reload/enable/disable \u5FC5\u586B\uFF09"},source:{type:"string",description:'install \u6765\u6E90\uFF0C\u5F53\u524D\u652F\u6301 "local:<\u63D2\u4EF6\u76EE\u5F55\u4E0B\u7684\u8DEF\u5F84>"\uFF08\u63D2\u4EF6\u5FC5\u987B\u4F4D\u4E8E\u63D2\u4EF6\u6839\u76EE\u5F55\u5185\u52A0\u8F7D\uFF09'},config:{type:"object",description:"install \u65F6\u63D2\u4EF6 userConfig \u58F0\u660E\u7684\u914D\u7F6E\u503C\uFF08\u952E\u503C\u5BF9\uFF09",additionalProperties:{type:"string"}}},required:["action"],additionalProperties:!1},async execute(t){const i=t.action;if(typeof i!="string")return{error:"\u7F3A\u5C11 action"};const n={action:i};if(typeof t.name=="string"&&t.name.trim()&&(n.name=t.name.trim()),typeof t.source=="string"&&t.source.trim()&&(n.source=t.source.trim()),t.config&&typeof t.config=="object"&&!Array.isArray(t.config)){const o={};for(const[a,c]of Object.entries(t.config))typeof c=="string"&&(o[a]=c);n.config=o}try{return await e.manage(n)}catch(o){const a=o instanceof Error?o.message:String(o);return{ok:!1,error:`plugin_manage.${i} \u5931\u8D25: ${a}`}}}}}function N(){return["## \u63D2\u4EF6\u7CFB\u7EDF",'- \u4E09\u65B9\u5DE5\u5177\u4EE5\u63D2\u4EF6\u5F62\u5F0F\u63A5\u5165\u3002\u63D2\u4EF6\u5DE5\u5177\u4E0D\u5728\u4F60\u7684\u9759\u6001\u5DE5\u5177\u5217\u8868\u4E2D\uFF1A\u7D27\u51D1\u76EE\u5F55\u968F poll_message \u7ED3\u679C\u7684 pluginCatalog \u5B57\u6BB5\u8FD4\u56DE\uFF1B\u7528 function_call \u8C03\u7528\uFF08tool="\u63D2\u4EF6\u540D.\u5DE5\u5177\u540D"\uFF0Cparams \u4E3A\u52A8\u6001\u53C2\u6570\uFF09\u3002','- \u53C2\u6570\u4E0D\u7B26\u5408\u63D2\u4EF6 schema \u65F6\uFF0Cfunction_call \u4F1A\u8FD4\u56DE\u9519\u8BEF\u5E76\u9644\u5B8C\u6574 inputSchema\uFF0C\u8BF7\u4FEE\u6B63\u540E\u91CD\u8BD5\uFF1B\u76EE\u5F55\u63CF\u8FF0\u4E0D\u8DB3\u65F6\u7528 function_call {action:"schema"} \u53D6\u5B8C\u6574\u5B9A\u4E49\u3002',"- \u63D2\u4EF6\u4E8B\u4EF6\u4EE5 [plugin-event] \u5F00\u5934\u7684\u6D88\u606F\u51FA\u73B0\u5728 poll_message \u7ED3\u679C\u4E2D\uFF0C\u6D88\u606F\u5C3E\u90E8\u6709 toolHints\uFF08\u5EFA\u8BAE\u8C03\u7528\u7684\u5DE5\u5177\uFF09\u4E0E payload\uFF08\u4E8B\u4EF6\u6570\u636E\uFF09\uFF0C\u6309\u63D0\u793A\u7528 function_call \u5904\u7406\u3002","- \u63D2\u4EF6\u751F\u547D\u5468\u671F\uFF08\u5B89\u88C5/\u5378\u8F7D/\u91CD\u8F7D/\u542F\u505C/\u5217\u8868\uFF09\u7528 plugin_manage \u5DE5\u5177\uFF1B\u672A\u7ECF\u7528\u6237\u660E\u786E\u8981\u6C42\u4E0D\u8981\u5B89\u88C5\u6216\u5378\u8F7D\u63D2\u4EF6\u3002"].join(`
13
- `)}export{N as buildPluginPrompt,C as createPluginTools,_ as splitQualifiedToolName};
7
+ \u6CE8\u610F\uFF1A\u63D2\u4EF6\u672A\u5B89\u88C5/\u5DF2\u505C\u7528/\u5DE5\u5177\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE\u660E\u786E\u9519\u8BEF\uFF0C\u4E0D\u8981\u51ED\u7A7A\u7F16\u9020\u5DE5\u5177\u540D\u3002`;function _(o){const t=o.indexOf(".");if(t<=0||t>=o.length-1)return null;const c=o.slice(0,t),a=o.slice(t+1);return!h.test(c)||!a.trim()?null:{plugin:c,tool:a.trim()}}function S(o){const t=o.pluginBridge;return t?[y(t)]:[]}function y(o){return{kind:"builtin",toolName:"function_call",exposedName:"function_call",category:"plugin",description:d,inputSchema:{type:"object",properties:{action:{type:"string",enum:["call","schema","catalog"],default:"call",description:"call=\u8C03\u7528\u63D2\u4EF6\u5DE5\u5177\uFF1Bschema=\u53D6\u5B8C\u6574\u53C2\u6570\u5B9A\u4E49\uFF1Bcatalog=\u53D6\u63D2\u4EF6\u5DE5\u5177\u76EE\u5F55"},tool:{type:"string",description:'\u9650\u5B9A\u540D "\u63D2\u4EF6\u540D.\u5DE5\u5177\u540D"\uFF08\u5982 "wechat-cli.send_msg"\uFF09\uFF1Baction=schema \u65F6\u652F\u6301 "\u63D2\u4EF6\u540D.*" \u53D6\u6574\u7EC4\u5B9A\u4E49'},params:{type:"object",description:"call \u7684\u52A8\u6001\u53C2\u6570\u5BF9\u8C61\uFF0C\u6309\u63D2\u4EF6\u58F0\u660E\u7684 inputSchema \u6821\u9A8C"}},required:["tool"],additionalProperties:!1},async execute(t,c){const a=typeof t.action=="string"?t.action:"call",n=typeof t.tool=="string"?t.tool.trim():"";try{if(a==="catalog")return await o.getCatalog();if(!n)return{error:'\u7F3A\u5C11 tool \u53C2\u6570\uFF08\u9650\u5B9A\u540D "\u63D2\u4EF6\u540D.\u5DE5\u5177\u540D"\uFF09'};if(a==="schema"){if(n.endsWith(".*")){const i=n.slice(0,-2),m=await o.getCatalog(),g=m.plugins.find(s=>s.plugin===i);if(!g)return{error:`\u63D2\u4EF6 ${i} \u672A\u5B89\u88C5\u6216\u5DF2\u505C\u7528`,catalog:m.plugins};const f=await Promise.all(g.tools.map(s=>o.getToolSchema(`${i}.${s.name}`)));return{plugin:i,schemas:f.filter(Boolean)}}const p=await o.getToolSchema(n);return p||{error:`\u672A\u77E5\u63D2\u4EF6\u5DE5\u5177: ${n}\uFF08\u53EF\u5148 action=catalog \u67E5\u770B\u76EE\u5F55\uFF09`}}if(a!=="call")return{error:`\u672A\u77E5 action: ${a}\uFF08\u5141\u8BB8\uFF1Acall / schema / catalog\uFF09`};const e=_(n);if(!e)return{error:`tool \u9650\u5B9A\u540D\u4E0D\u5408\u6CD5: ${n}\uFF08\u5E94\u4E3A "\u63D2\u4EF6\u540D.\u5DE5\u5177\u540D"\uFF0C\u63D2\u4EF6\u540D\u4E3A kebab-case\uFF09`};const u=t.params&&typeof t.params=="object"&&!Array.isArray(t.params)?t.params:{},l=await o.invokeTool(e.plugin,e.tool,u,{toolCallId:c?.toolCallId});if(l.ok)return l.result??{ok:!0};const r={error:l.error??"\u63D2\u4EF6\u5DE5\u5177\u8C03\u7528\u5931\u8D25"};return l.inputSchema!==void 0&&(r.inputSchema=l.inputSchema),typeof l.durationMs=="number"&&(r.durationMs=l.durationMs),r}catch(e){return{error:`function_call \u5931\u8D25: ${e instanceof Error?e.message:String(e)}`}}}}}function C(){return["## \u63D2\u4EF6\u7CFB\u7EDF",'- \u4E09\u65B9\u5DE5\u5177\u4EE5\u63D2\u4EF6\u5F62\u5F0F\u63A5\u5165\u3002\u63D2\u4EF6\u5DE5\u5177\u4E0D\u5728\u4F60\u7684\u9759\u6001\u5DE5\u5177\u5217\u8868\u4E2D\uFF1A\u7D27\u51D1\u76EE\u5F55\u968F poll_message \u7ED3\u679C\u7684 pluginCatalog \u5B57\u6BB5\u8FD4\u56DE\uFF1B\u7528 function_call \u8C03\u7528\uFF08tool="\u63D2\u4EF6\u540D.\u5DE5\u5177\u540D"\uFF0Cparams \u4E3A\u52A8\u6001\u53C2\u6570\uFF09\u3002','- \u53C2\u6570\u4E0D\u7B26\u5408\u63D2\u4EF6 schema \u65F6\uFF0Cfunction_call \u4F1A\u8FD4\u56DE\u9519\u8BEF\u5E76\u9644\u5B8C\u6574 inputSchema\uFF0C\u8BF7\u4FEE\u6B63\u540E\u91CD\u8BD5\uFF1B\u76EE\u5F55\u63CF\u8FF0\u4E0D\u8DB3\u65F6\u7528 function_call {action:"schema"} \u53D6\u5B8C\u6574\u5B9A\u4E49\u3002',"- \u63D2\u4EF6\u4E8B\u4EF6\u4EE5 [plugin-event] \u5F00\u5934\u7684\u6D88\u606F\u51FA\u73B0\u5728 poll_message \u7ED3\u679C\u4E2D\uFF0C\u6D88\u606F\u5C3E\u90E8\u6709 toolHints\uFF08\u5EFA\u8BAE\u8C03\u7528\u7684\u5DE5\u5177\uFF09\u4E0E payload\uFF08\u4E8B\u4EF6\u6570\u636E\uFF09\uFF0C\u6309\u63D0\u793A\u7528 function_call \u5904\u7406\u3002",'- \u63D2\u4EF6\u751F\u547D\u5468\u671F\uFF08\u5B89\u88C5/\u5378\u8F7D/\u91CD\u8F7D/\u542F\u505C/\u5217\u8868\uFF09\u4E5F\u662F\u63D2\u4EF6\u5DE5\u5177\uFF1A\u7ECF function_call \u8C03\u7528\u5185\u7F6E\u63D2\u4EF6 plugin-manager \u7684 manage \u5DE5\u5177\uFF0C\u5373 function_call {tool:"plugin-manager.manage", params:{action:"...", ...}}\uFF08plugin-manager \u5728 pluginCatalog \u4E2D\u53EF\u67E5\uFF09\u3002\u672A\u7ECF\u7528\u6237\u660E\u786E\u8981\u6C42\u4E0D\u8981\u5B89\u88C5\u6216\u5378\u8F7D\u63D2\u4EF6\u3002\u5F00\u53D1\u63D2\u4EF6\u5148\u7528\u5185\u7F6E /create-plugin \u547D\u4EE4\u83B7\u53D6\u5F00\u53D1\u89C4\u8303\uFF0C\u5199\u5B8C\u63D2\u4EF6\u76EE\u5F55\u540E\u518D\u7528 function_call \u8C03 plugin-manager.manage install \u751F\u6548\u3002'].join(`
8
+ `)}export{C as buildPluginPrompt,S as createPluginTools,_ as splitQualifiedToolName};
14
9
 
@@ -40,9 +40,19 @@ export interface PluginSummary {
40
40
  source?: string;
41
41
  installedAt?: string;
42
42
  toolCount: number;
43
+
44
+ tools?: {
45
+ name: string;
46
+ title?: string;
47
+ description: string;
48
+ }[];
43
49
  listeners: PluginListenerSummary[];
44
50
 
51
+ running?: boolean;
52
+
45
53
  error?: string;
54
+
55
+ builtin?: boolean;
46
56
  }
47
57
 
48
58
  export type PluginManageAction = "install" | "uninstall" | "reload" | "enable" | "disable" | "list";
@@ -150,6 +150,8 @@ export declare class ACodeRuntime extends EventEmitter {
150
150
  private clearToolSettle;
151
151
 
152
152
  stop(): Promise<void>;
153
+
154
+ private discoverPluginCommandDirs;
153
155
  private resolveCommandDirs;
154
156
  private runModelTurn;
155
157
 
@@ -190,6 +192,8 @@ export declare class ACodeRuntime extends EventEmitter {
190
192
  private notifyRuntimeStop;
191
193
  private appendSyntheticMultimodalUserMessage;
192
194
 
195
+ private expandCommandsInPolledResult;
196
+
193
197
  private cleanToolMessageAttachments;
194
198
  private appendToolFailureResult;
195
199