Skip to content

feat(mobile): start a new agent from a picture - #6201

Open
iscekic wants to merge 1 commit into
mainfrom
kwf/picture-to-new-agent-9c36
Open

iscekic wants to merge 1 commit into
mainfrom
kwf/picture-to-new-agent-9c36

Conversation

@iscekic

@iscekic iscekic commented Sep 16, 2026

Copy link
Copy Markdown
Collaborator

Changelog for users

  • Home now shows a "New task from a picture" button beneath the existing new-task button.
  • The button offers Camera and Photo Library, with Cancel last.
  • Taking a photo or picking a screenshot opens the ordinary new-agent composer with that image attached.
  • The composer still accepts typed text beside the image before the session starts.
  • The library asks for a single selection, so one tap attaches one screenshot.
  • Cancelling the sheet or the system picker returns to Home with no agent started.

Changelog for maintainers

  • pickAgentPicture shares the composer's source sheet but offers camera and library only.
  • It asks the library for one selection and returns no candidates on cancel, denied permission, or a failed launch.
  • stagePictureForNewSession stages the picked files in the existing share payload and returns the new-agent route the composer consumes.
  • AttachmentSurface adds agent-picture, shared by the launch context, both entry points, and the Android recovery hook, which matches it after an Activity recreation.
  • The entry opens the composer only when staging returns a route; a cancel or rejected launch leaves Home untouched.
  • Review first the source-sheet button-index mapping and the surface union; both govern cancel and recovery matching.
  • Proof is on Android, the platform this request names; the iOS camera, photo-library, and cancel paths are built but not proved here.
  • No file under apps/mobile/src/**/kiloclaw/** is touched.

E2E proof

[e1] Start an agent from an existing screenshot: home -> 'New task from a picture' -> Photo Library -> the seeded screenshot lands attached in the composer -> typed text -> Start session -> the session's… — android emulator-5554: the seeded screenshot (e1-picker.xml content-desc="Photo taken on Sep 16, 2026, 5:35:26" at bounds="[0,1409][354,1763]") picked through the OS photo picker landed in the composer as 'android.widget.Button 1000000018.png, Uploaded' with 'Remove attachment 1000000018.png' (e1-composer-run.log, capture e1-composer.png); after the typed prompt the session screen's first message carries it — 'android.widget.ImageView Image output, e4b01550-4206-4077-b5d4-dc01a3b2ba2b.png' beside 'android.widget.TextView Describe this picture' (e1-session-run.log, capture e1-session.png)…

Start an agent from an existing screenshot: home -> 'New task from a picture' -> Photo Library -> the seeded screenshot lands attached in the composer -> typed text -> Start session -> the session's… — e1-composer.png

Recording of the verified flow (waits trimmed)

scripted-shard1.mp4.trim.mp4

[e1] Start an agent from an existing screenshot: home -> 'New task from a picture' -> Photo Library -> the seeded screenshot lands attached in the composer -> typed text -> Start session -> the session's… — android emulator-5554: the seeded screenshot (e1-picker.xml content-desc="Photo taken on Sep 16, 2026, 5:35:26" at bounds="[0,1409][354,1763]") picked through the OS photo picker landed in the composer as 'android.widget.Button 1000000018.png, Uploaded' with 'Remove attachment 1000000018.png' (e1-composer-run.log, capture e1-composer.png); after the typed prompt the session screen's first message carries it — 'android.widget.ImageView Image output, e4b01550-4206-4077-b5d4-dc01a3b2ba2b.png' beside 'android.widget.TextView Describe this picture' (e1-session-run.log, capture e1-session.png)…

[e1] Start an agent from an existing screenshot: home -> 'New task from a picture' -> Photo Library -> the seeded screenshot lands attached in the composer -> typed text -> Start session -> the session's… — e2e-mobile-app/e1-session.png

[e1] Start an agent from an existing screenshot: home -> 'New task from a picture' -> Photo Library -> the seeded screenshot lands attached in the composer -> typed text -> Start session -> the session's… — android emulator-5554: the seeded screenshot (e1-picker.xml content-desc="Photo taken on Sep 16, 2026, 5:35:26" at bounds="[0,1409][354,1763]") picked through the OS photo picker landed in the composer as 'android.widget.Button 1000000018.png, Uploaded' with 'Remove attachment 1000000018.png' (e1-composer-run.log, capture e1-composer.png); after the typed prompt the session screen's first message carries it — 'android.widget.ImageView Image output, e4b01550-4206-4077-b5d4-dc01a3b2ba2b.png' beside 'android.widget.TextView Describe this picture' (e1-session-run.log, capture e1-session.png)…

[e1] Start an agent from an existing screenshot: home -> 'New task from a picture' -> Photo Library -> the seeded screenshot lands attached in the composer -> typed text -> Start session -> the session's… — e2e-mobile-app/e1-composer.png

E2E proof — log excerpts

[e1] Start an agent from an existing screenshot: Home -> New task from a picture -> pass :: android emulator-5554: the seeded screenshot (e1-picker.xml content-desc="Photo taken on Sep 16, 2026, 5:35:26" at bounds="[0,1409][354,1763]") picked through the OS photo picker landed in the composer as 'android.widget.Button 1000000018.png, Uploaded' with 'Remove attachment 1000000018.png' (e1-composer-run.log, capture e1-composer.png); after the typed prompt the session screen's first message carries it — 'android.widget.ImageView Image output, e4b01550-4206-4077-b5d4-dc01a3b2ba2b.png' beside 'android.widget.TextView Describe this picture' (e1-session-run.log, capture e1-session.png) — and the session exists server-side (workspace_c97c2e97-8923-4751-add7-3df7e15920d2|ses_f5706bb4cffdz5cq
/home/igor_kilocode_ai/.local/share/kwf/sections/picture-to-new-agent-9c36/e2e-mobile-app/e1-composer-run.log
android.widget.TextView Code tappable [146,886][223,932]
android.widget.Button Auto Efficient tappable [319,873][623,947]
android.widget.TextView Auto Efficient tappable [347,887][546,933]
android.widget.TextView Run on tappable [37,1022][1045,1068]
android.widget.Button Run on: Cloud Agent tappable [37,1086][909,1203]
android.widget.TextView Cloud Agent tappable [67,1116][844,1172]
android.widget.Button Refresh tappable [928,1086][1043,1201]
android.widget.TextView Run `kilo remote` on your computer, or `/remote` in a running CLI session, to control a local kilo process. tappable [36,1221][1044,1295]
android.widget.TextView Repository tappable [37,1341][1045,1387]
android.widget.Button Repository: Select repository tappable [37,1405][1043,1522]
android.widget.TextView Select repository tappable [67,1435][978,1491]
android.widget.TextView Connect GitLab tappable [76,1588][1004,1634]
android.widget.TextView Connect GitLab in your browser, then return here to pick a repository. tappable [76,1643][1004,1735]
android.widget.Button Open GitLab tappable [76,1763][870,1879]
android.widget.TextView Open GitLab tappable [412,1797][594,1843]
android.widget.Button Refresh repositories tappable [888,1763][1004,1879]
android.widget.TextView Changes tappable [37,1965][1045,2011]
android.view.View Changes tappable [37,2029][1043,2148]
android.widget.RadioButton Leave changes tappable [46,2038][540,2139]
android.widget.TextView Leave changes tappable [182,2065][403,2111]
android.widget.RadioButton Commit and push tappable [540,2038][1034,2139]
android.widget.TextView Commit and push tappable [656,2065][917,2111]
android.widget.TextView Environment tappable [37,2194][1045,2240]
android.widget.TextView Default environment tappable [37,2258][1045,2304]
/home/igor_kilocode_ai/.local/share/kwf/sections/picture-to-new-agent-9c36/e2e-mobile-app/e1-session-run.log
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: Image description request tappable [111,149][883,278]
android.view.View Image description request tappable [111,180][883,245]
android.widget.Button Tap to view context details. tappable [910,156][1044,272]
android.widget.TextView 6:48 AM tappable [476,564][604,603]
android.widget.TextView Describe this picture tappable [250,658][1012,721]
android.widget.Button Open e4b01550-4206-4077-b5d4-dc01a3b2ba2b.png full screen tappable [250,1187][1011,1661]
android.widget.ImageView Image output, e4b01550-4206-4077-b5d4-dc01a3b2ba2b.png tappable [250,1187][1011,1615]
android.widget.TextView e4b01550-4206-4077-b5d4-dc01a3b2ba2b.png tappable [250,1624][1011,1661]
android.widget.TextView Failed to deliver. Retry available. tappable [36,1712][1044,1758]
android.widget.TextView The agent could not run this message. tappable [36,1767][1044,1804]
android.widget.Button Retry tappable [37,1814][176,1909]
android.widget.TextView Retry tappable [67,1838][146,1884]
android.widget.Button Copy to composer tappable [195,1814][525,1909]
android.widget.TextView Copy to composer tappable [225,1838][495,1884]
android.widget.Button Preparation complete tappable [40,1938][1042,2039]
android.widget.TextView Preparation complete tappable [188,1965][506,2011]
android.widget.TextView Add credits to continue, or switch to a free model tappable [92,2099][816,2145]
android.widget.Button Add attachment tappable [28,2213][101,2287]
android.widget.EditText Message tappable [126,2190][800,2310]
android.widget.Button Start voice input tappable [835,2204][926,2296]
/home/igor_kilocode_ai/.local/share/kwf/sections/picture-to-new-agent-9c36/e2e-mobile-app/e1-session-row.txt
workspace_c97c2e97-8923-4751-add7-3df7e15920d2|ses_f5706bb4cffdz5cqxmDxdKxArM|2026-09-16 06:48:23.485+00|||
workspace_cdd6f2b8-cc8c-42b4-a2fc-a6b76c8419c2|ses_f572628bbffeSjEKjTxjMwzdgv|2026-09-16 06:14:03.854+00|||
workspace_60b5fe3f-c19f-4594-8539-9d70a1d0c48b|ses_f572b24bafff2yVnAPiuYe6F3q|2026-09-16 06:08:37.197+00|||
/home/igor_kilocode_ai/.local/share/kwf/sections/picture-to-new-agent-9c36/e2e-mobile-app/e1-cancel-after.txt
android.widget.TextView GETEL tappable [87,394][686,431]
android.widget.TextView 4 MINUTES AGO tappable [730,394][949,431]
android.widget.TextView Image description request tappable [87,438][950,484]
android.widget.TextView kilo/solar-rune-rf6 tappable [87,494][950,531]
android.widget.Button New coding task tappable [37,623][1043,739]
android.widget.TextView New coding task tappable [450,657][696,703]
android.widget.Button New task from a picture tappable [37,757][1043,872]
android.widget.TextView New task from a picture tappable [396,791][749,837]
android.widget.TextView EXPLORE tappable [36,909][1044,946]
android.widget.Button Code Reviewer, Automatic PR reviews tappable [37,965][1043,1109]
android.widget.TextView Code Reviewer tappable [171,993][953,1039]
android.widget.TextView Automatic PR reviews tappable [171,1043][953,1080]
android.widget.Button Security Agent, Find and remediate vulnerabilities tappable [37,1127][1043,1271]
android.widget.TextView Security Agent tappable [171,1155][953,1201]
android.widget.TextView Find and remediate vulnerabilities tappable [171,1205][953,1242]
android.widget.Button PR Review, Review pull requests on mobile tappable [37,1290][1043,1432]
android.widget.TextView PR Review tappable [171,1318][953,1364]
android.widget.TextView Review pull requests on mobile tappable [171,1368][953,1405]
android.view.View Home, tab, 1 of 3 tappable [0,2195][360,2337]
android.widget.TextView HOME tappable [13,2281][347,2320]
android.view.View Agents, tab, 2 of 3 tappable [360,2195][720,2337]
android.widget.TextView AGENTS tappable [373,2281][707,2320]
android.view.View Profile, tab, 3 of 3 tappable [720,2195][1080,2337]
android.widget.TextView PROFILE tappable [733,2281][1067,2320]
/home/igor_kilocode_ai/.local/share/kwf/sections/picture-to-new-agent-9c36/e2e-mobile-app/e1-picker-cancel-after.txt
android.widget.TextView GETEL tappable [87,394][686,431]
android.widget.TextView 6 MINUTES AGO tappable [730,394][949,431]
android.widget.TextView Image description request tappable [87,438][950,484]
android.widget.TextView kilo/solar-rune-rf6 tappable [87,494][950,531]
android.widget.Button New coding task tappable [37,623][1043,739]
android.widget.TextView New coding task tappable [450,657][696,703]
android.widget.Button New task from a picture tappable [37,757][1043,872]
android.widget.TextView New task from a picture tappable [396,791][749,837]
android.widget.TextView EXPLORE tappable [36,909][1044,946]
android.widget.Button Code Reviewer, Automatic PR reviews tappable [37,965][1043,1109]
android.widget.TextView Code Reviewer tappable [171,993][953,1039]
android.widget.TextView Automatic PR reviews tappable [171,1043][953,1080]
android.widget.Button Security Agent, Find and remediate vulnerabilities tappable [37,1127][1043,1271]
android.widget.TextView Security Agent tappable [171,1155][953,1201]
android.widget.TextView Find and remediate vulnerabilities tappable [171,1205][953,1242]
android.widget.Button PR Review, Review pull requests on mobile tappable [37,1290][1043,1432]
android.widget.TextView PR Review tappable [171,1318][953,1364]
android.widget.TextView Review pull requests on mobile tappable [171,1368][953,1405]
android.view.View Home, tab, 1 of 3 tappable [0,2195][360,2337]
android.widget.TextView HOME tappable [13,2281][347,2320]
android.view.View Agents, tab, 2 of 3 tappable [360,2195][720,2337]
android.widget.TextView AGENTS tappable [373,2281][707,2320]
android.view.View Profile, tab, 3 of 3 tappable [720,2195][1080,2337]
android.widget.TextView PROFILE tappable [733,2281][1067,2320]
Owner request

Surface: the mobile app, apps/mobile. The image picker and the new-agent
composer already exist; the share-to-Kilo path already accepts text and files.

What to build

Start a new agent from a picture. The user points the camera at an error, a
log or a whiteboard, or picks a screenshot, and that image becomes the new
agent's first input.

Reuse the picker that already exists and the composer path that already
creates an agent. The new part is the entry point and the image reaching the
agent as input, not a second composer.

Both a freshly taken picture and an existing screenshot must work. The user
must be able to add text beside the image before sending.

What proves it

  1. Pick an existing screenshot, add text, start the agent. Capture the
    composer with the image attached and the session it created.
  2. The agent receives the image: show the session's first message carrying it.
  3. Cancelling the picker leaves no half-made agent. Capture the result.

Do not change apps/mobile/src/**/kiloclaw/**.

Both platforms

Build this on iOS and on Android. Use each platform's own mechanism; the
behaviour the user sees must match.

Prove it on the platform this request names. If the other platform's surface
cannot be driven on the host that runs this request, build it anyway, say so
plainly in the pull request, and name exactly what was built but not proved.
Do not narrow the work to one platform.

If one platform has no equivalent capability at all, say which part and why.

[e1] Start an agent from an existing screenshot: home -> 'New task from a picture' -> Photo Library -> the seeded screenshot lands attached in the composer -> typed text -> Start session -> the session's… — android emulator-5554: the seeded screenshot (e1-picker.xml content-desc="Photo taken on Sep 16, 2026, 5:35:26" at bounds="[0,1409][354,1763]") picked through the OS photo picker landed in the composer as 'android.widget.Button 1000000018.png, Uploaded' with 'Remove attachment 1000000018.png' (e1-composer-run.log, capture e1-composer.png); after the typed prompt the session screen's first message carries it — 'android.widget.ImageView Image output, e4b01550-4206-4077-b5d4-dc01a3b2ba2b.png' beside 'android.widget.TextView Describe this picture' (e1-session-run.log, capture e1-session.png)…

[e1] Start an agent from an existing screenshot: home -> 'New task from a picture' -> Photo Library -> the seeded screenshot lands attached in the composer -> typed text -> Start session -> the session's… — e1-cancel.png

[e1] Start an agent from an existing screenshot: home -> 'New task from a picture' -> Photo Library -> the seeded screenshot lands attached in the composer -> typed text -> Start session -> the session's… — android emulator-5554: the seeded screenshot (e1-picker.xml content-desc="Photo taken on Sep 16, 2026, 5:35:26" at bounds="[0,1409][354,1763]") picked through the OS photo picker landed in the composer as 'android.widget.Button 1000000018.png, Uploaded' with 'Remove attachment 1000000018.png' (e1-composer-run.log, capture e1-composer.png); after the typed prompt the session screen's first message carries it — 'android.widget.ImageView Image output, e4b01550-4206-4077-b5d4-dc01a3b2ba2b.png' beside 'android.widget.TextView Describe this picture' (e1-session-run.log, capture e1-session.png)…

[e1] Start an agent from an existing screenshot: home -> 'New task from a picture' -> Photo Library -> the seeded screenshot lands attached in the composer -> typed text -> Start session -> the session's… — e1-picker-cancel.png

Follow-ups (not changed here)

  • not proved live: A freshly taken picture works: home -> 'New task from a picture' -> Camera -> the platform camera -> shutter -> the photo lands attached in the same composer. needs:seed: pnpm dev:mobile:android adb -s <serial> shell pm revoke com.kilocode.kiloapp android.permission.CAMERA before step 1 so the OS permission dialog is part of the run. Steps 1-5 replay in the harness; the remaining surfaces are the OS ones - tap the camera permission dialog's 'While using the app' (or 'Allow'), take the shot in the platform camera with pnpm dev:mobile:android adb -s <serial> shell input keyevent 27 (KEYCODE_CAMERA) or by tapping the shutter, then confirm on the camera app's review control ('Done'). Expected: the new-session composer with an image chip whose name is synthesized as image. (attachment-picker.ts:23-57) - assert '/image/' and 'Start session' - capture $OUT/e3-composer.png. Layout stability: the chip fills reserved strip space without moving the prompt field. (no capture cited it)
  • not proved live: Cancelling the picker leaves no half-made agent (request proof 3). Empty state: the sheet's Cancel drops the pick before any composer exists. Expected: the picker path ends, Home is unchanged ('/Home, tab, 1 of [0-9]+/'), the new-session composer never opened (its placeholder 'What would you like to work on?' is absent), and the Agents list still holds exactly the sessions it held before - capture $OUT/e2-after.png and $OUT/e2-agents.png for the visual reviewer. This is the empty branch of stagePictureForNewSession (null href -> no push, no staged payload). (no capture cited it)
  • not proved live: Non-retryable unhappy: the camera permission is denied, so the app shows its own alert with the settings CTA and starts nothing. needs:seed: pnpm dev:mobile:android adb -s <serial> shell pm revoke com.kilocode.kiloapp android.permission.CAMERA and pnpm dev:mobile:android adb -s <serial> shell appops set com.kilocode.kiloapp CAMERA deny before step 1. Steps 1-6 replay in the harness; if the OS dialog still appears after step 5, tap 'Don't allow' and tap 'Camera' again - Android auto-denies once the refusal is recorded, which is the state this scenario needs. Expected: the app's own alert 'Camera Access Disabled' with 'Allow camera access in Settings to take a photo.' and the 'Open Settings' action - capture $OUT/e4-alert.png. Expected after tapping 'Cancel': Home unchanged ('/Home, tab, 1 of [0-9]+/'), the composer placeholder absent, the staged picture store empty (no chip and no push) - capture $OUT/e4-after.png. This is the denied branch of pickAgentCameraImage (attachment-picker.ts:84-96) and proves a denial never creates a half-made agent. (no capture cited it)
  • not proved live: [advisory] Retryable unhappy: a picker launch that fails leaves Home intact and the pick can be retried. On Android the ActivityResultLauncher is unregistered when the launching Activity is destroyed (image-picker.ts:11-28), so every later launch rejects until the process restarts; the app toasts the recovery copy and attaches nothing. Trigger: force an Activity recreation with pnpm dev:mobile:android adb -s <serial> shell settings put system accelerometer_rotation 0 then ... shell settings put system user_rotation 1 and back to 0, then run the steps. Expected: the toast 'Could not open the photo picker. Restart Kilo and try again.', Home unchanged, the composer placeholder absent, no chip; then pnpm dev:mobile:android adb -s <serial> shell am force-stop com.kilocode.kiloapp, relaunch, sign in, and the same pick reaches the composer (the retry). Advisory: it depends on the platform bug reproducing on this emulator image - if it does not reproduce, report it as not proved, never as failed. (no capture cited it)
  • not proved live: ux-check: After typing text beside the attached image, pressing 'Start session' creates a session whose first message carries the image. (no capture cited it)
  • not proved live: ux-check: Cancelling the action sheet, and cancelling inside the camera or photo picker, returns to Home with no new-agent composer opened and no session created. (no capture cited it)
  • not proved live: ux-check: Choosing 'Photo Library' and selecting a screenshot opens the new-agent composer with that screenshot shown as an attachment chip/thumbnail. (no capture cited it)
  • not proved live: ux-check: Home shows the primary 'New coding task' and the secondary 'New task from a picture' buttons stacked, both fully on-screen and not overlapping, with the camera icon and label legible in light and dark mode. (no capture cited it)
  • not proved live: ux-check: On Android, backgrounding/rotating while the camera or picker is open and returning delivers the picture into the composer instead of dropping it. (no capture cited it)
  • not proved live: ux-check: Tapping 'New task from a picture' opens a native action sheet listing 'Camera', 'Photo Library', and 'Cancel' (no 'Files'). (no capture cited it)
  • not proved live: ux-check: With large Dynamic Type, both Home button labels remain fully readable with no clipping or truncation. (no capture cited it)

Open findings (not fixed here)

  • the '## E2E proof' section links a file path, which 404s on GitHub

@iscekic
iscekic marked this pull request as draft September 16, 2026 07:02
@kilo-code-bot

kilo-code-bot Bot commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Incremental review at c83a0a60: no line attributable to this PR changed since the previously reviewed 3de8bdeb. The branch was rebased onto a newer main, so the raw commit-to-commit diff is entirely unrelated mainline work; the PR's own files were verified byte-identical path-by-path (0 changed PR files). No unresolved findings, so no inline comments were posted.

Files Reviewed (101 files)
  • apps/mobile/src/components/agents/attachment-picker.ts
  • apps/mobile/src/components/agents/attachment-picker.test.ts
  • apps/mobile/src/components/home/home-screen.tsx
  • apps/mobile/src/components/home/home-screen.test.ts
  • apps/mobile/src/components/home/home-screen.mounted.test.tsx
  • apps/mobile/src/components/home/new-task-from-picture-button.tsx
  • apps/mobile/src/components/home/new-task-from-picture-button.mounted.test.tsx
  • apps/mobile/src/components/ui/icons.ts
  • apps/mobile/src/lib/agent-attachments/picture-entry.ts
  • apps/mobile/src/lib/agent-attachments/picture-entry.test.ts
  • apps/mobile/src/lib/agent-attachments/picker-launch-context.ts
  • apps/mobile/src/lib/agent-attachments/picker-launch-context.test.ts
  • apps/mobile/src/lib/agent-attachments/use-android-pending-picker-recovery.ts
  • apps/mobile/src/lib/agent-attachments/use-android-pending-picker-recovery.test.ts
  • apps/mobile/src/i18n/locales/*.json (87 catalogs)
Previous Review Summary (commit 3de8bde)

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

Previous review (commit 3de8bde)

Status: No Issues Found | Recommendation: Merge

Executive Summary

Reviewed the mobile picture-to-new-agent entry (picker refactor, source-sheet index mapping, surface union, share-payload staging, Android pending-picker recovery) with its tests and 87 locale catalogs at 3de8bdeb; no bugs, memory leaks, or security issues were found in the changed lines, and the author-declared unproven surfaces (Android Activity-recreation recovery, iOS camera) are consistent with the implementation.

Files Reviewed (101 files)
  • apps/mobile/src/components/agents/attachment-picker.ts - sheet mapping (sources[index], Cancel last) preserves the composer path; allowsMultipleSelection threaded per entry point
  • apps/mobile/src/components/agents/attachment-picker.test.ts - picture suite matches the new mapping and surface
  • apps/mobile/src/components/home/new-task-from-picture-button.tsx - stages via the existing share path and pushes only when stagePictureForNewSession returns a href; agent-picture recovery hook mounted
  • apps/mobile/src/components/home/new-task-from-picture-button.mounted.test.tsx
  • apps/mobile/src/components/home/home-screen.tsx - secondary button added beside the primary, still gated on context.isReady
  • apps/mobile/src/components/home/home-screen.mounted.test.tsx
  • apps/mobile/src/components/home/home-screen.test.ts
  • apps/mobile/src/components/ui/icons.ts - single Camera lucide export, no duplicate
  • apps/mobile/src/lib/agent-attachments/picture-entry.ts - null on zero candidates; one staged payload with shareId, no second delivery path
  • apps/mobile/src/lib/agent-attachments/picture-entry.test.ts
  • apps/mobile/src/lib/agent-attachments/picker-launch-context.ts - union and zod enum widened consistently, keeping stored/recovery matching in sync
  • apps/mobile/src/lib/agent-attachments/picker-launch-context.test.ts
  • apps/mobile/src/lib/agent-attachments/use-android-pending-picker-recovery.ts - type widened only; match/consume/clear logic unchanged
  • apps/mobile/src/lib/agent-attachments/use-android-pending-picker-recovery.test.ts
  • apps/mobile/src/i18n/locales/*.json (87 catalogs) - one home.newTaskFromPicture key per catalog, each translated, no duplicate copy or placeholder drift

Non-blocking notes, not findings: the PR itself declares the Android recovery and iOS camera paths as built but not proved live, and the locale catalogs were inspected by key count rather than machine-validated JSON in this read-only pass.


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 ready for review September 16, 2026 07:12
@iscekic
iscekic marked this pull request as draft September 16, 2026 18:26
@iscekic

iscekic commented Sep 16, 2026

Copy link
Copy Markdown
Collaborator Author

bot: Rejected, no code change (kwf kwf-fix-platform-2a19).

Why: (already implemented, verified live: no change needed: No code change needed: the picture entry is one implementation for both iOS and Android (shared source sheet, staging, and navigation), the only platform-guarded code is the Android Activity-recreation recovery, kept and named in code comments, and the expo-router import the plat

@iscekic
iscekic force-pushed the kwf/picture-to-new-agent-9c36 branch from 3de8bde to c83a0a6 Compare September 16, 2026 18:53
@iscekic
iscekic marked this pull request as ready for review September 16, 2026 19:04
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.

1 participant