@jinn-network/client 0.1.8 → 0.1.9-canary.02befda9

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 (537) hide show
  1. package/README.md +6 -0
  2. package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +3 -3
  3. package/deployments/deployment-stolas-l2-baseSepolia-fast.json +23 -3
  4. package/deployments/deployment-task-coordinator-router-v3-baseSepolia-fast.json +34 -6
  5. package/dist/adapters/mech/adapter.d.ts +21 -1
  6. package/dist/adapters/mech/adapter.js +107 -52
  7. package/dist/adapters/mech/adapter.js.map +1 -1
  8. package/dist/adapters/mech/contracts.d.ts +174 -13
  9. package/dist/adapters/mech/contracts.js +99 -49
  10. package/dist/adapters/mech/contracts.js.map +1 -1
  11. package/dist/adapters/mech/safe-revert.d.ts +4 -0
  12. package/dist/adapters/mech/safe-revert.js +5 -1
  13. package/dist/adapters/mech/safe-revert.js.map +1 -1
  14. package/dist/adapters/mech/safe.js +77 -1
  15. package/dist/adapters/mech/safe.js.map +1 -1
  16. package/dist/adapters/mech/types.d.ts +4 -42
  17. package/dist/adapters/mech/types.js +8 -20
  18. package/dist/adapters/mech/types.js.map +1 -1
  19. package/dist/adapters/mech/verdict-code.js +1 -1
  20. package/dist/adapters/mech/verdict-code.js.map +1 -1
  21. package/dist/api/bootstrap-endpoint.d.ts +1 -0
  22. package/dist/api/bootstrap-endpoint.js +1 -0
  23. package/dist/api/bootstrap-endpoint.js.map +1 -1
  24. package/dist/api/discovery-endpoint.d.ts +1 -0
  25. package/dist/api/discovery-endpoint.js +24 -0
  26. package/dist/api/discovery-endpoint.js.map +1 -1
  27. package/dist/api/fleet-build.d.ts +1 -7
  28. package/dist/api/fleet-build.js +0 -7
  29. package/dist/api/fleet-build.js.map +1 -1
  30. package/dist/api/gather-status.d.ts +26 -17
  31. package/dist/api/gather-status.js +57 -516
  32. package/dist/api/gather-status.js.map +1 -1
  33. package/dist/api/harness-auth-status-endpoint.d.ts +21 -0
  34. package/dist/api/harness-auth-status-endpoint.js +17 -0
  35. package/dist/api/harness-auth-status-endpoint.js.map +1 -0
  36. package/dist/api/loop-completion-build.d.ts +79 -0
  37. package/dist/api/loop-completion-build.js +155 -0
  38. package/dist/api/loop-completion-build.js.map +1 -0
  39. package/dist/api/operator-artifacts-endpoint.js +1 -1
  40. package/dist/api/operator-artifacts-endpoint.js.map +1 -1
  41. package/dist/api/peers.js +2 -0
  42. package/dist/api/peers.js.map +1 -1
  43. package/dist/api/rewards-build.d.ts +8 -1
  44. package/dist/api/rewards-build.js +32 -4
  45. package/dist/api/rewards-build.js.map +1 -1
  46. package/dist/api/rewards-endpoint.d.ts +12 -0
  47. package/dist/api/rewards-endpoint.js +46 -0
  48. package/dist/api/rewards-endpoint.js.map +1 -0
  49. package/dist/api/server.d.ts +6 -16
  50. package/dist/api/server.js +29 -26
  51. package/dist/api/server.js.map +1 -1
  52. package/dist/api/setup-endpoints.d.ts +41 -0
  53. package/dist/api/setup-endpoints.js +258 -45
  54. package/dist/api/setup-endpoints.js.map +1 -1
  55. package/dist/api/solvernets-endpoints.js +4 -1
  56. package/dist/api/solvernets-endpoints.js.map +1 -1
  57. package/dist/api/status-build.d.ts +71 -94
  58. package/dist/api/status-build.js +11 -77
  59. package/dist/api/status-build.js.map +1 -1
  60. package/dist/api/status-rollup-build.d.ts +0 -4
  61. package/dist/api/status-rollup-build.js +0 -4
  62. package/dist/api/status-rollup-build.js.map +1 -1
  63. package/dist/api/stop-hook.d.ts +1 -1
  64. package/dist/api/stop-hook.js +1 -1
  65. package/dist/api/stop-hook.js.map +1 -1
  66. package/dist/build-info.json +4 -4
  67. package/dist/build-meta.json +1 -1
  68. package/dist/captures/live-publisher.d.ts +9 -0
  69. package/dist/captures/live-publisher.js +1 -0
  70. package/dist/captures/live-publisher.js.map +1 -1
  71. package/dist/captures/publish.d.ts +11 -0
  72. package/dist/captures/publish.js +15 -5
  73. package/dist/captures/publish.js.map +1 -1
  74. package/dist/cli/commands/codedigest-revert-check.js +6 -2
  75. package/dist/cli/commands/codedigest-revert-check.js.map +1 -1
  76. package/dist/cli/commands/doctor.d.ts +3 -0
  77. package/dist/cli/commands/doctor.js +36 -4
  78. package/dist/cli/commands/doctor.js.map +1 -1
  79. package/dist/cli/commands/eval.d.ts +87 -0
  80. package/dist/cli/commands/eval.js +481 -0
  81. package/dist/cli/commands/eval.js.map +1 -0
  82. package/dist/cli/commands/rewards.d.ts +2 -0
  83. package/dist/cli/commands/rewards.js +39 -10
  84. package/dist/cli/commands/rewards.js.map +1 -1
  85. package/dist/cli/commands/solver-nets.js +68 -0
  86. package/dist/cli/commands/solver-nets.js.map +1 -1
  87. package/dist/cli/commands/status.js +0 -1
  88. package/dist/cli/commands/status.js.map +1 -1
  89. package/dist/cli/commands/update.js +8 -0
  90. package/dist/cli/commands/update.js.map +1 -1
  91. package/dist/cli/commands/version.js +4 -0
  92. package/dist/cli/commands/version.js.map +1 -1
  93. package/dist/cli/index.js +2 -0
  94. package/dist/cli/index.js.map +1 -1
  95. package/dist/cli/introspection-context.js +0 -3
  96. package/dist/cli/introspection-context.js.map +1 -1
  97. package/dist/config.d.ts +158 -541
  98. package/dist/config.js +189 -196
  99. package/dist/config.js.map +1 -1
  100. package/dist/corpus/acquire.d.ts +7 -6
  101. package/dist/corpus/acquire.js +10 -10
  102. package/dist/corpus/acquire.js.map +1 -1
  103. package/dist/corpus/fetch-artifact.d.ts +21 -0
  104. package/dist/corpus/fetch-artifact.js +33 -0
  105. package/dist/corpus/fetch-artifact.js.map +1 -0
  106. package/dist/corpus/index.d.ts +2 -2
  107. package/dist/corpus/route-resolver.d.ts +3 -3
  108. package/dist/corpus/route-resolver.js +3 -3
  109. package/dist/daemon/ai-units-gate.d.ts +6 -6
  110. package/dist/daemon/ai-units-gate.js +11 -10
  111. package/dist/daemon/ai-units-gate.js.map +1 -1
  112. package/dist/daemon/balance-topup-loop.js +3 -0
  113. package/dist/daemon/balance-topup-loop.js.map +1 -1
  114. package/dist/daemon/checkpoint-loop.js +2 -2
  115. package/dist/daemon/creator.d.ts +1 -0
  116. package/dist/daemon/creator.js +26 -14
  117. package/dist/daemon/creator.js.map +1 -1
  118. package/dist/daemon/daemon.d.ts +15 -10
  119. package/dist/daemon/daemon.js +71 -39
  120. package/dist/daemon/daemon.js.map +1 -1
  121. package/dist/daemon/delivery-watcher.d.ts +9 -0
  122. package/dist/daemon/delivery-watcher.js +24 -1
  123. package/dist/daemon/delivery-watcher.js.map +1 -1
  124. package/dist/daemon/eviction-loop.d.ts +7 -0
  125. package/dist/daemon/eviction-loop.js +19 -3
  126. package/dist/daemon/eviction-loop.js.map +1 -1
  127. package/dist/daemon/join-applier.d.ts +35 -0
  128. package/dist/daemon/join-applier.js +49 -0
  129. package/dist/daemon/join-applier.js.map +1 -0
  130. package/dist/daemon/loop-heartbeat.d.ts +34 -0
  131. package/dist/daemon/loop-heartbeat.js +38 -0
  132. package/dist/daemon/loop-heartbeat.js.map +1 -0
  133. package/dist/daemon/reward-claim-loop.js +4 -1
  134. package/dist/daemon/reward-claim-loop.js.map +1 -1
  135. package/dist/daemon/skip-log-dedup.d.ts +1 -1
  136. package/dist/daemon/skip-log-dedup.js +3 -0
  137. package/dist/daemon/skip-log-dedup.js.map +1 -1
  138. package/dist/daemon/watchdog-loop.d.ts +84 -0
  139. package/dist/daemon/watchdog-loop.js +91 -0
  140. package/dist/daemon/watchdog-loop.js.map +1 -0
  141. package/dist/dashboard/assets/index-BsrAAmvC.js +171 -0
  142. package/dist/dashboard/assets/index-DQOWJ2SF.css +1 -0
  143. package/dist/dashboard/index.html +2 -2
  144. package/dist/discovery/http.d.ts +17 -0
  145. package/dist/discovery/http.js +295 -25
  146. package/dist/discovery/http.js.map +1 -1
  147. package/dist/discovery/onchain.js +158 -2
  148. package/dist/discovery/onchain.js.map +1 -1
  149. package/dist/discovery/types.d.ts +106 -0
  150. package/dist/discovery/types.js +40 -0
  151. package/dist/discovery/types.js.map +1 -1
  152. package/dist/discovery/with-fallback.js +14 -0
  153. package/dist/discovery/with-fallback.js.map +1 -1
  154. package/dist/earning/bootstrap.d.ts +25 -0
  155. package/dist/earning/bootstrap.js +79 -28
  156. package/dist/earning/bootstrap.js.map +1 -1
  157. package/dist/earning/contracts.d.ts +0 -229
  158. package/dist/earning/contracts.js +4 -184
  159. package/dist/earning/contracts.js.map +1 -1
  160. package/dist/earning/faucet-topup-store.d.ts +41 -0
  161. package/dist/earning/faucet-topup-store.js +89 -0
  162. package/dist/earning/faucet-topup-store.js.map +1 -0
  163. package/dist/earning/faucet.d.ts +1 -1
  164. package/dist/earning/faucet.js +2 -2
  165. package/dist/earning/faucet.js.map +1 -1
  166. package/dist/earning/safe-adapter.js +11 -0
  167. package/dist/earning/safe-adapter.js.map +1 -1
  168. package/dist/earning/stolas-claim.js +8 -8
  169. package/dist/earning/stolas-claim.js.map +1 -1
  170. package/dist/earning/{jinn-rewards.d.ts → stolas-staking.d.ts} +4 -8
  171. package/dist/earning/{jinn-rewards.js → stolas-staking.js} +6 -10
  172. package/dist/earning/stolas-staking.js.map +1 -0
  173. package/dist/earning/testnet-setup-migration.d.ts +1 -0
  174. package/dist/earning/testnet-setup-migration.js +7 -2
  175. package/dist/earning/testnet-setup-migration.js.map +1 -1
  176. package/dist/earning/types.d.ts +1 -1
  177. package/dist/earning/types.js +1 -1
  178. package/dist/earning/types.js.map +1 -1
  179. package/dist/earning/viem-clients.d.ts +3 -19
  180. package/dist/earning/viem-clients.js +4 -31
  181. package/dist/earning/viem-clients.js.map +1 -1
  182. package/dist/eval/eval-harness-run.d.ts +63 -0
  183. package/dist/eval/eval-harness-run.js +123 -0
  184. package/dist/eval/eval-harness-run.js.map +1 -0
  185. package/dist/eval/orchestrator.d.ts +224 -0
  186. package/dist/eval/orchestrator.js +250 -0
  187. package/dist/eval/orchestrator.js.map +1 -0
  188. package/dist/eval/paired.d.ts +68 -0
  189. package/dist/eval/paired.js +93 -0
  190. package/dist/eval/paired.js.map +1 -0
  191. package/dist/eval/resolve-slate-tasks.d.ts +35 -0
  192. package/dist/eval/resolve-slate-tasks.js +56 -0
  193. package/dist/eval/resolve-slate-tasks.js.map +1 -0
  194. package/dist/eval/screen-discovery.d.ts +22 -0
  195. package/dist/eval/screen-discovery.js +71 -0
  196. package/dist/eval/screen-discovery.js.map +1 -0
  197. package/dist/eval/screen-progress.d.ts +41 -0
  198. package/dist/eval/screen-progress.js +60 -0
  199. package/dist/eval/screen-progress.js.map +1 -0
  200. package/dist/eval/screen-runner.d.ts +30 -0
  201. package/dist/eval/screen-runner.js +289 -0
  202. package/dist/eval/screen-runner.js.map +1 -0
  203. package/dist/eval/screen.d.ts +107 -0
  204. package/dist/eval/screen.js +159 -0
  205. package/dist/eval/screen.js.map +1 -0
  206. package/dist/eval/slope.d.ts +29 -0
  207. package/dist/eval/slope.js +46 -0
  208. package/dist/eval/slope.js.map +1 -0
  209. package/dist/eval/train-sequence.d.ts +35 -0
  210. package/dist/eval/train-sequence.js +59 -0
  211. package/dist/eval/train-sequence.js.map +1 -0
  212. package/dist/eval/wilson.d.ts +45 -0
  213. package/dist/eval/wilson.js +48 -0
  214. package/dist/eval/wilson.js.map +1 -0
  215. package/dist/events/types.d.ts +1 -1
  216. package/dist/events/types.js +1 -1
  217. package/dist/events/types.js.map +1 -1
  218. package/dist/harnesses/auth-source.d.ts +51 -0
  219. package/dist/harnesses/auth-source.js +155 -0
  220. package/dist/harnesses/auth-source.js.map +1 -0
  221. package/dist/harnesses/engine/canonical-json.js +5 -3
  222. package/dist/harnesses/engine/canonical-json.js.map +1 -1
  223. package/dist/harnesses/engine/engine.d.ts +32 -0
  224. package/dist/harnesses/engine/engine.js +76 -9
  225. package/dist/harnesses/engine/engine.js.map +1 -1
  226. package/dist/harnesses/engine/packaging.js +5 -5
  227. package/dist/harnesses/engine/packaging.js.map +1 -1
  228. package/dist/harnesses/engine/persistence.d.ts +17 -0
  229. package/dist/harnesses/engine/persistence.js +28 -0
  230. package/dist/harnesses/engine/persistence.js.map +1 -1
  231. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +1 -1
  232. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js +1 -1
  233. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -1
  234. package/dist/harnesses/impls/hermes-agent/adapter.d.ts +2 -0
  235. package/dist/harnesses/impls/hermes-agent/adapter.js +8 -5
  236. package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
  237. package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +1 -0
  238. package/dist/harnesses/impls/hermes-agent/bootstrap.js +6 -1
  239. package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
  240. package/dist/harnesses/impls/hermes-agent/harness.d.ts +25 -3
  241. package/dist/harnesses/impls/hermes-agent/harness.js +89 -5
  242. package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
  243. package/dist/harnesses/impls/index.d.ts +2 -0
  244. package/dist/harnesses/impls/index.js +10 -1
  245. package/dist/harnesses/impls/index.js.map +1 -1
  246. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.d.ts +34 -0
  247. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js +111 -0
  248. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js.map +1 -0
  249. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.d.ts +24 -0
  250. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js +19 -0
  251. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js.map +1 -0
  252. package/dist/harnesses/impls/jinn-repo-evaluator/harness.d.ts +64 -0
  253. package/dist/harnesses/impls/jinn-repo-evaluator/harness.js +125 -0
  254. package/dist/harnesses/impls/jinn-repo-evaluator/harness.js.map +1 -0
  255. package/dist/harnesses/impls/jinn-repo-evaluator/repro.d.ts +32 -0
  256. package/dist/harnesses/impls/jinn-repo-evaluator/repro.js +73 -0
  257. package/dist/harnesses/impls/jinn-repo-evaluator/repro.js.map +1 -0
  258. package/dist/harnesses/impls/learner/adapters/claude-code.js +5 -0
  259. package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
  260. package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +8 -0
  261. package/dist/harnesses/impls/learner/adapters/codex-code.js +91 -11
  262. package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
  263. package/dist/harnesses/impls/learner/harness.d.ts +29 -1
  264. package/dist/harnesses/impls/learner/harness.js +85 -1
  265. package/dist/harnesses/impls/learner/harness.js.map +1 -1
  266. package/dist/harnesses/impls/learner/harvest.d.ts +2 -0
  267. package/dist/harnesses/impls/learner/harvest.js +51 -1
  268. package/dist/harnesses/impls/learner/harvest.js.map +1 -1
  269. package/dist/harnesses/impls/learner/plugin-path.js +1 -0
  270. package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
  271. package/dist/harnesses/impls/stub.d.ts +2 -2
  272. package/dist/harnesses/impls/stub.js +2 -2
  273. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +3 -1
  274. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
  275. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +2 -2
  276. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +3 -1
  277. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
  278. package/dist/harnesses/readiness-registry.d.ts +16 -0
  279. package/dist/harnesses/readiness-registry.js +28 -6
  280. package/dist/harnesses/readiness-registry.js.map +1 -1
  281. package/dist/harnesses/types.d.ts +26 -0
  282. package/dist/learner/revert-decision.d.ts +16 -1
  283. package/dist/learner/revert-decision.js +38 -18
  284. package/dist/learner/revert-decision.js.map +1 -1
  285. package/dist/learner/revert-stats.d.ts +14 -0
  286. package/dist/learner/revert-stats.js +42 -0
  287. package/dist/learner/revert-stats.js.map +1 -1
  288. package/dist/local-provider-url.d.ts +3 -0
  289. package/dist/local-provider-url.js +28 -0
  290. package/dist/local-provider-url.js.map +1 -0
  291. package/dist/main.js +125 -120
  292. package/dist/main.js.map +1 -1
  293. package/dist/mcp/acquire-artifact.d.ts +3 -3
  294. package/dist/mcp/acquire-artifact.js +3 -3
  295. package/dist/mcp/operator-server.js +1 -1
  296. package/dist/mcp/operator-server.js.map +1 -1
  297. package/dist/mcp/server.js +5 -6
  298. package/dist/mcp/server.js.map +1 -1
  299. package/dist/observability/emit-event.d.ts +1 -1
  300. package/dist/observability/emit-event.js +0 -4
  301. package/dist/observability/emit-event.js.map +1 -1
  302. package/dist/plugins/learner/.claude-plugin/plugin.json +1 -1
  303. package/dist/plugins/learner/.codex-plugin/plugin.json +1 -1
  304. package/dist/plugins/learner/hooks/session-start +30 -1
  305. package/dist/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
  306. package/dist/preflight/deployment-readiness.d.ts +127 -0
  307. package/dist/preflight/deployment-readiness.js +308 -0
  308. package/dist/preflight/deployment-readiness.js.map +1 -0
  309. package/dist/preflight/pidfile-liveness.d.ts +7 -1
  310. package/dist/preflight/pidfile-liveness.js +14 -0
  311. package/dist/preflight/pidfile-liveness.js.map +1 -1
  312. package/dist/rpc/transport.d.ts +43 -5
  313. package/dist/rpc/transport.js +131 -30
  314. package/dist/rpc/transport.js.map +1 -1
  315. package/dist/scripts/swe-rebench-v2-seed-pool.json +2 -1
  316. package/dist/solver-nets/registry.d.ts +19 -0
  317. package/dist/solver-nets/registry.js +95 -66
  318. package/dist/solver-nets/registry.js.map +1 -1
  319. package/dist/solver-types/_jinn-repo-pool.d.ts +27 -0
  320. package/dist/solver-types/_jinn-repo-pool.js +27 -0
  321. package/dist/solver-types/_jinn-repo-pool.js.map +1 -0
  322. package/dist/solver-types/_swe-rebench-v2-held-out-slate.d.ts +76 -0
  323. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js +156 -0
  324. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js.map +1 -0
  325. package/dist/solver-types/_swe-rebench-v2-pool-recovery.d.ts +81 -0
  326. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js +116 -0
  327. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js.map +1 -0
  328. package/dist/solver-types/_swe-rebench-v2-state.d.ts +9 -0
  329. package/dist/solver-types/_swe-rebench-v2-state.js +14 -0
  330. package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
  331. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +30 -0
  332. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +40 -0
  333. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  334. package/dist/solver-types/index.js +2 -0
  335. package/dist/solver-types/index.js.map +1 -1
  336. package/dist/solver-types/jinn-repo-admit.d.ts +17 -0
  337. package/dist/solver-types/jinn-repo-admit.js +16 -0
  338. package/dist/solver-types/jinn-repo-admit.js.map +1 -0
  339. package/dist/solver-types/jinn-repo-auto.d.ts +60 -0
  340. package/dist/solver-types/jinn-repo-auto.js +163 -0
  341. package/dist/solver-types/jinn-repo-auto.js.map +1 -0
  342. package/dist/solver-types/jinn-repo-definition.d.ts +15 -0
  343. package/dist/solver-types/jinn-repo-definition.js +34 -0
  344. package/dist/solver-types/jinn-repo-definition.js.map +1 -0
  345. package/dist/solver-types/jinn-repo-extract.d.ts +16 -0
  346. package/dist/solver-types/jinn-repo-extract.js +32 -0
  347. package/dist/solver-types/jinn-repo-extract.js.map +1 -0
  348. package/dist/solver-types/jinn-repo.d.ts +21 -0
  349. package/dist/solver-types/jinn-repo.js +23 -0
  350. package/dist/solver-types/jinn-repo.js.map +1 -0
  351. package/dist/solver-types/learner-loop-test.js +1 -1
  352. package/dist/solver-types/learner-loop-test.js.map +1 -1
  353. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v1.json +20 -0
  354. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.json +19 -0
  355. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.screening-report.json +628 -0
  356. package/dist/solver-types/solver-type.d.ts +8 -0
  357. package/dist/solver-types/swe-rebench-v2.d.ts +2 -0
  358. package/dist/solver-types/swe-rebench-v2.js +115 -10
  359. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  360. package/dist/solvernets/launched-record-dispatcher.d.ts +5 -0
  361. package/dist/solvernets/launched-record-dispatcher.js +8 -1
  362. package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
  363. package/dist/solvernets/registry-client-erc8004.js +29 -37
  364. package/dist/solvernets/registry-client-erc8004.js.map +1 -1
  365. package/dist/solvernets/registry-client.d.ts +6 -0
  366. package/dist/solvernets/store.d.ts +1 -1
  367. package/dist/solvernets/store.js +8 -3
  368. package/dist/solvernets/store.js.map +1 -1
  369. package/dist/spend/ai-units-config.d.ts +10 -0
  370. package/dist/spend/ai-units-config.js +7 -1
  371. package/dist/spend/ai-units-config.js.map +1 -1
  372. package/dist/spend/ai-units.d.ts +51 -0
  373. package/dist/spend/ai-units.js +73 -0
  374. package/dist/spend/ai-units.js.map +1 -1
  375. package/dist/spend/record.js +12 -5
  376. package/dist/spend/record.js.map +1 -1
  377. package/dist/spend/usage.js +39 -3
  378. package/dist/spend/usage.js.map +1 -1
  379. package/dist/store/store.d.ts +92 -5
  380. package/dist/store/store.js +184 -7
  381. package/dist/store/store.js.map +1 -1
  382. package/dist/trajectory/emit.d.ts +6 -0
  383. package/dist/trajectory/emit.js +9 -1
  384. package/dist/trajectory/emit.js.map +1 -1
  385. package/dist/trajectory/harness-bundle-schema.d.ts +1 -1
  386. package/dist/trajectory/harness-bundle-schema.js +1 -1
  387. package/dist/trajectory/harness-bundle-schema.js.map +1 -1
  388. package/dist/trajectory/schema.d.ts +1 -1
  389. package/dist/trajectory/schema.js +1 -1
  390. package/dist/trajectory/schema.js.map +1 -1
  391. package/dist/trajectory/scrub/build.d.ts +27 -0
  392. package/dist/trajectory/scrub/build.js +43 -0
  393. package/dist/trajectory/scrub/build.js.map +1 -0
  394. package/dist/trajectory/scrub/emit-scrub.d.ts +41 -0
  395. package/dist/trajectory/scrub/emit-scrub.js +88 -0
  396. package/dist/trajectory/scrub/emit-scrub.js.map +1 -0
  397. package/dist/trajectory/scrub/key-policy.d.ts +20 -0
  398. package/dist/trajectory/scrub/key-policy.js +43 -0
  399. package/dist/trajectory/scrub/key-policy.js.map +1 -0
  400. package/dist/trajectory/scrub/ml-pii-stage.d.ts +24 -0
  401. package/dist/trajectory/scrub/ml-pii-stage.js +43 -0
  402. package/dist/trajectory/scrub/ml-pii-stage.js.map +1 -0
  403. package/dist/trajectory/scrub/openredaction-stage.d.ts +14 -0
  404. package/dist/trajectory/scrub/openredaction-stage.js +36 -0
  405. package/dist/trajectory/scrub/openredaction-stage.js.map +1 -0
  406. package/dist/trajectory/scrub/pii-build.d.ts +31 -0
  407. package/dist/trajectory/scrub/pii-build.js +64 -0
  408. package/dist/trajectory/scrub/pii-build.js.map +1 -0
  409. package/dist/trajectory/scrub/pipeline.d.ts +16 -0
  410. package/dist/trajectory/scrub/pipeline.js +26 -0
  411. package/dist/trajectory/scrub/pipeline.js.map +1 -0
  412. package/dist/trajectory/scrub/secretlint-stage.d.ts +13 -0
  413. package/dist/trajectory/scrub/secretlint-stage.js +121 -0
  414. package/dist/trajectory/scrub/secretlint-stage.js.map +1 -0
  415. package/dist/trajectory/scrub/transformers-detector.d.ts +35 -0
  416. package/dist/trajectory/scrub/transformers-detector.js +68 -0
  417. package/dist/trajectory/scrub/transformers-detector.js.map +1 -0
  418. package/dist/trajectory/scrub/types.d.ts +25 -0
  419. package/dist/trajectory/scrub/types.js +2 -0
  420. package/dist/trajectory/scrub/types.js.map +1 -0
  421. package/dist/trajectory/transcript-parsers/types.d.ts +1 -1
  422. package/dist/trajectory/transcript-parsers/types.js +1 -1
  423. package/dist/trajectory/transcript-parsers/types.js.map +1 -1
  424. package/dist/tx-retry.d.ts +12 -0
  425. package/dist/tx-retry.js +41 -12
  426. package/dist/tx-retry.js.map +1 -1
  427. package/dist/types/envelope.d.ts +1 -1
  428. package/dist/types/envelope.js +1 -1
  429. package/dist/types/envelope.js.map +1 -1
  430. package/dist/types/payloads/index.d.ts +1 -1
  431. package/dist/types/payloads/index.js +7 -1
  432. package/dist/types/payloads/index.js.map +1 -1
  433. package/dist/types/payloads/portfolio-v0.d.ts +1 -1
  434. package/dist/types/payloads/portfolio-v0.js +1 -1
  435. package/dist/types/payloads/portfolio-v0.js.map +1 -1
  436. package/dist/types/payloads/prediction-apy-v0.d.ts +1 -1
  437. package/dist/types/payloads/prediction-apy-v0.js +1 -1
  438. package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
  439. package/dist/types/payloads/prediction-v0.d.ts +1 -1
  440. package/dist/types/payloads/prediction-v0.js +1 -1
  441. package/dist/types/payloads/prediction-v0.js.map +1 -1
  442. package/dist/types/portfolio.d.ts +1 -1
  443. package/dist/types/portfolio.js +1 -1
  444. package/dist/types/portfolio.js.map +1 -1
  445. package/dist/types/prediction-apy.d.ts +1 -1
  446. package/dist/types/prediction-apy.js +1 -1
  447. package/dist/types/prediction-apy.js.map +1 -1
  448. package/dist/types/prediction.d.ts +1 -1
  449. package/dist/types/prediction.js +1 -1
  450. package/dist/types/prediction.js.map +1 -1
  451. package/dist/types/session-provenance.d.ts +1 -1
  452. package/dist/types/session-provenance.js +1 -1
  453. package/dist/types/session-provenance.js.map +1 -1
  454. package/dist/types/task-document.d.ts +315 -1
  455. package/dist/types/task-document.js +9 -1
  456. package/dist/types/task-document.js.map +1 -1
  457. package/dist/types/task.d.ts +29 -1
  458. package/dist/types/task.js +1 -1
  459. package/dist/types/task.js.map +1 -1
  460. package/dist/types/window.d.ts +1 -1
  461. package/dist/types/window.js +1 -1
  462. package/dist/types/window.js.map +1 -1
  463. package/dist/vendor/@jinn-network/sdk/dist/checkpoint.d.ts +1 -1
  464. package/dist/vendor/@jinn-network/sdk/dist/checkpoint.js +1 -1
  465. package/dist/vendor/@jinn-network/sdk/dist/contracts.d.ts +3 -2
  466. package/dist/vendor/@jinn-network/sdk/dist/contracts.js +49 -0
  467. package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.d.ts +44 -0
  468. package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.js +25 -0
  469. package/dist/vendor/@jinn-network/sdk/dist/json-schema.d.ts +1 -1
  470. package/dist/vendor/@jinn-network/sdk/dist/json-schema.js +1 -1
  471. package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.d.ts +38 -0
  472. package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.js +22 -0
  473. package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +1 -1
  474. package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +1 -1
  475. package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.d.ts +1 -1
  476. package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.js +1 -1
  477. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +109 -2
  478. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +26 -2
  479. package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.d.ts +1 -1
  480. package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.js +1 -1
  481. package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.d.ts +4 -0
  482. package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.js +2 -0
  483. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +1 -1
  484. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -1
  485. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.d.ts +65 -0
  486. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.js +123 -0
  487. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.d.ts +2 -2
  488. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js +1 -1
  489. package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.d.ts +1 -1
  490. package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.js +1 -1
  491. package/dist/vendor/@jinn-network/sdk/package.json +9 -1
  492. package/docker-compose.yml +3 -2
  493. package/package.json +36 -26
  494. package/plugins/jinn-repo-runtime/.claude-plugin/plugin.json +5 -0
  495. package/plugins/jinn-repo-runtime/.codex-plugin/plugin.json +39 -0
  496. package/plugins/jinn-repo-runtime/README.md +27 -0
  497. package/plugins/jinn-repo-runtime/hooks/hooks.json +16 -0
  498. package/plugins/jinn-repo-runtime/hooks/session-start +73 -0
  499. package/plugins/jinn-repo-runtime/jinn.plugin.json +11 -0
  500. package/plugins/jinn-repo-runtime/skills/task/SKILL.md +92 -0
  501. package/plugins/learner/.claude-plugin/plugin.json +1 -1
  502. package/plugins/learner/.codex-plugin/plugin.json +1 -1
  503. package/plugins/learner/hooks/session-start +30 -1
  504. package/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
  505. package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
  506. package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
  507. package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +0 -55
  508. package/deployments/deployment-jinn-mvi-l1-sepolia.json +0 -55
  509. package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +0 -13
  510. package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +0 -15
  511. package/dist/daemon/jinn-claim-loop-canonical.d.ts +0 -207
  512. package/dist/daemon/jinn-claim-loop-canonical.js +0 -296
  513. package/dist/daemon/jinn-claim-loop-canonical.js.map +0 -1
  514. package/dist/daemon/jinn-claim-loop-mock.d.ts +0 -61
  515. package/dist/daemon/jinn-claim-loop-mock.js +0 -122
  516. package/dist/daemon/jinn-claim-loop-mock.js.map +0 -1
  517. package/dist/daemon/jinn-claim-loop-wiring.d.ts +0 -33
  518. package/dist/daemon/jinn-claim-loop-wiring.js +0 -40
  519. package/dist/daemon/jinn-claim-loop-wiring.js.map +0 -1
  520. package/dist/daemon/jinn-claim-loop.d.ts +0 -130
  521. package/dist/daemon/jinn-claim-loop.js +0 -328
  522. package/dist/daemon/jinn-claim-loop.js.map +0 -1
  523. package/dist/dashboard/assets/index-CzKxvMcU.css +0 -32
  524. package/dist/dashboard/assets/index-yVemxHot.js +0 -351
  525. package/dist/earning/jinn-rewards.js.map +0 -1
  526. package/dist/scripts/donation-consumption-acceptance.d.ts +0 -85
  527. package/dist/scripts/donation-consumption-acceptance.js +0 -1382
  528. package/dist/scripts/donation-consumption-acceptance.js.map +0 -1
  529. package/dist/x402/acquire.d.ts +0 -17
  530. package/dist/x402/acquire.js +0 -49
  531. package/dist/x402/acquire.js.map +0 -1
  532. package/dist/x402/facilitator.d.ts +0 -11
  533. package/dist/x402/facilitator.js +0 -52
  534. package/dist/x402/facilitator.js.map +0 -1
  535. package/dist/x402/handler.d.ts +0 -27
  536. package/dist/x402/handler.js +0 -236
  537. package/dist/x402/handler.js.map +0 -1
@@ -1,1382 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Release-blocking two-operator donation consumption gate.
4
- *
5
- * This is intentionally not a mocked corpus test. It expects real testnet
6
- * canonical on-chain/IPFS discovery, a producer daemon with fresh donated SWE execution
7
- * data, and a separate consumer operator home/db that can consume that data
8
- * through the same MCP tools exposed to the learner runtime.
9
- */
10
- import { createHash, randomBytes } from 'node:crypto';
11
- import { spawn, spawnSync } from 'node:child_process';
12
- import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync } from 'node:fs';
13
- import { homedir } from 'node:os';
14
- import { basename, dirname, join, resolve } from 'node:path';
15
- import { parseArgs } from 'node:util';
16
- import { fileURLToPath } from 'node:url';
17
- import { Client } from '@modelcontextprotocol/sdk/client/index.js';
18
- import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
19
- import { Store } from '../store/store.js';
20
- import { DEFAULT_CONFIG_PATH, DEFAULT_TESTNET_DISCOVERY_URL } from '../config.js';
21
- import { DEFAULT_EXECUTION_DISCOVERY_FROM_BLOCK, DEFAULT_IDENTITY_REGISTRY_BY_CHAIN_ID, runOnchainCorpusQuery, } from '../corpus/onchain-query.js';
22
- const __dirname = dirname(fileURLToPath(import.meta.url));
23
- function findPackageRoot(startDir) {
24
- let current = startDir;
25
- while (true) {
26
- if (existsSync(join(current, 'package.json')))
27
- return current;
28
- const parent = dirname(current);
29
- if (parent === current)
30
- return resolve(startDir, '..', '..');
31
- current = parent;
32
- }
33
- }
34
- const clientRoot = findPackageRoot(__dirname);
35
- const jinnBinPath = join(clientRoot, 'dist', 'bin', 'jinn.js');
36
- const mcpServerPath = join(clientRoot, 'dist', 'mcp', 'server.js');
37
- const DEFAULT_IPFS_GATEWAY_URL = 'https://gateway.autonolas.tech';
38
- const SWE_SOLUTION_ARTIFACT_TYPE = 'swe-rebench-v2_v1_solution';
39
- const CONSUMER_CLAUDE_DISABLED_HARNESSES = [
40
- 'legacy-claude',
41
- 'claude-code',
42
- 'claude-mcp-hyperliquid',
43
- 'claude-mcp-prediction',
44
- 'claude-mcp-prediction-apy',
45
- ];
46
- const VERDICT_ARTIFACT_TYPES = new Set([
47
- 'swe-rebench_v2_verdict',
48
- 'swe-rebench-v2_v1_verdict',
49
- ]);
50
- class GateFailure extends Error {
51
- code;
52
- details;
53
- constructor(code, message, details = {}) {
54
- super(message);
55
- this.code = code;
56
- this.details = details;
57
- this.name = 'GateFailure';
58
- }
59
- }
60
- function fail(code, message, details = {}) {
61
- throw new GateFailure(code, message, details);
62
- }
63
- function nowSlug(date = new Date()) {
64
- return date.toISOString().replace(/[:.]/g, '-');
65
- }
66
- function sleep(ms) {
67
- return new Promise((resolvePromise) => setTimeout(resolvePromise, ms));
68
- }
69
- function boundedPollSleep(deadline, pollMs) {
70
- return sleep(Math.max(0, Math.min(pollMs, deadline - Date.now())));
71
- }
72
- function asString(value) {
73
- return typeof value === 'string' && value.trim() ? value.trim() : undefined;
74
- }
75
- function defaultRpcUrlForChain(chainId) {
76
- return chainId === 8453 ? 'https://mainnet.base.org' : 'https://sepolia.base.org';
77
- }
78
- function asInt(value, fallback) {
79
- const n = Number.parseInt(String(value ?? ''), 10);
80
- return Number.isFinite(n) ? n : fallback;
81
- }
82
- function readJsonFile(path) {
83
- if (!existsSync(path))
84
- return {};
85
- return JSON.parse(readFileSync(path, 'utf8'));
86
- }
87
- function writeJson(path, value) {
88
- mkdirSync(dirname(path), { recursive: true });
89
- writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
90
- }
91
- function archiveManagedConsumerDb(dbPath, evidenceDir) {
92
- const archived = [];
93
- for (const path of [dbPath, `${dbPath}-wal`, `${dbPath}-shm`]) {
94
- if (!existsSync(path))
95
- continue;
96
- const target = join(evidenceDir, `previous-${basename(path)}`);
97
- renameSync(path, target);
98
- archived.push(target);
99
- }
100
- return archived;
101
- }
102
- function defaultClientHome(home) {
103
- return join(home, '.jinn-client');
104
- }
105
- function engineImplStateRoot(config, home) {
106
- const engine = config.engine && typeof config.engine === 'object' && !Array.isArray(config.engine)
107
- ? config.engine
108
- : {};
109
- return asString(engine.implStateDirRoot) ?? join(defaultClientHome(home), 'engine', 'impl-state');
110
- }
111
- function sweEvaluatorStatePath(config, home) {
112
- return join(engineImplStateRoot(config, home), 'swe-rebench-v2-evaluator', 'state.json');
113
- }
114
- function resolveConfigPath(path) {
115
- return path ? resolve(path) : DEFAULT_CONFIG_PATH;
116
- }
117
- function loadLocalConfig(path) {
118
- return readJsonFile(path);
119
- }
120
- function configApiPort(config, fallback) {
121
- return asInt(config.apiPort, fallback);
122
- }
123
- function configDbPath(config, home) {
124
- return asString(config.dbPath) ?? join(defaultClientHome(home), 'jinn.db');
125
- }
126
- function configEarningDir(config, home) {
127
- return asString(config.earningDir) ?? join(defaultClientHome(home), 'earning');
128
- }
129
- function normalizeIpfsGateway(base, cid) {
130
- const trimmed = base.replace(/\/+$/, '');
131
- return trimmed.endsWith('/ipfs') ? `${trimmed}/${cid}` : `${trimmed}/ipfs/${cid}`;
132
- }
133
- async function fetchJson(url, init) {
134
- const response = await fetch(url, init);
135
- if (!response.ok) {
136
- fail('http_error', `HTTP ${response.status} from ${url}`, { url, status: response.status });
137
- }
138
- return (await response.json());
139
- }
140
- async function fetchIpfsJson(gatewayUrl, cid) {
141
- return fetchJson(normalizeIpfsGateway(gatewayUrl, cid));
142
- }
143
- function sha256Hex(bytes) {
144
- return createHash('sha256').update(bytes).digest('hex');
145
- }
146
- function decodeBase64(value, label) {
147
- if (typeof value !== 'string' || !value.trim()) {
148
- fail('invalid_donation_wrapper', `${label} is missing base64 data`, { label });
149
- }
150
- return Buffer.from(value, 'base64');
151
- }
152
- async function queryIndexerExecution(indexerUrl, manifestCid) {
153
- const gqlUrl = indexerUrl.endsWith('/graphql') ? indexerUrl : `${indexerUrl}/graphql`;
154
- const where = { manifestCid };
155
- const body = await fetchJson(gqlUrl, {
156
- method: 'POST',
157
- headers: { 'content-type': 'application/json' },
158
- body: JSON.stringify({
159
- query: `
160
- query DonationEnvelope($where: envelopeFilter) {
161
- envelopes(where: $where, limit: 1, orderBy: "publishedAtBlock", orderDirection: "desc") {
162
- items {
163
- agentId
164
- manifestCid
165
- manifestHash
166
- kind
167
- evidenceTier
168
- publishedAtBlock
169
- }
170
- }
171
- }
172
- `,
173
- variables: { where },
174
- }),
175
- });
176
- const errors = body.errors;
177
- if (Array.isArray(errors) && errors.length > 0) {
178
- throw new Error(`Indexer returned errors while checking donated envelope indexing: ${JSON.stringify(errors)}`);
179
- }
180
- const items = body.data?.envelopes?.items;
181
- const item = (Array.isArray(items) ? items : [])[0];
182
- if (!item)
183
- return null;
184
- // Map Ponder indexer fields to the shape expected by queryCanonicalExecutionIndex callers:
185
- // evidenceTier → tier, agentId → operator.agentId, publishedAtBlock → publishedAt
186
- return {
187
- manifestCid: item.manifestCid,
188
- manifestHash: item.manifestHash,
189
- tier: item.evidenceTier,
190
- publishedAt: item.publishedAtBlock,
191
- operator: { agentId: item.agentId },
192
- };
193
- }
194
- async function queryIndexerTaskIdByTaskCidDigest(indexerUrl, taskCidDigest) {
195
- const gqlUrl = indexerUrl.endsWith('/graphql') ? indexerUrl : `${indexerUrl}/graphql`;
196
- const where = { taskCidDigest: taskCidDigest.toLowerCase() };
197
- const body = await fetchJson(gqlUrl, {
198
- method: 'POST',
199
- headers: { 'content-type': 'application/json' },
200
- body: JSON.stringify({
201
- query: `
202
- query TaskByTaskCidDigest($where: taskFilter) {
203
- tasks(where: $where, limit: 1) {
204
- items {
205
- id
206
- taskCidDigest
207
- createdAtTx
208
- }
209
- }
210
- }
211
- `,
212
- variables: { where },
213
- }),
214
- });
215
- const errors = body.errors;
216
- if (Array.isArray(errors) && errors.length > 0) {
217
- throw new Error(`Indexer returned errors while resolving producer task id: ${JSON.stringify(errors)}`);
218
- }
219
- const items = body.data?.tasks?.items;
220
- const task = (Array.isArray(items) ? items : [])[0];
221
- // The Ponder indexer's task `id` IS the on-chain task id (decimal string).
222
- return asString(task?.id) ?? null;
223
- }
224
- async function queryCanonicalExecutionIndex(opts) {
225
- const warnings = [];
226
- if (opts.indexerUrl) {
227
- try {
228
- const indexerExecution = await queryIndexerExecution(opts.indexerUrl, opts.manifestCid);
229
- if (indexerExecution)
230
- return { source: 'indexer', ...indexerExecution };
231
- }
232
- catch (err) {
233
- warnings.push(err instanceof Error ? err.message : String(err));
234
- }
235
- }
236
- const identityRegistryAddress = DEFAULT_IDENTITY_REGISTRY_BY_CHAIN_ID[opts.chainId];
237
- if (opts.rpcUrl && identityRegistryAddress) {
238
- try {
239
- const refs = await runOnchainCorpusQuery({ limit: 100 }, {
240
- rpcUrl: opts.rpcUrl,
241
- chainId: opts.chainId,
242
- identityRegistryAddress,
243
- fromBlock: DEFAULT_EXECUTION_DISCOVERY_FROM_BLOCK[opts.chainId],
244
- });
245
- const ref = refs.find((candidate) => candidate.manifestCid === opts.manifestCid);
246
- if (ref) {
247
- return {
248
- source: 'onchain',
249
- manifestCid: ref.manifestCid,
250
- manifestHash: ref.manifestHash,
251
- tier: ref.evidenceTier,
252
- publishedAt: ref.publishedAt,
253
- operator: ref.operator,
254
- };
255
- }
256
- }
257
- catch (err) {
258
- warnings.push(err instanceof Error ? err.message : String(err));
259
- }
260
- }
261
- return warnings.length > 0 ? { source: 'unavailable', warnings } : null;
262
- }
263
- async function waitForCanonicalExecutionIndex(opts) {
264
- while (Date.now() < opts.deadline) {
265
- const execution = await queryCanonicalExecutionIndex(opts);
266
- if (execution && execution.source !== 'unavailable')
267
- return execution;
268
- await boundedPollSleep(opts.deadline, opts.pollMs);
269
- }
270
- fail('envelope_not_indexed', 'Donated envelope is not visible through the canonical on-chain/IPFS index path.', {
271
- manifestCid: opts.manifestCid,
272
- });
273
- }
274
- function redactEnvelope(envelope) {
275
- const artifacts = Array.isArray(envelope.artifacts)
276
- ? envelope.artifacts.map((raw) => {
277
- const artifact = raw;
278
- return {
279
- artifactType: artifact.artifactType,
280
- sha256: artifact.sha256,
281
- access: artifact.access,
282
- metadata: artifact.metadata,
283
- sources: artifact.sources,
284
- };
285
- })
286
- : [];
287
- return {
288
- schemaVersion: envelope.schemaVersion,
289
- solverType: envelope.solverType,
290
- role: envelope.role,
291
- generatedAt: envelope.generatedAt,
292
- participant: envelope.participant,
293
- executor: envelope.executor,
294
- trajectory: envelope.trajectory,
295
- artifacts,
296
- payload: '<redacted>',
297
- };
298
- }
299
- async function verifyTrajectorySource(envelope, ipfsGatewayUrl) {
300
- const trajectory = envelope.trajectory;
301
- if (!trajectory || typeof trajectory !== 'object') {
302
- fail('trajectory_missing', 'Donated envelope does not include a trajectory reference.', {});
303
- }
304
- const trajectorySha = trajectory.sha256;
305
- if (typeof trajectorySha !== 'string' || !/^[0-9a-f]{64}$/.test(trajectorySha)) {
306
- fail('trajectory_invalid', 'Envelope trajectory is missing a valid sha256.', { trajectory });
307
- }
308
- const sources = Array.isArray(trajectory.sources) ? trajectory.sources : [];
309
- if (sources.length === 0) {
310
- fail('trajectory_sources_missing', 'Envelope trajectory has no donated IPFS source.', { trajectory });
311
- }
312
- let firstCid = '';
313
- for (const source of sources) {
314
- if (source.kind !== 'ipfs' ||
315
- typeof source.cid !== 'string' ||
316
- source.sha256 !== trajectorySha ||
317
- source.encoding !== 'jinn.artifact.donation.v1') {
318
- fail('invalid_trajectory_source', 'Envelope trajectory source is not a valid donated IPFS source.', {
319
- trajectory,
320
- source,
321
- });
322
- }
323
- firstCid ||= source.cid;
324
- const wrapper = await fetchIpfsJson(ipfsGatewayUrl, source.cid);
325
- if (wrapper.schemaVersion !== 'jinn.artifact.donation.v1' ||
326
- wrapper.encoding !== 'jinn.artifact.donation.v1' ||
327
- wrapper.artifactType !== 'jinn.trajectory.v1' ||
328
- wrapper.sha256 !== trajectorySha) {
329
- fail('invalid_trajectory_wrapper', 'Trajectory wrapper has unexpected schema, encoding, artifact type, or sha256.', {
330
- cid: source.cid,
331
- trajectorySha,
332
- });
333
- }
334
- const bytes = decodeBase64(wrapper.data, 'trajectory donation wrapper');
335
- const actualSha = sha256Hex(bytes);
336
- if (actualSha !== trajectorySha) {
337
- fail('trajectory_wrapper_hash_mismatch', 'Trajectory wrapper bytes do not match the advertised sha256.', {
338
- cid: source.cid,
339
- expected: trajectorySha,
340
- actual: actualSha,
341
- });
342
- }
343
- const trajectoryPayload = parseMaybeJson(bytes);
344
- if (trajectoryPayload?.schemaVersion !== 'jinn.trajectory.v1') {
345
- fail('trajectory_wrapper_payload_invalid', 'Trajectory wrapper bytes are not a jinn.trajectory.v1 payload.', {
346
- cid: source.cid,
347
- schemaVersion: trajectoryPayload?.schemaVersion,
348
- });
349
- }
350
- }
351
- return firstCid;
352
- }
353
- async function verifyDonatedEnvelope(artifact, ipfsGatewayUrl, indexOpts, deadline, pollMs) {
354
- const envelope = await fetchIpfsJson(ipfsGatewayUrl, artifact.envelopeCid);
355
- const artifacts = Array.isArray(envelope.artifacts) ? envelope.artifacts : [];
356
- const target = artifacts.find((candidate) => candidate.sha256 === artifact.sha256);
357
- if (!target) {
358
- fail('artifact_missing_from_envelope', 'Producer artifact sha256 is not present in its envelope.', {
359
- sha256: artifact.sha256,
360
- envelopeCid: artifact.envelopeCid,
361
- });
362
- }
363
- const sources = Array.isArray(target.sources) ? target.sources : [];
364
- if (sources.length === 0) {
365
- fail('donation_sources_missing', 'Donated SWE artifact has no IPFS sources.', {
366
- sha256: artifact.sha256,
367
- envelopeCid: artifact.envelopeCid,
368
- });
369
- }
370
- let firstCid = '';
371
- for (const source of sources) {
372
- if (source.kind !== 'ipfs' ||
373
- typeof source.cid !== 'string' ||
374
- source.sha256 !== artifact.sha256 ||
375
- source.encoding !== 'jinn.artifact.donation.v1') {
376
- fail('invalid_donation_source', 'Envelope source is not a valid donation IPFS source.', {
377
- sha256: artifact.sha256,
378
- source,
379
- });
380
- }
381
- firstCid ||= source.cid;
382
- const wrapper = await fetchIpfsJson(ipfsGatewayUrl, source.cid);
383
- if (wrapper.schemaVersion !== 'jinn.artifact.donation.v1' ||
384
- wrapper.encoding !== 'jinn.artifact.donation.v1' ||
385
- wrapper.sha256 !== artifact.sha256) {
386
- fail('invalid_donation_wrapper', 'Donation wrapper has unexpected schema, encoding, or sha256.', {
387
- cid: source.cid,
388
- sha256: artifact.sha256,
389
- });
390
- }
391
- const bytes = decodeBase64(wrapper.data, 'donation wrapper');
392
- const actualSha = sha256Hex(bytes);
393
- if (actualSha !== artifact.sha256) {
394
- fail('donation_wrapper_hash_mismatch', 'Donation wrapper bytes do not match the advertised sha256.', {
395
- cid: source.cid,
396
- expected: artifact.sha256,
397
- actual: actualSha,
398
- });
399
- }
400
- }
401
- const trajectorySourceCid = await verifyTrajectorySource(envelope, ipfsGatewayUrl);
402
- const indexExecution = await waitForCanonicalExecutionIndex({
403
- ...indexOpts,
404
- manifestCid: artifact.envelopeCid,
405
- deadline,
406
- pollMs,
407
- });
408
- return {
409
- artifact,
410
- sourceCid: firstCid,
411
- trajectorySourceCid,
412
- envelope,
413
- redactedEnvelope: redactEnvelope(envelope),
414
- indexExecution,
415
- };
416
- }
417
- async function fetchOperatorArtifacts(baseUrl, source, artifactType, auth = {}) {
418
- const url = new URL('/v1/operator/artifacts', baseUrl);
419
- url.searchParams.set('source', source);
420
- url.searchParams.set('artifactType', artifactType);
421
- url.searchParams.set('limit', '50');
422
- return fetchJson(url.toString(), auth.headers ? { headers: auth.headers } : undefined);
423
- }
424
- async function waitForProducerArtifact(opts) {
425
- let lastError = null;
426
- while (Date.now() < opts.deadline) {
427
- try {
428
- const response = await fetchOperatorArtifacts(opts.producerUrl, 'served', SWE_SOLUTION_ARTIFACT_TYPE, opts.producerAuth);
429
- const artifacts = response.artifacts ?? [];
430
- const candidate = artifacts.find((row) => {
431
- if (row.artifactType !== SWE_SOLUTION_ARTIFACT_TYPE ||
432
- typeof row.sha256 !== 'string' ||
433
- !row.envelopeCid ||
434
- typeof row.createdAt !== 'string') {
435
- return false;
436
- }
437
- return opts.reuseExisting || Date.parse(row.createdAt) >= opts.startedAt.getTime();
438
- });
439
- if (candidate?.sha256 && candidate.envelopeCid && candidate.createdAt) {
440
- return {
441
- sha256: candidate.sha256,
442
- artifactType: SWE_SOLUTION_ARTIFACT_TYPE,
443
- requestId: candidate.requestId ?? null,
444
- envelopeCid: candidate.envelopeCid,
445
- createdAt: candidate.createdAt,
446
- };
447
- }
448
- }
449
- catch (err) {
450
- lastError = err instanceof Error ? err.message : String(err);
451
- }
452
- await boundedPollSleep(opts.deadline, opts.pollMs);
453
- }
454
- fail('producer_artifact_timeout', opts.reuseExisting
455
- ? 'No donated SWE solution artifact with an envelope CID was found on the producer.'
456
- : 'No fresh donated SWE solution artifact was produced after the release gate started.', { producerUrl: opts.producerUrl, artifactType: SWE_SOLUTION_ARTIFACT_TYPE, lastError });
457
- }
458
- async function producerAuthFromHandshake(producerUrl, handshakeKey) {
459
- const url = new URL('/auth/handshake', producerUrl);
460
- url.searchParams.set('k', handshakeKey);
461
- const response = await fetch(url);
462
- if (!response.ok) {
463
- fail('producer_handshake_failed', 'Producer UI handshake failed.', {
464
- producerUrl,
465
- status: response.status,
466
- });
467
- }
468
- const setCookie = response.headers.get('set-cookie');
469
- const cookie = setCookie?.split(';')[0]?.trim();
470
- if (!cookie) {
471
- fail('producer_handshake_cookie_missing', 'Producer UI handshake did not return a session cookie.', {
472
- producerUrl,
473
- });
474
- }
475
- return { headers: { cookie } };
476
- }
477
- async function resolveProducerAuth(opts) {
478
- if (opts.producerUiToken) {
479
- return { headers: { 'x-jinn-ui-token': opts.producerUiToken } };
480
- }
481
- if (opts.producerHandshakeKey) {
482
- return producerAuthFromHandshake(opts.producerUrl, opts.producerHandshakeKey);
483
- }
484
- return {};
485
- }
486
- function buildConsumerHarnesses(raw) {
487
- const base = raw && typeof raw === 'object' && !Array.isArray(raw)
488
- ? { ...raw }
489
- : {};
490
- const disabled = new Set();
491
- for (const entry of Array.isArray(base.disabled) ? base.disabled : []) {
492
- if (typeof entry === 'string' && entry.trim())
493
- disabled.add(entry.trim());
494
- }
495
- for (const name of CONSUMER_CLAUDE_DISABLED_HARNESSES)
496
- disabled.add(name);
497
- delete base.externalImpls;
498
- return {
499
- ...base,
500
- default: 'codex',
501
- disabled: [...disabled],
502
- };
503
- }
504
- export function buildConsumerConfig(opts) {
505
- const clientHome = defaultClientHome(opts.consumerHome);
506
- const base = {
507
- network: opts.producerConfig.network ?? 'testnet',
508
- rpcUrl: opts.producerConfig.rpcUrl,
509
- earningDir: join(clientHome, 'earning'),
510
- dbPath: join(clientHome, 'jinn.db'),
511
- apiPort: opts.consumerPort,
512
- pollIntervalMs: opts.producerConfig.pollIntervalMs ?? 5000,
513
- discovery: { mode: 'http', url: opts.indexerUrl, fallbackToOnchain: true },
514
- ipfsGatewayUrl: opts.ipfsGatewayUrl,
515
- ipfsRegistryUrl: opts.producerConfig.ipfsRegistryUrl ?? 'https://registry.autonolas.tech',
516
- operator: {
517
- publicEndpoint: `http://localhost:${opts.consumerPort}`,
518
- defaultPriceUsdc: '0',
519
- perArtifactTypePrice: {},
520
- donation: { enabled: true },
521
- },
522
- ...(opts.producerConfig.claudePath ? { claudePath: opts.producerConfig.claudePath } : {}),
523
- ...(opts.producerConfig.claudeModel ? { claudeModel: opts.producerConfig.claudeModel } : {}),
524
- ...(opts.producerConfig.runtimeMode ? { runtimeMode: opts.producerConfig.runtimeMode } : {}),
525
- ...(opts.producerConfig.harness ? { harness: opts.producerConfig.harness } : {}),
526
- harnesses: buildConsumerHarnesses(opts.producerConfig.harnesses),
527
- // Issue #421: the legacy `solverNets` block is retired; consumer config
528
- // inherits the producer's `joinedSolverNets` only.
529
- ...(opts.producerConfig.joinedSolverNets ? { joinedSolverNets: opts.producerConfig.joinedSolverNets } : {}),
530
- engine: {
531
- workingDirRoot: join(clientHome, 'engine', 'work'),
532
- implStateDirRoot: join(clientHome, 'engine', 'impl-state'),
533
- },
534
- tasks: [],
535
- };
536
- for (const key of [
537
- 'testnetL2DeploymentPath',
538
- 'testnetL2TokenDeploymentPath',
539
- 'testnetMechDeploymentPath',
540
- 'testnetStolasDeploymentPath',
541
- 'jinnMviL1DeploymentPath',
542
- 'jinnMviL2DeploymentPath',
543
- 'ethereumRpcUrl',
544
- 'jinnDistributorAddress',
545
- 'jinnClaimEmitterAddress',
546
- ]) {
547
- if (opts.producerConfig[key] !== undefined)
548
- base[key] = opts.producerConfig[key];
549
- }
550
- return base;
551
- }
552
- export function ensureConsumerSweEvaluatorState(opts) {
553
- const consumerStatePath = sweEvaluatorStatePath(opts.consumerConfig, opts.consumerHome);
554
- const consumerState = readJsonFile(consumerStatePath);
555
- const existingUpstream = asString(consumerState.upstreamRepoDir);
556
- if (consumerState.schemaVersion === 'swe-rebench-v2-evaluator-state.v1' && existingUpstream && existsSync(existingUpstream)) {
557
- return consumerStatePath;
558
- }
559
- const producerStatePath = sweEvaluatorStatePath(opts.producerConfig, opts.producerHome);
560
- const producerState = readJsonFile(producerStatePath);
561
- const upstreamRepoDir = asString(producerState.upstreamRepoDir);
562
- if (producerState.schemaVersion !== 'swe-rebench-v2-evaluator-state.v1' || !upstreamRepoDir || !existsSync(upstreamRepoDir)) {
563
- fail('consumer_evaluator_setup_required', 'Consumer SWE evaluator is not enabled and no reusable producer evaluator checkout was found.', {
564
- producerStatePath,
565
- consumerStatePath,
566
- remedy: 'Run `jinn harnesses enable swe-rebench-v2-evaluator` for the producer or the consumer config, then rerun the donation-consumption gate.',
567
- });
568
- }
569
- const nextState = {
570
- schemaVersion: 'swe-rebench-v2-evaluator-state.v1',
571
- enabled: true,
572
- enabledAt: new Date().toISOString(),
573
- upstreamRepoDir,
574
- };
575
- writeJson(consumerStatePath, nextState);
576
- if (opts.evidenceDir) {
577
- writeJson(join(opts.evidenceDir, 'consumer-evaluator-state.json'), {
578
- consumerStatePath,
579
- sourceStatePath: producerStatePath,
580
- upstreamRepoDir,
581
- });
582
- }
583
- return consumerStatePath;
584
- }
585
- function sourceName(value) {
586
- if (typeof value === 'string')
587
- return value;
588
- if (value && typeof value === 'object') {
589
- const record = value;
590
- return asString(record.name) ?? asString(record.source);
591
- }
592
- return undefined;
593
- }
594
- function includesSweRuntimePlugin(plugins) {
595
- return Array.isArray(plugins) && plugins.some((plugin) => {
596
- const name = sourceName(plugin);
597
- return name === 'bundled:swe-rebench-v2-runtime' || name === 'swe-rebench-v2-runtime';
598
- });
599
- }
600
- function disablesSweRuntime(disabledDefaults) {
601
- return Array.isArray(disabledDefaults) && disabledDefaults.some((entry) => entry === 'bundled:swe-rebench-v2-runtime' || entry === 'swe-rebench-v2-runtime');
602
- }
603
- function assertConsumerConfiguredForSwe(config, configPath) {
604
- const joined = config.joinedSolverNets;
605
- const entries = joined && typeof joined === 'object' && !Array.isArray(joined)
606
- ? Object.values(joined)
607
- : [];
608
- const sweEntries = entries.filter((entry) => {
609
- const contract = entry.contract;
610
- return contract?.id === 'swe-rebench-v2' && contract?.version === 'v1';
611
- });
612
- const solverEntries = sweEntries.filter((entry) => (Array.isArray(entry.roles) && entry.roles.includes('solver')));
613
- const evaluatorEntries = sweEntries.filter((entry) => (Array.isArray(entry.roles) && entry.roles.includes('evaluator')));
614
- const joinedRuntimeEnabled = solverEntries.some((entry) => (!disablesSweRuntime(entry.disabledDefaultPlugins) || includesSweRuntimePlugin(entry.plugins)));
615
- // Issue #421: legacy `solverNets` is retired; SWE-rebench v2 SolverNet
616
- // membership is asserted via joinedSolverNets exclusively.
617
- const hasSolver = solverEntries.length > 0;
618
- const hasEvaluator = evaluatorEntries.length > 0;
619
- const runtimeEnabled = joinedRuntimeEnabled;
620
- if (!hasSolver || !hasEvaluator || !runtimeEnabled) {
621
- fail('consumer_swe_join_required', 'Consumer config is not joined to SWE-rebench v2 for the live donation gate.', {
622
- configPath,
623
- hasSolver,
624
- hasEvaluator,
625
- runtimeEnabled,
626
- remedy: 'Join SWE-rebench v2 in the app as solver and evaluator with Network Tools plus swe-rebench-v2-runtime enabled, then rerun this gate with --consumer-config or the default isolated consumer home.',
627
- });
628
- }
629
- }
630
- export function resolveConsumerCodexHome(raw) {
631
- const explicit = raw?.trim() || process.env['JINN_DONATION_CONSUMER_CODEX_HOME']?.trim();
632
- if (explicit)
633
- return resolve(explicit);
634
- const envHome = process.env['CODEX_HOME']?.trim();
635
- if (envHome)
636
- return resolve(envHome);
637
- const defaultPath = join(homedir(), '.codex');
638
- return existsSync(join(defaultPath, 'auth.json')) ? defaultPath : undefined;
639
- }
640
- function assertConsumerCodexAuthAvailable(codexHome) {
641
- if (process.env['OPENAI_API_KEY']?.trim())
642
- return;
643
- if (codexHome && existsSync(join(codexHome, 'auth.json')))
644
- return;
645
- fail('consumer_codex_auth_required', 'Consumer Codex harness auth is missing for the live donation gate.', {
646
- codexHome,
647
- remedy: 'Set OPENAI_API_KEY, CODEX_HOME, JINN_DONATION_CONSUMER_CODEX_HOME, or pass --consumer-codex-home pointing at a Codex home with auth.json.',
648
- });
649
- }
650
- export function buildConsumerChildEnv(home, apiToken, codexHome) {
651
- const corepackHome = process.env['COREPACK_HOME'] ?? join(homedir(), '.cache', 'node', 'corepack');
652
- const env = {
653
- ...process.env,
654
- HOME: home,
655
- XDG_CONFIG_HOME: join(home, '.config'),
656
- XDG_DATA_HOME: join(home, '.local', 'share'),
657
- XDG_CACHE_HOME: join(home, '.cache'),
658
- COREPACK_HOME: corepackHome,
659
- DAEMON_API_TOKEN: apiToken,
660
- JINN_NO_UI: '1',
661
- NO_COLOR: '1',
662
- };
663
- if (codexHome)
664
- env.CODEX_HOME = codexHome;
665
- return env;
666
- }
667
- function runFundingPreflight(configPath, home, apiToken, evidenceDir, codexHome) {
668
- const result = spawnSync(process.execPath, [jinnBinPath, 'fund-requirements', '--json', '--config', configPath], {
669
- cwd: clientRoot,
670
- env: buildConsumerChildEnv(home, apiToken, codexHome),
671
- encoding: 'utf8',
672
- stdio: 'pipe',
673
- });
674
- writeFileSync(join(evidenceDir, 'consumer-fund-requirements.stdout'), result.stdout ?? '', 'utf8');
675
- writeFileSync(join(evidenceDir, 'consumer-fund-requirements.stderr'), result.stderr ?? '', 'utf8');
676
- if ((result.status ?? 1) !== 0) {
677
- fail('consumer_funding_preflight_failed', 'Consumer funding preflight failed.', {
678
- status: result.status,
679
- configPath,
680
- remedy: `Run: HOME=${home} node ${jinnBinPath} fund-requirements --json --config ${configPath}`,
681
- });
682
- }
683
- const lines = (result.stdout ?? '').split('\n').map((line) => line.trim()).filter(Boolean);
684
- const jsonLine = lines.reverse().find((line) => line.startsWith('{'));
685
- if (!jsonLine)
686
- return;
687
- const payload = JSON.parse(jsonLine);
688
- if (payload.satisfied === false) {
689
- fail('consumer_funding_required', 'Consumer operator is not funded enough for the live donation gate.', {
690
- fundRequirements: payload,
691
- remedy: `Fund the listed addresses, then run: HOME=${home} node ${jinnBinPath} bootstrap --json --config ${configPath}`,
692
- });
693
- }
694
- }
695
- function startConsumerDaemon(opts) {
696
- const child = spawn(process.execPath, [
697
- jinnBinPath,
698
- 'run',
699
- '--no-ui',
700
- '--funding-timeout',
701
- '1ms',
702
- '--json',
703
- '--config',
704
- opts.configPath,
705
- ], {
706
- cwd: clientRoot,
707
- env: buildConsumerChildEnv(opts.home, opts.apiToken, opts.codexHome),
708
- stdio: ['ignore', 'pipe', 'pipe'],
709
- });
710
- child.stdout.on('data', (chunk) => {
711
- writeFileSync(join(opts.evidenceDir, 'consumer-daemon.stdout'), String(chunk), { flag: 'a' });
712
- });
713
- child.stderr.on('data', (chunk) => {
714
- writeFileSync(join(opts.evidenceDir, 'consumer-daemon.stderr'), String(chunk), { flag: 'a' });
715
- });
716
- return child;
717
- }
718
- function childHasExited(child) {
719
- return child.exitCode !== null || child.signalCode !== null;
720
- }
721
- function waitForChildExit(child, timeoutMs) {
722
- if (childHasExited(child))
723
- return Promise.resolve(true);
724
- return new Promise((resolvePromise) => {
725
- const timer = setTimeout(() => {
726
- cleanup();
727
- resolvePromise(childHasExited(child));
728
- }, timeoutMs);
729
- const done = () => {
730
- cleanup();
731
- resolvePromise(true);
732
- };
733
- const cleanup = () => {
734
- clearTimeout(timer);
735
- child.off('exit', done);
736
- child.off('error', done);
737
- };
738
- child.once('exit', done);
739
- child.once('error', done);
740
- });
741
- }
742
- async function stopManagedConsumerDaemon(opts) {
743
- const stopResult = spawnSync(process.execPath, [jinnBinPath, 'stop', '--json', '--config', opts.configPath], {
744
- cwd: clientRoot,
745
- env: buildConsumerChildEnv(opts.home, opts.apiToken, opts.codexHome),
746
- encoding: 'utf8',
747
- stdio: 'pipe',
748
- });
749
- writeFileSync(join(opts.evidenceDir, 'consumer-daemon-stop.stdout'), stopResult.stdout ?? '', { flag: 'a' });
750
- writeFileSync(join(opts.evidenceDir, 'consumer-daemon-stop.stderr'), stopResult.stderr ?? '', { flag: 'a' });
751
- if (!childHasExited(opts.child)) {
752
- opts.child.kill('SIGTERM');
753
- await waitForChildExit(opts.child, 5_000);
754
- }
755
- if (!childHasExited(opts.child)) {
756
- opts.child.kill('SIGKILL');
757
- await waitForChildExit(opts.child, 5_000);
758
- }
759
- opts.child.stdout?.destroy();
760
- opts.child.stderr?.destroy();
761
- if (!childHasExited(opts.child)) {
762
- fail('consumer_daemon_cleanup_failed', 'Managed consumer daemon did not exit after the live gate completed.', {
763
- pid: opts.child.pid,
764
- stopStatus: stopResult.status,
765
- stdoutPath: join(opts.evidenceDir, 'consumer-daemon-stop.stdout'),
766
- stderrPath: join(opts.evidenceDir, 'consumer-daemon-stop.stderr'),
767
- });
768
- }
769
- }
770
- async function waitForStatus(opts) {
771
- while (Date.now() < opts.deadline) {
772
- const child = opts.consumerProcess;
773
- if (child && (child.exitCode !== null || child.signalCode !== null)) {
774
- fail('consumer_daemon_exited', 'Consumer daemon exited before it became reachable.', {
775
- exitCode: child.exitCode,
776
- signalCode: child.signalCode,
777
- stdoutPath: opts.evidenceDir ? join(opts.evidenceDir, 'consumer-daemon.stdout') : undefined,
778
- stderrPath: opts.evidenceDir ? join(opts.evidenceDir, 'consumer-daemon.stderr') : undefined,
779
- });
780
- }
781
- try {
782
- const response = await fetch(new URL('/v1/status', opts.baseUrl));
783
- if (response.ok)
784
- return;
785
- }
786
- catch {
787
- // not up yet
788
- }
789
- await boundedPollSleep(opts.deadline, opts.pollMs);
790
- }
791
- fail('consumer_daemon_unreachable', 'Consumer daemon did not become reachable before timeout.', { consumerUrl: opts.baseUrl });
792
- }
793
- async function callMcpTool(opts) {
794
- const client = new Client({ name: 'donation-consumption-acceptance', version: '1.0.0' });
795
- const transport = new StdioClientTransport({
796
- command: process.execPath,
797
- args: [mcpServerPath],
798
- cwd: clientRoot,
799
- env: {
800
- ...process.env,
801
- STORE_PATH: opts.storePath,
802
- DAEMON_API_URL: opts.daemonApiUrl,
803
- DAEMON_API_TOKEN: opts.daemonApiToken,
804
- // Discovery env for the MCP server's read-only corpus bootstrap.
805
- // JINN_DISCOVERY_URL replaces the old JINN_CORPUS_SUBGRAPH_URL.
806
- JINN_DISCOVERY_URL: opts.indexerUrl ?? '',
807
- JINN_DISCOVERY_MODE: opts.indexerUrl ? 'http' : 'onchain',
808
- JINN_CORPUS_IPFS_GATEWAY_URL: opts.ipfsGatewayUrl,
809
- JINN_CORPUS_RPC_URL: opts.rpcUrl ?? '',
810
- JINN_CORPUS_CHAIN_ID: String(opts.chainId),
811
- JINN_CORPUS_IDENTITY_REGISTRY_ADDRESS: opts.identityRegistryAddress ?? '',
812
- JINN_CORPUS_FROM_BLOCK: opts.fromBlock != null ? String(opts.fromBlock) : '',
813
- DESIRED_STATE_ID: 'donation-consumption-acceptance',
814
- DESIRED_STATE_DESCRIPTION: 'Verify cross-operator donated SWE execution data consumption.',
815
- DESIRED_STATE_ROLE: 'restoration',
816
- DESIRED_STATE_SOLVER_TYPE: 'swe-rebench-v2.v1',
817
- REQUEST_ID: 'donation-consumption-acceptance',
818
- },
819
- });
820
- try {
821
- await client.connect(transport);
822
- const result = await client.callTool({ name: opts.name, arguments: opts.args });
823
- const content = result.content;
824
- const text = content
825
- .filter((entry) => entry.type === 'text' && entry.text)
826
- .map((entry) => entry.text)
827
- .join('\n');
828
- try {
829
- return JSON.parse(text);
830
- }
831
- catch (err) {
832
- fail('consumer_mcp_non_json_response', `MCP tool ${opts.name} returned non-JSON text.`, {
833
- tool: opts.name,
834
- text,
835
- parseError: err instanceof Error ? err.message : String(err),
836
- });
837
- }
838
- }
839
- finally {
840
- await client.close();
841
- }
842
- }
843
- function hasDonatedIpfsSourceArgs(artifact) {
844
- const acquisition = artifact.acquisition;
845
- const args = acquisition?.arguments;
846
- const sources = Array.isArray(args?.sources) ? args.sources : [];
847
- return sources.some((source) => source.kind === 'ipfs' && source.encoding === 'jinn.artifact.donation.v1');
848
- }
849
- export function findDonatedArtifactRecord(searchResult, proof) {
850
- const records = Array.isArray(searchResult.records) ? searchResult.records : [];
851
- const matches = [];
852
- for (const record of records) {
853
- const envelopeRef = record.envelopeRef;
854
- if (envelopeRef?.cid !== proof.artifact.envelopeCid)
855
- continue;
856
- const artifactRefs = Array.isArray(record.artifactRefs) ? record.artifactRefs : [];
857
- const artifact = artifactRefs.find((candidate) => candidate.sha256 === proof.artifact.sha256);
858
- if (artifact)
859
- matches.push(artifact);
860
- }
861
- const networkAcquisition = matches.find(hasDonatedIpfsSourceArgs);
862
- if (networkAcquisition)
863
- return networkAcquisition;
864
- if (matches[0])
865
- return matches[0];
866
- fail('consumer_discovery_missing', 'Consumer MCP search_records did not discover the producer donated artifact.', {
867
- envelopeCid: proof.artifact.envelopeCid,
868
- sha256: proof.artifact.sha256,
869
- recordsSeen: records.length,
870
- });
871
- }
872
- function acquisitionArgsFromArtifact(artifact) {
873
- const acquisition = artifact.acquisition;
874
- const args = acquisition?.arguments;
875
- if (!args) {
876
- fail('consumer_acquisition_args_missing', 'Discovered artifact does not include acquire_artifact arguments.', {
877
- artifact,
878
- });
879
- }
880
- if (!hasDonatedIpfsSourceArgs(artifact)) {
881
- fail('consumer_acquisition_sources_missing', 'Discovered artifact acquisition args do not include donated IPFS sources.', {
882
- args,
883
- });
884
- }
885
- return args;
886
- }
887
- function proofParticipantSafe(proof) {
888
- const participant = proof.envelope.participant;
889
- if (participant && typeof participant === 'object' && !Array.isArray(participant)) {
890
- const safe = participant.safeAddress;
891
- if (typeof safe === 'string' && safe)
892
- return safe;
893
- }
894
- return '';
895
- }
896
- function producerTaskCreationTx(proof) {
897
- const task = proof.envelope.task;
898
- if (!task || typeof task !== 'object' || Array.isArray(task))
899
- return undefined;
900
- return asString(task.onchainCreationTx);
901
- }
902
- function producerTaskCidDigest(proof) {
903
- const task = proof.envelope.task;
904
- if (!task || typeof task !== 'object' || Array.isArray(task))
905
- return undefined;
906
- const cid = asString(task.cid);
907
- if (!cid)
908
- return undefined;
909
- if (/^0x[0-9a-fA-F]{64}$/.test(cid))
910
- return cid;
911
- const rawMultihashPrefix = 'f01551220';
912
- if (cid.startsWith(rawMultihashPrefix) && cid.length === rawMultihashPrefix.length + 64) {
913
- return `0x${cid.slice(rawMultihashPrefix.length)}`;
914
- }
915
- return undefined;
916
- }
917
- export async function scopeConsumerConfigToProducerTask(opts) {
918
- const taskCidDigest = producerTaskCidDigest(opts.proof);
919
- if (!taskCidDigest) {
920
- fail('producer_task_scope_missing_cid_digest', 'Producer envelope is missing a task CID digest, so the gate cannot scope consumer task discovery.', {
921
- envelopeCid: opts.proof.artifact.envelopeCid,
922
- });
923
- }
924
- const createdAtTx = producerTaskCreationTx(opts.proof);
925
- const taskId = await queryIndexerTaskIdByTaskCidDigest(opts.indexerUrl, taskCidDigest);
926
- if (!taskId) {
927
- fail('producer_task_scope_unresolved', 'Could not resolve the producer on-chain task id from the configured Ponder indexer.', {
928
- envelopeCid: opts.proof.artifact.envelopeCid,
929
- taskCidDigest,
930
- createdAtTx,
931
- indexerUrl: opts.indexerUrl,
932
- });
933
- }
934
- opts.consumerConfig.taskDiscoveryAllowedTaskIds = [taskId];
935
- writeJson(opts.consumerConfigPath, opts.consumerConfig);
936
- if (opts.evidenceDir) {
937
- writeJson(join(opts.evidenceDir, 'consumer-task-scope.json'), {
938
- allowedTaskIds: [taskId],
939
- producerEnvelopeCid: opts.proof.artifact.envelopeCid,
940
- producerTaskCidDigest: taskCidDigest,
941
- producerTaskCreatedAtTx: createdAtTx ?? null,
942
- consumerConfigPath: opts.consumerConfigPath,
943
- });
944
- }
945
- return taskId;
946
- }
947
- function parseMaybeJson(bytes) {
948
- try {
949
- const parsed = JSON.parse(bytes.toString('utf8'));
950
- return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null;
951
- }
952
- catch {
953
- return null;
954
- }
955
- }
956
- export async function waitForConsumerSolveAndEvaluatorProof(opts) {
957
- while (Date.now() < opts.deadline) {
958
- const store = new Store(opts.storePath);
959
- try {
960
- const networkRow = store.getNetworkArtifact(opts.proof.artifact.sha256);
961
- const runMatches = (requestId, expectedRole) => {
962
- if (!requestId)
963
- return false;
964
- const row = store.db.prepare(`
965
- SELECT
966
- task_id AS taskId,
967
- task_role AS taskRole,
968
- state,
969
- manifest_cid AS manifestCid,
970
- delivery_tx_hash AS deliveryTxHash
971
- FROM task_runs
972
- WHERE request_id = ?
973
- `).get(requestId);
974
- if (!row)
975
- return false;
976
- if (!opts.reuseExisting && opts.allowedTaskId && row.taskId !== opts.allowedTaskId)
977
- return false;
978
- return (row.taskRole === expectedRole &&
979
- row.state === 'COMPLETE' &&
980
- typeof row.manifestCid === 'string' &&
981
- row.manifestCid.length > 0 &&
982
- typeof row.deliveryTxHash === 'string' &&
983
- row.deliveryTxHash.length > 0);
984
- };
985
- const solutionRow = store.listServedArtifactMetadata({
986
- artifactType: SWE_SOLUTION_ARTIFACT_TYPE,
987
- limit: 50,
988
- }).find((row) => ((opts.reuseExisting || Date.parse(row.createdAt) >= opts.acquisitionFinishedAt.getTime()) &&
989
- runMatches(row.requestId, 'restoration')));
990
- const verdictRow = store.listServedArtifactMetadata({ limit: 100 }).find((row) => {
991
- if (!VERDICT_ARTIFACT_TYPES.has(row.artifactType))
992
- return false;
993
- return ((opts.reuseExisting || Date.parse(row.createdAt) >= opts.acquisitionFinishedAt.getTime()) &&
994
- runMatches(row.requestId, 'evaluation'));
995
- });
996
- if (networkRow &&
997
- networkRow.envelopeCid === opts.proof.artifact.envelopeCid &&
998
- networkRow.sourceEndpoint === `ipfs://${opts.proof.sourceCid}` &&
999
- networkRow.sourceOperator === proofParticipantSafe(opts.proof) &&
1000
- networkRow.paidAmountUsdc === '0' &&
1001
- (opts.reuseExisting || Date.parse(networkRow.fetchedAt) >= opts.startedAt.getTime()) &&
1002
- (opts.reuseExisting || Date.parse(networkRow.lastUsedAt) >= opts.acquisitionStartedAt.getTime()) &&
1003
- solutionRow &&
1004
- verdictRow) {
1005
- return {
1006
- networkRow: {
1007
- sha256: networkRow.sha256,
1008
- artifactType: networkRow.artifactType,
1009
- envelopeCid: networkRow.envelopeCid,
1010
- source: networkRow.source,
1011
- sourceOperator: networkRow.sourceOperator,
1012
- sourceEndpoint: networkRow.sourceEndpoint,
1013
- paidAmountUsdc: networkRow.paidAmountUsdc,
1014
- fetchedAt: networkRow.fetchedAt,
1015
- lastUsedAt: networkRow.lastUsedAt,
1016
- },
1017
- solution: {
1018
- sha256: solutionRow.sha256,
1019
- artifactType: solutionRow.artifactType,
1020
- envelopeCid: solutionRow.envelopeCid,
1021
- createdAt: solutionRow.createdAt,
1022
- },
1023
- verdict: {
1024
- sha256: verdictRow.sha256,
1025
- artifactType: verdictRow.artifactType,
1026
- envelopeCid: verdictRow.envelopeCid,
1027
- createdAt: verdictRow.createdAt,
1028
- },
1029
- };
1030
- }
1031
- }
1032
- finally {
1033
- store.close();
1034
- }
1035
- await boundedPollSleep(opts.deadline, opts.pollMs);
1036
- }
1037
- fail('consumer_solve_evaluate_timeout', 'Consumer did not produce IPFS network cache, SWE solution, and SWE evaluator verdict before timeout.', {
1038
- sha256: opts.proof.artifact.sha256,
1039
- envelopeCid: opts.proof.artifact.envelopeCid,
1040
- sourceCid: opts.proof.sourceCid,
1041
- allowedTaskId: opts.allowedTaskId,
1042
- acquisitionStartedAt: opts.acquisitionStartedAt.toISOString(),
1043
- acquisitionFinishedAt: opts.acquisitionFinishedAt.toISOString(),
1044
- requiredArtifacts: [SWE_SOLUTION_ARTIFACT_TYPE, ...VERDICT_ARTIFACT_TYPES],
1045
- });
1046
- }
1047
- function printHelp() {
1048
- console.log(`Usage: yarn release:donation-consumption [options]
1049
-
1050
- Strict release gate for cross-operator donated SWE execution data consumption.
1051
-
1052
- Options:
1053
- --producer-config <path> Producer config (default: ~/.jinn-client/config.json)
1054
- --consumer-config <path> Consumer config (default: <consumer-home>/.jinn-client/config.json)
1055
- --producer-url <url> Producer daemon URL (default from producer apiPort)
1056
- --producer-ui-token <tok> Producer UI token for /v1/operator/artifacts
1057
- --producer-handshake-key <k>
1058
- Exchange daemon handshake key for producer UI auth
1059
- --consumer-url <url> Attach to an existing consumer daemon instead of starting one
1060
- --consumer-home <path> Isolated consumer HOME (default: client/.acceptance/donation-consumer)
1061
- --consumer-codex-home <p> Codex auth/config home for the consumer harness
1062
- (default: CODEX_HOME or ~/.codex when auth.json exists)
1063
- --consumer-port <port> Consumer daemon port when started by this script (default: 7333)
1064
- --timeout-ms <ms> Gate timeout (default: 1800000)
1065
- --poll-ms <ms> Poll interval (default: 10000)
1066
- --evidence-dir <path> Evidence output directory
1067
- --reuse-existing Diagnostics only: allow pre-existing artifacts
1068
- --help Show this help
1069
-
1070
- Release mode requires fresh producer, consumer cache, solution, and evaluator
1071
- evidence created after this command starts. --reuse-existing is not valid
1072
- release evidence. The consumer must be joined to SWE-rebench v2 as solver and
1073
- evaluator with the SWE runtime enabled; the default isolated consumer config
1074
- inherits that SolverNet selection from the producer config while keeping a
1075
- separate HOME, DB, Safe, and agent identity. The Codex harness still requires
1076
- a real Codex/OpenAI credential via OPENAI_API_KEY or a usable CODEX_HOME.
1077
- `);
1078
- }
1079
- async function main() {
1080
- const parsed = parseArgs({
1081
- options: {
1082
- help: { type: 'boolean', default: false },
1083
- 'producer-config': { type: 'string' },
1084
- 'consumer-config': { type: 'string' },
1085
- 'producer-url': { type: 'string' },
1086
- 'producer-ui-token': { type: 'string' },
1087
- 'producer-handshake-key': { type: 'string' },
1088
- 'consumer-url': { type: 'string' },
1089
- 'consumer-home': { type: 'string' },
1090
- 'consumer-codex-home': { type: 'string' },
1091
- 'consumer-port': { type: 'string' },
1092
- 'timeout-ms': { type: 'string' },
1093
- 'poll-ms': { type: 'string' },
1094
- 'evidence-dir': { type: 'string' },
1095
- 'reuse-existing': { type: 'boolean', default: false },
1096
- },
1097
- allowPositionals: false,
1098
- });
1099
- if (parsed.values.help) {
1100
- printHelp();
1101
- return;
1102
- }
1103
- if (!existsSync(jinnBinPath) || !existsSync(mcpServerPath)) {
1104
- fail('release_gate_not_built', 'Donation consumption gate must run from a built client package.', {
1105
- missing: [
1106
- ...(!existsSync(jinnBinPath) ? [jinnBinPath] : []),
1107
- ...(!existsSync(mcpServerPath) ? [mcpServerPath] : []),
1108
- ],
1109
- remedy: 'Run `yarn build` before `yarn release:donation-consumption`, or run this command from the published package.',
1110
- });
1111
- }
1112
- const startedAt = new Date();
1113
- const timeoutMs = asInt(parsed.values['timeout-ms'], 30 * 60 * 1000);
1114
- const pollMs = asInt(parsed.values['poll-ms'], 10_000);
1115
- const deadline = Date.now() + timeoutMs;
1116
- const reuseExisting = Boolean(parsed.values['reuse-existing']);
1117
- const evidenceDir = resolve(parsed.values['evidence-dir']
1118
- ?? join(clientRoot, 'acceptance-runs', `${nowSlug(startedAt)}-donation-consumption`));
1119
- mkdirSync(evidenceDir, { recursive: true });
1120
- const producerConfigPath = resolveConfigPath(parsed.values['producer-config']);
1121
- const producerConfig = loadLocalConfig(producerConfigPath);
1122
- const producerHome = dirname(dirname(producerConfigPath));
1123
- const producerPort = configApiPort(producerConfig, 7331);
1124
- const producerUrl = parsed.values['producer-url'] ?? `http://127.0.0.1:${producerPort}`;
1125
- const producerUiToken = asString(parsed.values['producer-ui-token'])
1126
- ?? process.env['JINN_DONATION_PRODUCER_UI_TOKEN']?.trim();
1127
- const producerHandshakeKey = asString(parsed.values['producer-handshake-key'])
1128
- ?? process.env['JINN_DONATION_PRODUCER_HANDSHAKE_KEY']?.trim();
1129
- const producerAuth = await resolveProducerAuth({
1130
- producerUrl,
1131
- producerUiToken,
1132
- producerHandshakeKey,
1133
- });
1134
- const indexerUrl = asString(producerConfig.discovery?.url) ?? DEFAULT_TESTNET_DISCOVERY_URL;
1135
- const ipfsGatewayUrl = asString(producerConfig.ipfsGatewayUrl) ?? DEFAULT_IPFS_GATEWAY_URL;
1136
- const chainId = producerConfig.network === 'mainnet' ? 8453 : 84532;
1137
- const producerRpcUrl = asString(producerConfig.rpcUrl) ?? defaultRpcUrlForChain(chainId);
1138
- const corpusFromBlock = Number(DEFAULT_EXECUTION_DISCOVERY_FROM_BLOCK[chainId] ?? 0n);
1139
- const identityRegistryAddress = DEFAULT_IDENTITY_REGISTRY_BY_CHAIN_ID[chainId];
1140
- const consumerHome = resolve(parsed.values['consumer-home'] ?? join(clientRoot, '.acceptance', 'donation-consumer'));
1141
- const consumerCodexHome = resolveConsumerCodexHome(parsed.values['consumer-codex-home']);
1142
- assertConsumerCodexAuthAvailable(consumerCodexHome);
1143
- const consumerPort = asInt(parsed.values['consumer-port'], 7333);
1144
- const consumerConfigPath = resolve(parsed.values['consumer-config'] ?? join(defaultClientHome(consumerHome), 'config.json'));
1145
- const attachConsumerUrl = parsed.values['consumer-url'];
1146
- const envToken = process.env['JINN_DONATION_CONSUMER_DAEMON_API_TOKEN']?.trim() || process.env['DAEMON_API_TOKEN']?.trim();
1147
- if (attachConsumerUrl && !envToken) {
1148
- fail('consumer_token_required', 'Attached consumer daemon requires JINN_DONATION_CONSUMER_DAEMON_API_TOKEN or DAEMON_API_TOKEN.', {
1149
- consumerUrl: attachConsumerUrl,
1150
- });
1151
- }
1152
- const consumerApiToken = envToken || `donation-${randomBytes(24).toString('hex')}`;
1153
- const consumerUrl = attachConsumerUrl ?? `http://127.0.0.1:${consumerPort}`;
1154
- if (!parsed.values['consumer-config']) {
1155
- const consumerConfig = buildConsumerConfig({
1156
- producerConfig,
1157
- consumerHome,
1158
- consumerPort,
1159
- indexerUrl,
1160
- ipfsGatewayUrl,
1161
- });
1162
- writeJson(consumerConfigPath, consumerConfig);
1163
- }
1164
- let consumerConfig = loadLocalConfig(consumerConfigPath);
1165
- const consumerDbPath = configDbPath(consumerConfig, consumerHome);
1166
- const consumerEarningDir = configEarningDir(consumerConfig, consumerHome);
1167
- const archivedConsumerDb = (!attachConsumerUrl && !parsed.values['consumer-config'] && !reuseExisting)
1168
- ? archiveManagedConsumerDb(consumerDbPath, evidenceDir)
1169
- : [];
1170
- assertConsumerConfiguredForSwe(consumerConfig, consumerConfigPath);
1171
- const consumerEvaluatorStatePath = ensureConsumerSweEvaluatorState({
1172
- producerConfig,
1173
- producerHome,
1174
- consumerConfig,
1175
- consumerHome,
1176
- evidenceDir,
1177
- });
1178
- writeJson(join(evidenceDir, 'inputs.json'), {
1179
- startedAt: startedAt.toISOString(),
1180
- timeoutMs,
1181
- pollMs,
1182
- reuseExisting,
1183
- releaseEvidence: !reuseExisting,
1184
- producerConfigPath,
1185
- producerHome,
1186
- producerUrl,
1187
- producerAuth: producerAuth.headers ? '<configured>' : '<none>',
1188
- consumerConfigPath,
1189
- consumerUrl,
1190
- consumerHome,
1191
- consumerCodexHome: consumerCodexHome ?? '<OPENAI_API_KEY>',
1192
- consumerDbPath,
1193
- archivedConsumerDb,
1194
- consumerEarningDir,
1195
- consumerEvaluatorStatePath,
1196
- indexerUrl,
1197
- ipfsGatewayUrl,
1198
- });
1199
- console.log(`[donation-consumption] evidence: ${evidenceDir}`);
1200
- console.log('[donation-consumption] waiting for producer donated SWE artifact');
1201
- const producerArtifact = await waitForProducerArtifact({
1202
- producerUrl,
1203
- startedAt,
1204
- deadline,
1205
- reuseExisting,
1206
- pollMs,
1207
- producerAuth,
1208
- });
1209
- console.log('[donation-consumption] verifying producer IPFS envelope and canonical index visibility');
1210
- const donationProof = await verifyDonatedEnvelope(producerArtifact, ipfsGatewayUrl, { indexerUrl, rpcUrl: producerRpcUrl, chainId }, deadline, pollMs);
1211
- writeJson(join(evidenceDir, 'producer-proof.json'), {
1212
- artifact: donationProof.artifact,
1213
- sourceCid: donationProof.sourceCid,
1214
- trajectorySourceCid: donationProof.trajectorySourceCid,
1215
- indexExecution: donationProof.indexExecution,
1216
- });
1217
- writeJson(join(evidenceDir, 'producer-envelope-redacted.json'), donationProof.redactedEnvelope);
1218
- const allowedConsumerTaskId = await scopeConsumerConfigToProducerTask({
1219
- consumerConfig,
1220
- consumerConfigPath,
1221
- proof: donationProof,
1222
- indexerUrl,
1223
- evidenceDir,
1224
- });
1225
- consumerConfig = loadLocalConfig(consumerConfigPath);
1226
- console.log(`[donation-consumption] scoped consumer task discovery to producer task ${allowedConsumerTaskId}`);
1227
- let consumerProcess = null;
1228
- if (!attachConsumerUrl) {
1229
- console.log('[donation-consumption] running consumer funding preflight');
1230
- runFundingPreflight(consumerConfigPath, consumerHome, consumerApiToken, evidenceDir, consumerCodexHome);
1231
- console.log('[donation-consumption] starting isolated consumer daemon');
1232
- consumerProcess = startConsumerDaemon({
1233
- configPath: consumerConfigPath,
1234
- home: consumerHome,
1235
- apiToken: consumerApiToken,
1236
- evidenceDir,
1237
- codexHome: consumerCodexHome,
1238
- });
1239
- }
1240
- try {
1241
- await waitForStatus({
1242
- baseUrl: consumerUrl,
1243
- deadline,
1244
- pollMs,
1245
- consumerProcess,
1246
- evidenceDir,
1247
- });
1248
- console.log('[donation-consumption] checking consumer MCP discovery');
1249
- const searchResult = await callMcpTool({
1250
- name: 'search_records',
1251
- args: {
1252
- solverType: 'swe-rebench-v2.v1',
1253
- role: 'solution',
1254
- artifactType: SWE_SOLUTION_ARTIFACT_TYPE,
1255
- limit: 50,
1256
- },
1257
- storePath: consumerDbPath,
1258
- daemonApiUrl: consumerUrl,
1259
- daemonApiToken: consumerApiToken,
1260
- indexerUrl,
1261
- ipfsGatewayUrl,
1262
- rpcUrl: asString(consumerConfig.rpcUrl) ?? producerRpcUrl,
1263
- chainId,
1264
- identityRegistryAddress,
1265
- fromBlock: corpusFromBlock,
1266
- });
1267
- writeJson(join(evidenceDir, 'consumer-search-records.json'), searchResult);
1268
- const discoveredArtifact = findDonatedArtifactRecord(searchResult, donationProof);
1269
- const acquisitionArgs = acquisitionArgsFromArtifact(discoveredArtifact);
1270
- writeJson(join(evidenceDir, 'consumer-discovered-artifact.json'), discoveredArtifact);
1271
- console.log('[donation-consumption] acquiring donated artifact through consumer MCP');
1272
- const acquisitionStartedAt = new Date();
1273
- const acquireResult = await callMcpTool({
1274
- name: 'acquire_artifact',
1275
- args: acquisitionArgs,
1276
- storePath: consumerDbPath,
1277
- daemonApiUrl: consumerUrl,
1278
- daemonApiToken: consumerApiToken,
1279
- indexerUrl,
1280
- ipfsGatewayUrl,
1281
- rpcUrl: asString(consumerConfig.rpcUrl) ?? producerRpcUrl,
1282
- chainId,
1283
- identityRegistryAddress,
1284
- fromBlock: corpusFromBlock,
1285
- });
1286
- const acquisitionFinishedAt = new Date();
1287
- writeJson(join(evidenceDir, 'consumer-acquire-artifact.json'), {
1288
- ...acquireResult,
1289
- bytes: '<redacted>',
1290
- acquisitionStartedAt: acquisitionStartedAt.toISOString(),
1291
- acquisitionFinishedAt: acquisitionFinishedAt.toISOString(),
1292
- });
1293
- if (acquireResult.error) {
1294
- fail('consumer_acquire_failed', 'Consumer MCP acquire_artifact failed.', acquireResult);
1295
- }
1296
- if (acquireResult.sha256 !== donationProof.artifact.sha256) {
1297
- fail('consumer_acquire_wrong_artifact', 'Consumer MCP acquire_artifact returned the wrong sha256.', {
1298
- expected: donationProof.artifact.sha256,
1299
- actual: acquireResult.sha256,
1300
- });
1301
- }
1302
- if (!reuseExisting && acquireResult.source !== 'ipfs') {
1303
- fail('consumer_acquire_not_ipfs', 'Release-mode acquire_artifact did not fetch from the donated IPFS source.', {
1304
- expected: 'ipfs',
1305
- actual: acquireResult.source,
1306
- });
1307
- }
1308
- if (acquireResult.paidAmountUsdc !== '0') {
1309
- fail('consumer_acquire_not_free', 'Donated IPFS acquisition must be free for this release gate.', {
1310
- paidAmountUsdc: acquireResult.paidAmountUsdc,
1311
- });
1312
- }
1313
- console.log('[donation-consumption] waiting for consumer solve/evaluator evidence after acquisition');
1314
- const liveProof = await waitForConsumerSolveAndEvaluatorProof({
1315
- storePath: consumerDbPath,
1316
- proof: donationProof,
1317
- allowedTaskId: allowedConsumerTaskId,
1318
- startedAt,
1319
- acquisitionStartedAt,
1320
- acquisitionFinishedAt,
1321
- reuseExisting,
1322
- deadline,
1323
- pollMs,
1324
- });
1325
- writeJson(join(evidenceDir, 'consumer-network-artifact.json'), liveProof.networkRow);
1326
- writeJson(join(evidenceDir, 'consumer-solution-artifact.json'), liveProof.solution);
1327
- writeJson(join(evidenceDir, 'consumer-evaluator-verdict.json'), liveProof.verdict);
1328
- const summary = {
1329
- ok: true,
1330
- releaseEvidence: !reuseExisting,
1331
- evidenceDir,
1332
- producerArtifact: donationProof.artifact,
1333
- sourceCid: donationProof.sourceCid,
1334
- trajectorySourceCid: donationProof.trajectorySourceCid,
1335
- allowedConsumerTaskId,
1336
- acquisitionStartedAt: acquisitionStartedAt.toISOString(),
1337
- acquisitionFinishedAt: acquisitionFinishedAt.toISOString(),
1338
- consumerNetworkArtifact: liveProof.networkRow,
1339
- consumerSolution: liveProof.solution,
1340
- consumerVerdict: liveProof.verdict,
1341
- };
1342
- writeJson(join(evidenceDir, 'summary.json'), summary);
1343
- console.log(JSON.stringify(summary, null, 2));
1344
- }
1345
- finally {
1346
- if (consumerProcess) {
1347
- await stopManagedConsumerDaemon({
1348
- child: consumerProcess,
1349
- configPath: consumerConfigPath,
1350
- home: consumerHome,
1351
- apiToken: consumerApiToken,
1352
- evidenceDir,
1353
- codexHome: consumerCodexHome,
1354
- });
1355
- }
1356
- }
1357
- }
1358
- function isMainModule() {
1359
- const entrypoint = process.argv[1];
1360
- if (!entrypoint)
1361
- return false;
1362
- const current = fileURLToPath(import.meta.url);
1363
- try {
1364
- return realpathSync(entrypoint) === realpathSync(current);
1365
- }
1366
- catch {
1367
- return resolve(entrypoint) === current;
1368
- }
1369
- }
1370
- if (isMainModule()) {
1371
- main().catch((err) => {
1372
- if (err instanceof GateFailure) {
1373
- console.error(`[donation-consumption] FAILED ${err.code}: ${err.message}`);
1374
- console.error(JSON.stringify(err.details, null, 2));
1375
- process.exit(1);
1376
- }
1377
- console.error('[donation-consumption] FAILED unexpected error');
1378
- console.error(err);
1379
- process.exit(1);
1380
- });
1381
- }
1382
- //# sourceMappingURL=donation-consumption-acceptance.js.map