Wallet-verified member messaging (matrix-lines permissions, admin visibility)
- messages.js: challenge/personal_sign/recover auth (vendored pinned js-sha3 0.9.3 + noble-secp256k1 1.7.1, server-side only; self-tested positive + tamper cases), 30d HttpOnly sessions, message store on the volume, matrix-line permissions (your downline direct or broadcast, your upline chain - nothing else, so spam is impossible by construction), daily rate limits (30 direct / 3 broadcasts), 1500-char plain text - chain.js: memberIdByAccount (wallet -> position for sign-in) - API: msg-challenge/-verify/-me/-inbox/-send/-read public + msg-unread (count only, no auth) + admin/messages (full visibility, disclosed to members in the UI) - Dashboard: Messages card with unread bell, one-tap wallet sign-in, inbox with auto-read, compose with to-ID or whole-team broadcast - Admin: Member Messages review table - Chatbot canned answer + AI system prompt updated Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -667,6 +667,15 @@ function getOrgShare(rootId) {
|
||||
};
|
||||
}
|
||||
|
||||
// Wallet address -> position id (for wallet-verified messaging sign-in).
|
||||
// One position per address by contract design.
|
||||
function memberIdByAccount(address) {
|
||||
if (!state || !address) return null;
|
||||
const a = String(address).toLowerCase();
|
||||
for (const [id, m] of Object.entries(state.members)) if (m.account === a) return Number(id);
|
||||
return null;
|
||||
}
|
||||
|
||||
// Company-rotation pick: breadth-first (matrix order, left→right) first
|
||||
// position under `rootId` that still needs directs — the "next open team
|
||||
// position" for the public rotation when publicRotationMode==='chain'.
|
||||
@@ -735,4 +744,4 @@ async function getIncome(id) {
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = { startIndexer, getPayoutsPublic, verifyMember, memberLookup, memberPublic, getIncome, getOwnerUpgradeNeeds, getOrgRouting, getOrgShare, getCoachingScan, getMatrixTree, isInTeam, nextOpenPosition, balanceOf, CONTRACT };
|
||||
module.exports = { startIndexer, getPayoutsPublic, verifyMember, memberLookup, memberPublic, getIncome, getOwnerUpgradeNeeds, getOrgRouting, getOrgShare, getCoachingScan, getMatrixTree, isInTeam, nextOpenPosition, memberIdByAccount, balanceOf, CONTRACT };
|
||||
|
||||
Reference in New Issue
Block a user