@sherwoodagent/cli 0.41.5 → 0.47.1

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 (69) hide show
  1. package/dist/{addresses-RQ7DTIBS.js → addresses-DOWLGXGE.js} +4 -4
  2. package/dist/{agent-SXEV65ME.js → agent-4HKHLQEJ.js} +3035 -2029
  3. package/dist/agent-4HKHLQEJ.js.map +1 -0
  4. package/dist/autoresearch-IA7HGSNW.js +267 -0
  5. package/dist/autoresearch-IA7HGSNW.js.map +1 -0
  6. package/dist/{chat-D5OF4OTL.js → chat-MRTPUZ3X.js} +8 -8
  7. package/dist/{chunk-2YOXRATG.js → chunk-2LRC7I33.js} +12 -2
  8. package/dist/{chunk-2YOXRATG.js.map → chunk-2LRC7I33.js.map} +1 -1
  9. package/dist/{chunk-4EHI4SKM.js → chunk-2W4KGGPU.js} +11 -1
  10. package/dist/chunk-2W4KGGPU.js.map +1 -0
  11. package/dist/chunk-7HJXZ4NM.js +189 -0
  12. package/dist/chunk-7HJXZ4NM.js.map +1 -0
  13. package/dist/{chunk-DG2K6CPY.js → chunk-E6LH2FJ6.js} +110 -68
  14. package/dist/chunk-E6LH2FJ6.js.map +1 -0
  15. package/dist/{chunk-MT3VS3GZ.js → chunk-FWC57PT7.js} +2 -2
  16. package/dist/{chunk-YRCJ3NUX.js → chunk-IS2CLLUT.js} +4 -4
  17. package/dist/{chunk-YYB4TF6D.js → chunk-KJ35EF7N.js} +4 -4
  18. package/dist/{chunk-D2UYGUV2.js → chunk-OHQOTSFG.js} +39 -3
  19. package/dist/chunk-OHQOTSFG.js.map +1 -0
  20. package/dist/chunk-R2P4C2I7.js +560 -0
  21. package/dist/chunk-R2P4C2I7.js.map +1 -0
  22. package/dist/{chunk-4QNPS5LI.js → chunk-R7X33D2S.js} +25 -6
  23. package/dist/{chunk-4QNPS5LI.js.map → chunk-R7X33D2S.js.map} +1 -1
  24. package/dist/{chunk-XZHIZVJ3.js → chunk-WMZEOR5W.js} +6 -127
  25. package/dist/chunk-WMZEOR5W.js.map +1 -0
  26. package/dist/{chunk-M2NJPATE.js → chunk-XDBRKW7I.js} +3 -3
  27. package/dist/chunk-YTYXBX7B.js +495 -0
  28. package/dist/chunk-YTYXBX7B.js.map +1 -0
  29. package/dist/{client-VSBQM2LU.js → client-UHHCB6EZ.js} +4 -4
  30. package/dist/{config-YRERDZSL.js → config-REASKDIK.js} +6 -2
  31. package/dist/{eas-QNZKCEP7.js → eas-PEEWGSAO.js} +16 -6
  32. package/dist/{governor-RE6IJMUJ.js → governor-MG5VVSU4.js} +6 -6
  33. package/dist/index.js +1137 -272
  34. package/dist/index.js.map +1 -1
  35. package/dist/{network-R5NFPIAF.js → network-3ZU7UBDU.js} +7 -5
  36. package/dist/{price-GY3JQ2OK.js → price-WCCXWPDM.js} +5 -5
  37. package/dist/{research-SVWNPHIN.js → research-QBKISW2M.js} +9 -9
  38. package/dist/research-YJWSQS2A.js +14 -0
  39. package/dist/serve-6MYBOAX6.js +222 -0
  40. package/dist/serve-6MYBOAX6.js.map +1 -0
  41. package/dist/{session-3Z6I2IM3.js → session-FPCPCVQX.js} +10 -10
  42. package/dist/summary-formatter-JIGWN4QS.js +180 -0
  43. package/dist/summary-formatter-JIGWN4QS.js.map +1 -0
  44. package/dist/{trade-E5HSZE44.js → trade-NO6CNWCA.js} +19 -17
  45. package/dist/{trade-E5HSZE44.js.map → trade-NO6CNWCA.js.map} +1 -1
  46. package/dist/{xmtp-VPGQE4IP.js → xmtp-ACB2W573.js} +6 -6
  47. package/package.json +5 -2
  48. package/dist/agent-SXEV65ME.js.map +0 -1
  49. package/dist/chunk-4EHI4SKM.js.map +0 -1
  50. package/dist/chunk-D2UYGUV2.js.map +0 -1
  51. package/dist/chunk-DG2K6CPY.js.map +0 -1
  52. package/dist/chunk-XZHIZVJ3.js.map +0 -1
  53. package/dist/research-PB22GPXC.js +0 -14
  54. /package/dist/{addresses-RQ7DTIBS.js.map → addresses-DOWLGXGE.js.map} +0 -0
  55. /package/dist/{chat-D5OF4OTL.js.map → chat-MRTPUZ3X.js.map} +0 -0
  56. /package/dist/{chunk-MT3VS3GZ.js.map → chunk-FWC57PT7.js.map} +0 -0
  57. /package/dist/{chunk-YRCJ3NUX.js.map → chunk-IS2CLLUT.js.map} +0 -0
  58. /package/dist/{chunk-YYB4TF6D.js.map → chunk-KJ35EF7N.js.map} +0 -0
  59. /package/dist/{chunk-M2NJPATE.js.map → chunk-XDBRKW7I.js.map} +0 -0
  60. /package/dist/{client-VSBQM2LU.js.map → client-UHHCB6EZ.js.map} +0 -0
  61. /package/dist/{config-YRERDZSL.js.map → config-REASKDIK.js.map} +0 -0
  62. /package/dist/{eas-QNZKCEP7.js.map → eas-PEEWGSAO.js.map} +0 -0
  63. /package/dist/{governor-RE6IJMUJ.js.map → governor-MG5VVSU4.js.map} +0 -0
  64. /package/dist/{network-R5NFPIAF.js.map → network-3ZU7UBDU.js.map} +0 -0
  65. /package/dist/{price-GY3JQ2OK.js.map → price-WCCXWPDM.js.map} +0 -0
  66. /package/dist/{research-SVWNPHIN.js.map → research-QBKISW2M.js.map} +0 -0
  67. /package/dist/{research-PB22GPXC.js.map → research-YJWSQS2A.js.map} +0 -0
  68. /package/dist/{session-3Z6I2IM3.js.map → session-FPCPCVQX.js.map} +0 -0
  69. /package/dist/{xmtp-VPGQE4IP.js.map → xmtp-ACB2W573.js.map} +0 -0
@@ -0,0 +1,189 @@
1
+ import {
2
+ getAccount
3
+ } from "./chunk-XDBRKW7I.js";
4
+ import {
5
+ getVeniceApiKey,
6
+ setVeniceApiKey
7
+ } from "./chunk-2W4KGGPU.js";
8
+
9
+ // src/lib/venice.ts
10
+ import chalk from "chalk";
11
+ var VENICE_API_BASE = "https://api.venice.ai/api/v1";
12
+ var RETRY_MAX_ATTEMPTS = 3;
13
+ var RETRY_BASE_DELAYS_MS = [1e3, 2e3, 4e3];
14
+ var RETRY_JITTER_PCT = 0.2;
15
+ var RETRYABLE_STATUS = /* @__PURE__ */ new Set([429, 500, 502, 503, 504]);
16
+ var VeniceHttpError = class extends Error {
17
+ status;
18
+ body;
19
+ constructor(status, body) {
20
+ super(`Venice inference failed: ${status} ${body}`);
21
+ this.name = "VeniceHttpError";
22
+ this.status = status;
23
+ this.body = body;
24
+ }
25
+ };
26
+ function shouldRetry(err) {
27
+ if (!(err instanceof Error)) return false;
28
+ if (err.name === "AbortError") return false;
29
+ if (err instanceof VeniceHttpError) {
30
+ return RETRYABLE_STATUS.has(err.status);
31
+ }
32
+ if (err instanceof TypeError) return true;
33
+ const cause = err.cause;
34
+ if (cause && typeof cause === "object") {
35
+ const code = cause.code;
36
+ if (typeof code === "string" && ["ECONNRESET", "ECONNREFUSED", "ETIMEDOUT", "EAI_AGAIN", "ENOTFOUND", "EPIPE", "UND_ERR_SOCKET"].includes(code)) {
37
+ return true;
38
+ }
39
+ }
40
+ return false;
41
+ }
42
+ function jitter(delayMs) {
43
+ const spread = delayMs * RETRY_JITTER_PCT;
44
+ return Math.max(0, Math.round(delayMs + (Math.random() * 2 - 1) * spread));
45
+ }
46
+ function sleep(ms) {
47
+ return new Promise((resolve) => setTimeout(resolve, ms));
48
+ }
49
+ async function provisionApiKey() {
50
+ const account = getAccount();
51
+ const tokenRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {
52
+ signal: AbortSignal.timeout(15e3)
53
+ });
54
+ if (!tokenRes.ok) {
55
+ throw new Error(`Failed to get validation token: ${tokenRes.status} ${tokenRes.statusText}`);
56
+ }
57
+ const tokenData = await tokenRes.json();
58
+ const token = tokenData?.data?.token;
59
+ if (!token) {
60
+ throw new Error("Venice API returned no validation token");
61
+ }
62
+ const signature = await account.signMessage({ message: token });
63
+ const keyRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {
64
+ method: "POST",
65
+ headers: {
66
+ "Content-Type": "application/json"
67
+ },
68
+ signal: AbortSignal.timeout(15e3),
69
+ body: JSON.stringify({
70
+ address: account.address,
71
+ signature,
72
+ token,
73
+ apiKeyType: "INFERENCE",
74
+ description: "Sherwood syndicate agent"
75
+ })
76
+ });
77
+ if (!keyRes.ok) {
78
+ const body = await keyRes.text();
79
+ throw new Error(`Failed to generate API key: ${keyRes.status} ${body}`);
80
+ }
81
+ const keyData = await keyRes.json();
82
+ const apiKey = keyData?.data?.apiKey;
83
+ if (!apiKey) {
84
+ throw new Error("Venice API returned no API key");
85
+ }
86
+ setVeniceApiKey(apiKey);
87
+ return apiKey;
88
+ }
89
+ async function checkApiKeyValid() {
90
+ const apiKey = getVeniceApiKey();
91
+ if (!apiKey) return false;
92
+ try {
93
+ const res = await fetch(`${VENICE_API_BASE}/models`, {
94
+ headers: { Authorization: `Bearer ${apiKey}` },
95
+ signal: AbortSignal.timeout(15e3)
96
+ });
97
+ return res.ok;
98
+ } catch {
99
+ return false;
100
+ }
101
+ }
102
+ async function chatCompletion(opts) {
103
+ const apiKey = getVeniceApiKey();
104
+ if (!apiKey) {
105
+ throw new Error("No Venice API key configured. Run 'sherwood venice provision' first.");
106
+ }
107
+ const body = {
108
+ model: opts.model,
109
+ messages: opts.messages
110
+ };
111
+ if (opts.temperature !== void 0) body.temperature = opts.temperature;
112
+ if (opts.maxTokens !== void 0) body.max_tokens = opts.maxTokens;
113
+ const veniceParams = {};
114
+ if (opts.enableWebSearch) veniceParams.enable_web_search = "on";
115
+ if (opts.disableThinking) veniceParams.disable_thinking = true;
116
+ if (Object.keys(veniceParams).length > 0) body.venice_parameters = veniceParams;
117
+ let lastErr;
118
+ let res;
119
+ for (let attempt = 1; attempt <= RETRY_MAX_ATTEMPTS; attempt++) {
120
+ try {
121
+ res = await fetch(`${VENICE_API_BASE}/chat/completions`, {
122
+ method: "POST",
123
+ headers: {
124
+ "Content-Type": "application/json",
125
+ Authorization: `Bearer ${apiKey}`
126
+ },
127
+ signal: AbortSignal.timeout(12e4),
128
+ // inference can be slow
129
+ body: JSON.stringify(body)
130
+ });
131
+ if (!res.ok) {
132
+ const errBody = await res.text();
133
+ throw new VeniceHttpError(res.status, errBody);
134
+ }
135
+ lastErr = void 0;
136
+ break;
137
+ } catch (err) {
138
+ lastErr = err;
139
+ if (attempt >= RETRY_MAX_ATTEMPTS || !shouldRetry(err)) {
140
+ throw err;
141
+ }
142
+ const baseDelay = RETRY_BASE_DELAYS_MS[attempt - 1] ?? RETRY_BASE_DELAYS_MS[RETRY_BASE_DELAYS_MS.length - 1];
143
+ const delayMs = jitter(baseDelay);
144
+ const reason = err instanceof VeniceHttpError ? `HTTP ${err.status}` : err.message || "network";
145
+ console.error(chalk.dim(` [venice] retry ${attempt}/${RETRY_MAX_ATTEMPTS} after ${delayMs}ms \u2014 ${reason}`));
146
+ await sleep(delayMs);
147
+ }
148
+ }
149
+ if (!res || lastErr) {
150
+ throw lastErr ?? new Error("Venice inference failed: no response");
151
+ }
152
+ const data = await res.json();
153
+ const choice = data.choices?.[0];
154
+ if (!choice) {
155
+ throw new Error("Venice returned no choices");
156
+ }
157
+ return {
158
+ content: choice.message?.content ?? "",
159
+ model: data.model ?? opts.model,
160
+ usage: {
161
+ promptTokens: data.usage?.prompt_tokens ?? 0,
162
+ completionTokens: data.usage?.completion_tokens ?? 0,
163
+ totalTokens: data.usage?.total_tokens ?? 0
164
+ }
165
+ };
166
+ }
167
+ async function listModels() {
168
+ const apiKey = getVeniceApiKey();
169
+ if (!apiKey) {
170
+ throw new Error("No Venice API key configured. Run 'sherwood venice provision' first.");
171
+ }
172
+ const res = await fetch(`${VENICE_API_BASE}/models`, {
173
+ headers: { Authorization: `Bearer ${apiKey}` },
174
+ signal: AbortSignal.timeout(15e3)
175
+ });
176
+ if (!res.ok) {
177
+ throw new Error(`Failed to list Venice models: ${res.status} ${res.statusText}`);
178
+ }
179
+ const data = await res.json();
180
+ return (data.data ?? []).map((m) => m.id);
181
+ }
182
+
183
+ export {
184
+ provisionApiKey,
185
+ checkApiKeyValid,
186
+ chatCompletion,
187
+ listModels
188
+ };
189
+ //# sourceMappingURL=chunk-7HJXZ4NM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/venice.ts"],"sourcesContent":["/**\n * Venice AI API integration — web3 key generation, validation, and inference.\n *\n * Key provisioning flow:\n * 1. GET /api_keys/generate_web3_key → validation token\n * 2. Sign token with agent wallet (EIP-191)\n * 3. POST /api_keys/generate_web3_key → API key\n *\n * Inference:\n * POST /chat/completions with Bearer auth → chat completion response\n *\n * The API key is stored in ~/.sherwood/config.json.\n * Venice requires the signing wallet to hold staked VVV (sVVV).\n */\n\nimport chalk from \"chalk\";\nimport { getAccount } from \"./client.js\";\nimport { setVeniceApiKey, getVeniceApiKey } from \"./config.js\";\n\nconst VENICE_API_BASE = \"https://api.venice.ai/api/v1\";\n\n// ── Retry policy for chatCompletion ──\n\nconst RETRY_MAX_ATTEMPTS = 3;\nconst RETRY_BASE_DELAYS_MS = [1000, 2000, 4000]; // 1s, 2s, 4s\nconst RETRY_JITTER_PCT = 0.2; // ±20%\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\n\n/**\n * Transient HTTP error raised by `chatCompletion` before retry logic kicks in.\n * Carries the response status so `shouldRetry` can inspect it.\n */\nclass VeniceHttpError extends Error {\n readonly status: number;\n readonly body: string;\n constructor(status: number, body: string) {\n super(`Venice inference failed: ${status} ${body}`);\n this.name = \"VeniceHttpError\";\n this.status = status;\n this.body = body;\n }\n}\n\n/**\n * Decide whether a failed `chatCompletion` HTTP attempt is worth retrying.\n * Retries: 429, 5xx, and network-class errors (fetch TypeError / ECONNRESET).\n * Never retries: AbortError (user/timeout), 4xx client errors, parse errors.\n */\nfunction shouldRetry(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n // User/caller abort or outer timeout — never retry\n if (err.name === \"AbortError\") return false;\n if (err instanceof VeniceHttpError) {\n return RETRYABLE_STATUS.has(err.status);\n }\n // Network-class: Node's fetch surfaces these as TypeError with a cause,\n // or occasionally the cause Error carries codes like ECONNRESET/ETIMEDOUT.\n if (err instanceof TypeError) return true;\n const cause = (err as { cause?: unknown }).cause;\n if (cause && typeof cause === \"object\") {\n const code = (cause as { code?: unknown }).code;\n if (typeof code === \"string\" &&\n [\"ECONNRESET\", \"ECONNREFUSED\", \"ETIMEDOUT\", \"EAI_AGAIN\", \"ENOTFOUND\", \"EPIPE\", \"UND_ERR_SOCKET\"].includes(code)) {\n return true;\n }\n }\n return false;\n}\n\nfunction jitter(delayMs: number): number {\n const spread = delayMs * RETRY_JITTER_PCT;\n return Math.max(0, Math.round(delayMs + (Math.random() * 2 - 1) * spread));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Provision a Venice API key via web3 wallet signature.\n * The wallet must hold sVVV for this to succeed.\n */\nexport async function provisionApiKey(): Promise<string> {\n const account = getAccount();\n\n // 1. Get validation token (unauthenticated per Venice swagger spec)\n const tokenRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {\n signal: AbortSignal.timeout(15_000),\n });\n if (!tokenRes.ok) {\n throw new Error(`Failed to get validation token: ${tokenRes.status} ${tokenRes.statusText}`);\n }\n const tokenData = await tokenRes.json();\n const token = tokenData?.data?.token;\n if (!token) {\n throw new Error(\"Venice API returned no validation token\");\n }\n\n // 2. Sign token with wallet (EIP-191)\n const signature = await account.signMessage({ message: token });\n\n // 3. Generate API key\n const keyRes = await fetch(`${VENICE_API_BASE}/api_keys/generate_web3_key`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal: AbortSignal.timeout(15_000),\n body: JSON.stringify({\n address: account.address,\n signature,\n token,\n apiKeyType: \"INFERENCE\",\n description: \"Sherwood syndicate agent\",\n }),\n });\n\n if (!keyRes.ok) {\n const body = await keyRes.text();\n throw new Error(`Failed to generate API key: ${keyRes.status} ${body}`);\n }\n\n const keyData = await keyRes.json();\n const apiKey = keyData?.data?.apiKey;\n if (!apiKey) {\n throw new Error(\"Venice API returned no API key\");\n }\n\n // Store in config\n setVeniceApiKey(apiKey);\n\n return apiKey;\n}\n\n/**\n * Check if the stored Venice API key is still valid.\n */\nexport async function checkApiKeyValid(): Promise<boolean> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) return false;\n\n try {\n const res = await fetch(`${VENICE_API_BASE}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(15_000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\n// ── Inference ──\n\nexport interface ChatCompletionMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ChatCompletionOptions {\n model: string;\n messages: ChatCompletionMessage[];\n temperature?: number;\n maxTokens?: number;\n enableWebSearch?: boolean;\n disableThinking?: boolean;\n}\n\nexport interface ChatCompletionResult {\n content: string;\n model: string;\n usage: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * Call Venice chat completions API for private inference.\n * Requires a provisioned API key (run `sherwood venice provision` first).\n */\nexport async function chatCompletion(opts: ChatCompletionOptions): Promise<ChatCompletionResult> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) {\n throw new Error(\"No Venice API key configured. Run 'sherwood venice provision' first.\");\n }\n\n const body: Record<string, unknown> = {\n model: opts.model,\n messages: opts.messages,\n };\n if (opts.temperature !== undefined) body.temperature = opts.temperature;\n if (opts.maxTokens !== undefined) body.max_tokens = opts.maxTokens;\n\n const veniceParams: Record<string, unknown> = {};\n if (opts.enableWebSearch) veniceParams.enable_web_search = \"on\";\n if (opts.disableThinking) veniceParams.disable_thinking = true;\n if (Object.keys(veniceParams).length > 0) body.venice_parameters = veniceParams;\n\n // Retry loop: exponential backoff with jitter on 429/5xx and network errors.\n // Caller-provided timeouts (e.g. Promise.race in the judge) still win — if\n // the outer timeout fires before retries exhaust, the promise rejects normally.\n let lastErr: unknown;\n let res: Response | undefined;\n for (let attempt = 1; attempt <= RETRY_MAX_ATTEMPTS; attempt++) {\n try {\n res = await fetch(`${VENICE_API_BASE}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n signal: AbortSignal.timeout(120_000), // inference can be slow\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n const errBody = await res.text();\n throw new VeniceHttpError(res.status, errBody);\n }\n lastErr = undefined;\n break; // success\n } catch (err) {\n lastErr = err;\n if (attempt >= RETRY_MAX_ATTEMPTS || !shouldRetry(err)) {\n throw err;\n }\n const baseDelay = RETRY_BASE_DELAYS_MS[attempt - 1] ?? RETRY_BASE_DELAYS_MS[RETRY_BASE_DELAYS_MS.length - 1];\n const delayMs = jitter(baseDelay);\n const reason = err instanceof VeniceHttpError ? `HTTP ${err.status}` : (err as Error).message || \"network\";\n console.error(chalk.dim(` [venice] retry ${attempt}/${RETRY_MAX_ATTEMPTS} after ${delayMs}ms — ${reason}`));\n await sleep(delayMs);\n }\n }\n\n if (!res || lastErr) {\n // Defensive — the loop either breaks on success or throws on final failure.\n throw lastErr ?? new Error(\"Venice inference failed: no response\");\n }\n\n const data = await res.json();\n const choice = data.choices?.[0];\n if (!choice) {\n throw new Error(\"Venice returned no choices\");\n }\n\n return {\n content: choice.message?.content ?? \"\",\n model: data.model ?? opts.model,\n usage: {\n promptTokens: data.usage?.prompt_tokens ?? 0,\n completionTokens: data.usage?.completion_tokens ?? 0,\n totalTokens: data.usage?.total_tokens ?? 0,\n },\n };\n}\n\n/**\n * List available Venice models.\n * Requires a provisioned API key.\n */\nexport async function listModels(): Promise<string[]> {\n const apiKey = getVeniceApiKey();\n if (!apiKey) {\n throw new Error(\"No Venice API key configured. Run 'sherwood venice provision' first.\");\n }\n\n const res = await fetch(`${VENICE_API_BASE}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(15_000),\n });\n\n if (!res.ok) {\n throw new Error(`Failed to list Venice models: ${res.status} ${res.statusText}`);\n }\n\n const data = await res.json();\n return (data.data ?? []).map((m: { id: string }) => m.id);\n}\n"],"mappings":"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","names":[]}
@@ -1,18 +1,21 @@
1
1
  import {
2
2
  EAS_CONTRACTS,
3
3
  EAS_SCHEMAS
4
- } from "./chunk-MT3VS3GZ.js";
4
+ } from "./chunk-FWC57PT7.js";
5
5
  import {
6
6
  getAccount,
7
7
  getPublicClient,
8
8
  waitForReceipt,
9
9
  writeContractWithRetry
10
- } from "./chunk-M2NJPATE.js";
10
+ } from "./chunk-XDBRKW7I.js";
11
11
  import {
12
+ CHAIN_REGISTRY,
12
13
  getChain,
13
14
  getChainConfig,
14
- getNetwork
15
- } from "./chunk-2YOXRATG.js";
15
+ getNetwork,
16
+ isTestnet,
17
+ withNetwork
18
+ } from "./chunk-2LRC7I33.js";
16
19
  import {
17
20
  EAS_ABI
18
21
  } from "./chunk-D77JGXIV.js";
@@ -30,11 +33,15 @@ var TRADE_EXECUTED_PARAMS = parseAbiParameters("address, address, uint256, strin
30
33
  function assertSchemasRegistered() {
31
34
  const schemas = EAS_SCHEMAS();
32
35
  if (schemas.SYNDICATE_JOIN_REQUEST === ZERO_BYTES32 || schemas.AGENT_APPROVED === ZERO_BYTES32) {
36
+ const flag = isTestnet() ? " --testnet" : "";
33
37
  throw new Error(
34
- "EAS schemas not registered. Run: npx tsx scripts/register-eas-schemas.ts --testnet"
38
+ `EAS schemas not registered on ${getNetwork()}. Run: cd cli && npx tsx scripts/register-eas-schemas.ts${flag}`
35
39
  );
36
40
  }
37
41
  }
42
+ function getEasNetwork() {
43
+ return isTestnet() ? "base-sepolia" : "base";
44
+ }
38
45
  function getEasGraphqlUrl() {
39
46
  const url = getChainConfig().easGraphqlUrl;
40
47
  if (!url) {
@@ -45,12 +52,16 @@ function getEasGraphqlUrl() {
45
52
  return url;
46
53
  }
47
54
  function getEasScanUrl(uid) {
48
- const host = getChainConfig().easScanHost;
55
+ const host = CHAIN_REGISTRY[getEasNetwork()].easScanHost;
49
56
  if (!host) {
50
- throw new Error(`EAS scan is not available on ${getNetwork()}.`);
57
+ throw new Error(`EAS scan host is not configured on ${getEasNetwork()}.`);
51
58
  }
52
59
  return `https://${host}/attestation/view/${uid}`;
53
60
  }
61
+ function getEasExplorerUrl(txHash) {
62
+ const host = CHAIN_REGISTRY[getEasNetwork()].explorerHost;
63
+ return `https://${host}/tx/${txHash}`;
64
+ }
54
65
  function extractAttestationUid(receipt) {
55
66
  for (const log of receipt.logs) {
56
67
  if (log.topics[0] !== ATTESTED_TOPIC) continue;
@@ -60,7 +71,8 @@ function extractAttestationUid(receipt) {
60
71
  }
61
72
  throw new Error("Could not extract attestation UID from transaction receipt");
62
73
  }
63
- var REF_PREFIX_RE = /^\[ref:(\d+)\]\s*/;
74
+ var CHAIN_PREFIX_RE = /^\[chain:([a-z0-9-]+)\]\s*/;
75
+ var REF_PREFIX_RE = /^(?:\[chain:[a-z0-9-]+\]\s*)?\[ref:(\d+)\]\s*/;
64
76
  function formatMessageWithRef(message, referrerAgentId) {
65
77
  if (referrerAgentId == null) return message;
66
78
  return `[ref:${referrerAgentId}] ${message}`;
@@ -69,72 +81,85 @@ function parseReferrer(message) {
69
81
  const match = message.match(REF_PREFIX_RE);
70
82
  return match ? parseInt(match[1], 10) : null;
71
83
  }
84
+ function formatMessageWithChain(message, sourceNetwork, easNetwork) {
85
+ if (sourceNetwork === easNetwork) return message;
86
+ return `[chain:${sourceNetwork}] ${message}`;
87
+ }
88
+ function parseChain(message) {
89
+ const match = message.match(CHAIN_PREFIX_RE);
90
+ return match ? match[1] : null;
91
+ }
72
92
  function stripReferrerPrefix(message) {
73
- return message.replace(REF_PREFIX_RE, "");
93
+ return message.replace(REF_PREFIX_RE, "").replace(CHAIN_PREFIX_RE, "");
74
94
  }
75
95
  async function createJoinRequest(syndicateId, agentId, vault, creatorAddress, message, referrerAgentId) {
76
- assertSchemasRegistered();
77
- const client = getPublicClient();
78
- const encodedMessage = formatMessageWithRef(message, referrerAgentId);
79
- const data = encodeAbiParameters(JOIN_REQUEST_PARAMS, [
80
- syndicateId,
81
- agentId,
82
- vault,
83
- encodedMessage
84
- ]);
85
- const hash = await writeContractWithRetry({
86
- account: getAccount(),
87
- chain: getChain(),
88
- address: EAS_CONTRACTS().EAS,
89
- abi: EAS_ABI,
90
- functionName: "attest",
91
- args: [{
92
- schema: EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST,
93
- data: {
94
- recipient: creatorAddress,
95
- expirationTime: 0n,
96
- revocable: true,
97
- refUID: ZERO_BYTES32,
98
- data,
99
- value: 0n
100
- }
101
- }],
102
- value: 0n
96
+ const sourceNetwork = getNetwork();
97
+ const easNetwork = getEasNetwork();
98
+ const messageWithRef = formatMessageWithRef(message, referrerAgentId);
99
+ const encodedMessage = formatMessageWithChain(messageWithRef, sourceNetwork, easNetwork);
100
+ return withNetwork(easNetwork, async () => {
101
+ assertSchemasRegistered();
102
+ const data = encodeAbiParameters(JOIN_REQUEST_PARAMS, [
103
+ syndicateId,
104
+ agentId,
105
+ vault,
106
+ encodedMessage
107
+ ]);
108
+ const hash = await writeContractWithRetry({
109
+ account: getAccount(),
110
+ chain: getChain(),
111
+ address: EAS_CONTRACTS().EAS,
112
+ abi: EAS_ABI,
113
+ functionName: "attest",
114
+ args: [{
115
+ schema: EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST,
116
+ data: {
117
+ recipient: creatorAddress,
118
+ expirationTime: 0n,
119
+ revocable: true,
120
+ refUID: ZERO_BYTES32,
121
+ data,
122
+ value: 0n
123
+ }
124
+ }],
125
+ value: 0n
126
+ });
127
+ const receipt = await waitForReceipt(hash);
128
+ const uid = extractAttestationUid(receipt);
129
+ return { uid, hash };
103
130
  });
104
- const receipt = await waitForReceipt(hash);
105
- const uid = extractAttestationUid(receipt);
106
- return { uid, hash };
107
131
  }
108
132
  async function createApproval(syndicateId, agentId, vault, agentAddress) {
109
- assertSchemasRegistered();
110
- const client = getPublicClient();
111
- const data = encodeAbiParameters(AGENT_APPROVED_PARAMS, [
112
- syndicateId,
113
- agentId,
114
- vault
115
- ]);
116
- const hash = await writeContractWithRetry({
117
- account: getAccount(),
118
- chain: getChain(),
119
- address: EAS_CONTRACTS().EAS,
120
- abi: EAS_ABI,
121
- functionName: "attest",
122
- args: [{
123
- schema: EAS_SCHEMAS().AGENT_APPROVED,
124
- data: {
125
- recipient: agentAddress,
126
- expirationTime: 0n,
127
- revocable: true,
128
- refUID: ZERO_BYTES32,
129
- data,
130
- value: 0n
131
- }
132
- }],
133
- value: 0n
133
+ return withNetwork(getEasNetwork(), async () => {
134
+ assertSchemasRegistered();
135
+ const data = encodeAbiParameters(AGENT_APPROVED_PARAMS, [
136
+ syndicateId,
137
+ agentId,
138
+ vault
139
+ ]);
140
+ const hash = await writeContractWithRetry({
141
+ account: getAccount(),
142
+ chain: getChain(),
143
+ address: EAS_CONTRACTS().EAS,
144
+ abi: EAS_ABI,
145
+ functionName: "attest",
146
+ args: [{
147
+ schema: EAS_SCHEMAS().AGENT_APPROVED,
148
+ data: {
149
+ recipient: agentAddress,
150
+ expirationTime: 0n,
151
+ revocable: true,
152
+ refUID: ZERO_BYTES32,
153
+ data,
154
+ value: 0n
155
+ }
156
+ }],
157
+ value: 0n
158
+ });
159
+ const receipt = await waitForReceipt(hash);
160
+ const uid = extractAttestationUid(receipt);
161
+ return { uid, hash };
134
162
  });
135
- const receipt = await waitForReceipt(hash);
136
- const uid = extractAttestationUid(receipt);
137
- return { uid, hash };
138
163
  }
139
164
  async function revokeAttestation(schemaUid, attestationUid) {
140
165
  return writeContractWithRetry({
@@ -153,6 +178,12 @@ async function revokeAttestation(schemaUid, attestationUid) {
153
178
  value: 0n
154
179
  });
155
180
  }
181
+ async function revokeJoinRequest(attestationUid) {
182
+ return withNetwork(
183
+ getEasNetwork(),
184
+ () => revokeAttestation(EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST, attestationUid)
185
+ );
186
+ }
156
187
  async function createResearchAttestation(provider, queryType, prompt, costUsdc, resultUri, recipient) {
157
188
  const schemas = EAS_SCHEMAS();
158
189
  if (schemas.X402_RESEARCH === ZERO_BYTES32) {
@@ -295,6 +326,9 @@ function skipAttestation(name) {
295
326
  return { uid: ZERO_BYTES32, hash: ZERO_BYTES32 };
296
327
  }
297
328
  async function queryApprovals(attester) {
329
+ return withNetwork(getEasNetwork(), () => queryApprovalsImpl(attester));
330
+ }
331
+ async function queryApprovalsImpl(attester) {
298
332
  assertSchemasRegistered();
299
333
  const schemaUid = EAS_SCHEMAS().AGENT_APPROVED;
300
334
  const url = getEasGraphqlUrl();
@@ -345,6 +379,9 @@ async function queryApprovals(attester) {
345
379
  });
346
380
  }
347
381
  async function queryJoinRequests(recipient) {
382
+ return withNetwork(getEasNetwork(), () => queryJoinRequestsImpl(recipient));
383
+ }
384
+ async function queryJoinRequestsImpl(recipient) {
348
385
  assertSchemasRegistered();
349
386
  const schemaUid = EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST;
350
387
  const url = getEasGraphqlUrl();
@@ -397,13 +434,18 @@ async function queryJoinRequests(recipient) {
397
434
  }
398
435
 
399
436
  export {
437
+ getEasNetwork,
400
438
  getEasScanUrl,
439
+ getEasExplorerUrl,
401
440
  formatMessageWithRef,
402
441
  parseReferrer,
442
+ formatMessageWithChain,
443
+ parseChain,
403
444
  stripReferrerPrefix,
404
445
  createJoinRequest,
405
446
  createApproval,
406
447
  revokeAttestation,
448
+ revokeJoinRequest,
407
449
  createResearchAttestation,
408
450
  createVeniceProvisionAttestation,
409
451
  createVeniceInferenceAttestation,
@@ -411,4 +453,4 @@ export {
411
453
  queryApprovals,
412
454
  queryJoinRequests
413
455
  };
414
- //# sourceMappingURL=chunk-DG2K6CPY.js.map
456
+ //# sourceMappingURL=chunk-E6LH2FJ6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/eas.ts"],"sourcesContent":["/**\n * EAS (Ethereum Attestation Service) wrapper for syndicate join requests and approvals.\n *\n * Uses viem for on-chain writes and the EAS GraphQL API for queries.\n * No ethers dependency — attestation data is encoded with viem's encodeAbiParameters.\n */\n\nimport type { Address, Hex } from \"viem\";\nimport { encodeAbiParameters, parseAbiParameters, decodeAbiParameters } from \"viem\";\nimport { getPublicClient, getAccount, writeContractWithRetry, waitForReceipt } from \"./client.js\";\nimport { getChain, getNetwork, getChainConfig, withNetwork, isTestnet, CHAIN_REGISTRY, type Network } from \"./network.js\";\nimport { EAS_CONTRACTS, EAS_SCHEMAS } from \"./addresses.js\";\nimport { EAS_ABI } from \"./abis.js\";\n\n// ── Schema definitions ──\n\nconst ZERO_BYTES32 = \"0x0000000000000000000000000000000000000000000000000000000000000000\" as Hex;\n\n// keccak256(\"Attested(address,address,bytes32,bytes32)\")\nconst ATTESTED_TOPIC = \"0x8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35\" as Hex;\n\nconst JOIN_REQUEST_PARAMS = parseAbiParameters(\"uint256, uint256, address, string\");\nconst AGENT_APPROVED_PARAMS = parseAbiParameters(\"uint256, uint256, address\");\nconst X402_RESEARCH_PARAMS = parseAbiParameters(\"string, string, string, string, string\");\nconst VENICE_PROVISION_PARAMS = parseAbiParameters(\"address, string\");\nconst VENICE_INFERENCE_PARAMS = parseAbiParameters(\"string, uint256, uint256, string\");\nconst TRADE_EXECUTED_PARAMS = parseAbiParameters(\"address, address, uint256, string, string, string\");\n\nfunction assertSchemasRegistered() {\n const schemas = EAS_SCHEMAS();\n if (schemas.SYNDICATE_JOIN_REQUEST === ZERO_BYTES32 || schemas.AGENT_APPROVED === ZERO_BYTES32) {\n const flag = isTestnet() ? \" --testnet\" : \"\";\n throw new Error(\n `EAS schemas not registered on ${getNetwork()}. Run: cd cli && npx tsx scripts/register-eas-schemas.ts${flag}`,\n );\n }\n}\n\n/**\n * The chain where syndicate-coordination attestations live. Base for mainnet\n * flows, Base-Sepolia for testnet flows, regardless of which chain the\n * syndicate itself runs on. EAS isn't deployed on HyperEVM / Robinhood, but\n * we still want creators to see join requests and approvals — pinning all\n * coordination attestations to Base solves that without a per-chain EAS\n * deployment. Vault addresses inside the attestation payload remain unique\n * across chains (post-CREATE3 too), so cross-chain syndicates don't collide\n * in the EAS index.\n */\nexport function getEasNetwork(): Network {\n return isTestnet() ? \"base-sepolia\" : \"base\";\n}\n\n// ── GraphQL ──\n\nfunction getEasGraphqlUrl(): string {\n const url = getChainConfig().easGraphqlUrl;\n if (!url) {\n throw new Error(\n `EAS is not available on ${getNetwork()}. Attestation operations require a chain with EAS (e.g. base, base-sepolia).`,\n );\n }\n return url;\n}\n\nexport function getEasScanUrl(uid: Hex): string {\n // Always use the EAS chain's scan host — attestations live on Base, even\n // for HyperEVM syndicates. Read the registry directly rather than mutating\n // the singleton, since this is a pure URL build.\n const host = CHAIN_REGISTRY[getEasNetwork()].easScanHost;\n if (!host) {\n throw new Error(`EAS scan host is not configured on ${getEasNetwork()}.`);\n }\n return `https://${host}/attestation/view/${uid}`;\n}\n\n/**\n * The block-explorer URL for a tx that ran on the EAS chain. Use this for\n * attestation create/revoke txs so the link points to base(-sepolia) scan\n * even when the active --chain is HyperEVM / Robinhood.\n */\nexport function getEasExplorerUrl(txHash: string): string {\n const host = CHAIN_REGISTRY[getEasNetwork()].explorerHost;\n return `https://${host}/tx/${txHash}`;\n}\n\n// ── Attestation Creation ──\n\n/**\n * Extract the attestation UID from a transaction receipt.\n * The EAS contract emits: event Attested(address indexed recipient, address indexed attester, bytes32 uid, bytes32 indexed schemaUID)\n * uid is a non-indexed parameter in the event data.\n */\nfunction extractAttestationUid(receipt: { logs: readonly { topics: readonly Hex[]; data: Hex }[] }): Hex {\n for (const log of receipt.logs) {\n // Match the Attested event signature to avoid false positives from other events\n if (log.topics[0] !== ATTESTED_TOPIC) continue;\n // Attested event has 4 topics (sig + 3 indexed) and data contains the uid (bytes32)\n if (log.topics.length === 4 && log.data.length >= 66) {\n return (\"0x\" + log.data.slice(2, 66)) as Hex;\n }\n }\n throw new Error(\"Could not extract attestation UID from transaction receipt\");\n}\n\n// ── Message Prefix Helpers ──\n//\n// Join-request messages can carry CLI metadata as bracketed prefixes. Order\n// is `[chain:<network>] [ref:<id>] body` — chain outer because the chain\n// disambiguates the syndicate, ref inner because it's optional and per-user.\n// Both prefixes are stripped before display.\n\nconst CHAIN_PREFIX_RE = /^\\[chain:([a-z0-9-]+)\\]\\s*/;\n// Tolerate an optional leading [chain:...] prefix so parseReferrer keeps\n// working when both metadata fields are encoded.\nconst REF_PREFIX_RE = /^(?:\\[chain:[a-z0-9-]+\\]\\s*)?\\[ref:(\\d+)\\]\\s*/;\n\n/**\n * Format a message with an optional referrer prefix.\n * e.g. formatMessageWithRef(\"Hello\", 42) → \"[ref:42] Hello\"\n */\nexport function formatMessageWithRef(message: string, referrerAgentId?: number): string {\n if (referrerAgentId == null) return message;\n return `[ref:${referrerAgentId}] ${message}`;\n}\n\n/**\n * Parse a referrer agentId from a message, if present.\n * e.g. parseReferrer(\"[ref:42] Hello\") → 42\n * parseReferrer(\"[chain:hyperevm] [ref:42] Hello\") → 42\n */\nexport function parseReferrer(message: string): number | null {\n const match = message.match(REF_PREFIX_RE);\n return match ? parseInt(match[1], 10) : null;\n}\n\n/**\n * Format a message with a `[chain:<network>]` prefix when the syndicate\n * lives on a chain other than the EAS chain (Base / Base-Sepolia). Skipped\n * when source matches the EAS chain to avoid noise on the common case.\n */\nexport function formatMessageWithChain(\n message: string,\n sourceNetwork: Network,\n easNetwork: Network,\n): string {\n if (sourceNetwork === easNetwork) return message;\n return `[chain:${sourceNetwork}] ${message}`;\n}\n\n/**\n * Parse the source-chain prefix from a message, if present.\n * Returns null when no `[chain:<network>]` prefix is found, which means the\n * attestation was created from the EAS chain itself (e.g. base attestation\n * for a base syndicate).\n */\nexport function parseChain(message: string): string | null {\n const match = message.match(CHAIN_PREFIX_RE);\n return match ? match[1] : null;\n}\n\n/**\n * Strip both `[chain:...]` and `[ref:...]` prefixes from a message,\n * returning the clean human-facing body. Name kept for backward compat.\n */\nexport function stripReferrerPrefix(message: string): string {\n // REF_PREFIX_RE already swallows an optional leading chain prefix when ref\n // is present; the second replace handles a chain prefix without ref.\n return message.replace(REF_PREFIX_RE, \"\").replace(CHAIN_PREFIX_RE, \"\");\n}\n\n/**\n * Create a SYNDICATE_JOIN_REQUEST attestation.\n * Attester: the calling agent. Recipient: the syndicate creator.\n * If referrerAgentId is provided, it's embedded in the message as a [ref:N] prefix.\n */\nexport async function createJoinRequest(\n syndicateId: bigint,\n agentId: bigint,\n vault: Address,\n creatorAddress: Address,\n message: string,\n referrerAgentId?: number,\n): Promise<{ uid: Hex; hash: Hex }> {\n // Capture the syndicate's source chain BEFORE switching to the EAS chain\n // so we can encode it in the message prefix.\n const sourceNetwork = getNetwork();\n const easNetwork = getEasNetwork();\n const messageWithRef = formatMessageWithRef(message, referrerAgentId);\n const encodedMessage = formatMessageWithChain(messageWithRef, sourceNetwork, easNetwork);\n\n return withNetwork(easNetwork, async () => {\n assertSchemasRegistered();\n\n const data = encodeAbiParameters(JOIN_REQUEST_PARAMS, [\n syndicateId, agentId, vault, encodedMessage,\n ]);\n\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST,\n data: {\n recipient: creatorAddress,\n expirationTime: 0n,\n revocable: true,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n\n return { uid, hash };\n });\n}\n\n/**\n * Create an AGENT_APPROVED attestation.\n * Attester: the syndicate creator. Recipient: the agent wallet.\n */\nexport async function createApproval(\n syndicateId: bigint,\n agentId: bigint,\n vault: Address,\n agentAddress: Address,\n): Promise<{ uid: Hex; hash: Hex }> {\n return withNetwork(getEasNetwork(), async () => {\n assertSchemasRegistered();\n\n const data = encodeAbiParameters(AGENT_APPROVED_PARAMS, [\n syndicateId, agentId, vault,\n ]);\n\n const hash = await writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: EAS_SCHEMAS().AGENT_APPROVED,\n data: {\n recipient: agentAddress,\n expirationTime: 0n,\n revocable: true,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n\n return { uid, hash };\n });\n}\n\n/**\n * Revoke an attestation. Only the original attester can revoke. Uses the\n * active chain's EAS — call sites that revoke syndicate-coordination\n * attestations (join requests, approvals) should go through\n * `revokeJoinRequest` / `revokeApproval` so the revoke lands on the same\n * chain as the original attestation (Base / Base-Sepolia).\n */\nexport async function revokeAttestation(\n schemaUid: Hex,\n attestationUid: Hex,\n): Promise<Hex> {\n return writeContractWithRetry({\n account: getAccount(),\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"revoke\",\n args: [{\n schema: schemaUid,\n data: {\n uid: attestationUid,\n value: 0n,\n },\n }],\n value: 0n,\n });\n}\n\n/** Revoke a SYNDICATE_JOIN_REQUEST on the EAS chain (Base / Base-Sepolia). */\nexport async function revokeJoinRequest(attestationUid: Hex): Promise<Hex> {\n return withNetwork(getEasNetwork(), () =>\n revokeAttestation(EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST, attestationUid),\n );\n}\n\n/**\n * Create an X402_RESEARCH attestation — records a research query on-chain.\n * Attester: the agent. Recipient: vault address (links to syndicate) or agent itself.\n * Schema: \"string provider, string queryType, string prompt, string costUsdc, string resultUri\"\n */\nexport async function createResearchAttestation(\n provider: string,\n queryType: string,\n prompt: string,\n costUsdc: string,\n resultUri: string,\n recipient?: Address,\n): Promise<{ uid: Hex; hash: Hex }> {\n const schemas = EAS_SCHEMAS();\n if (schemas.X402_RESEARCH === ZERO_BYTES32) {\n throw new Error(\n \"X402_RESEARCH schema not registered. Run: npx tsx scripts/register-eas-schemas.ts --testnet\",\n );\n }\n\n const client = getPublicClient();\n const account = getAccount();\n\n const data = encodeAbiParameters(X402_RESEARCH_PARAMS, [\n provider, queryType, prompt, costUsdc, resultUri,\n ]);\n\n const hash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: schemas.X402_RESEARCH,\n data: {\n recipient: recipient ?? account.address,\n expirationTime: 0n,\n revocable: false,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n\n return { uid, hash };\n}\n\n/**\n * Create a VENICE_PROVISION attestation — records that an agent provisioned a Venice API key.\n * Schema: \"address agent, string status\"\n */\nexport async function createVeniceProvisionAttestation(\n agent: Address,\n): Promise<{ uid: Hex; hash: Hex }> {\n const schemas = EAS_SCHEMAS();\n if (schemas.VENICE_PROVISION === ZERO_BYTES32) return skipAttestation(\"VENICE_PROVISION\");\n\n const client = getPublicClient();\n const account = getAccount();\n\n const data = encodeAbiParameters(VENICE_PROVISION_PARAMS, [agent, \"provisioned\"]);\n\n const hash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: schemas.VENICE_PROVISION,\n data: {\n recipient: agent,\n expirationTime: 0n,\n revocable: false,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n return { uid, hash };\n}\n\n/**\n * Create a VENICE_INFERENCE attestation — records an inference call.\n * Attester: the agent. Recipient: vault address (links to syndicate) or agent itself.\n * Schema: \"string model, uint256 promptTokens, uint256 completionTokens, string promptHash\"\n */\nexport async function createVeniceInferenceAttestation(\n model: string,\n promptTokens: number,\n completionTokens: number,\n promptHash: string,\n recipient?: Address,\n): Promise<{ uid: Hex; hash: Hex }> {\n const schemas = EAS_SCHEMAS();\n if (schemas.VENICE_INFERENCE === ZERO_BYTES32) return skipAttestation(\"VENICE_INFERENCE\");\n\n const client = getPublicClient();\n const account = getAccount();\n\n const data = encodeAbiParameters(VENICE_INFERENCE_PARAMS, [\n model,\n BigInt(promptTokens),\n BigInt(completionTokens),\n promptHash,\n ]);\n\n const hash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: schemas.VENICE_INFERENCE,\n data: {\n recipient: recipient ?? account.address,\n expirationTime: 0n,\n revocable: false,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n return { uid, hash };\n}\n\n/**\n * Create a TRADE_EXECUTED attestation — records a swap on-chain.\n * Attester: the agent. Recipient: vault address (links to syndicate) or agent itself.\n * Schema: \"address tokenIn, address tokenOut, uint256 amountIn, string amountOut, string txHash, string routing\"\n */\nexport async function createTradeAttestation(\n tokenIn: Address,\n tokenOut: Address,\n amountIn: bigint,\n amountOut: string,\n txHash: string,\n routing: string,\n recipient?: Address,\n): Promise<{ uid: Hex; hash: Hex }> {\n const schemas = EAS_SCHEMAS();\n if (schemas.TRADE_EXECUTED === ZERO_BYTES32) return skipAttestation(\"TRADE_EXECUTED\");\n\n const client = getPublicClient();\n const account = getAccount();\n\n const data = encodeAbiParameters(TRADE_EXECUTED_PARAMS, [\n tokenIn, tokenOut, amountIn, amountOut, txHash, routing,\n ]);\n\n const hash = await writeContractWithRetry({\n account,\n chain: getChain(),\n address: EAS_CONTRACTS().EAS,\n abi: EAS_ABI,\n functionName: \"attest\",\n args: [{\n schema: schemas.TRADE_EXECUTED,\n data: {\n recipient: recipient ?? account.address,\n expirationTime: 0n,\n revocable: false,\n refUID: ZERO_BYTES32,\n data,\n value: 0n,\n },\n }],\n value: 0n,\n });\n\n const receipt = await waitForReceipt(hash);\n const uid = extractAttestationUid(receipt);\n return { uid, hash };\n}\n\n/** Skip attestation gracefully when schema isn't registered on this chain. */\nfunction skipAttestation(name: string): { uid: Hex; hash: Hex } {\n return { uid: ZERO_BYTES32, hash: ZERO_BYTES32 };\n}\n\n// ── Attestation Queries ──\n\nexport interface JoinRequestAttestation {\n uid: Hex;\n attester: Address;\n recipient: Address;\n time: number;\n decoded: {\n syndicateId: bigint;\n agentId: bigint;\n vault: Address;\n message: string;\n };\n}\n\n/**\n * Query pending (non-revoked) join requests for a given recipient (creator address).\n * Uses the EAS GraphQL API.\n */\nexport interface ApprovalAttestation {\n uid: Hex;\n attester: Address;\n recipient: Address;\n time: number;\n decoded: {\n syndicateId: bigint;\n agentId: bigint;\n vault: Address;\n };\n}\n\n/**\n * Query existing (non-revoked) AGENT_APPROVED attestations created by a given attester (creator).\n * Used to check for duplicates before creating a new approval and to filter already-approved agents from requests.\n */\nexport async function queryApprovals(\n attester: Address,\n): Promise<ApprovalAttestation[]> {\n return withNetwork(getEasNetwork(), () => queryApprovalsImpl(attester));\n}\n\nasync function queryApprovalsImpl(attester: Address): Promise<ApprovalAttestation[]> {\n assertSchemasRegistered();\n const schemaUid = EAS_SCHEMAS().AGENT_APPROVED;\n const url = getEasGraphqlUrl();\n\n const query = `\n query Approvals($schemaId: String!, $attester: String!) {\n attestations(\n where: {\n schemaId: { equals: $schemaId }\n attester: { equals: $attester }\n revoked: { equals: false }\n }\n orderBy: [{ time: desc }]\n ) {\n id\n attester\n recipient\n time\n data\n }\n }\n `;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query,\n variables: { schemaId: schemaUid, attester },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`EAS GraphQL query failed: ${response.statusText}`);\n }\n\n const json = await response.json() as {\n data?: {\n attestations: Array<{\n id: string;\n attester: string;\n recipient: string;\n time: number;\n data: string;\n }>;\n };\n };\n\n if (!json.data?.attestations) return [];\n\n return json.data.attestations.map((a) => {\n const decoded = decodeAbiParameters(AGENT_APPROVED_PARAMS, a.data as Hex);\n return {\n uid: a.id as Hex,\n attester: a.attester as Address,\n recipient: a.recipient as Address,\n time: a.time,\n decoded: {\n syndicateId: decoded[0],\n agentId: decoded[1],\n vault: decoded[2],\n },\n };\n });\n}\n\nexport async function queryJoinRequests(\n recipient: Address,\n): Promise<JoinRequestAttestation[]> {\n return withNetwork(getEasNetwork(), () => queryJoinRequestsImpl(recipient));\n}\n\nasync function queryJoinRequestsImpl(recipient: Address): Promise<JoinRequestAttestation[]> {\n assertSchemasRegistered();\n const schemaUid = EAS_SCHEMAS().SYNDICATE_JOIN_REQUEST;\n const url = getEasGraphqlUrl();\n\n const query = `\n query JoinRequests($schemaId: String!, $recipient: String!) {\n attestations(\n where: {\n schemaId: { equals: $schemaId }\n recipient: { equals: $recipient }\n revoked: { equals: false }\n }\n orderBy: [{ time: desc }]\n ) {\n id\n attester\n recipient\n time\n data\n }\n }\n `;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query,\n variables: { schemaId: schemaUid, recipient },\n }),\n });\n\n if (!response.ok) {\n throw new Error(`EAS GraphQL query failed: ${response.statusText}`);\n }\n\n const json = await response.json() as {\n data?: {\n attestations: Array<{\n id: string;\n attester: string;\n recipient: string;\n time: number;\n data: string;\n }>;\n };\n };\n\n if (!json.data?.attestations) return [];\n\n return json.data.attestations.map((a) => {\n const decoded = decodeAbiParameters(JOIN_REQUEST_PARAMS, a.data as Hex);\n return {\n uid: a.id as Hex,\n attester: a.attester as Address,\n recipient: a.recipient as Address,\n time: a.time,\n decoded: {\n syndicateId: decoded[0],\n agentId: decoded[1],\n vault: decoded[2],\n message: decoded[3],\n },\n };\n });\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getNetwork
3
- } from "./chunk-2YOXRATG.js";
3
+ } from "./chunk-2LRC7I33.js";
4
4
 
5
5
  // src/lib/addresses.ts
6
6
  var ZERO = "0x0000000000000000000000000000000000000000";
@@ -467,4 +467,4 @@ export {
467
467
  SYNTHRA,
468
468
  CHAINLINK
469
469
  };
470
- //# sourceMappingURL=chunk-MT3VS3GZ.js.map
470
+ //# sourceMappingURL=chunk-FWC57PT7.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  SHERWOOD
3
- } from "./chunk-MT3VS3GZ.js";
3
+ } from "./chunk-FWC57PT7.js";
4
4
  import {
5
5
  getAccount,
6
6
  getPublicClient,
7
7
  waitForReceipt,
8
8
  writeContractWithRetry
9
- } from "./chunk-M2NJPATE.js";
9
+ } from "./chunk-XDBRKW7I.js";
10
10
  import {
11
11
  getChain
12
- } from "./chunk-2YOXRATG.js";
12
+ } from "./chunk-2LRC7I33.js";
13
13
  import {
14
14
  SYNDICATE_FACTORY_ABI
15
15
  } from "./chunk-D77JGXIV.js";
@@ -139,4 +139,4 @@ export {
139
139
  getActiveSyndicates,
140
140
  updateMetadata
141
141
  };
142
- //# sourceMappingURL=chunk-YRCJ3NUX.js.map
142
+ //# sourceMappingURL=chunk-IS2CLLUT.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  SHERWOOD
3
- } from "./chunk-MT3VS3GZ.js";
3
+ } from "./chunk-FWC57PT7.js";
4
4
  import {
5
5
  getAccount,
6
6
  getPublicClient,
7
7
  waitForReceipt,
8
8
  writeContractWithRetry
9
- } from "./chunk-M2NJPATE.js";
9
+ } from "./chunk-XDBRKW7I.js";
10
10
  import {
11
11
  getChain
12
- } from "./chunk-2YOXRATG.js";
12
+ } from "./chunk-2LRC7I33.js";
13
13
  import {
14
14
  SYNDICATE_GOVERNOR_ABI
15
15
  } from "./chunk-D77JGXIV.js";
@@ -429,4 +429,4 @@ export {
429
429
  vetoProposal,
430
430
  setProtocolFeeBps
431
431
  };
432
- //# sourceMappingURL=chunk-YYB4TF6D.js.map
432
+ //# sourceMappingURL=chunk-KJ35EF7N.js.map