@jinn-network/client 0.1.0 → 0.1.1
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.
- package/README.md +46 -9
- package/dist/adapters/mech/adapter.d.ts +1 -0
- package/dist/adapters/mech/adapter.js +35 -0
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/api/gather-status.js +1 -0
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/server.js +12 -0
- package/dist/api/server.js.map +1 -1
- package/dist/api/status-build.d.ts +1 -0
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/status-rollup-build.d.ts +4 -0
- package/dist/api/status-rollup-build.js +4 -0
- package/dist/api/status-rollup-build.js.map +1 -1
- package/dist/bin/jinn-mcp.d.ts +14 -0
- package/dist/bin/jinn-mcp.js +19 -0
- package/dist/bin/jinn-mcp.js.map +1 -0
- package/dist/build-meta.json +1 -1
- package/dist/cli/commands/auth.d.ts +3 -0
- package/dist/cli/commands/auth.js +146 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/bootstrap.js +1 -0
- package/dist/cli/commands/bootstrap.js.map +1 -1
- package/dist/cli/commands/doctor.js +43 -11
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/fund-requirements.js +69 -1
- package/dist/cli/commands/fund-requirements.js.map +1 -1
- package/dist/cli/commands/history.js +1 -0
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/init.js +31 -7
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/keys-backup.js +142 -10
- package/dist/cli/commands/keys-backup.js.map +1 -1
- package/dist/cli/commands/logs.js +28 -13
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/plugin-install.d.ts +3 -0
- package/dist/cli/commands/plugin-install.js +799 -0
- package/dist/cli/commands/plugin-install.js.map +1 -0
- package/dist/cli/commands/quickstart.d.ts +3 -0
- package/dist/cli/commands/quickstart.js +236 -0
- package/dist/cli/commands/quickstart.js.map +1 -0
- package/dist/cli/commands/run.js +6 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/stop.js +1 -0
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/commands/submit-intent.js +11 -1
- package/dist/cli/commands/submit-intent.js.map +1 -1
- package/dist/cli/commands/update.d.ts +3 -0
- package/dist/cli/commands/update.js +154 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/version.js +15 -1
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/deployment-digest.js +20 -4
- package/dist/cli/deployment-digest.js.map +1 -1
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/password.d.ts +15 -0
- package/dist/cli/password.js +29 -1
- package/dist/cli/password.js.map +1 -1
- package/dist/config.d.ts +8 -0
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -1
- package/dist/daemon/balance-topup-loop.d.ts +40 -0
- package/dist/daemon/balance-topup-loop.js +96 -0
- package/dist/daemon/balance-topup-loop.js.map +1 -0
- package/dist/daemon/daemon.d.ts +7 -0
- package/dist/daemon/daemon.js +12 -0
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/dashboard/index.html +500 -0
- package/dist/earning/bootstrap.d.ts +2 -0
- package/dist/earning/bootstrap.js +68 -14
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +17 -0
- package/dist/earning/contracts.js +7 -1
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/faucet.d.ts +15 -0
- package/dist/earning/faucet.js +64 -0
- package/dist/earning/faucet.js.map +1 -0
- package/dist/earning/store.d.ts +5 -0
- package/dist/earning/store.js +7 -3
- package/dist/earning/store.js.map +1 -1
- package/dist/errors/unauthorized-account.d.ts +10 -0
- package/dist/errors/unauthorized-account.js +14 -0
- package/dist/errors/unauthorized-account.js.map +1 -0
- package/dist/main.js +30 -1
- package/dist/main.js.map +1 -1
- package/dist/mcp/operator-server.d.ts +34 -0
- package/dist/mcp/operator-server.js +219 -0
- package/dist/mcp/operator-server.js.map +1 -0
- package/dist/operator-errors.js +11 -0
- package/dist/operator-errors.js.map +1 -1
- package/dist/preflight/claude-auth.d.ts +57 -0
- package/dist/preflight/claude-auth.js +153 -0
- package/dist/preflight/claude-auth.js.map +1 -0
- package/dist/runner/claude.js +15 -0
- package/dist/runner/claude.js.map +1 -1
- package/dist/store/store.js +5 -0
- package/dist/store/store.js.map +1 -1
- package/dist/tx-retry.js +11 -1
- package/dist/tx-retry.js.map +1 -1
- package/package.json +12 -3
- package/skills/jinn-operator/SKILL.md +213 -0
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
|
-
import { isAbsolute
|
|
2
|
+
import { isAbsolute } from 'node:path';
|
|
3
3
|
import { parseArgs } from 'node:util';
|
|
4
4
|
import { COMMON_FLAGS } from '../command.js';
|
|
5
5
|
import { emitResult } from '../output.js';
|
|
6
6
|
import { emitEnvelope } from '../../errors/envelope.js';
|
|
7
7
|
import { checkClaudeBinary } from '../../preflight/claude-binary.js';
|
|
8
|
+
import { detectAuthContext, probeClaudeAuth } from '../../preflight/claude-auth.js';
|
|
8
9
|
import { getConfigPathFromArgs, loadConfig } from '../../config.js';
|
|
9
10
|
import { getChainConfig } from '../../earning/contracts.js';
|
|
11
|
+
import { mnemonicKeystorePath } from '../../earning/store.js';
|
|
10
12
|
async function checkNodeVersion() {
|
|
11
13
|
const version = process.versions.node;
|
|
12
14
|
const major = parseInt(version.split('.')[0], 10);
|
|
@@ -18,19 +20,19 @@ async function checkNodeVersion() {
|
|
|
18
20
|
...(ok ? {} : { remedy: 'Upgrade to Node.js 20 or newer.' }),
|
|
19
21
|
};
|
|
20
22
|
}
|
|
21
|
-
|
|
22
|
-
const keystorePath =
|
|
23
|
+
function checkKeystorePresent(earningDir) {
|
|
24
|
+
const keystorePath = mnemonicKeystorePath(earningDir);
|
|
23
25
|
if (existsSync(keystorePath)) {
|
|
24
26
|
return {
|
|
25
|
-
name: '
|
|
27
|
+
name: 'keystore_present',
|
|
26
28
|
ok: true,
|
|
27
|
-
detail:
|
|
29
|
+
detail: `mnemonic keystore present at ${keystorePath}`,
|
|
28
30
|
};
|
|
29
31
|
}
|
|
30
32
|
return {
|
|
31
|
-
name: '
|
|
32
|
-
ok: true, // Missing is fine before `jinn init`;
|
|
33
|
-
detail: 'no keystore yet
|
|
33
|
+
name: 'keystore_present',
|
|
34
|
+
ok: true, // Missing is fine before `jinn init`; `jinn run` / `bootstrap` will create it.
|
|
35
|
+
detail: 'no keystore yet — run `jinn init` to create one',
|
|
34
36
|
};
|
|
35
37
|
}
|
|
36
38
|
async function checkDeploymentLoaded(config) {
|
|
@@ -83,6 +85,21 @@ function claudeBinaryCheckForDoctor(claudePath, result) {
|
|
|
83
85
|
}),
|
|
84
86
|
};
|
|
85
87
|
}
|
|
88
|
+
async function checkClaudeAuth() {
|
|
89
|
+
const cwd = process.cwd();
|
|
90
|
+
const context = detectAuthContext({ cwd });
|
|
91
|
+
const probe = probeClaudeAuth({ context, cwd });
|
|
92
|
+
return {
|
|
93
|
+
name: 'claude_auth',
|
|
94
|
+
ok: probe.authenticated,
|
|
95
|
+
detail: probe.authenticated
|
|
96
|
+
? `${probe.detail} (${context})`
|
|
97
|
+
: `Not authenticated (${context})`,
|
|
98
|
+
...(probe.authenticated
|
|
99
|
+
? {}
|
|
100
|
+
: { remedy: 'Run `jinn auth` to authenticate Claude.' }),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
86
103
|
async function run(ctx) {
|
|
87
104
|
let parsed;
|
|
88
105
|
try {
|
|
@@ -107,7 +124,8 @@ async function run(ctx) {
|
|
|
107
124
|
checks.push(await checkNodeVersion());
|
|
108
125
|
const claudeResult = await checkClaudeBinary(config.claudePath);
|
|
109
126
|
checks.push(claudeBinaryCheckForDoctor(config.claudePath, claudeResult));
|
|
110
|
-
checks.push(await
|
|
127
|
+
checks.push(await checkClaudeAuth());
|
|
128
|
+
checks.push(checkKeystorePresent(config.earningDir));
|
|
111
129
|
checks.push(await checkDeploymentLoaded(config));
|
|
112
130
|
const blockingCount = checks.filter((c) => !c.ok).length;
|
|
113
131
|
const payload = {
|
|
@@ -117,7 +135,7 @@ async function run(ctx) {
|
|
|
117
135
|
ok: blockingCount === 0,
|
|
118
136
|
blockingCount,
|
|
119
137
|
};
|
|
120
|
-
emitResult(payload, (v) =>
|
|
138
|
+
emitResult(payload, (v) => humanDoctor(v), {
|
|
121
139
|
json: Boolean(parsed.values.json),
|
|
122
140
|
human: Boolean(parsed.values.human),
|
|
123
141
|
writer: ctx.writer,
|
|
@@ -125,6 +143,19 @@ async function run(ctx) {
|
|
|
125
143
|
noColor: Boolean(ctx.env['NO_COLOR']),
|
|
126
144
|
});
|
|
127
145
|
}
|
|
146
|
+
function humanDoctor(payload) {
|
|
147
|
+
const lines = [];
|
|
148
|
+
for (const check of payload.checks) {
|
|
149
|
+
const mark = check.ok ? 'ok ' : 'fail';
|
|
150
|
+
lines.push(`[${mark}] ${check.name}: ${check.detail}`);
|
|
151
|
+
if (check.remedy)
|
|
152
|
+
lines.push(` remedy: ${check.remedy}`);
|
|
153
|
+
}
|
|
154
|
+
lines.push(payload.ok
|
|
155
|
+
? 'Summary: all checks passed.'
|
|
156
|
+
: `Summary: ${payload.blockingCount} blocking check(s) failed.`);
|
|
157
|
+
return lines.join('\n');
|
|
158
|
+
}
|
|
128
159
|
const command = {
|
|
129
160
|
name: 'doctor',
|
|
130
161
|
summary: 'Preflight checks: answers "would jinn run work?" without running it',
|
|
@@ -134,7 +165,8 @@ Runs a set of non-mutating checks against the local environment and
|
|
|
134
165
|
configuration:
|
|
135
166
|
- node_version Node.js >= 20
|
|
136
167
|
- claude_binary claude CLI resolvable on PATH
|
|
137
|
-
-
|
|
168
|
+
- claude_auth Claude CLI authenticated
|
|
169
|
+
- keystore_present mnemonic keystore in configured earning directory (optional)
|
|
138
170
|
- deployment_loaded testnet/mainnet contract addresses resolved
|
|
139
171
|
|
|
140
172
|
By default, emits a machine-readable JSON object with a checks array,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,34 @@
|
|
|
1
|
+
import { createPublicClient, formatUnits, http } from 'viem';
|
|
2
|
+
import { base, baseSepolia } from 'viem/chains';
|
|
1
3
|
import { COMMON_FLAGS, parseCommandArgs } from '../command.js';
|
|
2
4
|
import { emitResult } from '../output.js';
|
|
3
5
|
import { emitEnvelope } from '../../errors/envelope.js';
|
|
4
6
|
import { loadConfig } from '../../config.js';
|
|
5
7
|
import { FleetBootstrapper } from '../../earning/bootstrap.js';
|
|
8
|
+
import { getChainConfig } from '../../earning/contracts.js';
|
|
6
9
|
import { resolveCliPassword } from '../password.js';
|
|
7
10
|
/** §6.2 — `stack` only when `JINN_DEBUG=1` (exact string). */
|
|
8
11
|
function envelopeDebug(env) {
|
|
9
12
|
return env['JINN_DEBUG'] === '1';
|
|
10
13
|
}
|
|
14
|
+
function formatAmount(wei, symbol) {
|
|
15
|
+
try {
|
|
16
|
+
// All three asset roles (native, bond, reward) use 18 decimals in Phase 1b.
|
|
17
|
+
return `${formatUnits(BigInt(wei), 18)} ${symbol}`;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return `${wei} wei (${symbol})`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
11
23
|
function humanFundRequirements(payload) {
|
|
12
24
|
if (payload.satisfied) {
|
|
13
25
|
return 'Funding requirements satisfied. Nothing needed right now.';
|
|
14
26
|
}
|
|
15
27
|
const lines = ['Funding required before bootstrap can advance:'];
|
|
16
28
|
for (const r of payload.requirements) {
|
|
17
|
-
|
|
29
|
+
const need = formatAmount(r.needWei, r.details.tokenSymbol);
|
|
30
|
+
const have = formatAmount(r.haveWei, r.details.tokenSymbol);
|
|
31
|
+
lines.push(`- ${r.role} @ ${r.address}: need ${need}, have ${have}`);
|
|
18
32
|
}
|
|
19
33
|
return lines.join('\n');
|
|
20
34
|
}
|
|
@@ -100,6 +114,60 @@ async function run(ctx) {
|
|
|
100
114
|
details: { tokenAddress: null, tokenSymbol: 'ETH' },
|
|
101
115
|
});
|
|
102
116
|
}
|
|
117
|
+
else {
|
|
118
|
+
// Bootstrap is satisfied. Still probe per-Safe native ETH: the daemon's
|
|
119
|
+
// balance-topup-loop auto-tops from master at runtime, but operators
|
|
120
|
+
// running in tooling contexts (acceptance gate, CI, bare `submit-intent`)
|
|
121
|
+
// hit the mech-fee path before any topup tick fires. A Safe that holds
|
|
122
|
+
// less than the per-service `minSafeEth` threshold will silently fail on
|
|
123
|
+
// `createEvaluationJob`, wrapped as `GS013` at the Safe layer — surface
|
|
124
|
+
// it here so ops see the gap before running.
|
|
125
|
+
const chainKey = config.network === 'testnet' ? 'base-sepolia' : 'base';
|
|
126
|
+
const chainCfg = getChainConfig(chainKey, {
|
|
127
|
+
testnetL2DeploymentPath: config.testnetL2DeploymentPath,
|
|
128
|
+
testnetL2TokenDeploymentPath: config.testnetL2TokenDeploymentPath,
|
|
129
|
+
testnetMechDeploymentPath: config.testnetMechDeploymentPath,
|
|
130
|
+
testnetStolasDeploymentPath: config.testnetStolasDeploymentPath,
|
|
131
|
+
});
|
|
132
|
+
const viemChain = chainKey === 'base' ? base : baseSepolia;
|
|
133
|
+
const publicClient = createPublicClient({
|
|
134
|
+
chain: viemChain,
|
|
135
|
+
transport: http(config.rpcUrl),
|
|
136
|
+
});
|
|
137
|
+
const probeRows = await Promise.all(result.fleet_state.services
|
|
138
|
+
.filter(svc => svc.step === 'complete' && svc.safe_address)
|
|
139
|
+
.map(async (svc) => {
|
|
140
|
+
const address = svc.safe_address;
|
|
141
|
+
try {
|
|
142
|
+
const bal = await publicClient.getBalance({ address: address });
|
|
143
|
+
if (bal >= chainCfg.minSafeEth)
|
|
144
|
+
return null;
|
|
145
|
+
return {
|
|
146
|
+
role: `service_${svc.index}_safe`,
|
|
147
|
+
address,
|
|
148
|
+
asset: 'native',
|
|
149
|
+
haveWei: bal.toString(),
|
|
150
|
+
needWei: (chainCfg.minSafeEth - bal).toString(),
|
|
151
|
+
reason: `Service ${svc.index} Safe needs native ETH to pay mech fees (each evaluation job sends 99 wei). ` +
|
|
152
|
+
`The daemon's balance-topup-loop auto-refills from master at runtime; funding it manually is ` +
|
|
153
|
+
`required only when running CLI verbs (submit-intent, acceptance gate) outside the daemon.`,
|
|
154
|
+
blocks: 'run',
|
|
155
|
+
details: { tokenAddress: null, tokenSymbol: 'ETH' },
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
// Probe failures are not a funding gap on their own; emit a warning
|
|
160
|
+
// so operators can distinguish "Safe OK" from "couldn't tell".
|
|
161
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
162
|
+
process.stderr.write(`[warn] fund-requirements: failed to probe Safe ${address} for service ${svc.index}: ${message}\n`);
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
}));
|
|
166
|
+
for (const row of probeRows) {
|
|
167
|
+
if (row)
|
|
168
|
+
requirements.push(row);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
103
171
|
const payload = {
|
|
104
172
|
schemaVersion: 1,
|
|
105
173
|
generatedAt: new Date().toISOString(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fund-requirements.js","sourceRoot":"","sources":["../../../src/cli/commands/fund-requirements.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fund-requirements.js","sourceRoot":"","sources":["../../../src/cli/commands/fund-requirements.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/cli/commands/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,KAAK,UAAU,GAAG,CAAC,GAAmB;IACpC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE;gBACP,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;gBACxC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;gBACzC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/cli/commands/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,KAAK,UAAU,GAAG,CAAC,GAAmB;IACpC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE;gBACP,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;gBACxC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;gBACzC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC3B;YACD,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACzD,UAAU,EAAE,yBAAyB;YACrC,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,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE;QACrC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAA2B;QAChD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAA4B;KACnD,CAAC,CAAC;IACH,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,8EAA8E;IACvF,QAAQ,EAAE;;;;;;;;;CASX;IACC,GAAG;CACJ,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { parseArgs } from 'node:util';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
+
import { COMMON_FLAGS } from '../command.js';
|
|
3
4
|
import { emitResult } from '../output.js';
|
|
4
5
|
import { emitEnvelope } from '../../errors/envelope.js';
|
|
6
|
+
import { loadConfig, getConfigPathFromArgs } from '../../config.js';
|
|
5
7
|
import { FleetStateStore } from '../../earning/store.js';
|
|
6
8
|
import { generateMnemonic, encryptMnemonic, decryptMnemonic, deriveMasterAddress, } from '../../earning/wallet.js';
|
|
7
9
|
import { resolveCliPassword } from '../password.js';
|
|
@@ -10,11 +12,7 @@ async function run(ctx) {
|
|
|
10
12
|
try {
|
|
11
13
|
parsed = parseArgs({
|
|
12
14
|
args: ctx.argv,
|
|
13
|
-
options: {
|
|
14
|
-
json: { type: 'boolean', default: false },
|
|
15
|
-
human: { type: 'boolean', default: false },
|
|
16
|
-
'password-fd': { type: 'string' },
|
|
17
|
-
},
|
|
15
|
+
options: { ...COMMON_FLAGS },
|
|
18
16
|
allowPositionals: false,
|
|
19
17
|
});
|
|
20
18
|
}
|
|
@@ -37,7 +35,20 @@ async function run(ctx) {
|
|
|
37
35
|
}, { writer: ctx.writer, exit: ctx.exit });
|
|
38
36
|
return;
|
|
39
37
|
}
|
|
40
|
-
const
|
|
38
|
+
const configPath = getConfigPathFromArgs(ctx.argv) ?? getConfigPathFromArgs(process.argv.slice(2));
|
|
39
|
+
let configEarningDir;
|
|
40
|
+
let configNetwork;
|
|
41
|
+
try {
|
|
42
|
+
const cfg = loadConfig(configPath);
|
|
43
|
+
configEarningDir = cfg.earningDir;
|
|
44
|
+
configNetwork = cfg.network;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Config file is optional; fall back to env var / default below.
|
|
48
|
+
}
|
|
49
|
+
const earningDir = ctx.env['JINN_EARNING_DIR'] ??
|
|
50
|
+
configEarningDir ??
|
|
51
|
+
join(process.env['HOME'] ?? '.', '.jinn-client', 'earning');
|
|
41
52
|
const store = new FleetStateStore(earningDir);
|
|
42
53
|
if (!store.hasMnemonicKeystore() && store.hasLegacyKeystore()) {
|
|
43
54
|
await store.migrateLegacyFiles();
|
|
@@ -53,14 +64,27 @@ async function run(ctx) {
|
|
|
53
64
|
await store.saveMnemonicKeystore(keystore);
|
|
54
65
|
masterAddress = deriveMasterAddress(mnemonic);
|
|
55
66
|
}
|
|
67
|
+
// Persist master_address so downstream verbs (fund-requirements,
|
|
68
|
+
// bootstrap) hydrate from the existing wallet instead of rolling a
|
|
69
|
+
// fresh HD mnemonic.
|
|
70
|
+
const network = ctx.env['JINN_NETWORK'] ?? configNetwork ?? 'testnet';
|
|
71
|
+
const chain = network === 'mainnet' ? 'base' : 'base-sepolia';
|
|
72
|
+
await store.patchFleet({ master_address: masterAddress, chain });
|
|
56
73
|
emitResult({
|
|
57
74
|
schemaVersion: 1,
|
|
58
75
|
generatedAt: new Date().toISOString(),
|
|
59
76
|
master: masterAddress,
|
|
60
77
|
keystoreDir: earningDir,
|
|
78
|
+
nextStep: {
|
|
79
|
+
cli: 'jinn fund-requirements',
|
|
80
|
+
purpose: 'List addresses that need funding before bootstrap can advance.',
|
|
81
|
+
},
|
|
61
82
|
}, (v) => {
|
|
62
83
|
const value = v;
|
|
63
|
-
return `Keystore ready.\nMaster: ${value.master}\nDirectory: ${value.keystoreDir}
|
|
84
|
+
return (`Keystore ready.\nMaster: ${value.master}\nDirectory: ${value.keystoreDir}\n` +
|
|
85
|
+
`Next: ${value.nextStep.cli}\n` +
|
|
86
|
+
`Backup: your JINN_PASSWORD and the mnemonic in this keystore are the only way to recover this wallet. ` +
|
|
87
|
+
`Run \`jinn keys backup\` to export the mnemonic.`);
|
|
64
88
|
}, {
|
|
65
89
|
json: Boolean(parsed.values.json),
|
|
66
90
|
human: Boolean(parsed.values.human),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,KAAK,UAAU,GAAG,CAAC,GAAmB;IACpC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,KAAK,UAAU,GAAG,CAAC,GAAmB;IACpC,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,EAAE,GAAG,YAAY,EAAE;YAC5B,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACzD,UAAU,EAAE,6BAA6B;YACzC,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;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,UAAU,EAAE,6BAA6B;YACzC,OAAO,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,wCAAwC,EAAE;SAC5F,EACD,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACvC,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GACd,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,IAAI,gBAAoC,CAAC;IACzC,IAAI,aAAgD,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACnC,gBAAgB,GAAG,GAAG,CAAC,UAAU,CAAC;QAClC,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;IACD,MAAM,UAAU,GACd,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC3B,gBAAgB;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,KAAK,CAAC,iBAAiB,EAAE,EAAE,CAAC;QAC9D,MAAM,KAAK,CAAC,kBAAkB,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,aAAqB,CAAC;IAC1B,IAAI,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,KAAK,CAAC,oBAAoB,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9F,aAAa,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpE,MAAM,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC3C,aAAa,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,iEAAiE;IACjE,mEAAmE;IACnE,qBAAqB;IACrB,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,aAAa,IAAI,SAAS,CAAC;IACtE,MAAM,KAAK,GAA4B,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;IACvF,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;IAEjE,UAAU,CACR;QACE,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,MAAM,EAAE,aAAa;QACrB,WAAW,EAAE,UAAU;QACvB,QAAQ,EAAE;YACR,GAAG,EAAE,wBAAwB;YAC7B,OAAO,EAAE,gEAAgE;SAC1E;KACF,EACD,CAAC,CAAC,EAAE,EAAE;QACJ,MAAM,KAAK,GAAG,CAAuE,CAAC;QACtF,OAAO,CACL,4BAA4B,KAAK,CAAC,MAAM,gBAAgB,KAAK,CAAC,WAAW,IAAI;YAC7E,SAAS,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI;YAC/B,wGAAwG;YACxG,kDAAkD,CACnD,CAAC;IACJ,CAAC,EACD;QACE,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,CACF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAkB;IAC7B,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,6DAA6D;IACtE,QAAQ,EAAE;;;;;;;;;;;;CAYX;IACC,GAAG;CACJ,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { parseArgs } from 'node:util';
|
|
2
|
-
import { writeFileSync } from 'node:fs';
|
|
2
|
+
import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
3
4
|
import { join } from 'node:path';
|
|
5
|
+
import { COMMON_FLAGS } from '../command.js';
|
|
4
6
|
import { emitResult } from '../output.js';
|
|
5
7
|
import { emitEnvelope } from '../../errors/envelope.js';
|
|
6
8
|
import { FleetStateStore } from '../../earning/store.js';
|
|
7
|
-
import { decryptMnemonic } from '../../earning/wallet.js';
|
|
9
|
+
import { decryptMnemonic, encryptMnemonic } from '../../earning/wallet.js';
|
|
10
|
+
import { resolveCurrentPassword, resolveNewPassword } from '../password.js';
|
|
8
11
|
async function runBackup(ctx, rest) {
|
|
9
12
|
let parsed;
|
|
10
13
|
try {
|
|
@@ -14,6 +17,7 @@ async function runBackup(ctx, rest) {
|
|
|
14
17
|
output: { type: 'string' },
|
|
15
18
|
json: { type: 'boolean', default: false },
|
|
16
19
|
human: { type: 'boolean', default: false },
|
|
20
|
+
config: { type: 'string' },
|
|
17
21
|
},
|
|
18
22
|
allowPositionals: false,
|
|
19
23
|
});
|
|
@@ -52,6 +56,7 @@ async function runBackup(ctx, rest) {
|
|
|
52
56
|
const keystore = await store.loadMnemonicKeystore();
|
|
53
57
|
const mnemonic = await decryptMnemonic(keystore, password);
|
|
54
58
|
writeFileSync(output, `${mnemonic}\n`, { encoding: 'utf-8', mode: 0o600 });
|
|
59
|
+
process.stderr.write(`[warn] Mnemonic written in plaintext to ${output} (mode 0600). Treat this file as seed material.\n`);
|
|
55
60
|
emitResult({
|
|
56
61
|
schemaVersion: 1,
|
|
57
62
|
generatedAt: new Date().toISOString(),
|
|
@@ -69,37 +74,164 @@ async function runBackup(ctx, rest) {
|
|
|
69
74
|
noColor: Boolean(ctx.env['NO_COLOR']),
|
|
70
75
|
});
|
|
71
76
|
}
|
|
77
|
+
async function runChangePassword(ctx, rest) {
|
|
78
|
+
let parsed;
|
|
79
|
+
try {
|
|
80
|
+
parsed = parseArgs({
|
|
81
|
+
args: rest,
|
|
82
|
+
options: { ...COMMON_FLAGS },
|
|
83
|
+
allowPositionals: false,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
emitEnvelope({
|
|
88
|
+
code: 'invalid_invocation',
|
|
89
|
+
message: err instanceof Error ? err.message : String(err),
|
|
90
|
+
exampleCli: 'JINN_PASSWORD=old JINN_NEW_PASSWORD=new jinn keys change-password',
|
|
91
|
+
details: { field: 'flags' },
|
|
92
|
+
}, { writer: ctx.writer, exit: ctx.exit });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// 1. Resolve earning dir
|
|
96
|
+
const earningDir = ctx.env['JINN_EARNING_DIR'] ?? join(homedir(), '.jinn-client', 'earning');
|
|
97
|
+
const store = new FleetStateStore(earningDir);
|
|
98
|
+
// 2. Check keystore exists
|
|
99
|
+
if (!store.hasMnemonicKeystore()) {
|
|
100
|
+
emitEnvelope({
|
|
101
|
+
code: 'invalid_invocation',
|
|
102
|
+
message: 'No keystore found. Run `jinn init` first.',
|
|
103
|
+
exampleCli: 'jinn init',
|
|
104
|
+
details: { field: 'keystore' },
|
|
105
|
+
}, { writer: ctx.writer, exit: ctx.exit });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
// 3. Resolve current password
|
|
109
|
+
const current = resolveCurrentPassword(ctx.argv, ctx.env);
|
|
110
|
+
if (!current.ok) {
|
|
111
|
+
emitEnvelope({
|
|
112
|
+
code: 'invalid_invocation',
|
|
113
|
+
message: current.message,
|
|
114
|
+
exampleCli: 'JINN_PASSWORD=old JINN_NEW_PASSWORD=new jinn keys change-password',
|
|
115
|
+
details: { field: 'JINN_PASSWORD' },
|
|
116
|
+
}, { writer: ctx.writer, exit: ctx.exit });
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// 4. Decrypt mnemonic
|
|
120
|
+
let mnemonic;
|
|
121
|
+
try {
|
|
122
|
+
mnemonic = await decryptMnemonic(await store.loadMnemonicKeystore(), current.password);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
emitEnvelope({
|
|
126
|
+
code: 'invalid_invocation',
|
|
127
|
+
message: 'Failed to decrypt keystore. Wrong password?',
|
|
128
|
+
exampleCli: 'JINN_PASSWORD=correct JINN_NEW_PASSWORD=new jinn keys change-password',
|
|
129
|
+
details: { field: 'JINN_PASSWORD' },
|
|
130
|
+
}, { writer: ctx.writer, exit: ctx.exit });
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// 5. Resolve new password
|
|
134
|
+
const newPass = resolveNewPassword(ctx.env);
|
|
135
|
+
if (!newPass.ok) {
|
|
136
|
+
emitEnvelope({
|
|
137
|
+
code: 'invalid_invocation',
|
|
138
|
+
message: newPass.message,
|
|
139
|
+
exampleCli: 'JINN_PASSWORD=old JINN_NEW_PASSWORD=new jinn keys change-password',
|
|
140
|
+
details: { field: 'JINN_NEW_PASSWORD' },
|
|
141
|
+
}, { writer: ctx.writer, exit: ctx.exit });
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// 6. Re-encrypt
|
|
145
|
+
const newKeystore = await encryptMnemonic(mnemonic, newPass.password);
|
|
146
|
+
// 7. Check if daemon is running (read pidfile, process.kill(pid, 0))
|
|
147
|
+
const pidPath = join(earningDir, 'daemon.pid');
|
|
148
|
+
if (existsSync(pidPath)) {
|
|
149
|
+
try {
|
|
150
|
+
const pid = parseInt(readFileSync(pidPath, 'utf-8').trim(), 10);
|
|
151
|
+
process.kill(pid, 0); // Just checks if process exists
|
|
152
|
+
console.error(`[warn] Daemon (pid ${pid}) is running. The new password takes effect on next restart.`);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
/* daemon not running, ignore */
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// 8. Save new keystore
|
|
159
|
+
await store.saveMnemonicKeystore(newKeystore);
|
|
160
|
+
// 9. Delete password file if it exists
|
|
161
|
+
const home = ctx.env['HOME'] ?? homedir();
|
|
162
|
+
const passwordFilePath = join(home, '.jinn-client', 'keystore-password');
|
|
163
|
+
let passwordFileDeleted = false;
|
|
164
|
+
if (existsSync(passwordFilePath)) {
|
|
165
|
+
unlinkSync(passwordFilePath);
|
|
166
|
+
passwordFileDeleted = true;
|
|
167
|
+
}
|
|
168
|
+
// 10. Emit result
|
|
169
|
+
emitResult({
|
|
170
|
+
schemaVersion: 1,
|
|
171
|
+
generatedAt: new Date().toISOString(),
|
|
172
|
+
verb: 'keys change-password',
|
|
173
|
+
keystoreDir: earningDir,
|
|
174
|
+
passwordFileDeleted,
|
|
175
|
+
}, (v) => {
|
|
176
|
+
const val = v;
|
|
177
|
+
return (`Password changed.\nKeystore: ${val.keystoreDir}` +
|
|
178
|
+
(val.passwordFileDeleted ? '\nAuto-generated password file deleted.' : '') +
|
|
179
|
+
'\nSet JINN_PASSWORD for future commands.');
|
|
180
|
+
}, {
|
|
181
|
+
json: Boolean(parsed.values.json),
|
|
182
|
+
human: Boolean(parsed.values.human),
|
|
183
|
+
writer: ctx.writer,
|
|
184
|
+
stdoutIsTty: ctx.stdoutIsTty,
|
|
185
|
+
noColor: Boolean(ctx.env['NO_COLOR']),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
72
188
|
async function run(ctx) {
|
|
73
189
|
const [subverb, ...rest] = ctx.argv;
|
|
74
190
|
if (!subverb) {
|
|
75
191
|
emitEnvelope({
|
|
76
192
|
code: 'invalid_invocation',
|
|
77
|
-
message: 'jinn keys requires a subverb: backup',
|
|
193
|
+
message: 'jinn keys requires a subverb: backup, change-password',
|
|
78
194
|
exampleCli: 'jinn keys backup --output /tmp/mnemonic.txt',
|
|
79
|
-
details: { field: 'subverb', expected: 'backup' },
|
|
195
|
+
details: { field: 'subverb', expected: 'backup | change-password' },
|
|
80
196
|
}, { writer: ctx.writer, exit: ctx.exit });
|
|
81
197
|
return;
|
|
82
198
|
}
|
|
83
199
|
if (subverb === 'backup')
|
|
84
200
|
return runBackup(ctx, rest);
|
|
201
|
+
if (subverb === 'change-password')
|
|
202
|
+
return runChangePassword(ctx, rest);
|
|
85
203
|
emitEnvelope({
|
|
86
204
|
code: 'invalid_invocation',
|
|
87
205
|
message: `Unknown keys subverb: ${subverb}`,
|
|
88
206
|
exampleCli: 'jinn keys backup --output /tmp/mnemonic.txt',
|
|
89
|
-
details: { field: 'subverb', expected: 'backup' },
|
|
207
|
+
details: { field: 'subverb', expected: 'backup | change-password' },
|
|
90
208
|
}, { writer: ctx.writer, exit: ctx.exit });
|
|
91
209
|
}
|
|
92
210
|
const command = {
|
|
93
211
|
name: 'keys',
|
|
94
|
-
summary: 'Keystore management: backup',
|
|
95
|
-
helpText: `Usage:
|
|
212
|
+
summary: 'Keystore management: backup, change-password',
|
|
213
|
+
helpText: `Usage:
|
|
214
|
+
jinn keys backup --output <path> [--human]
|
|
215
|
+
jinn keys change-password [--human]
|
|
216
|
+
|
|
217
|
+
Subverbs:
|
|
218
|
+
backup Decrypt the keystore and write the mnemonic to a file.
|
|
219
|
+
change-password Re-encrypt the keystore with a new password.
|
|
220
|
+
|
|
221
|
+
backup:
|
|
222
|
+
Decrypts the local keystore using JINN_PASSWORD and writes the
|
|
223
|
+
mnemonic to <path> with mode 0600. Idempotent: same mnemonic →
|
|
224
|
+
same output. No other side effects.
|
|
96
225
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
226
|
+
change-password:
|
|
227
|
+
Decrypts the keystore with the current password (from
|
|
228
|
+
~/.jinn-client/keystore-password, JINN_PASSWORD, or --password-fd)
|
|
229
|
+
and re-encrypts it with JINN_NEW_PASSWORD (min 8 characters).
|
|
230
|
+
Deletes the auto-generated password file if present.
|
|
100
231
|
|
|
101
232
|
Examples:
|
|
102
233
|
JINN_PASSWORD=secret jinn keys backup --output ~/backup/jinn.txt
|
|
234
|
+
JINN_PASSWORD=old JINN_NEW_PASSWORD=mynewpass jinn keys change-password
|
|
103
235
|
`,
|
|
104
236
|
run,
|
|
105
237
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys-backup.js","sourceRoot":"","sources":["../../../src/cli/commands/keys-backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"keys-backup.js","sourceRoot":"","sources":["../../../src/cli/commands/keys-backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE5E,KAAK,UAAU,SAAS,CAAC,GAAmB,EAAE,IAAc;IAC1D,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI,EAAE,IAAI;YACV,OAAO,EAAE;gBACP,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;gBACzC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC3B;YACD,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACzD,UAAU,EAAE,6CAA6C;YACzD,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;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAA4B,CAAC;IAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,sBAAsB;YAC/B,UAAU,EAAE,6CAA6C;YACzD,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,0BAA0B,EAAE;SACrE,EACD,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACvC,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,oDAAoD;YAC7D,UAAU,EAAE,+DAA+D;YAC3E,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,EAAE;SAClE,EACD,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACvC,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GACd,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3D,aAAa,CAAC,MAAM,EAAE,GAAG,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2CAA2C,MAAM,mDAAmD,CACrG,CAAC;IAEF,UAAU,CACR;QACE,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,IAAI,EAAE,aAAa;QACnB,MAAM;QACN,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM;KACpC,EACD,CAAC,CAAC,EAAE,EAAE;QACJ,MAAM,KAAK,GAAG,CAAsC,CAAC;QACrD,OAAO,mCAAmC,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,KAAK,EAAE,CAAC;IAClF,CAAC,EACD;QACE,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,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAmB,EAAE,IAAc;IAClE,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,EAAE,GAAG,YAAY,EAAE;YAC5B,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACzD,UAAU,EAAE,mEAAmE;YAC/E,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;IAED,yBAAyB;IACzB,MAAM,UAAU,GACd,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;IAE9C,2BAA2B;IAC3B,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC;QACjC,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,2CAA2C;YACpD,UAAU,EAAE,WAAW;YACvB,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;SAC/B,EACD,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACvC,CAAC;QACF,OAAO;IACT,CAAC;IAED,8BAA8B;IAC9B,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU,EAAE,mEAAmE;YAC/E,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE;SACpC,EACD,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACvC,CAAC;QACF,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,KAAK,CAAC,oBAAoB,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,6CAA6C;YACtD,UAAU,EAAE,uEAAuE;YACnF,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE;SACpC,EACD,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACvC,CAAC;QACF,OAAO;IACT,CAAC;IAED,0BAA0B;IAC1B,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU,EAAE,mEAAmE;YAC/E,OAAO,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE;SACxC,EACD,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACvC,CAAC;QACF,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtE,qEAAqE;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,gCAAgC;YACtD,OAAO,CAAC,KAAK,CACX,sBAAsB,GAAG,8DAA8D,CACxF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,MAAM,KAAK,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAE9C,uCAAuC;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;IAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;IACzE,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAC7B,mBAAmB,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,kBAAkB;IAClB,UAAU,CACR;QACE,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,UAAU;QACvB,mBAAmB;KACpB,EACD,CAAC,CAAC,EAAE,EAAE;QACJ,MAAM,GAAG,GAAG,CAA0D,CAAC;QACvE,OAAO,CACL,gCAAgC,GAAG,CAAC,WAAW,EAAE;YACjD,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,0CAA0C,CAC3C,CAAC;IACJ,CAAC,EACD;QACE,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,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,GAAmB;IACpC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,YAAY,CACV;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,uDAAuD;YAChE,UAAU,EAAE,6CAA6C;YACzD,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,0BAA0B,EAAE;SACpE,EACD,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACvC,CAAC;QACF,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtD,IAAI,OAAO,KAAK,iBAAiB;QAAE,OAAO,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvE,YAAY,CACV;QACE,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,yBAAyB,OAAO,EAAE;QAC3C,UAAU,EAAE,6CAA6C;QACzD,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,0BAA0B,EAAE;KACpE,EACD,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CACvC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAkB;IAC7B,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,8CAA8C;IACvD,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsBX;IACC,GAAG;CACJ,CAAC;AAEF,eAAe,OAAO,CAAC"}
|