odysseus/static/js
Léo c5db6ae7fd refactor(email): split the email library into seven modules
`emailLibrary/index.js` goes from 11,375 lines to 6,187. What came out:

- `settingsPage.js` (879) — the Email Settings view, its form and controls,
  away/auto-reply including the calendar-event sync, and the display
  preferences. The inline-image preference lives here rather than with the
  renderer because the settings form owns writing it.
- `unsubscribe.js` (1,224) — the bulk-unsubscribe review flow. One exported
  entry point, its own localStorage keys, its own agent-tool-output listeners.
- `reader.js` (676) — opening an email as a docked tab or a floating window,
  plus the AI summary panel both of them share.
- `menus.js` (855) — the reader More menu, the card kebab menu, the bulk
  Actions menu and `_bulkAction`.
- `bodyRender.js` (871) — plain and threaded body rendering, inline MIME
  images, quote folding.
- `attachments.js` (491) — attachment chips and the deferred load for messages
  whose attachment list was not in the list response.
- `aiReply.js` (449) — AI-reply entry points, the per-message context draft,
  the translate and remind submenus.

The extracted modules import back from `index.js`, so the graph has cycles.
That is safe for hoisted function declarations and unsafe for a value read
during evaluation, so nothing crosses a module boundary except functions:
`API_BASE` is re-declared per module, the way `emailInbox.js` and
`emailShared.js` already do it, and `_autoReplyRefreshSeq` moves into
`state.js` because the settings page and the unread-badge refresh both write
it and an imported binding is read-only. The module-graph test enters the
package at each module in turn, which is the order that would expose a
dead-zone read.

Two test helpers grew while doing this. `js_function_source` replaces three
marker-pair slices ("from this signature down to that comment") whose end
marker had moved into another module — the slice ran past the function and
kept passing against the wrong text. Its first implementation balanced braces
by walking characters and ended `_toggleCardPreview` 18 lines early, because
the apostrophe in `// that's a scroll, not a nav` opened a string that ate the
braces after it. It now keys on the invariant the file actually holds: a
top-level declaration starts at column 0, so its closing brace is the next
lone `}` at column 0.
2026-09-30 09:26:34 +02:00
..
calendar Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
color fix: theme color parsing breaks on #rgb shorthand hex (#1213) 2026-06-03 00:30:03 +09:00
compare Harden maintainer-preview harness and review fixes 2026-09-21 06:54:03 +00:00
editor Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
emailLibrary refactor(email): split the email library into seven modules 2026-09-30 09:26:34 +02:00
markdown Ignore non-string markdown table rows (#1648) 2026-06-03 14:17:02 +09:00
model fix: model cost/info matches first substring key (gpt-4o-mini billed as gpt-4o) (#1439) 2026-06-04 03:05:37 +01:00
research Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
settings Squash Odysseus development history 2026-09-11 06:04:19 +00:00
util fix: monthly schedule label shows 21th/22th/31th (ordinal suffix for days >20) (#1577) 2026-06-03 08:57:47 +09:00
a11y.js Improve accessibility across core flows (#86) 2026-06-01 22:04:00 +02:00
actionMenuOrder.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
admin.js feat(provider): add lazy Featherless model discovery 2026-09-22 13:12:19 +01:00
appConfig.js perf(frontend): share one cached fetch for /api/auth/settings and /api/tools (#5997) 2026-08-16 21:03:05 +01:00
assistant.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
backgroundToolJobs.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
calendar.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
censor.js Ignore censor preference storage errors (#1652) 2026-06-03 14:16:55 +09:00
chat.js feat(ui): refine subscription model and usage controls 2026-09-22 13:12:19 +01:00
chatgptSubscriptionUsage.js feat(ui): refine subscription model and usage controls 2026-09-22 13:12:19 +01:00
chatModelProvenance.js refactor(model-routing): centralize explicit foreground fallback policy (#6020) 2026-08-14 08:10:30 +01:00
chatRenderer.js Harden maintainer-preview harness and review fixes 2026-09-21 06:54:03 +00:00
chatStream.js Harden maintainer-preview harness and review fixes 2026-09-21 06:54:03 +00:00
chatStreamErrors.js refactor(model-routing): centralize explicit foreground fallback policy (#6020) 2026-08-14 08:10:30 +01:00
chipScroll.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
codeRunner.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
colorPicker.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
composerArrowUpRecall.js fix(chat): stop ArrowUp from eating an unsent multi-line prompt (#5875) 2026-08-07 19:34:50 +02:00
cookbook-deps-recipes.js Merge verified Odysseus fixes 2026-07-23 14:49:02 +00:00
cookbook-diagnosis.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
cookbook-hwfit.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
cookbook.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
cookbookDownload.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
cookbookPorts.js fix(cookbook): only block model launch on real port collisions (#4760) 2026-06-24 19:44:09 +02:00
cookbookProgressSignal.js Don't falsely declare a dependency build stale (#1568) (#1768) 2026-06-03 13:23:35 +09:00
cookbookRunning.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
cookbookSchedule.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
cookbookServe.js Harden maintainer-preview harness and review fixes 2026-09-21 06:54:03 +00:00
document.js fix(ui): restore rich text controls and accessible research map 2026-09-22 23:26:43 +01:00
documentLibrary.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
documentOutline.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
documentStats.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
dragSort.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
emailInbox.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
emailLibrary.js refactor(email): move emailLibrary.js into static/js/emailLibrary/ 2026-09-30 09:08:21 +02:00
emailShared.js Polish mobile UI and editor workflows 2026-06-27 13:05:44 +00:00
emojiPicker.js fix(modal): keep body-portaled dropdowns above their tool modal at any stack depth (#4720) (#4724) 2026-06-23 10:24:31 +02:00
emojiShortcodes.js Render emoji shortcodes as icons in chat (#345) (#629) 2026-06-05 02:28:42 +02:00
escMenuStack.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
fileHandler.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
gallery.js Harden maintainer-preview harness and review fixes 2026-09-21 06:54:03 +00:00
galleryEditor.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
group.js Harden maintainer-preview harness and review fixes 2026-09-21 06:54:03 +00:00
init.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
keyboard-shortcuts.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
langIcons.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
liveThinkingThrottle.js perf(chat): batch live thinking rendering and bound timer updates (#5931) 2026-08-10 20:11:48 +01:00
markdown.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
memory.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
mobileBulkSelect.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
modalManager.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
modalSnap.js Merge remote-tracking branch 'origin/dev' into test-main-dev-merge-20260615 2026-06-15 21:20:15 +09:00
modelPicker.js feat(ui): refine subscription model and usage controls 2026-09-22 13:12:19 +01:00
models.js Harden maintainer-preview harness and review fixes 2026-09-21 06:54:03 +00:00
modelSort.js Ignore invalid model sort inputs (#1653) 2026-06-03 14:16:52 +09:00
MODULE_SUMMARY.md refactor(email): split the email library into seven modules 2026-09-30 09:26:34 +02:00
notes.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
package.json Fix test suite: ESM module loading and stub isolation (#844) 2026-06-02 11:29:29 +09:00
panels.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
platform.js Ignore AltGr keystrokes in Ctrl+Alt keyboard shortcuts (#825) 2026-06-02 11:12:54 +09:00
presets.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
providerDeviceFlow.js feat: add ChatGPT Subscription provider (#2876) 2026-06-08 10:19:18 +02:00
providers.js feat(provider): add lazy Featherless model discovery 2026-09-22 13:12:19 +01:00
rag.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
researchSynapse.js fix(ui): restore rich text controls and accessible research map 2026-09-22 23:26:43 +01:00
search-chat.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
search.js perf(frontend): share one cached fetch for /api/auth/settings and /api/tools (#5997) 2026-08-16 21:03:05 +01:00
searchProviderIcons.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
section-management.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
sessions.js Harden maintainer-preview harness and review fixes 2026-09-21 06:54:03 +00:00
settings.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
sidebar-layout.js Harden maintainer-preview harness and review fixes 2026-09-21 06:54:03 +00:00
signature.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
skills.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
skillsMetrics.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
slashAutocomplete.js feat(provider): support multiple ChatGPT subscriptions with usage 2026-09-22 13:12:19 +01:00
slashCommands.js feat(provider): support multiple ChatGPT subscriptions with usage 2026-09-22 13:12:19 +01:00
spinner.js fix(ui): stop the whirlpool spinner animating when it is never attached (#5990) 2026-08-12 00:25:03 +01:00
startupShell.js perf(ui): stop session loading from blocking shell (#5927) 2026-08-10 19:37:21 +01:00
storage.js feat(a11y): add a Text size control and an OpenDyslexic font option (#4210) 2026-06-22 13:53:46 +02:00
streamingRenderer.js fix(chat): stop code-block button flicker during streaming (#3023) 2026-06-06 04:08:54 -06:00
streamingSegmenter.js fix(chat): stop code-block button flicker during streaming (#3023) 2026-06-06 04:08:54 -06:00
tasks.js Harden maintainer-preview harness and review fixes 2026-09-21 06:54:03 +00:00
theme.js Harden maintainer-preview harness and review fixes 2026-09-21 06:54:03 +00:00
tileManager.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
toolWindowZOrder.js fix(modal): keep body-portaled dropdowns above their tool modal at any stack depth (#4720) (#4724) 2026-06-23 10:24:31 +02:00
tourAutoplay.js feat(provider): support multiple ChatGPT subscriptions with usage 2026-09-22 13:12:19 +01:00
tourHints.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
tts-ai.js perf(frontend): share one cached fetch for /api/auth/settings and /api/tools (#5997) 2026-08-16 21:03:05 +01:00
turnRendering.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
ui.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00
ui_visibility.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
voiceRecorder.js Odysseus v1.0 2026-05-31 23:58:26 +09:00
windowDrag.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
windowResize.js Squash Odysseus development history 2026-09-11 06:04:19 +00:00
workspace.js Consolidate Odysseus agent harness and tool contracts 2026-09-17 10:07:40 +00:00