@path58/n8n-mcp 0.1.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/AGENT_INSTALL.md +223 -0
- package/CHANGELOG.md +38 -0
- package/LICENSE +21 -0
- package/README.md +187 -0
- package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js +465 -0
- package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/fixer-registry.js +495 -0
- package/dist/autofix/suggestion-fixers/fixer-registry.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l1-structure-fixer.js +639 -0
- package/dist/autofix/suggestion-fixers/l1-structure-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l4-connection-fixer.js +449 -0
- package/dist/autofix/suggestion-fixers/l4-connection-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js +575 -0
- package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js +431 -0
- package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js +356 -0
- package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js +618 -0
- package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js +1475 -0
- package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/llm-fixer.js +716 -0
- package/dist/autofix/suggestion-fixers/llm-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/missing-credential-fixer.js +336 -0
- package/dist/autofix/suggestion-fixers/missing-credential-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/types.js +29 -0
- package/dist/autofix/suggestion-fixers/types.js.map +1 -0
- package/dist/autofix/suggestion-fixers/typo-fixer.js +197 -0
- package/dist/autofix/suggestion-fixers/typo-fixer.js.map +1 -0
- package/dist/classification/certification-engine.js +208 -0
- package/dist/classification/certification-engine.js.map +1 -0
- package/dist/classification/feedback-collector.js +516 -0
- package/dist/classification/feedback-collector.js.map +1 -0
- package/dist/classification/l5-parameter-analyzer.js +670 -0
- package/dist/classification/l5-parameter-analyzer.js.map +1 -0
- package/dist/classification/l6-graph-analyzer.js +613 -0
- package/dist/classification/l6-graph-analyzer.js.map +1 -0
- package/dist/classification/severity-classifier.js +237 -0
- package/dist/classification/severity-classifier.js.map +1 -0
- package/dist/config/env.js +280 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/env.schema.js +234 -0
- package/dist/config/env.schema.js.map +1 -0
- package/dist/config/scraperEnv.js +55 -0
- package/dist/config/scraperEnv.js.map +1 -0
- package/dist/db/postgresClient.js +38 -0
- package/dist/db/postgresClient.js.map +1 -0
- package/dist/db/scraperDb.js +6 -0
- package/dist/db/scraperDb.js.map +1 -0
- package/dist/db/scraperPostgresClient.js +118 -0
- package/dist/db/scraperPostgresClient.js.map +1 -0
- package/dist/db/validationRepository.js +55 -0
- package/dist/db/validationRepository.js.map +1 -0
- package/dist/db/validatorPostgresClient.js +248 -0
- package/dist/db/validatorPostgresClient.js.map +1 -0
- package/dist/db/workflowInstanceMappingRepository.js +128 -0
- package/dist/db/workflowInstanceMappingRepository.js.map +1 -0
- package/dist/errors/AppError.js +156 -0
- package/dist/errors/AppError.js.map +1 -0
- package/dist/errors/index.js +7 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/factory/error-to-problem-mappers.js +385 -0
- package/dist/factory/error-to-problem-mappers.js.map +1 -0
- package/dist/factory/gap-recorder.js +260 -0
- package/dist/factory/gap-recorder.js.map +1 -0
- package/dist/factory/problem-recorder.js +94 -0
- package/dist/factory/problem-recorder.js.map +1 -0
- package/dist/factory/warning-to-gap-mappers.js +493 -0
- package/dist/factory/warning-to-gap-mappers.js.map +1 -0
- package/dist/factory/workflow-normalizer.js +247 -0
- package/dist/factory/workflow-normalizer.js.map +1 -0
- package/dist/mcp/adapters/catalog.js +13 -0
- package/dist/mcp/adapters/catalog.js.map +1 -0
- package/dist/mcp/adapters/index.js +36 -0
- package/dist/mcp/adapters/index.js.map +1 -0
- package/dist/mcp/adapters/supabase-catalog.js +467 -0
- package/dist/mcp/adapters/supabase-catalog.js.map +1 -0
- package/dist/mcp/adapters/test-catalog-adapter.js +100 -0
- package/dist/mcp/adapters/test-catalog-adapter.js.map +1 -0
- package/dist/mcp/adapters/validation.js +258 -0
- package/dist/mcp/adapters/validation.js.map +1 -0
- package/dist/mcp/build-email-workflow.js +113 -0
- package/dist/mcp/build-email-workflow.js.map +1 -0
- package/dist/mcp/config.js +22 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/formatters/errors.js +217 -0
- package/dist/mcp/formatters/errors.js.map +1 -0
- package/dist/mcp/formatters/index.js +12 -0
- package/dist/mcp/formatters/index.js.map +1 -0
- package/dist/mcp/formatters/response.js +141 -0
- package/dist/mcp/formatters/response.js.map +1 -0
- package/dist/mcp/quick-test.js +33 -0
- package/dist/mcp/quick-test.js.map +1 -0
- package/dist/mcp/server.js +70 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/test-mcp-error.js +81 -0
- package/dist/mcp/test-mcp-error.js.map +1 -0
- package/dist/mcp/test-mcp.js +80 -0
- package/dist/mcp/test-mcp.js.map +1 -0
- package/dist/mcp/tools/fixes/expression-fixes.js +166 -0
- package/dist/mcp/tools/fixes/expression-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/flow-fixes.js +155 -0
- package/dist/mcp/tools/fixes/flow-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/index.js +91 -0
- package/dist/mcp/tools/fixes/index.js.map +1 -0
- package/dist/mcp/tools/fixes/node-fixes.js +233 -0
- package/dist/mcp/tools/fixes/node-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/parameter-fixes.js +277 -0
- package/dist/mcp/tools/fixes/parameter-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/types.js +10 -0
- package/dist/mcp/tools/fixes/types.js.map +1 -0
- package/dist/mcp/tools/handlers/check-parameter.js +300 -0
- package/dist/mcp/tools/handlers/check-parameter.js.map +1 -0
- package/dist/mcp/tools/handlers/find-similar-pattern.js +121 -0
- package/dist/mcp/tools/handlers/find-similar-pattern.js.map +1 -0
- package/dist/mcp/tools/handlers/get-node-info.js +131 -0
- package/dist/mcp/tools/handlers/get-node-info.js.map +1 -0
- package/dist/mcp/tools/handlers/get-operation-schema.js +141 -0
- package/dist/mcp/tools/handlers/get-operation-schema.js.map +1 -0
- package/dist/mcp/tools/handlers/list-nodes.js +126 -0
- package/dist/mcp/tools/handlers/list-nodes.js.map +1 -0
- package/dist/mcp/tools/handlers/list-operations.js +138 -0
- package/dist/mcp/tools/handlers/list-operations.js.map +1 -0
- package/dist/mcp/tools/handlers/suggest-fix.js +120 -0
- package/dist/mcp/tools/handlers/suggest-fix.js.map +1 -0
- package/dist/mcp/tools/handlers/validate-workflow.js +92 -0
- package/dist/mcp/tools/handlers/validate-workflow.js.map +1 -0
- package/dist/mcp/tools/index.js +190 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/schemas.js +195 -0
- package/dist/mcp/tools/schemas.js.map +1 -0
- package/dist/mcp/tools/validate.js +95 -0
- package/dist/mcp/tools/validate.js.map +1 -0
- package/dist/mcp/types/mcp.js +7 -0
- package/dist/mcp/types/mcp.js.map +1 -0
- package/dist/mcp/utils/timeout.js +78 -0
- package/dist/mcp/utils/timeout.js.map +1 -0
- package/dist/services/BatchProcessor.js +433 -0
- package/dist/services/BatchProcessor.js.map +1 -0
- package/dist/services/CheckpointManager.js +281 -0
- package/dist/services/CheckpointManager.js.map +1 -0
- package/dist/services/CostCalculator.js +211 -0
- package/dist/services/CostCalculator.js.map +1 -0
- package/dist/services/EmbeddingCache.js +68 -0
- package/dist/services/EmbeddingCache.js.map +1 -0
- package/dist/services/EmbeddingService.js +143 -0
- package/dist/services/EmbeddingService.js.map +1 -0
- package/dist/services/RankingService.js +81 -0
- package/dist/services/RankingService.js.map +1 -0
- package/dist/services/RedisCache.js +376 -0
- package/dist/services/RedisCache.js.map +1 -0
- package/dist/services/RedisCatalogCache.js +680 -0
- package/dist/services/RedisCatalogCache.js.map +1 -0
- package/dist/services/ResumeManager.js +252 -0
- package/dist/services/ResumeManager.js.map +1 -0
- package/dist/services/SearchService.js +282 -0
- package/dist/services/SearchService.js.map +1 -0
- package/dist/services/SemanticCatalogSearch.js +405 -0
- package/dist/services/SemanticCatalogSearch.js.map +1 -0
- package/dist/services/ValidationCache.js +157 -0
- package/dist/services/ValidationCache.js.map +1 -0
- package/dist/services/WorkflowPipelineService.js +1997 -0
- package/dist/services/WorkflowPipelineService.js.map +1 -0
- package/dist/services/catalog/index.js +34 -0
- package/dist/services/catalog/index.js.map +1 -0
- package/dist/services/catalog/interfaces.js +17 -0
- package/dist/services/catalog/interfaces.js.map +1 -0
- package/dist/services/catalog/loaders.js +169 -0
- package/dist/services/catalog/loaders.js.map +1 -0
- package/dist/services/catalog/types.js +138 -0
- package/dist/services/catalog/types.js.map +1 -0
- package/dist/services/documentation-normalization/docUrlUtils.js +88 -0
- package/dist/services/documentation-normalization/docUrlUtils.js.map +1 -0
- package/dist/services/error-quality/ErrorQualityService.js +262 -0
- package/dist/services/error-quality/ErrorQualityService.js.map +1 -0
- package/dist/services/error-quality/analyzers/CredentialAnalyzer.js +260 -0
- package/dist/services/error-quality/analyzers/CredentialAnalyzer.js.map +1 -0
- package/dist/services/error-quality/analyzers/IssuePredictor.js +380 -0
- package/dist/services/error-quality/analyzers/IssuePredictor.js.map +1 -0
- package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js +267 -0
- package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js.map +1 -0
- package/dist/services/error-quality/data/ErrorPatternSeeder.js +963 -0
- package/dist/services/error-quality/data/ErrorPatternSeeder.js.map +1 -0
- package/dist/services/error-quality/index.js +25 -0
- package/dist/services/error-quality/index.js.map +1 -0
- package/dist/services/error-quality/reports/ReportGenerator.js +343 -0
- package/dist/services/error-quality/reports/ReportGenerator.js.map +1 -0
- package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js +698 -0
- package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js.map +1 -0
- package/dist/services/error-quality/types.js +11 -0
- package/dist/services/error-quality/types.js.map +1 -0
- package/dist/services/progress/ProgressTracker.js +288 -0
- package/dist/services/progress/ProgressTracker.js.map +1 -0
- package/dist/services/progress/formatters.js +122 -0
- package/dist/services/progress/formatters.js.map +1 -0
- package/dist/services/progress/index.js +36 -0
- package/dist/services/progress/index.js.map +1 -0
- package/dist/services/progress/types.js +7 -0
- package/dist/services/progress/types.js.map +1 -0
- package/dist/services/search/embeddingGenerator.js +112 -0
- package/dist/services/search/embeddingGenerator.js.map +1 -0
- package/dist/types/aiCapabilities.js +7 -0
- package/dist/types/aiCapabilities.js.map +1 -0
- package/dist/types/aiConfigSchema.js +7 -0
- package/dist/types/aiConfigSchema.js.map +1 -0
- package/dist/utils/bannerLogger.js +186 -0
- package/dist/utils/bannerLogger.js.map +1 -0
- package/dist/utils/bannerService.js +23 -0
- package/dist/utils/bannerService.js.map +1 -0
- package/dist/utils/bannerServiceAdapter.js +54 -0
- package/dist/utils/bannerServiceAdapter.js.map +1 -0
- package/dist/utils/batchLogger.js +171 -0
- package/dist/utils/batchLogger.js.map +1 -0
- package/dist/utils/bottomStickyBanner.js +239 -0
- package/dist/utils/bottomStickyBanner.js.map +1 -0
- package/dist/utils/credentialMatcher.js +206 -0
- package/dist/utils/credentialMatcher.js.map +1 -0
- package/dist/utils/credentialNormalizer.js +442 -0
- package/dist/utils/credentialNormalizer.js.map +1 -0
- package/dist/utils/integratedBannerLogger.js +59 -0
- package/dist/utils/integratedBannerLogger.js.map +1 -0
- package/dist/utils/n8nSourceGit.js +195 -0
- package/dist/utils/n8nSourceGit.js.map +1 -0
- package/dist/utils/nodeTypeNormalizer.js +131 -0
- package/dist/utils/nodeTypeNormalizer.js.map +1 -0
- package/dist/utils/openaiClient.js +397 -0
- package/dist/utils/openaiClient.js.map +1 -0
- package/dist/utils/productionLogger.js +16 -0
- package/dist/utils/productionLogger.js.map +1 -0
- package/dist/utils/progressBarBanner.js +132 -0
- package/dist/utils/progressBarBanner.js.map +1 -0
- package/dist/utils/scriptHeartbeat.js +117 -0
- package/dist/utils/scriptHeartbeat.js.map +1 -0
- package/dist/utils/scriptLogger.js +125 -0
- package/dist/utils/scriptLogger.js.map +1 -0
- package/dist/utils/scriptRunner.js +95 -0
- package/dist/utils/scriptRunner.js.map +1 -0
- package/dist/utils/scriptTimeout.js +128 -0
- package/dist/utils/scriptTimeout.js.map +1 -0
- package/dist/utils/scriptWrapper.js +219 -0
- package/dist/utils/scriptWrapper.js.map +1 -0
- package/dist/utils/stickyBanner.js +226 -0
- package/dist/utils/stickyBanner.js.map +1 -0
- package/dist/utils/terminalSpinner.js +97 -0
- package/dist/utils/terminalSpinner.js.map +1 -0
- package/dist/utils/threeLineBanner.js +427 -0
- package/dist/utils/threeLineBanner.js.map +1 -0
- package/dist/utils/validatorCheckpointManager.js +170 -0
- package/dist/utils/validatorCheckpointManager.js.map +1 -0
- package/dist/utils/validatorConnectionManager.js +124 -0
- package/dist/utils/validatorConnectionManager.js.map +1 -0
- package/dist/validation/catalog.js +56 -0
- package/dist/validation/catalog.js.map +1 -0
- package/dist/validation/config/deprecated-nodes.js +234 -0
- package/dist/validation/config/deprecated-nodes.js.map +1 -0
- package/dist/validation/config/l6-severity.js +227 -0
- package/dist/validation/config/l6-severity.js.map +1 -0
- package/dist/validation/config/terminal-nodes.js +132 -0
- package/dist/validation/config/terminal-nodes.js.map +1 -0
- package/dist/validation/config/unreachable-nodes.js +67 -0
- package/dist/validation/config/unreachable-nodes.js.map +1 -0
- package/dist/validation/core.js +47 -0
- package/dist/validation/core.js.map +1 -0
- package/dist/validation/docExtraction.js +12 -0
- package/dist/validation/docExtraction.js.map +1 -0
- package/dist/validation/dryRunMockRunner.js +128 -0
- package/dist/validation/dryRunMockRunner.js.map +1 -0
- package/dist/validation/fixtureEngine.js +61 -0
- package/dist/validation/fixtureEngine.js.map +1 -0
- package/dist/validation/index.js +15 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/k-levels/k2-blockers.js +222 -0
- package/dist/validation/k-levels/k2-blockers.js.map +1 -0
- package/dist/validation/l1-structure.js +296 -0
- package/dist/validation/l1-structure.js.map +1 -0
- package/dist/validation/l2-nodes.js +282 -0
- package/dist/validation/l2-nodes.js.map +1 -0
- package/dist/validation/l3-credentials.js +322 -0
- package/dist/validation/l3-credentials.js.map +1 -0
- package/dist/validation/l4-connections.js +698 -0
- package/dist/validation/l4-connections.js.map +1 -0
- package/dist/validation/l5-parameters.js +803 -0
- package/dist/validation/l5-parameters.js.map +1 -0
- package/dist/validation/l6-checks/ai-tool-variants.js +407 -0
- package/dist/validation/l6-checks/ai-tool-variants.js.map +1 -0
- package/dist/validation/l6-checks/catalog-checks.js +260 -0
- package/dist/validation/l6-checks/catalog-checks.js.map +1 -0
- package/dist/validation/l6-checks/data-contracts.js +197 -0
- package/dist/validation/l6-checks/data-contracts.js.map +1 -0
- package/dist/validation/l6-checks/deprecation.js +133 -0
- package/dist/validation/l6-checks/deprecation.js.map +1 -0
- package/dist/validation/l6-checks/error-handling.js +193 -0
- package/dist/validation/l6-checks/error-handling.js.map +1 -0
- package/dist/validation/l6-checks/expression-syntax.js +387 -0
- package/dist/validation/l6-checks/expression-syntax.js.map +1 -0
- package/dist/validation/l6-checks/flow-integrity.js +504 -0
- package/dist/validation/l6-checks/flow-integrity.js.map +1 -0
- package/dist/validation/l6-checks/index.js +106 -0
- package/dist/validation/l6-checks/index.js.map +1 -0
- package/dist/validation/l6-checks/loops.js +370 -0
- package/dist/validation/l6-checks/loops.js.map +1 -0
- package/dist/validation/l6-checks/performance.js +182 -0
- package/dist/validation/l6-checks/performance.js.map +1 -0
- package/dist/validation/l6-checks/security.js +273 -0
- package/dist/validation/l6-checks/security.js.map +1 -0
- package/dist/validation/l6-patterns.js +472 -0
- package/dist/validation/l6-patterns.js.map +1 -0
- package/dist/validation/mockLevelResolver.js +95 -0
- package/dist/validation/mockLevelResolver.js.map +1 -0
- package/dist/validation/n8nApiClient.js +21 -0
- package/dist/validation/n8nApiClient.js.map +1 -0
- package/dist/validation/n8nCli.js +87 -0
- package/dist/validation/n8nCli.js.map +1 -0
- package/dist/validation/types.js +8 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/usageStats.js +82 -0
- package/dist/validation/usageStats.js.map +1 -0
- package/package.json +274 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiConfigSchema.js","sourceRoot":"","sources":["../../src/types/aiConfigSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Banner Logger
|
|
3
|
+
*
|
|
4
|
+
* Intercepts console.log/warn/error and routes them to the banner's log area
|
|
5
|
+
* while keeping the banner fixed at the bottom.
|
|
6
|
+
*/
|
|
7
|
+
import { getBottomBanner, COLORS } from './bottomStickyBanner.js';
|
|
8
|
+
class BannerLogger {
|
|
9
|
+
originalConsoleLog = null;
|
|
10
|
+
originalConsoleWarn = null;
|
|
11
|
+
originalConsoleError = null;
|
|
12
|
+
originalConsoleInfo = null;
|
|
13
|
+
isIntercepted = false;
|
|
14
|
+
banner = getBottomBanner();
|
|
15
|
+
/**
|
|
16
|
+
* Start intercepting console output
|
|
17
|
+
*/
|
|
18
|
+
intercept() {
|
|
19
|
+
if (this.isIntercepted)
|
|
20
|
+
return;
|
|
21
|
+
// Store originals
|
|
22
|
+
this.originalConsoleLog = console.log;
|
|
23
|
+
this.originalConsoleWarn = console.warn;
|
|
24
|
+
this.originalConsoleError = console.error;
|
|
25
|
+
this.originalConsoleInfo = console.info;
|
|
26
|
+
// Override console methods
|
|
27
|
+
// Write logs within the scroll region (above the banner)
|
|
28
|
+
// The banner sets scroll region to rows 1..(H-5), so logs should scroll there
|
|
29
|
+
const writeLogAboveBanner = (message) => {
|
|
30
|
+
// Get terminal height to calculate scroll region
|
|
31
|
+
const terminalHeight = process.stdout.rows || 24;
|
|
32
|
+
const scrollBottom = Math.max(1, terminalHeight - 5); // Banner is last 5 lines (divider + 4 lines)
|
|
33
|
+
// Ensure we're writing within the scroll region
|
|
34
|
+
// The banner manages the scroll region, so we just write normally
|
|
35
|
+
// and the terminal will scroll within the region
|
|
36
|
+
process.stdout.write(message + '\n');
|
|
37
|
+
};
|
|
38
|
+
console.log = (...args) => {
|
|
39
|
+
// Check if first arg is a JSON string (structured logger output)
|
|
40
|
+
const firstArg = args[0];
|
|
41
|
+
if (typeof firstArg === 'string') {
|
|
42
|
+
const trimmed = firstArg.trim();
|
|
43
|
+
if (trimmed.startsWith('{')) {
|
|
44
|
+
try {
|
|
45
|
+
const parsed = JSON.parse(trimmed);
|
|
46
|
+
if (parsed.level && parsed.message) {
|
|
47
|
+
// It's structured logger output - format it properly
|
|
48
|
+
const level = parsed.level.toLowerCase();
|
|
49
|
+
const message = this.formatStructuredLog(parsed, level);
|
|
50
|
+
writeLogAboveBanner(message);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Not JSON, continue with normal formatting
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Regular console.log output
|
|
60
|
+
const message = this.formatMessage(args, 'info');
|
|
61
|
+
writeLogAboveBanner(message);
|
|
62
|
+
};
|
|
63
|
+
console.info = (...args) => {
|
|
64
|
+
const message = this.formatMessage(args, 'info');
|
|
65
|
+
writeLogAboveBanner(message);
|
|
66
|
+
};
|
|
67
|
+
console.warn = (...args) => {
|
|
68
|
+
const message = this.formatMessage(args, 'warn');
|
|
69
|
+
writeLogAboveBanner(message);
|
|
70
|
+
};
|
|
71
|
+
console.error = (...args) => {
|
|
72
|
+
const message = this.formatMessage(args, 'error');
|
|
73
|
+
writeLogAboveBanner(message);
|
|
74
|
+
};
|
|
75
|
+
this.isIntercepted = true;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Restore original console methods
|
|
79
|
+
*/
|
|
80
|
+
restore() {
|
|
81
|
+
if (!this.isIntercepted || !this.originalConsoleLog)
|
|
82
|
+
return;
|
|
83
|
+
console.log = this.originalConsoleLog;
|
|
84
|
+
console.warn = this.originalConsoleWarn;
|
|
85
|
+
console.error = this.originalConsoleError;
|
|
86
|
+
console.info = this.originalConsoleInfo;
|
|
87
|
+
this.isIntercepted = false;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Format message with color based on level
|
|
91
|
+
* Handles both structured logger JSON output and regular console output
|
|
92
|
+
*/
|
|
93
|
+
formatMessage(args, level) {
|
|
94
|
+
const timestamp = new Date().toISOString().split('T')[1].split('.')[0]; // HH:MM:SS
|
|
95
|
+
// Process all arguments
|
|
96
|
+
let message = '';
|
|
97
|
+
let logLevel = level;
|
|
98
|
+
let context = {};
|
|
99
|
+
for (const arg of args) {
|
|
100
|
+
if (typeof arg === 'string') {
|
|
101
|
+
// Try to parse JSON strings (structured logger output)
|
|
102
|
+
try {
|
|
103
|
+
const parsed = JSON.parse(arg);
|
|
104
|
+
if (typeof parsed === 'object' && parsed !== null && parsed.message) {
|
|
105
|
+
// It's a structured log entry from logger.ts
|
|
106
|
+
logLevel = (parsed.level || level).toLowerCase();
|
|
107
|
+
message = parsed.message || message;
|
|
108
|
+
// Extract context (everything except timestamp, level, message)
|
|
109
|
+
const ctx = { ...parsed };
|
|
110
|
+
delete ctx.timestamp;
|
|
111
|
+
delete ctx.level;
|
|
112
|
+
delete ctx.message;
|
|
113
|
+
context = { ...context, ...ctx };
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Not JSON, treat as regular string
|
|
119
|
+
}
|
|
120
|
+
message += (message ? ' ' : '') + arg;
|
|
121
|
+
}
|
|
122
|
+
else if (arg instanceof Error) {
|
|
123
|
+
message += (message ? ' ' : '') + arg.message;
|
|
124
|
+
context.error_name = arg.name;
|
|
125
|
+
context.error_message = arg.message;
|
|
126
|
+
}
|
|
127
|
+
else if (typeof arg === 'object' && arg !== null) {
|
|
128
|
+
// Merge object into context
|
|
129
|
+
try {
|
|
130
|
+
context = { ...context, ...arg };
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
message += (message ? ' ' : '') + String(arg);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
message += (message ? ' ' : '') + String(arg);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Format context if present
|
|
141
|
+
const contextStr = Object.keys(context).length > 0
|
|
142
|
+
? ` ${COLORS.dim}${JSON.stringify(context)}${COLORS.reset}`
|
|
143
|
+
: '';
|
|
144
|
+
// Determine color and icon based on actual log level
|
|
145
|
+
const color = logLevel === 'error' ? COLORS.red : logLevel === 'warn' ? COLORS.yellow : COLORS.cyan;
|
|
146
|
+
const icon = logLevel === 'error' ? '❌' : logLevel === 'warn' ? '⚠️ ' : 'ℹ️ ';
|
|
147
|
+
const levelTag = logLevel.toUpperCase();
|
|
148
|
+
// Truncate long messages (leave room for timestamp, icon, level tag, and context)
|
|
149
|
+
const maxWidth = 100;
|
|
150
|
+
const truncated = message.length > maxWidth ? message.substring(0, maxWidth - 3) + '...' : message;
|
|
151
|
+
return `${COLORS.gray}[${timestamp}]${COLORS.reset} ${color}${icon} ${levelTag}${COLORS.reset} ${truncated}${contextStr}`;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Format structured log entry (from logger.ts JSON output)
|
|
155
|
+
*/
|
|
156
|
+
formatStructuredLog(entry, level) {
|
|
157
|
+
const timestamp = new Date(entry.timestamp || Date.now()).toISOString().split('T')[1].split('.')[0];
|
|
158
|
+
const message = entry.message || '';
|
|
159
|
+
// Extract context (everything except timestamp, level, message)
|
|
160
|
+
const context = {};
|
|
161
|
+
for (const key in entry) {
|
|
162
|
+
if (key !== 'timestamp' && key !== 'level' && key !== 'message') {
|
|
163
|
+
context[key] = entry[key];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const contextStr = Object.keys(context).length > 0
|
|
167
|
+
? ` ${COLORS.dim}${JSON.stringify(context)}${COLORS.reset}`
|
|
168
|
+
: '';
|
|
169
|
+
const color = level === 'error' ? COLORS.red : level === 'warn' ? COLORS.yellow : COLORS.cyan;
|
|
170
|
+
const icon = level === 'error' ? '❌' : level === 'warn' ? '⚠️ ' : 'ℹ️ ';
|
|
171
|
+
const levelTag = level.toUpperCase();
|
|
172
|
+
// Truncate long messages
|
|
173
|
+
const maxWidth = 100;
|
|
174
|
+
const truncated = message.length > maxWidth ? message.substring(0, maxWidth - 3) + '...' : message;
|
|
175
|
+
return `${COLORS.gray}[${timestamp}]${COLORS.reset} ${color}${icon} ${levelTag}${COLORS.reset} ${truncated}${contextStr}`;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Add a formatted log line directly
|
|
179
|
+
*/
|
|
180
|
+
log(message, level = 'info') {
|
|
181
|
+
const formatted = this.formatMessage([message], level);
|
|
182
|
+
process.stdout.write(formatted + '\n');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export const bannerLogger = new BannerLogger();
|
|
186
|
+
//# sourceMappingURL=bannerLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bannerLogger.js","sourceRoot":"","sources":["../../src/utils/bannerLogger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,YAAY;IACR,kBAAkB,GAA8B,IAAI,CAAC;IACrD,mBAAmB,GAA+B,IAAI,CAAC;IACvD,oBAAoB,GAAgC,IAAI,CAAC;IACzD,mBAAmB,GAA+B,IAAI,CAAC;IACvD,aAAa,GAAG,KAAK,CAAC;IACtB,MAAM,GAAG,eAAe,EAAE,CAAC;IAEnC;;OAEG;IACH,SAAS;QACP,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAE/B,kBAAkB;QAClB,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC;QACtC,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;QACxC,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,KAAK,CAAC;QAC1C,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;QAExC,2BAA2B;QAC3B,yDAAyD;QACzD,8EAA8E;QAC9E,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAQ,EAAE;YACpD,iDAAiD;YACjD,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACjD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,6CAA6C;YAEnG,gDAAgD;YAChD,kEAAkE;YAClE,iDAAiD;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QACvC,CAAC,CAAC;QAEF,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACnC,iEAAiE;YACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAChC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBACnC,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;4BACnC,qDAAqD;4BACrD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAA+B,CAAC;4BACtE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;4BACxD,mBAAmB,CAAC,OAAO,CAAC,CAAC;4BAC7B,OAAO;wBACT,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,4CAA4C;oBAC9C,CAAC;gBACH,CAAC;YACH,CAAC;YACD,6BAA6B;YAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACjD,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACjD,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACjD,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAClD,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAE5D,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACtC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,mBAAoB,CAAC;QACzC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,oBAAqB,CAAC;QAC3C,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,mBAAoB,CAAC;QAEzC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACK,aAAa,CAAC,IAAe,EAAE,KAAgC;QACrE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;QAEnF,wBAAwB;QACxB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,OAAO,GAA4B,EAAE,CAAC;QAE1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,uDAAuD;gBACvD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACpE,6CAA6C;wBAC7C,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,WAAW,EAA+B,CAAC;wBAC9E,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC;wBACpC,gEAAgE;wBAChE,MAAM,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;wBAC1B,OAAO,GAAG,CAAC,SAAS,CAAC;wBACrB,OAAO,GAAG,CAAC,KAAK,CAAC;wBACjB,OAAO,GAAG,CAAC,OAAO,CAAC;wBACnB,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;wBACjC,SAAS;oBACX,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,oCAAoC;gBACtC,CAAC;gBACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YACxC,CAAC;iBAAM,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC;gBAC9C,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC;gBAC9B,OAAO,CAAC,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC;YACtC,CAAC;iBAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACnD,4BAA4B;gBAC5B,IAAI,CAAC;oBACH,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAI,GAA+B,EAAE,CAAC;gBAChE,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;YAChD,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE;YAC3D,CAAC,CAAC,EAAE,CAAC;QAEP,qDAAqD;QACrD,MAAM,KAAK,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QACpG,MAAM,IAAI,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9E,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAExC,kFAAkF;QAClF,MAAM,QAAQ,GAAG,GAAG,CAAC;QACrB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QAEnG,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,GAAG,IAAI,IAAI,QAAQ,GAAG,MAAM,CAAC,KAAK,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;IAC5H,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,KAAU,EAAE,KAAgC;QACtE,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpG,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QAEpC,gEAAgE;QAChE,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;YAChD,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE;YAC3D,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,KAAK,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9F,MAAM,IAAI,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QACxE,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAErC,yBAAyB;QACzB,MAAM,QAAQ,GAAG,GAAG,CAAC;QACrB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QAEnG,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,GAAG,IAAI,IAAI,QAAQ,GAAG,MAAM,CAAC,KAAK,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;IAC5H,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAe,EAAE,QAAmC,MAAM;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACzC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Banner Service
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the EnhancedBannerService from shared-utilities for backward compatibility.
|
|
5
|
+
* All new code should import directly from '@tsvika58/shared-utilities/banner'.
|
|
6
|
+
*
|
|
7
|
+
* @deprecated Import from '@tsvika58/shared-utilities/banner' instead
|
|
8
|
+
*/
|
|
9
|
+
import { EnhancedBannerService, createBannerService, } from '@tsvika58/shared-utilities/banner';
|
|
10
|
+
// Create default instance for backward compatibility
|
|
11
|
+
const defaultConfig = {
|
|
12
|
+
lines: 4,
|
|
13
|
+
showDivider: true,
|
|
14
|
+
interceptConsole: true,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Default banner service instance
|
|
18
|
+
* @deprecated Use createBannerService() from shared-utilities instead
|
|
19
|
+
*/
|
|
20
|
+
export const bannerService = createBannerService(defaultConfig);
|
|
21
|
+
// Re-export from shared-utilities
|
|
22
|
+
export { EnhancedBannerService, createBannerService };
|
|
23
|
+
//# sourceMappingURL=bannerService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bannerService.js","sourceRoot":"","sources":["../../src/utils/bannerService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GAGpB,MAAM,mCAAmC,CAAC;AAE3C,qDAAqD;AACrD,MAAM,aAAa,GAAgC;IACjD,KAAK,EAAE,CAAC;IACR,WAAW,EAAE,IAAI;IACjB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;AAQhE,kCAAkC;AAClC,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Banner Service Adapter for n8n-workflow-validator
|
|
3
|
+
*
|
|
4
|
+
* Uses the EnhancedBannerService from shared-utilities v1.4.0.
|
|
5
|
+
* This provides a unified banner system across all projects with:
|
|
6
|
+
* - Sticky progress banner at bottom of terminal
|
|
7
|
+
* - Console interception for clean log display
|
|
8
|
+
* - File logging integration
|
|
9
|
+
* - Terminal capability detection
|
|
10
|
+
*
|
|
11
|
+
* Migration: This replaces the previous local ThreeLineBanner and BannerService.
|
|
12
|
+
*/
|
|
13
|
+
import { EnhancedBannerService, createBannerService, } from '@tsvika58/shared-utilities/banner';
|
|
14
|
+
import { createBannerAdapter } from '@tsvika58/shared-utilities/script-execution';
|
|
15
|
+
/**
|
|
16
|
+
* Default banner configuration for n8n-validator scripts
|
|
17
|
+
*/
|
|
18
|
+
const defaultConfig = {
|
|
19
|
+
lines: 4,
|
|
20
|
+
showDivider: true,
|
|
21
|
+
interceptConsole: true,
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Shared banner service instance
|
|
25
|
+
*
|
|
26
|
+
* Use this for direct access to the banner service.
|
|
27
|
+
* For scripts using executeScript/runScript, use bannerAdapter instead.
|
|
28
|
+
*/
|
|
29
|
+
export const bannerService = createBannerService(defaultConfig);
|
|
30
|
+
/**
|
|
31
|
+
* Adapter instance for use with shared-utilities scriptRunner
|
|
32
|
+
*
|
|
33
|
+
* This adapter:
|
|
34
|
+
* - Translates between shared-utilities BannerService interface and EnhancedBannerService
|
|
35
|
+
* - Tracks last progress event for batch/checkpoint updates
|
|
36
|
+
* - Handles optional methods gracefully
|
|
37
|
+
* - Ensures banner refreshes when batch info or checkpoint changes
|
|
38
|
+
*
|
|
39
|
+
* Usage:
|
|
40
|
+
* ```typescript
|
|
41
|
+
* import { bannerAdapter } from './utils/bannerServiceAdapter.js';
|
|
42
|
+
* import { runScript } from './utils/scriptRunner.js';
|
|
43
|
+
*
|
|
44
|
+
* await runScript(async () => {
|
|
45
|
+
* // Your script logic
|
|
46
|
+
* }, {
|
|
47
|
+
* bannerService: bannerAdapter,
|
|
48
|
+
* // ... other options
|
|
49
|
+
* });
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export const bannerAdapter = createBannerAdapter(bannerService);
|
|
53
|
+
export { EnhancedBannerService, createBannerService };
|
|
54
|
+
//# sourceMappingURL=bannerServiceAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bannerServiceAdapter.js","sourceRoot":"","sources":["../../src/utils/bannerServiceAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GAEpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAElF;;GAEG;AACH,MAAM,aAAa,GAAgC;IACjD,KAAK,EAAE,CAAC;IACR,WAAW,EAAE,IAAI;IACjB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;AAIhE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Logger Utility
|
|
3
|
+
*
|
|
4
|
+
* Logs problems, failures, warnings, and verbose information during batch operations.
|
|
5
|
+
* Displays logs above the sticky banner and saves to file for later review.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const logger = new BatchLogger('batch-validation');
|
|
9
|
+
* logger.error('Failed to validate workflow', { workflowId: '123', error: '...' });
|
|
10
|
+
* logger.warning('Missing credential', { workflowId: '123', credential: 'slack' });
|
|
11
|
+
* logger.info('Processing batch', { batchSize: 100 });
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'fs/promises';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
export class BatchLogger {
|
|
16
|
+
logFile;
|
|
17
|
+
logEntries = [];
|
|
18
|
+
maxDisplayLines;
|
|
19
|
+
displayLines = [];
|
|
20
|
+
isInitialized = false;
|
|
21
|
+
constructor(logName, maxDisplayLines = 10) {
|
|
22
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
23
|
+
this.logFile = path.join(process.cwd(), 'logs', `${logName}-${timestamp}.log`);
|
|
24
|
+
this.maxDisplayLines = maxDisplayLines;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Initialize logger (create log directory and file)
|
|
28
|
+
*/
|
|
29
|
+
async initialize() {
|
|
30
|
+
const logDir = path.dirname(this.logFile);
|
|
31
|
+
await fs.mkdir(logDir, { recursive: true });
|
|
32
|
+
// Write header to log file
|
|
33
|
+
await fs.appendFile(this.logFile, `# Batch Validation Log\n` +
|
|
34
|
+
`Started: ${new Date().toISOString()}\n` +
|
|
35
|
+
`Log File: ${this.logFile}\n` +
|
|
36
|
+
`${'='.repeat(80)}\n\n`);
|
|
37
|
+
this.isInitialized = true;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Log an entry
|
|
41
|
+
*/
|
|
42
|
+
async log(level, message, context, workflowId) {
|
|
43
|
+
const entry = {
|
|
44
|
+
timestamp: new Date(),
|
|
45
|
+
level,
|
|
46
|
+
message,
|
|
47
|
+
context,
|
|
48
|
+
workflowId,
|
|
49
|
+
};
|
|
50
|
+
this.logEntries.push(entry);
|
|
51
|
+
// Format log line for display
|
|
52
|
+
const timeStr = entry.timestamp.toLocaleTimeString();
|
|
53
|
+
const levelStr = level.toUpperCase().padEnd(7);
|
|
54
|
+
const workflowStr = workflowId ? ` [${workflowId}]` : '';
|
|
55
|
+
const contextStr = context
|
|
56
|
+
? ` ${JSON.stringify(context)}`
|
|
57
|
+
: '';
|
|
58
|
+
const displayLine = `[${timeStr}] ${levelStr}${workflowStr} ${message}${contextStr}`;
|
|
59
|
+
// Add to display lines (keep last N lines)
|
|
60
|
+
this.displayLines.push(displayLine);
|
|
61
|
+
if (this.displayLines.length > this.maxDisplayLines) {
|
|
62
|
+
this.displayLines.shift();
|
|
63
|
+
}
|
|
64
|
+
// Write to file
|
|
65
|
+
if (this.isInitialized) {
|
|
66
|
+
const fileLine = `${entry.timestamp.toISOString()} [${levelStr}]${workflowStr} ${message}${contextStr ? ` ${JSON.stringify(context)}` : ''}\n`;
|
|
67
|
+
await fs.appendFile(this.logFile, fileLine).catch((err) => {
|
|
68
|
+
// Don't throw if file write fails, just log to console
|
|
69
|
+
console.error('Failed to write to log file:', err);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Also log to console (will appear above banner)
|
|
73
|
+
const colorCode = this.getColorCode(level);
|
|
74
|
+
const resetCode = '\x1b[0m';
|
|
75
|
+
console.log(`${colorCode}${displayLine}${resetCode}`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get ANSI color code for log level
|
|
79
|
+
*/
|
|
80
|
+
getColorCode(level) {
|
|
81
|
+
switch (level) {
|
|
82
|
+
case 'error':
|
|
83
|
+
return '\x1b[31m'; // Red
|
|
84
|
+
case 'warning':
|
|
85
|
+
return '\x1b[33m'; // Yellow
|
|
86
|
+
case 'info':
|
|
87
|
+
return '\x1b[36m'; // Cyan
|
|
88
|
+
case 'debug':
|
|
89
|
+
return '\x1b[90m'; // Gray
|
|
90
|
+
default:
|
|
91
|
+
return '';
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Log info message
|
|
96
|
+
*/
|
|
97
|
+
async info(message, context, workflowId) {
|
|
98
|
+
await this.log('info', message, context, workflowId);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Log warning message
|
|
102
|
+
*/
|
|
103
|
+
async warning(message, context, workflowId) {
|
|
104
|
+
await this.log('warning', message, context, workflowId);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Log error message
|
|
108
|
+
*/
|
|
109
|
+
async error(message, context, workflowId) {
|
|
110
|
+
await this.log('error', message, context, workflowId);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Log debug message
|
|
114
|
+
*/
|
|
115
|
+
async debug(message, context, workflowId) {
|
|
116
|
+
await this.log('debug', message, context, workflowId);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get display lines for showing above banner
|
|
120
|
+
*/
|
|
121
|
+
getDisplayLines() {
|
|
122
|
+
return [...this.displayLines];
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get all log entries
|
|
126
|
+
*/
|
|
127
|
+
getLogEntries() {
|
|
128
|
+
return [...this.logEntries];
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get statistics
|
|
132
|
+
*/
|
|
133
|
+
getStatistics() {
|
|
134
|
+
return {
|
|
135
|
+
total: this.logEntries.length,
|
|
136
|
+
errors: this.logEntries.filter((e) => e.level === 'error').length,
|
|
137
|
+
warnings: this.logEntries.filter((e) => e.level === 'warning').length,
|
|
138
|
+
info: this.logEntries.filter((e) => e.level === 'info').length,
|
|
139
|
+
debug: this.logEntries.filter((e) => e.level === 'debug').length,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Write summary to log file
|
|
144
|
+
*/
|
|
145
|
+
async writeSummary() {
|
|
146
|
+
if (!this.isInitialized)
|
|
147
|
+
return;
|
|
148
|
+
const stats = this.getStatistics();
|
|
149
|
+
const summary = `
|
|
150
|
+
${'='.repeat(80)}
|
|
151
|
+
# Summary
|
|
152
|
+
${'='.repeat(80)}
|
|
153
|
+
Total Log Entries: ${stats.total}
|
|
154
|
+
- Errors: ${stats.errors}
|
|
155
|
+
- Warnings: ${stats.warnings}
|
|
156
|
+
- Info: ${stats.info}
|
|
157
|
+
- Debug: ${stats.debug}
|
|
158
|
+
Ended: ${new Date().toISOString()}
|
|
159
|
+
${'='.repeat(80)}
|
|
160
|
+
`;
|
|
161
|
+
await fs.appendFile(this.logFile, summary);
|
|
162
|
+
console.log(`\n📝 Log file saved to: ${this.logFile}`);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get log file path
|
|
166
|
+
*/
|
|
167
|
+
getLogFilePath() {
|
|
168
|
+
return this.logFile;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=batchLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchLogger.js","sourceRoot":"","sources":["../../src/utils/batchLogger.ts"],"names":[],"mappings":"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"}
|