@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,181 @@
1
+ import { emitResult } from '../output.js';
2
+ import { emitEnvelope } from '../../errors/envelope.js';
3
+ import { ensureConfirmed, emitDryRun } from '../action.js';
4
+ import { gatherIntrospectionRaw } from '../introspection-context.js';
5
+ import { resolveCliPassword } from '../password.js';
6
+ import { loadConfig, getConfigPathFromArgs } from '../../config.js';
7
+ import { parseWithdrawArgv, validateWithdrawArgs, } from '../../withdraw/args.js';
8
+ import { computeSweepWouldSend, runWithdrawPlan, withdrawNeedsInteractiveConfirm, } from '../../withdraw/run-withdraw-plan.js';
9
+ import { decryptMnemonic } from '../../earning/wallet.js';
10
+ import { FleetStateStore } from '../../earning/store.js';
11
+ import { createJinnPublicClient } from '../../earning/viem-clients.js';
12
+ function displayServiceIndex(chainIndex) {
13
+ return Math.max(0, chainIndex - 1);
14
+ }
15
+ async function run(ctx) {
16
+ let parsed;
17
+ try {
18
+ parsed = parseWithdrawArgv(ctx.argv);
19
+ }
20
+ catch (err) {
21
+ emitEnvelope({
22
+ code: 'invalid_invocation',
23
+ message: err instanceof Error ? err.message : String(err),
24
+ exampleCli: 'jinn withdraw --to 0xDEST --dry-run',
25
+ details: { field: 'flags' },
26
+ }, { writer: ctx.writer, exit: ctx.exit });
27
+ return;
28
+ }
29
+ if (parsed.help) {
30
+ ctx.writer.write(`See \`jinn withdraw --help\` in the command module helpText, or \`jinn withdraw --human\` for the readable terminal form.\n`);
31
+ return;
32
+ }
33
+ try {
34
+ validateWithdrawArgs(parsed);
35
+ }
36
+ catch (err) {
37
+ const message = err instanceof Error ? err.message : String(err);
38
+ const details = message.includes('--to') && message.includes('required')
39
+ ? { field: '--to', expected: 'Ethereum address' }
40
+ : { field: 'flags', expected: message };
41
+ emitEnvelope({
42
+ code: 'invalid_invocation',
43
+ message,
44
+ exampleCli: 'jinn withdraw --to 0xDEST --drain-eth --yes',
45
+ details,
46
+ }, { writer: ctx.writer, exit: ctx.exit });
47
+ return;
48
+ }
49
+ const raw = await gatherIntrospectionRaw({ argv: ctx.argv });
50
+ const sweep = [];
51
+ const masterAddr = raw.fleet?.master_address ?? raw.master.address;
52
+ if (masterAddr) {
53
+ sweep.push({
54
+ from: masterAddr,
55
+ role: 'master',
56
+ asset: 'native',
57
+ amountWei: raw.master.balanceWei ?? '0',
58
+ });
59
+ }
60
+ for (const svc of raw.fleet?.services ?? []) {
61
+ const di = displayServiceIndex(svc.index);
62
+ if (svc.agent_address) {
63
+ sweep.push({
64
+ from: svc.agent_address,
65
+ role: `service.${di}.agent`,
66
+ asset: 'native',
67
+ amountWei: '0',
68
+ });
69
+ }
70
+ if (svc.safe_address) {
71
+ sweep.push({
72
+ from: svc.safe_address,
73
+ role: `service.${di}.multisig`,
74
+ asset: 'native',
75
+ amountWei: '0',
76
+ });
77
+ }
78
+ }
79
+ const dryRun = parsed.dryRun;
80
+ const yes = parsed.yes;
81
+ if (dryRun) {
82
+ emitDryRun(ctx, {
83
+ verb: 'withdraw',
84
+ description: `Would run withdraw plan (${sweep.length} wallet hint rows) to ${parsed.to}`,
85
+ plan: sweep.map(s => ({ ...s, to: parsed.to })),
86
+ });
87
+ return;
88
+ }
89
+ if (!ensureConfirmed(ctx, { yes, dryRun: false }))
90
+ return;
91
+ const pw = resolveCliPassword(ctx.argv, ctx.env);
92
+ if (!pw.ok) {
93
+ emitEnvelope({
94
+ code: 'invalid_invocation',
95
+ message: pw.message,
96
+ exampleCli: 'jinn withdraw --to 0xDEST --yes',
97
+ details: { field: 'keystore password' },
98
+ }, { writer: ctx.writer, exit: ctx.exit });
99
+ return;
100
+ }
101
+ const configPath = getConfigPathFromArgs(ctx.argv ?? []) ?? getConfigPathFromArgs(process.argv.slice(2));
102
+ const config = loadConfig(configPath);
103
+ const networkChain = config.network === 'testnet' ? 'base-sepolia' : 'base';
104
+ const publicClient = createJinnPublicClient(config.rpcUrl, networkChain);
105
+ const store = new FleetStateStore(config.earningDir);
106
+ let sweepWouldSend = false;
107
+ try {
108
+ const mnemonic = await decryptMnemonic(await store.loadMnemonicKeystore(), pw.password);
109
+ const fleet = await store.tryLoadExisting();
110
+ const to = parsed.to;
111
+ sweepWouldSend = await computeSweepWouldSend(publicClient, mnemonic, fleet, to, parsed.minSweepWei);
112
+ }
113
+ catch {
114
+ // best-effort; withdraw will surface decrypt errors
115
+ }
116
+ if (withdrawNeedsInteractiveConfirm(parsed, { sweepWouldSend }) && !parsed.yes) {
117
+ emitEnvelope({
118
+ code: 'invalid_invocation',
119
+ message: 'Large or drain-style withdraw requires explicit --yes (non-interactive CLI has no confirmation prompt).',
120
+ exampleCli: 'jinn withdraw --to 0xDEST --drain-eth --yes',
121
+ details: { field: 'confirmation' },
122
+ }, { writer: ctx.writer, exit: ctx.exit });
123
+ return;
124
+ }
125
+ try {
126
+ await runWithdrawPlan({
127
+ password: pw.password,
128
+ config,
129
+ parsed,
130
+ log: () => { },
131
+ warn: (s) => {
132
+ process.stderr.write(s + '\n');
133
+ },
134
+ });
135
+ emitResult({
136
+ schemaVersion: 1,
137
+ generatedAt: new Date().toISOString(),
138
+ verb: 'withdraw',
139
+ to: parsed.to,
140
+ dryRun: false,
141
+ status: 'complete',
142
+ }, (v) => {
143
+ const value = v;
144
+ return `Withdraw plan complete.\nDestination: ${value.to}`;
145
+ }, {
146
+ json: parsed.json,
147
+ human: parsed.human,
148
+ writer: ctx.writer,
149
+ stdoutIsTty: ctx.stdoutIsTty,
150
+ noColor: Boolean(ctx.env['NO_COLOR']),
151
+ });
152
+ }
153
+ catch (e) {
154
+ emitEnvelope({
155
+ code: 'fatal',
156
+ message: e instanceof Error ? e.message : String(e),
157
+ details: { cause: e instanceof Error ? e.message : String(e) },
158
+ }, { writer: ctx.writer, exit: ctx.exit });
159
+ }
160
+ }
161
+ const command = {
162
+ name: 'withdraw',
163
+ summary: 'Sweep master / agents per withdraw flags',
164
+ helpText: `Usage: jinn withdraw --to <address> [amount flags] [--dry-run | --yes] [--human]
165
+
166
+ Supports the same amount flags as the standalone withdraw helper:
167
+ --jinn-amount / --amount / --jinn-wei / --drain-jinn
168
+ --eth-amount / --eth-wei / --drain-eth
169
+ --sweep-agents / --min-sweep-wei / --master-gas-reserve-wei
170
+ --password-fd N
171
+
172
+ Large or drain operations require --yes (no TTY prompt).
173
+
174
+ Examples:
175
+ jinn withdraw --to 0xDEST --dry-run
176
+ jinn withdraw --to 0xDEST --eth-amount 0.01 --yes
177
+ `,
178
+ run,
179
+ };
180
+ export default command;
181
+ //# sourceMappingURL=withdraw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw.js","sourceRoot":"","sources":["../../../src/cli/commands/withdraw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { JinnConfig } from '../config.js';
2
+ export interface DeploymentArtifactRow {
3
+ name: string;
4
+ path: string;
5
+ sha256: string;
6
+ }
7
+ export declare function computeDeploymentDigest(config: JinnConfig): {
8
+ digest: string;
9
+ artifacts: DeploymentArtifactRow[];
10
+ };
@@ -0,0 +1,25 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ export function computeDeploymentDigest(config) {
4
+ const candidates = [
5
+ { name: 'testnetL2', path: config.testnetL2DeploymentPath },
6
+ { name: 'testnetL2Token', path: config.testnetL2TokenDeploymentPath },
7
+ { name: 'testnetMech', path: config.testnetMechDeploymentPath },
8
+ { name: 'testnetStolas', path: config.testnetStolasDeploymentPath },
9
+ ];
10
+ const artifacts = [];
11
+ const pieces = [];
12
+ for (const { name, path } of candidates) {
13
+ if (!path || !existsSync(path))
14
+ continue;
15
+ const raw = readFileSync(path, 'utf8');
16
+ const sha256 = createHash('sha256').update(raw).digest('hex');
17
+ artifacts.push({ name, path, sha256 });
18
+ pieces.push(`${name}:${sha256}`);
19
+ }
20
+ const digest = pieces.length > 0
21
+ ? createHash('sha256').update([...pieces].sort().join('|')).digest('hex')
22
+ : 'unknown';
23
+ return { digest, artifacts };
24
+ }
25
+ //# sourceMappingURL=deployment-digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-digest.js","sourceRoot":"","sources":["../../src/cli/deployment-digest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AASnD,MAAM,UAAU,uBAAuB,CAAC,MAAkB;IAIxD,MAAM,UAAU,GAAsD;QACpE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,uBAAuB,EAAE;QAC3D,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC,4BAA4B,EAAE;QACrE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,yBAAyB,EAAE;QAC/D,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,2BAA2B,EAAE;KACpE,CAAC;IAEF,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACzC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9D,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,GAAG,CAAC;QACf,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACzE,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Shared stack for jinn CLI verbs that need config + keystore + chain + signers (+ optional MechAdapter).
3
+ * Mirrors {@link ../main.ts} bootstrap assumptions.
4
+ */
5
+ import type { PublicClient } from 'viem';
6
+ import type { WalletClient } from 'viem';
7
+ import { type JinnConfig } from '../config.js';
8
+ import { type ChainConfig } from '../earning/contracts.js';
9
+ import { FleetStateStore } from '../earning/store.js';
10
+ import type { FleetState, ServiceState } from '../earning/types.js';
11
+ import { MechAdapter } from '../adapters/mech/adapter.js';
12
+ import { Store } from '../store/store.js';
13
+ import type { BuildEnvelopeInput } from '../errors/envelope.js';
14
+ export type NetworkChain = 'base' | 'base-sepolia';
15
+ export interface CliSignerContext {
16
+ config: JinnConfig;
17
+ networkChain: NetworkChain;
18
+ chainConfig: ChainConfig;
19
+ fleetStore: FleetStateStore;
20
+ mnemonic: string;
21
+ fleetState: FleetState;
22
+ publicClient: PublicClient;
23
+ masterWallet: WalletClient;
24
+ }
25
+ export interface CliExecutionContext extends CliSignerContext {
26
+ jinnStore: Store;
27
+ /** First complete service with Safe + mech (daemon / creator semantics). */
28
+ primaryService: ServiceState;
29
+ adapter: MechAdapter;
30
+ }
31
+ export declare function pickPrimaryMechService(services: ServiceState[]): ServiceState | undefined;
32
+ export type CreateCliExecutionContextOptions = {
33
+ argv?: string[];
34
+ env?: NodeJS.ProcessEnv;
35
+ };
36
+ /** Password + config + mnemonic + master signer + fleet JSON (no MechAdapter). */
37
+ export declare function createCliSignerContext(opts?: CreateCliExecutionContextOptions): Promise<{
38
+ ok: true;
39
+ ctx: CliSignerContext;
40
+ } | {
41
+ ok: false;
42
+ envelope: BuildEnvelopeInput;
43
+ }>;
44
+ export declare function createCliExecutionContext(opts?: CreateCliExecutionContextOptions): Promise<{
45
+ ok: true;
46
+ ctx: CliExecutionContext;
47
+ } | {
48
+ ok: false;
49
+ envelope: BuildEnvelopeInput;
50
+ }>;
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Shared stack for jinn CLI verbs that need config + keystore + chain + signers (+ optional MechAdapter).
3
+ * Mirrors {@link ../main.ts} bootstrap assumptions.
4
+ */
5
+ import { loadConfig, getConfigPathFromArgs } from '../config.js';
6
+ import { getChainConfig } from '../earning/contracts.js';
7
+ import { FleetStateStore } from '../earning/store.js';
8
+ import { decryptMnemonic, deriveMasterSigner, walletPrivateKeyAtIndex } from '../earning/wallet.js';
9
+ import { createJinnPublicClient, createJinnWalletClient } from '../earning/viem-clients.js';
10
+ import { MechAdapter } from '../adapters/mech/adapter.js';
11
+ import { Store } from '../store/store.js';
12
+ import { resolveCliPassword } from './password.js';
13
+ function mergeArgvForConfig(argv) {
14
+ return getConfigPathFromArgs(argv ?? []) ?? getConfigPathFromArgs(process.argv.slice(2));
15
+ }
16
+ export function pickPrimaryMechService(services) {
17
+ return services.find(s => s.step === 'complete' && s.safe_address && s.mech_address);
18
+ }
19
+ async function buildCliSignerContext(opts) {
20
+ const env = opts.env ?? process.env;
21
+ const pw = resolveCliPassword(opts.argv, env);
22
+ if (!pw.ok) {
23
+ return {
24
+ ok: false,
25
+ envelope: {
26
+ code: 'invalid_invocation',
27
+ message: pw.message,
28
+ hint: 'Use JINN_PASSWORD or --password-fd N.',
29
+ exampleCli: 'jinn submit-intent --id x --description "…" --yes',
30
+ details: { field: 'keystore password' },
31
+ },
32
+ };
33
+ }
34
+ const config = loadConfig(mergeArgvForConfig(opts.argv));
35
+ const networkChain = config.network === 'testnet' ? 'base-sepolia' : 'base';
36
+ const chainConfig = getChainConfig(networkChain, {
37
+ testnetL2DeploymentPath: config.testnetL2DeploymentPath,
38
+ testnetL2TokenDeploymentPath: config.testnetL2TokenDeploymentPath,
39
+ testnetMechDeploymentPath: config.testnetMechDeploymentPath,
40
+ testnetStolasDeploymentPath: config.testnetStolasDeploymentPath,
41
+ });
42
+ const fleetStore = new FleetStateStore(config.earningDir);
43
+ if (!fleetStore.hasMnemonicKeystore()) {
44
+ return {
45
+ ok: false,
46
+ envelope: {
47
+ code: 'bootstrap_incomplete',
48
+ message: 'No mnemonic keystore found for this earning directory.',
49
+ hint: 'Run `jinn bootstrap` once to generate the fleet wallet.',
50
+ exampleCli: 'jinn bootstrap --json',
51
+ details: { field: 'master_keystore.json' },
52
+ },
53
+ };
54
+ }
55
+ let mnemonic;
56
+ try {
57
+ mnemonic = await decryptMnemonic(await fleetStore.loadMnemonicKeystore(), pw.password);
58
+ }
59
+ catch (e) {
60
+ const cause = e instanceof Error ? e.message : String(e);
61
+ return {
62
+ ok: false,
63
+ envelope: {
64
+ code: 'invalid_invocation',
65
+ message: 'Failed to decrypt the mnemonic keystore (wrong password?).',
66
+ details: { field: 'JINN_PASSWORD', cause },
67
+ },
68
+ };
69
+ }
70
+ const fleetState = await fleetStore.load(networkChain);
71
+ const publicClient = createJinnPublicClient(config.rpcUrl, networkChain);
72
+ const masterAccount = deriveMasterSigner(mnemonic);
73
+ const masterWallet = createJinnWalletClient(config.rpcUrl, networkChain, masterAccount);
74
+ return {
75
+ ok: true,
76
+ ctx: {
77
+ config,
78
+ networkChain,
79
+ chainConfig,
80
+ fleetStore,
81
+ mnemonic,
82
+ fleetState,
83
+ publicClient,
84
+ masterWallet,
85
+ },
86
+ };
87
+ }
88
+ /** Password + config + mnemonic + master signer + fleet JSON (no MechAdapter). */
89
+ export async function createCliSignerContext(opts = {}) {
90
+ return buildCliSignerContext(opts);
91
+ }
92
+ export async function createCliExecutionContext(opts = {}) {
93
+ const base = await buildCliSignerContext(opts);
94
+ if (!base.ok)
95
+ return base;
96
+ const { config, chainConfig, mnemonic, fleetState, publicClient, masterWallet } = base.ctx;
97
+ const primaryService = pickPrimaryMechService(fleetState.services);
98
+ if (!primaryService?.safe_address || !primaryService.mech_address) {
99
+ return {
100
+ ok: false,
101
+ envelope: {
102
+ code: 'bootstrap_incomplete',
103
+ message: 'No fleet service is complete with both a Safe and a mech address.',
104
+ hint: 'Finish bootstrap through mech deployment, or configure testnet mech artifacts.',
105
+ exampleCli: 'jinn bootstrap --json',
106
+ details: { field: 'fleet' },
107
+ },
108
+ };
109
+ }
110
+ const jinnStore = new Store(config.dbPath);
111
+ const agentEoaPrivateKey = walletPrivateKeyAtIndex(mnemonic, primaryService.index);
112
+ const marketplaceAddress = chainConfig.mechMarketplace;
113
+ const routerAddress = (chainConfig.jinnRouter ??
114
+ '0xfFa7118A3D820cd4E820010837D65FAfF463181B');
115
+ const adapter = new MechAdapter({
116
+ rpcUrl: config.rpcUrl,
117
+ mechMarketplaceAddress: marketplaceAddress,
118
+ routerAddress,
119
+ mechContractAddress: primaryService.mech_address,
120
+ safeAddress: primaryService.safe_address,
121
+ agentEoaPrivateKey: agentEoaPrivateKey,
122
+ ipfsRegistryUrl: config.ipfsRegistryUrl,
123
+ ipfsGatewayUrl: config.ipfsGatewayUrl,
124
+ pollIntervalMs: config.pollIntervalMs,
125
+ chainId: config.network === 'testnet' ? 84532 : 8453,
126
+ routerClaimDeliveryVariant: chainConfig.routerClaimDeliveryVersion,
127
+ }, jinnStore);
128
+ try {
129
+ await adapter.initialize();
130
+ }
131
+ catch (e) {
132
+ const cause = e instanceof Error ? e.message : String(e);
133
+ return {
134
+ ok: false,
135
+ envelope: {
136
+ code: 'transient_error',
137
+ message: `Mech adapter initialization failed (RPC or network): ${cause}`,
138
+ hint: 'Retry after the RPC endpoint is healthy.',
139
+ exampleCli: 'jinn submit-intent --id x --description "…" --dry-run',
140
+ details: { cause },
141
+ },
142
+ };
143
+ }
144
+ return {
145
+ ok: true,
146
+ ctx: {
147
+ ...base.ctx,
148
+ jinnStore,
149
+ primaryService,
150
+ adapter,
151
+ },
152
+ };
153
+ }
154
+ //# sourceMappingURL=execution-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-context.js","sourceRoot":"","sources":["../../src/cli/execution-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandModule } from './command.js';
2
+ export declare function renderTopLevelHelp(commands: CommandModule[]): string;
3
+ export declare function renderCommandHelp(command: CommandModule): string;
@@ -0,0 +1,37 @@
1
+ export function renderTopLevelHelp(commands) {
2
+ const lines = [];
3
+ lines.push('Usage: jinn <verb> [flags...]');
4
+ lines.push('');
5
+ lines.push('Output: operational verbs emit JSON on stdout by default.');
6
+ lines.push('Use `--human` for readable terminal output. Help stays human-readable.');
7
+ lines.push('');
8
+ lines.push('Verbs:');
9
+ const visible = commands.filter(c => c.name !== 'fleet-manage');
10
+ const invocations = visible.map(c => `jinn ${c.name}`);
11
+ const maxInvocationLen = invocations.length > 0 ? Math.max(...invocations.map(s => s.length)) : 1;
12
+ for (const cmd of visible) {
13
+ const invocation = `jinn ${cmd.name}`;
14
+ lines.push(` ${invocation.padEnd(maxInvocationLen)} ${cmd.summary}`);
15
+ }
16
+ lines.push('');
17
+ lines.push('Additional subverbs:');
18
+ lines.push(' fleet scale --to N Grow or shrink the fleet');
19
+ lines.push(' fleet retire <index> Retire one service');
20
+ lines.push('');
21
+ lines.push('Operator map:');
22
+ lines.push(' jinn run Start the daemon or fail with a structured next step');
23
+ lines.push(' jinn doctor Check environment and config readiness');
24
+ lines.push(' jinn fund-requirements Show exact funding gaps');
25
+ lines.push(' jinn status Poll health; use this for monitoring');
26
+ lines.push(' jinn fleet|balance|history|rewards Inspect current state and history');
27
+ lines.push(' jinn submit-intent|claim-rewards Execute protocol actions');
28
+ lines.push(' jinn withdraw|keys backup Move funds or back up the mnemonic');
29
+ lines.push('');
30
+ lines.push('Run `jinn <verb> --help` for verb-specific flags and examples.');
31
+ return lines.join('\n');
32
+ }
33
+ export function renderCommandHelp(command) {
34
+ const label = command.name === 'fleet-manage' ? 'fleet' : command.name;
35
+ return `jinn ${label} — ${command.summary}\n\n${command.helpText}`;
36
+ }
37
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,QAAyB;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IACrF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,gBAAgB,GACpB,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,8FAA8F,CAAC,CAAC;IAC3G,KAAK,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;IAC7F,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IACxF,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;IACzF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAsB;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACvE,OAAO,QAAQ,KAAK,MAAM,OAAO,CAAC,OAAO,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AACrE,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * jinn CLI dispatcher.
3
+ *
4
+ * Contract: spec/2026-04-14-client-surface.md §2 (verbs), §6 (error envelope),
5
+ * §7 (behavioral rules).
6
+ *
7
+ * Adding a verb: create `commands/<name>.ts` exporting a default CommandModule,
8
+ * then import and push into COMMANDS below.
9
+ */
10
+ export interface RunCliOptions {
11
+ writer?: {
12
+ write: (s: string) => boolean;
13
+ };
14
+ exit?: (code: number) => void;
15
+ stdoutIsTty?: boolean;
16
+ }
17
+ export declare function runCli(argv: string[], opts?: RunCliOptions): Promise<void>;
@@ -0,0 +1,132 @@
1
+ /**
2
+ * jinn CLI dispatcher.
3
+ *
4
+ * Contract: spec/2026-04-14-client-surface.md §2 (verbs), §6 (error envelope),
5
+ * §7 (behavioral rules).
6
+ *
7
+ * Adding a verb: create `commands/<name>.ts` exporting a default CommandModule,
8
+ * then import and push into COMMANDS below.
9
+ */
10
+ import { emitEnvelope } from '../errors/envelope.js';
11
+ import { renderTopLevelHelp, renderCommandHelp } from './help.js';
12
+ import { ConfigLoadError } from '../config.js';
13
+ import versionCommand from './commands/version.js';
14
+ import doctorCommand from './commands/doctor.js';
15
+ import initCommand from './commands/init.js';
16
+ import bootstrapCommand from './commands/bootstrap.js';
17
+ import fundRequirementsCommand from './commands/fund-requirements.js';
18
+ import runCommand from './commands/run.js';
19
+ import stopCommand from './commands/stop.js';
20
+ import statusCommand from './commands/status.js';
21
+ import fleetCommand from './commands/fleet.js';
22
+ import balanceCommand from './commands/balance.js';
23
+ import historyCommand from './commands/history.js';
24
+ import rewardsCommand from './commands/rewards.js';
25
+ import logsCommand from './commands/logs.js';
26
+ import fleetManageCommand from './commands/fleet-scale.js';
27
+ import submitIntentCommand from './commands/submit-intent.js';
28
+ import claimRewardsCommand from './commands/claim-rewards.js';
29
+ import withdrawCommand from './commands/withdraw.js';
30
+ import keysCommand from './commands/keys-backup.js';
31
+ const COMMANDS = [
32
+ versionCommand,
33
+ doctorCommand,
34
+ initCommand,
35
+ bootstrapCommand,
36
+ fundRequirementsCommand,
37
+ runCommand,
38
+ stopCommand,
39
+ statusCommand,
40
+ fleetCommand,
41
+ balanceCommand,
42
+ historyCommand,
43
+ rewardsCommand,
44
+ logsCommand,
45
+ fleetManageCommand,
46
+ submitIntentCommand,
47
+ claimRewardsCommand,
48
+ withdrawCommand,
49
+ keysCommand,
50
+ ];
51
+ function publicCommandNames(commands) {
52
+ return commands.filter((c) => c.name !== 'fleet-manage').map((c) => c.name);
53
+ }
54
+ export async function runCli(argv, opts = {}) {
55
+ const writer = opts.writer ?? process.stdout;
56
+ const exit = opts.exit ?? ((c) => { process.exit(c); });
57
+ const stdoutIsTty = opts.stdoutIsTty ?? Boolean(process.stdout.isTTY);
58
+ // No args → top-level help, exit 0.
59
+ if (argv.length === 0) {
60
+ writer.write(renderTopLevelHelp(COMMANDS) + '\n');
61
+ return;
62
+ }
63
+ const [verb, ...rest] = argv;
64
+ const isFleetManage = verb === 'fleet' && rest.length > 0 && !rest[0].startsWith('-');
65
+ // --help at the top level
66
+ if (verb === '--help' || verb === '-h') {
67
+ writer.write(renderTopLevelHelp(COMMANDS) + '\n');
68
+ return;
69
+ }
70
+ const command = isFleetManage
71
+ ? COMMANDS.find((c) => c.name === 'fleet-manage')
72
+ : COMMANDS.find((c) => c.name === verb);
73
+ if (!command) {
74
+ emitEnvelope({
75
+ code: 'invalid_invocation',
76
+ message: `Unknown verb: ${verb}`,
77
+ hint: 'Run `jinn --help` for the list of verbs.',
78
+ exampleCli: 'jinn --help',
79
+ details: {
80
+ field: 'subcommand',
81
+ expected: publicCommandNames(COMMANDS).join('|'),
82
+ },
83
+ }, { writer, exit });
84
+ return;
85
+ }
86
+ const commandArgv = rest;
87
+ const exampleInvocation = isFleetManage ? `jinn fleet ${rest[0]}` : `jinn ${verb}`;
88
+ // Per-verb --help short-circuit (before any command-specific parsing)
89
+ if (commandArgv.includes('--help') || commandArgv.includes('-h')) {
90
+ writer.write(renderCommandHelp(command) + '\n');
91
+ return;
92
+ }
93
+ const ctx = {
94
+ argv: commandArgv,
95
+ stdoutIsTty,
96
+ writer,
97
+ exit,
98
+ env: process.env,
99
+ };
100
+ try {
101
+ await command.run(ctx);
102
+ }
103
+ catch (err) {
104
+ if (err instanceof ConfigLoadError) {
105
+ const details = {
106
+ field: 'config',
107
+ code: err.code,
108
+ ...(err.details ?? {}),
109
+ };
110
+ emitEnvelope({
111
+ code: 'invalid_invocation',
112
+ message: err.message,
113
+ hint: 'Fix the configuration inputs and re-run the command.',
114
+ exampleCli: exampleInvocation,
115
+ details,
116
+ }, { writer, exit });
117
+ return;
118
+ }
119
+ const message = err instanceof Error ? err.message : String(err);
120
+ const details = { cause: message, verb };
121
+ const debug = process.env['JINN_DEBUG'] === '1';
122
+ if (debug && err instanceof Error && err.stack) {
123
+ details.stack = err.stack;
124
+ }
125
+ emitEnvelope({
126
+ code: 'fatal',
127
+ message,
128
+ details,
129
+ }, { writer, exit });
130
+ }
131
+ }
132
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}