JWE24-code/moqi-jev-loop

moqi-jev-loop

The /JevLoop control panel for moqi, on top of dsh-jev-loop.

未分類deepseek-harnessdshdsh-bundle

moqi-jev-loop

The /JevLoop control panel for moqi, on top of dsh-jev-loop.

It is a thin adapter: moqi brings the tuiHost seam, dsh-jev-loop brings the jevLoop service, and this package turns that service into rows and actions. It judges nothing itself and never applies where either service is absent.

Compatibility: works with moqi 0.4.x and 0.5.x (npm run typecheck:moqi checks the panel types against the installed moqi-tui).

Published to npm as moqi-jev-loop. This repository carries the dsh-plugin topic — the whole of the dshfind listing mechanism: the marketplace indexes public repositories by that topic and syncs daily, so there is no listing step per release.

Install

dsh plugin --profile <profile> add dsh-jev-loop
dsh plugin --profile <profile> add moqi-jev-loop

Both bundles are needed — the core mounts the gates, this one mounts the panel. With moqi running, /JevLoop then joins the command palette.

The panel

The adapter registers a tuiHost panel, so /JevLoop joins moqi's command palette and nothing about it lives in moqi's core: moqi only knows how to draw rows and raise a masked prompt. The panel lists the API key and the four gates with their live state; enter toggles a gate, the change applies immediately, and it persists to $DSH_HOME/jev-loop.json.

The API key row opens a masked prompt: the draft is never rendered and never touches the composer, transcript, or shell history. The value is written to the Harness credential store (ctx.credentials, ref TYPESAFE_API_KEY) and the core picks it up on the next judgment — no restart. The row shows whether a key is live and where it came from (config, credential:file, env:TYPESAFE_APIKEY), never the value. A Clear API key row appears once one is set.

Key resolution order: explicit apiKey config, then the credential store, then TYPESAFE_API_KEY / TYPESAFE_APIKEY in the environment. The gates are registered even with no key, so setting one activates them immediately.

Test it

The throwaway profile composes dsh-base, the fixed moqi TUI checkout, the core, and this adapter:

npm install            # typescript + @types/node + dsh-jev-loop
npm run link-harness   # symlink the installed harness's @deepseek-ai packages
npm run build
npm run install-profile -- jev-dev
TYPESAFE_APIKEY=… dsh --profile jev-dev

install-profile links the moqi TUI from a sibling ../moqi checkout by default (MOQI_ROOT overrides it) and the core from a sibling ../dsh-jev-loop checkout when one is built (JEV_LOOP_CORE_ROOT overrides it), falling back to the published dsh-jev-loop on npm when it is not.

Inside the app /JevLoop toggles the gates, and ~/.dsh/jev-loop.jsonl records every judgment.

Layout

src/panel.ts   rows and actions over the core's service
src/index.ts   the tuiHost seam
tests/         panel.ts driven with a fake service; moqi type compatibility
scripts/       harness linking and the throwaway profile installer

Docs

The module boundary and the generated whiteboard are documented in docs/ARCHITECTURE.md.