Add fleet registry removal with confirm modal and agent_removed WS.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled

Operators can remove machines from Crucible and dashboard rosters with honest messaging that deletion is registry-only; bulk select, oath ledger entries, and Go/Vitest coverage included.
This commit is contained in:
AetherForge
2026-06-07 18:23:41 -07:00
parent e1b1a2aa65
commit 07fdb39b63
21 changed files with 533 additions and 53 deletions

View File

@@ -1,13 +1,15 @@
import { useState, useEffect } from 'react';
import { api } from '../../api/client';
import type { Agent } from '../../types';
import { HelpTip } from '../HelpTip';
interface Props {
agent: Agent;
onUpdated?: (agent: Agent) => void;
requestDeleteConfirm?: (req: { count: number; agentName?: string }) => Promise<boolean>;
}
export default function CrucibleAgentMeta({ agent, onUpdated }: Props) {
export default function CrucibleAgentMeta({ agent, onUpdated, requestDeleteConfirm }: Props) {
const [notesDraft, setNotesDraft] = useState(agent.notes || '');
const [tagsDraft, setTagsDraft] = useState((agent.tags || []).join(', '));
const [saving, setSaving] = useState(false);
@@ -36,7 +38,12 @@ export default function CrucibleAgentMeta({ agent, onUpdated }: Props) {
};
const deleteFromRoster = async () => {
if (!window.confirm('Remove this machine from the fleet roster? This cannot be undone.')) return;
const confirmed = requestDeleteConfirm
? await requestDeleteConfirm({ count: 1, agentName: agent.name })
: window.confirm(
'Remove from fleet — does not uninstall agent on host. Remove this machine from the registry?',
);
if (!confirmed) return;
try {
await api.deleteAgent(agent.id);
} catch (err) {
@@ -111,20 +118,23 @@ export default function CrucibleAgentMeta({ agent, onUpdated }: Props) {
className="btn btn-sm"
style={{ background: 'rgba(255,100,0,0.15)', border: '1px solid #ff8844', color: '#ffaa66' }}
onClick={() => void uninstallAndDelete()}
title="Send uninstall command to agent, then remove from roster"
title="Send uninstall command to agent, then remove from fleet registry"
>
Uninstall + Delete
Uninstall + Remove
</button>
)}
<button
type="button"
className="btn btn-sm"
style={{ background: 'rgba(255,40,40,0.15)', border: '1px solid #ff4444', color: '#ff6666' }}
onClick={() => void deleteFromRoster()}
title="Remove this machine from the fleet roster permanently"
>
Delete from Roster
</button>
<span style={{ display: 'inline-flex', alignItems: 'center', gap: '0.25rem' }}>
<button
type="button"
className="btn btn-sm"
style={{ background: 'rgba(255,40,40,0.15)', border: '1px solid #ff4444', color: '#ff6666' }}
onClick={() => void deleteFromRoster()}
title="Remove from fleet registry only — does not uninstall on host"
>
Remove from fleet
</button>
<HelpTip field="crucible_delete_roster" />
</span>
{msg && <span className="form-hint">{msg}</span>}
</div>
</div>