@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.
- package/LICENSE +21 -0
- package/README.md +162 -0
- package/deployments/deployment-phase1a-l2-baseSepolia-fast.json +32 -0
- package/deployments/deployment-phase1a-token-baseSepolia-fast.json +27 -0
- package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +26 -0
- package/deployments/deployment-stolas-l2-baseSepolia-fast.json +35 -0
- package/dist/adapters/adapter.d.ts +11 -0
- package/dist/adapters/adapter.js +2 -0
- package/dist/adapters/adapter.js.map +1 -0
- package/dist/adapters/local/adapter.d.ts +20 -0
- package/dist/adapters/local/adapter.js +146 -0
- package/dist/adapters/local/adapter.js.map +1 -0
- package/dist/adapters/mech/adapter.d.ts +29 -0
- package/dist/adapters/mech/adapter.js +332 -0
- package/dist/adapters/mech/adapter.js.map +1 -0
- package/dist/adapters/mech/claim-policy.d.ts +40 -0
- package/dist/adapters/mech/claim-policy.js +104 -0
- package/dist/adapters/mech/claim-policy.js.map +1 -0
- package/dist/adapters/mech/contracts.d.ts +44 -0
- package/dist/adapters/mech/contracts.js +323 -0
- package/dist/adapters/mech/contracts.js.map +1 -0
- package/dist/adapters/mech/ipfs.d.ts +43 -0
- package/dist/adapters/mech/ipfs.js +142 -0
- package/dist/adapters/mech/ipfs.js.map +1 -0
- package/dist/adapters/mech/safe.d.ts +15 -0
- package/dist/adapters/mech/safe.js +113 -0
- package/dist/adapters/mech/safe.js.map +1 -0
- package/dist/adapters/mech/types.d.ts +561 -0
- package/dist/adapters/mech/types.js +340 -0
- package/dist/adapters/mech/types.js.map +1 -0
- package/dist/api/balance-build.d.ts +22 -0
- package/dist/api/balance-build.js +37 -0
- package/dist/api/balance-build.js.map +1 -0
- package/dist/api/fleet-build.d.ts +62 -0
- package/dist/api/fleet-build.js +91 -0
- package/dist/api/fleet-build.js.map +1 -0
- package/dist/api/gather-status.d.ts +20 -0
- package/dist/api/gather-status.js +137 -0
- package/dist/api/gather-status.js.map +1 -0
- package/dist/api/history-build.d.ts +32 -0
- package/dist/api/history-build.js +48 -0
- package/dist/api/history-build.js.map +1 -0
- package/dist/api/peers.d.ts +27 -0
- package/dist/api/peers.js +94 -0
- package/dist/api/peers.js.map +1 -0
- package/dist/api/rewards-build.d.ts +20 -0
- package/dist/api/rewards-build.js +42 -0
- package/dist/api/rewards-build.js.map +1 -0
- package/dist/api/server.d.ts +34 -0
- package/dist/api/server.js +130 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/status-build.d.ts +92 -0
- package/dist/api/status-build.js +175 -0
- package/dist/api/status-build.js.map +1 -0
- package/dist/api/status-rollup-build.d.ts +36 -0
- package/dist/api/status-rollup-build.js +69 -0
- package/dist/api/status-rollup-build.js.map +1 -0
- package/dist/auth/erc8128.d.ts +43 -0
- package/dist/auth/erc8128.js +88 -0
- package/dist/auth/erc8128.js.map +1 -0
- package/dist/bin/jinn.d.ts +11 -0
- package/dist/bin/jinn.js +20 -0
- package/dist/bin/jinn.js.map +1 -0
- package/dist/build-meta.json +3 -0
- package/dist/chain-read-errors.d.ts +9 -0
- package/dist/chain-read-errors.js +43 -0
- package/dist/chain-read-errors.js.map +1 -0
- package/dist/cli/action.d.ts +26 -0
- package/dist/cli/action.js +56 -0
- package/dist/cli/action.js.map +1 -0
- package/dist/cli/command.d.ts +62 -0
- package/dist/cli/command.js +29 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/commands/balance.d.ts +3 -0
- package/dist/cli/commands/balance.js +46 -0
- package/dist/cli/commands/balance.js.map +1 -0
- package/dist/cli/commands/bootstrap.d.ts +3 -0
- package/dist/cli/commands/bootstrap.js +165 -0
- package/dist/cli/commands/bootstrap.js.map +1 -0
- package/dist/cli/commands/claim-rewards.d.ts +3 -0
- package/dist/cli/commands/claim-rewards.js +121 -0
- package/dist/cli/commands/claim-rewards.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +151 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/fleet-scale.d.ts +3 -0
- package/dist/cli/commands/fleet-scale.js +449 -0
- package/dist/cli/commands/fleet-scale.js.map +1 -0
- package/dist/cli/commands/fleet.d.ts +3 -0
- package/dist/cli/commands/fleet.js +45 -0
- package/dist/cli/commands/fleet.js.map +1 -0
- package/dist/cli/commands/fund-requirements.d.ts +3 -0
- package/dist/cli/commands/fund-requirements.js +139 -0
- package/dist/cli/commands/fund-requirements.js.map +1 -0
- package/dist/cli/commands/history.d.ts +3 -0
- package/dist/cli/commands/history.js +61 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.js +91 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/keys-backup.d.ts +3 -0
- package/dist/cli/commands/keys-backup.js +107 -0
- package/dist/cli/commands/keys-backup.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +3 -0
- package/dist/cli/commands/logs.js +69 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/rewards.d.ts +3 -0
- package/dist/cli/commands/rewards.js +54 -0
- package/dist/cli/commands/rewards.js.map +1 -0
- package/dist/cli/commands/run.d.ts +3 -0
- package/dist/cli/commands/run.js +96 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.js +82 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/submit-intent.d.ts +3 -0
- package/dist/cli/commands/submit-intent.js +169 -0
- package/dist/cli/commands/submit-intent.js.map +1 -0
- package/dist/cli/commands/version.d.ts +3 -0
- package/dist/cli/commands/version.js +114 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/commands/withdraw.d.ts +3 -0
- package/dist/cli/commands/withdraw.js +181 -0
- package/dist/cli/commands/withdraw.js.map +1 -0
- package/dist/cli/deployment-digest.d.ts +10 -0
- package/dist/cli/deployment-digest.js +25 -0
- package/dist/cli/deployment-digest.js.map +1 -0
- package/dist/cli/execution-context.d.ts +50 -0
- package/dist/cli/execution-context.js +154 -0
- package/dist/cli/execution-context.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.js +37 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.js +132 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/introspection-context.d.ts +10 -0
- package/dist/cli/introspection-context.js +60 -0
- package/dist/cli/introspection-context.js.map +1 -0
- package/dist/cli/output.d.ts +36 -0
- package/dist/cli/output.js +35 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/password.d.ts +12 -0
- package/dist/cli/password.js +51 -0
- package/dist/cli/password.js.map +1 -0
- package/dist/config.d.ts +174 -0
- package/dist/config.js +252 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/creator.d.ts +24 -0
- package/dist/daemon/creator.js +80 -0
- package/dist/daemon/creator.js.map +1 -0
- package/dist/daemon/daemon.d.ts +60 -0
- package/dist/daemon/daemon.js +158 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/delivery-watcher.d.ts +10 -0
- package/dist/daemon/delivery-watcher.js +37 -0
- package/dist/daemon/delivery-watcher.js.map +1 -0
- package/dist/daemon/restorer.d.ts +19 -0
- package/dist/daemon/restorer.js +82 -0
- package/dist/daemon/restorer.js.map +1 -0
- package/dist/daemon/reward-claim-loop.d.ts +38 -0
- package/dist/daemon/reward-claim-loop.js +48 -0
- package/dist/daemon/reward-claim-loop.js.map +1 -0
- package/dist/discovery/registry.d.ts +43 -0
- package/dist/discovery/registry.js +104 -0
- package/dist/discovery/registry.js.map +1 -0
- package/dist/discovery/subgraph.d.ts +37 -0
- package/dist/discovery/subgraph.js +87 -0
- package/dist/discovery/subgraph.js.map +1 -0
- package/dist/earning/bootstrap.d.ts +79 -0
- package/dist/earning/bootstrap.js +989 -0
- package/dist/earning/bootstrap.js.map +1 -0
- package/dist/earning/contracts.d.ts +431 -0
- package/dist/earning/contracts.js +518 -0
- package/dist/earning/contracts.js.map +1 -0
- package/dist/earning/evidence-simhash.d.ts +59 -0
- package/dist/earning/evidence-simhash.js +87 -0
- package/dist/earning/evidence-simhash.js.map +1 -0
- package/dist/earning/fleet-display-index.d.ts +8 -0
- package/dist/earning/fleet-display-index.js +12 -0
- package/dist/earning/fleet-display-index.js.map +1 -0
- package/dist/earning/fleet-retire.d.ts +28 -0
- package/dist/earning/fleet-retire.js +75 -0
- package/dist/earning/fleet-retire.js.map +1 -0
- package/dist/earning/jinn-rewards.d.ts +62 -0
- package/dist/earning/jinn-rewards.js +81 -0
- package/dist/earning/jinn-rewards.js.map +1 -0
- package/dist/earning/next-service-index.d.ts +4 -0
- package/dist/earning/next-service-index.js +7 -0
- package/dist/earning/next-service-index.js.map +1 -0
- package/dist/earning/orphan-sweep.d.ts +33 -0
- package/dist/earning/orphan-sweep.js +157 -0
- package/dist/earning/orphan-sweep.js.map +1 -0
- package/dist/earning/reconcile.d.ts +37 -0
- package/dist/earning/reconcile.js +216 -0
- package/dist/earning/reconcile.js.map +1 -0
- package/dist/earning/safe-adapter.d.ts +70 -0
- package/dist/earning/safe-adapter.js +228 -0
- package/dist/earning/safe-adapter.js.map +1 -0
- package/dist/earning/stolas-claim.d.ts +47 -0
- package/dist/earning/stolas-claim.js +115 -0
- package/dist/earning/stolas-claim.js.map +1 -0
- package/dist/earning/store.d.ts +36 -0
- package/dist/earning/store.js +156 -0
- package/dist/earning/store.js.map +1 -0
- package/dist/earning/types.d.ts +123 -0
- package/dist/earning/types.js +64 -0
- package/dist/earning/types.js.map +1 -0
- package/dist/earning/viem-clients.d.ts +9 -0
- package/dist/earning/viem-clients.js +22 -0
- package/dist/earning/viem-clients.js.map +1 -0
- package/dist/earning/wallet.d.ts +20 -0
- package/dist/earning/wallet.js +103 -0
- package/dist/earning/wallet.js.map +1 -0
- package/dist/errors/envelope.d.ts +41 -0
- package/dist/errors/envelope.js +48 -0
- package/dist/errors/envelope.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +32 -0
- package/dist/main.js +281 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/server.d.ts +14 -0
- package/dist/mcp/server.js +205 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/operator-errors.d.ts +16 -0
- package/dist/operator-errors.js +88 -0
- package/dist/operator-errors.js.map +1 -0
- package/dist/preflight/claude-binary.d.ts +19 -0
- package/dist/preflight/claude-binary.js +44 -0
- package/dist/preflight/claude-binary.js.map +1 -0
- package/dist/preflight/claude-invocation-envelope.d.ts +11 -0
- package/dist/preflight/claude-invocation-envelope.js +67 -0
- package/dist/preflight/claude-invocation-envelope.js.map +1 -0
- package/dist/runner/claude.d.ts +15 -0
- package/dist/runner/claude.js +193 -0
- package/dist/runner/claude.js.map +1 -0
- package/dist/runner/runner.d.ts +11 -0
- package/dist/runner/runner.js +2 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/runner/simple.d.ts +8 -0
- package/dist/runner/simple.js +11 -0
- package/dist/runner/simple.js.map +1 -0
- package/dist/store/store.d.ts +74 -0
- package/dist/store/store.js +173 -0
- package/dist/store/store.js.map +1 -0
- package/dist/tx-retry.d.ts +55 -0
- package/dist/tx-retry.js +214 -0
- package/dist/tx-retry.js.map +1 -0
- package/dist/types/desired-state.d.ts +41 -0
- package/dist/types/desired-state.js +16 -0
- package/dist/types/desired-state.js.map +1 -0
- package/dist/types/errors.d.ts +8 -0
- package/dist/types/errors.js +17 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/withdraw/args.d.ts +29 -0
- package/dist/withdraw/args.js +198 -0
- package/dist/withdraw/args.js.map +1 -0
- package/dist/withdraw/run-withdraw-plan.d.ts +21 -0
- package/dist/withdraw/run-withdraw-plan.js +257 -0
- package/dist/withdraw/run-withdraw-plan.js.map +1 -0
- package/dist/x402/acquire.d.ts +6 -0
- package/dist/x402/acquire.js +32 -0
- package/dist/x402/acquire.js.map +1 -0
- package/dist/x402/facilitator.d.ts +11 -0
- package/dist/x402/facilitator.js +52 -0
- package/dist/x402/facilitator.js.map +1 -0
- package/dist/x402/handler.d.ts +15 -0
- package/dist/x402/handler.js +40 -0
- package/dist/x402/handler.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure assembly for GET /v1/status JSON (testable without RPC or filesystem).
|
|
3
|
+
*/
|
|
4
|
+
import type { FleetState } from '../earning/types.js';
|
|
5
|
+
export type StatusHintsScope = 'full' | 'sqlite_only';
|
|
6
|
+
export interface GatheredStatusRaw {
|
|
7
|
+
/** sqlite_only: only SQLite-backed fields (e2e / API without fleet context). */
|
|
8
|
+
hintsScope?: StatusHintsScope;
|
|
9
|
+
shutdownState: string | null;
|
|
10
|
+
dbPath: string;
|
|
11
|
+
activityCounts: Record<string, number>;
|
|
12
|
+
recentActivity: Array<{
|
|
13
|
+
requestId: string;
|
|
14
|
+
role: string;
|
|
15
|
+
}>;
|
|
16
|
+
lastRewardClaimTickAt: string | null;
|
|
17
|
+
rewardClaimIntervalMs: number;
|
|
18
|
+
fleet: FleetState | null;
|
|
19
|
+
rpc: {
|
|
20
|
+
ok: boolean;
|
|
21
|
+
chainId?: number;
|
|
22
|
+
blockNumber?: string;
|
|
23
|
+
error?: string;
|
|
24
|
+
};
|
|
25
|
+
master: {
|
|
26
|
+
address: string | null;
|
|
27
|
+
balanceWei?: string;
|
|
28
|
+
error?: string;
|
|
29
|
+
};
|
|
30
|
+
pendingStakingRewardsWei?: string;
|
|
31
|
+
pendingRewardsError?: string;
|
|
32
|
+
pollIntervalMs: number;
|
|
33
|
+
/** Resolved daily burn estimate for runway (wei string). */
|
|
34
|
+
masterDailyEstimateWei: string;
|
|
35
|
+
minMasterEthWei?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface StatusV1Response {
|
|
38
|
+
statusMode: 'full' | 'sqlite_only';
|
|
39
|
+
daemon: {
|
|
40
|
+
shutdownState: string | null;
|
|
41
|
+
dbPath: string;
|
|
42
|
+
timestamp: string;
|
|
43
|
+
};
|
|
44
|
+
rpc: GatheredStatusRaw['rpc'];
|
|
45
|
+
fleet: {
|
|
46
|
+
loaded: boolean;
|
|
47
|
+
chain?: string;
|
|
48
|
+
stakingMode?: string;
|
|
49
|
+
masterAddress?: string | null;
|
|
50
|
+
services: Array<{
|
|
51
|
+
index: number;
|
|
52
|
+
step: string;
|
|
53
|
+
serviceId: number | null;
|
|
54
|
+
safeAddress: string | null;
|
|
55
|
+
mechAddress: string | null;
|
|
56
|
+
stakingAddress: string | null;
|
|
57
|
+
}>;
|
|
58
|
+
stakedLikeCount: number;
|
|
59
|
+
completeCount: number;
|
|
60
|
+
};
|
|
61
|
+
activity: {
|
|
62
|
+
counts: Record<string, number>;
|
|
63
|
+
recent: Array<{
|
|
64
|
+
requestId: string;
|
|
65
|
+
role: string;
|
|
66
|
+
}>;
|
|
67
|
+
};
|
|
68
|
+
rewards: {
|
|
69
|
+
claimLoopIntervalMs: number;
|
|
70
|
+
lastClaimTickAt: string | null;
|
|
71
|
+
pendingStakingRewardsWei?: string;
|
|
72
|
+
pendingRewardsError?: string;
|
|
73
|
+
};
|
|
74
|
+
masterGas: {
|
|
75
|
+
address: string | null;
|
|
76
|
+
balanceWei?: string;
|
|
77
|
+
dailyEstimateWei: string;
|
|
78
|
+
/** Approximate days of excess ETH above minimum at daily estimate (if computable). */
|
|
79
|
+
runwayDaysExcess?: string;
|
|
80
|
+
minEthWei?: string;
|
|
81
|
+
error?: string;
|
|
82
|
+
};
|
|
83
|
+
earnings: {
|
|
84
|
+
hint: string;
|
|
85
|
+
};
|
|
86
|
+
nextActions: string[];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Match bootstrap heuristic for master daily gas when config omits JINN_MASTER_ETH_DAILY_WEI.
|
|
90
|
+
*/
|
|
91
|
+
export declare function resolveMasterDailyEstimateWei(explicit: string | undefined, pollIntervalMs: number): bigint;
|
|
92
|
+
export declare function assembleStatusV1(raw: GatheredStatusRaw): StatusV1Response;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure assembly for GET /v1/status JSON (testable without RPC or filesystem).
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_MASTER_ETH_DAILY_WEI = 1000000000000000n;
|
|
5
|
+
const STAKED_LIKE_STEPS = new Set([
|
|
6
|
+
'staked',
|
|
7
|
+
'mech_deployed',
|
|
8
|
+
'complete',
|
|
9
|
+
'service_staked',
|
|
10
|
+
]);
|
|
11
|
+
/**
|
|
12
|
+
* Match bootstrap heuristic for master daily gas when config omits JINN_MASTER_ETH_DAILY_WEI.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveMasterDailyEstimateWei(explicit, pollIntervalMs) {
|
|
15
|
+
if (explicit !== undefined && /^\d+$/.test(explicit.trim())) {
|
|
16
|
+
return BigInt(explicit.trim());
|
|
17
|
+
}
|
|
18
|
+
const interval = Math.max(pollIntervalMs, 1000);
|
|
19
|
+
const pollsPerDay = 86400000 / interval;
|
|
20
|
+
const txsPerDay = Math.min(Math.ceil(pollsPerDay / 600), 12);
|
|
21
|
+
const txCostWei = 150000n * 2000000000n;
|
|
22
|
+
const fromPoll = BigInt(txsPerDay) * txCostWei;
|
|
23
|
+
return fromPoll > DEFAULT_MASTER_ETH_DAILY_WEI ? fromPoll : DEFAULT_MASTER_ETH_DAILY_WEI;
|
|
24
|
+
}
|
|
25
|
+
function fleetSummary(fleet) {
|
|
26
|
+
if (!fleet) {
|
|
27
|
+
return {
|
|
28
|
+
loaded: false,
|
|
29
|
+
services: [],
|
|
30
|
+
stakedLikeCount: 0,
|
|
31
|
+
completeCount: 0,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const services = fleet.services.map(s => ({
|
|
35
|
+
index: s.index,
|
|
36
|
+
step: s.step,
|
|
37
|
+
serviceId: s.service_id,
|
|
38
|
+
safeAddress: s.safe_address,
|
|
39
|
+
mechAddress: s.mech_address,
|
|
40
|
+
stakingAddress: s.staking_address,
|
|
41
|
+
}));
|
|
42
|
+
const stakedLikeCount = fleet.services.filter(s => STAKED_LIKE_STEPS.has(s.step)).length;
|
|
43
|
+
const completeCount = fleet.services.filter(s => s.step === 'complete').length;
|
|
44
|
+
return {
|
|
45
|
+
loaded: true,
|
|
46
|
+
chain: fleet.chain,
|
|
47
|
+
stakingMode: fleet.staking_mode,
|
|
48
|
+
masterAddress: fleet.master_address,
|
|
49
|
+
services,
|
|
50
|
+
stakedLikeCount,
|
|
51
|
+
completeCount,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function computeRunwayDaysExcess(balanceWei, minWei, daily) {
|
|
55
|
+
if (daily === 0n)
|
|
56
|
+
return undefined;
|
|
57
|
+
if (minWei !== undefined) {
|
|
58
|
+
if (balanceWei <= minWei)
|
|
59
|
+
return '0';
|
|
60
|
+
const excess = balanceWei - minWei;
|
|
61
|
+
if (excess <= 0n)
|
|
62
|
+
return '0';
|
|
63
|
+
return (excess / daily).toString();
|
|
64
|
+
}
|
|
65
|
+
if (balanceWei <= 0n)
|
|
66
|
+
return '0';
|
|
67
|
+
return (balanceWei / daily).toString();
|
|
68
|
+
}
|
|
69
|
+
function buildEarningsHint(raw, fleetSum) {
|
|
70
|
+
if (raw.hintsScope === 'sqlite_only') {
|
|
71
|
+
return 'Fleet and on-chain earnings hints omitted in API-only mode.';
|
|
72
|
+
}
|
|
73
|
+
if (raw.pendingRewardsError) {
|
|
74
|
+
return `Could not read pending staking rewards: ${raw.pendingRewardsError}`;
|
|
75
|
+
}
|
|
76
|
+
if (raw.pendingStakingRewardsWei !== undefined) {
|
|
77
|
+
const n = fleetSum.stakedLikeCount;
|
|
78
|
+
return `Sum of on-chain calculateStakingReward (wei) across eligible services: ${raw.pendingStakingRewardsWei} (${n} staked-like service(s) in local state).`;
|
|
79
|
+
}
|
|
80
|
+
if (!fleetSum.loaded || fleetSum.services.length === 0) {
|
|
81
|
+
return 'No fleet services in local state — earnings accrue after staking completes.';
|
|
82
|
+
}
|
|
83
|
+
return 'Pending reward sum not available (no RPC or no staking proxies on services).';
|
|
84
|
+
}
|
|
85
|
+
function buildNextActions(raw, fleetSum) {
|
|
86
|
+
const actions = [];
|
|
87
|
+
if (raw.hintsScope === 'sqlite_only') {
|
|
88
|
+
return [
|
|
89
|
+
'Full operations status requires daemon start with status context, or run `npm run status` while the daemon is up.',
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
if (!raw.rpc.ok) {
|
|
93
|
+
actions.push('Restore RPC access (check rpcUrl / network) for live balances and rewards.');
|
|
94
|
+
}
|
|
95
|
+
if (!fleetSum.loaded) {
|
|
96
|
+
actions.push('Run bootstrap (`jinn run` with JINN_PASSWORD) to create fleet and staking state.');
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
if (!raw.fleet?.master_address) {
|
|
100
|
+
actions.push('Complete earning bootstrap so master_address is recorded.');
|
|
101
|
+
}
|
|
102
|
+
for (const s of raw.fleet?.services ?? []) {
|
|
103
|
+
if (s.step !== 'complete') {
|
|
104
|
+
actions.push(`Resume service ${s.index}: local step "${s.step}" — re-run jinn run.`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (raw.master.address && raw.minMasterEthWei && raw.master.balanceWei !== undefined) {
|
|
109
|
+
const bal = BigInt(raw.master.balanceWei);
|
|
110
|
+
const min = BigInt(raw.minMasterEthWei);
|
|
111
|
+
if (bal < min) {
|
|
112
|
+
actions.push('Fund master EOA with more ETH for gas (below configured minimum).');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const daily = BigInt(raw.masterDailyEstimateWei);
|
|
116
|
+
if (daily > 0n &&
|
|
117
|
+
raw.master.balanceWei !== undefined &&
|
|
118
|
+
raw.minMasterEthWei !== undefined) {
|
|
119
|
+
const bal = BigInt(raw.master.balanceWei);
|
|
120
|
+
const min = BigInt(raw.minMasterEthWei);
|
|
121
|
+
const excess = bal > min ? bal - min : 0n;
|
|
122
|
+
const days = excess / daily;
|
|
123
|
+
if (days < 3n && raw.rpc.ok) {
|
|
124
|
+
actions.push('Master ETH runway is low — consider topping up the master wallet.');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (raw.rewardClaimIntervalMs > 0 && !raw.lastRewardClaimTickAt && fleetSum.stakedLikeCount > 0) {
|
|
128
|
+
actions.push('Reward claim loop is enabled; last tick time will appear after the first distributor pass.');
|
|
129
|
+
}
|
|
130
|
+
const dedup = [...new Set(actions)];
|
|
131
|
+
if (dedup.length === 0) {
|
|
132
|
+
dedup.push('No urgent actions — daemon loops and reward claims run on schedule.');
|
|
133
|
+
}
|
|
134
|
+
return dedup;
|
|
135
|
+
}
|
|
136
|
+
export function assembleStatusV1(raw) {
|
|
137
|
+
const fleetSum = fleetSummary(raw.fleet);
|
|
138
|
+
const mode = raw.hintsScope === 'sqlite_only' ? 'sqlite_only' : 'full';
|
|
139
|
+
const runway = raw.master.balanceWei !== undefined
|
|
140
|
+
? computeRunwayDaysExcess(BigInt(raw.master.balanceWei), raw.minMasterEthWei !== undefined ? BigInt(raw.minMasterEthWei) : undefined, BigInt(raw.masterDailyEstimateWei))
|
|
141
|
+
: undefined;
|
|
142
|
+
return {
|
|
143
|
+
statusMode: mode,
|
|
144
|
+
daemon: {
|
|
145
|
+
shutdownState: raw.shutdownState,
|
|
146
|
+
dbPath: raw.dbPath,
|
|
147
|
+
timestamp: new Date().toISOString(),
|
|
148
|
+
},
|
|
149
|
+
rpc: raw.rpc,
|
|
150
|
+
fleet: fleetSum,
|
|
151
|
+
activity: {
|
|
152
|
+
counts: raw.activityCounts,
|
|
153
|
+
recent: raw.recentActivity,
|
|
154
|
+
},
|
|
155
|
+
rewards: {
|
|
156
|
+
claimLoopIntervalMs: raw.rewardClaimIntervalMs,
|
|
157
|
+
lastClaimTickAt: raw.lastRewardClaimTickAt,
|
|
158
|
+
pendingStakingRewardsWei: raw.pendingStakingRewardsWei,
|
|
159
|
+
pendingRewardsError: raw.pendingRewardsError,
|
|
160
|
+
},
|
|
161
|
+
masterGas: {
|
|
162
|
+
address: raw.master.address,
|
|
163
|
+
balanceWei: raw.master.balanceWei,
|
|
164
|
+
dailyEstimateWei: raw.masterDailyEstimateWei,
|
|
165
|
+
runwayDaysExcess: raw.master.balanceWei !== undefined && runway !== undefined ? runway : undefined,
|
|
166
|
+
minEthWei: raw.minMasterEthWei,
|
|
167
|
+
error: raw.master.error,
|
|
168
|
+
},
|
|
169
|
+
earnings: {
|
|
170
|
+
hint: buildEarningsHint(raw, fleetSum),
|
|
171
|
+
},
|
|
172
|
+
nextActions: buildNextActions(raw, fleetSum),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=status-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-build.js","sourceRoot":"","sources":["../../src/api/status-build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,4BAA4B,GAAG,iBAAsB,CAAC;AA6E5D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,QAAQ;IACR,eAAe;IACf,UAAU;IACV,gBAAgB;CACjB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,QAA4B,EAC5B,cAAsB;IAEtB,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,OAAQ,GAAG,WAAc,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IAC/C,OAAO,QAAQ,GAAG,4BAA4B,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,4BAA4B,CAAC;AAC3F,CAAC;AAED,SAAS,YAAY,CAAC,KAAwB;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,EAAE;YACZ,eAAe,EAAE,CAAC;YAClB,aAAa,EAAE,CAAC;SACjB,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxC,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,SAAS,EAAE,CAAC,CAAC,UAAU;QACvB,WAAW,EAAE,CAAC,CAAC,YAAY;QAC3B,WAAW,EAAE,CAAC,CAAC,YAAY;QAC3B,cAAc,EAAE,CAAC,CAAC,eAAe;KAClC,CAAC,CAAC,CAAC;IACJ,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACzF,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IAC/E,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,KAAK,CAAC,YAAY;QAC/B,aAAa,EAAE,KAAK,CAAC,cAAc;QACnC,QAAQ;QACR,eAAe;QACf,aAAa;KACd,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,UAAkB,EAClB,MAA0B,EAC1B,KAAa;IAEb,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,UAAU,IAAI,MAAM;YAAE,OAAO,GAAG,CAAC;QACrC,MAAM,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;QACnC,IAAI,MAAM,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC;QAC7B,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrC,CAAC;IACD,IAAI,UAAU,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IACjC,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAsB,EAAE,QAAmC;IACpF,IAAI,GAAG,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;QACrC,OAAO,6DAA6D,CAAC;IACvE,CAAC;IACD,IAAI,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAC5B,OAAO,2CAA2C,GAAG,CAAC,mBAAmB,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,GAAG,CAAC,wBAAwB,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC;QACnC,OAAO,0EAA0E,GAAG,CAAC,wBAAwB,KAAK,CAAC,0CAA0C,CAAC;IAChK,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,OAAO,6EAA6E,CAAC;IACvF,CAAC;IACD,OAAO,8EAA8E,CAAC;AACxF,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAsB,EAAE,QAAmC;IACnF,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,GAAG,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;QACrC,OAAO;YACL,mHAAmH;SACpH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;IAC7F,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;IACnG,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QAC5E,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrF,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACjD,IACE,KAAK,GAAG,EAAE;QACV,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS;QACnC,GAAG,CAAC,eAAe,KAAK,SAAS,EACjC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC;QAC5B,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,IAAI,QAAQ,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QAChG,OAAO,CAAC,IAAI,CAAC,4FAA4F,CAAC,CAAC;IAC7G,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAsB;IACrD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,IAAI,GAA2B,GAAG,CAAC,UAAU,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/F,MAAM,MAAM,GACV,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS;QACjC,CAAC,CAAC,uBAAuB,CACrB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,EAC7B,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,EAC3E,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CACnC;QACH,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE;YACN,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;QACD,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE;YACR,MAAM,EAAE,GAAG,CAAC,cAAc;YAC1B,MAAM,EAAE,GAAG,CAAC,cAAc;SAC3B;QACD,OAAO,EAAE;YACP,mBAAmB,EAAE,GAAG,CAAC,qBAAqB;YAC9C,eAAe,EAAE,GAAG,CAAC,qBAAqB;YAC1C,wBAAwB,EAAE,GAAG,CAAC,wBAAwB;YACtD,mBAAmB,EAAE,GAAG,CAAC,mBAAmB;SAC7C;QACD,SAAS,EAAE;YACT,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO;YAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU;YACjC,gBAAgB,EAAE,GAAG,CAAC,sBAAsB;YAC5C,gBAAgB,EACd,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAClF,SAAS,EAAE,GAAG,CAAC,eAAe;YAC9B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK;SACxB;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC;SACvC;QACD,WAAW,EAAE,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slim `jinn status` roll-up from GatheredStatusRaw.
|
|
3
|
+
*
|
|
4
|
+
* Contract: spec/2026-04-14-client-surface.md §4.1.
|
|
5
|
+
*/
|
|
6
|
+
import type { GatheredStatusRaw } from './status-build.js';
|
|
7
|
+
export interface StatusRollupV1Response {
|
|
8
|
+
schemaVersion: 1;
|
|
9
|
+
generatedAt: string;
|
|
10
|
+
daemon: {
|
|
11
|
+
state: 'running' | 'stopped' | 'starting';
|
|
12
|
+
startedAt: string | null;
|
|
13
|
+
phase: string;
|
|
14
|
+
network: 'testnet' | 'mainnet';
|
|
15
|
+
};
|
|
16
|
+
rpc: {
|
|
17
|
+
ok: boolean;
|
|
18
|
+
chainId: number;
|
|
19
|
+
blockNumber: number;
|
|
20
|
+
error?: string;
|
|
21
|
+
};
|
|
22
|
+
fleet: {
|
|
23
|
+
size: number;
|
|
24
|
+
complete: number;
|
|
25
|
+
needsAttention: number;
|
|
26
|
+
};
|
|
27
|
+
earnings: {
|
|
28
|
+
pendingTotal: string;
|
|
29
|
+
asset: 'reward';
|
|
30
|
+
};
|
|
31
|
+
exit: {
|
|
32
|
+
blocking: boolean;
|
|
33
|
+
hint: string | null;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export declare function assembleStatusRollupV1(raw: GatheredStatusRaw): StatusRollupV1Response;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slim `jinn status` roll-up from GatheredStatusRaw.
|
|
3
|
+
*
|
|
4
|
+
* Contract: spec/2026-04-14-client-surface.md §4.1.
|
|
5
|
+
*/
|
|
6
|
+
function daemonState(shutdown) {
|
|
7
|
+
if (shutdown === 'running')
|
|
8
|
+
return 'running';
|
|
9
|
+
return 'stopped';
|
|
10
|
+
}
|
|
11
|
+
function buildExitRollup(raw, needsAttention) {
|
|
12
|
+
if (!raw.rpc.ok) {
|
|
13
|
+
return { blocking: true, hint: raw.rpc.error ?? 'RPC unhealthy.' };
|
|
14
|
+
}
|
|
15
|
+
if (needsAttention > 0) {
|
|
16
|
+
return { blocking: true, hint: 'Run `jinn fleet` for per-service detail.' };
|
|
17
|
+
}
|
|
18
|
+
if (raw.minMasterEthWei && raw.master.balanceWei) {
|
|
19
|
+
try {
|
|
20
|
+
if (BigInt(raw.master.balanceWei) < BigInt(raw.minMasterEthWei)) {
|
|
21
|
+
return {
|
|
22
|
+
blocking: true,
|
|
23
|
+
hint: 'Master ETH is below the configured minimum runway threshold.',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
/* ignore parse errors */
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { blocking: false, hint: null };
|
|
32
|
+
}
|
|
33
|
+
export function assembleStatusRollupV1(raw) {
|
|
34
|
+
const services = raw.fleet?.services ?? [];
|
|
35
|
+
const complete = services.filter(s => s.step === 'complete').length;
|
|
36
|
+
const needsAttention = services.length - complete;
|
|
37
|
+
const network = raw.fleet?.chain === 'base' ? 'mainnet' : 'testnet';
|
|
38
|
+
const phase = network === 'testnet' ? 'phase-1b' : 'phase-2';
|
|
39
|
+
const blockStr = raw.rpc.blockNumber ?? '0';
|
|
40
|
+
const blockNumber = Number(blockStr);
|
|
41
|
+
const exit = buildExitRollup(raw, needsAttention);
|
|
42
|
+
return {
|
|
43
|
+
schemaVersion: 1,
|
|
44
|
+
generatedAt: new Date().toISOString(),
|
|
45
|
+
daemon: {
|
|
46
|
+
state: daemonState(raw.shutdownState),
|
|
47
|
+
startedAt: null,
|
|
48
|
+
phase,
|
|
49
|
+
network,
|
|
50
|
+
},
|
|
51
|
+
rpc: {
|
|
52
|
+
ok: raw.rpc.ok,
|
|
53
|
+
chainId: raw.rpc.chainId ?? 0,
|
|
54
|
+
blockNumber: Number.isFinite(blockNumber) ? blockNumber : 0,
|
|
55
|
+
...(raw.rpc.error ? { error: raw.rpc.error } : {}),
|
|
56
|
+
},
|
|
57
|
+
fleet: {
|
|
58
|
+
size: services.length,
|
|
59
|
+
complete,
|
|
60
|
+
needsAttention,
|
|
61
|
+
},
|
|
62
|
+
earnings: {
|
|
63
|
+
pendingTotal: raw.pendingStakingRewardsWei ?? '0',
|
|
64
|
+
asset: 'reward',
|
|
65
|
+
},
|
|
66
|
+
exit,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=status-rollup-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-rollup-build.js","sourceRoot":"","sources":["../../src/api/status-rollup-build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ERC-8128 HTTP Message Signatures for jinn-client.
|
|
3
|
+
*
|
|
4
|
+
* Ported from jinn-gemini-3/packages/crypto/src/erc8128.ts.
|
|
5
|
+
* Uses @slicekit/erc8128 (RFC 9421 + Ethereum signatures).
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const signer = createPrivateKeyHttpSigner(privateKey, 8453);
|
|
9
|
+
* const signed = await signRequestWithErc8128({ signer, input: url, init: { method: 'POST', body } });
|
|
10
|
+
* // signed Request has signature, signature-input, content-digest headers
|
|
11
|
+
*
|
|
12
|
+
* const result = await verifyRequestWithErc8128({ request: signed, nonceStore });
|
|
13
|
+
* // result.address is the verified signer
|
|
14
|
+
*/
|
|
15
|
+
import { type EthHttpSigner, type NonceStore, type VerifyMessageFn, type VerifyResult, type VerifyPolicy, type SignOptions } from '@slicekit/erc8128';
|
|
16
|
+
type Hex = `0x${string}`;
|
|
17
|
+
/**
|
|
18
|
+
* In-memory nonce store with TTL-based expiration.
|
|
19
|
+
* Tracks seen nonces and garbage-collects expired entries on access.
|
|
20
|
+
*/
|
|
21
|
+
export declare class InMemoryNonceStore implements NonceStore {
|
|
22
|
+
private seen;
|
|
23
|
+
consume(key: string, ttlSeconds: number): Promise<boolean>;
|
|
24
|
+
private gc;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Verify an ERC-191 personal_sign message using viem.
|
|
28
|
+
* Matches the VerifyMessageFn shape expected by @slicekit/erc8128.
|
|
29
|
+
*/
|
|
30
|
+
export declare const ethVerifyMessage: VerifyMessageFn;
|
|
31
|
+
export declare function createPrivateKeyHttpSigner(privateKey: Hex, chainId: number): EthHttpSigner;
|
|
32
|
+
export declare function signRequestWithErc8128(args: {
|
|
33
|
+
signer: EthHttpSigner;
|
|
34
|
+
input: RequestInfo;
|
|
35
|
+
init?: RequestInit;
|
|
36
|
+
signOptions?: SignOptions;
|
|
37
|
+
}): Promise<Request>;
|
|
38
|
+
export declare function verifyRequestWithErc8128(args: {
|
|
39
|
+
request: Request;
|
|
40
|
+
nonceStore: NonceStore;
|
|
41
|
+
policy?: Partial<VerifyPolicy>;
|
|
42
|
+
}): Promise<VerifyResult>;
|
|
43
|
+
export type { EthHttpSigner, NonceStore, VerifyResult, VerifyPolicy, SignOptions, };
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ERC-8128 HTTP Message Signatures for jinn-client.
|
|
3
|
+
*
|
|
4
|
+
* Ported from jinn-gemini-3/packages/crypto/src/erc8128.ts.
|
|
5
|
+
* Uses @slicekit/erc8128 (RFC 9421 + Ethereum signatures).
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const signer = createPrivateKeyHttpSigner(privateKey, 8453);
|
|
9
|
+
* const signed = await signRequestWithErc8128({ signer, input: url, init: { method: 'POST', body } });
|
|
10
|
+
* // signed Request has signature, signature-input, content-digest headers
|
|
11
|
+
*
|
|
12
|
+
* const result = await verifyRequestWithErc8128({ request: signed, nonceStore });
|
|
13
|
+
* // result.address is the verified signer
|
|
14
|
+
*/
|
|
15
|
+
import { signRequest, verifyRequest as erc8128VerifyRequest, } from '@slicekit/erc8128';
|
|
16
|
+
import { privateKeyToAccount } from 'viem/accounts';
|
|
17
|
+
import { verifyMessage } from 'viem';
|
|
18
|
+
// ── Nonce store ──────────────────────────────────────────────────────────────
|
|
19
|
+
/**
|
|
20
|
+
* In-memory nonce store with TTL-based expiration.
|
|
21
|
+
* Tracks seen nonces and garbage-collects expired entries on access.
|
|
22
|
+
*/
|
|
23
|
+
export class InMemoryNonceStore {
|
|
24
|
+
seen = new Map();
|
|
25
|
+
async consume(key, ttlSeconds) {
|
|
26
|
+
this.gc();
|
|
27
|
+
if (this.seen.has(key))
|
|
28
|
+
return false;
|
|
29
|
+
this.seen.set(key, Date.now() + ttlSeconds * 1000);
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
gc() {
|
|
33
|
+
const now = Date.now();
|
|
34
|
+
for (const [key, expiresAt] of this.seen) {
|
|
35
|
+
if (expiresAt <= now) {
|
|
36
|
+
this.seen.delete(key);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// ── Verification helper ──────────────────────────────────────────────────────
|
|
42
|
+
/**
|
|
43
|
+
* Verify an ERC-191 personal_sign message using viem.
|
|
44
|
+
* Matches the VerifyMessageFn shape expected by @slicekit/erc8128.
|
|
45
|
+
*/
|
|
46
|
+
export const ethVerifyMessage = async (args) => {
|
|
47
|
+
try {
|
|
48
|
+
return await verifyMessage({
|
|
49
|
+
address: args.address,
|
|
50
|
+
message: { raw: args.message.raw },
|
|
51
|
+
signature: args.signature,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
// ── Signer construction ─────────────────────────────────────────────────────
|
|
59
|
+
export function createPrivateKeyHttpSigner(privateKey, chainId) {
|
|
60
|
+
const account = privateKeyToAccount(privateKey);
|
|
61
|
+
return {
|
|
62
|
+
address: account.address,
|
|
63
|
+
chainId,
|
|
64
|
+
signMessage: (msg) => account.signMessage({ message: { raw: msg } }),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// ── Request signing & verification ───────────────────────────────────────────
|
|
68
|
+
export async function signRequestWithErc8128(args) {
|
|
69
|
+
return signRequest(args.input, args.init, args.signer, {
|
|
70
|
+
binding: 'request-bound',
|
|
71
|
+
replay: 'non-replayable',
|
|
72
|
+
ttlSeconds: 60,
|
|
73
|
+
...(args.signOptions ?? {}),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
export async function verifyRequestWithErc8128(args) {
|
|
77
|
+
return erc8128VerifyRequest({
|
|
78
|
+
request: args.request,
|
|
79
|
+
verifyMessage: ethVerifyMessage,
|
|
80
|
+
nonceStore: args.nonceStore,
|
|
81
|
+
policy: {
|
|
82
|
+
maxValiditySec: 300,
|
|
83
|
+
clockSkewSec: 5,
|
|
84
|
+
...args.policy,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=erc8128.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc8128.js","sourceRoot":"","sources":["../../src/auth/erc8128.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACL,WAAW,EACX,aAAa,IAAI,oBAAoB,GAOtC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAIrC,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACrB,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,UAAkB;QAC3C,IAAI,CAAC,EAAE,EAAE,CAAC;QACV,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,EAAE;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAoB,KAAK,EAAE,IAAI,EAAE,EAAE;IAC9D,IAAI,CAAC;QACH,OAAO,MAAM,aAAa,CAAC;YACzB,OAAO,EAAE,IAAI,CAAC,OAAc;YAC5B,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAU,EAAE;YACzC,SAAS,EAAE,IAAI,CAAC,SAAgB;SACjC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,+EAA+E;AAE/E,MAAM,UAAU,0BAA0B,CAAC,UAAe,EAAE,OAAe;IACzE,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAChD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAc;QAC/B,OAAO;QACP,WAAW,EAAE,CAAC,GAAe,EAAE,EAAE,CAC/B,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAK5C;IACC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;QACrD,OAAO,EAAE,eAAe;QACxB,MAAM,EAAE,gBAAgB;QACxB,UAAU,EAAE,EAAE;QACd,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;KAC5B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAI9C;IACC,OAAO,oBAAoB,CAAC;QAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,aAAa,EAAE,gBAAgB;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE;YACN,cAAc,EAAE,GAAG;YACnB,YAAY,EAAE,CAAC;YACf,GAAG,IAAI,CAAC,MAAM;SACf;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* jinn CLI entry. Delegates to cli/index.ts.
|
|
4
|
+
*
|
|
5
|
+
* This file lives under src/bin/ so that `tsc` compiles it to dist/bin/jinn.js.
|
|
6
|
+
* The package.json `bin` field points at the compiled output, making `jinn`
|
|
7
|
+
* available on PATH when the package is installed globally.
|
|
8
|
+
*
|
|
9
|
+
* Contract: spec/2026-04-14-client-surface.md
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
package/dist/bin/jinn.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* jinn CLI entry. Delegates to cli/index.ts.
|
|
4
|
+
*
|
|
5
|
+
* This file lives under src/bin/ so that `tsc` compiles it to dist/bin/jinn.js.
|
|
6
|
+
* The package.json `bin` field points at the compiled output, making `jinn`
|
|
7
|
+
* available on PATH when the package is installed globally.
|
|
8
|
+
*
|
|
9
|
+
* Contract: spec/2026-04-14-client-surface.md
|
|
10
|
+
*/
|
|
11
|
+
import { runCli } from '../cli/index.js';
|
|
12
|
+
runCli(process.argv.slice(2)).catch((err) => {
|
|
13
|
+
// Top-level safety net. runCli is expected to catch its own errors
|
|
14
|
+
// and emit an envelope, so reaching here is itself a defect.
|
|
15
|
+
// Log to stderr; the envelope contract requires stdout.
|
|
16
|
+
console.error('[jinn] internal error: runCli threw instead of emitting an envelope');
|
|
17
|
+
console.error(err);
|
|
18
|
+
process.exit(50);
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=jinn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jinn.js","sourceRoot":"","sources":["../../src/bin/jinn.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC1C,mEAAmE;IACnE,6DAA6D;IAC7D,wDAAwD;IACxD,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACrF,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classify ethers/json-rpc read failures so bootstrap reconciliation does not
|
|
3
|
+
* treat flaky RPC as "service missing on-chain".
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* True when a static call / eth_call likely failed due to transport/RPC, not an
|
|
7
|
+
* authoritative on-chain revert. In this case fleet reconcile must not clear state.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isTransientEthReadError(error: unknown): boolean;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classify ethers/json-rpc read failures so bootstrap reconciliation does not
|
|
3
|
+
* treat flaky RPC as "service missing on-chain".
|
|
4
|
+
*/
|
|
5
|
+
import { flattenErrorMessage } from './tx-retry.js';
|
|
6
|
+
/**
|
|
7
|
+
* True when a static call / eth_call likely failed due to transport/RPC, not an
|
|
8
|
+
* authoritative on-chain revert. In this case fleet reconcile must not clear state.
|
|
9
|
+
*/
|
|
10
|
+
export function isTransientEthReadError(error) {
|
|
11
|
+
const err = error;
|
|
12
|
+
if (err?.code === 'SERVER_ERROR' || err?.code === 'TIMEOUT' || err?.code === 'NETWORK_ERROR') {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
const msg = flattenErrorMessage(error).toLowerCase();
|
|
16
|
+
if (msg.includes('429') || msg.includes('rate limit') || msg.includes('too many requests')) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
if (msg.includes('-32603') ||
|
|
20
|
+
msg.includes('internal json-rpc error') ||
|
|
21
|
+
msg.includes('-32005') ||
|
|
22
|
+
msg.includes('request timed out') ||
|
|
23
|
+
msg.includes('timeout')) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (msg.includes('econnreset') ||
|
|
27
|
+
msg.includes('etimedout') ||
|
|
28
|
+
msg.includes('socket hang up') ||
|
|
29
|
+
msg.includes('fetch failed') ||
|
|
30
|
+
msg.includes('network error') ||
|
|
31
|
+
msg.includes('connection refused') ||
|
|
32
|
+
msg.includes('connect timeout')) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (msg.includes('bad gateway') ||
|
|
36
|
+
msg.includes('service unavailable') ||
|
|
37
|
+
msg.includes('502') ||
|
|
38
|
+
msg.includes('503')) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=chain-read-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-read-errors.js","sourceRoot":"","sources":["../src/chain-read-errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,GAAG,GAAG,KAA0B,CAAC;IACvC,IAAI,GAAG,EAAE,IAAI,KAAK,cAAc,IAAI,GAAG,EAAE,IAAI,KAAK,SAAS,IAAI,GAAG,EAAE,IAAI,KAAK,eAAe,EAAE,CAAC;QAC7F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAErD,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IACE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtB,GAAG,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACvC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtB,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACjC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EACvB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IACE,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC1B,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;QACzB,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC9B,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC5B,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC7B,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAClC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAC/B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IACE,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC3B,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACnC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EACnB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for action verbs (verbs that emit transactions).
|
|
3
|
+
*
|
|
4
|
+
* Contract: spec/2026-04-14-client-surface.md §7.3 (dry-run / yes).
|
|
5
|
+
*/
|
|
6
|
+
import type { CommandContext } from './command.js';
|
|
7
|
+
export interface ConfirmFlags {
|
|
8
|
+
yes: boolean;
|
|
9
|
+
dryRun: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Ensure an action is confirmed before proceeding.
|
|
13
|
+
*
|
|
14
|
+
* - Dry run → always permitted, returns true without any check.
|
|
15
|
+
* - `--yes` → permitted regardless of TTY state.
|
|
16
|
+
* - Non-TTY without `--yes` → emits invalid_invocation (exit 11) and returns false.
|
|
17
|
+
* - TTY without `--yes` → v1 never prompts; emits invalid_invocation and returns false.
|
|
18
|
+
*/
|
|
19
|
+
export declare function ensureConfirmed(ctx: CommandContext, flags: ConfirmFlags): boolean;
|
|
20
|
+
export interface DryRunPayload {
|
|
21
|
+
verb: string;
|
|
22
|
+
description: string;
|
|
23
|
+
plan: unknown[];
|
|
24
|
+
}
|
|
25
|
+
/** Emit a dry-run JSON response (success path; no process exit). */
|
|
26
|
+
export declare function emitDryRun(ctx: CommandContext, payload: DryRunPayload): void;
|