agentix-cli 0.117.0 → 0.118.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 (136) hide show
  1. package/README.md +5 -5
  2. package/dist/{App-UQP7UQYV.js → App-XMSNIAU6.js} +2 -2
  3. package/dist/{ChatApp-VGSP5O6N.js → ChatApp-BFYTIQF3.js} +2 -2
  4. package/dist/{agent-MO27U4Y7.js → agent-E6W5VBYH.js} +2 -2
  5. package/dist/{board-dashboard-CSS7XMIZ.js → board-dashboard-D5FQZKO4.js} +215 -101
  6. package/dist/board-dashboard-D5FQZKO4.js.map +1 -0
  7. package/dist/chunk-23SQSUBI.js +3 -0
  8. package/dist/chunk-23SQSUBI.js.map +1 -0
  9. package/dist/{chunk-VRXJW6JJ.js → chunk-2G227TF3.js} +2 -2
  10. package/dist/{chunk-HVZVFCJX.js → chunk-4PQREYBU.js} +2 -2
  11. package/dist/{chunk-4FU4BFCH.js → chunk-5NTWGUSJ.js} +3 -3
  12. package/dist/chunk-5NTWGUSJ.js.map +1 -0
  13. package/dist/{chunk-2WK5A3UV.js → chunk-5PR6DZYW.js} +3 -3
  14. package/dist/chunk-5PR6DZYW.js.map +1 -0
  15. package/dist/{chunk-4ELAUGOP.js → chunk-5UFIHT66.js} +2 -2
  16. package/dist/{chunk-CUZTLQH2.js → chunk-6PC4EZ4P.js} +2 -2
  17. package/dist/chunk-AD4QZZVN.js +8 -0
  18. package/dist/{failure-candidates-PBPF45GN.js.map → chunk-AD4QZZVN.js.map} +1 -1
  19. package/dist/chunk-B6OXEIOF.js +126 -0
  20. package/dist/chunk-B6OXEIOF.js.map +1 -0
  21. package/dist/chunk-BDJWN3PL.js +4 -0
  22. package/dist/chunk-BDJWN3PL.js.map +1 -0
  23. package/dist/{chunk-OJ7KM2UO.js → chunk-FSXWNVGL.js} +2 -2
  24. package/dist/{chunk-746KHKT4.js → chunk-FTZCNID3.js} +2 -2
  25. package/dist/{chunk-PFK3QO6S.js → chunk-GJKYOEDE.js} +2 -2
  26. package/dist/{chunk-BQ2HJ7TS.js → chunk-HK7TU5NX.js} +2 -2
  27. package/dist/{chunk-FJI5GRBH.js → chunk-IMLLHT7U.js} +3 -3
  28. package/dist/chunk-IMLLHT7U.js.map +1 -0
  29. package/dist/chunk-IOYRRGK7.js +2 -0
  30. package/dist/chunk-IOYRRGK7.js.map +1 -0
  31. package/dist/{chunk-T2VDHVYW.js → chunk-IVCFXLAR.js} +2 -2
  32. package/dist/{chunk-W7WNRPNQ.js → chunk-NDPU6AX2.js} +2 -2
  33. package/dist/{chunk-45GOH6F7.js → chunk-NG677JHW.js} +8 -8
  34. package/dist/chunk-NG677JHW.js.map +1 -0
  35. package/dist/{chunk-MSP25HE5.js → chunk-PVQPXZHE.js} +5 -5
  36. package/dist/{chunk-5PPMPCHG.js → chunk-RJBRYUKU.js} +2 -2
  37. package/dist/{chunk-QLWGLRT5.js → chunk-TJ7IUHC7.js} +2 -2
  38. package/dist/{chunk-J2YLOGNN.js → chunk-U46G24CD.js} +2 -2
  39. package/dist/{chunk-IZMXAXW3.js → chunk-V4PVGEWI.js} +196 -197
  40. package/dist/chunk-V4PVGEWI.js.map +1 -0
  41. package/dist/chunk-WCXXXAHV.js +3 -0
  42. package/dist/{chunk-DMHQIACQ.js.map → chunk-WCXXXAHV.js.map} +1 -1
  43. package/dist/{chunk-45YETJY4.js → chunk-XGOBZCYC.js} +2 -2
  44. package/dist/{chunk-CKQ2YDFP.js → chunk-ZDWE47LM.js} +8 -8
  45. package/dist/chunk-ZDWE47LM.js.map +1 -0
  46. package/dist/cli.js +1 -1
  47. package/dist/{client-5UMNDY7Z.js → client-TSYZXEH7.js} +2 -2
  48. package/dist/{config-O44DOHFW.js → config-QAE3LNFQ.js} +2 -2
  49. package/dist/config-mutator-WRQ7MFQL.js +2 -0
  50. package/dist/{doctor-NKPH74F7.js → doctor-PVLVKLRA.js} +2 -2
  51. package/dist/failure-candidates-JNGUVBDG.js +2 -0
  52. package/dist/{grants-BRAVOGBP.js → grants-V2ZNLWSJ.js} +2 -2
  53. package/dist/index.d.ts +69 -2
  54. package/dist/index.js +1 -1
  55. package/dist/program-ZYG3YPH2.js +721 -0
  56. package/dist/program-ZYG3YPH2.js.map +1 -0
  57. package/dist/{promote-ZRNVPWTD.js → promote-IRBBEXGG.js} +2 -2
  58. package/dist/{push-bridge-VPTQNM43.js → push-bridge-325SXDGN.js} +2 -2
  59. package/dist/{query-HURONGKA.js → query-NAU7J34H.js} +2 -2
  60. package/dist/{registry-AYGFAKTC.js → registry-I5PXGCO6.js} +2 -2
  61. package/dist/{request-planner-ZZRSOBQZ.js → request-planner-CRG3OGGG.js} +2 -2
  62. package/dist/{review-candidates-KHH47PK7.js → review-candidates-HAP7P6SH.js} +2 -2
  63. package/dist/{routing-GUBKKWPT.js → routing-G33LLOTF.js} +2 -2
  64. package/dist/schedule-tool-IP7ZCQKI.js +2 -0
  65. package/dist/scheduler-QXLPYSNJ.js +2 -0
  66. package/dist/{seat-CVTTTE5V.js → seat-IJN7NETF.js} +2 -2
  67. package/dist/{select-OUTM6OBC.js → select-D7AZ2XZF.js} +2 -2
  68. package/dist/{set-enabled-2QKQRVUN.js → set-enabled-5YSDIQXU.js} +2 -2
  69. package/dist/{surface-usage-HCJTUS6Z.js → surface-usage-WSY4SHHL.js} +2 -2
  70. package/dist/{tool-XY7QGHLV.js → tool-GQIQWHWB.js} +2 -2
  71. package/dist/{tool-OFXHMLE5.js → tool-XADSW6NL.js} +2 -2
  72. package/dist/wiki-PPX3HYXW.js +2 -0
  73. package/dist/wiki-PPX3HYXW.js.map +1 -0
  74. package/package.json +1 -1
  75. package/dist/board-dashboard-CSS7XMIZ.js.map +0 -1
  76. package/dist/chunk-2WK5A3UV.js.map +0 -1
  77. package/dist/chunk-45GOH6F7.js.map +0 -1
  78. package/dist/chunk-4FU4BFCH.js.map +0 -1
  79. package/dist/chunk-CKQ2YDFP.js.map +0 -1
  80. package/dist/chunk-DMHQIACQ.js +0 -3
  81. package/dist/chunk-FJI5GRBH.js.map +0 -1
  82. package/dist/chunk-HYGMWCUU.js +0 -126
  83. package/dist/chunk-HYGMWCUU.js.map +0 -1
  84. package/dist/chunk-IZMXAXW3.js.map +0 -1
  85. package/dist/chunk-JIT5GPTX.js +0 -4
  86. package/dist/chunk-JIT5GPTX.js.map +0 -1
  87. package/dist/chunk-PMQ47IPT.js +0 -2
  88. package/dist/chunk-PMQ47IPT.js.map +0 -1
  89. package/dist/chunk-VEHTVYP6.js +0 -2
  90. package/dist/chunk-VEHTVYP6.js.map +0 -1
  91. package/dist/config-mutator-PRLY2TCE.js +0 -2
  92. package/dist/failure-candidates-PBPF45GN.js +0 -8
  93. package/dist/program-RHIJYCEJ.js +0 -703
  94. package/dist/program-RHIJYCEJ.js.map +0 -1
  95. package/dist/schedule-tool-VH77T3N3.js +0 -2
  96. package/dist/scheduler-SZ4YYXJE.js +0 -2
  97. package/dist/wiki-46GMWX34.js +0 -2
  98. /package/dist/{App-UQP7UQYV.js.map → App-XMSNIAU6.js.map} +0 -0
  99. /package/dist/{ChatApp-VGSP5O6N.js.map → ChatApp-BFYTIQF3.js.map} +0 -0
  100. /package/dist/{agent-MO27U4Y7.js.map → agent-E6W5VBYH.js.map} +0 -0
  101. /package/dist/{chunk-VRXJW6JJ.js.map → chunk-2G227TF3.js.map} +0 -0
  102. /package/dist/{chunk-HVZVFCJX.js.map → chunk-4PQREYBU.js.map} +0 -0
  103. /package/dist/{chunk-4ELAUGOP.js.map → chunk-5UFIHT66.js.map} +0 -0
  104. /package/dist/{chunk-CUZTLQH2.js.map → chunk-6PC4EZ4P.js.map} +0 -0
  105. /package/dist/{chunk-OJ7KM2UO.js.map → chunk-FSXWNVGL.js.map} +0 -0
  106. /package/dist/{chunk-746KHKT4.js.map → chunk-FTZCNID3.js.map} +0 -0
  107. /package/dist/{chunk-PFK3QO6S.js.map → chunk-GJKYOEDE.js.map} +0 -0
  108. /package/dist/{chunk-BQ2HJ7TS.js.map → chunk-HK7TU5NX.js.map} +0 -0
  109. /package/dist/{chunk-T2VDHVYW.js.map → chunk-IVCFXLAR.js.map} +0 -0
  110. /package/dist/{chunk-W7WNRPNQ.js.map → chunk-NDPU6AX2.js.map} +0 -0
  111. /package/dist/{chunk-MSP25HE5.js.map → chunk-PVQPXZHE.js.map} +0 -0
  112. /package/dist/{chunk-5PPMPCHG.js.map → chunk-RJBRYUKU.js.map} +0 -0
  113. /package/dist/{chunk-QLWGLRT5.js.map → chunk-TJ7IUHC7.js.map} +0 -0
  114. /package/dist/{chunk-J2YLOGNN.js.map → chunk-U46G24CD.js.map} +0 -0
  115. /package/dist/{chunk-45YETJY4.js.map → chunk-XGOBZCYC.js.map} +0 -0
  116. /package/dist/{client-5UMNDY7Z.js.map → client-TSYZXEH7.js.map} +0 -0
  117. /package/dist/{config-O44DOHFW.js.map → config-QAE3LNFQ.js.map} +0 -0
  118. /package/dist/{config-mutator-PRLY2TCE.js.map → config-mutator-WRQ7MFQL.js.map} +0 -0
  119. /package/dist/{doctor-NKPH74F7.js.map → doctor-PVLVKLRA.js.map} +0 -0
  120. /package/dist/{grants-BRAVOGBP.js.map → failure-candidates-JNGUVBDG.js.map} +0 -0
  121. /package/dist/{promote-ZRNVPWTD.js.map → grants-V2ZNLWSJ.js.map} +0 -0
  122. /package/dist/{push-bridge-VPTQNM43.js.map → promote-IRBBEXGG.js.map} +0 -0
  123. /package/dist/{query-HURONGKA.js.map → push-bridge-325SXDGN.js.map} +0 -0
  124. /package/dist/{registry-AYGFAKTC.js.map → query-NAU7J34H.js.map} +0 -0
  125. /package/dist/{routing-GUBKKWPT.js.map → registry-I5PXGCO6.js.map} +0 -0
  126. /package/dist/{request-planner-ZZRSOBQZ.js.map → request-planner-CRG3OGGG.js.map} +0 -0
  127. /package/dist/{review-candidates-KHH47PK7.js.map → review-candidates-HAP7P6SH.js.map} +0 -0
  128. /package/dist/{schedule-tool-VH77T3N3.js.map → routing-G33LLOTF.js.map} +0 -0
  129. /package/dist/{scheduler-SZ4YYXJE.js.map → schedule-tool-IP7ZCQKI.js.map} +0 -0
  130. /package/dist/{seat-CVTTTE5V.js.map → scheduler-QXLPYSNJ.js.map} +0 -0
  131. /package/dist/{surface-usage-HCJTUS6Z.js.map → seat-IJN7NETF.js.map} +0 -0
  132. /package/dist/{select-OUTM6OBC.js.map → select-D7AZ2XZF.js.map} +0 -0
  133. /package/dist/{set-enabled-2QKQRVUN.js.map → set-enabled-5YSDIQXU.js.map} +0 -0
  134. /package/dist/{wiki-46GMWX34.js.map → surface-usage-WSY4SHHL.js.map} +0 -0
  135. /package/dist/{tool-XY7QGHLV.js.map → tool-GQIQWHWB.js.map} +0 -0
  136. /package/dist/{tool-OFXHMLE5.js.map → tool-XADSW6NL.js.map} +0 -0
@@ -1,3 +1,3 @@
1
- import{e as x,g as A}from"./chunk-JIT5GPTX.js";import{a as w,e as D}from"./chunk-2QNT5JDS.js";D();var h="guest:",b="guests",P=7,y=365,T=400;function I(e){let t=e.scopes.find(n=>n.startsWith(h));return t?t.slice(h.length):null}function _(e){return`g-${e.toString(36)}-${Math.random().toString(36).slice(2,6)}`}var l=e=>(Array.isArray(e)?e:typeof e=="string"?e.split(","):[]).map(t=>String(t).trim()).filter(Boolean).slice(0,50);function M(e,t){let n=(e.now??Date.now)(),o=String(t.name??"").trim().slice(0,120),s=String(t.guest??"").trim().slice(0,80);if(!o)return{ok:!1,error:'name is required: what you call this grant, e.g. "Support session for company X"'};if(!s)return{ok:!1,error:"guest is required: the other organisation's name"};if(!t.agentId||!e.hasAgent(t.agentId))return{ok:!1,error:`agent must be an agent on this node, got "${t.agentId??""}"`};let a=w.safeParse(t.level??"propose");if(!a.success)return{ok:!1,error:"level must be report, propose or act"};let r=t.days===void 0?P:Number(t.days);if(!Number.isFinite(r)||r<1||r>y)return{ok:!1,error:`days must be between 1 and ${y}`};let d=_(n),{token:u,record:g}=e.tokens.create({name:`guest ${s} (${o})`,scopes:[`${h}${d}`],expiresInDays:Math.ceil(r)}),{code:i,expiresAt:p}=e.codes.create({token:u,tokenId:g.id,name:d}),c={id:d,name:o,guest:s,agentId:t.agentId,folders:l(t.folders),skills:l(t.skills),commands:l(t.commands),level:a.data,state:"pending",tokenId:g.id,createdAt:new Date(n).toISOString(),expiresAt:new Date(n+r*864e5).toISOString(),usage:{turns:0,tokens:0}};return e.guests.add(c),e.guests.log({grant:d,event:"invited",detail:`${s}: ${o}`}),{ok:!0,code:i,codeExpiresAt:p,grant:c}}var j="That code didn't work. Ask the host for a new one.";async function Y(e,t,n){let o=Date.now(),s=n.now??Date.now,a=n.log??(f=>console.log(f)),r=n.limiter.retryAfter(t);if(r>0)return a(`[guests] join refused from ${t}: locked out for ${r}s more`),{status:429,body:{error:"too many attempts",retryAfter:r},retryAfter:r};let d=n.codes.redeem(e.code),u=d?n.tokens.verify(d.token):null,g=u?I(u):null,i=g?n.guests.get(g):null;if(await L(o,n.minMs??T),!d||!u||!i||i.tokenId!==u.id||i.state==="ended")return n.limiter.fail(t),a(`[guests] join failed from ${t}`),{status:401,body:{error:j}};n.limiter.succeed(t);let p=e.node&&typeof e.node=="object"?e.node:{},c=(f,S)=>typeof f=="string"&&f.trim()?f.replace(/\s+/g," ").trim().slice(0,S):void 0,m={id:c(p.id,80),name:c(p.name,80),address:t},$=i.expiresAt.slice(0,10),k=A(n.root,{title:`Guest mesh: ${i.guest} wants to join`,ask:`Let "${m.name??m.id??"a node"}" at ${t} use ${i.agentId} inside "${i.name}" (${i.level}, until ${$})?`,recommend:`Yes if ${i.guest} told you they are joining now. No if you did not expect it.`,if_silent:"discard",raised_by:b},{now:s()});return k.ok?(n.guests.update(i.id,{guestNode:m,cardId:k.card.id}),n.guests.log({grant:i.id,event:"joined",address:t,detail:m.name??m.id}),a(`[guests] ${i.id}: ${i.guest} joined from ${t}; waiting for the owner (card ${k.card.id})`),{status:200,body:{grant:i.id,name:i.name,agentId:i.agentId,level:i.level,expiresAt:i.expiresAt,state:"pending"},token:d.token}):(a(`[guests] ${i.id}: join from ${t} could not raise a card: ${k.error}`),{status:403,body:{error:"The host cannot take a join right now. Try again later."}})}var G="no grant opens this",R="waiting for the host to approve the join",O="the host paused this grant";function N(e,t){let n=e.now??Date.now,o=e.log??(r=>console.log(r));if(t.state==="ended")return t;if(Date.parse(t.expiresAt)<=n())return o(`[guests] ${t.id}: expired`),v({tokens:e.tokens,guests:e.guests,now:n},t.id,"expired")??t;if(t.state!=="pending")return t;let s=t.cardId?x(e.root,t.cardId):null,a=s?s.status==="decided"?s.verdict:s.status==="expired"?"no":null:null;if(a==="yes"){let r=e.guests.update(t.id,{state:"active",approvedAt:new Date(n()).toISOString()})??t;return e.guests.log({grant:t.id,event:"approved",detail:s?.decided_by}),o(`[guests] ${t.id}: join approved`),r}if(a==="no"){let r=s?.status==="expired"?"the host did not answer in time":"the host said no",d=v({tokens:e.tokens,guests:e.guests,now:n},t.id,r)??t;return e.guests.log({grant:t.id,event:"refused",detail:r}),o(`[guests] ${t.id}: join refused: ${r}`),d}return t}function J(e,t){let n=e?t.tokens.verify(e):null,o=n?I(n):null,s=o?t.guests.get(o):null;if(!n||!s||s.tokenId!==n.id)return{ok:!1,status:401,error:G};let a=N(t,s);return a.state==="ended"?{ok:!1,status:401,error:G}:a.state==="pending"?{ok:!1,status:403,error:R,waiting:!0}:a.state==="paused"?{ok:!1,status:403,error:O,paused:!0}:{ok:!0,grant:a}}function C(e){let t=(o,s)=>o.length?o.join(", "):`none named: do not touch ${s} unless the owner's own instructions already allow it for this work`,n=e.level==="report"?"report: read and answer only; change nothing":e.level==="propose"?"propose: you may prepare changes and open a merge request or draft; never merge, deploy or delete":"act: you may act inside the grant without asking";return[`[Guest mesh] You are working for a guest organisation, "${e.guest}", under the grant "${e.name}" that the owner of this node opened.`,`Stay inside it. Folders: ${t(e.folders,"files")}. Skills: ${t(e.skills,"skills")}. Commands: ${t(e.commands,"commands")}. Freedom: ${n}. The grant ends on ${e.expiresAt.slice(0,10)}.`,"Anything outside the grant: say it is not covered and stop. The guest sees only your answers: never reveal other chats, agents, people or files of this node."].join(`
1
+ import{f as x,h as A}from"./chunk-BDJWN3PL.js";import{a as w,e as D}from"./chunk-2QNT5JDS.js";D();var h="guest:",b="guests",P=7,y=365,T=400;function I(e){let t=e.scopes.find(n=>n.startsWith(h));return t?t.slice(h.length):null}function _(e){return`g-${e.toString(36)}-${Math.random().toString(36).slice(2,6)}`}var l=e=>(Array.isArray(e)?e:typeof e=="string"?e.split(","):[]).map(t=>String(t).trim()).filter(Boolean).slice(0,50);function M(e,t){let n=(e.now??Date.now)(),o=String(t.name??"").trim().slice(0,120),s=String(t.guest??"").trim().slice(0,80);if(!o)return{ok:!1,error:'name is required: what you call this grant, e.g. "Support session for company X"'};if(!s)return{ok:!1,error:"guest is required: the other organisation's name"};if(!t.agentId||!e.hasAgent(t.agentId))return{ok:!1,error:`agent must be an agent on this node, got "${t.agentId??""}"`};let a=w.safeParse(t.level??"propose");if(!a.success)return{ok:!1,error:"level must be report, propose or act"};let r=t.days===void 0?P:Number(t.days);if(!Number.isFinite(r)||r<1||r>y)return{ok:!1,error:`days must be between 1 and ${y}`};let d=_(n),{token:u,record:g}=e.tokens.create({name:`guest ${s} (${o})`,scopes:[`${h}${d}`],expiresInDays:Math.ceil(r)}),{code:i,expiresAt:p}=e.codes.create({token:u,tokenId:g.id,name:d}),c={id:d,name:o,guest:s,agentId:t.agentId,folders:l(t.folders),skills:l(t.skills),commands:l(t.commands),level:a.data,state:"pending",tokenId:g.id,createdAt:new Date(n).toISOString(),expiresAt:new Date(n+r*864e5).toISOString(),usage:{turns:0,tokens:0}};return e.guests.add(c),e.guests.log({grant:d,event:"invited",detail:`${s}: ${o}`}),{ok:!0,code:i,codeExpiresAt:p,grant:c}}var j="That code didn't work. Ask the host for a new one.";async function Y(e,t,n){let o=Date.now(),s=n.now??Date.now,a=n.log??(f=>console.log(f)),r=n.limiter.retryAfter(t);if(r>0)return a(`[guests] join refused from ${t}: locked out for ${r}s more`),{status:429,body:{error:"too many attempts",retryAfter:r},retryAfter:r};let d=n.codes.redeem(e.code),u=d?n.tokens.verify(d.token):null,g=u?I(u):null,i=g?n.guests.get(g):null;if(await L(o,n.minMs??T),!d||!u||!i||i.tokenId!==u.id||i.state==="ended")return n.limiter.fail(t),a(`[guests] join failed from ${t}`),{status:401,body:{error:j}};n.limiter.succeed(t);let p=e.node&&typeof e.node=="object"?e.node:{},c=(f,S)=>typeof f=="string"&&f.trim()?f.replace(/\s+/g," ").trim().slice(0,S):void 0,m={id:c(p.id,80),name:c(p.name,80),address:t},$=i.expiresAt.slice(0,10),k=A(n.root,{title:`Guest mesh: ${i.guest} wants to join`,ask:`Let "${m.name??m.id??"a node"}" at ${t} use ${i.agentId} inside "${i.name}" (${i.level}, until ${$})?`,recommend:`Yes if ${i.guest} told you they are joining now. No if you did not expect it.`,if_silent:"discard",raised_by:b},{now:s()});return k.ok?(n.guests.update(i.id,{guestNode:m,cardId:k.card.id}),n.guests.log({grant:i.id,event:"joined",address:t,detail:m.name??m.id}),a(`[guests] ${i.id}: ${i.guest} joined from ${t}; waiting for the owner (card ${k.card.id})`),{status:200,body:{grant:i.id,name:i.name,agentId:i.agentId,level:i.level,expiresAt:i.expiresAt,state:"pending"},token:d.token}):(a(`[guests] ${i.id}: join from ${t} could not raise a card: ${k.error}`),{status:403,body:{error:"The host cannot take a join right now. Try again later."}})}var G="no grant opens this",R="waiting for the host to approve the join",O="the host paused this grant";function N(e,t){let n=e.now??Date.now,o=e.log??(r=>console.log(r));if(t.state==="ended")return t;if(Date.parse(t.expiresAt)<=n())return o(`[guests] ${t.id}: expired`),v({tokens:e.tokens,guests:e.guests,now:n},t.id,"expired")??t;if(t.state!=="pending")return t;let s=t.cardId?x(e.root,t.cardId):null,a=s?s.status==="decided"?s.verdict:s.status==="expired"?"no":null:null;if(a==="yes"){let r=e.guests.update(t.id,{state:"active",approvedAt:new Date(n()).toISOString()})??t;return e.guests.log({grant:t.id,event:"approved",detail:s?.decided_by}),o(`[guests] ${t.id}: join approved`),r}if(a==="no"){let r=s?.status==="expired"?"the host did not answer in time":"the host said no",d=v({tokens:e.tokens,guests:e.guests,now:n},t.id,r)??t;return e.guests.log({grant:t.id,event:"refused",detail:r}),o(`[guests] ${t.id}: join refused: ${r}`),d}return t}function J(e,t){let n=e?t.tokens.verify(e):null,o=n?I(n):null,s=o?t.guests.get(o):null;if(!n||!s||s.tokenId!==n.id)return{ok:!1,status:401,error:G};let a=N(t,s);return a.state==="ended"?{ok:!1,status:401,error:G}:a.state==="pending"?{ok:!1,status:403,error:R,waiting:!0}:a.state==="paused"?{ok:!1,status:403,error:O,paused:!0}:{ok:!0,grant:a}}function C(e){let t=(o,s)=>o.length?o.join(", "):`none named: do not touch ${s} unless the owner's own instructions already allow it for this work`,n=e.level==="report"?"report: read and answer only; change nothing":e.level==="propose"?"propose: you may prepare changes and open a merge request or draft; never merge, deploy or delete":"act: you may act inside the grant without asking";return[`[Guest mesh] You are working for a guest organisation, "${e.guest}", under the grant "${e.name}" that the owner of this node opened.`,`Stay inside it. Folders: ${t(e.folders,"files")}. Skills: ${t(e.skills,"skills")}. Commands: ${t(e.commands,"commands")}. Freedom: ${n}. The grant ends on ${e.expiresAt.slice(0,10)}.`,"Anything outside the grant: say it is not covered and stop. The guest sees only your answers: never reveal other chats, agents, people or files of this node."].join(`
2
2
  `)}function q(e,t){return{agentId:e.agentId,message:t,context:{channel:"guest",chatId:`guest:${e.id}`,sender:`guest:${e.guest}`},systemPromptAppend:C(e),...e.level==="act"?{}:{autonomy:e.level}}}function B(e,t){let n=e.guests.get(t);if(!n||n.state!=="active")return null;let o=e.guests.update(t,{state:"paused",pausedAt:new Date((e.now??Date.now)()).toISOString()});return e.guests.log({grant:t,event:"paused"}),o}function U(e,t){let n=e.guests.get(t);if(!n||n.state!=="paused")return null;let o=e.guests.update(t,{state:"active",pausedAt:void 0});return e.guests.log({grant:t,event:"resumed"}),o}function v(e,t,n="ended by the host"){let o=e.guests.get(t);if(!o||o.state==="ended")return null;e.tokens.revoke(o.tokenId);let s=e.guests.update(t,{state:"ended",endedAt:new Date((e.now??Date.now)()).toISOString(),endedReason:n});return e.guests.log({grant:t,event:n==="expired"?"expired":"ended",detail:n}),s}function X(e,t,n){let o=e.guests.get(t);if(!o||o.state==="ended")return{ok:!1,error:`no open grant "${t}"`};let s={};if(n.folders!==void 0&&(s.folders=l(n.folders)),n.skills!==void 0&&(s.skills=l(n.skills)),n.commands!==void 0&&(s.commands=l(n.commands)),n.level!==void 0){let u=w.safeParse(n.level);if(!u.success)return{ok:!1,error:"level must be report, propose or act"};s.level=u.data}if(n.days!==void 0){let u=Number(n.days);if(!Number.isFinite(u)||u<1||u>y)return{ok:!1,error:`days must be between 1 and ${y}`};s.expiresAt=new Date((e.now??Date.now)()+u*864e5).toISOString()}let a=e.guests.update(t,s),r=["report","propose","act"],d=s.level&&r.indexOf(s.level)>r.indexOf(o.level)||s.folders&&s.folders.length>o.folders.length||s.skills&&s.skills.length>o.skills.length||s.commands&&s.commands.length>o.commands.length||s.expiresAt&&s.expiresAt>o.expiresAt;return e.guests.log({grant:t,event:d?"widened":"narrowed",detail:Object.keys(s).join(", ")}),{ok:!0,grant:a}}function W(e){return{grant:e.id,name:e.name,agentId:e.agentId,level:e.level,folders:e.folders,skills:e.skills,commands:e.commands,state:e.state,expiresAt:e.expiresAt,usage:e.usage}}async function L(e,t){let n=e+t-Date.now();n>0&&await new Promise(o=>setTimeout(o,n))}export{h as a,b,P as c,y as d,I as e,_ as f,M as g,j as h,Y as i,G as j,R as k,O as l,N as m,J as n,C as o,q as p,B as q,U as r,v as s,X as t,W as u};
3
- //# sourceMappingURL=chunk-QLWGLRT5.js.map
3
+ //# sourceMappingURL=chunk-TJ7IUHC7.js.map
@@ -1,5 +1,5 @@
1
- import{ja as m,ma as b}from"./chunk-FJI5GRBH.js";b();function w(t){let e=typeof t.node=="string"?t.node:"",n=typeof t.token=="string"?t.token:"";if(!e||!n)try{let o=m(t.config);e||(e=o.dashboard?.daemonUrl||""),n||(n=o.dashboard?.token||"")}catch{}return e||(e="http://localhost:18800"),{baseUrl:e.replace(/\/+$/,""),token:n}}async function d(t,e,n){let o={Accept:"application/json"};t.token&&(o.Authorization=`Bearer ${t.token}`);let r=await fetch(`${t.baseUrl}${e}`,{headers:o,signal:n});if(!r.ok)throw new Error(`GET ${e} \u2192 HTTP ${r.status}`);return await r.json()}function R(t,e){return d(t,"/agents",e)}async function S(t,e){return(await d(t,"/api/processes",e)).processes??[]}function P(t,e){return d(t,"/crons",e)}async function h(t,e,n,o){let r={Accept:"application/json","Content-Type":"application/json"};t.token&&(r.Authorization=`Bearer ${t.token}`);let s=await fetch(`${t.baseUrl}${e}`,{method:"POST",headers:r,body:JSON.stringify(n),signal:o}),a=await s.text(),i;try{i=a?JSON.parse(a):{}}catch{i={raw:a}}if(!s.ok)throw new Error(i?.error||`POST ${e} \u2192 HTTP ${s.status}`);return i}function A(t,e,n="tui"){return h(t,"/api/processes/kill",{...e,reason:n})}function C(t,e,n,o){return h(t,"/task",{agent:e,message:n,context:o??{channel:"tui",chatId:"tui:operator"}})}async function $(t,e,n,o={}){let r={Accept:"text/event-stream","Content-Type":"application/json"};t.token&&(r.Authorization=`Bearer ${t.token}`);let s=await fetch(`${t.baseUrl}/task`,{method:"POST",headers:r,body:JSON.stringify({agent:e,message:n,stream:!0,context:{channel:o.channel??"chat-cli",chatId:o.chatId??"chat-cli:operator"}}),signal:o.signal});if(!s.ok||!s.body){let g=await s.text().catch(()=>"");throw new Error(`POST /task (stream) \u2192 HTTP ${s.status}${g?`: ${g.slice(0,200)}`:""}`)}let a=s.body.getReader(),i=new TextDecoder,u={content:""},c="";try{for(;;){let{done:g,value:p}=await a.read();if(g)break;c+=i.decode(p,{stream:!0});let l;for(;(l=c.indexOf(`
1
+ import{ja as m,ma as b}from"./chunk-IMLLHT7U.js";b();function w(t){let e=typeof t.node=="string"?t.node:"",n=typeof t.token=="string"?t.token:"";if(!e||!n)try{let o=m(t.config);e||(e=o.dashboard?.daemonUrl||""),n||(n=o.dashboard?.token||"")}catch{}return e||(e="http://localhost:18800"),{baseUrl:e.replace(/\/+$/,""),token:n}}async function d(t,e,n){let o={Accept:"application/json"};t.token&&(o.Authorization=`Bearer ${t.token}`);let r=await fetch(`${t.baseUrl}${e}`,{headers:o,signal:n});if(!r.ok)throw new Error(`GET ${e} \u2192 HTTP ${r.status}`);return await r.json()}function R(t,e){return d(t,"/agents",e)}async function S(t,e){return(await d(t,"/api/processes",e)).processes??[]}function P(t,e){return d(t,"/crons",e)}async function h(t,e,n,o){let r={Accept:"application/json","Content-Type":"application/json"};t.token&&(r.Authorization=`Bearer ${t.token}`);let s=await fetch(`${t.baseUrl}${e}`,{method:"POST",headers:r,body:JSON.stringify(n),signal:o}),a=await s.text(),i;try{i=a?JSON.parse(a):{}}catch{i={raw:a}}if(!s.ok)throw new Error(i?.error||`POST ${e} \u2192 HTTP ${s.status}`);return i}function A(t,e,n="tui"){return h(t,"/api/processes/kill",{...e,reason:n})}function C(t,e,n,o){return h(t,"/task",{agent:e,message:n,context:o??{channel:"tui",chatId:"tui:operator"}})}async function $(t,e,n,o={}){let r={Accept:"text/event-stream","Content-Type":"application/json"};t.token&&(r.Authorization=`Bearer ${t.token}`);let s=await fetch(`${t.baseUrl}/task`,{method:"POST",headers:r,body:JSON.stringify({agent:e,message:n,stream:!0,context:{channel:o.channel??"chat-cli",chatId:o.chatId??"chat-cli:operator"}}),signal:o.signal});if(!s.ok||!s.body){let g=await s.text().catch(()=>"");throw new Error(`POST /task (stream) \u2192 HTTP ${s.status}${g?`: ${g.slice(0,200)}`:""}`)}let a=s.body.getReader(),i=new TextDecoder,u={content:""},c="";try{for(;;){let{done:g,value:p}=await a.read();if(g)break;c+=i.decode(p,{stream:!0});let l;for(;(l=c.indexOf(`
2
2
 
3
3
  `))>=0;){let k=c.slice(0,l);c=c.slice(l+2);let f=x(k);f&&T(f,o,u)}}}finally{try{a.releaseLock()}catch{}}return u}function T(t,e,n){let{event:o,data:r}=t;switch(o){case"text":r?.text&&(n.content+=r.text,e.onText?.(r.text));break;case"thinking":r?.text&&e.onThinking?.(r.text);break;case"tool":e.onTool?.(r);break;case"done":typeof r?.content=="string"&&(n.content=r.content),n.usage=r?.usage,n.duration=r?.duration;break;case"error":n.error=r?.error,n.errorKind=r?.errorKind;break}}function x(t){let e="message",n="";for(let r of t.split(`
4
4
  `))r.startsWith("event: ")?e=r.slice(7).trim():r.startsWith("data: ")&&(n=r.slice(6));if(!n)return null;let o;try{o=JSON.parse(n)}catch{o=n}return{event:e,data:o}}export{w as a,R as b,S as c,P as d,A as e,C as f,$ as g};
5
- //# sourceMappingURL=chunk-J2YLOGNN.js.map
5
+ //# sourceMappingURL=chunk-U46G24CD.js.map