kompass-sdk 0.5.0 → 0.7.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/sources/erc8004.d.ts +3 -2
- package/dist/sources/erc8004.d.ts.map +1 -1
- package/dist/sources/erc8004.js +68 -114
- package/dist/sources/erc8004.js.map +1 -1
- package/dist/sources/l402-directory.d.ts +3 -2
- package/dist/sources/l402-directory.d.ts.map +1 -1
- package/dist/sources/l402-directory.js +57 -32
- package/dist/sources/l402-directory.js.map +1 -1
- package/dist/sources/skills.d.ts +5 -2
- package/dist/sources/skills.d.ts.map +1 -1
- package/dist/sources/skills.js +82 -105
- package/dist/sources/skills.js.map +1 -1
- package/package.json +1 -1
- package/src/sources/erc8004.ts +60 -121
- package/src/sources/l402-directory.ts +56 -36
- package/src/sources/skills.ts +82 -111
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ERC-8004
|
|
3
|
-
*
|
|
2
|
+
* ERC-8004 Source Adapter
|
|
3
|
+
* Searches 8004scan.io API for registered AI agents
|
|
4
|
+
* Real data — agent identity, reputation, supported protocols
|
|
4
5
|
*/
|
|
5
6
|
import type { SourceAdapter } from "./types.js";
|
|
6
7
|
export declare function createErc8004Adapter(network?: "base" | "base-sepolia"): SourceAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc8004.d.ts","sourceRoot":"","sources":["../../src/sources/erc8004.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"erc8004.d.ts","sourceRoot":"","sources":["../../src/sources/erc8004.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAqC,MAAM,YAAY,CAAC;AAInF,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,MAAM,GAAG,cAAuB,GAAG,aAAa,CAkD7F"}
|
package/dist/sources/erc8004.js
CHANGED
|
@@ -1,90 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ERC-8004
|
|
3
|
-
*
|
|
2
|
+
* ERC-8004 Source Adapter
|
|
3
|
+
* Searches 8004scan.io API for registered AI agents
|
|
4
|
+
* Real data — agent identity, reputation, supported protocols
|
|
4
5
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
// ERC-8004 Identity Registry addresses
|
|
8
|
-
const REGISTRY_ADDRESSES = {
|
|
9
|
-
"base": "0x8004A818BFB912233c491871b3d84c89A494BD9e",
|
|
10
|
-
"base-sepolia": "0x8004A818BFB912233c491871b3d84c89A494BD9e",
|
|
11
|
-
};
|
|
12
|
-
const TRANSFER_EVENT = parseAbiItem("event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)");
|
|
13
|
-
const TOKEN_URI_ABI = [
|
|
14
|
-
{
|
|
15
|
-
type: "function",
|
|
16
|
-
name: "tokenURI",
|
|
17
|
-
inputs: [{ name: "tokenId", type: "uint256" }],
|
|
18
|
-
outputs: [{ name: "", type: "string" }],
|
|
19
|
-
stateMutability: "view",
|
|
20
|
-
},
|
|
21
|
-
];
|
|
22
|
-
export function createErc8004Adapter(network = "base-sepolia") {
|
|
23
|
-
const chain = network === "base" ? base : baseSepolia;
|
|
24
|
-
const registryAddress = REGISTRY_ADDRESSES[network];
|
|
25
|
-
const client = createPublicClient({
|
|
26
|
-
chain,
|
|
27
|
-
transport: http(),
|
|
28
|
-
});
|
|
6
|
+
const SCAN_API = "https://www.8004scan.io/api/v1";
|
|
7
|
+
export function createErc8004Adapter(network = "base") {
|
|
29
8
|
return {
|
|
30
9
|
name: "erc8004",
|
|
31
|
-
displayName: "ERC-8004 Identity Registry",
|
|
10
|
+
displayName: "ERC-8004 Identity Registry (8004scan)",
|
|
32
11
|
async search(query, options) {
|
|
33
12
|
const limit = options?.limit ?? 20;
|
|
13
|
+
const timeout = options?.timeout ?? 10000;
|
|
34
14
|
try {
|
|
35
|
-
//
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
15
|
+
// Search across all chains on 8004scan
|
|
16
|
+
const url = new URL(`${SCAN_API}/agents`);
|
|
17
|
+
if (query)
|
|
18
|
+
url.searchParams.set("search", query);
|
|
19
|
+
url.searchParams.set("limit", String(limit));
|
|
20
|
+
const res = await fetch(url.toString(), {
|
|
21
|
+
signal: AbortSignal.timeout(timeout),
|
|
42
22
|
});
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
});
|
|
59
|
-
// Resolve URI to JSON
|
|
60
|
-
let metadata = {};
|
|
61
|
-
if (uri.startsWith("http") || uri.startsWith("ipfs")) {
|
|
62
|
-
const fetchUrl = uri.startsWith("ipfs://")
|
|
63
|
-
? `https://ipfs.io/ipfs/${uri.slice(7)}`
|
|
64
|
-
: uri;
|
|
65
|
-
const res = await fetch(fetchUrl, { signal: AbortSignal.timeout(3000) });
|
|
66
|
-
if (res.ok)
|
|
67
|
-
metadata = await res.json();
|
|
68
|
-
}
|
|
69
|
-
else if (uri.startsWith("data:")) {
|
|
70
|
-
const json = uri.split(",")[1];
|
|
71
|
-
metadata = JSON.parse(atob(json));
|
|
72
|
-
}
|
|
73
|
-
const agent = mapErc8004Agent(tokenId, owner, metadata, network);
|
|
74
|
-
// Filter by query
|
|
75
|
-
if (query) {
|
|
76
|
-
const searchText = `${agent.name} ${agent.description} ${agent.categories.join(" ")}`.toLowerCase();
|
|
77
|
-
if (!searchText.includes(query.toLowerCase()))
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
agents.push(agent);
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
// Skip agents with unresolvable metadata
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return agents;
|
|
23
|
+
if (!res.ok)
|
|
24
|
+
return [];
|
|
25
|
+
const data = await res.json();
|
|
26
|
+
const agents = data.items ?? data.agents ?? data.data ?? [];
|
|
27
|
+
if (!Array.isArray(agents))
|
|
28
|
+
return [];
|
|
29
|
+
return agents
|
|
30
|
+
.filter((a) => {
|
|
31
|
+
if (!query)
|
|
32
|
+
return true;
|
|
33
|
+
const text = `${a.name ?? ""} ${a.description ?? ""}`.toLowerCase();
|
|
34
|
+
return query.toLowerCase().split(/\s+/).some((t) => text.includes(t));
|
|
35
|
+
})
|
|
36
|
+
.slice(0, limit)
|
|
37
|
+
.map(mapErc8004Agent);
|
|
88
38
|
}
|
|
89
39
|
catch {
|
|
90
40
|
return [];
|
|
@@ -92,8 +42,10 @@ export function createErc8004Adapter(network = "base-sepolia") {
|
|
|
92
42
|
},
|
|
93
43
|
async ping() {
|
|
94
44
|
try {
|
|
95
|
-
await
|
|
96
|
-
|
|
45
|
+
const res = await fetch(`${SCAN_API}/agents?limit=1`, {
|
|
46
|
+
signal: AbortSignal.timeout(5000),
|
|
47
|
+
});
|
|
48
|
+
return res.ok;
|
|
97
49
|
}
|
|
98
50
|
catch {
|
|
99
51
|
return false;
|
|
@@ -101,50 +53,52 @@ export function createErc8004Adapter(network = "base-sepolia") {
|
|
|
101
53
|
},
|
|
102
54
|
};
|
|
103
55
|
}
|
|
104
|
-
function mapErc8004Agent(
|
|
105
|
-
const
|
|
56
|
+
function mapErc8004Agent(agent) {
|
|
57
|
+
const protocols = agent.supported_protocols ?? [];
|
|
58
|
+
const protocol = protocols.includes("A2A") ? "a2a"
|
|
59
|
+
: protocols.includes("MCP") ? "mcp"
|
|
60
|
+
: protocols.includes("x402") || agent.x402_supported ? "x402"
|
|
61
|
+
: "onchain";
|
|
106
62
|
const endpoints = {};
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
endpoints.x402 = svc.endpoint;
|
|
114
|
-
if (svc.protocol === "http")
|
|
115
|
-
endpoints.http = svc.endpoint;
|
|
116
|
-
}
|
|
63
|
+
if (protocols.includes("MCP"))
|
|
64
|
+
endpoints.mcp = agent.mcp_endpoint;
|
|
65
|
+
if (protocols.includes("A2A"))
|
|
66
|
+
endpoints.a2a = agent.a2a_endpoint;
|
|
67
|
+
if (agent.x402_supported)
|
|
68
|
+
endpoints.x402 = agent.x402_endpoint;
|
|
117
69
|
return {
|
|
118
|
-
id: `erc8004:${
|
|
119
|
-
nativeId:
|
|
120
|
-
name:
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
70
|
+
id: `erc8004:${agent.agent_id ?? agent.token_id}`,
|
|
71
|
+
nativeId: agent.token_id?.toString() ?? agent.agent_id ?? "",
|
|
72
|
+
name: agent.name ?? `Agent #${agent.token_id}`,
|
|
73
|
+
ensName: agent.owner_ens ?? undefined,
|
|
74
|
+
description: agent.description ?? "",
|
|
75
|
+
categories: extractCategories(agent.name ?? "", agent.description ?? ""),
|
|
76
|
+
capabilities: protocols.map((p) => `Supports ${p}`),
|
|
124
77
|
source: "erc8004",
|
|
125
|
-
protocol
|
|
78
|
+
protocol,
|
|
126
79
|
endpoints,
|
|
127
80
|
reputation: {
|
|
128
|
-
score: 0,
|
|
129
|
-
count: 0,
|
|
130
|
-
source: "
|
|
81
|
+
score: agent.total_score ?? 0,
|
|
82
|
+
count: agent.star_count ?? 0,
|
|
83
|
+
source: "8004scan",
|
|
131
84
|
},
|
|
132
|
-
verified:
|
|
133
|
-
|
|
134
|
-
raw: { tokenId: tokenId.toString(), owner, metadata, network },
|
|
85
|
+
verified: agent.is_verified ?? false,
|
|
86
|
+
raw: agent,
|
|
135
87
|
};
|
|
136
88
|
}
|
|
137
|
-
function
|
|
138
|
-
const
|
|
89
|
+
function extractCategories(name, description) {
|
|
90
|
+
const text = `${name} ${description}`.toLowerCase();
|
|
139
91
|
const cats = [];
|
|
140
|
-
if (
|
|
92
|
+
if (text.match(/defi|yield|swap|pool|trading/))
|
|
141
93
|
cats.push("defi");
|
|
142
|
-
if (
|
|
94
|
+
if (text.match(/data|analyt|research/))
|
|
143
95
|
cats.push("data");
|
|
144
|
-
if (
|
|
145
|
-
cats.push("
|
|
146
|
-
if (
|
|
147
|
-
cats.push("
|
|
96
|
+
if (text.match(/code|develop|build/))
|
|
97
|
+
cats.push("development");
|
|
98
|
+
if (text.match(/ai|model|inference/))
|
|
99
|
+
cats.push("ai");
|
|
100
|
+
if (text.match(/security|audit/))
|
|
101
|
+
cats.push("security");
|
|
148
102
|
return cats.length > 0 ? cats : ["general"];
|
|
149
103
|
}
|
|
150
104
|
//# sourceMappingURL=erc8004.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc8004.js","sourceRoot":"","sources":["../../src/sources/erc8004.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"erc8004.js","sourceRoot":"","sources":["../../src/sources/erc8004.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* L402 Directory Source Adapter
|
|
3
|
-
*
|
|
2
|
+
* L402 Lightning Directory Source Adapter
|
|
3
|
+
* Searches 402index.io filtered to L402 (Lightning) protocol
|
|
4
|
+
* Real data — not hardcoded seed list
|
|
4
5
|
*/
|
|
5
6
|
import type { SourceAdapter } from "./types.js";
|
|
6
7
|
export declare const l402DirectoryAdapter: SourceAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l402-directory.d.ts","sourceRoot":"","sources":["../../src/sources/l402-directory.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"l402-directory.d.ts","sourceRoot":"","sources":["../../src/sources/l402-directory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAqC,MAAM,YAAY,CAAC;AAInF,eAAO,MAAM,oBAAoB,EAAE,aA4DlC,CAAC"}
|
|
@@ -1,42 +1,67 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* L402 Directory Source Adapter
|
|
3
|
-
*
|
|
2
|
+
* L402 Lightning Directory Source Adapter
|
|
3
|
+
* Searches 402index.io filtered to L402 (Lightning) protocol
|
|
4
|
+
* Real data — not hardcoded seed list
|
|
4
5
|
*/
|
|
5
|
-
|
|
6
|
-
const KNOWN_L402_SERVICES = [
|
|
7
|
-
{ name: "Satring", url: "https://satring.com", description: "Curated L402 + x402 API directory. 36 endpoints across 4 providers", categories: ["directory", "tools"] },
|
|
8
|
-
{ name: "Lightning Faucet L402", url: "https://lightningfaucet.com", description: "L402 API registry and testing tools", categories: ["tools", "testing"] },
|
|
9
|
-
{ name: "Nostr NIP-68 Bridge", url: "https://l402.nostr.com", description: "L402 payments over Nostr relay network", categories: ["social", "payments"] },
|
|
10
|
-
{ name: "Stacker News", url: "https://stacker.news", description: "Lightning-powered news with L402 API access", categories: ["content", "data"] },
|
|
11
|
-
{ name: "Nodana", url: "https://nodana.io", description: "L402 agentic access for Bitcoin app deployment", categories: ["development", "compute"] },
|
|
12
|
-
];
|
|
6
|
+
const INDEX_API = "https://402index.io/api/v1/services";
|
|
13
7
|
export const l402DirectoryAdapter = {
|
|
14
8
|
name: "l402-directory",
|
|
15
|
-
displayName: "L402 Lightning Directory",
|
|
9
|
+
displayName: "L402 Lightning Directory (402index)",
|
|
16
10
|
async search(query, options) {
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
11
|
+
const limit = options?.limit ?? 20;
|
|
12
|
+
const timeout = options?.timeout ?? 10000;
|
|
13
|
+
try {
|
|
14
|
+
const url = new URL(INDEX_API);
|
|
15
|
+
if (query)
|
|
16
|
+
url.searchParams.set("q", query);
|
|
17
|
+
url.searchParams.set("protocol", "L402");
|
|
18
|
+
url.searchParams.set("limit", String(limit));
|
|
19
|
+
url.searchParams.set("health", "healthy");
|
|
20
|
+
url.searchParams.set("sort", "reliability");
|
|
21
|
+
const res = await fetch(url.toString(), { signal: AbortSignal.timeout(timeout) });
|
|
22
|
+
if (!res.ok)
|
|
23
|
+
return [];
|
|
24
|
+
const data = await res.json();
|
|
25
|
+
const services = data.services ?? data.data ?? [];
|
|
26
|
+
if (!Array.isArray(services))
|
|
27
|
+
return [];
|
|
28
|
+
return services.slice(0, limit).map((s) => ({
|
|
29
|
+
id: `l402-directory:${s.id ?? s.url}`,
|
|
30
|
+
nativeId: s.id ?? s.name,
|
|
31
|
+
name: (s.name ?? "L402 Service").replace(/^\s+/g, "").split("\n")[0].trim().slice(0, 100),
|
|
32
|
+
description: (s.description ?? "").replace(/^\s+|\s+$/g, "").replace(/\s+/g, " ").slice(0, 300),
|
|
33
|
+
categories: s.category ? s.category.split("/").map((c) => c.trim()) : ["general"],
|
|
34
|
+
capabilities: [s.description ?? s.name ?? ""],
|
|
35
|
+
source: "l402-directory",
|
|
36
|
+
protocol: "l402",
|
|
37
|
+
endpoints: { l402: s.url, http: s.url },
|
|
38
|
+
pricing: {
|
|
39
|
+
model: "per-call",
|
|
40
|
+
amount: s.price_sats ? `${s.price_sats} sats` : s.price_usd ? String(s.price_usd) : undefined,
|
|
41
|
+
currency: "sats",
|
|
42
|
+
},
|
|
43
|
+
reputation: s.reliability_score ? {
|
|
44
|
+
score: s.reliability_score,
|
|
45
|
+
count: s.uptime_30d ? Math.round(s.uptime_30d * 100) : 0,
|
|
46
|
+
source: "402index",
|
|
47
|
+
} : undefined,
|
|
48
|
+
verified: s.health_status === "healthy",
|
|
49
|
+
lastSeen: s.last_checked ? new Date(s.last_checked).getTime() : undefined,
|
|
50
|
+
raw: s,
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
37
56
|
},
|
|
38
57
|
async ping() {
|
|
39
|
-
|
|
58
|
+
try {
|
|
59
|
+
const res = await fetch(`${INDEX_API}?protocol=L402&limit=1`, { signal: AbortSignal.timeout(5000) });
|
|
60
|
+
return res.ok;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
40
65
|
},
|
|
41
66
|
};
|
|
42
67
|
//# sourceMappingURL=l402-directory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l402-directory.js","sourceRoot":"","sources":["../../src/sources/l402-directory.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"l402-directory.js","sourceRoot":"","sources":["../../src/sources/l402-directory.ts"],"names":[],"mappings":"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"}
|
package/dist/sources/skills.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Skills Source Adapter
|
|
3
|
-
* Searches
|
|
4
|
-
*
|
|
3
|
+
* Searches REAL APIs:
|
|
4
|
+
* - skills.sh (Vercel) — /api/search?q=
|
|
5
|
+
* - ClawHub (OpenClaw) — /api/search?q= (vector search)
|
|
6
|
+
*
|
|
7
|
+
* No hardcoded seed lists. All real data.
|
|
5
8
|
*/
|
|
6
9
|
import type { SourceAdapter } from "./types.js";
|
|
7
10
|
export declare const skillsAdapter: SourceAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/sources/skills.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/sources/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAqC,MAAM,YAAY,CAAC;AAKnF,eAAO,MAAM,aAAa,EAAE,aA6B3B,CAAC"}
|