@jinn-network/client 0.1.0 → 0.1.1-canary.351ad49e

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 (293) hide show
  1. package/CONTRIBUTING.md +123 -0
  2. package/README.md +202 -26
  3. package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +15 -0
  4. package/dist/adapters/claim-registry/abi.d.ts +127 -0
  5. package/dist/adapters/claim-registry/abi.js +93 -0
  6. package/dist/adapters/claim-registry/abi.js.map +1 -0
  7. package/dist/adapters/claim-registry/client.d.ts +89 -0
  8. package/dist/adapters/claim-registry/client.js +205 -0
  9. package/dist/adapters/claim-registry/client.js.map +1 -0
  10. package/dist/adapters/mech/adapter.d.ts +2 -0
  11. package/dist/adapters/mech/adapter.js +110 -41
  12. package/dist/adapters/mech/adapter.js.map +1 -1
  13. package/dist/adapters/mech/contracts.d.ts +2 -0
  14. package/dist/adapters/mech/contracts.js +32 -7
  15. package/dist/adapters/mech/contracts.js.map +1 -1
  16. package/dist/adapters/mech/ipfs.d.ts +8 -0
  17. package/dist/adapters/mech/ipfs.js +12 -0
  18. package/dist/adapters/mech/ipfs.js.map +1 -1
  19. package/dist/adapters/mech/types.d.ts +20 -46
  20. package/dist/adapters/mech/types.js +16 -35
  21. package/dist/adapters/mech/types.js.map +1 -1
  22. package/dist/api/gather-status.js +33 -1
  23. package/dist/api/gather-status.js.map +1 -1
  24. package/dist/api/portfolio-v0-build.d.ts +81 -0
  25. package/dist/api/portfolio-v0-build.js +141 -0
  26. package/dist/api/portfolio-v0-build.js.map +1 -0
  27. package/dist/api/portfolio-v0-doctor.d.ts +37 -0
  28. package/dist/api/portfolio-v0-doctor.js +123 -0
  29. package/dist/api/portfolio-v0-doctor.js.map +1 -0
  30. package/dist/api/rewards-build.js +1 -1
  31. package/dist/api/rewards-build.js.map +1 -1
  32. package/dist/api/server.js +12 -0
  33. package/dist/api/server.js.map +1 -1
  34. package/dist/api/status-build.d.ts +8 -0
  35. package/dist/api/status-build.js +1 -0
  36. package/dist/api/status-build.js.map +1 -1
  37. package/dist/api/status-rollup-build.d.ts +4 -0
  38. package/dist/api/status-rollup-build.js +4 -0
  39. package/dist/api/status-rollup-build.js.map +1 -1
  40. package/dist/bin/jinn-mcp.d.ts +14 -0
  41. package/dist/bin/jinn-mcp.js +19 -0
  42. package/dist/bin/jinn-mcp.js.map +1 -0
  43. package/dist/build-meta.json +1 -1
  44. package/dist/cli/commands/auth.d.ts +3 -0
  45. package/dist/cli/commands/auth.js +236 -0
  46. package/dist/cli/commands/auth.js.map +1 -0
  47. package/dist/cli/commands/bootstrap.js +1 -0
  48. package/dist/cli/commands/bootstrap.js.map +1 -1
  49. package/dist/cli/commands/doctor.js +153 -15
  50. package/dist/cli/commands/doctor.js.map +1 -1
  51. package/dist/cli/commands/fund-requirements.js +69 -1
  52. package/dist/cli/commands/fund-requirements.js.map +1 -1
  53. package/dist/cli/commands/history.js +1 -0
  54. package/dist/cli/commands/history.js.map +1 -1
  55. package/dist/cli/commands/init.js +31 -7
  56. package/dist/cli/commands/init.js.map +1 -1
  57. package/dist/cli/commands/keys-backup.js +149 -15
  58. package/dist/cli/commands/keys-backup.js.map +1 -1
  59. package/dist/cli/commands/logs.js +28 -13
  60. package/dist/cli/commands/logs.js.map +1 -1
  61. package/dist/cli/commands/plugin-install.d.ts +3 -0
  62. package/dist/cli/commands/plugin-install.js +799 -0
  63. package/dist/cli/commands/plugin-install.js.map +1 -0
  64. package/dist/cli/commands/quickstart.d.ts +3 -0
  65. package/dist/cli/commands/quickstart.js +292 -0
  66. package/dist/cli/commands/quickstart.js.map +1 -0
  67. package/dist/cli/commands/rewards.js +27 -1
  68. package/dist/cli/commands/rewards.js.map +1 -1
  69. package/dist/cli/commands/run.js +6 -0
  70. package/dist/cli/commands/run.js.map +1 -1
  71. package/dist/cli/commands/stop.js +1 -0
  72. package/dist/cli/commands/stop.js.map +1 -1
  73. package/dist/cli/commands/submit-intent.js +79 -5
  74. package/dist/cli/commands/submit-intent.js.map +1 -1
  75. package/dist/cli/commands/update.d.ts +3 -0
  76. package/dist/cli/commands/update.js +154 -0
  77. package/dist/cli/commands/update.js.map +1 -0
  78. package/dist/cli/commands/version.js +15 -1
  79. package/dist/cli/commands/version.js.map +1 -1
  80. package/dist/cli/deployment-digest.js +20 -4
  81. package/dist/cli/deployment-digest.js.map +1 -1
  82. package/dist/cli/index.js +8 -0
  83. package/dist/cli/index.js.map +1 -1
  84. package/dist/cli/password.d.ts +28 -1
  85. package/dist/cli/password.js +59 -10
  86. package/dist/cli/password.js.map +1 -1
  87. package/dist/config.d.ts +110 -7
  88. package/dist/config.js +38 -5
  89. package/dist/config.js.map +1 -1
  90. package/dist/daemon/balance-topup-loop.d.ts +40 -0
  91. package/dist/daemon/balance-topup-loop.js +96 -0
  92. package/dist/daemon/balance-topup-loop.js.map +1 -0
  93. package/dist/daemon/daemon.d.ts +37 -0
  94. package/dist/daemon/daemon.js +98 -1
  95. package/dist/daemon/daemon.js.map +1 -1
  96. package/dist/dashboard/index.html +500 -0
  97. package/dist/earning/bootstrap.d.ts +3 -1
  98. package/dist/earning/bootstrap.js +138 -17
  99. package/dist/earning/bootstrap.js.map +1 -1
  100. package/dist/earning/contracts.d.ts +24 -0
  101. package/dist/earning/contracts.js +20 -1
  102. package/dist/earning/contracts.js.map +1 -1
  103. package/dist/earning/faucet.d.ts +15 -0
  104. package/dist/earning/faucet.js +64 -0
  105. package/dist/earning/faucet.js.map +1 -0
  106. package/dist/earning/jinn-rewards.d.ts +9 -0
  107. package/dist/earning/jinn-rewards.js +7 -0
  108. package/dist/earning/jinn-rewards.js.map +1 -1
  109. package/dist/earning/store.d.ts +5 -0
  110. package/dist/earning/store.js +7 -3
  111. package/dist/earning/store.js.map +1 -1
  112. package/dist/errors/unauthorized-account.d.ts +10 -0
  113. package/dist/errors/unauthorized-account.js +14 -0
  114. package/dist/errors/unauthorized-account.js.map +1 -0
  115. package/dist/main.js +138 -1
  116. package/dist/main.js.map +1 -1
  117. package/dist/mcp/operator-server.d.ts +34 -0
  118. package/dist/mcp/operator-server.js +219 -0
  119. package/dist/mcp/operator-server.js.map +1 -0
  120. package/dist/operator-errors.js +11 -0
  121. package/dist/operator-errors.js.map +1 -1
  122. package/dist/preflight/claude-auth.d.ts +68 -0
  123. package/dist/preflight/claude-auth.js +171 -0
  124. package/dist/preflight/claude-auth.js.map +1 -0
  125. package/dist/restorer/engine/canonical-json.d.ts +18 -0
  126. package/dist/restorer/engine/canonical-json.js +59 -0
  127. package/dist/restorer/engine/canonical-json.js.map +1 -0
  128. package/dist/restorer/engine/claim.d.ts +69 -0
  129. package/dist/restorer/engine/claim.js +104 -0
  130. package/dist/restorer/engine/claim.js.map +1 -0
  131. package/dist/restorer/engine/delivery.d.ts +52 -0
  132. package/dist/restorer/engine/delivery.js +63 -0
  133. package/dist/restorer/engine/delivery.js.map +1 -0
  134. package/dist/restorer/engine/engine.d.ts +203 -0
  135. package/dist/restorer/engine/engine.js +658 -0
  136. package/dist/restorer/engine/engine.js.map +1 -0
  137. package/dist/restorer/engine/manifest-assembly.d.ts +67 -0
  138. package/dist/restorer/engine/manifest-assembly.js +79 -0
  139. package/dist/restorer/engine/manifest-assembly.js.map +1 -0
  140. package/dist/restorer/engine/packaging.d.ts +87 -0
  141. package/dist/restorer/engine/packaging.js +350 -0
  142. package/dist/restorer/engine/packaging.js.map +1 -0
  143. package/dist/restorer/engine/persistence.d.ts +170 -0
  144. package/dist/restorer/engine/persistence.js +381 -0
  145. package/dist/restorer/engine/persistence.js.map +1 -0
  146. package/dist/restorer/engine/recovery.d.ts +22 -0
  147. package/dist/restorer/engine/recovery.js +24 -0
  148. package/dist/restorer/engine/recovery.js.map +1 -0
  149. package/dist/restorer/engine/registry.d.ts +62 -0
  150. package/dist/restorer/engine/registry.js +73 -0
  151. package/dist/restorer/engine/registry.js.map +1 -0
  152. package/dist/restorer/engine/signing.d.ts +30 -0
  153. package/dist/restorer/engine/signing.js +39 -0
  154. package/dist/restorer/engine/signing.js.map +1 -0
  155. package/dist/restorer/engine/state.d.ts +42 -0
  156. package/dist/restorer/engine/state.js +87 -0
  157. package/dist/restorer/engine/state.js.map +1 -0
  158. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.d.ts +64 -0
  159. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js +96 -0
  160. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js.map +1 -0
  161. package/dist/restorer/impls/claude-mcp-hyperliquid/index.d.ts +88 -0
  162. package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +560 -0
  163. package/dist/restorer/impls/claude-mcp-hyperliquid/index.js.map +1 -0
  164. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +137 -0
  165. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js +865 -0
  166. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -0
  167. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.d.ts +74 -0
  168. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js +74 -0
  169. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js.map +1 -0
  170. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.d.ts +97 -0
  171. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js +226 -0
  172. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js.map +1 -0
  173. package/dist/restorer/impls/claude-mcp-prediction/index.d.ts +43 -0
  174. package/dist/restorer/impls/claude-mcp-prediction/index.js +230 -0
  175. package/dist/restorer/impls/claude-mcp-prediction/index.js.map +1 -0
  176. package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.d.ts +38 -0
  177. package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.js +135 -0
  178. package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.js.map +1 -0
  179. package/dist/restorer/impls/claude-mcp-prediction/prompt.d.ts +8 -0
  180. package/dist/restorer/impls/claude-mcp-prediction/prompt.js +54 -0
  181. package/dist/restorer/impls/claude-mcp-prediction/prompt.js.map +1 -0
  182. package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.d.ts +36 -0
  183. package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js +137 -0
  184. package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js.map +1 -0
  185. package/dist/restorer/impls/claude-mcp-prediction/types.d.ts +82 -0
  186. package/dist/restorer/impls/claude-mcp-prediction/types.js +6 -0
  187. package/dist/restorer/impls/claude-mcp-prediction/types.js.map +1 -0
  188. package/dist/restorer/impls/legacy-claude/index.d.ts +42 -0
  189. package/dist/restorer/impls/legacy-claude/index.js +60 -0
  190. package/dist/restorer/impls/legacy-claude/index.js.map +1 -0
  191. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.d.ts +68 -0
  192. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js +117 -0
  193. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js.map +1 -0
  194. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.d.ts +49 -0
  195. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js +91 -0
  196. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js.map +1 -0
  197. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.d.ts +78 -0
  198. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js +274 -0
  199. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js.map +1 -0
  200. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.d.ts +23 -0
  201. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js +49 -0
  202. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js.map +1 -0
  203. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.d.ts +25 -0
  204. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js +44 -0
  205. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js.map +1 -0
  206. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.d.ts +17 -0
  207. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js +43 -0
  208. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js.map +1 -0
  209. package/dist/restorer/impls/portfolio-v0-evaluator/index.d.ts +43 -0
  210. package/dist/restorer/impls/portfolio-v0-evaluator/index.js +431 -0
  211. package/dist/restorer/impls/portfolio-v0-evaluator/index.js.map +1 -0
  212. package/dist/restorer/impls/portfolio-v0-evaluator/score.d.ts +21 -0
  213. package/dist/restorer/impls/portfolio-v0-evaluator/score.js +32 -0
  214. package/dist/restorer/impls/portfolio-v0-evaluator/score.js.map +1 -0
  215. package/dist/restorer/impls/portfolio-v0-evaluator/types.d.ts +32 -0
  216. package/dist/restorer/impls/portfolio-v0-evaluator/types.js +8 -0
  217. package/dist/restorer/impls/portfolio-v0-evaluator/types.js.map +1 -0
  218. package/dist/restorer/impls/prediction-v0-baseline/index.d.ts +26 -0
  219. package/dist/restorer/impls/prediction-v0-baseline/index.js +82 -0
  220. package/dist/restorer/impls/prediction-v0-baseline/index.js.map +1 -0
  221. package/dist/restorer/impls/prediction-v0-baseline/strategy.d.ts +8 -0
  222. package/dist/restorer/impls/prediction-v0-baseline/strategy.js +41 -0
  223. package/dist/restorer/impls/prediction-v0-baseline/strategy.js.map +1 -0
  224. package/dist/restorer/impls/prediction-v0-baseline/types.d.ts +7 -0
  225. package/dist/restorer/impls/prediction-v0-baseline/types.js +2 -0
  226. package/dist/restorer/impls/prediction-v0-baseline/types.js.map +1 -0
  227. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.d.ts +20 -0
  228. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js +66 -0
  229. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js.map +1 -0
  230. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.d.ts +9 -0
  231. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js +23 -0
  232. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js.map +1 -0
  233. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.d.ts +3 -0
  234. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js +13 -0
  235. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js.map +1 -0
  236. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.d.ts +7 -0
  237. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js +74 -0
  238. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -0
  239. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.d.ts +5 -0
  240. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js +20 -0
  241. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js.map +1 -0
  242. package/dist/restorer/impls/prediction-v0-evaluator/index.d.ts +33 -0
  243. package/dist/restorer/impls/prediction-v0-evaluator/index.js +179 -0
  244. package/dist/restorer/impls/prediction-v0-evaluator/index.js.map +1 -0
  245. package/dist/restorer/impls/prediction-v0-evaluator/score.d.ts +8 -0
  246. package/dist/restorer/impls/prediction-v0-evaluator/score.js +15 -0
  247. package/dist/restorer/impls/prediction-v0-evaluator/score.js.map +1 -0
  248. package/dist/restorer/impls/prediction-v0-evaluator/types.d.ts +7 -0
  249. package/dist/restorer/impls/prediction-v0-evaluator/types.js +2 -0
  250. package/dist/restorer/impls/prediction-v0-evaluator/types.js.map +1 -0
  251. package/dist/restorer/types.d.ts +62 -0
  252. package/dist/restorer/types.js +7 -0
  253. package/dist/restorer/types.js.map +1 -0
  254. package/dist/runner/claude.js +15 -0
  255. package/dist/runner/claude.js.map +1 -1
  256. package/dist/store/store.d.ts +3 -1
  257. package/dist/store/store.js +8 -0
  258. package/dist/store/store.js.map +1 -1
  259. package/dist/tx-retry.js +11 -1
  260. package/dist/tx-retry.js.map +1 -1
  261. package/dist/types/desired-state.d.ts +53 -0
  262. package/dist/types/desired-state.js +20 -0
  263. package/dist/types/desired-state.js.map +1 -1
  264. package/dist/types/index.d.ts +3 -1
  265. package/dist/types/index.js +3 -1
  266. package/dist/types/index.js.map +1 -1
  267. package/dist/types/portfolio.d.ts +1000 -0
  268. package/dist/types/portfolio.js +168 -0
  269. package/dist/types/portfolio.js.map +1 -0
  270. package/dist/types/prediction.d.ts +751 -0
  271. package/dist/types/prediction.js +128 -0
  272. package/dist/types/prediction.js.map +1 -0
  273. package/dist/venues/chainlink/client.d.ts +99 -0
  274. package/dist/venues/chainlink/client.js +130 -0
  275. package/dist/venues/chainlink/client.js.map +1 -0
  276. package/dist/venues/chainlink/feeds.d.ts +8 -0
  277. package/dist/venues/chainlink/feeds.js +9 -0
  278. package/dist/venues/chainlink/feeds.js.map +1 -0
  279. package/dist/venues/hyperliquid/account-value.d.ts +30 -0
  280. package/dist/venues/hyperliquid/account-value.js +30 -0
  281. package/dist/venues/hyperliquid/account-value.js.map +1 -0
  282. package/dist/venues/hyperliquid/client.d.ts +63 -0
  283. package/dist/venues/hyperliquid/client.js +135 -0
  284. package/dist/venues/hyperliquid/client.js.map +1 -0
  285. package/dist/venues/hyperliquid/grid.d.ts +36 -0
  286. package/dist/venues/hyperliquid/grid.js +61 -0
  287. package/dist/venues/hyperliquid/grid.js.map +1 -0
  288. package/dist/venues/hyperliquid/types.d.ts +81 -0
  289. package/dist/venues/hyperliquid/types.js +8 -0
  290. package/dist/venues/hyperliquid/types.js.map +1 -0
  291. package/docker-compose.yml +44 -0
  292. package/package.json +21 -3
  293. package/skills/jinn-operator/SKILL.md +213 -0
@@ -0,0 +1,236 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { parseArgs } from 'node:util';
6
+ import { createInterface } from 'node:readline';
7
+ import { emitResult } from '../output.js';
8
+ import { emitEnvelope } from '../../errors/envelope.js';
9
+ import { detectAuthContext, probeClaudeAuth, buildLoginCommand, } from '../../preflight/claude-auth.js';
10
+ import { loadConfig } from '../../config.js';
11
+ const CONTEXT_LABELS = {
12
+ container: 'inside this container',
13
+ 'docker-compose': 'inside the jinn-daemon Docker container',
14
+ bare: 'on this machine',
15
+ };
16
+ const DEFAULT_CONFIG_PATH = join(homedir(), '.jinn-client', 'config.json');
17
+ /**
18
+ * Persist `runtimeMode` into the operator's config file (default:
19
+ * ~/.jinn-client/config.json). Creates the file if absent; merges into
20
+ * existing JSON otherwise. Preserves any unknown keys.
21
+ */
22
+ function persistRuntimeMode(mode, configPath = DEFAULT_CONFIG_PATH) {
23
+ let current = {};
24
+ if (existsSync(configPath)) {
25
+ try {
26
+ current = JSON.parse(readFileSync(configPath, 'utf-8'));
27
+ }
28
+ catch {
29
+ // Malformed existing file — we overwrite rather than merge.
30
+ current = {};
31
+ }
32
+ }
33
+ current['runtimeMode'] = mode;
34
+ writeFileSync(configPath, JSON.stringify(current, null, 2) + '\n', { encoding: 'utf-8' });
35
+ }
36
+ /**
37
+ * Interactively prompt the operator for their runtime mode. Uses readline
38
+ * so stdin can be a real TTY. Returns the chosen mode or null if the
39
+ * operator aborts / answers blank.
40
+ */
41
+ async function promptRuntimeMode() {
42
+ process.stderr.write('\nHow do you want to run the Jinn daemon?\n');
43
+ process.stderr.write(' 1) bare — Node directly on host (simplest; Claude auth lives on this machine)\n');
44
+ process.stderr.write(' 2) docker-compose — long-lived operator via the bundled compose file\n');
45
+ process.stderr.write(' 3) container — I run the Jinn image in my own orchestrator\n\n');
46
+ const rl = createInterface({ input: process.stdin, output: process.stderr, terminal: true });
47
+ try {
48
+ const answer = await new Promise((resolve) => {
49
+ rl.question('Choose [1-3, default=1]: ', (a) => resolve(a.trim()));
50
+ });
51
+ if (answer === '' || answer === '1' || answer.toLowerCase() === 'bare')
52
+ return 'bare';
53
+ if (answer === '2' || answer.toLowerCase() === 'docker-compose')
54
+ return 'docker-compose';
55
+ if (answer === '3' || answer.toLowerCase() === 'container')
56
+ return 'container';
57
+ return null;
58
+ }
59
+ finally {
60
+ rl.close();
61
+ }
62
+ }
63
+ async function run(ctx) {
64
+ let parsed;
65
+ try {
66
+ parsed = parseArgs({
67
+ args: ctx.argv,
68
+ options: {
69
+ json: { type: 'boolean' },
70
+ human: { type: 'boolean' },
71
+ mode: { type: 'string' },
72
+ config: { type: 'string' },
73
+ },
74
+ allowPositionals: false,
75
+ });
76
+ }
77
+ catch (err) {
78
+ emitEnvelope({
79
+ code: 'invalid_invocation',
80
+ message: err instanceof Error ? err.message : String(err),
81
+ exampleCli: 'jinn auth',
82
+ details: { field: 'flags' },
83
+ }, { writer: ctx.writer, exit: ctx.exit });
84
+ return;
85
+ }
86
+ const cwd = process.cwd();
87
+ const configPath = typeof parsed.values.config === 'string' && parsed.values.config.length > 0
88
+ ? parsed.values.config
89
+ : undefined;
90
+ const config = loadConfig(configPath);
91
+ // ── Resolve runtime mode ─────────────────────────────────────────────────
92
+ // Order: --mode flag > config.runtimeMode > (interactive prompt if TTY)
93
+ // > filesystem-based auto-detect (legacy fallback).
94
+ let runtimeMode;
95
+ const modeFlag = typeof parsed.values.mode === 'string' ? parsed.values.mode : undefined;
96
+ if (modeFlag) {
97
+ if (modeFlag !== 'bare' && modeFlag !== 'docker-compose' && modeFlag !== 'container') {
98
+ emitEnvelope({
99
+ code: 'invalid_invocation',
100
+ message: `--mode must be one of bare, docker-compose, container (got ${modeFlag})`,
101
+ exampleCli: 'jinn auth --mode bare',
102
+ details: { field: 'mode' },
103
+ }, { writer: ctx.writer, exit: ctx.exit });
104
+ return;
105
+ }
106
+ runtimeMode = modeFlag;
107
+ persistRuntimeMode(runtimeMode, configPath ?? DEFAULT_CONFIG_PATH);
108
+ process.stderr.write(`[auth] runtime mode set to '${runtimeMode}' (persisted to config).\n`);
109
+ }
110
+ else if (config.runtimeMode) {
111
+ runtimeMode = config.runtimeMode;
112
+ }
113
+ else if (ctx.stdoutIsTty) {
114
+ const picked = await promptRuntimeMode();
115
+ if (picked !== null) {
116
+ runtimeMode = picked;
117
+ persistRuntimeMode(runtimeMode, configPath ?? DEFAULT_CONFIG_PATH);
118
+ process.stderr.write(`[auth] runtime mode set to '${runtimeMode}' (persisted).\n\n`);
119
+ }
120
+ }
121
+ // If still unset (non-TTY, no flag, no config), fall through to filesystem detection below.
122
+ const context = detectAuthContext({ cwd, configuredMode: runtimeMode });
123
+ const probe = probeClaudeAuth({ context, cwd });
124
+ if (probe.authenticated) {
125
+ const payload = {
126
+ schemaVersion: 1,
127
+ generatedAt: new Date().toISOString(),
128
+ authenticated: true,
129
+ context,
130
+ detail: probe.detail,
131
+ ...(probe.email !== undefined ? { email: probe.email } : {}),
132
+ };
133
+ emitResult(payload, (v) => JSON.stringify(v, null, 2), {
134
+ json: Boolean(parsed.values.json),
135
+ human: Boolean(parsed.values.human),
136
+ writer: ctx.writer,
137
+ stdoutIsTty: ctx.stdoutIsTty,
138
+ noColor: Boolean(ctx.env['NO_COLOR']),
139
+ });
140
+ return;
141
+ }
142
+ // Not authenticated
143
+ if (!ctx.stdoutIsTty) {
144
+ const contextLabel = CONTEXT_LABELS[context] ?? context;
145
+ emitEnvelope({
146
+ code: 'invalid_invocation',
147
+ message: `Claude is not authenticated ${contextLabel}. Run \`jinn auth\` in a TTY to log in.`,
148
+ exampleCli: 'jinn auth',
149
+ details: { field: 'auth', context },
150
+ }, { writer: ctx.writer, exit: ctx.exit });
151
+ return;
152
+ }
153
+ // TTY — prompt and run interactive login
154
+ const contextLabel = CONTEXT_LABELS[context] ?? context;
155
+ process.stderr.write(`Claude is not authenticated ${contextLabel}. Starting login…\n`);
156
+ if (context === 'docker-compose') {
157
+ process.stderr.write('A browser URL will appear in the output below. Open it to complete authentication.\n');
158
+ }
159
+ const { command, args } = buildLoginCommand(context, cwd);
160
+ const result = spawnSync(command, args, { stdio: 'inherit' });
161
+ if (result.status !== 0) {
162
+ emitEnvelope({
163
+ code: 'fatal',
164
+ message: `Login command exited with code ${result.status ?? 'null'}.`,
165
+ exampleCli: 'jinn auth',
166
+ details: { context },
167
+ }, { writer: ctx.writer, exit: ctx.exit });
168
+ return;
169
+ }
170
+ // Re-probe to verify
171
+ const reProbe = probeClaudeAuth({ context, cwd });
172
+ if (reProbe.authenticated) {
173
+ const payload = {
174
+ schemaVersion: 1,
175
+ generatedAt: new Date().toISOString(),
176
+ authenticated: true,
177
+ context,
178
+ detail: reProbe.detail,
179
+ ...(reProbe.email !== undefined ? { email: reProbe.email } : {}),
180
+ };
181
+ emitResult(payload, (v) => JSON.stringify(v, null, 2), {
182
+ json: Boolean(parsed.values.json),
183
+ human: Boolean(parsed.values.human),
184
+ writer: ctx.writer,
185
+ stdoutIsTty: ctx.stdoutIsTty,
186
+ noColor: Boolean(ctx.env['NO_COLOR']),
187
+ });
188
+ return;
189
+ }
190
+ emitEnvelope({
191
+ code: 'fatal',
192
+ message: 'Login completed but Claude is still not authenticated. Try running `jinn auth` again.',
193
+ exampleCli: 'jinn auth',
194
+ details: { context },
195
+ }, { writer: ctx.writer, exit: ctx.exit });
196
+ }
197
+ const command = {
198
+ name: 'auth',
199
+ summary: 'Check Claude authentication and persist how the operator runs the daemon',
200
+ helpText: `Usage: jinn auth [--mode <bare|docker-compose|container>] [--human] [--json] [--config <path>]
201
+
202
+ Two concerns in one command:
203
+
204
+ 1. Runtime mode — how the operator wants to run the daemon. Persisted to
205
+ config once (so downstream commands don't re-detect by cwd heuristics).
206
+ 2. Claude authentication — verified, and in a TTY launched interactively
207
+ if missing.
208
+
209
+ Runtime-mode resolution order:
210
+ --mode flag > scripted / CI
211
+ config.runtimeMode > persisted from a prior \`jinn auth\`
212
+ interactive prompt > TTY fallback — asks the operator to pick
213
+ filesystem heuristic > last-resort: container (/.dockerenv) → docker-compose (cwd jinn-daemon compose) → bare
214
+
215
+ Behaviour:
216
+ - If runtime mode is unset and you're in a TTY, you'll be prompted. The
217
+ answer persists to ~/.jinn-client/config.json (or the --config path).
218
+ - If authenticated → emits JSON result with authenticated:true, context, detail.
219
+ - If not authenticated in non-TTY → emits invalid_invocation (exit 11).
220
+ - If not authenticated in a TTY → runs the appropriate login command.
221
+
222
+ Flags:
223
+ --mode <m> Set runtime mode non-interactively (bare | docker-compose | container).
224
+ --config <p> Path to config file (default: ~/.jinn-client/config.json).
225
+ --json Force JSON output.
226
+ --human Force human-readable output.
227
+
228
+ Examples:
229
+ jinn auth # interactive: picks mode + authenticates
230
+ jinn auth --mode bare # scripted: set mode + authenticate
231
+ jinn auth --mode docker-compose --json
232
+ `,
233
+ run,
234
+ };
235
+ export default command;
236
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -62,6 +62,7 @@ async function run(ctx) {
62
62
  earningDir: config.earningDir,
63
63
  chain: config.network === 'testnet' ? 'base-sepolia' : 'base',
64
64
  rpcUrl: config.rpcUrl,
65
+ env: ctx.env,
65
66
  stakingMode: config.stakingMode,
66
67
  targetServices: config.targetServices,
67
68
  testnetL2DeploymentPath: config.testnetL2DeploymentPath,
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/cli/commands/bootstrap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/cli/commands/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,18 @@
1
1
  import { existsSync } from 'node:fs';
2
- import { isAbsolute, join } from 'node:path';
2
+ import { dirname, isAbsolute, join } from 'node:path';
3
3
  import { parseArgs } from 'node:util';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { createPublicClient, http } from 'viem';
6
+ import { baseSepolia } from 'viem/chains';
4
7
  import { COMMON_FLAGS } from '../command.js';
5
8
  import { emitResult } from '../output.js';
6
9
  import { emitEnvelope } from '../../errors/envelope.js';
7
10
  import { checkClaudeBinary } from '../../preflight/claude-binary.js';
11
+ import { detectAuthContext, probeClaudeAuth } from '../../preflight/claude-auth.js';
8
12
  import { getConfigPathFromArgs, loadConfig } from '../../config.js';
9
- import { getChainConfig } from '../../earning/contracts.js';
13
+ import { getChainConfig, ERC20_ABI } from '../../earning/contracts.js';
14
+ import { runPortfolioV0DoctorChecks } from '../../api/portfolio-v0-doctor.js';
15
+ import { mnemonicKeystorePath } from '../../earning/store.js';
10
16
  async function checkNodeVersion() {
11
17
  const version = process.versions.node;
12
18
  const major = parseInt(version.split('.')[0], 10);
@@ -18,19 +24,19 @@ async function checkNodeVersion() {
18
24
  ...(ok ? {} : { remedy: 'Upgrade to Node.js 20 or newer.' }),
19
25
  };
20
26
  }
21
- async function checkKeystoreReadable(earningDir) {
22
- const keystorePath = join(earningDir, 'mnemonic.keystore.json');
27
+ function checkKeystorePresent(earningDir) {
28
+ const keystorePath = mnemonicKeystorePath(earningDir);
23
29
  if (existsSync(keystorePath)) {
24
30
  return {
25
- name: 'keystore_readable',
31
+ name: 'keystore_present',
26
32
  ok: true,
27
- detail: 'mnemonic keystore present in configured earning directory',
33
+ detail: `mnemonic keystore present at ${keystorePath}`,
28
34
  };
29
35
  }
30
36
  return {
31
- name: 'keystore_readable',
32
- ok: true, // Missing is fine before `jinn init`; not a blocker.
33
- detail: 'no keystore yet (expected on a fresh install)',
37
+ name: 'keystore_present',
38
+ ok: true, // Missing is fine before `jinn init`; `jinn run` / `bootstrap` will create it.
39
+ detail: 'no keystore yet — run `jinn init` to create one',
34
40
  };
35
41
  }
36
42
  async function checkDeploymentLoaded(config) {
@@ -83,6 +89,105 @@ function claudeBinaryCheckForDoctor(claudePath, result) {
83
89
  }),
84
90
  };
85
91
  }
92
+ /**
93
+ * Verify the daemon can spawn its HL MCP subprocess. The generated
94
+ * `hl-server.mjs` wrapper imports `mcp-tools.js` by absolute path and is
95
+ * loaded by plain Node — so the compiled artifact MUST exist on disk
96
+ * before `jinn run` spawns any Claude session. Without this check, the
97
+ * operator hits a silent "Claude didn't call any tools" symptom.
98
+ */
99
+ function checkDaemonRuntimeReady() {
100
+ // doctor.ts compiles to dist/cli/commands/doctor.js → package root is 3 levels up.
101
+ // Under tsx (dev), __dirname is src/cli/commands; the check then looks for a sibling
102
+ // built artifact under dist/, which will only exist after `yarn build`.
103
+ const thisDir = dirname(fileURLToPath(import.meta.url));
104
+ const mcpToolsJsDist = join(thisDir, '..', '..', 'restorer', 'impls', 'claude-mcp-hyperliquid', 'mcp-tools.js');
105
+ if (existsSync(mcpToolsJsDist)) {
106
+ return {
107
+ name: 'daemon_runtime_ready',
108
+ ok: true,
109
+ detail: `compiled MCP tool module present at ${mcpToolsJsDist}`,
110
+ };
111
+ }
112
+ return {
113
+ name: 'daemon_runtime_ready',
114
+ ok: false,
115
+ detail: `compiled MCP tool module missing (expected ${mcpToolsJsDist})`,
116
+ remedy: 'The daemon must run from a compiled build. Run `yarn build` before `yarn dev` / `node dist/bin/jinn.js run`, ' +
117
+ 'or reinstall the npm package with `npm install -g @jinn-network/client@latest`.',
118
+ };
119
+ }
120
+ /**
121
+ * On testnet, warn if the stOLAS distributor pool is drained. Operators can
122
+ * neither fix this themselves nor bootstrap past it — the protocol team has
123
+ * to refill (see contracts/scripts/README-jinn-testnet-faucet.md). Emitted
124
+ * as a warning, not a hard failure, because a refill may be in-flight.
125
+ */
126
+ async function checkDistributorReachable(config) {
127
+ if (config.network !== 'testnet')
128
+ return null;
129
+ try {
130
+ const cfg = getChainConfig('base-sepolia', {
131
+ testnetL2DeploymentPath: config.testnetL2DeploymentPath,
132
+ testnetL2TokenDeploymentPath: config.testnetL2TokenDeploymentPath,
133
+ testnetMechDeploymentPath: config.testnetMechDeploymentPath,
134
+ testnetStolasDeploymentPath: config.testnetStolasDeploymentPath,
135
+ });
136
+ if (!cfg.distributorAddress) {
137
+ return {
138
+ name: 'distributor_reachable',
139
+ ok: true,
140
+ detail: 'distributor address not configured (standard mode staking disabled)',
141
+ };
142
+ }
143
+ const client = createPublicClient({ chain: baseSepolia, transport: http(cfg.rpcUrl) });
144
+ const balance = await client.readContract({
145
+ address: cfg.olasToken,
146
+ abi: ERC20_ABI,
147
+ functionName: 'balanceOf',
148
+ args: [cfg.distributorAddress],
149
+ });
150
+ const floor = cfg.bondAmount * 2n;
151
+ const jinn = Number(balance) / 1e18;
152
+ const required = Number(floor) / 1e18;
153
+ if (balance < floor) {
154
+ return {
155
+ name: 'distributor_reachable',
156
+ ok: false,
157
+ detail: `testnet staking pool is drained — distributor holds ${jinn.toFixed(2)} JINN, need ≥${required.toFixed(2)} per service`,
158
+ remedy: 'Protocol-team action required (operators cannot fix this locally). ' +
159
+ 'Report the outage to the Jinn testnet channel; bootstrap will keep failing with `Overflow` until the pool is topped up.',
160
+ };
161
+ }
162
+ return {
163
+ name: 'distributor_reachable',
164
+ ok: true,
165
+ detail: `distributor holds ${jinn.toFixed(2)} JINN (${Math.floor(jinn / required)} services of runway)`,
166
+ };
167
+ }
168
+ catch (err) {
169
+ return {
170
+ name: 'distributor_reachable',
171
+ ok: true, // Non-fatal — probe failure doesn't mean the pool is empty.
172
+ detail: `distributor probe failed: ${err instanceof Error ? err.message : String(err)}`,
173
+ };
174
+ }
175
+ }
176
+ async function checkClaudeAuth(config) {
177
+ const cwd = process.cwd();
178
+ const context = detectAuthContext({ cwd, configuredMode: config.runtimeMode });
179
+ const probe = probeClaudeAuth({ context, cwd });
180
+ return {
181
+ name: 'claude_auth',
182
+ ok: probe.authenticated,
183
+ detail: probe.authenticated
184
+ ? `${probe.detail} (${context})`
185
+ : `Not authenticated (${context})`,
186
+ ...(probe.authenticated
187
+ ? {}
188
+ : { remedy: 'Run `jinn auth` to authenticate Claude.' }),
189
+ };
190
+ }
86
191
  async function run(ctx) {
87
192
  let parsed;
88
193
  try {
@@ -107,8 +212,25 @@ async function run(ctx) {
107
212
  checks.push(await checkNodeVersion());
108
213
  const claudeResult = await checkClaudeBinary(config.claudePath);
109
214
  checks.push(claudeBinaryCheckForDoctor(config.claudePath, claudeResult));
110
- checks.push(await checkKeystoreReadable(config.earningDir));
215
+ checks.push(await checkClaudeAuth(config));
216
+ checks.push(checkKeystorePresent(config.earningDir));
111
217
  checks.push(await checkDeploymentLoaded(config));
218
+ checks.push(checkDaemonRuntimeReady());
219
+ const distributorCheck = await checkDistributorReachable(config);
220
+ if (distributorCheck)
221
+ checks.push(distributorCheck);
222
+ // portfolio.v0 checks — only run if the operator has configured a
223
+ // portfolio.v0 desired state. Otherwise, reporting `hl_api_wallet: fail`
224
+ // on a fresh operator who hasn't submitted an HL intent is false-alarm
225
+ // noise. Operators who want the HL-specific preflight in isolation can
226
+ // run those checks under a dedicated verb once one exists.
227
+ const hasPortfolioV0 = config.desiredStates.some((d) => d.spec?.kind === 'portfolio.v0');
228
+ if (hasPortfolioV0) {
229
+ const implStateDirRoot = '/tmp/jinn-engine-impl-state';
230
+ const hlImplStateDir = join(implStateDirRoot, 'claude-mcp-hyperliquid');
231
+ const portfolioChecks = runPortfolioV0DoctorChecks(hlImplStateDir);
232
+ checks.push(...portfolioChecks);
233
+ }
112
234
  const blockingCount = checks.filter((c) => !c.ok).length;
113
235
  const payload = {
114
236
  schemaVersion: 1,
@@ -117,7 +239,7 @@ async function run(ctx) {
117
239
  ok: blockingCount === 0,
118
240
  blockingCount,
119
241
  };
120
- emitResult(payload, (v) => JSON.stringify(v, null, 2), {
242
+ emitResult(payload, (v) => humanDoctor(v), {
121
243
  json: Boolean(parsed.values.json),
122
244
  human: Boolean(parsed.values.human),
123
245
  writer: ctx.writer,
@@ -125,6 +247,19 @@ async function run(ctx) {
125
247
  noColor: Boolean(ctx.env['NO_COLOR']),
126
248
  });
127
249
  }
250
+ function humanDoctor(payload) {
251
+ const lines = [];
252
+ for (const check of payload.checks) {
253
+ const mark = check.ok ? 'ok ' : 'fail';
254
+ lines.push(`[${mark}] ${check.name}: ${check.detail}`);
255
+ if (check.remedy)
256
+ lines.push(` remedy: ${check.remedy}`);
257
+ }
258
+ lines.push(payload.ok
259
+ ? 'Summary: all checks passed.'
260
+ : `Summary: ${payload.blockingCount} blocking check(s) failed.`);
261
+ return lines.join('\n');
262
+ }
128
263
  const command = {
129
264
  name: 'doctor',
130
265
  summary: 'Preflight checks: answers "would jinn run work?" without running it',
@@ -132,10 +267,13 @@ const command = {
132
267
 
133
268
  Runs a set of non-mutating checks against the local environment and
134
269
  configuration:
135
- - node_version Node.js >= 20
136
- - claude_binary claude CLI resolvable on PATH
137
- - keystore_readable mnemonic keystore in configured earning directory (optional)
138
- - deployment_loaded testnet/mainnet contract addresses resolved
270
+ - node_version Node.js >= 20
271
+ - claude_binary claude CLI resolvable on PATH
272
+ - claude_auth Claude CLI authenticated
273
+ - keystore_present mnemonic keystore in configured earning directory (optional)
274
+ - deployment_loaded testnet/mainnet contract addresses resolved
275
+ - portfolio_impl_state_dir HL impl state directory present and readable
276
+ - hl_api_wallet HL API wallet generated and approved by operator
139
277
 
140
278
  By default, emits a machine-readable JSON object with a checks array,
141
279
  an overall ok flag, and a blockingCount. Exit code is 0 even when
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAgC,MAAM,kCAAkC,CAAC;AACnG,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAS5D,KAAK,UAAU,gBAAgB;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;IACvB,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,EAAE;QACF,MAAM,EAAE,IAAI,OAAO,EAAE;QACrB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IACrD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAC;IAChE,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,2DAA2D;SACpE,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,EAAE,EAAE,IAAI,EAAE,qDAAqD;QAC/D,MAAM,EAAE,+CAA+C;KACxD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,MAAkB;IACrD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC;QACrE,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE;YAChC,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;YACvD,4BAA4B,EAAE,MAAM,CAAC,4BAA4B;YACjE,yBAAyB,EAAE,MAAM,CAAC,yBAAyB;YAC3D,2BAA2B,EAAE,MAAM,CAAC,2BAA2B;SAChE,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,KAAK,4CAA4C,CAAC;QACrF,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC,CAAC,mDAAmD;YAC9F,GAAG,CAAC,OAAO;gBACT,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,MAAM,EACJ,+GAA+G;iBAClH,CAAC;SACP,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,8CAA8C;YACtD,MAAM,EAAE,gEAAgE;SACzE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,UAAkB,EAAE,MAA+B;IACrF,MAAM,gBAAgB,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE;QACtB,CAAC,CAAC,gBAAgB;YAChB,CAAC,CAAC,+CAA+C;YACjD,CAAC,CAAC,sBAAsB;QAC1B,CAAC,CAAC,gBAAgB;YAChB,CAAC,CAAC,kDAAkD;YACpD,CAAC,CAAC,uBAAuB,CAAC;IAC9B,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM;QACN,GAAG,CAAC,MAAM,CAAC,EAAE;YACX,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,MAAM,EACJ,oFAAoF;aACvF,CAAC;KACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,GAAmB;IACpC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,EAAE,GAAG,YAAY,EAAE;YAC5B,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACzD,UAAU,EAAE,aAAa;YACzB,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;SAC5B,EACD,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACvC,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GACd,qBAAqB,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,MAAM,CAAC,IAAI,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC;IAEtC,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IAEzE,MAAM,CAAC,IAAI,CAAC,MAAM,qBAAqB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5D,MAAM,CAAC,IAAI,CAAC,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IACzD,MAAM,OAAO,GAAG;QACd,aAAa,EAAE,CAAU;QACzB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,MAAM;QACN,EAAE,EAAE,aAAa,KAAK,CAAC;QACvB,aAAa;KACd,CAAC;IAEF,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACrD,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QACnC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;KACtC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,GAAkB;IAC7B,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,qEAAqE;IAC9E,QAAQ,EAAE;;;;;;;;;;;;;;;;CAgBX;IACC,GAAG;CACJ,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,34 @@
1
+ import { createPublicClient, formatUnits, http } from 'viem';
2
+ import { base, baseSepolia } from 'viem/chains';
1
3
  import { COMMON_FLAGS, parseCommandArgs } from '../command.js';
2
4
  import { emitResult } from '../output.js';
3
5
  import { emitEnvelope } from '../../errors/envelope.js';
4
6
  import { loadConfig } from '../../config.js';
5
7
  import { FleetBootstrapper } from '../../earning/bootstrap.js';
8
+ import { getChainConfig } from '../../earning/contracts.js';
6
9
  import { resolveCliPassword } from '../password.js';
7
10
  /** §6.2 — `stack` only when `JINN_DEBUG=1` (exact string). */
8
11
  function envelopeDebug(env) {
9
12
  return env['JINN_DEBUG'] === '1';
10
13
  }
14
+ function formatAmount(wei, symbol) {
15
+ try {
16
+ // All three asset roles (native, bond, reward) use 18 decimals in Phase 1b.
17
+ return `${formatUnits(BigInt(wei), 18)} ${symbol}`;
18
+ }
19
+ catch {
20
+ return `${wei} wei (${symbol})`;
21
+ }
22
+ }
11
23
  function humanFundRequirements(payload) {
12
24
  if (payload.satisfied) {
13
25
  return 'Funding requirements satisfied. Nothing needed right now.';
14
26
  }
15
27
  const lines = ['Funding required before bootstrap can advance:'];
16
28
  for (const r of payload.requirements) {
17
- lines.push(`- ${r.role} @ ${r.address}: asset role ${r.asset}, need ${r.needWei} wei, have ${r.haveWei} wei`);
29
+ const need = formatAmount(r.needWei, r.details.tokenSymbol);
30
+ const have = formatAmount(r.haveWei, r.details.tokenSymbol);
31
+ lines.push(`- ${r.role} @ ${r.address}: need ${need}, have ${have}`);
18
32
  }
19
33
  return lines.join('\n');
20
34
  }
@@ -100,6 +114,60 @@ async function run(ctx) {
100
114
  details: { tokenAddress: null, tokenSymbol: 'ETH' },
101
115
  });
102
116
  }
117
+ else {
118
+ // Bootstrap is satisfied. Still probe per-Safe native ETH: the daemon's
119
+ // balance-topup-loop auto-tops from master at runtime, but operators
120
+ // running in tooling contexts (acceptance gate, CI, bare `submit-intent`)
121
+ // hit the mech-fee path before any topup tick fires. A Safe that holds
122
+ // less than the per-service `minSafeEth` threshold will silently fail on
123
+ // `createEvaluationJob`, wrapped as `GS013` at the Safe layer — surface
124
+ // it here so ops see the gap before running.
125
+ const chainKey = config.network === 'testnet' ? 'base-sepolia' : 'base';
126
+ const chainCfg = getChainConfig(chainKey, {
127
+ testnetL2DeploymentPath: config.testnetL2DeploymentPath,
128
+ testnetL2TokenDeploymentPath: config.testnetL2TokenDeploymentPath,
129
+ testnetMechDeploymentPath: config.testnetMechDeploymentPath,
130
+ testnetStolasDeploymentPath: config.testnetStolasDeploymentPath,
131
+ });
132
+ const viemChain = chainKey === 'base' ? base : baseSepolia;
133
+ const publicClient = createPublicClient({
134
+ chain: viemChain,
135
+ transport: http(config.rpcUrl),
136
+ });
137
+ const probeRows = await Promise.all(result.fleet_state.services
138
+ .filter(svc => svc.step === 'complete' && svc.safe_address)
139
+ .map(async (svc) => {
140
+ const address = svc.safe_address;
141
+ try {
142
+ const bal = await publicClient.getBalance({ address: address });
143
+ if (bal >= chainCfg.minSafeEth)
144
+ return null;
145
+ return {
146
+ role: `service_${svc.index}_safe`,
147
+ address,
148
+ asset: 'native',
149
+ haveWei: bal.toString(),
150
+ needWei: (chainCfg.minSafeEth - bal).toString(),
151
+ reason: `Service ${svc.index} Safe needs native ETH to pay mech fees (each evaluation job sends 99 wei). ` +
152
+ `The daemon's balance-topup-loop auto-refills from master at runtime; funding it manually is ` +
153
+ `required only when running CLI verbs (submit-intent, acceptance gate) outside the daemon.`,
154
+ blocks: 'run',
155
+ details: { tokenAddress: null, tokenSymbol: 'ETH' },
156
+ };
157
+ }
158
+ catch (err) {
159
+ // Probe failures are not a funding gap on their own; emit a warning
160
+ // so operators can distinguish "Safe OK" from "couldn't tell".
161
+ const message = err instanceof Error ? err.message : String(err);
162
+ process.stderr.write(`[warn] fund-requirements: failed to probe Safe ${address} for service ${svc.index}: ${message}\n`);
163
+ return null;
164
+ }
165
+ }));
166
+ for (const row of probeRows) {
167
+ if (row)
168
+ requirements.push(row);
169
+ }
170
+ }
103
171
  const payload = {
104
172
  schemaVersion: 1,
105
173
  generatedAt: new Date().toISOString(),