Nightly Build / build (push) Successful in 4m27s
The stats section was designed single-user: four global charts, no attribution. Request metadata rows now carry the session's source and the frame's agent_id/depth (additive ensure_column), denormalized at log time by the LoggingModel from the owner's pool — off the turn's hot path, degrading to NULLs, never to a lost row. The dashboard gains member scope chips filtering every chart, and a breakdown row splitting the range's billed tokens by member, kind (chat / sub-agents / cron / system agents / channels), agent, model and provider — a sub-agent's spend is attributed to the sub-agent itself. Rows predating the columns group under 'older data'.
186 lines
12 KiB
Markdown
186 lines
12 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 dashboard's **LLM stats** section answers "who and what is spending tokens", not
|
|
just "how much": a row of member chips filters every chart to one person (or the whole
|
|
instance, as before), and a new breakdown row splits the billed tokens of the selected
|
|
range **by member, by kind** (chat / sub-agents / scheduled tasks / system agents /
|
|
channels), **by agent, by model and by provider** — a sub-agent's spend is attributed to
|
|
the sub-agent itself. Request metadata rows now carry the session's source and the
|
|
frame's agent/depth, denormalized at log time; older rows group under "Older data".
|
|
- 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
|
|
|
|
- **Honcho long-term memory read nothing at all** against a self-hosted Honcho v3
|
|
server: the `honcho_context` and `honcho_search` tools answered "no context", the
|
|
automatic memory injection into chats silently never happened, and the *Long-term
|
|
memory* page showed an empty overview — while the server was healthy and full of
|
|
derived facts. The plugin parsed an outdated response shape; it now reads the
|
|
`representation` / `peer_card` fields Honcho 3.0.x actually returns, and search is a
|
|
real ranked semantic search whose fact ids can be deleted via `honcho_conclude`.
|
|
- The `honcho_profile` tool could not **write** the peer card (the API rejects a bare
|
|
array — it wants a `{"peer_card": …}` wrapper) and read back a raw JSON envelope;
|
|
writes now succeed and reads show the facts, or a clean "no card set yet".
|
|
- 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.
|
|
|
|
### Changed
|
|
|
|
- The self-hosted Honcho compose setup (`honcho/docker-compose.yml`) pins the server
|
|
image **by digest (3.0.11)** instead of tracking `:latest` — ghcr publishes no v3
|
|
version tags, and an untracked pull is what silently changed the API schema under the
|
|
plugin. Upgrading Honcho is now a deliberate, verified step.
|
|
|
|
### 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.
|