superacli 1.1.21 → 1.1.23

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 (375) hide show
  1. package/.beads/.br_history/{issues.20260426_162712_190824905.jsonl → issues.20260427_104606_658098709.jsonl} +49 -48
  2. package/.beads/.br_history/{issues.20260426_162513_726336785.jsonl → issues.20260427_104607_085798670.jsonl} +50 -48
  3. package/.beads/.br_history/{issues.20260426_162331_516939737.jsonl → issues.20260427_104607_627598880.jsonl} +51 -48
  4. package/.beads/.br_history/{issues.20260426_134150_938793400.jsonl → issues.20260427_104608_071298223.jsonl} +52 -48
  5. package/.beads/.br_history/issues.20260427_104615_198124329.jsonl +261 -0
  6. package/.beads/.br_history/issues.20260427_104615_669652069.jsonl +261 -0
  7. package/.beads/.br_history/issues.20260427_104637_752744777.jsonl +261 -0
  8. package/.beads/.br_history/issues.20260427_104638_209211116.jsonl +261 -0
  9. package/.beads/.br_history/issues.20260427_104638_898729442.jsonl +261 -0
  10. package/.beads/.br_history/issues.20260427_104639_368827997.jsonl +261 -0
  11. package/.beads/.br_history/issues.20260427_104639_823343822.jsonl +261 -0
  12. package/.beads/.br_history/issues.20260427_104640_354170001.jsonl +261 -0
  13. package/.beads/.br_history/issues.20260427_104640_937129660.jsonl +261 -0
  14. package/.beads/.br_history/issues.20260427_104647_408876191.jsonl +261 -0
  15. package/.beads/.br_history/issues.20260427_104659_300660476.jsonl +261 -0
  16. package/.beads/.br_history/issues.20260427_104800_415120762.jsonl +261 -0
  17. package/.beads/.br_history/issues.20260427_104901_529669396.jsonl +261 -0
  18. package/.beads/.br_history/issues.20260427_105002_587183822.jsonl +261 -0
  19. package/.beads/.br_history/issues.20260427_105103_686748531.jsonl +261 -0
  20. package/.beads/.br_history/issues.20260427_105204_721591044.jsonl +261 -0
  21. package/.beads/.br_history/issues.20260427_105305_855661211.jsonl +261 -0
  22. package/.beads/.br_history/issues.20260427_105407_641630152.jsonl +261 -0
  23. package/.beads/.br_history/issues.20260427_105509_159649245.jsonl +261 -0
  24. package/.beads/.br_history/issues.20260427_105610_283950586.jsonl +261 -0
  25. package/.beads/.br_history/issues.20260427_105637_656057143.jsonl +261 -0
  26. package/.beads/.br_history/issues.20260427_105738_863187883.jsonl +261 -0
  27. package/.beads/.br_history/issues.20260427_105839_958463404.jsonl +261 -0
  28. package/.beads/.br_history/issues.20260427_105941_092827317.jsonl +261 -0
  29. package/.beads/.br_history/issues.20260427_110042_110436110.jsonl +261 -0
  30. package/.beads/.br_history/issues.20260427_110143_343801118.jsonl +261 -0
  31. package/.beads/.br_history/issues.20260427_110244_379134729.jsonl +261 -0
  32. package/.beads/.br_history/issues.20260427_110345_445658284.jsonl +261 -0
  33. package/.beads/.br_history/issues.20260427_110446_689391882.jsonl +261 -0
  34. package/.beads/.br_history/issues.20260427_110547_667705716.jsonl +261 -0
  35. package/.beads/.br_history/issues.20260427_110609_987816377.jsonl +261 -0
  36. package/.beads/.br_history/issues.20260427_110711_086550915.jsonl +261 -0
  37. package/.beads/.br_history/issues.20260427_110812_204821395.jsonl +261 -0
  38. package/.beads/.br_history/issues.20260427_110913_259688311.jsonl +261 -0
  39. package/.beads/.br_history/issues.20260427_111014_297775509.jsonl +261 -0
  40. package/.beads/.br_history/issues.20260427_111115_195150935.jsonl +261 -0
  41. package/.beads/.br_history/issues.20260427_111216_316259530.jsonl +261 -0
  42. package/.beads/.br_history/issues.20260427_111317_298020330.jsonl +261 -0
  43. package/.beads/.br_history/issues.20260427_111418_604431267.jsonl +261 -0
  44. package/.beads/.br_history/issues.20260427_111519_617870969.jsonl +261 -0
  45. package/.beads/.br_history/issues.20260427_111533_024097015.jsonl +261 -0
  46. package/.beads/.br_history/issues.20260427_111634_138814655.jsonl +261 -0
  47. package/.beads/.br_history/issues.20260427_111737_148398766.jsonl +261 -0
  48. package/.beads/.br_history/issues.20260427_111838_507704112.jsonl +261 -0
  49. package/.beads/.br_history/issues.20260427_111939_468325527.jsonl +261 -0
  50. package/.beads/.br_history/issues.20260427_112041_044923744.jsonl +261 -0
  51. package/.beads/.br_history/issues.20260427_112142_224127430.jsonl +261 -0
  52. package/.beads/.br_history/issues.20260427_112243_212317525.jsonl +261 -0
  53. package/.beads/.br_history/issues.20260427_112344_182300930.jsonl +261 -0
  54. package/.beads/.br_history/issues.20260427_112445_197922899.jsonl +261 -0
  55. package/.beads/.br_history/issues.20260427_112502_597304488.jsonl +261 -0
  56. package/.beads/.br_history/issues.20260427_112604_292832651.jsonl +261 -0
  57. package/.beads/.br_history/issues.20260427_112706_051581607.jsonl +261 -0
  58. package/.beads/.br_history/issues.20260427_112807_066213762.jsonl +261 -0
  59. package/.beads/.br_history/issues.20260427_112908_145315373.jsonl +261 -0
  60. package/.beads/.br_history/issues.20260427_113009_141079023.jsonl +261 -0
  61. package/.beads/.br_history/issues.20260427_113110_601071412.jsonl +261 -0
  62. package/.beads/.br_history/issues.20260427_113211_601412739.jsonl +261 -0
  63. package/.beads/.br_history/issues.20260427_113312_771171767.jsonl +261 -0
  64. package/.beads/.br_history/issues.20260427_113413_719165420.jsonl +261 -0
  65. package/.beads/.br_history/issues.20260427_113430_416576564.jsonl +261 -0
  66. package/.beads/.br_history/issues.20260427_113531_553842703.jsonl +261 -0
  67. package/.beads/.br_history/issues.20260427_113633_137526241.jsonl +261 -0
  68. package/.beads/.br_history/issues.20260427_113735_697152101.jsonl +261 -0
  69. package/.beads/.br_history/issues.20260427_113836_810884202.jsonl +261 -0
  70. package/.beads/.br_history/issues.20260427_113938_312284719.jsonl +261 -0
  71. package/.beads/.br_history/issues.20260427_114039_390178502.jsonl +261 -0
  72. package/.beads/.br_history/issues.20260427_114140_483586632.jsonl +261 -0
  73. package/.beads/.br_history/issues.20260427_114241_502376670.jsonl +261 -0
  74. package/.beads/.br_history/issues.20260427_114342_927243830.jsonl +261 -0
  75. package/.beads/.br_history/issues.20260427_114405_996651227.jsonl +261 -0
  76. package/.beads/.br_history/issues.20260427_114507_946708398.jsonl +261 -0
  77. package/.beads/.br_history/issues.20260427_114608_914493506.jsonl +261 -0
  78. package/.beads/.br_history/issues.20260427_114709_935565841.jsonl +261 -0
  79. package/.beads/.br_history/issues.20260427_114810_981588378.jsonl +261 -0
  80. package/.beads/.br_history/issues.20260427_114912_061702372.jsonl +261 -0
  81. package/.beads/.br_history/issues.20260427_115013_063113906.jsonl +261 -0
  82. package/.beads/.br_history/issues.20260427_115114_208497343.jsonl +261 -0
  83. package/.beads/.br_history/issues.20260427_115215_176080241.jsonl +261 -0
  84. package/.beads/.br_history/issues.20260427_115316_481573328.jsonl +261 -0
  85. package/.beads/.br_history/issues.20260427_115335_866978652.jsonl +261 -0
  86. package/.beads/.br_history/issues.20260427_115436_866087391.jsonl +261 -0
  87. package/.beads/.br_history/issues.20260427_115538_016094860.jsonl +261 -0
  88. package/.beads/.br_history/issues.20260427_115638_932947449.jsonl +261 -0
  89. package/.beads/.br_history/issues.20260427_115739_982932603.jsonl +261 -0
  90. package/.beads/.br_history/issues.20260427_115840_963681039.jsonl +261 -0
  91. package/.beads/.br_history/issues.20260427_115941_912431509.jsonl +261 -0
  92. package/.beads/.br_history/issues.20260427_120043_043356448.jsonl +261 -0
  93. package/.beads/.br_history/issues.20260427_120144_955596968.jsonl +261 -0
  94. package/.beads/.br_history/issues.20260427_120246_060733977.jsonl +261 -0
  95. package/.beads/.br_history/issues.20260427_120307_717985017.jsonl +261 -0
  96. package/.beads/.br_history/issues.20260427_120408_871846736.jsonl +261 -0
  97. package/.beads/.br_history/issues.20260427_121003_963750732.jsonl +261 -0
  98. package/.beads/.br_history/issues.20260427_121006_018509431.jsonl +261 -0
  99. package/.beads/.br_history/issues.20260427_121019_617062931.jsonl +261 -0
  100. package/.beads/.br_history/issues.20260427_121021_689536311.jsonl +261 -0
  101. package/.beads/.br_recovery/beads.db-wal.20260427_104615_902749843.rebuild-failed +0 -0
  102. package/.beads/.br_recovery/beads.db-wal.20260427_121006_010373120.rebuild-failed +0 -0
  103. package/.beads/.br_recovery/beads.db.20260427_104615_902749843.rebuild-failed +0 -0
  104. package/.beads/.br_recovery/beads.db.20260427_121006_010373120.rebuild-failed +0 -0
  105. package/.beads/beads.db.corrupted +0 -0
  106. package/.beads/issues.jsonl +144 -144
  107. package/.supercli/adapters/test-cli-adapter.js +19 -0
  108. package/cli/adapters/mcp.js +89 -3
  109. package/cli/adapters/openapi.js +71 -2
  110. package/cli/config.js +69 -1
  111. package/cli/daemon.js +349 -0
  112. package/cli/plugins-manager.js +42 -9
  113. package/cli/server-command.js +174 -4
  114. package/cli/supercli.js +35 -15
  115. package/docs/changelog-2026-04.html +6 -0
  116. package/docs/index.html +94 -11
  117. package/docs/plugins.html +30 -0
  118. package/docs/server.md +80 -0
  119. package/graphify-out/GRAPH_REPORT.md +154 -162
  120. package/graphify-out/cache/11938479cfbdb8e52bf5f0f3c132d56204245ebb19aefe89bb0394feb36dbd5e.json +1 -0
  121. package/graphify-out/cache/141362b25039dee7a4959ef475befea0a25671aae66f3d14917e711e597ffbf6.json +1 -0
  122. package/graphify-out/cache/2f23b1be3f6434f60138a04261d83ca71b128f405bd68fb19abf48cd61108dfc.json +1 -0
  123. package/graphify-out/cache/362adb1b6b483f56d09feaf652f4122366e568aaede752f48383b76d61f5d9d6.json +1 -0
  124. package/graphify-out/cache/42bc8f64d69d2cd9ecf64e92e38f89f7ea479f69c947de5984919e2fd5a716ee.json +1 -0
  125. package/graphify-out/cache/4b5cffce31d9193b7d0a8f15e8a41c66f6733a6490ebaeff2c8ca19701c72c0e.json +1 -0
  126. package/graphify-out/cache/5ef4e31750d9e7bc4ff4a7b535f247d9ab5ab9627d72e20794779ec4be424c66.json +1 -0
  127. package/graphify-out/cache/6d5023ecffa52382d31152c8c06e86e286789228a3d4f7fde72087f3eafa11bc.json +1 -0
  128. package/graphify-out/cache/6e5776e123142a78f50fa0bfd5ae2d289282051a9b392ae507de7aa9017f95d4.json +1 -0
  129. package/graphify-out/cache/75982dc60fa7353600ca48a3b33f5ba497eea9d5743daac6e61e9cf4f64774be.json +1 -0
  130. package/graphify-out/cache/7796066b51d3a99071debdfb5f40c854400b5bf3aa7c1e83dd6ae88eddca0370.json +1 -0
  131. package/graphify-out/cache/8ccd3b557a1ea98005fba84433f160ccd4a951fbdb6a4c9b7d7ba894f905b06b.json +1 -0
  132. package/graphify-out/cache/90ab53b8f1f3306e7c3a1f92ec628717ea90f4e684db764f7d7aa8e884fe2cae.json +1 -0
  133. package/graphify-out/cache/99c8133d0ccf5bf29a0a03caa6811d2ff8d73bcccf20681687876c890b94740e.json +1 -0
  134. package/graphify-out/cache/9fa6604cc820f3857c55c753ca0024788e4cbb61c4e12ba7ce0e4a1ce4ee0655.json +1 -0
  135. package/graphify-out/cache/a1e24a07beede2876e688cdb6c14e2d24abb22064862a6420cac321efabd3efd.json +1 -0
  136. package/graphify-out/cache/a418312f2805259c33007a18b36b6ae3b6a4da376ccae6006a3b9999262495db.json +1 -0
  137. package/graphify-out/cache/a6d9c029bd31a99b67357291305e27b01c5ef388925f7f2a6e985fec4efa8024.json +1 -0
  138. package/graphify-out/cache/a6ed52b709dd79f98adf72c483e8dfb6098203d7327470b82feb5e11390a5cf4.json +1 -0
  139. package/graphify-out/cache/b045ae4443d972ee8f47b91a0d61c984a190195b38ae1d331430b4c51c43acfd.json +1 -0
  140. package/graphify-out/cache/bc514f4074f89d2f7e7834670602e50bba0f24b8cd8c9d21ff4d361d3fd4d558.json +1 -0
  141. package/graphify-out/cache/be3fc87936f9f24d2d4f4b22b9d2a16f33f538cef1a181663120e23ecf16b81a.json +1 -0
  142. package/graphify-out/cache/c5a4822edbe3a95a56f9f943eed1567e5a5c913d59b1fa3df4ad54ffd9b02697.json +1 -0
  143. package/graphify-out/cache/cf411f1ddde50ee97c1c501f59ed7985bcdc022134574816bcce37ac20848e64.json +1 -0
  144. package/graphify-out/cache/d88625b5813742ca941ce8155cb77afb02425632002f621aca34f217440a392d.json +1 -0
  145. package/graphify-out/cache/da97fdc8af2a3306c292921110f84648bba2b0e85d27473b460b0e8a862ff225.json +1 -0
  146. package/graphify-out/cache/e88de9f1ae117f26fd217c3717eff7e525a284cc942b5f4d26ef2c4d65db59bd.json +1 -0
  147. package/graphify-out/cache/ebf6bd96ef2d8d396389ac7199e6ba818ee2d0c5dfc131fab7cdece9fb710f11.json +1 -0
  148. package/graphify-out/cache/f2a302550a6fe0649d36b8ef0b04b77673bca9f115732af8ae89751944dc9cc6.json +1 -0
  149. package/graphify-out/cache/fb46bd3ef530273918fc8915842453f21b418d536653d3b705b75b417255c246.json +1 -0
  150. package/graphify-out/cache/fcfdab94fe91af1f21fcefdba5a96674b9a16bb768288f3573fe68765163c765.json +1 -0
  151. package/graphify-out/graph.json +2669 -1121
  152. package/package.json +1 -1
  153. package/plugins/context-mode/plugin.json +10 -0
  154. package/plugins/context-mode/scripts/post-install.js +1 -1
  155. package/plugins/example-server-resources/meta.json +11 -0
  156. package/plugins/example-server-resources/plugin.json +46 -0
  157. package/server/app.js +43 -11
  158. package/server/middleware/auth.js +70 -0
  159. package/server/routes/adapters.js +3 -11
  160. package/server/routes/docs.js +10 -0
  161. package/server/routes/jobs.js +3 -2
  162. package/server/routes/mcp.js +1 -0
  163. package/server/routes/plugins.js +209 -10
  164. package/server/routes/specs.js +8 -3
  165. package/server/services/adaptersService.js +1 -0
  166. package/server/services/pluginResourceService.js +262 -0
  167. package/server/services/pluginsService.js +24 -0
  168. package/server/uploads/superbackend-openapi.json +47 -0
  169. package/server/uploads/test-auth-openapi.json +74 -0
  170. package/server/uploads/test-auth-spec.json +36 -0
  171. package/server/views/adapters.ejs +1 -0
  172. package/server/views/clients.ejs +82 -0
  173. package/server/views/docs.ejs +7 -0
  174. package/server/views/jobs.ejs +26 -2
  175. package/server/views/layout.ejs +0 -23
  176. package/server/views/mcp.ejs +278 -21
  177. package/server/views/partials/head.ejs +2 -0
  178. package/server/views/plugins.ejs +81 -1
  179. package/server/views/specs.ejs +217 -22
  180. package/.beads/.br_history/issues.20260424_173219_825545950.jsonl +0 -161
  181. package/.beads/.br_history/issues.20260424_173236_386891868.jsonl +0 -162
  182. package/.beads/.br_history/issues.20260424_174502_086707155.jsonl +0 -163
  183. package/.beads/.br_history/issues.20260424_174510_654230822.jsonl +0 -164
  184. package/.beads/.br_history/issues.20260424_174517_409774596.jsonl +0 -165
  185. package/.beads/.br_history/issues.20260424_174523_607561636.jsonl +0 -166
  186. package/.beads/.br_history/issues.20260424_174532_546016322.jsonl +0 -167
  187. package/.beads/.br_history/issues.20260424_175209_319624367.jsonl +0 -168
  188. package/.beads/.br_history/issues.20260424_175214_798999893.jsonl +0 -169
  189. package/.beads/.br_history/issues.20260424_175217_989449734.jsonl +0 -170
  190. package/.beads/.br_history/issues.20260424_175221_701416034.jsonl +0 -171
  191. package/.beads/.br_history/issues.20260424_175225_550538874.jsonl +0 -172
  192. package/.beads/.br_history/issues.20260424_180143_241956058.jsonl +0 -173
  193. package/.beads/.br_history/issues.20260424_180153_817576164.jsonl +0 -174
  194. package/.beads/.br_history/issues.20260424_180201_739387030.jsonl +0 -175
  195. package/.beads/.br_history/issues.20260424_180213_488389024.jsonl +0 -176
  196. package/.beads/.br_history/issues.20260424_180221_754279177.jsonl +0 -177
  197. package/.beads/.br_history/issues.20260424_181149_604365436.jsonl +0 -178
  198. package/.beads/.br_history/issues.20260424_181158_931468591.jsonl +0 -179
  199. package/.beads/.br_history/issues.20260424_181209_516766803.jsonl +0 -180
  200. package/.beads/.br_history/issues.20260424_181219_459169740.jsonl +0 -181
  201. package/.beads/.br_history/issues.20260424_181227_996490697.jsonl +0 -182
  202. package/.beads/.br_history/issues.20260424_181958_717811271.jsonl +0 -183
  203. package/.beads/.br_history/issues.20260424_182002_913828749.jsonl +0 -184
  204. package/.beads/.br_history/issues.20260424_182006_779786523.jsonl +0 -185
  205. package/.beads/.br_history/issues.20260424_182010_368190795.jsonl +0 -186
  206. package/.beads/.br_history/issues.20260424_182016_217217108.jsonl +0 -187
  207. package/.beads/.br_history/issues.20260424_182539_287444292.jsonl +0 -188
  208. package/.beads/.br_history/issues.20260424_182543_343189534.jsonl +0 -189
  209. package/.beads/.br_history/issues.20260424_182547_119975837.jsonl +0 -190
  210. package/.beads/.br_history/issues.20260424_182550_849315940.jsonl +0 -191
  211. package/.beads/.br_history/issues.20260424_182554_677413036.jsonl +0 -192
  212. package/.beads/.br_history/issues.20260424_183140_390494612.jsonl +0 -193
  213. package/.beads/.br_history/issues.20260424_183144_266256714.jsonl +0 -194
  214. package/.beads/.br_history/issues.20260424_183152_839579876.jsonl +0 -195
  215. package/.beads/.br_history/issues.20260424_183202_355634088.jsonl +0 -196
  216. package/.beads/.br_history/issues.20260424_183209_438616861.jsonl +0 -197
  217. package/.beads/.br_history/issues.20260424_183753_517602948.jsonl +0 -198
  218. package/.beads/.br_history/issues.20260424_183757_533544458.jsonl +0 -199
  219. package/.beads/.br_history/issues.20260424_183803_063929316.jsonl +0 -200
  220. package/.beads/.br_history/issues.20260424_183807_014724964.jsonl +0 -201
  221. package/.beads/.br_history/issues.20260424_183813_278844212.jsonl +0 -202
  222. package/.beads/.br_history/issues.20260424_190900_876564388.jsonl +0 -203
  223. package/.beads/.br_history/issues.20260424_192047_121286991.jsonl +0 -204
  224. package/.beads/.br_history/issues.20260424_192811_866934994.jsonl +0 -205
  225. package/.beads/.br_history/issues.20260424_193837_426102367.jsonl +0 -206
  226. package/.beads/.br_history/issues.20260424_194617_271952813.jsonl +0 -207
  227. package/.beads/.br_history/issues.20260424_195430_952967644.jsonl +0 -208
  228. package/.beads/.br_history/issues.20260424_200234_439280977.jsonl +0 -209
  229. package/.beads/.br_history/issues.20260424_200923_545127361.jsonl +0 -210
  230. package/.beads/.br_history/issues.20260424_204056_586059018.jsonl +0 -211
  231. package/.beads/.br_history/issues.20260424_205301_854556209.jsonl +0 -212
  232. package/.beads/.br_history/issues.20260424_210455_501610650.jsonl +0 -213
  233. package/.beads/.br_history/issues.20260424_212803_108840399.jsonl +0 -214
  234. package/.beads/.br_history/issues.20260425_045812_041336580.jsonl +0 -215
  235. package/.beads/.br_history/issues.20260425_045914_762139232.jsonl +0 -216
  236. package/.beads/.br_history/issues.20260425_050011_038094726.jsonl +0 -217
  237. package/.beads/.br_history/issues.20260425_050140_047103928.jsonl +0 -218
  238. package/.beads/.br_history/issues.20260425_054328_968771145.jsonl +0 -219
  239. package/.beads/.br_history/issues.20260425_054419_800564203.jsonl +0 -220
  240. package/.beads/.br_history/issues.20260425_054543_771812828.jsonl +0 -221
  241. package/.beads/.br_history/issues.20260425_054648_963773974.jsonl +0 -222
  242. package/.beads/.br_history/issues.20260425_054751_122349828.jsonl +0 -223
  243. package/.beads/.br_history/issues.20260425_060749_403415856.jsonl +0 -224
  244. package/.beads/.br_history/issues.20260425_062503_208821903.jsonl +0 -225
  245. package/.beads/.br_history/issues.20260425_063134_587505560.jsonl +0 -226
  246. package/.beads/.br_history/issues.20260425_064005_565019560.jsonl +0 -227
  247. package/.beads/.br_history/issues.20260425_064651_250053752.jsonl +0 -228
  248. package/.beads/.br_history/issues.20260425_065904_323410469.jsonl +0 -229
  249. package/.beads/.br_history/issues.20260425_070603_854872783.jsonl +0 -230
  250. package/.beads/.br_history/issues.20260425_071232_499550581.jsonl +0 -231
  251. package/.beads/.br_history/issues.20260425_071859_753108611.jsonl +0 -232
  252. package/.beads/.br_history/issues.20260425_171215_558114276.jsonl +0 -233
  253. package/.beads/.br_history/issues.20260425_171228_711028872.jsonl +0 -234
  254. package/.beads/.br_history/issues.20260425_171908_608455863.jsonl +0 -235
  255. package/.beads/.br_history/issues.20260425_172952_108071113.jsonl +0 -236
  256. package/.beads/.br_history/issues.20260425_200313_037876111.jsonl +0 -237
  257. package/.beads/.br_history/issues.20260425_201117_411540946.jsonl +0 -238
  258. package/.beads/.br_history/issues.20260425_210522_892936637.jsonl +0 -239
  259. package/.beads/.br_history/issues.20260425_210949_356368198.jsonl +0 -240
  260. package/.beads/.br_history/issues.20260425_211617_355720902.jsonl +0 -241
  261. package/.beads/.br_history/issues.20260425_213515_555595766.jsonl +0 -242
  262. package/.beads/.br_history/issues.20260425_214642_203845514.jsonl +0 -243
  263. package/.beads/.br_history/issues.20260425_221221_451474472.jsonl +0 -244
  264. package/.beads/.br_history/issues.20260425_222608_800503496.jsonl +0 -245
  265. package/.beads/.br_history/issues.20260426_071735_330251998.jsonl +0 -246
  266. package/.beads/.br_history/issues.20260426_071755_925764854.jsonl +0 -247
  267. package/.beads/.br_history/issues.20260426_071818_936440407.jsonl +0 -248
  268. package/.beads/.br_history/issues.20260426_071834_033200504.jsonl +0 -249
  269. package/.beads/.br_history/issues.20260426_072406_524696668.jsonl +0 -250
  270. package/.beads/.br_history/issues.20260426_073231_913315951.jsonl +0 -251
  271. package/.beads/.br_history/issues.20260426_074828_051470117.jsonl +0 -252
  272. package/.beads/.br_history/issues.20260426_080300_773872374.jsonl +0 -253
  273. package/.beads/.br_history/issues.20260426_121735_535252712.jsonl +0 -254
  274. package/.beads/.br_history/issues.20260426_125144_933153546.jsonl +0 -255
  275. package/.beads/.br_history/issues.20260426_132438_591463320.jsonl +0 -256
  276. /package/.beads/.br_history/{issues.20260424_173219_825545950.jsonl.meta.json → issues.20260427_104606_658098709.jsonl.meta.json} +0 -0
  277. /package/.beads/.br_history/{issues.20260424_173236_386891868.jsonl.meta.json → issues.20260427_104607_085798670.jsonl.meta.json} +0 -0
  278. /package/.beads/.br_history/{issues.20260424_174502_086707155.jsonl.meta.json → issues.20260427_104607_627598880.jsonl.meta.json} +0 -0
  279. /package/.beads/.br_history/{issues.20260424_174510_654230822.jsonl.meta.json → issues.20260427_104608_071298223.jsonl.meta.json} +0 -0
  280. /package/.beads/.br_history/{issues.20260424_174517_409774596.jsonl.meta.json → issues.20260427_104615_198124329.jsonl.meta.json} +0 -0
  281. /package/.beads/.br_history/{issues.20260424_174523_607561636.jsonl.meta.json → issues.20260427_104615_669652069.jsonl.meta.json} +0 -0
  282. /package/.beads/.br_history/{issues.20260424_174532_546016322.jsonl.meta.json → issues.20260427_104637_752744777.jsonl.meta.json} +0 -0
  283. /package/.beads/.br_history/{issues.20260424_175209_319624367.jsonl.meta.json → issues.20260427_104638_209211116.jsonl.meta.json} +0 -0
  284. /package/.beads/.br_history/{issues.20260424_175214_798999893.jsonl.meta.json → issues.20260427_104638_898729442.jsonl.meta.json} +0 -0
  285. /package/.beads/.br_history/{issues.20260424_175217_989449734.jsonl.meta.json → issues.20260427_104639_368827997.jsonl.meta.json} +0 -0
  286. /package/.beads/.br_history/{issues.20260424_175221_701416034.jsonl.meta.json → issues.20260427_104639_823343822.jsonl.meta.json} +0 -0
  287. /package/.beads/.br_history/{issues.20260424_175225_550538874.jsonl.meta.json → issues.20260427_104640_354170001.jsonl.meta.json} +0 -0
  288. /package/.beads/.br_history/{issues.20260424_180143_241956058.jsonl.meta.json → issues.20260427_104640_937129660.jsonl.meta.json} +0 -0
  289. /package/.beads/.br_history/{issues.20260424_180153_817576164.jsonl.meta.json → issues.20260427_104647_408876191.jsonl.meta.json} +0 -0
  290. /package/.beads/.br_history/{issues.20260424_180201_739387030.jsonl.meta.json → issues.20260427_104659_300660476.jsonl.meta.json} +0 -0
  291. /package/.beads/.br_history/{issues.20260424_180213_488389024.jsonl.meta.json → issues.20260427_104800_415120762.jsonl.meta.json} +0 -0
  292. /package/.beads/.br_history/{issues.20260424_180221_754279177.jsonl.meta.json → issues.20260427_104901_529669396.jsonl.meta.json} +0 -0
  293. /package/.beads/.br_history/{issues.20260424_181149_604365436.jsonl.meta.json → issues.20260427_105002_587183822.jsonl.meta.json} +0 -0
  294. /package/.beads/.br_history/{issues.20260424_181158_931468591.jsonl.meta.json → issues.20260427_105103_686748531.jsonl.meta.json} +0 -0
  295. /package/.beads/.br_history/{issues.20260424_181209_516766803.jsonl.meta.json → issues.20260427_105204_721591044.jsonl.meta.json} +0 -0
  296. /package/.beads/.br_history/{issues.20260424_181219_459169740.jsonl.meta.json → issues.20260427_105305_855661211.jsonl.meta.json} +0 -0
  297. /package/.beads/.br_history/{issues.20260424_181227_996490697.jsonl.meta.json → issues.20260427_105407_641630152.jsonl.meta.json} +0 -0
  298. /package/.beads/.br_history/{issues.20260424_181958_717811271.jsonl.meta.json → issues.20260427_105509_159649245.jsonl.meta.json} +0 -0
  299. /package/.beads/.br_history/{issues.20260424_182002_913828749.jsonl.meta.json → issues.20260427_105610_283950586.jsonl.meta.json} +0 -0
  300. /package/.beads/.br_history/{issues.20260424_182006_779786523.jsonl.meta.json → issues.20260427_105637_656057143.jsonl.meta.json} +0 -0
  301. /package/.beads/.br_history/{issues.20260424_182010_368190795.jsonl.meta.json → issues.20260427_105738_863187883.jsonl.meta.json} +0 -0
  302. /package/.beads/.br_history/{issues.20260424_182016_217217108.jsonl.meta.json → issues.20260427_105839_958463404.jsonl.meta.json} +0 -0
  303. /package/.beads/.br_history/{issues.20260424_182539_287444292.jsonl.meta.json → issues.20260427_105941_092827317.jsonl.meta.json} +0 -0
  304. /package/.beads/.br_history/{issues.20260424_182543_343189534.jsonl.meta.json → issues.20260427_110042_110436110.jsonl.meta.json} +0 -0
  305. /package/.beads/.br_history/{issues.20260424_182547_119975837.jsonl.meta.json → issues.20260427_110143_343801118.jsonl.meta.json} +0 -0
  306. /package/.beads/.br_history/{issues.20260424_182550_849315940.jsonl.meta.json → issues.20260427_110244_379134729.jsonl.meta.json} +0 -0
  307. /package/.beads/.br_history/{issues.20260424_182554_677413036.jsonl.meta.json → issues.20260427_110345_445658284.jsonl.meta.json} +0 -0
  308. /package/.beads/.br_history/{issues.20260424_183140_390494612.jsonl.meta.json → issues.20260427_110446_689391882.jsonl.meta.json} +0 -0
  309. /package/.beads/.br_history/{issues.20260424_183144_266256714.jsonl.meta.json → issues.20260427_110547_667705716.jsonl.meta.json} +0 -0
  310. /package/.beads/.br_history/{issues.20260424_183152_839579876.jsonl.meta.json → issues.20260427_110609_987816377.jsonl.meta.json} +0 -0
  311. /package/.beads/.br_history/{issues.20260424_183202_355634088.jsonl.meta.json → issues.20260427_110711_086550915.jsonl.meta.json} +0 -0
  312. /package/.beads/.br_history/{issues.20260424_183209_438616861.jsonl.meta.json → issues.20260427_110812_204821395.jsonl.meta.json} +0 -0
  313. /package/.beads/.br_history/{issues.20260424_183753_517602948.jsonl.meta.json → issues.20260427_110913_259688311.jsonl.meta.json} +0 -0
  314. /package/.beads/.br_history/{issues.20260424_183757_533544458.jsonl.meta.json → issues.20260427_111014_297775509.jsonl.meta.json} +0 -0
  315. /package/.beads/.br_history/{issues.20260424_183803_063929316.jsonl.meta.json → issues.20260427_111115_195150935.jsonl.meta.json} +0 -0
  316. /package/.beads/.br_history/{issues.20260424_183807_014724964.jsonl.meta.json → issues.20260427_111216_316259530.jsonl.meta.json} +0 -0
  317. /package/.beads/.br_history/{issues.20260424_183813_278844212.jsonl.meta.json → issues.20260427_111317_298020330.jsonl.meta.json} +0 -0
  318. /package/.beads/.br_history/{issues.20260424_190900_876564388.jsonl.meta.json → issues.20260427_111418_604431267.jsonl.meta.json} +0 -0
  319. /package/.beads/.br_history/{issues.20260424_192047_121286991.jsonl.meta.json → issues.20260427_111519_617870969.jsonl.meta.json} +0 -0
  320. /package/.beads/.br_history/{issues.20260424_192811_866934994.jsonl.meta.json → issues.20260427_111533_024097015.jsonl.meta.json} +0 -0
  321. /package/.beads/.br_history/{issues.20260424_193837_426102367.jsonl.meta.json → issues.20260427_111634_138814655.jsonl.meta.json} +0 -0
  322. /package/.beads/.br_history/{issues.20260424_194617_271952813.jsonl.meta.json → issues.20260427_111737_148398766.jsonl.meta.json} +0 -0
  323. /package/.beads/.br_history/{issues.20260424_195430_952967644.jsonl.meta.json → issues.20260427_111838_507704112.jsonl.meta.json} +0 -0
  324. /package/.beads/.br_history/{issues.20260424_200234_439280977.jsonl.meta.json → issues.20260427_111939_468325527.jsonl.meta.json} +0 -0
  325. /package/.beads/.br_history/{issues.20260424_200923_545127361.jsonl.meta.json → issues.20260427_112041_044923744.jsonl.meta.json} +0 -0
  326. /package/.beads/.br_history/{issues.20260424_204056_586059018.jsonl.meta.json → issues.20260427_112142_224127430.jsonl.meta.json} +0 -0
  327. /package/.beads/.br_history/{issues.20260424_205301_854556209.jsonl.meta.json → issues.20260427_112243_212317525.jsonl.meta.json} +0 -0
  328. /package/.beads/.br_history/{issues.20260424_210455_501610650.jsonl.meta.json → issues.20260427_112344_182300930.jsonl.meta.json} +0 -0
  329. /package/.beads/.br_history/{issues.20260424_212803_108840399.jsonl.meta.json → issues.20260427_112445_197922899.jsonl.meta.json} +0 -0
  330. /package/.beads/.br_history/{issues.20260425_045812_041336580.jsonl.meta.json → issues.20260427_112502_597304488.jsonl.meta.json} +0 -0
  331. /package/.beads/.br_history/{issues.20260425_045914_762139232.jsonl.meta.json → issues.20260427_112604_292832651.jsonl.meta.json} +0 -0
  332. /package/.beads/.br_history/{issues.20260425_050011_038094726.jsonl.meta.json → issues.20260427_112706_051581607.jsonl.meta.json} +0 -0
  333. /package/.beads/.br_history/{issues.20260425_050140_047103928.jsonl.meta.json → issues.20260427_112807_066213762.jsonl.meta.json} +0 -0
  334. /package/.beads/.br_history/{issues.20260425_054328_968771145.jsonl.meta.json → issues.20260427_112908_145315373.jsonl.meta.json} +0 -0
  335. /package/.beads/.br_history/{issues.20260425_054419_800564203.jsonl.meta.json → issues.20260427_113009_141079023.jsonl.meta.json} +0 -0
  336. /package/.beads/.br_history/{issues.20260425_054543_771812828.jsonl.meta.json → issues.20260427_113110_601071412.jsonl.meta.json} +0 -0
  337. /package/.beads/.br_history/{issues.20260425_054648_963773974.jsonl.meta.json → issues.20260427_113211_601412739.jsonl.meta.json} +0 -0
  338. /package/.beads/.br_history/{issues.20260425_054751_122349828.jsonl.meta.json → issues.20260427_113312_771171767.jsonl.meta.json} +0 -0
  339. /package/.beads/.br_history/{issues.20260425_060749_403415856.jsonl.meta.json → issues.20260427_113413_719165420.jsonl.meta.json} +0 -0
  340. /package/.beads/.br_history/{issues.20260425_062503_208821903.jsonl.meta.json → issues.20260427_113430_416576564.jsonl.meta.json} +0 -0
  341. /package/.beads/.br_history/{issues.20260425_063134_587505560.jsonl.meta.json → issues.20260427_113531_553842703.jsonl.meta.json} +0 -0
  342. /package/.beads/.br_history/{issues.20260425_064005_565019560.jsonl.meta.json → issues.20260427_113633_137526241.jsonl.meta.json} +0 -0
  343. /package/.beads/.br_history/{issues.20260425_064651_250053752.jsonl.meta.json → issues.20260427_113735_697152101.jsonl.meta.json} +0 -0
  344. /package/.beads/.br_history/{issues.20260425_065904_323410469.jsonl.meta.json → issues.20260427_113836_810884202.jsonl.meta.json} +0 -0
  345. /package/.beads/.br_history/{issues.20260425_070603_854872783.jsonl.meta.json → issues.20260427_113938_312284719.jsonl.meta.json} +0 -0
  346. /package/.beads/.br_history/{issues.20260425_071232_499550581.jsonl.meta.json → issues.20260427_114039_390178502.jsonl.meta.json} +0 -0
  347. /package/.beads/.br_history/{issues.20260425_071859_753108611.jsonl.meta.json → issues.20260427_114140_483586632.jsonl.meta.json} +0 -0
  348. /package/.beads/.br_history/{issues.20260425_171215_558114276.jsonl.meta.json → issues.20260427_114241_502376670.jsonl.meta.json} +0 -0
  349. /package/.beads/.br_history/{issues.20260425_171228_711028872.jsonl.meta.json → issues.20260427_114342_927243830.jsonl.meta.json} +0 -0
  350. /package/.beads/.br_history/{issues.20260425_171908_608455863.jsonl.meta.json → issues.20260427_114405_996651227.jsonl.meta.json} +0 -0
  351. /package/.beads/.br_history/{issues.20260425_172952_108071113.jsonl.meta.json → issues.20260427_114507_946708398.jsonl.meta.json} +0 -0
  352. /package/.beads/.br_history/{issues.20260425_200313_037876111.jsonl.meta.json → issues.20260427_114608_914493506.jsonl.meta.json} +0 -0
  353. /package/.beads/.br_history/{issues.20260425_201117_411540946.jsonl.meta.json → issues.20260427_114709_935565841.jsonl.meta.json} +0 -0
  354. /package/.beads/.br_history/{issues.20260425_210522_892936637.jsonl.meta.json → issues.20260427_114810_981588378.jsonl.meta.json} +0 -0
  355. /package/.beads/.br_history/{issues.20260425_210949_356368198.jsonl.meta.json → issues.20260427_114912_061702372.jsonl.meta.json} +0 -0
  356. /package/.beads/.br_history/{issues.20260425_211617_355720902.jsonl.meta.json → issues.20260427_115013_063113906.jsonl.meta.json} +0 -0
  357. /package/.beads/.br_history/{issues.20260425_213515_555595766.jsonl.meta.json → issues.20260427_115114_208497343.jsonl.meta.json} +0 -0
  358. /package/.beads/.br_history/{issues.20260425_214642_203845514.jsonl.meta.json → issues.20260427_115215_176080241.jsonl.meta.json} +0 -0
  359. /package/.beads/.br_history/{issues.20260425_221221_451474472.jsonl.meta.json → issues.20260427_115316_481573328.jsonl.meta.json} +0 -0
  360. /package/.beads/.br_history/{issues.20260425_222608_800503496.jsonl.meta.json → issues.20260427_115335_866978652.jsonl.meta.json} +0 -0
  361. /package/.beads/.br_history/{issues.20260426_071735_330251998.jsonl.meta.json → issues.20260427_115436_866087391.jsonl.meta.json} +0 -0
  362. /package/.beads/.br_history/{issues.20260426_071755_925764854.jsonl.meta.json → issues.20260427_115538_016094860.jsonl.meta.json} +0 -0
  363. /package/.beads/.br_history/{issues.20260426_071818_936440407.jsonl.meta.json → issues.20260427_115638_932947449.jsonl.meta.json} +0 -0
  364. /package/.beads/.br_history/{issues.20260426_071834_033200504.jsonl.meta.json → issues.20260427_115739_982932603.jsonl.meta.json} +0 -0
  365. /package/.beads/.br_history/{issues.20260426_072406_524696668.jsonl.meta.json → issues.20260427_115840_963681039.jsonl.meta.json} +0 -0
  366. /package/.beads/.br_history/{issues.20260426_073231_913315951.jsonl.meta.json → issues.20260427_115941_912431509.jsonl.meta.json} +0 -0
  367. /package/.beads/.br_history/{issues.20260426_074828_051470117.jsonl.meta.json → issues.20260427_120043_043356448.jsonl.meta.json} +0 -0
  368. /package/.beads/.br_history/{issues.20260426_080300_773872374.jsonl.meta.json → issues.20260427_120144_955596968.jsonl.meta.json} +0 -0
  369. /package/.beads/.br_history/{issues.20260426_121735_535252712.jsonl.meta.json → issues.20260427_120246_060733977.jsonl.meta.json} +0 -0
  370. /package/.beads/.br_history/{issues.20260426_125144_933153546.jsonl.meta.json → issues.20260427_120307_717985017.jsonl.meta.json} +0 -0
  371. /package/.beads/.br_history/{issues.20260426_132438_591463320.jsonl.meta.json → issues.20260427_120408_871846736.jsonl.meta.json} +0 -0
  372. /package/.beads/.br_history/{issues.20260426_134150_938793400.jsonl.meta.json → issues.20260427_121003_963750732.jsonl.meta.json} +0 -0
  373. /package/.beads/.br_history/{issues.20260426_162331_516939737.jsonl.meta.json → issues.20260427_121006_018509431.jsonl.meta.json} +0 -0
  374. /package/.beads/.br_history/{issues.20260426_162513_726336785.jsonl.meta.json → issues.20260427_121019_617062931.jsonl.meta.json} +0 -0
  375. /package/.beads/.br_history/{issues.20260426_162712_190824905.jsonl.meta.json → issues.20260427_121021_689536311.jsonl.meta.json} +0 -0
@@ -9,30 +9,62 @@
9
9
  <button @click="showForm=!showForm" class="btn btn-primary">+ Add Server</button>
10
10
  </div>
11
11
 
12
- <!-- Add form -->
12
+ <!-- Add/Edit form -->
13
13
  <div v-if="showForm" class="bento-card p-6 mb-6">
14
- <form @submit.prevent="create">
14
+ <form @submit.prevent="editing ? update() : create()">
15
15
  <div class="flex flex-col md:flex-row gap-4 items-end mb-4">
16
16
  <div class="flex-1 w-full">
17
17
  <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">Name</label>
18
18
  <input v-model="form.name" class="w-full px-4 py-3 bg-[#F7F6F3] border border-[#EAEAEA] rounded-md text-[#111111] focus:outline-none focus:border-[#111111] transition-colors" required placeholder="e.g. context-mode">
19
19
  </div>
20
- <div class="flex-1 w-full">
21
- <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">URL (HTTP MCP)</label>
20
+ </div>
21
+
22
+ <div class="mb-4">
23
+ <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-3">Transport Mode</label>
24
+ <div class="flex gap-6">
25
+ <label class="flex items-center gap-2 cursor-pointer">
26
+ <input type="radio" v-model="form.transport" value="http" class="w-4 h-4 accent-[#111111]">
27
+ <span class="text-sm text-[#2F3437]">SSE/HTTP</span>
28
+ </label>
29
+ <label class="flex items-center gap-2 cursor-pointer">
30
+ <input type="radio" v-model="form.transport" value="stdio" class="w-4 h-4 accent-[#111111]">
31
+ <span class="text-sm text-[#2F3437]">STDIO</span>
32
+ </label>
33
+ </div>
34
+ </div>
35
+
36
+ <!-- SSE/HTTP fields -->
37
+ <div v-if="form.transport === 'http'" class="space-y-4">
38
+ <div>
39
+ <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">URL</label>
22
40
  <input v-model="form.url" class="w-full px-4 py-3 bg-[#F7F6F3] border border-[#EAEAEA] rounded-md text-[#111111] focus:outline-none focus:border-[#111111] transition-colors" placeholder="https://mcp.example.com">
41
+ <p class="text-xs text-[#787774] mt-1">Uses SSE with HTTP fallback</p>
23
42
  </div>
24
- <div class="flex-1 w-full">
25
- <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">Command (stdio MCP)</label>
26
- <input v-model="form.command" class="w-full px-4 py-3 bg-[#F7F6F3] border border-[#EAEAEA] rounded-md text-[#111111] focus:outline-none focus:border-[#111111] transition-colors" placeholder="e.g. context-mode">
43
+ <div>
44
+ <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">Timeout (ms)</label>
45
+ <input v-model="form.timeout_ms" type="number" class="w-full px-4 py-3 bg-[#F7F6F3] border border-[#EAEAEA] rounded-md text-[#111111] focus:outline-none focus:border-[#111111] transition-colors" placeholder="30000">
46
+ <p class="text-xs text-[#787774] mt-1">Default: 30000ms (30 seconds)</p>
27
47
  </div>
28
48
  </div>
29
- <div class="flex gap-4 items-center">
49
+
50
+ <!-- STDIO fields -->
51
+ <div v-if="form.transport === 'stdio'" class="space-y-4">
52
+ <div>
53
+ <label class="block text-xs font-semibold text-[#787774] uppercase tracking-wider mb-2">Command</label>
54
+ <input v-model="form.command" class="w-full px-4 py-3 bg-[#F7F6F3] border border-[#EAEAEA] rounded-md text-[#111111] focus:outline-none focus:border-[#111111] transition-colors" placeholder="e.g. context-mode">
55
+ </div>
30
56
  <label class="flex items-center gap-2 cursor-pointer">
31
57
  <input type="checkbox" v-model="form.stateful" class="w-4 h-4 accent-[#111111]">
32
- <span class="text-sm text-[#2F3437]">Stateful (requires daemon)</span>
58
+ <div class="flex flex-col">
59
+ <span class="text-sm text-[#2F3437]">Stateful (requires daemon)</span>
60
+ <span class="text-xs text-[#787774]">Daemon runs on CLI side, starts when command is executed via CLI (not server)</span>
61
+ </div>
33
62
  </label>
34
- <button type="submit" class="btn btn-primary">Save</button>
35
- <button type="button" @click="showForm=false" class="btn">Cancel</button>
63
+ </div>
64
+
65
+ <div class="flex gap-4 items-center mt-4">
66
+ <button type="submit" class="btn btn-primary">{{ editing ? 'Update' : 'Save' }}</button>
67
+ <button type="button" @click="cancelEdit" class="btn">Cancel</button>
36
68
  </div>
37
69
  </form>
38
70
  </div>
@@ -42,21 +74,45 @@
42
74
  <thead>
43
75
  <tr class="border-b border-[#EAEAEA] bg-[#F7F6F3]">
44
76
  <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Name</th>
77
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Plugin</th>
45
78
  <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Source</th>
46
79
  <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Type</th>
47
80
  <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Actions</th>
48
81
  </tr>
49
82
  </thead>
50
83
  <tbody>
51
- <tr v-if="servers.length===0"><td colspan="4" class="px-6 py-12 text-center text-[#787774]">No MCP servers registered.</td></tr>
84
+ <tr v-if="servers.length===0"><td colspan="5" class="px-6 py-12 text-center text-[#787774]">No MCP servers registered.</td></tr>
52
85
  <tr v-for="s in servers" :key="s._id" class="border-b border-[#EAEAEA] hover:bg-[#F7F6F3] transition-colors">
53
- <td class="px-6 py-4"><code class="mono-text text-sm text-[#1F6C9F]">{{ s.name }}</code></td>
86
+ <td class="px-6 py-4">
87
+ <code class="mono-text text-sm text-[#1F6C9F]">{{ s.displayName || s.name }}</code>
88
+ <div v-if="getUsedCommands(s).length > 0" class="mt-1 text-xs text-[#787774]">
89
+ used by: {{ getUsedCommands(s).map(c => `${c.namespace}.${c.resource}.${c.action}`).join(', ') }}
90
+ </div>
91
+ <div v-if="s.clientId" class="mt-1 text-xs text-[#787774]">
92
+ synced by: {{ s.clientId.substring(0, 8) }}...
93
+ </div>
94
+ </td>
95
+ <td class="px-6 py-4">
96
+ <span v-if="s.origin" class="px-2 py-1 rounded-full text-xs font-semibold" :class="{
97
+ 'bg-blue-100 text-blue-700': s.origin === 'cli',
98
+ 'bg-green-100 text-green-700': s.origin === 'server',
99
+ 'bg-gray-100 text-gray-700': s.origin === 'manual'
100
+ }">{{ s.origin }}</span>
101
+ <span v-else class="text-xs text-[#787774]">manual</span>
102
+ </td>
54
103
  <td class="px-6 py-4 max-w-xs truncate text-[#2F3437]">{{ s.url || s.command || '' }}</td>
55
104
  <td class="px-6 py-4">
56
105
  <span v-if="s.stateful" class="badge bg-[#111111] text-white">stateful</span>
57
- <span v-else class="badge">{{ s.url ? 'http' : 'stdio' }}</span>
106
+ <span v-else class="badge">{{ s.url ? 'sse/http' : 'stdio' }}</span>
107
+ <span v-if="s.url && s.status" class="ml-2 text-xs" :class="{'text-green-600': s.status === 'alive', 'text-red-600': s.status === 'error'}">
108
+ {{ s.status === 'alive' ? '✓' : '✗' }} {{ s.lastCheck }}
109
+ </span>
58
110
  </td>
59
111
  <td class="px-6 py-4">
112
+ <button v-if="s.url" @click="check(s)" :disabled="s.checking" class="btn text-xs border-green-200 text-green-600 hover:bg-green-50 hover:border-green-300 mr-2" :class="{'opacity-50': s.checking}">
113
+ {{ s.checking ? 'Checking...' : 'Check' }}
114
+ </button>
115
+ <button @click="edit(s)" class="btn text-xs border-blue-200 text-blue-600 hover:bg-blue-50 hover:border-blue-300 mr-2">Edit</button>
60
116
  <button @click="remove(s._id)" class="btn text-xs border-red-200 text-red-600 hover:bg-red-50 hover:border-red-300">Delete</button>
61
117
  </td>
62
118
  </tr>
@@ -72,16 +128,84 @@
72
128
  data() {
73
129
  return {
74
130
  servers: initialServers,
131
+ commands: [],
75
132
  showForm: false,
76
- form: { name: '', url: '', command: '', stateful: false }
133
+ editing: false,
134
+ editId: null,
135
+ form: { name: '', transport: 'http', url: '', timeout_ms: 30000, command: '', stateful: false },
136
+ autoCheckInterval: null
137
+ }
138
+ },
139
+ mounted() {
140
+ // Start auto-check every minute for HTTP/SSE servers
141
+ this.autoCheckInterval = setInterval(() => {
142
+ this.autoCheck()
143
+ }, 60000)
144
+
145
+ // Fetch commands
146
+ this.fetchCommands()
147
+
148
+ // Refresh commands every 30 seconds
149
+ setInterval(() => {
150
+ this.fetchCommands()
151
+ }, 30000)
152
+ },
153
+ beforeUnmount() {
154
+ if (this.autoCheckInterval) {
155
+ clearInterval(this.autoCheckInterval)
77
156
  }
78
157
  },
79
158
  methods: {
159
+ async fetchCommands() {
160
+ try {
161
+ const res = await fetch('/api/commands?format=json')
162
+ const data = await res.json()
163
+ this.commands = data.commands || data || []
164
+ } catch (err) {
165
+ console.error('Failed to fetch commands:', err)
166
+ }
167
+ },
168
+ getUsedCommands(server) {
169
+ // Find commands that use this MCP server
170
+ return this.commands.filter(cmd => {
171
+ const adapterConfig = cmd.adapterConfig || {}
172
+ // Match by server name (for stdio) or URL (for HTTP)
173
+ if (server.url) {
174
+ return adapterConfig.url === server.url
175
+ } else {
176
+ return adapterConfig.server === server.name
177
+ }
178
+ })
179
+ },
180
+ edit(server) {
181
+ this.editing = true
182
+ this.editId = server._id
183
+ this.form = {
184
+ name: server.name,
185
+ transport: server.url ? 'http' : 'stdio',
186
+ url: server.url || '',
187
+ timeout_ms: server.timeout_ms || 30000,
188
+ command: server.command || '',
189
+ stateful: server.stateful || false
190
+ }
191
+ this.showForm = true
192
+ },
193
+ cancelEdit() {
194
+ this.editing = false
195
+ this.editId = null
196
+ this.form = { name: '', transport: 'http', url: '', timeout_ms: 30000, command: '', stateful: false }
197
+ this.showForm = false
198
+ },
80
199
  async create() {
81
200
  const payload = { name: this.form.name }
82
- if (this.form.url) payload.url = this.form.url
83
- if (this.form.command) payload.command = this.form.command
84
- if (this.form.stateful) payload.stateful = true
201
+ if (this.form.transport === 'http') {
202
+ payload.url = this.form.url
203
+ if (this.form.timeout_ms) payload.timeout_ms = parseInt(this.form.timeout_ms)
204
+ }
205
+ if (this.form.transport === 'stdio') {
206
+ payload.command = this.form.command
207
+ if (this.form.stateful) payload.stateful = true
208
+ }
85
209
  const r = await fetch('/api/mcp', {
86
210
  method: 'POST',
87
211
  headers: { 'Content-Type': 'application/json' },
@@ -89,14 +213,147 @@
89
213
  })
90
214
  const doc = await r.json()
91
215
  this.servers.push(doc)
92
- this.form = { name: '', url: '', command: '', stateful: false }
93
- this.showForm = false
216
+ this.cancelEdit()
217
+ await this.fetchCommands()
218
+ },
219
+ async update() {
220
+ const payload = { name: this.form.name }
221
+ if (this.form.transport === 'http') {
222
+ payload.url = this.form.url
223
+ if (this.form.timeout_ms) payload.timeout_ms = parseInt(this.form.timeout_ms)
224
+ }
225
+ if (this.form.transport === 'stdio') {
226
+ payload.command = this.form.command
227
+ if (this.form.stateful) payload.stateful = true
228
+ }
229
+ const r = await fetch('/api/mcp/' + this.editId, {
230
+ method: 'PUT',
231
+ headers: { 'Content-Type': 'application/json' },
232
+ body: JSON.stringify(payload)
233
+ })
234
+ const doc = await r.json()
235
+ const idx = this.servers.findIndex(s => s._id === this.editId)
236
+ if (idx !== -1) this.servers[idx] = { ...this.servers[idx], ...payload, updatedAt: new Date() }
237
+ this.cancelEdit()
238
+ await this.fetchCommands()
239
+ },
240
+ async check(server) {
241
+ server.checking = true
242
+ let sessionId = null
243
+ try {
244
+ const timeout = server.timeout_ms || 10000
245
+ const controller = new AbortController()
246
+ const timeoutId = setTimeout(() => controller.abort(), timeout)
247
+
248
+ // Try different endpoints
249
+ const endpoints = ['/mcp', '/tool', '/sse']
250
+ let response = null
251
+
252
+ // First try without session (stateless)
253
+ for (const endpoint of endpoints) {
254
+ try {
255
+ response = await fetch(server.url + endpoint, {
256
+ method: 'POST',
257
+ headers: { 'Content-Type': 'application/json', 'Accept': 'application/json, text/event-stream' },
258
+ body: JSON.stringify({ jsonrpc: '2.0', method: 'tools/list', id: 1 }),
259
+ signal: controller.signal
260
+ })
261
+ // Accept any response that returns data (SSE might not be 200)
262
+ if (response.status >= 200 && response.status < 500) break
263
+ } catch (e) {
264
+ // Try next endpoint
265
+ }
266
+ }
267
+
268
+ // If stateless check failed with session error, try with session
269
+ if (!response || response.status >= 500) {
270
+ // Try to create a session
271
+ for (const endpoint of endpoints) {
272
+ try {
273
+ const sessionRes = await fetch(server.url + endpoint, {
274
+ method: 'POST',
275
+ headers: { 'Content-Type': 'application/json', 'Accept': 'application/json, text/event-stream' },
276
+ body: JSON.stringify({ jsonrpc: '2.0', method: 'initialize', id: 1 }),
277
+ signal: controller.signal
278
+ })
279
+ if (sessionRes.status >= 200 && sessionRes.status < 500) {
280
+ const text = await sessionRes.text()
281
+ // Extract session ID from response
282
+ const match = text.match(/id:\s*([^\s_]+)/)
283
+ if (match) {
284
+ sessionId = match[1]
285
+ break
286
+ }
287
+ }
288
+ } catch (e) {
289
+ // Try next endpoint
290
+ }
291
+ }
292
+
293
+ // If we got a session, try the check with it
294
+ if (sessionId) {
295
+ for (const endpoint of endpoints) {
296
+ try {
297
+ response = await fetch(server.url + endpoint, {
298
+ method: 'POST',
299
+ headers: {
300
+ 'Content-Type': 'application/json',
301
+ 'Accept': 'application/json, text/event-stream',
302
+ 'X-MCP-Session-Id': sessionId
303
+ },
304
+ body: JSON.stringify({ jsonrpc: '2.0', method: 'tools/list', id: 1 }),
305
+ signal: controller.signal
306
+ })
307
+ if (response.status >= 200 && response.status < 500) break
308
+ } catch (e) {
309
+ // Try next endpoint
310
+ }
311
+ }
312
+ }
313
+ }
314
+
315
+ clearTimeout(timeoutId)
316
+
317
+ if (response && response.status >= 200 && response.status < 500) {
318
+ server.status = 'alive'
319
+ server.lastCheck = new Date().toLocaleTimeString()
320
+ } else {
321
+ server.status = 'error'
322
+ server.lastCheck = new Date().toLocaleTimeString()
323
+ }
324
+ } catch (err) {
325
+ server.status = 'error'
326
+ server.lastCheck = new Date().toLocaleTimeString()
327
+ } finally {
328
+ server.checking = false
329
+ // Clean up session if created
330
+ if (sessionId) {
331
+ try {
332
+ await fetch(server.url + '/mcp', {
333
+ method: 'POST',
334
+ headers: { 'Content-Type': 'application/json' },
335
+ body: JSON.stringify({ jsonrpc: '2.0', method: 'shutdown', id: 1 })
336
+ })
337
+ } catch (e) {
338
+ // Ignore cleanup errors
339
+ }
340
+ }
341
+ }
94
342
  },
95
343
  async remove(id) {
96
344
  if (!confirm('Delete this server?')) return
97
345
  await fetch('/api/mcp/' + id, { method: 'DELETE' })
98
346
  this.servers = this.servers.filter(s => s._id !== id)
99
- }
347
+ await this.fetchCommands()
348
+ },
349
+ autoCheck() {
350
+ // Check all HTTP/SSE servers that aren't already being checked
351
+ this.servers.forEach(server => {
352
+ if (server.url && !server.checking) {
353
+ this.check(server)
354
+ }
355
+ })
356
+ },
100
357
  }
101
358
  }).mount('#mcp-app')
102
359
  </script>
@@ -98,7 +98,9 @@
98
98
  <a href="/api/specs" class="btn justify-start" id="nav-specs">OpenAPI Specs</a>
99
99
  <a href="/api/mcp" class="btn justify-start" id="nav-mcp">MCP Servers</a>
100
100
  <a href="/api/plugins" class="btn justify-start" id="nav-plugins">Server Plugins</a>
101
+ <a href="/api/plugins/clients" class="btn justify-start" id="nav-clients">Clients</a>
101
102
  <a href="/api/jobs" class="btn justify-start" id="nav-jobs">Jobs</a>
103
+ <a href="/api/docs" class="btn justify-start" id="nav-docs">Documentation</a>
102
104
  </aside>
103
105
  <!-- Main content -->
104
106
  <main class="flex-1 p-8 bg-[#FBFBFA]">
@@ -34,11 +34,58 @@
34
34
  <input type="checkbox" v-model="settings.admin_mode_enabled" class="checkbox checkbox-error checkbox-sm" />
35
35
  <span class="label-text text-xs text-error font-semibold">Admin Mode (allows CLI modifications)</span>
36
36
  </label>
37
+ <label class="label cursor-pointer justify-start gap-2 mb-3">
38
+ <input type="checkbox" v-model="settings.public_access" class="checkbox checkbox-sm" />
39
+ <span class="label-text text-xs">Public Access (allow without API key)</span>
40
+ </label>
37
41
  <button class="btn btn-sm btn-primary" @click="saveSettings">Save Settings</button>
38
42
  </div>
39
43
  </div>
40
44
 
41
- <div class="card bg-base-100 border border-base-300 lg:col-span-2">
45
+ <div class="card bg-base-100 border border-base-300">
46
+ <div class="card-body p-4">
47
+ <h2 class="card-title text-base">API Keys</h2>
48
+ <div class="form-control mb-3">
49
+ <div class="label">
50
+ <span class="label-text text-xs">Create New API Key</span>
51
+ </div>
52
+ <div class="flex gap-2">
53
+ <input v-model="newKeyName" class="input input-bordered input-sm flex-1" placeholder="Key name (e.g., 'CLI Agent')" />
54
+ <button class="btn btn-sm btn-primary" @click="createApiKey">Create</button>
55
+ </div>
56
+ </div>
57
+ <div v-if="settings.api_keys && settings.api_keys.length > 0" class="overflow-x-auto">
58
+ <table class="table table-zebra table-xs">
59
+ <thead>
60
+ <tr>
61
+ <th>Name</th>
62
+ <th>Key</th>
63
+ <th>Created</th>
64
+ <th>Action</th>
65
+ </tr>
66
+ </thead>
67
+ <tbody>
68
+ <tr v-for="apiKey in settings.api_keys" :key="apiKey.key">
69
+ <td>{{ apiKey.name }}</td>
70
+ <td>
71
+ <code class="text-xs">{{ apiKey.key.slice(0, 8) }}...</code>
72
+ <button class="btn btn-xs btn-ghost ml-1" @click="copyApiKey(apiKey.key)">📋</button>
73
+ </td>
74
+ <td class="text-xs">{{ new Date(apiKey.created_at).toLocaleDateString() }}</td>
75
+ <td>
76
+ <button class="btn btn-xs btn-error" @click="deleteApiKey(apiKey.key)">Delete</button>
77
+ </td>
78
+ </tr>
79
+ </tbody>
80
+ </table>
81
+ </div>
82
+ <div v-else class="text-xs opacity-60 text-center py-2">
83
+ No API keys created yet
84
+ </div>
85
+ </div>
86
+ </div>
87
+
88
+ <div class="card bg-base-100 border border-base-300">
42
89
  <div class="card-body p-4">
43
90
  <h2 class="card-title text-base">Create JSON Plugin</h2>
44
91
  <div class="grid grid-cols-2 gap-2 mb-2">
@@ -154,6 +201,7 @@
154
201
  archive_file: null,
155
202
  manifestStr: '{\n "name": "my-plugin",\n "version": "0.0.0",\n "commands": []\n}',
156
203
  },
204
+ newKeyName: '',
157
205
  }
158
206
  },
159
207
  methods: {
@@ -266,6 +314,38 @@
266
314
  this.setMessage('error', err.message)
267
315
  }
268
316
  },
317
+ async createApiKey() {
318
+ if (!this.newKeyName.trim()) {
319
+ this.setMessage('error', 'API key name is required')
320
+ return
321
+ }
322
+ try {
323
+ const result = await this.api('/api/plugins/api-keys', 'POST', { name: this.newKeyName })
324
+ this.setMessage('success', `Created API key '${result.name}'`)
325
+ this.newKeyName = ''
326
+ await this.reloadPlugins()
327
+ } catch (err) {
328
+ this.setMessage('error', err.message)
329
+ }
330
+ },
331
+ async deleteApiKey(key) {
332
+ if (!confirm('Delete this API key?')) return
333
+ try {
334
+ await this.api(`/api/plugins/api-keys/${encodeURIComponent(key)}`, 'DELETE')
335
+ this.setMessage('success', 'API key deleted')
336
+ await this.reloadPlugins()
337
+ } catch (err) {
338
+ this.setMessage('error', err.message)
339
+ }
340
+ },
341
+ async copyApiKey(key) {
342
+ try {
343
+ await navigator.clipboard.writeText(key)
344
+ this.setMessage('success', 'API key copied to clipboard')
345
+ } catch (err) {
346
+ this.setMessage('error', 'Failed to copy API key')
347
+ }
348
+ },
269
349
  },
270
350
  }).mount('#plugins-app')
271
351
  </script>