@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.
Files changed (2) hide show
  1. package/dist/cli.js +2 -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: 5)
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||"5"),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)+`
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.13",
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"