@principles/core 1.98.0 → 1.99.0

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,21 @@
1
+ /**
2
+ * Evidence Sanitizer Tests — Core Package
3
+ *
4
+ * Direct tests for the shared evidence sanitizer module.
5
+ * This module is security-critical and used by both core and plugin packages.
6
+ *
7
+ * Tests verify:
8
+ * - Token redaction (sk-*, ghp_*, JWT, base64)
9
+ * - PD tag stripping
10
+ * - Path convergence (workspace-relative vs basename)
11
+ * - Recursive sanitization with depth/key/array limits
12
+ * - Platform-agnostic path handling (Windows/POSIX)
13
+ *
14
+ * ERR checklist:
15
+ * - ERR-001: No `as` casts — input is `unknown`, narrowed with typeof guards
16
+ * - ERR-055: ANY-segment sensitive field matching
17
+ * - ERR-056: Token redaction runs on ALL strings
18
+ * - EP-08: Platform-agnostic path basename
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=evidence-sanitizer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-sanitizer.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/evidence-sanitizer.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
@@ -0,0 +1,354 @@
1
+ /**
2
+ * Evidence Sanitizer Tests — Core Package
3
+ *
4
+ * Direct tests for the shared evidence sanitizer module.
5
+ * This module is security-critical and used by both core and plugin packages.
6
+ *
7
+ * Tests verify:
8
+ * - Token redaction (sk-*, ghp_*, JWT, base64)
9
+ * - PD tag stripping
10
+ * - Path convergence (workspace-relative vs basename)
11
+ * - Recursive sanitization with depth/key/array limits
12
+ * - Platform-agnostic path handling (Windows/POSIX)
13
+ *
14
+ * ERR checklist:
15
+ * - ERR-001: No `as` casts — input is `unknown`, narrowed with typeof guards
16
+ * - ERR-055: ANY-segment sensitive field matching
17
+ * - ERR-056: Token redaction runs on ALL strings
18
+ * - EP-08: Platform-agnostic path basename
19
+ */
20
+ import { describe, it, expect } from 'vitest';
21
+ import { sanitizeString, sanitizeValue, sanitizeToolParams, convergePath, MAX_EVIDENCE_VALUE_CHARS, } from '../evidence-sanitizer.js';
22
+ // ── convergePath ─────────────────────────────────────────────────────────────
23
+ describe('convergePath', () => {
24
+ it('returns relative path unchanged', () => {
25
+ expect(convergePath('src/index.ts')).toBe('src/index.ts');
26
+ expect(convergePath('./config.json')).toBe('./config.json');
27
+ });
28
+ it('returns basename for absolute path without workspaceDir', () => {
29
+ expect(convergePath('/home/user/secrets/token.json')).toBe('token.json');
30
+ expect(convergePath('D:\\Code\\secrets\\key.txt')).toBe('key.txt');
31
+ });
32
+ it('returns repo-relative for workspace-internal path', () => {
33
+ expect(convergePath('/workspace/my-repo/src/index.ts', '/workspace/my-repo')).toBe('src/index.ts');
34
+ expect(convergePath('D:\\Code\\principles\\src\\file.ts', 'D:\\Code\\principles')).toBe('src\\file.ts');
35
+ });
36
+ it('returns basename for workspace-external absolute path', () => {
37
+ expect(convergePath('/etc/passwd', '/workspace/my-repo')).toBe('passwd');
38
+ expect(convergePath('C:\\Windows\\System32\\config', '/workspace/my-repo')).toBe('config');
39
+ });
40
+ it('handles trailing separators in workspaceDir', () => {
41
+ expect(convergePath('/workspace/repo/src/file.ts', '/workspace/repo/')).toBe('src/file.ts');
42
+ });
43
+ it('handles Windows drive case-insensitivity', () => {
44
+ expect(convergePath('d:\\code\\repo\\src\\file.ts', 'D:\\Code\\repo')).toBe('src\\file.ts');
45
+ });
46
+ it('returns basename when workspaceDir matches exactly', () => {
47
+ // When the path equals workspaceDir, return basename
48
+ expect(convergePath('/workspace/repo', '/workspace/repo')).toBe('repo');
49
+ });
50
+ it('handles UNC paths', () => {
51
+ expect(convergePath('\\\\server\\share\\file.txt')).toBe('file.txt');
52
+ });
53
+ });
54
+ // ── sanitizeString ───────────────────────────────────────────────────────────
55
+ describe('sanitizeString', () => {
56
+ // ── Token redaction ──
57
+ it('redacts OpenAI-style keys (sk-*)', () => {
58
+ const token = 'sk-proj-' + 'a'.repeat(30);
59
+ const result = sanitizeString(`token is ${token}`);
60
+ expect(result).toContain('___REDACTED___');
61
+ expect(result).not.toContain(token);
62
+ });
63
+ it('redacts GitHub PATs (ghp_*)', () => {
64
+ const token = 'ghp_' + 'a'.repeat(40);
65
+ const result = sanitizeString(token);
66
+ expect(result).toContain('___REDACTED___');
67
+ expect(result).not.toContain(token);
68
+ });
69
+ it('redacts GitHub OAuth tokens (gho_*)', () => {
70
+ const token = 'gho_' + 'a'.repeat(40);
71
+ const result = sanitizeString(token);
72
+ expect(result).toContain('___REDACTED___');
73
+ });
74
+ it('redacts Slack tokens (xoxb-*)', () => {
75
+ const token = 'xoxb-' + 'a'.repeat(30);
76
+ const result = sanitizeString(token);
77
+ expect(result).toContain('___REDACTED___');
78
+ });
79
+ it('redacts JWT-like patterns (eyJ*)', () => {
80
+ const jwt = 'eyJ' + 'a'.repeat(30) + '.bc';
81
+ const result = sanitizeString(`Bearer ${jwt}`);
82
+ expect(result).toContain('___REDACTED___');
83
+ expect(result).not.toContain(jwt);
84
+ });
85
+ it('redacts long base64-like strings', () => {
86
+ const token = 'A'.repeat(50);
87
+ const result = sanitizeString(`hash: ${token}`);
88
+ expect(result).toContain('___REDACTED___');
89
+ expect(result).not.toContain(token);
90
+ });
91
+ it('preserves short strings without tokens', () => {
92
+ const result = sanitizeString('normal text without secrets');
93
+ expect(result).toBe('normal text without secrets');
94
+ });
95
+ // ── PD tag stripping ──
96
+ it('strips EMOTIONAL_DAMAGE_DETECTED tags', () => {
97
+ const result = sanitizeString('[EMOTIONAL_DAMAGE_DETECTED:severe] something went wrong');
98
+ expect(result).not.toContain('EMOTIONAL_DAMAGE_DETECTED');
99
+ expect(result).toContain('something went wrong');
100
+ });
101
+ it('strips EMPATHY_ROLLBACK_REQUEST tags', () => {
102
+ const result = sanitizeString('[EMPATHY_ROLLBACK_REQUEST] rollback needed');
103
+ expect(result).not.toContain('EMPATHY_ROLLBACK_REQUEST');
104
+ expect(result).toContain('rollback needed');
105
+ });
106
+ it('strips empathy XML tags', () => {
107
+ const result = sanitizeString('<empathy signal="damage" severity="moderate"/> text');
108
+ expect(result).not.toContain('<empathy');
109
+ expect(result).toContain('text');
110
+ });
111
+ // ── Path convergence ──
112
+ it('converges absolute paths in string without workspaceDir', () => {
113
+ const result = sanitizeString('error in /home/user/project/src/file.ts');
114
+ expect(result).not.toContain('/home/user/project');
115
+ expect(result).toContain('file.ts');
116
+ });
117
+ it('converges Windows absolute paths in string', () => {
118
+ const result = sanitizeString('cd D:\\Code\\principles && git status');
119
+ expect(result).not.toContain('D:\\Code\\principles');
120
+ expect(result).toContain('principles');
121
+ });
122
+ it('converges workspace-internal paths to repo-relative', () => {
123
+ const result = sanitizeString('edit failed on D:\\Code\\principles\\src\\index.ts', 'D:\\Code\\principles');
124
+ expect(result).not.toContain('D:\\Code\\principles');
125
+ expect(result).toContain('src\\index.ts');
126
+ });
127
+ // ── Length bounding ──
128
+ it('truncates long strings', () => {
129
+ const long = ' data '.repeat(100);
130
+ const result = sanitizeString(long);
131
+ expect(result.length).toBeLessThanOrEqual(MAX_EVIDENCE_VALUE_CHARS + 20);
132
+ expect(result).toMatch(/___TRUNCATED___$/);
133
+ });
134
+ it('preserves short strings intact', () => {
135
+ const short = 'short text';
136
+ expect(sanitizeString(short)).toBe(short);
137
+ });
138
+ // ── Combined operations ──
139
+ it('applies all sanitization steps in order', () => {
140
+ const token = 'sk-proj-' + 'a'.repeat(30);
141
+ const input = `[EMOTIONAL_DAMAGE_DETECTED] ${token} at /home/user/secrets/key.json`;
142
+ const result = sanitizeString(input);
143
+ // PD tag stripped
144
+ expect(result).not.toContain('EMOTIONAL_DAMAGE_DETECTED');
145
+ // Token redacted
146
+ expect(result).toContain('___REDACTED___');
147
+ expect(result).not.toContain(token);
148
+ // Path converged
149
+ expect(result).not.toContain('/home/user/secrets');
150
+ expect(result).toContain('key.json');
151
+ });
152
+ });
153
+ // ── sanitizeValue ────────────────────────────────────────────────────────────
154
+ describe('sanitizeValue', () => {
155
+ // ── Primitive handling ──
156
+ it('returns null unchanged', () => {
157
+ expect(sanitizeValue(null)).toBe(null);
158
+ });
159
+ it('returns undefined unchanged', () => {
160
+ expect(sanitizeValue(undefined)).toBe(undefined);
161
+ });
162
+ it('returns numbers unchanged', () => {
163
+ expect(sanitizeValue(42)).toBe(42);
164
+ expect(sanitizeValue(3.14)).toBe(3.14);
165
+ });
166
+ it('returns booleans unchanged', () => {
167
+ expect(sanitizeValue(true)).toBe(true);
168
+ expect(sanitizeValue(false)).toBe(false);
169
+ });
170
+ it('sanitizes strings', () => {
171
+ const token = 'sk-proj-' + 'a'.repeat(30);
172
+ const result = sanitizeValue(token);
173
+ expect(result).toContain('___REDACTED___');
174
+ });
175
+ // ── Array handling ──
176
+ it('sanitizes arrays with item limit', () => {
177
+ const arr = Array.from({ length: 100 }, (_, i) => `item-${i}`);
178
+ const result = sanitizeValue(arr);
179
+ expect(result.length).toBeLessThanOrEqual(21); // MAX_ARRAY_ITEMS + overflow indicator
180
+ expect(result[result.length - 1]).toMatch(/more items/);
181
+ });
182
+ it('sanitizes array elements recursively', () => {
183
+ const token = 'sk-proj-' + 'a'.repeat(30);
184
+ const arr = [token, 'safe-string', { nested: token }];
185
+ const result = sanitizeValue(arr);
186
+ expect(result[0]).toContain('___REDACTED___');
187
+ expect(result[1]).toBe('safe-string');
188
+ const nested = result[2];
189
+ expect(nested.nested).toContain('___REDACTED___');
190
+ });
191
+ // ── Object handling ──
192
+ it('sanitizes objects with key limit', () => {
193
+ const obj = {};
194
+ for (let i = 0; i < 100; i++) {
195
+ obj[`key-${i}`] = `value-${i}`;
196
+ }
197
+ const result = sanitizeValue(obj);
198
+ expect(Object.keys(result).length).toBeLessThanOrEqual(51); // MAX_KEYS + overflow indicator
199
+ expect(result['<truncated>']).toBeDefined();
200
+ });
201
+ it('sanitizes nested objects recursively', () => {
202
+ const token = 'sk-proj-' + 'a'.repeat(30);
203
+ const input = { a: { b: { c: token } } };
204
+ const result = sanitizeValue(input);
205
+ const nested = result.a.b.c;
206
+ expect(nested).toContain('___REDACTED___');
207
+ });
208
+ // ── Depth limit ──
209
+ it('returns <max-depth> for deeply nested objects', () => {
210
+ const deep = { a: { b: { c: { d: { e: 'too deep' } } } } };
211
+ const result = sanitizeValue(deep);
212
+ const a = result.a;
213
+ const b = a.b;
214
+ const c = b.c;
215
+ const d = c.d;
216
+ expect(d.e).toBe('<max-depth>');
217
+ });
218
+ it('respects depth parameter', () => {
219
+ const input = { a: { b: { c: 'value' } } };
220
+ // Starting at depth 3, b would be at depth 4 (exceeds MAX_DEPTH=4)
221
+ const result = sanitizeValue(input, 3);
222
+ const a = result.a;
223
+ // b is at depth 4 from the starting depth 3, so it gets max-depth
224
+ expect(a.b).toBe('<max-depth>');
225
+ });
226
+ // ── Unsupported types ──
227
+ it('returns <unsupported-type> for functions', () => {
228
+ expect(sanitizeValue(() => { })).toBe('<unsupported-type>');
229
+ });
230
+ it('returns <unsupported-type> for symbols', () => {
231
+ expect(sanitizeValue(Symbol('test'))).toBe('<unsupported-type>');
232
+ });
233
+ });
234
+ // ── sanitizeToolParams ───────────────────────────────────────────────────────
235
+ describe('sanitizeToolParams', () => {
236
+ it('returns {} for null input', () => {
237
+ expect(sanitizeToolParams(null)).toEqual({});
238
+ });
239
+ it('returns {} for undefined input', () => {
240
+ expect(sanitizeToolParams(undefined)).toEqual({});
241
+ });
242
+ it('returns {} for number input', () => {
243
+ expect(sanitizeToolParams(42)).toEqual({});
244
+ });
245
+ it('returns {} for boolean input', () => {
246
+ expect(sanitizeToolParams(true)).toEqual({});
247
+ });
248
+ it('wraps string input in <string-input> key', () => {
249
+ const result = sanitizeToolParams('raw string input');
250
+ expect(result['<string-input>']).toBeDefined();
251
+ expect(typeof result['<string-input>']).toBe('string');
252
+ });
253
+ it('wraps array input in <array-input> key', () => {
254
+ const result = sanitizeToolParams(['a', 'b', 'c']);
255
+ expect(result['<array-input>']).toBeDefined();
256
+ });
257
+ it('sanitizes object params', () => {
258
+ const token = 'sk-proj-' + 'a'.repeat(30);
259
+ const params = {
260
+ file_path: 'src/file.ts',
261
+ content: `key is ${token}`,
262
+ };
263
+ const result = sanitizeToolParams(params);
264
+ expect(result.file_path).toBe('src/file.ts');
265
+ expect(result.content).toContain('___REDACTED___');
266
+ });
267
+ it('converges paths with workspaceDir', () => {
268
+ const params = {
269
+ file_path: '/workspace/repo/src/config.ts',
270
+ };
271
+ const result = sanitizeToolParams(params, '/workspace/repo');
272
+ expect(result.file_path).toBe('src/config.ts');
273
+ });
274
+ it('handles nested edits array', () => {
275
+ const token = 'sk-proj-' + 'a'.repeat(30);
276
+ const params = {
277
+ file_path: '/repo/src/config.ts',
278
+ edits: [
279
+ { oldText: token, newText: 'safe-value' },
280
+ ],
281
+ };
282
+ const result = sanitizeToolParams(params, '/repo');
283
+ const edits = result.edits;
284
+ expect(edits[0].oldText).toContain('___REDACTED___');
285
+ expect(edits[0].newText).toBe('safe-value');
286
+ expect(result.file_path).toBe('src/config.ts');
287
+ });
288
+ it('truncates long content fields', () => {
289
+ const params = {
290
+ content: ' data '.repeat(100),
291
+ };
292
+ const result = sanitizeToolParams(params);
293
+ expect(result.content).toMatch(/___TRUNCATED___$/);
294
+ });
295
+ });
296
+ // ── Platform-agnostic path handling (EP-08) ───────────────────────────────────
297
+ describe('Platform-agnostic path handling', () => {
298
+ it('handles Windows paths on POSIX runner', () => {
299
+ // This test runs on Linux CI but should handle Windows paths
300
+ const result = sanitizeString('error in D:\\Code\\principles\\src\\file.ts');
301
+ // Should extract basename using platformAgnosticBasename
302
+ expect(result).toContain('file.ts');
303
+ expect(result).not.toContain('D:\\Code');
304
+ });
305
+ it('handles POSIX paths on Windows runner', () => {
306
+ // This test runs on Windows but should handle POSIX paths
307
+ const result = sanitizeString('error in /home/user/project/src/file.ts');
308
+ expect(result).toContain('file.ts');
309
+ expect(result).not.toContain('/home/user/project');
310
+ });
311
+ it('handles mixed separators in single string', () => {
312
+ const result = sanitizeString('path1: C:\\Users\\admin\\file1.txt, path2: /etc/file2.conf');
313
+ expect(result).toContain('file1.txt');
314
+ expect(result).toContain('file2.conf');
315
+ expect(result).not.toContain('C:\\Users\\admin');
316
+ expect(result).not.toContain('/etc');
317
+ });
318
+ });
319
+ // ── Security regression tests ────────────────────────────────────────────────
320
+ describe('Security regression tests', () => {
321
+ it('redacts tokens in deeply nested structures', () => {
322
+ const token = 'sk-proj-' + 'a'.repeat(30);
323
+ // Use a structure that stays within MAX_DEPTH (4)
324
+ const input = {
325
+ level1: {
326
+ level2: {
327
+ level3: {
328
+ secret: token,
329
+ },
330
+ },
331
+ },
332
+ };
333
+ const result = sanitizeValue(input);
334
+ const l1 = result.level1;
335
+ const l2 = l1.level2;
336
+ const l3 = l2.level3;
337
+ expect(l3.secret).toContain('___REDACTED___');
338
+ });
339
+ it('does not reveal token prefix beyond safe limit', () => {
340
+ const token = 'sk-proj-abcdefghijklmnopqrstuvwxy' + 'z'.repeat(20);
341
+ const result = sanitizeString(token);
342
+ // Prefix should be limited (8 chars for >50 length, 4 for shorter)
343
+ expect(result).not.toContain(token.slice(10));
344
+ });
345
+ it('handles empty strings gracefully', () => {
346
+ expect(sanitizeString('')).toBe('');
347
+ expect(sanitizeValue('')).toBe('');
348
+ });
349
+ it('handles strings with only whitespace', () => {
350
+ expect(sanitizeString(' ')).toBe('');
351
+ expect(sanitizeString('\n\t')).toBe('');
352
+ });
353
+ });
354
+ //# sourceMappingURL=evidence-sanitizer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-sanitizer.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/evidence-sanitizer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Source Descriptors Tests — PEAT-B1
3
+ *
4
+ * Direct tests for the source descriptor registry.
5
+ * This module defines the declarative policy mapping from SourceKind to default TriageDecision.
6
+ *
7
+ * Tests verify:
8
+ * - All source kinds have descriptors registered
9
+ * - Every descriptor has required fields (kind, defaultDecision, reason, nextAction, canUpgrade)
10
+ * - Descriptor invariants (owner_reported always admit, tool_failure never admit, etc.)
11
+ * - canUpgrade flag is correctly set for upgradable kinds
12
+ *
13
+ * ERR checklist:
14
+ * - ERR-002: Every descriptor carries reason + nextAction
15
+ * - ERR-005: Descriptors are data, not assumptions about callers
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=source-descriptors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-descriptors.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/evidence-triage/__tests__/source-descriptors.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Source Descriptors Tests — PEAT-B1
3
+ *
4
+ * Direct tests for the source descriptor registry.
5
+ * This module defines the declarative policy mapping from SourceKind to default TriageDecision.
6
+ *
7
+ * Tests verify:
8
+ * - All source kinds have descriptors registered
9
+ * - Every descriptor has required fields (kind, defaultDecision, reason, nextAction, canUpgrade)
10
+ * - Descriptor invariants (owner_reported always admit, tool_failure never admit, etc.)
11
+ * - canUpgrade flag is correctly set for upgradable kinds
12
+ *
13
+ * ERR checklist:
14
+ * - ERR-002: Every descriptor carries reason + nextAction
15
+ * - ERR-005: Descriptors are data, not assumptions about callers
16
+ */
17
+ import { describe, it, expect } from 'vitest';
18
+ import { SOURCE_DESCRIPTORS, getSourceDescriptor, } from '../source-descriptors.js';
19
+ import { isSourceKind } from '../types.js';
20
+ // ── Descriptor Registry Completeness ───────────────────────────────────────────
21
+ describe('SOURCE_DESCRIPTORS registry', () => {
22
+ it('has exactly 13 registered descriptors', () => {
23
+ expect(SOURCE_DESCRIPTORS.size).toBe(13);
24
+ });
25
+ it('contains all valid SourceKinds', () => {
26
+ const expectedKinds = [
27
+ 'owner_reported',
28
+ 'agent_on_owner_request',
29
+ 'tool_failure',
30
+ 'dispatch_error',
31
+ 'provider_failure',
32
+ 'rate_limit',
33
+ 'rulehost_block',
34
+ 'empathy_inferred',
35
+ 'semantic',
36
+ 'llm_paralysis',
37
+ 'subagent_error',
38
+ 'gfi_threshold',
39
+ 'unknown',
40
+ ];
41
+ for (const kind of expectedKinds) {
42
+ expect(SOURCE_DESCRIPTORS.has(kind)).toBe(true);
43
+ }
44
+ });
45
+ it('every descriptor has all required fields', () => {
46
+ for (const [kind, descriptor] of SOURCE_DESCRIPTORS) {
47
+ expect(descriptor.kind).toBe(kind);
48
+ expect(descriptor.defaultDecision).toBeDefined();
49
+ expect(typeof descriptor.defaultDecision).toBe('string');
50
+ expect(descriptor.reason).toBeDefined();
51
+ expect(typeof descriptor.reason).toBe('string');
52
+ expect(descriptor.reason.length).toBeGreaterThan(0);
53
+ expect(descriptor.nextAction).toBeDefined();
54
+ expect(typeof descriptor.nextAction).toBe('string');
55
+ expect(descriptor.nextAction.length).toBeGreaterThan(0);
56
+ expect(typeof descriptor.canUpgrade).toBe('boolean');
57
+ }
58
+ });
59
+ });
60
+ // ── getSourceDescriptor ───────────────────────────────────────────────────────
61
+ describe('getSourceDescriptor', () => {
62
+ it('returns descriptor for every registered kind', () => {
63
+ const kinds = [
64
+ 'owner_reported',
65
+ 'agent_on_owner_request',
66
+ 'tool_failure',
67
+ 'dispatch_error',
68
+ 'provider_failure',
69
+ 'rate_limit',
70
+ 'rulehost_block',
71
+ 'empathy_inferred',
72
+ 'semantic',
73
+ 'llm_paralysis',
74
+ 'subagent_error',
75
+ 'gfi_threshold',
76
+ 'unknown',
77
+ ];
78
+ for (const kind of kinds) {
79
+ const descriptor = getSourceDescriptor(kind);
80
+ expect(descriptor).toBeDefined();
81
+ expect(descriptor?.kind).toBe(kind);
82
+ }
83
+ });
84
+ it('returns undefined for unregistered kind', () => {
85
+ const result = getSourceDescriptor('not_a_kind');
86
+ expect(result).toBeUndefined();
87
+ });
88
+ it('returns undefined for empty string', () => {
89
+ const result = getSourceDescriptor('');
90
+ expect(result).toBeUndefined();
91
+ });
92
+ });
93
+ // ── Descriptor Decision Invariants ─────────────────────────────────────────────
94
+ describe('Descriptor decision invariants', () => {
95
+ it('owner_reported always has defaultDecision=admit', () => {
96
+ const descriptor = getSourceDescriptor('owner_reported');
97
+ expect(descriptor?.defaultDecision).toBe('admit');
98
+ });
99
+ it('agent_on_owner_request always has defaultDecision=admit', () => {
100
+ const descriptor = getSourceDescriptor('agent_on_owner_request');
101
+ expect(descriptor?.defaultDecision).toBe('admit');
102
+ });
103
+ it('tool_failure has defaultDecision=evidence_only (never admit)', () => {
104
+ const descriptor = getSourceDescriptor('tool_failure');
105
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
106
+ expect(descriptor?.defaultDecision).not.toBe('admit');
107
+ });
108
+ it('dispatch_error has defaultDecision=evidence_only', () => {
109
+ const descriptor = getSourceDescriptor('dispatch_error');
110
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
111
+ });
112
+ it('provider_failure has defaultDecision=health_only', () => {
113
+ const descriptor = getSourceDescriptor('provider_failure');
114
+ expect(descriptor?.defaultDecision).toBe('health_only');
115
+ });
116
+ it('rate_limit has defaultDecision=health_only', () => {
117
+ const descriptor = getSourceDescriptor('rate_limit');
118
+ expect(descriptor?.defaultDecision).toBe('health_only');
119
+ });
120
+ it('rulehost_block has defaultDecision=evidence_only with canUpgrade=true', () => {
121
+ const descriptor = getSourceDescriptor('rulehost_block');
122
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
123
+ expect(descriptor?.canUpgrade).toBe(true);
124
+ });
125
+ it('empathy_inferred has defaultDecision=owner_confirm (never directly admit)', () => {
126
+ const descriptor = getSourceDescriptor('empathy_inferred');
127
+ expect(descriptor?.defaultDecision).toBe('owner_confirm');
128
+ expect(descriptor?.defaultDecision).not.toBe('admit');
129
+ });
130
+ it('semantic has defaultDecision=evidence_only', () => {
131
+ const descriptor = getSourceDescriptor('semantic');
132
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
133
+ });
134
+ it('llm_paralysis has defaultDecision=evidence_only', () => {
135
+ const descriptor = getSourceDescriptor('llm_paralysis');
136
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
137
+ });
138
+ it('subagent_error has defaultDecision=evidence_only', () => {
139
+ const descriptor = getSourceDescriptor('subagent_error');
140
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
141
+ });
142
+ it('gfi_threshold has defaultDecision=evidence_only (GFI alone cannot admit)', () => {
143
+ const descriptor = getSourceDescriptor('gfi_threshold');
144
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
145
+ expect(descriptor?.defaultDecision).not.toBe('admit');
146
+ });
147
+ it('unknown has defaultDecision=evidence_only (conservative default)', () => {
148
+ const descriptor = getSourceDescriptor('unknown');
149
+ expect(descriptor?.defaultDecision).toBe('evidence_only');
150
+ });
151
+ });
152
+ // ── canUpgrade Flag ────────────────────────────────────────────────────────────
153
+ describe('canUpgrade flag', () => {
154
+ it('only rulehost_block has canUpgrade=true', () => {
155
+ for (const [kind, descriptor] of SOURCE_DESCRIPTORS) {
156
+ if (kind === 'rulehost_block') {
157
+ expect(descriptor.canUpgrade).toBe(true);
158
+ }
159
+ else {
160
+ expect(descriptor.canUpgrade).toBe(false);
161
+ }
162
+ }
163
+ });
164
+ it('owner_reported cannot be upgraded (highest confidence)', () => {
165
+ const descriptor = getSourceDescriptor('owner_reported');
166
+ expect(descriptor?.canUpgrade).toBe(false);
167
+ });
168
+ it('tool_failure cannot be upgraded (infrastructure noise)', () => {
169
+ const descriptor = getSourceDescriptor('tool_failure');
170
+ expect(descriptor?.canUpgrade).toBe(false);
171
+ });
172
+ it('empathy_inferred cannot be upgraded (requires owner confirmation)', () => {
173
+ const descriptor = getSourceDescriptor('empathy_inferred');
174
+ expect(descriptor?.canUpgrade).toBe(false);
175
+ });
176
+ });
177
+ // ── Descriptor Reason Quality ──────────────────────────────────────────────────
178
+ describe('Descriptor reason quality', () => {
179
+ it('owner_reported reason mentions highest confidence', () => {
180
+ const descriptor = getSourceDescriptor('owner_reported');
181
+ expect(descriptor?.reason.toLowerCase()).toContain('owner');
182
+ expect(descriptor?.reason.toLowerCase()).toContain('highest');
183
+ });
184
+ it('tool_failure reason mentions infrastructure or ADR-0014', () => {
185
+ const descriptor = getSourceDescriptor('tool_failure');
186
+ expect(descriptor?.reason.toLowerCase().includes('infrastructure') ||
187
+ descriptor?.reason.includes('ADR-0014')).toBe(true);
188
+ });
189
+ it('empathy_inferred reason mentions owner confirmation or PRODUCT_IDENTITY', () => {
190
+ const descriptor = getSourceDescriptor('empathy_inferred');
191
+ expect(descriptor?.reason.toLowerCase().includes('owner') ||
192
+ descriptor?.reason.includes('PRODUCT_IDENTITY')).toBe(true);
193
+ });
194
+ it('gfi_threshold reason mentions GFI alone cannot create diagnosis', () => {
195
+ const descriptor = getSourceDescriptor('gfi_threshold');
196
+ expect(descriptor?.reason.toLowerCase()).toContain('gfi');
197
+ expect(descriptor?.reason.toLowerCase()).toContain('alone');
198
+ });
199
+ it('rulehost_block reason mentions near-miss or evidence', () => {
200
+ const descriptor = getSourceDescriptor('rulehost_block');
201
+ expect(descriptor?.reason.toLowerCase().includes('near-miss') ||
202
+ descriptor?.reason.toLowerCase().includes('evidence')).toBe(true);
203
+ });
204
+ });
205
+ // ── Descriptor NextAction Quality ──────────────────────────────────────────────
206
+ describe('Descriptor nextAction quality', () => {
207
+ it('owner_reported nextAction is none (direct diagnosis)', () => {
208
+ const descriptor = getSourceDescriptor('owner_reported');
209
+ expect(descriptor?.nextAction).toBe('none');
210
+ });
211
+ it('agent_on_owner_request nextAction is none (direct diagnosis)', () => {
212
+ const descriptor = getSourceDescriptor('agent_on_owner_request');
213
+ expect(descriptor?.nextAction).toBe('none');
214
+ });
215
+ it('tool_failure nextAction mentions evidence or correlation', () => {
216
+ const descriptor = getSourceDescriptor('tool_failure');
217
+ expect(descriptor?.nextAction.toLowerCase()).toContain('evidence');
218
+ });
219
+ it('provider_failure nextAction mentions health or telemetry', () => {
220
+ const descriptor = getSourceDescriptor('provider_failure');
221
+ expect(descriptor?.nextAction.toLowerCase()).toContain('health');
222
+ });
223
+ it('empathy_inferred nextAction mentions owner confirmation', () => {
224
+ const descriptor = getSourceDescriptor('empathy_inferred');
225
+ expect(descriptor?.nextAction.toLowerCase()).toContain('owner');
226
+ });
227
+ it('unknown nextAction mentions classify', () => {
228
+ const descriptor = getSourceDescriptor('unknown');
229
+ expect(descriptor?.nextAction.toLowerCase()).toContain('classify');
230
+ });
231
+ });
232
+ // ── ReadonlyMap Immutability ───────────────────────────────────────────────────
233
+ describe('SOURCE_DESCRIPTORS immutability', () => {
234
+ it('SOURCE_DESCRIPTORS is a ReadonlyMap', () => {
235
+ // TypeScript enforces readonly, but runtime check ensures Map
236
+ expect(SOURCE_DESCRIPTORS instanceof Map).toBe(true);
237
+ });
238
+ it('descriptor objects are frozen or readonly', () => {
239
+ // Each descriptor should have readonly properties
240
+ for (const [kind, descriptor] of SOURCE_DESCRIPTORS) {
241
+ // Attempting to modify should either fail or not affect original
242
+ const originalDecision = descriptor.defaultDecision;
243
+ // This test verifies the descriptor structure is correct
244
+ expect(descriptor.defaultDecision).toBe(originalDecision);
245
+ }
246
+ });
247
+ });
248
+ // ── Integration with isSourceKind ──────────────────────────────────────────────
249
+ describe('Integration with isSourceKind', () => {
250
+ it('every descriptor kind is a valid SourceKind', () => {
251
+ for (const [kind] of SOURCE_DESCRIPTORS) {
252
+ expect(isSourceKind(kind)).toBe(true);
253
+ }
254
+ });
255
+ it('descriptor lookup succeeds for all isSourceKind-valid values', () => {
256
+ const validKinds = [
257
+ 'owner_reported',
258
+ 'agent_on_owner_request',
259
+ 'tool_failure',
260
+ 'dispatch_error',
261
+ 'provider_failure',
262
+ 'rate_limit',
263
+ 'rulehost_block',
264
+ 'empathy_inferred',
265
+ 'semantic',
266
+ 'llm_paralysis',
267
+ 'subagent_error',
268
+ 'gfi_threshold',
269
+ 'unknown',
270
+ ];
271
+ for (const kind of validKinds) {
272
+ expect(isSourceKind(kind)).toBe(true);
273
+ expect(getSourceDescriptor(kind)).toBeDefined();
274
+ }
275
+ });
276
+ });
277
+ //# sourceMappingURL=source-descriptors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-descriptors.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/evidence-triage/__tests__/source-descriptors.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,kFAAkF;AAElF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,aAAa,GAAiB;YAClC,gBAAgB;YAChB,wBAAwB;YACxB,cAAc;YACd,gBAAgB;YAChB,kBAAkB;YAClB,YAAY;YACZ,gBAAgB;YAChB,kBAAkB;YAClB,UAAU;YACV,eAAe;YACf,gBAAgB;YAChB,eAAe;YACf,SAAS;SACV,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACpD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,CAAC,OAAO,UAAU,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,CAAC,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAiB;YAC1B,gBAAgB;YAChB,wBAAwB;YACxB,cAAc;YACd,gBAAgB;YAChB,kBAAkB;YAClB,YAAY;YACZ,gBAAgB;YAChB,kBAAkB;YAClB,UAAU;YACV,eAAe;YACf,gBAAgB;YAChB,eAAe;YACf,SAAS;SACV,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,mBAAmB,CAAC,YAA0B,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAgB,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,UAAU,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,UAAU,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;QACrD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,UAAU,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,UAAU,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACpD,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAC9B,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CACJ,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC3D,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CACJ,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;YAClD,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,UAAU,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CACJ,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YACtD,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,UAAU,GAAG,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;QACjE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,UAAU,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,8DAA8D;QAC9D,MAAM,CAAC,kBAAkB,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,kDAAkD;QAClD,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACpD,iEAAiE;YACjE,MAAM,gBAAgB,GAAG,UAAU,CAAC,eAAe,CAAC;YACpD,yDAAyD;YACzD,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,UAAU,GAAG;YACjB,gBAAgB;YAChB,wBAAwB;YACxB,cAAc;YACd,gBAAgB;YAChB,kBAAkB;YAClB,YAAY;YACZ,gBAAgB;YAChB,kBAAkB;YAClB,UAAU;YACV,eAAe;YACf,gBAAgB;YAChB,eAAe;YACf,SAAS;SACD,CAAC;QAEX,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principles/core",
3
- "version": "1.98.0",
3
+ "version": "1.99.0",
4
4
  "description": "Universal Evolution SDK - framework-agnostic pain signal capture and principle injection",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",