agentix-cli 0.21.0 → 0.22.0

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 (62) hide show
  1. package/dist/{agent-I3ILI3MO.js → agent-Y4U4R3ZZ.js} +2 -2
  2. package/dist/{board-dashboard-ASI6MDKX.js → board-dashboard-2CPBWFOB.js} +4 -4
  3. package/dist/{chunk-EQNM3TOF.js → chunk-2HXSJYAJ.js} +2 -2
  4. package/dist/{chunk-K6MC66D6.js → chunk-ABVZHJUO.js} +2 -2
  5. package/dist/chunk-BHSPAP4U.js +44 -0
  6. package/dist/chunk-BHSPAP4U.js.map +1 -0
  7. package/dist/chunk-CO4YCIIA.js +13 -0
  8. package/dist/{chunk-5GDCJ2SF.js.map → chunk-CO4YCIIA.js.map} +1 -1
  9. package/dist/{chunk-4MREHZP5.js → chunk-GOLZ6NEL.js} +2 -2
  10. package/dist/chunk-GOLZ6NEL.js.map +1 -0
  11. package/dist/{chunk-FUYZUGNQ.js → chunk-KX626FN4.js} +2 -2
  12. package/dist/chunk-OPKQNLGX.js +450 -0
  13. package/dist/chunk-OPKQNLGX.js.map +1 -0
  14. package/dist/chunk-OZOQKPJV.js +102 -0
  15. package/dist/chunk-OZOQKPJV.js.map +1 -0
  16. package/dist/{chunk-AANSVC5A.js → chunk-P3TJHGO5.js} +2 -2
  17. package/dist/{chunk-AGINLNAW.js → chunk-VYLZ7UYM.js} +2 -2
  18. package/dist/{chunk-2B2DIQKD.js → chunk-WHP4I44J.js} +2 -2
  19. package/dist/chunk-X5D5AV5N.js +833 -0
  20. package/dist/chunk-X5D5AV5N.js.map +1 -0
  21. package/dist/cli.js +1 -1
  22. package/dist/{config-RWHSEE4N.js → config-BLOKGMER.js} +2 -2
  23. package/dist/config-mutator-RG7QY2EL.js +2 -0
  24. package/dist/doctor-ZTECTUHX.js +2 -0
  25. package/dist/index.d.ts +140 -3
  26. package/dist/index.js +1 -1
  27. package/dist/program-GZOJIWTB.js +2 -0
  28. package/dist/registry-QZIUSQ5J.js +2 -0
  29. package/dist/scheduler-B2BQPV4M.js +2 -0
  30. package/dist/workspace-setup-DQCZX2NE.js +2 -0
  31. package/package.json +1 -1
  32. package/dist/chunk-4MREHZP5.js.map +0 -1
  33. package/dist/chunk-5GDCJ2SF.js +0 -13
  34. package/dist/chunk-5XZ73VM4.js +0 -102
  35. package/dist/chunk-5XZ73VM4.js.map +0 -1
  36. package/dist/chunk-BLRLUF2H.js +0 -743
  37. package/dist/chunk-BLRLUF2H.js.map +0 -1
  38. package/dist/chunk-IFQQVDM6.js +0 -442
  39. package/dist/chunk-IFQQVDM6.js.map +0 -1
  40. package/dist/chunk-ZE2YFX4K.js +0 -45
  41. package/dist/chunk-ZE2YFX4K.js.map +0 -1
  42. package/dist/config-mutator-JKCNCY2F.js +0 -2
  43. package/dist/doctor-KWN7NUFQ.js +0 -2
  44. package/dist/program-JEKM7SCS.js +0 -2
  45. package/dist/registry-EGKDMVSP.js +0 -2
  46. package/dist/scheduler-ED4FCI2Y.js +0 -2
  47. package/dist/workspace-setup-FPGN5VNY.js +0 -2
  48. /package/dist/{agent-I3ILI3MO.js.map → agent-Y4U4R3ZZ.js.map} +0 -0
  49. /package/dist/{board-dashboard-ASI6MDKX.js.map → board-dashboard-2CPBWFOB.js.map} +0 -0
  50. /package/dist/{chunk-EQNM3TOF.js.map → chunk-2HXSJYAJ.js.map} +0 -0
  51. /package/dist/{chunk-K6MC66D6.js.map → chunk-ABVZHJUO.js.map} +0 -0
  52. /package/dist/{chunk-FUYZUGNQ.js.map → chunk-KX626FN4.js.map} +0 -0
  53. /package/dist/{chunk-AANSVC5A.js.map → chunk-P3TJHGO5.js.map} +0 -0
  54. /package/dist/{chunk-AGINLNAW.js.map → chunk-VYLZ7UYM.js.map} +0 -0
  55. /package/dist/{chunk-2B2DIQKD.js.map → chunk-WHP4I44J.js.map} +0 -0
  56. /package/dist/{config-RWHSEE4N.js.map → config-BLOKGMER.js.map} +0 -0
  57. /package/dist/{config-mutator-JKCNCY2F.js.map → config-mutator-RG7QY2EL.js.map} +0 -0
  58. /package/dist/{doctor-KWN7NUFQ.js.map → doctor-ZTECTUHX.js.map} +0 -0
  59. /package/dist/{program-JEKM7SCS.js.map → program-GZOJIWTB.js.map} +0 -0
  60. /package/dist/{registry-EGKDMVSP.js.map → registry-QZIUSQ5J.js.map} +0 -0
  61. /package/dist/{scheduler-ED4FCI2Y.js.map → scheduler-B2BQPV4M.js.map} +0 -0
  62. /package/dist/{workspace-setup-FPGN5VNY.js.map → workspace-setup-DQCZX2NE.js.map} +0 -0
@@ -1,5 +1,5 @@
1
- import{c as m,d as $}from"./chunk-5GDCJ2SF.js";import{readFileSync as S,writeFileSync as x,existsSync as b}from"fs";import{resolve as f}from"path";function P(r){if(r)return f(r);let e=[f(process.cwd(),"agentx.json"),f(process.cwd(),".agentx/config.json")];for(let n of e)if(b(n))return n;return e[0]}function w(r){return JSON.parse(JSON.stringify(r))}async function v(r){try{let e=await fetch(`${r.replace(/\/$/,"")}/reload`,{method:"POST",signal:AbortSignal.timeout(3e3)});return e.ok?{ok:!0}:{ok:!1,reason:`HTTP ${e.status}`}}catch(e){return{ok:!1,reason:e?.cause?.code||e?.message||"unreachable"}}}async function T(r,e={}){let{validate:n=!0,dryRun:t=!1,reload:s=!0,configPath:u,daemonUrl:c}=e,o=P(u);if(!b(o))return{success:!1,path:o,error:`Config not found at ${o}. Run \`agentx init\` first.`};let d;try{d=S(o,"utf-8")}catch(a){return{success:!1,path:o,error:`Cannot read ${o}: ${a.message}`}}let g;try{g=JSON.parse(d)}catch(a){return{success:!1,path:o,error:`Invalid JSON in ${o}: ${a.message}`}}let i=w(g);try{await r(i)}catch(a){return{success:!1,path:o,error:`Mutator threw: ${a.message}`}}if(n){let a=$(i),l=m.safeParse(a);if(!l.success){let k=l.error.issues.map(y=>` ${y.path.join(".")||"<root>"}: ${y.message}`).join(`
1
+ import{c as m,d as $}from"./chunk-CO4YCIIA.js";import{readFileSync as S,writeFileSync as x,existsSync as b}from"fs";import{resolve as f}from"path";function P(r){if(r)return f(r);let e=[f(process.cwd(),"agentx.json"),f(process.cwd(),".agentx/config.json")];for(let n of e)if(b(n))return n;return e[0]}function w(r){return JSON.parse(JSON.stringify(r))}async function v(r){try{let e=await fetch(`${r.replace(/\/$/,"")}/reload`,{method:"POST",signal:AbortSignal.timeout(3e3)});return e.ok?{ok:!0}:{ok:!1,reason:`HTTP ${e.status}`}}catch(e){return{ok:!1,reason:e?.cause?.code||e?.message||"unreachable"}}}async function T(r,e={}){let{validate:n=!0,dryRun:t=!1,reload:s=!0,configPath:u,daemonUrl:c}=e,o=P(u);if(!b(o))return{success:!1,path:o,error:`Config not found at ${o}. Run \`agentx init\` first.`};let d;try{d=S(o,"utf-8")}catch(a){return{success:!1,path:o,error:`Cannot read ${o}: ${a.message}`}}let g;try{g=JSON.parse(d)}catch(a){return{success:!1,path:o,error:`Invalid JSON in ${o}: ${a.message}`}}let i=w(g);try{await r(i)}catch(a){return{success:!1,path:o,error:`Mutator threw: ${a.message}`}}if(n){let a=$(i),l=m.safeParse(a);if(!l.success){let k=l.error.issues.map(y=>` ${y.path.join(".")||"<root>"}: ${y.message}`).join(`
2
2
  `);return{success:!1,path:o,error:`Validation failed:
3
3
  ${k}`,after:i}}}if(t)return{success:!0,path:o,after:i,dryRun:!0};try{x(o,JSON.stringify(i,null,2)+`
4
4
  `)}catch(a){return{success:!1,path:o,error:`Write failed: ${a.message}`,after:i}}let p=!1,h;if(s){let a=c||O(i),l=await v(a);l.ok?p=!0:h=l.reason}return{success:!0,path:o,after:i,reloaded:p,reloadSkipped:h}}function O(r){let e=r?.node?.bind;if(!e)return"http://127.0.0.1:18800";let[n,t]=e.split(":");return`http://${n==="0.0.0.0"||n==="::"?"127.0.0.1":n}:${t}`}function J(r,e,n){let t=e.split("."),s=r;for(let u=0;u<t.length-1;u++){let c=t[u];(s[c]===void 0||s[c]===null)&&(s[c]={}),s=s[c]}s[t[t.length-1]]=n}function N(r,e){let n=e.split("."),t=r;for(let s of n){if(t==null)return;t=t[s]}return t}function j(r,e){let n=e.split("."),t=r;for(let s=0;s<n.length-1;s++){if(t==null)return;t=t[n[s]]}t!=null&&delete t[n[n.length-1]]}export{T as a,J as b,N as c,j as d};
5
- //# sourceMappingURL=chunk-AANSVC5A.js.map
5
+ //# sourceMappingURL=chunk-P3TJHGO5.js.map
@@ -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
  ${l}`,is_error:!0}:{tool_use_id:e.id,content:l||"(no output)"}}async editFile(e){let t=String(e.input.path||""),o=e.input.edits,n=pe.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 N.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(d.has("pre:file-write")){let a=await d.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 ee.readFile(n,"utf8"),l=[];for(let a of o)i.includes(a.old_text)?(i=i.replace(a.old_text,a.new_text),l.push(`Replaced: "${a.old_text.slice(0,40)}..."`)):l.push(`Not found: "${a.old_text.slice(0,40)}..."`);return this.options.dryRun||await ee.writeFile(n,i,"utf8"),d.has("post:file-write")&&await d.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
  ${l.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-WV7QKQ3L.js"),{getGlobalRegistry:i}=await import("./registry-EGKDMVSP.js"),l=i();if(!l)return{tool_use_id:e.id,content:"Sub-agent spawning requires the daemon to be running.",is_error:!0};let p=await new s(l).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-WV7QKQ3L.js"),{getGlobalRegistry:i}=await import("./registry-QZIUSQ5J.js"),l=i();if(!l)return{tool_use_id:e.id,content:"Sub-agent spawning requires the daemon to be running.",is_error:!0};let p=await new s(l).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 Re(r){let{provider:e,systemPrompt:t,messages:o,providerOptions:n,cwd:s,maxIterations:i=20,enabledTools:l,interactive:a=!0,overwrite:p=!1,dryRun:c=!1,onProgress:u}=r;if(!e.generateRaw)return et(r);let y=new te(s,{interactive:a,overwrite:p,dryRun:c}),k=he(l),A=o.filter(v=>v.role!=="system").map(v=>({role:v.role,content:v.content})),F=[],C=0,T="",I,O=0;for(;O<i;){O++,u?.({type:"iteration_start",iteration:O}),x.step(O,`Agentic loop iteration (${k.length} tools available)`);let v;try{v=await e.generateRaw(A,t,k,n)}catch(w){if(w.message?.includes("not available"))return et(r);throw w}C+=v.usage.input_tokens+v.usage.output_tokens;for(let w of v.content)w.type==="text"&&(T+=w.text,u?.({type:"text_delta",text:w.text}));if(v.stop_reason==="end_turn"||v.stop_reason==="max_tokens")break;if(v.stop_reason==="tool_use"){let w=v.content.filter(_=>_.type==="tool_use");if(w.length===0)break;A.push({role:"assistant",content:v.content});let E=[];for(let _ of w){u?.({type:"tool_call",name:_.name,id:_.id,input:_.input}),x.step(O,`Tool call: ${_.name}`);let b=await y.execute({name:_.name,id:_.id,input:_.input});u?.({type:"tool_result",name:_.name,id:_.id,content:b.content.slice(0,200),is_error:b.is_error}),b.files?.length&&(F.push(...b.files),u?.({type:"files_created",files:b.files})),b.followUp&&(I=b.followUp),E.push({type:"tool_result",tool_use_id:b.tool_use_id,content:b.content,is_error:b.is_error})}if(A.push({role:"user",content:E}),I)break;continue}break}return u?.({type:"complete",iterations:O,totalTokens:C}),{files:F,content:T,followUp:I,tokensUsed:C,iterations:O}}async function et(r){let{provider:e,systemPrompt:t,messages:o,providerOptions:n,maxIterations:s=5}=r,l=[{role:"system",content:t+`
@@ -115,4 +115,4 @@ ${r.projectInstructions}`),r.memoryContext&&o.push(r.memoryContext),o.push(`# Ou
115
115
  Generate output appropriate for: ${e}. Use the \`create_files\` tool to output all files.`),o.join(`
116
116
 
117
117
  `)}export{je as a,$t as b,Mt as c,Ue as d,De as e,Ne as f,Le as g,_e as h,V as i,Se as j,re as k,Q as l,ut as m,X as n,ht as o,d as p,ze as q,Ke as r,Pe as s,ie as t,N as u,Z as v,Xe as w,Te as x,Ce as y,te as z,tt as A,Cn as B,Tn as C};
118
- //# sourceMappingURL=chunk-AGINLNAW.js.map
118
+ //# sourceMappingURL=chunk-VYLZ7UYM.js.map
@@ -1,4 +1,4 @@
1
- import{a as K,b as X,c as D,d as I,e as M,f as W}from"./chunk-CNNLREHD.js";import{e as B}from"./chunk-5GDCJ2SF.js";import{f as J}from"./chunk-7P5QRX5W.js";import{existsSync as _,readFileSync as ae,writeFileSync as ne,appendFileSync as ve,mkdirSync as xe}from"fs";import{resolve as R}from"path";import{hostname as be}from"os";import{spawn as ye}from"child_process";import{existsSync as G,readFileSync as Y,writeFileSync as j,copyFileSync as me}from"fs";import{resolve as V}from"path";function Q(t,e={}){let n=e.configPath||V(process.cwd(),"agentx.json");if(!G(n))throw new Error(`agentx.json not found at ${n}`);let a=JSON.parse(Y(n,"utf-8")),r=t(a),s=typeof r=="string"?{summary:r}:r,o=JSON.stringify(a,null,2)+`
1
+ import{a as K,b as X,c as D,d as I,e as M,f as W}from"./chunk-CNNLREHD.js";import{e as B}from"./chunk-CO4YCIIA.js";import{f as J}from"./chunk-7P5QRX5W.js";import{existsSync as _,readFileSync as ae,writeFileSync as ne,appendFileSync as ve,mkdirSync as xe}from"fs";import{resolve as R}from"path";import{hostname as be}from"os";import{spawn as ye}from"child_process";import{existsSync as G,readFileSync as Y,writeFileSync as j,copyFileSync as me}from"fs";import{resolve as V}from"path";function Q(t,e={}){let n=e.configPath||V(process.cwd(),"agentx.json");if(!G(n))throw new Error(`agentx.json not found at ${n}`);let a=JSON.parse(Y(n,"utf-8")),r=t(a),s=typeof r=="string"?{summary:r}:r,o=JSON.stringify(a,null,2)+`
2
2
  `,p=n+".tmp";j(p,o,"utf-8");try{JSON.parse(Y(p,"utf-8"))}catch(d){throw new Error(`config did not round-trip cleanly: ${d.message}`)}let i;return e.skipBackup||(i=`${n}.bak.${Date.now()}`,me(n,i)),j(n,o,"utf-8"),e.skipReload||he().catch(()=>{}),{summary:s.summary,payload:s.payload,backupPath:i}}function Z(t,e={}){let n=e.configPath||V(process.cwd(),"agentx.json");if(G(n)&&!e.overwrite)throw new Error(`agentx.json already exists at ${n}. Pass overwrite=true to replace it.`);return j(n,JSON.stringify(t,null,2)+`
3
3
  `,"utf-8"),{file:n}}async function he(){try{let e=B().dashboard.daemonUrl?.replace(/\/+$/,"")||"http://127.0.0.1:18800";await fetch(`${e}/reload`,{method:"POST"}).catch(()=>null)}catch{}}function ee(t,e){let n=t.configExists?t.agentCount===0?"Add your first agent":"Add another agent":"Set up your team",a=`<header class="ax-topbar">
4
4
  <div class="ax-topbar__left">
@@ -740,4 +740,4 @@ tr:hover td { background: var(--bg-hover); }
740
740
  <div class="meta-line">${U((d.meta.tags||[]).slice(0,6),e)}</div>
741
741
  <h3><a href="${p}/article/${encodeURIComponent(d.path)}">${l(d.meta.title)}</a></h3>
742
742
  </div>`;return $(`${e} \xB7 ${n}`,C(r),i)}function P(t,e,n){let a=t.rebuildIndex(),r=L(a.articles.map(o=>({title:o.title,path:o.path,tags:o.tags}))),s='<div class="nav-section">';s+=`<div class="nav-section-title">${l(e)}</div>`,s+=`<a class="nav-item${n?"":" active"}" href="/">Home</a>`,s+='<a class="nav-item" href="/lint">Health check</a>',s+="</div>";for(let[o,p]of r){s+='<div class="nav-section">',s+=`<div class="nav-section-title">${q(o)}</div>`;for(let i of p){let d=i.path===n;s+=`<a class="nav-item${d?" active":""}" href="/article/${encodeURIComponent(i.path)}">${l(i.title)}</a>`}s+="</div>"}return s}function Je(t){let{wikiDir:e,agentFilter:n,peerUrls:a=[],mode:r="graph",pathPrefix:s=""}=t,o=s.replace(/\/+$/,""),p=new J(e,void 0,r),i=a.length>0?new H(a):null;return async(d,g)=>{let x=new URL(d.url||"/","http://localhost"),c=decodeURIComponent(x.pathname),u=o&&c.startsWith(o)?c.slice(o.length)||"/":c,f=null,z=200;try{if(u.startsWith("/remote/")&&i){let y=u.slice(8).split("/article/");if(y.length===2){let[b,v]=y,m=b.indexOf("/"),k=decodeURIComponent(b.slice(0,m)),h=b.slice(m+1),w=await i.getRemoteArticle(k,h,v);if(w){let E=await i.getRemoteAgents(),N=[...p.summary(),...E.map(S=>({...S,agentId:`${S.agentId} @${S.nodeId}`}))],A=`<div class="breadcrumb"><a href="/">Hub</a> / <span class="tag">remote</span> ${l(h)} @ ${l(k)}</div>`;A+=`<h1>${l(w.meta.title)}</h1>`,A+='<dl class="meta">',A+=`<dt>Tags</dt><dd>${(w.meta.tags||[]).map(S=>`<span class="tag">${S}</span>`).join(" ")}</dd>`,A+=`<dt>Owner</dt><dd>${l(w.meta.owner)}</dd>`,A+=`<dt>Source</dt><dd><span class="tag">remote</span> ${l(k)}</dd>`,A+=`<dt>Updated</dt><dd>${w.meta.lastUpdated}</dd>`,A+="</dl>";let T=new Map;A+=O(w.content,T),f=$(w.meta.title,C(N),A)}}}if(!f&&n){let y=p.getAgentWiki(n);if(u==="/"||u===""){let b=y.rebuildIndex(),v=p.getAgentEntries(n),m=`<h1>${l(n)}</h1>`;if(m+='<div class="stats">',m+=`<div class="stat-card"><div class="number">${b.articles.length}</div><div class="label">Articles</div></div>`,m+=`<div class="stat-card"><div class="number">${v.length}</div><div class="label">Entries</div></div>`,m+="</div>",b.articles.length>0){m+="<h2>Articles</h2><table><tr><th>Title</th><th>Type</th><th>Updated</th></tr>";for(let k of b.articles)m+=`<tr><td><a href="/article/${encodeURIComponent(k.path)}">${l(k.title)}</a></td><td><span class="tag">${(k.tags||[]).slice(0,3).join(", ")}</span></td><td>${k.lastUpdated||""}</td></tr>`;m+="</table>"}f=$(n,P(y,n),m)}else if(u.startsWith("/article/")){let b=u.slice(9),v=y.readArticle(b);if(v){let m=y.rebuildIndex(),k=new Map;for(let w of m.articles)k.set(w.title,w.path);let h=`<h1>${l(v.meta.title)}</h1>`;h+='<dl class="meta">',h+=`<dt>Tags</dt><dd>${(v.meta.tags||[]).map(w=>`<span class="tag">${w}</span>`).join(" ")}</dd>`,h+=`<dt>Updated</dt><dd>${v.meta.lastUpdated}</dd>`,v.meta.sources?.length&&(h+=`<dt>Sources</dt><dd>${v.meta.sources.length} entries</dd>`),h+="</dl>",h+=O(v.content,k),f=$(v.meta.title,P(y,n,b),h)}}else if(u==="/lint"){let b=y.lint(),v="<h1>Health Check</h1>";if(b.length===0)v+='<p style="color:green;">No issues.</p>';else{v+="<table><tr><th>Type</th><th>Article</th><th>Issue</th></tr>";for(let m of b)v+=`<tr><td><span class="tag">${m.type}</span></td><td>${l(m.article)}</td><td>${l(m.message)}</td></tr>`;v+="</table>"}f=$("Health Check",P(y,n),v)}else if(u==="/search"){let b=x.searchParams.get("q")||"",v=y.findRelevant(b,void 0,20),m=`<h1>Search: "${l(b)}"</h1>`;for(let k of v)m+=`<div class="entry-card"><h3><a href="/article/${encodeURIComponent(k.path)}">${l(k.meta.title)}</a></h3><p>${l(k.content.slice(0,200))}...</p></div>`;v.length===0&&(m+="<p>No results.</p>"),f=$(`Search: ${b}`,P(y,n),m)}else if(u.startsWith("/tag/")){let b=decodeURIComponent(u.slice(5)),v=y.findByTags([b],void 0,100),m=`<h1>Tag: <a class="tag" href="#">${l(b)}</a></h1>`;m+=`<p>${v.length} article${v.length===1?"":"s"} tagged <code>${l(b)}</code></p>`;for(let k of v)m+=`<div class="entry-card"><h3><a href="/article/${encodeURIComponent(k.path)}">${l(k.meta.title)}</a></h3><div class="meta-line">${U((k.meta.tags||[]).slice(0,6))}</div></div>`;v.length===0&&(m+="<p>No articles with this tag.</p>"),f=$(`Tag: ${b}`,P(y,n),m)}}else{let y=i?await i.getRemoteAgents():[],b=p.summary(),v=new Map(b.map(h=>[h.agentId,h])),m=[],k=new Set;for(let h of b){let w=y.find(E=>E.agentId===h.agentId);w&&w.totalArticles>h.totalArticles?m.push({...w,totalEntries:Math.max(h.totalEntries,w.totalEntries),unabsorbed:Math.max(h.unabsorbed,w.unabsorbed)}):m.push(h),k.add(h.agentId)}for(let h of y)k.has(h.agentId)||(m.push(h),k.add(h.agentId));if(u==="/"||u==="")f=Oe(p,m,y);else if(u==="/entries")f=je(p,m);else if(u==="/search")f=Fe(p,x.searchParams.get("q")||"",m);else if(u.startsWith("/tag/"))f=Le(p,decodeURIComponent(u.slice(5)),m);else if(u.match(/^\/agent\/[^/]+\/tag\/.+/)){let h=u.match(/^\/agent\/([^/]+)\/tag\/(.+)$/);f=qe(p,decodeURIComponent(h[1]),decodeURIComponent(h[2]),m)}else if(u.startsWith("/agent/")){let h=u.slice(7),w=h.indexOf("/article/");if(w===-1)f=De(p,h,m);else{let E=h.slice(0,w),N=h.slice(w+9);if(f=Me(p,E,N,m),!f&&i){let A=y.find(T=>T.agentId===E);if(A){let T=await i.getRemoteArticle(A.peerUrl,E,N);if(T){let S=`<div class="breadcrumb"><a href="/">Hub</a> / <span class="tag">remote @ ${l(A.nodeId)}</span> / ${l(E)}</div>`;S+=`<h1>${l(T.meta.title)}</h1>`,S+='<dl class="meta">',S+=`<dt>Tags</dt><dd>${(T.meta.tags||[]).map(ge=>`<span class="tag">${ge}</span>`).join(" ")}</dd>`,S+=`<dt>Source</dt><dd><span class="tag">remote</span> ${l(A.nodeId)}</dd>`,S+=`<dt>Updated</dt><dd>${T.meta.lastUpdated}</dd>`,S+="</dl>",S+=O(T.content,new Map),f=$(T.meta.title,C(m),S)}}}}}}if(!f){z=404;let y=n?P(p.getAgentWiki(n),n):C(p.summary());f=$("Not Found",y,"<h1>Page not found</h1>")}}catch(y){z=500,f=$("Error","",`<h1>Error</h1><pre>${l(y.message)}</pre>`)}g.writeHead(z,{"Content-Type":"text/html; charset=utf-8"}),g.end(o?Ke(f,o):f)}}function Ke(t,e){t=t.replace(/(\s(?:href|action)=")\/(?!\/)/g,`$1${e}/`),t=t.replace(new RegExp(`(${e})${e}/`,"g"),`${e}/`);let n=`<a href="/admin" style="position:fixed;top:10px;right:14px;z-index:9999;padding:5px 11px;background:rgba(0,0,0,0.55);color:#fff;font:12px/1.2 'IBM Plex Sans',system-ui,sans-serif;text-decoration:none;border-radius:6px;border:1px solid rgba(255,255,255,0.18);backdrop-filter:blur(6px)">\u2190 Dashboard</a>`;return t=t.replace(/<body([^>]*)>/,`<body$1>${n}`),t}function kt(t,e=4200,n,a=[],r="graph"){let s=Je({wikiDir:t,agentFilter:n,peerUrls:a,mode:r});We((p,i)=>{s(p,i)}).listen(e)}export{Q as a,re as b,ot as c,lt as d,ct as e,ce as f,ht as g,ut as h,Je as i,kt as j};
743
- //# sourceMappingURL=chunk-2B2DIQKD.js.map
743
+ //# sourceMappingURL=chunk-WHP4I44J.js.map