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:
2026-10-15 17:58:48 -04:00
parent 719370c8f7
commit 6081e3e325
1743 changed files with 205460 additions and 131705 deletions

View File

@@ -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)"));