Skip to content

Maxwell v0.1.14

Latest

Choose a tag to compare

@github-actions github-actions released this 14 Oct 22:55
· 192 commits to main since this release

0.1.14 — 2026-10-14

Install with --version v0.1.14. Release assets include source, installers, checksums and the versioned container image digest.

  • Match custom site API roots and arbitrarily nested routes before Caddy's static handler, including Dev routes; prevent working backend endpoints from returning public static-file 404s.
  • Bake pinned python-chess into the trusted shared site runtime and advertise legal-rule support without permitting generated package installs. Existing site containers remain unchanged until explicitly restarted.
  • Add owner/admin-only site_server(action=request) for bounded public API verification with fixed HTTP methods and JSON bodies, no redirects or path escapes, and private mutation restrictions; avoid blocked shell HTTP calls.
  • Include the configured public-root prefix in site contracts and frontend guidance so Dev sites target /dev/bot/.../api/ instead of Main's 404 endpoints.
  • Preserve sticker-bearing final replies after tool progress by using the normal sticker delivery path instead of the text-only placeholder transition (GitHub #73); keep numeric sticker directives intact during transcript-mention cleanup.
  • Fix elapsed playing/watching/listening/competing activities to serialize Discord timestamps in milliseconds instead of calling an unavailable SDK constructor.
  • Resolve animated reactions and message emojis by live Discord ID, preserving renamed emojis and application assets with colliding server names. Accept reaction IDs/API notation, expose animation/sticker formats, support sticker ID markers and verify PNG/APNG/GIF/Lottie native dispatch. Clarify bot animation capabilities without Nitro and use compatible WebP emoji previews.
  • Keep chess model context text-only: FEN, last move and legal moves with tactical notes. Show board PNGs only in Discord, render them once per update, and avoid image payloads, duplicate text boards and growing full move histories in tool results.
  • Only explicit [STICKER (name)] markers become stickers. Ordinary brackets such as [Help], [OK], and [100] stay in the text.
  • Privacy Off also deletes Maxwell's replies to that account, quoted text stored on those replies, and tool records from that account's turns. Another person's own message stays, without that quote.
  • Send GIF replies as the GIF file alone. Reaction phrases use the keyless nekos.best catalog. Other phrases still use Giphy when GIPHY_API_KEY is set.
  • Add a /config Privacy choice for message-content storage. Off stops saving that account's messages and deletes stored messages and facts for that Discord user. A live request is still answered and still sent to the AI provider.
  • Add optional Giphy GIF replies, reaction-only completion and read-only-channel ping acknowledgements without forced text or retry loops.
  • Refresh application emojis and official Discord sticker packs every five minutes; handle live server emoji/sticker updates, animated expressions, joins and removals while preserving server isolation.
  • Remove automatic first-use Terms/Privacy DMs and their per-user records/locks from the runtime. Keep operator-specific policy links in shared model context even with tools disabled; offer them when asked, never invent another instance's policies. Preserve existing notice/consent data without reading or rewriting it.
  • Add guarded isolated Dev lifecycle and offline ephemeral pytest commands, optional local-model/music services, and a reviewed dev-to-main promotion workflow without automatic public deployment.
  • Stamp Dev images with their checkout revision and document draining the bind-mounted public bot before updating source, so restart/promotion diagnostics identify the applied revision without mixed live code.
  • Wait for the lazy Lavalink connection's ready handshake on the first music request instead of returning a false node-outage error. Bound readiness waits, share startup across callers and wake pending waits on shutdown.
  • Replace unattended YouTube device polling with explicit operator authorization that handles HTTP 400 pending/slow-down responses, expires cleanly and saves refresh credentials only to a private env. Keep OAuth enabled without polling on node startup.
  • Recreate Dev's cipher in the current Lavalink network namespace when applying audio changes, rather than retaining a namespace belonging to the replaced node.
  • Move conversation-history reads, writes and cleanup onto one FIFO SQLite worker. Add a covering cleanup index and an atomic stale-channel sweep; preserve scoped retention, archived rows and the 12-hour inactivity policy without stalling Discord.
  • Run request receipts, transitions, retries and effect/delivery checkpoints on a FIFO SQLite worker with WAL and FULL durability. Await irreversible-effect checkpoints and retain cancellation ownership during journal waits; drain journal work on shutdown.
  • Give the cipher sidecar 512 MiB with no swap instead of the pressure-prone 256 MiB budget; deployment is still explicit.
  • Recall bounded older transcript passages with requester-scoped FTS5 search, keeping recent history cache-stable and older text reference-only. Maintain the index across upgrades, edits and deletion; preserve archived rows and shed optional recall first when budgets shrink.
  • Add private opt-in Last.fm linking through /lastfm and the lastfm_account AI tool, with browser approval and explicit finish rather than a callback server. Encrypt owner-bound tokens/session keys and isolate Dev account data.
  • Scrobble each linked, non-deaf human listener's actual unpaused voice listening after Last.fm's threshold, including repeats and eligible autoplay. Persist qualified plays off-loop, retry provider outages without holding music locks, and remove pending work on unlink/relink. Disconnected bot voice state cannot reactivate stale listeners; late-linked listeners use their own listening-start timestamp.
  • Keep Last.fm browser approval tokens out of self-DM transcript/component context. Expire unused approvals in bounded off-loop batches and release idle owner locks, completed-upload counters and obsolete consent fences.
  • Drain in-flight turns on SIGINT and SIGTERM before closing the gateway. New messages stop immediately. DRAIN_TIMEOUT_SECONDS defaults to 30. The process supervisor and Docker stop grace wait longer than that drain.
  • Shard the Discord gateway automatically. SHARD_COUNT and SHARD_IDS select a manual cluster. Shard ready and resume resync that shard without starting a second set of workers.
  • Hydrate ^, ^^, this, that, and Discord reply references into the live prompt. An unresolved pointer is not sent to the model alone.
  • Run Discord tools, including music, from /maxwell in the server where the command was used. Private replies still go only to the requester and cannot be posted to another channel.
  • Send /maxwell rich replies through the interaction webhook even when the source channel denies view, send, or embed permissions. Server tools still see those real channel permissions.
  • Play YouTube again after the login wall. The September 2026 source plugin, a burner-account TV token in .env, and a local yt-cipher sidecar decode streams that plugin 1.18.2 refused. Title search falls back to YouTube Music when YouTube search returns nothing.
  • Keep permission-checked music controls available after web research so identifying a track does not lock playback for the rest of the turn. Preserve music action serialization, Discord authorization, source restrictions and the destructive-tool taint gate.
  • Update one persistent public music player across songs and queue changes, replace deleted/uneditable/moved panels, reject superseded controls, and keep transient Discord errors from spamming replacement embeds. Provide private queue/search/action feedback, public status fallback and ordered multi-song slash batches.
  • Add opt-in session autoplay using real YouTube radio recommendations after the requested queue ends. Preserve queue/repeat precedence, avoid recent tracks, stop automatic continuation in empty channels or on source failure, and disable autoplay on Stop.
  • Replace the audio image's obsolete Java 18 runtime with digest-pinned Temurin 21.0.12.1 LTS. Correct cgroup v2 CPU/memory detection on newer kernels and retain G1 GC with quota-sized workers instead of oversubscribing the 1.5-CPU audio container. Keep the Lavalink server and YouTube plugin versions unchanged; check JVM resource detection in CI.
  • Prepare the next autoplay recommendation while the current song plays, with at most two background preparations across guilds. Keep unrelated source searches out of the playback-state lock so queued successors and Skip do not wait for them; preserve play-request order, recheck authorization/limits at commit, and invalidate stale additions on Stop, Clear or Leave. Preserve explicit queue/repeat precedence and document remaining YouTube stream startup and unmeasured audio capacity.
  • Preserve full textual tool results through shell capture, repository inspection, plugin reads/diffs, web reads, backend logs, and follow-up rounds. Retire shell command/output size caps and pass large scripts over stdin. Provider context windows, Discord payload limits, and sandbox resource boundaries still apply.
  • Share the site route contract across runtime and tool guidance. Resolve frontend endpoints against the same-origin site API mount so nested pages work; reject literal public mounts in Python route declarations before overwriting source.
  • Keep app-action options out of stored user text, apply shared response/search defaults once, and clean legacy prompt wrappers without rewriting stored source material.
  • Record every send_message chunk under its real Discord message ID; compact legacy tool/synthetic echoes while retaining intentional repeated sends, failures and cross-channel receipts.
  • Deduplicate signed media URLs in generated context, emit one historical timestamp, reference retained reply parents by message ID, and use budgeted speaker mappings after the cacheable transcript.
  • Play the video from YouTube watch/Mix links containing list=; keep explicit playlist-only links supported. Make /music status report current playback, pause state, channel, position, volume, repeat and queue length, including idle/offline status.
  • Keep the audio bytes on app-command replies when the bot cannot post in that server. A refused channel upload is rewound before the interaction follow-up, and an empty TTS attachment is removed.
  • Add a native AI DJ plugin with shared guild music queues, on-demand voice context, permission-checked playback, slash commands and Now Playing buttons.
  • Stream YouTube videos, Music links and playlists through pinned DAVE-compatible Lavalink 4.2.2 / Lavalink.py 5.11.0 / YouTube Source 1.18.2. Provide private authenticated Docker audio deployment, reconnect recovery and idle cleanup.
  • Accept direct public audio/video reference URLs in TTS without requiring message attachments. Support reference_audio_url and URLs in reference; preserve SSRF and redirect protections, remove local audio byte/duration caps and send the full reference for provider validation.
  • Keep provider model-awareness routing compatible with providers that do not expose a model field.