@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.
- package/README.md +176 -8
- package/assets/nanocoder-vscode.vsix +0 -0
- package/dist/ai-sdk-client-empty-message.spec.js.map +1 -1
- package/dist/ai-sdk-client.d.ts +1 -1
- package/dist/ai-sdk-client.d.ts.map +1 -1
- package/dist/ai-sdk-client.js +261 -150
- package/dist/ai-sdk-client.js.map +1 -1
- package/dist/app/utils/appUtils.d.ts +1 -1
- package/dist/app/utils/appUtils.d.ts.map +1 -1
- package/dist/app/utils/appUtils.js +78 -12
- package/dist/app/utils/appUtils.js.map +1 -1
- package/dist/app.d.ts +22 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +353 -48
- package/dist/app.js.map +1 -1
- package/dist/cli.js +37 -2
- package/dist/cli.js.map +1 -1
- package/dist/cli.spec.d.ts +2 -0
- package/dist/cli.spec.d.ts.map +1 -0
- package/dist/cli.spec.js +101 -0
- package/dist/cli.spec.js.map +1 -0
- package/dist/client-factory.d.ts.map +1 -1
- package/dist/client-factory.js +2 -2
- package/dist/client-factory.js.map +1 -1
- package/dist/commands/checkpoint.d.ts +6 -0
- package/dist/commands/checkpoint.d.ts.map +1 -0
- package/dist/commands/checkpoint.js +277 -0
- package/dist/commands/checkpoint.js.map +1 -0
- package/dist/commands/clear.d.ts.map +1 -1
- package/dist/commands/clear.js +1 -1
- package/dist/commands/clear.js.map +1 -1
- package/dist/commands/custom-commands.d.ts.map +1 -1
- package/dist/commands/custom-commands.js +4 -4
- package/dist/commands/custom-commands.js.map +1 -1
- package/dist/commands/exit.d.ts.map +1 -1
- package/dist/commands/exit.js.map +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +2 -2
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +5 -5
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +15 -14
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/lsp.d.ts.map +1 -1
- package/dist/commands/lsp.js +6 -6
- package/dist/commands/lsp.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +6 -6
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/model-database.d.ts.map +1 -1
- package/dist/commands/model-database.js +8 -8
- package/dist/commands/model-database.js.map +1 -1
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/provider.d.ts.map +1 -1
- package/dist/commands/provider.js.map +1 -1
- package/dist/commands/setup-config.js +1 -1
- package/dist/commands/setup-config.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/theme.d.ts.map +1 -1
- package/dist/commands/theme.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +5 -5
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/usage.d.ts.map +1 -1
- package/dist/commands/usage.js +3 -3
- package/dist/commands/usage.js.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +1 -1
- package/dist/commands.js.map +1 -1
- package/dist/components/assistant-message.d.ts.map +1 -1
- package/dist/components/assistant-message.js +2 -2
- package/dist/components/assistant-message.js.map +1 -1
- package/dist/components/bash-execution-indicator.d.ts.map +1 -1
- package/dist/components/bash-execution-indicator.js +2 -2
- package/dist/components/bash-execution-indicator.js.map +1 -1
- package/dist/components/cancelling-indicator.js +3 -3
- package/dist/components/cancelling-indicator.js.map +1 -1
- package/dist/components/chat-queue.d.ts.map +1 -1
- package/dist/components/chat-queue.js +1 -1
- package/dist/components/chat-queue.js.map +1 -1
- package/dist/components/checkpoint-display.d.ts +8 -0
- package/dist/components/checkpoint-display.d.ts.map +1 -0
- package/dist/components/checkpoint-display.js +29 -0
- package/dist/components/checkpoint-display.js.map +1 -0
- package/dist/components/checkpoint-selector.d.ts +11 -0
- package/dist/components/checkpoint-selector.d.ts.map +1 -0
- package/dist/components/checkpoint-selector.js +55 -0
- package/dist/components/checkpoint-selector.js.map +1 -0
- package/dist/components/error-message.d.ts.map +1 -1
- package/dist/components/error-message.js +4 -4
- package/dist/components/error-message.js.map +1 -1
- package/dist/components/info-message.d.ts.map +1 -1
- package/dist/components/info-message.js +4 -4
- package/dist/components/info-message.js.map +1 -1
- package/dist/components/model-selector.d.ts.map +1 -1
- package/dist/components/model-selector.js +7 -7
- package/dist/components/model-selector.js.map +1 -1
- package/dist/components/provider-selector.d.ts.map +1 -1
- package/dist/components/provider-selector.js +6 -6
- package/dist/components/provider-selector.js.map +1 -1
- package/dist/components/security-disclaimer.d.ts.map +1 -1
- package/dist/components/security-disclaimer.js +4 -4
- package/dist/components/security-disclaimer.js.map +1 -1
- package/dist/components/status.d.ts +3 -1
- package/dist/components/status.d.ts.map +1 -1
- package/dist/components/status.js +17 -9
- package/dist/components/status.js.map +1 -1
- package/dist/components/success-message.d.ts.map +1 -1
- package/dist/components/success-message.js +4 -4
- package/dist/components/success-message.js.map +1 -1
- package/dist/components/theme-selector.d.ts.map +1 -1
- package/dist/components/theme-selector.js +8 -8
- package/dist/components/theme-selector.js.map +1 -1
- package/dist/components/tool-confirmation.d.ts.map +1 -1
- package/dist/components/tool-confirmation.js +7 -7
- package/dist/components/tool-confirmation.js.map +1 -1
- package/dist/components/tool-execution-indicator.d.ts.map +1 -1
- package/dist/components/tool-execution-indicator.js +2 -2
- package/dist/components/tool-execution-indicator.js.map +1 -1
- package/dist/components/tool-message.d.ts.map +1 -1
- package/dist/components/tool-message.js +4 -5
- package/dist/components/tool-message.js.map +1 -1
- package/dist/components/ui/titled-box.d.ts +16 -0
- package/dist/components/ui/titled-box.d.ts.map +1 -0
- package/dist/components/ui/titled-box.js +10 -0
- package/dist/components/ui/titled-box.js.map +1 -0
- package/dist/components/usage/progress-bar.d.ts.map +1 -1
- package/dist/components/usage/progress-bar.js +3 -0
- package/dist/components/usage/progress-bar.js.map +1 -1
- package/dist/components/usage/usage-display.d.ts.map +1 -1
- package/dist/components/usage/usage-display.js +7 -4
- package/dist/components/usage/usage-display.js.map +1 -1
- package/dist/components/user-input.d.ts.map +1 -1
- package/dist/components/user-input.js +7 -7
- package/dist/components/user-input.js.map +1 -1
- package/dist/components/user-message.d.ts.map +1 -1
- package/dist/components/user-message.js +1 -1
- package/dist/components/user-message.js.map +1 -1
- package/dist/components/vscode-extension-prompt.js +3 -3
- package/dist/components/vscode-extension-prompt.js.map +1 -1
- package/dist/components/warning-message.d.ts.map +1 -1
- package/dist/components/warning-message.js +4 -4
- package/dist/components/warning-message.js.map +1 -1
- package/dist/components/welcome-message.d.ts.map +1 -1
- package/dist/components/welcome-message.js +4 -4
- package/dist/components/welcome-message.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +7 -7
- package/dist/config/index.js.map +1 -1
- package/dist/config/index.spec.js +4 -4
- package/dist/config/index.spec.js.map +1 -1
- package/dist/config/paths.spec.js +1 -1
- package/dist/config/paths.spec.js.map +1 -1
- package/dist/config/preferences.d.ts +0 -2
- package/dist/config/preferences.d.ts.map +1 -1
- package/dist/config/preferences.js +1 -11
- package/dist/config/preferences.js.map +1 -1
- package/dist/custom-commands/executor.d.ts.map +1 -1
- package/dist/custom-commands/executor.js.map +1 -1
- package/dist/custom-commands/loader.d.ts.map +1 -1
- package/dist/custom-commands/loader.js +1 -1
- package/dist/custom-commands/loader.js.map +1 -1
- package/dist/custom-commands/parser.d.ts.map +1 -1
- package/dist/custom-commands/parser.js.map +1 -1
- package/dist/hooks/useAppInitialization.d.ts +7 -5
- package/dist/hooks/useAppInitialization.d.ts.map +1 -1
- package/dist/hooks/useAppInitialization.js +21 -22
- package/dist/hooks/useAppInitialization.js.map +1 -1
- package/dist/hooks/useAppState.d.ts +22 -5
- package/dist/hooks/useAppState.d.ts.map +1 -1
- package/dist/hooks/useAppState.js +17 -1
- package/dist/hooks/useAppState.js.map +1 -1
- package/dist/hooks/useChatHandler.d.ts +4 -2
- package/dist/hooks/useChatHandler.d.ts.map +1 -1
- package/dist/hooks/useChatHandler.js +35 -10
- package/dist/hooks/useChatHandler.js.map +1 -1
- package/dist/hooks/useDirectoryTrust.js +1 -1
- package/dist/hooks/useDirectoryTrust.js.map +1 -1
- package/dist/hooks/useInputState.js +2 -2
- package/dist/hooks/useInputState.js.map +1 -1
- package/dist/hooks/useModeHandlers.d.ts +1 -1
- package/dist/hooks/useModeHandlers.d.ts.map +1 -1
- package/dist/hooks/useModeHandlers.js +3 -3
- package/dist/hooks/useModeHandlers.js.map +1 -1
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
- package/dist/hooks/useTerminalWidth.js +3 -3
- package/dist/hooks/useTerminalWidth.js.map +1 -1
- package/dist/hooks/useTheme.d.ts.map +1 -1
- package/dist/hooks/useTheme.js +1 -1
- package/dist/hooks/useTheme.js.map +1 -1
- package/dist/hooks/useToolHandler.d.ts +1 -1
- package/dist/hooks/useToolHandler.d.ts.map +1 -1
- package/dist/hooks/useToolHandler.js +4 -4
- package/dist/hooks/useToolHandler.js.map +1 -1
- package/dist/hooks/useUIState.d.ts +1 -1
- package/dist/hooks/useUIState.d.ts.map +1 -1
- package/dist/hooks/useUIState.js.map +1 -1
- package/dist/hooks/useVSCodeServer.js +2 -2
- package/dist/hooks/useVSCodeServer.js.map +1 -1
- package/dist/init/agents-template-generator.d.ts +1 -1
- package/dist/init/agents-template-generator.d.ts.map +1 -1
- package/dist/init/agents-template-generator.js.map +1 -1
- package/dist/init/existing-rules-extractor.js +1 -1
- package/dist/init/existing-rules-extractor.js.map +1 -1
- package/dist/init/file-scanner.js +2 -2
- package/dist/init/file-scanner.js.map +1 -1
- package/dist/init/framework-detector.js +1 -1
- package/dist/init/framework-detector.js.map +1 -1
- package/dist/init/project-analyzer.d.ts +1 -1
- package/dist/init/project-analyzer.d.ts.map +1 -1
- package/dist/init/project-analyzer.js +3 -3
- package/dist/init/project-analyzer.js.map +1 -1
- package/dist/lsp/lsp-client.d.ts +1 -1
- package/dist/lsp/lsp-client.d.ts.map +1 -1
- package/dist/lsp/lsp-client.js +1 -1
- package/dist/lsp/lsp-client.js.map +1 -1
- package/dist/lsp/lsp-client.spec.js +1 -2
- package/dist/lsp/lsp-client.spec.js.map +1 -1
- package/dist/lsp/lsp-manager.d.ts +1 -1
- package/dist/lsp/lsp-manager.d.ts.map +1 -1
- package/dist/lsp/lsp-manager.js.map +1 -1
- package/dist/lsp/lsp-manager.spec.js +1 -1
- package/dist/lsp/lsp-manager.spec.js.map +1 -1
- package/dist/lsp/protocol.spec.js +1 -1
- package/dist/lsp/protocol.spec.js.map +1 -1
- package/dist/lsp/server-discovery.spec.js +1 -1
- package/dist/lsp/server-discovery.spec.js.map +1 -1
- package/dist/markdown-parser/index.spec.js.map +1 -1
- package/dist/markdown-parser/table-parser.spec.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts +3 -2
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +264 -91
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/mcp/transport-factory.d.ts +1 -1
- package/dist/mcp/transport-factory.d.ts.map +1 -1
- package/dist/mcp/transport-factory.js +16 -3
- package/dist/mcp/transport-factory.js.map +1 -1
- package/dist/mcp/transport-factory.spec.js +30 -48
- package/dist/mcp/transport-factory.spec.js.map +1 -1
- package/dist/message-handler.d.ts +1 -1
- package/dist/message-handler.d.ts.map +1 -1
- package/dist/model-database/database-engine.d.ts.map +1 -1
- package/dist/model-database/database-engine.js.map +1 -1
- package/dist/model-database/database-engine.spec.js.map +1 -1
- package/dist/model-database/model-database.js +1 -1
- package/dist/model-database/model-database.js.map +1 -1
- package/dist/model-database/model-engine.d.ts.map +1 -1
- package/dist/model-database/model-engine.js.map +1 -1
- package/dist/model-database/model-engine.spec.js +1 -1
- package/dist/model-database/model-engine.spec.js.map +1 -1
- package/dist/model-database/model-fetcher.d.ts.map +1 -1
- package/dist/model-database/model-fetcher.js +2 -1
- package/dist/model-database/model-fetcher.js.map +1 -1
- package/dist/model-database/model-fetcher.spec.js +1 -1
- package/dist/model-database/model-fetcher.spec.js.map +1 -1
- package/dist/models/models-cache.d.ts +1 -1
- package/dist/models/models-cache.d.ts.map +1 -1
- package/dist/models/models-cache.js +1 -1
- package/dist/models/models-cache.js.map +1 -1
- package/dist/models/models-dev-client.d.ts.map +1 -1
- package/dist/models/models-dev-client.js +18 -10
- package/dist/models/models-dev-client.js.map +1 -1
- package/dist/prompt-history.js +2 -2
- package/dist/prompt-history.js.map +1 -1
- package/dist/services/checkpoint-manager.d.ts +68 -0
- package/dist/services/checkpoint-manager.d.ts.map +1 -0
- package/dist/services/checkpoint-manager.js +345 -0
- package/dist/services/checkpoint-manager.js.map +1 -0
- package/dist/services/checkpoint-manager.spec.d.ts +2 -0
- package/dist/services/checkpoint-manager.spec.d.ts.map +1 -0
- package/dist/services/checkpoint-manager.spec.js +353 -0
- package/dist/services/checkpoint-manager.spec.js.map +1 -0
- package/dist/services/file-snapshot.d.ts +32 -0
- package/dist/services/file-snapshot.d.ts.map +1 -0
- package/dist/services/file-snapshot.js +161 -0
- package/dist/services/file-snapshot.js.map +1 -0
- package/dist/services/file-snapshot.spec.d.ts +2 -0
- package/dist/services/file-snapshot.spec.d.ts.map +1 -0
- package/dist/services/file-snapshot.spec.js +285 -0
- package/dist/services/file-snapshot.spec.js.map +1 -0
- package/dist/test-utils/render-with-theme.d.ts +7 -0
- package/dist/test-utils/render-with-theme.d.ts.map +1 -0
- package/dist/test-utils/render-with-theme.js +38 -0
- package/dist/test-utils/render-with-theme.js.map +1 -0
- package/dist/tokenization/tokenizer-factory.js +2 -2
- package/dist/tokenization/tokenizer-factory.js.map +1 -1
- package/dist/tokenization/tokenizer-factory.spec.js +2 -2
- package/dist/tokenization/tokenizer-factory.spec.js.map +1 -1
- package/dist/tokenization/tokenizers/anthropic-tokenizer.d.ts +1 -1
- package/dist/tokenization/tokenizers/anthropic-tokenizer.d.ts.map +1 -1
- package/dist/tokenization/tokenizers/anthropic-tokenizer.js.map +1 -1
- package/dist/tokenization/tokenizers/anthropic-tokenizer.spec.js.map +1 -1
- package/dist/tokenization/tokenizers/fallback-tokenizer.d.ts +1 -1
- package/dist/tokenization/tokenizers/fallback-tokenizer.d.ts.map +1 -1
- package/dist/tokenization/tokenizers/fallback-tokenizer.spec.js.map +1 -1
- package/dist/tokenization/tokenizers/llama-tokenizer.d.ts +1 -1
- package/dist/tokenization/tokenizers/llama-tokenizer.d.ts.map +1 -1
- package/dist/tokenization/tokenizers/llama-tokenizer.js.map +1 -1
- package/dist/tokenization/tokenizers/llama-tokenizer.spec.js.map +1 -1
- package/dist/tokenization/tokenizers/openai-tokenizer.d.ts +1 -1
- package/dist/tokenization/tokenizers/openai-tokenizer.d.ts.map +1 -1
- package/dist/tokenization/tokenizers/openai-tokenizer.js.map +1 -1
- package/dist/tokenization/tokenizers/openai-tokenizer.spec.js.map +1 -1
- package/dist/tool-calling/json-parser.d.ts.map +1 -1
- package/dist/tool-calling/json-parser.js +2 -10
- package/dist/tool-calling/json-parser.js.map +1 -1
- package/dist/tool-calling/json-parser.spec.js +7 -7
- package/dist/tool-calling/json-parser.spec.js.map +1 -1
- package/dist/tool-calling/tool-parser.d.ts.map +1 -1
- package/dist/tool-calling/tool-parser.js +1 -1
- package/dist/tool-calling/tool-parser.js.map +1 -1
- package/dist/tool-calling/tool-parser.spec.js +3 -3
- package/dist/tool-calling/tool-parser.spec.js.map +1 -1
- package/dist/tools/create-file.d.ts.map +1 -1
- package/dist/tools/create-file.js +7 -7
- package/dist/tools/create-file.js.map +1 -1
- package/dist/tools/delete-lines.d.ts.map +1 -1
- package/dist/tools/delete-lines.js +9 -9
- package/dist/tools/delete-lines.js.map +1 -1
- package/dist/tools/execute-bash.d.ts.map +1 -1
- package/dist/tools/execute-bash.js +3 -3
- package/dist/tools/execute-bash.js.map +1 -1
- package/dist/tools/execute-function.spec.js +4 -4
- package/dist/tools/execute-function.spec.js.map +1 -1
- package/dist/tools/fetch-url.d.ts.map +1 -1
- package/dist/tools/fetch-url.js +3 -3
- package/dist/tools/fetch-url.js.map +1 -1
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +6 -6
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +7 -7
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/insert-lines.d.ts.map +1 -1
- package/dist/tools/insert-lines.js +8 -8
- package/dist/tools/insert-lines.js.map +1 -1
- package/dist/tools/lsp-get-diagnostics.d.ts.map +1 -1
- package/dist/tools/lsp-get-diagnostics.js +5 -5
- package/dist/tools/lsp-get-diagnostics.js.map +1 -1
- package/dist/tools/needs-approval.spec.js +6 -6
- package/dist/tools/needs-approval.spec.js.map +1 -1
- package/dist/tools/read-file.js +6 -6
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/replace-lines.d.ts.map +1 -1
- package/dist/tools/replace-lines.js +8 -8
- package/dist/tools/replace-lines.js.map +1 -1
- package/dist/tools/search-file-contents.d.ts.map +1 -1
- package/dist/tools/search-file-contents.js +6 -6
- package/dist/tools/search-file-contents.js.map +1 -1
- package/dist/tools/tool-manager.d.ts +1 -1
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +1 -1
- package/dist/tools/tool-manager.js.map +1 -1
- package/dist/tools/tool-registry.d.ts +1 -1
- package/dist/tools/tool-registry.d.ts.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +4 -4
- package/dist/tools/web-search.js.map +1 -1
- package/dist/types/app.d.ts +6 -3
- package/dist/types/app.d.ts.map +1 -1
- package/dist/types/checkpoint.d.ts +43 -0
- package/dist/types/checkpoint.d.ts.map +1 -0
- package/dist/types/checkpoint.js +2 -0
- package/dist/types/checkpoint.js.map +1 -0
- package/dist/types/config.d.ts +0 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/core-connection-status.spec.js.map +1 -1
- package/dist/types/core.d.ts +1 -1
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/core.js +1 -1
- package/dist/types/core.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/usage/calculator.spec.js +1 -1
- package/dist/usage/calculator.spec.js.map +1 -1
- package/dist/usage/storage.d.ts +1 -1
- package/dist/usage/storage.d.ts.map +1 -1
- package/dist/usage/storage.js +9 -3
- package/dist/usage/storage.js.map +1 -1
- package/dist/usage/storage.spec.js +3 -3
- package/dist/usage/storage.spec.js.map +1 -1
- package/dist/usage/tracker.d.ts.map +1 -1
- package/dist/usage/tracker.js +1 -1
- package/dist/usage/tracker.js.map +1 -1
- package/dist/usage/tracker.spec.js +4 -4
- package/dist/usage/tracker.spec.js.map +1 -1
- package/dist/utils/atomic-deletion.spec.js +1 -1
- package/dist/utils/atomic-deletion.spec.js.map +1 -1
- package/dist/utils/checkpoint-utils.d.ts +12 -0
- package/dist/utils/checkpoint-utils.d.ts.map +1 -0
- package/dist/utils/checkpoint-utils.js +85 -0
- package/dist/utils/checkpoint-utils.js.map +1 -0
- package/dist/utils/checkpoint-utils.spec.d.ts +2 -0
- package/dist/utils/checkpoint-utils.spec.d.ts.map +1 -0
- package/dist/utils/checkpoint-utils.spec.js +182 -0
- package/dist/utils/checkpoint-utils.spec.js.map +1 -0
- package/dist/utils/error-formatter.d.ts +35 -0
- package/dist/utils/error-formatter.d.ts.map +1 -1
- package/dist/utils/error-formatter.js +123 -0
- package/dist/utils/error-formatter.js.map +1 -1
- package/dist/utils/file-autocomplete.js +2 -2
- package/dist/utils/file-autocomplete.js.map +1 -1
- package/dist/utils/file-autocomplete.spec.js +1 -1
- package/dist/utils/file-autocomplete.spec.js.map +1 -1
- package/dist/utils/file-content-loader.js +1 -1
- package/dist/utils/file-content-loader.js.map +1 -1
- package/dist/utils/file-content-loader.spec.js +4 -4
- package/dist/utils/file-content-loader.spec.js.map +1 -1
- package/dist/utils/file-mention-handler.js.map +1 -1
- package/dist/utils/file-mention-handler.spec.js +4 -4
- package/dist/utils/file-mention-handler.spec.js.map +1 -1
- package/dist/utils/file-mention-parser.spec.js +2 -2
- package/dist/utils/file-mention-parser.spec.js.map +1 -1
- package/dist/utils/installation-detector.js +2 -2
- package/dist/utils/installation-detector.js.map +1 -1
- package/dist/utils/installation-detector.spec.js +10 -17
- package/dist/utils/installation-detector.spec.js.map +1 -1
- package/dist/utils/logging/config.d.ts +41 -0
- package/dist/utils/logging/config.d.ts.map +1 -0
- package/dist/utils/logging/config.js +188 -0
- package/dist/utils/logging/config.js.map +1 -0
- package/dist/utils/logging/config.spec.d.ts +2 -0
- package/dist/utils/logging/config.spec.d.ts.map +1 -0
- package/dist/utils/logging/config.spec.js +233 -0
- package/dist/utils/logging/config.spec.js.map +1 -0
- package/dist/utils/logging/console-facade.d.ts +93 -0
- package/dist/utils/logging/console-facade.d.ts.map +1 -0
- package/dist/utils/logging/console-facade.js +295 -0
- package/dist/utils/logging/console-facade.js.map +1 -0
- package/dist/utils/logging/console-facade.spec.d.ts +2 -0
- package/dist/utils/logging/console-facade.spec.d.ts.map +1 -0
- package/dist/utils/logging/console-facade.spec.js +143 -0
- package/dist/utils/logging/console-facade.spec.js.map +1 -0
- package/dist/utils/logging/correlation.d.ts +139 -0
- package/dist/utils/logging/correlation.d.ts.map +1 -0
- package/dist/utils/logging/correlation.js +410 -0
- package/dist/utils/logging/correlation.js.map +1 -0
- package/dist/utils/logging/correlation.spec.d.ts +2 -0
- package/dist/utils/logging/correlation.spec.d.ts.map +1 -0
- package/dist/utils/logging/correlation.spec.js +449 -0
- package/dist/utils/logging/correlation.spec.js.map +1 -0
- package/dist/utils/logging/formatters.d.ts +70 -0
- package/dist/utils/logging/formatters.d.ts.map +1 -0
- package/dist/utils/logging/formatters.js +186 -0
- package/dist/utils/logging/formatters.js.map +1 -0
- package/dist/utils/logging/formatters.spec.d.ts +2 -0
- package/dist/utils/logging/formatters.spec.d.ts.map +1 -0
- package/dist/utils/logging/formatters.spec.js +356 -0
- package/dist/utils/logging/formatters.spec.js.map +1 -0
- package/dist/utils/logging/health-monitor.d.ts +216 -0
- package/dist/utils/logging/health-monitor.d.ts.map +1 -0
- package/dist/utils/logging/health-monitor.js +760 -0
- package/dist/utils/logging/health-monitor.js.map +1 -0
- package/dist/utils/logging/health-monitor.spec.d.ts +2 -0
- package/dist/utils/logging/health-monitor.spec.d.ts.map +1 -0
- package/dist/utils/logging/health-monitor.spec.js +305 -0
- package/dist/utils/logging/health-monitor.spec.js.map +1 -0
- package/dist/utils/logging/index.d.ts +100 -0
- package/dist/utils/logging/index.d.ts.map +1 -0
- package/dist/utils/logging/index.js +186 -0
- package/dist/utils/logging/index.js.map +1 -0
- package/dist/utils/logging/index.spec.d.ts +2 -0
- package/dist/utils/logging/index.spec.d.ts.map +1 -0
- package/dist/utils/logging/index.spec.js +214 -0
- package/dist/utils/logging/index.spec.js.map +1 -0
- package/dist/utils/logging/integration.spec.d.ts +2 -0
- package/dist/utils/logging/integration.spec.d.ts.map +1 -0
- package/dist/utils/logging/integration.spec.js +312 -0
- package/dist/utils/logging/integration.spec.js.map +1 -0
- package/dist/utils/logging/log-method-factory.d.ts +43 -0
- package/dist/utils/logging/log-method-factory.d.ts.map +1 -0
- package/dist/utils/logging/log-method-factory.js +176 -0
- package/dist/utils/logging/log-method-factory.js.map +1 -0
- package/dist/utils/logging/log-method-factory.spec.d.ts +2 -0
- package/dist/utils/logging/log-method-factory.spec.d.ts.map +1 -0
- package/dist/utils/logging/log-method-factory.spec.js +428 -0
- package/dist/utils/logging/log-method-factory.spec.js.map +1 -0
- package/dist/utils/logging/log-query.d.ts +275 -0
- package/dist/utils/logging/log-query.d.ts.map +1 -0
- package/dist/utils/logging/log-query.js +621 -0
- package/dist/utils/logging/log-query.js.map +1 -0
- package/dist/utils/logging/log-query.spec.d.ts +2 -0
- package/dist/utils/logging/log-query.spec.d.ts.map +1 -0
- package/dist/utils/logging/log-query.spec.js +737 -0
- package/dist/utils/logging/log-query.spec.js.map +1 -0
- package/dist/utils/logging/logger-provider.d.ts +73 -0
- package/dist/utils/logging/logger-provider.d.ts.map +1 -0
- package/dist/utils/logging/logger-provider.js +298 -0
- package/dist/utils/logging/logger-provider.js.map +1 -0
- package/dist/utils/logging/logger-provider.spec.d.ts +2 -0
- package/dist/utils/logging/logger-provider.spec.d.ts.map +1 -0
- package/dist/utils/logging/logger-provider.spec.js +204 -0
- package/dist/utils/logging/logger-provider.spec.js.map +1 -0
- package/dist/utils/logging/performance.d.ts +147 -0
- package/dist/utils/logging/performance.d.ts.map +1 -0
- package/dist/utils/logging/performance.js +520 -0
- package/dist/utils/logging/performance.js.map +1 -0
- package/dist/utils/logging/performance.spec.d.ts +2 -0
- package/dist/utils/logging/performance.spec.d.ts.map +1 -0
- package/dist/utils/logging/performance.spec.js +139 -0
- package/dist/utils/logging/performance.spec.js.map +1 -0
- package/dist/utils/logging/pino-logger.d.ts +22 -0
- package/dist/utils/logging/pino-logger.d.ts.map +1 -0
- package/dist/utils/logging/pino-logger.js +372 -0
- package/dist/utils/logging/pino-logger.js.map +1 -0
- package/dist/utils/logging/pino-logger.spec.d.ts +2 -0
- package/dist/utils/logging/pino-logger.spec.d.ts.map +1 -0
- package/dist/utils/logging/pino-logger.spec.js +294 -0
- package/dist/utils/logging/pino-logger.spec.js.map +1 -0
- package/dist/utils/logging/redaction.d.ts +38 -0
- package/dist/utils/logging/redaction.d.ts.map +1 -0
- package/dist/utils/logging/redaction.js +210 -0
- package/dist/utils/logging/redaction.js.map +1 -0
- package/dist/utils/logging/redaction.spec.d.ts +2 -0
- package/dist/utils/logging/redaction.spec.d.ts.map +1 -0
- package/dist/utils/logging/redaction.spec.js +338 -0
- package/dist/utils/logging/redaction.spec.js.map +1 -0
- package/dist/utils/logging/request-tracker.d.ts +189 -0
- package/dist/utils/logging/request-tracker.d.ts.map +1 -0
- package/dist/utils/logging/request-tracker.js +569 -0
- package/dist/utils/logging/request-tracker.js.map +1 -0
- package/dist/utils/logging/request-tracker.spec.d.ts +2 -0
- package/dist/utils/logging/request-tracker.spec.d.ts.map +1 -0
- package/dist/utils/logging/request-tracker.spec.js +868 -0
- package/dist/utils/logging/request-tracker.spec.js.map +1 -0
- package/dist/utils/logging/transports.d.ts +55 -0
- package/dist/utils/logging/transports.d.ts.map +1 -0
- package/dist/utils/logging/transports.js +252 -0
- package/dist/utils/logging/transports.js.map +1 -0
- package/dist/utils/logging/transports.spec.d.ts +2 -0
- package/dist/utils/logging/transports.spec.d.ts.map +1 -0
- package/dist/utils/logging/transports.spec.js +390 -0
- package/dist/utils/logging/transports.spec.js.map +1 -0
- package/dist/utils/logging/types.d.ts +173 -0
- package/dist/utils/logging/types.d.ts.map +1 -0
- package/dist/utils/logging/types.js +5 -0
- package/dist/utils/logging/types.js.map +1 -0
- package/dist/utils/message-queue.d.ts +64 -4
- package/dist/utils/message-queue.d.ts.map +1 -1
- package/dist/utils/message-queue.js +282 -28
- package/dist/utils/message-queue.js.map +1 -1
- package/dist/utils/paste-utils.spec.js +1 -1
- package/dist/utils/paste-utils.spec.js.map +1 -1
- package/dist/utils/prompt-processor.js +2 -2
- package/dist/utils/prompt-processor.js.map +1 -1
- package/dist/utils/tool-cancellation.spec.js.map +1 -1
- package/dist/utils/tool-result-display.d.ts +2 -2
- package/dist/utils/tool-result-display.d.ts.map +1 -1
- package/dist/utils/tool-result-display.js +3 -3
- package/dist/utils/tool-result-display.js.map +1 -1
- package/dist/utils/update-checker.d.ts.map +1 -1
- package/dist/utils/update-checker.js +1 -1
- package/dist/utils/update-checker.js.map +1 -1
- package/dist/utils/update-checker.spec.js +2 -2
- package/dist/utils/update-checker.spec.js.map +1 -1
- package/dist/vscode/extension-installer.js +1 -1
- package/dist/vscode/extension-installer.js.map +1 -1
- package/dist/vscode/extension-installer.spec.js +1 -1
- package/dist/vscode/extension-installer.spec.js.map +1 -1
- package/dist/vscode/protocol.spec.js +1 -1
- package/dist/vscode/protocol.spec.js.map +1 -1
- package/dist/vscode/vscode-server.d.ts.map +1 -1
- package/dist/vscode/vscode-server.js +2 -2
- package/dist/vscode/vscode-server.js.map +1 -1
- package/dist/vscode/vscode-server.spec.js.map +1 -1
- package/dist/wizard/config-wizard.d.ts.map +1 -1
- package/dist/wizard/config-wizard.js +16 -12
- package/dist/wizard/config-wizard.js.map +1 -1
- package/dist/wizard/steps/location-step.js +4 -4
- package/dist/wizard/steps/location-step.js.map +1 -1
- package/dist/wizard/steps/mcp-step.d.ts.map +1 -1
- package/dist/wizard/steps/mcp-step.js +4 -4
- package/dist/wizard/steps/mcp-step.js.map +1 -1
- package/dist/wizard/steps/provider-step.d.ts.map +1 -1
- package/dist/wizard/steps/provider-step.js +4 -4
- package/dist/wizard/steps/provider-step.js.map +1 -1
- package/dist/wizard/steps/summary-step.d.ts.map +1 -1
- package/dist/wizard/steps/summary-step.js +2 -2
- package/dist/wizard/steps/summary-step.js.map +1 -1
- package/dist/wizard/templates/provider-templates.d.ts.map +1 -1
- package/dist/wizard/templates/provider-templates.js +64 -0
- package/dist/wizard/templates/provider-templates.js.map +1 -1
- package/dist/wizard/validation-array.spec.js +1 -1
- package/dist/wizard/validation-array.spec.js.map +1 -1
- package/dist/wizard/validation.spec.js +1 -1
- package/dist/wizard/validation.spec.js.map +1 -1
- package/package.json +23 -22
- package/dist/commands/debugging.d.ts +0 -3
- package/dist/commands/debugging.d.ts.map +0 -1
- package/dist/commands/debugging.js +0 -23
- 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
|