mirror of
https://github.com/langgenius/dify.git
synced 2026-10-04 13:47:55 +08:00
edit.plan_approval offered exactly one action, approve_plan, while the card its own refusal emitted said "Adjust it and approve again" -- an affordance that did not exist. A chat message kept the PC at the gate and never touched edit_rules, so an approval the engine refused had no exit at all. The gate now also offers Continue adjusting and Discard this change plan, admitted end to end: _ACTIONS_FOR renders them, _BACKEND_ACTIONS_FOR [EDIT_PLAN_APPROVAL] admits re_fix and undo, and handle_plan_approval routes both past the early return that used to swallow every non-approve kind. The discard reuses perform_revert against the checkpoint handle_impact_analysis already mints; Continue adjusting reuses handle_review's re_fix body, now shared as _resume_adjusting, which returns to edit.impact_analysis with the edit-rules form repopulated and unfrozen. last_edit_rejection is cleared where its cause is: in handle_impact_analysis, and only when the submitted payload actually changes fc.edit_rules. A stored refusal goes stale precisely when the rules it refused stop being the rules, and nowhere else -- so the actions that merely route the user to the form do not clear it, and neither does edit.reverted's Retry. A revert taken at the gate writes nothing, which makes it the one path reaching edit.reverted with a refusal still true of the restored draft; clearing there would have made Retry re-propose the identical plan blind. Copy corrected in strings.py and handlers_edit.py to name the three buttons that now exist. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>