|
|
@@ -28,7 +28,7 @@ describe('parseTaskIdFromTaskOutput', () => {
|
|
|
});
|
|
|
|
|
|
describe('parseContextSummaryFromTaskOutput', () => {
|
|
|
- test('parses and normalizes the last context summary block', () => {
|
|
|
+ test('parses and normalizes the final context summary block', () => {
|
|
|
const output = [
|
|
|
'<context_summary>old summary</context_summary>',
|
|
|
'<task_result>',
|
|
|
@@ -44,6 +44,31 @@ describe('parseContextSummaryFromTaskOutput', () => {
|
|
|
);
|
|
|
});
|
|
|
|
|
|
+ test('ignores context summary mentions that are not final metadata', () => {
|
|
|
+ const output = [
|
|
|
+ '<task_result>',
|
|
|
+ '<results>',
|
|
|
+ '<answer>Discusses <context_summary> syntax only.</answer>',
|
|
|
+ '</results>',
|
|
|
+ '</task_result>',
|
|
|
+ ].join('\n');
|
|
|
+
|
|
|
+ expect(parseContextSummaryFromTaskOutput(output)).toBeUndefined();
|
|
|
+ });
|
|
|
+
|
|
|
+ test('ignores context summary blocks nested inside task results', () => {
|
|
|
+ const output = [
|
|
|
+ '<task_result>',
|
|
|
+ '<results>',
|
|
|
+ '<answer>done</answer>',
|
|
|
+ '<context_summary>Nested summary should not parse.</context_summary>',
|
|
|
+ '</results>',
|
|
|
+ '</task_result>',
|
|
|
+ ].join('\n');
|
|
|
+
|
|
|
+ expect(parseContextSummaryFromTaskOutput(output)).toBeUndefined();
|
|
|
+ });
|
|
|
+
|
|
|
test('returns undefined when context block is absent or empty', () => {
|
|
|
expect(parseContextSummaryFromTaskOutput('plain output')).toBeUndefined();
|
|
|
expect(
|
|
|
@@ -53,19 +78,29 @@ describe('parseContextSummaryFromTaskOutput', () => {
|
|
|
).toBeUndefined();
|
|
|
});
|
|
|
|
|
|
- test('parses malformed trailing context summary blocks', () => {
|
|
|
+ test('parses malformed final context summary blocks', () => {
|
|
|
const output = [
|
|
|
'<task_result>',
|
|
|
'<results>',
|
|
|
'<answer>done</answer>',
|
|
|
- '<context_summary>Remember inspected session code.',
|
|
|
'</task_result>',
|
|
|
+ '<context_summary>Remember inspected session code.',
|
|
|
].join('\n');
|
|
|
|
|
|
expect(parseContextSummaryFromTaskOutput(output)).toBe(
|
|
|
'Remember inspected session code.',
|
|
|
);
|
|
|
});
|
|
|
+
|
|
|
+ test('truncates long context summaries', () => {
|
|
|
+ const longSummary = 'a'.repeat(320);
|
|
|
+
|
|
|
+ expect(
|
|
|
+ parseContextSummaryFromTaskOutput(
|
|
|
+ `<context_summary>${longSummary}</context_summary>`,
|
|
|
+ ),
|
|
|
+ ).toHaveLength(280);
|
|
|
+ });
|
|
|
});
|
|
|
|
|
|
describe('stripContextSummaryFromTaskOutput', () => {
|
|
|
@@ -90,14 +125,26 @@ describe('stripContextSummaryFromTaskOutput', () => {
|
|
|
);
|
|
|
});
|
|
|
|
|
|
- test('removes malformed trailing context summary metadata blocks', () => {
|
|
|
+ test('does not remove context summary mentions inside task results', () => {
|
|
|
+ const output = [
|
|
|
+ '<task_result>',
|
|
|
+ '<results>',
|
|
|
+ '<answer>Discusses <context_summary> syntax only.</answer>',
|
|
|
+ '</results>',
|
|
|
+ '</task_result>',
|
|
|
+ ].join('\n');
|
|
|
+
|
|
|
+ expect(stripContextSummaryFromTaskOutput(output)).toBe(output);
|
|
|
+ });
|
|
|
+
|
|
|
+ test('removes malformed final context summary metadata blocks', () => {
|
|
|
const output = [
|
|
|
'task_id: session-abc-123',
|
|
|
'<task_result>',
|
|
|
'<results>',
|
|
|
'<answer>done</answer>',
|
|
|
- '<context_summary>metadata only',
|
|
|
'</task_result>',
|
|
|
+ '<context_summary>metadata only',
|
|
|
].join('\n');
|
|
|
|
|
|
expect(stripContextSummaryFromTaskOutput(output)).toBe(
|
|
|
@@ -106,6 +153,7 @@ describe('stripContextSummaryFromTaskOutput', () => {
|
|
|
'<task_result>',
|
|
|
'<results>',
|
|
|
'<answer>done</answer>',
|
|
|
+ '</task_result>',
|
|
|
].join('\n'),
|
|
|
);
|
|
|
});
|