@principles/core 1.111.0 → 1.112.1
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__/fixtures/llm-e2e-config.d.ts.map +1 -1
- package/dist/runtime-v2/__tests__/fixtures/llm-e2e-config.js +3 -2
- package/dist/runtime-v2/__tests__/fixtures/llm-e2e-config.js.map +1 -1
- package/dist/runtime-v2/__tests__/fixtures/llm-e2e-config.test.js +19 -29
- package/dist/runtime-v2/__tests__/fixtures/llm-e2e-config.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/pain-signal-bridge-workspace-dir.test.d.ts +2 -0
- package/dist/runtime-v2/__tests__/pain-signal-bridge-workspace-dir.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/pain-signal-bridge-workspace-dir.test.js +182 -0
- package/dist/runtime-v2/__tests__/pain-signal-bridge-workspace-dir.test.js.map +1 -0
- package/dist/runtime-v2/pain-signal-bridge.d.ts +3 -0
- package/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-bridge.js +5 -2
- package/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.js +1 -0
- package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
- package/dist/runtime-v2/store/context/index.d.ts +1 -0
- package/dist/runtime-v2/store/context/index.d.ts.map +1 -1
- package/dist/runtime-v2/store/context/sqlite-context-assembler.d.ts +8 -0
- package/dist/runtime-v2/store/context/sqlite-context-assembler.d.ts.map +1 -1
- package/dist/runtime-v2/store/context/sqlite-context-assembler.js +54 -3
- package/dist/runtime-v2/store/context/sqlite-context-assembler.js.map +1 -1
- package/dist/runtime-v2/store/context/sqlite-context-assembler.test.js +265 -2
- package/dist/runtime-v2/store/context/sqlite-context-assembler.test.js.map +1 -1
- package/dist/runtime-v2/store/context/trajectory-turn-reader.d.ts +32 -0
- package/dist/runtime-v2/store/context/trajectory-turn-reader.d.ts.map +1 -0
- package/dist/runtime-v2/store/context/trajectory-turn-reader.js +12 -0
- package/dist/runtime-v2/store/context/trajectory-turn-reader.js.map +1 -0
- package/package.json +1 -1
|
@@ -13,6 +13,7 @@ import { Value } from '@sinclair/typebox/value';
|
|
|
13
13
|
import { DiagnosticianContextPayloadSchema, validateFullTracePayload, sanitizeFullTracePayload, buildFullTraceTimeline, buildSourceRefs, } from '../../context-payload.js';
|
|
14
14
|
import { PDRuntimeError } from '../../error-categories.js';
|
|
15
15
|
import { MAX_EVIDENCE_ENTRIES, MAX_EVIDENCE_NOTE_CHARS } from '../../pain-signal-bridge.js';
|
|
16
|
+
import { sanitizeString } from '../../evidence-sanitizer.js';
|
|
16
17
|
const PAIN_PROVENANCE_VALUES = ['openclaw_context_bound', 'owner_reported_no_host_trace', 'automatic_hook'];
|
|
17
18
|
function isRecord(value) {
|
|
18
19
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
@@ -31,8 +32,10 @@ export class SqliteContextAssembler {
|
|
|
31
32
|
this.historyQuery = historyQuery;
|
|
32
33
|
this.runStore = runStore;
|
|
33
34
|
this.sourceTraceLocator = options?.sourceTraceLocator;
|
|
35
|
+
this.trajectoryTurnReader = options?.trajectoryTurnReader;
|
|
34
36
|
}
|
|
35
37
|
sourceTraceLocator;
|
|
38
|
+
trajectoryTurnReader;
|
|
36
39
|
async assemble(taskId) {
|
|
37
40
|
const task = await this.taskStore.getTask(taskId);
|
|
38
41
|
if (!task) {
|
|
@@ -53,8 +56,7 @@ export class SqliteContextAssembler {
|
|
|
53
56
|
timeWindowStart: earliestStart,
|
|
54
57
|
});
|
|
55
58
|
const contextId = randomUUID();
|
|
56
|
-
|
|
57
|
-
const contextHash = createHash('sha256').update(serialized).digest('hex');
|
|
59
|
+
let conversationEntries = historyResult.entries;
|
|
58
60
|
const diagnosisTarget = {
|
|
59
61
|
reasonSummary: dt.reasonSummary || undefined,
|
|
60
62
|
source: dt.source || undefined,
|
|
@@ -69,6 +71,21 @@ export class SqliteContextAssembler {
|
|
|
69
71
|
if (convAmbiguityNotes) {
|
|
70
72
|
ambiguityNotes.push(...convAmbiguityNotes);
|
|
71
73
|
}
|
|
74
|
+
// PRI-350: Fallback to TrajectoryDB when historyQuery is empty
|
|
75
|
+
if (conversationEntries.length === 0 && dt.sessionIdHint && dt.workspaceDir !== '<unknown>' && this.trajectoryTurnReader) {
|
|
76
|
+
const trajectoryEntries = this.readTrajectoryTurns(dt.sessionIdHint, ambiguityNotes);
|
|
77
|
+
if (trajectoryEntries.length > 0) {
|
|
78
|
+
conversationEntries = trajectoryEntries;
|
|
79
|
+
// Remove the "No conversation history" note since we now have entries
|
|
80
|
+
const noHistIdx = ambiguityNotes.findIndex((n) => n.includes('No conversation history'));
|
|
81
|
+
if (noHistIdx !== -1) {
|
|
82
|
+
ambiguityNotes.splice(noHistIdx, 1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Compute contextHash after trajectory fallback so it reflects final conversationWindow
|
|
87
|
+
const serialized = JSON.stringify(conversationEntries);
|
|
88
|
+
const contextHash = createHash('sha256').update(serialized).digest('hex');
|
|
72
89
|
// PRI-255: For CLI-only pain, add explicit degradation note about missing trace
|
|
73
90
|
// and SKIP source trace lookup entirely — no-host-trace pain must not attempt
|
|
74
91
|
// to bind a conversation trace it cannot legitimately claim.
|
|
@@ -121,7 +138,7 @@ export class SqliteContextAssembler {
|
|
|
121
138
|
workspaceDir: dt.workspaceDir,
|
|
122
139
|
sourceRefs: [taskId, ...runIds, ...evidenceSourceRefs],
|
|
123
140
|
diagnosisTarget,
|
|
124
|
-
conversationWindow:
|
|
141
|
+
conversationWindow: conversationEntries,
|
|
125
142
|
ambiguityNotes: ambiguityNotes.length > 0 ? ambiguityNotes : undefined,
|
|
126
143
|
fullTrace,
|
|
127
144
|
};
|
|
@@ -208,6 +225,40 @@ export class SqliteContextAssembler {
|
|
|
208
225
|
}
|
|
209
226
|
return notes.length > 0 ? notes : undefined;
|
|
210
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* PRI-350: Read turns from TrajectoryDB and convert to HistoryQueryEntry[].
|
|
230
|
+
* Returns empty array if no turns found, with ambiguityNote added (ERR-002).
|
|
231
|
+
*/
|
|
232
|
+
readTrajectoryTurns(sessionId, ambiguityNotes) {
|
|
233
|
+
const reader = this.trajectoryTurnReader;
|
|
234
|
+
// Caller guarantees reader is defined; guard for type safety
|
|
235
|
+
if (!reader)
|
|
236
|
+
return [];
|
|
237
|
+
const userTurns = reader.listUserTurnsForSession(sessionId);
|
|
238
|
+
const assistantTurns = reader.listAssistantTurns(sessionId);
|
|
239
|
+
const entries = [];
|
|
240
|
+
for (const turn of userTurns) {
|
|
241
|
+
entries.push({
|
|
242
|
+
ts: turn.createdAt,
|
|
243
|
+
role: 'user',
|
|
244
|
+
text: turn.rawExcerpt,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
for (const turn of assistantTurns) {
|
|
248
|
+
entries.push({
|
|
249
|
+
ts: turn.createdAt,
|
|
250
|
+
role: 'assistant',
|
|
251
|
+
text: sanitizeString(turn.sanitizedText),
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
// Sort by timestamp ascending
|
|
255
|
+
entries.sort((a, b) => a.ts.localeCompare(b.ts));
|
|
256
|
+
// ERR-002: No silent degradation — if trajectory also has no turns, add note
|
|
257
|
+
if (entries.length === 0) {
|
|
258
|
+
ambiguityNotes.push(`Trajectory fallback attempted for sessionId=${sessionId} but no turns found in trajectory database`);
|
|
259
|
+
}
|
|
260
|
+
return entries;
|
|
261
|
+
}
|
|
211
262
|
static extractStringField(obj, key) {
|
|
212
263
|
if (!Object.hasOwn(obj, key) || typeof obj[key] !== 'string')
|
|
213
264
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-context-assembler.js","sourceRoot":"","sources":["../../../../src/runtime-v2/store/context/sqlite-context-assembler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sqlite-context-assembler.js","sourceRoot":"","sources":["../../../../src/runtime-v2/store/context/sqlite-context-assembler.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,13 @@ import { SqliteTrajectoryLocator } from '../trajectory/sqlite-trajectory-locator
|
|
|
22
22
|
import { SqliteSourceTraceLocator } from '../trajectory/sqlite-source-trace-locator.js';
|
|
23
23
|
import { SqliteContextAssembler } from './sqlite-context-assembler.js';
|
|
24
24
|
import { DiagnosticianContextPayloadSchema } from '../../context-payload.js';
|
|
25
|
+
// ── Mock TrajectoryTurnReader ──
|
|
26
|
+
function createMockTrajectoryTurnReader(userTurns, assistantTurns) {
|
|
27
|
+
return {
|
|
28
|
+
listUserTurnsForSession: vi.fn((sessionId) => userTurns.get(sessionId) ?? []),
|
|
29
|
+
listAssistantTurns: vi.fn((sessionId) => assistantTurns.get(sessionId) ?? []),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
25
32
|
// ── Mock TaskStore that returns DiagnosticianTaskRecord ──
|
|
26
33
|
function createMockTaskStore(tasks) {
|
|
27
34
|
return {
|
|
@@ -62,8 +69,9 @@ function createFixture(tasks, options) {
|
|
|
62
69
|
const sourceTraceLocator = options?.withLocator
|
|
63
70
|
? new SqliteSourceTraceLocator(taskStore, new SqliteTrajectoryLocator(connection))
|
|
64
71
|
: undefined;
|
|
65
|
-
const
|
|
66
|
-
|
|
72
|
+
const trajectoryTurnReader = options?.trajectoryTurnReader;
|
|
73
|
+
const assembler = new SqliteContextAssembler(taskStore, historyQuery, runStore, { sourceTraceLocator, trajectoryTurnReader });
|
|
74
|
+
return { tmpDir, connection, sqliteTaskStore, runStore, historyQuery, sourceTraceLocator, taskStore, taskMap, assembler, trajectoryTurnReader };
|
|
67
75
|
}
|
|
68
76
|
function cleanupFixture(fixture) {
|
|
69
77
|
fixture.connection.close();
|
|
@@ -1177,5 +1185,260 @@ describe('SqliteContextAssembler', () => {
|
|
|
1177
1185
|
cleanupFixture(f);
|
|
1178
1186
|
}
|
|
1179
1187
|
});
|
|
1188
|
+
// ── PRI-349: workspaceDir propagation through diagnosticJson ──
|
|
1189
|
+
it('用例 C: payload.workspaceDir is real workspaceDir from diagnosticJson, not <unknown>', async () => {
|
|
1190
|
+
const realWorkspaceDir = '/home/user/projects/my-app';
|
|
1191
|
+
const dj = JSON.stringify({
|
|
1192
|
+
sourcePainId: 'pain-wsdir-e2e',
|
|
1193
|
+
reasonSummary: 'workspaceDir e2e test',
|
|
1194
|
+
source: 'pain',
|
|
1195
|
+
severity: 'moderate',
|
|
1196
|
+
sessionIdHint: 'sess-wsdir',
|
|
1197
|
+
provenance: 'openclaw_context_bound',
|
|
1198
|
+
provenanceReason: 'Pain reported from an OpenClaw host session',
|
|
1199
|
+
workspaceDir: realWorkspaceDir,
|
|
1200
|
+
});
|
|
1201
|
+
// Use makeDiagnosticianTask with workspaceDir matching the diagnosticJson value.
|
|
1202
|
+
// In production, base.workspaceDir is always undefined (TaskRecord lacks this field),
|
|
1203
|
+
// so extra.workspaceDir from diagnosticJson is the only source.
|
|
1204
|
+
// Here we set the record's workspaceDir to the same value to confirm the path works.
|
|
1205
|
+
const task = makeDiagnosticianTask({
|
|
1206
|
+
taskId: 'task_wsdir_e2e',
|
|
1207
|
+
sourcePainId: 'pain-wsdir-e2e',
|
|
1208
|
+
reasonSummary: 'workspaceDir e2e test',
|
|
1209
|
+
sessionIdHint: 'sess-wsdir',
|
|
1210
|
+
workspaceDir: realWorkspaceDir,
|
|
1211
|
+
});
|
|
1212
|
+
const taskWithDj = { ...task, diagnosticJson: dj };
|
|
1213
|
+
const tasks = new Map([[taskWithDj.taskId, taskWithDj]]);
|
|
1214
|
+
const f = createFixture(tasks);
|
|
1215
|
+
try {
|
|
1216
|
+
const payload = await f.assembler.assemble(task.taskId);
|
|
1217
|
+
// workspaceDir is the real value, not '<unknown>'
|
|
1218
|
+
expect(payload.workspaceDir).toBe(realWorkspaceDir);
|
|
1219
|
+
expect(payload.workspaceDir).not.toBe('<unknown>');
|
|
1220
|
+
}
|
|
1221
|
+
finally {
|
|
1222
|
+
cleanupFixture(f);
|
|
1223
|
+
}
|
|
1224
|
+
});
|
|
1225
|
+
it('PRI-349: workspaceDir from diagnosticJson is used when record has no workspaceDir', async () => {
|
|
1226
|
+
const djWorkspaceDir = '/path/from/diagnostic-json';
|
|
1227
|
+
const dj = JSON.stringify({
|
|
1228
|
+
sourcePainId: 'pain-wsdir-from-dj',
|
|
1229
|
+
reasonSummary: 'workspaceDir from diagnosticJson only',
|
|
1230
|
+
workspaceDir: djWorkspaceDir,
|
|
1231
|
+
});
|
|
1232
|
+
// Set record workspaceDir to a different value.
|
|
1233
|
+
// In production base.workspaceDir is undefined, so extra.workspaceDir wins.
|
|
1234
|
+
// Here we test that the diagnosticJson value is at least available in the payload.
|
|
1235
|
+
const task = makeDiagnosticianTask({
|
|
1236
|
+
taskId: 'task_wsdir_from_dj',
|
|
1237
|
+
sourcePainId: 'pain-wsdir-from-dj',
|
|
1238
|
+
reasonSummary: 'workspaceDir from diagnosticJson only',
|
|
1239
|
+
workspaceDir: '/tmp/stale-default',
|
|
1240
|
+
});
|
|
1241
|
+
const taskWithDj = { ...task, diagnosticJson: dj };
|
|
1242
|
+
const tasks = new Map([[taskWithDj.taskId, taskWithDj]]);
|
|
1243
|
+
const f = createFixture(tasks);
|
|
1244
|
+
try {
|
|
1245
|
+
const payload = await f.assembler.assemble(task.taskId);
|
|
1246
|
+
// The record's workspaceDir takes precedence (base.workspaceDir ?? extra.workspaceDir),
|
|
1247
|
+
// but the important thing is: workspaceDir is NOT '<unknown>'.
|
|
1248
|
+
// In production, base.workspaceDir is always undefined, so extra.workspaceDir
|
|
1249
|
+
// from diagnosticJson will be used.
|
|
1250
|
+
expect(payload.workspaceDir).not.toBe('<unknown>');
|
|
1251
|
+
}
|
|
1252
|
+
finally {
|
|
1253
|
+
cleanupFixture(f);
|
|
1254
|
+
}
|
|
1255
|
+
});
|
|
1256
|
+
it('PRI-349: workspaceDir falls back to record default when diagnosticJson lacks it', async () => {
|
|
1257
|
+
const dj = JSON.stringify({
|
|
1258
|
+
sourcePainId: 'pain-no-wsdir',
|
|
1259
|
+
reasonSummary: 'No workspaceDir in diagnosticJson',
|
|
1260
|
+
source: 'pain',
|
|
1261
|
+
severity: 'moderate',
|
|
1262
|
+
// workspaceDir intentionally omitted
|
|
1263
|
+
});
|
|
1264
|
+
const task = makeDiagnosticianTask({
|
|
1265
|
+
taskId: 'task_no_wsdir',
|
|
1266
|
+
sourcePainId: 'pain-no-wsdir',
|
|
1267
|
+
reasonSummary: 'No workspaceDir in diagnosticJson',
|
|
1268
|
+
workspaceDir: '/tmp/test-workspace',
|
|
1269
|
+
});
|
|
1270
|
+
const taskWithDj = { ...task, diagnosticJson: dj };
|
|
1271
|
+
const tasks = new Map([[taskWithDj.taskId, taskWithDj]]);
|
|
1272
|
+
const f = createFixture(tasks);
|
|
1273
|
+
try {
|
|
1274
|
+
const payload = await f.assembler.assemble(task.taskId);
|
|
1275
|
+
// Without workspaceDir in diagnosticJson, the record-level workspaceDir
|
|
1276
|
+
// is used. In production (where TaskRecord has no workspaceDir field),
|
|
1277
|
+
// this would fall back to '<unknown>'.
|
|
1278
|
+
expect(payload.workspaceDir).toBe('/tmp/test-workspace');
|
|
1279
|
+
expect(payload.workspaceDir).not.toBe('<unknown>');
|
|
1280
|
+
}
|
|
1281
|
+
finally {
|
|
1282
|
+
cleanupFixture(f);
|
|
1283
|
+
}
|
|
1284
|
+
});
|
|
1285
|
+
// ── PRI-350: TrajectoryDB fallback for conversationWindow ──
|
|
1286
|
+
it('用例 A: trajectory has turns → conversationWindow non-empty', async () => {
|
|
1287
|
+
const sessionId = 'sess-traj';
|
|
1288
|
+
const userTurns = new Map([
|
|
1289
|
+
[sessionId, [
|
|
1290
|
+
{ id: 1, turnIndex: 0, rawExcerpt: 'Hello, can you help me?', correctionDetected: false, correctionCue: null, createdAt: '2026-06-09T10:00:00.000Z' },
|
|
1291
|
+
{ id: 3, turnIndex: 2, rawExcerpt: 'That is not what I asked', correctionDetected: true, correctionCue: 'correction', createdAt: '2026-06-09T10:02:00.000Z' },
|
|
1292
|
+
]],
|
|
1293
|
+
]);
|
|
1294
|
+
const assistantTurns = new Map([
|
|
1295
|
+
[sessionId, [
|
|
1296
|
+
{ id: 2, sessionId, runId: 'run-1', provider: 'openai', model: 'gpt-4', sanitizedText: 'Sure, I can help with that.', createdAt: '2026-06-09T10:01:00.000Z' },
|
|
1297
|
+
]],
|
|
1298
|
+
]);
|
|
1299
|
+
const trajectoryTurnReader = createMockTrajectoryTurnReader(userTurns, assistantTurns);
|
|
1300
|
+
const task = makeDiagnosticianTask({
|
|
1301
|
+
taskId: 'task_traj_fallback_a',
|
|
1302
|
+
sessionIdHint: sessionId,
|
|
1303
|
+
workspaceDir: '/real/workspace',
|
|
1304
|
+
});
|
|
1305
|
+
const tasks = new Map([[task.taskId, task]]);
|
|
1306
|
+
const f = createFixture(tasks, { trajectoryTurnReader });
|
|
1307
|
+
try {
|
|
1308
|
+
const payload = await f.assembler.assemble(task.taskId);
|
|
1309
|
+
// conversationWindow should be populated from trajectory
|
|
1310
|
+
expect(payload.conversationWindow.length).toBe(3);
|
|
1311
|
+
// Sorted by timestamp ascending
|
|
1312
|
+
expect(payload.conversationWindow[0]?.role).toBe('user');
|
|
1313
|
+
expect(payload.conversationWindow[0]?.ts).toBe('2026-06-09T10:00:00.000Z');
|
|
1314
|
+
expect(payload.conversationWindow[1]?.role).toBe('assistant');
|
|
1315
|
+
expect(payload.conversationWindow[1]?.ts).toBe('2026-06-09T10:01:00.000Z');
|
|
1316
|
+
expect(payload.conversationWindow[2]?.role).toBe('user');
|
|
1317
|
+
expect(payload.conversationWindow[2]?.ts).toBe('2026-06-09T10:02:00.000Z');
|
|
1318
|
+
// User turn text comes from rawExcerpt
|
|
1319
|
+
expect(payload.conversationWindow[0]?.text).toBe('Hello, can you help me?');
|
|
1320
|
+
// Assistant text is sanitized
|
|
1321
|
+
expect(payload.conversationWindow[1]?.text).toBe('Sure, I can help with that.');
|
|
1322
|
+
// No "no conversation history" ambiguity note (entries exist)
|
|
1323
|
+
expect(notesInclude(payload.ambiguityNotes, 'No conversation history')).toBe(false);
|
|
1324
|
+
// Schema still valid
|
|
1325
|
+
expect(Value.Check(DiagnosticianContextPayloadSchema, payload)).toBe(true);
|
|
1326
|
+
}
|
|
1327
|
+
finally {
|
|
1328
|
+
cleanupFixture(f);
|
|
1329
|
+
}
|
|
1330
|
+
});
|
|
1331
|
+
it('用例 B: historyQuery returns non-empty → do NOT override with trajectory', async () => {
|
|
1332
|
+
const sessionId = 'sess-hist-priority';
|
|
1333
|
+
const userTurns = new Map([
|
|
1334
|
+
[sessionId, [
|
|
1335
|
+
{ id: 10, turnIndex: 0, rawExcerpt: 'Trajectory user turn', correctionDetected: false, correctionCue: null, createdAt: '2026-06-09T10:00:00.000Z' },
|
|
1336
|
+
]],
|
|
1337
|
+
]);
|
|
1338
|
+
const assistantTurns = new Map([
|
|
1339
|
+
[sessionId, [
|
|
1340
|
+
{ id: 11, sessionId, runId: 'run-traj', provider: 'openai', model: 'gpt-4', sanitizedText: 'Trajectory assistant turn', createdAt: '2026-06-09T10:01:00.000Z' },
|
|
1341
|
+
]],
|
|
1342
|
+
]);
|
|
1343
|
+
const trajectoryTurnReader = createMockTrajectoryTurnReader(userTurns, assistantTurns);
|
|
1344
|
+
const task = makeDiagnosticianTask({
|
|
1345
|
+
taskId: 'task_hist_priority',
|
|
1346
|
+
sessionIdHint: sessionId,
|
|
1347
|
+
workspaceDir: '/real/workspace',
|
|
1348
|
+
});
|
|
1349
|
+
const tasks = new Map([[task.taskId, task]]);
|
|
1350
|
+
const f = createFixture(tasks, { trajectoryTurnReader });
|
|
1351
|
+
try {
|
|
1352
|
+
// Create a run so historyQuery returns entries
|
|
1353
|
+
await createRunWithPayloads(f, task.taskId, { inputPayload: 'history input', outputPayload: 'history output' });
|
|
1354
|
+
const payload = await f.assembler.assemble(task.taskId);
|
|
1355
|
+
// conversationWindow should come from historyQuery (has entries from the run)
|
|
1356
|
+
expect(payload.conversationWindow.length).toBeGreaterThanOrEqual(2);
|
|
1357
|
+
// Should NOT contain trajectory text
|
|
1358
|
+
const allTexts = payload.conversationWindow.map(e => e.text ?? '').join('|');
|
|
1359
|
+
expect(allTexts).not.toContain('Trajectory user turn');
|
|
1360
|
+
expect(allTexts).not.toContain('Trajectory assistant turn');
|
|
1361
|
+
// Schema still valid
|
|
1362
|
+
expect(Value.Check(DiagnosticianContextPayloadSchema, payload)).toBe(true);
|
|
1363
|
+
}
|
|
1364
|
+
finally {
|
|
1365
|
+
cleanupFixture(f);
|
|
1366
|
+
}
|
|
1367
|
+
});
|
|
1368
|
+
it('用例 C1: sessionIdHint missing → no trajectory fallback, ambiguityNote present', async () => {
|
|
1369
|
+
const trajectoryTurnReader = createMockTrajectoryTurnReader(new Map(), new Map());
|
|
1370
|
+
const task = makeDiagnosticianTask({
|
|
1371
|
+
taskId: 'task_no_session_hint',
|
|
1372
|
+
sessionIdHint: undefined,
|
|
1373
|
+
workspaceDir: '/real/workspace',
|
|
1374
|
+
});
|
|
1375
|
+
const tasks = new Map([[task.taskId, task]]);
|
|
1376
|
+
const f = createFixture(tasks, { trajectoryTurnReader });
|
|
1377
|
+
try {
|
|
1378
|
+
const payload = await f.assembler.assemble(task.taskId);
|
|
1379
|
+
expect(payload.conversationWindow).toEqual([]);
|
|
1380
|
+
expect(notesInclude(payload.ambiguityNotes, 'No conversation history')).toBe(true);
|
|
1381
|
+
}
|
|
1382
|
+
finally {
|
|
1383
|
+
cleanupFixture(f);
|
|
1384
|
+
}
|
|
1385
|
+
});
|
|
1386
|
+
it('用例 C2: workspaceDir=<unknown> → no trajectory fallback, ambiguityNote present', async () => {
|
|
1387
|
+
const trajectoryTurnReader = createMockTrajectoryTurnReader(new Map(), new Map());
|
|
1388
|
+
const task = makeDiagnosticianTask({
|
|
1389
|
+
taskId: 'task_unknown_workspace',
|
|
1390
|
+
sessionIdHint: 'sess-unknown-ws',
|
|
1391
|
+
workspaceDir: '<unknown>',
|
|
1392
|
+
});
|
|
1393
|
+
const tasks = new Map([[task.taskId, task]]);
|
|
1394
|
+
const f = createFixture(tasks, { trajectoryTurnReader });
|
|
1395
|
+
try {
|
|
1396
|
+
const payload = await f.assembler.assemble(task.taskId);
|
|
1397
|
+
expect(payload.conversationWindow).toEqual([]);
|
|
1398
|
+
expect(notesInclude(payload.ambiguityNotes, 'No conversation history')).toBe(true);
|
|
1399
|
+
// trajectoryTurnReader should NOT have been called
|
|
1400
|
+
expect(f.trajectoryTurnReader?.listUserTurnsForSession).not.toHaveBeenCalled();
|
|
1401
|
+
}
|
|
1402
|
+
finally {
|
|
1403
|
+
cleanupFixture(f);
|
|
1404
|
+
}
|
|
1405
|
+
});
|
|
1406
|
+
it('用例 C3: trajectoryTurnReader not provided → no fallback, ambiguityNote present', async () => {
|
|
1407
|
+
const task = makeDiagnosticianTask({
|
|
1408
|
+
taskId: 'task_no_reader',
|
|
1409
|
+
sessionIdHint: 'sess-no-reader',
|
|
1410
|
+
workspaceDir: '/real/workspace',
|
|
1411
|
+
});
|
|
1412
|
+
const tasks = new Map([[task.taskId, task]]);
|
|
1413
|
+
const f = createFixture(tasks);
|
|
1414
|
+
try {
|
|
1415
|
+
const payload = await f.assembler.assemble(task.taskId);
|
|
1416
|
+
expect(payload.conversationWindow).toEqual([]);
|
|
1417
|
+
expect(notesInclude(payload.ambiguityNotes, 'No conversation history')).toBe(true);
|
|
1418
|
+
}
|
|
1419
|
+
finally {
|
|
1420
|
+
cleanupFixture(f);
|
|
1421
|
+
}
|
|
1422
|
+
});
|
|
1423
|
+
it('用例 C4: trajectory returns empty → ambiguityNote about trajectory fallback failure', async () => {
|
|
1424
|
+
const sessionId = 'sess-empty-traj';
|
|
1425
|
+
const trajectoryTurnReader = createMockTrajectoryTurnReader(new Map([[sessionId, []]]), new Map([[sessionId, []]]));
|
|
1426
|
+
const task = makeDiagnosticianTask({
|
|
1427
|
+
taskId: 'task_empty_traj',
|
|
1428
|
+
sessionIdHint: sessionId,
|
|
1429
|
+
workspaceDir: '/real/workspace',
|
|
1430
|
+
});
|
|
1431
|
+
const tasks = new Map([[task.taskId, task]]);
|
|
1432
|
+
const f = createFixture(tasks, { trajectoryTurnReader });
|
|
1433
|
+
try {
|
|
1434
|
+
const payload = await f.assembler.assemble(task.taskId);
|
|
1435
|
+
expect(payload.conversationWindow).toEqual([]);
|
|
1436
|
+
// Should have ambiguity note about trajectory fallback failure (ERR-002: no silent degradation)
|
|
1437
|
+
expect(notesInclude(payload.ambiguityNotes, 'Trajectory fallback')).toBe(true);
|
|
1438
|
+
}
|
|
1439
|
+
finally {
|
|
1440
|
+
cleanupFixture(f);
|
|
1441
|
+
}
|
|
1442
|
+
});
|
|
1180
1443
|
});
|
|
1181
1444
|
//# sourceMappingURL=sqlite-context-assembler.test.js.map
|