agentix-cli 0.17.0 → 0.18.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 (149) hide show
  1. package/dist/agent-RDVGL2TW.js +2 -0
  2. package/dist/audit-Z47AQFFD.js +3 -0
  3. package/dist/audit-Z47AQFFD.js.map +1 -0
  4. package/dist/{board-dashboard-CXIVJKDP.js → board-dashboard-KX2CNOSY.js} +44 -44
  5. package/dist/board-dashboard-KX2CNOSY.js.map +1 -0
  6. package/dist/{chunk-EKTPCSN4.js → chunk-4ITQP3XL.js} +2 -2
  7. package/dist/chunk-53NRX2NA.js +2 -0
  8. package/dist/chunk-53NRX2NA.js.map +1 -0
  9. package/dist/{chunk-5WNGHDFC.js → chunk-ASSJ4Z6Z.js} +11 -11
  10. package/dist/{chunk-5WNGHDFC.js.map → chunk-ASSJ4Z6Z.js.map} +1 -1
  11. package/dist/chunk-BLUXL6HR.js +854 -0
  12. package/dist/chunk-BLUXL6HR.js.map +1 -0
  13. package/dist/chunk-BTAEYL3P.js +72 -0
  14. package/dist/chunk-BTAEYL3P.js.map +1 -0
  15. package/dist/chunk-DJEZ2HVU.js +5 -0
  16. package/dist/chunk-DJEZ2HVU.js.map +1 -0
  17. package/dist/{chunk-SRHLXZRF.js → chunk-DSCMCVTV.js} +3 -3
  18. package/dist/chunk-DSCMCVTV.js.map +1 -0
  19. package/dist/chunk-HPDHNIA3.js +2 -0
  20. package/dist/chunk-IM376SD6.js +13 -0
  21. package/dist/chunk-IM376SD6.js.map +1 -0
  22. package/dist/chunk-J4WKMKTP.js +5 -0
  23. package/dist/{chunk-MBEQASP3.js.map → chunk-J4WKMKTP.js.map} +1 -1
  24. package/dist/chunk-JGXE2YNV.js +46 -0
  25. package/dist/chunk-JGXE2YNV.js.map +1 -0
  26. package/dist/{chunk-TT2Q7YMZ.js → chunk-JXEPJ3YD.js} +6 -6
  27. package/dist/{chunk-TT2Q7YMZ.js.map → chunk-JXEPJ3YD.js.map} +1 -1
  28. package/dist/chunk-LY7JGDV7.js +6 -0
  29. package/dist/chunk-LY7JGDV7.js.map +1 -0
  30. package/dist/chunk-SR3X25TN.js +3 -0
  31. package/dist/chunk-SR3X25TN.js.map +1 -0
  32. package/dist/{chunk-63UYRJIC.js → chunk-TRQSP67X.js} +2 -2
  33. package/dist/chunk-U364GNQX.js +719 -0
  34. package/dist/chunk-U364GNQX.js.map +1 -0
  35. package/dist/chunk-VJUTQAPJ.js +2 -0
  36. package/dist/chunk-VJUTQAPJ.js.map +1 -0
  37. package/dist/cli.js +1 -1
  38. package/dist/cli.js.map +1 -1
  39. package/dist/{compaction-X46EQEPS.js → compaction-S5H6DTOR.js} +4 -4
  40. package/dist/config-UOHEG4BW.js +2 -0
  41. package/dist/config-mutator-KSEBWKJH.js +2 -0
  42. package/dist/{context-planner-G2J7FNNU.js → context-planner-2RGHJHSO.js} +3 -3
  43. package/dist/debug-TGAP7E7W.js +2 -0
  44. package/dist/discover-OATU7SHI.js +4 -0
  45. package/dist/discover-OATU7SHI.js.map +1 -0
  46. package/dist/{editor-chat-R54E65W5.js → editor-chat-FUBQLMAQ.js} +2 -2
  47. package/dist/heal-YP7QI7D3.js +2 -0
  48. package/dist/{inbox-L5ZZ623Y.js → inbox-O5UB3YQN.js} +2 -2
  49. package/dist/index.d.ts +462 -22
  50. package/dist/index.js +8 -8
  51. package/dist/index.js.map +1 -1
  52. package/dist/{ingest-whatsapp-NS4OWDOU.js → ingest-whatsapp-C3O5UPBX.js} +2 -2
  53. package/dist/loader-BGWA7IRY.js +2 -0
  54. package/dist/loader-LBHKSXBK.js +2 -0
  55. package/dist/memory-extract-KKPKAOPH.js +2 -0
  56. package/dist/{processes-XF5CV4LK.js → processes-7W27G3J3.js} +2 -2
  57. package/dist/program-2MDELQLX.js +2 -0
  58. package/dist/providers-WCQSKTNP.js +2 -0
  59. package/dist/query-FZAL7AQD.js +2 -0
  60. package/dist/recipes-LZ56TA3X.js +2 -0
  61. package/dist/registry-ONJSILH4.js +2 -0
  62. package/dist/scheduler-XRM2RJIV.js +2 -0
  63. package/dist/{slack-PSQLVTGB.js → slack-D27BE37Q.js} +2 -2
  64. package/dist/store-4UCO56K2.js +2 -0
  65. package/dist/{subagent-2SJHSSJS.js → subagent-EPOT3QDM.js} +2 -2
  66. package/dist/{task-store-NM7VKNLE.js → task-store-3NUWLYRY.js} +2 -2
  67. package/dist/{telegram-W4SLFMNY.js → telegram-UWV67KWG.js} +2 -2
  68. package/dist/timers-QB4KYNAE.js +2 -0
  69. package/dist/types-ECMEC5BZ.js +2 -0
  70. package/dist/types-TTB6DJUE.js +2 -0
  71. package/dist/{usage-dashboard-AXPXB2KP.js → usage-dashboard-FQGPPABD.js} +2 -2
  72. package/dist/web/workflow-editor.global.js +35 -12
  73. package/dist/web/workflow-editor.global.js.map +1 -1
  74. package/dist/{whatsapp-DCHRBRVV.js → whatsapp-KJ2NRKKQ.js} +2 -2
  75. package/dist/{whatsapp-state-6D6FHHD2.js → whatsapp-state-3ZVQ6MQD.js} +2 -2
  76. package/dist/{wiki-UDPYFJBL.js → wiki-OUYKM7MB.js} +2 -2
  77. package/dist/wiki-OUYKM7MB.js.map +1 -0
  78. package/dist/workspace-setup-6GDBEORT.js +2 -0
  79. package/dist/workspace-setup-6GDBEORT.js.map +1 -0
  80. package/package.json +11 -1
  81. package/dist/agent-4AOMVXRJ.js +0 -2
  82. package/dist/board-dashboard-CXIVJKDP.js.map +0 -1
  83. package/dist/chunk-4HP6UC2X.js +0 -13
  84. package/dist/chunk-4HP6UC2X.js.map +0 -1
  85. package/dist/chunk-ABCHHNG6.js +0 -625
  86. package/dist/chunk-ABCHHNG6.js.map +0 -1
  87. package/dist/chunk-FIOB3MEX.js +0 -2
  88. package/dist/chunk-HCFSHGK4.js +0 -46
  89. package/dist/chunk-HCFSHGK4.js.map +0 -1
  90. package/dist/chunk-HHJGKD5B.js +0 -71
  91. package/dist/chunk-HHJGKD5B.js.map +0 -1
  92. package/dist/chunk-MBEQASP3.js +0 -5
  93. package/dist/chunk-MCJUAE6V.js +0 -6
  94. package/dist/chunk-MCJUAE6V.js.map +0 -1
  95. package/dist/chunk-SRHLXZRF.js.map +0 -1
  96. package/dist/chunk-XDJSYQST.js +0 -6
  97. package/dist/chunk-XDJSYQST.js.map +0 -1
  98. package/dist/chunk-YPOELN6Z.js +0 -798
  99. package/dist/chunk-YPOELN6Z.js.map +0 -1
  100. package/dist/config-KCYHMKCT.js +0 -2
  101. package/dist/config-mutator-QP4GLBOE.js +0 -2
  102. package/dist/debug-3MEUO2P2.js +0 -2
  103. package/dist/heal-JDXUPRET.js +0 -2
  104. package/dist/loader-PTCXLJEX.js +0 -2
  105. package/dist/memory-extract-WH4FZ456.js +0 -2
  106. package/dist/program-FFWEILAS.js +0 -2
  107. package/dist/providers-AKQ4HTB4.js +0 -2
  108. package/dist/query-PKGYE5HR.js +0 -2
  109. package/dist/registry-IFMDJWQ7.js +0 -2
  110. package/dist/scheduler-63D5KFO7.js +0 -2
  111. package/dist/store-5MJOO74U.js +0 -2
  112. package/dist/timers-PCB4ZIBD.js +0 -2
  113. package/dist/types-C7IFH42Z.js +0 -2
  114. package/dist/types-OIFU3KSQ.js +0 -2
  115. package/dist/workspace-setup-C4VB3QZV.js +0 -2
  116. /package/dist/{agent-4AOMVXRJ.js.map → agent-RDVGL2TW.js.map} +0 -0
  117. /package/dist/{chunk-EKTPCSN4.js.map → chunk-4ITQP3XL.js.map} +0 -0
  118. /package/dist/{chunk-FIOB3MEX.js.map → chunk-HPDHNIA3.js.map} +0 -0
  119. /package/dist/{chunk-63UYRJIC.js.map → chunk-TRQSP67X.js.map} +0 -0
  120. /package/dist/{compaction-X46EQEPS.js.map → compaction-S5H6DTOR.js.map} +0 -0
  121. /package/dist/{config-KCYHMKCT.js.map → config-UOHEG4BW.js.map} +0 -0
  122. /package/dist/{config-mutator-QP4GLBOE.js.map → config-mutator-KSEBWKJH.js.map} +0 -0
  123. /package/dist/{context-planner-G2J7FNNU.js.map → context-planner-2RGHJHSO.js.map} +0 -0
  124. /package/dist/{debug-3MEUO2P2.js.map → debug-TGAP7E7W.js.map} +0 -0
  125. /package/dist/{editor-chat-R54E65W5.js.map → editor-chat-FUBQLMAQ.js.map} +0 -0
  126. /package/dist/{heal-JDXUPRET.js.map → heal-YP7QI7D3.js.map} +0 -0
  127. /package/dist/{inbox-L5ZZ623Y.js.map → inbox-O5UB3YQN.js.map} +0 -0
  128. /package/dist/{ingest-whatsapp-NS4OWDOU.js.map → ingest-whatsapp-C3O5UPBX.js.map} +0 -0
  129. /package/dist/{loader-PTCXLJEX.js.map → loader-BGWA7IRY.js.map} +0 -0
  130. /package/dist/{memory-extract-WH4FZ456.js.map → loader-LBHKSXBK.js.map} +0 -0
  131. /package/dist/{program-FFWEILAS.js.map → memory-extract-KKPKAOPH.js.map} +0 -0
  132. /package/dist/{processes-XF5CV4LK.js.map → processes-7W27G3J3.js.map} +0 -0
  133. /package/dist/{providers-AKQ4HTB4.js.map → program-2MDELQLX.js.map} +0 -0
  134. /package/dist/{query-PKGYE5HR.js.map → providers-WCQSKTNP.js.map} +0 -0
  135. /package/dist/{registry-IFMDJWQ7.js.map → query-FZAL7AQD.js.map} +0 -0
  136. /package/dist/{scheduler-63D5KFO7.js.map → recipes-LZ56TA3X.js.map} +0 -0
  137. /package/dist/{store-5MJOO74U.js.map → registry-ONJSILH4.js.map} +0 -0
  138. /package/dist/{task-store-NM7VKNLE.js.map → scheduler-XRM2RJIV.js.map} +0 -0
  139. /package/dist/{slack-PSQLVTGB.js.map → slack-D27BE37Q.js.map} +0 -0
  140. /package/dist/{timers-PCB4ZIBD.js.map → store-4UCO56K2.js.map} +0 -0
  141. /package/dist/{subagent-2SJHSSJS.js.map → subagent-EPOT3QDM.js.map} +0 -0
  142. /package/dist/{types-C7IFH42Z.js.map → task-store-3NUWLYRY.js.map} +0 -0
  143. /package/dist/{telegram-W4SLFMNY.js.map → telegram-UWV67KWG.js.map} +0 -0
  144. /package/dist/{types-OIFU3KSQ.js.map → timers-QB4KYNAE.js.map} +0 -0
  145. /package/dist/{wiki-UDPYFJBL.js.map → types-ECMEC5BZ.js.map} +0 -0
  146. /package/dist/{workspace-setup-C4VB3QZV.js.map → types-TTB6DJUE.js.map} +0 -0
  147. /package/dist/{usage-dashboard-AXPXB2KP.js.map → usage-dashboard-FQGPPABD.js.map} +0 -0
  148. /package/dist/{whatsapp-DCHRBRVV.js.map → whatsapp-KJ2NRKKQ.js.map} +0 -0
  149. /package/dist/{whatsapp-state-6D6FHHD2.js.map → whatsapp-state-3ZVQ6MQD.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import{a as S,b as We,c as Ke,d as Je,e as D,f as K,g as de}from"./chunk-5WNGHDFC.js";import{a as E,b as C,g as ze,h as qe,i as R,j as N,k as Y,l as Ge,m as Fe,n as Ue}from"./chunk-6PPIFDOQ.js";import{a as ie,b as le,c as Oe,d as Re,e as Ne,i as je}from"./chunk-4HP6UC2X.js";import"./chunk-SRHLXZRF.js";import"./chunk-MBEQASP3.js";import"./chunk-N67JZAXU.js";import{f as Be}from"./chunk-CDNWCYF7.js";import"./chunk-AFRHKA7B.js";import"./chunk-EW27SCCC.js";import{a as Pe}from"./chunk-5F3J55LG.js";import{b as Le}from"./chunk-WZEYII2S.js";import{a as De,b as He,c as Pt,f as M,h as Dt,i as V}from"./chunk-XDJSYQST.js";import{a as Ie,d as Lt}from"./chunk-FIOB3MEX.js";Pt();import{createServer as kn}from"http";import{appendFileSync as Sn,existsSync as En,mkdirSync as _n}from"fs";import{readFile as Tn}from"fs/promises";import{fileURLToPath as Cn}from"url";import{dirname as An,resolve as se}from"path";var Xe='/*! Sortable 1.15.2 - MIT | git://github.com/SortableJS/Sortable.git */\n!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function e(e,t){var n,o=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),o.push.apply(o,n)),o}function I(o){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?e(Object(i),!0).forEach(function(t){var e,n;e=o,t=i[n=t],n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t}):Object.getOwnPropertyDescriptors?Object.defineProperties(o,Object.getOwnPropertyDescriptors(i)):e(Object(i)).forEach(function(t){Object.defineProperty(o,t,Object.getOwnPropertyDescriptor(i,t))})}return o}function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function a(){return(a=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n,o=arguments[e];for(n in o)Object.prototype.hasOwnProperty.call(o,n)&&(t[n]=o[n])}return t}).apply(this,arguments)}function i(t,e){if(null==t)return{};var n,o=function(t,e){if(null==t)return{};for(var n,o={},i=Object.keys(t),r=0;r<i.length;r++)n=i[r],0<=e.indexOf(n)||(o[n]=t[n]);return o}(t,e);if(Object.getOwnPropertySymbols)for(var i=Object.getOwnPropertySymbols(t),r=0;r<i.length;r++)n=i[r],0<=e.indexOf(n)||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n]);return o}function r(t){return function(t){if(Array.isArray(t))return l(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return l(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Map"===(n="Object"===n&&t.constructor?t.constructor.name:n)||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,o=new Array(e);n<e;n++)o[n]=t[n];return o}function t(t){if("undefined"!=typeof window&&window.navigator)return!!navigator.userAgent.match(t)}var y=t(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i),w=t(/Edge/i),s=t(/firefox/i),u=t(/safari/i)&&!t(/chrome/i)&&!t(/android/i),n=t(/iP(ad|od|hone)/i),c=t(/chrome/i)&&t(/android/i),d={capture:!1,passive:!1};function h(t,e,n){t.addEventListener(e,n,!y&&d)}function f(t,e,n){t.removeEventListener(e,n,!y&&d)}function p(t,e){if(e&&(">"===e[0]&&(e=e.substring(1)),t))try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"!==e[0]||t.parentNode===n)&&p(t,e)||o&&t===n)return t}while(t!==n&&(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode))}var i;return null}var g,m=/\\s+/g;function k(t,e,n){var o;t&&e&&(t.classList?t.classList[n?"add":"remove"](e):(o=(" "+t.className+" ").replace(m," ").replace(" "+e+" "," "),t.className=(o+(n?" "+e:"")).replace(m," ")))}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];o[e=!(e in o||-1!==e.indexOf("webkit"))?"-webkit-"+e:e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform")}while(o&&"none"!==o&&(n=o+" "+n),!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function b(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i<r;i++)n(o[i],i);return o}return[]}function O(){var t=document.scrollingElement;return t||document.documentElement}function X(t,e,n,o,i){if(t.getBoundingClientRect||t===window){var r,a,l,s,c,u,d=t!==window&&t.parentNode&&t!==O()?(a=(r=t.getBoundingClientRect()).top,l=r.left,s=r.bottom,c=r.right,u=r.height,r.width):(l=a=0,s=window.innerHeight,c=window.innerWidth,u=window.innerHeight,window.innerWidth);if((e||n)&&t!==window&&(i=i||t.parentNode,!y))do{if(i&&i.getBoundingClientRect&&("none"!==R(i,"transform")||n&&"static"!==R(i,"position"))){var h=i.getBoundingClientRect();a-=h.top+parseInt(R(i,"border-top-width")),l-=h.left+parseInt(R(i,"border-left-width")),s=a+r.height,c=l+r.width;break}}while(i=i.parentNode);return o&&t!==window&&(o=(e=v(i||t))&&e.a,t=e&&e.d,e&&(s=(a/=t)+(u/=t),c=(l/=o)+(d/=o))),{top:a,left:l,bottom:s,right:c,width:d,height:u}}}function Y(t,e,n){for(var o=M(t,!0),i=X(t)[e];o;){var r=X(o)[n];if(!("top"===n||"left"===n?r<=i:i<=r))return o;if(o===O())break;o=M(o,!1)}return!1}function B(t,e,n,o){for(var i=0,r=0,a=t.children;r<a.length;){if("none"!==a[r].style.display&&a[r]!==Ft.ghost&&(o||a[r]!==Ft.dragged)&&P(a[r],n.draggable,t,!1)){if(i===e)return a[r];i++}r++}return null}function F(t,e){for(var n=t.lastElementChild;n&&(n===Ft.ghost||"none"===R(n,"display")||e&&!p(n,e));)n=n.previousElementSibling;return n||null}function j(t,e){var n=0;if(!t||!t.parentNode)return-1;for(;t=t.previousElementSibling;)"TEMPLATE"===t.nodeName.toUpperCase()||t===Ft.clone||e&&!p(t,e)||n++;return n}function E(t){var e=0,n=0,o=O();if(t)do{var i=v(t),r=i.a,i=i.d}while(e+=t.scrollLeft*r,n+=t.scrollTop*i,t!==o&&(t=t.parentNode));return[e,n]}function M(t,e){if(!t||!t.getBoundingClientRect)return O();var n=t,o=!1;do{if(n.clientWidth<n.scrollWidth||n.clientHeight<n.scrollHeight){var i=R(n);if(n.clientWidth<n.scrollWidth&&("auto"==i.overflowX||"scroll"==i.overflowX)||n.clientHeight<n.scrollHeight&&("auto"==i.overflowY||"scroll"==i.overflowY)){if(!n.getBoundingClientRect||n===document.body)return O();if(o||e)return n;o=!0}}}while(n=n.parentNode);return O()}function D(t,e){return Math.round(t.top)===Math.round(e.top)&&Math.round(t.left)===Math.round(e.left)&&Math.round(t.height)===Math.round(e.height)&&Math.round(t.width)===Math.round(e.width)}function S(e,n){return function(){var t;g||(1===(t=arguments).length?e.call(this,t[0]):e.apply(this,t),g=setTimeout(function(){g=void 0},n))}}function H(t,e,n){t.scrollLeft+=e,t.scrollTop+=n}function _(t){var e=window.Polymer,n=window.jQuery||window.Zepto;return e&&e.dom?e.dom(t).cloneNode(!0):n?n(t).clone(!0)[0]:t.cloneNode(!0)}function C(t,e){R(t,"position","absolute"),R(t,"top",e.top),R(t,"left",e.left),R(t,"width",e.width),R(t,"height",e.height)}function T(t){R(t,"position",""),R(t,"top",""),R(t,"left",""),R(t,"width",""),R(t,"height","")}function L(n,o,i){var r={};return Array.from(n.children).forEach(function(t){var e;P(t,o.draggable,n,!1)&&!t.animated&&t!==i&&(e=X(t),r.left=Math.min(null!==(t=r.left)&&void 0!==t?t:1/0,e.left),r.top=Math.min(null!==(t=r.top)&&void 0!==t?t:1/0,e.top),r.right=Math.max(null!==(t=r.right)&&void 0!==t?t:-1/0,e.right),r.bottom=Math.max(null!==(t=r.bottom)&&void 0!==t?t:-1/0,e.bottom))}),r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}var K="Sortable"+(new Date).getTime();function x(){var e,o=[];return{captureAnimationState:function(){o=[],this.options.animation&&[].slice.call(this.el.children).forEach(function(t){var e,n;"none"!==R(t,"display")&&t!==Ft.ghost&&(o.push({target:t,rect:X(t)}),e=I({},o[o.length-1].rect),!t.thisAnimationDuration||(n=v(t,!0))&&(e.top-=n.f,e.left-=n.e),t.fromRect=e)})},addAnimationState:function(t){o.push(t)},removeAnimationState:function(t){o.splice(function(t,e){for(var n in t)if(t.hasOwnProperty(n))for(var o in e)if(e.hasOwnProperty(o)&&e[o]===t[n][o])return Number(n);return-1}(o,{target:t}),1)},animateAll:function(t){var c=this;if(!this.options.animation)return clearTimeout(e),void("function"==typeof t&&t());var u=!1,d=0;o.forEach(function(t){var e=0,n=t.target,o=n.fromRect,i=X(n),r=n.prevFromRect,a=n.prevToRect,l=t.rect,s=v(n,!0);s&&(i.top-=s.f,i.left-=s.e),n.toRect=i,n.thisAnimationDuration&&D(r,i)&&!D(o,i)&&(l.top-i.top)/(l.left-i.left)==(o.top-i.top)/(o.left-i.left)&&(t=l,s=r,r=a,a=c.options,e=Math.sqrt(Math.pow(s.top-t.top,2)+Math.pow(s.left-t.left,2))/Math.sqrt(Math.pow(s.top-r.top,2)+Math.pow(s.left-r.left,2))*a.animation),D(i,o)||(n.prevFromRect=o,n.prevToRect=i,e=e||c.options.animation,c.animate(n,l,i,e)),e&&(u=!0,d=Math.max(d,e),clearTimeout(n.animationResetTimer),n.animationResetTimer=setTimeout(function(){n.animationTime=0,n.prevFromRect=null,n.fromRect=null,n.prevToRect=null,n.thisAnimationDuration=null},e),n.thisAnimationDuration=e)}),clearTimeout(e),u?e=setTimeout(function(){"function"==typeof t&&t()},d):"function"==typeof t&&t(),o=[]},animate:function(t,e,n,o){var i,r;o&&(R(t,"transition",""),R(t,"transform",""),i=(r=v(this.el))&&r.a,r=r&&r.d,i=(e.left-n.left)/(i||1),r=(e.top-n.top)/(r||1),t.animatingX=!!i,t.animatingY=!!r,R(t,"transform","translate3d("+i+"px,"+r+"px,0)"),this.forRepaintDummy=t.offsetWidth,R(t,"transition","transform "+o+"ms"+(this.options.easing?" "+this.options.easing:"")),R(t,"transform","translate3d(0,0,0)"),"number"==typeof t.animated&&clearTimeout(t.animated),t.animated=setTimeout(function(){R(t,"transition",""),R(t,"transform",""),t.animated=!1,t.animatingX=!1,t.animatingY=!1},o))}}}var A=[],N={initializeByDefault:!0},W={mount:function(e){for(var t in N)!N.hasOwnProperty(t)||t in e||(e[t]=N[t]);A.forEach(function(t){if(t.pluginName===e.pluginName)throw"Sortable: Cannot mount plugin ".concat(e.pluginName," more than once")}),A.push(e)},pluginEvent:function(e,n,o){var t=this;this.eventCanceled=!1,o.cancel=function(){t.eventCanceled=!0};var i=e+"Global";A.forEach(function(t){n[t.pluginName]&&(n[t.pluginName][i]&&n[t.pluginName][i](I({sortable:n},o)),n.options[t.pluginName]&&n[t.pluginName][e]&&n[t.pluginName][e](I({sortable:n},o)))})},initializePlugins:function(n,o,i,t){for(var e in A.forEach(function(t){var e=t.pluginName;(n.options[e]||t.initializeByDefault)&&((t=new t(n,o,n.options)).sortable=n,t.options=n.options,n[e]=t,a(i,t.defaults))}),n.options){var r;n.options.hasOwnProperty(e)&&(void 0!==(r=this.modifyOption(n,e,n.options[e]))&&(n.options[e]=r))}},getEventProperties:function(e,n){var o={};return A.forEach(function(t){"function"==typeof t.eventProperties&&a(o,t.eventProperties.call(n[t.pluginName],e))}),o},modifyOption:function(e,n,o){var i;return A.forEach(function(t){e[t.pluginName]&&t.optionListeners&&"function"==typeof t.optionListeners[n]&&(i=t.optionListeners[n].call(e[t.pluginName],o))}),i}};function z(t){var e=t.sortable,n=t.rootEl,o=t.name,i=t.targetEl,r=t.cloneEl,a=t.toEl,l=t.fromEl,s=t.oldIndex,c=t.newIndex,u=t.oldDraggableIndex,d=t.newDraggableIndex,h=t.originalEvent,f=t.putSortable,p=t.extraEventProperties;if(e=e||n&&n[K]){var g,m=e.options,t="on"+o.charAt(0).toUpperCase()+o.substr(1);!window.CustomEvent||y||w?(g=document.createEvent("Event")).initEvent(o,!0,!0):g=new CustomEvent(o,{bubbles:!0,cancelable:!0}),g.to=a||n,g.from=l||n,g.item=i||n,g.clone=r,g.oldIndex=s,g.newIndex=c,g.oldDraggableIndex=u,g.newDraggableIndex=d,g.originalEvent=h,g.pullMode=f?f.lastPutMode:void 0;var v,b=I(I({},p),W.getEventProperties(o,e));for(v in b)g[v]=b[v];n&&n.dispatchEvent(g),m[t]&&m[t].call(e,g)}}function G(t,e){var n=(o=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{}).evt,o=i(o,U);W.pluginEvent.bind(Ft)(t,e,I({dragEl:V,parentEl:Z,ghostEl:$,rootEl:Q,nextEl:J,lastDownEl:tt,cloneEl:et,cloneHidden:nt,dragStarted:gt,putSortable:st,activeSortable:Ft.active,originalEvent:n,oldIndex:ot,oldDraggableIndex:rt,newIndex:it,newDraggableIndex:at,hideGhostForTarget:Rt,unhideGhostForTarget:Xt,cloneNowHidden:function(){nt=!0},cloneNowShown:function(){nt=!1},dispatchSortableEvent:function(t){q({sortable:e,name:t,originalEvent:n})}},o))}var U=["evt"];function q(t){z(I({putSortable:st,cloneEl:et,targetEl:V,rootEl:Q,oldIndex:ot,oldDraggableIndex:rt,newIndex:it,newDraggableIndex:at},t))}var V,Z,$,Q,J,tt,et,nt,ot,it,rt,at,lt,st,ct,ut,dt,ht,ft,pt,gt,mt,vt,bt,yt,wt=!1,Et=!1,Dt=[],St=!1,_t=!1,Ct=[],Tt=!1,xt=[],Ot="undefined"!=typeof document,Mt=n,At=w||y?"cssFloat":"float",Nt=Ot&&!c&&!n&&"draggable"in document.createElement("div"),It=function(){if(Ot){if(y)return!1;var t=document.createElement("x");return t.style.cssText="pointer-events:auto","auto"===t.style.pointerEvents}}(),Pt=function(t,e){var n=R(t),o=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),i=B(t,0,e),r=B(t,1,e),a=i&&R(i),l=r&&R(r),s=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+X(i).width,t=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+X(r).width;if("flex"===n.display)return"column"===n.flexDirection||"column-reverse"===n.flexDirection?"vertical":"horizontal";if("grid"===n.display)return n.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(i&&a.float&&"none"!==a.float){e="left"===a.float?"left":"right";return!r||"both"!==l.clear&&l.clear!==e?"horizontal":"vertical"}return i&&("block"===a.display||"flex"===a.display||"table"===a.display||"grid"===a.display||o<=s&&"none"===n[At]||r&&"none"===n[At]&&o<s+t)?"vertical":"horizontal"},kt=function(t){function l(r,a){return function(t,e,n,o){var i=t.options.group.name&&e.options.group.name&&t.options.group.name===e.options.group.name;if(null==r&&(a||i))return!0;if(null==r||!1===r)return!1;if(a&&"clone"===r)return r;if("function"==typeof r)return l(r(t,e,n,o),a)(t,e,n,o);e=(a?t:e).options.group.name;return!0===r||"string"==typeof r&&r===e||r.join&&-1<r.indexOf(e)}}var e={},n=t.group;n&&"object"==o(n)||(n={name:n}),e.name=n.name,e.checkPull=l(n.pull,!0),e.checkPut=l(n.put),e.revertClone=n.revertClone,t.group=e},Rt=function(){!It&&$&&R($,"display","none")},Xt=function(){!It&&$&&R($,"display","")};Ot&&!c&&document.addEventListener("click",function(t){if(Et)return t.preventDefault(),t.stopPropagation&&t.stopPropagation(),t.stopImmediatePropagation&&t.stopImmediatePropagation(),Et=!1},!0);function Yt(t){if(V){t=t.touches?t.touches[0]:t;var e=(i=t.clientX,r=t.clientY,Dt.some(function(t){var e=t[K].options.emptyInsertThreshold;if(e&&!F(t)){var n=X(t),o=i>=n.left-e&&i<=n.right+e,e=r>=n.top-e&&r<=n.bottom+e;return o&&e?a=t:void 0}}),a);if(e){var n,o={};for(n in t)t.hasOwnProperty(n)&&(o[n]=t[n]);o.target=o.rootEl=e,o.preventDefault=void 0,o.stopPropagation=void 0,e[K]._onDragOver(o)}}var i,r,a}function Bt(t){V&&V.parentNode[K]._isOutsideThisEl(t.target)}function Ft(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[K]=this;var n,o,i={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Pt(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Ft.supportPointer&&"PointerEvent"in window&&!u,emptyInsertThreshold:5};for(n in W.initializePlugins(this,t,i),i)n in e||(e[n]=i[n]);for(o in kt(e),this)"_"===o.charAt(0)&&"function"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!e.forceFallback&&Nt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?h(t,"pointerdown",this._onTapStart):(h(t,"mousedown",this._onTapStart),h(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(h(t,"dragover",this),h(t,"dragenter",this)),Dt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,x())}function jt(t,e,n,o,i,r,a,l){var s,c,u=t[K],d=u.options.onMove;return!window.CustomEvent||y||w?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),c=d?d.call(u,s,a):c}function Ht(t){t.draggable=!1}function Lt(){Tt=!1}function Kt(t){return setTimeout(t,0)}function Wt(t){return clearTimeout(t)}Ft.prototype={constructor:Ft,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(mt=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,V):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(!function(t){xt.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&xt.push(o)}}(o),!V&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled)&&!s.isContentEditable&&(this.nativeDraggable||!u||!l||"SELECT"!==l.tagName.toUpperCase())&&!((l=P(l,t.draggable,o,!1))&&l.animated||tt===l)){if(ot=j(l),rt=j(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return q({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),G("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c=c&&c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return q({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),G("filter",n,{evt:e}),!0}))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;n&&!V&&n.parentNode===r&&(o=X(n),Q=r,Z=(V=n).parentNode,J=V.nextSibling,tt=n,lt=a.group,ct={target:Ft.dragged=V,clientX:(e||t).clientX,clientY:(e||t).clientY},ft=ct.clientX-o.left,pt=ct.clientY-o.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,V.style["will-change"]="all",o=function(){G("delayEnded",i,{evt:t}),Ft.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!s&&i.nativeDraggable&&(V.draggable=!0),i._triggerDragStart(t,e),q({sortable:i,name:"choose",originalEvent:t}),k(V,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){b(V,t.trim(),Ht)}),h(l,"dragover",Yt),h(l,"mousemove",Yt),h(l,"touchmove",Yt),h(l,"mouseup",i._onDrop),h(l,"touchend",i._onDrop),h(l,"touchcancel",i._onDrop),s&&this.nativeDraggable&&(this.options.touchStartThreshold=4,V.draggable=!0),G("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(w||y)?o():Ft.eventCanceled?this._onDrop():(h(l,"mouseup",i._disableDelayedDrag),h(l,"touchend",i._disableDelayedDrag),h(l,"touchcancel",i._disableDelayedDrag),h(l,"mousemove",i._delayedDragTouchMoveHandler),h(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&h(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)))},_delayedDragTouchMoveHandler:function(t){t=t.touches?t.touches[0]:t;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){V&&Ht(V),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;f(t,"mouseup",this._disableDelayedDrag),f(t,"touchend",this._disableDelayedDrag),f(t,"touchcancel",this._disableDelayedDrag),f(t,"mousemove",this._delayedDragTouchMoveHandler),f(t,"touchmove",this._delayedDragTouchMoveHandler),f(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?h(document,"pointermove",this._onTouchMove):h(document,e?"touchmove":"mousemove",this._onTouchMove):(h(V,"dragend",this),h(Q,"dragstart",this._onDragStart));try{document.selection?Kt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){var n;wt=!1,Q&&V?(G("dragStarted",this,{evt:e}),this.nativeDraggable&&h(document,"dragover",Bt),n=this.options,t||k(V,n.dragClass,!1),k(V,n.ghostClass,!0),Ft.active=this,t&&this._appendGhost(),q({sortable:this,name:"start",originalEvent:e})):this._nulling()},_emulateDragOver:function(){if(ut){this._lastX=ut.clientX,this._lastY=ut.clientY,Rt();for(var t=document.elementFromPoint(ut.clientX,ut.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(ut.clientX,ut.clientY))!==e;)e=t;if(V.parentNode[K]._isOutsideThisEl(t),e)do{if(e[K])if(e[K]._onDragOver({clientX:ut.clientX,clientY:ut.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}while(e=(t=e).parentNode);Xt()}},_onTouchMove:function(t){if(ct){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=$&&v($,!0),a=$&&r&&r.a,l=$&&r&&r.d,e=Mt&&yt&&E(yt),a=(i.clientX-ct.clientX+o.x)/(a||1)+(e?e[0]-Ct[0]:0)/(a||1),l=(i.clientY-ct.clientY+o.y)/(l||1)+(e?e[1]-Ct[1]:0)/(l||1);if(!Ft.active&&!wt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))<n)return;this._onDragStart(t,!0)}$&&(r?(r.e+=a-(dt||0),r.f+=l-(ht||0)):r={a:1,b:0,c:0,d:1,e:a,f:l},r="matrix(".concat(r.a,",").concat(r.b,",").concat(r.c,",").concat(r.d,",").concat(r.e,",").concat(r.f,")"),R($,"webkitTransform",r),R($,"mozTransform",r),R($,"msTransform",r),R($,"transform",r),dt=a,ht=l,ut=i),t.cancelable&&t.preventDefault()}},_appendGhost:function(){if(!$){var t=this.options.fallbackOnBody?document.body:Q,e=X(V,!0,Mt,!0,t),n=this.options;if(Mt){for(yt=t;"static"===R(yt,"position")&&"none"===R(yt,"transform")&&yt!==document;)yt=yt.parentNode;yt!==document.body&&yt!==document.documentElement?(yt===document&&(yt=O()),e.top+=yt.scrollTop,e.left+=yt.scrollLeft):yt=O(),Ct=E(yt)}k($=V.cloneNode(!0),n.ghostClass,!1),k($,n.fallbackClass,!0),k($,n.dragClass,!0),R($,"transition",""),R($,"transform",""),R($,"box-sizing","border-box"),R($,"margin",0),R($,"top",e.top),R($,"left",e.left),R($,"width",e.width),R($,"height",e.height),R($,"opacity","0.8"),R($,"position",Mt?"absolute":"fixed"),R($,"zIndex","100000"),R($,"pointerEvents","none"),Ft.ghost=$,t.appendChild($),R($,"transform-origin",ft/parseInt($.style.width)*100+"% "+pt/parseInt($.style.height)*100+"%")}},_onDragStart:function(t,e){var n=this,o=t.dataTransfer,i=n.options;G("dragStart",this,{evt:t}),Ft.eventCanceled?this._onDrop():(G("setupClone",this),Ft.eventCanceled||((et=_(V)).removeAttribute("id"),et.draggable=!1,et.style["will-change"]="",this._hideClone(),k(et,this.options.chosenClass,!1),Ft.clone=et),n.cloneId=Kt(function(){G("clone",n),Ft.eventCanceled||(n.options.removeCloneOnHide||Q.insertBefore(et,V),n._hideClone(),q({sortable:n,name:"clone"}))}),e||k(V,i.dragClass,!0),e?(Et=!0,n._loopId=setInterval(n._emulateDragOver,50)):(f(document,"mouseup",n._onDrop),f(document,"touchend",n._onDrop),f(document,"touchcancel",n._onDrop),o&&(o.effectAllowed="move",i.setData&&i.setData.call(n,o,V)),h(document,"drop",n),R(V,"transform","translateZ(0)")),wt=!0,n._dragStartId=Kt(n._dragStarted.bind(n,e,t)),h(document,"selectstart",n),gt=!0,u&&R(document.body,"user-select","none"))},_onDragOver:function(n){var o,i,r,t,e,a=this.el,l=n.target,s=this.options,c=s.group,u=Ft.active,d=lt===c,h=s.sort,f=st||u,p=this,g=!1;if(!Tt){if(void 0!==n.preventDefault&&n.cancelable&&n.preventDefault(),l=P(l,s.draggable,a,!0),O("dragOver"),Ft.eventCanceled)return g;if(V.contains(n.target)||l.animated&&l.animatingX&&l.animatingY||p._ignoreWhileAnimating===l)return A(!1);if(Et=!1,u&&!s.disabled&&(d?h||(i=Z!==Q):st===this||(this.lastPutMode=lt.checkPull(this,u,V,n))&&c.checkPut(this,u,V,n))){if(r="vertical"===this._getDirection(n,l),o=X(V),O("dragOverValid"),Ft.eventCanceled)return g;if(i)return Z=Q,M(),this._hideClone(),O("revert"),Ft.eventCanceled||(J?Q.insertBefore(V,J):Q.appendChild(V)),A(!0);var m=F(a,s.draggable);if(m&&(S=n,c=r,x=X(F((D=this).el,D.options.draggable)),D=L(D.el,D.options,$),!(c?S.clientX>D.right+10||S.clientY>x.bottom&&S.clientX>x.left:S.clientY>D.bottom+10||S.clientX>x.right&&S.clientY>x.top)||m.animated)){if(m&&(t=n,e=r,C=X(B((_=this).el,0,_.options,!0)),_=L(_.el,_.options,$),e?t.clientX<_.left-10||t.clientY<C.top&&t.clientX<C.right:t.clientY<_.top-10||t.clientY<C.bottom&&t.clientX<C.left)){var v=B(a,0,s,!0);if(v===V)return A(!1);if(E=X(l=v),!1!==jt(Q,a,V,o,l,E,n,!1))return M(),a.insertBefore(V,v),Z=a,N(),A(!0)}else if(l.parentNode===a){var b,y,w,E=X(l),D=V.parentNode!==a,S=(S=V.animated&&V.toRect||o,x=l.animated&&l.toRect||E,_=(e=r)?S.left:S.top,t=e?S.right:S.bottom,C=e?S.width:S.height,v=e?x.left:x.top,S=e?x.right:x.bottom,x=e?x.width:x.height,!(_===v||t===S||_+C/2===v+x/2)),_=r?"top":"left",C=Y(l,"top","top")||Y(V,"top","top"),v=C?C.scrollTop:void 0;if(mt!==l&&(y=E[_],St=!1,_t=!S&&s.invertSwap||D),0!==(b=function(t,e,n,o,i,r,a,l){var s=o?t.clientY:t.clientX,c=o?n.height:n.width,t=o?n.top:n.left,o=o?n.bottom:n.right,n=!1;if(!a)if(l&&bt<c*i){if(St=!St&&(1===vt?t+c*r/2<s:s<o-c*r/2)?!0:St)n=!0;else if(1===vt?s<t+bt:o-bt<s)return-vt}else if(t+c*(1-i)/2<s&&s<o-c*(1-i)/2)return function(t){return j(V)<j(t)?1:-1}(e);if((n=n||a)&&(s<t+c*r/2||o-c*r/2<s))return t+c/2<s?1:-1;return 0}(n,l,E,r,S?1:s.swapThreshold,null==s.invertedSwapThreshold?s.swapThreshold:s.invertedSwapThreshold,_t,mt===l)))for(var T=j(V);(w=Z.children[T-=b])&&("none"===R(w,"display")||w===$););if(0===b||w===l)return A(!1);vt=b;var x=(mt=l).nextElementSibling,D=!1,S=jt(Q,a,V,o,l,E,n,D=1===b);if(!1!==S)return 1!==S&&-1!==S||(D=1===S),Tt=!0,setTimeout(Lt,30),M(),D&&!x?a.appendChild(V):l.parentNode.insertBefore(V,D?x:l),C&&H(C,0,v-C.scrollTop),Z=V.parentNode,void 0===y||_t||(bt=Math.abs(y-X(l)[_])),N(),A(!0)}}else{if(m===V)return A(!1);if((l=m&&a===n.target?m:l)&&(E=X(l)),!1!==jt(Q,a,V,o,l,E,n,!!l))return M(),m&&m.nextSibling?a.insertBefore(V,m.nextSibling):a.appendChild(V),Z=a,N(),A(!0)}if(a.contains(V))return A(!1)}return!1}function O(t,e){G(t,p,I({evt:n,isOwner:d,axis:r?"vertical":"horizontal",revert:i,dragRect:o,targetRect:E,canSort:h,fromSortable:f,target:l,completed:A,onMove:function(t,e){return jt(Q,a,V,o,t,X(t),n,e)},changed:N},e))}function M(){O("dragOverAnimationCapture"),p.captureAnimationState(),p!==f&&f.captureAnimationState()}function A(t){return O("dragOverCompleted",{insertion:t}),t&&(d?u._hideClone():u._showClone(p),p!==f&&(k(V,(st||u).options.ghostClass,!1),k(V,s.ghostClass,!0)),st!==p&&p!==Ft.active?st=p:p===Ft.active&&st&&(st=null),f===p&&(p._ignoreWhileAnimating=l),p.animateAll(function(){O("dragOverAnimationComplete"),p._ignoreWhileAnimating=null}),p!==f&&(f.animateAll(),f._ignoreWhileAnimating=null)),(l===V&&!V.animated||l===a&&!l.animated)&&(mt=null),s.dragoverBubble||n.rootEl||l===document||(V.parentNode[K]._isOutsideThisEl(n.target),t||Yt(n)),!s.dragoverBubble&&n.stopPropagation&&n.stopPropagation(),g=!0}function N(){it=j(V),at=j(V,s.draggable),q({sortable:p,name:"change",toEl:a,newIndex:it,newDraggableIndex:at,originalEvent:n})}},_ignoreWhileAnimating:null,_offMoveEvents:function(){f(document,"mousemove",this._onTouchMove),f(document,"touchmove",this._onTouchMove),f(document,"pointermove",this._onTouchMove),f(document,"dragover",Yt),f(document,"mousemove",Yt),f(document,"touchmove",Yt)},_offUpEvents:function(){var t=this.el.ownerDocument;f(t,"mouseup",this._onDrop),f(t,"touchend",this._onDrop),f(t,"pointerup",this._onDrop),f(t,"touchcancel",this._onDrop),f(document,"selectstart",this)},_onDrop:function(t){var e=this.el,n=this.options;it=j(V),at=j(V,n.draggable),G("drop",this,{evt:t}),Z=V&&V.parentNode,it=j(V),at=j(V,n.draggable),Ft.eventCanceled||(St=_t=wt=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),Wt(this.cloneId),Wt(this._dragStartId),this.nativeDraggable&&(f(document,"drop",this),f(e,"dragstart",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),u&&R(document.body,"user-select",""),R(V,"transform",""),t&&(gt&&(t.cancelable&&t.preventDefault(),n.dropBubble||t.stopPropagation()),$&&$.parentNode&&$.parentNode.removeChild($),(Q===Z||st&&"clone"!==st.lastPutMode)&&et&&et.parentNode&&et.parentNode.removeChild(et),V&&(this.nativeDraggable&&f(V,"dragend",this),Ht(V),V.style["will-change"]="",gt&&!wt&&k(V,(st||this).options.ghostClass,!1),k(V,this.options.chosenClass,!1),q({sortable:this,name:"unchoose",toEl:Z,newIndex:null,newDraggableIndex:null,originalEvent:t}),Q!==Z?(0<=it&&(q({rootEl:Z,name:"add",toEl:Z,fromEl:Q,originalEvent:t}),q({sortable:this,name:"remove",toEl:Z,originalEvent:t}),q({rootEl:Z,name:"sort",toEl:Z,fromEl:Q,originalEvent:t}),q({sortable:this,name:"sort",toEl:Z,originalEvent:t})),st&&st.save()):it!==ot&&0<=it&&(q({sortable:this,name:"update",toEl:Z,originalEvent:t}),q({sortable:this,name:"sort",toEl:Z,originalEvent:t})),Ft.active&&(null!=it&&-1!==it||(it=ot,at=rt),q({sortable:this,name:"end",toEl:Z,originalEvent:t}),this.save())))),this._nulling()},_nulling:function(){G("nulling",this),Q=V=Z=$=J=et=tt=nt=ct=ut=gt=it=at=ot=rt=mt=vt=st=lt=Ft.dragged=Ft.ghost=Ft.clone=Ft.active=null,xt.forEach(function(t){t.checked=!0}),xt.length=dt=ht=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragenter":case"dragover":V&&(this._onDragOver(t),function(t){t.dataTransfer&&(t.dataTransfer.dropEffect="move");t.cancelable&&t.preventDefault()}(t));break;case"selectstart":t.preventDefault()}},toArray:function(){for(var t,e=[],n=this.el.children,o=0,i=n.length,r=this.options;o<i;o++)P(t=n[o],r.draggable,this.el,!1)&&e.push(t.getAttribute(r.dataIdAttr)||function(t){var e=t.tagName+t.className+t.src+t.href+t.textContent,n=e.length,o=0;for(;n--;)o+=e.charCodeAt(n);return o.toString(36)}(t));return e},sort:function(t,e){var n={},o=this.el;this.toArray().forEach(function(t,e){e=o.children[e];P(e,this.options.draggable,o,!1)&&(n[t]=e)},this),e&&this.captureAnimationState(),t.forEach(function(t){n[t]&&(o.removeChild(n[t]),o.appendChild(n[t]))}),e&&this.animateAll()},save:function(){var t=this.options.store;t&&t.set&&t.set(this)},closest:function(t,e){return P(t,e||this.options.draggable,this.el,!1)},option:function(t,e){var n=this.options;if(void 0===e)return n[t];var o=W.modifyOption(this,t,e);n[t]=void 0!==o?o:e,"group"===t&&kt(n)},destroy:function(){G("destroy",this);var t=this.el;t[K]=null,f(t,"mousedown",this._onTapStart),f(t,"touchstart",this._onTapStart),f(t,"pointerdown",this._onTapStart),this.nativeDraggable&&(f(t,"dragover",this),f(t,"dragenter",this)),Array.prototype.forEach.call(t.querySelectorAll("[draggable]"),function(t){t.removeAttribute("draggable")}),this._onDrop(),this._disableDelayedDragEvents(),Dt.splice(Dt.indexOf(this.el),1),this.el=t=null},_hideClone:function(){nt||(G("hideClone",this),Ft.eventCanceled||(R(et,"display","none"),this.options.removeCloneOnHide&&et.parentNode&&et.parentNode.removeChild(et),nt=!0))},_showClone:function(t){"clone"===t.lastPutMode?nt&&(G("showClone",this),Ft.eventCanceled||(V.parentNode!=Q||this.options.group.revertClone?J?Q.insertBefore(et,J):Q.appendChild(et):Q.insertBefore(et,V),this.options.group.revertClone&&this.animate(V,et),R(et,"display",""),nt=!1)):this._hideClone()}},Ot&&h(document,"touchmove",function(t){(Ft.active||wt)&&t.cancelable&&t.preventDefault()}),Ft.utils={on:h,off:f,css:R,find:b,is:function(t,e){return!!P(t,e,t,!1)},extend:function(t,e){if(t&&e)for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t},throttle:S,closest:P,toggleClass:k,clone:_,index:j,nextTick:Kt,cancelNextTick:Wt,detectDirection:Pt,getChild:B},Ft.get=function(t){return t[K]},Ft.mount=function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];(e=e[0].constructor===Array?e[0]:e).forEach(function(t){if(!t.prototype||!t.prototype.constructor)throw"Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(t));t.utils&&(Ft.utils=I(I({},Ft.utils),t.utils)),W.mount(t)})},Ft.create=function(t,e){return new Ft(t,e)};var zt,Gt,Ut,qt,Vt,Zt,$t=[],Qt=!(Ft.version="1.15.2");function Jt(){$t.forEach(function(t){clearInterval(t.pid)}),$t=[]}function te(){clearInterval(Zt)}var ee,ne=S(function(n,t,e,o){if(t.scroll){var i,r=(n.touches?n.touches[0]:n).clientX,a=(n.touches?n.touches[0]:n).clientY,l=t.scrollSensitivity,s=t.scrollSpeed,c=O(),u=!1;Gt!==e&&(Gt=e,Jt(),zt=t.scroll,i=t.scrollFn,!0===zt&&(zt=M(e,!0)));var d=0,h=zt;do{var f=h,p=X(f),g=p.top,m=p.bottom,v=p.left,b=p.right,y=p.width,w=p.height,E=void 0,D=void 0,S=f.scrollWidth,_=f.scrollHeight,C=R(f),T=f.scrollLeft,p=f.scrollTop,D=f===c?(E=y<S&&("auto"===C.overflowX||"scroll"===C.overflowX||"visible"===C.overflowX),w<_&&("auto"===C.overflowY||"scroll"===C.overflowY||"visible"===C.overflowY)):(E=y<S&&("auto"===C.overflowX||"scroll"===C.overflowX),w<_&&("auto"===C.overflowY||"scroll"===C.overflowY)),T=E&&(Math.abs(b-r)<=l&&T+y<S)-(Math.abs(v-r)<=l&&!!T),p=D&&(Math.abs(m-a)<=l&&p+w<_)-(Math.abs(g-a)<=l&&!!p);if(!$t[d])for(var x=0;x<=d;x++)$t[x]||($t[x]={});$t[d].vx==T&&$t[d].vy==p&&$t[d].el===f||($t[d].el=f,$t[d].vx=T,$t[d].vy=p,clearInterval($t[d].pid),0==T&&0==p||(u=!0,$t[d].pid=setInterval(function(){o&&0===this.layer&&Ft.active._onTouchMove(Vt);var t=$t[this.layer].vy?$t[this.layer].vy*s:0,e=$t[this.layer].vx?$t[this.layer].vx*s:0;"function"==typeof i&&"continue"!==i.call(Ft.dragged.parentNode[K],e,t,n,Vt,$t[this.layer].el)||H($t[this.layer].el,e,t)}.bind({layer:d}),24))),d++}while(t.bubbleScroll&&h!==c&&(h=M(h,!1)));Qt=u}},30),c=function(t){var e=t.originalEvent,n=t.putSortable,o=t.dragEl,i=t.activeSortable,r=t.dispatchSortableEvent,a=t.hideGhostForTarget,t=t.unhideGhostForTarget;e&&(i=n||i,a(),e=e.changedTouches&&e.changedTouches.length?e.changedTouches[0]:e,e=document.elementFromPoint(e.clientX,e.clientY),t(),i&&!i.el.contains(e)&&(r("spill"),this.onSpill({dragEl:o,putSortable:n})))};function oe(){}function ie(){}oe.prototype={startIndex:null,dragStart:function(t){t=t.oldDraggableIndex;this.startIndex=t},onSpill:function(t){var e=t.dragEl,n=t.putSortable;this.sortable.captureAnimationState(),n&&n.captureAnimationState();t=B(this.sortable.el,this.startIndex,this.options);t?this.sortable.el.insertBefore(e,t):this.sortable.el.appendChild(e),this.sortable.animateAll(),n&&n.animateAll()},drop:c},a(oe,{pluginName:"revertOnSpill"}),ie.prototype={onSpill:function(t){var e=t.dragEl,t=t.putSortable||this.sortable;t.captureAnimationState(),e.parentNode&&e.parentNode.removeChild(e),t.animateAll()},drop:c},a(ie,{pluginName:"removeOnSpill"});var re,ae,le,se,ce,ue=[],de=[],he=!1,fe=!1,pe=!1;function ge(n,o){de.forEach(function(t,e){e=o.children[t.sortableIndex+(n?Number(e):0)];e?o.insertBefore(t,e):o.appendChild(t)})}function me(){ue.forEach(function(t){t!==le&&t.parentNode&&t.parentNode.removeChild(t)})}return Ft.mount(new function(){function t(){for(var t in this.defaults={scroll:!0,forceAutoScrollFallback:!1,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0},this)"_"===t.charAt(0)&&"function"==typeof this[t]&&(this[t]=this[t].bind(this))}return t.prototype={dragStarted:function(t){t=t.originalEvent;this.sortable.nativeDraggable?h(document,"dragover",this._handleAutoScroll):this.options.supportPointer?h(document,"pointermove",this._handleFallbackAutoScroll):t.touches?h(document,"touchmove",this._handleFallbackAutoScroll):h(document,"mousemove",this._handleFallbackAutoScroll)},dragOverCompleted:function(t){t=t.originalEvent;this.options.dragOverBubble||t.rootEl||this._handleAutoScroll(t)},drop:function(){this.sortable.nativeDraggable?f(document,"dragover",this._handleAutoScroll):(f(document,"pointermove",this._handleFallbackAutoScroll),f(document,"touchmove",this._handleFallbackAutoScroll),f(document,"mousemove",this._handleFallbackAutoScroll)),te(),Jt(),clearTimeout(g),g=void 0},nulling:function(){Vt=Gt=zt=Qt=Zt=Ut=qt=null,$t.length=0},_handleFallbackAutoScroll:function(t){this._handleAutoScroll(t,!0)},_handleAutoScroll:function(e,n){var o,i=this,r=(e.touches?e.touches[0]:e).clientX,a=(e.touches?e.touches[0]:e).clientY,t=document.elementFromPoint(r,a);Vt=e,n||this.options.forceAutoScrollFallback||w||y||u?(ne(e,this.options,t,n),o=M(t,!0),!Qt||Zt&&r===Ut&&a===qt||(Zt&&te(),Zt=setInterval(function(){var t=M(document.elementFromPoint(r,a),!0);t!==o&&(o=t,Jt()),ne(e,i.options,t,n)},10),Ut=r,qt=a)):this.options.bubbleScroll&&M(t,!0)!==O()?ne(e,this.options,M(t,!1),!1):Jt()}},a(t,{pluginName:"scroll",initializeByDefault:!0})}),Ft.mount(ie,oe),Ft.mount(new function(){function t(){this.defaults={swapClass:"sortable-swap-highlight"}}return t.prototype={dragStart:function(t){t=t.dragEl;ee=t},dragOverValid:function(t){var e=t.completed,n=t.target,o=t.onMove,i=t.activeSortable,r=t.changed,a=t.cancel;i.options.swap&&(t=this.sortable.el,i=this.options,n&&n!==t&&(t=ee,ee=!1!==o(n)?(k(n,i.swapClass,!0),n):null,t&&t!==ee&&k(t,i.swapClass,!1)),r(),e(!0),a())},drop:function(t){var e,n,o=t.activeSortable,i=t.putSortable,r=t.dragEl,a=i||this.sortable,l=this.options;ee&&k(ee,l.swapClass,!1),ee&&(l.swap||i&&i.options.swap)&&r!==ee&&(a.captureAnimationState(),a!==o&&o.captureAnimationState(),n=ee,t=(e=r).parentNode,l=n.parentNode,t&&l&&!t.isEqualNode(n)&&!l.isEqualNode(e)&&(i=j(e),r=j(n),t.isEqualNode(l)&&i<r&&r++,t.insertBefore(n,t.children[i]),l.insertBefore(e,l.children[r])),a.animateAll(),a!==o&&o.animateAll())},nulling:function(){ee=null}},a(t,{pluginName:"swap",eventProperties:function(){return{swapItem:ee}}})}),Ft.mount(new function(){function t(o){for(var t in this)"_"===t.charAt(0)&&"function"==typeof this[t]&&(this[t]=this[t].bind(this));o.options.avoidImplicitDeselect||(o.options.supportPointer?h(document,"pointerup",this._deselectMultiDrag):(h(document,"mouseup",this._deselectMultiDrag),h(document,"touchend",this._deselectMultiDrag))),h(document,"keydown",this._checkKeyDown),h(document,"keyup",this._checkKeyUp),this.defaults={selectedClass:"sortable-selected",multiDragKey:null,avoidImplicitDeselect:!1,setData:function(t,e){var n="";ue.length&&ae===o?ue.forEach(function(t,e){n+=(e?", ":"")+t.textContent}):n=e.textContent,t.setData("Text",n)}}}return t.prototype={multiDragKeyDown:!1,isMultiDrag:!1,delayStartGlobal:function(t){t=t.dragEl;le=t},delayEnded:function(){this.isMultiDrag=~ue.indexOf(le)},setupClone:function(t){var e=t.sortable,t=t.cancel;if(this.isMultiDrag){for(var n=0;n<ue.length;n++)de.push(_(ue[n])),de[n].sortableIndex=ue[n].sortableIndex,de[n].draggable=!1,de[n].style["will-change"]="",k(de[n],this.options.selectedClass,!1),ue[n]===le&&k(de[n],this.options.chosenClass,!1);e._hideClone(),t()}},clone:function(t){var e=t.sortable,n=t.rootEl,o=t.dispatchSortableEvent,t=t.cancel;this.isMultiDrag&&(this.options.removeCloneOnHide||ue.length&&ae===e&&(ge(!0,n),o("clone"),t()))},showClone:function(t){var e=t.cloneNowShown,n=t.rootEl,t=t.cancel;this.isMultiDrag&&(ge(!1,n),de.forEach(function(t){R(t,"display","")}),e(),ce=!1,t())},hideClone:function(t){var e=this,n=(t.sortable,t.cloneNowHidden),t=t.cancel;this.isMultiDrag&&(de.forEach(function(t){R(t,"display","none"),e.options.removeCloneOnHide&&t.parentNode&&t.parentNode.removeChild(t)}),n(),ce=!0,t())},dragStartGlobal:function(t){t.sortable;!this.isMultiDrag&&ae&&ae.multiDrag._deselectMultiDrag(),ue.forEach(function(t){t.sortableIndex=j(t)}),ue=ue.sort(function(t,e){return t.sortableIndex-e.sortableIndex}),pe=!0},dragStarted:function(t){var e,n=this,t=t.sortable;this.isMultiDrag&&(this.options.sort&&(t.captureAnimationState(),this.options.animation&&(ue.forEach(function(t){t!==le&&R(t,"position","absolute")}),e=X(le,!1,!0,!0),ue.forEach(function(t){t!==le&&C(t,e)}),he=fe=!0)),t.animateAll(function(){he=fe=!1,n.options.animation&&ue.forEach(function(t){T(t)}),n.options.sort&&me()}))},dragOver:function(t){var e=t.target,n=t.completed,t=t.cancel;fe&&~ue.indexOf(e)&&(n(!1),t())},revert:function(t){var n,o,e=t.fromSortable,i=t.rootEl,r=t.sortable,a=t.dragRect;1<ue.length&&(ue.forEach(function(t){r.addAnimationState({target:t,rect:fe?X(t):a}),T(t),t.fromRect=a,e.removeAnimationState(t)}),fe=!1,n=!this.options.removeCloneOnHide,o=i,ue.forEach(function(t,e){e=o.children[t.sortableIndex+(n?Number(e):0)];e?o.insertBefore(t,e):o.appendChild(t)}))},dragOverCompleted:function(t){var e,n=t.sortable,o=t.isOwner,i=t.insertion,r=t.activeSortable,a=t.parentEl,l=t.putSortable,t=this.options;i&&(o&&r._hideClone(),he=!1,t.animation&&1<ue.length&&(fe||!o&&!r.options.sort&&!l)&&(e=X(le,!1,!0,!0),ue.forEach(function(t){t!==le&&(C(t,e),a.appendChild(t))}),fe=!0),o||(fe||me(),1<ue.length?(o=ce,r._showClone(n),r.options.animation&&!ce&&o&&de.forEach(function(t){r.addAnimationState({target:t,rect:se}),t.fromRect=se,t.thisAnimationDuration=null})):r._showClone(n)))},dragOverAnimationCapture:function(t){var e=t.dragRect,n=t.isOwner,t=t.activeSortable;ue.forEach(function(t){t.thisAnimationDuration=null}),t.options.animation&&!n&&t.multiDrag.isMultiDrag&&(se=a({},e),e=v(le,!0),se.top-=e.f,se.left-=e.e)},dragOverAnimationComplete:function(){fe&&(fe=!1,me())},drop:function(t){var e=t.originalEvent,n=t.rootEl,o=t.parentEl,i=t.sortable,r=t.dispatchSortableEvent,a=t.oldIndex,l=t.putSortable,s=l||this.sortable;if(e){var c,u,d,h=this.options,f=o.children;if(!pe)if(h.multiDragKey&&!this.multiDragKeyDown&&this._deselectMultiDrag(),k(le,h.selectedClass,!~ue.indexOf(le)),~ue.indexOf(le))ue.splice(ue.indexOf(le),1),re=null,z({sortable:i,rootEl:n,name:"deselect",targetEl:le,originalEvent:e});else{if(ue.push(le),z({sortable:i,rootEl:n,name:"select",targetEl:le,originalEvent:e}),e.shiftKey&&re&&i.el.contains(re)){var p=j(re),t=j(le);if(~p&&~t&&p!==t)for(var g,m=p<t?(g=p,t):(g=t,p+1);g<m;g++)~ue.indexOf(f[g])||(k(f[g],h.selectedClass,!0),ue.push(f[g]),z({sortable:i,rootEl:n,name:"select",targetEl:f[g],originalEvent:e}))}else re=le;ae=s}pe&&this.isMultiDrag&&(fe=!1,(o[K].options.sort||o!==n)&&1<ue.length&&(c=X(le),u=j(le,":not(."+this.options.selectedClass+")"),!he&&h.animation&&(le.thisAnimationDuration=null),s.captureAnimationState(),he||(h.animation&&(le.fromRect=c,ue.forEach(function(t){var e;t.thisAnimationDuration=null,t!==le&&(e=fe?X(t):c,t.fromRect=e,s.addAnimationState({target:t,rect:e}))})),me(),ue.forEach(function(t){f[u]?o.insertBefore(t,f[u]):o.appendChild(t),u++}),a===j(le)&&(d=!1,ue.forEach(function(t){t.sortableIndex!==j(t)&&(d=!0)}),d&&(r("update"),r("sort")))),ue.forEach(function(t){T(t)}),s.animateAll()),ae=s),(n===o||l&&"clone"!==l.lastPutMode)&&de.forEach(function(t){t.parentNode&&t.parentNode.removeChild(t)})}},nullingGlobal:function(){this.isMultiDrag=pe=!1,de.length=0},destroyGlobal:function(){this._deselectMultiDrag(),f(document,"pointerup",this._deselectMultiDrag),f(document,"mouseup",this._deselectMultiDrag),f(document,"touchend",this._deselectMultiDrag),f(document,"keydown",this._checkKeyDown),f(document,"keyup",this._checkKeyUp)},_deselectMultiDrag:function(t){if(!(void 0!==pe&&pe||ae!==this.sortable||t&&P(t.target,this.options.draggable,this.sortable.el,!1)||t&&0!==t.button))for(;ue.length;){var e=ue[0];k(e,this.options.selectedClass,!1),ue.shift(),z({sortable:this.sortable,rootEl:this.sortable.el,name:"deselect",targetEl:e,originalEvent:t})}},_checkKeyDown:function(t){t.key===this.options.multiDragKey&&(this.multiDragKeyDown=!0)},_checkKeyUp:function(t){t.key===this.options.multiDragKey&&(this.multiDragKeyDown=!1)}},a(t,{pluginName:"multiDrag",utils:{select:function(t){var e=t.parentNode[K];e&&e.options.multiDrag&&!~ue.indexOf(t)&&(ae&&ae!==e&&(ae.multiDrag._deselectMultiDrag(),ae=e),k(t,e.options.selectedClass,!0),ue.push(t))},deselect:function(t){var e=t.parentNode[K],n=ue.indexOf(t);e&&e.options.multiDrag&&~n&&(k(t,e.options.selectedClass,!1),ue.splice(n,1))}},eventProperties:function(){var n=this,o=[],i=[];return ue.forEach(function(t){var e;o.push({multiDragElement:t,index:t.sortableIndex}),e=fe&&t!==le?-1:fe?j(t,":not(."+n.options.selectedClass+")"):j(t),i.push({multiDragElement:t,index:e})}),{items:r(ue),clones:[].concat(de),oldIndicies:o,newIndicies:i}},optionListeners:{multiDragKey:function(t){return"ctrl"===(t=t.toLowerCase())?t="Control":1<t.length&&(t=t.charAt(0).toUpperCase()+t.substr(1)),t}}})}),Ft});';import{existsSync as xe,readFileSync as Ft,writeFileSync as nt,rmSync as eo}from"fs";import{resolve as oe}from"path";V();import{existsSync as $,readFileSync as me,writeFileSync as he,mkdirSync as Q,readdirSync as ue,rmSync as Ht,statSync as I}from"fs";import{resolve as Ve,relative as Ot,dirname as ge,join as z,extname as J,basename as fe}from"path";var A=200*1024,Ye=new Set([".md",".markdown",".txt"]),G=new Set([".md",".markdown",".txt",".json",".jsonc",".yaml",".yml",".toml",".sh",".bash",".zsh",".py",".js",".mjs",".ts",".tsx",".jsx",".css",".html",".lock",".cfg",".ini",".env",".gitignore"]),Rt=6,Nt=new Set(["CLAUDE.md","SOUL.md","IDENTITY.md","PERSONA.md","AGENT.md","BOOTSTRAP.md"]);function H(t,e){if(!t)throw new Error("Agent workspace is not configured.");let a=Ve(t);if($(a)||Q(a,{recursive:!0}),!e||e.startsWith("/")||e.match(/^[a-zA-Z]:/))throw new Error(`Path must be relative to the workspace: ${e}`);let n=Ve(a,e);if(Ot(a,n).startsWith(".."))throw new Error(`Path escapes the workspace: ${e}`);return n}function Qe(t){let e=J(t).toLowerCase();if(!Ye.has(e))throw new Error(`Only text files (.md, .markdown, .txt) can be edited from the admin panel (got ${e}).`)}function ce(t,e){let a=t.split(/\r?\n/).find(n=>n.trim().startsWith("#"));return a&&a.replace(/^#+\s*/,"").trim().slice(0,120)||e}function F(t){let e=H(t,"."),a=[],n=new Set,o=[];try{o=ue(e)}catch{}for(let i of Nt){let l=z(e,i);if($(l)&&I(l).isFile()){let d=I(l).size,u=d>0&&d<A?pe(l):"";a.push({path:i,title:ce(u,i),size:d,exists:!0}),n.add(i)}else a.push({path:i,title:i,size:0,exists:!1}),n.add(i)}for(let i of o){if(n.has(i))continue;let l=z(e,i);try{let d=I(l);if(!d.isFile()||!Ye.has(J(i).toLowerCase()))continue;let u=d.size>0&&d.size<A?pe(l):"";a.push({path:i,title:ce(u,i),size:d.size,exists:!0})}catch{}}let r=[],s=z(e,".claude","skills");if($(s))try{for(let i of ue(s)){let l=z(s,i),d;try{d=I(l)}catch{continue}if(!d.isDirectory())continue;let u=z(l,"SKILL.md");if(!$(u))continue;let p=I(u),f=p.size<A?pe(u):"";r.push({slug:i,title:ce(f,i),size:p.size,path:`.claude/skills/${i}/SKILL.md`})}}catch{}return r.sort((i,l)=>i.slug.localeCompare(l.slug)),{identity:a,skills:r,workspace:e}}function pe(t){try{return me(t,"utf-8")}catch{return""}}function Z(t,e){let a=H(t,e);if(Qe(a),!$(a))return{path:e,content:""};if(I(a).size>A)throw new Error(`File is too large to edit in the admin panel (> ${A/1024} KB).`);return{path:e,content:me(a,"utf-8")}}function ee(t,e,a){let n=H(t,e);Qe(n);let o=Buffer.from(a,"utf-8");if(o.length>A)throw new Error(`File too large (${o.length} > ${A} bytes).`);return Q(ge(n),{recursive:!0}),he(n,o),{path:e,bytes:o.length}}function te(t,e,a={}){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error("Skill slug must be lowercase (letters, digits, -, _) and start with a letter or digit.");let n=`.claude/skills/${e}/SKILL.md`,o=H(t,n);if($(o))throw new Error(`Skill "${e}" already exists.`);Q(ge(o),{recursive:!0});let r=a.content?.trim()?a.content:Bt(e,a.title);return he(o,r),{slug:e,path:n}}function ae(t,e){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error(`Invalid skill slug: ${e}`);let a=H(t,`.claude/skills/${e}`);if(!$(a))throw new Error(`Skill "${e}" not found.`);if(!I(a).isDirectory())throw new Error(`Skill path is not a directory: ${e}`);return Ht(a,{recursive:!0,force:!0}),{slug:e}}function Ze(t,e){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error(`Invalid skill slug: ${e}`);let a=H(t,`.claude/skills/${e}`);if(!$(a))throw new Error(`Skill "${e}" not found.`);let n=[];return o(a,"",0,n),n.sort((r,s)=>r.kind!==s.kind?r.kind==="dir"?-1:1:r.path.localeCompare(s.path)),n;function o(r,s,i,l){if(i>Rt)return;let d=[];try{d=ue(r)}catch{return}for(let u of d){if(u==="node_modules"||u===".git")continue;let p=z(r,u),f=s?`${s}/${u}`:u,b;try{b=I(p)}catch{continue}if(b.isDirectory())l.push({path:`${f}/`,kind:"dir",size:0,editable:!1}),o(p,f,i+1,l);else if(b.isFile()){let c=J(u).toLowerCase(),m=G.has(c)||G.has(u.toLowerCase());l.push({path:f,kind:"file",size:b.size,editable:m&&b.size<A})}}}}function et(t,e,a){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error(`Invalid skill slug: ${e}`);if(!a||a.includes(".."))throw new Error(`Invalid file path: ${a}`);let n=H(t,`.claude/skills/${e}/${a}`);if(!$(n)||!I(n).isFile())throw new Error(`File not found: ${a}`);let o=J(n).toLowerCase(),r=fe(n).toLowerCase();if(!G.has(o)&&!G.has(r))throw new Error(`File type not editable: ${a}`);if(I(n).size>A)throw new Error(`File too large to edit (> ${A/1024} KB): ${a}`);return{path:a,content:me(n,"utf-8")}}function tt(t,e,a,n){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error(`Invalid skill slug: ${e}`);if(!a||a.includes(".."))throw new Error(`Invalid file path: ${a}`);let o=H(t,`.claude/skills/${e}/${a}`),r=J(o).toLowerCase(),s=fe(o).toLowerCase();if(!G.has(r)&&!G.has(s))throw new Error(`File type not editable: ${a}`);let i=Buffer.from(n,"utf-8");if(i.length>A)throw new Error(`File too large (${i.length} > ${A} bytes).`);return Q(ge(o),{recursive:!0}),he(o,i),{path:a,bytes:i.length}}function ne(t,e){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error(`Invalid skill slug: ${e}`);let a=H(t,`.claude/skills/${e}`);if(!$(a))throw new Error(`Skill "${e}" not found.`);let n=o=>$(z(a,o));return n("pnpm-lock.yaml")?{manager:"pnpm",file:"pnpm-lock.yaml",command:"pnpm install"}:n("yarn.lock")?{manager:"yarn",file:"yarn.lock",command:"yarn install"}:n("package.json")?{manager:"npm",file:"package.json",command:"npm install"}:n("requirements.txt")?{manager:"pip",file:"requirements.txt",command:"pip install -r requirements.txt"}:n("Gemfile")?{manager:"bundle",file:"Gemfile",command:"bundle install"}:{manager:null,file:null,command:null}}function Bt(t,e){return`# ${e?.trim()||t}
1
+ import{a as S,b as Fe,c as Ue,d as We,e as D,f as K,g as le}from"./chunk-ASSJ4Z6Z.js";import{a as E,b as C,g as Be,h as je,i as R,j as N,k as V,l as ze,m as qe,n as Ge}from"./chunk-6PPIFDOQ.js";import{a as se,b as ie,c as De,d as He,e as Oe,i as Ne}from"./chunk-IM376SD6.js";import"./chunk-DSCMCVTV.js";import"./chunk-J4WKMKTP.js";import{a as Le,b as Pe,e as $}from"./chunk-LY7JGDV7.js";import"./chunk-N67JZAXU.js";import{f as Re}from"./chunk-CDNWCYF7.js";import"./chunk-AFRHKA7B.js";import"./chunk-EW27SCCC.js";import{a as Ie}from"./chunk-5F3J55LG.js";import{b as Me}from"./chunk-WZEYII2S.js";import"./chunk-HPDHNIA3.js";import{createServer as xn}from"http";import{appendFileSync as yn,existsSync as wn,mkdirSync as kn}from"fs";import{readFile as Sn}from"fs/promises";import{fileURLToPath as En}from"url";import{dirname as _n,resolve as re}from"path";var Ke='/*! Sortable 1.15.2 - MIT | git://github.com/SortableJS/Sortable.git */\n!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function e(e,t){var n,o=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),o.push.apply(o,n)),o}function I(o){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?e(Object(i),!0).forEach(function(t){var e,n;e=o,t=i[n=t],n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t}):Object.getOwnPropertyDescriptors?Object.defineProperties(o,Object.getOwnPropertyDescriptors(i)):e(Object(i)).forEach(function(t){Object.defineProperty(o,t,Object.getOwnPropertyDescriptor(i,t))})}return o}function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function a(){return(a=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n,o=arguments[e];for(n in o)Object.prototype.hasOwnProperty.call(o,n)&&(t[n]=o[n])}return t}).apply(this,arguments)}function i(t,e){if(null==t)return{};var n,o=function(t,e){if(null==t)return{};for(var n,o={},i=Object.keys(t),r=0;r<i.length;r++)n=i[r],0<=e.indexOf(n)||(o[n]=t[n]);return o}(t,e);if(Object.getOwnPropertySymbols)for(var i=Object.getOwnPropertySymbols(t),r=0;r<i.length;r++)n=i[r],0<=e.indexOf(n)||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n]);return o}function r(t){return function(t){if(Array.isArray(t))return l(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return l(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Map"===(n="Object"===n&&t.constructor?t.constructor.name:n)||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,o=new Array(e);n<e;n++)o[n]=t[n];return o}function t(t){if("undefined"!=typeof window&&window.navigator)return!!navigator.userAgent.match(t)}var y=t(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i),w=t(/Edge/i),s=t(/firefox/i),u=t(/safari/i)&&!t(/chrome/i)&&!t(/android/i),n=t(/iP(ad|od|hone)/i),c=t(/chrome/i)&&t(/android/i),d={capture:!1,passive:!1};function h(t,e,n){t.addEventListener(e,n,!y&&d)}function f(t,e,n){t.removeEventListener(e,n,!y&&d)}function p(t,e){if(e&&(">"===e[0]&&(e=e.substring(1)),t))try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"!==e[0]||t.parentNode===n)&&p(t,e)||o&&t===n)return t}while(t!==n&&(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode))}var i;return null}var g,m=/\\s+/g;function k(t,e,n){var o;t&&e&&(t.classList?t.classList[n?"add":"remove"](e):(o=(" "+t.className+" ").replace(m," ").replace(" "+e+" "," "),t.className=(o+(n?" "+e:"")).replace(m," ")))}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];o[e=!(e in o||-1!==e.indexOf("webkit"))?"-webkit-"+e:e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform")}while(o&&"none"!==o&&(n=o+" "+n),!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function b(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i<r;i++)n(o[i],i);return o}return[]}function O(){var t=document.scrollingElement;return t||document.documentElement}function X(t,e,n,o,i){if(t.getBoundingClientRect||t===window){var r,a,l,s,c,u,d=t!==window&&t.parentNode&&t!==O()?(a=(r=t.getBoundingClientRect()).top,l=r.left,s=r.bottom,c=r.right,u=r.height,r.width):(l=a=0,s=window.innerHeight,c=window.innerWidth,u=window.innerHeight,window.innerWidth);if((e||n)&&t!==window&&(i=i||t.parentNode,!y))do{if(i&&i.getBoundingClientRect&&("none"!==R(i,"transform")||n&&"static"!==R(i,"position"))){var h=i.getBoundingClientRect();a-=h.top+parseInt(R(i,"border-top-width")),l-=h.left+parseInt(R(i,"border-left-width")),s=a+r.height,c=l+r.width;break}}while(i=i.parentNode);return o&&t!==window&&(o=(e=v(i||t))&&e.a,t=e&&e.d,e&&(s=(a/=t)+(u/=t),c=(l/=o)+(d/=o))),{top:a,left:l,bottom:s,right:c,width:d,height:u}}}function Y(t,e,n){for(var o=M(t,!0),i=X(t)[e];o;){var r=X(o)[n];if(!("top"===n||"left"===n?r<=i:i<=r))return o;if(o===O())break;o=M(o,!1)}return!1}function B(t,e,n,o){for(var i=0,r=0,a=t.children;r<a.length;){if("none"!==a[r].style.display&&a[r]!==Ft.ghost&&(o||a[r]!==Ft.dragged)&&P(a[r],n.draggable,t,!1)){if(i===e)return a[r];i++}r++}return null}function F(t,e){for(var n=t.lastElementChild;n&&(n===Ft.ghost||"none"===R(n,"display")||e&&!p(n,e));)n=n.previousElementSibling;return n||null}function j(t,e){var n=0;if(!t||!t.parentNode)return-1;for(;t=t.previousElementSibling;)"TEMPLATE"===t.nodeName.toUpperCase()||t===Ft.clone||e&&!p(t,e)||n++;return n}function E(t){var e=0,n=0,o=O();if(t)do{var i=v(t),r=i.a,i=i.d}while(e+=t.scrollLeft*r,n+=t.scrollTop*i,t!==o&&(t=t.parentNode));return[e,n]}function M(t,e){if(!t||!t.getBoundingClientRect)return O();var n=t,o=!1;do{if(n.clientWidth<n.scrollWidth||n.clientHeight<n.scrollHeight){var i=R(n);if(n.clientWidth<n.scrollWidth&&("auto"==i.overflowX||"scroll"==i.overflowX)||n.clientHeight<n.scrollHeight&&("auto"==i.overflowY||"scroll"==i.overflowY)){if(!n.getBoundingClientRect||n===document.body)return O();if(o||e)return n;o=!0}}}while(n=n.parentNode);return O()}function D(t,e){return Math.round(t.top)===Math.round(e.top)&&Math.round(t.left)===Math.round(e.left)&&Math.round(t.height)===Math.round(e.height)&&Math.round(t.width)===Math.round(e.width)}function S(e,n){return function(){var t;g||(1===(t=arguments).length?e.call(this,t[0]):e.apply(this,t),g=setTimeout(function(){g=void 0},n))}}function H(t,e,n){t.scrollLeft+=e,t.scrollTop+=n}function _(t){var e=window.Polymer,n=window.jQuery||window.Zepto;return e&&e.dom?e.dom(t).cloneNode(!0):n?n(t).clone(!0)[0]:t.cloneNode(!0)}function C(t,e){R(t,"position","absolute"),R(t,"top",e.top),R(t,"left",e.left),R(t,"width",e.width),R(t,"height",e.height)}function T(t){R(t,"position",""),R(t,"top",""),R(t,"left",""),R(t,"width",""),R(t,"height","")}function L(n,o,i){var r={};return Array.from(n.children).forEach(function(t){var e;P(t,o.draggable,n,!1)&&!t.animated&&t!==i&&(e=X(t),r.left=Math.min(null!==(t=r.left)&&void 0!==t?t:1/0,e.left),r.top=Math.min(null!==(t=r.top)&&void 0!==t?t:1/0,e.top),r.right=Math.max(null!==(t=r.right)&&void 0!==t?t:-1/0,e.right),r.bottom=Math.max(null!==(t=r.bottom)&&void 0!==t?t:-1/0,e.bottom))}),r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}var K="Sortable"+(new Date).getTime();function x(){var e,o=[];return{captureAnimationState:function(){o=[],this.options.animation&&[].slice.call(this.el.children).forEach(function(t){var e,n;"none"!==R(t,"display")&&t!==Ft.ghost&&(o.push({target:t,rect:X(t)}),e=I({},o[o.length-1].rect),!t.thisAnimationDuration||(n=v(t,!0))&&(e.top-=n.f,e.left-=n.e),t.fromRect=e)})},addAnimationState:function(t){o.push(t)},removeAnimationState:function(t){o.splice(function(t,e){for(var n in t)if(t.hasOwnProperty(n))for(var o in e)if(e.hasOwnProperty(o)&&e[o]===t[n][o])return Number(n);return-1}(o,{target:t}),1)},animateAll:function(t){var c=this;if(!this.options.animation)return clearTimeout(e),void("function"==typeof t&&t());var u=!1,d=0;o.forEach(function(t){var e=0,n=t.target,o=n.fromRect,i=X(n),r=n.prevFromRect,a=n.prevToRect,l=t.rect,s=v(n,!0);s&&(i.top-=s.f,i.left-=s.e),n.toRect=i,n.thisAnimationDuration&&D(r,i)&&!D(o,i)&&(l.top-i.top)/(l.left-i.left)==(o.top-i.top)/(o.left-i.left)&&(t=l,s=r,r=a,a=c.options,e=Math.sqrt(Math.pow(s.top-t.top,2)+Math.pow(s.left-t.left,2))/Math.sqrt(Math.pow(s.top-r.top,2)+Math.pow(s.left-r.left,2))*a.animation),D(i,o)||(n.prevFromRect=o,n.prevToRect=i,e=e||c.options.animation,c.animate(n,l,i,e)),e&&(u=!0,d=Math.max(d,e),clearTimeout(n.animationResetTimer),n.animationResetTimer=setTimeout(function(){n.animationTime=0,n.prevFromRect=null,n.fromRect=null,n.prevToRect=null,n.thisAnimationDuration=null},e),n.thisAnimationDuration=e)}),clearTimeout(e),u?e=setTimeout(function(){"function"==typeof t&&t()},d):"function"==typeof t&&t(),o=[]},animate:function(t,e,n,o){var i,r;o&&(R(t,"transition",""),R(t,"transform",""),i=(r=v(this.el))&&r.a,r=r&&r.d,i=(e.left-n.left)/(i||1),r=(e.top-n.top)/(r||1),t.animatingX=!!i,t.animatingY=!!r,R(t,"transform","translate3d("+i+"px,"+r+"px,0)"),this.forRepaintDummy=t.offsetWidth,R(t,"transition","transform "+o+"ms"+(this.options.easing?" "+this.options.easing:"")),R(t,"transform","translate3d(0,0,0)"),"number"==typeof t.animated&&clearTimeout(t.animated),t.animated=setTimeout(function(){R(t,"transition",""),R(t,"transform",""),t.animated=!1,t.animatingX=!1,t.animatingY=!1},o))}}}var A=[],N={initializeByDefault:!0},W={mount:function(e){for(var t in N)!N.hasOwnProperty(t)||t in e||(e[t]=N[t]);A.forEach(function(t){if(t.pluginName===e.pluginName)throw"Sortable: Cannot mount plugin ".concat(e.pluginName," more than once")}),A.push(e)},pluginEvent:function(e,n,o){var t=this;this.eventCanceled=!1,o.cancel=function(){t.eventCanceled=!0};var i=e+"Global";A.forEach(function(t){n[t.pluginName]&&(n[t.pluginName][i]&&n[t.pluginName][i](I({sortable:n},o)),n.options[t.pluginName]&&n[t.pluginName][e]&&n[t.pluginName][e](I({sortable:n},o)))})},initializePlugins:function(n,o,i,t){for(var e in A.forEach(function(t){var e=t.pluginName;(n.options[e]||t.initializeByDefault)&&((t=new t(n,o,n.options)).sortable=n,t.options=n.options,n[e]=t,a(i,t.defaults))}),n.options){var r;n.options.hasOwnProperty(e)&&(void 0!==(r=this.modifyOption(n,e,n.options[e]))&&(n.options[e]=r))}},getEventProperties:function(e,n){var o={};return A.forEach(function(t){"function"==typeof t.eventProperties&&a(o,t.eventProperties.call(n[t.pluginName],e))}),o},modifyOption:function(e,n,o){var i;return A.forEach(function(t){e[t.pluginName]&&t.optionListeners&&"function"==typeof t.optionListeners[n]&&(i=t.optionListeners[n].call(e[t.pluginName],o))}),i}};function z(t){var e=t.sortable,n=t.rootEl,o=t.name,i=t.targetEl,r=t.cloneEl,a=t.toEl,l=t.fromEl,s=t.oldIndex,c=t.newIndex,u=t.oldDraggableIndex,d=t.newDraggableIndex,h=t.originalEvent,f=t.putSortable,p=t.extraEventProperties;if(e=e||n&&n[K]){var g,m=e.options,t="on"+o.charAt(0).toUpperCase()+o.substr(1);!window.CustomEvent||y||w?(g=document.createEvent("Event")).initEvent(o,!0,!0):g=new CustomEvent(o,{bubbles:!0,cancelable:!0}),g.to=a||n,g.from=l||n,g.item=i||n,g.clone=r,g.oldIndex=s,g.newIndex=c,g.oldDraggableIndex=u,g.newDraggableIndex=d,g.originalEvent=h,g.pullMode=f?f.lastPutMode:void 0;var v,b=I(I({},p),W.getEventProperties(o,e));for(v in b)g[v]=b[v];n&&n.dispatchEvent(g),m[t]&&m[t].call(e,g)}}function G(t,e){var n=(o=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{}).evt,o=i(o,U);W.pluginEvent.bind(Ft)(t,e,I({dragEl:V,parentEl:Z,ghostEl:$,rootEl:Q,nextEl:J,lastDownEl:tt,cloneEl:et,cloneHidden:nt,dragStarted:gt,putSortable:st,activeSortable:Ft.active,originalEvent:n,oldIndex:ot,oldDraggableIndex:rt,newIndex:it,newDraggableIndex:at,hideGhostForTarget:Rt,unhideGhostForTarget:Xt,cloneNowHidden:function(){nt=!0},cloneNowShown:function(){nt=!1},dispatchSortableEvent:function(t){q({sortable:e,name:t,originalEvent:n})}},o))}var U=["evt"];function q(t){z(I({putSortable:st,cloneEl:et,targetEl:V,rootEl:Q,oldIndex:ot,oldDraggableIndex:rt,newIndex:it,newDraggableIndex:at},t))}var V,Z,$,Q,J,tt,et,nt,ot,it,rt,at,lt,st,ct,ut,dt,ht,ft,pt,gt,mt,vt,bt,yt,wt=!1,Et=!1,Dt=[],St=!1,_t=!1,Ct=[],Tt=!1,xt=[],Ot="undefined"!=typeof document,Mt=n,At=w||y?"cssFloat":"float",Nt=Ot&&!c&&!n&&"draggable"in document.createElement("div"),It=function(){if(Ot){if(y)return!1;var t=document.createElement("x");return t.style.cssText="pointer-events:auto","auto"===t.style.pointerEvents}}(),Pt=function(t,e){var n=R(t),o=parseInt(n.width)-parseInt(n.paddingLeft)-parseInt(n.paddingRight)-parseInt(n.borderLeftWidth)-parseInt(n.borderRightWidth),i=B(t,0,e),r=B(t,1,e),a=i&&R(i),l=r&&R(r),s=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+X(i).width,t=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+X(r).width;if("flex"===n.display)return"column"===n.flexDirection||"column-reverse"===n.flexDirection?"vertical":"horizontal";if("grid"===n.display)return n.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(i&&a.float&&"none"!==a.float){e="left"===a.float?"left":"right";return!r||"both"!==l.clear&&l.clear!==e?"horizontal":"vertical"}return i&&("block"===a.display||"flex"===a.display||"table"===a.display||"grid"===a.display||o<=s&&"none"===n[At]||r&&"none"===n[At]&&o<s+t)?"vertical":"horizontal"},kt=function(t){function l(r,a){return function(t,e,n,o){var i=t.options.group.name&&e.options.group.name&&t.options.group.name===e.options.group.name;if(null==r&&(a||i))return!0;if(null==r||!1===r)return!1;if(a&&"clone"===r)return r;if("function"==typeof r)return l(r(t,e,n,o),a)(t,e,n,o);e=(a?t:e).options.group.name;return!0===r||"string"==typeof r&&r===e||r.join&&-1<r.indexOf(e)}}var e={},n=t.group;n&&"object"==o(n)||(n={name:n}),e.name=n.name,e.checkPull=l(n.pull,!0),e.checkPut=l(n.put),e.revertClone=n.revertClone,t.group=e},Rt=function(){!It&&$&&R($,"display","none")},Xt=function(){!It&&$&&R($,"display","")};Ot&&!c&&document.addEventListener("click",function(t){if(Et)return t.preventDefault(),t.stopPropagation&&t.stopPropagation(),t.stopImmediatePropagation&&t.stopImmediatePropagation(),Et=!1},!0);function Yt(t){if(V){t=t.touches?t.touches[0]:t;var e=(i=t.clientX,r=t.clientY,Dt.some(function(t){var e=t[K].options.emptyInsertThreshold;if(e&&!F(t)){var n=X(t),o=i>=n.left-e&&i<=n.right+e,e=r>=n.top-e&&r<=n.bottom+e;return o&&e?a=t:void 0}}),a);if(e){var n,o={};for(n in t)t.hasOwnProperty(n)&&(o[n]=t[n]);o.target=o.rootEl=e,o.preventDefault=void 0,o.stopPropagation=void 0,e[K]._onDragOver(o)}}var i,r,a}function Bt(t){V&&V.parentNode[K]._isOutsideThisEl(t.target)}function Ft(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[K]=this;var n,o,i={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Pt(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Ft.supportPointer&&"PointerEvent"in window&&!u,emptyInsertThreshold:5};for(n in W.initializePlugins(this,t,i),i)n in e||(e[n]=i[n]);for(o in kt(e),this)"_"===o.charAt(0)&&"function"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!e.forceFallback&&Nt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?h(t,"pointerdown",this._onTapStart):(h(t,"mousedown",this._onTapStart),h(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(h(t,"dragover",this),h(t,"dragenter",this)),Dt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,x())}function jt(t,e,n,o,i,r,a,l){var s,c,u=t[K],d=u.options.onMove;return!window.CustomEvent||y||w?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),c=d?d.call(u,s,a):c}function Ht(t){t.draggable=!1}function Lt(){Tt=!1}function Kt(t){return setTimeout(t,0)}function Wt(t){return clearTimeout(t)}Ft.prototype={constructor:Ft,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(mt=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,V):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(!function(t){xt.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&xt.push(o)}}(o),!V&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled)&&!s.isContentEditable&&(this.nativeDraggable||!u||!l||"SELECT"!==l.tagName.toUpperCase())&&!((l=P(l,t.draggable,o,!1))&&l.animated||tt===l)){if(ot=j(l),rt=j(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return q({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),G("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c=c&&c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return q({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),G("filter",n,{evt:e}),!0}))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;n&&!V&&n.parentNode===r&&(o=X(n),Q=r,Z=(V=n).parentNode,J=V.nextSibling,tt=n,lt=a.group,ct={target:Ft.dragged=V,clientX:(e||t).clientX,clientY:(e||t).clientY},ft=ct.clientX-o.left,pt=ct.clientY-o.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,V.style["will-change"]="all",o=function(){G("delayEnded",i,{evt:t}),Ft.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!s&&i.nativeDraggable&&(V.draggable=!0),i._triggerDragStart(t,e),q({sortable:i,name:"choose",originalEvent:t}),k(V,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){b(V,t.trim(),Ht)}),h(l,"dragover",Yt),h(l,"mousemove",Yt),h(l,"touchmove",Yt),h(l,"mouseup",i._onDrop),h(l,"touchend",i._onDrop),h(l,"touchcancel",i._onDrop),s&&this.nativeDraggable&&(this.options.touchStartThreshold=4,V.draggable=!0),G("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(w||y)?o():Ft.eventCanceled?this._onDrop():(h(l,"mouseup",i._disableDelayedDrag),h(l,"touchend",i._disableDelayedDrag),h(l,"touchcancel",i._disableDelayedDrag),h(l,"mousemove",i._delayedDragTouchMoveHandler),h(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&h(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)))},_delayedDragTouchMoveHandler:function(t){t=t.touches?t.touches[0]:t;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){V&&Ht(V),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;f(t,"mouseup",this._disableDelayedDrag),f(t,"touchend",this._disableDelayedDrag),f(t,"touchcancel",this._disableDelayedDrag),f(t,"mousemove",this._delayedDragTouchMoveHandler),f(t,"touchmove",this._delayedDragTouchMoveHandler),f(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?h(document,"pointermove",this._onTouchMove):h(document,e?"touchmove":"mousemove",this._onTouchMove):(h(V,"dragend",this),h(Q,"dragstart",this._onDragStart));try{document.selection?Kt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){var n;wt=!1,Q&&V?(G("dragStarted",this,{evt:e}),this.nativeDraggable&&h(document,"dragover",Bt),n=this.options,t||k(V,n.dragClass,!1),k(V,n.ghostClass,!0),Ft.active=this,t&&this._appendGhost(),q({sortable:this,name:"start",originalEvent:e})):this._nulling()},_emulateDragOver:function(){if(ut){this._lastX=ut.clientX,this._lastY=ut.clientY,Rt();for(var t=document.elementFromPoint(ut.clientX,ut.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(ut.clientX,ut.clientY))!==e;)e=t;if(V.parentNode[K]._isOutsideThisEl(t),e)do{if(e[K])if(e[K]._onDragOver({clientX:ut.clientX,clientY:ut.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}while(e=(t=e).parentNode);Xt()}},_onTouchMove:function(t){if(ct){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=$&&v($,!0),a=$&&r&&r.a,l=$&&r&&r.d,e=Mt&&yt&&E(yt),a=(i.clientX-ct.clientX+o.x)/(a||1)+(e?e[0]-Ct[0]:0)/(a||1),l=(i.clientY-ct.clientY+o.y)/(l||1)+(e?e[1]-Ct[1]:0)/(l||1);if(!Ft.active&&!wt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))<n)return;this._onDragStart(t,!0)}$&&(r?(r.e+=a-(dt||0),r.f+=l-(ht||0)):r={a:1,b:0,c:0,d:1,e:a,f:l},r="matrix(".concat(r.a,",").concat(r.b,",").concat(r.c,",").concat(r.d,",").concat(r.e,",").concat(r.f,")"),R($,"webkitTransform",r),R($,"mozTransform",r),R($,"msTransform",r),R($,"transform",r),dt=a,ht=l,ut=i),t.cancelable&&t.preventDefault()}},_appendGhost:function(){if(!$){var t=this.options.fallbackOnBody?document.body:Q,e=X(V,!0,Mt,!0,t),n=this.options;if(Mt){for(yt=t;"static"===R(yt,"position")&&"none"===R(yt,"transform")&&yt!==document;)yt=yt.parentNode;yt!==document.body&&yt!==document.documentElement?(yt===document&&(yt=O()),e.top+=yt.scrollTop,e.left+=yt.scrollLeft):yt=O(),Ct=E(yt)}k($=V.cloneNode(!0),n.ghostClass,!1),k($,n.fallbackClass,!0),k($,n.dragClass,!0),R($,"transition",""),R($,"transform",""),R($,"box-sizing","border-box"),R($,"margin",0),R($,"top",e.top),R($,"left",e.left),R($,"width",e.width),R($,"height",e.height),R($,"opacity","0.8"),R($,"position",Mt?"absolute":"fixed"),R($,"zIndex","100000"),R($,"pointerEvents","none"),Ft.ghost=$,t.appendChild($),R($,"transform-origin",ft/parseInt($.style.width)*100+"% "+pt/parseInt($.style.height)*100+"%")}},_onDragStart:function(t,e){var n=this,o=t.dataTransfer,i=n.options;G("dragStart",this,{evt:t}),Ft.eventCanceled?this._onDrop():(G("setupClone",this),Ft.eventCanceled||((et=_(V)).removeAttribute("id"),et.draggable=!1,et.style["will-change"]="",this._hideClone(),k(et,this.options.chosenClass,!1),Ft.clone=et),n.cloneId=Kt(function(){G("clone",n),Ft.eventCanceled||(n.options.removeCloneOnHide||Q.insertBefore(et,V),n._hideClone(),q({sortable:n,name:"clone"}))}),e||k(V,i.dragClass,!0),e?(Et=!0,n._loopId=setInterval(n._emulateDragOver,50)):(f(document,"mouseup",n._onDrop),f(document,"touchend",n._onDrop),f(document,"touchcancel",n._onDrop),o&&(o.effectAllowed="move",i.setData&&i.setData.call(n,o,V)),h(document,"drop",n),R(V,"transform","translateZ(0)")),wt=!0,n._dragStartId=Kt(n._dragStarted.bind(n,e,t)),h(document,"selectstart",n),gt=!0,u&&R(document.body,"user-select","none"))},_onDragOver:function(n){var o,i,r,t,e,a=this.el,l=n.target,s=this.options,c=s.group,u=Ft.active,d=lt===c,h=s.sort,f=st||u,p=this,g=!1;if(!Tt){if(void 0!==n.preventDefault&&n.cancelable&&n.preventDefault(),l=P(l,s.draggable,a,!0),O("dragOver"),Ft.eventCanceled)return g;if(V.contains(n.target)||l.animated&&l.animatingX&&l.animatingY||p._ignoreWhileAnimating===l)return A(!1);if(Et=!1,u&&!s.disabled&&(d?h||(i=Z!==Q):st===this||(this.lastPutMode=lt.checkPull(this,u,V,n))&&c.checkPut(this,u,V,n))){if(r="vertical"===this._getDirection(n,l),o=X(V),O("dragOverValid"),Ft.eventCanceled)return g;if(i)return Z=Q,M(),this._hideClone(),O("revert"),Ft.eventCanceled||(J?Q.insertBefore(V,J):Q.appendChild(V)),A(!0);var m=F(a,s.draggable);if(m&&(S=n,c=r,x=X(F((D=this).el,D.options.draggable)),D=L(D.el,D.options,$),!(c?S.clientX>D.right+10||S.clientY>x.bottom&&S.clientX>x.left:S.clientY>D.bottom+10||S.clientX>x.right&&S.clientY>x.top)||m.animated)){if(m&&(t=n,e=r,C=X(B((_=this).el,0,_.options,!0)),_=L(_.el,_.options,$),e?t.clientX<_.left-10||t.clientY<C.top&&t.clientX<C.right:t.clientY<_.top-10||t.clientY<C.bottom&&t.clientX<C.left)){var v=B(a,0,s,!0);if(v===V)return A(!1);if(E=X(l=v),!1!==jt(Q,a,V,o,l,E,n,!1))return M(),a.insertBefore(V,v),Z=a,N(),A(!0)}else if(l.parentNode===a){var b,y,w,E=X(l),D=V.parentNode!==a,S=(S=V.animated&&V.toRect||o,x=l.animated&&l.toRect||E,_=(e=r)?S.left:S.top,t=e?S.right:S.bottom,C=e?S.width:S.height,v=e?x.left:x.top,S=e?x.right:x.bottom,x=e?x.width:x.height,!(_===v||t===S||_+C/2===v+x/2)),_=r?"top":"left",C=Y(l,"top","top")||Y(V,"top","top"),v=C?C.scrollTop:void 0;if(mt!==l&&(y=E[_],St=!1,_t=!S&&s.invertSwap||D),0!==(b=function(t,e,n,o,i,r,a,l){var s=o?t.clientY:t.clientX,c=o?n.height:n.width,t=o?n.top:n.left,o=o?n.bottom:n.right,n=!1;if(!a)if(l&&bt<c*i){if(St=!St&&(1===vt?t+c*r/2<s:s<o-c*r/2)?!0:St)n=!0;else if(1===vt?s<t+bt:o-bt<s)return-vt}else if(t+c*(1-i)/2<s&&s<o-c*(1-i)/2)return function(t){return j(V)<j(t)?1:-1}(e);if((n=n||a)&&(s<t+c*r/2||o-c*r/2<s))return t+c/2<s?1:-1;return 0}(n,l,E,r,S?1:s.swapThreshold,null==s.invertedSwapThreshold?s.swapThreshold:s.invertedSwapThreshold,_t,mt===l)))for(var T=j(V);(w=Z.children[T-=b])&&("none"===R(w,"display")||w===$););if(0===b||w===l)return A(!1);vt=b;var x=(mt=l).nextElementSibling,D=!1,S=jt(Q,a,V,o,l,E,n,D=1===b);if(!1!==S)return 1!==S&&-1!==S||(D=1===S),Tt=!0,setTimeout(Lt,30),M(),D&&!x?a.appendChild(V):l.parentNode.insertBefore(V,D?x:l),C&&H(C,0,v-C.scrollTop),Z=V.parentNode,void 0===y||_t||(bt=Math.abs(y-X(l)[_])),N(),A(!0)}}else{if(m===V)return A(!1);if((l=m&&a===n.target?m:l)&&(E=X(l)),!1!==jt(Q,a,V,o,l,E,n,!!l))return M(),m&&m.nextSibling?a.insertBefore(V,m.nextSibling):a.appendChild(V),Z=a,N(),A(!0)}if(a.contains(V))return A(!1)}return!1}function O(t,e){G(t,p,I({evt:n,isOwner:d,axis:r?"vertical":"horizontal",revert:i,dragRect:o,targetRect:E,canSort:h,fromSortable:f,target:l,completed:A,onMove:function(t,e){return jt(Q,a,V,o,t,X(t),n,e)},changed:N},e))}function M(){O("dragOverAnimationCapture"),p.captureAnimationState(),p!==f&&f.captureAnimationState()}function A(t){return O("dragOverCompleted",{insertion:t}),t&&(d?u._hideClone():u._showClone(p),p!==f&&(k(V,(st||u).options.ghostClass,!1),k(V,s.ghostClass,!0)),st!==p&&p!==Ft.active?st=p:p===Ft.active&&st&&(st=null),f===p&&(p._ignoreWhileAnimating=l),p.animateAll(function(){O("dragOverAnimationComplete"),p._ignoreWhileAnimating=null}),p!==f&&(f.animateAll(),f._ignoreWhileAnimating=null)),(l===V&&!V.animated||l===a&&!l.animated)&&(mt=null),s.dragoverBubble||n.rootEl||l===document||(V.parentNode[K]._isOutsideThisEl(n.target),t||Yt(n)),!s.dragoverBubble&&n.stopPropagation&&n.stopPropagation(),g=!0}function N(){it=j(V),at=j(V,s.draggable),q({sortable:p,name:"change",toEl:a,newIndex:it,newDraggableIndex:at,originalEvent:n})}},_ignoreWhileAnimating:null,_offMoveEvents:function(){f(document,"mousemove",this._onTouchMove),f(document,"touchmove",this._onTouchMove),f(document,"pointermove",this._onTouchMove),f(document,"dragover",Yt),f(document,"mousemove",Yt),f(document,"touchmove",Yt)},_offUpEvents:function(){var t=this.el.ownerDocument;f(t,"mouseup",this._onDrop),f(t,"touchend",this._onDrop),f(t,"pointerup",this._onDrop),f(t,"touchcancel",this._onDrop),f(document,"selectstart",this)},_onDrop:function(t){var e=this.el,n=this.options;it=j(V),at=j(V,n.draggable),G("drop",this,{evt:t}),Z=V&&V.parentNode,it=j(V),at=j(V,n.draggable),Ft.eventCanceled||(St=_t=wt=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),Wt(this.cloneId),Wt(this._dragStartId),this.nativeDraggable&&(f(document,"drop",this),f(e,"dragstart",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),u&&R(document.body,"user-select",""),R(V,"transform",""),t&&(gt&&(t.cancelable&&t.preventDefault(),n.dropBubble||t.stopPropagation()),$&&$.parentNode&&$.parentNode.removeChild($),(Q===Z||st&&"clone"!==st.lastPutMode)&&et&&et.parentNode&&et.parentNode.removeChild(et),V&&(this.nativeDraggable&&f(V,"dragend",this),Ht(V),V.style["will-change"]="",gt&&!wt&&k(V,(st||this).options.ghostClass,!1),k(V,this.options.chosenClass,!1),q({sortable:this,name:"unchoose",toEl:Z,newIndex:null,newDraggableIndex:null,originalEvent:t}),Q!==Z?(0<=it&&(q({rootEl:Z,name:"add",toEl:Z,fromEl:Q,originalEvent:t}),q({sortable:this,name:"remove",toEl:Z,originalEvent:t}),q({rootEl:Z,name:"sort",toEl:Z,fromEl:Q,originalEvent:t}),q({sortable:this,name:"sort",toEl:Z,originalEvent:t})),st&&st.save()):it!==ot&&0<=it&&(q({sortable:this,name:"update",toEl:Z,originalEvent:t}),q({sortable:this,name:"sort",toEl:Z,originalEvent:t})),Ft.active&&(null!=it&&-1!==it||(it=ot,at=rt),q({sortable:this,name:"end",toEl:Z,originalEvent:t}),this.save())))),this._nulling()},_nulling:function(){G("nulling",this),Q=V=Z=$=J=et=tt=nt=ct=ut=gt=it=at=ot=rt=mt=vt=st=lt=Ft.dragged=Ft.ghost=Ft.clone=Ft.active=null,xt.forEach(function(t){t.checked=!0}),xt.length=dt=ht=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragenter":case"dragover":V&&(this._onDragOver(t),function(t){t.dataTransfer&&(t.dataTransfer.dropEffect="move");t.cancelable&&t.preventDefault()}(t));break;case"selectstart":t.preventDefault()}},toArray:function(){for(var t,e=[],n=this.el.children,o=0,i=n.length,r=this.options;o<i;o++)P(t=n[o],r.draggable,this.el,!1)&&e.push(t.getAttribute(r.dataIdAttr)||function(t){var e=t.tagName+t.className+t.src+t.href+t.textContent,n=e.length,o=0;for(;n--;)o+=e.charCodeAt(n);return o.toString(36)}(t));return e},sort:function(t,e){var n={},o=this.el;this.toArray().forEach(function(t,e){e=o.children[e];P(e,this.options.draggable,o,!1)&&(n[t]=e)},this),e&&this.captureAnimationState(),t.forEach(function(t){n[t]&&(o.removeChild(n[t]),o.appendChild(n[t]))}),e&&this.animateAll()},save:function(){var t=this.options.store;t&&t.set&&t.set(this)},closest:function(t,e){return P(t,e||this.options.draggable,this.el,!1)},option:function(t,e){var n=this.options;if(void 0===e)return n[t];var o=W.modifyOption(this,t,e);n[t]=void 0!==o?o:e,"group"===t&&kt(n)},destroy:function(){G("destroy",this);var t=this.el;t[K]=null,f(t,"mousedown",this._onTapStart),f(t,"touchstart",this._onTapStart),f(t,"pointerdown",this._onTapStart),this.nativeDraggable&&(f(t,"dragover",this),f(t,"dragenter",this)),Array.prototype.forEach.call(t.querySelectorAll("[draggable]"),function(t){t.removeAttribute("draggable")}),this._onDrop(),this._disableDelayedDragEvents(),Dt.splice(Dt.indexOf(this.el),1),this.el=t=null},_hideClone:function(){nt||(G("hideClone",this),Ft.eventCanceled||(R(et,"display","none"),this.options.removeCloneOnHide&&et.parentNode&&et.parentNode.removeChild(et),nt=!0))},_showClone:function(t){"clone"===t.lastPutMode?nt&&(G("showClone",this),Ft.eventCanceled||(V.parentNode!=Q||this.options.group.revertClone?J?Q.insertBefore(et,J):Q.appendChild(et):Q.insertBefore(et,V),this.options.group.revertClone&&this.animate(V,et),R(et,"display",""),nt=!1)):this._hideClone()}},Ot&&h(document,"touchmove",function(t){(Ft.active||wt)&&t.cancelable&&t.preventDefault()}),Ft.utils={on:h,off:f,css:R,find:b,is:function(t,e){return!!P(t,e,t,!1)},extend:function(t,e){if(t&&e)for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t},throttle:S,closest:P,toggleClass:k,clone:_,index:j,nextTick:Kt,cancelNextTick:Wt,detectDirection:Pt,getChild:B},Ft.get=function(t){return t[K]},Ft.mount=function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];(e=e[0].constructor===Array?e[0]:e).forEach(function(t){if(!t.prototype||!t.prototype.constructor)throw"Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(t));t.utils&&(Ft.utils=I(I({},Ft.utils),t.utils)),W.mount(t)})},Ft.create=function(t,e){return new Ft(t,e)};var zt,Gt,Ut,qt,Vt,Zt,$t=[],Qt=!(Ft.version="1.15.2");function Jt(){$t.forEach(function(t){clearInterval(t.pid)}),$t=[]}function te(){clearInterval(Zt)}var ee,ne=S(function(n,t,e,o){if(t.scroll){var i,r=(n.touches?n.touches[0]:n).clientX,a=(n.touches?n.touches[0]:n).clientY,l=t.scrollSensitivity,s=t.scrollSpeed,c=O(),u=!1;Gt!==e&&(Gt=e,Jt(),zt=t.scroll,i=t.scrollFn,!0===zt&&(zt=M(e,!0)));var d=0,h=zt;do{var f=h,p=X(f),g=p.top,m=p.bottom,v=p.left,b=p.right,y=p.width,w=p.height,E=void 0,D=void 0,S=f.scrollWidth,_=f.scrollHeight,C=R(f),T=f.scrollLeft,p=f.scrollTop,D=f===c?(E=y<S&&("auto"===C.overflowX||"scroll"===C.overflowX||"visible"===C.overflowX),w<_&&("auto"===C.overflowY||"scroll"===C.overflowY||"visible"===C.overflowY)):(E=y<S&&("auto"===C.overflowX||"scroll"===C.overflowX),w<_&&("auto"===C.overflowY||"scroll"===C.overflowY)),T=E&&(Math.abs(b-r)<=l&&T+y<S)-(Math.abs(v-r)<=l&&!!T),p=D&&(Math.abs(m-a)<=l&&p+w<_)-(Math.abs(g-a)<=l&&!!p);if(!$t[d])for(var x=0;x<=d;x++)$t[x]||($t[x]={});$t[d].vx==T&&$t[d].vy==p&&$t[d].el===f||($t[d].el=f,$t[d].vx=T,$t[d].vy=p,clearInterval($t[d].pid),0==T&&0==p||(u=!0,$t[d].pid=setInterval(function(){o&&0===this.layer&&Ft.active._onTouchMove(Vt);var t=$t[this.layer].vy?$t[this.layer].vy*s:0,e=$t[this.layer].vx?$t[this.layer].vx*s:0;"function"==typeof i&&"continue"!==i.call(Ft.dragged.parentNode[K],e,t,n,Vt,$t[this.layer].el)||H($t[this.layer].el,e,t)}.bind({layer:d}),24))),d++}while(t.bubbleScroll&&h!==c&&(h=M(h,!1)));Qt=u}},30),c=function(t){var e=t.originalEvent,n=t.putSortable,o=t.dragEl,i=t.activeSortable,r=t.dispatchSortableEvent,a=t.hideGhostForTarget,t=t.unhideGhostForTarget;e&&(i=n||i,a(),e=e.changedTouches&&e.changedTouches.length?e.changedTouches[0]:e,e=document.elementFromPoint(e.clientX,e.clientY),t(),i&&!i.el.contains(e)&&(r("spill"),this.onSpill({dragEl:o,putSortable:n})))};function oe(){}function ie(){}oe.prototype={startIndex:null,dragStart:function(t){t=t.oldDraggableIndex;this.startIndex=t},onSpill:function(t){var e=t.dragEl,n=t.putSortable;this.sortable.captureAnimationState(),n&&n.captureAnimationState();t=B(this.sortable.el,this.startIndex,this.options);t?this.sortable.el.insertBefore(e,t):this.sortable.el.appendChild(e),this.sortable.animateAll(),n&&n.animateAll()},drop:c},a(oe,{pluginName:"revertOnSpill"}),ie.prototype={onSpill:function(t){var e=t.dragEl,t=t.putSortable||this.sortable;t.captureAnimationState(),e.parentNode&&e.parentNode.removeChild(e),t.animateAll()},drop:c},a(ie,{pluginName:"removeOnSpill"});var re,ae,le,se,ce,ue=[],de=[],he=!1,fe=!1,pe=!1;function ge(n,o){de.forEach(function(t,e){e=o.children[t.sortableIndex+(n?Number(e):0)];e?o.insertBefore(t,e):o.appendChild(t)})}function me(){ue.forEach(function(t){t!==le&&t.parentNode&&t.parentNode.removeChild(t)})}return Ft.mount(new function(){function t(){for(var t in this.defaults={scroll:!0,forceAutoScrollFallback:!1,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0},this)"_"===t.charAt(0)&&"function"==typeof this[t]&&(this[t]=this[t].bind(this))}return t.prototype={dragStarted:function(t){t=t.originalEvent;this.sortable.nativeDraggable?h(document,"dragover",this._handleAutoScroll):this.options.supportPointer?h(document,"pointermove",this._handleFallbackAutoScroll):t.touches?h(document,"touchmove",this._handleFallbackAutoScroll):h(document,"mousemove",this._handleFallbackAutoScroll)},dragOverCompleted:function(t){t=t.originalEvent;this.options.dragOverBubble||t.rootEl||this._handleAutoScroll(t)},drop:function(){this.sortable.nativeDraggable?f(document,"dragover",this._handleAutoScroll):(f(document,"pointermove",this._handleFallbackAutoScroll),f(document,"touchmove",this._handleFallbackAutoScroll),f(document,"mousemove",this._handleFallbackAutoScroll)),te(),Jt(),clearTimeout(g),g=void 0},nulling:function(){Vt=Gt=zt=Qt=Zt=Ut=qt=null,$t.length=0},_handleFallbackAutoScroll:function(t){this._handleAutoScroll(t,!0)},_handleAutoScroll:function(e,n){var o,i=this,r=(e.touches?e.touches[0]:e).clientX,a=(e.touches?e.touches[0]:e).clientY,t=document.elementFromPoint(r,a);Vt=e,n||this.options.forceAutoScrollFallback||w||y||u?(ne(e,this.options,t,n),o=M(t,!0),!Qt||Zt&&r===Ut&&a===qt||(Zt&&te(),Zt=setInterval(function(){var t=M(document.elementFromPoint(r,a),!0);t!==o&&(o=t,Jt()),ne(e,i.options,t,n)},10),Ut=r,qt=a)):this.options.bubbleScroll&&M(t,!0)!==O()?ne(e,this.options,M(t,!1),!1):Jt()}},a(t,{pluginName:"scroll",initializeByDefault:!0})}),Ft.mount(ie,oe),Ft.mount(new function(){function t(){this.defaults={swapClass:"sortable-swap-highlight"}}return t.prototype={dragStart:function(t){t=t.dragEl;ee=t},dragOverValid:function(t){var e=t.completed,n=t.target,o=t.onMove,i=t.activeSortable,r=t.changed,a=t.cancel;i.options.swap&&(t=this.sortable.el,i=this.options,n&&n!==t&&(t=ee,ee=!1!==o(n)?(k(n,i.swapClass,!0),n):null,t&&t!==ee&&k(t,i.swapClass,!1)),r(),e(!0),a())},drop:function(t){var e,n,o=t.activeSortable,i=t.putSortable,r=t.dragEl,a=i||this.sortable,l=this.options;ee&&k(ee,l.swapClass,!1),ee&&(l.swap||i&&i.options.swap)&&r!==ee&&(a.captureAnimationState(),a!==o&&o.captureAnimationState(),n=ee,t=(e=r).parentNode,l=n.parentNode,t&&l&&!t.isEqualNode(n)&&!l.isEqualNode(e)&&(i=j(e),r=j(n),t.isEqualNode(l)&&i<r&&r++,t.insertBefore(n,t.children[i]),l.insertBefore(e,l.children[r])),a.animateAll(),a!==o&&o.animateAll())},nulling:function(){ee=null}},a(t,{pluginName:"swap",eventProperties:function(){return{swapItem:ee}}})}),Ft.mount(new function(){function t(o){for(var t in this)"_"===t.charAt(0)&&"function"==typeof this[t]&&(this[t]=this[t].bind(this));o.options.avoidImplicitDeselect||(o.options.supportPointer?h(document,"pointerup",this._deselectMultiDrag):(h(document,"mouseup",this._deselectMultiDrag),h(document,"touchend",this._deselectMultiDrag))),h(document,"keydown",this._checkKeyDown),h(document,"keyup",this._checkKeyUp),this.defaults={selectedClass:"sortable-selected",multiDragKey:null,avoidImplicitDeselect:!1,setData:function(t,e){var n="";ue.length&&ae===o?ue.forEach(function(t,e){n+=(e?", ":"")+t.textContent}):n=e.textContent,t.setData("Text",n)}}}return t.prototype={multiDragKeyDown:!1,isMultiDrag:!1,delayStartGlobal:function(t){t=t.dragEl;le=t},delayEnded:function(){this.isMultiDrag=~ue.indexOf(le)},setupClone:function(t){var e=t.sortable,t=t.cancel;if(this.isMultiDrag){for(var n=0;n<ue.length;n++)de.push(_(ue[n])),de[n].sortableIndex=ue[n].sortableIndex,de[n].draggable=!1,de[n].style["will-change"]="",k(de[n],this.options.selectedClass,!1),ue[n]===le&&k(de[n],this.options.chosenClass,!1);e._hideClone(),t()}},clone:function(t){var e=t.sortable,n=t.rootEl,o=t.dispatchSortableEvent,t=t.cancel;this.isMultiDrag&&(this.options.removeCloneOnHide||ue.length&&ae===e&&(ge(!0,n),o("clone"),t()))},showClone:function(t){var e=t.cloneNowShown,n=t.rootEl,t=t.cancel;this.isMultiDrag&&(ge(!1,n),de.forEach(function(t){R(t,"display","")}),e(),ce=!1,t())},hideClone:function(t){var e=this,n=(t.sortable,t.cloneNowHidden),t=t.cancel;this.isMultiDrag&&(de.forEach(function(t){R(t,"display","none"),e.options.removeCloneOnHide&&t.parentNode&&t.parentNode.removeChild(t)}),n(),ce=!0,t())},dragStartGlobal:function(t){t.sortable;!this.isMultiDrag&&ae&&ae.multiDrag._deselectMultiDrag(),ue.forEach(function(t){t.sortableIndex=j(t)}),ue=ue.sort(function(t,e){return t.sortableIndex-e.sortableIndex}),pe=!0},dragStarted:function(t){var e,n=this,t=t.sortable;this.isMultiDrag&&(this.options.sort&&(t.captureAnimationState(),this.options.animation&&(ue.forEach(function(t){t!==le&&R(t,"position","absolute")}),e=X(le,!1,!0,!0),ue.forEach(function(t){t!==le&&C(t,e)}),he=fe=!0)),t.animateAll(function(){he=fe=!1,n.options.animation&&ue.forEach(function(t){T(t)}),n.options.sort&&me()}))},dragOver:function(t){var e=t.target,n=t.completed,t=t.cancel;fe&&~ue.indexOf(e)&&(n(!1),t())},revert:function(t){var n,o,e=t.fromSortable,i=t.rootEl,r=t.sortable,a=t.dragRect;1<ue.length&&(ue.forEach(function(t){r.addAnimationState({target:t,rect:fe?X(t):a}),T(t),t.fromRect=a,e.removeAnimationState(t)}),fe=!1,n=!this.options.removeCloneOnHide,o=i,ue.forEach(function(t,e){e=o.children[t.sortableIndex+(n?Number(e):0)];e?o.insertBefore(t,e):o.appendChild(t)}))},dragOverCompleted:function(t){var e,n=t.sortable,o=t.isOwner,i=t.insertion,r=t.activeSortable,a=t.parentEl,l=t.putSortable,t=this.options;i&&(o&&r._hideClone(),he=!1,t.animation&&1<ue.length&&(fe||!o&&!r.options.sort&&!l)&&(e=X(le,!1,!0,!0),ue.forEach(function(t){t!==le&&(C(t,e),a.appendChild(t))}),fe=!0),o||(fe||me(),1<ue.length?(o=ce,r._showClone(n),r.options.animation&&!ce&&o&&de.forEach(function(t){r.addAnimationState({target:t,rect:se}),t.fromRect=se,t.thisAnimationDuration=null})):r._showClone(n)))},dragOverAnimationCapture:function(t){var e=t.dragRect,n=t.isOwner,t=t.activeSortable;ue.forEach(function(t){t.thisAnimationDuration=null}),t.options.animation&&!n&&t.multiDrag.isMultiDrag&&(se=a({},e),e=v(le,!0),se.top-=e.f,se.left-=e.e)},dragOverAnimationComplete:function(){fe&&(fe=!1,me())},drop:function(t){var e=t.originalEvent,n=t.rootEl,o=t.parentEl,i=t.sortable,r=t.dispatchSortableEvent,a=t.oldIndex,l=t.putSortable,s=l||this.sortable;if(e){var c,u,d,h=this.options,f=o.children;if(!pe)if(h.multiDragKey&&!this.multiDragKeyDown&&this._deselectMultiDrag(),k(le,h.selectedClass,!~ue.indexOf(le)),~ue.indexOf(le))ue.splice(ue.indexOf(le),1),re=null,z({sortable:i,rootEl:n,name:"deselect",targetEl:le,originalEvent:e});else{if(ue.push(le),z({sortable:i,rootEl:n,name:"select",targetEl:le,originalEvent:e}),e.shiftKey&&re&&i.el.contains(re)){var p=j(re),t=j(le);if(~p&&~t&&p!==t)for(var g,m=p<t?(g=p,t):(g=t,p+1);g<m;g++)~ue.indexOf(f[g])||(k(f[g],h.selectedClass,!0),ue.push(f[g]),z({sortable:i,rootEl:n,name:"select",targetEl:f[g],originalEvent:e}))}else re=le;ae=s}pe&&this.isMultiDrag&&(fe=!1,(o[K].options.sort||o!==n)&&1<ue.length&&(c=X(le),u=j(le,":not(."+this.options.selectedClass+")"),!he&&h.animation&&(le.thisAnimationDuration=null),s.captureAnimationState(),he||(h.animation&&(le.fromRect=c,ue.forEach(function(t){var e;t.thisAnimationDuration=null,t!==le&&(e=fe?X(t):c,t.fromRect=e,s.addAnimationState({target:t,rect:e}))})),me(),ue.forEach(function(t){f[u]?o.insertBefore(t,f[u]):o.appendChild(t),u++}),a===j(le)&&(d=!1,ue.forEach(function(t){t.sortableIndex!==j(t)&&(d=!0)}),d&&(r("update"),r("sort")))),ue.forEach(function(t){T(t)}),s.animateAll()),ae=s),(n===o||l&&"clone"!==l.lastPutMode)&&de.forEach(function(t){t.parentNode&&t.parentNode.removeChild(t)})}},nullingGlobal:function(){this.isMultiDrag=pe=!1,de.length=0},destroyGlobal:function(){this._deselectMultiDrag(),f(document,"pointerup",this._deselectMultiDrag),f(document,"mouseup",this._deselectMultiDrag),f(document,"touchend",this._deselectMultiDrag),f(document,"keydown",this._checkKeyDown),f(document,"keyup",this._checkKeyUp)},_deselectMultiDrag:function(t){if(!(void 0!==pe&&pe||ae!==this.sortable||t&&P(t.target,this.options.draggable,this.sortable.el,!1)||t&&0!==t.button))for(;ue.length;){var e=ue[0];k(e,this.options.selectedClass,!1),ue.shift(),z({sortable:this.sortable,rootEl:this.sortable.el,name:"deselect",targetEl:e,originalEvent:t})}},_checkKeyDown:function(t){t.key===this.options.multiDragKey&&(this.multiDragKeyDown=!0)},_checkKeyUp:function(t){t.key===this.options.multiDragKey&&(this.multiDragKeyDown=!1)}},a(t,{pluginName:"multiDrag",utils:{select:function(t){var e=t.parentNode[K];e&&e.options.multiDrag&&!~ue.indexOf(t)&&(ae&&ae!==e&&(ae.multiDrag._deselectMultiDrag(),ae=e),k(t,e.options.selectedClass,!0),ue.push(t))},deselect:function(t){var e=t.parentNode[K],n=ue.indexOf(t);e&&e.options.multiDrag&&~n&&(k(t,e.options.selectedClass,!1),ue.splice(n,1))}},eventProperties:function(){var n=this,o=[],i=[];return ue.forEach(function(t){var e;o.push({multiDragElement:t,index:t.sortableIndex}),e=fe&&t!==le?-1:fe?j(t,":not(."+n.options.selectedClass+")"):j(t),i.push({multiDragElement:t,index:e})}),{items:r(ue),clones:[].concat(de),oldIndicies:o,newIndicies:i}},optionListeners:{multiDragKey:function(t){return"ctrl"===(t=t.toLowerCase())?t="Control":1<t.length&&(t=t.charAt(0).toUpperCase()+t.substr(1)),t}}})}),Ft});';import{existsSync as be,readFileSync as Bt,writeFileSync as tt,rmSync as Yn,mkdirSync as jt,copyFileSync as zt}from"fs";import{resolve as ne}from"path";import{existsSync as M,readFileSync as ue,writeFileSync as me,mkdirSync as Y,readdirSync as pe,rmSync as Mt,statSync as I}from"fs";import{resolve as Je,relative as It,dirname as he,join as z,extname as J,basename as ge}from"path";var A=200*1024,Xe=new Set([".md",".markdown",".txt"]),G=new Set([".md",".markdown",".txt",".json",".jsonc",".yaml",".yml",".toml",".sh",".bash",".zsh",".py",".js",".mjs",".ts",".tsx",".jsx",".css",".html",".lock",".cfg",".ini",".env",".gitignore"]),Lt=6,Pt=new Set(["CLAUDE.md","SOUL.md","IDENTITY.md","PERSONA.md","AGENT.md","BOOTSTRAP.md"]);function H(t,e){if(!t)throw new Error("Agent workspace is not configured.");let a=Je(t);if(M(a)||Y(a,{recursive:!0}),!e||e.startsWith("/")||e.match(/^[a-zA-Z]:/))throw new Error(`Path must be relative to the workspace: ${e}`);let n=Je(a,e);if(It(a,n).startsWith(".."))throw new Error(`Path escapes the workspace: ${e}`);return n}function Ve(t){let e=J(t).toLowerCase();if(!Xe.has(e))throw new Error(`Only text files (.md, .markdown, .txt) can be edited from the admin panel (got ${e}).`)}function de(t,e){let a=t.split(/\r?\n/).find(n=>n.trim().startsWith("#"));return a&&a.replace(/^#+\s*/,"").trim().slice(0,120)||e}function F(t){let e=H(t,"."),a=[],n=new Set,o=[];try{o=pe(e)}catch{}for(let i of Pt){let l=z(e,i);if(M(l)&&I(l).isFile()){let d=I(l).size,u=d>0&&d<A?ce(l):"";a.push({path:i,title:de(u,i),size:d,exists:!0}),n.add(i)}else a.push({path:i,title:i,size:0,exists:!1}),n.add(i)}for(let i of o){if(n.has(i))continue;let l=z(e,i);try{let d=I(l);if(!d.isFile()||!Xe.has(J(i).toLowerCase()))continue;let u=d.size>0&&d.size<A?ce(l):"";a.push({path:i,title:de(u,i),size:d.size,exists:!0})}catch{}}let r=[],s=z(e,".claude","skills");if(M(s))try{for(let i of pe(s)){let l=z(s,i),d;try{d=I(l)}catch{continue}if(!d.isDirectory())continue;let u=z(l,"SKILL.md");if(!M(u))continue;let p=I(u),f=p.size<A?ce(u):"";r.push({slug:i,title:de(f,i),size:p.size,path:`.claude/skills/${i}/SKILL.md`})}}catch{}return r.sort((i,l)=>i.slug.localeCompare(l.slug)),{identity:a,skills:r,workspace:e}}function ce(t){try{return ue(t,"utf-8")}catch{return""}}function Q(t,e){let a=H(t,e);if(Ve(a),!M(a))return{path:e,content:""};if(I(a).size>A)throw new Error(`File is too large to edit in the admin panel (> ${A/1024} KB).`);return{path:e,content:ue(a,"utf-8")}}function Z(t,e,a){let n=H(t,e);Ve(n);let o=Buffer.from(a,"utf-8");if(o.length>A)throw new Error(`File too large (${o.length} > ${A} bytes).`);return Y(he(n),{recursive:!0}),me(n,o),{path:e,bytes:o.length}}function ee(t,e,a={}){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error("Skill slug must be lowercase (letters, digits, -, _) and start with a letter or digit.");let n=`.claude/skills/${e}/SKILL.md`,o=H(t,n);if(M(o))throw new Error(`Skill "${e}" already exists.`);Y(he(o),{recursive:!0});let r=a.content?.trim()?a.content:Dt(e,a.title);return me(o,r),{slug:e,path:n}}function te(t,e){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error(`Invalid skill slug: ${e}`);let a=H(t,`.claude/skills/${e}`);if(!M(a))throw new Error(`Skill "${e}" not found.`);if(!I(a).isDirectory())throw new Error(`Skill path is not a directory: ${e}`);return Mt(a,{recursive:!0,force:!0}),{slug:e}}function Ye(t,e){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error(`Invalid skill slug: ${e}`);let a=H(t,`.claude/skills/${e}`);if(!M(a))throw new Error(`Skill "${e}" not found.`);let n=[];return o(a,"",0,n),n.sort((r,s)=>r.kind!==s.kind?r.kind==="dir"?-1:1:r.path.localeCompare(s.path)),n;function o(r,s,i,l){if(i>Lt)return;let d=[];try{d=pe(r)}catch{return}for(let u of d){if(u==="node_modules"||u===".git")continue;let p=z(r,u),f=s?`${s}/${u}`:u,b;try{b=I(p)}catch{continue}if(b.isDirectory())l.push({path:`${f}/`,kind:"dir",size:0,editable:!1}),o(p,f,i+1,l);else if(b.isFile()){let c=J(u).toLowerCase(),m=G.has(c)||G.has(u.toLowerCase());l.push({path:f,kind:"file",size:b.size,editable:m&&b.size<A})}}}}function Qe(t,e,a){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error(`Invalid skill slug: ${e}`);if(!a||a.includes(".."))throw new Error(`Invalid file path: ${a}`);let n=H(t,`.claude/skills/${e}/${a}`);if(!M(n)||!I(n).isFile())throw new Error(`File not found: ${a}`);let o=J(n).toLowerCase(),r=ge(n).toLowerCase();if(!G.has(o)&&!G.has(r))throw new Error(`File type not editable: ${a}`);if(I(n).size>A)throw new Error(`File too large to edit (> ${A/1024} KB): ${a}`);return{path:a,content:ue(n,"utf-8")}}function Ze(t,e,a,n){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error(`Invalid skill slug: ${e}`);if(!a||a.includes(".."))throw new Error(`Invalid file path: ${a}`);let o=H(t,`.claude/skills/${e}/${a}`),r=J(o).toLowerCase(),s=ge(o).toLowerCase();if(!G.has(r)&&!G.has(s))throw new Error(`File type not editable: ${a}`);let i=Buffer.from(n,"utf-8");if(i.length>A)throw new Error(`File too large (${i.length} > ${A} bytes).`);return Y(he(o),{recursive:!0}),me(o,i),{path:a,bytes:i.length}}function ae(t,e){if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error(`Invalid skill slug: ${e}`);let a=H(t,`.claude/skills/${e}`);if(!M(a))throw new Error(`Skill "${e}" not found.`);let n=o=>M(z(a,o));return n("pnpm-lock.yaml")?{manager:"pnpm",file:"pnpm-lock.yaml",command:"pnpm install"}:n("yarn.lock")?{manager:"yarn",file:"yarn.lock",command:"yarn install"}:n("package.json")?{manager:"npm",file:"package.json",command:"npm install"}:n("requirements.txt")?{manager:"pip",file:"requirements.txt",command:"pip install -r requirements.txt"}:n("Gemfile")?{manager:"bundle",file:"Gemfile",command:"bundle install"}:{manager:null,file:null,command:null}}function Dt(t,e){return`# ${e?.trim()||t}
2
2
 
3
3
  Describe what this skill does and when the agent should use it. Keep it under ~5 lines \u2014 the agent reads this to decide whether to invoke the skill.
4
4
 
@@ -11,12 +11,12 @@ Document the arguments, commands, or files the skill expects. Example:
11
11
 
12
12
  \`\`\`bash
13
13
  # Example invocation
14
- claude-code ${fe(t)} --arg value
14
+ claude-code ${ge(t)} --arg value
15
15
  \`\`\`
16
- `}var q={agents:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="10" rx="2"/><circle cx="12" cy="5" r="2"/><path d="M12 7v4M8 16h.01M16 16h.01"/></svg>',channels:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"/></svg>',schedules:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>',webhooks:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M10 12a3 3 0 1 0 3-3m-8 11a3 3 0 1 0 2.6-1.5L10 12m7 3a3 3 0 1 0-2-5.5"/></svg>',mesh:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="6" cy="6" r="2"/><circle cx="18" cy="6" r="2"/><circle cx="6" cy="18" r="2"/><circle cx="18" cy="18" r="2"/><circle cx="12" cy="12" r="2"/><path d="M7.4 7.4l3.2 3.2M13.4 13.4l3.2 3.2M16.6 7.4l-3.2 3.2M10.6 13.4l-3.2 3.2"/></svg>',tokens:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M21 2l-2 2m-8 8a4 4 0 1 1-6 6m6-6l5-5 3 3-5 5m-3-3l3 3"/></svg>',advanced:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M8 4h8l4 4v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"/><path d="M9 13l2 2 4-4"/></svg>'};function at(t={}){let e=t.localToken?`<script>window.AX_LOCAL_TOKEN = ${JSON.stringify(t.localToken)};</script>`:"",a=ze({kicker:"Settings",title:"Your team's control room",lead:`Manage the agents, the places they answer from, and who's allowed to reach them. Everything here writes to <span class="mono muted">agentx.json</span> on your machine \u2014 nothing leaves.`})+qe([{kind:"off",num:"\u2014",label:"Agents online"},{kind:"off",num:"\u2014",label:"Channels connected"},{kind:"off",num:"0",label:"Needs attention"},{kind:"off",num:"\u2014",label:"Active tokens"}]).replace('<div class="ax-health-strip">','<div class="ax-health-strip" id="ax-health">');return E({title:"AgentX \xB7 Settings",activeTab:"admin",subtitle:"Settings",peers:t.peers,currentPeerId:t.currentPeerId,noMain:!0,body:a+zt+Ge,css:qt,scripts:`${e}<script>${Fe}
17
- ${Ue}
18
- ${jt}
19
- ${Gt}</script>`})}var jt=`
16
+ `}var q={agents:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="10" rx="2"/><circle cx="12" cy="5" r="2"/><path d="M12 7v4M8 16h.01M16 16h.01"/></svg>',channels:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z"/></svg>',schedules:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>',webhooks:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M10 12a3 3 0 1 0 3-3m-8 11a3 3 0 1 0 2.6-1.5L10 12m7 3a3 3 0 1 0-2-5.5"/></svg>',mesh:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="6" cy="6" r="2"/><circle cx="18" cy="6" r="2"/><circle cx="6" cy="18" r="2"/><circle cx="18" cy="18" r="2"/><circle cx="12" cy="12" r="2"/><path d="M7.4 7.4l3.2 3.2M13.4 13.4l3.2 3.2M16.6 7.4l-3.2 3.2M10.6 13.4l-3.2 3.2"/></svg>',tokens:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M21 2l-2 2m-8 8a4 4 0 1 1-6 6m6-6l5-5 3 3-5 5m-3-3l3 3"/></svg>',advanced:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M8 4h8l4 4v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"/><path d="M9 13l2 2 4-4"/></svg>'};function et(t={}){let e=t.localToken?`<script>window.AX_LOCAL_TOKEN = ${JSON.stringify(t.localToken)};</script>`:"",a=Be({kicker:"Settings",title:"Your team's control room",lead:`Manage the agents, the places they answer from, and who's allowed to reach them. Everything here writes to <span class="mono muted">agentx.json</span> on your machine \u2014 nothing leaves.`})+je([{kind:"off",num:"\u2014",label:"Agents online"},{kind:"off",num:"\u2014",label:"Channels connected"},{kind:"off",num:"0",label:"Needs attention"},{kind:"off",num:"\u2014",label:"Active tokens"}]).replace('<div class="ax-health-strip">','<div class="ax-health-strip" id="ax-health">');return E({title:"AgentX \xB7 Settings",activeTab:"admin",subtitle:"Settings",peers:t.peers,currentPeerId:t.currentPeerId,noMain:!0,body:a+Ot+ze,css:Rt,scripts:`${e}<script>${qe}
17
+ ${Ge}
18
+ ${Ht}
19
+ ${Nt}</script>`})}var Ht=`
20
20
  (function(){
21
21
  function fmt(n) { return n == null ? '\u2014' : String(n); }
22
22
  async function refresh() {
@@ -77,7 +77,7 @@ ${Gt}</script>`})}var jt=`
77
77
  refresh();
78
78
  // Refresh again after the main admin script has had a chance to mutate config.
79
79
  document.addEventListener('ax-config-saved', refresh);
80
- })();`,zt=`
80
+ })();`,Ot=`
81
81
  <div id="peer-banner" class="peer-banner">
82
82
  <span class="label">Managing</span>
83
83
  <span class="name" id="peer-banner-name">\u2014</span>
@@ -244,10 +244,10 @@ ${Gt}</script>`})}var jt=`
244
244
  ${N({icon:q.channels,title:"Where your agents show up",lead:"Connect a chat app, and your agents can answer from there. Set up once \u2014 they'll keep working in the background."})}
245
245
  ${R({persistKey:"channels",bodyHtml:`<b>How does this work?</b> We give each channel a small "bridge" that forwards messages to AgentX. For chat apps (Telegram, Slack, Discord) you'll paste a bot token \u2014 we keep the value in your <code>.env</code> file and never send it over the network. For webhook-style sources (GitHub, GitLab) we hand you a URL to paste into their dashboard.`})}
246
246
 
247
- <div id="ch-chatapps-label">${Y({label:"Chat apps"})}</div>
247
+ <div id="ch-chatapps-label">${V({label:"Chat apps"})}</div>
248
248
  <div class="ax-connectors" id="ch-chatapps"></div>
249
249
 
250
- <div id="ch-devtools-label">${Y({label:"Developer tools",rightHtml:'<span class="ax-pill">Send events from GitHub, GitLab, Sentry, etc.</span>'})}</div>
250
+ <div id="ch-devtools-label">${V({label:"Developer tools",rightHtml:'<span class="ax-pill">Send events from GitHub, GitLab, Sentry, etc.</span>'})}</div>
251
251
  <div class="ax-connectors" id="ch-devtools"></div>
252
252
 
253
253
  <!-- Active-channel configuration panes. One shows at a time; clicking
@@ -385,7 +385,7 @@ ${Gt}</script>`})}var jt=`
385
385
  ${N({icon:q.mesh,title:"Mesh",lead:"Link this AgentX to other machines so they share work. Good for teams running AgentX on multiple laptops or a mix of laptop + server."})}
386
386
  <div id="mesh-hero" class="ax-mesh-hero"></div>
387
387
  ${R({persistKey:"mesh",bodyHtml:"<b>Do I need mesh?</b> Only if you're running AgentX in more than one place. Solo users on one laptop can skip this entirely."})}
388
- ${Y({label:"Connected peers"})}
388
+ ${V({label:"Connected peers"})}
389
389
  <div id="mesh-peers" class="ax-stack"></div>
390
390
  <div class="add-form">
391
391
  <h3>Add a peer</h3>
@@ -447,7 +447,7 @@ ${Gt}</script>`})}var jt=`
447
447
  <div class="hint-block">The schema is documented at <code>docs/reference/config-schema.md</code>. Invalid JSON is refused; schema-level errors only surface after the daemon tries to use the new config.</div>
448
448
  </section>
449
449
  </main>
450
- `,qt=`
450
+ `,Rt=`
451
451
 
452
452
  /* --- Inner tabs (Agents / Channels / Schedules / \u2026) --- */
453
453
  nav.tabs{display:flex;gap:4px;padding:14px 24px 0;background:var(--ax-bg-elev);
@@ -655,7 +655,7 @@ textarea.raw{min-height:480px;font-family:var(--ax-mono);font-size:12px;line-hei
655
655
  .peer-banner button{background:transparent;border:1px solid currentColor;color:var(--ax-accent);
656
656
  padding:4px 10px;border-radius:4px;font:inherit;font-size:11px;cursor:pointer}
657
657
  .peer-banner button:hover{background:color-mix(in oklch,var(--ax-accent) 12%,transparent)}
658
- `,Gt=`
658
+ `,Nt=`
659
659
  const $ = (id) => document.getElementById(id);
660
660
  let state = null;
661
661
 
@@ -2519,11 +2519,11 @@ for (const btn of document.querySelectorAll('nav.tabs button')) {
2519
2519
  })();
2520
2520
 
2521
2521
  refresh();
2522
- `;function ot(t,e,a=[],n){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(at({peers:a,localToken:n}))}async function rt(t,e){let a=ye();e.writeHead(200,{"Content-Type":"application/json"}),e.end(JSON.stringify(a))}async function st(t,e,a){try{if(t.method==="GET"&&a==="/api/admin/channels/whatsapp/qr.svg"){await oa(e,"/whatsapp/qr.svg");return}let n=t.method==="GET"?void 0:await Ut(t),o={"GET /api/admin/state":()=>Wt(),"POST /api/admin/agents":()=>Qt(n),"PATCH /api/admin/agents":()=>Zt(n),"DELETE /api/admin/agents":()=>ea(n),"POST /api/admin/agents/access":()=>Kt(n),"POST /api/admin/channels/telegram":()=>ta(n),"DELETE /api/admin/channels/telegram":()=>Sa(n),"POST /api/admin/channels/telegram/toggle":()=>Ea(n),"POST /api/admin/crons":()=>_a(n),"DELETE /api/admin/crons":()=>Ta(n),"POST /api/admin/config/raw":()=>Ca(n),"GET /api/admin/tokens":()=>Jt(),"POST /api/admin/tokens":()=>Xt(n),"DELETE /api/admin/tokens":()=>Vt(n),"POST /api/admin/agents/test":()=>Yt(n),"PATCH /api/admin/channels/telegram":()=>aa(n),"POST /api/admin/channels/slack":()=>fa(n),"POST /api/admin/channels/slack/toggle":()=>va(n),"POST /api/admin/channels/discord":()=>ba(n),"POST /api/admin/channels/discord/toggle":()=>xa(n),"POST /api/admin/channels/gitlab":()=>ya(n),"POST /api/admin/channels/gitlab/toggle":()=>wa(n),"GET /api/admin/channels/whatsapp/state":()=>na("/whatsapp/state"),"POST /api/admin/crons/preview":()=>ka(n),"POST /api/admin/webhooks":()=>ca(n),"PATCH /api/admin/webhooks":()=>pa(n),"DELETE /api/admin/webhooks":()=>ga(n),"POST /api/admin/mesh/peers":()=>ua(n),"DELETE /api/admin/mesh/peers":()=>ma(n),"POST /api/admin/mesh/toggle":()=>ha(n),"GET /api/admin/files":()=>ra(t),"GET /api/admin/files/read":()=>sa(t),"PUT /api/admin/files":()=>ia(n),"POST /api/admin/files/skill":()=>la(n),"DELETE /api/admin/files/skill":()=>da(n)},r=`${t.method} ${a}`,s=o[r];if(!s){ve(e,404,{error:`unknown admin endpoint: ${r}`});return}let i=await s();ve(e,200,i)}catch(n){ve(e,400,{error:n.message||"admin op failed"})}}function ve(t,e,a){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(a))}function Ut(t){return new Promise((e,a)=>{let n="";t.on("data",o=>{n+=o}),t.on("end",()=>{try{e(n?JSON.parse(n):{})}catch(o){a(o)}}),t.on("error",a)})}function ye(){let t=oe(process.cwd(),"agentx.json");return xe(t)?JSON.parse(Ft(t,"utf-8")):null}function Wt(){let t=ye();if(!t)return{exists:!1};let e=Object.entries(t.agents||{}).map(([f,b])=>({id:f,name:b.name,tier:b.tier,model:b.model,mentions:b.mentions||[],workspace:b.workspace,access:b.access||"private",systemPrompt:b.systemPrompt||"",maxConcurrent:b.maxConcurrent??1,maxExecutionMinutes:b.maxExecutionMinutes??20,permissionMode:b.permissionMode||"default"})),a=t.channels?.telegram?.accounts||{},n={enabled:!!t.channels?.telegram?.enabled,accounts:Object.entries(a).map(([f,b])=>({id:f,botUsername:b.botUsername||"",agentBinding:b.agentBinding||"",botTokenRef:b.botToken||""}))},o={enabled:!!t.channels?.slack?.enabled,botTokenRef:t.channels?.slack?.botToken||"",appTokenRef:t.channels?.slack?.appToken||"",agentBinding:t.channels?.slack?.agentBinding||""},r={enabled:!!t.channels?.discord?.enabled,tokenRef:t.channels?.discord?.token||"",agentBinding:t.channels?.discord?.agentBinding||""},s={enabled:!!t.channels?.gitlab?.enabled,host:t.channels?.gitlab?.host||"",webhookPort:t.channels?.gitlab?.webhookPort||18810,tokenRef:t.channels?.gitlab?.token||"",routeCount:Array.isArray(t.channels?.gitlab?.routes)?t.channels.gitlab.routes.length:0,agentMappingCount:Array.isArray(t.channels?.gitlab?.agentMappings)?t.channels.gitlab.agentMappings.length:0},i={enabled:!!t.channels?.whatsapp?.enabled,sessionDir:t.channels?.whatsapp?.sessionDir||".agentx/whatsapp-sessions",routeCount:Array.isArray(t.channels?.whatsapp?.routes)?t.channels.whatsapp.routes.length:0},l=Object.entries(t.crons||{}).map(([f,b])=>({id:f,schedule:b.schedule,agent:b.agent,prompt:(b.prompt||"").slice(0,200),enabled:b.enabled!==!1})),d=Array.isArray(t.webhooks)?t.webhooks.map(f=>({id:f.id,source:f.source,agentId:f.agentId,secretEnv:f.secretEnv||"",description:f.description||"",enabled:f.enabled!==!1})):[],u={enabled:!!t.mesh?.enabled,discovery:t.mesh?.discovery||"static",peers:(t.mesh?.peers||[]).map(f=>({url:f.url,name:f.name,hasToken:!!f.token}))},p=t.dashboard?.daemonUrl||"http://localhost:18800";return{exists:!0,agents:e,telegram:n,slack:o,discord:r,gitlab:s,whatsapp:i,crons:l,webhooks:d,mesh:u,daemonUrl:p,nodeName:t.node?.name}}function Kt(t){let e=String(t?.id||"").trim(),a=t?.access==="public"?"public":"private";if(!e)throw new Error("Agent id is required.");let{summary:n}=S(o=>{if(!o.agents?.[e])throw new Error(`Agent "${e}" not found.`);return o.agents[e].access=a,`agent "${e}" is now ${a}`});return{summary:n}}function Jt(){return new D().list().map(t=>({id:t.id,name:t.name,prefix:t.prefix,scopes:t.scopes,createdAt:t.createdAt,expiresAt:t.expiresAt,revokedAt:t.revokedAt,lastUsedAt:t.lastUsedAt}))}function Xt(t){let e=String(t?.name||"").trim(),a=Array.isArray(t?.scopes)?t.scopes.map(String):[],n=t?.expiresInDays?Number(t.expiresInDays):void 0,{token:o,record:r}=new D().create({name:e,scopes:a,expiresInDays:n});return{summary:`created token "${e}"`,token:o,record:r}}function Vt(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Token id is required.");let a=new D().revoke(e);if(!a)throw new Error(`Token "${e}" not found.`);return{summary:`revoked token ${e} (${a.name})`}}async function Yt(t){let e=String(t?.agent||t?.id||"").trim(),a=String(t?.message||"").trim(),n=String(t?.chatId||"").trim()||`admin-${Date.now()}`;if(!e)throw new Error("Agent id is required.");if(!a)throw new Error("Message is required.");let o="http://127.0.0.1:18800",r;try{let u=M();o=u.dashboard.daemonUrl.replace(/\/+$/,"")||o,r=u.dashboard.token}catch{}let s={"Content-Type":"application/json"};r&&(s.Authorization=`Bearer ${r}`);let i=await fetch(`${o}/task`,{method:"POST",headers:s,body:JSON.stringify({agent:e,message:a,context:{channel:"test-drive",sender:"admin",chatId:n}})}),l=await i.text(),d;try{d=JSON.parse(l)}catch{d={content:l}}if(!i.ok)throw new Error(d?.error||`daemon HTTP ${i.status}`);return{chatId:n,response:d}}function Qt(t){let e=String(t?.id||"").trim(),a=String(t?.name||"").trim(),n=t?.tier==="sdk"?"sdk":"claude-code",o=dt(t?.triggerWords),r=t?.model?String(t.model).trim():void 0,s=t?.personality?String(t.personality).trim():void 0;if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error("Agent id must be lowercase (letters, digits, -, _).");if(!a)throw new Error("Agent name is required.");if(o.length===0)throw new Error("At least one trigger word is required.");let i=oe(process.cwd(),"agents",e),{summary:l}=S(u=>{if(u.agents=u.agents||{},u.agents[e])throw new Error(`Agent "${e}" already exists.`);let p={name:a,workspace:i,tier:n,mentions:o,maxConcurrent:2,permissionMode:"default"};return r&&(p.model=r),s&&(p.systemPrompt=s.slice(0,400)),u.agents[e]=p,`added agent "${e}"`}),d=oe(i,"CLAUDE.md");if(!xe(d))try{Ie("fs").mkdirSync(i,{recursive:!0}),nt(d,`# ${a}
2522
+ `;function at(t,e,a=[],n){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(et({peers:a,localToken:n}))}async function nt(t,e){let a=xe();e.writeHead(200,{"Content-Type":"application/json"}),e.end(JSON.stringify(a))}async function ot(t,e,a){try{if(t.method==="GET"&&a==="/api/admin/channels/whatsapp/qr.svg"){await ta(e,"/whatsapp/qr.svg");return}let n=t.method==="GET"?void 0:await qt(t),o={"GET /api/admin/state":()=>Gt(),"POST /api/admin/agents":()=>Xt(n),"PATCH /api/admin/agents":()=>Vt(n),"DELETE /api/admin/agents":()=>Yt(n),"POST /api/admin/agents/access":()=>Ft(n),"POST /api/admin/channels/telegram":()=>Qt(n),"DELETE /api/admin/channels/telegram":()=>ya(n),"POST /api/admin/channels/telegram/toggle":()=>wa(n),"POST /api/admin/crons":()=>ka(n),"DELETE /api/admin/crons":()=>Sa(n),"POST /api/admin/config/raw":()=>Ea(n),"GET /api/admin/tokens":()=>Ut(),"POST /api/admin/tokens":()=>Wt(n),"DELETE /api/admin/tokens":()=>Kt(n),"POST /api/admin/agents/test":()=>Jt(n),"PATCH /api/admin/channels/telegram":()=>Zt(n),"POST /api/admin/channels/slack":()=>ma(n),"POST /api/admin/channels/slack/toggle":()=>ha(n),"POST /api/admin/channels/discord":()=>ga(n),"POST /api/admin/channels/discord/toggle":()=>fa(n),"POST /api/admin/channels/gitlab":()=>va(n),"POST /api/admin/channels/gitlab/toggle":()=>ba(n),"GET /api/admin/channels/whatsapp/state":()=>ea("/whatsapp/state"),"POST /api/admin/crons/preview":()=>xa(n),"POST /api/admin/webhooks":()=>ia(n),"PATCH /api/admin/webhooks":()=>la(n),"DELETE /api/admin/webhooks":()=>ua(n),"POST /api/admin/mesh/peers":()=>da(n),"DELETE /api/admin/mesh/peers":()=>ca(n),"POST /api/admin/mesh/toggle":()=>pa(n),"GET /api/admin/files":()=>aa(t),"GET /api/admin/files/read":()=>na(t),"PUT /api/admin/files":()=>oa(n),"POST /api/admin/files/skill":()=>ra(n),"DELETE /api/admin/files/skill":()=>sa(n)},r=`${t.method} ${a}`,s=o[r];if(!s){fe(e,404,{error:`unknown admin endpoint: ${r}`});return}let i=await s();fe(e,200,i)}catch(n){fe(e,400,{error:n.message||"admin op failed"})}}function fe(t,e,a){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(a))}function qt(t){return new Promise((e,a)=>{let n="";t.on("data",o=>{n+=o}),t.on("end",()=>{try{e(n?JSON.parse(n):{})}catch(o){a(o)}}),t.on("error",a)})}function xe(){let t=ne(process.cwd(),"agentx.json");return be(t)?JSON.parse(Bt(t,"utf-8")):null}function Gt(){let t=xe();if(!t)return{exists:!1};let e=Object.entries(t.agents||{}).map(([f,b])=>({id:f,name:b.name,tier:b.tier,model:b.model,mentions:b.mentions||[],workspace:b.workspace,access:b.access||"private",systemPrompt:b.systemPrompt||"",maxConcurrent:b.maxConcurrent??1,maxExecutionMinutes:b.maxExecutionMinutes??20,permissionMode:b.permissionMode||"default"})),a=t.channels?.telegram?.accounts||{},n={enabled:!!t.channels?.telegram?.enabled,accounts:Object.entries(a).map(([f,b])=>({id:f,botUsername:b.botUsername||"",agentBinding:b.agentBinding||"",botTokenRef:b.botToken||""}))},o={enabled:!!t.channels?.slack?.enabled,botTokenRef:t.channels?.slack?.botToken||"",appTokenRef:t.channels?.slack?.appToken||"",agentBinding:t.channels?.slack?.agentBinding||""},r={enabled:!!t.channels?.discord?.enabled,tokenRef:t.channels?.discord?.token||"",agentBinding:t.channels?.discord?.agentBinding||""},s={enabled:!!t.channels?.gitlab?.enabled,host:t.channels?.gitlab?.host||"",webhookPort:t.channels?.gitlab?.webhookPort||18810,tokenRef:t.channels?.gitlab?.token||"",routeCount:Array.isArray(t.channels?.gitlab?.routes)?t.channels.gitlab.routes.length:0,agentMappingCount:Array.isArray(t.channels?.gitlab?.agentMappings)?t.channels.gitlab.agentMappings.length:0},i={enabled:!!t.channels?.whatsapp?.enabled,sessionDir:t.channels?.whatsapp?.sessionDir||".agentx/whatsapp-sessions",routeCount:Array.isArray(t.channels?.whatsapp?.routes)?t.channels.whatsapp.routes.length:0},l=Object.entries(t.crons||{}).map(([f,b])=>({id:f,schedule:b.schedule,agent:b.agent,prompt:(b.prompt||"").slice(0,200),enabled:b.enabled!==!1})),d=Array.isArray(t.webhooks)?t.webhooks.map(f=>({id:f.id,source:f.source,agentId:f.agentId,secretEnv:f.secretEnv||"",description:f.description||"",enabled:f.enabled!==!1})):[],u={enabled:!!t.mesh?.enabled,discovery:t.mesh?.discovery||"static",peers:(t.mesh?.peers||[]).map(f=>({url:f.url,name:f.name,hasToken:!!f.token}))},p=t.dashboard?.daemonUrl||"http://localhost:18800";return{exists:!0,agents:e,telegram:n,slack:o,discord:r,gitlab:s,whatsapp:i,crons:l,webhooks:d,mesh:u,daemonUrl:p,nodeName:t.node?.name}}function Ft(t){let e=String(t?.id||"").trim(),a=t?.access==="public"?"public":"private";if(!e)throw new Error("Agent id is required.");let{summary:n}=S(o=>{if(!o.agents?.[e])throw new Error(`Agent "${e}" not found.`);return o.agents[e].access=a,`agent "${e}" is now ${a}`});return{summary:n}}function Ut(){return new D().list().map(t=>({id:t.id,name:t.name,prefix:t.prefix,scopes:t.scopes,createdAt:t.createdAt,expiresAt:t.expiresAt,revokedAt:t.revokedAt,lastUsedAt:t.lastUsedAt}))}function Wt(t){let e=String(t?.name||"").trim(),a=Array.isArray(t?.scopes)?t.scopes.map(String):[],n=t?.expiresInDays?Number(t.expiresInDays):void 0,{token:o,record:r}=new D().create({name:e,scopes:a,expiresInDays:n});return{summary:`created token "${e}"`,token:o,record:r}}function Kt(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Token id is required.");let a=new D().revoke(e);if(!a)throw new Error(`Token "${e}" not found.`);return{summary:`revoked token ${e} (${a.name})`}}async function Jt(t){let e=String(t?.agent||t?.id||"").trim(),a=String(t?.message||"").trim(),n=String(t?.chatId||"").trim()||`admin-${Date.now()}`;if(!e)throw new Error("Agent id is required.");if(!a)throw new Error("Message is required.");let o="http://127.0.0.1:18800",r;try{let u=$();o=u.dashboard.daemonUrl.replace(/\/+$/,"")||o,r=u.dashboard.token}catch{}let s={"Content-Type":"application/json"};r&&(s.Authorization=`Bearer ${r}`);let i=await fetch(`${o}/task`,{method:"POST",headers:s,body:JSON.stringify({agent:e,message:a,context:{channel:"test-drive",sender:"admin",chatId:n}})}),l=await i.text(),d;try{d=JSON.parse(l)}catch{d={content:l}}if(!i.ok)throw new Error(d?.error||`daemon HTTP ${i.status}`);return{chatId:n,response:d}}function Xt(t){let e=String(t?.id||"").trim(),a=String(t?.name||"").trim(),n=t?.tier==="sdk"?"sdk":"claude-code",o=it(t?.triggerWords),r=t?.model?String(t.model).trim():void 0,s=t?.personality?String(t.personality).trim():void 0;if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error("Agent id must be lowercase (letters, digits, -, _).");if(!a)throw new Error("Agent name is required.");if(o.length===0)throw new Error("At least one trigger word is required.");let i=ne(process.cwd(),"agents",e),{summary:l}=S(u=>{if(u.agents=u.agents||{},u.agents[e])throw new Error(`Agent "${e}" already exists.`);let p={name:a,workspace:i,tier:n,mentions:o,maxConcurrent:2,permissionMode:"default"};return r&&(p.model=r),s&&(p.systemPrompt=s.slice(0,400)),u.agents[e]=p,`added agent "${e}"`}),d=ne(i,"CLAUDE.md");if(!be(d))try{jt(i,{recursive:!0}),tt(d,`# ${a}
2523
2523
 
2524
2524
  ${s||"You are "+a+"."}
2525
- `)}catch{}return{summary:l}}function Zt(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Agent id is required.");let a=t?.patch||{},{summary:n}=S(o=>{if(!o.agents?.[e])throw new Error(`Agent "${e}" not found.`);let r=o.agents[e];return typeof a.name=="string"&&a.name.trim()&&(r.name=a.name.trim()),typeof a.model=="string"&&(r.model=a.model.trim()||void 0),typeof a.tier=="string"&&["claude-code","sdk","orchestrator"].includes(a.tier)&&(r.tier=a.tier),typeof a.systemPrompt=="string"&&(r.systemPrompt=a.systemPrompt.trim()||void 0),Array.isArray(a.mentions)?r.mentions=a.mentions.map(s=>String(s).trim()).filter(Boolean):typeof a.triggerWords=="string"&&(r.mentions=dt(a.triggerWords)),typeof a.maxConcurrent=="number"&&a.maxConcurrent>=1&&(r.maxConcurrent=a.maxConcurrent),typeof a.maxExecutionMinutes=="number"&&a.maxExecutionMinutes>=1&&a.maxExecutionMinutes<=240&&(r.maxExecutionMinutes=a.maxExecutionMinutes),typeof a.permissionMode=="string"&&(r.permissionMode=a.permissionMode),(a.access==="public"||a.access==="private")&&(r.access=a.access),`updated agent "${e}"`});return{summary:n}}function ea(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Agent id is required.");let{summary:a}=S(n=>{if(!n.agents||!n.agents[e])throw new Error(`Agent "${e}" not found.`);if(delete n.agents[e],n.channels?.telegram?.accounts)for(let o of Object.keys(n.channels.telegram.accounts))n.channels.telegram.accounts[o]?.agentBinding===e&&(n.channels.telegram.accounts[o].agentBinding="");return`removed agent "${e}"`});return{summary:a}}function ta(t){let e=String(t?.id||"").trim(),a=String(t?.agentBinding||"").trim(),n=String(t?.botUsername||"").trim(),o=String(t?.botTokenEnv||"").trim();if(!e)throw new Error("Account id is required.");if(!a)throw new Error("Choose an agent to bind this account to.");if(!o)throw new Error("Bot token env-var name is required (e.g. TG_SUPPORT_BOT_TOKEN).");let{summary:r}=S(s=>{if(s.channels=s.channels||{},s.channels.telegram=s.channels.telegram||{enabled:!0,accounts:{},policy:{dm:"pair",group:"mention-required"}},s.channels.telegram.enabled=!0,s.channels.telegram.accounts=s.channels.telegram.accounts||{},s.channels.telegram.accounts[e])throw new Error(`Telegram account "${e}" already exists.`);if(!s.agents?.[a])throw new Error(`Unknown agent "${a}".`);return s.channels.telegram.accounts[e]={botToken:"${"+o+"}",botUsername:n,agentBinding:a},`added telegram account "${e}"`});return{summary:r,hint:`Add ${o}=<bot-token> to your .env file.`}}function aa(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Account id is required.");let a=t?.patch||{},{summary:n}=S(o=>{let r=o.channels?.telegram?.accounts?.[e];if(!r)throw new Error(`Account "${e}" not found.`);if(typeof a.agentBinding=="string"&&a.agentBinding.trim()){if(!o.agents?.[a.agentBinding])throw new Error(`Unknown agent "${a.agentBinding}".`);r.agentBinding=a.agentBinding.trim()}return typeof a.botUsername=="string"&&(r.botUsername=a.botUsername.trim()),typeof a.botTokenEnv=="string"&&a.botTokenEnv.trim()&&(r.botToken="${"+a.botTokenEnv.trim()+"}"),`updated telegram account "${e}"`});return{summary:n}}async function na(t){let{url:e,headers:a}=it(),n=await fetch(e+t,{headers:a}),o=await n.text();if(!n.ok)throw new Error(`daemon ${n.status}: ${o.slice(0,200)}`);try{return JSON.parse(o)}catch{return{raw:o}}}async function oa(t,e){try{let{url:a,headers:n}=it(),o=await fetch(a+e,{headers:n}),r=await o.text();t.writeHead(o.status,{"Content-Type":o.headers.get("content-type")||"image/svg+xml","Cache-Control":"no-store"}),t.end(r)}catch(a){t.writeHead(502,{"Content-Type":"text/plain; charset=utf-8"}),t.end("daemon unreachable: "+(a?.message||"unknown"))}}function it(){let t="http://127.0.0.1:18800",e={};try{let a=M();t=a.dashboard.daemonUrl?.replace(/\/+$/,"")||t,a.dashboard.token&&(e.Authorization=`Bearer ${a.dashboard.token}`)}catch{}return{url:t,headers:e}}function X(t){let a=ye()?.agents?.[t];if(!a)throw new Error(`Unknown agent "${t}".`);if(!a.workspace)throw new Error(`Agent "${t}" has no workspace configured.`);return a.workspace}function be(t,e){try{return new URL(t.url||"/","http://localhost").searchParams.get(e)||""}catch{return""}}function ra(t){let e=be(t,"agent").trim();if(!e)throw new Error("agent= query param is required.");let a=F(X(e));return{agentId:e,...a}}function sa(t){let e=be(t,"agent").trim(),a=be(t,"path").trim();if(!e||!a)throw new Error("agent= and path= query params are required.");return Z(X(e),a)}function ia(t){let e=String(t?.agent||"").trim(),a=String(t?.path||"").trim(),n=typeof t?.content=="string"?t.content:"";if(!e||!a)throw new Error("agent and path are required.");let o=ee(X(e),a,n);return{summary:`saved ${a} (${o.bytes} bytes)`,...o}}function la(t){let e=String(t?.agent||"").trim(),a=String(t?.slug||"").trim(),n=t?.title?String(t.title):void 0,o=t?.content?String(t.content):void 0;if(!e)throw new Error("agent is required.");let r=te(X(e),a,{title:n,content:o});return{summary:`added skill "${a}"`,...r}}function da(t){let e=String(t?.agent||"").trim(),a=String(t?.slug||"").trim();if(!e||!a)throw new Error("agent and slug are required.");let n=ae(X(e),a);return{summary:`removed skill "${a}"`,...n}}var lt=["gitlab","github","sentry","stripe","discord","slack","custom"];function ca(t){let e=String(t?.id||"").trim(),a=String(t?.source||"").trim(),n=String(t?.agentId||"").trim(),o=String(t?.secretEnv||"").trim(),r=String(t?.description||"").trim();if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error("Webhook id must be lowercase (letters, digits, -, _).");if(!lt.includes(a))throw new Error(`Unknown source: ${a}`);if(!n)throw new Error("Pick an agent to bind the webhook to.");let{summary:s}=S(i=>{if(!i.agents?.[n])throw new Error(`Unknown agent "${n}".`);if(i.webhooks=Array.isArray(i.webhooks)?i.webhooks:[],i.webhooks.find(d=>d.id===e))throw new Error(`Webhook "${e}" already exists.`);let l={id:e,source:a,agentId:n,enabled:!0};return o&&(l.secretEnv=o),r&&(l.description=r),i.webhooks.push(l),`added webhook "${e}" (${a} \u2192 ${n})`});return{summary:s}}function pa(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Webhook id is required.");let a=t?.patch||{},{summary:n}=S(o=>{let r=(o.webhooks||[]).find(s=>s.id===e);if(!r)throw new Error(`Webhook "${e}" not found.`);if(typeof a.source=="string"&&lt.includes(a.source)&&(r.source=a.source),typeof a.agentId=="string"&&a.agentId.trim()){if(!o.agents?.[a.agentId])throw new Error(`Unknown agent "${a.agentId}".`);r.agentId=a.agentId.trim()}return typeof a.secretEnv=="string"&&(r.secretEnv=a.secretEnv.trim()||void 0),typeof a.description=="string"&&(r.description=a.description.trim()||void 0),typeof a.enabled=="boolean"&&(r.enabled=a.enabled),`updated webhook "${e}"`});return{summary:n}}function ua(t){let e=String(t?.url||"").trim().replace(/\/+$/,""),a=String(t?.name||"").trim(),n=String(t?.token||"").trim()||void 0;if(!e||!/^https?:\/\//.test(e))throw new Error("Peer URL must start with http:// or https://");if(!a)throw new Error("Peer name is required.");let{summary:o}=S(r=>{if(r.mesh=r.mesh||{enabled:!0,peers:[],discovery:"static",healthCheck:{interval:60,timeout:10}},r.mesh.enabled=!0,r.mesh.peers=Array.isArray(r.mesh.peers)?r.mesh.peers:[],r.mesh.peers.find(i=>i.url===e))throw new Error(`Peer at ${e} already registered.`);let s={url:e,name:a};return n&&(s.token=n),r.mesh.peers.push(s),`added mesh peer "${a}"`});return{summary:o}}function ma(t){let e=String(t?.url||"").trim().replace(/\/+$/,"");if(!e)throw new Error("Peer URL is required.");let{summary:a}=S(n=>{let o=(n.mesh?.peers||[]).length;if(n.mesh=n.mesh||{enabled:!1,peers:[],discovery:"static",healthCheck:{interval:60,timeout:10}},n.mesh.peers=(n.mesh.peers||[]).filter(r=>r.url.replace(/\/+$/,"")!==e),n.mesh.peers.length===o)throw new Error(`Peer at ${e} not found.`);return`removed mesh peer ${e}`});return{summary:a}}function ha(t){let e=!!t?.enabled,{summary:a}=S(n=>(n.mesh=n.mesh||{enabled:e,peers:[],discovery:"static",healthCheck:{interval:60,timeout:10}},n.mesh.enabled=e,`mesh ${e?"enabled":"disabled"}`));return{summary:a}}function ga(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Webhook id is required.");let{summary:a}=S(n=>{let o=(n.webhooks||[]).length;if(n.webhooks=(n.webhooks||[]).filter(r=>r.id!==e),n.webhooks.length===o)throw new Error(`Webhook "${e}" not found.`);return`removed webhook "${e}"`});return{summary:a}}function fa(t){let e=String(t?.botTokenEnv||"").trim(),a=String(t?.appTokenEnv||"").trim(),n=String(t?.agentBinding||"").trim();if(!e)throw new Error("Bot token env-var name is required (e.g. SLACK_BOT_TOKEN).");if(!a)throw new Error("App-level token env-var name is required (e.g. SLACK_APP_TOKEN).");let{summary:o}=S(r=>{if(r.channels=r.channels||{},r.channels.slack=r.channels.slack||{enabled:!1},r.channels.slack.enabled=!0,r.channels.slack.botToken="${"+e+"}",r.channels.slack.appToken="${"+a+"}",n){if(!r.agents?.[n])throw new Error(`Unknown agent "${n}".`);r.channels.slack.agentBinding=n}return"configured slack connector"});return{summary:o,hint:`Add ${e}=xoxb-\u2026 and ${a}=xapp-\u2026 to your .env.`}}function va(t){let e=!!t?.enabled,{summary:a}=S(n=>(n.channels=n.channels||{},n.channels.slack=n.channels.slack||{enabled:!1},n.channels.slack.enabled=e,`slack ${e?"enabled":"disabled"}`));return{summary:a}}function ba(t){let e=String(t?.tokenEnv||"").trim(),a=String(t?.agentBinding||"").trim();if(!e)throw new Error("Bot token env-var name is required (e.g. DISCORD_BOT_TOKEN).");let{summary:n}=S(o=>{if(o.channels=o.channels||{},o.channels.discord=o.channels.discord||{enabled:!1},o.channels.discord.enabled=!0,o.channels.discord.token="${"+e+"}",a){if(!o.agents?.[a])throw new Error(`Unknown agent "${a}".`);o.channels.discord.agentBinding=a}return"configured discord connector"});return{summary:n,hint:`Add ${e}=<bot-token> to your .env.`}}function xa(t){let e=!!t?.enabled,{summary:a}=S(n=>(n.channels=n.channels||{},n.channels.discord=n.channels.discord||{enabled:!1},n.channels.discord.enabled=e,`discord ${e?"enabled":"disabled"}`));return{summary:a}}function ya(t){let e=String(t?.host||"").trim().replace(/\/+$/,""),a=String(t?.tokenEnv||"").trim(),n=parseInt(String(t?.webhookPort||"18810"),10);if(!e||!/^https?:\/\//.test(e))throw new Error("Host must start with http:// or https://");if(!a)throw new Error("Admin token env-var name is required (e.g. GITLAB_TOKEN).");if(!Number.isFinite(n)||n<1||n>65535)throw new Error("Webhook port must be between 1 and 65535.");let{summary:o}=S(r=>(r.channels=r.channels||{},r.channels.gitlab=r.channels.gitlab||{enabled:!1,routes:[],agentMappings:[]},r.channels.gitlab.enabled=!0,r.channels.gitlab.host=e,r.channels.gitlab.token="${"+a+"}",r.channels.gitlab.webhookPort=n,"configured gitlab connector"));return{summary:o,hint:`Add ${a}=<personal-access-token> to your .env. Per-project routes + per-agent tokens stay in the Advanced JSON editor.`}}function wa(t){let e=!!t?.enabled,{summary:a}=S(n=>(n.channels=n.channels||{},n.channels.gitlab=n.channels.gitlab||{enabled:!1,routes:[],agentMappings:[]},n.channels.gitlab.enabled=e,`gitlab ${e?"enabled":"disabled"}`));return{summary:a}}async function ka(t){let e=String(t?.schedule||"").trim();if(!e)throw new Error("schedule is required");let{getNextCronDate:a}=await import("./scheduler-63D5KFO7.js"),n;try{n=(await import("cronstrue")).default.toString(e,{use24HourTimeFormat:!1})}catch(i){throw new Error(`Invalid cron: ${i.message||"unknown"}`)}let o=Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC",r=[],s=new Date;try{for(let i=0;i<3;i++)s=a(e,s,o),r.push(s.toISOString())}catch(i){throw new Error(`Cron preview failed: ${i.message}`)}return{human:n,next:r,timezone:o}}function Sa(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Account id is required.");let{summary:a}=S(n=>{if(!n.channels?.telegram?.accounts?.[e])throw new Error(`Account "${e}" not found.`);return delete n.channels.telegram.accounts[e],`removed telegram account "${e}"`});return{summary:a}}function Ea(t){let e=!!t?.enabled,{summary:a}=S(n=>(n.channels=n.channels||{},n.channels.telegram=n.channels.telegram||{enabled:!1,accounts:{},policy:{dm:"pair",group:"mention-required"}},n.channels.telegram.enabled=e,`telegram ${e?"enabled":"disabled"}`));return{summary:a}}function _a(t){let e=String(t?.id||"").trim(),a=String(t?.schedule||"").trim(),n=String(t?.agent||"").trim(),o=String(t?.prompt||"").trim();if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error("Cron id must be lowercase (letters, digits, -, _).");if(!a)throw new Error("Cron expression is required (e.g. '0 9 * * 1' for Mondays at 9am).");if(!n)throw new Error("Pick an agent to run this schedule.");if(!o)throw new Error("A prompt is required (what should the agent do?).");let{summary:r}=S(s=>{if(s.crons=s.crons||{},s.crons[e])throw new Error(`Cron "${e}" already exists.`);if(!s.agents?.[n])throw new Error(`Unknown agent "${n}".`);return s.crons[e]={schedule:a,agent:n,prompt:o,enabled:!0},`added cron "${e}"`});return{summary:r}}function Ta(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Cron id is required.");let{summary:a}=S(n=>{if(!n.crons?.[e])throw new Error(`Cron "${e}" not found.`);return delete n.crons[e],`removed cron "${e}"`});return{summary:a}}function Ca(t){let e=String(t?.raw||"");if(!e.trim())throw new Error("Config body is empty.");let a;try{a=JSON.parse(e)}catch(r){throw new Error(`Invalid JSON: ${r.message}`)}let n=oe(process.cwd(),"agentx.json"),o=`${n}.bak.${Date.now()}`;if(xe(n))try{Ie("fs").copyFileSync(n,o)}catch{}nt(n,JSON.stringify(a,null,2)+`
2526
- `,"utf-8");try{let{loadDaemonConfig:r}=(V(),Lt(Dt)),i=r().dashboard.daemonUrl?.replace(/\/+$/,"")||"http://127.0.0.1:18800";fetch(`${i}/reload`,{method:"POST"}).catch(()=>null)}catch{}return{summary:"agentx.json replaced",backupPath:o}}function dt(t){return String(t||"").split(/[,\s]+/).map(e=>e.trim()).filter(Boolean).filter((e,a,n)=>n.indexOf(e)===a)}V();import{resolve as Ma}from"path";function ct(t={}){let e=t.localToken?`<script>window.AX_LOCAL_TOKEN = ${JSON.stringify(t.localToken)};</script>`:"",a=`<div id="msg" class="msg"></div>
2525
+ `)}catch{}return{summary:l}}function Vt(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Agent id is required.");let a=t?.patch||{},{summary:n}=S(o=>{if(!o.agents?.[e])throw new Error(`Agent "${e}" not found.`);let r=o.agents[e];return typeof a.name=="string"&&a.name.trim()&&(r.name=a.name.trim()),typeof a.model=="string"&&(r.model=a.model.trim()||void 0),typeof a.tier=="string"&&["claude-code","sdk","orchestrator"].includes(a.tier)&&(r.tier=a.tier),typeof a.systemPrompt=="string"&&(r.systemPrompt=a.systemPrompt.trim()||void 0),Array.isArray(a.mentions)?r.mentions=a.mentions.map(s=>String(s).trim()).filter(Boolean):typeof a.triggerWords=="string"&&(r.mentions=it(a.triggerWords)),typeof a.maxConcurrent=="number"&&a.maxConcurrent>=1&&(r.maxConcurrent=a.maxConcurrent),typeof a.maxExecutionMinutes=="number"&&a.maxExecutionMinutes>=1&&a.maxExecutionMinutes<=240&&(r.maxExecutionMinutes=a.maxExecutionMinutes),typeof a.permissionMode=="string"&&(r.permissionMode=a.permissionMode),(a.access==="public"||a.access==="private")&&(r.access=a.access),`updated agent "${e}"`});return{summary:n}}function Yt(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Agent id is required.");let{summary:a}=S(n=>{if(!n.agents||!n.agents[e])throw new Error(`Agent "${e}" not found.`);if(delete n.agents[e],n.channels?.telegram?.accounts)for(let o of Object.keys(n.channels.telegram.accounts))n.channels.telegram.accounts[o]?.agentBinding===e&&(n.channels.telegram.accounts[o].agentBinding="");return`removed agent "${e}"`});return{summary:a}}function Qt(t){let e=String(t?.id||"").trim(),a=String(t?.agentBinding||"").trim(),n=String(t?.botUsername||"").trim(),o=String(t?.botTokenEnv||"").trim();if(!e)throw new Error("Account id is required.");if(!a)throw new Error("Choose an agent to bind this account to.");if(!o)throw new Error("Bot token env-var name is required (e.g. TG_SUPPORT_BOT_TOKEN).");let{summary:r}=S(s=>{if(s.channels=s.channels||{},s.channels.telegram=s.channels.telegram||{enabled:!0,accounts:{},policy:{dm:"pair",group:"mention-required"}},s.channels.telegram.enabled=!0,s.channels.telegram.accounts=s.channels.telegram.accounts||{},s.channels.telegram.accounts[e])throw new Error(`Telegram account "${e}" already exists.`);if(!s.agents?.[a])throw new Error(`Unknown agent "${a}".`);return s.channels.telegram.accounts[e]={botToken:"${"+o+"}",botUsername:n,agentBinding:a},`added telegram account "${e}"`});return{summary:r,hint:`Add ${o}=<bot-token> to your .env file.`}}function Zt(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Account id is required.");let a=t?.patch||{},{summary:n}=S(o=>{let r=o.channels?.telegram?.accounts?.[e];if(!r)throw new Error(`Account "${e}" not found.`);if(typeof a.agentBinding=="string"&&a.agentBinding.trim()){if(!o.agents?.[a.agentBinding])throw new Error(`Unknown agent "${a.agentBinding}".`);r.agentBinding=a.agentBinding.trim()}return typeof a.botUsername=="string"&&(r.botUsername=a.botUsername.trim()),typeof a.botTokenEnv=="string"&&a.botTokenEnv.trim()&&(r.botToken="${"+a.botTokenEnv.trim()+"}"),`updated telegram account "${e}"`});return{summary:n}}async function ea(t){let{url:e,headers:a}=rt(),n=await fetch(e+t,{headers:a}),o=await n.text();if(!n.ok)throw new Error(`daemon ${n.status}: ${o.slice(0,200)}`);try{return JSON.parse(o)}catch{return{raw:o}}}async function ta(t,e){try{let{url:a,headers:n}=rt(),o=await fetch(a+e,{headers:n}),r=await o.text();t.writeHead(o.status,{"Content-Type":o.headers.get("content-type")||"image/svg+xml","Cache-Control":"no-store"}),t.end(r)}catch(a){t.writeHead(502,{"Content-Type":"text/plain; charset=utf-8"}),t.end("daemon unreachable: "+(a?.message||"unknown"))}}function rt(){let t="http://127.0.0.1:18800",e={};try{let a=$();t=a.dashboard.daemonUrl?.replace(/\/+$/,"")||t,a.dashboard.token&&(e.Authorization=`Bearer ${a.dashboard.token}`)}catch{}return{url:t,headers:e}}function X(t){let a=xe()?.agents?.[t];if(!a)throw new Error(`Unknown agent "${t}".`);if(!a.workspace)throw new Error(`Agent "${t}" has no workspace configured.`);return a.workspace}function ve(t,e){try{return new URL(t.url||"/","http://localhost").searchParams.get(e)||""}catch{return""}}function aa(t){let e=ve(t,"agent").trim();if(!e)throw new Error("agent= query param is required.");let a=F(X(e));return{agentId:e,...a}}function na(t){let e=ve(t,"agent").trim(),a=ve(t,"path").trim();if(!e||!a)throw new Error("agent= and path= query params are required.");return Q(X(e),a)}function oa(t){let e=String(t?.agent||"").trim(),a=String(t?.path||"").trim(),n=typeof t?.content=="string"?t.content:"";if(!e||!a)throw new Error("agent and path are required.");let o=Z(X(e),a,n);return{summary:`saved ${a} (${o.bytes} bytes)`,...o}}function ra(t){let e=String(t?.agent||"").trim(),a=String(t?.slug||"").trim(),n=t?.title?String(t.title):void 0,o=t?.content?String(t.content):void 0;if(!e)throw new Error("agent is required.");let r=ee(X(e),a,{title:n,content:o});return{summary:`added skill "${a}"`,...r}}function sa(t){let e=String(t?.agent||"").trim(),a=String(t?.slug||"").trim();if(!e||!a)throw new Error("agent and slug are required.");let n=te(X(e),a);return{summary:`removed skill "${a}"`,...n}}var st=["gitlab","github","sentry","stripe","discord","slack","custom"];function ia(t){let e=String(t?.id||"").trim(),a=String(t?.source||"").trim(),n=String(t?.agentId||"").trim(),o=String(t?.secretEnv||"").trim(),r=String(t?.description||"").trim();if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error("Webhook id must be lowercase (letters, digits, -, _).");if(!st.includes(a))throw new Error(`Unknown source: ${a}`);if(!n)throw new Error("Pick an agent to bind the webhook to.");let{summary:s}=S(i=>{if(!i.agents?.[n])throw new Error(`Unknown agent "${n}".`);if(i.webhooks=Array.isArray(i.webhooks)?i.webhooks:[],i.webhooks.find(d=>d.id===e))throw new Error(`Webhook "${e}" already exists.`);let l={id:e,source:a,agentId:n,enabled:!0};return o&&(l.secretEnv=o),r&&(l.description=r),i.webhooks.push(l),`added webhook "${e}" (${a} \u2192 ${n})`});return{summary:s}}function la(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Webhook id is required.");let a=t?.patch||{},{summary:n}=S(o=>{let r=(o.webhooks||[]).find(s=>s.id===e);if(!r)throw new Error(`Webhook "${e}" not found.`);if(typeof a.source=="string"&&st.includes(a.source)&&(r.source=a.source),typeof a.agentId=="string"&&a.agentId.trim()){if(!o.agents?.[a.agentId])throw new Error(`Unknown agent "${a.agentId}".`);r.agentId=a.agentId.trim()}return typeof a.secretEnv=="string"&&(r.secretEnv=a.secretEnv.trim()||void 0),typeof a.description=="string"&&(r.description=a.description.trim()||void 0),typeof a.enabled=="boolean"&&(r.enabled=a.enabled),`updated webhook "${e}"`});return{summary:n}}function da(t){let e=String(t?.url||"").trim().replace(/\/+$/,""),a=String(t?.name||"").trim(),n=String(t?.token||"").trim()||void 0;if(!e||!/^https?:\/\//.test(e))throw new Error("Peer URL must start with http:// or https://");if(!a)throw new Error("Peer name is required.");let{summary:o}=S(r=>{if(r.mesh=r.mesh||{enabled:!0,peers:[],discovery:"static",healthCheck:{interval:60,timeout:10}},r.mesh.enabled=!0,r.mesh.peers=Array.isArray(r.mesh.peers)?r.mesh.peers:[],r.mesh.peers.find(i=>i.url===e))throw new Error(`Peer at ${e} already registered.`);let s={url:e,name:a};return n&&(s.token=n),r.mesh.peers.push(s),`added mesh peer "${a}"`});return{summary:o}}function ca(t){let e=String(t?.url||"").trim().replace(/\/+$/,"");if(!e)throw new Error("Peer URL is required.");let{summary:a}=S(n=>{let o=(n.mesh?.peers||[]).length;if(n.mesh=n.mesh||{enabled:!1,peers:[],discovery:"static",healthCheck:{interval:60,timeout:10}},n.mesh.peers=(n.mesh.peers||[]).filter(r=>r.url.replace(/\/+$/,"")!==e),n.mesh.peers.length===o)throw new Error(`Peer at ${e} not found.`);return`removed mesh peer ${e}`});return{summary:a}}function pa(t){let e=!!t?.enabled,{summary:a}=S(n=>(n.mesh=n.mesh||{enabled:e,peers:[],discovery:"static",healthCheck:{interval:60,timeout:10}},n.mesh.enabled=e,`mesh ${e?"enabled":"disabled"}`));return{summary:a}}function ua(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Webhook id is required.");let{summary:a}=S(n=>{let o=(n.webhooks||[]).length;if(n.webhooks=(n.webhooks||[]).filter(r=>r.id!==e),n.webhooks.length===o)throw new Error(`Webhook "${e}" not found.`);return`removed webhook "${e}"`});return{summary:a}}function ma(t){let e=String(t?.botTokenEnv||"").trim(),a=String(t?.appTokenEnv||"").trim(),n=String(t?.agentBinding||"").trim();if(!e)throw new Error("Bot token env-var name is required (e.g. SLACK_BOT_TOKEN).");if(!a)throw new Error("App-level token env-var name is required (e.g. SLACK_APP_TOKEN).");let{summary:o}=S(r=>{if(r.channels=r.channels||{},r.channels.slack=r.channels.slack||{enabled:!1},r.channels.slack.enabled=!0,r.channels.slack.botToken="${"+e+"}",r.channels.slack.appToken="${"+a+"}",n){if(!r.agents?.[n])throw new Error(`Unknown agent "${n}".`);r.channels.slack.agentBinding=n}return"configured slack connector"});return{summary:o,hint:`Add ${e}=xoxb-\u2026 and ${a}=xapp-\u2026 to your .env.`}}function ha(t){let e=!!t?.enabled,{summary:a}=S(n=>(n.channels=n.channels||{},n.channels.slack=n.channels.slack||{enabled:!1},n.channels.slack.enabled=e,`slack ${e?"enabled":"disabled"}`));return{summary:a}}function ga(t){let e=String(t?.tokenEnv||"").trim(),a=String(t?.agentBinding||"").trim();if(!e)throw new Error("Bot token env-var name is required (e.g. DISCORD_BOT_TOKEN).");let{summary:n}=S(o=>{if(o.channels=o.channels||{},o.channels.discord=o.channels.discord||{enabled:!1},o.channels.discord.enabled=!0,o.channels.discord.token="${"+e+"}",a){if(!o.agents?.[a])throw new Error(`Unknown agent "${a}".`);o.channels.discord.agentBinding=a}return"configured discord connector"});return{summary:n,hint:`Add ${e}=<bot-token> to your .env.`}}function fa(t){let e=!!t?.enabled,{summary:a}=S(n=>(n.channels=n.channels||{},n.channels.discord=n.channels.discord||{enabled:!1},n.channels.discord.enabled=e,`discord ${e?"enabled":"disabled"}`));return{summary:a}}function va(t){let e=String(t?.host||"").trim().replace(/\/+$/,""),a=String(t?.tokenEnv||"").trim(),n=parseInt(String(t?.webhookPort||"18810"),10);if(!e||!/^https?:\/\//.test(e))throw new Error("Host must start with http:// or https://");if(!a)throw new Error("Admin token env-var name is required (e.g. GITLAB_TOKEN).");if(!Number.isFinite(n)||n<1||n>65535)throw new Error("Webhook port must be between 1 and 65535.");let{summary:o}=S(r=>(r.channels=r.channels||{},r.channels.gitlab=r.channels.gitlab||{enabled:!1,routes:[],agentMappings:[]},r.channels.gitlab.enabled=!0,r.channels.gitlab.host=e,r.channels.gitlab.token="${"+a+"}",r.channels.gitlab.webhookPort=n,"configured gitlab connector"));return{summary:o,hint:`Add ${a}=<personal-access-token> to your .env. Per-project routes + per-agent tokens stay in the Advanced JSON editor.`}}function ba(t){let e=!!t?.enabled,{summary:a}=S(n=>(n.channels=n.channels||{},n.channels.gitlab=n.channels.gitlab||{enabled:!1,routes:[],agentMappings:[]},n.channels.gitlab.enabled=e,`gitlab ${e?"enabled":"disabled"}`));return{summary:a}}async function xa(t){let e=String(t?.schedule||"").trim();if(!e)throw new Error("schedule is required");let{getNextCronDate:a}=await import("./scheduler-XRM2RJIV.js"),n;try{n=(await import("cronstrue")).default.toString(e,{use24HourTimeFormat:!1})}catch(i){throw new Error(`Invalid cron: ${i.message||"unknown"}`)}let o=Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC",r=[],s=new Date;try{for(let i=0;i<3;i++)s=a(e,s,o),r.push(s.toISOString())}catch(i){throw new Error(`Cron preview failed: ${i.message}`)}return{human:n,next:r,timezone:o}}function ya(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Account id is required.");let{summary:a}=S(n=>{if(!n.channels?.telegram?.accounts?.[e])throw new Error(`Account "${e}" not found.`);return delete n.channels.telegram.accounts[e],`removed telegram account "${e}"`});return{summary:a}}function wa(t){let e=!!t?.enabled,{summary:a}=S(n=>(n.channels=n.channels||{},n.channels.telegram=n.channels.telegram||{enabled:!1,accounts:{},policy:{dm:"pair",group:"mention-required"}},n.channels.telegram.enabled=e,`telegram ${e?"enabled":"disabled"}`));return{summary:a}}function ka(t){let e=String(t?.id||"").trim(),a=String(t?.schedule||"").trim(),n=String(t?.agent||"").trim(),o=String(t?.prompt||"").trim();if(!/^[a-z0-9][a-z0-9_-]*$/.test(e))throw new Error("Cron id must be lowercase (letters, digits, -, _).");if(!a)throw new Error("Cron expression is required (e.g. '0 9 * * 1' for Mondays at 9am).");if(!n)throw new Error("Pick an agent to run this schedule.");if(!o)throw new Error("A prompt is required (what should the agent do?).");let{summary:r}=S(s=>{if(s.crons=s.crons||{},s.crons[e])throw new Error(`Cron "${e}" already exists.`);if(!s.agents?.[n])throw new Error(`Unknown agent "${n}".`);return s.crons[e]={schedule:a,agent:n,prompt:o,enabled:!0},`added cron "${e}"`});return{summary:r}}function Sa(t){let e=String(t?.id||"").trim();if(!e)throw new Error("Cron id is required.");let{summary:a}=S(n=>{if(!n.crons?.[e])throw new Error(`Cron "${e}" not found.`);return delete n.crons[e],`removed cron "${e}"`});return{summary:a}}function Ea(t){let e=String(t?.raw||"");if(!e.trim())throw new Error("Config body is empty.");let a;try{a=JSON.parse(e)}catch(r){throw new Error(`Invalid JSON: ${r.message}`)}let n=ne(process.cwd(),"agentx.json"),o=`${n}.bak.${Date.now()}`;if(be(n))try{zt(n,o)}catch{}tt(n,JSON.stringify(a,null,2)+`
2526
+ `,"utf-8");try{let s=$().dashboard.daemonUrl?.replace(/\/+$/,"")||"http://127.0.0.1:18800";fetch(`${s}/reload`,{method:"POST"}).catch(()=>null)}catch{}return{summary:"agentx.json replaced",backupPath:o}}function it(t){return String(t||"").split(/[,\s]+/).map(e=>e.trim()).filter(Boolean).filter((e,a,n)=>n.indexOf(e)===a)}import{resolve as Ca}from"path";function lt(t={}){let e=t.localToken?`<script>window.AX_LOCAL_TOKEN = ${JSON.stringify(t.localToken)};</script>`:"",a=`<div id="msg" class="msg"></div>
2527
2527
 
2528
2528
  <div id="disabled-banner" class="banner warn" style="display:none">
2529
2529
  <b>Graph is disabled.</b> Set <code class="mono">graph.enabled: true</code>
@@ -2578,7 +2578,7 @@ ${s||"You are "+a+"."}
2578
2578
  <h2>Recent classifications</h2>
2579
2579
  <p class="muted">Last 25 log rows, newest first \u2014 approved / pending / rejected.</p>
2580
2580
  <div id="recent"></div>
2581
- </section>`;return E({title:"AgentX \xB7 Intent Graph",activeTab:"graph",subtitle:"Intent Graph",peers:t.peers,currentPeerId:t.currentPeerId,body:a,css:Aa,scripts:`${e}<script>${$a}</script>`})}var Aa=`
2581
+ </section>`;return E({title:"AgentX \xB7 Intent Graph",activeTab:"graph",subtitle:"Intent Graph",peers:t.peers,currentPeerId:t.currentPeerId,body:a,css:_a,scripts:`${e}<script>${Ta}</script>`})}var _a=`
2582
2582
  main { max-width: 1200px; margin: 0 auto; padding: 24px 20px 60px; }
2583
2583
  h2 { margin: 0 0 12px; font-size: 16px; font-weight: 600; letter-spacing: -0.01em; }
2584
2584
  .grid { display: grid; gap: 20px; grid-template-columns: 1fr; }
@@ -2682,7 +2682,7 @@ details {
2682
2682
  border-radius: 4px; padding: 8px 12px; margin-top: 8px;
2683
2683
  }
2684
2684
  details summary { cursor: pointer; font-size: 11px; color: var(--ax-muted); user-select: none; }
2685
- details[open] summary { margin-bottom: 8px; }`,$a=`
2685
+ details[open] summary { margin-bottom: 8px; }`,Ta=`
2686
2686
  const $ = (id) => document.getElementById(id);
2687
2687
  const state = { schema: null, nodes: [], pending: [], recent: [] };
2688
2688
 
@@ -2902,7 +2902,7 @@ $('btn-save-schema').addEventListener('click', async () => {
2902
2902
  $('btn-reload-schema').addEventListener('click', refresh);
2903
2903
 
2904
2904
  refresh();
2905
- `;function ut(t,e,a=[],n){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(ct({peers:a,localToken:n}))}async function mt(t,e,a){try{let n=t.method==="GET"?void 0:await Ba(t),o=Ia(),r={"GET /api/admin/graph/state":()=>La(o),"POST /api/admin/graph/classifications/approve":()=>Pa(o,n),"POST /api/admin/graph/classifications/reject":()=>Da(o,n),"POST /api/admin/graph/nodes":()=>Ha(o,n),"PATCH /api/admin/graph/nodes":()=>Oa(o,n),"DELETE /api/admin/graph/nodes":()=>Ra(o,n),"PUT /api/admin/graph/schema":()=>Na(o,n)},s=`${t.method} ${a}`,i=r[s];if(!i){we(e,404,{error:`unknown graph endpoint: ${s}`});return}let l=await i();we(e,200,l)}catch(n){we(e,400,{error:n?.message||"graph op failed"})}}function Ia(){let t=M(),e=Ma(process.cwd(),t.graph.baseDir);return new Le({baseDir:e})}function La(t){let e=M(),a=t.loadSchema(),n=t.loadNodes().nodes,o=t.readRecentClassifications(100),r=t.loadIndex().entries,s=new Map;for(let l of o)s.has(l.msgHash)||s.set(l.msgHash,l);let i=[];for(let l of s.values())l.status==="pending"&&!r[l.msgHash]&&i.push(l);return{enabled:e.graph.enabled,schema:a,nodes:n,pending:i,recent:o.slice(0,25),counts:{nodes:n.length,pending:i.length,fingerprints:Object.keys(r).length}}}function Pa(t,e){let a=String(e?.msgHash||"").trim();if(!a)throw new Error("msgHash is required");let n=ht(t,a);return Array.isArray(e?.path)&&e.path.length>0&&(n.path=e.path.map(o=>String(o))),e?.proposedAxes&&typeof e.proposedAxes=="object"&&(n.proposedAxes=ke(e.proposedAxes)),t.approveClassification(n),{summary:`Approved ${n.msgHash}`}}function Da(t,e){let a=String(e?.msgHash||"").trim();if(!a)throw new Error("msgHash is required");let n=ht(t,a);return t.rejectClassification(n),{summary:`Rejected ${n.msgHash}`}}function ht(t,e){let n=t.readRecentClassifications(500).find(o=>o.msgHash===e);if(!n)throw new Error(`No classification found for ${e}`);return n}function Ha(t,e){let a=pt(String(e?.id||"")),n=String(e?.level||"").trim(),o=e?.parentId?pt(String(e.parentId)):null,r=ke({[a]:e?.axes||{}})[a]||{};if(!a)throw new Error("id is required");if(!n)throw new Error("level is required");let s={id:a,level:n,parentId:o,axes:r,createdAt:new Date().toISOString(),createdBy:"admin-ui"};return t.addNode(s),{node:s}}function Oa(t,e){let a=String(e?.id||"").trim();if(!a)throw new Error("id is required");let n=ke({[a]:e?.axes||{}})[a]||{};return{node:t.updateNodeAxes(a,n)}}function Ra(t,e){let a=String(e?.id||"").trim();if(!a)throw new Error("id is required");return t.deleteNode(a),{summary:`Deleted ${a}`}}function Na(t,e){if(!e?.schema||typeof e.schema!="object")throw new Error("schema object is required");return t.saveSchema(e.schema),{summary:"Schema saved"}}function ke(t){let e={};for(let[a,n]of Object.entries(t||{})){if(!n||typeof n!="object")continue;let o={};for(let[r,s]of Object.entries(n))typeof s=="string"&&(o[r]=s);e[a]=o}return e}function pt(t){return t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function we(t,e,a){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(a))}function Ba(t){return new Promise((e,a)=>{let n="";t.on("data",o=>{n+=o}),t.on("end",()=>{try{e(n?JSON.parse(n):{})}catch(o){a(o)}}),t.on("error",a)})}import{existsSync as Ga,readFileSync as Fa}from"fs";import{resolve as ft}from"path";V();function gt(t){let e=t.agentId,a=t.localToken?`<script>window.AX_LOCAL_TOKEN = ${JSON.stringify(t.localToken)};</script>`:"",n=`<script>window.AGENT_ID = ${JSON.stringify(e)};</script>`,o=ja.replace(/__AGENT_ID__/g,C(e));return E({title:`AgentX \xB7 ${C(e)}`,activeTab:"admin",subtitle:`Agent \xB7 ${C(e)}`,peers:t.peers,currentPeerId:t.currentPeerId,noMain:!0,body:o,css:za,headExtras:'<link rel="stylesheet" href="https://unpkg.com/easymde/dist/easymde.min.css">',scripts:`${n}${a}<script src="https://unpkg.com/easymde/dist/easymde.min.js"></script><script>${qa}</script>`})}var ja=`
2905
+ `;function ct(t,e,a=[],n){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(lt({peers:a,localToken:n}))}async function pt(t,e,a){try{let n=t.method==="GET"?void 0:await Oa(t),o=Aa(),r={"GET /api/admin/graph/state":()=>$a(o),"POST /api/admin/graph/classifications/approve":()=>Ma(o,n),"POST /api/admin/graph/classifications/reject":()=>Ia(o,n),"POST /api/admin/graph/nodes":()=>La(o,n),"PATCH /api/admin/graph/nodes":()=>Pa(o,n),"DELETE /api/admin/graph/nodes":()=>Da(o,n),"PUT /api/admin/graph/schema":()=>Ha(o,n)},s=`${t.method} ${a}`,i=r[s];if(!i){ye(e,404,{error:`unknown graph endpoint: ${s}`});return}let l=await i();ye(e,200,l)}catch(n){ye(e,400,{error:n?.message||"graph op failed"})}}function Aa(){let t=$(),e=Ca(process.cwd(),t.graph.baseDir);return new Me({baseDir:e})}function $a(t){let e=$(),a=t.loadSchema(),n=t.loadNodes().nodes,o=t.readRecentClassifications(100),r=t.loadIndex().entries,s=new Map;for(let l of o)s.has(l.msgHash)||s.set(l.msgHash,l);let i=[];for(let l of s.values())l.status==="pending"&&!r[l.msgHash]&&i.push(l);return{enabled:e.graph.enabled,schema:a,nodes:n,pending:i,recent:o.slice(0,25),counts:{nodes:n.length,pending:i.length,fingerprints:Object.keys(r).length}}}function Ma(t,e){let a=String(e?.msgHash||"").trim();if(!a)throw new Error("msgHash is required");let n=ut(t,a);return Array.isArray(e?.path)&&e.path.length>0&&(n.path=e.path.map(o=>String(o))),e?.proposedAxes&&typeof e.proposedAxes=="object"&&(n.proposedAxes=we(e.proposedAxes)),t.approveClassification(n),{summary:`Approved ${n.msgHash}`}}function Ia(t,e){let a=String(e?.msgHash||"").trim();if(!a)throw new Error("msgHash is required");let n=ut(t,a);return t.rejectClassification(n),{summary:`Rejected ${n.msgHash}`}}function ut(t,e){let n=t.readRecentClassifications(500).find(o=>o.msgHash===e);if(!n)throw new Error(`No classification found for ${e}`);return n}function La(t,e){let a=dt(String(e?.id||"")),n=String(e?.level||"").trim(),o=e?.parentId?dt(String(e.parentId)):null,r=we({[a]:e?.axes||{}})[a]||{};if(!a)throw new Error("id is required");if(!n)throw new Error("level is required");let s={id:a,level:n,parentId:o,axes:r,createdAt:new Date().toISOString(),createdBy:"admin-ui"};return t.addNode(s),{node:s}}function Pa(t,e){let a=String(e?.id||"").trim();if(!a)throw new Error("id is required");let n=we({[a]:e?.axes||{}})[a]||{};return{node:t.updateNodeAxes(a,n)}}function Da(t,e){let a=String(e?.id||"").trim();if(!a)throw new Error("id is required");return t.deleteNode(a),{summary:`Deleted ${a}`}}function Ha(t,e){if(!e?.schema||typeof e.schema!="object")throw new Error("schema object is required");return t.saveSchema(e.schema),{summary:"Schema saved"}}function we(t){let e={};for(let[a,n]of Object.entries(t||{})){if(!n||typeof n!="object")continue;let o={};for(let[r,s]of Object.entries(n))typeof s=="string"&&(o[r]=s);e[a]=o}return e}function dt(t){return t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ye(t,e,a){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(a))}function Oa(t){return new Promise((e,a)=>{let n="";t.on("data",o=>{n+=o}),t.on("end",()=>{try{e(n?JSON.parse(n):{})}catch(o){a(o)}}),t.on("error",a)})}import{existsSync as ja,readFileSync as za}from"fs";import{resolve as ht}from"path";function mt(t){let e=t.agentId,a=t.localToken?`<script>window.AX_LOCAL_TOKEN = ${JSON.stringify(t.localToken)};</script>`:"",n=`<script>window.AGENT_ID = ${JSON.stringify(e)};</script>`,o=Ra.replace(/__AGENT_ID__/g,C(e));return E({title:`AgentX \xB7 ${C(e)}`,activeTab:"admin",subtitle:`Agent \xB7 ${C(e)}`,peers:t.peers,currentPeerId:t.currentPeerId,noMain:!0,body:o,css:Na,headExtras:'<link rel="stylesheet" href="https://unpkg.com/easymde/dist/easymde.min.css">',scripts:`${n}${a}<script src="https://unpkg.com/easymde/dist/easymde.min.js"></script><script>${Ba}</script>`})}var Ra=`
2906
2906
  <!-- Breadcrumb -->
2907
2907
  <div class="ax-crumb">
2908
2908
  <a href="/admin">Settings</a>
@@ -3395,7 +3395,7 @@ refresh();
3395
3395
  </div>
3396
3396
  </div>
3397
3397
  </div>
3398
- `,za=`
3398
+ `,Na=`
3399
3399
  /* Agent-specific layout + legacy styles for bits the migration left in
3400
3400
  * place (EasyMDE theming, skills tree, plain-editor). Shared chrome + tab
3401
3401
  * primitives live in components.css.ts. */
@@ -3514,7 +3514,7 @@ textarea.inp.mono { font-family: var(--ax-mono); }
3514
3514
 
3515
3515
  /* Agent-specific button variant used in rail context (no ax-btn wrapper) */
3516
3516
  .ax-btn.lg { padding: 9px 16px; font-size: 13px; }
3517
- `,qa=`
3517
+ `,Ba=`
3518
3518
  const $ = (id) => document.getElementById(id);
3519
3519
  const state = { agent: null, activeSkill: null, activeSkillFile: null, identityPath: null };
3520
3520
 
@@ -4220,9 +4220,9 @@ document.addEventListener('keydown', (e) => {
4220
4220
  /* ===== Boot ===== */
4221
4221
  initOptsToggles();
4222
4222
  loadAgent();
4223
- `;function vt(t,e,a,n=[],o){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(gt({agentId:a,peers:n,localToken:o}))}async function bt(t,e,a){try{let n=t.method==="GET"?void 0:await cn(t),o=new URL(t.url||"/","http://localhost"),r=Object.fromEntries(o.searchParams),s=a.match(/^\/api\/admin\/agent\/([a-z0-9][a-z0-9_-]*)(?:\/(.+))?$/);if(!s){re(e,404,{error:`unknown agent endpoint: ${a}`});return}let i=s[1],l=s[2]||"",d=`${t.method} ${l}`,p={"GET ":()=>yt(i),"PATCH ":()=>Ua(i,n),"GET identity":()=>Wa(i),"GET identity/file":()=>Ka(i,String(r.path||"")),"PUT identity/file":()=>Ja(i,n),"GET skills":()=>Xa(i),"POST skills":()=>Va(i,n),"DELETE skills":()=>Ya(i,n),"GET skills/tree":()=>Qa(i,String(r.slug||"")),"GET skills/file":()=>Za(i,String(r.slug||""),String(r.path||"")),"PUT skills/file":()=>en(i,n),"GET skills/deps":()=>tn(i,String(r.slug||"")),"POST skills/install":()=>an(i,n,t),"POST skills/deps":()=>nn(i,n,t),"GET channels":()=>on(i),"GET activity":()=>rn(i,t),"GET handovers":()=>sn(i),"POST handovers":()=>ln(i,n),"DELETE handovers":()=>dn(n)}[d];if(!p){re(e,404,{error:`unknown agent sub-endpoint: ${d}`});return}let f=await p();re(e,200,f)}catch(n){re(e,400,{error:n?.message||"agent op failed"})}}function xt(){let t=ft(process.cwd(),"agentx.json");return Ga(t)?JSON.parse(Fa(t,"utf-8")):null}function T(t){let e=xt();if(!e)throw new Error("agentx.json not found");let a=e.agents?.[t];if(!a)throw new Error(`Agent "${t}" not found`);return{def:a,cfg:e}}function yt(t){let{def:e,cfg:a}=T(t),n=e.workspace?F(e.workspace):null;return{id:t,name:e.name||t,tier:e.tier,model:e.model,workspace:e.workspace,systemPrompt:e.systemPrompt||"",mentions:e.mentions||[],access:e.access||"private",maxConcurrent:e.maxConcurrent??1,maxExecutionMinutes:e.maxExecutionMinutes??20,permissionMode:e.permissionMode||"default",overview:n,defaultWorker:a.node?.defaultAgent,draftAgent:a.dashboard?.draftAgent}}function Ua(t,e){let a={};for(let o of["name","tier","model","systemPrompt","mentions","access","maxConcurrent","maxExecutionMinutes","permissionMode"])e?.[o]!==void 0&&(a[o]=e[o]);let{summary:n}=S(o=>{if(!o.agents?.[t])throw new Error(`Agent "${t}" not found`);return o.agents[t]={...o.agents[t],...a},`agent "${t}" updated (${Object.keys(a).join(", ")})`});return{summary:n,agent:yt(t)}}function Wa(t){let{def:e}=T(t);return F(e.workspace)}function Ka(t,e){if(!e)throw new Error("path query param required");let{def:a}=T(t);return Z(a.workspace,e)}function Ja(t,e){let a=String(e?.path||"");if(!a)throw new Error("path required");let{def:n}=T(t);return ee(n.workspace,a,String(e?.content??""))}function Xa(t){let{def:e}=T(t),a=F(e.workspace);return{skills:a.skills,workspace:a.workspace}}function Va(t,e){let a=String(e?.slug||"").trim();if(!a)throw new Error("slug required");let{def:n}=T(t);return te(n.workspace,a,{title:e?.title,content:e?.content})}function Ya(t,e){let a=String(e?.slug||"").trim();if(!a)throw new Error("slug required");let{def:n}=T(t);return ae(n.workspace,a)}function Qa(t,e){if(!e)throw new Error("slug query param required");let{def:a}=T(t),n=Ze(a.workspace,e),o=ne(a.workspace,e);return{slug:e,tree:n,deps:o}}function Za(t,e,a){if(!e||!a)throw new Error("slug and path query params required");let{def:n}=T(t);return et(n.workspace,e,a)}function en(t,e){let a=String(e?.slug||""),n=String(e?.path||"");if(!a||!n)throw new Error("slug and path required");let{def:o}=T(t);return tt(o.workspace,a,n,String(e?.content??""))}function tn(t,e){if(!e)throw new Error("slug query param required");let{def:a}=T(t);return ne(a.workspace,e)}async function an(t,e,a){let n=String(e?.package||"").trim();if(!n||!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+(?:\/[A-Za-z0-9_.-]+)?$/.test(n))throw new Error("package must be in 'owner/repo' or 'owner/repo/skill' form");let o=wt(e?.worker),{def:r}=T(t),s=[`Install the skills.sh package "${n}" into agent "${t}".`,`Workspace: ${r.workspace}`,`Run: cd ${r.workspace} && npx -y skills add ${n}`,`If that fails, fall back to: agentx skill install ${n}`,`Skills should land under ${r.workspace}/.claude/skills/. Report what was installed and any errors.`].join(`
4224
- `);return kt(a,o,s,`install-${n}:${Date.now()}`)}async function nn(t,e,a){let n=String(e?.slug||"").trim();if(!n)throw new Error("slug required");let o=wt(e?.worker),{def:r}=T(t),s=ne(r.workspace,n);if(!s.manager)throw new Error(`No dependency manifest detected in .claude/skills/${n}. Expected one of: package.json, requirements.txt, Gemfile.`);let i=ft(r.workspace,".claude","skills",n),l=[`Install dependencies for skill "${n}" in agent "${t}".`,`cd to: ${i}`,`Detected manifest: ${s.file}`,`Run: ${s.command}`,"Stream the install output. On success, summarise the packages installed.","On failure, report the exit code and the last 20 lines of output."].join(`
4225
- `);return kt(a,o,l,`deps-${t}-${n}:${Date.now()}`)}function wt(t){if(t&&typeof t=="string")return t;let e=M();return e.dashboard?.draftAgent||e.node?.defaultAgent||Object.keys(e.agents).find(a=>a.includes("devops"))||Object.keys(e.agents)[0]}async function kt(t,e,a,n){let o=M(),r=(o.dashboard.daemonUrl||"http://localhost:18800").replace(/\/+$/,""),s={"Content-Type":"application/json"},i=t.headers.authorization;i?s.Authorization=String(i):o.dashboard.token&&(s.Authorization=`Bearer ${o.dashboard.token}`);let l=await fetch(`${r}/task`,{method:"POST",headers:s,body:JSON.stringify({agent:e,message:a,context:{channel:"admin",sender:"admin-ui",chatId:n}})}),d=await l.text(),u;try{u=JSON.parse(d)}catch{u={content:d}}if(!l.ok)throw new Error(u?.error||`daemon /task HTTP ${l.status}`);return{worker:e,taskId:u?.taskId,content:u?.content,duration:u?.duration,error:u?.error}}function on(t){let e=xt(),a=[],n=e?.channels?.telegram?.accounts||{};for(let[r,s]of Object.entries(n))s?.agentBinding===t&&a.push({channel:"telegram",account:r,detail:s?.botUsername||r});e?.channels?.slack?.agentBinding===t&&a.push({channel:"slack",detail:"bound"}),e?.channels?.discord?.agentBinding===t&&a.push({channel:"discord",detail:"bound"});let o=e?.channels?.gitlab?.agentMappings||[];for(let r of o)r?.agentId===t&&a.push({channel:"gitlab",detail:(r?.gitlabUsernames||[]).join(", ")||"mapped"});return{bindings:a}}async function rn(t,e){try{let n=(M().dashboard.daemonUrl||"http://localhost:18800").replace(/\/+$/,""),o=await fetch(`${n}/agents`);if(!o.ok)throw new Error(`daemon HTTP ${o.status}`);let s=(await o.json()).find(i=>i.id===t);return{activeTasks:s?.activeTasks??0,totalTasks:s?.totalTasks??0,errors:s?.errors??0,lastActive:s?.lastActive??null,runningTasks:s?.runningTasks??[],lastSummary:s?.lastSummary??null}}catch(a){return{error:a?.message,activeTasks:0,totalTasks:0,errors:0,runningTasks:[]}}}function Se(){return new Pe}function sn(t){let e=Se(),{incoming:a,outgoing:n}=e.listByAgent(t);return{incoming:a,outgoing:n}}function ln(t,e){let a=String(e?.channel||"").trim(),n=String(e?.chatId||"").trim(),o=String(e?.toAgent||"").trim();if(!a||!n||!o)throw new Error("channel, chatId, toAgent required");let r=String(e?.fromAgent||t||"").trim()||t,s=e?.accountId?String(e.accountId):void 0,i=e?.summary?String(e.summary):void 0,l=e?.expiresAt?String(e.expiresAt):void 0,d=Se().set({channel:a,chatId:n,accountId:s,fromAgent:r,toAgent:o,summary:i,expiresAt:l,createdBy:"admin-ui"});return{summary:`Handed off ${a}:${n} from ${r} to ${o}`,record:d}}function dn(t){let e=String(t?.channel||"").trim(),a=String(t?.chatId||"").trim();if(!e||!a)throw new Error("channel and chatId required");let n=t?.accountId?String(t.accountId):void 0;return{summary:Se().remove(e,a,n)?"Released":"No active handover for that chat"}}function re(t,e,a){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(a))}function cn(t){return new Promise((e,a)=>{let n="";t.on("data",o=>{n+=o}),t.on("end",()=>{try{e(n?JSON.parse(n):{})}catch(o){a(o)}}),t.on("error",a)})}var L={brand:"AgentX",subtitle:"Team AI ops",nodes:"machines",agentsCount:"agents",activeNow:"handling now",errorsCount:"failed",stats:{active:"Handling",total:"Today",errors:"Failed"},idle:"idle",runningNoPreview:"working \xB7 preparing reply",recentActivities:"Recent activities \u2192",noAgentsOnNode:"No agents set up on this machine.",unreachable:"This machine is unreachable.",neverRan:"not used yet",tierLabels:{"claude-code":"Claude Code",sdk:"SDK",orchestrator:"Orchestrator"},taskModalTitle:"Task activity",taskModalConnecting:"connecting\u2026",taskModalLive:"live",taskModalFinished:"finished",taskModalArchived:"archived",taskModalLoadFailed:"couldn't load",taskModalFinalResponse:"Final reply",historyPanelTitle:"Recent activities",historyEmpty:"No activity yet.",historyLoading:"loading\u2026"};var St=[{term:"Agent",definition:'An AI worker with its own role, instructions, and channels it responds on. Think of each agent as a job title \u2014 "support", "devops", "sales".'},{term:"Trigger word",alias:"mention",definition:"A word that activates an agent. When the trigger appears in a message (e.g. @support), AgentX routes the message to that agent."},{term:"Channel",definition:"Where messages come from \u2014 Telegram, WhatsApp, Discord, GitLab comments, a scheduled cron, or an HTTP webhook."},{term:"AI engine",alias:"tier",definition:"Which backend answers: Claude Code (reasoning + tools + files), an SDK provider (OpenAI, Anthropic API, Ollama), or an Orchestrator that coordinates sub-agents."},{term:"Agent folder",alias:"workspace",definition:"The directory on disk where the agent lives. It holds the agent's personality (CLAUDE.md), its knowledge (wiki), and the tools it can use."},{term:"Team network",alias:"mesh",definition:'When you run AgentX on more than one machine, the machines find each other and share work. Each machine is a "node"; together they are your team network.'},{term:"Status check-in",alias:"heartbeat",definition:"A lightweight ping between machines so each one knows the others are alive and responsive."},{term:"Board",definition:"A Kanban view of tasks (issues, tickets) pulled from GitLab. Drag cards between columns to move work forward \u2014 the labels update upstream automatically."},{term:"Task",definition:"A single conversation or job an agent handles, from trigger message to final reply. Every task is logged and replayable."},{term:"Schedule",alias:"cron",definition:'A recurring job \u2014 e.g. "every Monday at 9am" \u2014 that nudges an agent without a human trigger.'},{term:"Status label",alias:"scopedLabel",definition:"A GitLab label that moves an issue between Kanban columns (e.g. Status::Doing). Labels are mutually exclusive by prefix."}];function Ee(t={}){let e=`<script>window.UI_LABELS = ${JSON.stringify(L)};</script>`,a=`<span id="ts" class="ax-mono" title="Last update">\u2014</span>
4223
+ `;function gt(t,e,a,n=[],o){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(mt({agentId:a,peers:n,localToken:o}))}async function ft(t,e,a){try{let n=t.method==="GET"?void 0:await sn(t),o=new URL(t.url||"/","http://localhost"),r=Object.fromEntries(o.searchParams),s=a.match(/^\/api\/admin\/agent\/([a-z0-9][a-z0-9_-]*)(?:\/(.+))?$/);if(!s){oe(e,404,{error:`unknown agent endpoint: ${a}`});return}let i=s[1],l=s[2]||"",d=`${t.method} ${l}`,p={"GET ":()=>bt(i),"PATCH ":()=>qa(i,n),"GET identity":()=>Ga(i),"GET identity/file":()=>Fa(i,String(r.path||"")),"PUT identity/file":()=>Ua(i,n),"GET skills":()=>Wa(i),"POST skills":()=>Ka(i,n),"DELETE skills":()=>Ja(i,n),"GET skills/tree":()=>Xa(i,String(r.slug||"")),"GET skills/file":()=>Va(i,String(r.slug||""),String(r.path||"")),"PUT skills/file":()=>Ya(i,n),"GET skills/deps":()=>Qa(i,String(r.slug||"")),"POST skills/install":()=>Za(i,n,t),"POST skills/deps":()=>en(i,n,t),"GET channels":()=>tn(i),"GET activity":()=>an(i,t),"GET handovers":()=>nn(i),"POST handovers":()=>on(i,n),"DELETE handovers":()=>rn(n)}[d];if(!p){oe(e,404,{error:`unknown agent sub-endpoint: ${d}`});return}let f=await p();oe(e,200,f)}catch(n){oe(e,400,{error:n?.message||"agent op failed"})}}function vt(){let t=ht(process.cwd(),"agentx.json");return ja(t)?JSON.parse(za(t,"utf-8")):null}function T(t){let e=vt();if(!e)throw new Error("agentx.json not found");let a=e.agents?.[t];if(!a)throw new Error(`Agent "${t}" not found`);return{def:a,cfg:e}}function bt(t){let{def:e,cfg:a}=T(t),n=e.workspace?F(e.workspace):null;return{id:t,name:e.name||t,tier:e.tier,model:e.model,workspace:e.workspace,systemPrompt:e.systemPrompt||"",mentions:e.mentions||[],access:e.access||"private",maxConcurrent:e.maxConcurrent??1,maxExecutionMinutes:e.maxExecutionMinutes??20,permissionMode:e.permissionMode||"default",overview:n,defaultWorker:a.node?.defaultAgent,draftAgent:a.dashboard?.draftAgent}}function qa(t,e){let a={};for(let o of["name","tier","model","systemPrompt","mentions","access","maxConcurrent","maxExecutionMinutes","permissionMode"])e?.[o]!==void 0&&(a[o]=e[o]);let{summary:n}=S(o=>{if(!o.agents?.[t])throw new Error(`Agent "${t}" not found`);return o.agents[t]={...o.agents[t],...a},`agent "${t}" updated (${Object.keys(a).join(", ")})`});return{summary:n,agent:bt(t)}}function Ga(t){let{def:e}=T(t);return F(e.workspace)}function Fa(t,e){if(!e)throw new Error("path query param required");let{def:a}=T(t);return Q(a.workspace,e)}function Ua(t,e){let a=String(e?.path||"");if(!a)throw new Error("path required");let{def:n}=T(t);return Z(n.workspace,a,String(e?.content??""))}function Wa(t){let{def:e}=T(t),a=F(e.workspace);return{skills:a.skills,workspace:a.workspace}}function Ka(t,e){let a=String(e?.slug||"").trim();if(!a)throw new Error("slug required");let{def:n}=T(t);return ee(n.workspace,a,{title:e?.title,content:e?.content})}function Ja(t,e){let a=String(e?.slug||"").trim();if(!a)throw new Error("slug required");let{def:n}=T(t);return te(n.workspace,a)}function Xa(t,e){if(!e)throw new Error("slug query param required");let{def:a}=T(t),n=Ye(a.workspace,e),o=ae(a.workspace,e);return{slug:e,tree:n,deps:o}}function Va(t,e,a){if(!e||!a)throw new Error("slug and path query params required");let{def:n}=T(t);return Qe(n.workspace,e,a)}function Ya(t,e){let a=String(e?.slug||""),n=String(e?.path||"");if(!a||!n)throw new Error("slug and path required");let{def:o}=T(t);return Ze(o.workspace,a,n,String(e?.content??""))}function Qa(t,e){if(!e)throw new Error("slug query param required");let{def:a}=T(t);return ae(a.workspace,e)}async function Za(t,e,a){let n=String(e?.package||"").trim();if(!n||!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+(?:\/[A-Za-z0-9_.-]+)?$/.test(n))throw new Error("package must be in 'owner/repo' or 'owner/repo/skill' form");let o=xt(e?.worker),{def:r}=T(t),s=[`Install the skills.sh package "${n}" into agent "${t}".`,`Workspace: ${r.workspace}`,`Run: cd ${r.workspace} && npx -y skills add ${n}`,`If that fails, fall back to: agentx skill install ${n}`,`Skills should land under ${r.workspace}/.claude/skills/. Report what was installed and any errors.`].join(`
4224
+ `);return yt(a,o,s,`install-${n}:${Date.now()}`)}async function en(t,e,a){let n=String(e?.slug||"").trim();if(!n)throw new Error("slug required");let o=xt(e?.worker),{def:r}=T(t),s=ae(r.workspace,n);if(!s.manager)throw new Error(`No dependency manifest detected in .claude/skills/${n}. Expected one of: package.json, requirements.txt, Gemfile.`);let i=ht(r.workspace,".claude","skills",n),l=[`Install dependencies for skill "${n}" in agent "${t}".`,`cd to: ${i}`,`Detected manifest: ${s.file}`,`Run: ${s.command}`,"Stream the install output. On success, summarise the packages installed.","On failure, report the exit code and the last 20 lines of output."].join(`
4225
+ `);return yt(a,o,l,`deps-${t}-${n}:${Date.now()}`)}function xt(t){if(t&&typeof t=="string")return t;let e=$();return e.dashboard?.draftAgent||e.node?.defaultAgent||Object.keys(e.agents).find(a=>a.includes("devops"))||Object.keys(e.agents)[0]}async function yt(t,e,a,n){let o=$(),r=(o.dashboard.daemonUrl||"http://localhost:18800").replace(/\/+$/,""),s={"Content-Type":"application/json"},i=t.headers.authorization;i?s.Authorization=String(i):o.dashboard.token&&(s.Authorization=`Bearer ${o.dashboard.token}`);let l=await fetch(`${r}/task`,{method:"POST",headers:s,body:JSON.stringify({agent:e,message:a,context:{channel:"admin",sender:"admin-ui",chatId:n}})}),d=await l.text(),u;try{u=JSON.parse(d)}catch{u={content:d}}if(!l.ok)throw new Error(u?.error||`daemon /task HTTP ${l.status}`);return{worker:e,taskId:u?.taskId,content:u?.content,duration:u?.duration,error:u?.error}}function tn(t){let e=vt(),a=[],n=e?.channels?.telegram?.accounts||{};for(let[r,s]of Object.entries(n))s?.agentBinding===t&&a.push({channel:"telegram",account:r,detail:s?.botUsername||r});e?.channels?.slack?.agentBinding===t&&a.push({channel:"slack",detail:"bound"}),e?.channels?.discord?.agentBinding===t&&a.push({channel:"discord",detail:"bound"});let o=e?.channels?.gitlab?.agentMappings||[];for(let r of o)r?.agentId===t&&a.push({channel:"gitlab",detail:(r?.gitlabUsernames||[]).join(", ")||"mapped"});return{bindings:a}}async function an(t,e){try{let n=($().dashboard.daemonUrl||"http://localhost:18800").replace(/\/+$/,""),o=await fetch(`${n}/agents`);if(!o.ok)throw new Error(`daemon HTTP ${o.status}`);let s=(await o.json()).find(i=>i.id===t);return{activeTasks:s?.activeTasks??0,totalTasks:s?.totalTasks??0,errors:s?.errors??0,lastActive:s?.lastActive??null,runningTasks:s?.runningTasks??[],lastSummary:s?.lastSummary??null}}catch(a){return{error:a?.message,activeTasks:0,totalTasks:0,errors:0,runningTasks:[]}}}function ke(){return new Ie}function nn(t){let e=ke(),{incoming:a,outgoing:n}=e.listByAgent(t);return{incoming:a,outgoing:n}}function on(t,e){let a=String(e?.channel||"").trim(),n=String(e?.chatId||"").trim(),o=String(e?.toAgent||"").trim();if(!a||!n||!o)throw new Error("channel, chatId, toAgent required");let r=String(e?.fromAgent||t||"").trim()||t,s=e?.accountId?String(e.accountId):void 0,i=e?.summary?String(e.summary):void 0,l=e?.expiresAt?String(e.expiresAt):void 0,d=ke().set({channel:a,chatId:n,accountId:s,fromAgent:r,toAgent:o,summary:i,expiresAt:l,createdBy:"admin-ui"});return{summary:`Handed off ${a}:${n} from ${r} to ${o}`,record:d}}function rn(t){let e=String(t?.channel||"").trim(),a=String(t?.chatId||"").trim();if(!e||!a)throw new Error("channel and chatId required");let n=t?.accountId?String(t.accountId):void 0;return{summary:ke().remove(e,a,n)?"Released":"No active handover for that chat"}}function oe(t,e,a){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(a))}function sn(t){return new Promise((e,a)=>{let n="";t.on("data",o=>{n+=o}),t.on("end",()=>{try{e(n?JSON.parse(n):{})}catch(o){a(o)}}),t.on("error",a)})}var L={brand:"AgentX",subtitle:"Team AI ops",nodes:"machines",agentsCount:"agents",activeNow:"handling now",errorsCount:"failed",stats:{active:"Handling",total:"Today",errors:"Failed"},idle:"idle",runningNoPreview:"working \xB7 preparing reply",recentActivities:"Recent activities \u2192",noAgentsOnNode:"No agents set up on this machine.",unreachable:"This machine is unreachable.",neverRan:"not used yet",tierLabels:{"claude-code":"Claude Code",sdk:"SDK",orchestrator:"Orchestrator"},taskModalTitle:"Task activity",taskModalConnecting:"connecting\u2026",taskModalLive:"live",taskModalFinished:"finished",taskModalArchived:"archived",taskModalLoadFailed:"couldn't load",taskModalFinalResponse:"Final reply",historyPanelTitle:"Recent activities",historyEmpty:"No activity yet.",historyLoading:"loading\u2026"};var wt=[{term:"Agent",definition:'An AI worker with its own role, instructions, and channels it responds on. Think of each agent as a job title \u2014 "support", "devops", "sales".'},{term:"Trigger word",alias:"mention",definition:"A word that activates an agent. When the trigger appears in a message (e.g. @support), AgentX routes the message to that agent."},{term:"Channel",definition:"Where messages come from \u2014 Telegram, WhatsApp, Discord, GitLab comments, a scheduled cron, or an HTTP webhook."},{term:"AI engine",alias:"tier",definition:"Which backend answers: Claude Code (reasoning + tools + files), an SDK provider (OpenAI, Anthropic API, Ollama), or an Orchestrator that coordinates sub-agents."},{term:"Agent folder",alias:"workspace",definition:"The directory on disk where the agent lives. It holds the agent's personality (CLAUDE.md), its knowledge (wiki), and the tools it can use."},{term:"Team network",alias:"mesh",definition:'When you run AgentX on more than one machine, the machines find each other and share work. Each machine is a "node"; together they are your team network.'},{term:"Status check-in",alias:"heartbeat",definition:"A lightweight ping between machines so each one knows the others are alive and responsive."},{term:"Board",definition:"A Kanban view of tasks (issues, tickets) pulled from GitLab. Drag cards between columns to move work forward \u2014 the labels update upstream automatically."},{term:"Task",definition:"A single conversation or job an agent handles, from trigger message to final reply. Every task is logged and replayable."},{term:"Schedule",alias:"cron",definition:'A recurring job \u2014 e.g. "every Monday at 9am" \u2014 that nudges an agent without a human trigger.'},{term:"Status label",alias:"scopedLabel",definition:"A GitLab label that moves an issue between Kanban columns (e.g. Status::Doing). Labels are mutually exclusive by prefix."}];function Se(t={}){let e=`<script>window.UI_LABELS = ${JSON.stringify(L)};</script>`,a=`<span id="ts" class="ax-mono" title="Last update">\u2014</span>
4226
4226
  <span id="conn-dot" class="ax-dot ax-dot--ok ax-dot--pulse" title="connected"></span>
4227
4227
  <span id="conn-label">live</span>`,n=`<div class="ax-app-live">
4228
4228
  <section id="statstrip" class="ax-statstrip"></section>
@@ -4247,7 +4247,7 @@ loadAgent();
4247
4247
  </header>
4248
4248
  <div id="task-modal-output" class="task-modal-output"></div>
4249
4249
  </div>
4250
- </div>`;return E({title:`${L.brand} \xB7 ${L.subtitle}`,activeTab:"live",subtitle:L.subtitle,peers:t.peers,currentPeerId:t.currentPeerId,customHeader:void 0,noMain:!0,body:n,css:pn,scripts:e+`<script>${un}</script>`,headExtras:`<script>
4250
+ </div>`;return E({title:`${L.brand} \xB7 ${L.subtitle}`,activeTab:"live",subtitle:L.subtitle,peers:t.peers,currentPeerId:t.currentPeerId,customHeader:void 0,noMain:!0,body:n,css:ln,scripts:e+`<script>${dn}</script>`,headExtras:`<script>
4251
4251
  // rightExtras for the topbar are injected at runtime \u2014 they reference
4252
4252
  // IDs (#ts, #conn-dot) that the script below addresses directly.
4253
4253
  document.addEventListener('DOMContentLoaded', () => {
@@ -4258,7 +4258,7 @@ loadAgent();
4258
4258
  extras.innerHTML = ${JSON.stringify(a)};
4259
4259
  right.insertBefore(extras, right.firstChild);
4260
4260
  });
4261
- </script>`})}var pn=`
4261
+ </script>`})}var ln=`
4262
4262
  /* --- Page frame --- */
4263
4263
  .ax-app-live { min-height: 100vh; display: flex; flex-direction: column; }
4264
4264
 
@@ -4527,7 +4527,7 @@ loadAgent();
4527
4527
  border-top-color: var(--ax-accent); border-radius: 50%;
4528
4528
  animation: ax-spin 800ms linear infinite; display: inline-block;
4529
4529
  }
4530
- @keyframes ax-spin { to { transform: rotate(360deg); } }`,un=`
4530
+ @keyframes ax-spin { to { transform: rotate(360deg); } }`,dn=`
4531
4531
  'use strict';
4532
4532
 
4533
4533
  const ui = { nodes: new Map(), summary: { nodes: 0, agents: 0, busy: 0, errors: 0 } };
@@ -5203,7 +5203,7 @@ document.getElementById('grid').addEventListener('click', (e) => {
5203
5203
  }
5204
5204
  });
5205
5205
 
5206
- `;function Et(t={}){let e=`
5206
+ `;function kt(t={}){let e=`
5207
5207
  <select id="boardPicker" title="Switch board"></select>
5208
5208
  <div class="search">
5209
5209
  <span class="icon">\u2315</span>
@@ -5304,7 +5304,7 @@ document.getElementById('grid').addEventListener('click', (e) => {
5304
5304
  </footer>
5305
5305
  </div>
5306
5306
  </div>
5307
- <script src="/sortable.min.js"></script>`;return E({title:"AgentX \xB7 Boards",activeTab:"boards",subtitle:"Boards",subheader:e,peers:t.peers,currentPeerId:t.currentPeerId,noMain:!0,body:a,css:mn,scripts:`<script>${hn}</script>`,headExtras:`<script>
5307
+ <script src="/sortable.min.js"></script>`;return E({title:"AgentX \xB7 Boards",activeTab:"boards",subtitle:"Boards",subheader:e,peers:t.peers,currentPeerId:t.currentPeerId,noMain:!0,body:a,css:cn,scripts:`<script>${pn}</script>`,headExtras:`<script>
5308
5308
  // The boards page has its own connection dot + wants body height:100%
5309
5309
  // for the full-viewport kanban layout. Inject the dot into the topbar
5310
5310
  // and override body height at runtime so the shared shell doesn't
@@ -5320,7 +5320,7 @@ document.getElementById('grid').addEventListener('click', (e) => {
5320
5320
  right.insertBefore(dot, right.firstChild);
5321
5321
  }
5322
5322
  });
5323
- </script>`})}var mn=`
5323
+ </script>`})}var cn=`
5324
5324
  /* Kanban subheader \u2014 replaces the legacy toolbar that used to live in <header>. */
5325
5325
  .ax-subheader select, .ax-subheader input, .ax-subheader button {
5326
5326
  background: var(--col); color: var(--text); border: 1px solid var(--border);
@@ -5573,7 +5573,7 @@ header a.link:hover { color: var(--accent); border-color: var(--accent); }
5573
5573
  .draft-box .draft-row .hint { color: var(--muted); font-size: 12px; flex: 1; }
5574
5574
  .draft-box .draft-row .hint.err { color: var(--red); }
5575
5575
  .draft-box .draft-row .hint.ok { color: var(--green); }
5576
- `,hn=`
5576
+ `,pn=`
5577
5577
  'use strict';
5578
5578
  const state = {
5579
5579
  boards: [], current: null, items: {},
@@ -6632,9 +6632,9 @@ function appendEvents(events) {
6632
6632
  }
6633
6633
 
6634
6634
  loadBoards().catch(e => toast('Init failed: ' + e.message));
6635
- `;function _t(t={}){let a=`<h1>Plain-English glossary</h1>
6635
+ `;function St(t={}){let a=`<h1>Plain-English glossary</h1>
6636
6636
  <p class="lead">What the terms on the dashboard mean. Schema keys (shown in the pill on the right of each term) are what you'd write in <code>agentx.json</code> \u2014 the dashboard just relabels them for readability.</p>
6637
- ${St.map(n=>{let o=n.alias?`<span class="alias" title="Schema key">${C(n.alias)}</span>`:"";return`<article class="term"><h3>${C(n.term)}${o}</h3><p>${C(n.definition)}</p></article>`}).join("")}`;return E({title:`${L.brand} \xB7 Glossary`,activeTab:"glossary",subtitle:"Glossary",peers:t.peers,currentPeerId:t.currentPeerId,body:a,css:gn})}var gn=`
6637
+ ${wt.map(n=>{let o=n.alias?`<span class="alias" title="Schema key">${C(n.alias)}</span>`:"";return`<article class="term"><h3>${C(n.term)}${o}</h3><p>${C(n.definition)}</p></article>`}).join("")}`;return E({title:`${L.brand} \xB7 Glossary`,activeTab:"glossary",subtitle:"Glossary",peers:t.peers,currentPeerId:t.currentPeerId,body:a,css:un})}var un=`
6638
6638
  main { max-width: 760px; margin: 0 auto; padding: 32px 24px 80px; }
6639
6639
  h1 { font-size: 22px; margin: 0 0 6px; font-weight: 600; letter-spacing: -0.01em; }
6640
6640
  .lead {
@@ -6664,7 +6664,7 @@ article.term .alias {
6664
6664
  }
6665
6665
  article.term p {
6666
6666
  margin: 0; color: var(--ax-text-2); font-size: 13px; line-height: 1.6;
6667
- }`;function Tt(t={}){let e=`<div class="ax-wf__root">
6667
+ }`;function Et(t={}){let e=`<div class="ax-wf__root">
6668
6668
  <aside class="ax-wf__list">
6669
6669
  <header>
6670
6670
  <h2>Workflows</h2>
@@ -6706,7 +6706,7 @@ article.term p {
6706
6706
  </aside>
6707
6707
  </div>
6708
6708
 
6709
- <div id="wf-toast" class="ax-wf__toast" hidden></div>`;return E({title:"AgentX \xB7 Workflows",activeTab:"workflows",subtitle:"Workflows",peers:t.peers,currentPeerId:t.currentPeerId,body:e,css:fn,scripts:`<script>${vn}</script>`})}var fn=`
6709
+ <div id="wf-toast" class="ax-wf__toast" hidden></div>`;return E({title:"AgentX \xB7 Workflows",activeTab:"workflows",subtitle:"Workflows",peers:t.peers,currentPeerId:t.currentPeerId,body:e,css:mn,scripts:`<script>${hn}</script>`})}var mn=`
6710
6710
  .ax-wf__root {
6711
6711
  display: grid;
6712
6712
  grid-template-columns: 340px 1fr;
@@ -6923,7 +6923,7 @@ article.term p {
6923
6923
  font-size: 12px; z-index: 50;
6924
6924
  }
6925
6925
  .hint { color: var(--ax-muted); font-size: 11px; }
6926
- `,vn=`
6926
+ `,hn=`
6927
6927
  (() => {
6928
6928
  const $ = (sel) => document.querySelector(sel)
6929
6929
  const $$ = (sel) => Array.from(document.querySelectorAll(sel))
@@ -7210,7 +7210,7 @@ article.term p {
7210
7210
  setInterval(refresh, 15000)
7211
7211
  })
7212
7212
  })();
7213
- `;function Ct(t={}){let e='<div id="wfe-root" style="height:100%"></div>';return E({title:"AgentX \xB7 Workflow editor",activeTab:"workflows",subtitle:"Workflow editor",peers:t.peers,currentPeerId:t.currentPeerId,body:e,css:bn,scripts:'<script src="/assets/workflow-editor.global.js" defer></script>',noMain:!0})}var bn=`
7213
+ `;function _t(t={}){let e='<div id="wfe-root" style="height:100%"></div>';return E({title:"AgentX \xB7 Workflow editor",activeTab:"workflows",subtitle:"Workflow editor",peers:t.peers,currentPeerId:t.currentPeerId,body:e,css:gn,scripts:'<script src="/assets/workflow-editor.global.js" defer></script>',noMain:!0})}var gn=`
7214
7214
  /* Preload the fonts the redesign's CSS references. Placed in the shell so
7215
7215
  * they start fetching while the React bundle is still parsing. */
7216
7216
  @import url("https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&family=Instrument+Serif&display=swap");
@@ -7231,19 +7231,19 @@ body { margin: 0; overflow: hidden; }
7231
7231
  font: 13px/1 -apple-system, BlinkMacSystemFont, sans-serif;
7232
7232
  text-align: center;
7233
7233
  }
7234
- `;function $t(t,e,a){let n=t.url||"";if(!n.startsWith("/api/workflows"))return!1;let o=t.method||"GET";if(n==="/api/workflows"){if(o==="GET")return a.requireScope(t,e,["dashboard:read"])?y(e,200,{workflows:a.store.list()}):!0;if(o==="POST")return a.requireScope(t,e,["dashboard:write"])?U(t,e,s=>At(e,a,s,{mode:"create"})):!0}if(n.startsWith("/api/workflows/runs")&&o==="GET")return a.requireScope(t,e,["dashboard:read"])?yn(t,e,a,n):!0;let r=n.match(/^\/api\/workflows\/([^\/?]+)(\/layout|\/validate)?(\?.*)?$/);if(r){let s=decodeURIComponent(r[1]),i=r[2];if(i==="/layout"){if(o==="GET")return a.requireScope(t,e,["dashboard:read"])?y(e,200,{layout:a.layouts.get(s)}):!0;if(o==="PUT")return a.requireScope(t,e,["dashboard:write"])?U(t,e,l=>{try{let d=a.layouts.save(s,l);return y(e,200,{layout:d})}catch(d){return y(e,400,{error:"invalid layout",message:d.message})}}):!0}if(i==="/validate"&&o==="POST")return a.requireScope(t,e,["dashboard:read"])?U(t,e,l=>{let d=ie.safeParse(l);if(!d.success)return y(e,200,{ok:!1,issues:d.error.issues.map(p=>({path:p.path.join("."),message:p.message}))});let u=le(d.data).map(p=>({path:"",message:p}));return y(e,200,{ok:u.length===0,issues:u,workflow:d.data})}):!0;if(!i){if(o==="GET"){if(!a.requireScope(t,e,["dashboard:read"]))return!0;let l=a.store.get(s);return l?y(e,200,{workflow:l}):y(e,404,{error:"workflow not found"})}if(o==="PUT")return a.requireScope(t,e,["dashboard:write"])?U(t,e,l=>At(e,a,l,{mode:"update",id:s})):!0;if(o==="DELETE"){if(!a.requireScope(t,e,["dashboard:write"]))return!0;let l=a.store.delete(s);return a.layouts.delete(s),y(e,l?200:404,l?{ok:!0}:{error:"workflow not found"})}}}if(n.startsWith("/api/workflows/tasks")){if(!a.tasks||!a.dispatcher)return y(e,501,{error:"task engine not enabled"});let s=n.replace(/^\/api\/workflows\/tasks/,"");if(s===""||s.startsWith("?")){if(o!=="GET")return y(e,405,{error:"method not allowed"});if(!a.requireScope(t,e,["dashboard:read"]))return!0;let d=new URL(n,"http://_").searchParams.get("actor")||void 0,u=d?a.tasks.listForActor(d):a.tasks.listOpen();return y(e,200,{tasks:u})}let i=s.match(/^\/([^\/?]+)(\/submit)?$/);if(i){let l=decodeURIComponent(i[1]);if(i[2])return o!=="POST"?y(e,405,{error:"method not allowed"}):a.requireScope(t,e,["dashboard:write"])?U(t,e,async d=>{let u=Be.safeParse(d&&typeof d=="object"&&"submission"in d?d.submission:d);if(!u.success)return y(e,400,{error:"invalid submission",issues:u.error.issues.map(b=>({path:b.path.join("."),message:b.message}))});let p=typeof d?.submittedBy=="string"?d.submittedBy:"anonymous",f=await a.dispatcher.submitTask(l,u.data,p);return f.ok?y(e,200,{ok:!0,runId:f.runId}):y(e,400,{error:f.error,fieldErrors:f.fieldErrors})}):!0;if(o==="GET"){if(!a.requireScope(t,e,["dashboard:read"]))return!0;let d=a.tasks.get(l);return d?y(e,200,{task:d}):y(e,404,{error:"task not found"})}}}if(n.startsWith("/api/workflows/signal/")){if(o!=="POST")return y(e,405,{error:"method not allowed"});if(!a.requireScope(t,e,["dashboard:write"]))return!0;if(!a.dispatcher)return y(e,501,{error:"dispatcher not enabled"});let s=decodeURIComponent(n.replace(/^\/api\/workflows\/signal\//,"").split("?")[0]);return s?U(t,e,i=>{let l=i,d=a.dispatcher.emitSignal({name:s,scope:l?.scope,workflowId:l?.workflowId,payload:l?.payload});return y(e,200,{ok:!0,emission:d})}):y(e,400,{error:"signal name required"})}return y(e,404,{error:"unknown workflows endpoint",path:n})}var xn=["mesh"];function At(t,e,a,n){let o=ie.safeParse(a);if(!o.success)return y(t,400,{error:"invalid workflow",issues:o.error.issues.map(l=>({path:l.path.join("."),message:l.message}))});let r=o.data,s=le(r);if(s.length>0)return y(t,400,{error:"lint errors",issues:s.map(l=>({path:"",message:l}))});if(n.mode==="update"&&r.id!==n.id)return y(t,400,{error:"workflow id does not match path"});if(n.mode==="create"&&e.store.get(r.id))return y(t,409,{error:`workflow "${r.id}" already exists`});if(n.mode==="update"&&a&&typeof a=="object"){let l=a,d=e.store.get(n.id);if(d)for(let u of xn)!(u in l)&&u in d&&(r[u]=d[u])}let i=e.store.save(r);return e.layouts.sync(i.id,i.nodes.map(l=>l.id)),y(t,200,{workflow:i})}function yn(t,e,a,n){let o=new URL(n,"http://_").searchParams,r=n.replace(/^\/api\/workflows\/runs/,"");if(r===""||r.startsWith("?")){let i=Math.max(1,Math.min(500,Number(o.get("limit")||50))),l=o.get("workflowId")||void 0;return y(e,200,{runs:a.runs.list({workflowId:l,limit:i})})}let s=r.match(/^\/([^\/?]+)(\/stream)?$/);if(s){let i=decodeURIComponent(s[1]);if(s[2])return wn(t,e,a,i);let l=a.runs.get(i);return l?y(e,200,{run:l}):y(e,404,{error:"run not found"})}return y(e,404,{error:"unknown runs endpoint"})}function wn(t,e,a,n){let o=a.runs.get(n);if(!o)return y(e,404,{error:"run not found"}),!0;e.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"}),e.write(`data: ${JSON.stringify(o)}
7234
+ `;function Ct(t,e,a){let n=t.url||"";if(!n.startsWith("/api/workflows"))return!1;let o=t.method||"GET";if(n==="/api/workflows"){if(o==="GET")return a.requireScope(t,e,["dashboard:read"])?y(e,200,{workflows:a.store.list()}):!0;if(o==="POST")return a.requireScope(t,e,["dashboard:write"])?U(t,e,s=>Tt(e,a,s,{mode:"create"})):!0}if(n.startsWith("/api/workflows/runs")&&o==="GET")return a.requireScope(t,e,["dashboard:read"])?vn(t,e,a,n):!0;let r=n.match(/^\/api\/workflows\/([^\/?]+)(\/layout|\/validate)?(\?.*)?$/);if(r){let s=decodeURIComponent(r[1]),i=r[2];if(i==="/layout"){if(o==="GET")return a.requireScope(t,e,["dashboard:read"])?y(e,200,{layout:a.layouts.get(s)}):!0;if(o==="PUT")return a.requireScope(t,e,["dashboard:write"])?U(t,e,l=>{try{let d=a.layouts.save(s,l);return y(e,200,{layout:d})}catch(d){return y(e,400,{error:"invalid layout",message:d.message})}}):!0}if(i==="/validate"&&o==="POST")return a.requireScope(t,e,["dashboard:read"])?U(t,e,l=>{let d=se.safeParse(l);if(!d.success)return y(e,200,{ok:!1,issues:d.error.issues.map(p=>({path:p.path.join("."),message:p.message}))});let u=ie(d.data).map(p=>({path:"",message:p}));return y(e,200,{ok:u.length===0,issues:u,workflow:d.data})}):!0;if(!i){if(o==="GET"){if(!a.requireScope(t,e,["dashboard:read"]))return!0;let l=a.store.get(s);return l?y(e,200,{workflow:l}):y(e,404,{error:"workflow not found"})}if(o==="PUT")return a.requireScope(t,e,["dashboard:write"])?U(t,e,l=>Tt(e,a,l,{mode:"update",id:s})):!0;if(o==="DELETE"){if(!a.requireScope(t,e,["dashboard:write"]))return!0;let l=a.store.delete(s);return a.layouts.delete(s),y(e,l?200:404,l?{ok:!0}:{error:"workflow not found"})}}}if(n.startsWith("/api/workflows/tasks")){if(!a.tasks||!a.dispatcher)return y(e,501,{error:"task engine not enabled"});let s=n.replace(/^\/api\/workflows\/tasks/,"");if(s===""||s.startsWith("?")){if(o!=="GET")return y(e,405,{error:"method not allowed"});if(!a.requireScope(t,e,["dashboard:read"]))return!0;let d=new URL(n,"http://_").searchParams.get("actor")||void 0,u=d?a.tasks.listForActor(d):a.tasks.listOpen();return y(e,200,{tasks:u})}let i=s.match(/^\/([^\/?]+)(\/submit)?$/);if(i){let l=decodeURIComponent(i[1]);if(i[2])return o!=="POST"?y(e,405,{error:"method not allowed"}):a.requireScope(t,e,["dashboard:write"])?U(t,e,async d=>{let u=Re.safeParse(d&&typeof d=="object"&&"submission"in d?d.submission:d);if(!u.success)return y(e,400,{error:"invalid submission",issues:u.error.issues.map(b=>({path:b.path.join("."),message:b.message}))});let p=typeof d?.submittedBy=="string"?d.submittedBy:"anonymous",f=await a.dispatcher.submitTask(l,u.data,p);return f.ok?y(e,200,{ok:!0,runId:f.runId}):y(e,400,{error:f.error,fieldErrors:f.fieldErrors})}):!0;if(o==="GET"){if(!a.requireScope(t,e,["dashboard:read"]))return!0;let d=a.tasks.get(l);return d?y(e,200,{task:d}):y(e,404,{error:"task not found"})}}}if(n.startsWith("/api/workflows/signal/")){if(o!=="POST")return y(e,405,{error:"method not allowed"});if(!a.requireScope(t,e,["dashboard:write"]))return!0;if(!a.dispatcher)return y(e,501,{error:"dispatcher not enabled"});let s=decodeURIComponent(n.replace(/^\/api\/workflows\/signal\//,"").split("?")[0]);return s?U(t,e,i=>{let l=i,d=a.dispatcher.emitSignal({name:s,scope:l?.scope,workflowId:l?.workflowId,payload:l?.payload});return y(e,200,{ok:!0,emission:d})}):y(e,400,{error:"signal name required"})}return y(e,404,{error:"unknown workflows endpoint",path:n})}var fn=["mesh"];function Tt(t,e,a,n){let o=se.safeParse(a);if(!o.success)return y(t,400,{error:"invalid workflow",issues:o.error.issues.map(l=>({path:l.path.join("."),message:l.message}))});let r=o.data,s=ie(r);if(s.length>0)return y(t,400,{error:"lint errors",issues:s.map(l=>({path:"",message:l}))});if(n.mode==="update"&&r.id!==n.id)return y(t,400,{error:"workflow id does not match path"});if(n.mode==="create"&&e.store.get(r.id))return y(t,409,{error:`workflow "${r.id}" already exists`});if(n.mode==="update"&&a&&typeof a=="object"){let l=a,d=e.store.get(n.id);if(d)for(let u of fn)!(u in l)&&u in d&&(r[u]=d[u])}let i=e.store.save(r);return e.layouts.sync(i.id,i.nodes.map(l=>l.id)),y(t,200,{workflow:i})}function vn(t,e,a,n){let o=new URL(n,"http://_").searchParams,r=n.replace(/^\/api\/workflows\/runs/,"");if(r===""||r.startsWith("?")){let i=Math.max(1,Math.min(500,Number(o.get("limit")||50))),l=o.get("workflowId")||void 0;return y(e,200,{runs:a.runs.list({workflowId:l,limit:i})})}let s=r.match(/^\/([^\/?]+)(\/stream)?$/);if(s){let i=decodeURIComponent(s[1]);if(s[2])return bn(t,e,a,i);let l=a.runs.get(i);return l?y(e,200,{run:l}):y(e,404,{error:"run not found"})}return y(e,404,{error:"unknown runs endpoint"})}function bn(t,e,a,n){let o=a.runs.get(n);if(!o)return y(e,404,{error:"run not found"}),!0;e.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"}),e.write(`data: ${JSON.stringify(o)}
7235
7235
 
7236
7236
  `);let r=!1,s=()=>{r=!0,l?.(),clearInterval(u);try{e.end()}catch{}};t.on("close",s);let i=p=>{if(!r)try{e.write(`data: ${JSON.stringify(p)}
7237
7237
 
7238
- `)}catch{s()}},l=a.runEvents?.subscribe(n,i),d=o.updatedAt,u=setInterval(()=>{if(r)return;let p=a.runs.get(n);p&&p.updatedAt!==d&&(d=p.updatedAt,i(p))},2e3);return!0}function U(t,e,a){let n="";return t.setEncoding("utf8"),t.on("data",o=>{n+=o}),t.on("end",()=>{let o;try{o=n?JSON.parse(n):{}}catch(r){y(e,400,{error:"invalid JSON body",message:r.message});return}Promise.resolve(a(o)).catch(r=>{try{y(e,500,{error:"handler threw",message:r?.message??String(r)})}catch{}})}),t.on("error",o=>y(e,400,{error:"body read failed",message:o.message})),!0}function y(t,e,a){return t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(a)),!0}function ur(t){let e=t.dashboard,a=t.boards,n=e.port,o=e.bind,r=e.token,s=new Map;for(let b of a)try{s.set(b.id,Ln(b,t))}catch(c){console.error(` Board "${b.id}" failed to initialize: ${c.message}`)}let i=t.node?.id||"local",l=t.workflows?.dir?se(process.cwd(),t.workflows.dir):void 0,d=new Oe(l?{baseDir:l}:void 0),u=new Re(l?{baseDir:l,nodeId:i}:{nodeId:i}),p=new Ne(l?{baseDir:l}:void 0);kn(async(b,c)=>{try{await $n(b,c,{boards:a,sources:s,token:r,config:t,workflowStore:d,workflowRuns:u,workflowLayouts:p})}catch(m){h(c,500,{error:m.message||"internal error"})}}).listen(n,o,()=>{let b=o==="0.0.0.0"?"localhost":o;a.length===0?(console.log(`
7238
+ `)}catch{s()}},l=a.runEvents?.subscribe(n,i),d=o.updatedAt,u=setInterval(()=>{if(r)return;let p=a.runs.get(n);p&&p.updatedAt!==d&&(d=p.updatedAt,i(p))},2e3);return!0}function U(t,e,a){let n="";return t.setEncoding("utf8"),t.on("data",o=>{n+=o}),t.on("end",()=>{let o;try{o=n?JSON.parse(n):{}}catch(r){y(e,400,{error:"invalid JSON body",message:r.message});return}Promise.resolve(a(o)).catch(r=>{try{y(e,500,{error:"handler threw",message:r?.message??String(r)})}catch{}})}),t.on("error",o=>y(e,400,{error:"body read failed",message:o.message})),!0}function y(t,e,a){return t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(a)),!0}function dr(t){let e=t.dashboard,a=t.boards,n=e.port,o=e.bind,r=e.token,s=new Map;for(let b of a)try{s.set(b.id,$n(b,t))}catch(c){console.error(` Board "${b.id}" failed to initialize: ${c.message}`)}let i=t.node?.id||"local",l=t.workflows?.dir?re(process.cwd(),t.workflows.dir):void 0,d=new De(l?{baseDir:l}:void 0),u=new He(l?{baseDir:l,nodeId:i}:{nodeId:i}),p=new Oe(l?{baseDir:l}:void 0);xn(async(b,c)=>{try{await Tn(b,c,{boards:a,sources:s,token:r,config:t,workflowStore:d,workflowRuns:u,workflowLayouts:p})}catch(m){h(c,500,{error:m.message||"internal error"})}}).listen(n,o,()=>{let b=o==="0.0.0.0"?"localhost":o;a.length===0?(console.log(`
7239
7239
  Live dashboard: http://${b}:${n}
7240
7240
  `),console.log(" (no boards configured \u2014 '/' serves the live view; add a board with 'agentx board add')")):(console.log(`
7241
7241
  Kanban dashboard: http://${b}:${n}
7242
- `),console.log(` Boards: ${a.map(c=>c.id).join(", ")}`)),o==="127.0.0.1"&&!r?console.log(" (bound to localhost; no auth token \u2014 safe default)"):o!=="127.0.0.1"&&!r&&console.log(" \u26A0 bound to a non-loopback address without a token \u2014 writes are UNAUTHENTICATED")})}async function $n(t,e,a){let n=new URL(t.url||"/","http://localhost"),o=n.pathname,r=(t.method||"GET").toUpperCase();if(e.setHeader("Access-Control-Allow-Origin","*"),e.setHeader("Access-Control-Allow-Methods","GET, POST, PATCH, OPTIONS"),e.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization, X-Requested-With"),r==="OPTIONS"){e.writeHead(204),e.end();return}if(r==="GET"&&o==="/"){let c=We();if(!c.configExists||c.agentCount===0){e.writeHead(302,{Location:"/setup"}),e.end();return}let m=B(a.config),x=a.boards.length===0?Ee({peers:m}):Et({peers:m});e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(x);return}if(r==="GET"&&o==="/live"){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(Ee({peers:B(a.config)}));return}if(r==="GET"&&o==="/glossary"){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(_t({peers:B(a.config)}));return}if(r==="GET"&&o==="/workflows"){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(Tt({peers:B(a.config)}));return}if(r==="GET"&&o==="/workflows/editor"){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(Ct({peers:B(a.config)}));return}if(r==="GET"&&o==="/setup"){Ke(t,e);return}if(r==="POST"&&o==="/api/setup"){await Je(t,e);return}if(r==="GET"&&o==="/admin"){ot(t,e,B(a.config),a.token);return}if(r==="GET"&&o==="/admin/graph"){ut(t,e,B(a.config),a.token);return}let s=r==="GET"&&o.match(/^\/admin\/agents\/([a-z0-9][a-z0-9_-]*)$/);if(s){vt(t,e,s[1],B(a.config),a.token);return}if(o.startsWith("/api/admin/")){let c=String(t.headers["x-agentx-peer"]||"").trim()||n.searchParams.get("peer")||"";if(c&&c!=="primary"){let m=Wn(c,a.config);if(!m){h(e,404,{error:`unknown peer: ${c}`});return}await Un(t,e,m,o+(n.search||""));return}if(a.token){let m=t.headers.authorization||"",x=m.startsWith("Bearer ")?m.slice(7):"";if(x!==a.token){let w=new D,g=x?w.verify(x):null;if(!g||!K(g,"dashboard:write")){h(e,401,{error:"unauthorized"});return}}}}if(r==="GET"&&o==="/api/admin/config"){await rt(t,e);return}if(o.startsWith("/api/admin/graph/")){await mt(t,e,o);return}if(o.startsWith("/api/admin/agent/")){await bt(t,e,o);return}if(o.startsWith("/api/admin/")){await st(t,e,o);return}if(r==="GET"&&o==="/sortable.min.js"){e.writeHead(200,{"Content-Type":"application/javascript; charset=utf-8","Cache-Control":"public, max-age=86400"}),e.end(Xe);return}if(r==="GET"&&o.startsWith("/assets/")){let c=o.slice(8);if(!/^[a-zA-Z0-9._-]+\.(js|map|css)$/.test(c)){h(e,400,{error:"invalid asset name"});return}let m=Gn("web/"+c);try{let x=await Fn(m),w=c.endsWith(".map")?"application/json; charset=utf-8":c.endsWith(".css")?"text/css; charset=utf-8":"application/javascript; charset=utf-8";e.writeHead(200,{"Content-Type":w,"Cache-Control":"public, max-age=60"}),e.end(x)}catch{h(e,404,{error:"asset not found",hint:"run: npm run build:web"})}return}if(r==="GET"&&o==="/api/live"){try{let c=await Mt(a.config);h(e,200,c)}catch(c){h(e,502,{error:c.message})}return}if(r==="GET"&&o==="/api/live/stream"){Hn(t,e,a.config);return}if(r==="GET"&&o==="/api/task/stream"){let c=new URL(t.url||"/","http://localhost"),m=c.searchParams.get("node"),x=c.searchParams.get("agent"),w=c.searchParams.get("task");if(!m||!x||!w){h(e,400,{error:"node, agent, task query params required"});return}await On(t,e,a,m,x,w);return}if(r==="GET"&&o==="/api/task/history"){let c=new URL(t.url||"/","http://localhost"),m=c.searchParams.get("node"),x=c.searchParams.get("agent"),w=c.searchParams.get("task"),g=c.searchParams.get("limit")||"50";if(!m||!x){h(e,400,{error:"node and agent query params required"});return}await Bn(e,a,m,x,w,g);return}if(r==="GET"&&o==="/api/agents"){try{let c={};a.config.dashboard.token&&(c.Authorization=`Bearer ${a.config.dashboard.token}`);let m=await fetch(a.config.dashboard.daemonUrl.replace(/\/+$/,"")+"/agents",{headers:c});if(!m.ok)throw new Error(`HTTP ${m.status}`);let x=await m.json();h(e,200,x)}catch(c){h(e,502,{error:c.message||"agents fetch failed"})}return}if(r==="POST"&&o==="/api/draft"){let c=await W(t);try{let m=await zn(a.config,c);h(e,200,m)}catch(m){h(e,502,{error:m.message||"draft failed"})}return}let i=o.match(/^\/api\/public\/agents\/([^/]+)\/messages$/);if(i&&r==="POST"){let c=i[1];if(!Rn(t,e,[`agent:${c}`]))return;await Nn(t,e,a.config,c);return}if(o.startsWith("/api/")&&a.token){let c=t.headers.authorization||"",m=c.startsWith("Bearer ")?c.slice(7):"";if(m!==a.token){let x=new D,w=m?x.verify(m):null;if(!w||!K(w,"dashboard:write")){h(e,401,{error:"unauthorized"});return}}}if((r==="POST"||r==="PATCH"||r==="DELETE"||r==="PUT")&&o.startsWith("/api/")&&t.headers["x-requested-with"]!=="agentx-board"){h(e,400,{error:"missing X-Requested-With: agentx-board"});return}if(r==="GET"&&o==="/api/workflows/runs"){try{let c=new URL(t.url||"/","http://localhost"),m=Math.max(1,Math.min(500,Number(c.searchParams.get("limit")||50))),x=c.searchParams.get("workflowId")||void 0,w=a.workflowRuns.list({limit:m,workflowId:x}),g=`?limit=${m}${x?`&workflowId=${encodeURIComponent(x)}`:""}`,v=[{url:a.config.dashboard.daemonUrl,token:a.config.dashboard.token},...(a.config.dashboard.daemons||[]).map(_=>({url:_.url,token:_.token}))],k=await Promise.all(v.map(async _=>{let j={};_.token&&(j.Authorization=`Bearer ${_.token}`);try{let $e=await fetch(`${_.url.replace(/\/+$/,"")}/api/workflows/runs${g}`,{headers:j});if(!$e.ok)return[];let Me=await $e.json();return Array.isArray(Me.runs)?Me.runs:[]}catch{return[]}})),O=new Map;for(let _ of w)O.set(_.id,_);for(let _ of k)for(let j of _)O.set(j.id,j);let P=Array.from(O.values()).sort((_,j)=>_.updatedAt<j.updatedAt?1:-1).slice(0,m);h(e,200,{runs:P})}catch(c){h(e,502,{error:"runs fetch failed",message:c.message||String(c)})}return}let d=r==="GET"&&o.match(/^\/api\/workflows\/runs\/([^\/]+)$/);if(d){let c=decodeURIComponent(d[1]),m=a.workflowRuns.get(c);if(m){h(e,200,{run:m});return}let x=[{url:a.config.dashboard.daemonUrl,token:a.config.dashboard.token},...(a.config.dashboard.daemons||[]).map(w=>({url:w.url,token:w.token}))];for(let w of x)try{let g={};w.token&&(g.Authorization=`Bearer ${w.token}`);let v=await fetch(`${w.url.replace(/\/+$/,"")}/api/workflows/runs/${encodeURIComponent(c)}`,{headers:g});if(v.ok){h(e,200,await v.json());return}}catch{}h(e,404,{error:"run not found on any configured peer"});return}if(r==="POST"&&o==="/api/workflows/editor/chat"){try{let c=await W(t),m={"Content-Type":"application/json"};a.config.dashboard.token&&(m.Authorization=`Bearer ${a.config.dashboard.token}`);let x=a.config.dashboard.daemonUrl.replace(/\/+$/,""),w=await fetch(`${x}/api/workflows/editor/chat`,{method:"POST",headers:m,body:JSON.stringify(c??{})}),g=await w.json().catch(()=>({error:`HTTP ${w.status}`}));h(e,w.status,g)}catch(c){h(e,502,{error:"daemon unreachable",message:c.message||String(c)})}return}if(o.startsWith("/api/workflows")&&$t(t,e,{store:a.workflowStore,runs:a.workflowRuns,layouts:a.workflowLayouts,requireScope:(m,x,w)=>{if(a.token)return!0;let g=de(m);if(!g)return!0;let v=new D().verify(g);if(!v)return h(x,401,{error:"invalid or revoked token"}),!1;for(let k of w)if(!K(v,k))return h(x,403,{error:`token missing scope: ${k}`,scopes:v.scopes}),!1;return!0}}))return;if(r==="GET"&&o==="/api/boards"){h(e,200,a.boards.map(c=>({id:c.id,name:c.name,source:c.source,primaryToolLabel:c.primaryToolLabel,labels:c.labels,columns:c.columns,timeRangeDays:c.timeRangeDays})));return}let u=o.match(/^\/api\/boards\/([a-z0-9_-]+)\/members$/);if(u&&r==="GET"){let c=a.sources.get(u[1]);if(!c){h(e,404,{error:"unknown board"});return}try{let m=typeof c.listMembers=="function"?await c.listMembers():[];h(e,200,m)}catch(m){h(e,502,{error:m.message})}return}let p=o.match(/^\/api\/boards\/([a-z0-9_-]+)\/milestones$/);if(p&&r==="GET"){let c=a.sources.get(p[1]);if(!c){h(e,404,{error:"unknown board"});return}try{let m=typeof c.listMilestones=="function"?await c.listMilestones():[];h(e,200,m)}catch(m){h(e,502,{error:m.message})}return}let f=o.match(/^\/api\/boards\/([a-z0-9_-]+)\/items\/(.+?)\/move$/),b=o.match(/^\/api\/boards\/([a-z0-9_-]+)\/items(?:\/(.+))?$/);if(f&&r==="PATCH"){let[,c,m]=f,x=decodeURIComponent(m),w=a.boards.find(P=>P.id===c);if(!w){h(e,404,{error:`unknown board: ${c}`});return}let g=a.sources.get(c);if(!g){h(e,503,{error:`board "${c}" source unavailable`});return}let v=await W(t),k=w.columns.find(P=>P.id===v.to),O=w.columns.find(P=>P.id===v.from);if(!k){h(e,400,{error:`unknown 'to' column: ${v.to}`});return}try{await In(g,x,O,k),_e({actor:Te(t),action:"move",boardId:c,itemId:x,payload:{from:v.from,to:v.to}}),h(e,200,{ok:!0})}catch(P){h(e,502,{error:P.message||"transition failed"})}return}if(b){let[,c,m]=b,x=m?decodeURIComponent(m):void 0,w=a.boards.find(v=>v.id===c);if(!w){h(e,404,{error:`unknown board: ${c}`});return}let g=a.sources.get(c);if(!g){h(e,503,{error:`board "${c}" source unavailable`});return}if(r==="GET"&&!x){let{columns:v,totals:k}=await Mn(w,g,n.searchParams);h(e,200,{columns:v,totals:k});return}if(r==="GET"&&x){try{let v=typeof g.getItem=="function"?await g.getItem(x):null;if(!v){h(e,404,{error:"not found"});return}h(e,200,v)}catch(v){h(e,502,{error:v.message})}return}if(r==="PATCH"&&x){let v=await W(t);try{let k=typeof g.updateItem=="function"?await g.updateItem(x,v):null;if(!k){h(e,501,{error:"update unsupported"});return}_e({actor:Te(t),action:"update",boardId:c,itemId:x,payload:v}),h(e,200,k)}catch(k){h(e,502,{error:k.message})}return}if(r==="POST"&&!x){let v=await W(t);if(!v.title){h(e,400,{error:"title required"});return}if(!g.capabilities.create||!g.create){h(e,400,{error:`source ${g.type} does not support create`});return}try{let k=await g.create({title:v.title,description:v.description,labels:v.labels,assigneeUsernames:v.assigneeUsernames,milestoneTitle:v.milestoneTitle,projectHint:v.projectHint});_e({actor:Te(t),action:"create",boardId:c,itemId:k.id,payload:{title:v.title}}),h(e,201,k)}catch(k){h(e,502,{error:k.message})}return}}h(e,404,{error:"not found",path:o})}async function Mn(t,e,a){if(!e.capabilities.listAll||!e.listAll){let g={};for(let v of t.columns)g[v.id]=[];return{columns:g,totals:Object.fromEntries(t.columns.map(v=>[v.id,0]))}}let n=[];t.primaryToolLabel&&n.push(t.primaryToolLabel);let o=a.get("label")||void 0;o&&n.push(o);let r=a.get("q")||void 0,s=a.get("milestone")||void 0,i=a.get("assignee")||void 0,l=parseInt(a.get("days")||String(t.timeRangeDays),10),d=parseInt(a.get("closedDays")||String(t.closedWindowDays??30),10),u=t.columns.some(g=>g.kind!=="closed"),p=t.columns.some(g=>g.kind==="closed"),f=u?await e.listAll({sinceDays:l,labels:n.length?n:void 0,search:r,milestone:s,state:"opened"}):[],b=p?await e.listAll({sinceDays:d,labels:n.length?n:void 0,search:r,milestone:s,state:"closed"}):[],c={};for(let g of t.columns)c[g.id]=[];let m=t.columns.find(g=>g.kind==="closed");for(let g of b)m&&c[m.id].push({...g,stage:m.id});let x=t.columns.filter(g=>g.kind!=="closed");for(let g of f){let v=De(g,x);if(!v)continue;let k=c[v];k&&k.push({...g,stage:v})}if(i)for(let g of Object.keys(c))c[g]=c[g].filter(v=>v.assignee===i);for(let g of Object.keys(c))c[g].sort((v,k)=>{let O=(v.priority??99)-(k.priority??99);return O!==0?O:(k.updatedAt||"").localeCompare(v.updatedAt||"")});let w=Object.fromEntries(Object.entries(c).map(([g,v])=>[g,v.length]));return{columns:c,totals:w}}async function In(t,e,a,n){let o=He(a,n),r=t;o.closeIssue&&typeof r.setState=="function"?await r.setState(e,"close"):o.reopen&&typeof r.setState=="function"&&await r.setState(e,"reopen"),(o.addLabels?.length||o.removeLabels?.length)&&typeof r.transitionMany=="function"?await r.transitionMany(e,o.addLabels||[],o.removeLabels||[]):o.addLabels?.length&&t.transition&&await t.transition(e,o.addLabels[0],o.removeLabels?.[0])}function Ln(t,e){if(t.source.type==="gitlab"){let a=e.channels.gitlab;if(!a?.token)throw new Error("channels.gitlab.token is required for gitlab boards");let n={};for(let o of a.agentMappings)o.gitlabUsernames.length&&(n[o.agentId]=o.gitlabUsernames);return new je(a.host,a.token,t.source.projects,n,(...o)=>console.log("[board]",...o))}throw new Error(`unsupported board source: ${t.source.type}`)}function _e(t){try{let e=se(process.cwd(),".agentx");En(e)||_n(e,{recursive:!0});let a=JSON.stringify({ts:new Date().toISOString(),...t})+`
7243
- `;Sn(se(e,"board-audit.jsonl"),a)}catch{}}function Te(t){let e=t.headers["x-forwarded-for"];return(Array.isArray(e)?e[0]:e?.split(",")[0])||t.socket.remoteAddress||"unknown"}async function Pn(t,e,a){let n={};e&&(n.Authorization=`Bearer ${e}`);let o={id:t,name:t,url:t,reachable:!1,agents:[]};try{let[r,s,i]=await Promise.all([fetch(t+"/health",{headers:n,signal:a}).catch(()=>null),fetch(t+"/agents",{headers:n,signal:a}).catch(()=>null),fetch(t+"/mesh",{headers:n,signal:a}).catch(()=>null)]);if(!s||!s.ok)return o.error=s?`HTTP ${s.status}`:"unreachable",o;let l=await s.json();if(o.agents=l.map(d=>({id:d.id,name:d.name,tier:d.tier,model:d.model,active:d.active||0,total:d.total||0,errors:d.errors||0,lastActive:d.lastActive,lastSummary:d.lastSummary,hourlyTasks:Array.isArray(d.hourlyTasks)?d.hourlyTasks:void 0,runningTasks:Array.isArray(d.runningTasks)?d.runningTasks:[]})),r&&r.ok){let d=await r.json();o.uptimeSec=d.uptime,o.name=d.node?.name||d.node?.id||t,o.id=d.node?.id||t,d.usage&&(o.usage=d.usage)}o.reachable=!0,o._peers=Array.isArray(i&&await Dn(i))?o._peers:void 0}catch(r){o.error=r.message||String(r)}return o}var Ce=new WeakMap;async function Dn(t){if(Ce.has(t))return Ce.get(t);try{let e=t.ok?await t.json():null;return Ce.set(t,e),e}catch{return null}}async function Ae(t,e,a){try{let n={};e&&(n.Authorization=`Bearer ${e}`);let o=await fetch(t+"/mesh",{headers:n,signal:a});return o.ok?(await o.json()).filter(s=>s&&s.peerUrl).map(s=>({url:String(s.peerUrl).replace(/\/+$/,""),name:s.peer||s.peerUrl})):[]}catch{return[]}}async function Mt(t){let e=t.dashboard,a=e.daemonUrl.replace(/\/+$/,""),n=e.token,o=new Map;o.set(a,{name:"primary",url:a,token:n});for(let i of e.daemons){let l=i.url.replace(/\/+$/,"");o.has(l)||o.set(l,{name:i.name,url:l,token:i.token})}let r=new AbortController,s=setTimeout(()=>r.abort(),3e3);try{let i=await Ae(a,n,r.signal);for(let d of i)o.has(d.url)||o.set(d.url,d);let l=await Promise.all([...o.values()].map(d=>Pn(d.url,d.token,r.signal)));return{ts:new Date().toISOString(),nodes:l}}finally{clearTimeout(s)}}function Hn(t,e,a){e.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"});let n=!1,o=(i,l)=>{n||e.write(`event: ${i}
7242
+ `),console.log(` Boards: ${a.map(c=>c.id).join(", ")}`)),o==="127.0.0.1"&&!r?console.log(" (bound to localhost; no auth token \u2014 safe default)"):o!=="127.0.0.1"&&!r&&console.log(" \u26A0 bound to a non-loopback address without a token \u2014 writes are UNAUTHENTICATED")})}async function Tn(t,e,a){let n=new URL(t.url||"/","http://localhost"),o=n.pathname,r=(t.method||"GET").toUpperCase();if(e.setHeader("Access-Control-Allow-Origin","*"),e.setHeader("Access-Control-Allow-Methods","GET, POST, PATCH, OPTIONS"),e.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization, X-Requested-With"),r==="OPTIONS"){e.writeHead(204),e.end();return}if(r==="GET"&&o==="/"){let c=Fe();if(!c.configExists||c.agentCount===0){e.writeHead(302,{Location:"/setup"}),e.end();return}let m=B(a.config),x=a.boards.length===0?Se({peers:m}):kt({peers:m});e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(x);return}if(r==="GET"&&o==="/live"){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(Se({peers:B(a.config)}));return}if(r==="GET"&&o==="/glossary"){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(St({peers:B(a.config)}));return}if(r==="GET"&&o==="/workflows"){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(Et({peers:B(a.config)}));return}if(r==="GET"&&o==="/workflows/editor"){e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(_t({peers:B(a.config)}));return}if(r==="GET"&&o==="/setup"){Ue(t,e);return}if(r==="POST"&&o==="/api/setup"){await We(t,e);return}if(r==="GET"&&o==="/admin"){at(t,e,B(a.config),a.token);return}if(r==="GET"&&o==="/admin/graph"){ct(t,e,B(a.config),a.token);return}let s=r==="GET"&&o.match(/^\/admin\/agents\/([a-z0-9][a-z0-9_-]*)$/);if(s){gt(t,e,s[1],B(a.config),a.token);return}if(o.startsWith("/api/admin/")){let c=String(t.headers["x-agentx-peer"]||"").trim()||n.searchParams.get("peer")||"";if(c&&c!=="primary"){let m=Gn(c,a.config);if(!m){h(e,404,{error:`unknown peer: ${c}`});return}await qn(t,e,m,o+(n.search||""));return}if(a.token){let m=t.headers.authorization||"",x=m.startsWith("Bearer ")?m.slice(7):"";if(x!==a.token){let w=new D,g=x?w.verify(x):null;if(!g||!K(g,"dashboard:write")){h(e,401,{error:"unauthorized"});return}}}}if(r==="GET"&&o==="/api/admin/config"){await nt(t,e);return}if(o.startsWith("/api/admin/graph/")){await pt(t,e,o);return}if(o.startsWith("/api/admin/agent/")){await ft(t,e,o);return}if(o.startsWith("/api/admin/")){await ot(t,e,o);return}if(r==="GET"&&o==="/sortable.min.js"){e.writeHead(200,{"Content-Type":"application/javascript; charset=utf-8","Cache-Control":"public, max-age=86400"}),e.end(Ke);return}if(r==="GET"&&o.startsWith("/assets/")){let c=o.slice(8);if(!/^[a-zA-Z0-9._-]+\.(js|map|css)$/.test(c)){h(e,400,{error:"invalid asset name"});return}let m=jn("web/"+c);try{let x=await zn(m),w=c.endsWith(".map")?"application/json; charset=utf-8":c.endsWith(".css")?"text/css; charset=utf-8":"application/javascript; charset=utf-8";e.writeHead(200,{"Content-Type":w,"Cache-Control":"public, max-age=60"}),e.end(x)}catch{h(e,404,{error:"asset not found",hint:"run: npm run build:web"})}return}if(r==="GET"&&o==="/api/live"){try{let c=await At(a.config);h(e,200,c)}catch(c){h(e,502,{error:c.message})}return}if(r==="GET"&&o==="/api/live/stream"){Ln(t,e,a.config);return}if(r==="GET"&&o==="/api/task/stream"){let c=new URL(t.url||"/","http://localhost"),m=c.searchParams.get("node"),x=c.searchParams.get("agent"),w=c.searchParams.get("task");if(!m||!x||!w){h(e,400,{error:"node, agent, task query params required"});return}await Pn(t,e,a,m,x,w);return}if(r==="GET"&&o==="/api/task/history"){let c=new URL(t.url||"/","http://localhost"),m=c.searchParams.get("node"),x=c.searchParams.get("agent"),w=c.searchParams.get("task"),g=c.searchParams.get("limit")||"50";if(!m||!x){h(e,400,{error:"node and agent query params required"});return}await On(e,a,m,x,w,g);return}if(r==="GET"&&o==="/api/agents"){try{let c={};a.config.dashboard.token&&(c.Authorization=`Bearer ${a.config.dashboard.token}`);let m=await fetch(a.config.dashboard.daemonUrl.replace(/\/+$/,"")+"/agents",{headers:c});if(!m.ok)throw new Error(`HTTP ${m.status}`);let x=await m.json();h(e,200,x)}catch(c){h(e,502,{error:c.message||"agents fetch failed"})}return}if(r==="POST"&&o==="/api/draft"){let c=await W(t);try{let m=await Nn(a.config,c);h(e,200,m)}catch(m){h(e,502,{error:m.message||"draft failed"})}return}let i=o.match(/^\/api\/public\/agents\/([^/]+)\/messages$/);if(i&&r==="POST"){let c=i[1];if(!Dn(t,e,[`agent:${c}`]))return;await Hn(t,e,a.config,c);return}if(o.startsWith("/api/")&&a.token){let c=t.headers.authorization||"",m=c.startsWith("Bearer ")?c.slice(7):"";if(m!==a.token){let x=new D,w=m?x.verify(m):null;if(!w||!K(w,"dashboard:write")){h(e,401,{error:"unauthorized"});return}}}if((r==="POST"||r==="PATCH"||r==="DELETE"||r==="PUT")&&o.startsWith("/api/")&&t.headers["x-requested-with"]!=="agentx-board"){h(e,400,{error:"missing X-Requested-With: agentx-board"});return}if(r==="GET"&&o==="/api/workflows/runs"){try{let c=new URL(t.url||"/","http://localhost"),m=Math.max(1,Math.min(500,Number(c.searchParams.get("limit")||50))),x=c.searchParams.get("workflowId")||void 0,w=a.workflowRuns.list({limit:m,workflowId:x}),g=`?limit=${m}${x?`&workflowId=${encodeURIComponent(x)}`:""}`,v=[{url:a.config.dashboard.daemonUrl,token:a.config.dashboard.token},...(a.config.dashboard.daemons||[]).map(_=>({url:_.url,token:_.token}))],k=await Promise.all(v.map(async _=>{let j={};_.token&&(j.Authorization=`Bearer ${_.token}`);try{let Ae=await fetch(`${_.url.replace(/\/+$/,"")}/api/workflows/runs${g}`,{headers:j});if(!Ae.ok)return[];let $e=await Ae.json();return Array.isArray($e.runs)?$e.runs:[]}catch{return[]}})),O=new Map;for(let _ of w)O.set(_.id,_);for(let _ of k)for(let j of _)O.set(j.id,j);let P=Array.from(O.values()).sort((_,j)=>_.updatedAt<j.updatedAt?1:-1).slice(0,m);h(e,200,{runs:P})}catch(c){h(e,502,{error:"runs fetch failed",message:c.message||String(c)})}return}let d=r==="GET"&&o.match(/^\/api\/workflows\/runs\/([^\/]+)$/);if(d){let c=decodeURIComponent(d[1]),m=a.workflowRuns.get(c);if(m){h(e,200,{run:m});return}let x=[{url:a.config.dashboard.daemonUrl,token:a.config.dashboard.token},...(a.config.dashboard.daemons||[]).map(w=>({url:w.url,token:w.token}))];for(let w of x)try{let g={};w.token&&(g.Authorization=`Bearer ${w.token}`);let v=await fetch(`${w.url.replace(/\/+$/,"")}/api/workflows/runs/${encodeURIComponent(c)}`,{headers:g});if(v.ok){h(e,200,await v.json());return}}catch{}h(e,404,{error:"run not found on any configured peer"});return}if(r==="POST"&&o==="/api/workflows/editor/chat"){try{let c=await W(t),m={"Content-Type":"application/json"};a.config.dashboard.token&&(m.Authorization=`Bearer ${a.config.dashboard.token}`);let x=a.config.dashboard.daemonUrl.replace(/\/+$/,""),w=await fetch(`${x}/api/workflows/editor/chat`,{method:"POST",headers:m,body:JSON.stringify(c??{})}),g=await w.json().catch(()=>({error:`HTTP ${w.status}`}));h(e,w.status,g)}catch(c){h(e,502,{error:"daemon unreachable",message:c.message||String(c)})}return}if(o.startsWith("/api/workflows")&&Ct(t,e,{store:a.workflowStore,runs:a.workflowRuns,layouts:a.workflowLayouts,requireScope:(m,x,w)=>{if(a.token)return!0;let g=le(m);if(!g)return!0;let v=new D().verify(g);if(!v)return h(x,401,{error:"invalid or revoked token"}),!1;for(let k of w)if(!K(v,k))return h(x,403,{error:`token missing scope: ${k}`,scopes:v.scopes}),!1;return!0}}))return;if(r==="GET"&&o==="/api/boards"){h(e,200,a.boards.map(c=>({id:c.id,name:c.name,source:c.source,primaryToolLabel:c.primaryToolLabel,labels:c.labels,columns:c.columns,timeRangeDays:c.timeRangeDays})));return}let u=o.match(/^\/api\/boards\/([a-z0-9_-]+)\/members$/);if(u&&r==="GET"){let c=a.sources.get(u[1]);if(!c){h(e,404,{error:"unknown board"});return}try{let m=typeof c.listMembers=="function"?await c.listMembers():[];h(e,200,m)}catch(m){h(e,502,{error:m.message})}return}let p=o.match(/^\/api\/boards\/([a-z0-9_-]+)\/milestones$/);if(p&&r==="GET"){let c=a.sources.get(p[1]);if(!c){h(e,404,{error:"unknown board"});return}try{let m=typeof c.listMilestones=="function"?await c.listMilestones():[];h(e,200,m)}catch(m){h(e,502,{error:m.message})}return}let f=o.match(/^\/api\/boards\/([a-z0-9_-]+)\/items\/(.+?)\/move$/),b=o.match(/^\/api\/boards\/([a-z0-9_-]+)\/items(?:\/(.+))?$/);if(f&&r==="PATCH"){let[,c,m]=f,x=decodeURIComponent(m),w=a.boards.find(P=>P.id===c);if(!w){h(e,404,{error:`unknown board: ${c}`});return}let g=a.sources.get(c);if(!g){h(e,503,{error:`board "${c}" source unavailable`});return}let v=await W(t),k=w.columns.find(P=>P.id===v.to),O=w.columns.find(P=>P.id===v.from);if(!k){h(e,400,{error:`unknown 'to' column: ${v.to}`});return}try{await An(g,x,O,k),Ee({actor:_e(t),action:"move",boardId:c,itemId:x,payload:{from:v.from,to:v.to}}),h(e,200,{ok:!0})}catch(P){h(e,502,{error:P.message||"transition failed"})}return}if(b){let[,c,m]=b,x=m?decodeURIComponent(m):void 0,w=a.boards.find(v=>v.id===c);if(!w){h(e,404,{error:`unknown board: ${c}`});return}let g=a.sources.get(c);if(!g){h(e,503,{error:`board "${c}" source unavailable`});return}if(r==="GET"&&!x){let{columns:v,totals:k}=await Cn(w,g,n.searchParams);h(e,200,{columns:v,totals:k});return}if(r==="GET"&&x){try{let v=typeof g.getItem=="function"?await g.getItem(x):null;if(!v){h(e,404,{error:"not found"});return}h(e,200,v)}catch(v){h(e,502,{error:v.message})}return}if(r==="PATCH"&&x){let v=await W(t);try{let k=typeof g.updateItem=="function"?await g.updateItem(x,v):null;if(!k){h(e,501,{error:"update unsupported"});return}Ee({actor:_e(t),action:"update",boardId:c,itemId:x,payload:v}),h(e,200,k)}catch(k){h(e,502,{error:k.message})}return}if(r==="POST"&&!x){let v=await W(t);if(!v.title){h(e,400,{error:"title required"});return}if(!g.capabilities.create||!g.create){h(e,400,{error:`source ${g.type} does not support create`});return}try{let k=await g.create({title:v.title,description:v.description,labels:v.labels,assigneeUsernames:v.assigneeUsernames,milestoneTitle:v.milestoneTitle,projectHint:v.projectHint});Ee({actor:_e(t),action:"create",boardId:c,itemId:k.id,payload:{title:v.title}}),h(e,201,k)}catch(k){h(e,502,{error:k.message})}return}}h(e,404,{error:"not found",path:o})}async function Cn(t,e,a){if(!e.capabilities.listAll||!e.listAll){let g={};for(let v of t.columns)g[v.id]=[];return{columns:g,totals:Object.fromEntries(t.columns.map(v=>[v.id,0]))}}let n=[];t.primaryToolLabel&&n.push(t.primaryToolLabel);let o=a.get("label")||void 0;o&&n.push(o);let r=a.get("q")||void 0,s=a.get("milestone")||void 0,i=a.get("assignee")||void 0,l=parseInt(a.get("days")||String(t.timeRangeDays),10),d=parseInt(a.get("closedDays")||String(t.closedWindowDays??30),10),u=t.columns.some(g=>g.kind!=="closed"),p=t.columns.some(g=>g.kind==="closed"),f=u?await e.listAll({sinceDays:l,labels:n.length?n:void 0,search:r,milestone:s,state:"opened"}):[],b=p?await e.listAll({sinceDays:d,labels:n.length?n:void 0,search:r,milestone:s,state:"closed"}):[],c={};for(let g of t.columns)c[g.id]=[];let m=t.columns.find(g=>g.kind==="closed");for(let g of b)m&&c[m.id].push({...g,stage:m.id});let x=t.columns.filter(g=>g.kind!=="closed");for(let g of f){let v=Le(g,x);if(!v)continue;let k=c[v];k&&k.push({...g,stage:v})}if(i)for(let g of Object.keys(c))c[g]=c[g].filter(v=>v.assignee===i);for(let g of Object.keys(c))c[g].sort((v,k)=>{let O=(v.priority??99)-(k.priority??99);return O!==0?O:(k.updatedAt||"").localeCompare(v.updatedAt||"")});let w=Object.fromEntries(Object.entries(c).map(([g,v])=>[g,v.length]));return{columns:c,totals:w}}async function An(t,e,a,n){let o=Pe(a,n),r=t;o.closeIssue&&typeof r.setState=="function"?await r.setState(e,"close"):o.reopen&&typeof r.setState=="function"&&await r.setState(e,"reopen"),(o.addLabels?.length||o.removeLabels?.length)&&typeof r.transitionMany=="function"?await r.transitionMany(e,o.addLabels||[],o.removeLabels||[]):o.addLabels?.length&&t.transition&&await t.transition(e,o.addLabels[0],o.removeLabels?.[0])}function $n(t,e){if(t.source.type==="gitlab"){let a=e.channels.gitlab;if(!a?.token)throw new Error("channels.gitlab.token is required for gitlab boards");let n={};for(let o of a.agentMappings)o.gitlabUsernames.length&&(n[o.agentId]=o.gitlabUsernames);return new Ne(a.host,a.token,t.source.projects,n,(...o)=>console.log("[board]",...o))}throw new Error(`unsupported board source: ${t.source.type}`)}function Ee(t){try{let e=re(process.cwd(),".agentx");wn(e)||kn(e,{recursive:!0});let a=JSON.stringify({ts:new Date().toISOString(),...t})+`
7243
+ `;yn(re(e,"board-audit.jsonl"),a)}catch{}}function _e(t){let e=t.headers["x-forwarded-for"];return(Array.isArray(e)?e[0]:e?.split(",")[0])||t.socket.remoteAddress||"unknown"}async function Mn(t,e,a){let n={};e&&(n.Authorization=`Bearer ${e}`);let o={id:t,name:t,url:t,reachable:!1,agents:[]};try{let[r,s,i]=await Promise.all([fetch(t+"/health",{headers:n,signal:a}).catch(()=>null),fetch(t+"/agents",{headers:n,signal:a}).catch(()=>null),fetch(t+"/mesh",{headers:n,signal:a}).catch(()=>null)]);if(!s||!s.ok)return o.error=s?`HTTP ${s.status}`:"unreachable",o;let l=await s.json();if(o.agents=l.map(d=>({id:d.id,name:d.name,tier:d.tier,model:d.model,active:d.active||0,total:d.total||0,errors:d.errors||0,lastActive:d.lastActive,lastSummary:d.lastSummary,hourlyTasks:Array.isArray(d.hourlyTasks)?d.hourlyTasks:void 0,runningTasks:Array.isArray(d.runningTasks)?d.runningTasks:[]})),r&&r.ok){let d=await r.json();o.uptimeSec=d.uptime,o.name=d.node?.name||d.node?.id||t,o.id=d.node?.id||t,d.usage&&(o.usage=d.usage)}o.reachable=!0,o._peers=Array.isArray(i&&await In(i))?o._peers:void 0}catch(r){o.error=r.message||String(r)}return o}var Te=new WeakMap;async function In(t){if(Te.has(t))return Te.get(t);try{let e=t.ok?await t.json():null;return Te.set(t,e),e}catch{return null}}async function Ce(t,e,a){try{let n={};e&&(n.Authorization=`Bearer ${e}`);let o=await fetch(t+"/mesh",{headers:n,signal:a});return o.ok?(await o.json()).filter(s=>s&&s.peerUrl).map(s=>({url:String(s.peerUrl).replace(/\/+$/,""),name:s.peer||s.peerUrl})):[]}catch{return[]}}async function At(t){let e=t.dashboard,a=e.daemonUrl.replace(/\/+$/,""),n=e.token,o=new Map;o.set(a,{name:"primary",url:a,token:n});for(let i of e.daemons){let l=i.url.replace(/\/+$/,"");o.has(l)||o.set(l,{name:i.name,url:l,token:i.token})}let r=new AbortController,s=setTimeout(()=>r.abort(),3e3);try{let i=await Ce(a,n,r.signal);for(let d of i)o.has(d.url)||o.set(d.url,d);let l=await Promise.all([...o.values()].map(d=>Mn(d.url,d.token,r.signal)));return{ts:new Date().toISOString(),nodes:l}}finally{clearTimeout(s)}}function Ln(t,e,a){e.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"});let n=!1,o=(i,l)=>{n||e.write(`event: ${i}
7244
7244
  data: ${JSON.stringify(l)}
7245
7245
 
7246
- `)},r=async()=>{try{let i=await Mt(a);o("snapshot",i)}catch(i){o("error",{message:i.message})}};r();let s=setInterval(r,2e3);t.on("close",()=>{n=!0,clearInterval(s),e.end()})}async function On(t,e,a,n,o,r){let s=n.replace(/\/+$/,""),i=new Set;i.add(a.config.dashboard.daemonUrl.replace(/\/+$/,""));for(let c of a.config.dashboard.daemons)i.add(c.url.replace(/\/+$/,""));try{let c=await Ae(a.config.dashboard.daemonUrl.replace(/\/+$/,""),a.config.dashboard.token);for(let m of c)i.add(m.url.replace(/\/+$/,""))}catch{}if(!i.has(s)){h(e,403,{error:"node not in dashboard allowlist",target:s});return}let l=s===a.config.dashboard.daemonUrl.replace(/\/+$/,"")?a.config.dashboard.token:a.config.dashboard.daemons.find(c=>c.url.replace(/\/+$/,"")===s)?.token,d={Accept:"text/event-stream"};l&&(d.Authorization=`Bearer ${l}`);let u=new AbortController,p;try{p=await fetch(`${s}/agents/${encodeURIComponent(o)}/tasks/${encodeURIComponent(r)}/stream`,{headers:d,signal:u.signal})}catch(c){h(e,502,{error:c.message||"upstream connect failed"});return}if(!p.ok||!p.body){h(e,p.status||502,{error:`upstream HTTP ${p.status}`});return}e.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","Access-Control-Allow-Origin":"*","X-Accel-Buffering":"no"});let f=p.body.getReader();(async()=>{try{for(;;){let{value:c,done:m}=await f.read();if(m)break;c&&e.write(c)}}catch{}finally{try{e.end()}catch{}}})(),t.on("close",()=>{u.abort();try{e.end()}catch{}})}function Rn(t,e,a){let n=de(t);if(!n)return h(e,401,{error:"missing token",hint:"pass Authorization: Bearer <token> (agentx token create)"}),null;let o=new D().verify(n);if(!o)return h(e,401,{error:"invalid or revoked token"}),null;for(let r of a)if(!K(o,r))return h(e,403,{error:`token missing scope: ${r}`,scopes:o.scopes}),null;return o}async function Nn(t,e,a,n){let o=a.agents?.[n];if(!o){h(e,404,{error:"unknown agent"});return}if(o.access!=="public"){h(e,403,{error:"agent is private",hint:`set agents.${n}.access = "public" to expose it`});return}let r;try{r=await W(t)}catch{h(e,400,{error:"invalid JSON body"});return}let s=r?.message;if(!s||typeof s!="string"){h(e,400,{error:"required: { message: string, context?: {...} }"});return}let i=a.dashboard.daemonUrl.replace(/\/+$/,""),l={"Content-Type":"application/json"};a.dashboard.token&&(l.Authorization=`Bearer ${a.dashboard.token}`);try{let d=await fetch(`${i}/task`,{method:"POST",headers:l,body:JSON.stringify({agent:n,message:s,context:{channel:"public-api",sender:r.context?.sender||"api",...r.context||{}}})}),u=await d.text();e.writeHead(d.status,{"Content-Type":d.headers.get("content-type")||"application/json; charset=utf-8","Access-Control-Allow-Origin":"*"}),e.end(u)}catch(d){h(e,502,{error:d.message||"upstream call failed"})}}async function Bn(t,e,a,n,o,r){let s=a.replace(/\/+$/,""),i=new Set;i.add(e.config.dashboard.daemonUrl.replace(/\/+$/,""));for(let p of e.config.dashboard.daemons)i.add(p.url.replace(/\/+$/,""));try{let p=await Ae(e.config.dashboard.daemonUrl.replace(/\/+$/,""),e.config.dashboard.token);for(let f of p)i.add(f.url.replace(/\/+$/,""))}catch{}if(!i.has(s)){h(t,403,{error:"node not in dashboard allowlist",target:s});return}let l=s===e.config.dashboard.daemonUrl.replace(/\/+$/,"")?e.config.dashboard.token:e.config.dashboard.daemons.find(p=>p.url.replace(/\/+$/,"")===s)?.token,d={Accept:"application/json"};l&&(d.Authorization=`Bearer ${l}`);let u=o?`/agents/${encodeURIComponent(n)}/tasks/${encodeURIComponent(o)}`:`/agents/${encodeURIComponent(n)}/tasks?limit=${encodeURIComponent(r)}`;try{let p=await fetch(`${s}${u}`,{headers:d}),f=await p.text();t.writeHead(p.status,{"Content-Type":p.headers.get("content-type")||"application/json; charset=utf-8","Access-Control-Allow-Origin":"*"}),t.end(f)}catch(p){h(t,502,{error:p.message||"upstream fetch failed"})}}var jn=`
7246
+ `)},r=async()=>{try{let i=await At(a);o("snapshot",i)}catch(i){o("error",{message:i.message})}};r();let s=setInterval(r,2e3);t.on("close",()=>{n=!0,clearInterval(s),e.end()})}async function Pn(t,e,a,n,o,r){let s=n.replace(/\/+$/,""),i=new Set;i.add(a.config.dashboard.daemonUrl.replace(/\/+$/,""));for(let c of a.config.dashboard.daemons)i.add(c.url.replace(/\/+$/,""));try{let c=await Ce(a.config.dashboard.daemonUrl.replace(/\/+$/,""),a.config.dashboard.token);for(let m of c)i.add(m.url.replace(/\/+$/,""))}catch{}if(!i.has(s)){h(e,403,{error:"node not in dashboard allowlist",target:s});return}let l=s===a.config.dashboard.daemonUrl.replace(/\/+$/,"")?a.config.dashboard.token:a.config.dashboard.daemons.find(c=>c.url.replace(/\/+$/,"")===s)?.token,d={Accept:"text/event-stream"};l&&(d.Authorization=`Bearer ${l}`);let u=new AbortController,p;try{p=await fetch(`${s}/agents/${encodeURIComponent(o)}/tasks/${encodeURIComponent(r)}/stream`,{headers:d,signal:u.signal})}catch(c){h(e,502,{error:c.message||"upstream connect failed"});return}if(!p.ok||!p.body){h(e,p.status||502,{error:`upstream HTTP ${p.status}`});return}e.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","Access-Control-Allow-Origin":"*","X-Accel-Buffering":"no"});let f=p.body.getReader();(async()=>{try{for(;;){let{value:c,done:m}=await f.read();if(m)break;c&&e.write(c)}}catch{}finally{try{e.end()}catch{}}})(),t.on("close",()=>{u.abort();try{e.end()}catch{}})}function Dn(t,e,a){let n=le(t);if(!n)return h(e,401,{error:"missing token",hint:"pass Authorization: Bearer <token> (agentx token create)"}),null;let o=new D().verify(n);if(!o)return h(e,401,{error:"invalid or revoked token"}),null;for(let r of a)if(!K(o,r))return h(e,403,{error:`token missing scope: ${r}`,scopes:o.scopes}),null;return o}async function Hn(t,e,a,n){let o=a.agents?.[n];if(!o){h(e,404,{error:"unknown agent"});return}if(o.access!=="public"){h(e,403,{error:"agent is private",hint:`set agents.${n}.access = "public" to expose it`});return}let r;try{r=await W(t)}catch{h(e,400,{error:"invalid JSON body"});return}let s=r?.message;if(!s||typeof s!="string"){h(e,400,{error:"required: { message: string, context?: {...} }"});return}let i=a.dashboard.daemonUrl.replace(/\/+$/,""),l={"Content-Type":"application/json"};a.dashboard.token&&(l.Authorization=`Bearer ${a.dashboard.token}`);try{let d=await fetch(`${i}/task`,{method:"POST",headers:l,body:JSON.stringify({agent:n,message:s,context:{channel:"public-api",sender:r.context?.sender||"api",...r.context||{}}})}),u=await d.text();e.writeHead(d.status,{"Content-Type":d.headers.get("content-type")||"application/json; charset=utf-8","Access-Control-Allow-Origin":"*"}),e.end(u)}catch(d){h(e,502,{error:d.message||"upstream call failed"})}}async function On(t,e,a,n,o,r){let s=a.replace(/\/+$/,""),i=new Set;i.add(e.config.dashboard.daemonUrl.replace(/\/+$/,""));for(let p of e.config.dashboard.daemons)i.add(p.url.replace(/\/+$/,""));try{let p=await Ce(e.config.dashboard.daemonUrl.replace(/\/+$/,""),e.config.dashboard.token);for(let f of p)i.add(f.url.replace(/\/+$/,""))}catch{}if(!i.has(s)){h(t,403,{error:"node not in dashboard allowlist",target:s});return}let l=s===e.config.dashboard.daemonUrl.replace(/\/+$/,"")?e.config.dashboard.token:e.config.dashboard.daemons.find(p=>p.url.replace(/\/+$/,"")===s)?.token,d={Accept:"application/json"};l&&(d.Authorization=`Bearer ${l}`);let u=o?`/agents/${encodeURIComponent(n)}/tasks/${encodeURIComponent(o)}`:`/agents/${encodeURIComponent(n)}/tasks?limit=${encodeURIComponent(r)}`;try{let p=await fetch(`${s}${u}`,{headers:d}),f=await p.text();t.writeHead(p.status,{"Content-Type":p.headers.get("content-type")||"application/json; charset=utf-8","Access-Control-Allow-Origin":"*"}),t.end(f)}catch(p){h(t,502,{error:p.message||"upstream fetch failed"})}}var Rn=`
7247
7247
  You are helping draft a new GitLab issue. Follow these conventions strictly.
7248
7248
 
7249
7249
  Title pattern:
@@ -7275,8 +7275,8 @@ Return ONLY a single JSON object on one line \u2014 no prose, no code fences, no
7275
7275
  Shape:
7276
7276
  { "title": string, "description": string, "labels": string[], "assigneeUsername": string | null, "kind": string }
7277
7277
  If you don't have enough information to pick a label confidently, omit it rather than guessing.
7278
- `;async function zn(t,e){let a=(e?.rough||"").toString().trim();if(!a)throw new Error("rough description required");let n=e?.agent||t.dashboard.draftAgent;if(!n)throw new Error("no draft agent configured (set dashboard.draftAgent or pass agent in body)");let o=e?.context||{},r=["Rough description from the user:",'"""',a,'"""',"",`Board: ${o.boardName||"(unspecified)"}`,o.primaryLabel?`Primary board label (include in labels): ${o.primaryLabel}`:"",o.columnLabel?`Target column label (include in labels): ${o.columnLabel}`:"",o.project?`GitLab project: ${o.project}`:"",o.knownLabels?.length?`Known labels in this project (prefer picking from these when they fit):
7278
+ `;async function Nn(t,e){let a=(e?.rough||"").toString().trim();if(!a)throw new Error("rough description required");let n=e?.agent||t.dashboard.draftAgent;if(!n)throw new Error("no draft agent configured (set dashboard.draftAgent or pass agent in body)");let o=e?.context||{},r=["Rough description from the user:",'"""',a,'"""',"",`Board: ${o.boardName||"(unspecified)"}`,o.primaryLabel?`Primary board label (include in labels): ${o.primaryLabel}`:"",o.columnLabel?`Target column label (include in labels): ${o.columnLabel}`:"",o.project?`GitLab project: ${o.project}`:"",o.knownLabels?.length?`Known labels in this project (prefer picking from these when they fit):
7279
7279
  - ${o.knownLabels.slice(0,60).join(`
7280
7280
  - `)}`:"",o.members?.length?`Possible assignees (GitLab usernames): ${o.members.slice(0,20).join(", ")}`:"","","Produce the JSON draft now."].filter(Boolean).join(`
7281
- `),s=t.dashboard.daemonUrl.replace(/\/+$/,"")+"/task",i={"Content-Type":"application/json"};t.dashboard.token&&(i.Authorization=`Bearer ${t.dashboard.token}`);let l=await fetch(s,{method:"POST",headers:i,body:JSON.stringify({agent:n,message:r,context:{channel:"a2a",sender:"board-dashboard",systemPrompt:jn}})});if(!l.ok)throw new Error(`daemon /task HTTP ${l.status}: ${await l.text().catch(()=>"")}`);let d=await l.json();if(d.error)throw new Error(String(d.error));let u=(d.content||"").toString(),p=qn(u);if(!p||typeof p.title!="string")throw new Error("agent did not return a valid JSON draft. Raw: "+u.slice(0,400));let f=Array.isArray(p.labels)?p.labels.filter(b=>typeof b=="string"):[];return o.primaryLabel&&!f.includes(o.primaryLabel)&&f.unshift(o.primaryLabel),o.columnLabel&&!f.includes(o.columnLabel)&&f.unshift(o.columnLabel),{title:p.title.trim(),description:(p.description||"").toString(),labels:f,assigneeUsername:typeof p.assigneeUsername=="string"?p.assigneeUsername:void 0,kind:typeof p.kind=="string"?p.kind:void 0,raw:u}}function qn(t){if(!t)return null;try{return JSON.parse(t)}catch{}let e=t.match(/```(?:json)?\s*([\s\S]*?)```/);if(e)try{return JSON.parse(e[1])}catch{}let a=t.indexOf("{");if(a===-1)return null;let n=0;for(let o=a;o<t.length;o++){let r=t[o];if(r==="{")n++;else if(r==="}"&&(n--,n===0))try{return JSON.parse(t.slice(a,o+1))}catch{return null}}return null}function Gn(t){let e=An(Cn(import.meta.url));return se(e,t)}async function Fn(t){return Tn(t)}function h(t,e,a){t.writeHead(e,{"Content-Type":"application/json; charset=utf-8"}),t.end(JSON.stringify(a))}async function W(t){return new Promise((e,a)=>{let n=[];t.on("data",o=>n.push(o)),t.on("end",()=>{try{let o=Buffer.concat(n).toString("utf-8");e(o?JSON.parse(o):{})}catch(o){a(o)}}),t.on("error",a)})}function It(t){return t.dashboardUrl?t.dashboardUrl.replace(/\/+$/,""):t.url.replace(/\/+$/,"").replace(/:(?:1[89][89]00|18810)$/,":4202")}function B(t,e){let a=e||t,n={id:"primary",name:a.node?.name||"this daemon",dashboardUrl:"",primary:!0},o=(a.dashboard?.daemons||[]).map(r=>({id:r.url.replace(/\/+$/,""),name:r.name,dashboardUrl:It(r),tokenScope:r.dashboardToken||r.token?"proxy-ready":void 0}));return[n,...o]}async function Un(t,e,a,n){let o=a.url+n,r=(t.method||"GET").toUpperCase(),i=r!=="GET"&&r!=="HEAD"?await new Promise((p,f)=>{let b=[];t.on("data",c=>b.push(c)),t.on("end",()=>p(Buffer.concat(b))),t.on("error",f)}):void 0,l={},d=t.headers["content-type"];d&&(l["Content-Type"]=Array.isArray(d)?d[0]:d);let u=t.headers["x-requested-with"];u&&(l["X-Requested-With"]=Array.isArray(u)?u[0]:u),a.token&&(l.Authorization=`Bearer ${a.token}`),l["X-Agentx-Peer"]="primary";try{let p=await fetch(o,{method:r,headers:l,body:i&&i.length>0?i:void 0}),f=Buffer.from(await p.arrayBuffer());e.writeHead(p.status,{"Content-Type":p.headers.get("content-type")||"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"}),e.end(f)}catch(p){h(e,502,{error:`proxy to peer failed: ${p?.message||p}`,target:o})}}function Wn(t,e){let a=t.replace(/\/+$/,""),n=(e.dashboard?.daemons||[]).find(o=>o.url.replace(/\/+$/,"")===a);return n?{url:It(n),token:n.dashboardToken||n.token}:null}export{ur as startBoardDashboard};
7282
- //# sourceMappingURL=board-dashboard-CXIVJKDP.js.map
7281
+ `),s=t.dashboard.daemonUrl.replace(/\/+$/,"")+"/task",i={"Content-Type":"application/json"};t.dashboard.token&&(i.Authorization=`Bearer ${t.dashboard.token}`);let l=await fetch(s,{method:"POST",headers:i,body:JSON.stringify({agent:n,message:r,context:{channel:"a2a",sender:"board-dashboard",systemPrompt:Rn}})});if(!l.ok)throw new Error(`daemon /task HTTP ${l.status}: ${await l.text().catch(()=>"")}`);let d=await l.json();if(d.error)throw new Error(String(d.error));let u=(d.content||"").toString(),p=Bn(u);if(!p||typeof p.title!="string")throw new Error("agent did not return a valid JSON draft. Raw: "+u.slice(0,400));let f=Array.isArray(p.labels)?p.labels.filter(b=>typeof b=="string"):[];return o.primaryLabel&&!f.includes(o.primaryLabel)&&f.unshift(o.primaryLabel),o.columnLabel&&!f.includes(o.columnLabel)&&f.unshift(o.columnLabel),{title:p.title.trim(),description:(p.description||"").toString(),labels:f,assigneeUsername:typeof p.assigneeUsername=="string"?p.assigneeUsername:void 0,kind:typeof p.kind=="string"?p.kind:void 0,raw:u}}function Bn(t){if(!t)return null;try{return JSON.parse(t)}catch{}let e=t.match(/```(?:json)?\s*([\s\S]*?)```/);if(e)try{return JSON.parse(e[1])}catch{}let a=t.indexOf("{");if(a===-1)return null;let n=0;for(let o=a;o<t.length;o++){let r=t[o];if(r==="{")n++;else if(r==="}"&&(n--,n===0))try{return JSON.parse(t.slice(a,o+1))}catch{return null}}return null}function jn(t){let e=_n(En(import.meta.url));return re(e,t)}async function zn(t){return Sn(t)}function h(t,e,a){t.writeHead(e,{"Content-Type":"application/json; charset=utf-8"}),t.end(JSON.stringify(a))}async function W(t){return new Promise((e,a)=>{let n=[];t.on("data",o=>n.push(o)),t.on("end",()=>{try{let o=Buffer.concat(n).toString("utf-8");e(o?JSON.parse(o):{})}catch(o){a(o)}}),t.on("error",a)})}function $t(t){return t.dashboardUrl?t.dashboardUrl.replace(/\/+$/,""):t.url.replace(/\/+$/,"").replace(/:(?:1[89][89]00|18810)$/,":4202")}function B(t,e){let a=e||t,n={id:"primary",name:a.node?.name||"this daemon",dashboardUrl:"",primary:!0},o=(a.dashboard?.daemons||[]).map(r=>({id:r.url.replace(/\/+$/,""),name:r.name,dashboardUrl:$t(r),tokenScope:r.dashboardToken||r.token?"proxy-ready":void 0}));return[n,...o]}async function qn(t,e,a,n){let o=a.url+n,r=(t.method||"GET").toUpperCase(),i=r!=="GET"&&r!=="HEAD"?await new Promise((p,f)=>{let b=[];t.on("data",c=>b.push(c)),t.on("end",()=>p(Buffer.concat(b))),t.on("error",f)}):void 0,l={},d=t.headers["content-type"];d&&(l["Content-Type"]=Array.isArray(d)?d[0]:d);let u=t.headers["x-requested-with"];u&&(l["X-Requested-With"]=Array.isArray(u)?u[0]:u),a.token&&(l.Authorization=`Bearer ${a.token}`),l["X-Agentx-Peer"]="primary";try{let p=await fetch(o,{method:r,headers:l,body:i&&i.length>0?i:void 0}),f=Buffer.from(await p.arrayBuffer());e.writeHead(p.status,{"Content-Type":p.headers.get("content-type")||"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"}),e.end(f)}catch(p){h(e,502,{error:`proxy to peer failed: ${p?.message||p}`,target:o})}}function Gn(t,e){let a=t.replace(/\/+$/,""),n=(e.dashboard?.daemons||[]).find(o=>o.url.replace(/\/+$/,"")===a);return n?{url:$t(n),token:n.dashboardToken||n.token}:null}export{dr as startBoardDashboard};
7282
+ //# sourceMappingURL=board-dashboard-KX2CNOSY.js.map