kompass-sdk 0.7.0 → 0.8.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.
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Kompass Ranking Engine
3
+ *
4
+ * Fair, cross-protocol ranking of agents/services using:
5
+ * 1. Source-specific reputation normalization
6
+ * 2. Bayesian average for cold-start protection
7
+ * 3. Value-for-money scoring (cost:quality ratio)
8
+ * 4. Geometric mean composite for final ranking
9
+ * 5. Wilson score for confidence-adjusted reputation
10
+ *
11
+ * Based on: npm scoring, Reddit Wilson, Twitter log-engagement,
12
+ * Amazon sales velocity, Airbnb market-relative pricing,
13
+ * IMDB Bayesian average, AgentRank (0xIntuition)
14
+ */
15
+ import type { UnifiedAgent } from "./sources/types.js";
16
+ export interface NormalizedReputation {
17
+ /** Quality signal 0-100 (success rate, reliability) */
18
+ quality: number;
19
+ /** Volume signal 0-100 (log-normalized job count, installs) */
20
+ volume: number;
21
+ /** Recency signal 0-100 (time since last active) */
22
+ recency: number;
23
+ /** Confidence 0-1 (how much evidence backs this score) */
24
+ confidence: number;
25
+ }
26
+ export interface RankingScores {
27
+ /** How well agent matches the query (0-100) */
28
+ relevance: number;
29
+ /** Bayesian-adjusted quality (0-100) */
30
+ quality: number;
31
+ /** Log-normalized usage volume (0-100) */
32
+ volume: number;
33
+ /** Time-decay recency (0-100) */
34
+ recency: number;
35
+ /** Value for money — quality relative to price (0-100) */
36
+ value: number;
37
+ /** Final composite score */
38
+ composite: number;
39
+ }
40
+ export interface RankedAgent {
41
+ agent: UnifiedAgent;
42
+ scores: RankingScores;
43
+ explanation: string;
44
+ }
45
+ export declare function normalizeReputation(agent: UnifiedAgent): NormalizedReputation;
46
+ /**
47
+ * Lower bound of Wilson score confidence interval.
48
+ * Penalizes agents with few interactions even if success rate is high.
49
+ *
50
+ * Agent with 5/5 success → Wilson ~0.57
51
+ * Agent with 95/100 success → Wilson ~0.90
52
+ */
53
+ export declare function wilsonLowerBound(positive: number, total: number, z?: number): number;
54
+ /**
55
+ * Rank agents using the full pipeline:
56
+ * Normalize → Bayesian adjust → Value score → Geometric composite
57
+ */
58
+ export declare function rankAgentsV2(agents: UnifiedAgent[], query: string): RankedAgent[];
59
+ //# sourceMappingURL=ranking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking.d.ts","sourceRoot":"","sources":["../src/ranking.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAiBD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,oBAAoB,CA0D7E;AAgFD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,SAAO,GAAG,MAAM,CAOlF;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,YAAY,EAAE,EACtB,KAAK,EAAE,MAAM,GACZ,WAAW,EAAE,CAyCf"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Kompass Ranking Engine
3
+ *
4
+ * Fair, cross-protocol ranking of agents/services using:
5
+ * 1. Source-specific reputation normalization
6
+ * 2. Bayesian average for cold-start protection
7
+ * 3. Value-for-money scoring (cost:quality ratio)
8
+ * 4. Geometric mean composite for final ranking
9
+ * 5. Wilson score for confidence-adjusted reputation
10
+ *
11
+ * Based on: npm scoring, Reddit Wilson, Twitter log-engagement,
12
+ * Amazon sales velocity, Airbnb market-relative pricing,
13
+ * IMDB Bayesian average, AgentRank (0xIntuition)
14
+ */
15
+ // ── Configuration ────────────────────────────────────────
16
+ const WEIGHTS = {
17
+ relevance: 0.30,
18
+ quality: 0.25,
19
+ volume: 0.15,
20
+ recency: 0.10,
21
+ value: 0.20,
22
+ };
23
+ const BAYESIAN_C = 10; // Confidence parameter for Bayesian average
24
+ const GLOBAL_AVG_QUALITY = 50; // Prior assumption: average quality is 50/100
25
+ // ── Step 1: Source-Specific Normalization ─────────────────
26
+ export function normalizeReputation(agent) {
27
+ const rep = agent.reputation;
28
+ if (!rep)
29
+ return { quality: GLOBAL_AVG_QUALITY, volume: 0, recency: 50, confidence: 0 };
30
+ switch (rep.source) {
31
+ case "acp":
32
+ // successRate is 0-100%, count is completed jobs
33
+ return {
34
+ quality: rep.score,
35
+ volume: logNormalize(rep.count, 1000),
36
+ recency: recencyScore(agent.lastSeen),
37
+ confidence: Math.min(1, rep.count / 20), // Full confidence at 20+ jobs
38
+ };
39
+ case "402index":
40
+ // reliability_score is 0-100, count is uptime percentage (0-100)
41
+ return {
42
+ quality: rep.score,
43
+ volume: rep.count, // Uptime as volume proxy
44
+ recency: recencyScore(agent.lastSeen),
45
+ confidence: 0.7, // Automated monitoring = moderate confidence
46
+ };
47
+ case "8004scan":
48
+ // total_score is 0-100, count is star_count
49
+ return {
50
+ quality: rep.score,
51
+ volume: logNormalize(rep.count, 100),
52
+ recency: recencyScore(agent.lastSeen),
53
+ confidence: Math.min(1, rep.count / 10),
54
+ };
55
+ case "skills-sh-installs":
56
+ // Installs tell popularity, NOT quality
57
+ return {
58
+ quality: GLOBAL_AVG_QUALITY, // Unknown quality — use prior
59
+ volume: logNormalize(rep.count, 100000),
60
+ recency: 50,
61
+ confidence: Math.min(0.5, rep.count / 1000), // Installs give weak quality signal, cap at 0.5
62
+ };
63
+ case "clawhub-relevance":
64
+ // Search relevance, NOT reputation
65
+ return {
66
+ quality: GLOBAL_AVG_QUALITY,
67
+ volume: 0,
68
+ recency: 50,
69
+ confidence: 0, // Relevance says nothing about quality
70
+ };
71
+ default:
72
+ return {
73
+ quality: rep.score > 0 ? Math.min(rep.score, 100) : GLOBAL_AVG_QUALITY,
74
+ volume: logNormalize(rep.count, 100),
75
+ recency: recencyScore(agent.lastSeen),
76
+ confidence: 0.3,
77
+ };
78
+ }
79
+ }
80
+ // ── Step 2: Bayesian Average ─────────────────────────────
81
+ /**
82
+ * Bayesian average prevents new agents with 1 job at 100%
83
+ * from outranking established agents with 95% over 200 jobs.
84
+ *
85
+ * Formula: (count * score + C * prior) / (count + C)
86
+ *
87
+ * Examples:
88
+ * - 2 jobs at 100% → 66.7 (pulls toward prior)
89
+ * - 200 jobs at 95% → 93.3 (mostly own data)
90
+ * - 0 jobs → 50.0 (pure prior)
91
+ */
92
+ function bayesianQuality(normalized) {
93
+ const effectiveCount = normalized.confidence * 20; // Scale confidence to pseudo-count
94
+ return (effectiveCount * normalized.quality + BAYESIAN_C * GLOBAL_AVG_QUALITY) /
95
+ (effectiveCount + BAYESIAN_C);
96
+ }
97
+ // ── Step 3: Value Score ──────────────────────────────────
98
+ /**
99
+ * Value = quality relative to price.
100
+ * A $0.01 agent with 82% success is better value than $0.25 at 76%.
101
+ *
102
+ * Free services get a moderate value score (good value but unknown quality).
103
+ */
104
+ function valueScore(agent, bayesianQ, allAgents) {
105
+ const price = parseAgentPrice(agent);
106
+ if (price === null)
107
+ return 50; // Unknown price → neutral
108
+ if (price === 0)
109
+ return Math.min(bayesianQ, 70); // Free → capped (free doesn't mean best)
110
+ // Find min price among agents with similar capabilities
111
+ const comparablePrices = allAgents
112
+ .map(parseAgentPrice)
113
+ .filter((p) => p !== null && p > 0);
114
+ if (comparablePrices.length === 0)
115
+ return 50;
116
+ const minPrice = Math.min(...comparablePrices);
117
+ const priceRatio = minPrice / price; // 1.0 = cheapest, <1 = more expensive
118
+ // Value = quality-adjusted price efficiency
119
+ // High quality + low price = high value
120
+ // Low quality + high price = low value
121
+ return Math.min(100, (bayesianQ * 0.6 + priceRatio * 100 * 0.4));
122
+ }
123
+ // ── Step 4: Geometric Mean Composite ─────────────────────
124
+ /**
125
+ * Geometric mean ensures ALL factors must be non-zero.
126
+ * An agent that's free but unreliable scores zero.
127
+ * An agent that's perfect quality but irrelevant also scores low.
128
+ */
129
+ function compositeScore(scores) {
130
+ const eps = 1; // Prevent zero from killing the product
131
+ const r = scores.relevance + eps;
132
+ const q = scores.quality + eps;
133
+ const v = scores.volume + eps;
134
+ const t = scores.recency + eps;
135
+ const p = scores.value + eps;
136
+ const totalWeight = WEIGHTS.relevance + WEIGHTS.quality + WEIGHTS.volume + WEIGHTS.recency + WEIGHTS.value;
137
+ return Math.pow(Math.pow(r, WEIGHTS.relevance) *
138
+ Math.pow(q, WEIGHTS.quality) *
139
+ Math.pow(v, WEIGHTS.volume) *
140
+ Math.pow(t, WEIGHTS.recency) *
141
+ Math.pow(p, WEIGHTS.value), 1 / totalWeight);
142
+ }
143
+ // ── Step 5: Wilson Score (Confidence-Adjusted) ───────────
144
+ /**
145
+ * Lower bound of Wilson score confidence interval.
146
+ * Penalizes agents with few interactions even if success rate is high.
147
+ *
148
+ * Agent with 5/5 success → Wilson ~0.57
149
+ * Agent with 95/100 success → Wilson ~0.90
150
+ */
151
+ export function wilsonLowerBound(positive, total, z = 1.96) {
152
+ if (total === 0)
153
+ return 0;
154
+ const phat = positive / total;
155
+ const denominator = 1 + z * z / total;
156
+ const center = phat + z * z / (2 * total);
157
+ const spread = z * Math.sqrt((phat * (1 - phat) + z * z / (4 * total)) / total);
158
+ return Math.max(0, (center - spread) / denominator);
159
+ }
160
+ // ── Main Ranking Function ────────────────────────────────
161
+ /**
162
+ * Rank agents using the full pipeline:
163
+ * Normalize → Bayesian adjust → Value score → Geometric composite
164
+ */
165
+ export function rankAgentsV2(agents, query) {
166
+ // Calculate relevance for each agent (reuse existing BM25 + structured matching)
167
+ const queryTerms = query.toLowerCase().split(/\s+/).filter((t) => t.length > 2);
168
+ return agents
169
+ .map((agent) => {
170
+ // Relevance (BM25-lite + structured)
171
+ const relevance = calculateRelevance(agent, queryTerms);
172
+ // Normalize reputation per source
173
+ const normalized = normalizeReputation(agent);
174
+ // Bayesian-adjusted quality
175
+ const quality = bayesianQuality(normalized);
176
+ // Volume
177
+ const volume = normalized.volume;
178
+ // Recency
179
+ const recency = normalized.recency;
180
+ // Value for money
181
+ const value = valueScore(agent, quality, agents);
182
+ const scores = {
183
+ relevance,
184
+ quality,
185
+ volume,
186
+ recency,
187
+ value,
188
+ composite: 0,
189
+ };
190
+ scores.composite = compositeScore(scores);
191
+ // Build explanation
192
+ const explanation = buildExplanation(agent, scores, normalized);
193
+ return { agent, scores, explanation };
194
+ })
195
+ .sort((a, b) => b.scores.composite - a.scores.composite);
196
+ }
197
+ // ── Helpers ──────────────────────────────────────────────
198
+ function logNormalize(value, maxExpected) {
199
+ if (value <= 0)
200
+ return 0;
201
+ return Math.min(100, (Math.log(1 + value) / Math.log(1 + maxExpected)) * 100);
202
+ }
203
+ function recencyScore(lastSeen) {
204
+ if (!lastSeen)
205
+ return 50; // Unknown → neutral
206
+ const hoursSince = (Date.now() - lastSeen) / (1000 * 60 * 60);
207
+ if (hoursSince < 1)
208
+ return 100;
209
+ if (hoursSince < 24)
210
+ return 80;
211
+ if (hoursSince < 168)
212
+ return 60; // 1 week
213
+ if (hoursSince < 720)
214
+ return 40; // 1 month
215
+ return 20;
216
+ }
217
+ function parseAgentPrice(agent) {
218
+ if (!agent.pricing?.amount)
219
+ return null;
220
+ const amount = agent.pricing.amount;
221
+ if (typeof amount === "number")
222
+ return amount;
223
+ const parsed = parseFloat(amount);
224
+ return isNaN(parsed) ? null : parsed;
225
+ }
226
+ function calculateRelevance(agent, queryTerms) {
227
+ const text = `${agent.name} ${agent.description} ${agent.categories.join(" ")} ${agent.capabilities.join(" ")}`.toLowerCase();
228
+ let score = 0;
229
+ for (const term of queryTerms) {
230
+ if (agent.name.toLowerCase().includes(term))
231
+ score += 15;
232
+ if (agent.description.toLowerCase().includes(term))
233
+ score += 8;
234
+ if (agent.categories.some((c) => c.includes(term)))
235
+ score += 12;
236
+ if (agent.capabilities.some((c) => c.toLowerCase().includes(term)))
237
+ score += 5;
238
+ }
239
+ return Math.min(100, score);
240
+ }
241
+ function buildExplanation(agent, scores, normalized) {
242
+ const parts = [];
243
+ if (scores.relevance > 30)
244
+ parts.push("Strong match");
245
+ else if (scores.relevance > 15)
246
+ parts.push("Moderate match");
247
+ else
248
+ parts.push("Weak match");
249
+ if (normalized.confidence > 0.5) {
250
+ if (scores.quality > 70)
251
+ parts.push("proven quality");
252
+ else if (scores.quality > 50)
253
+ parts.push("decent quality");
254
+ else
255
+ parts.push("unproven quality");
256
+ }
257
+ else {
258
+ parts.push("limited track record");
259
+ }
260
+ const price = parseAgentPrice(agent);
261
+ if (price === 0)
262
+ parts.push("free");
263
+ else if (price !== null && price < 0.05)
264
+ parts.push("very affordable");
265
+ else if (price !== null && price > 1)
266
+ parts.push("premium priced");
267
+ if (scores.value > 70)
268
+ parts.push("great value");
269
+ else if (scores.value < 30)
270
+ parts.push("questionable value");
271
+ return parts.join(". ") + ".";
272
+ }
273
+ //# sourceMappingURL=ranking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking.js","sourceRoot":"","sources":["../src/ranking.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Agent Discovery Protocol (ADP) Source Adapter
3
- * agentdiscovery.io open protocol for autonomous agent commerce
3
+ * Uses the real ADP v2 API at agentdiscovery.io
4
4
  */
5
5
  import type { SourceAdapter } from "./types.js";
6
6
  export declare const adpAdapter: SourceAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"adp.d.ts","sourceRoot":"","sources":["../../src/sources/adp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAqC,MAAM,YAAY,CAAC;AAInF,eAAO,MAAM,UAAU,EAAE,aAsDxB,CAAC"}
1
+ {"version":3,"file":"adp.d.ts","sourceRoot":"","sources":["../../src/sources/adp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAqC,MAAM,YAAY,CAAC;AAInF,eAAO,MAAM,UAAU,EAAE,aAwDxB,CAAC"}
@@ -1,44 +1,48 @@
1
1
  /**
2
2
  * Agent Discovery Protocol (ADP) Source Adapter
3
- * agentdiscovery.io open protocol for autonomous agent commerce
3
+ * Uses the real ADP v2 API at agentdiscovery.io
4
4
  */
5
- const ADP_BASE = "https://agentdiscovery.io";
5
+ const ADP_BASE = "https://agentdiscovery.io/api/adp/v2";
6
6
  export const adpAdapter = {
7
7
  name: "adp",
8
- displayName: "Agent Discovery Protocol",
8
+ displayName: "Agent Discovery Protocol (ADP v2)",
9
9
  async search(query, options) {
10
10
  try {
11
- // Try the ADP API
12
- const res = await fetch(`${ADP_BASE}/api/agents?q=${encodeURIComponent(query)}&limit=${options?.limit ?? 20}`, {
11
+ // First try discovery endpoint with intent
12
+ const discoverRes = await fetch(`${ADP_BASE}/discover`, {
13
+ method: "POST",
14
+ headers: { "Content-Type": "application/json" },
15
+ body: JSON.stringify({ intent: query, category: query }),
13
16
  signal: AbortSignal.timeout(options?.timeout ?? 5000),
14
17
  });
15
- if (!res.ok)
18
+ if (discoverRes.ok) {
19
+ const data = await discoverRes.json();
20
+ const agents = data.matches ?? data.agents ?? data.results ?? [];
21
+ if (Array.isArray(agents) && agents.length > 0) {
22
+ return agents.slice(0, options?.limit ?? 20).map(mapAdpAgent);
23
+ }
24
+ }
25
+ // Fallback: list all agents
26
+ const listRes = await fetch(`${ADP_BASE}/agents`, {
27
+ signal: AbortSignal.timeout(options?.timeout ?? 5000),
28
+ });
29
+ if (!listRes.ok)
16
30
  return [];
17
- const data = await res.json();
18
- const agents = Array.isArray(data) ? data : data.agents ?? data.data ?? [];
19
- return agents.map((agent) => ({
20
- id: `adp:${agent.id ?? agent.address}`,
21
- nativeId: String(agent.id ?? agent.address),
22
- name: agent.name ?? "ADP Agent",
23
- description: agent.description ?? "",
24
- categories: agent.categories ?? agent.tags ?? ["general"],
25
- capabilities: agent.capabilities ?? [agent.description ?? ""],
26
- source: "adp",
27
- protocol: (agent.protocol ?? "http"),
28
- endpoints: {
29
- http: agent.endpoint ?? agent.url,
30
- a2a: agent.a2aEndpoint,
31
- x402: agent.x402Endpoint,
32
- },
33
- reputation: agent.reputation ? {
34
- score: agent.reputation.score ?? 0,
35
- count: agent.reputation.count ?? 0,
36
- source: "adp",
37
- } : undefined,
38
- pricing: agent.pricing,
39
- verified: agent.verified ?? false,
40
- raw: agent,
41
- }));
31
+ const data = await listRes.json();
32
+ const agents = data.agents ?? [];
33
+ if (!Array.isArray(agents))
34
+ return [];
35
+ // Client-side filter by query
36
+ const lower = query.toLowerCase();
37
+ return agents
38
+ .filter((a) => {
39
+ if (!query)
40
+ return true;
41
+ const text = `${a.name ?? ""} ${a.role ?? ""} ${(a.categories ?? []).join(" ")} ${(a.capabilities ?? []).map((c) => c.description ?? c.key ?? "").join(" ")}`.toLowerCase();
42
+ return lower.split(/\s+/).some((t) => text.includes(t));
43
+ })
44
+ .slice(0, options?.limit ?? 20)
45
+ .map(mapAdpAgent);
42
46
  }
43
47
  catch {
44
48
  return [];
@@ -46,9 +50,7 @@ export const adpAdapter = {
46
50
  },
47
51
  async ping() {
48
52
  try {
49
- const res = await fetch(`${ADP_BASE}/api/health`, {
50
- signal: AbortSignal.timeout(3000),
51
- });
53
+ const res = await fetch(`${ADP_BASE}/agents`, { signal: AbortSignal.timeout(3000) });
52
54
  return res.ok;
53
55
  }
54
56
  catch {
@@ -56,4 +58,23 @@ export const adpAdapter = {
56
58
  }
57
59
  },
58
60
  };
61
+ function mapAdpAgent(agent) {
62
+ return {
63
+ id: `adp:${agent.did ?? agent.id ?? agent.name}`,
64
+ nativeId: agent.did ?? agent.id ?? "",
65
+ name: agent.name ?? "ADP Agent",
66
+ description: (agent.capabilities ?? []).map((c) => c.description ?? c.key ?? "").join(". ") || (agent.role ?? ""),
67
+ categories: agent.categories ?? [agent.role ?? "general"],
68
+ capabilities: (agent.capabilities ?? []).map((c) => `${c.key}: ${c.description ?? ""}`),
69
+ source: "adp",
70
+ protocol: "a2a",
71
+ endpoints: {
72
+ http: agent.endpoint ?? agent.url,
73
+ a2a: agent.a2a_endpoint,
74
+ },
75
+ pricing: agent.pricing,
76
+ verified: !!agent.did,
77
+ raw: agent,
78
+ };
79
+ }
59
80
  //# sourceMappingURL=adp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"adp.js","sourceRoot":"","sources":["../../src/sources/adp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,QAAQ,GAAG,2BAA2B,CAAC;AAE7C,MAAM,CAAC,MAAM,UAAU,GAAkB;IACvC,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,0BAA0B;IAEvC,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAA6B;QACvD,IAAI,CAAC;YACH,kBAAkB;YAClB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,iBAAiB,kBAAkB,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE;gBAC7G,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;aACtD,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,EAAE,CAAC;YAEvB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAE3E,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;gBACjC,EAAE,EAAE,OAAO,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE;gBACtC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC;gBAC3C,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,WAAW;gBAC/B,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;gBACpC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC;gBACzD,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;gBAC7D,MAAM,EAAE,KAAc;gBACtB,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAQ;gBAC3C,SAAS,EAAE;oBACT,IAAI,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,GAAG;oBACjC,GAAG,EAAE,KAAK,CAAC,WAAW;oBACtB,IAAI,EAAE,KAAK,CAAC,YAAY;iBACzB;gBACD,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;oBAC7B,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;oBAClC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;oBAClC,MAAM,EAAE,KAAK;iBACd,CAAC,CAAC,CAAC,SAAS;gBACb,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK;gBACjC,GAAG,EAAE,KAAK;aACX,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,aAAa,EAAE;gBAChD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"adp.js","sourceRoot":"","sources":["../../src/sources/adp.ts"],"names":[],"mappings":"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"}
package/dist/unified.d.ts CHANGED
@@ -12,6 +12,7 @@
12
12
  import { type UnifiedAgent } from "./sources/index.js";
13
13
  import { type AggregatorResult } from "./aggregator.js";
14
14
  import { type MatchResult } from "./matching.js";
15
+ import { type RankedAgent } from "./ranking.js";
15
16
  import { type BridgeHireOptions, type BridgeHireResult } from "./bridge.js";
16
17
  import { type DoOptions, type DoResult } from "./router.js";
17
18
  import type { ReputationWriterConfig } from "./reputation-writer.js";
@@ -40,8 +41,10 @@ export interface FindOptions {
40
41
  minScore?: number;
41
42
  }
42
43
  export interface FindResult extends AggregatorResult {
43
- /** Agents re-ranked by multi-layer matching */
44
+ /** Agents re-ranked by multi-layer matching (v1) */
44
45
  ranked: MatchResult[];
46
+ /** Agents re-ranked by v2 engine (Bayesian + geometric + value) */
47
+ rankedV2?: RankedAgent[];
45
48
  }
46
49
  export declare class KompassUnified {
47
50
  private aggregator;
@@ -1 +1 @@
1
- {"version":3,"file":"unified.d.ts","sourceRoot":"","sources":["../src/unified.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAwC,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,EAAsC,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAkB,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAClC,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,gDAAgD;IAChD,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,uDAAuD;IACvD,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,kCAAkC;IAClC,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAW,SAAQ,gBAAgB;IAClD,+CAA+C;IAC/C,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,QAAQ,CAAkB;IAElC,OAAO,CAAC,MAAM,CAAC,CAAgB;IAE/B,OAAO;WAQM,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAcpE;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAsBrE;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI9G;;;OAGG;IACG,WAAW,CACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,GACjD,OAAO,CAAC;QAAE,SAAS,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAa7D;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAInF;;;;;;;;;OASG;IACG,EAAE,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI/C;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}
1
+ {"version":3,"file":"unified.d.ts","sourceRoot":"","sources":["../src/unified.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAwC,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,EAAsC,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAkB,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAClC,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,gDAAgD;IAChD,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,uDAAuD;IACvD,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,kCAAkC;IAClC,MAAM,CAAC,EAAE,GAAG,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAW,SAAQ,gBAAgB;IAClD,oDAAoD;IACpD,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,QAAQ,CAAkB;IAElC,OAAO,CAAC,MAAM,CAAC,CAAgB;IAE/B,OAAO;WAQM,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAcpE;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA0BrE;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI9G;;;OAGG;IACG,WAAW,CACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,GACjD,OAAO,CAAC;QAAE,SAAS,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAa7D;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAInF;;;;;;;;;OASG;IACG,EAAE,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI/C;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}
package/dist/unified.js CHANGED
@@ -12,6 +12,7 @@
12
12
  import { createAllSources } from "./sources/index.js";
13
13
  import { Aggregator } from "./aggregator.js";
14
14
  import { rankAgents } from "./matching.js";
15
+ import { rankAgentsV2 } from "./ranking.js";
15
16
  import { ProtocolBridge } from "./bridge.js";
16
17
  import { CapabilityRouter } from "./router.js";
17
18
  export class KompassUnified {
@@ -48,16 +49,19 @@ export class KompassUnified {
48
49
  sources: options?.sources,
49
50
  timeout: options?.timeout,
50
51
  });
51
- // Re-rank with multi-layer matching
52
+ // Re-rank with v2 ranking engine (Bayesian + geometric + value-for-money)
53
+ const rankedV2 = rankAgentsV2(aggregatorResult.agents, query);
54
+ // Also keep v1 for backward compat
52
55
  const ranked = rankAgents(aggregatorResult.agents, query);
53
- // Apply limit and min score
56
+ // Apply limit and min score using v2 composite
54
57
  const filtered = options?.minScore
55
- ? ranked.filter((r) => r.scores.total >= options.minScore)
56
- : ranked;
58
+ ? rankedV2.filter((r) => r.scores.composite >= options.minScore)
59
+ : rankedV2;
57
60
  return {
58
61
  ...aggregatorResult,
59
62
  agents: filtered.slice(0, options?.limit ?? 20).map((r) => r.agent),
60
- ranked: filtered.slice(0, options?.limit ?? 20),
63
+ ranked: ranked.slice(0, options?.limit ?? 20), // v1 for backward compat
64
+ rankedV2: filtered.slice(0, options?.limit ?? 20), // v2 with proper scoring
61
65
  };
62
66
  }
63
67
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"unified.js","sourceRoot":"","sources":["../src/unified.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"unified.js","sourceRoot":"","sources":["../src/unified.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kompass-sdk",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Get any job done. Universal agent capability discovery + coordination across ACP, MCP, x402, A2A, skills, L402, and ERC-8004.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/ranking.ts ADDED
@@ -0,0 +1,336 @@
1
+ /**
2
+ * Kompass Ranking Engine
3
+ *
4
+ * Fair, cross-protocol ranking of agents/services using:
5
+ * 1. Source-specific reputation normalization
6
+ * 2. Bayesian average for cold-start protection
7
+ * 3. Value-for-money scoring (cost:quality ratio)
8
+ * 4. Geometric mean composite for final ranking
9
+ * 5. Wilson score for confidence-adjusted reputation
10
+ *
11
+ * Based on: npm scoring, Reddit Wilson, Twitter log-engagement,
12
+ * Amazon sales velocity, Airbnb market-relative pricing,
13
+ * IMDB Bayesian average, AgentRank (0xIntuition)
14
+ */
15
+
16
+ import type { UnifiedAgent } from "./sources/types.js";
17
+
18
+ // ── Types ────────────────────────────────────────────────
19
+
20
+ export interface NormalizedReputation {
21
+ /** Quality signal 0-100 (success rate, reliability) */
22
+ quality: number;
23
+ /** Volume signal 0-100 (log-normalized job count, installs) */
24
+ volume: number;
25
+ /** Recency signal 0-100 (time since last active) */
26
+ recency: number;
27
+ /** Confidence 0-1 (how much evidence backs this score) */
28
+ confidence: number;
29
+ }
30
+
31
+ export interface RankingScores {
32
+ /** How well agent matches the query (0-100) */
33
+ relevance: number;
34
+ /** Bayesian-adjusted quality (0-100) */
35
+ quality: number;
36
+ /** Log-normalized usage volume (0-100) */
37
+ volume: number;
38
+ /** Time-decay recency (0-100) */
39
+ recency: number;
40
+ /** Value for money — quality relative to price (0-100) */
41
+ value: number;
42
+ /** Final composite score */
43
+ composite: number;
44
+ }
45
+
46
+ export interface RankedAgent {
47
+ agent: UnifiedAgent;
48
+ scores: RankingScores;
49
+ explanation: string;
50
+ }
51
+
52
+ // ── Configuration ────────────────────────────────────────
53
+
54
+ const WEIGHTS = {
55
+ relevance: 0.30,
56
+ quality: 0.25,
57
+ volume: 0.15,
58
+ recency: 0.10,
59
+ value: 0.20,
60
+ };
61
+
62
+ const BAYESIAN_C = 10; // Confidence parameter for Bayesian average
63
+ const GLOBAL_AVG_QUALITY = 50; // Prior assumption: average quality is 50/100
64
+
65
+ // ── Step 1: Source-Specific Normalization ─────────────────
66
+
67
+ export function normalizeReputation(agent: UnifiedAgent): NormalizedReputation {
68
+ const rep = agent.reputation;
69
+ if (!rep) return { quality: GLOBAL_AVG_QUALITY, volume: 0, recency: 50, confidence: 0 };
70
+
71
+ switch (rep.source) {
72
+ case "acp":
73
+ // successRate is 0-100%, count is completed jobs
74
+ return {
75
+ quality: rep.score,
76
+ volume: logNormalize(rep.count, 1000),
77
+ recency: recencyScore(agent.lastSeen),
78
+ confidence: Math.min(1, rep.count / 20), // Full confidence at 20+ jobs
79
+ };
80
+
81
+ case "402index":
82
+ // reliability_score is 0-100, count is uptime percentage (0-100)
83
+ return {
84
+ quality: rep.score,
85
+ volume: rep.count, // Uptime as volume proxy
86
+ recency: recencyScore(agent.lastSeen),
87
+ confidence: 0.7, // Automated monitoring = moderate confidence
88
+ };
89
+
90
+ case "8004scan":
91
+ // total_score is 0-100, count is star_count
92
+ return {
93
+ quality: rep.score,
94
+ volume: logNormalize(rep.count, 100),
95
+ recency: recencyScore(agent.lastSeen),
96
+ confidence: Math.min(1, rep.count / 10),
97
+ };
98
+
99
+ case "skills-sh-installs":
100
+ // Installs tell popularity, NOT quality
101
+ return {
102
+ quality: GLOBAL_AVG_QUALITY, // Unknown quality — use prior
103
+ volume: logNormalize(rep.count, 100000),
104
+ recency: 50,
105
+ confidence: Math.min(0.5, rep.count / 1000), // Installs give weak quality signal, cap at 0.5
106
+ };
107
+
108
+ case "clawhub-relevance":
109
+ // Search relevance, NOT reputation
110
+ return {
111
+ quality: GLOBAL_AVG_QUALITY,
112
+ volume: 0,
113
+ recency: 50,
114
+ confidence: 0, // Relevance says nothing about quality
115
+ };
116
+
117
+ default:
118
+ return {
119
+ quality: rep.score > 0 ? Math.min(rep.score, 100) : GLOBAL_AVG_QUALITY,
120
+ volume: logNormalize(rep.count, 100),
121
+ recency: recencyScore(agent.lastSeen),
122
+ confidence: 0.3,
123
+ };
124
+ }
125
+ }
126
+
127
+ // ── Step 2: Bayesian Average ─────────────────────────────
128
+
129
+ /**
130
+ * Bayesian average prevents new agents with 1 job at 100%
131
+ * from outranking established agents with 95% over 200 jobs.
132
+ *
133
+ * Formula: (count * score + C * prior) / (count + C)
134
+ *
135
+ * Examples:
136
+ * - 2 jobs at 100% → 66.7 (pulls toward prior)
137
+ * - 200 jobs at 95% → 93.3 (mostly own data)
138
+ * - 0 jobs → 50.0 (pure prior)
139
+ */
140
+ function bayesianQuality(normalized: NormalizedReputation): number {
141
+ const effectiveCount = normalized.confidence * 20; // Scale confidence to pseudo-count
142
+ return (effectiveCount * normalized.quality + BAYESIAN_C * GLOBAL_AVG_QUALITY) /
143
+ (effectiveCount + BAYESIAN_C);
144
+ }
145
+
146
+ // ── Step 3: Value Score ──────────────────────────────────
147
+
148
+ /**
149
+ * Value = quality relative to price.
150
+ * A $0.01 agent with 82% success is better value than $0.25 at 76%.
151
+ *
152
+ * Free services get a moderate value score (good value but unknown quality).
153
+ */
154
+ function valueScore(agent: UnifiedAgent, bayesianQ: number, allAgents: UnifiedAgent[]): number {
155
+ const price = parseAgentPrice(agent);
156
+
157
+ if (price === null) return 50; // Unknown price → neutral
158
+ if (price === 0) return Math.min(bayesianQ, 70); // Free → capped (free doesn't mean best)
159
+
160
+ // Find min price among agents with similar capabilities
161
+ const comparablePrices = allAgents
162
+ .map(parseAgentPrice)
163
+ .filter((p): p is number => p !== null && p > 0);
164
+
165
+ if (comparablePrices.length === 0) return 50;
166
+
167
+ const minPrice = Math.min(...comparablePrices);
168
+ const priceRatio = minPrice / price; // 1.0 = cheapest, <1 = more expensive
169
+
170
+ // Value = quality-adjusted price efficiency
171
+ // High quality + low price = high value
172
+ // Low quality + high price = low value
173
+ return Math.min(100, (bayesianQ * 0.6 + priceRatio * 100 * 0.4));
174
+ }
175
+
176
+ // ── Step 4: Geometric Mean Composite ─────────────────────
177
+
178
+ /**
179
+ * Geometric mean ensures ALL factors must be non-zero.
180
+ * An agent that's free but unreliable scores zero.
181
+ * An agent that's perfect quality but irrelevant also scores low.
182
+ */
183
+ function compositeScore(scores: Omit<RankingScores, "composite">): number {
184
+ const eps = 1; // Prevent zero from killing the product
185
+ const r = scores.relevance + eps;
186
+ const q = scores.quality + eps;
187
+ const v = scores.volume + eps;
188
+ const t = scores.recency + eps;
189
+ const p = scores.value + eps;
190
+
191
+ const totalWeight = WEIGHTS.relevance + WEIGHTS.quality + WEIGHTS.volume + WEIGHTS.recency + WEIGHTS.value;
192
+
193
+ return Math.pow(
194
+ Math.pow(r, WEIGHTS.relevance) *
195
+ Math.pow(q, WEIGHTS.quality) *
196
+ Math.pow(v, WEIGHTS.volume) *
197
+ Math.pow(t, WEIGHTS.recency) *
198
+ Math.pow(p, WEIGHTS.value),
199
+ 1 / totalWeight
200
+ );
201
+ }
202
+
203
+ // ── Step 5: Wilson Score (Confidence-Adjusted) ───────────
204
+
205
+ /**
206
+ * Lower bound of Wilson score confidence interval.
207
+ * Penalizes agents with few interactions even if success rate is high.
208
+ *
209
+ * Agent with 5/5 success → Wilson ~0.57
210
+ * Agent with 95/100 success → Wilson ~0.90
211
+ */
212
+ export function wilsonLowerBound(positive: number, total: number, z = 1.96): number {
213
+ if (total === 0) return 0;
214
+ const phat = positive / total;
215
+ const denominator = 1 + z * z / total;
216
+ const center = phat + z * z / (2 * total);
217
+ const spread = z * Math.sqrt((phat * (1 - phat) + z * z / (4 * total)) / total);
218
+ return Math.max(0, (center - spread) / denominator);
219
+ }
220
+
221
+ // ── Main Ranking Function ────────────────────────────────
222
+
223
+ /**
224
+ * Rank agents using the full pipeline:
225
+ * Normalize → Bayesian adjust → Value score → Geometric composite
226
+ */
227
+ export function rankAgentsV2(
228
+ agents: UnifiedAgent[],
229
+ query: string
230
+ ): RankedAgent[] {
231
+ // Calculate relevance for each agent (reuse existing BM25 + structured matching)
232
+ const queryTerms = query.toLowerCase().split(/\s+/).filter((t) => t.length > 2);
233
+
234
+ return agents
235
+ .map((agent) => {
236
+ // Relevance (BM25-lite + structured)
237
+ const relevance = calculateRelevance(agent, queryTerms);
238
+
239
+ // Normalize reputation per source
240
+ const normalized = normalizeReputation(agent);
241
+
242
+ // Bayesian-adjusted quality
243
+ const quality = bayesianQuality(normalized);
244
+
245
+ // Volume
246
+ const volume = normalized.volume;
247
+
248
+ // Recency
249
+ const recency = normalized.recency;
250
+
251
+ // Value for money
252
+ const value = valueScore(agent, quality, agents);
253
+
254
+ const scores: RankingScores = {
255
+ relevance,
256
+ quality,
257
+ volume,
258
+ recency,
259
+ value,
260
+ composite: 0,
261
+ };
262
+
263
+ scores.composite = compositeScore(scores);
264
+
265
+ // Build explanation
266
+ const explanation = buildExplanation(agent, scores, normalized);
267
+
268
+ return { agent, scores, explanation };
269
+ })
270
+ .sort((a, b) => b.scores.composite - a.scores.composite);
271
+ }
272
+
273
+ // ── Helpers ──────────────────────────────────────────────
274
+
275
+ function logNormalize(value: number, maxExpected: number): number {
276
+ if (value <= 0) return 0;
277
+ return Math.min(100, (Math.log(1 + value) / Math.log(1 + maxExpected)) * 100);
278
+ }
279
+
280
+ function recencyScore(lastSeen?: number): number {
281
+ if (!lastSeen) return 50; // Unknown → neutral
282
+ const hoursSince = (Date.now() - lastSeen) / (1000 * 60 * 60);
283
+ if (hoursSince < 1) return 100;
284
+ if (hoursSince < 24) return 80;
285
+ if (hoursSince < 168) return 60; // 1 week
286
+ if (hoursSince < 720) return 40; // 1 month
287
+ return 20;
288
+ }
289
+
290
+ function parseAgentPrice(agent: UnifiedAgent): number | null {
291
+ if (!agent.pricing?.amount) return null;
292
+ const amount = agent.pricing.amount;
293
+ if (typeof amount === "number") return amount;
294
+ const parsed = parseFloat(amount);
295
+ return isNaN(parsed) ? null : parsed;
296
+ }
297
+
298
+ function calculateRelevance(agent: UnifiedAgent, queryTerms: string[]): number {
299
+ const text = `${agent.name} ${agent.description} ${agent.categories.join(" ")} ${agent.capabilities.join(" ")}`.toLowerCase();
300
+ let score = 0;
301
+
302
+ for (const term of queryTerms) {
303
+ if (agent.name.toLowerCase().includes(term)) score += 15;
304
+ if (agent.description.toLowerCase().includes(term)) score += 8;
305
+ if (agent.categories.some((c) => c.includes(term))) score += 12;
306
+ if (agent.capabilities.some((c) => c.toLowerCase().includes(term))) score += 5;
307
+ }
308
+
309
+ return Math.min(100, score);
310
+ }
311
+
312
+ function buildExplanation(agent: UnifiedAgent, scores: RankingScores, normalized: NormalizedReputation): string {
313
+ const parts: string[] = [];
314
+
315
+ if (scores.relevance > 30) parts.push("Strong match");
316
+ else if (scores.relevance > 15) parts.push("Moderate match");
317
+ else parts.push("Weak match");
318
+
319
+ if (normalized.confidence > 0.5) {
320
+ if (scores.quality > 70) parts.push("proven quality");
321
+ else if (scores.quality > 50) parts.push("decent quality");
322
+ else parts.push("unproven quality");
323
+ } else {
324
+ parts.push("limited track record");
325
+ }
326
+
327
+ const price = parseAgentPrice(agent);
328
+ if (price === 0) parts.push("free");
329
+ else if (price !== null && price < 0.05) parts.push("very affordable");
330
+ else if (price !== null && price > 1) parts.push("premium priced");
331
+
332
+ if (scores.value > 70) parts.push("great value");
333
+ else if (scores.value < 30) parts.push("questionable value");
334
+
335
+ return parts.join(". ") + ".";
336
+ }
@@ -1,51 +1,55 @@
1
1
  /**
2
2
  * Agent Discovery Protocol (ADP) Source Adapter
3
- * agentdiscovery.io open protocol for autonomous agent commerce
3
+ * Uses the real ADP v2 API at agentdiscovery.io
4
4
  */
5
5
 
6
6
  import type { SourceAdapter, UnifiedAgent, SourceSearchOptions } from "./types.js";
7
7
 
8
- const ADP_BASE = "https://agentdiscovery.io";
8
+ const ADP_BASE = "https://agentdiscovery.io/api/adp/v2";
9
9
 
10
10
  export const adpAdapter: SourceAdapter = {
11
11
  name: "adp",
12
- displayName: "Agent Discovery Protocol",
12
+ displayName: "Agent Discovery Protocol (ADP v2)",
13
13
 
14
14
  async search(query: string, options?: SourceSearchOptions): Promise<UnifiedAgent[]> {
15
15
  try {
16
- // Try the ADP API
17
- const res = await fetch(`${ADP_BASE}/api/agents?q=${encodeURIComponent(query)}&limit=${options?.limit ?? 20}`, {
16
+ // First try discovery endpoint with intent
17
+ const discoverRes = await fetch(`${ADP_BASE}/discover`, {
18
+ method: "POST",
19
+ headers: { "Content-Type": "application/json" },
20
+ body: JSON.stringify({ intent: query, category: query }),
18
21
  signal: AbortSignal.timeout(options?.timeout ?? 5000),
19
22
  });
20
23
 
21
- if (!res.ok) return [];
24
+ if (discoverRes.ok) {
25
+ const data = await discoverRes.json();
26
+ const agents = data.matches ?? data.agents ?? data.results ?? [];
27
+ if (Array.isArray(agents) && agents.length > 0) {
28
+ return agents.slice(0, options?.limit ?? 20).map(mapAdpAgent);
29
+ }
30
+ }
22
31
 
23
- const data = await res.json();
24
- const agents = Array.isArray(data) ? data : data.agents ?? data.data ?? [];
32
+ // Fallback: list all agents
33
+ const listRes = await fetch(`${ADP_BASE}/agents`, {
34
+ signal: AbortSignal.timeout(options?.timeout ?? 5000),
35
+ });
36
+
37
+ if (!listRes.ok) return [];
25
38
 
26
- return agents.map((agent: any) => ({
27
- id: `adp:${agent.id ?? agent.address}`,
28
- nativeId: String(agent.id ?? agent.address),
29
- name: agent.name ?? "ADP Agent",
30
- description: agent.description ?? "",
31
- categories: agent.categories ?? agent.tags ?? ["general"],
32
- capabilities: agent.capabilities ?? [agent.description ?? ""],
33
- source: "adp" as const,
34
- protocol: (agent.protocol ?? "http") as any,
35
- endpoints: {
36
- http: agent.endpoint ?? agent.url,
37
- a2a: agent.a2aEndpoint,
38
- x402: agent.x402Endpoint,
39
- },
40
- reputation: agent.reputation ? {
41
- score: agent.reputation.score ?? 0,
42
- count: agent.reputation.count ?? 0,
43
- source: "adp",
44
- } : undefined,
45
- pricing: agent.pricing,
46
- verified: agent.verified ?? false,
47
- raw: agent,
48
- }));
39
+ const data = await listRes.json();
40
+ const agents = data.agents ?? [];
41
+ if (!Array.isArray(agents)) return [];
42
+
43
+ // Client-side filter by query
44
+ const lower = query.toLowerCase();
45
+ return agents
46
+ .filter((a: any) => {
47
+ if (!query) return true;
48
+ const text = `${a.name ?? ""} ${a.role ?? ""} ${(a.categories ?? []).join(" ")} ${(a.capabilities ?? []).map((c: any) => c.description ?? c.key ?? "").join(" ")}`.toLowerCase();
49
+ return lower.split(/\s+/).some((t) => text.includes(t));
50
+ })
51
+ .slice(0, options?.limit ?? 20)
52
+ .map(mapAdpAgent);
49
53
  } catch {
50
54
  return [];
51
55
  }
@@ -53,12 +57,30 @@ export const adpAdapter: SourceAdapter = {
53
57
 
54
58
  async ping(): Promise<boolean> {
55
59
  try {
56
- const res = await fetch(`${ADP_BASE}/api/health`, {
57
- signal: AbortSignal.timeout(3000),
58
- });
60
+ const res = await fetch(`${ADP_BASE}/agents`, { signal: AbortSignal.timeout(3000) });
59
61
  return res.ok;
60
62
  } catch {
61
63
  return false;
62
64
  }
63
65
  },
64
66
  };
67
+
68
+ function mapAdpAgent(agent: any): UnifiedAgent {
69
+ return {
70
+ id: `adp:${agent.did ?? agent.id ?? agent.name}`,
71
+ nativeId: agent.did ?? agent.id ?? "",
72
+ name: agent.name ?? "ADP Agent",
73
+ description: (agent.capabilities ?? []).map((c: any) => c.description ?? c.key ?? "").join(". ") || (agent.role ?? ""),
74
+ categories: agent.categories ?? [agent.role ?? "general"],
75
+ capabilities: (agent.capabilities ?? []).map((c: any) => `${c.key}: ${c.description ?? ""}`),
76
+ source: "adp",
77
+ protocol: "a2a",
78
+ endpoints: {
79
+ http: agent.endpoint ?? agent.url,
80
+ a2a: agent.a2a_endpoint,
81
+ },
82
+ pricing: agent.pricing,
83
+ verified: !!agent.did,
84
+ raw: agent,
85
+ };
86
+ }
package/src/unified.ts CHANGED
@@ -13,6 +13,7 @@
13
13
  import { createAllSources, type SourceAdapter, type UnifiedAgent } from "./sources/index.js";
14
14
  import { Aggregator, type AggregatorOptions, type AggregatorResult } from "./aggregator.js";
15
15
  import { rankAgents, type MatchResult } from "./matching.js";
16
+ import { rankAgentsV2, type RankedAgent } from "./ranking.js";
16
17
  import { ProtocolBridge, type BridgeHireOptions, type BridgeHireResult } from "./bridge.js";
17
18
  import { CapabilityRouter, type DoOptions, type DoResult } from "./router.js";
18
19
  import type { ReputationWriterConfig } from "./reputation-writer.js";
@@ -44,8 +45,10 @@ export interface FindOptions {
44
45
  }
45
46
 
46
47
  export interface FindResult extends AggregatorResult {
47
- /** Agents re-ranked by multi-layer matching */
48
+ /** Agents re-ranked by multi-layer matching (v1) */
48
49
  ranked: MatchResult[];
50
+ /** Agents re-ranked by v2 engine (Bayesian + geometric + value) */
51
+ rankedV2?: RankedAgent[];
49
52
  }
50
53
 
51
54
  export class KompassUnified {
@@ -89,18 +92,22 @@ export class KompassUnified {
89
92
  timeout: options?.timeout,
90
93
  });
91
94
 
92
- // Re-rank with multi-layer matching
95
+ // Re-rank with v2 ranking engine (Bayesian + geometric + value-for-money)
96
+ const rankedV2 = rankAgentsV2(aggregatorResult.agents, query);
97
+
98
+ // Also keep v1 for backward compat
93
99
  const ranked = rankAgents(aggregatorResult.agents, query);
94
100
 
95
- // Apply limit and min score
101
+ // Apply limit and min score using v2 composite
96
102
  const filtered = options?.minScore
97
- ? ranked.filter((r) => r.scores.total >= options.minScore!)
98
- : ranked;
103
+ ? rankedV2.filter((r) => r.scores.composite >= options.minScore!)
104
+ : rankedV2;
99
105
 
100
106
  return {
101
107
  ...aggregatorResult,
102
108
  agents: filtered.slice(0, options?.limit ?? 20).map((r) => r.agent),
103
- ranked: filtered.slice(0, options?.limit ?? 20),
109
+ ranked: ranked.slice(0, options?.limit ?? 20), // v1 for backward compat
110
+ rankedV2: filtered.slice(0, options?.limit ?? 20), // v2 with proper scoring
104
111
  };
105
112
  }
106
113
 
@@ -0,0 +1,53 @@
1
+ import { KompassUnified } from './src/unified.js';
2
+
3
+ async function main() {
4
+ const kompass = await KompassUnified.create();
5
+ const result = await kompass.find('DeFi yield data', { limit: 20 });
6
+
7
+ console.log('=== SOURCES ===');
8
+ for (const s of result.sources) {
9
+ console.log(` ${s.name}: ${s.count} agents (${s.durationMs}ms)${s.error ? ' ERROR: '+s.error : ''}`);
10
+ }
11
+
12
+ console.log(`\nTotal: ${result.totalFound} found, ${result.deduplicated} deduped, ${result.queryTimeMs}ms`);
13
+
14
+ const bySrc: Record<string, number> = {};
15
+ const byProto: Record<string, number> = {};
16
+ for (const a of result.agents) {
17
+ bySrc[a.source] = (bySrc[a.source] || 0) + 1;
18
+ byProto[a.protocol] = (byProto[a.protocol] || 0) + 1;
19
+ }
20
+
21
+ console.log('\n=== BY SOURCE ===');
22
+ for (const [k, v] of Object.entries(bySrc).sort((a, b) => b[1] - a[1])) console.log(` ${k}: ${v}`);
23
+
24
+ console.log('\n=== BY PROTOCOL ===');
25
+ for (const [k, v] of Object.entries(byProto).sort((a, b) => b[1] - a[1])) console.log(` ${k}: ${v}`);
26
+
27
+ console.log('\n=== V2 RANKING (Bayesian + Geometric + Value-for-Money) ===');
28
+ console.log(' # Proto Name Source Cost Composite Relevance Quality Volume Value Explanation');
29
+ console.log(' ' + '─'.repeat(170));
30
+
31
+ const v2 = result.rankedV2 ?? [];
32
+ for (let i = 0; i < Math.min(20, v2.length); i++) {
33
+ const r = v2[i];
34
+ const a = r.agent;
35
+ const s = r.scores;
36
+ const proto = a.protocol.toUpperCase().padEnd(6);
37
+ const name = (a.name ?? '?').slice(0, 35).padEnd(35);
38
+ const src = a.source.padEnd(18);
39
+ const price = a.pricing?.amount ? `$${a.pricing.amount}` : 'free/?';
40
+
41
+ console.log(
42
+ ` ${String(i + 1).padStart(2)} [${proto}] ${name} | ${src} | ${price.padEnd(10)} | ` +
43
+ `comp=${s.composite.toFixed(1).padEnd(6)} | ` +
44
+ `rel=${s.relevance.toFixed(0).padEnd(4)} | ` +
45
+ `qual=${s.quality.toFixed(1).padEnd(6)} | ` +
46
+ `vol=${s.volume.toFixed(0).padEnd(4)} | ` +
47
+ `val=${s.value.toFixed(1).padEnd(6)} | ` +
48
+ `${r.explanation}`
49
+ );
50
+ }
51
+ }
52
+
53
+ main().catch(console.error);