Simplify setup journeys with guided phone pairing and bot creation - #96
Conversation
9f10396 to
0c8218e
Compare
|
Readiness hardening pushed at exact head 0c8218e. Resolved the five mainline conflicts without merge commits and preserved the current Settings hierarchy/tests. Adversarial fixes include semantic Android QR/setup-code tabs, responsive Telegram connection status, restored Telegram switch labels and settings-card treatment, and propagation of scheduled-task save failures back into the inline review error state. Local validation at this head:
Physical-device pairing and live Tailscale/phone acceptance remain operator release checks; they are not represented as automated evidence here. Watching hosted exact-head CI before changing draft status. |
|
Final readiness update: exact-head CI run https://github.com/sambitcreate/aiden-agent/actions/runs/34555533957 is fully green at |
There was a problem hiding this comment.
Important
The new guided phone-setup coordinator has a rollback path that can leave phone access enabled when the Tailscale route cleanup fails. A minor error-display issue is inline; a now-unreachable Telegram IPC surface and three nitpicks follow.
Reviewed changes — read the complete 45-file diff at 26477f5b against main (e42b147), covering the new main-process setup coordinator and its tests, the renderer setup/onboarding/Bot/Telegram/voice/schedule flows, Settings discovery, native pairing copy, and the docs/E2E additions.
- Guided phone setup —
AidenRemoteService.setupPairingchecks the reviewed state, enables the selected connection, prepares and verifies the Tailscale route, and opens one pairing session in a single serialized, owner-checked operation with rollback; newremote:setupPairingIPC; two-card Settings surface plus acknowledgement dialog. - Onboarding AI choices — primary grid is ChatGPT, LM Studio, Ollama, and Other Custom Provider; API-key, Anthropic, and Tailscale options move under Other ways; the custom provider reuses
ProviderEditorwithrequireReady. - Two-step Bot editor — fresh desktop drafts start Custom with no grants; model, access, and capability review share one page; failed saves keep the draft.
- Setup review and recovery — Telegram gains three groups and an enable/connect acknowledgement, Computer Use an enable review, schedules a review step with retained errors, plugins a connect-time check, voice an error beside the draft, and the composer a readiness deep link.
- Settings discovery and copy — Aiden On The Go destination with intent aliases, device labels, native iOS/Android pairing instructions, plan/implementation-review docs, and new E2E coverage.
ℹ️ Telegram's previous connect/disconnect surface is now unreachable
telegram-settings.tsx:98,110 drive enablement through telegramApi.setEnabled, so telegramApi.connect/disconnect, the telegram:connect/telegram:disconnect handlers, and the clearOffset path they were the only callers of now have no production caller, while telegram-service-core.test.ts:689-705 still pins the old disconnect() contract. Decide whether to keep them as a supported IPC surface or remove them, and confirm that retaining the polling offset on Disconnect (the old handler cleared it) is intended.
Technical details
# Dead Telegram enable/disable surface
## Affected sites
- `renderer/components/settings/telegram-settings.tsx:98,110` — the only remaining UI callers now use `setEnabled`.
- `renderer/lib/ipc.ts:452-453` — `connect`/`disconnect` wrappers have no remaining caller.
- `main/handlers/telegram.ts:80-88` — handlers unreachable from the renderer.
- `main/services/telegram/telegram-service-core.ts:396-400` — `disconnect()` and therefore `clearOffset()` are unreachable from production.
## Required outcome
- Either remove the unused surface (and update the test contract) or keep it deliberately and note that UI Disconnect no longer resets the persisted `lastUpdateId`.
## Open questions for the human
- Is retaining the offset on Disconnect intentional? It differs from the previous behavior where Disconnect cleared it.ℹ️ Nitpicks
renderer/components/settings/telegram-settings.tsx:98—setEnabled(true)persiststelegramEnabledbeforeassertHealthy()/start()run, so a failed Connect leaves the Advanced switch on while step 3 shows "○ Disconnected" and its Disconnect button (disabled={!polling}) is unavailable.renderer/components/settings/remote-access-settings.tsx:885-892— after a "Phone access changed" failure the review dialog keeps the staleenabled/connectionMode, so retrying from the open dialog fails identically until the user cancels and reopens it.renderer/components/scheduled-task-editor.tsx:258— the review row label "Keep this Mac awake" reads like a setting; the body says Aiden must be open. Consider "Runs while Aiden is open".
DeepSeek Flash | 𝕏
|
Addressed both late Pullfrog findings at |
There was a problem hiding this comment.
ℹ️ No critical issues — one minor test-coverage suggestion inline.
Reviewed changes — read the range-diff since the prior pullfrog review at 26477f5b and the complete 45-file diff at f1326592 against main (e42b147).
- Isolated guided-setup rollback steps —
setupPairingnow runs the external Tailscale route removal and the local listener/state teardown in independenttryblocks, tracks each failure separately, and reports whether local access was actually restored. - Normalized setup error display —
friendlyTailscaleErrorstrips Electron'sError invoking remote method …wrapper before matching, so typedtailscale_*remediation and raw setup messages reach the Callout without the wrapper. - Added regression coverage — a service test drives a failing Tailscale disconnect after a fresh attempt and asserts local access is disabled and the prior mode restored; the renderer contract test pins the wrapper normalization.
DeepSeek Flash | 𝕏
|
Addressed the final Pullfrog coverage finding at exact head |
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — read the range-diff since the prior pullfrog review at f1326592 and the complete 45-file diff at 7594021a against main (e42b147).
- Branch-specific rollback regression test — a new service test starts from
mode: "both"with access already enabled and a failing Tailscale disconnect, asserting the "Existing local access stayed on" message whileenabled,connectionMode,tailscaleOwnership, and listener state stay intact. Swapping the two message branches fails both this test and the fresh-access one, so the coverage is real. - Papercut note — records that the two distinct cleanup outcomes each need their own regression.
DeepSeek Flash | 𝕏
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — reviewed the range-diff since the prior pullfrog review at 7594021a and checked the delta against the 46-file PR diff at 04761bc8 (main e42b147); the new commit is test-only.
- Stabilized scheduled-search E2E cleanup — the reset after filtering now drives
HTMLInputElement.prototype's value setter plus a bubblinginputevent, so an empty Playwrightfillcannot leave the React-controlled search unchanged on hosted Electron, and the test still asserts the list restores. - Papercut note — records the hosted-Electron controlled-input finding for future E2E work.
DeepSeek Flash | 𝕏
|
Final readiness audit complete on exact head |

Setup currently makes people coordinate separate settings before they can connect a phone or start useful work. This change adds guided setup and clearer recovery across the approved UX review, with ChatGPT, LM Studio, Ollama, and Other Custom Provider shown before Other ways, and consistent Create a bot wording.
Review the Now vs proposed HTML, implementation checklist, and 39-journey audit/backlog. Two desktop actions assumes the connection method is already selected and external prerequisites are ready; phone scanning and OS/account permissions are additional steps.
Validation
04761bc8: verification, deterministic Electron E2E, Android build/UI tests, generic iOS test compilation, and production bundles. Pullfrog is green and all review threads are resolved.Remaining release acceptance
Physical iOS-device and live Tailscale/phone acceptance remain operator release checks; they do not block code review or merge readiness. The isolated Electron profile cannot establish native Bot Keychain authority, and production does not add a fallback. The broader journey audit remains Active rather than claiming every journey branch is complete.