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:
Z User committed 2026-10-27 22:50:50 +00:00
1 parent 7acc0c5451
commit e45b68bb8b
1089 files changed
+260614

No files matched your search

@@ -0,0 +1,61 @@
# Shader 代码提取:Agent Prompt 与反混淆
## Agent 深度提取 Prompt 模板
启动 Agent(subagent_type: general-purpose)分析 bundle:
```
分析文件 /tmp/main.js(约 X MB 的 minified JS bundle),提取所有与视觉特效相关的代码。
需要提取的内容:
1. **GLSL Shader 源码**:搜索包含 "precision", "uniform", "void main",
"gl_FragColor", "gl_Position" 的字符串。提取完整的 vertex/fragment shader。
2. **渲染相关 JS 类**:canvas/renderer 创建、粒子/几何体管理、
requestAnimationFrame 动画循环、鼠标交互代码。
3. **符号映射表**:minified 变量名 → 原始含义
(THREE.Vector2, THREE.Color, THREE.Scene 等)
4. **配置和参数**:默认颜色、尺寸、密度等可调参数
将所有提取的代码保存到 /tmp/extracted-effects.txt,按功能分段标注。
```
**关键**:Agent 能看到完整文件,主上下文放不下 1MB+ 的 bundle。
## 识别 Minified 符号
通过构造参数和方法调用推断:
```javascript
new ??(40, w/h, 0.1, 1000) → PerspectiveCamera(fov, aspect, near, far)
new ??(-1, 1, 1, -1, 0, 1) → OrthographicCamera
new ??({canvas, antialias, ...}) → WebGLRenderer
new ??(2, 2) → PlaneGeometry(w, h)
new ??(data, w, h, fmt, type) → DataTexture
new ??(w, h, {minFilter, ...}) → WebGLRenderTarget
??.setRenderTarget() → renderer
??.getElapsedTime() → clock
??.setAttribute() → bufferGeometry
```
## 框架脱壳(React / Vue 等 → Vanilla JS)
Canvas 效果常被 React/Vue 等框架包装。脱壳思路:
1. **找副作用入口**:`useEffect`/`onMounted` 中的 Canvas 初始化代码就是核心逻辑
2. **收集 cleanup**:所有销毁操作(`removeEventListener`、`cancelAnimationFrame`、`observer.disconnect()`)汇总为 `destroy()` 函数
3. **丢弃响应式包装**:Canvas 状态(粒子位置、帧计数等)只在 RAF 内读写,直接用 `let` 变量,不需要 `useState`/`ref` 等响应式容器
原生 API(`IntersectionObserver`、`ResizeObserver`、`matchMedia` 等)不受框架影响,原样保留。
## 反混淆规则
1. **类名**:根据构造参数和方法调用推断
2. **变量名**:根据用途命名(`ringPos`, `particleScale`, `simMaterial`)
3. **Shader 变量**:uniform/varying 名通常未被 minify(`uTime`, `vPosition`)
4. **保留原始 GLSL**:shader 代码通常是完整字符串,直接提取
5. **字符串注入**:`${someVar.noise}` 表示噪声库被注入到 shader 中