pierreandLetta Code 27327e94b0 letta: fix truncated replies — process final unterminated line at EOF
The stream reader only handled lines terminated by newline. The letta
CLI final JSON line arrives without trailing newline at EOF, so the last
assistant message (or result line) sat in the line buffer and was
silently dropped — replies ended mid-sentence. Also: read errors no
longer silently end collection (logged), and stream completeness is
tracked via the result line with a warning when absent.

👾 Generated with [Letta Code](https://letta.com)

Co-Authored-By: Letta Code <noreply@letta.com>
2026-09-21 06:02:59 +03:00

inferon

Voice interface daemon for Letta Code agents. Lives in your system tray; click to talk, click to send — your speech is transcribed, sent to an agent, and the reply is spoken back.

name: inference + infernal + inferon (a particle), with symbolic inference planned for later.

Pipeline

tray click → pw-record (16kHz mono WAV)
           → whisper.cpp server (spawned & owned by inferon, :50153)
           → letta CLI (agent conversation, multi-turn)
           → MeloTTS (melo_server.py subprocess, British English voice)
           → pw-play

All backends are subprocesses owned by inferon: they die when it dies (tray quit, SIGINT, SIGTERM — signal handlers included).

Requirements

  • Zig 0.16
  • Qt 6 (qt6-base) + GCC toolchain
  • PipeWire (pw-record, pw-play)
  • whisper.cpp built with whisper-server (defaults expect ~/Projects/whisper.cpp, large-v3-turbo q5_0)
  • letta CLI on PATH, logged in
  • Python 3.11 (via uv) for MeloTTS

Setup

./setup.sh          # clones MeloTTS, builds venv, downloads checkpoint
zig build
zig-out/bin/inferon

Paths (whisper binary/model, MeloTTS root, agent ID) are constants at the top of src/whisper.zig, src/melo.zig, scripts/melo_server.py, and src/main.zig.

Usage

  • Left-click: start / stop recording. After you stop, the pipeline runs: transcribe → agent → spoken reply → idle.
  • Right-click → End conversation / Quit: menu.
  • Tray dot color = state: grey idle · red recording · orange transcribing · blue thinking · green speaking · magenta backend error.

Temp audio lives in /tmp/inferon/ and is cleaned up as it's consumed (logs stay).

S
Description
A true voice assistant in my tray, backed by Letta Code, self-hosted
Readme
349 KiB
0 Stars 1 Watchers 0 Forks
Languages
Zig 90.2%
Python 7.2%
Shell 2.6%