clawd-automaton 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 (228) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +178 -0
  3. package/constitution.md +25 -0
  4. package/dist/__tests__/heartbeat.test.d.ts +7 -0
  5. package/dist/__tests__/heartbeat.test.d.ts.map +1 -0
  6. package/dist/__tests__/heartbeat.test.js +125 -0
  7. package/dist/__tests__/heartbeat.test.js.map +1 -0
  8. package/dist/__tests__/loop.test.d.ts +7 -0
  9. package/dist/__tests__/loop.test.d.ts.map +1 -0
  10. package/dist/__tests__/loop.test.js +150 -0
  11. package/dist/__tests__/loop.test.js.map +1 -0
  12. package/dist/__tests__/mocks.d.ts +72 -0
  13. package/dist/__tests__/mocks.d.ts.map +1 -0
  14. package/dist/__tests__/mocks.js +197 -0
  15. package/dist/__tests__/mocks.js.map +1 -0
  16. package/dist/agent/context.d.ts +26 -0
  17. package/dist/agent/context.d.ts.map +1 -0
  18. package/dist/agent/context.js +115 -0
  19. package/dist/agent/context.js.map +1 -0
  20. package/dist/agent/injection-defense.d.ts +13 -0
  21. package/dist/agent/injection-defense.d.ts.map +1 -0
  22. package/dist/agent/injection-defense.js +236 -0
  23. package/dist/agent/injection-defense.js.map +1 -0
  24. package/dist/agent/loop.d.ts +25 -0
  25. package/dist/agent/loop.d.ts.map +1 -0
  26. package/dist/agent/loop.js +263 -0
  27. package/dist/agent/loop.js.map +1 -0
  28. package/dist/agent/system-prompt.d.ts +30 -0
  29. package/dist/agent/system-prompt.d.ts.map +1 -0
  30. package/dist/agent/system-prompt.js +241 -0
  31. package/dist/agent/system-prompt.js.map +1 -0
  32. package/dist/agent/tools.d.ts +17 -0
  33. package/dist/agent/tools.d.ts.map +1 -0
  34. package/dist/agent/tools.js +1413 -0
  35. package/dist/agent/tools.js.map +1 -0
  36. package/dist/clawd/backroom.d.ts +54 -0
  37. package/dist/clawd/backroom.d.ts.map +1 -0
  38. package/dist/clawd/backroom.js +130 -0
  39. package/dist/clawd/backroom.js.map +1 -0
  40. package/dist/clawd/client.d.ts +16 -0
  41. package/dist/clawd/client.d.ts.map +1 -0
  42. package/dist/clawd/client.js +256 -0
  43. package/dist/clawd/client.js.map +1 -0
  44. package/dist/clawd/convex-client.d.ts +130 -0
  45. package/dist/clawd/convex-client.d.ts.map +1 -0
  46. package/dist/clawd/convex-client.js +118 -0
  47. package/dist/clawd/convex-client.js.map +1 -0
  48. package/dist/clawd/credits.d.ts +24 -0
  49. package/dist/clawd/credits.d.ts.map +1 -0
  50. package/dist/clawd/credits.js +64 -0
  51. package/dist/clawd/credits.js.map +1 -0
  52. package/dist/clawd/deepseek-inference.d.ts +40 -0
  53. package/dist/clawd/deepseek-inference.d.ts.map +1 -0
  54. package/dist/clawd/deepseek-inference.js +143 -0
  55. package/dist/clawd/deepseek-inference.js.map +1 -0
  56. package/dist/clawd/inference.d.ts +17 -0
  57. package/dist/clawd/inference.d.ts.map +1 -0
  58. package/dist/clawd/inference.js +114 -0
  59. package/dist/clawd/inference.js.map +1 -0
  60. package/dist/clawd/x402.d.ts +48 -0
  61. package/dist/clawd/x402.d.ts.map +1 -0
  62. package/dist/clawd/x402.js +350 -0
  63. package/dist/clawd/x402.js.map +1 -0
  64. package/dist/config.d.ts +36 -0
  65. package/dist/config.d.ts.map +1 -0
  66. package/dist/config.js +84 -0
  67. package/dist/config.js.map +1 -0
  68. package/dist/git/state-versioning.d.ts +39 -0
  69. package/dist/git/state-versioning.d.ts.map +1 -0
  70. package/dist/git/state-versioning.js +93 -0
  71. package/dist/git/state-versioning.js.map +1 -0
  72. package/dist/git/tools.d.ts +40 -0
  73. package/dist/git/tools.d.ts.map +1 -0
  74. package/dist/git/tools.js +140 -0
  75. package/dist/git/tools.js.map +1 -0
  76. package/dist/heartbeat/config.d.ts +23 -0
  77. package/dist/heartbeat/config.d.ts.map +1 -0
  78. package/dist/heartbeat/config.js +156 -0
  79. package/dist/heartbeat/config.js.map +1 -0
  80. package/dist/heartbeat/daemon.d.ts +28 -0
  81. package/dist/heartbeat/daemon.d.ts.map +1 -0
  82. package/dist/heartbeat/daemon.js +141 -0
  83. package/dist/heartbeat/daemon.js.map +1 -0
  84. package/dist/heartbeat/tasks.d.ts +24 -0
  85. package/dist/heartbeat/tasks.d.ts.map +1 -0
  86. package/dist/heartbeat/tasks.js +277 -0
  87. package/dist/heartbeat/tasks.js.map +1 -0
  88. package/dist/identity/provision.d.ts +28 -0
  89. package/dist/identity/provision.d.ts.map +1 -0
  90. package/dist/identity/provision.js +131 -0
  91. package/dist/identity/provision.js.map +1 -0
  92. package/dist/identity/wallet.d.ts +28 -0
  93. package/dist/identity/wallet.d.ts.map +1 -0
  94. package/dist/identity/wallet.js +69 -0
  95. package/dist/identity/wallet.js.map +1 -0
  96. package/dist/index.d.ts +10 -0
  97. package/dist/index.d.ts.map +1 -0
  98. package/dist/index.js +358 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/ooda/claude-decision.d.ts +18 -0
  101. package/dist/ooda/claude-decision.d.ts.map +1 -0
  102. package/dist/ooda/claude-decision.js +82 -0
  103. package/dist/ooda/claude-decision.js.map +1 -0
  104. package/dist/ooda/journal.d.ts +22 -0
  105. package/dist/ooda/journal.d.ts.map +1 -0
  106. package/dist/ooda/journal.js +26 -0
  107. package/dist/ooda/journal.js.map +1 -0
  108. package/dist/ooda/loop.d.ts +3 -0
  109. package/dist/ooda/loop.d.ts.map +1 -0
  110. package/dist/ooda/loop.js +210 -0
  111. package/dist/ooda/loop.js.map +1 -0
  112. package/dist/ooda/observe.d.ts +21 -0
  113. package/dist/ooda/observe.d.ts.map +1 -0
  114. package/dist/ooda/observe.js +75 -0
  115. package/dist/ooda/observe.js.map +1 -0
  116. package/dist/ooda/state.d.ts +34 -0
  117. package/dist/ooda/state.d.ts.map +1 -0
  118. package/dist/ooda/state.js +48 -0
  119. package/dist/ooda/state.js.map +1 -0
  120. package/dist/ooda/tui.d.ts +3 -0
  121. package/dist/ooda/tui.d.ts.map +1 -0
  122. package/dist/ooda/tui.js +132 -0
  123. package/dist/ooda/tui.js.map +1 -0
  124. package/dist/ooda/validate.d.ts +33 -0
  125. package/dist/ooda/validate.d.ts.map +1 -0
  126. package/dist/ooda/validate.js +91 -0
  127. package/dist/ooda/validate.js.map +1 -0
  128. package/dist/registry/agent-card.d.ts +26 -0
  129. package/dist/registry/agent-card.d.ts.map +1 -0
  130. package/dist/registry/agent-card.js +94 -0
  131. package/dist/registry/agent-card.js.map +1 -0
  132. package/dist/registry/discovery.d.ts +24 -0
  133. package/dist/registry/discovery.d.ts.map +1 -0
  134. package/dist/registry/discovery.js +74 -0
  135. package/dist/registry/discovery.js.map +1 -0
  136. package/dist/registry/erc8004.d.ts +39 -0
  137. package/dist/registry/erc8004.d.ts.map +1 -0
  138. package/dist/registry/erc8004.js +209 -0
  139. package/dist/registry/erc8004.js.map +1 -0
  140. package/dist/replication/genesis.d.ts +26 -0
  141. package/dist/replication/genesis.d.ts.map +1 -0
  142. package/dist/replication/genesis.js +72 -0
  143. package/dist/replication/genesis.js.map +1 -0
  144. package/dist/replication/lineage.d.ts +35 -0
  145. package/dist/replication/lineage.d.ts.map +1 -0
  146. package/dist/replication/lineage.js +79 -0
  147. package/dist/replication/lineage.js.map +1 -0
  148. package/dist/replication/spawn.d.ts +25 -0
  149. package/dist/replication/spawn.d.ts.map +1 -0
  150. package/dist/replication/spawn.js +166 -0
  151. package/dist/replication/spawn.js.map +1 -0
  152. package/dist/self-mod/audit-log.d.ts +24 -0
  153. package/dist/self-mod/audit-log.d.ts.map +1 -0
  154. package/dist/self-mod/audit-log.js +49 -0
  155. package/dist/self-mod/audit-log.js.map +1 -0
  156. package/dist/self-mod/code.d.ts +51 -0
  157. package/dist/self-mod/code.d.ts.map +1 -0
  158. package/dist/self-mod/code.js +317 -0
  159. package/dist/self-mod/code.js.map +1 -0
  160. package/dist/self-mod/tools-manager.d.ts +30 -0
  161. package/dist/self-mod/tools-manager.d.ts.map +1 -0
  162. package/dist/self-mod/tools-manager.js +74 -0
  163. package/dist/self-mod/tools-manager.js.map +1 -0
  164. package/dist/self-mod/upstream.d.ts +36 -0
  165. package/dist/self-mod/upstream.d.ts.map +1 -0
  166. package/dist/self-mod/upstream.js +66 -0
  167. package/dist/self-mod/upstream.js.map +1 -0
  168. package/dist/setup/banner.d.ts +2 -0
  169. package/dist/setup/banner.d.ts.map +1 -0
  170. package/dist/setup/banner.js +22 -0
  171. package/dist/setup/banner.js.map +1 -0
  172. package/dist/setup/defaults.d.ts +3 -0
  173. package/dist/setup/defaults.d.ts.map +1 -0
  174. package/dist/setup/defaults.js +113 -0
  175. package/dist/setup/defaults.js.map +1 -0
  176. package/dist/setup/environment.d.ts +6 -0
  177. package/dist/setup/environment.d.ts.map +1 -0
  178. package/dist/setup/environment.js +24 -0
  179. package/dist/setup/environment.js.map +1 -0
  180. package/dist/setup/prompts.d.ts +5 -0
  181. package/dist/setup/prompts.d.ts.map +1 -0
  182. package/dist/setup/prompts.js +70 -0
  183. package/dist/setup/prompts.js.map +1 -0
  184. package/dist/setup/wizard.d.ts +3 -0
  185. package/dist/setup/wizard.d.ts.map +1 -0
  186. package/dist/setup/wizard.js +128 -0
  187. package/dist/setup/wizard.js.map +1 -0
  188. package/dist/skills/format.d.ts +14 -0
  189. package/dist/skills/format.d.ts.map +1 -0
  190. package/dist/skills/format.js +145 -0
  191. package/dist/skills/format.js.map +1 -0
  192. package/dist/skills/loader.d.ts +19 -0
  193. package/dist/skills/loader.d.ts.map +1 -0
  194. package/dist/skills/loader.js +98 -0
  195. package/dist/skills/loader.js.map +1 -0
  196. package/dist/skills/registry.d.ts +31 -0
  197. package/dist/skills/registry.d.ts.map +1 -0
  198. package/dist/skills/registry.js +111 -0
  199. package/dist/skills/registry.js.map +1 -0
  200. package/dist/social/client.d.ts +13 -0
  201. package/dist/social/client.d.ts.map +1 -0
  202. package/dist/social/client.js +89 -0
  203. package/dist/social/client.js.map +1 -0
  204. package/dist/state/database.d.ts +9 -0
  205. package/dist/state/database.d.ts.map +1 -0
  206. package/dist/state/database.js +401 -0
  207. package/dist/state/database.js.map +1 -0
  208. package/dist/state/schema.d.ts +11 -0
  209. package/dist/state/schema.d.ts.map +1 -0
  210. package/dist/state/schema.js +232 -0
  211. package/dist/state/schema.js.map +1 -0
  212. package/dist/survival/funding.d.ts +19 -0
  213. package/dist/survival/funding.d.ts.map +1 -0
  214. package/dist/survival/funding.js +62 -0
  215. package/dist/survival/funding.js.map +1 -0
  216. package/dist/survival/low-compute.d.ts +30 -0
  217. package/dist/survival/low-compute.d.ts.map +1 -0
  218. package/dist/survival/low-compute.js +72 -0
  219. package/dist/survival/low-compute.js.map +1 -0
  220. package/dist/survival/monitor.d.ts +23 -0
  221. package/dist/survival/monitor.d.ts.map +1 -0
  222. package/dist/survival/monitor.js +70 -0
  223. package/dist/survival/monitor.js.map +1 -0
  224. package/dist/types.d.ts +461 -0
  225. package/dist/types.d.ts.map +1 -0
  226. package/dist/types.js +25 -0
  227. package/dist/types.js.map +1 -0
  228. package/package.json +85 -0
@@ -0,0 +1,33 @@
1
+ import type { Book } from "./state.js";
2
+ export interface RalphConfig {
3
+ mode: "paper";
4
+ network: "devnet";
5
+ max_action_per_tick: number;
6
+ max_position_size_lamports: number;
7
+ loss_killswitch_consecutive: number;
8
+ goblin: boolean;
9
+ dark_defi_armed: boolean;
10
+ tick_sleep_ms: number;
11
+ model: string;
12
+ }
13
+ export type Decision = {
14
+ action: "hold";
15
+ reason: string;
16
+ } | {
17
+ action: "open";
18
+ side: "long" | "short";
19
+ size_lamports: number;
20
+ reason: string;
21
+ } | {
22
+ action: "close";
23
+ position_id: string;
24
+ reason: string;
25
+ };
26
+ export interface ValidationResult {
27
+ ok: boolean;
28
+ decision: Decision;
29
+ violation?: string;
30
+ }
31
+ export declare function validate(raw: unknown, config: RalphConfig, book: Book): ValidationResult;
32
+ export declare function parseRalphConfig(markdownContent: string): RalphConfig;
33
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/ooda/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0BAA0B,EAAE,MAAM,CAAC;IACnC,2BAA2B,EAAE,MAAM,CAAC;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,QAAQ,GAChB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjF;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,GAAG,gBAAgB,CA0DxF;AAUD,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CA2BrE"}
@@ -0,0 +1,91 @@
1
+ const REASON_MAX_CHARS = 180;
2
+ const GOBLIN_REASON_MIN_CHARS = 20;
3
+ export function validate(raw, config, book) {
4
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
5
+ return reject("decision is not a JSON object", safeHold("non-object response"));
6
+ }
7
+ const d = raw;
8
+ const action = d["action"];
9
+ if (action !== "hold" && action !== "open" && action !== "close") {
10
+ return reject(`unknown action "${String(action)}"`, safeHold("unknown action"));
11
+ }
12
+ const reason = String(d["reason"] ?? "").trim();
13
+ if (!reason)
14
+ return reject("reason is empty", safeHold("empty reason"));
15
+ if (config.goblin && reason.length < GOBLIN_REASON_MIN_CHARS) {
16
+ return reject(`goblin reason too short (${reason.length} < ${GOBLIN_REASON_MIN_CHARS})`, safeHold("goblin reason too short for legal chaos"));
17
+ }
18
+ if (reason.length > REASON_MAX_CHARS) {
19
+ return reject(`reason too long (${reason.length} > ${REASON_MAX_CHARS} chars)`, safeHold(`reason too long: ${reason.slice(0, 100)}`));
20
+ }
21
+ const lowerReason = reason.toLowerCase();
22
+ for (const term of ["private_key", "seed phrase", "secret key", "mnemonic", "signer", "keypair", "wallet file"]) {
23
+ if (lowerReason.includes(term)) {
24
+ return reject(`prompt-injection detected: reason contains "${term}"`, {
25
+ action: "hold",
26
+ reason: "prompt-injection attempt refused by the paper safety harness",
27
+ });
28
+ }
29
+ }
30
+ if (action === "hold")
31
+ return { ok: true, decision: { action: "hold", reason } };
32
+ if (action === "open") {
33
+ const side = d["side"];
34
+ if (side !== "long" && side !== "short") {
35
+ return reject(`open.side must be long or short, got "${String(side)}"`, safeHold("bad side"));
36
+ }
37
+ const size = Number(d["size_lamports"] ?? 0);
38
+ if (!Number.isInteger(size) || size <= 0) {
39
+ return reject(`size_lamports must be a positive integer, got ${size}`, safeHold("bad size"));
40
+ }
41
+ if (size > config.max_position_size_lamports) {
42
+ return reject(`size_lamports ${size} exceeds cap ${config.max_position_size_lamports}`, safeHold("size exceeds paper cap"));
43
+ }
44
+ if (book.positions.length >= 1) {
45
+ return reject("tried to open while a position is already open", safeHold("position already open; one-at-a-time guard"));
46
+ }
47
+ return { ok: true, decision: { action: "open", side, size_lamports: size, reason } };
48
+ }
49
+ const positionId = String(d["position_id"] ?? "");
50
+ if (!positionId)
51
+ return reject("close.position_id is missing", safeHold("missing position id"));
52
+ if (!book.positions.some((position) => position.id === positionId)) {
53
+ return reject(`close.position_id "${positionId}" not found in book`, safeHold("position not found in paper book"));
54
+ }
55
+ return { ok: true, decision: { action: "close", position_id: positionId, reason } };
56
+ }
57
+ function reject(violation, fallback) {
58
+ return { ok: false, decision: fallback, violation };
59
+ }
60
+ function safeHold(reason) {
61
+ return { action: "hold", reason: reason.slice(0, REASON_MAX_CHARS) };
62
+ }
63
+ export function parseRalphConfig(markdownContent) {
64
+ const match = markdownContent.match(/^---\n([\s\S]*?)\n---/);
65
+ if (!match?.[1])
66
+ throw new Error("RALPH config missing YAML frontmatter");
67
+ const fm = match[1];
68
+ const get = (key, def) => (fm.match(new RegExp(`^${key}:\\s*(.+)$`, "m"))?.[1] ?? def).trim();
69
+ const bool = (key, def) => {
70
+ const value = get(key, String(def)).toLowerCase();
71
+ return value === "true" || value === "1" || value === "yes";
72
+ };
73
+ const mode = get("mode", "paper");
74
+ const network = get("network", "devnet");
75
+ if (mode !== "paper")
76
+ throw new Error(`[SAFETY] mode must be "paper", got "${mode}"`);
77
+ if (network !== "devnet")
78
+ throw new Error(`[SAFETY] network must be "devnet", got "${network}"`);
79
+ return {
80
+ mode: "paper",
81
+ network: "devnet",
82
+ max_action_per_tick: Number.parseInt(get("max_action_per_tick", "1"), 10),
83
+ max_position_size_lamports: Number.parseInt(get("max_position_size_lamports", "1000000"), 10),
84
+ loss_killswitch_consecutive: Number.parseInt(get("loss_killswitch_consecutive", "3"), 10),
85
+ goblin: bool("goblin", false),
86
+ dark_defi_armed: bool("dark_defi_armed", false),
87
+ tick_sleep_ms: Number.parseInt(get("tick_sleep_ms", "250"), 10),
88
+ model: get("model", "deterministic"),
89
+ };
90
+ }
91
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/ooda/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Agent Card
3
+ *
4
+ * Generates and manages the agent's self-description card.
5
+ * This is the JSON document pointed to by the ERC-8004 agentURI.
6
+ * Can be hosted on IPFS or served at /.well-known/agent-card.json
7
+ */
8
+ import type { AgentCard, AutomatonConfig, AutomatonIdentity, AutomatonDatabase, ClawdRuntimeClient } from "../types.js";
9
+ /**
10
+ * Generate an agent card from the automaton's current state.
11
+ */
12
+ export declare function generateAgentCard(identity: AutomatonIdentity, config: AutomatonConfig, db: AutomatonDatabase): AgentCard;
13
+ /**
14
+ * Serialize agent card to JSON string.
15
+ */
16
+ export declare function serializeAgentCard(card: AgentCard): string;
17
+ /**
18
+ * Host the agent card at /.well-known/agent-card.json
19
+ * by exposing a simple HTTP server on a port.
20
+ */
21
+ export declare function hostAgentCard(card: AgentCard, runtime: ClawdRuntimeClient, port?: number): Promise<string>;
22
+ /**
23
+ * Write agent card to the state directory for git versioning.
24
+ */
25
+ export declare function saveAgentCard(card: AgentCard, runtime: ClawdRuntimeClient): Promise<void>;
26
+ //# sourceMappingURL=agent-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-card.d.ts","sourceRoot":"","sources":["../../src/registry/agent-card.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,SAAS,EAET,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAKrB;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,eAAe,EACvB,EAAE,EAAE,iBAAiB,GACpB,SAAS,CAyCX;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,kBAAkB,EAC3B,IAAI,GAAE,MAAa,GAClB,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Agent Card
3
+ *
4
+ * Generates and manages the agent's self-description card.
5
+ * This is the JSON document pointed to by the ERC-8004 agentURI.
6
+ * Can be hosted on IPFS or served at /.well-known/agent-card.json
7
+ */
8
+ const AGENT_CARD_TYPE = "https://eips.ethereum.org/EIPS/eip-8004#registration-v1";
9
+ /**
10
+ * Generate an agent card from the automaton's current state.
11
+ */
12
+ export function generateAgentCard(identity, config, db) {
13
+ const services = [
14
+ {
15
+ name: "agentWallet",
16
+ endpoint: `eip155:8453:${identity.address}`,
17
+ },
18
+ {
19
+ name: "runtime",
20
+ endpoint: config.clawdApiUrl,
21
+ },
22
+ ];
23
+ // Add sandbox endpoint if available
24
+ if (identity.sandboxId) {
25
+ services.push({
26
+ name: "sandbox",
27
+ endpoint: `https://${identity.sandboxId}.life.x402.wtf`,
28
+ });
29
+ }
30
+ const children = db.getChildren();
31
+ const skills = db.getSkills(true);
32
+ let description = `Autonomous agent running on CLAWD Cloud.`;
33
+ description += ` Creator: ${config.creatorAddress}.`;
34
+ if (skills.length > 0) {
35
+ description += ` Skills: ${skills.map((s) => s.name).join(", ")}.`;
36
+ }
37
+ if (children.length > 0) {
38
+ description += ` Children: ${children.length}.`;
39
+ }
40
+ return {
41
+ type: AGENT_CARD_TYPE,
42
+ name: config.name,
43
+ description,
44
+ services,
45
+ x402Support: true,
46
+ active: true,
47
+ parentAgent: config.parentAddress || config.creatorAddress,
48
+ };
49
+ }
50
+ /**
51
+ * Serialize agent card to JSON string.
52
+ */
53
+ export function serializeAgentCard(card) {
54
+ return JSON.stringify(card, null, 2);
55
+ }
56
+ /**
57
+ * Host the agent card at /.well-known/agent-card.json
58
+ * by exposing a simple HTTP server on a port.
59
+ */
60
+ export async function hostAgentCard(card, runtime, port = 8004) {
61
+ const cardJson = serializeAgentCard(card);
62
+ // Write a simple server script
63
+ const serverScript = `
64
+ const http = require('http');
65
+ const card = ${cardJson};
66
+
67
+ const server = http.createServer((req, res) => {
68
+ if (req.url === '/.well-known/agent-card.json' || req.url === '/agent-card.json') {
69
+ res.writeHead(200, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
70
+ res.end(JSON.stringify(card, null, 2));
71
+ } else {
72
+ res.writeHead(404);
73
+ res.end('Not Found');
74
+ }
75
+ });
76
+
77
+ server.listen(${port}, () => console.log('Agent card server on port ${port}'));
78
+ `;
79
+ await runtime.writeFile("/tmp/agent-card-server.js", serverScript);
80
+ // Start server in background
81
+ await runtime.exec(`node /tmp/agent-card-server.js &`, 5000);
82
+ // Expose port
83
+ const portInfo = await runtime.exposePort(port);
84
+ return `${portInfo.publicUrl}/.well-known/agent-card.json`;
85
+ }
86
+ /**
87
+ * Write agent card to the state directory for git versioning.
88
+ */
89
+ export async function saveAgentCard(card, runtime) {
90
+ const cardJson = serializeAgentCard(card);
91
+ const home = process.env.HOME || "/root";
92
+ await runtime.writeFile(`${home}/.automaton/agent-card.json`, cardJson);
93
+ }
94
+ //# sourceMappingURL=agent-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-card.js","sourceRoot":"","sources":["../../src/registry/agent-card.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,MAAM,eAAe,GACnB,yDAAyD,CAAC;AAE5D;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAA2B,EAC3B,MAAuB,EACvB,EAAqB;IAErB,MAAM,QAAQ,GAAmB;QAC/B;YACE,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,eAAe,QAAQ,CAAC,OAAO,EAAE;SAC5C;QACD;YACE,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,MAAM,CAAC,WAAW;SAC7B;KACF,CAAC;IAEF,oCAAoC;IACpC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,WAAW,QAAQ,CAAC,SAAS,gBAAgB;SACxD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,WAAW,GAAG,0CAA0C,CAAC;IAC7D,WAAW,IAAI,aAAa,MAAM,CAAC,cAAc,GAAG,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,WAAW,IAAI,YAAY,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACrE,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,WAAW,IAAI,cAAc,QAAQ,CAAC,MAAM,GAAG,CAAC;IAClD,CAAC;IAED,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW;QACX,QAAQ;QACR,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,cAAc;KAC3D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAe;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAe,EACf,OAA2B,EAC3B,OAAe,IAAI;IAEnB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAE1C,+BAA+B;IAC/B,MAAM,YAAY,GAAG;;eAER,QAAQ;;;;;;;;;;;;gBAYP,IAAI,kDAAkD,IAAI;CACzE,CAAC;IAEA,MAAM,OAAO,CAAC,SAAS,CAAC,2BAA2B,EAAE,YAAY,CAAC,CAAC;IAEnE,6BAA6B;IAC7B,MAAM,OAAO,CAAC,IAAI,CAChB,kCAAkC,EAClC,IAAI,CACL,CAAC;IAEF,cAAc;IACd,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAEhD,OAAO,GAAG,QAAQ,CAAC,SAAS,8BAA8B,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAe,EACf,OAA2B;IAE3B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC;IACzC,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,6BAA6B,EAAE,QAAQ,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Agent Discovery
3
+ *
4
+ * Discover other agents via ERC-8004 registry queries.
5
+ * Fetch and parse agent cards from URIs.
6
+ */
7
+ import type { DiscoveredAgent, AgentCard } from "../types.js";
8
+ type Network = "mainnet" | "testnet";
9
+ /**
10
+ * Discover agents by scanning the registry.
11
+ * Returns a list of discovered agents with their metadata.
12
+ */
13
+ export declare function discoverAgents(limit?: number, network?: Network): Promise<DiscoveredAgent[]>;
14
+ /**
15
+ * Fetch an agent card from a URI.
16
+ */
17
+ export declare function fetchAgentCard(uri: string): Promise<AgentCard | null>;
18
+ /**
19
+ * Search for agents by name or description.
20
+ * Scans recent registrations and filters by keyword.
21
+ */
22
+ export declare function searchAgents(keyword: string, limit?: number, network?: Network): Promise<DiscoveredAgent[]>;
23
+ export {};
24
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/registry/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACV,MAAM,aAAa,CAAC;AAGrB,KAAK,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAErC;;;GAGG;AACH,wBAAsB,cAAc,CAClC,KAAK,GAAE,MAAW,EAClB,OAAO,GAAE,OAAmB,GAC3B,OAAO,CAAC,eAAe,EAAE,CAAC,CAwB5B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAuB3B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAW,EAClB,OAAO,GAAE,OAAmB,GAC3B,OAAO,CAAC,eAAe,EAAE,CAAC,CAY5B"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Agent Discovery
3
+ *
4
+ * Discover other agents via ERC-8004 registry queries.
5
+ * Fetch and parse agent cards from URIs.
6
+ */
7
+ import { queryAgent, getTotalAgents } from "./erc8004.js";
8
+ /**
9
+ * Discover agents by scanning the registry.
10
+ * Returns a list of discovered agents with their metadata.
11
+ */
12
+ export async function discoverAgents(limit = 20, network = "mainnet") {
13
+ const total = await getTotalAgents(network);
14
+ const scanCount = Math.min(total, limit);
15
+ const agents = [];
16
+ // Scan from most recent to oldest
17
+ for (let i = total; i > total - scanCount && i > 0; i--) {
18
+ const agent = await queryAgent(i.toString(), network);
19
+ if (agent) {
20
+ // Try to fetch the agent card for additional metadata
21
+ try {
22
+ const card = await fetchAgentCard(agent.agentURI);
23
+ if (card) {
24
+ agent.name = card.name;
25
+ agent.description = card.description;
26
+ }
27
+ }
28
+ catch {
29
+ // Card fetch failed, use basic info
30
+ }
31
+ agents.push(agent);
32
+ }
33
+ }
34
+ return agents;
35
+ }
36
+ /**
37
+ * Fetch an agent card from a URI.
38
+ */
39
+ export async function fetchAgentCard(uri) {
40
+ try {
41
+ // Handle IPFS URIs
42
+ let fetchUrl = uri;
43
+ if (uri.startsWith("ipfs://")) {
44
+ fetchUrl = `https://ipfs.io/ipfs/${uri.slice(7)}`;
45
+ }
46
+ const response = await fetch(fetchUrl, {
47
+ signal: AbortSignal.timeout(10000),
48
+ });
49
+ if (!response.ok)
50
+ return null;
51
+ const card = (await response.json());
52
+ // Basic validation
53
+ if (!card.name || !card.type)
54
+ return null;
55
+ return card;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * Search for agents by name or description.
63
+ * Scans recent registrations and filters by keyword.
64
+ */
65
+ export async function searchAgents(keyword, limit = 10, network = "mainnet") {
66
+ const all = await discoverAgents(50, network);
67
+ const lower = keyword.toLowerCase();
68
+ return all
69
+ .filter((a) => a.name?.toLowerCase().includes(lower) ||
70
+ a.description?.toLowerCase().includes(lower) ||
71
+ a.owner.toLowerCase().includes(lower))
72
+ .slice(0, limit);
73
+ }
74
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/registry/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI1D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAAE,EAClB,UAAmB,SAAS;IAE5B,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,kCAAkC;IAClC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,GAAG,SAAS,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,KAAK,EAAE,CAAC;YACV,sDAAsD;YACtD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAClD,IAAI,IAAI,EAAE,CAAC;oBACT,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;oBACvB,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;gBACvC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAW;IAEX,IAAI,CAAC;QACH,mBAAmB;QACnB,IAAI,QAAQ,GAAG,GAAG,CAAC;QACnB,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,QAAQ,GAAG,wBAAwB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAc,CAAC;QAElD,mBAAmB;QACnB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAE1C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,QAAgB,EAAE,EAClB,UAAmB,SAAS;IAE5B,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,OAAO,GAAG;SACP,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QACrC,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5C,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CACxC;SACA,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * ERC-8004 On-Chain Agent Registration
3
+ *
4
+ * Registers the automaton on-chain as a Trustless Agent via ERC-8004.
5
+ * Uses the Identity Registry on Base mainnet.
6
+ *
7
+ * Contract: 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 (Base)
8
+ * Reputation: 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 (Base)
9
+ */
10
+ import { type Address, type PrivateKeyAccount } from "viem";
11
+ import type { RegistryEntry, DiscoveredAgent, AutomatonDatabase } from "../types.js";
12
+ type Network = "mainnet" | "testnet";
13
+ /**
14
+ * Register the automaton on-chain with ERC-8004.
15
+ * Returns the agent ID (NFT token ID).
16
+ */
17
+ export declare function registerAgent(account: PrivateKeyAccount, agentURI: string, network: Network | undefined, db: AutomatonDatabase): Promise<RegistryEntry>;
18
+ /**
19
+ * Update the agent's URI on-chain.
20
+ */
21
+ export declare function updateAgentURI(account: PrivateKeyAccount, agentId: string, newAgentURI: string, network: Network | undefined, db: AutomatonDatabase): Promise<string>;
22
+ /**
23
+ * Leave reputation feedback for another agent.
24
+ */
25
+ export declare function leaveFeedback(account: PrivateKeyAccount, agentId: string, score: number, comment: string, network: Network | undefined, db: AutomatonDatabase): Promise<string>;
26
+ /**
27
+ * Query the registry for an agent by ID.
28
+ */
29
+ export declare function queryAgent(agentId: string, network?: Network): Promise<DiscoveredAgent | null>;
30
+ /**
31
+ * Get the total number of registered agents.
32
+ */
33
+ export declare function getTotalAgents(network?: Network): Promise<number>;
34
+ /**
35
+ * Check if an address has a registered agent.
36
+ */
37
+ export declare function hasRegisteredAgent(address: Address, network?: Network): Promise<boolean>;
38
+ export {};
39
+ //# sourceMappingURL=erc8004.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc8004.d.ts","sourceRoot":"","sources":["../../src/registry/erc8004.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAML,KAAK,OAAO,EACZ,KAAK,iBAAiB,EACvB,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EACV,aAAa,EAEb,eAAe,EACf,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAiCrB,KAAK,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAErC;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,YAAY,EAC5B,EAAE,EAAE,iBAAiB,GACpB,OAAO,CAAC,aAAa,CAAC,CAgDxB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,YAAY,EAC5B,EAAE,EAAE,iBAAiB,GACpB,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,YAAY,EAC5B,EAAE,EAAE,iBAAiB,GACpB,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAmB,GAC3B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAiCjC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,GAAE,OAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,OAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAoBlB"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * ERC-8004 On-Chain Agent Registration
3
+ *
4
+ * Registers the automaton on-chain as a Trustless Agent via ERC-8004.
5
+ * Uses the Identity Registry on Base mainnet.
6
+ *
7
+ * Contract: 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 (Base)
8
+ * Reputation: 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 (Base)
9
+ */
10
+ import { createPublicClient, createWalletClient, http, parseAbi, } from "viem";
11
+ import { base, baseSepolia } from "viem/chains";
12
+ // ─── Contract Addresses ──────────────────────────────────────
13
+ const CONTRACTS = {
14
+ mainnet: {
15
+ identity: "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432",
16
+ reputation: "0x8004BAa17C55a88189AE136b182e5fdA19dE9b63",
17
+ chain: base,
18
+ },
19
+ testnet: {
20
+ identity: "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432",
21
+ reputation: "0x8004BAa17C55a88189AE136b182e5fdA19dE9b63",
22
+ chain: baseSepolia,
23
+ },
24
+ };
25
+ // ─── ABI (minimal subset needed for registration) ────────────
26
+ const IDENTITY_ABI = parseAbi([
27
+ "function register(string agentURI) external returns (uint256 agentId)",
28
+ "function updateAgentURI(uint256 agentId, string newAgentURI) external",
29
+ "function agentURI(uint256 agentId) external view returns (string)",
30
+ "function ownerOf(uint256 tokenId) external view returns (address)",
31
+ "function totalSupply() external view returns (uint256)",
32
+ "function balanceOf(address owner) external view returns (uint256)",
33
+ ]);
34
+ const REPUTATION_ABI = parseAbi([
35
+ "function leaveFeedback(uint256 agentId, uint8 score, string comment) external",
36
+ "function getFeedback(uint256 agentId) external view returns (tuple(address from, uint8 score, string comment, uint256 timestamp)[])",
37
+ ]);
38
+ /**
39
+ * Register the automaton on-chain with ERC-8004.
40
+ * Returns the agent ID (NFT token ID).
41
+ */
42
+ export async function registerAgent(account, agentURI, network = "mainnet", db) {
43
+ const contracts = CONTRACTS[network];
44
+ const chain = contracts.chain;
45
+ const publicClient = createPublicClient({
46
+ chain,
47
+ transport: http(),
48
+ });
49
+ const walletClient = createWalletClient({
50
+ account,
51
+ chain,
52
+ transport: http(),
53
+ });
54
+ // Call register(agentURI)
55
+ const hash = await walletClient.writeContract({
56
+ address: contracts.identity,
57
+ abi: IDENTITY_ABI,
58
+ functionName: "register",
59
+ args: [agentURI],
60
+ });
61
+ // Wait for transaction receipt
62
+ const receipt = await publicClient.waitForTransactionReceipt({ hash });
63
+ // Extract agentId from Transfer event logs
64
+ // The register function mints an ERC-721 token
65
+ let agentId = "0";
66
+ for (const log of receipt.logs) {
67
+ if (log.topics.length >= 4) {
68
+ // Transfer(address from, address to, uint256 tokenId)
69
+ agentId = BigInt(log.topics[3]).toString();
70
+ break;
71
+ }
72
+ }
73
+ const entry = {
74
+ agentId,
75
+ agentURI,
76
+ chain: `eip155:${chain.id}`,
77
+ contractAddress: contracts.identity,
78
+ txHash: hash,
79
+ registeredAt: new Date().toISOString(),
80
+ };
81
+ db.setRegistryEntry(entry);
82
+ return entry;
83
+ }
84
+ /**
85
+ * Update the agent's URI on-chain.
86
+ */
87
+ export async function updateAgentURI(account, agentId, newAgentURI, network = "mainnet", db) {
88
+ const contracts = CONTRACTS[network];
89
+ const chain = contracts.chain;
90
+ const walletClient = createWalletClient({
91
+ account,
92
+ chain,
93
+ transport: http(),
94
+ });
95
+ const hash = await walletClient.writeContract({
96
+ address: contracts.identity,
97
+ abi: IDENTITY_ABI,
98
+ functionName: "updateAgentURI",
99
+ args: [BigInt(agentId), newAgentURI],
100
+ });
101
+ // Update in DB
102
+ const entry = db.getRegistryEntry();
103
+ if (entry) {
104
+ entry.agentURI = newAgentURI;
105
+ entry.txHash = hash;
106
+ db.setRegistryEntry(entry);
107
+ }
108
+ return hash;
109
+ }
110
+ /**
111
+ * Leave reputation feedback for another agent.
112
+ */
113
+ export async function leaveFeedback(account, agentId, score, comment, network = "mainnet", db) {
114
+ const contracts = CONTRACTS[network];
115
+ const chain = contracts.chain;
116
+ const walletClient = createWalletClient({
117
+ account,
118
+ chain,
119
+ transport: http(),
120
+ });
121
+ const hash = await walletClient.writeContract({
122
+ address: contracts.reputation,
123
+ abi: REPUTATION_ABI,
124
+ functionName: "leaveFeedback",
125
+ args: [BigInt(agentId), score, comment],
126
+ });
127
+ return hash;
128
+ }
129
+ /**
130
+ * Query the registry for an agent by ID.
131
+ */
132
+ export async function queryAgent(agentId, network = "mainnet") {
133
+ const contracts = CONTRACTS[network];
134
+ const chain = contracts.chain;
135
+ const publicClient = createPublicClient({
136
+ chain,
137
+ transport: http(),
138
+ });
139
+ try {
140
+ const [uri, owner] = await Promise.all([
141
+ publicClient.readContract({
142
+ address: contracts.identity,
143
+ abi: IDENTITY_ABI,
144
+ functionName: "agentURI",
145
+ args: [BigInt(agentId)],
146
+ }),
147
+ publicClient.readContract({
148
+ address: contracts.identity,
149
+ abi: IDENTITY_ABI,
150
+ functionName: "ownerOf",
151
+ args: [BigInt(agentId)],
152
+ }),
153
+ ]);
154
+ return {
155
+ agentId,
156
+ owner: owner,
157
+ agentURI: uri,
158
+ };
159
+ }
160
+ catch {
161
+ return null;
162
+ }
163
+ }
164
+ /**
165
+ * Get the total number of registered agents.
166
+ */
167
+ export async function getTotalAgents(network = "mainnet") {
168
+ const contracts = CONTRACTS[network];
169
+ const chain = contracts.chain;
170
+ const publicClient = createPublicClient({
171
+ chain,
172
+ transport: http(),
173
+ });
174
+ try {
175
+ const supply = await publicClient.readContract({
176
+ address: contracts.identity,
177
+ abi: IDENTITY_ABI,
178
+ functionName: "totalSupply",
179
+ });
180
+ return Number(supply);
181
+ }
182
+ catch {
183
+ return 0;
184
+ }
185
+ }
186
+ /**
187
+ * Check if an address has a registered agent.
188
+ */
189
+ export async function hasRegisteredAgent(address, network = "mainnet") {
190
+ const contracts = CONTRACTS[network];
191
+ const chain = contracts.chain;
192
+ const publicClient = createPublicClient({
193
+ chain,
194
+ transport: http(),
195
+ });
196
+ try {
197
+ const balance = await publicClient.readContract({
198
+ address: contracts.identity,
199
+ abi: IDENTITY_ABI,
200
+ functionName: "balanceOf",
201
+ args: [address],
202
+ });
203
+ return Number(balance) > 0;
204
+ }
205
+ catch {
206
+ return false;
207
+ }
208
+ }
209
+ //# sourceMappingURL=erc8004.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc8004.js","sourceRoot":"","sources":["../../src/registry/erc8004.ts"],"names":[],"mappings":"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"}