* Add Pi extension-launch plumbing for in-process tree primitives
* Add Rewind controls for agent sessions
* Preserve SDK checkpoint env var so Claude file rewind works
The SDK injects CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING=true when file checkpointing is enabled. The earlier parent-env stripping from c4782ec71c was too broad and removed that child flag along with real parent-session markers.
Keep stripping parent markers, but preserve the checkpoint flag so the SDK rewind path can run directly. With that boundary fixed, the JSONL file-rewind fallback is no longer needed.
* Update OpenCode history replay tests for rewind state
* Show Rewind actions in an adaptive sheet
* Fix rewind semantics across providers
* Refactor Pi IDs through extension capture
* Restore user message to composer after rewind
* Fix Claude rewind tool result mapping
* Fix Claude rewind session switch roundtrip
* Fix rewind and optimistic message regressions
* Tighten rewind test discipline
* Fix OpenCode optimistic message reconciliation
* Reconcile optimistic user messages by marker
* Reorder user message actions
* Unify provider user message contract
* Add Claude rewind flow Playwright contract
* Add Codex rewind flow Playwright contract
* Add OpenCode rewind flow Playwright contract
* Add Pi rewind flow Playwright contract
* Remove real-provider rewind Playwright contracts
* Gate real-provider rewind specs from CI Playwright
32 lines
1.0 KiB
TypeScript
32 lines
1.0 KiB
TypeScript
import { describe, expect, test } from "vitest";
|
|
import { restoreComposerTextIfEmpty } from "./composer-restore";
|
|
import { shouldRestoreComposerForRewindMode } from "./rewind-mode";
|
|
|
|
describe("restoreComposerTextIfEmpty", () => {
|
|
test("restores the rewound message when the composer is empty", () => {
|
|
expect(
|
|
restoreComposerTextIfEmpty({
|
|
currentText: "",
|
|
rewoundText: "message before rewind",
|
|
}),
|
|
).toBe("message before rewind");
|
|
});
|
|
|
|
test("preserves an existing composer draft", () => {
|
|
expect(
|
|
restoreComposerTextIfEmpty({
|
|
currentText: "keep this draft",
|
|
rewoundText: "message before rewind",
|
|
}),
|
|
).toBe("keep this draft");
|
|
});
|
|
});
|
|
|
|
describe("shouldRestoreComposerForRewindMode", () => {
|
|
test("restores only conversation-mutating rewind modes", () => {
|
|
expect(shouldRestoreComposerForRewindMode("conversation")).toBe(true);
|
|
expect(shouldRestoreComposerForRewindMode("files")).toBe(false);
|
|
expect(shouldRestoreComposerForRewindMode("both")).toBe(true);
|
|
});
|
|
});
|