@vybestack/llxprt-code-telemetry 0.10.0-nightly.260613.1adad3b34
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/dist/.last_build +0 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/src/debug/ConfigurationManager.d.ts +33 -0
- package/dist/src/debug/ConfigurationManager.js +226 -0
- package/dist/src/debug/ConfigurationManager.js.map +1 -0
- package/dist/src/debug/DebugLogger.d.ts +46 -0
- package/dist/src/debug/DebugLogger.js +286 -0
- package/dist/src/debug/DebugLogger.js.map +1 -0
- package/dist/src/debug/FileOutput.d.ts +28 -0
- package/dist/src/debug/FileOutput.js +190 -0
- package/dist/src/debug/FileOutput.js.map +1 -0
- package/dist/src/debug/MockConfigurationManager.d.ts +28 -0
- package/dist/src/debug/MockConfigurationManager.js +45 -0
- package/dist/src/debug/MockConfigurationManager.js.map +1 -0
- package/dist/src/debug/MockFileOutput.d.ts +22 -0
- package/dist/src/debug/MockFileOutput.js +23 -0
- package/dist/src/debug/MockFileOutput.js.map +1 -0
- package/dist/src/debug/index.d.ts +10 -0
- package/dist/src/debug/index.js +11 -0
- package/dist/src/debug/index.js.map +1 -0
- package/dist/src/debug/types.d.ts +25 -0
- package/dist/src/debug/types.js +2 -0
- package/dist/src/debug/types.js.map +1 -0
- package/dist/src/internal/interfaces.d.ts +143 -0
- package/dist/src/internal/interfaces.js +37 -0
- package/dist/src/internal/interfaces.js.map +1 -0
- package/dist/src/telemetry/constants.d.ts +35 -0
- package/dist/src/telemetry/constants.js +36 -0
- package/dist/src/telemetry/constants.js.map +1 -0
- package/dist/src/telemetry/file-exporters.d.ts +28 -0
- package/dist/src/telemetry/file-exporters.js +89 -0
- package/dist/src/telemetry/file-exporters.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +24 -0
- package/dist/src/telemetry/index.js +24 -0
- package/dist/src/telemetry/index.js.map +1 -0
- package/dist/src/telemetry/loggers.d.ts +46 -0
- package/dist/src/telemetry/loggers.js +543 -0
- package/dist/src/telemetry/loggers.js.map +1 -0
- package/dist/src/telemetry/metrics.d.ts +24 -0
- package/dist/src/telemetry/metrics.js +153 -0
- package/dist/src/telemetry/metrics.js.map +1 -0
- package/dist/src/telemetry/sdk.d.ts +10 -0
- package/dist/src/telemetry/sdk.js +138 -0
- package/dist/src/telemetry/sdk.js.map +1 -0
- package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
- package/dist/src/telemetry/tool-call-decision.js +30 -0
- package/dist/src/telemetry/tool-call-decision.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +380 -0
- package/dist/src/telemetry/types.js +620 -0
- package/dist/src/telemetry/types.js.map +1 -0
- package/dist/src/telemetry/uiTelemetry.d.ts +104 -0
- package/dist/src/telemetry/uiTelemetry.js +183 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -0
- package/dist/src/utils/debugLogger.d.ts +10 -0
- package/dist/src/utils/debugLogger.js +11 -0
- package/dist/src/utils/debugLogger.js.map +1 -0
- package/dist/src/utils/index.d.ts +9 -0
- package/dist/src/utils/index.js +10 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/paths.d.ts +10 -0
- package/dist/src/utils/paths.js +11 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/safeJsonStringify.d.ts +13 -0
- package/dist/src/utils/safeJsonStringify.js +25 -0
- package/dist/src/utils/safeJsonStringify.js.map +1 -0
- package/dist/src/utils/session.d.ts +6 -0
- package/dist/src/utils/session.js +8 -0
- package/dist/src/utils/session.js.map +1 -0
- package/package.json +80 -0
package/dist/.last_build
ADDED
|
File without changes
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export * from './src/debug/index.js';
|
|
7
|
+
export * from './src/telemetry/index.js';
|
|
8
|
+
export { safeJsonStringify } from './src/utils/safeJsonStringify.js';
|
|
9
|
+
export { LLXPRT_DIR } from './src/utils/paths.js';
|
|
10
|
+
export { sessionId } from './src/utils/session.js';
|
|
11
|
+
export { DebugLogger, debugLogger } from './src/utils/debugLogger.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Vybestack LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
// Debug module
|
|
7
|
+
export * from './src/debug/index.js';
|
|
8
|
+
// Telemetry module
|
|
9
|
+
export * from './src/telemetry/index.js';
|
|
10
|
+
// Utilities
|
|
11
|
+
export { safeJsonStringify } from './src/utils/safeJsonStringify.js';
|
|
12
|
+
export { LLXPRT_DIR } from './src/utils/paths.js';
|
|
13
|
+
export { sessionId } from './src/utils/session.js';
|
|
14
|
+
export { DebugLogger, debugLogger } from './src/utils/debugLogger.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAe;AACf,cAAc,sBAAsB,CAAC;AAErC,mBAAmB;AACnB,cAAc,0BAA0B,CAAC;AAEzC,YAAY;AACZ,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type DebugSettings } from './types.js';
|
|
2
|
+
export declare class ConfigurationManager {
|
|
3
|
+
private static instance;
|
|
4
|
+
private defaultConfig;
|
|
5
|
+
private projectConfig;
|
|
6
|
+
private userConfig;
|
|
7
|
+
private envConfig;
|
|
8
|
+
private cliConfig;
|
|
9
|
+
private ephemeralConfig;
|
|
10
|
+
private mergedConfig;
|
|
11
|
+
private listeners;
|
|
12
|
+
static getInstance(): ConfigurationManager;
|
|
13
|
+
private constructor();
|
|
14
|
+
loadConfigurations(): void;
|
|
15
|
+
private loadEnvironmentConfig;
|
|
16
|
+
private loadUserConfig;
|
|
17
|
+
private loadProjectConfig;
|
|
18
|
+
private mergeConfigurations;
|
|
19
|
+
setCliConfig(config: Partial<DebugSettings>): void;
|
|
20
|
+
setEphemeralConfig(config: Partial<DebugSettings>): void;
|
|
21
|
+
clearEphemeralConfig(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Reset the singleton instance (for testing)
|
|
24
|
+
*/
|
|
25
|
+
static resetForTesting(): void;
|
|
26
|
+
persistEphemeralConfig(): void;
|
|
27
|
+
getEffectiveConfig(): DebugSettings;
|
|
28
|
+
getOutputTarget(): string;
|
|
29
|
+
getRedactPatterns(): string[];
|
|
30
|
+
subscribe(listener: () => void): void;
|
|
31
|
+
unsubscribe(listener: () => void): void;
|
|
32
|
+
private parseDebugEnv;
|
|
33
|
+
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan:PLAN-20250120-DEBUGLOGGING.P08
|
|
3
|
+
* @requirement REQ-003,REQ-007
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as os from 'os';
|
|
8
|
+
import { LLXPRT_DIR } from '../utils/paths.js';
|
|
9
|
+
export class ConfigurationManager {
|
|
10
|
+
// Line 11: PRIVATE static instance: ConfigurationManager
|
|
11
|
+
static instance;
|
|
12
|
+
// Line 12-18: Private configuration properties
|
|
13
|
+
defaultConfig;
|
|
14
|
+
projectConfig = null;
|
|
15
|
+
userConfig = null;
|
|
16
|
+
envConfig = null;
|
|
17
|
+
cliConfig = null;
|
|
18
|
+
ephemeralConfig = null;
|
|
19
|
+
mergedConfig;
|
|
20
|
+
listeners = new Set();
|
|
21
|
+
// Line 21-26: Singleton getInstance()
|
|
22
|
+
static getInstance() {
|
|
23
|
+
ConfigurationManager.instance ??= new ConfigurationManager();
|
|
24
|
+
return ConfigurationManager.instance;
|
|
25
|
+
}
|
|
26
|
+
// Line 28-40: Constructor with default config
|
|
27
|
+
constructor() {
|
|
28
|
+
this.defaultConfig = {
|
|
29
|
+
enabled: false,
|
|
30
|
+
namespaces: [],
|
|
31
|
+
level: 'info',
|
|
32
|
+
output: { target: 'file', directory: `~/${LLXPRT_DIR}/debug` },
|
|
33
|
+
lazyEvaluation: true,
|
|
34
|
+
redactPatterns: ['apiKey', 'token', 'password'],
|
|
35
|
+
};
|
|
36
|
+
this.listeners = new Set();
|
|
37
|
+
this.loadConfigurations();
|
|
38
|
+
this.mergeConfigurations();
|
|
39
|
+
}
|
|
40
|
+
// Line 42-46: Load all configurations
|
|
41
|
+
loadConfigurations() {
|
|
42
|
+
this.loadEnvironmentConfig();
|
|
43
|
+
this.loadUserConfig();
|
|
44
|
+
this.loadProjectConfig();
|
|
45
|
+
}
|
|
46
|
+
// Line 47-64: Load environment config (support DEBUG and LLXPRT_DEBUG)
|
|
47
|
+
loadEnvironmentConfig() {
|
|
48
|
+
if (process.env.DEBUG) {
|
|
49
|
+
const namespaces = this.parseDebugEnv(process.env.DEBUG);
|
|
50
|
+
// Only enable if DEBUG contains llxprt namespaces
|
|
51
|
+
const llxprtNamespaces = namespaces.filter((ns) => ns.startsWith('llxprt') || ns === '*');
|
|
52
|
+
if (llxprtNamespaces.length > 0) {
|
|
53
|
+
this.envConfig = {
|
|
54
|
+
enabled: true,
|
|
55
|
+
namespaces: llxprtNamespaces,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (process.env.LLXPRT_DEBUG) {
|
|
60
|
+
const namespaces = this.parseDebugEnv(process.env.LLXPRT_DEBUG);
|
|
61
|
+
this.envConfig = {
|
|
62
|
+
enabled: true,
|
|
63
|
+
namespaces,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Support other LLXPRT environment variables
|
|
67
|
+
if (process.env.DEBUG_ENABLED) {
|
|
68
|
+
this.envConfig = {
|
|
69
|
+
...this.envConfig,
|
|
70
|
+
enabled: process.env.DEBUG_ENABLED === 'true',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
if (process.env.DEBUG_LEVEL) {
|
|
74
|
+
this.envConfig = { ...this.envConfig, level: process.env.DEBUG_LEVEL };
|
|
75
|
+
}
|
|
76
|
+
if (process.env.DEBUG_OUTPUT) {
|
|
77
|
+
this.envConfig = {
|
|
78
|
+
...this.envConfig,
|
|
79
|
+
output: { target: process.env.DEBUG_OUTPUT },
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Line 66-79: Load user config from ~/.llxprt/settings.json
|
|
84
|
+
loadUserConfig() {
|
|
85
|
+
try {
|
|
86
|
+
const homeDir = os.homedir();
|
|
87
|
+
if (!homeDir) {
|
|
88
|
+
// In test environments, os.homedir() might not be available
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const configPath = path.join(homeDir, LLXPRT_DIR, 'settings.json');
|
|
92
|
+
if (fs.existsSync(configPath)) {
|
|
93
|
+
try {
|
|
94
|
+
const content = fs.readFileSync(configPath, 'utf8');
|
|
95
|
+
const parsed = JSON.parse(content);
|
|
96
|
+
// eslint-disable-next-line sonarjs/nested-control-flow -- Existing structure is intentionally preserved; refactoring this boundary is outside the lint slice.
|
|
97
|
+
if (typeof parsed.debug === 'object' && parsed.debug !== null) {
|
|
98
|
+
this.userConfig = parsed.debug;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Silently ignore — can't use debugLogger here (circular dep)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Home directory unavailable (e.g., in tests); use default config.
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Line 81-94: Load project config from .llxprt/config.json
|
|
111
|
+
loadProjectConfig() {
|
|
112
|
+
try {
|
|
113
|
+
const cwd = process.cwd();
|
|
114
|
+
if (!cwd) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const configPath = path.join(cwd, LLXPRT_DIR, 'config.json');
|
|
118
|
+
if (fs.existsSync(configPath)) {
|
|
119
|
+
try {
|
|
120
|
+
const content = fs.readFileSync(configPath, 'utf8');
|
|
121
|
+
const parsed = JSON.parse(content);
|
|
122
|
+
// eslint-disable-next-line sonarjs/nested-control-flow -- Existing structure is intentionally preserved; refactoring this boundary is outside the lint slice.
|
|
123
|
+
if (typeof parsed.debug === 'object' && parsed.debug !== null) {
|
|
124
|
+
this.projectConfig = parsed.debug;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Silently ignore — can't use debugLogger here (circular dep)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Working directory unavailable (e.g., in tests); use default config.
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Line 96-111: Merge configurations in priority order
|
|
137
|
+
mergeConfigurations() {
|
|
138
|
+
const configs = [
|
|
139
|
+
this.defaultConfig,
|
|
140
|
+
this.projectConfig,
|
|
141
|
+
this.userConfig,
|
|
142
|
+
this.envConfig,
|
|
143
|
+
this.cliConfig,
|
|
144
|
+
this.ephemeralConfig,
|
|
145
|
+
].filter(Boolean);
|
|
146
|
+
this.mergedConfig = configs.reduce((merged, config) => Object.assign({}, merged, config), {});
|
|
147
|
+
// Notify all listeners of configuration change
|
|
148
|
+
this.listeners.forEach((listener) => listener());
|
|
149
|
+
}
|
|
150
|
+
// Line 113-121: Set CLI and ephemeral configs
|
|
151
|
+
setCliConfig(config) {
|
|
152
|
+
this.cliConfig = config;
|
|
153
|
+
this.mergeConfigurations();
|
|
154
|
+
}
|
|
155
|
+
setEphemeralConfig(config) {
|
|
156
|
+
this.ephemeralConfig = {
|
|
157
|
+
...this.ephemeralConfig,
|
|
158
|
+
...config,
|
|
159
|
+
};
|
|
160
|
+
this.mergeConfigurations();
|
|
161
|
+
}
|
|
162
|
+
clearEphemeralConfig() {
|
|
163
|
+
this.ephemeralConfig = null;
|
|
164
|
+
this.mergeConfigurations();
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Reset the singleton instance (for testing)
|
|
168
|
+
*/
|
|
169
|
+
static resetForTesting() {
|
|
170
|
+
ConfigurationManager.instance = undefined;
|
|
171
|
+
}
|
|
172
|
+
// Line 123-150: Persist ephemeral to user config
|
|
173
|
+
persistEphemeralConfig() {
|
|
174
|
+
if (!this.ephemeralConfig) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const userConfigPath = path.join(os.homedir(), LLXPRT_DIR, 'settings.json');
|
|
178
|
+
let existing = {};
|
|
179
|
+
if (fs.existsSync(userConfigPath)) {
|
|
180
|
+
try {
|
|
181
|
+
existing = JSON.parse(fs.readFileSync(userConfigPath, 'utf8'));
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
existing = {};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
existing.debug = Object.assign({}, existing.debug, this.ephemeralConfig);
|
|
188
|
+
try {
|
|
189
|
+
fs.mkdirSync(path.dirname(userConfigPath), { recursive: true });
|
|
190
|
+
fs.writeFileSync(userConfigPath, JSON.stringify(existing, null, 2));
|
|
191
|
+
this.userConfig = existing.debug;
|
|
192
|
+
this.ephemeralConfig = null;
|
|
193
|
+
this.mergeConfigurations();
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
throw new Error('Failed to persist configuration');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Line 152-174: Getters and subscription management
|
|
200
|
+
getEffectiveConfig() {
|
|
201
|
+
return this.mergedConfig;
|
|
202
|
+
}
|
|
203
|
+
getOutputTarget() {
|
|
204
|
+
const output = this.mergedConfig.output;
|
|
205
|
+
if (typeof output === 'string') {
|
|
206
|
+
return output;
|
|
207
|
+
}
|
|
208
|
+
return output.target;
|
|
209
|
+
}
|
|
210
|
+
getRedactPatterns() {
|
|
211
|
+
return this.mergedConfig.redactPatterns;
|
|
212
|
+
}
|
|
213
|
+
subscribe(listener) {
|
|
214
|
+
this.listeners.add(listener);
|
|
215
|
+
}
|
|
216
|
+
unsubscribe(listener) {
|
|
217
|
+
this.listeners.delete(listener);
|
|
218
|
+
}
|
|
219
|
+
parseDebugEnv(value) {
|
|
220
|
+
return value
|
|
221
|
+
.split(',')
|
|
222
|
+
.map((s) => s.trim())
|
|
223
|
+
.filter(Boolean);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=ConfigurationManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigurationManager.js","sourceRoot":"","sources":["../../../src/debug/ConfigurationManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ConfigurationManager } from './ConfigurationManager.js';
|
|
2
|
+
import { FileOutput } from './FileOutput.js';
|
|
3
|
+
export declare class DebugLogger {
|
|
4
|
+
private static instances;
|
|
5
|
+
private debugInstance;
|
|
6
|
+
private _namespace;
|
|
7
|
+
private _configManager;
|
|
8
|
+
private _fileOutput;
|
|
9
|
+
private _enabled;
|
|
10
|
+
private _level;
|
|
11
|
+
private boundOnConfigChange;
|
|
12
|
+
/**
|
|
13
|
+
* Factory method to get or create a DebugLogger for a namespace.
|
|
14
|
+
* Returns cached instance if one exists, ensuring singleton-per-namespace.
|
|
15
|
+
*/
|
|
16
|
+
static getLogger(namespace: string): DebugLogger;
|
|
17
|
+
/**
|
|
18
|
+
* Dispose all cached logger instances.
|
|
19
|
+
* Call this in test cleanup or application shutdown.
|
|
20
|
+
*/
|
|
21
|
+
static disposeAll(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Reset for testing.
|
|
24
|
+
* Disposes singleton logger/file-output state and resets configuration state
|
|
25
|
+
* so test files do not retain listeners, timers, or queued log entries.
|
|
26
|
+
*/
|
|
27
|
+
static resetForTesting(): Promise<void>;
|
|
28
|
+
constructor(namespace: string);
|
|
29
|
+
get namespace(): string;
|
|
30
|
+
get enabled(): boolean;
|
|
31
|
+
set enabled(value: boolean);
|
|
32
|
+
get level(): string;
|
|
33
|
+
set level(value: string);
|
|
34
|
+
get configManager(): ConfigurationManager;
|
|
35
|
+
get fileOutput(): FileOutput;
|
|
36
|
+
log(messageOrFn: string | (() => string), ...args: unknown[]): void;
|
|
37
|
+
debug(messageOrFn: string | (() => string), ...args: unknown[]): void;
|
|
38
|
+
warn(messageOrFn: string | (() => string), ...args: unknown[]): void;
|
|
39
|
+
private _logWithLevel;
|
|
40
|
+
error(messageOrFn: string | (() => string), ...args: unknown[]): void;
|
|
41
|
+
checkEnabled(): boolean;
|
|
42
|
+
private matchesPattern;
|
|
43
|
+
private redactSensitive;
|
|
44
|
+
private onConfigChange;
|
|
45
|
+
dispose(): Promise<void>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @plan PLAN-20250120-DEBUGLOGGING.P05
|
|
3
|
+
* @requirement REQ-001,REQ-002,REQ-006
|
|
4
|
+
* @pseudocode lines 10-121
|
|
5
|
+
*/
|
|
6
|
+
import createDebug from 'debug';
|
|
7
|
+
import { ConfigurationManager } from './ConfigurationManager.js';
|
|
8
|
+
import { FileOutput } from './FileOutput.js';
|
|
9
|
+
// Configure debug to use console.log instead of stderr for React UI compatibility
|
|
10
|
+
// This ensures debug output goes to the Ctrl+O debug console in the UI
|
|
11
|
+
if (typeof window === 'undefined') {
|
|
12
|
+
// Disable colors to respect theme settings
|
|
13
|
+
createDebug.useColors = () => false;
|
|
14
|
+
// Use a wrapper function that calls the CURRENT console.log
|
|
15
|
+
// This works even if console.log is patched later by the UI
|
|
16
|
+
createDebug.log = (...args) => {
|
|
17
|
+
// Call whatever console.log is at the time of logging
|
|
18
|
+
// This allows the UI's ConsolePatcher to intercept it
|
|
19
|
+
console.log(...args);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export class DebugLogger {
|
|
23
|
+
// Add static registry for singleton-per-namespace pattern
|
|
24
|
+
static instances = new Map();
|
|
25
|
+
debugInstance; // Line 11
|
|
26
|
+
_namespace; // Line 12
|
|
27
|
+
_configManager; // Line 13
|
|
28
|
+
_fileOutput; // Line 14
|
|
29
|
+
_enabled; // Line 15
|
|
30
|
+
_level = 'debug';
|
|
31
|
+
boundOnConfigChange; // Store bound reference for unsubscribe
|
|
32
|
+
/**
|
|
33
|
+
* Factory method to get or create a DebugLogger for a namespace.
|
|
34
|
+
* Returns cached instance if one exists, ensuring singleton-per-namespace.
|
|
35
|
+
*/
|
|
36
|
+
static getLogger(namespace) {
|
|
37
|
+
let logger = DebugLogger.instances.get(namespace);
|
|
38
|
+
if (!logger) {
|
|
39
|
+
logger = new DebugLogger(namespace);
|
|
40
|
+
DebugLogger.instances.set(namespace, logger);
|
|
41
|
+
}
|
|
42
|
+
return logger;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Dispose all cached logger instances.
|
|
46
|
+
* Call this in test cleanup or application shutdown.
|
|
47
|
+
*/
|
|
48
|
+
static disposeAll() {
|
|
49
|
+
for (const logger of DebugLogger.instances.values()) {
|
|
50
|
+
logger._configManager.unsubscribe(logger.boundOnConfigChange);
|
|
51
|
+
}
|
|
52
|
+
DebugLogger.instances.clear();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Reset for testing.
|
|
56
|
+
* Disposes singleton logger/file-output state and resets configuration state
|
|
57
|
+
* so test files do not retain listeners, timers, or queued log entries.
|
|
58
|
+
*/
|
|
59
|
+
static async resetForTesting() {
|
|
60
|
+
DebugLogger.disposeAll();
|
|
61
|
+
await FileOutput.resetForTesting();
|
|
62
|
+
ConfigurationManager.resetForTesting();
|
|
63
|
+
}
|
|
64
|
+
constructor(namespace) {
|
|
65
|
+
// Lines 17-24: Initialize logger
|
|
66
|
+
this._namespace = namespace; // Line 18
|
|
67
|
+
this.debugInstance = createDebug(namespace); // Line 19
|
|
68
|
+
this._configManager = ConfigurationManager.getInstance(); // Line 20
|
|
69
|
+
this._fileOutput = FileOutput.getInstance(); // Line 21
|
|
70
|
+
this._enabled = this.checkEnabled(); // Line 22
|
|
71
|
+
// Store bound reference so we can unsubscribe later
|
|
72
|
+
this.boundOnConfigChange = () => this.onConfigChange();
|
|
73
|
+
this._configManager.subscribe(this.boundOnConfigChange);
|
|
74
|
+
}
|
|
75
|
+
get namespace() {
|
|
76
|
+
return this._namespace;
|
|
77
|
+
}
|
|
78
|
+
get enabled() {
|
|
79
|
+
return this._enabled;
|
|
80
|
+
}
|
|
81
|
+
set enabled(value) {
|
|
82
|
+
this._enabled = value;
|
|
83
|
+
}
|
|
84
|
+
get level() {
|
|
85
|
+
return this._level;
|
|
86
|
+
}
|
|
87
|
+
set level(value) {
|
|
88
|
+
this._level = value;
|
|
89
|
+
}
|
|
90
|
+
get configManager() {
|
|
91
|
+
return this._configManager;
|
|
92
|
+
}
|
|
93
|
+
get fileOutput() {
|
|
94
|
+
return this._fileOutput;
|
|
95
|
+
}
|
|
96
|
+
log(messageOrFn, ...args) {
|
|
97
|
+
// Lines 26-60: Main log method
|
|
98
|
+
if (!this._enabled) {
|
|
99
|
+
// Line 27-29
|
|
100
|
+
return; // Zero overhead - no processing when disabled
|
|
101
|
+
}
|
|
102
|
+
let message;
|
|
103
|
+
if (typeof messageOrFn === 'function') {
|
|
104
|
+
// Line 32
|
|
105
|
+
try {
|
|
106
|
+
message = messageOrFn(); // Line 34
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Log function threw; use fallback message.
|
|
110
|
+
message = '[Error evaluating log function]'; // Line 36
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
message = messageOrFn; // Line 39
|
|
115
|
+
}
|
|
116
|
+
message = this.redactSensitive(message); // Line 42
|
|
117
|
+
const timestamp = new Date().toISOString(); // Line 43
|
|
118
|
+
const logEntry = {
|
|
119
|
+
// Lines 45-51
|
|
120
|
+
timestamp,
|
|
121
|
+
namespace: this._namespace,
|
|
122
|
+
level: 'log',
|
|
123
|
+
message,
|
|
124
|
+
args: args.length > 0 ? args : undefined,
|
|
125
|
+
runId: this._fileOutput.runId,
|
|
126
|
+
pid: process.pid,
|
|
127
|
+
};
|
|
128
|
+
const target = this._configManager.getOutputTarget();
|
|
129
|
+
if (target.includes('file')) {
|
|
130
|
+
// Line 53-55
|
|
131
|
+
void this._fileOutput.write(logEntry);
|
|
132
|
+
}
|
|
133
|
+
if (target.includes('stderr')) {
|
|
134
|
+
// Line 57-59
|
|
135
|
+
this.debugInstance(message, ...args);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
debug(messageOrFn, ...args) {
|
|
139
|
+
// Lines 62-64
|
|
140
|
+
if (this._level === 'error') {
|
|
141
|
+
return; // Don't log debug messages when level is error
|
|
142
|
+
}
|
|
143
|
+
// Create modified log entry with debug level
|
|
144
|
+
if (!this._enabled) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
let message;
|
|
148
|
+
if (typeof messageOrFn === 'function') {
|
|
149
|
+
try {
|
|
150
|
+
message = messageOrFn();
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Log function threw; use fallback message.
|
|
154
|
+
message = '[Error evaluating log function]';
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
message = messageOrFn;
|
|
159
|
+
}
|
|
160
|
+
message = this.redactSensitive(message);
|
|
161
|
+
const timestamp = new Date().toISOString();
|
|
162
|
+
const logEntry = {
|
|
163
|
+
timestamp,
|
|
164
|
+
namespace: this._namespace,
|
|
165
|
+
level: 'debug',
|
|
166
|
+
message,
|
|
167
|
+
args: args.length > 0 ? args : undefined,
|
|
168
|
+
runId: this._fileOutput.runId,
|
|
169
|
+
pid: process.pid,
|
|
170
|
+
};
|
|
171
|
+
const target = this._configManager.getOutputTarget();
|
|
172
|
+
if (target.includes('file')) {
|
|
173
|
+
void this._fileOutput.write(logEntry);
|
|
174
|
+
}
|
|
175
|
+
if (target.includes('stderr')) {
|
|
176
|
+
this.debugInstance(message, ...args);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
warn(messageOrFn, ...args) {
|
|
180
|
+
// Use warn level for warnings
|
|
181
|
+
this._logWithLevel('warn', messageOrFn, ...args);
|
|
182
|
+
}
|
|
183
|
+
_logWithLevel(level, messageOrFn, ...args) {
|
|
184
|
+
if (!this._enabled) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
let message;
|
|
188
|
+
if (typeof messageOrFn === 'function') {
|
|
189
|
+
try {
|
|
190
|
+
message = messageOrFn();
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// Log function threw; use fallback message.
|
|
194
|
+
message = '[Error evaluating log function]';
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
message = messageOrFn;
|
|
199
|
+
}
|
|
200
|
+
message = this.redactSensitive(message);
|
|
201
|
+
const timestamp = new Date().toISOString();
|
|
202
|
+
const logEntry = {
|
|
203
|
+
timestamp,
|
|
204
|
+
namespace: this._namespace,
|
|
205
|
+
level,
|
|
206
|
+
message,
|
|
207
|
+
args: args.length > 0 ? args : undefined,
|
|
208
|
+
runId: this._fileOutput.runId,
|
|
209
|
+
pid: process.pid,
|
|
210
|
+
};
|
|
211
|
+
const target = this._configManager.getOutputTarget();
|
|
212
|
+
if (target.includes('file')) {
|
|
213
|
+
void this._fileOutput.write(logEntry);
|
|
214
|
+
}
|
|
215
|
+
if (target.includes('stderr')) {
|
|
216
|
+
this.debugInstance(message, ...args);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
error(messageOrFn, ...args) {
|
|
220
|
+
this._logWithLevel('error', messageOrFn, ...args);
|
|
221
|
+
}
|
|
222
|
+
checkEnabled() {
|
|
223
|
+
// Lines 72-85: Check if logger enabled
|
|
224
|
+
const config = this._configManager.getEffectiveConfig(); // Line 73
|
|
225
|
+
if (!config.enabled) {
|
|
226
|
+
// Line 74-76
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
// Handle namespaces as either array or object
|
|
230
|
+
const namespaces = Array.isArray(config.namespaces)
|
|
231
|
+
? config.namespaces
|
|
232
|
+
: Object.keys(config.namespaces);
|
|
233
|
+
for (const pattern of namespaces) {
|
|
234
|
+
// Line 78-82
|
|
235
|
+
if (this.matchesPattern(this._namespace, pattern)) {
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return false; // Line 84
|
|
240
|
+
}
|
|
241
|
+
matchesPattern(namespace, pattern) {
|
|
242
|
+
// Lines 87-98: Pattern matching
|
|
243
|
+
if (pattern === namespace) {
|
|
244
|
+
// Line 88-90
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
// Support wildcards anywhere in the pattern
|
|
248
|
+
if (pattern.includes('*')) {
|
|
249
|
+
// Convert pattern to regex:
|
|
250
|
+
// - Escape special regex chars except *
|
|
251
|
+
// - Replace * with .* for regex wildcard matching
|
|
252
|
+
const regexPattern = pattern
|
|
253
|
+
// eslint-disable-next-line sonarjs/regular-expr -- Static regex reviewed for lint hardening; behavior preserved.
|
|
254
|
+
.replace(/[.+?^${}()|[\]\\]/g, '\\$&') // Escape special chars
|
|
255
|
+
.replace(/\*/g, '.*'); // Convert * to regex wildcard
|
|
256
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
257
|
+
return regex.test(namespace);
|
|
258
|
+
}
|
|
259
|
+
return false; // Line 97
|
|
260
|
+
}
|
|
261
|
+
redactSensitive(message) {
|
|
262
|
+
// Lines 100-110: Redact sensitive data
|
|
263
|
+
const patterns = this._configManager.getRedactPatterns(); // Line 101
|
|
264
|
+
let result = message; // Line 102
|
|
265
|
+
for (const pattern of patterns) {
|
|
266
|
+
// Line 104-107
|
|
267
|
+
const regex = new RegExp(`${pattern}["']?:\\s*["']?([^"'\\s]+)`, 'gi');
|
|
268
|
+
result = result.replace(regex, `${pattern}: [REDACTED]`);
|
|
269
|
+
}
|
|
270
|
+
return result; // Line 109
|
|
271
|
+
}
|
|
272
|
+
onConfigChange() {
|
|
273
|
+
// Lines 112-114
|
|
274
|
+
this._enabled = this.checkEnabled();
|
|
275
|
+
}
|
|
276
|
+
async dispose() {
|
|
277
|
+
// Unsubscribe using the bound reference
|
|
278
|
+
this._configManager.unsubscribe(this.boundOnConfigChange);
|
|
279
|
+
// Remove from registry if present
|
|
280
|
+
if (DebugLogger.instances.get(this._namespace) === this) {
|
|
281
|
+
DebugLogger.instances.delete(this._namespace);
|
|
282
|
+
}
|
|
283
|
+
await this._fileOutput.dispose();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=DebugLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DebugLogger.js","sourceRoot":"","sources":["../../../src/debug/DebugLogger.ts"],"names":[],"mappings":"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"}
|