fa-mcp-sdk 0.4.76 → 0.4.77

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 (198) hide show
  1. package/README.md +319 -314
  2. package/bin/fa-mcp.js +85 -68
  3. package/cli-template/.claude/agents/javascript-pro.md +276 -276
  4. package/cli-template/.claude/settings.json +50 -50
  5. package/cli-template/.claude/skills/upgrade-guide/SKILL.md +2 -1
  6. package/cli-template/.oxfmtrc.json +41 -0
  7. package/cli-template/.oxlintrc.json +120 -0
  8. package/cli-template/CLAUDE.md +358 -355
  9. package/cli-template/FA-MCP-SDK-DOC/00-FA-MCP-SDK-index.md +132 -132
  10. package/cli-template/FA-MCP-SDK-DOC/01-getting-started.md +146 -146
  11. package/cli-template/FA-MCP-SDK-DOC/02-1-tools-and-api.md +431 -431
  12. package/cli-template/FA-MCP-SDK-DOC/02-2-prompts-and-resources.md +201 -201
  13. package/cli-template/FA-MCP-SDK-DOC/03-configuration.md +384 -384
  14. package/cli-template/FA-MCP-SDK-DOC/04-authentication.md +412 -412
  15. package/cli-template/FA-MCP-SDK-DOC/05-ad-authorization.md +196 -196
  16. package/cli-template/FA-MCP-SDK-DOC/06-utilities.md +163 -163
  17. package/cli-template/FA-MCP-SDK-DOC/07-testing-and-operations.md +127 -127
  18. package/cli-template/jest.config.js +27 -30
  19. package/cli-template/package.json +10 -5
  20. package/cli-template/prompt-example-new-MCP.md +101 -101
  21. package/cli-template/readme-docs/SKILLS.md +1 -1
  22. package/cli-template/tsconfig.json +58 -58
  23. package/cli-template/update.cjs +41 -38
  24. package/config/custom-environment-variables.yaml +63 -63
  25. package/config/development.yaml +4 -4
  26. package/config/production.yaml +4 -4
  27. package/config/test.yaml +26 -26
  28. package/dist/core/_types_/TNtlm.d.ts.map +1 -1
  29. package/dist/core/_types_/active-directory-config.d.ts.map +1 -1
  30. package/dist/core/_types_/config.d.ts.map +1 -1
  31. package/dist/core/_types_/types.d.ts.map +1 -1
  32. package/dist/core/ad/group-checker.d.ts.map +1 -1
  33. package/dist/core/ad/group-checker.js.map +1 -1
  34. package/dist/core/agent-tester/agent-tester-router.d.ts.map +1 -1
  35. package/dist/core/agent-tester/agent-tester-router.js +6 -6
  36. package/dist/core/agent-tester/agent-tester-router.js.map +1 -1
  37. package/dist/core/agent-tester/check-llm.d.ts.map +1 -1
  38. package/dist/core/agent-tester/check-llm.js.map +1 -1
  39. package/dist/core/agent-tester/services/SummaryMemory.d.ts.map +1 -1
  40. package/dist/core/agent-tester/services/SummaryMemory.js +3 -9
  41. package/dist/core/agent-tester/services/SummaryMemory.js.map +1 -1
  42. package/dist/core/agent-tester/services/TesterAgentService.d.ts.map +1 -1
  43. package/dist/core/agent-tester/services/TesterAgentService.js +25 -27
  44. package/dist/core/agent-tester/services/TesterAgentService.js.map +1 -1
  45. package/dist/core/agent-tester/services/TesterMcpClientService.d.ts.map +1 -1
  46. package/dist/core/agent-tester/services/TesterMcpClientService.js +26 -25
  47. package/dist/core/agent-tester/services/TesterMcpClientService.js.map +1 -1
  48. package/dist/core/auth/admin-auth.d.ts.map +1 -1
  49. package/dist/core/auth/admin-auth.js +5 -5
  50. package/dist/core/auth/admin-auth.js.map +1 -1
  51. package/dist/core/auth/agent-tester-auth.d.ts.map +1 -1
  52. package/dist/core/auth/agent-tester-auth.js +1 -6
  53. package/dist/core/auth/agent-tester-auth.js.map +1 -1
  54. package/dist/core/auth/basic.d.ts.map +1 -1
  55. package/dist/core/auth/basic.js.map +1 -1
  56. package/dist/core/auth/ip-check.d.ts.map +1 -1
  57. package/dist/core/auth/ip-check.js +1 -1
  58. package/dist/core/auth/ip-check.js.map +1 -1
  59. package/dist/core/auth/jwt.d.ts.map +1 -1
  60. package/dist/core/auth/jwt.js +1 -1
  61. package/dist/core/auth/jwt.js.map +1 -1
  62. package/dist/core/auth/middleware.d.ts.map +1 -1
  63. package/dist/core/auth/middleware.js +9 -6
  64. package/dist/core/auth/middleware.js.map +1 -1
  65. package/dist/core/auth/multi-auth.d.ts.map +1 -1
  66. package/dist/core/auth/multi-auth.js +6 -6
  67. package/dist/core/auth/multi-auth.js.map +1 -1
  68. package/dist/core/auth/revocation.d.ts.map +1 -1
  69. package/dist/core/auth/revocation.js +2 -6
  70. package/dist/core/auth/revocation.js.map +1 -1
  71. package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.d.ts.map +1 -1
  72. package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.js +2 -2
  73. package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.js.map +1 -1
  74. package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js +1 -1
  75. package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js.map +1 -1
  76. package/dist/core/auth/token-generator/ntlm/ntlm-integration.d.ts.map +1 -1
  77. package/dist/core/auth/token-generator/ntlm/ntlm-integration.js +4 -2
  78. package/dist/core/auth/token-generator/ntlm/ntlm-integration.js.map +1 -1
  79. package/dist/core/auth/token-generator/server.d.ts.map +1 -1
  80. package/dist/core/auth/token-generator/server.js.map +1 -1
  81. package/dist/core/bootstrap/init-config.d.ts.map +1 -1
  82. package/dist/core/bootstrap/init-config.js +2 -2
  83. package/dist/core/bootstrap/init-config.js.map +1 -1
  84. package/dist/core/bootstrap/startup-info.d.ts.map +1 -1
  85. package/dist/core/bootstrap/startup-info.js +3 -7
  86. package/dist/core/bootstrap/startup-info.js.map +1 -1
  87. package/dist/core/cache/cache.d.ts.map +1 -1
  88. package/dist/core/cache/cache.js +2 -2
  89. package/dist/core/cache/cache.js.map +1 -1
  90. package/dist/core/consul/deregister.d.ts.map +1 -1
  91. package/dist/core/consul/deregister.js.map +1 -1
  92. package/dist/core/consul/get-consul-api.d.ts.map +1 -1
  93. package/dist/core/consul/get-consul-api.js +1 -2
  94. package/dist/core/consul/get-consul-api.js.map +1 -1
  95. package/dist/core/db/pg-db.d.ts.map +1 -1
  96. package/dist/core/db/pg-db.js +3 -3
  97. package/dist/core/db/pg-db.js.map +1 -1
  98. package/dist/core/debug.d.ts.map +1 -1
  99. package/dist/core/debug.js.map +1 -1
  100. package/dist/core/errors/BaseMcpError.d.ts.map +1 -1
  101. package/dist/core/errors/BaseMcpError.js.map +1 -1
  102. package/dist/core/errors/ValidationError.d.ts.map +1 -1
  103. package/dist/core/errors/ValidationError.js.map +1 -1
  104. package/dist/core/errors/errors.d.ts.map +1 -1
  105. package/dist/core/errors/errors.js +1 -1
  106. package/dist/core/errors/errors.js.map +1 -1
  107. package/dist/core/index.d.ts +6 -6
  108. package/dist/core/index.d.ts.map +1 -1
  109. package/dist/core/index.js +5 -5
  110. package/dist/core/index.js.map +1 -1
  111. package/dist/core/init-mcp-server.d.ts.map +1 -1
  112. package/dist/core/init-mcp-server.js.map +1 -1
  113. package/dist/core/logger.d.ts.map +1 -1
  114. package/dist/core/logger.js +1 -1
  115. package/dist/core/logger.js.map +1 -1
  116. package/dist/core/mcp/create-mcp-server.d.ts.map +1 -1
  117. package/dist/core/mcp/create-mcp-server.js +1 -1
  118. package/dist/core/mcp/create-mcp-server.js.map +1 -1
  119. package/dist/core/mcp/prompts.d.ts.map +1 -1
  120. package/dist/core/mcp/prompts.js.map +1 -1
  121. package/dist/core/mcp/readme-assembler.d.ts.map +1 -1
  122. package/dist/core/mcp/readme-assembler.js +3 -1
  123. package/dist/core/mcp/readme-assembler.js.map +1 -1
  124. package/dist/core/mcp/resources.d.ts.map +1 -1
  125. package/dist/core/mcp/resources.js.map +1 -1
  126. package/dist/core/mcp/server-stdio.d.ts.map +1 -1
  127. package/dist/core/utils/formatToolResult.d.ts.map +1 -1
  128. package/dist/core/utils/formatToolResult.js.map +1 -1
  129. package/dist/core/utils/port-checker.d.ts.map +1 -1
  130. package/dist/core/utils/port-checker.js.map +1 -1
  131. package/dist/core/utils/rate-limit.d.ts.map +1 -1
  132. package/dist/core/utils/rate-limit.js +2 -8
  133. package/dist/core/utils/rate-limit.js.map +1 -1
  134. package/dist/core/utils/testing/BaseMcpClient.d.ts.map +1 -1
  135. package/dist/core/utils/testing/BaseMcpClient.js.map +1 -1
  136. package/dist/core/utils/testing/McpHttpClient.d.ts.map +1 -1
  137. package/dist/core/utils/testing/McpHttpClient.js +2 -2
  138. package/dist/core/utils/testing/McpHttpClient.js.map +1 -1
  139. package/dist/core/utils/testing/McpSseClient.d.ts.map +1 -1
  140. package/dist/core/utils/testing/McpSseClient.js +3 -8
  141. package/dist/core/utils/testing/McpSseClient.js.map +1 -1
  142. package/dist/core/utils/testing/McpStdioClient.d.ts.map +1 -1
  143. package/dist/core/utils/testing/McpStdioClient.js.map +1 -1
  144. package/dist/core/utils/testing/McpStreamableHttpClient.d.ts.map +1 -1
  145. package/dist/core/utils/testing/McpStreamableHttpClient.js +7 -8
  146. package/dist/core/utils/testing/McpStreamableHttpClient.js.map +1 -1
  147. package/dist/core/utils/utils.d.ts.map +1 -1
  148. package/dist/core/utils/utils.js +3 -5
  149. package/dist/core/utils/utils.js.map +1 -1
  150. package/dist/core/web/admin-router.d.ts.map +1 -1
  151. package/dist/core/web/admin-router.js +3 -3
  152. package/dist/core/web/admin-router.js.map +1 -1
  153. package/dist/core/web/cors.d.ts.map +1 -1
  154. package/dist/core/web/cors.js.map +1 -1
  155. package/dist/core/web/favicon-svg.d.ts.map +1 -1
  156. package/dist/core/web/favicon-svg.js +1 -5
  157. package/dist/core/web/favicon-svg.js.map +1 -1
  158. package/dist/core/web/home-api.d.ts.map +1 -1
  159. package/dist/core/web/home-api.js +7 -8
  160. package/dist/core/web/home-api.js.map +1 -1
  161. package/dist/core/web/openapi.d.ts.map +1 -1
  162. package/dist/core/web/openapi.js +1 -3
  163. package/dist/core/web/openapi.js.map +1 -1
  164. package/dist/core/web/server-http.d.ts.map +1 -1
  165. package/dist/core/web/server-http.js +4 -4
  166. package/dist/core/web/server-http.js.map +1 -1
  167. package/dist/core/web/static/agent-tester/index.html +323 -323
  168. package/dist/core/web/static/agent-tester/script.js +311 -200
  169. package/dist/core/web/static/agent-tester/styles.css +1840 -1840
  170. package/dist/core/web/static/home/index.html +220 -220
  171. package/dist/core/web/static/home/script.js +72 -43
  172. package/dist/core/web/static/styles.css +927 -927
  173. package/dist/core/web/static/token-gen/index.html +136 -136
  174. package/dist/core/web/static/token-gen/script.js +58 -56
  175. package/dist/core/web/svg-icons.d.ts.map +1 -1
  176. package/dist/core/web/svg-icons.js +1 -5
  177. package/dist/core/web/svg-icons.js.map +1 -1
  178. package/package.json +10 -5
  179. package/{cli-template/.claude/hooks/eslint-fix.cjs → scripts/cc-hook-oxlint-oxfmt-fix.cjs} +109 -100
  180. package/scripts/generate-jwt.js +5 -9
  181. package/scripts/kill-port.js +5 -2
  182. package/scripts/npm/run.js +1 -2
  183. package/scripts/remove-nul.js +1 -1
  184. package/scripts/update-sdk.js +36 -14
  185. package/src/template/api/router.ts +3 -3
  186. package/src/template/prompts/agent-brief.ts +0 -1
  187. package/src/template/start.ts +3 -8
  188. package/src/template/tools/handle-tool-call.ts +3 -3
  189. package/src/template/tools/tools.ts +3 -7
  190. package/src/tests/jest-simple-reporter.js +1 -1
  191. package/src/tests/mcp/sse/mcp-sse-client-handling.md +111 -111
  192. package/src/tests/mcp/sse/test-sse-npm-package.js +2 -3
  193. package/src/tests/mcp/test-cases.js +6 -7
  194. package/src/tests/mcp/test-http.js +2 -2
  195. package/src/tests/mcp/test-sse.js +9 -7
  196. package/src/tests/mcp/test-stdio.js +12 -8
  197. package/src/tests/utils.ts +4 -3
  198. package/cli-template/eslint.config.js +0 -27
@@ -1,927 +1,927 @@
1
- :root {
2
- --primary-color: #0052cc;
3
- }
4
-
5
- /* Reset and base styles */
6
- * {
7
- box-sizing: border-box;
8
- margin: 0;
9
- padding: 0;
10
- }
11
-
12
- html, body {
13
- height: 100%;
14
- }
15
-
16
- body {
17
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
18
- font-size: 14px;
19
- line-height: 1.5;
20
- color: #253858;
21
- background: white;
22
- margin: 0;
23
- padding: 24px;
24
- -webkit-font-smoothing: antialiased;
25
- -moz-osx-font-smoothing: grayscale;
26
- min-height: 100vh;
27
- display: flex;
28
- align-items: flex-start;
29
- justify-content: center;
30
- }
31
-
32
- /* ===========================
33
- Common Layout Components
34
- =========================== */
35
-
36
- .simple-container {
37
- width: 100%;
38
- max-width: 670px;
39
- background: white;
40
- border: 1px solid #c1c7d0;
41
- border-radius: 6px;
42
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
43
- margin-top: 40px;
44
- }
45
-
46
- /* Header */
47
- .simple-header {
48
- padding: 16px 24px 12px;
49
- border-bottom: 1px solid #c1c7d0;
50
- background: #fafbfc;
51
- border-radius: 6px 6px 0 0;
52
- display: flex;
53
- align-items: center;
54
- justify-content: space-between;
55
- gap: 16px;
56
- }
57
-
58
- .header-left {
59
- display: flex;
60
- align-items: center;
61
- gap: 16px;
62
- }
63
-
64
- .header-right {
65
- display: flex;
66
- align-items: center;
67
- gap: 12px;
68
- }
69
-
70
- .header-row {
71
- display: flex;
72
- justify-content: space-between;
73
- align-items: center;
74
- }
75
-
76
- .header-title {
77
- display: flex;
78
- align-items: center;
79
- gap: 16px;
80
- }
81
-
82
- .simple-header h1 {
83
- font-size: 24px;
84
- font-weight: 600;
85
- margin: 0;
86
- color: var(--primary-color);
87
- }
88
-
89
- /* Service Icon */
90
- .service-icon {
91
- width: 26px;
92
- height: 26px;
93
- display: flex;
94
- align-items: center;
95
- justify-content: center;
96
- }
97
-
98
- .service-icon svg,
99
- .service-icon img {
100
- width: 100%;
101
- height: 100%;
102
- display: block;
103
- }
104
-
105
- /* Header auth info */
106
- .header-auth-info {
107
- display: flex;
108
- align-items: center;
109
- gap: 10px;
110
- font-size: 13px;
111
- color: #505f79;
112
- }
113
-
114
- .header-auth-info .user-icon {
115
- width: 16px;
116
- height: 16px;
117
- }
118
-
119
- .header-auth-info .username {
120
- color: #172b4d;
121
- font-weight: 500;
122
- }
123
-
124
- .header-logout-btn {
125
- background: none;
126
- border: none;
127
- padding: 6px;
128
- cursor: pointer;
129
- border-radius: 4px;
130
- display: flex;
131
- align-items: center;
132
- justify-content: center;
133
- transition: background 0.2s ease;
134
- }
135
-
136
- .header-logout-btn:hover {
137
- background: rgba(220, 38, 38, 0.1);
138
- }
139
-
140
- .header-logout-btn img {
141
- width: 14px;
142
- height: 14px;
143
- }
144
-
145
- /* Status badges */
146
- .status {
147
- display: inline-block;
148
- padding: 4px 12px;
149
- border-radius: 12px;
150
- font-size: 12px;
151
- font-weight: 600;
152
- text-transform: uppercase;
153
- }
154
-
155
- .status.online {
156
- background: rgba(0, 102, 68, 0.1);
157
- color: #006644;
158
- }
159
-
160
- .status.offline {
161
- background: rgba(191, 38, 0, 0.1);
162
- color: #bf2600;
163
- }
164
-
165
- /* Main Content */
166
- .simple-main {
167
- padding: 24px 24px;
168
- }
169
-
170
- /* Footer */
171
- .simple-footer {
172
- padding: 16px 32px;
173
- background: #fafbfc;
174
- border-top: 1px solid #c1c7d0;
175
- border-radius: 0 0 6px 6px;
176
- }
177
-
178
- .simple-footer p {
179
- margin: 0;
180
- font-size: 12px;
181
- color: #505f79;
182
- text-align: center;
183
- }
184
-
185
- .simple-footer a {
186
- color: #0065ff;
187
- text-decoration: none;
188
- }
189
-
190
- .simple-footer a:hover {
191
- color: var(--primary-color);
192
- text-decoration: underline;
193
- }
194
-
195
- .MCPServer {
196
- color: #dddddd;
197
- }
198
-
199
- /* ===========================
200
- Forms (Token Generator)
201
- =========================== */
202
-
203
- .tab-container {
204
- margin-bottom: 0;
205
- }
206
-
207
- .tabs {
208
- display: flex;
209
- border-bottom: 1px solid #c1c7d0;
210
- margin-bottom: 24px;
211
- }
212
-
213
- .tab {
214
- background: none;
215
- border: none;
216
- padding: 12px 16px;
217
- cursor: pointer;
218
- font-size: 14px;
219
- font-weight: 500;
220
- color: #505f79;
221
- border-bottom: 2px solid transparent;
222
- transition: all 0.2s ease;
223
- }
224
-
225
- .tab.active {
226
- color: var(--primary-color);
227
- border-bottom-color: var(--primary-color);
228
- }
229
-
230
- .tab:hover {
231
- color: #253858;
232
- background: #fafbfc;
233
- }
234
-
235
- .tab-content {
236
- display: none;
237
- }
238
-
239
- .tab-content.active {
240
- display: block;
241
- }
242
-
243
- .form-group {
244
- margin-bottom: 12px;
245
- }
246
-
247
- .form-row {
248
- display: flex;
249
- gap: 12px;
250
- align-items: center;
251
- }
252
-
253
- label {
254
- display: block;
255
- margin-bottom: 4px;
256
- font-weight: 500;
257
- color: #42526e;
258
- font-size: 14px;
259
- }
260
-
261
- input, select, textarea {
262
- width: 100%;
263
- padding: 4px 6px;
264
- border: 1px solid #c1c7d0;
265
- border-radius: 3px;
266
- font-size: 14px;
267
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
268
- transition: border-color 0.2s ease, box-shadow 0.2s ease;
269
- background: white;
270
- }
271
-
272
- select {
273
- padding: 3px 6px;
274
- }
275
-
276
- input:focus, select:focus, textarea:focus {
277
- outline: none;
278
- border-color: #0065ff;
279
- box-shadow: 0 0 0 2px rgba(0, 101, 255, 0.1);
280
- }
281
-
282
- input::placeholder, textarea::placeholder {
283
- color: #cecece;
284
- }
285
-
286
- .time-input {
287
- flex: 1;
288
- }
289
-
290
- .time-unit {
291
- flex: 0 0 120px;
292
- }
293
-
294
- .key-value-pair {
295
- display: flex;
296
- gap: 8px;
297
- margin-bottom: 12px;
298
- align-items: center;
299
- }
300
-
301
- .key-value-pair input {
302
- margin-bottom: 0;
303
- }
304
-
305
- .key-value-pair input[name="keys"] {
306
- width: 180px;
307
- flex-shrink: 0;
308
- }
309
-
310
- .key-value-pair input[name="values"] {
311
- flex: 1;
312
- }
313
-
314
- .remove-btn {
315
- background: white;
316
- color: #bf2600;
317
- border: 0px;
318
- width: 28px;
319
- height: 28px;
320
- cursor: pointer;
321
- font-size: 22px;
322
- display: flex;
323
- align-items: center;
324
- justify-content: center;
325
- flex-shrink: 0;
326
- }
327
-
328
- .remove-btn:hover {
329
- background: #bf2600;
330
- color: white;
331
- border-color: #bf2600;
332
- }
333
-
334
- .add-btn {
335
- background: #d7ffd4;
336
- color: #089300;
337
- border: none;
338
- border-radius: 14px;
339
- width: 28px;
340
- height: 28px;
341
- cursor: pointer;
342
- font-size: 24px;
343
- font-weight: 500;
344
- align-items: center;
345
- transition: background 0.2s ease;
346
- }
347
-
348
- .add-btn:hover {
349
- background: #c9ffc4;
350
- }
351
-
352
- .btn {
353
- background: var(--primary-color);
354
- color: white;
355
- border: none;
356
- padding: 12px 24px;
357
- border-radius: 3px;
358
- font-size: 14px;
359
- font-weight: 500;
360
- cursor: pointer;
361
- transition: all 0.2s ease;
362
- width: 100%;
363
- margin-bottom: 16px;
364
- }
365
-
366
- .btn:hover {
367
- background: #0065ff;
368
- box-shadow: 0 1px 1px rgba(9, 30, 66, 0.25), 0 0 1px rgba(9, 30, 66, 0.31);
369
- }
370
-
371
- .btn:active {
372
- transform: translateY(1px);
373
- box-shadow: none;
374
- }
375
-
376
- /* Result messages */
377
- .result {
378
- margin-top: 24px;
379
- padding: 24px;
380
- border-radius: 3px;
381
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
382
- }
383
-
384
- .result.success {
385
- background: rgba(0, 102, 68, 0.1);
386
- color: #006644;
387
- border: 1px solid rgba(0, 102, 68, 0.2);
388
- }
389
-
390
- .result.error {
391
- background: rgba(191, 38, 0, 0.1);
392
- color: #bf2600;
393
- border: 1px solid rgba(255, 86, 48, 0.2);
394
- }
395
-
396
- /* Token output */
397
- .token-output {
398
- background: #ebecf0;
399
- border: 1px solid #c1c7d0;
400
- border-radius: 3px;
401
- padding: 16px;
402
- font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
403
- font-size: 12px;
404
- line-height: 1.4;
405
- word-break: break-all;
406
- min-height: 100px;
407
- resize: vertical;
408
- color: #172b4d;
409
- position: relative;
410
- }
411
-
412
- .token-info {
413
- background: rgba(0, 102, 68, 0.05);
414
- border: 1px solid rgba(0, 102, 68, 0.1);
415
- border-radius: 3px;
416
- padding: 16px;
417
- margin-top: 12px;
418
- }
419
-
420
- .token-info h4 {
421
- margin-bottom: 8px;
422
- color: #006644;
423
- font-weight: 600;
424
- font-size: 14px;
425
- }
426
-
427
- .token-info p {
428
- margin: 4px 0;
429
- font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
430
- font-size: 14px;
431
- color: #172b4d;
432
- }
433
-
434
- /* ===========================
435
- Modals (Home page)
436
- =========================== */
437
-
438
- .modal-overlay {
439
- position: fixed;
440
- top: 0;
441
- left: 0;
442
- width: 100%;
443
- height: 100%;
444
- background: rgba(9, 30, 66, 0.5);
445
- display: none;
446
- align-items: center;
447
- justify-content: center;
448
- z-index: 1000;
449
- backdrop-filter: blur(2px);
450
- }
451
-
452
- .modal-content {
453
- background: white;
454
- border-radius: 8px;
455
- box-shadow: 0 4px 8px -2px rgba(9, 30, 66, 0.25), 0 0 1px rgba(9, 30, 66, 0.31);
456
- max-width: 90vw;
457
- max-height: 90vh;
458
- width: 900px;
459
- display: flex;
460
- flex-direction: column;
461
- overflow: hidden;
462
- }
463
-
464
- .modal-header {
465
- display: flex;
466
- justify-content: space-between;
467
- align-items: center;
468
- padding: 20px 24px;
469
- background: #fafbfc;
470
- border-bottom: 1px solid #c1c7d0;
471
- }
472
-
473
- .modal-header h3 {
474
- margin: 0;
475
- font-size: 20px;
476
- font-weight: 600;
477
- color: var(--primary-color);
478
- }
479
-
480
- .modal-close {
481
- background: none;
482
- border: none;
483
- font-size: 24px;
484
- font-weight: 300;
485
- color: #505f79;
486
- cursor: pointer;
487
- padding: 0;
488
- width: 32px;
489
- height: 32px;
490
- display: flex;
491
- align-items: center;
492
- justify-content: center;
493
- border-radius: 3px;
494
- transition: all 0.2s ease;
495
- }
496
-
497
- .modal-close:hover {
498
- background: #dfe1e6;
499
- color: #253858;
500
- }
501
-
502
- .modal-body {
503
- padding: 24px;
504
- overflow-y: auto;
505
- flex: 1;
506
- }
507
-
508
- /* Admin auth tabs (token-gen login modal) */
509
- .admin-auth-tabs {
510
- display: flex;
511
- gap: 0;
512
- margin-bottom: 16px;
513
- border-bottom: 1px solid #dfe1e6;
514
- }
515
-
516
- .admin-auth-tab {
517
- flex: 1;
518
- padding: 10px 0;
519
- background: none;
520
- border: none;
521
- border-bottom: 2px solid transparent;
522
- cursor: pointer;
523
- font-size: 14px;
524
- font-weight: 500;
525
- color: #6b778c;
526
- transition: color 0.15s, border-color 0.15s;
527
- }
528
-
529
- .admin-auth-tab:hover {
530
- color: #172b4d;
531
- }
532
-
533
- .admin-auth-tab.active {
534
- color: var(--primary-color, #0f65dc);
535
- border-bottom-color: var(--primary-color, #0f65dc);
536
- }
537
-
538
- /* Tables */
539
- .table-container {
540
- overflow-x: auto;
541
- border-radius: 3px;
542
- border: 1px solid #c1c7d0;
543
- }
544
-
545
- .details-table {
546
- width: 100%;
547
- border-collapse: collapse;
548
- background: white;
549
- font-size: 12px;
550
- }
551
-
552
- .details-table th {
553
- background: #dfe1e6;
554
- padding: 12px 16px;
555
- text-align: left;
556
- font-weight: 600;
557
- color: #253858;
558
- border-bottom: 2px solid #c1c7d0;
559
- white-space: nowrap;
560
- }
561
-
562
- .details-table td {
563
- padding: 12px 16px;
564
- border-bottom: 1px solid #dfe1e6;
565
- vertical-align: top;
566
- }
567
-
568
- .details-table tr:hover {
569
- background: #fafbfc;
570
- }
571
-
572
- .details-table tr:last-child td {
573
- border-bottom: none;
574
- }
575
-
576
- /* Detail row styles */
577
- .detail-row {
578
- background: #fafbfc;
579
- }
580
-
581
- .detail-row td {
582
- padding: 0;
583
- }
584
-
585
- .detail-content {
586
- padding: 16px;
587
- position: relative;
588
- }
589
-
590
- /* Loading spinner */
591
- .loading-spinner {
592
- width: 20px;
593
- height: 20px;
594
- border: 2px solid #c1c7d0;
595
- border-top: 2px solid #0065ff;
596
- border-radius: 50%;
597
- animation: spin 1s linear infinite;
598
- margin: 0 auto 12px auto;
599
- }
600
-
601
- .loading-cell {
602
- text-align: center;
603
- padding: 40px 20px;
604
- color: #505f79;
605
- font-size: 14px;
606
- }
607
-
608
- .loading-cell .loading-spinner {
609
- margin-bottom: 16px;
610
- }
611
-
612
- @keyframes spin {
613
- 0% { transform: rotate(0deg); }
614
- 100% { transform: rotate(360deg); }
615
- }
616
-
617
- /* Error message styles */
618
- .error-message {
619
- padding: 16px;
620
- background: #ffebe9;
621
- color: #bf2600;
622
- border: 1px solid #ff5630;
623
- border-radius: 3px;
624
- font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
625
- font-size: 12px;
626
- text-align: center;
627
- }
628
-
629
- /* ===========================
630
- Info Section (Home page)
631
- =========================== */
632
-
633
- .info-section {
634
- margin-bottom: 0;
635
- }
636
-
637
- .info-row {
638
- display: flex;
639
- justify-content: space-between;
640
- align-items: center;
641
- padding: 8px 0;
642
- border-bottom: 1px solid #dfe1e6;
643
- }
644
-
645
- .info-row:last-child {
646
- border-bottom: none;
647
- }
648
-
649
- .label {
650
- font-weight: 500;
651
- color: #42526e;
652
- min-width: 100px;
653
- }
654
-
655
- .value {
656
- text-align: right;
657
- color: #172b4d;
658
- font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
659
- font-size: 14px;
660
- }
661
-
662
- .value.link {
663
- color: #0065ff;
664
- text-decoration: none;
665
- }
666
-
667
- .value.link:hover {
668
- color: var(--primary-color);
669
- text-decoration: underline;
670
- }
671
-
672
- .value.connected {
673
- color: #006644;
674
- }
675
-
676
- .value.disconnected, .value.error {
677
- color: #bf2600;
678
- }
679
-
680
- /* ===========================
681
- Links
682
- =========================== */
683
-
684
- .clickable {
685
- color: #0065ff !important;
686
- text-decoration: none;
687
- cursor: pointer;
688
- transition: color 0.2s ease;
689
- }
690
-
691
- .clickable:hover {
692
- color: var(--primary-color);
693
- text-decoration: underline;
694
- }
695
-
696
- .detail-link {
697
- color: #0065ff;
698
- text-decoration: none;
699
- font-size: 12px;
700
- font-weight: 500;
701
- cursor: pointer;
702
- }
703
-
704
- .detail-link:hover {
705
- color: var(--primary-color);
706
- text-decoration: underline;
707
- }
708
-
709
- /* ===========================
710
- Copy Button & Notification
711
- =========================== */
712
-
713
- .copy-button, .validate-token-button {
714
- position: absolute;
715
- bottom: 5px;
716
- right: 35px;
717
- background: #ffffff73;
718
- border-radius: 4px;
719
- width: 28px;
720
- height: 28px;
721
- cursor: pointer;
722
- font-size: 12px;
723
- display: flex;
724
- align-items: center;
725
- justify-content: center;
726
- border: none;
727
- transition: all 0.2s ease;
728
- z-index: 10;
729
- }
730
-
731
- .validate-token-button {
732
- right: 5px;
733
- }
734
-
735
- .copy-button:hover, .validate-token-button:hover {
736
- background: #ffffff;
737
- transform: scale(1.05);
738
- }
739
-
740
- .copy-notification {
741
- position: absolute;
742
- top: 8px;
743
- right: 42px;
744
- background: #006644;
745
- color: white;
746
- padding: 4px 8px;
747
- border-radius: 4px;
748
- font-size: 12px;
749
- font-weight: 500;
750
- opacity: 0;
751
- transform: translateY(-10px);
752
- transition: all 0.3s ease;
753
- z-index: 11;
754
- white-space: nowrap;
755
- }
756
-
757
- .copy-notification.show {
758
- opacity: 1;
759
- transform: translateY(0);
760
- }
761
-
762
- /* ===========================
763
- Code/JSON Content
764
- =========================== */
765
-
766
- .json-content {
767
- font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
768
- font-size: 11px;
769
- line-height: 1.4;
770
- color: #172b4d;
771
- white-space: pre-wrap;
772
- overflow-x: auto;
773
- max-height: 300px;
774
- overflow-y: auto;
775
- margin: 0;
776
- background: #ebecf0;
777
- padding: 16px;
778
- padding-right: 48px;
779
- border-radius: 3px;
780
- border: 1px solid #c1c7d0;
781
- position: relative;
782
- }
783
-
784
- .prompt-content {
785
- font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
786
- font-size: 12px;
787
- line-height: 1.5;
788
- color: #172b4d;
789
- max-height: 400px;
790
- overflow-y: auto;
791
- position: relative;
792
- }
793
-
794
- .prompt-content pre {
795
- margin: 0;
796
- white-space: pre-wrap;
797
- word-wrap: break-word;
798
- padding: 16px;
799
- padding-right: 48px;
800
- background: #ebecf0;
801
- border-radius: 3px;
802
- border: 1px solid #c1c7d0;
803
- position: relative;
804
- }
805
-
806
- .resource-content {
807
- font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
808
- font-size: 12px;
809
- line-height: 1.5;
810
- color: #172b4d;
811
- max-height: 400px;
812
- overflow-y: auto;
813
- position: relative;
814
- }
815
-
816
- .resource-content pre {
817
- margin: 0;
818
- white-space: pre-wrap;
819
- word-wrap: break-word;
820
- padding: 16px;
821
- padding-right: 48px;
822
- background: #ebecf0;
823
- border-radius: 3px;
824
- border: 1px solid #c1c7d0;
825
- position: relative;
826
- }
827
-
828
- /* ===========================
829
- Responsive Design
830
- =========================== */
831
-
832
- @media (max-width: 640px) {
833
- body {
834
- padding: 16px;
835
- }
836
-
837
- .simple-container {
838
- margin-top: 24px;
839
- max-width: 100%;
840
- }
841
-
842
- .simple-header {
843
- padding: 16px 20px 12px;
844
- flex-direction: column;
845
- align-items: flex-start;
846
- gap: 12px;
847
- }
848
-
849
- .simple-header h1 {
850
- font-size: 20px;
851
- }
852
-
853
- .header-row {
854
- flex-direction: column;
855
- align-items: flex-start;
856
- gap: 12px;
857
- }
858
-
859
- .header-title {
860
- gap: 12px;
861
- }
862
-
863
- .service-icon {
864
- width: 32px;
865
- height: 32px;
866
- }
867
-
868
- .simple-main {
869
- padding: 20px 20px;
870
- }
871
-
872
- .simple-footer {
873
- padding: 12px 24px;
874
- }
875
-
876
- .form-row {
877
- flex-direction: column;
878
- gap: 8px;
879
- }
880
-
881
- .key-value-pair {
882
- flex-direction: column;
883
- align-items: stretch;
884
- gap: 8px;
885
- }
886
-
887
- .key-value-pair input[name="keys"] {
888
- width: 100%;
889
- }
890
-
891
- .remove-btn {
892
- width: 100%;
893
- margin-top: 8px;
894
- }
895
-
896
- .info-row {
897
- flex-direction: column;
898
- align-items: flex-start;
899
- gap: 4px;
900
- padding: 12px 0;
901
- }
902
-
903
- .label {
904
- min-width: auto;
905
- }
906
-
907
- .value {
908
- text-align: left;
909
- }
910
-
911
- .copy-button {
912
- width: 24px;
913
- height: 24px;
914
- font-size: 12px;
915
- }
916
-
917
- .copy-notification {
918
- font-size: 11px;
919
- right: 32px;
920
- }
921
-
922
- .json-content,
923
- .prompt-content pre,
924
- .resource-content pre {
925
- padding-right: 40px;
926
- }
927
- }
1
+ :root {
2
+ --primary-color: #0052cc;
3
+ }
4
+
5
+ /* Reset and base styles */
6
+ * {
7
+ box-sizing: border-box;
8
+ margin: 0;
9
+ padding: 0;
10
+ }
11
+
12
+ html, body {
13
+ height: 100%;
14
+ }
15
+
16
+ body {
17
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
18
+ font-size: 14px;
19
+ line-height: 1.5;
20
+ color: #253858;
21
+ background: white;
22
+ margin: 0;
23
+ padding: 24px;
24
+ -webkit-font-smoothing: antialiased;
25
+ -moz-osx-font-smoothing: grayscale;
26
+ min-height: 100vh;
27
+ display: flex;
28
+ align-items: flex-start;
29
+ justify-content: center;
30
+ }
31
+
32
+ /* ===========================
33
+ Common Layout Components
34
+ =========================== */
35
+
36
+ .simple-container {
37
+ width: 100%;
38
+ max-width: 670px;
39
+ background: white;
40
+ border: 1px solid #c1c7d0;
41
+ border-radius: 6px;
42
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
43
+ margin-top: 40px;
44
+ }
45
+
46
+ /* Header */
47
+ .simple-header {
48
+ padding: 16px 24px 12px;
49
+ border-bottom: 1px solid #c1c7d0;
50
+ background: #fafbfc;
51
+ border-radius: 6px 6px 0 0;
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: space-between;
55
+ gap: 16px;
56
+ }
57
+
58
+ .header-left {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 16px;
62
+ }
63
+
64
+ .header-right {
65
+ display: flex;
66
+ align-items: center;
67
+ gap: 12px;
68
+ }
69
+
70
+ .header-row {
71
+ display: flex;
72
+ justify-content: space-between;
73
+ align-items: center;
74
+ }
75
+
76
+ .header-title {
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 16px;
80
+ }
81
+
82
+ .simple-header h1 {
83
+ font-size: 24px;
84
+ font-weight: 600;
85
+ margin: 0;
86
+ color: var(--primary-color);
87
+ }
88
+
89
+ /* Service Icon */
90
+ .service-icon {
91
+ width: 26px;
92
+ height: 26px;
93
+ display: flex;
94
+ align-items: center;
95
+ justify-content: center;
96
+ }
97
+
98
+ .service-icon svg,
99
+ .service-icon img {
100
+ width: 100%;
101
+ height: 100%;
102
+ display: block;
103
+ }
104
+
105
+ /* Header auth info */
106
+ .header-auth-info {
107
+ display: flex;
108
+ align-items: center;
109
+ gap: 10px;
110
+ font-size: 13px;
111
+ color: #505f79;
112
+ }
113
+
114
+ .header-auth-info .user-icon {
115
+ width: 16px;
116
+ height: 16px;
117
+ }
118
+
119
+ .header-auth-info .username {
120
+ color: #172b4d;
121
+ font-weight: 500;
122
+ }
123
+
124
+ .header-logout-btn {
125
+ background: none;
126
+ border: none;
127
+ padding: 6px;
128
+ cursor: pointer;
129
+ border-radius: 4px;
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ transition: background 0.2s ease;
134
+ }
135
+
136
+ .header-logout-btn:hover {
137
+ background: rgba(220, 38, 38, 0.1);
138
+ }
139
+
140
+ .header-logout-btn img {
141
+ width: 14px;
142
+ height: 14px;
143
+ }
144
+
145
+ /* Status badges */
146
+ .status {
147
+ display: inline-block;
148
+ padding: 4px 12px;
149
+ border-radius: 12px;
150
+ font-size: 12px;
151
+ font-weight: 600;
152
+ text-transform: uppercase;
153
+ }
154
+
155
+ .status.online {
156
+ background: rgba(0, 102, 68, 0.1);
157
+ color: #006644;
158
+ }
159
+
160
+ .status.offline {
161
+ background: rgba(191, 38, 0, 0.1);
162
+ color: #bf2600;
163
+ }
164
+
165
+ /* Main Content */
166
+ .simple-main {
167
+ padding: 24px 24px;
168
+ }
169
+
170
+ /* Footer */
171
+ .simple-footer {
172
+ padding: 16px 32px;
173
+ background: #fafbfc;
174
+ border-top: 1px solid #c1c7d0;
175
+ border-radius: 0 0 6px 6px;
176
+ }
177
+
178
+ .simple-footer p {
179
+ margin: 0;
180
+ font-size: 12px;
181
+ color: #505f79;
182
+ text-align: center;
183
+ }
184
+
185
+ .simple-footer a {
186
+ color: #0065ff;
187
+ text-decoration: none;
188
+ }
189
+
190
+ .simple-footer a:hover {
191
+ color: var(--primary-color);
192
+ text-decoration: underline;
193
+ }
194
+
195
+ .MCPServer {
196
+ color: #dddddd;
197
+ }
198
+
199
+ /* ===========================
200
+ Forms (Token Generator)
201
+ =========================== */
202
+
203
+ .tab-container {
204
+ margin-bottom: 0;
205
+ }
206
+
207
+ .tabs {
208
+ display: flex;
209
+ border-bottom: 1px solid #c1c7d0;
210
+ margin-bottom: 24px;
211
+ }
212
+
213
+ .tab {
214
+ background: none;
215
+ border: none;
216
+ padding: 12px 16px;
217
+ cursor: pointer;
218
+ font-size: 14px;
219
+ font-weight: 500;
220
+ color: #505f79;
221
+ border-bottom: 2px solid transparent;
222
+ transition: all 0.2s ease;
223
+ }
224
+
225
+ .tab.active {
226
+ color: var(--primary-color);
227
+ border-bottom-color: var(--primary-color);
228
+ }
229
+
230
+ .tab:hover {
231
+ color: #253858;
232
+ background: #fafbfc;
233
+ }
234
+
235
+ .tab-content {
236
+ display: none;
237
+ }
238
+
239
+ .tab-content.active {
240
+ display: block;
241
+ }
242
+
243
+ .form-group {
244
+ margin-bottom: 12px;
245
+ }
246
+
247
+ .form-row {
248
+ display: flex;
249
+ gap: 12px;
250
+ align-items: center;
251
+ }
252
+
253
+ label {
254
+ display: block;
255
+ margin-bottom: 4px;
256
+ font-weight: 500;
257
+ color: #42526e;
258
+ font-size: 14px;
259
+ }
260
+
261
+ input, select, textarea {
262
+ width: 100%;
263
+ padding: 4px 6px;
264
+ border: 1px solid #c1c7d0;
265
+ border-radius: 3px;
266
+ font-size: 14px;
267
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
268
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
269
+ background: white;
270
+ }
271
+
272
+ select {
273
+ padding: 3px 6px;
274
+ }
275
+
276
+ input:focus, select:focus, textarea:focus {
277
+ outline: none;
278
+ border-color: #0065ff;
279
+ box-shadow: 0 0 0 2px rgba(0, 101, 255, 0.1);
280
+ }
281
+
282
+ input::placeholder, textarea::placeholder {
283
+ color: #cecece;
284
+ }
285
+
286
+ .time-input {
287
+ flex: 1;
288
+ }
289
+
290
+ .time-unit {
291
+ flex: 0 0 120px;
292
+ }
293
+
294
+ .key-value-pair {
295
+ display: flex;
296
+ gap: 8px;
297
+ margin-bottom: 12px;
298
+ align-items: center;
299
+ }
300
+
301
+ .key-value-pair input {
302
+ margin-bottom: 0;
303
+ }
304
+
305
+ .key-value-pair input[name="keys"] {
306
+ width: 180px;
307
+ flex-shrink: 0;
308
+ }
309
+
310
+ .key-value-pair input[name="values"] {
311
+ flex: 1;
312
+ }
313
+
314
+ .remove-btn {
315
+ background: white;
316
+ color: #bf2600;
317
+ border: 0px;
318
+ width: 28px;
319
+ height: 28px;
320
+ cursor: pointer;
321
+ font-size: 22px;
322
+ display: flex;
323
+ align-items: center;
324
+ justify-content: center;
325
+ flex-shrink: 0;
326
+ }
327
+
328
+ .remove-btn:hover {
329
+ background: #bf2600;
330
+ color: white;
331
+ border-color: #bf2600;
332
+ }
333
+
334
+ .add-btn {
335
+ background: #d7ffd4;
336
+ color: #089300;
337
+ border: none;
338
+ border-radius: 14px;
339
+ width: 28px;
340
+ height: 28px;
341
+ cursor: pointer;
342
+ font-size: 24px;
343
+ font-weight: 500;
344
+ align-items: center;
345
+ transition: background 0.2s ease;
346
+ }
347
+
348
+ .add-btn:hover {
349
+ background: #c9ffc4;
350
+ }
351
+
352
+ .btn {
353
+ background: var(--primary-color);
354
+ color: white;
355
+ border: none;
356
+ padding: 12px 24px;
357
+ border-radius: 3px;
358
+ font-size: 14px;
359
+ font-weight: 500;
360
+ cursor: pointer;
361
+ transition: all 0.2s ease;
362
+ width: 100%;
363
+ margin-bottom: 16px;
364
+ }
365
+
366
+ .btn:hover {
367
+ background: #0065ff;
368
+ box-shadow: 0 1px 1px rgba(9, 30, 66, 0.25), 0 0 1px rgba(9, 30, 66, 0.31);
369
+ }
370
+
371
+ .btn:active {
372
+ transform: translateY(1px);
373
+ box-shadow: none;
374
+ }
375
+
376
+ /* Result messages */
377
+ .result {
378
+ margin-top: 24px;
379
+ padding: 24px;
380
+ border-radius: 3px;
381
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
382
+ }
383
+
384
+ .result.success {
385
+ background: rgba(0, 102, 68, 0.1);
386
+ color: #006644;
387
+ border: 1px solid rgba(0, 102, 68, 0.2);
388
+ }
389
+
390
+ .result.error {
391
+ background: rgba(191, 38, 0, 0.1);
392
+ color: #bf2600;
393
+ border: 1px solid rgba(255, 86, 48, 0.2);
394
+ }
395
+
396
+ /* Token output */
397
+ .token-output {
398
+ background: #ebecf0;
399
+ border: 1px solid #c1c7d0;
400
+ border-radius: 3px;
401
+ padding: 16px;
402
+ font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
403
+ font-size: 12px;
404
+ line-height: 1.4;
405
+ word-break: break-all;
406
+ min-height: 100px;
407
+ resize: vertical;
408
+ color: #172b4d;
409
+ position: relative;
410
+ }
411
+
412
+ .token-info {
413
+ background: rgba(0, 102, 68, 0.05);
414
+ border: 1px solid rgba(0, 102, 68, 0.1);
415
+ border-radius: 3px;
416
+ padding: 16px;
417
+ margin-top: 12px;
418
+ }
419
+
420
+ .token-info h4 {
421
+ margin-bottom: 8px;
422
+ color: #006644;
423
+ font-weight: 600;
424
+ font-size: 14px;
425
+ }
426
+
427
+ .token-info p {
428
+ margin: 4px 0;
429
+ font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
430
+ font-size: 14px;
431
+ color: #172b4d;
432
+ }
433
+
434
+ /* ===========================
435
+ Modals (Home page)
436
+ =========================== */
437
+
438
+ .modal-overlay {
439
+ position: fixed;
440
+ top: 0;
441
+ left: 0;
442
+ width: 100%;
443
+ height: 100%;
444
+ background: rgba(9, 30, 66, 0.5);
445
+ display: none;
446
+ align-items: center;
447
+ justify-content: center;
448
+ z-index: 1000;
449
+ backdrop-filter: blur(2px);
450
+ }
451
+
452
+ .modal-content {
453
+ background: white;
454
+ border-radius: 8px;
455
+ box-shadow: 0 4px 8px -2px rgba(9, 30, 66, 0.25), 0 0 1px rgba(9, 30, 66, 0.31);
456
+ max-width: 90vw;
457
+ max-height: 90vh;
458
+ width: 900px;
459
+ display: flex;
460
+ flex-direction: column;
461
+ overflow: hidden;
462
+ }
463
+
464
+ .modal-header {
465
+ display: flex;
466
+ justify-content: space-between;
467
+ align-items: center;
468
+ padding: 20px 24px;
469
+ background: #fafbfc;
470
+ border-bottom: 1px solid #c1c7d0;
471
+ }
472
+
473
+ .modal-header h3 {
474
+ margin: 0;
475
+ font-size: 20px;
476
+ font-weight: 600;
477
+ color: var(--primary-color);
478
+ }
479
+
480
+ .modal-close {
481
+ background: none;
482
+ border: none;
483
+ font-size: 24px;
484
+ font-weight: 300;
485
+ color: #505f79;
486
+ cursor: pointer;
487
+ padding: 0;
488
+ width: 32px;
489
+ height: 32px;
490
+ display: flex;
491
+ align-items: center;
492
+ justify-content: center;
493
+ border-radius: 3px;
494
+ transition: all 0.2s ease;
495
+ }
496
+
497
+ .modal-close:hover {
498
+ background: #dfe1e6;
499
+ color: #253858;
500
+ }
501
+
502
+ .modal-body {
503
+ padding: 24px;
504
+ overflow-y: auto;
505
+ flex: 1;
506
+ }
507
+
508
+ /* Admin auth tabs (token-gen login modal) */
509
+ .admin-auth-tabs {
510
+ display: flex;
511
+ gap: 0;
512
+ margin-bottom: 16px;
513
+ border-bottom: 1px solid #dfe1e6;
514
+ }
515
+
516
+ .admin-auth-tab {
517
+ flex: 1;
518
+ padding: 10px 0;
519
+ background: none;
520
+ border: none;
521
+ border-bottom: 2px solid transparent;
522
+ cursor: pointer;
523
+ font-size: 14px;
524
+ font-weight: 500;
525
+ color: #6b778c;
526
+ transition: color 0.15s, border-color 0.15s;
527
+ }
528
+
529
+ .admin-auth-tab:hover {
530
+ color: #172b4d;
531
+ }
532
+
533
+ .admin-auth-tab.active {
534
+ color: var(--primary-color, #0f65dc);
535
+ border-bottom-color: var(--primary-color, #0f65dc);
536
+ }
537
+
538
+ /* Tables */
539
+ .table-container {
540
+ overflow-x: auto;
541
+ border-radius: 3px;
542
+ border: 1px solid #c1c7d0;
543
+ }
544
+
545
+ .details-table {
546
+ width: 100%;
547
+ border-collapse: collapse;
548
+ background: white;
549
+ font-size: 12px;
550
+ }
551
+
552
+ .details-table th {
553
+ background: #dfe1e6;
554
+ padding: 12px 16px;
555
+ text-align: left;
556
+ font-weight: 600;
557
+ color: #253858;
558
+ border-bottom: 2px solid #c1c7d0;
559
+ white-space: nowrap;
560
+ }
561
+
562
+ .details-table td {
563
+ padding: 12px 16px;
564
+ border-bottom: 1px solid #dfe1e6;
565
+ vertical-align: top;
566
+ }
567
+
568
+ .details-table tr:hover {
569
+ background: #fafbfc;
570
+ }
571
+
572
+ .details-table tr:last-child td {
573
+ border-bottom: none;
574
+ }
575
+
576
+ /* Detail row styles */
577
+ .detail-row {
578
+ background: #fafbfc;
579
+ }
580
+
581
+ .detail-row td {
582
+ padding: 0;
583
+ }
584
+
585
+ .detail-content {
586
+ padding: 16px;
587
+ position: relative;
588
+ }
589
+
590
+ /* Loading spinner */
591
+ .loading-spinner {
592
+ width: 20px;
593
+ height: 20px;
594
+ border: 2px solid #c1c7d0;
595
+ border-top: 2px solid #0065ff;
596
+ border-radius: 50%;
597
+ animation: spin 1s linear infinite;
598
+ margin: 0 auto 12px auto;
599
+ }
600
+
601
+ .loading-cell {
602
+ text-align: center;
603
+ padding: 40px 20px;
604
+ color: #505f79;
605
+ font-size: 14px;
606
+ }
607
+
608
+ .loading-cell .loading-spinner {
609
+ margin-bottom: 16px;
610
+ }
611
+
612
+ @keyframes spin {
613
+ 0% { transform: rotate(0deg); }
614
+ 100% { transform: rotate(360deg); }
615
+ }
616
+
617
+ /* Error message styles */
618
+ .error-message {
619
+ padding: 16px;
620
+ background: #ffebe9;
621
+ color: #bf2600;
622
+ border: 1px solid #ff5630;
623
+ border-radius: 3px;
624
+ font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
625
+ font-size: 12px;
626
+ text-align: center;
627
+ }
628
+
629
+ /* ===========================
630
+ Info Section (Home page)
631
+ =========================== */
632
+
633
+ .info-section {
634
+ margin-bottom: 0;
635
+ }
636
+
637
+ .info-row {
638
+ display: flex;
639
+ justify-content: space-between;
640
+ align-items: center;
641
+ padding: 8px 0;
642
+ border-bottom: 1px solid #dfe1e6;
643
+ }
644
+
645
+ .info-row:last-child {
646
+ border-bottom: none;
647
+ }
648
+
649
+ .label {
650
+ font-weight: 500;
651
+ color: #42526e;
652
+ min-width: 100px;
653
+ }
654
+
655
+ .value {
656
+ text-align: right;
657
+ color: #172b4d;
658
+ font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
659
+ font-size: 14px;
660
+ }
661
+
662
+ .value.link {
663
+ color: #0065ff;
664
+ text-decoration: none;
665
+ }
666
+
667
+ .value.link:hover {
668
+ color: var(--primary-color);
669
+ text-decoration: underline;
670
+ }
671
+
672
+ .value.connected {
673
+ color: #006644;
674
+ }
675
+
676
+ .value.disconnected, .value.error {
677
+ color: #bf2600;
678
+ }
679
+
680
+ /* ===========================
681
+ Links
682
+ =========================== */
683
+
684
+ .clickable {
685
+ color: #0065ff !important;
686
+ text-decoration: none;
687
+ cursor: pointer;
688
+ transition: color 0.2s ease;
689
+ }
690
+
691
+ .clickable:hover {
692
+ color: var(--primary-color);
693
+ text-decoration: underline;
694
+ }
695
+
696
+ .detail-link {
697
+ color: #0065ff;
698
+ text-decoration: none;
699
+ font-size: 12px;
700
+ font-weight: 500;
701
+ cursor: pointer;
702
+ }
703
+
704
+ .detail-link:hover {
705
+ color: var(--primary-color);
706
+ text-decoration: underline;
707
+ }
708
+
709
+ /* ===========================
710
+ Copy Button & Notification
711
+ =========================== */
712
+
713
+ .copy-button, .validate-token-button {
714
+ position: absolute;
715
+ bottom: 5px;
716
+ right: 35px;
717
+ background: #ffffff73;
718
+ border-radius: 4px;
719
+ width: 28px;
720
+ height: 28px;
721
+ cursor: pointer;
722
+ font-size: 12px;
723
+ display: flex;
724
+ align-items: center;
725
+ justify-content: center;
726
+ border: none;
727
+ transition: all 0.2s ease;
728
+ z-index: 10;
729
+ }
730
+
731
+ .validate-token-button {
732
+ right: 5px;
733
+ }
734
+
735
+ .copy-button:hover, .validate-token-button:hover {
736
+ background: #ffffff;
737
+ transform: scale(1.05);
738
+ }
739
+
740
+ .copy-notification {
741
+ position: absolute;
742
+ top: 8px;
743
+ right: 42px;
744
+ background: #006644;
745
+ color: white;
746
+ padding: 4px 8px;
747
+ border-radius: 4px;
748
+ font-size: 12px;
749
+ font-weight: 500;
750
+ opacity: 0;
751
+ transform: translateY(-10px);
752
+ transition: all 0.3s ease;
753
+ z-index: 11;
754
+ white-space: nowrap;
755
+ }
756
+
757
+ .copy-notification.show {
758
+ opacity: 1;
759
+ transform: translateY(0);
760
+ }
761
+
762
+ /* ===========================
763
+ Code/JSON Content
764
+ =========================== */
765
+
766
+ .json-content {
767
+ font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
768
+ font-size: 11px;
769
+ line-height: 1.4;
770
+ color: #172b4d;
771
+ white-space: pre-wrap;
772
+ overflow-x: auto;
773
+ max-height: 300px;
774
+ overflow-y: auto;
775
+ margin: 0;
776
+ background: #ebecf0;
777
+ padding: 16px;
778
+ padding-right: 48px;
779
+ border-radius: 3px;
780
+ border: 1px solid #c1c7d0;
781
+ position: relative;
782
+ }
783
+
784
+ .prompt-content {
785
+ font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
786
+ font-size: 12px;
787
+ line-height: 1.5;
788
+ color: #172b4d;
789
+ max-height: 400px;
790
+ overflow-y: auto;
791
+ position: relative;
792
+ }
793
+
794
+ .prompt-content pre {
795
+ margin: 0;
796
+ white-space: pre-wrap;
797
+ word-wrap: break-word;
798
+ padding: 16px;
799
+ padding-right: 48px;
800
+ background: #ebecf0;
801
+ border-radius: 3px;
802
+ border: 1px solid #c1c7d0;
803
+ position: relative;
804
+ }
805
+
806
+ .resource-content {
807
+ font-family: ui-monospace, 'SF Mono', 'Consolas', 'Roboto Mono', 'Ubuntu Mono', monospace;
808
+ font-size: 12px;
809
+ line-height: 1.5;
810
+ color: #172b4d;
811
+ max-height: 400px;
812
+ overflow-y: auto;
813
+ position: relative;
814
+ }
815
+
816
+ .resource-content pre {
817
+ margin: 0;
818
+ white-space: pre-wrap;
819
+ word-wrap: break-word;
820
+ padding: 16px;
821
+ padding-right: 48px;
822
+ background: #ebecf0;
823
+ border-radius: 3px;
824
+ border: 1px solid #c1c7d0;
825
+ position: relative;
826
+ }
827
+
828
+ /* ===========================
829
+ Responsive Design
830
+ =========================== */
831
+
832
+ @media (max-width: 640px) {
833
+ body {
834
+ padding: 16px;
835
+ }
836
+
837
+ .simple-container {
838
+ margin-top: 24px;
839
+ max-width: 100%;
840
+ }
841
+
842
+ .simple-header {
843
+ padding: 16px 20px 12px;
844
+ flex-direction: column;
845
+ align-items: flex-start;
846
+ gap: 12px;
847
+ }
848
+
849
+ .simple-header h1 {
850
+ font-size: 20px;
851
+ }
852
+
853
+ .header-row {
854
+ flex-direction: column;
855
+ align-items: flex-start;
856
+ gap: 12px;
857
+ }
858
+
859
+ .header-title {
860
+ gap: 12px;
861
+ }
862
+
863
+ .service-icon {
864
+ width: 32px;
865
+ height: 32px;
866
+ }
867
+
868
+ .simple-main {
869
+ padding: 20px 20px;
870
+ }
871
+
872
+ .simple-footer {
873
+ padding: 12px 24px;
874
+ }
875
+
876
+ .form-row {
877
+ flex-direction: column;
878
+ gap: 8px;
879
+ }
880
+
881
+ .key-value-pair {
882
+ flex-direction: column;
883
+ align-items: stretch;
884
+ gap: 8px;
885
+ }
886
+
887
+ .key-value-pair input[name="keys"] {
888
+ width: 100%;
889
+ }
890
+
891
+ .remove-btn {
892
+ width: 100%;
893
+ margin-top: 8px;
894
+ }
895
+
896
+ .info-row {
897
+ flex-direction: column;
898
+ align-items: flex-start;
899
+ gap: 4px;
900
+ padding: 12px 0;
901
+ }
902
+
903
+ .label {
904
+ min-width: auto;
905
+ }
906
+
907
+ .value {
908
+ text-align: left;
909
+ }
910
+
911
+ .copy-button {
912
+ width: 24px;
913
+ height: 24px;
914
+ font-size: 12px;
915
+ }
916
+
917
+ .copy-notification {
918
+ font-size: 11px;
919
+ right: 32px;
920
+ }
921
+
922
+ .json-content,
923
+ .prompt-content pre,
924
+ .resource-content pre {
925
+ padding-right: 40px;
926
+ }
927
+ }