@jinn-network/client 0.1.8 → 0.1.9-canary.144d87d2

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 (397) hide show
  1. package/README.md +6 -0
  2. package/dist/adapters/mech/adapter.d.ts +21 -1
  3. package/dist/adapters/mech/adapter.js +77 -10
  4. package/dist/adapters/mech/adapter.js.map +1 -1
  5. package/dist/adapters/mech/contracts.js +62 -28
  6. package/dist/adapters/mech/contracts.js.map +1 -1
  7. package/dist/adapters/mech/safe-revert.d.ts +4 -0
  8. package/dist/adapters/mech/safe-revert.js +5 -1
  9. package/dist/adapters/mech/safe-revert.js.map +1 -1
  10. package/dist/adapters/mech/safe.js +5 -1
  11. package/dist/adapters/mech/safe.js.map +1 -1
  12. package/dist/adapters/mech/verdict-code.js +1 -1
  13. package/dist/adapters/mech/verdict-code.js.map +1 -1
  14. package/dist/api/bootstrap-endpoint.d.ts +1 -0
  15. package/dist/api/bootstrap-endpoint.js +1 -0
  16. package/dist/api/bootstrap-endpoint.js.map +1 -1
  17. package/dist/api/discovery-endpoint.d.ts +1 -0
  18. package/dist/api/discovery-endpoint.js +24 -0
  19. package/dist/api/discovery-endpoint.js.map +1 -1
  20. package/dist/api/fleet-build.d.ts +1 -7
  21. package/dist/api/fleet-build.js +0 -7
  22. package/dist/api/fleet-build.js.map +1 -1
  23. package/dist/api/gather-status.d.ts +8 -2
  24. package/dist/api/gather-status.js +29 -117
  25. package/dist/api/gather-status.js.map +1 -1
  26. package/dist/api/loop-completion-build.d.ts +79 -0
  27. package/dist/api/loop-completion-build.js +155 -0
  28. package/dist/api/loop-completion-build.js.map +1 -0
  29. package/dist/api/operator-artifacts-endpoint.js +1 -1
  30. package/dist/api/operator-artifacts-endpoint.js.map +1 -1
  31. package/dist/api/peers.js +2 -0
  32. package/dist/api/peers.js.map +1 -1
  33. package/dist/api/setup-endpoints.d.ts +32 -0
  34. package/dist/api/setup-endpoints.js +94 -24
  35. package/dist/api/setup-endpoints.js.map +1 -1
  36. package/dist/api/solvernets-endpoints.js +4 -1
  37. package/dist/api/solvernets-endpoints.js.map +1 -1
  38. package/dist/api/status-build.d.ts +43 -33
  39. package/dist/api/status-build.js +3 -26
  40. package/dist/api/status-build.js.map +1 -1
  41. package/dist/api/status-rollup-build.d.ts +0 -4
  42. package/dist/api/status-rollup-build.js +0 -4
  43. package/dist/api/status-rollup-build.js.map +1 -1
  44. package/dist/api/stop-hook.d.ts +1 -1
  45. package/dist/api/stop-hook.js +1 -1
  46. package/dist/api/stop-hook.js.map +1 -1
  47. package/dist/build-info.json +4 -4
  48. package/dist/build-meta.json +1 -1
  49. package/dist/cli/commands/codedigest-revert-check.js +6 -2
  50. package/dist/cli/commands/codedigest-revert-check.js.map +1 -1
  51. package/dist/cli/commands/doctor.d.ts +3 -0
  52. package/dist/cli/commands/doctor.js +37 -2
  53. package/dist/cli/commands/doctor.js.map +1 -1
  54. package/dist/cli/commands/eval.d.ts +87 -0
  55. package/dist/cli/commands/eval.js +481 -0
  56. package/dist/cli/commands/eval.js.map +1 -0
  57. package/dist/cli/commands/rewards.d.ts +2 -0
  58. package/dist/cli/commands/rewards.js +30 -3
  59. package/dist/cli/commands/rewards.js.map +1 -1
  60. package/dist/cli/commands/solver-nets.js +68 -0
  61. package/dist/cli/commands/solver-nets.js.map +1 -1
  62. package/dist/cli/commands/status.js +0 -1
  63. package/dist/cli/commands/status.js.map +1 -1
  64. package/dist/cli/index.js +2 -0
  65. package/dist/cli/index.js.map +1 -1
  66. package/dist/config.d.ts +102 -15
  67. package/dist/config.js +166 -19
  68. package/dist/config.js.map +1 -1
  69. package/dist/daemon/ai-units-gate.d.ts +6 -6
  70. package/dist/daemon/ai-units-gate.js +11 -10
  71. package/dist/daemon/ai-units-gate.js.map +1 -1
  72. package/dist/daemon/balance-topup-loop.js +3 -0
  73. package/dist/daemon/balance-topup-loop.js.map +1 -1
  74. package/dist/daemon/checkpoint-loop.js +2 -2
  75. package/dist/daemon/creator.d.ts +1 -0
  76. package/dist/daemon/creator.js +26 -14
  77. package/dist/daemon/creator.js.map +1 -1
  78. package/dist/daemon/daemon.d.ts +15 -0
  79. package/dist/daemon/daemon.js +78 -22
  80. package/dist/daemon/daemon.js.map +1 -1
  81. package/dist/daemon/eviction-loop.d.ts +7 -0
  82. package/dist/daemon/eviction-loop.js +19 -3
  83. package/dist/daemon/eviction-loop.js.map +1 -1
  84. package/dist/daemon/jinn-claim-loop.js +3 -0
  85. package/dist/daemon/jinn-claim-loop.js.map +1 -1
  86. package/dist/daemon/join-applier.d.ts +35 -0
  87. package/dist/daemon/join-applier.js +49 -0
  88. package/dist/daemon/join-applier.js.map +1 -0
  89. package/dist/daemon/loop-heartbeat.d.ts +34 -0
  90. package/dist/daemon/loop-heartbeat.js +39 -0
  91. package/dist/daemon/loop-heartbeat.js.map +1 -0
  92. package/dist/daemon/reward-claim-loop.js +4 -1
  93. package/dist/daemon/reward-claim-loop.js.map +1 -1
  94. package/dist/daemon/watchdog-loop.d.ts +84 -0
  95. package/dist/daemon/watchdog-loop.js +91 -0
  96. package/dist/daemon/watchdog-loop.js.map +1 -0
  97. package/dist/dashboard/assets/index-8tAiMbUV.css +1 -0
  98. package/dist/dashboard/assets/index-D6a-DfaM.js +171 -0
  99. package/dist/dashboard/index.html +2 -2
  100. package/dist/discovery/http.d.ts +17 -0
  101. package/dist/discovery/http.js +295 -25
  102. package/dist/discovery/http.js.map +1 -1
  103. package/dist/discovery/onchain.js +155 -1
  104. package/dist/discovery/onchain.js.map +1 -1
  105. package/dist/discovery/types.d.ts +106 -0
  106. package/dist/discovery/types.js +40 -0
  107. package/dist/discovery/types.js.map +1 -1
  108. package/dist/discovery/with-fallback.js +14 -0
  109. package/dist/discovery/with-fallback.js.map +1 -1
  110. package/dist/earning/bootstrap.d.ts +25 -0
  111. package/dist/earning/bootstrap.js +79 -28
  112. package/dist/earning/bootstrap.js.map +1 -1
  113. package/dist/earning/faucet.d.ts +1 -1
  114. package/dist/earning/faucet.js +2 -2
  115. package/dist/earning/faucet.js.map +1 -1
  116. package/dist/earning/safe-adapter.js +11 -0
  117. package/dist/earning/safe-adapter.js.map +1 -1
  118. package/dist/earning/stolas-claim.js +5 -5
  119. package/dist/earning/types.d.ts +1 -1
  120. package/dist/earning/types.js +1 -1
  121. package/dist/earning/types.js.map +1 -1
  122. package/dist/eval/eval-harness-run.d.ts +63 -0
  123. package/dist/eval/eval-harness-run.js +123 -0
  124. package/dist/eval/eval-harness-run.js.map +1 -0
  125. package/dist/eval/orchestrator.d.ts +224 -0
  126. package/dist/eval/orchestrator.js +250 -0
  127. package/dist/eval/orchestrator.js.map +1 -0
  128. package/dist/eval/paired.d.ts +68 -0
  129. package/dist/eval/paired.js +93 -0
  130. package/dist/eval/paired.js.map +1 -0
  131. package/dist/eval/resolve-slate-tasks.d.ts +35 -0
  132. package/dist/eval/resolve-slate-tasks.js +56 -0
  133. package/dist/eval/resolve-slate-tasks.js.map +1 -0
  134. package/dist/eval/screen-discovery.d.ts +22 -0
  135. package/dist/eval/screen-discovery.js +71 -0
  136. package/dist/eval/screen-discovery.js.map +1 -0
  137. package/dist/eval/screen-progress.d.ts +41 -0
  138. package/dist/eval/screen-progress.js +60 -0
  139. package/dist/eval/screen-progress.js.map +1 -0
  140. package/dist/eval/screen-runner.d.ts +30 -0
  141. package/dist/eval/screen-runner.js +289 -0
  142. package/dist/eval/screen-runner.js.map +1 -0
  143. package/dist/eval/screen.d.ts +107 -0
  144. package/dist/eval/screen.js +159 -0
  145. package/dist/eval/screen.js.map +1 -0
  146. package/dist/eval/slope.d.ts +29 -0
  147. package/dist/eval/slope.js +46 -0
  148. package/dist/eval/slope.js.map +1 -0
  149. package/dist/eval/train-sequence.d.ts +35 -0
  150. package/dist/eval/train-sequence.js +59 -0
  151. package/dist/eval/train-sequence.js.map +1 -0
  152. package/dist/eval/wilson.d.ts +45 -0
  153. package/dist/eval/wilson.js +48 -0
  154. package/dist/eval/wilson.js.map +1 -0
  155. package/dist/events/types.d.ts +1 -1
  156. package/dist/events/types.js +1 -1
  157. package/dist/events/types.js.map +1 -1
  158. package/dist/harnesses/engine/canonical-json.js +5 -3
  159. package/dist/harnesses/engine/canonical-json.js.map +1 -1
  160. package/dist/harnesses/engine/engine.d.ts +24 -0
  161. package/dist/harnesses/engine/engine.js +72 -9
  162. package/dist/harnesses/engine/engine.js.map +1 -1
  163. package/dist/harnesses/engine/packaging.js +1 -1
  164. package/dist/harnesses/engine/packaging.js.map +1 -1
  165. package/dist/harnesses/engine/persistence.d.ts +17 -0
  166. package/dist/harnesses/engine/persistence.js +28 -0
  167. package/dist/harnesses/engine/persistence.js.map +1 -1
  168. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +1 -1
  169. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js +1 -1
  170. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -1
  171. package/dist/harnesses/impls/hermes-agent/adapter.d.ts +2 -0
  172. package/dist/harnesses/impls/hermes-agent/adapter.js +8 -5
  173. package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
  174. package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +1 -0
  175. package/dist/harnesses/impls/hermes-agent/bootstrap.js +6 -1
  176. package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
  177. package/dist/harnesses/impls/hermes-agent/harness.d.ts +17 -3
  178. package/dist/harnesses/impls/hermes-agent/harness.js +68 -5
  179. package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
  180. package/dist/harnesses/impls/index.d.ts +2 -0
  181. package/dist/harnesses/impls/index.js +9 -0
  182. package/dist/harnesses/impls/index.js.map +1 -1
  183. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.d.ts +34 -0
  184. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js +111 -0
  185. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js.map +1 -0
  186. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.d.ts +24 -0
  187. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js +19 -0
  188. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js.map +1 -0
  189. package/dist/harnesses/impls/jinn-repo-evaluator/harness.d.ts +64 -0
  190. package/dist/harnesses/impls/jinn-repo-evaluator/harness.js +125 -0
  191. package/dist/harnesses/impls/jinn-repo-evaluator/harness.js.map +1 -0
  192. package/dist/harnesses/impls/jinn-repo-evaluator/repro.d.ts +32 -0
  193. package/dist/harnesses/impls/jinn-repo-evaluator/repro.js +73 -0
  194. package/dist/harnesses/impls/jinn-repo-evaluator/repro.js.map +1 -0
  195. package/dist/harnesses/impls/learner/adapters/claude-code.js +5 -0
  196. package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
  197. package/dist/harnesses/impls/learner/harness.d.ts +17 -1
  198. package/dist/harnesses/impls/learner/harness.js +51 -1
  199. package/dist/harnesses/impls/learner/harness.js.map +1 -1
  200. package/dist/harnesses/impls/learner/harvest.d.ts +2 -0
  201. package/dist/harnesses/impls/learner/harvest.js +51 -1
  202. package/dist/harnesses/impls/learner/harvest.js.map +1 -1
  203. package/dist/harnesses/impls/learner/plugin-path.js +1 -0
  204. package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
  205. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +3 -1
  206. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
  207. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +2 -2
  208. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +3 -1
  209. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
  210. package/dist/harnesses/readiness-registry.d.ts +10 -0
  211. package/dist/harnesses/readiness-registry.js +13 -0
  212. package/dist/harnesses/readiness-registry.js.map +1 -1
  213. package/dist/harnesses/types.d.ts +14 -0
  214. package/dist/learner/revert-decision.d.ts +16 -1
  215. package/dist/learner/revert-decision.js +38 -18
  216. package/dist/learner/revert-decision.js.map +1 -1
  217. package/dist/learner/revert-stats.d.ts +14 -0
  218. package/dist/learner/revert-stats.js +42 -0
  219. package/dist/learner/revert-stats.js.map +1 -1
  220. package/dist/local-provider-url.d.ts +3 -0
  221. package/dist/local-provider-url.js +28 -0
  222. package/dist/local-provider-url.js.map +1 -0
  223. package/dist/main.js +94 -25
  224. package/dist/main.js.map +1 -1
  225. package/dist/mcp/operator-server.js +1 -1
  226. package/dist/mcp/operator-server.js.map +1 -1
  227. package/dist/mcp/server.js +1 -1
  228. package/dist/mcp/server.js.map +1 -1
  229. package/dist/plugins/learner/.claude-plugin/plugin.json +1 -1
  230. package/dist/plugins/learner/.codex-plugin/plugin.json +1 -1
  231. package/dist/plugins/learner/hooks/session-start +30 -1
  232. package/dist/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
  233. package/dist/preflight/deployment-readiness.d.ts +147 -0
  234. package/dist/preflight/deployment-readiness.js +366 -0
  235. package/dist/preflight/deployment-readiness.js.map +1 -0
  236. package/dist/preflight/pidfile-liveness.d.ts +7 -1
  237. package/dist/preflight/pidfile-liveness.js +14 -0
  238. package/dist/preflight/pidfile-liveness.js.map +1 -1
  239. package/dist/rpc/transport.d.ts +43 -5
  240. package/dist/rpc/transport.js +131 -30
  241. package/dist/rpc/transport.js.map +1 -1
  242. package/dist/scripts/swe-rebench-v2-seed-pool.json +2 -1
  243. package/dist/solver-nets/registry.d.ts +19 -0
  244. package/dist/solver-nets/registry.js +95 -66
  245. package/dist/solver-nets/registry.js.map +1 -1
  246. package/dist/solver-types/_jinn-repo-pool.d.ts +27 -0
  247. package/dist/solver-types/_jinn-repo-pool.js +27 -0
  248. package/dist/solver-types/_jinn-repo-pool.js.map +1 -0
  249. package/dist/solver-types/_swe-rebench-v2-held-out-slate.d.ts +76 -0
  250. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js +156 -0
  251. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js.map +1 -0
  252. package/dist/solver-types/_swe-rebench-v2-pool-recovery.d.ts +81 -0
  253. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js +116 -0
  254. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js.map +1 -0
  255. package/dist/solver-types/_swe-rebench-v2-state.d.ts +9 -0
  256. package/dist/solver-types/_swe-rebench-v2-state.js +14 -0
  257. package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
  258. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +30 -0
  259. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +40 -0
  260. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  261. package/dist/solver-types/index.js +2 -0
  262. package/dist/solver-types/index.js.map +1 -1
  263. package/dist/solver-types/jinn-repo-admit.d.ts +17 -0
  264. package/dist/solver-types/jinn-repo-admit.js +16 -0
  265. package/dist/solver-types/jinn-repo-admit.js.map +1 -0
  266. package/dist/solver-types/jinn-repo-auto.d.ts +60 -0
  267. package/dist/solver-types/jinn-repo-auto.js +163 -0
  268. package/dist/solver-types/jinn-repo-auto.js.map +1 -0
  269. package/dist/solver-types/jinn-repo-definition.d.ts +15 -0
  270. package/dist/solver-types/jinn-repo-definition.js +34 -0
  271. package/dist/solver-types/jinn-repo-definition.js.map +1 -0
  272. package/dist/solver-types/jinn-repo-extract.d.ts +16 -0
  273. package/dist/solver-types/jinn-repo-extract.js +32 -0
  274. package/dist/solver-types/jinn-repo-extract.js.map +1 -0
  275. package/dist/solver-types/jinn-repo.d.ts +21 -0
  276. package/dist/solver-types/jinn-repo.js +23 -0
  277. package/dist/solver-types/jinn-repo.js.map +1 -0
  278. package/dist/solver-types/learner-loop-test.js +1 -1
  279. package/dist/solver-types/learner-loop-test.js.map +1 -1
  280. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v1.json +20 -0
  281. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.json +19 -0
  282. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.screening-report.json +628 -0
  283. package/dist/solver-types/solver-type.d.ts +8 -0
  284. package/dist/solver-types/swe-rebench-v2.d.ts +2 -0
  285. package/dist/solver-types/swe-rebench-v2.js +115 -10
  286. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  287. package/dist/solvernets/launched-record-dispatcher.d.ts +5 -0
  288. package/dist/solvernets/launched-record-dispatcher.js +8 -1
  289. package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
  290. package/dist/solvernets/registry-client-erc8004.js +29 -37
  291. package/dist/solvernets/registry-client-erc8004.js.map +1 -1
  292. package/dist/solvernets/registry-client.d.ts +6 -0
  293. package/dist/solvernets/store.d.ts +1 -1
  294. package/dist/solvernets/store.js +8 -3
  295. package/dist/solvernets/store.js.map +1 -1
  296. package/dist/spend/ai-units-config.d.ts +10 -0
  297. package/dist/spend/ai-units-config.js +7 -1
  298. package/dist/spend/ai-units-config.js.map +1 -1
  299. package/dist/spend/ai-units.d.ts +51 -0
  300. package/dist/spend/ai-units.js +73 -0
  301. package/dist/spend/ai-units.js.map +1 -1
  302. package/dist/spend/record.js +12 -5
  303. package/dist/spend/record.js.map +1 -1
  304. package/dist/store/store.d.ts +91 -5
  305. package/dist/store/store.js +170 -7
  306. package/dist/store/store.js.map +1 -1
  307. package/dist/trajectory/harness-bundle-schema.d.ts +1 -1
  308. package/dist/trajectory/harness-bundle-schema.js +1 -1
  309. package/dist/trajectory/harness-bundle-schema.js.map +1 -1
  310. package/dist/trajectory/schema.d.ts +1 -1
  311. package/dist/trajectory/schema.js +1 -1
  312. package/dist/trajectory/schema.js.map +1 -1
  313. package/dist/trajectory/transcript-parsers/types.d.ts +1 -1
  314. package/dist/trajectory/transcript-parsers/types.js +1 -1
  315. package/dist/trajectory/transcript-parsers/types.js.map +1 -1
  316. package/dist/types/envelope.d.ts +1 -1
  317. package/dist/types/envelope.js +1 -1
  318. package/dist/types/envelope.js.map +1 -1
  319. package/dist/types/payloads/index.d.ts +1 -1
  320. package/dist/types/payloads/index.js +7 -1
  321. package/dist/types/payloads/index.js.map +1 -1
  322. package/dist/types/payloads/portfolio-v0.d.ts +1 -1
  323. package/dist/types/payloads/portfolio-v0.js +1 -1
  324. package/dist/types/payloads/portfolio-v0.js.map +1 -1
  325. package/dist/types/payloads/prediction-apy-v0.d.ts +1 -1
  326. package/dist/types/payloads/prediction-apy-v0.js +1 -1
  327. package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
  328. package/dist/types/payloads/prediction-v0.d.ts +1 -1
  329. package/dist/types/payloads/prediction-v0.js +1 -1
  330. package/dist/types/payloads/prediction-v0.js.map +1 -1
  331. package/dist/types/portfolio.d.ts +1 -1
  332. package/dist/types/portfolio.js +1 -1
  333. package/dist/types/portfolio.js.map +1 -1
  334. package/dist/types/prediction-apy.d.ts +1 -1
  335. package/dist/types/prediction-apy.js +1 -1
  336. package/dist/types/prediction-apy.js.map +1 -1
  337. package/dist/types/prediction.d.ts +1 -1
  338. package/dist/types/prediction.js +1 -1
  339. package/dist/types/prediction.js.map +1 -1
  340. package/dist/types/session-provenance.d.ts +1 -1
  341. package/dist/types/session-provenance.js +1 -1
  342. package/dist/types/session-provenance.js.map +1 -1
  343. package/dist/types/task-document.d.ts +1 -1
  344. package/dist/types/task-document.js +1 -1
  345. package/dist/types/task-document.js.map +1 -1
  346. package/dist/types/task.d.ts +1 -1
  347. package/dist/types/task.js +1 -1
  348. package/dist/types/task.js.map +1 -1
  349. package/dist/types/window.d.ts +1 -1
  350. package/dist/types/window.js +1 -1
  351. package/dist/types/window.js.map +1 -1
  352. package/dist/vendor/@jinn-network/sdk/dist/checkpoint.d.ts +1 -1
  353. package/dist/vendor/@jinn-network/sdk/dist/checkpoint.js +1 -1
  354. package/dist/vendor/@jinn-network/sdk/dist/contracts.d.ts +3 -2
  355. package/dist/vendor/@jinn-network/sdk/dist/contracts.js +49 -0
  356. package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.d.ts +44 -0
  357. package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.js +25 -0
  358. package/dist/vendor/@jinn-network/sdk/dist/json-schema.d.ts +1 -1
  359. package/dist/vendor/@jinn-network/sdk/dist/json-schema.js +1 -1
  360. package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.d.ts +38 -0
  361. package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.js +22 -0
  362. package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +1 -1
  363. package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +1 -1
  364. package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.d.ts +1 -1
  365. package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.js +1 -1
  366. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +109 -2
  367. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +26 -2
  368. package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.d.ts +1 -1
  369. package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.js +1 -1
  370. package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.d.ts +4 -0
  371. package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.js +2 -0
  372. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +1 -1
  373. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -1
  374. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.d.ts +65 -0
  375. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.js +123 -0
  376. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.d.ts +2 -2
  377. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js +1 -1
  378. package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.d.ts +1 -1
  379. package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.js +1 -1
  380. package/dist/vendor/@jinn-network/sdk/package.json +9 -1
  381. package/docker-compose.yml +3 -2
  382. package/package.json +23 -20
  383. package/plugins/jinn-repo-runtime/.claude-plugin/plugin.json +5 -0
  384. package/plugins/jinn-repo-runtime/.codex-plugin/plugin.json +39 -0
  385. package/plugins/jinn-repo-runtime/README.md +27 -0
  386. package/plugins/jinn-repo-runtime/hooks/hooks.json +16 -0
  387. package/plugins/jinn-repo-runtime/hooks/session-start +73 -0
  388. package/plugins/jinn-repo-runtime/jinn.plugin.json +11 -0
  389. package/plugins/jinn-repo-runtime/skills/task/SKILL.md +92 -0
  390. package/plugins/learner/.claude-plugin/plugin.json +1 -1
  391. package/plugins/learner/.codex-plugin/plugin.json +1 -1
  392. package/plugins/learner/hooks/session-start +30 -1
  393. package/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
  394. package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
  395. package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
  396. package/dist/dashboard/assets/index-CzKxvMcU.css +0 -32
  397. package/dist/dashboard/assets/index-yVemxHot.js +0 -351
package/dist/config.d.ts CHANGED
@@ -13,7 +13,7 @@
13
13
  * Router claims: JINN_ROUTER_CLAIM_DELIVERY_VERSION=v1|v2 overrides chain default
14
14
  * (mainnet V1, testnet V2) for JinnRouter claimDelivery encoding.
15
15
  */
16
- import { z } from 'zod';
16
+ import { z } from 'zod/v3';
17
17
  import type { Task } from './types/task.js';
18
18
  export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
19
19
  /**
@@ -43,6 +43,18 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
43
43
  * Accepts string or array form (see rpcUrl). Env: JINN_L2_PROOF_RPC_URL.
44
44
  */
45
45
  l2ProofRpcUrl: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
46
+ /**
47
+ * Single volume-aware durable-state root. When set (env JINN_STATE_DIR or
48
+ * this file field), `earningDir`, `dbPath`, `engine.implStateDirRoot`, and
49
+ * the swe-rebench-v2 pool dir derive from it as `<stateDir>/<subdir>` —
50
+ * UNLESS each is individually overridden, in which case the per-key value
51
+ * wins (derive-don't-collapse). With `stateDir` unset, every default is
52
+ * byte-identical to the legacy `~/.jinn-client/<subdir>` paths. Hosted
53
+ * deploys collapse four ENV lines to one `JINN_STATE_DIR=/data`.
54
+ * `engine.workingDirRoot` is deliberately NOT derived — it stays ephemeral
55
+ * (reaped per-task).
56
+ */
57
+ stateDir: z.ZodOptional<z.ZodString>;
46
58
  /** Earning state directory */
47
59
  earningDir: z.ZodDefault<z.ZodString>;
48
60
  /** SQLite database path */
@@ -98,6 +110,8 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
98
110
  hermesModel: z.ZodOptional<z.ZodString>;
99
111
  /** Hermes provider (e.g. 'anthropic'). */
100
112
  hermesProvider: z.ZodOptional<z.ZodString>;
113
+ /** Local OpenAI-compatible Hermes base URL, e.g. http://127.0.0.1:11434/v1 for Ollama. */
114
+ hermesBaseUrl: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
101
115
  /**
102
116
  * Timeout in ms for `hermes doctor` health-check runs.
103
117
  * Default 30 000 ms. Env: JINN_HERMES_DOCTOR_TIMEOUT_MS.
@@ -157,16 +171,18 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
157
171
  * Narrow task discovery to specific on-chain task ids. This is primarily
158
172
  * for live acceptance gates that must avoid claiming unrelated public
159
173
  * backlog while proving one fresh task path.
174
+ * Env: JINN_TASK_DISCOVERY_ALLOWED_TASK_IDS (comma-separated).
160
175
  */
161
176
  taskDiscoveryAllowedTaskIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
162
177
  /**
163
- * Opt-in lower bound (L2 block number) for the mech adapter's canonical
164
- * on-chain TaskCreated backlog scan. Unset → the adapter's per-chain default
165
- * (DEFAULT_TASK_DISCOVERY_FROM_BLOCK) flows through (see gh #300). Set this to
166
- * a recent block to bound the scan to a small recent window so the indexer
167
- * (DiscoveryAPI.findClaimableTasks) carries the bulk of discovery the
168
- * canonical getLogs scan over a large/bloated history parses huge responses
169
- * on the main thread and can stall the event loop. Env: JINN_TASK_DISCOVERY_FROM_BLOCK.
178
+ * Explicit absolute lower bound (L2 block number) for the mech adapter's
179
+ * on-chain TaskCreated backlog scan. Unset → the scan defaults to a bounded
180
+ * rolling window (`head DEFAULT_ONCHAIN_SCAN_WINDOW_BLOCKS`, ~28h on Base),
181
+ * so a restart no longer replays full chain history every boot (#801); the
182
+ * indexer (DiscoveryAPI.findClaimableTasks) is the primary discovery path and
183
+ * the on-chain scan is a bounded backstop. Set this to widen the backstop to a
184
+ * specific block (the value pins both the scan start and the gh #300 admission
185
+ * floor). Env: JINN_TASK_DISCOVERY_FROM_BLOCK.
170
186
  */
171
187
  taskDiscoveryOnchainFromBlock: z.ZodOptional<z.ZodNumber>;
172
188
  /** This node's public HTTP endpoint (for 8004 registration) */
@@ -1008,6 +1024,13 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1008
1024
  * Env: JINN_CLAIM_LOOP_ENABLED=1|true|yes.
1009
1025
  */
1010
1026
  jinnClaimLoopEnabled: z.ZodDefault<z.ZodBoolean>;
1027
+ /**
1028
+ * Loop-watchdog auto-restart gate (#1043). Default OFF (the locked Option A
1029
+ * decision): the watchdog always detects a stale loop and loud-logs + emits
1030
+ * a `loop_watchdog_stale` event, but the non-zero process.exit recovery only
1031
+ * fires when this is on. Env: JINN_WATCHDOG_AUTO_RESTART=1|true|yes.
1032
+ */
1033
+ watchdogAutoRestart: z.ZodDefault<z.ZodBoolean>;
1011
1034
  /**
1012
1035
  * How often the daemon ticks the cross-chain JINN claim loop (ms). Default
1013
1036
  * 3 600 000 (1 hour) — well below mainnet challenge windows while
@@ -1171,6 +1194,18 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1171
1194
  plugins?: string[] | undefined;
1172
1195
  disabledDefaultPlugins?: string[] | undefined;
1173
1196
  }>>>;
1197
+ /**
1198
+ * Set true once the operator clicks "Enter dashboard" at the end of the
1199
+ * #983 guided onboarding takeover. Distinct from `joinedSolverNets` being
1200
+ * non-empty: a node can have a membership mid-onboarding (the first join
1201
+ * populates the map) yet not have finished harness/model selection. The SPA
1202
+ * gates the bootstrap→dashboard hand-off on this flag (see App.tsx), so the
1203
+ * first join no longer ejects the operator before the harness step.
1204
+ *
1205
+ * Written by POST /v1/operator/onboarding-complete (persisted to disk AND
1206
+ * mutated in-memory so GET /v1/bootstrap reflects it without a restart).
1207
+ */
1208
+ onboardingComplete: z.ZodOptional<z.ZodBoolean>;
1174
1209
  /**
1175
1210
  * Trusted ed25519 publishers for external harness impls. The daemon
1176
1211
  * refuses to load any external impl whose manifest signature is not
@@ -1445,6 +1480,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1445
1480
  jinnMessengerMode: "canonical" | "mock";
1446
1481
  jinnClaimSubmissionMode: "emit-only" | "submit";
1447
1482
  jinnClaimLoopEnabled: boolean;
1483
+ watchdogAutoRestart: boolean;
1448
1484
  jinnClaimLoopIntervalMs: number;
1449
1485
  stakingMode: "standard" | "self-bond";
1450
1486
  targetServices: number;
@@ -1466,10 +1502,12 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1466
1502
  rpcUrl?: string | string[] | undefined;
1467
1503
  archiveRpcUrl?: string | string[] | undefined;
1468
1504
  l2ProofRpcUrl?: string | string[] | undefined;
1505
+ stateDir?: string | undefined;
1469
1506
  apiBindHost?: string | undefined;
1470
1507
  hermesPath?: string | undefined;
1471
1508
  hermesModel?: string | undefined;
1472
1509
  hermesProvider?: string | undefined;
1510
+ hermesBaseUrl?: string | undefined;
1473
1511
  codexPath?: string | undefined;
1474
1512
  runtimeMode?: "bare" | "docker-compose" | "container" | undefined;
1475
1513
  discovery?: {
@@ -1517,6 +1555,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1517
1555
  } | undefined;
1518
1556
  model?: string | undefined;
1519
1557
  }> | undefined;
1558
+ onboardingComplete?: boolean | undefined;
1520
1559
  trustedImplSigners?: {
1521
1560
  publicKey: string;
1522
1561
  alg: "ed25519";
@@ -1542,6 +1581,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1542
1581
  rpcUrl?: string | string[] | undefined;
1543
1582
  archiveRpcUrl?: string | string[] | undefined;
1544
1583
  l2ProofRpcUrl?: string | string[] | undefined;
1584
+ stateDir?: string | undefined;
1545
1585
  earningDir?: string | undefined;
1546
1586
  dbPath?: string | undefined;
1547
1587
  pollIntervalMs?: number | undefined;
@@ -1556,6 +1596,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1556
1596
  hermesPath?: string | undefined;
1557
1597
  hermesModel?: string | undefined;
1558
1598
  hermesProvider?: string | undefined;
1599
+ hermesBaseUrl?: string | undefined;
1559
1600
  hermesDoctorTimeoutMs?: number | undefined;
1560
1601
  codexPath?: string | undefined;
1561
1602
  codexDoctorTimeoutMs?: number | undefined;
@@ -1696,6 +1737,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1696
1737
  jinnMessengerMode?: "canonical" | "mock" | undefined;
1697
1738
  jinnClaimSubmissionMode?: "emit-only" | "submit" | undefined;
1698
1739
  jinnClaimLoopEnabled?: boolean | undefined;
1740
+ watchdogAutoRestart?: boolean | undefined;
1699
1741
  jinnClaimLoopIntervalMs?: number | undefined;
1700
1742
  stakingMode?: "standard" | "self-bond" | undefined;
1701
1743
  targetServices?: number | undefined;
@@ -1729,6 +1771,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1729
1771
  plugins?: string[] | undefined;
1730
1772
  disabledDefaultPlugins?: string[] | undefined;
1731
1773
  }> | undefined;
1774
+ onboardingComplete?: boolean | undefined;
1732
1775
  trustedImplSigners?: {
1733
1776
  publicKey: string;
1734
1777
  alg: "ed25519";
@@ -1851,6 +1894,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1851
1894
  jinnMessengerMode: "canonical" | "mock";
1852
1895
  jinnClaimSubmissionMode: "emit-only" | "submit";
1853
1896
  jinnClaimLoopEnabled: boolean;
1897
+ watchdogAutoRestart: boolean;
1854
1898
  jinnClaimLoopIntervalMs: number;
1855
1899
  stakingMode: "standard" | "self-bond";
1856
1900
  targetServices: number;
@@ -1872,10 +1916,12 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1872
1916
  rpcUrl?: string | string[] | undefined;
1873
1917
  archiveRpcUrl?: string | string[] | undefined;
1874
1918
  l2ProofRpcUrl?: string | string[] | undefined;
1919
+ stateDir?: string | undefined;
1875
1920
  apiBindHost?: string | undefined;
1876
1921
  hermesPath?: string | undefined;
1877
1922
  hermesModel?: string | undefined;
1878
1923
  hermesProvider?: string | undefined;
1924
+ hermesBaseUrl?: string | undefined;
1879
1925
  codexPath?: string | undefined;
1880
1926
  runtimeMode?: "bare" | "docker-compose" | "container" | undefined;
1881
1927
  discovery?: {
@@ -1923,6 +1969,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1923
1969
  } | undefined;
1924
1970
  model?: string | undefined;
1925
1971
  }> | undefined;
1972
+ onboardingComplete?: boolean | undefined;
1926
1973
  trustedImplSigners?: {
1927
1974
  publicKey: string;
1928
1975
  alg: "ed25519";
@@ -1948,6 +1995,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1948
1995
  rpcUrl?: string | string[] | undefined;
1949
1996
  archiveRpcUrl?: string | string[] | undefined;
1950
1997
  l2ProofRpcUrl?: string | string[] | undefined;
1998
+ stateDir?: string | undefined;
1951
1999
  earningDir?: string | undefined;
1952
2000
  dbPath?: string | undefined;
1953
2001
  pollIntervalMs?: number | undefined;
@@ -1962,6 +2010,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
1962
2010
  hermesPath?: string | undefined;
1963
2011
  hermesModel?: string | undefined;
1964
2012
  hermesProvider?: string | undefined;
2013
+ hermesBaseUrl?: string | undefined;
1965
2014
  hermesDoctorTimeoutMs?: number | undefined;
1966
2015
  codexPath?: string | undefined;
1967
2016
  codexDoctorTimeoutMs?: number | undefined;
@@ -2102,6 +2151,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
2102
2151
  jinnMessengerMode?: "canonical" | "mock" | undefined;
2103
2152
  jinnClaimSubmissionMode?: "emit-only" | "submit" | undefined;
2104
2153
  jinnClaimLoopEnabled?: boolean | undefined;
2154
+ watchdogAutoRestart?: boolean | undefined;
2105
2155
  jinnClaimLoopIntervalMs?: number | undefined;
2106
2156
  stakingMode?: "standard" | "self-bond" | undefined;
2107
2157
  targetServices?: number | undefined;
@@ -2135,6 +2185,7 @@ export declare const JinnConfigSchema: z.ZodEffects<z.ZodObject<{
2135
2185
  plugins?: string[] | undefined;
2136
2186
  disabledDefaultPlugins?: string[] | undefined;
2137
2187
  }> | undefined;
2188
+ onboardingComplete?: boolean | undefined;
2138
2189
  trustedImplSigners?: {
2139
2190
  publicKey: string;
2140
2191
  alg: "ed25519";
@@ -2204,18 +2255,54 @@ export declare const DEFAULT_CONFIG_PATH: string;
2204
2255
  * historical sync — see ponder.config.ts).
2205
2256
  */
2206
2257
  export declare const DEFAULT_TESTNET_DISCOVERY_URL = "https://jinn-indexer-production.up.railway.app";
2207
- export declare const DEFAULT_TESTNET_ETHEREUM_RPC_URL = "https://ethereum-sepolia-rpc.publicnode.com";
2208
2258
  /**
2209
- * Default fallback chain for the L2 measurement chain (Base Sepolia) on
2210
- * testnet. Per AC2 of issue #592:
2211
- * slot 0 `https://base-sepolia.publicnode.com` (no-auth, 50k-block
2212
- * getLogs cap, no shared-quota cliff).
2213
- * slot 1 — `https://sepolia.base.org` (free public Coinbase endpoint,
2214
- * 2k-block cap; last-resort backup).
2259
+ * Default fallback chain for the L1 settlement chain (Ethereum Sepolia,
2260
+ * chain-id 11155111) on testnet. Per AC of issue #911 we ship ≥5 distinct
2261
+ * free providers so a default-config daemon survives single-provider quota
2262
+ * cliffs without an operator-supplied key:
2263
+ * slot 0 — `https://ethereum-sepolia-rpc.publicnode.com` (no-auth primary,
2264
+ * keeps the #835 no-shared-quota property symmetric with the L2 default).
2265
+ * slot 1 — `https://sepolia.drpc.org`
2266
+ * slot 2 — `https://1rpc.io/sepolia`
2267
+ * slot 3 — `https://sepolia.gateway.tenderly.co`
2268
+ * slot 4 — `https://rpc.sepolia.ethpandaops.io`
2269
+ * Operators may prepend a paid primary via `ethereumRpcUrl` / `JINN_ETHEREUM_RPC_URL`.
2270
+ * All five endpoints live-verified to return chain-id 11155111 (#911).
2271
+ */
2272
+ export declare const DEFAULT_TESTNET_ETHEREUM_RPC_URLS: readonly string[];
2273
+ /**
2274
+ * Default fallback chain for the L2 measurement chain (Base Sepolia, chain-id
2275
+ * 84532) on testnet. Originally a two-provider chain (AC2 of issue #592);
2276
+ * widened to ≥5 distinct free providers per issue #911 so a default-config
2277
+ * daemon tolerates a single-provider quota cliff (the Tenderly shared-quota
2278
+ * cliff of 2026-05-24) without an operator key.
2279
+ * slot 0 — `https://base-sepolia.publicnode.com` (#835 no-auth primary,
2280
+ * 50k-block getLogs cap, no shared-quota cliff).
2281
+ * slot 1 — `https://base-sepolia-rpc.publicnode.com`
2282
+ * slot 2 — `https://base-sepolia.drpc.org`
2283
+ * slot 3 — `https://base-sepolia.gateway.tenderly.co`
2284
+ * slot 4 — `https://sepolia.base.org` (free public Coinbase endpoint,
2285
+ * 2k-block cap; last-resort backup, stays last).
2215
2286
  * Operators are encouraged to prepend a paid primary key (Alchemy, Tenderly,
2216
2287
  * etc.) via `rpcUrl` config or `JINN_RPC_URL` / `BASE_SEPOLIA_RPC_URL` env.
2288
+ * All five endpoints live-verified to return chain-id 84532 (#911).
2217
2289
  */
2218
2290
  export declare const DEFAULT_TESTNET_RPC_URLS: readonly string[];
2291
+ /**
2292
+ * Default fallback chain for the L2 measurement chain (Base mainnet, chain-id
2293
+ * 8453). ≥5 distinct free providers per issue #911.
2294
+ * slot 0 — `https://mainnet.base.org` (free public Coinbase endpoint).
2295
+ */
2296
+ export declare const DEFAULT_MAINNET_RPC_URLS: readonly string[];
2297
+ /**
2298
+ * Default fallback chain for the L1 settlement chain (Ethereum mainnet,
2299
+ * chain-id 1). ≥5 distinct free providers per issue #911. NOTE: this is a
2300
+ * named, addressable default only — it is intentionally NOT wired into
2301
+ * `loadConfig`, because the daemon has no mainnet-L1 default path (Ethereum L1
2302
+ * defaulting is testnet-only; see the consumer below). It exists so the chain-1
2303
+ * AC is satisfied by an importable default operators / future code can adopt.
2304
+ */
2305
+ export declare const DEFAULT_MAINNET_ETHEREUM_RPC_URLS: readonly string[];
2219
2306
  export type ConfigLoadErrorCode = 'config_file_not_found' | 'config_json_invalid' | 'tasks_file_not_found' | 'tasks_json_invalid' | 'config_invalid';
2220
2307
  export declare class ConfigLoadError extends Error {
2221
2308
  readonly code: ConfigLoadErrorCode;
package/dist/config.js CHANGED
@@ -16,10 +16,11 @@
16
16
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
17
17
  import { homedir } from 'node:os';
18
18
  import { dirname, join } from 'node:path';
19
- import { z } from 'zod';
19
+ import { z } from 'zod/v3';
20
20
  import { TaskSchema, parseTask } from './types/task.js';
21
21
  import { canonicalHarnessName } from './harnesses/names.js';
22
22
  import { parseRpcUrls } from './rpc/transport.js';
23
+ import { canonicalLocalHttpBaseUrl } from './local-provider-url.js';
23
24
  // ── Schema ──────────────────────────────────────────────────────────────────
24
25
  const HarnessNameSchema = z.string().transform((name) => canonicalHarnessName(name));
25
26
  export const JinnConfigSchema = z.object({
@@ -50,6 +51,18 @@ export const JinnConfigSchema = z.object({
50
51
  * Accepts string or array form (see rpcUrl). Env: JINN_L2_PROOF_RPC_URL.
51
52
  */
52
53
  l2ProofRpcUrl: z.union([z.string(), z.array(z.string()).min(1)]).optional(),
54
+ /**
55
+ * Single volume-aware durable-state root. When set (env JINN_STATE_DIR or
56
+ * this file field), `earningDir`, `dbPath`, `engine.implStateDirRoot`, and
57
+ * the swe-rebench-v2 pool dir derive from it as `<stateDir>/<subdir>` —
58
+ * UNLESS each is individually overridden, in which case the per-key value
59
+ * wins (derive-don't-collapse). With `stateDir` unset, every default is
60
+ * byte-identical to the legacy `~/.jinn-client/<subdir>` paths. Hosted
61
+ * deploys collapse four ENV lines to one `JINN_STATE_DIR=/data`.
62
+ * `engine.workingDirRoot` is deliberately NOT derived — it stays ephemeral
63
+ * (reaped per-task).
64
+ */
65
+ stateDir: z.string().optional(),
53
66
  /** Earning state directory */
54
67
  earningDir: z.string().default(join(homedir(), '.jinn-client', 'earning')),
55
68
  /** SQLite database path */
@@ -105,6 +118,22 @@ export const JinnConfigSchema = z.object({
105
118
  hermesModel: z.string().optional(),
106
119
  /** Hermes provider (e.g. 'anthropic'). */
107
120
  hermesProvider: z.string().optional(),
121
+ /** Local OpenAI-compatible Hermes base URL, e.g. http://127.0.0.1:11434/v1 for Ollama. */
122
+ hermesBaseUrl: z
123
+ .string()
124
+ .url()
125
+ .transform((value, ctx) => {
126
+ const canonical = canonicalLocalHttpBaseUrl(value);
127
+ if (!canonical) {
128
+ ctx.addIssue({
129
+ code: z.ZodIssueCode.custom,
130
+ message: 'hermesBaseUrl must be a local HTTP(S) URL',
131
+ });
132
+ return z.NEVER;
133
+ }
134
+ return canonical;
135
+ })
136
+ .optional(),
108
137
  /**
109
138
  * Timeout in ms for `hermes doctor` health-check runs.
110
139
  * Default 30 000 ms. Env: JINN_HERMES_DOCTOR_TIMEOUT_MS.
@@ -161,16 +190,18 @@ export const JinnConfigSchema = z.object({
161
190
  * Narrow task discovery to specific on-chain task ids. This is primarily
162
191
  * for live acceptance gates that must avoid claiming unrelated public
163
192
  * backlog while proving one fresh task path.
193
+ * Env: JINN_TASK_DISCOVERY_ALLOWED_TASK_IDS (comma-separated).
164
194
  */
165
195
  taskDiscoveryAllowedTaskIds: z.array(z.string()).optional(),
166
196
  /**
167
- * Opt-in lower bound (L2 block number) for the mech adapter's canonical
168
- * on-chain TaskCreated backlog scan. Unset → the adapter's per-chain default
169
- * (DEFAULT_TASK_DISCOVERY_FROM_BLOCK) flows through (see gh #300). Set this to
170
- * a recent block to bound the scan to a small recent window so the indexer
171
- * (DiscoveryAPI.findClaimableTasks) carries the bulk of discovery the
172
- * canonical getLogs scan over a large/bloated history parses huge responses
173
- * on the main thread and can stall the event loop. Env: JINN_TASK_DISCOVERY_FROM_BLOCK.
197
+ * Explicit absolute lower bound (L2 block number) for the mech adapter's
198
+ * on-chain TaskCreated backlog scan. Unset → the scan defaults to a bounded
199
+ * rolling window (`head DEFAULT_ONCHAIN_SCAN_WINDOW_BLOCKS`, ~28h on Base),
200
+ * so a restart no longer replays full chain history every boot (#801); the
201
+ * indexer (DiscoveryAPI.findClaimableTasks) is the primary discovery path and
202
+ * the on-chain scan is a bounded backstop. Set this to widen the backstop to a
203
+ * specific block (the value pins both the scan start and the gh #300 admission
204
+ * floor). Env: JINN_TASK_DISCOVERY_FROM_BLOCK.
174
205
  */
175
206
  taskDiscoveryOnchainFromBlock: z.number().int().min(0).optional(),
176
207
  /** This node's public HTTP endpoint (for 8004 registration) */
@@ -275,6 +306,13 @@ export const JinnConfigSchema = z.object({
275
306
  * Env: JINN_CLAIM_LOOP_ENABLED=1|true|yes.
276
307
  */
277
308
  jinnClaimLoopEnabled: z.boolean().default(false),
309
+ /**
310
+ * Loop-watchdog auto-restart gate (#1043). Default OFF (the locked Option A
311
+ * decision): the watchdog always detects a stale loop and loud-logs + emits
312
+ * a `loop_watchdog_stale` event, but the non-zero process.exit recovery only
313
+ * fires when this is on. Env: JINN_WATCHDOG_AUTO_RESTART=1|true|yes.
314
+ */
315
+ watchdogAutoRestart: z.boolean().default(false),
278
316
  /**
279
317
  * How often the daemon ticks the cross-chain JINN claim loop (ms). Default
280
318
  * 3 600 000 (1 hour) — well below mainnet challenge windows while
@@ -397,6 +435,18 @@ export const JinnConfigSchema = z.object({
397
435
  disabledDefaultPlugins: z.array(z.string()).default([]),
398
436
  }))
399
437
  .optional(),
438
+ /**
439
+ * Set true once the operator clicks "Enter dashboard" at the end of the
440
+ * #983 guided onboarding takeover. Distinct from `joinedSolverNets` being
441
+ * non-empty: a node can have a membership mid-onboarding (the first join
442
+ * populates the map) yet not have finished harness/model selection. The SPA
443
+ * gates the bootstrap→dashboard hand-off on this flag (see App.tsx), so the
444
+ * first join no longer ejects the operator before the harness step.
445
+ *
446
+ * Written by POST /v1/operator/onboarding-complete (persisted to disk AND
447
+ * mutated in-memory so GET /v1/bootstrap reflects it without a restart).
448
+ */
449
+ onboardingComplete: z.boolean().optional(),
400
450
  /**
401
451
  * Trusted ed25519 publishers for external harness impls. The daemon
402
452
  * refuses to load any external impl whose manifest signature is not
@@ -570,21 +620,78 @@ export const DEFAULT_CONFIG_PATH = join(DEFAULT_DIR, 'config.json');
570
620
  * historical sync — see ponder.config.ts).
571
621
  */
572
622
  export const DEFAULT_TESTNET_DISCOVERY_URL = 'https://jinn-indexer-production.up.railway.app';
573
- export const DEFAULT_TESTNET_ETHEREUM_RPC_URL = 'https://ethereum-sepolia-rpc.publicnode.com';
574
623
  /**
575
- * Default fallback chain for the L2 measurement chain (Base Sepolia) on
576
- * testnet. Per AC2 of issue #592:
577
- * slot 0 `https://base-sepolia.publicnode.com` (no-auth, 50k-block
578
- * getLogs cap, no shared-quota cliff).
579
- * slot 1 — `https://sepolia.base.org` (free public Coinbase endpoint,
580
- * 2k-block cap; last-resort backup).
624
+ * Default fallback chain for the L1 settlement chain (Ethereum Sepolia,
625
+ * chain-id 11155111) on testnet. Per AC of issue #911 we ship ≥5 distinct
626
+ * free providers so a default-config daemon survives single-provider quota
627
+ * cliffs without an operator-supplied key:
628
+ * slot 0 — `https://ethereum-sepolia-rpc.publicnode.com` (no-auth primary,
629
+ * keeps the #835 no-shared-quota property symmetric with the L2 default).
630
+ * slot 1 — `https://sepolia.drpc.org`
631
+ * slot 2 — `https://1rpc.io/sepolia`
632
+ * slot 3 — `https://sepolia.gateway.tenderly.co`
633
+ * slot 4 — `https://rpc.sepolia.ethpandaops.io`
634
+ * Operators may prepend a paid primary via `ethereumRpcUrl` / `JINN_ETHEREUM_RPC_URL`.
635
+ * All five endpoints live-verified to return chain-id 11155111 (#911).
636
+ */
637
+ export const DEFAULT_TESTNET_ETHEREUM_RPC_URLS = [
638
+ 'https://ethereum-sepolia-rpc.publicnode.com',
639
+ 'https://sepolia.drpc.org',
640
+ 'https://1rpc.io/sepolia',
641
+ 'https://sepolia.gateway.tenderly.co',
642
+ 'https://rpc.sepolia.ethpandaops.io',
643
+ ];
644
+ /**
645
+ * Default fallback chain for the L2 measurement chain (Base Sepolia, chain-id
646
+ * 84532) on testnet. Originally a two-provider chain (AC2 of issue #592);
647
+ * widened to ≥5 distinct free providers per issue #911 so a default-config
648
+ * daemon tolerates a single-provider quota cliff (the Tenderly shared-quota
649
+ * cliff of 2026-05-24) without an operator key.
650
+ * slot 0 — `https://base-sepolia.publicnode.com` (#835 no-auth primary,
651
+ * 50k-block getLogs cap, no shared-quota cliff).
652
+ * slot 1 — `https://base-sepolia-rpc.publicnode.com`
653
+ * slot 2 — `https://base-sepolia.drpc.org`
654
+ * slot 3 — `https://base-sepolia.gateway.tenderly.co`
655
+ * slot 4 — `https://sepolia.base.org` (free public Coinbase endpoint,
656
+ * 2k-block cap; last-resort backup, stays last).
581
657
  * Operators are encouraged to prepend a paid primary key (Alchemy, Tenderly,
582
658
  * etc.) via `rpcUrl` config or `JINN_RPC_URL` / `BASE_SEPOLIA_RPC_URL` env.
659
+ * All five endpoints live-verified to return chain-id 84532 (#911).
583
660
  */
584
661
  export const DEFAULT_TESTNET_RPC_URLS = [
585
662
  'https://base-sepolia.publicnode.com',
663
+ 'https://base-sepolia-rpc.publicnode.com',
664
+ 'https://base-sepolia.drpc.org',
665
+ 'https://base-sepolia.gateway.tenderly.co',
586
666
  'https://sepolia.base.org',
587
667
  ];
668
+ /**
669
+ * Default fallback chain for the L2 measurement chain (Base mainnet, chain-id
670
+ * 8453). ≥5 distinct free providers per issue #911.
671
+ * slot 0 — `https://mainnet.base.org` (free public Coinbase endpoint).
672
+ */
673
+ export const DEFAULT_MAINNET_RPC_URLS = [
674
+ 'https://mainnet.base.org',
675
+ 'https://base.publicnode.com',
676
+ 'https://base.drpc.org',
677
+ 'https://1rpc.io/base',
678
+ 'https://base.meowrpc.com',
679
+ ];
680
+ /**
681
+ * Default fallback chain for the L1 settlement chain (Ethereum mainnet,
682
+ * chain-id 1). ≥5 distinct free providers per issue #911. NOTE: this is a
683
+ * named, addressable default only — it is intentionally NOT wired into
684
+ * `loadConfig`, because the daemon has no mainnet-L1 default path (Ethereum L1
685
+ * defaulting is testnet-only; see the consumer below). It exists so the chain-1
686
+ * AC is satisfied by an importable default operators / future code can adopt.
687
+ */
688
+ export const DEFAULT_MAINNET_ETHEREUM_RPC_URLS = [
689
+ 'https://ethereum-rpc.publicnode.com',
690
+ 'https://cloudflare-eth.com',
691
+ 'https://eth.merkle.io',
692
+ 'https://eth.drpc.org',
693
+ 'https://1rpc.io/eth',
694
+ ];
588
695
  export class ConfigLoadError extends Error {
589
696
  code;
590
697
  details;
@@ -736,6 +843,12 @@ export function loadConfig(configPath) {
736
843
  if (env['JINN_TASK_DISCOVERY_FROM_BLOCK'] !== undefined) {
737
844
  merged.taskDiscoveryOnchainFromBlock = Number.parseInt(env['JINN_TASK_DISCOVERY_FROM_BLOCK'], 10);
738
845
  }
846
+ if (env['JINN_TASK_DISCOVERY_ALLOWED_TASK_IDS'] !== undefined) {
847
+ merged.taskDiscoveryAllowedTaskIds = env['JINN_TASK_DISCOVERY_ALLOWED_TASK_IDS']
848
+ .split(',')
849
+ .map((id) => id.trim())
850
+ .filter(Boolean);
851
+ }
739
852
  if (env['JINN_API_PORT'])
740
853
  merged.apiPort = parseInt(env['JINN_API_PORT'], 10);
741
854
  if (env['JINN_API_BIND_HOST'])
@@ -750,6 +863,8 @@ export function loadConfig(configPath) {
750
863
  merged.hermesModel = env['JINN_HERMES_MODEL'];
751
864
  if (env['JINN_HERMES_PROVIDER'])
752
865
  merged.hermesProvider = env['JINN_HERMES_PROVIDER'];
866
+ if (env['JINN_HERMES_BASE_URL'])
867
+ merged.hermesBaseUrl = env['JINN_HERMES_BASE_URL'];
753
868
  if (env['JINN_HERMES_DOCTOR_TIMEOUT_MS']) {
754
869
  merged.hermesDoctorTimeoutMs = parseInt(env['JINN_HERMES_DOCTOR_TIMEOUT_MS'], 10);
755
870
  }
@@ -826,6 +941,10 @@ export function loadConfig(configPath) {
826
941
  const v = env['JINN_CLAIM_LOOP_ENABLED'].trim().toLowerCase();
827
942
  merged.jinnClaimLoopEnabled = v === '1' || v === 'true' || v === 'yes';
828
943
  }
944
+ if (env['JINN_WATCHDOG_AUTO_RESTART'] !== undefined) {
945
+ const v = env['JINN_WATCHDOG_AUTO_RESTART'].trim().toLowerCase();
946
+ merged.watchdogAutoRestart = v === '1' || v === 'true' || v === 'yes';
947
+ }
829
948
  if (env['JINN_CLAIM_LOOP_INTERVAL_MS'] !== undefined) {
830
949
  merged.jinnClaimLoopIntervalMs = parseInt(env['JINN_CLAIM_LOOP_INTERVAL_MS'], 10);
831
950
  }
@@ -920,6 +1039,28 @@ export function loadConfig(configPath) {
920
1039
  ...(env['JINN_ENGINE_IMPL_STATE_DIR_ROOT'] ? { implStateDirRoot: env['JINN_ENGINE_IMPL_STATE_DIR_ROOT'] } : {}),
921
1040
  };
922
1041
  }
1042
+ // JINN_STATE_DIR: single volume-aware root. Runs AFTER all per-key env
1043
+ // overrides above are applied into `merged` and BEFORE safeParse — so a
1044
+ // still-`undefined` per-key value means neither file nor env set it. Per-key
1045
+ // precedence: explicit (file or env, already in `merged`) > <stateDir>/<subdir>
1046
+ // > legacy default (filled by the schema / engine assembly when still absent).
1047
+ // workingDirRoot is deliberately NOT derived — it stays ephemeral.
1048
+ const stateDir = env['JINN_STATE_DIR']
1049
+ ?? (typeof merged['stateDir'] === 'string' ? merged['stateDir'] : undefined);
1050
+ if (stateDir) {
1051
+ merged['stateDir'] = stateDir;
1052
+ if (merged['earningDir'] === undefined)
1053
+ merged['earningDir'] = join(stateDir, 'earning');
1054
+ if (merged['dbPath'] === undefined)
1055
+ merged['dbPath'] = join(stateDir, 'jinn.db');
1056
+ const engineObj = (typeof merged['engine'] === 'object' && merged['engine'] !== null)
1057
+ ? merged['engine']
1058
+ : {};
1059
+ if (engineObj['implStateDirRoot'] === undefined) {
1060
+ engineObj['implStateDirRoot'] = join(stateDir, 'engine', 'impl-state');
1061
+ merged['engine'] = engineObj;
1062
+ }
1063
+ }
923
1064
  const resolvedNetwork = merged.network === 'testnet' ? 'testnet' : 'mainnet';
924
1065
  // Testnet default: point discovery at the privately-operated Ponder indexer
925
1066
  // (jinn-mono-280n.4), unless the operator has set their own `discovery` block.
@@ -952,7 +1093,7 @@ export function loadConfig(configPath) {
952
1093
  };
953
1094
  }
954
1095
  if (resolvedNetwork === 'testnet' && !merged.ethereumRpcUrl) {
955
- merged.ethereumRpcUrl = DEFAULT_TESTNET_ETHEREUM_RPC_URL;
1096
+ merged.ethereumRpcUrl = [...DEFAULT_TESTNET_ETHEREUM_RPC_URLS];
956
1097
  }
957
1098
  if (resolvedNetwork === 'testnet' && merged.jinnClaimLoopEnabled === undefined) {
958
1099
  merged.jinnClaimLoopEnabled = true;
@@ -1018,12 +1159,13 @@ export function loadConfig(configPath) {
1018
1159
  // shared-quota cliff of 2026-05-24 that took out every default-config
1019
1160
  // daemon at once). See #554 + the NetworkSection.tsx "shared RPC" panel for
1020
1161
  // the operator-facing pitch to bring their own key. The sibling Ethereum L1
1021
- // default (DEFAULT_TESTNET_ETHEREUM_RPC_URL above) is already publicnode —
1022
- // this keeps the two L1/L2 defaults symmetric.
1162
+ // default (DEFAULT_TESTNET_ETHEREUM_RPC_URLS above) is publicnode-headed
1163
+ // this keeps the two L1/L2 defaults symmetric. Both chains ship ≥5 free
1164
+ // providers per issue #911.
1023
1165
  const parsed = result.data;
1024
1166
  const defaultRpcUrls = parsed.network === 'testnet'
1025
1167
  ? DEFAULT_TESTNET_RPC_URLS
1026
- : ['https://mainnet.base.org'];
1168
+ : DEFAULT_MAINNET_RPC_URLS;
1027
1169
  const rpcUrlsResolved = parsed.rpcUrl !== undefined
1028
1170
  ? parseRpcUrls(parsed.rpcUrl)
1029
1171
  : [...defaultRpcUrls];
@@ -1103,6 +1245,7 @@ export function persistTopLevelConfigValue(key, value, configPath) {
1103
1245
  */
1104
1246
  const TRACKED_ENV_VARS = [
1105
1247
  'JINN_NETWORK',
1248
+ 'JINN_STATE_DIR',
1106
1249
  'JINN_EARNING_DIR',
1107
1250
  'JINN_DB_PATH',
1108
1251
  'JINN_POLL_INTERVAL_MS',
@@ -1116,12 +1259,14 @@ const TRACKED_ENV_VARS = [
1116
1259
  'JINN_HERMES_PATH',
1117
1260
  'JINN_HERMES_MODEL',
1118
1261
  'JINN_HERMES_PROVIDER',
1262
+ 'JINN_HERMES_BASE_URL',
1119
1263
  'JINN_HERMES_DOCTOR_TIMEOUT_MS',
1120
1264
  'JINN_RUNTIME_MODE',
1121
1265
  'JINN_PEERS',
1122
1266
  'JINN_DISCOVERY_MODE',
1123
1267
  'JINN_DISCOVERY_URL',
1124
1268
  'JINN_DISCOVERY_FALLBACK',
1269
+ 'JINN_TASK_DISCOVERY_ALLOWED_TASK_IDS',
1125
1270
  'JINN_NODE_ENDPOINT',
1126
1271
  'JINN_IPFS_REGISTRY_URL',
1127
1272
  'JINN_IPFS_GATEWAY_URL',
@@ -1141,6 +1286,7 @@ const TRACKED_ENV_VARS = [
1141
1286
  'JINN_CLAIM_SUBMISSION_MODE',
1142
1287
  'JINN_CLAIM_LOOP_ENABLED',
1143
1288
  'JINN_CLAIM_LOOP_INTERVAL_MS',
1289
+ 'JINN_WATCHDOG_AUTO_RESTART',
1144
1290
  'JINN_STAKING_MODE',
1145
1291
  'JINN_TARGET_SERVICES',
1146
1292
  'JINN_DEBUG',
@@ -1158,6 +1304,7 @@ const TRACKED_ENV_VARS = [
1158
1304
  'JINN_TASKS',
1159
1305
  'JINN_ENGINE_WORKING_DIR_ROOT',
1160
1306
  'JINN_ENGINE_IMPL_STATE_DIR_ROOT',
1307
+ 'JINN_SWE_REBENCH_V2_STATE_DIR',
1161
1308
  'JINN_OPERATOR_PUBLIC_ENDPOINT',
1162
1309
  'JINN_OPERATOR_DEFAULT_PRICE_USDC',
1163
1310
  'JINN_OPERATOR_DONATION_ENABLED',