Settings sheet — 電波 / 相手 / 局 / 本体 #14
Labels
No labels
needs-info
needs-triage
ready-for-agent
ready-for-human
v2
wayfinder:grilling
wayfinder:map
wayfinder:prototype
wayfinder:research
wayfinder:task
wayfinder:ticket
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
aiko/denpa#14
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What to build
Replaces the six upstream settings tabs with four, grouped by what you are adjusting (cards 3b, 3c, 5b, 5e, 7a). A sheet, not a page — she stays visible beside it and reacts to changes as you make them. On mobile it is a bottom sheet with a grab handle; parity is full, nothing is dropped for small screens.
Depth: common fields open, the rest behind a per-group 詳細 reveal that names what is inside it ("冗長フレーム, 圧縮率, 最大幅 ほか5件").
Design reference:
docs/design/denpa-receiver/README.md(card ids1a,4a… index intoDenpa Receiver.dc.html, openable in a browser).Acceptance criteria
Blocked by
Reality audit
Governing rule: build to reality, Hermes leads. Not doing something is acceptable if it does not break core functionality. Breaking the design is acceptable. Building UI that does nothing is not.
Audited against the actual wire surface:
hermes-agent 0.19.0, verified running):/health,/v1/models,/v1/runs,/v1/runs/{id},/v1/runs/{id}/events,/v1/runs/{id}/stop,/v1/runs/{id}/approvalmessage.delta,tool.started,tool.completed,run.completed,run.cancelled,run.failed/run.errored,reasoning.available,approval.request(carries a per-requestchoicesarray and sets run statuswaiting_for_approval; the go-between discards it today — see #19)full-text,audio,control,error,set-model-and-conf,config-switched,config-files,background-files,history-list,history-data,new-history-created,history-deleted,user-input-transcription,backend-synth-complete,force-new-message,tool_call_status,interrupt-signal,heartbeat-ack,group-updatetext-input,mic-audio-data,mic-audio-end,raw-audio-data,ai-speak-signal,interrupt-signal,fetch-history-list,fetch-and-set-history,create-new-history,delete-history,fetch-configs,switch-config,fetch-backgrounds,audio-play-start,request-init-config,heartbeatHeavily cut — most of this settings sheet has no data behind it
Audited row by row. Keep only what has a wire behind it.
電波 — keep VAD thresholds and hands-free (client-side, real; the しきい値 drag-meter is the centrepiece and survives intact). Cut per-setting ASR and TTS controls: the only mechanism is
switch-config, which swaps a whole config file. Offer config switching as what it is, not as granular engine settings.相手 — keep the model/character list (
config-files,switch-config,set-model-and-conf) and the scale slider (client-side, shared with the pal grip). Cut the voice bank and 試聴: no message lists TTS voices, so the chips would be empty and the preview button dead. Cut the persona readout: nothing carries Hermes'' persona to the client.局 — keep the address and token fields, and the 確認 button (a real connect probe). Cut the upstream Hermes readout (no data). Cut the 会話を覚えておく toggle: the session id is managed inside the go-between''s agent, not switchable from the client. Cut the 道具の実況 toggle: tool transparency is Hermes-side configuration with no client control message. The 自発送信 cron list is NOT cut — the original call that nothing enumerates Hermes' jobs was wrong.
GET /api/cron/jobsreturnsid,name,state(scheduled/paused),enabled,schedule_display,next_run_at,last_run_at,last_status,last_error, andPOST /api/cron/jobs/{id}/pause|resumeis the mute without touching the schedule — the read-and-mute list exactly as drawn. Caveat: these routes are served byhermes dashboard(default port 9119,X-Hermes-Session-Tokenauth, honoursHERMES_DASHBOARD_SESSION_TOKEN), a different surface from the/v1/runsAPI the go-between uses today, so the go-between must reach it and relay.本体 — keep the client version and the two reset levels (both client-side). Cut the 中継局 and 上流 version rows: no message reports either. The three-version story is the right idea and the wrong time.
What survives is a smaller, honest sheet: signal tuning, who you are looking at, where to connect, and reset. Do not leave placeholders, greyed-out rows, or "coming soon" affordances for the cut items — absent, not disabled.
The four-tab structure stays; two tabs are just thinner than drawn. The reset footer copy (
彼女を消す方法はここにない) stays and is still non-negotiable.Correction — 声 comes back, hardcoded
I cut the voice bank alongside the persona readout. Wrong grouping: TTS runs in the go-between, not Hermes, so this is our code to change, not upstream. Restoring it.
What is actually true today:
conf.yamlrunstts_model: fallback— primaryvllmn_tts(http://127.0.0.1:8091/v1/audio/speech, modelQwen/Qwen3-TTS-12Hz-1.7B-Base,voice_id: mai), falling back toedge_tts(en-US-AvaMultilingualNeural) after 10s.list_voicesonTTSInterface; every backend takes onevoicestring at construction. No websocket message carries voices.maiis the only configured voice id in the stack. The vllmn server was not running when checked, so nothing could be enumerated live. The alloy/shimmer/さくら/つむぎ names in the design are marked illustrative in the handoff and must not be baked in as real ids.Build it as a hardcoded client-side constant — one array of voice ids, extended by editing that array. No enumeration, no discovery, no capability negotiation.
Two open items before the row is more than a readout:
maiis known. Until the list is supplied, ship the row as a readout showing the active voice and the fallback engine — not chips, not a picker. A one-item picker is decoration.voice_idis currently read fromconf.yamlat engine construction. Small, and in our repo. Until it exists, the row does not offer selection.試聴 stays cut for now. Previewing an unselected voice means synthesising with it, which needs the same apply path plus per-request voice override. It comes back with selection, not before.
Everything else in the reality audit above stands.
Settled — 声 is a readout, no picker
Skipping voice selection for now. Final scope for this row:
The hardcoded-constant approach is deferred with it: when selection is wanted, it arrives as the id list plus a set-voice message, and this row grows into a picker then.
局 gains back the cron list — the "nothing enumerates Hermes' jobs" call was wrong
This issue's reality audit cut the 自発送信 cron list on the grounds that nothing enumerates Hermes' jobs. That is false, and the design doc is corrected.
hermes dashboard(default port 9119) serves:GET /api/cron/jobs—id,name,state(scheduled/paused),enabled,schedule_display,next_run_at,last_run_at,last_status,last_error,deliverGET /api/cron/jobs/{id}— the same for one jobPOST /api/cron/jobs/{id}/pauseand/resume— this is the mute, and it does not touch the scheduleWhich is exactly the read-and-mute list drawn in 3c:
07:00 morning.brief · 毎日, muteable, not editable. The acceptance criterion "Cron job list can be muted but not edited" is satisfiable as written.Two caveats that make this go-between work rather than client work:
/v1/runsAPI the go-between uses today. The go-between has to reach it and relay; the client still talks only to the go-between.hermes_cli/web_server.py:298). It honoursHERMES_DASHBOARD_SESSION_TOKEN, so launch the dashboard with a shared value and have the go-between sendX-Hermes-Session-Token. Verified: without it401, with it200.The other 3c cuts stand — upstream Hermes readout, 会話を覚えておく, 道具の実況.
Closing in favour of #29, rewritten against the ADRs.
This issue's premise changed with ADR-0001: Denpa is a Hermes gateway Platform adapter and the
api_serverHTTP surface is abandoned entirely. Patching the body would have left a trail of corrections on top of a stale audit block - the same pattern that got 承認 wrongly cut once already.Decisions now live in
docs/adr/in the go-between repo (branchdocs/hermes-platform-adrs). The replacement issue references them rather than restating them.