feat: generalize session sending with multiline text and structured mentions

Add named-session file/image/reply sending, preserve multiline text, and share safe member/all mention handling. Protect existing drafts, bind popup selection to the current window, validate structured mention tokens, and require fresh matching visible messages without automatic resend. Core tests: 121 passed. Windows 4.1.13.63 final validation: 9/9 passed. Record explicit coverage limits and sanitized evidence.
This commit is contained in:
2026-09-06 17:10:53 +08:00
parent ad22a89185
commit c49f6a10b2
23 changed files with 531 additions and 69 deletions
@@ -0,0 +1,6 @@
{
"CurrentSessionId": 1,
"InputDesktopAvailable": true,
"WindowFound": true,
"Errors": []
}
@@ -0,0 +1,5 @@
{
"Success": true,
"Code": null,
"Message": "visible message confirmed"
}
@@ -0,0 +1,5 @@
{
"Success": true,
"Code": null,
"Message": "visible message confirmed"
}
@@ -0,0 +1,27 @@
{
"MissingMember": {
"error": "ControlNotFound",
"Message": "A unique mention option in a fresh WeChat popup was not found; no send was attempted."
},
"ExistingDraft": {
"error": "InvalidOperationState",
"Message": "The conversation contains an existing draft; it was not overwritten."
},
"ExactOwnedDraftCleanup": {
"DraftGuardPassed": true,
"Cleared": true,
"OwnedDraftLength": 1
},
"UserApprovedUnexpectedDraftCleanup": {
"UserApprovedCleanup": true,
"Cleared": true,
"DraftGuardPassed": true,
"ClearedDraftLength": 4
},
"ExactStructuredTokenCleanup": {
"UserApprovedCleanup": false,
"Cleared": true,
"DraftGuardPassed": true,
"ClearedDraftLength": 1
}
}
@@ -0,0 +1,6 @@
{
"Fingerprint": "b787bffca17193219159d001a2cdd7d70d82aaa8628dffa0135173af205f698d",
"Type": "Quote",
"length": 114,
"content": null
}
@@ -0,0 +1,6 @@
{
"Fingerprint": "dcd1b8ceaef77ca58f0656abdf7dce58aadcf997a991d5bb94a88dc3be8d7042",
"Type": "File",
"length": 77,
"content": null
}
@@ -0,0 +1,6 @@
{
"Fingerprint": "8d879245192fb79dc95a57672367997091df48454211605c428cc5c127280178",
"Type": "Image",
"length": 2,
"content": null
}
@@ -0,0 +1,6 @@
{
"Fingerprint": "3ab05f45aecf440154d308dc4ca647ab760fb8098efd9029a19df735cc8c02e6",
"Type": "Text",
"length": 112,
"content": null
}
@@ -0,0 +1,6 @@
{
"doctorErrors": [],
"nodes": 162,
"sanitized": true,
"confirmed": true
}
@@ -0,0 +1,43 @@
{
"Checks": [
{
"Stage": "doctor",
"ExitCode": 0
},
{
"Stage": "inspect-ui",
"ExitCode": 0
},
{
"Stage": "smoke",
"ExitCode": 0
},
{
"Stage": "send-multiline",
"ExitCode": 0
},
{
"Stage": "send-file",
"ExitCode": 0
},
{
"Stage": "send-image",
"ExitCode": 0
},
{
"Stage": "reply-latest",
"ExitCode": 0
},
{
"Stage": "mention-member",
"ExitCode": 0
},
{
"Stage": "mention-all",
"ExitCode": 0
}
],
"BinarySha256": "45E9994739D33E0786F3D224E9905DDF7439CCD322E6BAF21B431880706A0229",
"Success": true,
"MentionAttempted": true
}