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.
- package/dist/adapter/AcodeSdkAdapter.d.ts +4 -1
- package/dist/adapter/AcodeSdkAdapter.js +2 -2
- package/dist/adapter/ClaudeSdkAdapter.js +3 -3
- package/dist/adapter/CodexSdkAdapter.js +3 -3
- package/dist/adapter/OpencodeSdkAdapter.js +3 -3
- package/dist/browser/browser-pool.js +1 -1
- package/dist/browser/built-in-browser-tools.d.ts +1 -2
- package/dist/browser/built-in-browser-tools.js +1 -1
- package/dist/browser/ws-server.js +1 -1
- package/dist/config.d.ts +22 -6
- package/dist/config.js +2 -2
- package/dist/index.js +1 -1
- package/dist/middleware/auth.js +1 -1
- package/dist/remote-desktop/computer-control.d.ts +2 -2
- package/dist/remote-desktop/index.d.ts +1 -1
- package/dist/remote-desktop/index.js +2 -2
- package/dist/remote-desktop/screen-capture.js +1 -1
- package/dist/remote-desktop/session-manager.d.ts +2 -2
- package/dist/remote-desktop/session-manager.js +1 -1
- package/dist/remote-desktop/system-backend.js +3 -3
- package/dist/remote-desktop/types.d.ts +1 -1
- package/dist/remote-desktop/ui-automation.d.ts +2 -2
- package/dist/remote-desktop/ui-automation.js +5 -5
- package/dist/routes/ai-sources.js +1 -1
- package/dist/routes/background-tasks.js +5 -5
- package/dist/routes/browser-listeners.js +1 -1
- package/dist/routes/capabilities.js +1 -1
- package/dist/routes/dashboard.js +1 -1
- package/dist/routes/file-change-diff.js +3 -3
- package/dist/routes/file-diff-rollback.js +1 -1
- package/dist/routes/file-snapshot.js +1 -1
- package/dist/routes/git.js +20 -20
- package/dist/routes/instance.js +1 -1
- package/dist/routes/launch.js +1 -1
- package/dist/routes/mcp.js +1 -1
- package/dist/routes/plugins.js +1 -1
- package/dist/routes/properties.js +1 -1
- package/dist/routes/pty.d.ts +1 -1
- package/dist/routes/pty.js +1 -1
- package/dist/routes/runtime-binding.js +1 -1
- package/dist/routes/skills.js +1 -1
- package/dist/routes/sub-agents.js +1 -1
- package/dist/routes/task-context.js +1 -1
- package/dist/routes/terminal.js +27 -27
- package/dist/routes/yml.js +1 -1
- package/dist/services/access-control.js +1 -1
- package/dist/services/acode-bg-manager.js +1 -1
- package/dist/services/agent-capability-sync.js +1 -1
- package/dist/services/agent-process-manager.d.ts +1 -1
- package/dist/services/agent-process-manager.js +1 -1
- package/dist/services/ai-config-service.js +2 -2
- package/dist/services/ai-source-apply.d.ts +1 -1
- package/dist/services/auto-register.js +1 -1
- package/dist/services/aws-client-agent-mcp.d.ts +5 -0
- package/dist/services/aws-client-agent-mcp.js +2 -2
- package/dist/services/bridge-package-publish-hooks.js +1 -1
- package/dist/services/browser-session-manager.d.ts +3 -3
- package/dist/services/browser-session-manager.js +3 -3
- package/dist/services/capability-config.js +2 -2
- package/dist/services/cli-commands.js +2 -2
- package/dist/services/desktop-mcp-manager.js +1 -1
- package/dist/services/event-delta-pusher.d.ts +1 -1
- package/dist/services/fileSnapshotStore.js +1 -1
- package/dist/services/instance-ai-config-service.js +1 -1
- package/dist/services/instance-init-service.js +1 -1
- package/dist/services/instance-state.d.ts +1 -1
- package/dist/services/instance-state.js +1 -1
- package/dist/services/jdk-scanner.js +1 -1
- package/dist/services/launch-manager.js +1 -1
- package/dist/services/legacy-path-migration.d.ts +0 -2
- package/dist/services/legacy-path-migration.js +1 -1
- package/dist/services/lifecycle-state.js +2 -2
- package/dist/services/mcp-deploy.js +2 -2
- package/dist/services/orphan-monitor.js +1 -1
- package/dist/services/plugin-manager.d.ts +27 -5
- package/dist/services/plugin-manager.js +15 -9
- package/dist/services/process-detail.js +2 -2
- package/dist/services/process-detector.js +10 -10
- package/dist/services/process-registry.js +1 -1
- package/dist/services/process-top.js +2 -2
- package/dist/services/runtime-binding.js +4 -4
- package/dist/services/sdk-tool-file-change-recorder.js +1 -1
- package/dist/services/skill-manager.js +2 -2
- package/dist/services/startup-config-wizard.js +6 -6
- package/dist/services/system-metrics.js +1 -1
- package/dist/services/tunnel-client.js +1 -1
- package/dist/services/update-notifier.js +2 -2
- package/dist/services/windows-service-manager.js +1 -1
- package/dist/services/workspace-files.js +1 -1
- package/dist/services/workspaceTaskChangeWatcher.js +3 -3
- package/dist/utils/file-utils.js +2 -2
- package/dist/utils/instance-ai-config-debug-logger.js +1 -1
- package/dist/utils/mcp-utils.js +1 -1
- package/dist/utils/yaml-utils.js +1 -1
- package/package/acode/dist/cli.js +2 -2
- package/package/acode/dist/plugin-tools.js +3 -8
- package/package/acode/dist/plugin-types.d.ts +10 -0
- package/package/acode/dist/runtime.d.ts +4 -0
- package/package/acode/dist/runtime.js +18 -18
- package/package/acode/dist/types.d.ts +4 -0
- package/package/aws-client-agent-mcp/dist/http-client.js +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +10 -10
- package/package/aws-client-agent-mcp/dist/memory-tools.js +6 -6
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.js +3 -2
- package/package/aws-client-agent-mcp/dist/types.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`).length:0,
|
|
3
|
-
`).length:0;if(e==="CREATE")return`\u521B\u5EFA\u6587\u4EF6\uFF0C\u5171 ${
|
|
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
|
|
package/dist/utils/file-utils.js
CHANGED
|
@@ -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
|
|
2
|
-
`}function
|
|
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:
|
|
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
|
|
package/dist/utils/mcp-utils.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{randomUUID as o}from"node:crypto";import{parseBoolean as
|
|
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
|
|
package/dist/utils/yaml-utils.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
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
|
|
3
|
-
`)}),await r.start(),await r.stop()}
|
|
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
|
|
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
|
|
8
|
-
|
|
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
|
|