Skip to content

fix: preserve source identity for imported sessions #2199

Description

@initiallyqq

Summary

External session imports can collapse distinct transcript files into the same imported session ID because externalImportedSessionID hashes only providerSessionID and does not include SourcePath

Claude Code subagent transcripts can inherit the parent conversation sessionId, so multiple files are not guaranteed to have unique provider session IDs. The imported identity needs to distinguish those source transcripts while preserving the intended idempotency behavior

Steps to Reproduce

  1. Use local Claude Code history containing subagent transcripts that inherit a parent sessionId
  2. Open the external conversation history import wizard and scan the local history
  3. Inspect the returned session IDs and toggle selection for one affected row

Expected Behavior

Each distinct source transcript should have a stable imported identity, and selecting or deselecting one row should affect only that transcript. React keys and import idempotency should remain deterministic

Actual Behavior

In a real local dataset, 427 transcript files collapsed into 33 imported IDs

  • For the 30-day range, the wizard displayed 769 rows but only 375 distinct session identities
  • 397 rows were duplicates of another row identity
  • Deselecting one row hid 108 rows at once
  • React key=session.id therefore received 397 duplicate keys

Environment

  • OS: Windows
  • Tutti version or commit: e7f2c4c
  • Provider/runtime involved, if any: Claude Code local transcript import, including subagent transcripts

Additional Context

The identity derivation logic was not changed by PR #2198 for issue #2060; the behavior was confirmed by comparing the base and PR trees

This should be handled separately because changing imported identity can affect idempotency and already-imported data. The fix should define the compatibility and migration behavior before changing the hash inputs

Related: #2198

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions