Skip to content

fix: compress linear tree chains to prevent JSON.stringify stack overflow#66

Open
fallleave001 wants to merge 3 commits into
agegr:mainfrom
fallleave001:fix/session-tree-overflow
Open

fix: compress linear tree chains to prevent JSON.stringify stack overflow#66
fallleave001 wants to merge 3 commits into
agegr:mainfrom
fallleave001:fix/session-tree-overflow

Conversation

@fallleave001

Copy link
Copy Markdown

Problem

On long linear sessions (2000+ messages), JSON.stringify(tree) in the session detail API throws Maximum call stack size exceeded because each message is a single-child node forming a deep linear chain.

Simply removing the tree field breaks BranchNavigator branch navigation.

Solution

Add a generic compressTree function that contracts linear single-child chains while preserving branch points and terminal leaves:

  • Linear chains (node has exactly 1 child): skip intermediate nodes iteratively (while loop, no stack growth) and connect the chain head directly to the tail.
  • Branch points (node has 2+ children): preserve the node and recurse on each child.
  • Leaves (node has 0 children): return as-is.

Before: Msg_1 → Msg_2 → ... → Msg_3400 (depth 3400 → stack overflow)
After: Msg_1 → Msg_3400 (depth 2 → safe)

Branch tree shape preserved:

  root → A → [branch1 → leaf1, branch2 → leaf2]
  root → [branch1 → leaf1, branch2 → leaf2]   ✅ leaves preserved

Testing

  • Tested with real 3500+ message session containing 5 branch points
  • BranchNavigator navigation works correctly
  • activeLeafId resolves to existing nodes

Notes

Supersedes PR #38 and PR #48 following reviewer feedback:

  • v1: remove tree → rejected (breaks BranchNavigator)
  • v2: recursive compress → reviewer noted leaf nodes lost
  • v3: iterative chain descent + leaf preservation → current

fallleave added 3 commits June 4, 2026 14:23
…event JSON.stringify stack overflow

Previous attempt removed the `tree` field entirely, which broke BranchNavigator.
This new approach keeps `tree` but compresses linear chains (single-child nodes
are collapsed into their parent) before serialization, reducing depth from 2000+
to the number of branching points — well within V8's ~3000 recursion limit.

Branching points (nodes with >1 children) are preserved as-is, so users with
branched sessions retain full in-session branch navigation.
@oa1mgo oa1mgo mentioned this pull request Jun 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants