João Salavisa
58fb9ffb0f
fix: dedupe cancel-turn clicks to stop "turn cancelled" cascade ( #784 )
...
* fix: dedupe cancel-turn clicks to stop "turn cancelled" cascade
The cancel button had no in-flight feedback, so impatient users clicked
it repeatedly while the agent was tearing down a slow turn (e.g. a
Claude Monitor tool). Each click reached the backend and emitted its
own "Turn cancelled by user" message, with the second-and-later calls
also lazily creating phantom turns to host those messages.
Fix on both sides: SubmitButton now tracks isCancelling locally and
disables itself with a spinner while the request is in flight; the
orchestrator deduplicates concurrent CancelAgent calls per session via
a sync.Map guard so duplicates that slip through return immediately.
* fix: address PR review feedback
- Test: replace sleep-based polling in cancel-dedupe test with channel
synchronization (cancelAgentEntered) per project convention.
- UI: switch the cancel re-entrancy guard from state to a ref so
isCancelling no longer thrashes the useCallback dep array.
---------
Co-authored-by: Kandev Agent <agent@kandev.dev >
2026-05-02 22:49:19 +01:00
..
2026-04-20 18:52:45 +01:00
2026-05-02 22:49:19 +01:00
2026-02-19 22:18:01 +00:00
2026-05-02 20:26:42 +01:00
2026-03-07 14:53:21 +00:00
2026-05-01 23:50:05 +01:00
2026-03-10 17:30:04 +00:00
2026-05-01 13:27:25 +01:00
2026-04-24 21:31:46 +01:00
2026-02-24 20:33:45 +00:00
2026-04-18 10:32:24 +01:00
2026-04-28 22:23:14 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 21:54:28 +01:00
2026-05-02 21:54:28 +01:00
2026-03-30 22:44:10 +01:00
2026-05-02 20:26:42 +01:00
2026-05-01 21:02:41 +01:00
2026-02-21 22:14:56 +00:00
2026-02-23 00:16:37 +00:00
2026-02-19 22:18:01 +00:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-04-28 22:23:14 +01:00
2026-05-01 22:32:28 +01:00
2026-05-02 20:26:42 +01:00
2026-05-01 13:27:25 +01:00
2026-05-01 11:00:33 +01:00
2026-05-02 15:19:02 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 15:19:02 +01:00
2026-03-13 10:44:32 +00:00
2026-02-24 23:01:41 +00:00
2026-02-19 22:18:01 +00:00
2026-04-09 12:49:47 +01:00
2026-04-09 12:49:47 +01:00
2026-04-11 17:43:21 +01:00
2026-02-19 22:18:01 +00:00
2026-04-25 21:42:59 +01:00
2026-04-11 17:43:21 +01:00
2026-04-11 17:43:21 +01:00
2026-03-24 23:38:02 +00:00
2026-03-24 23:38:02 +00:00
2026-02-19 22:18:01 +00:00
2026-02-19 22:18:01 +00:00
2026-04-02 00:08:35 +01:00
2026-04-11 17:43:21 +01:00
2026-04-11 17:43:21 +01:00
2026-02-19 22:18:01 +00:00
2026-03-29 15:33:40 +01:00
2026-02-19 22:18:01 +00:00
2026-03-12 23:22:26 +00:00
2026-03-24 23:38:02 +00:00
2026-04-24 21:31:46 +01:00
2026-04-24 21:31:46 +01:00
2026-05-01 11:00:33 +01:00
2026-05-01 11:00:33 +01:00
2026-04-20 13:44:24 +01:00
2026-05-01 22:32:28 +01:00
2026-05-01 21:02:41 +01:00
2026-05-02 15:19:02 +01:00
2026-03-13 10:44:32 +00:00
2026-04-25 18:21:33 +01:00
2026-04-25 18:21:33 +01:00
2026-03-08 11:03:30 +00:00
2026-05-01 18:01:17 +01:00
2026-05-01 21:02:41 +01:00
2026-05-01 21:02:41 +01:00
2026-05-02 22:25:40 +01:00
2026-05-02 22:25:40 +01:00
2026-05-02 22:25:40 +01:00
2026-05-02 22:25:40 +01:00
2026-05-02 22:25:40 +01:00
2026-05-02 22:25:40 +01:00
2026-03-02 22:47:21 +00:00
2026-04-25 18:40:31 +01:00
2026-03-29 15:33:40 +01:00
2026-05-01 11:00:33 +01:00
2026-04-20 22:31:09 +01:00
2026-04-20 22:31:09 +01:00
2026-05-01 21:02:41 +01:00
2026-02-19 22:18:01 +00:00
2026-05-01 11:00:33 +01:00
2026-04-30 14:05:35 +01:00
2026-02-19 22:18:01 +00:00
2026-04-20 13:44:24 +01:00
2026-03-29 15:33:40 +01:00
2026-04-17 23:20:10 +01:00
2026-02-19 22:18:01 +00:00
2026-03-07 14:53:21 +00:00
2026-04-02 00:08:35 +01:00
2026-04-17 16:46:08 +01:00
2026-05-02 20:26:42 +01:00
2026-04-24 17:14:03 +01:00
2026-04-08 07:55:24 +01:00
2026-04-17 23:20:10 +01:00
2026-05-02 20:26:42 +01:00
2026-02-19 22:18:01 +00:00
2026-03-03 12:41:51 +00:00
2026-05-02 20:26:42 +01:00
2026-02-26 11:26:30 +00:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-04-27 10:22:58 +01:00
2026-04-27 10:22:58 +01:00
2026-04-27 10:22:58 +01:00
2026-04-27 10:22:58 +01:00
2026-04-27 10:22:58 +01:00
2026-04-27 10:22:58 +01:00
2026-02-25 02:10:16 +00:00
2026-05-02 15:19:02 +01:00
2026-04-29 09:56:26 +01:00
2026-05-02 20:26:42 +01:00
2026-05-02 20:26:42 +01:00
2026-02-19 22:18:01 +00:00
2026-04-20 13:44:24 +01:00
2026-04-23 18:40:58 +01:00
2026-05-02 20:26:42 +01:00
2026-03-29 22:27:37 +01:00
2026-05-01 13:27:25 +01:00
2026-04-24 17:14:03 +01:00
2026-05-01 21:02:41 +01:00
2026-05-01 21:02:41 +01:00
2026-05-01 13:27:25 +01:00
2026-05-02 15:19:02 +01:00
2026-04-27 10:22:58 +01:00
2026-05-02 20:26:42 +01:00
2026-04-24 17:14:03 +01:00
2026-03-08 11:03:30 +00:00
2026-02-24 23:01:41 +00:00
2026-04-16 10:14:45 +01:00
2026-02-19 22:18:01 +00:00
2026-02-19 22:18:01 +00:00
2026-05-01 13:27:25 +01:00