@betterportal/tunnels 1.0.18 → 1.0.24

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 (152) hide show
  1. package/package.json +1 -1
  2. package/lib/.bsb/clients/service-tunnels-client.d.ts +0 -133
  3. package/lib/.bsb/clients/service-tunnels-client.d.ts.map +0 -1
  4. package/lib/.bsb/clients/service-tunnels-client.js +0 -102
  5. package/lib/.bsb/clients/service-tunnels-client.js.map +0 -1
  6. package/lib/.bsb/clients/service-tunnels-proxy.d.ts +0 -43
  7. package/lib/.bsb/clients/service-tunnels-proxy.d.ts.map +0 -1
  8. package/lib/.bsb/clients/service-tunnels-proxy.js +0 -47
  9. package/lib/.bsb/clients/service-tunnels-proxy.js.map +0 -1
  10. package/lib/auth.d.ts +0 -12
  11. package/lib/auth.d.ts.map +0 -1
  12. package/lib/auth.js +0 -59
  13. package/lib/auth.js.map +0 -1
  14. package/lib/cli.d.ts +0 -2
  15. package/lib/cli.d.ts.map +0 -1
  16. package/lib/cli.js +0 -406
  17. package/lib/cli.js.map +0 -1
  18. package/lib/generated/prisma/client.d.ts +0 -1
  19. package/lib/generated/prisma/client.js +0 -5
  20. package/lib/generated/prisma/default.d.ts +0 -1
  21. package/lib/generated/prisma/default.js +0 -5
  22. package/lib/generated/prisma/edge.d.ts +0 -1
  23. package/lib/generated/prisma/edge.js +0 -278
  24. package/lib/generated/prisma/index-browser.js +0 -304
  25. package/lib/generated/prisma/index.d.ts +0 -13885
  26. package/lib/generated/prisma/index.js +0 -278
  27. package/lib/generated/prisma/package.json +0 -144
  28. package/lib/generated/prisma/query_compiler_fast_bg.js +0 -2
  29. package/lib/generated/prisma/query_compiler_fast_bg.wasm +0 -0
  30. package/lib/generated/prisma/query_compiler_fast_bg.wasm-base64.js +0 -2
  31. package/lib/generated/prisma/runtime/client.d.ts +0 -3386
  32. package/lib/generated/prisma/runtime/client.js +0 -86
  33. package/lib/generated/prisma/runtime/index-browser.d.ts +0 -90
  34. package/lib/generated/prisma/runtime/index-browser.js +0 -6
  35. package/lib/generated/prisma/runtime/wasm-compiler-edge.js +0 -76
  36. package/lib/generated/prisma/schema.prisma +0 -142
  37. package/lib/generated/prisma/wasm-edge-light-loader.mjs +0 -5
  38. package/lib/generated/prisma/wasm-worker-loader.mjs +0 -5
  39. package/lib/plugins/service-tunnels-admin/.bp-generated/registry.d.ts +0 -3
  40. package/lib/plugins/service-tunnels-admin/.bp-generated/registry.d.ts.map +0 -1
  41. package/lib/plugins/service-tunnels-admin/.bp-generated/registry.js +0 -148
  42. package/lib/plugins/service-tunnels-admin/.bp-generated/registry.js.map +0 -1
  43. package/lib/plugins/service-tunnels-admin/assets/brand/bettertunnels-horizontal-light.svg +0 -18
  44. package/lib/plugins/service-tunnels-admin/assets/brand/bettertunnels-square-dark-1024x1024.png +0 -0
  45. package/lib/plugins/service-tunnels-admin/assets/brand/favicon.svg +0 -12
  46. package/lib/plugins/service-tunnels-admin/betterportal-logo.png +0 -0
  47. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.d.ts +0 -20
  48. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.d.ts.map +0 -1
  49. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.js +0 -51
  50. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.js.map +0 -1
  51. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.d.ts +0 -5
  52. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.d.ts.map +0 -1
  53. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.js +0 -6
  54. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.js.map +0 -1
  55. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.d.ts +0 -7
  56. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.d.ts.map +0 -1
  57. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.js +0 -12
  58. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.js.map +0 -1
  59. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.d.ts +0 -35
  60. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.d.ts.map +0 -1
  61. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.js +0 -44
  62. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.js.map +0 -1
  63. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.d.ts +0 -5
  64. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.d.ts.map +0 -1
  65. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.js +0 -22
  66. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.js.map +0 -1
  67. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.d.ts +0 -7
  68. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.d.ts.map +0 -1
  69. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.js +0 -14
  70. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.js.map +0 -1
  71. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/GET.d.ts +0 -25
  72. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/GET.d.ts.map +0 -1
  73. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/GET.js +0 -34
  74. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/GET.js.map +0 -1
  75. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.d.ts +0 -5
  76. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.d.ts.map +0 -1
  77. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.js +0 -5
  78. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.js.map +0 -1
  79. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.d.ts +0 -7
  80. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.d.ts.map +0 -1
  81. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.js +0 -12
  82. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.js.map +0 -1
  83. package/lib/plugins/service-tunnels-admin/bp-routes/landing/GET.d.ts +0 -35
  84. package/lib/plugins/service-tunnels-admin/bp-routes/landing/GET.d.ts.map +0 -1
  85. package/lib/plugins/service-tunnels-admin/bp-routes/landing/GET.js +0 -52
  86. package/lib/plugins/service-tunnels-admin/bp-routes/landing/GET.js.map +0 -1
  87. package/lib/plugins/service-tunnels-admin/bp-routes/landing/_theme.bootstrap1/GET.d.ts +0 -5
  88. package/lib/plugins/service-tunnels-admin/bp-routes/landing/_theme.bootstrap1/GET.d.ts.map +0 -1
  89. package/lib/plugins/service-tunnels-admin/bp-routes/landing/_theme.bootstrap1/GET.js +0 -5
  90. package/lib/plugins/service-tunnels-admin/bp-routes/landing/_theme.bootstrap1/GET.js.map +0 -1
  91. package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.d.ts +0 -7
  92. package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.d.ts.map +0 -1
  93. package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.js +0 -12
  94. package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.js.map +0 -1
  95. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/GET.d.ts +0 -39
  96. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/GET.d.ts.map +0 -1
  97. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/GET.js +0 -46
  98. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/GET.js.map +0 -1
  99. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.d.ts +0 -5
  100. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.d.ts.map +0 -1
  101. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.js +0 -5
  102. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.js.map +0 -1
  103. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.d.ts +0 -7
  104. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.d.ts.map +0 -1
  105. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.js +0 -14
  106. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.js.map +0 -1
  107. package/lib/plugins/service-tunnels-admin/brand-assets.d.ts +0 -7
  108. package/lib/plugins/service-tunnels-admin/brand-assets.d.ts.map +0 -1
  109. package/lib/plugins/service-tunnels-admin/brand-assets.js +0 -24
  110. package/lib/plugins/service-tunnels-admin/brand-assets.js.map +0 -1
  111. package/lib/plugins/service-tunnels-admin/index.d.ts +0 -64
  112. package/lib/plugins/service-tunnels-admin/index.d.ts.map +0 -1
  113. package/lib/plugins/service-tunnels-admin/index.js +0 -116
  114. package/lib/plugins/service-tunnels-admin/index.js.map +0 -1
  115. package/lib/plugins/service-tunnels-client/ids.d.ts +0 -6
  116. package/lib/plugins/service-tunnels-client/ids.d.ts.map +0 -1
  117. package/lib/plugins/service-tunnels-client/ids.js +0 -17
  118. package/lib/plugins/service-tunnels-client/ids.js.map +0 -1
  119. package/lib/plugins/service-tunnels-client/index.d.ts +0 -166
  120. package/lib/plugins/service-tunnels-client/index.d.ts.map +0 -1
  121. package/lib/plugins/service-tunnels-client/index.js +0 -695
  122. package/lib/plugins/service-tunnels-client/index.js.map +0 -1
  123. package/lib/plugins/service-tunnels-client/registry.d.ts +0 -36
  124. package/lib/plugins/service-tunnels-client/registry.d.ts.map +0 -1
  125. package/lib/plugins/service-tunnels-client/registry.js +0 -14
  126. package/lib/plugins/service-tunnels-client/registry.js.map +0 -1
  127. package/lib/plugins/service-tunnels-client/schemas.d.ts +0 -91
  128. package/lib/plugins/service-tunnels-client/schemas.d.ts.map +0 -1
  129. package/lib/plugins/service-tunnels-client/schemas.js +0 -73
  130. package/lib/plugins/service-tunnels-client/schemas.js.map +0 -1
  131. package/lib/plugins/service-tunnels-proxy/http.d.ts +0 -5
  132. package/lib/plugins/service-tunnels-proxy/http.d.ts.map +0 -1
  133. package/lib/plugins/service-tunnels-proxy/http.js +0 -125
  134. package/lib/plugins/service-tunnels-proxy/http.js.map +0 -1
  135. package/lib/plugins/service-tunnels-proxy/index.d.ts +0 -85
  136. package/lib/plugins/service-tunnels-proxy/index.d.ts.map +0 -1
  137. package/lib/plugins/service-tunnels-proxy/index.js +0 -288
  138. package/lib/plugins/service-tunnels-proxy/index.js.map +0 -1
  139. package/lib/plugins/service-tunnels-proxy/verification.d.ts +0 -31
  140. package/lib/plugins/service-tunnels-proxy/verification.d.ts.map +0 -1
  141. package/lib/plugins/service-tunnels-proxy/verification.js +0 -211
  142. package/lib/plugins/service-tunnels-proxy/verification.js.map +0 -1
  143. package/lib/prisma.d.ts +0 -7
  144. package/lib/prisma.d.ts.map +0 -1
  145. package/lib/prisma.js +0 -149
  146. package/lib/prisma.js.map +0 -1
  147. package/lib/schemas/service-tunnels-admin.json +0 -129
  148. package/lib/schemas/service-tunnels-admin.plugin.json +0 -140
  149. package/lib/schemas/service-tunnels-client.json +0 -320
  150. package/lib/schemas/service-tunnels-client.plugin.json +0 -97
  151. package/lib/schemas/service-tunnels-proxy.json +0 -160
  152. package/lib/schemas/service-tunnels-proxy.plugin.json +0 -123
@@ -1,142 +0,0 @@
1
- generator client {
2
- provider = "prisma-client-js"
3
- output = "../src/generated/prisma"
4
- }
5
-
6
- datasource db {
7
- provider = "postgresql"
8
- }
9
-
10
- model Account {
11
- id String @id @default(cuid())
12
- email String? @unique
13
- plan AccountPlan @default(anonymous)
14
- verificationBypass Boolean @default(false)
15
- ipVerification Boolean @default(false)
16
- createdAt DateTime @default(now())
17
- tunnels Tunnel[]
18
- }
19
-
20
- model ClientSession {
21
- id String @id @default(cuid())
22
- accountId String?
23
- ipHash String?
24
- userAgent String?
25
- createdAt DateTime @default(now())
26
- expiresAt DateTime?
27
- tunnels Tunnel[]
28
- }
29
-
30
- model Tunnel {
31
- id String @id @default(cuid())
32
- accountId String?
33
- sessionId String
34
- subdomain String @unique
35
- ownerServerId String?
36
- targetHost String
37
- targetPort Int
38
- authenticated Boolean @default(false)
39
- validation String @default("cookie")
40
- status TunnelStatus @default(created)
41
- createdAt DateTime @default(now())
42
- expiresAt DateTime
43
- account Account? @relation(fields: [accountId], references: [id])
44
- session ClientSession @relation(fields: [sessionId], references: [id])
45
- validations VisitorValidation[]
46
- usage UsageCounter?
47
-
48
- @@index([sessionId])
49
- @@index([expiresAt])
50
- }
51
-
52
- model VisitorValidation {
53
- id String @id @default(cuid())
54
- tunnelId String
55
- visitorIpHash String
56
- userAgentHash String
57
- validationCookieHash String
58
- validatedAt DateTime @default(now())
59
- expiresAt DateTime
60
- tunnel Tunnel @relation(fields: [tunnelId], references: [id])
61
-
62
- @@index([tunnelId, visitorIpHash, userAgentHash])
63
- }
64
-
65
- model UsageCounter {
66
- tunnelId String @id
67
- requests Int @default(0)
68
- bytesIn BigInt @default(0)
69
- bytesOut BigInt @default(0)
70
- updatedAt DateTime @updatedAt
71
- tunnel Tunnel @relation(fields: [tunnelId], references: [id])
72
- }
73
-
74
- model AuditEvent {
75
- id String @id @default(cuid())
76
- event String
77
- subjectId String?
78
- data Json?
79
- createdAt DateTime @default(now())
80
- }
81
-
82
- model ClientAuthSession {
83
- id String @id @default(cuid())
84
- browserKeyHash String
85
- pollSecretHash String
86
- status AuthSessionStatus @default(pending)
87
- tenantId String?
88
- appId String?
89
- bpUserSubject String?
90
- bpUserEmail String?
91
- clientIpHash String?
92
- userAgentHash String?
93
- expiresAt DateTime
94
- approvedAt DateTime?
95
- consumedAt DateTime?
96
- createdAt DateTime @default(now())
97
-
98
- @@index([status, expiresAt])
99
- }
100
-
101
- model ClientDeviceToken {
102
- id String @id @default(cuid())
103
- accountId String?
104
- tenantId String
105
- bpUserSubject String
106
- tokenHash String @unique
107
- name String?
108
- ipRangeHash String
109
- ipFamily String
110
- userAgentHash String?
111
- expiresAt DateTime
112
- revokedAt DateTime?
113
- lastUsedAt DateTime?
114
- createdAt DateTime @default(now())
115
-
116
- @@index([tenantId, bpUserSubject])
117
- @@index([expiresAt])
118
- }
119
-
120
- enum TunnelStatus {
121
- created
122
- active
123
- draining
124
- disconnected
125
- expired
126
- closed
127
- }
128
-
129
- enum AccountPlan {
130
- anonymous
131
- free
132
- paid
133
- admin
134
- }
135
-
136
- enum AuthSessionStatus {
137
- pending
138
- approved
139
- consumed
140
- expired
141
- denied
142
- }
@@ -1,5 +0,0 @@
1
-
2
- /* !!! This is code generated by Prisma. Do not edit directly. !!!
3
- /* eslint-disable */
4
- // biome-ignore-all lint: generated file
5
- export default import('./query_compiler_fast_bg.wasm?module')
@@ -1,5 +0,0 @@
1
-
2
- /* !!! This is code generated by Prisma. Do not edit directly. !!!
3
- /* eslint-disable */
4
- // biome-ignore-all lint: generated file
5
- export default import('./query_compiler_fast_bg.wasm')
@@ -1,3 +0,0 @@
1
- import type { BetterPortalRegistry } from "@betterportal/framework";
2
- export declare const registry: BetterPortalRegistry;
3
- //# sourceMappingURL=registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/plugins/service-tunnels-admin/.bp-generated/registry.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,eAAO,MAAM,QAAQ,EAAE,oBAkItB,CAAC"}
@@ -1,148 +0,0 @@
1
- // AUTO-GENERATED by BetterPortal codegen - DO NOT EDIT
2
- import * as betterTunnelsCliAuthVerifyRoute from "../bp-routes/cli-auth/verify/index.js";
3
- import * as betterTunnelsCliAuthVerifyGETRoute from "../bp-routes/cli-auth/verify/GET.js";
4
- import * as betterTunnelsCliAuthVerifyBootstrap1PageGET from "../bp-routes/cli-auth/verify/_theme.bootstrap1/GET.js";
5
- import * as betterTunnelsDashboardRoute from "../bp-routes/dashboard/index.js";
6
- import * as betterTunnelsDashboardGETRoute from "../bp-routes/dashboard/GET.js";
7
- import * as betterTunnelsDashboardBootstrap1PageGET from "../bp-routes/dashboard/_theme.bootstrap1/GET.js";
8
- import * as betterTunnelsDownloadsRoute from "../bp-routes/downloads/index.js";
9
- import * as betterTunnelsDownloadsGETRoute from "../bp-routes/downloads/GET.js";
10
- import * as betterTunnelsDownloadsBootstrap1PageGET from "../bp-routes/downloads/_theme.bootstrap1/GET.js";
11
- import * as betterTunnelsLandingRoute from "../bp-routes/landing/index.js";
12
- import * as betterTunnelsLandingGETRoute from "../bp-routes/landing/GET.js";
13
- import * as betterTunnelsLandingBootstrap1PageGET from "../bp-routes/landing/_theme.bootstrap1/GET.js";
14
- import * as betterTunnelsTunnelsRoute from "../bp-routes/tunnels/index.js";
15
- import * as betterTunnelsTunnelsGETRoute from "../bp-routes/tunnels/GET.js";
16
- import * as betterTunnelsTunnelsBootstrap1PageGET from "../bp-routes/tunnels/_theme.bootstrap1/GET.js";
17
- export const registry = {
18
- routes: [
19
- {
20
- viewId: "better-tunnels.cli-auth.verify",
21
- path: "/cli-auth/verify",
22
- methods: ["GET"],
23
- paramNames: [],
24
- schemas: {
25
- response: betterTunnelsCliAuthVerifyGETRoute.ResponseSchema,
26
- query: betterTunnelsCliAuthVerifyGETRoute.QuerySchema
27
- },
28
- methodRoutes: { GET: { method: "GET", schemas: {
29
- response: betterTunnelsCliAuthVerifyGETRoute.ResponseSchema,
30
- query: betterTunnelsCliAuthVerifyGETRoute.QuerySchema
31
- }, handler: betterTunnelsCliAuthVerifyGETRoute.default } },
32
- handlers: { GET: betterTunnelsCliAuthVerifyGETRoute.default },
33
- title: betterTunnelsCliAuthVerifyRoute.title,
34
- description: betterTunnelsCliAuthVerifyRoute.description,
35
- auth: betterTunnelsCliAuthVerifyRoute.auth,
36
- cacheHints: betterTunnelsCliAuthVerifyRoute.cacheHints,
37
- demoScenarios: [],
38
- themeRenderers: {
39
- "bootstrap1": {
40
- pages: [{ rendererId: "default", type: "page", method: "GET", render: betterTunnelsCliAuthVerifyBootstrap1PageGET.render }],
41
- components: [],
42
- fragments: []
43
- }
44
- }
45
- },
46
- {
47
- viewId: "better-tunnels.dashboard",
48
- path: "/dashboard",
49
- methods: ["GET"],
50
- paramNames: [],
51
- schemas: {
52
- response: betterTunnelsDashboardGETRoute.ResponseSchema
53
- },
54
- methodRoutes: { GET: { method: "GET", schemas: {
55
- response: betterTunnelsDashboardGETRoute.ResponseSchema
56
- }, handler: betterTunnelsDashboardGETRoute.default } },
57
- handlers: { GET: betterTunnelsDashboardGETRoute.default },
58
- title: betterTunnelsDashboardRoute.title,
59
- description: betterTunnelsDashboardRoute.description,
60
- auth: betterTunnelsDashboardRoute.auth,
61
- cacheHints: betterTunnelsDashboardRoute.cacheHints,
62
- demoScenarios: [],
63
- themeRenderers: {
64
- "bootstrap1": {
65
- pages: [{ rendererId: "default", type: "page", method: "GET", render: betterTunnelsDashboardBootstrap1PageGET.render }],
66
- components: [],
67
- fragments: []
68
- }
69
- }
70
- },
71
- {
72
- viewId: "better-tunnels.downloads",
73
- path: "/downloads",
74
- methods: ["GET"],
75
- paramNames: [],
76
- schemas: {
77
- response: betterTunnelsDownloadsGETRoute.ResponseSchema
78
- },
79
- methodRoutes: { GET: { method: "GET", schemas: {
80
- response: betterTunnelsDownloadsGETRoute.ResponseSchema
81
- }, handler: betterTunnelsDownloadsGETRoute.default } },
82
- handlers: { GET: betterTunnelsDownloadsGETRoute.default },
83
- title: betterTunnelsDownloadsRoute.title,
84
- description: betterTunnelsDownloadsRoute.description,
85
- auth: betterTunnelsDownloadsRoute.auth,
86
- cacheHints: betterTunnelsDownloadsRoute.cacheHints,
87
- demoScenarios: [],
88
- themeRenderers: {
89
- "bootstrap1": {
90
- pages: [{ rendererId: "default", type: "page", method: "GET", render: betterTunnelsDownloadsBootstrap1PageGET.render }],
91
- components: [],
92
- fragments: []
93
- }
94
- }
95
- },
96
- {
97
- viewId: "better-tunnels.landing",
98
- path: "/landing",
99
- methods: ["GET"],
100
- paramNames: [],
101
- schemas: {
102
- response: betterTunnelsLandingGETRoute.ResponseSchema
103
- },
104
- methodRoutes: { GET: { method: "GET", schemas: {
105
- response: betterTunnelsLandingGETRoute.ResponseSchema
106
- }, handler: betterTunnelsLandingGETRoute.default } },
107
- handlers: { GET: betterTunnelsLandingGETRoute.default },
108
- title: betterTunnelsLandingRoute.title,
109
- description: betterTunnelsLandingRoute.description,
110
- auth: betterTunnelsLandingRoute.auth,
111
- cacheHints: betterTunnelsLandingRoute.cacheHints,
112
- demoScenarios: [],
113
- themeRenderers: {
114
- "bootstrap1": {
115
- pages: [{ rendererId: "default", type: "page", method: "GET", render: betterTunnelsLandingBootstrap1PageGET.render }],
116
- components: [],
117
- fragments: []
118
- }
119
- }
120
- },
121
- {
122
- viewId: "better-tunnels.tunnels",
123
- path: "/tunnels",
124
- methods: ["GET"],
125
- paramNames: [],
126
- schemas: {
127
- response: betterTunnelsTunnelsGETRoute.ResponseSchema
128
- },
129
- methodRoutes: { GET: { method: "GET", schemas: {
130
- response: betterTunnelsTunnelsGETRoute.ResponseSchema
131
- }, handler: betterTunnelsTunnelsGETRoute.default } },
132
- handlers: { GET: betterTunnelsTunnelsGETRoute.default },
133
- title: betterTunnelsTunnelsRoute.title,
134
- description: betterTunnelsTunnelsRoute.description,
135
- auth: betterTunnelsTunnelsRoute.auth,
136
- cacheHints: betterTunnelsTunnelsRoute.cacheHints,
137
- demoScenarios: [],
138
- themeRenderers: {
139
- "bootstrap1": {
140
- pages: [{ rendererId: "default", type: "page", method: "GET", render: betterTunnelsTunnelsBootstrap1PageGET.render }],
141
- components: [],
142
- fragments: []
143
- }
144
- }
145
- }
146
- ]
147
- };
148
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/plugins/service-tunnels-admin/.bp-generated/registry.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="1600" height="420" viewBox="0 0 1600 420" role="img" aria-label="BetterTunnels logo">
2
-
3
- <g transform="translate(70 42) scale(0.66)">
4
- <defs>
5
- <linearGradient id="g" x1="120" y1="80" x2="390" y2="430" gradientUnits="userSpaceOnUse">
6
- <stop offset="0" stop-color="#1495FF"/>
7
- <stop offset="1" stop-color="#004DE6"/>
8
- </linearGradient>
9
- </defs>
10
-
11
- <path d="M126 344V226c0-73 57-132 130-132s130 59 130 132v118" fill="none" stroke="url(#g)" stroke-width="72" stroke-linecap="butt" stroke-linejoin="round"/>
12
- <path d="M194 346L112 448H188L256 356L324 448H400L318 346" fill="#0B6CFF"/>
13
- <path d="M226 304V226c0-17 13-30 30-30s30 13 30 30v78" fill="#0B6CFF"/>
14
- </g>
15
- <text x="420" y="252" font-family="Inter, Arial, Helvetica, sans-serif" font-size="132" font-weight="800" letter-spacing="-5">
16
- <tspan fill="#071A3A">Better</tspan><tspan fill="#0B6CFF">Tunnels</tspan>
17
- </text>
18
- </svg>
@@ -1,12 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-label="BetterTunnels mark">
2
- <defs>
3
- <linearGradient id="g" x1="120" y1="80" x2="390" y2="430" gradientUnits="userSpaceOnUse">
4
- <stop offset="0" stop-color="#1495FF"/>
5
- <stop offset="1" stop-color="#004DE6"/>
6
- </linearGradient>
7
- </defs>
8
- <rect width="512" height="512" rx="96" fill="#0B6CFF"/>
9
- <path d="M126 344V226c0-73 57-132 130-132s130 59 130 132v118" fill="none" stroke="url(#g)" stroke-width="72" stroke-linecap="butt" stroke-linejoin="round"/>
10
- <path d="M194 346L112 448H188L256 356L324 448H400L318 346" fill="#FFFFFF"/>
11
- <path d="M226 304V226c0-17 13-30 30-30s30 13 30 30v78" fill="#FFFFFF"/>
12
- </svg>
@@ -1,20 +0,0 @@
1
- import * as av from "anyvali";
2
- import type { Infer } from "anyvali";
3
- export declare const QuerySchema: av.ObjectSchema<{
4
- session: av.OptionalSchema<av.StringSchema>;
5
- key: av.OptionalSchema<av.StringSchema>;
6
- }>;
7
- export declare const ResponseSchema: av.ObjectSchema<{
8
- status: av.StringSchema;
9
- message: av.StringSchema;
10
- }>;
11
- export type ResponseData = Infer<typeof ResponseSchema>;
12
- declare const _default: import("@betterportal/framework").RouteHandler<Record<string, string>, {
13
- session?: string | undefined;
14
- key?: string | undefined;
15
- }, Record<string, string>, Record<string, unknown>, {
16
- status: string;
17
- message: string;
18
- }, unknown, Record<string, unknown>>;
19
- export default _default;
20
- //# sourceMappingURL=GET.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKrC,eAAO,MAAM,WAAW;;;EAGI,CAAC;AAE7B,eAAO,MAAM,cAAc;;;EAGC,CAAC;AAC7B,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;;;;;;;;AAExD,wBA+CE"}
@@ -1,51 +0,0 @@
1
- import * as av from "anyvali";
2
- import { createHandler } from "@betterportal/framework";
3
- import { hashSecret, verifySecret } from "../../../../../auth.js";
4
- import { prisma } from "../../../../../prisma.js";
5
- export const QuerySchema = av.object({
6
- session: av.optional(av.string().minLength(1)),
7
- key: av.optional(av.string().minLength(1))
8
- }, { unknownKeys: "strip" });
9
- export const ResponseSchema = av.object({
10
- status: av.string(),
11
- message: av.string()
12
- }, { unknownKeys: "strip" });
13
- export default createHandler({ query: QuerySchema, response: ResponseSchema }, async (ctx) => {
14
- const query = ctx.query;
15
- if (!query.session || !query.key) {
16
- return { status: "invalid", message: "This CLI authentication link is missing required session details." };
17
- }
18
- const session = await prisma.clientAuthSession.findUnique({
19
- where: { id: query.session }
20
- });
21
- if (!session || session.status !== "pending" || session.expiresAt <= new Date()) {
22
- return { status: "invalid", message: "This CLI authentication request is no longer valid." };
23
- }
24
- if (!verifySecret(query.key, session.browserKeyHash)) {
25
- return { status: "invalid", message: "This CLI authentication request is no longer valid." };
26
- }
27
- const configuredAppId = typeof ctx.config?.mainAuthAppId === "string" ? ctx.config.mainAuthAppId : undefined;
28
- if (configuredAppId && ctx.app.id !== configuredAppId) {
29
- return { status: "invalid", message: "This BetterPortal app is not configured for BetterTunnels CLI authentication." };
30
- }
31
- const user = ctx.user;
32
- const subject = String(user?.sub ?? user?.subject ?? user?.id ?? "unknown");
33
- const email = typeof user?.email === "string" ? user.email : undefined;
34
- await prisma.clientAuthSession.update({
35
- where: { id: session.id },
36
- data: {
37
- status: "approved",
38
- tenantId: ctx.tenant.id,
39
- appId: ctx.app.id,
40
- bpUserSubject: subject,
41
- bpUserEmail: email,
42
- approvedAt: new Date(),
43
- userAgentHash: typeof ctx.headers["user-agent"] === "string" ? hashSecret(ctx.headers["user-agent"]) : session.userAgentHash
44
- }
45
- });
46
- return {
47
- status: "approved",
48
- message: "BetterTunnels CLI authenticated. You can close this tab."
49
- };
50
- });
51
- //# sourceMappingURL=GET.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /** @jsxImportSource jsx-htmx */
2
- import type { HtmlRenderable } from "@betterportal/framework";
3
- import type { ResponseData } from "../GET.js";
4
- export declare function render(data: ResponseData): HtmlRenderable;
5
- //# sourceMappingURL=GET.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,wBAAgB,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAazD"}
@@ -1,6 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "jsx-htmx/jsx-runtime";
2
- export function render(data) {
3
- const ok = data.status === "approved";
4
- return (_jsx("section", { class: "container py-5", children: _jsxs("div", { class: `border rounded-3 p-4 ${ok ? "bg-body" : "bg-danger-subtle border-danger"}`, children: [_jsx("div", { class: `text-uppercase fw-semibold small mb-2 ${ok ? "text-success" : "text-danger"}`, children: "BetterTunnels CLI" }), _jsx("h1", { class: "h3 mb-3", children: ok ? "Authenticated" : "Authentication failed" }), _jsx("p", { class: "lead mb-0", children: data.message })] }) }));
5
- }
6
- //# sourceMappingURL=GET.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.tsx"],"names":[],"mappings":";AAIA,MAAM,UAAU,MAAM,CAAC,IAAkB;IACvC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC;IACtC,OAAO,CACL,kBAAS,KAAK,EAAC,gBAAgB,YAC7B,eAAK,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gCAAgC,EAAE,aACrF,cAAK,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,EAAE,kCAEpF,EACN,aAAI,KAAK,EAAC,SAAS,YAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,uBAAuB,GAAM,EACzE,YAAG,KAAK,EAAC,WAAW,YAAE,IAAI,CAAC,OAAO,GAAK,IACnC,GACE,CACX,CAAC;AACJ,CAAC"}
@@ -1,7 +0,0 @@
1
- import { type ApiAuthRequirement, type CacheHints } from "@betterportal/framework";
2
- export declare const viewId = "better-tunnels.cli-auth.verify";
3
- export declare const title = "BetterTunnels CLI Authentication";
4
- export declare const description = "Approves a pending BetterTunnels CLI login session.";
5
- export declare const auth: ApiAuthRequirement;
6
- export declare const cacheHints: CacheHints;
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,MAAM,mCAAmC,CAAC;AACvD,eAAO,MAAM,KAAK,qCAAqC,CAAC;AACxD,eAAO,MAAM,WAAW,wDAAwD,CAAC;AAEjF,eAAO,MAAM,IAAI,EAAE,kBAGlB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAGxB,CAAC"}
@@ -1,12 +0,0 @@
1
- export const viewId = "better-tunnels.cli-auth.verify";
2
- export const title = "BetterTunnels CLI Authentication";
3
- export const description = "Approves a pending BetterTunnels CLI login session.";
4
- export const auth = {
5
- required: true,
6
- permissions: []
7
- };
8
- export const cacheHints = {
9
- ttlSeconds: 0,
10
- varyBy: ["accept", "authorization", "x-bp-tenant-id", "x-bp-app-id"]
11
- };
12
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,MAAM,GAAG,gCAAgC,CAAC;AACvD,MAAM,CAAC,MAAM,KAAK,GAAG,kCAAkC,CAAC;AACxD,MAAM,CAAC,MAAM,WAAW,GAAG,qDAAqD,CAAC;AAEjF,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,UAAU,EAAE,CAAC;IACb,MAAM,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,CAAC;CACrE,CAAC"}
@@ -1,35 +0,0 @@
1
- import * as av from "anyvali";
2
- import type { Infer } from "anyvali";
3
- export declare const ResponseSchema: av.ObjectSchema<{
4
- activeTunnels: av.NumberSchema;
5
- totalTunnels: av.NumberSchema;
6
- anonymousAccounts: av.NumberSchema;
7
- registeredAccounts: av.NumberSchema;
8
- requests: av.NumberSchema;
9
- bytesIn: av.NumberSchema;
10
- bytesOut: av.NumberSchema;
11
- recentAuditEvents: av.ArraySchema<av.ObjectSchema<{
12
- id: av.StringSchema;
13
- event: av.StringSchema;
14
- subjectId: av.OptionalSchema<av.StringSchema>;
15
- createdAt: av.StringSchema;
16
- }>>;
17
- }>;
18
- export type ResponseData = Infer<typeof ResponseSchema>;
19
- declare const _default: import("@betterportal/framework").RouteHandler<Record<string, string>, Record<string, unknown>, Record<string, string>, Record<string, unknown>, {
20
- activeTunnels: number;
21
- totalTunnels: number;
22
- anonymousAccounts: number;
23
- registeredAccounts: number;
24
- requests: number;
25
- bytesIn: number;
26
- bytesOut: number;
27
- recentAuditEvents: {
28
- id: string;
29
- event: string;
30
- createdAt: string;
31
- subjectId?: string | undefined;
32
- }[];
33
- }, unknown, Record<string, unknown>>;
34
- export default _default;
35
- //# sourceMappingURL=GET.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAIrC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;EAcC,CAAC;AAC7B,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;;;;;;;;;;;;;;;;AAExD,wBAmCE"}
@@ -1,44 +0,0 @@
1
- import * as av from "anyvali";
2
- import { createHandler } from "@betterportal/framework";
3
- import { prisma } from "../../../../prisma.js";
4
- export const ResponseSchema = av.object({
5
- activeTunnels: av.number(),
6
- totalTunnels: av.number(),
7
- anonymousAccounts: av.number(),
8
- registeredAccounts: av.number(),
9
- requests: av.number(),
10
- bytesIn: av.number(),
11
- bytesOut: av.number(),
12
- recentAuditEvents: av.array(av.object({
13
- id: av.string(),
14
- event: av.string(),
15
- subjectId: av.optional(av.string()),
16
- createdAt: av.string()
17
- }, { unknownKeys: "strip" }))
18
- }, { unknownKeys: "strip" });
19
- export default createHandler({ response: ResponseSchema }, async () => {
20
- const [activeTunnels, totalTunnels, anonymousAccounts, registeredAccounts, usageRows, recentAuditEvents] = await Promise.all([
21
- prisma.tunnel.count({ where: { status: "active" } }),
22
- prisma.tunnel.count(),
23
- prisma.account.count({ where: { plan: "anonymous" } }),
24
- prisma.account.count({ where: { NOT: { plan: "anonymous" } } }),
25
- prisma.usageCounter.findMany(),
26
- prisma.auditEvent.findMany({ orderBy: { createdAt: "desc" }, take: 10 })
27
- ]);
28
- return {
29
- activeTunnels,
30
- totalTunnels,
31
- anonymousAccounts,
32
- registeredAccounts,
33
- requests: usageRows.reduce((sum, row) => sum + row.requests, 0),
34
- bytesIn: usageRows.reduce((sum, row) => sum + Number(row.bytesIn), 0),
35
- bytesOut: usageRows.reduce((sum, row) => sum + Number(row.bytesOut), 0),
36
- recentAuditEvents: recentAuditEvents.map((event) => ({
37
- id: event.id,
38
- event: event.event,
39
- subjectId: event.subjectId ?? undefined,
40
- createdAt: event.createdAt.toISOString()
41
- }))
42
- };
43
- });
44
- //# sourceMappingURL=GET.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/GET.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /** @jsxImportSource jsx-htmx */
2
- import type { HtmlRenderable } from "@betterportal/framework";
3
- import type { ResponseData } from "../GET.js";
4
- export declare function render(data: ResponseData): HtmlRenderable;
5
- //# sourceMappingURL=GET.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAS9C,wBAAgB,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CA0DzD"}
@@ -1,22 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "jsx-htmx/jsx-runtime";
2
- function formatBytes(value) {
3
- if (value < 1024)
4
- return `${value} B`;
5
- if (value < 1024 * 1024)
6
- return `${(value / 1024).toFixed(1)} KB`;
7
- if (value < 1024 * 1024 * 1024)
8
- return `${(value / 1024 / 1024).toFixed(1)} MB`;
9
- return `${(value / 1024 / 1024 / 1024).toFixed(1)} GB`;
10
- }
11
- export function render(data) {
12
- const metrics = [
13
- { label: "Active tunnels", value: String(data.activeTunnels) },
14
- { label: "Total tunnels", value: String(data.totalTunnels) },
15
- { label: "Anonymous accounts", value: String(data.anonymousAccounts) },
16
- { label: "Registered accounts", value: String(data.registeredAccounts) },
17
- { label: "Requests", value: String(data.requests) },
18
- { label: "Transfer", value: `${formatBytes(data.bytesIn)} in / ${formatBytes(data.bytesOut)} out` }
19
- ];
20
- return (_jsxs("section", { class: "container-fluid px-0", children: [_jsxs("div", { class: "d-flex justify-content-between align-items-start mb-4", children: [_jsxs("div", { children: [_jsx("h1", { class: "h3 mb-1", children: "BetterTunnels Dashboard" }), _jsx("p", { class: "text-body-secondary mb-0", children: "Platform health, usage, and recent audit activity." })] }), _jsx("a", { class: "btn btn-outline-secondary btn-sm", href: "/tunnels", children: "Tunnel sessions" })] }), _jsx("div", { class: "row g-3 mb-4", children: metrics.map((metric) => (_jsx("div", { class: "col-sm-6 col-xl-4", children: _jsxs("div", { class: "border rounded-3 p-3 bg-body h-100", children: [_jsx("div", { class: "small text-body-secondary mb-1", children: metric.label }), _jsx("div", { class: "h4 mb-0", children: metric.value })] }) }))) }), _jsxs("div", { class: "border rounded-3 bg-body", children: [_jsx("div", { class: "px-3 py-2 border-bottom fw-semibold", children: "Recent audit events" }), _jsx("div", { class: "table-responsive", children: _jsxs("table", { class: "table table-sm align-middle mb-0", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Event" }), _jsx("th", { children: "Subject" }), _jsx("th", { children: "Created" })] }) }), _jsx("tbody", { children: data.recentAuditEvents.length === 0 ? (_jsx("tr", { children: _jsx("td", { colspan: "3", class: "text-center text-body-secondary py-4", children: "No audit events yet." }) })) : data.recentAuditEvents.map((event) => (_jsxs("tr", { children: [_jsx("td", { children: _jsx("code", { children: event.event }) }), _jsx("td", { class: "text-body-secondary", children: event.subjectId ?? "none" }), _jsx("td", { class: "text-body-secondary", children: new Date(event.createdAt).toLocaleString() })] }))) })] }) })] })] }));
21
- }
22
- //# sourceMappingURL=GET.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.tsx"],"names":[],"mappings":"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"}