feat(core): the e-mail program after Java, measured against Java

The program sends to its account's SMTP server, one connection for each
recipient, and fetches its mails by POP3; the server now sends mails on
to other domains by MX and returns notices to their senders. The
program's folders are in the snapshot and go back into the project.
EmailClientRun plays six stories with two servers; the mail oracles run
in the language's locale, so Java's notice dates match the core's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-01 19:38:44 +00:00
co-authored by Claude Opus 5.5
parent 015635926f
commit 058675a148
30 changed files with 58319 additions and 1724 deletions
+5
View File
@@ -22,6 +22,7 @@ import type {
SwitchConfiguration,
WebServerConfiguration,
EmailServerAccount,
EmailClientConfiguration,
} from './config.js';
import type { VirtualFileSystem } from '../model/virtualFileSystem.js';
import type { PageLanguage } from './apps/routerPages.js';
@@ -102,6 +103,8 @@ export interface TopologySnapshot {
readonly webBrowserNodeIds: ReadonlySet<Id>;
/** The installed e-mail servers, by node; a run's deliveries change their mailboxes here. */
readonly emailServersByNodeId: ReadonlyMap<Id, EmailServerSnapshot>;
/** The installed e-mail programs, by node; a run's sent and fetched mails change their folders here. */
readonly emailClientsByNodeId: ReadonlyMap<Id, EmailClientConfiguration>;
/** Each node's files, which its programs read (a web server its pages). */
readonly fileSystemsByNodeId: ReadonlyMap<Id, VirtualFileSystem>;
/** The language of the pages the devices write themselves (a router's), as Java's in the locale it runs in. */
@@ -127,6 +130,7 @@ export interface TopologySnapshotInput {
webServersByNodeId?: ReadonlyMap<Id, WebServerSnapshot>;
webBrowserNodeIds?: ReadonlySet<Id>;
emailServersByNodeId?: ReadonlyMap<Id, EmailServerSnapshot>;
emailClientsByNodeId?: ReadonlyMap<Id, EmailClientConfiguration>;
fileSystemsByNodeId?: ReadonlyMap<Id, VirtualFileSystem>;
language?: PageLanguage;
}
@@ -151,6 +155,7 @@ export function topologySnapshot(input: TopologySnapshotInput): TopologySnapshot
webServersByNodeId: input.webServersByNodeId ?? new Map(),
webBrowserNodeIds: input.webBrowserNodeIds ?? new Set(),
emailServersByNodeId: input.emailServersByNodeId ?? new Map(),
emailClientsByNodeId: input.emailClientsByNodeId ?? new Map(),
fileSystemsByNodeId: input.fileSystemsByNodeId ?? new Map(),
language: input.language ?? 'de',
};