@sleep2agi/agent-node 2.4.11-preview.2 → 2.4.11

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
@@ -76,7 +76,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
76
76
  `),L1(v,this.filePath)}}function oU(r){let i=new Date;return{goal_id:uU(),text:r.text,status:"active",interval_ms:r.interval_ms,next_wake_at:new Date(i.getTime()+r.interval_ms).toISOString(),parent_task_id:r.parent_task_id,report_to:r.report_to,runtime:r.runtime,created_at:i.toISOString(),updated_at:i.toISOString(),progress_log:[]}}var A1=new Set(["你","我","他","她","它","对方","大家","我们","你们","他们"]);function E1(r){return r.trim().replace(/^[@@]+/,"").replace(/^[「『“"'【\[]+|[」』”"'】\]]+$/g,"").replace(/[::,,。.!?!?]+$/g,"").trim()}function bU(r){let i=r.trim();if(!i)return null;if(!/\b(?:mcp_commhub__send_task|commhub_send_task|send_task)\b|发任务|派任务|派给|转给|交给|发给|沟通一下|让|请|麻烦|和|你去给|给\s+\S+\s+(?:发|说|沟通|打)/.test(i))return null;let v=[/\b(?:mcp_commhub__send_task|commhub_send_task|send_task)\s*\(\s*alias\s*=\s*["']([^"']+)["']\s*,\s*task\s*=\s*["']([\s\S]+?)["']\s*\)/i,/\b(?:mcp_commhub__send_task|commhub_send_task|send_task)\s*\(\s*["']([^"']+)["']\s*,\s*["']([\s\S]+?)["']\s*\)/i,/^send_task\s+(\S+)\s+([\s\S]+)$/i,/给\s+(.+?)\s*(?:发任务|派任务|send_task)(?:\s*[::]\s*([\s\S]+))?$/i,/给\s+[「『"'’“@@]?(\S+?)[」』"'’“]?\s+(?:发(?:个?消息|个)?|说(?:一下)?|沟通(?:一下)?|打(?:个?招呼)?)\s+([\s\S]+)$/i,/(?:派给|转给|交给|发给)\s+(.+?)\s*[::,,]\s*([\s\S]+)$/i,/你去给\s+[「『"'’“@@]?(\S+?)[」』"'’“]?\s+([\s\S]+)$/i,/(?:你\s*)?和\s*(@?[^\s,,::。.!?!?]+)\s*(?:沟通一下|send_task(?:\s*一下)?)(?:\s*(?:[,,::]\s*)?([\s\S]+))?$/i,/(?:你\s*)?和\s*(@?[\s\S]+?)\s*沟通一下\s*[,,]\s*([\s\S]+)$/i,/(?:让|请|麻烦)\s+(@?[^\s,,::。.!?!?]+)\s+([\s\S]+)$/i],u="",n="";for(let $ of v){let t=i.match($);if(!t?.[1])continue;u=E1(t[1]),n=t[2]?.trim()||"";break}if(!u||A1.has(u))return null;if(!n){let $=i.match(/(?:发任务|派任务|send_task)\s*[::]\s*([\s\S]+)$/i);if($?.[1])n=$[1].trim();else n=i.match(/(?:让|请)\s*(?:他|她|它|对方|该节点)?\s*([\s\S]+?)(?:。|$)/)?.[1]?.trim()||i}if(n=n.replace(/必须.*?(?:总结回|回复)\s*(?:admin|我).*$/i,"").replace(/并?用\s*commhub_get_task[\s\S]*$/i,"").replace(/^[::,,\s]+/,"").trim(),!n)n=i;return{alias:u,childTask:n}}import{existsSync as M1,readFileSync as Z1,writeFileSync as x1}from"fs";class Xr extends Error{code;payload;appLevel;constructor(r,i={}){super(r);this.name="CommHubError",this.code=i.code,this.payload=i.payload,this.appLevel=i.appLevel??!1}}function gU(r){if(r?.error){let u=`${r.error.code??"?"}: ${r.error.message??"no message"}`;return{kind:"retryable",error:new Xr(`JSON-RPC error: ${u}`,{code:r.error.code,payload:r.error})}}if(r?.result?.isError===!0){let u=r?.result?.content?.[0]?.text||"tool returned isError";return{kind:"retryable",error:new Xr(`tool isError: ${u.slice(0,200)}`,{payload:r.result})}}let i=r?.result?.content?.[0]?.text,v;if(typeof i==="string")try{v=JSON.parse(i)}catch{return{kind:"ok",payload:i}}else v=r;if(v&&typeof v==="object"&&v.ok===!1){let u=v.error||v.message||"no detail";return{kind:"appLevel",error:new Xr(`app-level rejection: ${u}`,{code:v.error,payload:v,appLevel:!0})}}return{kind:"ok",payload:v}}function UU(r){let i=1083885398,v=-537806866;for(let u=0;u<r.length;u++){let n=r.charCodeAt(u);i=Math.imul(i^n,2654435761),v=Math.imul(v^n,1597334677)}return i=Math.imul(i^i>>>16,2246822507)^Math.imul(v^v>>>13,3266489909),v=Math.imul(v^v>>>16,2246822507)^Math.imul(i^i>>>13,3266489909),(4294967296*(2097151&v)+(i>>>0)).toString(16).padStart(16,"0").repeat(2).slice(0,32)}class Kb{filePath;constructor(r){this.filePath=r}load(){try{if(!M1(this.filePath))return[];let r=Z1(this.filePath,"utf8"),i=JSON.parse(r);return Array.isArray(i)?i:[]}catch{return[]}}save(r){x1(this.filePath,JSON.stringify(r,null,2))}persist(r){let i=this.load(),v=this.findIndex(i,r.to,r.taskId,r.text);if(v>=0)i[v]={...i[v],...r,attempts:i[v].attempts};else i.push({...r,attempts:0});this.save(i)}clear(r,i){if(!i)return;let v=this.load(),u=`${r}|task:${i}`,n=v.filter(($)=>cU($)!==u);if(n.length!==v.length)this.save(n)}async drain(r){let i=this.load(),v=0,u=0,n=[];for(let $ of i)try{await r($),v++}catch(t){if(t instanceof Xr&&t.appLevel){u++;continue}n.push({...$,attempts:$.attempts+1,lastTryAt:Date.now(),lastError:t?.message??String(t)})}if(i.length>0)this.save(n);return{delivered:v,dropped:u,requeued:n.length}}findIndex(r,i,v,u){let n=v?`${i}|task:${v}`:`${i}|sha:${UU(u??"")}`;return r.findIndex(($)=>cU($)===n)}}function cU(r){return r.taskId?`${r.to}|task:${r.taskId}`:`${r.to}|sha:${UU(r.text)}`}function k$(r){let i=IU(r.envValue);if(i!==null)return{valueMs:i,source:"env",rawValue:String(r.envValue)};let v=IU(r.flagValue);if(v!==null)return{valueMs:v,source:"flags",rawValue:String(r.flagValue)};return{valueMs:r.defaultMs,source:"default"}}function IU(r){if(r===void 0||r===null)return null;if(typeof r==="number")return Number.isFinite(r)&&r>0?r:null;if(typeof r==="string"){if(r.trim()==="")return null;let i=Number(r);return Number.isFinite(i)&&i>0?i:null}return null}import{dirname as T1}from"path";var Hn="@openai/codex-sdk",DU="@openai/codex",w$="^0.133.0";async function kU(r,i){try{return{module:await r.importCodexSdk(),source:"already-installed"}}catch(v){r.log?.(`[codex] ${Hn} not resolved — auto-installing to ${i} ...`);try{await r.npmInstall(i,[`${Hn}@${w$}`,`${DU}@${w$}`])}catch(u){throw _U({agentNodeDir:i,initialReason:z$(v),installReason:z$(u)})}try{let u=await r.importCodexSdk();return r.log?.(`[codex] ${Hn} installed and loaded`),{module:u,source:"auto-installed"}}catch(u){throw _U({agentNodeDir:i,initialReason:z$(v),installReason:`install succeeded but ${Hn} still does not resolve: ${z$(u)}`})}}}function zU(r){return T1(r)}function _U(r){let i=[`${Hn} not available and the auto-install attempt failed.`,"","Recovery — install both packages into agent-node's own node_modules:","",` npm install --prefix ${wU(r.agentNodeDir)} \\`,` ${Hn}@${w$} \\`,` ${DU}@${w$}`,"","Then restart this node.","","Underlying reasons:",` - initial import: ${r.initialReason}`,` - auto-install: ${r.installReason}`],v=Error(i.join(`
77
77
  `));return v.name="CodexSdkUnavailable",v}function z$(r){if(!r)return"unknown";if(r instanceof Error)return r.message||r.name||"unknown Error";if(typeof r==="string")return r;try{return JSON.stringify(r).slice(0,240)}catch{return String(r)}}function wU(r){return/[^A-Za-z0-9_\-./@~]/.test(r)?`'${r.replace(/'/g,"'\\''")}'`:r}function jU(r){return async(i,v)=>{let u=`npm install --no-save --prefix ${wU(i)} ${v.join(" ")}`;r(u,{stdio:"pipe",timeout:90000})}}async function JU(r,i,v={}){let u=Math.max(1,Math.min(100,v.limit??100)),n=Math.max(1,Math.min(50,v.topN??10));try{let t=v.serverSupportsFromNodeId===!0&&!!r.nodeId?{from_node_id:r.nodeId,limit:u}:{from_name:r.alias,limit:u},o=await i(t),c=Array.isArray(o?.tasks)?o.tasks:[],b=(g)=>{let I=typeof g.from_node_id==="string"?g.from_node_id:"",_=typeof g.from_name==="string"?g.from_name:"";if(I&&r.nodeId)return I===r.nodeId;if(_)return _===r.alias;return!1};return c.filter((g)=>!!g&&typeof g.task_id==="string"&&typeof g.to_name==="string"&&(g.status==="delivered"||g.status==="started")).filter(b).slice(0,n)}catch{return[]}}function NU(r){if(!r.length)return null;return["【⚠ 节点 resume 提醒 — 你停机前已派出但仍在等回复的任务】","",r.map((v,u)=>{let n=String(v.task_id||"?").slice(0,8),$=String(v.to_name||"?"),t=v.created_at?`, sent ${v.created_at}`:"",o=R1(v.content);return` ${u+1}. → ${$} [task ${n}${t}]: ${o}`}).join(`
78
78
  `),"","重要约束 (do NOT re-dispatch):","- 上面这些任务 **已经发出去过**, 对方尚未回复。**不要再次** 用 commhub_send_task 发同样内容。",'- 如果需要跟进进度, 用 commhub_send_message(alias=对方, message="任务 <task_id> 进度?") 发一条**轻问询**, **不是** send_task。',"- server 端有自动去重护栏会拒绝重复 send_task, 但请不要靠它兜底 — 直接按上面规则处理。",'- 如果用户现在派的新任务跟上面某条**实质相同**, 直接告诉用户 "task <id> 已派给 <对方>, 仍在等回复, 不重新派", 不要 send_task。'].join(`
79
- `)}function R1(r){let i=String(r??"").replace(/```/g,"ʼʼʼ").replace(/\s+/g," ").trim(),v=120;return i.length>120?i.slice(0,117)+"...":i||"(empty content)"}class Bb{opts;cachedAlias;cachedAt;fetchInFlight=null;cacheTtlMs;constructor(r){this.opts=r;this.cachedAlias=r.initialAlias,this.cachedAt=0,this.cacheTtlMs=r.cacheTtlMs??30000}current(){return this.cachedAlias}async refresh(r=Date.now()){if(!this.opts.nodeId)return this.cachedAlias;if(this.cacheTtlMs>0&&this.cachedAt>0&&r-this.cachedAt<this.cacheTtlMs)return this.cachedAlias;if(this.fetchInFlight)return this.fetchInFlight;let i=(async()=>{try{let v=await this.opts.fetchCanonicalAlias(this.opts.nodeId);if(v&&v.length>0&&v!==this.cachedAlias)this.opts.onDrift?.(this.cachedAlias,v,"fetch"),this.cachedAlias=v}catch(v){this.opts.warn?.(`currentAlias: fetch failed (${v?.message??v}); keeping cached value "${this.cachedAlias}"`)}finally{this.cachedAt=r,this.fetchInFlight=null}return this.cachedAlias})();return this.fetchInFlight=i,i}set(r,i=Date.now()){if(!r)return;if(r!==this.cachedAlias)this.opts.onDrift?.(this.cachedAlias,r,"snapshot"),this.cachedAlias=r;this.cachedAt=i}get nodeId(){return this.opts.nodeId}ageMs(r=Date.now()){return this.cachedAt===0?Number.POSITIVE_INFINITY:r-this.cachedAt}isFresh(r=Date.now()){return this.cachedAt!==0&&r-this.cachedAt<this.cacheTtlMs}}function WU(r,i,v){if(!Array.isArray(r))return{exists:!1,reason:"no_sessions_field"};if(r.length===0)return{exists:!1,reason:"empty_sessions"};let u=(i??"").trim(),n=(v??"").trim();if(!u)return{exists:!1,reason:"not_in_sessions"};let $=!1;for(let t of r){let o=typeof t?.alias==="string"?t.alias.trim():"";if(!o)continue;if(o===u){if(o===n){$=!0;continue}return{exists:!0,source:"session"}}}return{exists:!1,reason:$?"self_only":"not_in_sessions"}}import{mkdirSync as $I,appendFileSync as Lk}from"fs";var __dirname="/tmp/p34-codex-mcp/agent-node/src";var pU=zk(),cr=process.argv.slice(2),A={},aU=[],sU="2.1.0";try{let r=new URL(".",import.meta.url).pathname;for(let i of["../package.json","../../package.json"])try{let v=JSON.parse(rn(f(r,i),"utf-8"));if(v.version){sU=v.version;break}}catch{}}catch{}for(let r=0;r<cr.length;r++){if(cr[r]==="--version"||cr[r]==="-v")console.log(`agent-node v${sU}`),process.exit(0);if(cr[r]==="-h"||cr[r]==="--help")console.log(`
79
+ `)}function R1(r){let i=String(r??"").replace(/```/g,"ʼʼʼ").replace(/\s+/g," ").trim(),v=120;return i.length>120?i.slice(0,117)+"...":i||"(empty content)"}class Bb{opts;cachedAlias;cachedAt;fetchInFlight=null;cacheTtlMs;constructor(r){this.opts=r;this.cachedAlias=r.initialAlias,this.cachedAt=0,this.cacheTtlMs=r.cacheTtlMs??30000}current(){return this.cachedAlias}async refresh(r=Date.now()){if(!this.opts.nodeId)return this.cachedAlias;if(this.cacheTtlMs>0&&this.cachedAt>0&&r-this.cachedAt<this.cacheTtlMs)return this.cachedAlias;if(this.fetchInFlight)return this.fetchInFlight;let i=(async()=>{try{let v=await this.opts.fetchCanonicalAlias(this.opts.nodeId);if(v&&v.length>0&&v!==this.cachedAlias)this.opts.onDrift?.(this.cachedAlias,v,"fetch"),this.cachedAlias=v}catch(v){this.opts.warn?.(`currentAlias: fetch failed (${v?.message??v}); keeping cached value "${this.cachedAlias}"`)}finally{this.cachedAt=r,this.fetchInFlight=null}return this.cachedAlias})();return this.fetchInFlight=i,i}set(r,i=Date.now()){if(!r)return;if(r!==this.cachedAlias)this.opts.onDrift?.(this.cachedAlias,r,"snapshot"),this.cachedAlias=r;this.cachedAt=i}get nodeId(){return this.opts.nodeId}ageMs(r=Date.now()){return this.cachedAt===0?Number.POSITIVE_INFINITY:r-this.cachedAt}isFresh(r=Date.now()){return this.cachedAt!==0&&r-this.cachedAt<this.cacheTtlMs}}function WU(r,i,v){if(!Array.isArray(r))return{exists:!1,reason:"no_sessions_field"};if(r.length===0)return{exists:!1,reason:"empty_sessions"};let u=(i??"").trim(),n=(v??"").trim();if(!u)return{exists:!1,reason:"not_in_sessions"};let $=!1;for(let t of r){let o=typeof t?.alias==="string"?t.alias.trim():"";if(!o)continue;if(o===u){if(o===n){$=!0;continue}return{exists:!0,source:"session"}}}return{exists:!1,reason:$?"self_only":"not_in_sessions"}}import{mkdirSync as $I,appendFileSync as Lk}from"fs";var __dirname="/tmp/p35-promote/agent-node/src";var pU=zk(),cr=process.argv.slice(2),A={},aU=[],sU="2.1.0";try{let r=new URL(".",import.meta.url).pathname;for(let i of["../package.json","../../package.json"])try{let v=JSON.parse(rn(f(r,i),"utf-8"));if(v.version){sU=v.version;break}}catch{}}catch{}for(let r=0;r<cr.length;r++){if(cr[r]==="--version"||cr[r]==="-v")console.log(`agent-node v${sU}`),process.exit(0);if(cr[r]==="-h"||cr[r]==="--help")console.log(`
80
80
  @sleep2agi/agent-node — AI Agent 节点,一行命令加入 CommHub 网络
81
81
 
82
82
  用法:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-node",
3
- "version": "2.4.11-preview.2",
3
+ "version": "2.4.11",
4
4
  "description": "AI Agent runtime for CommHub networks. Supports 4 runtimes: Claude Code CLI, Claude Agent SDK, Codex SDK, and Grok Build ACP.",
5
5
  "bin": {
6
6
  "agent-node": "dist/cli.js"