Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ pnpm build

| Tool | Description |
|------|-------------|
| `tools/traffic` | Passive capture and byte-level analysis of Pangolin BEYOND ⇄ FB4 traffic, on Wireshark's CLI. Driven from Advanced → Traffic in the desktop app, or straight from a terminal — see [tools/traffic/README.md](tools/traffic/README.md). Observation, plus one hand-run experiment (`bin/replay`) that sends BEYOND's own plaintext live-control lines. |
| `tools/traffic` | Passive capture and byte-level analysis of Pangolin BEYOND ⇄ FB4 traffic, on Wireshark's CLI. Run from a terminal — see [tools/traffic/README.md](tools/traffic/README.md). Observation, plus one hand-run experiment (`bin/replay`) that sends BEYOND's own plaintext live-control lines. |

## Architecture

Expand Down
2 changes: 1 addition & 1 deletion docs/event-deployment.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ graph TD

## Troubleshooting

AdvancedOSC in the desktop app is the fastest first look: it shows the
OutputAdvanced in the desktop app is the fastest first look: it shows the
resolved target and port, probes it, reads BEYOND.ini where BEYOND is installed
locally, sends blackout / full white / full amber (one zone or all) and tails
every message in and out.
Expand Down
18 changes: 14 additions & 4 deletions packages/desktop/__tests__/navigation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,27 @@ describe('sidebar navigation', () => {
expect(grouped.length).toBe(new Set(grouped).size);
});

it('keeps running a show to the show, its looks, and its health, ahead of everything else', () => {
expect(NAV_GROUPS[0]).toEqual({ id: 'run', label: 'Run', routes: ['show', 'nova', 'status'] });
it('keeps running a show to the show and its health, ahead of everything else', () => {
expect(NAV_GROUPS[0]).toEqual({ id: 'run', label: 'Run', routes: ['show', 'status'] });
});

it('hides the admin vocabulary under Advanced', () => {
const advanced = NAV_GROUPS.find((g) => g.id === 'advanced')?.routes ?? [];
expect(advanced).toContain('access');
expect(advanced).toContain('settings');
expect(advanced).toContain('devices');
// Packet capture is protocol archaeology, not something an operator needs.
expect(advanced).toContain('traffic');
});

// Looks belong to the artist UI the show serves, and OSC debugging belongs to
// the target it debugs — neither is a destination in the shell.
it('leaves looks and OSC debugging out of the sidebar entirely', () => {
const everything = [...NAV_GROUPS.flatMap((g) => g.routes), ...UNLISTED_ROUTES];
expect(everything).not.toContain('nova');
expect(everything).not.toContain('osc');
expect(everything).not.toContain('traffic');
expect(isRoute('nova')).toBe(false);
expect(isRoute('osc')).toBe(false);
expect(isRoute('traffic')).toBe(false);
});

it('labels every route', () => {
Expand Down
66 changes: 0 additions & 66 deletions packages/desktop/__tests__/nova.test.ts

This file was deleted.

69 changes: 0 additions & 69 deletions packages/desktop/__tests__/traffic.test.ts

This file was deleted.

52 changes: 2 additions & 50 deletions packages/desktop/src/main/ipc.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { browse } from '@wavegrid/discovery';
import { autoMap, resolveLayout } from '@wavegrid/layout';
import { openStore } from '@wavegrid/settings';
import { dialog, ipcMain } from 'electron';
import { ipcMain } from 'electron';

import {
sendToBrain,
Expand All @@ -15,7 +15,6 @@ import { buildDoctorReport } from '@/main/doctor';
import { invalidateLaserView, type LaserSyncState, syncLaser } from '@/main/laser-view';
import { buildLightMapView } from '@/main/light-map';
import { buildNetworkReport } from '@/main/network';
import { applyNovaLook, novaBlackout, setNovaSpeed } from '@/main/nova';
import {
clearOscLog,
oscDebugState,
Expand All @@ -32,19 +31,6 @@ import {
knownPresets,
toEditable
} from '@/main/project-config';
import {
analyzeCapture,
captureState,
compareCaptures,
listCaptures,
readSettings,
startCapture,
stopCapture,
trafficDiscover,
trafficDoctor,
trafficInterfaces,
writeSettings
} from '@/main/traffic';
import { exportProjectToFile, importProjectFromFile } from '@/main/transfer';
import type {
DeviceInfo,
Expand All @@ -60,7 +46,6 @@ import type {
ShardRange,
StoreClearResult,
StoreInfo,
TrafficCaptureRequest,
UserRole
} from '@/types/ipc';

Expand Down Expand Up @@ -327,12 +312,6 @@ export function registerAllIpc(): void {
sendToBrain(project, { type: 'calibration_mode', enabled: false });
});

// Nova panel: run an amber look on the live rig. The look id is validated
// against the shared catalog in `nova.ts`; nothing else can be injected.
ipcMain.handle('nova:apply', (_e, project: string, look: string) => applyNovaLook(project, look));
ipcMain.handle('nova:speed', (_e, project: string, value: number) => setNovaSpeed(project, value));
ipcMain.handle('nova:blackout', (_e, project: string) => novaBlackout(project));

ipcMain.handle('projects:exportToFile', (_e, project: string, includeSecrets: boolean) =>
exportProjectToFile(project, includeSecrets)
);
Expand Down Expand Up @@ -376,34 +355,7 @@ export function registerAllIpc(): void {
return { ...summary, info: storeInfo() };
});

// Traffic panel (Advanced → Traffic): passive observation only. Wireshark is
// looked for when the panel asks, never at startup, so a machine without it
// runs the rest of the app untouched.
ipcMain.handle('traffic:doctor', () => trafficDoctor());
ipcMain.handle('traffic:interfaces', (_e, host?: string) => trafficInterfaces(host));
ipcMain.handle('traffic:discover', (_e, iface?: string, seconds?: number) =>
trafficDiscover(iface, seconds)
);
ipcMain.handle('traffic:start', (_e, req: TrafficCaptureRequest) => startCapture(req));
ipcMain.handle('traffic:stop', () => stopCapture());
ipcMain.handle('traffic:status', () => captureState());
ipcMain.handle('traffic:captures', () => listCaptures());
ipcMain.handle('traffic:analyze', (_e, path: string, host?: string) => analyzeCapture(path, host));
ipcMain.handle('traffic:compare', (_e, a: string, b: string, host?: string) =>
compareCaptures(a, b, host)
);
ipcMain.handle('traffic:settings', () => readSettings());
ipcMain.handle('traffic:setCaptureDir', (_e, dir: string) => writeSettings(dir));
ipcMain.handle('traffic:chooseCaptureDir', async () => {
const { canceled, filePaths } = await dialog.showOpenDialog({
title: 'Where should captures be saved?',
properties: ['openDirectory', 'createDirectory']
});
if (canceled || !filePaths[0]) return null;
return writeSettings(filePaths[0]);
});

// OSC debugger (Advanced → OSC). Local UDP only, single messages, at the
// OSC debugger (Output → Advanced). Local UDP only, single messages, at the
// project's own configured target — never a running show.
ipcMain.handle('oscDebug:state', (_e, project: string) => oscDebugState(project));
ipcMain.handle('oscDebug:probe', (_e, project: string) => probeOscTarget(project));
Expand Down
38 changes: 0 additions & 38 deletions packages/desktop/src/main/nova.ts

This file was deleted.

2 changes: 1 addition & 1 deletion packages/desktop/src/main/osc-debug.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* The OSC debugger's back end (AdvancedOSC).
* The OSC debugger's back end (OutputAdvanced).
*
* Debugging "the lasers aren't responding" needs three things a show cannot
* give you: is anything listening where we send, what exactly goes on the wire,
Expand Down
Loading
Loading