@zaclinley/dsh-mailharbor 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/client/index.tsx", "../src/client/styles.css", "../src/client/icon.tsx", "../src/client/api.ts", "../src/client/panel.tsx", "../src/client/ai-rail.tsx", "../src/client/components.tsx", "../src/client/icons.tsx", "../src/client/markdown.tsx", "../src/client/account-form.tsx", "../src/client/composer.tsx", "../src/client/reader.tsx", "../src/client/nav.ts", "../src/client/settings.tsx", "../src/client/tasks-panel.tsx"],
4
- "sourcesContent": ["import styles from './styles.css'\nimport { MailIcon } from './icon.js'\nimport { MailPanel } from './panel.js'\nimport { MailSettings } from './settings.js'\nimport { TasksIcon, TasksPanel } from './tasks-panel.js'\nimport type { ClientContext } from './dsh.js'\n\n/** Keep in sync with package.json (`npm run version` does this). */\nexport const VERSION = '0.7.1'\n\n/** Services required by this browser plugin. */\nexport const inject = ['slots']\n\nconst PANEL_ID = 'mailharbor'\nconst TASKS_PANEL_ID = 'mailharbor-tasks'\nconst STYLE_ID = 'mailharbor-style'\n\nfunction ensureStyles(): void {\n if (document.getElementById(STYLE_ID) !== null) return\n const element = document.createElement('style')\n element.id = STYLE_ID\n element.textContent = styles\n document.head.append(element)\n}\n\n/**\n * MailHarbor browser half: a sidebar panel, the panel page in the main slot,\n * and a settings section. All three read the same same-origin HTTP API.\n */\nexport function apply(ctx: ClientContext): void {\n ensureStyles()\n ctx.slots.inject('main', () => ctx.slots.register({ name: 'main', key: PANEL_ID }, MailPanel))\n ctx.slots.inject('settings.section', () =>\n ctx.slots.register(\n {\n name: 'settings.section',\n id: PANEL_ID,\n order: 35,\n label: () => 'MailHarbor',\n },\n MailSettings,\n ),\n )\n ctx.slots.inject('sidebar.panellist', () =>\n ctx.slots.register(\n {\n name: 'sidebar.panellist',\n id: PANEL_ID,\n order: 20,\n label: 'MailHarbor',\n },\n MailIcon,\n ),\n )\n ctx.slots.inject('main', () => ctx.slots.register({ name: 'main', key: TASKS_PANEL_ID }, TasksPanel))\n ctx.slots.inject('sidebar.panellist', () =>\n ctx.slots.register(\n {\n name: 'sidebar.panellist',\n id: TASKS_PANEL_ID,\n order: 21,\n label: '\u4EFB\u52A1',\n },\n TasksIcon,\n ),\n )\n}\n\nexport { PANEL_ID, TASKS_PANEL_ID }\n", "/* MailHarbor panel + settings.\n Tokens come from the DSH shell (dark by default); fallbacks match the\n default dark theme so the panel also renders in a bare host page.\n Component rules are all scoped under `.mailharbor` and the generic element\n reset lives in `:where()` so it cannot outrank a component class. */\n\n.mailharbor {\n --m-bg: var(--dsw-alias-bg-base, #151517);\n --m-bg-1: var(--dsw-alias-bg-layer-1, #232324);\n --m-bg-2: var(--dsw-alias-bg-layer-2, #2c2c2e);\n --m-bg-3: var(--dsw-alias-bg-layer-3, #353638);\n --m-line: var(--dsw-alias-border-l2, #ffffff1f);\n --m-line-soft: var(--dsw-alias-border-l1, #ffffff0f);\n --m-line-strong: var(--dsw-alias-border-l3, #ffffff29);\n --m-text: var(--dsw-alias-label-primary, #f9fafb);\n --m-text-2: var(--dsw-alias-label-secondary, #cfd3d6);\n --m-text-3: var(--dsw-alias-label-tertiary, #adb2b8);\n --m-caption: var(--dsw-alias-label-caption, #81858c);\n --m-accent: #5686fe;\n --m-accent-soft: rgba(86, 134, 254, 0.14);\n --m-primary-bg: var(--dsw-alias-brand-primary, #f9fafb);\n --m-primary-fg: var(--dsw-alias-label-primary-foreground, #0f1115);\n --m-hover: var(--dsw-alias-interactive-bg-hover, #ffffff14);\n --m-danger: #f25a5a;\n --m-ok: #3fbf7f;\n --m-warn: var(--dsw-alias-state-warn-label, #dd8629);\n --m-radius: 8px;\n --m-shadow: 0 18px 60px rgba(0, 0, 0, 0.5);\n\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--m-bg);\n color: var(--m-text);\n font-size: 13px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n}\n\n.mailharbor *,\n.mailharbor *::before,\n.mailharbor *::after {\n box-sizing: border-box;\n}\n\n/* ---------- base controls ---------- */\n\n.mailharbor :where(button) {\n font: inherit;\n color: inherit;\n background: transparent;\n border: 0;\n margin: 0;\n cursor: pointer;\n}\n\n.mailharbor button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 30px;\n padding: 0 12px;\n border-radius: var(--m-radius);\n border: 1px solid transparent;\n color: var(--m-text-2);\n font-size: 12.5px;\n font-weight: 500;\n white-space: nowrap;\n transition:\n background 120ms ease,\n color 120ms ease,\n border-color 120ms ease;\n}\n\n.mailharbor button:hover:not(:disabled) {\n background: var(--m-hover);\n color: var(--m-text);\n}\n\n.mailharbor button:disabled {\n opacity: 0.45;\n cursor: default;\n}\n\n.mailharbor button.primary {\n background: var(--m-primary-bg);\n color: var(--m-primary-fg);\n border-color: transparent;\n}\n\n.mailharbor button.primary:hover:not(:disabled) {\n background: var(--m-primary-bg);\n filter: brightness(0.94);\n color: var(--m-primary-fg);\n}\n\n.mailharbor button.ghost {\n border-color: var(--m-line);\n color: var(--m-text-2);\n}\n\n.mailharbor button.ghost:hover:not(:disabled) {\n border-color: var(--m-line-strong);\n color: var(--m-text);\n}\n\n.mailharbor button.subtle {\n color: var(--m-text-3);\n padding: 0 8px;\n}\n\n.mailharbor button.icon {\n width: 30px;\n padding: 0;\n}\n\n.mailharbor button.danger {\n color: var(--m-danger);\n}\n\n.mailharbor input,\n.mailharbor select,\n.mailharbor textarea {\n font: inherit;\n color: var(--m-text);\n background: var(--m-bg-1);\n border: 1px solid var(--m-line);\n border-radius: var(--m-radius);\n padding: 0 10px;\n height: 32px;\n min-width: 0;\n}\n\n.mailharbor textarea {\n height: auto;\n padding: 8px 10px;\n resize: vertical;\n line-height: 1.6;\n}\n\n.mailharbor select {\n padding-right: 26px;\n appearance: none;\n background-image:\n linear-gradient(45deg, transparent 50%, var(--m-text-3) 50%),\n linear-gradient(135deg, var(--m-text-3) 50%, transparent 50%);\n background-position:\n calc(100% - 15px) 14px,\n calc(100% - 10px) 14px;\n background-size:\n 5px 5px,\n 5px 5px;\n background-repeat: no-repeat;\n}\n\n.mailharbor ::placeholder {\n color: var(--m-caption);\n}\n\n.mailharbor input:focus-visible,\n.mailharbor select:focus-visible,\n.mailharbor textarea:focus-visible,\n.mailharbor button:focus-visible,\n.mailharbor [contenteditable='true']:focus-visible {\n outline: 2px solid rgba(86, 134, 254, 0.55);\n outline-offset: -1px;\n}\n\n.mailharbor .spacer {\n flex: 1;\n}\n\n.mailharbor .muted {\n color: var(--m-text-3);\n}\n\n.mailharbor .small {\n font-size: 12px;\n}\n\n.mailharbor .badge {\n display: inline-flex;\n align-items: center;\n height: 18px;\n padding: 0 6px;\n border-radius: 999px;\n font-size: 10.5px;\n font-weight: 500;\n background: var(--m-bg-3);\n color: var(--m-text-2);\n}\n\n.mailharbor .badge.ok {\n background: rgba(63, 191, 127, 0.16);\n color: var(--m-ok);\n}\n\n.mailharbor .badge.warn {\n background: rgba(221, 134, 41, 0.16);\n color: var(--m-warn);\n}\n\n.mailharbor .error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n color: var(--m-danger);\n background: rgba(242, 90, 90, 0.1);\n border-bottom: 1px solid rgba(242, 90, 90, 0.2);\n font-size: 12.5px;\n}\n\n/* ---------- shell ---------- */\n\n.mailharbor-topbar {\n display: flex;\n align-items: center;\n gap: 10px;\n height: 52px;\n padding: 0 14px;\n border-bottom: 1px solid var(--m-line-soft);\n background: var(--m-bg);\n flex: none;\n}\n\n.mailharbor-account {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n max-width: 220px;\n padding: 4px 8px 4px 4px;\n border-radius: 999px;\n border: 1px solid transparent;\n cursor: default;\n}\n\n.mailharbor-account:hover {\n background: var(--m-hover);\n}\n\n.mailharbor-account .name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.mailharbor-account select {\n height: 26px;\n background: transparent;\n border-color: transparent;\n font-weight: 500;\n}\n\n.mailharbor-body {\n display: flex;\n flex: 1;\n min-height: 0;\n position: relative;\n}\n\n.mailharbor button.active {\n background: var(--m-accent-soft);\n color: var(--m-text);\n}\n\n.mailharbor-list {\n display: flex;\n flex-direction: column;\n width: 360px;\n flex: none;\n border-right: 1px solid var(--m-line-soft);\n min-height: 0;\n}\n\n.mailharbor-reader {\n flex: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n@media (max-width: 1000px) {\n .mailharbor-list {\n width: 300px;\n }\n}\n\n.mailharbor-narrow .mailharbor-body[data-mode='reader'] .mailharbor-list {\n display: none;\n}\n\n.mailharbor-narrow .mailharbor-body[data-mode='list'] .mailharbor-reader {\n display: none;\n}\n\n/* ---------- segmented control ---------- */\n\n.mailharbor-segment {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 2px;\n border-radius: 9px;\n background: var(--m-bg-2);\n}\n\n.mailharbor-segment button {\n height: 26px;\n padding: 0 12px;\n border-radius: 7px;\n color: var(--m-text-3);\n font-size: 12px;\n}\n\n.mailharbor-segment button:hover:not(.active) {\n color: var(--m-text-2);\n background: transparent;\n}\n\n.mailharbor-segment button.active {\n background: var(--m-bg-3);\n color: var(--m-text);\n}\n\n/* ---------- list ---------- */\n\n.mailharbor-filters {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-filters select {\n width: 128px;\n flex: none;\n font-size: 12px;\n}\n\n.mailharbor-filters input[type='search'] {\n flex: 1;\n height: 30px;\n font-size: 12.5px;\n}\n\n.mailharbor-rows {\n flex: 1;\n overflow: auto;\n min-height: 0;\n}\n\n.mailharbor-row {\n display: flex;\n flex-direction: column;\n gap: 3px;\n width: 100%;\n padding: 10px 14px;\n border: 0;\n border-bottom: 1px solid var(--m-line-soft);\n border-left: 2px solid transparent;\n border-radius: 0;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}\n\n.mailharbor-row:hover {\n background: var(--m-hover);\n}\n\n.mailharbor-row.selected {\n background: var(--m-accent-soft);\n border-left-color: var(--m-accent);\n}\n\n.mailharbor-row .line-1,\n.mailharbor-row .line-2 {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n width: 100%;\n}\n\n.mailharbor-row .from {\n font-weight: 600;\n font-size: 12.5px;\n color: var(--m-text-2);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mailharbor-row .date {\n margin-left: auto;\n color: var(--m-caption);\n font-size: 11px;\n flex: none;\n}\n\n.mailharbor-row .subject {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--m-text-2);\n font-size: 12.5px;\n}\n\n.mailharbor-row .snippet {\n color: var(--m-caption);\n font-size: 11.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n}\n\n.mailharbor-row.unread .from,\n.mailharbor-row.unread .subject {\n color: var(--m-text);\n}\n\n.mailharbor-row .dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--m-accent);\n flex: none;\n}\n\n.mailharbor-row .paperclip {\n color: var(--m-caption);\n flex: none;\n display: inline-flex;\n}\n\n.mailharbor-list-foot {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-top: 1px solid var(--m-line-soft);\n color: var(--m-text-3);\n font-size: 11.5px;\n flex: none;\n}\n\n.mailharbor-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 48px 24px;\n color: var(--m-text-3);\n text-align: center;\n}\n\n.mailharbor-empty svg {\n opacity: 0.5;\n}\n\n.mailharbor-empty .title {\n color: var(--m-text-2);\n font-size: 13px;\n font-weight: 500;\n}\n\n/* ---------- reader ---------- */\n\n.mailharbor-reader-head {\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.mailharbor-reader-title {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.mailharbor-reader-title h2 {\n margin: 0;\n font-size: 17px;\n line-height: 1.35;\n font-weight: 600;\n letter-spacing: -0.01em;\n word-break: break-word;\n}\n\n.mailharbor-reader-meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 10px;\n color: var(--m-text-3);\n font-size: 12px;\n}\n\n.mailharbor-reader-meta .who {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: var(--m-text-2);\n}\n\n.mailharbor-reader-meta .who strong {\n color: var(--m-text);\n font-weight: 600;\n}\n\n.mailharbor-reader-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.mailharbor-reader-body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n padding: 14px 18px 18px;\n background: var(--m-bg-2);\n}\n\n.mailharbor-reader-body iframe {\n flex: 1;\n width: 100%;\n border: 0;\n border-radius: 10px;\n background: #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n\n.mailharbor-reader-body pre {\n flex: 1;\n overflow: auto;\n margin: 0;\n padding: 20px 22px;\n white-space: pre-wrap;\n word-break: break-word;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n color: #171a21;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12.5px;\n line-height: 1.7;\n}\n\n.mailharbor-attachments {\n padding: 10px 18px;\n border-top: 1px solid var(--m-line-soft);\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n flex: none;\n background: var(--m-bg);\n}\n\n.mailharbor-attachment {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n height: 30px;\n padding: 0 10px;\n border: 1px solid var(--m-line);\n border-radius: var(--m-radius);\n font-size: 12px;\n text-decoration: none;\n color: var(--m-text-2);\n max-width: 260px;\n background: var(--m-bg-1);\n}\n\n.mailharbor-attachment:hover {\n border-color: var(--m-line-strong);\n color: var(--m-text);\n}\n\n.mailharbor-attachment .name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ---------- AI rail ---------- */\n\n.mailharbor-ai {\n display: flex;\n flex-direction: column;\n width: 340px;\n flex: none;\n min-height: 0;\n border-left: 1px solid var(--m-line-soft);\n background: var(--m-bg);\n}\n\n.mailharbor-ai-head {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 46px;\n padding: 0 8px 0 14px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-ai-head strong {\n font-size: 13px;\n font-weight: 600;\n}\n\n.mailharbor-ai-confirm {\n display: inline-flex;\n gap: 2px;\n}\n\n.mailharbor-ai-context {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 9px 14px 10px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-ai-context strong {\n font-size: 12.5px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mailharbor-ai-warn {\n padding: 8px 14px;\n color: var(--m-warn);\n background: rgba(221, 134, 41, 0.1);\n font-size: 12px;\n flex: none;\n}\n\n.mailharbor-ai-quick {\n display: flex;\n gap: 6px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-ai-quick button {\n flex: 1;\n padding: 0 6px;\n}\n\n.mailharbor-ai-list {\n flex: 1;\n min-height: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px 14px;\n}\n\n.mailharbor-ai-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 30px 12px;\n text-align: center;\n color: var(--m-text-3);\n}\n\n.mailharbor-ai-empty .title {\n color: var(--m-text-2);\n font-weight: 500;\n font-size: 12.5px;\n}\n\n.mailharbor-ai-card {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--m-line-soft);\n border-radius: 10px;\n background: var(--m-bg-1);\n overflow: hidden;\n}\n\n.mailharbor-ai-card.generating {\n opacity: 0.7;\n}\n\n.mailharbor-ai-card-head {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 8px 7px 12px;\n border-bottom: 1px solid var(--m-line-soft);\n font-size: 11.5px;\n color: var(--m-text-3);\n}\n\n.mailharbor-ai-card-head > span:first-child {\n color: var(--m-text-2);\n font-weight: 600;\n}\n\n.mailharbor-ai-summary {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 10px 12px;\n}\n\n.mailharbor-ai-summary section h4 {\n margin: 0 0 3px;\n font-size: 11px;\n color: var(--m-text-3);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.mailharbor-ai-summary section p {\n margin: 0;\n white-space: pre-wrap;\n font-size: 12.5px;\n line-height: 1.65;\n color: var(--m-text);\n}\n\n.mailharbor-ai-text {\n padding: 10px 12px;\n max-height: 320px;\n overflow: auto;\n white-space: pre-wrap;\n font-size: 12.5px;\n line-height: 1.65;\n color: var(--m-text);\n}\n\n.mailharbor-ai-card-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n padding: 6px 8px;\n border-top: 1px solid var(--m-line-soft);\n}\n\n.mailharbor-ai-card-actions button {\n height: 26px;\n padding: 0 8px;\n font-size: 11.5px;\n}\n\n.mailharbor-ai-ask {\n display: flex;\n gap: 6px;\n padding: 10px 12px;\n border-top: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-ai-ask input {\n flex: 1;\n height: 32px;\n}\n\n.mailharbor-ai-error {\n color: var(--m-danger);\n font-size: 12px;\n padding: 0 2px;\n}\n\n@media (max-width: 1280px) {\n .mailharbor-ai {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: min(420px, 94%);\n z-index: 6;\n border-left: 1px solid var(--m-line);\n box-shadow: -12px 0 40px rgba(0, 0, 0, 0.45);\n }\n}\n\n/* ---------- AI summary ---------- */\n\n.mailharbor-divider {\n width: 1px;\n height: 18px;\n margin: 0 4px;\n background: var(--m-line);\n}\n\n.mailharbor-summary {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.mailharbor-summary section h4 {\n margin: 0 0 6px;\n font-size: 11.5px;\n font-weight: 600;\n color: var(--m-text-3);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n.mailharbor-summary section p {\n margin: 0;\n white-space: pre-wrap;\n line-height: 1.75;\n color: var(--m-text);\n}\n\n/* ---------- modal / forms ---------- */\n\n.mailharbor-portal {\n position: fixed;\n inset: 0;\n z-index: 80;\n height: auto;\n background: transparent;\n pointer-events: none;\n}\n\n.mailharbor-portal .mailharbor-modal-mask {\n pointer-events: auto;\n}\n\n.mailharbor-modal-mask {\n position: fixed;\n inset: 0;\n z-index: 60;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: rgba(0, 0, 0, 0.55);\n backdrop-filter: blur(2px);\n}\n\n.mailharbor-modal {\n display: flex;\n flex-direction: column;\n width: min(720px, 100%);\n max-height: 86vh;\n overflow: hidden;\n border: 1px solid var(--m-line);\n border-radius: 14px;\n background: var(--m-bg-1);\n color: var(--m-text);\n box-shadow: var(--m-shadow);\n}\n\n.mailharbor-modal > header {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 52px;\n padding: 0 14px 0 18px;\n border-bottom: 1px solid var(--m-line-soft);\n font-size: 14px;\n font-weight: 600;\n}\n\n.mailharbor-modal .content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 18px;\n overflow: auto;\n}\n\n.mailharbor-modal > footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 18px;\n border-top: 1px solid var(--m-line-soft);\n}\n\n.mailharbor-field {\n display: flex;\n flex-direction: column;\n gap: 5px;\n min-width: 0;\n}\n\n.mailharbor-field > input,\n.mailharbor-field > select,\n.mailharbor-field > textarea,\n.mailharbor-card > textarea {\n width: 100%;\n min-width: 0;\n}\n\n.mailharbor-field > label {\n font-size: 11.5px;\n color: var(--m-text-3);\n}\n\n.mailharbor-grid {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n gap: 10px;\n min-width: 0;\n}\n\n.mailharbor-grid.three {\n grid-template-columns: minmax(0, 2fr) minmax(72px, 90px) auto;\n align-items: end;\n min-width: 0;\n}\n\n.mailharbor-toggle {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n color: var(--m-text-2);\n font-size: 12.5px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.mailharbor-toggle input[type='checkbox'] {\n width: 14px;\n height: 14px;\n accent-color: var(--m-accent);\n}\n\n/* ---------- composer ---------- */\n\n.mailharbor-toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-wrap: wrap;\n padding: 6px;\n border: 1px solid var(--m-line-soft);\n border-bottom: 0;\n border-radius: 10px 10px 0 0;\n background: var(--m-bg-2);\n}\n\n.mailharbor-toolbar button {\n height: 26px;\n padding: 0 9px;\n border-radius: 6px;\n color: var(--m-text-2);\n font-size: 12px;\n}\n\n.mailharbor-toolbar button:hover {\n background: var(--m-bg-3);\n color: var(--m-text);\n}\n\n.mailharbor-editor {\n min-height: 240px;\n max-height: 44vh;\n overflow: auto;\n padding: 14px 16px;\n border: 1px solid var(--m-line-soft);\n border-radius: 0 0 10px 10px;\n background: #fff;\n color: #171a21;\n outline: none;\n font-size: 13.5px;\n line-height: 1.7;\n}\n\n.mailharbor-editor:empty::before {\n content: attr(data-placeholder);\n color: #9aa0ab;\n}\n\n/* ---------- inline confirm ---------- */\n\n.mailharbor-confirm {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 8px;\n border: 1px solid var(--m-line);\n background: var(--m-bg-2);\n color: var(--m-text-2);\n font-size: 12.5px;\n}\n\n/* ---------- selection / extraction ---------- */\n\n.mailharbor-selectbar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n margin: 0 12px 8px;\n border: 1px solid var(--m-accent-soft);\n border-radius: 9px;\n background: var(--m-accent-soft);\n}\n\n.mailharbor-selectbar select {\n height: 28px;\n max-width: 200px;\n}\n\n.mailharbor-row.selectable input[type='checkbox'] {\n width: 15px;\n height: 15px;\n flex: none;\n accent-color: var(--m-accent);\n}\n\n.mailharbor-extract-row {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 9px 10px;\n border: 1px solid var(--m-line-soft);\n border-radius: 9px;\n background: var(--m-bg-1);\n cursor: pointer;\n}\n\n.mailharbor-extract-row input {\n margin-top: 2px;\n accent-color: var(--m-accent);\n}\n\n.mailharbor-extract-row > span {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 0;\n}\n\n.mailharbor-kv {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n gap: 6px 12px;\n margin: 0;\n font-size: 12.5px;\n}\n\n.mailharbor-kv dt {\n color: var(--m-text-3);\n}\n\n.mailharbor-kv dd {\n margin: 0;\n overflow-wrap: anywhere;\n}\n\n/* ---------- tasks panel ---------- */\n\n.mailharbor .chip {\n height: 26px;\n padding: 0 10px;\n border: 1px solid var(--m-line);\n border-radius: 999px;\n color: var(--m-text-3);\n font-size: 12px;\n}\n\n.mailharbor .chip.active {\n background: var(--m-accent-soft);\n border-color: transparent;\n color: var(--m-text);\n}\n\n.tasks-body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 18px;\n padding: 18px 20px 48px;\n width: 100%;\n max-width: 940px;\n margin: 0 auto;\n}\n\n.tasks-overview {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));\n gap: 12px;\n}\n\n.tasks-progress,\n.tasks-project {\n display: flex;\n flex-direction: column;\n gap: 7px;\n padding: 12px 14px;\n border: 1px solid var(--m-line-soft);\n border-radius: 12px;\n background: var(--m-bg-1);\n min-width: 0;\n}\n\n.tasks-progress-head,\n.tasks-project-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n min-width: 0;\n}\n\n.tasks-project-head .name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12.5px;\n font-weight: 500;\n}\n\n.tasks-bar {\n height: 6px;\n border-radius: 999px;\n background: var(--m-bg-3);\n overflow: hidden;\n}\n\n.tasks-bar span {\n display: block;\n height: 100%;\n border-radius: 999px;\n background: var(--m-accent);\n transition: width 200ms ease;\n}\n\n.tasks-bar.small {\n height: 4px;\n}\n\n.tasks-filters {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.tasks-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.tasks-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 9px 12px;\n border: 1px solid var(--m-line-soft);\n border-radius: 10px;\n background: var(--m-bg-1);\n}\n\n.tasks-row input[type='checkbox'] {\n width: 16px;\n height: 16px;\n flex: none;\n accent-color: var(--m-accent);\n}\n\n.tasks-row .tasks-title {\n flex: 1;\n min-width: 0;\n height: auto;\n padding: 0;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n text-align: left;\n border: 0;\n background: transparent;\n}\n\n.tasks-row .tasks-title:hover {\n background: transparent;\n}\n\n.tasks-row .tasks-title > span:first-child {\n font-size: 13px;\n color: var(--m-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n}\n\n.tasks-row.done .tasks-title > span:first-child {\n color: var(--m-text-3);\n text-decoration: line-through;\n}\n\n.tasks-meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--m-text-3);\n}\n\n.tasks-meta .due.overdue {\n color: var(--m-danger);\n}\n\n.tasks-list-wrap {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n/* ---------- markdown ---------- */\n\n.mailharbor-markdown {\n display: flex;\n flex-direction: column;\n gap: 8px;\n font-size: 12.5px;\n line-height: 1.68;\n overflow-wrap: anywhere;\n}\n\n.mailharbor-markdown > *:first-child {\n margin-top: 0;\n}\n\n.mailharbor-markdown > *:last-child {\n margin-bottom: 0;\n}\n\n.mailharbor-markdown p {\n margin: 0;\n white-space: pre-wrap;\n}\n\n.mailharbor-markdown h1,\n.mailharbor-markdown h2,\n.mailharbor-markdown h3,\n.mailharbor-markdown h4,\n.mailharbor-markdown h5,\n.mailharbor-markdown h6 {\n margin: 4px 0 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--m-text);\n}\n\n.mailharbor-markdown ul,\n.mailharbor-markdown ol {\n margin: 0;\n padding-left: 20px;\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.mailharbor-markdown li::marker {\n color: var(--m-text-3);\n}\n\n.mailharbor-markdown a {\n color: var(--m-accent);\n text-decoration: none;\n}\n\n.mailharbor-markdown a:hover {\n text-decoration: underline;\n}\n\n.mailharbor-markdown code {\n padding: 1px 4px;\n border-radius: 4px;\n background: var(--m-bg-2);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11.5px;\n}\n\n.mailharbor-markdown pre {\n margin: 0;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--m-bg);\n border: 1px solid var(--m-line-soft);\n overflow: auto;\n}\n\n.mailharbor-markdown pre code {\n padding: 0;\n background: transparent;\n}\n\n.mailharbor-markdown blockquote {\n margin: 0;\n padding-left: 10px;\n border-left: 2px solid var(--m-line);\n color: var(--m-text-2);\n}\n\n.mailharbor-markdown hr {\n width: 100%;\n margin: 4px 0;\n border: 0;\n border-top: 1px solid var(--m-line-soft);\n}\n\n/* ---------- composer AI ---------- */\n\n.mailharbor-toolbar button.ai {\n color: var(--m-accent);\n}\n\n.mailharbor-compose-foot {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n flex-wrap: wrap;\n}\n\n.mailharbor-versions {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n padding-top: 8px;\n}\n\n.mailharbor-versions .chip {\n height: 22px;\n padding: 0 8px;\n border: 1px solid var(--m-line);\n border-radius: 999px;\n color: var(--m-text-3);\n font-size: 11px;\n}\n\n.mailharbor-versions .chip.active {\n background: var(--m-accent-soft);\n border-color: transparent;\n color: var(--m-text);\n}\n\n/* ---------- settings ---------- */\n\n.mailharbor.mailharbor-settings-page {\n height: auto;\n min-height: 100%;\n overflow: visible;\n}\n\n.mailharbor-settings {\n flex: 0 0 auto;\n width: 100%;\n max-width: 100%;\n min-width: 0;\n padding: 18px 20px 48px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n overflow-x: hidden;\n}\n\n.mailharbor-settings > * {\n min-width: 0;\n}\n\n.mailharbor-settings h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n letter-spacing: -0.01em;\n}\n\n.mailharbor-settings h3 {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--m-text-3);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n.mailharbor-card {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border: 1px solid var(--m-line-soft);\n border-radius: 12px;\n background: var(--m-bg-1);\n min-width: 0;\n overflow: hidden;\n}\n\n.mailharbor-account-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.mailharbor-account-row .meta {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.mailharbor-account-row .meta strong {\n font-weight: 600;\n}\n\n.mailharbor-account-row .meta span {\n color: var(--m-text-3);\n font-size: 11.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mailharbor .avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n border-radius: 50%;\n background: var(--m-accent-soft);\n color: var(--m-accent);\n font-weight: 600;\n}\n\n.mailharbor-log {\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--m-bg);\n border: 1px solid var(--m-line-soft);\n color: var(--m-text-2);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n line-height: 1.6;\n max-height: 220px;\n overflow: auto;\n white-space: pre-wrap;\n}\n\n.mailharbor-kv {\n display: grid;\n grid-template-columns: minmax(120px, 170px) 1fr;\n gap: 6px 14px;\n font-size: 12px;\n margin: 0;\n}\n\n.mailharbor-kv dt {\n color: var(--m-text-3);\n}\n\n.mailharbor-kv dd {\n margin: 0;\n color: var(--m-text-2);\n word-break: break-all;\n}\n\n.mailharbor hr {\n border: 0;\n border-top: 1px solid var(--m-line-soft);\n margin: 2px 0;\n}\n\n/* ---------- conversation rows ---------- */\n\n.mailharbor-thread {\n display: flex;\n flex-direction: column;\n}\n\n.mailharbor-row.compact {\n padding-top: 6px;\n padding-bottom: 6px;\n padding-left: 34px;\n background: var(--m-bg);\n}\n\n.mailharbor-row.compact .line-1 {\n opacity: 0.85;\n}\n\n.mailharbor-row.compact .snippet {\n -webkit-line-clamp: 1;\n}\n\n.mailharbor .to-label {\n font-size: 10.5px;\n color: var(--m-text-3);\n flex: none;\n}\n\n.mailharbor .thread-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 999px;\n background: var(--m-bg-3);\n color: var(--m-text-2);\n font-size: 10.5px;\n flex: none;\n}\n\n.mailharbor .thread-count:hover {\n background: var(--m-accent-soft);\n color: var(--m-text);\n}\n\n.mailharbor-account {\n height: auto;\n padding: 3px 8px 3px 3px;\n border-radius: 8px;\n gap: 8px;\n}\n\n.mailharbor-account:hover {\n background: var(--m-hover);\n}\n\n/* ---------- mailbox sidebar ---------- */\n\n.mailharbor-side {\n display: flex;\n flex-direction: column;\n gap: 2px;\n width: 214px;\n flex: none;\n padding: 10px 8px;\n overflow: auto;\n border-right: 1px solid var(--m-line-soft);\n background: var(--m-bg);\n}\n\n.mailharbor-side-section {\n padding: 12px 8px 4px;\n font-size: 10.5px;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--m-text-3);\n}\n\n.mailharbor-side-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n height: 32px;\n padding: 0 8px;\n border-radius: 8px;\n color: var(--m-text-2);\n font-size: 12.5px;\n text-align: left;\n flex: none;\n}\n\n.mailharbor-side-item:hover {\n background: var(--m-hover);\n}\n\n.mailharbor-side-item.active {\n background: var(--m-accent-soft);\n color: var(--m-text);\n}\n\n.mailharbor-side-item .name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mailharbor-side-item .sub {\n display: block;\n font-size: 10.5px;\n color: var(--m-text-3);\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mailharbor-side-item .count {\n font-size: 11px;\n color: var(--m-text-3);\n}\n\n.mailharbor-side-item svg {\n flex: none;\n color: var(--m-text-3);\n}\n\n.mailharbor-side-item.active svg {\n color: var(--m-accent);\n}\n\n@media (max-width: 900px) {\n .mailharbor-side {\n display: none;\n }\n}\n\n/* ---------- task board ---------- */\n\n.tasks-board-wrap {\n flex: 1;\n min-height: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding: 16px 18px 40px;\n}\n\n.tasks-summary {\n display: flex;\n align-items: center;\n gap: 20px;\n padding: 14px 16px;\n border: 1px solid var(--m-line-soft);\n border-radius: 12px;\n background: var(--m-bg-1);\n}\n\n.tasks-summary-main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 7px;\n}\n\n.tasks-summary-labels {\n display: flex;\n align-items: baseline;\n gap: 10px;\n}\n\n.tasks-stats {\n display: flex;\n gap: 18px;\n}\n\n.tasks-stat {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 42px;\n}\n\n.tasks-stat strong {\n font-size: 16px;\n font-weight: 600;\n color: var(--m-text);\n}\n\n.tasks-stat span {\n font-size: 11px;\n color: var(--m-text-3);\n}\n\n.tasks-stat.danger strong {\n color: var(--m-danger);\n}\n\n.tasks-toolbar {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.tasks-board {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: 14px;\n align-items: start;\n}\n\n.task-column {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-height: 140px;\n padding: 8px;\n border: 1px solid var(--m-line-soft);\n border-radius: 12px;\n background: var(--m-bg-1);\n}\n\n.task-column-head {\n display: flex;\n align-items: center;\n gap: 7px;\n padding: 2px 4px 6px;\n}\n\n.task-column-head strong {\n font-size: 12.5px;\n font-weight: 600;\n}\n\n.task-column-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 999px;\n background: var(--m-bg-3);\n color: var(--m-text-3);\n font-size: 10.5px;\n}\n\n.task-dot {\n width: 7px;\n height: 7px;\n border-radius: 999px;\n background: var(--m-text-3);\n}\n\n.task-dot.NEEDS-ACTION {\n background: #8a8f98;\n}\n\n.task-dot.IN-PROCESS {\n background: var(--m-accent);\n}\n\n.task-dot.COMPLETED {\n background: var(--m-ok);\n}\n\n.task-dot.CANCELLED {\n background: var(--m-danger);\n opacity: 0.7;\n}\n\n.task-column-body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-height: 60px;\n}\n\n.task-column-empty {\n padding: 18px 8px;\n text-align: center;\n color: var(--m-text-3);\n font-size: 11.5px;\n border: 1px dashed var(--m-line-soft);\n border-radius: 9px;\n}\n\n.task-card {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px 11px;\n border: 1px solid var(--m-line-soft);\n border-radius: 10px;\n background: var(--m-bg);\n cursor: grab;\n transition:\n border-color 120ms ease,\n box-shadow 120ms ease;\n}\n\n.task-card:hover {\n border-color: var(--m-line);\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.16);\n}\n\n.task-card.dragging {\n opacity: 0.5;\n}\n\n.task-card-top {\n display: flex;\n align-items: flex-start;\n gap: 7px;\n}\n\n.task-card-title {\n flex: 1;\n min-width: 0;\n font-size: 12.5px;\n line-height: 1.45;\n color: var(--m-text);\n overflow-wrap: anywhere;\n}\n\n.task-priority {\n width: 3px;\n height: 14px;\n margin-top: 2px;\n border-radius: 999px;\n background: transparent;\n flex: none;\n}\n\n.task-priority.p5 {\n background: #d9a441;\n}\n\n.task-priority.p9 {\n background: var(--m-danger);\n}\n\n.task-card-delete {\n width: 18px;\n height: 18px;\n flex: none;\n border-radius: 5px;\n color: var(--m-text-3);\n opacity: 0;\n}\n\n.task-card:hover .task-card-delete {\n opacity: 1;\n}\n\n.task-card-notes {\n margin: 0;\n font-size: 11.5px;\n line-height: 1.55;\n color: var(--m-text-3);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.task-card-meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n font-size: 10.5px;\n color: var(--m-text-3);\n}\n\n.task-due,\n.task-owner,\n.task-project,\n.task-priority-label {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 6px;\n border-radius: 5px;\n background: var(--m-bg-2);\n}\n\n.task-due.overdue {\n color: var(--m-danger);\n background: rgba(242, 90, 90, 0.12);\n}\n\n.task-project {\n color: var(--m-accent);\n background: var(--m-accent-soft);\n}\n\n.task-source {\n align-self: flex-start;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n height: 22px;\n padding: 0 6px;\n border-radius: 5px;\n color: var(--m-text-3);\n font-size: 10.5px;\n}\n\n.task-source:hover {\n background: var(--m-hover);\n color: var(--m-text-2);\n}\n\n@media (max-width: 1180px) {\n .tasks-board {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n@media (max-width: 720px) {\n .tasks-board {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n/* ---------- AI search ---------- */\n\n.mailharbor-ai-search {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 12px 8px;\n padding: 7px 10px;\n border-radius: 8px;\n background: var(--m-accent-soft);\n color: var(--m-text-2);\n font-size: 12px;\n}\n\n.mailharbor-ai-search.searching {\n background: var(--m-bg-2);\n color: var(--m-text-3);\n}\n\n/* ---------- task editor ---------- */\n\n.mailharbor-tasks .mailharbor-modal {\n max-width: 760px;\n}\n\n.task-editor {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 230px;\n gap: 18px;\n}\n\n.task-editor-main {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n}\n\n.task-editor-title input {\n width: 100%;\n height: 38px;\n font-size: 15px;\n font-weight: 500;\n}\n\n.task-editor-section {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.task-editor-section label,\n.task-editor-field label {\n font-size: 11px;\n color: var(--m-text-3);\n}\n\n.task-editor-section textarea {\n width: 100%;\n resize: vertical;\n}\n\n.task-editor-side {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n border: 1px solid var(--m-line-soft);\n border-radius: 10px;\n background: var(--m-bg-1);\n align-self: start;\n}\n\n.task-editor-field {\n display: flex;\n flex-direction: column;\n gap: 5px;\n min-width: 0;\n}\n\n.task-editor-field input,\n.task-editor-field select {\n width: 100%;\n}\n\n.task-priority-picker {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 4px;\n padding: 3px;\n border: 1px solid var(--m-line);\n border-radius: 8px;\n background: var(--m-bg);\n}\n\n.task-priority-picker button {\n height: 26px;\n border-radius: 6px;\n font-size: 11.5px;\n color: var(--m-text-3);\n}\n\n.task-priority-picker button.active {\n background: var(--m-accent-soft);\n color: var(--m-text);\n}\n\n.task-editor-foot {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n}\n", "import { createElement as h, useEffect, useState, type ReactNode } from 'react'\nimport { api } from './api.js'\n\n/**\n * Sidebar entry: an envelope plus an unread count.\n *\n * The shell renders this inside an 18\u00D718 glyph slot and hides it from\n * assistive tech, so the badge must stay compact and must not add layout.\n * It uses the accent blue rather than `--dsw-alias-brand-primary`, which is\n * near-white in the dark theme and would render as an empty white blob.\n */\nexport function MailIcon(): ReactNode {\n const [unread, setUnread] = useState(0)\n\n useEffect(() => {\n let cancelled = false\n let timer: number | undefined\n const poll = async (): Promise<void> => {\n try {\n const result = await api.unread()\n if (!cancelled) setUnread(result.unread)\n } catch {\n // A logged-out or offline account simply shows no badge.\n }\n }\n void poll()\n const schedule = (): void => {\n if (cancelled) return\n timer = window.setTimeout(() => {\n void poll().finally(schedule)\n }, 60_000)\n }\n schedule()\n return () => {\n cancelled = true\n if (timer !== undefined) window.clearTimeout(timer)\n }\n }, [])\n\n return h(\n 'span',\n {\n style: {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '18px',\n height: '18px',\n boxSizing: 'border-box',\n },\n },\n h(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true' },\n h('rect', { x: 2.5, y: 5, width: 19, height: 14, rx: 2.5, stroke: 'currentColor', strokeWidth: 1.7 }),\n h('path', {\n d: 'M3.5 7l7.6 5.4a1.6 1.6 0 0 0 1.8 0L20.5 7',\n stroke: 'currentColor',\n strokeWidth: 1.7,\n strokeLinecap: 'round',\n }),\n ),\n unread > 0\n ? h(\n 'span',\n {\n style: {\n position: 'absolute',\n right: '-5px',\n bottom: '-3px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n minWidth: '13px',\n height: '13px',\n padding: '0 3px',\n borderRadius: '999px',\n background: '#5686fe',\n color: '#fff',\n fontSize: '9px',\n fontWeight: 600,\n lineHeight: '13px',\n zIndex: 1,\n letterSpacing: '-0.01em',\n fontVariantNumeric: 'tabular-nums',\n boxShadow: '0 0 0 2px var(--dsw-alias-bg-base, #151517)',\n pointerEvents: 'none',\n },\n },\n unread > 99 ? '99+' : String(unread),\n )\n : null,\n )\n}\n", "import type {\n Account,\n AiCard,\n AiSearchFilters,\n AiThread,\n Project,\n Task,\n TaskSuggestion,\n AppState,\n AttachmentMeta,\n BackupStatus,\n Draft,\n MessageDetail,\n MessageSummary,\n NewAccountInput,\n Page,\n SendResult,\n SettingsView,\n} from '../shared/types.js'\n\n/** Same-origin API root: works in the Web GUI and through the desktop shell. */\nconst BASE = new URL('mail-plugin/api/', document.baseURI).href\n\nexport class ApiError extends Error {\n readonly status: number\n\n constructor(message: string, status: number) {\n super(message)\n this.status = status\n this.name = 'ApiError'\n }\n}\n\nasync function request<T>(path: string, init: RequestInit = {}): Promise<T> {\n const response = await fetch(new URL(path, BASE), {\n credentials: 'same-origin',\n ...init,\n headers: {\n accept: 'application/json',\n ...(init.body === undefined ? {} : { 'content-type': 'application/json' }),\n ...(init.headers ?? {}),\n },\n })\n if (!response.ok) {\n let message = response.statusText\n try {\n const body: unknown = await response.json()\n if (\n body !== null &&\n typeof body === 'object' &&\n typeof (body as { error?: unknown }).error === 'string'\n ) {\n message = (body as { error: string }).error\n }\n } catch {\n // Keep the status text.\n }\n throw new ApiError(message, response.status)\n }\n return (await response.json()) as T\n}\n\nfunction query(params: Record<string, string | number | undefined | null>): string {\n const search = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null && value !== '') search.set(key, String(value))\n }\n const text = search.toString()\n return text === '' ? '' : `?${text}`\n}\n\nexport interface AiStatus {\n available: boolean\n enabled: boolean\n provider: string\n model: string\n styleUpdatedAt: string\n styleSampleCount: number\n error?: string\n}\n\nexport interface StyleProfile {\n profile: string\n updatedAt: string\n sampleCount: number\n}\n\nexport interface AiModels {\n providers: { provider: string; name: string; models: { id: string; name: string }[] }[]\n}\n\nexport interface SummaryBlock {\n title: string\n body: string\n}\n\nexport interface ListParams {\n accountId?: string | null\n source: 'local' | 'server'\n mailbox: string\n query?: string\n offset?: number\n limit?: number\n}\n\nexport const api = {\n state: (): Promise<AppState> => request<AppState>('state'),\n\n folders: (params: { accountId?: string | null; source: 'local' | 'server' }) =>\n request<{ items: { name: string; label?: string; count: number }[] }>(`folders${query(params)}`),\n\n messages: (params: ListParams) => request<Page<MessageSummary>>(`messages${query({ ...params })}`),\n\n message: (params: { id: string; accountId?: string | null; source: 'local' | 'server'; mailbox: string }) =>\n request<MessageDetail>(`messages/${encodeURIComponent(params.id)}${query({ ...params })}`),\n\n setRead: (params: {\n id: string\n accountId?: string | null\n source: 'local' | 'server'\n mailbox: string\n read: boolean\n }) =>\n request<{ ok: true; read: boolean }>(\n `messages/${encodeURIComponent(params.id)}/read${query({\n accountId: params.accountId ?? null,\n source: params.source,\n mailbox: params.mailbox,\n })}`,\n { method: 'POST', body: JSON.stringify({ read: params.read }) },\n ),\n\n attachmentUrl: (params: Record<string, string | number | undefined | null>) =>\n new URL(`attachment${query(params)}`, BASE).href,\n\n drafts: (accountId?: string | null) =>\n request<{ items: Draft[] }>(`drafts${query({ accountId: accountId ?? null })}`),\n\n saveDraft: (accountId: string | null, draft: Partial<Draft>) =>\n request<{ draft: Draft }>(`drafts${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n body: JSON.stringify(draft),\n }),\n\n deleteDraft: (id: string, accountId?: string | null) =>\n request<{ ok: true }>(`drafts/${encodeURIComponent(id)}${query({ accountId: accountId ?? null })}`, {\n method: 'DELETE',\n }),\n\n send: (accountId: string | null, payload: Record<string, unknown>) =>\n request<{ ok: true; result: SendResult }>(`send${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n unread: (accountId?: string | null) =>\n request<{ unread: number; source: string }>(`unread${query({ accountId: accountId ?? null })}`),\n\n addAccount: (input: NewAccountInput & { connect?: boolean; remember?: boolean }) =>\n request<{ account: Account; state: AppState }>('accounts', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n\n updateAccount: (id: string, patch: Record<string, unknown>) =>\n request<{ account: Account }>(`accounts/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(patch),\n }),\n\n deleteAccount: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}`, { method: 'DELETE' }),\n\n activateAccount: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}/activate`, { method: 'POST' }),\n\n login: (id: string, password: string, remember: boolean) =>\n request<{ ok: true; stored: boolean }>(`accounts/${encodeURIComponent(id)}/login`, {\n method: 'POST',\n body: JSON.stringify({ password, remember }),\n }),\n\n logout: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}/logout`, { method: 'POST' }),\n\n check: (id: string) =>\n request<{\n ok: true\n imap: { ok: true; mailboxes: { name: string; count: number }[] }\n smtp: { ok: boolean; error?: string }\n }>(`accounts/${encodeURIComponent(id)}/check`, { method: 'POST' }),\n\n aiStatus: (accountId?: string | null) =>\n request<AiStatus>(`ai/status${query({ accountId: accountId ?? null })}`),\n\n aiModels: () => request<AiModels>('ai/models'),\n\n aiSearch: (payload: {\n accountId: string | null\n source: 'local' | 'server'\n mailbox: string\n query: string\n }) =>\n request<Page<MessageSummary> & { ai: AiSearchFilters }>('ai/search', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiThread: (accountId: string | null, key: string) =>\n request<{ thread: AiThread | null }>(`ai/thread${query({ accountId: accountId ?? null, key })}`),\n\n aiAddCard: (payload: {\n accountId?: string | null\n key: string\n kind: 'summary' | 'reply' | 'translate' | 'answer'\n instruction?: string\n language?: 'zh' | 'en'\n target?: 'zh' | 'en'\n source: 'local' | 'server'\n id: string\n mailbox: string\n }) =>\n request<{ card: AiCard; thread: AiThread }>('ai/cards', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiDeleteCard: (accountId: string | null, key: string, cardId: string) =>\n request<{ thread: AiThread | null }>(`ai/cards${query({ accountId: accountId ?? null, key, cardId })}`, {\n method: 'DELETE',\n }),\n\n aiClearThread: (accountId: string | null, key: string) =>\n request<{ ok: boolean }>(`ai/thread${query({ accountId: accountId ?? null, key })}`, {\n method: 'DELETE',\n }),\n\n aiCompose: (payload: {\n accountId?: string | null\n mode: 'draft' | 'polish' | 'shorten'\n instruction?: string\n html: string\n language?: 'zh' | 'en'\n }) =>\n request<{ text: string; html: string }>('ai/compose', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiSummary: (payload: {\n accountId?: string | null\n source: 'local' | 'server'\n id: string\n mailbox: string\n }) =>\n request<{ summary: string; blocks: SummaryBlock[] }>('ai/summary', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiReply: (payload: {\n accountId?: string | null\n source: 'local' | 'server'\n id: string\n mailbox: string\n instruction?: string\n language?: 'zh' | 'en'\n }) =>\n request<{ text: string; html: string }>('ai/reply', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiTranslate: (payload: { accountId?: string | null; html: string; target: 'zh' | 'en' }) =>\n request<{ text: string; html: string }>('ai/translate', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiStyle: (accountId?: string | null) =>\n request<{ style: StyleProfile | null }>(`ai/style${query({ accountId: accountId ?? null })}`),\n\n aiSaveStyle: (accountId: string | null, profile: string) =>\n request<{ style: StyleProfile }>(`ai/style${query({ accountId: accountId ?? null })}`, {\n method: 'PUT',\n body: JSON.stringify({ accountId, profile }),\n }),\n\n aiLearnStyle: (accountId?: string | null) =>\n request<{ style: StyleProfile }>(`ai/style/learn${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n body: JSON.stringify({ accountId: accountId ?? null }),\n }),\n\n tasks: (accountId: string | null, params: { status?: string; projectId?: string; query?: string } = {}) =>\n request<{ items: Task[]; calendar: { calendarHref: string; lastSync: string; error: string } | null }>(\n `tasks${query({ accountId: accountId ?? null, ...params })}`,\n ),\n\n createTask: (payload: Record<string, unknown>) =>\n request<{ task: Task }>('tasks', { method: 'POST', body: JSON.stringify(payload) }),\n\n updateTask: (id: string, patch: Record<string, unknown>) =>\n request<{ task: Task }>(`tasks/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(patch),\n }),\n\n deleteTask: (id: string) => request<{ ok: true }>(`tasks/${encodeURIComponent(id)}`, { method: 'DELETE' }),\n\n extractTasks: (payload: {\n accountId?: string | null\n source: 'local' | 'server'\n id: string\n mailbox: string\n }) =>\n request<{ suggestions: TaskSuggestion[] }>('tasks/extract', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n taskCaldav: (accountId: string | null) =>\n request<{\n caldav: { url: string; username: string; calendarHref?: string } | null\n calendar: { calendarHref: string; lastSync: string; error: string } | null\n hasPassword: boolean\n }>(`tasks/caldav${query({ accountId: accountId ?? null })}`),\n\n saveTaskCaldav: (payload: {\n accountId?: string | null\n url: string\n username: string\n password?: string\n calendarHref?: string\n }) =>\n request<{ caldav: unknown; hasPassword: boolean }>('tasks/caldav', {\n method: 'PUT',\n body: JSON.stringify(payload),\n }),\n\n syncTasks: (accountId: string | null) =>\n request<{\n result: { pulled: number; pushed: number; deleted: number; removed: number }\n calendar: unknown\n }>('tasks/sync', { method: 'POST', body: JSON.stringify({ accountId }) }),\n\n projects: () => request<{ items: Project[] }>('projects'),\n\n pickDirectory: () => request<{ path: string | null }>('projects/pick-directory', { method: 'POST' }),\n\n projectFor: (accountId: string | null, key: string) =>\n request<{ project: Project | null }>(`projects/for${query({ accountId: accountId ?? null, key })}`),\n\n createProject: (payload: {\n accountId?: string | null\n name: string\n root: string\n conversation: string\n message?: { key: string; subject: string; date: string }\n }) =>\n request<{ project: Project; warnings: string[] }>('projects', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n addProjectMessage: (\n id: string,\n payload: { accountId?: string | null; key: string; subject: string; date: string },\n ) =>\n request<{ project: Project }>(`projects/${encodeURIComponent(id)}/messages`, {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n removeProjectMessage: (id: string, accountId: string | null, key: string) =>\n request<{ project: Project }>(\n `projects/${encodeURIComponent(id)}/messages${query({ accountId: accountId ?? null, key })}`,\n { method: 'DELETE' },\n ),\n\n transferProject: (id: string, payload: { accountId?: string | null; key?: string; conversation: string }) =>\n request<{ project: Project }>(`projects/${encodeURIComponent(id)}/transfer`, {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n lookupMessage: (accountId: string | null, key: string) =>\n request<{ id: string; mailbox: string; subject: string }>(\n `messages/lookup${query({ accountId: accountId ?? null, key })}`,\n ),\n\n settings: () => request<SettingsView>('settings'),\n\n saveSettings: (patch: Record<string, unknown>) =>\n request<{ settings: SettingsView }>('settings', { method: 'PATCH', body: JSON.stringify(patch) }),\n\n backupStatus: (accountId?: string | null) =>\n request<BackupStatus>(`backup/status${query({ accountId: accountId ?? null })}`),\n\n startBackup: (accountId?: string | null) =>\n request<{ ok: true; status: BackupStatus }>(`backup/start${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n }),\n\n stopBackup: (accountId?: string | null) =>\n request<{ ok: boolean; status: BackupStatus }>(`backup/stop${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n }),\n}\n\nexport type { AttachmentMeta }\n", "import { createElement as h, useCallback, useEffect, useState, type ReactNode } from 'react'\nimport type {\n AiSearchFilters,\n AppState,\n BackupStatus,\n Draft,\n MessageDetail,\n MessageSummary,\n Page,\n Project,\n TaskSuggestion,\n} from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { AiRail, type AiRequest } from './ai-rail.js'\nimport type { AiReplyInit } from './reply.js'\nimport { AddAccountForm, AddAccountModal, LoginForm } from './account-form.js'\nimport { Avatar, ErrorBar, Modal, shortDate } from './components.js'\nimport { Composer, type ComposeInit } from './composer.js'\nimport { Icon } from './icons.js'\nimport { Reader } from './reader.js'\nimport { consumeOpenMail, type OpenMailRequest } from './nav.js'\n\ninterface Folder {\n name: string\n label?: string\n count: number\n}\n\nconst EMPTY_PAGE: Page<MessageSummary> = { items: [], total: 0, offset: 0, limit: 40 }\nconst DRAFTS = '__drafts'\n\n/** Paint the last known folders/page while the server answers. */\nconst folderCache = new Map<string, Folder[]>()\nconst pageCache = new Map<string, Page<MessageSummary>>()\n\nconst FOLDER_LABELS: Record<string, string> = {\n INBOX: '\u6536\u4EF6\u7BB1',\n 'Sent Items': '\u5DF2\u53D1\u9001',\n Sent: '\u5DF2\u53D1\u9001',\n Drafts: '\u8349\u7A3F',\n 'Junk E-mail': '\u5783\u573E\u90AE\u4EF6',\n Junk: '\u5783\u573E\u90AE\u4EF6',\n Trash: '\u5DF2\u5220\u9664',\n Deleted: '\u5DF2\u5220\u9664',\n Archive: '\u5B58\u6863',\n}\n\nfunction folderName(name: string): string {\n return FOLDER_LABELS[name] ?? name\n}\n\nfunction isSentFolder(mailbox: string): boolean {\n return /(^|[/.])(sent|sent items|sent mail|\u5DF2\u53D1\u9001|\u53D1\u4EF6\u7BB1)/i.test(mailbox)\n}\n\nfunction normalizeSubject(subject: string): string {\n return subject\n .replace(/^(\\s*(re|fw|fwd|\u56DE\u590D|\u8F6C\u53D1)\\s*[:\uFF1A]\\s*)+/gi, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase()\n}\n\ninterface MessageGroup {\n key: string\n items: MessageSummary[]\n}\n\n/** Group a page of mail by conversation title, newest first. */\nfunction groupMessages(items: MessageSummary[]): MessageGroup[] {\n const map = new Map<string, MessageSummary[]>()\n const order: string[] = []\n for (const item of items) {\n const key =\n normalizeSubject(item.subject) === ''\n ? `__${item.accountId}:${item.id}`\n : normalizeSubject(item.subject)\n const existing = map.get(key)\n if (existing === undefined) {\n map.set(key, [item])\n order.push(key)\n } else {\n existing.push(item)\n }\n }\n return order.map((key) => ({ key, items: map.get(key) ?? [] }))\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction matchesNarrow(): boolean {\n return typeof window.matchMedia === 'function' ? window.matchMedia('(max-width: 900px)').matches : false\n}\n\nfunction quoteForReply(detail: MessageDetail): string {\n const body = detail.html ?? `<pre>${detail.text.replaceAll('&', '&amp;').replaceAll('<', '&lt;')}</pre>`\n return `<p><br></p><p>------------------ \u539F\u59CB\u90AE\u4EF6 ------------------</p><blockquote style=\"margin:0 0 0 12px;padding-left:12px;border-left:2px solid #d7dbe3;color:#565c67\">${body}</blockquote>`\n}\n\nexport function MailPanel(): ReactNode {\n const [state, setState] = useState<AppState | null>(null)\n const [error, setError] = useState('')\n const [accountScope, setAccountScope] = useState<string | null>(null)\n const [source, setSource] = useState<'local' | 'server'>('server')\n const [mailbox, setMailbox] = useState('all')\n const [folders, setFolders] = useState<Folder[]>([])\n const [query, setQuery] = useState('')\n const [search, setSearch] = useState('')\n const [page, setPage] = useState<Page<MessageSummary>>(EMPTY_PAGE)\n const [drafts, setDrafts] = useState<Draft[]>([])\n const [limit, setLimit] = useState(40)\n const [loading, setLoading] = useState(false)\n const [selected, setSelected] = useState<MessageDetail | null>(null)\n const [compose, setCompose] = useState<ComposeInit | null>(null)\n const [showAdd, setShowAdd] = useState(false)\n const [showBackup, setShowBackup] = useState(false)\n const [backup, setBackup] = useState<BackupStatus | null>(null)\n const [toast, setToast] = useState('')\n const [narrow, setNarrow] = useState(() => matchesNarrow())\n const [railOpen, setRailOpen] = useState(false)\n const [selectMode, setSelectMode] = useState(false)\n const [sideOpen, setSideOpen] = useState(() => {\n try {\n return window.localStorage.getItem('mailharbor.side') !== '0'\n } catch {\n return true\n }\n })\n const [expandedGroups, setExpandedGroups] = useState<string[]>([])\n const [selectedKeys, setSelectedKeys] = useState<string[]>([])\n const [projectOptions, setProjectOptions] = useState<Project[]>([])\n const [targetProject, setTargetProject] = useState('')\n const [extraction, setExtraction] = useState<{ items: TaskSuggestion[]; checked: boolean[] } | null>(null)\n const [extractBusy, setExtractBusy] = useState(false)\n const [aiInfo, setAiInfo] = useState<AiSearchFilters | null>(null)\n const [projectPicker, setProjectPicker] = useState<{\n accountId: string\n key: string\n subject: string\n date: string\n } | null>(null)\n const [pickerProjects, setPickerProjects] = useState<Project[]>([])\n const [pickerTarget, setPickerTarget] = useState('')\n const [pickerNewName, setPickerNewName] = useState('')\n const [pickerBusy, setPickerBusy] = useState(false)\n const [aiSearching, setAiSearching] = useState(false)\n const [aiRequest, setAiRequest] = useState<AiRequest | null>(null)\n const [tick, setTick] = useState(0)\n\n const accounts = state?.accounts ?? []\n const isAll = accountScope === 'all'\n const account = accounts.find((item) => item.id === accountScope) ?? null\n const composeAccount =\n accounts.find((item) => item.id === compose?.accountId) ?? account ?? accounts[0] ?? null\n const showingDrafts = mailbox === DRAFTS && source === 'local'\n\n const keyOf = (item: MessageSummary): string =>\n item.messageId !== undefined && item.messageId !== '' ? `mid:${item.messageId}` : `local:${item.id}`\n\n // The tasks panel can ask the mail panel to open a source message.\n const openFromRequest = useCallback((detail: OpenMailRequest): void => {\n setAccountScope(detail.accountId)\n setSource('local')\n setMailbox(detail.mailbox === '' ? 'all' : detail.mailbox)\n api\n .activateAccount(detail.accountId)\n .then(() => {\n setRailOpen(false)\n return api.message({\n id: detail.id,\n accountId: detail.accountId,\n source: 'local',\n mailbox: detail.mailbox === '' ? 'all' : detail.mailbox,\n })\n })\n .then((message) => setSelected(message))\n .catch((caught: unknown) => setError(errorText(caught)))\n }, [])\n\n useEffect(() => {\n const queued = consumeOpenMail()\n if (queued !== null) openFromRequest(queued)\n const onOpen = (event: Event): void => {\n const detail = (event as CustomEvent<OpenMailRequest>).detail\n if (detail !== undefined) openFromRequest(detail)\n }\n window.addEventListener('mailharbor:open-mail', onOpen)\n return () => {\n window.removeEventListener('mailharbor:open-mail', onOpen)\n }\n }, [openFromRequest])\n\n const enterSelect = async (): Promise<void> => {\n setSelectMode(true)\n try {\n const list = await api.projects()\n setProjectOptions(list.items)\n setTargetProject(list.items[0]?.id ?? '')\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const runAiSearch = async (): Promise<void> => {\n const text = query.trim()\n if (text === '' || accountScope === null) return\n setAiSearching(true)\n setError('')\n try {\n const result = await Promise.race([\n api.aiSearch({ accountId: accountScope, source, mailbox, query: text }),\n new Promise<never>((_resolve, reject) => {\n window.setTimeout(() => reject(new Error('AI \u641C\u7D22\u8D85\u65F6\uFF0C\u5DF2\u6539\u7528\u666E\u901A\u641C\u7D22')), 45_000)\n }),\n ])\n setPage({ items: result.items, total: result.total, offset: 0, limit: result.limit })\n setDrafts([])\n setAiInfo(result.ai)\n setSearch('')\n } catch (caught) {\n // Fall back to the plain text search rather than leaving an empty panel.\n setError(errorText(caught))\n setAiInfo(null)\n setSearch(text)\n } finally {\n setAiSearching(false)\n }\n }\n\n const openProjectPicker = (): void => {\n if (selected === null) return\n const key = keyOf(selected)\n if (!key.startsWith('mid:') && !key.startsWith('local:')) {\n setError('\u8FD9\u5C01\u90AE\u4EF6\u7F3A\u5C11 Message-ID\uFF0C\u65E0\u6CD5\u5173\u8054\u5230\u9879\u76EE')\n return\n }\n setProjectPicker({\n accountId: selected.accountId,\n key,\n subject: selected.subject,\n date: selected.date,\n })\n setPickerNewName(selected.subject.replace(/^(re|fwd):\\s*/i, '').slice(0, 80))\n setPickerTarget('')\n void api\n .projects()\n .then((list) => {\n setPickerProjects(list.items)\n setPickerTarget(list.items[0]?.id ?? '')\n })\n .catch((caught: unknown) => setError(errorText(caught)))\n }\n\n const saveProjectPick = async (): Promise<void> => {\n if (projectPicker === null) return\n setPickerBusy(true)\n setError('')\n try {\n if (pickerTarget !== '') {\n await api.addProjectMessage(pickerTarget, {\n accountId: projectPicker.accountId,\n key: projectPicker.key,\n subject: projectPicker.subject,\n date: projectPicker.date,\n })\n notice('\u5DF2\u52A0\u5165\u9879\u76EE')\n } else {\n const name = pickerNewName.trim()\n if (name === '') throw new Error('\u5148\u9009\u62E9\u4E00\u4E2A\u9879\u76EE\uFF0C\u6216\u586B\u5199\u65B0\u9879\u76EE\u540D\u79F0')\n const settings = await api.settings()\n const created = await api.createProject({\n accountId: projectPicker.accountId,\n name,\n root: settings.projects.root,\n conversation: `\uFF08\u4ECE\u90AE\u4EF6\u52A0\u5165\uFF09\\n\\n${projectPicker.subject}`,\n message: {\n key: projectPicker.key,\n subject: projectPicker.subject,\n date: projectPicker.date,\n },\n })\n notice(`\u9879\u76EE\u5DF2\u521B\u5EFA\uFF1A${created.project.path}`)\n }\n setProjectPicker(null)\n setTick((value) => value + 1)\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setPickerBusy(false)\n }\n }\n\n const toggleSide = (): void => {\n setSideOpen((open) => {\n try {\n window.localStorage.setItem('mailharbor.side', open ? '0' : '1')\n } catch {\n // Private mode simply does not persist the preference.\n }\n return !open\n })\n }\n\n const toggleGroup = (key: string): void => {\n setExpandedGroups((current) =>\n current.includes(key) ? current.filter((entry) => entry !== key) : [...current, key],\n )\n }\n\n const toggleSelect = (item: MessageSummary): void => {\n const key = `${item.accountId}:${item.id}`\n setSelectedKeys((current) =>\n current.includes(key) ? current.filter((entry) => entry !== key) : [...current, key],\n )\n }\n\n const addSelectedToProject = async (): Promise<void> => {\n if (targetProject === '') {\n setError('\u5148\u521B\u5EFA\u4E00\u4E2A\u9879\u76EE')\n return\n }\n const chosen = items\n .filter((item) => selectedKeys.includes(`${item.accountId}:${item.id}`))\n .filter((item) => item.messageId !== undefined && item.messageId !== '')\n if (chosen.length === 0) {\n setError('\u6240\u9009\u90AE\u4EF6\u7F3A\u5C11 Message-ID\uFF0C\u65E0\u6CD5\u5173\u8054\u5230\u9879\u76EE')\n return\n }\n try {\n for (const item of chosen) {\n await api.addProjectMessage(targetProject, {\n accountId: item.accountId,\n key: keyOf(item),\n subject: item.subject,\n date: item.date,\n })\n }\n notice(`\u5DF2\u52A0\u5165\u9879\u76EE\uFF1A${String(chosen.length)} \u5C01`)\n setSelectMode(false)\n setSelectedKeys([])\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const extractTasks = async (): Promise<void> => {\n if (selected === null) return\n setExtractBusy(true)\n try {\n const result = await api.extractTasks({\n accountId: selected.accountId,\n source,\n id: selected.id,\n mailbox,\n })\n if (result.suggestions.length === 0) {\n notice('\u8FD9\u5C01\u90AE\u4EF6\u6CA1\u6709\u63D0\u53D6\u5230\u660E\u786E\u4EFB\u52A1')\n return\n }\n setExtraction({ items: result.suggestions, checked: result.suggestions.map(() => true) })\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setExtractBusy(false)\n }\n }\n\n const saveExtraction = async (): Promise<void> => {\n if (extraction === null || selected === null) return\n setExtractBusy(true)\n try {\n const key = keyOf(selected)\n for (const [index, suggestion] of extraction.items.entries()) {\n if (!extraction.checked[index]) continue\n await api.createTask({\n accountId: selected.accountId,\n title: suggestion.title,\n notes: suggestion.notes,\n due: suggestion.due,\n priority: suggestion.priority,\n owner: suggestion.owner,\n messageKey: key,\n messageSubject: selected.subject,\n })\n }\n setExtraction(null)\n notice('\u4EFB\u52A1\u5DF2\u4FDD\u5B58\uFF0C\u53EF\u5728\u300C\u4EFB\u52A1\u300D\u9762\u677F\u67E5\u770B')\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setExtractBusy(false)\n }\n }\n\n const refresh = useCallback((): void => {\n setTick((value) => value + 1)\n }, [])\n\n const notice = useCallback((message: string): void => {\n setToast(message)\n window.setTimeout(() => {\n setToast('')\n }, 3200)\n }, [])\n\n // App state: load once and after mutations.\n useEffect(() => {\n let cancelled = false\n api\n .state()\n .then((next) => {\n if (cancelled) return\n setState(next)\n if (next.settings.render.listLimit > 0) setLimit(next.settings.render.listLimit)\n setAccountScope((current) => current ?? next.activeAccountId)\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n return () => {\n cancelled = true\n }\n }, [tick])\n\n // Folders follow the account scope and the source.\n useEffect(() => {\n if (accountScope === null) return\n let cancelled = false\n const cacheKey = `${accountScope}:${source}`\n const cached = folderCache.get(cacheKey)\n if (cached !== undefined) setFolders(cached)\n api\n .folders({ accountId: accountScope, source })\n .then((result) => {\n if (cancelled) return\n const items: Folder[] =\n source === 'local'\n ? [\n {\n name: 'all',\n label: '\u5168\u90E8\u90AE\u4EF6',\n count: result.items\n .filter((item) => item.name !== DRAFTS)\n .reduce((sum, item) => sum + item.count, 0),\n },\n ...result.items.map((item) => ({\n ...item,\n label: item.name === DRAFTS ? '\u8349\u7A3F' : (item.label ?? item.name),\n })),\n ]\n : result.items.map((item) => ({ ...item, label: item.label ?? item.name }))\n setFolders(items)\n folderCache.set(cacheKey, items)\n })\n .catch(() => {\n if (!cancelled && cached === undefined) setFolders([])\n })\n return () => {\n cancelled = true\n }\n }, [accountScope, source, tick])\n\n // A source or account switch resets the folder; unified inbox is local-only.\n useEffect(() => {\n setMailbox(source === 'local' ? 'all' : 'INBOX')\n setSelected(null)\n setAiInfo(null)\n setSearch('')\n setLimit(state?.settings.render.listLimit ?? 40)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [source])\n\n useEffect(() => {\n if (accountScope === 'all' && source === 'server') setSource('local')\n setSelected(null)\n setAiInfo(null)\n setSearch('')\n }, [accountScope, source])\n\n // Message page (or drafts list).\n useEffect(() => {\n if (accountScope === null) return\n let cancelled = false\n setLoading(true)\n if (showingDrafts) {\n const targets = isAll ? accounts : account === null ? [] : [account]\n Promise.all(\n targets.map(async (target) => {\n try {\n const result = await api.drafts(target.id)\n return result.items.map((draft) => ({ ...draft, accountId: target.id }))\n } catch {\n return []\n }\n }),\n )\n .then((groups) => {\n if (cancelled) return\n setDrafts(groups.flat().sort((left, right) => right.updatedAt.localeCompare(left.updatedAt)))\n setPage(EMPTY_PAGE)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }\n const pageKey = `${accountScope}:${source}:${mailbox}:${search}:${String(limit)}`\n const cachedPage = pageCache.get(pageKey)\n if (cachedPage !== undefined) {\n setPage(cachedPage)\n setLoading(false)\n }\n api\n .messages({ accountId: accountScope, source, mailbox, query: search, limit })\n .then((result) => {\n if (!cancelled) {\n setPage(result)\n setDrafts([])\n // The SELECT that listed this folder also tells us its size, so the\n // sidebar count appears without a second round trip.\n if (source === 'server' && mailbox !== 'all') {\n const update = (list: Folder[]): Folder[] =>\n list.map((folder) => (folder.name === mailbox ? { ...folder, count: result.total } : folder))\n setFolders(update)\n const key = `${accountScope}:server`\n const cachedFolders = folderCache.get(key)\n if (cachedFolders !== undefined) folderCache.set(key, update(cachedFolders))\n }\n pageCache.set(pageKey, result)\n if (pageCache.size > 12) {\n const oldest = pageCache.keys().next().value\n if (oldest !== undefined) pageCache.delete(oldest)\n }\n }\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [accountScope, source, mailbox, search, limit, tick])\n\n // Narrow layout follows the viewport.\n useEffect(() => {\n if (typeof window.matchMedia !== 'function') return\n const media = window.matchMedia('(max-width: 900px)')\n const onChange = (): void => setNarrow(media.matches)\n media.addEventListener('change', onChange)\n return () => {\n media.removeEventListener('change', onChange)\n }\n }, [])\n\n // Backup progress polling while the dialog is open.\n useEffect(() => {\n if (!showBackup || accountScope === null || isAll) return\n let cancelled = false\n const poll = async (): Promise<void> => {\n try {\n const status = await api.backupStatus(accountScope)\n if (!cancelled) setBackup(status)\n } catch {\n // Keep the last status.\n }\n }\n void poll()\n const timer = window.setInterval(() => {\n void poll()\n }, 1000)\n return () => {\n cancelled = true\n window.clearInterval(timer)\n }\n }, [showBackup, accountScope, isAll])\n\n const openMessage = async (item: MessageSummary): Promise<void> => {\n const owner = item.accountId\n const ownerSource = source\n setError('')\n try {\n const detail = await api.message({ id: item.id, accountId: owner, source: ownerSource, mailbox })\n setSelected(detail)\n if (detail.unread && state?.settings.read.markOnOpen === true) {\n try {\n await api.setRead({ id: detail.id, accountId: owner, source: ownerSource, mailbox, read: true })\n setSelected({ ...detail, unread: false })\n setPage((current) => ({\n ...current,\n items: current.items.map((row) => (row.id === item.id ? { ...row, unread: false } : row)),\n }))\n } catch {\n // Reading must not fail because the server refused a flag write.\n }\n }\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const startCompose = (mode: ComposeInit['mode']): void => {\n const owner = account ?? accounts.find((item) => item.id === state?.activeAccountId) ?? accounts[0]\n if (owner === undefined) return\n const detail = selected\n if (mode === 'new' || detail === null) {\n setCompose({ mode: 'new', accountId: owner.id, to: '', cc: '', bcc: '', subject: '', html: '' })\n return\n }\n const subjectPrefix = mode === 'forward' ? 'Fwd: ' : 'Re: '\n const subject = /^(re|fwd):/i.test(detail.subject) ? detail.subject : `${subjectPrefix}${detail.subject}`\n if (mode === 'forward') {\n setCompose({\n mode,\n accountId: detail.accountId,\n to: '',\n cc: '',\n bcc: '',\n subject,\n html: quoteForReply(detail),\n references: detail.references.join(' '),\n })\n return\n }\n const to = detail.from.address\n const cc =\n mode === 'replyAll'\n ? [...detail.to, ...detail.cc]\n .map((item) => item.address)\n .filter((address) => address !== owner.email && address !== to)\n .join(', ')\n : ''\n setCompose({\n mode,\n accountId: detail.accountId,\n to,\n cc,\n bcc: '',\n subject,\n html: quoteForReply(detail),\n ...(detail.messageId === ''\n ? {}\n : { inReplyTo: detail.messageId, references: [...detail.references, detail.messageId].join(' ') }),\n })\n }\n\n const requestAi = (kind: AiRequest['kind']): void => {\n setRailOpen(true)\n setAiRequest({ kind, nonce: Date.now() })\n }\n\n const insertReply = (init: AiReplyInit): void => {\n if (selected === null) return\n setCompose({\n mode: 'reply',\n accountId: selected.accountId,\n to: init.to,\n cc: init.cc,\n bcc: '',\n subject: init.subject,\n html: init.html,\n ...(init.inReplyTo === undefined ? {} : { inReplyTo: init.inReplyTo }),\n ...(init.references === undefined ? {} : { references: init.references }),\n })\n }\n\n const saveReplyDraft = async (init: AiReplyInit): Promise<void> => {\n if (selected === null) return\n try {\n await api.saveDraft(selected.accountId, {\n to: init.to,\n cc: init.cc,\n bcc: '',\n subject: init.subject,\n html: init.html,\n attachments: [],\n ...(init.inReplyTo === undefined ? {} : { inReplyTo: init.inReplyTo }),\n ...(init.references === undefined ? {} : { references: init.references }),\n })\n notice('\u5DF2\u5B58\u4E3A\u8349\u7A3F')\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const openDraft = (draft: Draft): void => {\n setCompose({\n mode: 'new',\n accountId: draft.accountId,\n to: draft.to,\n cc: draft.cc,\n bcc: draft.bcc,\n subject: draft.subject,\n html: draft.html,\n attachments: draft.attachments,\n draftId: draft.id,\n })\n }\n\n const removeDraft = async (id: string, accountId: string): Promise<void> => {\n try {\n await api.deleteDraft(id, accountId)\n setDrafts((current) => current.filter((draft) => draft.id !== id))\n notice('\u8349\u7A3F\u5DF2\u5220\u9664')\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const switchAccount = async (id: string): Promise<void> => {\n try {\n if (id !== 'all') await api.activateAccount(id)\n setAccountScope(id)\n setSelected(null)\n if (id === 'all') setSource('local')\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const startBackup = async (): Promise<void> => {\n const owner =\n accountScope === null || isAll ? accounts[0] : accounts.find((item) => item.id === accountScope)\n if (owner === undefined) return\n try {\n const result = await api.startBackup(owner.id)\n setBackup(result.status)\n setShowBackup(true)\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const stopBackup = async (): Promise<void> => {\n if (accountScope === null || isAll) return\n try {\n const result = await api.stopBackup(accountScope)\n setBackup(result.status)\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n if (state === null) {\n return h(\n 'div',\n { className: 'mailharbor' },\n h('div', { className: 'mailharbor-settings' }, '\u6B63\u5728\u8BFB\u53D6\u90AE\u7BB1\u2026'),\n )\n }\n\n if (accounts.length === 0) {\n return h(\n 'div',\n { className: 'mailharbor' },\n h(\n 'div',\n { className: 'mailharbor-settings' },\n h('h2', null, '\u6B22\u8FCE\u4F7F\u7528 MailHarbor'),\n h(\n 'p',\n { className: 'muted small' },\n '\u628A\u4EFB\u610F IMAP/SMTP \u90AE\u7BB1\u63A5\u8FDB DeepSeek Harness\uFF1A\u672C\u5730\u5907\u4EFD\u3001\u5B9E\u65F6\u8BFB\u4FE1\u3001\u5199\u90AE\u4EF6\u4E0E Agent \u5DE5\u5177\u3002',\n ),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(AddAccountForm, {\n onDone: (next) => {\n setState(next)\n setAccountScope(next.activeAccountId)\n setSource('local')\n },\n }),\n ),\n )\n }\n\n const currentAccount = account ?? accounts[0] ?? null\n const loggedIn = isAll ? accounts.some((item) => item.id === state.activeAccountId) : state.loggedIn\n const needsLogin = source === 'server' && !isAll && state.loggedIn === false\n const items = page.items\n\n const isSent = isSentFolder(mailbox)\n const groups = groupMessages(items)\n\n const renderMessage = (\n item: MessageSummary,\n meta: { compact?: boolean; groupCount?: number; groupKey?: string; expanded?: boolean } = {},\n ): ReactNode => {\n const sent = isSent && item.to.length > 0\n const first = sent ? item.to[0] : item.from\n const who = first === undefined || first === null ? '' : first.name !== '' ? first.name : first.address\n const extra = sent && item.to.length > 1 ? ` +${String(item.to.length - 1)}` : ''\n const isSelected = selected?.id === item.id && selected?.accountId === item.accountId\n return h(\n 'div',\n {\n key: `${item.accountId}:${item.id}`,\n className: `mailharbor-row${item.unread ? ' unread' : ''}${isSelected ? ' selected' : ''}${selectMode ? ' selectable' : ''}${meta.compact === true ? ' compact' : ''}`,\n role: 'button',\n tabIndex: 0,\n onClick: () => {\n if (selectMode) toggleSelect(item)\n else void openMessage(item)\n },\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n if (selectMode) toggleSelect(item)\n else void openMessage(item)\n }\n },\n },\n h(\n 'span',\n { className: 'line-1' },\n selectMode\n ? h('input', {\n type: 'checkbox',\n checked: selectedKeys.includes(`${item.accountId}:${item.id}`),\n 'aria-label': '\u9009\u62E9\u90AE\u4EF6',\n onClick: (event: { stopPropagation: () => void }) => event.stopPropagation(),\n onChange: () => toggleSelect(item),\n })\n : item.unread\n ? h('span', { className: 'dot' })\n : null,\n sent ? h('span', { className: 'to-label' }, '\u6536\u4EF6\u4EBA ') : null,\n h('span', { className: 'from' }, `${who}${extra}`),\n item.hasAttachments ? h(Icon, { name: 'paperclip', size: 13 }) : null,\n source === 'local' && item.backedUp === false\n ? h('span', { className: 'badge warn' }, '\u672A\u5907\u4EFD')\n : null,\n meta.groupCount !== undefined && meta.groupCount > 1\n ? h(\n 'button',\n {\n className: 'thread-count',\n title: meta.expanded === true ? '\u6536\u8D77\u4F1A\u8BDD' : `\u5C55\u5F00\u4F1A\u8BDD\uFF08${String(meta.groupCount)} \u5C01\uFF09`,\n onClick: (event: { stopPropagation: () => void }) => {\n event.stopPropagation()\n toggleGroup(meta.groupKey ?? '')\n },\n },\n meta.expanded === true ? '\u2212' : String(meta.groupCount),\n )\n : null,\n h('span', { className: 'date' }, shortDate(item.date)),\n ),\n meta.compact === true\n ? null\n : h('span', { className: 'line-2' }, h('span', { className: 'subject' }, item.subject)),\n item.snippet === '' ? null : h('span', { className: 'snippet' }, item.snippet),\n )\n }\n\n return h(\n 'div',\n { className: narrow ? 'mailharbor mailharbor-narrow' : 'mailharbor' },\n h(\n 'div',\n { className: 'mailharbor-topbar' },\n h(\n 'button',\n {\n className: 'mailharbor-account',\n onClick: toggleSide,\n title: sideOpen ? '\u6536\u8D77\u8D26\u53F7\u4E0E\u6587\u4EF6\u5939' : '\u5C55\u5F00\u8D26\u53F7\u4E0E\u6587\u4EF6\u5939',\n },\n h(Avatar, { email: currentAccount?.email ?? '?', size: 26 }),\n h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', minWidth: 0 } },\n h('span', { className: 'name' }, currentAccount?.label ?? ''),\n h('span', { className: 'small muted' }, currentAccount?.email ?? ''),\n ),\n state.loggedIn === false ? h('span', { className: 'badge warn' }, '\u672A\u767B\u5F55') : null,\n h(Icon, { name: sideOpen ? 'chevronLeft' : 'chevronRight', size: 14 }),\n ),\n h(\n 'div',\n { className: 'mailharbor-segment', role: 'tablist' },\n h(\n 'button',\n { className: source === 'local' ? 'active' : '', onClick: () => setSource('local'), role: 'tab' },\n '\u672C\u5730\u5907\u4EFD',\n ),\n h(\n 'button',\n {\n className: source === 'server' ? 'active' : '',\n onClick: () => {\n if (isAll) {\n notice('\u7EDF\u4E00\u6536\u4EF6\u7BB1\u53EA\u652F\u6301\u672C\u5730\u5907\u4EFD\uFF0C\u5207\u6362\u5230\u5355\u4E2A\u8D26\u53F7\u53EF\u4F7F\u7528\u670D\u52A1\u5668\u5B9E\u65F6')\n return\n }\n setSource('server')\n },\n role: 'tab',\n title: isAll ? '\u7EDF\u4E00\u6536\u4EF6\u7BB1\u53EA\u652F\u6301\u672C\u5730\u5907\u4EFD' : '\u8BFB\u53D6\u670D\u52A1\u5668\u4E0A\u7684\u6700\u65B0\u90AE\u4EF6',\n },\n '\u670D\u52A1\u5668\u5B9E\u65F6',\n ),\n ),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n { className: 'ghost icon', title: '\u5237\u65B0\u5217\u8868', 'aria-label': '\u5237\u65B0\u5217\u8868', onClick: refresh },\n h(Icon, { name: 'refresh' }),\n ),\n h(\n 'button',\n {\n className: 'ghost',\n onClick: () => void startBackup(),\n title: isAll ? '\u5907\u4EFD\u5F53\u524D\u6D3B\u52A8\u8D26\u53F7' : '\u5907\u4EFD\u8FD9\u4E2A\u8D26\u53F7',\n },\n h(Icon, { name: 'archive' }),\n '\u5907\u4EFD',\n ),\n h(\n 'button',\n {\n className: railOpen ? 'ghost active' : 'ghost',\n onClick: () => setRailOpen(!railOpen),\n title: 'AI \u5DE5\u4F5C\u53F0',\n },\n h(Icon, { name: 'sparkles' }),\n 'AI',\n ),\n h(\n 'button',\n { className: 'primary', onClick: () => startCompose('new') },\n h(Icon, { name: 'compose' }),\n '\u5199\u90AE\u4EF6',\n ),\n ),\n toast === ''\n ? null\n : h('div', { className: 'small', style: { padding: '6px 14px', color: 'var(--m-ok)' } }, toast),\n error === '' ? null : h(ErrorBar, { message: error, onDismiss: () => setError('') }),\n needsLogin\n ? h(\n 'div',\n { className: 'mailharbor-settings' },\n h(LoginForm, { account: currentAccount!, onDone: refresh }),\n )\n : h(\n 'div',\n { className: 'mailharbor-body', 'data-mode': narrow && selected !== null ? 'reader' : 'list' },\n sideOpen\n ? h(\n 'aside',\n { className: 'mailharbor-side' },\n h('div', { className: 'mailharbor-side-section' }, '\u8D26\u53F7'),\n accounts.map((item) =>\n h(\n 'button',\n {\n key: item.id,\n className: `mailharbor-side-item${!isAll && item.id === accountScope ? ' active' : ''}`,\n onClick: () => {\n void switchAccount(item.id)\n setSource('server')\n setMailbox('INBOX')\n },\n },\n h(Avatar, { email: item.email, size: 18 }),\n h(\n 'span',\n { className: 'name' },\n h('span', null, item.label),\n h('span', { className: 'sub' }, item.email),\n ),\n item.enabled === false ? h('span', { className: 'badge warn' }, '\u505C\u7528') : null,\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-side-section' },\n source === 'server' ? '\u670D\u52A1\u5668\u6587\u4EF6\u5939' : '\u672C\u5730\u6587\u4EF6\u5939',\n ),\n folders.map((folder) =>\n h(\n 'button',\n {\n key: folder.name,\n className: `mailharbor-side-item${mailbox === folder.name ? ' active' : ''}`,\n onClick: () => {\n setMailbox(folder.name)\n setSelected(null)\n },\n },\n h(Icon, { name: folder.name === DRAFTS ? 'compose' : 'folder', size: 14 }),\n h('span', { className: 'name' }, folderName(folder.label ?? folder.name)),\n folder.count > 0 ? h('span', { className: 'count' }, String(folder.count)) : null,\n ),\n ),\n )\n : null,\n h(\n 'div',\n { className: 'mailharbor-list' },\n h(\n 'div',\n { className: 'mailharbor-filters' },\n h('input', {\n type: 'search',\n placeholder: showingDrafts\n ? '\u641C\u7D22\u8349\u7A3F'\n : aiSearching\n ? 'AI \u6B63\u5728\u7406\u89E3\u4F60\u7684\u641C\u7D22\u2026'\n : '\u641C\u7D22\u90AE\u4EF6\uFF0C\u6216\u63CF\u8FF0\u4F60\u8981\u627E\u4EC0\u4E48\uFF08AI\uFF09',\n 'aria-label': '\u641C\u7D22\u90AE\u4EF6',\n value: query,\n onChange: (event: { target: { value: string } }) => setQuery(event.target.value),\n onKeyDown: (event: { key: string }) => {\n if (event.key === 'Enter') {\n if (showingDrafts) setSearch(query)\n else void runAiSearch()\n }\n if (event.key === 'Escape') {\n setQuery('')\n setSearch('')\n setAiInfo(null)\n }\n },\n }),\n h(\n 'button',\n {\n className: selectMode ? 'ghost active' : 'ghost',\n title: '\u9009\u62E9\u591A\u5C01\u90AE\u4EF6\u52A0\u5165\u9879\u76EE',\n onClick: () => {\n if (selectMode) {\n setSelectMode(false)\n setSelectedKeys([])\n } else {\n void enterSelect()\n }\n },\n },\n Icon({ name: 'list', size: 14 }),\n '\u9009\u62E9',\n ),\n query !== search || search !== ''\n ? h(\n 'button',\n {\n className: 'subtle',\n title: '\u6E05\u9664\u641C\u7D22',\n onClick: () => {\n setQuery('')\n setSearch('')\n setAiInfo(null)\n },\n },\n h(Icon, { name: 'close', size: 14 }),\n )\n : null,\n ),\n aiInfo === null\n ? null\n : h(\n 'div',\n { className: 'mailharbor-ai-search' },\n h(Icon, { name: 'sparkles', size: 13 }),\n h(\n 'span',\n null,\n aiInfo.explanation !== '' ? aiInfo.explanation : `\u5173\u952E\u8BCD\uFF1A${aiInfo.keywords.join('\u3001')}`,\n ),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n {\n className: 'subtle',\n onClick: () => {\n setAiInfo(null)\n setTick((value) => value + 1)\n },\n },\n '\u6E05\u9664',\n ),\n ),\n aiSearching\n ? h('div', { className: 'mailharbor-ai-search searching' }, 'AI \u6B63\u5728\u7406\u89E3\u5E76\u641C\u7D22\u2026')\n : null,\n selectMode\n ? h(\n 'div',\n { className: 'mailharbor-selectbar' },\n h('span', { className: 'small' }, `\u5DF2\u9009 ${String(selectedKeys.length)} \u5C01`),\n h('span', { className: 'spacer' }),\n h(\n 'select',\n {\n value: targetProject,\n onChange: (event: { target: { value: string } }) =>\n setTargetProject(event.target.value),\n 'aria-label': '\u76EE\u6807\u9879\u76EE',\n },\n h('option', { value: '' }, projectOptions.length === 0 ? '\u8FD8\u6CA1\u6709\u9879\u76EE' : '\u9009\u62E9\u9879\u76EE'),\n projectOptions.map((project) =>\n h('option', { key: project.id, value: project.id }, project.name),\n ),\n ),\n h(\n 'button',\n {\n className: 'primary',\n disabled: selectedKeys.length === 0 || targetProject === '',\n onClick: () => void addSelectedToProject(),\n },\n '\u52A0\u5165\u9879\u76EE',\n ),\n h(\n 'button',\n {\n className: 'ghost',\n onClick: () => {\n setSelectMode(false)\n setSelectedKeys([])\n },\n },\n '\u53D6\u6D88',\n ),\n )\n : null,\n h(\n 'div',\n { className: 'mailharbor-rows' },\n loading && items.length === 0 && drafts.length === 0\n ? h('div', { className: 'mailharbor-empty' }, '\u6B63\u5728\u8BFB\u53D6\u2026')\n : showingDrafts\n ? drafts.length === 0\n ? h(\n 'div',\n { className: 'mailharbor-empty' },\n h(Icon, { name: 'compose', size: 28 }),\n h('div', { className: 'title' }, '\u6CA1\u6709\u8349\u7A3F'),\n h('div', { className: 'small' }, '\u5199\u4FE1\u65F6\u70B9\u300C\u5B58\u8349\u7A3F\u300D\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002'),\n )\n : drafts\n .filter((draft) =>\n search === ''\n ? true\n : `${draft.subject} ${draft.to} ${draft.cc}`\n .toLowerCase()\n .includes(search.toLowerCase()),\n )\n .map((draft) =>\n h(\n 'div',\n {\n key: draft.id,\n className: 'mailharbor-row',\n role: 'button',\n tabIndex: 0,\n onClick: () => openDraft(draft),\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n openDraft(draft)\n }\n },\n },\n h(\n 'span',\n { className: 'line-1' },\n h(\n 'span',\n { className: 'from' },\n `\u8349\u7A3F${draft.to === '' ? '' : ` \u00B7 \u6536\u4EF6\u4EBA ${draft.to}`}`,\n ),\n isAll\n ? h(\n 'span',\n { className: 'badge' },\n accounts.find((item) => item.id === draft.accountId)?.label ?? '',\n )\n : null,\n h('span', { className: 'date' }, shortDate(draft.updatedAt)),\n h(\n 'button',\n {\n className: 'subtle',\n title: '\u5220\u9664\u8349\u7A3F',\n onClick: (event: { stopPropagation: () => void }) => {\n event.stopPropagation()\n void removeDraft(draft.id, draft.accountId)\n },\n },\n h(Icon, { name: 'close', size: 13 }),\n ),\n ),\n h(\n 'span',\n { className: 'line-2' },\n h(\n 'span',\n { className: 'subject' },\n draft.subject === '' ? '(\u65E0\u4E3B\u9898)' : draft.subject,\n ),\n ),\n draft.html === ''\n ? null\n : h(\n 'span',\n { className: 'snippet' },\n draft.html\n .replace(/<[^>]+>/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, 120),\n ),\n ),\n )\n : items.length === 0\n ? h(\n 'div',\n { className: 'mailharbor-empty' },\n h(Icon, { name: aiInfo === null ? 'mail' : 'sparkles', size: 28 }),\n h(\n 'div',\n { className: 'title' },\n aiInfo === null\n ? source === 'local'\n ? '\u672C\u5730\u5907\u4EFD\u91CC\u8FD8\u6CA1\u6709\u90AE\u4EF6'\n : '\u670D\u52A1\u5668\u4E0A\u6CA1\u6709\u90AE\u4EF6'\n : 'AI \u641C\u7D22\u6CA1\u6709\u627E\u5230\u5339\u914D\u90AE\u4EF6',\n ),\n h(\n 'div',\n { className: 'small' },\n aiInfo === null\n ? source === 'local'\n ? '\u70B9\u9876\u90E8\u300C\u5907\u4EFD\u300D\u628A\u670D\u52A1\u5668\u90AE\u4EF6\u540C\u6B65\u4E0B\u6765\u3002'\n : '\u6362\u4E00\u4E2A\u6587\u4EF6\u5939\u6216\u7A0D\u540E\u5237\u65B0\u3002'\n : '\u6362\u4E2A\u8BF4\u6CD5\uFF0C\u6216\u76F4\u63A5\u8F93\u5165\u5173\u952E\u8BCD\u540E\u6309\u56DE\u8F66\u3002',\n ),\n )\n : selectMode\n ? items.map((item) => renderMessage(item))\n : groups.map((group) => {\n const latest = group.items[0]\n if (latest === undefined) return null\n const expanded = expandedGroups.includes(group.key)\n return h(\n 'div',\n { className: 'mailharbor-thread', key: group.key },\n renderMessage(latest, {\n groupCount: group.items.length,\n groupKey: group.key,\n expanded,\n }),\n expanded\n ? group.items.slice(1).map((item) => renderMessage(item, { compact: true }))\n : null,\n )\n }),\n ),\n !showingDrafts && items.length > 0\n ? h(\n 'div',\n { className: 'mailharbor-list-foot' },\n h('span', null, `${String(items.length)} / ${String(page.total)} \u5C01`),\n h('span', { className: 'spacer' }),\n page.total > items.length && aiInfo === null\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setLimit((current) => current + 40) },\n '\u52A0\u8F7D\u66F4\u591A',\n )\n : null,\n )\n : showingDrafts && drafts.length > 0\n ? h(\n 'div',\n { className: 'mailharbor-list-foot' },\n h('span', null, `${String(drafts.length)} \u5C01\u8349\u7A3F`),\n )\n : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-reader' },\n selected === null\n ? h(\n 'div',\n { className: 'mailharbor-empty' },\n h(Icon, { name: 'mail', size: 34 }),\n h('div', { className: 'title' }, '\u9009\u62E9\u4E00\u5C01\u90AE\u4EF6\u5F00\u59CB\u9605\u8BFB'),\n h(\n 'div',\n { className: 'small' },\n loggedIn ? '\u5DF2\u767B\u5F55\uFF0C\u53EF\u5207\u6362\u300C\u670D\u52A1\u5668\u5B9E\u65F6\u300D\u67E5\u770B\u6700\u65B0\u90AE\u4EF6\u3002' : '\u6D4F\u89C8\u672C\u5730\u5907\u4EFD\u4E0D\u9700\u8981\u767B\u5F55\u3002',\n ),\n )\n : h(Reader, {\n detail: selected,\n source,\n mailbox,\n onChanged: (patch) => setSelected({ ...selected, ...patch }),\n onReply: (mode) => startCompose(mode),\n onAiAction: requestAi,\n onExtractTasks: () => void extractTasks(),\n onAddToProject: openProjectPicker,\n onClose: narrow ? () => setSelected(null) : undefined,\n }),\n ),\n railOpen\n ? h(AiRail, {\n account:\n accounts.find((item) => item.id === (selected?.accountId ?? accountScope)) ??\n currentAccount,\n detail: selected,\n source,\n mailbox,\n request: aiRequest,\n onClose: () => setRailOpen(false),\n onInsert: insertReply,\n onSaveDraft: (init) => void saveReplyDraft(init),\n onNotice: notice,\n })\n : null,\n ),\n showBackup && backup !== null\n ? h(\n Modal,\n {\n title: '\u5907\u4EFD',\n onClose: () => setShowBackup(false),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', alignItems: 'center' } },\n h('span', { className: 'small muted' }, backup.running ? '\u5907\u4EFD\u8FDB\u884C\u4E2D\u2026' : backup.message),\n h('span', { className: 'spacer' }),\n backup.running\n ? h('button', { className: 'ghost danger', onClick: () => void stopBackup() }, '\u505C\u6B62\u5907\u4EFD')\n : h('button', { className: 'primary', onClick: () => void startBackup() }, '\u5F00\u59CB\u5907\u4EFD'),\n h('button', { className: 'ghost', onClick: () => setShowBackup(false) }, '\u5173\u95ED'),\n ),\n },\n h(\n 'div',\n { className: 'mailharbor-kv' },\n h('dt', null, '\u5F00\u59CB\u65F6\u95F4'),\n h('dd', null, backup.startedAt ?? '\u2014'),\n h('dt', null, '\u4E0A\u6B21\u6210\u529F'),\n h('dd', null, backup.lastSuccessAt ?? '\u2014'),\n h('dt', null, '\u65B0\u589E'),\n h('dd', null, String(backup.added)),\n h('dt', null, '\u603B\u6570'),\n h('dd', null, String(backup.total)),\n ),\n h(\n 'div',\n { className: 'mailharbor-log' },\n backup.output.length === 0 ? '\uFF08\u7B49\u5F85\u8F93\u51FA\u2026\uFF09' : backup.output.join('\\n'),\n ),\n )\n : null,\n projectPicker !== null\n ? h(\n Modal,\n {\n title: '\u52A0\u5165\u9879\u76EE',\n onClose: () => setProjectPicker(null),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', alignItems: 'center' } },\n h('span', { className: 'small muted' }, '\u628A\u8FD9\u5C01\u90AE\u4EF6\u5173\u8054\u5230\u4E00\u4E2A\u9879\u76EE'),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => setProjectPicker(null) }, '\u53D6\u6D88'),\n h(\n 'button',\n { className: 'primary', disabled: pickerBusy, onClick: () => void saveProjectPick() },\n pickerBusy ? '\u4FDD\u5B58\u4E2D\u2026' : '\u4FDD\u5B58',\n ),\n ),\n },\n h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n pickerProjects.length === 0\n ? h('p', { className: 'small muted' }, '\u8FD8\u6CA1\u6709\u9879\u76EE\uFF0C\u5728\u4E0B\u9762\u65B0\u5EFA\u4E00\u4E2A\u3002')\n : h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, '\u9009\u62E9\u5DF2\u6709\u9879\u76EE'),\n h(\n 'select',\n {\n value: pickerTarget,\n onChange: (event: { target: { value: string } }) => setPickerTarget(event.target.value),\n },\n h('option', { value: '' }, '\u4E0D\u52A0\u5165\u5DF2\u6709\u9879\u76EE'),\n pickerProjects.map((project) =>\n h(\n 'option',\n { key: project.id, value: project.id },\n `${project.name} \u00B7 ${project.messages.length} \u5C01`,\n ),\n ),\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, pickerProjects.length === 0 ? '\u65B0\u5EFA\u9879\u76EE' : '\u6216\u65B0\u5EFA\u9879\u76EE'),\n h('input', {\n value: pickerNewName,\n placeholder: '\u9879\u76EE\u540D\u79F0',\n onChange: (event: { target: { value: string } }) => setPickerNewName(event.target.value),\n }),\n ),\n h(\n 'p',\n { className: 'small muted' },\n pickerTarget === ''\n ? '\u4FDD\u5B58\u65F6\u4F1A\u7528\u4E0A\u9762\u7684\u540D\u79F0\u521B\u5EFA\u9879\u76EE\uFF0C\u5E76\u628A\u5F53\u524D\u90AE\u4EF6\u52A0\u8FDB\u53BB\u3002'\n : '\u4FDD\u5B58\u540E\u8FD9\u5C01\u90AE\u4EF6\u4F1A\u51FA\u73B0\u5728\u9879\u76EE\u7684\u6765\u6E90\u90AE\u4EF6\u5217\u8868\u91CC\u3002',\n ),\n ),\n )\n : null,\n extraction !== null\n ? h(\n Modal,\n {\n title: '\u63D0\u53D6\u4EFB\u52A1',\n onClose: () => setExtraction(null),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', alignItems: 'center' } },\n h('span', { className: 'small muted' }, '\u52FE\u9009\u8981\u4FDD\u5B58\u7684\u4EFB\u52A1\uFF1B\u4FDD\u5B58\u540E\u53EF\u5230\u300C\u4EFB\u52A1\u300D\u9762\u677F\u8DDF\u8FDB\u3002'),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => setExtraction(null) }, '\u53D6\u6D88'),\n h(\n 'button',\n {\n className: 'primary',\n disabled: extractBusy || extraction.checked.every((value) => !value),\n onClick: () => void saveExtraction(),\n },\n extractBusy ? '\u4FDD\u5B58\u4E2D\u2026' : '\u4FDD\u5B58\u4EFB\u52A1',\n ),\n ),\n },\n h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '8px' } },\n extraction.items.map((item, index) =>\n h(\n 'label',\n { key: `${item.title}:${String(index)}`, className: 'mailharbor-extract-row' },\n h('input', {\n type: 'checkbox',\n checked: extraction.checked[index] ?? false,\n onChange: () => {\n const checked = [...extraction.checked]\n checked[index] = !checked[index]\n setExtraction({ ...extraction, checked })\n },\n }),\n h(\n 'span',\n null,\n h('strong', null, item.title),\n h(\n 'span',\n { className: 'small muted' },\n [\n item.due === '' ? '' : `\u622A\u6B62 ${item.due}`,\n item.owner === '' ? '' : `\u8D1F\u8D23\u4EBA ${item.owner}`,\n item.notes,\n ]\n .filter((part) => part !== '')\n .join(' \u00B7 '),\n ),\n ),\n ),\n ),\n ),\n )\n : null,\n compose !== null && composeAccount !== null\n ? h(Composer, {\n account: composeAccount,\n initial: compose,\n onClose: () => setCompose(null),\n onSent: (message) => notice(message),\n })\n : null,\n showAdd\n ? h(AddAccountModal, {\n onClose: () => setShowAdd(false),\n onDone: (next) => {\n setState(next)\n setAccountScope(next.activeAccountId)\n refresh()\n },\n })\n : null,\n )\n}\n", "import { createElement as h, useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport type { Account, AiCard, AiThread, MessageDetail, Project } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { Modal } from './components.js'\nimport { Icon } from './icons.js'\nimport { Markdown } from './markdown.js'\nimport type { AiReplyInit } from './reply.js'\n\nexport interface AiRequest {\n kind: 'summary' | 'reply' | 'translate'\n nonce: number\n}\n\ntype Kind = 'summary' | 'reply' | 'translate' | 'answer'\n\ninterface AiStatus {\n available: boolean\n enabled: boolean\n provider: string\n model: string\n error?: string\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction textToHtml(text: string): string {\n return text\n .split(/\\n{2,}/)\n .map(\n (paragraph) =>\n `<p>${paragraph.trim().replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('\\n', '<br>')}</p>`,\n )\n .join('')\n}\n\nfunction summaryBlocks(text: string): { title: string; body: string }[] {\n const blocks: { title: string; body: string }[] = []\n let current: { title: string; lines: string[] } = { title: '', lines: [] }\n const push = (): void => {\n const body = current.lines.join('\\n').trim()\n if (current.title !== '' || body !== '') blocks.push({ title: current.title, body })\n current = { title: '', lines: [] }\n }\n for (const line of text.split('\\n')) {\n const heading =\n /^#{1,4}\\s+(.*)$/.exec(line) ?? /^(\u7ED3\u8BBA|\u9700\u8981\u4F60\u505A\u4EC0\u4E48|\u5173\u952E\u4FE1\u606F|\u5EFA\u8BAE\u56DE\u590D\u8981\u70B9)\\s*$/.exec(line)\n if (heading !== null) {\n push()\n current.title = heading[1] ?? ''\n } else {\n current.lines.push(line)\n }\n }\n push()\n return blocks\n}\n\nfunction suggestionsOf(summary: string): string {\n const match = /\u5EFA\u8BAE\u56DE\u590D\u8981\u70B9[\uFF1A:]?\\s*\\n([\\s\\S]*)$/.exec(summary)\n if (match === null) return '\u6839\u636E\u8FD9\u5C01\u90AE\u4EF6\u5199\u4E00\u5C01\u5F97\u4F53\u7684\u56DE\u590D\u3002'\n return `\u6839\u636E\u8FD9\u4E9B\u5EFA\u8BAE\u5199\u56DE\u590D\uFF1A\\n${(match[1] ?? '').trim()}`\n}\n\nconst KIND_LABEL: Record<Kind, string> = {\n summary: 'AI \u6458\u8981',\n reply: 'AI \u56DE\u590D',\n translate: 'AI \u7FFB\u8BD1',\n answer: 'AI \u56DE\u7B54',\n}\n\nfunction threadKey(detail: MessageDetail, source: 'local' | 'server'): string {\n return detail.messageId !== undefined && detail.messageId !== ''\n ? `mid:${detail.messageId}`\n : `${source}:${detail.id}`\n}\n\n/**\n * The per-mail AI workspace.\n *\n * Every output is a card stored on the Host, so closing the rail, switching\n * mail or restarting DSH never loses it. Cards end in an action: a summary can\n * spawn a reply, a reply can go to the composer or a draft, a translation can\n * be inserted, and the question box keeps the thread going.\n */\nexport function AiRail({\n account,\n detail,\n source,\n mailbox,\n request,\n onClose,\n onInsert,\n onSaveDraft,\n onNotice,\n}: {\n account: Account | null\n detail: MessageDetail | null\n source: 'local' | 'server'\n mailbox: string\n request: AiRequest | null\n onClose: () => void\n onInsert: (init: AiReplyInit) => void\n onSaveDraft: (init: AiReplyInit) => void\n onNotice: (message: string) => void\n}): ReactNode {\n const [status, setStatus] = useState<AiStatus | null>(null)\n const [thread, setThread] = useState<AiThread | null>(null)\n const [loading, setLoading] = useState(false)\n const [generating, setGenerating] = useState<Kind | null>(null)\n const [error, setError] = useState('')\n const [question, setQuestion] = useState('')\n const [confirmClear, setConfirmClear] = useState(false)\n const [project, setProject] = useState<Project | null>(null)\n const [projectOpen, setProjectOpen] = useState(false)\n const [projectName, setProjectName] = useState('')\n const [projectRoot, setProjectRoot] = useState('')\n const [projectBusy, setProjectBusy] = useState(false)\n const [projectWarnings, setProjectWarnings] = useState<string[]>([])\n const list = useRef<HTMLDivElement>(null)\n const lastNonce = useRef(0)\n const key = detail === null ? '' : threadKey(detail, source)\n\n useEffect(() => {\n if (account === null) return\n let cancelled = false\n api\n .aiStatus(account.id)\n .then((next) => {\n if (!cancelled) setStatus(next)\n })\n .catch(() => {\n if (!cancelled)\n setStatus({ available: false, enabled: false, provider: '', model: '', error: '\u65E0\u6CD5\u8BFB\u53D6 AI \u72B6\u6001' })\n })\n return () => {\n cancelled = true\n }\n }, [account])\n\n useEffect(() => {\n if (account === null || key === '') {\n setThread(null)\n return\n }\n let cancelled = false\n setLoading(true)\n api\n .aiThread(account.id, key)\n .then((result) => {\n if (!cancelled) setThread(result.thread)\n })\n .catch(() => {\n if (!cancelled) setThread(null)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [account, key])\n\n const generate = useCallback(\n async (kind: Kind, extra: Record<string, unknown> = {}): Promise<void> => {\n if (detail === null || account === null) return\n setGenerating(kind)\n setError('')\n try {\n const result = await api.aiAddCard({\n accountId: detail.accountId,\n key,\n kind,\n source,\n id: detail.id,\n mailbox,\n ...extra,\n })\n setThread(result.thread)\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setGenerating(null)\n }\n },\n [detail, account, key, source, mailbox],\n )\n\n // The reader's AI buttons ask the rail to run an action.\n useEffect(() => {\n if (request === null || request.nonce === lastNonce.current) return\n lastNonce.current = request.nonce\n if (detail !== null) void generate(request.kind)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [request])\n\n useEffect(() => {\n const element = list.current\n if (element !== null) element.scrollTop = element.scrollHeight\n }, [thread, generating])\n\n // Which project, if any, is this mail linked to?\n useEffect(() => {\n if (detail === null || account === null) {\n setProject(null)\n return\n }\n let cancelled = false\n api\n .projectFor(detail.accountId, key)\n .then((result) => {\n if (!cancelled) setProject(result.project)\n })\n .catch(() => {\n if (!cancelled) setProject(null)\n })\n return () => {\n cancelled = true\n }\n }, [detail, account, key, thread])\n\n const openProject = async (): Promise<void> => {\n setProjectOpen(true)\n setProjectWarnings([])\n try {\n const settings = await api.settings()\n setProjectRoot(settings.projects.root)\n setProjectName(detail?.subject.replace(/^(re|fwd):\\s*/i, '').slice(0, 80) ?? '')\n } catch {\n // The dialog still works with defaults.\n }\n }\n\n const conversation = (): string =>\n (thread?.cards ?? [])\n .map(\n (card) =>\n `### ${KIND_LABEL[card.kind as Kind] ?? 'AI'} \u00B7 ${new Date(card.createdAt).toLocaleString()}\\n\\n${card.output}`,\n )\n .join('\\n\\n')\n\n const transfer = async (): Promise<void> => {\n if (project === null || detail === null || account === null) return\n setProjectBusy(true)\n setProjectWarnings([])\n try {\n await api.transferProject(project.id, {\n accountId: account.id,\n key,\n conversation: conversation() === '' ? '\uFF08\u6682\u65E0\u65B0\u7684 AI \u8BB0\u5F55\uFF09' : conversation(),\n })\n onNotice('\u5DF2\u8FFD\u52A0\u5230\u9879\u76EE\u5BF9\u8BDD')\n setProjectOpen(false)\n } catch (caught) {\n setProjectWarnings([errorText(caught)])\n } finally {\n setProjectBusy(false)\n }\n }\n\n const create = async (): Promise<void> => {\n if (detail === null || account === null) return\n setProjectBusy(true)\n setProjectWarnings([])\n try {\n const result = await api.createProject({\n accountId: account.id,\n name: projectName.trim() === '' ? detail.subject : projectName.trim(),\n root: projectRoot,\n conversation: conversation() === '' ? '\uFF08\u8FD8\u6CA1\u6709 AI \u8BB0\u5F55\uFF09' : conversation(),\n message: { key, subject: detail.subject, date: detail.date },\n })\n setProject(result.project)\n setProjectWarnings(result.warnings)\n onNotice(`\u9879\u76EE\u5DF2\u521B\u5EFA\uFF1A${result.project.path}`)\n if (result.warnings.length === 0) setProjectOpen(false)\n } catch (caught) {\n setProjectWarnings([errorText(caught)])\n } finally {\n setProjectBusy(false)\n }\n }\n\n const replyInit = (card: AiCard): AiReplyInit => {\n const subject =\n card.meta?.subject ??\n (detail === null ? '' : /^re:/i.test(detail.subject) ? detail.subject : `Re: ${detail.subject}`)\n return {\n to: card.meta?.to ?? detail?.from.address ?? '',\n cc: '',\n subject,\n html: card.html ?? textToHtml(card.output),\n ...(card.meta?.inReplyTo !== undefined && card.meta.inReplyTo !== ''\n ? { inReplyTo: card.meta.inReplyTo }\n : {}),\n ...(card.meta?.references !== undefined && card.meta.references !== ''\n ? { references: card.meta.references }\n : {}),\n }\n }\n\n const copy = (card: AiCard): void => {\n void navigator.clipboard?.writeText(card.output).then(() => onNotice('\u5DF2\u590D\u5236'))\n }\n\n const remove = async (card: AiCard): Promise<void> => {\n if (account === null) return\n try {\n const result = await api.aiDeleteCard(account.id, key, card.id)\n setThread(result.thread)\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const clear = async (): Promise<void> => {\n if (account === null || key === '') return\n try {\n await api.aiClearThread(account.id, key)\n setThread(null)\n setConfirmClear(false)\n onNotice('\u5DF2\u6E05\u9664\u8FD9\u5C01\u90AE\u4EF6\u7684 AI \u8BB0\u5F55')\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const ask = async (): Promise<void> => {\n const text = question.trim()\n if (text === '' || generating !== null) return\n setQuestion('')\n await generate('answer', { instruction: text })\n }\n\n const disabled = status !== null && (!status.available || !status.enabled)\n const cards = thread?.cards ?? []\n\n return h(\n 'aside',\n { className: 'mailharbor-ai', 'aria-label': 'AI \u52A9\u624B' },\n h(\n 'div',\n { className: 'mailharbor-ai-head' },\n h(Icon, { name: 'sparkles', size: 15 }),\n h('strong', null, 'AI \u52A9\u624B'),\n status === null || status.model === '' ? null : h('span', { className: 'badge' }, status.model),\n h('span', { className: 'spacer' }),\n confirmClear\n ? h(\n 'span',\n { className: 'mailharbor-ai-confirm' },\n h('button', { className: 'subtle', onClick: () => void clear() }, '\u786E\u8BA4\u6E05\u9664'),\n h('button', { className: 'subtle', onClick: () => setConfirmClear(false) }, '\u53D6\u6D88'),\n )\n : h(\n 'button',\n {\n className: 'subtle icon',\n title: cards.length === 0 ? '\u5173\u95ED' : '\u6E05\u9664\u8FD9\u5C01\u90AE\u4EF6\u7684\u8BB0\u5F55',\n onClick: () => (cards.length === 0 ? onClose() : setConfirmClear(true)),\n },\n h(Icon, { name: cards.length === 0 ? 'close' : 'trash', size: 14 }),\n ),\n h(\n 'button',\n { className: 'subtle icon', title: '\u6536\u8D77', onClick: onClose },\n h(Icon, { name: 'chevronRight', size: 14 }),\n ),\n ),\n detail === null\n ? h(\n 'div',\n { className: 'mailharbor-ai-empty' },\n h(Icon, { name: 'sparkles', size: 26 }),\n h('div', { className: 'title' }, '\u5148\u9009\u4E00\u5C01\u90AE\u4EF6'),\n h('div', { className: 'small' }, '\u9009\u4E2D\u90AE\u4EF6\u540E\uFF0C\u53EF\u5728\u8FD9\u91CC\u751F\u6210\u6458\u8981\u3001\u56DE\u590D\u548C\u7FFB\u8BD1\uFF0C\u8BB0\u5F55\u4F1A\u4E00\u76F4\u4FDD\u7559\u3002'),\n )\n : h(\n 'div',\n { className: 'mailharbor-ai-context' },\n h('span', { className: 'small' }, '\u8DDF\u968F\u5F53\u524D\u90AE\u4EF6'),\n h('strong', null, detail.subject),\n h(\n 'span',\n { className: 'small muted' },\n project === null ? 'AI \u53EA\u770B\u5230\u8FD9\u5C01\u90AE\u4EF6' : `\u9879\u76EE\uFF1A${project.name}`,\n ),\n ),\n disabled && detail !== null\n ? h('div', { className: 'mailharbor-ai-warn' }, status?.error ?? 'AI \u5DF2\u5173\u95ED\uFF0C\u8BF7\u5230\u8BBE\u7F6E\u91CC\u5F00\u542F')\n : null,\n detail === null\n ? null\n : h(\n 'div',\n { className: 'mailharbor-ai-quick' },\n h(\n 'button',\n {\n className: 'ghost',\n disabled: disabled || generating !== null,\n onClick: () => void generate('summary'),\n },\n generating === 'summary' ? '\u603B\u7ED3\u4E2D\u2026' : '\u6458\u8981',\n ),\n h(\n 'button',\n {\n className: 'ghost',\n disabled: disabled || generating !== null,\n onClick: () => void generate('reply'),\n },\n generating === 'reply' ? '\u8D77\u8349\u4E2D\u2026' : '\u56DE\u590D',\n ),\n h(\n 'button',\n {\n className: 'ghost',\n disabled: disabled || generating !== null,\n onClick: () => void generate('translate', { target: 'en' }),\n },\n generating === 'translate' ? '\u7FFB\u8BD1\u4E2D\u2026' : '\u7FFB\u8BD1',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: () => void openProject() },\n h(Icon, { name: 'folder', size: 13 }),\n '\u9879\u76EE',\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-ai-list', ref: list },\n loading ? h('div', { className: 'mailharbor-ai-empty small' }, '\u6B63\u5728\u8BFB\u53D6\u8BB0\u5F55\u2026') : null,\n !loading && detail !== null && cards.length === 0 && generating === null\n ? h(\n 'div',\n { className: 'mailharbor-ai-empty' },\n h('div', { className: 'title' }, '\u8FD9\u5C01\u90AE\u4EF6\u8FD8\u6CA1\u6709 AI \u8BB0\u5F55'),\n h(\n 'div',\n { className: 'small' },\n '\u70B9\u4E0A\u9762\u7684\u300C\u6458\u8981\u300D\u5F00\u59CB\uFF1B\u751F\u6210\u7684\u5185\u5BB9\u4F1A\u4FDD\u5B58\u5728\u8FD9\u91CC\uFF0C\u5173\u6389\u9762\u677F\u4E5F\u4E0D\u4F1A\u4E22\u3002',\n ),\n )\n : null,\n cards.map((card) =>\n h(\n 'article',\n { className: 'mailharbor-ai-card', key: card.id },\n h(\n 'div',\n { className: 'mailharbor-ai-card-head' },\n h('span', null, KIND_LABEL[card.kind as Kind] ?? 'AI'),\n h('span', { className: 'muted small' }, new Date(card.createdAt).toLocaleTimeString()),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n {\n className: 'subtle icon',\n title: '\u5220\u9664',\n onClick: () => void remove(card),\n },\n h(Icon, { name: 'close', size: 12 }),\n ),\n ),\n card.kind === 'summary'\n ? h(\n 'div',\n { className: 'mailharbor-ai-summary' },\n summaryBlocks(card.output).map((block, index) =>\n h(\n 'section',\n { key: `${block.title}:${String(index)}` },\n block.title === '' ? null : h('h4', null, block.title),\n h(Markdown, { text: block.body }),\n ),\n ),\n )\n : h('div', { className: 'mailharbor-ai-text' }, h(Markdown, { text: card.output })),\n h(\n 'div',\n { className: 'mailharbor-ai-card-actions' },\n card.kind === 'summary'\n ? h(\n 'button',\n {\n className: 'ghost',\n disabled: generating !== null,\n onClick: () => void generate('reply', { instruction: suggestionsOf(card.output) }),\n },\n '\u7528\u8FD9\u4E9B\u8981\u70B9\u56DE\u590D',\n )\n : null,\n card.kind === 'reply' || card.kind === 'translate'\n ? h(\n 'button',\n { className: 'ghost', onClick: () => onInsert(replyInit(card)) },\n card.kind === 'translate' ? '\u63D2\u5165\u56DE\u590D' : '\u63D2\u5165\u6B63\u6587',\n )\n : null,\n card.kind === 'reply'\n ? h('button', { className: 'ghost', onClick: () => onSaveDraft(replyInit(card)) }, '\u5B58\u8349\u7A3F')\n : null,\n card.kind === 'answer'\n ? h(\n 'button',\n {\n className: 'ghost',\n onClick: () => setQuestion(card.output.slice(0, 80)),\n },\n '\u7EE7\u7EED\u8FFD\u95EE',\n )\n : null,\n h('span', { className: 'spacer' }),\n h('button', { className: 'subtle', onClick: () => copy(card) }, '\u590D\u5236'),\n ),\n ),\n ),\n generating !== null\n ? h(\n 'article',\n { className: 'mailharbor-ai-card generating' },\n h('div', { className: 'mailharbor-ai-card-head' }, h('span', null, KIND_LABEL[generating])),\n h('div', { className: 'mailharbor-ai-text muted' }, '\u6B63\u5728\u751F\u6210\u2026'),\n )\n : null,\n error === '' ? null : h('div', { className: 'mailharbor-ai-error' }, error),\n ),\n projectOpen\n ? h(\n Modal,\n {\n title: project === null ? '\u8F6C\u5230\u9879\u76EE' : `\u9879\u76EE\uFF1A${project.name}`,\n onClose: () => setProjectOpen(false),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', alignItems: 'center' } },\n projectWarnings.length === 0\n ? h(\n 'span',\n { className: 'small muted' },\n project === null ? '\u628A\u5F53\u524D AI \u8BB0\u5F55\u5E26\u8FDB\u4E00\u4E2A\u65B0\u5DE5\u4F5C\u7A7A\u95F4' : '\u628A\u5F53\u524D AI \u8BB0\u5F55\u8FFD\u52A0\u5230\u9879\u76EE\u5BF9\u8BDD',\n )\n : h(\n 'span',\n { className: 'small', style: { color: 'var(--m-warn)' } },\n projectWarnings.join('\uFF1B'),\n ),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => setProjectOpen(false) }, '\u5173\u95ED'),\n project === null\n ? h(\n 'button',\n { className: 'primary', disabled: projectBusy, onClick: () => void create() },\n projectBusy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u9879\u76EE',\n )\n : h(\n 'button',\n { className: 'primary', disabled: projectBusy, onClick: () => void transfer() },\n projectBusy ? '\u8FFD\u52A0\u4E2D\u2026' : '\u8FFD\u52A0\u5F53\u524D\u8BB0\u5F55',\n ),\n ),\n },\n project === null\n ? h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, '\u9879\u76EE\u540D\u79F0'),\n h('input', {\n value: projectName,\n onChange: (event: { target: { value: string } }) => setProjectName(event.target.value),\n }),\n ),\n h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, '\u9879\u76EE\u76EE\u5F55\uFF08\u9ED8\u8BA4\u53EF\u5728\u8BBE\u7F6E\u91CC\u6539\uFF09'),\n h(\n 'div',\n { style: { display: 'flex', gap: '6px' } },\n h('input', {\n value: projectRoot,\n onChange: (event: { target: { value: string } }) => setProjectRoot(event.target.value),\n }),\n h(\n 'button',\n {\n className: 'ghost',\n title: '\u4ECE\u6587\u4EF6\u7BA1\u7406\u5668\u9009\u62E9',\n onClick: () => {\n void api\n .pickDirectory()\n .then((result) => {\n if (result.path !== null) setProjectRoot(result.path)\n })\n .catch((caught: unknown) => setProjectWarnings([errorText(caught)]))\n },\n },\n h(Icon, { name: 'folder', size: 13 }),\n '\u6D4F\u89C8\u2026',\n ),\n ),\n ),\n h(\n 'p',\n { className: 'small muted' },\n `\u4F1A\u521B\u5EFA\u300C${projectName.trim() === '' ? '\u9879\u76EE' : projectName.trim()}\u300D\u6587\u4EF6\u5939\uFF0C\u5199\u5165 BRIEF.md \u548C\u5F53\u524D ${String(thread?.cards.length ?? 0)} \u6761 AI \u8BB0\u5F55\uFF0C\u5E76\u5728\u4FA7\u680F\u6CE8\u518C\u5DE5\u4F5C\u7A7A\u95F4\u3001\u5F00\u4E00\u4E2A\u4F1A\u8BDD\u3002`,\n ),\n )\n : h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '8px' } },\n h(\n 'dl',\n { className: 'mailharbor-kv' },\n h('dt', null, '\u76EE\u5F55'),\n h('dd', null, project.path),\n h('dt', null, 'AI \u8BB0\u5F55'),\n h('dd', null, `${String(thread?.cards.length ?? 0)} \u6761`),\n ),\n project.sessionId === ''\n ? h('p', { className: 'small muted' }, '\u4F1A\u8BDD\u672A\u521B\u5EFA\uFF1A\u5F53\u524D\u7EC4\u5408\u6CA1\u6709 sessions \u670D\u52A1\u3002')\n : null,\n h(\n 'p',\n { className: 'small muted' },\n '\u300C\u8FFD\u52A0\u5F53\u524D\u8BB0\u5F55\u300D\u4F1A\u628A\u5DE5\u4F5C\u53F0\u91CC\u7684\u5361\u7247\u5199\u5165\u9879\u76EE\u7684 CONVERSATION.md\u3002',\n ),\n ),\n )\n : null,\n detail === null\n ? null\n : h(\n 'form',\n {\n className: 'mailharbor-ai-ask',\n onSubmit: (event: { preventDefault: () => void }) => {\n event.preventDefault()\n void ask()\n },\n },\n h('input', {\n value: question,\n placeholder: '\u95EE\u8FD9\u5C01\u90AE\u4EF6\uFF0C\u4F8B\u5982\uFF1A\u8C01\u9700\u8981\u5728\u4EC0\u4E48\u65F6\u5019\u505A\u4EC0\u4E48\uFF1F',\n 'aria-label': '\u95EE AI',\n disabled: disabled || generating !== null,\n onChange: (event: { target: { value: string } }) => setQuestion(event.target.value),\n }),\n h(\n 'button',\n {\n className: 'primary icon',\n type: 'submit',\n disabled: disabled || generating !== null || question.trim() === '',\n },\n h(Icon, { name: 'send', size: 14 }),\n ),\n ),\n )\n}\n", "import { createElement as h, useEffect, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport function Avatar({ email, size = 26 }: { email: string; size?: number }): ReactNode {\n const letter = (email.trim()[0] ?? '?').toUpperCase()\n return h(\n 'span',\n {\n className: 'avatar',\n style: {\n width: `${String(size)}px`,\n height: `${String(size)}px`,\n fontSize: `${String(Math.round(size * 0.42))}px`,\n },\n 'aria-hidden': 'true',\n },\n letter,\n )\n}\n\nexport function Field({\n label,\n children,\n hint,\n}: {\n label: string\n children?: ReactNode\n hint?: string\n}): ReactNode {\n return h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, label),\n children,\n hint === undefined ? null : h('span', { className: 'small muted' }, hint),\n )\n}\n\nexport function Toggle({\n checked,\n onChange,\n label,\n}: {\n checked: boolean\n onChange: (value: boolean) => void\n label: string\n}): ReactNode {\n return h(\n 'label',\n { className: 'mailharbor-toggle' },\n h('input', {\n type: 'checkbox',\n checked,\n onChange: (event: { target: { checked: boolean } }) => {\n onChange(event.target.checked)\n },\n }),\n label,\n )\n}\n\n/** Portal root that keeps the shell's theme variables in scope. */\nfunction portalRoot(): HTMLElement {\n const existing = document.getElementById('mailharbor-portal')\n if (existing !== null) return existing\n const element = document.createElement('div')\n element.id = 'mailharbor-portal'\n element.className = 'mailharbor mailharbor-portal'\n document.body.append(element)\n return element\n}\n\nexport function Modal({\n title,\n children,\n footer,\n onClose,\n wide = false,\n}: {\n title: string\n children?: ReactNode\n footer?: ReactNode\n onClose: () => void\n wide?: boolean\n}): ReactNode {\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => {\n window.removeEventListener('keydown', onKey)\n }\n }, [onClose])\n return createPortal(\n h(\n 'div',\n {\n className: 'mailharbor-modal-mask',\n onMouseDown: (event: { target: unknown; currentTarget: unknown }) => {\n if (event.target === event.currentTarget) onClose()\n },\n },\n h(\n 'div',\n {\n className: 'mailharbor-modal',\n style: wide ? { width: 'min(920px, 100%)' } : undefined,\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-label': title,\n },\n h(\n 'header',\n null,\n title,\n h('span', { className: 'spacer' }),\n h('button', { className: 'subtle', onClick: onClose, 'aria-label': '\u5173\u95ED' }, '\u2715'),\n ),\n h('div', { className: 'content' }, children),\n footer === undefined ? null : h('footer', null, footer),\n ),\n ),\n portalRoot(),\n )\n}\n\nexport function ErrorBar({ message, onDismiss }: { message: string; onDismiss: () => void }): ReactNode {\n return h(\n 'div',\n { className: 'error', role: 'alert' },\n h('span', null, message),\n h('span', { className: 'spacer' }),\n h('button', { className: 'subtle', onClick: onDismiss }, '\u5173\u95ED'),\n )\n}\n\nconst DAY = 86_400_000\n\n/** Compact list timestamp: time today, month-day this year, else the date. */\nexport function shortDate(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso.slice(0, 16)\n const now = new Date()\n const sameDay =\n date.getFullYear() === now.getFullYear() &&\n date.getMonth() === now.getMonth() &&\n date.getDate() === now.getDate()\n const pad = (value: number): string => String(value).padStart(2, '0')\n if (sameDay) return `${pad(date.getHours())}:${pad(date.getMinutes())}`\n if (date.getFullYear() === now.getFullYear()) return `${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n return `${String(date.getFullYear())}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n}\n\n/** Full timestamp for the reader header. */\nexport function longDate(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso\n return date.toLocaleString(undefined, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nexport function isFresh(iso: string, windowMs = DAY): boolean {\n const time = new Date(iso).getTime()\n return !Number.isNaN(time) && Date.now() - time < windowMs\n}\n\nexport function formatBytes(size: number): string {\n if (!Number.isFinite(size) || size <= 0) return ''\n if (size < 1024) return `${String(size)} B`\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`\n return `${(size / 1024 / 1024).toFixed(1)} MB`\n}\n", "import { createElement as h, type ReactNode } from 'react'\n\nconst PATHS: Record<string, ReactNode> = {\n refresh: h('path', { d: 'M20 11a8 8 0 1 0-2.3 5.7M20 5v6h-6' }),\n plus: h('path', { d: 'M12 5v14M5 12h14' }),\n compose: h('path', { d: 'M4 20h4l10.5-10.5a2.1 2.1 0 0 0-3-3L5 17v3zM13.5 6.5l3 3' }),\n archive: h(\n 'g',\n null,\n h('rect', { x: 3, y: 4, width: 18, height: 5, rx: 1.5 }),\n h('path', { d: 'M5 9v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V9M10 13h4' }),\n ),\n paperclip: h('path', {\n d: 'M20 11.5 12 19.5a5 5 0 0 1-7-7l8-8a3.3 3.3 0 0 1 4.7 4.7l-8 8a1.7 1.7 0 0 1-2.4-2.4l7.3-7.3',\n }),\n mail: h(\n 'g',\n null,\n h('rect', { x: 3, y: 5, width: 18, height: 14, rx: 2.5 }),\n h('path', { d: 'm4 7 7.1 5a1.6 1.6 0 0 0 1.8 0L20 7' }),\n ),\n search: h('path', { d: 'M11 18a7 7 0 1 0 0-14 7 7 0 0 0 0 14zM20 20l-4-4' }),\n reply: h('path', { d: 'M9 7 4 12l5 5M4 12h9a6 6 0 0 1 6 6v1' }),\n replyAll: h('path', { d: 'm9 7-5 5 5 5M14 7l-5 5 5 5M13 12h5a5 5 0 0 1 5 5' }),\n forward: h('path', { d: 'm15 7 5 5-5 5M20 12h-9a6 6 0 0 0-6 6v1' }),\n check: h('path', { d: 'm5 13 4 4L19 7' }),\n image: h(\n 'g',\n null,\n h('rect', { x: 3, y: 4, width: 18, height: 16, rx: 2 }),\n h('circle', { cx: 8.5, cy: 9.5, r: 1.5 }),\n h('path', { d: 'm4 18 5-5 4 4 3-3 4 4' }),\n ),\n close: h('path', { d: 'M6 6l12 12M18 6 6 18' }),\n chevronLeft: h('path', { d: 'm14 6-6 6 6 6' }),\n chevronRight: h('path', { d: 'm10 6 6 6-6 6' }),\n sparkles: h(\n 'g',\n null,\n h('path', { d: 'm12 3 1.8 4.6L18.5 9l-4.7 1.4L12 15l-1.8-4.6L5.5 9l4.7-1.4z' }),\n h('path', { d: 'M18.5 15.5 19.3 18l2.2.8-2.2.7-.8 2.5-.8-2.5-2.2-.7 2.2-.8z' }),\n ),\n trash: h(\n 'g',\n null,\n h('path', {\n d: 'M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6.5 7l.8 12a1 1 0 0 0 1 .9h7.4a1 1 0 0 0 1-.9l.8-12',\n }),\n h('path', { d: 'M10 11v6M14 11v6' }),\n ),\n send: h('path', { d: 'm4 4 17 8-17 8 3.6-8z M7.6 12H21' }),\n list: h(\n 'g',\n null,\n h('path', { d: 'M8 6h12M8 12h12M8 18h12' }),\n h('path', { d: 'M4 6h.01M4 12h.01M4 18h.01' }),\n ),\n folder: h('path', {\n d: 'M3.5 6.5A1.5 1.5 0 0 1 5 5h4l2 2.5h8A1.5 1.5 0 0 1 20.5 9v8.5A1.5 1.5 0 0 1 19 19H5a1.5 1.5 0 0 1-1.5-1.5z',\n }),\n calendar: h(\n 'g',\n null,\n h('rect', { x: 3.5, y: 5, width: 17, height: 15.5, rx: 2 }),\n h('path', { d: 'M3.5 9.5h17M8 3.5v3M16 3.5v3' }),\n ),\n checklist: h(\n 'g',\n null,\n h('path', { d: 'M4 6.5 5.5 8 8 5M4 12.5 5.5 14 8 11M4 18.5 5.5 20 8 17' }),\n h('path', { d: 'M11 6.5h9M11 12.5h9M11 18.5h9' }),\n ),\n}\n\nexport function Icon({ name, size = 16 }: { name: keyof typeof PATHS | string; size?: number }): ReactNode {\n return h(\n 'svg',\n {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.7,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n 'aria-hidden': 'true',\n focusable: 'false',\n },\n PATHS[name] ?? null,\n )\n}\n", "import { createElement as h, type ReactNode } from 'react'\n\n/**\n * Small Markdown renderer for AI output.\n *\n * Supports headings, paragraphs, bold/italic/strikethrough, inline code,\n * fenced code blocks, links, lists and blockquotes. It builds React nodes, so\n * raw HTML in a model answer is shown as text, never executed.\n */\n\nconst INLINE =\n /\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)|\\*\\*([^*]+)\\*\\*|__([^_]+)__|`([^`]+)`|~~([^~]+)~~|\\*([^*]+)\\*|_([^_]+)_/g\n\nfunction inline(text: string, keyPrefix: string): ReactNode[] {\n const nodes: ReactNode[] = []\n let last = 0\n let index = 0\n INLINE.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = INLINE.exec(text)) !== null) {\n if (match.index > last) nodes.push(text.slice(last, match.index))\n const key = `${keyPrefix}-${String(index++)}`\n if (match[1] !== undefined && match[2] !== undefined) {\n nodes.push(h('a', { key, href: match[2], target: '_blank', rel: 'noreferrer noopener' }, match[1]))\n } else if (match[3] !== undefined) {\n nodes.push(h('strong', { key }, match[3]))\n } else if (match[4] !== undefined) {\n nodes.push(h('strong', { key }, match[4]))\n } else if (match[5] !== undefined) {\n nodes.push(h('code', { key }, match[5]))\n } else if (match[6] !== undefined) {\n nodes.push(h('del', { key }, match[6]))\n } else if (match[7] !== undefined) {\n nodes.push(h('em', { key }, match[7]))\n } else if (match[8] !== undefined) {\n nodes.push(h('em', { key }, match[8]))\n }\n last = INLINE.lastIndex\n }\n if (last < text.length) nodes.push(text.slice(last))\n return nodes\n}\n\nexport function Markdown({ text }: { text: string }): ReactNode {\n const lines = text.replace(/\\r\\n/g, '\\n').split('\\n')\n const blocks: ReactNode[] = []\n let index = 0\n let key = 0\n\n const isBlockStart = (line: string): boolean =>\n /^```/.test(line) ||\n /^#{1,6}\\s+/.test(line) ||\n /^>\\s?/.test(line) ||\n /^([-*+]|\\d+\\.)\\s+/.test(line) ||\n /^(-{3,}|\\*{3,}|_{3,})$/.test(line)\n\n while (index < lines.length) {\n const line = lines[index] ?? ''\n const k = `b${String(key++)}`\n\n if (line.trim() === '') {\n index += 1\n continue\n }\n\n if (/^```/.test(line)) {\n const code: string[] = []\n index += 1\n while (index < lines.length && !/^```/.test(lines[index] ?? '')) {\n code.push(lines[index] ?? '')\n index += 1\n }\n index += 1\n blocks.push(h('pre', { key: k }, h('code', null, code.join('\\n'))))\n continue\n }\n\n if (/^(-{3,}|\\*{3,}|_{3,})$/.test(line.trim())) {\n blocks.push(h('hr', { key: k }))\n index += 1\n continue\n }\n\n const heading = /^(#{1,6})\\s+(.*)$/.exec(line)\n if (heading !== null) {\n const level = Math.min(6, (heading[1] ?? '#').length)\n blocks.push(h(`h${String(level)}`, { key: k }, inline(heading[2] ?? '', k)))\n index += 1\n continue\n }\n\n if (/^>\\s?/.test(line)) {\n const quote: string[] = []\n while (index < lines.length && /^>\\s?/.test(lines[index] ?? '')) {\n quote.push((lines[index] ?? '').replace(/^>\\s?/, ''))\n index += 1\n }\n blocks.push(h('blockquote', { key: k }, h('p', null, inline(quote.join(' '), k))))\n continue\n }\n\n if (/^([-*+]|\\d+\\.)\\s+/.test(line)) {\n const ordered = /^\\d+\\.\\s+/.test(line)\n const items: string[] = []\n while (index < lines.length && /^([-*+]|\\d+\\.)\\s+/.test(lines[index] ?? '')) {\n items.push((lines[index] ?? '').replace(/^([-*+]|\\d+\\.)\\s+/, ''))\n index += 1\n }\n blocks.push(\n h(\n ordered ? 'ol' : 'ul',\n { key: k },\n items.map((item, itemIndex) =>\n h('li', { key: `${k}-${String(itemIndex)}` }, inline(item, `${k}-${String(itemIndex)}`)),\n ),\n ),\n )\n continue\n }\n\n const paragraph: string[] = []\n while (index < lines.length) {\n const current = lines[index] ?? ''\n if (current.trim() === '' || (paragraph.length > 0 && isBlockStart(current))) break\n paragraph.push(current)\n index += 1\n }\n blocks.push(h('p', { key: k }, inline(paragraph.join(' '), k)))\n }\n\n if (blocks.length === 0) return null\n return h('div', { className: 'mailharbor-markdown' }, blocks)\n}\n", "import { createElement as h, useState, type ReactNode } from 'react'\nimport type { Account, AppState } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { Field, Modal, Toggle } from './components.js'\n\nfunction domainOf(email: string): string {\n return email.split('@')[1] ?? 'example.com'\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nexport function AddAccountForm({\n onDone,\n onCancel,\n}: {\n onDone: (state: AppState) => void\n onCancel?: () => void\n}): ReactNode {\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [label, setLabel] = useState('')\n const [remember, setRemember] = useState(true)\n const [advanced, setAdvanced] = useState(false)\n const [imapHost, setImapHost] = useState('')\n const [imapPort, setImapPort] = useState('993')\n const [imapSecure, setImapSecure] = useState(true)\n const [smtpHost, setSmtpHost] = useState('')\n const [smtpPort, setSmtpPort] = useState('465')\n const [smtpSecure, setSmtpSecure] = useState(true)\n const [fromName, setFromName] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n const submit = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const domain = domainOf(email)\n const { state } = await api.addAccount({\n email: email.trim(),\n password,\n remember,\n ...(label.trim() === '' ? {} : { label: label.trim() }),\n ...(advanced\n ? {\n imap: {\n host: imapHost.trim() === '' ? `imap.${domain}` : imapHost.trim(),\n port: Number(imapPort) || 993,\n secure: imapSecure,\n },\n smtp: {\n host: smtpHost.trim() === '' ? `smtp.${domain}` : smtpHost.trim(),\n port: Number(smtpPort) || 465,\n secure: smtpSecure,\n ...(fromName.trim() === '' ? {} : { fromName: fromName.trim() }),\n },\n }\n : {}),\n })\n onDone(state)\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u6DFB\u52A0\u90AE\u7BB1\u8D26\u53F7'),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u90AE\u7BB1\u5730\u5740' },\n h('input', {\n type: 'email',\n value: email,\n placeholder: 'you@example.com',\n onChange: (event: { target: { value: string } }) => setEmail(event.target.value),\n autoFocus: true,\n }),\n ),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n }),\n ),\n ),\n h(\n Field,\n { label: '\u663E\u793A\u540D\u79F0\uFF08\u53EF\u9009\uFF09' },\n h('input', {\n value: label,\n placeholder: '\u5DE5\u4F5C\u90AE\u7BB1',\n onChange: (event: { target: { value: string } }) => setLabel(event.target.value),\n }),\n ),\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801\uFF08\u5199\u5165\u7CFB\u7EDF\u94A5\u5319\u4E32\uFF09' }),\n h(\n 'button',\n { className: 'ghost', onClick: () => setAdvanced(!advanced) },\n advanced ? '\u9690\u85CF\u9AD8\u7EA7\u8BBE\u7F6E' : '\u9AD8\u7EA7\u8BBE\u7F6E\uFF08\u670D\u52A1\u5668\u4E0E\u7AEF\u53E3\uFF09',\n ),\n advanced\n ? h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'IMAP \u4E3B\u673A' },\n h('input', {\n value: imapHost,\n placeholder: `imap.${domainOf(email)}`,\n onChange: (event: { target: { value: string } }) => setImapHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: imapPort,\n inputMode: 'numeric',\n onChange: (event: { target: { value: string } }) => setImapPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: imapSecure, onChange: setImapSecure, label: 'TLS' }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'SMTP \u4E3B\u673A' },\n h('input', {\n value: smtpHost,\n placeholder: `smtp.${domainOf(email)}`,\n onChange: (event: { target: { value: string } }) => setSmtpHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: smtpPort,\n inputMode: 'numeric',\n onChange: (event: { target: { value: string } }) => setSmtpPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: smtpSecure, onChange: setSmtpSecure, label: 'TLS' }),\n ),\n h(\n Field,\n { label: '\u53D1\u4EF6\u4EBA\u540D\u79F0\uFF08\u53EF\u9009\uFF09' },\n h('input', {\n value: fromName,\n onChange: (event: { target: { value: string } }) => setFromName(event.target.value),\n }),\n ),\n )\n : null,\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', justifyContent: 'flex-end' } },\n onCancel === undefined ? null : h('button', { className: 'ghost', onClick: onCancel }, '\u53D6\u6D88'),\n h(\n 'button',\n {\n className: 'primary',\n onClick: () => void submit(),\n disabled: busy || email.trim() === '' || password === '',\n },\n busy ? '\u8FDE\u63A5\u4E2D\u2026' : '\u6DFB\u52A0\u5E76\u8FDE\u63A5',\n ),\n ),\n )\n}\n\nexport function LoginForm({ account, onDone }: { account: Account; onDone: () => void }): ReactNode {\n const [password, setPassword] = useState('')\n const [remember, setRemember] = useState(true)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const submit = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.login(account.id, password, remember)\n onDone()\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n return h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, `\u767B\u5F55 ${account.email}`),\n h(\n 'p',\n { className: 'small muted' },\n `${account.imap.host}:${String(account.imap.port)} \u00B7 ${account.smtp.host}:${String(account.smtp.port)}`,\n ),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n onKeyDown: (event: { key: string }) => {\n if (event.key === 'Enter') void submit()\n },\n autoFocus: true,\n }),\n ),\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801\uFF08\u5199\u5165\u7CFB\u7EDF\u94A5\u5319\u4E32\uFF09' }),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'button',\n { className: 'primary', onClick: () => void submit(), disabled: busy || password === '' },\n busy ? '\u767B\u5F55\u4E2D\u2026' : '\u767B\u5F55',\n ),\n )\n}\n\nexport function AddAccountModal({\n onClose,\n onDone,\n}: {\n onClose: () => void\n onDone: (state: AppState) => void\n}): ReactNode {\n return h(\n Modal,\n { title: '\u6DFB\u52A0\u90AE\u7BB1\u8D26\u53F7', onClose },\n h(AddAccountForm, {\n onDone: (state) => {\n onDone(state)\n onClose()\n },\n onCancel: onClose,\n }),\n )\n}\n\nexport { errorText }\n", "import { createElement as h, useEffect, useRef, useState, type ReactNode } from 'react'\nimport type { Account, DraftAttachment } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { Field, Modal } from './components.js'\nimport { Icon } from './icons.js'\n\nexport interface ComposeInit {\n mode: 'new' | 'reply' | 'replyAll' | 'forward'\n accountId?: string\n to: string\n cc: string\n bcc: string\n subject: string\n html: string\n inReplyTo?: string\n references?: string\n draftId?: string\n attachments?: DraftAttachment[]\n}\n\ninterface Version {\n html: string\n label: string\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction readFileBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n const result = String(reader.result ?? '')\n resolve(result.slice(result.indexOf(',') + 1))\n }\n reader.onerror = () => reject(new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${file.name}`))\n reader.readAsDataURL(file)\n })\n}\n\nexport function Composer({\n account,\n initial,\n onClose,\n onSent,\n}: {\n account: Account\n initial: ComposeInit\n onClose: () => void\n onSent: (message: string) => void\n}): ReactNode {\n const [to, setTo] = useState(initial.to)\n const [cc, setCc] = useState(initial.cc)\n const [bcc, setBcc] = useState(initial.bcc)\n const [subject, setSubject] = useState(initial.subject)\n const [showCc, setShowCc] = useState(initial.cc !== '' || initial.bcc !== '')\n const [attachments, setAttachments] = useState<DraftAttachment[]>(initial.attachments ?? [])\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [confirming, setConfirming] = useState(false)\n const [draftId, setDraftId] = useState(initial.draftId)\n const [savedAt, setSavedAt] = useState<Date | null>(null)\n const [dirty, setDirty] = useState(0)\n const [translating, setTranslating] = useState<'zh' | 'en' | null>(null)\n const [pendingLang, setPendingLang] = useState<'zh' | 'en' | null>(null)\n const [versions, setVersions] = useState<Version[]>([{ html: initial.html, label: '\u539F\u59CB' }])\n const [versionIndex, setVersionIndex] = useState(0)\n const [aiBusy, setAiBusy] = useState<'draft' | 'polish' | 'shorten' | null>(null)\n const [aiDraftOpen, setAiDraftOpen] = useState(false)\n const [aiInstruction, setAiInstruction] = useState('')\n const [hasBody, setHasBody] = useState(initial.html.trim() !== '')\n const editor = useRef<HTMLDivElement>(null)\n const closing = useRef(false)\n\n useEffect(() => {\n if (editor.current !== null) editor.current.innerHTML = initial.html\n setHasBody((editor.current?.innerHTML ?? '').trim() !== '')\n // The initial body is applied once; later edits own the DOM.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const html = (): string => editor.current?.innerHTML ?? ''\n const text = (): string => editor.current?.innerText ?? ''\n const markDirty = (): void => {\n setDirty((value) => value + 1)\n setHasBody((editor.current?.innerHTML ?? '').trim() !== '')\n }\n\n const saveNow = async (): Promise<boolean> => {\n if (to.trim() === '' && subject.trim() === '' && html().trim() === '') return false\n try {\n const { draft } = await api.saveDraft(account.id, {\n ...(draftId === undefined ? {} : { id: draftId }),\n to,\n cc,\n bcc,\n subject,\n html: html(),\n attachments,\n ...(initial.inReplyTo === undefined ? {} : { inReplyTo: initial.inReplyTo }),\n ...(initial.references === undefined ? {} : { references: initial.references }),\n })\n setDraftId(draft.id)\n setSavedAt(new Date())\n setDirty(0)\n return true\n } catch {\n return false\n }\n }\n\n // Debounced autosave: closing the composer must never lose a draft.\n useEffect(() => {\n if (dirty === 0) return\n const timer = window.setTimeout(() => {\n void saveNow()\n }, 2000)\n return () => {\n window.clearTimeout(timer)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dirty, to, cc, bcc, subject, attachments])\n\n const close = (): void => {\n if (closing.current) return\n closing.current = true\n void saveNow().finally(() => {\n setDirty(0)\n closing.current = false\n onClose()\n })\n }\n\n const pushVersion = (nextHtml: string, label: string): void => {\n const base = versions.slice(0, versionIndex + 1)\n if (base[base.length - 1]?.html !== html()) base.push({ html: html(), label: '\u624B\u52A8' })\n base.push({ html: nextHtml, label })\n setVersions(base.slice(-10))\n setVersionIndex(Math.min(base.length - 1, 9))\n if (editor.current !== null) editor.current.innerHTML = nextHtml\n setHasBody(nextHtml.trim() !== '')\n markDirty()\n }\n\n const restoreVersion = (index: number): void => {\n const version = versions[index]\n if (version === undefined || editor.current === null) return\n editor.current.innerHTML = version.html\n setVersionIndex(index)\n setHasBody(version.html.trim() !== '')\n markDirty()\n }\n\n const runAi = async (mode: 'draft' | 'polish' | 'shorten'): Promise<void> => {\n setAiBusy(mode)\n setError('')\n try {\n const result = await api.aiCompose({\n accountId: account.id,\n mode,\n instruction: aiInstruction,\n html: html(),\n language: 'zh',\n })\n pushVersion(result.html, mode === 'draft' ? 'AI \u8D77\u8349' : mode === 'polish' ? 'AI \u6DA6\u8272' : 'AI \u7F29\u77ED')\n setAiDraftOpen(false)\n setAiInstruction('')\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setAiBusy(null)\n }\n }\n\n const translate = async (target: 'zh' | 'en'): Promise<void> => {\n if (editor.current === null) return\n if (html().trim() === '') {\n setError('\u6B63\u6587\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u7FFB\u8BD1')\n return\n }\n setPendingLang(null)\n setTranslating(target)\n setError('')\n try {\n const result = await api.aiTranslate({ accountId: account.id, html: html(), target })\n pushVersion(result.html, target === 'en' ? '\u7FFB\u8BD1 EN' : '\u7FFB\u8BD1 \u4E2D')\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setTranslating(null)\n }\n }\n\n const exec = (command: string, value?: string): void => {\n editor.current?.focus()\n document.execCommand(command, false, value)\n markDirty()\n }\n\n const addFiles = async (files: FileList | null): Promise<void> => {\n if (files === null || files.length === 0) return\n setError('')\n const next = [...attachments]\n let total = next.reduce((sum, file) => sum + file.data.length, 0)\n for (const file of Array.from(files)) {\n if (total + file.size > 8 * 1024 * 1024) {\n setError('\u9644\u4EF6\u5408\u8BA1\u4E0D\u80FD\u8D85\u8FC7 8 MB')\n break\n }\n const data = await readFileBase64(file)\n next.push({ filename: file.name, contentType: file.type || 'application/octet-stream', data })\n total += file.size\n }\n setAttachments(next)\n markDirty()\n }\n\n const saveDraft = async (): Promise<void> => {\n setBusy(true)\n setError('')\n const ok = await saveNow()\n setBusy(false)\n if (ok) onSent('\u8349\u7A3F\u5DF2\u4FDD\u5B58')\n else setError('\u8349\u7A3F\u4FDD\u5B58\u5931\u8D25')\n }\n\n const send = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.send(account.id, {\n to,\n cc,\n bcc,\n subject,\n html: html(),\n text: text(),\n attachments,\n ...(initial.inReplyTo === undefined ? {} : { inReplyTo: initial.inReplyTo }),\n ...(initial.references === undefined ? {} : { references: initial.references }),\n })\n if (draftId !== undefined) {\n try {\n await api.deleteDraft(draftId, account.id)\n } catch {\n // The sent message matters more than removing its draft.\n }\n }\n onSent('\u90AE\u4EF6\u5DF2\u53D1\u9001')\n onClose()\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n setConfirming(false)\n }\n }\n\n return h(\n Modal,\n {\n title:\n initial.mode === 'reply'\n ? '\u56DE\u590D'\n : initial.mode === 'replyAll'\n ? '\u5168\u90E8\u56DE\u590D'\n : initial.mode === 'forward'\n ? '\u8F6C\u53D1'\n : '\u5199\u90AE\u4EF6',\n onClose: close,\n wide: true,\n footer: h(\n 'div',\n { className: 'mailharbor-compose-foot' },\n h('span', { className: 'small muted' }, `\u53D1\u4EF6\u4EBA ${account.email}`),\n savedAt === null\n ? null\n : h('span', { className: 'small muted' }, `\u5DF2\u81EA\u52A8\u4FDD\u5B58 ${savedAt.toLocaleTimeString()}`),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => void saveDraft(), disabled: busy }, '\u5B58\u8349\u7A3F'),\n confirming\n ? h(\n 'span',\n { style: { display: 'inline-flex', gap: '6px', alignItems: 'center' } },\n h('span', { className: 'small' }, '\u786E\u5B9A\u53D1\u9001\uFF1F'),\n h(\n 'button',\n { className: 'primary', onClick: () => void send(), disabled: busy },\n busy ? '\u53D1\u9001\u4E2D\u2026' : '\u786E\u5B9A',\n ),\n h('button', { className: 'ghost', onClick: () => setConfirming(false) }, '\u53D6\u6D88'),\n )\n : h(\n 'button',\n {\n className: 'primary',\n onClick: () => setConfirming(true),\n disabled: busy || to.trim() === '',\n },\n '\u53D1\u9001',\n ),\n ),\n },\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u6536\u4EF6\u4EBA' },\n h('input', {\n value: to,\n onChange: (event: { target: { value: string } }) => {\n setTo(event.target.value)\n markDirty()\n },\n placeholder: 'a@example.com, b@example.com',\n }),\n ),\n h(\n Field,\n { label: '\u4E3B\u9898' },\n h('input', {\n value: subject,\n onChange: (event: { target: { value: string } }) => {\n setSubject(event.target.value)\n markDirty()\n },\n placeholder: '\u90AE\u4EF6\u4E3B\u9898',\n }),\n ),\n ),\n showCc\n ? h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u6284\u9001' },\n h('input', {\n value: cc,\n onChange: (event: { target: { value: string } }) => {\n setCc(event.target.value)\n markDirty()\n },\n }),\n ),\n h(\n Field,\n { label: '\u5BC6\u9001' },\n h('input', {\n value: bcc,\n onChange: (event: { target: { value: string } }) => {\n setBcc(event.target.value)\n markDirty()\n },\n }),\n ),\n )\n : h(\n 'button',\n { className: 'subtle small', style: { alignSelf: 'flex-start' }, onClick: () => setShowCc(true) },\n '\u6DFB\u52A0\u6284\u9001 / \u5BC6\u9001',\n ),\n h(\n 'div',\n { className: 'mailharbor-toolbar' },\n h('button', { onClick: () => exec('bold'), title: '\u52A0\u7C97' }, 'B'),\n h('button', { onClick: () => exec('italic'), title: '\u659C\u4F53' }, 'I'),\n h('button', { onClick: () => exec('underline'), title: '\u4E0B\u5212\u7EBF' }, 'U'),\n h('button', { onClick: () => exec('insertUnorderedList'), title: '\u65E0\u5E8F\u5217\u8868' }, '\u2022 \u5217\u8868'),\n h('button', { onClick: () => exec('insertOrderedList'), title: '\u6709\u5E8F\u5217\u8868' }, '1. \u5217\u8868'),\n h('button', { onClick: () => exec('formatBlock', 'blockquote'), title: '\u5F15\u7528' }, '\u5F15\u7528'),\n h(\n 'button',\n {\n onClick: () => {\n const url = window.prompt('\u94FE\u63A5\u5730\u5740\uFF08https://\u2026\uFF09')\n if (url !== null && /^https?:\\/\\//i.test(url)) exec('createLink', url)\n },\n title: '\u94FE\u63A5',\n },\n '\u94FE\u63A5',\n ),\n h('button', { onClick: () => exec('removeFormat'), title: '\u6E05\u9664\u683C\u5F0F' }, '\u6E05\u9664'),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n {\n className: 'ai',\n onClick: () => setAiDraftOpen(!aiDraftOpen),\n disabled: aiBusy !== null,\n title: '\u8BA9 AI \u8D77\u8349\u6B63\u6587',\n },\n h(Icon, { name: 'sparkles', size: 13 }),\n '\u8D77\u8349',\n ),\n h(\n 'button',\n { className: 'ai', onClick: () => void runAi('polish'), disabled: aiBusy !== null || !hasBody },\n aiBusy === 'polish' ? '\u6DA6\u8272\u4E2D\u2026' : '\u6DA6\u8272',\n ),\n h(\n 'button',\n { className: 'ai', onClick: () => void runAi('shorten'), disabled: aiBusy !== null || !hasBody },\n aiBusy === 'shorten' ? '\u7F29\u77ED\u4E2D\u2026' : '\u7F29\u77ED',\n ),\n h(\n 'button',\n { onClick: () => setPendingLang('zh'), disabled: translating !== null, title: 'AI \u7FFB\u8BD1\u6210\u4E2D\u6587' },\n translating === 'zh' ? '\u2026' : '\u4E2D',\n ),\n h(\n 'button',\n { onClick: () => setPendingLang('en'), disabled: translating !== null, title: 'AI \u7FFB\u8BD1\u6210\u82F1\u6587' },\n translating === 'en' ? '\u2026' : 'EN',\n ),\n h(\n 'label',\n { className: 'mailharbor-toggle small' },\n '\u9644\u4EF6',\n h('input', {\n type: 'file',\n multiple: true,\n style: { display: 'none' },\n onChange: (event: { target: { files: FileList | null; value: string } }) => {\n void addFiles(event.target.files)\n event.target.value = ''\n },\n }),\n ),\n ),\n aiDraftOpen\n ? h(\n 'div',\n { className: 'mailharbor-confirm' },\n h('input', {\n value: aiInstruction,\n placeholder: '\u60F3\u8BA9 AI \u5199\u4EC0\u4E48\uFF1F\u4F8B\u5982\uFF1A\u786E\u8BA4\u6536\u5230\uFF0C\u5468\u4E94\u524D\u7ED9\u7B54\u590D',\n onChange: (event: { target: { value: string } }) => setAiInstruction(event.target.value),\n onKeyDown: (event: { key: string }) => {\n if (event.key === 'Enter') void runAi('draft')\n },\n }),\n h(\n 'button',\n { className: 'primary', onClick: () => void runAi('draft'), disabled: aiBusy !== null },\n aiBusy === 'draft' ? '\u751F\u6210\u4E2D\u2026' : '\u751F\u6210',\n ),\n h('button', { className: 'ghost', onClick: () => setAiDraftOpen(false) }, '\u53D6\u6D88'),\n )\n : null,\n pendingLang === null\n ? null\n : h(\n 'div',\n { className: 'mailharbor-confirm' },\n h('span', null, pendingLang === 'en' ? '\u628A\u6B63\u6587\u7FFB\u8BD1\u6210\u82F1\u6587\uFF1F' : '\u628A\u6B63\u6587\u7FFB\u8BD1\u6210\u4E2D\u6587\uFF1F'),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => setPendingLang(null) }, '\u53D6\u6D88'),\n h('button', { className: 'primary', onClick: () => void translate(pendingLang) }, '\u7FFB\u8BD1'),\n ),\n attachments.length === 0\n ? null\n : h(\n 'div',\n { className: 'mailharbor-attachments', style: { padding: 0, border: 0 } },\n attachments.map((file, index) =>\n h(\n 'span',\n { className: 'mailharbor-attachment', key: `${file.filename}:${String(index)}` },\n h('span', { className: 'name' }, file.filename),\n h(\n 'button',\n {\n className: 'subtle',\n onClick: () => {\n setAttachments(attachments.filter((_item, position) => position !== index))\n markDirty()\n },\n },\n '\u2715',\n ),\n ),\n ),\n ),\n h('div', {\n className: 'mailharbor-editor',\n ref: editor,\n contentEditable: true,\n suppressContentEditableWarning: true,\n 'data-placeholder': '\u5199\u70B9\u4EC0\u4E48\u2026',\n spellCheck: true,\n onInput: markDirty,\n }),\n h(\n 'div',\n { className: 'mailharbor-versions' },\n h('span', { className: 'small muted' }, '\u7248\u672C'),\n versions.map((version, index) =>\n h(\n 'button',\n {\n key: `${version.label}:${String(index)}`,\n className: index === versionIndex ? 'chip active' : 'chip',\n title: version.label,\n onClick: () => restoreVersion(index),\n },\n String(index + 1),\n ),\n ),\n versions.length > 1\n ? h(\n 'button',\n { className: 'subtle small', onClick: () => restoreVersion(Math.max(0, versionIndex - 1)) },\n '\u6062\u590D\u4E0A\u4E00\u7248',\n )\n : null,\n h('span', { className: 'spacer' }),\n h('span', { className: 'small muted' }, versions[versionIndex]?.label ?? ''),\n ),\n )\n}\n", "import { createElement as h, useMemo, useState, type ReactNode } from 'react'\nimport type { MessageDetail } from '../shared/types.js'\nimport { api } from './api.js'\nimport { Avatar, formatBytes, longDate } from './components.js'\nimport { Icon } from './icons.js'\n\nexport type ReaderAiAction = 'summary' | 'reply' | 'translate'\n\nconst IFRAME_STYLE = `\n html, body { margin: 0; padding: 0; }\n body {\n font: 15px/1.75 -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n color: #171a21; background: #fff; padding: 20px 22px;\n overflow-wrap: anywhere;\n }\n img { max-width: 100%; height: auto; }\n table { max-width: 100%; border-collapse: collapse; }\n td, th { padding: 2px 6px; }\n a { color: #2f5bd3; }\n blockquote { margin: 0 0 0 12px; padding-left: 12px; border-left: 2px solid #d7dbe3; color: #565c67; }\n pre { white-space: pre-wrap; }\n`\n\nfunction csp(allowRemoteImages: boolean): string {\n return [\n \"default-src 'none'\",\n \"style-src 'unsafe-inline'\",\n 'font-src data:',\n `img-src data:${allowRemoteImages ? ' https: http:' : ''}`,\n \"form-action 'none'\",\n \"base-uri 'none'\",\n ].join('; ')\n}\n\nfunction srcDoc(detail: MessageDetail, allowRemoteImages: boolean): string {\n const html =\n detail.html !== null && detail.html !== '' ? detail.html : `<pre>${escapeHtml(detail.text)}</pre>`\n return `<!doctype html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"Content-Security-Policy\" content=\"${csp(allowRemoteImages)}\"><style>${IFRAME_STYLE}</style></head><body>${html}</body></html>`\n}\n\nfunction escapeHtml(value: string): string {\n return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;')\n}\n\nfunction hasRemoteImages(detail: MessageDetail): boolean {\n return detail.html !== null && /<img[^>]+src=[\"']https?:/i.test(detail.html)\n}\n\nfunction addressLine(list: { name: string; address: string }[]): string {\n return list.map((item) => (item.name !== '' ? `${item.name} <${item.address}>` : item.address)).join('\u3001')\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nexport function Reader({\n detail,\n source,\n mailbox,\n onChanged,\n onReply,\n onAiAction,\n onExtractTasks,\n onAddToProject,\n onClose,\n}: {\n detail: MessageDetail\n source: 'local' | 'server'\n mailbox: string\n onChanged: (patch: Partial<MessageDetail>) => void\n onReply: (mode: 'reply' | 'replyAll' | 'forward') => void\n onAiAction: (action: ReaderAiAction) => void\n onExtractTasks: () => void\n onAddToProject: () => void\n onClose?: () => void\n}): ReactNode {\n const [plain, setPlain] = useState(false)\n const [loadImages, setLoadImages] = useState(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n const remoteImages = useMemo(() => hasRemoteImages(detail), [detail])\n const html = detail.html !== null && detail.html !== ''\n\n const toggleRead = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.setRead({\n id: detail.id,\n accountId: detail.accountId,\n source,\n mailbox,\n read: detail.unread,\n })\n onChanged({ unread: !result.read })\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor-reader' },\n h(\n 'div',\n { className: 'mailharbor-reader-head' },\n h(\n 'div',\n { className: 'mailharbor-reader-title' },\n onClose === undefined\n ? null\n : h(\n 'button',\n { className: 'ghost icon', onClick: onClose, 'aria-label': '\u8FD4\u56DE\u5217\u8868', title: '\u8FD4\u56DE\u5217\u8868' },\n h(Icon, { name: 'chevronLeft' }),\n ),\n h('h2', { style: { flex: 1 } }, detail.subject),\n h(\n 'button',\n {\n className: 'ghost icon',\n onClick: () => void toggleRead(),\n disabled: busy,\n title: detail.unread ? '\u6807\u4E3A\u5DF2\u8BFB' : '\u6807\u4E3A\u672A\u8BFB',\n 'aria-label': detail.unread ? '\u6807\u4E3A\u5DF2\u8BFB' : '\u6807\u4E3A\u672A\u8BFB',\n },\n h(Icon, { name: 'check' }),\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-meta' },\n h(\n 'span',\n { className: 'who' },\n h(Avatar, { email: detail.from.address, size: 22 }),\n h('strong', null, detail.from.name !== '' ? detail.from.name : detail.from.address),\n detail.from.name !== '' ? h('span', null, `<${detail.from.address}>`) : null,\n ),\n h('span', null, longDate(detail.date)),\n detail.backedUp === false ? h('span', { className: 'badge warn' }, '\u672A\u5907\u4EFD') : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-meta' },\n h('span', null, `\u6536\u4EF6\u4EBA: ${addressLine(detail.to) || '\u2014'}`),\n detail.cc.length === 0 ? null : h('span', null, `\u6284\u9001: ${addressLine(detail.cc)}`),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-actions' },\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('reply') },\n h(Icon, { name: 'reply' }),\n '\u56DE\u590D',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('replyAll') },\n h(Icon, { name: 'replyAll' }),\n '\u5168\u90E8\u56DE\u590D',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('forward') },\n h(Icon, { name: 'forward' }),\n '\u8F6C\u53D1',\n ),\n h('span', { className: 'mailharbor-divider' }),\n h(\n 'button',\n { className: 'ghost', onClick: () => onAiAction('summary') },\n h(Icon, { name: 'sparkles', size: 14 }),\n 'AI \u6458\u8981',\n ),\n h('button', { className: 'ghost', onClick: () => onAiAction('reply') }, 'AI \u56DE\u590D'),\n h('button', { className: 'ghost', onClick: () => onAiAction('translate') }, 'AI \u7FFB\u8BD1'),\n h(\n 'button',\n { className: 'ghost', onClick: onExtractTasks },\n h(Icon, { name: 'checklist', size: 14 }),\n '\u63D0\u53D6\u4EFB\u52A1',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: onAddToProject },\n h(Icon, { name: 'folder', size: 14 }),\n '\u52A0\u5165\u9879\u76EE',\n ),\n h('span', { className: 'spacer' }),\n html\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setPlain(!plain) },\n plain ? '\u663E\u793A HTML' : '\u7EAF\u6587\u672C',\n )\n : null,\n remoteImages && !loadImages\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setLoadImages(true) },\n h(Icon, { name: 'image', size: 14 }),\n '\u663E\u793A\u56FE\u7247',\n )\n : null,\n ),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-body' },\n html && !plain\n ? h('iframe', {\n title: '\u90AE\u4EF6\u6B63\u6587',\n sandbox: '',\n srcDoc: srcDoc(detail, loadImages),\n referrerPolicy: 'no-referrer',\n })\n : h('pre', null, detail.text !== '' ? detail.text : '\uFF08\u65E0\u6B63\u6587\uFF09'),\n ),\n detail.attachments.length === 0\n ? null\n : h(\n 'div',\n { className: 'mailharbor-attachments' },\n detail.attachments.map((file) =>\n h(\n 'a',\n {\n className: 'mailharbor-attachment',\n key: file.id,\n href:\n source === 'server'\n ? api.attachmentUrl({\n accountId: detail.accountId,\n source: 'server',\n mailbox,\n uid: detail.uid ?? '',\n part: file.id,\n })\n : api.attachmentUrl({\n accountId: detail.accountId,\n source: 'local',\n emailId: detail.id,\n attachmentId: file.id,\n }),\n download: file.filename,\n title: file.filename,\n },\n h(Icon, { name: 'paperclip', size: 14 }),\n h('span', { className: 'name' }, file.filename),\n h('span', { className: 'muted small' }, formatBytes(file.size)),\n ),\n ),\n ),\n )\n}\n", "/** Cross-panel navigation requests (tasks \u2192 mail). */\nexport interface OpenMailRequest {\n accountId: string\n id: string\n mailbox: string\n}\n\nlet pending: OpenMailRequest | null = null\n\nexport function requestOpenMail(request: OpenMailRequest): void {\n pending = request\n window.dispatchEvent(new CustomEvent('mailharbor:open-mail', { detail: request }))\n}\n\n/** Consume a request queued while the mail panel was unmounted. */\nexport function consumeOpenMail(): OpenMailRequest | null {\n const value = pending\n pending = null\n return value\n}\n", "import { createElement as h, useEffect, useState, type ReactNode } from 'react'\nimport type { Account, AppState, SettingsView } from '../shared/types.js'\nimport { api, ApiError, type AiModels, type AiStatus } from './api.js'\nimport { AddAccountForm } from './account-form.js'\nimport { Avatar, ErrorBar, Field, Toggle } from './components.js'\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nexport function MailSettings(): ReactNode {\n const [state, setState] = useState<AppState | null>(null)\n const [settings, setSettings] = useState<SettingsView | null>(null)\n const [error, setError] = useState('')\n const [toast, setToast] = useState('')\n const [signature, setSignature] = useState('')\n const [markOnOpen, setMarkOnOpen] = useState(true)\n const [pollSeconds, setPollSeconds] = useState(60)\n const [listLimit, setListLimit] = useState(40)\n const [projectRoot, setProjectRoot] = useState('')\n const [aiEnabled, setAiEnabled] = useState(true)\n const [aiProvider, setAiProvider] = useState('deepseek-account')\n const [aiModel, setAiModel] = useState('deepseek-flash')\n const [aiModels, setAiModels] = useState<AiModels>({ providers: [] })\n const [aiStatus, setAiStatus] = useState<AiStatus | null>(null)\n const [styleText, setStyleText] = useState('')\n const [styleMeta, setStyleMeta] = useState({ updatedAt: '', sampleCount: 0 })\n const [styleBusy, setStyleBusy] = useState<'save' | 'learn' | null>(null)\n const [editing, setEditing] = useState<string | null>(null)\n const [checkResults, setCheckResults] = useState<Record<string, string>>({})\n const [adding, setAdding] = useState(false)\n const [tick, setTick] = useState(0)\n\n useEffect(() => {\n let cancelled = false\n Promise.all([api.state(), api.settings()])\n .then(([appState, view]) => {\n if (cancelled) return\n setState(appState)\n setSettings(view)\n setSignature(appState.settings.signature)\n setMarkOnOpen(view.read.markOnOpen)\n setPollSeconds(view.read.pollSeconds)\n setListLimit(view.render.listLimit)\n setProjectRoot(view.projects.root)\n setAiEnabled(view.ai.enabled)\n setAiProvider(view.ai.provider)\n setAiModel(view.ai.model)\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n return () => {\n cancelled = true\n }\n }, [tick])\n\n useEffect(() => {\n let cancelled = false\n const accountId = settings?.activeAccountId ?? state?.activeAccountId ?? null\n if (accountId === null) return\n Promise.all([api.aiStatus(accountId), api.aiModels(), api.aiStyle(accountId)])\n .then(([status, models, style]) => {\n if (cancelled) return\n setAiStatus(status)\n setAiModels(models)\n setStyleText(style.style?.profile ?? '')\n setStyleMeta({\n updatedAt: style.style?.updatedAt ?? '',\n sampleCount: style.style?.sampleCount ?? 0,\n })\n const preferred =\n models.providers.find((item) => item.provider === status.provider) ?? models.providers[0]\n if (preferred !== undefined && status.provider === '') {\n setAiProvider(preferred.provider)\n const firstModel = preferred.models[0]\n if (firstModel !== undefined) setAiModel(firstModel.id)\n }\n })\n .catch(() => {\n // AI status is optional; the panel still works without a model service.\n })\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tick, settings?.activeAccountId])\n\n const reload = (): void => setTick((value) => value + 1)\n\n const notify = (message: string): void => {\n setToast(message)\n window.setTimeout(() => {\n setToast('')\n }, 3000)\n }\n\n const saveGeneral = async (patch: Record<string, unknown>): Promise<void> => {\n try {\n const result = await api.saveSettings(patch)\n setSettings(result.settings)\n notify('\u8BBE\u7F6E\u5DF2\u4FDD\u5B58')\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const account = settings?.accounts.find((item) => item.id === settings.activeAccountId) ?? null\n\n if (state === null || settings === null) {\n return h('div', { className: 'mailharbor mailharbor-settings' }, error === '' ? '\u6B63\u5728\u52A0\u8F7D\u8BBE\u7F6E\u2026' : error)\n }\n\n return h(\n 'div',\n { className: 'mailharbor mailharbor-settings-page' },\n h(\n 'div',\n { className: 'mailharbor-settings' },\n h('h2', null, 'MailHarbor'),\n h('p', { className: 'small muted' }, '\u591A\u8D26\u53F7 IMAP/SMTP \u90AE\u7BB1\u3001\u672C\u5730\u5907\u4EFD\u3001AI \u4E0E\u4EFB\u52A1\u3002\u8BBE\u7F6E\u4F1A\u7ACB\u5373\u751F\u6548\u3002'),\n toast === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-ok)' } }, toast),\n error === '' ? null : h(ErrorBar, { message: error, onDismiss: () => setError('') }),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u8D26\u53F7'),\n settings.accounts.length === 0\n ? h(AddAccountForm, { onDone: () => reload() })\n : settings.accounts.map((item) =>\n h(AccountRow, {\n key: item.id,\n account: item,\n active: item.id === settings.activeAccountId,\n loggedIn: item.id === settings.activeAccountId ? state.loggedIn : undefined,\n editing: editing === item.id,\n checkResult: checkResults[item.id] ?? '',\n onToggleEdit: () => {\n setEditing(editing === item.id ? null : item.id)\n setCheckResults((prev) => ({ ...prev, [item.id]: '' }))\n },\n onActivate: async () => {\n await api.activateAccount(item.id)\n reload()\n },\n onLogin: async (password, remember) => {\n await api.login(item.id, password, remember)\n reload()\n },\n onLogout: async () => {\n await api.logout(item.id)\n reload()\n },\n onCheck: async () => {\n try {\n const result = await api.check(item.id)\n setCheckResults((prev) => ({\n ...prev,\n [item.id]: `IMAP \u6B63\u5E38\uFF08${String(result.imap.mailboxes.length)} \u4E2A\u6587\u4EF6\u5939\uFF09\u00B7 SMTP ${result.smtp.ok ? '\u6B63\u5E38' : `\u5931\u8D25: ${result.smtp.error ?? ''}`}`,\n }))\n } catch (caught) {\n setCheckResults((prev) => ({ ...prev, [item.id]: `\u5931\u8D25: ${errorText(caught)}` }))\n }\n },\n onSave: async (patch) => {\n await api.updateAccount(item.id, patch)\n reload()\n },\n onRemove: async () => {\n if (!window.confirm(`\u79FB\u9664\u8D26\u53F7 ${item.email}\uFF1F\u672C\u5730\u6570\u636E\u76EE\u5F55\u4F1A\u4FDD\u7559\u3002`)) return\n await api.deleteAccount(item.id)\n reload()\n },\n }),\n ),\n adding\n ? h(AddAccountForm, {\n onDone: () => {\n setAdding(false)\n reload()\n },\n onCancel: () => setAdding(false),\n })\n : h('button', { className: 'ghost', onClick: () => setAdding(true) }, '+ \u6DFB\u52A0\u8D26\u53F7'),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u5199\u4FE1\u4E0E\u9605\u8BFB'),\n h(\n Field,\n { label: '\u7B7E\u540D\uFF08\u7EAF\u6587\u672C\uFF0C\u53D1\u9001\u65F6\u8FFD\u52A0\u5230\u6B63\u6587\u672B\u5C3E\uFF09' },\n h('textarea', {\n rows: 4,\n value: signature,\n onChange: (event: { target: { value: string } }) => setSignature(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '10px', alignItems: 'center', flexWrap: 'wrap' } },\n h('button', { className: 'ghost', onClick: () => void saveGeneral({ signature }) }, '\u4FDD\u5B58\u7B7E\u540D'),\n h(Toggle, {\n checked: markOnOpen,\n onChange: (value) => {\n setMarkOnOpen(value)\n void saveGeneral({ read: { markOnOpen: value } })\n },\n label: '\u6253\u5F00\u90AE\u4EF6\u65F6\u6807\u4E3A\u5DF2\u8BFB',\n }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u5217\u8868\u6BCF\u9875\u6570\u91CF' },\n h('input', {\n type: 'number',\n min: 10,\n max: 200,\n value: listLimit,\n onChange: (event: { target: { value: string } }) => setListLimit(Number(event.target.value)),\n onBlur: () => void saveGeneral({ render: { listLimit } }),\n }),\n ),\n h(\n Field,\n { label: '\u672A\u8BFB\u89D2\u6807\u8F6E\u8BE2\uFF08\u79D2\uFF09' },\n h('input', {\n type: 'number',\n min: 15,\n max: 3600,\n value: pollSeconds,\n onChange: (event: { target: { value: string } }) => setPollSeconds(Number(event.target.value)),\n onBlur: () => void saveGeneral({ read: { pollSeconds } }),\n }),\n ),\n ),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u9879\u76EE'),\n h('p', { className: 'small muted' }, '\u4ECE\u90AE\u4EF6\u521B\u5EFA\u9879\u76EE\u65F6\u7684\u9ED8\u8BA4\u76EE\u5F55\uFF1B\u5355\u4E2A\u9879\u76EE\u53EF\u4EE5\u5728\u521B\u5EFA\u65F6\u6539\u3002'),\n h(\n 'div',\n { className: 'mailharbor-grid', style: { gridTemplateColumns: 'minmax(0, 1fr) auto' } },\n h(\n Field,\n { label: '\u9ED8\u8BA4\u9879\u76EE\u76EE\u5F55' },\n h('input', {\n value: projectRoot,\n onChange: (event: { target: { value: string } }) => setProjectRoot(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '6px', alignSelf: 'end' } },\n h(\n 'button',\n {\n className: 'ghost small',\n onClick: () => {\n void api\n .pickDirectory()\n .then((result) => {\n if (result.path !== null) setProjectRoot(result.path)\n })\n .catch((caught: unknown) => setError(errorText(caught)))\n },\n },\n '\u6D4F\u89C8\u2026',\n ),\n h(\n 'button',\n {\n className: 'ghost small',\n onClick: () => void saveGeneral({ projects: { root: projectRoot } }),\n },\n '\u4FDD\u5B58\u76EE\u5F55',\n ),\n ),\n ),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, 'AI'),\n h(Toggle, {\n checked: aiEnabled,\n onChange: (value) => {\n setAiEnabled(value)\n void saveGeneral({ ai: { enabled: value } })\n },\n label: '\u542F\u7528 AI\uFF08\u6458\u8981\u3001AI \u56DE\u590D\u3001\u7FFB\u8BD1\u3001\u5199\u4F5C\u98CE\u683C\uFF09',\n }),\n aiStatus === null\n ? null\n : h(\n 'div',\n { className: 'small', style: { color: aiStatus.available ? 'var(--m-ok)' : 'var(--m-warn)' } },\n aiStatus.available\n ? `\u6A21\u578B\u670D\u52A1\u53EF\u7528 \u00B7 ${aiStatus.provider} / ${aiStatus.model}`\n : (aiStatus.error ?? '\u5F53\u524D DSH \u7EC4\u5408\u6CA1\u6709\u53EF\u7528\u7684\u6A21\u578B\u670D\u52A1'),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: 'Provider' },\n aiModels.providers.length === 0\n ? h('input', {\n value: aiProvider,\n onChange: (event: { target: { value: string } }) => setAiProvider(event.target.value),\n onBlur: () => void saveGeneral({ ai: { provider: aiProvider } }),\n })\n : h(\n 'select',\n {\n value: aiProvider,\n onChange: (event: { target: { value: string } }) => {\n setAiProvider(event.target.value)\n const provider = aiModels.providers.find((item) => item.provider === event.target.value)\n const first = provider?.models[0]\n if (first !== undefined) setAiModel(first.id)\n void saveGeneral({\n ai: {\n provider: event.target.value,\n ...(first === undefined ? {} : { model: first.id }),\n },\n })\n },\n },\n aiModels.providers.map((item) =>\n h('option', { key: item.provider, value: item.provider }, item.name),\n ),\n ),\n ),\n h(\n Field,\n { label: '\u6A21\u578B' },\n (() => {\n const provider = aiModels.providers.find((item) => item.provider === aiProvider)\n return provider === undefined || provider.models.length === 0\n ? h('input', {\n value: aiModel,\n onChange: (event: { target: { value: string } }) => setAiModel(event.target.value),\n onBlur: () => void saveGeneral({ ai: { model: aiModel } }),\n })\n : h(\n 'select',\n {\n value: aiModel,\n onChange: (event: { target: { value: string } }) => {\n setAiModel(event.target.value)\n void saveGeneral({ ai: { model: event.target.value } })\n },\n },\n provider.models.map((item) => h('option', { key: item.id, value: item.id }, item.name)),\n )\n })(),\n ),\n ),\n h('hr', null),\n h(\n 'div',\n { style: { display: 'flex', alignItems: 'center', gap: '8px' } },\n h('strong', { style: { fontSize: '12.5px' } }, '\u5199\u4F5C\u98CE\u683C'),\n h(\n 'span',\n { className: 'small muted' },\n styleMeta.updatedAt === ''\n ? '\u8FD8\u6CA1\u6709\u751F\u6210'\n : `${styleMeta.sampleCount} \u5C01\u5DF2\u53D1\u9001\u90AE\u4EF6 \u00B7 ${new Date(styleMeta.updatedAt).toLocaleString()}`,\n ),\n ),\n h(\n 'p',\n { className: 'small muted' },\n '\u4ECE\u5DF2\u53D1\u9001\u90AE\u4EF6\u5B66\u4E60\u4F60\u7684\u79F0\u547C\u3001\u7ED3\u5C3E\u3001\u8BED\u6C14\u548C\u5E38\u7528\u8868\u8FBE\uFF0CAI \u56DE\u590D\u65F6\u4F1A\u53C2\u8003\u5B83\u3002\u53EA\u4FDD\u5B58\u63D0\u70BC\u540E\u7684\u6863\u6848\uFF0C\u4E0D\u4FDD\u5B58\u90AE\u4EF6\u539F\u6587\u3002',\n ),\n h('textarea', {\n rows: 6,\n value: styleText,\n placeholder: '\u70B9\u300C\u4ECE\u5DF2\u53D1\u9001\u90AE\u4EF6\u5B66\u4E60\u300D\u751F\u6210\uFF0C\u6216\u76F4\u63A5\u5199\u4E00\u6BB5\u4F60\u7684\u5199\u4F5C\u98CE\u683C',\n onChange: (event: { target: { value: string } }) => setStyleText(event.target.value),\n }),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', flexWrap: 'wrap' } },\n h(\n 'button',\n {\n className: 'ghost',\n disabled: styleBusy !== null,\n onClick: () => {\n const accountId = settings.activeAccountId\n if (accountId === null) return\n setStyleBusy('learn')\n setError('')\n api\n .aiLearnStyle(accountId)\n .then((result) => {\n setStyleText(result.style.profile)\n setStyleMeta({ updatedAt: result.style.updatedAt, sampleCount: result.style.sampleCount })\n notify('\u5DF2\u6839\u636E\u5DF2\u53D1\u9001\u90AE\u4EF6\u751F\u6210\u5199\u4F5C\u98CE\u683C')\n })\n .catch((caught: unknown) => setError(errorText(caught)))\n .finally(() => setStyleBusy(null))\n },\n },\n styleBusy === 'learn' ? '\u5B66\u4E60\u4E2D\u2026' : '\u4ECE\u5DF2\u53D1\u9001\u90AE\u4EF6\u5B66\u4E60',\n ),\n h(\n 'button',\n {\n className: 'primary',\n disabled: styleBusy !== null || styleText.trim() === '',\n onClick: () => {\n const accountId = settings.activeAccountId\n if (accountId === null) return\n setStyleBusy('save')\n setError('')\n api\n .aiSaveStyle(accountId, styleText)\n .then((result) => {\n setStyleMeta({ updatedAt: result.style.updatedAt, sampleCount: result.style.sampleCount })\n notify('\u5199\u4F5C\u98CE\u683C\u5DF2\u4FDD\u5B58')\n })\n .catch((caught: unknown) => setError(errorText(caught)))\n .finally(() => setStyleBusy(null))\n },\n },\n '\u4FDD\u5B58\u98CE\u683C',\n ),\n ),\n h(\n 'p',\n { className: 'small muted' },\n 'AI \u8C03\u7528\u8D70 DSH \u81EA\u5DF1\u7684\u6A21\u578B\u670D\u52A1\uFF0C\u4E0D\u989D\u5916\u4FDD\u5B58\u5BC6\u94A5\uFF1B\u53D1\u9001\u4ECD\u7136\u53EA\u7531\u4F60\u786E\u8BA4\u3002',\n ),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u6570\u636E'),\n h(\n 'dl',\n { className: 'mailharbor-kv' },\n h('dt', null, '\u6570\u636E\u76EE\u5F55'),\n h('dd', null, settings.dataDir),\n h('dt', null, '\u914D\u7F6E\u6587\u4EF6'),\n h('dd', null, settings.configFile),\n h('dt', null, '\u5F53\u524D\u8D26\u53F7\u6570\u636E\u5E93'),\n h(\n 'dd',\n null,\n account === null\n ? '\u2014'\n : `${account.dataDir.startsWith('/') ? account.dataDir : `${settings.dataDir}/${account.dataDir}`}/mail.db`,\n ),\n h('dt', null, '\u63D2\u4EF6\u7248\u672C'),\n h('dd', null, state.version),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', flexWrap: 'wrap' } },\n account === null\n ? null\n : h(\n 'button',\n {\n className: 'ghost',\n onClick: async () => {\n try {\n const status = await api.startBackup(account.id)\n notify(status.status.message === '' ? '\u5907\u4EFD\u5DF2\u5F00\u59CB' : status.status.message)\n reload()\n } catch (caught) {\n setError(errorText(caught))\n }\n },\n },\n '\u7ACB\u5373\u5907\u4EFD\u5F53\u524D\u8D26\u53F7',\n ),\n ),\n ),\n ),\n )\n}\n\nfunction AccountRow({\n account,\n active,\n loggedIn,\n editing,\n checkResult,\n onToggleEdit,\n onActivate,\n onLogin,\n onLogout,\n onCheck,\n onSave,\n onRemove,\n}: {\n account: Account\n active: boolean\n loggedIn: boolean | undefined\n editing: boolean\n checkResult: string\n onToggleEdit: () => void\n onActivate: () => Promise<void>\n onLogin: (password: string, remember: boolean) => Promise<void>\n onLogout: () => Promise<void>\n onCheck: () => Promise<void>\n onSave: (patch: Record<string, unknown>) => Promise<void>\n onRemove: () => Promise<void>\n}): ReactNode {\n const [password, setPassword] = useState('')\n const [remember, setRemember] = useState(true)\n const [label, setLabel] = useState(account.label)\n const [username, setUsername] = useState(account.username)\n const [imapHost, setImapHost] = useState(account.imap.host)\n const [imapPort, setImapPort] = useState(String(account.imap.port))\n const [imapSecure, setImapSecure] = useState(account.imap.secure)\n const [smtpHost, setSmtpHost] = useState(account.smtp.host)\n const [smtpPort, setSmtpPort] = useState(String(account.smtp.port))\n const [smtpSecure, setSmtpSecure] = useState(account.smtp.secure)\n const [fromName, setFromName] = useState(account.smtp.fromName)\n const [busy, setBusy] = useState(false)\n const [checking, setChecking] = useState(false)\n\n useEffect(() => {\n setLabel(account.label)\n setUsername(account.username)\n setImapHost(account.imap.host)\n setImapPort(String(account.imap.port))\n setImapSecure(account.imap.secure)\n setSmtpHost(account.smtp.host)\n setSmtpPort(String(account.smtp.port))\n setSmtpSecure(account.smtp.secure)\n setFromName(account.smtp.fromName)\n }, [account])\n\n const wrap = async (operation: () => Promise<void>): Promise<void> => {\n setBusy(true)\n try {\n await operation()\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor-card', style: { background: 'var(--m-bg-1)' } },\n h(\n 'div',\n { className: 'mailharbor-account-row' },\n h(Avatar, { email: account.email, size: 30 }),\n h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', minWidth: 0 } },\n h('strong', null, account.label),\n h('span', { className: 'small muted' }, account.email),\n ),\n active ? h('span', { className: 'badge ok' }, '\u5F53\u524D\u8D26\u53F7') : null,\n loggedIn === false ? h('span', { className: 'badge warn' }, '\u672A\u767B\u5F55') : null,\n h('span', { className: 'spacer' }),\n active\n ? null\n : h('button', { className: 'ghost small', onClick: () => void wrap(onActivate) }, '\u8BBE\u4E3A\u5F53\u524D'),\n h(\n 'button',\n {\n className: 'ghost small',\n disabled: checking,\n onClick: () => {\n setChecking(true)\n void wrap(onCheck).finally(() => setChecking(false))\n },\n },\n checking ? '\u68C0\u67E5\u4E2D\u2026' : '\u68C0\u67E5\u8FDE\u63A5',\n ),\n h('button', { className: 'ghost small', onClick: onToggleEdit }, editing ? '\u6536\u8D77' : '\u7F16\u8F91'),\n ),\n checkResult === ''\n ? null\n : h(\n 'div',\n {\n className: 'mailharbor-check',\n style: { color: checkResult.startsWith('\u5931\u8D25') ? 'var(--m-danger)' : 'var(--m-ok)' },\n },\n checkResult,\n ),\n editing\n ? h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u663E\u793A\u540D\u79F0' },\n h('input', {\n value: label,\n onChange: (event: { target: { value: string } }) => setLabel(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u767B\u5F55\u7528\u6237\u540D' },\n h('input', {\n value: username,\n onChange: (event: { target: { value: string } }) => setUsername(event.target.value),\n }),\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'IMAP \u4E3B\u673A' },\n h('input', {\n value: imapHost,\n onChange: (event: { target: { value: string } }) => setImapHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: imapPort,\n onChange: (event: { target: { value: string } }) => setImapPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: imapSecure, onChange: setImapSecure, label: 'TLS' }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'SMTP \u4E3B\u673A' },\n h('input', {\n value: smtpHost,\n onChange: (event: { target: { value: string } }) => setSmtpHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: smtpPort,\n onChange: (event: { target: { value: string } }) => setSmtpPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: smtpSecure, onChange: setSmtpSecure, label: 'TLS' }),\n ),\n h(\n Field,\n { label: '\u53D1\u4EF6\u4EBA\u540D\u79F0' },\n h('input', {\n value: fromName,\n onChange: (event: { target: { value: string } }) => setFromName(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', alignItems: 'center', flexWrap: 'wrap' } },\n h(\n 'button',\n {\n className: 'primary small',\n disabled: busy,\n onClick: () =>\n void wrap(async () => {\n await onSave({\n label,\n username,\n imap: { host: imapHost, port: Number(imapPort) || 993, secure: imapSecure },\n smtp: { host: smtpHost, port: Number(smtpPort) || 465, secure: smtpSecure, fromName },\n })\n }),\n },\n '\u4FDD\u5B58\u8D26\u53F7',\n ),\n h(\n 'button',\n {\n className: 'ghost small danger',\n onClick: () => void wrap(onRemove),\n },\n '\u79FB\u9664\u8D26\u53F7',\n ),\n ),\n h('hr', { style: { border: 0, borderTop: '1px solid var(--m-line)', width: '100%' } }),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801\uFF08\u4E0D\u5199\u5165\u914D\u7F6E\u6587\u4EF6\uFF09' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', alignItems: 'center' } },\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801' }),\n h(\n 'button',\n {\n className: 'primary small',\n disabled: busy || password === '',\n onClick: () =>\n void wrap(async () => {\n await onLogin(password, remember)\n setPassword('')\n }),\n },\n '\u767B\u5F55',\n ),\n h('button', { className: 'ghost small', onClick: () => void wrap(onLogout) }, '\u9000\u51FA\u767B\u5F55'),\n ),\n )\n : null,\n )\n}\n", "import { createElement as h, useCallback, useEffect, useState, type ReactNode } from 'react'\nimport type { AppState, Project, Task } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { ErrorBar, Modal } from './components.js'\nimport { Icon } from './icons.js'\nimport { requestOpenMail } from './nav.js'\n\ntype Filter = 'all' | 'today' | 'week' | 'overdue'\n\nconst FILTERS: { id: Filter; label: string }[] = [\n { id: 'all', label: '\u5168\u90E8' },\n { id: 'today', label: '\u4ECA\u5929' },\n { id: 'week', label: '\u672C\u5468' },\n { id: 'overdue', label: '\u903E\u671F' },\n]\n\nconst COLUMNS: { status: Task['status']; label: string; hint: string }[] = [\n { status: 'NEEDS-ACTION', label: '\u5F85\u5904\u7406', hint: '\u8FD8\u6CA1\u5F00\u59CB' },\n { status: 'IN-PROCESS', label: '\u8FDB\u884C\u4E2D', hint: '\u6B63\u5728\u505A' },\n { status: 'COMPLETED', label: '\u5DF2\u5B8C\u6210', hint: '\u6536\u5C3E' },\n { status: 'CANCELLED', label: '\u7EC8\u6B62', hint: '\u4E0D\u505A\u4E86' },\n]\n\nconst PRIORITY_LABEL: Record<number, string> = { 0: '\u65E0', 5: '\u4E2D', 9: '\u9AD8' }\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction dateKey(value: Date): string {\n const pad = (n: number): string => String(n).padStart(2, '0')\n return `${String(value.getFullYear())}-${pad(value.getMonth() + 1)}-${pad(value.getDate())}`\n}\n\nfunction weekEnd(): string {\n const now = new Date()\n const end = new Date(now)\n end.setDate(now.getDate() + (7 - ((now.getDay() + 6) % 7)))\n return dateKey(end)\n}\n\nfunction dueText(due: string): string {\n if (due === '') return ''\n const value = due.slice(0, 10)\n const today = dateKey(new Date())\n if (value < today) return `\u903E\u671F ${value}`\n if (value === today) return '\u4ECA\u5929'\n return value\n}\n\nconst EMPTY = {\n title: '',\n notes: '',\n due: '',\n priority: 0,\n status: 'NEEDS-ACTION' as Task['status'],\n owner: '',\n projectId: '',\n}\n\nexport function TasksIcon(): ReactNode {\n const [count, setCount] = useState(0)\n useEffect(() => {\n let cancelled = false\n const load = async (): Promise<void> => {\n try {\n const app = await api.state()\n const accountId = app.settings.activeAccountId\n if (accountId === null) return\n const result = await api.tasks(accountId)\n if (!cancelled) {\n setCount(\n result.items.filter((task) => task.status !== 'COMPLETED' && task.status !== 'CANCELLED').length,\n )\n }\n } catch {\n // A logged-out profile simply shows no badge.\n }\n }\n void load()\n const timer = window.setInterval(() => {\n void load()\n }, 60_000)\n return () => {\n cancelled = true\n window.clearInterval(timer)\n }\n }, [])\n\n return h(\n 'span',\n {\n style: {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '18px',\n height: '18px',\n },\n },\n h(Icon, { name: 'checklist', size: 16 }),\n count > 0\n ? h(\n 'span',\n {\n style: {\n position: 'absolute',\n right: '-5px',\n bottom: '-3px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n minWidth: '13px',\n height: '13px',\n padding: '0 3px',\n borderRadius: '999px',\n background: '#5686fe',\n color: '#fff',\n fontSize: '9px',\n fontWeight: 600,\n lineHeight: '13px',\n boxShadow: '0 0 0 2px var(--dsw-alias-bg-base, #151517)',\n pointerEvents: 'none',\n },\n },\n count > 99 ? '99+' : String(count),\n )\n : null,\n )\n}\n\nexport function TasksPanel(): ReactNode {\n const [state, setState] = useState<AppState | null>(null)\n const [tasks, setTasks] = useState<Task[]>([])\n const [projects, setProjects] = useState<Project[]>([])\n const [filter, setFilter] = useState<Filter>('all')\n const [projectFilter, setProjectFilter] = useState('')\n const [error, setError] = useState('')\n const [toast, setToast] = useState('')\n const [busy, setBusy] = useState(false)\n const [editing, setEditing] = useState<Task | null>(null)\n const [creating, setCreating] = useState<Task['status'] | null>(null)\n const [dragging, setDragging] = useState<string | null>(null)\n const [tick, setTick] = useState(0)\n\n const accountId = state?.settings.activeAccountId ?? null\n\n useEffect(() => {\n api\n .state()\n .then(setState)\n .catch((caught: unknown) => setError(errorText(caught)))\n }, [tick])\n\n useEffect(() => {\n if (accountId === null) return\n let cancelled = false\n Promise.all([api.tasks(accountId), api.projects()])\n .then(([list, projectList]) => {\n if (cancelled) return\n setTasks(list.items)\n setProjects(projectList.items)\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n return () => {\n cancelled = true\n }\n }, [accountId, tick])\n\n const refresh = useCallback((): void => {\n setTick((value) => value + 1)\n }, [])\n\n const notify = (message: string): void => {\n setToast(message)\n window.setTimeout(() => {\n setToast('')\n }, 3000)\n }\n\n const matchesFilter = useCallback(\n (task: Task): boolean => {\n const today = dateKey(new Date())\n const end = weekEnd()\n if (filter === 'overdue') return task.due !== '' && task.due.slice(0, 10) < today\n if (filter === 'today') return task.due.slice(0, 10) === today\n if (filter === 'week') return task.due !== '' && task.due.slice(0, 10) <= end\n return true\n },\n [filter],\n )\n\n const switchAccount = async (id: string): Promise<void> => {\n try {\n await api.activateAccount(id)\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const move = async (task: Task, status: Task['status']): Promise<void> => {\n if (task.status === status) return\n try {\n const { task: updated } = await api.updateTask(task.id, { status })\n setTasks((current) => current.map((item) => (item.id === task.id ? updated : item)))\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const remove = async (task: Task): Promise<void> => {\n try {\n await api.deleteTask(task.id)\n setTasks((current) => current.filter((item) => item.id !== task.id))\n notify('\u4EFB\u52A1\u5DF2\u5220\u9664')\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const openSource = async (task: Task): Promise<void> => {\n if (task.messageKey === '') return\n try {\n const found = await api.lookupMessage(task.accountId, task.messageKey)\n requestOpenMail({ accountId: task.accountId, id: found.id, mailbox: found.mailbox })\n document.querySelector<HTMLElement>('button[aria-label=\"MailHarbor\"]')?.click()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const save = async (draft: typeof EMPTY & { id?: string }): Promise<void> => {\n if (accountId === null) return\n setBusy(true)\n setError('')\n try {\n if (draft.id === undefined) {\n await api.createTask({\n accountId,\n title: draft.title,\n notes: draft.notes,\n due: draft.due,\n priority: draft.priority,\n status: draft.status,\n owner: draft.owner,\n projectId: draft.projectId === '' ? null : draft.projectId,\n })\n } else {\n await api.updateTask(draft.id, {\n title: draft.title,\n notes: draft.notes,\n due: draft.due,\n priority: draft.priority,\n status: draft.status,\n owner: draft.owner,\n projectId: draft.projectId === '' ? null : draft.projectId,\n })\n }\n setEditing(null)\n setCreating(null)\n notify('\u4EFB\u52A1\u5DF2\u4FDD\u5B58')\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor mailharbor-tasks' },\n h(\n 'div',\n { className: 'mailharbor-topbar' },\n h(Icon, { name: 'checklist', size: 16 }),\n h('strong', { style: { fontSize: '13px' } }, '\u4EFB\u52A1'),\n state === null || state.accounts.length < 2\n ? null\n : h(\n 'select',\n {\n value: accountId ?? '',\n onChange: (event: { target: { value: string } }) => void switchAccount(event.target.value),\n 'aria-label': '\u8D26\u53F7',\n },\n state.accounts.map((account) =>\n h('option', { key: account.id, value: account.id }, account.label),\n ),\n ),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n { className: 'primary', onClick: () => setCreating('NEEDS-ACTION') },\n h(Icon, { name: 'plus' }),\n '\u65B0\u5EFA\u4EFB\u52A1',\n ),\n ),\n toast === ''\n ? null\n : h('div', { className: 'small', style: { padding: '6px 18px', color: 'var(--m-ok)' } }, toast),\n error === '' ? null : h(ErrorBar, { message: error, onDismiss: () => setError('') }),\n h(\n 'div',\n { className: 'tasks-board-wrap' },\n h(\n 'div',\n { className: 'tasks-toolbar' },\n h(\n 'div',\n { className: 'tasks-filters' },\n FILTERS.map((item) =>\n h(\n 'button',\n {\n key: item.id,\n className: filter === item.id ? 'chip active' : 'chip',\n onClick: () => setFilter(item.id),\n },\n item.label,\n ),\n ),\n ),\n h('span', { className: 'spacer' }),\n h(\n 'select',\n {\n value: projectFilter,\n onChange: (event: { target: { value: string } }) => setProjectFilter(event.target.value),\n 'aria-label': '\u6309\u9879\u76EE\u7B5B\u9009',\n },\n h('option', { value: '' }, '\u5168\u90E8\u9879\u76EE'),\n projects.map((project) => h('option', { key: project.id, value: project.id }, project.name)),\n ),\n h('span', { className: 'small muted' }, '\u62D6\u52A8\u5361\u7247\u53EF\u6539\u53D8\u72B6\u6001'),\n ),\n h(\n 'div',\n { className: 'tasks-board' },\n COLUMNS.map((column) => {\n const cards = tasks\n .filter((task) => task.status === column.status)\n .filter(matchesFilter)\n .filter((task) => projectFilter === '' || task.projectId === projectFilter)\n .sort((left, right) => {\n const leftDue = left.due === '' ? '9999' : left.due.slice(0, 10)\n const rightDue = right.due === '' ? '9999' : right.due.slice(0, 10)\n return leftDue.localeCompare(rightDue)\n })\n return h(\n 'div',\n {\n key: column.status,\n className: `task-column task-column-${column.status}`,\n onDragOver: (event: { preventDefault: () => void }) => {\n event.preventDefault()\n },\n onDrop: (event: { preventDefault: () => void }) => {\n event.preventDefault()\n const task = tasks.find((item) => item.id === dragging)\n if (task !== undefined) void move(task, column.status)\n setDragging(null)\n },\n },\n h(\n 'div',\n { className: 'task-column-head' },\n h('span', { className: `task-dot ${column.status}` }),\n h('strong', null, column.label),\n h('span', { className: 'task-column-count' }, String(cards.length)),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n {\n className: 'subtle icon',\n title: `\u5728\u300C${column.label}\u300D\u4E2D\u65B0\u5EFA`,\n onClick: () => setCreating(column.status),\n },\n h(Icon, { name: 'plus', size: 14 }),\n ),\n ),\n h(\n 'div',\n { className: 'task-column-body' },\n cards.length === 0\n ? h('div', { className: 'task-column-empty' }, column.hint)\n : cards.map((task) =>\n h(\n 'article',\n {\n key: task.id,\n className: `task-card${dragging === task.id ? ' dragging' : ''}`,\n draggable: true,\n onDragStart: () => setDragging(task.id),\n onDragEnd: () => setDragging(null),\n onClick: () => setEditing(task),\n },\n h(\n 'div',\n { className: 'task-card-top' },\n h('span', { className: `task-priority p${String(task.priority)}` }),\n h('span', { className: 'task-card-title' }, task.title),\n h(\n 'button',\n {\n className: 'task-card-delete',\n title: '\u5220\u9664\u4EFB\u52A1',\n onClick: (event: { stopPropagation: () => void }) => {\n event.stopPropagation()\n void remove(task)\n },\n },\n h(Icon, { name: 'close', size: 12 }),\n ),\n ),\n task.notes === '' ? null : h('p', { className: 'task-card-notes' }, task.notes),\n h(\n 'div',\n { className: 'task-card-meta' },\n task.due === ''\n ? null\n : h(\n 'span',\n {\n className:\n task.due.slice(0, 10) < dateKey(new Date()) && task.status !== 'COMPLETED'\n ? 'task-due overdue'\n : 'task-due',\n },\n h(Icon, { name: 'calendar', size: 12 }),\n dueText(task.due),\n ),\n task.owner === '' ? null : h('span', { className: 'task-owner' }, task.owner),\n task.projectId === null\n ? null\n : h(\n 'span',\n { className: 'task-project' },\n projects.find((project) => project.id === task.projectId)?.name ?? '\u9879\u76EE',\n ),\n task.priority > 0\n ? h(\n 'span',\n { className: 'task-priority-label' },\n `\u4F18\u5148\u7EA7 ${PRIORITY_LABEL[task.priority] ?? String(task.priority)}`,\n )\n : null,\n ),\n task.messageKey === ''\n ? null\n : h(\n 'button',\n {\n className: 'task-source',\n onClick: (event: { stopPropagation: () => void }) => {\n event.stopPropagation()\n void openSource(task)\n },\n },\n h(Icon, { name: 'mail', size: 12 }),\n '\u6765\u6E90\u90AE\u4EF6',\n ),\n ),\n ),\n ),\n )\n }),\n ),\n ),\n creating !== null || editing !== null\n ? h(TaskEditor, {\n task: editing,\n status: creating ?? 'NEEDS-ACTION',\n projects,\n busy,\n onClose: () => {\n setCreating(null)\n setEditing(null)\n },\n onSave: (draft) => void save(draft),\n })\n : null,\n )\n}\n\nfunction TaskEditor({\n task,\n status,\n projects,\n busy,\n onClose,\n onSave,\n}: {\n task: Task | null\n status: Task['status']\n projects: Project[]\n busy: boolean\n onClose: () => void\n onSave: (draft: typeof EMPTY & { id?: string }) => void\n}): ReactNode {\n const [draft, setDraft] = useState({\n ...EMPTY,\n status,\n ...(task === null\n ? {}\n : {\n id: task.id,\n title: task.title,\n notes: task.notes,\n due: task.due.slice(0, 10),\n priority: task.priority,\n status: task.status,\n owner: task.owner,\n projectId: task.projectId ?? '',\n }),\n })\n const set = (patch: Partial<typeof draft>): void => setDraft((current) => ({ ...current, ...patch }))\n\n return h(\n Modal,\n {\n title: task === null ? '\u65B0\u5EFA\u4EFB\u52A1' : '\u7F16\u8F91\u4EFB\u52A1',\n onClose,\n wide: true,\n footer: h(\n 'div',\n { className: 'task-editor-foot' },\n h('span', { className: 'small muted' }, '\u63D0\u793A\uFF1A\u4EFB\u52A1\u4F1A\u4FDD\u5B58\u5728\u672C\u5730\uFF0C\u53EF\u5728\u770B\u677F\u4E2D\u62D6\u52A8\u6539\u53D8\u72B6\u6001\u3002'),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: onClose }, '\u53D6\u6D88'),\n h(\n 'button',\n {\n className: 'primary',\n disabled: busy || draft.title.trim() === '',\n onClick: () => onSave(draft),\n },\n busy ? '\u4FDD\u5B58\u4E2D\u2026' : '\u4FDD\u5B58\u4EFB\u52A1',\n ),\n ),\n },\n h(\n 'div',\n { className: 'task-editor' },\n h(\n 'div',\n { className: 'task-editor-main' },\n h(\n 'div',\n { className: 'task-editor-title' },\n h('input', {\n value: draft.title,\n autoFocus: true,\n placeholder: '\u8981\u505A\u4EC0\u4E48\uFF1F',\n onChange: (event: { target: { value: string } }) => set({ title: event.target.value }),\n }),\n ),\n h(\n 'div',\n { className: 'task-editor-section' },\n h('label', null, '\u5907\u6CE8'),\n h('textarea', {\n rows: 5,\n value: draft.notes,\n placeholder: '\u80CC\u666F\u3001\u4E0B\u4E00\u6B65\u3001\u94FE\u63A5\u2026',\n onChange: (event: { target: { value: string } }) => set({ notes: event.target.value }),\n }),\n ),\n h(\n 'div',\n { className: 'task-editor-section' },\n h('label', null, '\u6765\u6E90'),\n draft.id === undefined\n ? h('span', { className: 'small muted' }, '\u4ECE\u90AE\u4EF6\u63D0\u53D6\u7684\u4EFB\u52A1\u4F1A\u81EA\u52A8\u5173\u8054\u6765\u6E90\u90AE\u4EF6\u3002')\n : h(\n 'span',\n { className: 'small muted' },\n task?.messageSubject !== undefined && task.messageSubject !== ''\n ? `\u6765\u81EA\u90AE\u4EF6\uFF1A${task.messageSubject}`\n : '\u65E0\u5173\u8054\u90AE\u4EF6',\n ),\n ),\n ),\n h(\n 'aside',\n { className: 'task-editor-side' },\n h(\n 'div',\n { className: 'task-editor-field' },\n h('label', null, '\u72B6\u6001'),\n h(\n 'select',\n {\n value: draft.status,\n onChange: (event: { target: { value: string } }) =>\n set({ status: event.target.value as Task['status'] }),\n },\n COLUMNS.map((column) => h('option', { key: column.status, value: column.status }, column.label)),\n ),\n ),\n h(\n 'div',\n { className: 'task-editor-field' },\n h('label', null, '\u622A\u6B62\u65E5\u671F'),\n h('input', {\n type: 'date',\n value: draft.due,\n onChange: (event: { target: { value: string } }) => set({ due: event.target.value }),\n }),\n ),\n h(\n 'div',\n { className: 'task-editor-field' },\n h('label', null, '\u4F18\u5148\u7EA7'),\n h(\n 'div',\n { className: 'task-priority-picker' },\n [0, 5, 9].map((value) =>\n h(\n 'button',\n {\n key: value,\n className: draft.priority === value ? 'active' : '',\n onClick: () => set({ priority: value }),\n },\n PRIORITY_LABEL[value] ?? String(value),\n ),\n ),\n ),\n ),\n h(\n 'div',\n { className: 'task-editor-field' },\n h('label', null, '\u9879\u76EE'),\n h(\n 'select',\n {\n value: draft.projectId,\n onChange: (event: { target: { value: string } }) => set({ projectId: event.target.value }),\n },\n h('option', { value: '' }, '\u65E0\u9879\u76EE'),\n projects.map((project) => h('option', { key: project.id, value: project.id }, project.name)),\n ),\n ),\n h(\n 'div',\n { className: 'task-editor-field' },\n h('label', null, '\u8D1F\u8D23\u4EBA'),\n h('input', {\n value: draft.owner,\n placeholder: '\u53EF\u9009',\n onChange: (event: { target: { value: string } }) => set({ owner: event.target.value }),\n }),\n ),\n ),\n ),\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import styles from './styles.css'\nimport { MailIcon } from './icon.js'\nimport { MailPanel } from './panel.js'\nimport { MailSettings } from './settings.js'\nimport { TasksIcon, TasksPanel } from './tasks-panel.js'\nimport type { ClientContext } from './dsh.js'\n\n/** Keep in sync with package.json (`npm run version` does this). */\nexport const VERSION = '0.7.2'\n\n/** Services required by this browser plugin. */\nexport const inject = ['slots']\n\nconst PANEL_ID = 'mailharbor'\nconst TASKS_PANEL_ID = 'mailharbor-tasks'\nconst STYLE_ID = 'mailharbor-style'\n\nfunction ensureStyles(): void {\n if (document.getElementById(STYLE_ID) !== null) return\n const element = document.createElement('style')\n element.id = STYLE_ID\n element.textContent = styles\n document.head.append(element)\n}\n\n/**\n * MailHarbor browser half: a sidebar panel, the panel page in the main slot,\n * and a settings section. All three read the same same-origin HTTP API.\n */\nexport function apply(ctx: ClientContext): void {\n ensureStyles()\n ctx.slots.inject('main', () => ctx.slots.register({ name: 'main', key: PANEL_ID }, MailPanel))\n ctx.slots.inject('settings.section', () =>\n ctx.slots.register(\n {\n name: 'settings.section',\n id: PANEL_ID,\n order: 35,\n label: () => 'MailHarbor',\n },\n MailSettings,\n ),\n )\n ctx.slots.inject('sidebar.panellist', () =>\n ctx.slots.register(\n {\n name: 'sidebar.panellist',\n id: PANEL_ID,\n order: 20,\n label: 'MailHarbor',\n },\n MailIcon,\n ),\n )\n ctx.slots.inject('main', () => ctx.slots.register({ name: 'main', key: TASKS_PANEL_ID }, TasksPanel))\n ctx.slots.inject('sidebar.panellist', () =>\n ctx.slots.register(\n {\n name: 'sidebar.panellist',\n id: TASKS_PANEL_ID,\n order: 21,\n label: '\u4EFB\u52A1',\n },\n TasksIcon,\n ),\n )\n}\n\nexport { PANEL_ID, TASKS_PANEL_ID }\n", "/* MailHarbor panel + settings.\n Tokens come from the DSH shell (dark by default); fallbacks match the\n default dark theme so the panel also renders in a bare host page.\n Component rules are all scoped under `.mailharbor` and the generic element\n reset lives in `:where()` so it cannot outrank a component class. */\n\n.mailharbor {\n --m-bg: var(--dsw-alias-bg-base, #151517);\n --m-bg-1: var(--dsw-alias-bg-layer-1, #232324);\n --m-bg-2: var(--dsw-alias-bg-layer-2, #2c2c2e);\n --m-bg-3: var(--dsw-alias-bg-layer-3, #353638);\n --m-line: var(--dsw-alias-border-l2, #ffffff1f);\n --m-line-soft: var(--dsw-alias-border-l1, #ffffff0f);\n --m-line-strong: var(--dsw-alias-border-l3, #ffffff29);\n --m-text: var(--dsw-alias-label-primary, #f9fafb);\n --m-text-2: var(--dsw-alias-label-secondary, #cfd3d6);\n --m-text-3: var(--dsw-alias-label-tertiary, #adb2b8);\n --m-caption: var(--dsw-alias-label-caption, #81858c);\n --m-accent: #5686fe;\n --m-accent-soft: rgba(86, 134, 254, 0.14);\n --m-primary-bg: var(--dsw-alias-brand-primary, #f9fafb);\n --m-primary-fg: var(--dsw-alias-label-primary-foreground, #0f1115);\n --m-hover: var(--dsw-alias-interactive-bg-hover, #ffffff14);\n --m-danger: #f25a5a;\n --m-ok: #3fbf7f;\n --m-warn: var(--dsw-alias-state-warn-label, #dd8629);\n --m-radius: 8px;\n --m-shadow: 0 18px 60px rgba(0, 0, 0, 0.5);\n\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--m-bg);\n color: var(--m-text);\n font-size: 13px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n}\n\n.mailharbor *,\n.mailharbor *::before,\n.mailharbor *::after {\n box-sizing: border-box;\n}\n\n/* ---------- base controls ---------- */\n\n.mailharbor :where(button) {\n font: inherit;\n color: inherit;\n background: transparent;\n border: 0;\n margin: 0;\n cursor: pointer;\n}\n\n.mailharbor button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 30px;\n padding: 0 12px;\n border-radius: var(--m-radius);\n border: 1px solid transparent;\n color: var(--m-text-2);\n font-size: 12.5px;\n font-weight: 500;\n white-space: nowrap;\n transition:\n background 120ms ease,\n color 120ms ease,\n border-color 120ms ease;\n}\n\n.mailharbor button:hover:not(:disabled) {\n background: var(--m-hover);\n color: var(--m-text);\n}\n\n.mailharbor button:disabled {\n opacity: 0.45;\n cursor: default;\n}\n\n.mailharbor button.primary {\n background: var(--m-primary-bg);\n color: var(--m-primary-fg);\n border-color: transparent;\n}\n\n.mailharbor button.primary:hover:not(:disabled) {\n background: var(--m-primary-bg);\n filter: brightness(0.94);\n color: var(--m-primary-fg);\n}\n\n.mailharbor button.ghost {\n border-color: var(--m-line);\n color: var(--m-text-2);\n}\n\n.mailharbor button.ghost:hover:not(:disabled) {\n border-color: var(--m-line-strong);\n color: var(--m-text);\n}\n\n.mailharbor button.subtle {\n color: var(--m-text-3);\n padding: 0 8px;\n}\n\n.mailharbor button.icon {\n width: 30px;\n padding: 0;\n}\n\n.mailharbor button.danger {\n color: var(--m-danger);\n}\n\n.mailharbor input,\n.mailharbor select,\n.mailharbor textarea {\n font: inherit;\n color: var(--m-text);\n background: var(--m-bg-1);\n border: 1px solid var(--m-line);\n border-radius: var(--m-radius);\n padding: 0 10px;\n height: 32px;\n min-width: 0;\n}\n\n.mailharbor textarea {\n height: auto;\n padding: 8px 10px;\n resize: vertical;\n line-height: 1.6;\n}\n\n.mailharbor select {\n padding-right: 26px;\n appearance: none;\n background-image:\n linear-gradient(45deg, transparent 50%, var(--m-text-3) 50%),\n linear-gradient(135deg, var(--m-text-3) 50%, transparent 50%);\n background-position:\n calc(100% - 15px) 14px,\n calc(100% - 10px) 14px;\n background-size:\n 5px 5px,\n 5px 5px;\n background-repeat: no-repeat;\n}\n\n.mailharbor ::placeholder {\n color: var(--m-caption);\n}\n\n.mailharbor input:focus-visible,\n.mailharbor select:focus-visible,\n.mailharbor textarea:focus-visible,\n.mailharbor button:focus-visible,\n.mailharbor [contenteditable='true']:focus-visible {\n outline: 2px solid rgba(86, 134, 254, 0.55);\n outline-offset: -1px;\n}\n\n.mailharbor .spacer {\n flex: 1;\n}\n\n.mailharbor .muted {\n color: var(--m-text-3);\n}\n\n.mailharbor .small {\n font-size: 12px;\n}\n\n.mailharbor .badge {\n display: inline-flex;\n align-items: center;\n height: 18px;\n padding: 0 6px;\n border-radius: 999px;\n font-size: 10.5px;\n font-weight: 500;\n background: var(--m-bg-3);\n color: var(--m-text-2);\n}\n\n.mailharbor .badge.ok {\n background: rgba(63, 191, 127, 0.16);\n color: var(--m-ok);\n}\n\n.mailharbor .badge.warn {\n background: rgba(221, 134, 41, 0.16);\n color: var(--m-warn);\n}\n\n.mailharbor .error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n color: var(--m-danger);\n background: rgba(242, 90, 90, 0.1);\n border-bottom: 1px solid rgba(242, 90, 90, 0.2);\n font-size: 12.5px;\n}\n\n/* ---------- shell ---------- */\n\n.mailharbor-topbar {\n display: flex;\n align-items: center;\n gap: 10px;\n height: 52px;\n padding: 0 14px;\n border-bottom: 1px solid var(--m-line-soft);\n background: var(--m-bg);\n flex: none;\n}\n\n.mailharbor-account {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n max-width: 220px;\n padding: 4px 8px 4px 4px;\n border-radius: 999px;\n border: 1px solid transparent;\n cursor: default;\n}\n\n.mailharbor-account:hover {\n background: var(--m-hover);\n}\n\n.mailharbor-account .name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.mailharbor-account select {\n height: 26px;\n background: transparent;\n border-color: transparent;\n font-weight: 500;\n}\n\n.mailharbor-body {\n display: flex;\n flex: 1;\n min-height: 0;\n position: relative;\n}\n\n.mailharbor button.active {\n background: var(--m-accent-soft);\n color: var(--m-text);\n}\n\n.mailharbor-list {\n display: flex;\n flex-direction: column;\n width: 360px;\n flex: none;\n border-right: 1px solid var(--m-line-soft);\n min-height: 0;\n}\n\n.mailharbor-reader {\n flex: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n@media (max-width: 1000px) {\n .mailharbor-list {\n width: 300px;\n }\n}\n\n.mailharbor-narrow .mailharbor-body[data-mode='reader'] .mailharbor-list {\n display: none;\n}\n\n.mailharbor-narrow .mailharbor-body[data-mode='list'] .mailharbor-reader {\n display: none;\n}\n\n/* ---------- segmented control ---------- */\n\n.mailharbor-segment {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 2px;\n border-radius: 9px;\n background: var(--m-bg-2);\n}\n\n.mailharbor-segment button {\n height: 26px;\n padding: 0 12px;\n border-radius: 7px;\n color: var(--m-text-3);\n font-size: 12px;\n}\n\n.mailharbor-segment button:hover:not(.active) {\n color: var(--m-text-2);\n background: transparent;\n}\n\n.mailharbor-segment button.active {\n background: var(--m-bg-3);\n color: var(--m-text);\n}\n\n/* ---------- list ---------- */\n\n.mailharbor-filters {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-filters select {\n width: 128px;\n flex: none;\n font-size: 12px;\n}\n\n.mailharbor-filters input[type='search'] {\n flex: 1;\n height: 30px;\n font-size: 12.5px;\n}\n\n.mailharbor-rows {\n flex: 1;\n overflow: auto;\n min-height: 0;\n}\n\n.mailharbor-row {\n display: flex;\n flex-direction: column;\n gap: 3px;\n width: 100%;\n padding: 10px 14px;\n border: 0;\n border-bottom: 1px solid var(--m-line-soft);\n border-left: 2px solid transparent;\n border-radius: 0;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n user-select: none;\n}\n\n.mailharbor-row:hover {\n background: var(--m-hover);\n}\n\n.mailharbor-row.selected {\n background: var(--m-accent-soft);\n border-left-color: var(--m-accent);\n}\n\n.mailharbor-row .line-1,\n.mailharbor-row .line-2 {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n width: 100%;\n}\n\n.mailharbor-row .from {\n font-weight: 600;\n font-size: 12.5px;\n color: var(--m-text-2);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mailharbor-row .date {\n margin-left: auto;\n color: var(--m-caption);\n font-size: 11px;\n flex: none;\n}\n\n.mailharbor-row .subject {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--m-text-2);\n font-size: 12.5px;\n}\n\n.mailharbor-row .snippet {\n color: var(--m-caption);\n font-size: 11.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n}\n\n.mailharbor-row.unread .from,\n.mailharbor-row.unread .subject {\n color: var(--m-text);\n}\n\n.mailharbor-row .dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--m-accent);\n flex: none;\n}\n\n.mailharbor-row .paperclip {\n color: var(--m-caption);\n flex: none;\n display: inline-flex;\n}\n\n.mailharbor-list-foot {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-top: 1px solid var(--m-line-soft);\n color: var(--m-text-3);\n font-size: 11.5px;\n flex: none;\n}\n\n.mailharbor-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 48px 24px;\n color: var(--m-text-3);\n text-align: center;\n}\n\n.mailharbor-empty svg {\n opacity: 0.5;\n}\n\n.mailharbor-empty .title {\n color: var(--m-text-2);\n font-size: 13px;\n font-weight: 500;\n}\n\n/* ---------- reader ---------- */\n\n.mailharbor-reader-head {\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.mailharbor-reader-title {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.mailharbor-reader-title h2 {\n margin: 0;\n font-size: 17px;\n line-height: 1.35;\n font-weight: 600;\n letter-spacing: -0.01em;\n word-break: break-word;\n}\n\n.mailharbor-reader-meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px 10px;\n color: var(--m-text-3);\n font-size: 12px;\n}\n\n.mailharbor-reader-meta .who {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: var(--m-text-2);\n}\n\n.mailharbor-reader-meta .who strong {\n color: var(--m-text);\n font-weight: 600;\n}\n\n.mailharbor-reader-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.mailharbor-reader-body {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n padding: 14px 18px 18px;\n background: var(--m-bg-2);\n}\n\n.mailharbor-reader-body iframe {\n flex: 1;\n width: 100%;\n border: 0;\n border-radius: 10px;\n background: #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n}\n\n.mailharbor-reader-body pre {\n flex: 1;\n overflow: auto;\n margin: 0;\n padding: 20px 22px;\n white-space: pre-wrap;\n word-break: break-word;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n color: #171a21;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12.5px;\n line-height: 1.7;\n}\n\n.mailharbor-attachments {\n padding: 10px 18px;\n border-top: 1px solid var(--m-line-soft);\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n flex: none;\n background: var(--m-bg);\n}\n\n.mailharbor-attachment {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n height: 30px;\n padding: 0 10px;\n border: 1px solid var(--m-line);\n border-radius: var(--m-radius);\n font-size: 12px;\n text-decoration: none;\n color: var(--m-text-2);\n max-width: 260px;\n background: var(--m-bg-1);\n}\n\n.mailharbor-attachment:hover {\n border-color: var(--m-line-strong);\n color: var(--m-text);\n}\n\n.mailharbor-attachment .name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ---------- AI rail ---------- */\n\n.mailharbor-ai {\n display: flex;\n flex-direction: column;\n width: 340px;\n flex: none;\n min-height: 0;\n border-left: 1px solid var(--m-line-soft);\n background: var(--m-bg);\n}\n\n.mailharbor-ai-head {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 46px;\n padding: 0 8px 0 14px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-ai-head strong {\n font-size: 13px;\n font-weight: 600;\n}\n\n.mailharbor-ai-confirm {\n display: inline-flex;\n gap: 2px;\n}\n\n.mailharbor-ai-context {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 9px 14px 10px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-ai-context strong {\n font-size: 12.5px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mailharbor-ai-warn {\n padding: 8px 14px;\n color: var(--m-warn);\n background: rgba(221, 134, 41, 0.1);\n font-size: 12px;\n flex: none;\n}\n\n.mailharbor-ai-quick {\n display: flex;\n gap: 6px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-ai-quick button {\n flex: 1;\n padding: 0 6px;\n}\n\n.mailharbor-ai-list {\n flex: 1;\n min-height: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px 14px;\n}\n\n.mailharbor-ai-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 30px 12px;\n text-align: center;\n color: var(--m-text-3);\n}\n\n.mailharbor-ai-empty .title {\n color: var(--m-text-2);\n font-weight: 500;\n font-size: 12.5px;\n}\n\n.mailharbor-ai-card {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--m-line-soft);\n border-radius: 10px;\n background: var(--m-bg-1);\n overflow: hidden;\n}\n\n.mailharbor-ai-card.generating {\n opacity: 0.7;\n}\n\n.mailharbor-ai-card-head {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 8px 7px 12px;\n border-bottom: 1px solid var(--m-line-soft);\n font-size: 11.5px;\n color: var(--m-text-3);\n}\n\n.mailharbor-ai-card-head > span:first-child {\n color: var(--m-text-2);\n font-weight: 600;\n}\n\n.mailharbor-ai-summary {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 10px 12px;\n}\n\n.mailharbor-ai-summary section h4 {\n margin: 0 0 3px;\n font-size: 11px;\n color: var(--m-text-3);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.mailharbor-ai-summary section p {\n margin: 0;\n white-space: pre-wrap;\n font-size: 12.5px;\n line-height: 1.65;\n color: var(--m-text);\n}\n\n.mailharbor-ai-text {\n padding: 10px 12px;\n max-height: 320px;\n overflow: auto;\n white-space: pre-wrap;\n font-size: 12.5px;\n line-height: 1.65;\n color: var(--m-text);\n}\n\n.mailharbor-ai-card-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n padding: 6px 8px;\n border-top: 1px solid var(--m-line-soft);\n}\n\n.mailharbor-ai-card-actions button {\n height: 26px;\n padding: 0 8px;\n font-size: 11.5px;\n}\n\n.mailharbor-ai-ask {\n display: flex;\n gap: 6px;\n padding: 10px 12px;\n border-top: 1px solid var(--m-line-soft);\n flex: none;\n}\n\n.mailharbor-ai-ask input {\n flex: 1;\n height: 32px;\n}\n\n.mailharbor-ai-error {\n color: var(--m-danger);\n font-size: 12px;\n padding: 0 2px;\n}\n\n@media (max-width: 1280px) {\n .mailharbor-ai {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: min(420px, 94%);\n z-index: 6;\n border-left: 1px solid var(--m-line);\n box-shadow: -12px 0 40px rgba(0, 0, 0, 0.45);\n }\n}\n\n/* ---------- AI summary ---------- */\n\n.mailharbor-divider {\n width: 1px;\n height: 18px;\n margin: 0 4px;\n background: var(--m-line);\n}\n\n.mailharbor-summary {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.mailharbor-summary section h4 {\n margin: 0 0 6px;\n font-size: 11.5px;\n font-weight: 600;\n color: var(--m-text-3);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n.mailharbor-summary section p {\n margin: 0;\n white-space: pre-wrap;\n line-height: 1.75;\n color: var(--m-text);\n}\n\n/* ---------- modal / forms ---------- */\n\n.mailharbor-portal {\n position: fixed;\n inset: 0;\n z-index: 80;\n height: auto;\n background: transparent;\n pointer-events: none;\n}\n\n.mailharbor-portal .mailharbor-modal-mask {\n pointer-events: auto;\n}\n\n.mailharbor-modal-mask {\n position: fixed;\n inset: 0;\n z-index: 60;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: rgba(0, 0, 0, 0.55);\n backdrop-filter: blur(2px);\n}\n\n.mailharbor-modal {\n display: flex;\n flex-direction: column;\n width: min(720px, 100%);\n max-height: 86vh;\n overflow: hidden;\n border: 1px solid var(--m-line);\n border-radius: 14px;\n background: var(--m-bg-1);\n color: var(--m-text);\n box-shadow: var(--m-shadow);\n}\n\n.mailharbor-modal > header {\n display: flex;\n align-items: center;\n gap: 8px;\n height: 52px;\n padding: 0 14px 0 18px;\n border-bottom: 1px solid var(--m-line-soft);\n font-size: 14px;\n font-weight: 600;\n}\n\n.mailharbor-modal .content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 18px;\n overflow: auto;\n}\n\n.mailharbor-modal > footer {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 18px;\n border-top: 1px solid var(--m-line-soft);\n}\n\n.mailharbor-field {\n display: flex;\n flex-direction: column;\n gap: 5px;\n min-width: 0;\n}\n\n.mailharbor-field > input,\n.mailharbor-field > select,\n.mailharbor-field > textarea,\n.mailharbor-card > textarea {\n width: 100%;\n min-width: 0;\n}\n\n.mailharbor-field > label {\n font-size: 11.5px;\n color: var(--m-text-3);\n}\n\n.mailharbor-grid {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n gap: 10px;\n min-width: 0;\n}\n\n.mailharbor-grid.three {\n grid-template-columns: minmax(0, 2fr) minmax(72px, 90px) auto;\n align-items: end;\n min-width: 0;\n}\n\n.mailharbor-toggle {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n color: var(--m-text-2);\n font-size: 12.5px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.mailharbor-toggle input[type='checkbox'] {\n width: 14px;\n height: 14px;\n accent-color: var(--m-accent);\n}\n\n/* ---------- composer ---------- */\n\n.mailharbor-toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-wrap: wrap;\n padding: 6px;\n border: 1px solid var(--m-line-soft);\n border-bottom: 0;\n border-radius: 10px 10px 0 0;\n background: var(--m-bg-2);\n}\n\n.mailharbor-toolbar button {\n height: 26px;\n padding: 0 9px;\n border-radius: 6px;\n color: var(--m-text-2);\n font-size: 12px;\n}\n\n.mailharbor-toolbar button:hover {\n background: var(--m-bg-3);\n color: var(--m-text);\n}\n\n.mailharbor-editor {\n min-height: 240px;\n max-height: 44vh;\n overflow: auto;\n padding: 14px 16px;\n border: 1px solid var(--m-line-soft);\n border-radius: 0 0 10px 10px;\n background: #fff;\n color: #171a21;\n outline: none;\n font-size: 13.5px;\n line-height: 1.7;\n}\n\n.mailharbor-editor:empty::before {\n content: attr(data-placeholder);\n color: #9aa0ab;\n}\n\n/* ---------- inline confirm ---------- */\n\n.mailharbor-confirm {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 8px;\n border: 1px solid var(--m-line);\n background: var(--m-bg-2);\n color: var(--m-text-2);\n font-size: 12.5px;\n}\n\n/* ---------- selection / extraction ---------- */\n\n.mailharbor-selectbar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n margin: 0 12px 8px;\n border: 1px solid var(--m-accent-soft);\n border-radius: 9px;\n background: var(--m-accent-soft);\n}\n\n.mailharbor-selectbar select {\n height: 28px;\n max-width: 200px;\n}\n\n.mailharbor-row.selectable input[type='checkbox'] {\n width: 15px;\n height: 15px;\n flex: none;\n accent-color: var(--m-accent);\n}\n\n.mailharbor-extract-row {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 9px 10px;\n border: 1px solid var(--m-line-soft);\n border-radius: 9px;\n background: var(--m-bg-1);\n cursor: pointer;\n}\n\n.mailharbor-extract-row input {\n margin-top: 2px;\n accent-color: var(--m-accent);\n}\n\n.mailharbor-extract-row > span {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 0;\n}\n\n.mailharbor-kv {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr);\n gap: 6px 12px;\n margin: 0;\n font-size: 12.5px;\n}\n\n.mailharbor-kv dt {\n color: var(--m-text-3);\n}\n\n.mailharbor-kv dd {\n margin: 0;\n overflow-wrap: anywhere;\n}\n\n/* ---------- tasks panel ---------- */\n\n.mailharbor .chip {\n height: 26px;\n padding: 0 10px;\n border: 1px solid var(--m-line);\n border-radius: 999px;\n color: var(--m-text-3);\n font-size: 12px;\n}\n\n.mailharbor .chip.active {\n background: var(--m-accent-soft);\n border-color: transparent;\n color: var(--m-text);\n}\n\n.tasks-body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 18px;\n padding: 18px 20px 48px;\n width: 100%;\n max-width: 940px;\n margin: 0 auto;\n}\n\n.tasks-overview {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));\n gap: 12px;\n}\n\n.tasks-progress,\n.tasks-project {\n display: flex;\n flex-direction: column;\n gap: 7px;\n padding: 12px 14px;\n border: 1px solid var(--m-line-soft);\n border-radius: 12px;\n background: var(--m-bg-1);\n min-width: 0;\n}\n\n.tasks-progress-head,\n.tasks-project-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n min-width: 0;\n}\n\n.tasks-project-head .name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12.5px;\n font-weight: 500;\n}\n\n.tasks-bar {\n height: 6px;\n border-radius: 999px;\n background: var(--m-bg-3);\n overflow: hidden;\n}\n\n.tasks-bar span {\n display: block;\n height: 100%;\n border-radius: 999px;\n background: var(--m-accent);\n transition: width 200ms ease;\n}\n\n.tasks-bar.small {\n height: 4px;\n}\n\n.tasks-filters {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.tasks-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.tasks-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 9px 12px;\n border: 1px solid var(--m-line-soft);\n border-radius: 10px;\n background: var(--m-bg-1);\n}\n\n.tasks-row input[type='checkbox'] {\n width: 16px;\n height: 16px;\n flex: none;\n accent-color: var(--m-accent);\n}\n\n.tasks-row .tasks-title {\n flex: 1;\n min-width: 0;\n height: auto;\n padding: 0;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n text-align: left;\n border: 0;\n background: transparent;\n}\n\n.tasks-row .tasks-title:hover {\n background: transparent;\n}\n\n.tasks-row .tasks-title > span:first-child {\n font-size: 13px;\n color: var(--m-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n}\n\n.tasks-row.done .tasks-title > span:first-child {\n color: var(--m-text-3);\n text-decoration: line-through;\n}\n\n.tasks-meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: var(--m-text-3);\n}\n\n.tasks-meta .due.overdue {\n color: var(--m-danger);\n}\n\n.tasks-list-wrap {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n/* ---------- markdown ---------- */\n\n.mailharbor-markdown {\n display: flex;\n flex-direction: column;\n gap: 8px;\n font-size: 12.5px;\n line-height: 1.68;\n overflow-wrap: anywhere;\n}\n\n.mailharbor-markdown > *:first-child {\n margin-top: 0;\n}\n\n.mailharbor-markdown > *:last-child {\n margin-bottom: 0;\n}\n\n.mailharbor-markdown p {\n margin: 0;\n white-space: pre-wrap;\n}\n\n.mailharbor-markdown h1,\n.mailharbor-markdown h2,\n.mailharbor-markdown h3,\n.mailharbor-markdown h4,\n.mailharbor-markdown h5,\n.mailharbor-markdown h6 {\n margin: 4px 0 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--m-text);\n}\n\n.mailharbor-markdown ul,\n.mailharbor-markdown ol {\n margin: 0;\n padding-left: 20px;\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.mailharbor-markdown li::marker {\n color: var(--m-text-3);\n}\n\n.mailharbor-markdown a {\n color: var(--m-accent);\n text-decoration: none;\n}\n\n.mailharbor-markdown a:hover {\n text-decoration: underline;\n}\n\n.mailharbor-markdown code {\n padding: 1px 4px;\n border-radius: 4px;\n background: var(--m-bg-2);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11.5px;\n}\n\n.mailharbor-markdown pre {\n margin: 0;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--m-bg);\n border: 1px solid var(--m-line-soft);\n overflow: auto;\n}\n\n.mailharbor-markdown pre code {\n padding: 0;\n background: transparent;\n}\n\n.mailharbor-markdown blockquote {\n margin: 0;\n padding-left: 10px;\n border-left: 2px solid var(--m-line);\n color: var(--m-text-2);\n}\n\n.mailharbor-markdown hr {\n width: 100%;\n margin: 4px 0;\n border: 0;\n border-top: 1px solid var(--m-line-soft);\n}\n\n/* ---------- composer AI ---------- */\n\n.mailharbor-toolbar button.ai {\n color: var(--m-accent);\n}\n\n.mailharbor-compose-foot {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n flex-wrap: wrap;\n}\n\n.mailharbor-versions {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n padding-top: 8px;\n}\n\n.mailharbor-versions .chip {\n height: 22px;\n padding: 0 8px;\n border: 1px solid var(--m-line);\n border-radius: 999px;\n color: var(--m-text-3);\n font-size: 11px;\n}\n\n.mailharbor-versions .chip.active {\n background: var(--m-accent-soft);\n border-color: transparent;\n color: var(--m-text);\n}\n\n/* ---------- settings ---------- */\n\n.mailharbor.mailharbor-settings-page {\n height: auto;\n min-height: 100%;\n overflow: visible;\n}\n\n.mailharbor-settings {\n flex: 0 0 auto;\n width: 100%;\n max-width: 100%;\n min-width: 0;\n padding: 18px 20px 48px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n overflow-x: hidden;\n}\n\n.mailharbor-settings > * {\n min-width: 0;\n}\n\n.mailharbor-settings h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n letter-spacing: -0.01em;\n}\n\n.mailharbor-settings h3 {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--m-text-3);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n}\n\n.mailharbor-card {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border: 1px solid var(--m-line-soft);\n border-radius: 12px;\n background: var(--m-bg-1);\n min-width: 0;\n overflow: hidden;\n}\n\n.mailharbor-account-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.mailharbor-account-row .meta {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.mailharbor-account-row .meta strong {\n font-weight: 600;\n}\n\n.mailharbor-account-row .meta span {\n color: var(--m-text-3);\n font-size: 11.5px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mailharbor .avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n border-radius: 50%;\n background: var(--m-accent-soft);\n color: var(--m-accent);\n font-weight: 600;\n}\n\n.mailharbor-log {\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--m-bg);\n border: 1px solid var(--m-line-soft);\n color: var(--m-text-2);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n line-height: 1.6;\n max-height: 220px;\n overflow: auto;\n white-space: pre-wrap;\n}\n\n.mailharbor-kv {\n display: grid;\n grid-template-columns: minmax(120px, 170px) 1fr;\n gap: 6px 14px;\n font-size: 12px;\n margin: 0;\n}\n\n.mailharbor-kv dt {\n color: var(--m-text-3);\n}\n\n.mailharbor-kv dd {\n margin: 0;\n color: var(--m-text-2);\n word-break: break-all;\n}\n\n.mailharbor hr {\n border: 0;\n border-top: 1px solid var(--m-line-soft);\n margin: 2px 0;\n}\n\n/* ---------- conversation rows ---------- */\n\n.mailharbor-thread {\n display: flex;\n flex-direction: column;\n}\n\n.mailharbor-row.compact {\n padding-top: 6px;\n padding-bottom: 6px;\n padding-left: 34px;\n background: var(--m-bg);\n}\n\n.mailharbor-row.compact .line-1 {\n opacity: 0.85;\n}\n\n.mailharbor-row.compact .snippet {\n -webkit-line-clamp: 1;\n}\n\n.mailharbor .to-label {\n font-size: 10.5px;\n color: var(--m-text-3);\n flex: none;\n}\n\n.mailharbor .thread-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 999px;\n background: var(--m-bg-3);\n color: var(--m-text-2);\n font-size: 10.5px;\n flex: none;\n}\n\n.mailharbor .thread-count:hover {\n background: var(--m-accent-soft);\n color: var(--m-text);\n}\n\n.mailharbor-account {\n height: auto;\n padding: 3px 8px 3px 3px;\n border-radius: 8px;\n gap: 8px;\n}\n\n.mailharbor-account:hover {\n background: var(--m-hover);\n}\n\n/* ---------- mailbox sidebar ---------- */\n\n.mailharbor-side {\n display: flex;\n flex-direction: column;\n gap: 2px;\n width: 214px;\n flex: none;\n padding: 10px 8px;\n overflow: auto;\n border-right: 1px solid var(--m-line-soft);\n background: var(--m-bg);\n}\n\n.mailharbor-side-section {\n padding: 12px 8px 4px;\n font-size: 10.5px;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--m-text-3);\n}\n\n.mailharbor-side-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n height: 32px;\n padding: 0 8px;\n border-radius: 8px;\n color: var(--m-text-2);\n font-size: 12.5px;\n text-align: left;\n flex: none;\n}\n\n.mailharbor-side-item:hover {\n background: var(--m-hover);\n}\n\n.mailharbor-side-item.active {\n background: var(--m-accent-soft);\n color: var(--m-text);\n}\n\n.mailharbor-side-item .name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mailharbor-side-item .sub {\n display: block;\n font-size: 10.5px;\n color: var(--m-text-3);\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mailharbor-side-item .count {\n font-size: 11px;\n color: var(--m-text-3);\n}\n\n.mailharbor-side-item svg {\n flex: none;\n color: var(--m-text-3);\n}\n\n.mailharbor-side-item.active svg {\n color: var(--m-accent);\n}\n\n@media (max-width: 900px) {\n .mailharbor-side {\n display: none;\n }\n}\n\n/* ---------- task board ---------- */\n\n.tasks-board-wrap {\n flex: 1;\n min-height: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding: 16px 18px 40px;\n}\n\n.tasks-summary {\n display: flex;\n align-items: center;\n gap: 20px;\n padding: 14px 16px;\n border: 1px solid var(--m-line-soft);\n border-radius: 12px;\n background: var(--m-bg-1);\n}\n\n.tasks-summary-main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 7px;\n}\n\n.tasks-summary-labels {\n display: flex;\n align-items: baseline;\n gap: 10px;\n}\n\n.tasks-stats {\n display: flex;\n gap: 18px;\n}\n\n.tasks-stat {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 42px;\n}\n\n.tasks-stat strong {\n font-size: 16px;\n font-weight: 600;\n color: var(--m-text);\n}\n\n.tasks-stat span {\n font-size: 11px;\n color: var(--m-text-3);\n}\n\n.tasks-stat.danger strong {\n color: var(--m-danger);\n}\n\n.tasks-toolbar {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.tasks-board {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: 14px;\n align-items: start;\n}\n\n.task-column {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-height: 140px;\n padding: 8px;\n border: 1px solid var(--m-line-soft);\n border-radius: 12px;\n background: var(--m-bg-1);\n}\n\n.task-column-head {\n display: flex;\n align-items: center;\n gap: 7px;\n padding: 2px 4px 6px;\n}\n\n.task-column-head strong {\n font-size: 12.5px;\n font-weight: 600;\n}\n\n.task-column-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 999px;\n background: var(--m-bg-3);\n color: var(--m-text-3);\n font-size: 10.5px;\n}\n\n.task-dot {\n width: 7px;\n height: 7px;\n border-radius: 999px;\n background: var(--m-text-3);\n}\n\n.task-dot.NEEDS-ACTION {\n background: #8a8f98;\n}\n\n.task-dot.IN-PROCESS {\n background: var(--m-accent);\n}\n\n.task-dot.COMPLETED {\n background: var(--m-ok);\n}\n\n.task-dot.CANCELLED {\n background: var(--m-danger);\n opacity: 0.7;\n}\n\n.task-column-body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n min-height: 60px;\n}\n\n.task-column-empty {\n padding: 18px 8px;\n text-align: center;\n color: var(--m-text-3);\n font-size: 11.5px;\n border: 1px dashed var(--m-line-soft);\n border-radius: 9px;\n}\n\n.task-card {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 10px 11px;\n border: 1px solid var(--m-line-soft);\n border-radius: 10px;\n background: var(--m-bg);\n cursor: grab;\n transition:\n border-color 120ms ease,\n box-shadow 120ms ease;\n}\n\n.task-card:hover {\n border-color: var(--m-line);\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.16);\n}\n\n.task-card.dragging {\n opacity: 0.5;\n}\n\n.task-card-top {\n display: flex;\n align-items: flex-start;\n gap: 7px;\n}\n\n.task-card-title {\n flex: 1;\n min-width: 0;\n font-size: 12.5px;\n line-height: 1.45;\n color: var(--m-text);\n overflow-wrap: anywhere;\n}\n\n.task-priority {\n width: 3px;\n height: 14px;\n margin-top: 2px;\n border-radius: 999px;\n background: transparent;\n flex: none;\n}\n\n.task-priority.p5 {\n background: #d9a441;\n}\n\n.task-priority.p9 {\n background: var(--m-danger);\n}\n\n.task-card-delete {\n width: 18px;\n height: 18px;\n flex: none;\n border-radius: 5px;\n color: var(--m-text-3);\n opacity: 0;\n}\n\n.task-card:hover .task-card-delete {\n opacity: 1;\n}\n\n.task-card-notes {\n margin: 0;\n font-size: 11.5px;\n line-height: 1.55;\n color: var(--m-text-3);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.task-card-meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n font-size: 10.5px;\n color: var(--m-text-3);\n}\n\n.task-due,\n.task-owner,\n.task-project,\n.task-priority-label {\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 1px 6px;\n border-radius: 5px;\n background: var(--m-bg-2);\n}\n\n.task-due.overdue {\n color: var(--m-danger);\n background: rgba(242, 90, 90, 0.12);\n}\n\n.task-project {\n color: var(--m-accent);\n background: var(--m-accent-soft);\n}\n\n.task-source {\n align-self: flex-start;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n height: 22px;\n padding: 0 6px;\n border-radius: 5px;\n color: var(--m-text-3);\n font-size: 10.5px;\n}\n\n.task-source:hover {\n background: var(--m-hover);\n color: var(--m-text-2);\n}\n\n@media (max-width: 1180px) {\n .tasks-board {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n}\n\n@media (max-width: 720px) {\n .tasks-board {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n/* ---------- AI search ---------- */\n\n.mailharbor-ai-search {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 12px 8px;\n padding: 7px 10px;\n border-radius: 8px;\n background: var(--m-accent-soft);\n color: var(--m-text-2);\n font-size: 12px;\n}\n\n.mailharbor-ai-search.searching {\n background: var(--m-bg-2);\n color: var(--m-text-3);\n}\n\n/* ---------- task editor ---------- */\n\n.mailharbor-tasks .mailharbor-modal {\n max-width: 760px;\n}\n\n.task-editor {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 230px;\n gap: 18px;\n}\n\n.task-editor-main {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n}\n\n.task-editor-title input {\n width: 100%;\n height: 38px;\n font-size: 15px;\n font-weight: 500;\n}\n\n.task-editor-section {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.task-editor-section label,\n.task-editor-field label {\n font-size: 11px;\n color: var(--m-text-3);\n}\n\n.task-editor-section textarea {\n width: 100%;\n resize: vertical;\n}\n\n.task-editor-side {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n border: 1px solid var(--m-line-soft);\n border-radius: 10px;\n background: var(--m-bg-1);\n align-self: start;\n}\n\n.task-editor-field {\n display: flex;\n flex-direction: column;\n gap: 5px;\n min-width: 0;\n}\n\n.task-editor-field input,\n.task-editor-field select {\n width: 100%;\n}\n\n.task-priority-picker {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 4px;\n padding: 3px;\n border: 1px solid var(--m-line);\n border-radius: 8px;\n background: var(--m-bg);\n}\n\n.task-priority-picker button {\n height: 26px;\n border-radius: 6px;\n font-size: 11.5px;\n color: var(--m-text-3);\n}\n\n.task-priority-picker button.active {\n background: var(--m-accent-soft);\n color: var(--m-text);\n}\n\n.task-editor-foot {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n}\n\n/* ---------- project manager ---------- */\n\n.project-manager {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.project-manager-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--m-line-soft);\n border-radius: 10px;\n background: var(--m-bg-1);\n}\n\n.project-manager-main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.project-manager-main strong {\n font-size: 13px;\n}\n\n.project-manager-main .small {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.project-manager-main input {\n width: 100%;\n height: 28px;\n}\n\n.project-manager-actions {\n display: flex;\n gap: 4px;\n flex: none;\n align-items: center;\n}\n", "import { createElement as h, useEffect, useState, type ReactNode } from 'react'\nimport { api } from './api.js'\n\n/**\n * Sidebar entry: an envelope plus an unread count.\n *\n * The shell renders this inside an 18\u00D718 glyph slot and hides it from\n * assistive tech, so the badge must stay compact and must not add layout.\n * It uses the accent blue rather than `--dsw-alias-brand-primary`, which is\n * near-white in the dark theme and would render as an empty white blob.\n */\nexport function MailIcon(): ReactNode {\n const [unread, setUnread] = useState(0)\n\n useEffect(() => {\n let cancelled = false\n let timer: number | undefined\n const poll = async (): Promise<void> => {\n try {\n const result = await api.unread()\n if (!cancelled) setUnread(result.unread)\n } catch {\n // A logged-out or offline account simply shows no badge.\n }\n }\n void poll()\n const schedule = (): void => {\n if (cancelled) return\n timer = window.setTimeout(() => {\n void poll().finally(schedule)\n }, 60_000)\n }\n schedule()\n return () => {\n cancelled = true\n if (timer !== undefined) window.clearTimeout(timer)\n }\n }, [])\n\n return h(\n 'span',\n {\n style: {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '18px',\n height: '18px',\n boxSizing: 'border-box',\n },\n },\n h(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', 'aria-hidden': 'true' },\n h('rect', { x: 2.5, y: 5, width: 19, height: 14, rx: 2.5, stroke: 'currentColor', strokeWidth: 1.7 }),\n h('path', {\n d: 'M3.5 7l7.6 5.4a1.6 1.6 0 0 0 1.8 0L20.5 7',\n stroke: 'currentColor',\n strokeWidth: 1.7,\n strokeLinecap: 'round',\n }),\n ),\n unread > 0\n ? h(\n 'span',\n {\n style: {\n position: 'absolute',\n right: '-5px',\n bottom: '-3px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n minWidth: '13px',\n height: '13px',\n padding: '0 3px',\n borderRadius: '999px',\n background: '#5686fe',\n color: '#fff',\n fontSize: '9px',\n fontWeight: 600,\n lineHeight: '13px',\n zIndex: 1,\n letterSpacing: '-0.01em',\n fontVariantNumeric: 'tabular-nums',\n boxShadow: '0 0 0 2px var(--dsw-alias-bg-base, #151517)',\n pointerEvents: 'none',\n },\n },\n unread > 99 ? '99+' : String(unread),\n )\n : null,\n )\n}\n", "import type {\n Account,\n AiCard,\n AiSearchFilters,\n AiThread,\n Project,\n Task,\n TaskSuggestion,\n AppState,\n AttachmentMeta,\n BackupStatus,\n Draft,\n MessageDetail,\n MessageSummary,\n NewAccountInput,\n Page,\n SendResult,\n SettingsView,\n} from '../shared/types.js'\n\n/** Same-origin API root: works in the Web GUI and through the desktop shell. */\nconst BASE = new URL('mail-plugin/api/', document.baseURI).href\n\nexport class ApiError extends Error {\n readonly status: number\n\n constructor(message: string, status: number) {\n super(message)\n this.status = status\n this.name = 'ApiError'\n }\n}\n\nasync function request<T>(path: string, init: RequestInit = {}): Promise<T> {\n const response = await fetch(new URL(path, BASE), {\n credentials: 'same-origin',\n ...init,\n headers: {\n accept: 'application/json',\n ...(init.body === undefined ? {} : { 'content-type': 'application/json' }),\n ...(init.headers ?? {}),\n },\n })\n if (!response.ok) {\n let message = response.statusText\n try {\n const body: unknown = await response.json()\n if (\n body !== null &&\n typeof body === 'object' &&\n typeof (body as { error?: unknown }).error === 'string'\n ) {\n message = (body as { error: string }).error\n }\n } catch {\n // Keep the status text.\n }\n throw new ApiError(message, response.status)\n }\n return (await response.json()) as T\n}\n\nfunction query(params: Record<string, string | number | undefined | null>): string {\n const search = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null && value !== '') search.set(key, String(value))\n }\n const text = search.toString()\n return text === '' ? '' : `?${text}`\n}\n\nexport interface AiStatus {\n available: boolean\n enabled: boolean\n provider: string\n model: string\n styleUpdatedAt: string\n styleSampleCount: number\n error?: string\n}\n\nexport interface StyleProfile {\n profile: string\n updatedAt: string\n sampleCount: number\n}\n\nexport interface AiModels {\n providers: { provider: string; name: string; models: { id: string; name: string }[] }[]\n}\n\nexport interface SummaryBlock {\n title: string\n body: string\n}\n\nexport interface ListParams {\n accountId?: string | null\n source: 'local' | 'server'\n mailbox: string\n query?: string\n offset?: number\n limit?: number\n}\n\nexport const api = {\n state: (): Promise<AppState> => request<AppState>('state'),\n\n folders: (params: { accountId?: string | null; source: 'local' | 'server' }) =>\n request<{ items: { name: string; label?: string; count: number }[] }>(`folders${query(params)}`),\n\n messages: (params: ListParams) => request<Page<MessageSummary>>(`messages${query({ ...params })}`),\n\n message: (params: { id: string; accountId?: string | null; source: 'local' | 'server'; mailbox: string }) =>\n request<MessageDetail>(`messages/${encodeURIComponent(params.id)}${query({ ...params })}`),\n\n setRead: (params: {\n id: string\n accountId?: string | null\n source: 'local' | 'server'\n mailbox: string\n read: boolean\n }) =>\n request<{ ok: true; read: boolean }>(\n `messages/${encodeURIComponent(params.id)}/read${query({\n accountId: params.accountId ?? null,\n source: params.source,\n mailbox: params.mailbox,\n })}`,\n { method: 'POST', body: JSON.stringify({ read: params.read }) },\n ),\n\n attachmentUrl: (params: Record<string, string | number | undefined | null>) =>\n new URL(`attachment${query(params)}`, BASE).href,\n\n drafts: (accountId?: string | null) =>\n request<{ items: Draft[] }>(`drafts${query({ accountId: accountId ?? null })}`),\n\n saveDraft: (accountId: string | null, draft: Partial<Draft>) =>\n request<{ draft: Draft }>(`drafts${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n body: JSON.stringify(draft),\n }),\n\n deleteDraft: (id: string, accountId?: string | null) =>\n request<{ ok: true }>(`drafts/${encodeURIComponent(id)}${query({ accountId: accountId ?? null })}`, {\n method: 'DELETE',\n }),\n\n send: (accountId: string | null, payload: Record<string, unknown>) =>\n request<{ ok: true; result: SendResult }>(`send${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n unread: (accountId?: string | null) =>\n request<{ unread: number; source: string }>(`unread${query({ accountId: accountId ?? null })}`),\n\n addAccount: (input: NewAccountInput & { connect?: boolean; remember?: boolean }) =>\n request<{ account: Account; state: AppState }>('accounts', {\n method: 'POST',\n body: JSON.stringify(input),\n }),\n\n updateAccount: (id: string, patch: Record<string, unknown>) =>\n request<{ account: Account }>(`accounts/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(patch),\n }),\n\n deleteAccount: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}`, { method: 'DELETE' }),\n\n activateAccount: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}/activate`, { method: 'POST' }),\n\n login: (id: string, password: string, remember: boolean) =>\n request<{ ok: true; stored: boolean }>(`accounts/${encodeURIComponent(id)}/login`, {\n method: 'POST',\n body: JSON.stringify({ password, remember }),\n }),\n\n logout: (id: string) =>\n request<{ ok: true }>(`accounts/${encodeURIComponent(id)}/logout`, { method: 'POST' }),\n\n check: (id: string) =>\n request<{\n ok: true\n imap: { ok: true; mailboxes: { name: string; count: number }[] }\n smtp: { ok: boolean; error?: string }\n }>(`accounts/${encodeURIComponent(id)}/check`, { method: 'POST' }),\n\n aiStatus: (accountId?: string | null) =>\n request<AiStatus>(`ai/status${query({ accountId: accountId ?? null })}`),\n\n aiModels: () => request<AiModels>('ai/models'),\n\n aiSearch: (payload: {\n accountId: string | null\n source: 'local' | 'server'\n mailbox: string\n query: string\n }) =>\n request<Page<MessageSummary> & { ai: AiSearchFilters }>('ai/search', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiThread: (accountId: string | null, key: string) =>\n request<{ thread: AiThread | null }>(`ai/thread${query({ accountId: accountId ?? null, key })}`),\n\n aiAddCard: (payload: {\n accountId?: string | null\n key: string\n kind: 'summary' | 'reply' | 'translate' | 'answer'\n instruction?: string\n language?: 'zh' | 'en'\n target?: 'zh' | 'en'\n source: 'local' | 'server'\n id: string\n mailbox: string\n }) =>\n request<{ card: AiCard; thread: AiThread }>('ai/cards', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiDeleteCard: (accountId: string | null, key: string, cardId: string) =>\n request<{ thread: AiThread | null }>(`ai/cards${query({ accountId: accountId ?? null, key, cardId })}`, {\n method: 'DELETE',\n }),\n\n aiClearThread: (accountId: string | null, key: string) =>\n request<{ ok: boolean }>(`ai/thread${query({ accountId: accountId ?? null, key })}`, {\n method: 'DELETE',\n }),\n\n aiCompose: (payload: {\n accountId?: string | null\n mode: 'draft' | 'polish' | 'shorten'\n instruction?: string\n html: string\n language?: 'zh' | 'en'\n }) =>\n request<{ text: string; html: string }>('ai/compose', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiSummary: (payload: {\n accountId?: string | null\n source: 'local' | 'server'\n id: string\n mailbox: string\n }) =>\n request<{ summary: string; blocks: SummaryBlock[] }>('ai/summary', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiReply: (payload: {\n accountId?: string | null\n source: 'local' | 'server'\n id: string\n mailbox: string\n instruction?: string\n language?: 'zh' | 'en'\n }) =>\n request<{ text: string; html: string }>('ai/reply', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiTranslate: (payload: { accountId?: string | null; html: string; target: 'zh' | 'en' }) =>\n request<{ text: string; html: string }>('ai/translate', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n aiStyle: (accountId?: string | null) =>\n request<{ style: StyleProfile | null }>(`ai/style${query({ accountId: accountId ?? null })}`),\n\n aiSaveStyle: (accountId: string | null, profile: string) =>\n request<{ style: StyleProfile }>(`ai/style${query({ accountId: accountId ?? null })}`, {\n method: 'PUT',\n body: JSON.stringify({ accountId, profile }),\n }),\n\n aiLearnStyle: (accountId?: string | null) =>\n request<{ style: StyleProfile }>(`ai/style/learn${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n body: JSON.stringify({ accountId: accountId ?? null }),\n }),\n\n tasks: (accountId: string | null, params: { status?: string; projectId?: string; query?: string } = {}) =>\n request<{ items: Task[]; calendar: { calendarHref: string; lastSync: string; error: string } | null }>(\n `tasks${query({ accountId: accountId ?? null, ...params })}`,\n ),\n\n createTask: (payload: Record<string, unknown>) =>\n request<{ task: Task }>('tasks', { method: 'POST', body: JSON.stringify(payload) }),\n\n updateTask: (id: string, patch: Record<string, unknown>) =>\n request<{ task: Task }>(`tasks/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(patch),\n }),\n\n deleteTask: (id: string) => request<{ ok: true }>(`tasks/${encodeURIComponent(id)}`, { method: 'DELETE' }),\n\n extractTasks: (payload: {\n accountId?: string | null\n source: 'local' | 'server'\n id: string\n mailbox: string\n }) =>\n request<{ suggestions: TaskSuggestion[] }>('tasks/extract', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n taskCaldav: (accountId: string | null) =>\n request<{\n caldav: { url: string; username: string; calendarHref?: string } | null\n calendar: { calendarHref: string; lastSync: string; error: string } | null\n hasPassword: boolean\n }>(`tasks/caldav${query({ accountId: accountId ?? null })}`),\n\n saveTaskCaldav: (payload: {\n accountId?: string | null\n url: string\n username: string\n password?: string\n calendarHref?: string\n }) =>\n request<{ caldav: unknown; hasPassword: boolean }>('tasks/caldav', {\n method: 'PUT',\n body: JSON.stringify(payload),\n }),\n\n syncTasks: (accountId: string | null) =>\n request<{\n result: { pulled: number; pushed: number; deleted: number; removed: number }\n calendar: unknown\n }>('tasks/sync', { method: 'POST', body: JSON.stringify({ accountId }) }),\n\n projects: () => request<{ items: Project[] }>('projects'),\n\n pickDirectory: () => request<{ path: string | null }>('projects/pick-directory', { method: 'POST' }),\n\n updateProject: (id: string, name: string) =>\n request<{ project: Project }>(`projects/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify({ name }),\n }),\n\n deleteProject: (id: string) =>\n request<{ ok: boolean; path: string; unlinkedTasks: number; workspaceKept: boolean }>(\n `projects/${encodeURIComponent(id)}`,\n { method: 'DELETE' },\n ),\n\n openProject: (id: string) =>\n request<{ path: string }>(`projects/${encodeURIComponent(id)}/open`, { method: 'POST' }),\n\n projectFor: (accountId: string | null, key: string) =>\n request<{ project: Project | null }>(`projects/for${query({ accountId: accountId ?? null, key })}`),\n\n createProject: (payload: {\n accountId?: string | null\n name: string\n root: string\n conversation: string\n message?: { key: string; subject: string; date: string }\n }) =>\n request<{ project: Project; warnings: string[] }>('projects', {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n addProjectMessage: (\n id: string,\n payload: { accountId?: string | null; key: string; subject: string; date: string },\n ) =>\n request<{ project: Project }>(`projects/${encodeURIComponent(id)}/messages`, {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n removeProjectMessage: (id: string, accountId: string | null, key: string) =>\n request<{ project: Project }>(\n `projects/${encodeURIComponent(id)}/messages${query({ accountId: accountId ?? null, key })}`,\n { method: 'DELETE' },\n ),\n\n transferProject: (id: string, payload: { accountId?: string | null; key?: string; conversation: string }) =>\n request<{ project: Project }>(`projects/${encodeURIComponent(id)}/transfer`, {\n method: 'POST',\n body: JSON.stringify(payload),\n }),\n\n lookupMessage: (accountId: string | null, key: string) =>\n request<{ id: string; mailbox: string; subject: string }>(\n `messages/lookup${query({ accountId: accountId ?? null, key })}`,\n ),\n\n settings: () => request<SettingsView>('settings'),\n\n saveSettings: (patch: Record<string, unknown>) =>\n request<{ settings: SettingsView }>('settings', { method: 'PATCH', body: JSON.stringify(patch) }),\n\n backupStatus: (accountId?: string | null) =>\n request<BackupStatus>(`backup/status${query({ accountId: accountId ?? null })}`),\n\n startBackup: (accountId?: string | null) =>\n request<{ ok: true; status: BackupStatus }>(`backup/start${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n }),\n\n stopBackup: (accountId?: string | null) =>\n request<{ ok: boolean; status: BackupStatus }>(`backup/stop${query({ accountId: accountId ?? null })}`, {\n method: 'POST',\n }),\n}\n\nexport type { AttachmentMeta }\n", "import { createElement as h, useCallback, useEffect, useState, type ReactNode } from 'react'\nimport type {\n AiSearchFilters,\n AppState,\n BackupStatus,\n Draft,\n MessageDetail,\n MessageSummary,\n Page,\n Project,\n TaskSuggestion,\n} from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { AiRail, type AiRequest } from './ai-rail.js'\nimport type { AiReplyInit } from './reply.js'\nimport { AddAccountForm, AddAccountModal, LoginForm } from './account-form.js'\nimport { Avatar, ErrorBar, Modal, shortDate } from './components.js'\nimport { Composer, type ComposeInit } from './composer.js'\nimport { Icon } from './icons.js'\nimport { Reader } from './reader.js'\nimport { consumeOpenMail, type OpenMailRequest } from './nav.js'\n\ninterface Folder {\n name: string\n label?: string\n count: number\n}\n\nconst EMPTY_PAGE: Page<MessageSummary> = { items: [], total: 0, offset: 0, limit: 40 }\nconst DRAFTS = '__drafts'\n\n/** Paint the last known folders/page while the server answers. */\nconst folderCache = new Map<string, Folder[]>()\nconst pageCache = new Map<string, Page<MessageSummary>>()\n\nconst FOLDER_LABELS: Record<string, string> = {\n INBOX: '\u6536\u4EF6\u7BB1',\n 'Sent Items': '\u5DF2\u53D1\u9001',\n Sent: '\u5DF2\u53D1\u9001',\n Drafts: '\u8349\u7A3F',\n 'Junk E-mail': '\u5783\u573E\u90AE\u4EF6',\n Junk: '\u5783\u573E\u90AE\u4EF6',\n Trash: '\u5DF2\u5220\u9664',\n Deleted: '\u5DF2\u5220\u9664',\n Archive: '\u5B58\u6863',\n}\n\nfunction folderName(name: string): string {\n return FOLDER_LABELS[name] ?? name\n}\n\nfunction isSentFolder(mailbox: string): boolean {\n return /(^|[/.])(sent|sent items|sent mail|\u5DF2\u53D1\u9001|\u53D1\u4EF6\u7BB1)/i.test(mailbox)\n}\n\nfunction normalizeSubject(subject: string): string {\n return subject\n .replace(/^(\\s*(re|fw|fwd|\u56DE\u590D|\u8F6C\u53D1)\\s*[:\uFF1A]\\s*)+/gi, '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase()\n}\n\ninterface MessageGroup {\n key: string\n items: MessageSummary[]\n}\n\n/** Group a page of mail by conversation title, newest first. */\nfunction groupMessages(items: MessageSummary[]): MessageGroup[] {\n const map = new Map<string, MessageSummary[]>()\n const order: string[] = []\n for (const item of items) {\n const key =\n normalizeSubject(item.subject) === ''\n ? `__${item.accountId}:${item.id}`\n : normalizeSubject(item.subject)\n const existing = map.get(key)\n if (existing === undefined) {\n map.set(key, [item])\n order.push(key)\n } else {\n existing.push(item)\n }\n }\n return order.map((key) => ({ key, items: map.get(key) ?? [] }))\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction matchesNarrow(): boolean {\n return typeof window.matchMedia === 'function' ? window.matchMedia('(max-width: 900px)').matches : false\n}\n\nfunction quoteForReply(detail: MessageDetail): string {\n const body = detail.html ?? `<pre>${detail.text.replaceAll('&', '&amp;').replaceAll('<', '&lt;')}</pre>`\n return `<p><br></p><p>------------------ \u539F\u59CB\u90AE\u4EF6 ------------------</p><blockquote style=\"margin:0 0 0 12px;padding-left:12px;border-left:2px solid #d7dbe3;color:#565c67\">${body}</blockquote>`\n}\n\nexport function MailPanel(): ReactNode {\n const [state, setState] = useState<AppState | null>(null)\n const [error, setError] = useState('')\n const [accountScope, setAccountScope] = useState<string | null>(null)\n const [source, setSource] = useState<'local' | 'server'>('server')\n const [mailbox, setMailbox] = useState('all')\n const [folders, setFolders] = useState<Folder[]>([])\n const [query, setQuery] = useState('')\n const [search, setSearch] = useState('')\n const [page, setPage] = useState<Page<MessageSummary>>(EMPTY_PAGE)\n const [drafts, setDrafts] = useState<Draft[]>([])\n const [limit, setLimit] = useState(40)\n const [loading, setLoading] = useState(false)\n const [selected, setSelected] = useState<MessageDetail | null>(null)\n const [compose, setCompose] = useState<ComposeInit | null>(null)\n const [showAdd, setShowAdd] = useState(false)\n const [showBackup, setShowBackup] = useState(false)\n const [backup, setBackup] = useState<BackupStatus | null>(null)\n const [toast, setToast] = useState('')\n const [narrow, setNarrow] = useState(() => matchesNarrow())\n const [railOpen, setRailOpen] = useState(false)\n const [selectMode, setSelectMode] = useState(false)\n const [sideOpen, setSideOpen] = useState(() => {\n try {\n return window.localStorage.getItem('mailharbor.side') !== '0'\n } catch {\n return true\n }\n })\n const [expandedGroups, setExpandedGroups] = useState<string[]>([])\n const [selectedKeys, setSelectedKeys] = useState<string[]>([])\n const [projectOptions, setProjectOptions] = useState<Project[]>([])\n const [targetProject, setTargetProject] = useState('')\n const [extraction, setExtraction] = useState<{ items: TaskSuggestion[]; checked: boolean[] } | null>(null)\n const [extractBusy, setExtractBusy] = useState(false)\n const [aiInfo, setAiInfo] = useState<AiSearchFilters | null>(null)\n const [projectPicker, setProjectPicker] = useState<{\n accountId: string\n key: string\n subject: string\n date: string\n } | null>(null)\n const [pickerProjects, setPickerProjects] = useState<Project[]>([])\n const [pickerTarget, setPickerTarget] = useState('')\n const [pickerNewName, setPickerNewName] = useState('')\n const [pickerBusy, setPickerBusy] = useState(false)\n const [pickerMode, setPickerMode] = useState<'existing' | 'new'>('existing')\n const [managerOpen, setManagerOpen] = useState(false)\n const [managerProjects, setManagerProjects] = useState<Project[]>([])\n const [managerRename, setManagerRename] = useState<{ id: string; name: string } | null>(null)\n const [managerConfirm, setManagerConfirm] = useState('')\n const [managerBusy, setManagerBusy] = useState(false)\n const [aiSearching, setAiSearching] = useState(false)\n const [aiRequest, setAiRequest] = useState<AiRequest | null>(null)\n const [tick, setTick] = useState(0)\n\n const accounts = state?.accounts ?? []\n const isAll = accountScope === 'all'\n const account = accounts.find((item) => item.id === accountScope) ?? null\n const composeAccount =\n accounts.find((item) => item.id === compose?.accountId) ?? account ?? accounts[0] ?? null\n const showingDrafts = mailbox === DRAFTS && source === 'local'\n\n const keyOf = (item: MessageSummary): string =>\n item.messageId !== undefined && item.messageId !== '' ? `mid:${item.messageId}` : `local:${item.id}`\n\n // The tasks panel can ask the mail panel to open a source message.\n const openFromRequest = useCallback((detail: OpenMailRequest): void => {\n setAccountScope(detail.accountId)\n setSource('local')\n setMailbox(detail.mailbox === '' ? 'all' : detail.mailbox)\n api\n .activateAccount(detail.accountId)\n .then(() => {\n setRailOpen(false)\n return api.message({\n id: detail.id,\n accountId: detail.accountId,\n source: 'local',\n mailbox: detail.mailbox === '' ? 'all' : detail.mailbox,\n })\n })\n .then((message) => setSelected(message))\n .catch((caught: unknown) => setError(errorText(caught)))\n }, [])\n\n useEffect(() => {\n const queued = consumeOpenMail()\n if (queued !== null) openFromRequest(queued)\n const onOpen = (event: Event): void => {\n const detail = (event as CustomEvent<OpenMailRequest>).detail\n if (detail !== undefined) openFromRequest(detail)\n }\n window.addEventListener('mailharbor:open-mail', onOpen)\n return () => {\n window.removeEventListener('mailharbor:open-mail', onOpen)\n }\n }, [openFromRequest])\n\n const enterSelect = async (): Promise<void> => {\n setSelectMode(true)\n try {\n const list = await api.projects()\n setProjectOptions(list.items)\n setTargetProject(list.items[0]?.id ?? '')\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const runAiSearch = async (): Promise<void> => {\n const text = query.trim()\n if (text === '' || accountScope === null) return\n setAiSearching(true)\n setError('')\n try {\n const result = await Promise.race([\n api.aiSearch({ accountId: accountScope, source, mailbox, query: text }),\n new Promise<never>((_resolve, reject) => {\n window.setTimeout(() => reject(new Error('AI \u641C\u7D22\u8D85\u65F6\uFF0C\u5DF2\u6539\u7528\u666E\u901A\u641C\u7D22')), 45_000)\n }),\n ])\n setPage({ items: result.items, total: result.total, offset: 0, limit: result.limit })\n setDrafts([])\n setAiInfo(result.ai)\n setSearch('')\n } catch (caught) {\n // Fall back to the plain text search rather than leaving an empty panel.\n setError(errorText(caught))\n setAiInfo(null)\n setSearch(text)\n } finally {\n setAiSearching(false)\n }\n }\n\n const openProjectPicker = (): void => {\n if (selected === null) return\n const key = keyOf(selected)\n if (!key.startsWith('mid:') && !key.startsWith('local:')) {\n setError('\u8FD9\u5C01\u90AE\u4EF6\u7F3A\u5C11 Message-ID\uFF0C\u65E0\u6CD5\u5173\u8054\u5230\u9879\u76EE')\n return\n }\n setProjectPicker({\n accountId: selected.accountId,\n key,\n subject: selected.subject,\n date: selected.date,\n })\n setPickerNewName(selected.subject.replace(/^(re|fwd):\\s*/i, '').slice(0, 80))\n setPickerTarget('')\n void Promise.all([api.projects(), api.projectFor(selected.accountId, key)])\n .then(([list, linked]) => {\n setPickerProjects(list.items)\n const current = linked.project?.id ?? list.items[0]?.id ?? ''\n setPickerTarget(current)\n setPickerMode(current === '' ? 'new' : 'existing')\n })\n .catch((caught: unknown) => setError(errorText(caught)))\n }\n\n const saveProjectPick = async (): Promise<void> => {\n if (projectPicker === null) return\n setPickerBusy(true)\n setError('')\n try {\n if (pickerMode === 'existing' && pickerTarget !== '') {\n await api.addProjectMessage(pickerTarget, {\n accountId: projectPicker.accountId,\n key: projectPicker.key,\n subject: projectPicker.subject,\n date: projectPicker.date,\n })\n notice('\u5DF2\u52A0\u5165\u9879\u76EE')\n } else {\n const name = pickerNewName.trim()\n if (name === '') throw new Error('\u8BF7\u586B\u5199\u65B0\u9879\u76EE\u540D\u79F0')\n const settings = await api.settings()\n const created = await api.createProject({\n accountId: projectPicker.accountId,\n name,\n root: settings.projects.root,\n conversation: `\uFF08\u4ECE\u90AE\u4EF6\u52A0\u5165\uFF09\\n\\n${projectPicker.subject}`,\n message: {\n key: projectPicker.key,\n subject: projectPicker.subject,\n date: projectPicker.date,\n },\n })\n notice(`\u9879\u76EE\u5DF2\u521B\u5EFA\uFF1A${created.project.path}`)\n }\n setProjectPicker(null)\n setTick((value) => value + 1)\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setPickerBusy(false)\n }\n }\n\n const openManager = (): void => {\n setManagerOpen(true)\n setManagerConfirm('')\n setManagerRename(null)\n void api\n .projects()\n .then((list) => setManagerProjects(list.items))\n .catch((caught: unknown) => setError(errorText(caught)))\n }\n\n const managerAction = async (operation: () => Promise<unknown>): Promise<void> => {\n setManagerBusy(true)\n setError('')\n try {\n await operation()\n const list = await api.projects()\n setManagerProjects(list.items)\n setManagerRename(null)\n setManagerConfirm('')\n setTick((value) => value + 1)\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setManagerBusy(false)\n }\n }\n\n const toggleSide = (): void => {\n setSideOpen((open) => {\n try {\n window.localStorage.setItem('mailharbor.side', open ? '0' : '1')\n } catch {\n // Private mode simply does not persist the preference.\n }\n return !open\n })\n }\n\n const toggleGroup = (key: string): void => {\n setExpandedGroups((current) =>\n current.includes(key) ? current.filter((entry) => entry !== key) : [...current, key],\n )\n }\n\n const toggleSelect = (item: MessageSummary): void => {\n const key = `${item.accountId}:${item.id}`\n setSelectedKeys((current) =>\n current.includes(key) ? current.filter((entry) => entry !== key) : [...current, key],\n )\n }\n\n const addSelectedToProject = async (): Promise<void> => {\n if (targetProject === '') {\n setError('\u5148\u521B\u5EFA\u4E00\u4E2A\u9879\u76EE')\n return\n }\n const chosen = items\n .filter((item) => selectedKeys.includes(`${item.accountId}:${item.id}`))\n .filter((item) => item.messageId !== undefined && item.messageId !== '')\n if (chosen.length === 0) {\n setError('\u6240\u9009\u90AE\u4EF6\u7F3A\u5C11 Message-ID\uFF0C\u65E0\u6CD5\u5173\u8054\u5230\u9879\u76EE')\n return\n }\n try {\n for (const item of chosen) {\n await api.addProjectMessage(targetProject, {\n accountId: item.accountId,\n key: keyOf(item),\n subject: item.subject,\n date: item.date,\n })\n }\n notice(`\u5DF2\u52A0\u5165\u9879\u76EE\uFF1A${String(chosen.length)} \u5C01`)\n setSelectMode(false)\n setSelectedKeys([])\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const extractTasks = async (): Promise<void> => {\n if (selected === null) return\n setExtractBusy(true)\n try {\n const result = await api.extractTasks({\n accountId: selected.accountId,\n source,\n id: selected.id,\n mailbox,\n })\n if (result.suggestions.length === 0) {\n notice('\u8FD9\u5C01\u90AE\u4EF6\u6CA1\u6709\u63D0\u53D6\u5230\u660E\u786E\u4EFB\u52A1')\n return\n }\n setExtraction({ items: result.suggestions, checked: result.suggestions.map(() => true) })\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setExtractBusy(false)\n }\n }\n\n const saveExtraction = async (): Promise<void> => {\n if (extraction === null || selected === null) return\n setExtractBusy(true)\n try {\n const key = keyOf(selected)\n for (const [index, suggestion] of extraction.items.entries()) {\n if (!extraction.checked[index]) continue\n await api.createTask({\n accountId: selected.accountId,\n title: suggestion.title,\n notes: suggestion.notes,\n due: suggestion.due,\n priority: suggestion.priority,\n owner: suggestion.owner,\n messageKey: key,\n messageSubject: selected.subject,\n })\n }\n setExtraction(null)\n notice('\u4EFB\u52A1\u5DF2\u4FDD\u5B58\uFF0C\u53EF\u5728\u300C\u4EFB\u52A1\u300D\u9762\u677F\u67E5\u770B')\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setExtractBusy(false)\n }\n }\n\n const refresh = useCallback((): void => {\n setTick((value) => value + 1)\n }, [])\n\n const notice = useCallback((message: string): void => {\n setToast(message)\n window.setTimeout(() => {\n setToast('')\n }, 3200)\n }, [])\n\n // App state: load once and after mutations.\n useEffect(() => {\n let cancelled = false\n api\n .state()\n .then((next) => {\n if (cancelled) return\n setState(next)\n if (next.settings.render.listLimit > 0) setLimit(next.settings.render.listLimit)\n setAccountScope((current) => current ?? next.activeAccountId)\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n return () => {\n cancelled = true\n }\n }, [tick])\n\n // Folders follow the account scope and the source.\n useEffect(() => {\n if (accountScope === null) return\n let cancelled = false\n const cacheKey = `${accountScope}:${source}`\n const cached = folderCache.get(cacheKey)\n if (cached !== undefined) setFolders(cached)\n api\n .folders({ accountId: accountScope, source })\n .then((result) => {\n if (cancelled) return\n const items: Folder[] =\n source === 'local'\n ? [\n {\n name: 'all',\n label: '\u5168\u90E8\u90AE\u4EF6',\n count: result.items\n .filter((item) => item.name !== DRAFTS)\n .reduce((sum, item) => sum + item.count, 0),\n },\n ...result.items.map((item) => ({\n ...item,\n label: item.name === DRAFTS ? '\u8349\u7A3F' : (item.label ?? item.name),\n })),\n ]\n : result.items.map((item) => ({ ...item, label: item.label ?? item.name }))\n setFolders(items)\n folderCache.set(cacheKey, items)\n })\n .catch(() => {\n if (!cancelled && cached === undefined) setFolders([])\n })\n return () => {\n cancelled = true\n }\n }, [accountScope, source, tick])\n\n // A source or account switch resets the folder; unified inbox is local-only.\n useEffect(() => {\n setMailbox(source === 'local' ? 'all' : 'INBOX')\n setSelected(null)\n setAiInfo(null)\n setSearch('')\n setLimit(state?.settings.render.listLimit ?? 40)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [source])\n\n useEffect(() => {\n if (accountScope === 'all' && source === 'server') setSource('local')\n setSelected(null)\n setAiInfo(null)\n setSearch('')\n }, [accountScope, source])\n\n // Message page (or drafts list).\n useEffect(() => {\n if (accountScope === null) return\n let cancelled = false\n setLoading(true)\n if (showingDrafts) {\n const targets = isAll ? accounts : account === null ? [] : [account]\n Promise.all(\n targets.map(async (target) => {\n try {\n const result = await api.drafts(target.id)\n return result.items.map((draft) => ({ ...draft, accountId: target.id }))\n } catch {\n return []\n }\n }),\n )\n .then((groups) => {\n if (cancelled) return\n setDrafts(groups.flat().sort((left, right) => right.updatedAt.localeCompare(left.updatedAt)))\n setPage(EMPTY_PAGE)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }\n const pageKey = `${accountScope}:${source}:${mailbox}:${search}:${String(limit)}`\n const cachedPage = pageCache.get(pageKey)\n if (cachedPage !== undefined) {\n setPage(cachedPage)\n setLoading(false)\n }\n api\n .messages({ accountId: accountScope, source, mailbox, query: search, limit })\n .then((result) => {\n if (!cancelled) {\n setPage(result)\n setDrafts([])\n // The SELECT that listed this folder also tells us its size, so the\n // sidebar count appears without a second round trip.\n if (source === 'server' && mailbox !== 'all') {\n const update = (list: Folder[]): Folder[] =>\n list.map((folder) => (folder.name === mailbox ? { ...folder, count: result.total } : folder))\n setFolders(update)\n const key = `${accountScope}:server`\n const cachedFolders = folderCache.get(key)\n if (cachedFolders !== undefined) folderCache.set(key, update(cachedFolders))\n }\n pageCache.set(pageKey, result)\n if (pageCache.size > 12) {\n const oldest = pageCache.keys().next().value\n if (oldest !== undefined) pageCache.delete(oldest)\n }\n }\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [accountScope, source, mailbox, search, limit, tick])\n\n // Narrow layout follows the viewport.\n useEffect(() => {\n if (typeof window.matchMedia !== 'function') return\n const media = window.matchMedia('(max-width: 900px)')\n const onChange = (): void => setNarrow(media.matches)\n media.addEventListener('change', onChange)\n return () => {\n media.removeEventListener('change', onChange)\n }\n }, [])\n\n // Backup progress polling while the dialog is open.\n useEffect(() => {\n if (!showBackup || accountScope === null || isAll) return\n let cancelled = false\n const poll = async (): Promise<void> => {\n try {\n const status = await api.backupStatus(accountScope)\n if (!cancelled) setBackup(status)\n } catch {\n // Keep the last status.\n }\n }\n void poll()\n const timer = window.setInterval(() => {\n void poll()\n }, 1000)\n return () => {\n cancelled = true\n window.clearInterval(timer)\n }\n }, [showBackup, accountScope, isAll])\n\n const openMessage = async (item: MessageSummary): Promise<void> => {\n const owner = item.accountId\n const ownerSource = source\n setError('')\n try {\n const detail = await api.message({ id: item.id, accountId: owner, source: ownerSource, mailbox })\n setSelected(detail)\n if (detail.unread && state?.settings.read.markOnOpen === true) {\n try {\n await api.setRead({ id: detail.id, accountId: owner, source: ownerSource, mailbox, read: true })\n setSelected({ ...detail, unread: false })\n setPage((current) => ({\n ...current,\n items: current.items.map((row) => (row.id === item.id ? { ...row, unread: false } : row)),\n }))\n } catch {\n // Reading must not fail because the server refused a flag write.\n }\n }\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const startCompose = (mode: ComposeInit['mode']): void => {\n const owner = account ?? accounts.find((item) => item.id === state?.activeAccountId) ?? accounts[0]\n if (owner === undefined) return\n const detail = selected\n if (mode === 'new' || detail === null) {\n setCompose({ mode: 'new', accountId: owner.id, to: '', cc: '', bcc: '', subject: '', html: '' })\n return\n }\n const subjectPrefix = mode === 'forward' ? 'Fwd: ' : 'Re: '\n const subject = /^(re|fwd):/i.test(detail.subject) ? detail.subject : `${subjectPrefix}${detail.subject}`\n if (mode === 'forward') {\n setCompose({\n mode,\n accountId: detail.accountId,\n to: '',\n cc: '',\n bcc: '',\n subject,\n html: quoteForReply(detail),\n references: detail.references.join(' '),\n })\n return\n }\n const to = detail.from.address\n const cc =\n mode === 'replyAll'\n ? [...detail.to, ...detail.cc]\n .map((item) => item.address)\n .filter((address) => address !== owner.email && address !== to)\n .join(', ')\n : ''\n setCompose({\n mode,\n accountId: detail.accountId,\n to,\n cc,\n bcc: '',\n subject,\n html: quoteForReply(detail),\n ...(detail.messageId === ''\n ? {}\n : { inReplyTo: detail.messageId, references: [...detail.references, detail.messageId].join(' ') }),\n })\n }\n\n const requestAi = (kind: AiRequest['kind']): void => {\n setRailOpen(true)\n setAiRequest({ kind, nonce: Date.now() })\n }\n\n const insertReply = (init: AiReplyInit): void => {\n if (selected === null) return\n setCompose({\n mode: 'reply',\n accountId: selected.accountId,\n to: init.to,\n cc: init.cc,\n bcc: '',\n subject: init.subject,\n html: init.html,\n ...(init.inReplyTo === undefined ? {} : { inReplyTo: init.inReplyTo }),\n ...(init.references === undefined ? {} : { references: init.references }),\n })\n }\n\n const saveReplyDraft = async (init: AiReplyInit): Promise<void> => {\n if (selected === null) return\n try {\n await api.saveDraft(selected.accountId, {\n to: init.to,\n cc: init.cc,\n bcc: '',\n subject: init.subject,\n html: init.html,\n attachments: [],\n ...(init.inReplyTo === undefined ? {} : { inReplyTo: init.inReplyTo }),\n ...(init.references === undefined ? {} : { references: init.references }),\n })\n notice('\u5DF2\u5B58\u4E3A\u8349\u7A3F')\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const openDraft = (draft: Draft): void => {\n setCompose({\n mode: 'new',\n accountId: draft.accountId,\n to: draft.to,\n cc: draft.cc,\n bcc: draft.bcc,\n subject: draft.subject,\n html: draft.html,\n attachments: draft.attachments,\n draftId: draft.id,\n })\n }\n\n const removeDraft = async (id: string, accountId: string): Promise<void> => {\n try {\n await api.deleteDraft(id, accountId)\n setDrafts((current) => current.filter((draft) => draft.id !== id))\n notice('\u8349\u7A3F\u5DF2\u5220\u9664')\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const switchAccount = async (id: string): Promise<void> => {\n try {\n if (id !== 'all') await api.activateAccount(id)\n setAccountScope(id)\n setSelected(null)\n if (id === 'all') setSource('local')\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const startBackup = async (): Promise<void> => {\n const owner =\n accountScope === null || isAll ? accounts[0] : accounts.find((item) => item.id === accountScope)\n if (owner === undefined) return\n try {\n const result = await api.startBackup(owner.id)\n setBackup(result.status)\n setShowBackup(true)\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const stopBackup = async (): Promise<void> => {\n if (accountScope === null || isAll) return\n try {\n const result = await api.stopBackup(accountScope)\n setBackup(result.status)\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n if (state === null) {\n return h(\n 'div',\n { className: 'mailharbor' },\n h('div', { className: 'mailharbor-settings' }, '\u6B63\u5728\u8BFB\u53D6\u90AE\u7BB1\u2026'),\n )\n }\n\n if (accounts.length === 0) {\n return h(\n 'div',\n { className: 'mailharbor' },\n h(\n 'div',\n { className: 'mailharbor-settings' },\n h('h2', null, '\u6B22\u8FCE\u4F7F\u7528 MailHarbor'),\n h(\n 'p',\n { className: 'muted small' },\n '\u628A\u4EFB\u610F IMAP/SMTP \u90AE\u7BB1\u63A5\u8FDB DeepSeek Harness\uFF1A\u672C\u5730\u5907\u4EFD\u3001\u5B9E\u65F6\u8BFB\u4FE1\u3001\u5199\u90AE\u4EF6\u4E0E Agent \u5DE5\u5177\u3002',\n ),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(AddAccountForm, {\n onDone: (next) => {\n setState(next)\n setAccountScope(next.activeAccountId)\n setSource('local')\n },\n }),\n ),\n )\n }\n\n const currentAccount = account ?? accounts[0] ?? null\n const loggedIn = isAll ? accounts.some((item) => item.id === state.activeAccountId) : state.loggedIn\n const needsLogin = source === 'server' && !isAll && state.loggedIn === false\n const items = page.items\n\n const isSent = isSentFolder(mailbox)\n const groups = groupMessages(items)\n\n const renderMessage = (\n item: MessageSummary,\n meta: { compact?: boolean; groupCount?: number; groupKey?: string; expanded?: boolean } = {},\n ): ReactNode => {\n const sent = isSent && item.to.length > 0\n const first = sent ? item.to[0] : item.from\n const who = first === undefined || first === null ? '' : first.name !== '' ? first.name : first.address\n const extra = sent && item.to.length > 1 ? ` +${String(item.to.length - 1)}` : ''\n const isSelected = selected?.id === item.id && selected?.accountId === item.accountId\n return h(\n 'div',\n {\n key: `${item.accountId}:${item.id}`,\n className: `mailharbor-row${item.unread ? ' unread' : ''}${isSelected ? ' selected' : ''}${selectMode ? ' selectable' : ''}${meta.compact === true ? ' compact' : ''}`,\n role: 'button',\n tabIndex: 0,\n onClick: () => {\n if (selectMode) toggleSelect(item)\n else void openMessage(item)\n },\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n if (selectMode) toggleSelect(item)\n else void openMessage(item)\n }\n },\n },\n h(\n 'span',\n { className: 'line-1' },\n selectMode\n ? h('input', {\n type: 'checkbox',\n checked: selectedKeys.includes(`${item.accountId}:${item.id}`),\n 'aria-label': '\u9009\u62E9\u90AE\u4EF6',\n onClick: (event: { stopPropagation: () => void }) => event.stopPropagation(),\n onChange: () => toggleSelect(item),\n })\n : item.unread\n ? h('span', { className: 'dot' })\n : null,\n sent ? h('span', { className: 'to-label' }, '\u6536\u4EF6\u4EBA ') : null,\n h('span', { className: 'from' }, `${who}${extra}`),\n item.hasAttachments ? h(Icon, { name: 'paperclip', size: 13 }) : null,\n source === 'local' && item.backedUp === false\n ? h('span', { className: 'badge warn' }, '\u672A\u5907\u4EFD')\n : null,\n meta.groupCount !== undefined && meta.groupCount > 1\n ? h(\n 'button',\n {\n className: 'thread-count',\n title: meta.expanded === true ? '\u6536\u8D77\u4F1A\u8BDD' : `\u5C55\u5F00\u4F1A\u8BDD\uFF08${String(meta.groupCount)} \u5C01\uFF09`,\n onClick: (event: { stopPropagation: () => void }) => {\n event.stopPropagation()\n toggleGroup(meta.groupKey ?? '')\n },\n },\n meta.expanded === true ? '\u2212' : String(meta.groupCount),\n )\n : null,\n h('span', { className: 'date' }, shortDate(item.date)),\n ),\n meta.compact === true\n ? null\n : h('span', { className: 'line-2' }, h('span', { className: 'subject' }, item.subject)),\n item.snippet === '' ? null : h('span', { className: 'snippet' }, item.snippet),\n )\n }\n\n return h(\n 'div',\n { className: narrow ? 'mailharbor mailharbor-narrow' : 'mailharbor' },\n h(\n 'div',\n { className: 'mailharbor-topbar' },\n h(\n 'button',\n {\n className: 'mailharbor-account',\n onClick: toggleSide,\n title: sideOpen ? '\u6536\u8D77\u8D26\u53F7\u4E0E\u6587\u4EF6\u5939' : '\u5C55\u5F00\u8D26\u53F7\u4E0E\u6587\u4EF6\u5939',\n },\n h(Avatar, { email: currentAccount?.email ?? '?', size: 26 }),\n h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', minWidth: 0 } },\n h('span', { className: 'name' }, currentAccount?.label ?? ''),\n h('span', { className: 'small muted' }, currentAccount?.email ?? ''),\n ),\n state.loggedIn === false ? h('span', { className: 'badge warn' }, '\u672A\u767B\u5F55') : null,\n h(Icon, { name: sideOpen ? 'chevronLeft' : 'chevronRight', size: 14 }),\n ),\n h(\n 'div',\n { className: 'mailharbor-segment', role: 'tablist' },\n h(\n 'button',\n { className: source === 'local' ? 'active' : '', onClick: () => setSource('local'), role: 'tab' },\n '\u672C\u5730\u5907\u4EFD',\n ),\n h(\n 'button',\n {\n className: source === 'server' ? 'active' : '',\n onClick: () => {\n if (isAll) {\n notice('\u7EDF\u4E00\u6536\u4EF6\u7BB1\u53EA\u652F\u6301\u672C\u5730\u5907\u4EFD\uFF0C\u5207\u6362\u5230\u5355\u4E2A\u8D26\u53F7\u53EF\u4F7F\u7528\u670D\u52A1\u5668\u5B9E\u65F6')\n return\n }\n setSource('server')\n },\n role: 'tab',\n title: isAll ? '\u7EDF\u4E00\u6536\u4EF6\u7BB1\u53EA\u652F\u6301\u672C\u5730\u5907\u4EFD' : '\u8BFB\u53D6\u670D\u52A1\u5668\u4E0A\u7684\u6700\u65B0\u90AE\u4EF6',\n },\n '\u670D\u52A1\u5668\u5B9E\u65F6',\n ),\n ),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n { className: 'ghost icon', title: '\u5237\u65B0\u5217\u8868', 'aria-label': '\u5237\u65B0\u5217\u8868', onClick: refresh },\n h(Icon, { name: 'refresh' }),\n ),\n h(\n 'button',\n {\n className: 'ghost',\n onClick: () => void startBackup(),\n title: isAll ? '\u5907\u4EFD\u5F53\u524D\u6D3B\u52A8\u8D26\u53F7' : '\u5907\u4EFD\u8FD9\u4E2A\u8D26\u53F7',\n },\n h(Icon, { name: 'archive' }),\n '\u5907\u4EFD',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: openManager, title: '\u9879\u76EE\u7BA1\u7406' },\n h(Icon, { name: 'folder' }),\n '\u9879\u76EE',\n ),\n h(\n 'button',\n {\n className: railOpen ? 'ghost active' : 'ghost',\n onClick: () => setRailOpen(!railOpen),\n title: 'AI \u5DE5\u4F5C\u53F0',\n },\n h(Icon, { name: 'sparkles' }),\n 'AI',\n ),\n h(\n 'button',\n { className: 'primary', onClick: () => startCompose('new') },\n h(Icon, { name: 'compose' }),\n '\u5199\u90AE\u4EF6',\n ),\n ),\n toast === ''\n ? null\n : h('div', { className: 'small', style: { padding: '6px 14px', color: 'var(--m-ok)' } }, toast),\n error === '' ? null : h(ErrorBar, { message: error, onDismiss: () => setError('') }),\n needsLogin\n ? h(\n 'div',\n { className: 'mailharbor-settings' },\n h(LoginForm, { account: currentAccount!, onDone: refresh }),\n )\n : h(\n 'div',\n { className: 'mailharbor-body', 'data-mode': narrow && selected !== null ? 'reader' : 'list' },\n sideOpen\n ? h(\n 'aside',\n { className: 'mailharbor-side' },\n h('div', { className: 'mailharbor-side-section' }, '\u8D26\u53F7'),\n accounts.map((item) =>\n h(\n 'button',\n {\n key: item.id,\n className: `mailharbor-side-item${!isAll && item.id === accountScope ? ' active' : ''}`,\n onClick: () => {\n void switchAccount(item.id)\n setSource('server')\n setMailbox('INBOX')\n },\n },\n h(Avatar, { email: item.email, size: 18 }),\n h(\n 'span',\n { className: 'name' },\n h('span', null, item.label),\n h('span', { className: 'sub' }, item.email),\n ),\n item.enabled === false ? h('span', { className: 'badge warn' }, '\u505C\u7528') : null,\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-side-section' },\n source === 'server' ? '\u670D\u52A1\u5668\u6587\u4EF6\u5939' : '\u672C\u5730\u6587\u4EF6\u5939',\n ),\n folders.map((folder) =>\n h(\n 'button',\n {\n key: folder.name,\n className: `mailharbor-side-item${mailbox === folder.name ? ' active' : ''}`,\n onClick: () => {\n setMailbox(folder.name)\n setSelected(null)\n },\n },\n h(Icon, { name: folder.name === DRAFTS ? 'compose' : 'folder', size: 14 }),\n h('span', { className: 'name' }, folderName(folder.label ?? folder.name)),\n folder.count > 0 ? h('span', { className: 'count' }, String(folder.count)) : null,\n ),\n ),\n )\n : null,\n h(\n 'div',\n { className: 'mailharbor-list' },\n h(\n 'div',\n { className: 'mailharbor-filters' },\n h('input', {\n type: 'search',\n placeholder: showingDrafts\n ? '\u641C\u7D22\u8349\u7A3F'\n : aiSearching\n ? 'AI \u6B63\u5728\u7406\u89E3\u4F60\u7684\u641C\u7D22\u2026'\n : '\u641C\u7D22\u90AE\u4EF6\uFF0C\u6216\u63CF\u8FF0\u4F60\u8981\u627E\u4EC0\u4E48\uFF08AI\uFF09',\n 'aria-label': '\u641C\u7D22\u90AE\u4EF6',\n value: query,\n onChange: (event: { target: { value: string } }) => setQuery(event.target.value),\n onKeyDown: (event: { key: string }) => {\n if (event.key === 'Enter') {\n if (showingDrafts) setSearch(query)\n else void runAiSearch()\n }\n if (event.key === 'Escape') {\n setQuery('')\n setSearch('')\n setAiInfo(null)\n }\n },\n }),\n h(\n 'button',\n {\n className: selectMode ? 'ghost active' : 'ghost',\n title: '\u9009\u62E9\u591A\u5C01\u90AE\u4EF6\u52A0\u5165\u9879\u76EE',\n onClick: () => {\n if (selectMode) {\n setSelectMode(false)\n setSelectedKeys([])\n } else {\n void enterSelect()\n }\n },\n },\n Icon({ name: 'list', size: 14 }),\n '\u9009\u62E9',\n ),\n query !== search || search !== ''\n ? h(\n 'button',\n {\n className: 'subtle',\n title: '\u6E05\u9664\u641C\u7D22',\n onClick: () => {\n setQuery('')\n setSearch('')\n setAiInfo(null)\n },\n },\n h(Icon, { name: 'close', size: 14 }),\n )\n : null,\n ),\n aiInfo === null\n ? null\n : h(\n 'div',\n { className: 'mailharbor-ai-search' },\n h(Icon, { name: 'sparkles', size: 13 }),\n h(\n 'span',\n null,\n aiInfo.explanation !== '' ? aiInfo.explanation : `\u5173\u952E\u8BCD\uFF1A${aiInfo.keywords.join('\u3001')}`,\n ),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n {\n className: 'subtle',\n onClick: () => {\n setAiInfo(null)\n setTick((value) => value + 1)\n },\n },\n '\u6E05\u9664',\n ),\n ),\n aiSearching\n ? h('div', { className: 'mailharbor-ai-search searching' }, 'AI \u6B63\u5728\u7406\u89E3\u5E76\u641C\u7D22\u2026')\n : null,\n selectMode\n ? h(\n 'div',\n { className: 'mailharbor-selectbar' },\n h('span', { className: 'small' }, `\u5DF2\u9009 ${String(selectedKeys.length)} \u5C01`),\n h('span', { className: 'spacer' }),\n h(\n 'select',\n {\n value: targetProject,\n onChange: (event: { target: { value: string } }) =>\n setTargetProject(event.target.value),\n 'aria-label': '\u76EE\u6807\u9879\u76EE',\n },\n h('option', { value: '' }, projectOptions.length === 0 ? '\u8FD8\u6CA1\u6709\u9879\u76EE' : '\u9009\u62E9\u9879\u76EE'),\n projectOptions.map((project) =>\n h('option', { key: project.id, value: project.id }, project.name),\n ),\n ),\n h(\n 'button',\n {\n className: 'primary',\n disabled: selectedKeys.length === 0 || targetProject === '',\n onClick: () => void addSelectedToProject(),\n },\n '\u52A0\u5165\u9879\u76EE',\n ),\n h(\n 'button',\n {\n className: 'ghost',\n onClick: () => {\n setSelectMode(false)\n setSelectedKeys([])\n },\n },\n '\u53D6\u6D88',\n ),\n )\n : null,\n h(\n 'div',\n { className: 'mailharbor-rows' },\n loading && items.length === 0 && drafts.length === 0\n ? h('div', { className: 'mailharbor-empty' }, '\u6B63\u5728\u8BFB\u53D6\u2026')\n : showingDrafts\n ? drafts.length === 0\n ? h(\n 'div',\n { className: 'mailharbor-empty' },\n h(Icon, { name: 'compose', size: 28 }),\n h('div', { className: 'title' }, '\u6CA1\u6709\u8349\u7A3F'),\n h('div', { className: 'small' }, '\u5199\u4FE1\u65F6\u70B9\u300C\u5B58\u8349\u7A3F\u300D\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002'),\n )\n : drafts\n .filter((draft) =>\n search === ''\n ? true\n : `${draft.subject} ${draft.to} ${draft.cc}`\n .toLowerCase()\n .includes(search.toLowerCase()),\n )\n .map((draft) =>\n h(\n 'div',\n {\n key: draft.id,\n className: 'mailharbor-row',\n role: 'button',\n tabIndex: 0,\n onClick: () => openDraft(draft),\n onKeyDown: (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n openDraft(draft)\n }\n },\n },\n h(\n 'span',\n { className: 'line-1' },\n h(\n 'span',\n { className: 'from' },\n `\u8349\u7A3F${draft.to === '' ? '' : ` \u00B7 \u6536\u4EF6\u4EBA ${draft.to}`}`,\n ),\n isAll\n ? h(\n 'span',\n { className: 'badge' },\n accounts.find((item) => item.id === draft.accountId)?.label ?? '',\n )\n : null,\n h('span', { className: 'date' }, shortDate(draft.updatedAt)),\n h(\n 'button',\n {\n className: 'subtle',\n title: '\u5220\u9664\u8349\u7A3F',\n onClick: (event: { stopPropagation: () => void }) => {\n event.stopPropagation()\n void removeDraft(draft.id, draft.accountId)\n },\n },\n h(Icon, { name: 'close', size: 13 }),\n ),\n ),\n h(\n 'span',\n { className: 'line-2' },\n h(\n 'span',\n { className: 'subject' },\n draft.subject === '' ? '(\u65E0\u4E3B\u9898)' : draft.subject,\n ),\n ),\n draft.html === ''\n ? null\n : h(\n 'span',\n { className: 'snippet' },\n draft.html\n .replace(/<[^>]+>/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, 120),\n ),\n ),\n )\n : items.length === 0\n ? h(\n 'div',\n { className: 'mailharbor-empty' },\n h(Icon, { name: aiInfo === null ? 'mail' : 'sparkles', size: 28 }),\n h(\n 'div',\n { className: 'title' },\n aiInfo === null\n ? source === 'local'\n ? '\u672C\u5730\u5907\u4EFD\u91CC\u8FD8\u6CA1\u6709\u90AE\u4EF6'\n : '\u670D\u52A1\u5668\u4E0A\u6CA1\u6709\u90AE\u4EF6'\n : 'AI \u641C\u7D22\u6CA1\u6709\u627E\u5230\u5339\u914D\u90AE\u4EF6',\n ),\n h(\n 'div',\n { className: 'small' },\n aiInfo === null\n ? source === 'local'\n ? '\u70B9\u9876\u90E8\u300C\u5907\u4EFD\u300D\u628A\u670D\u52A1\u5668\u90AE\u4EF6\u540C\u6B65\u4E0B\u6765\u3002'\n : '\u6362\u4E00\u4E2A\u6587\u4EF6\u5939\u6216\u7A0D\u540E\u5237\u65B0\u3002'\n : '\u6362\u4E2A\u8BF4\u6CD5\uFF0C\u6216\u76F4\u63A5\u8F93\u5165\u5173\u952E\u8BCD\u540E\u6309\u56DE\u8F66\u3002',\n ),\n )\n : selectMode\n ? items.map((item) => renderMessage(item))\n : groups.map((group) => {\n const latest = group.items[0]\n if (latest === undefined) return null\n const expanded = expandedGroups.includes(group.key)\n return h(\n 'div',\n { className: 'mailharbor-thread', key: group.key },\n renderMessage(latest, {\n groupCount: group.items.length,\n groupKey: group.key,\n expanded,\n }),\n expanded\n ? group.items.slice(1).map((item) => renderMessage(item, { compact: true }))\n : null,\n )\n }),\n ),\n !showingDrafts && items.length > 0\n ? h(\n 'div',\n { className: 'mailharbor-list-foot' },\n h('span', null, `${String(items.length)} / ${String(page.total)} \u5C01`),\n h('span', { className: 'spacer' }),\n page.total > items.length && aiInfo === null\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setLimit((current) => current + 40) },\n '\u52A0\u8F7D\u66F4\u591A',\n )\n : null,\n )\n : showingDrafts && drafts.length > 0\n ? h(\n 'div',\n { className: 'mailharbor-list-foot' },\n h('span', null, `${String(drafts.length)} \u5C01\u8349\u7A3F`),\n )\n : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-reader' },\n selected === null\n ? h(\n 'div',\n { className: 'mailharbor-empty' },\n h(Icon, { name: 'mail', size: 34 }),\n h('div', { className: 'title' }, '\u9009\u62E9\u4E00\u5C01\u90AE\u4EF6\u5F00\u59CB\u9605\u8BFB'),\n h(\n 'div',\n { className: 'small' },\n loggedIn ? '\u5DF2\u767B\u5F55\uFF0C\u53EF\u5207\u6362\u300C\u670D\u52A1\u5668\u5B9E\u65F6\u300D\u67E5\u770B\u6700\u65B0\u90AE\u4EF6\u3002' : '\u6D4F\u89C8\u672C\u5730\u5907\u4EFD\u4E0D\u9700\u8981\u767B\u5F55\u3002',\n ),\n )\n : h(Reader, {\n detail: selected,\n source,\n mailbox,\n onChanged: (patch) => setSelected({ ...selected, ...patch }),\n onReply: (mode) => startCompose(mode),\n onAiAction: requestAi,\n onExtractTasks: () => void extractTasks(),\n onAddToProject: openProjectPicker,\n onClose: narrow ? () => setSelected(null) : undefined,\n }),\n ),\n railOpen\n ? h(AiRail, {\n account:\n accounts.find((item) => item.id === (selected?.accountId ?? accountScope)) ??\n currentAccount,\n detail: selected,\n source,\n mailbox,\n request: aiRequest,\n onClose: () => setRailOpen(false),\n onInsert: insertReply,\n onSaveDraft: (init) => void saveReplyDraft(init),\n onNotice: notice,\n })\n : null,\n ),\n showBackup && backup !== null\n ? h(\n Modal,\n {\n title: '\u5907\u4EFD',\n onClose: () => setShowBackup(false),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', alignItems: 'center' } },\n h('span', { className: 'small muted' }, backup.running ? '\u5907\u4EFD\u8FDB\u884C\u4E2D\u2026' : backup.message),\n h('span', { className: 'spacer' }),\n backup.running\n ? h('button', { className: 'ghost danger', onClick: () => void stopBackup() }, '\u505C\u6B62\u5907\u4EFD')\n : h('button', { className: 'primary', onClick: () => void startBackup() }, '\u5F00\u59CB\u5907\u4EFD'),\n h('button', { className: 'ghost', onClick: () => setShowBackup(false) }, '\u5173\u95ED'),\n ),\n },\n h(\n 'div',\n { className: 'mailharbor-kv' },\n h('dt', null, '\u5F00\u59CB\u65F6\u95F4'),\n h('dd', null, backup.startedAt ?? '\u2014'),\n h('dt', null, '\u4E0A\u6B21\u6210\u529F'),\n h('dd', null, backup.lastSuccessAt ?? '\u2014'),\n h('dt', null, '\u65B0\u589E'),\n h('dd', null, String(backup.added)),\n h('dt', null, '\u603B\u6570'),\n h('dd', null, String(backup.total)),\n ),\n h(\n 'div',\n { className: 'mailharbor-log' },\n backup.output.length === 0 ? '\uFF08\u7B49\u5F85\u8F93\u51FA\u2026\uFF09' : backup.output.join('\\n'),\n ),\n )\n : null,\n managerOpen\n ? h(\n Modal,\n {\n title: '\u9879\u76EE\u7BA1\u7406',\n onClose: () => setManagerOpen(false),\n wide: true,\n footer: h(\n 'div',\n { className: 'task-editor-foot' },\n h(\n 'span',\n { className: 'small muted' },\n '\u5220\u9664\u53EA\u79FB\u9664 MailHarbor \u7684\u9879\u76EE\u8BB0\u5F55\uFF0C\u6587\u4EF6\u5939\u4E0E DSH \u5DE5\u4F5C\u7A7A\u95F4\u4F1A\u4FDD\u7559\u3002',\n ),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => setManagerOpen(false) }, '\u5173\u95ED'),\n ),\n },\n managerProjects.length === 0\n ? h(\n 'p',\n { className: 'small muted' },\n '\u8FD8\u6CA1\u6709\u9879\u76EE\u3002\u53EF\u4EE5\u4ECE\u4E00\u5C01\u90AE\u4EF6\u7684\u300C\u52A0\u5165\u9879\u76EE \u2192 \u65B0\u5EFA\u9879\u76EE\u300D\u5F00\u59CB\u3002',\n )\n : h(\n 'div',\n { className: 'project-manager' },\n managerProjects.map((project) =>\n h(\n 'div',\n { key: project.id, className: 'project-manager-row' },\n h(\n 'div',\n { className: 'project-manager-main' },\n managerRename?.id === project.id\n ? h('input', {\n value: managerRename.name,\n autoFocus: true,\n onChange: (event: { target: { value: string } }) =>\n setManagerRename({ id: project.id, name: event.target.value }),\n onKeyDown: (event: { key: string }) => {\n if (event.key === 'Enter' && managerRename.name.trim() !== '') {\n void managerAction(() =>\n api.updateProject(project.id, managerRename.name.trim()),\n )\n }\n },\n })\n : h('strong', null, project.name),\n h(\n 'span',\n { className: 'small muted' },\n `${String(project.messages.length)} \u5C01\u6765\u6E90\u90AE\u4EF6 \u00B7 ${project.path}`,\n ),\n ),\n h(\n 'div',\n { className: 'project-manager-actions' },\n managerRename?.id === project.id\n ? h(\n 'button',\n {\n className: 'primary small',\n disabled: managerBusy || managerRename.name.trim() === '',\n onClick: () =>\n void managerAction(() =>\n api.updateProject(project.id, managerRename.name.trim()),\n ),\n },\n '\u4FDD\u5B58\u540D\u79F0',\n )\n : h(\n 'button',\n {\n className: 'ghost small',\n onClick: () => setManagerRename({ id: project.id, name: project.name }),\n },\n '\u91CD\u547D\u540D',\n ),\n h(\n 'button',\n {\n className: 'ghost small',\n onClick: () => {\n void api\n .openProject(project.id)\n .catch((caught: unknown) => setError(errorText(caught)))\n },\n },\n '\u6253\u5F00\u6587\u4EF6\u5939',\n ),\n managerConfirm === project.id\n ? h(\n 'span',\n { style: { display: 'inline-flex', gap: '6px' } },\n h(\n 'button',\n {\n className: 'ghost small danger',\n disabled: managerBusy,\n onClick: () =>\n void managerAction(async () => {\n await api.deleteProject(project.id)\n notice('\u9879\u76EE\u5DF2\u5220\u9664\uFF08\u6587\u4EF6\u5939\u4FDD\u7559\uFF09')\n }),\n },\n '\u786E\u8BA4\u5220\u9664',\n ),\n h(\n 'button',\n { className: 'ghost small', onClick: () => setManagerConfirm('') },\n '\u53D6\u6D88',\n ),\n )\n : h(\n 'button',\n {\n className: 'ghost small danger',\n onClick: () => setManagerConfirm(project.id),\n },\n '\u5220\u9664',\n ),\n ),\n ),\n ),\n ),\n )\n : null,\n projectPicker !== null\n ? h(\n Modal,\n {\n title: '\u52A0\u5165\u9879\u76EE',\n onClose: () => setProjectPicker(null),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', alignItems: 'center' } },\n h('button', { className: 'subtle', onClick: openManager }, '\u7BA1\u7406\u9879\u76EE\u2026'),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => setProjectPicker(null) }, '\u53D6\u6D88'),\n h(\n 'button',\n { className: 'primary', disabled: pickerBusy, onClick: () => void saveProjectPick() },\n pickerBusy ? '\u4FDD\u5B58\u4E2D\u2026' : pickerMode === 'new' ? '\u521B\u5EFA\u5E76\u52A0\u5165' : '\u52A0\u5165\u9879\u76EE',\n ),\n ),\n },\n h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '12px' } },\n h(\n 'div',\n { className: 'mailharbor-segment', role: 'tablist' },\n h(\n 'button',\n {\n className: pickerMode === 'existing' ? 'active' : '',\n disabled: pickerProjects.length === 0,\n onClick: () => setPickerMode('existing'),\n },\n '\u52A0\u5165\u5DF2\u6709\u9879\u76EE',\n ),\n h(\n 'button',\n {\n className: pickerMode === 'new' ? 'active' : '',\n onClick: () => setPickerMode('new'),\n },\n '\u65B0\u5EFA\u9879\u76EE',\n ),\n ),\n pickerMode === 'existing'\n ? h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, '\u9879\u76EE'),\n h(\n 'select',\n {\n value: pickerTarget,\n onChange: (event: { target: { value: string } }) => setPickerTarget(event.target.value),\n },\n pickerProjects.map((project) =>\n h(\n 'option',\n { key: project.id, value: project.id },\n `${project.name} \u00B7 ${project.messages.length} \u5C01`,\n ),\n ),\n ),\n h('p', { className: 'small muted' }, '\u53EA\u4F1A\u628A\u5F53\u524D\u90AE\u4EF6\u52A0\u5165\u8FD9\u4E2A\u9879\u76EE\uFF0C\u4E0D\u4F1A\u65B0\u5EFA\u9879\u76EE\u3002'),\n )\n : h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, '\u65B0\u9879\u76EE\u540D\u79F0'),\n h('input', {\n value: pickerNewName,\n placeholder: '\u9879\u76EE\u540D\u79F0',\n onChange: (event: { target: { value: string } }) => setPickerNewName(event.target.value),\n }),\n h(\n 'p',\n { className: 'small muted' },\n '\u4F1A\u521B\u5EFA\u65B0\u7684\u9879\u76EE\u6587\u4EF6\u5939\uFF0C\u5E76\u628A\u5F53\u524D\u90AE\u4EF6\u4F5C\u4E3A\u7B2C\u4E00\u5C01\u6765\u6E90\u90AE\u4EF6\u3002',\n ),\n ),\n h('p', { className: 'small muted' }, `\u6765\u6E90\u90AE\u4EF6\uFF1A${projectPicker.subject}`),\n ),\n )\n : null,\n extraction !== null\n ? h(\n Modal,\n {\n title: '\u63D0\u53D6\u4EFB\u52A1',\n onClose: () => setExtraction(null),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', alignItems: 'center' } },\n h('span', { className: 'small muted' }, '\u52FE\u9009\u8981\u4FDD\u5B58\u7684\u4EFB\u52A1\uFF1B\u4FDD\u5B58\u540E\u53EF\u5230\u300C\u4EFB\u52A1\u300D\u9762\u677F\u8DDF\u8FDB\u3002'),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => setExtraction(null) }, '\u53D6\u6D88'),\n h(\n 'button',\n {\n className: 'primary',\n disabled: extractBusy || extraction.checked.every((value) => !value),\n onClick: () => void saveExtraction(),\n },\n extractBusy ? '\u4FDD\u5B58\u4E2D\u2026' : '\u4FDD\u5B58\u4EFB\u52A1',\n ),\n ),\n },\n h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '8px' } },\n extraction.items.map((item, index) =>\n h(\n 'label',\n { key: `${item.title}:${String(index)}`, className: 'mailharbor-extract-row' },\n h('input', {\n type: 'checkbox',\n checked: extraction.checked[index] ?? false,\n onChange: () => {\n const checked = [...extraction.checked]\n checked[index] = !checked[index]\n setExtraction({ ...extraction, checked })\n },\n }),\n h(\n 'span',\n null,\n h('strong', null, item.title),\n h(\n 'span',\n { className: 'small muted' },\n [\n item.due === '' ? '' : `\u622A\u6B62 ${item.due}`,\n item.owner === '' ? '' : `\u8D1F\u8D23\u4EBA ${item.owner}`,\n item.notes,\n ]\n .filter((part) => part !== '')\n .join(' \u00B7 '),\n ),\n ),\n ),\n ),\n ),\n )\n : null,\n compose !== null && composeAccount !== null\n ? h(Composer, {\n account: composeAccount,\n initial: compose,\n onClose: () => setCompose(null),\n onSent: (message) => notice(message),\n })\n : null,\n showAdd\n ? h(AddAccountModal, {\n onClose: () => setShowAdd(false),\n onDone: (next) => {\n setState(next)\n setAccountScope(next.activeAccountId)\n refresh()\n },\n })\n : null,\n )\n}\n", "import { createElement as h, useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport type { Account, AiCard, AiThread, MessageDetail, Project } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { Modal } from './components.js'\nimport { Icon } from './icons.js'\nimport { Markdown } from './markdown.js'\nimport type { AiReplyInit } from './reply.js'\n\nexport interface AiRequest {\n kind: 'summary' | 'reply' | 'translate'\n nonce: number\n}\n\ntype Kind = 'summary' | 'reply' | 'translate' | 'answer'\n\ninterface AiStatus {\n available: boolean\n enabled: boolean\n provider: string\n model: string\n error?: string\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction textToHtml(text: string): string {\n return text\n .split(/\\n{2,}/)\n .map(\n (paragraph) =>\n `<p>${paragraph.trim().replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('\\n', '<br>')}</p>`,\n )\n .join('')\n}\n\nfunction summaryBlocks(text: string): { title: string; body: string }[] {\n const blocks: { title: string; body: string }[] = []\n let current: { title: string; lines: string[] } = { title: '', lines: [] }\n const push = (): void => {\n const body = current.lines.join('\\n').trim()\n if (current.title !== '' || body !== '') blocks.push({ title: current.title, body })\n current = { title: '', lines: [] }\n }\n for (const line of text.split('\\n')) {\n const heading =\n /^#{1,4}\\s+(.*)$/.exec(line) ?? /^(\u7ED3\u8BBA|\u9700\u8981\u4F60\u505A\u4EC0\u4E48|\u5173\u952E\u4FE1\u606F|\u5EFA\u8BAE\u56DE\u590D\u8981\u70B9)\\s*$/.exec(line)\n if (heading !== null) {\n push()\n current.title = heading[1] ?? ''\n } else {\n current.lines.push(line)\n }\n }\n push()\n return blocks\n}\n\nfunction suggestionsOf(summary: string): string {\n const match = /\u5EFA\u8BAE\u56DE\u590D\u8981\u70B9[\uFF1A:]?\\s*\\n([\\s\\S]*)$/.exec(summary)\n if (match === null) return '\u6839\u636E\u8FD9\u5C01\u90AE\u4EF6\u5199\u4E00\u5C01\u5F97\u4F53\u7684\u56DE\u590D\u3002'\n return `\u6839\u636E\u8FD9\u4E9B\u5EFA\u8BAE\u5199\u56DE\u590D\uFF1A\\n${(match[1] ?? '').trim()}`\n}\n\nconst KIND_LABEL: Record<Kind, string> = {\n summary: 'AI \u6458\u8981',\n reply: 'AI \u56DE\u590D',\n translate: 'AI \u7FFB\u8BD1',\n answer: 'AI \u56DE\u7B54',\n}\n\nfunction threadKey(detail: MessageDetail, source: 'local' | 'server'): string {\n return detail.messageId !== undefined && detail.messageId !== ''\n ? `mid:${detail.messageId}`\n : `${source}:${detail.id}`\n}\n\n/**\n * The per-mail AI workspace.\n *\n * Every output is a card stored on the Host, so closing the rail, switching\n * mail or restarting DSH never loses it. Cards end in an action: a summary can\n * spawn a reply, a reply can go to the composer or a draft, a translation can\n * be inserted, and the question box keeps the thread going.\n */\nexport function AiRail({\n account,\n detail,\n source,\n mailbox,\n request,\n onClose,\n onInsert,\n onSaveDraft,\n onNotice,\n}: {\n account: Account | null\n detail: MessageDetail | null\n source: 'local' | 'server'\n mailbox: string\n request: AiRequest | null\n onClose: () => void\n onInsert: (init: AiReplyInit) => void\n onSaveDraft: (init: AiReplyInit) => void\n onNotice: (message: string) => void\n}): ReactNode {\n const [status, setStatus] = useState<AiStatus | null>(null)\n const [thread, setThread] = useState<AiThread | null>(null)\n const [loading, setLoading] = useState(false)\n const [generating, setGenerating] = useState<Kind | null>(null)\n const [error, setError] = useState('')\n const [question, setQuestion] = useState('')\n const [confirmClear, setConfirmClear] = useState(false)\n const [project, setProject] = useState<Project | null>(null)\n const [projectOpen, setProjectOpen] = useState(false)\n const [projectName, setProjectName] = useState('')\n const [projectRoot, setProjectRoot] = useState('')\n const [projectBusy, setProjectBusy] = useState(false)\n const [projectWarnings, setProjectWarnings] = useState<string[]>([])\n const list = useRef<HTMLDivElement>(null)\n const lastNonce = useRef(0)\n const key = detail === null ? '' : threadKey(detail, source)\n\n useEffect(() => {\n if (account === null) return\n let cancelled = false\n api\n .aiStatus(account.id)\n .then((next) => {\n if (!cancelled) setStatus(next)\n })\n .catch(() => {\n if (!cancelled)\n setStatus({ available: false, enabled: false, provider: '', model: '', error: '\u65E0\u6CD5\u8BFB\u53D6 AI \u72B6\u6001' })\n })\n return () => {\n cancelled = true\n }\n }, [account])\n\n useEffect(() => {\n if (account === null || key === '') {\n setThread(null)\n return\n }\n let cancelled = false\n setLoading(true)\n api\n .aiThread(account.id, key)\n .then((result) => {\n if (!cancelled) setThread(result.thread)\n })\n .catch(() => {\n if (!cancelled) setThread(null)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [account, key])\n\n const generate = useCallback(\n async (kind: Kind, extra: Record<string, unknown> = {}): Promise<void> => {\n if (detail === null || account === null) return\n setGenerating(kind)\n setError('')\n try {\n const result = await api.aiAddCard({\n accountId: detail.accountId,\n key,\n kind,\n source,\n id: detail.id,\n mailbox,\n ...extra,\n })\n setThread(result.thread)\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setGenerating(null)\n }\n },\n [detail, account, key, source, mailbox],\n )\n\n // The reader's AI buttons ask the rail to run an action.\n useEffect(() => {\n if (request === null || request.nonce === lastNonce.current) return\n lastNonce.current = request.nonce\n if (detail !== null) void generate(request.kind)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [request])\n\n useEffect(() => {\n const element = list.current\n if (element !== null) element.scrollTop = element.scrollHeight\n }, [thread, generating])\n\n // Which project, if any, is this mail linked to?\n useEffect(() => {\n if (detail === null || account === null) {\n setProject(null)\n return\n }\n let cancelled = false\n api\n .projectFor(detail.accountId, key)\n .then((result) => {\n if (!cancelled) setProject(result.project)\n })\n .catch(() => {\n if (!cancelled) setProject(null)\n })\n return () => {\n cancelled = true\n }\n }, [detail, account, key, thread])\n\n const openProject = async (): Promise<void> => {\n setProjectOpen(true)\n setProjectWarnings([])\n try {\n const settings = await api.settings()\n setProjectRoot(settings.projects.root)\n setProjectName(detail?.subject.replace(/^(re|fwd):\\s*/i, '').slice(0, 80) ?? '')\n } catch {\n // The dialog still works with defaults.\n }\n }\n\n const conversation = (): string =>\n (thread?.cards ?? [])\n .map(\n (card) =>\n `### ${KIND_LABEL[card.kind as Kind] ?? 'AI'} \u00B7 ${new Date(card.createdAt).toLocaleString()}\\n\\n${card.output}`,\n )\n .join('\\n\\n')\n\n const transfer = async (): Promise<void> => {\n if (project === null || detail === null || account === null) return\n setProjectBusy(true)\n setProjectWarnings([])\n try {\n await api.transferProject(project.id, {\n accountId: account.id,\n key,\n conversation: conversation() === '' ? '\uFF08\u6682\u65E0\u65B0\u7684 AI \u8BB0\u5F55\uFF09' : conversation(),\n })\n onNotice('\u5DF2\u8FFD\u52A0\u5230\u9879\u76EE\u5BF9\u8BDD')\n setProjectOpen(false)\n } catch (caught) {\n setProjectWarnings([errorText(caught)])\n } finally {\n setProjectBusy(false)\n }\n }\n\n const create = async (): Promise<void> => {\n if (detail === null || account === null) return\n setProjectBusy(true)\n setProjectWarnings([])\n try {\n const result = await api.createProject({\n accountId: account.id,\n name: projectName.trim() === '' ? detail.subject : projectName.trim(),\n root: projectRoot,\n conversation: conversation() === '' ? '\uFF08\u8FD8\u6CA1\u6709 AI \u8BB0\u5F55\uFF09' : conversation(),\n message: { key, subject: detail.subject, date: detail.date },\n })\n setProject(result.project)\n setProjectWarnings(result.warnings)\n onNotice(`\u9879\u76EE\u5DF2\u521B\u5EFA\uFF1A${result.project.path}`)\n if (result.warnings.length === 0) setProjectOpen(false)\n } catch (caught) {\n setProjectWarnings([errorText(caught)])\n } finally {\n setProjectBusy(false)\n }\n }\n\n const replyInit = (card: AiCard): AiReplyInit => {\n const subject =\n card.meta?.subject ??\n (detail === null ? '' : /^re:/i.test(detail.subject) ? detail.subject : `Re: ${detail.subject}`)\n return {\n to: card.meta?.to ?? detail?.from.address ?? '',\n cc: '',\n subject,\n html: card.html ?? textToHtml(card.output),\n ...(card.meta?.inReplyTo !== undefined && card.meta.inReplyTo !== ''\n ? { inReplyTo: card.meta.inReplyTo }\n : {}),\n ...(card.meta?.references !== undefined && card.meta.references !== ''\n ? { references: card.meta.references }\n : {}),\n }\n }\n\n const copy = (card: AiCard): void => {\n void navigator.clipboard?.writeText(card.output).then(() => onNotice('\u5DF2\u590D\u5236'))\n }\n\n const remove = async (card: AiCard): Promise<void> => {\n if (account === null) return\n try {\n const result = await api.aiDeleteCard(account.id, key, card.id)\n setThread(result.thread)\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const clear = async (): Promise<void> => {\n if (account === null || key === '') return\n try {\n await api.aiClearThread(account.id, key)\n setThread(null)\n setConfirmClear(false)\n onNotice('\u5DF2\u6E05\u9664\u8FD9\u5C01\u90AE\u4EF6\u7684 AI \u8BB0\u5F55')\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const ask = async (): Promise<void> => {\n const text = question.trim()\n if (text === '' || generating !== null) return\n setQuestion('')\n await generate('answer', { instruction: text })\n }\n\n const disabled = status !== null && (!status.available || !status.enabled)\n const cards = thread?.cards ?? []\n\n return h(\n 'aside',\n { className: 'mailharbor-ai', 'aria-label': 'AI \u52A9\u624B' },\n h(\n 'div',\n { className: 'mailharbor-ai-head' },\n h(Icon, { name: 'sparkles', size: 15 }),\n h('strong', null, 'AI \u52A9\u624B'),\n status === null || status.model === '' ? null : h('span', { className: 'badge' }, status.model),\n h('span', { className: 'spacer' }),\n confirmClear\n ? h(\n 'span',\n { className: 'mailharbor-ai-confirm' },\n h('button', { className: 'subtle', onClick: () => void clear() }, '\u786E\u8BA4\u6E05\u9664'),\n h('button', { className: 'subtle', onClick: () => setConfirmClear(false) }, '\u53D6\u6D88'),\n )\n : h(\n 'button',\n {\n className: 'subtle icon',\n title: cards.length === 0 ? '\u5173\u95ED' : '\u6E05\u9664\u8FD9\u5C01\u90AE\u4EF6\u7684\u8BB0\u5F55',\n onClick: () => (cards.length === 0 ? onClose() : setConfirmClear(true)),\n },\n h(Icon, { name: cards.length === 0 ? 'close' : 'trash', size: 14 }),\n ),\n h(\n 'button',\n { className: 'subtle icon', title: '\u6536\u8D77', onClick: onClose },\n h(Icon, { name: 'chevronRight', size: 14 }),\n ),\n ),\n detail === null\n ? h(\n 'div',\n { className: 'mailharbor-ai-empty' },\n h(Icon, { name: 'sparkles', size: 26 }),\n h('div', { className: 'title' }, '\u5148\u9009\u4E00\u5C01\u90AE\u4EF6'),\n h('div', { className: 'small' }, '\u9009\u4E2D\u90AE\u4EF6\u540E\uFF0C\u53EF\u5728\u8FD9\u91CC\u751F\u6210\u6458\u8981\u3001\u56DE\u590D\u548C\u7FFB\u8BD1\uFF0C\u8BB0\u5F55\u4F1A\u4E00\u76F4\u4FDD\u7559\u3002'),\n )\n : h(\n 'div',\n { className: 'mailharbor-ai-context' },\n h('span', { className: 'small' }, '\u8DDF\u968F\u5F53\u524D\u90AE\u4EF6'),\n h('strong', null, detail.subject),\n h(\n 'span',\n { className: 'small muted' },\n project === null ? 'AI \u53EA\u770B\u5230\u8FD9\u5C01\u90AE\u4EF6' : `\u9879\u76EE\uFF1A${project.name}`,\n ),\n ),\n disabled && detail !== null\n ? h('div', { className: 'mailharbor-ai-warn' }, status?.error ?? 'AI \u5DF2\u5173\u95ED\uFF0C\u8BF7\u5230\u8BBE\u7F6E\u91CC\u5F00\u542F')\n : null,\n detail === null\n ? null\n : h(\n 'div',\n { className: 'mailharbor-ai-quick' },\n h(\n 'button',\n {\n className: 'ghost',\n disabled: disabled || generating !== null,\n onClick: () => void generate('summary'),\n },\n generating === 'summary' ? '\u603B\u7ED3\u4E2D\u2026' : '\u6458\u8981',\n ),\n h(\n 'button',\n {\n className: 'ghost',\n disabled: disabled || generating !== null,\n onClick: () => void generate('reply'),\n },\n generating === 'reply' ? '\u8D77\u8349\u4E2D\u2026' : '\u56DE\u590D',\n ),\n h(\n 'button',\n {\n className: 'ghost',\n disabled: disabled || generating !== null,\n onClick: () => void generate('translate', { target: 'en' }),\n },\n generating === 'translate' ? '\u7FFB\u8BD1\u4E2D\u2026' : '\u7FFB\u8BD1',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: () => void openProject() },\n h(Icon, { name: 'folder', size: 13 }),\n '\u9879\u76EE',\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-ai-list', ref: list },\n loading ? h('div', { className: 'mailharbor-ai-empty small' }, '\u6B63\u5728\u8BFB\u53D6\u8BB0\u5F55\u2026') : null,\n !loading && detail !== null && cards.length === 0 && generating === null\n ? h(\n 'div',\n { className: 'mailharbor-ai-empty' },\n h('div', { className: 'title' }, '\u8FD9\u5C01\u90AE\u4EF6\u8FD8\u6CA1\u6709 AI \u8BB0\u5F55'),\n h(\n 'div',\n { className: 'small' },\n '\u70B9\u4E0A\u9762\u7684\u300C\u6458\u8981\u300D\u5F00\u59CB\uFF1B\u751F\u6210\u7684\u5185\u5BB9\u4F1A\u4FDD\u5B58\u5728\u8FD9\u91CC\uFF0C\u5173\u6389\u9762\u677F\u4E5F\u4E0D\u4F1A\u4E22\u3002',\n ),\n )\n : null,\n cards.map((card) =>\n h(\n 'article',\n { className: 'mailharbor-ai-card', key: card.id },\n h(\n 'div',\n { className: 'mailharbor-ai-card-head' },\n h('span', null, KIND_LABEL[card.kind as Kind] ?? 'AI'),\n h('span', { className: 'muted small' }, new Date(card.createdAt).toLocaleTimeString()),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n {\n className: 'subtle icon',\n title: '\u5220\u9664',\n onClick: () => void remove(card),\n },\n h(Icon, { name: 'close', size: 12 }),\n ),\n ),\n card.kind === 'summary'\n ? h(\n 'div',\n { className: 'mailharbor-ai-summary' },\n summaryBlocks(card.output).map((block, index) =>\n h(\n 'section',\n { key: `${block.title}:${String(index)}` },\n block.title === '' ? null : h('h4', null, block.title),\n h(Markdown, { text: block.body }),\n ),\n ),\n )\n : h('div', { className: 'mailharbor-ai-text' }, h(Markdown, { text: card.output })),\n h(\n 'div',\n { className: 'mailharbor-ai-card-actions' },\n card.kind === 'summary'\n ? h(\n 'button',\n {\n className: 'ghost',\n disabled: generating !== null,\n onClick: () => void generate('reply', { instruction: suggestionsOf(card.output) }),\n },\n '\u7528\u8FD9\u4E9B\u8981\u70B9\u56DE\u590D',\n )\n : null,\n card.kind === 'reply' || card.kind === 'translate'\n ? h(\n 'button',\n { className: 'ghost', onClick: () => onInsert(replyInit(card)) },\n card.kind === 'translate' ? '\u63D2\u5165\u56DE\u590D' : '\u63D2\u5165\u6B63\u6587',\n )\n : null,\n card.kind === 'reply'\n ? h('button', { className: 'ghost', onClick: () => onSaveDraft(replyInit(card)) }, '\u5B58\u8349\u7A3F')\n : null,\n card.kind === 'answer'\n ? h(\n 'button',\n {\n className: 'ghost',\n onClick: () => setQuestion(card.output.slice(0, 80)),\n },\n '\u7EE7\u7EED\u8FFD\u95EE',\n )\n : null,\n h('span', { className: 'spacer' }),\n h('button', { className: 'subtle', onClick: () => copy(card) }, '\u590D\u5236'),\n ),\n ),\n ),\n generating !== null\n ? h(\n 'article',\n { className: 'mailharbor-ai-card generating' },\n h('div', { className: 'mailharbor-ai-card-head' }, h('span', null, KIND_LABEL[generating])),\n h('div', { className: 'mailharbor-ai-text muted' }, '\u6B63\u5728\u751F\u6210\u2026'),\n )\n : null,\n error === '' ? null : h('div', { className: 'mailharbor-ai-error' }, error),\n ),\n projectOpen\n ? h(\n Modal,\n {\n title: project === null ? '\u8F6C\u5230\u9879\u76EE' : `\u9879\u76EE\uFF1A${project.name}`,\n onClose: () => setProjectOpen(false),\n footer: h(\n 'div',\n { style: { display: 'flex', gap: '8px', width: '100%', alignItems: 'center' } },\n projectWarnings.length === 0\n ? h(\n 'span',\n { className: 'small muted' },\n project === null ? '\u628A\u5F53\u524D AI \u8BB0\u5F55\u5E26\u8FDB\u4E00\u4E2A\u65B0\u5DE5\u4F5C\u7A7A\u95F4' : '\u628A\u5F53\u524D AI \u8BB0\u5F55\u8FFD\u52A0\u5230\u9879\u76EE\u5BF9\u8BDD',\n )\n : h(\n 'span',\n { className: 'small', style: { color: 'var(--m-warn)' } },\n projectWarnings.join('\uFF1B'),\n ),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => setProjectOpen(false) }, '\u5173\u95ED'),\n project === null\n ? h(\n 'button',\n { className: 'primary', disabled: projectBusy, onClick: () => void create() },\n projectBusy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u9879\u76EE',\n )\n : h(\n 'button',\n { className: 'primary', disabled: projectBusy, onClick: () => void transfer() },\n projectBusy ? '\u8FFD\u52A0\u4E2D\u2026' : '\u8FFD\u52A0\u5F53\u524D\u8BB0\u5F55',\n ),\n ),\n },\n project === null\n ? h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, '\u9879\u76EE\u540D\u79F0'),\n h('input', {\n value: projectName,\n onChange: (event: { target: { value: string } }) => setProjectName(event.target.value),\n }),\n ),\n h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, '\u9879\u76EE\u76EE\u5F55\uFF08\u9ED8\u8BA4\u53EF\u5728\u8BBE\u7F6E\u91CC\u6539\uFF09'),\n h(\n 'div',\n { style: { display: 'flex', gap: '6px' } },\n h('input', {\n value: projectRoot,\n onChange: (event: { target: { value: string } }) => setProjectRoot(event.target.value),\n }),\n h(\n 'button',\n {\n className: 'ghost',\n title: '\u4ECE\u6587\u4EF6\u7BA1\u7406\u5668\u9009\u62E9',\n onClick: () => {\n void api\n .pickDirectory()\n .then((result) => {\n if (result.path !== null) setProjectRoot(result.path)\n })\n .catch((caught: unknown) => setProjectWarnings([errorText(caught)]))\n },\n },\n h(Icon, { name: 'folder', size: 13 }),\n '\u6D4F\u89C8\u2026',\n ),\n ),\n ),\n h(\n 'p',\n { className: 'small muted' },\n `\u4F1A\u521B\u5EFA\u300C${projectName.trim() === '' ? '\u9879\u76EE' : projectName.trim()}\u300D\u6587\u4EF6\u5939\uFF0C\u5199\u5165 BRIEF.md \u548C\u5F53\u524D ${String(thread?.cards.length ?? 0)} \u6761 AI \u8BB0\u5F55\uFF0C\u5E76\u5728\u4FA7\u680F\u6CE8\u518C\u5DE5\u4F5C\u7A7A\u95F4\u3001\u5F00\u4E00\u4E2A\u4F1A\u8BDD\u3002`,\n ),\n )\n : h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '8px' } },\n h(\n 'dl',\n { className: 'mailharbor-kv' },\n h('dt', null, '\u76EE\u5F55'),\n h('dd', null, project.path),\n h('dt', null, 'AI \u8BB0\u5F55'),\n h('dd', null, `${String(thread?.cards.length ?? 0)} \u6761`),\n ),\n project.sessionId === ''\n ? h('p', { className: 'small muted' }, '\u4F1A\u8BDD\u672A\u521B\u5EFA\uFF1A\u5F53\u524D\u7EC4\u5408\u6CA1\u6709 sessions \u670D\u52A1\u3002')\n : null,\n h(\n 'p',\n { className: 'small muted' },\n '\u300C\u8FFD\u52A0\u5F53\u524D\u8BB0\u5F55\u300D\u4F1A\u628A\u5DE5\u4F5C\u53F0\u91CC\u7684\u5361\u7247\u5199\u5165\u9879\u76EE\u7684 CONVERSATION.md\u3002',\n ),\n ),\n )\n : null,\n detail === null\n ? null\n : h(\n 'form',\n {\n className: 'mailharbor-ai-ask',\n onSubmit: (event: { preventDefault: () => void }) => {\n event.preventDefault()\n void ask()\n },\n },\n h('input', {\n value: question,\n placeholder: '\u95EE\u8FD9\u5C01\u90AE\u4EF6\uFF0C\u4F8B\u5982\uFF1A\u8C01\u9700\u8981\u5728\u4EC0\u4E48\u65F6\u5019\u505A\u4EC0\u4E48\uFF1F',\n 'aria-label': '\u95EE AI',\n disabled: disabled || generating !== null,\n onChange: (event: { target: { value: string } }) => setQuestion(event.target.value),\n }),\n h(\n 'button',\n {\n className: 'primary icon',\n type: 'submit',\n disabled: disabled || generating !== null || question.trim() === '',\n },\n h(Icon, { name: 'send', size: 14 }),\n ),\n ),\n )\n}\n", "import { createElement as h, useEffect, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport function Avatar({ email, size = 26 }: { email: string; size?: number }): ReactNode {\n const letter = (email.trim()[0] ?? '?').toUpperCase()\n return h(\n 'span',\n {\n className: 'avatar',\n style: {\n width: `${String(size)}px`,\n height: `${String(size)}px`,\n fontSize: `${String(Math.round(size * 0.42))}px`,\n },\n 'aria-hidden': 'true',\n },\n letter,\n )\n}\n\nexport function Field({\n label,\n children,\n hint,\n}: {\n label: string\n children?: ReactNode\n hint?: string\n}): ReactNode {\n return h(\n 'div',\n { className: 'mailharbor-field' },\n h('label', null, label),\n children,\n hint === undefined ? null : h('span', { className: 'small muted' }, hint),\n )\n}\n\nexport function Toggle({\n checked,\n onChange,\n label,\n}: {\n checked: boolean\n onChange: (value: boolean) => void\n label: string\n}): ReactNode {\n return h(\n 'label',\n { className: 'mailharbor-toggle' },\n h('input', {\n type: 'checkbox',\n checked,\n onChange: (event: { target: { checked: boolean } }) => {\n onChange(event.target.checked)\n },\n }),\n label,\n )\n}\n\n/** Portal root that keeps the shell's theme variables in scope. */\nfunction portalRoot(): HTMLElement {\n const existing = document.getElementById('mailharbor-portal')\n if (existing !== null) return existing\n const element = document.createElement('div')\n element.id = 'mailharbor-portal'\n element.className = 'mailharbor mailharbor-portal'\n document.body.append(element)\n return element\n}\n\nexport function Modal({\n title,\n children,\n footer,\n onClose,\n wide = false,\n}: {\n title: string\n children?: ReactNode\n footer?: ReactNode\n onClose: () => void\n wide?: boolean\n}): ReactNode {\n useEffect(() => {\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKey)\n return () => {\n window.removeEventListener('keydown', onKey)\n }\n }, [onClose])\n return createPortal(\n h(\n 'div',\n {\n className: 'mailharbor-modal-mask',\n onMouseDown: (event: { target: unknown; currentTarget: unknown }) => {\n if (event.target === event.currentTarget) onClose()\n },\n },\n h(\n 'div',\n {\n className: 'mailharbor-modal',\n style: wide ? { width: 'min(920px, 100%)' } : undefined,\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-label': title,\n },\n h(\n 'header',\n null,\n title,\n h('span', { className: 'spacer' }),\n h('button', { className: 'subtle', onClick: onClose, 'aria-label': '\u5173\u95ED' }, '\u2715'),\n ),\n h('div', { className: 'content' }, children),\n footer === undefined ? null : h('footer', null, footer),\n ),\n ),\n portalRoot(),\n )\n}\n\nexport function ErrorBar({ message, onDismiss }: { message: string; onDismiss: () => void }): ReactNode {\n return h(\n 'div',\n { className: 'error', role: 'alert' },\n h('span', null, message),\n h('span', { className: 'spacer' }),\n h('button', { className: 'subtle', onClick: onDismiss }, '\u5173\u95ED'),\n )\n}\n\nconst DAY = 86_400_000\n\n/** Compact list timestamp: time today, month-day this year, else the date. */\nexport function shortDate(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso.slice(0, 16)\n const now = new Date()\n const sameDay =\n date.getFullYear() === now.getFullYear() &&\n date.getMonth() === now.getMonth() &&\n date.getDate() === now.getDate()\n const pad = (value: number): string => String(value).padStart(2, '0')\n if (sameDay) return `${pad(date.getHours())}:${pad(date.getMinutes())}`\n if (date.getFullYear() === now.getFullYear()) return `${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n return `${String(date.getFullYear())}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n}\n\n/** Full timestamp for the reader header. */\nexport function longDate(iso: string): string {\n const date = new Date(iso)\n if (Number.isNaN(date.getTime())) return iso\n return date.toLocaleString(undefined, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\nexport function isFresh(iso: string, windowMs = DAY): boolean {\n const time = new Date(iso).getTime()\n return !Number.isNaN(time) && Date.now() - time < windowMs\n}\n\nexport function formatBytes(size: number): string {\n if (!Number.isFinite(size) || size <= 0) return ''\n if (size < 1024) return `${String(size)} B`\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`\n return `${(size / 1024 / 1024).toFixed(1)} MB`\n}\n", "import { createElement as h, type ReactNode } from 'react'\n\nconst PATHS: Record<string, ReactNode> = {\n refresh: h('path', { d: 'M20 11a8 8 0 1 0-2.3 5.7M20 5v6h-6' }),\n plus: h('path', { d: 'M12 5v14M5 12h14' }),\n compose: h('path', { d: 'M4 20h4l10.5-10.5a2.1 2.1 0 0 0-3-3L5 17v3zM13.5 6.5l3 3' }),\n archive: h(\n 'g',\n null,\n h('rect', { x: 3, y: 4, width: 18, height: 5, rx: 1.5 }),\n h('path', { d: 'M5 9v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V9M10 13h4' }),\n ),\n paperclip: h('path', {\n d: 'M20 11.5 12 19.5a5 5 0 0 1-7-7l8-8a3.3 3.3 0 0 1 4.7 4.7l-8 8a1.7 1.7 0 0 1-2.4-2.4l7.3-7.3',\n }),\n mail: h(\n 'g',\n null,\n h('rect', { x: 3, y: 5, width: 18, height: 14, rx: 2.5 }),\n h('path', { d: 'm4 7 7.1 5a1.6 1.6 0 0 0 1.8 0L20 7' }),\n ),\n search: h('path', { d: 'M11 18a7 7 0 1 0 0-14 7 7 0 0 0 0 14zM20 20l-4-4' }),\n reply: h('path', { d: 'M9 7 4 12l5 5M4 12h9a6 6 0 0 1 6 6v1' }),\n replyAll: h('path', { d: 'm9 7-5 5 5 5M14 7l-5 5 5 5M13 12h5a5 5 0 0 1 5 5' }),\n forward: h('path', { d: 'm15 7 5 5-5 5M20 12h-9a6 6 0 0 0-6 6v1' }),\n check: h('path', { d: 'm5 13 4 4L19 7' }),\n image: h(\n 'g',\n null,\n h('rect', { x: 3, y: 4, width: 18, height: 16, rx: 2 }),\n h('circle', { cx: 8.5, cy: 9.5, r: 1.5 }),\n h('path', { d: 'm4 18 5-5 4 4 3-3 4 4' }),\n ),\n close: h('path', { d: 'M6 6l12 12M18 6 6 18' }),\n chevronLeft: h('path', { d: 'm14 6-6 6 6 6' }),\n chevronRight: h('path', { d: 'm10 6 6 6-6 6' }),\n sparkles: h(\n 'g',\n null,\n h('path', { d: 'm12 3 1.8 4.6L18.5 9l-4.7 1.4L12 15l-1.8-4.6L5.5 9l4.7-1.4z' }),\n h('path', { d: 'M18.5 15.5 19.3 18l2.2.8-2.2.7-.8 2.5-.8-2.5-2.2-.7 2.2-.8z' }),\n ),\n trash: h(\n 'g',\n null,\n h('path', {\n d: 'M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6.5 7l.8 12a1 1 0 0 0 1 .9h7.4a1 1 0 0 0 1-.9l.8-12',\n }),\n h('path', { d: 'M10 11v6M14 11v6' }),\n ),\n send: h('path', { d: 'm4 4 17 8-17 8 3.6-8z M7.6 12H21' }),\n list: h(\n 'g',\n null,\n h('path', { d: 'M8 6h12M8 12h12M8 18h12' }),\n h('path', { d: 'M4 6h.01M4 12h.01M4 18h.01' }),\n ),\n folder: h('path', {\n d: 'M3.5 6.5A1.5 1.5 0 0 1 5 5h4l2 2.5h8A1.5 1.5 0 0 1 20.5 9v8.5A1.5 1.5 0 0 1 19 19H5a1.5 1.5 0 0 1-1.5-1.5z',\n }),\n calendar: h(\n 'g',\n null,\n h('rect', { x: 3.5, y: 5, width: 17, height: 15.5, rx: 2 }),\n h('path', { d: 'M3.5 9.5h17M8 3.5v3M16 3.5v3' }),\n ),\n checklist: h(\n 'g',\n null,\n h('path', { d: 'M4 6.5 5.5 8 8 5M4 12.5 5.5 14 8 11M4 18.5 5.5 20 8 17' }),\n h('path', { d: 'M11 6.5h9M11 12.5h9M11 18.5h9' }),\n ),\n}\n\nexport function Icon({ name, size = 16 }: { name: keyof typeof PATHS | string; size?: number }): ReactNode {\n return h(\n 'svg',\n {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.7,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n 'aria-hidden': 'true',\n focusable: 'false',\n },\n PATHS[name] ?? null,\n )\n}\n", "import { createElement as h, type ReactNode } from 'react'\n\n/**\n * Small Markdown renderer for AI output.\n *\n * Supports headings, paragraphs, bold/italic/strikethrough, inline code,\n * fenced code blocks, links, lists and blockquotes. It builds React nodes, so\n * raw HTML in a model answer is shown as text, never executed.\n */\n\nconst INLINE =\n /\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)|\\*\\*([^*]+)\\*\\*|__([^_]+)__|`([^`]+)`|~~([^~]+)~~|\\*([^*]+)\\*|_([^_]+)_/g\n\nfunction inline(text: string, keyPrefix: string): ReactNode[] {\n const nodes: ReactNode[] = []\n let last = 0\n let index = 0\n INLINE.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = INLINE.exec(text)) !== null) {\n if (match.index > last) nodes.push(text.slice(last, match.index))\n const key = `${keyPrefix}-${String(index++)}`\n if (match[1] !== undefined && match[2] !== undefined) {\n nodes.push(h('a', { key, href: match[2], target: '_blank', rel: 'noreferrer noopener' }, match[1]))\n } else if (match[3] !== undefined) {\n nodes.push(h('strong', { key }, match[3]))\n } else if (match[4] !== undefined) {\n nodes.push(h('strong', { key }, match[4]))\n } else if (match[5] !== undefined) {\n nodes.push(h('code', { key }, match[5]))\n } else if (match[6] !== undefined) {\n nodes.push(h('del', { key }, match[6]))\n } else if (match[7] !== undefined) {\n nodes.push(h('em', { key }, match[7]))\n } else if (match[8] !== undefined) {\n nodes.push(h('em', { key }, match[8]))\n }\n last = INLINE.lastIndex\n }\n if (last < text.length) nodes.push(text.slice(last))\n return nodes\n}\n\nexport function Markdown({ text }: { text: string }): ReactNode {\n const lines = text.replace(/\\r\\n/g, '\\n').split('\\n')\n const blocks: ReactNode[] = []\n let index = 0\n let key = 0\n\n const isBlockStart = (line: string): boolean =>\n /^```/.test(line) ||\n /^#{1,6}\\s+/.test(line) ||\n /^>\\s?/.test(line) ||\n /^([-*+]|\\d+\\.)\\s+/.test(line) ||\n /^(-{3,}|\\*{3,}|_{3,})$/.test(line)\n\n while (index < lines.length) {\n const line = lines[index] ?? ''\n const k = `b${String(key++)}`\n\n if (line.trim() === '') {\n index += 1\n continue\n }\n\n if (/^```/.test(line)) {\n const code: string[] = []\n index += 1\n while (index < lines.length && !/^```/.test(lines[index] ?? '')) {\n code.push(lines[index] ?? '')\n index += 1\n }\n index += 1\n blocks.push(h('pre', { key: k }, h('code', null, code.join('\\n'))))\n continue\n }\n\n if (/^(-{3,}|\\*{3,}|_{3,})$/.test(line.trim())) {\n blocks.push(h('hr', { key: k }))\n index += 1\n continue\n }\n\n const heading = /^(#{1,6})\\s+(.*)$/.exec(line)\n if (heading !== null) {\n const level = Math.min(6, (heading[1] ?? '#').length)\n blocks.push(h(`h${String(level)}`, { key: k }, inline(heading[2] ?? '', k)))\n index += 1\n continue\n }\n\n if (/^>\\s?/.test(line)) {\n const quote: string[] = []\n while (index < lines.length && /^>\\s?/.test(lines[index] ?? '')) {\n quote.push((lines[index] ?? '').replace(/^>\\s?/, ''))\n index += 1\n }\n blocks.push(h('blockquote', { key: k }, h('p', null, inline(quote.join(' '), k))))\n continue\n }\n\n if (/^([-*+]|\\d+\\.)\\s+/.test(line)) {\n const ordered = /^\\d+\\.\\s+/.test(line)\n const items: string[] = []\n while (index < lines.length && /^([-*+]|\\d+\\.)\\s+/.test(lines[index] ?? '')) {\n items.push((lines[index] ?? '').replace(/^([-*+]|\\d+\\.)\\s+/, ''))\n index += 1\n }\n blocks.push(\n h(\n ordered ? 'ol' : 'ul',\n { key: k },\n items.map((item, itemIndex) =>\n h('li', { key: `${k}-${String(itemIndex)}` }, inline(item, `${k}-${String(itemIndex)}`)),\n ),\n ),\n )\n continue\n }\n\n const paragraph: string[] = []\n while (index < lines.length) {\n const current = lines[index] ?? ''\n if (current.trim() === '' || (paragraph.length > 0 && isBlockStart(current))) break\n paragraph.push(current)\n index += 1\n }\n blocks.push(h('p', { key: k }, inline(paragraph.join(' '), k)))\n }\n\n if (blocks.length === 0) return null\n return h('div', { className: 'mailharbor-markdown' }, blocks)\n}\n", "import { createElement as h, useState, type ReactNode } from 'react'\nimport type { Account, AppState } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { Field, Modal, Toggle } from './components.js'\n\nfunction domainOf(email: string): string {\n return email.split('@')[1] ?? 'example.com'\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nexport function AddAccountForm({\n onDone,\n onCancel,\n}: {\n onDone: (state: AppState) => void\n onCancel?: () => void\n}): ReactNode {\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [label, setLabel] = useState('')\n const [remember, setRemember] = useState(true)\n const [advanced, setAdvanced] = useState(false)\n const [imapHost, setImapHost] = useState('')\n const [imapPort, setImapPort] = useState('993')\n const [imapSecure, setImapSecure] = useState(true)\n const [smtpHost, setSmtpHost] = useState('')\n const [smtpPort, setSmtpPort] = useState('465')\n const [smtpSecure, setSmtpSecure] = useState(true)\n const [fromName, setFromName] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n const submit = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const domain = domainOf(email)\n const { state } = await api.addAccount({\n email: email.trim(),\n password,\n remember,\n ...(label.trim() === '' ? {} : { label: label.trim() }),\n ...(advanced\n ? {\n imap: {\n host: imapHost.trim() === '' ? `imap.${domain}` : imapHost.trim(),\n port: Number(imapPort) || 993,\n secure: imapSecure,\n },\n smtp: {\n host: smtpHost.trim() === '' ? `smtp.${domain}` : smtpHost.trim(),\n port: Number(smtpPort) || 465,\n secure: smtpSecure,\n ...(fromName.trim() === '' ? {} : { fromName: fromName.trim() }),\n },\n }\n : {}),\n })\n onDone(state)\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u6DFB\u52A0\u90AE\u7BB1\u8D26\u53F7'),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u90AE\u7BB1\u5730\u5740' },\n h('input', {\n type: 'email',\n value: email,\n placeholder: 'you@example.com',\n onChange: (event: { target: { value: string } }) => setEmail(event.target.value),\n autoFocus: true,\n }),\n ),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n }),\n ),\n ),\n h(\n Field,\n { label: '\u663E\u793A\u540D\u79F0\uFF08\u53EF\u9009\uFF09' },\n h('input', {\n value: label,\n placeholder: '\u5DE5\u4F5C\u90AE\u7BB1',\n onChange: (event: { target: { value: string } }) => setLabel(event.target.value),\n }),\n ),\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801\uFF08\u5199\u5165\u7CFB\u7EDF\u94A5\u5319\u4E32\uFF09' }),\n h(\n 'button',\n { className: 'ghost', onClick: () => setAdvanced(!advanced) },\n advanced ? '\u9690\u85CF\u9AD8\u7EA7\u8BBE\u7F6E' : '\u9AD8\u7EA7\u8BBE\u7F6E\uFF08\u670D\u52A1\u5668\u4E0E\u7AEF\u53E3\uFF09',\n ),\n advanced\n ? h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'IMAP \u4E3B\u673A' },\n h('input', {\n value: imapHost,\n placeholder: `imap.${domainOf(email)}`,\n onChange: (event: { target: { value: string } }) => setImapHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: imapPort,\n inputMode: 'numeric',\n onChange: (event: { target: { value: string } }) => setImapPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: imapSecure, onChange: setImapSecure, label: 'TLS' }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'SMTP \u4E3B\u673A' },\n h('input', {\n value: smtpHost,\n placeholder: `smtp.${domainOf(email)}`,\n onChange: (event: { target: { value: string } }) => setSmtpHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: smtpPort,\n inputMode: 'numeric',\n onChange: (event: { target: { value: string } }) => setSmtpPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: smtpSecure, onChange: setSmtpSecure, label: 'TLS' }),\n ),\n h(\n Field,\n { label: '\u53D1\u4EF6\u4EBA\u540D\u79F0\uFF08\u53EF\u9009\uFF09' },\n h('input', {\n value: fromName,\n onChange: (event: { target: { value: string } }) => setFromName(event.target.value),\n }),\n ),\n )\n : null,\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', justifyContent: 'flex-end' } },\n onCancel === undefined ? null : h('button', { className: 'ghost', onClick: onCancel }, '\u53D6\u6D88'),\n h(\n 'button',\n {\n className: 'primary',\n onClick: () => void submit(),\n disabled: busy || email.trim() === '' || password === '',\n },\n busy ? '\u8FDE\u63A5\u4E2D\u2026' : '\u6DFB\u52A0\u5E76\u8FDE\u63A5',\n ),\n ),\n )\n}\n\nexport function LoginForm({ account, onDone }: { account: Account; onDone: () => void }): ReactNode {\n const [password, setPassword] = useState('')\n const [remember, setRemember] = useState(true)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const submit = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.login(account.id, password, remember)\n onDone()\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n return h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, `\u767B\u5F55 ${account.email}`),\n h(\n 'p',\n { className: 'small muted' },\n `${account.imap.host}:${String(account.imap.port)} \u00B7 ${account.smtp.host}:${String(account.smtp.port)}`,\n ),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n onKeyDown: (event: { key: string }) => {\n if (event.key === 'Enter') void submit()\n },\n autoFocus: true,\n }),\n ),\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801\uFF08\u5199\u5165\u7CFB\u7EDF\u94A5\u5319\u4E32\uFF09' }),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'button',\n { className: 'primary', onClick: () => void submit(), disabled: busy || password === '' },\n busy ? '\u767B\u5F55\u4E2D\u2026' : '\u767B\u5F55',\n ),\n )\n}\n\nexport function AddAccountModal({\n onClose,\n onDone,\n}: {\n onClose: () => void\n onDone: (state: AppState) => void\n}): ReactNode {\n return h(\n Modal,\n { title: '\u6DFB\u52A0\u90AE\u7BB1\u8D26\u53F7', onClose },\n h(AddAccountForm, {\n onDone: (state) => {\n onDone(state)\n onClose()\n },\n onCancel: onClose,\n }),\n )\n}\n\nexport { errorText }\n", "import { createElement as h, useEffect, useRef, useState, type ReactNode } from 'react'\nimport type { Account, DraftAttachment } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { Field, Modal } from './components.js'\nimport { Icon } from './icons.js'\n\nexport interface ComposeInit {\n mode: 'new' | 'reply' | 'replyAll' | 'forward'\n accountId?: string\n to: string\n cc: string\n bcc: string\n subject: string\n html: string\n inReplyTo?: string\n references?: string\n draftId?: string\n attachments?: DraftAttachment[]\n}\n\ninterface Version {\n html: string\n label: string\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction readFileBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n const result = String(reader.result ?? '')\n resolve(result.slice(result.indexOf(',') + 1))\n }\n reader.onerror = () => reject(new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25: ${file.name}`))\n reader.readAsDataURL(file)\n })\n}\n\nexport function Composer({\n account,\n initial,\n onClose,\n onSent,\n}: {\n account: Account\n initial: ComposeInit\n onClose: () => void\n onSent: (message: string) => void\n}): ReactNode {\n const [to, setTo] = useState(initial.to)\n const [cc, setCc] = useState(initial.cc)\n const [bcc, setBcc] = useState(initial.bcc)\n const [subject, setSubject] = useState(initial.subject)\n const [showCc, setShowCc] = useState(initial.cc !== '' || initial.bcc !== '')\n const [attachments, setAttachments] = useState<DraftAttachment[]>(initial.attachments ?? [])\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [confirming, setConfirming] = useState(false)\n const [draftId, setDraftId] = useState(initial.draftId)\n const [savedAt, setSavedAt] = useState<Date | null>(null)\n const [dirty, setDirty] = useState(0)\n const [translating, setTranslating] = useState<'zh' | 'en' | null>(null)\n const [pendingLang, setPendingLang] = useState<'zh' | 'en' | null>(null)\n const [versions, setVersions] = useState<Version[]>([{ html: initial.html, label: '\u539F\u59CB' }])\n const [versionIndex, setVersionIndex] = useState(0)\n const [aiBusy, setAiBusy] = useState<'draft' | 'polish' | 'shorten' | null>(null)\n const [aiDraftOpen, setAiDraftOpen] = useState(false)\n const [aiInstruction, setAiInstruction] = useState('')\n const [hasBody, setHasBody] = useState(initial.html.trim() !== '')\n const editor = useRef<HTMLDivElement>(null)\n const closing = useRef(false)\n\n useEffect(() => {\n if (editor.current !== null) editor.current.innerHTML = initial.html\n setHasBody((editor.current?.innerHTML ?? '').trim() !== '')\n // The initial body is applied once; later edits own the DOM.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const html = (): string => editor.current?.innerHTML ?? ''\n const text = (): string => editor.current?.innerText ?? ''\n const markDirty = (): void => {\n setDirty((value) => value + 1)\n setHasBody((editor.current?.innerHTML ?? '').trim() !== '')\n }\n\n const saveNow = async (): Promise<boolean> => {\n if (to.trim() === '' && subject.trim() === '' && html().trim() === '') return false\n try {\n const { draft } = await api.saveDraft(account.id, {\n ...(draftId === undefined ? {} : { id: draftId }),\n to,\n cc,\n bcc,\n subject,\n html: html(),\n attachments,\n ...(initial.inReplyTo === undefined ? {} : { inReplyTo: initial.inReplyTo }),\n ...(initial.references === undefined ? {} : { references: initial.references }),\n })\n setDraftId(draft.id)\n setSavedAt(new Date())\n setDirty(0)\n return true\n } catch {\n return false\n }\n }\n\n // Debounced autosave: closing the composer must never lose a draft.\n useEffect(() => {\n if (dirty === 0) return\n const timer = window.setTimeout(() => {\n void saveNow()\n }, 2000)\n return () => {\n window.clearTimeout(timer)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dirty, to, cc, bcc, subject, attachments])\n\n const close = (): void => {\n if (closing.current) return\n closing.current = true\n void saveNow().finally(() => {\n setDirty(0)\n closing.current = false\n onClose()\n })\n }\n\n const pushVersion = (nextHtml: string, label: string): void => {\n const base = versions.slice(0, versionIndex + 1)\n if (base[base.length - 1]?.html !== html()) base.push({ html: html(), label: '\u624B\u52A8' })\n base.push({ html: nextHtml, label })\n setVersions(base.slice(-10))\n setVersionIndex(Math.min(base.length - 1, 9))\n if (editor.current !== null) editor.current.innerHTML = nextHtml\n setHasBody(nextHtml.trim() !== '')\n markDirty()\n }\n\n const restoreVersion = (index: number): void => {\n const version = versions[index]\n if (version === undefined || editor.current === null) return\n editor.current.innerHTML = version.html\n setVersionIndex(index)\n setHasBody(version.html.trim() !== '')\n markDirty()\n }\n\n const runAi = async (mode: 'draft' | 'polish' | 'shorten'): Promise<void> => {\n setAiBusy(mode)\n setError('')\n try {\n const result = await api.aiCompose({\n accountId: account.id,\n mode,\n instruction: aiInstruction,\n html: html(),\n language: 'zh',\n })\n pushVersion(result.html, mode === 'draft' ? 'AI \u8D77\u8349' : mode === 'polish' ? 'AI \u6DA6\u8272' : 'AI \u7F29\u77ED')\n setAiDraftOpen(false)\n setAiInstruction('')\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setAiBusy(null)\n }\n }\n\n const translate = async (target: 'zh' | 'en'): Promise<void> => {\n if (editor.current === null) return\n if (html().trim() === '') {\n setError('\u6B63\u6587\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u7FFB\u8BD1')\n return\n }\n setPendingLang(null)\n setTranslating(target)\n setError('')\n try {\n const result = await api.aiTranslate({ accountId: account.id, html: html(), target })\n pushVersion(result.html, target === 'en' ? '\u7FFB\u8BD1 EN' : '\u7FFB\u8BD1 \u4E2D')\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setTranslating(null)\n }\n }\n\n const exec = (command: string, value?: string): void => {\n editor.current?.focus()\n document.execCommand(command, false, value)\n markDirty()\n }\n\n const addFiles = async (files: FileList | null): Promise<void> => {\n if (files === null || files.length === 0) return\n setError('')\n const next = [...attachments]\n let total = next.reduce((sum, file) => sum + file.data.length, 0)\n for (const file of Array.from(files)) {\n if (total + file.size > 8 * 1024 * 1024) {\n setError('\u9644\u4EF6\u5408\u8BA1\u4E0D\u80FD\u8D85\u8FC7 8 MB')\n break\n }\n const data = await readFileBase64(file)\n next.push({ filename: file.name, contentType: file.type || 'application/octet-stream', data })\n total += file.size\n }\n setAttachments(next)\n markDirty()\n }\n\n const saveDraft = async (): Promise<void> => {\n setBusy(true)\n setError('')\n const ok = await saveNow()\n setBusy(false)\n if (ok) onSent('\u8349\u7A3F\u5DF2\u4FDD\u5B58')\n else setError('\u8349\u7A3F\u4FDD\u5B58\u5931\u8D25')\n }\n\n const send = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.send(account.id, {\n to,\n cc,\n bcc,\n subject,\n html: html(),\n text: text(),\n attachments,\n ...(initial.inReplyTo === undefined ? {} : { inReplyTo: initial.inReplyTo }),\n ...(initial.references === undefined ? {} : { references: initial.references }),\n })\n if (draftId !== undefined) {\n try {\n await api.deleteDraft(draftId, account.id)\n } catch {\n // The sent message matters more than removing its draft.\n }\n }\n onSent('\u90AE\u4EF6\u5DF2\u53D1\u9001')\n onClose()\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n setConfirming(false)\n }\n }\n\n return h(\n Modal,\n {\n title:\n initial.mode === 'reply'\n ? '\u56DE\u590D'\n : initial.mode === 'replyAll'\n ? '\u5168\u90E8\u56DE\u590D'\n : initial.mode === 'forward'\n ? '\u8F6C\u53D1'\n : '\u5199\u90AE\u4EF6',\n onClose: close,\n wide: true,\n footer: h(\n 'div',\n { className: 'mailharbor-compose-foot' },\n h('span', { className: 'small muted' }, `\u53D1\u4EF6\u4EBA ${account.email}`),\n savedAt === null\n ? null\n : h('span', { className: 'small muted' }, `\u5DF2\u81EA\u52A8\u4FDD\u5B58 ${savedAt.toLocaleTimeString()}`),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => void saveDraft(), disabled: busy }, '\u5B58\u8349\u7A3F'),\n confirming\n ? h(\n 'span',\n { style: { display: 'inline-flex', gap: '6px', alignItems: 'center' } },\n h('span', { className: 'small' }, '\u786E\u5B9A\u53D1\u9001\uFF1F'),\n h(\n 'button',\n { className: 'primary', onClick: () => void send(), disabled: busy },\n busy ? '\u53D1\u9001\u4E2D\u2026' : '\u786E\u5B9A',\n ),\n h('button', { className: 'ghost', onClick: () => setConfirming(false) }, '\u53D6\u6D88'),\n )\n : h(\n 'button',\n {\n className: 'primary',\n onClick: () => setConfirming(true),\n disabled: busy || to.trim() === '',\n },\n '\u53D1\u9001',\n ),\n ),\n },\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u6536\u4EF6\u4EBA' },\n h('input', {\n value: to,\n onChange: (event: { target: { value: string } }) => {\n setTo(event.target.value)\n markDirty()\n },\n placeholder: 'a@example.com, b@example.com',\n }),\n ),\n h(\n Field,\n { label: '\u4E3B\u9898' },\n h('input', {\n value: subject,\n onChange: (event: { target: { value: string } }) => {\n setSubject(event.target.value)\n markDirty()\n },\n placeholder: '\u90AE\u4EF6\u4E3B\u9898',\n }),\n ),\n ),\n showCc\n ? h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u6284\u9001' },\n h('input', {\n value: cc,\n onChange: (event: { target: { value: string } }) => {\n setCc(event.target.value)\n markDirty()\n },\n }),\n ),\n h(\n Field,\n { label: '\u5BC6\u9001' },\n h('input', {\n value: bcc,\n onChange: (event: { target: { value: string } }) => {\n setBcc(event.target.value)\n markDirty()\n },\n }),\n ),\n )\n : h(\n 'button',\n { className: 'subtle small', style: { alignSelf: 'flex-start' }, onClick: () => setShowCc(true) },\n '\u6DFB\u52A0\u6284\u9001 / \u5BC6\u9001',\n ),\n h(\n 'div',\n { className: 'mailharbor-toolbar' },\n h('button', { onClick: () => exec('bold'), title: '\u52A0\u7C97' }, 'B'),\n h('button', { onClick: () => exec('italic'), title: '\u659C\u4F53' }, 'I'),\n h('button', { onClick: () => exec('underline'), title: '\u4E0B\u5212\u7EBF' }, 'U'),\n h('button', { onClick: () => exec('insertUnorderedList'), title: '\u65E0\u5E8F\u5217\u8868' }, '\u2022 \u5217\u8868'),\n h('button', { onClick: () => exec('insertOrderedList'), title: '\u6709\u5E8F\u5217\u8868' }, '1. \u5217\u8868'),\n h('button', { onClick: () => exec('formatBlock', 'blockquote'), title: '\u5F15\u7528' }, '\u5F15\u7528'),\n h(\n 'button',\n {\n onClick: () => {\n const url = window.prompt('\u94FE\u63A5\u5730\u5740\uFF08https://\u2026\uFF09')\n if (url !== null && /^https?:\\/\\//i.test(url)) exec('createLink', url)\n },\n title: '\u94FE\u63A5',\n },\n '\u94FE\u63A5',\n ),\n h('button', { onClick: () => exec('removeFormat'), title: '\u6E05\u9664\u683C\u5F0F' }, '\u6E05\u9664'),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n {\n className: 'ai',\n onClick: () => setAiDraftOpen(!aiDraftOpen),\n disabled: aiBusy !== null,\n title: '\u8BA9 AI \u8D77\u8349\u6B63\u6587',\n },\n h(Icon, { name: 'sparkles', size: 13 }),\n '\u8D77\u8349',\n ),\n h(\n 'button',\n { className: 'ai', onClick: () => void runAi('polish'), disabled: aiBusy !== null || !hasBody },\n aiBusy === 'polish' ? '\u6DA6\u8272\u4E2D\u2026' : '\u6DA6\u8272',\n ),\n h(\n 'button',\n { className: 'ai', onClick: () => void runAi('shorten'), disabled: aiBusy !== null || !hasBody },\n aiBusy === 'shorten' ? '\u7F29\u77ED\u4E2D\u2026' : '\u7F29\u77ED',\n ),\n h(\n 'button',\n { onClick: () => setPendingLang('zh'), disabled: translating !== null, title: 'AI \u7FFB\u8BD1\u6210\u4E2D\u6587' },\n translating === 'zh' ? '\u2026' : '\u4E2D',\n ),\n h(\n 'button',\n { onClick: () => setPendingLang('en'), disabled: translating !== null, title: 'AI \u7FFB\u8BD1\u6210\u82F1\u6587' },\n translating === 'en' ? '\u2026' : 'EN',\n ),\n h(\n 'label',\n { className: 'mailharbor-toggle small' },\n '\u9644\u4EF6',\n h('input', {\n type: 'file',\n multiple: true,\n style: { display: 'none' },\n onChange: (event: { target: { files: FileList | null; value: string } }) => {\n void addFiles(event.target.files)\n event.target.value = ''\n },\n }),\n ),\n ),\n aiDraftOpen\n ? h(\n 'div',\n { className: 'mailharbor-confirm' },\n h('input', {\n value: aiInstruction,\n placeholder: '\u60F3\u8BA9 AI \u5199\u4EC0\u4E48\uFF1F\u4F8B\u5982\uFF1A\u786E\u8BA4\u6536\u5230\uFF0C\u5468\u4E94\u524D\u7ED9\u7B54\u590D',\n onChange: (event: { target: { value: string } }) => setAiInstruction(event.target.value),\n onKeyDown: (event: { key: string }) => {\n if (event.key === 'Enter') void runAi('draft')\n },\n }),\n h(\n 'button',\n { className: 'primary', onClick: () => void runAi('draft'), disabled: aiBusy !== null },\n aiBusy === 'draft' ? '\u751F\u6210\u4E2D\u2026' : '\u751F\u6210',\n ),\n h('button', { className: 'ghost', onClick: () => setAiDraftOpen(false) }, '\u53D6\u6D88'),\n )\n : null,\n pendingLang === null\n ? null\n : h(\n 'div',\n { className: 'mailharbor-confirm' },\n h('span', null, pendingLang === 'en' ? '\u628A\u6B63\u6587\u7FFB\u8BD1\u6210\u82F1\u6587\uFF1F' : '\u628A\u6B63\u6587\u7FFB\u8BD1\u6210\u4E2D\u6587\uFF1F'),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: () => setPendingLang(null) }, '\u53D6\u6D88'),\n h('button', { className: 'primary', onClick: () => void translate(pendingLang) }, '\u7FFB\u8BD1'),\n ),\n attachments.length === 0\n ? null\n : h(\n 'div',\n { className: 'mailharbor-attachments', style: { padding: 0, border: 0 } },\n attachments.map((file, index) =>\n h(\n 'span',\n { className: 'mailharbor-attachment', key: `${file.filename}:${String(index)}` },\n h('span', { className: 'name' }, file.filename),\n h(\n 'button',\n {\n className: 'subtle',\n onClick: () => {\n setAttachments(attachments.filter((_item, position) => position !== index))\n markDirty()\n },\n },\n '\u2715',\n ),\n ),\n ),\n ),\n h('div', {\n className: 'mailharbor-editor',\n ref: editor,\n contentEditable: true,\n suppressContentEditableWarning: true,\n 'data-placeholder': '\u5199\u70B9\u4EC0\u4E48\u2026',\n spellCheck: true,\n onInput: markDirty,\n }),\n h(\n 'div',\n { className: 'mailharbor-versions' },\n h('span', { className: 'small muted' }, '\u7248\u672C'),\n versions.map((version, index) =>\n h(\n 'button',\n {\n key: `${version.label}:${String(index)}`,\n className: index === versionIndex ? 'chip active' : 'chip',\n title: version.label,\n onClick: () => restoreVersion(index),\n },\n String(index + 1),\n ),\n ),\n versions.length > 1\n ? h(\n 'button',\n { className: 'subtle small', onClick: () => restoreVersion(Math.max(0, versionIndex - 1)) },\n '\u6062\u590D\u4E0A\u4E00\u7248',\n )\n : null,\n h('span', { className: 'spacer' }),\n h('span', { className: 'small muted' }, versions[versionIndex]?.label ?? ''),\n ),\n )\n}\n", "import { createElement as h, useMemo, useState, type ReactNode } from 'react'\nimport type { MessageDetail } from '../shared/types.js'\nimport { api } from './api.js'\nimport { Avatar, formatBytes, longDate } from './components.js'\nimport { Icon } from './icons.js'\n\nexport type ReaderAiAction = 'summary' | 'reply' | 'translate'\n\nconst IFRAME_STYLE = `\n html, body { margin: 0; padding: 0; }\n body {\n font: 15px/1.75 -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n color: #171a21; background: #fff; padding: 20px 22px;\n overflow-wrap: anywhere;\n }\n img { max-width: 100%; height: auto; }\n table { max-width: 100%; border-collapse: collapse; }\n td, th { padding: 2px 6px; }\n a { color: #2f5bd3; }\n blockquote { margin: 0 0 0 12px; padding-left: 12px; border-left: 2px solid #d7dbe3; color: #565c67; }\n pre { white-space: pre-wrap; }\n`\n\nfunction csp(allowRemoteImages: boolean): string {\n return [\n \"default-src 'none'\",\n \"style-src 'unsafe-inline'\",\n 'font-src data:',\n `img-src data:${allowRemoteImages ? ' https: http:' : ''}`,\n \"form-action 'none'\",\n \"base-uri 'none'\",\n ].join('; ')\n}\n\nfunction srcDoc(detail: MessageDetail, allowRemoteImages: boolean): string {\n const html =\n detail.html !== null && detail.html !== '' ? detail.html : `<pre>${escapeHtml(detail.text)}</pre>`\n return `<!doctype html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"Content-Security-Policy\" content=\"${csp(allowRemoteImages)}\"><style>${IFRAME_STYLE}</style></head><body>${html}</body></html>`\n}\n\nfunction escapeHtml(value: string): string {\n return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;')\n}\n\nfunction hasRemoteImages(detail: MessageDetail): boolean {\n return detail.html !== null && /<img[^>]+src=[\"']https?:/i.test(detail.html)\n}\n\nfunction addressLine(list: { name: string; address: string }[]): string {\n return list.map((item) => (item.name !== '' ? `${item.name} <${item.address}>` : item.address)).join('\u3001')\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nexport function Reader({\n detail,\n source,\n mailbox,\n onChanged,\n onReply,\n onAiAction,\n onExtractTasks,\n onAddToProject,\n onClose,\n}: {\n detail: MessageDetail\n source: 'local' | 'server'\n mailbox: string\n onChanged: (patch: Partial<MessageDetail>) => void\n onReply: (mode: 'reply' | 'replyAll' | 'forward') => void\n onAiAction: (action: ReaderAiAction) => void\n onExtractTasks: () => void\n onAddToProject: () => void\n onClose?: () => void\n}): ReactNode {\n const [plain, setPlain] = useState(false)\n const [loadImages, setLoadImages] = useState(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n const remoteImages = useMemo(() => hasRemoteImages(detail), [detail])\n const html = detail.html !== null && detail.html !== ''\n\n const toggleRead = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.setRead({\n id: detail.id,\n accountId: detail.accountId,\n source,\n mailbox,\n read: detail.unread,\n })\n onChanged({ unread: !result.read })\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor-reader' },\n h(\n 'div',\n { className: 'mailharbor-reader-head' },\n h(\n 'div',\n { className: 'mailharbor-reader-title' },\n onClose === undefined\n ? null\n : h(\n 'button',\n { className: 'ghost icon', onClick: onClose, 'aria-label': '\u8FD4\u56DE\u5217\u8868', title: '\u8FD4\u56DE\u5217\u8868' },\n h(Icon, { name: 'chevronLeft' }),\n ),\n h('h2', { style: { flex: 1 } }, detail.subject),\n h(\n 'button',\n {\n className: 'ghost icon',\n onClick: () => void toggleRead(),\n disabled: busy,\n title: detail.unread ? '\u6807\u4E3A\u5DF2\u8BFB' : '\u6807\u4E3A\u672A\u8BFB',\n 'aria-label': detail.unread ? '\u6807\u4E3A\u5DF2\u8BFB' : '\u6807\u4E3A\u672A\u8BFB',\n },\n h(Icon, { name: 'check' }),\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-meta' },\n h(\n 'span',\n { className: 'who' },\n h(Avatar, { email: detail.from.address, size: 22 }),\n h('strong', null, detail.from.name !== '' ? detail.from.name : detail.from.address),\n detail.from.name !== '' ? h('span', null, `<${detail.from.address}>`) : null,\n ),\n h('span', null, longDate(detail.date)),\n detail.backedUp === false ? h('span', { className: 'badge warn' }, '\u672A\u5907\u4EFD') : null,\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-meta' },\n h('span', null, `\u6536\u4EF6\u4EBA: ${addressLine(detail.to) || '\u2014'}`),\n detail.cc.length === 0 ? null : h('span', null, `\u6284\u9001: ${addressLine(detail.cc)}`),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-actions' },\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('reply') },\n h(Icon, { name: 'reply' }),\n '\u56DE\u590D',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('replyAll') },\n h(Icon, { name: 'replyAll' }),\n '\u5168\u90E8\u56DE\u590D',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: () => onReply('forward') },\n h(Icon, { name: 'forward' }),\n '\u8F6C\u53D1',\n ),\n h('span', { className: 'mailharbor-divider' }),\n h(\n 'button',\n { className: 'ghost', onClick: () => onAiAction('summary') },\n h(Icon, { name: 'sparkles', size: 14 }),\n 'AI \u6458\u8981',\n ),\n h('button', { className: 'ghost', onClick: () => onAiAction('reply') }, 'AI \u56DE\u590D'),\n h('button', { className: 'ghost', onClick: () => onAiAction('translate') }, 'AI \u7FFB\u8BD1'),\n h(\n 'button',\n { className: 'ghost', onClick: onExtractTasks },\n h(Icon, { name: 'checklist', size: 14 }),\n '\u63D0\u53D6\u4EFB\u52A1',\n ),\n h(\n 'button',\n { className: 'ghost', onClick: onAddToProject },\n h(Icon, { name: 'folder', size: 14 }),\n '\u52A0\u5165\u9879\u76EE',\n ),\n h('span', { className: 'spacer' }),\n html\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setPlain(!plain) },\n plain ? '\u663E\u793A HTML' : '\u7EAF\u6587\u672C',\n )\n : null,\n remoteImages && !loadImages\n ? h(\n 'button',\n { className: 'subtle', onClick: () => setLoadImages(true) },\n h(Icon, { name: 'image', size: 14 }),\n '\u663E\u793A\u56FE\u7247',\n )\n : null,\n ),\n error === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-danger)' } }, error),\n ),\n h(\n 'div',\n { className: 'mailharbor-reader-body' },\n html && !plain\n ? h('iframe', {\n title: '\u90AE\u4EF6\u6B63\u6587',\n sandbox: '',\n srcDoc: srcDoc(detail, loadImages),\n referrerPolicy: 'no-referrer',\n })\n : h('pre', null, detail.text !== '' ? detail.text : '\uFF08\u65E0\u6B63\u6587\uFF09'),\n ),\n detail.attachments.length === 0\n ? null\n : h(\n 'div',\n { className: 'mailharbor-attachments' },\n detail.attachments.map((file) =>\n h(\n 'a',\n {\n className: 'mailharbor-attachment',\n key: file.id,\n href:\n source === 'server'\n ? api.attachmentUrl({\n accountId: detail.accountId,\n source: 'server',\n mailbox,\n uid: detail.uid ?? '',\n part: file.id,\n })\n : api.attachmentUrl({\n accountId: detail.accountId,\n source: 'local',\n emailId: detail.id,\n attachmentId: file.id,\n }),\n download: file.filename,\n title: file.filename,\n },\n h(Icon, { name: 'paperclip', size: 14 }),\n h('span', { className: 'name' }, file.filename),\n h('span', { className: 'muted small' }, formatBytes(file.size)),\n ),\n ),\n ),\n )\n}\n", "/** Cross-panel navigation requests (tasks \u2192 mail). */\nexport interface OpenMailRequest {\n accountId: string\n id: string\n mailbox: string\n}\n\nlet pending: OpenMailRequest | null = null\n\nexport function requestOpenMail(request: OpenMailRequest): void {\n pending = request\n window.dispatchEvent(new CustomEvent('mailharbor:open-mail', { detail: request }))\n}\n\n/** Consume a request queued while the mail panel was unmounted. */\nexport function consumeOpenMail(): OpenMailRequest | null {\n const value = pending\n pending = null\n return value\n}\n", "import { createElement as h, useEffect, useState, type ReactNode } from 'react'\nimport type { Account, AppState, SettingsView } from '../shared/types.js'\nimport { api, ApiError, type AiModels, type AiStatus } from './api.js'\nimport { AddAccountForm } from './account-form.js'\nimport { Avatar, ErrorBar, Field, Toggle } from './components.js'\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nexport function MailSettings(): ReactNode {\n const [state, setState] = useState<AppState | null>(null)\n const [settings, setSettings] = useState<SettingsView | null>(null)\n const [error, setError] = useState('')\n const [toast, setToast] = useState('')\n const [signature, setSignature] = useState('')\n const [markOnOpen, setMarkOnOpen] = useState(true)\n const [pollSeconds, setPollSeconds] = useState(60)\n const [listLimit, setListLimit] = useState(40)\n const [projectRoot, setProjectRoot] = useState('')\n const [aiEnabled, setAiEnabled] = useState(true)\n const [aiProvider, setAiProvider] = useState('deepseek-account')\n const [aiModel, setAiModel] = useState('deepseek-flash')\n const [aiModels, setAiModels] = useState<AiModels>({ providers: [] })\n const [aiStatus, setAiStatus] = useState<AiStatus | null>(null)\n const [styleText, setStyleText] = useState('')\n const [styleMeta, setStyleMeta] = useState({ updatedAt: '', sampleCount: 0 })\n const [styleBusy, setStyleBusy] = useState<'save' | 'learn' | null>(null)\n const [editing, setEditing] = useState<string | null>(null)\n const [checkResults, setCheckResults] = useState<Record<string, string>>({})\n const [adding, setAdding] = useState(false)\n const [tick, setTick] = useState(0)\n\n useEffect(() => {\n let cancelled = false\n Promise.all([api.state(), api.settings()])\n .then(([appState, view]) => {\n if (cancelled) return\n setState(appState)\n setSettings(view)\n setSignature(appState.settings.signature)\n setMarkOnOpen(view.read.markOnOpen)\n setPollSeconds(view.read.pollSeconds)\n setListLimit(view.render.listLimit)\n setProjectRoot(view.projects.root)\n setAiEnabled(view.ai.enabled)\n setAiProvider(view.ai.provider)\n setAiModel(view.ai.model)\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n return () => {\n cancelled = true\n }\n }, [tick])\n\n useEffect(() => {\n let cancelled = false\n const accountId = settings?.activeAccountId ?? state?.activeAccountId ?? null\n if (accountId === null) return\n Promise.all([api.aiStatus(accountId), api.aiModels(), api.aiStyle(accountId)])\n .then(([status, models, style]) => {\n if (cancelled) return\n setAiStatus(status)\n setAiModels(models)\n setStyleText(style.style?.profile ?? '')\n setStyleMeta({\n updatedAt: style.style?.updatedAt ?? '',\n sampleCount: style.style?.sampleCount ?? 0,\n })\n const preferred =\n models.providers.find((item) => item.provider === status.provider) ?? models.providers[0]\n if (preferred !== undefined && status.provider === '') {\n setAiProvider(preferred.provider)\n const firstModel = preferred.models[0]\n if (firstModel !== undefined) setAiModel(firstModel.id)\n }\n })\n .catch(() => {\n // AI status is optional; the panel still works without a model service.\n })\n return () => {\n cancelled = true\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tick, settings?.activeAccountId])\n\n const reload = (): void => setTick((value) => value + 1)\n\n const notify = (message: string): void => {\n setToast(message)\n window.setTimeout(() => {\n setToast('')\n }, 3000)\n }\n\n const saveGeneral = async (patch: Record<string, unknown>): Promise<void> => {\n try {\n const result = await api.saveSettings(patch)\n setSettings(result.settings)\n notify('\u8BBE\u7F6E\u5DF2\u4FDD\u5B58')\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const account = settings?.accounts.find((item) => item.id === settings.activeAccountId) ?? null\n\n if (state === null || settings === null) {\n return h('div', { className: 'mailharbor mailharbor-settings' }, error === '' ? '\u6B63\u5728\u52A0\u8F7D\u8BBE\u7F6E\u2026' : error)\n }\n\n return h(\n 'div',\n { className: 'mailharbor mailharbor-settings-page' },\n h(\n 'div',\n { className: 'mailharbor-settings' },\n h('h2', null, 'MailHarbor'),\n h('p', { className: 'small muted' }, '\u591A\u8D26\u53F7 IMAP/SMTP \u90AE\u7BB1\u3001\u672C\u5730\u5907\u4EFD\u3001AI \u4E0E\u4EFB\u52A1\u3002\u8BBE\u7F6E\u4F1A\u7ACB\u5373\u751F\u6548\u3002'),\n toast === '' ? null : h('div', { className: 'small', style: { color: 'var(--m-ok)' } }, toast),\n error === '' ? null : h(ErrorBar, { message: error, onDismiss: () => setError('') }),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u8D26\u53F7'),\n settings.accounts.length === 0\n ? h(AddAccountForm, { onDone: () => reload() })\n : settings.accounts.map((item) =>\n h(AccountRow, {\n key: item.id,\n account: item,\n active: item.id === settings.activeAccountId,\n loggedIn: item.id === settings.activeAccountId ? state.loggedIn : undefined,\n editing: editing === item.id,\n checkResult: checkResults[item.id] ?? '',\n onToggleEdit: () => {\n setEditing(editing === item.id ? null : item.id)\n setCheckResults((prev) => ({ ...prev, [item.id]: '' }))\n },\n onActivate: async () => {\n await api.activateAccount(item.id)\n reload()\n },\n onLogin: async (password, remember) => {\n await api.login(item.id, password, remember)\n reload()\n },\n onLogout: async () => {\n await api.logout(item.id)\n reload()\n },\n onCheck: async () => {\n try {\n const result = await api.check(item.id)\n setCheckResults((prev) => ({\n ...prev,\n [item.id]: `IMAP \u6B63\u5E38\uFF08${String(result.imap.mailboxes.length)} \u4E2A\u6587\u4EF6\u5939\uFF09\u00B7 SMTP ${result.smtp.ok ? '\u6B63\u5E38' : `\u5931\u8D25: ${result.smtp.error ?? ''}`}`,\n }))\n } catch (caught) {\n setCheckResults((prev) => ({ ...prev, [item.id]: `\u5931\u8D25: ${errorText(caught)}` }))\n }\n },\n onSave: async (patch) => {\n await api.updateAccount(item.id, patch)\n reload()\n },\n onRemove: async () => {\n if (!window.confirm(`\u79FB\u9664\u8D26\u53F7 ${item.email}\uFF1F\u672C\u5730\u6570\u636E\u76EE\u5F55\u4F1A\u4FDD\u7559\u3002`)) return\n await api.deleteAccount(item.id)\n reload()\n },\n }),\n ),\n adding\n ? h(AddAccountForm, {\n onDone: () => {\n setAdding(false)\n reload()\n },\n onCancel: () => setAdding(false),\n })\n : h('button', { className: 'ghost', onClick: () => setAdding(true) }, '+ \u6DFB\u52A0\u8D26\u53F7'),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u5199\u4FE1\u4E0E\u9605\u8BFB'),\n h(\n Field,\n { label: '\u7B7E\u540D\uFF08\u7EAF\u6587\u672C\uFF0C\u53D1\u9001\u65F6\u8FFD\u52A0\u5230\u6B63\u6587\u672B\u5C3E\uFF09' },\n h('textarea', {\n rows: 4,\n value: signature,\n onChange: (event: { target: { value: string } }) => setSignature(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '10px', alignItems: 'center', flexWrap: 'wrap' } },\n h('button', { className: 'ghost', onClick: () => void saveGeneral({ signature }) }, '\u4FDD\u5B58\u7B7E\u540D'),\n h(Toggle, {\n checked: markOnOpen,\n onChange: (value) => {\n setMarkOnOpen(value)\n void saveGeneral({ read: { markOnOpen: value } })\n },\n label: '\u6253\u5F00\u90AE\u4EF6\u65F6\u6807\u4E3A\u5DF2\u8BFB',\n }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u5217\u8868\u6BCF\u9875\u6570\u91CF' },\n h('input', {\n type: 'number',\n min: 10,\n max: 200,\n value: listLimit,\n onChange: (event: { target: { value: string } }) => setListLimit(Number(event.target.value)),\n onBlur: () => void saveGeneral({ render: { listLimit } }),\n }),\n ),\n h(\n Field,\n { label: '\u672A\u8BFB\u89D2\u6807\u8F6E\u8BE2\uFF08\u79D2\uFF09' },\n h('input', {\n type: 'number',\n min: 15,\n max: 3600,\n value: pollSeconds,\n onChange: (event: { target: { value: string } }) => setPollSeconds(Number(event.target.value)),\n onBlur: () => void saveGeneral({ read: { pollSeconds } }),\n }),\n ),\n ),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u9879\u76EE'),\n h('p', { className: 'small muted' }, '\u4ECE\u90AE\u4EF6\u521B\u5EFA\u9879\u76EE\u65F6\u7684\u9ED8\u8BA4\u76EE\u5F55\uFF1B\u5355\u4E2A\u9879\u76EE\u53EF\u4EE5\u5728\u521B\u5EFA\u65F6\u6539\u3002'),\n h(\n 'div',\n { className: 'mailharbor-grid', style: { gridTemplateColumns: 'minmax(0, 1fr) auto' } },\n h(\n Field,\n { label: '\u9ED8\u8BA4\u9879\u76EE\u76EE\u5F55' },\n h('input', {\n value: projectRoot,\n onChange: (event: { target: { value: string } }) => setProjectRoot(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '6px', alignSelf: 'end' } },\n h(\n 'button',\n {\n className: 'ghost small',\n onClick: () => {\n void api\n .pickDirectory()\n .then((result) => {\n if (result.path !== null) setProjectRoot(result.path)\n })\n .catch((caught: unknown) => setError(errorText(caught)))\n },\n },\n '\u6D4F\u89C8\u2026',\n ),\n h(\n 'button',\n {\n className: 'ghost small',\n onClick: () => void saveGeneral({ projects: { root: projectRoot } }),\n },\n '\u4FDD\u5B58\u76EE\u5F55',\n ),\n ),\n ),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, 'AI'),\n h(Toggle, {\n checked: aiEnabled,\n onChange: (value) => {\n setAiEnabled(value)\n void saveGeneral({ ai: { enabled: value } })\n },\n label: '\u542F\u7528 AI\uFF08\u6458\u8981\u3001AI \u56DE\u590D\u3001\u7FFB\u8BD1\u3001\u5199\u4F5C\u98CE\u683C\uFF09',\n }),\n aiStatus === null\n ? null\n : h(\n 'div',\n { className: 'small', style: { color: aiStatus.available ? 'var(--m-ok)' : 'var(--m-warn)' } },\n aiStatus.available\n ? `\u6A21\u578B\u670D\u52A1\u53EF\u7528 \u00B7 ${aiStatus.provider} / ${aiStatus.model}`\n : (aiStatus.error ?? '\u5F53\u524D DSH \u7EC4\u5408\u6CA1\u6709\u53EF\u7528\u7684\u6A21\u578B\u670D\u52A1'),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: 'Provider' },\n aiModels.providers.length === 0\n ? h('input', {\n value: aiProvider,\n onChange: (event: { target: { value: string } }) => setAiProvider(event.target.value),\n onBlur: () => void saveGeneral({ ai: { provider: aiProvider } }),\n })\n : h(\n 'select',\n {\n value: aiProvider,\n onChange: (event: { target: { value: string } }) => {\n setAiProvider(event.target.value)\n const provider = aiModels.providers.find((item) => item.provider === event.target.value)\n const first = provider?.models[0]\n if (first !== undefined) setAiModel(first.id)\n void saveGeneral({\n ai: {\n provider: event.target.value,\n ...(first === undefined ? {} : { model: first.id }),\n },\n })\n },\n },\n aiModels.providers.map((item) =>\n h('option', { key: item.provider, value: item.provider }, item.name),\n ),\n ),\n ),\n h(\n Field,\n { label: '\u6A21\u578B' },\n (() => {\n const provider = aiModels.providers.find((item) => item.provider === aiProvider)\n return provider === undefined || provider.models.length === 0\n ? h('input', {\n value: aiModel,\n onChange: (event: { target: { value: string } }) => setAiModel(event.target.value),\n onBlur: () => void saveGeneral({ ai: { model: aiModel } }),\n })\n : h(\n 'select',\n {\n value: aiModel,\n onChange: (event: { target: { value: string } }) => {\n setAiModel(event.target.value)\n void saveGeneral({ ai: { model: event.target.value } })\n },\n },\n provider.models.map((item) => h('option', { key: item.id, value: item.id }, item.name)),\n )\n })(),\n ),\n ),\n h('hr', null),\n h(\n 'div',\n { style: { display: 'flex', alignItems: 'center', gap: '8px' } },\n h('strong', { style: { fontSize: '12.5px' } }, '\u5199\u4F5C\u98CE\u683C'),\n h(\n 'span',\n { className: 'small muted' },\n styleMeta.updatedAt === ''\n ? '\u8FD8\u6CA1\u6709\u751F\u6210'\n : `${styleMeta.sampleCount} \u5C01\u5DF2\u53D1\u9001\u90AE\u4EF6 \u00B7 ${new Date(styleMeta.updatedAt).toLocaleString()}`,\n ),\n ),\n h(\n 'p',\n { className: 'small muted' },\n '\u4ECE\u5DF2\u53D1\u9001\u90AE\u4EF6\u5B66\u4E60\u4F60\u7684\u79F0\u547C\u3001\u7ED3\u5C3E\u3001\u8BED\u6C14\u548C\u5E38\u7528\u8868\u8FBE\uFF0CAI \u56DE\u590D\u65F6\u4F1A\u53C2\u8003\u5B83\u3002\u53EA\u4FDD\u5B58\u63D0\u70BC\u540E\u7684\u6863\u6848\uFF0C\u4E0D\u4FDD\u5B58\u90AE\u4EF6\u539F\u6587\u3002',\n ),\n h('textarea', {\n rows: 6,\n value: styleText,\n placeholder: '\u70B9\u300C\u4ECE\u5DF2\u53D1\u9001\u90AE\u4EF6\u5B66\u4E60\u300D\u751F\u6210\uFF0C\u6216\u76F4\u63A5\u5199\u4E00\u6BB5\u4F60\u7684\u5199\u4F5C\u98CE\u683C',\n onChange: (event: { target: { value: string } }) => setStyleText(event.target.value),\n }),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', flexWrap: 'wrap' } },\n h(\n 'button',\n {\n className: 'ghost',\n disabled: styleBusy !== null,\n onClick: () => {\n const accountId = settings.activeAccountId\n if (accountId === null) return\n setStyleBusy('learn')\n setError('')\n api\n .aiLearnStyle(accountId)\n .then((result) => {\n setStyleText(result.style.profile)\n setStyleMeta({ updatedAt: result.style.updatedAt, sampleCount: result.style.sampleCount })\n notify('\u5DF2\u6839\u636E\u5DF2\u53D1\u9001\u90AE\u4EF6\u751F\u6210\u5199\u4F5C\u98CE\u683C')\n })\n .catch((caught: unknown) => setError(errorText(caught)))\n .finally(() => setStyleBusy(null))\n },\n },\n styleBusy === 'learn' ? '\u5B66\u4E60\u4E2D\u2026' : '\u4ECE\u5DF2\u53D1\u9001\u90AE\u4EF6\u5B66\u4E60',\n ),\n h(\n 'button',\n {\n className: 'primary',\n disabled: styleBusy !== null || styleText.trim() === '',\n onClick: () => {\n const accountId = settings.activeAccountId\n if (accountId === null) return\n setStyleBusy('save')\n setError('')\n api\n .aiSaveStyle(accountId, styleText)\n .then((result) => {\n setStyleMeta({ updatedAt: result.style.updatedAt, sampleCount: result.style.sampleCount })\n notify('\u5199\u4F5C\u98CE\u683C\u5DF2\u4FDD\u5B58')\n })\n .catch((caught: unknown) => setError(errorText(caught)))\n .finally(() => setStyleBusy(null))\n },\n },\n '\u4FDD\u5B58\u98CE\u683C',\n ),\n ),\n h(\n 'p',\n { className: 'small muted' },\n 'AI \u8C03\u7528\u8D70 DSH \u81EA\u5DF1\u7684\u6A21\u578B\u670D\u52A1\uFF0C\u4E0D\u989D\u5916\u4FDD\u5B58\u5BC6\u94A5\uFF1B\u53D1\u9001\u4ECD\u7136\u53EA\u7531\u4F60\u786E\u8BA4\u3002',\n ),\n ),\n\n h(\n 'div',\n { className: 'mailharbor-card' },\n h('h3', null, '\u6570\u636E'),\n h(\n 'dl',\n { className: 'mailharbor-kv' },\n h('dt', null, '\u6570\u636E\u76EE\u5F55'),\n h('dd', null, settings.dataDir),\n h('dt', null, '\u914D\u7F6E\u6587\u4EF6'),\n h('dd', null, settings.configFile),\n h('dt', null, '\u5F53\u524D\u8D26\u53F7\u6570\u636E\u5E93'),\n h(\n 'dd',\n null,\n account === null\n ? '\u2014'\n : `${account.dataDir.startsWith('/') ? account.dataDir : `${settings.dataDir}/${account.dataDir}`}/mail.db`,\n ),\n h('dt', null, '\u63D2\u4EF6\u7248\u672C'),\n h('dd', null, state.version),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', flexWrap: 'wrap' } },\n account === null\n ? null\n : h(\n 'button',\n {\n className: 'ghost',\n onClick: async () => {\n try {\n const status = await api.startBackup(account.id)\n notify(status.status.message === '' ? '\u5907\u4EFD\u5DF2\u5F00\u59CB' : status.status.message)\n reload()\n } catch (caught) {\n setError(errorText(caught))\n }\n },\n },\n '\u7ACB\u5373\u5907\u4EFD\u5F53\u524D\u8D26\u53F7',\n ),\n ),\n ),\n ),\n )\n}\n\nfunction AccountRow({\n account,\n active,\n loggedIn,\n editing,\n checkResult,\n onToggleEdit,\n onActivate,\n onLogin,\n onLogout,\n onCheck,\n onSave,\n onRemove,\n}: {\n account: Account\n active: boolean\n loggedIn: boolean | undefined\n editing: boolean\n checkResult: string\n onToggleEdit: () => void\n onActivate: () => Promise<void>\n onLogin: (password: string, remember: boolean) => Promise<void>\n onLogout: () => Promise<void>\n onCheck: () => Promise<void>\n onSave: (patch: Record<string, unknown>) => Promise<void>\n onRemove: () => Promise<void>\n}): ReactNode {\n const [password, setPassword] = useState('')\n const [remember, setRemember] = useState(true)\n const [label, setLabel] = useState(account.label)\n const [username, setUsername] = useState(account.username)\n const [imapHost, setImapHost] = useState(account.imap.host)\n const [imapPort, setImapPort] = useState(String(account.imap.port))\n const [imapSecure, setImapSecure] = useState(account.imap.secure)\n const [smtpHost, setSmtpHost] = useState(account.smtp.host)\n const [smtpPort, setSmtpPort] = useState(String(account.smtp.port))\n const [smtpSecure, setSmtpSecure] = useState(account.smtp.secure)\n const [fromName, setFromName] = useState(account.smtp.fromName)\n const [busy, setBusy] = useState(false)\n const [checking, setChecking] = useState(false)\n\n useEffect(() => {\n setLabel(account.label)\n setUsername(account.username)\n setImapHost(account.imap.host)\n setImapPort(String(account.imap.port))\n setImapSecure(account.imap.secure)\n setSmtpHost(account.smtp.host)\n setSmtpPort(String(account.smtp.port))\n setSmtpSecure(account.smtp.secure)\n setFromName(account.smtp.fromName)\n }, [account])\n\n const wrap = async (operation: () => Promise<void>): Promise<void> => {\n setBusy(true)\n try {\n await operation()\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor-card', style: { background: 'var(--m-bg-1)' } },\n h(\n 'div',\n { className: 'mailharbor-account-row' },\n h(Avatar, { email: account.email, size: 30 }),\n h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', minWidth: 0 } },\n h('strong', null, account.label),\n h('span', { className: 'small muted' }, account.email),\n ),\n active ? h('span', { className: 'badge ok' }, '\u5F53\u524D\u8D26\u53F7') : null,\n loggedIn === false ? h('span', { className: 'badge warn' }, '\u672A\u767B\u5F55') : null,\n h('span', { className: 'spacer' }),\n active\n ? null\n : h('button', { className: 'ghost small', onClick: () => void wrap(onActivate) }, '\u8BBE\u4E3A\u5F53\u524D'),\n h(\n 'button',\n {\n className: 'ghost small',\n disabled: checking,\n onClick: () => {\n setChecking(true)\n void wrap(onCheck).finally(() => setChecking(false))\n },\n },\n checking ? '\u68C0\u67E5\u4E2D\u2026' : '\u68C0\u67E5\u8FDE\u63A5',\n ),\n h('button', { className: 'ghost small', onClick: onToggleEdit }, editing ? '\u6536\u8D77' : '\u7F16\u8F91'),\n ),\n checkResult === ''\n ? null\n : h(\n 'div',\n {\n className: 'mailharbor-check',\n style: { color: checkResult.startsWith('\u5931\u8D25') ? 'var(--m-danger)' : 'var(--m-ok)' },\n },\n checkResult,\n ),\n editing\n ? h(\n 'div',\n { style: { display: 'flex', flexDirection: 'column', gap: '10px' } },\n h(\n 'div',\n { className: 'mailharbor-grid' },\n h(\n Field,\n { label: '\u663E\u793A\u540D\u79F0' },\n h('input', {\n value: label,\n onChange: (event: { target: { value: string } }) => setLabel(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u767B\u5F55\u7528\u6237\u540D' },\n h('input', {\n value: username,\n onChange: (event: { target: { value: string } }) => setUsername(event.target.value),\n }),\n ),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'IMAP \u4E3B\u673A' },\n h('input', {\n value: imapHost,\n onChange: (event: { target: { value: string } }) => setImapHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: imapPort,\n onChange: (event: { target: { value: string } }) => setImapPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: imapSecure, onChange: setImapSecure, label: 'TLS' }),\n ),\n h(\n 'div',\n { className: 'mailharbor-grid three' },\n h(\n Field,\n { label: 'SMTP \u4E3B\u673A' },\n h('input', {\n value: smtpHost,\n onChange: (event: { target: { value: string } }) => setSmtpHost(event.target.value),\n }),\n ),\n h(\n Field,\n { label: '\u7AEF\u53E3' },\n h('input', {\n value: smtpPort,\n onChange: (event: { target: { value: string } }) => setSmtpPort(event.target.value),\n }),\n ),\n h(Toggle, { checked: smtpSecure, onChange: setSmtpSecure, label: 'TLS' }),\n ),\n h(\n Field,\n { label: '\u53D1\u4EF6\u4EBA\u540D\u79F0' },\n h('input', {\n value: fromName,\n onChange: (event: { target: { value: string } }) => setFromName(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', alignItems: 'center', flexWrap: 'wrap' } },\n h(\n 'button',\n {\n className: 'primary small',\n disabled: busy,\n onClick: () =>\n void wrap(async () => {\n await onSave({\n label,\n username,\n imap: { host: imapHost, port: Number(imapPort) || 993, secure: imapSecure },\n smtp: { host: smtpHost, port: Number(smtpPort) || 465, secure: smtpSecure, fromName },\n })\n }),\n },\n '\u4FDD\u5B58\u8D26\u53F7',\n ),\n h(\n 'button',\n {\n className: 'ghost small danger',\n onClick: () => void wrap(onRemove),\n },\n '\u79FB\u9664\u8D26\u53F7',\n ),\n ),\n h('hr', { style: { border: 0, borderTop: '1px solid var(--m-line)', width: '100%' } }),\n h(\n Field,\n { label: '\u5BC6\u7801 / \u5E94\u7528\u4E13\u7528\u5BC6\u7801\uFF08\u4E0D\u5199\u5165\u914D\u7F6E\u6587\u4EF6\uFF09' },\n h('input', {\n type: 'password',\n value: password,\n onChange: (event: { target: { value: string } }) => setPassword(event.target.value),\n }),\n ),\n h(\n 'div',\n { style: { display: 'flex', gap: '8px', alignItems: 'center' } },\n h(Toggle, { checked: remember, onChange: setRemember, label: '\u8BB0\u4F4F\u5BC6\u7801' }),\n h(\n 'button',\n {\n className: 'primary small',\n disabled: busy || password === '',\n onClick: () =>\n void wrap(async () => {\n await onLogin(password, remember)\n setPassword('')\n }),\n },\n '\u767B\u5F55',\n ),\n h('button', { className: 'ghost small', onClick: () => void wrap(onLogout) }, '\u9000\u51FA\u767B\u5F55'),\n ),\n )\n : null,\n )\n}\n", "import { createElement as h, useCallback, useEffect, useState, type ReactNode } from 'react'\nimport type { AppState, Project, Task } from '../shared/types.js'\nimport { api, ApiError } from './api.js'\nimport { ErrorBar, Modal } from './components.js'\nimport { Icon } from './icons.js'\nimport { requestOpenMail } from './nav.js'\n\ntype Filter = 'all' | 'today' | 'week' | 'overdue'\n\nconst FILTERS: { id: Filter; label: string }[] = [\n { id: 'all', label: '\u5168\u90E8' },\n { id: 'today', label: '\u4ECA\u5929' },\n { id: 'week', label: '\u672C\u5468' },\n { id: 'overdue', label: '\u903E\u671F' },\n]\n\nconst COLUMNS: { status: Task['status']; label: string; hint: string }[] = [\n { status: 'NEEDS-ACTION', label: '\u5F85\u5904\u7406', hint: '\u8FD8\u6CA1\u5F00\u59CB' },\n { status: 'IN-PROCESS', label: '\u8FDB\u884C\u4E2D', hint: '\u6B63\u5728\u505A' },\n { status: 'COMPLETED', label: '\u5DF2\u5B8C\u6210', hint: '\u6536\u5C3E' },\n { status: 'CANCELLED', label: '\u7EC8\u6B62', hint: '\u4E0D\u505A\u4E86' },\n]\n\nconst PRIORITY_LABEL: Record<number, string> = { 0: '\u65E0', 5: '\u4E2D', 9: '\u9AD8' }\n\nfunction errorText(error: unknown): string {\n return error instanceof ApiError || error instanceof Error ? error.message : String(error)\n}\n\nfunction dateKey(value: Date): string {\n const pad = (n: number): string => String(n).padStart(2, '0')\n return `${String(value.getFullYear())}-${pad(value.getMonth() + 1)}-${pad(value.getDate())}`\n}\n\nfunction weekEnd(): string {\n const now = new Date()\n const end = new Date(now)\n end.setDate(now.getDate() + (7 - ((now.getDay() + 6) % 7)))\n return dateKey(end)\n}\n\nfunction dueText(due: string): string {\n if (due === '') return ''\n const value = due.slice(0, 10)\n const today = dateKey(new Date())\n if (value < today) return `\u903E\u671F ${value}`\n if (value === today) return '\u4ECA\u5929'\n return value\n}\n\nconst EMPTY = {\n title: '',\n notes: '',\n due: '',\n priority: 0,\n status: 'NEEDS-ACTION' as Task['status'],\n owner: '',\n projectId: '',\n}\n\nexport function TasksIcon(): ReactNode {\n const [count, setCount] = useState(0)\n useEffect(() => {\n let cancelled = false\n const load = async (): Promise<void> => {\n try {\n const app = await api.state()\n const accountId = app.settings.activeAccountId\n if (accountId === null) return\n const result = await api.tasks(accountId)\n if (!cancelled) {\n setCount(\n result.items.filter((task) => task.status !== 'COMPLETED' && task.status !== 'CANCELLED').length,\n )\n }\n } catch {\n // A logged-out profile simply shows no badge.\n }\n }\n void load()\n const timer = window.setInterval(() => {\n void load()\n }, 60_000)\n return () => {\n cancelled = true\n window.clearInterval(timer)\n }\n }, [])\n\n return h(\n 'span',\n {\n style: {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '18px',\n height: '18px',\n },\n },\n h(Icon, { name: 'checklist', size: 16 }),\n count > 0\n ? h(\n 'span',\n {\n style: {\n position: 'absolute',\n right: '-5px',\n bottom: '-3px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n minWidth: '13px',\n height: '13px',\n padding: '0 3px',\n borderRadius: '999px',\n background: '#5686fe',\n color: '#fff',\n fontSize: '9px',\n fontWeight: 600,\n lineHeight: '13px',\n boxShadow: '0 0 0 2px var(--dsw-alias-bg-base, #151517)',\n pointerEvents: 'none',\n },\n },\n count > 99 ? '99+' : String(count),\n )\n : null,\n )\n}\n\nexport function TasksPanel(): ReactNode {\n const [state, setState] = useState<AppState | null>(null)\n const [tasks, setTasks] = useState<Task[]>([])\n const [projects, setProjects] = useState<Project[]>([])\n const [filter, setFilter] = useState<Filter>('all')\n const [projectFilter, setProjectFilter] = useState('')\n const [error, setError] = useState('')\n const [toast, setToast] = useState('')\n const [busy, setBusy] = useState(false)\n const [editing, setEditing] = useState<Task | null>(null)\n const [creating, setCreating] = useState<Task['status'] | null>(null)\n const [dragging, setDragging] = useState<string | null>(null)\n const [tick, setTick] = useState(0)\n\n const accountId = state?.settings.activeAccountId ?? null\n\n useEffect(() => {\n api\n .state()\n .then(setState)\n .catch((caught: unknown) => setError(errorText(caught)))\n }, [tick])\n\n useEffect(() => {\n if (accountId === null) return\n let cancelled = false\n Promise.all([api.tasks(accountId), api.projects()])\n .then(([list, projectList]) => {\n if (cancelled) return\n setTasks(list.items)\n setProjects(projectList.items)\n })\n .catch((caught: unknown) => {\n if (!cancelled) setError(errorText(caught))\n })\n return () => {\n cancelled = true\n }\n }, [accountId, tick])\n\n const refresh = useCallback((): void => {\n setTick((value) => value + 1)\n }, [])\n\n const notify = (message: string): void => {\n setToast(message)\n window.setTimeout(() => {\n setToast('')\n }, 3000)\n }\n\n const matchesFilter = useCallback(\n (task: Task): boolean => {\n const today = dateKey(new Date())\n const end = weekEnd()\n if (filter === 'overdue') return task.due !== '' && task.due.slice(0, 10) < today\n if (filter === 'today') return task.due.slice(0, 10) === today\n if (filter === 'week') return task.due !== '' && task.due.slice(0, 10) <= end\n return true\n },\n [filter],\n )\n\n const switchAccount = async (id: string): Promise<void> => {\n try {\n await api.activateAccount(id)\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const move = async (task: Task, status: Task['status']): Promise<void> => {\n if (task.status === status) return\n try {\n const { task: updated } = await api.updateTask(task.id, { status })\n setTasks((current) => current.map((item) => (item.id === task.id ? updated : item)))\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const remove = async (task: Task): Promise<void> => {\n try {\n await api.deleteTask(task.id)\n setTasks((current) => current.filter((item) => item.id !== task.id))\n notify('\u4EFB\u52A1\u5DF2\u5220\u9664')\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const openSource = async (task: Task): Promise<void> => {\n if (task.messageKey === '') return\n try {\n const found = await api.lookupMessage(task.accountId, task.messageKey)\n requestOpenMail({ accountId: task.accountId, id: found.id, mailbox: found.mailbox })\n document.querySelector<HTMLElement>('button[aria-label=\"MailHarbor\"]')?.click()\n } catch (caught) {\n setError(errorText(caught))\n }\n }\n\n const save = async (draft: typeof EMPTY & { id?: string }): Promise<void> => {\n if (accountId === null) return\n setBusy(true)\n setError('')\n try {\n if (draft.id === undefined) {\n await api.createTask({\n accountId,\n title: draft.title,\n notes: draft.notes,\n due: draft.due,\n priority: draft.priority,\n status: draft.status,\n owner: draft.owner,\n projectId: draft.projectId === '' ? null : draft.projectId,\n })\n } else {\n await api.updateTask(draft.id, {\n title: draft.title,\n notes: draft.notes,\n due: draft.due,\n priority: draft.priority,\n status: draft.status,\n owner: draft.owner,\n projectId: draft.projectId === '' ? null : draft.projectId,\n })\n }\n setEditing(null)\n setCreating(null)\n notify('\u4EFB\u52A1\u5DF2\u4FDD\u5B58')\n refresh()\n } catch (caught) {\n setError(errorText(caught))\n } finally {\n setBusy(false)\n }\n }\n\n return h(\n 'div',\n { className: 'mailharbor mailharbor-tasks' },\n h(\n 'div',\n { className: 'mailharbor-topbar' },\n h(Icon, { name: 'checklist', size: 16 }),\n h('strong', { style: { fontSize: '13px' } }, '\u4EFB\u52A1'),\n state === null || state.accounts.length < 2\n ? null\n : h(\n 'select',\n {\n value: accountId ?? '',\n onChange: (event: { target: { value: string } }) => void switchAccount(event.target.value),\n 'aria-label': '\u8D26\u53F7',\n },\n state.accounts.map((account) =>\n h('option', { key: account.id, value: account.id }, account.label),\n ),\n ),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n { className: 'primary', onClick: () => setCreating('NEEDS-ACTION') },\n h(Icon, { name: 'plus' }),\n '\u65B0\u5EFA\u4EFB\u52A1',\n ),\n ),\n toast === ''\n ? null\n : h('div', { className: 'small', style: { padding: '6px 18px', color: 'var(--m-ok)' } }, toast),\n error === '' ? null : h(ErrorBar, { message: error, onDismiss: () => setError('') }),\n h(\n 'div',\n { className: 'tasks-board-wrap' },\n h(\n 'div',\n { className: 'tasks-toolbar' },\n h(\n 'div',\n { className: 'tasks-filters' },\n FILTERS.map((item) =>\n h(\n 'button',\n {\n key: item.id,\n className: filter === item.id ? 'chip active' : 'chip',\n onClick: () => setFilter(item.id),\n },\n item.label,\n ),\n ),\n ),\n h('span', { className: 'spacer' }),\n h(\n 'select',\n {\n value: projectFilter,\n onChange: (event: { target: { value: string } }) => setProjectFilter(event.target.value),\n 'aria-label': '\u6309\u9879\u76EE\u7B5B\u9009',\n },\n h('option', { value: '' }, '\u5168\u90E8\u9879\u76EE'),\n projects.map((project) => h('option', { key: project.id, value: project.id }, project.name)),\n ),\n h('span', { className: 'small muted' }, '\u62D6\u52A8\u5361\u7247\u53EF\u6539\u53D8\u72B6\u6001'),\n ),\n h(\n 'div',\n { className: 'tasks-board' },\n COLUMNS.map((column) => {\n const cards = tasks\n .filter((task) => task.status === column.status)\n .filter(matchesFilter)\n .filter((task) => projectFilter === '' || task.projectId === projectFilter)\n .sort((left, right) => {\n const leftDue = left.due === '' ? '9999' : left.due.slice(0, 10)\n const rightDue = right.due === '' ? '9999' : right.due.slice(0, 10)\n return leftDue.localeCompare(rightDue)\n })\n return h(\n 'div',\n {\n key: column.status,\n className: `task-column task-column-${column.status}`,\n onDragOver: (event: { preventDefault: () => void }) => {\n event.preventDefault()\n },\n onDrop: (event: { preventDefault: () => void }) => {\n event.preventDefault()\n const task = tasks.find((item) => item.id === dragging)\n if (task !== undefined) void move(task, column.status)\n setDragging(null)\n },\n },\n h(\n 'div',\n { className: 'task-column-head' },\n h('span', { className: `task-dot ${column.status}` }),\n h('strong', null, column.label),\n h('span', { className: 'task-column-count' }, String(cards.length)),\n h('span', { className: 'spacer' }),\n h(\n 'button',\n {\n className: 'subtle icon',\n title: `\u5728\u300C${column.label}\u300D\u4E2D\u65B0\u5EFA`,\n onClick: () => setCreating(column.status),\n },\n h(Icon, { name: 'plus', size: 14 }),\n ),\n ),\n h(\n 'div',\n { className: 'task-column-body' },\n cards.length === 0\n ? h('div', { className: 'task-column-empty' }, column.hint)\n : cards.map((task) =>\n h(\n 'article',\n {\n key: task.id,\n className: `task-card${dragging === task.id ? ' dragging' : ''}`,\n draggable: true,\n onDragStart: () => setDragging(task.id),\n onDragEnd: () => setDragging(null),\n onClick: () => setEditing(task),\n },\n h(\n 'div',\n { className: 'task-card-top' },\n h('span', { className: `task-priority p${String(task.priority)}` }),\n h('span', { className: 'task-card-title' }, task.title),\n h(\n 'button',\n {\n className: 'task-card-delete',\n title: '\u5220\u9664\u4EFB\u52A1',\n onClick: (event: { stopPropagation: () => void }) => {\n event.stopPropagation()\n void remove(task)\n },\n },\n h(Icon, { name: 'close', size: 12 }),\n ),\n ),\n task.notes === '' ? null : h('p', { className: 'task-card-notes' }, task.notes),\n h(\n 'div',\n { className: 'task-card-meta' },\n task.due === ''\n ? null\n : h(\n 'span',\n {\n className:\n task.due.slice(0, 10) < dateKey(new Date()) && task.status !== 'COMPLETED'\n ? 'task-due overdue'\n : 'task-due',\n },\n h(Icon, { name: 'calendar', size: 12 }),\n dueText(task.due),\n ),\n task.owner === '' ? null : h('span', { className: 'task-owner' }, task.owner),\n task.projectId === null\n ? null\n : h(\n 'span',\n { className: 'task-project' },\n projects.find((project) => project.id === task.projectId)?.name ?? '\u9879\u76EE',\n ),\n task.priority > 0\n ? h(\n 'span',\n { className: 'task-priority-label' },\n `\u4F18\u5148\u7EA7 ${PRIORITY_LABEL[task.priority] ?? String(task.priority)}`,\n )\n : null,\n ),\n task.messageKey === ''\n ? null\n : h(\n 'button',\n {\n className: 'task-source',\n onClick: (event: { stopPropagation: () => void }) => {\n event.stopPropagation()\n void openSource(task)\n },\n },\n h(Icon, { name: 'mail', size: 12 }),\n '\u6765\u6E90\u90AE\u4EF6',\n ),\n ),\n ),\n ),\n )\n }),\n ),\n ),\n creating !== null || editing !== null\n ? h(TaskEditor, {\n task: editing,\n status: creating ?? 'NEEDS-ACTION',\n projects,\n busy,\n onClose: () => {\n setCreating(null)\n setEditing(null)\n },\n onSave: (draft) => void save(draft),\n })\n : null,\n )\n}\n\nfunction TaskEditor({\n task,\n status,\n projects,\n busy,\n onClose,\n onSave,\n}: {\n task: Task | null\n status: Task['status']\n projects: Project[]\n busy: boolean\n onClose: () => void\n onSave: (draft: typeof EMPTY & { id?: string }) => void\n}): ReactNode {\n const [draft, setDraft] = useState({\n ...EMPTY,\n status,\n ...(task === null\n ? {}\n : {\n id: task.id,\n title: task.title,\n notes: task.notes,\n due: task.due.slice(0, 10),\n priority: task.priority,\n status: task.status,\n owner: task.owner,\n projectId: task.projectId ?? '',\n }),\n })\n const set = (patch: Partial<typeof draft>): void => setDraft((current) => ({ ...current, ...patch }))\n\n return h(\n Modal,\n {\n title: task === null ? '\u65B0\u5EFA\u4EFB\u52A1' : '\u7F16\u8F91\u4EFB\u52A1',\n onClose,\n wide: true,\n footer: h(\n 'div',\n { className: 'task-editor-foot' },\n h('span', { className: 'small muted' }, '\u63D0\u793A\uFF1A\u4EFB\u52A1\u4F1A\u4FDD\u5B58\u5728\u672C\u5730\uFF0C\u53EF\u5728\u770B\u677F\u4E2D\u62D6\u52A8\u6539\u53D8\u72B6\u6001\u3002'),\n h('span', { className: 'spacer' }),\n h('button', { className: 'ghost', onClick: onClose }, '\u53D6\u6D88'),\n h(\n 'button',\n {\n className: 'primary',\n disabled: busy || draft.title.trim() === '',\n onClick: () => onSave(draft),\n },\n busy ? '\u4FDD\u5B58\u4E2D\u2026' : '\u4FDD\u5B58\u4EFB\u52A1',\n ),\n ),\n },\n h(\n 'div',\n { className: 'task-editor' },\n h(\n 'div',\n { className: 'task-editor-main' },\n h(\n 'div',\n { className: 'task-editor-title' },\n h('input', {\n value: draft.title,\n autoFocus: true,\n placeholder: '\u8981\u505A\u4EC0\u4E48\uFF1F',\n onChange: (event: { target: { value: string } }) => set({ title: event.target.value }),\n }),\n ),\n h(\n 'div',\n { className: 'task-editor-section' },\n h('label', null, '\u5907\u6CE8'),\n h('textarea', {\n rows: 5,\n value: draft.notes,\n placeholder: '\u80CC\u666F\u3001\u4E0B\u4E00\u6B65\u3001\u94FE\u63A5\u2026',\n onChange: (event: { target: { value: string } }) => set({ notes: event.target.value }),\n }),\n ),\n h(\n 'div',\n { className: 'task-editor-section' },\n h('label', null, '\u6765\u6E90'),\n draft.id === undefined\n ? h('span', { className: 'small muted' }, '\u4ECE\u90AE\u4EF6\u63D0\u53D6\u7684\u4EFB\u52A1\u4F1A\u81EA\u52A8\u5173\u8054\u6765\u6E90\u90AE\u4EF6\u3002')\n : h(\n 'span',\n { className: 'small muted' },\n task?.messageSubject !== undefined && task.messageSubject !== ''\n ? `\u6765\u81EA\u90AE\u4EF6\uFF1A${task.messageSubject}`\n : '\u65E0\u5173\u8054\u90AE\u4EF6',\n ),\n ),\n ),\n h(\n 'aside',\n { className: 'task-editor-side' },\n h(\n 'div',\n { className: 'task-editor-field' },\n h('label', null, '\u72B6\u6001'),\n h(\n 'select',\n {\n value: draft.status,\n onChange: (event: { target: { value: string } }) =>\n set({ status: event.target.value as Task['status'] }),\n },\n COLUMNS.map((column) => h('option', { key: column.status, value: column.status }, column.label)),\n ),\n ),\n h(\n 'div',\n { className: 'task-editor-field' },\n h('label', null, '\u622A\u6B62\u65E5\u671F'),\n h('input', {\n type: 'date',\n value: draft.due,\n onChange: (event: { target: { value: string } }) => set({ due: event.target.value }),\n }),\n ),\n h(\n 'div',\n { className: 'task-editor-field' },\n h('label', null, '\u4F18\u5148\u7EA7'),\n h(\n 'div',\n { className: 'task-priority-picker' },\n [0, 5, 9].map((value) =>\n h(\n 'button',\n {\n key: value,\n className: draft.priority === value ? 'active' : '',\n onClick: () => set({ priority: value }),\n },\n PRIORITY_LABEL[value] ?? String(value),\n ),\n ),\n ),\n ),\n h(\n 'div',\n { className: 'task-editor-field' },\n h('label', null, '\u9879\u76EE'),\n h(\n 'select',\n {\n value: draft.projectId,\n onChange: (event: { target: { value: string } }) => set({ projectId: event.target.value }),\n },\n h('option', { value: '' }, '\u65E0\u9879\u76EE'),\n projects.map((project) => h('option', { key: project.id, value: project.id }, project.name)),\n ),\n ),\n h(\n 'div',\n { className: 'task-editor-field' },\n h('label', null, '\u8D1F\u8D23\u4EBA'),\n h('input', {\n value: draft.owner,\n placeholder: '\u53EF\u9009',\n onChange: (event: { target: { value: string } }) => set({ owner: event.target.value }),\n }),\n ),\n ),\n ),\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["h", "import_react", "import_react", "import_react", "h", "import_react", "h", "import_react", "h", "request", "h", "import_react", "errorText", "h", "import_react", "errorText", "h", "import_react", "errorText", "h", "request", "errorText", "query", "items", "groups", "h", "import_react", "errorText", "h", "import_react", "errorText", "h"]
7
7
  }