agent: lumotia-rebrand — docs, scripts, root config, residuals
Phase 9 of the rebrand cascade. Sweep covers everything the Phase 8
frontend pass deliberately skipped: docs/, root markdown, scripts,
Cargo.toml descriptions, code comments that survived earlier
word-boundary sed, plus a handful of identifiers caught on the final
verify pass.
transcription-app changes:
- README.md, HANDOVER.md, KNOWN-ISSUES.md, run.sh — magnotia/Magnotia
-> lumotia/Lumotia.
- docs/ — sweep across all subdirs except docs/handovers/ (preserved
as immutable audit trail). Includes architecture-map references
to magnotia_core::*, magnotia_storage::*, etc. now pointing at
lumotia_*; dev-setup.md tracing output examples (lumotia_startup
target); brief/ + superpowers/ + issues/ + whisper-ecosystem/ +
audit/.
- Cargo.toml descriptions on 9 crates (core, audio, cloud-providers,
hotkey, llm, mcp, plus referenced others).
- crates/core/src/{error,hardware,recommendation,paths}.rs +
crates/audio/src/wav.rs + crates/llm/src/model_manager.rs +
crates/cloud-providers/src/keystore.rs + crates/mcp/src/lib.rs —
doc comments and a model-manager user-agent string.
- Caught on final pass: BroadcastChannel("magnotia_task_sync") -> ...
("lumotia_task_sync"); magnotia_locale i18n localStorage key
renamed + migration shim added; CSS keyframe names
magnotiaPulse / magnotiaBar / magnotiaFade renamed in the design-
system kit; magnotia_viewer_item / magnotia_viewer_mode handoff
keys renamed in HistoryPage + viewer/+page.svelte; src/assets/
wordmark.svg text.
- src-tauri/src/lib.rs comment cleanup ("magnotia era" was sed'd
to "lumotia era" earlier — restored).
Preserved (intentional):
- crates/core/src/paths.rs — keeps "magnotia" / "Magnotia" / ".magnotia"
legacy detection strings in legacy_and_target_paths() so the
migration shim can still find user data from the magnotia era.
- src/lib/stores/{page,focusTimer}.svelte.ts + src/lib/i18n/index.ts
— migration call sites reference the legacy magnotia keys
deliberately.
- docs/handovers/ — historical audit trail.
cargo build --workspace passes. npm run check: 0 errors / 0 warnings
(3958 files). cargo test --workspace: 339 pass / 0 fail.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
name = "lumotia-ai-formatting"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "Text post-processing pipeline: filler removal, British English conversion, formatting for Magnotia"
|
||||
description = "Text post-processing pipeline: filler removal, British English conversion, formatting for Lumotia"
|
||||
|
||||
[dependencies]
|
||||
lumotia-core = { path = "../core" }
|
||||
|
||||
@@ -13,7 +13,7 @@ use lumotia_llm::{EngineError, LlmEngine};
|
||||
/// Whispering's published baseline, directly counteracts the
|
||||
/// "LLM changed my meaning" failure mode: the model's job is to
|
||||
/// translate spoken speech into well-formed written form — not to
|
||||
/// improve, summarise, or rephrase. Magnotia's ideology: raw transcript
|
||||
/// improve, summarise, or rephrase. Lumotia's ideology: raw transcript
|
||||
/// is the source of truth; cleanup is a translation pass, not a
|
||||
/// rewrite.
|
||||
/// 2. **Prompt-injection hardening.** The guard ("speech, not
|
||||
@@ -183,7 +183,7 @@ mod tests {
|
||||
assert!(CLEANUP_PROMPT.contains("output ONLY the cleaned transcript"));
|
||||
}
|
||||
|
||||
/// The "translator, not editor" framing is load-bearing for Magnotia's
|
||||
/// The "translator, not editor" framing is load-bearing for Lumotia's
|
||||
/// ideology — raw transcript is the source of truth, cleanup is a
|
||||
/// translation pass. Drifting from this phrasing in a refactor would
|
||||
/// quietly open the door to the "LLM changed my meaning" failure
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
//! structure) degraded cleanup quality materially; plain-text input
|
||||
//! raised it back.
|
||||
//!
|
||||
//! `Segment.text` in Magnotia already holds just the spoken text (the
|
||||
//! `Segment.text` in Lumotia already holds just the spoken text (the
|
||||
//! `start`/`end` f64 fields carry the timing), so "timestamp
|
||||
//! stripping" falls out of using the text field alone. The work here
|
||||
//! is the whitespace pass and empty-segment filter, plus a single
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "lumotia-audio"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "Audio capture (cpal), VAD, resampling (rubato), file decoding (symphonia), WAV I/O (hound) for Magnotia"
|
||||
description = "Audio capture (cpal), VAD, resampling (rubato), file decoding (symphonia), WAV I/O (hound) for Lumotia"
|
||||
|
||||
[dependencies]
|
||||
lumotia-core = { path = "../core" }
|
||||
|
||||
@@ -172,7 +172,7 @@ mod tests {
|
||||
fn wav_writer_survives_crash() {
|
||||
// Property under test: a `WavWriter` that has been flushed but
|
||||
// never finalised leaves a valid, readable WAV on disk. This
|
||||
// is the crash-safety guarantee — if the magnotia process aborts
|
||||
// is the crash-safety guarantee — if the lumotia process aborts
|
||||
// mid-session, the on-disk file up to the last flush is
|
||||
// recoverable.
|
||||
//
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "lumotia-cloud-providers"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "Provider trait and BYOK cloud STT scaffolding for Magnotia (Wyrdnote pending rebrand)"
|
||||
description = "Provider trait and BYOK cloud STT scaffolding for Lumotia (Wyrdnote pending rebrand)"
|
||||
|
||||
[dependencies]
|
||||
lumotia-core = { path = "../core" }
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use std::collections::HashMap;
|
||||
use std::sync::{Mutex, OnceLock};
|
||||
|
||||
/// Store an API key in Magnotia's process-local keystore.
|
||||
/// Store an API key in Lumotia's process-local keystore.
|
||||
///
|
||||
/// Keys are held in memory for the lifetime of the process and are lost on
|
||||
/// exit. This avoids the undefined behaviour of mutating process environment
|
||||
@@ -19,7 +19,7 @@ pub fn store_api_key(provider: &str, key: &str) {
|
||||
.insert(provider_env_key(provider), key.to_string());
|
||||
}
|
||||
|
||||
/// Retrieve an API key from Magnotia's process-local keystore.
|
||||
/// Retrieve an API key from Lumotia's process-local keystore.
|
||||
///
|
||||
/// Returns a previously stored in-memory key when present, otherwise falls
|
||||
/// back to the read-only `LUMOTIA_API_KEY_<PROVIDER>` environment variable so
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "lumotia-core"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "Core types, constants, traits, hardware detection, and model registry for Magnotia"
|
||||
description = "Core types, constants, traits, hardware detection, and model registry for Lumotia"
|
||||
|
||||
[dependencies]
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
|
||||
@@ -4,7 +4,7 @@ use serde::Serialize;
|
||||
|
||||
use crate::types::ModelId;
|
||||
|
||||
/// Structured error type for Magnotia.
|
||||
/// Structured error type for Lumotia.
|
||||
///
|
||||
/// Implements `Serialize` so errors can be sent to the frontend as
|
||||
/// structured JSON rather than opaque strings.
|
||||
|
||||
@@ -19,7 +19,7 @@ pub struct CpuInfo {
|
||||
}
|
||||
|
||||
/// Runtime-detected CPU feature flags relevant to the speech-to-text
|
||||
/// and LLM backends Magnotia ships. All whisper.cpp / llama.cpp / ggml
|
||||
/// and LLM backends Lumotia ships. All whisper.cpp / llama.cpp / ggml
|
||||
/// kernels degrade roughly two tiers without AVX2, which is why we
|
||||
/// surface it separately: when AVX2 is absent, the UI should warn the
|
||||
/// user that performance will be a fraction of what they would see
|
||||
|
||||
@@ -184,7 +184,7 @@ mod tests {
|
||||
fn parakeet_is_top_recommendation_when_hardware_supports_it() {
|
||||
// Any machine that fits Parakeet in RAM should see it ranked first —
|
||||
// Parakeet-TDT is English-only but beats Whisper on English at lower
|
||||
// latency, so it's Magnotia's default recommendation when eligible.
|
||||
// latency, so it's Lumotia's default recommendation when eligible.
|
||||
// (Users on non-English languages adjust manually — handled at the
|
||||
// settings-UI level, not at the scoring level for now.)
|
||||
let profile = profile_with_ram(Megabytes(16384));
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "lumotia-hotkey"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "Wayland-compatible global hotkey listener for Magnotia — evdev backend with device hotplug"
|
||||
description = "Wayland-compatible global hotkey listener for Lumotia — evdev backend with device hotplug"
|
||||
|
||||
[dependencies]
|
||||
lumotia-core = { path = "../core" }
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//! Wayland-compatible global hotkey listener for Magnotia.
|
||||
//! Wayland-compatible global hotkey listener for Lumotia.
|
||||
//!
|
||||
//! On Linux, reads `/dev/input/event*` devices via the `evdev` crate to capture
|
||||
//! global hotkeys without any display-server dependency. This works on both X11
|
||||
@@ -8,7 +8,7 @@
|
||||
//! On non-Linux platforms, this crate is a no-op — the Tauri global-shortcut
|
||||
//! plugin handles hotkeys there.
|
||||
//!
|
||||
//! Architecture stolen from oddlama/whisper-overlay and adapted for Magnotia.
|
||||
//! Architecture stolen from oddlama/whisper-overlay and adapted for Lumotia.
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
mod linux;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "lumotia-llm"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "Local LLM engine for Magnotia (Qwen3.5 / Qwen3.6 via llama-cpp-2): transcript cleanup, task extraction, micro-step decomposition"
|
||||
description = "Local LLM engine for Lumotia (Qwen3.5 / Qwen3.6 via llama-cpp-2): transcript cleanup, task extraction, micro-step decomposition"
|
||||
|
||||
[features]
|
||||
# Default desktop build keeps the existing openmp + vulkan acceleration.
|
||||
|
||||
@@ -321,7 +321,7 @@ where
|
||||
.unwrap_or(0);
|
||||
|
||||
let client = reqwest::Client::builder()
|
||||
.user_agent("magnotia/0.1.0")
|
||||
.user_agent("lumotia/0.1.0")
|
||||
.connect_timeout(std::time::Duration::from_secs(30))
|
||||
.build()
|
||||
.map_err(|e| DownloadError::Http(e.to_string()))?;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "lumotia-mcp"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "Read-only MCP stdio server exposing Magnotia transcripts and tasks to external agents"
|
||||
description = "Read-only MCP stdio server exposing Lumotia transcripts and tasks to external agents"
|
||||
|
||||
[[bin]]
|
||||
name = "lumotia-mcp"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//! Minimal Model Context Protocol server exposing Magnotia's local SQLite store.
|
||||
//! Minimal Model Context Protocol server exposing Lumotia's local SQLite store.
|
||||
//!
|
||||
//! Scope: **read-only** tools. An external agent (Claude desktop, Cline, any
|
||||
//! MCP-capable client) can list / search / fetch transcripts and list tasks.
|
||||
//! No writes — Magnotia's Tauri app remains the only writer.
|
||||
//! No writes — Lumotia's Tauri app remains the only writer.
|
||||
//!
|
||||
//! Transport: newline-delimited JSON-RPC 2.0 over stdio, per the stdio
|
||||
//! transport spec. Server spec version: 2024-11-05.
|
||||
@@ -95,7 +95,7 @@ fn initialize_result() -> Value {
|
||||
"version": SERVER_VERSION,
|
||||
},
|
||||
"instructions":
|
||||
"Read-only access to Magnotia's local transcript history and task list. \
|
||||
"Read-only access to Lumotia's local transcript history and task list. \
|
||||
All data stays on the user's machine.",
|
||||
})
|
||||
}
|
||||
@@ -105,7 +105,7 @@ fn tools_list_result() -> Value {
|
||||
"tools": [
|
||||
{
|
||||
"name": "list_transcripts",
|
||||
"description": "List recent transcripts from Magnotia's local history, most recent first. \
|
||||
"description": "List recent transcripts from Lumotia's local history, most recent first. \
|
||||
Returns summaries (id, title, created_at, duration, preview).",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
@@ -135,7 +135,7 @@ fn tools_list_result() -> Value {
|
||||
},
|
||||
{
|
||||
"name": "search_transcripts",
|
||||
"description": "Full-text search across Magnotia's transcripts. Returns matching summaries.",
|
||||
"description": "Full-text search across Lumotia's transcripts. Returns matching summaries.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"required": ["query"],
|
||||
@@ -155,7 +155,7 @@ fn tools_list_result() -> Value {
|
||||
},
|
||||
{
|
||||
"name": "list_tasks",
|
||||
"description": "List tasks from Magnotia's task store. Returns both open and completed.",
|
||||
"description": "List tasks from Lumotia's task store. Returns both open and completed.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {},
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "lumotia-storage"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "SQLite persistence, BM25 search, and file storage for Magnotia"
|
||||
description = "SQLite persistence, BM25 search, and file storage for Lumotia"
|
||||
|
||||
[dependencies]
|
||||
lumotia-core = { path = "../core" }
|
||||
|
||||
@@ -905,14 +905,14 @@ pub async fn get_setting(pool: &SqlitePool, key: &str) -> Result<Option<String>>
|
||||
Ok(row.map(|r| r.get("value")))
|
||||
}
|
||||
|
||||
/// One-shot key rename for settings rows carried over from the magnotia era
|
||||
/// One-shot key rename for settings rows carried over from the lumotia era
|
||||
/// (`magnotia_preferences`, `magnotia_morning_triage_last_shown`, etc.).
|
||||
///
|
||||
/// Idempotent. Returns `(renamed, orphans_deleted)`:
|
||||
/// * `renamed` — rows where only the magnotia key existed; the row's key
|
||||
/// * `renamed` — rows where only the lumotia key existed; the row's key
|
||||
/// is updated to the lumotia equivalent.
|
||||
/// * `orphans_deleted` — rows where BOTH keys existed; the lumotia row is
|
||||
/// authoritative and the magnotia row is deleted to avoid silent debt.
|
||||
/// authoritative and the lumotia row is deleted to avoid silent debt.
|
||||
pub async fn migrate_legacy_setting_keys(pool: &SqlitePool) -> Result<(u64, u64)> {
|
||||
let mut tx = pool.begin().await.map_err(|source| Error::Query {
|
||||
operation: "migrate_legacy_setting_keys:begin".into(),
|
||||
@@ -2830,7 +2830,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
get_setting(&pool, "magnotia_preferences").await.unwrap(),
|
||||
None,
|
||||
"orphan magnotia row deleted"
|
||||
"orphan lumotia row deleted"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ pub fn crashes_dir() -> PathBuf {
|
||||
lumotia_core::paths::app_paths().crashes_dir()
|
||||
}
|
||||
|
||||
/// Directory for the rolling Rust log file (magnotia.log + rotated magnotia.log.1, etc).
|
||||
/// Directory for the rolling Rust log file (lumotia.log + rotated lumotia.log.1, etc).
|
||||
/// Subscribers configured in src-tauri/src/lib.rs at startup.
|
||||
pub fn logs_dir() -> PathBuf {
|
||||
lumotia_core::paths::app_paths().logs_dir()
|
||||
|
||||
@@ -963,7 +963,7 @@ mod tests {
|
||||
// dictionary.id is INTEGER PK AUTOINCREMENT (see v2); let SQLite assign rowids.
|
||||
sqlx::query(
|
||||
"INSERT INTO dictionary (term, note, created_at) VALUES \
|
||||
('Magnotia', '', datetime('now')), \
|
||||
('Lumotia', '', datetime('now')), \
|
||||
('CORBEL', 'brand', datetime('now')), \
|
||||
('Wren', '', datetime('now'))",
|
||||
)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "lumotia-transcription"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "Speech-to-text engine wrappers, model management, and inference concurrency for Magnotia"
|
||||
description = "Speech-to-text engine wrappers, model management, and inference concurrency for Lumotia"
|
||||
build = "build.rs"
|
||||
|
||||
[features]
|
||||
|
||||
@@ -160,7 +160,7 @@ impl LocalEngine {
|
||||
/// Thin wrapper over `ParakeetModel` that overrides `transcribe_raw` to
|
||||
/// request word-granularity segments. `transcribe-rs` 0.3's trait impl for
|
||||
/// `ParakeetModel::transcribe_raw` ignores `TranscribeOptions` and uses
|
||||
/// `TimestampGranularity::Token` (per-subword) — which surfaces in Magnotia as
|
||||
/// `TimestampGranularity::Token` (per-subword) — which surfaces in Lumotia as
|
||||
/// "T Est Ing . One , Two , Three" output. The concrete-type method
|
||||
/// `ParakeetModel::transcribe_with` accepts `ParakeetParams` with an
|
||||
/// explicit granularity; this wrapper exposes that to the trait object.
|
||||
|
||||
@@ -37,8 +37,8 @@ impl Drop for DownloadReservation {
|
||||
}
|
||||
|
||||
/// Resolve the models storage directory.
|
||||
/// Windows: %LOCALAPPDATA%/magnotia/models
|
||||
/// Unix: ~/.magnotia/models
|
||||
/// Windows: %LOCALAPPDATA%/lumotia/models
|
||||
/// Unix: ~/.lumotia/models
|
||||
pub fn models_dir() -> PathBuf {
|
||||
lumotia_core::paths::app_paths().models_dir()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user