@agenticprimitives/agent-naming 1.0.0-alpha.22 → 1.0.0-alpha.23

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.
Files changed (66) hide show
  1. package/CLAUDE.md +34 -50
  2. package/README.md +7 -0
  3. package/dist/abis.d.ts +99 -0
  4. package/dist/abis.d.ts.map +1 -1
  5. package/dist/abis.js +40 -0
  6. package/dist/abis.js.map +1 -1
  7. package/dist/claim.d.ts +71 -0
  8. package/dist/claim.d.ts.map +1 -0
  9. package/dist/claim.js +73 -0
  10. package/dist/claim.js.map +1 -0
  11. package/dist/client.d.ts +24 -1
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/client.js +133 -3
  14. package/dist/client.js.map +1 -1
  15. package/dist/constants.d.ts +55 -5
  16. package/dist/constants.d.ts.map +1 -1
  17. package/dist/constants.js +128 -4
  18. package/dist/constants.js.map +1 -1
  19. package/dist/custody.d.ts +42 -0
  20. package/dist/custody.d.ts.map +1 -1
  21. package/dist/custody.js +98 -1
  22. package/dist/custody.js.map +1 -1
  23. package/dist/dns.d.ts +91 -0
  24. package/dist/dns.d.ts.map +1 -0
  25. package/dist/dns.js +196 -0
  26. package/dist/dns.js.map +1 -0
  27. package/dist/grammar.d.ts +62 -0
  28. package/dist/grammar.d.ts.map +1 -0
  29. package/dist/grammar.js +165 -0
  30. package/dist/grammar.js.map +1 -0
  31. package/dist/hash.d.ts +14 -0
  32. package/dist/hash.d.ts.map +1 -0
  33. package/dist/hash.js +22 -0
  34. package/dist/hash.js.map +1 -0
  35. package/dist/index.d.ts +10 -5
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +11 -4
  38. package/dist/index.js.map +1 -1
  39. package/dist/issuance.d.ts +70 -0
  40. package/dist/issuance.d.ts.map +1 -0
  41. package/dist/issuance.js +65 -0
  42. package/dist/issuance.js.map +1 -0
  43. package/dist/label.d.ts +10 -0
  44. package/dist/label.d.ts.map +1 -0
  45. package/dist/label.js +39 -0
  46. package/dist/label.js.map +1 -0
  47. package/dist/namehash.d.ts +10 -23
  48. package/dist/namehash.d.ts.map +1 -1
  49. package/dist/namehash.js +11 -35
  50. package/dist/namehash.js.map +1 -1
  51. package/dist/normalize.d.ts +9 -26
  52. package/dist/normalize.d.ts.map +1 -1
  53. package/dist/normalize.js +11 -67
  54. package/dist/normalize.js.map +1 -1
  55. package/dist/records.d.ts +12 -0
  56. package/dist/records.d.ts.map +1 -1
  57. package/dist/records.js +62 -2
  58. package/dist/records.js.map +1 -1
  59. package/dist/types.d.ts +60 -1
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/vertical.d.ts +43 -0
  62. package/dist/vertical.d.ts.map +1 -0
  63. package/dist/vertical.js +40 -0
  64. package/dist/vertical.js.map +1 -0
  65. package/docs/api.md +13 -1
  66. package/package.json +6 -6
@@ -0,0 +1,165 @@
1
+ import { AGENT_TLD_ALIASES, RESERVED_LABELS, canonicalTld, derivedTypeForTld, subtypeForTld, isLegacyTld, } from './constants.js';
2
+ import { InvalidNameError } from './errors.js';
3
+ import { nodeOfLabels } from './hash.js';
4
+ import { normalizeLabel } from './label.js';
5
+ const CONTEXT_TYPES = new Set(['org', 'team', 'workspace', 'church', 'circle', 'household']);
6
+ /** `PermissionlessSubregistry.MIN_LABEL_LENGTH` — root-level claims only. */
7
+ export const MIN_ROOT_LABEL_LENGTH = 3;
8
+ function prep(input) {
9
+ if (typeof input !== 'string')
10
+ throw new InvalidNameError(String(input), 'must be a string');
11
+ const s = input.normalize('NFC').trim().toLowerCase();
12
+ if (s.length === 0)
13
+ throw new InvalidNameError(input, 'empty');
14
+ return s;
15
+ }
16
+ /** Normalize the labels of one dotted part (alias rewrite applied to every label). */
17
+ function labelsOf(full, part) {
18
+ const raw = part.split('.');
19
+ return raw.map((l) => {
20
+ if (l.length === 0) {
21
+ throw new InvalidNameError(full, 'empty label (consecutive dots or leading/trailing dot)');
22
+ }
23
+ const n = normalizeLabel(l);
24
+ return AGENT_TLD_ALIASES[n] ?? n;
25
+ });
26
+ }
27
+ function assertTypedLabel(full, label, where) {
28
+ if (RESERVED_LABELS.includes(label) || canonicalTld(label) !== null) {
29
+ throw new InvalidNameError(full, `reserved_label: "${label}" cannot be a ${where} label`);
30
+ }
31
+ }
32
+ function handleOf(full, labels, where) {
33
+ if (labels.length !== 2) {
34
+ throw new InvalidNameError(full, `${where}_shape: expected "<label>.<tld>" (got "${labels.join('.')}")`);
35
+ }
36
+ const tld = canonicalTld(labels[1]);
37
+ if (!tld)
38
+ throw new InvalidNameError(full, `unknown_tld: "${labels[1]}" is not a typed suffix`);
39
+ assertTypedLabel(full, labels[0], where);
40
+ return { label: labels[0], tld };
41
+ }
42
+ function contextOf(full, labels) {
43
+ const h = handleOf(full, labels, 'context');
44
+ const derivedType = derivedTypeForTld(h.tld);
45
+ if (!CONTEXT_TYPES.has(derivedType)) {
46
+ throw new InvalidNameError(full, `context_type: a context must be an organization-class agent (org, team, church, circle) or a workspace (got ".${h.tld}")`);
47
+ }
48
+ return { ...h, derivedType };
49
+ }
50
+ function finish(p) {
51
+ return { ...p, node: nodeOfLabels(p.labels) };
52
+ }
53
+ /**
54
+ * Parse any accepted form into its canonical structure. Throws `InvalidNameError` with a
55
+ * `reason` prefixed by a stable code (`context_depth`, `reserved_label`, `unknown_tld`, `context_type`,
56
+ * `handle_shape`, `context_shape`, `structure`, `label_too_short`).
57
+ */
58
+ export function parseAgentName(input) {
59
+ const s = prep(input);
60
+ if (s.includes('@') || s.includes('/')) {
61
+ const sep = s.includes('@') ? '@' : '/';
62
+ const parts = s.split(sep);
63
+ if (parts.length !== 2 || s.includes(sep === '@' ? '/' : '@')) {
64
+ throw new InvalidNameError(input, 'context_depth: v1 accepts exactly one context (x.t@c.u or c.u/x.t)');
65
+ }
66
+ const [handlePart, contextPart] = sep === '@' ? [parts[0], parts[1]] : [parts[1], parts[0]];
67
+ const handle = handleOf(input, labelsOf(input, handlePart), 'handle');
68
+ const context = contextOf(input, labelsOf(input, contextPart));
69
+ const labels = [handle.label, handle.tld, context.label, context.tld];
70
+ const st = subtypeForTld(handle.tld);
71
+ return finish({
72
+ kind: 'scoped',
73
+ normalized: `${handle.label}.${handle.tld}@${context.label}.${context.tld}`,
74
+ onChainName: labels.join('.'),
75
+ labels,
76
+ tld: context.tld,
77
+ legacy: false,
78
+ handle,
79
+ derivedType: derivedTypeForTld(handle.tld),
80
+ ...(st ? { subtype: st } : {}),
81
+ context,
82
+ });
83
+ }
84
+ const labels = labelsOf(input, s);
85
+ const last = labels[labels.length - 1];
86
+ // Bare root node: `me`, `agent`, …
87
+ if (labels.length === 1) {
88
+ const tld = canonicalTld(last) ?? (isLegacyTld(last) ? last : null);
89
+ if (!tld)
90
+ throw new InvalidNameError(input, `unknown_tld: "${last}" is not a root`);
91
+ const l = [tld];
92
+ return finish({ kind: 'root', normalized: tld, onChainName: tld, labels: l, tld, legacy: isLegacyTld(tld), derivedType: null });
93
+ }
94
+ // Legacy: untyped, opaque, never validated beyond label rules.
95
+ if (isLegacyTld(last)) {
96
+ const dotted = labels.join('.');
97
+ return finish({ kind: 'legacy', normalized: dotted, onChainName: dotted, labels, tld: last, legacy: true, derivedType: null });
98
+ }
99
+ if (labels.length === 2) {
100
+ const handle = handleOf(input, labels, 'handle');
101
+ if (handle.label.length < MIN_ROOT_LABEL_LENGTH) {
102
+ throw new InvalidNameError(input, `label_too_short: root-level labels need ≥ ${MIN_ROOT_LABEL_LENGTH} chars`);
103
+ }
104
+ const l = [handle.label, handle.tld];
105
+ const st = subtypeForTld(handle.tld);
106
+ return finish({
107
+ kind: 'canonical',
108
+ normalized: l.join('.'),
109
+ onChainName: l.join('.'),
110
+ labels: l,
111
+ tld: handle.tld,
112
+ legacy: false,
113
+ handle,
114
+ derivedType: derivedTypeForTld(handle.tld),
115
+ ...(st ? { subtype: st } : {}),
116
+ });
117
+ }
118
+ if (labels.length === 3) {
119
+ const t = canonicalTld(labels[0]);
120
+ if (!t)
121
+ throw new InvalidNameError(input, `structure: "${labels[0]}" is not a type label (expected <tld>.<context>)`);
122
+ const context = contextOf(input, labels.slice(1));
123
+ const l = [t, context.label, context.tld];
124
+ return finish({ kind: 'type-node', normalized: l.join('.'), onChainName: l.join('.'), labels: l, tld: context.tld, legacy: false, derivedType: null, context });
125
+ }
126
+ if (labels.length === 4) {
127
+ const handle = handleOf(input, labels.slice(0, 2), 'handle');
128
+ const context = contextOf(input, labels.slice(2));
129
+ const l = [handle.label, handle.tld, context.label, context.tld];
130
+ const st2 = subtypeForTld(handle.tld);
131
+ return finish({
132
+ kind: 'scoped',
133
+ normalized: `${handle.label}.${handle.tld}@${context.label}.${context.tld}`,
134
+ onChainName: l.join('.'),
135
+ labels: l,
136
+ tld: context.tld,
137
+ legacy: false,
138
+ handle,
139
+ derivedType: derivedTypeForTld(handle.tld),
140
+ ...(st2 ? { subtype: st2 } : {}),
141
+ context,
142
+ });
143
+ }
144
+ throw new InvalidNameError(input, 'structure: typed names are <label>.<tld> or <label>.<tld>@<label>.<tld>');
145
+ }
146
+ /** Render a parsed name. `at` (default) is the canonical display form; `path` is URL-safe; `dotted` is on-chain. */
147
+ export function formatAgentName(p, form = 'at') {
148
+ if (p.kind !== 'scoped')
149
+ return form === 'dotted' ? p.onChainName : p.normalized;
150
+ const h = `${p.handle.label}.${p.handle.tld}`;
151
+ const c = `${p.context.label}.${p.context.tld}`;
152
+ switch (form) {
153
+ case 'at':
154
+ return `${h}@${c}`;
155
+ case 'path':
156
+ return `${c}/${h}`;
157
+ case 'dotted':
158
+ return p.onChainName;
159
+ }
160
+ }
161
+ /** The dotted on-chain form of any accepted input (what `namehash` hashes). */
162
+ export function onChainNameOf(input) {
163
+ return parseAgentName(input).onChainName;
164
+ }
165
+ //# sourceMappingURL=grammar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar.js","sourceRoot":"","sources":["../src/grammar.ts"],"names":[],"mappings":"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"}
package/dist/hash.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { type Hex } from 'viem';
2
+ /** The all-zeros 32-byte sentinel namehash (the root of the tree). */
3
+ export declare const ZERO_NODE: Hex;
4
+ /**
5
+ * Compute the labelhash of a single label: `keccak256(utf8Bytes(label))`. No normalization is applied
6
+ * — pass a label produced by splitting a normalized name.
7
+ */
8
+ export declare function labelhash(label: string): Hex;
9
+ /**
10
+ * Fold already-normalized labels (leftmost = leaf) into the recursive namehash
11
+ * `keccak256(parentNode || labelhash(label))`, walking from the rightmost (root-side) label inward.
12
+ */
13
+ export declare function nodeOfLabels(labels: readonly string[]): Hex;
14
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAElE,sEAAsE;AACtE,eAAO,MAAM,SAAS,EAAE,GAA0E,CAAC;AAEnG;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAE5C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAM3D"}
package/dist/hash.js ADDED
@@ -0,0 +1,22 @@
1
+ import { keccak256, encodePacked, toBytes } from 'viem';
2
+ /** The all-zeros 32-byte sentinel namehash (the root of the tree). */
3
+ export const ZERO_NODE = '0x0000000000000000000000000000000000000000000000000000000000000000';
4
+ /**
5
+ * Compute the labelhash of a single label: `keccak256(utf8Bytes(label))`. No normalization is applied
6
+ * — pass a label produced by splitting a normalized name.
7
+ */
8
+ export function labelhash(label) {
9
+ return keccak256(toBytes(label));
10
+ }
11
+ /**
12
+ * Fold already-normalized labels (leftmost = leaf) into the recursive namehash
13
+ * `keccak256(parentNode || labelhash(label))`, walking from the rightmost (root-side) label inward.
14
+ */
15
+ export function nodeOfLabels(labels) {
16
+ let node = ZERO_NODE;
17
+ for (let i = labels.length - 1; i >= 0; i--) {
18
+ node = keccak256(encodePacked(['bytes32', 'bytes32'], [node, labelhash(labels[i])]));
19
+ }
20
+ return node;
21
+ }
22
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAY,MAAM,MAAM,CAAC;AAElE,sEAAsE;AACtE,MAAM,CAAC,MAAM,SAAS,GAAQ,oEAAoE,CAAC;AAEnG;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAyB;IACpD,IAAI,IAAI,GAAQ,SAAS,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,15 @@
1
- export { AGENT_TLD, type AgentTld } from './constants.js';
1
+ export { AGENT_TLDS, AGENT_TLD_ALIASES, LEGACY_TLDS, RESERVED_LABELS, ROOT_KIND_AGENT, isAgentTld, isLegacyTld, canonicalTld, derivedTypeForTld, tldForDerivedType, rootClassForDerivedType, rootClassForTld, rootKindForTld, isKnownAgentTld, subtypeForTld, allAgentTlds, type AgentTld, type AnyAgentTld, type LegacyTld, } from './constants.js';
2
+ export { registerVerticalAgentTypes, clearVerticalAgentTypes, verticalAgentTypeForTld, verticalAgentTypeForSubtype, verticalAgentTlds, verticalRootKindForTld, type VerticalAgentTypeDefinition, type VerticalAgentType, } from './vertical.js';
2
3
  export { normalizeAgentName, normalizeLabel, isValidAgentName } from './normalize.js';
4
+ export { parseAgentName, formatAgentName, onChainNameOf, MIN_ROOT_LABEL_LENGTH, type ParsedAgentName, type ParsedAgentNameKind, type AgentNameForm, } from './grammar.js';
5
+ export { A2A_JSONRPC_PATH, A2A_AGENT_CARD_PATH, dnsHostForHandle, parseSubdomainLabel, typedNameForLabel, parseTypedAgentHost, hostForName, agentNameForHandle, agentCardUrlForHost, a2aEndpointForHost, edgeA2aPathForHandle, type DnsHostOptions, } from './dns.js';
6
+ export { findUniqueLabel, childNodeOf, validateTypedClaim, ROLE_TYPED, type UniqueLabelReads, type TypedClaimViolation, type TypedClaimSubject, } from './claim.js';
7
+ export { CONTEXT_VAULT_RESOURCES, validateContextualIssuance, issuanceBody, isAnchoredOnChain, isIssuanceActiveAt, type ContextualNameIssuanceV1, type ContextualNameIssuanceBody, type ContextualIssuanceBasis, type ContextualIssuanceKind, type ContextualIssuanceStatus, type ContextualNameListing, type IssuanceShapeViolation, } from './issuance.js';
3
8
  export { labelhash, namehash, ZERO_NODE } from './namehash.js';
4
9
  export { InvalidNameError, NameNotFoundError, UnauthorizedNameOwnerError, } from './errors.js';
5
- export type { AgentKind, ConnectionKind, AgentNameRecords, RegisterSubnameInput, SetPrimaryNameInput, SetAgentRecordsInput, SetSubregistryInput, AgentNamingClientOpts, } from './types.js';
10
+ export type { AgentKind, ConnectionKind, AgentNameRecords, RegisterSubnameInput, SetPrimaryNameInput, SetAgentRecordsInput, SetSubregistryInput, AgentNamingClientOpts, DerivedTypeRecord, TypedNameRecord, TypedNameCheck, } from './types.js';
6
11
  export { AgentNamingClient, type WriteContext } from './client.js';
7
- export { buildRegisterSubnameCall, buildRotateNameOwnerCall, buildRotateNameResolverCall, buildSetSubregistryCall, buildSetPrimaryNameCall, buildSetStringAttributeCall, buildSetAddressAttributeCall, buildSetBytes32AttributeCall, buildRecordCalls, buildSubregistryRegisterCall, type ContractCall, } from './custody.js';
8
- export { agentNameRegistryAbi, agentNameAttributeResolverAbi, agentNameUniversalResolverAbi, ontologyTermRegistryAbi, shapeRegistryAbi, permissionlessSubregistryAbi, } from './abis.js';
9
- export { PREDICATE_ID, AGENT_KIND_ID, CONNECTION_KIND_ID, CLASS_AGENT_NAME, AGENT_KIND_ENUM, CONNECTION_KIND_ENUM, CAIP10_NAMESPACE_ALLOWLIST, encodeRecords, decodeRecords, type PredicateName, type EncodedRecord, type DecodeInput, } from './records.js';
12
+ export { buildRegisterSubnameCall, buildRotateNameOwnerCall, buildRotateNameResolverCall, buildSetSubregistryCall, buildSetPrimaryNameCall, buildSetStringAttributeCall, buildSetAddressAttributeCall, buildSetBytes32AttributeCall, buildRecordCalls, buildSubregistryRegisterCall, buildDeclareAgentTypeCalls, buildTypedClaimCalls, type ContractCall, } from './custody.js';
13
+ export { agentNameRegistryAbi, agentNameAttributeResolverAbi, agentNameUniversalResolverAbi, ontologyTermRegistryAbi, shapeRegistryAbi, permissionlessSubregistryAbi, agentProfileResolverTypeAbi, } from './abis.js';
14
+ export { PREDICATE_ID, AGENT_KIND_ID, CONNECTION_KIND_ID, CLASS_AGENT_NAME, AGENT_KIND_ENUM, CONNECTION_KIND_ENUM, AGENT_TYPE_ID, AGENT_TYPE_ENUM, encodeAgentType, decodeAgentType, decodeAgentKind, CAIP10_NAMESPACE_ALLOWLIST, encodeRecords, decodeRecords, type PredicateName, type EncodedRecord, type DecodeInput, } from './records.js';
10
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAInE,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,4BAA4B,EAC5B,4BAA4B,EAC5B,gBAAgB,EAChB,4BAA4B,EAC5B,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC;AAKtB,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,6BAA6B,EAC7B,uBAAuB,EACvB,gBAAgB,EAChB,4BAA4B,GAC7B,MAAM,WAAW,CAAC;AAInB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,aAAa,EACb,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4,19 +4,26 @@
4
4
  // - capability.manifest.json — boundary
5
5
  // - CLAUDE.md — doctrine
6
6
  // - specs/215-agent-naming.md — the contract
7
- export { AGENT_TLD } from './constants.js';
7
+ // Typed TLD registry (ADR-0061 / spec 346 §4).
8
+ export { AGENT_TLDS, AGENT_TLD_ALIASES, LEGACY_TLDS, RESERVED_LABELS, ROOT_KIND_AGENT, isAgentTld, isLegacyTld, canonicalTld, derivedTypeForTld, tldForDerivedType, rootClassForDerivedType, rootClassForTld, rootKindForTld, isKnownAgentTld, subtypeForTld, allAgentTlds, } from './constants.js';
9
+ // Vertical (app-registered) agent types — spec 346 §2.4 (ADR-0021: the vocabulary lives in apps).
10
+ export { registerVerticalAgentTypes, clearVerticalAgentTypes, verticalAgentTypeForTld, verticalAgentTypeForSubtype, verticalAgentTlds, verticalRootKindForTld, } from './vertical.js';
8
11
  export { normalizeAgentName, normalizeLabel, isValidAgentName } from './normalize.js';
12
+ export { parseAgentName, formatAgentName, onChainNameOf, MIN_ROOT_LABEL_LENGTH, } from './grammar.js';
13
+ export { A2A_JSONRPC_PATH, A2A_AGENT_CARD_PATH, dnsHostForHandle, parseSubdomainLabel, typedNameForLabel, parseTypedAgentHost, hostForName, agentNameForHandle, agentCardUrlForHost, a2aEndpointForHost, edgeA2aPathForHandle, } from './dns.js';
14
+ export { findUniqueLabel, childNodeOf, validateTypedClaim, ROLE_TYPED, } from './claim.js';
15
+ export { CONTEXT_VAULT_RESOURCES, validateContextualIssuance, issuanceBody, isAnchoredOnChain, isIssuanceActiveAt, } from './issuance.js';
9
16
  export { labelhash, namehash, ZERO_NODE } from './namehash.js';
10
17
  export { InvalidNameError, NameNotFoundError, UnauthorizedNameOwnerError, } from './errors.js';
11
18
  export { AgentNamingClient } from './client.js';
12
19
  // Phase 4 pure call builders (subpath `@agenticprimitives/agent-naming/custody`
13
20
  // re-exported from top-level for convenience).
14
- export { buildRegisterSubnameCall, buildRotateNameOwnerCall, buildRotateNameResolverCall, buildSetSubregistryCall, buildSetPrimaryNameCall, buildSetStringAttributeCall, buildSetAddressAttributeCall, buildSetBytes32AttributeCall, buildRecordCalls, buildSubregistryRegisterCall, } from './custody.js';
21
+ export { buildRegisterSubnameCall, buildRotateNameOwnerCall, buildRotateNameResolverCall, buildSetSubregistryCall, buildSetPrimaryNameCall, buildSetStringAttributeCall, buildSetAddressAttributeCall, buildSetBytes32AttributeCall, buildRecordCalls, buildSubregistryRegisterCall, buildDeclareAgentTypeCalls, buildTypedClaimCalls, } from './custody.js';
15
22
  // Phase 3 contract ABIs (live at deployed addresses recorded in
16
23
  // packages/contracts/deployments-<network>.json). ADR-0009 pivot: the
17
24
  // resolver inherits the shared `AttributeStorage` + ontology stack.
18
- export { agentNameRegistryAbi, agentNameAttributeResolverAbi, agentNameUniversalResolverAbi, ontologyTermRegistryAbi, shapeRegistryAbi, permissionlessSubregistryAbi, } from './abis.js';
25
+ export { agentNameRegistryAbi, agentNameAttributeResolverAbi, agentNameUniversalResolverAbi, ontologyTermRegistryAbi, shapeRegistryAbi, permissionlessSubregistryAbi, agentProfileResolverTypeAbi, } from './abis.js';
19
26
  // Ontology predicate ids (bytes32 mirror of AgentNamePredicates.sol) +
20
27
  // CAIP-10 helpers + typed encoder / decoder.
21
- export { PREDICATE_ID, AGENT_KIND_ID, CONNECTION_KIND_ID, CLASS_AGENT_NAME, AGENT_KIND_ENUM, CONNECTION_KIND_ENUM, CAIP10_NAMESPACE_ALLOWLIST, encodeRecords, decodeRecords, } from './records.js';
28
+ export { PREDICATE_ID, AGENT_KIND_ID, CONNECTION_KIND_ID, CLASS_AGENT_NAME, AGENT_KIND_ENUM, CONNECTION_KIND_ENUM, AGENT_TYPE_ID, AGENT_TYPE_ENUM, encodeAgentType, decodeAgentType, decodeAgentKind, CAIP10_NAMESPACE_ALLOWLIST, encodeRecords, decodeRecords, } from './records.js';
22
29
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,EAAE;AACF,OAAO;AACP,0CAA0C;AAC1C,2BAA2B;AAC3B,+CAA+C;AAE/C,OAAO,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAWrB,OAAO,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AAEnE,gFAAgF;AAChF,+CAA+C;AAC/C,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,4BAA4B,EAC5B,4BAA4B,EAC5B,gBAAgB,EAChB,4BAA4B,GAE7B,MAAM,cAAc,CAAC;AAEtB,gEAAgE;AAChE,sEAAsE;AACtE,oEAAoE;AACpE,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,6BAA6B,EAC7B,uBAAuB,EACvB,gBAAgB,EAChB,4BAA4B,GAC7B,MAAM,WAAW,CAAC;AAEnB,uEAAuE;AACvE,6CAA6C;AAC7C,OAAO,EACL,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,aAAa,EACb,aAAa,GAId,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,EAAE;AACF,OAAO;AACP,0CAA0C;AAC1C,2BAA2B;AAC3B,+CAA+C;AAE/C,+CAA+C;AAC/C,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,eAAe,EACf,UAAU,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,eAAe,EACf,aAAa,EACb,YAAY,GAIb,MAAM,gBAAgB,CAAC;AACxB,kGAAkG;AAClG,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,EACjB,sBAAsB,GAGvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,EACb,qBAAqB,GAItB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,GAErB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,UAAU,GAIX,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,GAQnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAcrB,OAAO,EAAE,iBAAiB,EAAqB,MAAM,aAAa,CAAC;AAEnE,gFAAgF;AAChF,+CAA+C;AAC/C,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,4BAA4B,EAC5B,4BAA4B,EAC5B,gBAAgB,EAChB,4BAA4B,EAC5B,0BAA0B,EAC1B,oBAAoB,GAErB,MAAM,cAAc,CAAC;AAEtB,gEAAgE;AAChE,sEAAsE;AACtE,oEAAoE;AACpE,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,6BAA6B,EAC7B,uBAAuB,EACvB,gBAAgB,EAChB,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,WAAW,CAAC;AAEnB,uEAAuE;AACvE,6CAA6C;AAC7C,OAAO,EACL,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,0BAA0B,EAC1B,aAAa,EACb,aAAa,GAId,MAAM,cAAc,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Context-issued names (spec 346 §3.2–§3.3). `x.t@c.u` always means "a name issued by `c.u` in its
3
+ * namespace for `x.t`'s subject". The issuance is a RECORD in the context's vault (ADR-0055); it is
4
+ * anchored on chain as a subname only when its listing posture is `public`. Two kinds share the shape:
5
+ *
6
+ * scoped — the context IS the subject's home namespace (vault.svc@richcanvas.org)
7
+ * reference — the subject's canonical name lives elsewhere (rpedersen.me@richcanvas.org); the
8
+ * issuance is a reference over a live membership + authority grant hash, never a second identity.
9
+ *
10
+ * Pure shapes + validation only. Situation ids and authority hashes are opaque here: this package never
11
+ * imports the organization or authority planes (ADR-0006).
12
+ */
13
+ import type { CanonicalAgentId, DerivedAgentType, Hex } from '@agenticprimitives/types';
14
+ export type ContextualNameListing = 'public' | 'consented-projection' | 'none';
15
+ export type ContextualIssuanceKind = 'scoped' | 'reference';
16
+ export type ContextualIssuanceStatus = 'active' | 'suspended' | 'revoked';
17
+ /** What makes the issuance CURRENT — a reference to authority, never a grant of it. */
18
+ export type ContextualIssuanceBasis = {
19
+ kind: 'membership';
20
+ membershipId: string;
21
+ roleAssignmentId?: string;
22
+ delegationHash: Hex;
23
+ } | {
24
+ kind: 'operated-by';
25
+ delegationHash: Hex;
26
+ } | {
27
+ kind: 'chartered';
28
+ affiliationId: string;
29
+ mandateDelegationHash: Hex;
30
+ };
31
+ export interface ContextualNameIssuanceBody {
32
+ type: 'ContextualNameIssuanceV1';
33
+ /** Canonical `@`-form, normalized. */
34
+ name: string;
35
+ context: CanonicalAgentId;
36
+ subject: CanonicalAgentId;
37
+ subjectType: DerivedAgentType;
38
+ kind: ContextualIssuanceKind;
39
+ basis: ContextualIssuanceBasis;
40
+ listing: ContextualNameListing;
41
+ issuedAt: string;
42
+ expiresAt?: string;
43
+ status: ContextualIssuanceStatus;
44
+ }
45
+ export interface ContextualNameIssuanceV1 extends ContextualNameIssuanceBody {
46
+ /** The CONTEXT signs. */
47
+ proof: {
48
+ signer: CanonicalAgentId;
49
+ scheme: 'erc1271' | 'session-key';
50
+ signature: Hex;
51
+ };
52
+ }
53
+ /** Vault resource keys (the context's vault). `naming:contextual-issuances` holds one record per name. */
54
+ export declare const CONTEXT_VAULT_RESOURCES: Readonly<{
55
+ readonly issuances: "naming:contextual-issuances";
56
+ readonly issuanceEvents: "naming:contextual-issuance-events";
57
+ }>;
58
+ export type IssuanceShapeViolation = {
59
+ field: string;
60
+ message: string;
61
+ };
62
+ /** Structural + grammar checks. Never checks liveness (that is the resolver's job with injected ports). */
63
+ export declare function validateContextualIssuance(i: ContextualNameIssuanceBody): IssuanceShapeViolation[];
64
+ /** Canonical JSON body (proof excluded) — what the context signs and what the registry log digests. */
65
+ export declare function issuanceBody(i: ContextualNameIssuanceBody | ContextualNameIssuanceV1): string;
66
+ /** An issuance is anchored on chain iff it is public (spec 346 §3.3). */
67
+ export declare function isAnchoredOnChain(i: ContextualNameIssuanceBody): boolean;
68
+ /** Pure status check against a clock. Liveness of the BASIS is the resolver's job. */
69
+ export declare function isIssuanceActiveAt(i: ContextualNameIssuanceBody, now: string): boolean;
70
+ //# sourceMappingURL=issuance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issuance.d.ts","sourceRoot":"","sources":["../src/issuance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAKxF,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,sBAAsB,GAAG,MAAM,CAAC;AAC/E,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,WAAW,CAAC;AAC5D,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;AAE1E,uFAAuF;AACvF,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,GAAG,CAAA;CAAE,GAC5F;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,cAAc,EAAE,GAAG,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,qBAAqB,EAAE,GAAG,CAAA;CAAE,CAAC;AAE7E,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,0BAA0B,CAAC;IACjC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,uBAAuB,CAAC;IAC/B,OAAO,EAAE,qBAAqB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,wBAAwB,CAAC;CAClC;AAED,MAAM,WAAW,wBAAyB,SAAQ,0BAA0B;IAC1E,yBAAyB;IACzB,KAAK,EAAE;QAAE,MAAM,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAAC;QAAC,SAAS,EAAE,GAAG,CAAA;KAAE,CAAC;CACxF;AAED,0GAA0G;AAC1G,eAAO,MAAM,uBAAuB;;;EAGzB,CAAC;AAOZ,MAAM,MAAM,sBAAsB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,2GAA2G;AAC3G,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,0BAA0B,GAAG,sBAAsB,EAAE,CAyBlG;AAED,uGAAuG;AACvG,wBAAgB,YAAY,CAAC,CAAC,EAAE,0BAA0B,GAAG,wBAAwB,GAAG,MAAM,CAG7F;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAExE;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,0BAA0B,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAKtF"}
@@ -0,0 +1,65 @@
1
+ import { canonicalizeJson } from '@agenticprimitives/types';
2
+ import { derivedTypeForTld } from './constants.js';
3
+ import { parseAgentName } from './grammar.js';
4
+ /** Vault resource keys (the context's vault). `naming:contextual-issuances` holds one record per name. */
5
+ export const CONTEXT_VAULT_RESOURCES = Object.freeze({
6
+ issuances: 'naming:contextual-issuances',
7
+ issuanceEvents: 'naming:contextual-issuance-events',
8
+ });
9
+ const BASIS_KIND_FOR = {
10
+ reference: new Set(['membership']),
11
+ scoped: new Set(['operated-by', 'chartered']),
12
+ };
13
+ /** Structural + grammar checks. Never checks liveness (that is the resolver's job with injected ports). */
14
+ export function validateContextualIssuance(i) {
15
+ const out = [];
16
+ let parsed;
17
+ try {
18
+ parsed = parseAgentName(i.name);
19
+ }
20
+ catch (e) {
21
+ return [{ field: 'name', message: e.message }];
22
+ }
23
+ if (parsed.kind !== 'scoped')
24
+ out.push({ field: 'name', message: 'an issuance names a scoped/contextual form (x.t@c.u)' });
25
+ else {
26
+ if (parsed.normalized !== i.name)
27
+ out.push({ field: 'name', message: `not normalized (expected "${parsed.normalized}")` });
28
+ if (derivedTypeForTld(parsed.handle.tld) !== i.subjectType) {
29
+ out.push({ field: 'subjectType', message: `suffix ".${parsed.handle.tld}" names ${derivedTypeForTld(parsed.handle.tld)}, record says ${i.subjectType}` });
30
+ }
31
+ }
32
+ if (i.kind === 'reference' && i.subject.toLowerCase() === i.context.toLowerCase()) {
33
+ out.push({ field: 'subject', message: 'a reference issuance must name a subject other than the context' });
34
+ }
35
+ if (!BASIS_KIND_FOR[i.kind]?.has(i.basis?.kind)) {
36
+ out.push({ field: 'basis', message: `basis "${i.basis?.kind}" is not valid for kind "${i.kind}"` });
37
+ }
38
+ if (i.expiresAt && i.expiresAt <= i.issuedAt)
39
+ out.push({ field: 'expiresAt', message: 'expiresAt must follow issuedAt' });
40
+ if (!['active', 'suspended', 'revoked'].includes(i.status))
41
+ out.push({ field: 'status', message: 'unknown status' });
42
+ if (!['public', 'consented-projection', 'none'].includes(i.listing))
43
+ out.push({ field: 'listing', message: 'unknown listing' });
44
+ return out;
45
+ }
46
+ /** Canonical JSON body (proof excluded) — what the context signs and what the registry log digests. */
47
+ export function issuanceBody(i) {
48
+ const { proof: _p, ...rest } = i;
49
+ return canonicalizeJson(rest);
50
+ }
51
+ /** An issuance is anchored on chain iff it is public (spec 346 §3.3). */
52
+ export function isAnchoredOnChain(i) {
53
+ return i.listing === 'public';
54
+ }
55
+ /** Pure status check against a clock. Liveness of the BASIS is the resolver's job. */
56
+ export function isIssuanceActiveAt(i, now) {
57
+ if (i.status !== 'active')
58
+ return false;
59
+ if (i.issuedAt > now)
60
+ return false;
61
+ if (i.expiresAt && i.expiresAt <= now)
62
+ return false;
63
+ return true;
64
+ }
65
+ //# sourceMappingURL=issuance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issuance.js","sourceRoot":"","sources":["../src/issuance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Normalize + validate a SINGLE label (no dots) to canonical form, throwing
3
+ * `InvalidNameError` on any rule violation. AN-1 (audit 2026-06-09): the registration WRITE
4
+ * path MUST run this so a homoglyph / mixed-case / zero-width label can never be anchored as a
5
+ * node whose raw stored label renders indistinguishably from a real name. Two inputs that
6
+ * normalize identically MUST hash identically — so the write path and the read/derive path
7
+ * (`normalizeAgentName` → `namehash`) agree.
8
+ */
9
+ export declare function normalizeLabel(label: string): string;
10
+ //# sourceMappingURL=label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../src/label.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUpD"}
package/dist/label.js ADDED
@@ -0,0 +1,39 @@
1
+ import { InvalidNameError } from './errors.js';
2
+ const LABEL_RE = /^[a-z0-9-]+$/;
3
+ /**
4
+ * Normalize + validate a SINGLE label (no dots) to canonical form, throwing
5
+ * `InvalidNameError` on any rule violation. AN-1 (audit 2026-06-09): the registration WRITE
6
+ * path MUST run this so a homoglyph / mixed-case / zero-width label can never be anchored as a
7
+ * node whose raw stored label renders indistinguishably from a real name. Two inputs that
8
+ * normalize identically MUST hash identically — so the write path and the read/derive path
9
+ * (`normalizeAgentName` → `namehash`) agree.
10
+ */
11
+ export function normalizeLabel(label) {
12
+ if (typeof label !== 'string') {
13
+ throw new InvalidNameError(String(label), 'must be a string');
14
+ }
15
+ const norm = label.normalize('NFC').trim().toLowerCase();
16
+ if (norm.includes('.')) {
17
+ throw new InvalidNameError(label, 'a label MUST NOT contain "." (register one label at a time)');
18
+ }
19
+ validateLabel(label, norm);
20
+ return norm;
21
+ }
22
+ function validateLabel(fullName, label) {
23
+ if (label.length === 0) {
24
+ throw new InvalidNameError(fullName, 'empty label (consecutive dots or leading/trailing dot)');
25
+ }
26
+ if (label.length > 63) {
27
+ throw new InvalidNameError(fullName, `label "${label}" exceeds 63 chars`);
28
+ }
29
+ if (label.startsWith('-')) {
30
+ throw new InvalidNameError(fullName, `label "${label}" starts with hyphen`);
31
+ }
32
+ if (label.endsWith('-')) {
33
+ throw new InvalidNameError(fullName, `label "${label}" ends with hyphen`);
34
+ }
35
+ if (!LABEL_RE.test(label)) {
36
+ throw new InvalidNameError(fullName, `label "${label}" contains characters outside [a-z 0-9 -]`);
37
+ }
38
+ }
39
+ //# sourceMappingURL=label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.js","sourceRoot":"","sources":["../src/label.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,QAAQ,GAAG,cAAc,CAAC;AAEhC;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,gBAAgB,CAAC,KAAK,EAAE,6DAA6D,CAAC,CAAC;IACnG,CAAC;IACD,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,KAAa;IACpD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,gBAAgB,CAAC,QAAQ,EAAE,wDAAwD,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,gBAAgB,CAAC,QAAQ,EAAE,UAAU,KAAK,oBAAoB,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,gBAAgB,CAAC,QAAQ,EAAE,UAAU,KAAK,sBAAsB,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,gBAAgB,CAAC,QAAQ,EAAE,UAAU,KAAK,oBAAoB,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,gBAAgB,CACxB,QAAQ,EACR,UAAU,KAAK,2CAA2C,CAC3D,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,32 +1,19 @@
1
- import { type Hex } from 'viem';
1
+ import type { Hex } from 'viem';
2
+ import { ZERO_NODE, labelhash } from './hash.js';
3
+ export { ZERO_NODE, labelhash };
2
4
  /**
3
5
  * Compute the recursive namehash of an agent name
4
6
  * (`keccak256(parentNode || labelhash)` convention).
5
7
  *
6
- * namehash('') = 0x00…00
7
- * namehash('agent') = keccak256(namehash('') || labelhash('agent'))
8
- * namehash('alice.acme.agent')
9
- * = keccak256(namehash('acme.agent') || labelhash('alice'))
8
+ * namehash('') = 0x00…00
9
+ * namehash('agent') = keccak256(namehash('') || labelhash('agent'))
10
+ * namehash('alice.acme.agent') = keccak256(namehash('acme.agent') || labelhash('alice'))
11
+ * namehash('vault.svc@richcanvas.org') = namehash('vault.svc.richcanvas.org') (spec 346 §3.3)
10
12
  *
11
- * The hash is computed against the NORMALIZED name (see
12
- * `normalizeAgentName`). Two strings that normalize identically
13
- * produce identical namehashes.
13
+ * The hash is computed over the NORMALIZED dotted on-chain form (`onChainNameOf`), so every accepted
14
+ * rendering of the same name (`@`, path, dotted, `.ws` alias) hashes identically.
14
15
  *
15
- * Throws `InvalidNameError` (via `normalizeAgentName`) on malformed
16
- * input. Passing `''` returns `0x00…00` — the canonical "empty / root"
17
- * sentinel matching the recursive-namehash convention.
16
+ * Throws `InvalidNameError` on malformed input. Passing `''` returns `0x00…00`.
18
17
  */
19
18
  export declare function namehash(name: string): Hex;
20
- /**
21
- * Compute the labelhash of a single label.
22
- *
23
- * `labelhash(label)` = keccak256(utf8Bytes(label))
24
- *
25
- * No normalization is applied here — the caller is expected to pass a
26
- * label produced by splitting a normalized name. Pass a non-normalized
27
- * label at your own risk.
28
- */
29
- export declare function labelhash(label: string): Hex;
30
- /** The all-zeros 32-byte sentinel namehash (the root of the tree). */
31
- export declare const ZERO_NODE: Hex;
32
19
  //# sourceMappingURL=namehash.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"namehash.d.ts","sourceRoot":"","sources":["../src/namehash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAGlE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAW1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAE5C;AAED,sEAAsE;AACtE,eAAO,MAAM,SAAS,EAAE,GAA0E,CAAC"}
1
+ {"version":3,"file":"namehash.d.ts","sourceRoot":"","sources":["../src/namehash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAEhC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAgB,MAAM,WAAW,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAEhC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAG1C"}