@nexart/ai-execution 0.2.0 → 0.3.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.
@@ -1,261 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { toCanonicalJson } from '../canonicalJson.js';
4
- import { sha256Hex, hashUtf8, hashCanonicalJson, computeInputHash, computeOutputHash } from '../hash.js';
5
- import { createSnapshot, verifySnapshot } from '../snapshot.js';
6
- import { sealCer, verifyCer } from '../cer.js';
7
- const FIXED_TIMESTAMP = '2026-02-12T00:00:00.000Z';
8
- const FIXED_EXECUTION_ID = 'test-exec-001';
9
- describe('canonicalJson', () => {
10
- it('sorts object keys lexicographically', () => {
11
- const result = toCanonicalJson({ z: 1, a: 2, m: 3 });
12
- assert.equal(result, '{"a":2,"m":3,"z":1}');
13
- });
14
- it('does not sort arrays', () => {
15
- const result = toCanonicalJson([3, 1, 2]);
16
- assert.equal(result, '[3,1,2]');
17
- });
18
- it('handles nested objects', () => {
19
- const result = toCanonicalJson({ b: { d: 1, c: 2 }, a: 3 });
20
- assert.equal(result, '{"a":3,"b":{"c":2,"d":1}}');
21
- });
22
- it('handles null', () => {
23
- assert.equal(toCanonicalJson(null), 'null');
24
- });
25
- it('handles strings with escapes', () => {
26
- assert.equal(toCanonicalJson('hello "world"'), '"hello \\"world\\""');
27
- });
28
- it('rejects NaN', () => {
29
- assert.throws(() => toCanonicalJson(NaN), /Non-finite/);
30
- });
31
- it('rejects Infinity', () => {
32
- assert.throws(() => toCanonicalJson(Infinity), /Non-finite/);
33
- });
34
- it('omits undefined values in objects', () => {
35
- const result = toCanonicalJson({ a: 1, b: undefined, c: 3 });
36
- assert.equal(result, '{"a":1,"c":3}');
37
- });
38
- it('produces no whitespace', () => {
39
- const result = toCanonicalJson({ key: 'value', arr: [1, 2] });
40
- assert.ok(!result.includes(' '));
41
- assert.ok(!result.includes('\n'));
42
- });
43
- });
44
- describe('hashing', () => {
45
- it('sha256Hex produces correct hex for empty string', () => {
46
- const result = sha256Hex('');
47
- assert.equal(result, 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
48
- });
49
- it('hashUtf8 prefixes with sha256:', () => {
50
- const result = hashUtf8('hello');
51
- assert.ok(result.startsWith('sha256:'));
52
- assert.equal(result, 'sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824');
53
- });
54
- it('hashCanonicalJson is stable for same object', () => {
55
- const obj = { b: 2, a: 1 };
56
- const h1 = hashCanonicalJson(obj);
57
- const h2 = hashCanonicalJson({ a: 1, b: 2 });
58
- assert.equal(h1, h2);
59
- });
60
- it('computeInputHash for string uses hashUtf8', () => {
61
- const result = computeInputHash('test input');
62
- assert.equal(result, hashUtf8('test input'));
63
- });
64
- it('computeInputHash for object uses hashCanonicalJson', () => {
65
- const obj = { role: 'user', content: 'hello' };
66
- const result = computeInputHash(obj);
67
- assert.equal(result, hashCanonicalJson(obj));
68
- });
69
- });
70
- describe('snapshot', () => {
71
- const baseParams = {
72
- executionId: FIXED_EXECUTION_ID,
73
- timestamp: FIXED_TIMESTAMP,
74
- provider: 'openai',
75
- model: 'gpt-4o',
76
- modelVersion: '2026-01-01',
77
- prompt: 'You are a helpful assistant.',
78
- input: 'What is 2+2?',
79
- parameters: {
80
- temperature: 0.7,
81
- maxTokens: 1024,
82
- topP: null,
83
- seed: null,
84
- },
85
- output: 'The answer is 4.',
86
- sdkVersion: '0.1.0',
87
- appId: null,
88
- };
89
- it('creates snapshot with correct type fields', () => {
90
- const snap = createSnapshot(baseParams);
91
- assert.equal(snap.type, 'ai.execution.v1');
92
- assert.equal(snap.protocolVersion, '1.2.0');
93
- assert.equal(snap.executionSurface, 'ai');
94
- assert.equal(snap.executionId, FIXED_EXECUTION_ID);
95
- assert.equal(snap.timestamp, FIXED_TIMESTAMP);
96
- });
97
- it('computes correct inputHash for text input', () => {
98
- const snap = createSnapshot(baseParams);
99
- const expected = computeInputHash('What is 2+2?');
100
- assert.equal(snap.inputHash, expected);
101
- });
102
- it('computes correct outputHash for text output', () => {
103
- const snap = createSnapshot(baseParams);
104
- const expected = computeOutputHash('The answer is 4.');
105
- assert.equal(snap.outputHash, expected);
106
- });
107
- it('computes correct hashes for JSON input/output', () => {
108
- const jsonParams = {
109
- ...baseParams,
110
- input: { messages: [{ role: 'user', content: 'hello' }] },
111
- output: { result: 'world', confidence: 0.95 },
112
- };
113
- const snap = createSnapshot(jsonParams);
114
- const expectedInput = computeInputHash(jsonParams.input);
115
- const expectedOutput = computeOutputHash(jsonParams.output);
116
- assert.equal(snap.inputHash, expectedInput);
117
- assert.equal(snap.outputHash, expectedOutput);
118
- });
119
- it('verifySnapshot passes for valid snapshot', () => {
120
- const snap = createSnapshot(baseParams);
121
- const result = verifySnapshot(snap);
122
- assert.equal(result.ok, true);
123
- assert.equal(result.errors.length, 0);
124
- });
125
- it('verifySnapshot fails on tampered output', () => {
126
- const snap = createSnapshot(baseParams);
127
- snap.output = 'Tampered output!';
128
- const result = verifySnapshot(snap);
129
- assert.equal(result.ok, false);
130
- assert.ok(result.errors.some(e => e.includes('outputHash mismatch')));
131
- });
132
- it('rejects non-finite temperature', () => {
133
- assert.throws(() => createSnapshot({ ...baseParams, parameters: { ...baseParams.parameters, temperature: NaN } }), /temperature/);
134
- });
135
- });
136
- describe('cer', () => {
137
- const baseParams = {
138
- executionId: FIXED_EXECUTION_ID,
139
- timestamp: FIXED_TIMESTAMP,
140
- provider: 'openai',
141
- model: 'gpt-4o',
142
- modelVersion: '2026-01-01',
143
- prompt: 'You are a helpful assistant.',
144
- input: 'What is 2+2?',
145
- parameters: {
146
- temperature: 0.7,
147
- maxTokens: 1024,
148
- topP: null,
149
- seed: null,
150
- },
151
- output: 'The answer is 4.',
152
- sdkVersion: '0.1.0',
153
- appId: null,
154
- };
155
- it('seals a CER bundle with correct fields', () => {
156
- const snap = createSnapshot(baseParams);
157
- const bundle = sealCer(snap, { createdAt: FIXED_TIMESTAMP });
158
- assert.equal(bundle.bundleType, 'cer.ai.execution.v1');
159
- assert.equal(bundle.version, '0.1');
160
- assert.equal(bundle.createdAt, FIXED_TIMESTAMP);
161
- assert.ok(bundle.certificateHash.startsWith('sha256:'));
162
- assert.deepStrictEqual(bundle.snapshot, snap);
163
- });
164
- it('certificateHash is stable for same snapshot + createdAt', () => {
165
- const snap = createSnapshot(baseParams);
166
- const b1 = sealCer(snap, { createdAt: FIXED_TIMESTAMP });
167
- const b2 = sealCer(snap, { createdAt: FIXED_TIMESTAMP });
168
- assert.equal(b1.certificateHash, b2.certificateHash);
169
- });
170
- it('certificateHash changes when createdAt changes', () => {
171
- const snap = createSnapshot(baseParams);
172
- const b1 = sealCer(snap, { createdAt: FIXED_TIMESTAMP });
173
- const b2 = sealCer(snap, { createdAt: '2026-02-13T00:00:00.000Z' });
174
- assert.notEqual(b1.certificateHash, b2.certificateHash);
175
- });
176
- it('verifyCer passes for valid bundle', () => {
177
- const snap = createSnapshot(baseParams);
178
- const bundle = sealCer(snap, { createdAt: FIXED_TIMESTAMP });
179
- const result = verifyCer(bundle);
180
- assert.equal(result.ok, true);
181
- assert.equal(result.errors.length, 0);
182
- });
183
- it('verifyCer fails on tampered certificateHash', () => {
184
- const snap = createSnapshot(baseParams);
185
- const bundle = sealCer(snap, { createdAt: FIXED_TIMESTAMP });
186
- bundle.certificateHash = 'sha256:0000000000000000000000000000000000000000000000000000000000000000';
187
- const result = verifyCer(bundle);
188
- assert.equal(result.ok, false);
189
- assert.ok(result.errors.some(e => e.includes('certificateHash mismatch')));
190
- });
191
- it('verifyCer fails on tampered snapshot output', () => {
192
- const snap = createSnapshot(baseParams);
193
- const bundle = sealCer(snap, { createdAt: FIXED_TIMESTAMP });
194
- bundle.snapshot.output = 'Tampered!';
195
- const result = verifyCer(bundle);
196
- assert.equal(result.ok, false);
197
- assert.ok(result.errors.some(e => e.includes('outputHash mismatch')));
198
- });
199
- it('includes meta when provided', () => {
200
- const snap = createSnapshot(baseParams);
201
- const bundle = sealCer(snap, {
202
- createdAt: FIXED_TIMESTAMP,
203
- meta: { source: 'test', tags: ['unit-test'] },
204
- });
205
- assert.deepStrictEqual(bundle.meta, { source: 'test', tags: ['unit-test'] });
206
- });
207
- });
208
- describe('deterministic test vectors', () => {
209
- it('text input/text output vector', () => {
210
- const snap = createSnapshot({
211
- executionId: 'vec-text-001',
212
- timestamp: '2026-01-01T00:00:00.000Z',
213
- provider: 'openai',
214
- model: 'gpt-4o',
215
- modelVersion: null,
216
- prompt: 'system prompt',
217
- input: 'hello world',
218
- parameters: { temperature: 0, maxTokens: 100, topP: null, seed: null },
219
- output: 'goodbye world',
220
- sdkVersion: '0.1.0',
221
- appId: null,
222
- });
223
- assert.equal(snap.inputHash, 'sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9');
224
- assert.equal(snap.outputHash, 'sha256:9150e02727e29ca8522c29ad4aa5a8343c21ccf909b40f73c41bf478df7e6fc3');
225
- const bundle = sealCer(snap, { createdAt: '2026-01-01T00:00:00.000Z' });
226
- assert.ok(bundle.certificateHash.startsWith('sha256:'));
227
- const v1 = verifySnapshot(snap);
228
- assert.equal(v1.ok, true);
229
- const v2 = verifyCer(bundle);
230
- assert.equal(v2.ok, true);
231
- });
232
- it('JSON input/JSON output vector', () => {
233
- const snap = createSnapshot({
234
- executionId: 'vec-json-001',
235
- timestamp: '2026-01-01T00:00:00.000Z',
236
- provider: 'openai',
237
- model: 'gpt-4o',
238
- modelVersion: '2026-01-01',
239
- prompt: 'structured',
240
- input: { query: 'test', context: [1, 2, 3] },
241
- parameters: { temperature: 0.5, maxTokens: 256, topP: 0.9, seed: 42 },
242
- output: { answer: 'result', score: 0.99 },
243
- sdkVersion: '0.1.0',
244
- appId: 'myapp',
245
- });
246
- const expectedInputCanonical = '{"context":[1,2,3],"query":"test"}';
247
- const expectedOutputCanonical = '{"answer":"result","score":0.99}';
248
- assert.equal(toCanonicalJson(snap.input), expectedInputCanonical);
249
- assert.equal(toCanonicalJson(snap.output), expectedOutputCanonical);
250
- assert.equal(snap.inputHash, computeInputHash({ query: 'test', context: [1, 2, 3] }));
251
- assert.equal(snap.outputHash, computeOutputHash({ answer: 'result', score: 0.99 }));
252
- const v1 = verifySnapshot(snap);
253
- assert.equal(v1.ok, true);
254
- const bundle = sealCer(snap, { createdAt: '2026-01-01T00:00:00.000Z' });
255
- const v2 = verifyCer(bundle);
256
- assert.equal(v2.ok, true);
257
- const bundle2 = sealCer(snap, { createdAt: '2026-01-01T00:00:00.000Z' });
258
- assert.equal(bundle.certificateHash, bundle2.certificateHash);
259
- });
260
- });
261
- //# sourceMappingURL=vectors.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vectors.test.js","sourceRoot":"","sources":["../../src/__tests__/vectors.test.ts"],"names":[],"mappings":"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"}