@jinn-network/client 0.1.1 → 0.1.2-canary.6237288d

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 (424) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/CONTRIBUTING.md +123 -0
  3. package/README.md +213 -37
  4. package/deployments/deployment-claim-registry-baseSepolia.json +13 -0
  5. package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +15 -0
  6. package/dist/adapters/adapter.d.ts +7 -0
  7. package/dist/adapters/claim-registry/abi.d.ts +127 -0
  8. package/dist/adapters/claim-registry/abi.js +93 -0
  9. package/dist/adapters/claim-registry/abi.js.map +1 -0
  10. package/dist/adapters/claim-registry/client.d.ts +89 -0
  11. package/dist/adapters/claim-registry/client.js +205 -0
  12. package/dist/adapters/claim-registry/client.js.map +1 -0
  13. package/dist/adapters/mech/adapter.d.ts +5 -0
  14. package/dist/adapters/mech/adapter.js +211 -56
  15. package/dist/adapters/mech/adapter.js.map +1 -1
  16. package/dist/adapters/mech/contracts.d.ts +19 -1
  17. package/dist/adapters/mech/contracts.js +112 -8
  18. package/dist/adapters/mech/contracts.js.map +1 -1
  19. package/dist/adapters/mech/ipfs.d.ts +38 -5
  20. package/dist/adapters/mech/ipfs.js +174 -17
  21. package/dist/adapters/mech/ipfs.js.map +1 -1
  22. package/dist/adapters/mech/safe.js +8 -6
  23. package/dist/adapters/mech/safe.js.map +1 -1
  24. package/dist/adapters/mech/types.d.ts +22 -46
  25. package/dist/adapters/mech/types.js +16 -35
  26. package/dist/adapters/mech/types.js.map +1 -1
  27. package/dist/api/balance-build.js +3 -3
  28. package/dist/api/balance-build.js.map +1 -1
  29. package/dist/api/fleet-build.js +35 -40
  30. package/dist/api/fleet-build.js.map +1 -1
  31. package/dist/api/gather-status.d.ts +6 -0
  32. package/dist/api/gather-status.js +187 -4
  33. package/dist/api/gather-status.js.map +1 -1
  34. package/dist/api/history-build.d.ts +5 -1
  35. package/dist/api/history-build.js +51 -26
  36. package/dist/api/history-build.js.map +1 -1
  37. package/dist/api/portfolio-v0-build.d.ts +83 -0
  38. package/dist/api/portfolio-v0-build.js +143 -0
  39. package/dist/api/portfolio-v0-build.js.map +1 -0
  40. package/dist/api/portfolio-v0-doctor.d.ts +37 -0
  41. package/dist/api/portfolio-v0-doctor.js +123 -0
  42. package/dist/api/portfolio-v0-doctor.js.map +1 -0
  43. package/dist/api/rewards-build.js +30 -14
  44. package/dist/api/rewards-build.js.map +1 -1
  45. package/dist/api/status-build.d.ts +39 -6
  46. package/dist/api/status-build.js +3 -1
  47. package/dist/api/status-build.js.map +1 -1
  48. package/dist/api/status-rollup-build.d.ts +2 -0
  49. package/dist/api/status-rollup-build.js +30 -3
  50. package/dist/api/status-rollup-build.js.map +1 -1
  51. package/dist/bin/jinn-mcp.d.ts +0 -12
  52. package/dist/bin/jinn-mcp.js +5 -14
  53. package/dist/bin/jinn-mcp.js.map +1 -1
  54. package/dist/build-meta.json +1 -1
  55. package/dist/cli/commands/auth.js +137 -25
  56. package/dist/cli/commands/auth.js.map +1 -1
  57. package/dist/cli/commands/balance.js +8 -1
  58. package/dist/cli/commands/balance.js.map +1 -1
  59. package/dist/cli/commands/bootstrap.js +23 -0
  60. package/dist/cli/commands/bootstrap.js.map +1 -1
  61. package/dist/cli/commands/doctor.js +160 -14
  62. package/dist/cli/commands/doctor.js.map +1 -1
  63. package/dist/cli/commands/fleet-scale.js +1 -0
  64. package/dist/cli/commands/fleet-scale.js.map +1 -1
  65. package/dist/cli/commands/fleet.js +10 -1
  66. package/dist/cli/commands/fleet.js.map +1 -1
  67. package/dist/cli/commands/fund-requirements.js +2 -0
  68. package/dist/cli/commands/fund-requirements.js.map +1 -1
  69. package/dist/cli/commands/history.js +25 -6
  70. package/dist/cli/commands/history.js.map +1 -1
  71. package/dist/cli/commands/intents.d.ts +17 -0
  72. package/dist/cli/commands/intents.js +489 -0
  73. package/dist/cli/commands/intents.js.map +1 -0
  74. package/dist/cli/commands/keys-backup.js +13 -11
  75. package/dist/cli/commands/keys-backup.js.map +1 -1
  76. package/dist/cli/commands/logs.js +35 -11
  77. package/dist/cli/commands/logs.js.map +1 -1
  78. package/dist/cli/commands/mcp.d.ts +3 -0
  79. package/dist/cli/commands/mcp.js +19 -0
  80. package/dist/cli/commands/mcp.js.map +1 -0
  81. package/dist/cli/commands/plugin-install.js +8 -4
  82. package/dist/cli/commands/plugin-install.js.map +1 -1
  83. package/dist/cli/commands/quickstart.js +99 -5
  84. package/dist/cli/commands/quickstart.js.map +1 -1
  85. package/dist/cli/commands/rewards.js +27 -1
  86. package/dist/cli/commands/rewards.js.map +1 -1
  87. package/dist/cli/commands/run.js +38 -0
  88. package/dist/cli/commands/run.js.map +1 -1
  89. package/dist/cli/commands/status.js +11 -1
  90. package/dist/cli/commands/status.js.map +1 -1
  91. package/dist/cli/commands/submit-intent.js +110 -44
  92. package/dist/cli/commands/submit-intent.js.map +1 -1
  93. package/dist/cli/commands/version.js +1 -0
  94. package/dist/cli/commands/version.js.map +1 -1
  95. package/dist/cli/deployment-digest.js +5 -0
  96. package/dist/cli/deployment-digest.js.map +1 -1
  97. package/dist/cli/execution-context.js +1 -0
  98. package/dist/cli/execution-context.js.map +1 -1
  99. package/dist/cli/index.js +4 -0
  100. package/dist/cli/index.js.map +1 -1
  101. package/dist/cli/intent-registry-access.d.ts +62 -0
  102. package/dist/cli/intent-registry-access.js +165 -0
  103. package/dist/cli/intent-registry-access.js.map +1 -0
  104. package/dist/cli/introspection-context.js +12 -8
  105. package/dist/cli/introspection-context.js.map +1 -1
  106. package/dist/cli/password.d.ts +21 -9
  107. package/dist/cli/password.js +45 -24
  108. package/dist/cli/password.js.map +1 -1
  109. package/dist/config.d.ts +137 -8
  110. package/dist/config.js +70 -12
  111. package/dist/config.js.map +1 -1
  112. package/dist/daemon/balance-topup-loop.js +32 -4
  113. package/dist/daemon/balance-topup-loop.js.map +1 -1
  114. package/dist/daemon/creator.d.ts +7 -4
  115. package/dist/daemon/creator.js +55 -26
  116. package/dist/daemon/creator.js.map +1 -1
  117. package/dist/daemon/daemon.d.ts +35 -3
  118. package/dist/daemon/daemon.js +99 -7
  119. package/dist/daemon/daemon.js.map +1 -1
  120. package/dist/daemon/delivery-watcher.d.ts +3 -1
  121. package/dist/daemon/delivery-watcher.js +19 -1
  122. package/dist/daemon/delivery-watcher.js.map +1 -1
  123. package/dist/daemon/reward-claim-loop.js +38 -1
  124. package/dist/daemon/reward-claim-loop.js.map +1 -1
  125. package/dist/dashboard/index.html +71 -496
  126. package/dist/discovery/registry.d.ts +54 -0
  127. package/dist/discovery/registry.js +73 -0
  128. package/dist/discovery/registry.js.map +1 -1
  129. package/dist/earning/bootstrap.d.ts +2 -1
  130. package/dist/earning/bootstrap.js +71 -33
  131. package/dist/earning/bootstrap.js.map +1 -1
  132. package/dist/earning/contracts.d.ts +10 -0
  133. package/dist/earning/contracts.js +24 -0
  134. package/dist/earning/contracts.js.map +1 -1
  135. package/dist/earning/jinn-rewards.d.ts +9 -0
  136. package/dist/earning/jinn-rewards.js +7 -0
  137. package/dist/earning/jinn-rewards.js.map +1 -1
  138. package/dist/earning/stolas-claim.d.ts +6 -0
  139. package/dist/earning/stolas-claim.js +7 -0
  140. package/dist/earning/stolas-claim.js.map +1 -1
  141. package/dist/intents/kinds/constants.d.ts +5 -0
  142. package/dist/intents/kinds/constants.js +6 -0
  143. package/dist/intents/kinds/constants.js.map +1 -0
  144. package/dist/intents/kinds/index.d.ts +28 -0
  145. package/dist/intents/kinds/index.js +50 -0
  146. package/dist/intents/kinds/index.js.map +1 -0
  147. package/dist/intents/kinds/portfolio-v0.d.ts +2 -0
  148. package/dist/intents/kinds/portfolio-v0.js +13 -0
  149. package/dist/intents/kinds/portfolio-v0.js.map +1 -0
  150. package/dist/intents/kinds/prediction-apy-v0.d.ts +3 -0
  151. package/dist/intents/kinds/prediction-apy-v0.js +21 -0
  152. package/dist/intents/kinds/prediction-apy-v0.js.map +1 -0
  153. package/dist/intents/kinds/prediction-v0.d.ts +3 -0
  154. package/dist/intents/kinds/prediction-v0.js +32 -0
  155. package/dist/intents/kinds/prediction-v0.js.map +1 -0
  156. package/dist/intents/kinds/spec-kind.d.ts +38 -0
  157. package/dist/intents/kinds/spec-kind.js +6 -0
  158. package/dist/intents/kinds/spec-kind.js.map +1 -0
  159. package/dist/intents/posting-service.d.ts +26 -0
  160. package/dist/intents/posting-service.js +218 -0
  161. package/dist/intents/posting-service.js.map +1 -0
  162. package/dist/intents/prediction-apy-v0-auto.d.ts +11 -0
  163. package/dist/intents/prediction-apy-v0-auto.js +46 -0
  164. package/dist/intents/prediction-apy-v0-auto.js.map +1 -0
  165. package/dist/intents/prediction-apy-v0-template.d.ts +8 -0
  166. package/dist/intents/prediction-apy-v0-template.js +22 -0
  167. package/dist/intents/prediction-apy-v0-template.js.map +1 -0
  168. package/dist/intents/prediction-v0-auto.d.ts +53 -0
  169. package/dist/intents/prediction-v0-auto.js +84 -0
  170. package/dist/intents/prediction-v0-auto.js.map +1 -0
  171. package/dist/intents/prediction-v0-template.d.ts +70 -0
  172. package/dist/intents/prediction-v0-template.js +145 -0
  173. package/dist/intents/prediction-v0-template.js.map +1 -0
  174. package/dist/intents/sources.d.ts +39 -0
  175. package/dist/intents/sources.js +42 -0
  176. package/dist/intents/sources.js.map +1 -0
  177. package/dist/main.js +175 -3
  178. package/dist/main.js.map +1 -1
  179. package/dist/mcp/operator-server.d.ts +1 -1
  180. package/dist/mcp/operator-server.js +1 -1
  181. package/dist/mcp/server.js +8 -4
  182. package/dist/mcp/server.js.map +1 -1
  183. package/dist/observability/emit-event.d.ts +12 -0
  184. package/dist/observability/emit-event.js +27 -0
  185. package/dist/observability/emit-event.js.map +1 -0
  186. package/dist/preflight/api-port.d.ts +13 -0
  187. package/dist/preflight/api-port.js +32 -0
  188. package/dist/preflight/api-port.js.map +1 -0
  189. package/dist/preflight/claude-auth.d.ts +12 -1
  190. package/dist/preflight/claude-auth.js +21 -3
  191. package/dist/preflight/claude-auth.js.map +1 -1
  192. package/dist/preflight/rpc-network.d.ts +44 -0
  193. package/dist/preflight/rpc-network.js +121 -0
  194. package/dist/preflight/rpc-network.js.map +1 -0
  195. package/dist/restorer/engine/canonical-json.d.ts +18 -0
  196. package/dist/restorer/engine/canonical-json.js +59 -0
  197. package/dist/restorer/engine/canonical-json.js.map +1 -0
  198. package/dist/restorer/engine/claim.d.ts +69 -0
  199. package/dist/restorer/engine/claim.js +104 -0
  200. package/dist/restorer/engine/claim.js.map +1 -0
  201. package/dist/restorer/engine/delivery.d.ts +52 -0
  202. package/dist/restorer/engine/delivery.js +63 -0
  203. package/dist/restorer/engine/delivery.js.map +1 -0
  204. package/dist/restorer/engine/engine.d.ts +213 -0
  205. package/dist/restorer/engine/engine.js +769 -0
  206. package/dist/restorer/engine/engine.js.map +1 -0
  207. package/dist/restorer/engine/manifest-assembly.d.ts +67 -0
  208. package/dist/restorer/engine/manifest-assembly.js +79 -0
  209. package/dist/restorer/engine/manifest-assembly.js.map +1 -0
  210. package/dist/restorer/engine/packaging.d.ts +87 -0
  211. package/dist/restorer/engine/packaging.js +350 -0
  212. package/dist/restorer/engine/packaging.js.map +1 -0
  213. package/dist/restorer/engine/persistence.d.ts +170 -0
  214. package/dist/restorer/engine/persistence.js +381 -0
  215. package/dist/restorer/engine/persistence.js.map +1 -0
  216. package/dist/restorer/engine/recovery.d.ts +22 -0
  217. package/dist/restorer/engine/recovery.js +24 -0
  218. package/dist/restorer/engine/recovery.js.map +1 -0
  219. package/dist/restorer/engine/registry.d.ts +62 -0
  220. package/dist/restorer/engine/registry.js +73 -0
  221. package/dist/restorer/engine/registry.js.map +1 -0
  222. package/dist/restorer/engine/signing.d.ts +30 -0
  223. package/dist/restorer/engine/signing.js +39 -0
  224. package/dist/restorer/engine/signing.js.map +1 -0
  225. package/dist/restorer/engine/state.d.ts +42 -0
  226. package/dist/restorer/engine/state.js +87 -0
  227. package/dist/restorer/engine/state.js.map +1 -0
  228. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.d.ts +64 -0
  229. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js +96 -0
  230. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js.map +1 -0
  231. package/dist/restorer/impls/claude-mcp-hyperliquid/index.d.ts +104 -0
  232. package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +721 -0
  233. package/dist/restorer/impls/claude-mcp-hyperliquid/index.js.map +1 -0
  234. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +137 -0
  235. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js +865 -0
  236. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -0
  237. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.d.ts +74 -0
  238. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js +74 -0
  239. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js.map +1 -0
  240. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.d.ts +97 -0
  241. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js +226 -0
  242. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js.map +1 -0
  243. package/dist/restorer/impls/claude-mcp-prediction/index.d.ts +44 -0
  244. package/dist/restorer/impls/claude-mcp-prediction/index.js +239 -0
  245. package/dist/restorer/impls/claude-mcp-prediction/index.js.map +1 -0
  246. package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.d.ts +38 -0
  247. package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.js +135 -0
  248. package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.js.map +1 -0
  249. package/dist/restorer/impls/claude-mcp-prediction/prompt.d.ts +8 -0
  250. package/dist/restorer/impls/claude-mcp-prediction/prompt.js +54 -0
  251. package/dist/restorer/impls/claude-mcp-prediction/prompt.js.map +1 -0
  252. package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.d.ts +36 -0
  253. package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js +137 -0
  254. package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js.map +1 -0
  255. package/dist/restorer/impls/claude-mcp-prediction/types.d.ts +84 -0
  256. package/dist/restorer/impls/claude-mcp-prediction/types.js +6 -0
  257. package/dist/restorer/impls/claude-mcp-prediction/types.js.map +1 -0
  258. package/dist/restorer/impls/claude-mcp-prediction-apy/index.d.ts +34 -0
  259. package/dist/restorer/impls/claude-mcp-prediction-apy/index.js +233 -0
  260. package/dist/restorer/impls/claude-mcp-prediction-apy/index.js.map +1 -0
  261. package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.d.ts +18 -0
  262. package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.js +136 -0
  263. package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.js.map +1 -0
  264. package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.d.ts +7 -0
  265. package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.js +46 -0
  266. package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.js.map +1 -0
  267. package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.d.ts +27 -0
  268. package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.js +128 -0
  269. package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.js.map +1 -0
  270. package/dist/restorer/impls/claude-mcp-prediction-apy/types.d.ts +64 -0
  271. package/dist/restorer/impls/claude-mcp-prediction-apy/types.js +6 -0
  272. package/dist/restorer/impls/claude-mcp-prediction-apy/types.js.map +1 -0
  273. package/dist/restorer/impls/evaluation-context.d.ts +16 -0
  274. package/dist/restorer/impls/evaluation-context.js +18 -0
  275. package/dist/restorer/impls/evaluation-context.js.map +1 -0
  276. package/dist/restorer/impls/index.d.ts +46 -0
  277. package/dist/restorer/impls/index.js +88 -0
  278. package/dist/restorer/impls/index.js.map +1 -0
  279. package/dist/restorer/impls/legacy-claude/index.d.ts +52 -0
  280. package/dist/restorer/impls/legacy-claude/index.js +140 -0
  281. package/dist/restorer/impls/legacy-claude/index.js.map +1 -0
  282. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.d.ts +68 -0
  283. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js +117 -0
  284. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js.map +1 -0
  285. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.d.ts +49 -0
  286. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js +91 -0
  287. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js.map +1 -0
  288. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.d.ts +78 -0
  289. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js +274 -0
  290. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js.map +1 -0
  291. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.d.ts +23 -0
  292. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js +49 -0
  293. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js.map +1 -0
  294. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.d.ts +25 -0
  295. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js +44 -0
  296. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js.map +1 -0
  297. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.d.ts +17 -0
  298. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js +43 -0
  299. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js.map +1 -0
  300. package/dist/restorer/impls/portfolio-v0-evaluator/index.d.ts +44 -0
  301. package/dist/restorer/impls/portfolio-v0-evaluator/index.js +440 -0
  302. package/dist/restorer/impls/portfolio-v0-evaluator/index.js.map +1 -0
  303. package/dist/restorer/impls/portfolio-v0-evaluator/score.d.ts +21 -0
  304. package/dist/restorer/impls/portfolio-v0-evaluator/score.js +32 -0
  305. package/dist/restorer/impls/portfolio-v0-evaluator/score.js.map +1 -0
  306. package/dist/restorer/impls/portfolio-v0-evaluator/types.d.ts +34 -0
  307. package/dist/restorer/impls/portfolio-v0-evaluator/types.js +8 -0
  308. package/dist/restorer/impls/portfolio-v0-evaluator/types.js.map +1 -0
  309. package/dist/restorer/impls/prediction-apy-v0-baseline/index.d.ts +40 -0
  310. package/dist/restorer/impls/prediction-apy-v0-baseline/index.js +107 -0
  311. package/dist/restorer/impls/prediction-apy-v0-baseline/index.js.map +1 -0
  312. package/dist/restorer/impls/prediction-apy-v0-baseline/strategy.d.ts +2 -0
  313. package/dist/restorer/impls/prediction-apy-v0-baseline/strategy.js +7 -0
  314. package/dist/restorer/impls/prediction-apy-v0-baseline/strategy.js.map +1 -0
  315. package/dist/restorer/impls/prediction-apy-v0-baseline/types.d.ts +4 -0
  316. package/dist/restorer/impls/prediction-apy-v0-baseline/types.js +2 -0
  317. package/dist/restorer/impls/prediction-apy-v0-baseline/types.js.map +1 -0
  318. package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.d.ts +6 -0
  319. package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.js +11 -0
  320. package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.js.map +1 -0
  321. package/dist/restorer/impls/prediction-apy-v0-evaluator/index.d.ts +42 -0
  322. package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js +208 -0
  323. package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js.map +1 -0
  324. package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.d.ts +7 -0
  325. package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.js +29 -0
  326. package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.js.map +1 -0
  327. package/dist/restorer/impls/prediction-apy-v0-evaluator/score.d.ts +9 -0
  328. package/dist/restorer/impls/prediction-apy-v0-evaluator/score.js +20 -0
  329. package/dist/restorer/impls/prediction-apy-v0-evaluator/score.js.map +1 -0
  330. package/dist/restorer/impls/prediction-apy-v0-evaluator/types.d.ts +7 -0
  331. package/dist/restorer/impls/prediction-apy-v0-evaluator/types.js +2 -0
  332. package/dist/restorer/impls/prediction-apy-v0-evaluator/types.js.map +1 -0
  333. package/dist/restorer/impls/prediction-v0-baseline/index.d.ts +31 -0
  334. package/dist/restorer/impls/prediction-v0-baseline/index.js +100 -0
  335. package/dist/restorer/impls/prediction-v0-baseline/index.js.map +1 -0
  336. package/dist/restorer/impls/prediction-v0-baseline/strategy.d.ts +8 -0
  337. package/dist/restorer/impls/prediction-v0-baseline/strategy.js +41 -0
  338. package/dist/restorer/impls/prediction-v0-baseline/strategy.js.map +1 -0
  339. package/dist/restorer/impls/prediction-v0-baseline/types.d.ts +7 -0
  340. package/dist/restorer/impls/prediction-v0-baseline/types.js +2 -0
  341. package/dist/restorer/impls/prediction-v0-baseline/types.js.map +1 -0
  342. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.d.ts +20 -0
  343. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js +66 -0
  344. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js.map +1 -0
  345. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.d.ts +9 -0
  346. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js +23 -0
  347. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js.map +1 -0
  348. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.d.ts +3 -0
  349. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js +13 -0
  350. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js.map +1 -0
  351. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.d.ts +13 -0
  352. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js +111 -0
  353. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -0
  354. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.d.ts +5 -0
  355. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js +20 -0
  356. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js.map +1 -0
  357. package/dist/restorer/impls/prediction-v0-evaluator/index.d.ts +36 -0
  358. package/dist/restorer/impls/prediction-v0-evaluator/index.js +234 -0
  359. package/dist/restorer/impls/prediction-v0-evaluator/index.js.map +1 -0
  360. package/dist/restorer/impls/prediction-v0-evaluator/score.d.ts +8 -0
  361. package/dist/restorer/impls/prediction-v0-evaluator/score.js +15 -0
  362. package/dist/restorer/impls/prediction-v0-evaluator/score.js.map +1 -0
  363. package/dist/restorer/impls/prediction-v0-evaluator/types.d.ts +7 -0
  364. package/dist/restorer/impls/prediction-v0-evaluator/types.js +2 -0
  365. package/dist/restorer/impls/prediction-v0-evaluator/types.js.map +1 -0
  366. package/dist/restorer/types.d.ts +194 -0
  367. package/dist/restorer/types.js +28 -0
  368. package/dist/restorer/types.js.map +1 -0
  369. package/dist/rpc-error-context.d.ts +10 -0
  370. package/dist/rpc-error-context.js +26 -0
  371. package/dist/rpc-error-context.js.map +1 -0
  372. package/dist/store/store.d.ts +101 -1
  373. package/dist/store/store.js +334 -4
  374. package/dist/store/store.js.map +1 -1
  375. package/dist/trajectory/schema.d.ts +510 -0
  376. package/dist/trajectory/schema.js +74 -0
  377. package/dist/trajectory/schema.js.map +1 -0
  378. package/dist/types/desired-state.d.ts +53 -0
  379. package/dist/types/desired-state.js +20 -0
  380. package/dist/types/desired-state.js.map +1 -1
  381. package/dist/types/index.d.ts +4 -1
  382. package/dist/types/index.js +4 -1
  383. package/dist/types/index.js.map +1 -1
  384. package/dist/types/portfolio.d.ts +1000 -0
  385. package/dist/types/portfolio.js +168 -0
  386. package/dist/types/portfolio.js.map +1 -0
  387. package/dist/types/prediction-apy.d.ts +930 -0
  388. package/dist/types/prediction-apy.js +133 -0
  389. package/dist/types/prediction-apy.js.map +1 -0
  390. package/dist/types/prediction.d.ts +926 -0
  391. package/dist/types/prediction.js +141 -0
  392. package/dist/types/prediction.js.map +1 -0
  393. package/dist/venues/aave-v3/addresses.d.ts +6 -0
  394. package/dist/venues/aave-v3/addresses.js +19 -0
  395. package/dist/venues/aave-v3/addresses.js.map +1 -0
  396. package/dist/venues/aave-v3/client.d.ts +85 -0
  397. package/dist/venues/aave-v3/client.js +106 -0
  398. package/dist/venues/aave-v3/client.js.map +1 -0
  399. package/dist/venues/chainlink/client.d.ts +99 -0
  400. package/dist/venues/chainlink/client.js +130 -0
  401. package/dist/venues/chainlink/client.js.map +1 -0
  402. package/dist/venues/chainlink/feeds.d.ts +8 -0
  403. package/dist/venues/chainlink/feeds.js +9 -0
  404. package/dist/venues/chainlink/feeds.js.map +1 -0
  405. package/dist/venues/hyperliquid/account-value.d.ts +30 -0
  406. package/dist/venues/hyperliquid/account-value.js +30 -0
  407. package/dist/venues/hyperliquid/account-value.js.map +1 -0
  408. package/dist/venues/hyperliquid/client.d.ts +63 -0
  409. package/dist/venues/hyperliquid/client.js +135 -0
  410. package/dist/venues/hyperliquid/client.js.map +1 -0
  411. package/dist/venues/hyperliquid/grid.d.ts +36 -0
  412. package/dist/venues/hyperliquid/grid.js +61 -0
  413. package/dist/venues/hyperliquid/grid.js.map +1 -0
  414. package/dist/venues/hyperliquid/types.d.ts +81 -0
  415. package/dist/venues/hyperliquid/types.js +8 -0
  416. package/dist/venues/hyperliquid/types.js.map +1 -0
  417. package/dist/withdraw/run-withdraw-plan.js +2 -0
  418. package/dist/withdraw/run-withdraw-plan.js.map +1 -1
  419. package/docker-compose.yml +44 -0
  420. package/package.json +15 -3
  421. package/skills/jinn-operator/SKILL.md +85 -0
  422. package/dist/daemon/restorer.d.ts +0 -19
  423. package/dist/daemon/restorer.js +0 -82
  424. package/dist/daemon/restorer.js.map +0 -1
@@ -0,0 +1,218 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { getAddress } from 'viem';
3
+ import { emitEvent } from '../observability/emit-event.js';
4
+ import { TransientError } from '../types/index.js';
5
+ const GLOBAL_CREATOR_SCOPE = '__global__';
6
+ const POST_LOCK_STALE_AFTER_MS = 60_000;
7
+ function normalizeCreatorSafeAddress(safeAddress) {
8
+ return safeAddress ? getAddress(safeAddress) : GLOBAL_CREATOR_SCOPE;
9
+ }
10
+ function policyTypeOf(policy) {
11
+ return policy.kind;
12
+ }
13
+ function scopeKeyOf(policy) {
14
+ switch (policy.kind) {
15
+ case 'once_per_safe':
16
+ return '';
17
+ case 'once_per_bucket':
18
+ return policy.bucketKey;
19
+ case 'interval':
20
+ return policy.scopeKey ?? '';
21
+ }
22
+ }
23
+ function shouldSkipPost(record, policy, nowMs) {
24
+ if (policy.kind !== 'interval')
25
+ return true;
26
+ const lastPostedAt = Date.parse(record.lastPostedAt);
27
+ return Number.isFinite(lastPostedAt) && (nowMs - lastPostedAt) < policy.intervalMs;
28
+ }
29
+ export class IntentPostingService {
30
+ adapter;
31
+ store;
32
+ registry;
33
+ constructor(adapter, store, registry) {
34
+ this.adapter = adapter;
35
+ this.store = store;
36
+ this.registry = registry;
37
+ }
38
+ async postCandidate(candidate, opts = {}) {
39
+ const creatorSafeAddress = normalizeCreatorSafeAddress(opts.creatorSafeAddress);
40
+ const policyType = policyTypeOf(candidate.postingPolicy);
41
+ const scopeKey = scopeKeyOf(candidate.postingPolicy);
42
+ const now = new Date();
43
+ const nowIso = now.toISOString();
44
+ const nowMs = now.getTime();
45
+ const existing = this.store.getIntentPostRecord({
46
+ creatorSafeAddress,
47
+ sourceKey: candidate.sourceKey,
48
+ policyType,
49
+ scopeKey,
50
+ });
51
+ if (existing && shouldSkipPost(existing, candidate.postingPolicy, nowMs)) {
52
+ return this.buildIdempotentResult(candidate, existing, 'store');
53
+ }
54
+ const migrated = this.tryImportLegacyRecord(candidate, {
55
+ creatorSafeAddress,
56
+ policyType,
57
+ scopeKey,
58
+ nowIso,
59
+ legacyConfigKeys: opts.legacyConfigKeys ?? [],
60
+ });
61
+ if (migrated) {
62
+ return this.buildIdempotentResult(candidate, migrated, 'legacy_config');
63
+ }
64
+ const ownerToken = randomUUID();
65
+ const lockAcquired = this.store.acquireIntentPostLock({
66
+ creatorSafeAddress,
67
+ sourceKey: candidate.sourceKey,
68
+ policyType,
69
+ scopeKey,
70
+ ownerToken,
71
+ lockedAt: nowIso,
72
+ staleAfterMs: POST_LOCK_STALE_AFTER_MS,
73
+ });
74
+ if (!lockAcquired) {
75
+ throw new TransientError(`Intent post already in progress for ${candidate.sourceKey} (${candidate.desiredState.id})`);
76
+ }
77
+ try {
78
+ const lockedExisting = this.store.getIntentPostRecord({
79
+ creatorSafeAddress,
80
+ sourceKey: candidate.sourceKey,
81
+ policyType,
82
+ scopeKey,
83
+ });
84
+ if (lockedExisting && shouldSkipPost(lockedExisting, candidate.postingPolicy, nowMs)) {
85
+ return this.buildIdempotentResult(candidate, lockedExisting, 'store');
86
+ }
87
+ const lockedMigrated = this.tryImportLegacyRecord(candidate, {
88
+ creatorSafeAddress,
89
+ policyType,
90
+ scopeKey,
91
+ nowIso,
92
+ legacyConfigKeys: opts.legacyConfigKeys ?? [],
93
+ });
94
+ if (lockedMigrated) {
95
+ return this.buildIdempotentResult(candidate, lockedMigrated, 'legacy_config');
96
+ }
97
+ const previousPostCount = lockedExisting?.postCount ?? 0;
98
+ const attemptNumber = previousPostCount + 1;
99
+ const attemptId = `${candidate.desiredState.id}/${attemptNumber}`;
100
+ const desiredState = {
101
+ ...candidate.desiredState,
102
+ type: 'restoration',
103
+ attemptId,
104
+ attemptNumber,
105
+ };
106
+ const requestId = await this.adapter.postDesiredState(desiredState);
107
+ // ERC-8004 Intent registration (Plan E Task 10). Best-effort: a failure here
108
+ // does NOT roll back the post. Registration fires only when a registry is
109
+ // injected and the adapter surfaces the intent CID (IPFS-backed adapters only).
110
+ if (this.registry && candidate.desiredState.spec?.kind) {
111
+ const intentCid = this.adapter.getLastPostedIntentCid?.();
112
+ if (intentCid) {
113
+ const creator = opts.creatorSafeAddress
114
+ ? getAddress(opts.creatorSafeAddress)
115
+ : creatorSafeAddress === GLOBAL_CREATOR_SCOPE
116
+ ? ''
117
+ : creatorSafeAddress;
118
+ try {
119
+ await this.registry.registerIntent({
120
+ intentCid,
121
+ kind: candidate.desiredState.spec.kind,
122
+ creator,
123
+ createdAt: nowMs,
124
+ requestId: requestId,
125
+ });
126
+ }
127
+ catch (err) {
128
+ // Registration is best-effort; a failure here should not prevent the
129
+ // intent from being posted. Log + emit but don't throw.
130
+ console.warn(`[posting-service] registerIntent failed: ${err instanceof Error ? err.message : err}`);
131
+ emitEvent(this.store, {
132
+ kind: 'intent_registry_failed',
133
+ requestId,
134
+ specKind: candidate.desiredState.spec?.kind,
135
+ outcome: 'failed',
136
+ detail: err instanceof Error ? err.message : String(err),
137
+ }, 'creator');
138
+ }
139
+ }
140
+ }
141
+ this.store.recordOwnActivity(requestId, 'created');
142
+ emitEvent(this.store, {
143
+ kind: 'intent_posted',
144
+ requestId,
145
+ specKind: candidate.desiredState.spec?.kind,
146
+ outcome: 'ok',
147
+ detail: `Posted intent for desired state ${candidate.desiredState.id} via ${candidate.sourceKey}`,
148
+ }, 'creator');
149
+ this.store.upsertIntentPostRecord({
150
+ creatorSafeAddress,
151
+ sourceKey: candidate.sourceKey,
152
+ policyType,
153
+ scopeKey,
154
+ desiredStateId: candidate.desiredState.id,
155
+ requestId,
156
+ firstPostedAt: lockedExisting?.firstPostedAt ?? nowIso,
157
+ lastPostedAt: nowIso,
158
+ postCount: attemptNumber,
159
+ });
160
+ return {
161
+ requestId,
162
+ desiredState,
163
+ attemptNumber,
164
+ attemptId,
165
+ idempotent: false,
166
+ source: 'posted',
167
+ };
168
+ }
169
+ finally {
170
+ this.store.releaseIntentPostLock({
171
+ creatorSafeAddress,
172
+ sourceKey: candidate.sourceKey,
173
+ policyType,
174
+ scopeKey,
175
+ ownerToken,
176
+ });
177
+ }
178
+ }
179
+ tryImportLegacyRecord(candidate, args) {
180
+ for (const key of args.legacyConfigKeys) {
181
+ const requestId = this.store.getConfigValue(key);
182
+ if (!requestId)
183
+ continue;
184
+ const record = {
185
+ creatorSafeAddress: args.creatorSafeAddress,
186
+ sourceKey: candidate.sourceKey,
187
+ policyType: args.policyType,
188
+ scopeKey: args.scopeKey,
189
+ desiredStateId: candidate.desiredState.id,
190
+ requestId,
191
+ firstPostedAt: args.nowIso,
192
+ lastPostedAt: args.nowIso,
193
+ postCount: 1,
194
+ };
195
+ this.store.upsertIntentPostRecord(record);
196
+ return record;
197
+ }
198
+ return null;
199
+ }
200
+ buildIdempotentResult(candidate, record, source) {
201
+ const attemptNumber = Math.max(1, record.postCount);
202
+ const attemptId = `${candidate.desiredState.id}/${attemptNumber}`;
203
+ return {
204
+ requestId: record.requestId,
205
+ desiredState: {
206
+ ...candidate.desiredState,
207
+ type: 'restoration',
208
+ attemptId,
209
+ attemptNumber,
210
+ },
211
+ attemptNumber,
212
+ attemptId,
213
+ idempotent: true,
214
+ source,
215
+ };
216
+ }
217
+ }
218
+ //# sourceMappingURL=posting-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posting-service.js","sourceRoot":"","sources":["../../src/intents/posting-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { DesiredState } from '../types/desired-state.js';
2
+ export interface PredictionApyV0AutoConfig {
3
+ venue?: 'aave-v3-base-sepolia' | 'aave-v3-base' | 'aave-v3-mainnet';
4
+ windowDurationMs?: number;
5
+ resolveGapMs?: number;
6
+ twaWindowSeconds?: number;
7
+ sampleCount?: number;
8
+ toleranceBps?: number;
9
+ }
10
+ export type PredictionApyV0Generator = () => Promise<DesiredState | null>;
11
+ export declare function makePredictionApyV0Generator(config?: PredictionApyV0AutoConfig): PredictionApyV0Generator;
@@ -0,0 +1,46 @@
1
+ import { resolvePredictionApyV0Template } from './prediction-apy-v0-template.js';
2
+ import { AAVE_V3_USDC } from '../venues/aave-v3/addresses.js';
3
+ export function makePredictionApyV0Generator(config = {}) {
4
+ const venue = config.venue ?? 'aave-v3-base-sepolia';
5
+ const addrs = AAVE_V3_USDC[venue];
6
+ const windowDurationMs = config.windowDurationMs ?? 600_000;
7
+ const resolveGapMs = config.resolveGapMs ?? 300_000;
8
+ const twaWindowSeconds = config.twaWindowSeconds ?? 3_600;
9
+ const sampleCount = config.sampleCount ?? 12;
10
+ const toleranceBps = config.toleranceBps ?? 50;
11
+ return async () => {
12
+ const now = Date.now();
13
+ const startTs = Math.floor(now / windowDurationMs) * windowDurationMs;
14
+ const endTs = startTs + windowDurationMs;
15
+ const resolveTs = endTs + resolveGapMs;
16
+ try {
17
+ const intent = await resolvePredictionApyV0Template({
18
+ id: `pred-apy-v0-auto-${startTs}`,
19
+ description: `Auto-generated prediction.apy.v0 intent for ${addrs.symbol} on ${venue}`,
20
+ window: { startTs, endTs },
21
+ spec: {
22
+ kind: 'prediction.apy.v0',
23
+ oracle: {
24
+ venue,
25
+ pool: addrs.pool,
26
+ reserve: addrs.reserve,
27
+ reserveSymbol: addrs.symbol,
28
+ },
29
+ metric: {
30
+ type: 'supply-apy-twa-bps',
31
+ twaWindowSeconds,
32
+ sampleCount,
33
+ toleranceBps,
34
+ },
35
+ question: { resolveTs },
36
+ },
37
+ eligibility: { maxSubmissionDelayMs: windowDurationMs },
38
+ });
39
+ return intent;
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ };
45
+ }
46
+ //# sourceMappingURL=prediction-apy-v0-auto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prediction-apy-v0-auto.js","sourceRoot":"","sources":["../../src/intents/prediction-apy-v0-auto.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAa9D,MAAM,UAAU,4BAA4B,CAAC,SAAoC,EAAE;IACjF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,sBAAsB,CAAC;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,OAAO,CAAC;IAC5D,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,OAAO,CAAC;IACpD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,KAAK,CAAC;IAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;IAE/C,OAAO,KAAK,IAAkC,EAAE;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;QACtE,MAAM,KAAK,GAAG,OAAO,GAAG,gBAAgB,CAAC;QACzC,MAAM,SAAS,GAAG,KAAK,GAAG,YAAY,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC;gBAClD,EAAE,EAAE,oBAAoB,OAAO,EAAE;gBACjC,WAAW,EAAE,+CAA+C,KAAK,CAAC,MAAM,OAAO,KAAK,EAAE;gBACtF,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC1B,IAAI,EAAE;oBACJ,IAAI,EAAE,mBAAmB;oBACzB,MAAM,EAAE;wBACN,KAAK;wBACL,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,aAAa,EAAE,KAAK,CAAC,MAAM;qBAC5B;oBACD,MAAM,EAAE;wBACN,IAAI,EAAE,oBAAoB;wBAC1B,gBAAgB;wBAChB,WAAW;wBACX,YAAY;qBACb;oBACD,QAAQ,EAAE,EAAE,SAAS,EAAE;iBACxB;gBACD,WAAW,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,EAAE;aACxD,CAAC,CAAC;YACH,OAAO,MAAiC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type PredictionApyV0Intent } from '../types/prediction-apy.js';
2
+ export interface PredictionApyTemplateDeps {
3
+ windowDurationMs?: number;
4
+ resolveGapMs?: number;
5
+ }
6
+ export declare const DEFAULT_WINDOW_DURATION_MS = 600000;
7
+ export declare const DEFAULT_RESOLVE_GAP_MS = 300000;
8
+ export declare function resolvePredictionApyV0Template(template: unknown, deps?: PredictionApyTemplateDeps): Promise<PredictionApyV0Intent>;
@@ -0,0 +1,22 @@
1
+ import { PredictionApyV0IntentSchema, } from '../types/prediction-apy.js';
2
+ export const DEFAULT_WINDOW_DURATION_MS = 600_000;
3
+ export const DEFAULT_RESOLVE_GAP_MS = 300_000;
4
+ export async function resolvePredictionApyV0Template(template, deps = {}) {
5
+ if (typeof template !== 'object' || template === null) {
6
+ throw new Error('resolvePredictionApyV0Template: template must be an object');
7
+ }
8
+ const stub = JSON.parse(JSON.stringify(template));
9
+ const windowMs = deps.windowDurationMs ?? DEFAULT_WINDOW_DURATION_MS;
10
+ const resolveMs = deps.resolveGapMs ?? DEFAULT_RESOLVE_GAP_MS;
11
+ const win = stub['window'];
12
+ if (win && win.startTs === 0) {
13
+ const now = Date.now();
14
+ win.startTs = now;
15
+ win.endTs = now + windowMs;
16
+ const spec = stub['spec'];
17
+ if (spec?.question)
18
+ spec.question.resolveTs = now + windowMs + resolveMs;
19
+ }
20
+ return PredictionApyV0IntentSchema.parse(stub);
21
+ }
22
+ //# sourceMappingURL=prediction-apy-v0-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prediction-apy-v0-template.js","sourceRoot":"","sources":["../../src/intents/prediction-apy-v0-template.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,GAE5B,MAAM,4BAA4B,CAAC;AAOpC,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAClD,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,QAAiB,EACjB,OAAkC,EAAE;IAEpC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAA4B,CAAC;IAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,IAAI,sBAAsB,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAqD,CAAC;IAC/E,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC;QAClB,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,QAAQ,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAsD,CAAC;QAC/E,IAAI,IAAI,EAAE,QAAQ;YAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,GAAG,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3E,CAAC;IACD,OAAO,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Auto-generator for prediction.v0 intents.
3
+ *
4
+ * Produces a fresh DesiredState per hour bucket: reads current Chainlink
5
+ * price, builds a template with the configured threshold sentinel
6
+ * (default "current+0.5%" — coin-flip-ish, slightly biased NO), and resolves
7
+ * it via the shared template helper. Stable ID per hour prevents duplicate
8
+ * posts within a window; the CreatorLoop's SQLite cache guards against
9
+ * restart-replay.
10
+ *
11
+ * Wired in main.ts for testnet-only (jinn-mono-9ew). Operators can opt out
12
+ * with JINN_DISABLE_AUTO_INTENTS=1.
13
+ */
14
+ import { type PublicClient } from 'viem';
15
+ import type { DesiredState } from '../types/desired-state.js';
16
+ export interface PredictionV0AutoConfig {
17
+ /** Chainlink AggregatorV3 proxy address. Defaults to Base Sepolia ETH/USD. */
18
+ feed: `0x${string}`;
19
+ /** Human-readable feed description embedded in the generated intent. */
20
+ feedDescription: string;
21
+ /** Which chain the feed lives on. */
22
+ venue: 'chainlink-base' | 'chainlink-base-sepolia';
23
+ /**
24
+ * Threshold sentinel to resolve each cycle. Defaults to "current+0.5%" —
25
+ * biases slightly NO, Brier scores land meaningfully around 0.75. Use
26
+ * "current" for a strict coin-flip direction question.
27
+ */
28
+ thresholdSentinel?: string;
29
+ /** Comparator operator. Default 'GT'. */
30
+ operator?: 'GT' | 'GTE' | 'LT' | 'LTE';
31
+ /**
32
+ * Submission window duration in ms. Default: 600_000 (10 min) to sync with
33
+ * the 15-min fast-test epoch on Base Sepolia. Set to 3_600_000 for 1h
34
+ * mainnet-style windows. Bucket size also uses this value.
35
+ */
36
+ windowDurationMs?: number;
37
+ /**
38
+ * Gap between window.endTs and resolveTs in ms. Default: 300_000 (5 min).
39
+ * Bounded by schema to ≤ 1h.
40
+ */
41
+ resolveGapMs?: number;
42
+ /** RPC URL for the publicClient used to read Chainlink. */
43
+ rpcUrl?: string;
44
+ /** Injected publicClient — tests pass a mock; production leaves unset. */
45
+ _publicClient?: PublicClient;
46
+ }
47
+ export type PredictionV0Generator = () => Promise<DesiredState | null>;
48
+ /**
49
+ * Build a generator closure. Calling the closure returns a freshly-resolved
50
+ * DesiredState for the current hour bucket, or null if Chainlink is
51
+ * unreachable (caller skips this tick).
52
+ */
53
+ export declare function makePredictionV0Generator(config: PredictionV0AutoConfig): PredictionV0Generator;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Auto-generator for prediction.v0 intents.
3
+ *
4
+ * Produces a fresh DesiredState per hour bucket: reads current Chainlink
5
+ * price, builds a template with the configured threshold sentinel
6
+ * (default "current+0.5%" — coin-flip-ish, slightly biased NO), and resolves
7
+ * it via the shared template helper. Stable ID per hour prevents duplicate
8
+ * posts within a window; the CreatorLoop's SQLite cache guards against
9
+ * restart-replay.
10
+ *
11
+ * Wired in main.ts for testnet-only (jinn-mono-9ew). Operators can opt out
12
+ * with JINN_DISABLE_AUTO_INTENTS=1.
13
+ */
14
+ import { createPublicClient, http } from 'viem';
15
+ import { base, baseSepolia } from 'viem/chains';
16
+ import { readChainlinkLatest, scaleToDecimal } from '../venues/chainlink/client.js';
17
+ import { resolvePredictionV0Template } from './prediction-v0-template.js';
18
+ // ── Generator factory ──────────────────────────────────────────────────────────
19
+ /**
20
+ * Build a generator closure. Calling the closure returns a freshly-resolved
21
+ * DesiredState for the current hour bucket, or null if Chainlink is
22
+ * unreachable (caller skips this tick).
23
+ */
24
+ export function makePredictionV0Generator(config) {
25
+ const threshold = config.thresholdSentinel ?? 'current+0.5%';
26
+ const operator = config.operator ?? 'GT';
27
+ const windowDurationMs = config.windowDurationMs ?? 600_000; // 10 min default (fast-test)
28
+ const resolveGapMs = config.resolveGapMs ?? 300_000; // 5 min default
29
+ // Lazy publicClient construction — reused across calls.
30
+ let publicClient = config._publicClient ?? null;
31
+ const getPublicClient = () => {
32
+ if (publicClient)
33
+ return publicClient;
34
+ const chain = config.venue === 'chainlink-base' ? base : baseSepolia;
35
+ const rpcUrl = config.rpcUrl ?? (config.venue === 'chainlink-base'
36
+ ? 'https://mainnet.base.org'
37
+ : 'https://sepolia.base.org');
38
+ publicClient = createPublicClient({ chain, transport: http(rpcUrl) });
39
+ return publicClient;
40
+ };
41
+ return async () => {
42
+ // Bucket start = windowDurationMs boundary ≤ now. Stable ID per bucket
43
+ // prevents duplicate posts within the same window.
44
+ const now = Date.now();
45
+ const startTs = Math.floor(now / windowDurationMs) * windowDurationMs;
46
+ const endTs = startTs + windowDurationMs;
47
+ const resolveTs = endTs + resolveGapMs;
48
+ const template = {
49
+ id: `pred-v0-auto-${startTs}`,
50
+ description: `Auto-generated prediction.v0 intent — ${config.feedDescription} ${operator} ${threshold} at ${new Date(resolveTs).toISOString()}`,
51
+ window: { startTs, endTs },
52
+ spec: {
53
+ kind: 'prediction.v0',
54
+ oracle: {
55
+ venue: config.venue,
56
+ feed: config.feed,
57
+ feedDescription: config.feedDescription,
58
+ },
59
+ question: {
60
+ kind: 'threshold',
61
+ operator,
62
+ threshold,
63
+ resolveTs,
64
+ },
65
+ },
66
+ eligibility: { maxSubmissionDelayMs: 60_000 },
67
+ };
68
+ try {
69
+ const intent = await resolvePredictionV0Template(template, {
70
+ readCurrent: async ({ feed }) => {
71
+ const reading = await readChainlinkLatest(feed, getPublicClient());
72
+ return scaleToDecimal(reading.answer, reading.decimals);
73
+ },
74
+ });
75
+ // Return the resolved DesiredState shape (intent is already valid).
76
+ return intent;
77
+ }
78
+ catch {
79
+ // Chainlink read failure or schema mismatch — skip this tick, try next.
80
+ return null;
81
+ }
82
+ };
83
+ }
84
+ //# sourceMappingURL=prediction-v0-auto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prediction-v0-auto.js","sourceRoot":"","sources":["../../src/intents/prediction-v0-auto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Sentinel resolution for prediction.v0 intent templates.
3
+ *
4
+ * Two sentinels are supported in template JSON (e.g.,
5
+ * `client/fixtures/prediction-v0-intent.example.json`):
6
+ *
7
+ * 1. window.startTs = 0 → rewritten as Date.now() at call time; the rest of
8
+ * the window (endTs) and resolveTs are computed relative to that.
9
+ *
10
+ * 2. spec.question.threshold = "current[±N[%]]" → read the Chainlink feed
11
+ * named in spec.oracle and substitute an absolute price:
12
+ *
13
+ * "current" → current price exactly
14
+ * "current+0.5%" → current × 1.005
15
+ * "current-2%" → current × 0.98
16
+ * "current+100" → current + 100
17
+ * "current-50" → current - 50
18
+ *
19
+ * The on-chain intent always carries an absolute decimal string; the
20
+ * sentinel is ONLY resolved at post time. Evaluator + restorer impls
21
+ * never see the sentinel form.
22
+ *
23
+ * Exported as a pure function with a `readCurrent` dep so it's trivially
24
+ * unit-testable. Both the `jinn submit-intent --spec-file` path and the
25
+ * future auto-generator (jinn-mono-9ew) call through this helper.
26
+ */
27
+ import { type PredictionV0Intent } from '../types/prediction.js';
28
+ /** Returns true iff the given value looks like a "current[±N[%]]" sentinel. */
29
+ export declare function isCurrentSentinel(value: unknown): boolean;
30
+ export interface TemplateReaderDeps {
31
+ /**
32
+ * Read the current price of the Chainlink feed referenced in the template.
33
+ * Required only when the template uses a `current[±…]` threshold sentinel
34
+ * (see {@link predictionV0TemplateNeedsReadCurrent}).
35
+ */
36
+ readCurrent?: (args: {
37
+ feed: `0x${string}`;
38
+ venue: 'chainlink-base' | 'chainlink-base-sepolia';
39
+ }) => Promise<string>;
40
+ /**
41
+ * Window duration when the template uses `window.startTs = 0` (now-relative
42
+ * sentinel). Default: 10 min — syncs with the 15-min fast-test epoch cadence
43
+ * on testnet. Set to 3_600_000 for a 1h window (mainnet-style dogfood).
44
+ */
45
+ windowDurationMs?: number;
46
+ /**
47
+ * Resolve gap when the template uses `window.startTs = 0`. Default: 5 min.
48
+ * `resolveTs = endTs + resolveGapMs`. Bounded by schema to ≤ 1h.
49
+ */
50
+ resolveGapMs?: number;
51
+ }
52
+ /** Default window duration for the startTs-sentinel fill. Tuned for fast-test. */
53
+ export declare const DEFAULT_WINDOW_DURATION_MS = 600000;
54
+ /** Default resolve gap for the startTs-sentinel fill. Tuned for fast-test. */
55
+ export declare const DEFAULT_RESOLVE_GAP_MS = 300000;
56
+ /**
57
+ * True if {@link resolvePredictionV0Template} will call `readCurrent` for this
58
+ * template (Chainlink). `window.startTs === 0` does not need `readCurrent`.
59
+ */
60
+ export declare function predictionV0TemplateNeedsReadCurrent(template: unknown): boolean;
61
+ /**
62
+ * Resolve all supported sentinels in a raw prediction.v0 template + return a
63
+ * parsed, validated PredictionV0Intent.
64
+ *
65
+ * The template must be the JSON shape of a PredictionV0Intent with optional
66
+ * sentinel values. Callers that build the template from multiple sources
67
+ * (CLI --spec-file + --id + --description) should merge their bits BEFORE
68
+ * calling this helper.
69
+ */
70
+ export declare function resolvePredictionV0Template(template: unknown, deps: TemplateReaderDeps): Promise<PredictionV0Intent>;