@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,305 @@
1
+ /**
2
+ * Transport configuration for different output destinations
3
+ */
4
+
5
+ import {join} from 'path';
6
+ import {BUFFER_LOG_BYTES, INTERVAL_LOG_FLUSH_MS} from '@/constants';
7
+ import {getDefaultLogDirectory} from './config.js';
8
+ import type {TransportConfig} from './types.js';
9
+
10
+ // Type definition for Pino transport target
11
+ type TransportTarget = {
12
+ target: string;
13
+ options?: Record<string, unknown>;
14
+ level?: string;
15
+ };
16
+
17
+ /**
18
+ * Create a development transport with pretty printing
19
+ */
20
+ export function createDevelopmentTransport(): TransportTarget {
21
+ return {
22
+ target: 'pino-pretty',
23
+ level: 'debug',
24
+ options: {
25
+ colorize: true,
26
+ translateTime: 'HH:MM:ss Z',
27
+ ignore: 'pid,hostname',
28
+ levelFirst: true,
29
+ messageFormat: '{levelLabel} - {msg}',
30
+ customPrettifiers: {
31
+ time: (timestamp: number) => {
32
+ return new Date(timestamp).toLocaleTimeString('en-US', {
33
+ hour12: false,
34
+ timeZone: 'UTC',
35
+ });
36
+ },
37
+ },
38
+ singleLine: false,
39
+ },
40
+ };
41
+ }
42
+
43
+ /**
44
+ * Create a production transport with file rotation
45
+ */
46
+ export function createProductionTransport(
47
+ logDir: string = getDefaultLogDirectory(),
48
+ ): TransportTarget {
49
+ return {
50
+ target: 'pino-roll',
51
+ level: 'info',
52
+ options: {
53
+ file: join(logDir, 'coder-%Y-%m-%d.log'), // nosemgrep
54
+ frequency: 'daily',
55
+ size: '100m',
56
+ dateFormat: 'yyyy-MM-dd',
57
+ extension: '.log',
58
+ symlink: true,
59
+ mkdir: true,
60
+ compress: true,
61
+ sync: false,
62
+ limit: {
63
+ count: 30,
64
+ removeOtherLogFiles: true,
65
+ },
66
+ minLength: 4096,
67
+ maxLength: 1048576, // 1MB
68
+ periodicFlush: INTERVAL_LOG_FLUSH_MS,
69
+ },
70
+ };
71
+ }
72
+
73
+ /**
74
+ * Create a test transport that outputs to /dev/null
75
+ */
76
+ export function createTestTransport(): TransportTarget {
77
+ return {
78
+ target: 'pino/file',
79
+ level: 'silent',
80
+ options: {
81
+ destination: '/dev/null',
82
+ },
83
+ };
84
+ }
85
+
86
+ /**
87
+ * Create a custom transport for specific needs
88
+ */
89
+ export function createCustomTransport(
90
+ config: TransportConfig,
91
+ ): TransportTarget {
92
+ return {
93
+ target: config.target,
94
+ level: (config.options as {level?: string})?.level || 'info',
95
+ options: {
96
+ ...config.options,
97
+ // Ensure minimum buffer size for performance
98
+ minLength: config.options.minLength || 4096,
99
+ // Set maximum buffer size to prevent memory issues
100
+ maxLength: config.options.maxLength || 1048576,
101
+ },
102
+ };
103
+ }
104
+
105
+ /**
106
+ * Create a multi-transport configuration
107
+ */
108
+ export function createMultiTransport(): TransportTarget[] {
109
+ const transports: TransportTarget[] = [];
110
+ const env = process.env.NODE_ENV || 'development';
111
+
112
+ // Always include console output for development
113
+ if (env !== 'production') {
114
+ transports.push(createDevelopmentTransport());
115
+ }
116
+
117
+ // Add file output for production or when explicitly enabled
118
+ if (env === 'production' || process.env.CODER_LOG_TO_FILE === 'true') {
119
+ transports.push(createProductionTransport());
120
+ }
121
+
122
+ return transports;
123
+ }
124
+
125
+ /**
126
+ * Create a transport with buffering for high-performance scenarios
127
+ */
128
+ export function createBufferedTransport(
129
+ baseTransport: TransportTarget,
130
+ bufferSize: number = BUFFER_LOG_BYTES,
131
+ ): TransportTarget {
132
+ return {
133
+ ...baseTransport,
134
+ options: {
135
+ ...baseTransport.options,
136
+ // Use sonic-boom for high-performance buffering
137
+ bufferSize,
138
+ // Enable async writing
139
+ sync: false,
140
+ },
141
+ };
142
+ }
143
+
144
+ /**
145
+ * Create a transport for error-specific logging
146
+ */
147
+ export function createErrorTransport(
148
+ logDir: string = getDefaultLogDirectory(),
149
+ ): TransportTarget {
150
+ return {
151
+ target: 'pino-roll',
152
+ level: 'error',
153
+ options: {
154
+ file: join(logDir, 'coder-error-%Y-%m-%d.log'), // nosemgrep
155
+ frequency: 'daily',
156
+ size: '50m', // Smaller files for errors
157
+ dateFormat: 'yyyy-MM-dd',
158
+ extension: '.log',
159
+ mkdir: true,
160
+ compress: true,
161
+ sync: true, // Sync writes for errors to ensure they're logged
162
+ limit: {
163
+ count: 90, // Keep more error logs
164
+ removeOtherLogFiles: true,
165
+ },
166
+ minLength: 1024,
167
+ maxLength: 1048576,
168
+ },
169
+ };
170
+ }
171
+
172
+ /**
173
+ * Create a transport for audit logging
174
+ */
175
+ export function createAuditTransport(
176
+ logDir: string = getDefaultLogDirectory(),
177
+ ): TransportTarget {
178
+ return {
179
+ target: 'pino-roll',
180
+ level: 'info',
181
+ options: {
182
+ file: join(logDir, 'coder-audit-%Y-%m-%d.log'), // nosemgrep
183
+ frequency: 'daily',
184
+ size: '200m',
185
+ dateFormat: 'yyyy-MM-dd',
186
+ extension: '.log',
187
+ mkdir: true,
188
+ compress: true,
189
+ sync: true, // Sync writes for audit logs
190
+ limit: {
191
+ count: 365, // Keep 1 year of audit logs
192
+ removeOtherLogFiles: false,
193
+ },
194
+ minLength: 1024,
195
+ maxLength: 10485760, // 10MB for audit logs
196
+ },
197
+ };
198
+ }
199
+
200
+ /**
201
+ * Get transport configuration based on environment variables
202
+ */
203
+ export function getTransportFromEnvironment():
204
+ | TransportTarget
205
+ | TransportTarget[] {
206
+ // Support multiple transports via comma separation
207
+ const transportTypes = (process.env.CODER_LOG_TRANSPORTS || 'default')
208
+ .split(',')
209
+ .map(t => t.trim());
210
+ const transports: TransportTarget[] = [];
211
+
212
+ for (const transportType of transportTypes) {
213
+ switch (transportType) {
214
+ case 'development':
215
+ case 'dev':
216
+ transports.push(createDevelopmentTransport());
217
+ break;
218
+
219
+ case 'production':
220
+ case 'prod':
221
+ transports.push(createProductionTransport());
222
+ break;
223
+
224
+ case 'test':
225
+ transports.push(createTestTransport());
226
+ break;
227
+
228
+ case 'error':
229
+ transports.push(createErrorTransport());
230
+ break;
231
+
232
+ case 'audit':
233
+ transports.push(createAuditTransport());
234
+ break;
235
+
236
+ case 'default':
237
+ default:
238
+ // Use default behavior
239
+ {
240
+ const defaultTransports = createMultiTransport();
241
+ transports.push(...defaultTransports);
242
+ }
243
+ break;
244
+ }
245
+ }
246
+
247
+ // Return single transport if only one, otherwise return array
248
+ return transports.length === 1 ? transports[0] : transports;
249
+ }
250
+
251
+ /**
252
+ * Validate transport configuration
253
+ */
254
+ export function validateTransport(transport: TransportTarget): boolean {
255
+ if (!transport.target) {
256
+ console.error('[ERROR] Transport target is required');
257
+ return false;
258
+ }
259
+
260
+ // Validate target is a string or function
261
+ if (
262
+ typeof transport.target !== 'string' &&
263
+ typeof transport.target !== 'function'
264
+ ) {
265
+ console.error('[ERROR] Transport target must be a string or function');
266
+ return false;
267
+ }
268
+
269
+ // Validate options if present
270
+ if (transport.options && typeof transport.options !== 'object') {
271
+ console.error('[ERROR] Transport options must be an object');
272
+ return false;
273
+ }
274
+
275
+ return true;
276
+ }
277
+
278
+ /**
279
+ * Create transport with error handling and fallback
280
+ */
281
+ export function createSafeTransport(
282
+ primaryTransport: TransportTarget,
283
+ fallbackTransport?: TransportTarget,
284
+ ): TransportTarget {
285
+ try {
286
+ if (!validateTransport(primaryTransport)) {
287
+ throw new Error('Invalid primary transport configuration');
288
+ }
289
+
290
+ return primaryTransport;
291
+ } catch (error) {
292
+ console.error('[ERROR] Failed to create primary transport:', error);
293
+
294
+ if (fallbackTransport) {
295
+ console.warn('[WARN] Falling back to secondary transport');
296
+ if (validateTransport(fallbackTransport)) {
297
+ return fallbackTransport;
298
+ }
299
+ }
300
+
301
+ // Ultimate fallback to console
302
+ console.warn('[WARN] Falling back to console transport');
303
+ return createDevelopmentTransport();
304
+ }
305
+ }
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Type definitions for the structured logging system
3
+ */
4
+
5
+ export type LogLevel =
6
+ | 'silent'
7
+ | 'fatal'
8
+ | 'error'
9
+ | 'warn'
10
+ | 'info'
11
+ | 'http'
12
+ | 'debug'
13
+ | 'trace';
14
+
15
+ export interface LoggerConfig {
16
+ level: LogLevel;
17
+ destination?: string;
18
+ pretty: boolean;
19
+ redact: string[];
20
+ correlation: boolean;
21
+ serialize: boolean;
22
+ transport?: unknown;
23
+ }
24
+
25
+ export interface LogEntry {
26
+ level: LogLevel;
27
+ time: string;
28
+ pid: number;
29
+ hostname: string;
30
+ correlationId?: string;
31
+ nodeVersion?: string; // NEW: Node.js version field
32
+ platform?: string; // NEW: platform field
33
+ arch?: string; // NEW: architecture field
34
+ service?: string; // NEW: service field
35
+ version?: string; // NEW: version field
36
+ environment?: string; // NEW: environment field
37
+ msg: string;
38
+ [key: string]: unknown;
39
+ }
40
+
41
+ // Enhanced logger configuration types
42
+ export interface EnhancedLoggerConfig extends LoggerConfig {
43
+ options?: EnhancedTransportOptions;
44
+ [key: string]: unknown;
45
+ }
46
+
47
+ export interface EnhancedTransportOptions {
48
+ destination?: string | number;
49
+ level?: LogLevel;
50
+ translateTime?: string;
51
+ ignore?: string;
52
+ messageFormat?: string;
53
+ customPrettifiers?: Record<string, (data: unknown) => string>;
54
+ levelFirst?: boolean;
55
+ singleLine?: boolean;
56
+ colorize?: boolean;
57
+ [key: string]: unknown;
58
+ }
59
+
60
+ export interface Logger {
61
+ fatal: ((msg: string, ...args: unknown[]) => void) &
62
+ ((obj: object, msg?: string) => void);
63
+ error: ((msg: string, ...args: unknown[]) => void) &
64
+ ((obj: object, msg?: string) => void);
65
+ warn: ((msg: string, ...args: unknown[]) => void) &
66
+ ((obj: object, msg?: string) => void);
67
+ info: ((msg: string, ...args: unknown[]) => void) &
68
+ ((obj: object, msg?: string) => void);
69
+ http: ((msg: string, ...args: unknown[]) => void) &
70
+ ((obj: object, msg?: string) => void);
71
+ debug: ((msg: string, ...args: unknown[]) => void) &
72
+ ((obj: object, msg?: string) => void);
73
+ trace: ((msg: string, ...args: unknown[]) => void) &
74
+ ((obj: object, msg?: string) => void);
75
+
76
+ child(bindings: Record<string, unknown>): Logger;
77
+ isLevelEnabled(level: LogLevel): boolean;
78
+ flush(): Promise<void>;
79
+ end(): Promise<void>;
80
+ }
81
+
82
+ export interface PiiRedactionRules {
83
+ patterns: RegExp[];
84
+ customPaths: string[];
85
+ emailRedaction: boolean;
86
+ userIdRedaction: boolean;
87
+ }
88
+
89
+ export interface CorrelationContext {
90
+ id: string;
91
+ parentId?: string;
92
+ metadata?: Record<string, unknown>;
93
+ }
94
+
95
+ export interface CorrelationMetadata {
96
+ source?: string;
97
+ version?: string;
98
+ environment?: string;
99
+ requestId?: string;
100
+ [key: string]: unknown;
101
+ }
102
+
103
+ export interface PerformanceMetrics {
104
+ startTime: number;
105
+ duration?: number;
106
+ memoryUsage?: NodeJS.MemoryUsage;
107
+ cpuUsage?: NodeJS.CpuUsage;
108
+ }
109
+
110
+ export interface TransportConfig {
111
+ target: string;
112
+ options: {
113
+ destination?: string;
114
+ level?: LogLevel;
115
+ formatters?: Record<string, (data: unknown) => unknown>;
116
+ redact?: string[];
117
+ frequency?: string | number;
118
+ size?: string | number;
119
+ limit?: {
120
+ count: number;
121
+ removeOtherLogFiles?: boolean;
122
+ };
123
+ dateFormat?: string;
124
+ extension?: string;
125
+ symlink?: boolean;
126
+ mkdir?: boolean;
127
+ compress?: boolean;
128
+ sync?: boolean;
129
+ minLength?: number;
130
+ maxLength?: number;
131
+ periodicFlush?: number;
132
+ };
133
+ }
134
+
135
+ /**
136
+ * CLI configuration for logging control
137
+ */
138
+ export interface LoggingCliConfig {
139
+ logToFile?: boolean;
140
+ logToConsole?: boolean;
141
+ noLogFile?: boolean;
142
+ noLogConsole?: boolean;
143
+ }
144
+
145
+ /**
146
+ * Environment-specific transport configuration
147
+ */
148
+ export interface EnvironmentTransportConfig {
149
+ enableFile: boolean;
150
+ enableConsole: boolean;
151
+ }
152
+
153
+ /**
154
+ * Pino transport options type
155
+ */
156
+ export interface PinoTransportOptions {
157
+ target: string;
158
+ options?: {
159
+ destination?: string;
160
+ mkdir?: boolean;
161
+ append?: boolean;
162
+ [key: string]: unknown;
163
+ };
164
+ }
165
+
166
+ /**
167
+ * Type for console method arguments
168
+ */
169
+ export type ConsoleArgument =
170
+ | string
171
+ | number
172
+ | boolean
173
+ | null
174
+ | undefined
175
+ | Error
176
+ | Record<string, unknown>
177
+ | Array<unknown>;
178
+
179
+ /**
180
+ * Type for console method arguments array
181
+ */
182
+ export type ConsoleArguments = ConsoleArgument[];
183
+
184
+ /**
185
+ * Typed object for console log data
186
+ */
187
+ export interface ConsoleLogData extends Record<string, unknown> {
188
+ correlationId: string;
189
+ source: string;
190
+ argumentCount?: number;
191
+ stringArgs?: number;
192
+ objectArgs?: number;
193
+ primitiveArgs?: number;
194
+ objects?: unknown[];
195
+ errorLikeObjects?: unknown[];
196
+ moduleName?: string;
197
+ allArgs?: ConsoleArguments;
198
+ }
199
+
200
+ /**
201
+ * Type for HTTP request object in correlation tracking
202
+ */
203
+ export interface CorrelationHttpRequest {
204
+ method?: string;
205
+ url?: string;
206
+ headers?: Record<string, string>;
207
+ }
208
+
209
+ /**
210
+ * Type for HTTP response object in correlation tracking
211
+ */
212
+ export interface CorrelationHttpResponse {
213
+ statusCode?: number;
214
+ headers?: Record<string, string>;
215
+ setHeader?: (name: string, value: string) => void;
216
+ }
@@ -0,0 +1,179 @@
1
+ import test from 'ava';
2
+ import {MessageBuilder} from './message-builder.js';
3
+ import type {Message, ToolResult} from '@/types/core';
4
+
5
+ test('MessageBuilder starts with initial messages', t => {
6
+ const userMsg: Message = {role: 'user', content: 'Hello'};
7
+ const builder = new MessageBuilder([userMsg]);
8
+
9
+ const messages = builder.build();
10
+
11
+ t.is(messages.length, 1);
12
+ t.deepEqual(messages[0], userMsg);
13
+ });
14
+
15
+ test('MessageBuilder addAssistantMessage adds assistant message', t => {
16
+ const builder = new MessageBuilder([]);
17
+ const assistantMsg: Message = {
18
+ role: 'assistant',
19
+ content: 'Hi there',
20
+ };
21
+
22
+ builder.addAssistantMessage(assistantMsg);
23
+ const messages = builder.build();
24
+
25
+ t.is(messages.length, 1);
26
+ t.is(messages[0].role, 'assistant');
27
+ t.is(messages[0].content, 'Hi there');
28
+ });
29
+
30
+ test('MessageBuilder addAssistantMessage throws on non-assistant message', t => {
31
+ const builder = new MessageBuilder([]);
32
+ const userMsg: Message = {role: 'user', content: 'Test'};
33
+
34
+ t.throws(
35
+ () => {
36
+ builder.addAssistantMessage(userMsg);
37
+ },
38
+ {message: /requires a message with role "assistant"/},
39
+ );
40
+ });
41
+
42
+ test('MessageBuilder addToolResults adds tool messages', t => {
43
+ const builder = new MessageBuilder([]);
44
+ const toolResults: ToolResult[] = [
45
+ {
46
+ tool_call_id: 'tool_1',
47
+ role: 'tool',
48
+ name: 'read_file',
49
+ content: 'File contents here',
50
+ },
51
+ {
52
+ tool_call_id: 'tool_2',
53
+ role: 'tool',
54
+ name: 'execute_bash',
55
+ content: 'Command output',
56
+ },
57
+ ];
58
+
59
+ builder.addToolResults(toolResults);
60
+ const messages = builder.build();
61
+
62
+ t.is(messages.length, 2);
63
+ t.is(messages[0].role, 'tool');
64
+ t.is(messages[0].tool_call_id, 'tool_1');
65
+ t.is(messages[0].name, 'read_file');
66
+ t.is(messages[0].content, 'File contents here');
67
+
68
+ t.is(messages[1].role, 'tool');
69
+ t.is(messages[1].tool_call_id, 'tool_2');
70
+ });
71
+
72
+ test('MessageBuilder addAutoExecutedMessages adds multiple messages', t => {
73
+ const builder = new MessageBuilder([]);
74
+ const autoMessages: Message[] = [
75
+ {role: 'assistant', content: '', tool_calls: [{id: '1', function: {name: 'test', arguments: {}}}]},
76
+ {role: 'tool', content: 'result', tool_call_id: '1', name: 'test'},
77
+ ];
78
+
79
+ builder.addAutoExecutedMessages(autoMessages);
80
+ const messages = builder.build();
81
+
82
+ t.is(messages.length, 2);
83
+ t.is(messages[0].role, 'assistant');
84
+ t.is(messages[1].role, 'tool');
85
+ });
86
+
87
+ test('MessageBuilder addUserMessage adds user message', t => {
88
+ const builder = new MessageBuilder([]);
89
+
90
+ builder.addUserMessage('Hello');
91
+ const messages = builder.build();
92
+
93
+ t.is(messages.length, 1);
94
+ t.is(messages[0].role, 'user');
95
+ t.is(messages[0].content, 'Hello');
96
+ });
97
+
98
+ test('MessageBuilder addErrorMessage adds error as user message', t => {
99
+ const builder = new MessageBuilder([]);
100
+
101
+ builder.addErrorMessage('Error: something went wrong');
102
+ const messages = builder.build();
103
+
104
+ t.is(messages.length, 1);
105
+ t.is(messages[0].role, 'user');
106
+ t.is(messages[0].content, 'Error: something went wrong');
107
+ });
108
+
109
+ test('MessageBuilder supports method chaining', t => {
110
+ const builder = new MessageBuilder([]);
111
+
112
+ const messages = builder
113
+ .addUserMessage('Hello')
114
+ .addAssistantMessage({role: 'assistant', content: 'Hi'})
115
+ .addUserMessage('How are you?')
116
+ .build();
117
+
118
+ t.is(messages.length, 3);
119
+ t.is(messages[0].role, 'user');
120
+ t.is(messages[1].role, 'assistant');
121
+ t.is(messages[2].role, 'user');
122
+ });
123
+
124
+ test('MessageBuilder length property returns correct count', t => {
125
+ const builder = new MessageBuilder([]);
126
+
127
+ t.is(builder.length, 0);
128
+
129
+ builder.addUserMessage('Test');
130
+ t.is(builder.length, 1);
131
+
132
+ builder.addAssistantMessage({role: 'assistant', content: 'Response'});
133
+ t.is(builder.length, 2);
134
+ });
135
+
136
+ test('MessageBuilder isEmpty property works correctly', t => {
137
+ const builder = new MessageBuilder([]);
138
+
139
+ t.true(builder.isEmpty);
140
+
141
+ builder.addUserMessage('Test');
142
+ t.false(builder.isEmpty);
143
+ });
144
+
145
+ test('MessageBuilder builds complete conversation flow', t => {
146
+ const userMsg: Message = {role: 'user', content: 'Read config.json'};
147
+ const assistantMsg: Message = {
148
+ role: 'assistant',
149
+ content: '',
150
+ tool_calls: [
151
+ {
152
+ id: 'call_1',
153
+ function: {
154
+ name: 'read_file',
155
+ arguments: {path: 'config.json'},
156
+ },
157
+ },
158
+ ],
159
+ };
160
+ const toolResult: ToolResult = {
161
+ tool_call_id: 'call_1',
162
+ role: 'tool',
163
+ name: 'read_file',
164
+ content: '{"setting": "value"}',
165
+ };
166
+
167
+ const builder = new MessageBuilder([userMsg]);
168
+ const messages = builder
169
+ .addAssistantMessage(assistantMsg)
170
+ .addToolResults([toolResult])
171
+ .build();
172
+
173
+ t.is(messages.length, 3);
174
+ t.is(messages[0].role, 'user');
175
+ t.is(messages[1].role, 'assistant');
176
+ t.is(messages[1].tool_calls?.length, 1);
177
+ t.is(messages[2].role, 'tool');
178
+ t.is(messages[2].content, '{"setting": "value"}');
179
+ });