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.
- package/.beads/.br_history/{issues.20260426_162712_190824905.jsonl → issues.20260427_104606_658098709.jsonl} +49 -48
- package/.beads/.br_history/{issues.20260426_162513_726336785.jsonl → issues.20260427_104607_085798670.jsonl} +50 -48
- package/.beads/.br_history/{issues.20260426_162331_516939737.jsonl → issues.20260427_104607_627598880.jsonl} +51 -48
- package/.beads/.br_history/{issues.20260426_134150_938793400.jsonl → issues.20260427_104608_071298223.jsonl} +52 -48
- package/.beads/.br_history/issues.20260427_104615_198124329.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104615_669652069.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104637_752744777.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104638_209211116.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104638_898729442.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104639_368827997.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104639_823343822.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104640_354170001.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104640_937129660.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104647_408876191.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104659_300660476.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104800_415120762.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_104901_529669396.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_105002_587183822.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_105103_686748531.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_105204_721591044.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_105305_855661211.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_105407_641630152.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_105509_159649245.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_105610_283950586.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_105637_656057143.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_105738_863187883.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_105839_958463404.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_105941_092827317.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_110042_110436110.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_110143_343801118.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_110244_379134729.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_110345_445658284.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_110446_689391882.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_110547_667705716.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_110609_987816377.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_110711_086550915.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_110812_204821395.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_110913_259688311.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_111014_297775509.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_111115_195150935.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_111216_316259530.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_111317_298020330.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_111418_604431267.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_111519_617870969.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_111533_024097015.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_111634_138814655.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_111737_148398766.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_111838_507704112.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_111939_468325527.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_112041_044923744.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_112142_224127430.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_112243_212317525.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_112344_182300930.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_112445_197922899.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_112502_597304488.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_112604_292832651.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_112706_051581607.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_112807_066213762.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_112908_145315373.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_113009_141079023.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_113110_601071412.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_113211_601412739.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_113312_771171767.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_113413_719165420.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_113430_416576564.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_113531_553842703.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_113633_137526241.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_113735_697152101.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_113836_810884202.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_113938_312284719.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_114039_390178502.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_114140_483586632.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_114241_502376670.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_114342_927243830.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_114405_996651227.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_114507_946708398.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_114608_914493506.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_114709_935565841.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_114810_981588378.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_114912_061702372.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115013_063113906.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115114_208497343.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115215_176080241.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115316_481573328.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115335_866978652.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115436_866087391.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115538_016094860.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115638_932947449.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115739_982932603.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115840_963681039.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_115941_912431509.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_120043_043356448.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_120144_955596968.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_120246_060733977.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_120307_717985017.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_120408_871846736.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_121003_963750732.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_121006_018509431.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_121019_617062931.jsonl +261 -0
- package/.beads/.br_history/issues.20260427_121021_689536311.jsonl +261 -0
- package/.beads/.br_recovery/beads.db-wal.20260427_104615_902749843.rebuild-failed +0 -0
- package/.beads/.br_recovery/beads.db-wal.20260427_121006_010373120.rebuild-failed +0 -0
- package/.beads/.br_recovery/beads.db.20260427_104615_902749843.rebuild-failed +0 -0
- package/.beads/.br_recovery/beads.db.20260427_121006_010373120.rebuild-failed +0 -0
- package/.beads/beads.db.corrupted +0 -0
- package/.beads/issues.jsonl +144 -144
- package/.supercli/adapters/test-cli-adapter.js +19 -0
- package/cli/adapters/mcp.js +89 -3
- package/cli/adapters/openapi.js +71 -2
- package/cli/config.js +69 -1
- package/cli/daemon.js +349 -0
- package/cli/plugins-manager.js +42 -9
- package/cli/server-command.js +174 -4
- package/cli/supercli.js +35 -15
- package/docs/changelog-2026-04.html +6 -0
- package/docs/index.html +94 -11
- package/docs/plugins.html +30 -0
- package/docs/server.md +80 -0
- package/graphify-out/GRAPH_REPORT.md +154 -162
- package/graphify-out/cache/11938479cfbdb8e52bf5f0f3c132d56204245ebb19aefe89bb0394feb36dbd5e.json +1 -0
- package/graphify-out/cache/141362b25039dee7a4959ef475befea0a25671aae66f3d14917e711e597ffbf6.json +1 -0
- package/graphify-out/cache/2f23b1be3f6434f60138a04261d83ca71b128f405bd68fb19abf48cd61108dfc.json +1 -0
- package/graphify-out/cache/362adb1b6b483f56d09feaf652f4122366e568aaede752f48383b76d61f5d9d6.json +1 -0
- package/graphify-out/cache/42bc8f64d69d2cd9ecf64e92e38f89f7ea479f69c947de5984919e2fd5a716ee.json +1 -0
- package/graphify-out/cache/4b5cffce31d9193b7d0a8f15e8a41c66f6733a6490ebaeff2c8ca19701c72c0e.json +1 -0
- package/graphify-out/cache/5ef4e31750d9e7bc4ff4a7b535f247d9ab5ab9627d72e20794779ec4be424c66.json +1 -0
- package/graphify-out/cache/6d5023ecffa52382d31152c8c06e86e286789228a3d4f7fde72087f3eafa11bc.json +1 -0
- package/graphify-out/cache/6e5776e123142a78f50fa0bfd5ae2d289282051a9b392ae507de7aa9017f95d4.json +1 -0
- package/graphify-out/cache/75982dc60fa7353600ca48a3b33f5ba497eea9d5743daac6e61e9cf4f64774be.json +1 -0
- package/graphify-out/cache/7796066b51d3a99071debdfb5f40c854400b5bf3aa7c1e83dd6ae88eddca0370.json +1 -0
- package/graphify-out/cache/8ccd3b557a1ea98005fba84433f160ccd4a951fbdb6a4c9b7d7ba894f905b06b.json +1 -0
- package/graphify-out/cache/90ab53b8f1f3306e7c3a1f92ec628717ea90f4e684db764f7d7aa8e884fe2cae.json +1 -0
- package/graphify-out/cache/99c8133d0ccf5bf29a0a03caa6811d2ff8d73bcccf20681687876c890b94740e.json +1 -0
- package/graphify-out/cache/9fa6604cc820f3857c55c753ca0024788e4cbb61c4e12ba7ce0e4a1ce4ee0655.json +1 -0
- package/graphify-out/cache/a1e24a07beede2876e688cdb6c14e2d24abb22064862a6420cac321efabd3efd.json +1 -0
- package/graphify-out/cache/a418312f2805259c33007a18b36b6ae3b6a4da376ccae6006a3b9999262495db.json +1 -0
- package/graphify-out/cache/a6d9c029bd31a99b67357291305e27b01c5ef388925f7f2a6e985fec4efa8024.json +1 -0
- package/graphify-out/cache/a6ed52b709dd79f98adf72c483e8dfb6098203d7327470b82feb5e11390a5cf4.json +1 -0
- package/graphify-out/cache/b045ae4443d972ee8f47b91a0d61c984a190195b38ae1d331430b4c51c43acfd.json +1 -0
- package/graphify-out/cache/bc514f4074f89d2f7e7834670602e50bba0f24b8cd8c9d21ff4d361d3fd4d558.json +1 -0
- package/graphify-out/cache/be3fc87936f9f24d2d4f4b22b9d2a16f33f538cef1a181663120e23ecf16b81a.json +1 -0
- package/graphify-out/cache/c5a4822edbe3a95a56f9f943eed1567e5a5c913d59b1fa3df4ad54ffd9b02697.json +1 -0
- package/graphify-out/cache/cf411f1ddde50ee97c1c501f59ed7985bcdc022134574816bcce37ac20848e64.json +1 -0
- package/graphify-out/cache/d88625b5813742ca941ce8155cb77afb02425632002f621aca34f217440a392d.json +1 -0
- package/graphify-out/cache/da97fdc8af2a3306c292921110f84648bba2b0e85d27473b460b0e8a862ff225.json +1 -0
- package/graphify-out/cache/e88de9f1ae117f26fd217c3717eff7e525a284cc942b5f4d26ef2c4d65db59bd.json +1 -0
- package/graphify-out/cache/ebf6bd96ef2d8d396389ac7199e6ba818ee2d0c5dfc131fab7cdece9fb710f11.json +1 -0
- package/graphify-out/cache/f2a302550a6fe0649d36b8ef0b04b77673bca9f115732af8ae89751944dc9cc6.json +1 -0
- package/graphify-out/cache/fb46bd3ef530273918fc8915842453f21b418d536653d3b705b75b417255c246.json +1 -0
- package/graphify-out/cache/fcfdab94fe91af1f21fcefdba5a96674b9a16bb768288f3573fe68765163c765.json +1 -0
- package/graphify-out/graph.json +2669 -1121
- package/package.json +1 -1
- package/plugins/context-mode/plugin.json +10 -0
- package/plugins/context-mode/scripts/post-install.js +1 -1
- package/plugins/example-server-resources/meta.json +11 -0
- package/plugins/example-server-resources/plugin.json +46 -0
- package/server/app.js +43 -11
- package/server/middleware/auth.js +70 -0
- package/server/routes/adapters.js +3 -11
- package/server/routes/docs.js +10 -0
- package/server/routes/jobs.js +3 -2
- package/server/routes/mcp.js +1 -0
- package/server/routes/plugins.js +209 -10
- package/server/routes/specs.js +8 -3
- package/server/services/adaptersService.js +1 -0
- package/server/services/pluginResourceService.js +262 -0
- package/server/services/pluginsService.js +24 -0
- package/server/uploads/superbackend-openapi.json +47 -0
- package/server/uploads/test-auth-openapi.json +74 -0
- package/server/uploads/test-auth-spec.json +36 -0
- package/server/views/adapters.ejs +1 -0
- package/server/views/clients.ejs +82 -0
- package/server/views/docs.ejs +7 -0
- package/server/views/jobs.ejs +26 -2
- package/server/views/layout.ejs +0 -23
- package/server/views/mcp.ejs +278 -21
- package/server/views/partials/head.ejs +2 -0
- package/server/views/plugins.ejs +81 -1
- package/server/views/specs.ejs +217 -22
- package/.beads/.br_history/issues.20260424_173219_825545950.jsonl +0 -161
- package/.beads/.br_history/issues.20260424_173236_386891868.jsonl +0 -162
- package/.beads/.br_history/issues.20260424_174502_086707155.jsonl +0 -163
- package/.beads/.br_history/issues.20260424_174510_654230822.jsonl +0 -164
- package/.beads/.br_history/issues.20260424_174517_409774596.jsonl +0 -165
- package/.beads/.br_history/issues.20260424_174523_607561636.jsonl +0 -166
- package/.beads/.br_history/issues.20260424_174532_546016322.jsonl +0 -167
- package/.beads/.br_history/issues.20260424_175209_319624367.jsonl +0 -168
- package/.beads/.br_history/issues.20260424_175214_798999893.jsonl +0 -169
- package/.beads/.br_history/issues.20260424_175217_989449734.jsonl +0 -170
- package/.beads/.br_history/issues.20260424_175221_701416034.jsonl +0 -171
- package/.beads/.br_history/issues.20260424_175225_550538874.jsonl +0 -172
- package/.beads/.br_history/issues.20260424_180143_241956058.jsonl +0 -173
- package/.beads/.br_history/issues.20260424_180153_817576164.jsonl +0 -174
- package/.beads/.br_history/issues.20260424_180201_739387030.jsonl +0 -175
- package/.beads/.br_history/issues.20260424_180213_488389024.jsonl +0 -176
- package/.beads/.br_history/issues.20260424_180221_754279177.jsonl +0 -177
- package/.beads/.br_history/issues.20260424_181149_604365436.jsonl +0 -178
- package/.beads/.br_history/issues.20260424_181158_931468591.jsonl +0 -179
- package/.beads/.br_history/issues.20260424_181209_516766803.jsonl +0 -180
- package/.beads/.br_history/issues.20260424_181219_459169740.jsonl +0 -181
- package/.beads/.br_history/issues.20260424_181227_996490697.jsonl +0 -182
- package/.beads/.br_history/issues.20260424_181958_717811271.jsonl +0 -183
- package/.beads/.br_history/issues.20260424_182002_913828749.jsonl +0 -184
- package/.beads/.br_history/issues.20260424_182006_779786523.jsonl +0 -185
- package/.beads/.br_history/issues.20260424_182010_368190795.jsonl +0 -186
- package/.beads/.br_history/issues.20260424_182016_217217108.jsonl +0 -187
- package/.beads/.br_history/issues.20260424_182539_287444292.jsonl +0 -188
- package/.beads/.br_history/issues.20260424_182543_343189534.jsonl +0 -189
- package/.beads/.br_history/issues.20260424_182547_119975837.jsonl +0 -190
- package/.beads/.br_history/issues.20260424_182550_849315940.jsonl +0 -191
- package/.beads/.br_history/issues.20260424_182554_677413036.jsonl +0 -192
- package/.beads/.br_history/issues.20260424_183140_390494612.jsonl +0 -193
- package/.beads/.br_history/issues.20260424_183144_266256714.jsonl +0 -194
- package/.beads/.br_history/issues.20260424_183152_839579876.jsonl +0 -195
- package/.beads/.br_history/issues.20260424_183202_355634088.jsonl +0 -196
- package/.beads/.br_history/issues.20260424_183209_438616861.jsonl +0 -197
- package/.beads/.br_history/issues.20260424_183753_517602948.jsonl +0 -198
- package/.beads/.br_history/issues.20260424_183757_533544458.jsonl +0 -199
- package/.beads/.br_history/issues.20260424_183803_063929316.jsonl +0 -200
- package/.beads/.br_history/issues.20260424_183807_014724964.jsonl +0 -201
- package/.beads/.br_history/issues.20260424_183813_278844212.jsonl +0 -202
- package/.beads/.br_history/issues.20260424_190900_876564388.jsonl +0 -203
- package/.beads/.br_history/issues.20260424_192047_121286991.jsonl +0 -204
- package/.beads/.br_history/issues.20260424_192811_866934994.jsonl +0 -205
- package/.beads/.br_history/issues.20260424_193837_426102367.jsonl +0 -206
- package/.beads/.br_history/issues.20260424_194617_271952813.jsonl +0 -207
- package/.beads/.br_history/issues.20260424_195430_952967644.jsonl +0 -208
- package/.beads/.br_history/issues.20260424_200234_439280977.jsonl +0 -209
- package/.beads/.br_history/issues.20260424_200923_545127361.jsonl +0 -210
- package/.beads/.br_history/issues.20260424_204056_586059018.jsonl +0 -211
- package/.beads/.br_history/issues.20260424_205301_854556209.jsonl +0 -212
- package/.beads/.br_history/issues.20260424_210455_501610650.jsonl +0 -213
- package/.beads/.br_history/issues.20260424_212803_108840399.jsonl +0 -214
- package/.beads/.br_history/issues.20260425_045812_041336580.jsonl +0 -215
- package/.beads/.br_history/issues.20260425_045914_762139232.jsonl +0 -216
- package/.beads/.br_history/issues.20260425_050011_038094726.jsonl +0 -217
- package/.beads/.br_history/issues.20260425_050140_047103928.jsonl +0 -218
- package/.beads/.br_history/issues.20260425_054328_968771145.jsonl +0 -219
- package/.beads/.br_history/issues.20260425_054419_800564203.jsonl +0 -220
- package/.beads/.br_history/issues.20260425_054543_771812828.jsonl +0 -221
- package/.beads/.br_history/issues.20260425_054648_963773974.jsonl +0 -222
- package/.beads/.br_history/issues.20260425_054751_122349828.jsonl +0 -223
- package/.beads/.br_history/issues.20260425_060749_403415856.jsonl +0 -224
- package/.beads/.br_history/issues.20260425_062503_208821903.jsonl +0 -225
- package/.beads/.br_history/issues.20260425_063134_587505560.jsonl +0 -226
- package/.beads/.br_history/issues.20260425_064005_565019560.jsonl +0 -227
- package/.beads/.br_history/issues.20260425_064651_250053752.jsonl +0 -228
- package/.beads/.br_history/issues.20260425_065904_323410469.jsonl +0 -229
- package/.beads/.br_history/issues.20260425_070603_854872783.jsonl +0 -230
- package/.beads/.br_history/issues.20260425_071232_499550581.jsonl +0 -231
- package/.beads/.br_history/issues.20260425_071859_753108611.jsonl +0 -232
- package/.beads/.br_history/issues.20260425_171215_558114276.jsonl +0 -233
- package/.beads/.br_history/issues.20260425_171228_711028872.jsonl +0 -234
- package/.beads/.br_history/issues.20260425_171908_608455863.jsonl +0 -235
- package/.beads/.br_history/issues.20260425_172952_108071113.jsonl +0 -236
- package/.beads/.br_history/issues.20260425_200313_037876111.jsonl +0 -237
- package/.beads/.br_history/issues.20260425_201117_411540946.jsonl +0 -238
- package/.beads/.br_history/issues.20260425_210522_892936637.jsonl +0 -239
- package/.beads/.br_history/issues.20260425_210949_356368198.jsonl +0 -240
- package/.beads/.br_history/issues.20260425_211617_355720902.jsonl +0 -241
- package/.beads/.br_history/issues.20260425_213515_555595766.jsonl +0 -242
- package/.beads/.br_history/issues.20260425_214642_203845514.jsonl +0 -243
- package/.beads/.br_history/issues.20260425_221221_451474472.jsonl +0 -244
- package/.beads/.br_history/issues.20260425_222608_800503496.jsonl +0 -245
- package/.beads/.br_history/issues.20260426_071735_330251998.jsonl +0 -246
- package/.beads/.br_history/issues.20260426_071755_925764854.jsonl +0 -247
- package/.beads/.br_history/issues.20260426_071818_936440407.jsonl +0 -248
- package/.beads/.br_history/issues.20260426_071834_033200504.jsonl +0 -249
- package/.beads/.br_history/issues.20260426_072406_524696668.jsonl +0 -250
- package/.beads/.br_history/issues.20260426_073231_913315951.jsonl +0 -251
- package/.beads/.br_history/issues.20260426_074828_051470117.jsonl +0 -252
- package/.beads/.br_history/issues.20260426_080300_773872374.jsonl +0 -253
- package/.beads/.br_history/issues.20260426_121735_535252712.jsonl +0 -254
- package/.beads/.br_history/issues.20260426_125144_933153546.jsonl +0 -255
- package/.beads/.br_history/issues.20260426_132438_591463320.jsonl +0 -256
- /package/.beads/.br_history/{issues.20260424_173219_825545950.jsonl.meta.json → issues.20260427_104606_658098709.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_173236_386891868.jsonl.meta.json → issues.20260427_104607_085798670.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_174502_086707155.jsonl.meta.json → issues.20260427_104607_627598880.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_174510_654230822.jsonl.meta.json → issues.20260427_104608_071298223.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_174517_409774596.jsonl.meta.json → issues.20260427_104615_198124329.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_174523_607561636.jsonl.meta.json → issues.20260427_104615_669652069.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_174532_546016322.jsonl.meta.json → issues.20260427_104637_752744777.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_175209_319624367.jsonl.meta.json → issues.20260427_104638_209211116.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_175214_798999893.jsonl.meta.json → issues.20260427_104638_898729442.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_175217_989449734.jsonl.meta.json → issues.20260427_104639_368827997.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_175221_701416034.jsonl.meta.json → issues.20260427_104639_823343822.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_175225_550538874.jsonl.meta.json → issues.20260427_104640_354170001.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_180143_241956058.jsonl.meta.json → issues.20260427_104640_937129660.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_180153_817576164.jsonl.meta.json → issues.20260427_104647_408876191.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_180201_739387030.jsonl.meta.json → issues.20260427_104659_300660476.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_180213_488389024.jsonl.meta.json → issues.20260427_104800_415120762.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_180221_754279177.jsonl.meta.json → issues.20260427_104901_529669396.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_181149_604365436.jsonl.meta.json → issues.20260427_105002_587183822.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_181158_931468591.jsonl.meta.json → issues.20260427_105103_686748531.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_181209_516766803.jsonl.meta.json → issues.20260427_105204_721591044.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_181219_459169740.jsonl.meta.json → issues.20260427_105305_855661211.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_181227_996490697.jsonl.meta.json → issues.20260427_105407_641630152.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_181958_717811271.jsonl.meta.json → issues.20260427_105509_159649245.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_182002_913828749.jsonl.meta.json → issues.20260427_105610_283950586.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_182006_779786523.jsonl.meta.json → issues.20260427_105637_656057143.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_182010_368190795.jsonl.meta.json → issues.20260427_105738_863187883.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_182016_217217108.jsonl.meta.json → issues.20260427_105839_958463404.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_182539_287444292.jsonl.meta.json → issues.20260427_105941_092827317.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_182543_343189534.jsonl.meta.json → issues.20260427_110042_110436110.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_182547_119975837.jsonl.meta.json → issues.20260427_110143_343801118.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_182550_849315940.jsonl.meta.json → issues.20260427_110244_379134729.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_182554_677413036.jsonl.meta.json → issues.20260427_110345_445658284.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_183140_390494612.jsonl.meta.json → issues.20260427_110446_689391882.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_183144_266256714.jsonl.meta.json → issues.20260427_110547_667705716.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_183152_839579876.jsonl.meta.json → issues.20260427_110609_987816377.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_183202_355634088.jsonl.meta.json → issues.20260427_110711_086550915.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_183209_438616861.jsonl.meta.json → issues.20260427_110812_204821395.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_183753_517602948.jsonl.meta.json → issues.20260427_110913_259688311.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_183757_533544458.jsonl.meta.json → issues.20260427_111014_297775509.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_183803_063929316.jsonl.meta.json → issues.20260427_111115_195150935.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_183807_014724964.jsonl.meta.json → issues.20260427_111216_316259530.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_183813_278844212.jsonl.meta.json → issues.20260427_111317_298020330.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_190900_876564388.jsonl.meta.json → issues.20260427_111418_604431267.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_192047_121286991.jsonl.meta.json → issues.20260427_111519_617870969.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_192811_866934994.jsonl.meta.json → issues.20260427_111533_024097015.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_193837_426102367.jsonl.meta.json → issues.20260427_111634_138814655.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_194617_271952813.jsonl.meta.json → issues.20260427_111737_148398766.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_195430_952967644.jsonl.meta.json → issues.20260427_111838_507704112.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_200234_439280977.jsonl.meta.json → issues.20260427_111939_468325527.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_200923_545127361.jsonl.meta.json → issues.20260427_112041_044923744.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_204056_586059018.jsonl.meta.json → issues.20260427_112142_224127430.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_205301_854556209.jsonl.meta.json → issues.20260427_112243_212317525.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_210455_501610650.jsonl.meta.json → issues.20260427_112344_182300930.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260424_212803_108840399.jsonl.meta.json → issues.20260427_112445_197922899.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_045812_041336580.jsonl.meta.json → issues.20260427_112502_597304488.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_045914_762139232.jsonl.meta.json → issues.20260427_112604_292832651.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_050011_038094726.jsonl.meta.json → issues.20260427_112706_051581607.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_050140_047103928.jsonl.meta.json → issues.20260427_112807_066213762.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_054328_968771145.jsonl.meta.json → issues.20260427_112908_145315373.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_054419_800564203.jsonl.meta.json → issues.20260427_113009_141079023.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_054543_771812828.jsonl.meta.json → issues.20260427_113110_601071412.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_054648_963773974.jsonl.meta.json → issues.20260427_113211_601412739.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_054751_122349828.jsonl.meta.json → issues.20260427_113312_771171767.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_060749_403415856.jsonl.meta.json → issues.20260427_113413_719165420.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_062503_208821903.jsonl.meta.json → issues.20260427_113430_416576564.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_063134_587505560.jsonl.meta.json → issues.20260427_113531_553842703.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_064005_565019560.jsonl.meta.json → issues.20260427_113633_137526241.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_064651_250053752.jsonl.meta.json → issues.20260427_113735_697152101.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_065904_323410469.jsonl.meta.json → issues.20260427_113836_810884202.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_070603_854872783.jsonl.meta.json → issues.20260427_113938_312284719.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_071232_499550581.jsonl.meta.json → issues.20260427_114039_390178502.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_071859_753108611.jsonl.meta.json → issues.20260427_114140_483586632.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_171215_558114276.jsonl.meta.json → issues.20260427_114241_502376670.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_171228_711028872.jsonl.meta.json → issues.20260427_114342_927243830.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_171908_608455863.jsonl.meta.json → issues.20260427_114405_996651227.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_172952_108071113.jsonl.meta.json → issues.20260427_114507_946708398.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_200313_037876111.jsonl.meta.json → issues.20260427_114608_914493506.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_201117_411540946.jsonl.meta.json → issues.20260427_114709_935565841.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_210522_892936637.jsonl.meta.json → issues.20260427_114810_981588378.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_210949_356368198.jsonl.meta.json → issues.20260427_114912_061702372.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_211617_355720902.jsonl.meta.json → issues.20260427_115013_063113906.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_213515_555595766.jsonl.meta.json → issues.20260427_115114_208497343.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_214642_203845514.jsonl.meta.json → issues.20260427_115215_176080241.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_221221_451474472.jsonl.meta.json → issues.20260427_115316_481573328.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260425_222608_800503496.jsonl.meta.json → issues.20260427_115335_866978652.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_071735_330251998.jsonl.meta.json → issues.20260427_115436_866087391.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_071755_925764854.jsonl.meta.json → issues.20260427_115538_016094860.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_071818_936440407.jsonl.meta.json → issues.20260427_115638_932947449.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_071834_033200504.jsonl.meta.json → issues.20260427_115739_982932603.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_072406_524696668.jsonl.meta.json → issues.20260427_115840_963681039.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_073231_913315951.jsonl.meta.json → issues.20260427_115941_912431509.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_074828_051470117.jsonl.meta.json → issues.20260427_120043_043356448.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_080300_773872374.jsonl.meta.json → issues.20260427_120144_955596968.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_121735_535252712.jsonl.meta.json → issues.20260427_120246_060733977.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_125144_933153546.jsonl.meta.json → issues.20260427_120307_717985017.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_132438_591463320.jsonl.meta.json → issues.20260427_120408_871846736.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_134150_938793400.jsonl.meta.json → issues.20260427_121003_963750732.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_162331_516939737.jsonl.meta.json → issues.20260427_121006_018509431.jsonl.meta.json} +0 -0
- /package/.beads/.br_history/{issues.20260426_162513_726336785.jsonl.meta.json → issues.20260427_121019_617062931.jsonl.meta.json} +0 -0
- /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
|
+
|
package/server/views/jobs.ejs
CHANGED
|
@@ -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="
|
|
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">
|
|
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')
|
package/server/views/layout.ejs
CHANGED
|
@@ -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 %>
|