Two longstanding gaps closed, both end-to-end verified.
1. @-mentions as user now actually notify (RichText.atIds reversed)
- Reverse-engineered Feishu Web bundle: RichText requires atIds[] (field 6)
to register AT element ids; without it the backend zeros out user_id.
- proto/lark.proto: extended RichText with atIds/anchorIds/imageIds/...;
added real AtProperty + AnchorProperty messages.
- src/client.js: sendPost collects AT elem ids into richText.atIds and
switches AT encoding to AtProperty. sendMessage accepts new `ats: [{userId, name}]`
option to splice @-mentions into a TEXT message (marker: `@<name>`).
- src/index.js: send_as_user / send_to_user / send_to_group expose the
`ats` param. send_post_as_user description updated.
- Tested live against a group: user_id and user_name are now preserved in
the bot-API readback (previously both empty strings).
- send_message_as_bot description clarified as the bot-identity fallback.
2. UAT-first for all docx / bitable / drive ops (fixes 403 on user-owned resources)
- src/official.js: added _uatREST + _asUserOrApp helpers.
- All docx (readDoc/createDoc/getDocBlocks/createDocBlock/updateDocBlock/
deleteDocBlocks), bitable (create/get/list/update/delete × app/table/
field/view/record + batch_*_records + copyBitable), and drive createFolder
now try UAT first, fall back to app SDK on failure.
- Resolves 1770032 (docx forbidden) and 91403 (bitable forbidden) on
user-owned resources created via `create_doc` / `create_bitable`.
- Removed now-redundant createDocAsUser / createBitableAsUser / createFolderAsUser.
- _formatMessage now surfaces im.message mentions[] when present.
3. Docs synced: CLAUDE.md, skill reference, .claude-plugin/plugin.json.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>