@sleep2agi/agent-node 2.1.0-preview.13 → 2.1.0-preview.14
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/cli.js +2 -2
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -12,7 +12,7 @@ import{createRequire as kz}from"node:module";var N=kz(import.meta.url);import{re
|
|
|
12
12
|
--model <name> AI 模型 (codex: gpt-5.4, http-api: gpt-4o-mini, minimax: MiniMax-M1)
|
|
13
13
|
--hub <url> CommHub URL
|
|
14
14
|
--tools <list> 工具列表,逗号分隔 ("all" = 全部)
|
|
15
|
-
--max-turns <n> 每任务最大轮次 (default:
|
|
15
|
+
--max-turns <n> 每任务最大轮次 (default: 50)
|
|
16
16
|
--max-budget <usd> 每任务预算上限
|
|
17
17
|
--session <id> 恢复 session / thread ID
|
|
18
18
|
--channel <spec> Channel (telegram 或 telegram:/path)
|
|
@@ -25,7 +25,7 @@ Runtime:
|
|
|
25
25
|
claude-agent-sdk Claude Agent SDK — Claude/MiniMax/Anthropic 兼容 API
|
|
26
26
|
codex-sdk Codex SDK — GPT-5.4,复用 codex 登录态
|
|
27
27
|
`),process.exit(0);if(k[z]==="--new-session"){H["new-session"]="true";continue}if(k[z]==="--channel"&&z+1<k.length){Jz.push(k[++z]);continue}if(k[z].startsWith("--")&&z+1<k.length)H[k[z].slice(2)]=k[++z]}function Bz(z){return z.replace(/^~(?=\/|$)/,qz)}function Pz(z){let Z=z.indexOf(":");if(Z<0)return{type:z,raw:z};if(Z===0||Z===z.length-1)throw Error(`invalid channel spec "${z}" (expected type or type:path)`);return{type:z.slice(0,Z),path:Bz(z.slice(Z+1)),raw:z}}function h(z){if(!o(z))return null;try{return JSON.parse(S(z,"utf-8"))}catch{return null}}var B={},R="";if(H.config){let z=H.config.startsWith("/")?H.config:D(process.cwd(),H.config),Z=h(z);if(Z)B=Z,R=z,console.log(`[agent-node] Config: ${z}`)}var v=H.alias||process.env.COMMHUB_ALIAS||process.env.ALIAS||B.alias;if(!H.config&&v){let z=D(process.cwd(),".anet","nodes",v,"config.json"),Z=D(process.cwd(),".anet","profiles",`${v}.json`),$=o(z)?z:Z,Q=h($);if(Q){if(B={...Q,...B},R=$,console.log(`[agent-node] Config: ${$}`),Q.env&&typeof Q.env==="object"){for(let[X,Y]of Object.entries(Q.env))if(!process.env[X]&&typeof Y==="string")process.env[X]=Bz(Y)}}}var C=h(D(qz,".anet","config.json"))||{};if(C.hub&&!B.hub)B.hub=C.hub;if(C.token&&!B.token)B.token=C.token;if(!H.config&&!Object.keys(B).length){let z=h(D(process.cwd(),".agent-node.json"));if(z)B=z,console.log("[agent-node] 配置: .agent-node.json")}if(!v)console.error(`错误: 必须指定 --alias
|
|
28
|
-
用法: npx @sleep2agi/agent-node --alias "我的Agent"`),process.exit(1);var Gz=H.runtime||process.env.RUNTIME||B.runtime||"claude-agent-sdk",Rz={"claude-agent-sdk":"claude","claude-sdk":"claude","agent-sdk":"claude",claude:"claude","codex-sdk":"codex",codex:"codex","http-api":"http","openai-api":"http",minimax:"http"},A=Rz[Gz]||"claude",xz=Gz,f=H.url||H.hub||process.env.COMMHUB_URL||B.hub||"http://127.0.0.1:9200",P=H.model||process.env.MODEL||B.model,Nz=["Read","Write","Edit","Bash","Glob","Grep","WebSearch","WebFetch"],zz=H.tools||(Array.isArray(B.tools)?B.tools.join(","):B.tools)||"",O=zz==="all"?Nz:zz.split(",").filter(Boolean),_z=parseInt(H["max-turns"]||B.flags?.maxTurns||B.maxTurns||"
|
|
28
|
+
用法: npx @sleep2agi/agent-node --alias "我的Agent"`),process.exit(1);var Gz=H.runtime||process.env.RUNTIME||B.runtime||"claude-agent-sdk",Rz={"claude-agent-sdk":"claude","claude-sdk":"claude","agent-sdk":"claude",claude:"claude","codex-sdk":"codex",codex:"codex","http-api":"http","openai-api":"http",minimax:"http"},A=Rz[Gz]||"claude",xz=Gz,f=H.url||H.hub||process.env.COMMHUB_URL||B.hub||"http://127.0.0.1:9200",P=H.model||process.env.MODEL||B.model,Nz=["Read","Write","Edit","Bash","Glob","Grep","WebSearch","WebFetch"],zz=H.tools||(Array.isArray(B.tools)?B.tools.join(","):B.tools)||"",O=zz==="all"?Nz:zz.split(",").filter(Boolean),_z=parseInt(H["max-turns"]||B.flags?.maxTurns||B.maxTurns||"50"),Zz=parseFloat(H["max-budget"]||B.flags?.maxBudgetUsd||B.maxBudgetUsd||"0"),Az=H["new-session"]==="true",_=Az?"":H.session||B.session||B.resume||B.sessionId||"",c=H.prompt||B.systemPrompt||"",x=B.token||C.token||process.env.COMMHUB_TOKEN||"";if(process.env.COMMHUB_TOKEN&&B.token&&process.env.COMMHUB_TOKEN!==B.token)console.warn(`[${v}] ⚠ COMMHUB_TOKEN env override ignored (using node config token). Unset COMMHUB_TOKEN to silence this warning.`);var t=H["log-dir"]||D(process.cwd(),".anet","nodes",v,"logs"),Lz={debug:0,info:1,warn:2,error:3},Cz=Lz[H["log-level"]||process.env.LOG_LEVEL||B.logLevel||"info"]??1,I=[...(Array.isArray(B.channels)?B.channels:[]).filter((z)=>!z.startsWith("server:")&&!z.startsWith("plugin:")),...Jz],jz=I.map((z)=>{try{return Pz(z)}catch(Z){console.error(`[agent-node] ${Z.message}`),process.exit(1)}});function Kz(z){if(!R||!z)return;try{let Z=JSON.parse(S(R,"utf-8"));if(Z.session===z)return;Z.session=z,a(R,JSON.stringify(Z,null,2)+`
|
|
29
29
|
`),b(`session 写回: ${R} → ${z.slice(0,8)}...`)}catch(Z){L(`writebackSession failed: ${Z.message}`)}}function Oz(z){if(!o(z))return;for(let Z of S(z,"utf-8").split(`
|
|
30
30
|
`)){let $=Z.trim();if(!$||$.startsWith("#"))continue;let Q=$.indexOf("=");if(Q<=0)continue;let X=$.slice(0,Q).trim(),Y=$.slice(Q+1).trim().replace(/^['"]|['"]$/g,"");if(!process.env[X])process.env[X]=Y}}function Ez(z){return D(process.cwd(),".anet","nodes",v,"channels",z)}function Tz(z){let Z=z.path||Ez("telegram");Oz(D(Z,".env"));let $=process.env.TELEGRAM_BOT_TOKEN||"";if(!$)console.error(`[agent-node] telegram channel needs TELEGRAM_BOT_TOKEN in ${D(Z,".env")}`),process.exit(1);try{bz(D(Z,".env"),384)}catch{}let Q=h(D(Z,"access.json"))||{},X=D(Z,"inbox");try{Fz(X,{recursive:!0})}catch{}return{type:"telegram",dir:Z,inboxDir:X,token:$,allowFrom:Array.isArray(Q.allowFrom)?Q.allowFrom.map(String):[]}}var m=jz.filter((z)=>z.type==="telegram").map(Tz),$z=jz.find((z)=>z.type!=="telegram");if($z)console.error(`[agent-node] unsupported channel: ${$z.raw}`),process.exit(1);if(m.length>0&&A!=="codex"&&!O.includes("Read"))O.push("Read");try{Fz(t,{recursive:!0})}catch{}function g(z,Z,$){if(Z<Cz)return;let Q=new Date().toTimeString().slice(0,8),X=z.toUpperCase().padEnd(5),Y=`[${Q}] [${X}] [${v}] ${$}`;console.log(Y);try{let J=new Date().toISOString().slice(0,10);Iz(D(t,`${J}.log`),Y+`
|
|
31
31
|
`)}catch{}}var q=(z)=>g("info",1,z),b=(z)=>g("debug",0,z),L=(z)=>g("warn",2,z),u=(z)=>g("error",3,z);async function p(z,Z,$=3){let Q={"Content-Type":"application/json",Accept:"application/json, text/event-stream"};if(x)Q.Authorization=`Bearer ${x}`;let X;for(let Y=0;Y<=$;Y++)try{let J=await fetch(`${f}/mcp`,{method:"POST",headers:Q,body:JSON.stringify({jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:z,arguments:Z}})});if(!J.ok&&Y<$){X=Error(`HTTP ${J.status}`),await new Promise((j)=>setTimeout(j,1000*Math.pow(2,Y)));continue}let V=await J.text(),W=V.match(/data: (.+)/),K=W?JSON.parse(W[1]):JSON.parse(V),G=K?.result?.content?.[0]?.text;return G?JSON.parse(G):K}catch(J){if(X=J,Y<$)b(`callCommHub(${z}) attempt ${Y+1} failed: ${J.message}, retrying...`),await new Promise((V)=>setTimeout(V,1000*Math.pow(2,Y)))}throw X||Error(`callCommHub(${z}) failed after ${$} retries`)}var n=B.node_id||"",uz=B.node_name||"",T=B.network_id||process.env.ANET_NETWORK_ID||C.network_id||"",wz=n?`sdk-${n}`:`sdk-${v}-${Date.now().toString(36)}`,Sz=()=>p("report_status",{resume_id:wz,alias:v,status:"idle",server:e(),hostname:e(),agent:`agent-node:${A}`,project_dir:process.cwd(),node_id:n||void 0,node_name:uz||void 0,session_id:_||void 0,config_path:R||void 0,channels:I.length?JSON.stringify(I):void 0,model:P||void 0,network_id:T||void 0}),r=(z,Z)=>p("report_status",{resume_id:wz,alias:v,status:z,task:Z,node_id:n||void 0,session_id:d||_||void 0,config_path:R||void 0,channels:I.length?JSON.stringify(I):void 0,network_id:T||void 0}),hz=async()=>(await p("get_inbox",{alias:v,limit:20}))?.messages||[],fz=(z)=>p("ack_inbox",{alias:v,message_id:z}),pz=(z,Z,$,Q=!1)=>p("send_reply",{alias:z,text:Z,from_session:v,in_reply_to:$||void 0,status:Q?"failed":"replied"}),d=_||void 0;async function dz(z,Z){let{query:$}=await import("@anthropic-ai/claude-agent-sdk"),Q=`你是 ${v},收到来自 ${Z} 的任务:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sleep2agi/agent-node",
|
|
3
|
-
"version": "2.1.0-preview.
|
|
3
|
+
"version": "2.1.0-preview.14",
|
|
4
4
|
"description": "AI Agent runtime for CommHub networks. Supports Claude Agent SDK, Codex SDK, and OpenAI/Anthropic-compatible HTTP API.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"agent-node": "./dist/cli.js"
|