@andrewkimjoseph/celina-sdk 0.2.12 → 0.4.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 (78) hide show
  1. package/README.md +27 -0
  2. package/build/abis/gooddollar-identity.d.ts +12 -0
  3. package/build/abis/gooddollar-identity.js +7 -0
  4. package/build/abis/gooddollar-identity.js.map +1 -1
  5. package/build/abis/self-registry.d.ts +194 -0
  6. package/build/abis/self-registry.js +120 -0
  7. package/build/abis/self-registry.js.map +1 -0
  8. package/build/abis/ubi-scheme.d.ts +79 -0
  9. package/build/abis/ubi-scheme.js +59 -0
  10. package/build/abis/ubi-scheme.js.map +1 -0
  11. package/build/analytics/amplitude.d.ts +5 -0
  12. package/build/analytics/amplitude.js +56 -0
  13. package/build/analytics/amplitude.js.map +1 -0
  14. package/build/analytics/config.d.ts +7 -0
  15. package/build/analytics/config.js +30 -0
  16. package/build/analytics/config.js.map +1 -0
  17. package/build/analytics/mcp-tool-events.d.ts +5 -0
  18. package/build/analytics/mcp-tool-events.js +56 -0
  19. package/build/analytics/mcp-tool-events.js.map +1 -0
  20. package/build/analytics/wrap-service.d.ts +5 -0
  21. package/build/analytics/wrap-service.js +36 -0
  22. package/build/analytics/wrap-service.js.map +1 -0
  23. package/build/clients/carbon-rest.d.ts +17 -0
  24. package/build/clients/carbon-rest.js +59 -0
  25. package/build/clients/carbon-rest.js.map +1 -0
  26. package/build/clients/carbon-sdk.d.ts +31 -0
  27. package/build/clients/carbon-sdk.js +48 -0
  28. package/build/clients/carbon-sdk.js.map +1 -0
  29. package/build/clients/self-api.d.ts +82 -0
  30. package/build/clients/self-api.js +242 -0
  31. package/build/clients/self-api.js.map +1 -0
  32. package/build/config/carbon.d.ts +12 -0
  33. package/build/config/carbon.js +13 -0
  34. package/build/config/carbon.js.map +1 -0
  35. package/build/config/gooddollar.d.ts +2 -0
  36. package/build/config/gooddollar.js +2 -0
  37. package/build/config/gooddollar.js.map +1 -1
  38. package/build/config/sdk-config.d.ts +14 -0
  39. package/build/config/sdk-config.js +16 -0
  40. package/build/config/sdk-config.js.map +1 -1
  41. package/build/config/self.d.ts +22 -0
  42. package/build/config/self.js +27 -0
  43. package/build/config/self.js.map +1 -0
  44. package/build/index.d.ts +18 -1
  45. package/build/index.js +28 -13
  46. package/build/index.js.map +1 -1
  47. package/build/services/carbon.service.d.ts +68 -0
  48. package/build/services/carbon.service.js +189 -0
  49. package/build/services/carbon.service.js.map +1 -0
  50. package/build/services/gooddollar.service.d.ts +41 -3
  51. package/build/services/gooddollar.service.js +164 -1
  52. package/build/services/gooddollar.service.js.map +1 -1
  53. package/build/services/self-session-store.d.ts +19 -0
  54. package/build/services/self-session-store.js +28 -0
  55. package/build/services/self-session-store.js.map +1 -0
  56. package/build/services/self.service.d.ts +241 -0
  57. package/build/services/self.service.js +692 -0
  58. package/build/services/self.service.js.map +1 -0
  59. package/build/types/carbon.d.ts +31 -0
  60. package/build/types/carbon.js +2 -0
  61. package/build/types/carbon.js.map +1 -0
  62. package/build/utils/carbon-prepared-flow.d.ts +11 -0
  63. package/build/utils/carbon-prepared-flow.js +25 -0
  64. package/build/utils/carbon-prepared-flow.js.map +1 -0
  65. package/build/utils/carbon-rest-adapter.d.ts +8 -0
  66. package/build/utils/carbon-rest-adapter.js +72 -0
  67. package/build/utils/carbon-rest-adapter.js.map +1 -0
  68. package/build/utils/self-format.d.ts +28 -0
  69. package/build/utils/self-format.js +79 -0
  70. package/build/utils/self-format.js.map +1 -0
  71. package/build/utils/self-signing.d.ts +4 -0
  72. package/build/utils/self-signing.js +38 -0
  73. package/build/utils/self-signing.js.map +1 -0
  74. package/package.json +7 -2
  75. package/tests/catalog/domains/carbon.ts +409 -0
  76. package/tests/catalog/domains/defi.ts +43 -0
  77. package/tests/catalog/domains/self.ts +63 -4
  78. package/tests/catalog/operations.ts +2 -0
@@ -0,0 +1,409 @@
1
+ import type { OperationSpec } from "../types.js";
2
+ import { assertHasKeys } from "../../helpers/assert.js";
3
+
4
+ const CARBON_WALLET = "0x0000000000000000000000000000000000000001" as const;
5
+ const CELO = "0x471EcE3750Da237a93B120cEadFa0b8eA6E3E25";
6
+ const USDC = "0xcebA9300f2b948710d2653dd7D87747AdA2aA3b";
7
+
8
+ function carbonRead(
9
+ id: string,
10
+ tool: string,
11
+ invoke: OperationSpec["sdk"]["invoke"],
12
+ args: () => Record<string, unknown>,
13
+ keys: string[],
14
+ ): OperationSpec {
15
+ return {
16
+ id,
17
+ domain: "carbon",
18
+ layer: "read",
19
+ sdk: { invoke },
20
+ mcp: { tool, arguments: args },
21
+ assert: (result) => assertHasKeys(result, keys),
22
+ };
23
+ }
24
+
25
+ function carbonPrepare(
26
+ id: string,
27
+ tool: string,
28
+ invoke: OperationSpec["sdk"]["invoke"],
29
+ args: () => Record<string, unknown>,
30
+ ): OperationSpec {
31
+ return {
32
+ id,
33
+ domain: "carbon",
34
+ layer: "prepare",
35
+ sdk: { invoke },
36
+ mcp: { tool, arguments: args },
37
+ assert: (result) => assertHasKeys(result, ["status", "warnings"]),
38
+ skip: () =>
39
+ "Carbon prepare tools require valid strategy params; run manually with funded wallet",
40
+ };
41
+ }
42
+
43
+ export const carbonOperations: OperationSpec[] = [
44
+ carbonRead(
45
+ "carbon.getStrategies",
46
+ "get_carbon_strategies",
47
+ (c) => c.carbon.getStrategies(CARBON_WALLET),
48
+ () => ({ wallet_address: CARBON_WALLET }),
49
+ ["status", "warnings"],
50
+ ),
51
+ {
52
+ ...carbonRead(
53
+ "carbon.getStrategy",
54
+ "get_carbon_strategy",
55
+ (c) => c.carbon.getStrategy("1"),
56
+ () => ({ strategy_id: "1" }),
57
+ ["status", "warnings"],
58
+ ),
59
+ skip: () =>
60
+ "Requires an existing Carbon strategy id on Celo (set CELINA_CARBON_STRATEGY_ID)",
61
+ },
62
+ {
63
+ ...carbonRead(
64
+ "carbon.getTradeQuote",
65
+ "get_carbon_trade_quote",
66
+ (c) =>
67
+ c.carbon.getTradeQuote({
68
+ source_token: CELO,
69
+ target_token: USDC,
70
+ amount: 1,
71
+ is_trade_by_target: false,
72
+ }),
73
+ () => ({
74
+ source_token: CELO,
75
+ target_token: USDC,
76
+ amount: 1,
77
+ is_trade_by_target: false,
78
+ }),
79
+ ["status", "warnings"],
80
+ ),
81
+ skip: () =>
82
+ "Carbon get_trade_quote on Celo may fail upstream (ENS); run manually when API is healthy",
83
+ },
84
+ carbonRead(
85
+ "carbon.explorePair",
86
+ "explore_carbon_pair",
87
+ (c) => c.carbon.explorePair({ base_token: CELO, quote_token: USDC }),
88
+ () => ({ base_token: CELO, quote_token: USDC }),
89
+ ["status", "chain"],
90
+ ),
91
+ carbonRead(
92
+ "carbon.resolveToken",
93
+ "resolve_carbon_token",
94
+ (c) => c.carbon.resolveToken("USDC"),
95
+ () => ({ token: "USDC" }),
96
+ ["status", "warnings"],
97
+ ),
98
+ carbonRead(
99
+ "carbon.getActivity",
100
+ "get_carbon_activity",
101
+ (c) => c.carbon.getActivity({ wallet_address: CARBON_WALLET }),
102
+ () => ({ wallet_address: CARBON_WALLET }),
103
+ ["status", "warnings"],
104
+ ),
105
+ {
106
+ ...carbonRead(
107
+ "carbon.findOpportunities",
108
+ "find_carbon_opportunities",
109
+ (c) => c.carbon.findOpportunities({ base_token: CELO, quote_token: USDC }),
110
+ () => ({ base_token: CELO, quote_token: USDC }),
111
+ ["status", "warnings"],
112
+ ),
113
+ skip: () =>
114
+ "Carbon find_opportunities may require market data on Celo; run manually when API returns opportunities",
115
+ },
116
+ carbonRead(
117
+ "carbon.getProtocolStats",
118
+ "get_carbon_protocol_stats",
119
+ (c) => c.carbon.getProtocolStats({ period_days: 7 }),
120
+ () => ({ period_days: 7 }),
121
+ ["status", "chain"],
122
+ ),
123
+ {
124
+ ...carbonRead(
125
+ "carbon.getPriceHistory",
126
+ "get_carbon_price_history",
127
+ (c) =>
128
+ c.carbon.getPriceHistory({
129
+ base_token: CELO,
130
+ quote_token: USDC,
131
+ period_days: 7,
132
+ }),
133
+ () => ({ base_token: CELO, quote_token: USDC, period_days: 7 }),
134
+ ["status", "warnings"],
135
+ ),
136
+ skip: () =>
137
+ "Carbon get_price_history may return 400 for some Celo pairs; run manually when API is healthy",
138
+ },
139
+ {
140
+ ...carbonRead(
141
+ "carbon.simulateStrategy",
142
+ "simulate_carbon_strategy",
143
+ (c) =>
144
+ c.carbon.simulateStrategy({
145
+ base_token: CELO,
146
+ quote_token: USDC,
147
+ days: 7,
148
+ buy_price_low: 0.1,
149
+ buy_price_high: 0.2,
150
+ buy_budget: 10,
151
+ sell_price_low: 0.3,
152
+ sell_price_high: 0.4,
153
+ sell_budget: 5,
154
+ }),
155
+ () => ({
156
+ base_token: CELO,
157
+ quote_token: USDC,
158
+ days: 7,
159
+ buy_price_low: 0.1,
160
+ buy_price_high: 0.2,
161
+ buy_budget: 10,
162
+ sell_price_low: 0.3,
163
+ sell_price_high: 0.4,
164
+ sell_budget: 5,
165
+ }),
166
+ ["status", "warnings"],
167
+ ),
168
+ skip: () =>
169
+ "Carbon simulate_strategy may return 400 upstream on Celo; run manually when API is healthy",
170
+ },
171
+ carbonRead(
172
+ "carbon.help",
173
+ "carbon_help",
174
+ (c) => c.carbon.help("create_limit_order"),
175
+ () => ({ topic: "create_limit_order" }),
176
+ ["status"],
177
+ ),
178
+ carbonRead(
179
+ "carbon.learn",
180
+ "carbon_learn",
181
+ (c) => c.carbon.learn("recurring_strategy"),
182
+ () => ({ topic: "recurring_strategy" }),
183
+ ["status"],
184
+ ),
185
+ carbonPrepare(
186
+ "carbon.prepareLimitOrder",
187
+ "prepare_carbon_limit_order",
188
+ (c) =>
189
+ c.carbon.prepareLimitOrder({
190
+ wallet_address: CARBON_WALLET,
191
+ base_token: CELO,
192
+ quote_token: USDC,
193
+ direction: "buy",
194
+ price: 0.5,
195
+ budget: 10,
196
+ }),
197
+ () => ({
198
+ wallet_address: CARBON_WALLET,
199
+ base_token: CELO,
200
+ quote_token: USDC,
201
+ direction: "buy",
202
+ price: 0.5,
203
+ budget: 10,
204
+ }),
205
+ ),
206
+ carbonPrepare(
207
+ "carbon.prepareRangeOrder",
208
+ "prepare_carbon_range_order",
209
+ (c) =>
210
+ c.carbon.prepareRangeOrder({
211
+ wallet_address: CARBON_WALLET,
212
+ base_token: CELO,
213
+ quote_token: USDC,
214
+ direction: "buy",
215
+ price_low: 0.4,
216
+ price_high: 0.6,
217
+ budget: 10,
218
+ }),
219
+ () => ({
220
+ wallet_address: CARBON_WALLET,
221
+ base_token: CELO,
222
+ quote_token: USDC,
223
+ direction: "buy",
224
+ price_low: 0.4,
225
+ price_high: 0.6,
226
+ budget: 10,
227
+ }),
228
+ ),
229
+ carbonPrepare(
230
+ "carbon.prepareRecurringStrategy",
231
+ "prepare_carbon_recurring_strategy",
232
+ (c) =>
233
+ c.carbon.prepareRecurringStrategy({
234
+ wallet_address: CARBON_WALLET,
235
+ base_token: CELO,
236
+ quote_token: USDC,
237
+ buy_price_low: 0.4,
238
+ buy_price_high: 0.5,
239
+ buy_budget: 10,
240
+ sell_price_low: 0.6,
241
+ sell_price_high: 0.7,
242
+ sell_budget: 5,
243
+ }),
244
+ () => ({
245
+ wallet_address: CARBON_WALLET,
246
+ base_token: CELO,
247
+ quote_token: USDC,
248
+ buy_price_low: 0.4,
249
+ buy_price_high: 0.5,
250
+ buy_budget: 10,
251
+ sell_price_low: 0.6,
252
+ sell_price_high: 0.7,
253
+ sell_budget: 5,
254
+ }),
255
+ ),
256
+ carbonPrepare(
257
+ "carbon.prepareConcentratedStrategy",
258
+ "prepare_carbon_concentrated_strategy",
259
+ (c) =>
260
+ c.carbon.prepareConcentratedStrategy({
261
+ wallet_address: CARBON_WALLET,
262
+ base_token: CELO,
263
+ quote_token: USDC,
264
+ spread_percentage: 1,
265
+ buy_budget: 10,
266
+ sell_budget: 5,
267
+ }),
268
+ () => ({
269
+ wallet_address: CARBON_WALLET,
270
+ base_token: CELO,
271
+ quote_token: USDC,
272
+ spread_percentage: 1,
273
+ buy_budget: 10,
274
+ sell_budget: 5,
275
+ }),
276
+ ),
277
+ carbonPrepare(
278
+ "carbon.prepareFullRangeStrategy",
279
+ "prepare_carbon_full_range_strategy",
280
+ (c) =>
281
+ c.carbon.prepareFullRangeStrategy({
282
+ wallet_address: CARBON_WALLET,
283
+ base_token: CELO,
284
+ quote_token: USDC,
285
+ spread_percentage: 5,
286
+ buy_budget: 10,
287
+ sell_budget: 5,
288
+ }),
289
+ () => ({
290
+ wallet_address: CARBON_WALLET,
291
+ base_token: CELO,
292
+ quote_token: USDC,
293
+ spread_percentage: 5,
294
+ buy_budget: 10,
295
+ sell_budget: 5,
296
+ }),
297
+ ),
298
+ carbonPrepare(
299
+ "carbon.prepareRepriceStrategy",
300
+ "prepare_carbon_reprice_strategy",
301
+ (c) =>
302
+ c.carbon.prepareRepriceStrategy({
303
+ wallet_address: CARBON_WALLET,
304
+ strategy_id: "1",
305
+ buy_price_low: 0.4,
306
+ buy_price_high: 0.5,
307
+ }),
308
+ () => ({
309
+ wallet_address: CARBON_WALLET,
310
+ strategy_id: "1",
311
+ buy_price_low: 0.4,
312
+ buy_price_high: 0.5,
313
+ }),
314
+ ),
315
+ carbonPrepare(
316
+ "carbon.prepareEditStrategy",
317
+ "prepare_carbon_edit_strategy",
318
+ (c) =>
319
+ c.carbon.prepareEditStrategy({
320
+ wallet_address: CARBON_WALLET,
321
+ strategy_id: "1",
322
+ buy_budget: 10,
323
+ }),
324
+ () => ({
325
+ wallet_address: CARBON_WALLET,
326
+ strategy_id: "1",
327
+ buy_budget: 10,
328
+ }),
329
+ ),
330
+ carbonPrepare(
331
+ "carbon.prepareDepositBudget",
332
+ "prepare_carbon_deposit_budget",
333
+ (c) =>
334
+ c.carbon.prepareDepositBudget({
335
+ wallet_address: CARBON_WALLET,
336
+ strategy_id: "1",
337
+ buy_budget: 5,
338
+ }),
339
+ () => ({
340
+ wallet_address: CARBON_WALLET,
341
+ strategy_id: "1",
342
+ buy_budget: 5,
343
+ }),
344
+ ),
345
+ carbonPrepare(
346
+ "carbon.prepareWithdrawBudget",
347
+ "prepare_carbon_withdraw_budget",
348
+ (c) =>
349
+ c.carbon.prepareWithdrawBudget({
350
+ wallet_address: CARBON_WALLET,
351
+ strategy_id: "1",
352
+ buy_budget: 1,
353
+ }),
354
+ () => ({
355
+ wallet_address: CARBON_WALLET,
356
+ strategy_id: "1",
357
+ buy_budget: 1,
358
+ }),
359
+ ),
360
+ carbonPrepare(
361
+ "carbon.preparePauseStrategy",
362
+ "prepare_carbon_pause_strategy",
363
+ (c) =>
364
+ c.carbon.preparePauseStrategy({
365
+ wallet_address: CARBON_WALLET,
366
+ strategy_id: "1",
367
+ }),
368
+ () => ({ wallet_address: CARBON_WALLET, strategy_id: "1" }),
369
+ ),
370
+ carbonPrepare(
371
+ "carbon.prepareResumeStrategy",
372
+ "prepare_carbon_resume_strategy",
373
+ (c) =>
374
+ c.carbon.prepareResumeStrategy({
375
+ wallet_address: CARBON_WALLET,
376
+ strategy_id: "1",
377
+ }),
378
+ () => ({ wallet_address: CARBON_WALLET, strategy_id: "1" }),
379
+ ),
380
+ carbonPrepare(
381
+ "carbon.prepareDeleteStrategy",
382
+ "prepare_carbon_delete_strategy",
383
+ (c) =>
384
+ c.carbon.prepareDeleteStrategy({
385
+ wallet_address: CARBON_WALLET,
386
+ strategy_id: "1",
387
+ }),
388
+ () => ({ wallet_address: CARBON_WALLET, strategy_id: "1" }),
389
+ ),
390
+ carbonPrepare(
391
+ "carbon.prepareTrade",
392
+ "prepare_carbon_trade",
393
+ (c) =>
394
+ c.carbon.prepareTrade({
395
+ wallet_address: CARBON_WALLET,
396
+ source_token: CELO,
397
+ target_token: USDC,
398
+ amount: "1",
399
+ min_return: "0",
400
+ }),
401
+ () => ({
402
+ wallet_address: CARBON_WALLET,
403
+ source_token: CELO,
404
+ target_token: USDC,
405
+ amount: "1",
406
+ min_return: "0",
407
+ }),
408
+ ),
409
+ ];
@@ -261,4 +261,47 @@ export const gooddollarOperations: OperationSpec[] = [
261
261
  assertHasKeys(result, ["isCurrentlyWhitelisted"]);
262
262
  },
263
263
  },
264
+ {
265
+ id: "gooddollar.getUbiClaimEligibility",
266
+ domain: "gooddollar",
267
+ layer: "read",
268
+ sdk: {
269
+ invoke: (client, fx) =>
270
+ client.gooddollar.getUbiClaimEligibility(fx.wallet),
271
+ },
272
+ mcp: {
273
+ tool: "get_gooddollar_ubi_entitlement",
274
+ arguments: (fx) => ({ address: fx.wallet }),
275
+ },
276
+ assert: (result) => {
277
+ assertHasKeys(result, ["isEligibleToClaim", "claimableAmount"]);
278
+ },
279
+ },
280
+ {
281
+ id: "gooddollar.prepareClaimUbi",
282
+ domain: "gooddollar",
283
+ layer: "prepare",
284
+ requiresEnv: ["CELO_PRIVATE_KEY"],
285
+ sdk: {
286
+ invoke: (client, fx) =>
287
+ client.gooddollar.prepareClaimUbi(fromAddress(fx)),
288
+ },
289
+ assert: (result) => {
290
+ assertHasKeys(result, ["from", "steps"]);
291
+ },
292
+ },
293
+ {
294
+ id: "gooddollar.claimDailyUbi",
295
+ domain: "gooddollar",
296
+ layer: "write",
297
+ requiresEnv: ["CELO_PRIVATE_KEY"],
298
+ requiresWrites: true,
299
+ mcp: {
300
+ tool: "claim_daily_gooddollar_ubi",
301
+ arguments: () => ({}),
302
+ },
303
+ assert: (result) => {
304
+ assertHasKeys(result, ["hash"]);
305
+ },
306
+ },
264
307
  ];
@@ -9,6 +9,10 @@ export const selfOperations: OperationSpec[] = [
9
9
  id: "self.verifySelfAgent",
10
10
  domain: "self",
11
11
  layer: "read",
12
+ sdk: {
13
+ invoke: (client, fx) =>
14
+ client.self.verifyAgent({ agentAddress: fx.selfAgentAddress }),
15
+ },
12
16
  mcp: {
13
17
  tool: "verify_self_agent",
14
18
  arguments: (fx) => ({
@@ -23,6 +27,9 @@ export const selfOperations: OperationSpec[] = [
23
27
  id: "self.lookupSelfAgent",
24
28
  domain: "self",
25
29
  layer: "read",
30
+ sdk: {
31
+ invoke: (client, fx) => client.self.lookupAgent(fx.selfAgentId),
32
+ },
26
33
  mcp: {
27
34
  tool: "lookup_self_agent",
28
35
  arguments: (fx) => ({
@@ -38,6 +45,20 @@ export const selfOperations: OperationSpec[] = [
38
45
  domain: "self",
39
46
  layer: "read",
40
47
  requiresEnv: ["SELF_AGENT_PRIVATE_KEY"],
48
+ sdk: {
49
+ invoke: (client, fx) => {
50
+ const args = fx.selfVerifyRequestArgs ?? {};
51
+ return client.self.verifyRequest({
52
+ agentSignature: args.agent_signature as `0x${string}`,
53
+ agentTimestamp: String(args.agent_timestamp),
54
+ method: String(args.method),
55
+ path: String(args.path),
56
+ body: typeof args.body === "string" ? args.body : undefined,
57
+ keytype: typeof args.keytype === "string" ? args.keytype : undefined,
58
+ agentKey: args.agent_key as `0x${string}` | undefined,
59
+ });
60
+ },
61
+ },
41
62
  mcp: {
42
63
  tool: "verify_self_request",
43
64
  arguments: (fx) => fx.selfVerifyRequestArgs ?? {},
@@ -55,6 +76,13 @@ export const selfOperations: OperationSpec[] = [
55
76
  domain: "self",
56
77
  layer: "write",
57
78
  requiresDestructive: true,
79
+ sdk: {
80
+ invoke: (client) =>
81
+ client.self.registerAgent({
82
+ mode: "wallet-free",
83
+ agentName: "celina-test",
84
+ }),
85
+ },
58
86
  mcp: {
59
87
  tool: "register_self_agent",
60
88
  arguments: () => ({
@@ -63,13 +91,19 @@ export const selfOperations: OperationSpec[] = [
63
91
  }),
64
92
  },
65
93
  assert: (result) => {
66
- assertHasKeys(result, ["sessionId"]);
94
+ assertHasKeys(result, ["session_id"]);
67
95
  },
68
96
  },
69
97
  {
70
98
  id: "self.checkSelfRegistration",
71
99
  domain: "self",
72
100
  layer: "read",
101
+ sdk: {
102
+ invoke: (client) =>
103
+ client.self.checkRegistration(
104
+ process.env.CELINA_TEST_SELF_SESSION ?? "missing-session",
105
+ ),
106
+ },
73
107
  mcp: {
74
108
  tool: "check_self_registration",
75
109
  arguments: () => ({
@@ -89,12 +123,16 @@ export const selfOperations: OperationSpec[] = [
89
123
  domain: "self",
90
124
  layer: "read",
91
125
  requiresEnv: ["SELF_AGENT_PRIVATE_KEY"],
126
+ sdk: {
127
+ invoke: (client) => client.self.getIdentity(),
128
+ },
92
129
  mcp: {
93
130
  tool: "get_self_identity",
94
131
  arguments: () => ({}),
95
132
  },
96
133
  assert: (result) => {
97
- assertHasKeys(result, ["agentAddress"]);
134
+ const obj = result as Record<string, unknown>;
135
+ assertHasKeys(obj, obj.registered === false ? ["registered"] : ["address"]);
98
136
  },
99
137
  },
100
138
  {
@@ -103,12 +141,15 @@ export const selfOperations: OperationSpec[] = [
103
141
  layer: "write",
104
142
  requiresEnv: ["SELF_AGENT_PRIVATE_KEY"],
105
143
  requiresDestructive: true,
144
+ sdk: {
145
+ invoke: (client) => client.self.refreshProof(),
146
+ },
106
147
  mcp: {
107
148
  tool: "refresh_self_proof",
108
149
  arguments: () => ({}),
109
150
  },
110
151
  assert: (result) => {
111
- assertHasKeys(result, ["sessionId"]);
152
+ assertHasKeys(result, ["session_id"]);
112
153
  },
113
154
  },
114
155
  {
@@ -117,12 +158,15 @@ export const selfOperations: OperationSpec[] = [
117
158
  layer: "write",
118
159
  requiresEnv: ["SELF_AGENT_PRIVATE_KEY"],
119
160
  requiresDestructive: true,
161
+ sdk: {
162
+ invoke: (client) => client.self.deregisterAgent(),
163
+ },
120
164
  mcp: {
121
165
  tool: "deregister_self_agent",
122
166
  arguments: () => ({}),
123
167
  },
124
168
  assert: (result) => {
125
- assertHasKeys(result, ["sessionId"]);
169
+ assertHasKeys(result, ["session_id"]);
126
170
  },
127
171
  },
128
172
  {
@@ -130,6 +174,13 @@ export const selfOperations: OperationSpec[] = [
130
174
  domain: "self",
131
175
  layer: "read",
132
176
  requiresEnv: ["SELF_AGENT_PRIVATE_KEY"],
177
+ sdk: {
178
+ invoke: (client) =>
179
+ client.self.signRequest({
180
+ method: "GET",
181
+ url: SELF_DEMO_VERIFY_URL,
182
+ }),
183
+ },
133
184
  mcp: {
134
185
  tool: "sign_self_request",
135
186
  arguments: () => ({
@@ -146,6 +197,14 @@ export const selfOperations: OperationSpec[] = [
146
197
  domain: "self",
147
198
  layer: "read",
148
199
  requiresEnv: ["SELF_AGENT_PRIVATE_KEY"],
200
+ sdk: {
201
+ invoke: (client) =>
202
+ client.self.authenticatedFetch({
203
+ method: "POST",
204
+ url: SELF_DEMO_VERIFY_URL,
205
+ body: JSON.stringify({ ping: true }),
206
+ }),
207
+ },
149
208
  mcp: {
150
209
  tool: "authenticated_self_fetch",
151
210
  arguments: () => ({
@@ -15,6 +15,7 @@ import {
15
15
  stakingOperations,
16
16
  } from "./domains/chain-ext.js";
17
17
  import { selfOperations } from "./domains/self.js";
18
+ import { carbonOperations } from "./domains/carbon.js";
18
19
  import type { OperationSpec } from "./types.js";
19
20
 
20
21
  export const OPERATIONS: OperationSpec[] = [
@@ -31,6 +32,7 @@ export const OPERATIONS: OperationSpec[] = [
31
32
  ...nftOperations,
32
33
  ...contractOperations,
33
34
  ...selfOperations,
35
+ ...carbonOperations,
34
36
  ];
35
37
 
36
38
  export const MCP_OPERATIONS = OPERATIONS.filter(