Skip to content

AbstractCore v2.22.0

Choose a tag to compare

@github-actions github-actions released this 01 Oct 02:24
· 255 commits to main since this release

Mailbox servers are found from the address, the web console's Email tab connects over IMAP with
every server field visible and pre-filled, a settings save keeps the keys this version does not
know, and transcription routes written with a download provider are repaired. The terminal console
abstractcore-console 0.6.0 ships with this release.

Added

  • abstractcore.comms.email.discovery.discover_servers(address) and POST /acore/email/discover:
    a mailbox's IMAP and SMTP servers are found from its address (known providers, the domain's
    autoconfig file, the Thunderbird ISPDB, DNS SRV, then MX; HTTPS only, public hosts only, safe
    XML). PUT /acore/email and abstractcore email connect without servers discover them; nothing
    found is a 400 email_discovery_failed listing the steps tried. `abstractcore email discover ` prints the result.
  • abstractcore.comms.email.discovery.server_defaults(address, discovered=None): the server
    fields a mailbox form pre-fills (the discovered servers and login, else the standard
    imap.<domain> 993 SSL and smtp.<domain> 465 SSL), with one sentence saying which.
    POST /acore/email/discover and abstractcore email discover --json return it as defaults.
  • PUT /acore/email/folder, EmailAccountStore.set_folder() and abstractcore email folder <name>: the folder the mailbox is read from changes without connecting again (empty = INBOX).
  • GET /acore/email and abstractcore email status --json list oauth_providers (whether this
    version has a built-in sign-in client for Google and Microsoft) and registered_address_stored.
  • abstractcore.console.themes.KIT_SWITCH_CSS and KIT_FORM_CSS: the UI kit's switch and form,
    card and tabs rules (ui-kit 0.3.3), copied verbatim by abstractcore.console.theme_sync
    (parse_kit_block), which refuses a kit without them.
  • Model catalog: an artifact may carry route: {key, provider, model}, the capability route that
    runs it when the engine is not the download provider (model_catalog.route_for_download).
    The speech input model (Hugging Face Systran/faster-whisper-base) is run by faster-whisper
    base.

Changed

  • Web console, Email tab: in order, Email address (the only field with a Save button),
    Mailbox, the Agent email tools switch, and Advanced. The Mailbox tabs are IMAP
    (first, the default), Google and Microsoft. The IMAP pane shows every field: Mailbox
    address, Password, and Incoming mail (IMAP) and Outgoing mail (SMTP) as Server / Port / Security
    rows, filled with imap.<domain> 993 SSL and smtp.<domain> 465 SSL as soon as the address has
    a domain, then with the discovered settings, never over a field you edited; one line says where
    they came from. There are no User name or Display name fields: a small link "My provider uses a
    different login name" shows a Login field, and "Custom certificate" shows the CA file. One
    Connect tests reading and sending, then stores; an error names the step that failed. Once
    connected, the Mailbox card shows the status line, the Active switch, Test, and
    Disconnect with an inline confirmation. Advanced is three short sentences saved as you edit:
    who your agents may send to, "At most N per hour and N per day", and the watched folder.
    "Save and test", "Turn on/off", "Save policy" and "Save limits" are gone; the CLI hint uses
    --password-stdin. Forms are at most 720 px wide with labels above the fields.
  • Web console and terminal console, Email: the address is asked once. With no email address
    stored and no mailbox, the mailbox form's address is the only address field (connecting sets the
    email address from it). With an email address stored, the mailbox form shows "Mailbox account: — Use a different account"; the link shows the field, prefilled, and the email address is read-only until you connect or go back to it. "Your mailbox is a different account" shows only when the two addresses differ.
  • Email send limits default to 100 per hour and 1000 per day (were 20 and 100). Connecting a
    mailbox does not store the defaults, so an account where nobody set limits follows the
    defaults; limits set with abstractcore email limits set, PUT /acore/email/limits or the
    console are stored with set_by: "user" (only the windows set) and kept across upgrades.
    abstractcore email limits reset (EmailAccountStore.reset_limits()) follows the defaults
    again. The limits document gains source: default | user | legacy.
  • Connecting a mailbox sets the email address when none is stored. A connection given no display
    name keeps the stored one, else uses the address's local part (abstractcore email connect --display-name still sets it); a connection given no user name signs in with the discovered
    form, else the address.
  • Web console on phones: the content uses the full width (flat sections, one page scroll); the
    list panels fold from their heading and the browser remembers it. The dark/light control is a
    "Dark theme" switch.
  • abstractcore email texts say "Email address" and "Use this mailbox".
  • Terminal console abstractcore-console 0.6.0: the Email screen follows the web console card
    by card: Email address with its own Save; the Mailbox card with the tabs IMAP (first, the
    default), Google and Microsoft, the IMAP tab showing every server field pre-filled from the
    address (standard values at once, then abstractcore email discover --json defaults, never
    over an edit), Login and CA file behind small links, the address asked once, and one Connect;
    connected: status line, the Active switch, Test and Disconnect with an inline confirmation;
    the Agent email tools switch; Advanced as three sentences (recipients, limits, watched
    folder) saved as you edit, every failure with its cause inline. On/off settings on every screen
    are switches ([x] on, [ ] off, [-] unavailable with the reason; Space or Enter) that
    apply at once; switching on a flag marked UNSAFE still asks first. The Routes screen reads a
    route whose provider is no engine (for example input.voice = huggingface) as "unknown
    engine" with AbstractCore's reason. It needs this release's abstractcore email discover and
    abstractcore email folder. See Terminal console.

Fixed

  • A Hugging Face model on a computer with no Hugging Face cache yet reads as not downloaded
    (absent, downloadable), not unknown: a fresh install's Transcription card said "Unknown" and
    "Download all" skipped the model.
  • Transcription showed "Engine missing: unknown AbstractVoice engine 'huggingface'": the
    recommended download plan asked AbstractVoice for the engine of the download provider
    (huggingface) instead of the route's engine (faster-whisper). Plan rows carry
    route_provider / route_model and judge that engine; the grid probes the transcription
    model's weights in the Hugging Face cache. Any other unknown voice provider says to pick a
    transcription engine (Multimodal page in the gateway console, Routes in the core console).
    Speech input accepts AbstractVoice's aliases (whisper, local, hf, transformers).
  • The default allowlist entry follows the registered address when it changes
    (EmailAccountStore.set_registered_address swaps the old address for the new one), so a sign-in
    code or a notification to a changed address is no longer refused as "not in the allowlist".
    evaluate(..., self_addresses=) lets a caller treat given addresses as allowlist entries.
  • Web console: Copy buttons work when the console is opened over plain http from another machine
    (textarea fallback when the Clipboard API is unavailable) and say "Copy failed — select and
    copy" when nothing was copied.
  • A settings save keeps the keys this version does not know in abstractcore.json: top-level
    keys, unknown fields of every section, unknown capability_defaults keys and route keys this
    version cannot parse, unknown provider_profiles keys and unknown columns of a profile that
    still exists are written back unchanged. Before, the first save after a restart (any setter: a
    route, a default, a timeout) removed a key you added yourself (a top-level key,
    vision.user_note) and every key a newer AbstractCore had written. Known keys are validated as
    before, and a route or profile you delete stays deleted.

Migration

  • Config repair on load: a stored input.voice route that holds a catalog download pair
    (huggingface / Systran/faster-whisper-base) is rewritten to the catalog's route
    (faster-whisper / base) the first time this version loads the config, after writing a copy
    of the file to abstractcore.json.route-repair-<time>.bak (mode 0600). The repair runs once and
    changes nothing else; any other route is left as it is.
  • Send limits: an unmarked 20 / 100 stored by 2.21 or earlier (the old defaults, written at
    connect) follows the new defaults 100 / 1000; any other unmarked value is kept as a legacy
    limit. Run abstractcore email limits set to keep 20 / 100, or abstractcore email limits reset to follow the defaults.
  • Keys written by a newer AbstractCore, or added by hand, survive saves from this version: a
    downgrade followed by an upgrade keeps them.
  • abstractcore-console 0.6.0 calls abstractcore email discover and abstractcore email folder: upgrade AbstractCore to 2.22.0 together with the terminal console.

Documentation

  • Docker: the server examples name the current image, ghcr.io/lpalbou/abstractcore-server:2.22.0.
  • Email describes server discovery, the folder verb, the Email tab's cards and
    the terminal Email screen; Centralized Config describes how a save
    keeps unknown keys and the voice-route repair.