@agenticprimitives/agent-naming 1.0.0-alpha.4 → 1.0.0-alpha.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AUDIT.md +15 -4
- package/CLAUDE.md +40 -53
- package/README.md +57 -54
- package/dist/abis.d.ts +641 -0
- package/dist/abis.d.ts.map +1 -1
- package/dist/abis.js +96 -0
- package/dist/abis.js.map +1 -1
- package/dist/claim.d.ts +71 -0
- package/dist/claim.d.ts.map +1 -0
- package/dist/claim.js +73 -0
- package/dist/claim.js.map +1 -0
- package/dist/client.d.ts +36 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +197 -10
- package/dist/client.js.map +1 -1
- package/dist/constants.d.ts +55 -5
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +128 -4
- package/dist/constants.js.map +1 -1
- package/dist/custody.d.ts +54 -2
- package/dist/custody.d.ts.map +1 -1
- package/dist/custody.js +140 -4
- package/dist/custody.js.map +1 -1
- package/dist/dns.d.ts +91 -0
- package/dist/dns.d.ts.map +1 -0
- package/dist/dns.js +196 -0
- package/dist/dns.js.map +1 -0
- package/dist/federated.d.ts +31 -0
- package/dist/federated.d.ts.map +1 -0
- package/dist/federated.js +54 -0
- package/dist/federated.js.map +1 -0
- package/dist/grammar.d.ts +62 -0
- package/dist/grammar.d.ts.map +1 -0
- package/dist/grammar.js +165 -0
- package/dist/grammar.js.map +1 -0
- package/dist/hash.d.ts +14 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +22 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +17 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -8
- package/dist/index.js.map +1 -1
- package/dist/issuance.d.ts +70 -0
- package/dist/issuance.d.ts.map +1 -0
- package/dist/issuance.js +65 -0
- package/dist/issuance.js.map +1 -0
- package/dist/label.d.ts +10 -0
- package/dist/label.d.ts.map +1 -0
- package/dist/label.js +39 -0
- package/dist/label.js.map +1 -0
- package/dist/namehash.d.ts +12 -24
- package/dist/namehash.d.ts.map +1 -1
- package/dist/namehash.js +13 -36
- package/dist/namehash.js.map +1 -1
- package/dist/normalize.d.ts +9 -17
- package/dist/normalize.d.ts.map +1 -1
- package/dist/normalize.js +11 -48
- package/dist/normalize.js.map +1 -1
- package/dist/price.d.ts +74 -0
- package/dist/price.d.ts.map +1 -0
- package/dist/price.js +58 -0
- package/dist/price.js.map +1 -0
- package/dist/records.d.ts +44 -3
- package/dist/records.d.ts.map +1 -1
- package/dist/records.js +203 -4
- package/dist/records.js.map +1 -1
- package/dist/types.d.ts +108 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/vertical.d.ts +43 -0
- package/dist/vertical.d.ts.map +1 -0
- package/dist/vertical.js +40 -0
- package/dist/vertical.js.map +1 -0
- package/docs/api.md +15 -3
- package/docs/concepts.md +1 -1
- package/docs/migration.md +1 -1
- package/package.json +24 -15
package/AUDIT.md
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# @agenticprimitives/agent-naming — package audit
|
|
2
2
|
|
|
3
3
|
**Status:** Phase 1 (SDK skeleton + spec + pure helpers).
|
|
4
|
-
**Last refreshed:** 2026-
|
|
4
|
+
**Last refreshed:** 2026-06-01 (R9 substrate coverage references + R11.1 fail-hard audit + R11.3 public-surface cleanup)
|
|
5
|
+
**Prior refresh:** 2026-05-23
|
|
5
6
|
**Owner:** [security-auditor](../../docs/agents/security-auditor.md) +
|
|
6
7
|
[technical-architect-auditor](../../docs/agents/technical-architect-auditor.md).
|
|
7
8
|
**System audit cross-ref:** see
|
|
@@ -14,7 +15,7 @@ on-chain authority paths, and demo integration land in Phase 3+.
|
|
|
14
15
|
## Charter (what's audit-relevant in this package)
|
|
15
16
|
|
|
16
17
|
- Pure helpers (`normalizeAgentName`, `labelhash`, `namehash`): MUST
|
|
17
|
-
be deterministic + match the
|
|
18
|
+
be deterministic + match the standard recursive-namehash algorithm + reject
|
|
18
19
|
malformed input.
|
|
19
20
|
- Record schema (`AgentNameRecords` + `records` subpath): MUST
|
|
20
21
|
refuse unknown keys on encode (fail-loud write) AND drop unknown
|
|
@@ -39,9 +40,9 @@ on-chain authority paths, and demo integration land in Phase 3+.
|
|
|
39
40
|
non-ASCII / oversize labels. Throws `InvalidNameError`. Covered in
|
|
40
41
|
`test/normalize.test.ts`.
|
|
41
42
|
- ✅ `normalize` is idempotent: `normalize(normalize(x)) === normalize(x)`.
|
|
42
|
-
- ✅ `namehash('')` = `ZERO_NODE` (`0x00…00`) per the
|
|
43
|
+
- ✅ `namehash('')` = `ZERO_NODE` (`0x00…00`) per the root-sentinel
|
|
43
44
|
convention.
|
|
44
|
-
- ✅ `namehash` matches the
|
|
45
|
+
- ✅ `namehash` matches the standard recursive-namehash algorithm under an
|
|
45
46
|
in-band independent reimplementation (`test/namehash.test.ts`
|
|
46
47
|
golden-vector table).
|
|
47
48
|
- ✅ `namehash` rejects malformed input by delegating to `normalize`.
|
|
@@ -84,3 +85,13 @@ client doesn't yet take an `auditSink`; Phase 2 will add the optional
|
|
|
84
85
|
| Date | Wave | What changed |
|
|
85
86
|
| --- | --- | --- |
|
|
86
87
|
| 2026-05-23 | NS Phase 1 | Initial audit. AN-1/2/3 open; security invariants verified by unit tests. |
|
|
88
|
+
|
|
89
|
+
## R9 substrate coverage (2026-06-01)
|
|
90
|
+
|
|
91
|
+
- Locked by R6.2 + R6.8 contract-side hardening:
|
|
92
|
+
- `AgentNameRegistry.initializeRoot` cannot be frontrun (immutable initializer + same-tx deploy) — H7-C.4 / CON-NAMING-001.
|
|
93
|
+
- `PermissionlessSubregistry.register` is `nonReentrant` — R6.2 / CON-SUBREGISTRY-003.
|
|
94
|
+
- Pause coverage: 7 mutating functions (register, backfillLabel, setOwner, setResolver, setSubregistry, renew, setPrimaryName) are `whenNotPaused` — R6.8.
|
|
95
|
+
- ADR-0012 / ADR-0013: NO `eth_getLogs` in product read paths; `reverseResolveString` is the canonical single-call.
|
|
96
|
+
- See [`packages/contracts/AUDIT.md` § 3.8](../contracts/AUDIT.md).
|
|
97
|
+
|
package/CLAUDE.md
CHANGED
|
@@ -5,11 +5,24 @@ Names are a **facet registration** pointing AT the canonical Smart Agent ([ADR-0
|
|
|
5
5
|
|
|
6
6
|
## What this package owns
|
|
7
7
|
|
|
8
|
-
- The
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
- `
|
|
12
|
-
|
|
8
|
+
- The **typed TLD registry** (`AGENT_TLDS` = `me org team svc workspace treasury registry church circle`, alias `ws`,
|
|
9
|
+
legacy `impact`/`agent`) — a suffix names the DERIVED agent type, never a root, a role or the
|
|
10
|
+
hierarchy ([ADR-0061](../../docs/architecture/decisions/0061-derived-agent-types-and-typed-name-suffixes.md),
|
|
11
|
+
[spec 346](../../specs/346-typed-agent-naming-and-registry.md)). `derivedTypeForTld` / `rootClassForTld`.
|
|
12
|
+
- The name **grammar** (`parseAgentName`): `x.t` canonical, `x.t@c.u` context-issued (path form
|
|
13
|
+
`c.u/x.t`, on-chain form `x.t.c.u`), type-nodes, roots, legacy. One context level in v1.
|
|
14
|
+
- Name normalization (`normalizeAgentName`) — NFC + lowercase + label validation + alias rewrite;
|
|
15
|
+
returns the canonical display form.
|
|
16
|
+
- The **federated reference** (`federatedAgentName` → `FederatedAgentNameV1 { name, chain }`, `displayAgentName` —
|
|
17
|
+
bare only inside the home chain, qualified everywhere else; spec 346 §3.7, ap-federation spec 440 §C). The chain is
|
|
18
|
+
a record beside the name, never a name component: `alice.me@faithchain` is refused by the grammar.
|
|
19
|
+
- The **DNS/A2A projection** (`dnsHostForHandle`, zone caller-supplied — ADR-0021) and the two
|
|
20
|
+
protocol paths (`/api/a2a`, `/.well-known/agent-card.json`).
|
|
21
|
+
- **Claim-time validation** (`validateTypedClaim`, `findUniqueLabel`, `buildDeclareAgentTypeCalls`,
|
|
22
|
+
`buildTypedClaimCalls`): the suffix is a CLAIM, the SA-keyed on-chain `atl:agentType` record is
|
|
23
|
+
the authority; a mismatch fails closed (`resolveTyped` → `null`, `checkTypedName` → reason).
|
|
24
|
+
- `labelhash` + `namehash` — recursive keccak256 hashes
|
|
25
|
+
(`keccak256(parentNode || labelhash)`) for identifier nodes.
|
|
13
26
|
- Record schemas (`AgentNameRecords`) and predicate constants
|
|
14
27
|
(subpath `/records`).
|
|
15
28
|
- `AgentNamingClient` — read API (resolve / reverse-resolve / get
|
|
@@ -19,25 +32,19 @@ Names are a **facet registration** pointing AT the canonical Smart Agent ([ADR-0
|
|
|
19
32
|
|
|
20
33
|
## What this package does NOT own
|
|
21
34
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
We expose call builders only — never import.
|
|
27
|
-
- Delegation / caveat / mint → [`delegation`](../delegation).
|
|
28
|
-
- Passkey ceremonies → [`connect-auth`](../connect-auth).
|
|
29
|
-
- MCP / A2A transport → demo apps + future `a2a-runtime`.
|
|
30
|
-
- Contract source — that lives in `packages/contracts/src/naming/`
|
|
31
|
-
(Phase 3+); this package ships ABIs + client only.
|
|
35
|
+
Smart-account internals → `agent-account`; custody policy → `account-custody` (call builders only,
|
|
36
|
+
never imported); delegation → `delegation`; passkeys → `connect-auth`; MCP/A2A transport → apps;
|
|
37
|
+
contract source → `packages/contracts/src/naming/` (ABIs + client only here); the composed typed
|
|
38
|
+
resolver / invitation flows → `registry-resolution` (spec 346 §6.3).
|
|
32
39
|
|
|
33
40
|
## Vocabulary
|
|
34
41
|
|
|
35
42
|
**Owns:** `AgentName`, `Label`, `Node` (namehash), `NameRecord`,
|
|
36
43
|
`AgentNamingClient`, `Subregistry`, `Resolver`, `PrimaryName`,
|
|
37
|
-
`
|
|
44
|
+
`AgentTld`, `ParsedAgentName`, `TypedNameRecord`.
|
|
38
45
|
**Disambiguation:**
|
|
39
46
|
|
|
40
|
-
- **"resolver"** here = on-chain
|
|
47
|
+
- **"resolver"** here = our on-chain registry + resolver. Distinct from
|
|
41
48
|
any other package.
|
|
42
49
|
- **"registry"** here = `AgentNameRegistry` contract. Distinct from
|
|
43
50
|
the factory deploy-registry in `agent-account`.
|
|
@@ -51,14 +58,15 @@ Names are a **facet registration** pointing AT the canonical Smart Agent ([ADR-0
|
|
|
51
58
|
|
|
52
59
|
1. `capability.manifest.json` — boundary.
|
|
53
60
|
2. `src/index.ts` — public API.
|
|
54
|
-
3. `../../specs/
|
|
61
|
+
3. `../../specs/346-typed-agent-naming-and-registry.md` §2–§5 — the typed model (spec 215 = records/contracts prior art).
|
|
55
62
|
4. `src/namehash.ts` + `src/normalize.ts` — the pure substrate.
|
|
56
63
|
5. `src/client.ts` — the client skeleton.
|
|
57
64
|
|
|
58
65
|
## Stable public exports
|
|
59
66
|
|
|
60
|
-
**Constants + helpers:** `
|
|
61
|
-
`labelhash`, `namehash
|
|
67
|
+
**Constants + helpers:** `AGENT_TLDS`, `derivedTypeForTld`, `rootKindForTld`, `parseAgentName`,
|
|
68
|
+
`formatAgentName`, `normalizeAgentName`, `labelhash`, `namehash`, `dnsHostForHandle`,
|
|
69
|
+
`findUniqueLabel`, `validateTypedClaim`, `federatedAgentName`, `displayAgentName`.
|
|
62
70
|
**Types:** `AgentNameRecords`, `RegisterSubnameInput`,
|
|
63
71
|
`SetPrimaryNameInput`, `SetAgentRecordsInput`,
|
|
64
72
|
`SetSubregistryInput`.
|
|
@@ -68,6 +76,8 @@ Names are a **facet registration** pointing AT the canonical Smart Agent ([ADR-0
|
|
|
68
76
|
**Subpaths:**
|
|
69
77
|
|
|
70
78
|
- `/records` — predicate constants + encoders/decoders.
|
|
79
|
+
Includes `cardDigest` (bytes32 sha256 of the RELEASED A2A Agent Card) + `cardUri` — spec 347 §8.3; the AP Naming
|
|
80
|
+
projection writes them, `resolve()` reads them, `registry-resolution` surfaces `bindings.cardDigest`. Evidence, never authority.
|
|
71
81
|
- `/custody` — pure encoded call builders for custody-gated name
|
|
72
82
|
rotation (no `@agenticprimitives/account-custody` import).
|
|
73
83
|
|
|
@@ -103,30 +113,13 @@ Names are a **facet registration** pointing AT the canonical Smart Agent ([ADR-0
|
|
|
103
113
|
- "Reach for an MCP transport" — **STOP.** Out of scope.
|
|
104
114
|
- "Auto-resolve name via a system-wide hook in the worker" — **STOP.**
|
|
105
115
|
Demo-app integration only; the package itself is transport-agnostic.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
`
|
|
111
|
-
-
|
|
112
|
-
|
|
113
|
-
`@agenticprimitives/account-custody`.
|
|
114
|
-
- Adding passkey behavior? Stop. Route to `connect-auth`.
|
|
115
|
-
- Adding delegation or caveat behavior? Stop. Route to `delegation`.
|
|
116
|
-
- Adding MCP/A2A transport? Stop. Route to app/runtime packages.
|
|
117
|
-
|
|
118
|
-
## Before you write code
|
|
119
|
-
|
|
120
|
-
- [ ] Is the change in the resolver-records / namehash / normalize /
|
|
121
|
-
client surface?
|
|
122
|
-
- [ ] Did I avoid importing from `delegation`, `account-custody`,
|
|
123
|
-
`mcp-runtime`, `tool-policy`, `key-custody`, `audit`?
|
|
124
|
-
- [ ] Did I keep `normalize` deterministic (NFC + lowercase + label
|
|
125
|
-
validation)?
|
|
126
|
-
- [ ] Did I write golden-vector tests for any namehash / labelhash
|
|
127
|
-
change?
|
|
128
|
-
- [ ] Did I update `specs/215-agent-naming.md` if the public API or
|
|
129
|
-
records schema changed?
|
|
116
|
+
- "Infer the agent type from the suffix / the DNS label" or "let the suffix
|
|
117
|
+
override `atl:agentType`" — **STOP.** ADR-0061 §5: the record is the
|
|
118
|
+
authority; `checkTypedName` fails closed on a mismatch.
|
|
119
|
+
- "Bake a zone / hostname into `dns.ts`" — **STOP.** ADR-0021: the zone is
|
|
120
|
+
caller-supplied; `check:no-domain-in-packages` enforces it.
|
|
121
|
+
- "Add `'team'`/`'treasury'` to `AgentKind`" — **STOP.** Roots are closed;
|
|
122
|
+
the derived type is `DerivedAgentType` on the SA subject.
|
|
130
123
|
|
|
131
124
|
## Security invariants (DO NOT BREAK)
|
|
132
125
|
|
|
@@ -161,15 +154,9 @@ pnpm check:forbidden-terms
|
|
|
161
154
|
|
|
162
155
|
## Capabilities this package participates in
|
|
163
156
|
|
|
164
|
-
- **Agent identity + service discovery** —
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
(`a2a-endpoint`, `mcp-endpoint`) without hardcoded URLs.
|
|
168
|
-
- **Audit / forensics trail** — emits (via consumer-supplied
|
|
169
|
-
`AuditSink`): `agent-naming.{resolve,register,records.update,
|
|
170
|
-
primary-name.update,subregistry.update}`.
|
|
171
|
-
- Index of cross-cutting capabilities:
|
|
172
|
-
[`docs/architecture/cross-cutting-capabilities.md`](../../docs/architecture/cross-cutting-capabilities.md).
|
|
157
|
+
- **Agent identity + service discovery** — which Smart Agent answers to which typed name, and the
|
|
158
|
+
DNS/A2A binding projected from it. Index: [`cross-cutting-capabilities.md`](../../docs/architecture/cross-cutting-capabilities.md).
|
|
159
|
+
- **Audit trail** — emits `agent-naming.{resolve,register,records.update,primary-name.update,subregistry.update}` via a consumer-supplied `AuditSink`.
|
|
173
160
|
|
|
174
161
|
## Documentation map
|
|
175
162
|
|
package/README.md
CHANGED
|
@@ -1,44 +1,40 @@
|
|
|
1
1
|
# @agenticprimitives/agent-naming
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> Part of **[Agentic Primitives](https://agenticprimitives.dev)** — the open-source trust substrate for agentic applications: identity that can sign, authority checked at act time, evidence the owner carries. [Developer kit](https://github.com/agentictrustlabs/agentic-primitives) · [All packages](https://agenticprimitives.dev/developers)
|
|
4
4
|
|
|
5
|
-
The
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
**The name is a facet. The address is the identity.** Agent naming is being settled right now — GoDaddy launched an Agent Naming Service, ERC-8004 put agent registries on mainnet, and every discovery stack needs an answer to "which agent answers to this name?" Most naming systems get the dependency backwards: the name becomes the identity, and losing the name (or the registrar) means losing everything attached to it. Here, every person, org, service agent, and treasury is a canonical ERC-4337 Smart Agent address — and a `.agent` name is a replaceable record pointing *at* that address ([ADR-0010](../../docs/architecture/decisions/0010-smart-agent-canonical-identifier.md)). Rotate the name, keep the identity. Rotate your credentials, keep the name. Nothing downstream breaks.
|
|
6
|
+
|
|
7
|
+
Part of [agenticprimitives](../../README.md) — the trust substrate for the agent economy: one canonical Smart Agent identity with custody, delegation, naming, credentials, and audit evidence designed as one system.
|
|
8
|
+
|
|
9
|
+
Use this package to resolve names like `alice.agent` and `treasury.acme.agent` to Smart Agent addresses, read typed service-discovery records (A2A endpoint, MCP endpoint, CAIP-10 `nativeId`), and build encoded calls for name-management transactions. Names are hierarchical — orgs hand out subnames under their own subregistry — and normalization is deterministic and on-chain-verifiable.
|
|
8
10
|
|
|
9
11
|
> **Layer:** Discover — a naming **facet** (not canonical identity — that is `agent-account`).
|
|
10
12
|
> **Canonical key:** the Smart Agent address the name resolves to.
|
|
11
13
|
|
|
12
|
-
Use this
|
|
13
|
-
`treasury.acme.agent` to Smart Agent addresses, read typed service-discovery
|
|
14
|
-
records, and build encoded calls for name-management transactions.
|
|
15
|
-
|
|
16
|
-
## Use This When
|
|
14
|
+
## Use this when
|
|
17
15
|
|
|
18
|
-
- You need forward resolution: `alice.agent
|
|
19
|
-
- You need reverse resolution from a Smart Agent address to its primary name.
|
|
20
|
-
- You need typed records such as `displayName`, `a2aEndpoint`, `mcpEndpoint`,
|
|
21
|
-
|
|
22
|
-
- You need pure call builders for name registration, resolver updates, primary
|
|
23
|
-
name updates, or owner rotation.
|
|
16
|
+
- You need forward resolution: `alice.agent → 0x…`.
|
|
17
|
+
- You need reverse resolution from a Smart Agent address to its primary name — with a round-trip check, so a name is only trusted when it resolves back to the same address.
|
|
18
|
+
- You need typed records such as `displayName`, `a2aEndpoint`, `mcpEndpoint`, `nativeId`, or `metadataUri` — service discovery without hardcoded URLs.
|
|
19
|
+
- You need pure call builders for name registration, resolver updates, primary-name updates, or owner rotation that compose into custody-policy ceremonies.
|
|
24
20
|
|
|
25
|
-
## Do
|
|
21
|
+
## Do not use this for
|
|
26
22
|
|
|
27
|
-
- Passkey ceremonies or auth flows
|
|
28
|
-
- Smart-account deployment or UserOps
|
|
29
|
-
- Account safety policy and approval scheduling
|
|
30
|
-
- Permission-token minting or attenuation
|
|
31
|
-
- MCP/A2A transport wiring
|
|
23
|
+
- Passkey ceremonies or auth flows — `@agenticprimitives/connect-auth`.
|
|
24
|
+
- Smart-account deployment or UserOps — `@agenticprimitives/agent-account`.
|
|
25
|
+
- Account safety policy and approval scheduling — `@agenticprimitives/account-custody`.
|
|
26
|
+
- Permission-token minting or attenuation — `@agenticprimitives/delegation`.
|
|
27
|
+
- MCP/A2A transport wiring — demo apps or runtime packages.
|
|
32
28
|
|
|
33
29
|
## Install
|
|
34
30
|
|
|
35
|
-
|
|
31
|
+
Workspace-internal; not yet published.
|
|
36
32
|
|
|
37
33
|
```bash
|
|
38
34
|
pnpm add @agenticprimitives/agent-naming
|
|
39
35
|
```
|
|
40
36
|
|
|
41
|
-
## 60-
|
|
37
|
+
## 60-second quickstart
|
|
42
38
|
|
|
43
39
|
```ts
|
|
44
40
|
import {
|
|
@@ -64,22 +60,28 @@ const primaryName = await naming.reverseResolve('0x00000000000000000000000000000
|
|
|
64
60
|
const records = await naming.getRecords('treasury.acme.agent');
|
|
65
61
|
```
|
|
66
62
|
|
|
67
|
-
##
|
|
63
|
+
## How it's different
|
|
64
|
+
|
|
65
|
+
The reference points are **ENS and Unstoppable Domains** — both excellent at what they do, both built around a different center of gravity:
|
|
66
|
+
|
|
67
|
+
- **Name-as-asset vs. name-as-facet.** ENS and Unstoppable treat the name as the prized object; identity accretes around it. Here the Smart Agent address is canonical and forced-unique names are assigned at identity bootstrap ([spec 220 §5](../../specs/220-agent-identity-bootstrap.md)) — the name is a pointer, replaceable without identity loss, and `addr` + `nativeId` must reference the same Smart Agent.
|
|
68
|
+
- **Agent-native records.** Typed predicates for `a2aEndpoint`, `mcpEndpoint`, CAIP-10 `nativeId`, and a public-safe passkey credential digest — the records an agent economy actually resolves, not a TXT free-for-all. Unknown predicates are ignored on decode and rejected by typed encoders.
|
|
69
|
+
- **Custody-governed rotation.** Name-owner rotation ships as pure encoded call builders (`/custody` subpath) that compose into the owner Smart Agent's custody-policy ceremonies — quorums and trustees, not a private key that can be phished once.
|
|
70
|
+
- **Disciplined reads.** Product reads use `readContract` only — no `eth_getLogs` walks, no silent fallbacks ([ADR-0012](../../docs/architecture/decisions/0012-no-eth-getlogs-in-product-read-paths.md), [ADR-0013](../../docs/architecture/decisions/0013-no-silent-fallbacks.md)). Reverse resolution is a single on-chain `reverseResolveString` read, then a forward round-trip before it is trusted.
|
|
68
71
|
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
The `.agent` TLD is the naming protocol; which names a given deployment registers is app-layer configuration — this package stays generic.
|
|
73
|
+
|
|
74
|
+
## Main concepts
|
|
75
|
+
|
|
76
|
+
- **Canonical SA**: the ERC-4337 address every name must reference (`addr`, `nativeId`). Owned by `agent-account`, not this package.
|
|
71
77
|
- **AgentName**: a normalized dotted name under `.agent` (a facet label).
|
|
72
|
-
- **Label**: one segment
|
|
73
|
-
- **
|
|
74
|
-
- **
|
|
75
|
-
- **Resolver**: stores typed records for a node.
|
|
76
|
-
- **Primary name**: reverse record for a Smart Agent address.
|
|
77
|
-
- **Records**: typed data such as endpoints, display name, CAIP-10 `nativeId`,
|
|
78
|
-
and public-safe passkey credential digest.
|
|
78
|
+
- **Label / Node**: one segment (`treasury`); the recursive `namehash(name)`.
|
|
79
|
+
- **Registry / Resolver**: name records (owner, resolver, parent, subregistry); typed records for a node.
|
|
80
|
+
- **Primary name**: the reverse record for a Smart Agent address.
|
|
79
81
|
|
|
80
82
|
See [`docs/concepts.md`](docs/concepts.md).
|
|
81
83
|
|
|
82
|
-
## Common
|
|
84
|
+
## Common recipes
|
|
83
85
|
|
|
84
86
|
```ts
|
|
85
87
|
import {
|
|
@@ -102,40 +104,37 @@ const decoded = decodeRecords({
|
|
|
102
104
|
});
|
|
103
105
|
```
|
|
104
106
|
|
|
105
|
-
More examples:
|
|
107
|
+
More examples: [`examples/basic.ts`](examples/basic.ts) · [`examples/records.ts`](examples/records.ts) · [`examples/custody-rotation.ts`](examples/custody-rotation.ts)
|
|
108
|
+
|
|
109
|
+
## Released A2A card records (spec 347 §8.3)
|
|
106
110
|
|
|
107
|
-
|
|
108
|
-
-
|
|
109
|
-
|
|
111
|
+
`atl:cardDigest` (bytes32 = sha256 of the released A2A Agent Card's RFC 8785 bytes) and `atl:cardUri` (only when the
|
|
112
|
+
card is not at the a2a host's `/.well-known/agent-card.json`) are ordinary name-node records: `encodeRecords({ cardDigest,
|
|
113
|
+
cardUri })`, read back by `resolve()`. A verifier fetches the card and compares digests; the record proves nothing by
|
|
114
|
+
itself. Existing deployments register the terms with `contracts/script/AddCardPredicates.s.sol`.
|
|
110
115
|
|
|
111
|
-
## Runtime
|
|
116
|
+
## Runtime support
|
|
112
117
|
|
|
113
|
-
Pure helpers and record encoders work in browser, Node, and Workers. The client
|
|
114
|
-
uses `viem` public and wallet clients and requires an RPC URL for chain reads or
|
|
115
|
-
transaction submission.
|
|
118
|
+
Pure helpers and record encoders work in browser, Node, and Workers. The client uses `viem` public and wallet clients and requires an RPC URL for chain reads or transaction submission.
|
|
116
119
|
|
|
117
|
-
## Subpath
|
|
120
|
+
## Subpath exports
|
|
118
121
|
|
|
119
122
|
- `@agenticprimitives/agent-naming` — public helpers, client, ABIs, and types.
|
|
120
|
-
- `@agenticprimitives/agent-naming/records` — predicate ids and typed
|
|
121
|
-
|
|
122
|
-
- `@agenticprimitives/agent-naming/custody` — pure encoded call builders for
|
|
123
|
-
name-management transactions.
|
|
123
|
+
- `@agenticprimitives/agent-naming/records` — predicate ids and typed record encode/decode helpers.
|
|
124
|
+
- `@agenticprimitives/agent-naming/custody` — pure encoded call builders for name-management transactions.
|
|
124
125
|
|
|
125
|
-
## Security
|
|
126
|
+
## Security invariants
|
|
126
127
|
|
|
127
|
-
-
|
|
128
|
-
([ADR-0012](../../docs/architecture/decisions/0012-no-eth-getlogs-in-product-read-paths.md)).
|
|
129
|
-
`reverseResolve` string reconstruction is transitional log debt — do not copy.
|
|
130
|
-
- Name normalization is deterministic.
|
|
128
|
+
- Name normalization is deterministic — equal normalizations produce equal namehashes.
|
|
131
129
|
- Reverse resolution must round-trip before it is trusted.
|
|
132
130
|
- Unknown predicates are ignored on decode and rejected by typed encoders.
|
|
133
|
-
- Raw passkey credential IDs are never stored.
|
|
131
|
+
- Raw passkey credential IDs are never stored — only a digest.
|
|
134
132
|
- Endpoint records are discovery hints, not proof of endpoint control.
|
|
133
|
+
- Product reads use `readContract`; no `eth_getLogs` in hot paths ([ADR-0012](../../docs/architecture/decisions/0012-no-eth-getlogs-in-product-read-paths.md)).
|
|
135
134
|
|
|
136
135
|
See [`docs/security.md`](docs/security.md) and [`AUDIT.md`](AUDIT.md).
|
|
137
136
|
|
|
138
|
-
## Documentation
|
|
137
|
+
## Documentation map
|
|
139
138
|
|
|
140
139
|
- [`docs/concepts.md`](docs/concepts.md) — naming model and vocabulary.
|
|
141
140
|
- [`docs/api.md`](docs/api.md) — human-readable public API guide.
|
|
@@ -153,6 +152,10 @@ pnpm check:public-exports
|
|
|
153
152
|
pnpm check:forbidden-terms
|
|
154
153
|
```
|
|
155
154
|
|
|
155
|
+
## Status
|
|
156
|
+
|
|
157
|
+
Testnet/pilot-ready. Production launch is gated on the public checklist in the root [`README.md`](../../README.md#status--honest-version) — including third-party contract audit and governance key rotation. Track every security finding live in [`docs/audits/findings.yaml`](../../docs/audits/findings.yaml).
|
|
158
|
+
|
|
156
159
|
## License
|
|
157
160
|
|
|
158
161
|
UNLICENSED.
|