Commit Graph
4278 Commits
Author SHA1 Message Date
Linus Rath 22a783efe0 fix: check an invitation's sender also when it claims one of the user's own addresses 2026-11-03 00:43:16 +01:00
Linus Rath 6ef1397a53 fix: refuse to switch the out-of-office on for a plugin while it forwards mail or that can't be read 2026-11-03 00:42:30 +01:00
Linus Rath 23c410ddea fix: ask the server whether a folder is shared before a plugin's move, filter or archive files mail there 2026-11-03 00:29:02 +01:00
Linus Rath 267ca40522 Merge branch 'feat/assistant-everywhere' into feat/assistant-c 2026-11-03 00:24:12 +01:00
Linus Rath 8b49c00b9a Merge the assistant in every view (package F) 2026-11-03 00:24:02 +01:00
Linus Rath 82c3c969be fix: keep calendar.deleteEvent working for callers whose client names no account 2026-11-03 00:00:17 +01:00
Linus Rath 363c797178 feat: let a plugin dialog fill the window's visible height, so a chat fits above a phone's keyboard 2026-11-02 23:59:57 +01:00
Linus Rath 0fb8f44cc4 test: expect the out-of-office's forward flag in vacation.get
vacation.get now also says whether the out-of-office forwards mail
(forwardActive, from the area c host APIs), so the test that pins the
whole answer names it too. The other fields are as they were.
2026-11-02 23:56:35 +01:00
Linus Rath ad36f8d382 fix: show the side panel only where the plugin does, and keep it steady
- The button and the panel of Calendar, Contacts, Files and Settings
  show only when the plugin's shouldShow says yes, so a plugin switched
  off for these views (admin, user or no service) leaves no button that
  opens an empty panel, and no extra rows in Contacts and Settings.
- Files: while the details are open the panel steps aside there only;
  the other views keep it as the user left it. With both stored open the
  details fold when the page loads.
- Resizing stops where the view keeps its 480 px, so a drag or the arrow
  keys no longer fold the panel away (and the handle keeps the focus).
- Settings and Contacts render the same element with or without the
  panel, so a form keeps what was typed when the panel starts docking.
- Contacts on a phone: the panel button sits over an open contact too.
- The panel buttons of the reader and the views have one name, "Plugin
  panel", with aria-pressed, and name the plugin's panel shortcut in
  their title; the open panels are named landmarks.

The reader tests look the button up by its new name and pressed state
(viewer-toolbar-over-side-panel, reader-plugin-surfaces,
viewer-plugin-panel-width), since "Show/Hide plugin panel" is gone.
2026-11-02 23:54:53 +01:00
Linus Rath a256beb918 fix: tell each plugin whether it may show the side panel
api.host.features.sidePanel now says whether this plugin may offer the
app-side-panel (ui:side-panel granted), not only that the webmail has
it. A plugin enabled before an update added the permission can then say
so instead of offering a switch that does nothing. The host computes the
assistant's flags per plugin for a frame's init and for each push.

plugin-host-features.test.ts: the host bridge assertions take the
assistant's flags as the test plugin sees them (it lacks ui:side-panel,
so sidePanel is false there).
2026-11-02 23:54:52 +01:00
Linus Rath d5c558d747 fix: undo the first filter rule again, which left its script active and in place 2026-11-02 23:49:14 +01:00
Linus Rath ecaad2b3d9 Merge branch 'feat/assistant-everywhere' into feat/assistant-f 2026-11-02 23:37:41 +01:00
Linus Rath 89df82adce fix: answer an invitation whose event lies outside the calendar's loaded weeks 2026-11-02 23:29:43 +01:00
Linus Rath d3d150d2c4 fix: let plugins answer invitations found by a search of the user's own mail 2026-11-02 23:20:54 +01:00
Linus Rath fd30fdcd27 feat: let plugins answer invitations, add filter rules, change many messages and change settings, with undo
The AI assistant's "more actions" need host calls today's plugin API
lacks. Area c of lib/plugin-sandbox/assistant adds them:

- `calendar.respond(emailId, status)`, new permission calendar:respond:
  answers an invitation of the user's own account through
  lib/calendar-rsvp.ts, like the reader's banner
- `calendar.deleteEvent` now returns an undo token for a single event;
  `calendar.undoDelete` creates it again from the host's copy
- `filters.list/create/undo` over Settings > Filters' model; forward,
  redirect, reject, discard and keep are refused, and so are folders
  that are shared or not the account's own
- `email.batch/undoBatch`: up to 200 messages through the store's
  batch functions, restore points first, one entry in the undo history
- `vacation.get` also says whether the out-of-office forwards mail
- `app.describeSettings`, `app.setSettings` and `app.undoSettings`, new
  permission settings:change, over the allow-list in
  lib/settings-schema.ts, refusing locked, hidden, restricted and gated
  settings when the change is made

Undo tokens stay in the host for 30 minutes, bound to the plugin and
the account. app.getSettings now shows every setting setSettings may
change. settings:write's text is reworded to what it gates (tags).
plugin-host-api-app-info gains a test; its other assertions are as
they were.
2026-11-02 23:14:23 +01:00
Linus Rath 6a6a8e829c feat: let batch archive and tags act on the messages a caller names 2026-11-02 23:14:22 +01:00
Linus Rath c7e88c249e fix: sync the setting that deletes junk mail for good between devices 2026-11-02 23:14:22 +01:00
Linus Rath 8905d31b38 fix: show the admin's locks for plain text and the reply identity on the composing page 2026-11-02 23:14:21 +01:00
Linus Rath 7dd5fe41c3 refactor: answer invitations from one place the reader's banner and plugins share 2026-11-02 23:14:21 +01:00
Linus Rath adb32aba3a fix: turn off a host flag the webmail stops naming 2026-11-02 23:03:49 +01:00
Linus Rath 2dbf565345 Merge the host flags fix from the every-view package 2026-11-02 22:50:21 +01:00
Linus Rath 8fcd647215 feat: let plugins show a side panel next to Calendar, Contacts, Files and Settings 2026-11-02 21:59:36 +01:00
Linus Rath dda31538af fix: hand the assistant's host flags to plugins in api.host.features
The sandbox runtime copied only the three policy flags from the host's
features, so a flag an assistant area adds (sidePanel, files, ...) never
reached api.host.features and the plugin hid the feature. The runtime
now copies every other flag the host names as true or false.

The host bridge assertions compare against withAssistant(...) like the
snapshot ones already did, because the init payload and host-change
carry the assistant's flags on top of the three policy flags.
2026-11-02 21:59:35 +01:00
Linus Rath e044299dea chore: drop lint directives the assistant's area files don't need 2026-11-02 21:21:39 +01:00
Linus Rath f7ff8212a3 refactor: give the AI assistant's host APIs one set of files per area
The assistant's new host calls come in four areas (context, actions,
Files, the panel in every view), built side by side. Each area gets its
own files under lib/plugin-sandbox/assistant for its permissions, method
table, dispatcher, host feature flags and sandbox methods; the shared
files only read the merged result. No area adds anything yet. The host
features test now compares against the core flags plus the areas' flags.
2026-11-02 21:21:06 +01:00
Linus Rath d5a362b43e feat: let plugins ask for permissions an older webmail doesn't know 2026-11-02 21:15:56 +01:00
Linus Rath bda9e11d37 fix: give the Files details panel the same header height as the other side panels 2026-11-02 21:02:05 +01:00
Linus Rath 6db1f3d373 fix: give the composer's side panels the reader's button and header 2026-11-02 20:59:53 +01:00
Linus Rath c3da79e7d5 fix: keep the assistant panel's button in the same place with no message open 2026-11-02 20:55:26 +01:00
Linus Rath 55f1875f20 refactor: take quick reply plugin recipients from the quick reply envelope #1445 2026-11-01 18:18:48 +01:00
Linus Rath 5caf3378b2 Merge pull request #1445 from illuwa-soft/feat/upstream-quick-reply-actions
feat: offer composer plugin actions in quick reply
2026-11-01 18:15:18 +01:00
Linus Rath 590d708af5 fix: say which draft details a compose-read plugin sees #1443 2026-11-01 18:15:14 +01:00
Linus Rath dd94a2b7c8 refactor: keep composer snapshot comments in English #1443 2026-11-01 18:15:13 +01:00
Linus Rath 4a597eb0dc Merge pull request #1443 from illuwa-soft/feat/upstream-composer-read-api
feat: add composer snapshots and conditional edits

# Conflicts:
#	lib/__tests__/plugin-sandbox-runtime-host-gate.test.ts
#	lib/plugin-sandbox/host-api.ts
2026-11-01 18:13:10 +01:00
Linus Rath 4cd75f4d07 refactor: keep the toast limits named and comments in English #1442 2026-11-01 18:12:42 +01:00
Linus Rath 6915813262 Merge pull request #1442 from illuwa-soft/feat/upstream-progress-toasts
feat: expose frame-scoped plugin progress toasts

# Conflicts:
#	lib/plugin-sandbox/host-bridge.ts
2026-11-01 18:11:12 +01:00
Linus Rath b903ba1e7a Merge pull request #1482 from HOLOEYE-JZ/feat/plugin-task-links
feat: let plugins set task links and related mail
2026-11-01 18:10:57 +01:00
Linus Rath cc6b8899d8 Merge pull request #1481 from HOLOEYE-JZ/feat/plugin-task-alerts
feat: let plugins set task alerts
2026-11-01 18:10:56 +01:00
Linus Rath c48b4428fa Merge pull request #1489 from VasilisNtovolos/fix/discard-pending-uploads
fix: cancel pending attachment uploads when discarding a draft
2026-11-01 18:10:50 +01:00
Linus Rath a3d4853974 fix: hide out of office when the account lacks the vacation permission #1488 2026-11-01 17:48:11 +01:00
Linus Rath c4d9a918bf feat: let admins preset and lock where a new search looks #1485 2026-11-01 17:44:37 +01:00
Linus Rath e4338ac47d feat: add the Search in setting to Message list settings #1485 2026-11-01 17:44:15 +01:00
Linus Rath 3c2eb9bffa feat: let a new search look only in the open folder #1485 2026-11-01 17:43:51 +01:00
Linus Rath aaafe428fe test: expect the full send options in the Pro compose draft account test #523 2026-11-01 17:40:53 +01:00
Linus Rath 52350876fd fix: label the offline and version API routes in metrics and error reports 2026-11-01 17:40:33 +01:00
Linus Rath 300d49a917 test: give the push prompt test's settings store mock the calendar sync bridge 2026-11-01 17:38:58 +01:00
Linus Rath 1b2281a4fc fix: stop the sidebar re-rendering on every message open #1486 2026-11-01 17:36:29 +01:00
Linus Rath 42a09f573d fix: let the Lite host scan accept the licence links in the PST worker 2026-11-01 17:26:31 +01:00
Linus Rath 296f728605 fix: copy the PST worker build script into the Docker image 2026-11-01 17:26:13 +01:00
Linus Rath 7e88eeaa60 test: send archived items without accountId like Stalwart does for regular users #1480 2026-11-01 17:25:23 +01:00