Nightly Build / build (push) Canceled after 10m54s
The file viewer converts word-processor documents to PDF server-side via LibreOffice (skald_core::docx::DocxConverter), mirroring the LaTeX pipeline but content-hash cached: the format is self-contained, so there is no dependency graph and the file watcher needs no expansion. Container-only documents are shuttled out and converted on the host. With no LibreOffice installed the viewer says so and falls back to download-only. Downloads still save the original document, not the preview PDF.
162 lines
10 KiB
Markdown
162 lines
10 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to Skald Circle are recorded here, newest first.
|
|
|
|
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versions
|
|
are the workspace `Cargo.toml` version — the one `ci/verify-version.sh` checks before a
|
|
release PR may merge — and a section is closed at the commit that bumps it.
|
|
|
|
## [Unreleased]
|
|
|
|
### Added
|
|
|
|
- The file viewer opens **word-processor documents** (`.docx`, `.doc`, `.odt`, `.rtf`):
|
|
when LibreOffice is installed on the server they are converted to PDF and shown as the
|
|
document, live-reloading when the file changes, exactly like a compiled `.tex`. A
|
|
document kept only inside the user's container is converted too — the server pulls a
|
|
copy out and converts that. With no LibreOffice the page says so and offers the
|
|
download, as before. The download button still saves the original document, not the
|
|
preview PDF.
|
|
- Z.AI's new models are selectable on the **Models** page: **GLM-5.3** and **GLM-5.3-Flash**,
|
|
both with a 1M-token context. GLM-5.3-Flash is natively multimodal, so images and videos
|
|
attached to a message are sent to it directly instead of as a file path. Both always think —
|
|
Z.AI does not allow turning it off — and the reasoning control offers *low / high / max*
|
|
(default *max*) instead of an on/off switch.
|
|
|
|
### Fixed
|
|
|
|
- The **Providers** page said *API key missing* on every provider, including the ones
|
|
with a perfectly good key. It now reports the real state. Editing a provider no longer
|
|
shows the saved key in the form either — leave the field blank and the existing key is
|
|
kept, type a new one to replace it.
|
|
|
|
### Security
|
|
|
|
- An LLM provider's API key is never sent to the browser any more: the provider list and
|
|
the edit form receive only whether a key is stored, not its value.
|
|
|
|
## [0.3.0] - 2026-08-24
|
|
|
|
### Added
|
|
|
|
- The assistant can now explain the **Dashboard** and the admin's **Roles** page: ask it
|
|
why the status line says *Degraded*, whose usage the charts show (everyone's, together
|
|
— counts never content), what a role bundles — the simple interface, the default
|
|
assistant, the security groups, the new-extensions switch — or why a role edit takes
|
|
effect on open sessions immediately, and it answers from the in-app documentation
|
|
instead of guessing.
|
|
- The **Long-term memory** page (Honcho plugin) now shows, once you have opted in, what
|
|
Honcho actually remembers about you: a service-status line (connected/unreachable with
|
|
the specific error, and your memory's processing queue), a full overview (your card,
|
|
derived facts, summary) and a search-or-ask box — *search* returns the raw stored facts
|
|
matching your words, *ask* has Honcho's AI answer a question in its own words. A
|
|
built-in mini-guide explains the difference. Errors say what went wrong (unreachable
|
|
host, rejected key, server error), not just "unavailable".
|
|
- The assistant can now explain the **file viewer**, the **Tasks page**, your **Profile**
|
|
and the admin's **Users** page: ask it what a document's history button does, why a
|
|
`.tex` is shown instead of a PDF, how to stop a recurring job without losing it, what a
|
|
"cancelled" run means, what an encrypted account means when a password is forgotten, or
|
|
why it knows a member's age — and it answers from the in-app documentation instead of
|
|
guessing.
|
|
|
|
- A **Files** section in the menu: everywhere you can reach, in one place — your home,
|
|
your personal and the shared memory, the folders and projects shared with you, plus
|
|
skills and documentation. Browse, open, download a folder as a ZIP, and upload, rename
|
|
or delete wherever you have write access; the read-only places say so. Your memory
|
|
notes are readable here for the first time (changing them still goes through the
|
|
assistant).
|
|
- The assistant can be told what you are looking at: the eye next to the paperclip sends
|
|
what you have open along with your next message, so "what is this?" needs no explaining.
|
|
It names the page you are on; the folder you are browsing in Files or in a project; the
|
|
file open in the viewer and any passage you highlighted in it — line numbers included
|
|
where you are looking at the source — so "what is in here?" and "rewrite this sentence"
|
|
work without naming anything; and, on a detail page, which project (and which of its
|
|
tabs), member, connector, plugin, conversation, tool call or LLM request you opened.
|
|
The active section follows you in Tasks, Models, Background agents, the Marketplace
|
|
search and the mobile app. It is used only when your message is actually about what
|
|
you have open: asking something unrelated from inside a folder no longer sends the
|
|
assistant reading through it. Like an attachment, what the eye sends goes to the AI
|
|
provider together with your message — hover it (or tap it) to read exactly what would
|
|
go out, click it to stop sharing; the choice is remembered on this device, and every
|
|
sent message keeps a faint eye in its corner that shows, on hover, what it carried. Very long highlights are trimmed, with a
|
|
note saying how much was left out — the assistant can still read the whole file itself.
|
|
On by default.
|
|
- Several conversations per source: open extra chats with `+`, and the tab bar you left
|
|
open is restored at your next login, on any device.
|
|
- A background task now reports back into the chat that started it instead of only the
|
|
Inbox, and a chat shows the tasks still running under it.
|
|
- Skills reworked for the multi-user model: a shared tree plus a per-member one, with a
|
|
generated index injected into the agent's prompt.
|
|
- The agent is told what its sandbox can actually run, from a probe of its own container.
|
|
- Event triage can be tuned per person: a check interval that overrides the instance one,
|
|
and notification preferences read from `user-memory/notifications.md`.
|
|
- The assistant now remembers how you like emails and documents written — preferred
|
|
wording, openings, sign-offs, formal vs. informal, per-recipient exceptions — as a short
|
|
section of your private `user.md`, and applies it to later drafts.
|
|
- File viewer: syntax highlighting for code files and for code blocks in the chat, a
|
|
hover copy button on those blocks, and history browsing for a file under git.
|
|
- Project explorer: download a folder as a streaming ZIP.
|
|
- Collapsible icon-only sidebar on desktop.
|
|
- DeepInfra, as a declarative LLM provider.
|
|
- The project coordinator offers to keep a history of a project.
|
|
- An agent can ask which connectors it holds instead of guessing.
|
|
- The assistant can now explain the chat window itself (tabs, the composer's controls,
|
|
the slash commands), the Inbox and its three kinds of pending request, and the security
|
|
groups behind "why is it asking me for permission?" — ask it in plain words instead of
|
|
hunting through the pages.
|
|
|
|
### Changed
|
|
|
|
- Runtime image `v4`: Debian 13 base, plus the shared libraries a headless Chromium needs.
|
|
- Unencrypted users are unlocked and their runtimes started at boot, so Telegram, cron and
|
|
the background agents work after a restart without anyone opening the web app first.
|
|
- PDFs render through pdf.js instead of an iframe.
|
|
- The service is allowed 65536 open files instead of the default 1024. New installs get it
|
|
from the installer and existing ones from an ordinary update, unless you have set your
|
|
own limit, in which case yours is left alone.
|
|
|
|
### Fixed
|
|
|
|
- **Models → Text-to-speech** now fills the window like every other page. It was rendering
|
|
as a narrow strip in the middle of an otherwise empty screen, which made the model list
|
|
and its forms unreadably cramped.
|
|
- A connector that fails to start no longer leaves its process behind. One that started
|
|
but answered the handshake wrong — a broken or mismatched connector — was left running
|
|
on every retry, and the accumulated processes eventually used up every file handle the
|
|
server had: within hours the app stopped answering altogether, while the process, the
|
|
port and every other connector still looked healthy. Stopping or deactivating a
|
|
connector now genuinely ends its process too.
|
|
- The server keeps running after you log out of the box; the install / update / uninstall
|
|
scripts were hardened alongside it.
|
|
- Skald survives a restart of the Docker daemon.
|
|
- A user database gets the owner schema re-applied when it is opened.
|
|
- An approval bypass applies to the tool it was granted for, not to its whole connector.
|
|
- Connectors: an admin can use the ones they implicitly hold, per-user ones appear in the
|
|
security-group picker, one whose process died is brought back, a global one's
|
|
dependencies are installed where they are needed, and the prompt's connector list is
|
|
rebuilt when the set changes.
|
|
- Telegram: pairing codes are no longer burned on the way out nor handed out unrecorded,
|
|
and `send_attachment` resolves paths in the user's own workspace.
|
|
- The notification home is stored in the owner's database instead of the registry, where
|
|
it silently dropped every batch it built.
|
|
- Event triage no longer notifies you *about* the messages your preferences told it to
|
|
filter — a filtered event now produces silence rather than a notification explaining
|
|
that it was filtered.
|
|
- LLM calls send the provider's model id on the wire rather than the local alias, and
|
|
catalog capabilities resolve for reasoning-mode queries.
|
|
- `get_ast_outline` runs in the caller's workspace, gives a markdown heading a section
|
|
range instead of a single line, and shows a proper name and icon on its chat card.
|
|
- The re-login dialog no longer hijacks the login screen, the new-chat `+` menu is visible
|
|
and clickable, and the session-detail page stays live instead of freezing on a snapshot.
|
|
- A silently dead agent WebSocket is detected and redialled.
|
|
- Opening Files, Plugins, Shared folders or a plugin's own page from a link no longer
|
|
covers it with the full-screen chat: the chat docks to the side, as on every other page.
|
|
- A generated image lands in your own workspace instead of a server folder nobody could
|
|
reach, so the assistant can finally send it to you on Telegram, open it in the viewer,
|
|
or work on it with a command. It still shows inline in the web chat, its file is named
|
|
after the prompt, and it is now readable only by the person who asked for it.
|
|
|
|
---
|
|
|
|
Releases up to and including `0.2.0` predate this file; `git log` is the record for them.
|