@principles/pd-cli 1.90.0 → 1.91.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/commands/build-trajectory-evidence.d.ts.map +1 -1
- package/dist/commands/build-trajectory-evidence.js +35 -0
- package/dist/commands/build-trajectory-evidence.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/build-trajectory-evidence.ts +35 -0
- package/tests/commands/build-trajectory-evidence.test.ts +107 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-trajectory-evidence.d.ts","sourceRoot":"","sources":["../../src/commands/build-trajectory-evidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,YAAY,CAAC,EAAE,MAAM,GACpB,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"build-trajectory-evidence.d.ts","sourceRoot":"","sources":["../../src/commands/build-trajectory-evidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,YAAY,CAAC,EAAE,MAAM,GACpB,iBAAiB,EAAE,CAmJrB"}
|
|
@@ -110,6 +110,41 @@ export function buildTrajectoryEvidenceFromDb(stateDir, sessionId, workspaceDir)
|
|
|
110
110
|
});
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
|
+
// PRI-358: Try to read failed tool_calls (last 3 failures, chronological order)
|
|
114
|
+
try {
|
|
115
|
+
const failedToolCalls = db.prepare(`
|
|
116
|
+
SELECT tool_name, error_type, exit_code, created_at
|
|
117
|
+
FROM (
|
|
118
|
+
SELECT tool_name, error_type, exit_code, created_at
|
|
119
|
+
FROM tool_calls
|
|
120
|
+
WHERE session_id = ? AND outcome = 'failure'
|
|
121
|
+
ORDER BY created_at DESC
|
|
122
|
+
LIMIT 3
|
|
123
|
+
)
|
|
124
|
+
ORDER BY created_at ASC
|
|
125
|
+
`).all(sessionId);
|
|
126
|
+
for (const tc of failedToolCalls) {
|
|
127
|
+
if (evidence.length >= MAX_EVIDENCE_ENTRIES)
|
|
128
|
+
break;
|
|
129
|
+
const toolName = typeof tc.tool_name === 'string' ? tc.tool_name : 'unknown';
|
|
130
|
+
const errorType = typeof tc.error_type === 'string' ? tc.error_type : 'unknown';
|
|
131
|
+
const exitCode = tc.exit_code != null ? String(tc.exit_code) : 'N/A';
|
|
132
|
+
const note = `Tool ${toolName} failed: ${errorType} (exitCode: ${exitCode})`;
|
|
133
|
+
evidence.push({
|
|
134
|
+
sourceRef: `tool_call_failure:${String(tc.created_at ?? 'unknown')}`,
|
|
135
|
+
note: sanitizeString(note.slice(0, MAX_EVIDENCE_NOTE_CHARS), workspaceDir),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// tool_calls table may not exist — degrade gracefully (only when no other evidence)
|
|
141
|
+
if (evidence.length === 0) {
|
|
142
|
+
evidence.push({
|
|
143
|
+
sourceRef: 'tool_call_failure:unavailable',
|
|
144
|
+
note: 'trajectory_tool_calls_unavailable',
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
113
148
|
// If no evidence at all from trajectory, provide a meaningful placeholder
|
|
114
149
|
if (evidence.length === 0) {
|
|
115
150
|
evidence.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-trajectory-evidence.js","sourceRoot":"","sources":["../../src/commands/build-trajectory-evidence.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"build-trajectory-evidence.js","sourceRoot":"","sources":["../../src/commands/build-trajectory-evidence.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -131,6 +131,41 @@ export function buildTrajectoryEvidenceFromDb(
|
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
+
// PRI-358: Try to read failed tool_calls (last 3 failures, chronological order)
|
|
135
|
+
try {
|
|
136
|
+
const failedToolCalls = db.prepare(`
|
|
137
|
+
SELECT tool_name, error_type, exit_code, created_at
|
|
138
|
+
FROM (
|
|
139
|
+
SELECT tool_name, error_type, exit_code, created_at
|
|
140
|
+
FROM tool_calls
|
|
141
|
+
WHERE session_id = ? AND outcome = 'failure'
|
|
142
|
+
ORDER BY created_at DESC
|
|
143
|
+
LIMIT 3
|
|
144
|
+
)
|
|
145
|
+
ORDER BY created_at ASC
|
|
146
|
+
`).all(sessionId) as Record<string, unknown>[];
|
|
147
|
+
|
|
148
|
+
for (const tc of failedToolCalls) {
|
|
149
|
+
if (evidence.length >= MAX_EVIDENCE_ENTRIES) break;
|
|
150
|
+
const toolName = typeof tc.tool_name === 'string' ? tc.tool_name : 'unknown';
|
|
151
|
+
const errorType = typeof tc.error_type === 'string' ? tc.error_type : 'unknown';
|
|
152
|
+
const exitCode = tc.exit_code != null ? String(tc.exit_code) : 'N/A';
|
|
153
|
+
const note = `Tool ${toolName} failed: ${errorType} (exitCode: ${exitCode})`;
|
|
154
|
+
evidence.push({
|
|
155
|
+
sourceRef: `tool_call_failure:${String(tc.created_at ?? 'unknown')}`,
|
|
156
|
+
note: sanitizeString(note.slice(0, MAX_EVIDENCE_NOTE_CHARS), workspaceDir),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
} catch {
|
|
160
|
+
// tool_calls table may not exist — degrade gracefully (only when no other evidence)
|
|
161
|
+
if (evidence.length === 0) {
|
|
162
|
+
evidence.push({
|
|
163
|
+
sourceRef: 'tool_call_failure:unavailable',
|
|
164
|
+
note: 'trajectory_tool_calls_unavailable',
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
134
169
|
// If no evidence at all from trajectory, provide a meaningful placeholder
|
|
135
170
|
if (evidence.length === 0) {
|
|
136
171
|
evidence.push({
|
|
@@ -61,6 +61,23 @@ function createTrajectoryDb(): Database.Database {
|
|
|
61
61
|
)
|
|
62
62
|
`);
|
|
63
63
|
|
|
64
|
+
db.exec(`
|
|
65
|
+
CREATE TABLE IF NOT EXISTS tool_calls (
|
|
66
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
67
|
+
session_id TEXT NOT NULL,
|
|
68
|
+
tool_name TEXT NOT NULL,
|
|
69
|
+
outcome TEXT NOT NULL,
|
|
70
|
+
duration_ms INTEGER,
|
|
71
|
+
exit_code INTEGER,
|
|
72
|
+
error_type TEXT,
|
|
73
|
+
error_message TEXT,
|
|
74
|
+
gfi_before REAL,
|
|
75
|
+
gfi_after REAL,
|
|
76
|
+
params_json TEXT NOT NULL DEFAULT '{}',
|
|
77
|
+
created_at TEXT NOT NULL
|
|
78
|
+
)
|
|
79
|
+
`);
|
|
80
|
+
|
|
64
81
|
return db;
|
|
65
82
|
}
|
|
66
83
|
|
|
@@ -89,6 +106,21 @@ function insertUserTurn(
|
|
|
89
106
|
`).run(sessionId, 0, rawExcerpt, correctionDetected ? 1 : 0, createdAt);
|
|
90
107
|
}
|
|
91
108
|
|
|
109
|
+
function insertToolCall(
|
|
110
|
+
db: Database.Database,
|
|
111
|
+
sessionId: string,
|
|
112
|
+
toolName: string,
|
|
113
|
+
outcome: string,
|
|
114
|
+
errorType: string | null,
|
|
115
|
+
exitCode: number | null,
|
|
116
|
+
createdAt: string,
|
|
117
|
+
): void {
|
|
118
|
+
db.prepare(`
|
|
119
|
+
INSERT INTO tool_calls (session_id, tool_name, outcome, error_type, exit_code, duration_ms, params_json, created_at)
|
|
120
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
121
|
+
`).run(sessionId, toolName, outcome, errorType, exitCode, 100, '{}', createdAt);
|
|
122
|
+
}
|
|
123
|
+
|
|
92
124
|
// ── Tests ───────────────────────────────────────────────────────────────────
|
|
93
125
|
|
|
94
126
|
describe('buildTrajectoryEvidenceFromDb — PRI-341', () => {
|
|
@@ -174,4 +206,79 @@ describe('buildTrajectoryEvidenceFromDb — PRI-341', () => {
|
|
|
174
206
|
expect(evidence.length).toBeGreaterThan(0);
|
|
175
207
|
expect(evidence[0].sourceRef).toBe('trajectory:empty');
|
|
176
208
|
});
|
|
209
|
+
|
|
210
|
+
// ── PRI-358: Failed tool_calls evidence ────────────────────────────────────
|
|
211
|
+
|
|
212
|
+
describe('PRI-358: failed tool_calls evidence', () => {
|
|
213
|
+
it('extracts failed tool_calls as evidence entries', () => {
|
|
214
|
+
const db = createTrajectoryDb();
|
|
215
|
+
insertToolCall(db, '123', 'bash', 'failure', 'non_zero_exit', 1, '2026-01-01T10:00:00Z');
|
|
216
|
+
insertToolCall(db, '123', 'write_file', 'success', null, 0, '2026-01-01T10:01:00Z');
|
|
217
|
+
insertToolCall(db, '123', 'bash', 'failure', 'timeout', 124, '2026-01-01T10:02:00Z');
|
|
218
|
+
db.close();
|
|
219
|
+
|
|
220
|
+
const evidence = buildTrajectoryEvidenceFromDb(stateDir, '123', tmpDir);
|
|
221
|
+
|
|
222
|
+
const failureEntries = evidence.filter(e => e.sourceRef.startsWith('tool_call_failure:'));
|
|
223
|
+
expect(failureEntries.length).toBe(2);
|
|
224
|
+
expect(failureEntries[0].note).toContain('bash');
|
|
225
|
+
expect(failureEntries[0].note).toContain('non_zero_exit');
|
|
226
|
+
expect(failureEntries[1].note).toContain('timeout');
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it('does not add tool_call_failure entries when no failures exist', () => {
|
|
230
|
+
const db = createTrajectoryDb();
|
|
231
|
+
insertToolCall(db, '123', 'bash', 'success', null, 0, '2026-01-01T10:00:00Z');
|
|
232
|
+
db.close();
|
|
233
|
+
|
|
234
|
+
const evidence = buildTrajectoryEvidenceFromDb(stateDir, '123', tmpDir);
|
|
235
|
+
|
|
236
|
+
const failureEntries = evidence.filter(e => e.sourceRef.startsWith('tool_call_failure:'));
|
|
237
|
+
expect(failureEntries.length).toBe(0);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it('limits failed tool_calls to 3 entries', () => {
|
|
241
|
+
const db = createTrajectoryDb();
|
|
242
|
+
insertToolCall(db, '123', 'bash', 'failure', 'err1', 1, '2026-01-01T10:00:00Z');
|
|
243
|
+
insertToolCall(db, '123', 'bash', 'failure', 'err2', 2, '2026-01-01T10:01:00Z');
|
|
244
|
+
insertToolCall(db, '123', 'bash', 'failure', 'err3', 3, '2026-01-01T10:02:00Z');
|
|
245
|
+
insertToolCall(db, '123', 'bash', 'failure', 'err4', 4, '2026-01-01T10:03:00Z');
|
|
246
|
+
db.close();
|
|
247
|
+
|
|
248
|
+
const evidence = buildTrajectoryEvidenceFromDb(stateDir, '123', tmpDir);
|
|
249
|
+
|
|
250
|
+
const failureEntries = evidence.filter(e => e.sourceRef.startsWith('tool_call_failure:'));
|
|
251
|
+
expect(failureEntries.length).toBe(3);
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
it('handles missing tool_calls table gracefully', () => {
|
|
255
|
+
// Create DB without tool_calls table
|
|
256
|
+
const dbPath = path.join(stateDir, 'trajectory.db');
|
|
257
|
+
const db = new Database(dbPath);
|
|
258
|
+
db.exec(`
|
|
259
|
+
CREATE TABLE IF NOT EXISTS sessions (session_id TEXT PRIMARY KEY, started_at TEXT, updated_at TEXT)
|
|
260
|
+
`);
|
|
261
|
+
db.exec(`
|
|
262
|
+
CREATE TABLE IF NOT EXISTS assistant_turns (
|
|
263
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL,
|
|
264
|
+
sanitized_text TEXT, created_at TEXT NOT NULL
|
|
265
|
+
)
|
|
266
|
+
`);
|
|
267
|
+
db.exec(`
|
|
268
|
+
CREATE TABLE IF NOT EXISTS user_turns (
|
|
269
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL,
|
|
270
|
+
turn_index INTEGER NOT NULL DEFAULT 0, raw_excerpt TEXT,
|
|
271
|
+
correction_detected INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL
|
|
272
|
+
)
|
|
273
|
+
`);
|
|
274
|
+
db.close();
|
|
275
|
+
|
|
276
|
+
const evidence = buildTrajectoryEvidenceFromDb(stateDir, '123', tmpDir);
|
|
277
|
+
|
|
278
|
+
// Should not throw, should have some evidence (trajectory:empty or unavailable)
|
|
279
|
+
expect(evidence.length).toBeGreaterThan(0);
|
|
280
|
+
// Should NOT have tool_call_failure:unavailable since we have no other evidence
|
|
281
|
+
// and the table simply doesn't exist (not an error condition worth reporting)
|
|
282
|
+
});
|
|
283
|
+
});
|
|
177
284
|
});
|