@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,103 @@
1
+ /**
2
+ * HD wallet derivation for fleet management.
3
+ *
4
+ * Mnemonic -> derive master (index 0) and agent (index 1+) wallets.
5
+ * Master is the funder, agents are service instances.
6
+ *
7
+ * Derivation path: m/44'/60'/0'/0/{index}
8
+ * Index 0: master wallet (funder)
9
+ * Index 1+: agent wallets (one per service)
10
+ */
11
+ import { Wallet } from '@ethereumjs/wallet';
12
+ import { generateMnemonic as scureGenerateMnemonic, mnemonicToSeedSync, validateMnemonic } from '@scure/bip39';
13
+ import { wordlist } from '@scure/bip39/wordlists/english';
14
+ import { HDKey } from '@scure/bip32';
15
+ import { Buffer } from 'node:buffer';
16
+ import { getAddress, toHex } from 'viem';
17
+ import { privateKeyToAccount } from 'viem/accounts';
18
+ const DERIVATION_PREFIX = "m/44'/60'/0'/0";
19
+ function derivePrivateKeyBytes(mnemonic, index) {
20
+ const seed = mnemonicToSeedSync(mnemonic);
21
+ const root = HDKey.fromMasterSeed(seed);
22
+ const child = root.derive(`${DERIVATION_PREFIX}/${index}`);
23
+ if (!child.privateKey) {
24
+ throw new Error(`Could not derive private key at ${DERIVATION_PREFIX}/${index}`);
25
+ }
26
+ return child.privateKey;
27
+ }
28
+ export function walletPrivateKeyAtIndex(mnemonic, index) {
29
+ return toHex(derivePrivateKeyBytes(mnemonic, index));
30
+ }
31
+ export function generateMnemonic() {
32
+ return scureGenerateMnemonic(wordlist, 128);
33
+ }
34
+ export async function encryptMnemonic(mnemonic, password) {
35
+ if (!validateMnemonic(mnemonic, wordlist)) {
36
+ throw new Error('Internal error: generated mnemonic failed validation');
37
+ }
38
+ const pk = derivePrivateKeyBytes(mnemonic, 0);
39
+ const w = new Wallet(pk);
40
+ const keystore = await w.toV3(password);
41
+ const keystoreJson = JSON.stringify(keystore);
42
+ const pkHex = toHex(pk);
43
+ const account0 = privateKeyToAccount(pkHex);
44
+ const mnemonicBytes = Buffer.from(mnemonic, 'utf-8');
45
+ const keyBytes = Buffer.from(pkHex.slice(2), 'hex');
46
+ const obfuscated = Buffer.alloc(mnemonicBytes.length);
47
+ for (let i = 0; i < mnemonicBytes.length; i++) {
48
+ obfuscated[i] = mnemonicBytes[i] ^ keyBytes[i % keyBytes.length];
49
+ }
50
+ return JSON.stringify({
51
+ version: 1,
52
+ type: 'hd-mnemonic',
53
+ master_address: getAddress(account0.address),
54
+ keystore: JSON.parse(keystoreJson),
55
+ mnemonic_obfuscated: obfuscated.toString('hex'),
56
+ mnemonic_length: mnemonicBytes.length,
57
+ });
58
+ }
59
+ export async function decryptMnemonic(encrypted, password) {
60
+ const data = JSON.parse(encrypted);
61
+ if (data.type !== 'hd-mnemonic') {
62
+ throw new Error(`Unknown keystore type: ${data.type}. Expected 'hd-mnemonic'.`);
63
+ }
64
+ if (!data.keystore) {
65
+ throw new Error('Missing keystore in encrypted payload');
66
+ }
67
+ const w = await Wallet.fromV3(data.keystore, password);
68
+ const pkHex = w.getPrivateKeyString();
69
+ const keyBytes = Buffer.from(pkHex.slice(2), 'hex');
70
+ const obfuscated = Buffer.from(data.mnemonic_obfuscated ?? '', 'hex');
71
+ const mnemonicBytes = Buffer.alloc(data.mnemonic_length ?? 0);
72
+ for (let i = 0; i < mnemonicBytes.length; i++) {
73
+ mnemonicBytes[i] = obfuscated[i] ^ keyBytes[i % keyBytes.length];
74
+ }
75
+ const mnemonic = mnemonicBytes.toString('utf-8');
76
+ if (!validateMnemonic(mnemonic, wordlist)) {
77
+ throw new Error('Mnemonic decryption produced an invalid phrase (wrong password?)');
78
+ }
79
+ const masterAddress = deriveMasterAddress(mnemonic);
80
+ if (getAddress(masterAddress) !== getAddress(data.master_address ?? '')) {
81
+ throw new Error(`Mnemonic decryption verification failed: derived ${masterAddress} but expected ${data.master_address}`);
82
+ }
83
+ return mnemonic;
84
+ }
85
+ export function deriveMasterAddress(mnemonic) {
86
+ return getAddress(privateKeyToAccount(walletPrivateKeyAtIndex(mnemonic, 0)).address);
87
+ }
88
+ export function deriveAgentAddress(mnemonic, index) {
89
+ if (index < 1) {
90
+ throw new Error(`Agent index must be >= 1, got ${index}`);
91
+ }
92
+ return getAddress(privateKeyToAccount(walletPrivateKeyAtIndex(mnemonic, index)).address);
93
+ }
94
+ export function deriveMasterSigner(mnemonic) {
95
+ return privateKeyToAccount(walletPrivateKeyAtIndex(mnemonic, 0));
96
+ }
97
+ export function deriveAgentSigner(mnemonic, index) {
98
+ if (index < 1) {
99
+ throw new Error(`Agent index must be >= 1, got ${index}`);
100
+ }
101
+ return privateKeyToAccount(walletPrivateKeyAtIndex(mnemonic, index));
102
+ }
103
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/earning/wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Error envelope for the Jinn client CLI surface.
3
+ *
4
+ * Contract: spec/2026-04-14-client-surface.md §5 (exit codes) and §6 (envelope).
5
+ * Every non-zero exit from a jinn verb writes one of these objects to stdout
6
+ * (not stderr — stderr is reserved for logs) and then exits with `exitCode`.
7
+ */
8
+ export type ErrorCode = 'funding_required' | 'invalid_invocation' | 'bootstrap_incomplete' | 'reconcile_needed' | 'transient_error' | 'fatal';
9
+ export declare const EXIT_CODES: Record<ErrorCode, number>;
10
+ export interface ErrorEnvelope {
11
+ schemaVersion: 1;
12
+ generatedAt: string;
13
+ code: ErrorCode;
14
+ exitCode: number;
15
+ message: string;
16
+ hint?: string;
17
+ exampleCli?: string;
18
+ details?: Record<string, unknown>;
19
+ }
20
+ export interface BuildEnvelopeInput {
21
+ code: ErrorCode;
22
+ message: string;
23
+ hint?: string;
24
+ exampleCli?: string;
25
+ details?: Record<string, unknown>;
26
+ }
27
+ export declare function buildEnvelope(input: BuildEnvelopeInput): ErrorEnvelope;
28
+ export interface EnvelopeSinks {
29
+ writer?: {
30
+ write: (s: string) => boolean;
31
+ };
32
+ exit?: (code: number) => void;
33
+ }
34
+ /**
35
+ * Build the envelope, write it as a single JSON line to stdout, and exit
36
+ * with its `exitCode`. Injectable sinks exist purely for tests; production
37
+ * callers pass no second argument.
38
+ *
39
+ * This function does not return.
40
+ */
41
+ export declare function emitEnvelope(input: BuildEnvelopeInput, sinks?: EnvelopeSinks): never;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Error envelope for the Jinn client CLI surface.
3
+ *
4
+ * Contract: spec/2026-04-14-client-surface.md §5 (exit codes) and §6 (envelope).
5
+ * Every non-zero exit from a jinn verb writes one of these objects to stdout
6
+ * (not stderr — stderr is reserved for logs) and then exits with `exitCode`.
7
+ */
8
+ export const EXIT_CODES = {
9
+ funding_required: 10,
10
+ invalid_invocation: 11,
11
+ bootstrap_incomplete: 20,
12
+ reconcile_needed: 30,
13
+ transient_error: 40,
14
+ fatal: 50,
15
+ };
16
+ export function buildEnvelope(input) {
17
+ const env = {
18
+ schemaVersion: 1,
19
+ generatedAt: new Date().toISOString(),
20
+ code: input.code,
21
+ exitCode: EXIT_CODES[input.code],
22
+ message: input.message,
23
+ };
24
+ if (input.hint !== undefined)
25
+ env.hint = input.hint;
26
+ if (input.exampleCli !== undefined)
27
+ env.exampleCli = input.exampleCli;
28
+ if (input.details !== undefined)
29
+ env.details = input.details;
30
+ return env;
31
+ }
32
+ /**
33
+ * Build the envelope, write it as a single JSON line to stdout, and exit
34
+ * with its `exitCode`. Injectable sinks exist purely for tests; production
35
+ * callers pass no second argument.
36
+ *
37
+ * This function does not return.
38
+ */
39
+ export function emitEnvelope(input, sinks = {}) {
40
+ const envelope = buildEnvelope(input);
41
+ const writer = sinks.writer ?? process.stdout;
42
+ const exit = sinks.exit ?? ((c) => process.exit(c));
43
+ writer.write(JSON.stringify(envelope) + '\n');
44
+ exit(envelope.exitCode);
45
+ // Unreachable when using real `process.exit`; tests inject a no-op exit.
46
+ return undefined;
47
+ }
48
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/errors/envelope.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,MAAM,CAAC,MAAM,UAAU,GAA8B;IACnD,gBAAgB,EAAE,EAAE;IACpB,kBAAkB,EAAE,EAAE;IACtB,oBAAoB,EAAE,EAAE;IACxB,gBAAgB,EAAE,EAAE;IACpB,eAAe,EAAE,EAAE;IACnB,KAAK,EAAE,EAAE;CACV,CAAC;AAqBF,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,GAAG,GAAkB;QACzB,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QAChC,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;IACF,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACpD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;QAAE,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACtE,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC7D,OAAO,GAAG,CAAC;AACb,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAyB,EAAE,QAAuB,EAAE;IAC/E,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxB,yEAAyE;IACzE,OAAO,SAAkB,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,14 @@
1
+ export { type DesiredState, type RequestId, type RestorationRequest, type RestorationResult, type DeliveredResult } from './types/index.js';
2
+ export { TransientError, PermanentError } from './types/index.js';
3
+ export { type ExecutionAdapter } from './adapters/adapter.js';
4
+ export { LocalAdapter } from './adapters/local/adapter.js';
5
+ export { MechAdapter } from './adapters/mech/adapter.js';
6
+ export { type Runner, type RunnerContext } from './runner/runner.js';
7
+ export { SimpleRunner } from './runner/simple.js';
8
+ export { ClaudeRunner } from './runner/claude.js';
9
+ export { Daemon, type DaemonConfig } from './daemon/daemon.js';
10
+ export { DeliveryWatcherLoop } from './daemon/delivery-watcher.js';
11
+ export { Store } from './store/store.js';
12
+ export { loadConfig, getConfigPathFromArgs, JinnConfigSchema, type JinnConfig } from './config.js';
13
+ export { formatBootstrapOperatorMessage, isJinnDebug, } from './operator-errors.js';
14
+ export { FleetBootstrapper, type FleetBootstrapperOptions } from './earning/bootstrap.js';
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ export { TransientError, PermanentError } from './types/index.js';
2
+ export { LocalAdapter } from './adapters/local/adapter.js';
3
+ export { MechAdapter } from './adapters/mech/adapter.js';
4
+ export { SimpleRunner } from './runner/simple.js';
5
+ export { ClaudeRunner } from './runner/claude.js';
6
+ // Daemon
7
+ export { Daemon } from './daemon/daemon.js';
8
+ export { DeliveryWatcherLoop } from './daemon/delivery-watcher.js';
9
+ // Store
10
+ export { Store } from './store/store.js';
11
+ // Config
12
+ export { loadConfig, getConfigPathFromArgs, JinnConfigSchema } from './config.js';
13
+ // Operator-facing errors
14
+ export { formatBootstrapOperatorMessage, isJinnDebug, } from './operator-errors.js';
15
+ // Earning
16
+ export { FleetBootstrapper } from './earning/bootstrap.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIlE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAIzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,SAAS;AACT,OAAO,EAAE,MAAM,EAAqB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,QAAQ;AACR,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAEnG,yBAAyB;AACzB,OAAO,EACL,8BAA8B,EAC9B,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAE9B,UAAU;AACV,OAAO,EAAE,iBAAiB,EAAiC,MAAM,wBAAwB,CAAC"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * jinn-client production entry point.
4
+ *
5
+ * Bootstraps earning (wallet → Safe → service → staking → mech),
6
+ * then starts the daemon with MechAdapter + ClaudeRunner on Base.
7
+ *
8
+ * Config resolution (highest priority wins):
9
+ * 1. Environment variables (JINN_*, BASE_RPC_URL, BASE_SEPOLIA_RPC_URL)
10
+ * 2. Config file (~/.jinn-client/config.json or --config <path>)
11
+ * 3. Built-in defaults
12
+ *
13
+ * JINN_PASSWORD (env-only) is required for keystore encryption.
14
+ *
15
+ * Canonical operator command:
16
+ * jinn run
17
+ */
18
+ export interface DaemonStartupInfo {
19
+ schemaVersion: 1;
20
+ generatedAt: string;
21
+ kind: 'daemon_started';
22
+ pid: number;
23
+ network: 'testnet' | 'mainnet';
24
+ phase: 'phase-1b' | 'phase-0';
25
+ apiPort: number;
26
+ masterAddress: `0x${string}`;
27
+ safeAddress: `0x${string}`;
28
+ mechAddress: `0x${string}`;
29
+ serviceIndex: number;
30
+ serviceId: number | null;
31
+ }
32
+ export declare function main(): Promise<DaemonStartupInfo>;
package/dist/main.js ADDED
@@ -0,0 +1,281 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * jinn-client production entry point.
4
+ *
5
+ * Bootstraps earning (wallet → Safe → service → staking → mech),
6
+ * then starts the daemon with MechAdapter + ClaudeRunner on Base.
7
+ *
8
+ * Config resolution (highest priority wins):
9
+ * 1. Environment variables (JINN_*, BASE_RPC_URL, BASE_SEPOLIA_RPC_URL)
10
+ * 2. Config file (~/.jinn-client/config.json or --config <path>)
11
+ * 3. Built-in defaults
12
+ *
13
+ * JINN_PASSWORD (env-only) is required for keystore encryption.
14
+ *
15
+ * Canonical operator command:
16
+ * jinn run
17
+ */
18
+ import { config as dotenvConfig } from 'dotenv';
19
+ import { dirname, join } from 'node:path';
20
+ import { fileURLToPath } from 'node:url';
21
+ import { loadConfig, getConfigPathFromArgs } from './config.js';
22
+ import { emitEnvelope } from './errors/envelope.js';
23
+ import { checkClaudeBinary } from './preflight/claude-binary.js';
24
+ import { emitClaudeBinaryPreflightFailure } from './preflight/claude-invocation-envelope.js';
25
+ import { FleetBootstrapper } from './earning/bootstrap.js';
26
+ import { getChainConfig } from './earning/contracts.js';
27
+ import { FleetStateStore } from './earning/store.js';
28
+ import { decryptMnemonic, deriveMasterSigner, walletPrivateKeyAtIndex } from './earning/wallet.js';
29
+ import { MechAdapter } from './adapters/mech/adapter.js';
30
+ import { ClaudeRunner } from './runner/claude.js';
31
+ import { Daemon } from './daemon/daemon.js';
32
+ import { createJinnPublicClient, createJinnWalletClient } from './earning/viem-clients.js';
33
+ dotenvConfig({ path: join(dirname(fileURLToPath(import.meta.url)), '..', '.env') });
34
+ // ── Password (env-only — never in config files) ────────────────────────────
35
+ const PASSWORD = (() => {
36
+ const p = process.env['JINN_PASSWORD'];
37
+ if (!p) {
38
+ console.error('Fatal: JINN_PASSWORD environment variable is required.');
39
+ console.error('This password encrypts your agent keystore.');
40
+ process.exit(1);
41
+ }
42
+ return p;
43
+ })();
44
+ // ── Load config ─────────────────────────────────────────────────────────────
45
+ const config = loadConfig(getConfigPathFromArgs());
46
+ const NETWORK_CHAIN = config.network === 'testnet' ? 'base-sepolia' : 'base';
47
+ const CHAIN_CONFIG = getChainConfig(NETWORK_CHAIN, {
48
+ testnetL2DeploymentPath: config.testnetL2DeploymentPath,
49
+ testnetL2TokenDeploymentPath: config.testnetL2TokenDeploymentPath,
50
+ testnetMechDeploymentPath: config.testnetMechDeploymentPath,
51
+ testnetStolasDeploymentPath: config.testnetStolasDeploymentPath,
52
+ });
53
+ const MARKETPLACE_ADDRESS = CHAIN_CONFIG.mechMarketplace;
54
+ const ROUTER_ADDRESS = (CHAIN_CONFIG.jinnRouter ?? '0xfFa7118A3D820cd4E820010837D65FAfF463181B');
55
+ const STANDARD_SERVICE_PROGRESSION = [
56
+ 'awaiting_stake',
57
+ 'staked',
58
+ 'mech_deployed',
59
+ 'complete',
60
+ ];
61
+ const SELF_BOND_SERVICE_PROGRESSION = [
62
+ 'awaiting_stake',
63
+ 'service_created',
64
+ 'service_activated',
65
+ 'agents_registered',
66
+ 'service_deployed',
67
+ 'service_staked',
68
+ 'mech_deployed',
69
+ 'complete',
70
+ ];
71
+ /** §6.2 `bootstrap_incomplete` — `{ currentStep, nextStep }` from persisted fleet state. */
72
+ function bootstrapIncompleteSteps(state) {
73
+ const progression = state.staking_mode === 'self-bond'
74
+ ? SELF_BOND_SERVICE_PROGRESSION
75
+ : STANDARD_SERVICE_PROGRESSION;
76
+ const byIndex = [...state.services].sort((a, b) => a.index - b.index);
77
+ const focus = byIndex.find(s => s.step === 'complete' && !s.safe_address) ??
78
+ byIndex.find(s => s.step !== 'complete') ??
79
+ byIndex[0];
80
+ if (!focus) {
81
+ return { currentStep: 'awaiting_service', nextStep: 'awaiting_stake' };
82
+ }
83
+ if (focus.step === 'complete' && !focus.safe_address) {
84
+ return { currentStep: 'complete', nextStep: 'bootstrap' };
85
+ }
86
+ const i = progression.indexOf(focus.step);
87
+ if (i === -1) {
88
+ return { currentStep: focus.step, nextStep: 'bootstrap' };
89
+ }
90
+ if (i < progression.length - 1) {
91
+ return { currentStep: focus.step, nextStep: progression[i + 1] };
92
+ }
93
+ return { currentStep: focus.step, nextStep: 'bootstrap' };
94
+ }
95
+ // ── Bootstrap ───────────────────────────────────────────────────────────────
96
+ async function bootstrap() {
97
+ console.log('[main] Running fleet bootstrap...');
98
+ const bootstrapper = new FleetBootstrapper({
99
+ earningDir: config.earningDir,
100
+ chain: NETWORK_CHAIN,
101
+ rpcUrl: config.rpcUrl,
102
+ stakingMode: config.stakingMode,
103
+ targetServices: config.targetServices,
104
+ testnetL2DeploymentPath: config.testnetL2DeploymentPath,
105
+ testnetL2TokenDeploymentPath: config.testnetL2TokenDeploymentPath,
106
+ testnetMechDeploymentPath: config.testnetMechDeploymentPath,
107
+ testnetStolasDeploymentPath: config.testnetStolasDeploymentPath,
108
+ debug: config.debug,
109
+ masterEthDailyEstimateWei: config.masterEthDailyEstimateWei,
110
+ pollIntervalMs: config.pollIntervalMs,
111
+ });
112
+ const result = await bootstrapper.bootstrap(PASSWORD);
113
+ if (result.funding) {
114
+ emitEnvelope({
115
+ code: 'funding_required',
116
+ message: result.message,
117
+ hint: 'Fund the listed address and re-run this command.',
118
+ exampleCli: 'jinn fund-requirements --json',
119
+ details: {
120
+ role: 'master',
121
+ address: result.funding.master_address,
122
+ asset: 'native',
123
+ needWei: result.funding.eth_required,
124
+ haveWei: result.funding.eth_balance,
125
+ },
126
+ });
127
+ }
128
+ if (!result.ok) {
129
+ emitEnvelope({
130
+ code: 'fatal',
131
+ message: result.message,
132
+ hint: 'Bootstrap failed before the fleet reached a runnable state.',
133
+ details: { cause: result.message },
134
+ });
135
+ }
136
+ // Use the first complete service for the daemon
137
+ const state = result.fleet_state;
138
+ const firstComplete = state.services.find(s => s.step === 'complete');
139
+ if (!firstComplete || !firstComplete.safe_address) {
140
+ emitEnvelope({
141
+ code: 'bootstrap_incomplete',
142
+ message: 'Bootstrap completed but no service is ready.',
143
+ hint: 'Re-run to continue the state machine toward a running fleet.',
144
+ exampleCli: 'jinn bootstrap --json',
145
+ details: bootstrapIncompleteSteps(state),
146
+ });
147
+ }
148
+ // Derive agent private key from mnemonic
149
+ const store = new FleetStateStore(config.earningDir);
150
+ const mnemonic = await decryptMnemonic(await store.loadMnemonicKeystore(), PASSWORD);
151
+ const agentPrivateKey = walletPrivateKeyAtIndex(mnemonic, firstComplete.index);
152
+ console.log(`[main] Fleet bootstrap complete.`);
153
+ console.log(` Master: ${state.master_address}`);
154
+ console.log(` Services: ${state.services.filter(s => s.step === 'complete').length}/${config.targetServices}`);
155
+ console.log(` Active: service ${firstComplete.service_id} (agent ${firstComplete.agent_address})`);
156
+ if (firstComplete.mech_address) {
157
+ console.log(` Mech: ${firstComplete.mech_address}`);
158
+ }
159
+ return {
160
+ masterAddress: state.master_address,
161
+ serviceIndex: firstComplete.index,
162
+ serviceId: firstComplete.service_id ?? null,
163
+ agentPrivateKey: agentPrivateKey,
164
+ safeAddress: firstComplete.safe_address,
165
+ mechAddress: firstComplete.mech_address ? firstComplete.mech_address : undefined,
166
+ };
167
+ }
168
+ // ── Main ────────────────────────────────────────────────────────────────────
169
+ export async function main() {
170
+ console.log(`[main] jinn-client starting on ${NETWORK_CHAIN}`);
171
+ const { agentPrivateKey, masterAddress, safeAddress, mechAddress, serviceIndex, serviceId } = await bootstrap();
172
+ if (!mechAddress) {
173
+ emitEnvelope({
174
+ code: 'fatal',
175
+ message: 'Bootstrap completed without a runnable mech deployment.',
176
+ hint: 'Set a valid mech deployment and re-run `jinn run`.',
177
+ exampleCli: 'jinn doctor',
178
+ details: {
179
+ network: config.network,
180
+ expected: 'configured mech deployment with a non-zero mech marketplace address',
181
+ },
182
+ });
183
+ }
184
+ const adapter = new MechAdapter({
185
+ rpcUrl: config.rpcUrl,
186
+ mechMarketplaceAddress: MARKETPLACE_ADDRESS,
187
+ routerAddress: ROUTER_ADDRESS,
188
+ mechContractAddress: mechAddress,
189
+ safeAddress,
190
+ agentEoaPrivateKey: agentPrivateKey,
191
+ ipfsRegistryUrl: config.ipfsRegistryUrl,
192
+ ipfsGatewayUrl: config.ipfsGatewayUrl,
193
+ pollIntervalMs: config.pollIntervalMs,
194
+ chainId: config.network === 'testnet' ? 84532 : 8453,
195
+ routerClaimDeliveryVariant: CHAIN_CONFIG.routerClaimDeliveryVersion,
196
+ });
197
+ const preflight = await checkClaudeBinary(config.claudePath);
198
+ if (!preflight.ok) {
199
+ emitClaudeBinaryPreflightFailure(preflight.detail, config.claudePath);
200
+ }
201
+ const runner = new ClaudeRunner({
202
+ claudePath: config.claudePath,
203
+ model: config.claudeModel,
204
+ });
205
+ const earningStore = new FleetStateStore(config.earningDir);
206
+ const mnemonicForMaster = await decryptMnemonic(await earningStore.loadMnemonicKeystore(), PASSWORD);
207
+ const masterAccount = deriveMasterSigner(mnemonicForMaster);
208
+ const publicClient = createJinnPublicClient(config.rpcUrl, NETWORK_CHAIN);
209
+ const masterWallet = createJinnWalletClient(config.rpcUrl, NETWORK_CHAIN, masterAccount);
210
+ const daemon = new Daemon({
211
+ adapter,
212
+ runner,
213
+ desiredStates: config.desiredStates,
214
+ dbPath: config.dbPath,
215
+ apiPort: config.apiPort,
216
+ peers: config.peers.length > 0 ? config.peers : undefined,
217
+ subgraphUrl: config.subgraphUrl,
218
+ nodeEndpoint: config.nodeEndpoint,
219
+ status: {
220
+ earningDir: config.earningDir,
221
+ rpcUrl: config.rpcUrl,
222
+ network: config.network,
223
+ pollIntervalMs: config.pollIntervalMs,
224
+ masterEthDailyEstimateWei: config.masterEthDailyEstimateWei,
225
+ rewardClaimIntervalMs: config.rewardClaimIntervalMs,
226
+ testnetL2DeploymentPath: config.testnetL2DeploymentPath,
227
+ testnetL2TokenDeploymentPath: config.testnetL2TokenDeploymentPath,
228
+ testnetMechDeploymentPath: config.testnetMechDeploymentPath,
229
+ testnetStolasDeploymentPath: config.testnetStolasDeploymentPath,
230
+ },
231
+ rewardClaim: config.rewardClaimIntervalMs > 0
232
+ ? {
233
+ intervalMs: config.rewardClaimIntervalMs,
234
+ publicClient,
235
+ masterWallet,
236
+ store: earningStore,
237
+ chain: NETWORK_CHAIN,
238
+ distributorAddress: CHAIN_CONFIG.distributorAddress,
239
+ }
240
+ : undefined,
241
+ });
242
+ // Graceful shutdown
243
+ const shutdown = async (signal) => {
244
+ console.log(`\n[main] Received ${signal}, shutting down...`);
245
+ await daemon.stop();
246
+ console.log('[main] Shutdown complete.');
247
+ process.exit(0);
248
+ };
249
+ process.on('SIGINT', () => shutdown('SIGINT'));
250
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
251
+ // Write pidfile so `jinn stop` can find us.
252
+ const pidPath = join(config.earningDir, 'daemon.pid');
253
+ const { writeFileSync, unlinkSync } = await import('node:fs');
254
+ writeFileSync(pidPath, String(process.pid) + '\n', 'utf-8');
255
+ const removePidfile = () => {
256
+ try {
257
+ unlinkSync(pidPath);
258
+ }
259
+ catch {
260
+ /* ignore */
261
+ }
262
+ };
263
+ process.on('exit', removePidfile);
264
+ await daemon.start();
265
+ console.log('[main] Daemon running. Press Ctrl+C to stop.');
266
+ return {
267
+ schemaVersion: 1,
268
+ generatedAt: new Date().toISOString(),
269
+ kind: 'daemon_started',
270
+ pid: process.pid,
271
+ network: config.network,
272
+ phase: config.network === 'testnet' ? 'phase-1b' : 'phase-0',
273
+ apiPort: config.apiPort,
274
+ masterAddress,
275
+ safeAddress,
276
+ mechAddress,
277
+ serviceIndex,
278
+ serviceId,
279
+ };
280
+ }
281
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * MCP server for jinn-client — exposes tools to agent subprocesses.
3
+ *
4
+ * Spawned by ClaudeRunner as a subprocess via StdioServerTransport.
5
+ * Receives context via env vars:
6
+ * DESIRED_STATE_ID — ID of the current desired state
7
+ * DESIRED_STATE_DESCRIPTION — Human-readable description
8
+ * DESIRED_STATE_CONTEXT — JSON context (optional)
9
+ * REQUEST_ID — On-chain request ID
10
+ * RESTORATION_DELIVERY_DATA — JSON delivery data (evaluation requests only)
11
+ *
12
+ * Usage: yarn exec tsx src/mcp/server.ts
13
+ */
14
+ export {};