@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
@@ -13,12 +13,17 @@
13
13
  * - recentAttemptsWindow: how many most-recent attempts per codeDigest the
14
14
  * aggregate is computed over. Overridable via implStateDir/policy.json
15
15
  * (`policy.revert.recentAttemptsWindow`), mirroring policy.maxNotesBytes.
16
+ * - gradedMinSamplesPerArm: minimum per-arm graded scores before the graded
17
+ * (Tier 2) sensitivity test runs. Below it, Tier 2 is skipped entirely.
18
+ * - gradedAlpha: significance threshold for the Mann-Whitney graded test.
16
19
  */
17
- import { twoProportionZTest } from './revert-stats.js';
20
+ import { twoProportionZTest, mannWhitneyU } from './revert-stats.js';
18
21
  export const DEFAULT_REVERT_POLICY = {
19
22
  minSamplesPerArm: 30,
20
23
  alpha: 0.05,
21
24
  recentAttemptsWindow: 200,
25
+ gradedMinSamplesPerArm: 10,
26
+ gradedAlpha: 0.05,
22
27
  };
23
28
  export function decideRevert(input, policy = DEFAULT_REVERT_POLICY) {
24
29
  const { withCommit, atParent } = input;
@@ -26,25 +31,40 @@ export function decideRevert(input, policy = DEFAULT_REVERT_POLICY) {
26
31
  withCommit: { codeDigest: withCommit.codeDigest, n: withCommit.attempts, passRate: withCommit.passRate },
27
32
  atParent: { codeDigest: atParent.codeDigest, n: atParent.attempts, passRate: atParent.passRate },
28
33
  };
29
- // Sample floor first a zero-attempt codeDigest is "insufficient_samples",
30
- // NOT pass-rate zero (a fresh promotion that has not run yet is not a regression).
31
- if (withCommit.attempts < policy.minSamplesPerArm || atParent.attempts < policy.minSamplesPerArm) {
32
- return { ...base, delta: withCommit.passRate - atParent.passRate, pValue: 1, significant: false, recommendRevert: false, reason: 'insufficient_samples' };
34
+ const mean = (xs) => (xs.length ? xs.reduce((s, v) => s + v, 0) / xs.length : 0);
35
+ const gradedReady = withCommit.gradedScores.length >= policy.gradedMinSamplesPerArm &&
36
+ atParent.gradedScores.length >= policy.gradedMinSamplesPerArm;
37
+ // gradedDelta is only meaningful when gradedReady; mean([]) === 0 is a sentinel otherwise.
38
+ const gradedDelta = gradedReady ? mean(withCommit.gradedScores) - mean(atParent.gradedScores) : 0;
39
+ // Tier 1 — binary objective.
40
+ const binaryUnderpowered = withCommit.attempts < policy.minSamplesPerArm || atParent.attempts < policy.minSamplesPerArm;
41
+ if (!binaryUnderpowered) {
42
+ const stats = twoProportionZTest({
43
+ passesA: withCommit.passes, totalA: withCommit.attempts,
44
+ passesB: atParent.passes, totalB: atParent.attempts,
45
+ });
46
+ const significant = stats.pValue < policy.alpha;
47
+ if (stats.delta >= 0) {
48
+ return { ...base, delta: stats.delta, pValue: stats.pValue, significant, recommendRevert: false, reason: 'no_regression' };
49
+ }
50
+ if (!significant) {
51
+ return { ...base, delta: stats.delta, pValue: stats.pValue, significant, recommendRevert: false, reason: 'not_significant' };
52
+ }
53
+ // Binary says significant regression. Confirmation guardrail: if graded
54
+ // data exists and DISAGREES (graded improved), hold rather than revert.
55
+ if (gradedReady && gradedDelta > 0) {
56
+ return { ...base, delta: stats.delta, pValue: stats.pValue, significant: true, recommendRevert: false, reason: 'binary_graded_disagree' };
57
+ }
58
+ return { ...base, delta: stats.delta, pValue: stats.pValue, significant: true, recommendRevert: true, reason: 'significant_regression' };
33
59
  }
34
- const stats = twoProportionZTest({
35
- passesA: withCommit.passes,
36
- totalA: withCommit.attempts,
37
- passesB: atParent.passes,
38
- totalB: atParent.attempts,
39
- });
40
- const significant = stats.pValue < policy.alpha;
41
- if (stats.delta >= 0) {
42
- return { ...base, delta: stats.delta, pValue: stats.pValue, significant, recommendRevert: false, reason: 'no_regression' };
60
+ // Tier 2 — graded sensitivity (only when binary is underpowered).
61
+ if (gradedReady) {
62
+ const mw = mannWhitneyU(withCommit.gradedScores, atParent.gradedScores);
63
+ if (mw.pValue < policy.gradedAlpha && gradedDelta < 0) {
64
+ return { ...base, delta: gradedDelta, pValue: mw.pValue, significant: true, recommendRevert: true, reason: 'graded_regression_provisional' };
65
+ }
43
66
  }
44
- if (!significant) {
45
- return { ...base, delta: stats.delta, pValue: stats.pValue, significant, recommendRevert: false, reason: 'not_significant' };
46
- }
47
- return { ...base, delta: stats.delta, pValue: stats.pValue, significant: true, recommendRevert: true, reason: 'significant_regression' };
67
+ return { ...base, delta: withCommit.passRate - atParent.passRate, pValue: 1, significant: false, recommendRevert: false, reason: 'insufficient_samples' };
48
68
  }
49
69
  /** Merge a partial policy (e.g. from implStateDir/policy.json) over the defaults. */
50
70
  export function resolveRevertPolicy(override) {
@@ -1 +1 @@
1
- {"version":3,"file":"revert-decision.js","sourceRoot":"","sources":["../../src/learner/revert-decision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAWvD,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,gBAAgB,EAAE,EAAE;IACpB,KAAK,EAAE,IAAI;IACX,oBAAoB,EAAE,GAAG;CAC1B,CAAC;AAiCF,MAAM,UAAU,YAAY,CAC1B,KAA0B,EAC1B,SAAuB,qBAAqB;IAE5C,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACvC,MAAM,IAAI,GAAG;QACX,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE;QACxG,QAAQ,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE;KACjG,CAAC;IAEF,4EAA4E;IAC5E,mFAAmF;IACnF,IAAI,UAAU,CAAC,QAAQ,GAAG,MAAM,CAAC,gBAAgB,IAAI,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACjG,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAC5J,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,OAAO,EAAE,UAAU,CAAC,MAAM;QAC1B,MAAM,EAAE,UAAU,CAAC,QAAQ;QAC3B,OAAO,EAAE,QAAQ,CAAC,MAAM;QACxB,MAAM,EAAE,QAAQ,CAAC,QAAQ;KAC1B,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;IAEhD,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAC7H,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC/H,CAAC;IACD,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;AAC3I,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,mBAAmB,CAAC,QAAgC;IAClE,OAAO,EAAE,GAAG,qBAAqB,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"revert-decision.js","sourceRoot":"","sources":["../../src/learner/revert-decision.ts"],"names":[],"mappings":"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"}
@@ -22,3 +22,17 @@ export interface TwoProportionResult {
22
22
  }
23
23
  /** Two-proportion z-test. Returns no-signal (z=0, p=1) if either total is 0. */
24
24
  export declare function twoProportionZTest(input: TwoProportionInput): TwoProportionResult;
25
+ export interface MannWhitneyResult {
26
+ /** U statistic for arm A. */
27
+ u: number;
28
+ /** Normal-approx z (sign matches "A − B": negative => A stochastically lower). */
29
+ z: number;
30
+ /** Two-sided p-value in [0, 1]; 1 when there is no signal or an arm is empty. */
31
+ pValue: number;
32
+ }
33
+ /**
34
+ * Mann-Whitney U (rank-sum) with tie correction and normal approximation.
35
+ * Rank-based per the design §3 — robust to the bounded/bimodal/miscalibrated
36
+ * graded-score distribution. No I/O. (#1019)
37
+ */
38
+ export declare function mannWhitneyU(a: number[], b: number[]): MannWhitneyResult;
@@ -41,4 +41,46 @@ function erf(x) {
41
41
  Math.exp(-x * x);
42
42
  return x >= 0 ? y : -y;
43
43
  }
44
+ /**
45
+ * Mann-Whitney U (rank-sum) with tie correction and normal approximation.
46
+ * Rank-based per the design §3 — robust to the bounded/bimodal/miscalibrated
47
+ * graded-score distribution. No I/O. (#1019)
48
+ */
49
+ export function mannWhitneyU(a, b) {
50
+ const nA = a.length;
51
+ const nB = b.length;
52
+ if (nA === 0 || nB === 0)
53
+ return { u: 0, z: 0, pValue: 1 };
54
+ const all = [...a.map((v) => ({ v, g: 0 })), ...b.map((v) => ({ v, g: 1 }))];
55
+ all.sort((x, y) => x.v - y.v);
56
+ // Average ranks (1-based), tie-aware.
57
+ const ranks = new Array(all.length).fill(0);
58
+ let i = 0;
59
+ let tieTerm = 0; // Σ (t³ − t) over tie groups, for the variance correction
60
+ while (i < all.length) {
61
+ let j = i;
62
+ while (j + 1 < all.length && all[j + 1].v === all[i].v)
63
+ j++;
64
+ const avgRank = (i + 1 + (j + 1)) / 2;
65
+ for (let k = i; k <= j; k++)
66
+ ranks[k] = avgRank;
67
+ const t = j - i + 1;
68
+ if (t > 1)
69
+ tieTerm += t * t * t - t;
70
+ i = j + 1;
71
+ }
72
+ let rankSumA = 0;
73
+ for (let k = 0; k < all.length; k++)
74
+ if (all[k].g === 0)
75
+ rankSumA += ranks[k];
76
+ const uA = rankSumA - (nA * (nA + 1)) / 2;
77
+ const n = nA + nB;
78
+ const meanU = (nA * nB) / 2;
79
+ const varU = (nA * nB / (n * (n - 1))) * ((n * n * n - n) / 12 - tieTerm / 12);
80
+ if (varU <= 0)
81
+ return { u: uA, z: 0, pValue: 1 };
82
+ const z = (uA - meanU) / Math.sqrt(varU);
83
+ const pValue = 2 * (1 - standardNormalCdf(Math.abs(z)));
84
+ return { u: uA, z, pValue };
85
+ }
44
86
  //# sourceMappingURL=revert-stats.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"revert-stats.js","sourceRoot":"","sources":["../../src/learner/revert-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACnD,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC;IAC5B,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC;IAC5B,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;IACtB,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACvD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACxE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACb,wDAAwD;QACxD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACpC,CAAC;IACD,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED,gFAAgF;AAChF,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,GAAG,CAAC,CAAS;IACpB,qDAAqD;IACrD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,GACL,CAAC;QACD,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC;YAC1E,WAAW,CAAC;YACZ,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"revert-stats.js","sourceRoot":"","sources":["../../src/learner/revert-stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function canonicalLocalHttpBaseUrl(value: string): string | undefined;
2
+ export declare function isLocalHttpBaseUrl(value: string): boolean;
3
+ export declare function urlAtBasePath(baseUrl: string, path: string): string;
@@ -0,0 +1,28 @@
1
+ import { isIP } from 'node:net';
2
+ export function canonicalLocalHttpBaseUrl(value) {
3
+ try {
4
+ const url = new URL(value);
5
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
6
+ return undefined;
7
+ if (url.username || url.password)
8
+ return undefined;
9
+ if (url.search || url.hash)
10
+ return undefined;
11
+ const hostname = url.hostname.toLowerCase();
12
+ const isLocal = hostname === 'localhost' ||
13
+ hostname === '[::1]' ||
14
+ hostname === '::1' ||
15
+ (isIP(hostname) === 4 && hostname.startsWith('127.'));
16
+ return isLocal ? url.toString() : undefined;
17
+ }
18
+ catch {
19
+ return undefined;
20
+ }
21
+ }
22
+ export function isLocalHttpBaseUrl(value) {
23
+ return canonicalLocalHttpBaseUrl(value) !== undefined;
24
+ }
25
+ export function urlAtBasePath(baseUrl, path) {
26
+ return new URL(path, baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`).toString();
27
+ }
28
+ //# sourceMappingURL=local-provider-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-provider-url.js","sourceRoot":"","sources":["../src/local-provider-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC5E,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QACnD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,OAAO,GACX,QAAQ,KAAK,WAAW;YACxB,QAAQ,KAAK,OAAO;YACpB,QAAQ,KAAK,KAAK;YAClB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,yBAAyB,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,IAAY;IACzD,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AACnF,CAAC"}
package/dist/main.js CHANGED
@@ -43,6 +43,8 @@ import { buildEnvelope, emitEnvelope } from './errors/envelope.js';
43
43
  import { clearBootstrapError, persistBootstrapError, } from './errors/persisted-bootstrap-error.js';
44
44
  import { emitStructured } from './events/emitter.js';
45
45
  import { applyPidfileLivenessGate } from './preflight/pidfile-liveness.js';
46
+ import { applyDeploymentReadinessGate } from './preflight/deployment-readiness.js';
47
+ import { detectAuthContext } from './preflight/claude-auth.js';
46
48
  import { FleetBootstrapper, recoverEvictedService as recoverEvictedServiceFn } from './earning/bootstrap.js';
47
49
  import { DEFAULT_TESTNET_ARTIFACTS, applyChainGasOverrides, getChainConfig, loadJinnMviConfig } from './earning/contracts.js';
48
50
  import { runLegacyAgentIdMigration } from './earning/migrate-agent-id.js';
@@ -60,7 +62,8 @@ import { createJinnPublicClient, createJinnWalletClient, createJinnL1PublicClien
60
62
  import { privateKeyToAccount } from 'viem/accounts';
61
63
  import { getAddress } from 'viem';
62
64
  import { DEFAULT_DISABLED_HARNESSES, DEFAULT_HARNESS, HarnessRegistry, } from './harnesses/engine/registry.js';
63
- import { joinedSolverNetsViewFromConfig } from './harnesses/engine/engine.js';
65
+ import { createMutableJoinedSolverNetsView } from './harnesses/engine/engine.js';
66
+ import { createJoinApplier } from './daemon/join-applier.js';
64
67
  import { buildHarnesses } from './harnesses/impls/index.js';
65
68
  import { loadExternalImpl } from './harnesses/external-impls/index.js';
66
69
  import { CLAUDE_CODE_HARNESS, CODEX_HARNESS, HERMES_AGENT_HARNESS, harnessStateDirName } from './harnesses/names.js';
@@ -858,6 +861,13 @@ export async function main() {
858
861
  // builder-artifacts. Holder ref lets the routes register eagerly and
859
862
  // start returning real data the moment main.ts assigns holder.current.
860
863
  const discoveryApiHolder = { current: undefined };
864
+ // #1037: same eager-register / late-populate pattern for the join applier.
865
+ // The join endpoint registers eagerly inside startApiServer; the applier is
866
+ // built only after the latest join-consuming subsystem (the engine view,
867
+ // wired in the Daemon ctor). The endpoint tolerates an empty holder in the
868
+ // gap between server-start and populate by falling back to
869
+ // restartRequired:true.
870
+ const joinApplierHolder = { current: undefined };
861
871
  // hjex.6: retry signal for the bootstrap halt-and-resume loop.
862
872
  // When a SetupBootstrapHalted is caught (fatal non-funding error or funding
863
873
  // timeout), main() waits on this promise instead of returning, so the setup
@@ -964,6 +974,7 @@ export async function main() {
964
974
  rpcUrl: config.rpcUrl,
965
975
  defaultRpcUrl: CHAIN_CONFIG.rpcUrl,
966
976
  joinedSolverNets: config.joinedSolverNets,
977
+ onboardingComplete: config.onboardingComplete,
967
978
  }),
968
979
  },
969
980
  // SolverNet catalog. Stubbed to the bundled `prediction` net for v1.
@@ -1111,6 +1122,17 @@ export async function main() {
1111
1122
  resolve();
1112
1123
  });
1113
1124
  },
1125
+ // #1037: hot-apply a join to the running daemon. Populated after the
1126
+ // join-consuming subsystems are built (see joinApplierHolder). Empty
1127
+ // until then → the endpoint returns restartRequired:true.
1128
+ joinApplier: joinApplierHolder,
1129
+ // #983: mutate the in-memory config so GET /v1/bootstrap reflects the
1130
+ // completion flag live (the endpoint persists to disk; this keeps the
1131
+ // configReader's in-memory read consistent — same pattern as the
1132
+ // join-applier's config write). Cast: JinnConfig has the optional field.
1133
+ markOnboardingComplete: () => {
1134
+ config.onboardingComplete = true;
1135
+ },
1114
1136
  },
1115
1137
  status: {
1116
1138
  earningDir: config.earningDir,
@@ -1547,6 +1569,28 @@ export async function main() {
1547
1569
  // the panel's next refetch. Before this, the routes 404'd forever and
1548
1570
  // the /build page rendered "Discovery unavailable" permanently.
1549
1571
  discoveryApiHolder.current = sharedDiscoveryApi;
1572
+ // #1037: the live task-discovery descriptor. Always present with a mutable
1573
+ // `solverNetManifestCids` array (`taskDiscoveryManifestCids` is a fresh
1574
+ // `.map` result, safe to push onto). The join applier holds this same object
1575
+ // reference and pushes a newly-joined cid onto it live.
1576
+ const taskDiscovery = {
1577
+ discoveryApi: sharedDiscoveryApi,
1578
+ solverNetManifestCids: taskDiscoveryManifestCids,
1579
+ // No explicit `onchainFromBlock` by default — let `MechAdapter`'s
1580
+ // `DEFAULT_TASK_DISCOVERY_FROM_BLOCK` per-chain default flow through.
1581
+ // Hardcoding here shadowed the adapter's default and re-introduced the
1582
+ // ghost-task floor every release; removing the shadow makes `adapter.ts`
1583
+ // the single source of truth. See gh #300. An operator MAY opt in to a
1584
+ // recent floor via `taskDiscoveryOnchainFromBlock` to bound the canonical
1585
+ // getLogs scan (which otherwise parses a large history on the main thread
1586
+ // and can stall the loop) and lean on the indexer DiscoveryAPI.
1587
+ ...(config.taskDiscoveryOnchainFromBlock !== undefined
1588
+ ? { onchainFromBlock: config.taskDiscoveryOnchainFromBlock }
1589
+ : {}),
1590
+ ...(config.taskDiscoveryAllowedTaskIds?.length
1591
+ ? { allowedTaskIds: config.taskDiscoveryAllowedTaskIds }
1592
+ : {}),
1593
+ };
1550
1594
  const adapter = new MechAdapter({
1551
1595
  rpcUrl: config.rpcUrls,
1552
1596
  mechMarketplaceAddress: MARKETPLACE_ADDRESS,
@@ -1560,27 +1604,7 @@ export async function main() {
1560
1604
  chainId: config.network === 'testnet' ? 84532 : 8453,
1561
1605
  routerClaimDeliveryVariant: CHAIN_CONFIG.routerClaimDeliveryVersion,
1562
1606
  evictionRecovery,
1563
- taskDiscovery: taskDiscoveryManifestCids.length > 0
1564
- ? {
1565
- discoveryApi: sharedDiscoveryApi,
1566
- solverNetManifestCids: taskDiscoveryManifestCids,
1567
- // No explicit `onchainFromBlock` by default — let `MechAdapter`'s
1568
- // `DEFAULT_TASK_DISCOVERY_FROM_BLOCK` per-chain default flow
1569
- // through. Hardcoding here shadowed the adapter's default and
1570
- // re-introduced the ghost-task floor every release; removing the
1571
- // shadow makes `adapter.ts` the single source of truth. See gh
1572
- // #300. An operator MAY opt in to a recent floor via
1573
- // `taskDiscoveryOnchainFromBlock` to bound the canonical getLogs
1574
- // scan (which otherwise parses a large history on the main thread
1575
- // and can stall the loop) and lean on the indexer DiscoveryAPI.
1576
- ...(config.taskDiscoveryOnchainFromBlock !== undefined
1577
- ? { onchainFromBlock: config.taskDiscoveryOnchainFromBlock }
1578
- : {}),
1579
- ...(config.taskDiscoveryAllowedTaskIds?.length
1580
- ? { allowedTaskIds: config.taskDiscoveryAllowedTaskIds }
1581
- : {}),
1582
- }
1583
- : undefined,
1607
+ taskDiscovery,
1584
1608
  }, sharedStore);
1585
1609
  // ── TaskEngine wiring ─────────────────────────────────────────────────
1586
1610
  // Build agent viem clients (same creds as MechAdapter uses internally).
@@ -1729,6 +1753,7 @@ export async function main() {
1729
1753
  hermesPath: config.hermesPath,
1730
1754
  hermesModel: config.hermesModel,
1731
1755
  hermesProvider: config.hermesProvider,
1756
+ hermesBaseUrl: config.hermesBaseUrl,
1732
1757
  hermesDoctorTimeoutMs: config.hermesDoctorTimeoutMs,
1733
1758
  codexPath: config.codexPath,
1734
1759
  codexDoctorTimeoutMs: config.codexDoctorTimeoutMs,
@@ -1762,6 +1787,13 @@ export async function main() {
1762
1787
  // is no longer needed and would throw on Hono's locked matcher.
1763
1788
  harnessReadinessRegistryHolder.current = harnessReadinessRegistry;
1764
1789
  console.log('[main] HarnessReadinessRegistry started; /v1/harnesses/readiness routes active.');
1790
+ // #1037: always construct the engine eligibility view (mutable) so a
1791
+ // hot-applied join can inject its cid live. Previously this was wired only
1792
+ // when config.joinedSolverNets was truthy; a zero-join daemon then ran the
1793
+ // legacy solverType gate. With an always-present empty view, a zero-join
1794
+ // daemon rejects cid-bearing tasks (its discovery cid set is empty so it
1795
+ // discovers none) and still passes legacy no-cid tasks. See plan §behaviour-change.
1796
+ const joinedSolverNetsView = createMutableJoinedSolverNetsView(config.joinedSolverNets);
1765
1797
  // ── Engine deps ───────────────────────────────────────────────────────────────
1766
1798
  // Packaging deps: artifacts are always written to served_artifacts
1767
1799
  // (operator-local SQLite). In public-testnet donation mode, scrubbed artifact
@@ -2070,6 +2102,7 @@ export async function main() {
2070
2102
  agentEoa: agentEoaAddress,
2071
2103
  safeAddress,
2072
2104
  agentPrivateKey,
2105
+ ipfsGatewayUrl: config.ipfsGatewayUrl,
2073
2106
  ...(sharedDiscoveryApi ? { discoveryApi: sharedDiscoveryApi } : {}),
2074
2107
  },
2075
2108
  logger: {
@@ -2226,9 +2259,8 @@ export async function main() {
2226
2259
  // doesn't match a joined entry (plus a role gate). Absent when the
2227
2260
  // operator hasn't joined any nets yet — the engine then falls back to
2228
2261
  // the legacy solverType-keyed gate.
2229
- ...(config.joinedSolverNets
2230
- ? { joinedSolverNets: joinedSolverNetsViewFromConfig(config.joinedSolverNets) }
2231
- : {}),
2262
+ // #1037: always wire the (mutable) view so a hot-applied join is live.
2263
+ joinedSolverNets: joinedSolverNetsView,
2232
2264
  // Spec §14: task validation resolves manifest → contract → schemas.
2233
2265
  // Threaded only when the SolverNet registry client was constructed
2234
2266
  // (testnet branch above). The engine treats absence as "schema
@@ -2262,6 +2294,7 @@ export async function main() {
2262
2294
  CHAIN_CONFIG.distributorAddress
2263
2295
  ? {
2264
2296
  intervalMs: config.evictionCheckIntervalMs,
2297
+ reStakeThrottleMs: config.checkpointIntervalMs,
2265
2298
  store: earningStore,
2266
2299
  chain: NETWORK_CHAIN,
2267
2300
  readContract: (opts) => publicClient.readContract(opts),
@@ -2309,13 +2342,49 @@ export async function main() {
2309
2342
  },
2310
2343
  }
2311
2344
  : undefined,
2345
+ // #1043 loop watchdog. Always constructed in production so a stale loop is
2346
+ // detected + surfaced; the process-exit recovery is flag-gated (default
2347
+ // OFF) by config.watchdogAutoRestart.
2348
+ watchdog: { autoRestart: config.watchdogAutoRestart },
2349
+ });
2350
+ // #1037: populate the join applier now that all four join-consuming
2351
+ // subsystems exist — the live task-discovery descriptor (`taskDiscovery`),
2352
+ // the mutable engine view (`joinedSolverNetsView`), the readiness registry,
2353
+ // and the SolverNet registry. The join endpoint registered eagerly at
2354
+ // server-start; before this point it returns restartRequired:true.
2355
+ joinApplierHolder.current = createJoinApplier({
2356
+ taskDiscovery,
2357
+ view: joinedSolverNetsView,
2358
+ readiness: harnessReadinessRegistry,
2359
+ registry: solverNetRegistry,
2360
+ config,
2312
2361
  });
2362
+ if (config.watchdogAutoRestart) {
2363
+ console.log('[watchdog] auto-restart ENABLED (stale loop → non-zero exit)');
2364
+ }
2313
2365
  // Write pidfile so `jinn stop` can find us. First, refuse the run if another
2314
2366
  // daemon already owns this earning directory — see issue #649. The gate
2315
2367
  // handles all three branches (refuse-and-exit, unlink-stale-and-continue,
2316
2368
  // proceed); the writeFileSync below MUST stay outside the helper so the
2317
2369
  // "// DO NOT add store mutations above this line — see #649" invariant is
2318
2370
  // visible right here at the call site.
2371
+ // Deployment-readiness gate (#958). In a deployment context (JINN_STATE_DIR
2372
+ // set or a container/compose auth context) this fails loud and exits when a
2373
+ // hard check fails (writable-volume, state-on-volume, agent-cli-non-root).
2374
+ // Outside a deployment context it only logs advisories — a plain local
2375
+ // `jinn run` is NEVER newly gated here. Runs before the pidfile gate so an
2376
+ // unfit environment refuses before we touch the pidfile.
2377
+ await applyDeploymentReadinessGate({
2378
+ stateDir: config.stateDir,
2379
+ earningDir: config.earningDir,
2380
+ relayerUrl: undefined,
2381
+ runtimeMode: config.runtimeMode,
2382
+ }, {
2383
+ env: process.env,
2384
+ getuid: typeof process.getuid === 'function' ? process.getuid.bind(process) : undefined,
2385
+ detectAuthContext,
2386
+ fetch,
2387
+ });
2319
2388
  const pidPath = join(config.earningDir, 'daemon.pid');
2320
2389
  applyPidfileLivenessGate(pidPath);
2321
2390
  writeFileSyncMain(pidPath, String(process.pid) + '\n', 'utf-8');