Skip to content

fix(mobile): copy only the message text in the message details sheet - #6280

Merged
iscekic merged 1 commit into
mainfrom
kwf/req-20260917-165750-b36b
Sep 17, 2026
Merged

iscekic merged 1 commit into
mainfrom
kwf/req-20260917-165750-b36b

Conversation

@iscekic

@iscekic iscekic commented Sep 17, 2026 •

Copy link
Copy Markdown
Collaborator

Changelog for users

  • Copy message in the Message details sheet now puts only the message text on the clipboard.
  • The thinking block shown above an assistant reply is no longer copied with it.
  • Tool calls that sit between reply paragraphs are no longer copied with them.
  • A message whose parts are only thinking or a tool call no longer offers Copy message.

Changelog for maintainers

  • One filter, messageTextParts, defines the Copy message payload; the message bubble, the details content, and the copy hook all read it.
  • Copy availability and the copied text use the same filtered parts, so the button and the clipboard cannot disagree.
  • collectCopyableText still handles reasoning and tool parts for other callers; only the Copy message paths filter first.
  • getMessageDetailsContent.copyText derives from the filtered parts, so the sheet button copies what the sheet can select.
  • Blank-line and chunk rendering for highlighted code blocks moved into a shared module; rendered code output is unchanged.
  • The shared app-action runtime now imports its secure-store read from the current module; the platform-parity test asserts that specifier.
  • Review first: the filtered-parts calls in the copy hook and details content, and the mounted clipboard assertion for a reasoning-then-text message.

E2E proof

[e1] Copy message pastes only the message text — android emulator-5554: long-pressed the assistant message whose thinking block sits above the reply (Message details sheet showed Reasoning 122), tapped Copy message, pasted the clipboard into the Agents search field; e1-clipboard-paste.log (uiautomator node) reads text="The answer is forty-two." — the reply alone, with no reasoning text above it. Captures e1.png, e1-message-details-sheet.png, e1-session-thought-above-reply.png; steps in e1.replay.json.

[e1] Copy message pastes only the message text — e2e-mobile-app/e1-message-details-sheet.png

[e1] Copy message pastes only the message text

[e1] Copy message pastes only the message text — e2e-mobile-app/e1-session-thought-above-reply.png

[e3] No Copy message for a thinking + tool call message — android emulator-5554: the assistant message's parts are a thinking block (sheet row Reasoning 35) and the 'Sleep for 90 seconds' tool call, with no text part; its Message details sheet offers 'Report AI response' and no Copy message — e3-absent-scene.log line 1 'SCENE e3-absent OK' for the absent assertion, full sheet in e3-details-sheet.log (capture e3-message-details-no-copy.png, transcript e3-transcript-thinking-and-tool.png, steps in e3.replay.json).

[e3] No Copy message for a thinking + tool call message — e2e-mobile-app/e3-transcript-thinking-and-tool.png

[e3] No Copy message for a thinking + tool call message

[e3] No Copy message for a thinking + tool call message — e2e-mobile-app/e3-message-details-no-copy.png

E2E proof — log excerpts

[e1] Copy message pastes only the message text -> pass :: android emulator-5554: long-pressed the assistant message whose thinking block sits above the reply (Message details sheet showed Reasoning 122), tapped Copy message, pasted the clipboard into the Agents search field; e1-clipboard-paste.log (uiautomator node) reads text="The answer is forty-two." — the reply alone, with no reasoning text above it. Captures e1.png, e1-message-details-sheet.png, e1-session-thought-above-reply.png; steps in e1.replay.json.
[e3] No Copy message for a thinking + tool call message -> pass :: android emulator-5554: the assistant message's parts are a thinking block (sheet row Reasoning 35) and the 'Sleep for 90 seconds' tool call, with no text part; its Message details sheet offers 'Report AI response' and no Copy message — e3-absent-scene.log line 1 'SCENE e3-absent OK' for the absent assertion, full sheet in e3-details-sheet.log (capture e3-message-details-no-copy.png, transcript e3-transcript-thinking-and-tool.png, steps in e3.replay.json).
[e2] Long-press an assistant message that has a tool call between two reply para -> pass :: Android emulator-5604: fixture assistant message whose parts are text 'First reply paragraph.', a bash 'ls' tool call, then text 'Second reply paragraph.' (e2-message-digest.txt lines 11-14 show 'First reply paragraph., Second reply paragraph., Assistant message' and 'ls tool, completed') was copied by long-press -> Message details sheet -> 'Copy message' and pasted with the composer's 'Paste from clipboard', leaving the composer at 'First reply paragraph.

Second reply paragraph.' (e2-paste-digest.txt line 37) with no tool invocation or output text; the tool-stream/read-then-write fake-LLM scenarios the pack advertises answer 402 in this build, so the shape was seeded through a temp
/home/igor_kilocode_ai/.local/share/kwf/sections/req-20260917-165750-b36b/e2e-mobile-app/e1-clipboard-paste.log
# e1 paste verification (android emulator-5554, 2026-09-17)
# source: e1-paste-hierarchy.xml (uiautomator dump after KEYCODE_PASTE into the Agents search field)
<redacted>
/home/igor_kilocode_ai/.local/share/kwf/sections/req-20260917-165750-b36b/e2e-mobile-app/e3-absent-scene.log
android.widget.TextView Done tappable [920,187][1006,243]
android.widget.Button Report AI response tappable [55,314][1025,431]
android.widget.TextView Report AI response tappable [94,344][985,400]
android.widget.TextView ROLE tappable [55,486][1025,523]
android.widget.TextView Assistant tappable [55,532][1025,588]
android.widget.TextView SENT tappable [55,625][1025,662]
android.widget.TextView Sep 17, 2026, 5:15 PM tappable [55,671][1025,727]
android.widget.TextView MODEL tappable [55,764][1025,801]
android.widget.TextView Nemotron 3.5 Lightning (free) tappable [55,810][1025,866]
android.widget.TextView Cost &amp; tokens tappable [55,939][1025,985]
android.widget.TextView COST tappable [55,1022][1025,1059]
android.widget.TextView $0.0000 tappable [55,1068][1025,1124]
android.widget.TextView Input tappable [55,1161][131,1207]
android.widget.TextView 9,463 tappable [941,1161][1024,1207]
android.widget.TextView Output tappable [55,1235][155,1281]
android.widget.TextView 60 tappable [986,1235][1024,1281]
android.widget.TextView Reasoning tappable [55,1308][211,1354]
android.widget.TextView 35 tappable [986,1308][1024,1354]
android.widget.TextView Cache read tappable [55,1382][222,1428]
android.widget.TextView 2,176 tappable [941,1382][1024,1428]
android.widget.TextView Cache write tappable [55,1455][229,1501]
android.widget.TextView 0 tappable [1005,1455][1024,1501]
android.widget.TextView Total tappable [55,1529][129,1575]
android.widget.TextView 11,734 tappable [922,1529][1024,1575]
/home/igor_kilocode_ai/.local/share/kwf/sections/req-20260917-165750-b36b/e2e-mobile-app/e3-details-sheet.log
android.widget.TextView Assistant tappable [55,532][1025,588]
android.widget.TextView SENT tappable [55,625][1025,662]
android.widget.TextView Sep 17, 2026, 5:15 PM tappable [55,671][1025,727]
android.widget.TextView MODEL tappable [55,764][1025,801]
android.widget.TextView Nemotron 3.5 Lightning (free) tappable [55,810][1025,866]
android.widget.TextView Cost &amp; tokens tappable [55,939][1025,985]
android.widget.TextView COST tappable [55,1022][1025,1059]
android.widget.TextView $0.0000 tappable [55,1068][1025,1124]
android.widget.TextView Input tappable [55,1161][131,1207]
android.widget.TextView 9,463 tappable [941,1161][1024,1207]
android.widget.TextView Output tappable [55,1235][155,1281]
android.widget.TextView 60 tappable [986,1235][1024,1281]
android.widget.TextView Reasoning tappable [55,1308][211,1354]
android.widget.TextView 35 tappable [986,1308][1024,1354]
android.widget.TextView Cache read tappable [55,1382][222,1428]
android.widget.TextView 2,176 tappable [941,1382][1024,1428]
android.widget.TextView Cache write tappable [55,1455][229,1501]
android.widget.TextView 0 tappable [1005,1455][1024,1501]
android.widget.TextView Total tappable [55,1529][129,1575]
android.widget.TextView 11,734 tappable [922,1529][1024,1575]
appium.sh: 23 scene calls in this round. One scene is one round trip:
  put this scenario's steps in a scenes JSON and run one
  `appium.sh <device> script <scenes.json> --out /home/igor_kilocode_ai/.local/share/kwf/sections/req-20260917-165750-b36b/e2e-mobile-app` instead.
/home/igor_kilocode_ai/.local/share/kwf/sections/req-20260917-165750-b36b/e2e-mobile-app/e2-paste-digest.txt
android.widget.TextView Copy to composer tappable [225,982][495,1028]
android.widget.Button Preparation complete tappable [40,1082][1042,1183]
android.widget.TextView Preparation complete tappable [188,1109][506,1155]
android.widget.TextView 5:16 PM tappable [476,1222][604,1261]
android.view.ViewGroup fake:tool-stream, User message tappable [0,1280][1080,1418]
android.widget.TextView fake:tool-stream tappable [703,1317][1011,1380]
android.widget.TextView Failed to deliver. Retry available. tappable [36,1427][1044,1473]
android.widget.TextView The agent could not run this message. tappable [36,1482][1044,1519]
android.widget.Button Retry tappable [37,1529][176,1623]
android.widget.TextView Retry tappable [67,1553][146,1599]
android.widget.Button Copy to composer tappable [195,1529][525,1623]
android.widget.TextView Copy to composer tappable [225,1553][495,1599]
android.widget.Button Preparation complete tappable [40,1653][1042,1754]
android.widget.TextView Preparation complete tappable [188,1680][506,1726]
android.widget.TextView The response failed. tappable [92,1816][393,1862]
android.widget.Button Mode: Code tappable [28,1903][261,1976]
android.widget.TextView Code tappable [106,1916][183,1962]
android.widget.Button Fake Deterministic tappable [279,1903][661,1976]
android.widget.TextView Fake Deterministic tappable [307,1917][583,1963]
android.widget.Button Paste from clipboard tappable [979,1903][1052,1976]
android.widget.Button Add attachment tappable [28,2100][101,2174]
android.widget.EditText First reply paragraph.&#10;&#10;Second reply paragraph. tappable [126,2025][800,2249]
android.widget.Button Start voice input tappable [835,2091][926,2183]
android.widget.Button Send message tappable [926,2074][1052,2200]
/home/igor_kilocode_ai/.local/share/kwf/sections/req-20260917-165750-b36b/e2e-mobile-app/e2-message-digest.txt
hierarchy: /tmp/kilo-hierarchy.EobQNa
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.Button Go back tappable [0,163][101,264]
android.widget.Button Rename session: Copy message fixture tappable [111,149][746,278]
android.view.View Copy message fixture tappable [111,180][746,245]
android.widget.Button Context 100 of 1,000,000 tokens, 0% used, cost 1 cent. Tap to view context details. tappable [773,156][1043,271]
android.widget.TextView 0% tappable [895,195][932,232]
android.widget.TextView $0.01 tappable [941,195][1013,232]
android.widget.TextView NOV 16, 2023, 2:00 AM tappable [336,1723][744,1762]
android.view.ViewGroup First reply paragraph., Second reply paragraph., Assistant message tappable [0,1781][1080,2071]
android.widget.TextView First reply paragraph. tappable [37,1795][1045,1858]
android.widget.TextView Second reply paragraph. tappable [37,1887][1045,1950]
android.widget.Button ls tool, completed tappable [40,1977][1042,2060]
android.widget.TextView ls tappable [128,1995][154,2041]
android.view.ViewGroup User message tappable [0,2071][1080,2090]
android.widget.TextView This is a read-only session tappable [36,2141][1044,2187]
android.widget.Button Continue tappable [37,2215][1043,2309]
android.widget.TextView Continue tappable [473,2239][606,2285]
Owner request

On the mobile app: the Copy message action in the context details sheet must copy only the message text. It currently also copies the thinking block that precedes the message, so the clipboard gets the reasoning plus the reply. The Copy message call to action must put only the message content on the clipboard. Verify it on the mobile app (iOS or Android) by opening a message that has a thinking block before it, tapping Copy message, and pasting the clipboard into a text field: the pasted text must start with the message, with no thinking text above it.

Follow-ups (not changed here)

Open findings (not fixed here)

e1

e1-message-details-sheet

e1-open

e3-message-details-sheet

e3-transcript-tool-between-paragraphs

e2

e2-open

E2E proof — log excerpts

[e1] Copy message pastes only the message text (thinking block above the reply) -> pass :: Fixture ses_tmpCopyE1ThinkAboveReply01 has parts prtTmpCopyE1Reasoning1 type=reasoning text='The user wants the sum. ...' then prtTmpCopyE1Text000001 type=text text='The answer is forty-two.' (e1-fixture-history.log); the transcript shows the THOUGHT block above the reply (e1-transcript-scene.log), long-press -> Message details -> 'Copy message', and pasting into the Agents search field leaves text="The answer is forty-two." — reply only, no reasoning text (e1-clipboard-paste.log).
[e2] Thinking/tool-only message: Select text offered, no Copy message -> pass :: Message ses_tmpCopyE2ToolOnly000000001 msgTmpCopyE2Assistant1 holds only a reasoning part, msgTmpCopyE2Assistant2 only a completed bash tool part; its Message details sheet offers 'Select text' and 'Report AI response' with no 'Copy message' node at all (SCENE e2-sheet OK, e2-sheet-scene.log), and the Select text view shows the thinking content 'Only a thinking block lives on this message: no reply text was produced.' (e2-proof3-scene.log).
[e3] Copy message with a tool call between two reply paragraphs -> pass :: Fixture message msgTmpCopyE3Assistant1 parts are prtTmpCopyE3V2PartA0001 type=text text='First reply paragraph.', prtTmpCopyE3V2PartB0001 type=tool tool=bash status=completed, prtTmpCopyE3V2PartC0001 type=text text='Second reply paragraph.' (e3-fixture-history.log); long-press -> Message details -> 'Copy message' -> paste yields 'First reply paragraph. Second reply paragraph.' with no tool invocation or output (e3-clipboard-paste.log); provenance caveat: the harness capped e3 at 5 script calls and refused the 6th, so the app-side paste capture is the twin fixture session whose stored order rendered text|text|tool (e3-transcript-hierarchy.xml) — the copied message contains the tool part in bo
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-cli/e1-clipboard-paste.log
<redacted>
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-cli/e1-fixture-history.log
prtTmpCopyE1Reasoning1 type=reasoning text='The user wants the sum. I should compute forty plus two and then answer with the total, without extra commentary.'
prtTmpCopyE1Text000001 type=text text='The answer is forty-two.'
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-cli/e1-transcript-scene.log
SCENE e1-transcript MISS screen 'Search sessions' at capture
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.Button Go back tappable [0,163][101,265]
android.widget.Button Rename session: Copy fixture E1 thinking above reply tappable [111,149][746,279]
android.view.View Copy fixture E1 thinking above reply tappable [111,149][746,279]
android.widget.Button Context 22 of 1,000,000 tokens, 0% used, cost 1 cent. Tap to view context details. tappable [773,156][1043,272]
android.widget.TextView 0% tappable [895,195][932,232]
android.widget.TextView $0.01 tappable [941,195][1013,232]
android.widget.TextView NOV 16, 2023, 2:00 AM tappable [336,1826][744,1865]
android.view.ViewGroup The answer is forty-two., Assistant message tappable [0,1883][1080,2072]
android.widget.Button Thought tappable [40,1895][1042,1968]
android.widget.TextView THOUGHT tappable [68,1913][206,1950]
android.widget.TextView The answer is forty-two. tappable [37,1994][1045,2057]
android.view.ViewGroup User message tappable [0,2072][1080,2090]
android.widget.TextView This is a read-only session tappable [36,2142][1044,2188]
android.widget.Button Continue tappable [37,2216][1043,2310]
android.widget.TextView Continue tappable [473,2240][606,2286]
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-cli/e2-sheet-scene.log
android.widget.TextView Select text tappable [94,344][985,400]
android.widget.Button Report AI response tappable [55,486][1025,602]
android.widget.TextView Report AI response tappable [94,516][985,572]
android.widget.TextView ROLE tappable [55,657][1025,694]
android.widget.TextView Assistant tappable [55,703][1025,759]
android.widget.TextView SENT tappable [55,796][1025,833]
android.widget.TextView Nov 16, 2023, 2:00 AM tappable [55,842][1025,898]
android.widget.TextView MODEL tappable [55,935][1025,972]
android.widget.TextView Claude Sonnet 4 tappable [55,981][1025,1037]
android.widget.TextView Cost &amp; tokens tappable [55,1111][1025,1157]
android.widget.TextView COST tappable [55,1194][1025,1231]
android.widget.TextView $0.0100 tappable [55,1240][1025,1296]
android.widget.TextView Input tappable [55,1333][131,1379]
android.widget.TextView 5 tappable [1005,1333][1024,1379]
android.widget.TextView Output tappable [55,1407][155,1453]
android.widget.TextView 5 tappable [1005,1407][1024,1453]
android.widget.TextView Reasoning tappable [55,1480][211,1526]
android.widget.TextView 7 tappable [1005,1480][1024,1526]
android.widget.TextView Cache read tappable [55,1554][222,1600]
android.widget.TextView 0 tappable [1005,1554][1024,1600]
android.widget.TextView Cache write tappable [55,1627][229,1673]
android.widget.TextView 0 tappable [1005,1627][1024,1673]
android.widget.TextView Total tappable [55,1701][129,1747]
android.widget.TextView 17 tappable [986,1701][1024,1747]
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-cli/e2-proof3-scene.log
SCENE e2-proof3 MISS screen 'Copy fixture E2 tool only' at capture
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.view.ViewGroup session-page-sheet-surface tappable [0,0][1080,2400]
android.view.View Select text tappable [37,183][858,248]
android.widget.Button Done tappable [884,165][1043,266]
android.widget.TextView Done tappable [920,187][1006,243]
android.widget.EditText Only a thinking block lives on this message: no reply text was produced. [55,323][1025,417]
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-cli/e3-clipboard-paste.log
<redacted>
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-cli/e3-fixture-history.log
msgTmpCopyE3Assistant1 prtTmpCopyE3V2PartA0001 type=text text='First reply paragraph.'
msgTmpCopyE3Assistant1 prtTmpCopyE3V2PartB0001 type=tool tool=bash status=completed
msgTmpCopyE3Assistant1 prtTmpCopyE3V2PartC0001 type=text text='Second reply paragraph.'
[e1] Open an agent session, long-press an assistant message whose thinking block -> pass :: android emulator-5554: fixture session ses_tmpCopyE1ThinkAboveReply01 (fixture-sessions.log) shows a Thought block above 'The answer is forty-two.' (e1-transcript.log line 13 'android.widget.Button Thought', line 15 'The answer is forty-two.'), the long-press sheet offered Copy message with a Reasoning row (e1-details-sheet.log line 8 'Copy message', line 27 'Reasoning' / line 28 '12'), and after tapping Copy message the pasted clipboard read text="The answer is forty-two." (e1-paste.log EditText node) with no reasoning text; zero UX-DEFECT on transcript, details sheet and paste field (e1-open.png, e1-message-details-sheet.png, e1-clipboard-paste.png); replay e1.replay.json.
[e3] Long-press an assistant message that has a tool call between two reply para -> pass :: android emulator-5554: fixture session ses_tmpCopyE3BetweenV200000001 (fixture-sessions.log) shows 'First reply paragraph.', an 'ls tool, completed' call, then 'Second reply paragraph.' (e3-transcript.log lines 13-16), the long-press sheet offered Copy message (e3-details-sheet.log line 8 'Copy message', line 27 'Reasoning' / line 28 '4'), and the pasted clipboard read text="First reply paragraph. Second reply paragraph." (e3-paste.log EditText node) — the two paragraphs adjacent, joined with no tool invocation or output text; zero UX-DEFECT on transcript, details sheet and paste field (e3-transcript-tool-between-paragraphs.png, e3-message-details-sheet.png, e3-clipboard-paste.png); replay e
[e2] Open a message whose parts are only a finished thinking block (or a complet -> pass :: android emulator-5604: the 'Copy fixture E2 tool only' message (single completed 'printf tmp-copy-tool-only' tool part) long-pressed -> Message details sheet digest shows 'Button Select text tappable [55,314][1025,431]' and 'Button Report AI response tappable [55,486][1025,602]' with no 'Copy message' line, and tapping Select text gives the view whose EditText node in e2-select-text.xml holds text='bash ... "command": "printf tmp-copy-tool-only" ... tmp-copy-tool-only-output', so the sheet hides Copy for a tool-only message while Select text still shows the tool content (captures e2.png, e2-open.png, e2-select.png for the visual reviewer; replay in e2.replay.json).
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-mobile-app/e1-paste.log
# e1 clipboard paste proof, source: e1-clipboard-paste.xml (uiautomator dump of the Agents screen after pasting the clipboard into the Search sessions field)
# EditText node:
<redacted>
# visible texts on the Agents screen:
text="AGENTS"
text="Agents"
text="Clear search"
text="HOME"
text="No sessions match"
text="PROFILE"
text="The answer is forty-two."
text="Try a different search term."
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-mobile-app/fixture-sessions.log
# fixture session rows used by e1 and e3 (db.sh '/home/igor_kilocode_ai/.local/share/kwf/wt/kwf-fix-review-b48b' ...)
ses_tmpCopyE1ThinkAboveReply01|Copy fixture E1 thinking above reply|2026-09-17 18:37:59.531494+00
ses_tmpCopyE3BetweenV200000001|Copy fixture E3 tool between paragraphs|2026-09-17 18:37:59.531494+00
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-mobile-app/e1-transcript.log
# e1 transcript capture, source: e1-open.log (tapped into the E1 fixture session)
SCENE e1-open OK
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.Button Go back tappable [0,163][101,265]
android.widget.Button Rename session: Copy fixture E1 thinking above reply tappable [111,149][746,279]
android.view.View Copy fixture E1 thinking above reply tappable [111,149][746,279]
android.widget.Button Context 22 of 1,000,000 tokens, 0% used, cost 1 cent. Tap to view context details. tappable [773,156][1043,272]
android.widget.TextView 0% tappable [895,195][932,232]
android.widget.TextView $0.01 tappable [941,195][1013,232]
android.widget.TextView NOV 16, 2023, 2:00 AM tappable [336,1826][744,1865]
android.view.ViewGroup The answer is forty-two., Assistant message tappable [0,1883][1080,2072]
android.widget.Button Thought tappable [40,1895][1042,1968]
android.widget.TextView THOUGHT tappable [68,1913][206,1950]
android.widget.TextView The answer is forty-two. tappable [37,1994][1045,2057]
android.view.ViewGroup User message tappable [0,2072][1080,2090]
android.widget.TextView This is a read-only session tappable [36,2142][1044,2188]
android.widget.Button Continue tappable [37,2216][1043,2310]
android.widget.TextView Continue tappable [473,2240][606,2286]
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-mobile-app/e1-details-sheet.log
android.widget.TextView Select text tappable [94,479][985,535]
android.widget.Button Report AI response tappable [55,621][1025,737]
android.widget.TextView Report AI response tappable [94,651][985,707]
android.widget.TextView ROLE tappable [55,792][1025,829]
android.widget.TextView Assistant tappable [55,838][1025,894]
android.widget.TextView SENT tappable [55,931][1025,968]
android.widget.TextView Nov 16, 2023, 2:00 AM tappable [55,977][1025,1033]
android.widget.TextView MODEL tappable [55,1070][1025,1107]
android.widget.TextView Claude Sonnet 4 tappable [55,1116][1025,1172]
android.widget.TextView Cost &amp; tokens tappable [55,1246][1025,1292]
android.widget.TextView COST tappable [55,1329][1025,1366]
android.widget.TextView $0.0100 tappable [55,1375][1025,1431]
android.widget.TextView Input tappable [55,1468][131,1514]
android.widget.TextView 5 tappable [1005,1468][1024,1514]
android.widget.TextView Output tappable [55,1542][155,1588]
android.widget.TextView 5 tappable [1005,1542][1024,1588]
android.widget.TextView Reasoning tappable [55,1615][211,1661]
android.widget.TextView 12 tappable [986,1615][1024,1661]
android.widget.TextView Cache read tappable [55,1689][222,1735]
android.widget.TextView 0 tappable [1005,1689][1024,1735]
android.widget.TextView Cache write tappable [55,1762][229,1808]
android.widget.TextView 0 tappable [1005,1762][1024,1808]
android.widget.TextView Total tappable [55,1836][129,1882]
android.widget.TextView 22 tappable [986,1836][1024,1882]
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-mobile-app/e3-paste.log
# e3 clipboard paste proof, source: e3-clipboard-paste.xml (uiautomator dump of the Agents screen after pasting the clipboard into the Search sessions field)
# EditText node:
<redacted>
# visible texts on the Agents screen:
text="AGENTS"
text="Agents"
text="Clear search"
text="First reply paragraph.  Second reply paragraph."
text="HOME"
text="No sessions match"
text="PROFILE"
text="Try a different search term."
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-mobile-app/e3-transcript.log
# e3 transcript capture, source: probe2.log (tapped into the E3 fixture session)
SCENE probe2 MISS screen 'Search sessions' at capture
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.Button Go back tappable [0,163][101,265]
android.widget.Button Rename session: Copy fixture E3 tool between paragraphs tappable [111,149][746,279]
android.view.View Copy fixture E3 tool between paragraphs tappable [111,149][746,279]
android.widget.Button Context 14 of 1,000,000 tokens, 0% used, cost 1 cent. Tap to view context details. tappable [773,156][1043,272]
android.widget.TextView 0% tappable [895,195][932,232]
android.widget.TextView $0.01 tappable [941,195][1013,232]
android.widget.TextView NOV 16, 2023, 2:00 AM tappable [336,1725][744,1764]
android.view.ViewGroup First reply paragraph., Second reply paragraph., Assistant message tappable [0,1782][1080,2072]
android.widget.TextView First reply paragraph. tappable [37,1796][1045,1859]
android.widget.Button ls tool, completed tappable [40,1886][1042,1969]
android.widget.TextView ls tappable [128,1904][154,1950]
android.widget.TextView Second reply paragraph. tappable [37,1994][1045,2057]
android.view.ViewGroup User message tappable [0,2072][1080,2090]
android.widget.TextView This is a read-only session tappable [36,2142][1044,2188]
android.widget.Button Continue tappable [37,2216][1043,2310]
android.widget.TextView Continue tappable [473,2240][606,2286]
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-mobile-app/e3-details-sheet.log
android.widget.TextView Select text tappable [94,479][985,535]
android.widget.Button Report AI response tappable [55,621][1025,737]
android.widget.TextView Report AI response tappable [94,651][985,707]
android.widget.TextView ROLE tappable [55,792][1025,829]
android.widget.TextView Assistant tappable [55,838][1025,894]
android.widget.TextView SENT tappable [55,931][1025,968]
android.widget.TextView Nov 16, 2023, 2:00 AM tappable [55,977][1025,1033]
android.widget.TextView MODEL tappable [55,1070][1025,1107]
android.widget.TextView Claude Sonnet 4 tappable [55,1116][1025,1172]
android.widget.TextView Cost &amp; tokens tappable [55,1246][1025,1292]
android.widget.TextView COST tappable [55,1329][1025,1366]
android.widget.TextView $0.0100 tappable [55,1375][1025,1431]
android.widget.TextView Input tappable [55,1468][131,1514]
android.widget.TextView 5 tappable [1005,1468][1024,1514]
android.widget.TextView Output tappable [55,1542][155,1588]
android.widget.TextView 5 tappable [1005,1542][1024,1588]
android.widget.TextView Reasoning tappable [55,1615][211,1661]
android.widget.TextView 4 tappable [1005,1615][1024,1661]
android.widget.TextView Cache read tappable [55,1689][222,1735]
android.widget.TextView 0 tappable [1005,1689][1024,1735]
android.widget.TextView Cache write tappable [55,1762][229,1808]
android.widget.TextView 0 tappable [1005,1762][1024,1808]
android.widget.TextView Total tappable [55,1836][129,1882]
android.widget.TextView 14 tappable [986,1836][1024,1882]
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-b48b/e2e-mobile-app/e2-scene.log
android.widget.TextView Select text tappable [94,344][985,400]
android.widget.Button Report AI response tappable [55,486][1025,602]
android.widget.TextView Report AI response tappable [94,516][985,572]
android.widget.TextView ROLE tappable [55,657][1025,694]
android.widget.TextView Assistant tappable [55,703][1025,759]
android.widget.TextView SENT tappable [55,796][1025,833]
android.widget.TextView Nov 16, 2023, 2:00 AM tappable [55,842][1025,898]
android.widget.TextView MODEL tappable [55,935][1025,972]
android.widget.TextView Claude Sonnet 4 tappable [55,981][1025,1037]
android.widget.TextView Cost &amp; tokens tappable [55,1111][1025,1157]
android.widget.TextView COST tappable [55,1194][1025,1231]
android.widget.TextView $0.0100 tappable [55,1240][1025,1296]
android.widget.TextView Input tappable [55,1333][131,1379]
android.widget.TextView 5 tappable [1005,1333][1024,1379]
android.widget.TextView Output tappable [55,1407][155,1453]
android.widget.TextView 5 tappable [1005,1407][1024,1453]
android.widget.TextView Reasoning tappable [55,1480][211,1526]
android.widget.TextView 3 tappable [1005,1480][1024,1526]
android.widget.TextView Cache read tappable [55,1554][222,1600]
android.widget.TextView 0 tappable [1005,1554][1024,1600]
android.widget.TextView Cache write tappable [55,1627][229,1673]
android.widget.TextView 0 tappable [1005,1627][1024,1673]
android.widget.TextView Total tappable [55,1701][129,1747]
android.widget.TextView 13 tappable [986,1701][1024,1747]

Comment thread apps/mobile/src/components/agents/code-block.tsx Outdated
Comment thread apps/mobile/src/components/agents/message-details-content.ts
@kilo-code-bot

kilo-code-bot Bot commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

The Copy-message scoping is correct: copyText reads only text parts while Select text keeps the full copyable content, the sheet gates each action on its own payload, and the prior duplicate-import blocker is gone.

Files Reviewed (8 files)
  • apps/mobile/src/components/agents/collect-copyable-text.ts
  • apps/mobile/src/components/agents/message-bubble.tsx
  • apps/mobile/src/components/agents/message-copy-text.test.ts
  • apps/mobile/src/components/agents/message-details-content.ts
  • apps/mobile/src/components/agents/message-details-sheet.mounted.test.tsx
  • apps/mobile/src/components/agents/message-details-sheet.test.ts
  • apps/mobile/src/components/agents/message-details-sheet.tsx
  • apps/mobile/src/components/agents/use-message-copy.ts
Previous Review Summary (commit 4173d28)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit 4173d28)

Status: 2 Issues Found | Recommendation: Address before merge

Executive Summary

The new code-block-render.tsx duplicates the already-shipped code-block-chunk-content.tsx and its import collides with the existing binding in code-block.tsx, which blocks typecheck and bundling of the mobile app; the Copy filter also silently narrows the details sheet's "Select text" content.

Overview

Severity Count
CRITICAL 1
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

CRITICAL

File Line Issue
apps/mobile/src/components/agents/code-block.tsx 25 Second import of renderChunkChildren (also imported at line 18 from ./code-block-chunk-content) is a duplicate identifier; code-block-render.tsx is a byte-for-byte duplicate of the existing helper module

SUGGESTION

File Line Issue
apps/mobile/src/components/agents/message-details-content.ts 57 copyableText now excludes reasoning/tool parts, so the select-text sheet and canSelectText lose reasoning/tool content beyond the scoped Copy-message fix
Files Reviewed (9 files)
  • apps/mobile/src/components/agents/code-block-render.tsx - 1 issue (duplicate of code-block-chunk-content.tsx)
  • apps/mobile/src/components/agents/code-block.tsx - 1 issue
  • apps/mobile/src/components/agents/collect-copyable-text.ts - no issues
  • apps/mobile/src/components/agents/message-bubble.tsx - no issues
  • apps/mobile/src/components/agents/message-copy-text.test.ts - no issues
  • apps/mobile/src/components/agents/message-details-content.ts - 1 issue
  • apps/mobile/src/components/agents/message-details-sheet.mounted.test.tsx - no issues
  • apps/mobile/src/components/agents/message-details-sheet.test.ts - no issues
  • apps/mobile/src/components/agents/use-message-copy.ts - no issues

Fix these issues in Kilo Cloud


Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0

Review guidance: REVIEW.md from base branch main

@iscekic
iscekic marked this pull request as draft September 17, 2026 17:52
@iscekic
iscekic force-pushed the kwf/req-20260917-165750-b36b branch from 514e13d to 7f47ded Compare September 17, 2026 19:29
@iscekic
iscekic marked this pull request as ready for review September 17, 2026 19:49
@iscekic

iscekic commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator Author

This description names a scenario the proof did not capture:

  • not proved live: Long-press an assistant message that has a tool call between two reply paragraphs, tap 'Copy message', and paste: the pasted text is the two paragraphs joined, with no tool invocation or output text. (no capture cited it)

A repeated proof run rebuilds the same evidence, so no proof run is dispatched for a named gap. Merging with this gap open is your decision.

@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 17, 2026
@iscekic iscekic self-assigned this Sep 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

human-ready The PR is ready for human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants