@nanocollective/nanocoder 1.18.0 → 1.19.0

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 (603) hide show
  1. package/README.md +176 -8
  2. package/assets/nanocoder-vscode.vsix +0 -0
  3. package/dist/ai-sdk-client-empty-message.spec.js.map +1 -1
  4. package/dist/ai-sdk-client.d.ts +1 -1
  5. package/dist/ai-sdk-client.d.ts.map +1 -1
  6. package/dist/ai-sdk-client.js +261 -150
  7. package/dist/ai-sdk-client.js.map +1 -1
  8. package/dist/app/utils/appUtils.d.ts +1 -1
  9. package/dist/app/utils/appUtils.d.ts.map +1 -1
  10. package/dist/app/utils/appUtils.js +78 -12
  11. package/dist/app/utils/appUtils.js.map +1 -1
  12. package/dist/app.d.ts +22 -1
  13. package/dist/app.d.ts.map +1 -1
  14. package/dist/app.js +353 -48
  15. package/dist/app.js.map +1 -1
  16. package/dist/cli.js +37 -2
  17. package/dist/cli.js.map +1 -1
  18. package/dist/cli.spec.d.ts +2 -0
  19. package/dist/cli.spec.d.ts.map +1 -0
  20. package/dist/cli.spec.js +101 -0
  21. package/dist/cli.spec.js.map +1 -0
  22. package/dist/client-factory.d.ts.map +1 -1
  23. package/dist/client-factory.js +2 -2
  24. package/dist/client-factory.js.map +1 -1
  25. package/dist/commands/checkpoint.d.ts +6 -0
  26. package/dist/commands/checkpoint.d.ts.map +1 -0
  27. package/dist/commands/checkpoint.js +277 -0
  28. package/dist/commands/checkpoint.js.map +1 -0
  29. package/dist/commands/clear.d.ts.map +1 -1
  30. package/dist/commands/clear.js +1 -1
  31. package/dist/commands/clear.js.map +1 -1
  32. package/dist/commands/custom-commands.d.ts.map +1 -1
  33. package/dist/commands/custom-commands.js +4 -4
  34. package/dist/commands/custom-commands.js.map +1 -1
  35. package/dist/commands/exit.d.ts.map +1 -1
  36. package/dist/commands/exit.js.map +1 -1
  37. package/dist/commands/export.d.ts.map +1 -1
  38. package/dist/commands/export.js +2 -2
  39. package/dist/commands/export.js.map +1 -1
  40. package/dist/commands/help.d.ts.map +1 -1
  41. package/dist/commands/help.js +5 -5
  42. package/dist/commands/help.js.map +1 -1
  43. package/dist/commands/index.d.ts +1 -1
  44. package/dist/commands/index.d.ts.map +1 -1
  45. package/dist/commands/index.js +1 -1
  46. package/dist/commands/index.js.map +1 -1
  47. package/dist/commands/init.d.ts.map +1 -1
  48. package/dist/commands/init.js +15 -14
  49. package/dist/commands/init.js.map +1 -1
  50. package/dist/commands/lsp.d.ts.map +1 -1
  51. package/dist/commands/lsp.js +6 -6
  52. package/dist/commands/lsp.js.map +1 -1
  53. package/dist/commands/mcp.d.ts +1 -1
  54. package/dist/commands/mcp.d.ts.map +1 -1
  55. package/dist/commands/mcp.js +6 -6
  56. package/dist/commands/mcp.js.map +1 -1
  57. package/dist/commands/model-database.d.ts.map +1 -1
  58. package/dist/commands/model-database.js +8 -8
  59. package/dist/commands/model-database.js.map +1 -1
  60. package/dist/commands/model.d.ts.map +1 -1
  61. package/dist/commands/model.js.map +1 -1
  62. package/dist/commands/provider.d.ts.map +1 -1
  63. package/dist/commands/provider.js.map +1 -1
  64. package/dist/commands/setup-config.js +1 -1
  65. package/dist/commands/setup-config.js.map +1 -1
  66. package/dist/commands/status.d.ts.map +1 -1
  67. package/dist/commands/status.js.map +1 -1
  68. package/dist/commands/theme.d.ts.map +1 -1
  69. package/dist/commands/theme.js.map +1 -1
  70. package/dist/commands/update.d.ts.map +1 -1
  71. package/dist/commands/update.js +5 -5
  72. package/dist/commands/update.js.map +1 -1
  73. package/dist/commands/usage.d.ts.map +1 -1
  74. package/dist/commands/usage.js +3 -3
  75. package/dist/commands/usage.js.map +1 -1
  76. package/dist/commands.d.ts.map +1 -1
  77. package/dist/commands.js +1 -1
  78. package/dist/commands.js.map +1 -1
  79. package/dist/components/assistant-message.d.ts.map +1 -1
  80. package/dist/components/assistant-message.js +2 -2
  81. package/dist/components/assistant-message.js.map +1 -1
  82. package/dist/components/bash-execution-indicator.d.ts.map +1 -1
  83. package/dist/components/bash-execution-indicator.js +2 -2
  84. package/dist/components/bash-execution-indicator.js.map +1 -1
  85. package/dist/components/cancelling-indicator.js +3 -3
  86. package/dist/components/cancelling-indicator.js.map +1 -1
  87. package/dist/components/chat-queue.d.ts.map +1 -1
  88. package/dist/components/chat-queue.js +1 -1
  89. package/dist/components/chat-queue.js.map +1 -1
  90. package/dist/components/checkpoint-display.d.ts +8 -0
  91. package/dist/components/checkpoint-display.d.ts.map +1 -0
  92. package/dist/components/checkpoint-display.js +29 -0
  93. package/dist/components/checkpoint-display.js.map +1 -0
  94. package/dist/components/checkpoint-selector.d.ts +11 -0
  95. package/dist/components/checkpoint-selector.d.ts.map +1 -0
  96. package/dist/components/checkpoint-selector.js +55 -0
  97. package/dist/components/checkpoint-selector.js.map +1 -0
  98. package/dist/components/error-message.d.ts.map +1 -1
  99. package/dist/components/error-message.js +4 -4
  100. package/dist/components/error-message.js.map +1 -1
  101. package/dist/components/info-message.d.ts.map +1 -1
  102. package/dist/components/info-message.js +4 -4
  103. package/dist/components/info-message.js.map +1 -1
  104. package/dist/components/model-selector.d.ts.map +1 -1
  105. package/dist/components/model-selector.js +7 -7
  106. package/dist/components/model-selector.js.map +1 -1
  107. package/dist/components/provider-selector.d.ts.map +1 -1
  108. package/dist/components/provider-selector.js +6 -6
  109. package/dist/components/provider-selector.js.map +1 -1
  110. package/dist/components/security-disclaimer.d.ts.map +1 -1
  111. package/dist/components/security-disclaimer.js +4 -4
  112. package/dist/components/security-disclaimer.js.map +1 -1
  113. package/dist/components/status.d.ts +3 -1
  114. package/dist/components/status.d.ts.map +1 -1
  115. package/dist/components/status.js +17 -9
  116. package/dist/components/status.js.map +1 -1
  117. package/dist/components/success-message.d.ts.map +1 -1
  118. package/dist/components/success-message.js +4 -4
  119. package/dist/components/success-message.js.map +1 -1
  120. package/dist/components/theme-selector.d.ts.map +1 -1
  121. package/dist/components/theme-selector.js +8 -8
  122. package/dist/components/theme-selector.js.map +1 -1
  123. package/dist/components/tool-confirmation.d.ts.map +1 -1
  124. package/dist/components/tool-confirmation.js +7 -7
  125. package/dist/components/tool-confirmation.js.map +1 -1
  126. package/dist/components/tool-execution-indicator.d.ts.map +1 -1
  127. package/dist/components/tool-execution-indicator.js +2 -2
  128. package/dist/components/tool-execution-indicator.js.map +1 -1
  129. package/dist/components/tool-message.d.ts.map +1 -1
  130. package/dist/components/tool-message.js +4 -5
  131. package/dist/components/tool-message.js.map +1 -1
  132. package/dist/components/ui/titled-box.d.ts +16 -0
  133. package/dist/components/ui/titled-box.d.ts.map +1 -0
  134. package/dist/components/ui/titled-box.js +10 -0
  135. package/dist/components/ui/titled-box.js.map +1 -0
  136. package/dist/components/usage/progress-bar.d.ts.map +1 -1
  137. package/dist/components/usage/progress-bar.js +3 -0
  138. package/dist/components/usage/progress-bar.js.map +1 -1
  139. package/dist/components/usage/usage-display.d.ts.map +1 -1
  140. package/dist/components/usage/usage-display.js +7 -4
  141. package/dist/components/usage/usage-display.js.map +1 -1
  142. package/dist/components/user-input.d.ts.map +1 -1
  143. package/dist/components/user-input.js +7 -7
  144. package/dist/components/user-input.js.map +1 -1
  145. package/dist/components/user-message.d.ts.map +1 -1
  146. package/dist/components/user-message.js +1 -1
  147. package/dist/components/user-message.js.map +1 -1
  148. package/dist/components/vscode-extension-prompt.js +3 -3
  149. package/dist/components/vscode-extension-prompt.js.map +1 -1
  150. package/dist/components/warning-message.d.ts.map +1 -1
  151. package/dist/components/warning-message.js +4 -4
  152. package/dist/components/warning-message.js.map +1 -1
  153. package/dist/components/welcome-message.d.ts.map +1 -1
  154. package/dist/components/welcome-message.js +4 -4
  155. package/dist/components/welcome-message.js.map +1 -1
  156. package/dist/config/index.d.ts.map +1 -1
  157. package/dist/config/index.js +7 -7
  158. package/dist/config/index.js.map +1 -1
  159. package/dist/config/index.spec.js +4 -4
  160. package/dist/config/index.spec.js.map +1 -1
  161. package/dist/config/paths.spec.js +1 -1
  162. package/dist/config/paths.spec.js.map +1 -1
  163. package/dist/config/preferences.d.ts +0 -2
  164. package/dist/config/preferences.d.ts.map +1 -1
  165. package/dist/config/preferences.js +1 -11
  166. package/dist/config/preferences.js.map +1 -1
  167. package/dist/custom-commands/executor.d.ts.map +1 -1
  168. package/dist/custom-commands/executor.js.map +1 -1
  169. package/dist/custom-commands/loader.d.ts.map +1 -1
  170. package/dist/custom-commands/loader.js +1 -1
  171. package/dist/custom-commands/loader.js.map +1 -1
  172. package/dist/custom-commands/parser.d.ts.map +1 -1
  173. package/dist/custom-commands/parser.js.map +1 -1
  174. package/dist/hooks/useAppInitialization.d.ts +7 -5
  175. package/dist/hooks/useAppInitialization.d.ts.map +1 -1
  176. package/dist/hooks/useAppInitialization.js +21 -22
  177. package/dist/hooks/useAppInitialization.js.map +1 -1
  178. package/dist/hooks/useAppState.d.ts +22 -5
  179. package/dist/hooks/useAppState.d.ts.map +1 -1
  180. package/dist/hooks/useAppState.js +17 -1
  181. package/dist/hooks/useAppState.js.map +1 -1
  182. package/dist/hooks/useChatHandler.d.ts +4 -2
  183. package/dist/hooks/useChatHandler.d.ts.map +1 -1
  184. package/dist/hooks/useChatHandler.js +35 -10
  185. package/dist/hooks/useChatHandler.js.map +1 -1
  186. package/dist/hooks/useDirectoryTrust.js +1 -1
  187. package/dist/hooks/useDirectoryTrust.js.map +1 -1
  188. package/dist/hooks/useInputState.js +2 -2
  189. package/dist/hooks/useInputState.js.map +1 -1
  190. package/dist/hooks/useModeHandlers.d.ts +1 -1
  191. package/dist/hooks/useModeHandlers.d.ts.map +1 -1
  192. package/dist/hooks/useModeHandlers.js +3 -3
  193. package/dist/hooks/useModeHandlers.js.map +1 -1
  194. package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
  195. package/dist/hooks/useTerminalWidth.js +3 -3
  196. package/dist/hooks/useTerminalWidth.js.map +1 -1
  197. package/dist/hooks/useTheme.d.ts.map +1 -1
  198. package/dist/hooks/useTheme.js +1 -1
  199. package/dist/hooks/useTheme.js.map +1 -1
  200. package/dist/hooks/useToolHandler.d.ts +1 -1
  201. package/dist/hooks/useToolHandler.d.ts.map +1 -1
  202. package/dist/hooks/useToolHandler.js +4 -4
  203. package/dist/hooks/useToolHandler.js.map +1 -1
  204. package/dist/hooks/useUIState.d.ts +1 -1
  205. package/dist/hooks/useUIState.d.ts.map +1 -1
  206. package/dist/hooks/useUIState.js.map +1 -1
  207. package/dist/hooks/useVSCodeServer.js +2 -2
  208. package/dist/hooks/useVSCodeServer.js.map +1 -1
  209. package/dist/init/agents-template-generator.d.ts +1 -1
  210. package/dist/init/agents-template-generator.d.ts.map +1 -1
  211. package/dist/init/agents-template-generator.js.map +1 -1
  212. package/dist/init/existing-rules-extractor.js +1 -1
  213. package/dist/init/existing-rules-extractor.js.map +1 -1
  214. package/dist/init/file-scanner.js +2 -2
  215. package/dist/init/file-scanner.js.map +1 -1
  216. package/dist/init/framework-detector.js +1 -1
  217. package/dist/init/framework-detector.js.map +1 -1
  218. package/dist/init/project-analyzer.d.ts +1 -1
  219. package/dist/init/project-analyzer.d.ts.map +1 -1
  220. package/dist/init/project-analyzer.js +3 -3
  221. package/dist/init/project-analyzer.js.map +1 -1
  222. package/dist/lsp/lsp-client.d.ts +1 -1
  223. package/dist/lsp/lsp-client.d.ts.map +1 -1
  224. package/dist/lsp/lsp-client.js +1 -1
  225. package/dist/lsp/lsp-client.js.map +1 -1
  226. package/dist/lsp/lsp-client.spec.js +1 -2
  227. package/dist/lsp/lsp-client.spec.js.map +1 -1
  228. package/dist/lsp/lsp-manager.d.ts +1 -1
  229. package/dist/lsp/lsp-manager.d.ts.map +1 -1
  230. package/dist/lsp/lsp-manager.js.map +1 -1
  231. package/dist/lsp/lsp-manager.spec.js +1 -1
  232. package/dist/lsp/lsp-manager.spec.js.map +1 -1
  233. package/dist/lsp/protocol.spec.js +1 -1
  234. package/dist/lsp/protocol.spec.js.map +1 -1
  235. package/dist/lsp/server-discovery.spec.js +1 -1
  236. package/dist/lsp/server-discovery.spec.js.map +1 -1
  237. package/dist/markdown-parser/index.spec.js.map +1 -1
  238. package/dist/markdown-parser/table-parser.spec.js.map +1 -1
  239. package/dist/mcp/mcp-client.d.ts +3 -2
  240. package/dist/mcp/mcp-client.d.ts.map +1 -1
  241. package/dist/mcp/mcp-client.js +264 -91
  242. package/dist/mcp/mcp-client.js.map +1 -1
  243. package/dist/mcp/transport-factory.d.ts +1 -1
  244. package/dist/mcp/transport-factory.d.ts.map +1 -1
  245. package/dist/mcp/transport-factory.js +16 -3
  246. package/dist/mcp/transport-factory.js.map +1 -1
  247. package/dist/mcp/transport-factory.spec.js +30 -48
  248. package/dist/mcp/transport-factory.spec.js.map +1 -1
  249. package/dist/message-handler.d.ts +1 -1
  250. package/dist/message-handler.d.ts.map +1 -1
  251. package/dist/model-database/database-engine.d.ts.map +1 -1
  252. package/dist/model-database/database-engine.js.map +1 -1
  253. package/dist/model-database/database-engine.spec.js.map +1 -1
  254. package/dist/model-database/model-database.js +1 -1
  255. package/dist/model-database/model-database.js.map +1 -1
  256. package/dist/model-database/model-engine.d.ts.map +1 -1
  257. package/dist/model-database/model-engine.js.map +1 -1
  258. package/dist/model-database/model-engine.spec.js +1 -1
  259. package/dist/model-database/model-engine.spec.js.map +1 -1
  260. package/dist/model-database/model-fetcher.d.ts.map +1 -1
  261. package/dist/model-database/model-fetcher.js +2 -1
  262. package/dist/model-database/model-fetcher.js.map +1 -1
  263. package/dist/model-database/model-fetcher.spec.js +1 -1
  264. package/dist/model-database/model-fetcher.spec.js.map +1 -1
  265. package/dist/models/models-cache.d.ts +1 -1
  266. package/dist/models/models-cache.d.ts.map +1 -1
  267. package/dist/models/models-cache.js +1 -1
  268. package/dist/models/models-cache.js.map +1 -1
  269. package/dist/models/models-dev-client.d.ts.map +1 -1
  270. package/dist/models/models-dev-client.js +18 -10
  271. package/dist/models/models-dev-client.js.map +1 -1
  272. package/dist/prompt-history.js +2 -2
  273. package/dist/prompt-history.js.map +1 -1
  274. package/dist/services/checkpoint-manager.d.ts +68 -0
  275. package/dist/services/checkpoint-manager.d.ts.map +1 -0
  276. package/dist/services/checkpoint-manager.js +345 -0
  277. package/dist/services/checkpoint-manager.js.map +1 -0
  278. package/dist/services/checkpoint-manager.spec.d.ts +2 -0
  279. package/dist/services/checkpoint-manager.spec.d.ts.map +1 -0
  280. package/dist/services/checkpoint-manager.spec.js +353 -0
  281. package/dist/services/checkpoint-manager.spec.js.map +1 -0
  282. package/dist/services/file-snapshot.d.ts +32 -0
  283. package/dist/services/file-snapshot.d.ts.map +1 -0
  284. package/dist/services/file-snapshot.js +161 -0
  285. package/dist/services/file-snapshot.js.map +1 -0
  286. package/dist/services/file-snapshot.spec.d.ts +2 -0
  287. package/dist/services/file-snapshot.spec.d.ts.map +1 -0
  288. package/dist/services/file-snapshot.spec.js +285 -0
  289. package/dist/services/file-snapshot.spec.js.map +1 -0
  290. package/dist/test-utils/render-with-theme.d.ts +7 -0
  291. package/dist/test-utils/render-with-theme.d.ts.map +1 -0
  292. package/dist/test-utils/render-with-theme.js +38 -0
  293. package/dist/test-utils/render-with-theme.js.map +1 -0
  294. package/dist/tokenization/tokenizer-factory.js +2 -2
  295. package/dist/tokenization/tokenizer-factory.js.map +1 -1
  296. package/dist/tokenization/tokenizer-factory.spec.js +2 -2
  297. package/dist/tokenization/tokenizer-factory.spec.js.map +1 -1
  298. package/dist/tokenization/tokenizers/anthropic-tokenizer.d.ts +1 -1
  299. package/dist/tokenization/tokenizers/anthropic-tokenizer.d.ts.map +1 -1
  300. package/dist/tokenization/tokenizers/anthropic-tokenizer.js.map +1 -1
  301. package/dist/tokenization/tokenizers/anthropic-tokenizer.spec.js.map +1 -1
  302. package/dist/tokenization/tokenizers/fallback-tokenizer.d.ts +1 -1
  303. package/dist/tokenization/tokenizers/fallback-tokenizer.d.ts.map +1 -1
  304. package/dist/tokenization/tokenizers/fallback-tokenizer.spec.js.map +1 -1
  305. package/dist/tokenization/tokenizers/llama-tokenizer.d.ts +1 -1
  306. package/dist/tokenization/tokenizers/llama-tokenizer.d.ts.map +1 -1
  307. package/dist/tokenization/tokenizers/llama-tokenizer.js.map +1 -1
  308. package/dist/tokenization/tokenizers/llama-tokenizer.spec.js.map +1 -1
  309. package/dist/tokenization/tokenizers/openai-tokenizer.d.ts +1 -1
  310. package/dist/tokenization/tokenizers/openai-tokenizer.d.ts.map +1 -1
  311. package/dist/tokenization/tokenizers/openai-tokenizer.js.map +1 -1
  312. package/dist/tokenization/tokenizers/openai-tokenizer.spec.js.map +1 -1
  313. package/dist/tool-calling/json-parser.d.ts.map +1 -1
  314. package/dist/tool-calling/json-parser.js +2 -10
  315. package/dist/tool-calling/json-parser.js.map +1 -1
  316. package/dist/tool-calling/json-parser.spec.js +7 -7
  317. package/dist/tool-calling/json-parser.spec.js.map +1 -1
  318. package/dist/tool-calling/tool-parser.d.ts.map +1 -1
  319. package/dist/tool-calling/tool-parser.js +1 -1
  320. package/dist/tool-calling/tool-parser.js.map +1 -1
  321. package/dist/tool-calling/tool-parser.spec.js +3 -3
  322. package/dist/tool-calling/tool-parser.spec.js.map +1 -1
  323. package/dist/tools/create-file.d.ts.map +1 -1
  324. package/dist/tools/create-file.js +7 -7
  325. package/dist/tools/create-file.js.map +1 -1
  326. package/dist/tools/delete-lines.d.ts.map +1 -1
  327. package/dist/tools/delete-lines.js +9 -9
  328. package/dist/tools/delete-lines.js.map +1 -1
  329. package/dist/tools/execute-bash.d.ts.map +1 -1
  330. package/dist/tools/execute-bash.js +3 -3
  331. package/dist/tools/execute-bash.js.map +1 -1
  332. package/dist/tools/execute-function.spec.js +4 -4
  333. package/dist/tools/execute-function.spec.js.map +1 -1
  334. package/dist/tools/fetch-url.d.ts.map +1 -1
  335. package/dist/tools/fetch-url.js +3 -3
  336. package/dist/tools/fetch-url.js.map +1 -1
  337. package/dist/tools/find-files.d.ts.map +1 -1
  338. package/dist/tools/find-files.js +6 -6
  339. package/dist/tools/find-files.js.map +1 -1
  340. package/dist/tools/index.d.ts +1 -1
  341. package/dist/tools/index.d.ts.map +1 -1
  342. package/dist/tools/index.js +7 -7
  343. package/dist/tools/index.js.map +1 -1
  344. package/dist/tools/insert-lines.d.ts.map +1 -1
  345. package/dist/tools/insert-lines.js +8 -8
  346. package/dist/tools/insert-lines.js.map +1 -1
  347. package/dist/tools/lsp-get-diagnostics.d.ts.map +1 -1
  348. package/dist/tools/lsp-get-diagnostics.js +5 -5
  349. package/dist/tools/lsp-get-diagnostics.js.map +1 -1
  350. package/dist/tools/needs-approval.spec.js +6 -6
  351. package/dist/tools/needs-approval.spec.js.map +1 -1
  352. package/dist/tools/read-file.js +6 -6
  353. package/dist/tools/read-file.js.map +1 -1
  354. package/dist/tools/replace-lines.d.ts.map +1 -1
  355. package/dist/tools/replace-lines.js +8 -8
  356. package/dist/tools/replace-lines.js.map +1 -1
  357. package/dist/tools/search-file-contents.d.ts.map +1 -1
  358. package/dist/tools/search-file-contents.js +6 -6
  359. package/dist/tools/search-file-contents.js.map +1 -1
  360. package/dist/tools/tool-manager.d.ts +1 -1
  361. package/dist/tools/tool-manager.d.ts.map +1 -1
  362. package/dist/tools/tool-manager.js +1 -1
  363. package/dist/tools/tool-manager.js.map +1 -1
  364. package/dist/tools/tool-registry.d.ts +1 -1
  365. package/dist/tools/tool-registry.d.ts.map +1 -1
  366. package/dist/tools/web-search.d.ts.map +1 -1
  367. package/dist/tools/web-search.js +4 -4
  368. package/dist/tools/web-search.js.map +1 -1
  369. package/dist/types/app.d.ts +6 -3
  370. package/dist/types/app.d.ts.map +1 -1
  371. package/dist/types/checkpoint.d.ts +43 -0
  372. package/dist/types/checkpoint.d.ts.map +1 -0
  373. package/dist/types/checkpoint.js +2 -0
  374. package/dist/types/checkpoint.js.map +1 -0
  375. package/dist/types/config.d.ts +0 -1
  376. package/dist/types/config.d.ts.map +1 -1
  377. package/dist/types/core-connection-status.spec.js.map +1 -1
  378. package/dist/types/core.d.ts +1 -1
  379. package/dist/types/core.d.ts.map +1 -1
  380. package/dist/types/core.js +1 -1
  381. package/dist/types/core.js.map +1 -1
  382. package/dist/types/index.d.ts +1 -0
  383. package/dist/types/index.d.ts.map +1 -1
  384. package/dist/types/index.js +1 -0
  385. package/dist/types/index.js.map +1 -1
  386. package/dist/usage/calculator.spec.js +1 -1
  387. package/dist/usage/calculator.spec.js.map +1 -1
  388. package/dist/usage/storage.d.ts +1 -1
  389. package/dist/usage/storage.d.ts.map +1 -1
  390. package/dist/usage/storage.js +9 -3
  391. package/dist/usage/storage.js.map +1 -1
  392. package/dist/usage/storage.spec.js +3 -3
  393. package/dist/usage/storage.spec.js.map +1 -1
  394. package/dist/usage/tracker.d.ts.map +1 -1
  395. package/dist/usage/tracker.js +1 -1
  396. package/dist/usage/tracker.js.map +1 -1
  397. package/dist/usage/tracker.spec.js +4 -4
  398. package/dist/usage/tracker.spec.js.map +1 -1
  399. package/dist/utils/atomic-deletion.spec.js +1 -1
  400. package/dist/utils/atomic-deletion.spec.js.map +1 -1
  401. package/dist/utils/checkpoint-utils.d.ts +12 -0
  402. package/dist/utils/checkpoint-utils.d.ts.map +1 -0
  403. package/dist/utils/checkpoint-utils.js +85 -0
  404. package/dist/utils/checkpoint-utils.js.map +1 -0
  405. package/dist/utils/checkpoint-utils.spec.d.ts +2 -0
  406. package/dist/utils/checkpoint-utils.spec.d.ts.map +1 -0
  407. package/dist/utils/checkpoint-utils.spec.js +182 -0
  408. package/dist/utils/checkpoint-utils.spec.js.map +1 -0
  409. package/dist/utils/error-formatter.d.ts +35 -0
  410. package/dist/utils/error-formatter.d.ts.map +1 -1
  411. package/dist/utils/error-formatter.js +123 -0
  412. package/dist/utils/error-formatter.js.map +1 -1
  413. package/dist/utils/file-autocomplete.js +2 -2
  414. package/dist/utils/file-autocomplete.js.map +1 -1
  415. package/dist/utils/file-autocomplete.spec.js +1 -1
  416. package/dist/utils/file-autocomplete.spec.js.map +1 -1
  417. package/dist/utils/file-content-loader.js +1 -1
  418. package/dist/utils/file-content-loader.js.map +1 -1
  419. package/dist/utils/file-content-loader.spec.js +4 -4
  420. package/dist/utils/file-content-loader.spec.js.map +1 -1
  421. package/dist/utils/file-mention-handler.js.map +1 -1
  422. package/dist/utils/file-mention-handler.spec.js +4 -4
  423. package/dist/utils/file-mention-handler.spec.js.map +1 -1
  424. package/dist/utils/file-mention-parser.spec.js +2 -2
  425. package/dist/utils/file-mention-parser.spec.js.map +1 -1
  426. package/dist/utils/installation-detector.js +2 -2
  427. package/dist/utils/installation-detector.js.map +1 -1
  428. package/dist/utils/installation-detector.spec.js +10 -17
  429. package/dist/utils/installation-detector.spec.js.map +1 -1
  430. package/dist/utils/logging/config.d.ts +41 -0
  431. package/dist/utils/logging/config.d.ts.map +1 -0
  432. package/dist/utils/logging/config.js +188 -0
  433. package/dist/utils/logging/config.js.map +1 -0
  434. package/dist/utils/logging/config.spec.d.ts +2 -0
  435. package/dist/utils/logging/config.spec.d.ts.map +1 -0
  436. package/dist/utils/logging/config.spec.js +233 -0
  437. package/dist/utils/logging/config.spec.js.map +1 -0
  438. package/dist/utils/logging/console-facade.d.ts +93 -0
  439. package/dist/utils/logging/console-facade.d.ts.map +1 -0
  440. package/dist/utils/logging/console-facade.js +295 -0
  441. package/dist/utils/logging/console-facade.js.map +1 -0
  442. package/dist/utils/logging/console-facade.spec.d.ts +2 -0
  443. package/dist/utils/logging/console-facade.spec.d.ts.map +1 -0
  444. package/dist/utils/logging/console-facade.spec.js +143 -0
  445. package/dist/utils/logging/console-facade.spec.js.map +1 -0
  446. package/dist/utils/logging/correlation.d.ts +139 -0
  447. package/dist/utils/logging/correlation.d.ts.map +1 -0
  448. package/dist/utils/logging/correlation.js +410 -0
  449. package/dist/utils/logging/correlation.js.map +1 -0
  450. package/dist/utils/logging/correlation.spec.d.ts +2 -0
  451. package/dist/utils/logging/correlation.spec.d.ts.map +1 -0
  452. package/dist/utils/logging/correlation.spec.js +449 -0
  453. package/dist/utils/logging/correlation.spec.js.map +1 -0
  454. package/dist/utils/logging/formatters.d.ts +70 -0
  455. package/dist/utils/logging/formatters.d.ts.map +1 -0
  456. package/dist/utils/logging/formatters.js +186 -0
  457. package/dist/utils/logging/formatters.js.map +1 -0
  458. package/dist/utils/logging/formatters.spec.d.ts +2 -0
  459. package/dist/utils/logging/formatters.spec.d.ts.map +1 -0
  460. package/dist/utils/logging/formatters.spec.js +356 -0
  461. package/dist/utils/logging/formatters.spec.js.map +1 -0
  462. package/dist/utils/logging/health-monitor.d.ts +216 -0
  463. package/dist/utils/logging/health-monitor.d.ts.map +1 -0
  464. package/dist/utils/logging/health-monitor.js +760 -0
  465. package/dist/utils/logging/health-monitor.js.map +1 -0
  466. package/dist/utils/logging/health-monitor.spec.d.ts +2 -0
  467. package/dist/utils/logging/health-monitor.spec.d.ts.map +1 -0
  468. package/dist/utils/logging/health-monitor.spec.js +305 -0
  469. package/dist/utils/logging/health-monitor.spec.js.map +1 -0
  470. package/dist/utils/logging/index.d.ts +100 -0
  471. package/dist/utils/logging/index.d.ts.map +1 -0
  472. package/dist/utils/logging/index.js +186 -0
  473. package/dist/utils/logging/index.js.map +1 -0
  474. package/dist/utils/logging/index.spec.d.ts +2 -0
  475. package/dist/utils/logging/index.spec.d.ts.map +1 -0
  476. package/dist/utils/logging/index.spec.js +214 -0
  477. package/dist/utils/logging/index.spec.js.map +1 -0
  478. package/dist/utils/logging/integration.spec.d.ts +2 -0
  479. package/dist/utils/logging/integration.spec.d.ts.map +1 -0
  480. package/dist/utils/logging/integration.spec.js +312 -0
  481. package/dist/utils/logging/integration.spec.js.map +1 -0
  482. package/dist/utils/logging/log-method-factory.d.ts +43 -0
  483. package/dist/utils/logging/log-method-factory.d.ts.map +1 -0
  484. package/dist/utils/logging/log-method-factory.js +176 -0
  485. package/dist/utils/logging/log-method-factory.js.map +1 -0
  486. package/dist/utils/logging/log-method-factory.spec.d.ts +2 -0
  487. package/dist/utils/logging/log-method-factory.spec.d.ts.map +1 -0
  488. package/dist/utils/logging/log-method-factory.spec.js +428 -0
  489. package/dist/utils/logging/log-method-factory.spec.js.map +1 -0
  490. package/dist/utils/logging/log-query.d.ts +275 -0
  491. package/dist/utils/logging/log-query.d.ts.map +1 -0
  492. package/dist/utils/logging/log-query.js +621 -0
  493. package/dist/utils/logging/log-query.js.map +1 -0
  494. package/dist/utils/logging/log-query.spec.d.ts +2 -0
  495. package/dist/utils/logging/log-query.spec.d.ts.map +1 -0
  496. package/dist/utils/logging/log-query.spec.js +737 -0
  497. package/dist/utils/logging/log-query.spec.js.map +1 -0
  498. package/dist/utils/logging/logger-provider.d.ts +73 -0
  499. package/dist/utils/logging/logger-provider.d.ts.map +1 -0
  500. package/dist/utils/logging/logger-provider.js +298 -0
  501. package/dist/utils/logging/logger-provider.js.map +1 -0
  502. package/dist/utils/logging/logger-provider.spec.d.ts +2 -0
  503. package/dist/utils/logging/logger-provider.spec.d.ts.map +1 -0
  504. package/dist/utils/logging/logger-provider.spec.js +204 -0
  505. package/dist/utils/logging/logger-provider.spec.js.map +1 -0
  506. package/dist/utils/logging/performance.d.ts +147 -0
  507. package/dist/utils/logging/performance.d.ts.map +1 -0
  508. package/dist/utils/logging/performance.js +520 -0
  509. package/dist/utils/logging/performance.js.map +1 -0
  510. package/dist/utils/logging/performance.spec.d.ts +2 -0
  511. package/dist/utils/logging/performance.spec.d.ts.map +1 -0
  512. package/dist/utils/logging/performance.spec.js +139 -0
  513. package/dist/utils/logging/performance.spec.js.map +1 -0
  514. package/dist/utils/logging/pino-logger.d.ts +22 -0
  515. package/dist/utils/logging/pino-logger.d.ts.map +1 -0
  516. package/dist/utils/logging/pino-logger.js +372 -0
  517. package/dist/utils/logging/pino-logger.js.map +1 -0
  518. package/dist/utils/logging/pino-logger.spec.d.ts +2 -0
  519. package/dist/utils/logging/pino-logger.spec.d.ts.map +1 -0
  520. package/dist/utils/logging/pino-logger.spec.js +294 -0
  521. package/dist/utils/logging/pino-logger.spec.js.map +1 -0
  522. package/dist/utils/logging/redaction.d.ts +38 -0
  523. package/dist/utils/logging/redaction.d.ts.map +1 -0
  524. package/dist/utils/logging/redaction.js +210 -0
  525. package/dist/utils/logging/redaction.js.map +1 -0
  526. package/dist/utils/logging/redaction.spec.d.ts +2 -0
  527. package/dist/utils/logging/redaction.spec.d.ts.map +1 -0
  528. package/dist/utils/logging/redaction.spec.js +338 -0
  529. package/dist/utils/logging/redaction.spec.js.map +1 -0
  530. package/dist/utils/logging/request-tracker.d.ts +189 -0
  531. package/dist/utils/logging/request-tracker.d.ts.map +1 -0
  532. package/dist/utils/logging/request-tracker.js +569 -0
  533. package/dist/utils/logging/request-tracker.js.map +1 -0
  534. package/dist/utils/logging/request-tracker.spec.d.ts +2 -0
  535. package/dist/utils/logging/request-tracker.spec.d.ts.map +1 -0
  536. package/dist/utils/logging/request-tracker.spec.js +868 -0
  537. package/dist/utils/logging/request-tracker.spec.js.map +1 -0
  538. package/dist/utils/logging/transports.d.ts +55 -0
  539. package/dist/utils/logging/transports.d.ts.map +1 -0
  540. package/dist/utils/logging/transports.js +252 -0
  541. package/dist/utils/logging/transports.js.map +1 -0
  542. package/dist/utils/logging/transports.spec.d.ts +2 -0
  543. package/dist/utils/logging/transports.spec.d.ts.map +1 -0
  544. package/dist/utils/logging/transports.spec.js +390 -0
  545. package/dist/utils/logging/transports.spec.js.map +1 -0
  546. package/dist/utils/logging/types.d.ts +173 -0
  547. package/dist/utils/logging/types.d.ts.map +1 -0
  548. package/dist/utils/logging/types.js +5 -0
  549. package/dist/utils/logging/types.js.map +1 -0
  550. package/dist/utils/message-queue.d.ts +64 -4
  551. package/dist/utils/message-queue.d.ts.map +1 -1
  552. package/dist/utils/message-queue.js +282 -28
  553. package/dist/utils/message-queue.js.map +1 -1
  554. package/dist/utils/paste-utils.spec.js +1 -1
  555. package/dist/utils/paste-utils.spec.js.map +1 -1
  556. package/dist/utils/prompt-processor.js +2 -2
  557. package/dist/utils/prompt-processor.js.map +1 -1
  558. package/dist/utils/tool-cancellation.spec.js.map +1 -1
  559. package/dist/utils/tool-result-display.d.ts +2 -2
  560. package/dist/utils/tool-result-display.d.ts.map +1 -1
  561. package/dist/utils/tool-result-display.js +3 -3
  562. package/dist/utils/tool-result-display.js.map +1 -1
  563. package/dist/utils/update-checker.d.ts.map +1 -1
  564. package/dist/utils/update-checker.js +1 -1
  565. package/dist/utils/update-checker.js.map +1 -1
  566. package/dist/utils/update-checker.spec.js +2 -2
  567. package/dist/utils/update-checker.spec.js.map +1 -1
  568. package/dist/vscode/extension-installer.js +1 -1
  569. package/dist/vscode/extension-installer.js.map +1 -1
  570. package/dist/vscode/extension-installer.spec.js +1 -1
  571. package/dist/vscode/extension-installer.spec.js.map +1 -1
  572. package/dist/vscode/protocol.spec.js +1 -1
  573. package/dist/vscode/protocol.spec.js.map +1 -1
  574. package/dist/vscode/vscode-server.d.ts.map +1 -1
  575. package/dist/vscode/vscode-server.js +2 -2
  576. package/dist/vscode/vscode-server.js.map +1 -1
  577. package/dist/vscode/vscode-server.spec.js.map +1 -1
  578. package/dist/wizard/config-wizard.d.ts.map +1 -1
  579. package/dist/wizard/config-wizard.js +16 -12
  580. package/dist/wizard/config-wizard.js.map +1 -1
  581. package/dist/wizard/steps/location-step.js +4 -4
  582. package/dist/wizard/steps/location-step.js.map +1 -1
  583. package/dist/wizard/steps/mcp-step.d.ts.map +1 -1
  584. package/dist/wizard/steps/mcp-step.js +4 -4
  585. package/dist/wizard/steps/mcp-step.js.map +1 -1
  586. package/dist/wizard/steps/provider-step.d.ts.map +1 -1
  587. package/dist/wizard/steps/provider-step.js +4 -4
  588. package/dist/wizard/steps/provider-step.js.map +1 -1
  589. package/dist/wizard/steps/summary-step.d.ts.map +1 -1
  590. package/dist/wizard/steps/summary-step.js +2 -2
  591. package/dist/wizard/steps/summary-step.js.map +1 -1
  592. package/dist/wizard/templates/provider-templates.d.ts.map +1 -1
  593. package/dist/wizard/templates/provider-templates.js +64 -0
  594. package/dist/wizard/templates/provider-templates.js.map +1 -1
  595. package/dist/wizard/validation-array.spec.js +1 -1
  596. package/dist/wizard/validation-array.spec.js.map +1 -1
  597. package/dist/wizard/validation.spec.js +1 -1
  598. package/dist/wizard/validation.spec.js.map +1 -1
  599. package/package.json +23 -22
  600. package/dist/commands/debugging.d.ts +0 -3
  601. package/dist/commands/debugging.d.ts.map +0 -1
  602. package/dist/commands/debugging.js +0 -23
  603. package/dist/commands/debugging.js.map +0 -1
@@ -0,0 +1,737 @@
1
+ import test from 'ava';
2
+ import LogStorage, { LogQueryBuilder, createLogQuery, logQueries, globalLogStorage, } from './log-query.js';
3
+ // Helper function to create test log entries
4
+ function createTestLogEntry(overrides = {}) {
5
+ return {
6
+ timestamp: new Date().toISOString(),
7
+ level: 'info',
8
+ message: 'Test message',
9
+ correlationId: 'test-correlation',
10
+ source: 'test-source',
11
+ requestId: 'test-request',
12
+ userId: 'test-user',
13
+ sessionId: 'test-session',
14
+ tags: ['test', 'logging'],
15
+ metadata: { key: 'value' },
16
+ error: undefined,
17
+ performance: {
18
+ duration: 100,
19
+ memory: { heapUsed: 1024, heapTotal: 2048 },
20
+ cpu: 0.5,
21
+ },
22
+ request: {
23
+ method: 'GET',
24
+ url: '/test',
25
+ statusCode: 200,
26
+ duration: 50,
27
+ size: 1024,
28
+ },
29
+ ...overrides,
30
+ };
31
+ }
32
+ // Test LogStorage class
33
+ // ============================================================================
34
+ test('LogStorage constructor creates instance with default maxEntries', t => {
35
+ const storage = new LogStorage();
36
+ t.truthy(storage);
37
+ t.is(storage.getEntryCount(), 0);
38
+ });
39
+ test('LogStorage constructor accepts custom maxEntries', t => {
40
+ const storage = new LogStorage(100);
41
+ t.truthy(storage);
42
+ t.is(storage.getEntryCount(), 0);
43
+ });
44
+ test('LogStorage addEntry adds log entry', t => {
45
+ const storage = new LogStorage();
46
+ const entry = createTestLogEntry();
47
+ storage.addEntry(entry);
48
+ t.is(storage.getEntryCount(), 1);
49
+ });
50
+ test('LogStorage addEntry handles multiple entries', t => {
51
+ const storage = new LogStorage();
52
+ for (let i = 0; i < 10; i++) {
53
+ storage.addEntry(createTestLogEntry({ message: `Message ${i}` }));
54
+ }
55
+ t.is(storage.getEntryCount(), 10);
56
+ });
57
+ test('LogStorage addEntry respects maxEntries limit', t => {
58
+ const storage = new LogStorage(5);
59
+ // Add more entries than limit
60
+ for (let i = 0; i < 10; i++) {
61
+ storage.addEntry(createTestLogEntry({ message: `Message ${i}` }));
62
+ }
63
+ // Should only keep maxEntries
64
+ t.is(storage.getEntryCount(), 5);
65
+ });
66
+ test('LogStorage query returns QueryResult', t => {
67
+ const storage = new LogStorage();
68
+ storage.addEntry(createTestLogEntry());
69
+ const result = storage.query({});
70
+ t.truthy(result);
71
+ t.true('entries' in result);
72
+ t.true('totalCount' in result);
73
+ t.true('filteredCount' in result);
74
+ t.true('queryTime' in result);
75
+ t.true('hasMore' in result);
76
+ });
77
+ test('LogStorage query returns correct entry count', t => {
78
+ const storage = new LogStorage();
79
+ storage.addEntry(createTestLogEntry({ message: 'Entry 1' }));
80
+ storage.addEntry(createTestLogEntry({ message: 'Entry 2' }));
81
+ storage.addEntry(createTestLogEntry({ message: 'Entry 3' }));
82
+ const result = storage.query({});
83
+ t.is(result.totalCount, 3);
84
+ t.is(result.filteredCount, 3);
85
+ t.is(result.entries.length, 3);
86
+ });
87
+ test('LogStorage query with limit returns limited results', t => {
88
+ const storage = new LogStorage();
89
+ for (let i = 0; i < 10; i++) {
90
+ storage.addEntry(createTestLogEntry({ message: `Entry ${i}` }));
91
+ }
92
+ const result = storage.query({ limit: 5 });
93
+ t.is(result.entries.length, 5);
94
+ t.is(result.filteredCount, 10);
95
+ t.true(result.hasMore);
96
+ });
97
+ test('LogStorage query with offset returns paginated results', t => {
98
+ const storage = new LogStorage();
99
+ for (let i = 0; i < 10; i++) {
100
+ storage.addEntry(createTestLogEntry({ message: `Entry ${i}` }));
101
+ }
102
+ const result = storage.query({ offset: 5, limit: 3 });
103
+ t.is(result.entries.length, 3);
104
+ t.is(result.filteredCount, 10);
105
+ });
106
+ test('LogStorage query with level filter returns filtered results', t => {
107
+ const storage = new LogStorage();
108
+ storage.addEntry(createTestLogEntry({ level: 'info' }));
109
+ storage.addEntry(createTestLogEntry({ level: 'error' }));
110
+ storage.addEntry(createTestLogEntry({ level: 'warn' }));
111
+ const result = storage.query({ levels: ['error'] });
112
+ t.is(result.entries.length, 1);
113
+ t.is(result.filteredCount, 1);
114
+ t.is(result.entries[0].level, 'error');
115
+ });
116
+ test('LogStorage query with excludeLevels filter returns filtered results', t => {
117
+ const storage = new LogStorage();
118
+ storage.addEntry(createTestLogEntry({ level: 'info' }));
119
+ storage.addEntry(createTestLogEntry({ level: 'error' }));
120
+ storage.addEntry(createTestLogEntry({ level: 'warn' }));
121
+ const result = storage.query({ excludeLevels: ['error', 'warn'] });
122
+ t.is(result.entries.length, 1);
123
+ t.is(result.filteredCount, 1);
124
+ t.is(result.entries[0].level, 'info');
125
+ });
126
+ test('LogStorage query with messageContains filter returns filtered results', t => {
127
+ const storage = new LogStorage();
128
+ storage.addEntry(createTestLogEntry({ message: 'Hello world' }));
129
+ storage.addEntry(createTestLogEntry({ message: 'Goodbye world' }));
130
+ storage.addEntry(createTestLogEntry({ message: 'Test message' }));
131
+ const result = storage.query({ messageContains: 'Hello' });
132
+ t.is(result.entries.length, 1);
133
+ t.is(result.filteredCount, 1);
134
+ t.is(result.entries[0].message, 'Hello world');
135
+ });
136
+ test('LogStorage query with messageRegex filter returns filtered results', t => {
137
+ const storage = new LogStorage();
138
+ storage.addEntry(createTestLogEntry({ message: 'Error: Something failed' }));
139
+ storage.addEntry(createTestLogEntry({ message: 'Warning: Something might fail' }));
140
+ storage.addEntry(createTestLogEntry({ message: 'Info: Everything is fine' }));
141
+ const result = storage.query({ messageRegex: /Error:.*/ });
142
+ t.is(result.entries.length, 1);
143
+ t.is(result.filteredCount, 1);
144
+ t.is(result.entries[0].message, 'Error: Something failed');
145
+ });
146
+ test('LogStorage query with correlationIds filter returns filtered results', t => {
147
+ const storage = new LogStorage();
148
+ storage.addEntry(createTestLogEntry({ correlationId: 'corr-1' }));
149
+ storage.addEntry(createTestLogEntry({ correlationId: 'corr-2' }));
150
+ storage.addEntry(createTestLogEntry({ correlationId: 'corr-1' }));
151
+ const result = storage.query({ correlationIds: ['corr-1'] });
152
+ t.is(result.entries.length, 2);
153
+ t.is(result.filteredCount, 2);
154
+ });
155
+ test('LogStorage query with sources filter returns filtered results', t => {
156
+ const storage = new LogStorage();
157
+ storage.addEntry(createTestLogEntry({ source: 'source-1' }));
158
+ storage.addEntry(createTestLogEntry({ source: 'source-2' }));
159
+ storage.addEntry(createTestLogEntry({ source: 'source-1' }));
160
+ const result = storage.query({ sources: ['source-1'] });
161
+ t.is(result.entries.length, 2);
162
+ t.is(result.filteredCount, 2);
163
+ });
164
+ test('LogStorage query with tags filter returns filtered results', t => {
165
+ const storage = new LogStorage();
166
+ storage.addEntry(createTestLogEntry({ tags: ['tag1', 'tag2'] }));
167
+ storage.addEntry(createTestLogEntry({ tags: ['tag2', 'tag3'] }));
168
+ storage.addEntry(createTestLogEntry({ tags: ['tag1'] }));
169
+ const result = storage.query({ tags: ['tag1'] });
170
+ t.is(result.entries.length, 2);
171
+ t.is(result.filteredCount, 2);
172
+ });
173
+ test('LogStorage query with hasTags filter returns filtered results', t => {
174
+ const storage = new LogStorage();
175
+ storage.addEntry(createTestLogEntry({ tags: ['tag1'] }));
176
+ storage.addEntry(createTestLogEntry({ tags: [] }));
177
+ storage.addEntry(createTestLogEntry({ tags: ['tag2'] }));
178
+ const result = storage.query({ hasTags: true });
179
+ t.is(result.entries.length, 2);
180
+ t.is(result.filteredCount, 2);
181
+ });
182
+ test('LogStorage query with metadata filter returns filtered results', t => {
183
+ const storage = new LogStorage();
184
+ storage.addEntry(createTestLogEntry({ metadata: { key: 'value1' } }));
185
+ storage.addEntry(createTestLogEntry({ metadata: { key: 'value2' } }));
186
+ storage.addEntry(createTestLogEntry({ metadata: { key: 'value1' } }));
187
+ const result = storage.query({ metadataKey: 'key', metadataValue: 'value1' });
188
+ t.is(result.entries.length, 2);
189
+ t.is(result.filteredCount, 2);
190
+ });
191
+ test('LogStorage query with durationMin filter returns filtered results', t => {
192
+ const storage = new LogStorage();
193
+ storage.addEntry(createTestLogEntry({ performance: { duration: 50 } }));
194
+ storage.addEntry(createTestLogEntry({ performance: { duration: 150 } }));
195
+ storage.addEntry(createTestLogEntry({ performance: { duration: 250 } }));
196
+ const result = storage.query({ durationMin: 100 });
197
+ t.is(result.entries.length, 2);
198
+ t.is(result.filteredCount, 2);
199
+ });
200
+ test('LogStorage query with durationMax filter returns filtered results', t => {
201
+ const storage = new LogStorage();
202
+ storage.addEntry(createTestLogEntry({ performance: { duration: 50 } }));
203
+ storage.addEntry(createTestLogEntry({ performance: { duration: 150 } }));
204
+ storage.addEntry(createTestLogEntry({ performance: { duration: 250 } }));
205
+ const result = storage.query({ durationMax: 150 });
206
+ t.is(result.entries.length, 2);
207
+ t.is(result.filteredCount, 2);
208
+ });
209
+ test('LogStorage query with memoryThreshold filter returns filtered results', t => {
210
+ const storage = new LogStorage();
211
+ storage.addEntry(createTestLogEntry({ performance: { memory: { heapUsed: 100 } } }));
212
+ storage.addEntry(createTestLogEntry({ performance: { memory: { heapUsed: 500 } } }));
213
+ storage.addEntry(createTestLogEntry({ performance: { memory: { heapUsed: 1000 } } }));
214
+ const result = storage.query({ memoryThreshold: 500 });
215
+ t.is(result.entries.length, 2);
216
+ t.is(result.filteredCount, 2);
217
+ });
218
+ test('LogStorage query with hasErrors filter returns filtered results', t => {
219
+ const storage = new LogStorage();
220
+ storage.addEntry(createTestLogEntry({ error: { message: 'Error 1' } }));
221
+ storage.addEntry(createTestLogEntry({ error: undefined }));
222
+ storage.addEntry(createTestLogEntry({ error: { message: 'Error 2' } }));
223
+ const result = storage.query({ hasErrors: true });
224
+ t.is(result.entries.length, 2);
225
+ t.is(result.filteredCount, 2);
226
+ });
227
+ test('LogStorage query with errorTypes filter returns filtered results', t => {
228
+ const storage = new LogStorage();
229
+ storage.addEntry(createTestLogEntry({ error: { type: 'TypeError' } }));
230
+ storage.addEntry(createTestLogEntry({ error: { type: 'ReferenceError' } }));
231
+ storage.addEntry(createTestLogEntry({ error: { type: 'TypeError' } }));
232
+ const result = storage.query({ errorTypes: ['TypeError'] });
233
+ t.is(result.entries.length, 2);
234
+ t.is(result.filteredCount, 2);
235
+ });
236
+ test('LogStorage query with requestMethods filter returns filtered results', t => {
237
+ const storage = new LogStorage();
238
+ storage.addEntry(createTestLogEntry({ request: { method: 'GET' } }));
239
+ storage.addEntry(createTestLogEntry({ request: { method: 'POST' } }));
240
+ storage.addEntry(createTestLogEntry({ request: { method: 'GET' } }));
241
+ const result = storage.query({ requestMethods: ['GET'] });
242
+ t.is(result.entries.length, 2);
243
+ t.is(result.filteredCount, 2);
244
+ });
245
+ test('LogStorage query with requestStatusCodes filter returns filtered results', t => {
246
+ const storage = new LogStorage();
247
+ storage.addEntry(createTestLogEntry({ request: { statusCode: 200 } }));
248
+ storage.addEntry(createTestLogEntry({ request: { statusCode: 404 } }));
249
+ storage.addEntry(createTestLogEntry({ request: { statusCode: 200 } }));
250
+ const result = storage.query({ requestStatusCodes: [200] });
251
+ t.is(result.entries.length, 2);
252
+ t.is(result.filteredCount, 2);
253
+ });
254
+ test('LogStorage query with requestDurationMin filter returns filtered results', t => {
255
+ const storage = new LogStorage();
256
+ storage.addEntry(createTestLogEntry({ request: { duration: 50 } }));
257
+ storage.addEntry(createTestLogEntry({ request: { duration: 150 } }));
258
+ storage.addEntry(createTestLogEntry({ request: { duration: 250 } }));
259
+ const result = storage.query({ requestDurationMin: 100 });
260
+ t.is(result.entries.length, 2);
261
+ t.is(result.filteredCount, 2);
262
+ });
263
+ test('LogStorage query with requestDurationMax filter returns filtered results', t => {
264
+ const storage = new LogStorage();
265
+ storage.addEntry(createTestLogEntry({ request: { duration: 50 } }));
266
+ storage.addEntry(createTestLogEntry({ request: { duration: 150 } }));
267
+ storage.addEntry(createTestLogEntry({ request: { duration: 250 } }));
268
+ const result = storage.query({ requestDurationMax: 150 });
269
+ t.is(result.entries.length, 2);
270
+ t.is(result.filteredCount, 2);
271
+ });
272
+ test('LogStorage query with time range filter returns filtered results', t => {
273
+ const storage = new LogStorage();
274
+ const now = new Date();
275
+ const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);
276
+ const twoHoursAgo = new Date(now.getTime() - 2 * 60 * 60 * 1000);
277
+ storage.addEntry(createTestLogEntry({ timestamp: twoHoursAgo.toISOString() }));
278
+ storage.addEntry(createTestLogEntry({ timestamp: oneHourAgo.toISOString() }));
279
+ storage.addEntry(createTestLogEntry({ timestamp: now.toISOString() }));
280
+ const result = storage.query({ startTime: oneHourAgo });
281
+ t.is(result.entries.length, 2);
282
+ t.is(result.filteredCount, 2);
283
+ });
284
+ test('LogStorage query with sorting returns sorted results', t => {
285
+ const storage = new LogStorage();
286
+ const now = new Date();
287
+ storage.addEntry(createTestLogEntry({
288
+ timestamp: new Date(now.getTime() - 3000).toISOString(),
289
+ message: 'Entry 1',
290
+ }));
291
+ storage.addEntry(createTestLogEntry({
292
+ timestamp: new Date(now.getTime() - 1000).toISOString(),
293
+ message: 'Entry 2',
294
+ }));
295
+ storage.addEntry(createTestLogEntry({
296
+ timestamp: new Date(now.getTime() - 2000).toISOString(),
297
+ message: 'Entry 3',
298
+ }));
299
+ const result = storage.query({ sortBy: 'timestamp', sortOrder: 'asc' });
300
+ t.is(result.entries.length, 3);
301
+ t.is(result.entries[0].message, 'Entry 1');
302
+ t.is(result.entries[1].message, 'Entry 3');
303
+ t.is(result.entries[2].message, 'Entry 2');
304
+ });
305
+ test('LogStorage query with descending sorting returns sorted results', t => {
306
+ const storage = new LogStorage();
307
+ const now = new Date();
308
+ storage.addEntry(createTestLogEntry({
309
+ timestamp: new Date(now.getTime() - 3000).toISOString(),
310
+ message: 'Entry 1',
311
+ }));
312
+ storage.addEntry(createTestLogEntry({
313
+ timestamp: new Date(now.getTime() - 1000).toISOString(),
314
+ message: 'Entry 2',
315
+ }));
316
+ storage.addEntry(createTestLogEntry({
317
+ timestamp: new Date(now.getTime() - 2000).toISOString(),
318
+ message: 'Entry 3',
319
+ }));
320
+ const result = storage.query({ sortBy: 'timestamp', sortOrder: 'desc' });
321
+ t.is(result.entries.length, 3);
322
+ t.is(result.entries[0].message, 'Entry 2');
323
+ t.is(result.entries[1].message, 'Entry 3');
324
+ t.is(result.entries[2].message, 'Entry 1');
325
+ });
326
+ test('LogStorage query generates facets', t => {
327
+ const storage = new LogStorage();
328
+ storage.addEntry(createTestLogEntry({ level: 'info', source: 'source1', tags: ['tag1'] }));
329
+ storage.addEntry(createTestLogEntry({
330
+ level: 'error',
331
+ source: 'source1',
332
+ tags: ['tag1', 'tag2'],
333
+ }));
334
+ storage.addEntry(createTestLogEntry({ level: 'info', source: 'source2', tags: ['tag2'] }));
335
+ const result = storage.query({});
336
+ t.truthy(result.facets);
337
+ t.truthy(result.facets?.levels);
338
+ t.truthy(result.facets?.sources);
339
+ t.truthy(result.facets?.tags);
340
+ t.truthy(result.facets?.errorTypes);
341
+ t.truthy(result.facets?.hours);
342
+ });
343
+ test('LogStorage aggregate returns AggregationResult', t => {
344
+ const storage = new LogStorage();
345
+ storage.addEntry(createTestLogEntry({ performance: { duration: 100 } }));
346
+ storage.addEntry(createTestLogEntry({ performance: { duration: 200 } }));
347
+ const result = storage.aggregate({
348
+ groupBy: 'level',
349
+ aggregations: ['count', 'avgDuration'],
350
+ });
351
+ t.truthy(result);
352
+ t.true('groups' in result);
353
+ t.true('totalGroups' in result);
354
+ t.true('queryTime' in result);
355
+ });
356
+ test('LogStorage aggregate calculates correct aggregations', t => {
357
+ const storage = new LogStorage();
358
+ storage.addEntry(createTestLogEntry({ level: 'info', performance: { duration: 100 } }));
359
+ storage.addEntry(createTestLogEntry({ level: 'info', performance: { duration: 200 } }));
360
+ storage.addEntry(createTestLogEntry({ level: 'error', performance: { duration: 300 } }));
361
+ const result = storage.aggregate({
362
+ groupBy: 'level',
363
+ aggregations: ['count', 'avgDuration', 'maxDuration', 'minDuration'],
364
+ });
365
+ t.is(result.totalGroups, 2);
366
+ t.truthy(result.groups['info']);
367
+ t.truthy(result.groups['error']);
368
+ t.is(result.groups['info'].count, 2);
369
+ t.is(result.groups['error'].count, 1);
370
+ });
371
+ test('LogStorage aggregate with time range filter returns filtered results', t => {
372
+ const storage = new LogStorage();
373
+ const now = new Date();
374
+ const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);
375
+ storage.addEntry(createTestLogEntry({
376
+ timestamp: oneHourAgo.toISOString(),
377
+ performance: { duration: 100 },
378
+ }));
379
+ storage.addEntry(createTestLogEntry({
380
+ timestamp: now.toISOString(),
381
+ performance: { duration: 200 },
382
+ }));
383
+ const result = storage.aggregate({
384
+ groupBy: 'level',
385
+ aggregations: ['count'],
386
+ timeRange: {
387
+ startTime: oneHourAgo,
388
+ endTime: now,
389
+ },
390
+ });
391
+ t.is(result.totalGroups, 1);
392
+ t.is(result.groups['info'].count, 2);
393
+ });
394
+ test('LogStorage clear removes all entries', t => {
395
+ const storage = new LogStorage();
396
+ storage.addEntry(createTestLogEntry());
397
+ storage.addEntry(createTestLogEntry());
398
+ t.is(storage.getEntryCount(), 2);
399
+ storage.clear();
400
+ t.is(storage.getEntryCount(), 0);
401
+ });
402
+ // Test LogQueryBuilder class
403
+ // ============================================================================
404
+ test('LogQueryBuilder creates query with fluent interface', t => {
405
+ const builder = new LogQueryBuilder();
406
+ const query = builder
407
+ .timeRange(new Date('2023-01-01'), new Date('2023-12-31'))
408
+ .levels('info', 'error')
409
+ .messageContains('test')
410
+ .limit(10)
411
+ .offset(0)
412
+ .sortBy('timestamp', 'desc')
413
+ .execute();
414
+ t.truthy(query);
415
+ t.true('entries' in query);
416
+ });
417
+ test('LogQueryBuilder timeRange method sets time range', t => {
418
+ const builder = new LogQueryBuilder();
419
+ const startTime = new Date('2023-01-01');
420
+ const endTime = new Date('2023-12-31');
421
+ builder.timeRange(startTime, endTime);
422
+ const query = builder.toJSON();
423
+ t.deepEqual(query.startTime, startTime);
424
+ t.deepEqual(query.endTime, endTime);
425
+ });
426
+ test('LogQueryBuilder levels method sets levels', t => {
427
+ const builder = new LogQueryBuilder();
428
+ builder.levels('info', 'error', 'warn');
429
+ const query = builder.toJSON();
430
+ t.deepEqual(query.levels, ['info', 'error', 'warn']);
431
+ });
432
+ test('LogQueryBuilder excludeLevels method sets excludeLevels', t => {
433
+ const builder = new LogQueryBuilder();
434
+ builder.excludeLevels('debug', 'trace');
435
+ const query = builder.toJSON();
436
+ t.deepEqual(query.excludeLevels, ['debug', 'trace']);
437
+ });
438
+ test('LogQueryBuilder messageContains method sets messageContains', t => {
439
+ const builder = new LogQueryBuilder();
440
+ builder.messageContains('test message');
441
+ const query = builder.toJSON();
442
+ t.is(query.messageContains, 'test message');
443
+ });
444
+ test('LogQueryBuilder messageRegex method sets messageRegex', t => {
445
+ const builder = new LogQueryBuilder();
446
+ builder.messageRegex(/test.*/);
447
+ const query = builder.toJSON();
448
+ t.truthy(query.messageRegex);
449
+ });
450
+ test('LogQueryBuilder correlationIds method sets correlationIds', t => {
451
+ const builder = new LogQueryBuilder();
452
+ builder.correlationIds('corr-1', 'corr-2');
453
+ const query = builder.toJSON();
454
+ t.deepEqual(query.correlationIds, ['corr-1', 'corr-2']);
455
+ });
456
+ test('LogQueryBuilder sources method sets sources', t => {
457
+ const builder = new LogQueryBuilder();
458
+ builder.sources('source-1', 'source-2');
459
+ const query = builder.toJSON();
460
+ t.deepEqual(query.sources, ['source-1', 'source-2']);
461
+ });
462
+ test('LogQueryBuilder tags method sets tags', t => {
463
+ const builder = new LogQueryBuilder();
464
+ builder.tags('tag1', 'tag2');
465
+ const query = builder.toJSON();
466
+ t.deepEqual(query.tags, ['tag1', 'tag2']);
467
+ });
468
+ test('LogQueryBuilder hasTags method sets hasTags', t => {
469
+ const builder = new LogQueryBuilder();
470
+ builder.hasTags();
471
+ const query = builder.toJSON();
472
+ t.true(query.hasTags);
473
+ });
474
+ test('LogQueryBuilder limit method sets limit', t => {
475
+ const builder = new LogQueryBuilder();
476
+ builder.limit(25);
477
+ const query = builder.toJSON();
478
+ t.is(query.limit, 25);
479
+ });
480
+ test('LogQueryBuilder offset method sets offset', t => {
481
+ const builder = new LogQueryBuilder();
482
+ builder.offset(10);
483
+ const query = builder.toJSON();
484
+ t.is(query.offset, 10);
485
+ });
486
+ test('LogQueryBuilder sortBy method sets sortBy and sortOrder', t => {
487
+ const builder = new LogQueryBuilder();
488
+ builder.sortBy('timestamp', 'asc');
489
+ const query = builder.toJSON();
490
+ t.is(query.sortBy, 'timestamp');
491
+ t.is(query.sortOrder, 'asc');
492
+ });
493
+ test('LogQueryBuilder durationMin method sets durationMin', t => {
494
+ const builder = new LogQueryBuilder();
495
+ builder.durationMin(100);
496
+ const query = builder.toJSON();
497
+ t.is(query.durationMin, 100);
498
+ });
499
+ test('LogQueryBuilder memoryThreshold method sets memoryThreshold', t => {
500
+ const builder = new LogQueryBuilder();
501
+ builder.memoryThreshold(1024);
502
+ const query = builder.toJSON();
503
+ t.is(query.memoryThreshold, 1024);
504
+ });
505
+ test('LogQueryBuilder toJSON returns complete query object', t => {
506
+ const builder = new LogQueryBuilder();
507
+ const query = builder.levels('info').limit(10).toJSON();
508
+ t.truthy(query);
509
+ t.deepEqual(query.levels, ['info']);
510
+ t.is(query.limit, 10);
511
+ });
512
+ // Test createLogQuery function
513
+ // ============================================================================
514
+ test('createLogQuery returns LogQueryBuilder instance', t => {
515
+ const builder = createLogQuery();
516
+ t.truthy(builder);
517
+ t.true(builder instanceof LogQueryBuilder);
518
+ });
519
+ // Test logQueries utility functions
520
+ // ============================================================================
521
+ test('logQueries.errors returns error logs', t => {
522
+ // Use globalLogStorage since logQueries uses it
523
+ globalLogStorage.clear();
524
+ globalLogStorage.addEntry(createTestLogEntry({ level: 'info' }));
525
+ globalLogStorage.addEntry(createTestLogEntry({ level: 'error' }));
526
+ globalLogStorage.addEntry(createTestLogEntry({ level: 'fatal' }));
527
+ const result = logQueries.errors();
528
+ t.is(result.entries.length, 2);
529
+ t.is(result.filteredCount, 2);
530
+ });
531
+ test('logQueries.byCorrelation returns logs by correlation ID', t => {
532
+ // Use globalLogStorage since logQueries uses it
533
+ globalLogStorage.clear();
534
+ globalLogStorage.addEntry(createTestLogEntry({ correlationId: 'corr-1' }));
535
+ globalLogStorage.addEntry(createTestLogEntry({ correlationId: 'corr-2' }));
536
+ globalLogStorage.addEntry(createTestLogEntry({ correlationId: 'corr-1' }));
537
+ const result = logQueries.byCorrelation('corr-1');
538
+ t.is(result.entries.length, 2);
539
+ t.is(result.filteredCount, 2);
540
+ });
541
+ test('logQueries.bySource returns logs by source', t => {
542
+ // Use globalLogStorage since logQueries uses it
543
+ globalLogStorage.clear();
544
+ globalLogStorage.addEntry(createTestLogEntry({ source: 'source-1' }));
545
+ globalLogStorage.addEntry(createTestLogEntry({ source: 'source-2' }));
546
+ globalLogStorage.addEntry(createTestLogEntry({ source: 'source-1' }));
547
+ const result = logQueries.bySource('source-1');
548
+ t.is(result.entries.length, 2);
549
+ t.is(result.filteredCount, 2);
550
+ });
551
+ test('logQueries.byTag returns logs by tag', t => {
552
+ // Use globalLogStorage since logQueries uses it
553
+ globalLogStorage.clear();
554
+ globalLogStorage.addEntry(createTestLogEntry({ tags: ['tag1', 'tag2'] }));
555
+ globalLogStorage.addEntry(createTestLogEntry({ tags: ['tag2', 'tag3'] }));
556
+ globalLogStorage.addEntry(createTestLogEntry({ tags: ['tag1'] }));
557
+ const result = logQueries.byTag('tag1');
558
+ t.is(result.entries.length, 2);
559
+ t.is(result.filteredCount, 2);
560
+ });
561
+ test('logQueries.slowRequests returns slow requests', t => {
562
+ // Use globalLogStorage since logQueries uses it
563
+ globalLogStorage.clear();
564
+ globalLogStorage.addEntry(createTestLogEntry({ message: 'request', performance: { duration: 50 } }));
565
+ globalLogStorage.addEntry(createTestLogEntry({ message: 'request', performance: { duration: 1500 } }));
566
+ globalLogStorage.addEntry(createTestLogEntry({ message: 'request', performance: { duration: 2500 } }));
567
+ const result = logQueries.slowRequests(1000);
568
+ t.is(result.entries.length, 2);
569
+ t.is(result.filteredCount, 2);
570
+ });
571
+ test('logQueries.memoryIntensive returns memory-intensive operations', t => {
572
+ // Use globalLogStorage since logQueries uses it
573
+ globalLogStorage.clear();
574
+ globalLogStorage.addEntry(createTestLogEntry({ performance: { memory: { heapUsed: 1024 } } }));
575
+ globalLogStorage.addEntry(createTestLogEntry({ performance: { memory: { heapUsed: 50 * 1024 * 1024 } } }));
576
+ globalLogStorage.addEntry(createTestLogEntry({ performance: { memory: { heapUsed: 100 * 1024 * 1024 } } }));
577
+ const result = logQueries.memoryIntensive(50 * 1024 * 1024);
578
+ t.is(result.entries.length, 2);
579
+ t.is(result.filteredCount, 2);
580
+ });
581
+ // Test globalLogStorage instance
582
+ // ============================================================================
583
+ test('globalLogStorage is LogStorage instance', t => {
584
+ t.true(globalLogStorage instanceof LogStorage);
585
+ });
586
+ test('globalLogStorage can add and query entries', t => {
587
+ globalLogStorage.clear();
588
+ globalLogStorage.addEntry(createTestLogEntry({ message: 'Global test entry' }));
589
+ const result = globalLogStorage.query({});
590
+ t.is(result.entries.length, 1);
591
+ t.is(result.entries[0].message, 'Global test entry');
592
+ });
593
+ // Test edge cases
594
+ // ============================================================================
595
+ test('LogStorage handles empty query gracefully', t => {
596
+ const storage = new LogStorage();
597
+ storage.addEntry(createTestLogEntry());
598
+ const result = storage.query({});
599
+ t.truthy(result);
600
+ t.is(result.entries.length, 1);
601
+ });
602
+ test('LogStorage handles query with no matches gracefully', t => {
603
+ const storage = new LogStorage();
604
+ storage.addEntry(createTestLogEntry({ level: 'info' }));
605
+ const result = storage.query({ levels: ['error'] });
606
+ t.truthy(result);
607
+ t.is(result.entries.length, 0);
608
+ t.is(result.filteredCount, 0);
609
+ });
610
+ test('LogStorage handles aggregation with no entries gracefully', t => {
611
+ const storage = new LogStorage();
612
+ const result = storage.aggregate({
613
+ groupBy: 'level',
614
+ aggregations: ['count'],
615
+ });
616
+ t.truthy(result);
617
+ t.is(result.totalGroups, 0);
618
+ });
619
+ test('LogStorage handles query with invalid sortBy gracefully', t => {
620
+ const storage = new LogStorage();
621
+ storage.addEntry(createTestLogEntry());
622
+ const result = storage.query({ sortBy: 'invalid' });
623
+ t.truthy(result);
624
+ t.is(result.entries.length, 1);
625
+ });
626
+ test('LogStorage handles query with invalid groupBy gracefully', t => {
627
+ const storage = new LogStorage();
628
+ storage.addEntry(createTestLogEntry());
629
+ const result = storage.aggregate({
630
+ groupBy: 'invalid',
631
+ aggregations: ['count'],
632
+ });
633
+ t.truthy(result);
634
+ });
635
+ // Test performance characteristics
636
+ // ============================================================================
637
+ test('LogStorage handles large number of entries efficiently', t => {
638
+ const storage = new LogStorage(1000);
639
+ // Add many entries
640
+ for (let i = 0; i < 1000; i++) {
641
+ storage.addEntry(createTestLogEntry({ message: `Entry ${i}` }));
642
+ }
643
+ const startTime = performance.now();
644
+ const result = storage.query({});
645
+ const queryTime = performance.now() - startTime;
646
+ t.truthy(result);
647
+ t.is(result.entries.length, 100);
648
+ t.true(queryTime < 100); // Should be fast
649
+ });
650
+ test('LogStorage handles query with complex filters efficiently', t => {
651
+ const storage = new LogStorage();
652
+ // Add entries with different characteristics
653
+ for (let i = 0; i < 100; i++) {
654
+ storage.addEntry(createTestLogEntry({
655
+ level: i % 2 === 0 ? 'info' : 'error',
656
+ source: i % 3 === 0 ? 'source1' : 'source2',
657
+ tags: i % 4 === 0 ? ['tag1'] : ['tag2'],
658
+ performance: { duration: i * 10 },
659
+ }));
660
+ }
661
+ const startTime = performance.now();
662
+ const result = storage.query({
663
+ levels: ['info'],
664
+ sources: ['source1'],
665
+ tags: ['tag1'],
666
+ durationMin: 50,
667
+ limit: 10,
668
+ });
669
+ const queryTime = performance.now() - startTime;
670
+ t.truthy(result);
671
+ t.true(queryTime < 50); // Should be fast
672
+ });
673
+ // Test memory management
674
+ // ============================================================================
675
+ test('LogStorage respects maxEntries limit when full', t => {
676
+ const storage = new LogStorage(5);
677
+ // Fill storage
678
+ for (let i = 0; i < 5; i++) {
679
+ storage.addEntry(createTestLogEntry({ message: `Entry ${i}` }));
680
+ }
681
+ t.is(storage.getEntryCount(), 5);
682
+ // Add one more - should remove oldest
683
+ storage.addEntry(createTestLogEntry({ message: 'Entry 5' }));
684
+ t.is(storage.getEntryCount(), 5);
685
+ // Query should not include the first entry
686
+ const result = storage.query({});
687
+ t.is(result.entries.length, 5);
688
+ t.false(result.entries.some(e => e.message === 'Entry 0'));
689
+ });
690
+ // Test indexing functionality
691
+ // ============================================================================
692
+ test('LogStorage maintains indexes for fast filtering', t => {
693
+ const storage = new LogStorage();
694
+ // Add entries with different correlation IDs
695
+ storage.addEntry(createTestLogEntry({ correlationId: 'corr-1' }));
696
+ storage.addEntry(createTestLogEntry({ correlationId: 'corr-2' }));
697
+ storage.addEntry(createTestLogEntry({ correlationId: 'corr-1' }));
698
+ // Query by correlation ID should be fast
699
+ const startTime = performance.now();
700
+ const result = storage.query({ correlationIds: ['corr-1'] });
701
+ const queryTime = performance.now() - startTime;
702
+ t.is(result.entries.length, 2);
703
+ t.true(queryTime < 10); // Should be very fast
704
+ });
705
+ // Test error handling
706
+ // ============================================================================
707
+ test('LogStorage handles invalid log entries gracefully', t => {
708
+ const storage = new LogStorage();
709
+ // Should not throw with incomplete entry
710
+ storage.addEntry({
711
+ timestamp: new Date().toISOString(),
712
+ level: 'info',
713
+ message: 'Minimal entry',
714
+ });
715
+ t.is(storage.getEntryCount(), 1);
716
+ });
717
+ test('LogStorage handles query with invalid regex gracefully', t => {
718
+ const storage = new LogStorage();
719
+ storage.addEntry(createTestLogEntry());
720
+ // Should not throw with invalid regex
721
+ try {
722
+ // Create an invalid regex by using RegExp constructor with invalid pattern
723
+ const invalidRegex = new RegExp('[invalid regex'); // Missing closing bracket
724
+ const result = storage.query({ messageRegex: invalidRegex });
725
+ t.truthy(result);
726
+ }
727
+ catch (error) {
728
+ // Expected to throw for invalid regex
729
+ t.truthy(error);
730
+ }
731
+ });
732
+ // Cleanup after tests
733
+ // ============================================================================
734
+ test.after('cleanup global log storage', t => {
735
+ globalLogStorage.clear();
736
+ });
737
+ //# sourceMappingURL=log-query.spec.js.map