@jinn-network/client 0.1.7 → 0.1.8-canary.09a3b2f6

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 (438) hide show
  1. package/README.md +67 -1
  2. package/dist/adapters/mech/adapter.d.ts +39 -2
  3. package/dist/adapters/mech/adapter.js +178 -20
  4. package/dist/adapters/mech/adapter.js.map +1 -1
  5. package/dist/adapters/mech/contracts.d.ts +22 -1
  6. package/dist/adapters/mech/contracts.js +96 -52
  7. package/dist/adapters/mech/contracts.js.map +1 -1
  8. package/dist/adapters/mech/safe-revert.d.ts +4 -0
  9. package/dist/adapters/mech/safe-revert.js +5 -1
  10. package/dist/adapters/mech/safe-revert.js.map +1 -1
  11. package/dist/adapters/mech/safe.d.ts +1 -1
  12. package/dist/adapters/mech/safe.js +10 -4
  13. package/dist/adapters/mech/safe.js.map +1 -1
  14. package/dist/adapters/mech/types.d.ts +6 -1
  15. package/dist/adapters/mech/types.js.map +1 -1
  16. package/dist/agent/operator-claude.js +8 -0
  17. package/dist/agent/operator-claude.js.map +1 -1
  18. package/dist/api/activity-events-endpoint.d.ts +14 -0
  19. package/dist/api/activity-events-endpoint.js +59 -0
  20. package/dist/api/activity-events-endpoint.js.map +1 -0
  21. package/dist/api/bootstrap-endpoint.d.ts +1 -2
  22. package/dist/api/bootstrap-endpoint.js +42 -24
  23. package/dist/api/bootstrap-endpoint.js.map +1 -1
  24. package/dist/api/codex-doctor-endpoint.d.ts +22 -5
  25. package/dist/api/codex-doctor-endpoint.js +136 -17
  26. package/dist/api/codex-doctor-endpoint.js.map +1 -1
  27. package/dist/api/debug-report-endpoint.d.ts +27 -0
  28. package/dist/api/debug-report-endpoint.js +157 -0
  29. package/dist/api/debug-report-endpoint.js.map +1 -0
  30. package/dist/api/discovery-endpoint.d.ts +1 -0
  31. package/dist/api/discovery-endpoint.js +24 -0
  32. package/dist/api/discovery-endpoint.js.map +1 -1
  33. package/dist/api/fleet-build.d.ts +1 -7
  34. package/dist/api/fleet-build.js +0 -7
  35. package/dist/api/fleet-build.js.map +1 -1
  36. package/dist/api/gather-status.d.ts +39 -0
  37. package/dist/api/gather-status.js +181 -84
  38. package/dist/api/gather-status.js.map +1 -1
  39. package/dist/api/hermes-doctor-endpoint.d.ts +15 -7
  40. package/dist/api/hermes-doctor-endpoint.js +56 -19
  41. package/dist/api/hermes-doctor-endpoint.js.map +1 -1
  42. package/dist/api/launcher-status.d.ts +4 -2
  43. package/dist/api/launcher-status.js +11 -10
  44. package/dist/api/launcher-status.js.map +1 -1
  45. package/dist/api/launcher-tasks.d.ts +1 -1
  46. package/dist/api/launcher-tasks.js +12 -8
  47. package/dist/api/launcher-tasks.js.map +1 -1
  48. package/dist/api/loop-completion-build.d.ts +79 -0
  49. package/dist/api/loop-completion-build.js +155 -0
  50. package/dist/api/loop-completion-build.js.map +1 -0
  51. package/dist/api/operator-artifacts-endpoint.js +73 -6
  52. package/dist/api/operator-artifacts-endpoint.js.map +1 -1
  53. package/dist/api/portfolio-v0-build.d.ts +7 -1
  54. package/dist/api/portfolio-v0-build.js +6 -2
  55. package/dist/api/portfolio-v0-build.js.map +1 -1
  56. package/dist/api/prediction-v1-build.d.ts +6 -0
  57. package/dist/api/prediction-v1-build.js +3 -1
  58. package/dist/api/prediction-v1-build.js.map +1 -1
  59. package/dist/api/server.d.ts +17 -0
  60. package/dist/api/server.js +40 -1
  61. package/dist/api/server.js.map +1 -1
  62. package/dist/api/setup-endpoints.d.ts +13 -9
  63. package/dist/api/setup-endpoints.js +50 -173
  64. package/dist/api/setup-endpoints.js.map +1 -1
  65. package/dist/api/solvernets-endpoints.js +33 -63
  66. package/dist/api/solvernets-endpoints.js.map +1 -1
  67. package/dist/api/status-build.d.ts +140 -17
  68. package/dist/api/status-build.js +47 -34
  69. package/dist/api/status-build.js.map +1 -1
  70. package/dist/api/status-harness-rollup.d.ts +35 -0
  71. package/dist/api/status-harness-rollup.js +45 -0
  72. package/dist/api/status-harness-rollup.js.map +1 -0
  73. package/dist/api/status-rollup-build.d.ts +0 -4
  74. package/dist/api/status-rollup-build.js +0 -4
  75. package/dist/api/status-rollup-build.js.map +1 -1
  76. package/dist/api/task-runs-build.d.ts +8 -0
  77. package/dist/api/task-runs-build.js +5 -1
  78. package/dist/api/task-runs-build.js.map +1 -1
  79. package/dist/build-info.json +4 -4
  80. package/dist/build-meta.json +1 -1
  81. package/dist/captures/live-publisher.js +24 -4
  82. package/dist/captures/live-publisher.js.map +1 -1
  83. package/dist/captures/publish.d.ts +1 -1
  84. package/dist/chain-read-errors.d.ts +12 -0
  85. package/dist/chain-read-errors.js +26 -1
  86. package/dist/chain-read-errors.js.map +1 -1
  87. package/dist/cli/commands/codedigest-revert-check.d.ts +33 -0
  88. package/dist/cli/commands/codedigest-revert-check.js +253 -0
  89. package/dist/cli/commands/codedigest-revert-check.js.map +1 -0
  90. package/dist/cli/commands/doctor.d.ts +3 -0
  91. package/dist/cli/commands/doctor.js +35 -0
  92. package/dist/cli/commands/doctor.js.map +1 -1
  93. package/dist/cli/commands/eval.d.ts +76 -0
  94. package/dist/cli/commands/eval.js +401 -0
  95. package/dist/cli/commands/eval.js.map +1 -0
  96. package/dist/cli/commands/rewards.d.ts +2 -0
  97. package/dist/cli/commands/rewards.js +27 -0
  98. package/dist/cli/commands/rewards.js.map +1 -1
  99. package/dist/cli/commands/solver-nets.d.ts +1 -0
  100. package/dist/cli/commands/solver-nets.js +245 -22
  101. package/dist/cli/commands/solver-nets.js.map +1 -1
  102. package/dist/cli/commands/solver-plugins-block.d.ts +33 -0
  103. package/dist/cli/commands/solver-plugins-block.js +118 -0
  104. package/dist/cli/commands/solver-plugins-block.js.map +1 -0
  105. package/dist/cli/commands/solver-plugins-feedback.d.ts +72 -0
  106. package/dist/cli/commands/solver-plugins-feedback.js +262 -0
  107. package/dist/cli/commands/solver-plugins-feedback.js.map +1 -0
  108. package/dist/cli/commands/solver-plugins-read.d.ts +54 -0
  109. package/dist/cli/commands/solver-plugins-read.js +259 -0
  110. package/dist/cli/commands/solver-plugins-read.js.map +1 -0
  111. package/dist/cli/commands/solver-plugins.d.ts +35 -0
  112. package/dist/cli/commands/solver-plugins.js +399 -2
  113. package/dist/cli/commands/solver-plugins.js.map +1 -1
  114. package/dist/cli/commands/status.js +0 -1
  115. package/dist/cli/commands/status.js.map +1 -1
  116. package/dist/cli/commands/tasks.js +15 -2
  117. package/dist/cli/commands/tasks.js.map +1 -1
  118. package/dist/cli/index.js +4 -0
  119. package/dist/cli/index.js.map +1 -1
  120. package/dist/cli/task-native-readiness.d.ts +7 -0
  121. package/dist/cli/task-native-readiness.js +7 -5
  122. package/dist/cli/task-native-readiness.js.map +1 -1
  123. package/dist/config.d.ts +206 -232
  124. package/dist/config.js +289 -107
  125. package/dist/config.js.map +1 -1
  126. package/dist/daemon/ai-units-gate.d.ts +54 -0
  127. package/dist/daemon/ai-units-gate.js +83 -0
  128. package/dist/daemon/ai-units-gate.js.map +1 -0
  129. package/dist/daemon/creator.js +13 -0
  130. package/dist/daemon/creator.js.map +1 -1
  131. package/dist/daemon/daemon.d.ts +10 -0
  132. package/dist/daemon/daemon.js +205 -30
  133. package/dist/daemon/daemon.js.map +1 -1
  134. package/dist/daemon/eviction-loop.d.ts +7 -0
  135. package/dist/daemon/eviction-loop.js +16 -0
  136. package/dist/daemon/eviction-loop.js.map +1 -1
  137. package/dist/daemon/gate-logger.d.ts +9 -0
  138. package/dist/daemon/gate-logger.js +2 -0
  139. package/dist/daemon/gate-logger.js.map +1 -0
  140. package/dist/daemon/jinn-claim-loop.js +22 -4
  141. package/dist/daemon/jinn-claim-loop.js.map +1 -1
  142. package/dist/daemon/readiness-gate.d.ts +1 -4
  143. package/dist/daemon/readiness-gate.js.map +1 -1
  144. package/dist/daemon/spend-cap-gate.d.ts +40 -0
  145. package/dist/daemon/spend-cap-gate.js +46 -0
  146. package/dist/daemon/spend-cap-gate.js.map +1 -0
  147. package/dist/dashboard/assets/index-3quVQqik.js +167 -0
  148. package/dist/dashboard/assets/index-BVAWkLwY.css +1 -0
  149. package/dist/dashboard/index.html +2 -2
  150. package/dist/discovery/http.d.ts +7 -0
  151. package/dist/discovery/http.js +567 -24
  152. package/dist/discovery/http.js.map +1 -1
  153. package/dist/discovery/onchain.js +197 -5
  154. package/dist/discovery/onchain.js.map +1 -1
  155. package/dist/discovery/types.d.ts +235 -0
  156. package/dist/discovery/types.js +40 -0
  157. package/dist/discovery/types.js.map +1 -1
  158. package/dist/discovery/with-fallback.js +41 -0
  159. package/dist/discovery/with-fallback.js.map +1 -1
  160. package/dist/earning/bootstrap.d.ts +31 -3
  161. package/dist/earning/bootstrap.js +94 -22
  162. package/dist/earning/bootstrap.js.map +1 -1
  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 +34 -11
  167. package/dist/earning/safe-adapter.js.map +1 -1
  168. package/dist/earning/types.d.ts +6 -6
  169. package/dist/earning/viem-clients.d.ts +11 -4
  170. package/dist/earning/viem-clients.js +14 -5
  171. package/dist/earning/viem-clients.js.map +1 -1
  172. package/dist/erc8004/identity.d.ts +19 -3
  173. package/dist/erc8004/identity.js +38 -11
  174. package/dist/erc8004/identity.js.map +1 -1
  175. package/dist/erc8004/index.d.ts +1 -1
  176. package/dist/erc8004/index.js.map +1 -1
  177. package/dist/eval/eval-harness-run.d.ts +63 -0
  178. package/dist/eval/eval-harness-run.js +123 -0
  179. package/dist/eval/eval-harness-run.js.map +1 -0
  180. package/dist/eval/orchestrator.d.ts +163 -0
  181. package/dist/eval/orchestrator.js +232 -0
  182. package/dist/eval/orchestrator.js.map +1 -0
  183. package/dist/eval/paired.d.ts +68 -0
  184. package/dist/eval/paired.js +93 -0
  185. package/dist/eval/paired.js.map +1 -0
  186. package/dist/eval/resolve-slate-tasks.d.ts +35 -0
  187. package/dist/eval/resolve-slate-tasks.js +56 -0
  188. package/dist/eval/resolve-slate-tasks.js.map +1 -0
  189. package/dist/eval/screen-discovery.d.ts +22 -0
  190. package/dist/eval/screen-discovery.js +71 -0
  191. package/dist/eval/screen-discovery.js.map +1 -0
  192. package/dist/eval/screen-progress.d.ts +41 -0
  193. package/dist/eval/screen-progress.js +60 -0
  194. package/dist/eval/screen-progress.js.map +1 -0
  195. package/dist/eval/screen-runner.d.ts +30 -0
  196. package/dist/eval/screen-runner.js +289 -0
  197. package/dist/eval/screen-runner.js.map +1 -0
  198. package/dist/eval/screen.d.ts +107 -0
  199. package/dist/eval/screen.js +159 -0
  200. package/dist/eval/screen.js.map +1 -0
  201. package/dist/eval/slope.d.ts +29 -0
  202. package/dist/eval/slope.js +46 -0
  203. package/dist/eval/slope.js.map +1 -0
  204. package/dist/eval/train-sequence.d.ts +35 -0
  205. package/dist/eval/train-sequence.js +59 -0
  206. package/dist/eval/train-sequence.js.map +1 -0
  207. package/dist/eval/wilson.d.ts +45 -0
  208. package/dist/eval/wilson.js +48 -0
  209. package/dist/eval/wilson.js.map +1 -0
  210. package/dist/events/types.d.ts +2 -2
  211. package/dist/harnesses/cost-estimates.d.ts +10 -31
  212. package/dist/harnesses/cost-estimates.js +11 -43
  213. package/dist/harnesses/cost-estimates.js.map +1 -1
  214. package/dist/harnesses/engine/canonical-json.js +5 -3
  215. package/dist/harnesses/engine/canonical-json.js.map +1 -1
  216. package/dist/harnesses/engine/engine.d.ts +37 -4
  217. package/dist/harnesses/engine/engine.js +151 -20
  218. package/dist/harnesses/engine/engine.js.map +1 -1
  219. package/dist/harnesses/engine/persistence.d.ts +38 -4
  220. package/dist/harnesses/engine/persistence.js +71 -6
  221. package/dist/harnesses/engine/persistence.js.map +1 -1
  222. package/dist/harnesses/engine/state.d.ts +9 -0
  223. package/dist/harnesses/engine/state.js +23 -10
  224. package/dist/harnesses/engine/state.js.map +1 -1
  225. package/dist/harnesses/impls/hermes-agent/adapter.d.ts +2 -0
  226. package/dist/harnesses/impls/hermes-agent/adapter.js +8 -5
  227. package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
  228. package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +1 -0
  229. package/dist/harnesses/impls/hermes-agent/bootstrap.js +10 -3
  230. package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
  231. package/dist/harnesses/impls/hermes-agent/config-builder.d.ts +1 -1
  232. package/dist/harnesses/impls/hermes-agent/config-builder.js +4 -2
  233. package/dist/harnesses/impls/hermes-agent/config-builder.js.map +1 -1
  234. package/dist/harnesses/impls/hermes-agent/harness.d.ts +31 -3
  235. package/dist/harnesses/impls/hermes-agent/harness.js +84 -7
  236. package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
  237. package/dist/harnesses/impls/hermes-agent/prompt.d.ts +6 -6
  238. package/dist/harnesses/impls/hermes-agent/prompt.js +6 -6
  239. package/dist/harnesses/impls/index.d.ts +2 -0
  240. package/dist/harnesses/impls/index.js +2 -0
  241. package/dist/harnesses/impls/index.js.map +1 -1
  242. package/dist/harnesses/impls/learner/adapters/claude-code.d.ts +17 -0
  243. package/dist/harnesses/impls/learner/adapters/claude-code.js +118 -14
  244. package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
  245. package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +9 -0
  246. package/dist/harnesses/impls/learner/adapters/codex-code.js +30 -8
  247. package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
  248. package/dist/harnesses/impls/learner/harness.d.ts +41 -1
  249. package/dist/harnesses/impls/learner/harness.js +78 -4
  250. package/dist/harnesses/impls/learner/harness.js.map +1 -1
  251. package/dist/harnesses/impls/learner/harvest.d.ts +3 -1
  252. package/dist/harnesses/impls/learner/harvest.js +30 -6
  253. package/dist/harnesses/impls/learner/harvest.js.map +1 -1
  254. package/dist/harnesses/impls/learner/plugin-path.js +1 -0
  255. package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
  256. package/dist/harnesses/impls/learner/restoration-patch.d.ts +2 -2
  257. package/dist/harnesses/impls/learner/restoration-patch.js +25 -6
  258. package/dist/harnesses/impls/learner/restoration-patch.js.map +1 -1
  259. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +21 -1
  260. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
  261. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +3 -1
  262. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
  263. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.d.ts +74 -5
  264. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +103 -32
  265. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
  266. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +2 -2
  267. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +3 -1
  268. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
  269. package/dist/harnesses/readiness-registry.d.ts +7 -0
  270. package/dist/harnesses/readiness-registry.js +9 -0
  271. package/dist/harnesses/readiness-registry.js.map +1 -1
  272. package/dist/harnesses/types.d.ts +14 -0
  273. package/dist/learner/revert-decision.d.ts +74 -0
  274. package/dist/learner/revert-decision.js +73 -0
  275. package/dist/learner/revert-decision.js.map +1 -0
  276. package/dist/learner/revert-stats.d.ts +38 -0
  277. package/dist/learner/revert-stats.js +86 -0
  278. package/dist/learner/revert-stats.js.map +1 -0
  279. package/dist/local-provider-url.d.ts +3 -0
  280. package/dist/local-provider-url.js +28 -0
  281. package/dist/local-provider-url.js.map +1 -0
  282. package/dist/main.js +199 -104
  283. package/dist/main.js.map +1 -1
  284. package/dist/mcp/get-codedigest-reward.d.ts +13 -0
  285. package/dist/mcp/get-codedigest-reward.js +23 -0
  286. package/dist/mcp/get-codedigest-reward.js.map +1 -0
  287. package/dist/mcp/server.js +23 -0
  288. package/dist/mcp/server.js.map +1 -1
  289. package/dist/observability/debug-report-assemble.d.ts +43 -0
  290. package/dist/observability/debug-report-assemble.js +80 -0
  291. package/dist/observability/debug-report-assemble.js.map +1 -0
  292. package/dist/observability/emit-event.d.ts +9 -2
  293. package/dist/observability/emit-event.js +36 -2
  294. package/dist/observability/emit-event.js.map +1 -1
  295. package/dist/observability/file-logger.d.ts +69 -0
  296. package/dist/observability/file-logger.js +177 -0
  297. package/dist/observability/file-logger.js.map +1 -0
  298. package/dist/observability/redact-secrets.d.ts +65 -0
  299. package/dist/observability/redact-secrets.js +300 -0
  300. package/dist/observability/redact-secrets.js.map +1 -0
  301. package/dist/observability/tar.d.ts +30 -0
  302. package/dist/observability/tar.js +102 -0
  303. package/dist/observability/tar.js.map +1 -0
  304. package/dist/plugins/learner/.claude-plugin/plugin.json +1 -1
  305. package/dist/plugins/learner/.codex-plugin/plugin.json +1 -1
  306. package/dist/plugins/learner/hooks/session-start +30 -1
  307. package/dist/plugins/learner/skills/learn/consolidator-prompt.md +22 -1
  308. package/dist/plugins/learner/skills/learn/promoter-prompt.md +72 -1
  309. package/dist/preflight/deployment-readiness.d.ts +147 -0
  310. package/dist/preflight/deployment-readiness.js +366 -0
  311. package/dist/preflight/deployment-readiness.js.map +1 -0
  312. package/dist/preflight/pidfile-liveness.d.ts +50 -0
  313. package/dist/preflight/pidfile-liveness.js +117 -0
  314. package/dist/preflight/pidfile-liveness.js.map +1 -0
  315. package/dist/preflight/rpc-network.d.ts +40 -0
  316. package/dist/preflight/rpc-network.js +67 -1
  317. package/dist/preflight/rpc-network.js.map +1 -1
  318. package/dist/rpc/transport.d.ts +145 -0
  319. package/dist/rpc/transport.js +319 -0
  320. package/dist/rpc/transport.js.map +1 -0
  321. package/dist/scripts/donation-consumption-acceptance.js +7 -28
  322. package/dist/scripts/donation-consumption-acceptance.js.map +1 -1
  323. package/dist/scripts/swe-rebench-v2-pytest-missing.json +16 -0
  324. package/dist/solver-nets/prediction-operator-ux.d.ts +1 -2
  325. package/dist/solver-nets/prediction-operator-ux.js +56 -53
  326. package/dist/solver-nets/prediction-operator-ux.js.map +1 -1
  327. package/dist/solver-nets/registry.d.ts +19 -1
  328. package/dist/solver-nets/registry.js +37 -24
  329. package/dist/solver-nets/registry.js.map +1 -1
  330. package/dist/solver-types/_swe-rebench-v2-held-out-slate.d.ts +76 -0
  331. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js +156 -0
  332. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js.map +1 -0
  333. package/dist/solver-types/_swe-rebench-v2-pool-recovery.d.ts +81 -0
  334. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js +116 -0
  335. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js.map +1 -0
  336. package/dist/solver-types/_swe-rebench-v2-pool.d.ts +9 -2
  337. package/dist/solver-types/_swe-rebench-v2-pool.js +15 -20
  338. package/dist/solver-types/_swe-rebench-v2-pool.js.map +1 -1
  339. package/dist/solver-types/_swe-rebench-v2-state.d.ts +24 -0
  340. package/dist/solver-types/_swe-rebench-v2-state.js +33 -0
  341. package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
  342. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +116 -2
  343. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +296 -21
  344. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  345. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v1.json +20 -0
  346. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.json +19 -0
  347. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.screening-report.json +628 -0
  348. package/dist/solver-types/solver-type.d.ts +8 -0
  349. package/dist/solver-types/swe-rebench-v2-auto.d.ts +20 -11
  350. package/dist/solver-types/swe-rebench-v2-auto.js +64 -19
  351. package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
  352. package/dist/solver-types/swe-rebench-v2.d.ts +10 -2
  353. package/dist/solver-types/swe-rebench-v2.js +233 -13
  354. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  355. package/dist/solvernets/daemon-init.d.ts +1 -1
  356. package/dist/solvernets/daemon-init.js +19 -4
  357. package/dist/solvernets/daemon-init.js.map +1 -1
  358. package/dist/solvernets/launched-record-dispatcher.d.ts +7 -0
  359. package/dist/solvernets/launched-record-dispatcher.js +10 -4
  360. package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
  361. package/dist/solvernets/registry-client-erc8004.js +40 -37
  362. package/dist/solvernets/registry-client-erc8004.js.map +1 -1
  363. package/dist/solvernets/registry-client.d.ts +6 -0
  364. package/dist/solvernets/store.d.ts +2 -2
  365. package/dist/solvernets/store.js +7 -2
  366. package/dist/solvernets/store.js.map +1 -1
  367. package/dist/spend/ai-units-config.d.ts +49 -0
  368. package/dist/spend/ai-units-config.js +34 -0
  369. package/dist/spend/ai-units-config.js.map +1 -0
  370. package/dist/spend/ai-units.d.ts +140 -0
  371. package/dist/spend/ai-units.js +229 -0
  372. package/dist/spend/ai-units.js.map +1 -0
  373. package/dist/spend/cost-surface-status.d.ts +12 -0
  374. package/dist/spend/cost-surface-status.js +24 -0
  375. package/dist/spend/cost-surface-status.js.map +1 -0
  376. package/dist/spend/credential.d.ts +39 -0
  377. package/dist/spend/credential.js +71 -0
  378. package/dist/spend/credential.js.map +1 -0
  379. package/dist/spend/daemon-config.d.ts +13 -0
  380. package/dist/spend/daemon-config.js +24 -0
  381. package/dist/spend/daemon-config.js.map +1 -0
  382. package/dist/spend/pricing.d.ts +16 -0
  383. package/dist/spend/pricing.js +26 -0
  384. package/dist/spend/pricing.js.map +1 -0
  385. package/dist/spend/record.d.ts +13 -0
  386. package/dist/spend/record.js +43 -0
  387. package/dist/spend/record.js.map +1 -0
  388. package/dist/spend/usage.d.ts +27 -0
  389. package/dist/spend/usage.js +113 -0
  390. package/dist/spend/usage.js.map +1 -0
  391. package/dist/store/store.d.ts +187 -0
  392. package/dist/store/store.js +467 -4
  393. package/dist/store/store.js.map +1 -1
  394. package/dist/trajectory/transcript-parsers/codex-session.d.ts +12 -6
  395. package/dist/trajectory/transcript-parsers/codex-session.js +114 -13
  396. package/dist/trajectory/transcript-parsers/codex-session.js.map +1 -1
  397. package/dist/trajectory/transcript-parsers/types.d.ts +8 -8
  398. package/dist/trajectory/transcript-session-dirs.d.ts +18 -0
  399. package/dist/trajectory/transcript-session-dirs.js +85 -0
  400. package/dist/trajectory/transcript-session-dirs.js.map +1 -0
  401. package/dist/trajectory/transcript-watcher.d.ts +20 -1
  402. package/dist/trajectory/transcript-watcher.js +108 -32
  403. package/dist/trajectory/transcript-watcher.js.map +1 -1
  404. package/dist/tx-retry.d.ts +25 -0
  405. package/dist/tx-retry.js +95 -7
  406. package/dist/tx-retry.js.map +1 -1
  407. package/dist/types/payloads/portfolio-v0.d.ts +3 -3
  408. package/dist/types/payloads/prediction-apy-v0.d.ts +3 -3
  409. package/dist/types/payloads/prediction-v0.d.ts +12 -12
  410. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +108 -1
  411. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +25 -1
  412. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.d.ts +65 -0
  413. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.js +123 -0
  414. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.d.ts +2 -2
  415. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js +1 -1
  416. package/dist/vendor/@jinn-network/sdk/package.json +4 -0
  417. package/docker-compose.yml +3 -2
  418. package/package.json +30 -18
  419. package/plugins/learner/.claude-plugin/plugin.json +1 -1
  420. package/plugins/learner/.codex-plugin/plugin.json +1 -1
  421. package/plugins/learner/hooks/session-start +30 -1
  422. package/plugins/learner/skills/learn/consolidator-prompt.md +22 -1
  423. package/plugins/learner/skills/learn/promoter-prompt.md +72 -1
  424. package/plugins/swe-rebench-v2-diffmin/README.md +10 -9
  425. package/plugins/swe-rebench-v2-diffmin/jinn.plugin.json +1 -1
  426. package/plugins/swe-rebench-v2-diffmin/skills/diffmin/SKILL.md +15 -10
  427. package/plugins/swe-rebench-v2-diffmin/skills/test-map/SKILL.md +10 -12
  428. package/plugins/swe-rebench-v2-runtime/.claude-plugin/plugin.json +1 -1
  429. package/plugins/swe-rebench-v2-runtime/.codex-plugin/plugin.json +3 -3
  430. package/plugins/swe-rebench-v2-runtime/README.md +6 -6
  431. package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
  432. package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
  433. package/plugins/swe-rebench-v2-runtime/jinn.plugin.json +2 -3
  434. package/plugins/swe-rebench-v2-runtime/skills/task/SKILL.md +81 -0
  435. package/dist/dashboard/assets/index-BUlE8F3Y.js +0 -330
  436. package/dist/dashboard/assets/index-blqc7eqq.css +0 -32
  437. package/plugins/swe-rebench-v2-runtime/skills/orient/SKILL.md +0 -29
  438. package/plugins/swe-rebench-v2-runtime/skills/plan/SKILL.md +0 -53
@@ -1,4 +1,4 @@
1
- import { DiscoveryUnavailableError } from './types.js';
1
+ import { DiscoveryUnavailableError, TASK_POST_WINDOW_BLOCKS, bucketTaskPostCounts } from './types.js';
2
2
  import { manifestDigestForCid } from '../adapters/mech/digest.js';
3
3
  // ── GraphQL query strings ─────────────────────────────────────────────────────
4
4
  /**
@@ -68,6 +68,8 @@ const ATTEMPTS_PAGE_LIMIT = 1000;
68
68
  * the resulting count is a lower bound; see `getSolverNetOperatorCount`.
69
69
  */
70
70
  const MAX_OPERATOR_COUNT_TASK_PAGES = 50;
71
+ /** Page cap for the task-post-rate scan (1000 rows/page → 50k recent tasks). */
72
+ const MAX_TASK_POST_PAGES = 50;
71
73
  const ATTEMPTS_FOR_TASKS_QUERY = `
72
74
  query AttemptsForTasks($taskIds: [String!]!, $chainId: Int!, $limit: Int!, $after: String) {
73
75
  attempts(
@@ -97,6 +99,43 @@ query AttemptsForTasks($taskIds: [String!]!, $chainId: Int!, $limit: Int!, $afte
97
99
  // scalar variables into a literal `where: { ... }` block is a bug.
98
100
  const LIST_SOLVER_NETS_QUERY = `
99
101
  query ListSolverNets($where: solverNetManifestFilter, $limit: Int!) {
102
+ solverNetManifests(
103
+ where: $where,
104
+ limit: $limit,
105
+ orderBy: "anchorBlock",
106
+ orderDirection: "desc"
107
+ ) {
108
+ items {
109
+ id
110
+ launcherAgentId
111
+ status
112
+ statusUpdatedAt
113
+ manifestHash
114
+ anchorBlock
115
+ chainId
116
+ name
117
+ network
118
+ solutionPriceWei
119
+ verdictPriceWei
120
+ openRoles
121
+ launcherSafeAddress
122
+ contractId
123
+ contractVersion
124
+ solverNetId
125
+ manifestEnrichmentStatus
126
+ }
127
+ }
128
+ }
129
+ `;
130
+ // Legacy selection for the backward-compat degrade path (issue #985): the
131
+ // pre-enrichment field set, safe against an OLD indexer that lacks the
132
+ // enriched columns. The projection fills sentinels for the missing fields and
133
+ // leaves manifestEnrichmentStatus undefined → treated as not-ok → sentinels.
134
+ // These rows surface unenriched on the LIST path (empty name, '0' prices, zero
135
+ // address); they are not re-enriched anywhere — full fields require an indexer
136
+ // that persists the enriched columns, or the hash-verified getManifest detail path.
137
+ const LIST_SOLVER_NETS_QUERY_LEGACY = `
138
+ query ListSolverNetsLegacy($where: solverNetManifestFilter, $limit: Int!) {
100
139
  solverNetManifests(
101
140
  where: $where,
102
141
  limit: $limit,
@@ -181,6 +220,126 @@ query OperatorCountAttempts($taskIds: [String!]!, $chainId: Int!, $limit: Int!,
181
220
  }
182
221
  }
183
222
  `;
223
+ /**
224
+ * Paginated read of verdictEnvelopeMeta rows for swe-rebench-v2 successes,
225
+ * scoped to a single SolverNet via `solverNetManifestCid` so multi-SolverNet
226
+ * operators with overlapping instance_id pools don't cross-tenant over-count
227
+ * (#669 Finding 2).
228
+ *
229
+ * Ponder's auto-GraphQL does not expose GROUP BY / count aggregations, so
230
+ * getInstanceSuccessCounts pages this query with the `after` cursor and
231
+ * groups client-side. Capped at 1000 per page (Ponder's upper bound on
232
+ * plural-query `limit`).
233
+ */
234
+ const INSTANCE_SUCCESS_COUNTS_QUERY = `
235
+ query InstanceSuccessCounts($solverNetManifestCid: String!, $limit: Int!, $after: String) {
236
+ verdictEnvelopeMetas(
237
+ where: {
238
+ solverNetManifestCid: $solverNetManifestCid,
239
+ solverType_starts_with: "swe-rebench-v2",
240
+ actualPassed: true,
241
+ enrichmentStatus: "ok",
242
+ instanceId_not: ""
243
+ },
244
+ limit: $limit,
245
+ after: $after,
246
+ orderBy: "enrichedAtBlock",
247
+ orderDirection: "asc"
248
+ ) {
249
+ items {
250
+ requestId
251
+ chainId
252
+ instanceId
253
+ }
254
+ pageInfo {
255
+ hasNextPage
256
+ endCursor
257
+ }
258
+ }
259
+ }
260
+ `;
261
+ /**
262
+ * Leg 1 of getInstanceClaimCounts (#802): page every task id + maxClaims for a
263
+ * SolverNet's manifestDigest. Leg 2 reuses ATTEMPTS_FOR_TASKS_QUERY to count
264
+ * attempts (= consumed slots) per task. Same two-leg shape as
265
+ * getSolverNetOperatorCount; the only delta is selecting maxClaims here.
266
+ */
267
+ const CLAIM_COUNT_TASKS_QUERY = `
268
+ query ClaimCountTasks($manifestDigest: String!, $limit: Int!, $after: String) {
269
+ tasks(
270
+ where: { manifestDigest: $manifestDigest },
271
+ limit: $limit,
272
+ after: $after,
273
+ orderBy: "id",
274
+ orderDirection: "asc"
275
+ ) {
276
+ items {
277
+ id
278
+ maxClaims
279
+ chainId
280
+ }
281
+ pageInfo {
282
+ hasNextPage
283
+ endCursor
284
+ }
285
+ }
286
+ }
287
+ `;
288
+ /**
289
+ * Task-post-rate query (#918). Pages the most-recent tasks ordered by
290
+ * createdAtBlock desc; the daemon reads the top row's block as the window head
291
+ * and buckets the three windows (1h / 6h / 24h) AND the per-cid totals
292
+ * client-side from createdAtBlock + manifestDigest.
293
+ *
294
+ * We do NOT push a `manifestDigest_in` / `createdAtBlock_gte` filter into the
295
+ * query: `manifestDigest_in` is not a stable Ponder filter operator across all
296
+ * deploys, and the chain-wide total needs every recent task anyway. A
297
+ * client-side scan-then-bucket over the most-recent N pages is the portable
298
+ * shape. `windowEndBlock` for the HTTP backing is the indexer's latest indexed
299
+ * task block (the top row), not the chain head.
300
+ */
301
+ const TASK_POST_COUNTS_QUERY = `
302
+ query TaskPostCounts($limit: Int!, $after: String) {
303
+ tasks(
304
+ limit: $limit,
305
+ after: $after,
306
+ orderBy: "createdAtBlock",
307
+ orderDirection: "desc"
308
+ ) {
309
+ items {
310
+ id
311
+ manifestDigest
312
+ createdAtBlock
313
+ }
314
+ pageInfo {
315
+ hasNextPage
316
+ endCursor
317
+ }
318
+ }
319
+ }
320
+ `;
321
+ /**
322
+ * Most-recent task for a SolverNet (#957). Filters the `task` table by
323
+ * `manifestDigest = keccak256(manifestCid)` (the same digest join the other
324
+ * task queries use), orders newest-first by `createdAtBlock`, limit 1. Returns
325
+ * the row's `taskCidDigest` + `id` so the caller can reconstruct the IPFS task
326
+ * CID and read its eligibility ref.
327
+ */
328
+ const MOST_RECENT_TASK_QUERY = `
329
+ query MostRecentTask($manifestDigest: String!) {
330
+ tasks(
331
+ where: { manifestDigest: $manifestDigest },
332
+ limit: 1,
333
+ orderBy: "createdAtBlock",
334
+ orderDirection: "desc"
335
+ ) {
336
+ items {
337
+ id
338
+ taskCidDigest
339
+ }
340
+ }
341
+ }
342
+ `;
184
343
  const QUERY_ENVELOPES_QUERY = `
185
344
  query QueryEnvelopes($where: envelopeFilter, $limit: Int!) {
186
345
  envelopes(
@@ -199,6 +358,67 @@ query QueryEnvelopes($where: envelopeFilter, $limit: Int!) {
199
358
  }
200
359
  }
201
360
  `;
361
+ /** Sentinel for an unenriched / unknown launcher safe address. */
362
+ const ZERO_ADDR = '0x0000000000000000000000000000000000000000';
363
+ /** Coerce an indexer-supplied address to a typed hex, or fall back to the zero sentinel. */
364
+ function safeAddr(a) {
365
+ return typeof a === 'string' && /^0x[0-9a-fA-F]{40}$/.test(a) ? a : ZERO_ADDR;
366
+ }
367
+ // ── Per-codeDigest reward aggregates (#764) ──────────────────────────────────
368
+ const CODEDIGEST_ATTEMPTS_QUERY = `
369
+ query CodeDigestAttempts($codeDigests: [String!]!, $limit: Int!, $after: String) {
370
+ attemptEnvelopeMetas(
371
+ where: { codeDigest_in: $codeDigests, mode: "train", enrichmentStatus: "ok" },
372
+ limit: $limit,
373
+ after: $after,
374
+ orderBy: "enrichedAtBlock",
375
+ orderDirection: "desc"
376
+ ) {
377
+ items { requestId chainId codeDigest }
378
+ pageInfo { hasNextPage endCursor }
379
+ }
380
+ }
381
+ `;
382
+ // The verdict leg is the only place per-SolverNet scoping is queryable: of the
383
+ // tables this method touches, only `verdictEnvelopeMeta` carries
384
+ // `solverNetManifestCid` (ponder.schema.ts:657 — written by the same IPFS
385
+ // task-body enrichment that resolves instanceId). `attemptEnvelopeMeta` has no
386
+ // SolverNet column. Aggregation (step 4) only counts requests that HAVE a
387
+ // verdict, so filtering the verdict leg correctly scopes the whole aggregate to
388
+ // the given SolverNet. The filter is emitted only when scoping is requested —
389
+ // Ponder treats a `null` `where` value as "IS NULL", not "skip the filter", so
390
+ // an unscoped call must omit the field entirely (#764).
391
+ function codeDigestVerdictsQuery(scopeBySolverNet) {
392
+ return `
393
+ query CodeDigestVerdicts($requestIds: [String!]!, $limit: Int!, $after: String${scopeBySolverNet ? ', $solverNetManifestCid: String!' : ''}) {
394
+ verdictEnvelopeMetas(
395
+ where: { requestId_in: $requestIds${scopeBySolverNet ? ', solverNetManifestCid: $solverNetManifestCid' : ''} },
396
+ limit: $limit,
397
+ after: $after,
398
+ orderBy: "requestId",
399
+ orderDirection: "asc"
400
+ ) {
401
+ items { requestId chainId actualPassed actualScore passedCount totalCount }
402
+ pageInfo { hasNextPage endCursor }
403
+ }
404
+ }
405
+ `;
406
+ }
407
+ // Optional operator scoping: restrict attempts to those the operator claimed.
408
+ const CODEDIGEST_OPERATOR_ATTEMPTS_QUERY = `
409
+ query CodeDigestOperatorAttempts($requestIds: [String!]!, $operator: String!, $limit: Int!, $after: String) {
410
+ attempts(
411
+ where: { requestId_in: $requestIds, operator: $operator },
412
+ limit: $limit,
413
+ after: $after,
414
+ orderBy: "createdAtBlock",
415
+ orderDirection: "asc"
416
+ ) {
417
+ items { requestId chainId }
418
+ pageInfo { hasNextPage endCursor }
419
+ }
420
+ }
421
+ `;
202
422
  // ── Plug-in publication queries (attd) ───────────────────────────────────────
203
423
  const LIST_PLUGIN_PUBLICATIONS_QUERY = `
204
424
  query ListPluginPublications($where: pluginPublicationFilter, $limit: Int!) {
@@ -248,6 +468,17 @@ query GetPluginScores($pluginCid: String!, $limit: Int!) {
248
468
  * a sync stall low without hammering the endpoint.
249
469
  */
250
470
  const READY_PROBE_TTL_MS = 20_000;
471
+ /**
472
+ * Per-request timeout for every indexer fetch (the `/ready` probe and all
473
+ * GraphQL POSTs). A healthy indexer answers in well under a second; 15s is
474
+ * generous headroom that still recovers quickly. Its purpose is to convert a
475
+ * never-settling fetch (half-open socket during an indexer redeploy) into a
476
+ * catchable `DiscoveryUnavailableError` so the discovery/generator/catalog
477
+ * loops skip the tick and retry on the next poll, rather than wedging forever
478
+ * with no self-recovery while the indexer-independent loops mask the outage
479
+ * (#1038).
480
+ */
481
+ const FETCH_TIMEOUT_MS = 15_000;
251
482
  // ── Helpers ───────────────────────────────────────────────────────────────────
252
483
  function parseOptionalNumber(value) {
253
484
  if (typeof value === 'number')
@@ -306,10 +537,20 @@ export function createHttpDiscoveryAPI(opts) {
306
537
  // Ponder's `/ready` lives at the host root, not under `/graphql`.
307
538
  const readyUrl = `${opts.url.replace(/\/graphql\/?$/, '').replace(/\/$/, '')}/ready`;
308
539
  const readyTtlMs = opts.readyProbeTtlMs ?? READY_PROBE_TTL_MS;
309
- const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
310
- if (!fetchImpl) {
540
+ const fetchTimeoutMs = opts.fetchTimeoutMs ?? FETCH_TIMEOUT_MS;
541
+ const baseFetch = opts.fetchImpl ?? globalThis.fetch;
542
+ if (!baseFetch) {
311
543
  throw new Error('No fetch implementation available; pass fetchImpl in options');
312
544
  }
545
+ // Bound every indexer fetch with an AbortSignal timeout. Without it, a single
546
+ // fetch against an indexer whose socket went half-open (e.g. mid-redeploy)
547
+ // never resolves or rejects — and since the fetch is unbounded, the awaiting
548
+ // discovery/generator/catalog loop wedges forever with no self-recovery,
549
+ // while the indexer-independent loops keep running and mask the outage
550
+ // on-chain (#1038). A timeout turns the hang into the same
551
+ // DiscoveryUnavailableError those loops already catch and retry. A caller
552
+ // that supplies its own signal keeps it.
553
+ const fetchImpl = (input, init) => baseFetch(input, { ...init, signal: init?.signal ?? AbortSignal.timeout(fetchTimeoutMs) });
313
554
  // ── /ready probe (memoized with a short TTL) ──────────────────────────────
314
555
  // Ponder serves GraphQL with 200 + stale/empty data while still catching up;
315
556
  // `/ready` returns non-200 until it is at realtime. The daemon's fallback
@@ -448,7 +689,10 @@ export function createHttpDiscoveryAPI(opts) {
448
689
  // by id ASC and pages are appended in page order), but sort defensively
449
690
  // so the round-robin always pulls the lowest unclaimed id from each CID
450
691
  // even if upstream ordering ever changes.
451
- bucket.sort((a, b) => Number(BigInt(a.taskId) - BigInt(b.taskId)));
692
+ bucket.sort((a, b) => {
693
+ const diff = BigInt(a.taskId) - BigInt(b.taskId);
694
+ return diff < 0n ? -1 : diff > 0n ? 1 : 0;
695
+ });
452
696
  buckets.push(bucket);
453
697
  }
454
698
  // Round-robin interleave across CID buckets: pull index 0 from each CID
@@ -477,26 +721,51 @@ export function createHttpDiscoveryAPI(opts) {
477
721
  where['status_in'] = args.status;
478
722
  if (args?.launcherAgentId)
479
723
  where['launcherAgentId'] = args.launcherAgentId;
480
- const data = await postGql(gqlUrl, fetchImpl, LIST_SOLVER_NETS_QUERY, { where, limit: 200 });
481
- return (data.solverNetManifests?.items ?? []).map((row) => ({
482
- manifestCid: row.id,
483
- // The 8 fields below are IPFS-only: not stored in the indexer. Populate
484
- // with the same sentinels used by OnchainDiscoveryAPI.listLaunchedSolverNets
485
- // in client/src/discovery/onchain.ts. Consumers enrich via IPFS fetch.
486
- solverNetId: row.id, // best-effort: cid as id
487
- name: '', // requires IPFS fetch
488
- network: '', // requires IPFS fetch
489
- launcherSafeAddress: '0x0000000000000000000000000000000000000000', // requires IPFS fetch
490
- contractId: '', // requires IPFS fetch
491
- contractVersion: '', // requires IPFS fetch
492
- solutionPriceWei: '0', // requires IPFS fetch
493
- verdictPriceWei: '0', // requires IPFS fetch
494
- openRoles: [], // requires IPFS fetch
495
- launcherAgentId: row.launcherAgentId,
496
- status: row.status ?? 'launched',
497
- statusUpdatedAt: row.statusUpdatedAt,
498
- anchorBlock: Number(row.anchorBlock),
499
- }));
724
+ let data;
725
+ try {
726
+ data = await postGql(gqlUrl, fetchImpl, LIST_SOLVER_NETS_QUERY, { where, limit: 200 });
727
+ }
728
+ catch (err) {
729
+ // Backward-compat degrade (issue #985): an OLD indexer that predates the
730
+ // enriched columns rejects the extended selection set with a GraphQL
731
+ // validation error. Mirror the getPluginScores degrade pattern: re-run
732
+ // the minimal legacy query and project sentinels, so a daemon on a new
733
+ // build still lists against an old indexer (consumers re-enrich via IPFS).
734
+ if (err instanceof Error && /Unknown type|Cannot query|Cannot query field/.test(err.message)) {
735
+ data = await postGql(gqlUrl, fetchImpl, LIST_SOLVER_NETS_QUERY_LEGACY, { where, limit: 200 });
736
+ }
737
+ else {
738
+ throw err;
739
+ }
740
+ }
741
+ return (data.solverNetManifests?.items ?? []).map((row) => {
742
+ // Only trust enriched fields when the indexer marked the row 'ok'. A
743
+ // pending/failed row (or an old indexer that omits the field) keeps the
744
+ // sentinel rather than presenting an empty-string price as a real value.
745
+ // On the LIST hot path these rows pass through unenriched (degraded but
746
+ // present — empty name, '0' prices, zero address); full fields arrive once
747
+ // indexer enrichment lands, or via the hash-verified getManifest detail path.
748
+ const enriched = row.manifestEnrichmentStatus === 'ok';
749
+ return {
750
+ manifestCid: row.id,
751
+ solverNetId: enriched && row.solverNetId ? row.solverNetId : row.id,
752
+ name: enriched ? (row.name ?? '') : '',
753
+ network: enriched ? (row.network ?? '') : '',
754
+ launcherSafeAddress: enriched ? safeAddr(row.launcherSafeAddress) : ZERO_ADDR,
755
+ contractId: enriched ? (row.contractId ?? '') : '',
756
+ contractVersion: enriched ? (row.contractVersion ?? '') : '',
757
+ solutionPriceWei: enriched ? (row.solutionPriceWei ?? '0') : '0',
758
+ verdictPriceWei: enriched ? (row.verdictPriceWei ?? '0') : '0',
759
+ openRoles: enriched
760
+ ? ((row.openRoles ?? []).filter((r) => r === 'solver' || r === 'evaluator'))
761
+ : [],
762
+ launcherAgentId: row.launcherAgentId,
763
+ status: row.status ?? 'launched',
764
+ statusUpdatedAt: row.statusUpdatedAt,
765
+ anchorBlock: Number(row.anchorBlock),
766
+ chainId: row.chainId,
767
+ };
768
+ });
500
769
  }
501
770
  // ── getLifecycleStatus ────────────────────────────────────────────────────
502
771
  async function getLifecycleStatus(manifestCid) {
@@ -672,6 +941,275 @@ export function createHttpDiscoveryAPI(opts) {
672
941
  });
673
942
  return plugins;
674
943
  }
944
+ // ── getInstanceSuccessCounts (#669) ────────────────────────────────────────
945
+ // Scoped to a single SolverNet via `verdictEnvelopeMeta.solverNetManifestCid`
946
+ // — the indexer enrichment writes this column from the task body's top-level
947
+ // `solverNetManifestCid` (task.v1 schema). Prevents multi-SolverNet operators
948
+ // with overlapping instance_id pools from cross-tenant over-counting
949
+ // (#669 Finding 2).
950
+ async function getInstanceSuccessCounts(args) {
951
+ await ensureReady();
952
+ // Defensive cap: 10 × 1000 rows. Expected ~125 successes per SolverNet
953
+ // (25 candidates × N_target_successes), so two orders of magnitude head.
954
+ const MAX_PAGES = 10;
955
+ const PAGE_LIMIT = 1000;
956
+ const counts = new Map();
957
+ const seen = new Set(); // (requestId|chainId) dedupe across pages
958
+ let cursor = null;
959
+ for (let page = 0; page < MAX_PAGES; page++) {
960
+ const data = await postGql(gqlUrl, fetchImpl, INSTANCE_SUCCESS_COUNTS_QUERY, { solverNetManifestCid: args.manifestCid, limit: PAGE_LIMIT, after: cursor });
961
+ const rows = data.verdictEnvelopeMetas?.items ?? [];
962
+ for (const row of rows) {
963
+ const key = `${row.requestId}|${row.chainId}`;
964
+ if (seen.has(key))
965
+ continue;
966
+ seen.add(key);
967
+ const id = row.instanceId;
968
+ if (!id)
969
+ continue;
970
+ counts.set(id, (counts.get(id) ?? 0) + 1);
971
+ }
972
+ const pageInfo = data.verdictEnvelopeMetas?.pageInfo;
973
+ if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
974
+ break;
975
+ cursor = pageInfo.endCursor;
976
+ }
977
+ return counts;
978
+ }
979
+ async function getCodeDigestRewards(args) {
980
+ if (args.codeDigests.length === 0)
981
+ return [];
982
+ await ensureReady();
983
+ const MAX_PAGES = 20;
984
+ const PAGE_LIMIT = 1000;
985
+ // Per-digest recency cap (#764 C1). CODEDIGEST_ATTEMPTS_QUERY orders by
986
+ // enrichedAtBlock desc, so attempt rows arrive newest-first. Ponder's
987
+ // GraphQL `limit` is global across all requested codeDigests, so the window
988
+ // MUST be enforced client-side per-digest — we keep only the first `window`
989
+ // rows seen for each codeDigest (i.e. the most recent). When undefined, no
990
+ // cap is applied (behaviour identical to before this change).
991
+ const windowCap = typeof args.window === 'number' && Number.isFinite(args.window) && args.window > 0
992
+ ? Math.floor(args.window)
993
+ : undefined;
994
+ // 1) Pull train-mode attempt-meta rows for the requested codeDigests,
995
+ // capped to the most-recent `window` per codeDigest when set.
996
+ const requestKeyToDigest = new Map(); // "requestId|chainId" -> codeDigest
997
+ const keptPerDigest = new Map(); // codeDigest -> rows kept
998
+ let cursor = null;
999
+ for (let page = 0; page < MAX_PAGES; page++) {
1000
+ const data = await postGql(gqlUrl, fetchImpl, CODEDIGEST_ATTEMPTS_QUERY, { codeDigests: args.codeDigests, limit: PAGE_LIMIT, after: cursor });
1001
+ for (const row of data.attemptEnvelopeMetas?.items ?? []) {
1002
+ if (windowCap !== undefined) {
1003
+ const kept = keptPerDigest.get(row.codeDigest) ?? 0;
1004
+ if (kept >= windowCap)
1005
+ continue; // already have the window's worth for this digest
1006
+ keptPerDigest.set(row.codeDigest, kept + 1);
1007
+ }
1008
+ requestKeyToDigest.set(`${row.requestId}|${row.chainId}`, row.codeDigest);
1009
+ }
1010
+ const pi = data.attemptEnvelopeMetas?.pageInfo;
1011
+ if (!pi?.hasNextPage || !pi.endCursor)
1012
+ break;
1013
+ // Short-circuit pagination once every requested digest has filled its
1014
+ // window — no need to keep paging history we'll discard.
1015
+ if (windowCap !== undefined &&
1016
+ args.codeDigests.every((d) => (keptPerDigest.get(d) ?? 0) >= windowCap))
1017
+ break;
1018
+ cursor = pi.endCursor;
1019
+ }
1020
+ if (requestKeyToDigest.size === 0)
1021
+ return [];
1022
+ const requestIds = [...new Set([...requestKeyToDigest.keys()].map((k) => k.split('|')[0]))];
1023
+ // 2) Optional operator scoping: keep only requests the operator claimed.
1024
+ let allowedKeys = null;
1025
+ if (args.operator) {
1026
+ allowedKeys = new Set();
1027
+ cursor = null;
1028
+ for (let page = 0; page < MAX_PAGES; page++) {
1029
+ const data = await postGql(gqlUrl, fetchImpl, CODEDIGEST_OPERATOR_ATTEMPTS_QUERY, { requestIds, operator: args.operator, limit: PAGE_LIMIT, after: cursor });
1030
+ for (const row of data.attempts?.items ?? [])
1031
+ allowedKeys.add(`${row.requestId}|${row.chainId}`);
1032
+ const pi = data.attempts?.pageInfo;
1033
+ if (!pi?.hasNextPage || !pi.endCursor)
1034
+ break;
1035
+ cursor = pi.endCursor;
1036
+ }
1037
+ }
1038
+ // 3) Pull verdict-meta rows for those requestIds (actualPassed/actualScore).
1039
+ // Optionally scope to a single SolverNet: verdictEnvelopeMeta is the only
1040
+ // queryable table carrying solverNetManifestCid, and only requests with a
1041
+ // verdict are aggregated (step 4), so filtering here scopes the aggregate.
1042
+ const scopeBySolverNet = typeof args.solverNetManifestCid === 'string' && args.solverNetManifestCid.length > 0;
1043
+ const verdictsQuery = codeDigestVerdictsQuery(scopeBySolverNet);
1044
+ const verdictByKey = new Map();
1045
+ cursor = null;
1046
+ for (let page = 0; page < MAX_PAGES; page++) {
1047
+ const variables = { requestIds, limit: PAGE_LIMIT, after: cursor };
1048
+ if (scopeBySolverNet)
1049
+ variables.solverNetManifestCid = args.solverNetManifestCid;
1050
+ const data = await postGql(gqlUrl, fetchImpl, verdictsQuery, variables);
1051
+ for (const row of data.verdictEnvelopeMetas?.items ?? []) {
1052
+ const key = `${row.requestId}|${row.chainId}`;
1053
+ const scoreNum = Number(row.actualScore);
1054
+ const pc = Number(row.passedCount);
1055
+ const tc = Number(row.totalCount);
1056
+ const graded = Number.isFinite(tc) && tc > 0 ? pc / tc : null;
1057
+ verdictByKey.set(key, {
1058
+ passed: Boolean(row.actualPassed),
1059
+ score: Number.isFinite(scoreNum) && row.actualScore !== '' ? scoreNum : null,
1060
+ graded,
1061
+ });
1062
+ }
1063
+ const pi = data.verdictEnvelopeMetas?.pageInfo;
1064
+ if (!pi?.hasNextPage || !pi.endCursor)
1065
+ break;
1066
+ cursor = pi.endCursor;
1067
+ }
1068
+ // 4) Aggregate per codeDigest (only requests that HAVE a verdict count).
1069
+ const agg = new Map();
1070
+ for (const [key, digest] of requestKeyToDigest) {
1071
+ if (allowedKeys && !allowedKeys.has(key))
1072
+ continue;
1073
+ const v = verdictByKey.get(key);
1074
+ if (!v)
1075
+ continue; // no verdict yet — not a completed attempt
1076
+ const cur = agg.get(digest) ?? { attempts: 0, passes: 0, scoreSum: 0, scoreN: 0, gradedScores: [] };
1077
+ cur.attempts += 1;
1078
+ if (v.passed)
1079
+ cur.passes += 1;
1080
+ if (v.score !== null) {
1081
+ cur.scoreSum += v.score;
1082
+ cur.scoreN += 1;
1083
+ }
1084
+ if (v.graded !== null)
1085
+ cur.gradedScores.push(v.graded);
1086
+ agg.set(digest, cur);
1087
+ }
1088
+ const rows = [];
1089
+ for (const [codeDigest, a] of agg) {
1090
+ rows.push({
1091
+ codeDigest,
1092
+ attempts: a.attempts,
1093
+ passes: a.passes,
1094
+ passRate: a.attempts > 0 ? a.passes / a.attempts : 0,
1095
+ avgScore: a.scoreN > 0 ? a.scoreSum / a.scoreN : 0,
1096
+ gradedScores: a.gradedScores,
1097
+ });
1098
+ }
1099
+ return rows;
1100
+ }
1101
+ // ── getInstanceClaimCounts (#802) ──────────────────────────────────────────
1102
+ // Per-task consumed-vs-maxClaims for a SolverNet. Two legs, mirroring
1103
+ // getSolverNetOperatorCount: leg 1 pages tasks (+ maxClaims) for the
1104
+ // manifestDigest; leg 2 pages attempts (consumed slots) batched by taskId_in.
1105
+ async function getInstanceClaimCounts(args) {
1106
+ await ensureReady();
1107
+ const manifestDigest = manifestDigestForCid(args.manifestCid).toLowerCase();
1108
+ // Leg 1: task ids + maxClaims for this SolverNet (single-chain → shared chainId).
1109
+ const maxClaimsByTaskId = new Map();
1110
+ const taskIds = [];
1111
+ let chainId;
1112
+ let taskCursor = null;
1113
+ for (let page = 0; page < MAX_OPERATOR_COUNT_TASK_PAGES; page++) {
1114
+ const data = await postGql(gqlUrl, fetchImpl, CLAIM_COUNT_TASKS_QUERY, { manifestDigest, limit: ATTEMPTS_PAGE_LIMIT, after: taskCursor });
1115
+ for (const row of data.tasks?.items ?? []) {
1116
+ taskIds.push(row.id);
1117
+ maxClaimsByTaskId.set(row.id, row.maxClaims);
1118
+ if (chainId === undefined)
1119
+ chainId = row.chainId;
1120
+ }
1121
+ const pageInfo = data.tasks?.pageInfo;
1122
+ if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
1123
+ break;
1124
+ taskCursor = pageInfo.endCursor;
1125
+ }
1126
+ if (taskIds.length === 0 || chainId === undefined) {
1127
+ return new Map();
1128
+ }
1129
+ // Leg 2: count attempts per taskId (= consumed slots), batched by taskId_in.
1130
+ const consumedByTaskId = new Map();
1131
+ let attemptCursor = null;
1132
+ for (;;) {
1133
+ const data = await postGql(gqlUrl, fetchImpl, ATTEMPTS_FOR_TASKS_QUERY, { taskIds, chainId, limit: ATTEMPTS_PAGE_LIMIT, after: attemptCursor });
1134
+ for (const a of data.attempts?.items ?? []) {
1135
+ consumedByTaskId.set(a.taskId, (consumedByTaskId.get(a.taskId) ?? 0) + 1);
1136
+ }
1137
+ const pageInfo = data.attempts?.pageInfo;
1138
+ if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
1139
+ break;
1140
+ attemptCursor = pageInfo.endCursor;
1141
+ }
1142
+ const out = new Map();
1143
+ for (const taskId of taskIds) {
1144
+ out.set(taskId, {
1145
+ taskId,
1146
+ consumed: consumedByTaskId.get(taskId) ?? 0,
1147
+ maxClaims: maxClaimsByTaskId.get(taskId) ?? 0,
1148
+ });
1149
+ }
1150
+ return out;
1151
+ }
1152
+ // ── getTaskPostCounts (#918) ───────────────────────────────────────────────
1153
+ // Page the most-recent tasks (createdAtBlock desc); the top row's block is the
1154
+ // window head. Bucket the three windows AND the per-cid totals client-side.
1155
+ // windowEndBlock here is the indexer's latest indexed task block, not the
1156
+ // chain head (the indexer is the source of truth on the HTTP path).
1157
+ async function getTaskPostCounts(args) {
1158
+ await ensureReady();
1159
+ const windowEndTs = Math.floor(Date.now() / 1000);
1160
+ const cids = Array.from(new Set((args?.manifestCids ?? []).filter(Boolean)));
1161
+ const cidByDigest = new Map();
1162
+ for (const cid of cids) {
1163
+ cidByDigest.set(manifestDigestForCid(cid).toLowerCase(), cid);
1164
+ }
1165
+ // Page createdAtBlock desc. The first row sets the window head; we stop
1166
+ // paging once a page's oldest row falls before the 24h cut (everything
1167
+ // beyond is outside every window).
1168
+ const rows = [];
1169
+ let head;
1170
+ let cursor = null;
1171
+ for (let page = 0; page < MAX_TASK_POST_PAGES; page++) {
1172
+ const data = await postGql(gqlUrl, fetchImpl, TASK_POST_COUNTS_QUERY, { limit: 1000, after: cursor });
1173
+ const items = data.tasks?.items ?? [];
1174
+ for (const row of items) {
1175
+ const block = Number(row.createdAtBlock);
1176
+ if (!Number.isFinite(block))
1177
+ continue;
1178
+ if (head === undefined)
1179
+ head = block;
1180
+ rows.push({ digest: (row.manifestDigest ?? '').toLowerCase(), block });
1181
+ }
1182
+ const pageInfo = data.tasks?.pageInfo;
1183
+ // Once the oldest row this page is past the 24h cut, no further page can
1184
+ // contribute (desc order) — stop early.
1185
+ if (head !== undefined && items.length > 0) {
1186
+ const oldest = Number(items[items.length - 1].createdAtBlock);
1187
+ if (Number.isFinite(oldest) && oldest < head - TASK_POST_WINDOW_BLOCKS.h24)
1188
+ break;
1189
+ }
1190
+ if (!pageInfo?.hasNextPage || !pageInfo.endCursor)
1191
+ break;
1192
+ cursor = pageInfo.endCursor;
1193
+ }
1194
+ const windowEndBlock = head ?? 0;
1195
+ const { chain, byCid } = bucketTaskPostCounts(windowEndBlock, windowEndTs, rows, cidByDigest);
1196
+ return { windowEndBlock, windowEndTs, chain, byCid };
1197
+ }
1198
+ // ── getMostRecentTaskCidDigest (#957) ──────────────────────────────────────
1199
+ // Single newest task (createdAtBlock desc, limit 1) for the SolverNet's
1200
+ // manifestDigest. Pure indexer read — no IPFS hop; the caller reconstructs the
1201
+ // task CID from the returned digest.
1202
+ async function getMostRecentTaskCidDigest(manifestCid) {
1203
+ await ensureReady();
1204
+ // The indexer keys tasks by `manifestDigest = keccak256(toBytes(cid))`, not
1205
+ // by the cid string — same join the other task queries use.
1206
+ const manifestDigest = manifestDigestForCid(manifestCid).toLowerCase();
1207
+ const data = await postGql(gqlUrl, fetchImpl, MOST_RECENT_TASK_QUERY, { manifestDigest });
1208
+ const row = data.tasks?.items?.[0];
1209
+ if (!row || !isHex(row.taskCidDigest))
1210
+ return undefined;
1211
+ return { taskCidDigest: row.taskCidDigest, taskId: row.id };
1212
+ }
675
1213
  return {
676
1214
  findClaimableTasks,
677
1215
  listLaunchedSolverNets,
@@ -681,6 +1219,11 @@ export function createHttpDiscoveryAPI(opts) {
681
1219
  listPluginPublications,
682
1220
  getPluginScores,
683
1221
  listBuilderArtifacts,
1222
+ getInstanceSuccessCounts,
1223
+ getCodeDigestRewards,
1224
+ getInstanceClaimCounts,
1225
+ getTaskPostCounts,
1226
+ getMostRecentTaskCidDigest,
684
1227
  };
685
1228
  }
686
1229
  //# sourceMappingURL=http.js.map