23 Commits

Author SHA1 Message Date
teknium1 23036e20a6 fix(ux): plain-language, actionable user-facing messages (core)
Squashed integration of the user-facing message audit for this surface set.
Full per-finding receipts: /tmp/ux-audit/lanes/*-receipt.md (campaign artifacts).
2026-09-15 04:12:13 -07:00
Poxel2 d7ff5675e0 fix: normalize empty fast status to normal without changing tier 2026-09-12 07:59:59 -07:00
Teknium 20816c13cd feat(voice): pick the voice chat engine from the composer
Switching to GPT-Live meant Settings → Voice → Voice Chat Mode, which is not
where you are when you want to talk. The composer now offers the choice where
the voice button is:

- folded layout (HUD / narrow): a "Voice chat engine" radio group in the
  existing voice menu
- unfolded layout: a small chevron beside the start-voice button opening the
  same rows; the button tooltip names the engine that will mount

Rows are hidden until the backend reports a mode (older gateway = no switch
that would 4002); GPT-Live is disabled with the backend's reason when no
OpenAI key resolves. Selecting writes `voice.voice_chat_mode` through
`config.set` on the LIVE gateway (local, SSH, cloud alike) and re-reads the
resolved status; it applies to the next conversation and never touches a
running one.

Backend: `voice.voice_chat_mode` joins the `config.set` word setters
(chained|gpt-live).

Live: headed desktop, chained → menu → GPT-Live → start = RTCPeerConnection
connected; menu → chained → start = no peer connection, chained controls.
2026-09-11 19:14:24 -07:00
teknium1 76c8866ba5 fix(tui-gateway): point the sessionless model rejection at Settings -> Models
Carry the one hunk PR #106424 adds over #106405: the 4001 message names the
door that deliberately changes the profile default, so a stale client's user
sees where to go instead of a bare "requires a live session". The flag
pre-parse from #106424 is not carried: with #106405's guard, sessionless
`--once --global` already surfaces the canonical conflict error through
_apply_model_switch (verified in-process).

Co-authored-by: mkrb84 <192544766+mkrb84@users.noreply.github.com>
2026-09-09 12:26:33 -07:00
KoNit-K 75b1b43ec1 fix(tui-gateway): reject sessionless config.set model with 4001
Sessionless model switches (including legacy --global) could persist
profile defaults before session.create; fail closed unless --once.

Co-authored-by: Cursor <cursoragent@cursor.com>
(cherry picked from commit 1c4a29757bbde1304404f26b45b6becb841c069f)
2026-09-09 12:26:33 -07:00
Teknium 14791b4d4e simplify(compat): approval — drop 43 facade re-exports + _command_detection_variants late-bind seam, repoint 30 callers + 46 test files
tools/approval.py no longer re-exports sibling names (approval_context/prompt/floors/detection/
human_wait/smart/gateway_wait); it imports only what it uses. Siblings reference sibling-defined
names directly (module-attribute reads on tools.approval_context so patching the defining module
still works); only facade-owned state (_lock, _gateway_queues, _permanent_approved, _denied,
_denial_breaker_addendum, _gateway_notify_cb) is still read back through tools.approval.
approval_detection calls its own _command_detection_variants instead of late-binding through the facade.
2026-09-03 13:49:57 -07:00
Teknium eeb7671e69 simplify(compat): hermes_cli small facades — drop 7 re-exports/aliases (+relay_runtime alias module), repoint 12 callers/tests 2026-09-03 13:05:57 -07:00
Teknium e83816a4d1 review-fix(comments): restore lost #NNNN rationale comments across non-test source (mechanical sweep, condensed, code unchanged)
For each issue anchor present in BASE 63279301bc non-test .py and absent on HEAD, the BASE comment/docstring block was re-attached at the HEAD location of the code it explained (matched by the distinctive code line / enclosing def). Sentences already covered by an existing HEAD comment were deduped; the issue number always survives. Insert-only: no code lines changed.
2026-09-03 09:44:26 -07:00
Teknium 58708befdb refactor(tui_gateway): W4 wave2 pass 21 — yolo/fast folds 2026-09-03 03:15:59 -07:00
Teknium bd0689b13e refactor(tui_gateway): W4 wave2 pass 15 — toggle setters table (density/battery/statusbar/mouse) 2026-09-03 03:03:19 -07:00
Teknium c398505e5a refactor(tui_gateway): W4 wave2 pass 14 — busy/approvals into word table 2026-09-03 03:02:44 -07:00
Teknium 6e69a036ad refactor(tui_gateway): W4 wave2 pass 13 — word-validated config.set setters table 2026-09-03 03:01:18 -07:00
Teknium 90e008098d refactor(tui_gateway): W4 wave2 pass 9 — _set_model deferred phase extracted 2026-09-03 02:52:21 -07:00
Teknium 8d1714018a refactor(tui_gateway): W4 wave2 pass 8 — split prompt/personality/skin setters, nest single-use voice helpers 2026-09-03 02:49:40 -07:00
Teknium 0548956da0 refactor(tui_gateway): W4 wave2 pass 4 — profile/config_set docstring+comment compaction, mirror helpers 2026-09-03 02:36:23 -07:00
Teknium b7747dce42 refactor(tui_gateway): W4 wave2 pass 3 — config.set toggle-setter table, voice.record inlined, wake.status/feed compaction 2026-09-03 02:31:38 -07:00
Teknium b263a6f977 refactor(tui_gateway): W4 wave2 pass 2 — wake owner-result helper, profile asset magic table, config.set/get compaction 2026-09-03 02:25:37 -07:00
Teknium f334f61523 refactor(tui_gateway): W4 wave2 pass 1 — config.get table, config.set guard decorator, voice/profile helper folds 2026-09-03 02:15:41 -07:00
Teknium bd770ab70b refactor(tui_gateway): compact voice/config/profiles docstrings, hug payloads, squeeze body blanks 2026-09-02 23:43:54 -07:00
Teknium f997235f1b refactor(tui_gateway): dedupe config/voice/profiles helpers, collapse ladders and hug payloads 2026-09-02 23:02:07 -07:00
Teknium 99433742dc refactor(tui): extract the prompt turn into prompt_turn.py; compact methods_*/session_*/agent_callbacks; split _start_agent_build into scope/wiring helpers
- server.py 7663 -> 5319: _run_prompt_submit and its goal/loop/voice/scope
  phases move to tui_gateway/prompt_turn.py (bound via method_ctx.bind_module);
  _start_agent_build split into _bind/_release_build_profile_scopes,
  _deferred_build_agent_kwargs, _wire_session_agent, _start_session_services;
  _load_enabled_toolsets split (_enabled_mcp_server_names, _resolve_explicit_toolsets).
- methods_slash: _LIVE_SLASH_OUTPUT dispatch table; methods_tools: _SLASH_BUILTINS,
  _guarded; tool_progress: _PROGRESS_HANDLERS; methods_config_set:
  _REASONING_DISPLAY_WORDS; methods_voice: _VOICE_TOGGLE_ACTIONS.
- Unified: _denied_source (methods_session) replaces _WORKER_SOURCES in
  methods_profiles; _compress_live_with_feedback / _compute_host_slash shared by
  the slash mirror and /compress; _end_voice_chat shared by stop-phrase paths;
  _watcher_mtime_ns; _reaper_session_is_detached_idle; _notif_* helpers.
- Dead: _profile_dir_or_err, _resume_info, _slash_builtin_table (refs.py: 0 hits).
- acp_adapter/server.py: docstring compaction only (AST-identical).
- Every file semantically reviewed hunk-by-hunk for wire/log/lock/order parity.
2026-09-02 14:09:13 -07:00
Teknium f2efa400e2 refactor(tui): rename methods_config_set._display_cfg -> _display_section; bind_module refuses cross-module function name collisions 2026-09-02 14:09:07 -07:00
Teknium d6871a1a3b refactor(tui): extract config.set into methods_config_set.py with a key dispatch table
- 790-line if-chain in server.py -> 20 _set_* handlers + _CONFIG_SETTERS dict
- dedupe: _write_display_sections (4 copies of the cfg/display/sections dance),
  _toggle_display_bool (density/battery), _emit_session_info/_emit_all_session_info,
  _display_cfg
- bind_module rebinds function values inside dispatch dicts
- wire parity: 61-call config.set sweep + resulting config.yaml byte-identical
2026-09-02 14:09:03 -07:00