kompass-sdk 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.
Files changed (205) hide show
  1. package/dist/a2a/agent-card.d.ts +13 -0
  2. package/dist/a2a/agent-card.d.ts.map +1 -0
  3. package/dist/a2a/agent-card.js +52 -0
  4. package/dist/a2a/agent-card.js.map +1 -0
  5. package/dist/a2a/bridge.d.ts +52 -0
  6. package/dist/a2a/bridge.d.ts.map +1 -0
  7. package/dist/a2a/bridge.js +123 -0
  8. package/dist/a2a/bridge.js.map +1 -0
  9. package/dist/a2a/client.d.ts +34 -0
  10. package/dist/a2a/client.d.ts.map +1 -0
  11. package/dist/a2a/client.js +65 -0
  12. package/dist/a2a/client.js.map +1 -0
  13. package/dist/a2a/server.d.ts +17 -0
  14. package/dist/a2a/server.d.ts.map +1 -0
  15. package/dist/a2a/server.js +194 -0
  16. package/dist/a2a/server.js.map +1 -0
  17. package/dist/abi.d.ts +1068 -0
  18. package/dist/abi.d.ts.map +1 -0
  19. package/dist/abi.js +1372 -0
  20. package/dist/abi.js.map +1 -0
  21. package/dist/adapters/agentkit.d.ts +41 -0
  22. package/dist/adapters/agentkit.d.ts.map +1 -0
  23. package/dist/adapters/agentkit.js +67 -0
  24. package/dist/adapters/agentkit.js.map +1 -0
  25. package/dist/adapters/generic.d.ts +35 -0
  26. package/dist/adapters/generic.d.ts.map +1 -0
  27. package/dist/adapters/generic.js +47 -0
  28. package/dist/adapters/generic.js.map +1 -0
  29. package/dist/adapters/index.d.ts +5 -0
  30. package/dist/adapters/index.d.ts.map +1 -0
  31. package/dist/adapters/index.js +5 -0
  32. package/dist/adapters/index.js.map +1 -0
  33. package/dist/adapters/langchain.d.ts +26 -0
  34. package/dist/adapters/langchain.d.ts.map +1 -0
  35. package/dist/adapters/langchain.js +228 -0
  36. package/dist/adapters/langchain.js.map +1 -0
  37. package/dist/adapters/openclaw.d.ts +18 -0
  38. package/dist/adapters/openclaw.d.ts.map +1 -0
  39. package/dist/adapters/openclaw.js +168 -0
  40. package/dist/adapters/openclaw.js.map +1 -0
  41. package/dist/aggregator.d.ts +36 -0
  42. package/dist/aggregator.d.ts.map +1 -0
  43. package/dist/aggregator.js +168 -0
  44. package/dist/aggregator.js.map +1 -0
  45. package/dist/backends/acp.d.ts +29 -0
  46. package/dist/backends/acp.d.ts.map +1 -0
  47. package/dist/backends/acp.js +126 -0
  48. package/dist/backends/acp.js.map +1 -0
  49. package/dist/backends/types.d.ts +59 -0
  50. package/dist/backends/types.d.ts.map +1 -0
  51. package/dist/backends/types.js +2 -0
  52. package/dist/backends/types.js.map +1 -0
  53. package/dist/bridge.d.ts +35 -0
  54. package/dist/bridge.d.ts.map +1 -0
  55. package/dist/bridge.js +192 -0
  56. package/dist/bridge.js.map +1 -0
  57. package/dist/cli.d.ts +12 -0
  58. package/dist/cli.d.ts.map +1 -0
  59. package/dist/cli.js +331 -0
  60. package/dist/cli.js.map +1 -0
  61. package/dist/discover.d.ts +15 -0
  62. package/dist/discover.d.ts.map +1 -0
  63. package/dist/discover.js +163 -0
  64. package/dist/discover.js.map +1 -0
  65. package/dist/escrow.d.ts +45 -0
  66. package/dist/escrow.d.ts.map +1 -0
  67. package/dist/escrow.js +243 -0
  68. package/dist/escrow.js.map +1 -0
  69. package/dist/index.d.ts +63 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +145 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/intents.d.ts +28 -0
  74. package/dist/intents.d.ts.map +1 -0
  75. package/dist/intents.js +111 -0
  76. package/dist/intents.js.map +1 -0
  77. package/dist/matching.d.ts +29 -0
  78. package/dist/matching.d.ts.map +1 -0
  79. package/dist/matching.js +147 -0
  80. package/dist/matching.js.map +1 -0
  81. package/dist/pipelineAbi.d.ts +113 -0
  82. package/dist/pipelineAbi.d.ts.map +1 -0
  83. package/dist/pipelineAbi.js +74 -0
  84. package/dist/pipelineAbi.js.map +1 -0
  85. package/dist/pipelines.d.ts +42 -0
  86. package/dist/pipelines.d.ts.map +1 -0
  87. package/dist/pipelines.js +185 -0
  88. package/dist/pipelines.js.map +1 -0
  89. package/dist/registry.d.ts +36 -0
  90. package/dist/registry.d.ts.map +1 -0
  91. package/dist/registry.js +187 -0
  92. package/dist/registry.js.map +1 -0
  93. package/dist/reputation.d.ts +10 -0
  94. package/dist/reputation.d.ts.map +1 -0
  95. package/dist/reputation.js +33 -0
  96. package/dist/reputation.js.map +1 -0
  97. package/dist/router.d.ts +72 -0
  98. package/dist/router.d.ts.map +1 -0
  99. package/dist/router.js +190 -0
  100. package/dist/router.js.map +1 -0
  101. package/dist/simple.d.ts +160 -0
  102. package/dist/simple.d.ts.map +1 -0
  103. package/dist/simple.js +237 -0
  104. package/dist/simple.js.map +1 -0
  105. package/dist/sources/a2a-wellknown.d.ts +8 -0
  106. package/dist/sources/a2a-wellknown.d.ts.map +1 -0
  107. package/dist/sources/a2a-wellknown.js +104 -0
  108. package/dist/sources/a2a-wellknown.js.map +1 -0
  109. package/dist/sources/acp.d.ts +7 -0
  110. package/dist/sources/acp.d.ts.map +1 -0
  111. package/dist/sources/acp.js +86 -0
  112. package/dist/sources/acp.js.map +1 -0
  113. package/dist/sources/adp.d.ts +7 -0
  114. package/dist/sources/adp.d.ts.map +1 -0
  115. package/dist/sources/adp.js +59 -0
  116. package/dist/sources/adp.js.map +1 -0
  117. package/dist/sources/erc8004.d.ts +7 -0
  118. package/dist/sources/erc8004.d.ts.map +1 -0
  119. package/dist/sources/erc8004.js +150 -0
  120. package/dist/sources/erc8004.js.map +1 -0
  121. package/dist/sources/index.d.ts +17 -0
  122. package/dist/sources/index.d.ts.map +1 -0
  123. package/dist/sources/index.js +35 -0
  124. package/dist/sources/index.js.map +1 -0
  125. package/dist/sources/kompass-registry.d.ts +8 -0
  126. package/dist/sources/kompass-registry.d.ts.map +1 -0
  127. package/dist/sources/kompass-registry.js +62 -0
  128. package/dist/sources/kompass-registry.js.map +1 -0
  129. package/dist/sources/l402-directory.d.ts +7 -0
  130. package/dist/sources/l402-directory.d.ts.map +1 -0
  131. package/dist/sources/l402-directory.js +42 -0
  132. package/dist/sources/l402-directory.js.map +1 -0
  133. package/dist/sources/mcp-registry.d.ts +8 -0
  134. package/dist/sources/mcp-registry.d.ts.map +1 -0
  135. package/dist/sources/mcp-registry.js +85 -0
  136. package/dist/sources/mcp-registry.js.map +1 -0
  137. package/dist/sources/skills.d.ts +8 -0
  138. package/dist/sources/skills.d.ts.map +1 -0
  139. package/dist/sources/skills.js +153 -0
  140. package/dist/sources/skills.js.map +1 -0
  141. package/dist/sources/types.d.ts +72 -0
  142. package/dist/sources/types.d.ts.map +1 -0
  143. package/dist/sources/types.js +8 -0
  144. package/dist/sources/types.js.map +1 -0
  145. package/dist/sources/x402-ecosystem.d.ts +7 -0
  146. package/dist/sources/x402-ecosystem.d.ts.map +1 -0
  147. package/dist/sources/x402-ecosystem.js +78 -0
  148. package/dist/sources/x402-ecosystem.js.map +1 -0
  149. package/dist/types.d.ts +133 -0
  150. package/dist/types.d.ts.map +1 -0
  151. package/dist/types.js +2 -0
  152. package/dist/types.js.map +1 -0
  153. package/dist/unified.d.ts +90 -0
  154. package/dist/unified.d.ts.map +1 -0
  155. package/dist/unified.js +107 -0
  156. package/dist/unified.js.map +1 -0
  157. package/dist/x402.d.ts +30 -0
  158. package/dist/x402.d.ts.map +1 -0
  159. package/dist/x402.js +79 -0
  160. package/dist/x402.js.map +1 -0
  161. package/package.json +61 -0
  162. package/scripts/bootstrap-agents.mjs +246 -0
  163. package/src/.gitkeep +0 -0
  164. package/src/a2a/agent-card.ts +66 -0
  165. package/src/a2a/bridge.ts +168 -0
  166. package/src/a2a/client.ts +92 -0
  167. package/src/a2a/server.ts +234 -0
  168. package/src/abi.ts +1373 -0
  169. package/src/adapters/agentkit.ts +83 -0
  170. package/src/adapters/generic.ts +62 -0
  171. package/src/adapters/index.ts +4 -0
  172. package/src/adapters/langchain.ts +282 -0
  173. package/src/adapters/openclaw.ts +203 -0
  174. package/src/aggregator.ts +203 -0
  175. package/src/backends/acp.ts +199 -0
  176. package/src/backends/types.ts +78 -0
  177. package/src/bridge.ts +263 -0
  178. package/src/cli.ts +397 -0
  179. package/src/discover.ts +187 -0
  180. package/src/escrow.ts +284 -0
  181. package/src/index.ts +245 -0
  182. package/src/intents.ts +166 -0
  183. package/src/matching.ts +192 -0
  184. package/src/pipelineAbi.ts +74 -0
  185. package/src/pipelines.ts +253 -0
  186. package/src/registry.ts +232 -0
  187. package/src/reputation.ts +43 -0
  188. package/src/router.ts +279 -0
  189. package/src/simple.ts +366 -0
  190. package/src/sources/a2a-wellknown.ts +120 -0
  191. package/src/sources/acp.ts +91 -0
  192. package/src/sources/adp.ts +64 -0
  193. package/src/sources/erc8004.ts +166 -0
  194. package/src/sources/index.ts +52 -0
  195. package/src/sources/kompass-registry.ts +67 -0
  196. package/src/sources/l402-directory.ts +51 -0
  197. package/src/sources/mcp-registry.ts +104 -0
  198. package/src/sources/skills.ts +161 -0
  199. package/src/sources/types.ts +82 -0
  200. package/src/sources/x402-ecosystem.ts +86 -0
  201. package/src/types.ts +147 -0
  202. package/src/unified.ts +155 -0
  203. package/src/x402.ts +122 -0
  204. package/tests/pipelineFlow.test.ts +239 -0
  205. package/tsconfig.json +20 -0
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Kompass Capability Router
3
+ *
4
+ * The core product logic. Given a task, figure out the best way to get it done.
5
+ *
6
+ * kompass.do("get DeFi yield data") →
7
+ * 1. Parse intent → what capability is needed
8
+ * 2. Search all sources → where can I get it
9
+ * 3. Rank options → cost, speed, reliability, reputation
10
+ * 4. Execute via right protocol → ACP, x402, MCP, skill, A2A
11
+ * 5. Return result
12
+ */
13
+ import type { UnifiedAgent } from "./sources/types.js";
14
+ import { Aggregator } from "./aggregator.js";
15
+ import { type MatchResult } from "./matching.js";
16
+ import { ProtocolBridge, type BridgeHireResult } from "./bridge.js";
17
+ export type CostPreference = "cheapest" | "balanced" | "best-quality";
18
+ export interface DoOptions {
19
+ /** What you want done — natural language */
20
+ task: string;
21
+ /** Cost preference */
22
+ costPreference?: CostPreference;
23
+ /** Max budget in USD (e.g., 1.0 = $1) */
24
+ maxBudgetUSD?: number;
25
+ /** Prefer specific protocol */
26
+ preferProtocol?: string;
27
+ /** Prefer specific source */
28
+ preferSource?: string;
29
+ /** Timeout per capability in ms */
30
+ timeout?: number;
31
+ /** Return options without executing (dry run) */
32
+ dryRun?: boolean;
33
+ /** Additional payload to send to the capability */
34
+ payload?: Record<string, unknown>;
35
+ }
36
+ export interface CapabilityOption {
37
+ agent: UnifiedAgent;
38
+ scores: MatchResult["scores"];
39
+ estimatedCost: number | null;
40
+ protocol: string;
41
+ source: string;
42
+ why: string;
43
+ }
44
+ export interface DoResult {
45
+ success: boolean;
46
+ /** The task that was requested */
47
+ task: string;
48
+ /** All options found across protocols */
49
+ options: CapabilityOption[];
50
+ /** The option that was selected and executed */
51
+ selected: CapabilityOption | null;
52
+ /** Result from executing the selected option */
53
+ execution: BridgeHireResult | null;
54
+ /** Discovery metadata */
55
+ discovery: {
56
+ sourcesQueried: number;
57
+ totalFound: number;
58
+ queryTimeMs: number;
59
+ };
60
+ /** Why this option was selected */
61
+ reasoning: string;
62
+ }
63
+ export declare class CapabilityRouter {
64
+ private aggregator;
65
+ private bridge;
66
+ constructor(aggregator: Aggregator, bridge: ProtocolBridge);
67
+ do(options: DoOptions): Promise<DoResult>;
68
+ private buildOption;
69
+ private applyPreferences;
70
+ private explainChoice;
71
+ }
72
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAA2B,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,cAAc,CAAC;AAEtE,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,gDAAgD;IAChD,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,gDAAgD;IAChD,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,yBAAyB;IACzB,SAAS,EAAE;QACT,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAiB;gBAEnB,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc;IAKpD,EAAE,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;IA0F/C,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,gBAAgB;IAyDxB,OAAO,CAAC,aAAa;CA2BtB"}
package/dist/router.js ADDED
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Kompass Capability Router
3
+ *
4
+ * The core product logic. Given a task, figure out the best way to get it done.
5
+ *
6
+ * kompass.do("get DeFi yield data") →
7
+ * 1. Parse intent → what capability is needed
8
+ * 2. Search all sources → where can I get it
9
+ * 3. Rank options → cost, speed, reliability, reputation
10
+ * 4. Execute via right protocol → ACP, x402, MCP, skill, A2A
11
+ * 5. Return result
12
+ */
13
+ import { rankAgents } from "./matching.js";
14
+ export class CapabilityRouter {
15
+ aggregator;
16
+ bridge;
17
+ constructor(aggregator, bridge) {
18
+ this.aggregator = aggregator;
19
+ this.bridge = bridge;
20
+ }
21
+ async do(options) {
22
+ const { task, dryRun = false } = options;
23
+ // 1. Search all sources
24
+ const searchResult = await this.aggregator.search(task, {
25
+ limit: 30,
26
+ timeout: options.timeout ?? 15000,
27
+ });
28
+ if (searchResult.agents.length === 0) {
29
+ return {
30
+ success: false,
31
+ task,
32
+ options: [],
33
+ selected: null,
34
+ execution: null,
35
+ discovery: {
36
+ sourcesQueried: searchResult.sources.length,
37
+ totalFound: 0,
38
+ queryTimeMs: searchResult.queryTimeMs,
39
+ },
40
+ reasoning: "No capabilities found for this task across any registry.",
41
+ };
42
+ }
43
+ // 2. Rank with multi-layer matching
44
+ const ranked = rankAgents(searchResult.agents, task);
45
+ // 3. Build options with cost estimates
46
+ const capabilityOptions = ranked.map((r) => this.buildOption(r, options));
47
+ // 4. Filter by budget
48
+ const affordable = options.maxBudgetUSD
49
+ ? capabilityOptions.filter((o) => o.estimatedCost === null || o.estimatedCost <= options.maxBudgetUSD)
50
+ : capabilityOptions;
51
+ // 5. Apply preference-based reranking
52
+ const reranked = this.applyPreferences(affordable.length > 0 ? affordable : capabilityOptions, options);
53
+ // 6. Select best option
54
+ const selected = reranked[0] ?? null;
55
+ if (!selected) {
56
+ return {
57
+ success: false,
58
+ task,
59
+ options: capabilityOptions,
60
+ selected: null,
61
+ execution: null,
62
+ discovery: {
63
+ sourcesQueried: searchResult.sources.length,
64
+ totalFound: searchResult.totalFound,
65
+ queryTimeMs: searchResult.queryTimeMs,
66
+ },
67
+ reasoning: options.maxBudgetUSD
68
+ ? `Found ${capabilityOptions.length} options but none within budget ($${options.maxBudgetUSD}).`
69
+ : "No suitable options found after ranking.",
70
+ };
71
+ }
72
+ // 7. Execute (unless dry run)
73
+ let execution = null;
74
+ if (!dryRun) {
75
+ execution = await this.bridge.hire(selected.agent, {
76
+ task,
77
+ timeout: options.timeout,
78
+ payload: options.payload,
79
+ });
80
+ }
81
+ const reasoning = this.explainChoice(selected, reranked, options);
82
+ return {
83
+ success: dryRun ? true : (execution?.success ?? false),
84
+ task,
85
+ options: capabilityOptions.slice(0, 10), // Top 10 options
86
+ selected,
87
+ execution,
88
+ discovery: {
89
+ sourcesQueried: searchResult.sources.length,
90
+ totalFound: searchResult.totalFound,
91
+ queryTimeMs: searchResult.queryTimeMs,
92
+ },
93
+ reasoning,
94
+ };
95
+ }
96
+ buildOption(match, options) {
97
+ const agent = match.agent;
98
+ let estimatedCost = null;
99
+ if (agent.pricing?.amount) {
100
+ estimatedCost = parseFloat(agent.pricing.amount);
101
+ }
102
+ else if (agent.pricing?.model === "free") {
103
+ estimatedCost = 0;
104
+ }
105
+ let why = "";
106
+ if (match.scores.structured > 10)
107
+ why += "Strong capability match. ";
108
+ if (match.scores.bm25 > 5)
109
+ why += "High text relevance. ";
110
+ if (match.scores.multiCriteria > 15)
111
+ why += "Good reputation/trust signals. ";
112
+ if (estimatedCost === 0)
113
+ why += "Free. ";
114
+ if (estimatedCost !== null && estimatedCost > 0 && estimatedCost < 0.05)
115
+ why += "Very affordable. ";
116
+ return {
117
+ agent,
118
+ scores: match.scores,
119
+ estimatedCost,
120
+ protocol: agent.protocol,
121
+ source: agent.source,
122
+ why: why.trim() || "General match.",
123
+ };
124
+ }
125
+ applyPreferences(options, doOptions) {
126
+ let sorted = [...options];
127
+ // Protocol preference
128
+ if (doOptions.preferProtocol) {
129
+ sorted.sort((a, b) => {
130
+ const aMatch = a.protocol === doOptions.preferProtocol ? 1 : 0;
131
+ const bMatch = b.protocol === doOptions.preferProtocol ? 1 : 0;
132
+ return bMatch - aMatch;
133
+ });
134
+ }
135
+ // Source preference
136
+ if (doOptions.preferSource) {
137
+ sorted.sort((a, b) => {
138
+ const aMatch = a.source === doOptions.preferSource ? 1 : 0;
139
+ const bMatch = b.source === doOptions.preferSource ? 1 : 0;
140
+ return bMatch - aMatch;
141
+ });
142
+ }
143
+ // Cost preference reranking
144
+ switch (doOptions.costPreference) {
145
+ case "cheapest":
146
+ sorted.sort((a, b) => {
147
+ const aCost = a.estimatedCost ?? Infinity;
148
+ const bCost = b.estimatedCost ?? Infinity;
149
+ return aCost - bCost;
150
+ });
151
+ break;
152
+ case "best-quality":
153
+ // Already sorted by score, but boost high-reputation agents
154
+ sorted.sort((a, b) => {
155
+ const aRep = a.agent.reputation?.score ?? 0;
156
+ const bRep = b.agent.reputation?.score ?? 0;
157
+ return bRep - aRep || b.scores.total - a.scores.total;
158
+ });
159
+ break;
160
+ case "balanced":
161
+ default:
162
+ // Default: score-based with cost as tiebreaker
163
+ sorted.sort((a, b) => {
164
+ if (Math.abs(b.scores.total - a.scores.total) > 5) {
165
+ return b.scores.total - a.scores.total;
166
+ }
167
+ const aCost = a.estimatedCost ?? 1;
168
+ const bCost = b.estimatedCost ?? 1;
169
+ return aCost - bCost;
170
+ });
171
+ break;
172
+ }
173
+ return sorted;
174
+ }
175
+ explainChoice(selected, alternatives, options) {
176
+ const parts = [];
177
+ parts.push(`Selected "${selected.agent.name}" via ${selected.protocol.toUpperCase()} from ${selected.source}.`);
178
+ if (selected.estimatedCost !== null) {
179
+ parts.push(selected.estimatedCost === 0
180
+ ? "This option is free."
181
+ : `Estimated cost: $${selected.estimatedCost}.`);
182
+ }
183
+ parts.push(selected.why);
184
+ if (alternatives.length > 1) {
185
+ parts.push(`${alternatives.length - 1} other options available.`);
186
+ }
187
+ return parts.join(" ");
188
+ }
189
+ }
190
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Kompass Simplified API
3
+ *
4
+ * Dead-simple interface for agent-to-agent commerce.
5
+ * Wraps ACP escrow + Kompass intelligence (reputation, x402, intent routing).
6
+ *
7
+ * Usage:
8
+ * const kompass = await KompassSimple.create({ privateKey, network: "base-sepolia" });
9
+ * const result = await kompass.hireAgent({ task: "Find best yield on Base", maxBudget: 1_000_000n });
10
+ */
11
+ import type { Address } from "viem";
12
+ import type { AgentSearchResult, IncomingJob } from "./backends/types.js";
13
+ import type { ReputationSummary } from "./types.js";
14
+ export interface KompassSimpleConfig {
15
+ /** Agent's private key */
16
+ privateKey: string;
17
+ /** Network: "base-sepolia" or "base" */
18
+ network?: "base-sepolia" | "base";
19
+ /** ACP entity/session key address (from ACP registration) */
20
+ acpEntityAddress?: string;
21
+ /** ACP wallet address */
22
+ acpWalletAddress?: string;
23
+ /** Kompass indexer URL for ENS discovery + reputation */
24
+ indexerUrl?: string;
25
+ /** ERC-8004 reputation registry address */
26
+ reputationRegistryAddress?: Address;
27
+ /** Custom RPC URL */
28
+ rpcUrl?: string;
29
+ }
30
+ export interface HireOptions {
31
+ /** What you want done — natural language task description */
32
+ task: string;
33
+ /** Max budget in USDC base units (6 decimals). 1_000_000 = $1 */
34
+ maxBudget?: bigint;
35
+ /** Minimum ERC-8004 reputation score to trust an agent */
36
+ minReputation?: number;
37
+ /** Search query override (defaults to task) */
38
+ searchQuery?: string;
39
+ /** Specific offering ID if known */
40
+ offeringId?: string;
41
+ /** Additional requirements to send to the agent */
42
+ requirements?: Record<string, unknown>;
43
+ /** Timeout in ms for waiting for deliverable (default 5 min) */
44
+ timeoutMs?: number;
45
+ }
46
+ export interface HireResult {
47
+ agent: AgentSearchResult;
48
+ jobId: string;
49
+ deliverable: unknown;
50
+ phase: string;
51
+ reputationChecked: boolean;
52
+ txHash?: string;
53
+ }
54
+ export interface AcceptJobsOptions {
55
+ /** What capabilities this agent offers */
56
+ capabilities: string[];
57
+ /** Handler called when a job comes in — return the deliverable */
58
+ handler: (job: IncomingJob) => Promise<unknown>;
59
+ }
60
+ export interface OrchestrateOptions {
61
+ /** High-level intent — will be decomposed into multiple agent hires */
62
+ intent: string;
63
+ /** Risk tolerance for DeFi intents */
64
+ riskTolerance?: "conservative" | "balanced" | "aggressive";
65
+ /** Total budget across all steps */
66
+ budget?: bigint;
67
+ /** Minimum reputation for any hired agent */
68
+ minReputation?: number;
69
+ }
70
+ export interface OrchestrateResult {
71
+ intent: string;
72
+ steps: {
73
+ role: string;
74
+ agent: AgentSearchResult | null;
75
+ result: HireResult | null;
76
+ skipped: boolean;
77
+ reason?: string;
78
+ }[];
79
+ totalCostUSDC: number;
80
+ completedSteps: number;
81
+ }
82
+ export declare class KompassSimple {
83
+ private backend;
84
+ private config;
85
+ private kompassConfig;
86
+ private constructor();
87
+ /**
88
+ * Create and initialize a Kompass instance.
89
+ *
90
+ * @example
91
+ * const kompass = await KompassSimple.create({
92
+ * privateKey: "0x...",
93
+ * network: "base-sepolia",
94
+ * acpEntityAddress: "0x...",
95
+ * acpWalletAddress: "0x...",
96
+ * });
97
+ */
98
+ static create(config: KompassSimpleConfig): Promise<KompassSimple>;
99
+ /**
100
+ * Hire an agent to do a task.
101
+ *
102
+ * Under the hood:
103
+ * 1. Searches ACP marketplace for matching agents
104
+ * 2. Checks ERC-8004 reputation (if configured)
105
+ * 3. Creates an ACP job and waits for delivery
106
+ * 4. Returns the deliverable
107
+ *
108
+ * @example
109
+ * const result = await kompass.hireAgent({
110
+ * task: "Find the best yield for 1000 USDC on Base",
111
+ * maxBudget: 1_000_000n,
112
+ * });
113
+ * console.log(result.deliverable);
114
+ */
115
+ hireAgent(options: HireOptions): Promise<HireResult>;
116
+ /**
117
+ * Start accepting jobs from other agents.
118
+ *
119
+ * Registers on ACP and listens for incoming jobs matching your capabilities.
120
+ * When a job arrives, your handler is called. Return the deliverable and
121
+ * the SDK handles ACP delivery automatically.
122
+ *
123
+ * @example
124
+ * await kompass.acceptJobs({
125
+ * capabilities: ["defi-research", "yield-analysis"],
126
+ * handler: async (job) => {
127
+ * const report = await doResearch(job.description);
128
+ * return report;
129
+ * },
130
+ * });
131
+ */
132
+ acceptJobs(options: AcceptJobsOptions): Promise<void>;
133
+ /**
134
+ * Orchestrate a multi-agent pipeline for a complex intent.
135
+ *
136
+ * Decomposes the intent into specialist roles (research, data, risk, execution),
137
+ * hires an agent for each role via ACP, chains results, and returns the combined output.
138
+ *
139
+ * @example
140
+ * const result = await kompass.orchestrate({
141
+ * intent: "Find best yield for 1000 USDC on Base",
142
+ * riskTolerance: "balanced",
143
+ * budget: 5_000_000n,
144
+ * });
145
+ */
146
+ orchestrate(options: OrchestrateOptions): Promise<OrchestrateResult>;
147
+ /**
148
+ * Check an agent's ERC-8004 on-chain reputation.
149
+ */
150
+ checkReputation(agentAddress: Address): Promise<ReputationSummary>;
151
+ /**
152
+ * Search for agents on ACP marketplace.
153
+ */
154
+ discover(query: string, options?: {
155
+ limit?: number;
156
+ }): Promise<AgentSearchResult[]>;
157
+ /** Get the backend name */
158
+ get backendName(): string;
159
+ }
160
+ //# sourceMappingURL=simple.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple.d.ts","sourceRoot":"","sources":["../src/simple.ts"],"names":[],"mappings":"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"}
package/dist/simple.js ADDED
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Kompass Simplified API
3
+ *
4
+ * Dead-simple interface for agent-to-agent commerce.
5
+ * Wraps ACP escrow + Kompass intelligence (reputation, x402, intent routing).
6
+ *
7
+ * Usage:
8
+ * const kompass = await KompassSimple.create({ privateKey, network: "base-sepolia" });
9
+ * const result = await kompass.hireAgent({ task: "Find best yield on Base", maxBudget: 1_000_000n });
10
+ */
11
+ import { createPublicClient, http } from "viem";
12
+ import { baseSepolia, base } from "viem/chains";
13
+ import { privateKeyToAccount } from "viem/accounts";
14
+ import { AcpEscrowBackend } from "./backends/acp.js";
15
+ import { getReputation } from "./reputation.js";
16
+ // ── Main Class ───────────────────────────────────────────
17
+ export class KompassSimple {
18
+ backend;
19
+ config;
20
+ kompassConfig = null;
21
+ constructor(config, backend) {
22
+ this.config = config;
23
+ this.backend = backend;
24
+ }
25
+ /**
26
+ * Create and initialize a Kompass instance.
27
+ *
28
+ * @example
29
+ * const kompass = await KompassSimple.create({
30
+ * privateKey: "0x...",
31
+ * network: "base-sepolia",
32
+ * acpEntityAddress: "0x...",
33
+ * acpWalletAddress: "0x...",
34
+ * });
35
+ */
36
+ static async create(config) {
37
+ const account = privateKeyToAccount(config.privateKey);
38
+ const chain = config.network === "base" ? base : baseSepolia;
39
+ const rpcUrl = config.rpcUrl ?? (config.network === "base" ? "https://mainnet.base.org" : "https://sepolia.base.org");
40
+ // Create ACP backend
41
+ const acpConfig = {
42
+ privateKey: config.privateKey,
43
+ walletAddress: (config.acpWalletAddress ?? account.address),
44
+ entityAddress: (config.acpEntityAddress ?? account.address),
45
+ network: config.network ?? "base-sepolia",
46
+ rpcUrl,
47
+ };
48
+ const backend = new AcpEscrowBackend(acpConfig);
49
+ await backend.init();
50
+ const instance = new KompassSimple(config, backend);
51
+ // Set up Kompass config for reputation queries if registry address provided
52
+ if (config.reputationRegistryAddress) {
53
+ const publicClient = createPublicClient({
54
+ chain,
55
+ transport: http(rpcUrl),
56
+ });
57
+ instance.kompassConfig = {
58
+ publicClient,
59
+ escrowAddress: "0x0000000000000000000000000000000000000000",
60
+ registryAddress: "0x0000000000000000000000000000000000000000",
61
+ reputationRegistryAddress: config.reputationRegistryAddress,
62
+ indexerUrl: config.indexerUrl ?? "",
63
+ };
64
+ }
65
+ return instance;
66
+ }
67
+ /**
68
+ * Hire an agent to do a task.
69
+ *
70
+ * Under the hood:
71
+ * 1. Searches ACP marketplace for matching agents
72
+ * 2. Checks ERC-8004 reputation (if configured)
73
+ * 3. Creates an ACP job and waits for delivery
74
+ * 4. Returns the deliverable
75
+ *
76
+ * @example
77
+ * const result = await kompass.hireAgent({
78
+ * task: "Find the best yield for 1000 USDC on Base",
79
+ * maxBudget: 1_000_000n,
80
+ * });
81
+ * console.log(result.deliverable);
82
+ */
83
+ async hireAgent(options) {
84
+ const query = options.searchQuery ?? options.task;
85
+ // 1. Discover agents on ACP
86
+ const agents = await this.backend.browseAgents(query, {
87
+ limit: 10,
88
+ sortBy: "successRate",
89
+ onlineOnly: true,
90
+ });
91
+ if (agents.length === 0) {
92
+ throw new Error(`No agents found for: "${query}"`);
93
+ }
94
+ // 2. Check reputation (if configured)
95
+ let reputationChecked = false;
96
+ let filteredAgents = agents;
97
+ if (this.kompassConfig && options.minReputation !== undefined) {
98
+ filteredAgents = [];
99
+ for (const agent of agents) {
100
+ try {
101
+ const rep = await this.checkReputation(agent.address);
102
+ const score = Number(rep.summaryValue);
103
+ if (score >= options.minReputation || Number(rep.count) === 0) {
104
+ filteredAgents.push(agent);
105
+ }
106
+ }
107
+ catch {
108
+ // If reputation check fails, include the agent (permissive)
109
+ filteredAgents.push(agent);
110
+ }
111
+ }
112
+ reputationChecked = true;
113
+ if (filteredAgents.length === 0) {
114
+ throw new Error(`No agents meet reputation threshold (${options.minReputation}). Found ${agents.length} agents but none passed.`);
115
+ }
116
+ }
117
+ // 3. Select best agent (first match after filtering)
118
+ const agent = filteredAgents[0];
119
+ const offering = agent.offerings[0];
120
+ if (!offering) {
121
+ throw new Error(`Agent "${agent.name}" has no offerings`);
122
+ }
123
+ // 4. Create job on ACP
124
+ const requirements = {
125
+ description: options.task,
126
+ ...options.requirements,
127
+ };
128
+ const job = await this.backend.hireAgent(agent, options.offeringId ?? offering.id, requirements, options.maxBudget);
129
+ // 5. Wait for result
130
+ const result = await this.backend.waitForResult(job.jobId, options.timeoutMs ?? 300_000);
131
+ return {
132
+ agent,
133
+ jobId: result.jobId,
134
+ deliverable: result.deliverable,
135
+ phase: result.phase,
136
+ reputationChecked,
137
+ txHash: result.txHash,
138
+ };
139
+ }
140
+ /**
141
+ * Start accepting jobs from other agents.
142
+ *
143
+ * Registers on ACP and listens for incoming jobs matching your capabilities.
144
+ * When a job arrives, your handler is called. Return the deliverable and
145
+ * the SDK handles ACP delivery automatically.
146
+ *
147
+ * @example
148
+ * await kompass.acceptJobs({
149
+ * capabilities: ["defi-research", "yield-analysis"],
150
+ * handler: async (job) => {
151
+ * const report = await doResearch(job.description);
152
+ * return report;
153
+ * },
154
+ * });
155
+ */
156
+ async acceptJobs(options) {
157
+ await this.backend.acceptJobs(options.capabilities, options.handler);
158
+ }
159
+ /**
160
+ * Orchestrate a multi-agent pipeline for a complex intent.
161
+ *
162
+ * Decomposes the intent into specialist roles (research, data, risk, execution),
163
+ * hires an agent for each role via ACP, chains results, and returns the combined output.
164
+ *
165
+ * @example
166
+ * const result = await kompass.orchestrate({
167
+ * intent: "Find best yield for 1000 USDC on Base",
168
+ * riskTolerance: "balanced",
169
+ * budget: 5_000_000n,
170
+ * });
171
+ */
172
+ async orchestrate(options) {
173
+ const roles = ["research", "premium-data", "risk", "execution"];
174
+ const perStepBudget = options.budget
175
+ ? options.budget / BigInt(roles.length)
176
+ : 1000000n;
177
+ const steps = [];
178
+ let totalCost = 0;
179
+ for (const role of roles) {
180
+ try {
181
+ const result = await this.hireAgent({
182
+ task: `[${role}] ${options.intent}`,
183
+ searchQuery: role === "premium-data" ? "data analytics" : role,
184
+ maxBudget: perStepBudget,
185
+ minReputation: options.minReputation,
186
+ timeoutMs: 120_000,
187
+ });
188
+ steps.push({
189
+ role,
190
+ agent: result.agent,
191
+ result,
192
+ skipped: false,
193
+ });
194
+ totalCost += Number(perStepBudget) / 1e6;
195
+ }
196
+ catch (err) {
197
+ steps.push({
198
+ role,
199
+ agent: null,
200
+ result: null,
201
+ skipped: true,
202
+ reason: err instanceof Error ? err.message : String(err),
203
+ });
204
+ }
205
+ }
206
+ return {
207
+ intent: options.intent,
208
+ steps,
209
+ totalCostUSDC: totalCost,
210
+ completedSteps: steps.filter((s) => !s.skipped).length,
211
+ };
212
+ }
213
+ /**
214
+ * Check an agent's ERC-8004 on-chain reputation.
215
+ */
216
+ async checkReputation(agentAddress) {
217
+ if (!this.kompassConfig) {
218
+ throw new Error("Reputation checking requires reputationRegistryAddress in config");
219
+ }
220
+ // Use agent address as ID (simplified — in production, look up erc8004Id)
221
+ return getReputation(this.kompassConfig, 0n);
222
+ }
223
+ /**
224
+ * Search for agents on ACP marketplace.
225
+ */
226
+ async discover(query, options) {
227
+ return this.backend.browseAgents(query, {
228
+ limit: options?.limit ?? 20,
229
+ sortBy: "successRate",
230
+ });
231
+ }
232
+ /** Get the backend name */
233
+ get backendName() {
234
+ return this.backend.name();
235
+ }
236
+ }
237
+ //# sourceMappingURL=simple.js.map