picoclaw/pkg/agent
Administrator e20ff43f8b fix(agent): resolve subturn deadlocks, panics and context retry state
This commit addresses several critical concurrency and state management bugs within the SubTurn execution and delivery logic.

1. Fix Goroutine Leak & Deadlock in deliverSubTurnResult:
   - Replaced non-blocking select with a safe blocking select that listens to `resultChan` and a new `<-parentTS.Finished()` channel.
   - This ensures results are not arbitrarily dropped when the channel is full (preventing orphaned valid results), while also guaranteeing the child goroutine safely unblocks and exits if the parent finishes execution early.

2. Prevent "Send on Closed Channel" Fatal Panics:
   - Removed `close(pendingResults)` and `drainPendingResults` from `turnState.Finish()`.
   - The pendingResults channel is now naturally garbage collected, completely eliminating the race condition panic when a child attempts delivery at the exact moment the parent finishes.
   - Added a `defer recover()` failsafe inside deliverSubTurnResult to gracefully emit Orphan events in extreme edge cases.

3. Fix Truncation Recovery Prompt Drop:
   - Fixed the runTurn truncation retry logic by introducing an explicit `promptAlreadyAdded` boolean.
   - Ensures that the dynamically generated `recoveryPrompt` is correctly injected into the LLM history sequence on subsequent iterations, adhering to API roles without duplicating arrays.

4. Test Suite Stabilization:
   - Fixed TestDeliverSubTurnResultNoDeadlock to accurately wait for deterministic deliveries instead of racing timeouts.
   - Replaced defunct closed-channel tests with TestFinishedChannelClosedState matching the new Finished() mechanism.
   - Fixed the Finish(true) parameter in TestGrandchildAbort_CascadingCancellation to correctly validate Context cascade behavior.
   - All tests now pass cleanly without hanging or emitting false positives.
2026-03-18 13:10:36 +08:00
..
context.go Merge pull request #1207 from afjcjsbx/feat/debug-mode-no-truncate 2026-03-10 17:13:44 +01:00
context_cache_test.go fix(agent): invalidate system prompt cache for global/builtin skills (#845) 2026-03-03 18:25:00 +08:00
context_test.go fix deepseek-chat bug (#1066) 2026-03-06 16:04:31 +08:00
eventbus_mock.go feat(agent): port subturn PoC to refactor/agent branch 2026-03-16 14:31:32 +08:00
instance.go fix(tools): allow sandbox access to temp media files 2026-03-14 12:02:06 +08:00
instance_test.go add systray ui for all platform (#1649) 2026-03-17 14:12:32 +08:00
loop.go fix(agent): prevent duplicate history during subturn context recoveries 2026-03-18 12:18:32 +08:00
loop_mcp.go Fix/Add warning tips for MCP initialization when no valid servers configured (#1497) 2026-03-13 16:43:00 +08:00
loop_media.go feat: expose local file paths for non-image media to enable agent file tools (#1516) 2026-03-14 12:09:11 +08:00
loop_test.go feat: expose local file paths for non-image media to enable agent file tools (#1516) 2026-03-14 12:09:11 +08:00
memory.go refactor(modernize): apply safe modernize fixes 2026-02-27 16:35:07 +08:00
mock_provider_test.go feat(fmt): Fix formatting 2026-02-19 22:05:15 +02:00
registry.go feat(session): integrate JSONL persistence into agent loop (#1170) 2026-03-10 15:14:09 +08:00
registry_test.go feat(fmt): Run formatters 2026-02-18 21:48:23 +02:00
steering.go feat(agent): implement graceful finish vs hard abort for SubTurn lifecycle 2026-03-17 23:06:16 +08:00
steering_test.go feat(agent): steering (#1517) 2026-03-16 00:08:16 +08:00
subturn.go fix(agent): resolve subturn deadlocks, panics and context retry state 2026-03-18 13:10:36 +08:00
subturn_test.go fix(agent): resolve subturn deadlocks, panics and context retry state 2026-03-18 13:10:36 +08:00
thinking.go feat: add extended thinking support for Anthropic models (#1076) 2026-03-05 09:51:18 +08:00
thinking_test.go feat: add extended thinking support for Anthropic models (#1076) 2026-03-05 09:51:18 +08:00
turn_state.go fix(agent): resolve subturn deadlocks, panics and context retry state 2026-03-18 13:10:36 +08:00