core: alerts with information about registering names (#7653)

* minimal api change

* embed status. reduce

* drop fake owner change

* no-valid-link fix

* add UX flow for name lookups

* diagram edits

* corrections

* update name lookup API

* manual renaming

* implement core + cli

* implement UI

* fix

* build iOS app blindly

* shrink diff

* fix review comments

* review iterations

* opuse 5.5 /goal iterations

* fixes EP review

* fixes

* fixes

* short goal iterations

* refactor core-UI API to NameWarning with logic in core

* diff cosmetics

* simplify and normalize diagram

* add excalidraw normalizer script and test git hook

* cosmetics

* commit wireframe collab doc to repo as README

* review round on UX coverage

* iterate on /goal

* iterate on /goal

* add tests

* iterate on /goal

* fix freshness bug with local chats: When core marks a chat verified for a name, it now first un-verifies the user's other chats of the same kind:
  - a contact name covers contacts and business chats;
  - a channel name covers channels.

* align app divergences

* docs fixes

* iterations on /goal

* align excalidraw

* align and simplify core/UI/UXcanvas

* 27 rounds of /goal

* review

* core: simplify connect plan with name lookup

* simplify

* cache names in a separate table

* cache names resolution

* wip

* all

* fix

* remove cache

* update plans

* simplify

* bot types

* change types

* simplify

* update bot types

* remove review

* update view, tests

* simplify "unverify"

* update query plan

* changes

* simplify

* test helpers

* simpler

* update query plans

* fix

* query plans

* query plans

* fixes

* query plans

---------

Co-authored-by: Alain Brenzikofer <alain@encointer.org>
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2026-10-13 17:05:15 +01:00
1 parent 2f4a443dda
commit 7306f3aeef
39 files changed
+2751 -385

No files matched your search

@@ -1481,10 +1481,12 @@ class ConnectionPlan_invitationLink(TypedDict):
class ConnectionPlan_contactAddress(TypedDict):
type: Literal["contactAddress"]
contactAddressPlan: "ContactAddressPlan"
nameChange: NotRequired["NameChange"]
class ConnectionPlan_groupLink(TypedDict):
type: Literal["groupLink"]
groupLinkPlan: "GroupLinkPlan"
nameChange: NotRequired["NameChange"]
class ConnectionPlan_error(TypedDict):
type: Literal["error"]
@@ -1616,6 +1618,8 @@ class CtrlAppInfo(TypedDict):
deviceName: str
compression: bool
DomainVerification = Literal["failed", "verified", "moved"]
class DroppedMsg(TypedDict):
brokerTs: str # ISO-8601 timestamp
attempts: int # int
@@ -1955,7 +1959,7 @@ class GroupInfo(TypedDict):
rosterVersion: NotRequired[int] # int64
membersRequireAttention: int # int
viaGroupLinkUri: NotRequired[str]
groupDomainVerified: NotRequired[bool]
groupDomainVerified: NotRequired["DomainVerification"]
class GroupLink(TypedDict):
userContactLinkId: int # int64
@@ -2204,7 +2208,7 @@ class LocalProfile(TypedDict):
localBadge: NotRequired["LocalBadge"]
localAlias: str
contactDomain: NotRequired["SimplexDomainClaim"]
contactDomainVerified: NotRequired[bool]
contactDomainVerified: NotRequired["DomainVerification"]
MemberCriteria = Literal["all"]
@@ -2348,6 +2352,18 @@ MsgVerified = MsgVerified_signed | MsgVerified_sigMissing
MsgVerified_Tag = Literal["signed", "sigMissing"]
class NameChange_lapsed(TypedDict):
type: Literal["lapsed"]
nameWarning: "NameWarning"
class NameChange_moved(TypedDict):
type: Literal["moved"]
knownChat: "ChatInfo"
NameChange = NameChange_lapsed | NameChange_moved
NameChange_Tag = Literal["lapsed", "moved"]
class NameErrorType_NO_RESOLVER(TypedDict):
type: Literal["NO_RESOLVER"]
@@ -2362,6 +2378,34 @@ NameErrorType = NameErrorType_NO_RESOLVER | NameErrorType_NOT_FOUND | NameErrorT
NameErrorType_Tag = Literal["NO_RESOLVER", "NOT_FOUND", "RESOLVER"]
class NamePrice(TypedDict):
amount: int # int64
years: int # int
class NameWarning_expired(TypedDict):
type: Literal["expired"]
expiredAt: str # ISO-8601 timestamp
graceUntil: NotRequired[str] # ISO-8601 timestamp
class NameWarning_available(TypedDict):
type: Literal["available"]
price: "NamePrice"
class NameWarning_reservedForCommunity(TypedDict):
type: Literal["reservedForCommunity"]
class NameWarning_notRegistered(TypedDict):
type: Literal["notRegistered"]
NameWarning = (
NameWarning_expired
| NameWarning_available
| NameWarning_reservedForCommunity
| NameWarning_notRegistered
)
NameWarning_Tag = Literal["expired", "available", "reservedForCommunity", "notRegistered"]
class NetworkError_connectError(TypedDict):
type: Literal["connectError"]
connectError: str
@@ -2951,9 +2995,17 @@ class SimplexDomainError_noValidLink(TypedDict):
class SimplexDomainError_unknownDomain(TypedDict):
type: Literal["unknownDomain"]
SimplexDomainError = SimplexDomainError_noValidLink | SimplexDomainError_unknownDomain
class SimplexDomainError_nameWarning(TypedDict):
type: Literal["nameWarning"]
nameWarning: "NameWarning"
SimplexDomainError_Tag = Literal["noValidLink", "unknownDomain"]
SimplexDomainError = (
SimplexDomainError_noValidLink
| SimplexDomainError_unknownDomain
| SimplexDomainError_nameWarning
)
SimplexDomainError_Tag = Literal["noValidLink", "unknownDomain", "nameWarning"]
class SimplexDomainProof(TypedDict):
linkOwnerId: NotRequired[str]