@principles/core 1.188.0 → 1.190.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.
- package/dist/runtime-v2/__tests__/architecture-regression.test.js +9 -0
- package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/pain-signal-observability.test.js +1 -1
- package/dist/runtime-v2/__tests__/pi-artifact-store.test.js +11 -0
- package/dist/runtime-v2/__tests__/pi-artifact-store.test.js.map +1 -1
- package/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js +15 -1
- package/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js.map +1 -1
- package/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts +2 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts.map +1 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js +62 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js.map +1 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js +12 -2
- package/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js.map +1 -1
- package/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts +2 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts.map +1 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js +56 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js.map +1 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js +8 -0
- package/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js.map +1 -1
- package/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js +20 -0
- package/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js.map +1 -1
- package/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
- package/dist/runtime-v2/activation/sqlite-activation-state-store.js +6 -0
- package/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
- package/dist/runtime-v2/activation/sqlite-approval-store.d.ts.map +1 -1
- package/dist/runtime-v2/activation/sqlite-approval-store.js +86 -32
- package/dist/runtime-v2/activation/sqlite-approval-store.js.map +1 -1
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +8 -0
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -1
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.js +23 -0
- package/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +3 -2
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +3 -1
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts +2 -0
- package/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts.map +1 -0
- package/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js +183 -0
- package/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js.map +1 -0
- package/dist/runtime-v2/intent/index.d.ts +1 -0
- package/dist/runtime-v2/intent/index.d.ts.map +1 -1
- package/dist/runtime-v2/intent/index.js +1 -0
- package/dist/runtime-v2/intent/index.js.map +1 -1
- package/dist/runtime-v2/intent/intent-decision-record.d.ts +105 -0
- package/dist/runtime-v2/intent/intent-decision-record.d.ts.map +1 -0
- package/dist/runtime-v2/intent/intent-decision-record.js +21 -0
- package/dist/runtime-v2/intent/intent-decision-record.js.map +1 -0
- package/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-observability.js +3 -2
- package/dist/runtime-v2/pain-signal-observability.js.map +1 -1
- package/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts +2 -0
- package/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts.map +1 -0
- package/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js +55 -0
- package/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js.map +1 -0
- package/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.d.ts.map +1 -1
- package/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js +6 -0
- package/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js.map +1 -1
- package/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts +2 -0
- package/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts.map +1 -0
- package/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js +207 -0
- package/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js.map +1 -0
- package/dist/runtime-v2/store/intent/index.d.ts +6 -0
- package/dist/runtime-v2/store/intent/index.d.ts.map +1 -0
- package/dist/runtime-v2/store/intent/index.js +5 -0
- package/dist/runtime-v2/store/intent/index.js.map +1 -0
- package/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts +36 -0
- package/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts.map +1 -0
- package/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js +259 -0
- package/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js.map +1 -0
- package/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts +2 -0
- package/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts.map +1 -0
- package/dist/runtime-v2/store/sqlite-connection-schema-version.test.js +72 -0
- package/dist/runtime-v2/store/sqlite-connection-schema-version.test.js.map +1 -0
- package/dist/runtime-v2/store/sqlite-connection.d.ts +11 -0
- package/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
- package/dist/runtime-v2/store/sqlite-connection.js +73 -10
- package/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SqliteIntentDecisionStore — SQLite implementation of IntentDecisionStore.
|
|
3
|
+
*
|
|
4
|
+
* PRI-470 / SPEC §21.7 durable persistence for Owner decisions on
|
|
5
|
+
* intentTension. Records are written to the `intent_decisions` table
|
|
6
|
+
* (schema created by SqliteConnection.initSchema).
|
|
7
|
+
*
|
|
8
|
+
* Idempotency (SPEC §21.7 req 4):
|
|
9
|
+
* - When `painId` is non-null: dedupe on (pain_id, intent_doc_hash, owner_action).
|
|
10
|
+
* - When `painId` is null: dedupe on (task_id, intent_doc_hash, owner_action)
|
|
11
|
+
* using the NULL-safe `IS` operator so a null intentDocHash compares equal.
|
|
12
|
+
*
|
|
13
|
+
* Snapshots (SPEC §21.7 audit boundary):
|
|
14
|
+
* - source / evidenceStrength / relatedIntentFields / evidenceRefs are stored
|
|
15
|
+
* twice: once in the live columns and once in the `_snapshot` columns. The
|
|
16
|
+
* snapshot is the immutable audit copy; the live columns mirror it at write
|
|
17
|
+
* time. This keeps the audit trail accurate even if a future migration or
|
|
18
|
+
* artifact change alters the live columns.
|
|
19
|
+
*
|
|
20
|
+
* ERR checklist:
|
|
21
|
+
* - EP-01 / ERR-001, ERR-005: DB rows treated as unknown, mapped via guards
|
|
22
|
+
* - EP-03 / ERR-002: write failures throw (fail loud)
|
|
23
|
+
* - EP-07 / ERR-015, ERR-018: idempotency SELECT reads fresh state each call
|
|
24
|
+
*/
|
|
25
|
+
import { isIntentTensionSource, isEvidenceStrength, isIntentRelatedField, isSuggestedOwnerAction, } from '../../diagnostician/diag-rootcause-output.js';
|
|
26
|
+
const MAX_EVIDENCE_REFS = 3;
|
|
27
|
+
function parseStringArray(raw) {
|
|
28
|
+
let parsed;
|
|
29
|
+
try {
|
|
30
|
+
parsed = JSON.parse(raw);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
if (!Array.isArray(parsed))
|
|
36
|
+
return [];
|
|
37
|
+
return parsed.filter((v) => typeof v === 'string');
|
|
38
|
+
}
|
|
39
|
+
// ── Row type guards (Runtime Contract Rule 2: no `as` bypass) ────────────────
|
|
40
|
+
function isRecord(v) {
|
|
41
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
42
|
+
}
|
|
43
|
+
function isIntentDecisionRow(v) {
|
|
44
|
+
if (!isRecord(v))
|
|
45
|
+
return false;
|
|
46
|
+
if (typeof v.id !== 'string')
|
|
47
|
+
return false;
|
|
48
|
+
if (v.pain_id !== null && typeof v.pain_id !== 'string')
|
|
49
|
+
return false;
|
|
50
|
+
if (typeof v.task_id !== 'string')
|
|
51
|
+
return false;
|
|
52
|
+
if (v.run_id !== null && typeof v.run_id !== 'string')
|
|
53
|
+
return false;
|
|
54
|
+
if (v.intent_doc_hash !== null && typeof v.intent_doc_hash !== 'string')
|
|
55
|
+
return false;
|
|
56
|
+
if (typeof v.source !== 'string')
|
|
57
|
+
return false;
|
|
58
|
+
if (typeof v.evidence_strength !== 'string')
|
|
59
|
+
return false;
|
|
60
|
+
if (typeof v.related_intent_fields !== 'string')
|
|
61
|
+
return false;
|
|
62
|
+
if (typeof v.owner_action !== 'string')
|
|
63
|
+
return false;
|
|
64
|
+
if (typeof v.evidence_refs !== 'string')
|
|
65
|
+
return false;
|
|
66
|
+
if (typeof v.source_snapshot !== 'string')
|
|
67
|
+
return false;
|
|
68
|
+
if (typeof v.evidence_strength_snapshot !== 'string')
|
|
69
|
+
return false;
|
|
70
|
+
if (typeof v.related_intent_fields_snapshot !== 'string')
|
|
71
|
+
return false;
|
|
72
|
+
if (typeof v.evidence_refs_snapshot !== 'string')
|
|
73
|
+
return false;
|
|
74
|
+
if (v.resulting_candidate_id !== null && typeof v.resulting_candidate_id !== 'string')
|
|
75
|
+
return false;
|
|
76
|
+
if (v.resulting_rule_candidate_id !== null && typeof v.resulting_rule_candidate_id !== 'string')
|
|
77
|
+
return false;
|
|
78
|
+
if (v.patch_proposal_id !== null && typeof v.patch_proposal_id !== 'string')
|
|
79
|
+
return false;
|
|
80
|
+
if (typeof v.created_at !== 'string')
|
|
81
|
+
return false;
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
function isSummaryRow(v) {
|
|
85
|
+
if (!isRecord(v))
|
|
86
|
+
return false;
|
|
87
|
+
if (typeof v.owner_action !== 'string')
|
|
88
|
+
return false;
|
|
89
|
+
if (typeof v.cnt !== 'number' || !Number.isFinite(v.cnt))
|
|
90
|
+
return false;
|
|
91
|
+
if (v.last_at !== null && typeof v.last_at !== 'string')
|
|
92
|
+
return false;
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
function zeroCounts() {
|
|
96
|
+
return {
|
|
97
|
+
confirm_drift: 0,
|
|
98
|
+
revise_intent: 0,
|
|
99
|
+
observe: 0,
|
|
100
|
+
dismiss: 0,
|
|
101
|
+
promote_to_principle: 0,
|
|
102
|
+
promote_to_rulehost: 0,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function mapRow(r) {
|
|
106
|
+
// Validate enum fields read from the DB (ERR-001). Snapshot columns are the
|
|
107
|
+
// auditable source of truth, so we read from them; the live column is a
|
|
108
|
+
// secondary fallback. Both are written by this store, so they should always
|
|
109
|
+
// be valid — the defaults below are defensive against DB corruption.
|
|
110
|
+
const source = isIntentTensionSource(r.source_snapshot)
|
|
111
|
+
? r.source_snapshot
|
|
112
|
+
: isIntentTensionSource(r.source)
|
|
113
|
+
? r.source
|
|
114
|
+
: 'none';
|
|
115
|
+
const evidenceStrength = isEvidenceStrength(r.evidence_strength_snapshot)
|
|
116
|
+
? r.evidence_strength_snapshot
|
|
117
|
+
: isEvidenceStrength(r.evidence_strength)
|
|
118
|
+
? r.evidence_strength
|
|
119
|
+
: 'weak';
|
|
120
|
+
const ownerAction = isSuggestedOwnerAction(r.owner_action)
|
|
121
|
+
? r.owner_action
|
|
122
|
+
: 'observe';
|
|
123
|
+
const fieldsRaw = parseStringArray(r.related_intent_fields_snapshot);
|
|
124
|
+
const relatedIntentFields = fieldsRaw.length > 0
|
|
125
|
+
? fieldsRaw.filter(isIntentRelatedField)
|
|
126
|
+
: parseStringArray(r.related_intent_fields).filter(isIntentRelatedField);
|
|
127
|
+
const evidenceRefs = parseStringArray(r.evidence_refs_snapshot);
|
|
128
|
+
const record = {
|
|
129
|
+
id: r.id,
|
|
130
|
+
source,
|
|
131
|
+
evidenceStrength,
|
|
132
|
+
relatedIntentFields,
|
|
133
|
+
ownerAction,
|
|
134
|
+
evidenceRefs,
|
|
135
|
+
createdAt: r.created_at,
|
|
136
|
+
};
|
|
137
|
+
if (r.pain_id !== null)
|
|
138
|
+
record.painId = r.pain_id;
|
|
139
|
+
if (r.run_id !== null)
|
|
140
|
+
record.runId = r.run_id;
|
|
141
|
+
if (r.intent_doc_hash !== null)
|
|
142
|
+
record.intentDocHash = r.intent_doc_hash;
|
|
143
|
+
// task_id is NOT NULL in the schema, but the type marks it optional — only
|
|
144
|
+
// surface it when it is non-empty so an empty string does not masquerade as
|
|
145
|
+
// a real lineage id.
|
|
146
|
+
if (r.task_id !== '')
|
|
147
|
+
record.taskId = r.task_id;
|
|
148
|
+
if (r.resulting_candidate_id !== null)
|
|
149
|
+
record.resultingCandidateId = r.resulting_candidate_id;
|
|
150
|
+
if (r.resulting_rule_candidate_id !== null)
|
|
151
|
+
record.resultingRuleCandidateId = r.resulting_rule_candidate_id;
|
|
152
|
+
if (r.patch_proposal_id !== null)
|
|
153
|
+
record.patchProposalId = r.patch_proposal_id;
|
|
154
|
+
return record;
|
|
155
|
+
}
|
|
156
|
+
export class SqliteIntentDecisionStore {
|
|
157
|
+
connection;
|
|
158
|
+
constructor(connection) {
|
|
159
|
+
this.connection = connection;
|
|
160
|
+
}
|
|
161
|
+
async record(input) {
|
|
162
|
+
const db = this.connection.getDb();
|
|
163
|
+
// Truncate evidence to the SPEC §22.1.2 maximum of 3 items.
|
|
164
|
+
const truncatedEvidence = input.evidenceRefs.slice(0, MAX_EVIDENCE_REFS);
|
|
165
|
+
const relatedFieldsJson = JSON.stringify(input.relatedIntentFields);
|
|
166
|
+
const evidenceRefsJson = JSON.stringify(truncatedEvidence);
|
|
167
|
+
const createdAt = new Date().toISOString();
|
|
168
|
+
// ── Idempotency check ──────────────────────────────────────────────────
|
|
169
|
+
// SPEC §21.7 req 4: same painId + intentDocHash + ownerAction must be
|
|
170
|
+
// idempotent. When painId is null, fall back to taskId-based dedupe.
|
|
171
|
+
let existing;
|
|
172
|
+
if (input.painId !== undefined) {
|
|
173
|
+
const row = db.prepare('SELECT * FROM intent_decisions WHERE pain_id = ? AND intent_doc_hash IS ? AND owner_action = ? LIMIT 1').get(input.painId, input.intentDocHash ?? null, input.ownerAction);
|
|
174
|
+
if (isIntentDecisionRow(row))
|
|
175
|
+
existing = row;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const taskId = input.taskId ?? '';
|
|
179
|
+
const row = db.prepare('SELECT * FROM intent_decisions WHERE pain_id IS NULL AND task_id = ? AND intent_doc_hash IS ? AND owner_action = ? LIMIT 1').get(taskId, input.intentDocHash ?? null, input.ownerAction);
|
|
180
|
+
if (isIntentDecisionRow(row))
|
|
181
|
+
existing = row;
|
|
182
|
+
}
|
|
183
|
+
if (existing) {
|
|
184
|
+
return { record: mapRow(existing), created: false };
|
|
185
|
+
}
|
|
186
|
+
// ── Insert ─────────────────────────────────────────────────────────────
|
|
187
|
+
db.prepare(`
|
|
188
|
+
INSERT INTO intent_decisions (
|
|
189
|
+
id, pain_id, task_id, run_id, intent_doc_hash,
|
|
190
|
+
source, evidence_strength, related_intent_fields, owner_action, evidence_refs,
|
|
191
|
+
note,
|
|
192
|
+
source_snapshot, evidence_strength_snapshot,
|
|
193
|
+
related_intent_fields_snapshot, evidence_refs_snapshot,
|
|
194
|
+
resulting_candidate_id, resulting_rule_candidate_id, patch_proposal_id,
|
|
195
|
+
created_at
|
|
196
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
197
|
+
`).run(input.id, input.painId ?? null, input.taskId ?? '', input.runId ?? null, input.intentDocHash ?? null, input.source, input.evidenceStrength, relatedFieldsJson, input.ownerAction, evidenceRefsJson, input.note ?? null,
|
|
198
|
+
// Snapshots — immutable audit copies (identical to live values at write time).
|
|
199
|
+
input.source, input.evidenceStrength, relatedFieldsJson, evidenceRefsJson, null, null, null, createdAt);
|
|
200
|
+
const record = {
|
|
201
|
+
id: input.id,
|
|
202
|
+
source: input.source,
|
|
203
|
+
evidenceStrength: input.evidenceStrength,
|
|
204
|
+
relatedIntentFields: [...input.relatedIntentFields],
|
|
205
|
+
ownerAction: input.ownerAction,
|
|
206
|
+
evidenceRefs: [...truncatedEvidence],
|
|
207
|
+
createdAt,
|
|
208
|
+
};
|
|
209
|
+
if (input.painId !== undefined)
|
|
210
|
+
record.painId = input.painId;
|
|
211
|
+
if (input.taskId !== undefined)
|
|
212
|
+
record.taskId = input.taskId;
|
|
213
|
+
if (input.runId !== undefined)
|
|
214
|
+
record.runId = input.runId;
|
|
215
|
+
if (input.intentDocHash !== undefined)
|
|
216
|
+
record.intentDocHash = input.intentDocHash;
|
|
217
|
+
return { record, created: true };
|
|
218
|
+
}
|
|
219
|
+
async getById(id) {
|
|
220
|
+
const db = this.connection.getDb();
|
|
221
|
+
const row = db.prepare('SELECT * FROM intent_decisions WHERE id = ?').get(id);
|
|
222
|
+
if (!isIntentDecisionRow(row))
|
|
223
|
+
return null;
|
|
224
|
+
return mapRow(row);
|
|
225
|
+
}
|
|
226
|
+
async listByPainId(painId) {
|
|
227
|
+
const db = this.connection.getDb();
|
|
228
|
+
const rawRows = db.prepare('SELECT * FROM intent_decisions WHERE pain_id = ? ORDER BY created_at DESC').all(painId);
|
|
229
|
+
if (!Array.isArray(rawRows))
|
|
230
|
+
return [];
|
|
231
|
+
return rawRows.filter(isIntentDecisionRow).map(mapRow);
|
|
232
|
+
}
|
|
233
|
+
async listByTaskId(taskId) {
|
|
234
|
+
const db = this.connection.getDb();
|
|
235
|
+
const rawRows = db.prepare('SELECT * FROM intent_decisions WHERE task_id = ? ORDER BY created_at DESC').all(taskId);
|
|
236
|
+
if (!Array.isArray(rawRows))
|
|
237
|
+
return [];
|
|
238
|
+
return rawRows.filter(isIntentDecisionRow).map(mapRow);
|
|
239
|
+
}
|
|
240
|
+
async getSummary() {
|
|
241
|
+
const db = this.connection.getDb();
|
|
242
|
+
const rawRows = db.prepare('SELECT owner_action, COUNT(*) AS cnt, MAX(created_at) AS last_at FROM intent_decisions GROUP BY owner_action').all();
|
|
243
|
+
if (!Array.isArray(rawRows))
|
|
244
|
+
return { counts: zeroCounts(), lastDecisionAt: null };
|
|
245
|
+
const rows = rawRows.filter(isSummaryRow);
|
|
246
|
+
const counts = zeroCounts();
|
|
247
|
+
let lastDecisionAt = null;
|
|
248
|
+
for (const row of rows) {
|
|
249
|
+
if (isSuggestedOwnerAction(row.owner_action)) {
|
|
250
|
+
counts[row.owner_action] = row.cnt;
|
|
251
|
+
}
|
|
252
|
+
if (row.last_at && (lastDecisionAt === null || row.last_at > lastDecisionAt)) {
|
|
253
|
+
lastDecisionAt = row.last_at;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return { counts, lastDecisionAt };
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=sqlite-intent-decision-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-intent-decision-store.js","sourceRoot":"","sources":["../../../../src/runtime-v2/store/intent/sqlite-intent-decision-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-connection-schema-version.test.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/store/sqlite-connection-schema-version.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as os from 'os';
|
|
5
|
+
import { SqliteConnection } from './sqlite-connection.js';
|
|
6
|
+
const tempDirs = [];
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
while (tempDirs.length) {
|
|
9
|
+
const dir = tempDirs.pop();
|
|
10
|
+
if (dir) {
|
|
11
|
+
try {
|
|
12
|
+
fs.rmSync(dir, { force: true, recursive: true });
|
|
13
|
+
}
|
|
14
|
+
catch { /* ignore cleanup errors */ }
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
function makeConnection() {
|
|
19
|
+
const dir = path.join(os.tmpdir(), `pd-schema-version-${process.pid}-${Date.now()}-${tempDirs.length}`);
|
|
20
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
21
|
+
tempDirs.push(dir);
|
|
22
|
+
return new SqliteConnection(dir);
|
|
23
|
+
}
|
|
24
|
+
describe('schema_version table (P2-10)', () => {
|
|
25
|
+
it('creates schema_version table on init', () => {
|
|
26
|
+
const conn = makeConnection();
|
|
27
|
+
conn.getDb(); // trigger initSchema
|
|
28
|
+
const tables = conn.getDb().prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='schema_version'").all();
|
|
29
|
+
expect(tables).toHaveLength(1);
|
|
30
|
+
});
|
|
31
|
+
it('returns "000" for fresh database', () => {
|
|
32
|
+
const conn = makeConnection();
|
|
33
|
+
conn.getDb();
|
|
34
|
+
expect(conn.getSchemaVersion()).toBe('000');
|
|
35
|
+
});
|
|
36
|
+
it('tracks version increments', () => {
|
|
37
|
+
const conn = makeConnection();
|
|
38
|
+
conn.getDb();
|
|
39
|
+
expect(conn.getSchemaVersion()).toBe('000');
|
|
40
|
+
conn.setSchemaVersion('001');
|
|
41
|
+
expect(conn.getSchemaVersion()).toBe('001');
|
|
42
|
+
conn.setSchemaVersion('002');
|
|
43
|
+
expect(conn.getSchemaVersion()).toBe('002');
|
|
44
|
+
});
|
|
45
|
+
it('persists version across reconnection', () => {
|
|
46
|
+
const dir = path.join(os.tmpdir(), `pd-schema-version-persist-${process.pid}-${Date.now()}`);
|
|
47
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
48
|
+
tempDirs.push(dir);
|
|
49
|
+
const conn1 = new SqliteConnection(dir);
|
|
50
|
+
conn1.getDb();
|
|
51
|
+
conn1.setSchemaVersion('003');
|
|
52
|
+
conn1.close();
|
|
53
|
+
const conn2 = new SqliteConnection(dir);
|
|
54
|
+
expect(conn2.getSchemaVersion()).toBe('003');
|
|
55
|
+
conn2.close();
|
|
56
|
+
});
|
|
57
|
+
it('does not duplicate initial "000" row on re-init', () => {
|
|
58
|
+
const dir = path.join(os.tmpdir(), `pd-schema-version-nodup-${process.pid}-${Date.now()}`);
|
|
59
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
60
|
+
tempDirs.push(dir);
|
|
61
|
+
const conn1 = new SqliteConnection(dir);
|
|
62
|
+
conn1.getDb();
|
|
63
|
+
conn1.close();
|
|
64
|
+
const conn2 = new SqliteConnection(dir);
|
|
65
|
+
conn2.getDb(); // triggers initSchema again — should not insert duplicate '000'
|
|
66
|
+
const rows = conn2.getDb().prepare('SELECT COUNT(*) as cnt FROM schema_version').all();
|
|
67
|
+
conn2.close();
|
|
68
|
+
expect(rows.length).toBe(1);
|
|
69
|
+
expect(rows[0]?.cnt).toBe(1);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=sqlite-connection-schema-version.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-connection-schema-version.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/store/sqlite-connection-schema-version.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,17 @@ export declare class SqliteConnection {
|
|
|
31
31
|
constructor(workspaceDirOrOpts: string | SqliteConnectionOptions);
|
|
32
32
|
getDb(): Database.Database;
|
|
33
33
|
getPragmaReport(): SqlitePragmaReport;
|
|
34
|
+
/**
|
|
35
|
+
* Returns the current schema version of state.db.
|
|
36
|
+
* Versions are stored as TEXT and compared lexicographically (e.g., '000' < '001').
|
|
37
|
+
* Returns '000' for fresh databases or if the table is somehow missing.
|
|
38
|
+
*/
|
|
39
|
+
getSchemaVersion(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Records a new schema version after a migration is applied.
|
|
42
|
+
* Each call inserts a new row (append-only history for audit).
|
|
43
|
+
*/
|
|
44
|
+
setSchemaVersion(version: string): void;
|
|
34
45
|
private initSchema;
|
|
35
46
|
private migrateSchema;
|
|
36
47
|
/** Closes the underlying database connection. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-connection.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/store/sqlite-connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-connection.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/store/sqlite-connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAStC,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;gBAE3B,kBAAkB,EAAE,MAAM,GAAG,uBAAuB;IAYhE,KAAK,IAAI,QAAQ,CAAC,QAAQ;IAsD1B,eAAe,IAAI,kBAAkB;IA6BrC;;;;OAIG;IACH,gBAAgB,IAAI,MAAM;IAO1B;;;OAGG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKvC,OAAO,CAAC,UAAU;IAiSlB,OAAO,CAAC,aAAa;IA+BrB,iDAAiD;IACjD,KAAK,IAAI,IAAI;CAWd"}
|
|
@@ -15,6 +15,9 @@ import Database from 'better-sqlite3';
|
|
|
15
15
|
import { join } from 'path';
|
|
16
16
|
import * as fs from 'fs';
|
|
17
17
|
import { PDRuntimeError } from '../error-categories.js';
|
|
18
|
+
function isRecord(value) {
|
|
19
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
20
|
+
}
|
|
18
21
|
export class SqliteConnection {
|
|
19
22
|
db = null;
|
|
20
23
|
dbPath;
|
|
@@ -106,6 +109,26 @@ export class SqliteConnection {
|
|
|
106
109
|
return { journalMode: 'error', busyTimeout: 0, synchronous: 'error', foreignKeys: false, healthy: false, issues: ['pragma read failed - database may be corrupted'] };
|
|
107
110
|
}
|
|
108
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Returns the current schema version of state.db.
|
|
114
|
+
* Versions are stored as TEXT and compared lexicographically (e.g., '000' < '001').
|
|
115
|
+
* Returns '000' for fresh databases or if the table is somehow missing.
|
|
116
|
+
*/
|
|
117
|
+
getSchemaVersion() {
|
|
118
|
+
const db = this.getDb();
|
|
119
|
+
const row = db.prepare('SELECT version FROM schema_version ORDER BY version DESC LIMIT 1').get();
|
|
120
|
+
if (!isRecord(row) || typeof row.version !== 'string')
|
|
121
|
+
return '000';
|
|
122
|
+
return row.version;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Records a new schema version after a migration is applied.
|
|
126
|
+
* Each call inserts a new row (append-only history for audit).
|
|
127
|
+
*/
|
|
128
|
+
setSchemaVersion(version) {
|
|
129
|
+
const db = this.getDb();
|
|
130
|
+
db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(version);
|
|
131
|
+
}
|
|
109
132
|
initSchema() {
|
|
110
133
|
const db = this.db;
|
|
111
134
|
db.exec(`
|
|
@@ -326,19 +349,59 @@ export class SqliteConnection {
|
|
|
326
349
|
db.exec('ALTER TABLE activations ADD COLUMN deactivated_at TEXT');
|
|
327
350
|
}
|
|
328
351
|
}
|
|
352
|
+
// PRI-286: confirm_first_state table is orphaned (SqliteConfirmFirstStateStore class deleted).
|
|
353
|
+
// Drop legacy table if exists; CREATE is no longer needed.
|
|
354
|
+
db.exec(`
|
|
355
|
+
DROP TABLE IF EXISTS confirm_first_state;
|
|
356
|
+
DROP INDEX IF EXISTS idx_confirm_first_state_last_seen;
|
|
357
|
+
`);
|
|
358
|
+
// PRI-470: IntentDecisionRecord durable store (SPEC §21.7).
|
|
359
|
+
// Stores immutable snapshots of source / evidenceStrength /
|
|
360
|
+
// relatedIntentFields / evidenceRefs so the audit trail stays accurate
|
|
361
|
+
// even if the underlying artifact is later modified.
|
|
329
362
|
db.exec(`
|
|
330
|
-
CREATE TABLE IF NOT EXISTS
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
363
|
+
CREATE TABLE IF NOT EXISTS intent_decisions (
|
|
364
|
+
id TEXT PRIMARY KEY,
|
|
365
|
+
pain_id TEXT,
|
|
366
|
+
task_id TEXT NOT NULL,
|
|
367
|
+
run_id TEXT,
|
|
368
|
+
intent_doc_hash TEXT,
|
|
369
|
+
source TEXT NOT NULL,
|
|
370
|
+
evidence_strength TEXT NOT NULL,
|
|
371
|
+
related_intent_fields TEXT NOT NULL,
|
|
372
|
+
owner_action TEXT NOT NULL,
|
|
373
|
+
evidence_refs TEXT NOT NULL,
|
|
374
|
+
note TEXT,
|
|
375
|
+
source_snapshot TEXT NOT NULL,
|
|
376
|
+
evidence_strength_snapshot TEXT NOT NULL,
|
|
377
|
+
related_intent_fields_snapshot TEXT NOT NULL,
|
|
378
|
+
evidence_refs_snapshot TEXT NOT NULL,
|
|
379
|
+
resulting_candidate_id TEXT,
|
|
380
|
+
resulting_rule_candidate_id TEXT,
|
|
381
|
+
patch_proposal_id TEXT,
|
|
382
|
+
created_at TEXT NOT NULL
|
|
338
383
|
);
|
|
339
|
-
CREATE INDEX IF NOT EXISTS
|
|
340
|
-
|
|
384
|
+
CREATE INDEX IF NOT EXISTS idx_intent_decisions_pain_id ON intent_decisions(pain_id);
|
|
385
|
+
CREATE INDEX IF NOT EXISTS idx_intent_decisions_task_id ON intent_decisions(task_id);
|
|
386
|
+
CREATE INDEX IF NOT EXISTS idx_intent_decisions_owner_action ON intent_decisions(owner_action);
|
|
387
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_intent_decisions_pain_hash_action
|
|
388
|
+
ON intent_decisions(pain_id, intent_doc_hash, owner_action)
|
|
389
|
+
WHERE pain_id IS NOT NULL;
|
|
341
390
|
`);
|
|
391
|
+
// P2-10: Minimal schema_version table for state.db migration tracking.
|
|
392
|
+
// core cannot import plugin's MigrationRunner (dependency direction),
|
|
393
|
+
// so this is a lightweight version that records schema version history.
|
|
394
|
+
db.exec(`
|
|
395
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
396
|
+
version TEXT NOT NULL DEFAULT '000',
|
|
397
|
+
applied_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
|
|
398
|
+
);
|
|
399
|
+
`);
|
|
400
|
+
// Seed initial version '000' if table is empty (fresh database).
|
|
401
|
+
const countRow = db.prepare('SELECT COUNT(*) as cnt FROM schema_version').get();
|
|
402
|
+
if (!isRecord(countRow) || typeof countRow.cnt !== 'number' || countRow.cnt === 0) {
|
|
403
|
+
db.prepare("INSERT INTO schema_version (version) VALUES ('000')").run();
|
|
404
|
+
}
|
|
342
405
|
}
|
|
343
406
|
migrateSchema() {
|
|
344
407
|
const db = this.db;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-connection.js","sourceRoot":"","sources":["../../../src/runtime-v2/store/sqlite-connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-connection.js","sourceRoot":"","sources":["../../../src/runtime-v2/store/sqlite-connection.ts"],"names":[],"mappings":"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"}
|