Move database ownership, blocking IO and TQL binding into tt-adapter-triviumdb
and upgrade the native engine to 0.8.8. Preserve the plugin API capabilities
with awaited open, numeric IDs and explicit shared-namespace lifecycle.
Coordinate archive IO with database maintenance and restore each namespace
as a complete file group. Keep behavior tests for persistence, parameter
binding, transactions and recovery instead of per-method forwarding tests.
Validated with pnpm run check and tauri-pilot against the macOS app using
the real data root; temporary test namespaces were removed afterward.
Custom and OpenCode OpenAI-compatible sources now apply the same
DeepSeek V4 semantics as the native DeepSeek channel when the model id
resolves to the V4 family (deepseek-v4*/deepseek-flash*, gateway
prefixes tolerated): explicit thinking control driven by the frontend
show-thoughts intent, DeepSeek reasoning_effort normalization, sampling
parameter cleanup while thinking, reasoning_content backfill in tool
context, and empty tool `required` stripping. Non-DeepSeek models and
other sources stay untouched, and OpenRouter keeps its own reasoning
dialect.
The frontend mirrors this by replaying tool_reasoning_content (instead
of plaintext reasoning) for those compat-source V4 models.
Return 501 for unsupported Edge server plugin and SpeechT5 routes instead of falling through to frontend assets.
Reject explicit upstream HTML/JSON audio responses with 502, including MiniMax audio downloads. Reuse existing HTTP test support for focused behavior coverage.
Validation: pnpm run check.
Preserve supplied text signatures without model-name gates. Match tool result IDs to replayed calls, keeping native history unchanged.
Refs #207
Validation: pnpm run check
Discover one source at a time and retain shared archives until the batch finishes. Reuse draft invalidation, capture the target scope, and release sources after active IO completes.
Keep behavior coverage at the repository, Host API, and controller boundaries while removing redundant forwarding and rendering tests.
Sync selected Agent files as ordinary data and leave resume validation to local checkpoints. Remove obsolete fixtures and retain scoped Mirror coverage.
Validation: pnpm run check.
Reuse the existing flush to prevent background index writes from racing with temporary directory removal.
Validation: 20 consecutive test runs and pnpm run check passed.
Accept null and empty arguments as an empty object, and validate argument shape once before dispatch. Malformed calls consume their budget and return recoverable tool errors.
Normalize provider replay while preserving rejected input in audit storage. Include runtime and protocol regression coverage and the tool argument contract.
Validation: pnpm run check.
Add a disabled-by-default setting with reload semantics and localized help. Document the cold representation, ownership, and save compatibility contracts.
Retain opened JSONL sources for bounded projection and precise record reads. Restore unloaded slots before atomic publication and distinguish accepted bytes from published bytes.
Give Android its measured 256 KiB frame budget to shorten synchronous string IPC work. Keep iOS at 1 MiB and desktop at 4 MiB, with session negotiation and append validation sharing the existing budget function.
Stat each opened file once and request its remaining bytes in chunks up to 4 MiB, avoiding padded tail responses and an extra EOF read. Reject truncated or malformed responses and retain both read and cleanup failures.
Decode the trailer with DataView, declare ES2022 library types in the shared type-check configuration, and include the fs permission, cancellation coverage, navigation fixture, and contract documentation.
`saveMetadata()` used to delegate to a full chat save, so every metadata
write re-serialized and re-transmitted the whole history. It now
persists only the header's `chat_metadata` through a new
`commit_chat_metadata` command. storage-core rewrites the header inside
the existing path mutation lock and copies the body byte for byte in one
blocking task; JS and IPC work is proportional to the header.
The header writer is shared with `metadata.setExtension()`, which now
also invalidates the character memory cache. Metadata saves stay in the
chat save queue, do not cancel a pending full save, and recover an
integrity conflict with a forced full save inside the same queue task.
New group chats publish their initial header before greeting hooks run,
so metadata written by those hooks is kept.
This narrows the SillyTavern 1.18.0 semantics: message edits need an
explicit full save. The change is documented in ChatPayload.md §3.1 and
the frontend contracts.
Current-chat writes had the same failure handling copied into each
entry point. `runChatSave()` now holds it once: an integrity conflict
asks the user before `recover` overwrites the file, every other failure
is reported and rethrown. `persistedChatMetadata()` is the one source of
the header metadata written to disk, without the transient in-context
marker.
The transport resolves character and group targets through two helpers
so load and save share the same normalization; payload shape checks stay
with the serializer. storage-core drops cached chat reads after a
publish through one helper used by the commit finish.
Only settings.json is an untyped JSON object whose parse failure means the
bytes are damaged. tauritavern-settings.json is typed, so a parse failure
may be a schema problem and keeps failing fast.
- Recover in one match arm: rename the damaged file to
settings.json.corrupt-<unix_ms>, rebuild from the bundled
default/content/settings.json, and report through the user-visible error
channel once the rebuild succeeded. A failed rename propagates instead of
overwriting the only copy of the damaged bytes.
- Inject the bundled defaults from the composition root; a missing
settings.json now converges on the same defaults instead of `{}`.
- Move the startup-only blocking loader out of the repository as
load_tauritavern_settings_blocking.
With required-literal gating the WebView's own V8 finishes a 474-message
batch in 12 ms on Android, while regress needs 96 ms plus a 17 MB DTO, an
uncancellable blocking thread and a second implementation of the replacement
semantics. Remove the service, DTO and command, the setting and its panel
toggle, the session circuit breaker and the astral-plane guard; the worker
and the synchronous path now share one analyser and one executor.
Leftover `native_regex_backend_enabled` keys in existing settings files are
ignored by serde.
The experimental deepseek-v4.1-flash-expires-on-0910 is now GA as
deepseek-flash. Carry the rename into the model list, the vision and
context gates, and existing settings, and recognise the unprefixed name
as thinking-capable.
Derive prompt model setting keys from ChatCompletionSource so opencode_model
is no longer missing, and overlay the connection's source-specific endpoint
fields onto subagent prompt settings.
Validate provider replay against original response text and request context, apply parameter omissions before generation decisions, and default custom Gemini aliases to thinkingLevel.