@principles/core 1.177.2 → 1.177.4

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.
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Redact Sensitive Tests — Feedback Pipeline Privacy Guards
3
+ *
4
+ * Tests the privacy-preserving redaction helpers used by the feedback pipeline.
5
+ * These functions handle sensitive data (tokens, paths, env vars) and must be
6
+ * thoroughly tested to prevent data leaks.
7
+ *
8
+ * ERR checklist:
9
+ * - ERR-001: no `as` casts on untrusted values
10
+ * - ERR-002: never throws; returns safe fallbacks
11
+ * - ERR-003: segment-exact key matching (no substring matches)
12
+ * - ERR-014/016: bounded output
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=redact-sensitive.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact-sensitive.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/feedback/__tests__/redact-sensitive.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,450 @@
1
+ /**
2
+ * Redact Sensitive Tests — Feedback Pipeline Privacy Guards
3
+ *
4
+ * Tests the privacy-preserving redaction helpers used by the feedback pipeline.
5
+ * These functions handle sensitive data (tokens, paths, env vars) and must be
6
+ * thoroughly tested to prevent data leaks.
7
+ *
8
+ * ERR checklist:
9
+ * - ERR-001: no `as` casts on untrusted values
10
+ * - ERR-002: never throws; returns safe fallbacks
11
+ * - ERR-003: segment-exact key matching (no substring matches)
12
+ * - ERR-014/016: bounded output
13
+ */
14
+ import { describe, it, expect } from 'vitest';
15
+ import { redactAbsolutePaths, redactTokenLikeValues, redactEnvLikeValues, redactTelemetryString, redactStackTrace, redactSensitiveFields, REDACTED_PATH, REDACTED_VALUE, NO_STACK, } from '../redact-sensitive.js';
16
+ // ── redactAbsolutePaths ─────────────────────────────────────────────────────
17
+ describe('redactAbsolutePaths', () => {
18
+ it('redacts Windows absolute paths', () => {
19
+ const input = 'Error at C:\\Users\\alice\\project\\src\\index.ts:42';
20
+ const result = redactAbsolutePaths(input);
21
+ expect(result).toBe(`Error at ${REDACTED_PATH}:42`);
22
+ });
23
+ it('redacts multiple Windows paths', () => {
24
+ const input = 'Paths: C:\\foo\\bar and D:\\test\\file.txt';
25
+ const result = redactAbsolutePaths(input);
26
+ expect(result).toBe(`Paths: ${REDACTED_PATH} and ${REDACTED_PATH}`);
27
+ });
28
+ it('redacts POSIX absolute paths', () => {
29
+ const input = 'Error at /home/alice/project/src/index.ts:42';
30
+ const result = redactAbsolutePaths(input);
31
+ expect(result).toBe(`Error at ${REDACTED_PATH}:42`);
32
+ });
33
+ it('redacts /usr paths', () => {
34
+ const input = 'Config: /usr/local/bin/node';
35
+ const result = redactAbsolutePaths(input);
36
+ expect(result).toBe(`Config: ${REDACTED_PATH}`);
37
+ });
38
+ it('redacts /Users paths (macOS)', () => {
39
+ const input = 'File: /Users/wesley/Documents/test.txt';
40
+ const result = redactAbsolutePaths(input);
41
+ expect(result).toBe(`File: ${REDACTED_PATH}`);
42
+ });
43
+ it('preserves relative paths', () => {
44
+ const input = './src/index.ts and ../lib/utils.js';
45
+ const result = redactAbsolutePaths(input);
46
+ expect(result).toBe('./src/index.ts and ../lib/utils.js');
47
+ });
48
+ it('preserves URL paths', () => {
49
+ const input = 'https://example.com/path/to/resource';
50
+ const result = redactAbsolutePaths(input);
51
+ expect(result).toBe('https://example.com/path/to/resource');
52
+ });
53
+ it('returns non-string input unchanged', () => {
54
+ // @ts-expect-error - testing non-string input for runtime type guard
55
+ expect(redactAbsolutePaths(null)).toBe(null);
56
+ // @ts-expect-error - testing non-string input for runtime type guard
57
+ expect(redactAbsolutePaths(undefined)).toBe(undefined);
58
+ // @ts-expect-error - testing non-string input for runtime type guard
59
+ expect(redactAbsolutePaths(42)).toBe(42);
60
+ });
61
+ it('handles empty string', () => {
62
+ expect(redactAbsolutePaths('')).toBe('');
63
+ });
64
+ it('handles string without paths', () => {
65
+ expect(redactAbsolutePaths('no paths here')).toBe('no paths here');
66
+ });
67
+ });
68
+ // ── redactTokenLikeValues ────────────────────────────────────────────────────
69
+ describe('redactTokenLikeValues', () => {
70
+ it('redacts OpenAI tokens (sk-)', () => {
71
+ const input = 'Using sk-proj-abc123def456ghi789jkl012mno345pqr678';
72
+ const result = redactTokenLikeValues(input);
73
+ expect(result).toBe(`Using ${REDACTED_VALUE}`);
74
+ });
75
+ it('redacts OpenAI ant tokens (sk-ant-)', () => {
76
+ const input = 'Key: sk-ant-api03-abc123def456ghi789jkl012mno345pqr678stu901vwx234yz';
77
+ const result = redactTokenLikeValues(input);
78
+ expect(result).toBe(`Key: ${REDACTED_VALUE}`);
79
+ });
80
+ it('redacts GitHub tokens (ghp_, gho_, ghu_, ghs_, ghr_)', () => {
81
+ const input = 'ghp_abc123def456ghi789jkl012mno345pqr678stu';
82
+ const result = redactTokenLikeValues(input);
83
+ expect(result).toBe(REDACTED_VALUE);
84
+ });
85
+ it('redacts Linear tokens (lin_api_)', () => {
86
+ const input = 'lin_api_abc123def456ghi789jkl012mno345pqr678stu';
87
+ const result = redactTokenLikeValues(input);
88
+ expect(result).toBe(REDACTED_VALUE);
89
+ });
90
+ it('redacts Authorization header values', () => {
91
+ const input = 'Authorization: Bearer secret-token-12345';
92
+ const result = redactTokenLikeValues(input);
93
+ expect(result).toBe(`Authorization: Bearer ${REDACTED_VALUE}`);
94
+ });
95
+ it('redacts Authorization header with quotes', () => {
96
+ const input = 'Authorization: "Basic dXNlcjpwYXNz"';
97
+ const result = redactTokenLikeValues(input);
98
+ expect(result).toContain(REDACTED_VALUE);
99
+ });
100
+ it('redacts generic key assignments', () => {
101
+ const input = 'api_key=secret123 token=abc456 password=pass789';
102
+ const result = redactTokenLikeValues(input);
103
+ expect(result).toBe(`api_key=${REDACTED_VALUE} token=${REDACTED_VALUE} password=${REDACTED_VALUE}`);
104
+ });
105
+ it('redacts Bearer tokens', () => {
106
+ const input = 'Bearer abc123def456ghi789jkl012mno345pqr678stu901vwx234yz567';
107
+ const result = redactTokenLikeValues(input);
108
+ expect(result).toBe(REDACTED_VALUE);
109
+ });
110
+ it('preserves non-token strings', () => {
111
+ const input = 'normal text without tokens';
112
+ const result = redactTokenLikeValues(input);
113
+ expect(result).toBe('normal text without tokens');
114
+ });
115
+ it('returns non-string input unchanged', () => {
116
+ // @ts-expect-error - testing non-string input for runtime type guard
117
+ expect(redactTokenLikeValues(null)).toBe(null);
118
+ });
119
+ it('handles empty string', () => {
120
+ expect(redactTokenLikeValues('')).toBe('');
121
+ });
122
+ });
123
+ // ── redactEnvLikeValues ──────────────────────────────────────────────────────
124
+ describe('redactEnvLikeValues', () => {
125
+ it('redacts KEY=value assignments', () => {
126
+ const input = 'API_KEY=secret123';
127
+ const result = redactEnvLikeValues(input);
128
+ expect(result).toBe(`API_KEY=${REDACTED_VALUE}`);
129
+ });
130
+ it('redacts KEY="value with spaces"', () => {
131
+ const input = 'SECRET="value with spaces"';
132
+ const result = redactEnvLikeValues(input);
133
+ expect(result).toBe(`SECRET=${REDACTED_VALUE}`);
134
+ });
135
+ it('redacts KEY=\'value\' (single quotes)', () => {
136
+ const input = 'TOKEN=\'abc123\'';
137
+ const result = redactEnvLikeValues(input);
138
+ expect(result).toBe(`TOKEN=${REDACTED_VALUE}`);
139
+ });
140
+ it('redacts multiple env assignments', () => {
141
+ const input = 'API_KEY=secret1 SECRET=secret2 TOKEN=secret3';
142
+ const result = redactEnvLikeValues(input);
143
+ expect(result).toBe(`API_KEY=${REDACTED_VALUE} SECRET=${REDACTED_VALUE} TOKEN=${REDACTED_VALUE}`);
144
+ });
145
+ it('preserves lowercase key assignments', () => {
146
+ const input = 'name=value';
147
+ const result = redactEnvLikeValues(input);
148
+ expect(result).toBe('name=value');
149
+ });
150
+ it('preserves short key names (< 3 chars)', () => {
151
+ const input = 'AB=value';
152
+ const result = redactEnvLikeValues(input);
153
+ expect(result).toBe('AB=value');
154
+ });
155
+ it('returns non-string input unchanged', () => {
156
+ // @ts-expect-error - testing non-string input for runtime type guard
157
+ expect(redactEnvLikeValues(null)).toBe(null);
158
+ });
159
+ it('handles empty string', () => {
160
+ expect(redactEnvLikeValues('')).toBe('');
161
+ });
162
+ });
163
+ // ── redactTelemetryString ────────────────────────────────────────────────────
164
+ describe('redactTelemetryString', () => {
165
+ it('combines all redactors', () => {
166
+ const input = 'Path: /home/alice/secret Token: sk-abc123def456ghi789jkl012mno345pqr678 Env: API_KEY=secret';
167
+ const result = redactTelemetryString(input);
168
+ expect(result).toBe(`Path: ${REDACTED_PATH} Token=${REDACTED_VALUE} Env: API_KEY=${REDACTED_VALUE}`);
169
+ });
170
+ it('returns non-string input unchanged', () => {
171
+ expect(redactTelemetryString(null)).toBe(null);
172
+ expect(redactTelemetryString(undefined)).toBe(undefined);
173
+ expect(redactTelemetryString(42)).toBe(42);
174
+ });
175
+ it('handles empty string', () => {
176
+ expect(redactTelemetryString('')).toBe('');
177
+ });
178
+ it('handles string without sensitive data', () => {
179
+ expect(redactTelemetryString('normal text')).toBe('normal text');
180
+ });
181
+ });
182
+ // ── redactStackTrace ──────────────────────────────────────────────────────────
183
+ describe('redactStackTrace', () => {
184
+ it('returns NO_STACK for empty string', () => {
185
+ expect(redactStackTrace('')).toBe(NO_STACK);
186
+ });
187
+ it('returns NO_STACK for non-string', () => {
188
+ // @ts-expect-error - testing non-string input for runtime type guard
189
+ expect(redactStackTrace(null)).toBe(NO_STACK);
190
+ });
191
+ it('preserves error name and first 3 frames by default', () => {
192
+ const stack = `Error: Something went wrong
193
+ at foo (/home/alice/project/src/index.ts:10)
194
+ at bar (/home/alice/project/src/utils.ts:20)
195
+ at baz (/home/alice/project/src/main.ts:30)
196
+ at qux (/home/alice/project/src/extra.ts:40)`;
197
+ const result = redactStackTrace(stack);
198
+ expect(result).toContain('Error: Something went wrong');
199
+ expect(result).toContain(REDACTED_PATH);
200
+ expect(result).not.toContain('/home/alice');
201
+ // Should only have 3 frames
202
+ const frameCount = (result.match(/at\s+/g) || []).length;
203
+ expect(frameCount).toBe(3);
204
+ });
205
+ it('respects custom maxFrames', () => {
206
+ const stack = `Error: Test
207
+ at frame1 (/usr/local/bin/test.ts:1)
208
+ at frame2 (/usr/local/bin/test.ts:2)
209
+ at frame3 (/usr/local/bin/test.ts:3)
210
+ at frame4 (/usr/local/bin/test.ts:4)`;
211
+ const result = redactStackTrace(stack, 2);
212
+ const frameCount = (result.match(/at\s+/g) || []).length;
213
+ expect(frameCount).toBe(2);
214
+ });
215
+ it('redacts Windows paths in stack frames', () => {
216
+ const stack = `Error: Test
217
+ at foo (C:\\Users\\alice\\project\\src\\index.ts:10)`;
218
+ const result = redactStackTrace(stack);
219
+ expect(result).toContain(REDACTED_PATH);
220
+ expect(result).not.toContain('C:\\Users');
221
+ });
222
+ it('handles stack with only error name', () => {
223
+ const stack = 'Error: Something went wrong';
224
+ const result = redactStackTrace(stack);
225
+ expect(result).toBe('Error: Something went wrong');
226
+ });
227
+ });
228
+ // ── redactSensitiveFields ────────────────────────────────────────────────────
229
+ describe('redactSensitiveFields', () => {
230
+ it('returns error for null input', () => {
231
+ const result = redactSensitiveFields(null);
232
+ expect(result.ok).toBe(false);
233
+ if (!result.ok) {
234
+ expect(result.error).toContain('null');
235
+ }
236
+ });
237
+ it('returns error for undefined input', () => {
238
+ const result = redactSensitiveFields(undefined);
239
+ expect(result.ok).toBe(false);
240
+ if (!result.ok) {
241
+ expect(result.error).toContain('undefined');
242
+ }
243
+ });
244
+ it('returns error for primitive input', () => {
245
+ const result = redactSensitiveFields('string');
246
+ expect(result.ok).toBe(false);
247
+ if (!result.ok) {
248
+ expect(result.error).toContain('must be an object or array');
249
+ }
250
+ });
251
+ it('returns error for number input', () => {
252
+ const result = redactSensitiveFields(42);
253
+ expect(result.ok).toBe(false);
254
+ if (!result.ok) {
255
+ expect(result.error).toContain('must be an object or array');
256
+ }
257
+ });
258
+ it('redacts password field', () => {
259
+ const obj = { username: 'alice', password: 'secret123' };
260
+ const result = redactSensitiveFields(obj);
261
+ expect(result.ok).toBe(true);
262
+ if (result.ok) {
263
+ expect(result.value).toEqual({ username: 'alice', password: REDACTED_VALUE });
264
+ expect(result.notes).toContain('field "password" redacted');
265
+ }
266
+ });
267
+ it('redacts token field', () => {
268
+ const obj = { id: 1, token: 'abc123' };
269
+ const result = redactSensitiveFields(obj);
270
+ expect(result.ok).toBe(true);
271
+ if (result.ok) {
272
+ expect(result.value).toEqual({ id: 1, token: REDACTED_VALUE });
273
+ }
274
+ });
275
+ it('redacts api_key field', () => {
276
+ const obj = { name: 'test', api_key: 'key123' };
277
+ const result = redactSensitiveFields(obj);
278
+ expect(result.ok).toBe(true);
279
+ if (result.ok) {
280
+ expect(result.value).toEqual({ name: 'test', api_key: REDACTED_VALUE });
281
+ }
282
+ });
283
+ it('redacts authorization field', () => {
284
+ const obj = { method: 'GET', authorization: 'Bearer secret' };
285
+ const result = redactSensitiveFields(obj);
286
+ expect(result.ok).toBe(true);
287
+ if (result.ok) {
288
+ expect(result.value).toEqual({ method: 'GET', authorization: REDACTED_VALUE });
289
+ }
290
+ });
291
+ it('redacts auth_token field', () => {
292
+ const obj = { user: 'bob', auth_token: 'token123' };
293
+ const result = redactSensitiveFields(obj);
294
+ expect(result.ok).toBe(true);
295
+ if (result.ok) {
296
+ expect(result.value).toEqual({ user: 'bob', auth_token: REDACTED_VALUE });
297
+ }
298
+ });
299
+ it('redacts secret field', () => {
300
+ const obj = { config: 'value', secret: 'hidden' };
301
+ const result = redactSensitiveFields(obj);
302
+ expect(result.ok).toBe(true);
303
+ if (result.ok) {
304
+ expect(result.value).toEqual({ config: 'value', secret: REDACTED_VALUE });
305
+ }
306
+ });
307
+ it('redacts credentials field', () => {
308
+ const obj = { service: 'api', credentials: { user: 'admin', pass: '123' } };
309
+ const result = redactSensitiveFields(obj);
310
+ expect(result.ok).toBe(true);
311
+ if (result.ok) {
312
+ expect(result.value.credentials).toBe(REDACTED_VALUE);
313
+ }
314
+ });
315
+ it('redacts private_key field', () => {
316
+ const obj = { id: 'key1', private_key: '-----BEGIN RSA PRIVATE KEY-----' };
317
+ const result = redactSensitiveFields(obj);
318
+ expect(result.ok).toBe(true);
319
+ if (result.ok) {
320
+ expect(result.value).toEqual({ id: 'key1', private_key: REDACTED_VALUE });
321
+ }
322
+ });
323
+ it('redacts nested sensitive fields', () => {
324
+ const obj = { config: { database: { password: 'dbpass' } } };
325
+ const result = redactSensitiveFields(obj);
326
+ expect(result.ok).toBe(true);
327
+ if (result.ok) {
328
+ const config = result.value.config;
329
+ const db = config.database;
330
+ expect(db.password).toBe(REDACTED_VALUE);
331
+ }
332
+ });
333
+ it('handles arrays', () => {
334
+ const arr = [{ user: 'alice', password: 'pass1' }, { user: 'bob', password: 'pass2' }];
335
+ const result = redactSensitiveFields(arr);
336
+ expect(result.ok).toBe(true);
337
+ if (result.ok) {
338
+ const value = result.value;
339
+ expect(value[0]?.password).toBe(REDACTED_VALUE);
340
+ expect(value[1]?.password).toBe(REDACTED_VALUE);
341
+ }
342
+ });
343
+ it('handles circular references', () => {
344
+ const obj = { name: 'test' };
345
+ obj.self = obj;
346
+ const result = redactSensitiveFields(obj);
347
+ expect(result.ok).toBe(true);
348
+ if (result.ok) {
349
+ expect(result.value.self).toBe('<circular>');
350
+ expect(result.notes.some(n => n.includes('circular'))).toBe(true);
351
+ }
352
+ });
353
+ it('handles deep nesting (depth limit)', () => {
354
+ const deep = { level1: { level2: { level3: { level4: { level5: { level6: { level7: 'deep' } } } } } } };
355
+ const result = redactSensitiveFields(deep);
356
+ expect(result.ok).toBe(true);
357
+ if (result.ok) {
358
+ // Should hit depth limit at level 6
359
+ const value = result.value;
360
+ expect(value).toBeDefined();
361
+ }
362
+ });
363
+ it('truncates long strings', () => {
364
+ const longString = 'a'.repeat(3000);
365
+ const obj = { data: longString };
366
+ const result = redactSensitiveFields(obj);
367
+ expect(result.ok).toBe(true);
368
+ if (result.ok) {
369
+ const value = result.value.data;
370
+ expect(value.length).toBeLessThanOrEqual(2001); // 2000 + '…'
371
+ expect(value.endsWith('…')).toBe(true);
372
+ }
373
+ });
374
+ it('redacts paths in string values', () => {
375
+ const obj = { cwd: '/home/alice/project', message: 'Error at /usr/local/bin' };
376
+ const result = redactSensitiveFields(obj);
377
+ expect(result.ok).toBe(true);
378
+ if (result.ok) {
379
+ const value = result.value;
380
+ expect(value.cwd).toBe(REDACTED_PATH);
381
+ expect(value.message.includes(REDACTED_PATH)).toBe(true);
382
+ }
383
+ });
384
+ it('redacts tokens in string values', () => {
385
+ const obj = { buildId: 'sk-abc123def456ghi789jkl012mno345pqr678' };
386
+ const result = redactSensitiveFields(obj);
387
+ expect(result.ok).toBe(true);
388
+ if (result.ok) {
389
+ const value = result.value;
390
+ expect(value.buildId).toBe(REDACTED_VALUE);
391
+ }
392
+ });
393
+ it('preserves non-sensitive fields', () => {
394
+ const obj = { name: 'test', count: 42, enabled: true, data: null };
395
+ const result = redactSensitiveFields(obj);
396
+ expect(result.ok).toBe(true);
397
+ if (result.ok) {
398
+ expect(result.value).toEqual({ name: 'test', count: 42, enabled: true, data: null });
399
+ }
400
+ });
401
+ it('handles BigInt values', () => {
402
+ const obj = { big: BigInt('12345678901234567890') };
403
+ const result = redactSensitiveFields(obj);
404
+ expect(result.ok).toBe(true);
405
+ if (result.ok) {
406
+ const value = result.value.big;
407
+ expect(value).toContain('<bigint:');
408
+ }
409
+ });
410
+ // ERR-003: segment-exact matching (no substring matches)
411
+ it('does NOT redact "author" (substring of "auth")', () => {
412
+ const obj = { author: 'John Doe', auth: 'secret' };
413
+ const result = redactSensitiveFields(obj);
414
+ expect(result.ok).toBe(true);
415
+ if (result.ok) {
416
+ const value = result.value;
417
+ expect(value.author).toBe('John Doe'); // NOT redacted
418
+ expect(value.auth).toBe(REDACTED_VALUE); // redacted
419
+ }
420
+ });
421
+ it('does NOT redact "keynote" (substring of "key")', () => {
422
+ const obj = { keynote: 'presentation', key: 'secret' };
423
+ const result = redactSensitiveFields(obj);
424
+ expect(result.ok).toBe(true);
425
+ if (result.ok) {
426
+ const value = result.value;
427
+ expect(value.keynote).toBe('presentation'); // NOT redacted
428
+ expect(value.key).toBe(REDACTED_VALUE); // redacted
429
+ }
430
+ });
431
+ it('redacts composite key names like "github_token"', () => {
432
+ const obj = { github_token: 'ghp_abc123' };
433
+ const result = redactSensitiveFields(obj);
434
+ expect(result.ok).toBe(true);
435
+ if (result.ok) {
436
+ const value = result.value;
437
+ expect(value.github_token).toBe(REDACTED_VALUE);
438
+ }
439
+ });
440
+ it('redacts composite key names like "db_password"', () => {
441
+ const obj = { db_password: 'pass123' };
442
+ const result = redactSensitiveFields(obj);
443
+ expect(result.ok).toBe(true);
444
+ if (result.ok) {
445
+ const value = result.value;
446
+ expect(value.db_password).toBe(REDACTED_VALUE);
447
+ }
448
+ });
449
+ });
450
+ //# sourceMappingURL=redact-sensitive.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact-sensitive.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/feedback/__tests__/redact-sensitive.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Render GitHub URL Tests — Feedback Pipeline URL Builder
3
+ *
4
+ * Tests the GitHub issue draft URL builder with privacy-preserving redaction.
5
+ * This function is used to create feedback submission URLs.
6
+ *
7
+ * ERR checklist:
8
+ * - ERR-001/005: no `as FeedbackType` cast; use isFeedbackType validator
9
+ * - ERR-009/010: fail loud on invalid input
10
+ * - ERR-014/016: bounded body (MAX_URL_BODY_LENGTH)
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=render-github-url.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-github-url.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/feedback/__tests__/render-github-url.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}