fix(feishu): bind card decisions to the actor and reject stale cards

Address review feedback on the interaction cards:

1. Bind card decisions to the initiating actor. The card-action operator
   (operatorOpenId) is now passed into the approval and question handlers:
   - submitByApprovalId receives { actor } so another allowed group member
     cannot approve/reject someone else's approval;
   - the answer branch requires pending.actor === operator.

2. Include the question index in the answer button action and validate it
   against the current pending question, so a stale card from an earlier
   question in a multi-question interaction cannot be applied to the next one.

3. When both the card send and the plain-text fallback fail, the error is no
   longer swallowed: it propagates so the interaction is not marked as
   presented and the existing retry/reconnect behaviour can run.

Adds regression tests for all three cases.
This commit is contained in:
C3H3-AI 2026-09-01 17:42:10 +08:00
parent 0b42ea9889
commit b5378500ca
4 changed files with 244 additions and 21 deletions

File diff suppressed because one or more lines are too long