fa-mcp-sdk 0.4.74 → 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 (202) 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/mcp-app-add-to-server/SKILL.md +427 -0
  6. package/cli-template/.claude/skills/mcp-app-create/SKILL.md +222 -0
  7. package/cli-template/.claude/skills/upgrade-guide/SKILL.md +2 -1
  8. package/cli-template/.oxfmtrc.json +41 -0
  9. package/cli-template/.oxlintrc.json +120 -0
  10. package/cli-template/CLAUDE.md +358 -355
  11. package/cli-template/FA-MCP-SDK-DOC/00-FA-MCP-SDK-index.md +132 -132
  12. package/cli-template/FA-MCP-SDK-DOC/01-getting-started.md +146 -146
  13. package/cli-template/FA-MCP-SDK-DOC/02-1-tools-and-api.md +431 -431
  14. package/cli-template/FA-MCP-SDK-DOC/02-2-prompts-and-resources.md +201 -201
  15. package/cli-template/FA-MCP-SDK-DOC/03-configuration.md +384 -384
  16. package/cli-template/FA-MCP-SDK-DOC/04-authentication.md +412 -412
  17. package/cli-template/FA-MCP-SDK-DOC/05-ad-authorization.md +196 -196
  18. package/cli-template/FA-MCP-SDK-DOC/06-utilities.md +163 -163
  19. package/cli-template/FA-MCP-SDK-DOC/07-testing-and-operations.md +127 -127
  20. package/cli-template/FA-MCP-SDK-DOC/08-agent-tester-and-headless-api.md +681 -659
  21. package/cli-template/README.md +193 -191
  22. package/cli-template/jest.config.js +27 -30
  23. package/cli-template/package.json +10 -5
  24. package/cli-template/prompt-example-new-MCP.md +101 -101
  25. package/cli-template/readme-docs/SKILLS.md +86 -1
  26. package/cli-template/tsconfig.json +58 -58
  27. package/cli-template/update.cjs +41 -38
  28. package/config/custom-environment-variables.yaml +63 -63
  29. package/config/development.yaml +4 -4
  30. package/config/production.yaml +4 -4
  31. package/config/test.yaml +26 -26
  32. package/dist/core/_types_/TNtlm.d.ts.map +1 -1
  33. package/dist/core/_types_/active-directory-config.d.ts.map +1 -1
  34. package/dist/core/_types_/config.d.ts.map +1 -1
  35. package/dist/core/_types_/types.d.ts.map +1 -1
  36. package/dist/core/ad/group-checker.d.ts.map +1 -1
  37. package/dist/core/ad/group-checker.js.map +1 -1
  38. package/dist/core/agent-tester/agent-tester-router.d.ts.map +1 -1
  39. package/dist/core/agent-tester/agent-tester-router.js +6 -6
  40. package/dist/core/agent-tester/agent-tester-router.js.map +1 -1
  41. package/dist/core/agent-tester/check-llm.d.ts.map +1 -1
  42. package/dist/core/agent-tester/check-llm.js.map +1 -1
  43. package/dist/core/agent-tester/services/SummaryMemory.d.ts.map +1 -1
  44. package/dist/core/agent-tester/services/SummaryMemory.js +3 -9
  45. package/dist/core/agent-tester/services/SummaryMemory.js.map +1 -1
  46. package/dist/core/agent-tester/services/TesterAgentService.d.ts.map +1 -1
  47. package/dist/core/agent-tester/services/TesterAgentService.js +25 -27
  48. package/dist/core/agent-tester/services/TesterAgentService.js.map +1 -1
  49. package/dist/core/agent-tester/services/TesterMcpClientService.d.ts.map +1 -1
  50. package/dist/core/agent-tester/services/TesterMcpClientService.js +26 -25
  51. package/dist/core/agent-tester/services/TesterMcpClientService.js.map +1 -1
  52. package/dist/core/auth/admin-auth.d.ts.map +1 -1
  53. package/dist/core/auth/admin-auth.js +5 -5
  54. package/dist/core/auth/admin-auth.js.map +1 -1
  55. package/dist/core/auth/agent-tester-auth.d.ts.map +1 -1
  56. package/dist/core/auth/agent-tester-auth.js +1 -6
  57. package/dist/core/auth/agent-tester-auth.js.map +1 -1
  58. package/dist/core/auth/basic.d.ts.map +1 -1
  59. package/dist/core/auth/basic.js.map +1 -1
  60. package/dist/core/auth/ip-check.d.ts.map +1 -1
  61. package/dist/core/auth/ip-check.js +1 -1
  62. package/dist/core/auth/ip-check.js.map +1 -1
  63. package/dist/core/auth/jwt.d.ts.map +1 -1
  64. package/dist/core/auth/jwt.js +1 -1
  65. package/dist/core/auth/jwt.js.map +1 -1
  66. package/dist/core/auth/middleware.d.ts.map +1 -1
  67. package/dist/core/auth/middleware.js +9 -6
  68. package/dist/core/auth/middleware.js.map +1 -1
  69. package/dist/core/auth/multi-auth.d.ts.map +1 -1
  70. package/dist/core/auth/multi-auth.js +6 -6
  71. package/dist/core/auth/multi-auth.js.map +1 -1
  72. package/dist/core/auth/revocation.d.ts.map +1 -1
  73. package/dist/core/auth/revocation.js +2 -6
  74. package/dist/core/auth/revocation.js.map +1 -1
  75. package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.d.ts.map +1 -1
  76. package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.js +2 -2
  77. package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.js.map +1 -1
  78. package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js +1 -1
  79. package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js.map +1 -1
  80. package/dist/core/auth/token-generator/ntlm/ntlm-integration.d.ts.map +1 -1
  81. package/dist/core/auth/token-generator/ntlm/ntlm-integration.js +4 -2
  82. package/dist/core/auth/token-generator/ntlm/ntlm-integration.js.map +1 -1
  83. package/dist/core/auth/token-generator/server.d.ts.map +1 -1
  84. package/dist/core/auth/token-generator/server.js.map +1 -1
  85. package/dist/core/bootstrap/init-config.d.ts.map +1 -1
  86. package/dist/core/bootstrap/init-config.js +2 -2
  87. package/dist/core/bootstrap/init-config.js.map +1 -1
  88. package/dist/core/bootstrap/startup-info.d.ts.map +1 -1
  89. package/dist/core/bootstrap/startup-info.js +3 -7
  90. package/dist/core/bootstrap/startup-info.js.map +1 -1
  91. package/dist/core/cache/cache.d.ts.map +1 -1
  92. package/dist/core/cache/cache.js +2 -2
  93. package/dist/core/cache/cache.js.map +1 -1
  94. package/dist/core/consul/deregister.d.ts.map +1 -1
  95. package/dist/core/consul/deregister.js.map +1 -1
  96. package/dist/core/consul/get-consul-api.d.ts.map +1 -1
  97. package/dist/core/consul/get-consul-api.js +1 -2
  98. package/dist/core/consul/get-consul-api.js.map +1 -1
  99. package/dist/core/db/pg-db.d.ts.map +1 -1
  100. package/dist/core/db/pg-db.js +3 -3
  101. package/dist/core/db/pg-db.js.map +1 -1
  102. package/dist/core/debug.d.ts.map +1 -1
  103. package/dist/core/debug.js.map +1 -1
  104. package/dist/core/errors/BaseMcpError.d.ts.map +1 -1
  105. package/dist/core/errors/BaseMcpError.js.map +1 -1
  106. package/dist/core/errors/ValidationError.d.ts.map +1 -1
  107. package/dist/core/errors/ValidationError.js.map +1 -1
  108. package/dist/core/errors/errors.d.ts.map +1 -1
  109. package/dist/core/errors/errors.js +1 -1
  110. package/dist/core/errors/errors.js.map +1 -1
  111. package/dist/core/index.d.ts +6 -6
  112. package/dist/core/index.d.ts.map +1 -1
  113. package/dist/core/index.js +5 -5
  114. package/dist/core/index.js.map +1 -1
  115. package/dist/core/init-mcp-server.d.ts.map +1 -1
  116. package/dist/core/init-mcp-server.js.map +1 -1
  117. package/dist/core/logger.d.ts.map +1 -1
  118. package/dist/core/logger.js +1 -1
  119. package/dist/core/logger.js.map +1 -1
  120. package/dist/core/mcp/create-mcp-server.d.ts.map +1 -1
  121. package/dist/core/mcp/create-mcp-server.js +1 -1
  122. package/dist/core/mcp/create-mcp-server.js.map +1 -1
  123. package/dist/core/mcp/prompts.d.ts.map +1 -1
  124. package/dist/core/mcp/prompts.js.map +1 -1
  125. package/dist/core/mcp/readme-assembler.d.ts.map +1 -1
  126. package/dist/core/mcp/readme-assembler.js +3 -1
  127. package/dist/core/mcp/readme-assembler.js.map +1 -1
  128. package/dist/core/mcp/resources.d.ts.map +1 -1
  129. package/dist/core/mcp/resources.js.map +1 -1
  130. package/dist/core/mcp/server-stdio.d.ts.map +1 -1
  131. package/dist/core/utils/formatToolResult.d.ts.map +1 -1
  132. package/dist/core/utils/formatToolResult.js.map +1 -1
  133. package/dist/core/utils/port-checker.d.ts.map +1 -1
  134. package/dist/core/utils/port-checker.js.map +1 -1
  135. package/dist/core/utils/rate-limit.d.ts.map +1 -1
  136. package/dist/core/utils/rate-limit.js +2 -8
  137. package/dist/core/utils/rate-limit.js.map +1 -1
  138. package/dist/core/utils/testing/BaseMcpClient.d.ts.map +1 -1
  139. package/dist/core/utils/testing/BaseMcpClient.js.map +1 -1
  140. package/dist/core/utils/testing/McpHttpClient.d.ts.map +1 -1
  141. package/dist/core/utils/testing/McpHttpClient.js +2 -2
  142. package/dist/core/utils/testing/McpHttpClient.js.map +1 -1
  143. package/dist/core/utils/testing/McpSseClient.d.ts.map +1 -1
  144. package/dist/core/utils/testing/McpSseClient.js +3 -8
  145. package/dist/core/utils/testing/McpSseClient.js.map +1 -1
  146. package/dist/core/utils/testing/McpStdioClient.d.ts.map +1 -1
  147. package/dist/core/utils/testing/McpStdioClient.js.map +1 -1
  148. package/dist/core/utils/testing/McpStreamableHttpClient.d.ts.map +1 -1
  149. package/dist/core/utils/testing/McpStreamableHttpClient.js +7 -8
  150. package/dist/core/utils/testing/McpStreamableHttpClient.js.map +1 -1
  151. package/dist/core/utils/utils.d.ts.map +1 -1
  152. package/dist/core/utils/utils.js +3 -5
  153. package/dist/core/utils/utils.js.map +1 -1
  154. package/dist/core/web/admin-router.d.ts.map +1 -1
  155. package/dist/core/web/admin-router.js +3 -3
  156. package/dist/core/web/admin-router.js.map +1 -1
  157. package/dist/core/web/cors.d.ts.map +1 -1
  158. package/dist/core/web/cors.js.map +1 -1
  159. package/dist/core/web/favicon-svg.d.ts.map +1 -1
  160. package/dist/core/web/favicon-svg.js +1 -5
  161. package/dist/core/web/favicon-svg.js.map +1 -1
  162. package/dist/core/web/home-api.d.ts.map +1 -1
  163. package/dist/core/web/home-api.js +7 -8
  164. package/dist/core/web/home-api.js.map +1 -1
  165. package/dist/core/web/openapi.d.ts.map +1 -1
  166. package/dist/core/web/openapi.js +1 -3
  167. package/dist/core/web/openapi.js.map +1 -1
  168. package/dist/core/web/server-http.d.ts.map +1 -1
  169. package/dist/core/web/server-http.js +4 -4
  170. package/dist/core/web/server-http.js.map +1 -1
  171. package/dist/core/web/static/agent-tester/index.html +323 -323
  172. package/dist/core/web/static/agent-tester/script.js +311 -200
  173. package/dist/core/web/static/agent-tester/styles.css +1840 -1840
  174. package/dist/core/web/static/home/index.html +220 -220
  175. package/dist/core/web/static/home/script.js +72 -43
  176. package/dist/core/web/static/styles.css +927 -927
  177. package/dist/core/web/static/token-gen/index.html +136 -136
  178. package/dist/core/web/static/token-gen/script.js +58 -56
  179. package/dist/core/web/svg-icons.d.ts.map +1 -1
  180. package/dist/core/web/svg-icons.js +1 -5
  181. package/dist/core/web/svg-icons.js.map +1 -1
  182. package/package.json +10 -5
  183. package/{cli-template/.claude/hooks/eslint-fix.cjs → scripts/cc-hook-oxlint-oxfmt-fix.cjs} +109 -100
  184. package/scripts/generate-jwt.js +5 -9
  185. package/scripts/kill-port.js +5 -2
  186. package/scripts/npm/run.js +1 -2
  187. package/scripts/remove-nul.js +1 -1
  188. package/scripts/update-sdk.js +36 -14
  189. package/src/template/api/router.ts +3 -3
  190. package/src/template/prompts/agent-brief.ts +0 -1
  191. package/src/template/start.ts +3 -8
  192. package/src/template/tools/handle-tool-call.ts +3 -3
  193. package/src/template/tools/tools.ts +3 -7
  194. package/src/tests/jest-simple-reporter.js +1 -1
  195. package/src/tests/mcp/sse/mcp-sse-client-handling.md +111 -111
  196. package/src/tests/mcp/sse/test-sse-npm-package.js +2 -3
  197. package/src/tests/mcp/test-cases.js +6 -7
  198. package/src/tests/mcp/test-http.js +2 -2
  199. package/src/tests/mcp/test-sse.js +9 -7
  200. package/src/tests/mcp/test-stdio.js +12 -8
  201. package/src/tests/utils.ts +4 -3
  202. package/cli-template/eslint.config.js +0 -27
@@ -1,136 +1,136 @@
1
- <!DOCTYPE html>
2
- <html lang='ru'>
3
- <head>
4
- <meta charset='UTF-8'>
5
- <meta name='viewport' content='width=device-width, initial-scale=1.0'>
6
- <link rel="icon" type="image/svg+xml" href="/favicon.svg">
7
- <title>Token Generator & Validator</title>
8
- <link rel="stylesheet" href="/static/styles.css">
9
- </head>
10
- <body>
11
- <!-- Authentication Modal -->
12
- <div id="tokenModal" class="modal-overlay" style="display: none;">
13
- <div class="modal-content" style="width: 450px;">
14
- <div class="modal-header">
15
- <h3>🔐 Authentication Required</h3>
16
- </div>
17
- <div class="modal-body">
18
- <p style="margin-bottom: 16px; color: #505f79;">
19
- Please authenticate to continue.
20
- </p>
21
-
22
- <!-- Auth tabs (shown only when both token and basic are available) -->
23
- <div id="adminAuthTabs" class="admin-auth-tabs" style="display: none;">
24
- <button type="button" class="admin-auth-tab active" data-tab="token">Token</button>
25
- <button type="button" class="admin-auth-tab" data-tab="basic">Login</button>
26
- </div>
27
-
28
- <!-- Token auth form -->
29
- <form id="tokenAuthForm">
30
- <div class="form-group">
31
- <label for="authTokenInput">Access Token:</label>
32
- <textarea id="authTokenInput" name="authToken" rows="3" required
33
- placeholder="Paste your JWT or server token here..."></textarea>
34
- </div>
35
- <div id="tokenAuthError" class="result error" style="display: none; margin-top: 12px; margin-bottom: 12px;"></div>
36
- <button type="submit" class="btn" style="margin-bottom: 0;">Authenticate</button>
37
- </form>
38
-
39
- <!-- Basic auth form (hidden by default) -->
40
- <form id="basicAuthForm" style="display: none;">
41
- <div class="form-group">
42
- <label for="authUsername">Username:</label>
43
- <input type="text" id="authUsername" name="username" required placeholder="Username" autocomplete="username">
44
- </div>
45
- <div class="form-group">
46
- <label for="authPassword">Password:</label>
47
- <input type="password" id="authPassword" name="password" required placeholder="Password" autocomplete="current-password">
48
- </div>
49
- <div id="basicAuthError" class="result error" style="display: none; margin-top: 12px; margin-bottom: 12px;"></div>
50
- <button type="submit" class="btn" style="margin-bottom: 0;">Authenticate</button>
51
- </form>
52
- </div>
53
- </div>
54
- </div>
55
-
56
- <div class="simple-container">
57
- <!-- Header -->
58
- <header class="simple-header">
59
- <div class="header-left">
60
- <div class="service-icon">
61
- <img src="/svg/token-gen/jwt-icon.svg" alt="JWT">
62
- </div>
63
- <h1>Token Generator & Validator</h1>
64
- </div>
65
- <div id="authStatusContainer" class="header-right"></div>
66
- </header>
67
-
68
- <main class="simple-main">
69
-
70
- <div class="tab-container">
71
- <div class="tabs">
72
- <button class="tab active" onclick="switchTab('generate')">Token generation</button>
73
- <button class="tab" onclick="switchTab('validate')">Token validation</button>
74
- </div>
75
-
76
- <!-- Token generation -->
77
- <div id="generate" class="tab-content active">
78
- <form id="generateForm">
79
- <div class="form-group">
80
- <div class="form-row" style="gap: 20px;">
81
- <div style="flex: 1;">
82
- <label for="tokenUser">Who is the token issued to:</label>
83
- <input type="text" id="tokenUser" name="user" required>
84
- </div>
85
- <div style="flex: 1;">
86
- <label>For how long:</label>
87
- <div class="form-row">
88
- <input type="number" id="timeValue" name="timeValue" class="time-input" min="1" value="15" required>
89
- <select id="timeUnit" name="timeUnit" class="time-unit">
90
- <option value="minutes" selected>minutes</option>
91
- <option value="hours">hours</option>
92
- <option value="days">days</option>
93
- <option value="months">months</option>
94
- <option value="years">years</option>
95
- </select>
96
- </div>
97
- </div>
98
- </div>
99
- </div>
100
- <div class="form-group">
101
- <label for="tokenIp">Allowed IP addresses (optional):</label>
102
- <input type="text" id="tokenIp" name="ip"
103
- placeholder="e.g. 192.168.1.100, 10.0.0.0/24; 172.16.0.0/12">
104
- <small style="color: #6b778c; margin-top: 4px; display: block;">
105
- Comma, semicolon or space separated. Supports CIDR notation.
106
- Leave empty to allow any IP.
107
- </small>
108
- </div>
109
- <div class="form-group">
110
- <label>Additional data (key-value):</label>
111
- <div id="keyValuePairs"></div>
112
- <button type="button" class="add-btn" onclick="addKeyValuePair()">+</button>
113
- </div>
114
- <button type="submit" class="btn">Generate a token</button>
115
- </form>
116
- <div id="generateResult"></div>
117
- </div>
118
-
119
- <!-- Token validation -->
120
- <div id="validate" class="tab-content">
121
- <form id="validateForm">
122
- <div class="form-group">
123
- <label for="tokenInput">Enter the token for verification:</label>
124
- <textarea id="tokenInput" name="token" rows="4" required></textarea>
125
- </div>
126
- <button type="submit" class="btn">Check Token</button>
127
- </form>
128
- <div id="validateResult"></div>
129
- </div>
130
- </div>
131
- </main>
132
- </div>
133
-
134
- <script src="/static/token-gen/script.js"></script>
135
- </body>
136
- </html>
1
+ <!DOCTYPE html>
2
+ <html lang='ru'>
3
+ <head>
4
+ <meta charset='UTF-8'>
5
+ <meta name='viewport' content='width=device-width, initial-scale=1.0'>
6
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg">
7
+ <title>Token Generator & Validator</title>
8
+ <link rel="stylesheet" href="/static/styles.css">
9
+ </head>
10
+ <body>
11
+ <!-- Authentication Modal -->
12
+ <div id="tokenModal" class="modal-overlay" style="display: none;">
13
+ <div class="modal-content" style="width: 450px;">
14
+ <div class="modal-header">
15
+ <h3>🔐 Authentication Required</h3>
16
+ </div>
17
+ <div class="modal-body">
18
+ <p style="margin-bottom: 16px; color: #505f79;">
19
+ Please authenticate to continue.
20
+ </p>
21
+
22
+ <!-- Auth tabs (shown only when both token and basic are available) -->
23
+ <div id="adminAuthTabs" class="admin-auth-tabs" style="display: none;">
24
+ <button type="button" class="admin-auth-tab active" data-tab="token">Token</button>
25
+ <button type="button" class="admin-auth-tab" data-tab="basic">Login</button>
26
+ </div>
27
+
28
+ <!-- Token auth form -->
29
+ <form id="tokenAuthForm">
30
+ <div class="form-group">
31
+ <label for="authTokenInput">Access Token:</label>
32
+ <textarea id="authTokenInput" name="authToken" rows="3" required
33
+ placeholder="Paste your JWT or server token here..."></textarea>
34
+ </div>
35
+ <div id="tokenAuthError" class="result error" style="display: none; margin-top: 12px; margin-bottom: 12px;"></div>
36
+ <button type="submit" class="btn" style="margin-bottom: 0;">Authenticate</button>
37
+ </form>
38
+
39
+ <!-- Basic auth form (hidden by default) -->
40
+ <form id="basicAuthForm" style="display: none;">
41
+ <div class="form-group">
42
+ <label for="authUsername">Username:</label>
43
+ <input type="text" id="authUsername" name="username" required placeholder="Username" autocomplete="username">
44
+ </div>
45
+ <div class="form-group">
46
+ <label for="authPassword">Password:</label>
47
+ <input type="password" id="authPassword" name="password" required placeholder="Password" autocomplete="current-password">
48
+ </div>
49
+ <div id="basicAuthError" class="result error" style="display: none; margin-top: 12px; margin-bottom: 12px;"></div>
50
+ <button type="submit" class="btn" style="margin-bottom: 0;">Authenticate</button>
51
+ </form>
52
+ </div>
53
+ </div>
54
+ </div>
55
+
56
+ <div class="simple-container">
57
+ <!-- Header -->
58
+ <header class="simple-header">
59
+ <div class="header-left">
60
+ <div class="service-icon">
61
+ <img src="/svg/token-gen/jwt-icon.svg" alt="JWT">
62
+ </div>
63
+ <h1>Token Generator & Validator</h1>
64
+ </div>
65
+ <div id="authStatusContainer" class="header-right"></div>
66
+ </header>
67
+
68
+ <main class="simple-main">
69
+
70
+ <div class="tab-container">
71
+ <div class="tabs">
72
+ <button class="tab active" onclick="switchTab('generate')">Token generation</button>
73
+ <button class="tab" onclick="switchTab('validate')">Token validation</button>
74
+ </div>
75
+
76
+ <!-- Token generation -->
77
+ <div id="generate" class="tab-content active">
78
+ <form id="generateForm">
79
+ <div class="form-group">
80
+ <div class="form-row" style="gap: 20px;">
81
+ <div style="flex: 1;">
82
+ <label for="tokenUser">Who is the token issued to:</label>
83
+ <input type="text" id="tokenUser" name="user" required>
84
+ </div>
85
+ <div style="flex: 1;">
86
+ <label>For how long:</label>
87
+ <div class="form-row">
88
+ <input type="number" id="timeValue" name="timeValue" class="time-input" min="1" value="15" required>
89
+ <select id="timeUnit" name="timeUnit" class="time-unit">
90
+ <option value="minutes" selected>minutes</option>
91
+ <option value="hours">hours</option>
92
+ <option value="days">days</option>
93
+ <option value="months">months</option>
94
+ <option value="years">years</option>
95
+ </select>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ <div class="form-group">
101
+ <label for="tokenIp">Allowed IP addresses (optional):</label>
102
+ <input type="text" id="tokenIp" name="ip"
103
+ placeholder="e.g. 192.168.1.100, 10.0.0.0/24; 172.16.0.0/12">
104
+ <small style="color: #6b778c; margin-top: 4px; display: block;">
105
+ Comma, semicolon or space separated. Supports CIDR notation.
106
+ Leave empty to allow any IP.
107
+ </small>
108
+ </div>
109
+ <div class="form-group">
110
+ <label>Additional data (key-value):</label>
111
+ <div id="keyValuePairs"></div>
112
+ <button type="button" class="add-btn" onclick="addKeyValuePair()">+</button>
113
+ </div>
114
+ <button type="submit" class="btn">Generate a token</button>
115
+ </form>
116
+ <div id="generateResult"></div>
117
+ </div>
118
+
119
+ <!-- Token validation -->
120
+ <div id="validate" class="tab-content">
121
+ <form id="validateForm">
122
+ <div class="form-group">
123
+ <label for="tokenInput">Enter the token for verification:</label>
124
+ <textarea id="tokenInput" name="token" rows="4" required></textarea>
125
+ </div>
126
+ <button type="submit" class="btn">Check Token</button>
127
+ </form>
128
+ <div id="validateResult"></div>
129
+ </div>
130
+ </div>
131
+ </main>
132
+ </div>
133
+
134
+ <script src="/static/token-gen/script.js"></script>
135
+ </body>
136
+ </html>
@@ -9,22 +9,22 @@ let requiresFrontendAuth = false;
9
9
  let authMethods = []; // ['token', 'basic']
10
10
 
11
11
  // Get stored auth token from sessionStorage
12
- function getStoredToken () {
12
+ function getStoredToken() {
13
13
  return sessionStorage.getItem(AUTH_TOKEN_KEY);
14
14
  }
15
15
 
16
16
  // Store auth token in sessionStorage
17
- function storeToken (token) {
17
+ function storeToken(token) {
18
18
  sessionStorage.setItem(AUTH_TOKEN_KEY, token);
19
19
  }
20
20
 
21
21
  // Clear stored auth token
22
- function clearStoredToken () {
22
+ function clearStoredToken() {
23
23
  sessionStorage.removeItem(AUTH_TOKEN_KEY);
24
24
  }
25
25
 
26
26
  // Show authentication modal
27
- function showAuthModal (errorMessage = null) {
27
+ function showAuthModal(errorMessage = null) {
28
28
  const modal = document.getElementById('tokenModal');
29
29
 
30
30
  // Clear errors on both forms
@@ -35,8 +35,7 @@ function showAuthModal (errorMessage = null) {
35
35
 
36
36
  if (errorMessage) {
37
37
  // Show error in the active form
38
- const activeError = document.getElementById('basicAuthForm').style.display !== 'none'
39
- ? basicError : tokenError;
38
+ const activeError = document.getElementById('basicAuthForm').style.display !== 'none' ? basicError : tokenError;
40
39
  activeError.innerHTML = `<strong>Error:</strong> ${errorMessage}`;
41
40
  activeError.style.display = 'block';
42
41
  }
@@ -45,13 +44,13 @@ function showAuthModal (errorMessage = null) {
45
44
  }
46
45
 
47
46
  // Hide authentication modal
48
- function hideAuthModal () {
47
+ function hideAuthModal() {
49
48
  const modal = document.getElementById('tokenModal');
50
49
  modal.style.display = 'none';
51
50
  }
52
51
 
53
52
  // Setup auth tabs and forms based on available methods
54
- function setupAuthForms (methods) {
53
+ function setupAuthForms(methods) {
55
54
  const hasToken = methods.includes('token');
56
55
  const hasBasic = methods.includes('basic');
57
56
 
@@ -79,7 +78,7 @@ function setupAuthForms (methods) {
79
78
  }
80
79
 
81
80
  // Bind tab click handlers
82
- function bindAuthTabs () {
81
+ function bindAuthTabs() {
83
82
  const tabButtons = document.querySelectorAll('.admin-auth-tab');
84
83
  const tokenForm = document.getElementById('tokenAuthForm');
85
84
  const basicForm = document.getElementById('basicAuthForm');
@@ -108,13 +107,13 @@ function bindAuthTabs () {
108
107
  }
109
108
 
110
109
  // Authenticated fetch wrapper - adds Authorization header
111
- async function authFetch (url, options = {}) {
110
+ async function authFetch(url, options = {}) {
112
111
  const token = getStoredToken();
113
112
 
114
113
  if (requiresFrontendAuth && token) {
115
114
  options.headers = {
116
115
  ...options.headers,
117
- 'Authorization': token,
116
+ Authorization: token,
118
117
  };
119
118
  }
120
119
 
@@ -140,7 +139,7 @@ async function authFetch (url, options = {}) {
140
139
  }
141
140
 
142
141
  // Check auth config and initialize authentication if needed
143
- async function initializeAuth () {
142
+ async function initializeAuth() {
144
143
  try {
145
144
  // Get auth config from public endpoint (no auth required)
146
145
  const response = await fetch('/admin/api/auth-config');
@@ -205,9 +204,11 @@ async function initializeAuth () {
205
204
  }
206
205
 
207
206
  // Handle token authentication form submission
208
- function setupTokenAuthForm () {
207
+ function setupTokenAuthForm() {
209
208
  const form = document.getElementById('tokenAuthForm');
210
- if (!form) {return;}
209
+ if (!form) {
210
+ return;
211
+ }
211
212
 
212
213
  form.addEventListener('submit', async (e) => {
213
214
  e.preventDefault();
@@ -246,9 +247,11 @@ function setupTokenAuthForm () {
246
247
  }
247
248
 
248
249
  // Handle basic authentication form submission
249
- function setupBasicAuthForm () {
250
+ function setupBasicAuthForm() {
250
251
  const form = document.getElementById('basicAuthForm');
251
- if (!form) {return;}
252
+ if (!form) {
253
+ return;
254
+ }
252
255
 
253
256
  form.addEventListener('submit', async (e) => {
254
257
  e.preventDefault();
@@ -297,32 +300,32 @@ function setupBasicAuthForm () {
297
300
  }
298
301
 
299
302
  // Set primary color CSS variable
300
- function setPrimaryColor (color) {
303
+ function setPrimaryColor(color) {
301
304
  if (color) {
302
305
  document.documentElement.style.setProperty('--primary-color', color);
303
306
  }
304
307
  }
305
308
 
306
- function switchTab (tabName) {
307
- document.querySelectorAll('.tab-content').forEach(content => {
309
+ function switchTab(tabName) {
310
+ document.querySelectorAll('.tab-content').forEach((content) => {
308
311
  content.classList.remove('active');
309
312
  });
310
- document.querySelectorAll('.tab').forEach(tab => {
313
+ document.querySelectorAll('.tab').forEach((tab) => {
311
314
  tab.classList.remove('active');
312
315
  });
313
316
  document.getElementById(tabName).classList.add('active');
314
317
 
315
318
  // Activate the corresponding tab button
316
319
  const tabs = document.querySelectorAll('.tab');
317
- tabs.forEach(tab => {
320
+ tabs.forEach((tab) => {
318
321
  const onclick = tab.getAttribute('onclick');
319
- if (onclick && onclick.includes('switchTab(\'' + tabName + '\')')) {
322
+ if (onclick && onclick.includes("switchTab('" + tabName + "')")) {
320
323
  tab.classList.add('active');
321
324
  }
322
325
  });
323
326
  }
324
327
 
325
- function addKeyValuePair (key = '', value = '', readonly = false, placeholder = 'Value') {
328
+ function addKeyValuePair(key = '', value = '', readonly = false, placeholder = 'Value') {
326
329
  if (keyValuePairCount >= 15) {
327
330
  alert('Maximum of 15 key-value pairs');
328
331
  return;
@@ -331,25 +334,24 @@ function addKeyValuePair (key = '', value = '', readonly = false, placeholder =
331
334
  const pairDiv = document.createElement('div');
332
335
  pairDiv.className = 'key-value-pair';
333
336
 
334
- const keyInput = readonly ?
335
- '<input type="text" placeholder="Key" name="keys" value="' + key + '" readonly style="background-color: #f8f9fa;">' :
336
- '<input type="text" placeholder="Key" name="keys" value="' + key + '">';
337
+ const keyInput = readonly
338
+ ? '<input type="text" placeholder="Key" name="keys" value="' + key + '" readonly style="background-color: #f8f9fa;">'
339
+ : '<input type="text" placeholder="Key" name="keys" value="' + key + '">';
337
340
 
338
341
  const valueInput = '<input type="text" placeholder="' + placeholder + '" name="values" value="' + value + '">';
339
342
 
340
- pairDiv.innerHTML = keyInput + valueInput +
341
- '<button type="button" class="remove-btn" onclick="removeKeyValuePair(this)">×</button>';
343
+ pairDiv.innerHTML = keyInput + valueInput + '<button type="button" class="remove-btn" onclick="removeKeyValuePair(this)">×</button>';
342
344
  container.appendChild(pairDiv);
343
345
  keyValuePairCount++;
344
346
  }
345
347
 
346
348
  // eslint-disable-next-line unused-imports/no-unused-vars
347
- function removeKeyValuePair (button) {
349
+ function removeKeyValuePair(button) {
348
350
  button.parentElement.remove();
349
351
  keyValuePairCount--;
350
352
  }
351
353
 
352
- function addCopyButtonToTokenOutput (tokenOutput, token) {
354
+ function addCopyButtonToTokenOutput(tokenOutput, token) {
353
355
  if (!tokenOutput || tokenOutput.hasAttribute('data-copy-added')) {
354
356
  return;
355
357
  }
@@ -387,7 +389,6 @@ function addCopyButtonToTokenOutput (tokenOutput, token) {
387
389
  setTimeout(() => {
388
390
  notification.classList.remove('show');
389
391
  }, 1000);
390
-
391
392
  } catch {
392
393
  // Fallback for browsers that don't support clipboard API
393
394
  const textArea = document.createElement('textarea');
@@ -434,22 +435,30 @@ function addCopyButtonToTokenOutput (tokenOutput, token) {
434
435
  });
435
436
  }
436
437
 
437
- function formatTime (ms) {
438
+ function formatTime(ms) {
438
439
  const seconds = Math.floor(ms / 1000);
439
440
  const minutes = Math.floor(seconds / 60);
440
441
  const hours = Math.floor(minutes / 60);
441
442
  const days = Math.floor(hours / 24);
442
443
 
443
- if (days > 0) {return days + ' d. ' + (hours % 24) + ' h.';}
444
- if (hours > 0) {return hours + ' h. ' + (minutes % 60) + ' min.';}
445
- if (minutes > 0) {return minutes + ' min.';}
444
+ if (days > 0) {
445
+ return days + ' d. ' + (hours % 24) + ' h.';
446
+ }
447
+ if (hours > 0) {
448
+ return hours + ' h. ' + (minutes % 60) + ' min.';
449
+ }
450
+ if (minutes > 0) {
451
+ return minutes + ' min.';
452
+ }
446
453
  return seconds + ' s.';
447
454
  }
448
455
 
449
456
  // Render authentication status in header
450
- function renderAuthStatus (data) {
457
+ function renderAuthStatus(data) {
451
458
  const container = document.getElementById('authStatusContainer');
452
- if (!container) {return;}
459
+ if (!container) {
460
+ return;
461
+ }
453
462
 
454
463
  const { authType, isAuthenticated, user, canLogout } = data;
455
464
 
@@ -476,7 +485,7 @@ function renderAuthStatus (data) {
476
485
  }
477
486
 
478
487
  // Load authentication status from API
479
- async function loadAuthStatus () {
488
+ async function loadAuthStatus() {
480
489
  try {
481
490
  const response = await authFetch('/admin/api/auth-status');
482
491
  const data = await response.json();
@@ -493,8 +502,8 @@ document.getElementById('generateForm').addEventListener('submit', async (e) =>
493
502
  e.preventDefault();
494
503
 
495
504
  const formData = new FormData(e.target);
496
- const keys = formData.getAll('keys').filter(k => k.trim());
497
- const values = formData.getAll('values').filter(v => v.trim());
505
+ const keys = formData.getAll('keys').filter((k) => k.trim());
506
+ const values = formData.getAll('values').filter((v) => v.trim());
498
507
 
499
508
  const payload = {};
500
509
  for (let i = 0; i < keys.length; i++) {
@@ -526,8 +535,7 @@ document.getElementById('generateForm').addEventListener('submit', async (e) =>
526
535
  const resultDiv = document.getElementById('generateResult');
527
536
 
528
537
  if (result.success) {
529
- resultDiv.innerHTML =
530
- `<div class="result success">
538
+ resultDiv.innerHTML = `<div class="result success">
531
539
  <strong>The token has been successfully created!</strong><br>
532
540
  <div class="token-output">${result.token}</div>
533
541
  </div>`;
@@ -544,14 +552,12 @@ document.getElementById('generateForm').addEventListener('submit', async (e) =>
544
552
  tokenTextarea.value = result.token;
545
553
  }
546
554
  } else {
547
- resultDiv.innerHTML =
548
- `<div class="result error">
555
+ resultDiv.innerHTML = `<div class="result error">
549
556
  <strong>Error:</strong> ${result.error}
550
557
  </div>`;
551
558
  }
552
559
  } catch (error) {
553
- document.getElementById('generateResult').innerHTML =
554
- `<div class="result error">
560
+ document.getElementById('generateResult').innerHTML = `<div class="result error">
555
561
  <strong>Error:</strong> ${error.message}
556
562
  </div>`;
557
563
  }
@@ -581,7 +587,7 @@ document.getElementById('validateForm').addEventListener('submit', async (e) =>
581
587
  let payloadHtml = '';
582
588
  if (payloadKeys.length > 0) {
583
589
  payloadHtml = '<h4>Additional data:</h4>';
584
- payloadKeys.forEach(key => {
590
+ payloadKeys.forEach((key) => {
585
591
  payloadHtml += '<p><strong>' + key + ':</strong> ' + result.payload[key] + '</p>';
586
592
  });
587
593
  }
@@ -589,8 +595,7 @@ document.getElementById('validateForm').addEventListener('submit', async (e) =>
589
595
  // Format issued at time
590
596
  const issuedAtTime = result.payload.iat ? new Date(result.payload.iat).toLocaleString('ru-RU') : 'N/A';
591
597
 
592
- resultDiv.innerHTML =
593
- `<div class="result success">
598
+ resultDiv.innerHTML = `<div class="result success">
594
599
  <strong>The token is valid!</strong>
595
600
  <div class="token-info">
596
601
  <h4>Token Information:</h4>
@@ -604,22 +609,20 @@ ${payloadHtml}
604
609
  </div>
605
610
  </div>`;
606
611
  } else {
607
- resultDiv.innerHTML =
608
- `<div class="result error">
612
+ resultDiv.innerHTML = `<div class="result error">
609
613
  <strong>Token invalid!</strong><br>
610
614
  Reason: ${result.error}
611
615
  </div>`;
612
616
  }
613
617
  } catch (error) {
614
- document.getElementById('validateResult').innerHTML =
615
- `<div class="result error">
618
+ document.getElementById('validateResult').innerHTML = `<div class="result error">
616
619
  <strong>Error:</strong> ${error.message}
617
620
  </div>`;
618
621
  }
619
622
  });
620
623
 
621
624
  // Function to initialize the form
622
- async function initializeForm () {
625
+ async function initializeForm() {
623
626
  try {
624
627
  // Getting information about the service
625
628
  const response = await authFetch('/admin/api/service-info');
@@ -637,7 +640,6 @@ async function initializeForm () {
637
640
  // Adding a pre-filled pair serviceName
638
641
  addKeyValuePair('service', serviceName, true);
639
642
  addKeyValuePair('issue', '', true, 'URL of request for the issuance of a token in JIRA');
640
-
641
643
  } catch (error) {
642
644
  console.error('Error loading service info:', error);
643
645
  return;
@@ -648,7 +650,7 @@ async function initializeForm () {
648
650
 
649
651
  // Logout function
650
652
  // eslint-disable-next-line unused-imports/no-unused-vars
651
- async function logout () {
653
+ async function logout() {
652
654
  try {
653
655
  // For frontend auth, clear the stored credentials
654
656
  if (requiresFrontendAuth) {
@@ -1 +1 @@
1
- {"version":3,"file":"svg-icons.d.ts","sourceRoot":"","sources":["../../../src/core/web/svg-icons.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAuEpD,eAAO,MAAM,eAAe,QAAO,MAelC,CAAC"}
1
+ {"version":3,"file":"svg-icons.d.ts","sourceRoot":"","sources":["../../../src/core/web/svg-icons.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAmEpD,eAAO,MAAM,eAAe,QAAO,MAelC,CAAC"}
@@ -14,11 +14,7 @@ const ONE_YEAR_MS = 60 * 60 * 24 * 365 * 1000; // 1 year
14
14
  // Cache for loaded SVG files
15
15
  const svgCache = new Map();
16
16
  const etagS = (entity) => {
17
- const hash = crypto
18
- .createHash('sha1')
19
- .update(entity, 'utf8')
20
- .digest('base64')
21
- .substring(0, 27);
17
+ const hash = crypto.createHash('sha1').update(entity, 'utf8').digest('base64').substring(0, 27);
22
18
  return `"${Buffer.byteLength(entity, 'utf8').toString(16)}-${hash}"`;
23
19
  };
24
20
  const loadSvg = (relativePath) => {
@@ -1 +1 @@
1
- {"version":3,"file":"svg-icons.js","sourceRoot":"","sources":["../../../src/core/web/svg-icons.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"svg-icons.js","sourceRoot":"","sources":["../../../src/core/web/svg-icons.ts"],"names":[],"mappings":"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"}