Tandem v0.4.44
See the assets below to download the installer for your platform.
v0.4.44 (Released 2026-04-27)
This release turns strict knowledgebase channels from a slow LLM-driven demo path into a fast, governed KB-answering path, and adds the memory import surface needed to seed larger project/session memories from server-side files.
Strict KB channels answer quickly without leaving evidence mode
Strict KB channels now take a direct answer_question path when a knowledgebase MCP is selected and the user asks a text question. Instead of sending the request through the normal LLM tool loop and waiting for the model to repeatedly call KB tools, the server calls the KB MCP directly, persists the tool evidence into the session, and renders a strict answer from the returned evidence. This keeps Telegram and Discord KB bots responsive enough for hosted demos while preserving the same source receipts and channel history.
The strict renderer now treats answer_question payloads as first-class grounding evidence. If the MCP returns suggested_answer and evidence[].content, Tandem can render a concise answer immediately. If TANDEM_STRICT_KB_GROUNDED_SYNTHESIS=1 is set on the engine process, Tandem may ask the model for an evidence-only JSON synthesis, then validates the result before returning it. Unsupported model output falls back to deterministic KB rendering; undefined policy, private-contact, and external-action cases remain deterministic and fail-closed.
The direct path also fixes a registry-name bug in full-document fetches. Model-facing MCP tool namespaces normalize names with underscores, for example mcp.aca_kb_mcp_local.answer_question, while Settings can store the real server name with hyphens, for example aca-kb-mcp-local. Strict grounding previously tried to call get_document on the normalized namespace and failed. It now resolves both underscore and hyphen variants so renaming an MCP in Settings does not silently break grounding.
Finally, strict KB rendering no longer lets malformed suggested_answer values spill raw document bodies into channel replies. Tandem preserves line boundaries while parsing evidence, strips nested Suggested answer: prefixes, and cuts off leaked Source:, markdown headings, and frontmatter before rendering. A query like “What should staff do if the stream ingest fails?” should now produce a compact answer and safe source label instead of dumping the top of the runbook.
Memory imports are available through HTTP, SDKs, Files, and Memory
The engine now exposes POST /memory/import for importing server-side paths into Tandem memory. The first source kind is path; supported formats are directory and openclaw; supported tiers follow the memory system (project, session, and global-compatible tiers as supported by the importer). The route validates that path imports are non-empty, readable, and correctly scoped: project imports require project_id, and session imports require session_id.
The response returns import stats (discovered_files, files_processed, indexed_files, skipped_files, deleted_files, chunks_created, errors) and emits tenant lifecycle events for started, succeeded, and failed imports. TypeScript and Python clients now include helpers:
client.memory.importPath(...)client.memory.import_path(...)
The control panel now treats memory import as both a Files workflow and a Memory workflow. Files has an Import to Memory action so operators can browse the workspace/managed file tree and import the selected folder, or the containing folder for selected files. Memory keeps an Import Knowledge shortcut with the same path-based dialog for runtime knowledge management. Both paths support format/tier selection, project/session fields, optional sync-delete, clear error handling, and a result summary card with import stats.
Files is also promoted into the primary navigation before Memory, because it is the natural source-selection surface. Memory remains the runtime management surface for search, inspection, manual memory creation, deletion, and audit-oriented metadata.
The Memory page now defaults to a governed Knowledge view instead of showing every runtime record as one flat feed. Conversation-derived records such as user_message, assistant_final, and channel message memories are still available under Runtime/All filters, but they no longer make the default knowledge surface look like a channel transcript.
OpenAI Codex model discovery can refresh from the connected account backend
The openai-codex provider was using a baked model list in two different places: the runtime provider catalog in tandem-providers and the settings/provider HTTP catalog in tandem-server. That meant new Codex models could be missing from Settings even when the connected Codex account could use them.
The two static lists are now collapsed into one shared starter catalog, and that starter catalog includes gpt-5.5. More importantly, when a Codex auth token is available, the provider catalog now tries live discovery against the Codex account backend before falling back to the static list. Connected installs can therefore pick up backend-published Codex models without waiting for Tandem to ship another baked-list update, while disconnected installs still show the known starter models.
npm upgrades now replace stale engine binaries
The @frumu/tandem npm postinstall script no longer skips native binary installation just because bin/native/tandem-engine already exists. That old existence check caused package/binary mismatches during global npm upgrades: for example, upgrading the npm package to 0.4.39 could leave a previous 0.4.19 tandem-engine binary in place, so every start continued to report an available update.
The installer now runs the existing binary with --version, compares it to the package version, and downloads/replaces the release asset when the binary is missing, too small, unreadable, or version-mismatched. Matching binaries still skip the download path.
Full Changelog: v0.4.43...v0.4.44