feat(mobile): add Manage Profiles and profile picker at web parity - #6386
Conversation
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryThe incremental diff at Files Reviewed (2 files)
Previous Review Summaries (10 snapshots, latest commit a6a285d)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit a6a285d)Status: No Issues Found | Recommendation: Merge Executive SummaryThe incremental diff at Files Reviewed (2 files)
Previous review (commit 1d431ae)Status: No Issues Found | Recommendation: Merge The incremental change builds Files Reviewed (4 files)
Previous review (commit c448248)Status: 1 Issue Found | Recommendation: Address before merge Executive SummaryThe two commits since the previous review resolve both prior findings - the restored session-chip error layer and the missing Overview
Issue Details (click to expand)WARNING
Files Reviewed (5 files, 2 generated)
Fix these issues in Kilo Cloud Previous review (commit 508fa19)Status: 2 Issues Found | Recommendation: Address before merge Executive SummaryThe recorded-profile plumbing is wired correctly end to end, but the mobile session-detail refactor leaves a dead binding that fails Overview
Issue Details (click to expand)WARNING
SUGGESTION
Files Reviewed (22 files, 2 generated)
Fix these issues in Kilo Cloud Previous review (commit f6b8270)Status: No Issues Found | Recommendation: Merge Executive SummaryThe incremental commit Files Reviewed (11 files)
Previous review (commit 794d8cf)Status: No Issues Found | Recommendation: Merge Executive SummaryThe incremental changes since Files Reviewed (18 files)
Previously reported findings re-verified resolved at Previous review (commit 8b3b33f)Status: 6 Issues Found | Recommendation: Address before merge Executive SummaryThe rebase (previous reviewed SHA by force-push/rewrite) carried over every earlier accepted fix, and this pass on the current single-commit diff ( Overview
Issue Details (click to expand)WARNING
SUGGESTION
Files Reviewed (221 files)All 221 files in the current PR diff ( Previously reported findings re-verified resolved at HEAD: owner-scope chip, MCP edit type lock, skill description clearing, commands refetch generation, owner-scoped optimistic defaults, No memory-leak patterns (uncleared timers, listeners, subscriptions, or retained bridge state) were found in the added code. Fix these issues in Kilo Cloud Previous review (commit cd3af0d)Status: No Issues Found | Recommendation: Merge Executive SummaryIncremental review at HEAD Files Reviewed (217 files)
Previous reviewStatus: No Issues Found | Recommendation: Merge Executive SummaryIncremental review of the profile-management fix set at HEAD Files Reviewed (27 files)
Previous review (commit 96fe3c6)Status: 11 Issues Found | Recommendation: Address before merge Overview
Issue Details (click to expand)WARNING
SUGGESTION
Files Reviewed (231 files)
Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0 Review guidance: REVIEW.md from base branch |
59cf381 to
c0fac4f
Compare
a3ba651 to
b0460ce
Compare
|
bot: Rejected, no code change (kwf Why: (already implemented, verified live: no change needed: Refuted: all 20 flagged added lines are cross-platform expo-router / react-native-safe-area-context imports, and the mobile diff adds no Platform.OS/.ios/.android branch, so there is no platform fork to remove. Finding refuted with evidence. The 20 flagged added lines are imports o |
b0460ce to
cd3af0d
Compare
eshurakov
left a comment
There was a problem hiding this comment.
Approved after a shallow triage pass. Note: also carries a signed-out web seed fix (SeedUserQuery.tsx).
de44358 to
8b3b33f
Compare
f88d12a to
794d8cf
Compare
- advanced-config-panel.tsx: clear the manual env-var and setup-command drafts after a profile save succeeds. The saved profile now carries those values, and the create request appends the profile's setup commands to the inline ones, so a kept draft ran every saved command twice. - profile-picker-sheet.tsx, profile-selector-model.ts, profile-selector-row.tsx: clearing the pick hands the session to the effective default, so the no-override row names that default (`profiles.defaultSectionTitle`) whenever the context resolves one, and says `No profile` only when nothing applies. - profile-variables-rows.tsx, agent-profile-forms.ts: the manual env-var editor applies the prepare-session bound (256 characters) to the value field, so an over-long value cannot be entered under Advanced Configuration.
…sion profile Records the profile a session was prepared with. Nullable and ON DELETE SET NULL so pre-existing rows and profile deletion stay readable.
…ssion create payload
…eate mergeProfileConfiguration now reports the profile that claimed the active layer (explicit pick, else effective default, else repo binding). applyProfileResolution carries it on the request and the session-ingest create call writes it to cli_sessions_v2.
…rofile The chip read the context's effective default, which can differ from the profile the session was prepared with. It now resolves the recorded profileId and only falls back to the effective default when the session recorded none; an id that no longer resolves leaves the chip unselected.
…26-dcb3 # Conflicts: # packages/db/src/migrations/meta/0258_snapshot.json # packages/db/src/migrations/meta/_journal.json
… stale row The chip reads the current session's row (kiloSessionId match) before using its profileId, and restores the profile-query error layer the earlier edit dropped.
Supports the ON DELETE SET NULL scan when a profile is deleted. The profile_id migration is regenerated as 0260 (now 0260_misty_gabe_jones) so it carries the column, the FK, and the index.
cli_sessions_v2 is large, so the generated plain CREATE INDEX would block writes for the whole build. The index now uses .concurrently() and the regenerated migration (0260_free_amazoness) carries the COMMIT;/BEGIN; boundaries the transactional migrator needs.
…file id Add the new `profileId` argument to the 12 positional assertions in `session-prepare.test.ts`. Widen the three arity checks from 9 arguments to 10. Render the repo picker's search field with the shared `Input` box. `main`'s `single-line-input-guard` requires that box.
The repo picker renders the shared `Input` box now. That box reads the RTL state through `rtl-text.ts`. Both mounted mocks describe `react-native` with four keys, so add `I18nManager`.
…4554) ## Automated docs sync — 2026-09-25 This PR keeps kilo.ai/docs in sync with features merged to [Kilo-Org/cloud](https://github.com/Kilo-Org/cloud) and [Kilo-Org/kilocode](https://github.com/Kilo-Org/kilocode). Every change below links to the merged PR it documents. - Window: `2026-09-24T07:08:33.639Z` → `2026-09-25T07:05:29.302Z` - Verification (docs build + tests): **passing** ### Surface: `cloud-mobile` - Assignees / requested reviewers: @iscekic and @eshurakov - Derivation: Derived from the repository layout. A product surface is a package under packages/ that ships a distinct client, plugin, backend, or hosted service: cli = packages/opencode/ + packages/tui/ + packages/server/ + packages/sdk/ + packages/plugin/; vscode = packages/kilo-vscode/ + packages/kilo-web-ui/ + packages/kilo-ui/; jetbrains = packages/kilo-jetbrains/; gateway = packages/kilo-gateway/; web = packages/kilo-console/ + packages/kilo-indexing/ + packages/kilo-memory/ + packages/kilo-sandbox/. Docs route from the IA tree packages/kilo-docs/pages/ plus docs/jetbrains-vscode-settings-parity.md: each surface lists the pages sections that document it, and the per-platform pages under packages/kilo-docs/pages/code-with-ai/platforms/ map to the matching extension surface (the vscode/ directory to vscode, jetbrains.md to jetbrains). A doc path belongs to the surface with the longest matching prefix; a path that matches none of those prefixes falls to `other` (the explicit other prefixes are listed under other.docs). The cloud surfaces are derived the same way from the Kilo-Org/cloud layout: cloud-mobile = apps/mobile/, cloud-web = apps/web/, cloud-extension = apps/extension/, and cloud-agent = the cloud-agent packages under packages/ (packages/cloud-agent-sdk/ + packages/cloud-agent-profile/). A cloud source names its repository while a bare string still means this repository. The pages under packages/kilo-docs/pages/collaborate/ document the cloud web app (app.kilo.ai: teams dashboard, billing, SSO, adoption dashboard), so they route to cloud-web. No page under packages/kilo-docs/pages/ documents the browser side-panel extension yet, so cloud-extension lists no docs prefix. - Map: `.github/docs-sync/surfaces.json` - Surface map: `cli`, `vscode`, `jetbrains`, `gateway`, `web`, `cloud-mobile`, `cloud-web`, `cloud-extension`, `cloud-agent`, `other` - Source prefixes: `apps/mobile/` (Kilo-Org/cloud) - Doc prefixes: `packages/kilo-docs/pages/code-with-ai/platforms/mobile.md` - Paths that fall to `other`: `packages/kilo-docs/pages/community/`, `packages/kilo-docs/pages/kiloclaw/`, `packages/kilo-docs/pages/contributing/`, `packages/kilo-docs/LEARNINGS.md`, `docs/` - Reviewers are ranked from `Kilo-Org/cloud`; the workflow needs a token with `contents: read` on that repository (repository secret `CROSS_REPO_ACCESS_TOKEN`, exposed to the upsert step as `CLOUD_REPO_TOKEN`). - How the two were computed: Reviewers for `cloud-mobile` are ranked from `Kilo-Org/cloud` git history over `apps/mobile/` (a commit 180 days old counts half as much, half-life 180 days). Bots (author type "Bot" or a login matching /\[bot\]$/i) and people without admin, write, or maintain permission are excluded. ### Changes <!-- docs-sync:changes:start --> | Docs change | Source | | --- | --- | | updated pages/code-with-ai/platforms/mobile.md | [Kilo-Org/cloud#6386](Kilo-Org/cloud#6386) | | updated pages/ai-providers/openai-chatgpt-plus-pro.md | [Kilo-Org/cloud#6702](Kilo-Org/cloud#6702) | | updated pages/code-with-ai/platforms/cloud-agent.md | [Kilo-Org/cloud#6683](Kilo-Org/cloud#6683) | | updated pages/getting-started/byok.md | [Kilo-Org/cloud#6692](Kilo-Org/cloud#6692) | <!-- docs-sync:changes:end --> ### Pending — will retry <!-- docs-sync:pending:start --> _None._ <!-- docs-sync:pending:end --> ### Considered, no docs change needed <!-- docs-sync:skipped:start --> | PR | Reason | | --- | --- | | [Kilo-Org/cloud#6658](Kilo-Org/cloud#6658) | Internal sandbox lifecycle fix with no user-visible workflow or setting. | | [Kilo-Org/cloud#6673](Kilo-Org/cloud#6673) | Internal container CA trust plumbing, no user-facing behavior. | | [Kilo-Org/cloud#6672](Kilo-Org/cloud#6672) | Internal sandbox launch/recovery fix with no documented workflow change. | | [Kilo-Org/cloud#6660](Kilo-Org/cloud#6660) | Internal cloud-agent queue delivery fix; no new command, setting, or workflow for users. | | [Kilo-Org/cloud#6226](Kilo-Org/cloud#6226) | Internal gateway alias-routing change, not user-visible. | | [#14490](#14490) | Tool-call animation and streaming UI polish; users do not need to learn a new workflow. | | [#14530](#14530) | Bug fix restoring intended worktree-pool behavior, no doc change needed. | | [#14529](#14529) | Bug fix restoring tab/panel state across project switches. | | [#14531](#14531) | Reconnect recovery bug fix, restores already-documented behavior. | | [#14532](#14532) | Bug fix keeping session tab title in sync on rename. | | [Kilo-Org/cloud#6088](Kilo-Org/cloud#6088) | Removes internal/admin model-experiment surfaces, not public product docs. | | [Kilo-Org/cloud#6682](Kilo-Org/cloud#6682) | Internal control-socket reconnect race fix, no user-facing change. | | [#14534](#14534) | Transcript re-render performance bug fix. | | [#14535](#14535) | Bug fix preserving the loaded browser page across context switches. | | [Kilo-Org/cloud#6684](Kilo-Org/cloud#6684) | Reverted by Kilo-Org/cloud#6685. | | [Kilo-Org/cloud#6678](Kilo-Org/cloud#6678) | Dead-code constant removal, no user-visible effect. | | [Kilo-Org/cloud#6687](Kilo-Org/cloud#6687) | Removes internal model-experiment maintenance and retains tables, no user-facing change. | | [#14515](#14515) | JetBrains plugin unload crash fix, no documented behavior change. | | [#14520](#14520) | JetBrains transcript/list rendering performance work. | | [Kilo-Org/cloud#6614](Kilo-Org/cloud#6614) | Mobile PR Review header and session title bug fix, no doc change needed. | | [Kilo-Org/cloud#6625](Kilo-Org/cloud#6625) | Internal mobile secure-store error-handling refactor. | | [Kilo-Org/cloud#6624](Kilo-Org/cloud#6624) | Mobile auth bug fix that stops a retry loop; restores expected sign-in behavior with no new setting or workflow. | | [#14310](#14310) | Contributor/CI fix making the kilo-v2 checkout installable; not user-visible product behavior. | | [Kilo-Org/cloud#6611](Kilo-Org/cloud#6611) | Mobile notification-tap fix that selects the session's organization; restores correct behavior rather than adding a learnable feature. | | [Kilo-Org/cloud#6644](Kilo-Org/cloud#6644) | Mobile sign-in layout/alignment polish; no change to what a user must do. | | [Kilo-Org/cloud#6601](Kilo-Org/cloud#6601) | Mobile layout fix keeping empty states clear of the tab bar; purely visual. | | [#14543](#14543) | CI/release infrastructure adding Windows binary code signing; no public docs impact. | | [Kilo-Org/cloud#6616](Kilo-Org/cloud#6616) | Mobile visual defect fixes and a session-title fallback; no new user workflow or setting. | | [Kilo-Org/cloud#6630](Kilo-Org/cloud#6630) | Reports an edge-case partial worktree restore; failure-path plumbing with no new user-facing workflow, target setting, or config. | | [Kilo-Org/cloud#6699](Kilo-Org/cloud#6699) | Cloud Agent e2e stabilization plus internal idle-sandbox capacity handling; not user-visible. | | [#14545](#14545) | Automated JetBrains release/changelog PR; underlying user-facing changes are triaged from their own PRs. | | [Kilo-Org/cloud#6708](Kilo-Org/cloud#6708) | Internal AI-gateway request-logging policy change in the admin panel; no existing public docs surface and no change to how users run Kilo Code. | | [#14533](#14533) | Documentation already shipped with the merged PR. The experimental.task_model_selection flag is gone from the current source, and pages/code-with-ai/agents/model-selection.md, pages/code-with-ai/agents/context-mentions.md, and pages/getting-started/settings/index.md already describe per-task selection as default-on with no stale experiment references. | | [#14510](#14510) | Documentation already shipped with the merged PR. Marketplace companion-skill support is present in the current source (packages/opencode/src/kilocode/marketplace/companions.ts and installer), and pages/customize/marketplace.md already documents installing, publishing, and removing MCP servers with companion skills. | <!-- docs-sync:skipped:end --> --- (bot) Generated by the docs-sync workflow. Humans review and merge; while this PR stays open, the next daily run appends new changes here. Branch: `docs/auto-sync-2026-09-25`. <!-- docs-sync: processed-through 2026-09-25T07:05:29.302Z -->
Changelog for users
Changelog for maintainers
organizationId.renderProfileRow;NewSessionProfileRowreplaces it and requiresonOpenProfilePicker,selectedProfileId,onSelectProfile, andprofileOverrideNeedsAttention.profileId, and a stale pick reports attention without submitting.$TOKENexpansion tokens; the allowlist adds literal profile examples (command, MCP, slug, and slash-command placeholders,top_p, and the MCP count).expo-routerandreact-native-safe-area-context, both cross-platform, and the diff adds noPlatform.OS/Platform.select/.ios/.androidbranch.EffectiveAgentProfilecarriesownerTypefor the choice.description: nullwhen the frontmatter omits it, so clearing persists server-side.generationso remounted fields show server truth; in-flight drafts survive.clearDefaultpasses the profile id and list/detail caches are keyed by input.['user']is seeded only for a resolved user, so a failed context no longer pins signed-out for the global staleTime.mcpServerCountand emits MCP in web order (vars, MCP, skills).hasManualConfiguses the trimmed commands that are actually persisted, so a blank draft row no longer offers Save as Profile.cleanVariableKeyand refused when it matches a stored key, so the server's(profile_id, key)upsert can no longer silently replace a variable; the variables screen and the manual-vars editor pass their existing keys.formatCommandquotes and escapes an argument holding whitespace, a quote, or a backslash, andcommandPartsparses it back, so an unedited['tool', '--label=foo bar']round-trips; a round-trip test covers it.envVars/setupCommands(omitted when empty) in the prepare-session body and intent fingerprint.validateMcpFormmirrors the server bounds — 50 command arguments of 500 characters, a 2048-character URL, and 50 env/header entries with 128-character keys and 4096-character values — and surfaces the field error before the mutation.keepPreviousData, returning previous rows only when the query key is unchanged, so an organization switch starts empty while a same-key refetch keeps the list; a context-switch test covers it.E2E proof
E2E proof — log excerpts
Session profile id end to end (review thread
PRRT_kwDORD_mN86lphlV)The session-detail chip showed the context's effective default, not the profile the session was prepared with. The resolved profile id is now persisted at create and read back by the chip.
packages/db/src/schema.ts:6376nullablecli_sessions_v2.profile_id(ON DELETE SET NULL); migrationpackages/db/src/migrations/0258_cynical_vapor.sqlpackages/session-ingest-contracts/src/rpc-contract.ts:144optional/nullableprofileIdon the create payloadservices/session-ingest/src/session-ingest-rpc.ts:320writesprofile_idon the root insertpackages/cloud-agent-profile/src/profile-session-config.ts:111,361reports the resolved active profile id;services/cloud-agent-next/src/router/handlers/session-prepare.ts:168carries it;services/cloud-agent-next/src/session/session-registration.ts:776,1880,1976pass it;services/cloud-agent-next/src/session-service.ts:3031sends itpackages/cloud-agent-sdk/src/session-manager.ts:292FetchedSessionData.profileIdapps/mobile/src/components/agents/mobile-session-manager.ts:468,apps/extension/src/shared/extension-agent-session-manager.ts:618; read surfaceapps/web/src/routers/cli-sessions-v2-router.ts:1556,1682apps/mobile/src/components/agents/session-detail-content.tsx:516-533resolves the recorded id, default only when the session recorded nonePushed head:
508fa194058761aed05d58dc9e21cb356136df1fTest commands and decisive output
After merging
origin/main(main holds 0258/0259), the migration is nowpackages/db/src/migrations/0260_complex_smasher.sql; re-verified one2173db90a— drizzle check fine, db 34 passed, session-ingest 1153 passed / 3 skipped, cloud-agent-next prepare+create 302 passed, mobile session-detail + session-manager 176 passed, all touched-package typechecks clean.CI repair at
a6a285da63Two checks failed at
1d431aea77. Both came from this branch's own change, not from a flake.cloud-agent-next— the profile-id change addedprofileIdas the sixth argument ofcreateCliSessionViaSessionIngest. That shifted every later argument, andsrc/session/session-prepare.test.tspins them. The file now carries the new argument: 12 positional assertions and 3 arity checks agree with the call.test (kilo-app)andtest(thekilo-app CIworkflow) —repo-picker-sheet.tsxrendered a raw single-lineTextInput.main'ssingle-line-input-guardrequires the shared box. The field now renders@/components/ui/input, the boxlanguage-picker-sheet.tsxuses for the same pill.Proof at
a6a285da63:src/session/session-prepare.test.tscloud-agent-nextpackage suitesingle-line-input-guard.test.tstsgo --noEmit