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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/README.md +67 -1
  2. package/dist/adapters/mech/adapter.d.ts +39 -2
  3. package/dist/adapters/mech/adapter.js +178 -20
  4. package/dist/adapters/mech/adapter.js.map +1 -1
  5. package/dist/adapters/mech/contracts.d.ts +22 -1
  6. package/dist/adapters/mech/contracts.js +96 -52
  7. package/dist/adapters/mech/contracts.js.map +1 -1
  8. package/dist/adapters/mech/safe-revert.d.ts +4 -0
  9. package/dist/adapters/mech/safe-revert.js +5 -1
  10. package/dist/adapters/mech/safe-revert.js.map +1 -1
  11. package/dist/adapters/mech/safe.d.ts +1 -1
  12. package/dist/adapters/mech/safe.js +10 -4
  13. package/dist/adapters/mech/safe.js.map +1 -1
  14. package/dist/adapters/mech/types.d.ts +6 -1
  15. package/dist/adapters/mech/types.js.map +1 -1
  16. package/dist/agent/operator-claude.js +8 -0
  17. package/dist/agent/operator-claude.js.map +1 -1
  18. package/dist/api/activity-events-endpoint.d.ts +14 -0
  19. package/dist/api/activity-events-endpoint.js +59 -0
  20. package/dist/api/activity-events-endpoint.js.map +1 -0
  21. package/dist/api/bootstrap-endpoint.d.ts +1 -2
  22. package/dist/api/bootstrap-endpoint.js +42 -24
  23. package/dist/api/bootstrap-endpoint.js.map +1 -1
  24. package/dist/api/codex-doctor-endpoint.d.ts +22 -5
  25. package/dist/api/codex-doctor-endpoint.js +136 -17
  26. package/dist/api/codex-doctor-endpoint.js.map +1 -1
  27. package/dist/api/debug-report-endpoint.d.ts +27 -0
  28. package/dist/api/debug-report-endpoint.js +157 -0
  29. package/dist/api/debug-report-endpoint.js.map +1 -0
  30. package/dist/api/discovery-endpoint.d.ts +1 -0
  31. package/dist/api/discovery-endpoint.js +24 -0
  32. package/dist/api/discovery-endpoint.js.map +1 -1
  33. package/dist/api/fleet-build.d.ts +1 -7
  34. package/dist/api/fleet-build.js +0 -7
  35. package/dist/api/fleet-build.js.map +1 -1
  36. package/dist/api/gather-status.d.ts +39 -0
  37. package/dist/api/gather-status.js +181 -84
  38. package/dist/api/gather-status.js.map +1 -1
  39. package/dist/api/hermes-doctor-endpoint.d.ts +15 -7
  40. package/dist/api/hermes-doctor-endpoint.js +56 -19
  41. package/dist/api/hermes-doctor-endpoint.js.map +1 -1
  42. package/dist/api/launcher-status.d.ts +4 -2
  43. package/dist/api/launcher-status.js +11 -10
  44. package/dist/api/launcher-status.js.map +1 -1
  45. package/dist/api/launcher-tasks.d.ts +1 -1
  46. package/dist/api/launcher-tasks.js +12 -8
  47. package/dist/api/launcher-tasks.js.map +1 -1
  48. package/dist/api/loop-completion-build.d.ts +79 -0
  49. package/dist/api/loop-completion-build.js +155 -0
  50. package/dist/api/loop-completion-build.js.map +1 -0
  51. package/dist/api/operator-artifacts-endpoint.js +73 -6
  52. package/dist/api/operator-artifacts-endpoint.js.map +1 -1
  53. package/dist/api/portfolio-v0-build.d.ts +7 -1
  54. package/dist/api/portfolio-v0-build.js +6 -2
  55. package/dist/api/portfolio-v0-build.js.map +1 -1
  56. package/dist/api/prediction-v1-build.d.ts +6 -0
  57. package/dist/api/prediction-v1-build.js +3 -1
  58. package/dist/api/prediction-v1-build.js.map +1 -1
  59. package/dist/api/server.d.ts +17 -0
  60. package/dist/api/server.js +40 -1
  61. package/dist/api/server.js.map +1 -1
  62. package/dist/api/setup-endpoints.d.ts +13 -9
  63. package/dist/api/setup-endpoints.js +50 -173
  64. package/dist/api/setup-endpoints.js.map +1 -1
  65. package/dist/api/solvernets-endpoints.js +33 -63
  66. package/dist/api/solvernets-endpoints.js.map +1 -1
  67. package/dist/api/status-build.d.ts +140 -17
  68. package/dist/api/status-build.js +47 -34
  69. package/dist/api/status-build.js.map +1 -1
  70. package/dist/api/status-harness-rollup.d.ts +35 -0
  71. package/dist/api/status-harness-rollup.js +45 -0
  72. package/dist/api/status-harness-rollup.js.map +1 -0
  73. package/dist/api/status-rollup-build.d.ts +0 -4
  74. package/dist/api/status-rollup-build.js +0 -4
  75. package/dist/api/status-rollup-build.js.map +1 -1
  76. package/dist/api/task-runs-build.d.ts +8 -0
  77. package/dist/api/task-runs-build.js +5 -1
  78. package/dist/api/task-runs-build.js.map +1 -1
  79. package/dist/build-info.json +4 -4
  80. package/dist/build-meta.json +1 -1
  81. package/dist/captures/live-publisher.js +24 -4
  82. package/dist/captures/live-publisher.js.map +1 -1
  83. package/dist/captures/publish.d.ts +1 -1
  84. package/dist/chain-read-errors.d.ts +12 -0
  85. package/dist/chain-read-errors.js +26 -1
  86. package/dist/chain-read-errors.js.map +1 -1
  87. package/dist/cli/commands/codedigest-revert-check.d.ts +33 -0
  88. package/dist/cli/commands/codedigest-revert-check.js +253 -0
  89. package/dist/cli/commands/codedigest-revert-check.js.map +1 -0
  90. package/dist/cli/commands/doctor.d.ts +3 -0
  91. package/dist/cli/commands/doctor.js +35 -0
  92. package/dist/cli/commands/doctor.js.map +1 -1
  93. package/dist/cli/commands/eval.d.ts +76 -0
  94. package/dist/cli/commands/eval.js +401 -0
  95. package/dist/cli/commands/eval.js.map +1 -0
  96. package/dist/cli/commands/rewards.d.ts +2 -0
  97. package/dist/cli/commands/rewards.js +27 -0
  98. package/dist/cli/commands/rewards.js.map +1 -1
  99. package/dist/cli/commands/solver-nets.d.ts +1 -0
  100. package/dist/cli/commands/solver-nets.js +245 -22
  101. package/dist/cli/commands/solver-nets.js.map +1 -1
  102. package/dist/cli/commands/solver-plugins-block.d.ts +33 -0
  103. package/dist/cli/commands/solver-plugins-block.js +118 -0
  104. package/dist/cli/commands/solver-plugins-block.js.map +1 -0
  105. package/dist/cli/commands/solver-plugins-feedback.d.ts +72 -0
  106. package/dist/cli/commands/solver-plugins-feedback.js +262 -0
  107. package/dist/cli/commands/solver-plugins-feedback.js.map +1 -0
  108. package/dist/cli/commands/solver-plugins-read.d.ts +54 -0
  109. package/dist/cli/commands/solver-plugins-read.js +259 -0
  110. package/dist/cli/commands/solver-plugins-read.js.map +1 -0
  111. package/dist/cli/commands/solver-plugins.d.ts +35 -0
  112. package/dist/cli/commands/solver-plugins.js +399 -2
  113. package/dist/cli/commands/solver-plugins.js.map +1 -1
  114. package/dist/cli/commands/status.js +0 -1
  115. package/dist/cli/commands/status.js.map +1 -1
  116. package/dist/cli/commands/tasks.js +15 -2
  117. package/dist/cli/commands/tasks.js.map +1 -1
  118. package/dist/cli/index.js +4 -0
  119. package/dist/cli/index.js.map +1 -1
  120. package/dist/cli/task-native-readiness.d.ts +7 -0
  121. package/dist/cli/task-native-readiness.js +7 -5
  122. package/dist/cli/task-native-readiness.js.map +1 -1
  123. package/dist/config.d.ts +206 -232
  124. package/dist/config.js +289 -107
  125. package/dist/config.js.map +1 -1
  126. package/dist/daemon/ai-units-gate.d.ts +54 -0
  127. package/dist/daemon/ai-units-gate.js +83 -0
  128. package/dist/daemon/ai-units-gate.js.map +1 -0
  129. package/dist/daemon/creator.js +13 -0
  130. package/dist/daemon/creator.js.map +1 -1
  131. package/dist/daemon/daemon.d.ts +10 -0
  132. package/dist/daemon/daemon.js +205 -30
  133. package/dist/daemon/daemon.js.map +1 -1
  134. package/dist/daemon/eviction-loop.d.ts +7 -0
  135. package/dist/daemon/eviction-loop.js +16 -0
  136. package/dist/daemon/eviction-loop.js.map +1 -1
  137. package/dist/daemon/gate-logger.d.ts +9 -0
  138. package/dist/daemon/gate-logger.js +2 -0
  139. package/dist/daemon/gate-logger.js.map +1 -0
  140. package/dist/daemon/jinn-claim-loop.js +22 -4
  141. package/dist/daemon/jinn-claim-loop.js.map +1 -1
  142. package/dist/daemon/readiness-gate.d.ts +1 -4
  143. package/dist/daemon/readiness-gate.js.map +1 -1
  144. package/dist/daemon/spend-cap-gate.d.ts +40 -0
  145. package/dist/daemon/spend-cap-gate.js +46 -0
  146. package/dist/daemon/spend-cap-gate.js.map +1 -0
  147. package/dist/dashboard/assets/index-3quVQqik.js +167 -0
  148. package/dist/dashboard/assets/index-BVAWkLwY.css +1 -0
  149. package/dist/dashboard/index.html +2 -2
  150. package/dist/discovery/http.d.ts +7 -0
  151. package/dist/discovery/http.js +567 -24
  152. package/dist/discovery/http.js.map +1 -1
  153. package/dist/discovery/onchain.js +197 -5
  154. package/dist/discovery/onchain.js.map +1 -1
  155. package/dist/discovery/types.d.ts +235 -0
  156. package/dist/discovery/types.js +40 -0
  157. package/dist/discovery/types.js.map +1 -1
  158. package/dist/discovery/with-fallback.js +41 -0
  159. package/dist/discovery/with-fallback.js.map +1 -1
  160. package/dist/earning/bootstrap.d.ts +31 -3
  161. package/dist/earning/bootstrap.js +94 -22
  162. package/dist/earning/bootstrap.js.map +1 -1
  163. package/dist/earning/faucet.d.ts +1 -1
  164. package/dist/earning/faucet.js +2 -2
  165. package/dist/earning/faucet.js.map +1 -1
  166. package/dist/earning/safe-adapter.js +34 -11
  167. package/dist/earning/safe-adapter.js.map +1 -1
  168. package/dist/earning/types.d.ts +6 -6
  169. package/dist/earning/viem-clients.d.ts +11 -4
  170. package/dist/earning/viem-clients.js +14 -5
  171. package/dist/earning/viem-clients.js.map +1 -1
  172. package/dist/erc8004/identity.d.ts +19 -3
  173. package/dist/erc8004/identity.js +38 -11
  174. package/dist/erc8004/identity.js.map +1 -1
  175. package/dist/erc8004/index.d.ts +1 -1
  176. package/dist/erc8004/index.js.map +1 -1
  177. package/dist/eval/eval-harness-run.d.ts +63 -0
  178. package/dist/eval/eval-harness-run.js +123 -0
  179. package/dist/eval/eval-harness-run.js.map +1 -0
  180. package/dist/eval/orchestrator.d.ts +163 -0
  181. package/dist/eval/orchestrator.js +232 -0
  182. package/dist/eval/orchestrator.js.map +1 -0
  183. package/dist/eval/paired.d.ts +68 -0
  184. package/dist/eval/paired.js +93 -0
  185. package/dist/eval/paired.js.map +1 -0
  186. package/dist/eval/resolve-slate-tasks.d.ts +35 -0
  187. package/dist/eval/resolve-slate-tasks.js +56 -0
  188. package/dist/eval/resolve-slate-tasks.js.map +1 -0
  189. package/dist/eval/screen-discovery.d.ts +22 -0
  190. package/dist/eval/screen-discovery.js +71 -0
  191. package/dist/eval/screen-discovery.js.map +1 -0
  192. package/dist/eval/screen-progress.d.ts +41 -0
  193. package/dist/eval/screen-progress.js +60 -0
  194. package/dist/eval/screen-progress.js.map +1 -0
  195. package/dist/eval/screen-runner.d.ts +30 -0
  196. package/dist/eval/screen-runner.js +289 -0
  197. package/dist/eval/screen-runner.js.map +1 -0
  198. package/dist/eval/screen.d.ts +107 -0
  199. package/dist/eval/screen.js +159 -0
  200. package/dist/eval/screen.js.map +1 -0
  201. package/dist/eval/slope.d.ts +29 -0
  202. package/dist/eval/slope.js +46 -0
  203. package/dist/eval/slope.js.map +1 -0
  204. package/dist/eval/train-sequence.d.ts +35 -0
  205. package/dist/eval/train-sequence.js +59 -0
  206. package/dist/eval/train-sequence.js.map +1 -0
  207. package/dist/eval/wilson.d.ts +45 -0
  208. package/dist/eval/wilson.js +48 -0
  209. package/dist/eval/wilson.js.map +1 -0
  210. package/dist/events/types.d.ts +2 -2
  211. package/dist/harnesses/cost-estimates.d.ts +10 -31
  212. package/dist/harnesses/cost-estimates.js +11 -43
  213. package/dist/harnesses/cost-estimates.js.map +1 -1
  214. package/dist/harnesses/engine/canonical-json.js +5 -3
  215. package/dist/harnesses/engine/canonical-json.js.map +1 -1
  216. package/dist/harnesses/engine/engine.d.ts +37 -4
  217. package/dist/harnesses/engine/engine.js +151 -20
  218. package/dist/harnesses/engine/engine.js.map +1 -1
  219. package/dist/harnesses/engine/persistence.d.ts +38 -4
  220. package/dist/harnesses/engine/persistence.js +71 -6
  221. package/dist/harnesses/engine/persistence.js.map +1 -1
  222. package/dist/harnesses/engine/state.d.ts +9 -0
  223. package/dist/harnesses/engine/state.js +23 -10
  224. package/dist/harnesses/engine/state.js.map +1 -1
  225. package/dist/harnesses/impls/hermes-agent/adapter.d.ts +2 -0
  226. package/dist/harnesses/impls/hermes-agent/adapter.js +8 -5
  227. package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
  228. package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +1 -0
  229. package/dist/harnesses/impls/hermes-agent/bootstrap.js +10 -3
  230. package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
  231. package/dist/harnesses/impls/hermes-agent/config-builder.d.ts +1 -1
  232. package/dist/harnesses/impls/hermes-agent/config-builder.js +4 -2
  233. package/dist/harnesses/impls/hermes-agent/config-builder.js.map +1 -1
  234. package/dist/harnesses/impls/hermes-agent/harness.d.ts +31 -3
  235. package/dist/harnesses/impls/hermes-agent/harness.js +84 -7
  236. package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
  237. package/dist/harnesses/impls/hermes-agent/prompt.d.ts +6 -6
  238. package/dist/harnesses/impls/hermes-agent/prompt.js +6 -6
  239. package/dist/harnesses/impls/index.d.ts +2 -0
  240. package/dist/harnesses/impls/index.js +2 -0
  241. package/dist/harnesses/impls/index.js.map +1 -1
  242. package/dist/harnesses/impls/learner/adapters/claude-code.d.ts +17 -0
  243. package/dist/harnesses/impls/learner/adapters/claude-code.js +118 -14
  244. package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
  245. package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +9 -0
  246. package/dist/harnesses/impls/learner/adapters/codex-code.js +30 -8
  247. package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
  248. package/dist/harnesses/impls/learner/harness.d.ts +41 -1
  249. package/dist/harnesses/impls/learner/harness.js +78 -4
  250. package/dist/harnesses/impls/learner/harness.js.map +1 -1
  251. package/dist/harnesses/impls/learner/harvest.d.ts +3 -1
  252. package/dist/harnesses/impls/learner/harvest.js +30 -6
  253. package/dist/harnesses/impls/learner/harvest.js.map +1 -1
  254. package/dist/harnesses/impls/learner/plugin-path.js +1 -0
  255. package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
  256. package/dist/harnesses/impls/learner/restoration-patch.d.ts +2 -2
  257. package/dist/harnesses/impls/learner/restoration-patch.js +25 -6
  258. package/dist/harnesses/impls/learner/restoration-patch.js.map +1 -1
  259. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +21 -1
  260. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
  261. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +3 -1
  262. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
  263. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.d.ts +74 -5
  264. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +103 -32
  265. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
  266. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +2 -2
  267. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +3 -1
  268. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
  269. package/dist/harnesses/readiness-registry.d.ts +7 -0
  270. package/dist/harnesses/readiness-registry.js +9 -0
  271. package/dist/harnesses/readiness-registry.js.map +1 -1
  272. package/dist/harnesses/types.d.ts +14 -0
  273. package/dist/learner/revert-decision.d.ts +74 -0
  274. package/dist/learner/revert-decision.js +73 -0
  275. package/dist/learner/revert-decision.js.map +1 -0
  276. package/dist/learner/revert-stats.d.ts +38 -0
  277. package/dist/learner/revert-stats.js +86 -0
  278. package/dist/learner/revert-stats.js.map +1 -0
  279. package/dist/local-provider-url.d.ts +3 -0
  280. package/dist/local-provider-url.js +28 -0
  281. package/dist/local-provider-url.js.map +1 -0
  282. package/dist/main.js +199 -104
  283. package/dist/main.js.map +1 -1
  284. package/dist/mcp/get-codedigest-reward.d.ts +13 -0
  285. package/dist/mcp/get-codedigest-reward.js +23 -0
  286. package/dist/mcp/get-codedigest-reward.js.map +1 -0
  287. package/dist/mcp/server.js +23 -0
  288. package/dist/mcp/server.js.map +1 -1
  289. package/dist/observability/debug-report-assemble.d.ts +43 -0
  290. package/dist/observability/debug-report-assemble.js +80 -0
  291. package/dist/observability/debug-report-assemble.js.map +1 -0
  292. package/dist/observability/emit-event.d.ts +9 -2
  293. package/dist/observability/emit-event.js +36 -2
  294. package/dist/observability/emit-event.js.map +1 -1
  295. package/dist/observability/file-logger.d.ts +69 -0
  296. package/dist/observability/file-logger.js +177 -0
  297. package/dist/observability/file-logger.js.map +1 -0
  298. package/dist/observability/redact-secrets.d.ts +65 -0
  299. package/dist/observability/redact-secrets.js +300 -0
  300. package/dist/observability/redact-secrets.js.map +1 -0
  301. package/dist/observability/tar.d.ts +30 -0
  302. package/dist/observability/tar.js +102 -0
  303. package/dist/observability/tar.js.map +1 -0
  304. package/dist/plugins/learner/.claude-plugin/plugin.json +1 -1
  305. package/dist/plugins/learner/.codex-plugin/plugin.json +1 -1
  306. package/dist/plugins/learner/hooks/session-start +30 -1
  307. package/dist/plugins/learner/skills/learn/consolidator-prompt.md +22 -1
  308. package/dist/plugins/learner/skills/learn/promoter-prompt.md +72 -1
  309. package/dist/preflight/deployment-readiness.d.ts +147 -0
  310. package/dist/preflight/deployment-readiness.js +366 -0
  311. package/dist/preflight/deployment-readiness.js.map +1 -0
  312. package/dist/preflight/pidfile-liveness.d.ts +50 -0
  313. package/dist/preflight/pidfile-liveness.js +117 -0
  314. package/dist/preflight/pidfile-liveness.js.map +1 -0
  315. package/dist/preflight/rpc-network.d.ts +40 -0
  316. package/dist/preflight/rpc-network.js +67 -1
  317. package/dist/preflight/rpc-network.js.map +1 -1
  318. package/dist/rpc/transport.d.ts +145 -0
  319. package/dist/rpc/transport.js +319 -0
  320. package/dist/rpc/transport.js.map +1 -0
  321. package/dist/scripts/donation-consumption-acceptance.js +7 -28
  322. package/dist/scripts/donation-consumption-acceptance.js.map +1 -1
  323. package/dist/scripts/swe-rebench-v2-pytest-missing.json +16 -0
  324. package/dist/solver-nets/prediction-operator-ux.d.ts +1 -2
  325. package/dist/solver-nets/prediction-operator-ux.js +56 -53
  326. package/dist/solver-nets/prediction-operator-ux.js.map +1 -1
  327. package/dist/solver-nets/registry.d.ts +19 -1
  328. package/dist/solver-nets/registry.js +37 -24
  329. package/dist/solver-nets/registry.js.map +1 -1
  330. package/dist/solver-types/_swe-rebench-v2-held-out-slate.d.ts +76 -0
  331. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js +156 -0
  332. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js.map +1 -0
  333. package/dist/solver-types/_swe-rebench-v2-pool-recovery.d.ts +81 -0
  334. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js +116 -0
  335. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js.map +1 -0
  336. package/dist/solver-types/_swe-rebench-v2-pool.d.ts +9 -2
  337. package/dist/solver-types/_swe-rebench-v2-pool.js +15 -20
  338. package/dist/solver-types/_swe-rebench-v2-pool.js.map +1 -1
  339. package/dist/solver-types/_swe-rebench-v2-state.d.ts +24 -0
  340. package/dist/solver-types/_swe-rebench-v2-state.js +33 -0
  341. package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
  342. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +116 -2
  343. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +296 -21
  344. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  345. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v1.json +20 -0
  346. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.json +19 -0
  347. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.screening-report.json +628 -0
  348. package/dist/solver-types/solver-type.d.ts +8 -0
  349. package/dist/solver-types/swe-rebench-v2-auto.d.ts +20 -11
  350. package/dist/solver-types/swe-rebench-v2-auto.js +64 -19
  351. package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
  352. package/dist/solver-types/swe-rebench-v2.d.ts +10 -2
  353. package/dist/solver-types/swe-rebench-v2.js +233 -13
  354. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  355. package/dist/solvernets/daemon-init.d.ts +1 -1
  356. package/dist/solvernets/daemon-init.js +19 -4
  357. package/dist/solvernets/daemon-init.js.map +1 -1
  358. package/dist/solvernets/launched-record-dispatcher.d.ts +7 -0
  359. package/dist/solvernets/launched-record-dispatcher.js +10 -4
  360. package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
  361. package/dist/solvernets/registry-client-erc8004.js +40 -37
  362. package/dist/solvernets/registry-client-erc8004.js.map +1 -1
  363. package/dist/solvernets/registry-client.d.ts +6 -0
  364. package/dist/solvernets/store.d.ts +2 -2
  365. package/dist/solvernets/store.js +7 -2
  366. package/dist/solvernets/store.js.map +1 -1
  367. package/dist/spend/ai-units-config.d.ts +49 -0
  368. package/dist/spend/ai-units-config.js +34 -0
  369. package/dist/spend/ai-units-config.js.map +1 -0
  370. package/dist/spend/ai-units.d.ts +140 -0
  371. package/dist/spend/ai-units.js +229 -0
  372. package/dist/spend/ai-units.js.map +1 -0
  373. package/dist/spend/cost-surface-status.d.ts +12 -0
  374. package/dist/spend/cost-surface-status.js +24 -0
  375. package/dist/spend/cost-surface-status.js.map +1 -0
  376. package/dist/spend/credential.d.ts +39 -0
  377. package/dist/spend/credential.js +71 -0
  378. package/dist/spend/credential.js.map +1 -0
  379. package/dist/spend/daemon-config.d.ts +13 -0
  380. package/dist/spend/daemon-config.js +24 -0
  381. package/dist/spend/daemon-config.js.map +1 -0
  382. package/dist/spend/pricing.d.ts +16 -0
  383. package/dist/spend/pricing.js +26 -0
  384. package/dist/spend/pricing.js.map +1 -0
  385. package/dist/spend/record.d.ts +13 -0
  386. package/dist/spend/record.js +43 -0
  387. package/dist/spend/record.js.map +1 -0
  388. package/dist/spend/usage.d.ts +27 -0
  389. package/dist/spend/usage.js +113 -0
  390. package/dist/spend/usage.js.map +1 -0
  391. package/dist/store/store.d.ts +187 -0
  392. package/dist/store/store.js +467 -4
  393. package/dist/store/store.js.map +1 -1
  394. package/dist/trajectory/transcript-parsers/codex-session.d.ts +12 -6
  395. package/dist/trajectory/transcript-parsers/codex-session.js +114 -13
  396. package/dist/trajectory/transcript-parsers/codex-session.js.map +1 -1
  397. package/dist/trajectory/transcript-parsers/types.d.ts +8 -8
  398. package/dist/trajectory/transcript-session-dirs.d.ts +18 -0
  399. package/dist/trajectory/transcript-session-dirs.js +85 -0
  400. package/dist/trajectory/transcript-session-dirs.js.map +1 -0
  401. package/dist/trajectory/transcript-watcher.d.ts +20 -1
  402. package/dist/trajectory/transcript-watcher.js +108 -32
  403. package/dist/trajectory/transcript-watcher.js.map +1 -1
  404. package/dist/tx-retry.d.ts +25 -0
  405. package/dist/tx-retry.js +95 -7
  406. package/dist/tx-retry.js.map +1 -1
  407. package/dist/types/payloads/portfolio-v0.d.ts +3 -3
  408. package/dist/types/payloads/prediction-apy-v0.d.ts +3 -3
  409. package/dist/types/payloads/prediction-v0.d.ts +12 -12
  410. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +108 -1
  411. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +25 -1
  412. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.d.ts +65 -0
  413. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.js +123 -0
  414. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.d.ts +2 -2
  415. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js +1 -1
  416. package/dist/vendor/@jinn-network/sdk/package.json +4 -0
  417. package/docker-compose.yml +3 -2
  418. package/package.json +30 -18
  419. package/plugins/learner/.claude-plugin/plugin.json +1 -1
  420. package/plugins/learner/.codex-plugin/plugin.json +1 -1
  421. package/plugins/learner/hooks/session-start +30 -1
  422. package/plugins/learner/skills/learn/consolidator-prompt.md +22 -1
  423. package/plugins/learner/skills/learn/promoter-prompt.md +72 -1
  424. package/plugins/swe-rebench-v2-diffmin/README.md +10 -9
  425. package/plugins/swe-rebench-v2-diffmin/jinn.plugin.json +1 -1
  426. package/plugins/swe-rebench-v2-diffmin/skills/diffmin/SKILL.md +15 -10
  427. package/plugins/swe-rebench-v2-diffmin/skills/test-map/SKILL.md +10 -12
  428. package/plugins/swe-rebench-v2-runtime/.claude-plugin/plugin.json +1 -1
  429. package/plugins/swe-rebench-v2-runtime/.codex-plugin/plugin.json +3 -3
  430. package/plugins/swe-rebench-v2-runtime/README.md +6 -6
  431. package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
  432. package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
  433. package/plugins/swe-rebench-v2-runtime/jinn.plugin.json +2 -3
  434. package/plugins/swe-rebench-v2-runtime/skills/task/SKILL.md +81 -0
  435. package/dist/dashboard/assets/index-BUlE8F3Y.js +0 -330
  436. package/dist/dashboard/assets/index-blqc7eqq.css +0 -32
  437. package/plugins/swe-rebench-v2-runtime/skills/orient/SKILL.md +0 -29
  438. package/plugins/swe-rebench-v2-runtime/skills/plan/SKILL.md +0 -53
package/dist/main.js CHANGED
@@ -33,6 +33,7 @@ import { setDefaultTxSubmissionLedger } from './tx-retry.js';
33
33
  import { CapturePublishUnavailableError } from './api/captures.js';
34
34
  import { invalidatePredictionOperatorStatusCache } from './api/gather-status.js';
35
35
  import { ensureUiToken } from './api/ui-token.js';
36
+ import { getFileLogger, closeFileLogger } from './observability/file-logger.js';
36
37
  import { hashImplStateDir } from './harnesses/freeze.js';
37
38
  import { readModeState } from './harnesses/mode-state.js';
38
39
  import { attachAgentWs, updateAgentClaudePath } from './agent/agent-ws.js';
@@ -41,6 +42,9 @@ import { requestDaemonRestart } from './restart-daemon.js';
41
42
  import { buildEnvelope, emitEnvelope } from './errors/envelope.js';
42
43
  import { clearBootstrapError, persistBootstrapError, } from './errors/persisted-bootstrap-error.js';
43
44
  import { emitStructured } from './events/emitter.js';
45
+ import { applyPidfileLivenessGate } from './preflight/pidfile-liveness.js';
46
+ import { applyDeploymentReadinessGate } from './preflight/deployment-readiness.js';
47
+ import { detectAuthContext } from './preflight/claude-auth.js';
44
48
  import { FleetBootstrapper, recoverEvictedService as recoverEvictedServiceFn } from './earning/bootstrap.js';
45
49
  import { DEFAULT_TESTNET_ARTIFACTS, applyChainGasOverrides, getChainConfig, loadJinnMviConfig } from './earning/contracts.js';
46
50
  import { runLegacyAgentIdMigration } from './earning/migrate-agent-id.js';
@@ -50,6 +54,9 @@ import { decryptMnemonic, deriveMasterSigner, walletPrivateKeyAtIndex } from './
50
54
  import { MechAdapter } from './adapters/mech/adapter.js';
51
55
  import { ClaudeRunner } from './runner/claude.js';
52
56
  import { Daemon } from './daemon/daemon.js';
57
+ import { buildSpendCapConfig } from './spend/daemon-config.js';
58
+ import { buildAiUnitsConfig } from './spend/ai-units-config.js';
59
+ import { REFERENCE_CEILING } from './spend/ai-units.js';
53
60
  import { buildJinnClaimLoopConfig, shouldWireJinnClaimL1Signer, } from './daemon/jinn-claim-loop-wiring.js';
54
61
  import { createJinnPublicClient, createJinnWalletClient, createJinnL1PublicClient, createJinnL1WalletClient } from './earning/viem-clients.js';
55
62
  import { privateKeyToAccount } from 'viem/accounts';
@@ -62,7 +69,7 @@ import { CLAUDE_CODE_HARNESS, CODEX_HARNESS, HERMES_AGENT_HARNESS, harnessStateD
62
69
  import { resolveContractFromSolverNetId } from './solvernets/launched-record-dispatcher.js';
63
70
  import { HarnessReadinessRegistry } from './harnesses/readiness-registry.js';
64
71
  import { createClients } from './adapters/mech/safe.js';
65
- import { loadSolverNets } from './solver-nets/registry.js';
72
+ import { findJoinedByName, loadSolverNets, solverTypeFromJoinedContract, } from './solver-nets/registry.js';
66
73
  import { createCorpus } from './corpus/index.js';
67
74
  import { DEFAULT_EXECUTION_DISCOVERY_FROM_BLOCK } from './corpus/onchain-query.js';
68
75
  import { CapturesStore } from './store/captures.js';
@@ -78,10 +85,12 @@ import { ClaudeCodeJsonlParser } from './trajectory/transcript-parsers/claude-co
78
85
  import { CodexSessionParser } from './trajectory/transcript-parsers/codex-session.js';
79
86
  import { GeminiSessionParser } from './trajectory/transcript-parsers/gemini-session.js';
80
87
  import { CursorSqliteParser } from './trajectory/transcript-parsers/cursor-sqlite.js';
88
+ import { startTranscriptWatcher, } from './trajectory/transcript-watcher.js';
89
+ import { defaultTranscriptWatchDirectories } from './trajectory/transcript-session-dirs.js';
81
90
  import { buildInfo } from './build-info.js';
82
91
  import { BASE_FEEDS } from './venues/chainlink/feeds.js';
83
92
  import { GeneratedTaskSource, StaticConfiguredTaskSource, filterBindableTasks } from './tasks/sources.js';
84
- import { checkRpcNetwork, logRpcLocalDevToStderr, rpcNetworkFailureHint } from './preflight/rpc-network.js';
93
+ import { checkRpcNetwork, logRpcLocalDevToStderr, probeFallbackChain, rpcNetworkFailureHint, summarizeFallbackChain, } from './preflight/rpc-network.js';
85
94
  import { apiPortFailureMessage, checkApiPortAvailable } from './preflight/api-port.js';
86
95
  import { openBrowser } from './cli/open-browser.js';
87
96
  import { keepSetupUiOnBootstrapError } from './setup/halt-mode.js';
@@ -203,25 +212,15 @@ class EnsurePendingCaptureProcessor {
203
212
  onStart() { }
204
213
  onEnd(span) {
205
214
  const sessionId = stringAttribute(span.attributes['jinn.session.id']);
206
- if (!sessionId || this.captures.getBySession(sessionId))
215
+ if (!sessionId)
207
216
  return;
208
- try {
209
- this.captures.savePending({
210
- sessionId,
211
- capturedAt: hrTimeToIso(span.startTime),
212
- originatingTool: { name: inferCaptureTool(span) },
213
- capturePath: 'A',
214
- status: 'pending',
215
- spanCount: 0,
216
- durationMs: 0,
217
- redactedSpanCount: 0,
218
- ...repoMetadataFromSpan(span),
219
- });
220
- }
221
- catch (err) {
222
- if (!this.captures.getBySession(sessionId))
223
- throw err;
224
- }
217
+ ensurePendingCapture(this.captures, {
218
+ sessionId,
219
+ capturedAt: hrTimeToIso(span.startTime),
220
+ tool: inferCaptureTool(span),
221
+ capturePath: inferCapturePath(span),
222
+ ...repoMetadataFromSpan(span),
223
+ });
225
224
  }
226
225
  }
227
226
  function stringAttribute(value) {
@@ -236,6 +235,11 @@ function inferCaptureTool(span) {
236
235
  ?? stringAttribute(span.resource.attributes['service.name'])
237
236
  ?? 'otel';
238
237
  }
238
+ function inferCapturePath(span) {
239
+ if (stringAttribute(span.attributes['transcript.tool']))
240
+ return 'B';
241
+ return 'A';
242
+ }
239
243
  function repoMetadataFromSpan(span) {
240
244
  const attrs = span.attributes;
241
245
  const repoRemoteUrl = stringAttribute(attrs['repo.remote_url'])
@@ -265,28 +269,35 @@ function parserForStopHookTool(tool) {
265
269
  }
266
270
  }
267
271
  }
268
- function ensurePendingStopHookCapture(captures, payload) {
269
- if (captures.getBySession(payload.sessionId))
272
+ function ensurePendingCapture(captures, params) {
273
+ if (captures.getBySession(params.sessionId))
270
274
  return;
271
275
  try {
272
276
  captures.savePending({
273
- sessionId: payload.sessionId,
274
- capturedAt: payload.stoppedAt,
275
- originatingTool: { name: payload.tool },
276
- capturePath: 'D',
277
+ sessionId: params.sessionId,
278
+ capturedAt: params.capturedAt,
279
+ originatingTool: { name: params.tool },
280
+ capturePath: params.capturePath,
277
281
  status: 'pending',
278
282
  spanCount: 0,
279
283
  durationMs: 0,
280
284
  redactedSpanCount: 0,
285
+ ...(params.repoRemoteUrl ? { repoRemoteUrl: params.repoRemoteUrl } : {}),
286
+ ...(params.repoCommitHash ? { repoCommitHash: params.repoCommitHash } : {}),
281
287
  });
282
288
  }
283
289
  catch (err) {
284
- if (!captures.getBySession(payload.sessionId))
290
+ if (!captures.getBySession(params.sessionId))
285
291
  throw err;
286
292
  }
287
293
  }
288
294
  async function ingestStopHookCapture(captures, receiver, payload) {
289
- ensurePendingStopHookCapture(captures, payload);
295
+ ensurePendingCapture(captures, {
296
+ sessionId: payload.sessionId,
297
+ capturedAt: payload.stoppedAt,
298
+ tool: payload.tool,
299
+ capturePath: 'D',
300
+ });
290
301
  if (!payload.transcriptPath)
291
302
  return;
292
303
  if (!receiver) {
@@ -641,6 +652,11 @@ function emitProgress(envelope) {
641
652
  }
642
653
  export async function main() {
643
654
  console.log(`[main] jinn-client starting on ${NETWORK_CHAIN}`);
655
+ // Issue #420: initialise the rotating daemon file logger early so lifecycle
656
+ // events (tapped in `observability/emit-event.ts`) accumulate durable,
657
+ // pre-redacted log lines for the one-click debug report. Constructing the
658
+ // singleton here also runs the startup age-based cleanup of stale rotations.
659
+ getFileLogger();
644
660
  // ── Daemon API bearer token (jinn-mono-pr64 hardening) ───────────────────
645
661
  //
646
662
  // Cost-mutating API routes (`POST /v1/artifacts/acquire`, `POST /artifacts`)
@@ -681,6 +697,15 @@ export async function main() {
681
697
  else {
682
698
  logRpcLocalDevToStderr(rpcPreflight);
683
699
  }
700
+ // Boot-time RPC fallback-chain probe (issue #592, AC7 + AC9). Log-only —
701
+ // per-slot 429s/5xx never gate startup. checkRpcNetwork above already
702
+ // fail-loud on chain-id mismatch against the head provider.
703
+ await probeFallbackChain(config.rpcUrls, config.network, 'L2');
704
+ console.error(summarizeFallbackChain('L2', config.rpcUrls));
705
+ if (config.jinnClaimLoopEnabled && config.ethereumRpcUrls) {
706
+ await probeFallbackChain(config.ethereumRpcUrls, config.network, 'L1');
707
+ console.error(summarizeFallbackChain('L1', config.ethereumRpcUrls));
708
+ }
684
709
  const portPreflight = await checkApiPortAvailable(config.apiPort);
685
710
  if (!portPreflight.ok) {
686
711
  emitEnvelope({
@@ -734,11 +759,56 @@ export async function main() {
734
759
  console.warn('[main] Capture OTLP receiver disabled; path-A telemetry capture unavailable: ' +
735
760
  `${err instanceof Error ? err.message : String(err)}`);
736
761
  }
762
+ let transcriptWatcher;
763
+ let pathBSyntheticSpanProvider;
764
+ const closePathBTranscriptWatcher = async () => {
765
+ const watcher = transcriptWatcher;
766
+ const provider = pathBSyntheticSpanProvider;
767
+ transcriptWatcher = undefined;
768
+ pathBSyntheticSpanProvider = undefined;
769
+ await Promise.all([
770
+ watcher?.shutdown().catch(() => undefined),
771
+ provider?.shutdown().catch(() => undefined),
772
+ ]);
773
+ };
737
774
  const closeCaptureReceiver = async () => {
775
+ await closePathBTranscriptWatcher();
738
776
  const receiver = captureReceiver;
739
777
  captureReceiver = undefined;
740
778
  await receiver?.shutdown().catch(() => undefined);
741
779
  };
780
+ if (captureReceiver) {
781
+ try {
782
+ const watchDirectories = defaultTranscriptWatchDirectories();
783
+ if (watchDirectories.length > 0) {
784
+ pathBSyntheticSpanProvider = startSyntheticSpanProvider({
785
+ otlpHttpEndpoint: `http://127.0.0.1:${captureReceiver.httpPort}/v1/traces`,
786
+ });
787
+ transcriptWatcher = await startTranscriptWatcher({
788
+ directories: watchDirectories,
789
+ onEvent: (envelope) => {
790
+ ensurePendingCapture(capturesStore, {
791
+ sessionId: envelope.sessionId,
792
+ capturedAt: new Date().toISOString(),
793
+ tool: envelope.tool,
794
+ capturePath: 'B',
795
+ });
796
+ emitSyntheticSpan(pathBSyntheticSpanProvider, envelope);
797
+ },
798
+ });
799
+ console.log('[main] Path-B transcript watcher started for ' +
800
+ watchDirectories.map((d) => `${d.tool}@${d.directory}`).join(', '));
801
+ }
802
+ else {
803
+ console.log('[main] Path-B transcript watcher skipped — no Codex/Claude session directories on disk yet');
804
+ }
805
+ }
806
+ catch (err) {
807
+ await closePathBTranscriptWatcher();
808
+ console.warn('[main] Path-B transcript watcher disabled: ' +
809
+ `${err instanceof Error ? err.message : String(err)}`);
810
+ }
811
+ }
742
812
  const capturePublishRef = { current: undefined };
743
813
  const earningStateStore = new FleetStateStore(config.earningDir);
744
814
  const initialFleet = await earningStateStore.tryLoadExisting();
@@ -790,11 +860,6 @@ export async function main() {
790
860
  // builder-artifacts. Holder ref lets the routes register eagerly and
791
861
  // start returning real data the moment main.ts assigns holder.current.
792
862
  const discoveryApiHolder = { current: undefined };
793
- // hjex.3: holder for the restake callback. Populated in running mode after
794
- // bootstrap completes (when mnemonic + distributorAddress are available).
795
- const restakeCallbackRef = {
796
- current: undefined,
797
- };
798
863
  // hjex.6: retry signal for the bootstrap halt-and-resume loop.
799
864
  // When a SetupBootstrapHalted is caught (fatal non-funding error or funding
800
865
  // timeout), main() waits on this promise instead of returning, so the setup
@@ -836,9 +901,7 @@ export async function main() {
836
901
  // requestDaemonRestart so the operator is never stranded.
837
902
  preSpawnCleanup: async () => {
838
903
  await setupApiServer.close().catch(() => undefined);
839
- if (captureReceiver) {
840
- await captureReceiver.shutdown().catch(() => undefined);
841
- }
904
+ await closeCaptureReceiver();
842
905
  },
843
906
  }),
844
907
  },
@@ -871,6 +934,14 @@ export async function main() {
871
934
  config.operator = operator;
872
935
  },
873
936
  },
937
+ // Issue #420: one-click operator debug report. The bundle assembler
938
+ // reads the live resolved `config` so the download reflects env
939
+ // overrides + defaults, not just the on-disk config file.
940
+ debugReport: {
941
+ store: sharedStore,
942
+ config,
943
+ configPath: CONFIG_PATH ?? DEFAULT_CONFIG_PATH,
944
+ },
874
945
  captures: {
875
946
  captures: capturesStore,
876
947
  publishCapture: async (sessionId) => {
@@ -894,7 +965,6 @@ export async function main() {
894
965
  configReader: () => ({
895
966
  rpcUrl: config.rpcUrl,
896
967
  defaultRpcUrl: CHAIN_CONFIG.rpcUrl,
897
- solverNets: config.solverNets,
898
968
  joinedSolverNets: config.joinedSolverNets,
899
969
  }),
900
970
  },
@@ -1017,22 +1087,15 @@ export async function main() {
1017
1087
  configPath: CONFIG_PATH ?? DEFAULT_CONFIG_PATH,
1018
1088
  defaultRpcUrlForChain: () => CHAIN_CONFIG.rpcUrl,
1019
1089
  onClaudePathSelected: selectClaudePath,
1020
- onSolverNetsUpdated: (solverNets) => {
1021
- config.solverNets = solverNets;
1022
- // The prediction operator status is memoised per-`JinnConfig`
1023
- // reference; mutating in place leaves the cache pointing at the
1024
- // pre-edit snapshot. Drop the entry so the next /v1/status read
1025
- // (and thus Overview's `solverNet.enabled` gating) reflects the
1026
- // toggle immediately. (jinn-mono-l2zl.15.4.12)
1090
+ // Issue #421 retired the legacy `solverNets` write target. Setup
1091
+ // endpoints no longer call back into the daemon to mutate operator
1092
+ // SolverNet config; the canonical join flow is
1093
+ // `POST /v1/operator/join/:cid`, which mutates
1094
+ // `config.joinedSolverNets` directly via its own write path.
1095
+ // The cache-invalidation hook is no longer needed here.
1096
+ onSolverNetsUpdated: () => {
1027
1097
  invalidatePredictionOperatorStatusCache(config);
1028
1098
  },
1029
- // hjex.3: delegate to the live callback populated once running mode starts.
1030
- restake: (serviceId) => {
1031
- if (!restakeCallbackRef.current) {
1032
- return Promise.resolve({ ok: false, error: 'restake_not_available_in_setup_mode' });
1033
- }
1034
- return restakeCallbackRef.current(serviceId);
1035
- },
1036
1099
  // hjex.6: re-trigger the bootstrap state machine from the SPA Retry button.
1037
1100
  // Resolves the halt-and-resume promise; main() will loop back and call
1038
1101
  // bootstrap() again. Rejects if the daemon is not currently halted.
@@ -1094,29 +1157,30 @@ export async function main() {
1094
1157
  // TODO(jinn-mono launcher Task 8): real `getReservedBudgetWei`
1095
1158
  // (sum of unconsumed claim payments across open Tasks).
1096
1159
  launcher: {
1097
- getConfig: () => ({ solverNets: config.solverNets }),
1160
+ getConfig: () => ({ joinedSolverNets: config.joinedSolverNets }),
1098
1161
  configPath: CONFIG_PATH ?? DEFAULT_CONFIG_PATH,
1099
- // Cache-invalidation hook retained for the operator-mode
1100
- // setup-endpoints flow; the launcher-mode PATCH route was retired
1101
- // by Task 22, so this currently fires only when operator mode
1102
- // mutates `solverNets`.
1103
- onSolverNetsUpdated: (solverNets) => {
1104
- config.solverNets = solverNets;
1162
+ // Issue #421 retired the legacy `solverNets` write target. The hook
1163
+ // only needs to invalidate the prediction-operator status cache when
1164
+ // operator mode mutates joinedSolverNets via setup endpoints.
1165
+ onSolverNetsUpdated: () => {
1105
1166
  invalidatePredictionOperatorStatusCache(config);
1106
1167
  },
1107
1168
  getGeneratorState: (netName) => {
1108
1169
  if (netName === 'prediction') {
1109
1170
  return predictionGeneratorRef?.getState();
1110
1171
  }
1111
- const solverType = config.solverNets?.[netName]?.solverType;
1172
+ const joined = findJoinedByName(config.joinedSolverNets, netName);
1173
+ const solverType = joined ? solverTypeFromJoinedContract(joined) : undefined;
1112
1174
  if (!solverType)
1113
1175
  return undefined;
1114
1176
  return launchedGeneratorStateBySolverType.get(solverType)?.();
1115
1177
  },
1116
1178
  getOpenTaskCount: (netName) => {
1117
- const net = config.solverNets?.[netName];
1118
- const solverType = net?.solverType;
1119
- if (!solverType || !safeAddressForLauncher)
1179
+ if (!safeAddressForLauncher)
1180
+ return 0;
1181
+ const joined = findJoinedByName(config.joinedSolverNets, netName);
1182
+ const solverType = joined ? solverTypeFromJoinedContract(joined) : undefined;
1183
+ if (!solverType)
1120
1184
  return 0;
1121
1185
  return sharedStore.countPostedTasksByCreatorAndSolverType({
1122
1186
  creatorSafeAddress: safeAddressForLauncher,
@@ -1327,7 +1391,7 @@ export async function main() {
1327
1391
  return Number.isFinite(n) && n > 0 ? n : 15_000;
1328
1392
  })();
1329
1393
  if (isHaltedOnFunding && haltAddress && haltRequired !== null) {
1330
- const publicClient = createJinnPublicClient(config.rpcUrl, NETWORK_CHAIN);
1394
+ const publicClient = createJinnPublicClient(config.rpcUrls, NETWORK_CHAIN);
1331
1395
  const schedulePoll = () => {
1332
1396
  fundingPollHandle = setTimeout(async () => {
1333
1397
  // Guard: if the signal was already fired, stop polling.
@@ -1425,36 +1489,9 @@ export async function main() {
1425
1489
  const earningStore = new FleetStateStore(config.earningDir);
1426
1490
  const mnemonicForMaster = await decryptMnemonic(await earningStore.loadMnemonicKeystore(), PASSWORD);
1427
1491
  const masterAccount = deriveMasterSigner(mnemonicForMaster);
1428
- const publicClient = createJinnPublicClient(config.rpcUrl, NETWORK_CHAIN);
1492
+ const publicClient = createJinnPublicClient(config.rpcUrls, NETWORK_CHAIN);
1429
1493
  publicClientForLauncher = publicClient;
1430
- const masterWallet = createJinnWalletClient(config.rpcUrl, NETWORK_CHAIN, masterAccount);
1431
- // hjex.3: populate the restake callback now that mnemonic is available.
1432
- if (config.stakingMode === 'standard' && CHAIN_CONFIG.distributorAddress) {
1433
- const fleetStore = earningStore;
1434
- restakeCallbackRef.current = async (serviceId) => {
1435
- try {
1436
- const state = await fleetStore.load(NETWORK_CHAIN);
1437
- const svc = state.services.find(s => s.service_id === serviceId);
1438
- if (!svc)
1439
- return { ok: false, error: `service_not_found:${serviceId}` };
1440
- if (!svc.staking_address)
1441
- return { ok: false, error: 'staking_address_missing' };
1442
- await recoverEvictedServiceFn({
1443
- serviceDisplayIndex: Math.max(0, svc.index - 1),
1444
- serviceId,
1445
- stakingAddress: svc.staking_address,
1446
- distributorAddress: CHAIN_CONFIG.distributorAddress,
1447
- rpcUrl: config.rpcUrl,
1448
- chain: NETWORK_CHAIN,
1449
- mnemonic: mnemonicForMaster,
1450
- });
1451
- return { ok: true };
1452
- }
1453
- catch (err) {
1454
- return { ok: false, error: err instanceof Error ? err.message : String(err) };
1455
- }
1456
- };
1457
- }
1494
+ const masterWallet = createJinnWalletClient(config.rpcUrls, NETWORK_CHAIN, masterAccount);
1458
1495
  const evictionRecovery = config.stakingMode === 'standard' &&
1459
1496
  serviceId !== null &&
1460
1497
  stakingAddress &&
@@ -1513,7 +1550,7 @@ export async function main() {
1513
1550
  // the /build page rendered "Discovery unavailable" permanently.
1514
1551
  discoveryApiHolder.current = sharedDiscoveryApi;
1515
1552
  const adapter = new MechAdapter({
1516
- rpcUrl: config.rpcUrl,
1553
+ rpcUrl: config.rpcUrls,
1517
1554
  mechMarketplaceAddress: MARKETPLACE_ADDRESS,
1518
1555
  routerAddress: ROUTER_ADDRESS,
1519
1556
  mechContractAddress: mechAddress,
@@ -1529,12 +1566,18 @@ export async function main() {
1529
1566
  ? {
1530
1567
  discoveryApi: sharedDiscoveryApi,
1531
1568
  solverNetManifestCids: taskDiscoveryManifestCids,
1532
- // No explicit `onchainFromBlock` — let `MechAdapter`'s
1569
+ // No explicit `onchainFromBlock` by default — let `MechAdapter`'s
1533
1570
  // `DEFAULT_TASK_DISCOVERY_FROM_BLOCK` per-chain default flow
1534
1571
  // through. Hardcoding here shadowed the adapter's default and
1535
1572
  // re-introduced the ghost-task floor every release; removing the
1536
1573
  // shadow makes `adapter.ts` the single source of truth. See gh
1537
- // #300.
1574
+ // #300. An operator MAY opt in to a recent floor via
1575
+ // `taskDiscoveryOnchainFromBlock` to bound the canonical getLogs
1576
+ // scan (which otherwise parses a large history on the main thread
1577
+ // and can stall the loop) and lean on the indexer DiscoveryAPI.
1578
+ ...(config.taskDiscoveryOnchainFromBlock !== undefined
1579
+ ? { onchainFromBlock: config.taskDiscoveryOnchainFromBlock }
1580
+ : {}),
1538
1581
  ...(config.taskDiscoveryAllowedTaskIds?.length
1539
1582
  ? { allowedTaskIds: config.taskDiscoveryAllowedTaskIds }
1540
1583
  : {}),
@@ -1551,10 +1594,10 @@ export async function main() {
1551
1594
  const agentChainContracts = agentChain.contracts;
1552
1595
  const optimismPortalAddress = agentChainContracts?.portal?.[l1Chain.id]?.address;
1553
1596
  const disputeGameFactoryAddress = agentChainContracts?.disputeGameFactory?.[l1Chain.id]?.address;
1554
- const l2ProofClient = config.l2ProofRpcUrl
1555
- ? createJinnPublicClient(config.l2ProofRpcUrl, NETWORK_CHAIN)
1597
+ const l2ProofClient = config.l2ProofRpcUrls
1598
+ ? createJinnPublicClient(config.l2ProofRpcUrls, NETWORK_CHAIN)
1556
1599
  : undefined;
1557
- const agentClients = createClients(config.rpcUrl, agentPrivateKey, agentChain);
1600
+ const agentClients = createClients(config.rpcUrls, agentPrivateKey, agentChain);
1558
1601
  // ── L1 (Sepolia / Ethereum mainnet) clients for cross-chain JINN claim loop ──
1559
1602
  // Uses the agent EOA because MockMessenger.owner is the agent on testnet.
1560
1603
  // Same key as L2; only the chain differs.
@@ -1565,10 +1608,10 @@ export async function main() {
1565
1608
  distributorAddress: JINN_MVI_CONFIG.distributor,
1566
1609
  ethereumRpcUrl: config.ethereumRpcUrl,
1567
1610
  });
1568
- const l1ClientsForJinnClaim = shouldWireJinnClaimL1 && config.ethereumRpcUrl
1611
+ const l1ClientsForJinnClaim = shouldWireJinnClaimL1 && config.ethereumRpcUrls
1569
1612
  ? {
1570
- public: createJinnL1PublicClient(config.ethereumRpcUrl, config.jinnL1Network),
1571
- wallet: createJinnL1WalletClient(config.ethereumRpcUrl, config.jinnL1Network, privateKeyToAccount(agentPrivateKey)),
1613
+ public: createJinnL1PublicClient(config.ethereumRpcUrls, config.jinnL1Network),
1614
+ wallet: createJinnL1WalletClient(config.ethereumRpcUrls, config.jinnL1Network, privateKeyToAccount(agentPrivateKey)),
1572
1615
  }
1573
1616
  : undefined;
1574
1617
  const jinnClaimLoopConfig = buildJinnClaimLoopConfig({
@@ -1688,6 +1731,7 @@ export async function main() {
1688
1731
  hermesPath: config.hermesPath,
1689
1732
  hermesModel: config.hermesModel,
1690
1733
  hermesProvider: config.hermesProvider,
1734
+ hermesBaseUrl: config.hermesBaseUrl,
1691
1735
  hermesDoctorTimeoutMs: config.hermesDoctorTimeoutMs,
1692
1736
  codexPath: config.codexPath,
1693
1737
  codexDoctorTimeoutMs: config.codexDoctorTimeoutMs,
@@ -2029,6 +2073,8 @@ export async function main() {
2029
2073
  agentEoa: agentEoaAddress,
2030
2074
  safeAddress,
2031
2075
  agentPrivateKey,
2076
+ ipfsGatewayUrl: config.ipfsGatewayUrl,
2077
+ ...(sharedDiscoveryApi ? { discoveryApi: sharedDiscoveryApi } : {}),
2032
2078
  },
2033
2079
  logger: {
2034
2080
  info: (message) => console.log(message),
@@ -2096,6 +2142,21 @@ export async function main() {
2096
2142
  console.warn('[main] Corpus disabled (no DiscoveryAPI or on-chain identity registry); ' +
2097
2143
  'MCP record lookup and artifact acquisition network branches will be unavailable.');
2098
2144
  }
2145
+ const spendCap = buildSpendCapConfig(config, process.env);
2146
+ const aiUnits = buildAiUnitsConfig(config, process.env);
2147
+ if (aiUnits) {
2148
+ // Surface the resolved AI-units cap so an operator inspecting logs can
2149
+ // distinguish the baked-in default (100/2800) from a deliberate
2150
+ // `JINN_AI_UNITS_CEILING_OVERRIDE` raise (e.g. 10000/280000 in CI).
2151
+ // Source reflects the actual outcome: a malformed override falls back
2152
+ // to default and emits its own warn from resolveReferenceCeiling.
2153
+ const overrideSet = typeof process.env['JINN_AI_UNITS_CEILING_OVERRIDE'] === 'string' &&
2154
+ process.env['JINN_AI_UNITS_CEILING_OVERRIDE'].trim() !== '';
2155
+ const matchesDefault = aiUnits.capPerBlock === REFERENCE_CEILING.units_per_block &&
2156
+ aiUnits.capPerWeek === REFERENCE_CEILING.units_per_week;
2157
+ const source = overrideSet && !matchesDefault ? 'env' : 'default';
2158
+ console.log(`[ai-units] cap=${aiUnits.capPerBlock}/${aiUnits.capPerWeek} per (block, week) source=${source}`);
2159
+ }
2099
2160
  const daemon = new Daemon({
2100
2161
  adapter,
2101
2162
  runner,
@@ -2112,6 +2173,8 @@ export async function main() {
2112
2173
  creatorSafeAddress: safeAddress,
2113
2174
  corpusFactory,
2114
2175
  harnessReadinessRegistry,
2176
+ spendCap,
2177
+ aiUnits,
2115
2178
  status: {
2116
2179
  earningDir: config.earningDir,
2117
2180
  rpcUrl: config.rpcUrl,
@@ -2121,6 +2184,11 @@ export async function main() {
2121
2184
  tjinnTokenAddress: JINN_MVI_CONFIG.jinn,
2122
2185
  tjinnChainId: JINN_MVI_CONFIG.l1ChainId,
2123
2186
  tjinnDistributorAddress: JINN_MVI_CONFIG.distributor,
2187
+ // stOLAS L2 distributor — mirrors `CHAIN_CONFIG.distributorAddress`
2188
+ // used to gate the EvictionLoop (issue #651). Threaded through so the
2189
+ // SPA's autoRestake predicate keys off the same on-chain artifact as
2190
+ // the daemon's `evictionCheck` predicate (~line 2520 below).
2191
+ stOlasDistributorAddress: CHAIN_CONFIG.distributorAddress,
2124
2192
  network: config.network,
2125
2193
  pollIntervalMs: config.pollIntervalMs,
2126
2194
  masterEthDailyEstimateWei: config.masterEthDailyEstimateWei,
@@ -2132,6 +2200,8 @@ export async function main() {
2132
2200
  engine: config.engine,
2133
2201
  config,
2134
2202
  configPath: CONFIG_PATH ?? DEFAULT_CONFIG_PATH,
2203
+ spendCaps: spendCap?.caps,
2204
+ aiUnits,
2135
2205
  },
2136
2206
  rewardClaim: config.rewardClaimIntervalMs > 0
2137
2207
  ? {
@@ -2196,6 +2266,7 @@ export async function main() {
2196
2266
  CHAIN_CONFIG.distributorAddress
2197
2267
  ? {
2198
2268
  intervalMs: config.evictionCheckIntervalMs,
2269
+ reStakeThrottleMs: config.checkpointIntervalMs,
2199
2270
  store: earningStore,
2200
2271
  chain: NETWORK_CHAIN,
2201
2272
  readContract: (opts) => publicClient.readContract(opts),
@@ -2244,10 +2315,32 @@ export async function main() {
2244
2315
  }
2245
2316
  : undefined,
2246
2317
  });
2247
- // Write pidfile so `jinn stop` can find us.
2318
+ // Write pidfile so `jinn stop` can find us. First, refuse the run if another
2319
+ // daemon already owns this earning directory — see issue #649. The gate
2320
+ // handles all three branches (refuse-and-exit, unlink-stale-and-continue,
2321
+ // proceed); the writeFileSync below MUST stay outside the helper so the
2322
+ // "// DO NOT add store mutations above this line — see #649" invariant is
2323
+ // visible right here at the call site.
2324
+ // Deployment-readiness gate (#958). In a deployment context (JINN_STATE_DIR
2325
+ // set or a container/compose auth context) this fails loud and exits when a
2326
+ // hard check fails (writable-volume, state-on-volume, agent-cli-non-root).
2327
+ // Outside a deployment context it only logs advisories — a plain local
2328
+ // `jinn run` is NEVER newly gated here. Runs before the pidfile gate so an
2329
+ // unfit environment refuses before we touch the pidfile.
2330
+ await applyDeploymentReadinessGate({
2331
+ stateDir: config.stateDir,
2332
+ earningDir: config.earningDir,
2333
+ relayerUrl: undefined,
2334
+ runtimeMode: config.runtimeMode,
2335
+ }, {
2336
+ env: process.env,
2337
+ getuid: typeof process.getuid === 'function' ? process.getuid.bind(process) : undefined,
2338
+ detectAuthContext,
2339
+ fetch,
2340
+ });
2248
2341
  const pidPath = join(config.earningDir, 'daemon.pid');
2249
- const { writeFileSync, unlinkSync } = await import('node:fs');
2250
- writeFileSync(pidPath, String(process.pid) + '\n', 'utf-8');
2342
+ applyPidfileLivenessGate(pidPath);
2343
+ writeFileSyncMain(pidPath, String(process.pid) + '\n', 'utf-8');
2251
2344
  const removePidfile = () => {
2252
2345
  try {
2253
2346
  unlinkSync(pidPath);
@@ -2285,6 +2378,8 @@ export async function main() {
2285
2378
  catch {
2286
2379
  /* ignore */
2287
2380
  }
2381
+ // Issue #420: flush + close the rotating daemon file logger.
2382
+ closeFileLogger();
2288
2383
  }
2289
2384
  console.log('[main] Shutdown complete.');
2290
2385
  process.exit(exitCode);