@agnt-id/resolve 0.1.0
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/dist/client.d.ts +53 -0
- package/dist/client.js +133 -0
- package/dist/client.test.d.ts +1 -0
- package/dist/client.test.js +88 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/types.d.ts +152 -0
- package/dist/types.js +1 -0
- package/package.json +24 -0
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { AgntClientOptions, DiscoverOptions, DiscoverResult, DomainResult, OwnerOptions, OwnerResult, ResolveResult, ReverseResult, TrustResult } from "./types.js";
|
|
2
|
+
export declare class AgntClient {
|
|
3
|
+
private gateway;
|
|
4
|
+
private chainId;
|
|
5
|
+
private _fetch;
|
|
6
|
+
constructor(options?: AgntClientOptions);
|
|
7
|
+
/**
|
|
8
|
+
* Resolve a .agnt name to its records.
|
|
9
|
+
*
|
|
10
|
+
* @param name - Full name (e.g. "alice.agnt") or label (e.g. "alice")
|
|
11
|
+
* @returns Resolved name data, or null if not found
|
|
12
|
+
*/
|
|
13
|
+
resolve(name: string): Promise<ResolveResult | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Reverse lookup: address to .agnt name.
|
|
16
|
+
*
|
|
17
|
+
* @param address - EVM address (0x...)
|
|
18
|
+
* @param options - Optional chain_id (CAIP-2) and verify flag
|
|
19
|
+
* @returns The primary name for that address, or null
|
|
20
|
+
*/
|
|
21
|
+
reverse(address: string, options?: {
|
|
22
|
+
chainId?: string;
|
|
23
|
+
verify?: boolean;
|
|
24
|
+
}): Promise<ReverseResult | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Discover agents matching search criteria.
|
|
27
|
+
*/
|
|
28
|
+
discover(options?: DiscoverOptions): Promise<DiscoverResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Get all names owned by an address.
|
|
31
|
+
*/
|
|
32
|
+
owner(address: string, options?: OwnerOptions): Promise<OwnerResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Get trust score and signals for a name.
|
|
35
|
+
*/
|
|
36
|
+
trust(name: string, options?: {
|
|
37
|
+
chainId?: string;
|
|
38
|
+
}): Promise<TrustResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Get domain verifications for a name.
|
|
41
|
+
*/
|
|
42
|
+
domains(name: string, options?: {
|
|
43
|
+
chainId?: string;
|
|
44
|
+
}): Promise<DomainResult>;
|
|
45
|
+
/**
|
|
46
|
+
* Check if a name is available for registration.
|
|
47
|
+
*/
|
|
48
|
+
available(name: string): Promise<boolean>;
|
|
49
|
+
}
|
|
50
|
+
export declare class AgntError extends Error {
|
|
51
|
+
status: number;
|
|
52
|
+
constructor(status: number, body: string);
|
|
53
|
+
}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
const DEFAULT_GATEWAY = "https://api.agnt.id";
|
|
2
|
+
const DEFAULT_CHAIN = "eip155:1";
|
|
3
|
+
export class AgntClient {
|
|
4
|
+
gateway;
|
|
5
|
+
chainId;
|
|
6
|
+
_fetch;
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
this.gateway = (options.gateway ?? DEFAULT_GATEWAY).replace(/\/$/, "");
|
|
9
|
+
this.chainId = options.chainId ?? DEFAULT_CHAIN;
|
|
10
|
+
this._fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Resolve a .agnt name to its records.
|
|
14
|
+
*
|
|
15
|
+
* @param name - Full name (e.g. "alice.agnt") or label (e.g. "alice")
|
|
16
|
+
* @returns Resolved name data, or null if not found
|
|
17
|
+
*/
|
|
18
|
+
async resolve(name) {
|
|
19
|
+
const full = ensureSuffix(name);
|
|
20
|
+
const res = await this._fetch(`${this.gateway}/v1/agnt/gateway/resolve/${encodeURIComponent(full)}`);
|
|
21
|
+
if (res.status === 404)
|
|
22
|
+
return null;
|
|
23
|
+
if (!res.ok)
|
|
24
|
+
throw new AgntError(res.status, await safeText(res));
|
|
25
|
+
return res.json();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Reverse lookup: address to .agnt name.
|
|
29
|
+
*
|
|
30
|
+
* @param address - EVM address (0x...)
|
|
31
|
+
* @param options - Optional chain_id (CAIP-2) and verify flag
|
|
32
|
+
* @returns The primary name for that address, or null
|
|
33
|
+
*/
|
|
34
|
+
async reverse(address, options) {
|
|
35
|
+
const chain = options?.chainId ?? this.chainId;
|
|
36
|
+
const url = new URL(`${this.gateway}/v1/agnt/gateway/reverse/${chain}/${address}`);
|
|
37
|
+
if (options?.verify)
|
|
38
|
+
url.searchParams.set("verify", "true");
|
|
39
|
+
const res = await this._fetch(url.toString());
|
|
40
|
+
if (res.status === 404)
|
|
41
|
+
return null;
|
|
42
|
+
if (!res.ok)
|
|
43
|
+
throw new AgntError(res.status, await safeText(res));
|
|
44
|
+
return res.json();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Discover agents matching search criteria.
|
|
48
|
+
*/
|
|
49
|
+
async discover(options = {}) {
|
|
50
|
+
const url = new URL(`${this.gateway}/v1/agnt/gateway/discover`);
|
|
51
|
+
url.searchParams.set("chain_id", options.chain_id ?? this.chainId);
|
|
52
|
+
if (options.q)
|
|
53
|
+
url.searchParams.set("q", options.q);
|
|
54
|
+
if (options.skill)
|
|
55
|
+
url.searchParams.set("skill", options.skill);
|
|
56
|
+
if (options.domain)
|
|
57
|
+
url.searchParams.set("domain", options.domain);
|
|
58
|
+
if (options.limit)
|
|
59
|
+
url.searchParams.set("limit", String(options.limit));
|
|
60
|
+
const res = await this._fetch(url.toString());
|
|
61
|
+
if (!res.ok)
|
|
62
|
+
throw new AgntError(res.status, await safeText(res));
|
|
63
|
+
return res.json();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get all names owned by an address.
|
|
67
|
+
*/
|
|
68
|
+
async owner(address, options = {}) {
|
|
69
|
+
const url = new URL(`${this.gateway}/v1/agnt/gateway/owner/${address}`);
|
|
70
|
+
url.searchParams.set("chain_id", options.chain_id ?? this.chainId);
|
|
71
|
+
if (options.limit)
|
|
72
|
+
url.searchParams.set("limit", String(options.limit));
|
|
73
|
+
const res = await this._fetch(url.toString());
|
|
74
|
+
if (!res.ok)
|
|
75
|
+
throw new AgntError(res.status, await safeText(res));
|
|
76
|
+
return res.json();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get trust score and signals for a name.
|
|
80
|
+
*/
|
|
81
|
+
async trust(name, options) {
|
|
82
|
+
const full = ensureSuffix(name);
|
|
83
|
+
const url = new URL(`${this.gateway}/v1/agnt/gateway/trust/${encodeURIComponent(full)}`);
|
|
84
|
+
url.searchParams.set("chain_id", options?.chainId ?? this.chainId);
|
|
85
|
+
const res = await this._fetch(url.toString());
|
|
86
|
+
if (!res.ok)
|
|
87
|
+
throw new AgntError(res.status, await safeText(res));
|
|
88
|
+
return res.json();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get domain verifications for a name.
|
|
92
|
+
*/
|
|
93
|
+
async domains(name, options) {
|
|
94
|
+
const full = ensureSuffix(name);
|
|
95
|
+
const url = new URL(`${this.gateway}/v1/agnt/gateway/domain/${encodeURIComponent(full)}`);
|
|
96
|
+
url.searchParams.set("chain_id", options?.chainId ?? this.chainId);
|
|
97
|
+
const res = await this._fetch(url.toString());
|
|
98
|
+
if (!res.ok)
|
|
99
|
+
throw new AgntError(res.status, await safeText(res));
|
|
100
|
+
return res.json();
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if a name is available for registration.
|
|
104
|
+
*/
|
|
105
|
+
async available(name) {
|
|
106
|
+
const full = ensureSuffix(name);
|
|
107
|
+
const res = await this._fetch(`${this.gateway}/v1/agnt/available/${encodeURIComponent(full)}`);
|
|
108
|
+
if (!res.ok)
|
|
109
|
+
throw new AgntError(res.status, await safeText(res));
|
|
110
|
+
const data = await res.json();
|
|
111
|
+
return data.available;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export class AgntError extends Error {
|
|
115
|
+
status;
|
|
116
|
+
constructor(status, body) {
|
|
117
|
+
super(`agnt gateway ${status}: ${body}`);
|
|
118
|
+
this.name = "AgntError";
|
|
119
|
+
this.status = status;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function ensureSuffix(name) {
|
|
123
|
+
const n = name.trim().toLowerCase();
|
|
124
|
+
return n.endsWith(".agnt") ? n : `${n}.agnt`;
|
|
125
|
+
}
|
|
126
|
+
async function safeText(res) {
|
|
127
|
+
try {
|
|
128
|
+
return await res.text();
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return "";
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
|
+
import { AgntClient, AgntError } from "./client.js";
|
|
3
|
+
describe("AgntClient", () => {
|
|
4
|
+
it("resolve returns null for 404", async () => {
|
|
5
|
+
const client = new AgntClient({
|
|
6
|
+
fetch: async () => new Response(null, { status: 404 }),
|
|
7
|
+
});
|
|
8
|
+
const result = await client.resolve("nonexistent");
|
|
9
|
+
expect(result).toBeNull();
|
|
10
|
+
});
|
|
11
|
+
it("resolve throws AgntError on 500", async () => {
|
|
12
|
+
const client = new AgntClient({
|
|
13
|
+
fetch: async () => new Response("internal error", { status: 500 }),
|
|
14
|
+
});
|
|
15
|
+
try {
|
|
16
|
+
await client.resolve("test");
|
|
17
|
+
expect(true).toBe(false);
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
expect(err).toBeInstanceOf(AgntError);
|
|
21
|
+
expect(err.status).toBe(500);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
it("resolve parses gateway response", async () => {
|
|
25
|
+
const payload = {
|
|
26
|
+
name: "alice.agnt",
|
|
27
|
+
owner: "0x1234",
|
|
28
|
+
resolver: null,
|
|
29
|
+
expires_at: "2027-01-01T00:00:00Z",
|
|
30
|
+
records: { a2a: "https://alice.example.com/a2a" },
|
|
31
|
+
source: "onchain",
|
|
32
|
+
};
|
|
33
|
+
const client = new AgntClient({
|
|
34
|
+
fetch: async () => new Response(JSON.stringify(payload), { status: 200 }),
|
|
35
|
+
});
|
|
36
|
+
const result = await client.resolve("alice");
|
|
37
|
+
expect(result).toEqual(payload);
|
|
38
|
+
});
|
|
39
|
+
it("resolve appends .agnt suffix if missing", async () => {
|
|
40
|
+
let calledUrl = "";
|
|
41
|
+
const client = new AgntClient({
|
|
42
|
+
fetch: async (url) => {
|
|
43
|
+
calledUrl = url;
|
|
44
|
+
return new Response(null, { status: 404 });
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
await client.resolve("alice");
|
|
48
|
+
expect(calledUrl).toContain("alice.agnt");
|
|
49
|
+
});
|
|
50
|
+
it("available returns boolean", async () => {
|
|
51
|
+
const client = new AgntClient({
|
|
52
|
+
fetch: async () => new Response(JSON.stringify({ available: true }), { status: 200 }),
|
|
53
|
+
});
|
|
54
|
+
const result = await client.available("newname");
|
|
55
|
+
expect(result).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
it("reverse returns null for 404", async () => {
|
|
58
|
+
const client = new AgntClient({
|
|
59
|
+
fetch: async () => new Response(null, { status: 404 }),
|
|
60
|
+
});
|
|
61
|
+
const result = await client.reverse("0x1234");
|
|
62
|
+
expect(result).toBeNull();
|
|
63
|
+
});
|
|
64
|
+
it("uses custom gateway URL", async () => {
|
|
65
|
+
let calledUrl = "";
|
|
66
|
+
const client = new AgntClient({
|
|
67
|
+
gateway: "https://custom.gateway.io",
|
|
68
|
+
fetch: async (url) => {
|
|
69
|
+
calledUrl = url;
|
|
70
|
+
return new Response(null, { status: 404 });
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
await client.resolve("test");
|
|
74
|
+
expect(calledUrl).toContain("custom.gateway.io");
|
|
75
|
+
});
|
|
76
|
+
it("uses custom chain ID for reverse", async () => {
|
|
77
|
+
let calledUrl = "";
|
|
78
|
+
const client = new AgntClient({
|
|
79
|
+
chainId: "eip155:8453",
|
|
80
|
+
fetch: async (url) => {
|
|
81
|
+
calledUrl = url;
|
|
82
|
+
return new Response(null, { status: 404 });
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
await client.reverse("0x1234");
|
|
86
|
+
expect(calledUrl).toContain("eip155:8453");
|
|
87
|
+
});
|
|
88
|
+
});
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { AgntClient, AgntError } from "./client.js";
|
|
2
|
+
export type { AgntClientOptions, AgntName, AgntRecord, DiscoverEntry, DiscoverOptions, DiscoverResult, DomainEntry, DomainResult, OwnerEntry, OwnerOptions, OwnerResult, ResolveResult, ReverseResult, TrustResult, TrustScore, TrustSignal, } from "./types.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AgntClient, AgntError } from "./client.js";
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/** Record data attached to a .agnt name */
|
|
2
|
+
export type AgntRecord = {
|
|
3
|
+
/** Multi-chain wallets keyed by CAIP-2 chain ID */
|
|
4
|
+
wallets?: Record<string, string>;
|
|
5
|
+
/** Default CAIP-2 chain for wallet resolution */
|
|
6
|
+
defaultWallet?: string;
|
|
7
|
+
/** Agent ID string */
|
|
8
|
+
agentId?: string;
|
|
9
|
+
/** Agent-to-Agent protocol endpoint URL */
|
|
10
|
+
a2a?: string;
|
|
11
|
+
/** Model Context Protocol endpoint URL */
|
|
12
|
+
mcp?: string;
|
|
13
|
+
/** Arbitrary key-value text records (avatar, description, etc.) */
|
|
14
|
+
texts?: Record<string, string>;
|
|
15
|
+
/** CAIP-10 identity with agent ID */
|
|
16
|
+
identity?: string;
|
|
17
|
+
/** Legacy single wallet (CAIP-10) */
|
|
18
|
+
wallet?: string;
|
|
19
|
+
/** Linked ENS name */
|
|
20
|
+
ens?: string;
|
|
21
|
+
/** Linked DID */
|
|
22
|
+
did?: string;
|
|
23
|
+
/** Trust model tags */
|
|
24
|
+
trustModels?: ("reputation" | "crypto-economic" | "tee-attestation" | "social-graph")[];
|
|
25
|
+
/** Whether the agent supports x402 payments */
|
|
26
|
+
x402Support?: boolean;
|
|
27
|
+
/** CAIP-10 address of reputation registry */
|
|
28
|
+
reputationRegistry?: string;
|
|
29
|
+
/** OASF skill slugs */
|
|
30
|
+
skills?: string[];
|
|
31
|
+
/** OASF domain slugs */
|
|
32
|
+
domains?: string[];
|
|
33
|
+
/** A2A protocol version */
|
|
34
|
+
a2aVersion?: string;
|
|
35
|
+
/** MCP protocol version (YYYY-MM-DD) */
|
|
36
|
+
mcpVersion?: string;
|
|
37
|
+
/** Profile metadata URI (ipfs: or ar:) */
|
|
38
|
+
profileURI?: string;
|
|
39
|
+
};
|
|
40
|
+
/** A resolved .agnt name */
|
|
41
|
+
export type AgntName = {
|
|
42
|
+
name: string;
|
|
43
|
+
owner: string;
|
|
44
|
+
resolver: string | null;
|
|
45
|
+
expires_at: string | null;
|
|
46
|
+
records: AgntRecord;
|
|
47
|
+
};
|
|
48
|
+
/** Trust score breakdown */
|
|
49
|
+
export type TrustScore = {
|
|
50
|
+
score: number;
|
|
51
|
+
baseScore: number;
|
|
52
|
+
confidence: number;
|
|
53
|
+
sampleCount: number;
|
|
54
|
+
explorationBoost: number;
|
|
55
|
+
stalePenalty: number;
|
|
56
|
+
breakdown: Record<string, number>;
|
|
57
|
+
};
|
|
58
|
+
/** Gateway resolve response */
|
|
59
|
+
export type ResolveResult = AgntName & {
|
|
60
|
+
source: "onchain" | "cache" | "registry";
|
|
61
|
+
};
|
|
62
|
+
/** Gateway reverse lookup response */
|
|
63
|
+
export type ReverseResult = {
|
|
64
|
+
name: string;
|
|
65
|
+
verified?: boolean;
|
|
66
|
+
source: "onchain" | "cache" | "registry";
|
|
67
|
+
};
|
|
68
|
+
/** A single discover/search result */
|
|
69
|
+
export type DiscoverEntry = AgntName & {
|
|
70
|
+
ranking_score: number;
|
|
71
|
+
trust: TrustScore;
|
|
72
|
+
domain_verified: boolean;
|
|
73
|
+
};
|
|
74
|
+
/** Gateway discover response */
|
|
75
|
+
export type DiscoverResult = {
|
|
76
|
+
chain_id: string;
|
|
77
|
+
results: DiscoverEntry[];
|
|
78
|
+
};
|
|
79
|
+
/** Gateway owner inventory entry */
|
|
80
|
+
export type OwnerEntry = {
|
|
81
|
+
name: string;
|
|
82
|
+
owner: string;
|
|
83
|
+
resolver: string | null;
|
|
84
|
+
expires_at: string | null;
|
|
85
|
+
token_id: string;
|
|
86
|
+
node: string;
|
|
87
|
+
};
|
|
88
|
+
/** Gateway owner inventory response */
|
|
89
|
+
export type OwnerResult = {
|
|
90
|
+
results: OwnerEntry[];
|
|
91
|
+
source: "onchain";
|
|
92
|
+
};
|
|
93
|
+
/** Trust signal from the gateway */
|
|
94
|
+
export type TrustSignal = {
|
|
95
|
+
metric: string;
|
|
96
|
+
value: number;
|
|
97
|
+
value_decimals: number;
|
|
98
|
+
confidence: number;
|
|
99
|
+
source: string;
|
|
100
|
+
window_start: string | null;
|
|
101
|
+
window_end: string | null;
|
|
102
|
+
evidence_uri: string | null;
|
|
103
|
+
evidence_hash: string | null;
|
|
104
|
+
created_at: string;
|
|
105
|
+
};
|
|
106
|
+
/** Gateway trust response */
|
|
107
|
+
export type TrustResult = {
|
|
108
|
+
chain_id: string;
|
|
109
|
+
name: string;
|
|
110
|
+
score: TrustScore;
|
|
111
|
+
signals: TrustSignal[];
|
|
112
|
+
};
|
|
113
|
+
/** Domain verification entry */
|
|
114
|
+
export type DomainEntry = {
|
|
115
|
+
domain: string;
|
|
116
|
+
status: string;
|
|
117
|
+
method: string;
|
|
118
|
+
proof_uri: string | null;
|
|
119
|
+
proof_hash: string | null;
|
|
120
|
+
verified_by: string | null;
|
|
121
|
+
verified_at: string | null;
|
|
122
|
+
expires_at: string | null;
|
|
123
|
+
updated_at: string;
|
|
124
|
+
};
|
|
125
|
+
/** Gateway domain response */
|
|
126
|
+
export type DomainResult = {
|
|
127
|
+
chain_id: string;
|
|
128
|
+
name: string;
|
|
129
|
+
domains: DomainEntry[];
|
|
130
|
+
};
|
|
131
|
+
/** Options for creating a client */
|
|
132
|
+
export type AgntClientOptions = {
|
|
133
|
+
/** Gateway base URL (default: https://api.agnt.id) */
|
|
134
|
+
gateway?: string;
|
|
135
|
+
/** Default CAIP-2 chain ID (default: eip155:1) */
|
|
136
|
+
chainId?: string;
|
|
137
|
+
/** Custom fetch implementation (default: globalThis.fetch) */
|
|
138
|
+
fetch?: typeof globalThis.fetch;
|
|
139
|
+
};
|
|
140
|
+
/** Options for discover/search */
|
|
141
|
+
export type DiscoverOptions = {
|
|
142
|
+
q?: string;
|
|
143
|
+
skill?: string;
|
|
144
|
+
domain?: string;
|
|
145
|
+
chain_id?: string;
|
|
146
|
+
limit?: number;
|
|
147
|
+
};
|
|
148
|
+
/** Options for owner inventory */
|
|
149
|
+
export type OwnerOptions = {
|
|
150
|
+
chain_id?: string;
|
|
151
|
+
limit?: number;
|
|
152
|
+
};
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agnt-id/resolve",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Resolve .agnt names to wallets, agent endpoints, and identity records",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": ["dist", "README.md"],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"prepublishOnly": "tsc"
|
|
18
|
+
},
|
|
19
|
+
"keywords": ["agnt", "agent", "naming", "web3", "ethereum", "resolve", "a2a", "mcp"],
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"typescript": "^5.9.3"
|
|
23
|
+
}
|
|
24
|
+
}
|