@jinn-network/client 0.1.6 → 0.1.7

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 (288) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +23 -4
  3. package/deployments/deployment-jinn-mvi-l1-sepolia.json +23 -4
  4. package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +5 -4
  5. package/dist/adapters/mech/adapter.d.ts +38 -1
  6. package/dist/adapters/mech/adapter.js +241 -54
  7. package/dist/adapters/mech/adapter.js.map +1 -1
  8. package/dist/adapters/mech/contracts.d.ts +17 -4
  9. package/dist/adapters/mech/contracts.js +8 -2
  10. package/dist/adapters/mech/contracts.js.map +1 -1
  11. package/dist/adapters/mech/safe-revert.d.ts +20 -0
  12. package/dist/adapters/mech/safe-revert.js +12 -4
  13. package/dist/adapters/mech/safe-revert.js.map +1 -1
  14. package/dist/adapters/mech/safe.d.ts +5 -1
  15. package/dist/adapters/mech/safe.js +27 -8
  16. package/dist/adapters/mech/safe.js.map +1 -1
  17. package/dist/adapters/mech/verdict-code.d.ts +1 -0
  18. package/dist/adapters/mech/verdict-code.js +18 -0
  19. package/dist/adapters/mech/verdict-code.js.map +1 -1
  20. package/dist/api/admin-endpoint.d.ts +15 -3
  21. package/dist/api/admin-endpoint.js +24 -2
  22. package/dist/api/admin-endpoint.js.map +1 -1
  23. package/dist/api/bootstrap-endpoint.js +49 -0
  24. package/dist/api/bootstrap-endpoint.js.map +1 -1
  25. package/dist/api/codex-doctor-endpoint.d.ts +73 -0
  26. package/dist/api/codex-doctor-endpoint.js +177 -0
  27. package/dist/api/codex-doctor-endpoint.js.map +1 -0
  28. package/dist/api/discovery-endpoint.d.ts +1 -0
  29. package/dist/api/discovery-endpoint.js +26 -0
  30. package/dist/api/discovery-endpoint.js.map +1 -1
  31. package/dist/api/fleet-build.d.ts +1 -0
  32. package/dist/api/fleet-build.js +2 -1
  33. package/dist/api/fleet-build.js.map +1 -1
  34. package/dist/api/gather-status.d.ts +11 -0
  35. package/dist/api/gather-status.js +400 -4
  36. package/dist/api/gather-status.js.map +1 -1
  37. package/dist/api/hermes-doctor-endpoint.d.ts +117 -0
  38. package/dist/api/hermes-doctor-endpoint.js +229 -23
  39. package/dist/api/hermes-doctor-endpoint.js.map +1 -1
  40. package/dist/api/launcher-status.d.ts +21 -16
  41. package/dist/api/launcher-status.js +2 -1
  42. package/dist/api/launcher-status.js.map +1 -1
  43. package/dist/api/portfolio-v0-build.d.ts +10 -0
  44. package/dist/api/portfolio-v0-build.js +24 -5
  45. package/dist/api/portfolio-v0-build.js.map +1 -1
  46. package/dist/api/prediction-v1-build.d.ts +10 -0
  47. package/dist/api/prediction-v1-build.js +7 -1
  48. package/dist/api/prediction-v1-build.js.map +1 -1
  49. package/dist/api/server.d.ts +31 -1
  50. package/dist/api/server.js +68 -1
  51. package/dist/api/server.js.map +1 -1
  52. package/dist/api/setup-endpoints.d.ts +16 -0
  53. package/dist/api/setup-endpoints.js +78 -4
  54. package/dist/api/setup-endpoints.js.map +1 -1
  55. package/dist/api/setup-retry-endpoint.d.ts +19 -0
  56. package/dist/api/setup-retry-endpoint.js +32 -0
  57. package/dist/api/setup-retry-endpoint.js.map +1 -0
  58. package/dist/api/solvernets-endpoints.d.ts +8 -0
  59. package/dist/api/solvernets-endpoints.js +71 -43
  60. package/dist/api/solvernets-endpoints.js.map +1 -1
  61. package/dist/api/status-build.d.ts +72 -0
  62. package/dist/api/status-build.js +73 -18
  63. package/dist/api/status-build.js.map +1 -1
  64. package/dist/api/task-run-routing.d.ts +7 -0
  65. package/dist/api/task-run-routing.js +12 -0
  66. package/dist/api/task-run-routing.js.map +1 -0
  67. package/dist/api/task-runs-build.d.ts +21 -0
  68. package/dist/api/task-runs-build.js +14 -1
  69. package/dist/api/task-runs-build.js.map +1 -1
  70. package/dist/build-info.json +4 -4
  71. package/dist/build-meta.json +1 -1
  72. package/dist/chain-read-errors.d.ts +10 -0
  73. package/dist/chain-read-errors.js +15 -0
  74. package/dist/chain-read-errors.js.map +1 -1
  75. package/dist/cli/commands/auth.js +1 -1
  76. package/dist/cli/commands/auth.js.map +1 -1
  77. package/dist/cli/commands/create.js +3 -2
  78. package/dist/cli/commands/create.js.map +1 -1
  79. package/dist/cli/commands/doctor.d.ts +2 -0
  80. package/dist/cli/commands/doctor.js +2 -0
  81. package/dist/cli/commands/doctor.js.map +1 -1
  82. package/dist/cli/commands/rewards.js +11 -7
  83. package/dist/cli/commands/rewards.js.map +1 -1
  84. package/dist/cli/commands/solver-nets.js +24 -9
  85. package/dist/cli/commands/solver-nets.js.map +1 -1
  86. package/dist/cli/commands/status.js +1 -1
  87. package/dist/cli/commands/status.js.map +1 -1
  88. package/dist/cli/commands/tasks.js +86 -9
  89. package/dist/cli/commands/tasks.js.map +1 -1
  90. package/dist/cli/commands/update.d.ts +10 -0
  91. package/dist/cli/commands/update.js +36 -0
  92. package/dist/cli/commands/update.js.map +1 -1
  93. package/dist/cli/introspection-context.js +5 -0
  94. package/dist/cli/introspection-context.js.map +1 -1
  95. package/dist/cli/task-native-readiness.d.ts +3 -1
  96. package/dist/cli/task-native-readiness.js +28 -6
  97. package/dist/cli/task-native-readiness.js.map +1 -1
  98. package/dist/config.d.ts +106 -5
  99. package/dist/config.js +97 -18
  100. package/dist/config.js.map +1 -1
  101. package/dist/daemon/checkpoint-loop.d.ts +48 -0
  102. package/dist/daemon/checkpoint-loop.js +76 -0
  103. package/dist/daemon/checkpoint-loop.js.map +1 -0
  104. package/dist/daemon/creator.d.ts +1 -1
  105. package/dist/daemon/creator.js +7 -3
  106. package/dist/daemon/creator.js.map +1 -1
  107. package/dist/daemon/daemon.d.ts +19 -0
  108. package/dist/daemon/daemon.js +68 -1
  109. package/dist/daemon/daemon.js.map +1 -1
  110. package/dist/daemon/eviction-loop.d.ts +40 -0
  111. package/dist/daemon/eviction-loop.js +67 -0
  112. package/dist/daemon/eviction-loop.js.map +1 -0
  113. package/dist/daemon/jinn-claim-loop-wiring.d.ts +33 -0
  114. package/dist/daemon/jinn-claim-loop-wiring.js +40 -0
  115. package/dist/daemon/jinn-claim-loop-wiring.js.map +1 -0
  116. package/dist/daemon/jinn-claim-loop.d.ts +24 -17
  117. package/dist/daemon/jinn-claim-loop.js +77 -23
  118. package/dist/daemon/jinn-claim-loop.js.map +1 -1
  119. package/dist/daemon/skip-log-dedup.d.ts +69 -0
  120. package/dist/daemon/skip-log-dedup.js +106 -0
  121. package/dist/daemon/skip-log-dedup.js.map +1 -0
  122. package/dist/dashboard/assets/index-BUlE8F3Y.js +330 -0
  123. package/dist/dashboard/assets/index-blqc7eqq.css +32 -0
  124. package/dist/dashboard/index.html +2 -2
  125. package/dist/discovery/factory.d.ts +17 -5
  126. package/dist/discovery/factory.js +46 -18
  127. package/dist/discovery/factory.js.map +1 -1
  128. package/dist/discovery/http.js +142 -3
  129. package/dist/discovery/http.js.map +1 -1
  130. package/dist/discovery/onchain.d.ts +5 -0
  131. package/dist/discovery/onchain.js +407 -15
  132. package/dist/discovery/onchain.js.map +1 -1
  133. package/dist/discovery/types.d.ts +45 -1
  134. package/dist/discovery/types.js +8 -10
  135. package/dist/discovery/types.js.map +1 -1
  136. package/dist/discovery/with-fallback.d.ts +7 -0
  137. package/dist/discovery/with-fallback.js +10 -0
  138. package/dist/discovery/with-fallback.js.map +1 -1
  139. package/dist/earning/bootstrap.d.ts +92 -1
  140. package/dist/earning/bootstrap.js +203 -63
  141. package/dist/earning/bootstrap.js.map +1 -1
  142. package/dist/earning/contracts.d.ts +14 -0
  143. package/dist/earning/contracts.js +17 -5
  144. package/dist/earning/contracts.js.map +1 -1
  145. package/dist/earning/funding-plan.js +27 -18
  146. package/dist/earning/funding-plan.js.map +1 -1
  147. package/dist/earning/jinn-rewards.d.ts +46 -0
  148. package/dist/earning/jinn-rewards.js +32 -0
  149. package/dist/earning/jinn-rewards.js.map +1 -1
  150. package/dist/earning/safe-adapter.d.ts +2 -0
  151. package/dist/earning/safe-adapter.js +26 -12
  152. package/dist/earning/safe-adapter.js.map +1 -1
  153. package/dist/earning/store.d.ts +8 -0
  154. package/dist/earning/store.js.map +1 -1
  155. package/dist/earning/testnet-setup-migration.d.ts +12 -0
  156. package/dist/earning/testnet-setup-migration.js +27 -1
  157. package/dist/earning/testnet-setup-migration.js.map +1 -1
  158. package/dist/earning/types.d.ts +15 -0
  159. package/dist/erc8004/reputation.d.ts +8 -0
  160. package/dist/erc8004/reputation.js +22 -3
  161. package/dist/erc8004/reputation.js.map +1 -1
  162. package/dist/harnesses/cost-estimates.d.ts +145 -0
  163. package/dist/harnesses/cost-estimates.js +297 -0
  164. package/dist/harnesses/cost-estimates.js.map +1 -0
  165. package/dist/harnesses/engine/engine.d.ts +72 -0
  166. package/dist/harnesses/engine/engine.js +105 -8
  167. package/dist/harnesses/engine/engine.js.map +1 -1
  168. package/dist/harnesses/engine/persistence.d.ts +51 -1
  169. package/dist/harnesses/engine/persistence.js +118 -5
  170. package/dist/harnesses/engine/persistence.js.map +1 -1
  171. package/dist/harnesses/engine/work-dir-reaper.d.ts +65 -0
  172. package/dist/harnesses/engine/work-dir-reaper.js +100 -0
  173. package/dist/harnesses/engine/work-dir-reaper.js.map +1 -0
  174. package/dist/harnesses/impls/hermes-agent/adapter.js +40 -0
  175. package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
  176. package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +20 -0
  177. package/dist/harnesses/impls/hermes-agent/bootstrap.js +40 -6
  178. package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
  179. package/dist/harnesses/impls/hermes-agent/harness.d.ts +59 -1
  180. package/dist/harnesses/impls/hermes-agent/harness.js +104 -0
  181. package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
  182. package/dist/harnesses/impls/index.d.ts +7 -0
  183. package/dist/harnesses/impls/index.js +16 -1
  184. package/dist/harnesses/impls/index.js.map +1 -1
  185. package/dist/harnesses/impls/learner/harness.d.ts +38 -4
  186. package/dist/harnesses/impls/learner/harness.js +96 -2
  187. package/dist/harnesses/impls/learner/harness.js.map +1 -1
  188. package/dist/harnesses/impls/learner/plugin-path.d.ts +0 -13
  189. package/dist/harnesses/impls/learner/plugin-path.js +35 -15
  190. package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
  191. package/dist/harnesses/impls/learner/types.d.ts +11 -0
  192. package/dist/harnesses/impls/stub.d.ts +58 -0
  193. package/dist/harnesses/impls/stub.js +89 -0
  194. package/dist/harnesses/impls/stub.js.map +1 -0
  195. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.d.ts +69 -50
  196. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +178 -93
  197. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
  198. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.d.ts +12 -1
  199. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +121 -7
  200. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
  201. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.d.ts +15 -0
  202. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +54 -4
  203. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
  204. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +6 -0
  205. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +1 -1
  206. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
  207. package/dist/harnesses/readiness-registry.js +9 -1
  208. package/dist/harnesses/readiness-registry.js.map +1 -1
  209. package/dist/main.js +371 -82
  210. package/dist/main.js.map +1 -1
  211. package/dist/observability/emit-event.d.ts +1 -1
  212. package/dist/observability/emit-event.js.map +1 -1
  213. package/dist/operator-errors.d.ts +7 -0
  214. package/dist/operator-errors.js +13 -1
  215. package/dist/operator-errors.js.map +1 -1
  216. package/dist/plugins/learner/.claude-plugin/plugin.json +9 -0
  217. package/dist/plugins/learner/.codex-plugin/plugin.json +39 -0
  218. package/dist/plugins/learner/AGENTS.md +40 -0
  219. package/dist/plugins/learner/CLAUDE.md +33 -0
  220. package/dist/plugins/learner/README.md +59 -0
  221. package/dist/plugins/learner/hooks/hooks.json +16 -0
  222. package/dist/plugins/learner/hooks/session-start +38 -0
  223. package/dist/plugins/learner/skills/learn/SKILL.md +412 -0
  224. package/dist/plugins/learner/skills/learn/analyst-prompt.md +68 -0
  225. package/dist/plugins/learner/skills/learn/consolidator-prompt.md +94 -0
  226. package/dist/plugins/learner/skills/learn/explorer-prompt.md +53 -0
  227. package/dist/plugins/learner/skills/learn/planner-prompt.md +87 -0
  228. package/dist/plugins/learner/skills/learn/promoter-prompt.md +113 -0
  229. package/dist/plugins/learner/skills/learn/step-worker-prompt.md +47 -0
  230. package/dist/plugins/learner/skills/learn/strategist-prompt.md +85 -0
  231. package/dist/restart-daemon.d.ts +90 -0
  232. package/dist/restart-daemon.js +95 -0
  233. package/dist/restart-daemon.js.map +1 -0
  234. package/dist/setup/halt-mode.d.ts +14 -0
  235. package/dist/setup/halt-mode.js +17 -0
  236. package/dist/setup/halt-mode.js.map +1 -0
  237. package/dist/solver-nets/prediction-operator-ux.js +43 -3
  238. package/dist/solver-nets/prediction-operator-ux.js.map +1 -1
  239. package/dist/solver-nets/registry.d.ts +1 -0
  240. package/dist/solver-nets/registry.js +1 -1
  241. package/dist/solver-nets/registry.js.map +1 -1
  242. package/dist/solver-types/_swe-rebench-v2-pool-cache.d.ts +58 -0
  243. package/dist/solver-types/_swe-rebench-v2-pool-cache.js +87 -0
  244. package/dist/solver-types/_swe-rebench-v2-pool-cache.js.map +1 -0
  245. package/dist/solver-types/_swe-rebench-v2-substrate.d.ts +1 -0
  246. package/dist/solver-types/_swe-rebench-v2-substrate.js +10 -0
  247. package/dist/solver-types/_swe-rebench-v2-substrate.js.map +1 -1
  248. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +65 -0
  249. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +243 -26
  250. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  251. package/dist/solver-types/swe-rebench-v2-auto.d.ts +22 -7
  252. package/dist/solver-types/swe-rebench-v2-auto.js +45 -20
  253. package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
  254. package/dist/solver-types/swe-rebench-v2.d.ts +13 -2
  255. package/dist/solver-types/swe-rebench-v2.js +233 -94
  256. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  257. package/dist/solvernets/daemon-init.d.ts +10 -2
  258. package/dist/solvernets/daemon-init.js +22 -2
  259. package/dist/solvernets/daemon-init.js.map +1 -1
  260. package/dist/solvernets/launched-record-dispatcher.js +35 -7
  261. package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
  262. package/dist/solvernets/store.d.ts +5 -0
  263. package/dist/solvernets/store.js +1 -0
  264. package/dist/solvernets/store.js.map +1 -1
  265. package/dist/store/store.d.ts +15 -0
  266. package/dist/store/store.js +118 -3
  267. package/dist/store/store.js.map +1 -1
  268. package/dist/tasks/sources.d.ts +18 -1
  269. package/dist/tasks/sources.js +33 -5
  270. package/dist/tasks/sources.js.map +1 -1
  271. package/dist/tx-retry.d.ts +151 -19
  272. package/dist/tx-retry.js +286 -32
  273. package/dist/tx-retry.js.map +1 -1
  274. package/dist/types/payloads/prediction-apy-v0.d.ts +5 -5
  275. package/dist/types/payloads/prediction-v0.d.ts +5 -5
  276. package/dist/types/task-document.d.ts +392 -0
  277. package/dist/types/task-document.js +10 -0
  278. package/dist/types/task-document.js.map +1 -1
  279. package/dist/types/task.d.ts +28 -0
  280. package/dist/util/extract-tx-hash.d.ts +14 -0
  281. package/dist/util/extract-tx-hash.js +19 -0
  282. package/dist/util/extract-tx-hash.js.map +1 -0
  283. package/dist/vendor/@jinn-network/sdk/dist/contracts.js +1 -1
  284. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +3 -0
  285. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -0
  286. package/package.json +29 -12
  287. package/dist/dashboard/assets/index-DOlzFN8a.css +0 -32
  288. package/dist/dashboard/assets/index-NkZ7CTAT.js +0 -140
@@ -16,21 +16,24 @@
16
16
  * Sepolia / Ethereum. The distributor verifies, applies channel
17
17
  * weights, and mints to the operator multisig + DAO Timelock.
18
18
  *
19
- * The loop is disabled when no `distributorAddress` is configured. Each
20
- * tick iterates over staked services in the FleetStateStore. Failures are
21
- * logged and surfaced via `tick_error` observability events; they don't
22
- * crash the daemon. Replay protection lives entirely in the distributor's
23
- * accumulators — repeated submissions are no-ops on the second mint.
19
+ * The loop is disabled unless the operator explicitly enables it. Each tick
20
+ * iterates over staked services in the FleetStateStore. Failures are logged
21
+ * and surfaced via `tick_error` observability events; they don't crash the
22
+ * daemon. Replay protection lives entirely in the distributor's accumulators
23
+ * — repeated submissions are no-ops on the second mint.
24
24
  *
25
- * Configuration: `jinnClaimLoopIntervalMs` (default 1h), `jinnMessengerMode`
26
- * (`canonical` | `mock`). The `mock` path requires the daemon's L1 wallet to
27
- * be the MockMessenger's owner (set at deploy).
25
+ * Configuration: `jinnClaimLoopEnabled`, `jinnClaimLoopIntervalMs` (default
26
+ * 1h), `jinnClaimSubmissionMode` (`emit-only` | `submit`),
27
+ * `jinnMessengerMode` (`canonical` | `mock`). The `mock` submit path requires
28
+ * the daemon's L1 wallet to be the MockMessenger's owner (set at deploy).
28
29
  *
29
- * Automated `run()` / `runOnce()` **only execute mock-mode** emit→fixture→claim.
30
- * When `jinnMessengerMode === 'canonical'`, scheduled ticks **skip** emitting:
31
- * canonical OP-Stack finality is multi-day (see R-1); operators should use mock
32
- * for burn-in and run `tsx scripts/verify-canonical-canary.ts` for
33
- * verifier-only proofs after an intentional L2 emit.
30
+ * Automated submit-mode `run()` / `runOnce()` **only execute mock-mode**
31
+ * emit→fixture→claim. When `jinnMessengerMode === 'canonical'`, scheduled
32
+ * submit ticks **skip** emitting: canonical OP-Stack finality is multi-day
33
+ * (see R-1); operators should use mock for burn-in and run
34
+ * `tsx scripts/verify-canonical-canary.ts` for verifier-only proofs after an
35
+ * intentional L2 emit. Emit-only mode stops after the L2 ticket and can run
36
+ * without L1 wiring.
34
37
  */
35
38
  import { getAddress } from 'viem';
36
39
  import { isOperationalServiceStep } from '../earning/types.js';
@@ -62,8 +65,10 @@ export class JinnClaimLoop {
62
65
  async runOnce() {
63
66
  const result = { ticks: 0, emits: 0, submits: 0, errors: 0 };
64
67
  // Spec / Phase D: MockMessenger drives automated Sepolia burn-in; canonical
65
- // verification is verifier-only and must not spam emitClaim each interval.
66
- if (this.config.messengerMode === 'canonical') {
68
+ // submit verification is verifier-only and must not spam emitClaim each
69
+ // interval. Emit-only mode intentionally stops after recording the L2
70
+ // ticket, so it is allowed to run with any messenger mode.
71
+ if (this.config.submissionMode === 'submit' && this.config.messengerMode === 'canonical') {
67
72
  const detail = '[jinn-claim] Automated runOnce skips messengerMode=canonical (multi-day OP finality). ' +
68
73
  'Set jinnMessengerMode=mock for Sepolia burn-in, or run `tsx scripts/verify-canonical-canary.ts` ' +
69
74
  'after finality with an existing L2 ClaimTicket tx.';
@@ -129,6 +134,27 @@ export class JinnClaimLoop {
129
134
  detail: `Emitted ClaimTicket for service ${serviceId}`,
130
135
  }, 'jinn-claim');
131
136
  }
137
+ if (this.config.submissionMode === 'emit-only') {
138
+ const snapshot = await this.readSnapshot(serviceId, emitTxHash);
139
+ if (snapshot.multisig.toLowerCase() !== multisig.toLowerCase()) {
140
+ throw new Error(`[jinn-claim] L2 ClaimTicket multisig ${snapshot.multisig} does not match ` +
141
+ `service multisig ${multisig} — refusing to record emit-only ticket`);
142
+ }
143
+ const detail = `Recorded ClaimTicket claimId=${snapshot.claimId} service=${serviceId} ` +
144
+ `weights=${snapshot.taskCreationWeight}/${snapshot.solutionDeliveryWeight}/` +
145
+ `${snapshot.verdictDeliveryWeight}`;
146
+ console.log(`[jinn-claim] Service ${serviceId}: ${detail}`);
147
+ if (this.config.jinnStore) {
148
+ emitEvent(this.config.jinnStore, {
149
+ kind: 'jinn_claim_ticket_recorded',
150
+ serviceIndex: displayIndex,
151
+ txHash: emitTxHash,
152
+ outcome: 'ok',
153
+ detail,
154
+ }, 'jinn-claim');
155
+ }
156
+ return;
157
+ }
132
158
  // Step B + C — diverge by mode.
133
159
  let submitTxHash;
134
160
  if (this.config.messengerMode === 'mock') {
@@ -173,21 +199,23 @@ export class JinnClaimLoop {
173
199
  }
174
200
  /** Mock-mode Step B + C: read the L2 event, plant fixture on L1, claim. */
175
201
  async submitMock(args) {
202
+ const { l1Client, l1Wallet, messengerAddress, distributorAddress } = this.requireL1SubmitConfig();
176
203
  const snapshot = await this.readSnapshot(args.serviceId, args.emitTxHash);
177
204
  if (snapshot.multisig.toLowerCase() !== args.multisig.toLowerCase()) {
178
205
  throw new Error(`[jinn-claim] L2 ClaimTicket multisig ${snapshot.multisig} does not match ` +
179
206
  `service multisig ${args.multisig} — refusing to plant mock fixture`);
180
207
  }
181
208
  // Plant the fixture (daemon wallet must be MockMessenger.owner).
182
- const fixtureTx = await plantMockFixture(this.config.l1Client, this.config.l1Wallet, this.config.messengerAddress, snapshot);
183
- await waitForTransactionReceiptWithRetry(this.config.l1Client, fixtureTx);
209
+ const fixtureTx = await plantMockFixture(l1Client, l1Wallet, messengerAddress, snapshot);
210
+ await waitForTransactionReceiptWithRetry(l1Client, fixtureTx);
184
211
  // Submit the claim on L1.
185
- const claimTx = await submitMockClaim(this.config.l1Client, this.config.l1Wallet, this.config.distributorAddress, snapshot.claimId);
186
- await waitForTransactionReceiptWithRetry(this.config.l1Client, claimTx);
212
+ const claimTx = await submitMockClaim(l1Client, l1Wallet, distributorAddress, snapshot.claimId);
213
+ await waitForTransactionReceiptWithRetry(l1Client, claimTx);
187
214
  return claimTx;
188
215
  }
189
216
  /** Canonical-mode Step B + C: build OP-Stack proof, submit on L1. */
190
217
  async submitCanonical(args) {
218
+ const { l1Client, messengerAddress } = this.requireL1SubmitConfig();
191
219
  if (!this.config.optimismPortalAddress || !this.config.disputeGameFactoryAddress) {
192
220
  throw new Error('[jinn-claim-loop] canonical mode requires optimismPortalAddress + disputeGameFactoryAddress');
193
221
  }
@@ -200,14 +228,14 @@ export class JinnClaimLoop {
200
228
  }
201
229
  const snapshot = decodeClaimTicketFromReceipt(receipt.logs, this.config.claimEmitterAddress, claimLog.logIndex ?? 0);
202
230
  const result = await buildCanonicalProof({
203
- l1Client: this.config.l1Client,
231
+ l1Client,
204
232
  l2ProofClient: this.config.l2ProofClient ?? this.config.l2Client,
205
233
  targetChain: this.config.chain === 'base-sepolia' ? baseSepolia : base,
206
234
  optimismPortal: this.config.optimismPortalAddress,
207
235
  disputeGameFactory: this.config.disputeGameFactoryAddress,
208
236
  claimEmitter: this.config.claimEmitterAddress,
209
237
  }, { snapshot, l2BlockNumber: receipt.blockNumber });
210
- await verifyCanonicalClaimCanary(this.config.l1Client, this.config.messengerAddress, result.proof);
238
+ await verifyCanonicalClaimCanary(l1Client, messengerAddress, result.proof);
211
239
  // Verifier-only canary path: no L1 transaction submitted; return the L2 emit tx.
212
240
  return args.emitTxHash;
213
241
  }
@@ -220,15 +248,41 @@ export class JinnClaimLoop {
220
248
  // can return "receipt not found" briefly after the tx lands when the
221
249
  // request hits a backend that hasn't propagated the receipt yet.
222
250
  const receipt = await waitForTransactionReceiptWithRetry(this.config.l2Client, emitTxHash);
251
+ const claimLog = receipt.logs.find((log) => log.address.toLowerCase() === this.config.claimEmitterAddress.toLowerCase()
252
+ && log.topics[0]?.toLowerCase() === CLAIM_TICKET_TOPIC0.toLowerCase());
253
+ if (claimLog) {
254
+ const snapshot = decodeClaimTicketFromReceipt(receipt.logs, this.config.claimEmitterAddress, claimLog.logIndex ?? 0);
255
+ if (snapshot.serviceId !== serviceId) {
256
+ throw new Error(`[jinn-claim] ClaimTicket service ${snapshot.serviceId} does not match expected service ${serviceId}`);
257
+ }
258
+ return {
259
+ ...snapshot,
260
+ emitTxHash,
261
+ emitBlockNumber: receipt.blockNumber,
262
+ };
263
+ }
223
264
  // Search a small window around the emit block.
224
265
  const fromBlock = receipt.blockNumber > 5n ? receipt.blockNumber - 5n : 0n;
225
- const toBlock = receipt.blockNumber + 5n;
226
- const snapshot = await fetchLatestClaimTicket(this.config.l2Client, this.config.claimEmitterAddress, serviceId, { fromBlock, toBlock });
266
+ const snapshot = await fetchLatestClaimTicket(this.config.l2Client, this.config.claimEmitterAddress, serviceId, { fromBlock, toBlock: 'latest' });
227
267
  if (!snapshot) {
228
268
  throw new Error(`[jinn-claim] no ClaimTicket event for service ${serviceId} near tx ${emitTxHash}`);
229
269
  }
230
270
  return snapshot;
231
271
  }
272
+ requireL1SubmitConfig() {
273
+ if (!this.config.l1Client ||
274
+ !this.config.l1Wallet ||
275
+ !this.config.distributorAddress ||
276
+ !this.config.messengerAddress) {
277
+ throw new Error('[jinn-claim-loop] submit mode requires L1 client, L1 wallet, distributor, and messenger wiring');
278
+ }
279
+ return {
280
+ l1Client: this.config.l1Client,
281
+ l1Wallet: this.config.l1Wallet,
282
+ distributorAddress: this.config.distributorAddress,
283
+ messengerAddress: this.config.messengerAddress,
284
+ };
285
+ }
232
286
  /** Loop forever, sleeping `intervalMs` between ticks. */
233
287
  async run() {
234
288
  if (this.config.intervalMs <= 0)
@@ -1 +1 @@
1
- {"version":3,"file":"jinn-claim-loop.js","sourceRoot":"","sources":["../../src/daemon/jinn-claim-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jinn-claim-loop.js","sourceRoot":"","sources":["../../src/daemon/jinn-claim-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Dedupes "[daemon] skipping task X — reason" log lines so the engine-watcher
3
+ * loop doesn't emit hundreds of identical lines per minute when a single in-flight
4
+ * slot is occupied. The original loop logged once per `(taskId, reason)` per
5
+ * pass; this helper collapses repeat lines down to one per `(taskId, reason)`
6
+ * pair until the reason changes (or the entry is evicted to keep memory bounded).
7
+ *
8
+ * It additionally maintains a TTL-bounded *work-skip cache*: once `canAcceptTask`
9
+ * rejects a task, the engine-watcher records the skip here and — for
10
+ * `SKIP_RECHECK_TTL_MS` afterwards — fast-skips the task without re-running the
11
+ * (expensive) `canAcceptTask` work at all. With a large backlog of
12
+ * persistently-unacceptable tasks (e.g. ~40 evaluation tasks whose harness is
13
+ * not enabled), re-running manifest resolution + schema validation +
14
+ * `impl.isReady()` for every task every cycle blocks the Node event loop ~1-2s
15
+ * and starves the HTTP API. The cache makes a repeat cycle a Map lookup.
16
+ *
17
+ * SAFETY: the TTL re-check is mandatory and bounded. A task is NEVER skip-cached
18
+ * forever — once `SKIP_RECHECK_TTL_MS` has elapsed the cache reports the task as
19
+ * due for re-check, so a task that becomes acceptable (operator enables the
20
+ * harness, a slot frees up) is always picked up within the TTL.
21
+ *
22
+ * See jinn-mono-kzan (log dedup).
23
+ */
24
+ /**
25
+ * How long a task that `canAcceptTask` rejected stays in the work-skip cache
26
+ * before the engine-watcher re-evaluates it. Bounded on purpose: a false
27
+ * permanent skip (a claimable task that is never picked up) is a serious bug,
28
+ * so the cache is only ever a short-lived optimization.
29
+ */
30
+ export declare const SKIP_RECHECK_TTL_MS = 30000;
31
+ export declare class SkipLogDeduper {
32
+ private entriesByTaskId;
33
+ private readonly maxEntries;
34
+ private readonly recheckTtlMs;
35
+ constructor(maxEntries?: number, recheckTtlMs?: number);
36
+ /**
37
+ * Returns true when the engine-watcher should re-run `canAcceptTask` for
38
+ * `taskId` — i.e. there is no cached skip, or the cached skip is older than
39
+ * `recheckTtlMs`. Returns false when a recent skip is still within the TTL,
40
+ * meaning the caller should fast-skip the task without doing the work.
41
+ *
42
+ * `now` is injectable for deterministic tests; defaults to `Date.now()`.
43
+ */
44
+ shouldRecheck(taskId: string, now?: number): boolean;
45
+ /**
46
+ * Records that `canAcceptTask` rejected `taskId` with `reason`, stamping the
47
+ * skip with the current time so subsequent `shouldRecheck` calls can apply
48
+ * the TTL. Refreshes recency for the FIFO memory bound.
49
+ *
50
+ * `now` is injectable for deterministic tests; defaults to `Date.now()`.
51
+ */
52
+ recordSkip(taskId: string, reason: string, now?: number): void;
53
+ /**
54
+ * Returns true when this `(taskId, reason)` pair has not been logged yet
55
+ * (or the previous reason for this `taskId` was different). Returns false
56
+ * when the previous skip for this task had the same reason — operators
57
+ * already saw the line; another copy is noise.
58
+ *
59
+ * This only governs log output; it does NOT record a work-skip TTL entry.
60
+ * Callers that want the work-skip fast path must also call `recordSkip`.
61
+ */
62
+ shouldLog(taskId: string, reason: string): boolean;
63
+ /**
64
+ * Forget all skip state for `taskId` — both the last-logged reason and the
65
+ * work-skip TTL entry. Called when the task is accepted/claimed so a future
66
+ * skip logs once and is re-checked immediately rather than fast-skipped.
67
+ */
68
+ forget(taskId: string): void;
69
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Dedupes "[daemon] skipping task X — reason" log lines so the engine-watcher
3
+ * loop doesn't emit hundreds of identical lines per minute when a single in-flight
4
+ * slot is occupied. The original loop logged once per `(taskId, reason)` per
5
+ * pass; this helper collapses repeat lines down to one per `(taskId, reason)`
6
+ * pair until the reason changes (or the entry is evicted to keep memory bounded).
7
+ *
8
+ * It additionally maintains a TTL-bounded *work-skip cache*: once `canAcceptTask`
9
+ * rejects a task, the engine-watcher records the skip here and — for
10
+ * `SKIP_RECHECK_TTL_MS` afterwards — fast-skips the task without re-running the
11
+ * (expensive) `canAcceptTask` work at all. With a large backlog of
12
+ * persistently-unacceptable tasks (e.g. ~40 evaluation tasks whose harness is
13
+ * not enabled), re-running manifest resolution + schema validation +
14
+ * `impl.isReady()` for every task every cycle blocks the Node event loop ~1-2s
15
+ * and starves the HTTP API. The cache makes a repeat cycle a Map lookup.
16
+ *
17
+ * SAFETY: the TTL re-check is mandatory and bounded. A task is NEVER skip-cached
18
+ * forever — once `SKIP_RECHECK_TTL_MS` has elapsed the cache reports the task as
19
+ * due for re-check, so a task that becomes acceptable (operator enables the
20
+ * harness, a slot frees up) is always picked up within the TTL.
21
+ *
22
+ * See jinn-mono-kzan (log dedup).
23
+ */
24
+ /**
25
+ * How long a task that `canAcceptTask` rejected stays in the work-skip cache
26
+ * before the engine-watcher re-evaluates it. Bounded on purpose: a false
27
+ * permanent skip (a claimable task that is never picked up) is a serious bug,
28
+ * so the cache is only ever a short-lived optimization.
29
+ */
30
+ export const SKIP_RECHECK_TTL_MS = 30_000;
31
+ export class SkipLogDeduper {
32
+ entriesByTaskId = new Map();
33
+ maxEntries;
34
+ recheckTtlMs;
35
+ constructor(maxEntries = 1024, recheckTtlMs = SKIP_RECHECK_TTL_MS) {
36
+ this.maxEntries = Math.max(1, maxEntries);
37
+ this.recheckTtlMs = Math.max(0, recheckTtlMs);
38
+ }
39
+ /**
40
+ * Returns true when the engine-watcher should re-run `canAcceptTask` for
41
+ * `taskId` — i.e. there is no cached skip, or the cached skip is older than
42
+ * `recheckTtlMs`. Returns false when a recent skip is still within the TTL,
43
+ * meaning the caller should fast-skip the task without doing the work.
44
+ *
45
+ * `now` is injectable for deterministic tests; defaults to `Date.now()`.
46
+ */
47
+ shouldRecheck(taskId, now = Date.now()) {
48
+ const entry = this.entriesByTaskId.get(taskId);
49
+ if (entry === undefined)
50
+ return true;
51
+ return now - entry.checkedAt >= this.recheckTtlMs;
52
+ }
53
+ /**
54
+ * Records that `canAcceptTask` rejected `taskId` with `reason`, stamping the
55
+ * skip with the current time so subsequent `shouldRecheck` calls can apply
56
+ * the TTL. Refreshes recency for the FIFO memory bound.
57
+ *
58
+ * `now` is injectable for deterministic tests; defaults to `Date.now()`.
59
+ */
60
+ recordSkip(taskId, reason, now = Date.now()) {
61
+ // Delete-then-set so the entry moves to the end of insertion order, keeping
62
+ // actively-skipped tasks away from the FIFO eviction front.
63
+ this.entriesByTaskId.delete(taskId);
64
+ this.entriesByTaskId.set(taskId, { reason, checkedAt: now });
65
+ if (this.entriesByTaskId.size > this.maxEntries) {
66
+ // Map iteration is insertion-order; evict the oldest entry.
67
+ const oldestKey = this.entriesByTaskId.keys().next().value;
68
+ if (oldestKey !== undefined) {
69
+ this.entriesByTaskId.delete(oldestKey);
70
+ }
71
+ }
72
+ }
73
+ /**
74
+ * Returns true when this `(taskId, reason)` pair has not been logged yet
75
+ * (or the previous reason for this `taskId` was different). Returns false
76
+ * when the previous skip for this task had the same reason — operators
77
+ * already saw the line; another copy is noise.
78
+ *
79
+ * This only governs log output; it does NOT record a work-skip TTL entry.
80
+ * Callers that want the work-skip fast path must also call `recordSkip`.
81
+ */
82
+ shouldLog(taskId, reason) {
83
+ const previous = this.entriesByTaskId.get(taskId);
84
+ if (previous?.reason === reason) {
85
+ // Refresh recency so we don't evict an actively-skipped task, but keep
86
+ // the original `checkedAt` so the TTL keeps counting from the first skip.
87
+ this.entriesByTaskId.delete(taskId);
88
+ this.entriesByTaskId.set(taskId, previous);
89
+ return false;
90
+ }
91
+ // New or changed reason: this is a fresh skip. Stamp it now so the
92
+ // work-skip TTL and the log-dedup state stay consistent for a caller that
93
+ // only calls `shouldLog`.
94
+ this.recordSkip(taskId, reason);
95
+ return true;
96
+ }
97
+ /**
98
+ * Forget all skip state for `taskId` — both the last-logged reason and the
99
+ * work-skip TTL entry. Called when the task is accepted/claimed so a future
100
+ * skip logs once and is re-checked immediately rather than fast-skipped.
101
+ */
102
+ forget(taskId) {
103
+ this.entriesByTaskId.delete(taskId);
104
+ }
105
+ }
106
+ //# sourceMappingURL=skip-log-dedup.js.map
@@ -0,0 +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"}