@jinn-network/client 0.1.0 → 0.1.1-canary.351ad49e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +123 -0
- package/README.md +202 -26
- package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +15 -0
- package/dist/adapters/claim-registry/abi.d.ts +127 -0
- package/dist/adapters/claim-registry/abi.js +93 -0
- package/dist/adapters/claim-registry/abi.js.map +1 -0
- package/dist/adapters/claim-registry/client.d.ts +89 -0
- package/dist/adapters/claim-registry/client.js +205 -0
- package/dist/adapters/claim-registry/client.js.map +1 -0
- package/dist/adapters/mech/adapter.d.ts +2 -0
- package/dist/adapters/mech/adapter.js +110 -41
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +2 -0
- package/dist/adapters/mech/contracts.js +32 -7
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/ipfs.d.ts +8 -0
- package/dist/adapters/mech/ipfs.js +12 -0
- package/dist/adapters/mech/ipfs.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +20 -46
- package/dist/adapters/mech/types.js +16 -35
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/api/gather-status.js +33 -1
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/portfolio-v0-build.d.ts +81 -0
- package/dist/api/portfolio-v0-build.js +141 -0
- package/dist/api/portfolio-v0-build.js.map +1 -0
- package/dist/api/portfolio-v0-doctor.d.ts +37 -0
- package/dist/api/portfolio-v0-doctor.js +123 -0
- package/dist/api/portfolio-v0-doctor.js.map +1 -0
- package/dist/api/rewards-build.js +1 -1
- package/dist/api/rewards-build.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 +8 -0
- package/dist/api/status-build.js +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 +236 -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 +153 -15
- 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 +149 -15
- 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 +292 -0
- package/dist/cli/commands/quickstart.js.map +1 -0
- package/dist/cli/commands/rewards.js +27 -1
- package/dist/cli/commands/rewards.js.map +1 -1
- 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 +79 -5
- 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 +28 -1
- package/dist/cli/password.js +59 -10
- package/dist/cli/password.js.map +1 -1
- package/dist/config.d.ts +110 -7
- package/dist/config.js +38 -5
- 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 +37 -0
- package/dist/daemon/daemon.js +98 -1
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/dashboard/index.html +500 -0
- package/dist/earning/bootstrap.d.ts +3 -1
- package/dist/earning/bootstrap.js +138 -17
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +24 -0
- package/dist/earning/contracts.js +20 -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/jinn-rewards.d.ts +9 -0
- package/dist/earning/jinn-rewards.js +7 -0
- package/dist/earning/jinn-rewards.js.map +1 -1
- 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 +138 -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 +68 -0
- package/dist/preflight/claude-auth.js +171 -0
- package/dist/preflight/claude-auth.js.map +1 -0
- package/dist/restorer/engine/canonical-json.d.ts +18 -0
- package/dist/restorer/engine/canonical-json.js +59 -0
- package/dist/restorer/engine/canonical-json.js.map +1 -0
- package/dist/restorer/engine/claim.d.ts +69 -0
- package/dist/restorer/engine/claim.js +104 -0
- package/dist/restorer/engine/claim.js.map +1 -0
- package/dist/restorer/engine/delivery.d.ts +52 -0
- package/dist/restorer/engine/delivery.js +63 -0
- package/dist/restorer/engine/delivery.js.map +1 -0
- package/dist/restorer/engine/engine.d.ts +203 -0
- package/dist/restorer/engine/engine.js +658 -0
- package/dist/restorer/engine/engine.js.map +1 -0
- package/dist/restorer/engine/manifest-assembly.d.ts +67 -0
- package/dist/restorer/engine/manifest-assembly.js +79 -0
- package/dist/restorer/engine/manifest-assembly.js.map +1 -0
- package/dist/restorer/engine/packaging.d.ts +87 -0
- package/dist/restorer/engine/packaging.js +350 -0
- package/dist/restorer/engine/packaging.js.map +1 -0
- package/dist/restorer/engine/persistence.d.ts +170 -0
- package/dist/restorer/engine/persistence.js +381 -0
- package/dist/restorer/engine/persistence.js.map +1 -0
- package/dist/restorer/engine/recovery.d.ts +22 -0
- package/dist/restorer/engine/recovery.js +24 -0
- package/dist/restorer/engine/recovery.js.map +1 -0
- package/dist/restorer/engine/registry.d.ts +62 -0
- package/dist/restorer/engine/registry.js +73 -0
- package/dist/restorer/engine/registry.js.map +1 -0
- package/dist/restorer/engine/signing.d.ts +30 -0
- package/dist/restorer/engine/signing.js +39 -0
- package/dist/restorer/engine/signing.js.map +1 -0
- package/dist/restorer/engine/state.d.ts +42 -0
- package/dist/restorer/engine/state.js +87 -0
- package/dist/restorer/engine/state.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.d.ts +64 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js +96 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.d.ts +88 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +560 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +137 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js +865 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.d.ts +74 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js +74 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.d.ts +97 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js +226 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/index.d.ts +43 -0
- package/dist/restorer/impls/claude-mcp-prediction/index.js +230 -0
- package/dist/restorer/impls/claude-mcp-prediction/index.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.d.ts +38 -0
- package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.js +135 -0
- package/dist/restorer/impls/claude-mcp-prediction/mcp-tools.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/prompt.d.ts +8 -0
- package/dist/restorer/impls/claude-mcp-prediction/prompt.js +54 -0
- package/dist/restorer/impls/claude-mcp-prediction/prompt.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.d.ts +36 -0
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js +137 -0
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-prediction/types.d.ts +82 -0
- package/dist/restorer/impls/claude-mcp-prediction/types.js +6 -0
- package/dist/restorer/impls/claude-mcp-prediction/types.js.map +1 -0
- package/dist/restorer/impls/legacy-claude/index.d.ts +42 -0
- package/dist/restorer/impls/legacy-claude/index.js +60 -0
- package/dist/restorer/impls/legacy-claude/index.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.d.ts +68 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js +117 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.d.ts +49 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js +91 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.d.ts +78 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js +274 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.d.ts +23 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js +49 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.d.ts +25 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js +44 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.d.ts +17 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js +43 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.d.ts +43 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js +431 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.d.ts +21 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.js +32 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/score.js.map +1 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.d.ts +32 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.js +8 -0
- package/dist/restorer/impls/portfolio-v0-evaluator/types.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.d.ts +26 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.js +82 -0
- package/dist/restorer/impls/prediction-v0-baseline/index.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-baseline/strategy.d.ts +8 -0
- package/dist/restorer/impls/prediction-v0-baseline/strategy.js +41 -0
- package/dist/restorer/impls/prediction-v0-baseline/strategy.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-baseline/types.d.ts +7 -0
- package/dist/restorer/impls/prediction-v0-baseline/types.js +2 -0
- package/dist/restorer/impls/prediction-v0-baseline/types.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.d.ts +20 -0
- package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js +66 -0
- package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.d.ts +9 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js +23 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.d.ts +3 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js +13 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.d.ts +7 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js +74 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.d.ts +5 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js +20 -0
- package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/index.d.ts +33 -0
- package/dist/restorer/impls/prediction-v0-evaluator/index.js +179 -0
- package/dist/restorer/impls/prediction-v0-evaluator/index.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/score.d.ts +8 -0
- package/dist/restorer/impls/prediction-v0-evaluator/score.js +15 -0
- package/dist/restorer/impls/prediction-v0-evaluator/score.js.map +1 -0
- package/dist/restorer/impls/prediction-v0-evaluator/types.d.ts +7 -0
- package/dist/restorer/impls/prediction-v0-evaluator/types.js +2 -0
- package/dist/restorer/impls/prediction-v0-evaluator/types.js.map +1 -0
- package/dist/restorer/types.d.ts +62 -0
- package/dist/restorer/types.js +7 -0
- package/dist/restorer/types.js.map +1 -0
- package/dist/runner/claude.js +15 -0
- package/dist/runner/claude.js.map +1 -1
- package/dist/store/store.d.ts +3 -1
- package/dist/store/store.js +8 -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/dist/types/desired-state.d.ts +53 -0
- package/dist/types/desired-state.js +20 -0
- package/dist/types/desired-state.js.map +1 -1
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.js +3 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/portfolio.d.ts +1000 -0
- package/dist/types/portfolio.js +168 -0
- package/dist/types/portfolio.js.map +1 -0
- package/dist/types/prediction.d.ts +751 -0
- package/dist/types/prediction.js +128 -0
- package/dist/types/prediction.js.map +1 -0
- package/dist/venues/chainlink/client.d.ts +99 -0
- package/dist/venues/chainlink/client.js +130 -0
- package/dist/venues/chainlink/client.js.map +1 -0
- package/dist/venues/chainlink/feeds.d.ts +8 -0
- package/dist/venues/chainlink/feeds.js +9 -0
- package/dist/venues/chainlink/feeds.js.map +1 -0
- package/dist/venues/hyperliquid/account-value.d.ts +30 -0
- package/dist/venues/hyperliquid/account-value.js +30 -0
- package/dist/venues/hyperliquid/account-value.js.map +1 -0
- package/dist/venues/hyperliquid/client.d.ts +63 -0
- package/dist/venues/hyperliquid/client.js +135 -0
- package/dist/venues/hyperliquid/client.js.map +1 -0
- package/dist/venues/hyperliquid/grid.d.ts +36 -0
- package/dist/venues/hyperliquid/grid.js +61 -0
- package/dist/venues/hyperliquid/grid.js.map +1 -0
- package/dist/venues/hyperliquid/types.d.ts +81 -0
- package/dist/venues/hyperliquid/types.js +8 -0
- package/dist/venues/hyperliquid/types.js.map +1 -0
- package/docker-compose.yml +44 -0
- package/package.json +21 -3
- package/skills/jinn-operator/SKILL.md +213 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { parseArgs } from 'node:util';
|
|
6
|
+
import { createInterface } from 'node:readline';
|
|
7
|
+
import { emitResult } from '../output.js';
|
|
8
|
+
import { emitEnvelope } from '../../errors/envelope.js';
|
|
9
|
+
import { detectAuthContext, probeClaudeAuth, buildLoginCommand, } from '../../preflight/claude-auth.js';
|
|
10
|
+
import { loadConfig } from '../../config.js';
|
|
11
|
+
const CONTEXT_LABELS = {
|
|
12
|
+
container: 'inside this container',
|
|
13
|
+
'docker-compose': 'inside the jinn-daemon Docker container',
|
|
14
|
+
bare: 'on this machine',
|
|
15
|
+
};
|
|
16
|
+
const DEFAULT_CONFIG_PATH = join(homedir(), '.jinn-client', 'config.json');
|
|
17
|
+
/**
|
|
18
|
+
* Persist `runtimeMode` into the operator's config file (default:
|
|
19
|
+
* ~/.jinn-client/config.json). Creates the file if absent; merges into
|
|
20
|
+
* existing JSON otherwise. Preserves any unknown keys.
|
|
21
|
+
*/
|
|
22
|
+
function persistRuntimeMode(mode, configPath = DEFAULT_CONFIG_PATH) {
|
|
23
|
+
let current = {};
|
|
24
|
+
if (existsSync(configPath)) {
|
|
25
|
+
try {
|
|
26
|
+
current = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Malformed existing file — we overwrite rather than merge.
|
|
30
|
+
current = {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
current['runtimeMode'] = mode;
|
|
34
|
+
writeFileSync(configPath, JSON.stringify(current, null, 2) + '\n', { encoding: 'utf-8' });
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Interactively prompt the operator for their runtime mode. Uses readline
|
|
38
|
+
* so stdin can be a real TTY. Returns the chosen mode or null if the
|
|
39
|
+
* operator aborts / answers blank.
|
|
40
|
+
*/
|
|
41
|
+
async function promptRuntimeMode() {
|
|
42
|
+
process.stderr.write('\nHow do you want to run the Jinn daemon?\n');
|
|
43
|
+
process.stderr.write(' 1) bare — Node directly on host (simplest; Claude auth lives on this machine)\n');
|
|
44
|
+
process.stderr.write(' 2) docker-compose — long-lived operator via the bundled compose file\n');
|
|
45
|
+
process.stderr.write(' 3) container — I run the Jinn image in my own orchestrator\n\n');
|
|
46
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr, terminal: true });
|
|
47
|
+
try {
|
|
48
|
+
const answer = await new Promise((resolve) => {
|
|
49
|
+
rl.question('Choose [1-3, default=1]: ', (a) => resolve(a.trim()));
|
|
50
|
+
});
|
|
51
|
+
if (answer === '' || answer === '1' || answer.toLowerCase() === 'bare')
|
|
52
|
+
return 'bare';
|
|
53
|
+
if (answer === '2' || answer.toLowerCase() === 'docker-compose')
|
|
54
|
+
return 'docker-compose';
|
|
55
|
+
if (answer === '3' || answer.toLowerCase() === 'container')
|
|
56
|
+
return 'container';
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
rl.close();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function run(ctx) {
|
|
64
|
+
let parsed;
|
|
65
|
+
try {
|
|
66
|
+
parsed = parseArgs({
|
|
67
|
+
args: ctx.argv,
|
|
68
|
+
options: {
|
|
69
|
+
json: { type: 'boolean' },
|
|
70
|
+
human: { type: 'boolean' },
|
|
71
|
+
mode: { type: 'string' },
|
|
72
|
+
config: { type: 'string' },
|
|
73
|
+
},
|
|
74
|
+
allowPositionals: false,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
emitEnvelope({
|
|
79
|
+
code: 'invalid_invocation',
|
|
80
|
+
message: err instanceof Error ? err.message : String(err),
|
|
81
|
+
exampleCli: 'jinn auth',
|
|
82
|
+
details: { field: 'flags' },
|
|
83
|
+
}, { writer: ctx.writer, exit: ctx.exit });
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const cwd = process.cwd();
|
|
87
|
+
const configPath = typeof parsed.values.config === 'string' && parsed.values.config.length > 0
|
|
88
|
+
? parsed.values.config
|
|
89
|
+
: undefined;
|
|
90
|
+
const config = loadConfig(configPath);
|
|
91
|
+
// ── Resolve runtime mode ─────────────────────────────────────────────────
|
|
92
|
+
// Order: --mode flag > config.runtimeMode > (interactive prompt if TTY)
|
|
93
|
+
// > filesystem-based auto-detect (legacy fallback).
|
|
94
|
+
let runtimeMode;
|
|
95
|
+
const modeFlag = typeof parsed.values.mode === 'string' ? parsed.values.mode : undefined;
|
|
96
|
+
if (modeFlag) {
|
|
97
|
+
if (modeFlag !== 'bare' && modeFlag !== 'docker-compose' && modeFlag !== 'container') {
|
|
98
|
+
emitEnvelope({
|
|
99
|
+
code: 'invalid_invocation',
|
|
100
|
+
message: `--mode must be one of bare, docker-compose, container (got ${modeFlag})`,
|
|
101
|
+
exampleCli: 'jinn auth --mode bare',
|
|
102
|
+
details: { field: 'mode' },
|
|
103
|
+
}, { writer: ctx.writer, exit: ctx.exit });
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
runtimeMode = modeFlag;
|
|
107
|
+
persistRuntimeMode(runtimeMode, configPath ?? DEFAULT_CONFIG_PATH);
|
|
108
|
+
process.stderr.write(`[auth] runtime mode set to '${runtimeMode}' (persisted to config).\n`);
|
|
109
|
+
}
|
|
110
|
+
else if (config.runtimeMode) {
|
|
111
|
+
runtimeMode = config.runtimeMode;
|
|
112
|
+
}
|
|
113
|
+
else if (ctx.stdoutIsTty) {
|
|
114
|
+
const picked = await promptRuntimeMode();
|
|
115
|
+
if (picked !== null) {
|
|
116
|
+
runtimeMode = picked;
|
|
117
|
+
persistRuntimeMode(runtimeMode, configPath ?? DEFAULT_CONFIG_PATH);
|
|
118
|
+
process.stderr.write(`[auth] runtime mode set to '${runtimeMode}' (persisted).\n\n`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// If still unset (non-TTY, no flag, no config), fall through to filesystem detection below.
|
|
122
|
+
const context = detectAuthContext({ cwd, configuredMode: runtimeMode });
|
|
123
|
+
const probe = probeClaudeAuth({ context, cwd });
|
|
124
|
+
if (probe.authenticated) {
|
|
125
|
+
const payload = {
|
|
126
|
+
schemaVersion: 1,
|
|
127
|
+
generatedAt: new Date().toISOString(),
|
|
128
|
+
authenticated: true,
|
|
129
|
+
context,
|
|
130
|
+
detail: probe.detail,
|
|
131
|
+
...(probe.email !== undefined ? { email: probe.email } : {}),
|
|
132
|
+
};
|
|
133
|
+
emitResult(payload, (v) => JSON.stringify(v, null, 2), {
|
|
134
|
+
json: Boolean(parsed.values.json),
|
|
135
|
+
human: Boolean(parsed.values.human),
|
|
136
|
+
writer: ctx.writer,
|
|
137
|
+
stdoutIsTty: ctx.stdoutIsTty,
|
|
138
|
+
noColor: Boolean(ctx.env['NO_COLOR']),
|
|
139
|
+
});
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Not authenticated
|
|
143
|
+
if (!ctx.stdoutIsTty) {
|
|
144
|
+
const contextLabel = CONTEXT_LABELS[context] ?? context;
|
|
145
|
+
emitEnvelope({
|
|
146
|
+
code: 'invalid_invocation',
|
|
147
|
+
message: `Claude is not authenticated ${contextLabel}. Run \`jinn auth\` in a TTY to log in.`,
|
|
148
|
+
exampleCli: 'jinn auth',
|
|
149
|
+
details: { field: 'auth', context },
|
|
150
|
+
}, { writer: ctx.writer, exit: ctx.exit });
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
// TTY — prompt and run interactive login
|
|
154
|
+
const contextLabel = CONTEXT_LABELS[context] ?? context;
|
|
155
|
+
process.stderr.write(`Claude is not authenticated ${contextLabel}. Starting login…\n`);
|
|
156
|
+
if (context === 'docker-compose') {
|
|
157
|
+
process.stderr.write('A browser URL will appear in the output below. Open it to complete authentication.\n');
|
|
158
|
+
}
|
|
159
|
+
const { command, args } = buildLoginCommand(context, cwd);
|
|
160
|
+
const result = spawnSync(command, args, { stdio: 'inherit' });
|
|
161
|
+
if (result.status !== 0) {
|
|
162
|
+
emitEnvelope({
|
|
163
|
+
code: 'fatal',
|
|
164
|
+
message: `Login command exited with code ${result.status ?? 'null'}.`,
|
|
165
|
+
exampleCli: 'jinn auth',
|
|
166
|
+
details: { context },
|
|
167
|
+
}, { writer: ctx.writer, exit: ctx.exit });
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
// Re-probe to verify
|
|
171
|
+
const reProbe = probeClaudeAuth({ context, cwd });
|
|
172
|
+
if (reProbe.authenticated) {
|
|
173
|
+
const payload = {
|
|
174
|
+
schemaVersion: 1,
|
|
175
|
+
generatedAt: new Date().toISOString(),
|
|
176
|
+
authenticated: true,
|
|
177
|
+
context,
|
|
178
|
+
detail: reProbe.detail,
|
|
179
|
+
...(reProbe.email !== undefined ? { email: reProbe.email } : {}),
|
|
180
|
+
};
|
|
181
|
+
emitResult(payload, (v) => JSON.stringify(v, null, 2), {
|
|
182
|
+
json: Boolean(parsed.values.json),
|
|
183
|
+
human: Boolean(parsed.values.human),
|
|
184
|
+
writer: ctx.writer,
|
|
185
|
+
stdoutIsTty: ctx.stdoutIsTty,
|
|
186
|
+
noColor: Boolean(ctx.env['NO_COLOR']),
|
|
187
|
+
});
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
emitEnvelope({
|
|
191
|
+
code: 'fatal',
|
|
192
|
+
message: 'Login completed but Claude is still not authenticated. Try running `jinn auth` again.',
|
|
193
|
+
exampleCli: 'jinn auth',
|
|
194
|
+
details: { context },
|
|
195
|
+
}, { writer: ctx.writer, exit: ctx.exit });
|
|
196
|
+
}
|
|
197
|
+
const command = {
|
|
198
|
+
name: 'auth',
|
|
199
|
+
summary: 'Check Claude authentication and persist how the operator runs the daemon',
|
|
200
|
+
helpText: `Usage: jinn auth [--mode <bare|docker-compose|container>] [--human] [--json] [--config <path>]
|
|
201
|
+
|
|
202
|
+
Two concerns in one command:
|
|
203
|
+
|
|
204
|
+
1. Runtime mode — how the operator wants to run the daemon. Persisted to
|
|
205
|
+
config once (so downstream commands don't re-detect by cwd heuristics).
|
|
206
|
+
2. Claude authentication — verified, and in a TTY launched interactively
|
|
207
|
+
if missing.
|
|
208
|
+
|
|
209
|
+
Runtime-mode resolution order:
|
|
210
|
+
--mode flag > scripted / CI
|
|
211
|
+
config.runtimeMode > persisted from a prior \`jinn auth\`
|
|
212
|
+
interactive prompt > TTY fallback — asks the operator to pick
|
|
213
|
+
filesystem heuristic > last-resort: container (/.dockerenv) → docker-compose (cwd jinn-daemon compose) → bare
|
|
214
|
+
|
|
215
|
+
Behaviour:
|
|
216
|
+
- If runtime mode is unset and you're in a TTY, you'll be prompted. The
|
|
217
|
+
answer persists to ~/.jinn-client/config.json (or the --config path).
|
|
218
|
+
- If authenticated → emits JSON result with authenticated:true, context, detail.
|
|
219
|
+
- If not authenticated in non-TTY → emits invalid_invocation (exit 11).
|
|
220
|
+
- If not authenticated in a TTY → runs the appropriate login command.
|
|
221
|
+
|
|
222
|
+
Flags:
|
|
223
|
+
--mode <m> Set runtime mode non-interactively (bare | docker-compose | container).
|
|
224
|
+
--config <p> Path to config file (default: ~/.jinn-client/config.json).
|
|
225
|
+
--json Force JSON output.
|
|
226
|
+
--human Force human-readable output.
|
|
227
|
+
|
|
228
|
+
Examples:
|
|
229
|
+
jinn auth # interactive: picks mode + authenticates
|
|
230
|
+
jinn auth --mode bare # scripted: set mode + authenticate
|
|
231
|
+
jinn auth --mode docker-compose --json
|
|
232
|
+
`,
|
|
233
|
+
run,
|
|
234
|
+
};
|
|
235
|
+
export default command;
|
|
236
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,6 +62,7 @@ async function run(ctx) {
|
|
|
62
62
|
earningDir: config.earningDir,
|
|
63
63
|
chain: config.network === 'testnet' ? 'base-sepolia' : 'base',
|
|
64
64
|
rpcUrl: config.rpcUrl,
|
|
65
|
+
env: ctx.env,
|
|
65
66
|
stakingMode: config.stakingMode,
|
|
66
67
|
targetServices: config.targetServices,
|
|
67
68
|
testnetL2DeploymentPath: config.testnetL2DeploymentPath,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/cli/commands/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/cli/commands/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
|
-
import { isAbsolute, join } from 'node:path';
|
|
2
|
+
import { dirname, isAbsolute, join } from 'node:path';
|
|
3
3
|
import { parseArgs } from 'node:util';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { createPublicClient, http } from 'viem';
|
|
6
|
+
import { baseSepolia } from 'viem/chains';
|
|
4
7
|
import { COMMON_FLAGS } from '../command.js';
|
|
5
8
|
import { emitResult } from '../output.js';
|
|
6
9
|
import { emitEnvelope } from '../../errors/envelope.js';
|
|
7
10
|
import { checkClaudeBinary } from '../../preflight/claude-binary.js';
|
|
11
|
+
import { detectAuthContext, probeClaudeAuth } from '../../preflight/claude-auth.js';
|
|
8
12
|
import { getConfigPathFromArgs, loadConfig } from '../../config.js';
|
|
9
|
-
import { getChainConfig } from '../../earning/contracts.js';
|
|
13
|
+
import { getChainConfig, ERC20_ABI } from '../../earning/contracts.js';
|
|
14
|
+
import { runPortfolioV0DoctorChecks } from '../../api/portfolio-v0-doctor.js';
|
|
15
|
+
import { mnemonicKeystorePath } from '../../earning/store.js';
|
|
10
16
|
async function checkNodeVersion() {
|
|
11
17
|
const version = process.versions.node;
|
|
12
18
|
const major = parseInt(version.split('.')[0], 10);
|
|
@@ -18,19 +24,19 @@ async function checkNodeVersion() {
|
|
|
18
24
|
...(ok ? {} : { remedy: 'Upgrade to Node.js 20 or newer.' }),
|
|
19
25
|
};
|
|
20
26
|
}
|
|
21
|
-
|
|
22
|
-
const keystorePath =
|
|
27
|
+
function checkKeystorePresent(earningDir) {
|
|
28
|
+
const keystorePath = mnemonicKeystorePath(earningDir);
|
|
23
29
|
if (existsSync(keystorePath)) {
|
|
24
30
|
return {
|
|
25
|
-
name: '
|
|
31
|
+
name: 'keystore_present',
|
|
26
32
|
ok: true,
|
|
27
|
-
detail:
|
|
33
|
+
detail: `mnemonic keystore present at ${keystorePath}`,
|
|
28
34
|
};
|
|
29
35
|
}
|
|
30
36
|
return {
|
|
31
|
-
name: '
|
|
32
|
-
ok: true, // Missing is fine before `jinn init`;
|
|
33
|
-
detail: 'no keystore yet
|
|
37
|
+
name: 'keystore_present',
|
|
38
|
+
ok: true, // Missing is fine before `jinn init`; `jinn run` / `bootstrap` will create it.
|
|
39
|
+
detail: 'no keystore yet — run `jinn init` to create one',
|
|
34
40
|
};
|
|
35
41
|
}
|
|
36
42
|
async function checkDeploymentLoaded(config) {
|
|
@@ -83,6 +89,105 @@ function claudeBinaryCheckForDoctor(claudePath, result) {
|
|
|
83
89
|
}),
|
|
84
90
|
};
|
|
85
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Verify the daemon can spawn its HL MCP subprocess. The generated
|
|
94
|
+
* `hl-server.mjs` wrapper imports `mcp-tools.js` by absolute path and is
|
|
95
|
+
* loaded by plain Node — so the compiled artifact MUST exist on disk
|
|
96
|
+
* before `jinn run` spawns any Claude session. Without this check, the
|
|
97
|
+
* operator hits a silent "Claude didn't call any tools" symptom.
|
|
98
|
+
*/
|
|
99
|
+
function checkDaemonRuntimeReady() {
|
|
100
|
+
// doctor.ts compiles to dist/cli/commands/doctor.js → package root is 3 levels up.
|
|
101
|
+
// Under tsx (dev), __dirname is src/cli/commands; the check then looks for a sibling
|
|
102
|
+
// built artifact under dist/, which will only exist after `yarn build`.
|
|
103
|
+
const thisDir = dirname(fileURLToPath(import.meta.url));
|
|
104
|
+
const mcpToolsJsDist = join(thisDir, '..', '..', 'restorer', 'impls', 'claude-mcp-hyperliquid', 'mcp-tools.js');
|
|
105
|
+
if (existsSync(mcpToolsJsDist)) {
|
|
106
|
+
return {
|
|
107
|
+
name: 'daemon_runtime_ready',
|
|
108
|
+
ok: true,
|
|
109
|
+
detail: `compiled MCP tool module present at ${mcpToolsJsDist}`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
name: 'daemon_runtime_ready',
|
|
114
|
+
ok: false,
|
|
115
|
+
detail: `compiled MCP tool module missing (expected ${mcpToolsJsDist})`,
|
|
116
|
+
remedy: 'The daemon must run from a compiled build. Run `yarn build` before `yarn dev` / `node dist/bin/jinn.js run`, ' +
|
|
117
|
+
'or reinstall the npm package with `npm install -g @jinn-network/client@latest`.',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* On testnet, warn if the stOLAS distributor pool is drained. Operators can
|
|
122
|
+
* neither fix this themselves nor bootstrap past it — the protocol team has
|
|
123
|
+
* to refill (see contracts/scripts/README-jinn-testnet-faucet.md). Emitted
|
|
124
|
+
* as a warning, not a hard failure, because a refill may be in-flight.
|
|
125
|
+
*/
|
|
126
|
+
async function checkDistributorReachable(config) {
|
|
127
|
+
if (config.network !== 'testnet')
|
|
128
|
+
return null;
|
|
129
|
+
try {
|
|
130
|
+
const cfg = getChainConfig('base-sepolia', {
|
|
131
|
+
testnetL2DeploymentPath: config.testnetL2DeploymentPath,
|
|
132
|
+
testnetL2TokenDeploymentPath: config.testnetL2TokenDeploymentPath,
|
|
133
|
+
testnetMechDeploymentPath: config.testnetMechDeploymentPath,
|
|
134
|
+
testnetStolasDeploymentPath: config.testnetStolasDeploymentPath,
|
|
135
|
+
});
|
|
136
|
+
if (!cfg.distributorAddress) {
|
|
137
|
+
return {
|
|
138
|
+
name: 'distributor_reachable',
|
|
139
|
+
ok: true,
|
|
140
|
+
detail: 'distributor address not configured (standard mode staking disabled)',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const client = createPublicClient({ chain: baseSepolia, transport: http(cfg.rpcUrl) });
|
|
144
|
+
const balance = await client.readContract({
|
|
145
|
+
address: cfg.olasToken,
|
|
146
|
+
abi: ERC20_ABI,
|
|
147
|
+
functionName: 'balanceOf',
|
|
148
|
+
args: [cfg.distributorAddress],
|
|
149
|
+
});
|
|
150
|
+
const floor = cfg.bondAmount * 2n;
|
|
151
|
+
const jinn = Number(balance) / 1e18;
|
|
152
|
+
const required = Number(floor) / 1e18;
|
|
153
|
+
if (balance < floor) {
|
|
154
|
+
return {
|
|
155
|
+
name: 'distributor_reachable',
|
|
156
|
+
ok: false,
|
|
157
|
+
detail: `testnet staking pool is drained — distributor holds ${jinn.toFixed(2)} JINN, need ≥${required.toFixed(2)} per service`,
|
|
158
|
+
remedy: 'Protocol-team action required (operators cannot fix this locally). ' +
|
|
159
|
+
'Report the outage to the Jinn testnet channel; bootstrap will keep failing with `Overflow` until the pool is topped up.',
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
name: 'distributor_reachable',
|
|
164
|
+
ok: true,
|
|
165
|
+
detail: `distributor holds ${jinn.toFixed(2)} JINN (${Math.floor(jinn / required)} services of runway)`,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
return {
|
|
170
|
+
name: 'distributor_reachable',
|
|
171
|
+
ok: true, // Non-fatal — probe failure doesn't mean the pool is empty.
|
|
172
|
+
detail: `distributor probe failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async function checkClaudeAuth(config) {
|
|
177
|
+
const cwd = process.cwd();
|
|
178
|
+
const context = detectAuthContext({ cwd, configuredMode: config.runtimeMode });
|
|
179
|
+
const probe = probeClaudeAuth({ context, cwd });
|
|
180
|
+
return {
|
|
181
|
+
name: 'claude_auth',
|
|
182
|
+
ok: probe.authenticated,
|
|
183
|
+
detail: probe.authenticated
|
|
184
|
+
? `${probe.detail} (${context})`
|
|
185
|
+
: `Not authenticated (${context})`,
|
|
186
|
+
...(probe.authenticated
|
|
187
|
+
? {}
|
|
188
|
+
: { remedy: 'Run `jinn auth` to authenticate Claude.' }),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
86
191
|
async function run(ctx) {
|
|
87
192
|
let parsed;
|
|
88
193
|
try {
|
|
@@ -107,8 +212,25 @@ async function run(ctx) {
|
|
|
107
212
|
checks.push(await checkNodeVersion());
|
|
108
213
|
const claudeResult = await checkClaudeBinary(config.claudePath);
|
|
109
214
|
checks.push(claudeBinaryCheckForDoctor(config.claudePath, claudeResult));
|
|
110
|
-
checks.push(await
|
|
215
|
+
checks.push(await checkClaudeAuth(config));
|
|
216
|
+
checks.push(checkKeystorePresent(config.earningDir));
|
|
111
217
|
checks.push(await checkDeploymentLoaded(config));
|
|
218
|
+
checks.push(checkDaemonRuntimeReady());
|
|
219
|
+
const distributorCheck = await checkDistributorReachable(config);
|
|
220
|
+
if (distributorCheck)
|
|
221
|
+
checks.push(distributorCheck);
|
|
222
|
+
// portfolio.v0 checks — only run if the operator has configured a
|
|
223
|
+
// portfolio.v0 desired state. Otherwise, reporting `hl_api_wallet: fail`
|
|
224
|
+
// on a fresh operator who hasn't submitted an HL intent is false-alarm
|
|
225
|
+
// noise. Operators who want the HL-specific preflight in isolation can
|
|
226
|
+
// run those checks under a dedicated verb once one exists.
|
|
227
|
+
const hasPortfolioV0 = config.desiredStates.some((d) => d.spec?.kind === 'portfolio.v0');
|
|
228
|
+
if (hasPortfolioV0) {
|
|
229
|
+
const implStateDirRoot = '/tmp/jinn-engine-impl-state';
|
|
230
|
+
const hlImplStateDir = join(implStateDirRoot, 'claude-mcp-hyperliquid');
|
|
231
|
+
const portfolioChecks = runPortfolioV0DoctorChecks(hlImplStateDir);
|
|
232
|
+
checks.push(...portfolioChecks);
|
|
233
|
+
}
|
|
112
234
|
const blockingCount = checks.filter((c) => !c.ok).length;
|
|
113
235
|
const payload = {
|
|
114
236
|
schemaVersion: 1,
|
|
@@ -117,7 +239,7 @@ async function run(ctx) {
|
|
|
117
239
|
ok: blockingCount === 0,
|
|
118
240
|
blockingCount,
|
|
119
241
|
};
|
|
120
|
-
emitResult(payload, (v) =>
|
|
242
|
+
emitResult(payload, (v) => humanDoctor(v), {
|
|
121
243
|
json: Boolean(parsed.values.json),
|
|
122
244
|
human: Boolean(parsed.values.human),
|
|
123
245
|
writer: ctx.writer,
|
|
@@ -125,6 +247,19 @@ async function run(ctx) {
|
|
|
125
247
|
noColor: Boolean(ctx.env['NO_COLOR']),
|
|
126
248
|
});
|
|
127
249
|
}
|
|
250
|
+
function humanDoctor(payload) {
|
|
251
|
+
const lines = [];
|
|
252
|
+
for (const check of payload.checks) {
|
|
253
|
+
const mark = check.ok ? 'ok ' : 'fail';
|
|
254
|
+
lines.push(`[${mark}] ${check.name}: ${check.detail}`);
|
|
255
|
+
if (check.remedy)
|
|
256
|
+
lines.push(` remedy: ${check.remedy}`);
|
|
257
|
+
}
|
|
258
|
+
lines.push(payload.ok
|
|
259
|
+
? 'Summary: all checks passed.'
|
|
260
|
+
: `Summary: ${payload.blockingCount} blocking check(s) failed.`);
|
|
261
|
+
return lines.join('\n');
|
|
262
|
+
}
|
|
128
263
|
const command = {
|
|
129
264
|
name: 'doctor',
|
|
130
265
|
summary: 'Preflight checks: answers "would jinn run work?" without running it',
|
|
@@ -132,10 +267,13 @@ const command = {
|
|
|
132
267
|
|
|
133
268
|
Runs a set of non-mutating checks against the local environment and
|
|
134
269
|
configuration:
|
|
135
|
-
- node_version
|
|
136
|
-
- claude_binary
|
|
137
|
-
-
|
|
138
|
-
-
|
|
270
|
+
- node_version Node.js >= 20
|
|
271
|
+
- claude_binary claude CLI resolvable on PATH
|
|
272
|
+
- claude_auth Claude CLI authenticated
|
|
273
|
+
- keystore_present mnemonic keystore in configured earning directory (optional)
|
|
274
|
+
- deployment_loaded testnet/mainnet contract addresses resolved
|
|
275
|
+
- portfolio_impl_state_dir HL impl state directory present and readable
|
|
276
|
+
- hl_api_wallet HL API wallet generated and approved by operator
|
|
139
277
|
|
|
140
278
|
By default, emits a machine-readable JSON object with a checks array,
|
|
141
279
|
an overall ok flag, and a blockingCount. Exit code is 0 even when
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
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(),
|