@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.
Files changed (71) hide show
  1. package/dist/.last_build +0 -0
  2. package/dist/index.d.ts +11 -0
  3. package/dist/index.js +15 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/src/debug/ConfigurationManager.d.ts +33 -0
  6. package/dist/src/debug/ConfigurationManager.js +226 -0
  7. package/dist/src/debug/ConfigurationManager.js.map +1 -0
  8. package/dist/src/debug/DebugLogger.d.ts +46 -0
  9. package/dist/src/debug/DebugLogger.js +286 -0
  10. package/dist/src/debug/DebugLogger.js.map +1 -0
  11. package/dist/src/debug/FileOutput.d.ts +28 -0
  12. package/dist/src/debug/FileOutput.js +190 -0
  13. package/dist/src/debug/FileOutput.js.map +1 -0
  14. package/dist/src/debug/MockConfigurationManager.d.ts +28 -0
  15. package/dist/src/debug/MockConfigurationManager.js +45 -0
  16. package/dist/src/debug/MockConfigurationManager.js.map +1 -0
  17. package/dist/src/debug/MockFileOutput.d.ts +22 -0
  18. package/dist/src/debug/MockFileOutput.js +23 -0
  19. package/dist/src/debug/MockFileOutput.js.map +1 -0
  20. package/dist/src/debug/index.d.ts +10 -0
  21. package/dist/src/debug/index.js +11 -0
  22. package/dist/src/debug/index.js.map +1 -0
  23. package/dist/src/debug/types.d.ts +25 -0
  24. package/dist/src/debug/types.js +2 -0
  25. package/dist/src/debug/types.js.map +1 -0
  26. package/dist/src/internal/interfaces.d.ts +143 -0
  27. package/dist/src/internal/interfaces.js +37 -0
  28. package/dist/src/internal/interfaces.js.map +1 -0
  29. package/dist/src/telemetry/constants.d.ts +35 -0
  30. package/dist/src/telemetry/constants.js +36 -0
  31. package/dist/src/telemetry/constants.js.map +1 -0
  32. package/dist/src/telemetry/file-exporters.d.ts +28 -0
  33. package/dist/src/telemetry/file-exporters.js +89 -0
  34. package/dist/src/telemetry/file-exporters.js.map +1 -0
  35. package/dist/src/telemetry/index.d.ts +24 -0
  36. package/dist/src/telemetry/index.js +24 -0
  37. package/dist/src/telemetry/index.js.map +1 -0
  38. package/dist/src/telemetry/loggers.d.ts +46 -0
  39. package/dist/src/telemetry/loggers.js +543 -0
  40. package/dist/src/telemetry/loggers.js.map +1 -0
  41. package/dist/src/telemetry/metrics.d.ts +24 -0
  42. package/dist/src/telemetry/metrics.js +153 -0
  43. package/dist/src/telemetry/metrics.js.map +1 -0
  44. package/dist/src/telemetry/sdk.d.ts +10 -0
  45. package/dist/src/telemetry/sdk.js +138 -0
  46. package/dist/src/telemetry/sdk.js.map +1 -0
  47. package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
  48. package/dist/src/telemetry/tool-call-decision.js +30 -0
  49. package/dist/src/telemetry/tool-call-decision.js.map +1 -0
  50. package/dist/src/telemetry/types.d.ts +380 -0
  51. package/dist/src/telemetry/types.js +620 -0
  52. package/dist/src/telemetry/types.js.map +1 -0
  53. package/dist/src/telemetry/uiTelemetry.d.ts +104 -0
  54. package/dist/src/telemetry/uiTelemetry.js +183 -0
  55. package/dist/src/telemetry/uiTelemetry.js.map +1 -0
  56. package/dist/src/utils/debugLogger.d.ts +10 -0
  57. package/dist/src/utils/debugLogger.js +11 -0
  58. package/dist/src/utils/debugLogger.js.map +1 -0
  59. package/dist/src/utils/index.d.ts +9 -0
  60. package/dist/src/utils/index.js +10 -0
  61. package/dist/src/utils/index.js.map +1 -0
  62. package/dist/src/utils/paths.d.ts +10 -0
  63. package/dist/src/utils/paths.js +11 -0
  64. package/dist/src/utils/paths.js.map +1 -0
  65. package/dist/src/utils/safeJsonStringify.d.ts +13 -0
  66. package/dist/src/utils/safeJsonStringify.js +25 -0
  67. package/dist/src/utils/safeJsonStringify.js.map +1 -0
  68. package/dist/src/utils/session.d.ts +6 -0
  69. package/dist/src/utils/session.js +8 -0
  70. package/dist/src/utils/session.js.map +1 -0
  71. package/package.json +80 -0
File without changes
@@ -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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"}