mcpmake 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/dist/commands/bundle.d.ts +1 -0
  2. package/dist/commands/bundle.d.ts.map +1 -0
  3. package/dist/commands/bundle.js +5 -4
  4. package/dist/commands/bundle.js.map +1 -0
  5. package/dist/commands/ci.d.ts +1 -0
  6. package/dist/commands/ci.d.ts.map +1 -0
  7. package/dist/commands/ci.js +3 -2
  8. package/dist/commands/ci.js.map +1 -0
  9. package/dist/commands/deploy.d.ts +1 -0
  10. package/dist/commands/deploy.d.ts.map +1 -0
  11. package/dist/commands/deploy.js +4 -3
  12. package/dist/commands/deploy.js.map +1 -0
  13. package/dist/commands/diff.d.ts +1 -0
  14. package/dist/commands/diff.d.ts.map +1 -0
  15. package/dist/commands/diff.js +5 -4
  16. package/dist/commands/diff.js.map +1 -0
  17. package/dist/commands/from/describe.d.ts +1 -0
  18. package/dist/commands/from/describe.d.ts.map +1 -0
  19. package/dist/commands/from/describe.js +11 -10
  20. package/dist/commands/from/describe.js.map +1 -0
  21. package/dist/commands/from/har.d.ts +1 -0
  22. package/dist/commands/from/har.d.ts.map +1 -0
  23. package/dist/commands/from/har.js +14 -13
  24. package/dist/commands/from/har.js.map +1 -0
  25. package/dist/commands/from/openapi.d.ts +1 -0
  26. package/dist/commands/from/openapi.d.ts.map +1 -0
  27. package/dist/commands/from/openapi.js +17 -16
  28. package/dist/commands/from/openapi.js.map +1 -0
  29. package/dist/commands/from/postman.d.ts +1 -0
  30. package/dist/commands/from/postman.d.ts.map +1 -0
  31. package/dist/commands/from/postman.js +13 -12
  32. package/dist/commands/from/postman.js.map +1 -0
  33. package/dist/commands/from/stainless.d.ts +110 -0
  34. package/dist/commands/from/stainless.d.ts.map +1 -0
  35. package/dist/commands/from/stainless.js +272 -0
  36. package/dist/commands/from/stainless.js.map +1 -0
  37. package/dist/commands/from/target-support.d.ts +1 -0
  38. package/dist/commands/from/target-support.d.ts.map +1 -0
  39. package/dist/commands/from/target-support.js +2 -1
  40. package/dist/commands/from/target-support.js.map +1 -0
  41. package/dist/commands/from/url.d.ts +1 -0
  42. package/dist/commands/from/url.d.ts.map +1 -0
  43. package/dist/commands/from/url.js +14 -13
  44. package/dist/commands/from/url.js.map +1 -0
  45. package/dist/commands/from/website.d.ts +1 -0
  46. package/dist/commands/from/website.d.ts.map +1 -0
  47. package/dist/commands/from/website.js +17 -16
  48. package/dist/commands/from/website.js.map +1 -0
  49. package/dist/commands/lint.d.ts +1 -0
  50. package/dist/commands/lint.d.ts.map +1 -0
  51. package/dist/commands/lint.js +6 -5
  52. package/dist/commands/lint.js.map +1 -0
  53. package/dist/commands/merge.d.ts +1 -0
  54. package/dist/commands/merge.d.ts.map +1 -0
  55. package/dist/commands/merge.js +3 -2
  56. package/dist/commands/merge.js.map +1 -0
  57. package/dist/commands/publish.d.ts +1 -0
  58. package/dist/commands/publish.d.ts.map +1 -0
  59. package/dist/commands/publish.js +4 -3
  60. package/dist/commands/publish.js.map +1 -0
  61. package/dist/commands/rescan.d.ts +1 -0
  62. package/dist/commands/rescan.d.ts.map +1 -0
  63. package/dist/commands/rescan.js +12 -11
  64. package/dist/commands/rescan.js.map +1 -0
  65. package/dist/commands/update.d.ts +1 -0
  66. package/dist/commands/update.d.ts.map +1 -0
  67. package/dist/commands/update.js +10 -9
  68. package/dist/commands/update.js.map +1 -0
  69. package/dist/commands/verify.d.ts +1 -0
  70. package/dist/commands/verify.d.ts.map +1 -0
  71. package/dist/commands/verify.js +7 -6
  72. package/dist/commands/verify.js.map +1 -0
  73. package/dist/index.d.ts +1 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +23 -2
  76. package/dist/index.js.map +1 -0
  77. package/dist/registry/official-registry.d.ts +1 -0
  78. package/dist/registry/official-registry.d.ts.map +1 -0
  79. package/dist/registry/official-registry.js +1 -0
  80. package/dist/registry/official-registry.js.map +1 -0
  81. package/package.json +20 -46
  82. package/README.md +0 -691
  83. package/dist/analyzer/auth-detector.d.ts +0 -12
  84. package/dist/analyzer/auth-detector.js +0 -142
  85. package/dist/analyzer/dom-parser.d.ts +0 -10
  86. package/dist/analyzer/dom-parser.js +0 -259
  87. package/dist/analyzer/goal-crawler.d.ts +0 -25
  88. package/dist/analyzer/goal-crawler.js +0 -177
  89. package/dist/analyzer/hybrid-detector.d.ts +0 -28
  90. package/dist/analyzer/hybrid-detector.js +0 -96
  91. package/dist/analyzer/index.d.ts +0 -12
  92. package/dist/analyzer/index.js +0 -8
  93. package/dist/analyzer/screenshot-capture.d.ts +0 -29
  94. package/dist/analyzer/screenshot-capture.js +0 -42
  95. package/dist/analyzer/selector-builder.d.ts +0 -19
  96. package/dist/analyzer/selector-builder.js +0 -199
  97. package/dist/analyzer/semantic-analyzer.d.ts +0 -13
  98. package/dist/analyzer/semantic-analyzer.js +0 -145
  99. package/dist/analyzer/site-crawler.d.ts +0 -38
  100. package/dist/analyzer/site-crawler.js +0 -235
  101. package/dist/cloud/billing/billing-engine.d.ts +0 -44
  102. package/dist/cloud/billing/billing-engine.js +0 -81
  103. package/dist/cloud/billing/credit-store.d.ts +0 -64
  104. package/dist/cloud/billing/credit-store.js +0 -168
  105. package/dist/cloud/billing/index.d.ts +0 -4
  106. package/dist/cloud/billing/index.js +0 -2
  107. package/dist/cloud/billing/usage-store.d.ts +0 -42
  108. package/dist/cloud/billing/usage-store.js +0 -85
  109. package/dist/cloud/billing/usage-tracker.d.ts +0 -38
  110. package/dist/cloud/billing/usage-tracker.js +0 -95
  111. package/dist/cloud/build-pipeline.d.ts +0 -39
  112. package/dist/cloud/build-pipeline.js +0 -310
  113. package/dist/cloud/build-queue.d.ts +0 -30
  114. package/dist/cloud/build-queue.js +0 -70
  115. package/dist/cloud/caddy-manager.d.ts +0 -18
  116. package/dist/cloud/caddy-manager.js +0 -97
  117. package/dist/cloud/container-backend.d.ts +0 -62
  118. package/dist/cloud/container-backend.js +0 -59
  119. package/dist/cloud/container-manager.d.ts +0 -64
  120. package/dist/cloud/container-manager.js +0 -301
  121. package/dist/cloud/crypto.d.ts +0 -27
  122. package/dist/cloud/crypto.js +0 -63
  123. package/dist/cloud/db/index.d.ts +0 -27
  124. package/dist/cloud/db/index.js +0 -53
  125. package/dist/cloud/db/migrations.d.ts +0 -12
  126. package/dist/cloud/db/migrations.js +0 -329
  127. package/dist/cloud/db/pg-store.d.ts +0 -45
  128. package/dist/cloud/db/pg-store.js +0 -336
  129. package/dist/cloud/failure-tracker.d.ts +0 -51
  130. package/dist/cloud/failure-tracker.js +0 -102
  131. package/dist/cloud/idle-monitor.d.ts +0 -30
  132. package/dist/cloud/idle-monitor.js +0 -70
  133. package/dist/cloud/mailer.d.ts +0 -21
  134. package/dist/cloud/mailer.js +0 -193
  135. package/dist/cloud/mcp-proxy.d.ts +0 -58
  136. package/dist/cloud/mcp-proxy.js +0 -203
  137. package/dist/cloud/metric-samples.d.ts +0 -43
  138. package/dist/cloud/metric-samples.js +0 -85
  139. package/dist/cloud/metrics.d.ts +0 -26
  140. package/dist/cloud/metrics.js +0 -59
  141. package/dist/cloud/multipart.d.ts +0 -26
  142. package/dist/cloud/multipart.js +0 -132
  143. package/dist/cloud/observability.d.ts +0 -27
  144. package/dist/cloud/observability.js +0 -98
  145. package/dist/cloud/rate-limiter.d.ts +0 -31
  146. package/dist/cloud/rate-limiter.js +0 -58
  147. package/dist/cloud/request-security.d.ts +0 -5
  148. package/dist/cloud/request-security.js +0 -74
  149. package/dist/cloud/resource-monitor.d.ts +0 -69
  150. package/dist/cloud/resource-monitor.js +0 -130
  151. package/dist/cloud/secret-store.d.ts +0 -38
  152. package/dist/cloud/secret-store.js +0 -103
  153. package/dist/cloud/security.d.ts +0 -26
  154. package/dist/cloud/security.js +0 -142
  155. package/dist/cloud/server.d.ts +0 -21
  156. package/dist/cloud/server.js +0 -1079
  157. package/dist/cloud/shared-state.d.ts +0 -72
  158. package/dist/cloud/shared-state.js +0 -159
  159. package/dist/cloud/ssrf.d.ts +0 -43
  160. package/dist/cloud/ssrf.js +0 -150
  161. package/dist/cloud/store.d.ts +0 -41
  162. package/dist/cloud/store.js +0 -75
  163. package/dist/cloud/stripe.d.ts +0 -78
  164. package/dist/cloud/stripe.js +0 -317
  165. package/dist/cloud/telemetry-store.d.ts +0 -53
  166. package/dist/cloud/telemetry-store.js +0 -108
  167. package/dist/cloud/web/auth.d.ts +0 -225
  168. package/dist/cloud/web/auth.js +0 -555
  169. package/dist/cloud/web/charts.d.ts +0 -70
  170. package/dist/cloud/web/charts.js +0 -178
  171. package/dist/cloud/web/csrf.d.ts +0 -14
  172. package/dist/cloud/web/csrf.js +0 -22
  173. package/dist/cloud/web/docs.d.ts +0 -40
  174. package/dist/cloud/web/docs.js +0 -174
  175. package/dist/cloud/web/router.d.ts +0 -25
  176. package/dist/cloud/web/router.js +0 -1921
  177. package/dist/cloud/web/static/alpine.min.js +0 -5
  178. package/dist/cloud/web/static/favicon.svg +0 -4
  179. package/dist/cloud/web/static/htmx-sse.js +0 -290
  180. package/dist/cloud/web/static/htmx.min.js +0 -1
  181. package/dist/cloud/web/static/style.css +0 -2683
  182. package/dist/cloud/web/static-server.d.ts +0 -13
  183. package/dist/cloud/web/static-server.js +0 -73
  184. package/dist/cloud/web/template-engine.d.ts +0 -27
  185. package/dist/cloud/web/template-engine.js +0 -146
  186. package/dist/cloud/web/templates/layouts/admin.hbs +0 -57
  187. package/dist/cloud/web/templates/layouts/auth.hbs +0 -138
  188. package/dist/cloud/web/templates/layouts/base.hbs +0 -16
  189. package/dist/cloud/web/templates/layouts/dashboard.hbs +0 -39
  190. package/dist/cloud/web/templates/layouts/landing.hbs +0 -82
  191. package/dist/cloud/web/templates/pages/admin/overview.hbs +0 -123
  192. package/dist/cloud/web/templates/pages/admin/servers.hbs +0 -129
  193. package/dist/cloud/web/templates/pages/admin/telemetry.hbs +0 -39
  194. package/dist/cloud/web/templates/pages/admin/user-edit.hbs +0 -91
  195. package/dist/cloud/web/templates/pages/admin/users.hbs +0 -179
  196. package/dist/cloud/web/templates/pages/auth/forgot-password.hbs +0 -25
  197. package/dist/cloud/web/templates/pages/auth/login.hbs +0 -33
  198. package/dist/cloud/web/templates/pages/auth/register.hbs +0 -32
  199. package/dist/cloud/web/templates/pages/auth/reset-password.hbs +0 -34
  200. package/dist/cloud/web/templates/pages/dashboard/billing.hbs +0 -140
  201. package/dist/cloud/web/templates/pages/dashboard/create.hbs +0 -173
  202. package/dist/cloud/web/templates/pages/dashboard/index.hbs +0 -8
  203. package/dist/cloud/web/templates/pages/dashboard/server-detail.hbs +0 -280
  204. package/dist/cloud/web/templates/pages/dashboard/server-logs.hbs +0 -35
  205. package/dist/cloud/web/templates/pages/dashboard/server-metrics.hbs +0 -63
  206. package/dist/cloud/web/templates/pages/dashboard/servers-partial.hbs +0 -21
  207. package/dist/cloud/web/templates/pages/dashboard/servers.hbs +0 -44
  208. package/dist/cloud/web/templates/pages/docs/show.hbs +0 -16
  209. package/dist/cloud/web/templates/pages/errors/404.hbs +0 -9
  210. package/dist/cloud/web/templates/pages/errors/500.hbs +0 -8
  211. package/dist/cloud/web/templates/pages/landing/index.hbs +0 -223
  212. package/dist/cloud/web/templates/pages/legal/privacy.hbs +0 -71
  213. package/dist/cloud/web/templates/pages/legal/terms.hbs +0 -73
  214. package/dist/cloud/web/templates/partials/admin-stats.hbs +0 -52
  215. package/dist/cloud/web/templates/partials/flash-message.hbs +0 -6
  216. package/dist/cloud/web/templates/partials/pricing-table.hbs +0 -103
  217. package/dist/cloud/web/templates/partials/server-card.hbs +0 -19
  218. package/dist/cloud/web/templates/partials/status-badge.hbs +0 -1
  219. package/dist/config/configurable-command.d.ts +0 -13
  220. package/dist/config/configurable-command.js +0 -70
  221. package/dist/config/mcpmake-config.d.ts +0 -68
  222. package/dist/config/mcpmake-config.js +0 -207
  223. package/dist/docs/cli.md +0 -400
  224. package/dist/docs/mcp-2026-07-28-migration.md +0 -78
  225. package/dist/docs/migrate-from-stainless.md +0 -94
  226. package/dist/docs/quickstart.md +0 -166
  227. package/dist/docs/show-hn.md +0 -26
  228. package/dist/docs/website-servers.md +0 -169
  229. package/dist/emitter/code-writer.d.ts +0 -8
  230. package/dist/emitter/code-writer.js +0 -25
  231. package/dist/emitter/index.d.ts +0 -32
  232. package/dist/emitter/index.js +0 -280
  233. package/dist/emitter/mcpb-bundler.d.ts +0 -31
  234. package/dist/emitter/mcpb-bundler.js +0 -172
  235. package/dist/emitter/project-scaffolder.d.ts +0 -4
  236. package/dist/emitter/project-scaffolder.js +0 -89
  237. package/dist/emitter/python-template-loader.d.ts +0 -4
  238. package/dist/emitter/python-template-loader.js +0 -30
  239. package/dist/emitter/python-templates/dockerfile.hbs +0 -14
  240. package/dist/emitter/python-templates/env.example.hbs +0 -6
  241. package/dist/emitter/python-templates/requirements.txt.hbs +0 -4
  242. package/dist/emitter/python-templates/server.py.hbs +0 -77
  243. package/dist/emitter/site-scaffolder.d.ts +0 -13
  244. package/dist/emitter/site-scaffolder.js +0 -70
  245. package/dist/emitter/site-template-loader.d.ts +0 -5
  246. package/dist/emitter/site-template-loader.js +0 -47
  247. package/dist/emitter/site-templates/browser-manager.ts.hbs +0 -233
  248. package/dist/emitter/site-templates/config.ts.hbs +0 -28
  249. package/dist/emitter/site-templates/dockerfile.hbs +0 -31
  250. package/dist/emitter/site-templates/env.example.hbs +0 -19
  251. package/dist/emitter/site-templates/package.json.hbs +0 -26
  252. package/dist/emitter/site-templates/server-main-http.ts.hbs +0 -108
  253. package/dist/emitter/site-templates/server-main.ts.hbs +0 -23
  254. package/dist/emitter/site-templates/tool-handler-action.ts.hbs +0 -86
  255. package/dist/emitter/site-templates/tool-handler-form.ts.hbs +0 -116
  256. package/dist/emitter/site-templates/tool-handler-lifecycle.ts.hbs +0 -146
  257. package/dist/emitter/site-templates/tool-index.ts.hbs +0 -11
  258. package/dist/emitter/template-loader.d.ts +0 -1
  259. package/dist/emitter/template-loader.js +0 -27
  260. package/dist/emitter/templates/auth-provider.ts.hbs +0 -57
  261. package/dist/emitter/templates/config.ts.hbs +0 -63
  262. package/dist/emitter/templates/discovery.ts.hbs +0 -301
  263. package/dist/emitter/templates/dockerfile.hbs +0 -34
  264. package/dist/emitter/templates/env.example.hbs +0 -28
  265. package/dist/emitter/templates/gitignore.hbs +0 -5
  266. package/dist/emitter/templates/http-executor.ts.hbs +0 -117
  267. package/dist/emitter/templates/oauth.ts.hbs +0 -188
  268. package/dist/emitter/templates/package.json.hbs +0 -25
  269. package/dist/emitter/templates/prompts.ts.hbs +0 -22
  270. package/dist/emitter/templates/readme.md.hbs +0 -123
  271. package/dist/emitter/templates/resources.ts.hbs +0 -63
  272. package/dist/emitter/templates/server-main-http.ts.hbs +0 -407
  273. package/dist/emitter/templates/server-main.ts.hbs +0 -40
  274. package/dist/emitter/templates/task-handlers.ts.hbs +0 -189
  275. package/dist/emitter/templates/task-manager.ts.hbs +0 -139
  276. package/dist/emitter/templates/task-sse.ts.hbs +0 -105
  277. package/dist/emitter/templates/tool-handler.ts.hbs +0 -124
  278. package/dist/emitter/templates/tool-index.ts.hbs +0 -11
  279. package/dist/emitter/templates/tool-test.ts.hbs +0 -57
  280. package/dist/emitter/templates/trace.ts.hbs +0 -79
  281. package/dist/emitter/templates/tsconfig.json.hbs +0 -16
  282. package/dist/emitter/templates/types.ts.hbs +0 -5
  283. package/dist/emitter/worker-template-loader.d.ts +0 -5
  284. package/dist/emitter/worker-template-loader.js +0 -33
  285. package/dist/emitter/worker-templates/config.ts.hbs +0 -54
  286. package/dist/emitter/worker-templates/dev-vars.example.hbs +0 -10
  287. package/dist/emitter/worker-templates/gitignore.hbs +0 -6
  288. package/dist/emitter/worker-templates/package.json.hbs +0 -24
  289. package/dist/emitter/worker-templates/readme.md.hbs +0 -53
  290. package/dist/emitter/worker-templates/server.test.ts.hbs +0 -20
  291. package/dist/emitter/worker-templates/tool-handler.ts.hbs +0 -85
  292. package/dist/emitter/worker-templates/tool-index.ts.hbs +0 -28
  293. package/dist/emitter/worker-templates/tsconfig.json.hbs +0 -17
  294. package/dist/emitter/worker-templates/worker.ts.hbs +0 -242
  295. package/dist/emitter/worker-templates/wrangler.toml.hbs +0 -19
  296. package/dist/generator/spec-generator.d.ts +0 -6
  297. package/dist/generator/spec-generator.js +0 -50
  298. package/dist/parser/har-filter.d.ts +0 -8
  299. package/dist/parser/har-filter.js +0 -71
  300. package/dist/parser/har-loader.d.ts +0 -2
  301. package/dist/parser/har-loader.js +0 -14
  302. package/dist/parser/har-normalizer.d.ts +0 -20
  303. package/dist/parser/har-normalizer.js +0 -78
  304. package/dist/parser/index.d.ts +0 -10
  305. package/dist/parser/index.js +0 -6
  306. package/dist/parser/openapi-loader.d.ts +0 -6
  307. package/dist/parser/openapi-loader.js +0 -308
  308. package/dist/parser/operation-extractor.d.ts +0 -13
  309. package/dist/parser/operation-extractor.js +0 -155
  310. package/dist/parser/overlay-loader.d.ts +0 -10
  311. package/dist/parser/overlay-loader.js +0 -184
  312. package/dist/parser/postman-loader.d.ts +0 -9
  313. package/dist/parser/postman-loader.js +0 -106
  314. package/dist/parser/schema-converter.d.ts +0 -12
  315. package/dist/parser/schema-converter.js +0 -117
  316. package/dist/plugins/adapter.d.ts +0 -40
  317. package/dist/plugins/adapter.js +0 -15
  318. package/dist/plugins/loader.d.ts +0 -25
  319. package/dist/plugins/loader.js +0 -58
  320. package/dist/pricing.d.ts +0 -55
  321. package/dist/pricing.js +0 -133
  322. package/dist/providers/index.d.ts +0 -15
  323. package/dist/providers/index.js +0 -56
  324. package/dist/recorder/browser-recorder.d.ts +0 -22
  325. package/dist/recorder/browser-recorder.js +0 -205
  326. package/dist/rescan/diff-engine.d.ts +0 -5
  327. package/dist/rescan/diff-engine.js +0 -312
  328. package/dist/rescan/index.d.ts +0 -3
  329. package/dist/rescan/index.js +0 -2
  330. package/dist/rescan/rescan-runner.d.ts +0 -42
  331. package/dist/rescan/rescan-runner.js +0 -69
  332. package/dist/rescan/rescan-scheduler.d.ts +0 -41
  333. package/dist/rescan/rescan-scheduler.js +0 -179
  334. package/dist/site-transformer/browser-tools.d.ts +0 -10
  335. package/dist/site-transformer/browser-tools.js +0 -59
  336. package/dist/site-transformer/index.d.ts +0 -2
  337. package/dist/site-transformer/index.js +0 -2
  338. package/dist/site-transformer/selector-healer.d.ts +0 -8
  339. package/dist/site-transformer/selector-healer.js +0 -106
  340. package/dist/site-transformer/tool-generator.d.ts +0 -13
  341. package/dist/site-transformer/tool-generator.js +0 -245
  342. package/dist/transformer/auth-detector.d.ts +0 -13
  343. package/dist/transformer/auth-detector.js +0 -90
  344. package/dist/transformer/catalog-builder.d.ts +0 -18
  345. package/dist/transformer/catalog-builder.js +0 -56
  346. package/dist/transformer/client-compat.d.ts +0 -6
  347. package/dist/transformer/client-compat.js +0 -44
  348. package/dist/transformer/har-clusterer.d.ts +0 -9
  349. package/dist/transformer/har-clusterer.js +0 -27
  350. package/dist/transformer/har-dedup.d.ts +0 -10
  351. package/dist/transformer/har-dedup.js +0 -81
  352. package/dist/transformer/har-schema-inferrer.d.ts +0 -15
  353. package/dist/transformer/har-schema-inferrer.js +0 -90
  354. package/dist/transformer/har-to-operations.d.ts +0 -13
  355. package/dist/transformer/har-to-operations.js +0 -192
  356. package/dist/transformer/index.d.ts +0 -8
  357. package/dist/transformer/index.js +0 -6
  358. package/dist/transformer/llm-namer.d.ts +0 -6
  359. package/dist/transformer/llm-namer.js +0 -59
  360. package/dist/transformer/naming.d.ts +0 -4
  361. package/dist/transformer/naming.js +0 -30
  362. package/dist/transformer/operation-filter.d.ts +0 -13
  363. package/dist/transformer/operation-filter.js +0 -52
  364. package/dist/transformer/resource-builder.d.ts +0 -12
  365. package/dist/transformer/resource-builder.js +0 -80
  366. package/dist/transformer/schema-merger.d.ts +0 -14
  367. package/dist/transformer/schema-merger.js +0 -65
  368. package/dist/transformer/tool-builder.d.ts +0 -3
  369. package/dist/transformer/tool-builder.js +0 -114
  370. package/dist/types/index.d.ts +0 -131
  371. package/dist/types/index.js +0 -1
  372. package/dist/types/site.d.ts +0 -284
  373. package/dist/types/site.js +0 -8
  374. package/dist/utils/fail.d.ts +0 -48
  375. package/dist/utils/fail.js +0 -204
  376. package/dist/utils/fs.d.ts +0 -5
  377. package/dist/utils/fs.js +0 -28
  378. package/dist/utils/interactive.d.ts +0 -6
  379. package/dist/utils/interactive.js +0 -30
  380. package/dist/utils/logger.d.ts +0 -1
  381. package/dist/utils/logger.js +0 -2
  382. package/dist/utils/sanitize.d.ts +0 -28
  383. package/dist/utils/sanitize.js +0 -44
  384. package/dist/utils/watcher.d.ts +0 -11
  385. package/dist/utils/watcher.js +0 -36
@@ -1,34 +0,0 @@
1
- <h1>Set new password</h1>
2
- <p class="auth-subtitle">Choose a new password for your account</p>
3
-
4
- {{#if error}}
5
- <div class="auth-error" role="alert" aria-live="assertive">{{error}}</div>
6
- {{/if}}
7
-
8
- {{#if expired}}
9
- <div class="auth-error" role="alert">
10
- This reset link has expired or is invalid. <a href="/forgot-password">Request a new one</a>.
11
- </div>
12
- {{else}}
13
- <form method="POST" action="/reset-password">
14
- <input type="hidden" name="_csrf" value="{{csrfToken}}">
15
- <input type="hidden" name="token" value="{{token}}">
16
-
17
- <div class="form-group">
18
- <label for="password">New password</label>
19
- <input type="password" id="password" name="password" required autocomplete="new-password" autofocus minlength="8">
20
- <p class="form-hint">Minimum 8 characters</p>
21
- </div>
22
-
23
- <div class="form-group">
24
- <label for="confirmPassword">Confirm new password</label>
25
- <input type="password" id="confirmPassword" name="confirmPassword" required autocomplete="new-password">
26
- </div>
27
-
28
- <button type="submit" class="auth-submit">Reset password</button>
29
- </form>
30
- {{/if}}
31
-
32
- <div class="auth-footer">
33
- <a href="/login">Back to sign in</a>
34
- </div>
@@ -1,140 +0,0 @@
1
- {{> flash-message}}
2
-
3
- <div class="dashboard-header">
4
- <h1>Billing</h1>
5
- </div>
6
-
7
- {{#if stripeConfigured}}
8
-
9
- <div class="detail-grid">
10
- <div class="detail-card">
11
- <h3>Current Plan</h3>
12
- <p class="detail-value">{{capitalize currentPlan}}</p>
13
- </div>
14
-
15
- <div class="detail-card">
16
- <h3>Browser Minutes Used</h3>
17
- <p class="detail-value">{{minutesUsed}} / {{#if (eq minutesLimit "unlimited")}}Unlimited{{else}}{{minutesLimit}}{{/if}}</p>
18
- </div>
19
-
20
- <div class="detail-card">
21
- <h3>Minutes Remaining</h3>
22
- <p class="detail-value">{{#if (eq minutesLimit "unlimited")}}Unlimited{{else}}{{minutesRemaining}}{{/if}}</p>
23
- </div>
24
- </div>
25
-
26
- {{#if hasSubscription}}
27
- <div class="detail-section">
28
- <h2>Manage Subscription</h2>
29
- <p>View invoices, update payment method, or cancel your subscription.</p>
30
- <form method="POST" action="/dashboard/billing/portal">
31
- <input type="hidden" name="_csrf" value="{{csrfToken}}">
32
- <button type="submit" class="btn btn-secondary">Manage Subscription</button>
33
- </form>
34
- </div>
35
- {{/if}}
36
-
37
- <div class="detail-section">
38
- <h2>{{#if hasSubscription}}Change Plan{{else}}Upgrade Plan{{/if}}</h2>
39
- <div class="pricing-grid">
40
- <article class="pricing-card {{#if (eq currentPlan 'free')}}pricing-card--current{{/if}}">
41
- <div class="pricing-card-header">
42
- <h3 class="pricing-tier-name">Free</h3>
43
- <div class="pricing-amount"><span class="pricing-currency">$</span><span class="pricing-value">0</span><span class="pricing-period">/mo</span></div>
44
- </div>
45
- <ul class="pricing-features">
46
- <li>1 MCP server</li>
47
- <li>500 browser minutes</li>
48
- </ul>
49
- <div class="pricing-card-footer">
50
- {{#if (eq currentPlan 'free')}}
51
- <span class="btn btn-secondary btn-block" style="opacity:0.6;cursor:default;">Current Plan</span>
52
- {{else}}
53
- <span class="btn btn-secondary btn-block" style="opacity:0.6;cursor:default;">Downgrade via Portal</span>
54
- {{/if}}
55
- </div>
56
- </article>
57
-
58
- <article class="pricing-card {{#if (eq currentPlan 'hobbyist')}}pricing-card--current{{/if}}">
59
- <div class="pricing-card-header">
60
- <h3 class="pricing-tier-name">Hobbyist</h3>
61
- <div class="pricing-amount"><span class="pricing-currency">$</span><span class="pricing-value">9</span><span class="pricing-period">/mo</span></div>
62
- </div>
63
- <ul class="pricing-features">
64
- <li>5 MCP servers</li>
65
- <li>5,000 browser minutes</li>
66
- </ul>
67
- <div class="pricing-card-footer">
68
- {{#if (eq currentPlan 'hobbyist')}}
69
- <span class="btn btn-secondary btn-block" style="opacity:0.6;cursor:default;">Current Plan</span>
70
- {{else}}
71
- <form method="POST" action="/dashboard/billing/checkout">
72
- <input type="hidden" name="_csrf" value="{{csrfToken}}">
73
- <input type="hidden" name="plan" value="hobbyist">
74
- <button type="submit" class="btn btn-secondary btn-block">Subscribe</button>
75
- </form>
76
- {{/if}}
77
- </div>
78
- </article>
79
-
80
- <article class="pricing-card pricing-card--featured {{#if (eq currentPlan 'pro')}}pricing-card--current{{/if}}">
81
- <div class="pricing-badge">Popular</div>
82
- <div class="pricing-card-header">
83
- <h3 class="pricing-tier-name">Pro</h3>
84
- <div class="pricing-amount"><span class="pricing-currency">$</span><span class="pricing-value">29</span><span class="pricing-period">/mo</span></div>
85
- </div>
86
- <ul class="pricing-features">
87
- <li>20 MCP servers</li>
88
- <li>50,000 browser minutes</li>
89
- </ul>
90
- <div class="pricing-card-footer">
91
- {{#if (eq currentPlan 'pro')}}
92
- <span class="btn btn-primary btn-block" style="opacity:0.6;cursor:default;">Current Plan</span>
93
- {{else}}
94
- <form method="POST" action="/dashboard/billing/checkout">
95
- <input type="hidden" name="_csrf" value="{{csrfToken}}">
96
- <input type="hidden" name="plan" value="pro">
97
- <button type="submit" class="btn btn-primary btn-block">Subscribe</button>
98
- </form>
99
- {{/if}}
100
- </div>
101
- </article>
102
-
103
- <article class="pricing-card {{#if (eq currentPlan 'team')}}pricing-card--current{{/if}}">
104
- <div class="pricing-card-header">
105
- <h3 class="pricing-tier-name">Team</h3>
106
- <div class="pricing-amount"><span class="pricing-currency">$</span><span class="pricing-value">99</span><span class="pricing-period">/mo</span></div>
107
- </div>
108
- <ul class="pricing-features">
109
- <li>Unlimited MCP servers</li>
110
- <li>500,000 browser minutes</li>
111
- </ul>
112
- <div class="pricing-card-footer">
113
- {{#if (eq currentPlan 'team')}}
114
- <span class="btn btn-secondary btn-block" style="opacity:0.6;cursor:default;">Current Plan</span>
115
- {{else}}
116
- <form method="POST" action="/dashboard/billing/checkout">
117
- <input type="hidden" name="_csrf" value="{{csrfToken}}">
118
- <input type="hidden" name="plan" value="team">
119
- <button type="submit" class="btn btn-secondary btn-block">Subscribe</button>
120
- </form>
121
- {{/if}}
122
- </div>
123
- </article>
124
- </div>
125
- </div>
126
-
127
- {{else}}
128
-
129
- <div class="empty-state">
130
- <div class="empty-state-icon" aria-hidden="true">
131
- <svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
132
- <rect x="1" y="4" width="22" height="16" rx="2" ry="2"></rect>
133
- <line x1="1" y1="10" x2="23" y2="10"></line>
134
- </svg>
135
- </div>
136
- <h2>Payments not configured</h2>
137
- <p>Stripe payment integration is not set up on this instance. Contact your administrator.</p>
138
- </div>
139
-
140
- {{/if}}
@@ -1,173 +0,0 @@
1
- {{> flash-message}}
2
-
3
- <div class="dashboard-header">
4
- <h1>Deploy New Server</h1>
5
- </div>
6
-
7
- <div class="create-form-wrapper" x-data="createForm()">
8
- <form method="POST" action="/dashboard/create" enctype="multipart/form-data"
9
- class="create-form"
10
- x-ref="form"
11
- x-on:submit="submitting = true">
12
-
13
- <input type="hidden" name="_csrf" value="{{csrfToken}}">
14
-
15
- <div class="form-group">
16
- <label for="name">Server name <span class="form-hint-inline">(optional)</span></label>
17
- <input type="text" id="name" name="name" placeholder="my-api"
18
- maxlength="100" autocomplete="off"
19
- pattern="[a-zA-Z0-9 _-]*"
20
- title="Letters, numbers, hyphens, underscores, and spaces only">
21
- <p class="form-hint">A URL-friendly slug will be generated from this name.</p>
22
- </div>
23
-
24
- <div class="form-group">
25
- <label>Source</label>
26
- <div class="source-tabs" role="tablist">
27
- <button type="button" role="tab" class="source-tab"
28
- :class="{ active: mode === 'file' }"
29
- @click="mode = 'file'">Upload file</button>
30
- <button type="button" role="tab" class="source-tab"
31
- :class="{ active: mode === 'url' }"
32
- @click="mode = 'url'">From URL</button>
33
- </div>
34
-
35
- <div x-show="mode === 'file'">
36
- <p class="form-hint" style="margin-bottom: 0.5rem;">OpenAPI/Swagger spec, HAR recording, or Postman collection.</p>
37
- <div class="dropzone"
38
- @dragover.prevent="dragging = true"
39
- @dragleave.prevent="dragging = false"
40
- @drop.prevent="handleDrop($event)"
41
- :class="{ 'dropzone-active': dragging }">
42
- <input type="file" id="spec" name="spec"
43
- accept=".yaml,.yml,.json,.har"
44
- x-ref="fileInput"
45
- @change="handleFileSelect($event)"
46
- class="dropzone-input">
47
- <div class="dropzone-content" x-show="!fileName">
48
- <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
49
- <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
50
- <polyline points="17 8 12 3 7 8"></polyline>
51
- <line x1="12" y1="3" x2="12" y2="15"></line>
52
- </svg>
53
- <p>Drag and drop here, or <span class="dropzone-link">browse</span></p>
54
- <p class="form-hint">.yaml, .yml, .json, .har — max 5 MB</p>
55
- </div>
56
- <div class="dropzone-selected" x-show="fileName" x-cloak>
57
- <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
58
- <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
59
- <polyline points="14 2 14 8 20 8"></polyline>
60
- </svg>
61
- <span x-text="fileName"></span>
62
- <button type="button" class="dropzone-clear" @click="clearFile()" aria-label="Clear selected file">&times;</button>
63
- </div>
64
- </div>
65
- </div>
66
-
67
- <div x-show="mode === 'url'" x-cloak>
68
- <p class="form-hint" style="margin-bottom: 0.5rem;">Paste a URL to an OpenAPI spec or any website.</p>
69
- <input type="url" name="source_url"
70
- placeholder="https://api.example.com/openapi.yaml"
71
- class="form-input" style="width:100%;"
72
- x-model="sourceUrl">
73
- <div style="margin-top: 0.75rem;">
74
- <label for="depth" class="form-label">Crawl depth <span class="form-hint-inline">(for websites)</span></label>
75
- <select name="depth" id="depth" class="form-input" style="width: auto;">
76
- <option value="1">1 — single page</option>
77
- <option value="2" selected>2 — one level deep</option>
78
- <option value="3">3 — deep crawl</option>
79
- </select>
80
- </div>
81
- <p class="form-hint" style="margin-top: 0.5rem;">
82
- <strong>Spec URL</strong> — fetches and builds<br>
83
- <strong>Website URL</strong> — Playwright analyzes the site
84
- </p>
85
- </div>
86
- </div>
87
-
88
- <button type="submit" class="btn btn-primary btn-block"
89
- :disabled="submitting || (mode === 'file' && !fileName) || (mode === 'url' && !sourceUrl)">
90
- <span x-show="!submitting">Deploy Server</span>
91
- <span x-show="submitting" x-cloak>Deploying...</span>
92
- </button>
93
- </form>
94
- </div>
95
-
96
- <!-- No-JS fallback: show a simple form if Alpine doesn't load -->
97
- <noscript>
98
- <div class="create-form-wrapper">
99
- <form method="POST" action="/dashboard/create" enctype="multipart/form-data" class="create-form">
100
- <input type="hidden" name="_csrf" value="{{csrfToken}}">
101
- <div class="form-group">
102
- <label for="name-njs">Server name (optional)</label>
103
- <input type="text" id="name-njs" name="name" placeholder="my-api" maxlength="100">
104
- </div>
105
- <div class="form-group">
106
- <label for="spec-njs">Upload spec file</label>
107
- <input type="file" id="spec-njs" name="spec" accept=".yaml,.yml,.json,.har">
108
- </div>
109
- <div class="form-group">
110
- <label for="url-njs">Or enter a URL</label>
111
- <input type="url" id="url-njs" name="source_url" placeholder="https://...">
112
- </div>
113
- <button type="submit" class="btn btn-primary btn-block">Deploy Server</button>
114
- </form>
115
- </div>
116
- </noscript>
117
-
118
- <style>
119
- .source-tabs {
120
- display: flex;
121
- gap: 0;
122
- margin-bottom: 0.75rem;
123
- border: 1px solid var(--border-color);
124
- border-radius: 6px;
125
- overflow: hidden;
126
- }
127
- .source-tab {
128
- flex: 1;
129
- padding: 0.5rem 1rem;
130
- background: transparent;
131
- border: none;
132
- color: var(--text-muted);
133
- cursor: pointer;
134
- font-size: 0.875rem;
135
- font-weight: 500;
136
- transition: background 0.15s, color 0.15s;
137
- }
138
- .source-tab:hover { background: var(--bg-hover); }
139
- .source-tab.active {
140
- background: var(--accent);
141
- color: #fff;
142
- }
143
- /* Hide Alpine conditional elements until initialized */
144
- [x-cloak] { display: none !important; }
145
- </style>
146
-
147
- <script>
148
- function createForm() {
149
- return {
150
- mode: 'file',
151
- dragging: false,
152
- fileName: '',
153
- sourceUrl: '',
154
- submitting: false,
155
- handleDrop(event) {
156
- this.dragging = false;
157
- const files = event.dataTransfer.files;
158
- if (files.length > 0) {
159
- this.$refs.fileInput.files = files;
160
- this.fileName = files[0].name;
161
- }
162
- },
163
- handleFileSelect(event) {
164
- const files = event.target.files;
165
- this.fileName = files.length > 0 ? files[0].name : '';
166
- },
167
- clearFile() {
168
- this.$refs.fileInput.value = '';
169
- this.fileName = '';
170
- }
171
- };
172
- }
173
- </script>
@@ -1,8 +0,0 @@
1
- <section class="dashboard-placeholder">
2
- <h1>Dashboard</h1>
3
- <p>Coming soon. You are signed in as <strong>{{user.email}}</strong>.</p>
4
- <form method="POST" action="/logout" style="margin-top: 1.5rem;">
5
- <input type="hidden" name="_csrf" value="{{csrfToken}}">
6
- <button type="submit" class="btn btn-secondary btn-sm">Sign out</button>
7
- </form>
8
- </section>
@@ -1,280 +0,0 @@
1
- {{> flash-message}}
2
-
3
- <div class="dashboard-header">
4
- <div class="dashboard-header-left">
5
- <a href="/dashboard" class="breadcrumb-link">Servers</a>
6
- <span class="breadcrumb-sep">/</span>
7
- <h1>{{server.slug}}</h1>
8
- </div>
9
- <div class="dashboard-header-actions">
10
- <a href="/dashboard/servers/{{server.slug}}/logs" class="btn btn-sm btn-secondary">Logs</a>
11
- <a href="/dashboard/servers/{{server.slug}}/metrics" class="btn btn-sm btn-secondary">Metrics</a>
12
- <form method="POST" action="/dashboard/servers/{{server.slug}}/delete"
13
- x-data x-on:submit.prevent="if(confirm('Delete server {{server.slug}}? This cannot be undone.')) $el.submit()"
14
- style="display:inline;">
15
- <input type="hidden" name="_csrf" value="{{csrfToken}}">
16
- <button type="submit" class="btn btn-sm btn-danger">Delete</button>
17
- </form>
18
- </div>
19
- </div>
20
-
21
- <div class="detail-grid">
22
- <div class="detail-card">
23
- <h3>Status</h3>
24
- <div id="server-status"
25
- hx-get="/dashboard/servers/{{server.slug}}/_status"
26
- hx-trigger="every 5s"
27
- hx-swap="innerHTML"
28
- aria-live="polite">
29
- {{> status-badge status=server.status}}
30
- </div>
31
- </div>
32
-
33
- <div class="detail-card">
34
- <h3>Tools</h3>
35
- <p class="detail-value">{{server.toolCount}}</p>
36
- </div>
37
-
38
- <div class="detail-card">
39
- <h3>Created</h3>
40
- <p class="detail-value">{{formatDate server.createdAt}}</p>
41
- </div>
42
-
43
- <div class="detail-card">
44
- <h3>Last Active</h3>
45
- <p class="detail-value">{{formatDate server.lastActiveAt}}</p>
46
- </div>
47
- </div>
48
-
49
- <div class="detail-section" x-data="{ copied: false }">
50
- <h2>Endpoint</h2>
51
- <div class="endpoint-row">
52
- <code class="endpoint-url">{{endpoint}}/mcp</code>
53
- <button type="button" class="btn btn-sm btn-secondary"
54
- x-on:click="navigator.clipboard.writeText('{{endpoint}}/mcp'); copied = true; setTimeout(() => copied = false, 2000)">
55
- <span x-show="!copied">Copy</span>
56
- <span x-show="copied" x-cloak>Copied</span>
57
- </button>
58
- </div>
59
- </div>
60
-
61
- {{#if token}}
62
- <div class="detail-section">
63
- <div class="flash-message flash-success">
64
- <strong>Your bearer token (shown once):</strong>
65
- <div x-data="{ tokenCopied: false }" style="margin-top: 0.5rem;">
66
- <code class="token-display">{{token}}</code>
67
- <button type="button" class="btn btn-sm btn-secondary" style="margin-left: 0.5rem;"
68
- x-on:click="navigator.clipboard.writeText('{{token}}'); tokenCopied = true; setTimeout(() => tokenCopied = false, 2000)">
69
- <span x-show="!tokenCopied">Copy</span>
70
- <span x-show="tokenCopied" x-cloak>Copied</span>
71
- </button>
72
- </div>
73
- <p class="form-hint" style="margin-top: 0.5rem;">Save this token now. It will not be shown again.</p>
74
- </div>
75
- </div>
76
- {{/if}}
77
-
78
- {{#if isPlaywright}}
79
- <div class="detail-section">
80
- <h2>Browser Sessions</h2>
81
- {{#if sessions.length}}
82
- <table class="metrics-table">
83
- <thead>
84
- <tr>
85
- <th>Session ID</th>
86
- <th>Status</th>
87
- <th>Started</th>
88
- <th>Last Active</th>
89
- <th>Duration</th>
90
- </tr>
91
- </thead>
92
- <tbody>
93
- {{#each sessions}}
94
- <tr>
95
- <td><code>{{sessionId}}</code></td>
96
- <td>{{> status-badge status=status}}</td>
97
- <td>{{formatDate startedAt}}</td>
98
- <td>{{formatDate lastActiveAt}}</td>
99
- <td>{{duration}}</td>
100
- </tr>
101
- {{/each}}
102
- </tbody>
103
- </table>
104
- {{else}}
105
- <div class="empty-state">
106
- <p>No active browser sessions.</p>
107
- </div>
108
- {{/if}}
109
- </div>
110
-
111
- <div class="detail-section">
112
- <h2>Usage &amp; Billing</h2>
113
- <div class="detail-grid">
114
- <div class="detail-card">
115
- <h3>Browser Minutes Used</h3>
116
- <p class="detail-value detail-value-lg">{{usage.minutesUsed}}</p>
117
- </div>
118
- <div class="detail-card">
119
- <h3>Quota Remaining</h3>
120
- <p class="detail-value detail-value-lg">{{usage.minutesRemaining}}</p>
121
- </div>
122
- <div class="detail-card">
123
- <h3>Tool Calls</h3>
124
- <p class="detail-value detail-value-lg">{{usage.toolCalls}}</p>
125
- </div>
126
- <div class="detail-card">
127
- <h3>Screenshots</h3>
128
- <p class="detail-value detail-value-lg">{{usage.screenshots}}</p>
129
- </div>
130
- </div>
131
- <p class="form-hint">Plan: {{usage.plan}} ({{usage.limit}} min/month)</p>
132
- </div>
133
-
134
- {{#if screenshots.length}}
135
- <div class="detail-section">
136
- <h2>Analysis Screenshots</h2>
137
- <div class="screenshot-gallery">
138
- {{#each screenshots}}
139
- <div class="screenshot-card">
140
- <img src="data:image/png;base64,{{base64}}" alt="{{pageTitle}}" loading="lazy" style="max-width:100%;border:1px solid var(--border-color);border-radius:4px;">
141
- <p class="form-hint" style="margin-top:0.25rem;">{{pageTitle}}</p>
142
- </div>
143
- {{/each}}
144
- </div>
145
- </div>
146
- {{/if}}
147
-
148
- {{#if changes.length}}
149
- <div class="detail-section">
150
- <h2>Rescan History</h2>
151
- <table class="metrics-table">
152
- <thead>
153
- <tr>
154
- <th>Date</th>
155
- <th>Change</th>
156
- <th>Element</th>
157
- <th>Description</th>
158
- </tr>
159
- </thead>
160
- <tbody>
161
- {{#each changes}}
162
- <tr>
163
- <td>{{formatDate timestamp}}</td>
164
- <td><span class="status-badge status-{{changeType}}">{{changeType}}</span></td>
165
- <td>{{elementType}}: {{elementId}}</td>
166
- <td>{{description}}</td>
167
- </tr>
168
- {{/each}}
169
- </tbody>
170
- </table>
171
- </div>
172
- {{/if}}
173
- {{/if}}
174
-
175
- <div class="detail-section">
176
- <h2>Secrets</h2>
177
- <p class="form-hint">Encrypted environment variables injected into the container at startup. Values are never shown after saving.</p>
178
-
179
- {{#if secretNames.length}}
180
- <table class="metrics-table" style="margin-bottom: 1rem;">
181
- <thead>
182
- <tr>
183
- <th>Name</th>
184
- <th>Actions</th>
185
- </tr>
186
- </thead>
187
- <tbody>
188
- {{#each secretNames}}
189
- <tr>
190
- <td><code>{{this}}</code></td>
191
- <td>
192
- <form method="POST" action="/dashboard/servers/{{../server.slug}}/secrets" style="display:inline;">
193
- <input type="hidden" name="_csrf" value="{{../csrfToken}}">
194
- <input type="hidden" name="secret_name" value="{{this}}">
195
- <input type="password" name="secret_value" placeholder="New value" required style="width:200px;display:inline-block;">
196
- <button type="submit" class="btn btn-sm btn-secondary">Re-set</button>
197
- </form>
198
- </td>
199
- </tr>
200
- {{/each}}
201
- </tbody>
202
- </table>
203
- {{else}}
204
- <p style="margin-bottom: 1rem; color: var(--text-muted);">No secrets configured yet.</p>
205
- {{/if}}
206
-
207
- <details>
208
- <summary style="cursor:pointer; font-weight:500;">Add a new secret</summary>
209
- <form method="POST" action="/dashboard/servers/{{server.slug}}/secrets" style="margin-top: 0.5rem;">
210
- <input type="hidden" name="_csrf" value="{{csrfToken}}">
211
- <div style="display:flex; gap:0.5rem; align-items:flex-end; flex-wrap:wrap;">
212
- <div>
213
- <label class="form-label" for="secret_name">Name</label>
214
- <input type="text" id="secret_name" name="secret_name" placeholder="API_KEY" required pattern="[A-Za-z_][A-Za-z0-9_]*" class="form-input">
215
- </div>
216
- <div>
217
- <label class="form-label" for="secret_value">Value</label>
218
- <input type="password" id="secret_value" name="secret_value" placeholder="sk-..." required class="form-input">
219
- </div>
220
- <button type="submit" class="btn btn-primary">Save secret</button>
221
- </div>
222
- <p class="form-hint" style="margin-top:0.25rem;">Name must be a valid env var (letters, digits, underscores). Restart the server to pick up new secrets.</p>
223
- </form>
224
- </details>
225
- </div>
226
-
227
- <div class="detail-section" x-data="{ activeTab: 'claude' }">
228
- <h2>Client Configuration</h2>
229
- <div class="config-tabs" role="tablist" aria-label="Client configuration">
230
- <button class="config-tab" role="tab" x-bind:class="{ active: activeTab === 'claude' }" x-bind:aria-selected="activeTab === 'claude'" x-on:click="activeTab = 'claude'">Claude Desktop</button>
231
- <button class="config-tab" role="tab" x-bind:class="{ active: activeTab === 'cursor' }" x-bind:aria-selected="activeTab === 'cursor'" x-on:click="activeTab = 'cursor'">Cursor</button>
232
- <button class="config-tab" role="tab" x-bind:class="{ active: activeTab === 'cli' }" x-bind:aria-selected="activeTab === 'cli'" x-on:click="activeTab = 'cli'">Claude Code</button>
233
- </div>
234
-
235
- <div class="config-content" role="tabpanel" x-show="activeTab === 'claude'" x-data="{ c1: false }">
236
- <pre><code>{
237
- "mcpServers": {
238
- "{{server.slug}}": {
239
- "url": "{{endpoint}}/mcp",
240
- "headers": {
241
- "Authorization": "Bearer YOUR_TOKEN"
242
- }
243
- }
244
- }
245
- }</code></pre>
246
- <button type="button" class="btn btn-sm btn-secondary config-copy"
247
- x-on:click="navigator.clipboard.writeText(JSON.stringify({mcpServers:{['{{server.slug}}']:{url:'{{endpoint}}/mcp',headers:{Authorization:'Bearer YOUR_TOKEN'}}}},null,2)); c1 = true; setTimeout(() => c1 = false, 2000)">
248
- <span x-show="!c1">Copy</span>
249
- <span x-show="c1" x-cloak>Copied</span>
250
- </button>
251
- </div>
252
-
253
- <div class="config-content" role="tabpanel" x-show="activeTab === 'cursor'" x-cloak x-data="{ c2: false }">
254
- <pre><code>{
255
- "mcpServers": {
256
- "{{server.slug}}": {
257
- "url": "{{endpoint}}/mcp",
258
- "headers": {
259
- "Authorization": "Bearer YOUR_TOKEN"
260
- }
261
- }
262
- }
263
- }</code></pre>
264
- <button type="button" class="btn btn-sm btn-secondary config-copy"
265
- x-on:click="navigator.clipboard.writeText(JSON.stringify({mcpServers:{['{{server.slug}}']:{url:'{{endpoint}}/mcp',headers:{Authorization:'Bearer YOUR_TOKEN'}}}},null,2)); c2 = true; setTimeout(() => c2 = false, 2000)">
266
- <span x-show="!c2">Copy</span>
267
- <span x-show="c2" x-cloak>Copied</span>
268
- </button>
269
- </div>
270
-
271
- <div class="config-content" role="tabpanel" x-show="activeTab === 'cli'" x-cloak x-data="{ c3: false }">
272
- <pre><code>claude mcp add {{server.slug}} {{endpoint}}/mcp \
273
- --header "Authorization: Bearer YOUR_TOKEN"</code></pre>
274
- <button type="button" class="btn btn-sm btn-secondary config-copy"
275
- x-on:click="navigator.clipboard.writeText('claude mcp add {{server.slug}} {{endpoint}}/mcp --header \"Authorization: Bearer YOUR_TOKEN\"'); c3 = true; setTimeout(() => c3 = false, 2000)">
276
- <span x-show="!c3">Copy</span>
277
- <span x-show="c3" x-cloak>Copied</span>
278
- </button>
279
- </div>
280
- </div>