Skip to content

Cursorless commands sometimes cause a helper process to go wild and lock up vscode #3138

@chromalchemy

Description

@chromalchemy

Here is the talon log trace:

tail -f /Users/ryan/.talon/talon.log | sed -E 's/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3} //'
2026-01-20 19:29:15.046 WARNING DFA rule missing: <user.cursorless_insertion_snippet>
2026-01-20 19:29:15.048 WARNING skipped unknown tokens: ['-', '.', '0', '1']
2026-01-20 19:29:17.121 WARNING [watchdog] "EngineProxy._redispatch" @2.0s
   31:                                             lib/python3.13/threading.py:1014* # cron thread
   30:                                             lib/python3.13/threading.py:1043* 
   29:                                             lib/python3.13/threading.py:994 * 
   28:                                                           talon/cron.py:159 | 
   27:                                                            talon/vad.py:23  | 
   26:                                                            talon/vad.py:129 | 
   25:                                        talon/scripting/speech_system.py:398 | 
   24:                                                    talon/engines/w2l.py:783 | 
   23:                                             talon/scripting/dispatch.py:134 | # 'phrase' main:EngineProxy._redispatch()
   22:                                        talon/scripting/speech_system.py:71  | 
   21:                                             talon/scripting/dispatch.py:134 | # 'phrase' main:SpeechSystem.engine_event()
   20:                                        talon/scripting/speech_system.py:548 | 
   19:                                             talon/scripting/executor.py:112 | 
   18:                                         talon/scripting/talon_script.py:836 | 
   17:                                         talon/scripting/talon_script.py:734 | 
   16:                                         talon/scripting/talon_script.py:326 | 
   15:                                              talon/scripting/actions.py:88  | # user.private_cursorless_action_or_ide_command()
   14:                            user/cursorless-talon/src/actions/actions.py:149 | actions.user.cursorless_command(value,..
   13:                                              talon/scripting/actions.py:88  | # user.cursorless_command()
   12:                            user/cursorless-talon/src/actions/actions.py:110 | actions.user.private_cursorless_comman..
   11:                                              talon/scripting/actions.py:88  | # user.private_cursorless_command_and_wait()
   10:                                    user/cursorless-talon/src/command.py:36  | response = actions.user.private_cursor..
    9:                                              talon/scripting/actions.py:88  | # user.private_cursorless_run_rpc_command_get()
    8:                  user/cursorless-talon/src/cursorless_command_server.py:39  | return actions.user.run_rpc_command_ge..
    7:                                              talon/scripting/actions.py:88  | # user.run_rpc_command_get()
    6:                    user/community/core/command_client/command_client.py:136 | return run_command(
    5:                    user/community/core/command_client/command_client.py:55  | return actions.user.rpc_client_run_com..
    4:                                              talon/scripting/actions.py:88  | # user.rpc_client_run_command()
    3:             user/community/core/command_client/rpc_client/rpc_client.py:88  | decoded_contents = read_json_with_time..
    2: user/community/core/command_client/rpc_client/read_json_with_timeout.py:41  | actions.sleep(sleep_time)
    1:                                              talon/scripting/actions.py:168 | 
2026-01-20 19:29:17.125 WARNING [watchdog] "SpeechSystem.engine_event" @2.0s
   31:                                             lib/python3.13/threading.py:1014* # cron thread
   30:                                             lib/python3.13/threading.py:1043* 
   29:                                             lib/python3.13/threading.py:994 * 
   28:                                                           talon/cron.py:159 | 
   27:                                                            talon/vad.py:23  | 
   26:                                                            talon/vad.py:129 | 
   25:                                        talon/scripting/speech_system.py:398 | 
   24:                                                    talon/engines/w2l.py:783 | 
   23:                                             talon/scripting/dispatch.py:134 | # 'phrase' main:EngineProxy._redispatch()
   22:                                        talon/scripting/speech_system.py:71  | 
   21:                                             talon/scripting/dispatch.py:134 | # 'phrase' main:SpeechSystem.engine_event()
   20:                                        talon/scripting/speech_system.py:548 | 
   19:                                             talon/scripting/executor.py:112 | 
   18:                                         talon/scripting/talon_script.py:836 | 
   17:                                         talon/scripting/talon_script.py:734 | 
   16:                                         talon/scripting/talon_script.py:326 | 
   15:                                              talon/scripting/actions.py:88  | # user.private_cursorless_action_or_ide_command()
   14:                            user/cursorless-talon/src/actions/actions.py:149 | actions.user.cursorless_command(value,..
   13:                                              talon/scripting/actions.py:88  | # user.cursorless_command()
   12:                            user/cursorless-talon/src/actions/actions.py:110 | actions.user.private_cursorless_comman..
   11:                                              talon/scripting/actions.py:88  | # user.private_cursorless_command_and_wait()
   10:                                    user/cursorless-talon/src/command.py:36  | response = actions.user.private_cursor..
    9:                                              talon/scripting/actions.py:88  | # user.private_cursorless_run_rpc_command_get()
    8:                  user/cursorless-talon/src/cursorless_command_server.py:39  | return actions.user.run_rpc_command_ge..
    7:                                              talon/scripting/actions.py:88  | # user.run_rpc_command_get()
    6:                    user/community/core/command_client/command_client.py:136 | return run_command(
    5:                    user/community/core/command_client/command_client.py:55  | return actions.user.rpc_client_run_com..
    4:                                              talon/scripting/actions.py:88  | # user.rpc_client_run_command()
    3:             user/community/core/command_client/rpc_client/rpc_client.py:88  | decoded_contents = read_json_with_time..
    2: user/community/core/command_client/rpc_client/read_json_with_timeout.py:41  | actions.sleep(sleep_time)
    1:                                              talon/scripting/actions.py:168 | 
2026-01-20 19:29:19.120 WARNING [watchdog] "EngineProxy._redispatch" @4.0s (stalled)
2026-01-20 19:29:19.124 WARNING [watchdog] "SpeechSystem.engine_event" @4.0s (stalled)
2026-01-20 19:29:21.116 WARNING [watchdog] "EngineProxy._redispatch" @6.0s (stalled)
2026-01-20 19:29:21.120 WARNING [watchdog] "SpeechSystem.engine_event" @6.0s (stalled)
2026-01-20 19:29:23.120 WARNING [watchdog] "EngineProxy._redispatch" @8.0s (stalled)
2026-01-20 19:29:23.124 WARNING [watchdog] "SpeechSystem.engine_event" @8.0s (stalled)
2026-01-20 19:29:25.118 WARNING [watchdog] "EngineProxy._redispatch" @10.0s (stalled)
2026-01-20 19:29:25.122 WARNING [watchdog] "SpeechSystem.engine_event" @10.0s (stalled)
2026-01-20 19:29:25.129 ERROR    24:                                         talon/scripting/talon_script.py:734| 
   23:                                         talon/scripting/talon_script.py:326| 
   22:                                              talon/scripting/actions.py:88 | 
   21:                            user/cursorless-talon/src/actions/actions.py:149| actions.user.cursorless_command(value,..
   20:                                                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   19:                                              talon/scripting/actions.py:88 | 
   18:                            user/cursorless-talon/src/actions/actions.py:110| actions.user.private_cursorless_comman..
   17:                                                                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   16:                                              talon/scripting/actions.py:88 | 
   15:                                    user/cursorless-talon/src/command.py:36 | response = actions.user.private_cursor..
   14:                                                                              
   13:                                              talon/scripting/actions.py:88 | 
   12:                  user/cursorless-talon/src/cursorless_command_server.py:39 | return actions.user.run_rpc_command_ge..
   11:                                                                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   10:                                              talon/scripting/actions.py:88 | 
    9:                    user/community/core/command_client/command_client.py:136| return run_command(
    8:                                                                                             
    7:                    user/community/core/command_client/command_client.py:55 | return actions.user.rpc_client_run_com..
    6:                                                                                      
    5:                                              talon/scripting/actions.py:88 | 
    4:             user/community/core/command_client/rpc_client/rpc_client.py:88 | decoded_contents = read_json_with_time..
    3:                                                                                             ^^^^^^^^^^^^^^^^^^^^^^^^^
    2: user/community/core/command_client/rpc_client/read_json_with_timeout.py:46 | raise Exception("Timed out waiting for response")
    1:                                                                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Exception: Timed out waiting for response

[The below error was raised while handling the above exception(s)]
2026-01-20 19:29:25.133 ERROR cb error topic="phrase" cb=SpeechSystem.engine_event
   16:      lib/python3.13/threading.py:1014* # cron thread
   15:      lib/python3.13/threading.py:1043* 
   14:      lib/python3.13/threading.py:994 * 
   13:                    talon/cron.py:159 | 
   12:                     talon/vad.py:23  | 
   11:                     talon/vad.py:129 | 
   10: talon/scripting/speech_system.py:398 | 
    9:             talon/engines/w2l.py:783 | 
    8:      talon/scripting/dispatch.py:134 | # 'phrase' main:EngineProxy._redispatch()
    7: talon/scripting/speech_system.py:71  | 
    6: -------------------------------------# [stack splice]
    5:      talon/scripting/dispatch.py:134 | # 'phrase' main:SpeechSystem.engine_event()
    4: talon/scripting/speech_system.py:548 | 
    3:      talon/scripting/executor.py:112 | 
    2:  talon/scripting/talon_script.py:836 | 
    1:  talon/scripting/talon_script.py:738 | 
talon.scripting.talon_script.TalonScriptError: 
 in script at /Users/ryan/.talon/user/cursorless-talon/src/cursorless.talon:12:
 > user.private_cursorless_action_or_ide_command(cursorless_action_or_ide_command, cursorless_target)
Exception: Timed out waiting for response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions