diff --git a/dotfiles/zz-blankpad/.local/share/com.pais.handy/README.md b/dotfiles/zz-blankpad/.local/share/com.pais.handy/README.md index 724f062..9a2b8b0 100644 --- a/dotfiles/zz-blankpad/.local/share/com.pais.handy/README.md +++ b/dotfiles/zz-blankpad/.local/share/com.pais.handy/README.md @@ -1,5 +1,34 @@ # Handy Settings Template -This directory contains a template for Handy's settings store. The app rewrites the live store at `~/.local/share/com.pais.handy/settings_store.json`. +Handy (Tauri v2) keeps its store at `~/.local/share/com.pais.handy/settings_store.json`, +shaped `{"settings": {...}}`, and **rewrites the live file on every change** — so the +repo carries a merge patch (`settings_store.template.json`), not a full store. -Keys that might contain sensitive information (e.g., API tokens, base URLs) should stay out of the repo. +## Apply the fleet wiring + +Quit Handy first (it caches settings in memory and overwrites external edits): + +```bash +pkill -f /usr/bin/handy +jq --slurpfile p /dotfiles/zz-blankpad/.local/share/com.pais.handy/settings_store.template.json ' + .settings |= ( + $p[0].settings + | .post_process_models = ((.post_process_models // {}) + $p[0].settings.post_process_models) + | .post_process_providers = (.post_process_providers + | map(if .id == "custom" then .base_url = $p[0].custom_provider_base_url else . end)) + )' settings_store.json > store.tmp && mv store.tmp settings_store.json +setsid nohup handy --start-hidden >/dev/null 2>&1 < /dev/null & +``` + +Niri also spawns Handy at startup (`cfg/autostart.kdl`: +`spawn-at-startup "handy" "--start-hidden"`), hence `autostart_enabled: false` — +the compositor owns autostart. + +## Known breaker (2026-10-09) + +`frank-secondary` (`http://192.168.0.143:7771/v1`) is a thinking model: default +requests return `content: ""` with the answer locked in `reasoning_content`. +Handy reads `content`, so post-processed transcripts come back empty. The +per-request cure is `chat_template_kwargs: {"enable_thinking": false}` (verified), +which Handy cannot send. Endpoint-side fix required — see +`omp-docs/tools/handy.md` → Known issues. diff --git a/dotfiles/zz-blankpad/.local/share/com.pais.handy/settings_store.template.json b/dotfiles/zz-blankpad/.local/share/com.pais.handy/settings_store.template.json index 1c978a2..b555b86 100644 --- a/dotfiles/zz-blankpad/.local/share/com.pais.handy/settings_store.template.json +++ b/dotfiles/zz-blankpad/.local/share/com.pais.handy/settings_store.template.json @@ -1,22 +1,14 @@ { - "// template: Handy settings store, rewritten live by the app": true, - "// app rewrites live store: ~/.local/share/com.pais.handy/settings_store.json": true, - "// keys stay out of repo": true, - "autostart_enabled": false, - "post_process_enabled": true, - "provider": "custom", - "base_url": "http://192.168.0.143:7771/v1", - "model": "frank-secondary", - "prompt": "default_improve_transcriptions", - "push_to_talk": true, - "bindings": { - "transcribe": "ctrl+space", - "transcribe_with_post_process": "ctrl+shift+space", - "cancel": "escape" + "//": "Handy settings-store wiring patch (blankpad, 2026-10-09).", + "//shape": "The live store is {\"settings\": {...}}; the app rewrites it, so this file is a MERGE PATCH, not a drop-in store.", + "//apply": "see README.md", + "//knob": "frank-secondary is a thinking model: it answers via reasoning_content and leaves content empty unless chat_template_kwargs.enable_thinking=false. Handy cannot send that; the fix must live on the endpoint (see omp-docs/tools/handy.md Known issues).", + "settings": { + "post_process_enabled": true, + "autostart_enabled": false, + "post_process_provider_id": "custom", + "post_process_models": { "custom": "frank-secondary" }, + "post_process_selected_prompt_id": "default_improve_transcriptions" }, - "keyboard_implementation": "handy_keys", - "overlay_position": "bottom", - "overlay_style": "live", - "paste_method": "none", - "clipboard_handling": "copy_to_clipboard" + "custom_provider_base_url": "http://192.168.0.143:7771/v1" }