@principles/core 1.240.2 → 1.240.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.
- package/dist/principle-injector.test.d.ts +2 -0
- package/dist/principle-injector.test.d.ts.map +1 -0
- package/dist/principle-injector.test.js +158 -0
- package/dist/principle-injector.test.js.map +1 -0
- package/dist/runtime-v2/__tests__/bridge-result-shaper.test.d.ts +26 -0
- package/dist/runtime-v2/__tests__/bridge-result-shaper.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/bridge-result-shaper.test.js +402 -0
- package/dist/runtime-v2/__tests__/bridge-result-shaper.test.js.map +1 -0
- package/dist/runtime-v2/__tests__/pruning-mask.test.d.ts +25 -0
- package/dist/runtime-v2/__tests__/pruning-mask.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/pruning-mask.test.js +281 -0
- package/dist/runtime-v2/__tests__/pruning-mask.test.js.map +1 -0
- package/dist/runtime-v2/__tests__/workflow-funnel-loader.test.d.ts +29 -0
- package/dist/runtime-v2/__tests__/workflow-funnel-loader.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/workflow-funnel-loader.test.js +431 -0
- package/dist/runtime-v2/__tests__/workflow-funnel-loader.test.js.map +1 -0
- package/dist/trajectory-store.test.d.ts +2 -0
- package/dist/trajectory-store.test.d.ts.map +1 -0
- package/dist/trajectory-store.test.js +251 -0
- package/dist/trajectory-store.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { mkdirSync, rmSync } from 'fs';
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import { listCorrectionSamples, reviewCorrectionSample, } from './trajectory-store.js';
|
|
6
|
+
describe('trajectory-store', () => {
|
|
7
|
+
let tmpDir;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
tmpDir = join(process.cwd(), 'tmp-test-trajectory-store-' + Date.now());
|
|
10
|
+
mkdirSync(tmpDir, { recursive: true });
|
|
11
|
+
});
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
try {
|
|
14
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Best-effort cleanup; ignore errors on tmp teardown.
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
function setupTestDb(dbPath) {
|
|
21
|
+
const db = new Database(dbPath);
|
|
22
|
+
db.exec(`
|
|
23
|
+
CREATE TABLE correction_samples (
|
|
24
|
+
sample_id TEXT PRIMARY KEY,
|
|
25
|
+
session_id TEXT NOT NULL,
|
|
26
|
+
bad_assistant_turn_id INTEGER NOT NULL,
|
|
27
|
+
user_correction_turn_id INTEGER NOT NULL,
|
|
28
|
+
recovery_tool_span_json TEXT NOT NULL,
|
|
29
|
+
diff_excerpt TEXT NOT NULL,
|
|
30
|
+
principle_ids_json TEXT NOT NULL,
|
|
31
|
+
quality_score REAL NOT NULL,
|
|
32
|
+
review_status TEXT NOT NULL,
|
|
33
|
+
export_mode TEXT NOT NULL,
|
|
34
|
+
created_at TEXT NOT NULL,
|
|
35
|
+
updated_at TEXT NOT NULL
|
|
36
|
+
);
|
|
37
|
+
CREATE TABLE sample_reviews (
|
|
38
|
+
review_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
39
|
+
sample_id TEXT NOT NULL,
|
|
40
|
+
review_status TEXT NOT NULL,
|
|
41
|
+
note TEXT,
|
|
42
|
+
created_at TEXT NOT NULL,
|
|
43
|
+
FOREIGN KEY (sample_id) REFERENCES correction_samples(sample_id)
|
|
44
|
+
);
|
|
45
|
+
`);
|
|
46
|
+
const now = '2026-06-01T00:00:00.000Z';
|
|
47
|
+
db.prepare(`
|
|
48
|
+
INSERT INTO correction_samples (sample_id, session_id, bad_assistant_turn_id, user_correction_turn_id,
|
|
49
|
+
recovery_tool_span_json, diff_excerpt, principle_ids_json, quality_score,
|
|
50
|
+
review_status, export_mode, created_at, updated_at)
|
|
51
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
52
|
+
`).run('sample-001', 'session-001', 1, 2, '{"tool":"edit"}', 'diff content', '["P0-001"]', 0.9, 'pending', 'redacted', now, now);
|
|
53
|
+
db.prepare(`
|
|
54
|
+
INSERT INTO correction_samples (sample_id, session_id, bad_assistant_turn_id, user_correction_turn_id,
|
|
55
|
+
recovery_tool_span_json, diff_excerpt, principle_ids_json, quality_score,
|
|
56
|
+
review_status, export_mode, created_at, updated_at)
|
|
57
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
58
|
+
`).run('sample-002', 'session-001', 3, 4, '{"tool":"delete"}', 'diff content 2', '["P1-001"]', 0.8, 'approved', 'raw', now, now);
|
|
59
|
+
db.prepare(`
|
|
60
|
+
INSERT INTO correction_samples (sample_id, session_id, bad_assistant_turn_id, user_correction_turn_id,
|
|
61
|
+
recovery_tool_span_json, diff_excerpt, principle_ids_json, quality_score,
|
|
62
|
+
review_status, export_mode, created_at, updated_at)
|
|
63
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
64
|
+
`).run('sample-003', 'session-002', 5, 6, '{"tool":"create"}', 'diff content 3', '[]', 0.7, 'rejected', 'redacted', now, now);
|
|
65
|
+
db.close();
|
|
66
|
+
}
|
|
67
|
+
describe('listCorrectionSamples', () => {
|
|
68
|
+
it('returns empty array when DB does not exist', () => {
|
|
69
|
+
const result = listCorrectionSamples(tmpDir);
|
|
70
|
+
expect(result).toEqual([]);
|
|
71
|
+
});
|
|
72
|
+
it('returns pending samples by default', () => {
|
|
73
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
74
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
75
|
+
setupTestDb(dbPath);
|
|
76
|
+
const result = listCorrectionSamples(tmpDir);
|
|
77
|
+
expect(result).toHaveLength(1);
|
|
78
|
+
expect(result[0]?.sampleId).toBe('sample-001');
|
|
79
|
+
expect(result[0]?.reviewStatus).toBe('pending');
|
|
80
|
+
});
|
|
81
|
+
it('returns approved samples when filtered', () => {
|
|
82
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
83
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
84
|
+
setupTestDb(dbPath);
|
|
85
|
+
const result = listCorrectionSamples(tmpDir, 'approved');
|
|
86
|
+
expect(result).toHaveLength(1);
|
|
87
|
+
expect(result[0]?.sampleId).toBe('sample-002');
|
|
88
|
+
});
|
|
89
|
+
it('returns rejected samples when filtered', () => {
|
|
90
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
91
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
92
|
+
setupTestDb(dbPath);
|
|
93
|
+
const result = listCorrectionSamples(tmpDir, 'rejected');
|
|
94
|
+
expect(result).toHaveLength(1);
|
|
95
|
+
expect(result[0]?.sampleId).toBe('sample-003');
|
|
96
|
+
});
|
|
97
|
+
it('returns samples with all expected fields', () => {
|
|
98
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
99
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
100
|
+
setupTestDb(dbPath);
|
|
101
|
+
const result = listCorrectionSamples(tmpDir);
|
|
102
|
+
const [sample] = result;
|
|
103
|
+
expect(sample?.sampleId).toBe('sample-001');
|
|
104
|
+
expect(sample?.sessionId).toBe('session-001');
|
|
105
|
+
expect(sample?.badAssistantTurnId).toBe(1);
|
|
106
|
+
expect(sample?.userCorrectionTurnId).toBe(2);
|
|
107
|
+
expect(sample?.recoveryToolSpanJson).toBe('{"tool":"edit"}');
|
|
108
|
+
expect(sample?.diffExcerpt).toBe('diff content');
|
|
109
|
+
expect(sample?.principleIdsJson).toBe('["P0-001"]');
|
|
110
|
+
expect(sample?.qualityScore).toBe(0.9);
|
|
111
|
+
expect(sample?.reviewStatus).toBe('pending');
|
|
112
|
+
expect(sample?.exportMode).toBe('redacted');
|
|
113
|
+
expect(typeof sample?.createdAt).toBe('string');
|
|
114
|
+
expect(typeof sample?.updatedAt).toBe('string');
|
|
115
|
+
});
|
|
116
|
+
it('returns empty array on database error', () => {
|
|
117
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
118
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
119
|
+
const db = new Database(dbPath);
|
|
120
|
+
db.close();
|
|
121
|
+
const result = listCorrectionSamples(tmpDir);
|
|
122
|
+
expect(result).toEqual([]);
|
|
123
|
+
});
|
|
124
|
+
it('orders by created_at DESC', () => {
|
|
125
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
126
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
127
|
+
setupTestDb(dbPath);
|
|
128
|
+
const db = new Database(dbPath);
|
|
129
|
+
db.prepare(`
|
|
130
|
+
INSERT INTO correction_samples (sample_id, session_id, bad_assistant_turn_id, user_correction_turn_id,
|
|
131
|
+
recovery_tool_span_json, diff_excerpt, principle_ids_json, quality_score,
|
|
132
|
+
review_status, export_mode, created_at, updated_at)
|
|
133
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
134
|
+
`).run('sample-004', 'session-001', 7, 8, '{"tool":"move"}', 'diff content 4', '["P0-002"]', 0.95, 'pending', 'redacted', '2026-06-02T00:00:00.000Z', '2026-06-02T00:00:00.000Z');
|
|
135
|
+
db.close();
|
|
136
|
+
const result = listCorrectionSamples(tmpDir);
|
|
137
|
+
expect(result).toHaveLength(2);
|
|
138
|
+
expect(result[0]?.sampleId).toBe('sample-004');
|
|
139
|
+
expect(result[1]?.sampleId).toBe('sample-001');
|
|
140
|
+
});
|
|
141
|
+
it('handles NULL optional fields gracefully', () => {
|
|
142
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
143
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
144
|
+
const db = new Database(dbPath);
|
|
145
|
+
db.exec(`
|
|
146
|
+
CREATE TABLE correction_samples (
|
|
147
|
+
sample_id TEXT PRIMARY KEY,
|
|
148
|
+
session_id TEXT NOT NULL,
|
|
149
|
+
bad_assistant_turn_id INTEGER NOT NULL,
|
|
150
|
+
user_correction_turn_id INTEGER NOT NULL,
|
|
151
|
+
recovery_tool_span_json TEXT,
|
|
152
|
+
diff_excerpt TEXT,
|
|
153
|
+
principle_ids_json TEXT,
|
|
154
|
+
quality_score REAL NOT NULL,
|
|
155
|
+
review_status TEXT NOT NULL,
|
|
156
|
+
export_mode TEXT NOT NULL,
|
|
157
|
+
created_at TEXT NOT NULL,
|
|
158
|
+
updated_at TEXT NOT NULL
|
|
159
|
+
);
|
|
160
|
+
`);
|
|
161
|
+
const now = '2026-06-01T00:00:00.000Z';
|
|
162
|
+
db.prepare(`
|
|
163
|
+
INSERT INTO correction_samples (sample_id, session_id, bad_assistant_turn_id, user_correction_turn_id,
|
|
164
|
+
recovery_tool_span_json, diff_excerpt, principle_ids_json, quality_score,
|
|
165
|
+
review_status, export_mode, created_at, updated_at)
|
|
166
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
167
|
+
`).run('sample-null', 'session-001', 1, 2, null, null, null, 0.5, 'pending', 'redacted', now, now);
|
|
168
|
+
db.close();
|
|
169
|
+
const result = listCorrectionSamples(tmpDir);
|
|
170
|
+
expect(result).toHaveLength(1);
|
|
171
|
+
expect(result[0]?.recoveryToolSpanJson).toBe('');
|
|
172
|
+
expect(result[0]?.diffExcerpt).toBe('');
|
|
173
|
+
expect(result[0]?.principleIdsJson).toBe('[]');
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe('reviewCorrectionSample', () => {
|
|
177
|
+
it('approves a pending sample', () => {
|
|
178
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
179
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
180
|
+
setupTestDb(dbPath);
|
|
181
|
+
const result = reviewCorrectionSample('sample-001', 'approved', 'Looks good', tmpDir);
|
|
182
|
+
expect(result.sampleId).toBe('sample-001');
|
|
183
|
+
expect(result.reviewStatus).toBe('approved');
|
|
184
|
+
const db = new Database(dbPath);
|
|
185
|
+
const row = db.prepare('SELECT review_status FROM correction_samples WHERE sample_id = ?').get('sample-001');
|
|
186
|
+
expect(row?.review_status).toBe('approved');
|
|
187
|
+
const reviewRow = db.prepare('SELECT * FROM sample_reviews WHERE sample_id = ?').get('sample-001');
|
|
188
|
+
expect(reviewRow?.review_status).toBe('approved');
|
|
189
|
+
expect(reviewRow?.note).toBe('Looks good');
|
|
190
|
+
db.close();
|
|
191
|
+
});
|
|
192
|
+
it('rejects a pending sample', () => {
|
|
193
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
194
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
195
|
+
setupTestDb(dbPath);
|
|
196
|
+
const result = reviewCorrectionSample('sample-001', 'rejected', 'Not applicable', tmpDir);
|
|
197
|
+
expect(result.sampleId).toBe('sample-001');
|
|
198
|
+
expect(result.reviewStatus).toBe('rejected');
|
|
199
|
+
const db = new Database(dbPath);
|
|
200
|
+
const row = db.prepare('SELECT review_status FROM correction_samples WHERE sample_id = ?').get('sample-001');
|
|
201
|
+
expect(row?.review_status).toBe('rejected');
|
|
202
|
+
db.close();
|
|
203
|
+
});
|
|
204
|
+
it('throws error when sample not found', () => {
|
|
205
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
206
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
207
|
+
setupTestDb(dbPath);
|
|
208
|
+
expect(() => reviewCorrectionSample('sample-unknown', 'approved', 'Note', tmpDir)).toThrow('Sample not found: sample-unknown');
|
|
209
|
+
});
|
|
210
|
+
it('throws error when DB does not exist', () => {
|
|
211
|
+
expect(() => reviewCorrectionSample('sample-001', 'approved', 'Note', tmpDir)).toThrow(/Database not found/);
|
|
212
|
+
});
|
|
213
|
+
it('updates updated_at timestamp', () => {
|
|
214
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
215
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
216
|
+
setupTestDb(dbPath);
|
|
217
|
+
const db = new Database(dbPath);
|
|
218
|
+
const before = db.prepare('SELECT updated_at FROM correction_samples WHERE sample_id = ?').get('sample-001');
|
|
219
|
+
db.close();
|
|
220
|
+
const result = reviewCorrectionSample('sample-001', 'approved', '', tmpDir);
|
|
221
|
+
const db2 = new Database(dbPath);
|
|
222
|
+
const after = db2.prepare('SELECT updated_at FROM correction_samples WHERE sample_id = ?').get('sample-001');
|
|
223
|
+
db2.close();
|
|
224
|
+
expect(result.updatedAt).toBe(after?.updated_at);
|
|
225
|
+
expect(after?.updated_at).not.toBe(before?.updated_at);
|
|
226
|
+
});
|
|
227
|
+
it('handles undefined note', () => {
|
|
228
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
229
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
230
|
+
setupTestDb(dbPath);
|
|
231
|
+
const result = reviewCorrectionSample('sample-001', 'approved', undefined, tmpDir);
|
|
232
|
+
expect(result.reviewStatus).toBe('approved');
|
|
233
|
+
const db = new Database(dbPath);
|
|
234
|
+
const reviewRow = db.prepare('SELECT note FROM sample_reviews WHERE sample_id = ?').get('sample-001');
|
|
235
|
+
expect(reviewRow?.note).toBe(null);
|
|
236
|
+
db.close();
|
|
237
|
+
});
|
|
238
|
+
it('handles empty note', () => {
|
|
239
|
+
const dbPath = join(tmpDir, '.state', '.trajectory.db');
|
|
240
|
+
mkdirSync(join(tmpDir, '.state'), { recursive: true });
|
|
241
|
+
setupTestDb(dbPath);
|
|
242
|
+
const result = reviewCorrectionSample('sample-001', 'approved', '', tmpDir);
|
|
243
|
+
expect(result.reviewStatus).toBe('approved');
|
|
244
|
+
const db = new Database(dbPath);
|
|
245
|
+
const reviewRow = db.prepare('SELECT note FROM sample_reviews WHERE sample_id = ?').get('sample-001');
|
|
246
|
+
expect(reviewRow?.note).toBe('');
|
|
247
|
+
db.close();
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
//# sourceMappingURL=trajectory-store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory-store.test.js","sourceRoot":"","sources":["../src/trajectory-store.test.ts"],"names":[],"mappings":"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"}
|