omp packages

pi-output-translate1.0.0

Display-only live Chinese translation companion for the Pi coding agent: faithful EN->ZH translation of assistant text and thinking streamed to a shared browser window across multiple Pi sessions. Never touches the agent's execution, context, or terminal

hewmbj Published 7 days ago MIT ~331 downloads/mo

Untested on omp

This is a pi package. No one has reported whether it works on omp yet. If you try it, add your result below.

Did it work for you?

Result

One report per person. A new report replaces your old one.

Reports 0

No reports yet.

Readme

pi-output-translate

A display-only, real-time Chinese translation companion for the Pi coding agent: it faithfully translates assistant text and thinking into Simplified Chinese and streams everything to an independent browser reader page, shared across all running Pi sessions. It never modifies the agent's execution, context, or terminal output.

Features

  • Bypass isolation — Pi event handlers only do O(1) synchronous pushes; translation happens in a separate worker. Engine crashes, timeouts, or a closed reader page never affect the agent (asserted by dedicated zero-blocking tests).
  • Multi-session sharing — the first Pi process to bind port 7330 becomes the host (it runs all translations); later processes register as clients and forward their events. When the host exits, a client takes over automatically. When the last process exits, the service disappears — zero residual daemons.
  • Faithful, localized translation — no summarizing, no rewriting. Ships a built-in glossary of ~150 software-engineering terms (race condition → 竞态条件, idempotent → 幂等, gotcha → 坑, …), user-extendable; a per-session term lock keeps translations consistent within a conversation.
  • Code is never translated — code blocks, inline code, commands, paths, and URLs are stripped out and rendered verbatim. Optionally, code-comment translations can be appended under code blocks (codeComments: "below", off by default).
  • Browser reader page — multi-session sidebar with per-project folders (VSCode-style nesting with indent guides), unread badges, per-session topic labels (the first user prompt — Chinese included), translation- first view with per-segment original toggle, collapsible thinking, syntax highlighting, tool lines, manual retry for failed segments, history replay with user/assistant roles restored, and a web settings panel that hot-applies on save.
  • Self-healing sessions list — sessions that ended or were forgotten after a host restart are grayed out or diff-removed; ghost rows with live green dots can no longer accumulate.
  • History done right — journals are grouped by project with recovered cwd; every entry gets a readable topic (recovered from the journal or from Pi's own session store); empty journals are filtered out and never consume retention slots; live sessions are badged; truncation is always announced ("… N more") instead of silently hiding rows.
  • Performance friendly — one translation worker shared by all sessions; batched requests (300 ms window / 4 segments); LRU translation cache persisted to disk (reopen = no retranslation); when no viewer page is open, only assistant text is translated into the cache.
  • Zero npm runtime dependencies; binds 127.0.0.1 only + token + Host header validation.

Install

# from npm
pi install npm:pi-output-translate

# from git (pinned to a tag once released)
pi install git:github.com/ichewm/pi-output-translate

# try it once without installing
pi -e npm:pi-output-translate

# development
pi -e /path/to/pi-output-translate

Restart Pi or run /reload. Default configuration is written to ~/.pi/agent/output-translate.json.

Usage

/pot              # open the browser reader page (or print the URL)
/pot status       # role / port / engine / queue / session counts
/pot thinking off # disable thinking translation
/pot engine openai-compat
/pot model qwen3:8b
/pot glossary add "backpressure=背压"
/pot cache stats
/pot retry-failed
/pot stop
ctrl+alt+p        # global on/off hotkey

Open the ⚙ settings panel (bottom-right of the reader page) for: engine/model selection (with model-list fetching), content-source toggles, performance parameters, glossary editing, a "test translate" button, cache management, and per-session mute.

Translation engines

Engine Notes
ollama (default) Direct local Ollama /api/chat (think:false)
openai-compat Any OpenAI-compatible /chat/completions endpoint: llama.cpp, LM Studio, vLLM, or hosted services (e.g. Zhipu bigmodel)
pi-model Reuses a model already configured in Pi (ctx.modelRegistry, reasoning: low)

The openai-compat engine accepts three baseUrl forms and normalizes them: a bare host (https://api.example.com), a base with version path (…/api/paas/v4), and a full endpoint (…/chat/completions).

Example configuration:

{
  "translate": {
    "engine": "openai-compat",
    "baseUrl": "https://open.bigmodel.cn/api/paas/v4",
    "apiKey": "<your-key>",
    "model": "glm-4-flash",
    "targetLang": "zh-Hans"
  }
}

Tip: a free-tier flash model (e.g. glm-4-flash) comfortably keeps up with live agent output at concurrency 1; a local 8B model works but is ~30 s per batch.

Architecture

pi process A (host)                       pi process B (client)
 agent → TUI (untouched)                  agent → TUI (untouched)
   │ message_* events                       │ message_* events
   ▼ O(1) push                              ▼ O(1) push
 Collector → Hub ── RingBuffer ── SSE ──► Browser ◄── POST /api/ingest ← Uplink
              └→ TranslateQueue (batch/retry/repair) → ollama/openai-compat/pi-model
              └→ Cache (LRU + disk) / Journal (jsonl history)

Design red lines: never subscribes to mutating events (context*, tool_call, …), message_end handlers never return a value, never calls sendMessage / appendEntry / injects prompts; translation results never flow back into the agent.

Tests

npm test        # 316 unit/integration tests (vitest)
npm run typecheck
npm run e2e     # full chain: mock engine + real Hub/Server/Role + SSE assertions

Coverage highlights: segmenter (sentence boundaries / fences / cross-delta), content-protection round-trips and repair, language gate, batch protocol parsing, timeout/retry/backpressure, cache, journal (including retention and empty-file policy), SSE replay, token/Host hardening, host/client election and takeover, zero-blocking assertions (with the engine mocked as sleep(∞), handlers still return in milliseconds), plus the r12/r13 history-logic suite (topic extraction & recovery, cwd head/tail scanning, group disambiguation, ghost-session behavior).

See SPEC.md for the full design document.