@jinn-network/client 0.1.0-canary.adfd078d

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 (278) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -0
  3. package/deployments/deployment-phase1a-l2-baseSepolia-fast.json +32 -0
  4. package/deployments/deployment-phase1a-token-baseSepolia-fast.json +27 -0
  5. package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +26 -0
  6. package/deployments/deployment-stolas-l2-baseSepolia-fast.json +35 -0
  7. package/dist/adapters/adapter.d.ts +11 -0
  8. package/dist/adapters/adapter.js +2 -0
  9. package/dist/adapters/adapter.js.map +1 -0
  10. package/dist/adapters/local/adapter.d.ts +20 -0
  11. package/dist/adapters/local/adapter.js +146 -0
  12. package/dist/adapters/local/adapter.js.map +1 -0
  13. package/dist/adapters/mech/adapter.d.ts +29 -0
  14. package/dist/adapters/mech/adapter.js +332 -0
  15. package/dist/adapters/mech/adapter.js.map +1 -0
  16. package/dist/adapters/mech/claim-policy.d.ts +40 -0
  17. package/dist/adapters/mech/claim-policy.js +104 -0
  18. package/dist/adapters/mech/claim-policy.js.map +1 -0
  19. package/dist/adapters/mech/contracts.d.ts +44 -0
  20. package/dist/adapters/mech/contracts.js +323 -0
  21. package/dist/adapters/mech/contracts.js.map +1 -0
  22. package/dist/adapters/mech/ipfs.d.ts +43 -0
  23. package/dist/adapters/mech/ipfs.js +142 -0
  24. package/dist/adapters/mech/ipfs.js.map +1 -0
  25. package/dist/adapters/mech/safe.d.ts +15 -0
  26. package/dist/adapters/mech/safe.js +113 -0
  27. package/dist/adapters/mech/safe.js.map +1 -0
  28. package/dist/adapters/mech/types.d.ts +561 -0
  29. package/dist/adapters/mech/types.js +340 -0
  30. package/dist/adapters/mech/types.js.map +1 -0
  31. package/dist/api/balance-build.d.ts +22 -0
  32. package/dist/api/balance-build.js +37 -0
  33. package/dist/api/balance-build.js.map +1 -0
  34. package/dist/api/fleet-build.d.ts +62 -0
  35. package/dist/api/fleet-build.js +91 -0
  36. package/dist/api/fleet-build.js.map +1 -0
  37. package/dist/api/gather-status.d.ts +20 -0
  38. package/dist/api/gather-status.js +137 -0
  39. package/dist/api/gather-status.js.map +1 -0
  40. package/dist/api/history-build.d.ts +32 -0
  41. package/dist/api/history-build.js +48 -0
  42. package/dist/api/history-build.js.map +1 -0
  43. package/dist/api/peers.d.ts +27 -0
  44. package/dist/api/peers.js +94 -0
  45. package/dist/api/peers.js.map +1 -0
  46. package/dist/api/rewards-build.d.ts +20 -0
  47. package/dist/api/rewards-build.js +42 -0
  48. package/dist/api/rewards-build.js.map +1 -0
  49. package/dist/api/server.d.ts +34 -0
  50. package/dist/api/server.js +130 -0
  51. package/dist/api/server.js.map +1 -0
  52. package/dist/api/status-build.d.ts +92 -0
  53. package/dist/api/status-build.js +175 -0
  54. package/dist/api/status-build.js.map +1 -0
  55. package/dist/api/status-rollup-build.d.ts +36 -0
  56. package/dist/api/status-rollup-build.js +69 -0
  57. package/dist/api/status-rollup-build.js.map +1 -0
  58. package/dist/auth/erc8128.d.ts +43 -0
  59. package/dist/auth/erc8128.js +88 -0
  60. package/dist/auth/erc8128.js.map +1 -0
  61. package/dist/bin/jinn.d.ts +11 -0
  62. package/dist/bin/jinn.js +20 -0
  63. package/dist/bin/jinn.js.map +1 -0
  64. package/dist/build-meta.json +3 -0
  65. package/dist/chain-read-errors.d.ts +9 -0
  66. package/dist/chain-read-errors.js +43 -0
  67. package/dist/chain-read-errors.js.map +1 -0
  68. package/dist/cli/action.d.ts +26 -0
  69. package/dist/cli/action.js +56 -0
  70. package/dist/cli/action.js.map +1 -0
  71. package/dist/cli/command.d.ts +62 -0
  72. package/dist/cli/command.js +29 -0
  73. package/dist/cli/command.js.map +1 -0
  74. package/dist/cli/commands/balance.d.ts +3 -0
  75. package/dist/cli/commands/balance.js +46 -0
  76. package/dist/cli/commands/balance.js.map +1 -0
  77. package/dist/cli/commands/bootstrap.d.ts +3 -0
  78. package/dist/cli/commands/bootstrap.js +165 -0
  79. package/dist/cli/commands/bootstrap.js.map +1 -0
  80. package/dist/cli/commands/claim-rewards.d.ts +3 -0
  81. package/dist/cli/commands/claim-rewards.js +121 -0
  82. package/dist/cli/commands/claim-rewards.js.map +1 -0
  83. package/dist/cli/commands/doctor.d.ts +3 -0
  84. package/dist/cli/commands/doctor.js +151 -0
  85. package/dist/cli/commands/doctor.js.map +1 -0
  86. package/dist/cli/commands/fleet-scale.d.ts +3 -0
  87. package/dist/cli/commands/fleet-scale.js +449 -0
  88. package/dist/cli/commands/fleet-scale.js.map +1 -0
  89. package/dist/cli/commands/fleet.d.ts +3 -0
  90. package/dist/cli/commands/fleet.js +45 -0
  91. package/dist/cli/commands/fleet.js.map +1 -0
  92. package/dist/cli/commands/fund-requirements.d.ts +3 -0
  93. package/dist/cli/commands/fund-requirements.js +139 -0
  94. package/dist/cli/commands/fund-requirements.js.map +1 -0
  95. package/dist/cli/commands/history.d.ts +3 -0
  96. package/dist/cli/commands/history.js +61 -0
  97. package/dist/cli/commands/history.js.map +1 -0
  98. package/dist/cli/commands/init.d.ts +3 -0
  99. package/dist/cli/commands/init.js +91 -0
  100. package/dist/cli/commands/init.js.map +1 -0
  101. package/dist/cli/commands/keys-backup.d.ts +3 -0
  102. package/dist/cli/commands/keys-backup.js +107 -0
  103. package/dist/cli/commands/keys-backup.js.map +1 -0
  104. package/dist/cli/commands/logs.d.ts +3 -0
  105. package/dist/cli/commands/logs.js +69 -0
  106. package/dist/cli/commands/logs.js.map +1 -0
  107. package/dist/cli/commands/rewards.d.ts +3 -0
  108. package/dist/cli/commands/rewards.js +54 -0
  109. package/dist/cli/commands/rewards.js.map +1 -0
  110. package/dist/cli/commands/run.d.ts +3 -0
  111. package/dist/cli/commands/run.js +96 -0
  112. package/dist/cli/commands/run.js.map +1 -0
  113. package/dist/cli/commands/status.d.ts +3 -0
  114. package/dist/cli/commands/status.js +54 -0
  115. package/dist/cli/commands/status.js.map +1 -0
  116. package/dist/cli/commands/stop.d.ts +3 -0
  117. package/dist/cli/commands/stop.js +82 -0
  118. package/dist/cli/commands/stop.js.map +1 -0
  119. package/dist/cli/commands/submit-intent.d.ts +3 -0
  120. package/dist/cli/commands/submit-intent.js +169 -0
  121. package/dist/cli/commands/submit-intent.js.map +1 -0
  122. package/dist/cli/commands/version.d.ts +3 -0
  123. package/dist/cli/commands/version.js +114 -0
  124. package/dist/cli/commands/version.js.map +1 -0
  125. package/dist/cli/commands/withdraw.d.ts +3 -0
  126. package/dist/cli/commands/withdraw.js +181 -0
  127. package/dist/cli/commands/withdraw.js.map +1 -0
  128. package/dist/cli/deployment-digest.d.ts +10 -0
  129. package/dist/cli/deployment-digest.js +25 -0
  130. package/dist/cli/deployment-digest.js.map +1 -0
  131. package/dist/cli/execution-context.d.ts +50 -0
  132. package/dist/cli/execution-context.js +154 -0
  133. package/dist/cli/execution-context.js.map +1 -0
  134. package/dist/cli/help.d.ts +3 -0
  135. package/dist/cli/help.js +37 -0
  136. package/dist/cli/help.js.map +1 -0
  137. package/dist/cli/index.d.ts +17 -0
  138. package/dist/cli/index.js +132 -0
  139. package/dist/cli/index.js.map +1 -0
  140. package/dist/cli/introspection-context.d.ts +10 -0
  141. package/dist/cli/introspection-context.js +60 -0
  142. package/dist/cli/introspection-context.js.map +1 -0
  143. package/dist/cli/output.d.ts +36 -0
  144. package/dist/cli/output.js +35 -0
  145. package/dist/cli/output.js.map +1 -0
  146. package/dist/cli/password.d.ts +12 -0
  147. package/dist/cli/password.js +51 -0
  148. package/dist/cli/password.js.map +1 -0
  149. package/dist/config.d.ts +174 -0
  150. package/dist/config.js +252 -0
  151. package/dist/config.js.map +1 -0
  152. package/dist/daemon/creator.d.ts +24 -0
  153. package/dist/daemon/creator.js +80 -0
  154. package/dist/daemon/creator.js.map +1 -0
  155. package/dist/daemon/daemon.d.ts +60 -0
  156. package/dist/daemon/daemon.js +158 -0
  157. package/dist/daemon/daemon.js.map +1 -0
  158. package/dist/daemon/delivery-watcher.d.ts +10 -0
  159. package/dist/daemon/delivery-watcher.js +37 -0
  160. package/dist/daemon/delivery-watcher.js.map +1 -0
  161. package/dist/daemon/restorer.d.ts +19 -0
  162. package/dist/daemon/restorer.js +82 -0
  163. package/dist/daemon/restorer.js.map +1 -0
  164. package/dist/daemon/reward-claim-loop.d.ts +38 -0
  165. package/dist/daemon/reward-claim-loop.js +48 -0
  166. package/dist/daemon/reward-claim-loop.js.map +1 -0
  167. package/dist/discovery/registry.d.ts +43 -0
  168. package/dist/discovery/registry.js +104 -0
  169. package/dist/discovery/registry.js.map +1 -0
  170. package/dist/discovery/subgraph.d.ts +37 -0
  171. package/dist/discovery/subgraph.js +87 -0
  172. package/dist/discovery/subgraph.js.map +1 -0
  173. package/dist/earning/bootstrap.d.ts +79 -0
  174. package/dist/earning/bootstrap.js +989 -0
  175. package/dist/earning/bootstrap.js.map +1 -0
  176. package/dist/earning/contracts.d.ts +431 -0
  177. package/dist/earning/contracts.js +518 -0
  178. package/dist/earning/contracts.js.map +1 -0
  179. package/dist/earning/evidence-simhash.d.ts +59 -0
  180. package/dist/earning/evidence-simhash.js +87 -0
  181. package/dist/earning/evidence-simhash.js.map +1 -0
  182. package/dist/earning/fleet-display-index.d.ts +8 -0
  183. package/dist/earning/fleet-display-index.js +12 -0
  184. package/dist/earning/fleet-display-index.js.map +1 -0
  185. package/dist/earning/fleet-retire.d.ts +28 -0
  186. package/dist/earning/fleet-retire.js +75 -0
  187. package/dist/earning/fleet-retire.js.map +1 -0
  188. package/dist/earning/jinn-rewards.d.ts +62 -0
  189. package/dist/earning/jinn-rewards.js +81 -0
  190. package/dist/earning/jinn-rewards.js.map +1 -0
  191. package/dist/earning/next-service-index.d.ts +4 -0
  192. package/dist/earning/next-service-index.js +7 -0
  193. package/dist/earning/next-service-index.js.map +1 -0
  194. package/dist/earning/orphan-sweep.d.ts +33 -0
  195. package/dist/earning/orphan-sweep.js +157 -0
  196. package/dist/earning/orphan-sweep.js.map +1 -0
  197. package/dist/earning/reconcile.d.ts +37 -0
  198. package/dist/earning/reconcile.js +216 -0
  199. package/dist/earning/reconcile.js.map +1 -0
  200. package/dist/earning/safe-adapter.d.ts +70 -0
  201. package/dist/earning/safe-adapter.js +228 -0
  202. package/dist/earning/safe-adapter.js.map +1 -0
  203. package/dist/earning/stolas-claim.d.ts +47 -0
  204. package/dist/earning/stolas-claim.js +115 -0
  205. package/dist/earning/stolas-claim.js.map +1 -0
  206. package/dist/earning/store.d.ts +36 -0
  207. package/dist/earning/store.js +156 -0
  208. package/dist/earning/store.js.map +1 -0
  209. package/dist/earning/types.d.ts +123 -0
  210. package/dist/earning/types.js +64 -0
  211. package/dist/earning/types.js.map +1 -0
  212. package/dist/earning/viem-clients.d.ts +9 -0
  213. package/dist/earning/viem-clients.js +22 -0
  214. package/dist/earning/viem-clients.js.map +1 -0
  215. package/dist/earning/wallet.d.ts +20 -0
  216. package/dist/earning/wallet.js +103 -0
  217. package/dist/earning/wallet.js.map +1 -0
  218. package/dist/errors/envelope.d.ts +41 -0
  219. package/dist/errors/envelope.js +48 -0
  220. package/dist/errors/envelope.js.map +1 -0
  221. package/dist/index.d.ts +14 -0
  222. package/dist/index.js +17 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/main.d.ts +32 -0
  225. package/dist/main.js +281 -0
  226. package/dist/main.js.map +1 -0
  227. package/dist/mcp/server.d.ts +14 -0
  228. package/dist/mcp/server.js +205 -0
  229. package/dist/mcp/server.js.map +1 -0
  230. package/dist/operator-errors.d.ts +16 -0
  231. package/dist/operator-errors.js +88 -0
  232. package/dist/operator-errors.js.map +1 -0
  233. package/dist/preflight/claude-binary.d.ts +19 -0
  234. package/dist/preflight/claude-binary.js +44 -0
  235. package/dist/preflight/claude-binary.js.map +1 -0
  236. package/dist/preflight/claude-invocation-envelope.d.ts +11 -0
  237. package/dist/preflight/claude-invocation-envelope.js +67 -0
  238. package/dist/preflight/claude-invocation-envelope.js.map +1 -0
  239. package/dist/runner/claude.d.ts +15 -0
  240. package/dist/runner/claude.js +193 -0
  241. package/dist/runner/claude.js.map +1 -0
  242. package/dist/runner/runner.d.ts +11 -0
  243. package/dist/runner/runner.js +2 -0
  244. package/dist/runner/runner.js.map +1 -0
  245. package/dist/runner/simple.d.ts +8 -0
  246. package/dist/runner/simple.js +11 -0
  247. package/dist/runner/simple.js.map +1 -0
  248. package/dist/store/store.d.ts +74 -0
  249. package/dist/store/store.js +173 -0
  250. package/dist/store/store.js.map +1 -0
  251. package/dist/tx-retry.d.ts +55 -0
  252. package/dist/tx-retry.js +214 -0
  253. package/dist/tx-retry.js.map +1 -0
  254. package/dist/types/desired-state.d.ts +41 -0
  255. package/dist/types/desired-state.js +16 -0
  256. package/dist/types/desired-state.js.map +1 -0
  257. package/dist/types/errors.d.ts +8 -0
  258. package/dist/types/errors.js +17 -0
  259. package/dist/types/errors.js.map +1 -0
  260. package/dist/types/index.d.ts +2 -0
  261. package/dist/types/index.js +3 -0
  262. package/dist/types/index.js.map +1 -0
  263. package/dist/withdraw/args.d.ts +29 -0
  264. package/dist/withdraw/args.js +198 -0
  265. package/dist/withdraw/args.js.map +1 -0
  266. package/dist/withdraw/run-withdraw-plan.d.ts +21 -0
  267. package/dist/withdraw/run-withdraw-plan.js +257 -0
  268. package/dist/withdraw/run-withdraw-plan.js.map +1 -0
  269. package/dist/x402/acquire.d.ts +6 -0
  270. package/dist/x402/acquire.js +32 -0
  271. package/dist/x402/acquire.js.map +1 -0
  272. package/dist/x402/facilitator.d.ts +11 -0
  273. package/dist/x402/facilitator.js +52 -0
  274. package/dist/x402/facilitator.js.map +1 -0
  275. package/dist/x402/handler.d.ts +15 -0
  276. package/dist/x402/handler.js +40 -0
  277. package/dist/x402/handler.js.map +1 -0
  278. package/package.json +72 -0
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Shared helpers for action verbs (verbs that emit transactions).
3
+ *
4
+ * Contract: spec/2026-04-14-client-surface.md §7.3 (dry-run / yes).
5
+ */
6
+ import { buildEnvelope, EXIT_CODES } from '../errors/envelope.js';
7
+ import { emitResult } from './output.js';
8
+ /**
9
+ * Ensure an action is confirmed before proceeding.
10
+ *
11
+ * - Dry run → always permitted, returns true without any check.
12
+ * - `--yes` → permitted regardless of TTY state.
13
+ * - Non-TTY without `--yes` → emits invalid_invocation (exit 11) and returns false.
14
+ * - TTY without `--yes` → v1 never prompts; emits invalid_invocation and returns false.
15
+ */
16
+ export function ensureConfirmed(ctx, flags) {
17
+ if (flags.dryRun)
18
+ return true;
19
+ if (flags.yes)
20
+ return true;
21
+ const envelope = buildEnvelope({
22
+ code: 'invalid_invocation',
23
+ message: 'This action requires explicit confirmation.',
24
+ hint: 'Re-run with --yes to confirm, or --dry-run to see what would happen without executing.',
25
+ exampleCli: 'jinn <verb> --dry-run',
26
+ details: { field: 'confirmation', expected: '--yes or --dry-run' },
27
+ });
28
+ ctx.writer.write(JSON.stringify(envelope) + '\n');
29
+ ctx.exit(EXIT_CODES.invalid_invocation);
30
+ return false;
31
+ }
32
+ /** Emit a dry-run JSON response (success path; no process exit). */
33
+ export function emitDryRun(ctx, payload) {
34
+ const body = {
35
+ schemaVersion: 1,
36
+ generatedAt: new Date().toISOString(),
37
+ dryRun: true,
38
+ ...payload,
39
+ };
40
+ emitResult(body, (v) => {
41
+ const value = v;
42
+ return [
43
+ `Dry run: ${value.verb}`,
44
+ value.description,
45
+ `Planned steps: ${value.plan.length}`,
46
+ JSON.stringify(value.plan, null, 2),
47
+ ].join('\n');
48
+ }, {
49
+ json: ctx.argv.includes('--json'),
50
+ human: ctx.argv.includes('--human'),
51
+ writer: ctx.writer,
52
+ stdoutIsTty: ctx.stdoutIsTty,
53
+ noColor: Boolean(ctx.env['NO_COLOR']),
54
+ });
55
+ }
56
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/cli/action.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,GAAmB,EAAE,KAAmB;IACtE,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,KAAK,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC;QAC7B,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,6CAA6C;QACtD,IAAI,EAAE,wFAAwF;QAC9F,UAAU,EAAE,uBAAuB;QACnC,OAAO,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,oBAAoB,EAAE;KACnE,CAAC,CAAC;IACH,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IAClD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC;AACf,CAAC;AAQD,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,GAAmB,EAAE,OAAsB;IACpE,MAAM,IAAI,GAAG;QACT,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,MAAM,EAAE,IAAI;QACZ,GAAG,OAAO;KACX,CAAC;IACJ,UAAU,CACR,IAAI,EACJ,CAAC,CAAC,EAAE,EAAE;QACJ,MAAM,KAAK,GAAG,CAAqC,CAAC;QACpD,OAAO;YACL,YAAY,KAAK,CAAC,IAAI,EAAE;YACxB,KAAK,CAAC,WAAW;YACjB,kBAAkB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;YACrC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,EACD;QACE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACjC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,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,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Shared types and helpers for jinn CLI command modules.
3
+ *
4
+ * Every command module exports a default `CommandModule` object. The
5
+ * dispatcher in cli/index.ts looks up the verb name, parses flags with
6
+ * `parseArgs`, and calls `run`.
7
+ */
8
+ import { parseArgs, type ParseArgsConfig } from 'node:util';
9
+ export interface CommandContext {
10
+ /** Everything after the verb, e.g. for `jinn bootstrap --json`, this is ['--json']. */
11
+ argv: string[];
12
+ /** Effective stdout TTY state; tests inject false. */
13
+ stdoutIsTty: boolean;
14
+ /** Injected writer for tests; production uses process.stdout. */
15
+ writer: {
16
+ write: (s: string) => boolean;
17
+ };
18
+ /** Injected exit for tests; production uses process.exit. */
19
+ exit: (code: number) => void;
20
+ /** Process environment, for JINN_PASSWORD, JINN_CLAUDE_PATH, etc. */
21
+ env: NodeJS.ProcessEnv;
22
+ }
23
+ export interface CommandModule {
24
+ name: string;
25
+ summary: string;
26
+ helpText: string;
27
+ run(ctx: CommandContext): Promise<void>;
28
+ }
29
+ /**
30
+ * Strongly-typed wrapper around Node's parseArgs. Callers pass the command
31
+ * name and options schema; this returns the parsed values or throws on
32
+ * invalid flags. Callers are responsible for catching and emitting an
33
+ * envelope with code 'invalid_invocation'.
34
+ */
35
+ export declare function parseCommandArgs<T extends ParseArgsConfig['options']>(argv: string[], options: T): ReturnType<typeof parseArgs<{
36
+ options: T;
37
+ allowPositionals: true;
38
+ }>>;
39
+ /**
40
+ * Common flags every verb accepts. Callers spread this into their options.
41
+ */
42
+ export declare const COMMON_FLAGS: {
43
+ json: {
44
+ type: "boolean";
45
+ default: boolean;
46
+ };
47
+ human: {
48
+ type: "boolean";
49
+ default: boolean;
50
+ };
51
+ help: {
52
+ type: "boolean";
53
+ default: boolean;
54
+ };
55
+ config: {
56
+ type: "string";
57
+ };
58
+ /** Parsed value is the fd number as string; read via resolveCliPassword / readPasswordFromFd. */
59
+ 'password-fd': {
60
+ type: "string";
61
+ };
62
+ };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Shared types and helpers for jinn CLI command modules.
3
+ *
4
+ * Every command module exports a default `CommandModule` object. The
5
+ * dispatcher in cli/index.ts looks up the verb name, parses flags with
6
+ * `parseArgs`, and calls `run`.
7
+ */
8
+ import { parseArgs } from 'node:util';
9
+ /**
10
+ * Strongly-typed wrapper around Node's parseArgs. Callers pass the command
11
+ * name and options schema; this returns the parsed values or throws on
12
+ * invalid flags. Callers are responsible for catching and emitting an
13
+ * envelope with code 'invalid_invocation'.
14
+ */
15
+ export function parseCommandArgs(argv, options) {
16
+ return parseArgs({ args: argv, options, allowPositionals: true });
17
+ }
18
+ /**
19
+ * Common flags every verb accepts. Callers spread this into their options.
20
+ */
21
+ export const COMMON_FLAGS = {
22
+ json: { type: 'boolean', default: false },
23
+ human: { type: 'boolean', default: false },
24
+ help: { type: 'boolean', default: false },
25
+ config: { type: 'string' },
26
+ /** Parsed value is the fd number as string; read via resolveCliPassword / readPasswordFromFd. */
27
+ 'password-fd': { type: 'string' },
28
+ };
29
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/cli/command.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAwB,MAAM,WAAW,CAAC;AAsB5D;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAc,EACd,OAAU;IAEV,OAAO,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,OAAO,EAAE,KAAK,EAAE;IAClD,KAAK,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,OAAO,EAAE,KAAK,EAAE;IACnD,IAAI,EAAE,EAAE,IAAI,EAAE,SAAkB,EAAE,OAAO,EAAE,KAAK,EAAE;IAClD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE;IACnC,iGAAiG;IACjG,aAAa,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE;CAC3C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CommandModule } from '../command.js';
2
+ declare const command: CommandModule;
3
+ export default command;
@@ -0,0 +1,46 @@
1
+ import { COMMON_FLAGS, parseCommandArgs } from '../command.js';
2
+ import { emitResult } from '../output.js';
3
+ import { emitEnvelope } from '../../errors/envelope.js';
4
+ import { gatherIntrospectionRaw } from '../introspection-context.js';
5
+ import { assembleBalanceV1 } from '../../api/balance-build.js';
6
+ async function run(ctx) {
7
+ let parsed;
8
+ try {
9
+ parsed = parseCommandArgs(ctx.argv, { ...COMMON_FLAGS });
10
+ }
11
+ catch (err) {
12
+ emitEnvelope({
13
+ code: 'invalid_invocation',
14
+ message: err instanceof Error ? err.message : String(err),
15
+ exampleCli: 'jinn balance',
16
+ details: { field: 'flags' },
17
+ }, { writer: ctx.writer, exit: ctx.exit });
18
+ return;
19
+ }
20
+ const raw = await gatherIntrospectionRaw({ argv: ctx.argv });
21
+ const payload = assembleBalanceV1(raw);
22
+ emitResult(payload, (v) => JSON.stringify(v, null, 2), {
23
+ json: Boolean(parsed.values.json),
24
+ human: Boolean(parsed.values.human),
25
+ writer: ctx.writer,
26
+ stdoutIsTty: ctx.stdoutIsTty,
27
+ noColor: Boolean(ctx.env['NO_COLOR']),
28
+ });
29
+ }
30
+ const command = {
31
+ name: 'balance',
32
+ summary: 'Flat per-wallet balance map across master and service wallets',
33
+ helpText: `Usage: jinn balance [--human]
34
+
35
+ Cheaper than \`jinn fleet\` when the only thing you need is current
36
+ balances. Each wallet is identified by its stable role name
37
+ (master, service.<i>.agent, service.<i>.multisig).
38
+
39
+ Examples:
40
+ jinn balance
41
+ jinn balance --human
42
+ `,
43
+ run,
44
+ };
45
+ export default command;
46
+ //# sourceMappingURL=balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.js","sourceRoot":"","sources":["../../../src/cli/commands/balance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,KAAK,UAAU,GAAG,CAAC,GAAmB;IACpC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC;IAC3D,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,cAAc;YAC1B,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,GAAG,GAAG,MAAM,sBAAsB,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvC,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,SAAS;IACf,OAAO,EAAE,+DAA+D;IACxE,QAAQ,EAAE;;;;;;;;;CASX;IACC,GAAG;CACJ,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CommandModule } from '../command.js';
2
+ declare const command: CommandModule;
3
+ export default command;
@@ -0,0 +1,165 @@
1
+ import { COMMON_FLAGS, parseCommandArgs } from '../command.js';
2
+ import { emitResult } from '../output.js';
3
+ import { emitEnvelope } from '../../errors/envelope.js';
4
+ import { loadConfig } from '../../config.js';
5
+ import { FleetBootstrapper } from '../../earning/bootstrap.js';
6
+ import { resolveCliPassword } from '../password.js';
7
+ /** §6.2 — `stack` only when `JINN_DEBUG=1` (exact string). */
8
+ function envelopeDebug(env) {
9
+ return env['JINN_DEBUG'] === '1';
10
+ }
11
+ function humanBootstrapSuccess(payload) {
12
+ const lines = [`Bootstrap complete.`, `Master: ${payload.master}`];
13
+ if (payload.services.length === 0) {
14
+ lines.push('Services: (none)');
15
+ }
16
+ else {
17
+ lines.push('Services:');
18
+ for (const s of payload.services) {
19
+ const id = s.serviceId != null ? ` (id ${s.serviceId})` : '';
20
+ lines.push(` #${s.index} ${s.step}${id}`);
21
+ }
22
+ }
23
+ return lines.join('\n');
24
+ }
25
+ async function run(ctx) {
26
+ let json = false;
27
+ let human = false;
28
+ let configPath;
29
+ try {
30
+ const parsed = parseCommandArgs(ctx.argv, { ...COMMON_FLAGS });
31
+ json = Boolean(parsed.values.json);
32
+ human = Boolean(parsed.values.human);
33
+ configPath =
34
+ typeof parsed.values.config === 'string' && parsed.values.config.length > 0
35
+ ? parsed.values.config
36
+ : undefined;
37
+ }
38
+ catch (err) {
39
+ const message = err instanceof Error ? err.message : String(err);
40
+ emitEnvelope({
41
+ code: 'invalid_invocation',
42
+ message: 'Invalid command-line arguments.',
43
+ hint: 'Run `jinn bootstrap --help` for supported flags.',
44
+ exampleCli: 'jinn bootstrap --json',
45
+ details: { field: 'argv', expected: message },
46
+ }, { writer: ctx.writer, exit: ctx.exit });
47
+ return;
48
+ }
49
+ const password = resolveCliPassword(ctx.argv, ctx.env);
50
+ if (!password.ok) {
51
+ emitEnvelope({
52
+ code: 'invalid_invocation',
53
+ message: password.message,
54
+ hint: 'Set JINN_PASSWORD or pass --password-fd N, then re-run.',
55
+ exampleCli: 'jinn bootstrap --json',
56
+ details: { field: 'keystore password', expected: 'non-empty string via environment or fd' },
57
+ }, { writer: ctx.writer, exit: ctx.exit });
58
+ return;
59
+ }
60
+ const config = loadConfig(configPath);
61
+ const bootstrapper = new FleetBootstrapper({
62
+ earningDir: config.earningDir,
63
+ chain: config.network === 'testnet' ? 'base-sepolia' : 'base',
64
+ rpcUrl: config.rpcUrl,
65
+ stakingMode: config.stakingMode,
66
+ targetServices: config.targetServices,
67
+ testnetL2DeploymentPath: config.testnetL2DeploymentPath,
68
+ testnetL2TokenDeploymentPath: config.testnetL2TokenDeploymentPath,
69
+ testnetMechDeploymentPath: config.testnetMechDeploymentPath,
70
+ testnetStolasDeploymentPath: config.testnetStolasDeploymentPath,
71
+ debug: config.debug,
72
+ pollIntervalMs: config.pollIntervalMs,
73
+ });
74
+ let result;
75
+ try {
76
+ result = await bootstrapper.bootstrap(password.password);
77
+ }
78
+ catch (err) {
79
+ const cause = err instanceof Error ? err.message : String(err);
80
+ const message = err instanceof Error && err.message.trim().length > 0
81
+ ? err.message
82
+ : 'Bootstrap failed with an unexpected error.';
83
+ const details = { cause };
84
+ if (envelopeDebug(ctx.env) && err instanceof Error && err.stack) {
85
+ details.stack = err.stack;
86
+ }
87
+ emitEnvelope({
88
+ code: 'fatal',
89
+ message,
90
+ details,
91
+ }, { writer: ctx.writer, exit: ctx.exit });
92
+ return;
93
+ }
94
+ if (result.funding) {
95
+ emitEnvelope({
96
+ code: 'funding_required',
97
+ message: result.message,
98
+ hint: 'Fund the listed address and re-run jinn bootstrap.',
99
+ exampleCli: 'jinn fund-requirements --json',
100
+ details: {
101
+ role: 'master',
102
+ address: result.funding.master_address,
103
+ asset: 'native',
104
+ needWei: result.funding.eth_required,
105
+ haveWei: result.funding.eth_balance,
106
+ },
107
+ }, { writer: ctx.writer, exit: ctx.exit });
108
+ return;
109
+ }
110
+ if (!result.ok) {
111
+ emitEnvelope({
112
+ code: 'fatal',
113
+ message: result.message,
114
+ hint: 'Bootstrap failed before the fleet reached a runnable state.',
115
+ details: { cause: result.message },
116
+ }, { writer: ctx.writer, exit: ctx.exit });
117
+ return;
118
+ }
119
+ const state = result.fleet_state;
120
+ const payload = {
121
+ schemaVersion: 1,
122
+ generatedAt: new Date().toISOString(),
123
+ master: state.master_address ?? '',
124
+ services: state.services.map((s) => ({
125
+ index: s.index,
126
+ step: s.step,
127
+ serviceId: s.service_id ?? null,
128
+ })),
129
+ };
130
+ emitResult(payload, (v) => humanBootstrapSuccess(v), {
131
+ json,
132
+ human,
133
+ writer: ctx.writer,
134
+ stdoutIsTty: ctx.stdoutIsTty,
135
+ noColor: Boolean(ctx.env['NO_COLOR']),
136
+ });
137
+ ctx.exit(0);
138
+ }
139
+ const command = {
140
+ name: 'bootstrap',
141
+ summary: 'Advance the fleet state machine toward a running daemon',
142
+ helpText: `Usage: jinn bootstrap [--human] [--config <path>] [--password-fd <fd>]
143
+
144
+ Idempotent. Walks the fleet state machine from wherever it is toward
145
+ a complete, running state. Re-run as many times as needed; the
146
+ machine picks up where it left off. On funding gates, exits 10 with
147
+ a funding_required envelope.
148
+
149
+ Requires the password environment variable required by the client
150
+ (never as a flag).
151
+
152
+ Examples:
153
+ jinn bootstrap
154
+ jinn bootstrap --human
155
+
156
+ Failure example (funding gate):
157
+ $ jinn bootstrap
158
+ {"schemaVersion":1,"code":"funding_required","exitCode":10,...}
159
+ $ echo $?
160
+ 10
161
+ `,
162
+ run,
163
+ };
164
+ export default command;
165
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/cli/commands/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type CommandModule } from '../command.js';
2
+ declare const command: CommandModule;
3
+ export default command;
@@ -0,0 +1,121 @@
1
+ import { parseArgs } from 'node:util';
2
+ import { COMMON_FLAGS } from '../command.js';
3
+ import { emitResult } from '../output.js';
4
+ import { emitEnvelope } from '../../errors/envelope.js';
5
+ import { ensureConfirmed, emitDryRun } from '../action.js';
6
+ import { createCliSignerContext } from '../execution-context.js';
7
+ import { runRewardClaimOnce } from '../../daemon/reward-claim-loop.js';
8
+ import { isRecoverableTransactionError } from '../../tx-retry.js';
9
+ import { TransientError } from '../../types/errors.js';
10
+ async function run(ctx) {
11
+ let parsed;
12
+ try {
13
+ parsed = parseArgs({
14
+ args: ctx.argv,
15
+ options: {
16
+ ...COMMON_FLAGS,
17
+ 'dry-run': { type: 'boolean', default: false },
18
+ yes: { type: 'boolean', default: false },
19
+ },
20
+ allowPositionals: false,
21
+ });
22
+ }
23
+ catch (err) {
24
+ emitEnvelope({
25
+ code: 'invalid_invocation',
26
+ message: err instanceof Error ? err.message : String(err),
27
+ exampleCli: 'jinn claim-rewards --dry-run',
28
+ details: { field: 'flags' },
29
+ }, { writer: ctx.writer, exit: ctx.exit });
30
+ return;
31
+ }
32
+ const dryRun = parsed.values['dry-run'];
33
+ const yes = parsed.values.yes;
34
+ if (dryRun) {
35
+ emitDryRun(ctx, {
36
+ verb: 'claim-rewards',
37
+ description: 'Would call the reward distributor for every staked service',
38
+ plan: [{ action: 'distributor.claim', perServiceTx: true }],
39
+ });
40
+ return;
41
+ }
42
+ if (!ensureConfirmed(ctx, { yes, dryRun: false }))
43
+ return;
44
+ const built = await createCliSignerContext({ argv: ctx.argv, env: ctx.env });
45
+ if (!built.ok) {
46
+ emitEnvelope(built.envelope, { writer: ctx.writer, exit: ctx.exit });
47
+ return;
48
+ }
49
+ const { networkChain, chainConfig, fleetStore, masterWallet, publicClient } = built.ctx;
50
+ try {
51
+ const tick = await runRewardClaimOnce({
52
+ publicClient,
53
+ masterWallet,
54
+ store: fleetStore,
55
+ chain: networkChain,
56
+ distributorAddress: chainConfig.distributorAddress,
57
+ strict: true,
58
+ });
59
+ emitResult({
60
+ schemaVersion: 1,
61
+ generatedAt: new Date().toISOString(),
62
+ verb: 'claim-rewards',
63
+ attempted: tick.attempted,
64
+ submitted: tick.submitted,
65
+ skippedNoPending: tick.skippedNoPending,
66
+ skippedNoDistributor: tick.skippedNoDistributor,
67
+ skippedWrongMode: tick.skippedWrongMode,
68
+ claimAttempted: tick.claimAttempted,
69
+ failedRecoverable: tick.failedRecoverable,
70
+ failedPermanent: tick.failedPermanent,
71
+ }, (v) => {
72
+ const value = v;
73
+ return [
74
+ 'Reward claim tick complete.',
75
+ `Attempted services: ${value.attempted}`,
76
+ `Submitted claims: ${value.submitted}`,
77
+ `Recoverable failures: ${value.failedRecoverable}`,
78
+ `Permanent failures: ${value.failedPermanent}`,
79
+ ].join('\n');
80
+ }, {
81
+ json: Boolean(parsed.values.json),
82
+ human: Boolean(parsed.values.human),
83
+ writer: ctx.writer,
84
+ stdoutIsTty: ctx.stdoutIsTty,
85
+ noColor: Boolean(ctx.env['NO_COLOR']),
86
+ });
87
+ }
88
+ catch (e) {
89
+ if (e instanceof TransientError || isRecoverableTransactionError(e)) {
90
+ emitEnvelope({
91
+ code: 'transient_error',
92
+ message: e instanceof Error ? e.message : String(e),
93
+ hint: 'Retry when the RPC endpoint is healthy.',
94
+ exampleCli: 'jinn claim-rewards --yes',
95
+ details: { cause: e instanceof Error ? e.message : String(e) },
96
+ }, { writer: ctx.writer, exit: ctx.exit });
97
+ return;
98
+ }
99
+ emitEnvelope({
100
+ code: 'fatal',
101
+ message: e instanceof Error ? e.message : String(e),
102
+ details: { cause: e instanceof Error ? e.message : String(e) },
103
+ }, { writer: ctx.writer, exit: ctx.exit });
104
+ }
105
+ }
106
+ const command = {
107
+ name: 'claim-rewards',
108
+ summary: 'Pull pending protocol rewards to the fleet multisigs',
109
+ helpText: `Usage: jinn claim-rewards [--dry-run] [--yes] [--human]
110
+
111
+ Idempotent: zero-delta is success, not error. Second consecutive call
112
+ may show submitted:0 and exits 0.
113
+
114
+ Examples:
115
+ jinn claim-rewards --dry-run
116
+ jinn claim-rewards --yes
117
+ `,
118
+ run,
119
+ };
120
+ export default command;
121
+ //# sourceMappingURL=claim-rewards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-rewards.js","sourceRoot":"","sources":["../../../src/cli/commands/claim-rewards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandModule } from '../command.js';
2
+ declare const command: CommandModule;
3
+ export default command;