agentix-cli 0.71.0 → 0.72.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 (115) hide show
  1. package/dist/{App-PRD5JNO4.js → App-244WEQJR.js} +2 -2
  2. package/dist/{ChatApp-BKS6OJ3L.js → ChatApp-SFP6SHUU.js} +2 -2
  3. package/dist/{agent-QF2JQ72Z.js → agent-PMNBXRFW.js} +2 -2
  4. package/dist/{board-dashboard-AROMOAKS.js → board-dashboard-J34PSEJS.js} +491 -217
  5. package/dist/board-dashboard-J34PSEJS.js.map +1 -0
  6. package/dist/{chunk-MT3BD6WG.js → chunk-335JCO5R.js} +165 -162
  7. package/dist/chunk-335JCO5R.js.map +1 -0
  8. package/dist/{chunk-WLX4766Y.js → chunk-55N4VTWX.js} +2 -2
  9. package/dist/{chunk-SELIVR6U.js → chunk-576L7ZFD.js} +2 -2
  10. package/dist/{chunk-BO4WLXXC.js → chunk-7XR5LGLD.js} +2 -2
  11. package/dist/{chunk-5Y7QRFSL.js → chunk-DMWFRKWR.js} +2 -2
  12. package/dist/{chunk-SFWA67GQ.js → chunk-FMUOVVXX.js} +2 -2
  13. package/dist/chunk-FWQVXZ5T.js +154 -0
  14. package/dist/chunk-FWQVXZ5T.js.map +1 -0
  15. package/dist/{chunk-D233M73Q.js → chunk-J6RZOP7Z.js} +2 -2
  16. package/dist/{chunk-XJQNIFZ4.js → chunk-MESWF2ZM.js} +2 -2
  17. package/dist/chunk-MYVHVJWZ.js +2 -0
  18. package/dist/chunk-MYVHVJWZ.js.map +1 -0
  19. package/dist/{chunk-OTMDMGHE.js → chunk-OSHG52OO.js} +65 -65
  20. package/dist/chunk-OSHG52OO.js.map +1 -0
  21. package/dist/{chunk-3C2SQDIH.js → chunk-OWRPCMGW.js} +199 -184
  22. package/dist/chunk-OWRPCMGW.js.map +1 -0
  23. package/dist/{chunk-6LTD7XL5.js → chunk-PBRI3MTE.js} +2 -2
  24. package/dist/{chunk-IK2XG65P.js → chunk-PC5LKW3L.js} +2 -2
  25. package/dist/{chunk-EMRQ6W5J.js → chunk-PHSYP22H.js} +2 -2
  26. package/dist/{chunk-4XBYHKYG.js → chunk-PY54XYAG.js} +2 -2
  27. package/dist/{chunk-RCKICCTT.js → chunk-QKV7FN67.js} +2 -2
  28. package/dist/{chunk-AHOGFVHA.js → chunk-RAYOK4GI.js} +8 -8
  29. package/dist/chunk-RAYOK4GI.js.map +1 -0
  30. package/dist/{chunk-AAA6NGY5.js → chunk-TT4T6CB3.js} +2 -2
  31. package/dist/{chunk-K6CHA6JJ.js → chunk-UFPWMNUW.js} +2 -2
  32. package/dist/{chunk-JBVABB26.js → chunk-VWMO4C72.js} +2 -2
  33. package/dist/{chunk-DJMUP6TK.js → chunk-YVLFX35J.js} +2 -2
  34. package/dist/{chunk-HXW4NAWF.js → chunk-Z5TXWHDN.js} +2 -2
  35. package/dist/cli.js +1 -1
  36. package/dist/cli.js.map +1 -1
  37. package/dist/client-L4JAPXTE.js +2 -0
  38. package/dist/{config-UY5K6SCL.js → config-X7BHZ75G.js} +2 -2
  39. package/dist/config-mutator-R2KBGTZJ.js +2 -0
  40. package/dist/doctor-5VFQVAVC.js +2 -0
  41. package/dist/index.d.ts +96 -11
  42. package/dist/index.js +1 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/opencode-launch-ECMEY2QZ.js +2 -0
  45. package/dist/opencode-launch-ECMEY2QZ.js.map +1 -0
  46. package/dist/opencode-process-ENS4MXHM.js +2 -0
  47. package/dist/program-6C3G65YA.js +2 -0
  48. package/dist/{promote-YLKNYYIU.js → promote-36XF4LH7.js} +2 -2
  49. package/dist/{query-CVRXEG43.js → query-YFZ6GWHU.js} +2 -2
  50. package/dist/registry-WJSGG62F.js +2 -0
  51. package/dist/{request-planner-76NCBYBW.js → request-planner-OXRWVBXI.js} +2 -2
  52. package/dist/{review-candidates-ZUXMX6BJ.js → review-candidates-5XZWP2BN.js} +2 -2
  53. package/dist/{routing-EIGWDKH7.js → routing-XEPCPLVM.js} +2 -2
  54. package/dist/schedule-tool-WQCO2YUG.js +2 -0
  55. package/dist/scheduler-4NQ62XDK.js +2 -0
  56. package/dist/{seat-QOY6FA4N.js → seat-FGFHW363.js} +2 -2
  57. package/dist/{select-JHKHO5BO.js → select-N6CIZF2S.js} +2 -2
  58. package/dist/{set-enabled-DVJIUOKX.js → set-enabled-L7Z6H7EG.js} +2 -2
  59. package/dist/{tool-WKSLNQ6H.js → tool-OSH6GHIF.js} +2 -2
  60. package/dist/wiki-E46QDRS7.js +2 -0
  61. package/dist/wiki-E46QDRS7.js.map +1 -0
  62. package/package.json +1 -1
  63. package/dist/board-dashboard-AROMOAKS.js.map +0 -1
  64. package/dist/chunk-3C2SQDIH.js.map +0 -1
  65. package/dist/chunk-AHOGFVHA.js.map +0 -1
  66. package/dist/chunk-JU67IZLC.js +0 -131
  67. package/dist/chunk-JU67IZLC.js.map +0 -1
  68. package/dist/chunk-MT3BD6WG.js.map +0 -1
  69. package/dist/chunk-OTMDMGHE.js.map +0 -1
  70. package/dist/client-UPBQVXYM.js +0 -2
  71. package/dist/config-mutator-7KOSRAQF.js +0 -2
  72. package/dist/doctor-GFPSIJGB.js +0 -2
  73. package/dist/program-XMGZOYX3.js +0 -2
  74. package/dist/registry-HZL363TA.js +0 -2
  75. package/dist/schedule-tool-PSZMP7C4.js +0 -2
  76. package/dist/scheduler-S24PXNB6.js +0 -2
  77. package/dist/wiki-PTXUMSIR.js +0 -2
  78. /package/dist/{App-PRD5JNO4.js.map → App-244WEQJR.js.map} +0 -0
  79. /package/dist/{ChatApp-BKS6OJ3L.js.map → ChatApp-SFP6SHUU.js.map} +0 -0
  80. /package/dist/{agent-QF2JQ72Z.js.map → agent-PMNBXRFW.js.map} +0 -0
  81. /package/dist/{chunk-WLX4766Y.js.map → chunk-55N4VTWX.js.map} +0 -0
  82. /package/dist/{chunk-SELIVR6U.js.map → chunk-576L7ZFD.js.map} +0 -0
  83. /package/dist/{chunk-BO4WLXXC.js.map → chunk-7XR5LGLD.js.map} +0 -0
  84. /package/dist/{chunk-5Y7QRFSL.js.map → chunk-DMWFRKWR.js.map} +0 -0
  85. /package/dist/{chunk-SFWA67GQ.js.map → chunk-FMUOVVXX.js.map} +0 -0
  86. /package/dist/{chunk-D233M73Q.js.map → chunk-J6RZOP7Z.js.map} +0 -0
  87. /package/dist/{chunk-XJQNIFZ4.js.map → chunk-MESWF2ZM.js.map} +0 -0
  88. /package/dist/{chunk-6LTD7XL5.js.map → chunk-PBRI3MTE.js.map} +0 -0
  89. /package/dist/{chunk-IK2XG65P.js.map → chunk-PC5LKW3L.js.map} +0 -0
  90. /package/dist/{chunk-EMRQ6W5J.js.map → chunk-PHSYP22H.js.map} +0 -0
  91. /package/dist/{chunk-4XBYHKYG.js.map → chunk-PY54XYAG.js.map} +0 -0
  92. /package/dist/{chunk-RCKICCTT.js.map → chunk-QKV7FN67.js.map} +0 -0
  93. /package/dist/{chunk-AAA6NGY5.js.map → chunk-TT4T6CB3.js.map} +0 -0
  94. /package/dist/{chunk-K6CHA6JJ.js.map → chunk-UFPWMNUW.js.map} +0 -0
  95. /package/dist/{chunk-JBVABB26.js.map → chunk-VWMO4C72.js.map} +0 -0
  96. /package/dist/{chunk-DJMUP6TK.js.map → chunk-YVLFX35J.js.map} +0 -0
  97. /package/dist/{chunk-HXW4NAWF.js.map → chunk-Z5TXWHDN.js.map} +0 -0
  98. /package/dist/{client-UPBQVXYM.js.map → client-L4JAPXTE.js.map} +0 -0
  99. /package/dist/{config-UY5K6SCL.js.map → config-X7BHZ75G.js.map} +0 -0
  100. /package/dist/{config-mutator-7KOSRAQF.js.map → config-mutator-R2KBGTZJ.js.map} +0 -0
  101. /package/dist/{doctor-GFPSIJGB.js.map → doctor-5VFQVAVC.js.map} +0 -0
  102. /package/dist/{program-XMGZOYX3.js.map → opencode-process-ENS4MXHM.js.map} +0 -0
  103. /package/dist/{promote-YLKNYYIU.js.map → program-6C3G65YA.js.map} +0 -0
  104. /package/dist/{query-CVRXEG43.js.map → promote-36XF4LH7.js.map} +0 -0
  105. /package/dist/{registry-HZL363TA.js.map → query-YFZ6GWHU.js.map} +0 -0
  106. /package/dist/{routing-EIGWDKH7.js.map → registry-WJSGG62F.js.map} +0 -0
  107. /package/dist/{request-planner-76NCBYBW.js.map → request-planner-OXRWVBXI.js.map} +0 -0
  108. /package/dist/{review-candidates-ZUXMX6BJ.js.map → review-candidates-5XZWP2BN.js.map} +0 -0
  109. /package/dist/{schedule-tool-PSZMP7C4.js.map → routing-XEPCPLVM.js.map} +0 -0
  110. /package/dist/{scheduler-S24PXNB6.js.map → schedule-tool-WQCO2YUG.js.map} +0 -0
  111. /package/dist/{seat-QOY6FA4N.js.map → scheduler-4NQ62XDK.js.map} +0 -0
  112. /package/dist/{wiki-PTXUMSIR.js.map → seat-FGFHW363.js.map} +0 -0
  113. /package/dist/{select-JHKHO5BO.js.map → select-N6CIZF2S.js.map} +0 -0
  114. /package/dist/{set-enabled-DVJIUOKX.js.map → set-enabled-L7Z6H7EG.js.map} +0 -0
  115. /package/dist/{tool-WKSLNQ6H.js.map → tool-OSH6GHIF.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import{c as ee,d as te,e as ne,f as F,g as C,h as j,i as B}from"./chunk-C4CDVE2E.js";import{a as Q,b as Z}from"./chunk-WLX4766Y.js";import{a as V}from"./chunk-RCKICCTT.js";import{A as M,u as O,w as G,x as _}from"./chunk-AHOGFVHA.js";import{existsSync as W,readFileSync as ce,writeFileSync as pe,appendFileSync as Ae,mkdirSync as Se}from"fs";import{dirname as Ce,resolve as P}from"path";import{fileURLToPath as Ie}from"url";import{hostname as Ee}from"os";import{spawn as Te}from"child_process";M();import{existsSync as re,readFileSync as ae,writeFileSync as L,copyFileSync as ye}from"fs";import{resolve as ie}from"path";function oe(e,t={}){let n=t.configPath||ie(process.cwd(),"agentx.json");if(!re(n))throw new Error(`agentx.json not found at ${n}`);let a=JSON.parse(ae(n,"utf-8")),r=e(a),i=typeof r=="string"?{summary:r}:r,c=JSON.stringify(a,null,2)+`
1
+ import{c as ee,d as te,e as ne,f as F,g as C,h as j,i as B}from"./chunk-C4CDVE2E.js";import{a as Q,b as Z}from"./chunk-55N4VTWX.js";import{a as V}from"./chunk-QKV7FN67.js";import{A as M,u as O,w as G,x as _}from"./chunk-RAYOK4GI.js";import{existsSync as W,readFileSync as ce,writeFileSync as pe,appendFileSync as Ae,mkdirSync as Se}from"fs";import{dirname as Ce,resolve as P}from"path";import{fileURLToPath as Ie}from"url";import{hostname as Ee}from"os";import{spawn as Te}from"child_process";M();import{existsSync as re,readFileSync as ae,writeFileSync as L,copyFileSync as ye}from"fs";import{resolve as ie}from"path";function oe(e,t={}){let n=t.configPath||ie(process.cwd(),"agentx.json");if(!re(n))throw new Error(`agentx.json not found at ${n}`);let a=JSON.parse(ae(n,"utf-8")),r=e(a),i=typeof r=="string"?{summary:r}:r,c=JSON.stringify(a,null,2)+`
2
2
  `,l=n+".tmp";L(l,c,"utf-8");try{JSON.parse(ae(l,"utf-8"))}catch(d){throw new Error(`config did not round-trip cleanly: ${d.message}`)}let o;return t.skipBackup||(o=`${n}.bak.${Date.now()}`,ye(n,o)),L(n,c,"utf-8"),t.skipReload||ke().catch(()=>{}),{summary:i.summary,payload:i.payload,backupPath:o}}function se(e,t={}){let n=t.configPath||ie(process.cwd(),"agentx.json");if(re(n)&&!t.overwrite)throw new Error(`agentx.json already exists at ${n}. Pass overwrite=true to replace it.`);return L(n,JSON.stringify(e,null,2)+`
3
3
  `,"utf-8"),{file:n}}async function ke(){try{let t=_().dashboard.daemonUrl?.replace(/\/+$/,"")||"http://127.0.0.1:18800";await fetch(`${t}/reload`,{method:"POST"}).catch(()=>null)}catch{}}function le(e,t){let n=e.configExists?e.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">
@@ -737,4 +737,4 @@ tr:hover td { background: var(--bg-hover); }
737
737
  <h3><a href="${l}/article/${encodeURIComponent(d.path)}">${s(d.meta.title)}</a></h3>
738
738
  </div>`;return $(`${t} \xB7 ${n}`,I(r),o)}function U(e,t,n){let a=e.rebuildIndex(),r=J(a.articles.map(c=>({title:c.title,path:c.path,tags:c.tags}))),i='<div class="nav-section">';i+=`<div class="nav-section-title">${s(t)}</div>`,i+=`<a class="nav-item${n?"":" active"}" href="/">Home</a>`,i+='<a class="nav-item" href="/lint">Health check</a>',i+="</div>";for(let[c,l]of r){i+='<div class="nav-section">',i+=`<div class="nav-section-title">${q(c)}</div>`;for(let o of l){let d=o.path===n;i+=`<a class="nav-item${d?" active":""}" href="/article/${encodeURIComponent(o.path)}">${s(o.title)}</a>`}i+="</div>"}return i}function Ye(e){let{wikiDir:t,agentFilter:n,peerUrls:a=[],mode:r="graph",pathPrefix:i=""}=e,c=i.replace(/\/+$/,""),l=new V(t,void 0,r),o=a.length>0?new H(a):null;return async(d,g)=>{let x=new URL(d.url||"/","http://localhost"),p=decodeURIComponent(x.pathname),f=c&&p.startsWith(c)?p.slice(c.length)||"/":p,h=null,T=200;try{if(f.startsWith("/remote/")&&o){let y=f.slice(8).split("/article/");if(y.length===2){let[b,v]=y,m=b.indexOf("/"),k=decodeURIComponent(b.slice(0,m)),u=b.slice(m+1),w=await o.getRemoteArticle(k,u,v);if(w){let z=await o.getRemoteAgents(),N=[...l.summary(),...z.map(S=>({...S,agentId:`${S.agentId} @${S.nodeId}`}))],A=`<div class="breadcrumb"><a href="/">Hub</a> / <span class="tag">remote</span> ${s(u)} @ ${s(k)}</div>`;A+=`<h1>${s(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>${s(w.meta.owner)}</dd>`,A+=`<dt>Source</dt><dd><span class="tag">remote</span> ${s(k)}</dd>`,A+=`<dt>Updated</dt><dd>${w.meta.lastUpdated}</dd>`,A+="</dl>";let E=new Map;A+=D(w.content,E),h=$(w.meta.title,I(N),A)}}}if(!h&&n){let y=l.getAgentWiki(n);if(f==="/"||f===""){let b=y.rebuildIndex(),v=l.getAgentEntries(n),m=`<h1>${s(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)}">${s(k.title)}</a></td><td><span class="tag">${(k.tags||[]).slice(0,3).join(", ")}</span></td><td>${k.lastUpdated||""}</td></tr>`;m+="</table>"}h=$(n,U(y,n),m)}else if(f.startsWith("/article/")){let b=f.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 u=`<h1>${s(v.meta.title)}</h1>`;u+='<dl class="meta">',u+=`<dt>Tags</dt><dd>${(v.meta.tags||[]).map(w=>`<span class="tag">${w}</span>`).join(" ")}</dd>`,u+=`<dt>Updated</dt><dd>${v.meta.lastUpdated}</dd>`,v.meta.sources?.length&&(u+=`<dt>Sources</dt><dd>${v.meta.sources.length} entries</dd>`),u+="</dl>",u+=D(v.content,k),h=$(v.meta.title,U(y,n,b),u)}}else if(f==="/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>${s(m.article)}</td><td>${s(m.message)}</td></tr>`;v+="</table>"}h=$("Health Check",U(y,n),v)}else if(f==="/search"){let b=x.searchParams.get("q")||"",v=await y.findRelevantReranked(b,void 0,20),m=`<h1>Search: "${s(b)}"</h1>`;for(let k of v)m+=`<div class="entry-card"><h3><a href="/article/${encodeURIComponent(k.path)}">${s(k.meta.title)}</a></h3><p>${s(k.content.slice(0,200))}...</p></div>`;v.length===0&&(m+="<p>No results.</p>"),h=$(`Search: ${b}`,U(y,n),m)}else if(f.startsWith("/tag/")){let b=decodeURIComponent(f.slice(5)),v=y.findByTags([b],void 0,100),m=`<h1>Tag: <a class="tag" href="#">${s(b)}</a></h1>`;m+=`<p>${v.length} article${v.length===1?"":"s"} tagged <code>${s(b)}</code></p>`;for(let k of v)m+=`<div class="entry-card"><h3><a href="/article/${encodeURIComponent(k.path)}">${s(k.meta.title)}</a></h3><div class="meta-line">${R((k.meta.tags||[]).slice(0,6))}</div></div>`;v.length===0&&(m+="<p>No articles with this tag.</p>"),h=$(`Tag: ${b}`,U(y,n),m)}}else{let y=o?await o.getRemoteAgents():[],b=l.summary(),v=new Map(b.map(u=>[u.agentId,u])),m=[],k=new Set;for(let u of b){let w=y.find(z=>z.agentId===u.agentId);w&&w.totalArticles>u.totalArticles?m.push({...w,totalEntries:Math.max(u.totalEntries,w.totalEntries),unabsorbed:Math.max(u.unabsorbed,w.unabsorbed)}):m.push(u),k.add(u.agentId)}for(let u of y)k.has(u.agentId)||(m.push(u),k.add(u.agentId));if(f==="/"||f==="")h=Me(l,m,y);else if(f==="/entries")h=Le(l,m);else if(f==="/search")h=Je(l,x.searchParams.get("q")||"",m);else if(f.startsWith("/tag/"))h=qe(l,decodeURIComponent(f.slice(5)),m);else if(f.match(/^\/agent\/[^/]+\/tag\/.+/)){let u=f.match(/^\/agent\/([^/]+)\/tag\/(.+)$/);h=Ke(l,decodeURIComponent(u[1]),decodeURIComponent(u[2]),m)}else if(f.startsWith("/agent/")){let u=f.slice(7),w=u.indexOf("/article/");if(w===-1)h=Fe(l,u,m);else{let z=u.slice(0,w),N=u.slice(w+9);if(h=je(l,z,N,m),!h&&o){let A=y.find(E=>E.agentId===z);if(A){let E=await o.getRemoteArticle(A.peerUrl,z,N);if(E){let S=`<div class="breadcrumb"><a href="/">Hub</a> / <span class="tag">remote @ ${s(A.nodeId)}</span> / ${s(z)}</div>`;S+=`<h1>${s(E.meta.title)}</h1>`,S+='<dl class="meta">',S+=`<dt>Tags</dt><dd>${(E.meta.tags||[]).map(be=>`<span class="tag">${be}</span>`).join(" ")}</dd>`,S+=`<dt>Source</dt><dd><span class="tag">remote</span> ${s(A.nodeId)}</dd>`,S+=`<dt>Updated</dt><dd>${E.meta.lastUpdated}</dd>`,S+="</dl>",S+=D(E.content,new Map),h=$(E.meta.title,I(m),S)}}}}}}if(!h){T=404;let y=n?U(l.getAgentWiki(n),n):I(l.summary());h=$("Not Found",y,"<h1>Page not found</h1>")}}catch(y){T=500,h=$("Error","",`<h1>Error</h1><pre>${s(y.message)}</pre>`)}g.writeHead(T,{"Content-Type":"text/html; charset=utf-8"}),g.end(c?Xe(h,c):h)}}function Xe(e,t){e=e.replace(/(\s(?:href|action)=")\/(?!\/)/g,`$1${t}/`),e=e.replace(new RegExp(`(${t})${t}/`,"g"),`${t}/`);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 e=e.replace(/<body([^>]*)>/,`<body$1>${n}`),e}function Kt(e,t=4200,n,a=[],r="graph"){let i=Ye({wikiDir:e,agentFilter:n,peerUrls:a,mode:r});Ne((l,o)=>{i(l,o)}).listen(t)}import{createCipheriv as Ge,createDecipheriv as Ve,createHash as Qe,randomBytes as K,randomInt as Ze,scryptSync as et,timingSafeEqual as tt}from"crypto";import{existsSync as nt,mkdirSync as at,readFileSync as rt,renameSync as it,writeFileSync as ot}from"fs";import{dirname as st,resolve as lt}from"path";var Y="23456789ABCDEFGHJKMNPQRSTUVWXYZ",X=8,dt=10*60*1e3,ct=".agentx/pair-codes.json",pt={N:16384,r:8,p:1};function gt(){let e="";for(let t=0;t<X;t++)e+=Y[Ze(Y.length)];return e}function Qt(e){return`${e.slice(0,4)}-${e.slice(4)}`}function mt(e){if(typeof e!="string"||e.length>64)return null;let t=e.toUpperCase().replace(/[\s\-‐-―]/g,"");if(t.length!==X)return null;for(let n of t)if(!Y.includes(n))return null;return t}var ve=class{constructor(t=process.cwd(),n=ct,a=Date.now){this.now=a;this.file=lt(t,n)}file;create(t){let n=this.load(),a=gt(),{id:r,key:i}=xe(a,n.salt),c=this.now(),l=new Date(c+dt).toISOString();return n.codes=n.codes.filter(o=>Date.parse(o.expiresAt)>c),n.codes.push({id:r,tokenId:t.tokenId,name:t.name,sealed:ut(i,t.token),createdAt:new Date(c).toISOString(),expiresAt:l}),this.save(n),{code:a,expiresAt:l}}redeem(t){let n=this.load(),a=mt(t),{id:r,key:i}=xe(a??"-".repeat(X),n.salt);if(!a)return null;let c=Buffer.from(r),l=n.codes.find(d=>d.id.length===r.length&&tt(Buffer.from(d.id),c));if(!l||Date.parse(l.expiresAt)<=this.now())return null;let o=ft(i,l.sealed);return o?(n.codes=n.codes.filter(d=>d!==l&&Date.parse(d.expiresAt)>this.now()),this.save(n),{token:o,tokenId:l.tokenId,name:l.name}):null}load(){if(nt(this.file))try{let t=JSON.parse(rt(this.file,"utf-8"));if(t&&typeof t.salt=="string"&&Array.isArray(t.codes))return t}catch{}return{salt:K(16).toString("hex"),codes:[]}}save(t){at(st(this.file),{recursive:!0});let n=`${this.file}.${process.pid}.${K(4).toString("hex")}.tmp`;ot(n,JSON.stringify(t,null,2)+`
739
739
  `,{encoding:"utf-8",mode:384}),it(n,this.file)}};function xe(e,t){let n=et(e,Buffer.from(t,"hex"),64,pt);return{id:"sha256:"+Qe("sha256").update(n.subarray(0,32)).digest("hex"),key:n.subarray(32)}}function ut(e,t){let n=K(12),a=Ge("aes-256-gcm",e,n),r=Buffer.concat([a.update(t,"utf-8"),a.final()]);return Buffer.concat([n,a.getAuthTag(),r]).toString("base64")}function ft(e,t){try{let n=Buffer.from(t,"base64"),a=Ve("aes-256-gcm",e,n.subarray(0,12));return a.setAuthTag(n.subarray(12,28)),Buffer.concat([a.update(n.subarray(28)),a.final()]).toString("utf-8")}catch{return null}}var ht="https://ntfy.sh";function en(e){return{enabled:!!e?.enabled,server:e?.server||ht,topicSet:!!e?.topic,tokenSet:!!e?.token}}function tn(e,t){let n={...e??{}};if("enabled"in t&&(n.enabled=!!t.enabled),"server"in t){let a=String(t.server).trim().replace(/\/+$/,"");if(!/^https?:\/\/\S+$/.test(a))throw new Error("ntfy server must be an http(s) URL");n.server=a}if("topic"in t){let a=String(t.topic).trim();if(!a)throw new Error("ntfy topic cannot be empty");n.topic=a}if("token"in t){let a=String(t.token??"").trim();a?n.token=a:delete n.token}if(n.enabled&&!n.topic)throw new Error("set a topic before enabling ntfy");return n}export{oe as a,ge as b,Pt as c,Rt as d,Ut as e,dt as f,Qt as g,ve as h,Ht as i,Dt as j,Ot as k,en as l,tn as m,Ye as n,Kt as o};
740
- //# sourceMappingURL=chunk-D233M73Q.js.map
740
+ //# sourceMappingURL=chunk-J6RZOP7Z.js.map
@@ -1,4 +1,4 @@
1
- import{a as j,b as O,c as T,d as D,e as _,j as N}from"./chunk-AAA6NGY5.js";import{b as R}from"./chunk-2GIDVZ4H.js";import{v as C,w as I}from"./chunk-DJMUP6TK.js";import{b as v,c as W}from"./chunk-QOYAX2FT.js";import{readFileSync as Y,existsSync as B}from"fs";I();import{resolve as x}from"path";import{execSync as L}from"child_process";async function nt(n,a,o,t={}){let u=t.selectorModel??"haiku",g=t.synthModel??"sonnet",l=t.maxCandidates??3,r=t.maxHops??2,s=t.maxArticles??8,h=t.timeoutMs??6e4,p=t.log??console.error.bind(console,"[wiki-query]"),m=t.messagePath?.length?t.messagePath:void 0,w=t.graphWeight??$,i=x(a.baseDir,"_index.md");if(!B(i))return A("no-catalog",n,"No _index.md found \u2014 run `agentx wiki status` to rebuild.");let e=Y(i,"utf-8"),d=Date.now(),f=[],y="";try{let c=await G(n,a,o,l,m,w);c?(f=c,y=`[wiki-rerank seat] ${c.map(k=>k.title).join(" | ")}`):(y=await Q(q(n,e,l,m),u,h),f=K(y))}catch(c){return p("selector failed:",c?.message),{...A("error",n,`Selector: ${c?.message||"unknown"}`),trace:{selectorMs:Date.now()-d,synthesisMs:0,selectorOutput:y}}}let S=Date.now()-d;if(f.length===0)return{...A("no-candidates",n,"Selector returned no candidates."),trace:{selectorMs:S,synthesisMs:0,selectorOutput:y}};let b=F(f,a,o,r,s);if(b.length===0)return{...A("no-candidates",n,"Candidates did not resolve to readable articles."),candidates:f,trace:{selectorMs:S,synthesisMs:0,selectorOutput:y}};let M=Date.now(),P="";try{P=await Q(J(n,b),g,h*2)}catch(c){return p("synthesis failed:",c?.message),{...A("error",n,`Synthesis: ${c?.message||"unknown"}`),candidates:f,walked:b.map(k=>({title:k.meta.title,path:k.path,type:k.meta.type,hop:k.hop??0})),trace:{selectorMs:S,synthesisMs:Date.now()-M,selectorOutput:y}}}let E=Date.now()-M;return{answer:P.trim(),citations:b.map(c=>({title:c.meta.title,path:c.path,type:c.meta.type})),candidates:f,walked:b.map(c=>({title:c.meta.title,path:c.path,type:c.meta.type,hop:c.hop??0})),status:"ok",trace:{selectorMs:S,synthesisMs:E,selectorOutput:y}}}function A(n,a,o){return{answer:"",citations:[],candidates:[],walked:[],status:n,error:o}}function F(n,a,o,t,u){let g=new Map;for(let s of a.listArticles(o||""))g.set(s.meta.title.toLowerCase(),s.path);let l=new Map,r=[];for(let s of n)l.has(s.path)||r.push({path:s.path,hop:0});for(;r.length&&l.size<u;){let s=r.shift();if(l.has(s.path)||s.hop>t)continue;let h=o?a.readArticleAs(s.path,o):a.readArticle(s.path);if(h&&(l.set(s.path,{...h,hop:s.hop}),!(s.hop>=t)))for(let p of h.meta.related||[]){let m=g.get(p.toLowerCase());m&&!l.has(m)&&r.push({path:m,hop:s.hop+1})}}return Array.from(l.values())}async function G(n,a,o,t,u,g=$){try{let r=(a.rebuildIndex().articles??[]).filter(i=>i.path&&!i.path.includes("/_versions/"));if(r.length<2)return null;let h=H(n,r,u,g).slice(0,O).map(i=>({id:`k${i}`,title:r[i].title||r[i].path,tags:r[i].tags,excerpt:[r[i].type?`type: ${r[i].type}`:"",(r[i].related??[]).length?`related: ${(r[i].related??[]).join(", ")}`:"",(r[i].graphPath??[]).length?`graph: ${(r[i].graphPath??[]).join(" \u203A ")}`:""].filter(Boolean).join(" \xB7 ")})),p=await C(j,T({query:n,candidates:h,excerptChars:300}),D(h),{features:{agent:o??"unknown",stage:"catalog-selector"}});if(!p||p.mode!=="active")return null;let w=_(p.answers,h).ranked.slice(0,t).map(i=>r[Number(i.slice(1))]).filter(Boolean).map(i=>({title:i.title,path:i.path}));return w.length>0?w:null}catch{return null}}var $=.6;function H(n,a,o,t=$){let u=a.map(e=>[e.title,(e.tags??[]).join(" "),(e.related??[]).join(" ")].join(" ")),g=W(n,v(u)),l=g.reduce((e,d)=>Math.max(e,d.score),0),r=new Map(g.map(e=>[e.docIndex,l>0?e.score/l:0])),s=!!o?.length,h=e=>s&&e.graphPath?.length?N(o,e.graphPath):0,p=(e,d)=>d.score-e.score||e.i-d.i,m=a.map((e,d)=>({i:d,score:(r.get(d)??0)*(1+t*h(e))})).filter(e=>r.has(e.i)).sort(p),w=a.map((e,d)=>({i:d,score:h(e)})).filter(e=>!r.has(e.i)&&e.score>0).sort(p),i=[...m,...w].map(e=>e.i);for(let e=0;e<a.length;e++)i.includes(e)||i.push(e);return i}function q(n,a,o,t){let u=t?.length?`
1
+ import{a as j,b as O,c as T,d as D,e as _,j as N}from"./chunk-TT4T6CB3.js";import{b as R}from"./chunk-2GIDVZ4H.js";import{v as C,w as I}from"./chunk-YVLFX35J.js";import{b as v,c as W}from"./chunk-QOYAX2FT.js";import{readFileSync as Y,existsSync as B}from"fs";I();import{resolve as x}from"path";import{execSync as L}from"child_process";async function nt(n,a,o,t={}){let u=t.selectorModel??"haiku",g=t.synthModel??"sonnet",l=t.maxCandidates??3,r=t.maxHops??2,s=t.maxArticles??8,h=t.timeoutMs??6e4,p=t.log??console.error.bind(console,"[wiki-query]"),m=t.messagePath?.length?t.messagePath:void 0,w=t.graphWeight??$,i=x(a.baseDir,"_index.md");if(!B(i))return A("no-catalog",n,"No _index.md found \u2014 run `agentx wiki status` to rebuild.");let e=Y(i,"utf-8"),d=Date.now(),f=[],y="";try{let c=await G(n,a,o,l,m,w);c?(f=c,y=`[wiki-rerank seat] ${c.map(k=>k.title).join(" | ")}`):(y=await Q(q(n,e,l,m),u,h),f=K(y))}catch(c){return p("selector failed:",c?.message),{...A("error",n,`Selector: ${c?.message||"unknown"}`),trace:{selectorMs:Date.now()-d,synthesisMs:0,selectorOutput:y}}}let S=Date.now()-d;if(f.length===0)return{...A("no-candidates",n,"Selector returned no candidates."),trace:{selectorMs:S,synthesisMs:0,selectorOutput:y}};let b=F(f,a,o,r,s);if(b.length===0)return{...A("no-candidates",n,"Candidates did not resolve to readable articles."),candidates:f,trace:{selectorMs:S,synthesisMs:0,selectorOutput:y}};let M=Date.now(),P="";try{P=await Q(J(n,b),g,h*2)}catch(c){return p("synthesis failed:",c?.message),{...A("error",n,`Synthesis: ${c?.message||"unknown"}`),candidates:f,walked:b.map(k=>({title:k.meta.title,path:k.path,type:k.meta.type,hop:k.hop??0})),trace:{selectorMs:S,synthesisMs:Date.now()-M,selectorOutput:y}}}let E=Date.now()-M;return{answer:P.trim(),citations:b.map(c=>({title:c.meta.title,path:c.path,type:c.meta.type})),candidates:f,walked:b.map(c=>({title:c.meta.title,path:c.path,type:c.meta.type,hop:c.hop??0})),status:"ok",trace:{selectorMs:S,synthesisMs:E,selectorOutput:y}}}function A(n,a,o){return{answer:"",citations:[],candidates:[],walked:[],status:n,error:o}}function F(n,a,o,t,u){let g=new Map;for(let s of a.listArticles(o||""))g.set(s.meta.title.toLowerCase(),s.path);let l=new Map,r=[];for(let s of n)l.has(s.path)||r.push({path:s.path,hop:0});for(;r.length&&l.size<u;){let s=r.shift();if(l.has(s.path)||s.hop>t)continue;let h=o?a.readArticleAs(s.path,o):a.readArticle(s.path);if(h&&(l.set(s.path,{...h,hop:s.hop}),!(s.hop>=t)))for(let p of h.meta.related||[]){let m=g.get(p.toLowerCase());m&&!l.has(m)&&r.push({path:m,hop:s.hop+1})}}return Array.from(l.values())}async function G(n,a,o,t,u,g=$){try{let r=(a.rebuildIndex().articles??[]).filter(i=>i.path&&!i.path.includes("/_versions/"));if(r.length<2)return null;let h=H(n,r,u,g).slice(0,O).map(i=>({id:`k${i}`,title:r[i].title||r[i].path,tags:r[i].tags,excerpt:[r[i].type?`type: ${r[i].type}`:"",(r[i].related??[]).length?`related: ${(r[i].related??[]).join(", ")}`:"",(r[i].graphPath??[]).length?`graph: ${(r[i].graphPath??[]).join(" \u203A ")}`:""].filter(Boolean).join(" \xB7 ")})),p=await C(j,T({query:n,candidates:h,excerptChars:300}),D(h),{features:{agent:o??"unknown",stage:"catalog-selector"}});if(!p||p.mode!=="active")return null;let w=_(p.answers,h).ranked.slice(0,t).map(i=>r[Number(i.slice(1))]).filter(Boolean).map(i=>({title:i.title,path:i.path}));return w.length>0?w:null}catch{return null}}var $=.6;function H(n,a,o,t=$){let u=a.map(e=>[e.title,(e.tags??[]).join(" "),(e.related??[]).join(" ")].join(" ")),g=W(n,v(u)),l=g.reduce((e,d)=>Math.max(e,d.score),0),r=new Map(g.map(e=>[e.docIndex,l>0?e.score/l:0])),s=!!o?.length,h=e=>s&&e.graphPath?.length?N(o,e.graphPath):0,p=(e,d)=>d.score-e.score||e.i-d.i,m=a.map((e,d)=>({i:d,score:(r.get(d)??0)*(1+t*h(e))})).filter(e=>r.has(e.i)).sort(p),w=a.map((e,d)=>({i:d,score:h(e)})).filter(e=>!r.has(e.i)&&e.score>0).sort(p),i=[...m,...w].map(e=>e.i);for(let e=0;e<a.length;e++)i.includes(e)||i.push(e);return i}function q(n,a,o,t){let u=t?.length?`
2
2
  ## Intent
3
3
 
4
4
  The request was classified under the intent-graph path "${t.join(" \u203A ")}". Prefer articles filed under the same branch when their titles are equally plausible.
@@ -46,4 +46,4 @@ ${o}
46
46
  Answer the question in 2\u20136 sentences. Cite articles by their title in square brackets like [Article Title]. If the articles do not answer the question, say so plainly (do not invent). Prefer concrete facts over hedging.
47
47
 
48
48
  Output ONLY the answer \u2014 no preamble, no "here is my answer:", no markdown fencing.`}function K(n){let a=n.match(/\[[\s\S]*?\]/);if(!a)return[];try{let o=JSON.parse(a[0]);return Array.isArray(o)?o.filter(t=>t&&typeof t.title=="string"&&typeof t.path=="string").map(t=>({title:t.title,path:t.path})):[]}catch{return[]}}async function Q(n,a,o){let{writeFileSync:t,mkdirSync:u,rmSync:g}=await import("fs"),{tmpdir:l}=await import("os"),r=x(l(),`agentx-wiki-query-${process.pid}`);u(r,{recursive:!0});let s=x(r,`prompt-${Date.now()}.txt`);t(s,n);try{let h=`cat '${s}' | claude -p - --output-format json --max-turns 1 --model ${a} --disallowedTools "Bash Read Write Edit Glob Grep Agent WebSearch WebFetch NotebookEdit"`,p=L(h,{env:R({...process.env}),encoding:"utf-8",timeout:o,maxBuffer:4*1024*1024});try{let m=JSON.parse(p);return String(m.result||m.content||"")}catch{return p}}finally{try{g(s,{force:!0})}catch{}}}export{nt as a,$ as b,H as c};
49
- //# sourceMappingURL=chunk-XJQNIFZ4.js.map
49
+ //# sourceMappingURL=chunk-MESWF2ZM.js.map
@@ -0,0 +1,2 @@
1
+ import{spawn as S,execFile as x}from"node:child_process";import{createHash as N,randomBytes as O}from"node:crypto";import{createInterface as P}from"node:readline";import{promisify as T}from"node:util";var C=T(x),l=class extends Error{constructor(i,c=!1){super(i);this.standalone=c}},v=class{constructor(e=8,i=3e5){this.capacity=e;this.idleMs=i}entries=new Map;versions=new Map;close(e){if(e.dead)return;e.dead=!0,clearTimeout(e.idle),e.child.kill("SIGTERM"),setTimeout(()=>{e.child.exitCode===null&&e.child.kill("SIGKILL")},3e3).unref()}stop(){for(let e of this.entries.values())this.close(e);this.entries.clear(),this.versions.clear()}async acquire(e){if(e.signal?.aborted)throw new Error("task cancelled by operator");let i=e.env.PATH||"",c=this.versions.get(i);if(c||(c=C("opencode",["--version"],{env:e.env,timeout:5e3}).then(({stdout:r})=>/^(?:opencode\s+)?v?2\./.test(r.trim())).catch(()=>!1),this.versions.set(i,c),setTimeout(()=>this.versions.delete(i),6e4).unref()),!await c)throw new l("Warm servers require OpenCode v2; using the CLI path");if(e.signal?.aborted)throw new Error("task cancelled by operator");let y=N("sha256").update(JSON.stringify([e.cwd,e.model,e.permission,Object.entries(e.env).sort(([n],[r])=>n.localeCompare(r))])).digest("hex"),t=this.entries.get(e.key);if(t?.busy)throw new l("Conversation already running",!0);t&&(t.dead||t.fingerprint!==y||e.fresh)&&(this.close(t),this.entries.delete(e.key),t=void 0);let b=!!t;if(!t){if(this.entries.size>=this.capacity){let o=[...this.entries].find(([,p])=>!p.busy);if(!o)throw new l("Warm server capacity reached",!0);this.close(o[1]),this.entries.delete(o[0])}let n={...e.env,OPENCODE_SERVER_USERNAME:"opencode",OPENCODE_SERVER_PASSWORD:O(32).toString("hex")},r=S("opencode",["serve","--hostname","127.0.0.1","--port","0","--stdio"],{cwd:e.cwd,env:n,stdio:["pipe","pipe","pipe"]});t={child:r,env:n,fingerprint:y,url:"",busy:!0,dead:!1},this.entries.set(e.key,t);let u=t;r.stderr.resume(),r.on("exit",()=>this.close(u)),r.on("error",()=>this.close(u));try{await new Promise((o,p)=>{let w=P({input:r.stdout}),d=()=>m(new l("OpenCode server failed before dispatch",!0)),f=()=>m(new Error("task cancelled by operator")),k=setTimeout(d,15e3),m=h=>{clearTimeout(k),r.removeListener("exit",d),r.removeListener("error",d),e.signal?.removeEventListener("abort",f),w.close(),r.stdout.resume(),h?p(h):o()};r.once("exit",d),r.once("error",d),e.signal?.addEventListener("abort",f,{once:!0}),w.on("line",h=>{try{let a=new URL(JSON.parse(h).url);if(a.protocol!=="http:"||a.hostname!=="127.0.0.1"||!a.port||a.username||a.password)return;u.url=a.origin,m()}catch{}}),e.signal?.aborted&&f()})}catch(o){throw this.close(t),this.entries.get(e.key)===t&&this.entries.delete(e.key),o}}let s=t;clearTimeout(s.idle),s.busy=!0;let g=!1;return{url:s.url,env:s.env,reused:b,invalidate:()=>this.close(s),release:(n=!1)=>{g||(g=!0,s.busy=!1,n||s.dead?(this.close(s),this.entries.get(e.key)===s&&this.entries.delete(e.key)):(s.idle=setTimeout(()=>{this.close(s),this.entries.get(e.key)===s&&this.entries.delete(e.key)},this.idleMs),s.idle.unref()))}}}},I=new v;export{l as a,v as b,I as c};
2
+ //# sourceMappingURL=chunk-MYVHVJWZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agents/opencode-process.ts"],"sourcesContent":["import { spawn, execFile, type ChildProcessWithoutNullStreams } from \"node:child_process\"\nimport { createHash, randomBytes } from \"node:crypto\"\nimport { createInterface } from \"node:readline\"\nimport { promisify } from \"node:util\"\n\nconst exec = promisify(execFile)\nexport class OpenCodeServerUnavailable extends Error {\n constructor(message: string, readonly standalone = false) { super(message) }\n}\ninterface Options {\n key: string\n cwd: string\n env: NodeJS.ProcessEnv\n model?: string\n permission?: string\n fresh?: boolean\n signal?: AbortSignal\n}\ninterface Entry {\n child: ChildProcessWithoutNullStreams\n fingerprint: string\n url: string\n env: NodeJS.ProcessEnv\n busy: boolean\n dead: boolean\n idle?: NodeJS.Timeout\n}\n\n/** Dedicated v2 servers retain provider/MCP startup while CLI clients stream turns. */\nexport class OpenCodeProcessPool {\n private entries = new Map<string, Entry>()\n private versions = new Map<string, Promise<boolean>>()\n constructor(private capacity = 8, private idleMs = 300_000) {}\n private close(entry: Entry) {\n if (entry.dead) return\n entry.dead = true\n clearTimeout(entry.idle)\n entry.child.kill(\"SIGTERM\")\n const kill = setTimeout(() => {\n if (entry.child.exitCode === null) entry.child.kill(\"SIGKILL\")\n }, 3000)\n kill.unref()\n }\n stop() {\n for (const entry of this.entries.values()) this.close(entry)\n this.entries.clear()\n this.versions.clear()\n }\n async acquire(o: Options) {\n if (o.signal?.aborted) throw new Error(\"task cancelled by operator\")\n const path = o.env.PATH || \"\"\n let version = this.versions.get(path)\n if (!version) {\n version = exec(\"opencode\", [\"--version\"], { env: o.env, timeout: 5000 })\n .then(({ stdout }) => /^(?:opencode\\s+)?v?2\\./.test(stdout.trim())).catch(() => false)\n this.versions.set(path, version)\n // Retry after upgrades/installations without requiring a daemon restart.\n const expire = setTimeout(() => this.versions.delete(path), 60_000)\n expire.unref()\n }\n if (!await version) throw new OpenCodeServerUnavailable(\"Warm servers require OpenCode v2; using the CLI path\")\n if (o.signal?.aborted) throw new Error(\"task cancelled by operator\")\n const fingerprint = createHash(\"sha256\").update(JSON.stringify([\n o.cwd, o.model, o.permission, Object.entries(o.env).sort(([a], [b]) => a.localeCompare(b)),\n ])).digest(\"hex\")\n let entry = this.entries.get(o.key)\n if (entry?.busy) throw new OpenCodeServerUnavailable(\"Conversation already running\", true)\n if (entry && (entry.dead || entry.fingerprint !== fingerprint || o.fresh)) {\n this.close(entry)\n this.entries.delete(o.key)\n entry = undefined\n }\n const reused = !!entry\n if (!entry) {\n if (this.entries.size >= this.capacity) {\n const idle = [...this.entries].find(([, value]) => !value.busy)\n if (!idle) throw new OpenCodeServerUnavailable(\"Warm server capacity reached\", true)\n this.close(idle[1])\n this.entries.delete(idle[0])\n }\n const env = { ...o.env, OPENCODE_SERVER_USERNAME: \"opencode\", OPENCODE_SERVER_PASSWORD: randomBytes(32).toString(\"hex\") }\n const child = spawn(\"opencode\", [\"serve\", \"--hostname\", \"127.0.0.1\", \"--port\", \"0\", \"--stdio\"],\n { cwd: o.cwd, env, stdio: [\"pipe\", \"pipe\", \"pipe\"] })\n entry = { child, env, fingerprint, url: \"\", busy: true, dead: false }\n this.entries.set(o.key, entry)\n const current = entry\n child.stderr.resume()\n child.on(\"exit\", () => this.close(current))\n child.on(\"error\", () => this.close(current))\n try {\n await new Promise<void>((resolve, reject) => {\n const lines = createInterface({ input: child.stdout })\n const fail = () => finish(new OpenCodeServerUnavailable(\"OpenCode server failed before dispatch\", true))\n const abort = () => finish(new Error(\"task cancelled by operator\"))\n const timer = setTimeout(fail, 15_000)\n const finish = (error?: Error) => {\n clearTimeout(timer)\n child.removeListener(\"exit\", fail)\n child.removeListener(\"error\", fail)\n o.signal?.removeEventListener(\"abort\", abort)\n lines.close()\n child.stdout.resume()\n error ? reject(error) : resolve()\n }\n child.once(\"exit\", fail)\n child.once(\"error\", fail)\n o.signal?.addEventListener(\"abort\", abort, { once: true })\n lines.on(\"line\", line => {\n try {\n const url = new URL(JSON.parse(line).url)\n if (url.protocol !== \"http:\" || url.hostname !== \"127.0.0.1\" || !url.port || url.username || url.password) return\n current.url = url.origin\n finish()\n } catch { /* Ignore non-readiness output. */ }\n })\n if (o.signal?.aborted) abort()\n })\n } catch (error) {\n this.close(entry)\n if (this.entries.get(o.key) === entry) this.entries.delete(o.key)\n throw error\n }\n }\n const current = entry\n clearTimeout(current.idle)\n current.busy = true\n let released = false\n return {\n url: current.url, env: current.env, reused,\n invalidate: () => this.close(current),\n release: (failed = false) => {\n if (released) return\n released = true\n current.busy = false\n if (failed || current.dead) {\n this.close(current)\n if (this.entries.get(o.key) === current) this.entries.delete(o.key)\n } else {\n current.idle = setTimeout(() => {\n this.close(current)\n if (this.entries.get(o.key) === current) this.entries.delete(o.key)\n }, this.idleMs)\n current.idle.unref()\n }\n },\n }\n }\n}\nexport const openCodeProcessPool = new OpenCodeProcessPool()\n"],"mappings":"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","names":["spawn","execFile","createHash","randomBytes","createInterface","promisify","exec","OpenCodeServerUnavailable","message","standalone","OpenCodeProcessPool","capacity","idleMs","entry","o","path","version","stdout","fingerprint","a","b","reused","idle","value","env","child","current","resolve","reject","lines","fail","finish","abort","timer","error","line","url","released","failed","openCodeProcessPool"]}