mcpmake 0.1.1 → 0.2.1
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/README.md +88 -635
- package/dist/commands/bundle.d.ts +1 -0
- package/dist/commands/bundle.d.ts.map +1 -0
- package/dist/commands/bundle.js +5 -4
- package/dist/commands/bundle.js.map +1 -0
- package/dist/commands/ci.d.ts +1 -0
- package/dist/commands/ci.d.ts.map +1 -0
- package/dist/commands/ci.js +3 -2
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/deploy.d.ts +1 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +4 -3
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/diff.d.ts +1 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +5 -4
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/from/describe.d.ts +1 -0
- package/dist/commands/from/describe.d.ts.map +1 -0
- package/dist/commands/from/describe.js +11 -10
- package/dist/commands/from/describe.js.map +1 -0
- package/dist/commands/from/har.d.ts +1 -0
- package/dist/commands/from/har.d.ts.map +1 -0
- package/dist/commands/from/har.js +14 -13
- package/dist/commands/from/har.js.map +1 -0
- package/dist/commands/from/openapi.d.ts +1 -0
- package/dist/commands/from/openapi.d.ts.map +1 -0
- package/dist/commands/from/openapi.js +17 -16
- package/dist/commands/from/openapi.js.map +1 -0
- package/dist/commands/from/postman.d.ts +1 -0
- package/dist/commands/from/postman.d.ts.map +1 -0
- package/dist/commands/from/postman.js +13 -12
- package/dist/commands/from/postman.js.map +1 -0
- package/dist/commands/from/stainless.d.ts +110 -0
- package/dist/commands/from/stainless.d.ts.map +1 -0
- package/dist/commands/from/stainless.js +272 -0
- package/dist/commands/from/stainless.js.map +1 -0
- package/dist/commands/from/target-support.d.ts +1 -0
- package/dist/commands/from/target-support.d.ts.map +1 -0
- package/dist/commands/from/target-support.js +2 -1
- package/dist/commands/from/target-support.js.map +1 -0
- package/dist/commands/from/url.d.ts +1 -0
- package/dist/commands/from/url.d.ts.map +1 -0
- package/dist/commands/from/url.js +14 -13
- package/dist/commands/from/url.js.map +1 -0
- package/dist/commands/from/website.d.ts +1 -0
- package/dist/commands/from/website.d.ts.map +1 -0
- package/dist/commands/from/website.js +17 -16
- package/dist/commands/from/website.js.map +1 -0
- package/dist/commands/lint.d.ts +1 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +6 -5
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/merge.d.ts +1 -0
- package/dist/commands/merge.d.ts.map +1 -0
- package/dist/commands/merge.js +3 -2
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/publish.d.ts +1 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +4 -3
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/rescan.d.ts +1 -0
- package/dist/commands/rescan.d.ts.map +1 -0
- package/dist/commands/rescan.js +12 -11
- package/dist/commands/rescan.js.map +1 -0
- package/dist/commands/update.d.ts +1 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +10 -9
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +1 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +7 -6
- package/dist/commands/verify.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -2
- package/dist/index.js.map +1 -0
- package/dist/registry/official-registry.d.ts +1 -0
- package/dist/registry/official-registry.d.ts.map +1 -0
- package/dist/registry/official-registry.js +1 -0
- package/dist/registry/official-registry.js.map +1 -0
- package/package.json +20 -46
- package/dist/analyzer/auth-detector.d.ts +0 -12
- package/dist/analyzer/auth-detector.js +0 -142
- package/dist/analyzer/dom-parser.d.ts +0 -10
- package/dist/analyzer/dom-parser.js +0 -259
- package/dist/analyzer/goal-crawler.d.ts +0 -25
- package/dist/analyzer/goal-crawler.js +0 -177
- package/dist/analyzer/hybrid-detector.d.ts +0 -28
- package/dist/analyzer/hybrid-detector.js +0 -96
- package/dist/analyzer/index.d.ts +0 -12
- package/dist/analyzer/index.js +0 -8
- package/dist/analyzer/screenshot-capture.d.ts +0 -29
- package/dist/analyzer/screenshot-capture.js +0 -42
- package/dist/analyzer/selector-builder.d.ts +0 -19
- package/dist/analyzer/selector-builder.js +0 -199
- package/dist/analyzer/semantic-analyzer.d.ts +0 -13
- package/dist/analyzer/semantic-analyzer.js +0 -145
- package/dist/analyzer/site-crawler.d.ts +0 -38
- package/dist/analyzer/site-crawler.js +0 -235
- package/dist/cloud/billing/billing-engine.d.ts +0 -44
- package/dist/cloud/billing/billing-engine.js +0 -81
- package/dist/cloud/billing/credit-store.d.ts +0 -64
- package/dist/cloud/billing/credit-store.js +0 -168
- package/dist/cloud/billing/index.d.ts +0 -4
- package/dist/cloud/billing/index.js +0 -2
- package/dist/cloud/billing/usage-store.d.ts +0 -42
- package/dist/cloud/billing/usage-store.js +0 -85
- package/dist/cloud/billing/usage-tracker.d.ts +0 -38
- package/dist/cloud/billing/usage-tracker.js +0 -95
- package/dist/cloud/build-pipeline.d.ts +0 -39
- package/dist/cloud/build-pipeline.js +0 -310
- package/dist/cloud/build-queue.d.ts +0 -30
- package/dist/cloud/build-queue.js +0 -70
- package/dist/cloud/caddy-manager.d.ts +0 -18
- package/dist/cloud/caddy-manager.js +0 -97
- package/dist/cloud/container-backend.d.ts +0 -62
- package/dist/cloud/container-backend.js +0 -59
- package/dist/cloud/container-manager.d.ts +0 -64
- package/dist/cloud/container-manager.js +0 -301
- package/dist/cloud/crypto.d.ts +0 -27
- package/dist/cloud/crypto.js +0 -63
- package/dist/cloud/db/index.d.ts +0 -27
- package/dist/cloud/db/index.js +0 -53
- package/dist/cloud/db/migrations.d.ts +0 -12
- package/dist/cloud/db/migrations.js +0 -329
- package/dist/cloud/db/pg-store.d.ts +0 -45
- package/dist/cloud/db/pg-store.js +0 -336
- package/dist/cloud/failure-tracker.d.ts +0 -51
- package/dist/cloud/failure-tracker.js +0 -102
- package/dist/cloud/idle-monitor.d.ts +0 -30
- package/dist/cloud/idle-monitor.js +0 -70
- package/dist/cloud/mailer.d.ts +0 -21
- package/dist/cloud/mailer.js +0 -193
- package/dist/cloud/mcp-proxy.d.ts +0 -58
- package/dist/cloud/mcp-proxy.js +0 -203
- package/dist/cloud/metric-samples.d.ts +0 -43
- package/dist/cloud/metric-samples.js +0 -85
- package/dist/cloud/metrics.d.ts +0 -26
- package/dist/cloud/metrics.js +0 -59
- package/dist/cloud/multipart.d.ts +0 -26
- package/dist/cloud/multipart.js +0 -132
- package/dist/cloud/observability.d.ts +0 -27
- package/dist/cloud/observability.js +0 -98
- package/dist/cloud/rate-limiter.d.ts +0 -31
- package/dist/cloud/rate-limiter.js +0 -58
- package/dist/cloud/request-security.d.ts +0 -5
- package/dist/cloud/request-security.js +0 -74
- package/dist/cloud/resource-monitor.d.ts +0 -69
- package/dist/cloud/resource-monitor.js +0 -130
- package/dist/cloud/secret-store.d.ts +0 -38
- package/dist/cloud/secret-store.js +0 -103
- package/dist/cloud/security.d.ts +0 -26
- package/dist/cloud/security.js +0 -142
- package/dist/cloud/server.d.ts +0 -21
- package/dist/cloud/server.js +0 -1079
- package/dist/cloud/shared-state.d.ts +0 -72
- package/dist/cloud/shared-state.js +0 -159
- package/dist/cloud/ssrf.d.ts +0 -43
- package/dist/cloud/ssrf.js +0 -150
- package/dist/cloud/store.d.ts +0 -41
- package/dist/cloud/store.js +0 -75
- package/dist/cloud/stripe.d.ts +0 -78
- package/dist/cloud/stripe.js +0 -317
- package/dist/cloud/telemetry-store.d.ts +0 -53
- package/dist/cloud/telemetry-store.js +0 -108
- package/dist/cloud/web/auth.d.ts +0 -225
- package/dist/cloud/web/auth.js +0 -555
- package/dist/cloud/web/charts.d.ts +0 -70
- package/dist/cloud/web/charts.js +0 -178
- package/dist/cloud/web/csrf.d.ts +0 -14
- package/dist/cloud/web/csrf.js +0 -22
- package/dist/cloud/web/docs.d.ts +0 -40
- package/dist/cloud/web/docs.js +0 -174
- package/dist/cloud/web/router.d.ts +0 -25
- package/dist/cloud/web/router.js +0 -1921
- package/dist/cloud/web/static/alpine.min.js +0 -5
- package/dist/cloud/web/static/favicon.svg +0 -4
- package/dist/cloud/web/static/htmx-sse.js +0 -290
- package/dist/cloud/web/static/htmx.min.js +0 -1
- package/dist/cloud/web/static/style.css +0 -2683
- package/dist/cloud/web/static-server.d.ts +0 -13
- package/dist/cloud/web/static-server.js +0 -73
- package/dist/cloud/web/template-engine.d.ts +0 -27
- package/dist/cloud/web/template-engine.js +0 -146
- package/dist/cloud/web/templates/layouts/admin.hbs +0 -57
- package/dist/cloud/web/templates/layouts/auth.hbs +0 -138
- package/dist/cloud/web/templates/layouts/base.hbs +0 -16
- package/dist/cloud/web/templates/layouts/dashboard.hbs +0 -39
- package/dist/cloud/web/templates/layouts/landing.hbs +0 -82
- package/dist/cloud/web/templates/pages/admin/overview.hbs +0 -123
- package/dist/cloud/web/templates/pages/admin/servers.hbs +0 -129
- package/dist/cloud/web/templates/pages/admin/telemetry.hbs +0 -39
- package/dist/cloud/web/templates/pages/admin/user-edit.hbs +0 -91
- package/dist/cloud/web/templates/pages/admin/users.hbs +0 -179
- package/dist/cloud/web/templates/pages/auth/forgot-password.hbs +0 -25
- package/dist/cloud/web/templates/pages/auth/login.hbs +0 -33
- package/dist/cloud/web/templates/pages/auth/register.hbs +0 -32
- package/dist/cloud/web/templates/pages/auth/reset-password.hbs +0 -34
- package/dist/cloud/web/templates/pages/dashboard/billing.hbs +0 -140
- package/dist/cloud/web/templates/pages/dashboard/create.hbs +0 -173
- package/dist/cloud/web/templates/pages/dashboard/index.hbs +0 -8
- package/dist/cloud/web/templates/pages/dashboard/server-detail.hbs +0 -280
- package/dist/cloud/web/templates/pages/dashboard/server-logs.hbs +0 -35
- package/dist/cloud/web/templates/pages/dashboard/server-metrics.hbs +0 -63
- package/dist/cloud/web/templates/pages/dashboard/servers-partial.hbs +0 -21
- package/dist/cloud/web/templates/pages/dashboard/servers.hbs +0 -44
- package/dist/cloud/web/templates/pages/docs/show.hbs +0 -16
- package/dist/cloud/web/templates/pages/errors/404.hbs +0 -9
- package/dist/cloud/web/templates/pages/errors/500.hbs +0 -8
- package/dist/cloud/web/templates/pages/landing/index.hbs +0 -223
- package/dist/cloud/web/templates/pages/legal/privacy.hbs +0 -71
- package/dist/cloud/web/templates/pages/legal/terms.hbs +0 -73
- package/dist/cloud/web/templates/partials/admin-stats.hbs +0 -52
- package/dist/cloud/web/templates/partials/flash-message.hbs +0 -6
- package/dist/cloud/web/templates/partials/pricing-table.hbs +0 -103
- package/dist/cloud/web/templates/partials/server-card.hbs +0 -19
- package/dist/cloud/web/templates/partials/status-badge.hbs +0 -1
- package/dist/config/configurable-command.d.ts +0 -13
- package/dist/config/configurable-command.js +0 -70
- package/dist/config/mcpmake-config.d.ts +0 -68
- package/dist/config/mcpmake-config.js +0 -207
- package/dist/docs/cli.md +0 -400
- package/dist/docs/mcp-2026-07-28-migration.md +0 -78
- package/dist/docs/migrate-from-stainless.md +0 -94
- package/dist/docs/quickstart.md +0 -166
- package/dist/docs/show-hn.md +0 -26
- package/dist/docs/website-servers.md +0 -169
- package/dist/emitter/code-writer.d.ts +0 -8
- package/dist/emitter/code-writer.js +0 -25
- package/dist/emitter/index.d.ts +0 -32
- package/dist/emitter/index.js +0 -280
- package/dist/emitter/mcpb-bundler.d.ts +0 -31
- package/dist/emitter/mcpb-bundler.js +0 -172
- package/dist/emitter/project-scaffolder.d.ts +0 -4
- package/dist/emitter/project-scaffolder.js +0 -89
- package/dist/emitter/python-template-loader.d.ts +0 -4
- package/dist/emitter/python-template-loader.js +0 -30
- package/dist/emitter/python-templates/dockerfile.hbs +0 -14
- package/dist/emitter/python-templates/env.example.hbs +0 -6
- package/dist/emitter/python-templates/requirements.txt.hbs +0 -4
- package/dist/emitter/python-templates/server.py.hbs +0 -77
- package/dist/emitter/site-scaffolder.d.ts +0 -13
- package/dist/emitter/site-scaffolder.js +0 -70
- package/dist/emitter/site-template-loader.d.ts +0 -5
- package/dist/emitter/site-template-loader.js +0 -47
- package/dist/emitter/site-templates/browser-manager.ts.hbs +0 -233
- package/dist/emitter/site-templates/config.ts.hbs +0 -28
- package/dist/emitter/site-templates/dockerfile.hbs +0 -31
- package/dist/emitter/site-templates/env.example.hbs +0 -19
- package/dist/emitter/site-templates/package.json.hbs +0 -26
- package/dist/emitter/site-templates/server-main-http.ts.hbs +0 -108
- package/dist/emitter/site-templates/server-main.ts.hbs +0 -23
- package/dist/emitter/site-templates/tool-handler-action.ts.hbs +0 -86
- package/dist/emitter/site-templates/tool-handler-form.ts.hbs +0 -116
- package/dist/emitter/site-templates/tool-handler-lifecycle.ts.hbs +0 -146
- package/dist/emitter/site-templates/tool-index.ts.hbs +0 -11
- package/dist/emitter/template-loader.d.ts +0 -1
- package/dist/emitter/template-loader.js +0 -27
- package/dist/emitter/templates/auth-provider.ts.hbs +0 -57
- package/dist/emitter/templates/config.ts.hbs +0 -63
- package/dist/emitter/templates/discovery.ts.hbs +0 -301
- package/dist/emitter/templates/dockerfile.hbs +0 -34
- package/dist/emitter/templates/env.example.hbs +0 -28
- package/dist/emitter/templates/gitignore.hbs +0 -5
- package/dist/emitter/templates/http-executor.ts.hbs +0 -117
- package/dist/emitter/templates/oauth.ts.hbs +0 -188
- package/dist/emitter/templates/package.json.hbs +0 -25
- package/dist/emitter/templates/prompts.ts.hbs +0 -22
- package/dist/emitter/templates/readme.md.hbs +0 -123
- package/dist/emitter/templates/resources.ts.hbs +0 -63
- package/dist/emitter/templates/server-main-http.ts.hbs +0 -407
- package/dist/emitter/templates/server-main.ts.hbs +0 -40
- package/dist/emitter/templates/task-handlers.ts.hbs +0 -189
- package/dist/emitter/templates/task-manager.ts.hbs +0 -139
- package/dist/emitter/templates/task-sse.ts.hbs +0 -105
- package/dist/emitter/templates/tool-handler.ts.hbs +0 -124
- package/dist/emitter/templates/tool-index.ts.hbs +0 -11
- package/dist/emitter/templates/tool-test.ts.hbs +0 -57
- package/dist/emitter/templates/trace.ts.hbs +0 -79
- package/dist/emitter/templates/tsconfig.json.hbs +0 -16
- package/dist/emitter/templates/types.ts.hbs +0 -5
- package/dist/emitter/worker-template-loader.d.ts +0 -5
- package/dist/emitter/worker-template-loader.js +0 -33
- package/dist/emitter/worker-templates/config.ts.hbs +0 -54
- package/dist/emitter/worker-templates/dev-vars.example.hbs +0 -10
- package/dist/emitter/worker-templates/gitignore.hbs +0 -6
- package/dist/emitter/worker-templates/package.json.hbs +0 -24
- package/dist/emitter/worker-templates/readme.md.hbs +0 -53
- package/dist/emitter/worker-templates/server.test.ts.hbs +0 -20
- package/dist/emitter/worker-templates/tool-handler.ts.hbs +0 -85
- package/dist/emitter/worker-templates/tool-index.ts.hbs +0 -28
- package/dist/emitter/worker-templates/tsconfig.json.hbs +0 -17
- package/dist/emitter/worker-templates/worker.ts.hbs +0 -242
- package/dist/emitter/worker-templates/wrangler.toml.hbs +0 -19
- package/dist/generator/spec-generator.d.ts +0 -6
- package/dist/generator/spec-generator.js +0 -50
- package/dist/parser/har-filter.d.ts +0 -8
- package/dist/parser/har-filter.js +0 -71
- package/dist/parser/har-loader.d.ts +0 -2
- package/dist/parser/har-loader.js +0 -14
- package/dist/parser/har-normalizer.d.ts +0 -20
- package/dist/parser/har-normalizer.js +0 -78
- package/dist/parser/index.d.ts +0 -10
- package/dist/parser/index.js +0 -6
- package/dist/parser/openapi-loader.d.ts +0 -6
- package/dist/parser/openapi-loader.js +0 -308
- package/dist/parser/operation-extractor.d.ts +0 -13
- package/dist/parser/operation-extractor.js +0 -155
- package/dist/parser/overlay-loader.d.ts +0 -10
- package/dist/parser/overlay-loader.js +0 -184
- package/dist/parser/postman-loader.d.ts +0 -9
- package/dist/parser/postman-loader.js +0 -106
- package/dist/parser/schema-converter.d.ts +0 -12
- package/dist/parser/schema-converter.js +0 -117
- package/dist/plugins/adapter.d.ts +0 -40
- package/dist/plugins/adapter.js +0 -15
- package/dist/plugins/loader.d.ts +0 -25
- package/dist/plugins/loader.js +0 -58
- package/dist/pricing.d.ts +0 -55
- package/dist/pricing.js +0 -133
- package/dist/providers/index.d.ts +0 -15
- package/dist/providers/index.js +0 -56
- package/dist/recorder/browser-recorder.d.ts +0 -22
- package/dist/recorder/browser-recorder.js +0 -205
- package/dist/rescan/diff-engine.d.ts +0 -5
- package/dist/rescan/diff-engine.js +0 -312
- package/dist/rescan/index.d.ts +0 -3
- package/dist/rescan/index.js +0 -2
- package/dist/rescan/rescan-runner.d.ts +0 -42
- package/dist/rescan/rescan-runner.js +0 -69
- package/dist/rescan/rescan-scheduler.d.ts +0 -41
- package/dist/rescan/rescan-scheduler.js +0 -179
- package/dist/site-transformer/browser-tools.d.ts +0 -10
- package/dist/site-transformer/browser-tools.js +0 -59
- package/dist/site-transformer/index.d.ts +0 -2
- package/dist/site-transformer/index.js +0 -2
- package/dist/site-transformer/selector-healer.d.ts +0 -8
- package/dist/site-transformer/selector-healer.js +0 -106
- package/dist/site-transformer/tool-generator.d.ts +0 -13
- package/dist/site-transformer/tool-generator.js +0 -245
- package/dist/transformer/auth-detector.d.ts +0 -13
- package/dist/transformer/auth-detector.js +0 -90
- package/dist/transformer/catalog-builder.d.ts +0 -18
- package/dist/transformer/catalog-builder.js +0 -56
- package/dist/transformer/client-compat.d.ts +0 -6
- package/dist/transformer/client-compat.js +0 -44
- package/dist/transformer/har-clusterer.d.ts +0 -9
- package/dist/transformer/har-clusterer.js +0 -27
- package/dist/transformer/har-dedup.d.ts +0 -10
- package/dist/transformer/har-dedup.js +0 -81
- package/dist/transformer/har-schema-inferrer.d.ts +0 -15
- package/dist/transformer/har-schema-inferrer.js +0 -90
- package/dist/transformer/har-to-operations.d.ts +0 -13
- package/dist/transformer/har-to-operations.js +0 -192
- package/dist/transformer/index.d.ts +0 -8
- package/dist/transformer/index.js +0 -6
- package/dist/transformer/llm-namer.d.ts +0 -6
- package/dist/transformer/llm-namer.js +0 -59
- package/dist/transformer/naming.d.ts +0 -4
- package/dist/transformer/naming.js +0 -30
- package/dist/transformer/operation-filter.d.ts +0 -13
- package/dist/transformer/operation-filter.js +0 -52
- package/dist/transformer/resource-builder.d.ts +0 -12
- package/dist/transformer/resource-builder.js +0 -80
- package/dist/transformer/schema-merger.d.ts +0 -14
- package/dist/transformer/schema-merger.js +0 -65
- package/dist/transformer/tool-builder.d.ts +0 -3
- package/dist/transformer/tool-builder.js +0 -114
- package/dist/types/index.d.ts +0 -131
- package/dist/types/index.js +0 -1
- package/dist/types/site.d.ts +0 -284
- package/dist/types/site.js +0 -8
- package/dist/utils/fail.d.ts +0 -48
- package/dist/utils/fail.js +0 -204
- package/dist/utils/fs.d.ts +0 -5
- package/dist/utils/fs.js +0 -28
- package/dist/utils/interactive.d.ts +0 -6
- package/dist/utils/interactive.js +0 -30
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.js +0 -2
- package/dist/utils/sanitize.d.ts +0 -28
- package/dist/utils/sanitize.js +0 -44
- package/dist/utils/watcher.d.ts +0 -11
- 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">×</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 & 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>
|