Skip to content

feat(mobile): adapt agent composers for keyboard, height, and preferences - #5617

Merged
iscekic merged 27 commits into
agent-composers-c07a-s5from
agent-composers-c07a-s6
Aug 28, 2026
Merged

feat(mobile): adapt agent composers for keyboard, height, and preferences#5617
iscekic merged 27 commits into
agent-composers-c07a-s5from
agent-composers-c07a-s6

Conversation

@iscekic

@iscekic iscekic commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Message fields now grow with your draft and adjust to the keyboard, screen space, and your text-size setting.
  • Return still adds a line break by default. A new Preferences choice makes Return send chat messages or start sessions instead. A separate newline button preserves line breaks at the cursor when you enable this choice.
  • Opening the keyboard keeps the latest message in view when you are already at the bottom. Reading older messages keeps your position.
  • Empty message fields offer ideas for features, bug fixes, and tests. Chats also offer a suggestion for starting, preparing, or finishing a session. Choosing a suggestion fills and focuses the field without sending.
  • A counter shows how many characters you can still add, including after a saved prompt returns.
  • Send, Stop, newline, and suggestion buttons provide touch areas sized for iOS and Android.
  • With Reduce Motion enabled, the chat toolbar and command suggestions appear and disappear without animation.
  • When you restore a canceled message's files, they replace your current attachments instead of joining them.
  • When the app cannot remove private photo details, the new-session screen shows a warning that screen readers can announce.
  • The new suggestions, counter labels, newline control, and Return preference include translations for every supported language.

Scope: 112 files, 2,296 insertions, and 249 deletions. Each file entry gives its status, class, and size in added-plus-removed lines.

Status: A = added; M = modified. Classes: 18 Source files, 8 Test files, and 86 Generated bundled translation assets.

restoreFileParts replaces the current attachment set rather than appending, so restoring a canceled message preserves its own file set and limit. It cancels displaced uploads and invalidates pending work, preventing late results from changing the replacement set. CancelQueuedRestoreOutcome and resolveCancelQueuedRestoreOutcome are removed; cancellation still restores into empty composers and keeps Restore available for occupied composers.

Files
  • apps/mobile/src/lib/agent-attachments/use-agent-attachment-upload.ts — replaces restored chips, advances the generation, cancels uploads, and clears live identifiers (M, Source, 16 lines).
  • apps/mobile/src/components/agents/mobile-session-manager.ts — removes the exported restoration outcome type and boolean mapper (M, Source, 8 lines).
  • apps/mobile/src/lib/agent-attachments/use-agent-attachment-upload.test.ts — extends the attachment upload test file (M, Test, 67 lines).
  • apps/mobile/src/components/agents/chat-composer-attachment-send.test.ts — updates the attachment-send test file (M, Test, 23 lines).

useReturnSendsMessagePreference adds an on-device choice under RETURN_SENDS_MESSAGE_KEY (return-sends-message), defaulting to newline insertion. Only stored true enables sending, so absent or other stored values keep multiline behavior without migration. Preferences disables the switch until storage loads and uses the existing secure preference store to save changes.

Files
  • apps/mobile/src/lib/hooks/use-return-sends-message-preference.ts — adds the boolean preference, loaded state, subscription, and setter through the shared store (A, Source, 26 lines).
  • apps/mobile/src/lib/storage-keys.ts — registers the Return preference storage key (M, Source, 2 lines).
  • apps/mobile/src/components/preferences-screen.tsx — adds the labeled Return switch and disables it until the preference loads (M, Source, 12 lines).
  • apps/mobile/src/components/preferences-screen.mounted.test.tsx — extends the mounted preferences test file (M, Test, 37 lines).

ChatComposerInputRowProps now requires returnSendsMessage and onInsertNewline; Return selects submit or newline through submitBehavior. The newline button preserves line breaks; Send, Stop, and newline targets use 44 iOS points or 48 Android density-independent pixels. The parent retains send admission and caret insertion, while maxFontSizeMultiplier={1} prevents a second font scale.

Files
  • apps/mobile/src/components/agents/chat-composer-input-row.tsx — switches Return behavior, adds the newline control, prevents double scaling, and enlarges Send and Stop (M, Source, 42 lines).
  • apps/mobile/src/components/ui/icons.ts — exports CornerDownLeft through the existing direct icon import convention (M, Source, 1 line).
  • apps/mobile/src/components/agents/chat-composer-input-row.mounted.test.tsx — expands the mounted input-row test file (M, Test, 129 lines).

resolveComposerMaxHeight replaces the fixed 124-point and 160-point caps with remaining viewport space, preserving each input's minimum height. SESSION_HEADER_HEIGHT, STARTER_ROW_HEIGHT, COMPOSER_CHROME_HEIGHT, and NEW_SESSION_PROMPT_CHROME_HEIGHT reserve space for surrounding controls, with host budgets scaled for Dynamic Type. UseTextHeightOptions.fontScale applies scaling once; callers that omit it keep native scaling, and changed height limits apply without another text measurement.

Files
  • apps/mobile/src/components/agents/chat-composer-input-height.ts — adds the remaining-space calculation and conservative header, starter, attachment, toolbar, and action budgets (M, Source, 69 lines).
  • apps/mobile/src/components/agents/use-text-height.tsx — keeps unclamped content height, recalculates the displayed height, and optionally scales the native measurement text (M, Source, 43 lines).
  • apps/mobile/src/components/agents/chat-composer-input-height.test.ts — extends the input-height test file (M, Test, 49 lines).

ChatComposerSessionState adds empty, preparing, finalizing, and message phases, with message as the default for existing callers. Empty drafts offer three localized starters, with an extra choice for empty, preparing, or finalizing sessions; selection fills and focuses without sending. The composer applies adaptive sizing and the Return preference, while a CLOUD_AGENT_PROMPT_MAX_LENGTH counter follows typing, restoration, insertion, and clearing.

Files
  • apps/mobile/src/components/agents/chat-composer.tsx — wires keyboard-aware sizing, caret-aware newlines, starters, counters, reduced-motion overlays, and shared Text labels with normal font weight (M, Source, 156 lines).
  • apps/mobile/src/components/agents/session-detail-content.tsx — prioritizes preparing and finalizing phases, forwards sessionState, and inlines the cancellation occupancy check (M, Source, 25 lines).
  • apps/mobile/src/components/agents/chat-composer.test.ts — expands the composer test file (M, Test, 196 lines).

NewSessionPromptComponentProps.onStartSession lets Return use the existing Start flow when enabled, including the host's model, repository, profile, and voice-settlement gates. Empty prompts, active creation, failed attachments, and uploads block Return; hosts without the callback keep Return inert, and clone entry keeps no composer. NewSessionPromptControlsProps.children places the newline control beside voice controls without duplicating their layout.

Files
  • apps/mobile/src/components/agents/new-session-prompt.tsx — adds adaptive sizing with a three-line minimum, starters, counters, gated Return, caret-aware newlines, shared Text labels, and the photo-metadata warning (M, Source, 208 lines).
  • apps/mobile/src/components/agents/new-session-configure-form.tsx — forwards onStartSession only when the Start action is enabled (M, Source, 1 line).
  • apps/mobile/src/components/agents/new-session-prompt-controls.tsx — accepts optional children between the listening status and voice button (M, Source, 4 lines).
  • apps/mobile/src/components/agents/new-session-prompt-initial-prompt.test.ts — expands the initial-prompt test file (M, Test, 157 lines).

handleKeyboardShow follows the newest message through the existing guarded scroll scheduler. Manual scrolling and scrolled-up reading keep their existing guards. iOS uses keyboardWillShow and keyboardDidShow; Android uses keyboardDidShow, and unmount removes the listeners.

Files
  • apps/mobile/src/components/agents/use-session-list-auto-scroll.ts — exposes the keyboard callback through the follow, user-scroll, and programmatic-scroll guards (M, Source, 9 lines).
  • apps/mobile/src/components/agents/session-message-list.tsx — registers and removes the platform-specific keyboard listeners (M, Source, 31 lines).
  • apps/mobile/src/components/agents/session-message-list.mounted.test.tsx — updates the mounted transcript test file (M, Test, 3 lines).

MotionPolicy.reducedMotion exposes the system setting, and selectReducedMotionEntrance removes optional animation builders when that setting is on. Composer toolbar and slash suggestions then appear and disappear immediately; scrollAnimated retains its current behavior.

Files
  • apps/mobile/src/lib/a11y/motion.ts — exposes the reduced-motion flag and adds the optional animation selector (M, Source, 15 lines).

The new preferences.returnSendsMessage and preferences.returnSendsMessageSubtitle labels explain the default-off Return choice. agentChat.composer adds charactersRemaining, insertNewline, starterChipBuild, starterChipFix, starterChipWriteTests, starterChipPrepare, starterChipWrapUp, and starterChipEmpty. The translation landing supplies 860 values across 86 non-English catalogs without changing existing text, key order, or the {{count}} placeholder.

Files
  • apps/mobile/src/i18n/locales/en.json — defines eight composer labels and two Return preference labels (M, Source, 12 lines).
  • apps/mobile/src/i18n/locales/af.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/am.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ar.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/az.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/be.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/bg.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/bn.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/bs.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ca.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ckb.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/cs.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/cy.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/da.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/de.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/el.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/es.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/et.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/eu.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/fa.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/fi.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/fil.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/fr.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ga.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/gl.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/gu.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ha.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/he.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/hi.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/hr.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ht.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/hu.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/hy.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/id.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ig.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/is.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/it.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ja.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ka.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/kk.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/km.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/kn.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ko.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/lo.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/lt.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/lv.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/mg.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/mi.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/mk.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ml.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/mn.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/mr.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ms.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/mt.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/my.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/nb.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ne.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/nl.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/om.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/or.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/pa.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/pl.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ps.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/pt-BR.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/pt.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ro.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ru.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/si.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/sk.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/sl.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/so.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/sq.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/sr.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/sv.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/sw.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ta.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/te.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/th.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/tr.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/uk.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/ur.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/uz.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/vi.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/yo.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/zh-Hans.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/zh-Hant.json — merges ten prepared translations (M, Generated, 14 lines).
  • apps/mobile/src/i18n/locales/zu.json — merges ten prepared translations (M, Generated, 14 lines).

Tests: 8 test files updated, totaling 661 changed lines: attachment send, input height, input row, composer, initial prompt, transcript, preferences, and upload.
Generated: 86 non-English locale catalogs updated, totaling 1,204 changed lines; each named catalog contains ten prepared additions for this level.


Visual Changes

Cloud Agent session composer, iOS

The user now sees the empty composer with three starter chips above the message field, and the attach, mic, and send controls beside it. In the picture, that new composer is the bottom band: the chips "Build a feature", "Fix a bug", and "Write tests" sit above the "Message..." field, with the clip at its left and the mic and send at its right.

ios1-composer.png

Cloud Agent session composer, Android

The round-1 report says the user sees the same composer with the message field, starter chips, attach, mic, and send controls. No picture shows it. The three candidate frames for this screen are fully black; they fail to show the composer, the two-line newline draft, and the sent user row.

Verification

Nine cases ran to a result on iOS, Android, and the backend; two voice cases did not run because neither device can start dictation.

Case What it proves Platform Result
ios-1 A cold launch renders the composer with the attach and voice controls. iOS passed
ios-2 A tap on a starter chip in the empty composer inserts the text, keeps focus, and sends nothing. iOS passed
ios-3 The character counter appears when the draft has text, and Send stays visible. iOS passed
ios-4 Send renders the user row at once, clears the composer, and leaves one row after reconcile. iOS passed
ios-5 The mic stays beside Stop while dictation streams, and the input stays editable. iOS not run — the simulator cannot start dictation (test-environment skip in round 3)
android-1 A cold launch renders the composer with the attach and voice controls. Android passed
android-2 With return-to-send off, Return inserts a newline and sends nothing. Android passed
android-3 Send renders the user row at once, clears the composer, and leaves one row after reconcile. Android passed
android-4 The mic stays beside Stop while dictation streams, and the send, stop, and mic targets are present. Android not run — the emulator cannot start dictation (test-environment skip in round 1)
backend-1 A started Cloud Agent session appears in the active session list. backend passed after the fix in round 2
backend-2 A remote CLI session starts and its relay session stays live. backend passed
  • backend-1 in round 1 reported that a live Cloud Agent session never appeared in the active session list. That was a test-authoring error, not a product defect: the query lacked the includeCloudAgentSessions:true flag. The corrected query passed in round 2; the defect does not reproduce.
  • Cloud Agent delivery failed with "Failed to deliver" on the Android session and on the seeded iOS row. The rounds classified it as pre-existing and backend-side, not caused by this change. It reproduced on the Android session in round 1; the new session in round 2 showed no delivery failure.

Recording: none.

Reviewer Notes

Human steps

No additional setup is required after merge; this level adds no migration, environment value, secret, or deployment flag.

Verification limits

  • The supplied report covers the cumulative stack, not a fresh runtime pass at the current head.
  • Simulators could not start dictation. The test setup lacked writable R2 credentials.
  • Live attachment upload, removal, reorder, and restore lack runtime evidence from this setup.
  • Deterministic queued-message cancellation was not exercised live; automated tests cover it.
  • Android candidate frames were black; no useful Android image exists.
  • No before screenshots are supplied. The existing images do not establish current-head visual coverage.

Automated evidence

The handoff records these results; this description refresh runs no product tests.

  • Continuous integration (CI) passes on all seven current heads.
  • Final shared-Text repair passed 34 targeted tests and 6/6 scoped checks.
  • One translation pass supplied 25 keys across 86 locales, totaling 2,150 values; catalog checks pass in CI.
  • This level contributes ten keys and 860 translated values; its four focused translation checks passed.

Description scope

Notes

Current-head CI and Kilobot approve all seven PRs. Existing E2E images precede later extraction, translation, and shared-Text repairs.

Stacked PRs — merge bottom to top. Each level shows only its own diff.

Runtime verification (E2E, user advocacy, simplify) runs on the tip PR over every level.
Every level keeps its own checks, its own bot review, and its own threads; each one is answered on its own PR.
Each level is its own deliverable: it builds and passes its own checks alone.
A finding on a level is repaired on that level, then carried upward with stack.sh forward.

  1. agent-composers-c07afeat(agent-composer): add message identity and queue cancel APIs #5537
  2. agent-composers-c07a-s2feat(mobile): pre-upload attachments and release abandoned files #5538
  3. agent-composers-c07a-s3feat(mobile): reorder composer attachments with drag and a11y moves #5540
  4. agent-composers-c07a-s4feat(agent-composer): render sent messages immediately and cancel queued ones #5589
  5. agent-composers-c07a-s5feat(mobile): keep agent composers editable during live dictation #5607
  6. agent-composers-c07a-s6feat(mobile): adapt agent composers for keyboard, height, and preferences #5617 ← this PR (tip)

Comment thread apps/mobile/src/components/agents/chat-composer.tsx
Comment thread apps/mobile/src/components/agents/new-session-prompt.tsx
@kilo-code-bot

kilo-code-bot Bot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

Hiding the remaining-character counter until 1000 characters remain, plus compact starter chips with hitSlop, looks correct with high confidence.

Files Reviewed (4 files)
  • apps/mobile/src/components/agents/chat-composer.test.ts
  • apps/mobile/src/components/agents/chat-composer.tsx
  • apps/mobile/src/components/agents/new-session-prompt-initial-prompt.test.ts
  • apps/mobile/src/components/agents/new-session-prompt.tsx
Previous Review Summaries (10 snapshots, latest commit 52c3387)

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

Previous review (commit 52c3387)

Status: No Issues Found | Recommendation: Merge

Executive Summary

Directional UI Text for composer chips and counters, with RTL coverage, looks correct with high confidence.

Files Reviewed (5 files)
  • apps/mobile/src/components/agents/chat-composer-attachment-send.test.ts
  • apps/mobile/src/components/agents/chat-composer.test.ts
  • apps/mobile/src/components/agents/chat-composer.tsx
  • apps/mobile/src/components/agents/new-session-prompt-initial-prompt.test.ts
  • apps/mobile/src/components/agents/new-session-prompt.tsx

Previous review (commit 81d77d9)

Status: No Issues Found | Recommendation: Merge

Executive Summary

Incremental composer-control extraction, signed-URL attachment restore, and queue-cancel/optimistic-row fixes look correct with high confidence.

Files Reviewed (98 files)
  • apps/mobile/src/components/agents/chat-composer-submission.test.ts
  • apps/mobile/src/components/agents/new-session-configure-form.tsx
  • apps/mobile/src/components/agents/new-session-profile-row.tsx
  • apps/mobile/src/components/agents/new-session-prompt-controls.tsx
  • apps/mobile/src/components/agents/new-session-prompt-initial-prompt.test.ts
  • apps/mobile/src/components/agents/new-session-prompt.tsx
  • apps/mobile/src/lib/agent-attachments/use-agent-attachment-upload.ts
  • apps/mobile/src/lib/agent-attachments/use-agent-attachment-upload.test.ts
  • packages/cloud-agent-sdk/src/session-manager.ts
  • packages/cloud-agent-sdk/src/session-manager.test.ts
  • services/cloud-agent-next/src/session/session-message-queue.ts
  • services/cloud-agent-next/src/session/session-message-queue.test.ts
  • apps/mobile/src/i18n/locales/*.json

Previous review (commit 25329aa)

Status: No Issues Found | Recommendation: Merge

Executive Summary

Unused clearReturnSendsMessagePreference was removed with no remaining callers.

Files Reviewed (1 file)
  • apps/mobile/src/lib/hooks/use-return-sends-message-preference.ts

Previous review (commit 0563cc1)

Status: No Issues Found | Recommendation: Merge

Executive Summary

Cancel-queued restore now inlines the composer-empty check after dropping resolveCancelQueuedRestoreOutcome; behavior matches the previous restore vs keep-restore split.

Files Reviewed (2 files)
  • apps/mobile/src/components/agents/mobile-session-manager.ts
  • apps/mobile/src/components/agents/session-detail-content.tsx

Previous review (commit a24f1e1)

Status: No Issues Found | Recommendation: Merge

Executive Summary

restoreFileParts now replaces occupied chips and invalidates in-flight uploads the same way as reset/clearOptimistic; tests cover replace and stale completion.

Files Reviewed (2 files)
  • apps/mobile/src/lib/agent-attachments/use-agent-attachment-upload.ts
  • apps/mobile/src/lib/agent-attachments/use-agent-attachment-upload.test.ts

Previous review (commit c3187ea)

Status: No Issues Found | Recommendation: Merge

Executive Summary

Incremental a11y labels, metadata-status parity, and new-session-prompt test mocks look correct; the previous missing-mock warning is resolved.

Files Reviewed (4 files)
  • apps/mobile/src/components/agents/chat-composer.tsx
  • apps/mobile/src/components/agents/new-session-prompt.tsx
  • apps/mobile/src/components/agents/new-session-prompt-initial-prompt.test.ts
  • apps/mobile/src/i18n/locales/en.json

Previous review (commit b88d498)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
apps/mobile/src/components/agents/new-session-prompt.tsx 121 new-session-prompt-initial-prompt.test.ts still lacks mocks for the new dimension, keyboard, insets, and preference hooks
Files Reviewed (3 files)
  • apps/mobile/src/components/agents/chat-composer-input-height.ts
  • apps/mobile/src/components/agents/chat-composer-input-height.test.ts
  • apps/mobile/src/components/agents/new-session-prompt.tsx - 1 issue

Fix these issues in Kilo Cloud

Previous review (commit 305c0af)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
apps/mobile/src/components/agents/new-session-prompt.tsx 121 new-session-prompt-initial-prompt.test.ts still lacks mocks for the new dimension, keyboard, insets, and preference hooks
Files Reviewed (9 files)
  • apps/mobile/src/components/agents/chat-composer-input-height.ts
  • apps/mobile/src/components/agents/chat-composer-input-height.test.ts
  • apps/mobile/src/components/agents/chat-composer-input-row.tsx
  • apps/mobile/src/components/agents/chat-composer-input-row.mounted.test.tsx
  • apps/mobile/src/components/agents/chat-composer.test.ts
  • apps/mobile/src/components/agents/chat-composer.tsx
  • apps/mobile/src/components/agents/new-session-configure-form.tsx
  • apps/mobile/src/components/agents/new-session-prompt.tsx - 1 issue
  • apps/mobile/src/components/agents/session-detail-content.tsx

Fix these issues in Kilo Cloud

Previous review (commit 802c231)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
apps/mobile/src/components/agents/new-session-prompt.tsx 119 new-session-prompt-initial-prompt.test.ts still lacks mocks for the new dimension, keyboard, insets, and preference hooks
Files Reviewed (3 files)
  • apps/mobile/src/components/agents/chat-composer-attachment-send.test.ts
  • apps/mobile/src/components/agents/chat-composer.tsx
  • apps/mobile/src/components/agents/new-session-prompt.tsx - 1 issue

Fix these issues in Kilo Cloud

Previous review (commit 41a6f73)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
apps/mobile/src/components/agents/chat-composer.tsx 251 Sibling chat-composer-attachment-send.test.ts still lacks mocks for the new dimension, keyboard, insets, preference, and reduced-motion hooks
apps/mobile/src/components/agents/new-session-prompt.tsx 119 new-session-prompt-initial-prompt.test.ts still lacks mocks for the new dimension, keyboard, insets, and preference hooks
Files Reviewed (20 files)
  • apps/mobile/src/components/agents/chat-composer.tsx - 1 issue
  • apps/mobile/src/components/agents/new-session-prompt.tsx - 1 issue
  • apps/mobile/src/components/agents/chat-composer-input-height.ts
  • apps/mobile/src/components/agents/chat-composer-input-height.test.ts
  • apps/mobile/src/components/agents/chat-composer-input-row.tsx
  • apps/mobile/src/components/agents/chat-composer-input-row.mounted.test.tsx
  • apps/mobile/src/components/agents/chat-composer.test.ts
  • apps/mobile/src/components/agents/new-session-configure-form.tsx
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/agents/session-message-list.tsx
  • apps/mobile/src/components/agents/session-message-list.mounted.test.tsx
  • apps/mobile/src/components/agents/use-session-list-auto-scroll.ts
  • apps/mobile/src/components/agents/use-text-height.tsx
  • apps/mobile/src/components/preferences-screen.tsx
  • apps/mobile/src/components/preferences-screen.mounted.test.tsx
  • apps/mobile/src/components/ui/icons.ts
  • apps/mobile/src/i18n/locales/en.json
  • apps/mobile/src/lib/a11y/motion.ts
  • apps/mobile/src/lib/hooks/use-return-sends-message-preference.ts
  • apps/mobile/src/lib/storage-keys.ts

Fix these issues in Kilo Cloud


Reviewed by grok-4.6 · Input: 73K · Output: 7.6K · Cached: 290.2K

Review guidance: REVIEW.md from base branch agent-composers-c07a-s5

iscekic added 19 commits August 27, 2026 19:43
# Conflicts:
#	apps/mobile/src/components/agents/chat-composer.test.ts
# Conflicts:
#	apps/mobile/src/components/agents/chat-composer-input-row.mounted.test.tsx
- Announce the photoMetadataNotRemoved status on the new-session prompt.
- Label both character counters with charactersRemaining.
- Mock the new composer dependencies in the new-session prompt suite.
# Conflicts:
#	apps/mobile/src/components/agents/new-session-configure-form.tsx
#	apps/mobile/src/components/agents/new-session-prompt.tsx
@iscekic iscekic added the human-ready The PR is ready for human review. label Aug 28, 2026
@iscekic
iscekic requested a review from pandemicsyn August 28, 2026 07:38
Starter chips lose the 44pt visual min-height. A hitSlop keeps the
44pt/48dp touch target. The chat composer chip row gains top padding
against the transcript hairline.

The remaining-character counter appears only when 1000 or fewer
characters remain, instead of on the first keystroke.
@iscekic
iscekic merged commit 32507e6 into main Aug 28, 2026
55 checks passed
@iscekic
iscekic deleted the agent-composers-c07a-s6 branch August 28, 2026 12:55
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