feat: complete Quantumancy web app — full frontend + docs

Frontend (React 18 + TS + Vite):
- Landing: glitching hero, live /api/stats veil ticker, mode cards, featured spirits
- Séance: three.js shader ghost (hue/form per entity, mood + audio-reactive),
  Ouija planchette board spelling utterances, transcript with TTS replay,
  entity dossier, direct contact streaming, passive/active listening
- Modes: Wire Ghost telemetry panel, EVP mic anomaly detection, WebUSB
  RTL-SDR sweep + waterfall (hardware pass pending), Ouija/Direct Contact
- Codex: public registry + entity dossiers, rarity tiers, i18n EN/ES complete
- State: VeilSocket (reconnect/backoff), seance reducer, auth context
- 72 vitest tests green; served by FastAPI at :7777

Docs: README + as-built plans 3-7
This commit is contained in:
Indiana
2026-07-20 21:11:49 +00:00
parent 1ec9ea5863
commit 6edbbbbc2a
48 changed files with 10494 additions and 168 deletions

77
frontend/src/types/webusb.d.ts vendored Normal file
View File

@@ -0,0 +1,77 @@
// Minimal WebUSB ambient declarations — just the surface src/lib/sdr.ts uses.
// WebUSB is not part of TS's dom lib and @types/web doesn't carry it.
interface USBEndpoint {
endpointNumber: number
direction: 'in' | 'out'
type: 'bulk' | 'interrupt' | 'isochronous'
packetSize: number
}
interface USBAlternateInterface {
alternateSetting: number
interfaceClass: number
interfaceSubclass: number
interfaceProtocol: number
interfaceName?: string
endpoints: USBEndpoint[]
}
interface USBInterface {
interfaceNumber: number
alternates: USBAlternateInterface[]
claimed: boolean
}
interface USBConfiguration {
configurationValue: number
configurationName?: string
interfaces: USBInterface[]
}
interface USBDevice {
readonly opened: boolean
readonly configuration: USBConfiguration | null
open(): Promise<void>
close(): Promise<void>
claimInterface(interfaceNumber: number): Promise<void>
releaseInterface(interfaceNumber: number): Promise<void>
selectAlternateInterface(
interfaceNumber: number,
alternateSetting: number,
): Promise<void>
controlTransferOut(
setup: {
requestType: 'standard' | 'class' | 'vendor'
recipient: 'device' | 'interface' | 'endpoint' | 'other'
request: number
value: number
index: number
},
data?: BufferSource,
): Promise<USBOutTransferResult>
transferIn(
endpointNumber: number,
length: number,
): Promise<USBInTransferResult>
}
interface USBInTransferResult {
data?: DataView
status: 'ok' | 'stall' | 'babble'
}
interface USBOutTransferResult {
bytesWritten: number
status: 'ok' | 'stall'
}
interface USB {
requestDevice(options: {
filters: Array<{ vendorId?: number; productId?: number }>
}): Promise<USBDevice>
}
interface Navigator {
readonly usb: USB
}