@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,51 @@
1
+ import type { Harness } from './types.js';
2
+ /**
3
+ * Tilde-abbreviate an absolute path for operator display when it sits under the
4
+ * real home dir; otherwise return it unchanged. Used by harness `getAuthSource`
5
+ * implementations so the dashboard shows `~/.hermes/.env` rather than a full
6
+ * `/Users/...` path.
7
+ */
8
+ export declare function displayPath(absolutePath: string): string;
9
+ export type HarnessAuthSource = {
10
+ sourceKind: 'file';
11
+ sourcePath: string;
12
+ absolutePath: string;
13
+ envKey: string;
14
+ docAnchor: string;
15
+ /**
16
+ * When true the credential file is structured (e.g. codex `auth.json`)
17
+ * rather than a flat `KEY=value` dotenv. The resolver then reports
18
+ * `loaded` from file existence alone and masks the suffix to null — it
19
+ * never parses a key line out of the structured body.
20
+ */
21
+ credentialIsJson?: boolean;
22
+ } | {
23
+ sourceKind: 'env';
24
+ envKey: string;
25
+ docAnchor: string;
26
+ } | {
27
+ sourceKind: 'session';
28
+ docAnchor: string;
29
+ };
30
+ export interface HarnessAuthStatusEntry {
31
+ harnessName: string;
32
+ sourceKind: 'file' | 'env' | 'session' | 'none';
33
+ sourcePath?: string;
34
+ envKey?: string;
35
+ keySuffix: string | null;
36
+ lastModified: string | null;
37
+ state: 'loaded' | 'missing' | 'unknown';
38
+ docAnchor?: string;
39
+ }
40
+ export interface HarnessAuthStatusResponse {
41
+ harnesses: HarnessAuthStatusEntry[];
42
+ }
43
+ export interface ResolveOptions {
44
+ /** Env bag for env-kind sources. Defaults to process.env. */
45
+ env?: NodeJS.ProcessEnv;
46
+ }
47
+ /**
48
+ * Resolve one harness's safe auth status. Iteration-safe: any error collapses
49
+ * to a session-shaped `unknown` entry rather than throwing.
50
+ */
51
+ export declare function resolveHarnessAuthStatus(harness: Harness, opts?: ResolveOptions): Promise<HarnessAuthStatusEntry>;
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Shared resolver for the operator dashboard's "Harness auth status" panel (#564).
3
+ *
4
+ * A harness declares WHERE its credential lives via `getAuthSource()`. This
5
+ * helper owns the unsafe part: stat the file for mtime, read the credential,
6
+ * keep ONLY the last-4 suffix, discard the full value. It NEVER returns full
7
+ * key bytes. See docs/runbooks/rotating-harness-keys.md.
8
+ */
9
+ import { stat, readFile } from 'node:fs/promises';
10
+ import { homedir } from 'node:os';
11
+ /**
12
+ * Tilde-abbreviate an absolute path for operator display when it sits under the
13
+ * real home dir; otherwise return it unchanged. Used by harness `getAuthSource`
14
+ * implementations so the dashboard shows `~/.hermes/.env` rather than a full
15
+ * `/Users/...` path.
16
+ */
17
+ export function displayPath(absolutePath) {
18
+ const home = homedir();
19
+ return absolutePath.startsWith(home) ? absolutePath.replace(home, '~') : absolutePath;
20
+ }
21
+ const MIN_SUFFIX_LEN = 8;
22
+ /** Last-4 suffix, or null when the value is too short / empty to safely show. */
23
+ function safeSuffix(value) {
24
+ if (value.length < MIN_SUFFIX_LEN)
25
+ return null;
26
+ return value.slice(-4);
27
+ }
28
+ /**
29
+ * Extract the value of a single `KEY=value` line from a dotenv-style file body.
30
+ * Matches the named key at the start of a line only — a value that merely
31
+ * mentions the key name elsewhere is ignored. Strips surrounding quotes.
32
+ */
33
+ function readEnvValueFromFile(body, envKey) {
34
+ for (const rawLine of body.split(/\r?\n/)) {
35
+ const line = rawLine.trimStart();
36
+ if (!line.startsWith(`${envKey}=`))
37
+ continue;
38
+ let value = line.slice(envKey.length + 1).trim();
39
+ if ((value.startsWith('"') && value.endsWith('"')) ||
40
+ (value.startsWith("'") && value.endsWith("'"))) {
41
+ value = value.slice(1, -1);
42
+ }
43
+ return value;
44
+ }
45
+ return undefined;
46
+ }
47
+ /**
48
+ * Resolve one harness's safe auth status. Iteration-safe: any error collapses
49
+ * to a session-shaped `unknown` entry rather than throwing.
50
+ */
51
+ export async function resolveHarnessAuthStatus(harness, opts = {}) {
52
+ if (!harness.getAuthSource) {
53
+ return {
54
+ harnessName: harness.name,
55
+ sourceKind: 'none',
56
+ keySuffix: null,
57
+ lastModified: null,
58
+ state: 'unknown',
59
+ };
60
+ }
61
+ let source;
62
+ try {
63
+ source = await harness.getAuthSource();
64
+ }
65
+ catch {
66
+ return {
67
+ harnessName: harness.name,
68
+ sourceKind: 'session',
69
+ keySuffix: null,
70
+ lastModified: null,
71
+ state: 'unknown',
72
+ };
73
+ }
74
+ if (source.sourceKind === 'session') {
75
+ return {
76
+ harnessName: harness.name,
77
+ sourceKind: 'session',
78
+ keySuffix: null,
79
+ lastModified: null,
80
+ state: 'unknown',
81
+ docAnchor: source.docAnchor,
82
+ };
83
+ }
84
+ if (source.sourceKind === 'env') {
85
+ const env = opts.env ?? process.env;
86
+ const value = env[source.envKey]?.trim() ?? '';
87
+ return {
88
+ harnessName: harness.name,
89
+ sourceKind: 'env',
90
+ envKey: source.envKey,
91
+ keySuffix: safeSuffix(value),
92
+ lastModified: null,
93
+ state: value.length > 0 ? 'loaded' : 'missing',
94
+ docAnchor: source.docAnchor,
95
+ };
96
+ }
97
+ // file-kind
98
+ let mtime = null;
99
+ let body;
100
+ try {
101
+ const st = await stat(source.absolutePath);
102
+ mtime = st.mtime.toISOString();
103
+ body = await readFile(source.absolutePath, 'utf8');
104
+ }
105
+ catch {
106
+ return {
107
+ harnessName: harness.name,
108
+ sourceKind: 'file',
109
+ sourcePath: source.sourcePath,
110
+ envKey: source.envKey,
111
+ keySuffix: null,
112
+ lastModified: null,
113
+ state: 'missing',
114
+ docAnchor: source.docAnchor,
115
+ };
116
+ }
117
+ // Structured credential files (e.g. codex auth.json): report `loaded` from
118
+ // existence + mtime, but never parse a key out — suffix stays masked.
119
+ if (source.credentialIsJson) {
120
+ return {
121
+ harnessName: harness.name,
122
+ sourceKind: 'file',
123
+ sourcePath: source.sourcePath,
124
+ envKey: source.envKey,
125
+ keySuffix: null,
126
+ lastModified: mtime,
127
+ state: 'loaded',
128
+ docAnchor: source.docAnchor,
129
+ };
130
+ }
131
+ const value = readEnvValueFromFile(body, source.envKey)?.trim() ?? '';
132
+ if (value.length === 0) {
133
+ return {
134
+ harnessName: harness.name,
135
+ sourceKind: 'file',
136
+ sourcePath: source.sourcePath,
137
+ envKey: source.envKey,
138
+ keySuffix: null,
139
+ lastModified: null,
140
+ state: 'missing',
141
+ docAnchor: source.docAnchor,
142
+ };
143
+ }
144
+ return {
145
+ harnessName: harness.name,
146
+ sourceKind: 'file',
147
+ sourcePath: source.sourcePath,
148
+ envKey: source.envKey,
149
+ keySuffix: safeSuffix(value),
150
+ lastModified: mtime,
151
+ state: 'loaded',
152
+ docAnchor: source.docAnchor,
153
+ };
154
+ }
155
+ //# sourceMappingURL=auth-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-source.js","sourceRoot":"","sources":["../../src/harnesses/auth-source.ts"],"names":[],"mappings":"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"}
@@ -22,9 +22,11 @@
22
22
  * Used for manifest signing: produce a deterministic byte string that two
23
23
  * independent parties can reproduce from the same object graph.
24
24
  */
25
- import { createRequire } from 'node:module';
26
- const require = createRequire(import.meta.url);
27
- const canonicalize = require('canonicalize');
25
+ // canonicalize v3 is ESM-only (no CJS entry); the client is `"type": "module"`
26
+ // so a native ESM default import is the correct interop (replaces the v2-era
27
+ // createRequire shim). v3 is packaging-only vs v2 — its RFC 8785 output is
28
+ // byte-identical, so existing content hashes / manifest signatures are stable.
29
+ import canonicalize from 'canonicalize';
28
30
  /**
29
31
  * Recursively replace NaN / ±Infinity with null so that canonicalize does not
30
32
  * throw — matching the JSON.stringify behaviour that the rest of the codebase
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../../../src/harnesses/engine/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAA2C,CAAC;AAEvF;;;;;GAKG;AACH,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC5D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,mEAAmE;QACnE,qEAAqE;QACrE,sEAAsE;QACtE,WAAW;QACX,MAAM,MAAM,GAAI,KAAoC,CAAC,MAAM,CAAC;QAC5D,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QACxE,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,wEAAwE;QACxE,uEAAuE;QACvE,kCAAkC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../../../src/harnesses/engine/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,+EAA+E;AAC/E,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,OAAO,YAAY,MAAM,cAAc,CAAC;AAExC;;;;;GAKG;AACH,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC5D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,mEAAmE;QACnE,qEAAqE;QACrE,sEAAsE;QACtE,WAAW;QACX,MAAM,MAAM,GAAI,KAAoC,CAAC,MAAM,CAAC;QAC5D,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QACxE,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,wEAAwE;QACxE,uEAAuE;QACvE,kCAAkC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -16,6 +16,7 @@ import type { Harness, HarnessContext, RuntimePlugin } from '../types.js';
16
16
  import type { IdentityPublisher, ReputationRegistryClient, ResolvedAgent } from '../../erc8004/index.js';
17
17
  import type { Task } from '../../types/task.js';
18
18
  import { TrajectoryCollector } from '../../trajectory/index.js';
19
+ import type { ScrubPipeline } from '../../trajectory/scrub/pipeline.js';
19
20
  import type { SolverNetManifestV1 } from '../../vendor/@jinn-network/sdk/dist/solvernets/index.js';
20
21
  import { type FreezeViolation } from '../../daemon/freeze-fence.js';
21
22
  export declare class NotImplementedError extends Error {
@@ -70,6 +71,10 @@ export interface JoinedSolverNetsView {
70
71
  } | undefined;
71
72
  /** Enumerate all joined manifest CIDs (used for digest-based filtering). */
72
73
  manifestCids(): string[];
74
+ /** Add/replace one joined entry live (used by the hot-apply join applier, #1037). */
75
+ set(manifestCid: string, entry: {
76
+ roles: Array<'solver' | 'evaluator'>;
77
+ }): void;
73
78
  }
74
79
  /**
75
80
  * Build a `JoinedSolverNetsView` from the raw operator-config block.
@@ -82,6 +87,17 @@ export declare function joinedSolverNetsViewFromConfig(joined: Record<string, {
82
87
  manifestCid: string;
83
88
  roles: Array<'solver' | 'evaluator'>;
84
89
  }> | undefined): JoinedSolverNetsView | undefined;
90
+ /**
91
+ * Mutable `JoinedSolverNetsView` for the running daemon. Unlike
92
+ * `joinedSolverNetsViewFromConfig` (boot snapshot), the applier
93
+ * (`daemon/join-applier.ts`, #1037) keeps a handle and calls `set()` when a
94
+ * join is hot-applied, so the engine's per-task eligibility check sees the new
95
+ * cid on its next call without a restart.
96
+ */
97
+ export declare function createMutableJoinedSolverNetsView(initial: Record<string, {
98
+ manifestCid: string;
99
+ roles: Array<'solver' | 'evaluator'>;
100
+ }> | undefined): JoinedSolverNetsView;
85
101
  /**
86
102
  * Resolves a launched SolverNet manifest by IPFS CID.
87
103
  *
@@ -140,6 +156,12 @@ export interface TaskEngineOptions {
140
156
  */
141
157
  implRegistry?: ImplRegistry;
142
158
  solverNetRegistry?: SolverNetRegistryLike;
159
+ /**
160
+ * Seller-side scrub pipeline applied to trajectory spans at emit time. When
161
+ * absent, the engine builds the default (openredaction + secretlint); supply
162
+ * one to add the ML PII detector.
163
+ */
164
+ scrubPipeline?: ScrubPipeline;
143
165
  /**
144
166
  * Per-launch operator eligibility filter (Task 28 of
145
167
  * `spec/2026-05-05-solvernet-creation-and-launch.md`).
@@ -287,6 +309,7 @@ export declare class TaskEngine {
287
309
  protected readonly deliveryDeps: TaskEngineOptions['deliveryDeps'];
288
310
  protected readonly implRegistry: TaskEngineOptions['implRegistry'];
289
311
  protected readonly solverNetRegistry: TaskEngineOptions['solverNetRegistry'];
312
+ protected readonly scrubPipeline: ScrubPipeline;
290
313
  protected readonly joinedSolverNets: TaskEngineOptions['joinedSolverNets'];
291
314
  protected readonly manifestResolver: TaskEngineOptions['manifestResolver'];
292
315
  protected readonly identityPublisher: TaskEngineOptions['identityPublisher'];
@@ -576,6 +599,15 @@ export declare class TaskEngine {
576
599
  * TCAttemptAlreadyFinalized, …). We mark the row RACE_LOST and emit a
577
600
  * `kind=race_lost` activity event so operators can audit prunes
578
601
  * without inflating the FAILED counter (#896).
602
+ * - A transport-transient error (e.g. `AllRpcsFailedError` — every provider
603
+ * in the L2 fallback chain failed at once) on a task whose delivery window
604
+ * is still open: leave the row in its current in-flight state so the next
605
+ * tick re-drives it once the RPCs recover, and emit a `tick_error` (warn)
606
+ * event instead of inflating the FAILED counter. Without this the daemon
607
+ * stamped the row FAILED, dropping it from `getInFlight()` permanently, so
608
+ * L2 work went silent until a manual restart (#912). Past-window transient
609
+ * errors still terminalize to avoid churning on work that can no longer
610
+ * settle.
579
611
  * - Everything else: existing markFailed behaviour. When invoked from
580
612
  * recovery, `contextLabel === 'recovery'` so the failure_reason
581
613
  * carries the `recovery:` prefix the original code path used.
@@ -18,14 +18,17 @@ import { assembleAndSignEnvelope, } from './envelope-assembly.js';
18
18
  import { deliverAndClaim, } from './delivery.js';
19
19
  import { SafeInnerRevertError, isNonRecoverableInnerRevert, formatDecodedRevert, } from '../../adapters/mech/safe-revert.js';
20
20
  import { emitEvent } from '../../observability/emit-event.js';
21
+ import { isRecoverableTransactionError } from '../../tx-retry.js';
21
22
  import { SkippableError } from '../types.js';
22
23
  import { submitEvaluatorFeedback, codeDigestSha256ToBytes32, encodeExecutionPayload, encodeExecutionPayloadV2, modeStringToFlag, } from '../../erc8004/index.js';
23
24
  import { TrajectoryCollector, emitTrajectory } from '../../trajectory/index.js';
25
+ import { buildScrubPipeline } from '../../trajectory/scrub/build.js';
24
26
  import { uploadToIpfs } from '../../adapters/mech/ipfs.js';
25
27
  import { VerdictCode } from '../../adapters/mech/verdict-code.js';
26
28
  import { buildInfo } from '../../build-info.js';
27
29
  import { getSolverNetContract } from '../../vendor/@jinn-network/sdk/dist/solvernets/index.js';
28
30
  import { runHarnessWithFreezeFence, } from '../../daemon/freeze-fence.js';
31
+ import { recordLoopTick } from '../../daemon/loop-heartbeat.js';
29
32
  import { harnessStateDirName } from '../names.js';
30
33
  import { recordTaskCost } from '../../spend/record.js';
31
34
  // ── Sentinel error ────────────────────────────────────────────────────────────
@@ -61,6 +64,25 @@ export function joinedSolverNetsViewFromConfig(joined) {
61
64
  return {
62
65
  get: (cid) => map.get(cid),
63
66
  manifestCids: () => [...map.keys()],
67
+ set: (cid, entry) => { map.set(cid, entry); },
68
+ };
69
+ }
70
+ /**
71
+ * Mutable `JoinedSolverNetsView` for the running daemon. Unlike
72
+ * `joinedSolverNetsViewFromConfig` (boot snapshot), the applier
73
+ * (`daemon/join-applier.ts`, #1037) keeps a handle and calls `set()` when a
74
+ * join is hot-applied, so the engine's per-task eligibility check sees the new
75
+ * cid on its next call without a restart.
76
+ */
77
+ export function createMutableJoinedSolverNetsView(initial) {
78
+ const map = new Map();
79
+ for (const [key, entry] of Object.entries(initial ?? {})) {
80
+ map.set(entry.manifestCid ?? key, { roles: entry.roles });
81
+ }
82
+ return {
83
+ get: (cid) => map.get(cid),
84
+ manifestCids: () => [...map.keys()],
85
+ set: (cid, entry) => { map.set(cid, entry); },
64
86
  };
65
87
  }
66
88
  // ── TaskEngine ─────────────────────────────────────────────────────────
@@ -72,6 +94,7 @@ export class TaskEngine {
72
94
  deliveryDeps;
73
95
  implRegistry;
74
96
  solverNetRegistry;
97
+ scrubPipeline;
75
98
  joinedSolverNets;
76
99
  manifestResolver;
77
100
  identityPublisher;
@@ -124,6 +147,7 @@ export class TaskEngine {
124
147
  this.deliveryDeps = opts.deliveryDeps;
125
148
  this.implRegistry = opts.implRegistry;
126
149
  this.solverNetRegistry = opts.solverNetRegistry;
150
+ this.scrubPipeline = opts.scrubPipeline ?? buildScrubPipeline();
127
151
  this.joinedSolverNets = opts.joinedSolverNets;
128
152
  this.manifestResolver = opts.manifestResolver;
129
153
  this.identityPublisher = opts.identityPublisher;
@@ -281,6 +305,7 @@ export class TaskEngine {
281
305
  catch (err) {
282
306
  console.error('[harness-engine] tick loop error (continuing):', err instanceof Error ? err.message : err);
283
307
  }
308
+ recordLoopTick(this.store, 'engine-tick'); // #1043 loop watchdog
284
309
  if (this.stopped)
285
310
  break;
286
311
  await Promise.race([
@@ -761,7 +786,17 @@ export class TaskEngine {
761
786
  throw new NotImplementedError('runImpl');
762
787
  }
763
788
  const runtimePlugins = solverNet?.runtimePlugins ?? [];
764
- this.runtimePluginsByRequest.set(task.requestId, runtimePlugins);
789
+ // #1035: merge harness self-attributed plugins (e.g. claude-code-learner)
790
+ // into the envelope carrier so they appear in executor.plugins. This is a
791
+ // SEPARATE array from `runtimePlugins`: the latter still feeds
792
+ // ctx.runtimePlugins / ctx.solverPluginRoots (which the harness uses to
793
+ // LOAD solver plugins), and the learner plugin is already loaded by the
794
+ // harness itself via its own plugin root — adding it there would double-load.
795
+ const attributedPlugins = [
796
+ ...runtimePlugins,
797
+ ...(impl.attributionPlugins?.() ?? []),
798
+ ];
799
+ this.runtimePluginsByRequest.set(task.requestId, attributedPlugins);
765
800
  const workingDir = task.workingDir ?? join(this.paths.workingDirRoot, task.requestId);
766
801
  const kindSeg = solverType.replace(/[.:]/g, '_');
767
802
  const implStateDir = task.implStateDir ?? (kindSeg
@@ -846,7 +881,7 @@ export class TaskEngine {
846
881
  informationalClaim: skippedOutput.informational ?? null,
847
882
  solutionOutputsJson: JSON.stringify(skippedOutput),
848
883
  implName: impl.name,
849
- runtimePluginsJson: JSON.stringify(runtimePlugins),
884
+ runtimePluginsJson: JSON.stringify(attributedPlugins),
850
885
  });
851
886
  console.log(`[harness-engine] ${task.requestId} RUNNING → POST_SNAPSHOT via impl=${impl.name} (skipped)`);
852
887
  return;
@@ -890,7 +925,7 @@ export class TaskEngine {
890
925
  informationalClaim: output.informational ?? null,
891
926
  solutionOutputsJson: JSON.stringify(output),
892
927
  implName: impl.name,
893
- runtimePluginsJson: JSON.stringify(runtimePlugins),
928
+ runtimePluginsJson: JSON.stringify(attributedPlugins),
894
929
  });
895
930
  }
896
931
  finally {
@@ -981,6 +1016,7 @@ export class TaskEngine {
981
1016
  signerAddress: account.address,
982
1017
  ipfsRegistryUrl: this.envelopeDeps.ipfsRegistryUrl,
983
1018
  scrub: packagingDepsWithReq.donation?.scrub,
1019
+ scrubPipeline: this.scrubPipeline,
984
1020
  });
985
1021
  const sources = [];
986
1022
  if (packagingDepsWithReq.donation?.enabled) {
@@ -1488,10 +1524,7 @@ export class TaskEngine {
1488
1524
  case 'UNRESOLVED':
1489
1525
  return VerdictCode.Unresolved;
1490
1526
  default:
1491
- // gatingClaim is null, verdict is absent, or the string is unrecognized.
1492
- // Return Invalid(3) — not Pass(1). Pass must come from an explicit PASS/SCORED verdict.
1493
- console.warn(`[harness-engine] verdictCodeForTask: unrecognized gatingClaim.verdict (got=${String(raw)}); defaulting to Invalid(3) — should never happen, indicates the evaluator harness didn't set gatingClaim.verdict before submission`);
1494
- return VerdictCode.Invalid;
1527
+ throw new Error(`[harness-engine] verdictCodeForTask: missing or unrecognized gatingClaim.verdict (got=${String(raw)}); refusing to claim Invalid(3) on-chain without an explicit evaluator verdict`);
1495
1528
  }
1496
1529
  }
1497
1530
  async _maybePostEvaluatorFeedback(task) {
@@ -1630,6 +1663,15 @@ export class TaskEngine {
1630
1663
  * TCAttemptAlreadyFinalized, …). We mark the row RACE_LOST and emit a
1631
1664
  * `kind=race_lost` activity event so operators can audit prunes
1632
1665
  * without inflating the FAILED counter (#896).
1666
+ * - A transport-transient error (e.g. `AllRpcsFailedError` — every provider
1667
+ * in the L2 fallback chain failed at once) on a task whose delivery window
1668
+ * is still open: leave the row in its current in-flight state so the next
1669
+ * tick re-drives it once the RPCs recover, and emit a `tick_error` (warn)
1670
+ * event instead of inflating the FAILED counter. Without this the daemon
1671
+ * stamped the row FAILED, dropping it from `getInFlight()` permanently, so
1672
+ * L2 work went silent until a manual restart (#912). Past-window transient
1673
+ * errors still terminalize to avoid churning on work that can no longer
1674
+ * settle.
1633
1675
  * - Everything else: existing markFailed behaviour. When invoked from
1634
1676
  * recovery, `contextLabel === 'recovery'` so the failure_reason
1635
1677
  * carries the `recovery:` prefix the original code path used.
@@ -1652,6 +1694,24 @@ export class TaskEngine {
1652
1694
  return 'race_lost';
1653
1695
  }
1654
1696
  const reason = err instanceof Error ? err.message : String(err);
1697
+ // A transport-transient failure (all RPC providers in the fallback chain
1698
+ // blipped at once, 429s, timeouts, …) is not the task's fault and is not
1699
+ // permanent. Leave the row in its in-flight state — do NOT call
1700
+ // markFailed, which would drop it from getInFlight() forever (#912) — so
1701
+ // the engine-tick loop re-drives it once the RPCs recover. The tick loop
1702
+ // IS the retry; there is no per-task attempt counter. Skip this only once
1703
+ // the delivery window has closed, so we never churn on work that can no
1704
+ // longer settle on-chain.
1705
+ if (task.windowEndTs > Date.now() && isRecoverableTransactionError(err)) {
1706
+ emitEvent(this.store, {
1707
+ kind: 'tick_error',
1708
+ requestId: task.requestId,
1709
+ solverType: task.solverType ?? undefined,
1710
+ outcome: 'warn',
1711
+ detail: `transient RPC failure in ${contextLabel}; left ${task.state} for retry: ${reason}`,
1712
+ }, 'harness-engine');
1713
+ return 'transient';
1714
+ }
1655
1715
  const stamped = contextLabel === 'recovery' ? `recovery: ${reason}` : reason;
1656
1716
  this.persistence.markFailed(task.requestId, stamped);
1657
1717
  return 'failed';
@@ -1695,8 +1755,15 @@ export class TaskEngine {
1695
1755
  if (current && current.state === task.state) {
1696
1756
  const classification = this._classifyAndMarkTerminal(task, err, 'recovery');
1697
1757
  const reason = err instanceof Error ? err.message : String(err);
1698
- const log = classification === 'race_lost' ? console.log : console.error;
1699
- const verb = classification === 'race_lost' ? 'pruned' : 'failed';
1758
+ // 'transient' leaves the row in-flight (not terminal); the next tick
1759
+ // re-drives it once the RPCs recover (#912). Log it at warn so the
1760
+ // stall is visible without firing the error-level alerting that a
1761
+ // genuine failure does.
1762
+ const { log, verb } = {
1763
+ race_lost: { log: console.log, verb: 'pruned' },
1764
+ transient: { log: console.warn, verb: 'deferred (transient RPC)' },
1765
+ failed: { log: console.error, verb: 'failed' },
1766
+ }[classification];
1700
1767
  log(`[harness-engine] resume ${verb} for ${task.requestId}: ${reason}`);
1701
1768
  }
1702
1769
  throw err;