feat: IMAP mail sync with thread-to-contact matching (PRD §6.1)
Real IMAP connection via imapflow library: - Connects to IMAP server (IMAPFlow, TLS on port 993) - Fetches recent messages (configurable limit, default 20) - Extracts: from, fromEmail, subject, date, snippet (200 chars) - Thread-to-contact matching (PRD §6.1): 1. Match sender email against persons table 2. If no person match, extract domain and match against company.website 3. Returns matchedCompany + matchedPerson for each email - Audit-logged (action: crm.mailsync:imap) - Zod validated (host, port, user, password, folder, limit) - 502 on IMAP connection failure with detail - 400 on validation failure Tested: invalid creds → 502 'IMAP connection failed', missing host → 400
This commit is contained in:
1 parent
7acc0c5451
commit
e45b68bb8b
1089 files changed
+260614
No files matched your search
Executable
+42
@@ -0,0 +1,42 @@
|
||||
# Execution Guidance
|
||||
|
||||
Reference for executing multi-step implementations.
|
||||
|
||||
## Recommended Flow
|
||||
|
||||
When user approves a step:
|
||||
1. Execute that step
|
||||
2. Verify it works
|
||||
3. Report completion to user
|
||||
4. Wait for user to approve next step
|
||||
|
||||
## Progress Tracking
|
||||
|
||||
Show user the current state:
|
||||
```
|
||||
- [DONE] Step 1 (completed)
|
||||
- [WIP] Step 2 <- awaiting user approval
|
||||
- [ ] Step 3
|
||||
- [ ] Step 4
|
||||
```
|
||||
|
||||
## When to Pause and Ask User
|
||||
|
||||
- Before starting any new step
|
||||
- When encountering an error
|
||||
- When a decision is needed (A vs B)
|
||||
- When credentials or permissions are needed
|
||||
|
||||
## Error Handling
|
||||
|
||||
If an error occurs:
|
||||
1. Report the error to user
|
||||
2. Suggest possible fixes
|
||||
3. Wait for user decision on how to proceed
|
||||
|
||||
## Patterns to Follow
|
||||
|
||||
- Report completion of each step
|
||||
- Ask before proceeding to next step
|
||||
- Let user decide retry strategy
|
||||
- Keep user informed of progress
|
||||
Reference in new issue
Block a user