No way to type: the compose surface the design specifies was never built #53
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#53
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?
There is no way to type to her. The receiver chrome has no text input at all — the only
<Input>elements in the entire client are onboarding's address field (onboarding.tsx:349) and the settings sheet (settings-sheet.tsx:435). Both mic keys are the only way in, and on desktop both are currently dead (#35,#51).Split out of
#15, which holds the full failure-screen taxonomy and stays out of v1. This is the part of#15that v1 needs, and it is separable because the wire beneath it is already proven.The wire already works — only the UI is missing
websocket_handler.py:72maps"text-input"to_handle_conversation_trigger.src/renderer/src/services/pairing.ts:75:So every layer under the input box is working. This issue is the box.
What the design specifies
The compose surface —
docs/design/denpa-receiver/Denpa Receiver.dc.html:1016(palCompose) and:1185(deskCompose), with the field at:1018:Send on ⏎, newline on ⇧⏎, drawn for both the pal and the desktop window.
The mic-denied fallback —
README.md:189, the 集音 onboarding step offersマイクを許可and文字だけで話す.dc.html:797words it: 「声を聞かせて。マイクを使えないなら、文字だけでも大丈夫。」The rule that makes it v1 —
README.md:358:Walking onboarding on the desktop app on 2026-07-30 produced exactly the dead end that sentence forbids: onboarding's 集音 step offered no
文字だけで話す, and in the finished chrome bothhands-free(key-row.tsx:62) andptt(:86) raise a VAD permission dialog with nothing else to try.Scope
In:
palCompose/deskCompose, sending{ type: 'text-input', text }.⏎sends,⇧⏎newlines.文字だけで話すon the 集音 onboarding step, so a device that cannot hold the mic still finishes onboarding.文字入力 · TTS · 自発送信 は有効where the design shows it, so what still works is stated rather than implied.Out — stays in
#15:耳を塞がれてる, the flatlined無音 — 権限なしmeter,設定を開く).Acceptance
⏎sends and⇧⏎inserts a newline.Related
#15— the failure screens this was split from; 6d stays there#35— Rust audio; this issue is what makes the product usable before it lands#51— the desktop PTT hotkey, the other dead mic route#40— enrolment; onboarding's 集音 step is touched by bothLanded as
c1328ca, mergedc82517conmain.What changed
The chrome has a 文 key and a compose panel.
chrome-spec.tsgainsCOMPOSE/COMPOSE_KEY_WIDTH;key-row.tsx:71draws the key at the leading edge, so it exists in the dock on 1a and in the wide band on 1c without a second component. The panel it opens is the one the pal already had —components/pal/pal-composer-panel.tsx, now taking awidthso the chrome's bands can stretch it.dock.tsx:65andtransmission-band.tsx:150render it above their key row.micHelddoes not reach the 文 key. An ask holds the two mic keys (key-row.tsx); 文 is the one way in that never touches the microphone, so it stays live.The send is the existing one.
use-receiver-chrome.ts:168pullsuseTextInputand mirrors each keystroke into it, then callshandleSend()— the same path the pal, the pet-mode subtitle and the footer use. No secondtext-inputframe, so her reply to a typed message is not drawn as 自発.⏎ / ⇧⏎ come from
pal-composer.ts'scomposerKeyAction, unchanged and already tested — including leaving ⏎ to the IME while a candidate window is open.Onboarding's 集音 step. It already carried
文字だけで話すas the skip key (onboarding-spec.tsMIC_SKIP), and that was already wired to advance. Added: 6d's capability line文字入力 · TTS · 自発送信 は有効under the skip cost, andMIC_BODYis now the design's own wording fromdc.html:797— 「声を聞かせて。マイクを使えないなら、文字だけでも大丈夫。」 — rather than the flatter声で話せるようにする?.What I did not do
#15, as scoped. There is still no persisted "the OS refused the mic" state anywhere in the client —vad-context.tsxtoasts and forgets — so the capability line lives on the onboarding step where a refusal is actually expressible, not on a fault screen that does not exist yet. That is the honest placement, not the design's.Gate
npm test: 753 passed, 49 files (baseline 742 / 48). New:components/receiver/compose.test.tsx(9) and two inonboarding.test.tsx.cargo testinsrc-tauri: 18 passed.npx tsc --noEmit: no errors in any touched file.