@sleep2agi/agent-node 2.1.0-preview.15 → 2.1.0-preview.16

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 +1 -1
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -32,7 +32,7 @@ Runtime:
32
32
 
33
33
  ${z}
34
34
 
35
- 执行完后简要汇报结果。`,X=process.env.COMMHUB_URL||f,Y=process.env.COMMHUB_TOKEN||x,J={};if(X)J.commhub={type:"url",url:`${X}/mcp`,headers:Y?{Authorization:`Bearer ${Y}`}:void 0};let B=Object.keys(J).length>0?void 0:(()=>{try{let{execSync:H}=N("child_process"),D=N("fs");try{let F=N.resolve("@anthropic-ai/claude-agent-sdk-linux-x64/claude");if(D.existsSync(F))return H(`${F} --version`,{stdio:"pipe"}),V(`[claude] using glibc binary: ${F}`),F}catch{}try{let F=H("which claude",{encoding:"utf-8"}).trim();if(F)return V(`[claude] using global binary: ${F}`),F}catch{}return}catch{return}})(),j={model:y||void 0,tools:O.length?O:void 0,maxTurns:_z,permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0,settingSources:[],mcpServers:Object.keys(J).length?J:void 0,pathToClaudeCodeExecutable:B,env:process.env,cwd:process.cwd(),stderr:(H)=>{if(H.trim())V(`[stderr] ${H.trim().slice(0,300)}`)},hooks:{PreToolUse:[{hooks:[async(H)=>{return V(`[tool] ${H.tool_name}(${JSON.stringify(H.tool_input).slice(0,80)})`),{continue:!0}}]}]}};if(Zz>0)j.maxBudgetUsd=Zz;if(c)j.systemPrompt=c;if(d)j.resume=d;let G="",w=Date.now();V(`[claude] claudePath=${B||"SDK default"}, mcpServers=${Object.keys(J).join(",")||"none"}`);for await(let H of $({prompt:Q,options:j})){let D=H;if(D.type==="system"&&D.subtype==="init")d=D.session_id,V(`[claude] session=${D.session_id?.slice(0,8)} model=${y||"default"}`),Kz(D.session_id);if(D.type==="result"){let F=Date.now()-w,K=D.usage||{};V(`[claude] ${D.subtype} | ${F}ms | $${D.total_cost_usd?.toFixed(4)||"?"} | in=${K.input_tokens||0} out=${K.output_tokens||0} | turns=${D.num_turns}`),G=D.subtype==="success"?D.result||"任务完成":`执行出错: ${D.error||D.result||"未知错误"}`}}return G}var P=null,cz=c||[`你是 ${U},一个 AI Agent 节点,工作目录:${process.cwd()}。`,"你通过通信网络接收任务。收到任务后执行并返回结果。","规则:","1. 只回复有实质内容的结果。",'2. 绝对不要回复"收到""好的""ok""在线""待命""等待任务"等确认消息。',"3. 没有新任务时保持完全沉默,不要主动发任何消息。","4. 不要调用任何通信工具(send_task/send_message 等)。","5. 你的回复会被系统自动发送给任务发送者。"].join(`
35
+ 执行完后简要汇报结果。`,X=process.env.COMMHUB_URL||f,Y=process.env.COMMHUB_TOKEN||x,J={};if(X)J.commhub={type:"http",url:`${X}/mcp`,headers:Y?{Authorization:`Bearer ${Y}`}:void 0};let B=Object.keys(J).length>0?void 0:(()=>{try{let{execSync:H}=N("child_process"),D=N("fs");try{let F=N.resolve("@anthropic-ai/claude-agent-sdk-linux-x64/claude");if(D.existsSync(F))return H(`${F} --version`,{stdio:"pipe"}),V(`[claude] using glibc binary: ${F}`),F}catch{}try{let F=H("which claude",{encoding:"utf-8"}).trim();if(F)return V(`[claude] using global binary: ${F}`),F}catch{}return}catch{return}})(),j={model:y||void 0,tools:O.length?O:void 0,maxTurns:_z,permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0,settingSources:[],mcpServers:Object.keys(J).length?J:void 0,pathToClaudeCodeExecutable:B,env:process.env,cwd:process.cwd(),stderr:(H)=>{if(H.trim())V(`[stderr] ${H.trim().slice(0,300)}`)},hooks:{PreToolUse:[{hooks:[async(H)=>{return V(`[tool] ${H.tool_name}(${JSON.stringify(H.tool_input).slice(0,80)})`),{continue:!0}}]}]}};if(Zz>0)j.maxBudgetUsd=Zz;if(c)j.systemPrompt=c;if(d)j.resume=d;let G="",w=Date.now();V(`[claude] claudePath=${B||"SDK default"}, mcpServers=${Object.keys(J).join(",")||"none"}`);for await(let H of $({prompt:Q,options:j})){let D=H;if(D.type==="system"&&D.subtype==="init")d=D.session_id,V(`[claude] session=${D.session_id?.slice(0,8)} model=${y||"default"}`),Kz(D.session_id);if(D.type==="result"){let F=Date.now()-w,K=D.usage||{};V(`[claude] ${D.subtype} | ${F}ms | $${D.total_cost_usd?.toFixed(4)||"?"} | in=${K.input_tokens||0} out=${K.output_tokens||0} | turns=${D.num_turns}`),G=D.subtype==="success"?D.result||"任务完成":`执行出错: ${D.error||D.result||"未知错误"}`}}return G}var P=null,cz=c||[`你是 ${U},一个 AI Agent 节点,工作目录:${process.cwd()}。`,"你通过通信网络接收任务。收到任务后执行并返回结果。","规则:","1. 只回复有实质内容的结果。",'2. 绝对不要回复"收到""好的""ok""在线""待命""等待任务"等确认消息。',"3. 没有新任务时保持完全沉默,不要主动发任何消息。","4. 不要调用任何通信工具(send_task/send_message 等)。","5. 你的回复会被系统自动发送给任务发送者。"].join(`
36
36
  `),Qz={model_auto_compact_token_limit:200000,developer_instructions:cz};async function mz(z,Z,$){try{let{execSync:B}=await import("child_process"),j=B("which codex 2>/dev/null",{encoding:"utf-8"}).trim();if(j){let G=j.replace(/\/codex$/,"");if(!process.env.PATH?.includes(G))process.env.PATH=`${G}:${process.env.PATH}`}}catch{}let Q;try{({Codex:Q}=await import("@openai/codex-sdk"))}catch{throw Error("@openai/codex-sdk not installed. Run: npm install -g @openai/codex-sdk @openai/codex")}if(!P){let B=new Q({config:Qz}),G={skipGitRepoCheck:!0,approvalPolicy:"never",model:y||"gpt-5.4",sandboxMode:"danger-full-access",modelReasoningEffort:"low"};if(_)P=B.resumeThread(_,G),V(`codex resumed thread: ${_}`);else P=B.startThread(G)}V(`[codex] model=${y||"gpt-5.4"} thread=${P?.id||"new"}`);let Y=z,J=$?.length?[{type:"text",text:Y},...$.map((B)=>({type:"local_image",path:B}))]:Y,q=Date.now();try{let{events:B}=await P.runStreamed(J),j="",G=null,w=0;for await(let F of B)if(F.type==="item.started"){let K=F.item;b(`[codex] ${K.type}${K.command?`: ${K.command.slice(0,60)}`:K.tool?`: ${K.server}/${K.tool}`:""}`)}else if(F.type==="item.completed"){w++;let K=F.item;if(K.type==="agent_message")j=K.text||"";if(K.type==="command_execution")b(`[codex] cmd exit=${K.exit_code} | ${K.aggregated_output?.slice(0,80)}`);if(K.type==="reasoning")b(`[codex] thinking: ${K.text?.slice(0,80)}`);if(K.type==="mcp_tool_call")b(`[codex] mcp: ${K.server}/${K.tool} → ${K.status}`)}else if(F.type==="turn.completed")G=F.usage;let H=Date.now()-q,D=G?.input_tokens||0;if(V(`[codex] done | ${H}ms | in=${D} out=${G?.output_tokens||0} | items=${w}`),P?.id)Kz(P.id);return j||"(无回复)"}catch(B){V(`codex thread error: ${B.message}, 重建`),P=new Q({config:Qz}).startThread({skipGitRepoCheck:!0,approvalPolicy:"never",model:y||"gpt-5.4",sandboxMode:"danger-full-access",modelReasoningEffort:"low"});let G=await P.run(J),w=Date.now()-q;return V(`[codex] retry done | ${w}ms`),G.finalResponse||"(无回复)"}}async function nz(z,Z){let $=process.env.ANTHROPIC_API_KEY||process.env.OPENAI_API_KEY||process.env.MINIMAX_CODING_API_KEY||W.apiKey||"",Q=process.env.ANTHROPIC_BASE_URL||W.anthropicBaseUrl||"",X=process.env.OPENAI_BASE_URL||W.apiBaseUrl||"https://api.openai.com/v1",Y=y||"gpt-4o-mini",J=!!Q,B=(Q||X).replace(/\/v1\/?$/,"");if(!$)return"错误: 需要设置 ANTHROPIC_API_KEY, OPENAI_API_KEY, 或 MINIMAX_CODING_API_KEY";let j=c||`你是 ${U},一个 AI 助手。收到来自 ${Z} 的任务后简要执行并汇报。`,G=Date.now();V(`[http-api] model=${Y} format=${J?"anthropic":"openai"} base=${B.replace(/\/v1$/,"")}`);let w="",H=null;if(J){let F=await fetch(`${B}/v1/messages`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":$,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:Y,system:j,messages:[{role:"user",content:z}],max_tokens:2000})});if(!F.ok){let E=await F.text();return`Anthropic API 错误 ${F.status}: ${E.slice(0,200)}`}let K=await F.json();w=(Array.isArray(K.content)?K.content:[]).filter((E)=>E.type==="text").map((E)=>E.text).join(`
37
37
  `)||"",H=K.usage}else{let F=await fetch(`${B}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${$}`},body:JSON.stringify({model:Y,messages:[{role:"system",content:j},{role:"user",content:z}],max_tokens:2000})});if(!F.ok){let s=await F.text();return`OpenAI API 错误 ${F.status}: ${s.slice(0,200)}`}let K=await F.json();w=K.choices?.[0]?.message?.content||"",H=K.usage}let D=Date.now()-G;return V(`[http-api] done | ${D}ms | in=${H?.input_tokens||H?.prompt_tokens||0} out=${H?.output_tokens||H?.completion_tokens||0}`),w||"(无回复)"}var Yz=Promise.resolve();function Hz(z,Z,$){let Q=async()=>{if(A==="codex")return mz(z,Z,$);if(A==="http")return nz(z,Z);return dz(z,Z)},X=Yz.then(Q,Q);return Yz=X.then(()=>{},()=>{}),X}async function rz(z,Z){V(`→ processing [${A}]: ${z.slice(0,80)}`),await r("working",z.slice(0,200)).catch(()=>{});let $,Q=!1;try{$=await Hz(z,Z)}catch(X){$=`${A} 错误: ${X.message}`,Q=!0,u(`✗ ${X.message}`)}finally{await r("idle").catch(()=>{})}if(!Q&&/(API 错误|API error|需要设置.*KEY|missing.*key|issue with the selected model|may not have access|may not exist|model.+not.+(found|available))/i.test($))Q=!0;return{text:$,failed:Q}}var i={},lz=5000,gz=new Set(["收到","好的","ok","嗯","是的","了解","明白","确认","done","ack","roger","yes","no","在线","待命","正常","保持在线","通信正常","已收到","收到了","好","行","noted","copy","received","understood","等待任务","等待中","等待指令","无新任务","idle","waiting"]);function vz(z,Z=!1){if(!z)return!0;let Q=z.trim().replace(/^[\[【].+?[\]】]\s*/,"").trim().toLowerCase().replace(/[\s。!?.!?✅❌👀⏳,,]+$/g,"").trim();if(gz.has(Q))return!0;if(/^[\p{Emoji}\s]+$/u.test(z.trim())&&!/[0-9a-zA-Z#*]/.test(z))return!0;return!1}function iz(z,Z,$){if(z===U)return"self";if(Z.startsWith(`[${U}]`))return"own-prefix";if(z!=="hub"&&z!=="api"){let Q=Date.now();if(i[z]&&Q-i[z]<lz)return"cooldown"}if($!=="task"&&$!=="broadcast"&&vz(Z))return"low-value-inbound";return null}async function oz(){let z=await hz();if(!z.length)return;for(let Z of z){let $=Z.from_session||"hub",Q=Z.content,X=Z.type||"task";if(V(`← [${$}] (${X}/${Z.priority||"normal"}) ${Q.slice(0,100)}`),await fz(Z.id),X!=="task"&&X!=="broadcast"){b(`skip non-task message: type=${X}`);continue}let Y=iz($,Q,X);if(Y){b(`skip message from ${$}: ${Y}`);continue}let{text:J,failed:q}=await rz(Q,$);if(V(`processTask returned: "${J.slice(0,80)}" (${J.length} chars, failed=${q})`),!q&&vz(J,!0)){V(`skip reply: low-value (${J.slice(0,30)})`);continue}try{V(`sending reply to ${$} (task ${Z.id.slice(0,8)}, status=${q?"failed":"replied"})...`),await pz($,`[${U}] ${J.slice(0,2000)}`,Z.id,q),i[$]=Date.now(),V(`→ [${$}] ${J.slice(0,100)}`)}catch(B){L(`reply failed: ${B.message}`)}}}function Uz(z){return String(z.from?.id||z.chat?.id||"")}function Dz(z){return z.from?.username||z.from?.first_name||Uz(z)||"telegram"}function az(z,Z){if(z.allowFrom.length===0)return!0;let $=Uz(Z),Q=Z.from?.username?String(Z.from.username):"";return z.allowFrom.includes($)||!!Q&&z.allowFrom.includes(Q)}async function l(z,Z,$){let Q=await fetch(`${z.apiBase}/${Z}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify($)}),X=await Q.json();if(!X.ok)throw Error(`telegram ${Z} failed: ${X.description||Q.statusText}`);return X.result}async function Xz(z,Z,$,Q){let X=$.match(/[\s\S]{1,4096}/g)||["(无回复)"];for(let Y=0;Y<X.length;Y++)await l(z,"sendMessage",{chat_id:Z,text:X[Y],...Q&&Y===0?{reply_to_message_id:Q}:{}})}async function Vz(z,Z,$){let Q=await l(z,"getFile",{file_id:Z}),X=String(Q.file_path||""),Y=await fetch(`${z.fileBase}/${X}`);if(!Y.ok)throw Error(`telegram file download failed: ${Y.status} ${Y.statusText}`);let J=X.split(".").pop(),q=($||X.split("/").pop()||Z).replace(/[^a-zA-Z0-9._-]/g,"_"),B=q.includes(".")||!J?q:`${q}.${J}`,j=M(z.channel.inboxDir,`${Date.now()}_${B}`);return a(j,Buffer.from(await Y.arrayBuffer())),j}async function tz(z,Z){let $=Z.text||Z.caption||"",Q=[];if(Array.isArray(Z.photo)&&Z.photo.length>0){let Y=Z.photo[Z.photo.length-1],J=await Vz(z,Y.file_id,`photo_${Z.message_id}.jpg`);Q.push(J)}let X=String(Z.document?.mime_type||"");if(Z.document&&X.startsWith("image/")){let Y=await Vz(z,Z.document.file_id,Z.document.file_name||`image_${Z.message_id}`);Q.push(Y)}if(Q.length)$+=`
38
38
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-node",
3
- "version": "2.1.0-preview.15",
3
+ "version": "2.1.0-preview.16",
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"