v2.16.0
Round-trip fidelity
This release makes import and round-trip lossless for what users actually export today. Driven by real June 2026 provider exports.
Fixed
- Claude branch trees preserved. The current Claude export carries
parent_message_uuid; ctk now builds the real message tree from it (with self-parent and cycle guards) instead of flattening regenerate/edit branches into one linear chain. Re-importing a new export over an old flattened import repairs the conversation in place. - No more dropped content blocks. Tool calls, tool results, thinking blocks, and
token_budgetmarkers survive Claude imports even when top-level text is present (previously all silently discarded). - OpenAI reasoning captured. ChatGPT
thoughtsandreasoning_recapparts import as structured reasoning blocks instead of vanishing. - The canonical ctk export is finally re-importable. New
CTKImporter(with auto-detect priority) makes export-then-import a true inverse; previously the file mis-routed to the gemini importer and crashed.
Added
ReasoningBlockonMessageContent: structured reasoning that round-trips through the DB and renders in markdown exports as a quoted section.- Zip import:
ctk import export.zipworks directly for Claude and ChatGPT archives. JSON is read in memory; only media members are extracted (temporarily, traversal-safe); nothing to unzip by hand. - Idempotent JSONL re-import: conversation ids derive from a content fingerprint, so re-importing the same file upserts instead of duplicating. (Pre-2.16.0 JSONL imports keep their random ids;
ctk db dedupecleans historical duplicates.) - Fidelity-matrix test locking the round-trip contract (export/reimport + DB save/load) for tree shape, media, tool calls, and reasoning.
pip install -U conversation-tk