chore(vendor): import pi 1.3.0
Imported as a linear vendor commit so forge rebases do not replay the upstream root tree. git-subtree-dir: third_party/pi git-subtree-split: 71023aec1546d6d677a65669c5665c0927ce0dd0
This commit is contained in:
@@ -373,6 +373,42 @@ describe("findCutPoint", () => {
|
||||
expect(customFitsBudget.isSplitTurn).toBe(false);
|
||||
expect(customFitsBudget.turnStartIndex).toBe(-1);
|
||||
});
|
||||
|
||||
// Regression test for #9740.
|
||||
it("should fall back to the latest valid cut point before oversized trailing tool results", () => {
|
||||
const oldUser = createMessageEntry(createUserMessage("old history"));
|
||||
const oldAssistant = createMessageEntry(createAssistantMessage("old answer"));
|
||||
const currentUser = createMessageEntry(createUserMessage("read the large file"));
|
||||
const toolCall = createMessageEntry({
|
||||
...createAssistantMessage(""),
|
||||
content: [{ type: "toolCall", id: "call-1", name: "read", arguments: { path: "big.txt" } }],
|
||||
stopReason: "toolUse",
|
||||
});
|
||||
const toolResult = createMessageEntry({
|
||||
role: "toolResult",
|
||||
toolCallId: "call-1",
|
||||
toolName: "read",
|
||||
content: [{ type: "text", text: "x".repeat(8000) }],
|
||||
isError: false,
|
||||
timestamp: Date.now(),
|
||||
});
|
||||
const entries = [oldUser, oldAssistant, currentUser, toolCall, toolResult];
|
||||
|
||||
const result = findCutPoint(entries, 0, entries.length, 1000);
|
||||
expect(result).toEqual({
|
||||
firstKeptEntryIndex: 3,
|
||||
turnStartIndex: 2,
|
||||
isSplitTurn: true,
|
||||
});
|
||||
|
||||
const preparation = prepareCompaction(entries, {
|
||||
...DEFAULT_COMPACTION_SETTINGS,
|
||||
keepRecentTokens: 1000,
|
||||
});
|
||||
expect(preparation?.firstKeptEntryId).toBe(toolCall.id);
|
||||
expect(preparation?.messagesToSummarize).toEqual([oldUser.message, oldAssistant.message]);
|
||||
expect(preparation?.turnPrefixMessages).toEqual([currentUser.message]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("buildSessionContext", () => {
|
||||
@@ -461,6 +497,29 @@ describe("buildSessionContext", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("prepareCompaction", () => {
|
||||
it("does not treat system messages as conversation history", () => {
|
||||
const system = createMessageEntry({
|
||||
role: "system",
|
||||
content: "",
|
||||
sections: { preamble: "current prompt" },
|
||||
timestamp: Date.now(),
|
||||
});
|
||||
const user = createMessageEntry(createUserMessage("one long turn"));
|
||||
const assistant = createMessageEntry(createAssistantMessage("assistant suffix"));
|
||||
const preparation = prepareCompaction([system, user, assistant], {
|
||||
...DEFAULT_COMPACTION_SETTINGS,
|
||||
keepRecentTokens: 1,
|
||||
});
|
||||
|
||||
expect(preparation).toBeDefined();
|
||||
expect(preparation?.firstKeptEntryId).toBe(assistant.id);
|
||||
expect(preparation?.isSplitTurn).toBe(true);
|
||||
expect(preparation?.messagesToSummarize).toEqual([]);
|
||||
expect(preparation?.turnPrefixMessages).toEqual([user.message]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("prepareCompaction with previous compaction", () => {
|
||||
it("should skip repeated compactions when kept messages still fit", () => {
|
||||
const u1 = createMessageEntry(createUserMessage("user msg 1 (summarized by compaction1)"));
|
||||
|
||||
Reference in New Issue
Block a user