@gguf/coder 0.2.9 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/.editorconfig +16 -0
  2. package/.env.example +63 -0
  3. package/.gitattributes +1 -0
  4. package/.semgrepignore +19 -0
  5. package/coder-dummy-file.ts +52 -0
  6. package/coder.config.example.json +59 -0
  7. package/coder.config.json +13 -0
  8. package/color_picker.html +36 -0
  9. package/dist/tools/execute-bash.js +3 -3
  10. package/dist/tools/execute-bash.js.map +1 -1
  11. package/dist/tools/fetch-url.js +3 -3
  12. package/dist/tools/fetch-url.js.map +1 -1
  13. package/dist/tools/find-files.d.ts.map +1 -1
  14. package/dist/tools/find-files.js +1 -1
  15. package/dist/tools/find-files.js.map +1 -1
  16. package/dist/tools/lsp-get-diagnostics.js +1 -1
  17. package/dist/tools/lsp-get-diagnostics.js.map +1 -1
  18. package/dist/tools/read-file.d.ts.map +1 -1
  19. package/dist/tools/read-file.js +6 -6
  20. package/dist/tools/read-file.js.map +1 -1
  21. package/dist/tools/search-file-contents.d.ts.map +1 -1
  22. package/dist/tools/search-file-contents.js +1 -1
  23. package/dist/tools/search-file-contents.js.map +1 -1
  24. package/dist/tools/string-replace.js +11 -11
  25. package/dist/tools/string-replace.js.map +1 -1
  26. package/dist/tools/web-search.d.ts.map +1 -1
  27. package/dist/tools/web-search.js +3 -3
  28. package/dist/tools/web-search.js.map +1 -1
  29. package/dist/tools/write-file.js +4 -4
  30. package/dist/tools/write-file.js.map +1 -1
  31. package/dist/utils/tool-result-display.d.ts.map +1 -1
  32. package/dist/utils/tool-result-display.js +3 -3
  33. package/dist/utils/tool-result-display.js.map +1 -1
  34. package/package.json +2 -14
  35. package/scripts/extract-changelog.js +73 -0
  36. package/scripts/fetch-models.js +143 -0
  37. package/scripts/test.sh +40 -0
  38. package/scripts/update-homebrew-formula.sh +125 -0
  39. package/scripts/update-nix-version.sh +157 -0
  40. package/source/ai-sdk-client/AISDKClient.spec.ts +117 -0
  41. package/source/ai-sdk-client/AISDKClient.ts +155 -0
  42. package/source/ai-sdk-client/chat/chat-handler.spec.ts +121 -0
  43. package/source/ai-sdk-client/chat/chat-handler.ts +276 -0
  44. package/source/ai-sdk-client/chat/streaming-handler.spec.ts +173 -0
  45. package/source/ai-sdk-client/chat/streaming-handler.ts +110 -0
  46. package/source/ai-sdk-client/chat/tool-processor.spec.ts +92 -0
  47. package/source/ai-sdk-client/chat/tool-processor.ts +70 -0
  48. package/source/ai-sdk-client/converters/message-converter.spec.ts +220 -0
  49. package/source/ai-sdk-client/converters/message-converter.ts +113 -0
  50. package/source/ai-sdk-client/converters/tool-converter.spec.ts +90 -0
  51. package/source/ai-sdk-client/converters/tool-converter.ts +46 -0
  52. package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +55 -0
  53. package/source/ai-sdk-client/error-handling/error-extractor.ts +15 -0
  54. package/source/ai-sdk-client/error-handling/error-parser.spec.ts +169 -0
  55. package/source/ai-sdk-client/error-handling/error-parser.ts +161 -0
  56. package/source/ai-sdk-client/index.ts +7 -0
  57. package/source/ai-sdk-client/providers/provider-factory.spec.ts +71 -0
  58. package/source/ai-sdk-client/providers/provider-factory.ts +41 -0
  59. package/source/ai-sdk-client/types.ts +9 -0
  60. package/source/ai-sdk-client-empty-message.spec.ts +141 -0
  61. package/source/ai-sdk-client-error-handling.spec.ts +186 -0
  62. package/source/ai-sdk-client-maxretries.spec.ts +114 -0
  63. package/source/ai-sdk-client-preparestep.spec.ts +279 -0
  64. package/source/app/App.spec.tsx +32 -0
  65. package/source/app/App.tsx +480 -0
  66. package/source/app/components/AppContainer.spec.tsx +96 -0
  67. package/source/app/components/AppContainer.tsx +56 -0
  68. package/source/app/components/ChatInterface.spec.tsx +163 -0
  69. package/source/app/components/ChatInterface.tsx +144 -0
  70. package/source/app/components/ModalSelectors.spec.tsx +141 -0
  71. package/source/app/components/ModalSelectors.tsx +135 -0
  72. package/source/app/helpers.spec.ts +97 -0
  73. package/source/app/helpers.ts +63 -0
  74. package/source/app/index.ts +4 -0
  75. package/source/app/types.ts +39 -0
  76. package/source/app/utils/appUtils.ts +294 -0
  77. package/source/app/utils/conversationState.ts +310 -0
  78. package/source/app.spec.tsx +244 -0
  79. package/source/cli.spec.ts +73 -0
  80. package/source/cli.tsx +51 -0
  81. package/source/client-factory.spec.ts +48 -0
  82. package/source/client-factory.ts +178 -0
  83. package/source/command-parser.spec.ts +127 -0
  84. package/source/command-parser.ts +36 -0
  85. package/source/commands/checkpoint.spec.tsx +277 -0
  86. package/source/commands/checkpoint.tsx +366 -0
  87. package/source/commands/clear.tsx +22 -0
  88. package/source/commands/custom-commands.tsx +121 -0
  89. package/source/commands/exit.ts +21 -0
  90. package/source/commands/export.spec.tsx +131 -0
  91. package/source/commands/export.tsx +79 -0
  92. package/source/commands/help.tsx +120 -0
  93. package/source/commands/index.ts +17 -0
  94. package/source/commands/init.tsx +339 -0
  95. package/source/commands/lsp-command.spec.tsx +281 -0
  96. package/source/commands/lsp.tsx +120 -0
  97. package/source/commands/mcp-command.spec.tsx +313 -0
  98. package/source/commands/mcp.tsx +162 -0
  99. package/source/commands/model-database.spec.tsx +758 -0
  100. package/source/commands/model-database.tsx +418 -0
  101. package/source/commands/model.ts +12 -0
  102. package/source/commands/provider.ts +12 -0
  103. package/source/commands/setup-config.tsx +16 -0
  104. package/source/commands/simple-commands.spec.tsx +175 -0
  105. package/source/commands/status.ts +12 -0
  106. package/source/commands/theme.ts +12 -0
  107. package/source/commands/update.spec.tsx +261 -0
  108. package/source/commands/update.tsx +201 -0
  109. package/source/commands/usage.spec.tsx +495 -0
  110. package/source/commands/usage.tsx +100 -0
  111. package/source/commands.spec.ts +436 -0
  112. package/source/commands.ts +83 -0
  113. package/source/components/assistant-message.spec.tsx +796 -0
  114. package/source/components/assistant-message.tsx +34 -0
  115. package/source/components/bash-execution-indicator.tsx +21 -0
  116. package/source/components/cancelling-indicator.tsx +16 -0
  117. package/source/components/chat-queue.spec.tsx +83 -0
  118. package/source/components/chat-queue.tsx +36 -0
  119. package/source/components/checkpoint-display.spec.tsx +219 -0
  120. package/source/components/checkpoint-display.tsx +126 -0
  121. package/source/components/checkpoint-selector.spec.tsx +173 -0
  122. package/source/components/checkpoint-selector.tsx +173 -0
  123. package/source/components/development-mode-indicator.spec.tsx +268 -0
  124. package/source/components/development-mode-indicator.tsx +38 -0
  125. package/source/components/message-box.spec.tsx +427 -0
  126. package/source/components/message-box.tsx +87 -0
  127. package/source/components/model-selector.tsx +132 -0
  128. package/source/components/provider-selector.tsx +75 -0
  129. package/source/components/random-spinner.tsx +19 -0
  130. package/source/components/security-disclaimer.tsx +73 -0
  131. package/source/components/status-connection-display.spec.tsx +133 -0
  132. package/source/components/status.tsx +267 -0
  133. package/source/components/theme-selector.tsx +126 -0
  134. package/source/components/tool-confirmation.tsx +190 -0
  135. package/source/components/tool-execution-indicator.tsx +33 -0
  136. package/source/components/tool-message.tsx +85 -0
  137. package/source/components/ui/titled-box.spec.tsx +207 -0
  138. package/source/components/ui/titled-box.tsx +57 -0
  139. package/source/components/usage/progress-bar.spec.tsx +398 -0
  140. package/source/components/usage/progress-bar.tsx +30 -0
  141. package/source/components/usage/usage-display.spec.tsx +780 -0
  142. package/source/components/usage/usage-display.tsx +291 -0
  143. package/source/components/user-input.spec.tsx +327 -0
  144. package/source/components/user-input.tsx +533 -0
  145. package/source/components/user-message.spec.tsx +230 -0
  146. package/source/components/user-message.tsx +84 -0
  147. package/source/components/welcome-message.tsx +76 -0
  148. package/source/config/env-substitution.ts +65 -0
  149. package/source/config/index.spec.ts +171 -0
  150. package/source/config/index.ts +154 -0
  151. package/source/config/paths.spec.ts +241 -0
  152. package/source/config/paths.ts +55 -0
  153. package/source/config/preferences.ts +51 -0
  154. package/source/config/themes.ts +315 -0
  155. package/source/constants.ts +130 -0
  156. package/source/context/mode-context.spec.ts +79 -0
  157. package/source/context/mode-context.ts +24 -0
  158. package/source/custom-commands/executor.spec.ts +142 -0
  159. package/source/custom-commands/executor.ts +64 -0
  160. package/source/custom-commands/loader.spec.ts +314 -0
  161. package/source/custom-commands/loader.ts +153 -0
  162. package/source/custom-commands/parser.ts +196 -0
  163. package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +39 -0
  164. package/source/hooks/chat-handler/conversation/conversation-loop.tsx +511 -0
  165. package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +50 -0
  166. package/source/hooks/chat-handler/conversation/tool-executor.tsx +109 -0
  167. package/source/hooks/chat-handler/index.ts +12 -0
  168. package/source/hooks/chat-handler/state/streaming-state.spec.ts +26 -0
  169. package/source/hooks/chat-handler/state/streaming-state.ts +19 -0
  170. package/source/hooks/chat-handler/types.ts +38 -0
  171. package/source/hooks/chat-handler/useChatHandler.spec.tsx +321 -0
  172. package/source/hooks/chat-handler/useChatHandler.tsx +194 -0
  173. package/source/hooks/chat-handler/utils/context-checker.spec.ts +60 -0
  174. package/source/hooks/chat-handler/utils/context-checker.tsx +73 -0
  175. package/source/hooks/chat-handler/utils/message-helpers.spec.ts +42 -0
  176. package/source/hooks/chat-handler/utils/message-helpers.tsx +36 -0
  177. package/source/hooks/chat-handler/utils/tool-filters.spec.ts +109 -0
  178. package/source/hooks/chat-handler/utils/tool-filters.ts +64 -0
  179. package/source/hooks/useAppHandlers.tsx +291 -0
  180. package/source/hooks/useAppInitialization.tsx +422 -0
  181. package/source/hooks/useAppState.tsx +311 -0
  182. package/source/hooks/useDirectoryTrust.tsx +98 -0
  183. package/source/hooks/useInputState.ts +414 -0
  184. package/source/hooks/useModeHandlers.tsx +302 -0
  185. package/source/hooks/useNonInteractiveMode.ts +140 -0
  186. package/source/hooks/useTerminalWidth.tsx +81 -0
  187. package/source/hooks/useTheme.ts +18 -0
  188. package/source/hooks/useToolHandler.tsx +349 -0
  189. package/source/hooks/useUIState.ts +61 -0
  190. package/source/init/agents-template-generator.ts +421 -0
  191. package/source/init/existing-rules-extractor.ts +319 -0
  192. package/source/init/file-scanner.spec.ts +227 -0
  193. package/source/init/file-scanner.ts +238 -0
  194. package/source/init/framework-detector.ts +382 -0
  195. package/source/init/language-detector.ts +269 -0
  196. package/source/init/project-analyzer.spec.ts +231 -0
  197. package/source/init/project-analyzer.ts +458 -0
  198. package/source/lsp/index.ts +31 -0
  199. package/source/lsp/lsp-client.spec.ts +508 -0
  200. package/source/lsp/lsp-client.ts +487 -0
  201. package/source/lsp/lsp-manager.spec.ts +477 -0
  202. package/source/lsp/lsp-manager.ts +419 -0
  203. package/source/lsp/protocol.spec.ts +502 -0
  204. package/source/lsp/protocol.ts +360 -0
  205. package/source/lsp/server-discovery.spec.ts +654 -0
  206. package/source/lsp/server-discovery.ts +515 -0
  207. package/source/markdown-parser/html-entities.spec.ts +88 -0
  208. package/source/markdown-parser/html-entities.ts +45 -0
  209. package/source/markdown-parser/index.spec.ts +281 -0
  210. package/source/markdown-parser/index.ts +126 -0
  211. package/source/markdown-parser/table-parser.spec.ts +133 -0
  212. package/source/markdown-parser/table-parser.ts +114 -0
  213. package/source/markdown-parser/utils.spec.ts +70 -0
  214. package/source/markdown-parser/utils.ts +13 -0
  215. package/source/mcp/mcp-client.spec.ts +81 -0
  216. package/source/mcp/mcp-client.ts +625 -0
  217. package/source/mcp/transport-factory.spec.ts +406 -0
  218. package/source/mcp/transport-factory.ts +312 -0
  219. package/source/message-handler.ts +67 -0
  220. package/source/model-database/database-engine.spec.ts +494 -0
  221. package/source/model-database/database-engine.ts +50 -0
  222. package/source/model-database/model-database.spec.ts +363 -0
  223. package/source/model-database/model-database.ts +91 -0
  224. package/source/model-database/model-engine.spec.ts +447 -0
  225. package/source/model-database/model-engine.ts +65 -0
  226. package/source/model-database/model-fetcher.spec.ts +583 -0
  227. package/source/model-database/model-fetcher.ts +330 -0
  228. package/source/models/index.ts +1 -0
  229. package/source/models/models-cache.spec.ts +214 -0
  230. package/source/models/models-cache.ts +78 -0
  231. package/source/models/models-dev-client.spec.ts +379 -0
  232. package/source/models/models-dev-client.ts +329 -0
  233. package/source/models/models-types.ts +68 -0
  234. package/source/prompt-history.ts +155 -0
  235. package/source/security/command-injection.spec.ts +240 -0
  236. package/source/services/checkpoint-manager.spec.ts +523 -0
  237. package/source/services/checkpoint-manager.ts +466 -0
  238. package/source/services/file-snapshot.spec.ts +569 -0
  239. package/source/services/file-snapshot.ts +220 -0
  240. package/source/test-utils/render-with-theme.tsx +48 -0
  241. package/source/tokenization/index.ts +1 -0
  242. package/source/tokenization/tokenizer-factory.spec.ts +170 -0
  243. package/source/tokenization/tokenizer-factory.ts +125 -0
  244. package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +200 -0
  245. package/source/tokenization/tokenizers/anthropic-tokenizer.ts +43 -0
  246. package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +236 -0
  247. package/source/tokenization/tokenizers/fallback-tokenizer.ts +26 -0
  248. package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +224 -0
  249. package/source/tokenization/tokenizers/llama-tokenizer.ts +41 -0
  250. package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +184 -0
  251. package/source/tokenization/tokenizers/openai-tokenizer.ts +57 -0
  252. package/source/tool-calling/index.ts +5 -0
  253. package/source/tool-calling/json-parser.spec.ts +639 -0
  254. package/source/tool-calling/json-parser.ts +247 -0
  255. package/source/tool-calling/tool-parser.spec.ts +395 -0
  256. package/source/tool-calling/tool-parser.ts +120 -0
  257. package/source/tool-calling/xml-parser.spec.ts +662 -0
  258. package/source/tool-calling/xml-parser.ts +289 -0
  259. package/source/tools/execute-bash.spec.tsx +353 -0
  260. package/source/tools/execute-bash.tsx +219 -0
  261. package/source/tools/execute-function.spec.ts +130 -0
  262. package/source/tools/fetch-url.spec.tsx +342 -0
  263. package/source/tools/fetch-url.tsx +172 -0
  264. package/source/tools/find-files.spec.tsx +924 -0
  265. package/source/tools/find-files.tsx +293 -0
  266. package/source/tools/index.ts +102 -0
  267. package/source/tools/lsp-get-diagnostics.tsx +192 -0
  268. package/source/tools/needs-approval.spec.ts +282 -0
  269. package/source/tools/read-file.spec.tsx +801 -0
  270. package/source/tools/read-file.tsx +387 -0
  271. package/source/tools/search-file-contents.spec.tsx +1273 -0
  272. package/source/tools/search-file-contents.tsx +293 -0
  273. package/source/tools/string-replace.spec.tsx +730 -0
  274. package/source/tools/string-replace.tsx +548 -0
  275. package/source/tools/tool-manager.ts +210 -0
  276. package/source/tools/tool-registry.spec.ts +415 -0
  277. package/source/tools/tool-registry.ts +228 -0
  278. package/source/tools/web-search.tsx +223 -0
  279. package/source/tools/write-file.spec.tsx +559 -0
  280. package/source/tools/write-file.tsx +228 -0
  281. package/source/types/app.ts +37 -0
  282. package/source/types/checkpoint.ts +48 -0
  283. package/source/types/commands.ts +46 -0
  284. package/source/types/components.ts +27 -0
  285. package/source/types/config.ts +103 -0
  286. package/source/types/core-connection-status.spec.ts +67 -0
  287. package/source/types/core.ts +181 -0
  288. package/source/types/hooks.ts +50 -0
  289. package/source/types/index.ts +12 -0
  290. package/source/types/markdown-parser.ts +11 -0
  291. package/source/types/mcp.ts +52 -0
  292. package/source/types/system.ts +16 -0
  293. package/source/types/tokenization.ts +41 -0
  294. package/source/types/ui.ts +40 -0
  295. package/source/types/usage.ts +58 -0
  296. package/source/types/utils.ts +16 -0
  297. package/source/usage/calculator.spec.ts +385 -0
  298. package/source/usage/calculator.ts +104 -0
  299. package/source/usage/storage.spec.ts +703 -0
  300. package/source/usage/storage.ts +238 -0
  301. package/source/usage/tracker.spec.ts +456 -0
  302. package/source/usage/tracker.ts +102 -0
  303. package/source/utils/atomic-deletion.spec.ts +194 -0
  304. package/source/utils/atomic-deletion.ts +127 -0
  305. package/source/utils/bounded-map.spec.ts +300 -0
  306. package/source/utils/bounded-map.ts +193 -0
  307. package/source/utils/checkpoint-utils.spec.ts +222 -0
  308. package/source/utils/checkpoint-utils.ts +92 -0
  309. package/source/utils/error-formatter.spec.ts +169 -0
  310. package/source/utils/error-formatter.ts +194 -0
  311. package/source/utils/file-autocomplete.spec.ts +173 -0
  312. package/source/utils/file-autocomplete.ts +196 -0
  313. package/source/utils/file-cache.spec.ts +309 -0
  314. package/source/utils/file-cache.ts +195 -0
  315. package/source/utils/file-content-loader.spec.ts +180 -0
  316. package/source/utils/file-content-loader.ts +179 -0
  317. package/source/utils/file-mention-handler.spec.ts +261 -0
  318. package/source/utils/file-mention-handler.ts +84 -0
  319. package/source/utils/file-mention-parser.spec.ts +182 -0
  320. package/source/utils/file-mention-parser.ts +170 -0
  321. package/source/utils/fuzzy-matching.spec.ts +149 -0
  322. package/source/utils/fuzzy-matching.ts +146 -0
  323. package/source/utils/indentation-normalizer.spec.ts +216 -0
  324. package/source/utils/indentation-normalizer.ts +76 -0
  325. package/source/utils/installation-detector.spec.ts +178 -0
  326. package/source/utils/installation-detector.ts +153 -0
  327. package/source/utils/logging/config.spec.ts +311 -0
  328. package/source/utils/logging/config.ts +210 -0
  329. package/source/utils/logging/console-facade.spec.ts +184 -0
  330. package/source/utils/logging/console-facade.ts +384 -0
  331. package/source/utils/logging/correlation.spec.ts +679 -0
  332. package/source/utils/logging/correlation.ts +474 -0
  333. package/source/utils/logging/formatters.spec.ts +464 -0
  334. package/source/utils/logging/formatters.ts +207 -0
  335. package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +93 -0
  336. package/source/utils/logging/health-monitor/alerts/alert-manager.ts +79 -0
  337. package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +56 -0
  338. package/source/utils/logging/health-monitor/checks/configuration-check.ts +43 -0
  339. package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +56 -0
  340. package/source/utils/logging/health-monitor/checks/logging-check.ts +58 -0
  341. package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +100 -0
  342. package/source/utils/logging/health-monitor/checks/memory-check.ts +78 -0
  343. package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +56 -0
  344. package/source/utils/logging/health-monitor/checks/performance-check.ts +56 -0
  345. package/source/utils/logging/health-monitor/checks/request-check.spec.ts +56 -0
  346. package/source/utils/logging/health-monitor/checks/request-check.ts +76 -0
  347. package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +70 -0
  348. package/source/utils/logging/health-monitor/core/health-check-runner.ts +138 -0
  349. package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +58 -0
  350. package/source/utils/logging/health-monitor/core/health-monitor.ts +344 -0
  351. package/source/utils/logging/health-monitor/core/scoring.spec.ts +65 -0
  352. package/source/utils/logging/health-monitor/core/scoring.ts +91 -0
  353. package/source/utils/logging/health-monitor/index.ts +15 -0
  354. package/source/utils/logging/health-monitor/instances.ts +48 -0
  355. package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +141 -0
  356. package/source/utils/logging/health-monitor/middleware/http-middleware.ts +75 -0
  357. package/source/utils/logging/health-monitor/types.ts +126 -0
  358. package/source/utils/logging/index.spec.ts +284 -0
  359. package/source/utils/logging/index.ts +236 -0
  360. package/source/utils/logging/integration.spec.ts +441 -0
  361. package/source/utils/logging/log-method-factory.spec.ts +573 -0
  362. package/source/utils/logging/log-method-factory.ts +233 -0
  363. package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +277 -0
  364. package/source/utils/logging/log-query/aggregation/aggregator.ts +159 -0
  365. package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +159 -0
  366. package/source/utils/logging/log-query/aggregation/facet-generator.ts +47 -0
  367. package/source/utils/logging/log-query/index.ts +23 -0
  368. package/source/utils/logging/log-query/query/filter-predicates.spec.ts +247 -0
  369. package/source/utils/logging/log-query/query/filter-predicates.ts +154 -0
  370. package/source/utils/logging/log-query/query/query-builder.spec.ts +182 -0
  371. package/source/utils/logging/log-query/query/query-builder.ts +151 -0
  372. package/source/utils/logging/log-query/query/query-engine.spec.ts +214 -0
  373. package/source/utils/logging/log-query/query/query-engine.ts +45 -0
  374. package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +143 -0
  375. package/source/utils/logging/log-query/storage/circular-buffer.ts +75 -0
  376. package/source/utils/logging/log-query/storage/index-manager.spec.ts +150 -0
  377. package/source/utils/logging/log-query/storage/index-manager.ts +71 -0
  378. package/source/utils/logging/log-query/storage/log-storage.spec.ts +257 -0
  379. package/source/utils/logging/log-query/storage/log-storage.ts +80 -0
  380. package/source/utils/logging/log-query/types.ts +163 -0
  381. package/source/utils/logging/log-query/utils/helpers.spec.ts +263 -0
  382. package/source/utils/logging/log-query/utils/helpers.ts +72 -0
  383. package/source/utils/logging/log-query/utils/sorting.spec.ts +182 -0
  384. package/source/utils/logging/log-query/utils/sorting.ts +61 -0
  385. package/source/utils/logging/logger-provider.spec.ts +262 -0
  386. package/source/utils/logging/logger-provider.ts +362 -0
  387. package/source/utils/logging/performance.spec.ts +209 -0
  388. package/source/utils/logging/performance.ts +757 -0
  389. package/source/utils/logging/pino-logger.spec.ts +425 -0
  390. package/source/utils/logging/pino-logger.ts +514 -0
  391. package/source/utils/logging/redaction.spec.ts +490 -0
  392. package/source/utils/logging/redaction.ts +267 -0
  393. package/source/utils/logging/request-tracker.spec.ts +1198 -0
  394. package/source/utils/logging/request-tracker.ts +803 -0
  395. package/source/utils/logging/transports.spec.ts +505 -0
  396. package/source/utils/logging/transports.ts +305 -0
  397. package/source/utils/logging/types.ts +216 -0
  398. package/source/utils/message-builder.spec.ts +179 -0
  399. package/source/utils/message-builder.ts +101 -0
  400. package/source/utils/message-queue.tsx +486 -0
  401. package/source/utils/paste-detection.spec.ts +69 -0
  402. package/source/utils/paste-detection.ts +124 -0
  403. package/source/utils/paste-roundtrip.spec.ts +442 -0
  404. package/source/utils/paste-utils.spec.ts +128 -0
  405. package/source/utils/paste-utils.ts +52 -0
  406. package/source/utils/programming-language-helper.spec.ts +74 -0
  407. package/source/utils/programming-language-helper.ts +32 -0
  408. package/source/utils/prompt-assembly.spec.ts +221 -0
  409. package/source/utils/prompt-processor.ts +173 -0
  410. package/source/utils/tool-args-parser.spec.ts +136 -0
  411. package/source/utils/tool-args-parser.ts +54 -0
  412. package/source/utils/tool-cancellation.spec.ts +230 -0
  413. package/source/utils/tool-cancellation.ts +28 -0
  414. package/source/utils/tool-result-display.spec.tsx +469 -0
  415. package/source/utils/tool-result-display.tsx +90 -0
  416. package/source/utils/update-checker.spec.ts +383 -0
  417. package/source/utils/update-checker.ts +183 -0
  418. package/source/wizard/config-wizard.spec.tsx +103 -0
  419. package/source/wizard/config-wizard.tsx +382 -0
  420. package/source/wizard/steps/location-step.spec.tsx +186 -0
  421. package/source/wizard/steps/location-step.tsx +147 -0
  422. package/source/wizard/steps/mcp-step.spec.tsx +607 -0
  423. package/source/wizard/steps/mcp-step.tsx +632 -0
  424. package/source/wizard/steps/provider-step.spec.tsx +342 -0
  425. package/source/wizard/steps/provider-step.tsx +957 -0
  426. package/source/wizard/steps/summary-step.spec.tsx +749 -0
  427. package/source/wizard/steps/summary-step.tsx +228 -0
  428. package/source/wizard/templates/mcp-templates.spec.ts +613 -0
  429. package/source/wizard/templates/mcp-templates.ts +570 -0
  430. package/source/wizard/templates/provider-templates.spec.ts +152 -0
  431. package/source/wizard/templates/provider-templates.ts +485 -0
  432. package/source/wizard/utils/fetch-cloud-models.spec.ts +428 -0
  433. package/source/wizard/utils/fetch-cloud-models.ts +223 -0
  434. package/source/wizard/utils/fetch-local-models.spec.ts +297 -0
  435. package/source/wizard/utils/fetch-local-models.ts +192 -0
  436. package/source/wizard/validation-array.spec.ts +264 -0
  437. package/source/wizard/validation.spec.ts +373 -0
  438. package/source/wizard/validation.ts +232 -0
  439. package/source/app/prompts/main-prompt.md +0 -122
@@ -0,0 +1,344 @@
1
+ /**
2
+ * Main health monitoring class
3
+ */
4
+
5
+ import {loadavg} from 'os';
6
+ import {
7
+ COOLDOWN_ALERT_MS,
8
+ DURATION_AVERAGE_CRITICAL_MS,
9
+ DURATION_AVERAGE_WARNING_MS,
10
+ DURATION_REQUEST_CRITICAL_MS,
11
+ DURATION_REQUEST_WARNING_MS,
12
+ HEAP_USAGE_CRITICAL_THRESHOLD,
13
+ HEAP_USAGE_WARNING_THRESHOLD,
14
+ INTERVAL_HEALTH_CHECK_MS,
15
+ TIMEOUT_HEALTH_CHECK_MS,
16
+ } from '@/constants';
17
+ import {generateCorrelationId} from '../../correlation.js';
18
+ import {globalLogStorage} from '../../log-query/index.js';
19
+ import {loggerProvider} from '../../logger-provider.js';
20
+ import {globalPerformanceMonitor} from '../../performance.js';
21
+ import {globalRequestTracker} from '../../request-tracker.js';
22
+
23
+ const getLogger = () => loggerProvider.getLogger();
24
+ import {sendAlert} from '../alerts/alert-manager.js';
25
+ import type {
26
+ HealthCheckConfig,
27
+ HealthCheckResult,
28
+ SystemMetrics,
29
+ } from '../types.js';
30
+ import {runHealthCheck} from './health-check-runner.js';
31
+
32
+ // Get logger instance directly to avoid circular dependencies
33
+ const logger = getLogger();
34
+
35
+ /**
36
+ * Health monitoring system
37
+ */
38
+ export class HealthMonitor {
39
+ private config: HealthCheckConfig;
40
+ private isRunning: boolean = false;
41
+ private intervalId?: NodeJS.Timeout;
42
+ private lastCheck?: HealthCheckResult;
43
+ private lastAlert?: number;
44
+ private correlationId: string;
45
+
46
+ constructor(config?: Partial<HealthCheckConfig>) {
47
+ this.correlationId = generateCorrelationId();
48
+ this.config = {
49
+ enabled: true,
50
+ interval: INTERVAL_HEALTH_CHECK_MS,
51
+ timeout: TIMEOUT_HEALTH_CHECK_MS,
52
+ thresholds: {
53
+ memory: {
54
+ heapUsageWarning: HEAP_USAGE_WARNING_THRESHOLD,
55
+ heapUsageCritical: HEAP_USAGE_CRITICAL_THRESHOLD,
56
+ externalWarning: 256,
57
+ externalCritical: 512,
58
+ },
59
+ performance: {
60
+ averageDurationWarning: DURATION_AVERAGE_WARNING_MS,
61
+ averageDurationCritical: DURATION_AVERAGE_CRITICAL_MS,
62
+ errorRateWarning: 0.05,
63
+ errorRateCritical: 0.1,
64
+ },
65
+ logging: {
66
+ logRateWarning: 100,
67
+ logRateCritical: 500,
68
+ errorRateWarning: 0.02,
69
+ errorRateCritical: 0.05,
70
+ },
71
+ requests: {
72
+ durationWarning: DURATION_REQUEST_WARNING_MS,
73
+ durationCritical: DURATION_REQUEST_CRITICAL_MS,
74
+ errorRateWarning: 0.05,
75
+ errorRateCritical: 0.1,
76
+ },
77
+ },
78
+ alerts: {
79
+ enabled: true,
80
+ channels: ['console'],
81
+ cooldown: COOLDOWN_ALERT_MS,
82
+ },
83
+ ...config,
84
+ };
85
+ }
86
+
87
+ /**
88
+ * Start health monitoring
89
+ */
90
+ start(): void {
91
+ try {
92
+ if (this.isRunning) {
93
+ logger.warn('Health monitoring already running', {
94
+ correlationId: this.correlationId,
95
+ source: 'health-monitor',
96
+ });
97
+ return;
98
+ }
99
+
100
+ this.isRunning = true;
101
+
102
+ // Run initial check
103
+ try {
104
+ void this.runHealthCheck();
105
+ } catch (error) {
106
+ logger.error('Failed to run initial health check', {
107
+ error: error instanceof Error ? error.message : error,
108
+ correlationId: this.correlationId,
109
+ source: 'health-monitor',
110
+ });
111
+ // Continue starting monitoring even if initial check fails
112
+ }
113
+
114
+ // Schedule regular checks
115
+ try {
116
+ this.intervalId = setInterval(() => {
117
+ try {
118
+ void this.runHealthCheck();
119
+ } catch (error) {
120
+ logger.error('Failed to run scheduled health check', {
121
+ error: error instanceof Error ? error.message : error,
122
+ correlationId: this.correlationId,
123
+ source: 'health-monitor',
124
+ });
125
+ }
126
+ }, this.config.interval);
127
+ } catch (error) {
128
+ logger.error('Failed to schedule health monitoring', {
129
+ error: error instanceof Error ? error.message : error,
130
+ correlationId: this.correlationId,
131
+ source: 'health-monitor',
132
+ });
133
+ this.isRunning = false;
134
+ return;
135
+ }
136
+
137
+ logger.info('Health monitoring started', {
138
+ interval: `${this.config.interval}ms`,
139
+ timeout: `${this.config.timeout}ms`,
140
+ correlationId: this.correlationId,
141
+ source: 'health-monitor',
142
+ });
143
+ } catch (error) {
144
+ logger.error('Critical error starting health monitoring', {
145
+ error: error instanceof Error ? error.message : error,
146
+ correlationId: this.correlationId,
147
+ source: 'health-monitor',
148
+ });
149
+ this.isRunning = false;
150
+ }
151
+ }
152
+
153
+ /**
154
+ * Stop health monitoring
155
+ */
156
+ stop(): void {
157
+ try {
158
+ if (!this.isRunning) {
159
+ logger.debug('Health monitoring not running', {
160
+ correlationId: this.correlationId,
161
+ source: 'health-monitor',
162
+ });
163
+ return;
164
+ }
165
+
166
+ this.isRunning = false;
167
+
168
+ try {
169
+ if (this.intervalId) {
170
+ clearInterval(this.intervalId);
171
+ this.intervalId = undefined;
172
+ }
173
+ } catch (error) {
174
+ logger.error('Failed to clear health monitoring interval', {
175
+ error: error instanceof Error ? error.message : error,
176
+ correlationId: this.correlationId,
177
+ source: 'health-monitor',
178
+ });
179
+ // Continue with cleanup even if interval clearing fails
180
+ }
181
+
182
+ logger.info('Health monitoring stopped', {
183
+ correlationId: this.correlationId,
184
+ source: 'health-monitor',
185
+ });
186
+ } catch (error) {
187
+ logger.error('Critical error stopping health monitoring', {
188
+ error: error instanceof Error ? error.message : error,
189
+ correlationId: this.correlationId,
190
+ source: 'health-monitor',
191
+ });
192
+ // Ensure we don't leave the system in a bad state
193
+ this.isRunning = false;
194
+ if (this.intervalId) {
195
+ try {
196
+ clearInterval(this.intervalId);
197
+ this.intervalId = undefined;
198
+ } catch (cleanupError) {
199
+ // Final fallback - log but don't rethrow
200
+ logger.error(
201
+ 'Failed to cleanup health monitoring interval during error recovery',
202
+ {
203
+ error:
204
+ cleanupError instanceof Error
205
+ ? cleanupError.message
206
+ : cleanupError,
207
+ correlationId: this.correlationId,
208
+ source: 'health-monitor',
209
+ },
210
+ );
211
+ }
212
+ }
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Run a comprehensive health check
218
+ */
219
+ async runHealthCheck(): Promise<HealthCheckResult> {
220
+ const result = await runHealthCheck(this.config, this.correlationId);
221
+ this.lastCheck = result;
222
+
223
+ // Check if alerts should be sent
224
+ if (
225
+ this.config.alerts.enabled &&
226
+ (result.status === 'unhealthy' || result.status === 'degraded')
227
+ ) {
228
+ await sendAlert(result, this.config, this.lastAlert, this.correlationId);
229
+ this.lastAlert = Date.now();
230
+ }
231
+
232
+ return result;
233
+ }
234
+
235
+ /**
236
+ * Get current system metrics
237
+ */
238
+ getSystemMetrics(): SystemMetrics {
239
+ const _now = Date.now();
240
+ const memory = process.memoryUsage();
241
+ const cpuUsage = process.cpuUsage();
242
+ const requestStats = globalRequestTracker.getStats();
243
+ const logStats = globalLogStorage.getEntryCount();
244
+ const perfStats = globalPerformanceMonitor.getAllStats();
245
+
246
+ // Calculate rates (approximate based on current state)
247
+ const logRate = logStats / (process.uptime() / 60); // logs per minute
248
+ const errorRate = requestStats.errorRate;
249
+ const requestsPerSecond = requestStats.totalRequests / process.uptime();
250
+
251
+ // Calculate average operation duration from performance stats
252
+ const allPerfStats = Object.values(perfStats).filter(Boolean);
253
+ const averageDuration =
254
+ allPerfStats.length > 0
255
+ ? allPerfStats.reduce(
256
+ (sum, stat) => sum + (stat?.avgDuration || 0),
257
+ 0,
258
+ ) / allPerfStats.length
259
+ : 0;
260
+
261
+ return {
262
+ timestamp: new Date().toISOString(),
263
+ memory: {
264
+ heapUsed: memory.heapUsed,
265
+ heapTotal: memory.heapTotal,
266
+ external: memory.external,
267
+ rss: memory.rss,
268
+ heapUsagePercent: memory.heapUsed / memory.heapTotal,
269
+ },
270
+ cpu: {
271
+ usage: (cpuUsage.user + cpuUsage.system) / 1000000, // Convert to milliseconds
272
+ loadAverage: loadavg(),
273
+ },
274
+ process: {
275
+ uptime: process.uptime(),
276
+ pid: process.pid,
277
+ nodeVersion: process.version,
278
+ platform: process.platform,
279
+ arch: process.arch,
280
+ },
281
+ logging: {
282
+ totalLogEntries: logStats,
283
+ logRate,
284
+ errorRate,
285
+ averageLogSize: 256, // Estimated
286
+ },
287
+ requests: {
288
+ totalRequests: requestStats.totalRequests,
289
+ activeRequests: globalRequestTracker.getActiveRequests().length,
290
+ averageDuration: requestStats.averageDuration,
291
+ errorRate: requestStats.errorRate,
292
+ requestsPerSecond,
293
+ },
294
+ performance: {
295
+ operationCount: allPerfStats.reduce(
296
+ (sum, stat) => sum + (stat?.count || 0),
297
+ 0,
298
+ ),
299
+ averageDuration,
300
+ slowOperations: 0, // Would need tracking over time
301
+ memoryIntensiveOps: 0, // Would need tracking over time
302
+ },
303
+ };
304
+ }
305
+
306
+ /**
307
+ * Get last health check result
308
+ */
309
+ getLastHealthCheck(): HealthCheckResult | undefined {
310
+ return this.lastCheck;
311
+ }
312
+
313
+ /**
314
+ * Check if monitoring is running
315
+ */
316
+ isActive(): boolean {
317
+ return this.isRunning;
318
+ }
319
+
320
+ /**
321
+ * Update health check configuration
322
+ */
323
+ updateConfig(config: Partial<HealthCheckConfig>): void {
324
+ this.config = {...this.config, ...config};
325
+
326
+ logger.info('Health monitor configuration updated', {
327
+ enabled: this.config.enabled,
328
+ interval: `${this.config.interval}ms`,
329
+ correlationId: this.correlationId,
330
+ source: 'health-monitor',
331
+ });
332
+
333
+ // Restart monitoring if running
334
+ if (this.isRunning) {
335
+ this.stop();
336
+ this.start();
337
+ }
338
+ }
339
+ }
340
+
341
+ /**
342
+ * Global health monitor instance
343
+ */
344
+ export const globalHealthMonitor = new HealthMonitor();
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Scoring tests
3
+ */
4
+
5
+ import test from 'ava';
6
+ import type {HealthCheck} from '../types.js';
7
+ import {calculateScore, generateRecommendations} from './scoring.js';
8
+
9
+ test('calculateScore returns 0 for fail status', t => {
10
+ const score = calculateScore('fail', 0, 0.5, 0.8);
11
+ t.is(score, 0);
12
+ });
13
+
14
+ test('calculateScore returns 100 for pass status', t => {
15
+ const score = calculateScore('pass', 0, 0.5, 0.8);
16
+ t.is(score, 100);
17
+ });
18
+
19
+ test('calculateScore returns value between 50-80 for warn status', t => {
20
+ const score = calculateScore('warn', 0.6, 0.5, 0.8);
21
+ t.true(score >= 50 && score <= 80);
22
+ });
23
+
24
+ test('generateRecommendations returns array for healthy status', t => {
25
+ const checks: HealthCheck[] = [
26
+ {
27
+ name: 'memory-usage',
28
+ status: 'pass',
29
+ score: 100,
30
+ duration: 10,
31
+ },
32
+ ];
33
+ const recommendations = generateRecommendations(checks, 'healthy');
34
+ t.true(Array.isArray(recommendations));
35
+ });
36
+
37
+ test('generateRecommendations includes critical message for unhealthy status', t => {
38
+ const checks: HealthCheck[] = [
39
+ {
40
+ name: 'memory-usage',
41
+ status: 'fail',
42
+ score: 0,
43
+ duration: 10,
44
+ },
45
+ ];
46
+ const recommendations = generateRecommendations(checks, 'unhealthy');
47
+ t.true(recommendations.length > 0);
48
+ t.true(
49
+ recommendations.some(r => r.includes('critical') || r.includes('unhealthy')),
50
+ );
51
+ });
52
+
53
+ test('generateRecommendations includes degraded message for degraded status', t => {
54
+ const checks: HealthCheck[] = [
55
+ {
56
+ name: 'memory-usage',
57
+ status: 'warn',
58
+ score: 60,
59
+ duration: 10,
60
+ },
61
+ ];
62
+ const recommendations = generateRecommendations(checks, 'degraded');
63
+ t.true(recommendations.length > 0);
64
+ t.true(recommendations.some(r => r.includes('degraded')));
65
+ });
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Health scoring and recommendation logic
3
+ */
4
+
5
+ import type {HealthCheck} from '../types.js';
6
+
7
+ /**
8
+ * Calculate score based on status and value
9
+ */
10
+ export function calculateScore(
11
+ status: 'pass' | 'fail' | 'warn',
12
+ value: number,
13
+ warningThreshold: number,
14
+ criticalThreshold: number,
15
+ ): number {
16
+ if (status === 'fail') return 0;
17
+ if (status === 'pass') return 100;
18
+ if (status === 'warn') {
19
+ // Calculate score based on how far from critical threshold
20
+ const range = criticalThreshold - warningThreshold;
21
+ const distance = criticalThreshold - value;
22
+ return Math.max(50, Math.min(80, 50 + (distance / range) * 30));
23
+ }
24
+ return 50; // default for unknown status
25
+ }
26
+
27
+ /**
28
+ * Generate recommendations based on check results
29
+ */
30
+ export function generateRecommendations(
31
+ checks: HealthCheck[],
32
+ status: 'healthy' | 'degraded' | 'unhealthy',
33
+ ): string[] {
34
+ const recommendations: string[] = [];
35
+
36
+ for (const check of checks) {
37
+ switch (check.name) {
38
+ case 'memory-usage':
39
+ if (check.status === 'fail') {
40
+ recommendations.push(
41
+ 'Immediate memory optimization required - consider increasing memory limits or fixing memory leaks',
42
+ );
43
+ } else if (check.status === 'warn') {
44
+ recommendations.push(
45
+ 'Monitor memory usage and optimize memory-intensive operations',
46
+ );
47
+ }
48
+ break;
49
+
50
+ case 'logging-system':
51
+ if (check.status === 'fail') {
52
+ recommendations.push(
53
+ 'Fix logging system initialization - check logger configuration',
54
+ );
55
+ }
56
+ break;
57
+
58
+ case 'request-tracking':
59
+ if (check.status === 'fail') {
60
+ recommendations.push(
61
+ 'Address high request error rates or slow request processing',
62
+ );
63
+ } else if (check.status === 'warn') {
64
+ recommendations.push(
65
+ 'Monitor request performance and optimize slow endpoints',
66
+ );
67
+ }
68
+ break;
69
+
70
+ case 'performance-monitoring':
71
+ if (check.status === 'warn') {
72
+ recommendations.push(
73
+ 'Ensure performance monitoring is integrated into critical operations',
74
+ );
75
+ }
76
+ break;
77
+ }
78
+ }
79
+
80
+ if (status === 'unhealthy') {
81
+ recommendations.push(
82
+ 'System health is critical - immediate attention required',
83
+ );
84
+ } else if (status === 'degraded') {
85
+ recommendations.push(
86
+ 'System performance is degraded - review recommendations and optimize',
87
+ );
88
+ }
89
+
90
+ return recommendations;
91
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Health monitoring system
3
+ * Provides comprehensive health metrics and monitoring capabilities
4
+ */
5
+
6
+ // Re-export types
7
+ export type {
8
+ HealthCheck,
9
+ HealthCheckConfig,
10
+ HealthCheckResult,
11
+ SystemMetrics,
12
+ } from './types.js';
13
+
14
+ // Re-export the only public API - healthChecks helper functions
15
+ export {healthChecks} from './instances.js';
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Global instances for health monitoring
3
+ */
4
+
5
+ import {globalHealthMonitor} from './core/health-monitor.js';
6
+
7
+ /**
8
+ * Quick health check functions
9
+ */
10
+ export const healthChecks = {
11
+ /**
12
+ * Quick health check - returns status only
13
+ */
14
+ quick: async (): Promise<'healthy' | 'degraded' | 'unhealthy'> => {
15
+ const result = await globalHealthMonitor.runHealthCheck();
16
+ return result.status;
17
+ },
18
+
19
+ /**
20
+ * Full health check with details
21
+ */
22
+ full: () => globalHealthMonitor.runHealthCheck(),
23
+
24
+ /**
25
+ * System metrics snapshot
26
+ */
27
+ metrics: () => globalHealthMonitor.getSystemMetrics(),
28
+
29
+ /**
30
+ * Check if system is ready
31
+ */
32
+ ready: async (): Promise<boolean> => {
33
+ const result = await globalHealthMonitor.runHealthCheck();
34
+ return result.status === 'healthy';
35
+ },
36
+
37
+ /**
38
+ * Check if system is alive (basic check)
39
+ */
40
+ alive: (): boolean => {
41
+ try {
42
+ const metrics = globalHealthMonitor.getSystemMetrics();
43
+ return metrics.process.uptime > 0;
44
+ } catch {
45
+ return false;
46
+ }
47
+ },
48
+ };
@@ -0,0 +1,141 @@
1
+ /**
2
+ * HTTP middleware tests
3
+ */
4
+
5
+ import test from 'ava';
6
+ import {healthCheckMiddleware} from './http-middleware.js';
7
+
8
+ const createMockHealthChecks = () => ({
9
+ full: async () => ({
10
+ status: 'healthy' as const,
11
+ timestamp: new Date().toISOString(),
12
+ score: 100,
13
+ checks: [
14
+ {
15
+ name: 'test-check',
16
+ status: 'pass' as const,
17
+ score: 100,
18
+ },
19
+ ],
20
+ }),
21
+ ready: async () => true,
22
+ alive: () => true,
23
+ metrics: () => ({test: 'metrics'}),
24
+ });
25
+
26
+ test('healthCheckMiddleware calls next for non-health paths', async t => {
27
+ const middleware = healthCheckMiddleware(createMockHealthChecks());
28
+ let nextCalled = false;
29
+
30
+ const req = {path: '/api/test'};
31
+ const res = {
32
+ status: (code: number) => ({
33
+ json: (_data: unknown) => {},
34
+ }),
35
+ json: (_data: unknown) => {},
36
+ };
37
+ const next = () => {
38
+ nextCalled = true;
39
+ };
40
+
41
+ await middleware(req, res, next);
42
+ t.true(nextCalled);
43
+ });
44
+
45
+ test('healthCheckMiddleware handles /health path', async t => {
46
+ const middleware = healthCheckMiddleware(createMockHealthChecks());
47
+ let responseSent = false;
48
+ let statusCode = 0;
49
+
50
+ const req = {path: '/health'};
51
+ const res = {
52
+ status: (code: number) => {
53
+ statusCode = code;
54
+ return {
55
+ json: (_data: unknown) => {
56
+ responseSent = true;
57
+ },
58
+ };
59
+ },
60
+ json: (_data: unknown) => {
61
+ responseSent = true;
62
+ },
63
+ };
64
+ const next = () => {};
65
+
66
+ await middleware(req, res, next);
67
+ t.true(responseSent);
68
+ t.is(statusCode, 200);
69
+ });
70
+
71
+ test('healthCheckMiddleware handles /health/ready path', async t => {
72
+ const middleware = healthCheckMiddleware(createMockHealthChecks());
73
+ let responseSent = false;
74
+ let statusCode = 0;
75
+
76
+ const req = {path: '/health/ready'};
77
+ const res = {
78
+ status: (code: number) => {
79
+ statusCode = code;
80
+ return {
81
+ json: (_data: unknown) => {
82
+ responseSent = true;
83
+ },
84
+ };
85
+ },
86
+ json: (_data: unknown) => {
87
+ responseSent = true;
88
+ },
89
+ };
90
+ const next = () => {};
91
+
92
+ await middleware(req, res, next);
93
+ t.true(responseSent);
94
+ t.is(statusCode, 200);
95
+ });
96
+
97
+ test('healthCheckMiddleware handles /health/live path', async t => {
98
+ const middleware = healthCheckMiddleware(createMockHealthChecks());
99
+ let responseSent = false;
100
+
101
+ const req = {path: '/health/live'};
102
+ const res = {
103
+ status: (_code: number) => {
104
+ return {
105
+ json: (_data: unknown) => {
106
+ responseSent = true;
107
+ },
108
+ };
109
+ },
110
+ json: (_data: unknown) => {
111
+ responseSent = true;
112
+ },
113
+ };
114
+ const next = () => {};
115
+
116
+ await middleware(req, res, next);
117
+ t.true(responseSent);
118
+ });
119
+
120
+ test('healthCheckMiddleware handles /metrics path', async t => {
121
+ const middleware = healthCheckMiddleware(createMockHealthChecks());
122
+ let responseSent = false;
123
+
124
+ const req = {path: '/metrics'};
125
+ const res = {
126
+ status: (_code: number) => {
127
+ return {
128
+ json: (_data: unknown) => {
129
+ responseSent = true;
130
+ },
131
+ };
132
+ },
133
+ json: (_data: unknown) => {
134
+ responseSent = true;
135
+ },
136
+ };
137
+ const next = () => {};
138
+
139
+ await middleware(req, res, next);
140
+ t.true(responseSent);
141
+ });