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
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Plugin Resource Service
3
+ * Handles registration and cleanup of server resources (MCP/OpenAPI) from plugins
4
+ */
5
+ const { getStorage } = require("../storage/adapter")
6
+
7
+ async function registerPluginResources(pluginName, serverResources, origin = "cli", clientId = null) {
8
+ const storage = getStorage()
9
+ const results = { mcp: [], specs: [], errors: [] }
10
+
11
+ try {
12
+ // Register MCP resources
13
+ if (serverResources.mcp && Array.isArray(serverResources.mcp)) {
14
+ for (const mcpResource of serverResources.mcp) {
15
+ try {
16
+ if (!mcpResource.name || (!mcpResource.url && !mcpResource.command)) {
17
+ results.errors.push(`Invalid MCP resource: missing name or url/command`)
18
+ continue
19
+ }
20
+
21
+ // Build key with client_id if origin is cli
22
+ const key = origin === "cli" && clientId
23
+ ? `mcp:${origin}:${clientId}:${pluginName}:${mcpResource.name}`
24
+ : `mcp:${origin}:${pluginName}:${mcpResource.name}`
25
+
26
+ const doc = {
27
+ _id: key,
28
+ name: key,
29
+ displayName: mcpResource.name,
30
+ pluginSource: pluginName,
31
+ origin: origin,
32
+ clientId: clientId || null,
33
+ createdAt: new Date()
34
+ }
35
+
36
+ // Copy MCP properties
37
+ if (mcpResource.url) doc.url = mcpResource.url
38
+ if (mcpResource.command) doc.command = mcpResource.command
39
+ if (mcpResource.args) doc.args = mcpResource.args
40
+ if (mcpResource.headers) doc.headers = mcpResource.headers
41
+ if (mcpResource.env) doc.env = mcpResource.env
42
+ if (mcpResource.timeout_ms) doc.timeout_ms = mcpResource.timeout_ms
43
+ if (mcpResource.stateful) doc.stateful = true
44
+
45
+ await storage.set(key, doc)
46
+ results.mcp.push(key)
47
+ } catch (err) {
48
+ results.errors.push(`Failed to register MCP ${mcpResource.name}: ${err.message}`)
49
+ }
50
+ }
51
+ }
52
+
53
+ // Register OpenAPI spec resources
54
+ if (serverResources.specs && Array.isArray(serverResources.specs)) {
55
+ for (const specResource of serverResources.specs) {
56
+ try {
57
+ if (!specResource.name || !specResource.url) {
58
+ results.errors.push(`Invalid spec resource: missing name or url`)
59
+ continue
60
+ }
61
+
62
+ // Build key with client_id if origin is cli
63
+ const key = origin === "cli" && clientId
64
+ ? `spec:${origin}:${clientId}:${pluginName}:${specResource.name}`
65
+ : `spec:${origin}:${pluginName}:${specResource.name}`
66
+
67
+ const doc = {
68
+ _id: key,
69
+ name: key,
70
+ displayName: specResource.name,
71
+ url: specResource.url,
72
+ auth: specResource.auth || "none",
73
+ pluginSource: pluginName,
74
+ origin: origin,
75
+ clientId: clientId || null,
76
+ createdAt: new Date()
77
+ }
78
+
79
+ await storage.set(key, doc)
80
+ results.specs.push(key)
81
+ } catch (err) {
82
+ results.errors.push(`Failed to register spec ${specResource.name}: ${err.message}`)
83
+ }
84
+ }
85
+ }
86
+ } catch (err) {
87
+ results.errors.push(`Resource registration failed: ${err.message}`)
88
+ }
89
+
90
+ return results
91
+ }
92
+
93
+ async function unregisterPluginResources(pluginName, origin = "cli") {
94
+ const storage = getStorage()
95
+ const results = { mcp: [], specs: [], errors: [] }
96
+
97
+ try {
98
+ // Remove MCP resources by origin prefix
99
+ const allMcpKeys = await storage.listKeys("mcp:")
100
+ const targetMcpKeys = allMcpKeys.filter(k => k.startsWith(`mcp:${origin}:${pluginName}:`))
101
+ for (const key of targetMcpKeys) {
102
+ try {
103
+ await storage.delete(key)
104
+ results.mcp.push(key)
105
+ } catch (err) {
106
+ results.errors.push(`Failed to remove MCP ${key}: ${err.message}`)
107
+ }
108
+ }
109
+
110
+ // Remove spec resources by origin prefix
111
+ const allSpecKeys = await storage.listKeys("spec:")
112
+ const targetSpecKeys = allSpecKeys.filter(k => k.startsWith(`spec:${origin}:${pluginName}:`))
113
+ for (const key of targetSpecKeys) {
114
+ try {
115
+ await storage.delete(key)
116
+ results.specs.push(key)
117
+ } catch (err) {
118
+ results.errors.push(`Failed to remove spec ${key}: ${err.message}`)
119
+ }
120
+ }
121
+ } catch (err) {
122
+ results.errors.push(`Resource cleanup failed: ${err.message}`)
123
+ }
124
+
125
+ return results
126
+ }
127
+
128
+ async function registerAllPluginResources() {
129
+ const storage = getStorage()
130
+ const results = { plugins: {}, totalErrors: 0, registeredMcp: 0, registeredSpecs: 0 }
131
+
132
+ // Register resources from client plugins (plugin_client:{client-id}:*)
133
+ const clientPluginKeys = await storage.listKeys("plugin_client:")
134
+ for (const key of clientPluginKeys) {
135
+ try {
136
+ const plugin = await storage.get(key)
137
+ if (plugin && plugin.server_resources && plugin.client_id) {
138
+ const pluginResults = await registerPluginResources(plugin.name, plugin.server_resources, "cli", plugin.client_id)
139
+ results.plugins[plugin.name] = pluginResults
140
+ results.totalErrors += pluginResults.errors.length
141
+ results.registeredMcp += pluginResults.mcp.length
142
+ results.registeredSpecs += pluginResults.specs.length
143
+ }
144
+ } catch (err) {
145
+ results.totalErrors++
146
+ }
147
+ }
148
+
149
+ // Register resources from server plugins (plugin_server:*)
150
+ const serverPluginKeys = await storage.listKeys("plugin_server:")
151
+ for (const key of serverPluginKeys) {
152
+ try {
153
+ const plugin = await storage.get(key)
154
+ if (plugin && plugin.manifest && plugin.manifest.server_resources) {
155
+ const pluginResults = await registerPluginResources(plugin.name, plugin.manifest.server_resources, "server")
156
+ results.plugins[plugin.name] = pluginResults
157
+ results.totalErrors += pluginResults.errors.length
158
+ results.registeredMcp += pluginResults.mcp.length
159
+ results.registeredSpecs += pluginResults.specs.length
160
+ }
161
+ } catch (err) {
162
+ results.totalErrors++
163
+ }
164
+ }
165
+
166
+ return results
167
+ }
168
+
169
+ async function syncPluginResources() {
170
+ const storage = getStorage()
171
+
172
+ // Get all currently registered plugin resources
173
+ const allMcpKeys = await storage.listKeys("mcp:")
174
+ const allSpecKeys = await storage.listKeys("spec:")
175
+
176
+ // Filter for plugin resources (contain origin prefix)
177
+ const pluginMcpKeys = allMcpKeys.filter(k => k.split(':').length > 2)
178
+ const pluginSpecKeys = allSpecKeys.filter(k => k.split(':').length > 2)
179
+
180
+ // Build set of expected resources from server storage (plugin_client:* and plugin_server:*)
181
+ const expectedMcpKeys = new Set()
182
+ const expectedSpecKeys = new Set()
183
+
184
+ const clientPluginKeys = await storage.listKeys("plugin_client:")
185
+ const serverPluginKeys = await storage.listKeys("plugin_server:")
186
+
187
+ // Read client plugins
188
+ for (const key of clientPluginKeys) {
189
+ try {
190
+ const plugin = await storage.get(key)
191
+ if (plugin && plugin.server_resources && plugin.client_id) {
192
+ if (plugin.server_resources.mcp) {
193
+ for (const mcp of plugin.server_resources.mcp) {
194
+ expectedMcpKeys.add(`mcp:cli:${plugin.client_id}:${plugin.name}:${mcp.name}`)
195
+ }
196
+ }
197
+ if (plugin.server_resources.specs) {
198
+ for (const spec of plugin.server_resources.specs) {
199
+ expectedSpecKeys.add(`spec:cli:${plugin.client_id}:${plugin.name}:${spec.name}`)
200
+ }
201
+ }
202
+ }
203
+ } catch (err) {
204
+ // Skip if plugin read fails
205
+ }
206
+ }
207
+
208
+ // Read server plugins
209
+ for (const key of serverPluginKeys) {
210
+ try {
211
+ const plugin = await storage.get(key)
212
+ if (plugin && plugin.manifest && plugin.manifest.server_resources) {
213
+ if (plugin.manifest.server_resources.mcp) {
214
+ for (const mcp of plugin.manifest.server_resources.mcp) {
215
+ expectedMcpKeys.add(`mcp:server:${plugin.name}:${mcp.name}`)
216
+ }
217
+ }
218
+ if (plugin.manifest.server_resources.specs) {
219
+ for (const spec of plugin.manifest.server_resources.specs) {
220
+ expectedSpecKeys.add(`spec:server:${plugin.name}:${spec.name}`)
221
+ }
222
+ }
223
+ }
224
+ } catch (err) {
225
+ // Skip if plugin read fails
226
+ }
227
+ }
228
+
229
+ // Remove orphaned resources (no longer in any installed plugin)
230
+ const cleanupResults = { removedMcp: [], removedSpecs: [], errors: [] }
231
+
232
+ for (const key of pluginMcpKeys) {
233
+ if (!expectedMcpKeys.has(key)) {
234
+ try {
235
+ await storage.delete(key)
236
+ cleanupResults.removedMcp.push(key)
237
+ } catch (err) {
238
+ cleanupResults.errors.push(`Failed to remove orphaned MCP ${key}: ${err.message}`)
239
+ }
240
+ }
241
+ }
242
+
243
+ for (const key of pluginSpecKeys) {
244
+ if (!expectedSpecKeys.has(key)) {
245
+ try {
246
+ await storage.delete(key)
247
+ cleanupResults.removedSpecs.push(key)
248
+ } catch (err) {
249
+ cleanupResults.errors.push(`Failed to remove orphaned spec ${key}: ${err.message}`)
250
+ }
251
+ }
252
+ }
253
+
254
+ return cleanupResults
255
+ }
256
+
257
+ module.exports = {
258
+ registerPluginResources,
259
+ unregisterPluginResources,
260
+ registerAllPluginResources,
261
+ syncPluginResources
262
+ }
@@ -1,6 +1,7 @@
1
1
  const crypto = require("crypto")
2
2
  const { getStorage } = require("../storage/adapter")
3
3
  const { bumpVersion } = require("./configService")
4
+ const { registerPluginResources, unregisterPluginResources } = require("./pluginResourceService")
4
5
 
5
6
  const PLUGIN_PREFIX = "plugin_server:"
6
7
  const SETTINGS_KEY = "settings:plugins"
@@ -18,6 +19,8 @@ function defaultSettings() {
18
19
  max_zip_mb: 10,
19
20
  default_hooks_policy: "deny",
20
21
  admin_mode_enabled: false,
22
+ public_access: true,
23
+ api_keys: [],
21
24
  }
22
25
  }
23
26
 
@@ -119,6 +122,15 @@ async function updateSettings(patch = {}) {
119
122
  if (patch.admin_mode_enabled !== undefined) {
120
123
  next.admin_mode_enabled = patch.admin_mode_enabled === true || patch.admin_mode_enabled === "true"
121
124
  }
125
+ if (patch.public_access !== undefined) {
126
+ next.public_access = patch.public_access === true || patch.public_access === "true"
127
+ }
128
+ if (patch.api_keys !== undefined) {
129
+ if (!Array.isArray(patch.api_keys)) {
130
+ throw invalid("api_keys must be an array")
131
+ }
132
+ next.api_keys = patch.api_keys
133
+ }
122
134
  const storage = getStorage()
123
135
  await storage.set(SETTINGS_KEY, next)
124
136
  return next
@@ -194,6 +206,12 @@ async function upsertJsonPlugin(payload) {
194
206
  }
195
207
  const storage = getStorage()
196
208
  await storage.set(pluginKey(common.name), next)
209
+
210
+ // Register server resources if present
211
+ if (manifest.server_resources) {
212
+ await registerPluginResources(common.name, manifest.server_resources, "server")
213
+ }
214
+
197
215
  await bumpVersion()
198
216
  return toPublicPlugin(next)
199
217
  }
@@ -233,6 +251,12 @@ async function upsertZipPlugin(payload) {
233
251
  }
234
252
  const storage = getStorage()
235
253
  await storage.set(pluginKey(common.name), next)
254
+
255
+ // Register server resources if present
256
+ if (manifest.server_resources) {
257
+ await registerPluginResources(common.name, manifest.server_resources, "server")
258
+ }
259
+
236
260
  await bumpVersion()
237
261
  return toPublicPlugin(next)
238
262
  }
@@ -0,0 +1,47 @@
1
+ {
2
+ "openapi": "3.0.0",
3
+ "info": {
4
+ "title": "Superbackend API",
5
+ "version": "1.0.0"
6
+ },
7
+ "servers": [
8
+ {
9
+ "url": "https://superbackend.coolify.intrane.fr"
10
+ }
11
+ ],
12
+ "paths": {
13
+ "/health": {
14
+ "get": {
15
+ "operationId": "getHealth",
16
+ "summary": "Health check endpoint",
17
+ "description": "Returns the health status of the backend service",
18
+ "responses": {
19
+ "200": {
20
+ "description": "Health status",
21
+ "content": {
22
+ "application/json": {
23
+ "schema": {
24
+ "type": "object",
25
+ "properties": {
26
+ "status": {
27
+ "type": "string",
28
+ "example": "ok"
29
+ },
30
+ "mode": {
31
+ "type": "string",
32
+ "example": "middleware"
33
+ },
34
+ "database": {
35
+ "type": "string",
36
+ "example": "connected"
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ }
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "openapi": "3.0.0",
3
+ "info": {
4
+ "title": "Test Auth API",
5
+ "version": "1.0.0"
6
+ },
7
+ "servers": [
8
+ {
9
+ "url": "http://localhost:3001"
10
+ }
11
+ ],
12
+ "paths": {
13
+ "/api/data": {
14
+ "get": {
15
+ "operationId": "getData",
16
+ "summary": "Get authenticated data",
17
+ "description": "Returns data when authenticated with Bearer token",
18
+ "responses": {
19
+ "200": {
20
+ "description": "Success",
21
+ "content": {
22
+ "application/json": {
23
+ "schema": {
24
+ "type": "object",
25
+ "properties": {
26
+ "message": {
27
+ "type": "string"
28
+ },
29
+ "data": {
30
+ "type": "object"
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+ },
37
+ "401": {
38
+ "description": "Unauthorized"
39
+ },
40
+ "403": {
41
+ "description": "Forbidden"
42
+ }
43
+ }
44
+ }
45
+ },
46
+ "/api/key-data": {
47
+ "get": {
48
+ "operationId": "getKeyData",
49
+ "summary": "Get data with API key",
50
+ "description": "Returns data when authenticated with API key in X-Api-Key header",
51
+ "responses": {
52
+ "200": {
53
+ "description": "Success",
54
+ "content": {
55
+ "application/json": {
56
+ "schema": {
57
+ "type": "object",
58
+ "properties": {
59
+ "message": {
60
+ "type": "string"
61
+ },
62
+ "data": {
63
+ "type": "object"
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "openapi": "3.0.0",
3
+ "info": {
4
+ "title": "Test Auth API",
5
+ "version": "1.0.0"
6
+ },
7
+ "servers": [
8
+ {
9
+ "url": "https://httpbin.org"
10
+ }
11
+ ],
12
+ "paths": {
13
+ "/bearer": {
14
+ "get": {
15
+ "operationId": "testBearerAuth",
16
+ "summary": "Test bearer auth",
17
+ "responses": {
18
+ "200": {
19
+ "description": "Returns authorization header"
20
+ }
21
+ }
22
+ }
23
+ },
24
+ "/headers": {
25
+ "get": {
26
+ "operationId": "testHeaderAuth",
27
+ "summary": "Returns request headers",
28
+ "responses": {
29
+ "200": {
30
+ "description": "Returns headers"
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
@@ -25,6 +25,7 @@
25
25
  <tr><td colspan="5" class="px-6 py-12 text-center text-[#787774]">No adapters yet. Create one to get started.</td></tr>
26
26
  <% } %>
27
27
  <% adapters.forEach(a => { %>
28
+ <% if (!a.name) return; %>
28
29
  <tr class="border-b border-[#EAEAEA] hover:bg-[#F7F6F3] transition-colors">
29
30
  <td class="px-6 py-4">
30
31
  <div class="flex flex-col">
@@ -0,0 +1,82 @@
1
+ <%- include("partials/head", { title: "Clients" }) %>
2
+
3
+ <div id="clients-app">
4
+ <div class="flex justify-between items-center mb-8">
5
+ <div>
6
+ <p class="text-xs uppercase tracking-[0.2em] text-[#787774] mb-1">Monitoring</p>
7
+ <h1 class="text-2xl editorial-heading text-[#111111]">Connected Clients</h1>
8
+ <p class="text-sm text-[#787774] mt-1">CLI clients that have synced plugin resources to this server</p>
9
+ </div>
10
+ </div>
11
+
12
+ <div class="bento-card">
13
+ <div v-if="clients.length === 0" class="p-12 text-center text-[#787774]">
14
+ No clients have synced yet.
15
+ </div>
16
+
17
+ <table v-else class="min-w-full divide-y divide-[#EAEAEA]">
18
+ <thead class="bg-[#F7F6F3]">
19
+ <tr>
20
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Client ID</th>
21
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Last Seen</th>
22
+ <th class="px-6 py-3 text-left text-xs font-semibold text-[#787774] uppercase tracking-wider">Plugin Count</th>
23
+ </tr>
24
+ </thead>
25
+ <tbody class="bg-white divide-y divide-[#EAEAEA]">
26
+ <tr v-for="client in clients" :key="client.client_id" class="hover:bg-[#F7F6F3] transition-colors">
27
+ <td class="px-6 py-4">
28
+ <code class="mono-text text-sm text-[#1F6C9F]">{{ client.client_id.substring(0, 8) }}...</code>
29
+ </td>
30
+ <td class="px-6 py-4 text-sm text-[#2F3437]">
31
+ {{ formatLastSeen(client.last_seen) }}
32
+ </td>
33
+ <td class="px-6 py-4 text-sm text-[#2F3437]">
34
+ {{ client.plugin_count || 0 }}
35
+ </td>
36
+ </tr>
37
+ </tbody>
38
+ </table>
39
+ </div>
40
+ </div>
41
+
42
+ <script>
43
+ const { createApp } = Vue
44
+
45
+ createApp({
46
+ data() {
47
+ return {
48
+ clients: []
49
+ }
50
+ },
51
+ async mounted() {
52
+ await this.fetchClients()
53
+ },
54
+ methods: {
55
+ async fetchClients() {
56
+ try {
57
+ const r = await fetch('/api/plugins/clients?format=json')
58
+ const data = await r.json()
59
+ this.clients = data.clients || []
60
+ } catch (err) {
61
+ console.error('Failed to fetch clients:', err)
62
+ }
63
+ },
64
+ formatLastSeen(dateStr) {
65
+ if (!dateStr) return 'Never'
66
+ const date = new Date(dateStr)
67
+ const now = new Date()
68
+ const diffMs = now - date
69
+ const diffMins = Math.floor(diffMs / 60000)
70
+ const diffHours = Math.floor(diffMs / 3600000)
71
+ const diffDays = Math.floor(diffMs / 86400000)
72
+
73
+ if (diffMins < 1) return 'Just now'
74
+ if (diffMins < 60) return `${diffMins} min ago`
75
+ if (diffHours < 24) return `${diffHours}h ago`
76
+ if (diffDays < 7) return `${diffDays}d ago`
77
+ return date.toLocaleDateString()
78
+ }
79
+ }
80
+ }).mount('#clients-app')
81
+ </script>
82
+
@@ -0,0 +1,7 @@
1
+ <%- include("partials/head", { title: "Documentation" }) %>
2
+
3
+ <div id="docs-container">
4
+ <%- bodyContent %>
5
+ </div>
6
+
7
+ <%- include("partials/foot") %>
@@ -34,10 +34,11 @@
34
34
  <th>Status</th>
35
35
  <th>Duration</th>
36
36
  <th>Timestamp</th>
37
+ <th>Client</th>
37
38
  </tr>
38
39
  </thead>
39
40
  <tbody>
40
- <tr v-if="jobs.length===0"><td colspan="4" class="text-center opacity-60">No executions recorded yet.</td></tr>
41
+ <tr v-if="jobs.length===0"><td colspan="5" class="text-center opacity-60">No executions recorded yet.</td></tr>
41
42
  <tr v-for="j in jobs" :key="j._id">
42
43
  <td><code>{{ j.command }}</code></td>
43
44
  <td>
@@ -46,7 +47,15 @@
46
47
  </span>
47
48
  </td>
48
49
  <td>{{ j.duration_ms }}ms</td>
49
- <td class="opacity-70">{{ new Date(j.timestamp).toLocaleString() }}</td>
50
+ <td class="opacity-70">
51
+ <span :title="new Date(j.timestamp).toLocaleString()" class="cursor-help">
52
+ {{ formatRelativeTime(j.timestamp) }}
53
+ </span>
54
+ </td>
55
+ <td class="opacity-70">
56
+ <code v-if="j.client_id" class="text-xs">{{ j.client_id.substring(0, 8) }}...</code>
57
+ <span v-else class="text-xs opacity-50">-</span>
58
+ </td>
50
59
  </tr>
51
60
  </tbody>
52
61
  </table>
@@ -64,6 +73,21 @@
64
73
  async loadStats() {
65
74
  const r = await fetch('/api/jobs/stats')
66
75
  this.stats = await r.json()
76
+ },
77
+ formatRelativeTime(dateStr) {
78
+ if (!dateStr) return 'Never'
79
+ const date = new Date(dateStr)
80
+ const now = new Date()
81
+ const diffMs = now - date
82
+ const diffMins = Math.floor(diffMs / 60000)
83
+ const diffHours = Math.floor(diffMs / 3600000)
84
+ const diffDays = Math.floor(diffMs / 86400000)
85
+
86
+ if (diffMins < 1) return 'Just now'
87
+ if (diffMins < 60) return `${diffMins}m ago`
88
+ if (diffHours < 24) return `${diffHours}h ago`
89
+ if (diffDays < 7) return `${diffDays}d ago`
90
+ return date.toLocaleDateString()
67
91
  }
68
92
  }
69
93
  }).mount('#jobs-app')
@@ -88,29 +88,6 @@
88
88
  <body>
89
89
 
90
90
  <div class="flex min-h-screen">
91
- <!-- Sidebar -->
92
- <aside class="w-64 bg-white p-6 flex flex-col gap-2 border-r border-[#EAEAEA]">
93
- <a href="/api/commands" class="text-xl editorial-heading px-3 py-2 mb-6 flex items-center gap-2">
94
- <span>⚡</span> SUPERCLI
95
- </a>
96
- <a href="/" class="btn justify-start">Dashboard</a>
97
- <a href="/api/commands" class="btn justify-start <%= typeof commands !== 'undefined' ? 'nav-active' : '' %>">
98
- Commands
99
- </a>
100
- <a href="/api/specs" class="btn justify-start <%= typeof specs !== 'undefined' ? 'nav-active' : '' %>">
101
- OpenAPI Specs
102
- </a>
103
- <a href="/api/mcp" class="btn justify-start <%= typeof servers !== 'undefined' ? 'nav-active' : '' %>">
104
- MCP Servers
105
- </a>
106
- <a href="/api/jobs" class="btn justify-start <%= typeof jobs !== 'undefined' ? 'nav-active' : '' %>">
107
- Jobs
108
- </a>
109
- <a href="/api/plugins" class="btn justify-start <%= typeof plugins !== 'undefined' ? 'nav-active' : '' %>">
110
- Plugins
111
- </a>
112
- </aside>
113
-
114
91
  <!-- Main content -->
115
92
  <main class="flex-1 p-8 bg-[#FBFBFA]">
116
93
  <%- body %>