agentix-cli 0.46.1 → 0.46.2

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 (31) hide show
  1. package/dist/{agent-LI3AZQBC.js → agent-WT4RB5SO.js} +2 -2
  2. package/dist/{board-dashboard-5JTHHIFU.js → board-dashboard-IXCW2KIV.js} +2 -2
  3. package/dist/{chunk-IMAAMJ74.js → chunk-5ZWNGD5D.js} +108 -108
  4. package/dist/chunk-5ZWNGD5D.js.map +1 -0
  5. package/dist/{chunk-GAUQOIEE.js → chunk-7KED5NB2.js} +3 -3
  6. package/dist/{chunk-TCJ3SMOF.js → chunk-HA6RYFST.js} +2 -2
  7. package/dist/{chunk-JTOKOQHQ.js → chunk-L3A2LVWC.js} +105 -105
  8. package/dist/chunk-L3A2LVWC.js.map +1 -0
  9. package/dist/chunk-L53FTKEP.js +3 -0
  10. package/dist/chunk-L53FTKEP.js.map +1 -0
  11. package/dist/{chunk-NVVXVUQU.js → chunk-NWOGPKD7.js} +2 -2
  12. package/dist/cli.js +1 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.js +1 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/program-AHTQMAKN.js +2 -0
  18. package/dist/{registry-STML35CV.js → registry-FBWGWB5K.js} +2 -2
  19. package/dist/shutdown-6GCMKYAD.js +2 -0
  20. package/dist/shutdown-6GCMKYAD.js.map +1 -0
  21. package/package.json +1 -1
  22. package/dist/chunk-IMAAMJ74.js.map +0 -1
  23. package/dist/chunk-JTOKOQHQ.js.map +0 -1
  24. package/dist/program-X26USJYH.js +0 -2
  25. /package/dist/{agent-LI3AZQBC.js.map → agent-WT4RB5SO.js.map} +0 -0
  26. /package/dist/{board-dashboard-5JTHHIFU.js.map → board-dashboard-IXCW2KIV.js.map} +0 -0
  27. /package/dist/{chunk-GAUQOIEE.js.map → chunk-7KED5NB2.js.map} +0 -0
  28. /package/dist/{chunk-TCJ3SMOF.js.map → chunk-HA6RYFST.js.map} +0 -0
  29. /package/dist/{chunk-NVVXVUQU.js.map → chunk-NWOGPKD7.js.map} +0 -0
  30. /package/dist/{program-X26USJYH.js.map → program-AHTQMAKN.js.map} +0 -0
  31. /package/dist/{registry-STML35CV.js.map → registry-FBWGWB5K.js.map} +0 -0
@@ -0,0 +1,3 @@
1
+ import{existsSync as a,readFileSync as l,unlinkSync as c,writeFileSync as S}from"fs";import{resolve as i}from"path";var u="shutdown-request.json",f=10*6e4;function g(e,t){S(i(e,u),JSON.stringify(t)+`
2
+ `)}function E(e,t=Date.now()){let n=i(e,u);if(!a(n))return null;let r=null;try{let s=JSON.parse(l(n,"utf-8")),o=Date.parse(s?.at);typeof s?.by=="string"&&Number.isFinite(o)&&t-o<=f&&(r=s)}catch{}try{c(n)}catch{}return r}function p(e=process.env){return e.INVOCATION_ID?"systemd":e.XPC_SERVICE_NAME&&e.XPC_SERVICE_NAME!=="0"?`launchd (${e.XPC_SERVICE_NAME})`:null}function _(e){let t=e.request?`requested by ${e.request.by} (pid ${e.request.pid})`:e.manager?`from ${e.manager}`:"sender unknown",n=e.uptimeSec>=3600?`${(e.uptimeSec/3600).toFixed(1)}h`:`${Math.round(e.uptimeSec/60)}m`;return`Shutdown: ${e.signal} ${t}; ${e.inflight} task(s) in flight; up ${n}`}var d=new Set(["/task","/ask","/mesh/task","/mesh/inbox/send","/workflow/event","/talk","/narration","/teach/live","/v1/chat/completions"]),w=["/webhook/","/routines/","/llm/","/api/workflows/signal/"];function k(e,t){let n=(e||"GET").toUpperCase();return n==="GET"?t==="/ask":n!=="POST"?!1:d.has(t)||w.some(r=>t.startsWith(r))?!0:/^\/workflows\/[^/]+\/run$/.test(t)||/^\/api\/tasks\/[^/]+\/followup$/.test(t)||t==="/api/workflows/editor/chat"}export{u as a,g as b,E as c,p as d,_ as e,k as f};
3
+ //# sourceMappingURL=chunk-L53FTKEP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/daemon/shutdown.ts"],"sourcesContent":["import { existsSync, readFileSync, unlinkSync, writeFileSync } from \"fs\"\nimport { resolve } from \"path\"\n\n// --- Graceful shutdown: who asked, and what may still come in ---\n//\n// On a stop signal the daemon drains in-flight agent tasks before exiting\n// (index.ts stop()). Two things make that drain useful:\n//\n// 1. Nothing new starts while it waits. Requests that would start an agent\n// run are answered 503 \"restarting\". Requests an in-flight agent still\n// needs to finish its turn — its memory writes, the guard check on its\n// tool calls, sending its reply — keep working.\n// 2. The log says why the daemon stopped. A signal carries no sender, so\n// `agentx daemon stop` leaves a short request file first; otherwise the\n// service manager (systemd / launchd) is the best available answer.\n//\n// Pure functions, unit tested.\n\nexport const SHUTDOWN_REQUEST_FILE = \"shutdown-request.json\"\n/** A request file older than this belongs to an earlier stop. */\nconst REQUEST_MAX_AGE_MS = 10 * 60_000\n\nexport interface ShutdownRequest {\n /** What asked, e.g. \"agentx daemon stop\". */\n by: string\n /** Process that asked. */\n pid: number\n at: string\n}\n\nexport function writeShutdownRequest(agentxDir: string, req: ShutdownRequest): void {\n writeFileSync(resolve(agentxDir, SHUTDOWN_REQUEST_FILE), JSON.stringify(req) + \"\\n\")\n}\n\n/** The pending request, if a recent one exists. Removes the file either\n * way, so a stale request can't be blamed for a later stop. */\nexport function takeShutdownRequest(agentxDir: string, now = Date.now()): ShutdownRequest | null {\n const path = resolve(agentxDir, SHUTDOWN_REQUEST_FILE)\n if (!existsSync(path)) return null\n let req: ShutdownRequest | null = null\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf-8\"))\n const at = Date.parse(parsed?.at)\n if (typeof parsed?.by === \"string\" && Number.isFinite(at) && now - at <= REQUEST_MAX_AGE_MS) req = parsed\n } catch { /* unreadable → unknown sender */ }\n try { unlinkSync(path) } catch { /* already gone */ }\n return req\n}\n\nexport function serviceManager(env: NodeJS.ProcessEnv = process.env): string | null {\n if (env.INVOCATION_ID) return \"systemd\"\n if (env.XPC_SERVICE_NAME && env.XPC_SERVICE_NAME !== \"0\") return `launchd (${env.XPC_SERVICE_NAME})`\n return null\n}\n\n/** The one line that explains a shutdown in the daemon log. */\nexport function describeShutdown(input: {\n signal: string\n request: ShutdownRequest | null\n manager: string | null\n inflight: number\n uptimeSec: number\n}): string {\n const who = input.request\n ? `requested by ${input.request.by} (pid ${input.request.pid})`\n : input.manager\n ? `from ${input.manager}`\n : \"sender unknown\"\n const up = input.uptimeSec >= 3600\n ? `${(input.uptimeSec / 3600).toFixed(1)}h`\n : `${Math.round(input.uptimeSec / 60)}m`\n return `Shutdown: ${input.signal} ${who}; ${input.inflight} task(s) in flight; up ${up}`\n}\n\nconst NEW_WORK_PATHS = new Set([\n \"/task\", \"/ask\", \"/mesh/task\", \"/mesh/inbox/send\", \"/workflow/event\",\n \"/talk\", \"/narration\", \"/teach/live\", \"/v1/chat/completions\",\n])\nconst NEW_WORK_PREFIXES = [\"/webhook/\", \"/routines/\", \"/llm/\", \"/api/workflows/signal/\"]\n\n/** Whether a request would start an agent run. GET /ask runs a prompt too. */\nexport function startsNewWork(method: string | undefined, path: string): boolean {\n const m = (method || \"GET\").toUpperCase()\n if (m === \"GET\") return path === \"/ask\"\n if (m !== \"POST\") return false\n if (NEW_WORK_PATHS.has(path) || NEW_WORK_PREFIXES.some((p) => path.startsWith(p))) return true\n // A manual workflow run, and a follow-up turn on a task.\n return /^\\/workflows\\/[^/]+\\/run$/.test(path) || /^\\/api\\/tasks\\/[^/]+\\/followup$/.test(path)\n || path === \"/api/workflows/editor/chat\"\n}\n"],"mappings":"AAAA,OAAS,cAAAA,EAAY,gBAAAC,EAAc,cAAAC,EAAY,iBAAAC,MAAqB,KACpE,OAAS,WAAAC,MAAe,OAiBjB,IAAMC,EAAwB,wBAE/BC,EAAqB,GAAK,IAUzB,SAASC,EAAqBC,EAAmBC,EAA4B,CAClFN,EAAcC,EAAQI,EAAWH,CAAqB,EAAG,KAAK,UAAUI,CAAG,EAAI;AAAA,CAAI,CACrF,CAIO,SAASC,EAAoBF,EAAmBG,EAAM,KAAK,IAAI,EAA2B,CAC/F,IAAMC,EAAOR,EAAQI,EAAWH,CAAqB,EACrD,GAAI,CAACL,EAAWY,CAAI,EAAG,OAAO,KAC9B,IAAIH,EAA8B,KAClC,GAAI,CACF,IAAMI,EAAS,KAAK,MAAMZ,EAAaW,EAAM,OAAO,CAAC,EAC/CE,EAAK,KAAK,MAAMD,GAAQ,EAAE,EAC5B,OAAOA,GAAQ,IAAO,UAAY,OAAO,SAASC,CAAE,GAAKH,EAAMG,GAAMR,IAAoBG,EAAMI,EACrG,MAAE,CAA0C,CAC5C,GAAI,CAAEX,EAAWU,CAAI,CAAE,MAAE,CAA2B,CACpD,OAAOH,CACT,CAEO,SAASM,EAAeC,EAAyB,QAAQ,IAAoB,CAClF,OAAIA,EAAI,cAAsB,UAC1BA,EAAI,kBAAoBA,EAAI,mBAAqB,IAAY,YAAYA,EAAI,oBAC1E,IACT,CAGO,SAASC,EAAiBC,EAMtB,CACT,IAAMC,EAAMD,EAAM,QACd,gBAAgBA,EAAM,QAAQ,WAAWA,EAAM,QAAQ,OACvDA,EAAM,QACJ,QAAQA,EAAM,UACd,iBACAE,EAAKF,EAAM,WAAa,KAC1B,IAAIA,EAAM,UAAY,MAAM,QAAQ,CAAC,KACrC,GAAG,KAAK,MAAMA,EAAM,UAAY,EAAE,KACtC,MAAO,aAAaA,EAAM,UAAUC,MAAQD,EAAM,kCAAkCE,GACtF,CAEA,IAAMC,EAAiB,IAAI,IAAI,CAC7B,QAAS,OAAQ,aAAc,mBAAoB,kBACnD,QAAS,aAAc,cAAe,sBACxC,CAAC,EACKC,EAAoB,CAAC,YAAa,aAAc,QAAS,wBAAwB,EAGhF,SAASC,EAAcC,EAA4BZ,EAAuB,CAC/E,IAAMa,GAAKD,GAAU,OAAO,YAAY,EACxC,OAAIC,IAAM,MAAcb,IAAS,OAC7Ba,IAAM,OAAe,GACrBJ,EAAe,IAAIT,CAAI,GAAKU,EAAkB,KAAMI,GAAMd,EAAK,WAAWc,CAAC,CAAC,EAAU,GAEnF,4BAA4B,KAAKd,CAAI,GAAK,kCAAkC,KAAKA,CAAI,GACvFA,IAAS,4BAChB","names":["existsSync","readFileSync","unlinkSync","writeFileSync","resolve","SHUTDOWN_REQUEST_FILE","REQUEST_MAX_AGE_MS","writeShutdownRequest","agentxDir","req","takeShutdownRequest","now","path","parsed","at","serviceManager","env","describeShutdown","input","who","up","NEW_WORK_PATHS","NEW_WORK_PREFIXES","startsNewWork","method","m","p"]}
@@ -48,7 +48,7 @@ The "modified" field is optional and can contain updated values to pass forward.
48
48
  ... (output truncated)`:i;return s.exitCode!==0?{tool_use_id:e.id,content:`Command exited with code ${s.exitCode}:
49
49
  ${c}`,is_error:!0}:{tool_use_id:e.id,content:c||"(no output)"}}async editFile(e){let t=String(e.input.path||""),o=e.input.edits,n=ge.resolve(this.cwd,t);if(!o||o.length===0)return{tool_use_id:e.id,content:"No edits provided.",is_error:!0};let s=await W.checkFileWrite(t);if(s==="deny")return{tool_use_id:e.id,content:`File write blocked by permissions: ${t}`,is_error:!0};if(s==="skip")return{tool_use_id:e.id,content:`File write skipped (plan mode): ${t}`};if(f.has("pre:file-write")){let a=await f.execute("pre:file-write",{event:"pre:file-write",file:n,cwd:this.cwd});if(a.blocked)return{tool_use_id:e.id,content:a.message||`File edit blocked by pre:file-write hook: ${t}`,is_error:!0}}let i=await re.readFile(n,"utf8"),c=[];for(let a of o)i.includes(a.old_text)?(i=i.replace(a.old_text,a.new_text),c.push(`Replaced: "${a.old_text.slice(0,40)}..."`)):c.push(`Not found: "${a.old_text.slice(0,40)}..."`);return this.options.dryRun||await re.writeFile(n,i,"utf8"),f.has("post:file-write")&&await f.execute("post:file-write",{event:"post:file-write",file:n,fileContent:i,cwd:this.cwd}),{tool_use_id:e.id,content:`Edited ${t}:
50
50
  ${c.join(`
51
- `)}`}}async createFiles(e){let t=e.input,o=t.files||[];return{tool_use_id:e.id,content:t.summary||`Queued ${o.length} file(s) for creation.`,files:o}}async spawnAgent(e){let t=String(e.input.agent_id||""),o=String(e.input.prompt||""),n=Number(e.input.timeout_seconds)||300;if(!t||!o)return{tool_use_id:e.id,content:"agent_id and prompt are required.",is_error:!0};try{let{SubAgentManager:s}=await import("./subagent-2SJHSSJS.js"),{getGlobalRegistry:i}=await import("./registry-STML35CV.js"),c=i();if(!c)return{tool_use_id:e.id,content:"Sub-agent spawning requires the daemon to be running.",is_error:!0};let p=await new s(c).spawn({targetAgentId:t,prompt:o,parentAgentId:"orchestrator",timeout:n*1e3});return p.success?{tool_use_id:e.id,content:`Sub-agent "${t}" completed (${Math.round(p.duration/1e3)}s):
51
+ `)}`}}async createFiles(e){let t=e.input,o=t.files||[];return{tool_use_id:e.id,content:t.summary||`Queued ${o.length} file(s) for creation.`,files:o}}async spawnAgent(e){let t=String(e.input.agent_id||""),o=String(e.input.prompt||""),n=Number(e.input.timeout_seconds)||300;if(!t||!o)return{tool_use_id:e.id,content:"agent_id and prompt are required.",is_error:!0};try{let{SubAgentManager:s}=await import("./subagent-2SJHSSJS.js"),{getGlobalRegistry:i}=await import("./registry-FBWGWB5K.js"),c=i();if(!c)return{tool_use_id:e.id,content:"Sub-agent spawning requires the daemon to be running.",is_error:!0};let p=await new s(c).spawn({targetAgentId:t,prompt:o,parentAgentId:"orchestrator",timeout:n*1e3});return p.success?{tool_use_id:e.id,content:`Sub-agent "${t}" completed (${Math.round(p.duration/1e3)}s):
52
52
 
53
53
  ${p.content}`}:{tool_use_id:e.id,content:`Sub-agent "${t}" failed: ${p.error}`,is_error:!0}}catch(s){return{tool_use_id:e.id,content:`Failed to spawn sub-agent: ${s.message}`,is_error:!0}}}async askUser(e){let t=String(e.input.question||""),o=e.input.options,n=t;return o?.length&&(n+=`
54
54
  Options: ${o.join(", ")}`),{tool_use_id:e.id,content:"Question sent to user.",followUp:n}}};async function Ae(r){let{provider:e,systemPrompt:t,messages:o,providerOptions:n,cwd:s,maxIterations:i=20,enabledTools:c,interactive:a=!0,overwrite:p=!1,dryRun:l=!1,onProgress:d,abortSignal:u}=r,m=u?{...n,abortSignal:u}:n;if(!e.generateRaw)return dt(r);let I=new se(s,{interactive:a,overwrite:p,dryRun:l,acmeContext:r.acmeContext,abortSignal:u}),D=be(c);if(r.acmeContext)for(let g of at)D.push({name:g.name,description:g.description,input_schema:g.input_schema});let E=new Set;if(r.mcpTools?.length)for(let g of r.mcpTools)D.push({name:g.name,description:g.description,input_schema:g.input_schema}),E.add(g.name);let C=o.filter(g=>g.role!=="system").map(g=>({role:g.role,content:g.content})),B=[],G=0,F=0,A=0,O="",j,_=0;for(;_<i;){if(_++,u?.aborted)throw new Error("cancelled");d?.({type:"iteration_start",iteration:_}),b.step(_,`Agentic loop iteration (${D.length} tools available)`);let g,M=!!e.generateRawStream&&!!d;try{if(M){let T=null,U=null,v="";for await(let x of e.generateRawStream(C,t,D,m))x.type==="text_delta"?(v+=x.text,d?.({type:"text_delta",text:x.text})):x.type==="thinking_delta"?d?.({type:"thinking_delta",text:x.text}):x.type==="raw_result"?T=x.result:x.type==="error"&&(U=x.error);if(U&&!T)throw new Error(U);if(!T)throw new Error("generateRawStream returned no raw_result event");g=T,g._streamedText=v}else g=await e.generateRaw(C,t,D,m)}catch(T){if(T.message?.includes("not available"))return dt(r);throw T}G+=g.usage.input_tokens+g.usage.output_tokens,F+=g.usage.input_tokens,A+=g.usage.output_tokens;let P=g._streamedText;for(let T of g.content)T.type==="text"&&(O+=T.text,P===void 0&&d?.({type:"text_delta",text:T.text}));if(P!==void 0&&delete g._streamedText,g.stop_reason==="end_turn"||g.stop_reason==="max_tokens")break;if(g.stop_reason==="tool_use"){let T=g.content.filter(v=>v.type==="tool_use");if(T.length===0)break;C.push({role:"assistant",content:g.content});let U=[];for(let v of T){d?.({type:"tool_call",name:v.name,id:v.id,input:v.input}),b.step(_,`Tool call: ${v.name}`);let x;if(E.has(v.name)&&r.mcpDispatch){let h=await r.mcpDispatch(v.name,v.input);x={tool_use_id:v.id,content:h.content,is_error:h.isError}}else x=await I.execute({name:v.name,id:v.id,input:v.input});d?.({type:"tool_result",name:v.name,id:v.id,content:x.content.slice(0,200),is_error:x.is_error}),x.files?.length&&(B.push(...x.files),d?.({type:"files_created",files:x.files})),x.followUp&&(j=x.followUp),U.push({type:"tool_result",tool_use_id:x.tool_use_id,content:x.content,is_error:x.is_error})}if(C.push({role:"user",content:U}),j)break;continue}break}return d?.({type:"complete",iterations:_,totalTokens:G}),{files:B,content:O,followUp:j,tokensUsed:G,inputTokens:F||void 0,outputTokens:A||void 0,iterations:_}}async function dt(r){let{provider:e,systemPrompt:t,messages:o,providerOptions:n,maxIterations:s=5}=r,c=[{role:"system",content:t+`
@@ -123,4 +123,4 @@ ${r.projectInstructions}`),r.memoryContext&&o.push(r.memoryContext),o.push(`# Ou
123
123
  Generate output appropriate for: ${e}. Use the \`create_files\` tool to output all files.`),o.join(`
124
124
 
125
125
  `)}export{qe as a,Vt as b,Yt as c,We as d,ze as e,Ve as f,Ye as g,Pe as h,ee as i,Re as j,le as k,te as l,Tt as m,oe as n,Mt as o,f as p,et as q,tt as r,Me as s,de as t,W as u,ne as v,it as w,Ee as x,$e as y,se as z,mt as A,Zn as B,er as C};
126
- //# sourceMappingURL=chunk-NVVXVUQU.js.map
126
+ //# sourceMappingURL=chunk-NWOGPKD7.js.map
package/dist/cli.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{a as s}from"./chunk-JTOKOQHQ.js";import"./chunk-7A7RC3R4.js";import"./chunk-E6EW42EA.js";import"./chunk-LGBBKLUO.js";import"./chunk-2TJ5L7CB.js";import"./chunk-7CVJ4JOE.js";import"./chunk-WLVQDEOT.js";import"./chunk-GV7S5BAX.js";import"./chunk-GSX4NK2N.js";import"./chunk-SZDACK6O.js";import"./chunk-IMAAMJ74.js";import"./chunk-LUSFRS7R.js";import"./chunk-V5FZJUK4.js";import"./chunk-ZVP6GB4G.js";import"./chunk-7L6M3P2N.js";import"./chunk-CTCOWVNL.js";import"./chunk-3SCPRYJB.js";import"./chunk-FRHSQVFN.js";import"./chunk-V7FYSZSV.js";import"./chunk-GAUQOIEE.js";import"./chunk-TCJ3SMOF.js";import"./chunk-VMDA2SX2.js";import"./chunk-QLTM3F7M.js";import"./chunk-DP7RTNDM.js";import"./chunk-NVVXVUQU.js";import"./chunk-SFQUP3BP.js";import"./chunk-BIFJSQB5.js";import"./chunk-WPMX3VGI.js";import"./chunk-K33GIBSE.js";import"./chunk-76Z4VHDX.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-NSYY5NCR.js";import"./chunk-ICZPZYYR.js";import"./chunk-DWADWDMU.js";import"./chunk-CQR6C5FU.js";import"./chunk-VWTBHLMX.js";import"./chunk-RY2EULHS.js";import"./chunk-SGFXE5FP.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import"./chunk-TNFOGJWZ.js";import"./chunk-AJ5RMU7X.js";import"./chunk-2GIDVZ4H.js";import"./chunk-6HMZ5TTM.js";import"./chunk-F4HZTZHW.js";import"./chunk-AJONZWLT.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-QOYAX2FT.js";import"./chunk-LCIREYTD.js";import"./chunk-L2WSPY6S.js";import"./chunk-VDMYBPYB.js";import"./chunk-DSYKYZMT.js";import"./chunk-QJANPP4C.js";import"./chunk-BH3GTCZ6.js";import"./chunk-FIOB3MEX.js";process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function o(){let r=await s();if(process.argv.slice(2).length===0){r.outputHelp();return}r.parse()}o();
2
+ import{a as n}from"./chunk-L3A2LVWC.js";import"./chunk-7A7RC3R4.js";import"./chunk-E6EW42EA.js";import"./chunk-2TJ5L7CB.js";import"./chunk-7CVJ4JOE.js";import"./chunk-LGBBKLUO.js";import"./chunk-WLVQDEOT.js";import"./chunk-GV7S5BAX.js";import"./chunk-GSX4NK2N.js";import"./chunk-SZDACK6O.js";import"./chunk-5ZWNGD5D.js";import"./chunk-LUSFRS7R.js";import"./chunk-V5FZJUK4.js";import"./chunk-V7FYSZSV.js";import"./chunk-ZVP6GB4G.js";import"./chunk-7L6M3P2N.js";import"./chunk-CTCOWVNL.js";import"./chunk-3SCPRYJB.js";import"./chunk-FRHSQVFN.js";import"./chunk-L53FTKEP.js";import"./chunk-7KED5NB2.js";import"./chunk-HA6RYFST.js";import"./chunk-QLTM3F7M.js";import"./chunk-VMDA2SX2.js";import"./chunk-DP7RTNDM.js";import"./chunk-NWOGPKD7.js";import"./chunk-SFQUP3BP.js";import"./chunk-BIFJSQB5.js";import"./chunk-WPMX3VGI.js";import"./chunk-K33GIBSE.js";import"./chunk-76Z4VHDX.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-NSYY5NCR.js";import"./chunk-ICZPZYYR.js";import"./chunk-DWADWDMU.js";import"./chunk-CQR6C5FU.js";import"./chunk-VWTBHLMX.js";import"./chunk-RY2EULHS.js";import"./chunk-SGFXE5FP.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import"./chunk-TNFOGJWZ.js";import"./chunk-AJ5RMU7X.js";import"./chunk-2GIDVZ4H.js";import"./chunk-6HMZ5TTM.js";import"./chunk-F4HZTZHW.js";import"./chunk-AJONZWLT.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-QOYAX2FT.js";import"./chunk-LCIREYTD.js";import"./chunk-L2WSPY6S.js";import"./chunk-VDMYBPYB.js";import"./chunk-DSYKYZMT.js";import"./chunk-QJANPP4C.js";import"./chunk-BH3GTCZ6.js";import"./chunk-FIOB3MEX.js";var r=["SIGINT","SIGTERM"];function o(t=process){for(let i of r)t.on(i,()=>{t.listenerCount(i)<=1&&t.exit(0)})}o();async function s(){let t=await n();if(process.argv.slice(2).length===0){t.outputHelp();return}t.parse()}s();
3
3
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { buildProgram } from \"@/program\"\n\nprocess.on(\"SIGINT\", () => process.exit(0))\nprocess.on(\"SIGTERM\", () => process.exit(0))\n\nasync function main() {\n const program = await buildProgram()\n\n const args = process.argv.slice(2)\n if (args.length === 0) {\n program.outputHelp()\n return\n }\n\n program.parse()\n}\n\nmain()\n"],"mappings":";4iDAGA,QAAQ,GAAG,SAAU,IAAM,QAAQ,KAAK,CAAC,CAAC,EAC1C,QAAQ,GAAG,UAAW,IAAM,QAAQ,KAAK,CAAC,CAAC,EAE3C,eAAeA,GAAO,CACpB,IAAMC,EAAU,MAAMC,EAAa,EAGnC,GADa,QAAQ,KAAK,MAAM,CAAC,EACxB,SAAW,EAAG,CACrBD,EAAQ,WAAW,EACnB,OAGFA,EAAQ,MAAM,CAChB,CAEAD,EAAK","names":["main","program","buildProgram"]}
1
+ {"version":3,"sources":["../src/utils/signal-exit.ts","../src/cli.ts"],"sourcesContent":["// --- Ctrl-C / SIGTERM for CLI commands ---\n//\n// Short commands should exit at once when stopped. Long-running ones (the\n// daemon above all) install their own handler to finish in-flight work first.\n// The CLI's quick exit used to be registered unconditionally, before the\n// daemon's, and Node runs listeners in registration order — so every stop\n// exited the process before the daemon's drain began and killed in-flight\n// agent tasks mid-turn (#103). Now the quick exit only fires when nobody\n// else handles the signal.\n\ntype SignalTarget = Pick<NodeJS.Process, \"on\" | \"listenerCount\" | \"exit\">\n\nexport const CLI_EXIT_SIGNALS = [\"SIGINT\", \"SIGTERM\"] as const\n\nexport function installCliSignalExit(proc: SignalTarget = process): void {\n for (const sig of CLI_EXIT_SIGNALS) {\n proc.on(sig, () => {\n // This listener is always one of them; anything more means a command\n // is handling the stop itself.\n if (proc.listenerCount(sig) <= 1) proc.exit(0)\n })\n }\n}\n","#!/usr/bin/env node\nimport { buildProgram } from \"@/program\"\nimport { installCliSignalExit } from \"@/utils/signal-exit\"\n\ninstallCliSignalExit()\n\nasync function main() {\n const program = await buildProgram()\n\n const args = process.argv.slice(2)\n if (args.length === 0) {\n program.outputHelp()\n return\n }\n\n program.parse()\n}\n\nmain()\n"],"mappings":";wkDAYO,IAAMA,EAAmB,CAAC,SAAU,SAAS,EAE7C,SAASC,EAAqBC,EAAqB,QAAe,CACvE,QAAWC,KAAOH,EAChBE,EAAK,GAAGC,EAAK,IAAM,CAGbD,EAAK,cAAcC,CAAG,GAAK,GAAGD,EAAK,KAAK,CAAC,CAC/C,CAAC,CAEL,CClBAE,EAAqB,EAErB,eAAeC,GAAO,CACpB,IAAMC,EAAU,MAAMC,EAAa,EAGnC,GADa,QAAQ,KAAK,MAAM,CAAC,EACxB,SAAW,EAAG,CACrBD,EAAQ,WAAW,EACnB,OAGFA,EAAQ,MAAM,CAChB,CAEAD,EAAK","names":["CLI_EXIT_SIGNALS","installCliSignalExit","proc","sig","installCliSignalExit","main","program","buildProgram"]}
package/dist/index.d.ts CHANGED
@@ -6703,6 +6703,8 @@ declare class AgentXDaemon {
6703
6703
  start(): Promise<void>;
6704
6704
  stop(): Promise<void>;
6705
6705
  private midnightTimer?;
6706
+ /** Set on the first stop signal: new work is refused while tasks drain. */
6707
+ private shuttingDown;
6706
6708
  /**
6707
6709
  * Watch agentx.json for external edits (e.g. `agentx config set ...`) and
6708
6710
  * reload cron jobs + in-memory config. Channels / agents / mesh changes
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{a as L}from"./chunk-W5C2GDNC.js";import{Y as bt,Z as Tt,_ as Mt,a as St,b as kt,c as vt,d as xt,e as $t,f as Ct,g as Pt}from"./chunk-IMAAMJ74.js";import"./chunk-LUSFRS7R.js";import"./chunk-V5FZJUK4.js";import"./chunk-ZVP6GB4G.js";import"./chunk-7L6M3P2N.js";import"./chunk-CTCOWVNL.js";import"./chunk-3SCPRYJB.js";import"./chunk-FRHSQVFN.js";import"./chunk-V7FYSZSV.js";import{N as yt,l as lt,m as ct,n as dt,o as mt,p as pt}from"./chunk-GAUQOIEE.js";import"./chunk-TCJ3SMOF.js";import"./chunk-VMDA2SX2.js";import"./chunk-QLTM3F7M.js";import"./chunk-DP7RTNDM.js";import{A as D,B as z,C as V,a as ye,b as we,c as Se,d as Ae,e as Ie,f as Oe,g as Ne,h as He,i as je,j as Ue,k as _e,l as I,m as q,n as Be,o as qe,p as Ye,q as O,r as ze,s as Ve,t as Xe,u as x,v as Y,w as Qe,x as Ze,y as et,z as wt}from"./chunk-NVVXVUQU.js";import{a as B,b as M,c as F}from"./chunk-SFQUP3BP.js";import{k as ut}from"./chunk-BIFJSQB5.js";import"./chunk-WPMX3VGI.js";import"./chunk-K33GIBSE.js";import"./chunk-76Z4VHDX.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-NSYY5NCR.js";import"./chunk-ICZPZYYR.js";import"./chunk-DWADWDMU.js";import"./chunk-CQR6C5FU.js";import"./chunk-VWTBHLMX.js";import"./chunk-RY2EULHS.js";import{a as gt,b as ft,e as ht}from"./chunk-SGFXE5FP.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import"./chunk-TNFOGJWZ.js";import"./chunk-AJ5RMU7X.js";import"./chunk-2GIDVZ4H.js";import{j as it,k as rt,l as at}from"./chunk-6HMZ5TTM.js";import"./chunk-F4HZTZHW.js";import"./chunk-AJONZWLT.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-QOYAX2FT.js";import{a as ke,b as ve,c as xe,d as $e,e as Ce,f as Pe,g as be,h as Te,i as Me,j as Re,l as Ee,m as Ge,o as T,p as W}from"./chunk-LCIREYTD.js";import{a as m,b as G}from"./chunk-L2WSPY6S.js";import{a as Fe,b as Le,c as A,d as De}from"./chunk-VDMYBPYB.js";import{a as Ke,b as Je,e as We}from"./chunk-DSYKYZMT.js";import{j as tt,l as st,m as ot,o as nt}from"./chunk-QJANPP4C.js";import"./chunk-BH3GTCZ6.js";import"./chunk-FIOB3MEX.js";W();G();import{execa as Rt}from"execa";import{existsSync as se,promises as X}from"fs";import S from"path";import ie from"node-fetch";async function Et(o,e){let t=o.split("/");if(t.length<2)throw new Error(`Invalid skill package ID: ${o}. Expected format: owner/repo`);let s=t[0],i=t[1],n=t[2];try{let a=n?`${s}/${i}/${n}`:`${s}/${i}`;await Rt("npx",["-y","skills","add",a],{cwd:e,stdio:"pipe"}),m.success(`Installed skill package: ${o}`);let r=S.resolve(e,".skills",`${s}_${i}`);if(se(r))return await ne(r,o);let d=S.resolve(e,".skills");return se(d)?await ne(d,o):[]}catch{return m.info(`Fetching skills directly from GitHub: ${s}/${i}`),await Gt(s,i,n,e)}}async function Gt(o,e,t,s){let i=[];try{let n=`https://api.github.com/repos/${o}/${e}/git/trees/main?recursive=1`,a=await ie(n);if(!a.ok)throw new Error(`GitHub API error: ${a.status}`);let d=(await a.json()).tree.filter(p=>p.type==="blob"&&p.path.endsWith("SKILL.md"));if(t){let p=d.find(f=>f.path.includes(`/${t}/`)||f.path===`${t}/SKILL.md`);if(p){let f=await oe(o,e,p.path,s);f&&i.push(f)}}else for(let p of d){let f=await oe(o,e,p.path,s);f&&i.push(f)}}catch(n){m.error(`Failed to fetch skills from GitHub: ${n.message}`)}return i}async function oe(o,e,t,s){try{let i=`https://raw.githubusercontent.com/${o}/${e}/main/${t}`,n=await ie(i);if(!n.ok)return null;let a=await n.text(),r=A(a);if(r){r.source="remote",r.packageId=`${o}/${e}`;let d=S.dirname(t),p=S.resolve(s,".skills",`${o}_${e}`,d);await X.mkdir(p,{recursive:!0}),await X.writeFile(S.resolve(p,"SKILL.md"),a),r.path=S.resolve(p,"SKILL.md")}return r}catch{return null}}async function ne(o,e){let t=[],{default:s}=await import("fast-glob"),i=await s.glob("**/SKILL.md",{cwd:o,deep:5});for(let n of i)try{let a=S.resolve(o,n),r=await X.readFile(a,"utf8"),d=A(r);d&&(d.source="remote",d.path=a,d.packageId=e,t.push(d))}catch{}return t}async function At(o,e,t,s,i){let n=["---",`name: ${o}`,`description: ${e}`];if(s?.length){n.push("tags:");for(let a of s)n.push(` - ${a}`)}if(i?.length){n.push("globs:");for(let a of i)n.push(` - ${a}`)}return n.push("---"),`${n.join(`
1
+ import{a as L}from"./chunk-W5C2GDNC.js";import{Y as bt,Z as Tt,_ as Mt,a as St,b as kt,c as vt,d as xt,e as $t,f as Ct,g as Pt}from"./chunk-5ZWNGD5D.js";import"./chunk-LUSFRS7R.js";import"./chunk-V5FZJUK4.js";import"./chunk-V7FYSZSV.js";import"./chunk-ZVP6GB4G.js";import"./chunk-7L6M3P2N.js";import"./chunk-CTCOWVNL.js";import"./chunk-3SCPRYJB.js";import"./chunk-FRHSQVFN.js";import"./chunk-L53FTKEP.js";import{N as yt,l as lt,m as ct,n as dt,o as mt,p as pt}from"./chunk-7KED5NB2.js";import"./chunk-HA6RYFST.js";import"./chunk-QLTM3F7M.js";import"./chunk-VMDA2SX2.js";import"./chunk-DP7RTNDM.js";import{A as D,B as z,C as V,a as ye,b as we,c as Se,d as Ae,e as Ie,f as Oe,g as Ne,h as He,i as je,j as Ue,k as _e,l as I,m as q,n as Be,o as qe,p as Ye,q as O,r as ze,s as Ve,t as Xe,u as x,v as Y,w as Qe,x as Ze,y as et,z as wt}from"./chunk-NWOGPKD7.js";import{a as B,b as M,c as F}from"./chunk-SFQUP3BP.js";import{k as ut}from"./chunk-BIFJSQB5.js";import"./chunk-WPMX3VGI.js";import"./chunk-K33GIBSE.js";import"./chunk-76Z4VHDX.js";import"./chunk-W4YR2RO2.js";import"./chunk-AFRHKA7B.js";import"./chunk-NSYY5NCR.js";import"./chunk-ICZPZYYR.js";import"./chunk-DWADWDMU.js";import"./chunk-CQR6C5FU.js";import"./chunk-VWTBHLMX.js";import"./chunk-RY2EULHS.js";import{a as gt,b as ft,e as ht}from"./chunk-SGFXE5FP.js";import"./chunk-PNWNVOEZ.js";import"./chunk-64P4QHSZ.js";import"./chunk-TNFOGJWZ.js";import"./chunk-AJ5RMU7X.js";import"./chunk-2GIDVZ4H.js";import{j as it,k as rt,l as at}from"./chunk-6HMZ5TTM.js";import"./chunk-F4HZTZHW.js";import"./chunk-AJONZWLT.js";import"./chunk-ZTEU5JVQ.js";import"./chunk-QOYAX2FT.js";import{a as ke,b as ve,c as xe,d as $e,e as Ce,f as Pe,g as be,h as Te,i as Me,j as Re,l as Ee,m as Ge,o as T,p as W}from"./chunk-LCIREYTD.js";import{a as m,b as G}from"./chunk-L2WSPY6S.js";import{a as Fe,b as Le,c as A,d as De}from"./chunk-VDMYBPYB.js";import{a as Ke,b as Je,e as We}from"./chunk-DSYKYZMT.js";import{j as tt,l as st,m as ot,o as nt}from"./chunk-QJANPP4C.js";import"./chunk-BH3GTCZ6.js";import"./chunk-FIOB3MEX.js";W();G();import{execa as Rt}from"execa";import{existsSync as se,promises as X}from"fs";import S from"path";import ie from"node-fetch";async function Et(o,e){let t=o.split("/");if(t.length<2)throw new Error(`Invalid skill package ID: ${o}. Expected format: owner/repo`);let s=t[0],i=t[1],n=t[2];try{let a=n?`${s}/${i}/${n}`:`${s}/${i}`;await Rt("npx",["-y","skills","add",a],{cwd:e,stdio:"pipe"}),m.success(`Installed skill package: ${o}`);let r=S.resolve(e,".skills",`${s}_${i}`);if(se(r))return await ne(r,o);let d=S.resolve(e,".skills");return se(d)?await ne(d,o):[]}catch{return m.info(`Fetching skills directly from GitHub: ${s}/${i}`),await Gt(s,i,n,e)}}async function Gt(o,e,t,s){let i=[];try{let n=`https://api.github.com/repos/${o}/${e}/git/trees/main?recursive=1`,a=await ie(n);if(!a.ok)throw new Error(`GitHub API error: ${a.status}`);let d=(await a.json()).tree.filter(p=>p.type==="blob"&&p.path.endsWith("SKILL.md"));if(t){let p=d.find(f=>f.path.includes(`/${t}/`)||f.path===`${t}/SKILL.md`);if(p){let f=await oe(o,e,p.path,s);f&&i.push(f)}}else for(let p of d){let f=await oe(o,e,p.path,s);f&&i.push(f)}}catch(n){m.error(`Failed to fetch skills from GitHub: ${n.message}`)}return i}async function oe(o,e,t,s){try{let i=`https://raw.githubusercontent.com/${o}/${e}/main/${t}`,n=await ie(i);if(!n.ok)return null;let a=await n.text(),r=A(a);if(r){r.source="remote",r.packageId=`${o}/${e}`;let d=S.dirname(t),p=S.resolve(s,".skills",`${o}_${e}`,d);await X.mkdir(p,{recursive:!0}),await X.writeFile(S.resolve(p,"SKILL.md"),a),r.path=S.resolve(p,"SKILL.md")}return r}catch{return null}}async function ne(o,e){let t=[],{default:s}=await import("fast-glob"),i=await s.glob("**/SKILL.md",{cwd:o,deep:5});for(let n of i)try{let a=S.resolve(o,n),r=await X.readFile(a,"utf8"),d=A(r);d&&(d.source="remote",d.path=a,d.packageId=e,t.push(d))}catch{}return t}async function At(o,e,t,s,i){let n=["---",`name: ${o}`,`description: ${e}`];if(s?.length){n.push("tags:");for(let a of s)n.push(` - ${a}`)}if(i?.length){n.push("globs:");for(let a of i)n.push(` - ${a}`)}return n.push("---"),`${n.join(`
2
2
  `)}
3
3
 
4
4
  ${t}`}async function It(o){let{loadLocalSkills:e}=await import("./loader-BOKE5M5S.js");return e(o)}async function Ot(o,e,t,s,i){let a=[{role:"system",content:`You are a skill author for the Agent Skills ecosystem (skills.sh).