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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (537) hide show
  1. package/README.md +6 -0
  2. package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +3 -3
  3. package/deployments/deployment-stolas-l2-baseSepolia-fast.json +23 -3
  4. package/deployments/deployment-task-coordinator-router-v3-baseSepolia-fast.json +34 -6
  5. package/dist/adapters/mech/adapter.d.ts +21 -1
  6. package/dist/adapters/mech/adapter.js +107 -52
  7. package/dist/adapters/mech/adapter.js.map +1 -1
  8. package/dist/adapters/mech/contracts.d.ts +174 -13
  9. package/dist/adapters/mech/contracts.js +99 -49
  10. package/dist/adapters/mech/contracts.js.map +1 -1
  11. package/dist/adapters/mech/safe-revert.d.ts +4 -0
  12. package/dist/adapters/mech/safe-revert.js +5 -1
  13. package/dist/adapters/mech/safe-revert.js.map +1 -1
  14. package/dist/adapters/mech/safe.js +77 -1
  15. package/dist/adapters/mech/safe.js.map +1 -1
  16. package/dist/adapters/mech/types.d.ts +4 -42
  17. package/dist/adapters/mech/types.js +8 -20
  18. package/dist/adapters/mech/types.js.map +1 -1
  19. package/dist/adapters/mech/verdict-code.js +1 -1
  20. package/dist/adapters/mech/verdict-code.js.map +1 -1
  21. package/dist/api/bootstrap-endpoint.d.ts +1 -0
  22. package/dist/api/bootstrap-endpoint.js +1 -0
  23. package/dist/api/bootstrap-endpoint.js.map +1 -1
  24. package/dist/api/discovery-endpoint.d.ts +1 -0
  25. package/dist/api/discovery-endpoint.js +24 -0
  26. package/dist/api/discovery-endpoint.js.map +1 -1
  27. package/dist/api/fleet-build.d.ts +1 -7
  28. package/dist/api/fleet-build.js +0 -7
  29. package/dist/api/fleet-build.js.map +1 -1
  30. package/dist/api/gather-status.d.ts +26 -17
  31. package/dist/api/gather-status.js +57 -516
  32. package/dist/api/gather-status.js.map +1 -1
  33. package/dist/api/harness-auth-status-endpoint.d.ts +21 -0
  34. package/dist/api/harness-auth-status-endpoint.js +17 -0
  35. package/dist/api/harness-auth-status-endpoint.js.map +1 -0
  36. package/dist/api/loop-completion-build.d.ts +79 -0
  37. package/dist/api/loop-completion-build.js +155 -0
  38. package/dist/api/loop-completion-build.js.map +1 -0
  39. package/dist/api/operator-artifacts-endpoint.js +1 -1
  40. package/dist/api/operator-artifacts-endpoint.js.map +1 -1
  41. package/dist/api/peers.js +2 -0
  42. package/dist/api/peers.js.map +1 -1
  43. package/dist/api/rewards-build.d.ts +8 -1
  44. package/dist/api/rewards-build.js +32 -4
  45. package/dist/api/rewards-build.js.map +1 -1
  46. package/dist/api/rewards-endpoint.d.ts +12 -0
  47. package/dist/api/rewards-endpoint.js +46 -0
  48. package/dist/api/rewards-endpoint.js.map +1 -0
  49. package/dist/api/server.d.ts +6 -16
  50. package/dist/api/server.js +29 -26
  51. package/dist/api/server.js.map +1 -1
  52. package/dist/api/setup-endpoints.d.ts +41 -0
  53. package/dist/api/setup-endpoints.js +258 -45
  54. package/dist/api/setup-endpoints.js.map +1 -1
  55. package/dist/api/solvernets-endpoints.js +4 -1
  56. package/dist/api/solvernets-endpoints.js.map +1 -1
  57. package/dist/api/status-build.d.ts +71 -94
  58. package/dist/api/status-build.js +11 -77
  59. package/dist/api/status-build.js.map +1 -1
  60. package/dist/api/status-rollup-build.d.ts +0 -4
  61. package/dist/api/status-rollup-build.js +0 -4
  62. package/dist/api/status-rollup-build.js.map +1 -1
  63. package/dist/api/stop-hook.d.ts +1 -1
  64. package/dist/api/stop-hook.js +1 -1
  65. package/dist/api/stop-hook.js.map +1 -1
  66. package/dist/build-info.json +4 -4
  67. package/dist/build-meta.json +1 -1
  68. package/dist/captures/live-publisher.d.ts +9 -0
  69. package/dist/captures/live-publisher.js +1 -0
  70. package/dist/captures/live-publisher.js.map +1 -1
  71. package/dist/captures/publish.d.ts +11 -0
  72. package/dist/captures/publish.js +15 -5
  73. package/dist/captures/publish.js.map +1 -1
  74. package/dist/cli/commands/codedigest-revert-check.js +6 -2
  75. package/dist/cli/commands/codedigest-revert-check.js.map +1 -1
  76. package/dist/cli/commands/doctor.d.ts +3 -0
  77. package/dist/cli/commands/doctor.js +36 -4
  78. package/dist/cli/commands/doctor.js.map +1 -1
  79. package/dist/cli/commands/eval.d.ts +87 -0
  80. package/dist/cli/commands/eval.js +481 -0
  81. package/dist/cli/commands/eval.js.map +1 -0
  82. package/dist/cli/commands/rewards.d.ts +2 -0
  83. package/dist/cli/commands/rewards.js +39 -10
  84. package/dist/cli/commands/rewards.js.map +1 -1
  85. package/dist/cli/commands/solver-nets.js +68 -0
  86. package/dist/cli/commands/solver-nets.js.map +1 -1
  87. package/dist/cli/commands/status.js +0 -1
  88. package/dist/cli/commands/status.js.map +1 -1
  89. package/dist/cli/commands/update.js +8 -0
  90. package/dist/cli/commands/update.js.map +1 -1
  91. package/dist/cli/commands/version.js +4 -0
  92. package/dist/cli/commands/version.js.map +1 -1
  93. package/dist/cli/index.js +2 -0
  94. package/dist/cli/index.js.map +1 -1
  95. package/dist/cli/introspection-context.js +0 -3
  96. package/dist/cli/introspection-context.js.map +1 -1
  97. package/dist/config.d.ts +158 -541
  98. package/dist/config.js +189 -196
  99. package/dist/config.js.map +1 -1
  100. package/dist/corpus/acquire.d.ts +7 -6
  101. package/dist/corpus/acquire.js +10 -10
  102. package/dist/corpus/acquire.js.map +1 -1
  103. package/dist/corpus/fetch-artifact.d.ts +21 -0
  104. package/dist/corpus/fetch-artifact.js +33 -0
  105. package/dist/corpus/fetch-artifact.js.map +1 -0
  106. package/dist/corpus/index.d.ts +2 -2
  107. package/dist/corpus/route-resolver.d.ts +3 -3
  108. package/dist/corpus/route-resolver.js +3 -3
  109. package/dist/daemon/ai-units-gate.d.ts +6 -6
  110. package/dist/daemon/ai-units-gate.js +11 -10
  111. package/dist/daemon/ai-units-gate.js.map +1 -1
  112. package/dist/daemon/balance-topup-loop.js +3 -0
  113. package/dist/daemon/balance-topup-loop.js.map +1 -1
  114. package/dist/daemon/checkpoint-loop.js +2 -2
  115. package/dist/daemon/creator.d.ts +1 -0
  116. package/dist/daemon/creator.js +26 -14
  117. package/dist/daemon/creator.js.map +1 -1
  118. package/dist/daemon/daemon.d.ts +15 -10
  119. package/dist/daemon/daemon.js +71 -39
  120. package/dist/daemon/daemon.js.map +1 -1
  121. package/dist/daemon/delivery-watcher.d.ts +9 -0
  122. package/dist/daemon/delivery-watcher.js +24 -1
  123. package/dist/daemon/delivery-watcher.js.map +1 -1
  124. package/dist/daemon/eviction-loop.d.ts +7 -0
  125. package/dist/daemon/eviction-loop.js +19 -3
  126. package/dist/daemon/eviction-loop.js.map +1 -1
  127. package/dist/daemon/join-applier.d.ts +35 -0
  128. package/dist/daemon/join-applier.js +49 -0
  129. package/dist/daemon/join-applier.js.map +1 -0
  130. package/dist/daemon/loop-heartbeat.d.ts +34 -0
  131. package/dist/daemon/loop-heartbeat.js +38 -0
  132. package/dist/daemon/loop-heartbeat.js.map +1 -0
  133. package/dist/daemon/reward-claim-loop.js +4 -1
  134. package/dist/daemon/reward-claim-loop.js.map +1 -1
  135. package/dist/daemon/skip-log-dedup.d.ts +1 -1
  136. package/dist/daemon/skip-log-dedup.js +3 -0
  137. package/dist/daemon/skip-log-dedup.js.map +1 -1
  138. package/dist/daemon/watchdog-loop.d.ts +84 -0
  139. package/dist/daemon/watchdog-loop.js +91 -0
  140. package/dist/daemon/watchdog-loop.js.map +1 -0
  141. package/dist/dashboard/assets/index-BsrAAmvC.js +171 -0
  142. package/dist/dashboard/assets/index-DQOWJ2SF.css +1 -0
  143. package/dist/dashboard/index.html +2 -2
  144. package/dist/discovery/http.d.ts +17 -0
  145. package/dist/discovery/http.js +295 -25
  146. package/dist/discovery/http.js.map +1 -1
  147. package/dist/discovery/onchain.js +158 -2
  148. package/dist/discovery/onchain.js.map +1 -1
  149. package/dist/discovery/types.d.ts +106 -0
  150. package/dist/discovery/types.js +40 -0
  151. package/dist/discovery/types.js.map +1 -1
  152. package/dist/discovery/with-fallback.js +14 -0
  153. package/dist/discovery/with-fallback.js.map +1 -1
  154. package/dist/earning/bootstrap.d.ts +25 -0
  155. package/dist/earning/bootstrap.js +79 -28
  156. package/dist/earning/bootstrap.js.map +1 -1
  157. package/dist/earning/contracts.d.ts +0 -229
  158. package/dist/earning/contracts.js +4 -184
  159. package/dist/earning/contracts.js.map +1 -1
  160. package/dist/earning/faucet-topup-store.d.ts +41 -0
  161. package/dist/earning/faucet-topup-store.js +89 -0
  162. package/dist/earning/faucet-topup-store.js.map +1 -0
  163. package/dist/earning/faucet.d.ts +1 -1
  164. package/dist/earning/faucet.js +2 -2
  165. package/dist/earning/faucet.js.map +1 -1
  166. package/dist/earning/safe-adapter.js +11 -0
  167. package/dist/earning/safe-adapter.js.map +1 -1
  168. package/dist/earning/stolas-claim.js +8 -8
  169. package/dist/earning/stolas-claim.js.map +1 -1
  170. package/dist/earning/{jinn-rewards.d.ts → stolas-staking.d.ts} +4 -8
  171. package/dist/earning/{jinn-rewards.js → stolas-staking.js} +6 -10
  172. package/dist/earning/stolas-staking.js.map +1 -0
  173. package/dist/earning/testnet-setup-migration.d.ts +1 -0
  174. package/dist/earning/testnet-setup-migration.js +7 -2
  175. package/dist/earning/testnet-setup-migration.js.map +1 -1
  176. package/dist/earning/types.d.ts +1 -1
  177. package/dist/earning/types.js +1 -1
  178. package/dist/earning/types.js.map +1 -1
  179. package/dist/earning/viem-clients.d.ts +3 -19
  180. package/dist/earning/viem-clients.js +4 -31
  181. package/dist/earning/viem-clients.js.map +1 -1
  182. package/dist/eval/eval-harness-run.d.ts +63 -0
  183. package/dist/eval/eval-harness-run.js +123 -0
  184. package/dist/eval/eval-harness-run.js.map +1 -0
  185. package/dist/eval/orchestrator.d.ts +224 -0
  186. package/dist/eval/orchestrator.js +250 -0
  187. package/dist/eval/orchestrator.js.map +1 -0
  188. package/dist/eval/paired.d.ts +68 -0
  189. package/dist/eval/paired.js +93 -0
  190. package/dist/eval/paired.js.map +1 -0
  191. package/dist/eval/resolve-slate-tasks.d.ts +35 -0
  192. package/dist/eval/resolve-slate-tasks.js +56 -0
  193. package/dist/eval/resolve-slate-tasks.js.map +1 -0
  194. package/dist/eval/screen-discovery.d.ts +22 -0
  195. package/dist/eval/screen-discovery.js +71 -0
  196. package/dist/eval/screen-discovery.js.map +1 -0
  197. package/dist/eval/screen-progress.d.ts +41 -0
  198. package/dist/eval/screen-progress.js +60 -0
  199. package/dist/eval/screen-progress.js.map +1 -0
  200. package/dist/eval/screen-runner.d.ts +30 -0
  201. package/dist/eval/screen-runner.js +289 -0
  202. package/dist/eval/screen-runner.js.map +1 -0
  203. package/dist/eval/screen.d.ts +107 -0
  204. package/dist/eval/screen.js +159 -0
  205. package/dist/eval/screen.js.map +1 -0
  206. package/dist/eval/slope.d.ts +29 -0
  207. package/dist/eval/slope.js +46 -0
  208. package/dist/eval/slope.js.map +1 -0
  209. package/dist/eval/train-sequence.d.ts +35 -0
  210. package/dist/eval/train-sequence.js +59 -0
  211. package/dist/eval/train-sequence.js.map +1 -0
  212. package/dist/eval/wilson.d.ts +45 -0
  213. package/dist/eval/wilson.js +48 -0
  214. package/dist/eval/wilson.js.map +1 -0
  215. package/dist/events/types.d.ts +1 -1
  216. package/dist/events/types.js +1 -1
  217. package/dist/events/types.js.map +1 -1
  218. package/dist/harnesses/auth-source.d.ts +51 -0
  219. package/dist/harnesses/auth-source.js +155 -0
  220. package/dist/harnesses/auth-source.js.map +1 -0
  221. package/dist/harnesses/engine/canonical-json.js +5 -3
  222. package/dist/harnesses/engine/canonical-json.js.map +1 -1
  223. package/dist/harnesses/engine/engine.d.ts +32 -0
  224. package/dist/harnesses/engine/engine.js +76 -9
  225. package/dist/harnesses/engine/engine.js.map +1 -1
  226. package/dist/harnesses/engine/packaging.js +5 -5
  227. package/dist/harnesses/engine/packaging.js.map +1 -1
  228. package/dist/harnesses/engine/persistence.d.ts +17 -0
  229. package/dist/harnesses/engine/persistence.js +28 -0
  230. package/dist/harnesses/engine/persistence.js.map +1 -1
  231. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +1 -1
  232. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js +1 -1
  233. package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -1
  234. package/dist/harnesses/impls/hermes-agent/adapter.d.ts +2 -0
  235. package/dist/harnesses/impls/hermes-agent/adapter.js +8 -5
  236. package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
  237. package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +1 -0
  238. package/dist/harnesses/impls/hermes-agent/bootstrap.js +6 -1
  239. package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
  240. package/dist/harnesses/impls/hermes-agent/harness.d.ts +25 -3
  241. package/dist/harnesses/impls/hermes-agent/harness.js +89 -5
  242. package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
  243. package/dist/harnesses/impls/index.d.ts +2 -0
  244. package/dist/harnesses/impls/index.js +10 -1
  245. package/dist/harnesses/impls/index.js.map +1 -1
  246. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.d.ts +34 -0
  247. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js +111 -0
  248. package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js.map +1 -0
  249. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.d.ts +24 -0
  250. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js +19 -0
  251. package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js.map +1 -0
  252. package/dist/harnesses/impls/jinn-repo-evaluator/harness.d.ts +64 -0
  253. package/dist/harnesses/impls/jinn-repo-evaluator/harness.js +125 -0
  254. package/dist/harnesses/impls/jinn-repo-evaluator/harness.js.map +1 -0
  255. package/dist/harnesses/impls/jinn-repo-evaluator/repro.d.ts +32 -0
  256. package/dist/harnesses/impls/jinn-repo-evaluator/repro.js +73 -0
  257. package/dist/harnesses/impls/jinn-repo-evaluator/repro.js.map +1 -0
  258. package/dist/harnesses/impls/learner/adapters/claude-code.js +5 -0
  259. package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
  260. package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +8 -0
  261. package/dist/harnesses/impls/learner/adapters/codex-code.js +91 -11
  262. package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
  263. package/dist/harnesses/impls/learner/harness.d.ts +29 -1
  264. package/dist/harnesses/impls/learner/harness.js +85 -1
  265. package/dist/harnesses/impls/learner/harness.js.map +1 -1
  266. package/dist/harnesses/impls/learner/harvest.d.ts +2 -0
  267. package/dist/harnesses/impls/learner/harvest.js +51 -1
  268. package/dist/harnesses/impls/learner/harvest.js.map +1 -1
  269. package/dist/harnesses/impls/learner/plugin-path.js +1 -0
  270. package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
  271. package/dist/harnesses/impls/stub.d.ts +2 -2
  272. package/dist/harnesses/impls/stub.js +2 -2
  273. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +3 -1
  274. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
  275. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +2 -2
  276. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +3 -1
  277. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
  278. package/dist/harnesses/readiness-registry.d.ts +16 -0
  279. package/dist/harnesses/readiness-registry.js +28 -6
  280. package/dist/harnesses/readiness-registry.js.map +1 -1
  281. package/dist/harnesses/types.d.ts +26 -0
  282. package/dist/learner/revert-decision.d.ts +16 -1
  283. package/dist/learner/revert-decision.js +38 -18
  284. package/dist/learner/revert-decision.js.map +1 -1
  285. package/dist/learner/revert-stats.d.ts +14 -0
  286. package/dist/learner/revert-stats.js +42 -0
  287. package/dist/learner/revert-stats.js.map +1 -1
  288. package/dist/local-provider-url.d.ts +3 -0
  289. package/dist/local-provider-url.js +28 -0
  290. package/dist/local-provider-url.js.map +1 -0
  291. package/dist/main.js +125 -120
  292. package/dist/main.js.map +1 -1
  293. package/dist/mcp/acquire-artifact.d.ts +3 -3
  294. package/dist/mcp/acquire-artifact.js +3 -3
  295. package/dist/mcp/operator-server.js +1 -1
  296. package/dist/mcp/operator-server.js.map +1 -1
  297. package/dist/mcp/server.js +5 -6
  298. package/dist/mcp/server.js.map +1 -1
  299. package/dist/observability/emit-event.d.ts +1 -1
  300. package/dist/observability/emit-event.js +0 -4
  301. package/dist/observability/emit-event.js.map +1 -1
  302. package/dist/plugins/learner/.claude-plugin/plugin.json +1 -1
  303. package/dist/plugins/learner/.codex-plugin/plugin.json +1 -1
  304. package/dist/plugins/learner/hooks/session-start +30 -1
  305. package/dist/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
  306. package/dist/preflight/deployment-readiness.d.ts +127 -0
  307. package/dist/preflight/deployment-readiness.js +308 -0
  308. package/dist/preflight/deployment-readiness.js.map +1 -0
  309. package/dist/preflight/pidfile-liveness.d.ts +7 -1
  310. package/dist/preflight/pidfile-liveness.js +14 -0
  311. package/dist/preflight/pidfile-liveness.js.map +1 -1
  312. package/dist/rpc/transport.d.ts +43 -5
  313. package/dist/rpc/transport.js +131 -30
  314. package/dist/rpc/transport.js.map +1 -1
  315. package/dist/scripts/swe-rebench-v2-seed-pool.json +2 -1
  316. package/dist/solver-nets/registry.d.ts +19 -0
  317. package/dist/solver-nets/registry.js +95 -66
  318. package/dist/solver-nets/registry.js.map +1 -1
  319. package/dist/solver-types/_jinn-repo-pool.d.ts +27 -0
  320. package/dist/solver-types/_jinn-repo-pool.js +27 -0
  321. package/dist/solver-types/_jinn-repo-pool.js.map +1 -0
  322. package/dist/solver-types/_swe-rebench-v2-held-out-slate.d.ts +76 -0
  323. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js +156 -0
  324. package/dist/solver-types/_swe-rebench-v2-held-out-slate.js.map +1 -0
  325. package/dist/solver-types/_swe-rebench-v2-pool-recovery.d.ts +81 -0
  326. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js +116 -0
  327. package/dist/solver-types/_swe-rebench-v2-pool-recovery.js.map +1 -0
  328. package/dist/solver-types/_swe-rebench-v2-state.d.ts +9 -0
  329. package/dist/solver-types/_swe-rebench-v2-state.js +14 -0
  330. package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
  331. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +30 -0
  332. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +40 -0
  333. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  334. package/dist/solver-types/index.js +2 -0
  335. package/dist/solver-types/index.js.map +1 -1
  336. package/dist/solver-types/jinn-repo-admit.d.ts +17 -0
  337. package/dist/solver-types/jinn-repo-admit.js +16 -0
  338. package/dist/solver-types/jinn-repo-admit.js.map +1 -0
  339. package/dist/solver-types/jinn-repo-auto.d.ts +60 -0
  340. package/dist/solver-types/jinn-repo-auto.js +163 -0
  341. package/dist/solver-types/jinn-repo-auto.js.map +1 -0
  342. package/dist/solver-types/jinn-repo-definition.d.ts +15 -0
  343. package/dist/solver-types/jinn-repo-definition.js +34 -0
  344. package/dist/solver-types/jinn-repo-definition.js.map +1 -0
  345. package/dist/solver-types/jinn-repo-extract.d.ts +16 -0
  346. package/dist/solver-types/jinn-repo-extract.js +32 -0
  347. package/dist/solver-types/jinn-repo-extract.js.map +1 -0
  348. package/dist/solver-types/jinn-repo.d.ts +21 -0
  349. package/dist/solver-types/jinn-repo.js +23 -0
  350. package/dist/solver-types/jinn-repo.js.map +1 -0
  351. package/dist/solver-types/learner-loop-test.js +1 -1
  352. package/dist/solver-types/learner-loop-test.js.map +1 -1
  353. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v1.json +20 -0
  354. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.json +19 -0
  355. package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.screening-report.json +628 -0
  356. package/dist/solver-types/solver-type.d.ts +8 -0
  357. package/dist/solver-types/swe-rebench-v2.d.ts +2 -0
  358. package/dist/solver-types/swe-rebench-v2.js +115 -10
  359. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  360. package/dist/solvernets/launched-record-dispatcher.d.ts +5 -0
  361. package/dist/solvernets/launched-record-dispatcher.js +8 -1
  362. package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
  363. package/dist/solvernets/registry-client-erc8004.js +29 -37
  364. package/dist/solvernets/registry-client-erc8004.js.map +1 -1
  365. package/dist/solvernets/registry-client.d.ts +6 -0
  366. package/dist/solvernets/store.d.ts +1 -1
  367. package/dist/solvernets/store.js +8 -3
  368. package/dist/solvernets/store.js.map +1 -1
  369. package/dist/spend/ai-units-config.d.ts +10 -0
  370. package/dist/spend/ai-units-config.js +7 -1
  371. package/dist/spend/ai-units-config.js.map +1 -1
  372. package/dist/spend/ai-units.d.ts +51 -0
  373. package/dist/spend/ai-units.js +73 -0
  374. package/dist/spend/ai-units.js.map +1 -1
  375. package/dist/spend/record.js +12 -5
  376. package/dist/spend/record.js.map +1 -1
  377. package/dist/spend/usage.js +39 -3
  378. package/dist/spend/usage.js.map +1 -1
  379. package/dist/store/store.d.ts +92 -5
  380. package/dist/store/store.js +184 -7
  381. package/dist/store/store.js.map +1 -1
  382. package/dist/trajectory/emit.d.ts +6 -0
  383. package/dist/trajectory/emit.js +9 -1
  384. package/dist/trajectory/emit.js.map +1 -1
  385. package/dist/trajectory/harness-bundle-schema.d.ts +1 -1
  386. package/dist/trajectory/harness-bundle-schema.js +1 -1
  387. package/dist/trajectory/harness-bundle-schema.js.map +1 -1
  388. package/dist/trajectory/schema.d.ts +1 -1
  389. package/dist/trajectory/schema.js +1 -1
  390. package/dist/trajectory/schema.js.map +1 -1
  391. package/dist/trajectory/scrub/build.d.ts +27 -0
  392. package/dist/trajectory/scrub/build.js +43 -0
  393. package/dist/trajectory/scrub/build.js.map +1 -0
  394. package/dist/trajectory/scrub/emit-scrub.d.ts +41 -0
  395. package/dist/trajectory/scrub/emit-scrub.js +88 -0
  396. package/dist/trajectory/scrub/emit-scrub.js.map +1 -0
  397. package/dist/trajectory/scrub/key-policy.d.ts +20 -0
  398. package/dist/trajectory/scrub/key-policy.js +43 -0
  399. package/dist/trajectory/scrub/key-policy.js.map +1 -0
  400. package/dist/trajectory/scrub/ml-pii-stage.d.ts +24 -0
  401. package/dist/trajectory/scrub/ml-pii-stage.js +43 -0
  402. package/dist/trajectory/scrub/ml-pii-stage.js.map +1 -0
  403. package/dist/trajectory/scrub/openredaction-stage.d.ts +14 -0
  404. package/dist/trajectory/scrub/openredaction-stage.js +36 -0
  405. package/dist/trajectory/scrub/openredaction-stage.js.map +1 -0
  406. package/dist/trajectory/scrub/pii-build.d.ts +31 -0
  407. package/dist/trajectory/scrub/pii-build.js +64 -0
  408. package/dist/trajectory/scrub/pii-build.js.map +1 -0
  409. package/dist/trajectory/scrub/pipeline.d.ts +16 -0
  410. package/dist/trajectory/scrub/pipeline.js +26 -0
  411. package/dist/trajectory/scrub/pipeline.js.map +1 -0
  412. package/dist/trajectory/scrub/secretlint-stage.d.ts +13 -0
  413. package/dist/trajectory/scrub/secretlint-stage.js +121 -0
  414. package/dist/trajectory/scrub/secretlint-stage.js.map +1 -0
  415. package/dist/trajectory/scrub/transformers-detector.d.ts +35 -0
  416. package/dist/trajectory/scrub/transformers-detector.js +68 -0
  417. package/dist/trajectory/scrub/transformers-detector.js.map +1 -0
  418. package/dist/trajectory/scrub/types.d.ts +25 -0
  419. package/dist/trajectory/scrub/types.js +2 -0
  420. package/dist/trajectory/scrub/types.js.map +1 -0
  421. package/dist/trajectory/transcript-parsers/types.d.ts +1 -1
  422. package/dist/trajectory/transcript-parsers/types.js +1 -1
  423. package/dist/trajectory/transcript-parsers/types.js.map +1 -1
  424. package/dist/tx-retry.d.ts +12 -0
  425. package/dist/tx-retry.js +41 -12
  426. package/dist/tx-retry.js.map +1 -1
  427. package/dist/types/envelope.d.ts +1 -1
  428. package/dist/types/envelope.js +1 -1
  429. package/dist/types/envelope.js.map +1 -1
  430. package/dist/types/payloads/index.d.ts +1 -1
  431. package/dist/types/payloads/index.js +7 -1
  432. package/dist/types/payloads/index.js.map +1 -1
  433. package/dist/types/payloads/portfolio-v0.d.ts +1 -1
  434. package/dist/types/payloads/portfolio-v0.js +1 -1
  435. package/dist/types/payloads/portfolio-v0.js.map +1 -1
  436. package/dist/types/payloads/prediction-apy-v0.d.ts +1 -1
  437. package/dist/types/payloads/prediction-apy-v0.js +1 -1
  438. package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
  439. package/dist/types/payloads/prediction-v0.d.ts +1 -1
  440. package/dist/types/payloads/prediction-v0.js +1 -1
  441. package/dist/types/payloads/prediction-v0.js.map +1 -1
  442. package/dist/types/portfolio.d.ts +1 -1
  443. package/dist/types/portfolio.js +1 -1
  444. package/dist/types/portfolio.js.map +1 -1
  445. package/dist/types/prediction-apy.d.ts +1 -1
  446. package/dist/types/prediction-apy.js +1 -1
  447. package/dist/types/prediction-apy.js.map +1 -1
  448. package/dist/types/prediction.d.ts +1 -1
  449. package/dist/types/prediction.js +1 -1
  450. package/dist/types/prediction.js.map +1 -1
  451. package/dist/types/session-provenance.d.ts +1 -1
  452. package/dist/types/session-provenance.js +1 -1
  453. package/dist/types/session-provenance.js.map +1 -1
  454. package/dist/types/task-document.d.ts +315 -1
  455. package/dist/types/task-document.js +9 -1
  456. package/dist/types/task-document.js.map +1 -1
  457. package/dist/types/task.d.ts +29 -1
  458. package/dist/types/task.js +1 -1
  459. package/dist/types/task.js.map +1 -1
  460. package/dist/types/window.d.ts +1 -1
  461. package/dist/types/window.js +1 -1
  462. package/dist/types/window.js.map +1 -1
  463. package/dist/vendor/@jinn-network/sdk/dist/checkpoint.d.ts +1 -1
  464. package/dist/vendor/@jinn-network/sdk/dist/checkpoint.js +1 -1
  465. package/dist/vendor/@jinn-network/sdk/dist/contracts.d.ts +3 -2
  466. package/dist/vendor/@jinn-network/sdk/dist/contracts.js +49 -0
  467. package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.d.ts +44 -0
  468. package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.js +25 -0
  469. package/dist/vendor/@jinn-network/sdk/dist/json-schema.d.ts +1 -1
  470. package/dist/vendor/@jinn-network/sdk/dist/json-schema.js +1 -1
  471. package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.d.ts +38 -0
  472. package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.js +22 -0
  473. package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +1 -1
  474. package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +1 -1
  475. package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.d.ts +1 -1
  476. package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.js +1 -1
  477. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +109 -2
  478. package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +26 -2
  479. package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.d.ts +1 -1
  480. package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.js +1 -1
  481. package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.d.ts +4 -0
  482. package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.js +2 -0
  483. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +1 -1
  484. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -1
  485. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.d.ts +65 -0
  486. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.js +123 -0
  487. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.d.ts +2 -2
  488. package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js +1 -1
  489. package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.d.ts +1 -1
  490. package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.js +1 -1
  491. package/dist/vendor/@jinn-network/sdk/package.json +9 -1
  492. package/docker-compose.yml +3 -2
  493. package/package.json +36 -26
  494. package/plugins/jinn-repo-runtime/.claude-plugin/plugin.json +5 -0
  495. package/plugins/jinn-repo-runtime/.codex-plugin/plugin.json +39 -0
  496. package/plugins/jinn-repo-runtime/README.md +27 -0
  497. package/plugins/jinn-repo-runtime/hooks/hooks.json +16 -0
  498. package/plugins/jinn-repo-runtime/hooks/session-start +73 -0
  499. package/plugins/jinn-repo-runtime/jinn.plugin.json +11 -0
  500. package/plugins/jinn-repo-runtime/skills/task/SKILL.md +92 -0
  501. package/plugins/learner/.claude-plugin/plugin.json +1 -1
  502. package/plugins/learner/.codex-plugin/plugin.json +1 -1
  503. package/plugins/learner/hooks/session-start +30 -1
  504. package/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
  505. package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
  506. package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
  507. package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +0 -55
  508. package/deployments/deployment-jinn-mvi-l1-sepolia.json +0 -55
  509. package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +0 -13
  510. package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +0 -15
  511. package/dist/daemon/jinn-claim-loop-canonical.d.ts +0 -207
  512. package/dist/daemon/jinn-claim-loop-canonical.js +0 -296
  513. package/dist/daemon/jinn-claim-loop-canonical.js.map +0 -1
  514. package/dist/daemon/jinn-claim-loop-mock.d.ts +0 -61
  515. package/dist/daemon/jinn-claim-loop-mock.js +0 -122
  516. package/dist/daemon/jinn-claim-loop-mock.js.map +0 -1
  517. package/dist/daemon/jinn-claim-loop-wiring.d.ts +0 -33
  518. package/dist/daemon/jinn-claim-loop-wiring.js +0 -40
  519. package/dist/daemon/jinn-claim-loop-wiring.js.map +0 -1
  520. package/dist/daemon/jinn-claim-loop.d.ts +0 -130
  521. package/dist/daemon/jinn-claim-loop.js +0 -328
  522. package/dist/daemon/jinn-claim-loop.js.map +0 -1
  523. package/dist/dashboard/assets/index-CzKxvMcU.css +0 -32
  524. package/dist/dashboard/assets/index-yVemxHot.js +0 -351
  525. package/dist/earning/jinn-rewards.js.map +0 -1
  526. package/dist/scripts/donation-consumption-acceptance.d.ts +0 -85
  527. package/dist/scripts/donation-consumption-acceptance.js +0 -1382
  528. package/dist/scripts/donation-consumption-acceptance.js.map +0 -1
  529. package/dist/x402/acquire.d.ts +0 -17
  530. package/dist/x402/acquire.js +0 -49
  531. package/dist/x402/acquire.js.map +0 -1
  532. package/dist/x402/facilitator.d.ts +0 -11
  533. package/dist/x402/facilitator.js +0 -52
  534. package/dist/x402/facilitator.js.map +0 -1
  535. package/dist/x402/handler.d.ts +0 -27
  536. package/dist/x402/handler.js +0 -236
  537. package/dist/x402/handler.js.map +0 -1
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Hot-apply a SolverNet join to the RUNNING daemon (#1037).
3
+ *
4
+ * Four subsystems consume `joinedSolverNets`. Two re-read their config object
5
+ * live (the MechAdapter task-discovery cid array and the engine's
6
+ * JoinedSolverNetsView); two are frozen at construction (the
7
+ * HarnessReadinessRegistry cid→harness map and the SolverNetRegistry). This
8
+ * applier mutates all four on the live instances so a join applied to a
9
+ * running daemon takes effect within one claim poll — no restart.
10
+ *
11
+ * Wired in main.ts via `joinApplierHolder` (eager-register/late-populate,
12
+ * mirroring harnessReadinessRegistryHolder). The join endpoint
13
+ * (POST /v1/operator/join/:cid) calls it after writing config to disk.
14
+ */
15
+ import { registerJoinedNet, } from '../solver-nets/registry.js';
16
+ export function createJoinApplier(deps) {
17
+ return async (entry) => {
18
+ const cid = entry.manifestCid;
19
+ // (a) task-discovery cid set — solver role only (mirrors main.ts), deduped
20
+ // so a re-apply does not double-push.
21
+ if (entry.roles.includes('solver') && !deps.taskDiscovery.solverNetManifestCids.includes(cid)) {
22
+ deps.taskDiscovery.solverNetManifestCids.push(cid);
23
+ }
24
+ // (b) engine eligibility view.
25
+ deps.view.set(cid, { roles: entry.roles });
26
+ // (c) readiness gate map — mirror boot's buildHarnessReadinessRegistry
27
+ // (main.ts), which adds an entry whenever `entry.harness` is truthy,
28
+ // role-agnostic. The endpoint persists `harness` for evaluator-only joins
29
+ // too, so gating this on the solver role made the live map diverge from the
30
+ // post-restart map and silently blocked evaluator-only claims.
31
+ if (entry.harness) {
32
+ await deps.readiness.setJoined(cid, { harnessName: entry.harness, roles: entry.roles });
33
+ }
34
+ // (d) SolverNet registry — shared boot/live registration (Task 1).
35
+ // Clear any prior registration under this net's name first so a re-join
36
+ // updates in place rather than inserting a phantom `name#2` duplicate
37
+ // (registerJoinedNet → register is non-idempotent by name). Boot rebuilds
38
+ // from scratch and never re-applies, so this only affects the live path.
39
+ deps.registry.unregister(entry.name ?? cid);
40
+ await registerJoinedNet(deps.registry, cid, entry);
41
+ // Keep the in-memory config consistent so launcher read-callbacks and any
42
+ // in-process re-read see the new entry. The on-disk write is owned by the
43
+ // join endpoint.
44
+ if (!deps.config.joinedSolverNets)
45
+ deps.config.joinedSolverNets = {};
46
+ deps.config.joinedSolverNets[cid] = entry;
47
+ };
48
+ }
49
+ //# sourceMappingURL=join-applier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-applier.js","sourceRoot":"","sources":["../../src/daemon/join-applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAEL,iBAAiB,GAElB,MAAM,4BAA4B,CAAC;AAiBpC,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,OAAO,KAAK,EAAE,KAA4B,EAAiB,EAAE;QAC3D,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC;QAE9B,2EAA2E;QAC3E,sCAAsC;QACtC,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9F,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAE3C,uEAAuE;QACvE,qEAAqE;QACrE,0EAA0E;QAC1E,4EAA4E;QAC5E,+DAA+D;QAC/D,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,mEAAmE;QACnE,wEAAwE;QACxE,sEAAsE;QACtE,0EAA0E;QAC1E,yEAAyE;QACzE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;QAC5C,MAAM,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAEnD,0EAA0E;QAC1E,0EAA0E;QAC1E,iBAAiB;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5C,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Loop heartbeat helper (#1043, follow-up to the #1038 wedge).
3
+ *
4
+ * Each long-running daemon loop records a standardized "last tick" heartbeat at
5
+ * the end of every iteration. The watchdog (watchdog-loop.ts) reads these rows
6
+ * to detect a loop whose last tick has gone stale (frozen mid-iteration / RPC
7
+ * wedge). The heartbeat is a NEW namespaced config row written ALONGSIDE the
8
+ * pre-existing `last_*_tick_at` rows (which other surfaces — e.g.
9
+ * gather-status.ts — already read); nothing here renames or replaces those.
10
+ *
11
+ * The stored value is `Date.now()` (wall-clock ms) as a string, so the watchdog
12
+ * can compute staleness with a single subtraction and no Date parsing.
13
+ */
14
+ import type { Store } from '../store/store.js';
15
+ /** Config-key namespace for per-loop heartbeats. */
16
+ export declare const LOOP_HEARTBEAT_PREFIX = "loop_heartbeat:";
17
+ /**
18
+ * The eight canonical long-running loops the watchdog supervises. The two
19
+ * for-await adapter loops (engine-watcher, delivery-watcher) heartbeat at the
20
+ * poll-cycle tail so an idle-but-polling loop never looks stale. The
21
+ * eviction/checkpoint loops use FleetStateStore (not this observability Store)
22
+ * and are deliberately NOT in this set.
23
+ */
24
+ export declare const LOOP_NAMES: readonly ["creator", "engine-tick", "engine-watcher", "delivery-watcher", "reward-claim", "balance-topup", "peer-sync"];
25
+ export type LoopName = (typeof LOOP_NAMES)[number];
26
+ /** The config-row key for a given loop's heartbeat. */
27
+ export declare function loopHeartbeatKey(name: LoopName): string;
28
+ /** Stamp the loop's heartbeat with the current wall-clock ms. */
29
+ export declare function recordLoopTick(store: Store, name: LoopName): void;
30
+ /**
31
+ * Read a loop's last heartbeat as wall-clock ms, or `null` if it has never
32
+ * ticked or the stored value is not a finite number.
33
+ */
34
+ export declare function getLoopTick(store: Store, name: LoopName): number | null;
@@ -0,0 +1,38 @@
1
+ /** Config-key namespace for per-loop heartbeats. */
2
+ export const LOOP_HEARTBEAT_PREFIX = 'loop_heartbeat:';
3
+ /**
4
+ * The eight canonical long-running loops the watchdog supervises. The two
5
+ * for-await adapter loops (engine-watcher, delivery-watcher) heartbeat at the
6
+ * poll-cycle tail so an idle-but-polling loop never looks stale. The
7
+ * eviction/checkpoint loops use FleetStateStore (not this observability Store)
8
+ * and are deliberately NOT in this set.
9
+ */
10
+ export const LOOP_NAMES = [
11
+ 'creator',
12
+ 'engine-tick',
13
+ 'engine-watcher',
14
+ 'delivery-watcher',
15
+ 'reward-claim',
16
+ 'balance-topup',
17
+ 'peer-sync',
18
+ ];
19
+ /** The config-row key for a given loop's heartbeat. */
20
+ export function loopHeartbeatKey(name) {
21
+ return `${LOOP_HEARTBEAT_PREFIX}${name}`;
22
+ }
23
+ /** Stamp the loop's heartbeat with the current wall-clock ms. */
24
+ export function recordLoopTick(store, name) {
25
+ store.setConfigValue(loopHeartbeatKey(name), Date.now().toString());
26
+ }
27
+ /**
28
+ * Read a loop's last heartbeat as wall-clock ms, or `null` if it has never
29
+ * ticked or the stored value is not a finite number.
30
+ */
31
+ export function getLoopTick(store, name) {
32
+ const raw = store.getConfigValue(loopHeartbeatKey(name));
33
+ if (raw === null)
34
+ return null;
35
+ const ms = Number(raw);
36
+ return Number.isFinite(ms) ? ms : null;
37
+ }
38
+ //# sourceMappingURL=loop-heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-heartbeat.js","sourceRoot":"","sources":["../../src/daemon/loop-heartbeat.ts"],"names":[],"mappings":"AAeA,oDAAoD;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,SAAS;IACT,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;IACd,eAAe;IACf,WAAW;CACH,CAAC;AAIX,uDAAuD;AACvD,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,OAAO,GAAG,qBAAqB,GAAG,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,IAAc;IACzD,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,IAAc;IACtD,MAAM,GAAG,GAAG,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC"}
@@ -9,6 +9,7 @@
9
9
  import { listStolasClaimTargets, tickStolasDistributorClaims, } from '../earning/stolas-claim.js';
10
10
  import { emitEvent } from '../observability/emit-event.js';
11
11
  import { displayFleetServiceIndex } from '../earning/fleet-display-index.js';
12
+ import { recordLoopTick } from './loop-heartbeat.js';
12
13
  export async function runRewardClaimOnce(cfg) {
13
14
  const state = await cfg.store.load(cfg.chain);
14
15
  const targets = listStolasClaimTargets(state.services);
@@ -75,7 +76,7 @@ export class RewardClaimLoop {
75
76
  await this.runOnce();
76
77
  }
77
78
  catch (err) {
78
- console.error('[reward-claim] Tick failed (non-fatal):', err instanceof Error ? err.message : err);
79
+ console.debug('[reward-claim] Tick failed (non-fatal):', err instanceof Error ? err.message : err);
79
80
  this.config.jinnStore && emitEvent(this.config.jinnStore, {
80
81
  kind: 'tick_error',
81
82
  outcome: 'failed',
@@ -83,6 +84,8 @@ export class RewardClaimLoop {
83
84
  }, 'reward-claim');
84
85
  }
85
86
  this.config.jinnStore?.setConfigValue('last_reward_claim_tick_at', new Date().toISOString());
87
+ if (this.config.jinnStore)
88
+ recordLoopTick(this.config.jinnStore, 'reward-claim'); // #1043 loop watchdog
86
89
  await new Promise(r => setTimeout(r, this.config.intervalMs));
87
90
  }
88
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reward-claim-loop.js","sourceRoot":"","sources":["../../src/daemon/reward-claim-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reward-claim-loop.js","sourceRoot":"","sources":["../../src/daemon/reward-claim-loop.ts"],"names":[],"mappings":"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"}
@@ -49,7 +49,7 @@ export declare class SkipLogDeduper {
49
49
  *
50
50
  * `now` is injectable for deterministic tests; defaults to `Date.now()`.
51
51
  */
52
- recordSkip(taskId: string, reason: string, now?: number): void;
52
+ recordSkip(taskId: string, reason: string, now?: number): boolean;
53
53
  /**
54
54
  * Returns true when this `(taskId, reason)` pair has not been logged yet
55
55
  * (or the previous reason for this `taskId` was different). Returns false
@@ -58,6 +58,8 @@ export class SkipLogDeduper {
58
58
  * `now` is injectable for deterministic tests; defaults to `Date.now()`.
59
59
  */
60
60
  recordSkip(taskId, reason, now = Date.now()) {
61
+ const previous = this.entriesByTaskId.get(taskId);
62
+ const shouldLog = previous?.reason !== reason;
61
63
  // Delete-then-set so the entry moves to the end of insertion order, keeping
62
64
  // actively-skipped tasks away from the FIFO eviction front.
63
65
  this.entriesByTaskId.delete(taskId);
@@ -69,6 +71,7 @@ export class SkipLogDeduper {
69
71
  this.entriesByTaskId.delete(oldestKey);
70
72
  }
71
73
  }
74
+ return shouldLog;
72
75
  }
73
76
  /**
74
77
  * Returns true when this `(taskId, reason)` pair has not been logged yet
@@ -1 +1 @@
1
- {"version":3,"file":"skip-log-dedup.js","sourceRoot":"","sources":["../../src/daemon/skip-log-dedup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAS1C,MAAM,OAAO,cAAc;IACjB,eAAe,GAAG,IAAI,GAAG,EAAqB,CAAC;IACtC,UAAU,CAAS;IACnB,YAAY,CAAS;IAEtC,YAAY,UAAU,GAAG,IAAI,EAAE,YAAY,GAAG,mBAAmB;QAC/D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;OAOG;IACH,aAAa,CAAC,MAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,MAAc,EAAE,MAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACjE,4EAA4E;QAC5E,4DAA4D;QAC5D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChD,4DAA4D;YAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC3D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,MAAc,EAAE,MAAc;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAChC,uEAAuE;YACvE,0EAA0E;YAC1E,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,mEAAmE;QACnE,0EAA0E;QAC1E,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF"}
1
+ {"version":3,"file":"skip-log-dedup.js","sourceRoot":"","sources":["../../src/daemon/skip-log-dedup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAS1C,MAAM,OAAO,cAAc;IACjB,eAAe,GAAG,IAAI,GAAG,EAAqB,CAAC;IACtC,UAAU,CAAS;IACnB,YAAY,CAAS;IAEtC,YAAY,UAAU,GAAG,IAAI,EAAE,YAAY,GAAG,mBAAmB;QAC/D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;OAOG;IACH,aAAa,CAAC,MAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,MAAc,EAAE,MAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;QAC9C,4EAA4E;QAC5E,4DAA4D;QAC5D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChD,4DAA4D;YAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC3D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,MAAc,EAAE,MAAc;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAChC,uEAAuE;YACvE,0EAA0E;YAC1E,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,mEAAmE;QACnE,0EAA0E;QAC1E,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Loop watchdog supervisor (#1043, follow-up to the #1038 4.5h RPC wedge).
3
+ *
4
+ * A synchronous, network-free loop. On each tick it reads every registered
5
+ * loop's heartbeat (loop-heartbeat.ts → getLoopTick) and compares its age
6
+ * against a per-loop threshold. When a loop is stale it ALWAYS loud-logs and
7
+ * emits a structured `loop_watchdog_stale` event; the process-exit recovery is
8
+ * separately gated behind `autoRestart` (default OFF — the locked Option A
9
+ * decision). v1 therefore always *detects + surfaces*; the non-zero exit is
10
+ * opt-in.
11
+ *
12
+ * IDEMPOTENCY (AC#3, the anchor for "designed, not assumed"): the only
13
+ * recovery action is a non-zero `process.exit`. There is NO new mid-flight
14
+ * re-execution path inside any loop. Recovery flows entirely through the
15
+ * EXISTING idempotent boot path:
16
+ *
17
+ * process.exit(WATCHDOG_EXIT_CODE)
18
+ * → Railway restartPolicyType="ON_FAILURE", maxRetries=10
19
+ * (deploy/railway-*-operator/railway.toml)
20
+ * → fresh process boots, recoverInFlight() re-drives in-flight tasks
21
+ * (TaskEngine.recoverInFlight) and the stale-pidfile path clears a dead
22
+ * lock (src/preflight/pidfile-liveness.ts) — both already idempotent.
23
+ *
24
+ * So restarting a wedged daemon cannot double-claim, double-deliver, or
25
+ * double-pay: it re-enters the same boot reconciliation a crash would.
26
+ */
27
+ import type { Store } from '../store/store.js';
28
+ import { type LoopName } from './loop-heartbeat.js';
29
+ /**
30
+ * Non-zero exit code the watchdog uses for its auto-restart. Distinct from
31
+ * main.ts's graceful `process.exit(0)` so Railway's ON_FAILURE policy treats a
32
+ * watchdog restart as a failure (and a clean operator-requested stop as not).
33
+ */
34
+ export declare const WATCHDOG_EXIT_CODE = 13;
35
+ export interface WatchdogLoopRegistration {
36
+ /** Loop heartbeat name. */
37
+ name: LoopName;
38
+ /** The loop's nominal iteration interval (ms). */
39
+ intervalMs: number;
40
+ /**
41
+ * Optional floor (ms) for the staleness threshold. The for-await adapter
42
+ * loops set this generously (~5 min) because a single RPC wedge can stall a
43
+ * poll far longer than `stalenessFactor * pollIntervalMs`.
44
+ */
45
+ floorMs?: number;
46
+ }
47
+ export interface WatchdogLoopConfig {
48
+ store: Store;
49
+ loops: WatchdogLoopRegistration[];
50
+ /** Stale when age > stalenessFactor * intervalMs (floored by floorMs). */
51
+ stalenessFactor?: number;
52
+ /** How often the watchdog itself ticks (ms). */
53
+ checkIntervalMs?: number;
54
+ /** When true, a stale loop triggers onStale (the process-exit recovery). */
55
+ autoRestart?: boolean;
56
+ /**
57
+ * Recovery action invoked once per stale episode when autoRestart is on.
58
+ * Optional — defaults to the production process-exit handler. Tests inject a
59
+ * spy. Kept off DaemonConfig so the config surface stays free of functions.
60
+ */
61
+ onStale?: (name: string) => void;
62
+ /** Gate: the watchdog only checks while this returns true (running, not draining). */
63
+ isActive: () => boolean;
64
+ /** Clock seam for tests. Defaults to Date.now. */
65
+ now?: () => number;
66
+ }
67
+ export declare class WatchdogLoop {
68
+ private readonly config;
69
+ private stopped;
70
+ private stopResolve?;
71
+ private readonly stopPromise;
72
+ private readonly stalenessFactor;
73
+ private readonly checkIntervalMs;
74
+ private readonly autoRestart;
75
+ private readonly onStale;
76
+ private readonly now;
77
+ /** Loops currently in a reported-stale episode (fire-once gate). */
78
+ private readonly reportedStale;
79
+ constructor(config: WatchdogLoopConfig);
80
+ run(): Promise<void>;
81
+ stop(): void;
82
+ /** One supervision pass. Synchronous + network-free. */
83
+ check(): void;
84
+ }
@@ -0,0 +1,91 @@
1
+ import { getLoopTick } from './loop-heartbeat.js';
2
+ import { emitStructured } from '../events/emitter.js';
3
+ /**
4
+ * Non-zero exit code the watchdog uses for its auto-restart. Distinct from
5
+ * main.ts's graceful `process.exit(0)` so Railway's ON_FAILURE policy treats a
6
+ * watchdog restart as a failure (and a clean operator-requested stop as not).
7
+ */
8
+ export const WATCHDOG_EXIT_CODE = 13;
9
+ /** Default recovery: loud-log then non-zero exit (Railway restarts us). */
10
+ function defaultOnStale(name) {
11
+ console.error(`[watchdog] auto-restarting via non-zero exit (loop=${name}, code=${WATCHDOG_EXIT_CODE})`);
12
+ process.exit(WATCHDOG_EXIT_CODE);
13
+ }
14
+ export class WatchdogLoop {
15
+ config;
16
+ stopped = false;
17
+ stopResolve;
18
+ stopPromise;
19
+ stalenessFactor;
20
+ checkIntervalMs;
21
+ autoRestart;
22
+ onStale;
23
+ now;
24
+ /** Loops currently in a reported-stale episode (fire-once gate). */
25
+ reportedStale = new Set();
26
+ constructor(config) {
27
+ this.config = config;
28
+ this.stalenessFactor = config.stalenessFactor ?? 6;
29
+ this.checkIntervalMs = config.checkIntervalMs ?? 30_000;
30
+ this.autoRestart = config.autoRestart ?? false;
31
+ this.onStale = config.onStale ?? defaultOnStale;
32
+ this.now = config.now ?? (() => Date.now());
33
+ this.stopPromise = new Promise((resolve) => {
34
+ this.stopResolve = resolve;
35
+ });
36
+ }
37
+ async run() {
38
+ while (!this.stopped) {
39
+ if (this.config.isActive()) {
40
+ this.check();
41
+ }
42
+ await Promise.race([
43
+ new Promise((r) => setTimeout(r, this.checkIntervalMs)),
44
+ this.stopPromise,
45
+ ]);
46
+ }
47
+ }
48
+ stop() {
49
+ this.stopped = true;
50
+ this.stopResolve?.();
51
+ }
52
+ /** One supervision pass. Synchronous + network-free. */
53
+ check() {
54
+ const now = this.now();
55
+ for (const reg of this.config.loops) {
56
+ const last = getLoopTick(this.config.store, reg.name);
57
+ if (last === null)
58
+ continue; // never ticked — nothing to judge yet
59
+ const threshold = Math.max(this.stalenessFactor * reg.intervalMs, reg.floorMs ?? 0);
60
+ const ageMs = now - last;
61
+ if (ageMs > threshold) {
62
+ // Fire-once per episode: skip if already reported and not yet recovered.
63
+ if (this.reportedStale.has(reg.name))
64
+ continue;
65
+ this.reportedStale.add(reg.name);
66
+ const message = `[watchdog] loop '${reg.name}' is stale: last tick ${ageMs}ms ago ` +
67
+ `(threshold ${threshold}ms)`;
68
+ console.error(message);
69
+ emitStructured({
70
+ kind: 'error',
71
+ message,
72
+ errorCode: 'loop_watchdog_stale',
73
+ details: {
74
+ loopName: reg.name,
75
+ lastTickAt: last,
76
+ ageMs,
77
+ thresholdMs: threshold,
78
+ },
79
+ });
80
+ if (this.autoRestart) {
81
+ this.onStale(reg.name);
82
+ }
83
+ }
84
+ else {
85
+ // Heartbeat advanced back under threshold → re-arm for next episode.
86
+ this.reportedStale.delete(reg.name);
87
+ }
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=watchdog-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchdog-loop.js","sourceRoot":"","sources":["../../src/daemon/watchdog-loop.ts"],"names":[],"mappings":"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"}