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
@@ -4,19 +4,19 @@ let resourcesData = [];
4
4
  let promptsData = [];
5
5
 
6
6
  // Set primary color CSS variable
7
- function setPrimaryColor (color) {
7
+ function setPrimaryColor(color) {
8
8
  if (color) {
9
9
  document.documentElement.style.setProperty('--primary-color', color);
10
10
  }
11
11
  }
12
12
 
13
13
  // Set favicon dynamically
14
- function setFavicon (svgContent) {
15
- if (!svgContent) {return;}
14
+ function setFavicon(svgContent) {
15
+ if (!svgContent) {
16
+ return;
17
+ }
16
18
 
17
- const encoded = encodeURIComponent(svgContent)
18
- .replace(/'/g, '%27')
19
- .replace(/"/g, '%22');
19
+ const encoded = encodeURIComponent(svgContent).replace(/'/g, '%27').replace(/"/g, '%22');
20
20
 
21
21
  const link = document.querySelector('link[rel="icon"]') || document.createElement('link');
22
22
  link.rel = 'icon';
@@ -29,7 +29,7 @@ function setFavicon (svgContent) {
29
29
  }
30
30
 
31
31
  // Set header icon dynamically
32
- function setHeaderIcon (svgContent) {
32
+ function setHeaderIcon(svgContent) {
33
33
  const iconContainer = document.getElementById('serviceIcon');
34
34
  if (iconContainer && svgContent) {
35
35
  iconContainer.innerHTML = svgContent;
@@ -37,7 +37,7 @@ function setHeaderIcon (svgContent) {
37
37
  }
38
38
 
39
39
  // Render page info
40
- function renderPageInfo (data) {
40
+ function renderPageInfo(data) {
41
41
  // Service title
42
42
  const titleEl = document.getElementById('serviceTitle');
43
43
  if (titleEl) {
@@ -49,27 +49,39 @@ function renderPageInfo (data) {
49
49
 
50
50
  // Description
51
51
  const descEl = document.getElementById('serviceDescription');
52
- if (descEl) {descEl.textContent = data.description;}
52
+ if (descEl) {
53
+ descEl.textContent = data.description;
54
+ }
53
55
 
54
56
  // Version
55
57
  const versionEl = document.getElementById('serviceVersion');
56
- if (versionEl) {versionEl.textContent = data.version;}
58
+ if (versionEl) {
59
+ versionEl.textContent = data.version;
60
+ }
57
61
 
58
62
  // Uptime
59
63
  const uptimeEl = document.getElementById('serviceUptime');
60
- if (uptimeEl) {uptimeEl.textContent = data.uptime;}
64
+ if (uptimeEl) {
65
+ uptimeEl.textContent = data.uptime;
66
+ }
61
67
 
62
68
  // Tools count
63
69
  const toolsEl = document.getElementById('toolsCount');
64
- if (toolsEl) {toolsEl.textContent = data.toolsCount + ' available';}
70
+ if (toolsEl) {
71
+ toolsEl.textContent = data.toolsCount + ' available';
72
+ }
65
73
 
66
74
  // Resources count
67
75
  const resourcesEl = document.getElementById('resourcesCount');
68
- if (resourcesEl) {resourcesEl.textContent = data.resourcesCount + ' available';}
76
+ if (resourcesEl) {
77
+ resourcesEl.textContent = data.resourcesCount + ' available';
78
+ }
69
79
 
70
80
  // Prompts count
71
81
  const promptsEl = document.getElementById('promptsCount');
72
- if (promptsEl) {promptsEl.textContent = data.promptsCount + ' available';}
82
+ if (promptsEl) {
83
+ promptsEl.textContent = data.promptsCount + ' available';
84
+ }
73
85
 
74
86
  // Database info
75
87
  const dbSection = document.getElementById('dbSection');
@@ -78,7 +90,9 @@ function renderPageInfo (data) {
78
90
  dbSection.style.display = 'block';
79
91
  const dbValue = document.getElementById('dbValue');
80
92
  const dbStatus = document.getElementById('dbStatus');
81
- if (dbValue) {dbValue.textContent = data.db.connection + ' • ';}
93
+ if (dbValue) {
94
+ dbValue.textContent = data.db.connection + ' • ';
95
+ }
82
96
  if (dbStatus) {
83
97
  dbStatus.textContent = data.db.status;
84
98
  dbStatus.className = 'value ' + data.db.status;
@@ -96,10 +110,14 @@ function renderPageInfo (data) {
96
110
 
97
111
  // Auth info
98
112
  const mcpAuthEl = document.getElementById('mcpAuthValue');
99
- if (mcpAuthEl) {mcpAuthEl.textContent = data.mcpAuth || 'disabled';}
113
+ if (mcpAuthEl) {
114
+ mcpAuthEl.textContent = data.mcpAuth || 'disabled';
115
+ }
100
116
 
101
117
  const adminPanelEl = document.getElementById('adminPanelValue');
102
- if (adminPanelEl) {adminPanelEl.textContent = data.adminPanel || 'disabled';}
118
+ if (adminPanelEl) {
119
+ adminPanelEl.textContent = data.adminPanel || 'disabled';
120
+ }
103
121
 
104
122
  // Consul info
105
123
  const consulSection = document.getElementById('consulSection');
@@ -124,7 +142,7 @@ function renderPageInfo (data) {
124
142
  }
125
143
 
126
144
  // Load page data from API
127
- async function loadPageData () {
145
+ async function loadPageData() {
128
146
  try {
129
147
  const response = await fetch('/api/home-info');
130
148
  if (!response.ok) {
@@ -147,14 +165,13 @@ async function loadPageData () {
147
165
 
148
166
  // Render page info
149
167
  renderPageInfo(data);
150
-
151
168
  } catch (error) {
152
169
  console.error('Error loading page data:', error);
153
170
  }
154
171
  }
155
172
 
156
173
  // eslint-disable-next-line unused-imports/no-unused-vars
157
- function openModal (sectionName) {
174
+ function openModal(sectionName) {
158
175
  const modal = document.getElementById(sectionName + '-modal');
159
176
  const tableBody = document.getElementById(sectionName + '-table').querySelector('tbody');
160
177
 
@@ -168,12 +185,12 @@ function openModal (sectionName) {
168
185
  }, 300);
169
186
  }
170
187
 
171
- function closeModal (sectionName) {
188
+ function closeModal(sectionName) {
172
189
  const modal = document.getElementById(sectionName + '-modal');
173
190
  modal.style.display = 'none';
174
191
  }
175
192
 
176
- function loadTableData (sectionName) {
193
+ function loadTableData(sectionName) {
177
194
  const tableBody = document.getElementById(sectionName + '-table').querySelector('tbody');
178
195
  let data, html;
179
196
 
@@ -195,12 +212,14 @@ function loadTableData (sectionName) {
195
212
  tableBody.innerHTML = html;
196
213
  }
197
214
 
198
- function generateToolsTableRows (tools) {
215
+ function generateToolsTableRows(tools) {
199
216
  if (!tools || tools.length === 0) {
200
217
  return '<tr><td colspan="3" class="loading-cell">No tools available</td></tr>';
201
218
  }
202
- return tools.map((tool, index) =>
203
- `<tr>
219
+ return tools
220
+ .map(
221
+ (tool, index) =>
222
+ `<tr>
204
223
  <td><code>${tool.name}</code></td>
205
224
  <td>${tool.annotations?.title || tool.description}</td>
206
225
  <td>
@@ -215,15 +234,18 @@ function generateToolsTableRows (tools) {
215
234
  </div>
216
235
  </td>
217
236
  </tr>`,
218
- ).join('');
237
+ )
238
+ .join('');
219
239
  }
220
240
 
221
- function generateResourcesTableRows (resources) {
241
+ function generateResourcesTableRows(resources) {
222
242
  if (!resources || resources.length === 0) {
223
243
  return '<tr><td colspan="5" class="loading-cell">No resources available</td></tr>';
224
244
  }
225
- return resources.map((resource, index) =>
226
- `<tr>
245
+ return resources
246
+ .map(
247
+ (resource, index) =>
248
+ `<tr>
227
249
  <td><code>${resource.uri}</code></td>
228
250
  <td>${resource.name}</td>
229
251
  <td>${resource.description}</td>
@@ -243,15 +265,18 @@ function generateResourcesTableRows (resources) {
243
265
  </div>
244
266
  </td>
245
267
  </tr>`,
246
- ).join('');
268
+ )
269
+ .join('');
247
270
  }
248
271
 
249
- function generatePromptsTableRows (prompts) {
272
+ function generatePromptsTableRows(prompts) {
250
273
  if (!prompts || prompts.length === 0) {
251
274
  return '<tr><td colspan="2" class="loading-cell">No prompts available</td></tr>';
252
275
  }
253
- return prompts.map((prompt, index) =>
254
- `<tr>
276
+ return prompts
277
+ .map(
278
+ (prompt, index) =>
279
+ `<tr>
255
280
  <td><code>${prompt.name}</code></td>
256
281
  <td>
257
282
  <a class="detail-link" id="prompts-toggle-details-${index}" onclick="togglePromptDetails('prompts', ${index}, 'details')">details</a>
@@ -268,11 +293,12 @@ function generatePromptsTableRows (prompts) {
268
293
  </div>
269
294
  </td>
270
295
  </tr>`,
271
- ).join('');
296
+ )
297
+ .join('');
272
298
  }
273
299
 
274
300
  // eslint-disable-next-line unused-imports/no-unused-vars
275
- function toggleDetails (sectionName, index) {
301
+ function toggleDetails(sectionName, index) {
276
302
  const detailRow = document.getElementById(sectionName + '-detail-' + index);
277
303
  const toggleLink = document.getElementById(sectionName + '-toggle-' + index);
278
304
  const loadingSpinner = detailRow.querySelector('.loading-spinner');
@@ -323,7 +349,7 @@ function toggleDetails (sectionName, index) {
323
349
 
324
350
  // Handle prompt details and prompt content display
325
351
  // eslint-disable-next-line unused-imports/no-unused-vars
326
- async function togglePromptDetails (sectionName, index, displayType) {
352
+ async function togglePromptDetails(sectionName, index, displayType) {
327
353
  const detailRow = document.getElementById(sectionName + '-detail-' + index);
328
354
  const toggleLinkDetails = document.getElementById(sectionName + '-toggle-details-' + index);
329
355
  const toggleLinkPrompt = document.getElementById(sectionName + '-toggle-prompt-' + index);
@@ -385,7 +411,9 @@ async function togglePromptDetails (sectionName, index, displayType) {
385
411
  let promptText = '';
386
412
 
387
413
  messages.forEach((msg, i) => {
388
- if (i > 0) {promptText += '\n\n---\n\n';}
414
+ if (i > 0) {
415
+ promptText += '\n\n---\n\n';
416
+ }
389
417
  promptText += 'Role: ' + msg.role + '\n\n';
390
418
  if (typeof msg.content === 'string') {
391
419
  promptText += msg.content;
@@ -416,7 +444,7 @@ async function togglePromptDetails (sectionName, index, displayType) {
416
444
 
417
445
  // Handle resource details and resource content display
418
446
  // eslint-disable-next-line unused-imports/no-unused-vars
419
- async function toggleResourceDetails (sectionName, index, displayType) {
447
+ async function toggleResourceDetails(sectionName, index, displayType) {
420
448
  const detailRow = document.getElementById(sectionName + '-detail-' + index);
421
449
  const toggleLinkDetails = document.getElementById(sectionName + '-toggle-details-' + index);
422
450
  const toggleLinkResource = document.getElementById(sectionName + '-toggle-resource-' + index);
@@ -478,7 +506,9 @@ async function toggleResourceDetails (sectionName, index, displayType) {
478
506
  let resourceText = '';
479
507
 
480
508
  contents.forEach((content, i) => {
481
- if (i > 0) {resourceText += '\n\n---\n\n';}
509
+ if (i > 0) {
510
+ resourceText += '\n\n---\n\n';
511
+ }
482
512
  resourceText += 'URI: ' + content.uri + '\n';
483
513
  resourceText += 'MIME Type: ' + content.mimeType + '\n\n';
484
514
 
@@ -519,7 +549,7 @@ async function toggleResourceDetails (sectionName, index, displayType) {
519
549
 
520
550
  // Health Check Modal
521
551
  // eslint-disable-next-line unused-imports/no-unused-vars
522
- async function openHealthCheckModal () {
552
+ async function openHealthCheckModal() {
523
553
  const modal = document.getElementById('health-modal');
524
554
  const loading = document.getElementById('health-loading');
525
555
  const result = document.getElementById('health-result');
@@ -561,14 +591,14 @@ async function openHealthCheckModal () {
561
591
  }
562
592
 
563
593
  // Escape HTML to prevent XSS
564
- function escapeHtml (text) {
594
+ function escapeHtml(text) {
565
595
  const div = document.createElement('div');
566
596
  div.textContent = text;
567
597
  return div.innerHTML;
568
598
  }
569
599
 
570
600
  // Copy to clipboard functionality
571
- function addCopyButton (contentElement) {
601
+ function addCopyButton(contentElement) {
572
602
  if (!contentElement || contentElement.hasAttribute('data-copy-added')) {
573
603
  return;
574
604
  }
@@ -601,7 +631,6 @@ function addCopyButton (contentElement) {
601
631
  setTimeout(() => {
602
632
  notification.classList.remove('show');
603
633
  }, 1000);
604
-
605
634
  } catch {
606
635
  // Fallback for browsers that don't support clipboard API
607
636
  const textArea = document.createElement('textarea');