Repository navigation
feat(import): expose email import to the iOS app - #252
Conversation
Add GET /api/v3/email-import (the import address, the reader's sending addresses and their latest emails, as Settings → Email import shows them) and GET /api/v3/reader-notes (the notes that came with the exports). Both take the browser session or the native ck_ios_ credential, like the existing /api/v3/email-bindings routes the app uses to add, verify and remove addresses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014EpZReoTKSJukkNsgaKaKw
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
☁️ Claude Code cloud · Add email import workflow to iOS clientImplemented the web app’s email-import workflow in the iOS client, including domain models, service integration, UI screens, and test coverage.
27.6M tokens: 700 input · 130.3K output · 27.1M cache read · 361.9K cache write 📝 AI summaryAdded iOS support for email imports by introducing the relevant domain representation in Expanded automated coverage in View this session on ShellTime → Updated 2026-10-30 13:20 UTC by ShellTime · totals for the whole session so far · the session page is visible to its owner |
Summary
The iOS app is getting email import (companion PR: https://github.com/clippingkk/ios-n1, branch
claude/magical-sagan-v4nv25). The app can already call/api/v3/email-bindingswith itsck_ios_bearer, sincerequireUserIdaccepts the native credential first. What it couldn't get was the rest of what Settings → Email import and Settings → Notes render server-side. This PR adds two read-only routes for that:GET /api/v3/email-import→{ address, maxBindings, bindings, history: { total, emails } }addressisINBOUND_EMAIL_ADDRESS, ornullwhile it's unset (the settings page's "not available" state).historyislistInboundEmails(userId)(latest 50,detailalready nulled for readers).GET /api/v3/reader-notes→listReaderNotes(userId)(latest 100 and the total).Both use
route()+noStore, like the binding routes. No schema or migration changes.Docs
docs/email-import.md: adds the two routes to the table, and replaces "(cookie session only)" with whatrequireUserIdactually accepts (cookie or the native credential).docs/native-ios.md: new "Email import" section listing the routes the app uses.CLAUDE.md: one sentence in the Email Import section.Tests
src/server/__tests__/email-import-routes.test.ts: response shape,Cache-Control: no-store,nulladdress when unconfigured, notes, and 401 for a signed-out caller on both routes.pnpm test: 699 passed.pnpm lintandpnpm format:checkare clean.pnpm typecheckshows only the existing image-module errors you get without the generatednext-env.d.ts; none are in these files.Generated by Claude Code