@jinn-network/client 0.1.0-canary.adfd078d

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 (278) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -0
  3. package/deployments/deployment-phase1a-l2-baseSepolia-fast.json +32 -0
  4. package/deployments/deployment-phase1a-token-baseSepolia-fast.json +27 -0
  5. package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +26 -0
  6. package/deployments/deployment-stolas-l2-baseSepolia-fast.json +35 -0
  7. package/dist/adapters/adapter.d.ts +11 -0
  8. package/dist/adapters/adapter.js +2 -0
  9. package/dist/adapters/adapter.js.map +1 -0
  10. package/dist/adapters/local/adapter.d.ts +20 -0
  11. package/dist/adapters/local/adapter.js +146 -0
  12. package/dist/adapters/local/adapter.js.map +1 -0
  13. package/dist/adapters/mech/adapter.d.ts +29 -0
  14. package/dist/adapters/mech/adapter.js +332 -0
  15. package/dist/adapters/mech/adapter.js.map +1 -0
  16. package/dist/adapters/mech/claim-policy.d.ts +40 -0
  17. package/dist/adapters/mech/claim-policy.js +104 -0
  18. package/dist/adapters/mech/claim-policy.js.map +1 -0
  19. package/dist/adapters/mech/contracts.d.ts +44 -0
  20. package/dist/adapters/mech/contracts.js +323 -0
  21. package/dist/adapters/mech/contracts.js.map +1 -0
  22. package/dist/adapters/mech/ipfs.d.ts +43 -0
  23. package/dist/adapters/mech/ipfs.js +142 -0
  24. package/dist/adapters/mech/ipfs.js.map +1 -0
  25. package/dist/adapters/mech/safe.d.ts +15 -0
  26. package/dist/adapters/mech/safe.js +113 -0
  27. package/dist/adapters/mech/safe.js.map +1 -0
  28. package/dist/adapters/mech/types.d.ts +561 -0
  29. package/dist/adapters/mech/types.js +340 -0
  30. package/dist/adapters/mech/types.js.map +1 -0
  31. package/dist/api/balance-build.d.ts +22 -0
  32. package/dist/api/balance-build.js +37 -0
  33. package/dist/api/balance-build.js.map +1 -0
  34. package/dist/api/fleet-build.d.ts +62 -0
  35. package/dist/api/fleet-build.js +91 -0
  36. package/dist/api/fleet-build.js.map +1 -0
  37. package/dist/api/gather-status.d.ts +20 -0
  38. package/dist/api/gather-status.js +137 -0
  39. package/dist/api/gather-status.js.map +1 -0
  40. package/dist/api/history-build.d.ts +32 -0
  41. package/dist/api/history-build.js +48 -0
  42. package/dist/api/history-build.js.map +1 -0
  43. package/dist/api/peers.d.ts +27 -0
  44. package/dist/api/peers.js +94 -0
  45. package/dist/api/peers.js.map +1 -0
  46. package/dist/api/rewards-build.d.ts +20 -0
  47. package/dist/api/rewards-build.js +42 -0
  48. package/dist/api/rewards-build.js.map +1 -0
  49. package/dist/api/server.d.ts +34 -0
  50. package/dist/api/server.js +130 -0
  51. package/dist/api/server.js.map +1 -0
  52. package/dist/api/status-build.d.ts +92 -0
  53. package/dist/api/status-build.js +175 -0
  54. package/dist/api/status-build.js.map +1 -0
  55. package/dist/api/status-rollup-build.d.ts +36 -0
  56. package/dist/api/status-rollup-build.js +69 -0
  57. package/dist/api/status-rollup-build.js.map +1 -0
  58. package/dist/auth/erc8128.d.ts +43 -0
  59. package/dist/auth/erc8128.js +88 -0
  60. package/dist/auth/erc8128.js.map +1 -0
  61. package/dist/bin/jinn.d.ts +11 -0
  62. package/dist/bin/jinn.js +20 -0
  63. package/dist/bin/jinn.js.map +1 -0
  64. package/dist/build-meta.json +3 -0
  65. package/dist/chain-read-errors.d.ts +9 -0
  66. package/dist/chain-read-errors.js +43 -0
  67. package/dist/chain-read-errors.js.map +1 -0
  68. package/dist/cli/action.d.ts +26 -0
  69. package/dist/cli/action.js +56 -0
  70. package/dist/cli/action.js.map +1 -0
  71. package/dist/cli/command.d.ts +62 -0
  72. package/dist/cli/command.js +29 -0
  73. package/dist/cli/command.js.map +1 -0
  74. package/dist/cli/commands/balance.d.ts +3 -0
  75. package/dist/cli/commands/balance.js +46 -0
  76. package/dist/cli/commands/balance.js.map +1 -0
  77. package/dist/cli/commands/bootstrap.d.ts +3 -0
  78. package/dist/cli/commands/bootstrap.js +165 -0
  79. package/dist/cli/commands/bootstrap.js.map +1 -0
  80. package/dist/cli/commands/claim-rewards.d.ts +3 -0
  81. package/dist/cli/commands/claim-rewards.js +121 -0
  82. package/dist/cli/commands/claim-rewards.js.map +1 -0
  83. package/dist/cli/commands/doctor.d.ts +3 -0
  84. package/dist/cli/commands/doctor.js +151 -0
  85. package/dist/cli/commands/doctor.js.map +1 -0
  86. package/dist/cli/commands/fleet-scale.d.ts +3 -0
  87. package/dist/cli/commands/fleet-scale.js +449 -0
  88. package/dist/cli/commands/fleet-scale.js.map +1 -0
  89. package/dist/cli/commands/fleet.d.ts +3 -0
  90. package/dist/cli/commands/fleet.js +45 -0
  91. package/dist/cli/commands/fleet.js.map +1 -0
  92. package/dist/cli/commands/fund-requirements.d.ts +3 -0
  93. package/dist/cli/commands/fund-requirements.js +139 -0
  94. package/dist/cli/commands/fund-requirements.js.map +1 -0
  95. package/dist/cli/commands/history.d.ts +3 -0
  96. package/dist/cli/commands/history.js +61 -0
  97. package/dist/cli/commands/history.js.map +1 -0
  98. package/dist/cli/commands/init.d.ts +3 -0
  99. package/dist/cli/commands/init.js +91 -0
  100. package/dist/cli/commands/init.js.map +1 -0
  101. package/dist/cli/commands/keys-backup.d.ts +3 -0
  102. package/dist/cli/commands/keys-backup.js +107 -0
  103. package/dist/cli/commands/keys-backup.js.map +1 -0
  104. package/dist/cli/commands/logs.d.ts +3 -0
  105. package/dist/cli/commands/logs.js +69 -0
  106. package/dist/cli/commands/logs.js.map +1 -0
  107. package/dist/cli/commands/rewards.d.ts +3 -0
  108. package/dist/cli/commands/rewards.js +54 -0
  109. package/dist/cli/commands/rewards.js.map +1 -0
  110. package/dist/cli/commands/run.d.ts +3 -0
  111. package/dist/cli/commands/run.js +96 -0
  112. package/dist/cli/commands/run.js.map +1 -0
  113. package/dist/cli/commands/status.d.ts +3 -0
  114. package/dist/cli/commands/status.js +54 -0
  115. package/dist/cli/commands/status.js.map +1 -0
  116. package/dist/cli/commands/stop.d.ts +3 -0
  117. package/dist/cli/commands/stop.js +82 -0
  118. package/dist/cli/commands/stop.js.map +1 -0
  119. package/dist/cli/commands/submit-intent.d.ts +3 -0
  120. package/dist/cli/commands/submit-intent.js +169 -0
  121. package/dist/cli/commands/submit-intent.js.map +1 -0
  122. package/dist/cli/commands/version.d.ts +3 -0
  123. package/dist/cli/commands/version.js +114 -0
  124. package/dist/cli/commands/version.js.map +1 -0
  125. package/dist/cli/commands/withdraw.d.ts +3 -0
  126. package/dist/cli/commands/withdraw.js +181 -0
  127. package/dist/cli/commands/withdraw.js.map +1 -0
  128. package/dist/cli/deployment-digest.d.ts +10 -0
  129. package/dist/cli/deployment-digest.js +25 -0
  130. package/dist/cli/deployment-digest.js.map +1 -0
  131. package/dist/cli/execution-context.d.ts +50 -0
  132. package/dist/cli/execution-context.js +154 -0
  133. package/dist/cli/execution-context.js.map +1 -0
  134. package/dist/cli/help.d.ts +3 -0
  135. package/dist/cli/help.js +37 -0
  136. package/dist/cli/help.js.map +1 -0
  137. package/dist/cli/index.d.ts +17 -0
  138. package/dist/cli/index.js +132 -0
  139. package/dist/cli/index.js.map +1 -0
  140. package/dist/cli/introspection-context.d.ts +10 -0
  141. package/dist/cli/introspection-context.js +60 -0
  142. package/dist/cli/introspection-context.js.map +1 -0
  143. package/dist/cli/output.d.ts +36 -0
  144. package/dist/cli/output.js +35 -0
  145. package/dist/cli/output.js.map +1 -0
  146. package/dist/cli/password.d.ts +12 -0
  147. package/dist/cli/password.js +51 -0
  148. package/dist/cli/password.js.map +1 -0
  149. package/dist/config.d.ts +174 -0
  150. package/dist/config.js +252 -0
  151. package/dist/config.js.map +1 -0
  152. package/dist/daemon/creator.d.ts +24 -0
  153. package/dist/daemon/creator.js +80 -0
  154. package/dist/daemon/creator.js.map +1 -0
  155. package/dist/daemon/daemon.d.ts +60 -0
  156. package/dist/daemon/daemon.js +158 -0
  157. package/dist/daemon/daemon.js.map +1 -0
  158. package/dist/daemon/delivery-watcher.d.ts +10 -0
  159. package/dist/daemon/delivery-watcher.js +37 -0
  160. package/dist/daemon/delivery-watcher.js.map +1 -0
  161. package/dist/daemon/restorer.d.ts +19 -0
  162. package/dist/daemon/restorer.js +82 -0
  163. package/dist/daemon/restorer.js.map +1 -0
  164. package/dist/daemon/reward-claim-loop.d.ts +38 -0
  165. package/dist/daemon/reward-claim-loop.js +48 -0
  166. package/dist/daemon/reward-claim-loop.js.map +1 -0
  167. package/dist/discovery/registry.d.ts +43 -0
  168. package/dist/discovery/registry.js +104 -0
  169. package/dist/discovery/registry.js.map +1 -0
  170. package/dist/discovery/subgraph.d.ts +37 -0
  171. package/dist/discovery/subgraph.js +87 -0
  172. package/dist/discovery/subgraph.js.map +1 -0
  173. package/dist/earning/bootstrap.d.ts +79 -0
  174. package/dist/earning/bootstrap.js +989 -0
  175. package/dist/earning/bootstrap.js.map +1 -0
  176. package/dist/earning/contracts.d.ts +431 -0
  177. package/dist/earning/contracts.js +518 -0
  178. package/dist/earning/contracts.js.map +1 -0
  179. package/dist/earning/evidence-simhash.d.ts +59 -0
  180. package/dist/earning/evidence-simhash.js +87 -0
  181. package/dist/earning/evidence-simhash.js.map +1 -0
  182. package/dist/earning/fleet-display-index.d.ts +8 -0
  183. package/dist/earning/fleet-display-index.js +12 -0
  184. package/dist/earning/fleet-display-index.js.map +1 -0
  185. package/dist/earning/fleet-retire.d.ts +28 -0
  186. package/dist/earning/fleet-retire.js +75 -0
  187. package/dist/earning/fleet-retire.js.map +1 -0
  188. package/dist/earning/jinn-rewards.d.ts +62 -0
  189. package/dist/earning/jinn-rewards.js +81 -0
  190. package/dist/earning/jinn-rewards.js.map +1 -0
  191. package/dist/earning/next-service-index.d.ts +4 -0
  192. package/dist/earning/next-service-index.js +7 -0
  193. package/dist/earning/next-service-index.js.map +1 -0
  194. package/dist/earning/orphan-sweep.d.ts +33 -0
  195. package/dist/earning/orphan-sweep.js +157 -0
  196. package/dist/earning/orphan-sweep.js.map +1 -0
  197. package/dist/earning/reconcile.d.ts +37 -0
  198. package/dist/earning/reconcile.js +216 -0
  199. package/dist/earning/reconcile.js.map +1 -0
  200. package/dist/earning/safe-adapter.d.ts +70 -0
  201. package/dist/earning/safe-adapter.js +228 -0
  202. package/dist/earning/safe-adapter.js.map +1 -0
  203. package/dist/earning/stolas-claim.d.ts +47 -0
  204. package/dist/earning/stolas-claim.js +115 -0
  205. package/dist/earning/stolas-claim.js.map +1 -0
  206. package/dist/earning/store.d.ts +36 -0
  207. package/dist/earning/store.js +156 -0
  208. package/dist/earning/store.js.map +1 -0
  209. package/dist/earning/types.d.ts +123 -0
  210. package/dist/earning/types.js +64 -0
  211. package/dist/earning/types.js.map +1 -0
  212. package/dist/earning/viem-clients.d.ts +9 -0
  213. package/dist/earning/viem-clients.js +22 -0
  214. package/dist/earning/viem-clients.js.map +1 -0
  215. package/dist/earning/wallet.d.ts +20 -0
  216. package/dist/earning/wallet.js +103 -0
  217. package/dist/earning/wallet.js.map +1 -0
  218. package/dist/errors/envelope.d.ts +41 -0
  219. package/dist/errors/envelope.js +48 -0
  220. package/dist/errors/envelope.js.map +1 -0
  221. package/dist/index.d.ts +14 -0
  222. package/dist/index.js +17 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/main.d.ts +32 -0
  225. package/dist/main.js +281 -0
  226. package/dist/main.js.map +1 -0
  227. package/dist/mcp/server.d.ts +14 -0
  228. package/dist/mcp/server.js +205 -0
  229. package/dist/mcp/server.js.map +1 -0
  230. package/dist/operator-errors.d.ts +16 -0
  231. package/dist/operator-errors.js +88 -0
  232. package/dist/operator-errors.js.map +1 -0
  233. package/dist/preflight/claude-binary.d.ts +19 -0
  234. package/dist/preflight/claude-binary.js +44 -0
  235. package/dist/preflight/claude-binary.js.map +1 -0
  236. package/dist/preflight/claude-invocation-envelope.d.ts +11 -0
  237. package/dist/preflight/claude-invocation-envelope.js +67 -0
  238. package/dist/preflight/claude-invocation-envelope.js.map +1 -0
  239. package/dist/runner/claude.d.ts +15 -0
  240. package/dist/runner/claude.js +193 -0
  241. package/dist/runner/claude.js.map +1 -0
  242. package/dist/runner/runner.d.ts +11 -0
  243. package/dist/runner/runner.js +2 -0
  244. package/dist/runner/runner.js.map +1 -0
  245. package/dist/runner/simple.d.ts +8 -0
  246. package/dist/runner/simple.js +11 -0
  247. package/dist/runner/simple.js.map +1 -0
  248. package/dist/store/store.d.ts +74 -0
  249. package/dist/store/store.js +173 -0
  250. package/dist/store/store.js.map +1 -0
  251. package/dist/tx-retry.d.ts +55 -0
  252. package/dist/tx-retry.js +214 -0
  253. package/dist/tx-retry.js.map +1 -0
  254. package/dist/types/desired-state.d.ts +41 -0
  255. package/dist/types/desired-state.js +16 -0
  256. package/dist/types/desired-state.js.map +1 -0
  257. package/dist/types/errors.d.ts +8 -0
  258. package/dist/types/errors.js +17 -0
  259. package/dist/types/errors.js.map +1 -0
  260. package/dist/types/index.d.ts +2 -0
  261. package/dist/types/index.js +3 -0
  262. package/dist/types/index.js.map +1 -0
  263. package/dist/withdraw/args.d.ts +29 -0
  264. package/dist/withdraw/args.js +198 -0
  265. package/dist/withdraw/args.js.map +1 -0
  266. package/dist/withdraw/run-withdraw-plan.d.ts +21 -0
  267. package/dist/withdraw/run-withdraw-plan.js +257 -0
  268. package/dist/withdraw/run-withdraw-plan.js.map +1 -0
  269. package/dist/x402/acquire.d.ts +6 -0
  270. package/dist/x402/acquire.js +32 -0
  271. package/dist/x402/acquire.js.map +1 -0
  272. package/dist/x402/facilitator.d.ts +11 -0
  273. package/dist/x402/facilitator.js +52 -0
  274. package/dist/x402/facilitator.js.map +1 -0
  275. package/dist/x402/handler.d.ts +15 -0
  276. package/dist/x402/handler.js +40 -0
  277. package/dist/x402/handler.js.map +1 -0
  278. package/package.json +72 -0
@@ -0,0 +1,332 @@
1
+ import { base, baseSepolia } from 'viem/chains';
2
+ import { PermanentError } from '../../types/index.js';
3
+ import { createClients } from './safe.js';
4
+ import { buildDesiredStatePayload, buildResultPayload, uploadToIpfs, cidToDigestHex, fetchFromIpfs, parseDesiredStateFromPayload, } from './ipfs.js';
5
+ import { submitRestorationJob, submitEvaluationJob, claimDelivery, getMechDeliveryRate, getTimeoutBounds, decodeMarketplaceRequestLogs, decodeDeliverLogs, callDeliverToMarketplace, scanRestorationJobs, scanEvaluationJobs, } from './contracts.js';
6
+ import { MECH_MARKETPLACE_ABI } from './types.js';
7
+ import { AcceptAllPolicy } from './claim-policy.js';
8
+ import { withRecoverableRetry } from '../../tx-retry.js';
9
+ import { computeEvidenceSimHash } from '../../earning/evidence-simhash.js';
10
+ export class MechAdapter {
11
+ name = 'mech';
12
+ publicClient;
13
+ walletClient;
14
+ config;
15
+ stopped = false;
16
+ requestBlockCursor = 0n;
17
+ deliveryBlockCursor = 0n;
18
+ pendingEvaluations = new Map();
19
+ pendingEvaluationClaims = new Set();
20
+ // Restoration requests where claimDelivery succeeded but evaluation creation failed.
21
+ // Swept on each poll cycle so they don't require a new Deliver event.
22
+ claimedButNotEvaluated = new Set();
23
+ // Original desired states keyed by request ID (restoration and evaluation)
24
+ // so we can yield accurate desiredState in DeliveredResult
25
+ originalStates = new Map();
26
+ store;
27
+ claimPolicy;
28
+ constructor(config, store) {
29
+ this.config = config;
30
+ this.store = store;
31
+ this.claimPolicy = config.claimPolicy ?? new AcceptAllPolicy();
32
+ }
33
+ async initialize() {
34
+ const chain = this.config.chainId === 84532 ? baseSepolia : base;
35
+ const clients = createClients(this.config.rpcUrl, this.config.agentEoaPrivateKey, chain);
36
+ this.publicClient = clients.publicClient;
37
+ this.walletClient = clients.walletClient;
38
+ const blockNumber = await withRecoverableRetry(async () => this.publicClient.getBlockNumber(), {
39
+ onRetry: ({ attempt, message }) => {
40
+ console.error(`[mech] getBlockNumber retry ${attempt}: ${message}`);
41
+ },
42
+ });
43
+ this.requestBlockCursor = blockNumber;
44
+ this.deliveryBlockCursor = blockNumber;
45
+ // Recover pending state from on-chain events
46
+ if (this.store) {
47
+ await this.recoverPendingState(blockNumber);
48
+ }
49
+ }
50
+ async recoverPendingState(currentBlock) {
51
+ const fromBlock = this.store?.getLastProcessedBlock() ?? currentBlock;
52
+ if (fromBlock >= currentBlock)
53
+ return;
54
+ console.error(`[mech] Recovering pending state from block ${fromBlock} to ${currentBlock}`);
55
+ // Scan for restoration jobs this creator posted
56
+ const restorations = await scanRestorationJobs(this.publicClient, this.config.routerAddress, this.config.safeAddress, fromBlock, currentBlock);
57
+ // Scan for evaluation jobs this creator posted
58
+ const evaluations = await scanEvaluationJobs(this.publicClient, this.config.routerAddress, this.config.safeAddress, fromBlock, currentBlock);
59
+ // Build set of restoration IDs that already have evaluation jobs
60
+ const hasEvaluation = new Set(evaluations.map(e => e.restorationRequestId));
61
+ // Check each restoration's delivery status
62
+ for (const restoration of restorations) {
63
+ if (hasEvaluation.has(restoration.requestId)) {
64
+ // Evaluation already created — check if eval delivery needs claiming
65
+ const evalJob = evaluations.find(e => e.restorationRequestId === restoration.requestId);
66
+ if (evalJob) {
67
+ const evalInfo = await this.publicClient.readContract({
68
+ address: this.config.mechMarketplaceAddress,
69
+ abi: MECH_MARKETPLACE_ABI,
70
+ functionName: 'mapRequestIdInfos',
71
+ args: [evalJob.requestId],
72
+ });
73
+ if (evalInfo[1] === '0x0000000000000000000000000000000000000000') {
74
+ // Evaluation not yet delivered — track it
75
+ this.pendingEvaluationClaims.add(evalJob.requestId);
76
+ }
77
+ // If delivered, fully complete — nothing to track
78
+ }
79
+ continue;
80
+ }
81
+ // No evaluation job yet — check delivery status
82
+ const info = await this.publicClient.readContract({
83
+ address: this.config.mechMarketplaceAddress,
84
+ abi: MECH_MARKETPLACE_ABI,
85
+ functionName: 'mapRequestIdInfos',
86
+ args: [restoration.requestId],
87
+ });
88
+ const deliveryMech = info[1];
89
+ if (deliveryMech === '0x0000000000000000000000000000000000000000') {
90
+ // Not delivered yet — track for evaluation after delivery
91
+ this.pendingEvaluations.set(restoration.requestId, {
92
+ id: restoration.requestId,
93
+ description: '', // Original description not available from events, but not needed for evaluation creation
94
+ });
95
+ }
96
+ else {
97
+ // Delivered but no evaluation — needs claim + evaluation creation
98
+ this.pendingEvaluations.set(restoration.requestId, {
99
+ id: restoration.requestId,
100
+ description: '',
101
+ });
102
+ this.claimedButNotEvaluated.add(restoration.requestId);
103
+ }
104
+ }
105
+ // Set delivery block cursor to scan from recovery point
106
+ this.deliveryBlockCursor = fromBlock;
107
+ const recovered = this.pendingEvaluations.size + this.pendingEvaluationClaims.size + this.claimedButNotEvaluated.size;
108
+ if (recovered > 0) {
109
+ console.error(`[mech] Recovered: ${this.pendingEvaluations.size} pending evaluations, ${this.pendingEvaluationClaims.size} pending eval claims, ${this.claimedButNotEvaluated.size} claimed but not evaluated`);
110
+ }
111
+ }
112
+ async postDesiredState(state) {
113
+ const restorationState = {
114
+ ...state,
115
+ type: state.type ?? 'restoration',
116
+ attemptId: state.attemptId,
117
+ attemptNumber: state.attemptNumber,
118
+ };
119
+ const restorationPayload = buildDesiredStatePayload(restorationState);
120
+ const restorationCid = await uploadToIpfs(this.config.ipfsRegistryUrl, restorationPayload);
121
+ const restorationDataHex = cidToDigestHex(restorationCid);
122
+ const deliveryRate = await getMechDeliveryRate(this.publicClient, this.config.mechContractAddress);
123
+ const { max: maxTimeout } = await getTimeoutBounds(this.publicClient, this.config.mechMarketplaceAddress);
124
+ const restorationRequestIds = await submitRestorationJob(this.publicClient, this.walletClient, this.config.safeAddress, this.config.routerAddress, this.config.mechContractAddress, restorationDataHex, deliveryRate, maxTimeout);
125
+ if (restorationRequestIds.length === 0) {
126
+ throw new PermanentError('No request IDs returned from router');
127
+ }
128
+ const restorationRequestId = restorationRequestIds[0];
129
+ // Store for evaluation creation after delivery is claimed
130
+ this.pendingEvaluations.set(restorationRequestId, state);
131
+ this.originalStates.set(restorationRequestId, { ...state, type: 'restoration' });
132
+ return restorationRequestId;
133
+ }
134
+ async *watchForRequests() {
135
+ while (!this.stopped) {
136
+ try {
137
+ const currentBlock = await this.publicClient.getBlockNumber();
138
+ if (currentBlock > this.requestBlockCursor) {
139
+ const logs = await this.publicClient.getLogs({
140
+ address: this.config.mechMarketplaceAddress,
141
+ fromBlock: this.requestBlockCursor + 1n,
142
+ toBlock: currentBlock,
143
+ });
144
+ this.requestBlockCursor = currentBlock;
145
+ const decoded = decodeMarketplaceRequestLogs(logs);
146
+ for (const { requestId, requestDataHex, priorityMech } of decoded) {
147
+ if (!this.claimPolicy.shouldAccept({ requestId, requestDataHex, priorityMech })) {
148
+ continue;
149
+ }
150
+ try {
151
+ const digest = requestDataHex.startsWith('0x') ? requestDataHex.slice(2) : requestDataHex;
152
+ const payload = await fetchFromIpfs(this.config.ipfsGatewayUrl, `f01551220${digest}`);
153
+ const desiredState = parseDesiredStateFromPayload(payload);
154
+ yield { requestId, desiredState };
155
+ }
156
+ catch (err) {
157
+ console.error(`[mech] Failed to parse request ${requestId}:`, err);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ catch (err) {
163
+ console.error('[mech] Error polling for requests:', err);
164
+ }
165
+ await new Promise(r => setTimeout(r, this.config.pollIntervalMs));
166
+ }
167
+ }
168
+ async claimRequest(requestId) {
169
+ const allowed = await this.claimPolicy.confirmClaim(requestId);
170
+ if (!allowed) {
171
+ throw new PermanentError(`Claim policy rejected request ${requestId}`);
172
+ }
173
+ }
174
+ async submitResult(requestId, result) {
175
+ const payload = buildResultPayload(requestId, result);
176
+ const cid = await uploadToIpfs(this.config.ipfsRegistryUrl, payload);
177
+ const deliveryDigest = cidToDigestHex(cid);
178
+ // Safe → AgentMech.deliverToMarketplace() → Marketplace.deliverMarketplace()
179
+ await callDeliverToMarketplace(this.publicClient, this.walletClient, this.config.safeAddress, this.config.mechContractAddress, [requestId], [deliveryDigest]);
180
+ }
181
+ async *watchForDeliveries() {
182
+ while (!this.stopped) {
183
+ try {
184
+ // Retry evaluation creation for claimed restorations that failed previously
185
+ for (const rid of [...this.claimedButNotEvaluated]) {
186
+ await this.tryCreateEvaluationJob(rid);
187
+ }
188
+ const currentBlock = await this.publicClient.getBlockNumber();
189
+ if (currentBlock > this.deliveryBlockCursor) {
190
+ const logs = await this.publicClient.getLogs({
191
+ address: this.config.mechContractAddress,
192
+ fromBlock: this.deliveryBlockCursor + 1n,
193
+ toBlock: currentBlock,
194
+ });
195
+ this.deliveryBlockCursor = currentBlock;
196
+ const decoded = decodeDeliverLogs(logs);
197
+ for (const { requestId, deliveryDataHex, mechAddress } of decoded) {
198
+ // Only claim deliveries for requests this client created
199
+ const isOurs = this.pendingEvaluations.has(requestId) || this.pendingEvaluationClaims.has(requestId);
200
+ if (!isOurs)
201
+ continue;
202
+ try {
203
+ const variant = this.config.routerClaimDeliveryVariant;
204
+ let evidenceHash;
205
+ if (variant === 'v2' && this.pendingEvaluations.has(requestId)) {
206
+ try {
207
+ const checkpoint = {
208
+ version: 1,
209
+ desiredStateHash: requestId,
210
+ toolCalls: [],
211
+ externalInteractions: [],
212
+ outcome: 'success',
213
+ };
214
+ evidenceHash = computeEvidenceSimHash(checkpoint);
215
+ }
216
+ catch (err) {
217
+ console.error(`[mech] Failed to compute evidence SimHash for ${requestId}:`, err);
218
+ }
219
+ }
220
+ await claimDelivery(this.publicClient, this.walletClient, this.config.safeAddress, this.config.routerAddress, requestId, {
221
+ variant,
222
+ evidenceHash,
223
+ });
224
+ }
225
+ catch (err) {
226
+ const message = err instanceof Error ? err.message : String(err);
227
+ if (message.includes('RequestNotFound')) {
228
+ console.error(`[mech] claimDelivery skipped (not a router request): ${requestId}`);
229
+ continue;
230
+ }
231
+ console.error(`[mech] claimDelivery failed for ${requestId}:`, err);
232
+ // Don't remove from pending — will retry next poll
233
+ continue;
234
+ }
235
+ // If this was a restoration delivery, fetch result and post the evaluation job
236
+ if (this.pendingEvaluations.has(requestId)) {
237
+ let restorationResultData;
238
+ try {
239
+ const digest = deliveryDataHex.startsWith('0x') ? deliveryDataHex.slice(2) : deliveryDataHex;
240
+ const payload = await fetchFromIpfs(this.config.ipfsGatewayUrl, `f01551220${digest}`);
241
+ restorationResultData = payload.data ?? JSON.stringify(payload);
242
+ }
243
+ catch (err) {
244
+ console.error(`[mech] Failed to fetch restoration result for evaluation: ${requestId}`, err);
245
+ }
246
+ await this.tryCreateEvaluationJob(requestId, restorationResultData);
247
+ }
248
+ // If this was an evaluation delivery, just clear the tracking
249
+ if (this.pendingEvaluationClaims.has(requestId)) {
250
+ this.pendingEvaluationClaims.delete(requestId);
251
+ }
252
+ // Parse and yield the delivery result
253
+ try {
254
+ const deliveryDigest = deliveryDataHex.startsWith('0x') ? deliveryDataHex.slice(2) : deliveryDataHex;
255
+ const resultPayload = await fetchFromIpfs(this.config.ipfsGatewayUrl, `f01551220${deliveryDigest}`);
256
+ const restorationResult = {
257
+ data: resultPayload.data ?? JSON.stringify(resultPayload),
258
+ artifacts: resultPayload.artifacts,
259
+ };
260
+ // Use the original desired state — not the result payload
261
+ const desiredState = this.originalStates.get(requestId) ?? {
262
+ id: requestId,
263
+ description: '',
264
+ };
265
+ yield {
266
+ requestId,
267
+ desiredState,
268
+ result: restorationResult,
269
+ deliveryMechAddress: mechAddress,
270
+ };
271
+ // Clean up after yielding
272
+ this.originalStates.delete(requestId);
273
+ }
274
+ catch (err) {
275
+ console.error(`[mech] Failed to parse delivery ${requestId}:`, err);
276
+ }
277
+ }
278
+ }
279
+ }
280
+ catch (err) {
281
+ console.error('[mech] Error polling for deliveries:', err);
282
+ }
283
+ // Persist block cursor for crash recovery
284
+ if (this.store && this.deliveryBlockCursor > 0n) {
285
+ this.store.setLastProcessedBlock(this.deliveryBlockCursor);
286
+ }
287
+ await new Promise(r => setTimeout(r, this.config.pollIntervalMs));
288
+ }
289
+ }
290
+ async tryCreateEvaluationJob(requestId, restorationResultData) {
291
+ if (!this.pendingEvaluations.has(requestId))
292
+ return;
293
+ const originalState = this.pendingEvaluations.get(requestId);
294
+ try {
295
+ const evaluationState = {
296
+ ...originalState,
297
+ type: 'evaluation',
298
+ restorationRequestId: requestId,
299
+ context: {
300
+ ...originalState.context,
301
+ ...(restorationResultData ? { restorationResult: restorationResultData } : {}),
302
+ },
303
+ };
304
+ const evaluationPayload = buildDesiredStatePayload(evaluationState);
305
+ const evaluationCid = await uploadToIpfs(this.config.ipfsRegistryUrl, evaluationPayload);
306
+ const evaluationDataHex = cidToDigestHex(evaluationCid);
307
+ const deliveryRate = await getMechDeliveryRate(this.publicClient, this.config.mechContractAddress);
308
+ const { max: maxTimeout } = await getTimeoutBounds(this.publicClient, this.config.mechMarketplaceAddress);
309
+ const evalRequestIds = await submitEvaluationJob(this.publicClient, this.walletClient, this.config.safeAddress, this.config.routerAddress, requestId, this.config.mechContractAddress, evaluationDataHex, deliveryRate, maxTimeout);
310
+ if (evalRequestIds.length > 0) {
311
+ this.pendingEvaluationClaims.add(evalRequestIds[0]);
312
+ // Copy original state to evaluation request ID so delivery can use it
313
+ const origState = this.originalStates.get(requestId);
314
+ if (origState) {
315
+ this.originalStates.set(evalRequestIds[0], { ...origState, type: 'evaluation' });
316
+ }
317
+ }
318
+ // Success — clean up both tracking sets
319
+ this.pendingEvaluations.delete(requestId);
320
+ this.claimedButNotEvaluated.delete(requestId);
321
+ }
322
+ catch (err) {
323
+ console.error(`[mech] Failed to create evaluation job for ${requestId}:`, err);
324
+ // Track for retry on next poll cycle (doesn't require a new Deliver event)
325
+ this.claimedButNotEvaluated.add(requestId);
326
+ }
327
+ }
328
+ async stop() {
329
+ this.stopped = true;
330
+ }
331
+ }
332
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/mech/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Address, PublicClient, WalletClient } from 'viem';
2
+ export interface RequestCandidate {
3
+ requestId: string;
4
+ requestDataHex: string;
5
+ priorityMech: string;
6
+ }
7
+ /**
8
+ * ClaimPolicy decides whether an operator should pick up a given request.
9
+ *
10
+ * Two-stage filtering:
11
+ * - shouldAccept(): sync pre-filter on event data (no RPC)
12
+ * - confirmClaim(): async check + claim attempt before runner starts work
13
+ */
14
+ export interface ClaimPolicy {
15
+ shouldAccept(candidate: RequestCandidate): boolean;
16
+ confirmClaim(requestId: string): Promise<boolean>;
17
+ }
18
+ export declare class AcceptAllPolicy implements ClaimPolicy {
19
+ shouldAccept(_candidate: RequestCandidate): boolean;
20
+ confirmClaim(_requestId: string): Promise<boolean>;
21
+ }
22
+ export declare class PriorityWindowPolicy implements ClaimPolicy {
23
+ private readonly ourMechAddress;
24
+ private readonly publicClient;
25
+ private readonly marketplaceAddress;
26
+ constructor(ourMechAddress: Address, publicClient: PublicClient, marketplaceAddress: Address);
27
+ shouldAccept(candidate: RequestCandidate): boolean;
28
+ confirmClaim(requestId: string): Promise<boolean>;
29
+ }
30
+ export declare class OnChainClaimPolicy implements ClaimPolicy {
31
+ private readonly ourMechAddress;
32
+ private readonly publicClient;
33
+ private readonly walletClient;
34
+ private readonly safeAddress;
35
+ private readonly marketplaceAddress;
36
+ private readonly claimRegistryAddress;
37
+ constructor(ourMechAddress: Address, publicClient: PublicClient, walletClient: WalletClient, safeAddress: Address, marketplaceAddress: Address, claimRegistryAddress: Address);
38
+ shouldAccept(_candidate: RequestCandidate): boolean;
39
+ confirmClaim(requestId: string): Promise<boolean>;
40
+ }
@@ -0,0 +1,104 @@
1
+ import { MECH_MARKETPLACE_ABI } from './types.js';
2
+ import { claimJob, getJobClaim } from './contracts.js';
3
+ // ── AcceptAllPolicy ──────────────────────────────────────────────────────────
4
+ export class AcceptAllPolicy {
5
+ shouldAccept(_candidate) {
6
+ return true;
7
+ }
8
+ async confirmClaim(_requestId) {
9
+ return true;
10
+ }
11
+ }
12
+ // ── PriorityWindowPolicy ─────────────────────────────────────────────────────
13
+ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
14
+ export class PriorityWindowPolicy {
15
+ ourMechAddress;
16
+ publicClient;
17
+ marketplaceAddress;
18
+ constructor(ourMechAddress, publicClient, marketplaceAddress) {
19
+ this.ourMechAddress = ourMechAddress;
20
+ this.publicClient = publicClient;
21
+ this.marketplaceAddress = marketplaceAddress;
22
+ }
23
+ shouldAccept(candidate) {
24
+ // Fast accept if we are the priority mech
25
+ if (candidate.priorityMech.toLowerCase() === this.ourMechAddress.toLowerCase()) {
26
+ return true;
27
+ }
28
+ // Let non-priority through — confirmClaim checks the window
29
+ return true;
30
+ }
31
+ async confirmClaim(requestId) {
32
+ const info = await this.publicClient.readContract({
33
+ address: this.marketplaceAddress,
34
+ abi: MECH_MARKETPLACE_ABI,
35
+ functionName: 'mapRequestIdInfos',
36
+ args: [requestId],
37
+ });
38
+ const [priorityMech, deliveryMech, , responseTimeout] = info;
39
+ // Already delivered — skip
40
+ if (deliveryMech !== ZERO_ADDRESS) {
41
+ return false;
42
+ }
43
+ // We are the priority mech — proceed
44
+ if (priorityMech.toLowerCase() === this.ourMechAddress.toLowerCase()) {
45
+ return true;
46
+ }
47
+ // Not our priority — only proceed if window expired
48
+ const block = await this.publicClient.getBlock();
49
+ return block.timestamp >= responseTimeout;
50
+ }
51
+ }
52
+ // ── OnChainClaimPolicy ───────────────────────────────────────────────────────
53
+ export class OnChainClaimPolicy {
54
+ ourMechAddress;
55
+ publicClient;
56
+ walletClient;
57
+ safeAddress;
58
+ marketplaceAddress;
59
+ claimRegistryAddress;
60
+ constructor(ourMechAddress, publicClient, walletClient, safeAddress, marketplaceAddress, claimRegistryAddress) {
61
+ this.ourMechAddress = ourMechAddress;
62
+ this.publicClient = publicClient;
63
+ this.walletClient = walletClient;
64
+ this.safeAddress = safeAddress;
65
+ this.marketplaceAddress = marketplaceAddress;
66
+ this.claimRegistryAddress = claimRegistryAddress;
67
+ }
68
+ shouldAccept(_candidate) {
69
+ return true;
70
+ }
71
+ async confirmClaim(requestId) {
72
+ // 1. Check delivery status
73
+ const info = await this.publicClient.readContract({
74
+ address: this.marketplaceAddress,
75
+ abi: MECH_MARKETPLACE_ABI,
76
+ functionName: 'mapRequestIdInfos',
77
+ args: [requestId],
78
+ });
79
+ const [priorityMech, deliveryMech, , responseTimeout] = info;
80
+ if (deliveryMech !== ZERO_ADDRESS) {
81
+ return false; // Already delivered
82
+ }
83
+ // 2. Check priority window
84
+ const block = await this.publicClient.getBlock();
85
+ if (priorityMech.toLowerCase() !== this.ourMechAddress.toLowerCase()) {
86
+ if (block.timestamp < responseTimeout) {
87
+ return false; // Not our priority window yet
88
+ }
89
+ }
90
+ // 3. Check existing on-chain claim
91
+ const { claimer, expiresAt } = await getJobClaim(this.publicClient, this.claimRegistryAddress, requestId);
92
+ if (claimer !== ZERO_ADDRESS && expiresAt > 0n) {
93
+ // Active claim exists
94
+ if (claimer.toLowerCase() === this.safeAddress.toLowerCase()) {
95
+ return true; // We already claimed — idempotent
96
+ }
97
+ return false; // Someone else has an active claim
98
+ }
99
+ // 4. Claim on-chain via Safe tx
100
+ const txHash = await claimJob(this.publicClient, this.walletClient, this.safeAddress, this.claimRegistryAddress, requestId);
101
+ return txHash !== ''; // Empty string = claim failed (already claimed or ineligible)
102
+ }
103
+ }
104
+ //# sourceMappingURL=claim-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-policy.js","sourceRoot":"","sources":["../../../src/adapters/mech/claim-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type Address, type Hex, type PublicClient, type WalletClient, type Log } from 'viem';
2
+ export declare function submitRestorationJob(publicClient: PublicClient, walletClient: WalletClient, safeAddress: Address, routerAddress: Address, mechAddress: Address, requestDataHex: Hex, priceWei: bigint, responseTimeout: bigint): Promise<string[]>;
3
+ export declare function submitEvaluationJob(publicClient: PublicClient, walletClient: WalletClient, safeAddress: Address, routerAddress: Address, restorationRequestId: Hex, mechAddress: Address, requestDataHex: Hex, priceWei: bigint, responseTimeout: bigint): Promise<string[]>;
4
+ export interface ClaimDeliveryOptions {
5
+ variant: 'v1' | 'v2';
6
+ /** V2 only; ignored for V1. */
7
+ evidenceHash?: Hex;
8
+ }
9
+ export declare function claimDelivery(publicClient: PublicClient, walletClient: WalletClient, safeAddress: Address, routerAddress: Address, requestId: Hex, options: ClaimDeliveryOptions): Promise<Hex>;
10
+ export declare function claimJob(publicClient: PublicClient, walletClient: WalletClient, safeAddress: Address, claimRegistryAddress: Address, requestId: Hex): Promise<string>;
11
+ export declare function getJobClaim(publicClient: PublicClient, claimRegistryAddress: Address, requestId: Hex): Promise<{
12
+ claimer: Address;
13
+ expiresAt: bigint;
14
+ }>;
15
+ export declare function getMechDeliveryRate(publicClient: PublicClient, mechAddress: Address): Promise<bigint>;
16
+ export declare function getTimeoutBounds(publicClient: PublicClient, marketplaceAddress: Address): Promise<{
17
+ min: bigint;
18
+ max: bigint;
19
+ }>;
20
+ export declare function pollDeliverEvents(publicClient: PublicClient, mechAddress: Address, fromBlock: bigint, toBlock: bigint): Promise<Log[]>;
21
+ export interface RestorationJobRecord {
22
+ requestId: string;
23
+ creator: string;
24
+ }
25
+ export interface EvaluationJobRecord {
26
+ requestId: string;
27
+ restorationRequestId: string;
28
+ creator: string;
29
+ }
30
+ export declare function scanRestorationJobs(publicClient: PublicClient, routerAddress: Address, creator: Address, fromBlock: bigint, toBlock: bigint): Promise<RestorationJobRecord[]>;
31
+ export declare function scanEvaluationJobs(publicClient: PublicClient, routerAddress: Address, creator: Address, fromBlock: bigint, toBlock: bigint): Promise<EvaluationJobRecord[]>;
32
+ export interface DecodedMarketplaceRequest {
33
+ requestId: string;
34
+ requestDataHex: string;
35
+ priorityMech: string;
36
+ }
37
+ export declare function decodeMarketplaceRequestLogs(logs: Log[]): DecodedMarketplaceRequest[];
38
+ export interface DecodedDeliverEvent {
39
+ requestId: string;
40
+ deliveryDataHex: string;
41
+ mechAddress: string;
42
+ }
43
+ export declare function decodeDeliverLogs(logs: Log[]): DecodedDeliverEvent[];
44
+ export declare function callDeliverToMarketplace(publicClient: PublicClient, walletClient: WalletClient, safeAddress: Address, mechContractAddress: Address, requestIds: Hex[], datas: Hex[]): Promise<Hex>;