Actions
Bug #14
closedKommentall - Feature #4: Proof of concept
Showing Tree Nodes correctly on screen
Start date:
11/01/2025
Due date:
11/02/2025
% Done:
100%
Estimated time:
Description
1. Submitting the First Prompt - Creating the Root Point¶
USER ACTION: Types prompt in input field and presses Send
↓
PromptInputField._handleSendRequest()
↓
HomeScreen.onPrompt(promptText)
- promptArgs = PromptArgs(currentPointId: '', parentPointId: null, isShardChild: false)
↓
HomeScreenManager.handlePrompt()
↓
ThreadManager.updateThreadMap()
↓
PointManager.createNewPoint()
- Creates Point with id == parentPointId (ROOT)
- Returns newPoint
↓
ThreadManager.updateThreadMap() [ROOT DETECTION]
- if (newPoint.id == newPoint.parentPointId)
- threadMap[newPoint.id] = newPoint
- Returns newPoint
↓
HomeScreenManager.handlePrompt()
- apiService.sendPromptToAi()
- threadMap[updatedNewPoint.id] = updatedNewPoint
- onMapUpdated()
↓
HomeScreen.onMapUpdated()
- setState()
- _flatTreeList = FlatTreeManager.buildFlatTreeList(threadMap)
↓
FlatTreeManager.buildFlatTreeList()
- Finds root points (parentPointId == id)
- _addRootPoint()
→ _addPrompt() - Creates TreeNodeModel for Prompt
→ _addResponse() - Creates TreeNodeModel for Response
- Returns List<TreeNodeModel>
↓
HomeScreen.build()
- TreeSliverThread(flatTreeList: _flatTreeList)
↓
TreeSliverThread.build()
- SliverList.builder for each node in flatTreeList
- TreeSliverItem() renders each card
↓
DISPLAY: Root Prompt + Root Response shown as cards
2. Submitting the Second Prompt - Child of Root Point¶
USER ACTION: Taps Root card to select it
↓
TreeSliverThread._handleNodeTap(node)
- onNodeSelected(node.pointId)
↓
HomeScreen.onNodeSelected(currentPointId)
- selectedPoint = threadMap[currentPointId]
- setState()
- promptArgs = PromptArgs(
currentPointId: currentPointId,
parentPointId: selectedPoint.parentPointId,
isShardChild: false
)
↓
USER ACTION: Types new prompt and presses Send
↓
PromptInputField._handleSendRequest()
↓
HomeScreen.onPrompt(promptText)
- currentPromptArgs uses the selected point's relationships
↓
HomeScreenManager.handlePrompt()
↓
ThreadManager.updateThreadMap()
↓
PointManager.createNewPoint()
- Creates Point with parentPointId = Root's id
- Returns newPoint
↓
ThreadManager.updateThreadMap() [REGULAR CHILD FLOW]
- Not root (id != parentPointId)
- Not isShardChild
- parentShardId is empty
- FLOW: Regular Point Child
↓
PointManager.updateParentPoint()
- Adds newPoint.id to parentPoint.pointChildren[]
- Updates parent in DB
- Returns updatedParentPoint
↓
ThreadManager.updateThreadMap()
- threadMap[newPoint.id] = newPoint
- threadMap[updatedParentPoint.id] = updatedParentPoint
- onMapUpdated()
↓
HomeScreen.onMapUpdated()
- _flatTreeList = FlatTreeManager.buildFlatTreeList(threadMap)
↓
FlatTreeManager.buildFlatTreeList()
- _addRootPoint()
→ _addPrompt() - Root Prompt
→ _addResponse() - Root Response
→ FOR each childId in root.pointChildren:
→ _addPointWithDescendants()
→ _addPrompt() - Child Prompt
→ _addResponse() - Child Response
↓
DISPLAY: Root cards + Second Point cards (indented)
3. Submitting Sub-Prompt - Creating Shard from Second Point¶
USER ACTION: Selects text in Second Point's Response card
↓
TreeSliverItem._buildSelectableText()
- contextMenuBuilder adds "Sub-prompt" option
↓
USER ACTION: Taps "Sub-prompt"
↓
TreeSliverItem._handleSubPrompt(selectedText, selection)
- Creates PromptArgs(
currentPointId: node.pointId,
parentPointId: node.pointId,
parentShardId: node.shardId,
isShardChild: true,
selectedText: selectedText,
startPosition: selection.start,
endPosition: selection.end
)
- prepareSubPromptInput(promptArgs)
↓
HomeScreen.prepareSubPromptInput(promptArgs)
- setState()
- this.promptArgs = promptArgs
- promptInputFieldKey.currentState.setText(selectedText)
↓
USER ACTION: Modifies text and presses Send
↓
HomeScreen.onPrompt(promptText)
- isSubPrompt = true
- currentPromptArgs = promptArgs (with isShardChild: true)
↓
HomeScreenManager.handlePrompt()
↓
ThreadManager.updateThreadMap()
↓
PointManager.createNewPoint()
- Creates Point with parentPointId = Second Point's id
- parentShardId initially null/empty
- Returns newPoint
↓
ThreadManager.updateThreadMap() [NEW SHARD CREATION FLOW]
- isShardChild == true
- selectedText != null
- FLOW: New Shard Creation
↓
ShardManager.addShardToParentPoint()
- Creates new Shard with:
→ anchor(startPosition, endPosition)
→ shardChildren = [newPoint.id]
- Adds shard to parentPoint.shardsList[]
- Updates parent in DB
- Returns updatedParentPoint
↓
ThreadManager.updateThreadMap()
- Gets parentShardId from updatedParentPoint
- updatedNewPoint = newPoint.copyWith(parentShardId: parentShardId)
- Updates newPoint in DB
- threadMap[updatedNewPoint.id] = updatedNewPoint
- threadMap[updatedParentPoint.id] = updatedParentPoint
- onMapUpdated()
↓
HomeScreen.onMapUpdated()
- _flatTreeList = FlatTreeManager.buildFlatTreeList(threadMap)
↓
FlatTreeManager.buildFlatTreeList()
- _addRootPoint()
→ _addPrompt() - Root
→ _addResponse() - Root
→ _addPointWithDescendants() - Second Point:
→ _addPrompt() - Second Point Prompt
→ _addShardSegments() - Second Point Response SPLIT:
→ Creates TreeNodeModel(nodeType: shardResponse) - Shard 1 text
→ FOR each childId in shard.shardChildren:
→ _addPointWithDescendants() - Sub-Prompt Point
→ _addPrompt() - Sub-Prompt Prompt
→ _addResponse() - Sub-Prompt Response
→ Creates TreeNodeModel(nodeType: shardResponse, isLastShard: true) - Shard 2 text
↓
DISPLAY: Root cards + Second Point Prompt + Shard-1 + Sub-Prompt cards (indented) + Shard-2
4. Submitting Prompt Under First Child of a Shard¶
USER ACTION: Taps Sub-Prompt Point card to select it
↓
TreeSliverThread._handleNodeTap(node)
- onNodeSelected(node.pointId)
↓
HomeScreen.onNodeSelected(currentPointId)
- selectedPoint = threadMap[currentPointId]
- setState()
- promptArgs = PromptArgs(
currentPointId: currentPointId,
parentPointId: selectedPoint.parentPointId, // Second Point's id
parentShardId: selectedPoint.parentShardId, // Shard-1's id
isShardChild: false
)
↓
USER ACTION: Types new prompt and presses Send
↓
HomeScreen.onPrompt(promptText)
- isSubPrompt = false
- currentPromptArgs uses selected point's relationships
↓
HomeScreenManager.handlePrompt()
↓
ThreadManager.updateThreadMap()
↓
PointManager.createNewPoint()
- Creates Point with:
→ parentPointId = Second Point's id
→ parentShardId = Shard-1's id (from promptArgs)
- Returns newPoint
↓
ThreadManager.updateThreadMap() [EXISTING SHARD CHILD FLOW]
- Not isShardChild (false)
- parentShardId != null and NOT empty
- FLOW: Existing Shard Child
↓
ThreadManager.addChildToExistingShard()
- Finds shard in parentPoint.shardsList where shardId == parentShardId
- Adds newPoint.id to shard.shardChildren[]
- Creates updatedShard with new child
- Updates parentPoint.shardsList[]
- Updates parent in DB
- Returns updatedParentPoint
↓
ThreadManager.updateThreadMap()
- threadMap[newPoint.id] = newPoint
- threadMap[updatedParentPoint.id] = updatedParentPoint
- onMapUpdated()
↓
HomeScreen.onMapUpdated()
- _flatTreeList = FlatTreeManager.buildFlatTreeList(threadMap)
↓
FlatTreeManager.buildFlatTreeList()
- _addRootPoint()
→ Second Point has shardsList
→ _addShardSegments():
→ Shard-1 TreeNodeModel
→ FOR each childId in Shard-1.shardChildren:
→ _addPointWithDescendants() - Sub-Prompt Point (original)
→ _addPointWithDescendants() - NEW Point (sibling):
→ _addPrompt() - NEW Prompt
→ _addResponse() - NEW Response
→ Shard-2 TreeNodeModel
↓
DISPLAY: All previous cards + NEW Point cards (same level as Sub-Prompt, under Shard-1)
Key Class Responsibilities Summary:¶
| Class | Method | Responsibility |
|---|---|---|
| PromptInputField | _handleSendRequest() | Validates and sends prompt text |
| HomeScreen | onPrompt() | Determines prompt flow (root/child/subprompt) |
| HomeScreen | onNodeSelected() | Updates promptArgs when user selects a node |
| HomeScreen | prepareSubPromptInput() | Prepares input for sub-prompt (sharding) |
| HomeScreenManager | handlePrompt() | Orchestrates prompt handling and API calls |
| ThreadManager | updateThreadMap() | Routes to correct flow (root/child/shard/existing) |
| PointManager | createNewPoint() | Creates new Point with correct relationships |
| ShardManager | addShardToParentPoint() | Creates new shard with anchor |
| ThreadManager | addChildToExistingShard() | Adds child to existing shard |
| FlatTreeManager | buildFlatTreeList() | Converts threadMap to flat list of TreeNodeModel |
| FlatTreeManager | _addShardSegments() | Splits response into shard segments |
| TreeSliverThread | build() | Renders list of TreeSliverItems |
| TreeSliverItem | build() | Renders individual card (Prompt or Response) |
| TreeSliverItem | _handleSubPrompt() | Initiates sub-prompt creation flow |
Actions