Project

General

Profile

Actions

Bug #14

closed

Kommentall - Feature #4: Proof of concept

Showing Tree Nodes correctly on screen

Added by Tomislav Pleše about 1 month ago. Updated 29 days ago.

Status:
Closed
Priority:
Immediate
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 #1

Updated by Tomislav Pleše about 1 month ago

  • Description updated (diff)
Actions #2

Updated by Tomislav Pleše about 1 month ago

  • Description updated (diff)
Actions #3

Updated by Tomislav Pleše about 1 month ago

  • Description updated (diff)
Actions #4

Updated by Tomislav Pleše 29 days ago

  • Status changed from New to Resolved
Actions #5

Updated by Tomislav Pleše 29 days ago

  • % Done changed from 0 to 100
Actions #6

Updated by Tomislav Pleše 29 days ago

  • Status changed from Resolved to Closed
Actions

Also available in: Atom PDF