Commit Graph

77 Commits

Author SHA1 Message Date
3ea88f6402 add IMAPIdleHandler: NIO channel handler for IDLE event streaming
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:37:16 +01:00
858cdf5284 replace prefetchBodies with MIME-aware parsing, store attachments during sync
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:35:14 +01:00
0b9bbe1255 add multipart/mixed formatting, base64 line-wrapped encoding to MessageFormatter 2026-03-14 13:32:23 +01:00
968dd91f80 add fetchFullMessage, fetchSection to IMAPClient for MIME attachment retrieval 2026-03-14 13:31:38 +01:00
0a564a05fd add attachment CRUD to MailStore, wire hasAttachments in Queries 2026-03-14 13:29:58 +01:00
17d47cfddd add v4_attachment migration: sectionPath on attachment, hasAttachments on message 2026-03-14 13:29:29 +01:00
aac7c7c0af add MIMEParser: multipart parsing, content decoding, boundary generation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 12:09:10 +01:00
cd7d39de9e add RFC 2047 encoded word decoder for MIME filenames
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 12:07:17 +01:00
a3a99e668f add MIME types: MIMEMessage, MIMEPart, MIMEAttachment, TransferEncoding
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 12:06:32 +01:00
8095000a56 add MIMEParser module target to Package.swift
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 12:06:10 +01:00
b866c3bb8e add v0.5 implementation plan: attachments, MIME parsing, IMAP IDLE 2026-03-14 11:54:26 +01:00
f28b44d445 move v0.1 artifacts to DELETE/, fix xcode build, bump calver to 2026.03.14
- move backend/, clients/, scripts/ to DELETE/ (v0.1 era, replaced by on-device arch)
- delete feature/v0.1-backend-and-macos branch
- add TaskStore dependency to project.yml
- fix ComposeViewModel deinit concurrency, make toMessageSummary public
- regenerate Xcode project, verify macOS build succeeds

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 10:40:41 +01:00
8f63b1c7c1 fix task store wiring: correct directory path, pass to sync coordinator, remove unused stub
- TaskStore directory changed from `tasks-<id>` to `<accountId>/tasks/` per spec
- TaskStore now created before SyncCoordinator and passed as `taskStore:` arg so deferral resurfacing works
- Use `mailStore.databaseWriter` instead of raw `dbPool` for consistency
- Remove unused `deferSelectedItem` stub (all callers use `deferItem(_:until:)` directly)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 10:31:00 +01:00
bec9b7eb40 add app UI for GTD triage: perspectives, task creation, defer/label pickers, linked tasks
- replace mailbox-only sidebar with 6 GTD perspectives (inbox, today, upcoming, projects, someday, archive)
- add TaskEditViewModel/TaskEditView for creating tasks with optional due date, linked message
- add DeferPicker (tomorrow, next week, pick date, someday) and LabelPicker (searchable, type-to-create)
- add GTD triage actions in MailViewModel: defer, file, discard, complete for unified ItemSummary
- add GTD keyboard shortcuts in ThreadListView: d (defer), ⇧D (someday), p (project), ⌘⏎ (complete), ⌫ (discard)
- show linked tasks inline in ThreadDetailView with status badges, merged timeline

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 10:31:00 +01:00
ac824cd72e add deferral resurfacing to SyncCoordinator (task 7)
Import TaskStore, add optional taskStore property, add resurfaceDeferrals()
that clears expired email deferrals and deferred task deferUntil on each sync.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 10:31:00 +01:00
39c0fd40bf add VTODO parser, formatter, TaskStore file I/O with cache rebuild
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 10:31:00 +01:00
a4f0761f25 add v0.4 models, schema, query extensions for GTD tasks, labels, deferrals
New model types: TaskStatus, TaskSummary, LabelInfo, ItemSummary.
GRDB records: TaskRecord, LabelRecord, ItemLabelRecord, DeferralRecord.
Database migrations v3_task, v3_label, v3_deferral with indexes.
MailStore query extensions for labels, item-labels, deferrals, task cache.
TaskStore module wrapping MailStore. Tests for all v3 tables and records.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 10:31:00 +01:00
18e7ff2c47 fix v0.5 spec: address 14 review issues (MIME, IDLE handler, hasAttachments, etc.)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 10:00:57 +01:00
e85e373914 add v0.5 design spec: attachments (send+receive), IMAP IDLE
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 09:57:02 +01:00
1049ca2675 add v0.4 implementation plan: GTD tasks, unified triage, deferrals, labels
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 08:33:21 +01:00
2e502cc08b fix v0.4 spec: address 7 review issues (deferral storage, cache rebuild, key conflict, etc.)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 08:19:19 +01:00
90b679870f add v0.4 design spec: GTD tasks, unified triage, deferrals, labels
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 08:15:55 +01:00
f3da0784b9 wire end-to-end: smtp provider for ActionQueue, actionQueue for SyncCoordinator, body fetch for reply/forward
- MailViewModel.setup() now creates SMTPClient provider when SMTP config is present,
  passes it to ActionQueue so send actions work
- ActionQueue is passed to SyncCoordinator so pending actions flush before sync
- Add ensureBodyLoaded() to fetch message body via IMAP before opening compose
- ThreadDetailView uses callback instead of binding for compose requests,
  allowing ContentView to fetch body before presenting sheet
- Add SMTPClient dependency to both app targets in project.yml

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 06:00:42 +01:00
0bfcf2d610 add triage UI: archive, delete, flag, read/unread, move actions with auto-advance, compose triggers
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 05:55:19 +01:00
5c0c5a5bda add compose flow: ComposeViewModel with draft auto-save, ComposeView with form UI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 05:50:42 +01:00
7d847693d7 extend AutoDiscovery for SMTP, add SMTP fields to account setup UI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 05:32:17 +01:00
cf2b463fd3 add ActionQueue: two-phase enqueue, FIFO flush, retry with max 5 attempts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 05:29:56 +01:00
c38c31bf4d add dot-stuffing for SMTP DATA command (RFC 5321 §4.5.2)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 05:25:55 +01:00
54ce92e280 add SMTPClient module: connection layer, message formatter, public API, tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 05:25:03 +01:00
427f197bb3 add IMAP write operations, special folder role detection
Extend IMAPClientProtocol with storeFlags, moveMessage, copyMessage,
expunge, appendMessage, capabilities methods. Implement all six in
IMAPClient actor using NIOIMAPCore typed commands. Add multi-part
command support to IMAPConnection/IMAPCommandRunner for APPEND.
MockIMAPClient tracks all write calls for testing. SyncCoordinator
detects mailbox roles from LIST attributes with name-based fallback.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 05:13:39 +01:00
d659ed67de add v0.3 schema: smtp fields, mailbox roles, drafts, pending actions, mailstore queries
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 05:01:17 +01:00
8c3f51adb4 fix v0.3 spec: address 11 review issues (concurrency, codable, bcc, folder roles, etc.) 2026-03-13 22:17:49 +01:00
5e1c26aa05 add v0.3 design spec: compose, triage, smtp, action queue 2026-03-13 22:12:47 +01:00
d5661459e4 bump calver to 2026.03.13, v0.2 complete: native swift email client with imap sync, grdb, swiftui
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:39:29 +01:00
a75738a79d add background body prefetch for recent messages (last 30 days)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:34:38 +01:00
deb4c1d15c add offline banner, sync status indicators
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:34:12 +01:00
00b5632f3f add imap auto-discovery: mozilla ispdb, dns srv fallback
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:33:37 +01:00
1b8f3b6665 add keychain credential storage, persist account config
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:25:49 +01:00
74179cb534 add html email rendering with wkwebview, script/tracker blocking
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:23:15 +01:00
e3159d61e8 add three-column swiftui layout: sidebar, thread list, detail, account setup
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:23:04 +01:00
6f0ba20d86 add mail, account setup viewmodels with grdb observation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:23:00 +01:00
1b915fc9ab scaffold multi-platform xcode project with xcodegen
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:17:11 +01:00
21227b3c78 add real IMAPClient actor with NIO connection, command pipeline, envelope parsing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:12:39 +01:00
ec820b2785 add nio connection layer: tls bootstrap, response handler, command runner
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:05:44 +01:00
300b583695 add sync coordinator: imap → mailstore pipeline with delta sync
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 18:32:38 +01:00
ce5c985272 add imap client protocol, types, mock for testing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 18:27:20 +01:00
4670612e75 add FTS5 search, thread summaries, reactive observation streams
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 18:25:18 +01:00
ca3817c683 add thread reconstruction: simplified JWZ with merge support
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 18:21:15 +01:00
abee491cec add mailstore CRUD: accounts, mailboxes, messages, threads, flags, body
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 18:18:59 +01:00
0927d9827d add mailstore schema: accounts, mailboxes, messages, threads, FTS5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 18:16:23 +01:00