@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
@@ -0,0 +1,28 @@
1
+ import type { LogEntry } from './types.js';
2
+ export declare class FileOutput {
3
+ private static instance;
4
+ private debugDir;
5
+ private currentLogFile;
6
+ private writeQueue;
7
+ private isWriting;
8
+ private disposed;
9
+ private flushTimeout;
10
+ private maxFileSize;
11
+ private maxQueueSize;
12
+ private batchSize;
13
+ private flushInterval;
14
+ private debugRunId;
15
+ private constructor();
16
+ get runId(): string;
17
+ static getInstance(): FileOutput;
18
+ static disposeInstance(): Promise<void>;
19
+ write(entry: LogEntry): Promise<void>;
20
+ dispose(): Promise<void>;
21
+ static resetForTesting(): Promise<void>;
22
+ private startFlushTimer;
23
+ private flushQueue;
24
+ private waitForWriteTurn;
25
+ private ensureDirectoryExists;
26
+ private checkFileRotation;
27
+ private generateLogFileName;
28
+ }
@@ -0,0 +1,190 @@
1
+ /**
2
+ * @plan PLAN-20250120-DEBUGLOGGING.P10
3
+ * @requirement REQ-005
4
+ */
5
+ import { promises as fs } from 'fs';
6
+ import { join } from 'path';
7
+ import { homedir } from 'os';
8
+ import { LLXPRT_DIR } from '../utils/paths.js';
9
+ const LOG_FILE_DATE_LENGTH = 10;
10
+ export class FileOutput {
11
+ static instance;
12
+ debugDir;
13
+ currentLogFile;
14
+ writeQueue = [];
15
+ isWriting = false;
16
+ disposed = false;
17
+ flushTimeout = null;
18
+ maxFileSize = 10 * 1024 * 1024; // 10MB
19
+ maxQueueSize = 1000;
20
+ batchSize = 50;
21
+ flushInterval = 1000; // 1 second
22
+ debugRunId;
23
+ constructor() {
24
+ const home = homedir();
25
+ // Handle test environments where homedir might not be available
26
+ this.debugDir = home
27
+ ? join(home, LLXPRT_DIR, 'debug')
28
+ : join(process.cwd(), LLXPRT_DIR, 'debug');
29
+ /* eslint-disable @typescript-eslint/prefer-nullish-coalescing -- intentional falsy coalescing: env vars may be empty strings, fall through to pid */
30
+ this.debugRunId =
31
+ process.env.LLXPRT_DEBUG_RUN_ID ||
32
+ process.env.LLXPRT_DEBUG_SESSION_ID ||
33
+ String(process.pid);
34
+ /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */
35
+ this.currentLogFile = this.generateLogFileName();
36
+ }
37
+ get runId() {
38
+ return this.debugRunId;
39
+ }
40
+ static getInstance() {
41
+ FileOutput.instance ??= new FileOutput();
42
+ return FileOutput.instance;
43
+ }
44
+ static async disposeInstance() {
45
+ if (FileOutput.instance) {
46
+ await FileOutput.instance.dispose();
47
+ }
48
+ }
49
+ async write(entry) {
50
+ if (this.disposed) {
51
+ return;
52
+ }
53
+ if (!this.flushTimeout) {
54
+ this.startFlushTimer();
55
+ }
56
+ // Add to queue
57
+ this.writeQueue.push({
58
+ entry,
59
+ timestamp: Date.now(),
60
+ });
61
+ // Prevent queue from growing too large
62
+ if (this.writeQueue.length > this.maxQueueSize) {
63
+ this.writeQueue = this.writeQueue.slice(-this.maxQueueSize);
64
+ }
65
+ // Flush immediately if queue is large or not currently writing
66
+ if (this.writeQueue.length >= this.batchSize || !this.isWriting) {
67
+ await this.flushQueue();
68
+ }
69
+ }
70
+ async dispose() {
71
+ this.disposed = true;
72
+ if (this.flushTimeout) {
73
+ clearTimeout(this.flushTimeout);
74
+ this.flushTimeout = null;
75
+ }
76
+ while (this.isWriting) {
77
+ await this.waitForWriteTurn();
78
+ }
79
+ let previousQueueLength = Number.POSITIVE_INFINITY;
80
+ while (this.writeQueue.length > 0 &&
81
+ this.writeQueue.length < previousQueueLength) {
82
+ previousQueueLength = this.writeQueue.length;
83
+ await this.flushQueue({ allowDisposed: true });
84
+ }
85
+ if (FileOutput.instance === this) {
86
+ FileOutput.instance = undefined;
87
+ }
88
+ }
89
+ static async resetForTesting() {
90
+ const instance = FileOutput.instance;
91
+ FileOutput.instance = undefined;
92
+ if (instance) {
93
+ await instance.dispose();
94
+ }
95
+ }
96
+ startFlushTimer() {
97
+ if (this.disposed) {
98
+ return;
99
+ }
100
+ if (this.flushTimeout) {
101
+ return;
102
+ }
103
+ this.flushTimeout = setTimeout(() => {
104
+ void (async () => {
105
+ await this.flushQueue();
106
+ this.flushTimeout = null;
107
+ if (this.writeQueue.length > 0) {
108
+ this.startFlushTimer();
109
+ }
110
+ })();
111
+ }, this.flushInterval);
112
+ }
113
+ async flushQueue(options = {}) {
114
+ if (this.isWriting ||
115
+ this.writeQueue.length === 0 ||
116
+ (this.disposed === true && options.allowDisposed !== true)) {
117
+ return;
118
+ }
119
+ this.isWriting = true;
120
+ let entriesToWrite = [];
121
+ try {
122
+ await this.ensureDirectoryExists();
123
+ await this.checkFileRotation();
124
+ // Process entries in batches
125
+ entriesToWrite = this.writeQueue.splice(0, this.batchSize);
126
+ if (entriesToWrite.length === 0) {
127
+ return;
128
+ }
129
+ // Convert to JSONL format
130
+ const jsonlData = entriesToWrite.map(({ entry }) => JSON.stringify(entry)).join('\n') +
131
+ '\n';
132
+ // Write to file with proper permissions
133
+ await fs.appendFile(this.currentLogFile, jsonlData, {
134
+ encoding: 'utf8',
135
+ mode: 0o600,
136
+ });
137
+ }
138
+ catch (error) {
139
+ // Gracefully handle errors - don't crash the application
140
+ console.error('FileOutput: Failed to write log entries:', error);
141
+ // Put entries back in queue for retry (but limit retries)
142
+ if (this.writeQueue.length < this.maxQueueSize / 2) {
143
+ this.writeQueue.unshift(...entriesToWrite);
144
+ }
145
+ }
146
+ finally {
147
+ this.isWriting = false;
148
+ }
149
+ }
150
+ async waitForWriteTurn() {
151
+ await new Promise((resolve) => setImmediate(resolve));
152
+ }
153
+ async ensureDirectoryExists() {
154
+ try {
155
+ await fs.access(this.debugDir);
156
+ }
157
+ catch {
158
+ await fs.mkdir(this.debugDir, {
159
+ recursive: true,
160
+ mode: 0o700,
161
+ });
162
+ }
163
+ }
164
+ async checkFileRotation() {
165
+ try {
166
+ const stats = await fs.stat(this.currentLogFile);
167
+ // Rotate by size
168
+ if (stats.size >= this.maxFileSize) {
169
+ this.currentLogFile = this.generateLogFileName();
170
+ return;
171
+ }
172
+ // Rotate by date (daily rotation)
173
+ const fileDate = new Date(stats.birthtime);
174
+ const today = new Date();
175
+ if (fileDate.toDateString() !== today.toDateString()) {
176
+ this.currentLogFile = this.generateLogFileName();
177
+ }
178
+ }
179
+ catch {
180
+ // File doesn't exist yet, that's fine
181
+ }
182
+ }
183
+ generateLogFileName() {
184
+ const now = new Date();
185
+ const datePart = now.toISOString().slice(0, LOG_FILE_DATE_LENGTH);
186
+ const timePart = now.toTimeString().slice(0, 8).replace(/:/g, '-');
187
+ return join(this.debugDir, `llxprt-debug-${this.debugRunId}-${datePart}-${timePart}.jsonl`);
188
+ }
189
+ }
190
+ //# sourceMappingURL=FileOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileOutput.js","sourceRoot":"","sources":["../../../src/debug/FileOutput.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @plan PLAN-20250120-DEBUGLOGGING.P05
3
+ * @requirement REQ-001,REQ-002
4
+ * Mock implementation for DebugLogger testing
5
+ */
6
+ export interface DebugSettings {
7
+ enabled: boolean;
8
+ namespaces: string[];
9
+ level?: string;
10
+ output?: {
11
+ target: string;
12
+ directory?: string;
13
+ };
14
+ redactPatterns?: string[];
15
+ }
16
+ export declare class MockConfigurationManager {
17
+ private static instance;
18
+ private config;
19
+ private listeners;
20
+ static getInstance(): MockConfigurationManager;
21
+ setEphemeralConfig(config: Partial<DebugSettings>): void;
22
+ getEffectiveConfig(): DebugSettings;
23
+ getOutputTarget(): string;
24
+ getRedactPatterns(): string[];
25
+ subscribe(listener: () => void): void;
26
+ unsubscribe(listener: () => void): void;
27
+ private notifyListeners;
28
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @plan PLAN-20250120-DEBUGLOGGING.P05
3
+ * @requirement REQ-001,REQ-002
4
+ * Mock implementation for DebugLogger testing
5
+ */
6
+ export class MockConfigurationManager {
7
+ static instance;
8
+ config = {
9
+ enabled: true,
10
+ namespaces: ['*'],
11
+ level: 'debug',
12
+ output: { target: 'file stderr', directory: '~/.llxprt/debug' },
13
+ redactPatterns: ['apiKey', 'token', 'password'],
14
+ };
15
+ listeners = new Set();
16
+ static getInstance() {
17
+ MockConfigurationManager.instance ??= new MockConfigurationManager();
18
+ return MockConfigurationManager.instance;
19
+ }
20
+ setEphemeralConfig(config) {
21
+ this.config = { ...this.config, ...config };
22
+ this.notifyListeners();
23
+ }
24
+ getEffectiveConfig() {
25
+ return this.config;
26
+ }
27
+ getOutputTarget() {
28
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- intentional falsy coalescing: empty string target should fall back to default
29
+ return this.config.output?.target || 'file stderr';
30
+ }
31
+ getRedactPatterns() {
32
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- intentional falsy coalescing: empty array vs undefined - treating undefined as no patterns
33
+ return this.config.redactPatterns || [];
34
+ }
35
+ subscribe(listener) {
36
+ this.listeners.add(listener);
37
+ }
38
+ unsubscribe(listener) {
39
+ this.listeners.delete(listener);
40
+ }
41
+ notifyListeners() {
42
+ this.listeners.forEach((listener) => listener());
43
+ }
44
+ }
45
+ //# sourceMappingURL=MockConfigurationManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockConfigurationManager.js","sourceRoot":"","sources":["../../../src/debug/MockConfigurationManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,MAAM,OAAO,wBAAwB;IAC3B,MAAM,CAAC,QAAQ,CAAuC;IACtD,MAAM,GAAkB;QAC9B,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,CAAC,GAAG,CAAC;QACjB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE;QAC/D,cAAc,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC;KAChD,CAAC;IACM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAE1C,MAAM,CAAC,WAAW;QAChB,wBAAwB,CAAC,QAAQ,KAAK,IAAI,wBAAwB,EAAE,CAAC;QACrE,OAAO,wBAAwB,CAAC,QAAQ,CAAC;IAC3C,CAAC;IAED,kBAAkB,CAAC,MAA8B;QAC/C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QAC5C,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,eAAe;QACb,yJAAyJ;QACzJ,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,aAAa,CAAC;IACrD,CAAC;IAED,iBAAiB;QACf,sKAAsK;QACtK,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,SAAS,CAAC,QAAoB;QAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW,CAAC,QAAoB;QAC9B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @plan PLAN-20250120-DEBUGLOGGING.P05
3
+ * @requirement REQ-001
4
+ * Mock implementation for DebugLogger testing
5
+ */
6
+ export interface LogEntry {
7
+ timestamp: string;
8
+ namespace: string;
9
+ level: string;
10
+ message: string;
11
+ args?: unknown[];
12
+ runId: string;
13
+ pid: number;
14
+ }
15
+ export declare class MockFileOutput {
16
+ private static instance;
17
+ private entries;
18
+ static getInstance(): MockFileOutput;
19
+ write(entry: LogEntry): void;
20
+ getEntries(): LogEntry[];
21
+ clear(): void;
22
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @plan PLAN-20250120-DEBUGLOGGING.P05
3
+ * @requirement REQ-001
4
+ * Mock implementation for DebugLogger testing
5
+ */
6
+ export class MockFileOutput {
7
+ static instance;
8
+ entries = [];
9
+ static getInstance() {
10
+ MockFileOutput.instance ??= new MockFileOutput();
11
+ return MockFileOutput.instance;
12
+ }
13
+ write(entry) {
14
+ this.entries.push(entry);
15
+ }
16
+ getEntries() {
17
+ return [...this.entries];
18
+ }
19
+ clear() {
20
+ this.entries = [];
21
+ }
22
+ }
23
+ //# sourceMappingURL=MockFileOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockFileOutput.js","sourceRoot":"","sources":["../../../src/debug/MockFileOutput.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,MAAM,OAAO,cAAc;IACjB,MAAM,CAAC,QAAQ,CAA6B;IAC5C,OAAO,GAAe,EAAE,CAAC;IAEjC,MAAM,CAAC,WAAW;QAChB,cAAc,CAAC,QAAQ,KAAK,IAAI,cAAc,EAAE,CAAC;QACjD,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAe;QACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @plan PLAN-20250120-DEBUGLOGGING.P03
3
+ * @requirement REQ-001
4
+ */
5
+ export * from './types.js';
6
+ export * from './DebugLogger.js';
7
+ export * from './ConfigurationManager.js';
8
+ export * from './FileOutput.js';
9
+ export { MockConfigurationManager } from './MockConfigurationManager.js';
10
+ export { MockFileOutput } from './MockFileOutput.js';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @plan PLAN-20250120-DEBUGLOGGING.P03
3
+ * @requirement REQ-001
4
+ */
5
+ export * from './types.js';
6
+ export * from './DebugLogger.js';
7
+ export * from './ConfigurationManager.js';
8
+ export * from './FileOutput.js';
9
+ export { MockConfigurationManager } from './MockConfigurationManager.js';
10
+ export { MockFileOutput } from './MockFileOutput.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/debug/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @plan PLAN-20250120-DEBUGLOGGING.P03
3
+ * @requirement REQ-001
4
+ */
5
+ export interface DebugOutputConfig {
6
+ target: string;
7
+ directory?: string;
8
+ }
9
+ export interface DebugSettings {
10
+ enabled: boolean;
11
+ namespaces: string[] | Record<string, unknown>;
12
+ level: string;
13
+ output: DebugOutputConfig | string;
14
+ lazyEvaluation: boolean;
15
+ redactPatterns: string[];
16
+ }
17
+ export interface LogEntry {
18
+ timestamp: string;
19
+ namespace: string;
20
+ level: string;
21
+ message: string;
22
+ args?: unknown[];
23
+ runId: string;
24
+ pid: number;
25
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/debug/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Structural interfaces owned by the telemetry package to avoid
8
+ * circular dependencies on core. Core's Config structurally satisfies
9
+ * TelemetryConfig; consumers may also implement TelemetryConfig directly.
10
+ */
11
+ /**
12
+ * Minimal config for session-scoped telemetry. Only `getSessionId` is required.
13
+ */
14
+ export interface SessionConfig {
15
+ getSessionId(): string;
16
+ }
17
+ /**
18
+ * Config needed for functions that conditionally log prompts.
19
+ */
20
+ export interface TelemetryPromptConfig extends SessionConfig {
21
+ getTelemetryLogPromptsEnabled(): boolean;
22
+ }
23
+ /**
24
+ * Config for tool-call telemetry (session id + prompt logging).
25
+ */
26
+ export interface ToolLoggingConfig extends SessionConfig {
27
+ getTelemetryLogPromptsEnabled(): boolean;
28
+ }
29
+ /**
30
+ * Full telemetry config. Core's `Config` satisfies this interface structurally.
31
+ * Adding new methods here is safe as long as the implementing class provides them.
32
+ */
33
+ export interface TelemetryConfig extends SessionConfig {
34
+ getTelemetryEnabled(): boolean;
35
+ getTelemetryLogPromptsEnabled(): boolean;
36
+ getTelemetryOutfile(): string | undefined;
37
+ getTelemetryTarget(): string;
38
+ getTelemetryOtlpEndpoint(): string;
39
+ getDebugMode(): boolean;
40
+ getConversationLoggingEnabled(): boolean;
41
+ getSessionId(): string;
42
+ getModel(): string;
43
+ getEmbeddingModel(): string | undefined;
44
+ getSandbox(): unknown;
45
+ getCoreTools(): string[] | undefined;
46
+ getApprovalMode(): string;
47
+ getContentGeneratorConfig(): ContentGeneratorConfig | undefined;
48
+ getFileFilteringRespectGitIgnore(): boolean;
49
+ getMcpServers(): Record<string, unknown> | undefined;
50
+ }
51
+ /**
52
+ * Subset of content generator config used by StartSessionEvent.
53
+ */
54
+ export interface ContentGeneratorConfig {
55
+ model?: string;
56
+ apiKey?: string;
57
+ vertexai?: boolean;
58
+ }
59
+ export interface DiffStat {
60
+ ai_added_lines: number;
61
+ ai_removed_lines: number;
62
+ user_added_lines: number;
63
+ user_removed_lines: number;
64
+ }
65
+ export declare enum ToolConfirmationOutcome {
66
+ ProceedOnce = "proceed_once",
67
+ ProceedAlways = "proceed_always",
68
+ ProceedAlwaysAndSave = "proceed_always_and_save",
69
+ ProceedAlwaysServer = "proceed_always_server",
70
+ ProceedAlwaysTool = "proceed_always_tool",
71
+ ModifyWithEditor = "modify_with_editor",
72
+ SuggestEdit = "suggest_edit",
73
+ Cancel = "cancel"
74
+ }
75
+ export interface ToolCallRequest {
76
+ name: string;
77
+ args: Record<string, unknown>;
78
+ callId: string;
79
+ isClientInitiated: boolean;
80
+ prompt_id: string;
81
+ agentId?: string;
82
+ }
83
+ export interface ToolCallError {
84
+ name?: string;
85
+ message?: string;
86
+ }
87
+ export interface ToolCallResponse {
88
+ callId: string;
89
+ responseParts?: unknown[];
90
+ resultDisplay?: unknown;
91
+ error?: ToolCallError;
92
+ errorType?: string;
93
+ agentId?: string;
94
+ }
95
+ export interface ToolLike {
96
+ serverName?: unknown;
97
+ serverToolName?: unknown;
98
+ [key: string]: unknown;
99
+ }
100
+ export interface CompletedToolCallShape {
101
+ status: string;
102
+ request: ToolCallRequest;
103
+ response: ToolCallResponse;
104
+ tool?: ToolLike | unknown;
105
+ durationMs?: number;
106
+ outcome?: ToolConfirmationOutcome;
107
+ }
108
+ export declare enum HookEventName {
109
+ BeforeTool = "BeforeTool",
110
+ AfterTool = "AfterTool",
111
+ BeforeAgent = "BeforeAgent",
112
+ Notification = "Notification",
113
+ AfterAgent = "AfterAgent",
114
+ SessionStart = "SessionStart",
115
+ SessionEnd = "SessionEnd",
116
+ PreCompress = "PreCompress",
117
+ BeforeModel = "BeforeModel",
118
+ AfterModel = "AfterModel",
119
+ BeforeToolSelection = "BeforeToolSelection"
120
+ }
121
+ export interface HookInput {
122
+ session_id: string;
123
+ transcript_path: string;
124
+ cwd: string;
125
+ hook_event_name: string;
126
+ timestamp: string;
127
+ }
128
+ export interface HookConfig {
129
+ type: string;
130
+ command: string;
131
+ name?: string;
132
+ }
133
+ export interface HookExecutionResult {
134
+ hookConfig: HookConfig;
135
+ eventName: HookEventName;
136
+ success: boolean;
137
+ output?: Record<string, unknown> | unknown;
138
+ stdout?: string;
139
+ stderr?: string;
140
+ exitCode?: number;
141
+ duration: number;
142
+ error?: Error;
143
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ // ---------------------------------------------------------------------------
7
+ // ToolConfirmationOutcome — structural equivalent
8
+ // ---------------------------------------------------------------------------
9
+ export var ToolConfirmationOutcome;
10
+ (function (ToolConfirmationOutcome) {
11
+ ToolConfirmationOutcome["ProceedOnce"] = "proceed_once";
12
+ ToolConfirmationOutcome["ProceedAlways"] = "proceed_always";
13
+ ToolConfirmationOutcome["ProceedAlwaysAndSave"] = "proceed_always_and_save";
14
+ ToolConfirmationOutcome["ProceedAlwaysServer"] = "proceed_always_server";
15
+ ToolConfirmationOutcome["ProceedAlwaysTool"] = "proceed_always_tool";
16
+ ToolConfirmationOutcome["ModifyWithEditor"] = "modify_with_editor";
17
+ ToolConfirmationOutcome["SuggestEdit"] = "suggest_edit";
18
+ ToolConfirmationOutcome["Cancel"] = "cancel";
19
+ })(ToolConfirmationOutcome || (ToolConfirmationOutcome = {}));
20
+ // ---------------------------------------------------------------------------
21
+ // Hook types — structural equivalents for HookCallEvent
22
+ // ---------------------------------------------------------------------------
23
+ export var HookEventName;
24
+ (function (HookEventName) {
25
+ HookEventName["BeforeTool"] = "BeforeTool";
26
+ HookEventName["AfterTool"] = "AfterTool";
27
+ HookEventName["BeforeAgent"] = "BeforeAgent";
28
+ HookEventName["Notification"] = "Notification";
29
+ HookEventName["AfterAgent"] = "AfterAgent";
30
+ HookEventName["SessionStart"] = "SessionStart";
31
+ HookEventName["SessionEnd"] = "SessionEnd";
32
+ HookEventName["PreCompress"] = "PreCompress";
33
+ HookEventName["BeforeModel"] = "BeforeModel";
34
+ HookEventName["AfterModel"] = "AfterModel";
35
+ HookEventName["BeforeToolSelection"] = "BeforeToolSelection";
36
+ })(HookEventName || (HookEventName = {}));
37
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/internal/interfaces.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4EH,8EAA8E;AAC9E,kDAAkD;AAClD,8EAA8E;AAE9E,MAAM,CAAN,IAAY,uBASX;AATD,WAAY,uBAAuB;IACjC,uDAA4B,CAAA;IAC5B,2DAAgC,CAAA;IAChC,2EAAgD,CAAA;IAChD,wEAA6C,CAAA;IAC7C,oEAAyC,CAAA;IACzC,kEAAuC,CAAA;IACvC,uDAA4B,CAAA;IAC5B,4CAAiB,CAAA;AACnB,CAAC,EATW,uBAAuB,KAAvB,uBAAuB,QASlC;AA4CD,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAE9E,MAAM,CAAN,IAAY,aAYX;AAZD,WAAY,aAAa;IACvB,0CAAyB,CAAA;IACzB,wCAAuB,CAAA;IACvB,4CAA2B,CAAA;IAC3B,8CAA6B,CAAA;IAC7B,0CAAyB,CAAA;IACzB,8CAA6B,CAAA;IAC7B,0CAAyB,CAAA;IACzB,4CAA2B,CAAA;IAC3B,4CAA2B,CAAA;IAC3B,0CAAyB,CAAA;IACzB,4DAA2C,CAAA;AAC7C,CAAC,EAZW,aAAa,KAAb,aAAa,QAYxB"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export declare const SERVICE_NAME = "llxprt-code";
7
+ export declare const EVENT_USER_PROMPT = "llxprt_code.user_prompt";
8
+ export declare const EVENT_TOOL_CALL = "llxprt_code.tool_call";
9
+ export declare const EVENT_HOOK_CALL = "llxprt_code.hook_call";
10
+ export declare const EVENT_API_REQUEST = "llxprt_code.api_request";
11
+ export declare const EVENT_API_ERROR = "llxprt_code.api_error";
12
+ export declare const EVENT_API_RESPONSE = "llxprt_code.api_response";
13
+ export declare const EVENT_CLI_CONFIG = "llxprt_code.config";
14
+ export declare const EVENT_NEXT_SPEAKER_CHECK = "llxprt_code.next_speaker_check";
15
+ export declare const EVENT_SLASH_COMMAND = "llxprt_code.slash_command";
16
+ export declare const EVENT_CONVERSATION_REQUEST = "llxprt_code.conversation_request";
17
+ export declare const EVENT_CONVERSATION_RESPONSE = "llxprt_code.conversation_response";
18
+ export declare const EVENT_ENHANCED_CONVERSATION_RESPONSE = "llxprt_code.enhanced_conversation_response";
19
+ export declare const EVENT_PROVIDER_SWITCH = "llxprt_code.provider_switch";
20
+ export declare const EVENT_PROVIDER_CAPABILITY = "llxprt_code.provider_capability";
21
+ export declare const EVENT_TOOL_OUTPUT_TRUNCATED = "llxprt_code.tool_output_truncated";
22
+ export declare const EVENT_FILE_OPERATION = "llxprt_code.file_operation";
23
+ export declare const EVENT_MALFORMED_JSON_RESPONSE = "llxprt_code.malformed_json_response";
24
+ export declare const EVENT_MODEL_ROUTING = "llxprt_code.model_routing";
25
+ export declare const EVENT_EXTENSION_INSTALL = "llxprt_code.extension_install";
26
+ export declare const EVENT_EXTENSION_UNINSTALL = "llxprt_code.extension_uninstall";
27
+ export declare const EVENT_EXTENSION_ENABLE = "llxprt_code.extension_enable";
28
+ export declare const EVENT_EXTENSION_DISABLE = "llxprt_code.extension_disable";
29
+ export declare const METRIC_TOOL_CALL_COUNT = "llxprt_code.tool.call.count";
30
+ export declare const METRIC_TOOL_CALL_LATENCY = "llxprt_code.tool.call.latency";
31
+ export declare const METRIC_API_REQUEST_COUNT = "llxprt_code.api.request.count";
32
+ export declare const METRIC_API_REQUEST_LATENCY = "llxprt_code.api.request.latency";
33
+ export declare const METRIC_TOKEN_USAGE = "llxprt_code.token.usage";
34
+ export declare const METRIC_SESSION_COUNT = "llxprt_code.session.count";
35
+ export declare const METRIC_FILE_OPERATION_COUNT = "llxprt_code.file.operation.count";