@kodus/cli 0.1.0 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -14
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +5 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth/login.d.ts.map +1 -1
- package/dist/commands/auth/login.js +5 -22
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/signup.d.ts.map +1 -1
- package/dist/commands/auth/signup.js +0 -15
- package/dist/commands/auth/signup.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +10 -91
- package/dist/commands/review.js.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/services/api/api.interface.d.ts +1 -5
- package/dist/services/api/api.interface.d.ts.map +1 -1
- package/dist/services/api/api.real.d.ts +1 -2
- package/dist/services/api/api.real.d.ts.map +1 -1
- package/dist/services/api/api.real.js +17 -18
- package/dist/services/api/api.real.js.map +1 -1
- package/dist/services/api/index.d.ts +3 -3
- package/dist/services/api/index.d.ts.map +1 -1
- package/dist/services/api/index.js +2 -8
- package/dist/services/api/index.js.map +1 -1
- package/dist/services/review.service.d.ts +5 -3
- package/dist/services/review.service.d.ts.map +1 -1
- package/dist/services/review.service.js +54 -25
- package/dist/services/review.service.js.map +1 -1
- package/dist/types/index.d.ts +33 -15
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/ui/interactive.d.ts.map +1 -1
- package/dist/ui/interactive.js +7 -1
- package/dist/ui/interactive.js.map +1 -1
- package/package.json +3 -1
- package/dist/commands/config.d.ts +0 -3
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -47
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/telemetry.d.ts +0 -3
- package/dist/commands/telemetry.d.ts.map +0 -1
- package/dist/commands/telemetry.js +0 -76
- package/dist/commands/telemetry.js.map +0 -1
- package/dist/services/api/api.mock.d.ts +0 -8
- package/dist/services/api/api.mock.d.ts.map +0 -1
- package/dist/services/api/api.mock.js +0 -249
- package/dist/services/api/api.mock.js.map +0 -1
- package/dist/services/telemetry.service.d.ts +0 -73
- package/dist/services/telemetry.service.d.ts.map +0 -1
- package/dist/services/telemetry.service.js +0 -229
- package/dist/services/telemetry.service.js.map +0 -1
- package/dist/utils/review-loading.d.ts +0 -19
- package/dist/utils/review-loading.d.ts.map +0 -1
- package/dist/utils/review-loading.js +0 -140
- package/dist/utils/review-loading.js.map +0 -1
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import { ApiError } from '../../types/index.js';
|
|
2
|
-
const MOCK_DELAY = 800;
|
|
3
|
-
const trialUsage = new Map();
|
|
4
|
-
function delay(ms) {
|
|
5
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
6
|
-
}
|
|
7
|
-
function generateMockToken() {
|
|
8
|
-
return 'mock_' + Math.random().toString(36).substring(2) + '_' + Date.now();
|
|
9
|
-
}
|
|
10
|
-
const mockIssues = [
|
|
11
|
-
{
|
|
12
|
-
file: 'src/index.ts',
|
|
13
|
-
line: 15,
|
|
14
|
-
severity: 'warning',
|
|
15
|
-
category: 'style',
|
|
16
|
-
message: 'Consider using const instead of let for variables that are never reassigned',
|
|
17
|
-
suggestion: 'const value = getData();',
|
|
18
|
-
ruleId: 'prefer-const',
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
file: 'src/utils.ts',
|
|
22
|
-
line: 42,
|
|
23
|
-
severity: 'error',
|
|
24
|
-
category: 'bug',
|
|
25
|
-
message: 'Potential null reference. Add null check before accessing property',
|
|
26
|
-
suggestion: 'if (user?.name) { ... }',
|
|
27
|
-
ruleId: 'null-safety',
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
file: 'src/api.ts',
|
|
31
|
-
line: 88,
|
|
32
|
-
severity: 'info',
|
|
33
|
-
category: 'best_practices',
|
|
34
|
-
message: 'Consider adding error handling for this async operation',
|
|
35
|
-
suggestion: 'try { await fetch(...) } catch (e) { handleError(e) }',
|
|
36
|
-
ruleId: 'async-error-handling',
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
file: 'src/components/Button.tsx',
|
|
40
|
-
line: 23,
|
|
41
|
-
severity: 'warning',
|
|
42
|
-
category: 'performance',
|
|
43
|
-
message: 'Missing dependency in useEffect hook',
|
|
44
|
-
suggestion: 'useEffect(() => { ... }, [dependency])',
|
|
45
|
-
ruleId: 'react-hooks/exhaustive-deps',
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
file: 'src/services/auth.ts',
|
|
49
|
-
line: 56,
|
|
50
|
-
severity: 'error',
|
|
51
|
-
category: 'security_vulnerability',
|
|
52
|
-
message: 'Sensitive data should not be logged',
|
|
53
|
-
suggestion: 'Remove console.log containing user credentials',
|
|
54
|
-
ruleId: 'security/no-sensitive-logs',
|
|
55
|
-
},
|
|
56
|
-
];
|
|
57
|
-
class MockAuthApi {
|
|
58
|
-
async login(email, password) {
|
|
59
|
-
await delay(MOCK_DELAY);
|
|
60
|
-
if (password.length < 6) {
|
|
61
|
-
throw new ApiError(401, 'Invalid credentials');
|
|
62
|
-
}
|
|
63
|
-
return {
|
|
64
|
-
accessToken: generateMockToken(),
|
|
65
|
-
refreshToken: generateMockToken(),
|
|
66
|
-
expiresIn: 3600,
|
|
67
|
-
user: {
|
|
68
|
-
id: 'user_' + Math.random().toString(36).substring(2),
|
|
69
|
-
email,
|
|
70
|
-
orgs: ['kodus', 'my-org'],
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
async signup(email, password) {
|
|
75
|
-
await delay(MOCK_DELAY);
|
|
76
|
-
if (password.length < 6) {
|
|
77
|
-
throw new ApiError(400, 'Password must be at least 6 characters');
|
|
78
|
-
}
|
|
79
|
-
if (email === 'existing@example.com') {
|
|
80
|
-
throw new ApiError(409, 'Email already registered');
|
|
81
|
-
}
|
|
82
|
-
return {
|
|
83
|
-
accessToken: generateMockToken(),
|
|
84
|
-
refreshToken: generateMockToken(),
|
|
85
|
-
expiresIn: 3600,
|
|
86
|
-
user: {
|
|
87
|
-
id: 'user_' + Math.random().toString(36).substring(2),
|
|
88
|
-
email,
|
|
89
|
-
orgs: [],
|
|
90
|
-
},
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
async refresh(refreshToken) {
|
|
94
|
-
await delay(MOCK_DELAY / 2);
|
|
95
|
-
if (!refreshToken || !refreshToken.startsWith('mock_')) {
|
|
96
|
-
throw new ApiError(401, 'Invalid refresh token');
|
|
97
|
-
}
|
|
98
|
-
return {
|
|
99
|
-
accessToken: generateMockToken(),
|
|
100
|
-
refreshToken: generateMockToken(),
|
|
101
|
-
expiresIn: 3600,
|
|
102
|
-
user: {
|
|
103
|
-
id: 'user_mock',
|
|
104
|
-
email: 'user@example.com',
|
|
105
|
-
orgs: ['kodus'],
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
async logout(_accessToken) {
|
|
110
|
-
await delay(MOCK_DELAY / 2);
|
|
111
|
-
}
|
|
112
|
-
async generateCIToken(_accessToken) {
|
|
113
|
-
await delay(MOCK_DELAY);
|
|
114
|
-
return 'kodus_ci_' + generateMockToken();
|
|
115
|
-
}
|
|
116
|
-
async verify(accessToken) {
|
|
117
|
-
await delay(MOCK_DELAY / 2);
|
|
118
|
-
if (!accessToken || !accessToken.startsWith('mock_')) {
|
|
119
|
-
return { valid: false };
|
|
120
|
-
}
|
|
121
|
-
return {
|
|
122
|
-
valid: true,
|
|
123
|
-
user: {
|
|
124
|
-
id: 'user_mock',
|
|
125
|
-
email: 'test@kodus.io',
|
|
126
|
-
orgs: ['kodus', 'my-org'],
|
|
127
|
-
},
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
class MockReviewApi {
|
|
132
|
-
async analyze(diff, _accessToken, _config) {
|
|
133
|
-
await delay(MOCK_DELAY * 3);
|
|
134
|
-
const fileCount = (diff.match(/diff --git/g) || []).length || 1;
|
|
135
|
-
const issueCount = Math.min(Math.floor(Math.random() * 4) + 1, mockIssues.length);
|
|
136
|
-
const selectedIssues = mockIssues.slice(0, issueCount);
|
|
137
|
-
return {
|
|
138
|
-
summary: `Found ${issueCount} issue${issueCount > 1 ? 's' : ''} in ${fileCount} file${fileCount > 1 ? 's' : ''}`,
|
|
139
|
-
issues: selectedIssues,
|
|
140
|
-
filesAnalyzed: fileCount,
|
|
141
|
-
duration: Math.floor(Math.random() * 2000) + 1000,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
async analyzeWithMetrics(diff, accessToken, config, _metrics) {
|
|
145
|
-
if (_metrics) {
|
|
146
|
-
console.warn('Mocked analyzeWithMetrics call ignores provided metrics.');
|
|
147
|
-
}
|
|
148
|
-
return this.analyze(diff, accessToken, config);
|
|
149
|
-
}
|
|
150
|
-
async getPullRequestSuggestions(_accessToken, params) {
|
|
151
|
-
await delay(MOCK_DELAY);
|
|
152
|
-
if (!params.prUrl && !(params.prNumber && params.repositoryId)) {
|
|
153
|
-
throw new ApiError(400, 'prUrl or prNumber + repositoryId are required');
|
|
154
|
-
}
|
|
155
|
-
const filterList = (value) => {
|
|
156
|
-
if (!value)
|
|
157
|
-
return undefined;
|
|
158
|
-
return value.split(',').map((v) => v.trim()).filter(Boolean);
|
|
159
|
-
};
|
|
160
|
-
const severityFilters = filterList(params.severity);
|
|
161
|
-
const categoryFilters = filterList(params.category);
|
|
162
|
-
const filtered = mockIssues.filter((issue) => {
|
|
163
|
-
const matchesSeverity = !severityFilters || severityFilters.includes(issue.severity);
|
|
164
|
-
const matchesCategory = !categoryFilters || (issue.category && categoryFilters.includes(issue.category));
|
|
165
|
-
return matchesSeverity && matchesCategory;
|
|
166
|
-
});
|
|
167
|
-
const suggestions = filtered.length > 0 ? filtered : mockIssues;
|
|
168
|
-
const markdown = params.format === 'markdown'
|
|
169
|
-
? ['# Mocked pull request suggestions', ...suggestions.map((s) => `- (${s.severity}) ${s.file}:${s.line} ${s.message}`)].join('\n')
|
|
170
|
-
: undefined;
|
|
171
|
-
return {
|
|
172
|
-
summary: 'Mocked pull request suggestions',
|
|
173
|
-
suggestions,
|
|
174
|
-
filesAnalyzed: 1,
|
|
175
|
-
duration: MOCK_DELAY,
|
|
176
|
-
markdown,
|
|
177
|
-
deliveryStatus: 'sent',
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
async trialAnalyze(diff, fingerprint) {
|
|
181
|
-
await delay(MOCK_DELAY * 3);
|
|
182
|
-
const now = Date.now();
|
|
183
|
-
const resetTime = new Date();
|
|
184
|
-
resetTime.setHours(24, 0, 0, 0);
|
|
185
|
-
let usage = trialUsage.get(fingerprint);
|
|
186
|
-
if (!usage || usage.resetAt < now) {
|
|
187
|
-
usage = { count: 0, resetAt: resetTime.getTime() };
|
|
188
|
-
}
|
|
189
|
-
usage.count++;
|
|
190
|
-
trialUsage.set(fingerprint, usage);
|
|
191
|
-
const fileCount = (diff.match(/diff --git/g) || []).length || 1;
|
|
192
|
-
const issueCount = Math.min(Math.floor(Math.random() * 3) + 1, 3);
|
|
193
|
-
const selectedIssues = mockIssues.slice(0, issueCount);
|
|
194
|
-
return {
|
|
195
|
-
summary: `Found ${issueCount} issue${issueCount > 1 ? 's' : ''} in ${fileCount} file${fileCount > 1 ? 's' : ''}`,
|
|
196
|
-
issues: selectedIssues,
|
|
197
|
-
filesAnalyzed: fileCount,
|
|
198
|
-
duration: Math.floor(Math.random() * 2000) + 1000,
|
|
199
|
-
trialInfo: {
|
|
200
|
-
reviewsUsed: usage.count,
|
|
201
|
-
reviewsLimit: 5,
|
|
202
|
-
resetsAt: new Date(usage.resetAt).toISOString(),
|
|
203
|
-
},
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
class MockConfigApi {
|
|
208
|
-
async get(_accessToken, org, _repo) {
|
|
209
|
-
await delay(MOCK_DELAY / 2);
|
|
210
|
-
return {
|
|
211
|
-
language: 'en',
|
|
212
|
-
severity: 'warning',
|
|
213
|
-
rules: {
|
|
214
|
-
security: true,
|
|
215
|
-
performance: true,
|
|
216
|
-
style: true,
|
|
217
|
-
bestPractices: true,
|
|
218
|
-
},
|
|
219
|
-
ignore: ['node_modules/**', 'dist/**', '*.test.ts', '*.spec.ts'],
|
|
220
|
-
llmProvider: org === 'enterprise' ? 'byok' : 'kodus',
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
class MockTrialApi {
|
|
225
|
-
async getStatus(fingerprint) {
|
|
226
|
-
await delay(MOCK_DELAY / 2);
|
|
227
|
-
const now = Date.now();
|
|
228
|
-
const resetTime = new Date();
|
|
229
|
-
resetTime.setHours(24, 0, 0, 0);
|
|
230
|
-
const usage = trialUsage.get(fingerprint);
|
|
231
|
-
const count = usage && usage.resetAt > now ? usage.count : 0;
|
|
232
|
-
return {
|
|
233
|
-
fingerprint,
|
|
234
|
-
reviewsUsed: count,
|
|
235
|
-
reviewsLimit: 5,
|
|
236
|
-
filesLimit: 10,
|
|
237
|
-
linesLimit: 500,
|
|
238
|
-
resetsAt: resetTime.toISOString(),
|
|
239
|
-
isLimited: count >= 5,
|
|
240
|
-
};
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
export class MockApi {
|
|
244
|
-
auth = new MockAuthApi();
|
|
245
|
-
review = new MockReviewApi();
|
|
246
|
-
config = new MockConfigApi();
|
|
247
|
-
trial = new MockTrialApi();
|
|
248
|
-
}
|
|
249
|
-
//# sourceMappingURL=api.mock.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.mock.js","sourceRoot":"","sources":["../../../src/services/api/api.mock.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8C,CAAC;AAEzE,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,GAAG;IACjB;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,SAAkB;QAC5B,QAAQ,EAAE,OAAgB;QAC1B,OAAO,EAAE,6EAA6E;QACtF,UAAU,EAAE,0BAA0B;QACtC,MAAM,EAAE,cAAc;KACvB;IACD;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,OAAgB;QAC1B,QAAQ,EAAE,KAAc;QACxB,OAAO,EAAE,oEAAoE;QAC7E,UAAU,EAAE,yBAAyB;QACrC,MAAM,EAAE,aAAa;KACtB;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,MAAe;QACzB,QAAQ,EAAE,gBAAyB;QACnC,OAAO,EAAE,yDAAyD;QAClE,UAAU,EAAE,uDAAuD;QACnE,MAAM,EAAE,sBAAsB;KAC/B;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,SAAkB;QAC5B,QAAQ,EAAE,aAAsB;QAChC,OAAO,EAAE,sCAAsC;QAC/C,UAAU,EAAE,wCAAwC;QACpD,MAAM,EAAE,6BAA6B;KACtC;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,OAAgB;QAC1B,QAAQ,EAAE,wBAAiC;QAC3C,OAAO,EAAE,qCAAqC;QAC9C,UAAU,EAAE,gDAAgD;QAC5D,MAAM,EAAE,4BAA4B;KACrC;CACF,CAAC;AAEF,MAAM,WAAW;IACf,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,QAAgB;QACzC,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QAExB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;QACjD,CAAC;QAED,OAAO;YACL,WAAW,EAAE,iBAAiB,EAAE;YAChC,YAAY,EAAE,iBAAiB,EAAE;YACjC,SAAS,EAAE,IAAI;YACf,IAAI,EAAE;gBACJ,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;gBACrD,KAAK;gBACL,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;aAC1B;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,QAAgB;QAC1C,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QAExB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,wCAAwC,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,KAAK,KAAK,sBAAsB,EAAE,CAAC;YACrC,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;QACtD,CAAC;QAED,OAAO;YACL,WAAW,EAAE,iBAAiB,EAAE;YAChC,YAAY,EAAE,iBAAiB,EAAE;YACjC,SAAS,EAAE,IAAI;YACf,IAAI,EAAE;gBACJ,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;gBACrD,KAAK;gBACL,IAAI,EAAE,EAAE;aACT;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,YAAoB;QAChC,MAAM,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAE5B,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;QACnD,CAAC;QAED,OAAO;YACL,WAAW,EAAE,iBAAiB,EAAE;YAChC,YAAY,EAAE,iBAAiB,EAAE;YACjC,SAAS,EAAE,IAAI;YACf,IAAI,EAAE;gBACJ,EAAE,EAAE,WAAW;gBACf,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,CAAC,OAAO,CAAC;aAChB;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,YAAoB;QAC/B,MAAM,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,YAAoB;QACxC,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,WAAW,GAAG,iBAAiB,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAE5B,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1B,CAAC;QAED,OAAO;YACL,KAAK,EAAE,IAAI;YACX,IAAI,EAAE;gBACJ,EAAE,EAAE,WAAW;gBACf,KAAK,EAAE,eAAe;gBACtB,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;aAC1B;SACF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,aAAa;IACjB,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,YAAoB,EAAE,OAAsB;QACtE,MAAM,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAE5B,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAClF,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAEvD,OAAO;YACL,OAAO,EAAE,SAAS,UAAU,SAAS,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,SAAS,QAAQ,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChH,MAAM,EAAE,cAAc;YACtB,aAAa,EAAE,SAAS;YACxB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI;SAClD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,IAAY,EACZ,WAAmB,EACnB,MAAqB,EACrB,QAAqB;QAErB,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,yBAAyB,CAC7B,YAAoB,EACpB,MAA+H;QAE/H,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QAExB,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,+CAA+C,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,KAAc,EAAwB,EAAE;YAC1D,IAAI,CAAC,KAAK;gBAAE,OAAO,SAAS,CAAC;YAC7B,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/D,CAAC,CAAC;QAEF,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3C,MAAM,eAAe,GAAG,CAAC,eAAe,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrF,MAAM,eAAe,GAAG,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzG,OAAO,eAAe,IAAI,eAAe,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,KAAK,UAAU;YAC3C,CAAC,CAAC,CAAC,mCAAmC,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACnI,CAAC,CAAC,SAAS,CAAC;QAEd,OAAO;YACL,OAAO,EAAE,iCAAiC;YAC1C,WAAW;YACX,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE,UAAU;YACpB,QAAQ;YACR,cAAc,EAAE,MAAM;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,WAAmB;QAClD,MAAM,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAE5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhC,IAAI,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAExC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;YAClC,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,CAAC;QAED,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEnC,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAEvD,OAAO;YACL,OAAO,EAAE,SAAS,UAAU,SAAS,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,SAAS,QAAQ,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChH,MAAM,EAAE,cAAc;YACtB,aAAa,EAAE,SAAS;YACxB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI;YACjD,SAAS,EAAE;gBACT,WAAW,EAAE,KAAK,CAAC,KAAK;gBACxB,YAAY,EAAE,CAAC;gBACf,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;aAChD;SACF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,aAAa;IACjB,KAAK,CAAC,GAAG,CAAC,YAAoB,EAAE,GAAY,EAAE,KAAc;QAC1D,MAAM,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAE5B,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE;gBACL,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,IAAI;gBACX,aAAa,EAAE,IAAI;aACpB;YACD,MAAM,EAAE,CAAC,iBAAiB,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC;YAChE,WAAW,EAAE,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;SACrD,CAAC;IACJ,CAAC;CACF;AAED,MAAM,YAAY;IAChB,KAAK,CAAC,SAAS,CAAC,WAAmB;QACjC,MAAM,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAE5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7D,OAAO;YACL,WAAW;YACX,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE;YACjC,SAAS,EAAE,KAAK,IAAI,CAAC;SACtB,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,OAAO;IAClB,IAAI,GAAa,IAAI,WAAW,EAAE,CAAC;IACnC,MAAM,GAAe,IAAI,aAAa,EAAE,CAAC;IACzC,MAAM,GAAe,IAAI,aAAa,EAAE,CAAC;IACzC,KAAK,GAAc,IAAI,YAAY,EAAE,CAAC;CACvC"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Telemetry Service - Analytics via Kodus API
|
|
3
|
-
*
|
|
4
|
-
* Security:
|
|
5
|
-
* - Does NOT expose PostHog API key to users
|
|
6
|
-
* - Sends events to Kodus API which forwards to PostHog
|
|
7
|
-
* - API key stays secure on the server
|
|
8
|
-
*
|
|
9
|
-
* Features:
|
|
10
|
-
* - User can opt-out via `kodus telemetry disable`
|
|
11
|
-
* - Anonymous user ID (machine ID hash)
|
|
12
|
-
* - No sensitive data (file names, code, etc)
|
|
13
|
-
* - Graceful degradation (never breaks the CLI)
|
|
14
|
-
*/
|
|
15
|
-
declare class TelemetryService {
|
|
16
|
-
private userId;
|
|
17
|
-
private enabled;
|
|
18
|
-
private configPath;
|
|
19
|
-
private apiUrl;
|
|
20
|
-
constructor();
|
|
21
|
-
private initialize;
|
|
22
|
-
/**
|
|
23
|
-
* Get anonymous user ID (machine ID)
|
|
24
|
-
*/
|
|
25
|
-
private getUserId;
|
|
26
|
-
/**
|
|
27
|
-
* Check if telemetry is enabled
|
|
28
|
-
*/
|
|
29
|
-
private isEnabled;
|
|
30
|
-
/**
|
|
31
|
-
* Read telemetry config
|
|
32
|
-
*/
|
|
33
|
-
private readConfig;
|
|
34
|
-
/**
|
|
35
|
-
* Write telemetry config
|
|
36
|
-
*/
|
|
37
|
-
private writeConfig;
|
|
38
|
-
/**
|
|
39
|
-
* Track an event
|
|
40
|
-
*/
|
|
41
|
-
track(eventName: string, properties?: Record<string, any>): Promise<void>;
|
|
42
|
-
/**
|
|
43
|
-
* Send event to Kodus API
|
|
44
|
-
*/
|
|
45
|
-
private sendEvent;
|
|
46
|
-
/**
|
|
47
|
-
* Sanitize properties to remove sensitive data
|
|
48
|
-
*/
|
|
49
|
-
private sanitizeProperties;
|
|
50
|
-
/**
|
|
51
|
-
* Enable telemetry
|
|
52
|
-
*/
|
|
53
|
-
enable(): Promise<void>;
|
|
54
|
-
/**
|
|
55
|
-
* Disable telemetry (opt-out)
|
|
56
|
-
*/
|
|
57
|
-
disable(): Promise<void>;
|
|
58
|
-
/**
|
|
59
|
-
* Check if telemetry is currently enabled
|
|
60
|
-
*/
|
|
61
|
-
status(): Promise<boolean>;
|
|
62
|
-
/**
|
|
63
|
-
* Identify user (when authenticated)
|
|
64
|
-
*/
|
|
65
|
-
identify(userId: string, traits?: Record<string, any>): Promise<void>;
|
|
66
|
-
/**
|
|
67
|
-
* Shutdown (cleanup)
|
|
68
|
-
*/
|
|
69
|
-
shutdown(): Promise<void>;
|
|
70
|
-
}
|
|
71
|
-
export declare const telemetryService: TelemetryService;
|
|
72
|
-
export {};
|
|
73
|
-
//# sourceMappingURL=telemetry.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.service.d.ts","sourceRoot":"","sources":["../../src/services/telemetry.service.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;GAaG;AACH,cAAM,gBAAgB;IACpB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;;YAQT,UAAU;IAiBxB;;OAEG;YACW,SAAS;IAWvB;;OAEG;YACW,SAAS;IAevB;;OAEG;YACW,UAAU;IASxB;;OAEG;YACW,WAAW;IAUzB;;OAEG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B/E;;OAEG;YACW,SAAS;IA4BvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAM7B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3E;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
import machineId from 'node-machine-id';
|
|
2
|
-
import fs from 'fs/promises';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import os from 'os';
|
|
5
|
-
const { machineIdSync } = machineId;
|
|
6
|
-
/**
|
|
7
|
-
* Telemetry Service - Analytics via Kodus API
|
|
8
|
-
*
|
|
9
|
-
* Security:
|
|
10
|
-
* - Does NOT expose PostHog API key to users
|
|
11
|
-
* - Sends events to Kodus API which forwards to PostHog
|
|
12
|
-
* - API key stays secure on the server
|
|
13
|
-
*
|
|
14
|
-
* Features:
|
|
15
|
-
* - User can opt-out via `kodus telemetry disable`
|
|
16
|
-
* - Anonymous user ID (machine ID hash)
|
|
17
|
-
* - No sensitive data (file names, code, etc)
|
|
18
|
-
* - Graceful degradation (never breaks the CLI)
|
|
19
|
-
*/
|
|
20
|
-
class TelemetryService {
|
|
21
|
-
userId = null;
|
|
22
|
-
enabled = true;
|
|
23
|
-
configPath;
|
|
24
|
-
apiUrl;
|
|
25
|
-
constructor() {
|
|
26
|
-
this.configPath = path.join(os.homedir(), '.kodus', 'telemetry.json');
|
|
27
|
-
this.apiUrl = process.env.KODUS_API_URL || 'https://api.kodus.io';
|
|
28
|
-
this.initialize();
|
|
29
|
-
}
|
|
30
|
-
async initialize() {
|
|
31
|
-
try {
|
|
32
|
-
// Check if telemetry is enabled
|
|
33
|
-
this.enabled = await this.isEnabled();
|
|
34
|
-
if (!this.enabled) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
// Get or create anonymous user ID
|
|
38
|
-
this.userId = await this.getUserId();
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
// Silent fail - telemetry should never break the CLI
|
|
42
|
-
this.enabled = false;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Get anonymous user ID (machine ID)
|
|
47
|
-
*/
|
|
48
|
-
async getUserId() {
|
|
49
|
-
try {
|
|
50
|
-
// Use machine ID for consistent anonymous tracking
|
|
51
|
-
const machineId = machineIdSync();
|
|
52
|
-
return `anon_${machineId}`;
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
// Fallback to random ID
|
|
56
|
-
return `anon_${Math.random().toString(36).substring(7)}`;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Check if telemetry is enabled
|
|
61
|
-
*/
|
|
62
|
-
async isEnabled() {
|
|
63
|
-
try {
|
|
64
|
-
// Check env var first
|
|
65
|
-
if (process.env.KODUS_TELEMETRY === 'false' || process.env.DO_NOT_TRACK === '1') {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
// Check config file
|
|
69
|
-
const config = await this.readConfig();
|
|
70
|
-
return config.enabled !== false; // Enabled by default
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
return true; // Default to enabled
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Read telemetry config
|
|
78
|
-
*/
|
|
79
|
-
async readConfig() {
|
|
80
|
-
try {
|
|
81
|
-
const content = await fs.readFile(this.configPath, 'utf-8');
|
|
82
|
-
return JSON.parse(content);
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
return { enabled: true };
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Write telemetry config
|
|
90
|
-
*/
|
|
91
|
-
async writeConfig(config) {
|
|
92
|
-
try {
|
|
93
|
-
const dir = path.dirname(this.configPath);
|
|
94
|
-
await fs.mkdir(dir, { recursive: true });
|
|
95
|
-
await fs.writeFile(this.configPath, JSON.stringify(config, null, 2));
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
// Silent fail
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Track an event
|
|
103
|
-
*/
|
|
104
|
-
async track(eventName, properties) {
|
|
105
|
-
if (!this.enabled || !this.userId) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
try {
|
|
109
|
-
// Add common properties
|
|
110
|
-
const enrichedProperties = {
|
|
111
|
-
...properties,
|
|
112
|
-
cli_version: '0.1.0',
|
|
113
|
-
node_version: process.version,
|
|
114
|
-
platform: process.platform,
|
|
115
|
-
arch: process.arch,
|
|
116
|
-
timestamp: new Date().toISOString(),
|
|
117
|
-
};
|
|
118
|
-
// Remove any potentially sensitive data
|
|
119
|
-
const sanitized = this.sanitizeProperties(enrichedProperties);
|
|
120
|
-
// Send to Kodus API (which forwards to PostHog securely)
|
|
121
|
-
await this.sendEvent({
|
|
122
|
-
distinctId: this.userId,
|
|
123
|
-
event: eventName,
|
|
124
|
-
properties: sanitized,
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
// Silent fail - telemetry should never break the CLI
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Send event to Kodus API
|
|
133
|
-
*/
|
|
134
|
-
async sendEvent(payload) {
|
|
135
|
-
try {
|
|
136
|
-
const response = await fetch(`${this.apiUrl}/v1/telemetry/events`, {
|
|
137
|
-
method: 'POST',
|
|
138
|
-
headers: {
|
|
139
|
-
'Content-Type': 'application/json',
|
|
140
|
-
},
|
|
141
|
-
body: JSON.stringify(payload),
|
|
142
|
-
});
|
|
143
|
-
// Don't throw on failure - telemetry is best-effort
|
|
144
|
-
if (!response.ok) {
|
|
145
|
-
if (process.env.KODUS_VERBOSE) {
|
|
146
|
-
console.error('Telemetry event failed:', response.statusText);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
// Silent fail
|
|
152
|
-
if (process.env.KODUS_VERBOSE) {
|
|
153
|
-
console.error('Telemetry error:', error);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Sanitize properties to remove sensitive data
|
|
159
|
-
*/
|
|
160
|
-
sanitizeProperties(properties) {
|
|
161
|
-
const sanitized = {};
|
|
162
|
-
for (const [key, value] of Object.entries(properties)) {
|
|
163
|
-
// Skip potentially sensitive keys
|
|
164
|
-
if (key.toLowerCase().includes('password') ||
|
|
165
|
-
key.toLowerCase().includes('token') ||
|
|
166
|
-
key.toLowerCase().includes('secret') ||
|
|
167
|
-
key.toLowerCase().includes('key')) {
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
// Sanitize file paths (keep only basename)
|
|
171
|
-
if (typeof value === 'string' && (value.includes('/') || value.includes('\\'))) {
|
|
172
|
-
sanitized[key] = path.basename(value);
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
sanitized[key] = value;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return sanitized;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Enable telemetry
|
|
182
|
-
*/
|
|
183
|
-
async enable() {
|
|
184
|
-
await this.writeConfig({ enabled: true });
|
|
185
|
-
this.enabled = true;
|
|
186
|
-
await this.initialize();
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Disable telemetry (opt-out)
|
|
190
|
-
*/
|
|
191
|
-
async disable() {
|
|
192
|
-
await this.writeConfig({ enabled: false });
|
|
193
|
-
this.enabled = false;
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Check if telemetry is currently enabled
|
|
197
|
-
*/
|
|
198
|
-
async status() {
|
|
199
|
-
return this.enabled;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Identify user (when authenticated)
|
|
203
|
-
*/
|
|
204
|
-
async identify(userId, traits) {
|
|
205
|
-
if (!this.enabled) {
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
try {
|
|
209
|
-
await this.sendEvent({
|
|
210
|
-
distinctId: userId,
|
|
211
|
-
event: '$identify',
|
|
212
|
-
properties: {
|
|
213
|
-
$set: traits,
|
|
214
|
-
},
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
catch {
|
|
218
|
-
// Silent fail
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Shutdown (cleanup)
|
|
223
|
-
*/
|
|
224
|
-
async shutdown() {
|
|
225
|
-
// No cleanup needed with HTTP-based telemetry
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
export const telemetryService = new TelemetryService();
|
|
229
|
-
//# sourceMappingURL=telemetry.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.service.js","sourceRoot":"","sources":["../../src/services/telemetry.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { Ora } from 'ora';
|
|
2
|
-
export interface DiffMetrics {
|
|
3
|
-
files: number;
|
|
4
|
-
lines: number;
|
|
5
|
-
additions: number;
|
|
6
|
-
deletions: number;
|
|
7
|
-
chars: number;
|
|
8
|
-
}
|
|
9
|
-
export interface ReviewLoadingFlags {
|
|
10
|
-
fast?: boolean;
|
|
11
|
-
rulesOnly?: boolean;
|
|
12
|
-
isTrial?: boolean;
|
|
13
|
-
}
|
|
14
|
-
export declare function getDiffMetrics(diff: string): DiffMetrics;
|
|
15
|
-
export declare function startReviewLoadingMessages(spinner: Ora, metrics: DiffMetrics, flags: ReviewLoadingFlags, options?: {
|
|
16
|
-
intervalMs?: number;
|
|
17
|
-
initialMessage?: string;
|
|
18
|
-
}): () => void;
|
|
19
|
-
//# sourceMappingURL=review-loading.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-loading.d.ts","sourceRoot":"","sources":["../../src/utils/review-loading.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA2CD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CA6BxD;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,MAAM,IAAI,CAkBZ"}
|