@gguf/coder 0.3.0 → 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 (414) 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/package.json +2 -14
  10. package/scripts/extract-changelog.js +73 -0
  11. package/scripts/fetch-models.js +143 -0
  12. package/scripts/test.sh +40 -0
  13. package/scripts/update-homebrew-formula.sh +125 -0
  14. package/scripts/update-nix-version.sh +157 -0
  15. package/source/ai-sdk-client/AISDKClient.spec.ts +117 -0
  16. package/source/ai-sdk-client/AISDKClient.ts +155 -0
  17. package/source/ai-sdk-client/chat/chat-handler.spec.ts +121 -0
  18. package/source/ai-sdk-client/chat/chat-handler.ts +276 -0
  19. package/source/ai-sdk-client/chat/streaming-handler.spec.ts +173 -0
  20. package/source/ai-sdk-client/chat/streaming-handler.ts +110 -0
  21. package/source/ai-sdk-client/chat/tool-processor.spec.ts +92 -0
  22. package/source/ai-sdk-client/chat/tool-processor.ts +70 -0
  23. package/source/ai-sdk-client/converters/message-converter.spec.ts +220 -0
  24. package/source/ai-sdk-client/converters/message-converter.ts +113 -0
  25. package/source/ai-sdk-client/converters/tool-converter.spec.ts +90 -0
  26. package/source/ai-sdk-client/converters/tool-converter.ts +46 -0
  27. package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +55 -0
  28. package/source/ai-sdk-client/error-handling/error-extractor.ts +15 -0
  29. package/source/ai-sdk-client/error-handling/error-parser.spec.ts +169 -0
  30. package/source/ai-sdk-client/error-handling/error-parser.ts +161 -0
  31. package/source/ai-sdk-client/index.ts +7 -0
  32. package/source/ai-sdk-client/providers/provider-factory.spec.ts +71 -0
  33. package/source/ai-sdk-client/providers/provider-factory.ts +41 -0
  34. package/source/ai-sdk-client/types.ts +9 -0
  35. package/source/ai-sdk-client-empty-message.spec.ts +141 -0
  36. package/source/ai-sdk-client-error-handling.spec.ts +186 -0
  37. package/source/ai-sdk-client-maxretries.spec.ts +114 -0
  38. package/source/ai-sdk-client-preparestep.spec.ts +279 -0
  39. package/source/app/App.spec.tsx +32 -0
  40. package/source/app/App.tsx +480 -0
  41. package/source/app/components/AppContainer.spec.tsx +96 -0
  42. package/source/app/components/AppContainer.tsx +56 -0
  43. package/source/app/components/ChatInterface.spec.tsx +163 -0
  44. package/source/app/components/ChatInterface.tsx +144 -0
  45. package/source/app/components/ModalSelectors.spec.tsx +141 -0
  46. package/source/app/components/ModalSelectors.tsx +135 -0
  47. package/source/app/helpers.spec.ts +97 -0
  48. package/source/app/helpers.ts +63 -0
  49. package/source/app/index.ts +4 -0
  50. package/source/app/types.ts +39 -0
  51. package/source/app/utils/appUtils.ts +294 -0
  52. package/source/app/utils/conversationState.ts +310 -0
  53. package/source/app.spec.tsx +244 -0
  54. package/source/cli.spec.ts +73 -0
  55. package/source/cli.tsx +51 -0
  56. package/source/client-factory.spec.ts +48 -0
  57. package/source/client-factory.ts +178 -0
  58. package/source/command-parser.spec.ts +127 -0
  59. package/source/command-parser.ts +36 -0
  60. package/source/commands/checkpoint.spec.tsx +277 -0
  61. package/source/commands/checkpoint.tsx +366 -0
  62. package/source/commands/clear.tsx +22 -0
  63. package/source/commands/custom-commands.tsx +121 -0
  64. package/source/commands/exit.ts +21 -0
  65. package/source/commands/export.spec.tsx +131 -0
  66. package/source/commands/export.tsx +79 -0
  67. package/source/commands/help.tsx +120 -0
  68. package/source/commands/index.ts +17 -0
  69. package/source/commands/init.tsx +339 -0
  70. package/source/commands/lsp-command.spec.tsx +281 -0
  71. package/source/commands/lsp.tsx +120 -0
  72. package/source/commands/mcp-command.spec.tsx +313 -0
  73. package/source/commands/mcp.tsx +162 -0
  74. package/source/commands/model-database.spec.tsx +758 -0
  75. package/source/commands/model-database.tsx +418 -0
  76. package/source/commands/model.ts +12 -0
  77. package/source/commands/provider.ts +12 -0
  78. package/source/commands/setup-config.tsx +16 -0
  79. package/source/commands/simple-commands.spec.tsx +175 -0
  80. package/source/commands/status.ts +12 -0
  81. package/source/commands/theme.ts +12 -0
  82. package/source/commands/update.spec.tsx +261 -0
  83. package/source/commands/update.tsx +201 -0
  84. package/source/commands/usage.spec.tsx +495 -0
  85. package/source/commands/usage.tsx +100 -0
  86. package/source/commands.spec.ts +436 -0
  87. package/source/commands.ts +83 -0
  88. package/source/components/assistant-message.spec.tsx +796 -0
  89. package/source/components/assistant-message.tsx +34 -0
  90. package/source/components/bash-execution-indicator.tsx +21 -0
  91. package/source/components/cancelling-indicator.tsx +16 -0
  92. package/source/components/chat-queue.spec.tsx +83 -0
  93. package/source/components/chat-queue.tsx +36 -0
  94. package/source/components/checkpoint-display.spec.tsx +219 -0
  95. package/source/components/checkpoint-display.tsx +126 -0
  96. package/source/components/checkpoint-selector.spec.tsx +173 -0
  97. package/source/components/checkpoint-selector.tsx +173 -0
  98. package/source/components/development-mode-indicator.spec.tsx +268 -0
  99. package/source/components/development-mode-indicator.tsx +38 -0
  100. package/source/components/message-box.spec.tsx +427 -0
  101. package/source/components/message-box.tsx +87 -0
  102. package/source/components/model-selector.tsx +132 -0
  103. package/source/components/provider-selector.tsx +75 -0
  104. package/source/components/random-spinner.tsx +19 -0
  105. package/source/components/security-disclaimer.tsx +73 -0
  106. package/source/components/status-connection-display.spec.tsx +133 -0
  107. package/source/components/status.tsx +267 -0
  108. package/source/components/theme-selector.tsx +126 -0
  109. package/source/components/tool-confirmation.tsx +190 -0
  110. package/source/components/tool-execution-indicator.tsx +33 -0
  111. package/source/components/tool-message.tsx +85 -0
  112. package/source/components/ui/titled-box.spec.tsx +207 -0
  113. package/source/components/ui/titled-box.tsx +57 -0
  114. package/source/components/usage/progress-bar.spec.tsx +398 -0
  115. package/source/components/usage/progress-bar.tsx +30 -0
  116. package/source/components/usage/usage-display.spec.tsx +780 -0
  117. package/source/components/usage/usage-display.tsx +291 -0
  118. package/source/components/user-input.spec.tsx +327 -0
  119. package/source/components/user-input.tsx +533 -0
  120. package/source/components/user-message.spec.tsx +230 -0
  121. package/source/components/user-message.tsx +84 -0
  122. package/source/components/welcome-message.tsx +76 -0
  123. package/source/config/env-substitution.ts +65 -0
  124. package/source/config/index.spec.ts +171 -0
  125. package/source/config/index.ts +154 -0
  126. package/source/config/paths.spec.ts +241 -0
  127. package/source/config/paths.ts +55 -0
  128. package/source/config/preferences.ts +51 -0
  129. package/source/config/themes.ts +315 -0
  130. package/source/constants.ts +130 -0
  131. package/source/context/mode-context.spec.ts +79 -0
  132. package/source/context/mode-context.ts +24 -0
  133. package/source/custom-commands/executor.spec.ts +142 -0
  134. package/source/custom-commands/executor.ts +64 -0
  135. package/source/custom-commands/loader.spec.ts +314 -0
  136. package/source/custom-commands/loader.ts +153 -0
  137. package/source/custom-commands/parser.ts +196 -0
  138. package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +39 -0
  139. package/source/hooks/chat-handler/conversation/conversation-loop.tsx +511 -0
  140. package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +50 -0
  141. package/source/hooks/chat-handler/conversation/tool-executor.tsx +109 -0
  142. package/source/hooks/chat-handler/index.ts +12 -0
  143. package/source/hooks/chat-handler/state/streaming-state.spec.ts +26 -0
  144. package/source/hooks/chat-handler/state/streaming-state.ts +19 -0
  145. package/source/hooks/chat-handler/types.ts +38 -0
  146. package/source/hooks/chat-handler/useChatHandler.spec.tsx +321 -0
  147. package/source/hooks/chat-handler/useChatHandler.tsx +194 -0
  148. package/source/hooks/chat-handler/utils/context-checker.spec.ts +60 -0
  149. package/source/hooks/chat-handler/utils/context-checker.tsx +73 -0
  150. package/source/hooks/chat-handler/utils/message-helpers.spec.ts +42 -0
  151. package/source/hooks/chat-handler/utils/message-helpers.tsx +36 -0
  152. package/source/hooks/chat-handler/utils/tool-filters.spec.ts +109 -0
  153. package/source/hooks/chat-handler/utils/tool-filters.ts +64 -0
  154. package/source/hooks/useAppHandlers.tsx +291 -0
  155. package/source/hooks/useAppInitialization.tsx +422 -0
  156. package/source/hooks/useAppState.tsx +311 -0
  157. package/source/hooks/useDirectoryTrust.tsx +98 -0
  158. package/source/hooks/useInputState.ts +414 -0
  159. package/source/hooks/useModeHandlers.tsx +302 -0
  160. package/source/hooks/useNonInteractiveMode.ts +140 -0
  161. package/source/hooks/useTerminalWidth.tsx +81 -0
  162. package/source/hooks/useTheme.ts +18 -0
  163. package/source/hooks/useToolHandler.tsx +349 -0
  164. package/source/hooks/useUIState.ts +61 -0
  165. package/source/init/agents-template-generator.ts +421 -0
  166. package/source/init/existing-rules-extractor.ts +319 -0
  167. package/source/init/file-scanner.spec.ts +227 -0
  168. package/source/init/file-scanner.ts +238 -0
  169. package/source/init/framework-detector.ts +382 -0
  170. package/source/init/language-detector.ts +269 -0
  171. package/source/init/project-analyzer.spec.ts +231 -0
  172. package/source/init/project-analyzer.ts +458 -0
  173. package/source/lsp/index.ts +31 -0
  174. package/source/lsp/lsp-client.spec.ts +508 -0
  175. package/source/lsp/lsp-client.ts +487 -0
  176. package/source/lsp/lsp-manager.spec.ts +477 -0
  177. package/source/lsp/lsp-manager.ts +419 -0
  178. package/source/lsp/protocol.spec.ts +502 -0
  179. package/source/lsp/protocol.ts +360 -0
  180. package/source/lsp/server-discovery.spec.ts +654 -0
  181. package/source/lsp/server-discovery.ts +515 -0
  182. package/source/markdown-parser/html-entities.spec.ts +88 -0
  183. package/source/markdown-parser/html-entities.ts +45 -0
  184. package/source/markdown-parser/index.spec.ts +281 -0
  185. package/source/markdown-parser/index.ts +126 -0
  186. package/source/markdown-parser/table-parser.spec.ts +133 -0
  187. package/source/markdown-parser/table-parser.ts +114 -0
  188. package/source/markdown-parser/utils.spec.ts +70 -0
  189. package/source/markdown-parser/utils.ts +13 -0
  190. package/source/mcp/mcp-client.spec.ts +81 -0
  191. package/source/mcp/mcp-client.ts +625 -0
  192. package/source/mcp/transport-factory.spec.ts +406 -0
  193. package/source/mcp/transport-factory.ts +312 -0
  194. package/source/message-handler.ts +67 -0
  195. package/source/model-database/database-engine.spec.ts +494 -0
  196. package/source/model-database/database-engine.ts +50 -0
  197. package/source/model-database/model-database.spec.ts +363 -0
  198. package/source/model-database/model-database.ts +91 -0
  199. package/source/model-database/model-engine.spec.ts +447 -0
  200. package/source/model-database/model-engine.ts +65 -0
  201. package/source/model-database/model-fetcher.spec.ts +583 -0
  202. package/source/model-database/model-fetcher.ts +330 -0
  203. package/source/models/index.ts +1 -0
  204. package/source/models/models-cache.spec.ts +214 -0
  205. package/source/models/models-cache.ts +78 -0
  206. package/source/models/models-dev-client.spec.ts +379 -0
  207. package/source/models/models-dev-client.ts +329 -0
  208. package/source/models/models-types.ts +68 -0
  209. package/source/prompt-history.ts +155 -0
  210. package/source/security/command-injection.spec.ts +240 -0
  211. package/source/services/checkpoint-manager.spec.ts +523 -0
  212. package/source/services/checkpoint-manager.ts +466 -0
  213. package/source/services/file-snapshot.spec.ts +569 -0
  214. package/source/services/file-snapshot.ts +220 -0
  215. package/source/test-utils/render-with-theme.tsx +48 -0
  216. package/source/tokenization/index.ts +1 -0
  217. package/source/tokenization/tokenizer-factory.spec.ts +170 -0
  218. package/source/tokenization/tokenizer-factory.ts +125 -0
  219. package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +200 -0
  220. package/source/tokenization/tokenizers/anthropic-tokenizer.ts +43 -0
  221. package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +236 -0
  222. package/source/tokenization/tokenizers/fallback-tokenizer.ts +26 -0
  223. package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +224 -0
  224. package/source/tokenization/tokenizers/llama-tokenizer.ts +41 -0
  225. package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +184 -0
  226. package/source/tokenization/tokenizers/openai-tokenizer.ts +57 -0
  227. package/source/tool-calling/index.ts +5 -0
  228. package/source/tool-calling/json-parser.spec.ts +639 -0
  229. package/source/tool-calling/json-parser.ts +247 -0
  230. package/source/tool-calling/tool-parser.spec.ts +395 -0
  231. package/source/tool-calling/tool-parser.ts +120 -0
  232. package/source/tool-calling/xml-parser.spec.ts +662 -0
  233. package/source/tool-calling/xml-parser.ts +289 -0
  234. package/source/tools/execute-bash.spec.tsx +353 -0
  235. package/source/tools/execute-bash.tsx +219 -0
  236. package/source/tools/execute-function.spec.ts +130 -0
  237. package/source/tools/fetch-url.spec.tsx +342 -0
  238. package/source/tools/fetch-url.tsx +172 -0
  239. package/source/tools/find-files.spec.tsx +924 -0
  240. package/source/tools/find-files.tsx +293 -0
  241. package/source/tools/index.ts +102 -0
  242. package/source/tools/lsp-get-diagnostics.tsx +192 -0
  243. package/source/tools/needs-approval.spec.ts +282 -0
  244. package/source/tools/read-file.spec.tsx +801 -0
  245. package/source/tools/read-file.tsx +387 -0
  246. package/source/tools/search-file-contents.spec.tsx +1273 -0
  247. package/source/tools/search-file-contents.tsx +293 -0
  248. package/source/tools/string-replace.spec.tsx +730 -0
  249. package/source/tools/string-replace.tsx +548 -0
  250. package/source/tools/tool-manager.ts +210 -0
  251. package/source/tools/tool-registry.spec.ts +415 -0
  252. package/source/tools/tool-registry.ts +228 -0
  253. package/source/tools/web-search.tsx +223 -0
  254. package/source/tools/write-file.spec.tsx +559 -0
  255. package/source/tools/write-file.tsx +228 -0
  256. package/source/types/app.ts +37 -0
  257. package/source/types/checkpoint.ts +48 -0
  258. package/source/types/commands.ts +46 -0
  259. package/source/types/components.ts +27 -0
  260. package/source/types/config.ts +103 -0
  261. package/source/types/core-connection-status.spec.ts +67 -0
  262. package/source/types/core.ts +181 -0
  263. package/source/types/hooks.ts +50 -0
  264. package/source/types/index.ts +12 -0
  265. package/source/types/markdown-parser.ts +11 -0
  266. package/source/types/mcp.ts +52 -0
  267. package/source/types/system.ts +16 -0
  268. package/source/types/tokenization.ts +41 -0
  269. package/source/types/ui.ts +40 -0
  270. package/source/types/usage.ts +58 -0
  271. package/source/types/utils.ts +16 -0
  272. package/source/usage/calculator.spec.ts +385 -0
  273. package/source/usage/calculator.ts +104 -0
  274. package/source/usage/storage.spec.ts +703 -0
  275. package/source/usage/storage.ts +238 -0
  276. package/source/usage/tracker.spec.ts +456 -0
  277. package/source/usage/tracker.ts +102 -0
  278. package/source/utils/atomic-deletion.spec.ts +194 -0
  279. package/source/utils/atomic-deletion.ts +127 -0
  280. package/source/utils/bounded-map.spec.ts +300 -0
  281. package/source/utils/bounded-map.ts +193 -0
  282. package/source/utils/checkpoint-utils.spec.ts +222 -0
  283. package/source/utils/checkpoint-utils.ts +92 -0
  284. package/source/utils/error-formatter.spec.ts +169 -0
  285. package/source/utils/error-formatter.ts +194 -0
  286. package/source/utils/file-autocomplete.spec.ts +173 -0
  287. package/source/utils/file-autocomplete.ts +196 -0
  288. package/source/utils/file-cache.spec.ts +309 -0
  289. package/source/utils/file-cache.ts +195 -0
  290. package/source/utils/file-content-loader.spec.ts +180 -0
  291. package/source/utils/file-content-loader.ts +179 -0
  292. package/source/utils/file-mention-handler.spec.ts +261 -0
  293. package/source/utils/file-mention-handler.ts +84 -0
  294. package/source/utils/file-mention-parser.spec.ts +182 -0
  295. package/source/utils/file-mention-parser.ts +170 -0
  296. package/source/utils/fuzzy-matching.spec.ts +149 -0
  297. package/source/utils/fuzzy-matching.ts +146 -0
  298. package/source/utils/indentation-normalizer.spec.ts +216 -0
  299. package/source/utils/indentation-normalizer.ts +76 -0
  300. package/source/utils/installation-detector.spec.ts +178 -0
  301. package/source/utils/installation-detector.ts +153 -0
  302. package/source/utils/logging/config.spec.ts +311 -0
  303. package/source/utils/logging/config.ts +210 -0
  304. package/source/utils/logging/console-facade.spec.ts +184 -0
  305. package/source/utils/logging/console-facade.ts +384 -0
  306. package/source/utils/logging/correlation.spec.ts +679 -0
  307. package/source/utils/logging/correlation.ts +474 -0
  308. package/source/utils/logging/formatters.spec.ts +464 -0
  309. package/source/utils/logging/formatters.ts +207 -0
  310. package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +93 -0
  311. package/source/utils/logging/health-monitor/alerts/alert-manager.ts +79 -0
  312. package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +56 -0
  313. package/source/utils/logging/health-monitor/checks/configuration-check.ts +43 -0
  314. package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +56 -0
  315. package/source/utils/logging/health-monitor/checks/logging-check.ts +58 -0
  316. package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +100 -0
  317. package/source/utils/logging/health-monitor/checks/memory-check.ts +78 -0
  318. package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +56 -0
  319. package/source/utils/logging/health-monitor/checks/performance-check.ts +56 -0
  320. package/source/utils/logging/health-monitor/checks/request-check.spec.ts +56 -0
  321. package/source/utils/logging/health-monitor/checks/request-check.ts +76 -0
  322. package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +70 -0
  323. package/source/utils/logging/health-monitor/core/health-check-runner.ts +138 -0
  324. package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +58 -0
  325. package/source/utils/logging/health-monitor/core/health-monitor.ts +344 -0
  326. package/source/utils/logging/health-monitor/core/scoring.spec.ts +65 -0
  327. package/source/utils/logging/health-monitor/core/scoring.ts +91 -0
  328. package/source/utils/logging/health-monitor/index.ts +15 -0
  329. package/source/utils/logging/health-monitor/instances.ts +48 -0
  330. package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +141 -0
  331. package/source/utils/logging/health-monitor/middleware/http-middleware.ts +75 -0
  332. package/source/utils/logging/health-monitor/types.ts +126 -0
  333. package/source/utils/logging/index.spec.ts +284 -0
  334. package/source/utils/logging/index.ts +236 -0
  335. package/source/utils/logging/integration.spec.ts +441 -0
  336. package/source/utils/logging/log-method-factory.spec.ts +573 -0
  337. package/source/utils/logging/log-method-factory.ts +233 -0
  338. package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +277 -0
  339. package/source/utils/logging/log-query/aggregation/aggregator.ts +159 -0
  340. package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +159 -0
  341. package/source/utils/logging/log-query/aggregation/facet-generator.ts +47 -0
  342. package/source/utils/logging/log-query/index.ts +23 -0
  343. package/source/utils/logging/log-query/query/filter-predicates.spec.ts +247 -0
  344. package/source/utils/logging/log-query/query/filter-predicates.ts +154 -0
  345. package/source/utils/logging/log-query/query/query-builder.spec.ts +182 -0
  346. package/source/utils/logging/log-query/query/query-builder.ts +151 -0
  347. package/source/utils/logging/log-query/query/query-engine.spec.ts +214 -0
  348. package/source/utils/logging/log-query/query/query-engine.ts +45 -0
  349. package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +143 -0
  350. package/source/utils/logging/log-query/storage/circular-buffer.ts +75 -0
  351. package/source/utils/logging/log-query/storage/index-manager.spec.ts +150 -0
  352. package/source/utils/logging/log-query/storage/index-manager.ts +71 -0
  353. package/source/utils/logging/log-query/storage/log-storage.spec.ts +257 -0
  354. package/source/utils/logging/log-query/storage/log-storage.ts +80 -0
  355. package/source/utils/logging/log-query/types.ts +163 -0
  356. package/source/utils/logging/log-query/utils/helpers.spec.ts +263 -0
  357. package/source/utils/logging/log-query/utils/helpers.ts +72 -0
  358. package/source/utils/logging/log-query/utils/sorting.spec.ts +182 -0
  359. package/source/utils/logging/log-query/utils/sorting.ts +61 -0
  360. package/source/utils/logging/logger-provider.spec.ts +262 -0
  361. package/source/utils/logging/logger-provider.ts +362 -0
  362. package/source/utils/logging/performance.spec.ts +209 -0
  363. package/source/utils/logging/performance.ts +757 -0
  364. package/source/utils/logging/pino-logger.spec.ts +425 -0
  365. package/source/utils/logging/pino-logger.ts +514 -0
  366. package/source/utils/logging/redaction.spec.ts +490 -0
  367. package/source/utils/logging/redaction.ts +267 -0
  368. package/source/utils/logging/request-tracker.spec.ts +1198 -0
  369. package/source/utils/logging/request-tracker.ts +803 -0
  370. package/source/utils/logging/transports.spec.ts +505 -0
  371. package/source/utils/logging/transports.ts +305 -0
  372. package/source/utils/logging/types.ts +216 -0
  373. package/source/utils/message-builder.spec.ts +179 -0
  374. package/source/utils/message-builder.ts +101 -0
  375. package/source/utils/message-queue.tsx +486 -0
  376. package/source/utils/paste-detection.spec.ts +69 -0
  377. package/source/utils/paste-detection.ts +124 -0
  378. package/source/utils/paste-roundtrip.spec.ts +442 -0
  379. package/source/utils/paste-utils.spec.ts +128 -0
  380. package/source/utils/paste-utils.ts +52 -0
  381. package/source/utils/programming-language-helper.spec.ts +74 -0
  382. package/source/utils/programming-language-helper.ts +32 -0
  383. package/source/utils/prompt-assembly.spec.ts +221 -0
  384. package/source/utils/prompt-processor.ts +173 -0
  385. package/source/utils/tool-args-parser.spec.ts +136 -0
  386. package/source/utils/tool-args-parser.ts +54 -0
  387. package/source/utils/tool-cancellation.spec.ts +230 -0
  388. package/source/utils/tool-cancellation.ts +28 -0
  389. package/source/utils/tool-result-display.spec.tsx +469 -0
  390. package/source/utils/tool-result-display.tsx +90 -0
  391. package/source/utils/update-checker.spec.ts +383 -0
  392. package/source/utils/update-checker.ts +183 -0
  393. package/source/wizard/config-wizard.spec.tsx +103 -0
  394. package/source/wizard/config-wizard.tsx +382 -0
  395. package/source/wizard/steps/location-step.spec.tsx +186 -0
  396. package/source/wizard/steps/location-step.tsx +147 -0
  397. package/source/wizard/steps/mcp-step.spec.tsx +607 -0
  398. package/source/wizard/steps/mcp-step.tsx +632 -0
  399. package/source/wizard/steps/provider-step.spec.tsx +342 -0
  400. package/source/wizard/steps/provider-step.tsx +957 -0
  401. package/source/wizard/steps/summary-step.spec.tsx +749 -0
  402. package/source/wizard/steps/summary-step.tsx +228 -0
  403. package/source/wizard/templates/mcp-templates.spec.ts +613 -0
  404. package/source/wizard/templates/mcp-templates.ts +570 -0
  405. package/source/wizard/templates/provider-templates.spec.ts +152 -0
  406. package/source/wizard/templates/provider-templates.ts +485 -0
  407. package/source/wizard/utils/fetch-cloud-models.spec.ts +428 -0
  408. package/source/wizard/utils/fetch-cloud-models.ts +223 -0
  409. package/source/wizard/utils/fetch-local-models.spec.ts +297 -0
  410. package/source/wizard/utils/fetch-local-models.ts +192 -0
  411. package/source/wizard/validation-array.spec.ts +264 -0
  412. package/source/wizard/validation.spec.ts +373 -0
  413. package/source/wizard/validation.ts +232 -0
  414. package/source/app/prompts/main-prompt.md +0 -122
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Main logging interface with facade pattern for backward compatibility
3
+ * Uses dependency injection pattern to avoid circular dependencies
4
+ */
5
+
6
+ import {loggerProvider} from './logger-provider';
7
+ import type {LogLevel, Logger, LoggerConfig} from './types';
8
+
9
+ /**
10
+ * Initialize the logger with configuration
11
+ */
12
+ export function initializeLogger(config?: Partial<LoggerConfig>): Logger {
13
+ return loggerProvider.initializeLogger(config);
14
+ }
15
+
16
+ /**
17
+ * Get the current logger instance
18
+ */
19
+ export function getLogger(): Logger {
20
+ return loggerProvider.getLogger();
21
+ }
22
+
23
+ /**
24
+ * Get the current configuration
25
+ */
26
+ export function getLoggerConfig(): LoggerConfig | null {
27
+ return loggerProvider.getLoggerConfig();
28
+ }
29
+
30
+ /**
31
+ * Create a child logger with additional context
32
+ */
33
+ // biome-ignore lint/suspicious/noExplicitAny: Dynamic bindings for logger context
34
+ export function createChildLogger(bindings: Record<string, any>): Logger {
35
+ return loggerProvider.createChildLogger(bindings);
36
+ }
37
+
38
+ /**
39
+ * Check if a log level is enabled
40
+ */
41
+ export function isLevelEnabled(level: LogLevel): boolean {
42
+ return loggerProvider.isLevelEnabled(level);
43
+ }
44
+
45
+ /**
46
+ * Convenience methods that match console.log API
47
+ */
48
+ export const log = {
49
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for logger methods
50
+ fatal: (msg: string, ...args: any[]) => getLogger().fatal(msg, ...args),
51
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for logger methods
52
+ error: (msg: string, ...args: any[]) => getLogger().error(msg, ...args),
53
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for logger methods
54
+ warn: (msg: string, ...args: any[]) => getLogger().warn(msg, ...args),
55
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for logger methods
56
+ info: (msg: string, ...args: any[]) => getLogger().info(msg, ...args),
57
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for logger methods
58
+ http: (msg: string, ...args: any[]) => getLogger().http(msg, ...args),
59
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for logger methods
60
+ debug: (msg: string, ...args: any[]) => getLogger().debug(msg, ...args),
61
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for logger methods
62
+ trace: (msg: string, ...args: any[]) => getLogger().trace(msg, ...args),
63
+ };
64
+
65
+ /**
66
+ * Backward compatibility facade - wraps console during transition
67
+ * This will be gradually replaced with structured logging
68
+ */
69
+ export const console = {
70
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for console compatibility
71
+ log: (...args: any[]) => {
72
+ // For now, use info level for console.log
73
+ log.info(args.join(' '));
74
+
75
+ // TODO: Add deprecation warning in development mode
76
+ if (process.env.NODE_ENV === 'development') {
77
+ process.stderr.write(
78
+ '\x1b[33m[DEPRECATED]\x1b[0m console.log() is deprecated. Use logger.info() instead.\n',
79
+ );
80
+ }
81
+ },
82
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for console compatibility
83
+ error: (...args: any[]) => {
84
+ log.error(args.join(' '));
85
+ },
86
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for console compatibility
87
+ warn: (...args: any[]) => {
88
+ log.warn(args.join(' '));
89
+ },
90
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for console compatibility
91
+ info: (...args: any[]) => {
92
+ log.info(args.join(' '));
93
+ },
94
+ // biome-ignore lint/suspicious/noExplicitAny: Variadic arguments for console compatibility
95
+ debug: (...args: any[]) => {
96
+ log.debug(args.join(' '));
97
+ },
98
+ };
99
+
100
+ /**
101
+ * Flush any pending logs
102
+ */
103
+ export async function flush(): Promise<void> {
104
+ await loggerProvider.flush();
105
+ }
106
+
107
+ /**
108
+ * End the logger and close all streams
109
+ */
110
+ export async function end(): Promise<void> {
111
+ await loggerProvider.end();
112
+ }
113
+
114
+ // Setup graceful shutdown handlers
115
+ process.on('SIGTERM', () => {
116
+ void (async () => {
117
+ log.info('\n[LOGGER] Received SIGTERM, flushing logs...');
118
+ await flush();
119
+ await end();
120
+ log.info('[LOGGER] Graceful shutdown completed');
121
+ })();
122
+ });
123
+
124
+ process.on('SIGINT', () => {
125
+ void (async () => {
126
+ log.info('\n[LOGGER] Received SIGINT, flushing logs...');
127
+ await flush();
128
+ await end();
129
+ log.info('[LOGGER] Graceful shutdown completed');
130
+ })();
131
+ });
132
+
133
+ // Handle uncaught exceptions and unhandled rejections
134
+ process.on('uncaughtException', err => {
135
+ void (async () => {
136
+ const logger = getLogger();
137
+ logger.fatal({err}, 'Uncaught exception');
138
+ await flush();
139
+ process.exit(1);
140
+ })();
141
+ });
142
+
143
+ process.on('unhandledRejection', (reason, promise) => {
144
+ void (async () => {
145
+ const logger = getLogger();
146
+ logger.fatal({reason, promise}, 'Unhandled promise rejection');
147
+ await flush();
148
+ process.exit(1);
149
+ })();
150
+ });
151
+
152
+ // Re-export all modules for external use
153
+ export type {Logger, LoggerConfig, LogLevel} from './types.js';
154
+
155
+ // Export for testing purposes only
156
+ export {
157
+ /** @internal */
158
+ createCorrelationFromHeaders,
159
+ /** @internal */
160
+ extractCorrelationId,
161
+ /** @internal */
162
+ formatCorrelationForLog,
163
+ /** @internal */
164
+ correlationMiddleware,
165
+ } from './correlation.js';
166
+
167
+ // Export correlation utilities
168
+ export {
169
+ generateCorrelationId,
170
+ withNewCorrelationContext,
171
+ getCorrelationId,
172
+ } from './correlation.js';
173
+
174
+ // Export performance utilities
175
+ export {
176
+ startMetrics,
177
+ endMetrics,
178
+ calculateMemoryDelta,
179
+ formatMemoryUsage,
180
+ /** @internal */
181
+ formatBytes,
182
+ /** @internal */
183
+ globalPerformanceMonitor,
184
+ } from './performance.js';
185
+
186
+ // Export configuration utilities
187
+ export {
188
+ /** @internal */
189
+ getDefaultLogDirectory,
190
+ /** @internal */
191
+ getEnvironmentConfig,
192
+ /** @internal */
193
+ validateLogLevel,
194
+ /** @internal */
195
+ normalizeLogLevel,
196
+ /** @internal */
197
+ createConfig,
198
+ } from './config.js';
199
+
200
+ // Export transport utilities (used internally only)
201
+ // No exports from transports.js as they are only used internally
202
+
203
+ // Console facade exports (only used in tests)
204
+ // No exports from console-facade.js as they are only used internally and in tests
205
+
206
+ // Export request tracking utilities (specific instances used by other modules)
207
+ export {healthChecks} from './health-monitor/index.js';
208
+
209
+ // Internal exports that knip should ignore
210
+ /** @internal */
211
+ export {httpTracker} from './request-tracker.js';
212
+
213
+ /** @internal */
214
+ export {aiTracker} from './request-tracker.js';
215
+
216
+ /** @internal */
217
+ export {mcpTracker} from './request-tracker.js';
218
+
219
+ export {globalRequestTracker} from './request-tracker.js';
220
+
221
+ // Export log storage for tests
222
+ export {globalLogStorage} from './log-query/index.js';
223
+
224
+ // RequestTracker is only used internally as default export
225
+ // No export needed here
226
+
227
+ // Log query exports (not used in main codebase)
228
+ // No exports from log-query.js as they are not used
229
+
230
+ // Export health monitoring
231
+ export {
232
+ type HealthCheckResult,
233
+ type HealthCheck,
234
+ type SystemMetrics,
235
+ type HealthCheckConfig,
236
+ } from './health-monitor/index.js';
@@ -0,0 +1,441 @@
1
+ import {existsSync, mkdirSync, rmSync, writeFileSync} from 'fs';
2
+ import {tmpdir} from 'os';
3
+ import {join} from 'path';
4
+ import test from 'ava';
5
+
6
+ console.log(`\nlogging/integration.spec.ts`);
7
+
8
+ // Integration tests for the complete logging system
9
+ import {
10
+ end,
11
+ flush,
12
+ getLogger,
13
+ globalLogStorage,
14
+ globalRequestTracker,
15
+ healthChecks,
16
+ initializeLogger,
17
+ } from './index.js';
18
+
19
+ // Import correlation functionality
20
+ import {
21
+ generateCorrelationId,
22
+ getCorrelationId,
23
+ withNewCorrelationContext,
24
+ } from './correlation.js';
25
+
26
+ // Import redaction
27
+ import {
28
+ createRedactionRules,
29
+ redactEmail,
30
+ redactLogEntry,
31
+ redactValue,
32
+ } from './redaction.js';
33
+
34
+ // Create a temporary test directory
35
+ const testDir = join(tmpdir(), `coder-logging-integration-${Date.now()}`);
36
+
37
+ test.before(() => {
38
+ mkdirSync(testDir, {recursive: true});
39
+ process.env.NODE_ENV = 'test';
40
+ process.env.CODER_LOG_LEVEL = 'debug';
41
+ });
42
+
43
+ test.after.always(async () => {
44
+ // Clean up
45
+ if (existsSync(testDir)) {
46
+ rmSync(testDir, {recursive: true, force: true});
47
+ }
48
+
49
+ // Reset logger state
50
+ await end();
51
+ });
52
+
53
+ test('end-to-end logging workflow', async t => {
54
+ // Initialize logger with test configuration
55
+ const logger = initializeLogger({
56
+ level: 'debug',
57
+ pretty: false,
58
+ correlation: true,
59
+ redact: ['apiKey', 'password'],
60
+ });
61
+
62
+ t.truthy(logger, 'Logger should be initialized');
63
+
64
+ // Test basic logging
65
+ logger.info('Integration test started');
66
+ logger.warn('Warning message', {code: 'TEST_WARNING'});
67
+ logger.error('Error message', {error: new Error('Test error')});
68
+
69
+ // Test correlation context
70
+ const correlationId = generateCorrelationId();
71
+ t.truthy(correlationId, 'Should generate correlation ID');
72
+
73
+ await withNewCorrelationContext(
74
+ async () => {
75
+ const contextCorrelationId = getCorrelationId();
76
+ t.truthy(contextCorrelationId, 'Should have correlation ID in context');
77
+
78
+ logger.info('Message with correlation context', {action: 'test'});
79
+ },
80
+ correlationId,
81
+ {userId: 'test-user'},
82
+ );
83
+
84
+ // Test redaction
85
+ const sensitiveData = {
86
+ username: 'testuser',
87
+ apiKey: 'secret-key-123',
88
+ password: 'secret-pass',
89
+ email: 'test@example.com',
90
+ };
91
+
92
+ // Test redactLogEntry with proper redaction rules
93
+ const rules = createRedactionRules(['apiKey', 'password']);
94
+ const redactedData = redactLogEntry(sensitiveData, rules) as any;
95
+ t.is(
96
+ redactedData.username,
97
+ 'testuser',
98
+ 'Should preserve non-sensitive fields',
99
+ );
100
+ t.true(
101
+ redactedData.apiKey === '[REDACTED]' || redactedData.apiKey.includes('*'),
102
+ 'Should redact apiKey',
103
+ );
104
+ t.true(
105
+ redactedData.password === '[REDACTED]' ||
106
+ redactedData.password.includes('*'),
107
+ 'Should redact password',
108
+ );
109
+ t.is(
110
+ sensitiveData.email,
111
+ 'test@example.com',
112
+ 'Should preserve non-redacted fields',
113
+ );
114
+
115
+ // Test PII detection
116
+ const piiData = {
117
+ email: 'user@domain.com',
118
+ phone: '+1-555-123-4567',
119
+ ssn: '123-45-6789',
120
+ normalField: 'safe data',
121
+ };
122
+
123
+ const redactedSsn = redactValue(piiData.ssn) as string;
124
+ const maskedEmail = redactEmail(piiData.email);
125
+ t.true(typeof maskedEmail === 'string', 'Should return masked email');
126
+ t.is(
127
+ redactedSsn,
128
+ '123-45-6789',
129
+ 'Should preserve SSN (not in sensitive patterns)',
130
+ );
131
+ t.is(piiData.normalField, 'safe data', 'Should preserve safe data');
132
+
133
+ // Test log storage
134
+ globalLogStorage.addEntry({
135
+ timestamp: new Date().toISOString(),
136
+ level: 'info',
137
+ message: 'Test entry',
138
+ correlationId,
139
+ metadata: {test: true},
140
+ });
141
+
142
+ const logs = globalLogStorage.query({limit: 10});
143
+ t.true(logs.entries.length > 0, 'Should store log entries');
144
+
145
+ // Test request tracking
146
+ const requestId = globalRequestTracker.startRequest({
147
+ type: 'http',
148
+ method: 'GET',
149
+ endpoint: '/api/test',
150
+ });
151
+
152
+ t.truthy(requestId, 'Should start request tracking');
153
+
154
+ globalRequestTracker.completeRequest(requestId);
155
+ const stats = globalRequestTracker.getStats();
156
+ t.true(stats.totalRequests >= 1, 'Should track request statistics');
157
+
158
+ // Test health checks
159
+ const health = await healthChecks.quick();
160
+ t.true(health === 'healthy', 'Health check should pass');
161
+
162
+ const metrics = healthChecks.metrics();
163
+ t.truthy(metrics, 'Should return health metrics');
164
+
165
+ // Test logger cleanup
166
+ await flush();
167
+ await end();
168
+
169
+ t.pass('End-to-end workflow completed successfully');
170
+ });
171
+
172
+ test('logging system handles high volume gracefully', async t => {
173
+ const logger = initializeLogger({level: 'info', pretty: false});
174
+
175
+ const startTime = performance.now();
176
+ const messageCount = 1000;
177
+
178
+ // Generate high volume of logs
179
+ for (let i = 0; i < messageCount; i++) {
180
+ logger.info(`High volume test message ${i}`, {
181
+ batchId: 'test-batch',
182
+ index: i,
183
+ timestamp: new Date().toISOString(),
184
+ });
185
+ }
186
+
187
+ const endTime = performance.now();
188
+ const duration = endTime - startTime;
189
+ const avgTime = duration / messageCount;
190
+
191
+ // Should handle high volume efficiently (less than 1ms per log)
192
+ t.true(
193
+ avgTime < 1,
194
+ `Should handle high volume efficiently (${avgTime.toFixed(
195
+ 4,
196
+ )}ms per message)`,
197
+ );
198
+
199
+ await end();
200
+ });
201
+
202
+ test('multiple concurrent logging contexts', async t => {
203
+ const logger = initializeLogger({
204
+ level: 'debug',
205
+ correlation: true,
206
+ });
207
+
208
+ const promises = [];
209
+ const contexts = 10;
210
+ const messagesPerContext = 50;
211
+
212
+ // Create multiple concurrent logging contexts
213
+ for (let ctx = 0; ctx < contexts; ctx++) {
214
+ promises.push(
215
+ withNewCorrelationContext(
216
+ async () => {
217
+ const correlationId = getCorrelationId();
218
+ t.truthy(correlationId, 'Each context should have correlation ID');
219
+
220
+ for (let msg = 0; msg < messagesPerContext; msg++) {
221
+ logger.info(`Context ${ctx} message ${msg}`, {
222
+ contextId: ctx,
223
+ messageId: msg,
224
+ batch: 'concurrent-test',
225
+ });
226
+ }
227
+ },
228
+ undefined,
229
+ {contextId: ctx},
230
+ ),
231
+ );
232
+ }
233
+
234
+ await Promise.all(promises);
235
+
236
+ // Verify that all contexts completed by checking that no errors were thrown
237
+ // Note: globalLogStorage is not automatically populated by logger - it's a separate facility
238
+ t.pass('All concurrent logging contexts completed without errors');
239
+
240
+ await end();
241
+ });
242
+
243
+ test('error handling and recovery', async t => {
244
+ const logger = initializeLogger({level: 'info'});
245
+
246
+ // Test logging with circular references
247
+ const circular: any = {id: 1, data: 'test'};
248
+ circular.self = circular;
249
+
250
+ t.notThrows(() => {
251
+ logger.info('Circular reference test', circular);
252
+ }, 'Should handle circular references gracefully');
253
+
254
+ // Test logging with very large objects
255
+ const largeObject = {
256
+ data: 'x'.repeat(10000),
257
+ array: Array.from({length: 1000}, (_, i) => ({id: i, value: `item-${i}`})),
258
+ };
259
+
260
+ t.notThrows(() => {
261
+ logger.info('Large object test', {summary: largeObject});
262
+ }, 'Should handle large objects gracefully');
263
+
264
+ // Test logging with undefined/null values
265
+ t.notThrows(() => {
266
+ logger.info('Edge case test', {
267
+ nullValue: null,
268
+ undefinedValue: undefined,
269
+ emptyString: '',
270
+ zero: 0,
271
+ false: false,
272
+ });
273
+ }, 'Should handle edge case values gracefully');
274
+
275
+ await end();
276
+ });
277
+
278
+ test('child logger functionality', async t => {
279
+ const parentLogger = initializeLogger({level: 'debug', correlation: true});
280
+
281
+ // Create child logger with bindings
282
+ const childLogger = parentLogger.child({
283
+ module: 'test-module',
284
+ version: '1.0.0',
285
+ });
286
+
287
+ t.truthy(childLogger, 'Should create child logger');
288
+ t.not(parentLogger === childLogger, 'Child should be different instance');
289
+
290
+ // Test child logger with correlation
291
+ await withNewCorrelationContext(
292
+ async () => {
293
+ childLogger.info('Child logger message', {action: 'test'});
294
+
295
+ // Create grandchild
296
+ const grandchildLogger = childLogger.child({
297
+ subModule: 'test-submodule',
298
+ });
299
+
300
+ grandchildLogger.info('Grandchild message', {action: 'nested-test'});
301
+ },
302
+ undefined,
303
+ {requestId: 'req-123'},
304
+ );
305
+
306
+ t.pass('Child logger functionality working correctly');
307
+
308
+ await end();
309
+ });
310
+
311
+ test('performance metrics integration', async t => {
312
+ const logger = initializeLogger({
313
+ level: 'info',
314
+ });
315
+
316
+ // Simulate operations with performance tracking
317
+ const promises = [];
318
+
319
+ for (let i = 0; i < 5; i++) {
320
+ promises.push(
321
+ new Promise<void>(resolve => {
322
+ setTimeout(() => {
323
+ logger.info(`Performance test ${i}`, {
324
+ operation: `test-${i}`,
325
+ timestamp: Date.now(),
326
+ });
327
+ resolve();
328
+ }, Math.random() * 50);
329
+ }),
330
+ );
331
+ }
332
+
333
+ await Promise.all(promises);
334
+
335
+ // Get performance metrics if available
336
+ try {
337
+ const metrics = healthChecks.metrics();
338
+ t.truthy(metrics, 'Should return health metrics');
339
+
340
+ if (metrics && typeof metrics === 'object' && 'performance' in metrics) {
341
+ const perfMetrics = (metrics as any).performance;
342
+ t.truthy(typeof perfMetrics === 'object', 'Should have performance data');
343
+ }
344
+ } catch (error) {
345
+ // Performance metrics might not be available in test environment
346
+ t.pass('Performance metrics test skipped');
347
+ }
348
+
349
+ await end();
350
+ });
351
+
352
+ test('graceful shutdown and cleanup', async t => {
353
+ const logger = initializeLogger({
354
+ level: 'info',
355
+ });
356
+
357
+ // Log some messages
358
+ for (let i = 0; i < 100; i++) {
359
+ logger.info(`Shutdown test message ${i}`, {
360
+ batch: 'shutdown-test',
361
+ index: i,
362
+ });
363
+ }
364
+
365
+ // Test flush
366
+ await t.notThrowsAsync(async () => {
367
+ await flush();
368
+ }, 'Flush should complete without errors');
369
+
370
+ // Test end
371
+ await t.notThrowsAsync(async () => {
372
+ await end();
373
+ }, 'End should complete without errors');
374
+
375
+ // Verify logger can be reinitialized
376
+ const newLogger = initializeLogger({level: 'info'});
377
+ t.truthy(newLogger, 'Should reinitialize after shutdown');
378
+
379
+ await end();
380
+ });
381
+
382
+ test('structured data handling and serialization', async t => {
383
+ const logger = initializeLogger({
384
+ level: 'debug',
385
+ serialize: true,
386
+ });
387
+
388
+ // Test complex nested objects
389
+ const complexData = {
390
+ user: {
391
+ id: '123',
392
+ profile: {
393
+ name: 'Test User',
394
+ preferences: {
395
+ theme: 'dark',
396
+ language: 'en',
397
+ notifications: {
398
+ email: true,
399
+ push: false,
400
+ sms: null,
401
+ },
402
+ },
403
+ },
404
+ metadata: {
405
+ lastLogin: new Date().toISOString(),
406
+ sessions: [
407
+ {id: 1, duration: 3600},
408
+ {id: 2, duration: 1800},
409
+ ],
410
+ },
411
+ },
412
+ request: {
413
+ headers: {
414
+ 'user-agent': 'test-agent',
415
+ accept: 'application/json',
416
+ authorization: '[REDACTED]',
417
+ },
418
+ },
419
+ };
420
+
421
+ t.notThrows(() => {
422
+ logger.info('Complex data test', complexData);
423
+ }, 'Should handle complex nested objects');
424
+
425
+ // Test special characters and Unicode
426
+ const unicodeData = {
427
+ emoji: '🚀 🎉 ✅',
428
+ chinese: '中文测试',
429
+ arabic: 'اختبار العربية',
430
+ specialChars: '"quotes", \'apostrophes\', \n\t\r\\',
431
+ binary: Buffer.from('binary data').toString('base64'),
432
+ };
433
+
434
+ t.notThrows(() => {
435
+ logger.info('Unicode test', unicodeData);
436
+ }, 'Should handle Unicode and special characters');
437
+
438
+ await end();
439
+ });
440
+
441
+ console.log('Integration tests completed successfully!');