[TSM.ID].[11031972] PXE : Platform X Ecosystem I [118 Module -LIVE-]

This commit is contained in:
TSM.ID
2026-05-25 03:51:34 +07:00
parent e820143b3c
commit 8f1a37129a
354 changed files with 0 additions and 0 deletions
@@ -0,0 +1,11 @@
# XCU Omni-Engine Environment Configuration
# Lokasi: xcu-command-center/.env
# ==========================================
# URL WebSocket untuk IAM Gatekeeper (Otentikasi, MFA, Security Enclave)
# Ganti dengan WSS Production Anda jika di-deploy ke VPS
VITE_GATEKEEPER_WS_URL=wss://gatekeeper.x.jumpa.id
# URL WebSocket untuk Omni-Relay (Sinkronisasi Komersial/Kinetik)
# Ganti dengan WSS Production Anda jika di-deploy ke VPS
VITE_OMNI_RELAY_WS_URL=wss://relay.x.jumpa.id
+14
View File
@@ -0,0 +1,14 @@
# [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
[package]
name = "xcu-command-center"
version = "0.1.0"
edition = "2021"
authors = ["TSM.ID <tsm@tsm.id>"]
description = "[TSM.ID].[11031972] Supreme Command Center dashboard bridge"
[lib]
path = "rust_src/lib.rs"
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"
+16
View File
@@ -0,0 +1,16 @@
# React + Vite
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
Currently, two official plugins are available:
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)
## React Compiler
The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
## Expanding the ESLint configuration
If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.
@@ -0,0 +1,17 @@
import puppeteer from 'puppeteer';
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
page.on('console', msg => console.log('PAGE LOG:', msg.text()));
page.on('pageerror', error => console.log('PAGE ERROR:', error.message));
page.on('requestfailed', request => console.log('REQUEST FAILED:', request.url(), request.failure().errorText));
await page.goto('http://localhost:5173', { waitUntil: 'networkidle0' });
// Wait a bit to ensure everything is loaded
await new Promise(r => setTimeout(r, 2000));
await browser.close();
})();
@@ -0,0 +1,31 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import { defineConfig, globalIgnores } from 'eslint/config'
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{js,jsx}'],
extends: [
js.configs.recommended,
reactHooks.configs.flat.recommended,
reactRefresh.configs.vite,
],
languageOptions: {
globals: globals.browser,
parserOptions: { ecmaFeatures: { jsx: true } },
},
rules: {
'no-unused-vars': 'off',
'no-empty': 'off',
'react-refresh/only-export-components': 'off',
'react-hooks/exhaustive-deps': 'off',
'react-hooks/rules-of-hooks': 'off',
'react-hooks/set-state-in-effect': 'off',
'react-hooks/purity': 'off',
'react/prop-types': 'off'
}
},
])
+13
View File
@@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>XCU Command Center</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,37 @@
{
"name": "xcu-command-center",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"predev": "node ../forge_signature.js",
"dev": "vite",
"prebuild": "node ../forge_signature.js",
"build": "vite build",
"lint": "eslint .",
"preview": "vite preview"
},
"dependencies": {
"@react-three/drei": "^10.7.7",
"@react-three/fiber": "^9.6.1",
"@simplewebauthn/browser": "^13.3.0",
"html5-qrcode": "^2.3.8",
"mermaid": "^11.14.0",
"puppeteer": "^24.43.0",
"react": "^19.2.5",
"react-dom": "^19.2.5",
"react-qr-code": "^2.0.21",
"three": "^0.184.0"
},
"devDependencies": {
"@eslint/js": "^10.0.1",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^6.0.1",
"eslint": "^10.2.1",
"eslint-plugin-react-hooks": "^7.1.1",
"eslint-plugin-react-refresh": "^0.5.2",
"globals": "^17.5.0",
"vite": "^8.0.10"
}
}
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.3 KiB

@@ -0,0 +1,24 @@
<svg xmlns="http://www.w3.org/2000/svg">
<symbol id="bluesky-icon" viewBox="0 0 16 17">
<g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
<defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
</symbol>
<symbol id="discord-icon" viewBox="0 0 20 19">
<path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
</symbol>
<symbol id="documentation-icon" viewBox="0 0 21 20">
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
</symbol>
<symbol id="github-icon" viewBox="0 0 19 19">
<path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
</symbol>
<symbol id="social-icon" viewBox="0 0 20 20">
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
</symbol>
<symbol id="x-icon" viewBox="0 0 19 19">
<path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

@@ -0,0 +1,57 @@
/**
* XCU Ultra - Phantom Quantum SDK
* Modul 76: Leviathan Overlay Integrator
*
* Mendistribusikan pustaka WebTransport dan WebAssembly khusus
* untuk melakukan bypass protokol TCP standar dan mengaktifkan
* transmisi CRDT OMNI secara seketika (0ms latensi perseptual).
*/
class PhantomQuantumSDK {
constructor() {
this.version = "7.6.0-LEVIATHAN";
this.socket = null;
this.isReady = false;
this.callbacks = {};
console.log(`[XCU] Phantom Quantum SDK ${this.version} Initialized.`);
}
async ignite(tetherUrl) {
return new Promise((resolve, reject) => {
console.log(`[XCU] Menembus Firewall menuju: ${tetherUrl}`);
try {
// Mensimulasikan koneksi WebTransport/QUIC bypass
setTimeout(() => {
this.isReady = true;
console.log("[XCU] Tautan Kuantum Berhasil Dikunci.");
resolve(true);
}, 500);
} catch (e) {
reject(e);
}
});
}
send(payload) {
if (!this.isReady) throw new Error("Quantum Link Not Ready");
// Simulasi pengiriman data CRDT
if (this.callbacks['data']) {
// Echo balik sebagai simulasi jaringan
setTimeout(() => {
this.callbacks['data'](payload);
}, 10);
}
}
on(event, callback) {
this.callbacks[event] = callback;
}
shutdown() {
this.isReady = false;
this.callbacks = {};
console.log("[XCU] Tautan Kuantum Terputus.");
}
}
window.PhantomQuantumSDK = PhantomQuantumSDK;
@@ -0,0 +1,16 @@
// INI ADALAH MOCK LOKAL UNTUK WINDOWS.
// SAAT DI DOCKER VPS, FILE INI AKAN DITIMPA OLEH BINARY WASM RUST YANG ASLI.
export async function enable_post_quantum_shield() {
console.log("XCU: THE POST-QUANTUM SHIELD ACTIVATED! (Mock Local)");
return Promise.resolve();
}
export async function enable_aegis_forensic_watermark(seed) {
console.log("XCU: THE AEGIS MATRIX ENGAGED! Seed: " + seed + " (Mock Local)");
return Promise.resolve();
}
export default async function init() {
console.log("WASM Initialized (Mock Local)");
return Promise.resolve();
}
@@ -0,0 +1,103 @@
//! [TSM.ID].[11031972] -- Platform X Ecosystem
//! xcu-command-center -- Supreme Command Center dashboard bridge
#![deny(warnings)]
use serde::{Serialize, Deserialize};
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
#[derive(Debug)]
pub enum BridgeError {
ConnectionFailed(String),
ConfigError(String),
OperationFailed(String),
NotReady,
}
impl std::fmt::Display for BridgeError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::ConnectionFailed(e) => write!(f, "Connection failed: {e}"),
Self::ConfigError(e) => write!(f, "Config error: {e}"),
Self::OperationFailed(e) => write!(f, "Op failed: {e}"),
Self::NotReady => write!(f, "Not ready"),
}
}
}
impl std::error::Error for BridgeError {}
pub type Result<T> = std::result::Result<T, BridgeError>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BridgeConfig {
pub name: String,
pub endpoint: String,
pub params: HashMap<String, String>,
pub enabled: bool,
}
impl BridgeConfig {
pub fn new(name: &str, endpoint: &str) -> Self {
Self { name: name.to_string(), endpoint: endpoint.to_string(), params: HashMap::new(), enabled: true }
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum BridgeState { Disconnected, Connecting, Connected, Error(String) }
pub struct Bridge {
config: BridgeConfig,
state: Arc<Mutex<BridgeState>>,
message_count: Arc<Mutex<u64>>,
}
impl Bridge {
pub fn new(config: BridgeConfig) -> Result<Self> {
Ok(Self {
config, state: Arc::new(Mutex::new(BridgeState::Disconnected)),
message_count: Arc::new(Mutex::new(0)),
})
}
pub fn connect(&self) -> Result<()> {
let mut s = self.state.lock().map_err(|e| BridgeError::OperationFailed(e.to_string()))?;
*s = BridgeState::Connecting;
*s = BridgeState::Connected;
Ok(())
}
pub fn disconnect(&self) -> Result<()> {
let mut s = self.state.lock().map_err(|e| BridgeError::OperationFailed(e.to_string()))?;
*s = BridgeState::Disconnected;
Ok(())
}
pub fn send(&self, _payload: &[u8]) -> Result<u64> {
let s = self.state.lock().map_err(|e| BridgeError::OperationFailed(e.to_string()))?;
if *s != BridgeState::Connected { return Err(BridgeError::NotReady); }
drop(s);
let mut c = self.message_count.lock().map_err(|e| BridgeError::OperationFailed(e.to_string()))?;
*c += 1;
Ok(*c)
}
pub fn state(&self) -> Result<BridgeState> {
Ok(self.state.lock().map_err(|e| BridgeError::OperationFailed(e.to_string()))?.clone())
}
pub fn config(&self) -> &BridgeConfig { &self.config }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bridge() {
let b = Bridge::new(BridgeConfig::new("xcu-command-center", "localhost:3000")).unwrap();
assert_eq!(b.state().unwrap(), BridgeState::Disconnected);
b.connect().unwrap();
assert_eq!(b.state().unwrap(), BridgeState::Connected);
b.send(b"hello").unwrap();
b.disconnect().unwrap();
assert_eq!(b.state().unwrap(), BridgeState::Disconnected);
}
}
+184
View File
@@ -0,0 +1,184 @@
.counter {
font-size: 16px;
padding: 5px 10px;
border-radius: 5px;
color: var(--accent);
background: var(--accent-bg);
border: 2px solid transparent;
transition: border-color 0.3s;
margin-bottom: 24px;
&:hover {
border-color: var(--accent-border);
}
&:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
}
.hero {
position: relative;
.base,
.framework,
.vite {
inset-inline: 0;
margin: 0 auto;
}
.base {
width: 170px;
position: relative;
z-index: 0;
}
.framework,
.vite {
position: absolute;
}
.framework {
z-index: 1;
top: 34px;
height: 28px;
transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg)
scale(1.4);
}
.vite {
z-index: 0;
top: 107px;
height: 26px;
width: auto;
transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg)
scale(0.8);
}
}
#center {
display: flex;
flex-direction: column;
gap: 25px;
place-content: center;
place-items: center;
flex-grow: 1;
@media (max-width: 1024px) {
padding: 32px 20px 24px;
gap: 18px;
}
}
#next-steps {
display: flex;
border-top: 1px solid var(--border);
text-align: left;
& > div {
flex: 1 1 0;
padding: 32px;
@media (max-width: 1024px) {
padding: 24px 20px;
}
}
.icon {
margin-bottom: 16px;
width: 22px;
height: 22px;
}
@media (max-width: 1024px) {
flex-direction: column;
text-align: center;
}
}
#docs {
border-right: 1px solid var(--border);
@media (max-width: 1024px) {
border-right: none;
border-bottom: 1px solid var(--border);
}
}
#next-steps ul {
list-style: none;
padding: 0;
display: flex;
gap: 8px;
margin: 32px 0 0;
.logo {
height: 18px;
}
a {
color: var(--text-h);
font-size: 16px;
border-radius: 6px;
background: var(--social-bg);
display: flex;
padding: 6px 12px;
align-items: center;
gap: 8px;
text-decoration: none;
transition: box-shadow 0.3s;
&:hover {
box-shadow: var(--shadow);
}
.button-icon {
height: 18px;
width: 18px;
}
}
@media (max-width: 1024px) {
margin-top: 20px;
flex-wrap: wrap;
justify-content: center;
li {
flex: 1 1 calc(50% - 8px);
}
a {
width: 100%;
justify-content: center;
box-sizing: border-box;
}
}
}
#spacer {
height: 88px;
border-top: 1px solid var(--border);
@media (max-width: 1024px) {
height: 48px;
}
}
.ticks {
position: relative;
width: 100%;
&::before,
&::after {
content: '';
position: absolute;
top: -4.5px;
border: 5px solid transparent;
}
&::before {
left: 0;
border-left-color: var(--border);
}
&::after {
right: 0;
border-right-color: var(--border);
}
}
+47
View File
@@ -0,0 +1,47 @@
import { useState, useEffect } from 'react';
import './App.css';
import './TenantTheme.css';
import { useAuth } from './context/AuthContext';
import { useIam } from './context/IamContext';
import LoginGateway from './components/LoginGateway';
import SupremeDashboard from './layouts/SupremeDashboard';
import TenantDashboard from './layouts/TenantDashboard';
import AuthenticatorPWA from './components/AuthenticatorPWA';
function App() {
const { isAuthenticated, isLoading } = useAuth();
const { identity } = useIam();
if (window.location.pathname === '/authenticator') {
return <AuthenticatorPWA />;
}
if (isLoading) {
return <div style={{width: '100vw', height: '100vh', background: 'black', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#00f3ff', fontFamily: 'monospace'}}>INITIALIZING QUANTUM STATE...</div>;
}
// Auth Guard: Memblokir akses Dasbor jika belum Login!
if (!isAuthenticated) {
return <LoginGateway />;
}
// Mencegah Race Condition: Menunggu IamContext menyelesasikan ekstraksi JWT
if (!identity) {
return <div style={{width: '100vw', height: '100vh', background: 'black', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#a855f7', fontFamily: 'monospace', letterSpacing: '2px'}}>EXTRACTING QUANTUM IDENTITY...</div>;
}
// SHAPESHIFTING UI (FASE 40) - Pemisahan Mutlak DOM Tree
if (identity.role === 'supreme_admin') {
return <SupremeDashboard />;
}
if (identity.role === 'tenant') {
return <TenantDashboard />;
}
// Fallback Darurat
return <div style={{color: 'red', padding: '50px'}}>CRITICAL ERROR: ROLE NOT RECOGNIZED</div>;
}
export default App;
@@ -0,0 +1,34 @@
/* Tenant Theme - Commercial Gateway (Midnight Purple & Dark Indigo) */
.tenant-theme {
background-color: var(--bg-dark);
background-image:
radial-gradient(circle at 50% 0%, rgba(168, 85, 247, 0.05), transparent 50%),
radial-gradient(circle at 100% 100%, rgba(79, 70, 229, 0.05), transparent 50%);
}
body.light-theme .tenant-theme {
background-color: var(--bg-dark);
}
.tenant-sidebar {
border-right: 1px solid var(--glass-border);
background: var(--bg-panel);
box-shadow: 5px 0 30px rgba(0, 0, 0, 0.1);
}
.tenant-sidebar .nav-link {
color: var(--text-muted);
}
.tenant-sidebar .nav-link:hover {
color: var(--accent-purple);
background: rgba(168, 85, 247, 0.05);
box-shadow: inset 2px 0 0 var(--accent-purple);
}
.tenant-sidebar .nav-link.active {
color: var(--text-main);
background: rgba(168, 85, 247, 0.15);
border-left-color: var(--accent-purple);
box-shadow: inset 4px 0 0 var(--accent-purple), inset 0 0 20px rgba(168, 85, 247, 0.1);
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.5 KiB

@@ -0,0 +1,31 @@
import React from 'react';
import { SYSTEM_VERSION } from '../version';
import { useI18n } from '../context/I18nContext';
export default function About() {
const { t } = useI18n();
return (
<div style={{ padding: '20px', color: '#fff' }}>
<h2 style={{ marginBottom: '20px', color: 'var(--accent-cyan)' }}>{t('about')} XCU Ultra</h2>
<div className="glass-panel" style={{ padding: '30px' }}>
<h3 style={{ marginBottom: '10px' }}>SYSTEM SPECIFICATIONS</h3>
<ul style={{ listStyle: 'none', padding: 0, lineHeight: '2' }}>
<li><strong style={{ color: '#a855f7' }}>Engine:</strong> Rust (Glommio, eBPF, WebTransport)</li>
<li><strong style={{ color: '#a855f7' }}>Frontend:</strong> React, WASM, Holographic Canvas</li>
<li><strong style={{ color: '#a855f7' }}>Billing Matrix:</strong> DuckDB Embedded Analytics</li>
<li><strong style={{ color: '#a855f7' }}>IAM Gatekeeper:</strong> Zero-Database Stateless JWT</li>
<li><strong style={{ color: '#a855f7' }}>Security Protocol:</strong> Cerberus Quantum Firewall</li>
<li><strong style={{ color: '#a855f7' }}>Self-Destruct Mechanism:</strong> Ouroboros Protocol</li>
</ul>
<div style={{ marginTop: '40px', padding: '15px', background: 'rgba(0,0,0,0.5)', borderLeft: '4px solid var(--accent-cyan)' }}>
<h4 style={{ margin: 0, color: 'var(--text-muted)', fontSize: '0.9rem' }}>ABSOLUTE VERSIONING (ANTIGRAVITY UID)</h4>
<p style={{ margin: '10px 0 0 0', fontFamily: 'monospace', fontSize: '1.2rem', color: '#fff' }}>
{SYSTEM_VERSION}
</p>
</div>
</div>
</div>
);
}
@@ -0,0 +1,133 @@
import { useState, useEffect, useRef } from 'react';
import { Html5Qrcode } from 'html5-qrcode';
export default function AuthenticatorPWA() {
const [status, setStatus] = useState('MENUNGGU KAMERA...');
const [scanning, setScanning] = useState(true);
const scannerRef = useRef(null);
// Web Crypto API HMAC-SHA256
const signChallenge = async (secretHex, challenge) => {
const enc = new TextEncoder();
// Convert hex string to Uint8Array
const secretBytes = new Uint8Array(secretHex.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
const key = await window.crypto.subtle.importKey(
'raw', secretBytes, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']
);
const signature = await window.crypto.subtle.sign('HMAC', key, enc.encode(challenge));
// Convert signature back to hex
return Array.from(new Uint8Array(signature)).map(b => b.toString(16).padStart(2, '0')).join('');
};
useEffect(() => {
document.body.style.margin = "0";
document.body.style.background = "#000";
document.body.style.color = "#fff";
document.body.style.fontFamily = "monospace";
const html5QrCode = new Html5Qrcode("reader");
scannerRef.current = html5QrCode;
html5QrCode.start(
{ facingMode: "environment" },
{ fps: 10, qrbox: { width: 250, height: 250 } },
async (decodedText) => {
setScanning(false);
html5QrCode.stop();
const gatekeeperUrl = import.meta.env.VITE_GATEKEEPER_WS_URL || 'ws://localhost:4001';
const ws = new WebSocket(gatekeeperUrl);
if (decodedText.startsWith('PAIR|')) {
setStatus('MATRIKS SETUP DITEMUKAN. MENGAWINKAN KUNCI...');
const parts = decodedText.split('|');
const targetKeyId = parts[1];
const secret = parts[2];
localStorage.setItem('XCU_OPTICAL_SECRET', JSON.stringify({ targetKeyId, secret }));
ws.onopen = () => ws.send(JSON.stringify({ type: 'CONFIRM_OPTICAL_PAIRING', payload: { targetKeyId, secret } }));
ws.onmessage = (e) => {
const data = JSON.parse(e.data);
if (data.type === 'OPTICAL_PAIRING_SUCCESS') setStatus('✅ PERANGKAT BERHASIL DIKAWINKAN');
else setStatus('❌ GAGAL: ' + data.payload);
ws.close();
};
} else {
setStatus('MATRIKS TANTANGAN DITEMUKAN. MENGOTENTIKASI...');
const stored = localStorage.getItem('XCU_OPTICAL_SECRET');
if (!stored) {
setStatus('❌ PONSEL INI BELUM DIPAIRING DARI DASBOR');
return;
}
const { targetKeyId, secret } = JSON.parse(stored);
const parts = decodedText.split('|');
const opticalCode = parts[0];
const sessionId = parts[1] === 'null' ? null : parts[1];
// Sign the challenge
const signature = await signChallenge(secret, opticalCode);
ws.onopen = () => {
ws.send(JSON.stringify({
type: 'AEGIS_AUTH_REQUEST',
payload: { authType: 'OPTICAL_SYNC', keyPayload: { targetKeyId, signature, challenge: opticalCode }, sessionId }
}));
};
ws.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
if (data.type === 'AUTH_SUCCESS' || data.type === 'MFA_SEQUENCE_STARTED' || data.type === 'MFA_STEP_REQUIRED') {
setStatus('⚡ OTORISASI BERHASIL ⚡');
ws.close();
} else if (data.type === 'AUTH_FAILED') {
setStatus('❌ DITOLAK: ' + data.payload);
ws.close();
}
} catch(e) {}
};
}
ws.onerror = () => setStatus('❌ KONEKSI GATEKEEPER GAGAL');
},
(errorMessage) => {}
).catch((err) => setStatus('GAGAL MENGAKSES KAMERA: ' + err));
return () => {
if (scannerRef.current && scannerRef.current.isScanning) {
scannerRef.current.stop();
}
};
}, []);
return (
<div style={{display: 'flex', flexDirection: 'column', height: '100vh', padding: '20px', boxSizing: 'border-box'}}>
<div style={{textAlign: 'center', marginBottom: '30px'}}>
<h1 style={{color: 'var(--accent-purple)', fontSize: '2rem', margin: '0'}}>XCU</h1>
<p style={{color: '#fff', letterSpacing: '2px', fontSize: '0.8rem'}}>AUTHENTICATOR PWA</p>
</div>
<div style={{flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center'}}>
{scanning ? (
<div id="reader" style={{width: '100%', maxWidth: '400px', borderRadius: '12px', overflow: 'hidden', border: '2px solid var(--accent-purple)'}}></div>
) : (
<div style={{fontSize: '5rem', marginBottom: '20px'}}>
{status.includes('BERHASIL') ? '🔓' : '🔒'}
</div>
)}
<div style={{
marginTop: '30px', padding: '15px', background: 'rgba(168, 85, 247, 0.1)',
border: '1px solid var(--accent-purple)', borderRadius: '8px',
color: status.includes('BERHASIL') ? 'var(--accent-green)' : (status.includes('❌') ? 'var(--accent-red)' : 'var(--accent-purple)'),
textAlign: 'center', fontWeight: 'bold'
}}>
{status}
</div>
</div>
<div style={{textAlign: 'center', marginTop: 'auto', color: 'var(--text-muted)', fontSize: '0.7rem'}}>
ARAHKAN KAMERA KE MATRIKS KUANTUM DI LAYAR MONITOR
</div>
</div>
);
}
@@ -0,0 +1,268 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
// Bridge Manager — ONE-WAY PUSH Control: XCU → JUMPA
// View/Add bridge mappings, trigger sync to JUMPA system_features
import { useState, useEffect, useCallback } from 'react';
import { useModuleRegistry } from '../context/ModuleRegistryContext';
const API_BASE = import.meta.env.VITE_XCU_API_URL || '';
export default function BridgeManager() {
const { allModules, getModuleName } = useModuleRegistry();
const [mappings, setMappings] = useState([]);
const [tenants, setTenants] = useState([]);
const [loading, setLoading] = useState(true);
const [syncResult, setSyncResult] = useState(null);
const [syncing, setSyncing] = useState(false);
// Add mapping form
const [showAddForm, setShowAddForm] = useState(false);
const [newModuleId, setNewModuleId] = useState('');
const [newFeatureKey, setNewFeatureKey] = useState('');
const [isAdding, setIsAdding] = useState(false);
// Search
const [searchQuery, setSearchQuery] = useState('');
const fetchMappings = useCallback(async () => {
try {
const [mapRes, tenantRes] = await Promise.all([
fetch(`${API_BASE}/xcu-api/v1/bridge/mappings`),
fetch(`${API_BASE}/xcu-api/v1/tenants`)
]);
if (mapRes.ok) setMappings(await mapRes.json());
if (tenantRes.ok) setTenants(await tenantRes.json());
} catch (err) {
console.error('[BRIDGE] Fetch error:', err.message);
} finally {
setLoading(false);
}
}, []);
useEffect(() => { fetchMappings(); }, [fetchMappings]);
// Group mappings by module
const groupedMappings = {};
mappings.forEach(m => {
if (!groupedMappings[m.xcu_module_id]) {
groupedMappings[m.xcu_module_id] = [];
}
groupedMappings[m.xcu_module_id].push(m.jumpa_feature_key);
});
const modulesWithMappings = Object.keys(groupedMappings).length;
const totalFeaturesCovered = new Set(mappings.map(m => m.jumpa_feature_key)).size;
// Sync
const handleSync = async (tenantKey) => {
setSyncing(true);
setSyncResult(null);
try {
const res = await fetch(`${API_BASE}/xcu-api/v1/bridge/sync`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ tenant_key: tenantKey })
});
const data = await res.json();
setSyncResult(data);
} catch (err) {
setSyncResult({ error: err.message });
} finally {
setSyncing(false);
}
};
// Add mapping
const handleAddMapping = async () => {
if (!newModuleId || !newFeatureKey) return;
setIsAdding(true);
try {
await fetch(`${API_BASE}/xcu-api/v1/bridge/mappings`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ xcu_module_id: newModuleId, jumpa_feature_key: newFeatureKey })
});
setNewModuleId('');
setNewFeatureKey('');
setShowAddForm(false);
await fetchMappings();
} catch (err) {
console.error(err);
} finally {
setIsAdding(false);
}
};
// Filter
const q = searchQuery.toLowerCase();
const filteredModuleIds = Object.keys(groupedMappings)
.filter(modId => !q || modId.includes(q) || getModuleName(modId).toLowerCase().includes(q) ||
groupedMappings[modId].some(fk => fk.toLowerCase().includes(q)))
.sort((a, b) => {
const numA = parseInt(a.replace('m', ''));
const numB = parseInt(b.replace('m', ''));
return numA - numB;
});
if (loading) {
return (
<div style={{display: 'flex', alignItems: 'center', justifyContent: 'center', height: '300px', color: 'var(--accent-cyan)', fontFamily: 'monospace'}}>
LOADING BRIDGE MATRIX...
</div>
);
}
return (
<div style={{animation: 'fadeIn 0.5s ease-out'}}>
{/* Header */}
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: '30px', flexWrap: 'wrap', gap: '20px'}}>
<div>
<h2 style={{color: 'var(--text-main)', fontFamily: 'monospace', letterSpacing: '2px', marginBottom: '10px'}}>
BRIDGE CONTROL ONE-WAY PUSH
</h2>
<p style={{color: 'var(--text-muted)', fontSize: '0.9rem'}}>
XCU JUMPA.ID | Mapping modul ke system_features | JUMPA <span style={{color: 'var(--accent-red)'}}>TIDAK BISA</span> balik
</p>
</div>
<div style={{display: 'flex', gap: '10px', alignItems: 'center', flexWrap: 'wrap'}}>
<div style={{background: 'rgba(0, 243, 255, 0.1)', border: '1px solid var(--accent-cyan)', padding: '10px 20px', borderRadius: '8px', fontFamily: 'monospace', textAlign: 'center'}}>
<div style={{color: 'var(--accent-cyan)', fontSize: '1.6rem', fontWeight: 'bold'}}>{mappings.length}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.65rem', letterSpacing: '1px'}}>MAPPINGS</div>
</div>
<div style={{background: 'rgba(168, 85, 247, 0.1)', border: '1px solid var(--accent-purple)', padding: '10px 20px', borderRadius: '8px', fontFamily: 'monospace', textAlign: 'center'}}>
<div style={{color: 'var(--accent-purple)', fontSize: '1.6rem', fontWeight: 'bold'}}>{modulesWithMappings}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.65rem', letterSpacing: '1px'}}>MODULES</div>
</div>
<div style={{background: 'rgba(16, 185, 129, 0.1)', border: '1px solid var(--accent-green)', padding: '10px 20px', borderRadius: '8px', fontFamily: 'monospace', textAlign: 'center'}}>
<div style={{color: 'var(--accent-green)', fontSize: '1.6rem', fontWeight: 'bold'}}>{totalFeaturesCovered}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.65rem', letterSpacing: '1px'}}>FEATURES</div>
</div>
<button onClick={() => setShowAddForm(!showAddForm)} style={{
padding: '10px 20px', background: showAddForm ? 'var(--accent-cyan)' : 'transparent',
border: '1px solid var(--accent-cyan)', borderRadius: '8px', cursor: 'pointer', fontFamily: 'monospace',
color: showAddForm ? '#000' : 'var(--accent-cyan)', fontWeight: 'bold'
}}>+ ADD MAPPING</button>
</div>
</div>
{/* Sync Panel */}
<div className="glass-panel" style={{
padding: '20px', marginBottom: '25px', borderLeft: '4px solid var(--accent-green)',
display: 'flex', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: '15px'
}}>
<div>
<h3 style={{color: 'var(--accent-green)', fontFamily: 'monospace', fontSize: '0.9rem', marginBottom: '5px'}}>
ONE-WAY PUSH SYNC
</h3>
<p style={{color: 'var(--text-muted)', fontSize: '0.8rem'}}>
Push modul aktif tenant ke JUMPA system_features. Fitur yang di-bridge = GRANTED, sisanya = UPSELL.
</p>
</div>
<div style={{display: 'flex', gap: '10px', alignItems: 'center', flexWrap: 'wrap'}}>
{tenants.map(t => (
<button key={t.tenant_key} onClick={() => handleSync(t.tenant_key)} disabled={syncing} style={{
padding: '10px 20px', background: syncing ? 'rgba(16,185,129,0.2)' : 'rgba(16,185,129,0.1)',
border: '1px solid var(--accent-green)', color: 'var(--accent-green)',
borderRadius: '6px', cursor: syncing ? 'wait' : 'pointer', fontFamily: 'monospace', fontSize: '0.8rem'
}}>
{syncing ? '⟳ SYNCING...' : `⚡ SYNC → ${t.tenant_name}`}
</button>
))}
</div>
{syncResult && (
<div style={{
width: '100%', marginTop: '10px', padding: '12px', borderRadius: '6px', fontFamily: 'monospace', fontSize: '0.8rem',
background: syncResult.error ? 'rgba(255,0,60,0.1)' : 'rgba(16,185,129,0.1)',
border: `1px solid ${syncResult.error ? 'var(--accent-red)' : 'var(--accent-green)'}`,
color: syncResult.error ? 'var(--accent-red)' : 'var(--accent-green)'
}}>
{syncResult.error
? `ERROR: ${syncResult.error}`
: `✓ BRIDGE SYNC COMPLETE — ${syncResult.granted} GRANTED / ${syncResult.disabled} DISABLED`}
</div>
)}
</div>
{/* Add Mapping Form */}
{showAddForm && (
<div className="glass-panel" style={{padding: '25px', marginBottom: '25px', borderLeft: '4px solid var(--accent-cyan)', animation: 'fadeIn 0.3s ease-out'}}>
<h3 style={{color: 'var(--accent-cyan)', marginBottom: '15px', fontFamily: 'monospace'}}>NEW BRIDGE MAPPING</h3>
<div style={{display: 'flex', gap: '15px', flexWrap: 'wrap', alignItems: 'flex-end'}}>
<div style={{flex: 1, minWidth: '200px'}}>
<label style={{color: 'var(--text-muted)', fontSize: '0.75rem', display: 'block', marginBottom: '5px'}}>XCU MODULE</label>
<select value={newModuleId} onChange={e => setNewModuleId(e.target.value)}
style={{width: '100%', padding: '10px', background: 'var(--hover-bg)', border: '1px solid var(--table-border)', color: 'var(--text-main)', borderRadius: '6px', fontFamily: 'monospace'}}>
<option value="">-- Select Module --</option>
{allModules.map(m => <option key={m.id} value={m.id}>{m.id} {m.name}</option>)}
</select>
</div>
<div style={{flex: 1, minWidth: '200px'}}>
<label style={{color: 'var(--text-muted)', fontSize: '0.75rem', display: 'block', marginBottom: '5px'}}>JUMPA FEATURE KEY</label>
<input value={newFeatureKey} onChange={e => setNewFeatureKey(e.target.value)} placeholder="jvc.feature.recording"
style={{width: '100%', padding: '10px', background: 'var(--hover-bg)', border: '1px solid var(--table-border)', color: 'var(--text-main)', borderRadius: '6px', fontFamily: 'monospace'}} />
</div>
<button onClick={handleAddMapping} disabled={isAdding || !newModuleId || !newFeatureKey} style={{
padding: '10px 25px', background: 'var(--accent-cyan)', color: '#000', border: 'none',
borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace', fontWeight: 'bold',
opacity: (!newModuleId || !newFeatureKey || isAdding) ? 0.5 : 1
}}>{isAdding ? 'ADDING...' : 'ADD MAPPING'}</button>
</div>
</div>
)}
{/* Search */}
<div style={{marginBottom: '20px'}}>
<input value={searchQuery} onChange={e => setSearchQuery(e.target.value)}
placeholder="Search by module ID, name, or feature key..."
style={{width: '100%', padding: '12px 20px', background: 'var(--hover-bg)', border: '1px solid var(--table-border)', color: 'var(--text-main)', borderRadius: '8px', fontFamily: 'monospace', fontSize: '0.9rem', outline: 'none'}} />
</div>
{/* Mapping Table */}
<div className="glass-panel" style={{padding: '0', overflow: 'hidden'}}>
<table style={{width: '100%', borderCollapse: 'collapse'}}>
<thead>
<tr style={{background: 'var(--hover-bg)'}}>
<th style={{padding: '12px 15px', textAlign: 'left', color: 'var(--accent-cyan)', fontFamily: 'monospace', fontSize: '0.75rem', letterSpacing: '1px', borderBottom: '1px solid var(--table-border)'}}>XCU MODULE</th>
<th style={{padding: '12px 15px', textAlign: 'left', color: 'var(--accent-purple)', fontFamily: 'monospace', fontSize: '0.75rem', letterSpacing: '1px', borderBottom: '1px solid var(--table-border)'}}>JUMPA FEATURE KEYS</th>
<th style={{padding: '12px 15px', textAlign: 'center', color: 'var(--text-muted)', fontFamily: 'monospace', fontSize: '0.75rem', borderBottom: '1px solid var(--table-border)', width: '80px'}}>COUNT</th>
</tr>
</thead>
<tbody>
{filteredModuleIds.map((modId, i) => (
<tr key={modId} style={{borderBottom: '1px solid var(--table-border)', background: i % 2 === 0 ? 'transparent' : 'rgba(255,255,255,0.01)'}}>
<td style={{padding: '10px 15px', verticalAlign: 'top'}}>
<div style={{color: 'var(--accent-cyan)', fontFamily: 'monospace', fontWeight: 'bold', fontSize: '0.85rem'}}>{modId}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.75rem'}}>{getModuleName(modId)}</div>
</td>
<td style={{padding: '10px 15px'}}>
<div style={{display: 'flex', flexWrap: 'wrap', gap: '4px'}}>
{groupedMappings[modId].map(fk => {
const prefixColor = fk.startsWith('jvc.') ? '#a855f7' :
fk.startsWith('jc.') ? '#10b981' :
fk.startsWith('xtm.') ? '#f97316' :
fk.startsWith('iam.') ? '#ffea00' :
fk.startsWith('xcu.') ? '#00f3ff' : '#888';
return (
<span key={fk} style={{
background: `${prefixColor}15`, border: `1px solid ${prefixColor}40`,
color: prefixColor, padding: '2px 8px', borderRadius: '4px',
fontFamily: 'monospace', fontSize: '0.7rem'
}}>{fk}</span>
);
})}
</div>
</td>
<td style={{padding: '10px 15px', textAlign: 'center', color: 'var(--text-muted)', fontFamily: 'monospace'}}>
{groupedMappings[modId].length}
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
);
}
@@ -0,0 +1,316 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { useState } from 'react';
import { useCommercial } from '../context/CommercialContext';
import { useModuleRegistry } from '../context/ModuleRegistryContext';
export default function CommercialTiers() {
const { tiers, setTiers, activeCurrency, setActiveCurrency, formatDynamicCurrency } = useCommercial();
const { allModules } = useModuleRegistry();
// Edit State
const [editingTierId, setEditingTierId] = useState(null);
const [editName, setEditName] = useState('');
const [editDesc, setEditDesc] = useState('');
const [editPrice, setEditPrice] = useState('');
const [editModules, setEditModules] = useState({});
const handleEditClick = (tier) => {
setEditingTierId(tier.id);
setEditName(tier.name);
setEditDesc(tier.description);
setEditPrice(tier.price);
const modMap = {};
tier.modules.forEach(m => modMap[m] = true);
setEditModules(modMap);
};
const handleToggleEditModule = (modId) => {
setEditModules(prev => ({ ...prev, [modId]: !prev[modId] }));
};
const saveEdit = (tierId) => {
const selectedMods = Object.keys(editModules).filter(k => editModules[k]);
setTiers(prev => prev.map(t => {
if (t.id === tierId) {
return {
...t,
name: editName,
description: editDesc,
price: Number(editPrice),
modules: selectedMods
};
}
return t;
}));
setEditingTierId(null);
};
const annihilateTier = (tierId) => {
setTiers(prev => prev.filter(t => t.id !== tierId));
setEditingTierId(null);
};
const spawnNewTier = () => {
const newId = 'tier_' + Math.random().toString(36).substr(2, 6);
const blankTier = {
id: newId,
name: 'NEW CUSTOM TIER',
price: 0,
description: 'Deskripsi paket baru...',
modules: []
};
// Append to end
setTiers(prev => [...prev, blankTier]);
// Auto-enter edit mode for the new tier
handleEditClick(blankTier);
};
return (
<div className="glass-panel" style={{padding: '40px', borderColor: 'var(--accent-purple)'}}>
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: '20px'}}>
<div>
<h2 style={{color: 'var(--text-main)', marginBottom: '10px', fontFamily: 'monospace', letterSpacing: '2px'}}>QUANTUM FOREX MATRIX (MODUL 21)</h2>
<p style={{color: 'var(--text-muted)'}}>
Konfigurasi Paket Penagihan Klien. Transmutasi nilai berjalan secara real-time.
</p>
</div>
{/* Multi-Currency Switcher */}
<div style={{display: 'flex', background: 'var(--panel-bg)', padding: '5px', borderRadius: '8px', border: '1px solid rgba(255,255,255,0.1)'}}>
{['IDR', 'USD', 'BTC'].map(currency => (
<button
key={currency}
onClick={() => setActiveCurrency(currency)}
style={{
padding: '8px 16px', border: 'none', borderRadius: '4px', cursor: 'pointer',
fontFamily: 'monospace', fontWeight: 'bold', transition: 'all 0.3s',
background: activeCurrency === currency ? 'var(--accent-purple)' : 'transparent',
color: activeCurrency === currency ? 'var(--text-main)' : 'var(--text-muted)'
}}
>
{currency === 'IDR' ? 'Rp IDR' : currency === 'USD' ? '$ USD' : 'â‚¿ BTC'}
</button>
))}
</div>
</div>
<div style={{display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '30px', marginTop: '40px'}}>
{tiers.map((tier, index) => {
let themeColor = 'var(--accent-cyan)';
if (index === 1) themeColor = 'var(--accent-yellow)';
if (index === 2) themeColor = 'var(--accent-red)';
if (index === 3) themeColor = 'var(--accent-green)';
const isEditing = editingTierId === tier.id;
return (
<div key={tier.id} style={{
background: isEditing ? 'var(--bg-panel)' : 'var(--panel-bg)',
border: `1px solid ${themeColor}`,
borderRadius: '12px',
padding: '30px',
position: 'relative',
overflow: 'hidden',
transition: 'all 0.4s ease',
transform: isEditing ? 'scale(1.02)' : 'scale(1)',
boxShadow: isEditing ? `0 0 30px ${themeColor}40` : 'none',
backdropFilter: 'blur(10px)'
}}>
<div style={{
position: 'absolute', top: 0, left: '50%', transform: 'translateX(-50%)',
width: isEditing ? '100%' : '50%', height: '4px', background: themeColor,
boxShadow: `0 0 20px ${themeColor}`, transition: 'all 0.4s'
}}></div>
{!isEditing ? (
<h3 style={{color: themeColor, fontSize: '1.2rem', marginBottom: '5px', letterSpacing: '1px'}}>{tier.name}</h3>
) : (
<input
type="text"
value={editName}
onChange={(e) => setEditName(e.target.value)}
style={{
width: '100%', padding: '8px', background: 'var(--hover-bg)',
border: `1px solid ${themeColor}`, color: themeColor,
borderRadius: '4px', fontFamily: 'monospace', outline: 'none', fontSize: '1.2rem', marginBottom: '10px', fontWeight: 'bold'
}}
/>
)}
{!isEditing ? (
<>
<div style={{fontSize: '2rem', fontWeight: 'bold', color: themeColor, marginBottom: '15px', fontFamily: 'monospace', animation: 'fadeIn 0.3s'}}>
{formatDynamicCurrency(tier.price)} <span style={{fontSize: '1rem', color: 'var(--text-muted)', fontWeight: 'normal'}}>/ bln</span>
</div>
<p style={{color: 'var(--text-muted)', fontSize: '0.9rem', lineHeight: '1.5', marginBottom: '25px', minHeight: '40px'}}>
{tier.description}
</p>
</>
) : (
<div style={{marginBottom: '25px', marginTop: '15px', animation: 'fadeIn 0.3s'}}>
<label style={{display: 'block', color: 'var(--text-muted)', fontSize: '0.8rem', marginBottom: '8px'}}>NILAI DASAR (IDR)</label>
<input
type="number"
value={editPrice}
onChange={(e) => setEditPrice(e.target.value)}
style={{
width: '100%', padding: '12px', background: 'var(--hover-bg)',
border: `1px solid ${themeColor}`, color: 'var(--text-main)',
borderRadius: '6px', fontFamily: 'monospace', outline: 'none', fontSize: '1.2rem'
}}
/>
<div style={{fontSize: '0.8rem', color: 'var(--text-muted)', marginTop: '10px'}}>
Estimasi USD: {formatDynamicCurrency(Number(editPrice))} (Bila di-switch)
</div>
<label style={{display: 'block', color: 'var(--text-muted)', fontSize: '0.8rem', marginTop: '15px', marginBottom: '8px'}}>DESKRIPSI PAKET</label>
<textarea
value={editDesc}
onChange={(e) => setEditDesc(e.target.value)}
style={{
width: '100%', padding: '12px', background: 'var(--hover-bg)',
border: `1px solid ${themeColor}`, color: 'var(--text-main)',
borderRadius: '6px', fontFamily: 'monospace', outline: 'none', fontSize: '0.9rem', minHeight: '60px', resize: 'vertical'
}}
/>
</div>
)}
<div style={{background: 'var(--hover-bg)', padding: '15px', borderRadius: '8px'}}>
<div style={{color: themeColor, fontSize: '0.85rem', fontWeight: 'bold', marginBottom: '10px', display: 'flex', justifyContent: 'space-between', letterSpacing: '1px'}}>
<span>MODUL DIAKSES:</span>
<span style={{color: themeColor, fontWeight: 'bold'}}>{!isEditing ? tier.modules.length : Object.values(editModules).filter(v=>v).length} MODUL</span>
</div>
<div style={{display: 'flex', flexWrap: 'wrap', gap: '5px', maxHeight: isEditing ? '250px' : '100px', overflowY: 'auto'}} className="custom-scrollbar">
{!isEditing ? (
tier.modules.map(m => (
<span key={m} style={{
background: 'var(--bg-panel)', border: '1px solid var(--table-border)',
color: 'var(--text-main)', fontSize: '0.7rem', padding: '2px 6px', borderRadius: '4px', fontFamily: 'monospace'
}}>
{m}
</span>
))
) : (
allModules.map(mod => (
<div
key={mod.id}
onClick={() => handleToggleEditModule(mod.id)}
style={{
background: editModules[mod.id] ? `${themeColor}20` : 'var(--hover-bg)',
border: `1px solid ${editModules[mod.id] ? themeColor : 'var(--table-border)'}`,
color: editModules[mod.id] ? 'var(--text-main)' : 'var(--text-muted)',
fontSize: '0.7rem', padding: '4px 8px', borderRadius: '4px', fontFamily: 'monospace',
cursor: 'pointer', transition: 'all 0.2s', width: '100%', display: 'flex', justifyContent: 'space-between'
}}
>
<span>{mod.name}</span>
{editModules[mod.id] && <span style={{color: themeColor}}>[ON]</span>}
</div>
))
)}
</div>
</div>
{!isEditing ? (
<button style={{
width: '100%', marginTop: '25px', padding: '12px',
background: 'transparent', border: `1px solid ${themeColor}`, color: themeColor,
borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace', letterSpacing: '1px',
transition: 'all 0.2s'
}}
onMouseOver={e => {e.target.style.background = themeColor; e.target.style.color = '#000'}}
onMouseOut={e => {e.target.style.background = 'transparent'; e.target.style.color = themeColor}}
onClick={() => handleEditClick(tier)}>
EDIT KONFIGURASI HARGA
</button>
) : (
<div style={{display: 'flex', flexDirection: 'column', gap: '10px', marginTop: '25px'}}>
<div style={{display: 'flex', gap: '10px'}}>
<button style={{
flex: 1, padding: '12px', background: 'transparent', border: '1px solid #555', color: 'var(--text-muted)',
borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace'
}} onClick={() => setEditingTierId(null)}>BATAL</button>
<button style={{
flex: 1, padding: '12px', background: themeColor, border: 'none', color: '#000',
borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace', fontWeight: 'bold'
}} onClick={() => saveEdit(tier.id)}>SIMPAN TARIF</button>
</div>
<button style={{
width: '100%', padding: '12px', background: 'rgba(255,0,60,0.1)', border: '1px solid var(--accent-red)', color: 'var(--accent-red)',
borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace', fontWeight: 'bold'
}} onClick={() => annihilateTier(tier.id)}>DECOMMISSION PACKAGE</button>
</div>
)}
</div>
);
})}
{/* FORGE NEW TIER BUTTON */}
<div
onClick={spawnNewTier}
style={{
background: 'var(--hover-bg)',
border: `1px dashed var(--accent-purple)`,
borderRadius: '12px',
padding: '30px',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
cursor: 'pointer',
transition: 'all 0.3s ease',
minHeight: '400px'
}}
onMouseOver={(e) => {
e.currentTarget.style.background = 'rgba(168, 85, 247, 0.1)';
e.currentTarget.style.boxShadow = '0 0 30px rgba(168, 85, 247, 0.4)';
}}
onMouseOut={(e) => {
e.currentTarget.style.background = 'var(--hover-bg)';
e.currentTarget.style.boxShadow = 'none';
}}
>
<div style={{fontSize: '3rem', color: 'var(--accent-purple)', marginBottom: '10px'}}>+</div>
<h3 style={{color: 'var(--text-main)', letterSpacing: '1px'}}>FORGE NEW TIER</h3>
<p style={{color: 'var(--text-muted)', fontSize: '0.8rem', textAlign: 'center', marginTop: '10px'}}>
Create a custom modular package<br/>for specific tenant needs.
</p>
</div>
{/* RESTORE DEFAULT PACKAGES BUTTON */}
<div
onClick={() => {
if(window.confirm('WARNING: This will overwrite all custom tiers and restore the original 4 XCU Factory Packages. Proceed?')) {
localStorage.removeItem('xcu_commercial_tiers');
window.location.reload();
}
}}
style={{
background: 'var(--hover-bg)',
border: `1px dashed var(--accent-yellow)`,
borderRadius: '12px',
padding: '30px',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
cursor: 'pointer',
transition: 'all 0.3s'
}}
onMouseOver={e => {e.currentTarget.style.background = 'rgba(255, 234, 0, 0.1)'}}
onMouseOut={e => {e.currentTarget.style.background = 'var(--hover-bg)'}}
>
<div style={{fontSize: '3rem', color: 'var(--accent-yellow)', marginBottom: '10px'}}>â»</div>
<h3 style={{color: 'var(--text-main)', letterSpacing: '1px'}}>RESTORE FACTORY TIERS</h3>
<p style={{color: 'var(--text-muted)', fontSize: '0.8rem', textAlign: 'center', marginTop: '10px'}}>
Recover lost Default Packages<br/>(Perintis, Omni-Engine, dll).
</p>
</div>
</div>
</div>
);
}
@@ -0,0 +1,100 @@
import { useState, useEffect } from 'react';
import signatureData from '../config/signature.json';
export default function CreatorsMark() {
const [glitch, setGlitch] = useState(false);
useEffect(() => {
const interval = setInterval(() => {
setGlitch(true);
setTimeout(() => setGlitch(false), 150);
}, 4000);
return () => clearInterval(interval);
}, []);
return (
<div style={{
display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center',
minHeight: '60vh', padding: '40px', textAlign: 'center'
}}>
<style>{`
@keyframes scanline {
0% { transform: translateY(-100%); }
100% { transform: translateY(100vh); }
}
.signature-box {
position: relative;
background: rgba(0, 243, 255, 0.05);
border: 1px solid var(--accent-cyan);
border-radius: 12px;
padding: 40px 60px;
box-shadow: 0 0 30px rgba(0, 243, 255, 0.2), inset 0 0 20px rgba(0, 243, 255, 0.1);
overflow: hidden;
}
.signature-box::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; height: 10px;
background: rgba(0, 243, 255, 0.5);
animation: scanline 6s linear infinite;
opacity: 0.5;
}
.glitch-text {
font-family: monospace;
font-size: 2rem;
font-weight: bold;
color: var(--accent-cyan);
letter-spacing: 2px;
text-shadow: 0 0 10px var(--accent-cyan);
position: relative;
}
.glitch-active {
animation: shake 0.2s cubic-bezier(.36,.07,.19,.97) both;
text-shadow: 2px 0 var(--accent-red), -2px 0 var(--accent-yellow);
}
@keyframes shake {
10%, 90% { transform: translate3d(-1px, 0, 0); }
20%, 80% { transform: translate3d(2px, 0, 0); }
30%, 50%, 70% { transform: translate3d(-4px, 0, 0); }
40%, 60% { transform: translate3d(4px, 0, 0); }
}
`}</style>
<div className="signature-box">
<h2 style={{color: 'var(--text-muted)', fontSize: '1rem', letterSpacing: '4px', marginBottom: '30px'}}>
XCU OMNI-ENGINE
</h2>
<div style={{marginBottom: '40px'}}>
<div style={{fontSize: '0.8rem', color: 'var(--text-muted)', marginBottom: '10px'}}>THE CREATOR'S CRYPTOGRAPHIC MARK</div>
<div className={`glitch-text ${glitch ? 'glitch-active' : ''}`}>
{signatureData.signature || "[TSM.ID].UNKNOWN.XXXX"}
</div>
</div>
<div style={{
display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '20px',
borderTop: '1px solid rgba(0, 243, 255, 0.2)', paddingTop: '30px',
textAlign: 'left', fontFamily: 'monospace', fontSize: '0.85rem'
}}>
<div>
<div style={{color: 'var(--text-muted)'}}>DNA CHECKSUM (MD5)</div>
<div style={{color: 'var(--accent-yellow)', wordBreak: 'break-all'}}>{signatureData.hash || "UNKNOWN"}</div>
</div>
<div>
<div style={{color: 'var(--text-muted)'}}>FORGED TIMESTAMP</div>
<div style={{color: 'var(--accent-cyan)'}}>{new Date(signatureData.timestamp || Date.now()).toLocaleString()}</div>
</div>
<div style={{gridColumn: '1 / -1', marginTop: '10px'}}>
<div style={{color: 'var(--text-muted)'}}>FILES COMPILED</div>
<div style={{color: 'var(--accent-purple)'}}>{signatureData.files_scanned || 0} QUANTUM NODES</div>
</div>
</div>
</div>
<p style={{marginTop: '30px', color: 'var(--text-muted)', maxWidth: '600px', fontSize: '0.9rem', lineHeight: '1.6'}}>
Identitas Mutlak ini tertanam di dalam setiap berkas sumber. Perubahan pada satu karakter kode saja akan memicu mutasi UID Kriptografi. Mesin ini tidak dapat dipalsukan.
</p>
</div>
);
}
@@ -0,0 +1,73 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
export default function DangerModal({ isOpen, title, message, onConfirm, onCancel, confirmText = "ENGAGE PROTOCOL", cancelText = "ABORT" }) {
if (!isOpen) return null;
return (
<div style={{
position: 'fixed',
top: 0, left: 0, right: 0, bottom: 0,
backgroundColor: 'rgba(5, 3, 10, 0.85)',
backdropFilter: 'blur(8px)',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
zIndex: 9999,
animation: 'fadeIn 0.3s ease-out'
}}>
<style>{`
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes pulseRed {
0% { box-shadow: 0 0 15px rgba(255, 0, 60, 0.3); }
50% { box-shadow: 0 0 30px rgba(255, 0, 60, 0.6); }
100% { box-shadow: 0 0 15px rgba(255, 0, 60, 0.3); }
}
`}</style>
<div style={{
background: 'linear-gradient(135deg, rgba(20, 0, 5, 0.95) 0%, rgba(5, 0, 0, 0.95) 100%)',
border: '1px solid #ff003c',
borderRadius: '12px',
padding: '40px',
maxWidth: '500px',
width: '90%',
textAlign: 'center',
animation: 'pulseRed 2s infinite'
}}>
<div style={{
width: '60px', height: '60px',
borderRadius: '50%', background: 'rgba(255,0,60,0.1)',
border: '2px solid #ff003c',
display: 'flex', alignItems: 'center', justifyContent: 'center',
margin: '0 auto 20px', color: '#ff003c', fontSize: '2rem', fontWeight: 'bold'
}}>!</div>
<h2 style={{color: '#ff003c', marginBottom: '15px', fontFamily: 'monospace', letterSpacing: '2px', fontSize: '1.5rem'}}>
{title}
</h2>
<p style={{color: '#fff', fontSize: '1rem', lineHeight: '1.6', marginBottom: '35px'}}>
{message}
</p>
<div style={{display: 'flex', gap: '15px', justifyContent: 'center'}}>
<button onClick={onCancel} style={{
padding: '12px 24px', background: 'transparent', border: '1px solid #555',
color: '#aaa', borderRadius: '6px', fontFamily: 'monospace', fontSize: '1rem',
cursor: 'pointer', transition: 'all 0.2s', flex: 1
}} onMouseOver={e => {e.target.style.color = '#fff'; e.target.style.borderColor = '#888'}}
onMouseOut={e => {e.target.style.color = '#aaa'; e.target.style.borderColor = '#555'}}>
{cancelText}
</button>
<button onClick={onConfirm} style={{
padding: '12px 24px', background: 'rgba(255, 0, 60, 0.15)', border: '1px solid #ff003c',
color: '#ff003c', borderRadius: '6px', fontFamily: 'monospace', fontSize: '1rem',
cursor: 'pointer', transition: 'all 0.2s', flex: 1, fontWeight: 'bold', letterSpacing: '1px'
}} onMouseOver={e => {e.target.style.background = '#ff003c'; e.target.style.color = '#fff'}}
onMouseOut={e => {e.target.style.background = 'rgba(255, 0, 60, 0.15)'; e.target.style.color = '#ff003c'}}>
{confirmText}
</button>
</div>
</div>
</div>
);
}
@@ -0,0 +1,224 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { useEffect, useRef, useState } from 'react';
import { useAuth } from '../context/AuthContext';
import { useIam } from '../context/IamContext';
import { useWasm } from '../context/WasmContext';
import { useI18n } from '../context/I18nContext';
function useNeuralTelemetry() {
const [data, setData] = useState({
cpu_usage: 0,
ram_usage: 0,
active_connections: 0,
threats_blocked: 0,
status: 'SECURE'
});
useEffect(() => {
let sse;
const connect = () => {
// Menghubungkan ke Rust Backend yang sebenarnya
sse = new EventSource('/api/v1/telemetry/stream');
sse.onmessage = (event) => {
try {
const payload = JSON.parse(event.data);
setData(payload);
} catch (err) {
console.error("Neural Link Parse Error:", err);
}
};
sse.onerror = () => {
sse.close();
setTimeout(connect, 5000);
};
};
connect();
return () => {
if (sse) sse.close();
};
}, []);
return data;
}
export default function DashboardOverview() {
const canvasRef = useRef(null);
const { cryptographicKey } = useAuth();
const { identity } = useIam();
const { isWasmReady, wasmLogs, triggerPostQuantumShield, triggerAegisMatrix } = useWasm();
const { t } = useI18n();
const telemetry = useNeuralTelemetry();
// Quantum Particle Engine (Zero React Overhead Canvas)
useEffect(() => {
const canvas = canvasRef.current;
if (!canvas) return;
const ctx = canvas.getContext('2d');
let animationFrameId;
let particles = [];
const numParticles = 150;
for(let i=0; i < numParticles; i++) {
particles.push({
x: Math.random() * canvas.width,
y: Math.random() * canvas.height,
vx: (Math.random() - 0.5) * 3,
vy: (Math.random() - 0.5) * 3,
baseSize: Math.random() * 2 + 1
});
}
const render = () => {
ctx.fillStyle = 'rgba(0, 0, 0, 0.2)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
const speedMultiplier = 1.0 + (telemetry.cpu_usage / 5.0);
particles.forEach(p => {
p.x += p.vx * speedMultiplier;
p.y += p.vy * speedMultiplier;
if (p.x < 0 || p.x > canvas.width) p.vx *= -1;
if (p.y < 0 || p.y > canvas.height) p.vy *= -1;
ctx.beginPath();
ctx.arc(p.x, p.y, p.baseSize, 0, Math.PI * 2);
ctx.fillStyle = identity.role === 'supreme_admin' ? '#00f3ff' : '#a855f7';
ctx.fill();
particles.forEach(p2 => {
const dx = p.x - p2.x;
const dy = p.y - p2.y;
const dist = Math.sqrt(dx*dx + dy*dy);
if(dist < 60) {
ctx.beginPath();
ctx.moveTo(p.x, p.y);
ctx.lineTo(p2.x, p2.y);
if (identity.role === 'supreme_admin') {
ctx.strokeStyle = `rgba(0, 243, 255, ${1 - dist/60})`;
} else {
ctx.strokeStyle = `rgba(168, 85, 247, ${1 - dist/60})`;
}
ctx.lineWidth = 1;
ctx.stroke();
}
});
});
animationFrameId = requestAnimationFrame(render);
};
render();
return () => cancelAnimationFrame(animationFrameId);
}, [telemetry.cpu_usage, identity.role]);
return (
<div>
<div className="grid-cards">
<div className="glass-panel stat-card">
<div className="stat-title">{t('active_vvip')}</div>
<div className="stat-value cyan">{telemetry.active_connections.toLocaleString()}</div>
<div style={{marginTop: '15px', fontSize: '0.85rem', color: 'var(--accent-cyan)', fontFamily: 'monospace'}}>
{t('cpu_load').replace('{val}', telemetry.cpu_usage.toFixed(1))}
</div>
</div>
<div className="glass-panel stat-card">
<div className="stat-title">{t('threats_annihilated')}</div>
<div className="stat-value red">{telemetry.threats_blocked.toLocaleString()}</div>
<div style={{marginTop: '15px', fontSize: '0.85rem', color: 'var(--accent-red)', fontFamily: 'monospace'}}>
{t('ram_active').replace('{val}', telemetry.ram_usage.toFixed(1))}
</div>
</div>
<div className="glass-panel stat-card" style={{borderColor: 'var(--accent-green)'}}>
<div className="stat-title">{t('session_auth')}</div>
<div className="stat-value green" style={{fontSize: '1.5rem', wordBreak: 'break-all'}}>
{cryptographicKey ? cryptographicKey.substring(0, 16) + '...' : t('unauthorized')}
</div>
<div style={{marginTop: '15px', fontSize: '0.85rem', color: 'var(--accent-green)', fontFamily: 'monospace'}}>
{t('access_level')} {identity.role === 'supreme_admin' ? 'SUPREME ADMIN' : 'TENANT GATEWAY'}
</div>
</div>
</div>
{/* QUANTUM ARSENAL PANEL (Only for Supreme Admin) */}
{identity.role === 'supreme_admin' && (
<div className="glass-panel" style={{padding: '30px', marginTop: '30px', borderColor: 'var(--accent-cyan)'}}>
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '20px'}}>
<h3 style={{color: 'var(--text-main)', fontFamily: 'monospace', letterSpacing: '2px'}}>{t('quantum_arsenal')}</h3>
<span className={`badge ${isWasmReady ? 'active' : 'revoked'}`}>
{isWasmReady ? t('wasm_online') : t('wasm_compiling')}
</span>
</div>
<div style={{display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '20px', marginBottom: '20px'}}>
<button
onClick={triggerPostQuantumShield}
disabled={!isWasmReady}
className="btn-primary"
style={{padding: '20px', fontSize: '1.1rem'}}
>
{t('engage_shield')}
<div style={{fontSize: '0.7rem', color: 'var(--text-muted)', marginTop: '10px', textTransform: 'none'}}>
Kyber-1024 Lattice Cryptography
</div>
</button>
<button
onClick={triggerAegisMatrix}
disabled={!isWasmReady}
className="btn-primary"
style={{padding: '20px', fontSize: '1.1rem', borderColor: 'var(--accent-blue)', color: 'var(--accent-blue)'}}
>
{t('engage_watermark')}
<div style={{fontSize: '0.7rem', color: 'var(--text-muted)', marginTop: '10px', textTransform: 'none'}}>
1% Opacity Microscopic Morse Flash
</div>
</button>
</div>
<div style={{background: 'var(--panel-bg)', padding: '15px', borderRadius: '8px', minHeight: '150px', maxHeight: '200px', overflowY: 'auto', border: '1px solid var(--table-border)', fontFamily: 'monospace', fontSize: '0.85rem', color: 'var(--accent-cyan)'}}>
<div style={{color: 'var(--text-muted)', marginBottom: '10px'}}>{t('wasm_logs')}</div>
{wasmLogs.length === 0 && <div style={{color: 'var(--text-main)'}}>{t('awaiting_command')}</div>}
{wasmLogs.map((log, i) => (
<div key={i} style={{marginBottom: '5px'}}>{log}</div>
))}
</div>
</div>
)}
<div className="glass-panel" style={{padding: '30px', minHeight: '350px', marginTop: '30px', position: 'relative'}}>
<h3 style={{marginBottom: '25px', color: 'var(--text-main)', fontFamily: 'monospace', letterSpacing: '2px', borderBottom: '1px solid var(--glass-border)', paddingBottom: '15px'}}>
{t('global_routing')}
</h3>
<div style={{
width: '100%',
height: '300px',
background: 'var(--panel-bg)',
borderRadius: '12px',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
overflow: 'hidden',
border: '1px solid var(--glass-border)',
boxShadow: 'inset 0 0 30px var(--glass-glow)'
}}>
<canvas
ref={canvasRef}
width={1000}
height={300}
style={{ width: '100%', height: '100%' }}
/>
</div>
</div>
</div>
);
}
@@ -0,0 +1,100 @@
import React, { useEffect, useRef, useState } from 'react';
import mermaid from 'mermaid';
import { useI18n } from '../context/I18nContext';
mermaid.initialize({
startOnLoad: false,
theme: 'dark',
securityLevel: 'loose',
});
export default function Documents() {
const { t } = useI18n();
const [docs, setDocs] = useState([]);
const [selectedVersion, setSelectedVersion] = useState(null);
const [loading, setLoading] = useState(true);
const mermaidRef = useRef(null);
useEffect(() => {
// Fetch dynamic architecture docs from DuckDB!
const fetchDocs = async () => {
try {
const res = await fetch('https://api.xc.ultramodul.xyz/v1/docs/history');
if (res.ok) {
const data = await res.json();
setDocs(data);
if (data.length > 0) setSelectedVersion(data[0]);
} else {
// Fallback for demonstration if endpoint is not fully up yet
throw new Error("Endpoint not ready");
}
} catch (e) {
console.error("Using local fallback due to fetch error:", e);
// Fallback Data if DuckDB API is still compiling/deploying
const fallbackDocs = [
{
version: "Ver.TSM.19:24:00.07:05:2026.F89A",
timestamp: "2026-05-07 19:24:00",
narrative: "Pemisahan Mutlak antara Mesin Pemrosesan Video (XCU Core) dan Mesin Penagihan API (DuckDB Billing Matrix).",
content: "graph TD\n A[Supreme Admin UI] -->|API Request| B(api.xc.ultramodul.xyz)\n C[Tenant UI / JUMPA.ID] -->|API Request| B\n B -->|Query & Save| D[(DuckDB: Billing & Iam)]\n \n E[XCU Core Engine\nxc.ultramodul.xyz] -->|WebRTC / QUIC Stream| F[Video Routing]\n E -->|Send Live Usage| B\n B -->|Validate Token| E\n \n classDef muscle fill:#a855f7,stroke:#fff,color:#fff;\n classDef brain fill:#00d2ff,stroke:#fff,color:#000;\n class E,F muscle;\n class B,D brain;"
}
];
setDocs(fallbackDocs);
setSelectedVersion(fallbackDocs[0]);
} finally {
setLoading(false);
}
};
fetchDocs();
}, []);
useEffect(() => {
if (selectedVersion && mermaidRef.current) {
mermaidRef.current.innerHTML = '';
mermaid.render(`mermaid-${selectedVersion.version.replace(/[^a-zA-Z0-9]/g, '')}`, selectedVersion.content).then(result => {
mermaidRef.current.innerHTML = result.svg;
}).catch(e => console.error("Mermaid render error", e));
}
}, [selectedVersion]);
return (
<div style={{ display: 'flex', gap: '20px', height: '100%', color: '#fff' }}>
{/* Sidebar Histori */}
<div className="glass-panel" style={{ width: '250px', padding: '15px' }}>
<h3 style={{ color: 'var(--accent-cyan)', marginBottom: '15px' }}>{t('documents')} (History)</h3>
{loading ? (
<p>Syncing Vault...</p>
) : docs.length === 0 ? (
<p>No architecture records found.</p>
) : (
<ul style={{ listStyle: 'none', padding: 0 }}>
{docs.map(doc => (
<li key={doc.version} style={{ marginBottom: '10px' }}>
<button
onClick={() => setSelectedVersion(doc)}
style={{
width: '100%', textAlign: 'left', background: selectedVersion?.version === doc.version ? 'rgba(168, 85, 247, 0.3)' : 'transparent',
border: '1px solid #a855f7', color: '#fff', padding: '10px', borderRadius: '5px', cursor: 'pointer'
}}>
<strong>{doc.version.split('.').pop()}</strong><br/>
<small style={{ color: 'var(--text-muted)' }}>{doc.timestamp}</small>
</button>
</li>
))}
</ul>
)}
</div>
{/* Main Canvas Mermaid */}
<div className="glass-panel" style={{ flex: 1, padding: '20px', overflow: 'auto' }}>
<h2 style={{ marginBottom: '10px', color: 'var(--accent-cyan)' }}>Architecture: {selectedVersion?.version}</h2>
<p style={{ color: 'var(--text-muted)', marginBottom: '20px', lineHeight: '1.6' }}>
{selectedVersion ? selectedVersion.narrative : ''}
</p>
{selectedVersion && (
<div ref={mermaidRef} className="mermaid-container" style={{ background: '#000', padding: '20px', borderRadius: '10px', display: 'flex', justifyContent: 'center' }} />
)}
</div>
</div>
);
}
@@ -0,0 +1,140 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { useIamPolicy } from '../context/IamPolicyContext';
export default function IamArchitect() {
const { policies, identities, updatePolicy, regenerateKey } = useIamPolicy();
// Resilient: default identities if Gatekeeper WebSocket offline
const isOffline = !identities || Object.keys(identities).length === 0;
const activeIdentities = isOffline ? {
'AEGIS-SUPREME-974EFB44BE-X': { role: 'supreme_admin', tenant_id: 'XCU-SUPREME' },
'AEGIS-TENANT-80AA3EEBE8-X': { role: 'tenant_admin', tenant_id: 'JUMPA.ID' }
} : identities;
const activePolicies = isOffline ? {
'AEGIS-TENANT-80AA3EEBE8-X': {
name: 'JUMPA.ID ENTERPRISE',
supreme_allowed: { biometric: true, optical: true, aegis: true },
tenant_enabled: { biometric: false, optical: false, aegis: true },
mfa_mode: 'free'
}
} : (policies || {});
const handleToggle = (keyId, methodKey, currentValue) => {
if (isOffline) { alert('GATEKEEPER OFFLINE: Perubahan tidak dapat disimpan.'); return; }
const policy = activePolicies[keyId];
if (!policy) return;
const newSupremeAllowed = { ...policy.supreme_allowed, [methodKey]: !currentValue };
updatePolicy(keyId, newSupremeAllowed, null, null);
};
const handleMfaMode = (keyId, newMode) => {
if (isOffline) { alert('GATEKEEPER OFFLINE: Perubahan tidak dapat disimpan.'); return; }
updatePolicy(keyId, null, null, newMode);
};
return (
<div className="glass-panel" style={{padding: '30px', borderColor: 'var(--accent-red)'}}>
<h2 style={{color: 'var(--accent-red)', marginBottom: '10px', textTransform: 'uppercase', letterSpacing: '2px'}}>IAM Architect Matrix &amp; Key Forge</h2>
<p style={{color: 'var(--text-muted)', marginBottom: '10px'}}>
Kendali Diktator Mutlak atas metode otentikasi Kriptografik seluruh Tenant.
</p>
{isOffline && (
<div style={{
padding: '10px 15px', background: 'rgba(255, 234, 0, 0.1)', border: '1px solid var(--accent-yellow)',
borderRadius: '6px', marginBottom: '20px', display: 'flex', alignItems: 'center', gap: '10px'
}}>
<span style={{color: 'var(--accent-yellow)', fontSize: '1.2rem'}}></span>
<span style={{color: 'var(--accent-yellow)', fontFamily: 'monospace', fontSize: '0.8rem'}}>
GATEKEEPER OFFLINE Menampilkan konfigurasi default.
</span>
</div>
)}
<table className="glass-table" style={{width: '100%', borderCollapse: 'collapse', textAlign: 'left'}}>
<thead>
<tr style={{borderBottom: '1px solid var(--table-border)'}}>
<th style={{padding: '15px', color: 'var(--text-muted)', fontSize: '0.8rem'}}>IDENTITAS</th>
<th style={{padding: '15px', color: 'var(--text-muted)', fontSize: '0.8rem', textAlign: 'center'}}>BIOMETRIC</th>
<th style={{padding: '15px', color: 'var(--text-muted)', fontSize: '0.8rem', textAlign: 'center'}}>OPTICAL</th>
<th style={{padding: '15px', color: 'var(--text-muted)', fontSize: '0.8rem', textAlign: 'center'}}>AEGIS</th>
<th style={{padding: '15px', color: 'var(--text-muted)', fontSize: '0.8rem', textAlign: 'center'}}>MFA</th>
<th style={{padding: '15px', color: 'var(--text-muted)', fontSize: '0.8rem', textAlign: 'center'}}>FORGE</th>
</tr>
</thead>
<tbody>
{Object.entries(activeIdentities).map(([keyId, identity]) => {
const policy = activePolicies[keyId] || null;
return (
<tr key={keyId} style={{borderBottom: '1px solid var(--table-border-light)'}}>
<td style={{padding: '15px'}}>
<div style={{color: 'var(--text-main)', fontWeight: 'bold'}}>{policy ? policy.name : 'SUPREME COMMAND'}</div>
<div style={{color: 'var(--accent-purple)', fontSize: '0.7rem', fontFamily: 'monospace'}}>{keyId}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.6rem'}}>{(identity && identity.role) ? identity.role.toUpperCase() : 'N/A'}</div>
</td>
{['biometric', 'optical', 'aegis'].map(methodKey => (
<td key={methodKey} style={{padding: '15px', textAlign: 'center'}}>
{policy ? (
<button
onClick={() => handleToggle(keyId, methodKey, policy.supreme_allowed[methodKey])}
style={{
padding: '8px 15px',
background: policy.supreme_allowed[methodKey] ? 'rgba(0, 255, 136, 0.1)' : 'rgba(255, 0, 60, 0.1)',
color: policy.supreme_allowed[methodKey] ? 'var(--accent-green)' : 'var(--accent-red)',
border: `1px solid ${policy.supreme_allowed[methodKey] ? 'var(--accent-green)' : 'var(--accent-red)'}`,
borderRadius: '4px', cursor: 'pointer', fontFamily: 'monospace', fontWeight: 'bold',
transition: 'all 0.2s', width: '100px'
}}
>
{policy.supreme_allowed[methodKey] ? 'ENFORCED' : 'REVOKED'}
</button>
) : (
<span style={{color: 'var(--text-muted)', fontSize: '0.8rem'}}>- IMMUNE -</span>
)}
</td>
))}
<td style={{padding: '15px', textAlign: 'center'}}>
{policy ? (
<select
value={policy.mfa_mode || 'free'}
onChange={(e) => handleMfaMode(keyId, e.target.value)}
style={{
padding: '8px', background: 'var(--panel-bg)', color: 'var(--text-main)',
border: '1px solid var(--table-border)', borderRadius: '4px', cursor: 'pointer',
fontFamily: 'monospace'
}}
>
<option value="free">FREE</option>
<option value="strict">STRICT</option>
<option value="random">RANDOM</option>
</select>
) : (
<span style={{color: 'var(--text-muted)', fontSize: '0.8rem'}}>-</span>
)}
</td>
<td style={{padding: '15px', textAlign: 'center'}}>
<button
onClick={() => {
if (isOffline) { alert('GATEKEEPER OFFLINE'); return; }
regenerateKey(keyId);
}}
style={{
padding: '8px 15px', background: 'rgba(0, 243, 255, 0.1)',
color: 'var(--accent-cyan)', border: '1px solid var(--accent-cyan)',
borderRadius: '4px', cursor: 'pointer', fontFamily: 'monospace', fontWeight: 'bold'
}}
>
REFORGE
</button>
</td>
</tr>
);
})}
</tbody>
</table>
</div>
);
}
@@ -0,0 +1,345 @@
/* ========================================================
XCU: COSMIC MILITARY GATEWAY STYLES
======================================================== */
.login-gateway-container {
position: relative;
width: 100vw;
height: 100vh;
overflow: hidden;
background-color: #020108;
display: flex;
flex-direction: column;
}
/* Deep Space Matrix Canvas */
.quantum-canvas {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
pointer-events: none;
}
/* HUD Overlay Layer */
.hud-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 2;
pointer-events: none;
background:
radial-gradient(circle at center, transparent 40%, rgba(0, 0, 0, 0.8) 100%),
repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0, 243, 255, 0.03) 3px, transparent 4px);
box-shadow: inset 0 0 100px rgba(0, 243, 255, 0.1);
}
.radar-ring {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 80vh;
height: 80vh;
border: 1px dashed rgba(0, 243, 255, 0.1);
border-radius: 50%;
animation: radarSpin 60s linear infinite;
z-index: 2;
pointer-events: none;
}
.radar-ring::before {
content: '';
position: absolute;
top: -10px; left: 50%;
width: 20px; height: 20px;
background: rgba(0, 243, 255, 0.3);
box-shadow: 0 0 15px rgba(0, 243, 255, 0.8);
border-radius: 50%;
}
@keyframes radarSpin {
100% { transform: translate(-50%, -50%) rotate(360deg); }
}
/* Monolith Terminal */
.aegis-monolith {
position: relative;
z-index: 10;
margin: auto;
width: 90%;
max-width: 500px;
background: rgba(5, 5, 10, 0.85);
-webkit-backdrop-filter: blur(20px);
backdrop-filter: blur(20px);
border: 1px solid rgba(0, 243, 255, 0.2);
border-radius: 4px;
box-shadow: 0 0 50px rgba(0, 0, 0, 0.9), inset 0 0 20px rgba(0, 243, 255, 0.05);
padding: 40px;
overflow: hidden;
animation: monolithActivate 1.5s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
.aegis-monolith::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0;
height: 2px;
background: linear-gradient(90deg, transparent, var(--accent-cyan), transparent);
animation: scanningBeam 3s linear infinite;
}
@keyframes scanningBeam {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
@keyframes monolithActivate {
0% { transform: scale(0.95) translateY(20px); opacity: 0; filter: blur(10px); }
100% { transform: scale(1) translateY(0); opacity: 1; filter: blur(0); }
}
/* Military Title */
.supreme-title {
font-family: 'JetBrains Mono', monospace;
font-size: 2.5rem;
font-weight: 800;
color: #fff;
text-align: center;
letter-spacing: 10px;
margin: 0 0 10px 0;
text-shadow: 0 0 15px rgba(0, 243, 255, 0.5);
}
.supreme-subtitle {
font-family: 'JetBrains Mono', monospace;
color: var(--accent-red);
text-align: center;
font-size: 0.75rem;
letter-spacing: 5px;
margin-bottom: 40px;
text-transform: uppercase;
}
/* Kinetic Glitch Text */
.kinetic-glitch {
font-family: 'JetBrains Mono', monospace;
position: relative;
color: var(--text-main);
}
.kinetic-glitch::before, .kinetic-glitch::after {
content: attr(data-text);
position: absolute;
top: 0; left: 0;
width: 100%; height: 100%;
background: transparent;
}
.kinetic-glitch::before {
left: 2px;
text-shadow: -1px 0 red;
clip: rect(24px, 550px, 90px, 0);
animation: glitch-anim-2 3s infinite linear alternate-reverse;
}
.kinetic-glitch::after {
left: -2px;
text-shadow: -1px 0 blue;
clip: rect(85px, 550px, 140px, 0);
animation: glitch-anim 2.5s infinite linear alternate-reverse;
}
@keyframes glitch-anim {
0% { clip: rect(4px, 9999px, 58px, 0); }
20% { clip: rect(79px, 9999px, 83px, 0); }
40% { clip: rect(10px, 9999px, 35px, 0); }
60% { clip: rect(98px, 9999px, 4px, 0); }
80% { clip: rect(56px, 9999px, 15px, 0); }
100% { clip: rect(24px, 9999px, 90px, 0); }
}
/* Biometric Sonar Button */
.biometric-sonar-btn {
position: relative;
width: 100%;
padding: 20px;
background: rgba(0, 255, 128, 0.05);
border: 1px solid var(--accent-green);
border-radius: 4px;
color: var(--accent-green);
font-family: 'JetBrains Mono', monospace;
font-size: 1rem;
font-weight: bold;
letter-spacing: 2px;
cursor: pointer;
overflow: hidden;
transition: all 0.3s ease;
margin-bottom: 20px;
}
.biometric-sonar-btn:hover {
background: rgba(0, 255, 128, 0.15);
box-shadow: 0 0 20px rgba(0, 255, 128, 0.4);
}
.biometric-sonar-btn::after {
content: '';
position: absolute;
top: 50%; left: 50%;
width: 10px; height: 10px;
background: transparent;
border: 1px solid var(--accent-green);
border-radius: 50%;
transform: translate(-50%, -50%);
animation: sonarPulse 2s cubic-bezier(0.16, 1, 0.3, 1) infinite;
}
@keyframes sonarPulse {
0% { width: 10px; height: 10px; opacity: 1; }
100% { width: 300px; height: 300px; opacity: 0; }
}
/* Sniper Reticle QR */
.sniper-qr-container {
position: relative;
width: fit-content;
margin: 0 auto;
padding: 20px;
background: rgba(0, 243, 255, 0.05);
}
.sniper-qr-container::before, .sniper-qr-container::after,
.sniper-qr-container .corners::before, .sniper-qr-container .corners::after {
content: '';
position: absolute;
width: 20px; height: 20px;
border-color: var(--accent-cyan);
border-style: solid;
}
.sniper-qr-container::before { top: 0; left: 0; border-width: 2px 0 0 2px; }
.sniper-qr-container::after { top: 0; right: 0; border-width: 2px 2px 0 0; }
.sniper-qr-container .corners::before { bottom: 0; left: 0; border-width: 0 0 2px 2px; }
.sniper-qr-container .corners::after { bottom: 0; right: 0; border-width: 0 2px 2px 0; }
.cipher-text {
font-family: 'JetBrains Mono', monospace;
font-size: 0.75rem;
color: var(--accent-cyan);
margin-top: 15px;
letter-spacing: 1px;
}
/* Dropzone Reactor */
.reactor-dropzone {
border: 1px dashed var(--accent-yellow);
background: rgba(255, 234, 0, 0.02);
padding: 30px;
border-radius: 4px;
text-align: center;
color: var(--accent-yellow);
font-family: 'JetBrains Mono', monospace;
transition: all 0.3s;
}
/* Active Drag State */
.reactor-active {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(255, 0, 60, 0.1) !important;
border: 10px solid var(--accent-red) !important;
z-index: 9999;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
box-shadow: inset 0 0 100px rgba(255, 0, 60, 0.5);
animation: reactorBreathing 1s alternate infinite;
}
@keyframes reactorBreathing {
0% { background: rgba(255, 0, 60, 0.1); }
100% { background: rgba(255, 0, 60, 0.2); box-shadow: inset 0 0 200px rgba(255, 0, 60, 0.8); }
}
.typewriter-text {
overflow: hidden;
border-right: .15em solid var(--accent-red);
white-space: nowrap;
margin: 0 auto;
letter-spacing: .1em;
animation: typing 2s steps(40, end), blink-caret .75s step-end infinite;
}
@keyframes typing {
from { width: 0 }
to { width: 100% }
}
@keyframes blink-caret {
from, to { border-color: transparent }
50% { border-color: var(--accent-red); }
}
/* ========================================================
LIGHT THEME OVERRIDES (FASAD CAHAYA)
======================================================== */
.light-theme .login-gateway-container {
background-color: #f0f4f8;
}
.light-theme .hud-overlay {
background:
radial-gradient(circle at center, transparent 40%, rgba(255, 255, 255, 0.8) 100%),
repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0, 100, 255, 0.05) 3px, transparent 4px);
box-shadow: inset 0 0 100px rgba(0, 100, 255, 0.1);
}
.light-theme .radar-ring {
border: 1px dashed rgba(0, 100, 255, 0.2);
}
.light-theme .radar-ring::before {
background: rgba(0, 100, 255, 0.5);
box-shadow: 0 0 15px rgba(0, 100, 255, 0.8);
}
.light-theme .aegis-monolith {
background: rgba(255, 255, 255, 0.85);
border: 1px solid rgba(0, 100, 255, 0.2);
box-shadow: 0 0 50px rgba(0, 0, 0, 0.1), inset 0 0 20px rgba(0, 100, 255, 0.05);
}
.light-theme .supreme-title {
color: #111;
text-shadow: 0 0 15px rgba(0, 100, 255, 0.3);
}
.light-theme .kinetic-glitch::before,
.light-theme .kinetic-glitch::after {
background: transparent;
}
.light-theme .biometric-sonar-btn {
background: rgba(0, 150, 100, 0.1);
border: 1px solid #009664;
color: #009664;
}
.light-theme .biometric-sonar-btn:hover {
background: rgba(0, 150, 100, 0.2);
box-shadow: 0 0 20px rgba(0, 150, 100, 0.4);
}
.light-theme .biometric-sonar-btn::after {
border: 1px solid #009664;
}
.light-theme .reactor-dropzone {
border: 1px dashed #d97706;
background: rgba(217, 119, 6, 0.05);
color: #d97706;
}
.light-theme .reactor-active {
background: rgba(220, 38, 38, 0.1) !important;
border: 10px solid #dc2626 !important;
box-shadow: inset 0 0 100px rgba(220, 38, 38, 0.3);
}
@@ -0,0 +1,285 @@
import { useState, useEffect, useRef } from 'react';
import { useAuth } from '../context/AuthContext';
import { useI18n } from '../context/I18nContext';
import UniversalTopbar from './UniversalTopbar';
import './LoginGateway.css';
import { startAuthentication } from '@simplewebauthn/browser';
import QRCode from 'react-qr-code';
import signatureData from '../config/signature.json';
function DeepSpaceRadarCanvas() {
const canvasRef = useRef(null);
useEffect(() => {
const canvas = canvasRef.current;
if (!canvas) return;
const ctx = canvas.getContext('2d');
let width = canvas.width = window.innerWidth;
let height = canvas.height = window.innerHeight;
// Starfield
const stars = Array.from({ length: 200 }, () => ({
x: Math.random() * width,
y: Math.random() * height,
size: Math.random() * 2,
speed: Math.random() * 0.5 + 0.1,
brightness: Math.random()
}));
const draw = () => {
ctx.fillStyle = '#020108';
ctx.fillRect(0, 0, width, height);
stars.forEach(star => {
ctx.fillStyle = `rgba(255, 255, 255, ${star.brightness})`;
ctx.beginPath();
ctx.arc(star.x, star.y, star.size, 0, Math.PI * 2);
ctx.fill();
star.y += star.speed;
if (star.y > height) {
star.y = 0;
star.x = Math.random() * width;
}
});
};
const intervalId = setInterval(draw, 30);
const handleResize = () => {
width = canvas.width = window.innerWidth;
height = canvas.height = window.innerHeight;
};
window.addEventListener('resize', handleResize);
return () => {
clearInterval(intervalId);
window.removeEventListener('resize', handleResize);
};
}, []);
return (
<>
<canvas ref={canvasRef} className="quantum-canvas" />
<div className="hud-overlay" />
<div className="radar-ring" />
</>
);
}
export default function LoginGateway() {
const [error, setError] = useState('');
const [isAuthenticating, setIsAuthenticating] = useState(false);
const [opticalCode, setOpticalCode] = useState('AWAITING-SYNC...');
const [isDragging, setIsDragging] = useState(false);
const [mfaSession, setMfaSession] = useState(null);
const { aegisAuth } = useAuth();
const { t } = useI18n();
// Listen for Optical Challenge from IAM Gatekeeper
useEffect(() => {
const gatekeeperUrl = import.meta.env.VITE_GATEKEEPER_WS_URL || 'ws://localhost:4001';
const ws = new WebSocket(gatekeeperUrl);
ws.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
if (data.type === 'OPTICAL_CHALLENGE') {
setOpticalCode(data.payload);
}
} catch (e) {}
};
return () => {
if (ws.readyState === 1) ws.close();
};
}, []);
const handleAuthResult = (result) => {
if (result && result.mfa) {
setMfaSession(result.payload);
setError('');
} else {
setMfaSession(null);
}
};
const handleBiometricPulse = async () => {
setError('');
setIsAuthenticating(true);
try {
const gatekeeperUrl = import.meta.env.VITE_GATEKEEPER_WS_URL || 'ws://localhost:4001';
const ws = new WebSocket(gatekeeperUrl);
const authOptions = await new Promise((resolve, reject) => {
ws.onopen = () => {
ws.send(JSON.stringify({ type: 'GENERATE_AUTHENTICATION_OPTIONS', payload: {} }));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'AUTHENTICATION_OPTIONS') resolve(data.payload);
else if (data.type === 'AUTH_FAILED') reject(new Error(data.payload));
};
ws.onerror = () => reject(new Error('Koneksi WebAuthn Gagal'));
});
const asseResp = await startAuthentication(authOptions);
const res = await aegisAuth('BIOMETRIC_PULSE', asseResp, mfaSession?.sessionId);
handleAuthResult(res);
} catch (err) {
setError(err.message || t('access_denied'));
} finally {
setIsAuthenticating(false);
}
};
const handleOpticalSyncBypass = async () => {
setError('');
setIsAuthenticating(true);
try {
await new Promise(resolve => setTimeout(resolve, 1000));
const res = await aegisAuth('OPTICAL_SYNC', opticalCode, mfaSession?.sessionId);
handleAuthResult(res);
} catch (err) {
setError(err.message || t('access_denied'));
} finally {
setIsAuthenticating(false);
}
};
useEffect(() => {
const handleDragOver = (e) => { e.preventDefault(); e.stopPropagation(); setIsDragging(true); };
const handleDragEnter = (e) => { e.preventDefault(); e.stopPropagation(); setIsDragging(true); };
const handleDragLeave = (e) => {
e.preventDefault(); e.stopPropagation();
if (e.target === document || e.clientY <= 0 || e.clientX <= 0 || (e.clientX >= window.innerWidth || e.clientY >= window.innerHeight)) {
setIsDragging(false);
}
};
const handleGlobalDrop = async (e) => {
e.preventDefault(); e.stopPropagation(); setIsDragging(false);
const file = e.dataTransfer.files[0];
if (!file) return;
setError(''); setIsAuthenticating(true);
if (!file.name.endsWith('.xcu')) {
setError(t('format_rejected'));
setIsAuthenticating(false);
return;
}
const reader = new FileReader();
reader.onload = async (event) => {
try {
const fileContent = event.target.result.trim();
await new Promise(resolve => setTimeout(resolve, 800));
const res = await aegisAuth('AEGIS_KEYCARD', fileContent, mfaSession?.sessionId);
handleAuthResult(res);
} catch (err) {
setError(err.message || t('access_denied'));
} finally {
setIsAuthenticating(false);
}
};
reader.readAsText(file);
};
window.addEventListener('dragover', handleDragOver);
window.addEventListener('dragenter', handleDragEnter);
window.addEventListener('dragleave', handleDragLeave);
window.addEventListener('drop', handleGlobalDrop);
return () => {
window.removeEventListener('dragover', handleDragOver);
window.removeEventListener('dragenter', handleDragEnter);
window.removeEventListener('dragleave', handleDragLeave);
window.removeEventListener('drop', handleGlobalDrop);
};
}, [aegisAuth, t]);
return (
<div className="login-gateway-container">
<UniversalTopbar />
<DeepSpaceRadarCanvas />
{isDragging && (
<div className="reactor-active">
<div style={{fontSize: '5rem', marginBottom: '20px', animation: 'sonarPulse 1s infinite'}}></div>
<h1 style={{color: 'var(--accent-red)', fontFamily: 'monospace', letterSpacing: '5px'}}>{t('aegis_reactor_open')}</h1>
<p style={{color: '#fff', fontFamily: 'monospace'}}>{t('drop_key_to_trigger')}</p>
</div>
)}
{!isDragging && (
<div className="aegis-monolith">
<h1 className="supreme-title" data-text="XCU">
<span className="kinetic-glitch" data-text="XCU">XCU</span>
</h1>
<div className="supreme-subtitle" style={{marginBottom: '10px'}}>O M N I - E N G I N E G A T E W A Y</div>
<div style={{
textAlign: 'center', marginBottom: '40px', fontFamily: 'monospace',
color: 'var(--accent-cyan)', fontSize: '0.65rem', letterSpacing: '3px',
textShadow: '0 0 5px var(--accent-cyan)', opacity: 0.8
}}>
V.{signatureData.signature}
</div>
{error && (
<div style={{marginBottom: '25px', padding: '15px', background: 'rgba(255, 0, 60, 0.1)', borderLeft: '4px solid var(--accent-red)', color: 'var(--accent-red)', fontFamily: 'monospace'}}>
<div className="typewriter-text">{error}</div>
</div>
)}
{mfaSession ? (
<div style={{textAlign: 'center', animation: 'fadeIn 0.5s ease'}}>
<div style={{marginBottom: '20px', color: 'var(--accent-yellow)', fontFamily: 'monospace', borderBottom: '1px solid rgba(255,234,0,0.3)', paddingBottom: '10px'}}>
{t('mfa_sequence_activated')}
</div>
<p style={{color: 'var(--text-muted)', fontSize: '0.9rem', marginBottom: '30px', fontFamily: 'monospace'}}>
{t('mfa_sequence_desc')}
</p>
<div style={{display: 'flex', flexDirection: 'column', gap: '20px'}}>
{mfaSession.requiredSteps.includes('BIOMETRIC_PULSE') && (
<button className="biometric-sonar-btn" onClick={handleBiometricPulse} disabled={isAuthenticating}>
{isAuthenticating ? t('scanning') : t('biometric_pulse_l1')}
</button>
)}
{mfaSession.requiredSteps.includes('OPTICAL_SYNC') && (
<div className="sniper-qr-container">
<div className="corners" />
<QRCode value={opticalCode} size={150} bgColor="transparent" fgColor="var(--accent-cyan)" />
<div className="cipher-text" onClick={handleOpticalSyncBypass} style={{cursor: 'pointer'}}>
{t('decrypting_optical_l2')}
</div>
</div>
)}
{mfaSession.requiredSteps.includes('AEGIS_KEYCARD') && (
<div className="reactor-dropzone">
{t('aegis_keycard_l3')}<br/><span style={{fontSize: '0.7rem', color: 'var(--text-muted)'}}>{t('drag_drop_xcu')}</span>
</div>
)}
</div>
</div>
) : (
<div style={{animation: 'fadeIn 0.5s ease'}}>
<button className="biometric-sonar-btn" onClick={handleBiometricPulse} disabled={isAuthenticating} style={{marginTop: '20px'}}>
{isAuthenticating ? t('authorizing') : t('auth_fido2')}
</button>
<div style={{textAlign: 'center', marginTop: '30px'}}>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', fontFamily: 'monospace', marginBottom: '15px'}}>{t('or_use_bypass')}</div>
<div className="reactor-dropzone" style={{opacity: 0.7}}>
{t('drop_zone')}<br/>
<span style={{fontSize: '0.7rem'}}>{t('aegis_keycard_founder')}</span>
</div>
</div>
</div>
)}
</div>
)}
</div>
);
}
@@ -0,0 +1,246 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
// Module Manager — Supreme Admin CRUD for XCU Module Registry
// Dynamic: Add, Deactivate, Search modules. Data from xcu_iam PostgreSQL.
import { useState } from 'react';
import { useModuleRegistry } from '../context/ModuleRegistryContext';
import DangerModal from './DangerModal';
export default function ModuleManager() {
const { registry, allModules, totalModules, loading, source, addModule, deleteModule, refreshRegistry } = useModuleRegistry();
const [showAddForm, setShowAddForm] = useState(false);
const [searchQuery, setSearchQuery] = useState('');
const [deleteTarget, setDeleteTarget] = useState(null);
// Add module form state
const [newId, setNewId] = useState('');
const [newName, setNewName] = useState('');
const [newGroupId, setNewGroupId] = useState('group1');
const [newGroupName, setNewGroupName] = useState('');
const [newSortOrder, setNewSortOrder] = useState(100);
const [isSubmitting, setIsSubmitting] = useState(false);
// Derive available groups
const groups = Object.entries(registry).map(([key, val]) => ({
id: key,
name: val.name
}));
const handleAddModule = async () => {
if (!newId || !newName) return;
setIsSubmitting(true);
const groupName = newGroupName || (groups.find(g => g.id === newGroupId)?.name || newGroupId);
const success = await addModule({
id: newId,
name: newName,
group_id: newGroupId,
group_name: groupName,
sort_order: Number(newSortOrder)
});
if (success) {
setNewId('');
setNewName('');
setNewSortOrder(totalModules + 1);
setNewGroupName('');
setShowAddForm(false);
}
setIsSubmitting(false);
};
const handleDeleteConfirm = async () => {
if (!deleteTarget) return;
await deleteModule(deleteTarget);
setDeleteTarget(null);
};
// Filter modules
const q = searchQuery.toLowerCase();
const filteredGroups = Object.entries(registry).map(([key, group]) => ({
key,
name: group.name,
modules: (group.modules || []).filter(m =>
!q || m.id.toLowerCase().includes(q) || m.name.toLowerCase().includes(q)
)
})).filter(g => g.modules.length > 0);
const filteredCount = filteredGroups.reduce((sum, g) => sum + g.modules.length, 0);
if (loading) {
return (
<div style={{display: 'flex', alignItems: 'center', justifyContent: 'center', height: '300px', color: 'var(--accent-cyan)', fontFamily: 'monospace'}}>
LOADING SOVEREIGN MODULE REGISTRY...
</div>
);
}
return (
<div style={{animation: 'fadeIn 0.5s ease-out'}}>
<DangerModal
isOpen={!!deleteTarget}
title="DEACTIVATE MODULE"
message={`Anda akan menonaktifkan modul ${deleteTarget}. Modul tidak dihapus permanen, tapi tidak akan muncul di registry aktif. Lanjut?`}
onConfirm={handleDeleteConfirm}
onCancel={() => setDeleteTarget(null)}
confirmText="DEACTIVATE MODULE"
/>
{/* Header */}
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: '30px', gap: '20px', flexWrap: 'wrap'}}>
<div>
<h2 style={{color: 'var(--text-main)', fontFamily: 'monospace', letterSpacing: '2px', marginBottom: '10px'}}>
SOVEREIGN MODULE REGISTRY
</h2>
<p style={{color: 'var(--text-muted)', fontSize: '0.9rem'}}>
Dynamic Module CRUD Source: <span style={{color: source === 'API' ? 'var(--accent-green)' : 'var(--accent-yellow)', fontWeight: 'bold'}}>{source === 'API' ? 'xcu_iam PostgreSQL' : 'Static Fallback'}</span>
</p>
</div>
<div style={{display: 'flex', gap: '10px', alignItems: 'center'}}>
{/* Stats */}
<div style={{
background: 'rgba(0, 243, 255, 0.1)', border: '1px solid var(--accent-cyan)',
padding: '10px 20px', borderRadius: '8px', fontFamily: 'monospace', textAlign: 'center'
}}>
<div style={{color: 'var(--accent-cyan)', fontSize: '1.8rem', fontWeight: 'bold'}}>{totalModules}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.7rem', letterSpacing: '1px'}}>ACTIVE MODULES</div>
</div>
<div style={{
background: 'rgba(168, 85, 247, 0.1)', border: '1px solid var(--accent-purple)',
padding: '10px 20px', borderRadius: '8px', fontFamily: 'monospace', textAlign: 'center'
}}>
<div style={{color: 'var(--accent-purple)', fontSize: '1.8rem', fontWeight: 'bold'}}>{Object.keys(registry).length}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.7rem', letterSpacing: '1px'}}>GROUPS</div>
</div>
<button onClick={refreshRegistry} style={{
padding: '10px 20px', background: 'transparent', border: '1px solid var(--accent-green)',
color: 'var(--accent-green)', borderRadius: '8px', cursor: 'pointer', fontFamily: 'monospace'
}}> REFRESH</button>
<button onClick={() => { setShowAddForm(!showAddForm); setNewSortOrder(totalModules + 1); setNewId(`m${totalModules + 1}`); }} style={{
padding: '10px 20px', background: showAddForm ? 'var(--accent-cyan)' : 'transparent',
border: '1px solid var(--accent-cyan)', borderRadius: '8px', cursor: 'pointer', fontFamily: 'monospace',
color: showAddForm ? '#000' : 'var(--accent-cyan)', fontWeight: 'bold'
}}>+ ADD MODULE</button>
</div>
</div>
{/* Add Module Form */}
{showAddForm && (
<div className="glass-panel" style={{
padding: '25px', marginBottom: '30px', borderLeft: '4px solid var(--accent-cyan)',
animation: 'fadeIn 0.3s ease-out'
}}>
<h3 style={{color: 'var(--accent-cyan)', marginBottom: '20px', fontFamily: 'monospace'}}>FORGE NEW MODULE</h3>
<div style={{display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(200px, 1fr))', gap: '15px'}}>
<div>
<label style={{color: 'var(--text-muted)', fontSize: '0.75rem', display: 'block', marginBottom: '5px'}}>MODULE ID</label>
<input value={newId} onChange={e => setNewId(e.target.value)} placeholder="m100"
style={{width: '100%', padding: '10px', background: 'var(--hover-bg)', border: '1px solid var(--table-border)', color: 'var(--text-main)', borderRadius: '6px', fontFamily: 'monospace'}} />
</div>
<div>
<label style={{color: 'var(--text-muted)', fontSize: '0.75rem', display: 'block', marginBottom: '5px'}}>MODULE NAME</label>
<input value={newName} onChange={e => setNewName(e.target.value)} placeholder="Quantum Flux Capacitor"
style={{width: '100%', padding: '10px', background: 'var(--hover-bg)', border: '1px solid var(--table-border)', color: 'var(--text-main)', borderRadius: '6px', fontFamily: 'monospace'}} />
</div>
<div>
<label style={{color: 'var(--text-muted)', fontSize: '0.75rem', display: 'block', marginBottom: '5px'}}>GROUP</label>
<select value={newGroupId} onChange={e => setNewGroupId(e.target.value)}
style={{width: '100%', padding: '10px', background: 'var(--hover-bg)', border: '1px solid var(--table-border)', color: 'var(--text-main)', borderRadius: '6px', fontFamily: 'monospace'}}>
{groups.map(g => <option key={g.id} value={g.id}>{g.name}</option>)}
<option value="new">+ NEW GROUP</option>
</select>
</div>
{newGroupId === 'new' && (
<div>
<label style={{color: 'var(--text-muted)', fontSize: '0.75rem', display: 'block', marginBottom: '5px'}}>NEW GROUP NAME</label>
<input value={newGroupName} onChange={e => setNewGroupName(e.target.value)} placeholder="KELOMPOK IX: ..."
style={{width: '100%', padding: '10px', background: 'var(--hover-bg)', border: '1px solid var(--table-border)', color: 'var(--text-main)', borderRadius: '6px', fontFamily: 'monospace'}} />
</div>
)}
<div>
<label style={{color: 'var(--text-muted)', fontSize: '0.75rem', display: 'block', marginBottom: '5px'}}>SORT ORDER</label>
<input type="number" value={newSortOrder} onChange={e => setNewSortOrder(e.target.value)}
style={{width: '100%', padding: '10px', background: 'var(--hover-bg)', border: '1px solid var(--table-border)', color: 'var(--text-main)', borderRadius: '6px', fontFamily: 'monospace'}} />
</div>
</div>
<div style={{marginTop: '20px', display: 'flex', gap: '10px'}}>
<button onClick={handleAddModule} disabled={isSubmitting || !newId || !newName} style={{
padding: '10px 30px', background: 'var(--accent-cyan)', color: '#000', border: 'none',
borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace', fontWeight: 'bold',
opacity: (!newId || !newName || isSubmitting) ? 0.5 : 1
}}>{isSubmitting ? 'FORGING...' : 'FORGE MODULE'}</button>
<button onClick={() => setShowAddForm(false)} style={{
padding: '10px 30px', background: 'transparent', color: 'var(--text-muted)',
border: '1px solid var(--table-border)', borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace'
}}>CANCEL</button>
</div>
</div>
)}
{/* Search */}
<div style={{marginBottom: '20px', position: 'relative'}}>
<input
value={searchQuery} onChange={e => setSearchQuery(e.target.value)}
placeholder="Search modules by ID or name..."
style={{
width: '100%', padding: '12px 20px', background: 'var(--hover-bg)',
border: '1px solid var(--table-border)', color: 'var(--text-main)',
borderRadius: '8px', fontFamily: 'monospace', fontSize: '0.9rem', outline: 'none'
}}
/>
{searchQuery && (
<span style={{position: 'absolute', right: '15px', top: '12px', color: 'var(--text-muted)', fontFamily: 'monospace', fontSize: '0.8rem'}}>
{filteredCount} / {totalModules}
</span>
)}
</div>
{/* Module Grid */}
<div style={{display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(450px, 1fr))', gap: '20px'}}>
{filteredGroups.map(group => {
const groupColors = {
group1: '#00f3ff', group2: '#ffea00', group3: '#ff003c', group4: '#a855f7',
group5: '#10b981', group6: '#3b82f6', group7: '#f97316', group8: '#ef4444'
};
const color = groupColors[group.key] || '#00f3ff';
return (
<div key={group.key} className="glass-panel" style={{
padding: '20px', borderTop: `3px solid ${color}`,
background: 'var(--panel-bg)', borderRadius: '10px'
}}>
<h3 style={{color, fontSize: '0.85rem', marginBottom: '15px', fontFamily: 'monospace', letterSpacing: '1px',
borderBottom: '1px solid var(--table-border)', paddingBottom: '10px', display: 'flex', justifyContent: 'space-between'}}>
<span>{group.name}</span>
<span style={{color: 'var(--text-muted)'}}>[{group.modules.length}]</span>
</h3>
<div style={{display: 'flex', flexDirection: 'column', gap: '6px', maxHeight: '400px', overflowY: 'auto', paddingRight: '5px'}} className="custom-scrollbar">
{group.modules.map(mod => (
<div key={mod.id} style={{
display: 'flex', justifyContent: 'space-between', alignItems: 'center',
padding: '8px 12px', background: 'var(--hover-bg)', borderRadius: '6px',
border: '1px solid var(--table-border)', transition: 'all 0.2s'
}}>
<div>
<span style={{color: 'var(--text-main)', fontSize: '0.85rem'}}>{mod.name}</span>
<span style={{color: 'var(--text-muted)', fontSize: '0.7rem', marginLeft: '8px', fontFamily: 'monospace'}}>{mod.id}</span>
</div>
<button onClick={() => setDeleteTarget(mod.id)} title="Deactivate module" style={{
background: 'transparent', border: '1px solid rgba(255,0,60,0.3)', color: 'var(--accent-red)',
padding: '4px 10px', borderRadius: '4px', cursor: 'pointer', fontFamily: 'monospace', fontSize: '0.7rem',
transition: 'all 0.2s'
}}></button>
</div>
))}
</div>
</div>
);
})}
</div>
</div>
);
}
@@ -0,0 +1,163 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { useState } from 'react';
import { useCommercial } from '../context/CommercialContext';
import { useModuleRegistry } from '../context/ModuleRegistryContext';
export default function ModulePricingMatrix() {
const { modulePrices, updateModulePrice, activeCurrency, setActiveCurrency, formatDynamicCurrency } = useCommercial();
const { registry, totalModules } = useModuleRegistry();
// Local state for tracking which module is currently being edited
const [editingModId, setEditingModId] = useState(null);
const [editVal, setEditVal] = useState('');
const handleEdit = (modId, currentPrice) => {
setEditingModId(modId);
setEditVal(currentPrice);
};
const handleSave = (modId) => {
updateModulePrice(modId, editVal);
setEditingModId(null);
};
const handleKeyDown = (e, modId) => {
if (e.key === 'Enter') handleSave(modId);
if (e.key === 'Escape') setEditingModId(null);
};
return (
<div style={{animation: 'fadeIn 0.5s ease-out'}}>
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '30px'}}>
<div>
<h2 style={{color: 'var(--text-main)', marginBottom: '10px', fontFamily: 'monospace', letterSpacing: '2px'}}>DECENTRALIZED MODULE PRICING</h2>
<p style={{color: 'var(--text-muted)'}}>
A La Carte Base Price configuration. This dictation affects all independent module acquisitions across the Multi-Tenant Gateways.
</p>
</div>
<div style={{display: 'flex', gap: '15px', alignItems: 'center'}}>
<button
onClick={() => {
if(window.confirm(`WARNING: This will reset all ${totalModules} modules back to the default Base Price (Rp 1.500.000). Proceed?`)) {
localStorage.removeItem('xcu_module_prices');
window.location.reload();
}
}}
style={{
padding: '8px 16px', background: 'transparent', border: '1px solid var(--accent-yellow)',
color: 'var(--accent-yellow)', borderRadius: '6px', cursor: 'pointer',
fontFamily: 'monospace', transition: 'all 0.3s'
}}
onMouseOver={e => {e.target.style.background = 'rgba(255, 234, 0, 0.1)'}}
onMouseOut={e => {e.target.style.background = 'transparent'}}
>
â» RESTORE DEFAULT
</button>
{/* Multi-Currency Switcher */}
<div style={{display: 'flex', background: 'var(--panel-bg)', padding: '5px', borderRadius: '8px', border: '1px solid var(--table-border)'}}>
{['IDR', 'USD', 'BTC'].map(currency => (
<button
key={currency}
onClick={() => setActiveCurrency(currency)}
style={{
padding: '8px 16px',
background: activeCurrency === currency ? 'var(--accent-cyan)' : 'transparent',
color: activeCurrency === currency ? '#000' : 'var(--text-muted)',
border: 'none',
borderRadius: '6px',
cursor: 'pointer',
fontFamily: 'monospace',
fontWeight: activeCurrency === currency ? 'bold' : 'normal',
transition: 'all 0.3s'
}}
>
{currency}
</button>
))}
</div>
</div>
</div>
<div style={{display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(400px, 1fr))', gap: '30px'}}>
{Object.entries(registry).map(([coreKey, core]) => {
// Determine core theme color
let themeColor = 'var(--accent-cyan)';
if (coreKey === 'beta') themeColor = 'var(--accent-yellow)';
if (coreKey === 'gamma') themeColor = 'var(--accent-red)';
if (coreKey === 'omega') themeColor = 'var(--accent-purple)';
if (coreKey === 'transcendence') themeColor = 'var(--accent-green)';
return (
<div key={coreKey} className="glass-panel" style={{
background: 'var(--panel-bg)',
borderTop: `4px solid ${themeColor}`,
borderRadius: '12px',
padding: '25px',
position: 'relative'
}}>
<h3 style={{color: themeColor, fontSize: '1.2rem', marginBottom: '20px', letterSpacing: '1px', borderBottom: `1px solid var(--table-border)`, paddingBottom: '10px'}}>
{core.name}
</h3>
<div style={{display: 'flex', flexDirection: 'column', gap: '10px', maxHeight: '400px', overflowY: 'auto', paddingRight: '10px'}} className="custom-scrollbar">
{core.modules.map(mod => {
const currentPrice = modulePrices[mod.id] || 0;
const isEditing = editingModId === mod.id;
return (
<div key={mod.id} style={{
display: 'flex', justifyContent: 'space-between', alignItems: 'center',
background: 'var(--hover-bg)', padding: '12px 15px', borderRadius: '8px',
border: `1px solid var(--table-border)`, transition: 'all 0.2s',
boxShadow: isEditing ? `0 0 15px ${themeColor}20` : 'none'
}}>
<div style={{flex: 1}}>
<div style={{color: 'var(--text-main)', fontSize: '0.9rem', fontWeight: 'bold'}}>{mod.name}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.75rem', fontFamily: 'monospace', marginTop: '4px'}}>ID: {mod.id}</div>
</div>
<div style={{display: 'flex', alignItems: 'center', gap: '10px'}}>
{!isEditing ? (
<div
onClick={() => handleEdit(mod.id, currentPrice)}
style={{
color: themeColor, fontSize: '1.1rem', fontFamily: 'monospace',
cursor: 'pointer', padding: '5px 10px', borderRadius: '4px',
background: 'rgba(0,0,0,0.1)'
}}
title="Click to edit Base Price"
>
{formatDynamicCurrency(currentPrice)}
</div>
) : (
<div style={{display: 'flex', alignItems: 'center', gap: '5px'}}>
<span style={{color: 'var(--text-muted)', fontSize: '0.8rem'}}>IDR</span>
<input
type="number"
autoFocus
value={editVal}
onChange={(e) => setEditVal(e.target.value)}
onKeyDown={(e) => handleKeyDown(e, mod.id)}
onBlur={() => handleSave(mod.id)}
style={{
width: '120px', padding: '6px 10px', background: 'var(--panel-bg)',
border: `1px solid ${themeColor}`, color: 'var(--text-main)',
borderRadius: '4px', fontFamily: 'monospace', fontSize: '1rem', outline: 'none'
}}
/>
</div>
)}
</div>
</div>
);
})}
</div>
</div>
);
})}
</div>
</div>
);
}
@@ -0,0 +1,125 @@
import { useState, useEffect } from 'react';
import { useI18n } from '../context/I18nContext';
export default function NotificationMatrix() {
const { t } = useI18n();
const [channels, setChannels] = useState({
whatsapp: true,
telegram: true,
signal: true,
sms: true,
email: true,
postal: true
});
const [warningMessage, setWarningMessage] = useState(null);
const toggleChannel = (key) => {
setChannels(prev => {
const newState = { ...prev, [key]: !prev[key] };
// Zero-Escape Protocol Validation
const activeOnlineChannels = ['whatsapp', 'telegram', 'signal', 'sms', 'email'].filter(c => newState[c]);
if (activeOnlineChannels.length === 0) {
// Blokir mutasi jika semua channel online dimatikan
setWarningMessage('PROTOCOL ZERO-ESCAPE TERPICU: Anda wajib mengaktifkan minimal satu jalur notifikasi elektronik/online untuk memastikan penerimaan tagihan.');
return prev;
}
setWarningMessage(null);
return newState;
});
};
const channelInfo = [
{ key: 'whatsapp', name: 'WhatsApp Business', desc: 'Notifikasi instan dengan verifikasi end-to-end terenkripsi.', icon: '💬', color: '#25D366' },
{ key: 'telegram', name: 'Telegram Bot', desc: 'Integrasi notifikasi super-cepat ke perangkat seluler dan desktop.', icon: '✈️', color: '#0088cc' },
{ key: 'signal', name: 'Signal Secure Messenger', desc: 'Protokol pengingat ultra-privasi tinggi.', icon: '🔒', color: '#3A76F0' },
{ key: 'sms', name: 'SMS Gateway', desc: 'Pengingat fallback langsung ke nomor telepon seluler.', icon: '📱', color: '#ff9900' },
{ key: 'email', name: 'E-Mail', desc: 'Pengiriman Invoice lengkap berformat PDF.', icon: '📧', color: '#ea4335' },
{ key: 'postal', name: 'Surat Pos Fisik', desc: 'Pengiriman Invoice fisik tercetak ke alamat kantor terdaftar.', icon: '📮', color: '#888' },
];
return (
<div style={{animation: 'fadeIn 0.5s ease-out'}}>
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '30px'}}>
<div>
<h2 style={{color: 'var(--text-main)', fontSize: '1.8rem', letterSpacing: '1px', textTransform: 'uppercase'}}>Omni-Messenger Preferences</h2>
<p style={{color: 'var(--text-muted)'}}>Sesuaikan jalur komunikasi tagihan sesuai tingkat kenyamanan operasional Anda.</p>
</div>
</div>
{warningMessage && (
<div style={{
padding: '15px 20px', background: 'rgba(255, 0, 60, 0.1)', border: '1px solid var(--accent-red)',
borderRadius: '8px', color: 'var(--accent-red)', marginBottom: '30px', animation: 'shake 0.4s',
fontFamily: 'monospace', fontSize: '0.9rem'
}}>
{warningMessage}
</div>
)}
<div className="grid-cards" style={{display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(300px, 1fr))', gap: '20px'}}>
{channelInfo.map(ch => {
const isActive = channels[ch.key];
return (
<div key={ch.key} className="glass-panel" style={{
padding: '25px', display: 'flex', flexDirection: 'column',
border: `1px solid ${isActive ? ch.color : 'var(--table-border)'}`,
background: isActive ? `${ch.color}0A` : 'var(--panel-bg)',
transition: 'all 0.3s ease',
boxShadow: isActive ? `0 0 15px ${ch.color}20` : 'none'
}}>
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '15px'}}>
<div style={{display: 'flex', alignItems: 'center', gap: '10px'}}>
<span style={{fontSize: '1.5rem'}}>{ch.icon}</span>
<h3 style={{color: isActive ? 'var(--text-main)' : 'var(--text-muted)', fontSize: '1.1rem'}}>{ch.name}</h3>
</div>
{/* KINETIC TOGGLE SWITCH */}
<div
onClick={() => toggleChannel(ch.key)}
style={{
width: '50px', height: '26px',
background: isActive ? ch.color : '#333',
borderRadius: '13px',
position: 'relative',
cursor: 'pointer',
transition: 'all 0.3s ease'
}}>
<div style={{
width: '20px', height: '20px',
background: '#fff',
borderRadius: '50%',
position: 'absolute',
top: '3px',
left: isActive ? '27px' : '3px',
transition: 'all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55)',
boxShadow: '0 2px 5px rgba(0,0,0,0.2)'
}}></div>
</div>
</div>
<p style={{color: 'var(--text-muted)', fontSize: '0.85rem', lineHeight: '1.5', flex: 1}}>
{ch.desc}
</p>
<div style={{marginTop: '20px', fontSize: '0.7rem', color: isActive ? ch.color : 'var(--text-muted)', fontFamily: 'monospace', fontWeight: 'bold'}}>
STATUS: {isActive ? 'ACTIVE & ROUTED' : 'DEACTIVATED'}
</div>
</div>
);
})}
</div>
<div className="glass-panel" style={{padding: '20px', marginTop: '30px', borderLeft: '4px solid var(--accent-cyan)'}}>
<h4 style={{color: 'var(--accent-cyan)', marginBottom: '5px'}}>The Omni-Messenger Guarantee</h4>
<p style={{color: 'var(--text-muted)', fontSize: '0.85rem', lineHeight: '1.6'}}>
Sistem notifikasi Omni-Messenger memiliki protokol eskalasi otomatis. Jika pengiriman melalui metode utama (misal: Telegram) gagal diverifikasi (tidak ada *delivery receipt*), sistem akan secara otomatis melimpahkan pesan ke rute komunikasi *fallback* aktif Anda berikutnya untuk menjamin informasi tagihan Anda tidak terlewatkan.
</p>
</div>
</div>
);
}
@@ -0,0 +1,147 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { useCommercial } from '../context/CommercialContext';
import { useI18n } from '../context/I18nContext';
export default function OmniBillingOrchestrator() {
const { taxRate, setTaxRate, activeGateways, setActiveGateways } = useCommercial();
const { t } = useI18n();
const handleTaxChange = (e) => {
setTaxRate(Number(e.target.value));
};
const toggleGateway = (key) => {
setActiveGateways(prev => ({
...prev,
[key]: !prev[key]
}));
};
const gateways = [
{ key: 'stripe', name: 'Stripe (Global Credit Cards)', color: '#635BFF' },
{ key: 'xendit', name: 'Xendit (SEA Virtual Accounts)', color: '#0055ff' },
{ key: 'crypto', name: 'Crypto (BTC / ETH / USDT)', color: '#f7931a' },
{ key: 'unionpay', name: 'UnionPay (APAC Network)', color: '#D32F2F' },
{ key: 'bank_transfer', name: 'International Bank Transfer', color: '#4CAF50' },
{ key: 'cash_manual', name: 'Manual Cash / Cheque', color: '#888' }
];
return (
<div style={{animation: 'fadeIn 0.5s ease-out'}}>
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '30px'}}>
<div>
<h2 style={{color: 'var(--text-main)', fontSize: '1.8rem', letterSpacing: '1px', textTransform: 'uppercase'}}>Omni-Billing Orchestrator</h2>
<p style={{color: 'var(--text-muted)'}}>Kendali mutlak atas gerbang pembayaran universal dan perpajakan dinamis lintas dimensi.</p>
</div>
<div style={{padding: '10px 20px', background: 'rgba(0, 255, 136, 0.1)', border: '1px solid var(--accent-green)', borderRadius: '8px', color: 'var(--accent-green)', fontFamily: 'monospace', fontWeight: 'bold'}}>
QUANTUM SYNC: ACTIVE
</div>
</div>
<div className="grid-cards" style={{display: 'grid', gridTemplateColumns: '1fr 2fr', gap: '30px'}}>
{/* TAX ORCHESTRATOR */}
<div className="glass-panel" style={{padding: '30px', display: 'flex', flexDirection: 'column'}}>
<h3 style={{color: 'var(--accent-purple)', marginBottom: '10px', textTransform: 'uppercase', letterSpacing: '1px'}}>Dynamic Tax Matrix</h3>
<p style={{color: 'var(--text-muted)', fontSize: '0.9rem', marginBottom: '30px'}}>Atur tarif pajak secara live. Perubahan akan seketika di-broadcast ke seluruh layar Tenant.</p>
<div style={{textAlign: 'center', marginBottom: '20px'}}>
<span style={{fontSize: '4rem', fontWeight: 'bold', color: 'var(--text-main)', fontFamily: 'monospace', textShadow: '0 0 20px rgba(168, 85, 247, 0.5)'}}>
{taxRate}%
</span>
</div>
<input
type="range"
min="0"
max="100"
value={taxRate}
onChange={handleTaxChange}
style={{
width: '100%',
cursor: 'pointer',
accentColor: 'var(--accent-purple)',
marginBottom: '10px'
}}
/>
<div style={{display: 'flex', justifyContent: 'space-between', color: 'var(--text-muted)', fontSize: '0.8rem', fontFamily: 'monospace'}}>
<span>0% (Tax Free)</span>
<span>100% (Absolute Tax)</span>
</div>
</div>
{/* PAYMENT GATEWAYS */}
<div className="glass-panel" style={{padding: '30px'}}>
<h3 style={{color: 'var(--accent-cyan)', marginBottom: '10px', textTransform: 'uppercase', letterSpacing: '1px'}}>Universal Payment Gateways</h3>
<p style={{color: 'var(--text-muted)', fontSize: '0.9rem', marginBottom: '30px'}}>Aktifkan atau matikan gerbang pembayaran. Tenant tidak akan bisa menggunakan gerbang yang dimatikan.</p>
<div style={{display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(200px, 1fr))', gap: '15px'}}>
{gateways.map(gw => {
const isActive = activeGateways[gw.key];
return (
<div
key={gw.key}
onClick={() => toggleGateway(gw.key)}
style={{
padding: '15px',
background: isActive ? `${gw.color}15` : 'var(--hover-bg)',
border: `1px solid ${isActive ? gw.color : 'var(--table-border)'}`,
borderRadius: '8px',
cursor: 'pointer',
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
transition: 'all 0.2s ease',
boxShadow: isActive ? `0 0 15px ${gw.color}30` : 'none'
}}
>
<span style={{color: isActive ? 'var(--text-main)' : 'var(--text-muted)', fontWeight: isActive ? 'bold' : 'normal', fontSize: '0.9rem'}}>
{gw.name}
</span>
<div style={{
width: '40px', height: '20px',
background: isActive ? gw.color : '#333',
borderRadius: '10px',
position: 'relative',
transition: 'all 0.3s ease'
}}>
<div style={{
width: '16px', height: '16px',
background: '#fff',
borderRadius: '50%',
position: 'absolute',
top: '2px',
left: isActive ? '22px' : '2px',
transition: 'all 0.3s ease'
}}></div>
</div>
</div>
);
})}
</div>
</div>
</div>
{/* GLOBAL REMINDER PROTOCOL */}
<div className="glass-panel" style={{padding: '30px', marginTop: '30px'}}>
<h3 style={{color: 'var(--accent-yellow)', marginBottom: '10px', textTransform: 'uppercase', letterSpacing: '1px'}}>Global Omni-Messenger Analytics</h3>
<p style={{color: 'var(--text-muted)', fontSize: '0.9rem', marginBottom: '20px'}}>Pantauan real-time tingkat keberhasilan notifikasi pengingat ke Tenant.</p>
<div style={{display: 'flex', gap: '20px'}}>
<div style={{flex: 1, background: 'var(--hover-bg)', border: '1px solid var(--table-border)', padding: '20px', borderRadius: '8px', textAlign: 'center'}}>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', marginBottom: '10px'}}>DELIVERY SUCCESS RATE</div>
<div style={{fontSize: '2rem', color: 'var(--accent-green)', fontWeight: 'bold', fontFamily: 'monospace'}}>99.99%</div>
</div>
<div style={{flex: 1, background: 'var(--hover-bg)', border: '1px solid var(--table-border)', padding: '20px', borderRadius: '8px', textAlign: 'center'}}>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', marginBottom: '10px'}}>ZERO-ESCAPE BYPASS ATTEMPTS</div>
<div style={{fontSize: '2rem', color: 'var(--accent-red)', fontWeight: 'bold', fontFamily: 'monospace'}}>0</div>
</div>
<div style={{flex: 1, background: 'var(--hover-bg)', border: '1px solid var(--table-border)', padding: '20px', borderRadius: '8px', textAlign: 'center'}}>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', marginBottom: '10px'}}>ACTIVE REMINDER CHANNELS</div>
<div style={{fontSize: '2rem', color: 'var(--accent-cyan)', fontWeight: 'bold', fontFamily: 'monospace'}}>6/6</div>
</div>
</div>
</div>
</div>
);
}
@@ -0,0 +1,59 @@
import { useEffect, useRef } from 'react';
export default function OuroborosCanvas() {
const canvasRef = useRef(null);
useEffect(() => {
const canvas = canvasRef.current;
if (!canvas) return;
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
let animationId;
let opacity = 0.1;
let increasing = true;
const render = () => {
// Real absolute pulsation without random noise
if (increasing) {
opacity += 0.01;
if (opacity >= 0.8) increasing = false;
} else {
opacity -= 0.01;
if (opacity <= 0.1) increasing = true;
}
ctx.fillStyle = `rgba(255, 0, 0, ${opacity})`;
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Simple text warning (Absolute, No Math.random)
ctx.fillStyle = 'white';
ctx.font = 'bold 50px monospace';
ctx.textAlign = 'center';
ctx.fillText('OUROBOROS KILL-SWITCH ENGAGED', canvas.width / 2, canvas.height / 2);
ctx.font = '20px monospace';
ctx.fillText('SYSTEM IS DEAD.', canvas.width / 2, (canvas.height / 2) + 40);
animationId = requestAnimationFrame(render);
};
render();
return () => cancelAnimationFrame(animationId);
}, []);
return (
<canvas
ref={canvasRef}
style={{
position: 'fixed',
top: 0,
left: 0,
zIndex: 9999,
width: '100vw',
height: '100vh',
pointerEvents: 'none'
}}
/>
);
}
@@ -0,0 +1,239 @@
import { useState, useEffect, useRef } from 'react';
import { useIam } from '../context/IamContext';
export default function QuantumSandbox({ moduleId }) {
const { identity } = useIam();
const [logs, setLogs] = useState([]);
const [isWasmLoaded, setIsWasmLoaded] = useState(false);
const [wasmSdk, setWasmSdk] = useState(null);
// Status koneksi Kuantum (WebTransport)
const [isConnected, setIsConnected] = useState(false);
const [isConnecting, setIsConnecting] = useState(false);
// Chat State (Scribe)
const [messages, setMessages] = useState([]);
const [inputMessage, setInputMessage] = useState('');
const logEndRef = useRef(null);
// Feature Gating: Cek apakah tenant punya hak akses OMNI-ENGINE
const hasOmniAccess = identity?.packages?.includes('JUMPA.ID OMNI-ENGINE');
// Menambahkan log ke konsol Kinetic
const addLog = (msg, type = 'info') => {
const timestamp = new Date().toISOString().split('T')[1].slice(0, -1);
setLogs(prev => [...prev.slice(-49), { text: `[${timestamp}] ${msg}`, type }]);
};
useEffect(() => {
if (logEndRef.current) {
logEndRef.current.scrollIntoView({ behavior: 'smooth' });
}
}, [logs]);
// Load WASM SDK
useEffect(() => {
let mounted = true;
async function loadWasm() {
try {
addLog('Mencari cip WebAssembly dari Edge Server...', 'system');
// Dynamic Import dari public/sdk (ES Module)
const sdkUrl = window.location.origin + '/sdk/xcu_wasm_sdk.js?v=' + Date.now();
const sdk = await import(sdkUrl);
// Inisialisasi WASM
await sdk.default();
if (mounted) {
setWasmSdk(sdk);
setIsWasmLoaded(true);
addLog('CIP WEBASSEMBLY (RUST CORE) BERHASIL DIMUAT KE DALAM MEMORI PERAMBAN!', 'success');
}
} catch (err) {
if (mounted) {
addLog('GAGAL MEMUAT WASM: ' + err.message, 'error');
console.error(err);
}
}
}
loadWasm();
return () => { mounted = false; };
}, []);
const handleConnect = async () => {
setIsConnecting(true);
addLog('Melakukan Pukulan UDP (UDP Punching) ke SG-1 (Port 8443)...', 'system');
// Simulasi waktu tempuh WebTransport (karena ini sandbox)
setTimeout(() => {
addLog('Handshake WebTransport (QUIC) Berhasil. Latensi: 4ms.', 'success');
setIsConnected(true);
setIsConnecting(false);
}, 1500);
};
const handleSendMessage = (e) => {
e.preventDefault();
if (!inputMessage.trim()) return;
// Simulasi pengiriman via WASM CRDT Scribe
const msg = inputMessage;
setInputMessage('');
addLog(`[CRDT Scribe] Memancarkan Datagram: "${msg}"`, 'info');
setMessages(prev => [...prev, { sender: 'You', text: msg }]);
setTimeout(() => {
setMessages(prev => [...prev, { sender: 'SG-1 ECHO', text: `Echo dari lorong Kuantum: ${msg}` }]);
addLog(`[CRDT Scribe] Gema diterima dalam 4ms.`, 'success');
}, 300);
};
// Fungsi-Fungsi Senjata Rahasia
const fireWeapon = async (weaponName, sdkFunction) => {
if (!hasOmniAccess) {
addLog(`AKSES DITOLAK: Fitur [${weaponName}] membutuhkan Lisensi OMNI-ENGINE!`, 'error');
return;
}
if (!isWasmLoaded) {
addLog('WASM belum dimuat!', 'error');
return;
}
addLog(`MEMICU PROTOKOL: ${weaponName}...`, 'warning');
try {
if (weaponName === 'Neural Whisper') {
await sdkFunction('id-ID'); // Bahasa Indonesia
} else if (weaponName === 'Aegis Watermark') {
await sdkFunction('A8F9C2B'); // Hex Seed
} else if (weaponName === 'Doppler Matrix') {
await sdkFunction('XCU-SECURE-PAYLOAD');
} else {
await sdkFunction();
}
addLog(`[BERHASIL] ${weaponName} aktif! Cek console browser (F12) untuk log dari Rust.`, 'success');
} catch (err) {
addLog(`[GAGAL] Eksekusi ${weaponName} dibatalkan: ${err.message}`, 'error');
}
};
return (
<div style={{ display: 'flex', gap: '20px', marginTop: '20px' }}>
{/* KOLOM KIRI: Taktikal Obrolan & Video */}
<div className="glass-panel" style={{ flex: 2, padding: '20px', borderColor: 'var(--accent-purple)', display: 'flex', flexDirection: 'column' }}>
<h2 style={{ color: 'var(--accent-purple)', marginBottom: '15px', textTransform: 'uppercase' }}>
OMNI-LINK: {moduleId}
</h2>
<div style={{ display: 'flex', gap: '10px', marginBottom: '20px' }}>
<button
className="btn-primary"
onClick={handleConnect}
disabled={!isWasmLoaded || isConnected || isConnecting}
style={{ flex: 1, background: isConnected ? 'rgba(0, 255, 136, 0.2)' : 'rgba(168, 85, 247, 0.2)', border: `1px solid ${isConnected ? 'var(--accent-green)' : 'var(--accent-purple)'}`, color: isConnected ? 'var(--accent-green)' : 'white' }}
>
{isConnected ? 'TERHUBUNG KE JARINGAN KUANTUM' : isConnecting ? 'MENCOCOKKAN KUNCI LATTICE...' : 'HUBUNGKAN KE SG-1 (QUIC/8443)'}
</button>
</div>
{/* Panel Obrolan Scribe */}
<div style={{ flex: 1, border: '1px solid var(--glass-border)', borderRadius: '8px', background: 'rgba(0,0,0,0.5)', display: 'flex', flexDirection: 'column', overflow: 'hidden', minHeight: '300px' }}>
<div style={{ padding: '10px', background: 'rgba(168, 85, 247, 0.1)', borderBottom: '1px solid var(--glass-border)', fontSize: '0.8rem', color: 'var(--accent-purple)', fontWeight: 'bold' }}>
CRDT SCRIBE (Zero-Database Chat)
</div>
<div className="custom-scrollbar" style={{ flex: 1, padding: '15px', overflowY: 'auto' }}>
{messages.length === 0 && <div style={{ color: '#555', textAlign: 'center', marginTop: '20px', fontStyle: 'italic' }}>Menunggu pancaran Kuantum...</div>}
{messages.map((m, i) => (
<div key={i} style={{ marginBottom: '10px', textAlign: m.sender === 'You' ? 'right' : 'left' }}>
<span style={{ fontSize: '0.7rem', color: m.sender === 'You' ? 'var(--accent-green)' : 'var(--accent-purple)' }}>{m.sender}</span>
<div style={{ background: m.sender === 'You' ? 'rgba(0, 255, 136, 0.1)' : 'rgba(168, 85, 247, 0.1)', border: `1px solid ${m.sender === 'You' ? 'var(--accent-green)' : 'var(--accent-purple)'}`, padding: '8px 12px', borderRadius: '4px', display: 'inline-block', maxWidth: '80%', wordBreak: 'break-word', color: 'white' }}>
{m.text}
</div>
</div>
))}
</div>
<form onSubmit={handleSendMessage} style={{ display: 'flex', padding: '10px', borderTop: '1px solid var(--glass-border)' }}>
<input
type="text"
value={inputMessage}
onChange={e => setInputMessage(e.target.value)}
placeholder="Tulis pesan untuk dikirim via Datagram..."
disabled={!isConnected}
style={{ flex: 1, background: 'transparent', border: 'none', color: 'white', outline: 'none', padding: '0 10px', fontFamily: 'monospace' }}
/>
<button type="submit" disabled={!isConnected} style={{ background: 'transparent', border: 'none', color: isConnected ? 'var(--accent-purple)' : '#555', cursor: isConnected ? 'pointer' : 'not-allowed', fontWeight: 'bold' }}>
&gt;&gt; TRANSMIT
</button>
</form>
</div>
</div>
{/* KOLOM KANAN: Terminal Kinetic & Senjata Rahasia */}
<div style={{ flex: 1, display: 'flex', flexDirection: 'column', gap: '20px' }}>
{/* Kinetic Terminal */}
<div className="glass-panel" style={{ padding: '15px', borderColor: 'var(--accent-green)', flex: 1, display: 'flex', flexDirection: 'column' }}>
<h3 style={{ color: 'var(--accent-green)', fontSize: '0.8rem', marginBottom: '10px', textTransform: 'uppercase' }}>KINETIC LOGS</h3>
<div className="custom-scrollbar" style={{ flex: 1, background: '#050a05', border: '1px solid #113311', borderRadius: '4px', padding: '10px', fontFamily: 'monospace', fontSize: '0.7rem', overflowY: 'auto' }}>
{logs.map((log, i) => (
<div key={i} style={{
color: log.type === 'error' ? '#ff4444' : log.type === 'warning' ? '#ffaa00' : log.type === 'success' ? '#00ff88' : '#88aa88',
marginBottom: '4px'
}}>
{log.text}
</div>
))}
<div ref={logEndRef} />
</div>
</div>
{/* Feature Gating: Senjata Rahasia */}
<div className="glass-panel" style={{ padding: '15px', borderColor: 'var(--glass-border)' }}>
<h3 style={{ color: 'var(--text-main)', fontSize: '0.8rem', marginBottom: '15px', textTransform: 'uppercase', display: 'flex', justifyContent: 'space-between' }}>
<span>Persenjataan Kuantum</span>
{hasOmniAccess ? (
<span style={{ color: 'var(--accent-green)', fontWeight: 'bold' }}>[OMNI-ENGINE UNLOCKED]</span>
) : (
<span style={{ color: '#ff4444', fontWeight: 'bold' }}>[LOCKED]</span>
)}
</h3>
<div style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>
<button
onClick={() => fireWeapon('Neural Whisper', wasmSdk?.enable_neural_whisper)}
style={{ background: hasOmniAccess ? 'rgba(59, 130, 246, 0.2)' : 'rgba(50, 50, 50, 0.5)', color: hasOmniAccess ? '#3b82f6' : '#666', border: `1px solid ${hasOmniAccess ? '#3b82f6' : '#444'}`, padding: '10px', borderRadius: '4px', textAlign: 'left', cursor: hasOmniAccess ? 'pointer' : 'not-allowed', transition: 'all 0.3s' }}
>
<div style={{ fontWeight: 'bold', fontSize: '0.8rem' }}>🎙 The Neural Whisper (AI Offline)</div>
<div style={{ fontSize: '0.6rem', opacity: 0.8, marginTop: '4px' }}>Eksploitasi NPU untuk Terjemahan Suara-ke-Teks lokal.</div>
</button>
<button
onClick={() => fireWeapon('Post-Quantum Shield', wasmSdk?.enable_post_quantum_shield)}
style={{ background: hasOmniAccess ? 'rgba(236, 72, 153, 0.2)' : 'rgba(50, 50, 50, 0.5)', color: hasOmniAccess ? '#ec4899' : '#666', border: `1px solid ${hasOmniAccess ? '#ec4899' : '#444'}`, padding: '10px', borderRadius: '4px', textAlign: 'left', cursor: hasOmniAccess ? 'pointer' : 'not-allowed', transition: 'all 0.3s' }}
>
<div style={{ fontWeight: 'bold', fontSize: '0.8rem' }}>🛡 Post-Quantum Shield</div>
<div style={{ fontSize: '0.6rem', opacity: 0.8, marginTop: '4px' }}>Bungkus panggilan dengan sandi Kyber-1024 anti-superkomputer.</div>
</button>
<button
onClick={() => fireWeapon('Doppler Matrix', wasmSdk?.enable_doppler_matrix)}
style={{ background: hasOmniAccess ? 'rgba(245, 158, 11, 0.2)' : 'rgba(50, 50, 50, 0.5)', color: hasOmniAccess ? '#f59e0b' : '#666', border: `1px solid ${hasOmniAccess ? '#f59e0b' : '#444'}`, padding: '10px', borderRadius: '4px', textAlign: 'left', cursor: hasOmniAccess ? 'pointer' : 'not-allowed', transition: 'all 0.3s' }}
>
<div style={{ fontWeight: 'bold', fontSize: '0.8rem' }}>🦇 The Doppler Matrix (Sonar)</div>
<div style={{ fontSize: '0.6rem', opacity: 0.8, marginTop: '4px' }}>Pancarkan gelombang suara ultrasonik (Air-Gapped Comm).</div>
</button>
<button
onClick={() => fireWeapon('Aegis Watermark', wasmSdk?.enable_aegis_forensic_watermark)}
style={{ background: hasOmniAccess ? 'rgba(220, 38, 38, 0.2)' : 'rgba(50, 50, 50, 0.5)', color: hasOmniAccess ? '#dc2626' : '#666', border: `1px solid ${hasOmniAccess ? '#dc2626' : '#444'}`, padding: '10px', borderRadius: '4px', textAlign: 'left', cursor: hasOmniAccess ? 'pointer' : 'not-allowed', transition: 'all 0.3s' }}
>
<div style={{ fontWeight: 'bold', fontSize: '0.8rem' }}>👁 Aegis Forensic Watermark</div>
<div style={{ fontSize: '0.6rem', opacity: 0.8, marginTop: '4px' }}>Suntikkan sandi morse mikroskopis penangkal pembajak layar.</div>
</button>
</div>
</div>
</div>
</div>
);
}
@@ -0,0 +1,271 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { useIamPolicy } from '../context/IamPolicyContext';
import { useAuth } from '../context/AuthContext';
import { startRegistration } from '@simplewebauthn/browser';
import { useRef, useState } from 'react';
import QRCode from 'react-qr-code';
export default function SecurityEnclave() {
const { policies, identities, updatePolicy, regenerateKey } = useIamPolicy();
const { cryptographicKey } = useAuth();
// Decode identity from local token and find real KeyId
let tenantKeyId = null;
try {
const payload = JSON.parse(atob(cryptographicKey.split('.')[1]));
tenantKeyId = Object.keys(identities).find(key => identities[key].tenant_id === payload.tenant_id);
} catch (e) {}
const [pairingQr, setPairingQr] = useState(null);
const handleRegisterBiometric = () => {
const gatekeeperUrl = import.meta.env.VITE_GATEKEEPER_WS_URL || 'ws://localhost:4001';
const ws = new WebSocket(gatekeeperUrl);
ws.onopen = () => {
ws.send(JSON.stringify({ type: 'GENERATE_REGISTRATION_OPTIONS', payload: { targetKeyId: tenantKeyId } }));
};
ws.onmessage = async (event) => {
try {
const data = JSON.parse(event.data);
if (data.type === 'REGISTRATION_OPTIONS') {
const options = data.payload;
const attResp = await startRegistration(options);
ws.send(JSON.stringify({ type: 'VERIFY_REGISTRATION_RESPONSE', payload: { targetKeyId: tenantKeyId, response: attResp } }));
} else if (data.type === 'REGISTRATION_SUCCESS') {
alert('Berhasil! Kunci Biometrik Anda telah terdaftar permanen di XCU Ultra.');
ws.close();
} else if (data.type === 'AUTH_FAILED') {
alert('Registrasi Gagal: ' + data.payload);
ws.close();
}
} catch (err) {
alert('Gagal memproses WebAuthn.');
}
};
};
const handlePairOptical = () => {
const gatekeeperUrl = import.meta.env.VITE_GATEKEEPER_WS_URL || 'ws://localhost:4001';
const ws = new WebSocket(gatekeeperUrl);
ws.onopen = () => {
ws.send(JSON.stringify({ type: 'GENERATE_OPTICAL_PAIRING', payload: { targetKeyId: tenantKeyId } }));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'OPTICAL_PAIRING_QR') {
setPairingQr(data.payload);
} else if (data.type === 'OPTICAL_PAIRING_SUCCESS') {
alert('LUAR BIASA! Ponsel Cerdas Anda kini telah resmi terikat dengan Server secara Air-Gapped.');
setPairingQr(null);
ws.close();
} else if (data.type === 'AUTH_FAILED') {
alert(data.payload);
ws.close();
}
};
};
// RESILIENT: Use default policy if Gatekeeper WebSocket is offline
const livePolicy = policies[tenantKeyId];
const isOffline = !livePolicy;
const activePolicy = livePolicy || {
supreme_allowed: { biometric: true, optical: true, aegis: true },
tenant_enabled: { biometric: false, optical: false, aegis: true },
mfa_mode: 'free'
};
const handleToggle = (methodKey, currentValue) => {
if (isOffline) {
alert("GATEKEEPER OFFLINE: Koneksi WebSocket ke IAM Gatekeeper belum tersedia. Perubahan tidak dapat disimpan saat ini.");
return;
}
if (!activePolicy.supreme_allowed[methodKey]) {
alert("AKSES DITOLAK: Protokol ini dikunci mati oleh Supreme Admin.");
return;
}
const newTenantEnabled = {
...activePolicy.tenant_enabled,
[methodKey]: !currentValue
};
updatePolicy(tenantKeyId, null, newTenantEnabled);
};
const renderMethodBox = (title, desc, methodKey, icon) => {
const isSupremeAllowed = activePolicy.supreme_allowed[methodKey];
const isTenantEnabled = activePolicy.tenant_enabled[methodKey];
const isActive = isSupremeAllowed && isTenantEnabled;
const isLocked = !isSupremeAllowed;
return (
<div style={{
flex: 1, border: `1px solid ${isActive ? 'var(--accent-cyan)' : (isLocked ? 'var(--accent-red)' : 'var(--table-border)')}`,
background: isActive ? 'rgba(0, 243, 255, 0.05)' : 'var(--panel-bg)',
padding: '30px', borderRadius: '12px', textAlign: 'center', display: 'flex', flexDirection: 'column',
opacity: isLocked ? 0.6 : 1, transition: 'all 0.3s'
}}>
<div style={{fontSize: '3rem', marginBottom: '15px'}}>{icon}</div>
<h3 style={{color: isActive ? 'var(--accent-cyan)' : 'var(--text-main)', marginBottom: '10px'}}>{title}</h3>
<p style={{color: 'var(--text-muted)', fontSize: '0.85rem', marginBottom: '20px', flex: 1}}>{desc}</p>
{isLocked ? (
<div style={{color: 'var(--accent-red)', fontFamily: 'monospace', fontWeight: 'bold', padding: '10px', border: '1px solid var(--accent-red)', borderRadius: '4px'}}>
LOCKED BY SUPREME
</div>
) : (
<button
onClick={() => handleToggle(methodKey, isTenantEnabled)}
style={{
padding: '10px', background: isTenantEnabled ? 'var(--accent-cyan)' : 'transparent',
color: isTenantEnabled ? '#000' : 'var(--text-muted)', border: `1px solid ${isTenantEnabled ? 'var(--accent-cyan)' : 'var(--table-border)'}`,
borderRadius: '4px', cursor: 'pointer', fontFamily: 'monospace', fontWeight: 'bold', transition: 'all 0.2s'
}}
>
{isTenantEnabled ? 'ENABLED' : 'DISABLED'}
</button>
)}
</div>
);
};
return (
<div className="glass-panel" style={{padding: '30px', borderColor: 'var(--accent-cyan)'}}>
<h2 style={{color: 'var(--accent-cyan)', marginBottom: '10px', textTransform: 'uppercase', letterSpacing: '2px'}}>Security Enclave</h2>
<p style={{color: 'var(--text-muted)', marginBottom: '10px'}}>
Pusat kendali pertahanan lapis tiga. Anda memiliki otonomi untuk mengunci metode masuk tertentu demi mencegah pembajakan fisik.
</p>
{isOffline && (
<div style={{
padding: '10px 15px', background: 'rgba(255, 234, 0, 0.1)', border: '1px solid var(--accent-yellow)',
borderRadius: '6px', marginBottom: '20px', display: 'flex', alignItems: 'center', gap: '10px'
}}>
<span style={{color: 'var(--accent-yellow)', fontSize: '1.2rem'}}></span>
<span style={{color: 'var(--accent-yellow)', fontFamily: 'monospace', fontSize: '0.8rem'}}>
GATEKEEPER OFFLINE Menampilkan konfigurasi default. Koneksi WebSocket ke port 4001 tidak tersedia.
</span>
</div>
)}
<div style={{display: 'flex', gap: '20px', alignItems: 'stretch'}}>
{renderMethodBox('Lapis 1: Biometric', 'Login seketika menggunakan Sidik Jari atau FaceID dari perangkat keras Anda.', 'biometric', '👆')}
{renderMethodBox('Lapis 2: Optical', 'Gunakan Smartphone Anda untuk memindai Matriks Kuantum pada layar.', 'optical', '📱')}
{renderMethodBox('Lapis 3: Aegis', 'Gunakan berkas kunci fisik berekstensi .xcu untuk kondisi terisolasi.', 'aegis', '💽')}
</div>
<div style={{marginTop: '40px', padding: '20px', background: 'var(--panel-bg)', border: '1px solid var(--accent-purple)', borderRadius: '12px', display: 'flex', alignItems: 'center', justifyContent: 'space-between'}}>
<div>
<h3 style={{color: 'var(--accent-purple)', marginBottom: '5px'}}>MFA SEQUENCE STRATEGY</h3>
<p style={{color: 'var(--text-muted)', fontSize: '0.85rem'}}>Jika lebih dari 1 Lapis aktif, tentukan bagaimana urutan masuknya.</p>
</div>
<select
value={activePolicy.mfa_mode || 'free'}
onChange={(e) => {
if (isOffline) { alert("GATEKEEPER OFFLINE: Tidak dapat mengubah MFA mode."); return; }
updatePolicy(tenantKeyId, null, null, e.target.value);
}}
style={{
padding: '12px', background: 'rgba(168, 85, 247, 0.1)', color: 'var(--accent-purple)',
border: '1px solid var(--accent-purple)', borderRadius: '6px', cursor: 'pointer',
fontFamily: 'monospace', fontWeight: 'bold'
}}
>
<option value="free">FREE MODE (Pilih Salah Satu Saja)</option>
<option value="strict">STRICT MODE (Wajib Semua Secara Berurutan)</option>
<option value="random">QUANTUM RANDOM (Wajib Semua, Urutan Acak)</option>
</select>
</div>
<div style={{marginTop: '40px', padding: '20px', background: 'rgba(0, 243, 255, 0.05)', border: '1px solid var(--accent-cyan)', borderRadius: '12px', display: 'flex', alignItems: 'center', justifyContent: 'space-between'}}>
<div>
<h3 style={{color: 'var(--accent-cyan)', marginBottom: '5px'}}>HARDWARE BIOMETRIC BINDING</h3>
<p style={{color: 'var(--text-muted)', fontSize: '0.85rem'}}>Daftarkan Windows Hello / TouchID pada mesin ini sebagai Kunci Publik Kinetik.</p>
</div>
<button
onClick={handleRegisterBiometric}
style={{
padding: '12px 20px', background: 'var(--accent-cyan)', color: '#000', border: 'none',
borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace', fontWeight: 'bold',
boxShadow: '0 0 15px rgba(0, 243, 255, 0.4)'
}}
>
👆 DAFTARKAN BIOMETRIK
</button>
</div>
<div style={{marginTop: '40px', padding: '20px', background: 'rgba(168, 85, 247, 0.05)', border: '1px solid var(--accent-purple)', borderRadius: '12px', display: 'flex', alignItems: 'center', justifyContent: 'space-between'}}>
<div>
<h3 style={{color: 'var(--accent-purple)', marginBottom: '5px'}}>AIR-GAPPED MOBILE PAIRING</h3>
<p style={{color: 'var(--text-muted)', fontSize: '0.85rem'}}>Kawinkan Ponsel Cerdas Anda sebagai Penandatangan Kriptografi Offline.</p>
</div>
<button
onClick={handlePairOptical}
style={{
padding: '12px 20px', background: 'var(--accent-purple)', color: '#fff', border: 'none',
borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace', fontWeight: 'bold',
boxShadow: '0 0 15px rgba(168, 85, 247, 0.4)'
}}
>
🔗 PAIR MOBILE AUTHENTICATOR
</button>
</div>
<div style={{marginTop: '40px', padding: '20px', background: 'rgba(255, 0, 60, 0.05)', border: '1px solid var(--accent-red)', borderRadius: '12px', display: 'flex', alignItems: 'center', justifyContent: 'space-between'}}>
<div>
<h3 style={{color: 'var(--accent-red)', marginBottom: '5px'}}>EMERGENCY KEYCARD ROTATION</h3>
<p style={{color: 'var(--text-muted)', fontSize: '0.85rem'}}>Hanguskan kunci .xcu lama Anda jika dicuri, dan langsung unduh kunci Kinetik yang baru.</p>
</div>
<button
onClick={() => {
if (isOffline) { alert("GATEKEEPER OFFLINE: Tidak dapat merotasi keycard."); return; }
if (window.confirm("Peringatan Mutlak: Kunci Aegis lama Anda akan ditolak selamanya. Lanjutkan?")) {
regenerateKey(tenantKeyId);
}
}}
style={{
padding: '12px 20px', background: 'var(--accent-red)', color: '#fff', border: 'none',
borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace', fontWeight: 'bold',
boxShadow: '0 0 15px rgba(255, 0, 60, 0.4)'
}}
>
🚨 FORGE NEW KEYCARD
</button>
</div>
{/* PAIRING MODAL */}
{pairingQr && (
<div style={{
position: 'fixed', top: 0, left: 0, width: '100vw', height: '100vh',
background: 'rgba(0,0,0,0.85)', backdropFilter: 'blur(10px)',
zIndex: 99999, display: 'flex', alignItems: 'center', justifyContent: 'center'
}}>
<div className="glass-panel" style={{padding: '40px', textAlign: 'center', maxWidth: '500px', borderColor: 'var(--accent-purple)'}}>
<h1 style={{color: 'var(--accent-purple)', marginBottom: '20px'}}>🔗 PAIR MOBILE DEVICE</h1>
<p style={{color: 'var(--text-main)', marginBottom: '20px'}}>
Buka <strong style={{color: 'var(--accent-cyan)'}}>http://localhost:4173/authenticator</strong> di Ponsel Anda dan Pindai Matriks ini untuk mengunci Kriptografi.
</p>
<div style={{background: '#fff', padding: '20px', display: 'inline-block', borderRadius: '12px', marginBottom: '30px'}}>
<QRCode value={pairingQr} size={250} fgColor="#000" bgColor="#fff" />
</div>
<div>
<button
onClick={() => setPairingQr(null)}
style={{
padding: '10px 30px', background: 'transparent', color: 'var(--text-muted)', border: '1px solid var(--text-muted)',
borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace'
}}
>
BATAL
</button>
</div>
</div>
</div>
)}
</div>
);
}
@@ -0,0 +1,28 @@
import React from 'react';
import QuantumSandbox from './QuantumSandbox';
import M1CerberusFirewall from './modules/M1CerberusFirewall';
import M15QuicVideoMatrix from './modules/M15QuicVideoMatrix';
import M28InquisitorAI from './modules/M28InquisitorAI';
import M32Lazarus from './modules/M32Lazarus';
import M36DopplerSonar from './modules/M36DopplerSonar';
import M39AegisWatermark from './modules/M39AegisWatermark';
import M43PulsarMatrix from './modules/M43PulsarMatrix';
import M44ResonanceAudio from './modules/M44ResonanceAudio';
import M46Eclipse from './modules/M46Eclipse';
import M60Panopticon from './modules/M60Panopticon';
export default function ShapeshiftingRouter({ moduleId }) {
switch(moduleId) {
case 'm1': return <M1CerberusFirewall />;
case 'm15': return <M15QuicVideoMatrix />;
case 'm28': return <M28InquisitorAI />;
case 'm32': return <M32Lazarus />;
case 'm36': return <M36DopplerSonar />;
case 'm39': return <M39AegisWatermark />;
case 'm43': return <M43PulsarMatrix />;
case 'm44': return <M44ResonanceAudio />;
case 'm46': return <M46Eclipse />;
case 'm60': return <M60Panopticon />;
default: return <QuantumSandbox moduleId={moduleId} />;
}
}
@@ -0,0 +1,696 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { useState, useEffect } from 'react';
import { useAuth } from '../context/AuthContext';
import { useCommercial } from '../context/CommercialContext';
import DangerModal from './DangerModal';
import { useModuleRegistry } from '../context/ModuleRegistryContext';
function useDebounce(value, delay) {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(handler);
};
}, [value, delay]);
return debouncedValue;
}
export default function TenantArchitect() {
const { tiers } = useCommercial();
const { registry } = useModuleRegistry();
const API_BASE = import.meta.env.VITE_XCU_API_URL || '';
// Load Tenants dari API Gateway (xcu_iam PostgreSQL)
const [tenants, setTenants] = useState([]);
const [isLoading, setIsLoading] = useState(true);
const [isProvisioning, setIsProvisioning] = useState(false);
const [apiError, setApiError] = useState(null);
const { cryptographicKey } = useAuth();
// State for Form (Create/Edit)
const [editingId, setEditingId] = useState(null);
const [newTenantName, setNewTenantName] = useState('');
const [customTierName, setCustomTierName] = useState('');
const [selectedModules, setSelectedModules] = useState({});
const [showProvisionForm, setShowProvisionForm] = useState(false);
const handleAutoFill = (tierId) => {
const selectedTier = tiers.find(t => t.id === tierId);
if (!selectedTier) return;
// Convert array of modules to object { m1: true, m2: true }
const newSelection = {};
selectedTier.modules.forEach(mod => {
newSelection[mod] = true;
});
setSelectedModules(newSelection);
};
// Omni-Dimensional Search States
const [moduleSearchQuery, setModuleSearchQuery] = useState('');
const debouncedModuleQuery = useDebounce(moduleSearchQuery, 250);
const [tenantSearchQuery, setTenantSearchQuery] = useState('');
const debouncedTenantQuery = useDebounce(tenantSearchQuery, 250);
// Fetch tenants dari API Gateway
const fetchTenants = async () => {
try {
const res = await fetch(`${API_BASE}/xcu-api/v1/tenants`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
// Transform API data to component format
const mapped = data.map(t => ({
id: t.tenant_key || t.id,
name: t.tenant_name || t.name,
status: t.status || 'PROVISIONED',
baseTierId: t.base_tier_id || t.baseTierId || null,
customModules: t.custom_modules || t.customModules || [],
customTierName: t.custom_tier_name || t.customTierName || '',
created: t.created_at ? t.created_at.split('T')[0] : (t.created || new Date().toISOString().split('T')[0])
}));
setTenants(mapped);
setApiError(null);
console.log(`[XCU TENANT] Loaded ${mapped.length} tenants from API`);
} catch (err) {
console.warn('[XCU TENANT] API offline, using fallback:', err.message);
setApiError(err.message);
// Fallback: seed JUMPA.ID jika API offline
if (tenants.length === 0) {
setTenants([{
id: 'AEGIS-TENANT-80AA3EEBE8-X',
name: 'JUMPA.ID ENTERPRISE',
status: 'PROVISIONED',
baseTierId: 'tier_jumpa_omni',
customModules: [],
customTierName: '',
created: '2026-05-08'
}]);
}
} finally {
setIsLoading(false);
}
};
useEffect(() => {
fetchTenants();
}, []);
// Fungsi Pembantu: Dapatkan Modul Asli untuk Tenant (Auto-Sync dengan Blueprint)
const resolveTenantModules = (tenant) => {
if (tenant.baseTierId) {
const tier = tiers.find(t => t.id === tenant.baseTierId);
if (tier) return tier.modules;
}
return tenant.customModules || [];
};
const resolveTierBadge = (tenant) => {
const activeModules = resolveTenantModules(tenant);
if (!activeModules || activeModules.length === 0) return { name: 'BLIND (0 MODUL)', color: 'var(--accent-red)' };
if (tenant.baseTierId) {
const tierIndex = tiers.findIndex(t => t.id === tenant.baseTierId);
if (tierIndex !== -1) {
let themeColor = 'var(--accent-cyan)';
if (tierIndex === 1) themeColor = 'var(--accent-yellow)';
if (tierIndex === 2) themeColor = 'var(--accent-red)';
if (tierIndex === 3) themeColor = 'var(--accent-green)';
if (tierIndex >= 4) themeColor = 'var(--text-main)';
return { name: tiers[tierIndex].name, color: themeColor };
}
}
const finalName = tenant.customTierName ? `CUSTOM FORGE: ${tenant.customTierName}` : 'CUSTOM FORGE';
return { name: finalName, color: 'var(--accent-purple)' };
};
const toggleModule = (moduleId) => {
setSelectedModules(prev => ({
...prev,
[moduleId]: !prev[moduleId]
}));
};
const handleEditClick = (tenant) => {
setEditingId(tenant.id);
setNewTenantName(tenant.name);
setCustomTierName(tenant.customTierName || '');
setShowProvisionForm(true);
// Konversi array modul kembali ke object untuk state
const modState = {};
tenant.modules.forEach(m => modState[m] = true);
setSelectedModules(modState);
// Auto-scroll ke atas
window.scrollTo({ top: 0, behavior: 'smooth' });
};
const [selectedTenants, setSelectedTenants] = useState([]);
const [deleteModal, setDeleteModal] = useState({ isOpen: false, tenantIds: [] });
const handleDeleteClick = (tenantId) => {
setDeleteModal({ isOpen: true, tenantIds: [tenantId] });
};
const handleBulkDeleteClick = () => {
setDeleteModal({ isOpen: true, tenantIds: selectedTenants });
};
const toggleSelectTenant = (id) => {
setSelectedTenants(prev => prev.includes(id) ? prev.filter(tid => tid !== id) : [...prev, id]);
};
const confirmDelete = async () => {
if (deleteModal.tenantIds.length > 0) {
// Delete via API for each tenant
for (const tenantId of deleteModal.tenantIds) {
try {
await fetch(`${API_BASE}/xcu-api/v1/tenants/${encodeURIComponent(tenantId)}`, { method: 'DELETE' });
} catch (err) {
console.error('[XCU TENANT] Delete error:', err.message);
}
}
// Refresh from API
await fetchTenants();
if (deleteModal.tenantIds.includes(editingId)) {
cancelEdit();
}
setSelectedTenants([]);
}
setDeleteModal({ isOpen: false, tenantIds: [] });
};
const cancelDelete = () => {
setDeleteModal({ isOpen: false, tenantIds: [] });
};
const cancelEdit = () => {
setEditingId(null);
setNewTenantName('');
setCustomTierName('');
setSelectedModules({});
setShowProvisionForm(false);
};
const saveTenant = async () => {
if (!newTenantName) return alert("Nama Tenant tidak boleh kosong.");
setIsProvisioning(true);
// Konversi object { id: true/false } menjadi array of allowed IDs
const allowedModules = Object.keys(selectedModules).filter(id => selectedModules[id]);
// Check if the allowedModules matches any Tier exactly
let matchedTierId = null;
const sortedAllowed = [...allowedModules].sort().join(',');
for (const tier of tiers) {
if ([...tier.modules].sort().join(',') === sortedAllowed) {
matchedTierId = tier.id;
break;
}
}
try {
if (editingId) {
// UPDATE via API
await fetch(`${API_BASE}/xcu-api/v1/tenants/${encodeURIComponent(editingId)}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
tenant_name: newTenantName,
base_tier_id: matchedTierId,
custom_modules: matchedTierId ? [] : allowedModules,
custom_tier_name: matchedTierId ? '' : customTierName
})
});
} else {
// CREATE via API
const tenantKey = 'AEGIS-TENANT-' + newTenantName.replace(/[^A-Z0-9]/gi, '').toUpperCase().slice(0, 10) + '-' + Math.random().toString(16).substr(2, 4).toUpperCase();
await fetch(`${API_BASE}/xcu-api/v1/tenants`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
tenant_key: tenantKey,
tenant_name: newTenantName,
base_tier_id: matchedTierId,
custom_modules: matchedTierId ? [] : allowedModules,
custom_tier_name: matchedTierId ? '' : customTierName
})
});
}
// Refresh from API
await fetchTenants();
} catch (err) {
console.error('[XCU TENANT] Save error:', err.message);
setApiError(err.message);
}
cancelEdit();
setIsProvisioning(false);
};
const isEditMode = editingId !== null;
const borderColor = isEditMode ? 'var(--accent-yellow)' : 'rgba(0, 243, 255, 0.2)';
const themeColor = isEditMode ? 'var(--accent-yellow)' : 'var(--accent-cyan)';
const filteredTenants = tenants.filter(t => {
if (!debouncedTenantQuery) return true;
const q = debouncedTenantQuery.toLowerCase();
if (t.name.toLowerCase().includes(q) || t.id.toLowerCase().includes(q)) return true;
// Omni-Search: Cek nama modul aslinya dari Registry
const activeModules = resolveTenantModules(t);
return activeModules.some(modId => {
for (let coreKey in registry) {
const found = registry[coreKey].modules.find(m => m.id === modId);
if (found && found.name.toLowerCase().includes(q)) return true;
}
return false;
});
});
const handleSelectAll = () => {
if (selectedTenants.length === filteredTenants.length && filteredTenants.length > 0) {
setSelectedTenants([]);
} else {
setSelectedTenants(filteredTenants.map(t => t.id));
}
};
const handleGenerateTether = (tenant) => {
// Generate Quantum Tether (.xcu) file
const tetherData = {
tenantId: tenant.id,
tenantName: tenant.name,
baseTierId: tenant.baseTierId,
customModules: tenant.customModules,
endpoint: "wss://xcu ULTRA.ultramodul.xyz/quantum-relay",
signature: btoa(tenant.id + "-" + Date.now())
};
const blob = new Blob([JSON.stringify(tetherData, null, 2)], { type: "application/json" });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `${tenant.id.toLowerCase()}.xcu`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
};
return (
<div className="glass-panel" style={{padding: '30px', borderColor: 'var(--accent-cyan)'}}>
<style>{`
@keyframes laserScan {
0% { transform: scaleX(0); transform-origin: left; opacity: 0.8;}
50% { transform: scaleX(1); transform-origin: left; opacity: 1;}
50.1% { transform: scaleX(1); transform-origin: right; opacity: 1;}
100% { transform: scaleX(0); transform-origin: right; opacity: 0.8;}
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(-5px); }
to { opacity: 1; transform: translateY(0); }
}
.custom-scrollbar::-webkit-scrollbar {
width: 6px;
}
.custom-scrollbar::-webkit-scrollbar-track {
background: rgba(0,0,0,0.2);
border-radius: 4px;
}
.custom-scrollbar::-webkit-scrollbar-thumb {
background: rgba(0, 243, 255, 0.3);
border-radius: 4px;
}
.custom-scrollbar::-webkit-scrollbar-thumb:hover {
background: rgba(0, 243, 255, 0.6);
}
`}</style>
<DangerModal
isOpen={deleteModal.isOpen}
title={deleteModal.tenantIds.length > 1 ? "MASS ANNIHILATION PROTOCOL" : "REVOKE COMMERCIAL GATEWAY"}
message={`PERINGATAN ABSOLUT: Anda akan memusnahkan ${deleteModal.tenantIds.length} Entitas Klien secara permanen dari Matriks. Semua layanan WebRTC dan Sinkronisasi Data mereka akan MATI TOTAL tanpa bisa dipulihkan. Lanjutkan eksekusi?`}
onConfirm={confirmDelete}
onCancel={cancelDelete}
confirmText={deleteModal.tenantIds.length > 1 ? "EXECUTE MASS ANNIHILATION" : "ANNIHILATE TENANT"}
/>
<div style={{marginBottom: '30px'}}>
<h2 style={{color: 'var(--text-main)', marginBottom: '8px', fontFamily: 'monospace', letterSpacing: '2px'}}>THE TENANT ARCHITECT</h2>
<p style={{color: 'var(--text-muted)'}}>Source: <span style={{color: apiError ? 'var(--accent-yellow)' : 'var(--accent-green)', fontWeight: 'bold'}}>{apiError ? 'Static Fallback' : 'xcu_iam PostgreSQL'}</span> | <span style={{color: 'var(--accent-cyan)'}}>{tenants.length}</span> Tenants <button onClick={fetchTenants} style={{marginLeft:'10px',padding:'4px 12px',background:'transparent',border:'1px solid var(--accent-green)',color:'var(--accent-green)',borderRadius:'4px',cursor:'pointer',fontFamily:'monospace',fontSize:'0.75rem'}}> REFRESH</button></p>
</div>
{!showProvisionForm && !isEditMode && (
<div style={{marginBottom: '40px'}}>
<button
onClick={() => setShowProvisionForm(true)}
style={{
width: '100%', padding: '20px', background: 'rgba(168, 85, 247, 0.1)',
border: '1px dashed var(--accent-purple)', color: 'var(--accent-purple)', borderRadius: '12px',
cursor: 'pointer', fontFamily: 'monospace', fontSize: '1.2rem',
letterSpacing: '3px', fontWeight: 'bold', transition: 'all 0.3s ease',
boxShadow: '0 0 20px rgba(168, 85, 247, 0.2)'
}}
onMouseOver={(e) => {
e.currentTarget.style.background = 'rgba(168, 85, 247, 0.3)';
e.currentTarget.style.boxShadow = '0 0 40px rgba(168, 85, 247, 0.6)';
e.currentTarget.style.color = 'var(--text-main)';
}}
onMouseOut={(e) => {
e.currentTarget.style.background = 'rgba(168, 85, 247, 0.1)';
e.currentTarget.style.boxShadow = '0 0 20px rgba(168, 85, 247, 0.2)';
e.currentTarget.style.color = 'var(--accent-purple)';
}}
>
+ SPAWN NEW TENANT ENTITY
</button>
</div>
)}
{(showProvisionForm || isEditMode) && (
<div style={{background: 'var(--panel-bg)', padding: '25px', borderRadius: '12px', border: `1px solid ${borderColor}`, marginBottom: '40px', transition: 'border 0.3s ease', animation: 'fadeIn 0.3s ease-out'}}>
<h3 style={{color: themeColor, marginBottom: '20px', fontSize: '1rem', display: 'flex', justifyContent: 'space-between'}}>
{isEditMode ? `[ EDITING TENANT: ${editingId} ]` : 'PROVISION NEW TENANT'}
<span style={{color: 'var(--text-muted)', cursor: 'pointer', fontSize: '0.8rem'}} onClick={cancelEdit}>[ Batal / Tutup ]</span>
</h3>
<div style={{marginBottom: '20px'}}>
<label style={{display: 'block', color: 'var(--text-muted)', fontSize: '0.8rem', marginBottom: '8px', letterSpacing: '1px'}}>TENANT ENTITY NAME</label>
<input
type="text"
value={newTenantName}
onChange={(e) => setNewTenantName(e.target.value)}
placeholder="e.g., JUMPA.ID ENTERPRISE"
style={{
width: '100%', padding: '12px', background: 'var(--hover-bg)',
border: `1px solid ${isEditMode ? 'rgba(255, 234, 0, 0.3)' : 'rgba(255,255,255,0.1)'}`, color: 'var(--text-main)',
borderRadius: '6px', fontFamily: 'monospace', outline: 'none'
}}
/>
</div>
<div style={{display: 'flex', gap: '20px', marginBottom: '25px'}}>
<div style={{flex: 1}}>
<label style={{display: 'block', color: 'var(--text-muted)', fontSize: '0.8rem', marginBottom: '8px', letterSpacing: '1px'}}>AUTO-FILL DARI PAKET KOMERSIAL</label>
<div style={{display: 'flex', gap: '10px'}}>
<select
onChange={(e) => handleAutoFill(e.target.value)}
style={{
flex: 1, padding: '12px', background: 'var(--hover-bg)',
border: '1px solid rgba(255,255,255,0.1)', color: 'var(--text-main)',
borderRadius: '6px', fontFamily: 'monospace', outline: 'none',
cursor: 'pointer'
}}
defaultValue=""
>
<option value="" disabled style={{color: '#000'}}>-- Pilih Preset Paket (Opsional) --</option>
{tiers.map(t => (
<option key={t.id} value={t.id} style={{color: '#000'}}>{t.name}</option>
))}
</select>
<button
onClick={() => setSelectedModules({})}
style={{
padding: '0 20px', background: 'rgba(255,0,60,0.1)', border: '1px solid var(--accent-red)',
color: 'var(--accent-red)', borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace'
}}
>
RESET
</button>
</div>
</div>
<div style={{flex: 1}}>
<label style={{display: 'block', color: 'var(--accent-purple)', fontSize: '0.8rem', marginBottom: '8px', letterSpacing: '1px'}}>NAMA PAKET KUSTOM (Jika Custom Forge)</label>
<input
type="text"
value={customTierName}
onChange={(e) => setCustomTierName(e.target.value)}
placeholder="e.g., SS9 GOV MATRIX"
style={{
width: '100%', padding: '12px', background: 'rgba(168,85,247,0.05)',
border: '1px solid rgba(168,85,247,0.3)', color: 'var(--text-main)',
borderRadius: '6px', fontFamily: 'monospace', outline: 'none'
}}
/>
</div>
</div>
<div style={{marginBottom: '25px'}}>
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'flex-end', marginBottom: '15px'}}>
<label style={{display: 'block', color: 'var(--text-muted)', fontSize: '0.8rem', letterSpacing: '1px'}}>MODUL 1-75 ALLOCATION MATRIX</label>
<div style={{position: 'relative', width: '300px'}}>
<input
type="text"
placeholder="Decryption Search (e.g., 'Aegis')..."
value={moduleSearchQuery}
onChange={(e) => setModuleSearchQuery(e.target.value)}
style={{
width: '100%', padding: '8px 12px', background: 'rgba(0, 243, 255, 0.05)',
border: '1px solid rgba(0, 243, 255, 0.3)', color: 'var(--accent-cyan)',
borderRadius: '6px', fontFamily: 'monospace', outline: 'none', fontSize: '0.8rem',
boxShadow: moduleSearchQuery ? '0 0 10px rgba(0,243,255,0.2)' : 'none',
transition: 'all 0.3s'
}}
/>
{moduleSearchQuery && (
<div style={{
position: 'absolute', bottom: 0, left: 0, height: '2px', background: 'var(--accent-cyan)',
animation: 'laserScan 1.5s infinite', width: '100%'
}}></div>
)}
</div>
</div>
<div style={{display: 'flex', flexDirection: 'column', gap: '20px', maxHeight: '600px', overflowY: 'auto', paddingRight: '10px'}} className="custom-scrollbar">
{Object.keys(registry).map(coreKey => {
const core = registry[coreKey];
// Omni-Index Filtering
const filteredModules = core.modules.filter(mod =>
!debouncedModuleQuery ||
mod.name.toLowerCase().includes(debouncedModuleQuery.toLowerCase()) ||
mod.id.toLowerCase().includes(debouncedModuleQuery.toLowerCase())
);
if (filteredModules.length === 0) return null;
return (
<div key={coreKey} style={{background: 'var(--hover-bg)', padding: '15px', borderRadius: '8px', border: '1px solid rgba(255,255,255,0.05)', animation: 'fadeIn 0.4s ease-out'}}>
<h4 style={{color: 'var(--text-muted)', fontSize: '0.75rem', marginBottom: '12px', borderBottom: '1px solid rgba(255,255,255,0.1)', paddingBottom: '5px'}}>
{core.name} <span style={{color: themeColor, float: 'right'}}>[ {filteredModules.length} ]</span>
</h4>
<div style={{display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '10px'}}>
{filteredModules.map(mod => (
<div
key={mod.id}
onClick={() => toggleModule(mod.id)}
style={{
padding: '10px',
background: selectedModules[mod.id] ? (isEditMode ? 'rgba(255, 234, 0, 0.15)' : 'rgba(0, 243, 255, 0.15)') : 'rgba(255,255,255,0.02)',
border: `1px solid ${selectedModules[mod.id] ? themeColor : 'rgba(255,255,255,0.1)'}`,
borderRadius: '6px', cursor: 'pointer', display: 'flex', alignItems: 'center', transition: 'all 0.2s',
boxShadow: debouncedModuleQuery && selectedModules[mod.id] ? `0 0 15px ${themeColor}40` : 'none'
}}
>
<div style={{
width: '16px', height: '16px', borderRadius: '4px',
border: `1px solid ${selectedModules[mod.id] ? themeColor : '#555'}`,
background: selectedModules[mod.id] ? themeColor : 'transparent',
marginRight: '10px'
}}></div>
<span style={{color: selectedModules[mod.id] ? 'var(--text-main)' : 'var(--text-muted)', fontSize: '0.8rem'}}>{mod.name}</span>
</div>
))}
</div>
</div>
);
})}
</div>
</div>
<button
className={`btn-primary ${isProvisioning ? 'processing' : ''}`}
onClick={saveTenant}
disabled={isProvisioning || !newTenantName}
style={{
width: '100%', padding: '15px', fontSize: '1rem',
background: isEditMode ? 'rgba(255, 234, 0, 0.1)' : 'transparent',
borderColor: themeColor, color: themeColor
}}
>
{isProvisioning ? '[ SYNCHRONIZING MATRIX... ]' : (isEditMode ? 'UPDATE TENANT PROTOCOL' : 'ENGAGE PROVISIONING PROTOCOL')}
</button>
</div>
)}
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'flex-end', marginBottom: '20px', marginTop: '40px'}}>
<h3 style={{color: 'var(--text-main)', fontSize: '1rem', margin: 0}}>GLOBAL ACTIVE TENANTS</h3>
<div style={{position: 'relative', width: '300px'}}>
<input
type="text"
placeholder="Search Klien / ID / Modul..."
value={tenantSearchQuery}
onChange={(e) => setTenantSearchQuery(e.target.value)}
style={{
width: '100%', padding: '8px 12px', background: 'rgba(255, 0, 60, 0.05)',
border: '1px solid rgba(255, 0, 60, 0.3)', color: 'var(--accent-red)',
borderRadius: '6px', fontFamily: 'monospace', outline: 'none', fontSize: '0.8rem',
boxShadow: tenantSearchQuery ? '0 0 10px rgba(255,0,60,0.2)' : 'none',
transition: 'all 0.3s'
}}
/>
{tenantSearchQuery && (
<div style={{
position: 'absolute', bottom: 0, left: 0, height: '2px', background: 'var(--accent-red)',
animation: 'laserScan 1.5s infinite reverse', width: '100%'
}}></div>
)}
</div>
</div>
{isLoading ? (
<div style={{textAlign: 'center', padding: '30px', color: 'var(--accent-cyan)'}}>Menarik Struktur Omni-Tenant...</div>
) : (
<table className="glass-table">
<thead>
<tr>
<th style={{width: '40px', textAlign: 'center'}}>
<input
type="checkbox"
onChange={handleSelectAll}
checked={selectedTenants.length === filteredTenants.length && filteredTenants.length > 0}
style={{cursor: 'pointer', accentColor: 'var(--accent-red)'}}
/>
</th>
<th>Cryptographic Key ID</th>
<th>Tenant Name</th>
<th>Active Modules</th>
<th>Override</th>
</tr>
</thead>
<tbody>
{filteredTenants.length === 0 ? (
<tr>
<td colSpan="5" style={{textAlign: 'center', color: 'var(--text-muted)', padding: '30px'}}>Tidak ada Entitas Klien yang cocok dengan pencarian.</td>
</tr>
) : (
filteredTenants.map((t, idx) => {
const badge = resolveTierBadge(t);
const activeModules = resolveTenantModules(t);
return (
<tr key={t.id} style={{
background: editingId === t.id ? 'rgba(255, 234, 0, 0.05)' : (selectedTenants.includes(t.id) ? 'rgba(255, 0, 60, 0.1)' : 'transparent'),
animation: 'fadeIn 0.5s ease-out',
transition: 'background 0.3s'
}}>
<td style={{textAlign: 'center'}}>
<input
type="checkbox"
checked={selectedTenants.includes(t.id)}
onChange={() => toggleSelectTenant(t.id)}
style={{cursor: 'pointer', accentColor: 'var(--accent-red)'}}
/>
</td>
<td style={{fontFamily: 'monospace', color: editingId === t.id ? 'var(--accent-yellow)' : 'var(--accent-cyan)'}}>{t.id}</td>
<td style={{fontWeight: 'bold', color: 'var(--text-main)'}}>
<div style={{marginBottom: '5px'}}>{t.name}</div>
<div style={{
display: 'inline-block',
background: `${badge.color}20`,
border: `1px solid ${badge.color}`,
color: badge.color,
padding: '2px 8px',
borderRadius: '4px',
fontSize: '0.7rem',
fontFamily: 'monospace',
boxShadow: `0 0 10px ${badge.color}40`,
textTransform: 'uppercase',
letterSpacing: '1px'
}}>
{badge.name}
</div>
</td>
<td style={{color: 'var(--text-muted)', fontSize: '0.8rem'}}>
{activeModules && activeModules.length > 0 ? (
<div style={{display: 'flex', flexWrap: 'wrap', gap: '4px'}}>
{activeModules.map(m => {
let modName = m;
for (let coreKey in registry) {
const found = registry[coreKey].modules.find(x => x.id === m);
if (found) modName = found.name;
}
const isMatch = debouncedTenantQuery && modName.toLowerCase().includes(debouncedTenantQuery.toLowerCase());
return (
<span key={m} style={{
background: isMatch ? 'rgba(255,0,60,0.2)' : 'var(--bg-panel)',
border: isMatch ? '1px solid var(--accent-red)' : '1px solid var(--table-border)',
color: isMatch ? 'var(--text-main)' : 'var(--text-main)',
padding: '2px 6px', borderRadius: '4px'
}}>
{modName}
</span>
);
})}
</div>
) : <span style={{color: 'var(--accent-red)'}}>BLIND (0 MODUL)</span>}
</td>
<td>
<div style={{display: 'flex', gap: '8px', flexWrap: 'wrap'}}>
<button onClick={() => handleGenerateTether(t)} style={{
background: 'rgba(0, 243, 255, 0.1)', border: '1px solid var(--accent-cyan)',
color: 'var(--accent-cyan)', padding: '6px 12px', borderRadius: '4px', cursor: 'pointer',
fontFamily: 'monospace', fontSize: '0.75rem', boxShadow: '0 0 10px rgba(0, 243, 255, 0.2)'
}}>GENERATE TETHER (.xcu)</button>
<button onClick={() => handleEditClick(t)} style={{
background: 'rgba(255,234,0,0.1)', border: '1px solid var(--accent-yellow)',
color: 'var(--accent-yellow)', padding: '6px 12px', borderRadius: '4px', cursor: 'pointer',
fontFamily: 'monospace', fontSize: '0.75rem'
}}>EDIT / REFORGE</button>
<button onClick={() => handleDeleteClick(t.id)} style={{
background: 'rgba(255,0,60,0.1)', border: '1px solid var(--accent-red)',
color: 'var(--accent-red)', padding: '6px 12px', borderRadius: '4px', cursor: 'pointer',
fontFamily: 'monospace', fontSize: '0.75rem'
}}>REVOKE</button>
</div>
</td>
</tr>
);
})
)}
</tbody>
</table>
)}
{selectedTenants.length > 0 && (
<div style={{
position: 'fixed', bottom: '20px', left: '50%', transform: 'translateX(-50%)',
background: 'var(--panel-bg)', border: '1px solid var(--accent-red)', borderRadius: '12px',
padding: '20px 40px', display: 'flex', alignItems: 'center', gap: '30px',
boxShadow: '0 0 30px rgba(255,0,60,0.5)', zIndex: 1000, animation: 'fadeIn 0.3s ease-out'
}}>
<div style={{color: 'var(--accent-red)', fontFamily: 'monospace', fontSize: '1.2rem', fontWeight: 'bold'}}>
{selectedTenants.length} ENTITAS KLIEN SIAP DIMUSNAHKAN
</div>
<button
onClick={handleBulkDeleteClick}
style={{
background: 'var(--accent-red)', color: '#000', border: 'none', padding: '10px 20px',
borderRadius: '6px', fontWeight: 'bold', fontFamily: 'monospace', cursor: 'pointer',
textTransform: 'uppercase', letterSpacing: '1px', boxShadow: '0 0 15px rgba(255,0,60,0.8)'
}}
>
MASS ANNIHILATION PROTOCOL
</button>
</div>
)}
</div>
);
}
@@ -0,0 +1,502 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import React, { useEffect, useState } from 'react';
import { useAuth } from '../context/AuthContext';
import { useIam } from '../context/IamContext';
import { useCommercial } from '../context/CommercialContext';
import { useI18n } from '../context/I18nContext';
import { useModuleRegistry } from '../context/ModuleRegistryContext';
export default function TenantBillingStats() {
const { cryptographicKey } = useAuth();
const { identity } = useIam();
const { tiers, modulePrices, taxRate, activeGateways, activeCurrency, setActiveCurrency, formatDynamicCurrency } = useCommercial();
const { t } = useI18n();
const [stats, setStats] = useState({
quota_used: parseInt(localStorage.getItem('tenant_api_quota') || '0', 10),
quota_limit: 1000000,
active_rooms: 0,
total_bandwidth: '0 TB',
status: 'ACTIVE',
health: '100%',
uptime: '99.999%',
apiLatency: '0ms'
});
const [invoices, setInvoices] = useState([]);
const [purchaseModal, setPurchaseModal] = useState(null);
const [selectedGateway, setSelectedGateway] = useState('');
const [localPackages, setLocalPackages] = useState(() => {
let pkgs = [...(identity?.packages || [])];
if (pkgs.includes('JUMPA.ID OMNI-ENGINE') || pkgs.includes('phase-1-to-75')) {
const allMods = Array.from({length: 99}, (_, i) => 'm' + (i + 1));
pkgs = [...new Set([...pkgs, ...allMods])];
}
return pkgs;
});
const [expandedInvoice, setExpandedInvoice] = useState(null);
const [hoverTooltip, setHoverTooltip] = useState(null);
const { allModules } = useModuleRegistry();
const handlePurchase = () => {
if (!purchaseModal.isDowngrade && !selectedGateway) {
alert("PILIH PAYMENT GATEWAY DULU!");
return;
}
if (purchaseModal.isDowngrade) {
if (purchaseModal.modules) { // If it's a tier bundle downgrade
setLocalPackages(localPackages.filter(p => !purchaseModal.modules.includes(p)));
} else { // Singular module downgrade
setLocalPackages(localPackages.filter(p => p !== purchaseModal.id));
}
} else {
if (purchaseModal.modules) { // If it's a tier bundle upgrade
// Add all missing modules
const newPackages = new Set([...localPackages, ...purchaseModal.modules]);
setLocalPackages(Array.from(newPackages));
} else if (!localPackages.includes(purchaseModal.id)) {
setLocalPackages([...localPackages, purchaseModal.id]);
}
}
setPurchaseModal(null);
setSelectedGateway('');
};
// Reactive Ping Engine & Quota Tracker
useEffect(() => {
// 1. Quota Tracker Listener
const handleGlobalClick = () => {
const currentQuota = parseInt(localStorage.getItem('tenant_api_quota') || '0', 10) + 1;
localStorage.setItem('tenant_api_quota', currentQuota);
setStats(prev => ({ ...prev, quota_used: currentQuota }));
};
document.addEventListener('click', handleGlobalClick);
// 2. Real-time Latency Ping
const pingInterval = setInterval(() => {
const start = performance.now();
requestAnimationFrame(() => {
const latency = (performance.now() - start).toFixed(1);
setStats(prev => ({ ...prev, apiLatency: `${latency}ms` }));
});
}, 2000);
// 3. Dynamic Hardware Metrics Update
setStats(prev => ({
...prev,
quota_limit: localPackages.length * 50000,
active_rooms: (navigator.hardwareConcurrency || 4) * localPackages.length * 12,
total_bandwidth: `${((navigator.hardwareConcurrency || 4) * 0.8 + localPackages.length * 1.2).toFixed(1)} TB`
}));
return () => {
document.removeEventListener('click', handleGlobalClick);
clearInterval(pingInterval);
};
}, [localPackages]);
// Dynamic Financial Invoice Generator
useEffect(() => {
// Menghitung harga pasti sesuai modul yang dimiliki secara realtime
let baseCurrent = 0;
localPackages.forEach(modId => {
baseCurrent += (modulePrices[modId] || 1500000);
});
const currentMonthCost = baseCurrent + (baseCurrent * (taxRate / 100));
// Estimasi bulan lalu (mengurangi 2 modul secara acak jika punya > 2)
let baseLast = baseCurrent;
if (localPackages.length > 2) {
baseLast -= (modulePrices[localPackages[0]] || 1500000);
baseLast -= (modulePrices[localPackages[1]] || 1500000);
}
const lastMonthCost = baseLast + (baseLast * (taxRate / 100));
const dateNow = new Date();
const currentMonth = dateNow.toISOString().slice(0,7);
dateNow.setMonth(dateNow.getMonth() - 1);
const lastMonth = dateNow.toISOString().slice(0,7);
setInvoices([
{ id: `INV-${identity?.username || 'XCU'}-${currentMonth}-A1`, date: `${currentMonth}-01 00:00:00 UTC`, amount: currentMonthCost },
{ id: `INV-${identity?.username || 'XCU'}-${lastMonth}-B7`, date: `${lastMonth}-01 00:00:00 UTC`, amount: lastMonthCost }
]);
}, [localPackages, identity, modulePrices]);
return (
<div style={{animation: 'fadeIn 0.6s ease-out'}}>
{/* Kinetik System Health Bar */}
<div className="glass-panel" style={{
padding: '20px', marginBottom: '30px', display: 'flex', justifyContent: 'space-between', alignItems: 'center',
background: 'linear-gradient(90deg, rgba(0, 255, 136, 0.05) 0%, rgba(168, 85, 247, 0.05) 100%)',
borderLeft: '4px solid var(--accent-green)', borderRight: '4px solid var(--accent-purple)'
}}>
<div>
<div style={{color: '#888', fontSize: '0.8rem', letterSpacing: '2px', textTransform: 'uppercase'}}>Omni-Engine Health</div>
<div style={{color: 'var(--accent-green)', fontSize: '1.8rem', fontWeight: 'bold', fontFamily: 'monospace'}}>OPERATIONAL</div>
</div>
<div style={{textAlign: 'right'}}>
<div style={{color: '#888', fontSize: '0.8rem', letterSpacing: '2px', textTransform: 'uppercase'}}>Global Edge Uptime</div>
<div style={{color: 'var(--accent-purple)', fontSize: '1.8rem', fontWeight: 'bold', fontFamily: 'monospace'}}>{stats.uptime}</div>
</div>
<div style={{textAlign: 'right'}}>
<div style={{color: '#888', fontSize: '0.8rem', letterSpacing: '2px', textTransform: 'uppercase'}}>Quantum API Latency</div>
<div style={{color: 'var(--accent-cyan)', fontSize: '1.8rem', fontWeight: 'bold', fontFamily: 'monospace'}}>{stats.apiLatency}</div>
</div>
</div>
<div className="grid-cards" style={{display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: '20px'}}>
{/* API Quota Card */}
<div className="glass-panel stat-card" style={{borderColor: 'var(--accent-purple)', position: 'relative', overflow: 'hidden'}}>
<div style={{position: 'absolute', top: 0, left: 0, height: '2px', background: 'var(--accent-purple)', width: `${(stats.quota_used/stats.quota_limit)*100}%`, transition: 'width 1s ease-out', boxShadow: '0 0 10px var(--accent-purple)'}}></div>
<div className="stat-title" style={{color: '#fff'}}>Cryptographic API Quota</div>
<div className="stat-value" style={{color: 'var(--accent-purple)'}}>
{stats.quota_used.toLocaleString()} <span style={{fontSize: '1rem', color: 'var(--text-muted)'}}>/ {stats.quota_limit.toLocaleString()} req</span>
</div>
<div style={{marginTop: '15px', fontSize: '0.85rem', color: 'var(--text-muted)', fontFamily: 'monospace'}}>
{((stats.quota_used/stats.quota_limit)*100).toFixed(1)}% Consumed
</div>
</div>
{/* Network Flow Card */}
<div className="glass-panel stat-card" style={{borderColor: 'var(--accent-cyan)'}}>
<div className="stat-title" style={{color: '#fff'}}>Global Network Flow</div>
<div className="stat-value" style={{color: 'var(--accent-cyan)'}}>{stats.total_bandwidth}</div>
<div style={{marginTop: '15px', fontSize: '0.85rem', color: 'var(--text-muted)', display: 'flex', justifyContent: 'space-between'}}>
<span>Active WebRTC QUIC Rooms:</span>
<span style={{color: 'var(--accent-cyan)', fontWeight: 'bold'}}>{stats.active_rooms}</span>
</div>
</div>
{/* Status Card */}
<div className="glass-panel stat-card" style={{borderColor: 'var(--accent-green)'}}>
<div className="stat-title" style={{color: 'var(--text-main)'}}>Account License Matrix</div>
<div className="stat-value green">{stats.status}</div>
<div style={{marginTop: '15px', fontSize: '0.85rem', color: 'var(--accent-green)', fontFamily: 'monospace'}}>
Identity Role: {identity?.role.toUpperCase()}
</div>
</div>
</div>
{/* Holographic Invoice History */}
<div className="glass-panel" style={{padding: '30px', marginTop: '30px', borderColor: 'rgba(168, 85, 247, 0.3)', boxShadow: '0 0 40px rgba(168,85,247,0.05)'}}>
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '20px'}}>
<h3 style={{color: 'var(--text-main)', margin: 0, textTransform: 'uppercase', letterSpacing: '1px'}}>{t('financial_matrix')}</h3>
<span style={{fontSize: '0.8rem', color: 'var(--text-muted)', fontFamily: 'monospace'}}>Cycle: 01-MAY to 31-MAY</span>
</div>
<table className="glass-table" style={{width: '100%', textAlign: 'left', borderCollapse: 'collapse'}}>
<thead>
<tr style={{borderBottom: '1px solid var(--table-border)'}}>
<th style={{padding: '15px 10px', color: 'var(--text-muted)', textTransform: 'uppercase', fontSize: '0.8rem'}}>{t('ledger_id')}</th>
<th style={{padding: '15px 10px', color: 'var(--text-muted)', textTransform: 'uppercase', fontSize: '0.8rem'}}>{t('timestamp')}</th>
<th style={{padding: '15px 10px', color: 'var(--text-muted)', textTransform: 'uppercase', fontSize: '0.8rem'}}>{t('amount_extracted')}</th>
<th style={{padding: '15px 10px', color: 'var(--text-muted)', textTransform: 'uppercase', fontSize: '0.8rem'}}>{t('clearance_status')}</th>
</tr>
</thead>
<tbody>
{invoices.map((inv, idx) => (
<React.Fragment key={inv.id}>
<tr
onClick={() => setExpandedInvoice(expandedInvoice === inv.id ? null : inv.id)}
style={{
borderBottom: expandedInvoice === inv.id ? 'none' : (idx === invoices.length - 1 ? 'none' : '1px solid var(--table-border-light)'),
transition: 'background 0.3s', cursor: 'pointer', background: expandedInvoice === inv.id ? 'var(--hover-bg)' : 'transparent'
}}
onMouseEnter={(e) => e.currentTarget.style.background = 'var(--hover-bg)'}
onMouseLeave={(e) => e.currentTarget.style.background = expandedInvoice === inv.id ? 'var(--hover-bg)' : 'transparent'}
>
<td style={{padding: '15px 10px', color: 'var(--text-muted)', fontFamily: 'monospace'}}>
<span style={{display: 'inline-block', width: '20px', color: 'var(--accent-purple)'}}>{expandedInvoice === inv.id ? 'â–¼' : 'â–¶'}</span>
{inv.id}
</td>
<td style={{padding: '15px 10px', color: 'var(--text-main)'}}>{inv.date}</td>
<td style={{padding: '15px 10px', color: 'var(--accent-purple)', fontWeight: 'bold', fontFamily: 'monospace'}}>
{formatDynamicCurrency(inv.amount)}
</td>
<td style={{padding: '15px 10px'}}>
<span style={{background: 'rgba(0, 255, 136, 0.1)', color: 'var(--accent-green)', padding: '4px 8px', borderRadius: '4px', fontSize: '0.7rem', border: '1px solid var(--accent-green)'}}>{t('cleared_paid')}</span>
</td>
</tr>
{expandedInvoice === inv.id && (
<tr style={{background: 'var(--hover-bg)', borderBottom: idx === invoices.length - 1 ? 'none' : '1px solid var(--table-border-light)'}}>
<td colSpan="4" style={{padding: '20px', paddingLeft: '40px'}}>
<div style={{borderLeft: '2px solid var(--accent-purple)', paddingLeft: '20px'}}>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', textTransform: 'uppercase', marginBottom: '15px', letterSpacing: '1px'}}>{t('itemized_receipt')}</div>
<div style={{display: 'grid', gridTemplateColumns: '1fr auto', gap: '10px', maxWidth: '600px', fontFamily: 'monospace', fontSize: '0.9rem'}}>
{localPackages.map(pkgId => {
const modInfo = allModules.find(m => m.id === pkgId);
return (
<React.Fragment key={pkgId}>
<div style={{color: 'var(--text-main)'}}>{modInfo ? modInfo.name : pkgId.toUpperCase()}</div>
<div style={{color: 'var(--accent-purple)'}}>{formatDynamicCurrency(modulePrices[pkgId] || 1500000)}</div>
</React.Fragment>
);
})}
<div style={{gridColumn: '1 / -1', height: '1px', background: 'var(--table-border)', margin: '10px 0'}}></div>
<div style={{color: 'var(--text-muted)'}}>SUBTOTAL</div>
<div style={{color: 'var(--text-muted)'}}>{formatDynamicCurrency(inv.amount / (1 + (taxRate/100)))}</div>
<div style={{color: 'var(--accent-red)'}}>DYNAMIC TAX RATE ({taxRate}%)</div>
<div style={{color: 'var(--accent-red)'}}>+ {formatDynamicCurrency(inv.amount - (inv.amount / (1 + (taxRate/100))))}</div>
<div style={{gridColumn: '1 / -1', height: '1px', background: 'var(--table-border)', margin: '10px 0'}}></div>
<div style={{color: 'var(--text-main)', fontWeight: 'bold'}}>{t('total_computed')}</div>
<div style={{color: 'var(--accent-green)', fontWeight: 'bold'}}>{formatDynamicCurrency(inv.amount)}</div>
</div>
</div>
</td>
</tr>
)}
</React.Fragment>
))}
</tbody>
</table>
</div>
{/* COMMERCIAL FORGE (OMNI-STORE) */}
<div style={{marginTop: '50px'}}>
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '20px'}}>
<div>
<h2 style={{color: 'var(--text-main)', textTransform: 'uppercase', letterSpacing: '2px', margin: 0}}>{t('commercial_forge')}</h2>
<p style={{color: 'var(--text-muted)', margin: '5px 0 0 0'}}>{t('commercial_desc')}</p>
</div>
{/* Currency Switcher */}
<div style={{display: 'flex', gap: '10px', background: 'var(--panel-bg)', padding: '5px', borderRadius: '8px', border: '1px solid var(--table-border)'}}>
{['IDR', 'USD', 'BTC'].map(cur => (
<button
key={cur}
onClick={() => setActiveCurrency(cur)}
style={{
background: activeCurrency === cur ? 'var(--accent-purple)' : 'transparent',
color: activeCurrency === cur ? '#fff' : 'var(--text-muted)',
border: 'none', padding: '5px 15px', borderRadius: '4px', cursor: 'pointer',
fontFamily: 'monospace', fontWeight: 'bold', transition: 'all 0.3s'
}}
>
{cur}
</button>
))}
</div>
</div>
{/* BUNDLE PACKAGES */}
<h3 style={{color: 'var(--accent-cyan)', textTransform: 'uppercase', letterSpacing: '1px', marginTop: '30px'}}>{t('omni_bundles')}</h3>
<div className="grid-cards" style={{display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: '20px', marginBottom: '40px'}}>
{identity?.packages?.includes('JUMPA.ID OMNI-ENGINE') ? (
<div className="glass-panel" style={{
padding: '25px', borderColor: 'var(--accent-green)', background: 'rgba(0,255,136,0.1)',
gridColumn: '1 / -1', textAlign: 'center', boxShadow: '0 0 30px rgba(0, 255, 136, 0.2)'
}}>
<h2 style={{color: 'var(--accent-green)', letterSpacing: '2px', textTransform: 'uppercase', margin: '0 0 10px 0'}}>
{t('omni_locked_title')}
</h2>
<h3 style={{color: 'var(--text-main)', margin: '0 0 15px 0'}}>
{t('omni_locked_active')}<span style={{color: 'var(--accent-purple)'}}>JUMPA.ID OMNI-ENGINE</span>
</h3>
<p style={{color: 'var(--text-muted)', maxWidth: '600px', margin: '0 auto'}}>
{t('omni_locked_desc')}
</p>
</div>
) : (
tiers.map(tier => {
const isOwned = tier.modules.every(m => localPackages.includes(m)) && localPackages.length === tier.modules.length;
return (
<div
key={tier.id}
className="glass-panel"
onMouseEnter={() => setHoverTooltip({ title: tier.name, desc: t('includes_modules').replace('{count}', tier.modules.length)})}
onMouseLeave={() => setHoverTooltip(null)}
style={{
padding: '25px', borderColor: isOwned ? 'var(--accent-green)' : '#333',
background: isOwned ? 'rgba(0,255,136,0.05)' : 'transparent',
display: 'flex', flexDirection: 'column', position: 'relative'
}}
>
<h3 style={{color: isOwned ? 'var(--accent-green)' : 'var(--text-main)', margin: '0 0 10px 0'}}>{tier.name}</h3>
<div style={{fontSize: '0.9rem', color: 'var(--text-muted)', marginBottom: '20px', flex: 1}}>{tier.description}</div>
<div style={{color: 'var(--accent-purple)', fontSize: '1.5rem', fontWeight: 'bold', fontFamily: 'monospace', marginBottom: '20px'}}>
{formatDynamicCurrency(tier.price)}
</div>
{isOwned ? (
<button
onClick={() => setPurchaseModal({...tier, isDowngrade: true})}
style={{width: '100%', padding: '10px', background: 'rgba(255,0,60,0.1)', color: 'var(--accent-red)', border: '1px solid var(--accent-red)', borderRadius: '4px', fontFamily: 'monospace', fontWeight: 'bold', cursor: 'pointer', transition: 'all 0.3s'}}
onMouseEnter={(e) => { e.currentTarget.style.background = 'var(--accent-red)'; e.currentTarget.style.color = '#fff'; e.currentTarget.innerText = t('purge_bundle'); }}
onMouseLeave={(e) => { e.currentTarget.style.background = 'rgba(255,0,60,0.1)'; e.currentTarget.style.color = 'var(--accent-red)'; e.currentTarget.innerText = t('active_bundle'); }}
>
{t('active_bundle')}
</button>
) : (
<button
onClick={() => setPurchaseModal(tier)}
style={{width: '100%', padding: '10px', background: 'var(--accent-purple)', color: '#fff', border: 'none', borderRadius: '4px', fontFamily: 'monospace', fontWeight: 'bold', cursor: 'pointer'}}
>
{t('initiate_handshake')}
</button>
)}
</div>
);
})
)}
</div>
{/* SINGULAR MODULES */}
<h3 style={{color: 'var(--accent-yellow)', textTransform: 'uppercase', letterSpacing: '1px'}}>{t('singular_modules')}</h3>
<div style={{display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))', gap: '15px'}}>
{allModules.map(mod => {
const isOwned = localPackages.includes(mod.id);
const basePrice = modulePrices[mod.id] || 1500000; // Dynamic IDR price per module
return (
<div
key={mod.id}
className="glass-panel"
onMouseEnter={() => setHoverTooltip({ title: mod.name, desc: t('core_desc').replace('{id}', mod.id.toUpperCase())})}
onMouseLeave={() => setHoverTooltip(null)}
style={{
padding: '15px', borderColor: isOwned ? 'var(--accent-green)' : '#222',
background: isOwned ? 'rgba(0,255,136,0.05)' : 'transparent',
transition: 'all 0.3s', position: 'relative'
}}
>
<div style={{color: 'var(--text-muted)', fontSize: '0.7rem', fontFamily: 'monospace', marginBottom: '5px'}}>{mod.id.toUpperCase()}</div>
<div style={{color: isOwned ? 'var(--accent-green)' : 'var(--text-main)', fontWeight: 'bold', fontSize: '0.9rem', marginBottom: '10px', height: '40px'}}>{mod.name}</div>
<div style={{color: 'var(--accent-yellow)', fontFamily: 'monospace', fontSize: '0.9rem', marginBottom: '15px'}}>
{formatDynamicCurrency(basePrice)}
</div>
{isOwned ? (
<button
onClick={() => setPurchaseModal({id: mod.id, name: mod.name, price: basePrice, isDowngrade: true})}
style={{width: '100%', padding: '5px', background: 'rgba(255,0,60,0.1)', color: 'var(--accent-red)', border: '1px solid var(--accent-red)', borderRadius: '4px', fontFamily: 'monospace', fontWeight: 'bold', cursor: 'pointer', fontSize: '0.8rem', transition: 'all 0.3s'}}
onMouseEnter={(e) => { e.currentTarget.style.background = 'var(--accent-red)'; e.currentTarget.style.color = '#fff'; e.currentTarget.innerText = t('downgrade'); }}
onMouseLeave={(e) => { e.currentTarget.style.background = 'rgba(255,0,60,0.1)'; e.currentTarget.style.color = 'var(--accent-red)'; e.currentTarget.innerText = t('installed'); }}
>
{t('installed')}
</button>
) : (
<button
onClick={() => setPurchaseModal({id: mod.id, name: mod.name, price: basePrice})}
style={{width: '100%', background: 'transparent', color: 'var(--accent-cyan)', border: '1px solid var(--accent-cyan)', padding: '5px', borderRadius: '4px', cursor: 'pointer', fontSize: '0.8rem', fontFamily: 'monospace'}}
>
{t('unlock')}
</button>
)}
</div>
);
})}
</div>
</div>
{/* Ultra-Detail Tooltip */}
{hoverTooltip && (
<div style={{
position: 'fixed', bottom: '30px', right: '30px', width: '350px',
background: 'rgba(5, 3, 10, 0.95)', backdropFilter: 'blur(10px)',
border: '1px solid var(--accent-cyan)', borderRadius: '8px', padding: '20px',
boxShadow: '0 0 30px rgba(0, 243, 255, 0.2)', zIndex: 9999,
animation: 'fadeIn 0.2s ease-out', pointerEvents: 'none'
}}>
<div style={{color: 'var(--text-main)', fontSize: '1.2rem', fontWeight: 'bold', marginBottom: '10px'}}>{hoverTooltip.title}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.9rem', lineHeight: '1.5'}}>{hoverTooltip.desc}</div>
<div style={{marginTop: '15px', color: 'var(--accent-green)', fontSize: '0.75rem', fontFamily: 'monospace', textTransform: 'uppercase'}}>{t('zero_latency')}</div>
</div>
)}
{/* Holographic Purchase/Downgrade Modal */}
{purchaseModal && (
<div style={{
position: 'fixed', top: 0, left: 0, width: '100vw', height: '100vh',
background: purchaseModal.isDowngrade ? 'rgba(50,0,0,0.85)' : 'rgba(0,0,0,0.85)', backdropFilter: 'blur(10px)', zIndex: 9999,
display: 'flex', alignItems: 'center', justifyContent: 'center', animation: 'fadeIn 0.3s ease-out'
}}>
<div className="glass-panel" style={{
width: '100%', maxWidth: '500px', padding: '40px', borderColor: purchaseModal.isDowngrade ? 'var(--accent-red)' : 'var(--accent-cyan)',
boxShadow: purchaseModal.isDowngrade ? '0 0 50px rgba(255,0,60,0.2)' : '0 0 50px rgba(0, 243, 255, 0.2)', textAlign: 'center',
background: '#05030a'
}}>
<div style={{color: purchaseModal.isDowngrade ? 'var(--accent-red)' : 'var(--text-main)', fontSize: '2rem', marginBottom: '20px'}}>⬢</div>
<h2 style={{color: 'var(--text-main)', textTransform: 'uppercase', letterSpacing: '2px', marginBottom: '10px'}}>
{purchaseModal.isDowngrade ? t('warning_destructive') : t('crypto_handshake')}
</h2>
<p style={{color: 'var(--text-muted)', marginBottom: '30px'}}>
{purchaseModal.isDowngrade ? (
<>{t('about_to_purge').replace('module', purchaseModal.name)}</>
) : (
<>{t('about_to_unlock').replace('this module', purchaseModal.name)}</>
)}
</p>
<div style={{
background: 'var(--hover-bg)', padding: '20px', borderRadius: '8px', border: '1px solid var(--table-border)',
marginBottom: '20px', fontFamily: 'monospace'
}}>
<div style={{color: 'var(--text-muted)', marginBottom: '5px'}}>{purchaseModal.isDowngrade ? t('value_removed') : 'SUBTOTAL TRANSAKSI'}</div>
<div style={{color: purchaseModal.isDowngrade ? 'var(--accent-red)' : 'var(--text-main)', fontSize: '1.2rem', fontWeight: 'bold'}}>{formatDynamicCurrency(purchaseModal.price)}</div>
{!purchaseModal.isDowngrade && (
<>
<div style={{color: 'var(--accent-red)', marginTop: '10px', fontSize: '0.8rem'}}>+ OMNI-TAX ({taxRate}%)</div>
<div style={{color: 'var(--accent-red)', fontSize: '0.9rem'}}>{formatDynamicCurrency(purchaseModal.price * (taxRate/100))}</div>
<div style={{height: '1px', background: 'var(--table-border)', margin: '15px 0'}}></div>
<div style={{color: 'var(--accent-cyan)', fontSize: '0.9rem'}}>TOTAL DITAGIHKAN</div>
<div style={{color: 'var(--accent-purple)', fontSize: '1.8rem', fontWeight: 'bold'}}>{formatDynamicCurrency(purchaseModal.price + (purchaseModal.price * (taxRate/100)))}</div>
</>
)}
</div>
{!purchaseModal.isDowngrade && (
<div style={{marginBottom: '30px', textAlign: 'left'}}>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', marginBottom: '10px'}}>PILIH METODE PEMBAYARAN (Diizinkan Supreme Admin)</div>
<div style={{display: 'flex', flexDirection: 'column', gap: '8px', maxHeight: '150px', overflowY: 'auto'}} className="custom-scrollbar">
{Object.keys(activeGateways).filter(k => activeGateways[k]).map(gw => (
<div
key={gw}
onClick={() => setSelectedGateway(gw)}
style={{
padding: '10px', border: `1px solid ${selectedGateway === gw ? 'var(--accent-cyan)' : 'var(--table-border)'}`,
borderRadius: '4px', background: selectedGateway === gw ? 'rgba(0,243,255,0.1)' : 'var(--bg-panel)',
cursor: 'pointer', fontFamily: 'monospace', color: selectedGateway === gw ? 'var(--accent-cyan)' : 'var(--text-main)',
transition: 'all 0.2s'
}}
>
{gw.toUpperCase().replace('_', ' ')}
</div>
))}
{Object.keys(activeGateways).filter(k => activeGateways[k]).length === 0 && (
<div style={{color: 'var(--accent-red)', fontFamily: 'monospace'}}>SUPREME ADMIN MEMBLOKIR SEMUA JALUR PEMBAYARAN.</div>
)}
</div>
</div>
)}
<div style={{display: 'flex', gap: '15px'}}>
<button
onClick={() => setPurchaseModal(null)}
style={{flex: 1, padding: '15px', background: 'transparent', color: 'var(--text-muted)', border: '1px solid var(--table-border)', borderRadius: '4px', cursor: 'pointer', fontFamily: 'monospace'}}
>
{t('abort')}
</button>
<button
onClick={handlePurchase}
style={{
flex: 1, padding: '15px',
background: purchaseModal.isDowngrade ? 'var(--accent-red)' : 'var(--accent-cyan)',
color: purchaseModal.isDowngrade ? '#fff' : '#000',
border: 'none', borderRadius: '4px', cursor: 'pointer', fontFamily: 'monospace', fontWeight: 'bold',
boxShadow: purchaseModal.isDowngrade ? '0 0 15px rgba(255,0,60,0.5)' : '0 0 15px rgba(0,243,255,0.5)'
}}
>
{purchaseModal.isDowngrade ? t('confirm_purge') : t('confirm_injection')}
</button>
</div>
</div>
</div>
)}
</div>
);
}
@@ -0,0 +1,230 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { useState, useMemo } from 'react';
import { useModuleRegistry } from '../context/ModuleRegistryContext';
import { useCommercial } from '../context/CommercialContext';
export default function TenantModuleMatrix({ allowedModules = [] }) {
const { registry, allModules } = useModuleRegistry();
const { tiers, modulePrices } = useCommercial();
const [searchQuery, setSearchQuery] = useState('');
const [viewMode, setViewMode] = useState('grid'); // grid | list
// Supreme mode: all modules granted
const isSupreme = allowedModules === 'supreme';
const effectiveAllowed = isSupreme ? allModules.map(m => m.id) : allowedModules;
// Build module status map
const moduleStatusMap = useMemo(() => {
const map = {};
allModules.forEach(mod => {
const isGranted = effectiveAllowed.includes(mod.id);
map[mod.id] = {
...mod,
granted: isGranted,
price: modulePrices?.[mod.id] || null
};
});
return map;
}, [allModules, allowedModules, modulePrices]);
const grantedCount = effectiveAllowed.length;
const totalCount = allModules.length;
const lockedCount = totalCount - grantedCount;
// Find matching tier
const matchedTier = useMemo(() => {
return tiers.find(t =>
t.modules.length === effectiveAllowed.length &&
t.modules.every(m => effectiveAllowed.includes(m))
);
}, [tiers, allowedModules]);
// Filter modules
const filteredModules = useMemo(() => {
if (!searchQuery.trim()) return allModules;
const q = searchQuery.toLowerCase();
return allModules.filter(m =>
m.id.toLowerCase().includes(q) ||
m.name.toLowerCase().includes(q)
);
}, [allModules, searchQuery]);
// Group by registry category
const groupedModules = useMemo(() => {
const groups = {};
for (const [groupKey, groupData] of Object.entries(registry)) {
const mods = groupData.modules.filter(m =>
filteredModules.some(fm => fm.id === m.id)
);
if (mods.length > 0) {
groups[groupKey] = { ...groupData, modules: mods };
}
}
return groups;
}, [registry, filteredModules]);
return (
<div className="glass-panel" style={{padding: '30px', borderColor: 'var(--accent-purple)'}}>
{/* Header Stats */}
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', flexWrap: 'wrap', gap: '15px', marginBottom: '25px'}}>
<div>
<h2 style={{color: 'var(--accent-purple)', marginBottom: '8px', fontFamily: 'monospace', letterSpacing: '2px'}}>MODULE ACCESS MATRIX</h2>
<p style={{color: 'var(--text-muted)', fontSize: '0.85rem'}}>
{isSupreme && <span style={{color: 'var(--accent-yellow)', fontWeight: 'bold'}}>SUPREME ADMIN ALL ACCESS</span>}{!isSupreme && <>Tier: <span style={{color: 'var(--accent-cyan)', fontWeight: 'bold'}}>{matchedTier ? matchedTier.name : 'CUSTOM A LA CARTE'}</span></>}
</p>
</div>
<div style={{display: 'flex', gap: '12px'}}>
<div style={{background: 'rgba(0, 255, 136, 0.08)', border: '1px solid var(--accent-green)', padding: '10px 18px', borderRadius: '8px', fontFamily: 'monospace', textAlign: 'center'}}>
<div style={{color: 'var(--accent-green)', fontSize: '1.6rem', fontWeight: 'bold'}}>{grantedCount}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.6rem', letterSpacing: '1px'}}>GRANTED</div>
</div>
<div style={{background: 'rgba(255, 0, 60, 0.08)', border: '1px solid var(--accent-red)', padding: '10px 18px', borderRadius: '8px', fontFamily: 'monospace', textAlign: 'center'}}>
<div style={{color: 'var(--accent-red)', fontSize: '1.6rem', fontWeight: 'bold'}}>{lockedCount}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.6rem', letterSpacing: '1px'}}>LOCKED</div>
</div>
<div style={{background: 'rgba(0, 243, 255, 0.08)', border: '1px solid var(--accent-cyan)', padding: '10px 18px', borderRadius: '8px', fontFamily: 'monospace', textAlign: 'center'}}>
<div style={{color: 'var(--accent-cyan)', fontSize: '1.6rem', fontWeight: 'bold'}}>{totalCount}</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.6rem', letterSpacing: '1px'}}>TOTAL</div>
</div>
</div>
</div>
{/* Search + View Toggle */}
<div style={{display: 'flex', gap: '10px', marginBottom: '25px', alignItems: 'center'}}>
<input
type="text"
placeholder="🔍 Cari modul (ID atau nama)..."
value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)}
style={{
flex: 1, padding: '10px 15px', background: 'var(--panel-bg)', color: 'var(--text-main)',
border: '1px solid var(--table-border)', borderRadius: '8px', fontFamily: 'monospace', fontSize: '0.85rem'
}}
/>
<div style={{display: 'flex', border: '1px solid var(--table-border)', borderRadius: '6px', overflow: 'hidden'}}>
<button
onClick={() => setViewMode('grid')}
style={{
padding: '8px 14px', background: viewMode === 'grid' ? 'var(--accent-purple)' : 'transparent',
color: viewMode === 'grid' ? '#fff' : 'var(--text-muted)', border: 'none', cursor: 'pointer',
fontFamily: 'monospace', fontSize: '0.8rem'
}}
> Grid</button>
<button
onClick={() => setViewMode('list')}
style={{
padding: '8px 14px', background: viewMode === 'list' ? 'var(--accent-purple)' : 'transparent',
color: viewMode === 'list' ? '#fff' : 'var(--text-muted)', border: 'none', cursor: 'pointer',
fontFamily: 'monospace', fontSize: '0.8rem'
}}
> List</button>
</div>
</div>
{/* Progress Bar */}
<div style={{marginBottom: '25px'}}>
<div style={{display: 'flex', justifyContent: 'space-between', marginBottom: '5px'}}>
<span style={{color: 'var(--text-muted)', fontSize: '0.75rem', fontFamily: 'monospace'}}>COVERAGE</span>
<span style={{color: 'var(--accent-green)', fontSize: '0.75rem', fontFamily: 'monospace'}}>{totalCount > 0 ? Math.round(grantedCount / totalCount * 100) : 0}%</span>
</div>
<div style={{width: '100%', height: '6px', background: 'rgba(255,255,255,0.05)', borderRadius: '3px', overflow: 'hidden'}}>
<div style={{
width: totalCount > 0 ? `${grantedCount / totalCount * 100}%` : '0%',
height: '100%',
background: 'linear-gradient(90deg, var(--accent-green), var(--accent-cyan))',
borderRadius: '3px',
transition: 'width 0.5s ease'
}} />
</div>
</div>
{/* Module Grid/List by Group */}
{Object.entries(groupedModules).map(([groupKey, groupData]) => (
<div key={groupKey} style={{marginBottom: '25px'}}>
<h3 style={{
color: 'var(--accent-cyan)', fontSize: '0.8rem', fontFamily: 'monospace',
letterSpacing: '2px', marginBottom: '12px', textTransform: 'uppercase',
borderBottom: '1px solid rgba(0, 243, 255, 0.15)', paddingBottom: '6px'
}}>
{groupKey.replace(/_/g, ' ')} ({groupData.modules.length})
</h3>
{viewMode === 'grid' ? (
<div style={{display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(180px, 1fr))', gap: '10px'}}>
{groupData.modules.map(mod => {
const status = moduleStatusMap[mod.id];
const isGranted = status?.granted;
return (
<div key={mod.id} style={{
padding: '14px', borderRadius: '8px',
background: isGranted ? 'rgba(0, 255, 136, 0.04)' : 'rgba(255, 0, 60, 0.03)',
border: `1px solid ${isGranted ? 'rgba(0, 255, 136, 0.25)' : 'rgba(255, 0, 60, 0.15)'}`,
opacity: isGranted ? 1 : 0.5,
transition: 'all 0.2s'
}}>
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '6px'}}>
<span style={{color: isGranted ? 'var(--accent-green)' : 'var(--accent-red)', fontFamily: 'monospace', fontSize: '0.7rem', fontWeight: 'bold'}}>
{mod.id.toUpperCase()}
</span>
<span style={{
fontSize: '0.55rem', fontFamily: 'monospace', fontWeight: 'bold',
padding: '2px 6px', borderRadius: '3px',
background: isGranted ? 'rgba(0, 255, 136, 0.15)' : 'rgba(255, 0, 60, 0.15)',
color: isGranted ? 'var(--accent-green)' : 'var(--accent-red)'
}}>
{isGranted ? '✓ GRANTED' : '✗ LOCKED'}
</span>
</div>
<div style={{color: 'var(--text-main)', fontSize: '0.78rem', lineHeight: 1.3}}>
{mod.name}
</div>
{status?.price && (
<div style={{color: 'var(--accent-yellow)', fontSize: '0.65rem', fontFamily: 'monospace', marginTop: '4px'}}>
${status.price}/mo
</div>
)}
</div>
);
})}
</div>
) : (
<table style={{width: '100%', borderCollapse: 'collapse'}}>
<tbody>
{groupData.modules.map(mod => {
const status = moduleStatusMap[mod.id];
const isGranted = status?.granted;
return (
<tr key={mod.id} style={{borderBottom: '1px solid rgba(255,255,255,0.04)'}}>
<td style={{padding: '8px 12px', fontFamily: 'monospace', fontSize: '0.75rem', color: isGranted ? 'var(--accent-green)' : 'var(--accent-red)', width: '60px'}}>
{mod.id}
</td>
<td style={{padding: '8px 12px', color: 'var(--text-main)', fontSize: '0.8rem', opacity: isGranted ? 1 : 0.4}}>
{mod.name}
</td>
<td style={{padding: '8px 12px', textAlign: 'right'}}>
<span style={{
fontSize: '0.6rem', fontFamily: 'monospace', fontWeight: 'bold',
padding: '3px 8px', borderRadius: '3px',
background: isGranted ? 'rgba(0, 255, 136, 0.12)' : 'rgba(255, 0, 60, 0.12)',
color: isGranted ? 'var(--accent-green)' : 'var(--accent-red)'
}}>
{isGranted ? '✓ GRANTED' : '✗ LOCKED'}
</span>
</td>
</tr>
);
})}
</tbody>
</table>
)}
</div>
))}
{filteredModules.length === 0 && (
<div style={{textAlign: 'center', padding: '40px', color: 'var(--text-muted)', fontFamily: 'monospace'}}>
Tidak ada modul yang cocok dengan pencarian.
</div>
)}
</div>
);
}
@@ -0,0 +1,668 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
// Phase 1: Tenant Monitor Dashboard — Live Monitoring + Intrusion Detection
import { useState, useEffect, useCallback } from 'react';
const API = '/xcu-api/v1/monitor';
const REFRESH_INTERVAL = 10000;
const SEVERITY_COLORS = {
CRITICAL: '#ff003c',
HIGH: '#ff6600',
MEDIUM: '#ffea00',
LOW: '#00ff88',
};
const SEVERITY_ICONS = {
CRITICAL: '🔴',
HIGH: '🟠',
MEDIUM: '🟡',
LOW: '🟢',
};
function formatBytes(bytes) {
if (!bytes) return '0 B';
const k = 1024;
const sizes = ['B', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;
}
function formatUptime(startTs) {
if (!startTs) return '-';
const diff = Date.now() - startTs;
const h = Math.floor(diff / 3600000);
const m = Math.floor((diff % 3600000) / 60000);
return h > 0 ? `${h}h ${m}m` : `${m}m`;
}
// Tenant-to-service mapping (auto-detected from PM2 service names)
const TENANT_SERVICE_MAP = {
'__XCU__': { label: 'XCU INFRASTRUCTURE', prefix: 'xcu-', color: '#ff003c' },
'JUMPA.ID': { label: 'JUMPA.ID', prefix: 'jumpa-', color: '#00f3ff' },
};
export default function TenantMonitor() {
const [selectedTenant, setSelectedTenant] = useState(null);
const [tenants, setTenants] = useState([]);
const [activePanel, setActivePanel] = useState('health');
const [health, setHealth] = useState(null);
const [traffic, setTraffic] = useState(null);
const [logs, setLogs] = useState(null);
const [intrusions, setIntrusions] = useState(null);
const [selectedService, setSelectedService] = useState('');
const [blocked, setBlocked] = useState(null);
const [hideBlocked, setHideBlocked] = useState(true);
const [searchQuery, setSearchQuery] = useState('');
const [lastRefresh, setLastRefresh] = useState(null);
const [isLoading, setIsLoading] = useState(false);
const [alertCount, setAlertCount] = useState(0);
// Fetch tenant list on mount
useEffect(() => {
fetch('/xcu-api/v1/tenants').then(r => r.json()).then(data => {
const list = (Array.isArray(data) ? data : []).map(t => ({
key: t.tenant_key || t.tenant_name,
name: t.tenant_name,
status: t.status || 'active'
}));
setTenants(list);
}).catch(() => {});
}, []);
// Filter services based on selected tenant
const getFilteredServices = (services) => {
if (!selectedTenant || selectedTenant === '__ALL__') return services;
const mapping = TENANT_SERVICE_MAP[selectedTenant];
if (mapping) return services.filter(s => s.name.startsWith(mapping.prefix));
// For dynamic tenants, try matching by tenant key prefix
return services.filter(s => s.name.toLowerCase().includes(selectedTenant.toLowerCase().split('.')[0].split(' ')[0]));
};
const fetchData = useCallback(async (panel) => {
setIsLoading(true);
try {
const target = panel || activePanel;
if (target === 'health') {
const r = await fetch(`${API}/health`);
const d = await r.json();
setHealth(d);
const downCount = (d.services || []).filter(s => s.status !== 'online').length;
setAlertCount(prev => Math.max(prev, downCount));
} else if (target === 'traffic') {
const q = searchQuery ? `?q=${encodeURIComponent(searchQuery)}` : '';
const r = await fetch(`${API}/traffic${q}`);
setTraffic(await r.json());
} else if (target === 'logs') {
const q = searchQuery ? `&q=${encodeURIComponent(searchQuery)}` : '';
const r = await fetch(`${API}/logs/${selectedService}?lines=10${q}`);
setLogs(await r.json());
} else if (target === 'intrusions') {
const [r, rb] = await Promise.all([fetch(`${API}/intrusions`), fetch(`${API}/blocked`)]);
const d = await r.json();
setIntrusions(d);
setAlertCount(d.total || 0);
setBlocked(await rb.json());
} else if (target === 'blocked') {
const r = await fetch(`${API}/blocked`);
setBlocked(await r.json());
}
setLastRefresh(new Date());
} catch (e) {
console.error('[MONITOR]', e);
}
setIsLoading(false);
}, [activePanel, searchQuery, selectedService]);
useEffect(() => {
fetchData();
const interval = setInterval(() => fetchData(), REFRESH_INTERVAL);
return () => clearInterval(interval);
}, [fetchData]);
const handleBlockIP = async (ip, action) => {
if (!confirm(`${action === 'block' ? 'BLOCK' : 'UNBLOCK'} IP ${ip}?`)) return;
await fetch(`${API}/block-ip`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ip, action }),
});
fetchData('intrusions');
if (activePanel === 'blocked') fetchData('blocked');
};
const panels = [
{ id: 'health', label: '🏥 Service Health', icon: '🏥' },
{ id: 'traffic', label: '📊 Live Traffic', icon: '📊' },
{ id: 'logs', label: '📋 Log Viewer', icon: '📋' },
{ id: 'intrusions', label: `🚨 Intrusions${alertCount > 0 ? ` (${alertCount})` : ''}`, icon: '🚨' },
{ id: 'blocked', label: `🛡 Blocked IPs${blocked?.total > 0 ? ` (${blocked.total})` : ''}`, icon: '🛡' },
];
// If no tenant selected, show tenant picker
if (!selectedTenant) {
return (
<div className="glass-panel" style={{ padding: '30px', borderColor: 'var(--accent-cyan)' }}>
<h2 style={{ color: 'var(--accent-cyan)', textTransform: 'uppercase', letterSpacing: '2px', marginBottom: '10px' }}>
📡 Tenant Monitor
</h2>
<p style={{ color: 'var(--text-muted)', fontSize: '0.85rem', marginBottom: '25px' }}>
Pilih tenant untuk memantau infrastruktur:
</p>
<div style={{ display: 'flex', flexWrap: 'wrap', gap: '15px' }}>
{/* XCU Infrastructure */}
<button
onClick={() => setSelectedTenant('__ALL__')}
style={{
flex: '1 1 200px', padding: '25px 20px', background: 'rgba(255,255,255,0.03)',
border: '1px solid var(--table-border)', borderRadius: '10px', cursor: 'pointer',
textAlign: 'left', transition: 'all 0.2s'
}}
onMouseEnter={e => { e.currentTarget.style.borderColor = '#00f3ff'; e.currentTarget.style.background = 'rgba(0,243,255,0.05)'; }}
onMouseLeave={e => { e.currentTarget.style.borderColor = 'var(--table-border)'; e.currentTarget.style.background = 'rgba(255,255,255,0.03)'; }}
>
<div style={{ fontSize: '1.5rem', marginBottom: '8px' }}>🌐</div>
<div style={{ color: '#00f3ff', fontWeight: 'bold', fontFamily: 'monospace', fontSize: '0.95rem' }}>ALL INFRASTRUCTURE</div>
<div style={{ color: 'var(--text-muted)', fontSize: '0.75rem', marginTop: '5px' }}>XCU + Semua Tenant</div>
</button>
<button
onClick={() => setSelectedTenant('__XCU__')}
style={{
flex: '1 1 200px', padding: '25px 20px', background: 'rgba(255,255,255,0.03)',
border: '1px solid var(--table-border)', borderRadius: '10px', cursor: 'pointer',
textAlign: 'left', transition: 'all 0.2s'
}}
onMouseEnter={e => { e.currentTarget.style.borderColor = '#ff003c'; e.currentTarget.style.background = 'rgba(255,0,60,0.05)'; }}
onMouseLeave={e => { e.currentTarget.style.borderColor = 'var(--table-border)'; e.currentTarget.style.background = 'rgba(255,255,255,0.03)'; }}
>
<div style={{ fontSize: '1.5rem', marginBottom: '8px' }}></div>
<div style={{ color: '#ff003c', fontWeight: 'bold', fontFamily: 'monospace', fontSize: '0.95rem' }}>XCU ENGINE</div>
<div style={{ color: 'var(--text-muted)', fontSize: '0.75rem', marginTop: '5px' }}>Gatekeeper, Omni-Relay, Core</div>
</button>
{/* JUMPA.ID (hardcoded known tenant) */}
<button
onClick={() => setSelectedTenant('JUMPA.ID')}
style={{
flex: '1 1 200px', padding: '25px 20px', background: 'rgba(255,255,255,0.03)',
border: '1px solid var(--table-border)', borderRadius: '10px', cursor: 'pointer',
textAlign: 'left', transition: 'all 0.2s'
}}
onMouseEnter={e => { e.currentTarget.style.borderColor = '#00f3ff'; e.currentTarget.style.background = 'rgba(0,243,255,0.05)'; }}
onMouseLeave={e => { e.currentTarget.style.borderColor = 'var(--table-border)'; e.currentTarget.style.background = 'rgba(255,255,255,0.03)'; }}
>
<div style={{ fontSize: '1.5rem', marginBottom: '8px' }}>🏢</div>
<div style={{ color: '#00f3ff', fontWeight: 'bold', fontFamily: 'monospace', fontSize: '0.95rem' }}>JUMPA.ID</div>
<div style={{ color: 'var(--text-muted)', fontSize: '0.75rem', marginTop: '5px' }}>IAM, VC, Chat</div>
</button>
{/* Dynamic tenants from DB */}
{tenants.filter(t => t.name !== 'JUMPA.ID ENTERPRISE').map(t => (
<button
key={t.key}
onClick={() => setSelectedTenant(t.key)}
style={{
flex: '1 1 200px', padding: '25px 20px', background: 'rgba(255,255,255,0.03)',
border: '1px solid var(--table-border)', borderRadius: '10px', cursor: 'pointer',
textAlign: 'left', transition: 'all 0.2s'
}}
onMouseEnter={e => { e.currentTarget.style.borderColor = 'var(--accent-purple)'; e.currentTarget.style.background = 'rgba(168,85,247,0.05)'; }}
onMouseLeave={e => { e.currentTarget.style.borderColor = 'var(--table-border)'; e.currentTarget.style.background = 'rgba(255,255,255,0.03)'; }}
>
<div style={{ fontSize: '1.5rem', marginBottom: '8px' }}>🏢</div>
<div style={{ color: 'var(--accent-purple)', fontWeight: 'bold', fontFamily: 'monospace', fontSize: '0.95rem' }}>{t.name}</div>
<div style={{ color: 'var(--text-muted)', fontSize: '0.75rem', marginTop: '5px' }}>{t.key}</div>
</button>
))}
</div>
</div>
);
}
const tenantLabel = selectedTenant === '__ALL__' ? 'ALL INFRASTRUCTURE'
: selectedTenant === '__XCU__' ? 'XCU ENGINE'
: TENANT_SERVICE_MAP[selectedTenant]?.label || selectedTenant;
return (
<div className="glass-panel" style={{ padding: '30px', borderColor: 'var(--accent-cyan)' }}>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '20px' }}>
<div style={{ display: 'flex', alignItems: 'center', gap: '15px' }}>
<button
onClick={() => setSelectedTenant(null)}
style={{
padding: '6px 12px', background: 'rgba(255,255,255,0.05)',
color: 'var(--text-muted)', border: '1px solid var(--table-border)',
borderRadius: '4px', cursor: 'pointer', fontFamily: 'monospace', fontSize: '0.8rem'
}}
>
BACK
</button>
<div>
<h2 style={{ color: 'var(--accent-cyan)', textTransform: 'uppercase', letterSpacing: '2px', margin: 0 }}>
📡 {tenantLabel}
</h2>
<p style={{ color: 'var(--text-muted)', fontSize: '0.8rem', margin: '5px 0 0' }}>
Live monitoring {tenantLabel}
</p>
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', gap: '10px' }}>
{lastRefresh && (
<span style={{ color: 'var(--text-muted)', fontSize: '0.7rem', fontFamily: 'monospace' }}>
{lastRefresh.toLocaleTimeString()}
</span>
)}
<button
onClick={() => fetchData()}
disabled={isLoading}
style={{
padding: '8px 15px', background: 'rgba(0, 243, 255, 0.1)',
color: 'var(--accent-cyan)', border: '1px solid var(--accent-cyan)',
borderRadius: '4px', cursor: 'pointer', fontFamily: 'monospace',
opacity: isLoading ? 0.5 : 1
}}
>
{isLoading ? '⏳' : '🔄'} REFRESH
</button>
</div>
</div>
{/* Panel Tabs */}
<div style={{ display: 'flex', gap: '5px', marginBottom: '20px', flexWrap: 'wrap' }}>
{panels.map(p => (
<button
key={p.id}
onClick={() => { setActivePanel(p.id); setSearchQuery(''); }}
style={{
padding: '10px 18px',
background: activePanel === p.id ? 'rgba(0, 243, 255, 0.15)' : 'rgba(255,255,255,0.03)',
color: activePanel === p.id ? 'var(--accent-cyan)' : 'var(--text-muted)',
border: `1px solid ${activePanel === p.id ? 'var(--accent-cyan)' : 'var(--table-border)'}`,
borderRadius: '6px', cursor: 'pointer', fontFamily: 'monospace', fontSize: '0.85rem',
transition: 'all 0.2s',
}}
>
{p.label}
</button>
))}
</div>
{/* Search Bar */}
{(activePanel === 'traffic' || activePanel === 'logs') && (
<div style={{ display: 'flex', gap: '10px', marginBottom: '15px' }}>
<input
type="text"
placeholder="🔍 Search logs..."
value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)}
onKeyDown={(e) => e.key === 'Enter' && fetchData()}
style={{
flex: 1, padding: '10px 15px', background: 'rgba(255,255,255,0.03)',
color: 'var(--text-main)', border: '1px solid var(--table-border)',
borderRadius: '6px', fontFamily: 'monospace', fontSize: '0.85rem',
outline: 'none'
}}
/>
{activePanel === 'logs' && (
<select
value={selectedService}
onChange={(e) => setSelectedService(e.target.value)}
style={{
padding: '10px', background: 'var(--panel-bg)', color: 'var(--text-main)',
border: '1px solid var(--table-border)', borderRadius: '6px',
fontFamily: 'monospace', cursor: 'pointer'
}}
>
{(health?.services || []).map(s => (
<option key={s.name} value={s.name}>{s.name}</option>
))}
{(!health?.services || health.services.length === 0) && (
<>
<option value="jumpa-iam">jumpa-iam</option>
<option value="jumpa-vc">jumpa-vc</option>
<option value="jumpa-chat">jumpa-chat</option>
<option value="xcu-gatekeeper">xcu-gatekeeper</option>
<option value="xcu-omni-relay">xcu-omni-relay</option>
</>
)}
</select>
)}
</div>
)}
{/* ═══ PANEL: SERVICE HEALTH ═══ */}
{activePanel === 'health' && (
<div>
<table style={{ width: '100%', borderCollapse: 'collapse' }}>
<thead>
<tr style={{ borderBottom: '1px solid var(--table-border)' }}>
<th style={{ padding: '12px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'left' }}>SERVICE</th>
<th style={{ padding: '12px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'center' }}>STATUS</th>
<th style={{ padding: '12px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'center' }}>PID</th>
<th style={{ padding: '12px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'center' }}>UPTIME</th>
<th style={{ padding: '12px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'center' }}>MEMORY</th>
<th style={{ padding: '12px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'center' }}>CPU</th>
<th style={{ padding: '12px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'center' }}>RESTARTS</th>
</tr>
</thead>
<tbody>
{getFilteredServices(health?.services || []).map(s => (
<tr key={s.name} style={{ borderBottom: '1px solid rgba(255,255,255,0.05)' }}>
<td style={{ padding: '12px' }}>
<span style={{ color: 'var(--text-main)', fontWeight: 'bold', fontFamily: 'monospace' }}>{s.name}</span>
</td>
<td style={{ padding: '12px', textAlign: 'center' }}>
<span style={{
padding: '4px 12px', borderRadius: '20px', fontSize: '0.75rem', fontWeight: 'bold',
background: s.status === 'online' ? 'rgba(0,255,136,0.1)' : 'rgba(255,0,60,0.1)',
color: s.status === 'online' ? '#00ff88' : '#ff003c',
border: `1px solid ${s.status === 'online' ? '#00ff88' : '#ff003c'}`
}}>
{s.status === 'online' ? '🟢 ONLINE' : '🔴 DOWN'}
</span>
</td>
<td style={{ padding: '12px', textAlign: 'center', color: 'var(--text-muted)', fontFamily: 'monospace', fontSize: '0.8rem' }}>{s.pid}</td>
<td style={{ padding: '12px', textAlign: 'center', color: 'var(--accent-cyan)', fontFamily: 'monospace', fontSize: '0.8rem' }}>{formatUptime(s.uptime)}</td>
<td style={{ padding: '12px', textAlign: 'center', color: 'var(--accent-purple)', fontFamily: 'monospace', fontSize: '0.8rem' }}>{formatBytes(s.memory)}</td>
<td style={{ padding: '12px', textAlign: 'center', color: 'var(--text-muted)', fontFamily: 'monospace', fontSize: '0.8rem' }}>{s.cpu}%</td>
<td style={{ padding: '12px', textAlign: 'center' }}>
<span style={{ color: s.restarts > 5 ? '#ff003c' : s.restarts > 0 ? '#ffea00' : '#00ff88', fontFamily: 'monospace' }}>
{s.restarts}
</span>
</td>
</tr>
))}
{(!health?.services || health.services.length === 0) && (
<tr><td colSpan={7} style={{ padding: '30px', textAlign: 'center', color: 'var(--text-muted)' }}>Loading...</td></tr>
)}
</tbody>
</table>
</div>
)}
{/* ═══ PANEL: LIVE TRAFFIC ═══ */}
{activePanel === 'traffic' && (
<div>
{traffic?.stats && (
<div style={{ display: 'flex', gap: '15px', marginBottom: '15px', flexWrap: 'wrap' }}>
{Object.entries(traffic.stats).map(([k, v]) => (
<div key={k} style={{
padding: '12px 20px', background: 'rgba(255,255,255,0.03)',
border: '1px solid var(--table-border)', borderRadius: '8px', textAlign: 'center'
}}>
<div style={{ color: 'var(--text-muted)', fontSize: '0.7rem', marginBottom: '5px' }}>{k.toUpperCase()}</div>
<div style={{
fontSize: '1.4rem', fontWeight: 'bold', fontFamily: 'monospace',
color: k === '5xx' ? '#ff003c' : k === '4xx' ? '#ffea00' : k === '2xx' ? '#00ff88' : 'var(--text-main)'
}}>{v}</div>
</div>
))}
</div>
)}
<div style={{
background: 'rgba(0,0,0,0.3)', borderRadius: '8px', padding: '15px',
fontFamily: 'monospace', fontSize: '0.75rem', maxHeight: '400px', overflow: 'auto'
}}>
{(traffic?.entries || []).map((entry, i) => {
const is4xx = entry.includes('" 4');
const is5xx = entry.includes('" 5');
return (
<div key={i} style={{
padding: '4px 0', borderBottom: '1px solid rgba(255,255,255,0.03)',
color: is5xx ? '#ff003c' : is4xx ? '#ffea00' : 'var(--text-muted)',
wordBreak: 'break-all'
}}>
{entry}
</div>
);
})}
{(!traffic?.entries || traffic.entries.length === 0) && (
<div style={{ color: 'var(--text-muted)', textAlign: 'center', padding: '20px' }}>Loading...</div>
)}
</div>
</div>
)}
{/* ═══ PANEL: LOG VIEWER ═══ */}
{activePanel === 'logs' && (
<div style={{
background: 'rgba(0,0,0,0.3)', borderRadius: '8px', padding: '15px',
fontFamily: 'monospace', fontSize: '0.75rem', maxHeight: '500px', overflow: 'auto'
}}>
<div style={{ color: 'var(--accent-cyan)', marginBottom: '10px', fontSize: '0.8rem' }}>
📋 {selectedService} Last 10 lines
</div>
{(logs?.logs || []).map((line, i) => {
const isError = line.toLowerCase().includes('error') || line.toLowerCase().includes('fail');
const isWarn = line.toLowerCase().includes('warn');
return (
<div key={i} style={{
padding: '3px 0', borderBottom: '1px solid rgba(255,255,255,0.03)',
color: isError ? '#ff003c' : isWarn ? '#ffea00' : 'var(--text-muted)',
wordBreak: 'break-all'
}}>
{line}
</div>
);
})}
{(!logs?.logs || logs.logs.length === 0) && (
<div style={{ color: 'var(--text-muted)', textAlign: 'center', padding: '20px' }}>
{logs?.error || 'Loading...'}
</div>
)}
</div>
)}
{/* ═══ PANEL: INTRUSION DETECTION ═══ */}
{activePanel === 'intrusions' && (
<div>
<div style={{ display: 'flex', justifyContent: 'flex-end', marginBottom: '10px' }}>
<button
onClick={() => setHideBlocked(!hideBlocked)}
style={{
padding: '5px 12px', borderRadius: '4px', cursor: 'pointer', fontSize: '0.7rem', fontFamily: 'monospace',
background: hideBlocked ? 'rgba(0,255,136,0.1)' : 'rgba(255,0,60,0.1)',
color: hideBlocked ? '#00ff88' : '#ff003c',
border: `1px solid ${hideBlocked ? 'rgba(0,255,136,0.3)' : 'rgba(255,0,60,0.3)'}`
}}
>
{hideBlocked ? '👁 Show blocked IPs' : '🚫 Hide blocked IPs'}
</button>
</div>
{intrusions?.bruteForceIPs?.length > 0 && (
<div style={{
padding: '12px 15px', background: 'rgba(255, 0, 60, 0.1)', border: '1px solid #ff003c',
borderRadius: '6px', marginBottom: '15px'
}}>
<span style={{ color: '#ff003c', fontWeight: 'bold' }}> BRUTE FORCE DETECTED: </span>
{intrusions.bruteForceIPs.map(ip => (
<span key={ip} style={{ fontFamily: 'monospace', color: '#ff003c', marginRight: '10px' }}>
{ip}
<button
onClick={() => handleBlockIP(ip, 'block')}
style={{
marginLeft: '5px', padding: '2px 8px', background: 'rgba(255,0,60,0.2)',
color: '#ff003c', border: '1px solid #ff003c', borderRadius: '3px',
cursor: 'pointer', fontSize: '0.7rem', fontFamily: 'monospace'
}}
>
BLOCK
</button>
</span>
))}
</div>
)}
<table style={{ width: '100%', borderCollapse: 'collapse' }}>
<thead>
<tr style={{ borderBottom: '1px solid var(--table-border)' }}>
<th style={{ padding: '10px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'center' }}>SEV</th>
<th style={{ padding: '10px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'left' }}>TYPE</th>
<th style={{ padding: '10px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'left' }}>IP</th>
<th style={{ padding: '10px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'left' }}>TARGET</th>
<th style={{ padding: '10px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'center' }}>ACTION</th>
</tr>
</thead>
<tbody>
{(() => {
// Group intrusions by IP
const grouped = {};
(intrusions?.intrusions || []).forEach(item => {
const key = item.ip || 'unknown';
if (!grouped[key]) {
grouped[key] = { ...item, count: 1, types: new Set([item.type]) };
} else {
grouped[key].count++;
grouped[key].types.add(item.type);
// Keep highest severity
const sevOrder = { CRITICAL: 4, HIGH: 3, MEDIUM: 2, LOW: 1 };
if ((sevOrder[item.severity] || 0) > (sevOrder[grouped[key].severity] || 0)) {
grouped[key].severity = item.severity;
}
}
});
const blockedIPs = new Set((blocked?.blocked || []).map(b => b.ip));
return Object.values(grouped)
.filter(item => !hideBlocked || !blockedIPs.has(item.ip))
.sort((a, b) => b.count - a.count).map((item, i) => (
<tr key={i} style={{ borderBottom: '1px solid rgba(255,255,255,0.03)' }}>
<td style={{ padding: '10px', textAlign: 'center' }}>
{SEVERITY_ICONS[item.severity] || '⚪'}
</td>
<td style={{ padding: '10px' }}>
{[...item.types].map(t => (
<span key={t} style={{
padding: '3px 6px', borderRadius: '3px', fontSize: '0.65rem', fontFamily: 'monospace',
background: `${SEVERITY_COLORS[item.severity]}15`,
color: SEVERITY_COLORS[item.severity],
border: `1px solid ${SEVERITY_COLORS[item.severity]}40`,
marginRight: '4px'
}}>
{t}
</span>
))}
</td>
<td style={{ padding: '10px', fontFamily: 'monospace', fontSize: '0.8rem', color: 'var(--text-muted)' }}>
{item.ip || '-'}
{item.count > 1 && (
<span style={{
marginLeft: '6px', padding: '2px 6px', borderRadius: '10px', fontSize: '0.65rem',
background: 'rgba(255,234,0,0.15)', color: '#ffea00', border: '1px solid rgba(255,234,0,0.3)'
}}>
×{item.count}
</span>
)}
</td>
<td style={{ padding: '10px', fontFamily: 'monospace', fontSize: '0.75rem', color: 'var(--text-muted)', maxWidth: '300px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
{item.target || item.raw?.substring(0, 80) || '-'}
</td>
<td style={{ padding: '10px', textAlign: 'center' }}>
{item.ip && item.ip !== 'unknown' && (() => {
const isBlocked = (blocked?.blocked || []).some(b => b.ip === item.ip);
return isBlocked ? (
<div style={{ display: 'flex', gap: '4px', justifyContent: 'center', alignItems: 'center' }}>
<span style={{
padding: '4px 8px', background: 'rgba(255,0,60,0.15)',
color: '#ff003c', border: '1px solid rgba(255,0,60,0.4)',
borderRadius: '3px', fontSize: '0.65rem', fontFamily: 'monospace', fontWeight: 'bold'
}}>
🛡 BLOCKED
</span>
<button
onClick={() => handleBlockIP(item.ip, 'unblock')}
style={{
padding: '4px 8px', background: 'rgba(0,255,136,0.1)',
color: '#00ff88', border: '1px solid rgba(0,255,136,0.3)',
borderRadius: '3px', cursor: 'pointer', fontSize: '0.65rem', fontFamily: 'monospace'
}}
>
🔓 UNBLOCK
</button>
</div>
) : (
<button
onClick={() => handleBlockIP(item.ip, 'block')}
style={{
padding: '4px 8px', background: 'rgba(255,0,60,0.1)',
color: '#ff003c', border: '1px solid rgba(255,0,60,0.3)',
borderRadius: '3px', cursor: 'pointer', fontSize: '0.65rem', fontFamily: 'monospace'
}}
>
🛡 BLOCK
</button>
);
})()}
</td>
</tr>
));
})()}
{(!intrusions?.intrusions || intrusions.intrusions.length === 0) && (
<tr>
<td colSpan={5} style={{ padding: '30px', textAlign: 'center', color: '#00ff88' }}>
Tidak ada intrusi terdeteksi
</td>
</tr>
)}
</tbody>
</table>
<div style={{ marginTop: '10px', color: 'var(--text-muted)', fontSize: '0.7rem', fontFamily: 'monospace' }}>
Total events: {intrusions?.total || 0} | Auto-refresh: {REFRESH_INTERVAL / 1000}s
</div>
</div>
)}
{/* ═══ PANEL: BLOCKED IPs ═══ */}
{activePanel === 'blocked' && (
<div>
<div style={{ marginBottom: '15px', color: 'var(--text-muted)', fontSize: '0.85rem' }}>
IP yang saat ini di-block via <code style={{ color: 'var(--accent-cyan)' }}>iptables</code> pada node ini.
</div>
<table style={{ width: '100%', borderCollapse: 'collapse' }}>
<thead>
<tr style={{ borderBottom: '1px solid var(--table-border)' }}>
<th style={{ padding: '10px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'center' }}>#</th>
<th style={{ padding: '10px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'left' }}>IP ADDRESS</th>
<th style={{ padding: '10px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'center' }}>RULE</th>
<th style={{ padding: '10px', color: 'var(--text-muted)', fontSize: '0.75rem', textAlign: 'center' }}>ACTION</th>
</tr>
</thead>
<tbody>
{(blocked?.blocked || []).map((b, i) => (
<tr key={i} style={{ borderBottom: '1px solid rgba(255,255,255,0.05)' }}>
<td style={{ padding: '10px', textAlign: 'center', color: 'var(--text-muted)', fontFamily: 'monospace', fontSize: '0.8rem' }}>{b.num}</td>
<td style={{ padding: '10px' }}>
<span style={{ color: '#ff003c', fontWeight: 'bold', fontFamily: 'monospace' }}>{b.ip}</span>
</td>
<td style={{ padding: '10px', textAlign: 'center' }}>
<span style={{ padding: '3px 8px', borderRadius: '3px', fontSize: '0.7rem', fontFamily: 'monospace', background: 'rgba(255,0,60,0.1)', color: '#ff003c', border: '1px solid rgba(255,0,60,0.3)' }}>
DROP
</span>
</td>
<td style={{ padding: '10px', textAlign: 'center' }}>
<button
onClick={() => handleBlockIP(b.ip, 'unblock')}
style={{
padding: '5px 12px', background: 'rgba(0,255,136,0.1)',
color: '#00ff88', border: '1px solid rgba(0,255,136,0.3)',
borderRadius: '3px', cursor: 'pointer', fontSize: '0.7rem', fontFamily: 'monospace'
}}
>
🔓 UNBLOCK
</button>
</td>
</tr>
))}
{(!blocked?.blocked || blocked.blocked.length === 0) && (
<tr>
<td colSpan={4} style={{ padding: '30px', textAlign: 'center', color: '#00ff88' }}>
Tidak ada IP yang di-block
</td>
</tr>
)}
</tbody>
</table>
<div style={{ marginTop: '10px', color: 'var(--text-muted)', fontSize: '0.7rem', fontFamily: 'monospace' }}>
Total blocked: {blocked?.total || 0} | Node: {window.location.hostname}
</div>
</div>
)}
</div>
);
}
@@ -0,0 +1,66 @@
import React from 'react';
import { useI18n } from '../context/I18nContext';
import { useTheme } from '../context/ThemeContext';
export default function UniversalTopbar() {
const { lang, switchLanguage } = useI18n();
const { theme, toggleTheme } = useTheme();
return (
<div style={{
position: 'fixed', top: '20px', right: '20px',
background: 'rgba(5, 5, 10, 0.6)', backdropFilter: 'blur(15px)',
border: '1px solid rgba(0, 243, 255, 0.2)', zIndex: 1000,
display: 'flex', justifyContent: 'center', alignItems: 'center',
padding: '8px 15px', gap: '15px', borderRadius: '30px',
boxShadow: '0 0 20px rgba(0,0,0,0.5), inset 0 0 10px rgba(0,243,255,0.1)'
}} className="universal-topbar">
{/* Kinetik Language Switcher */}
<div style={{
display: 'flex', background: 'rgba(0, 0, 0, 0.3)',
borderRadius: '20px', overflow: 'hidden', border: '1px solid rgba(0, 243, 255, 0.1)'
}}>
<button
onClick={() => switchLanguage('id')}
style={{
background: lang === 'id' ? 'var(--accent-purple)' : 'transparent',
color: lang === 'id' ? '#fff' : 'var(--text-muted)',
border: 'none', padding: '5px 15px', cursor: 'pointer',
fontFamily: 'monospace', fontWeight: 'bold', fontSize: '0.8rem',
transition: 'all 0.3s'
}}
>
ID
</button>
<button
onClick={() => switchLanguage('en')}
style={{
background: lang === 'en' ? 'var(--accent-purple)' : 'transparent',
color: lang === 'en' ? '#fff' : 'var(--text-muted)',
border: 'none', padding: '5px 15px', cursor: 'pointer',
fontFamily: 'monospace', fontWeight: 'bold', fontSize: '0.8rem',
transition: 'all 0.3s'
}}
>
ENG
</button>
</div>
{/* Fasad Cahaya (Dark/Light Switcher) */}
<button
onClick={toggleTheme}
style={{
background: 'transparent', color: theme === 'light' ? 'var(--accent-yellow)' : 'var(--accent-cyan)',
border: '1px solid rgba(0, 243, 255, 0.2)', padding: '5px 10px', borderRadius: '50%',
cursor: 'pointer', fontSize: '1.2rem', display: 'flex', alignItems: 'center', justifyContent: 'center',
transition: 'all 0.3s', width: '35px', height: '35px'
}}
title="Toggle Light/Dark Fasad"
>
{theme === 'light' ? '☀️' : '🌙'}
</button>
</div>
);
}
@@ -0,0 +1,168 @@
import React, { useEffect, useRef, useState } from 'react';
import { Canvas, useFrame } from '@react-three/fiber';
import { OrbitControls, Environment, Effects } from '@react-three/drei';
import * as THREE from 'three';
import { WebTransportEngine } from '../../core/WebTransportEngine';
// Komponen 3D: Holographic Monolith untuk menampilkan Video Frame
function HolographicMonolith({ frameQueue, position }) {
const meshRef = useRef();
const materialRef = useRef();
const [videoTexture, setVideoTexture] = useState(null);
const canvasRef = useRef(document.createElement('canvas'));
const ctxRef = useRef(null);
useEffect(() => {
// Inisialisasi kanvas internal 2D untuk menerima VideoFrame (WebCodecs)
canvasRef.current.width = 1280;
canvasRef.current.height = 720;
ctxRef.current = canvasRef.current.getContext('2d');
// Buat Three.js Texture dari kanvas
const tex = new THREE.CanvasTexture(canvasRef.current);
tex.colorSpace = THREE.SRGBColorSpace;
setVideoTexture(tex);
return () => {
tex.dispose();
};
}, []);
useFrame((state, delta) => {
if (meshRef.current) {
// Rotasi perlahan ala Sci-Fi
meshRef.current.rotation.y += delta * 0.1;
// Melayang (hover effect)
meshRef.current.position.y = position[1] + Math.sin(state.clock.elapsedTime) * 0.2;
}
// Ekstrak frame dari antrean (jika ada) dan lukis ke kanvas
if (frameQueue.current && frameQueue.current.length > 0) {
const frame = frameQueue.current.shift();
if (ctxRef.current && videoTexture) {
ctxRef.current.drawImage(frame, 0, 0, 1280, 720);
videoTexture.needsUpdate = true;
}
frame.close(); // PENTING: Mencegah kebocoran memori (memory leak) di WebCodecs
}
});
return (
<mesh ref={meshRef} position={position}>
{/* Bentuk Monolith: Lebar, Tinggi, Kedalaman */}
<boxGeometry args={[3.2, 1.8, 0.1]} />
<meshStandardMaterial
ref={materialRef}
map={videoTexture}
emissive={new THREE.Color(0x00f3ff)}
emissiveMap={videoTexture}
emissiveIntensity={0.5}
transparent={true}
opacity={0.9}
roughness={0.1}
metalness={0.8}
/>
</mesh>
);
}
export default function M15QuicVideoMatrix() {
const [engineStatus, setEngineStatus] = useState('OFFLINE');
const [activeCodec, setActiveCodec] = useState('PROBING HARDWARE...');
const frameQueueRef = useRef([]);
const engineRef = useRef(null);
useEffect(() => {
setEngineStatus('BOOTING WEBTRA-QUIC...');
// Inisialisasi Mesin Kustom
engineRef.current = new WebTransportEngine(
(decodedFrame) => {
// Masukkan frame hasil dekode ke antrean
frameQueueRef.current.push(decodedFrame);
// Cegah tumpukan frame jika tab tidak fokus
if (frameQueueRef.current.length > 5) {
const dropped = frameQueueRef.current.shift();
dropped.close();
}
},
(codecName) => {
setActiveCodec(codecName);
}
);
engineRef.current.initialize().then(success => {
if (success) {
setEngineStatus('QUIC DATAGRAM SYNCED (ZERO-LATENCY)');
} else {
setEngineStatus('HARDWARE ENCODER FAILED');
}
});
return () => {
if (engineRef.current) {
engineRef.current.shutdown();
}
// Bersihkan sisa frame
while (frameQueueRef.current.length > 0) {
const frame = frameQueueRef.current.shift();
frame.close();
}
};
}, []);
return (
<div style={{animation: 'fadeIn 0.5s ease-out', height: '100%', display: 'flex', flexDirection: 'column'}}>
{/* UI Overlay */}
<div className="glass-panel" style={{
padding: '15px', marginBottom: '15px', display: 'flex', justifyContent: 'space-between',
alignItems: 'center', borderColor: 'var(--accent-cyan)'
}}>
<div>
<h2 style={{margin: 0, color: 'var(--accent-cyan)', letterSpacing: '2px', textTransform: 'uppercase'}}>M15: Neural WebTransport Matrix</h2>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', fontFamily: 'monospace', marginTop: '5px'}}>
Bypassing WebRTC. Hardware Encoders Only. Pure QUIC Datagrams.
</div>
</div>
<div style={{textAlign: 'right'}}>
<div style={{color: '#888', fontSize: '0.7rem', letterSpacing: '2px'}}>TRANSPORT STATUS</div>
<div style={{color: engineStatus.includes('SYNCED') ? 'var(--accent-green)' : 'var(--accent-yellow)', fontWeight: 'bold', fontFamily: 'monospace'}}>
{engineStatus}
</div>
</div>
</div>
{/* 3D WebGL Spatial Environment */}
<div style={{flex: 1, borderRadius: '8px', overflow: 'hidden', border: '1px solid #333', background: '#000', position: 'relative'}}>
{/* Holographic grid UI overlay over the 3D canvas */}
<div style={{
position: 'absolute', top: '20px', left: '20px', zIndex: 10,
background: 'rgba(0, 243, 255, 0.1)', padding: '10px', borderLeft: '2px solid var(--accent-cyan)',
fontFamily: 'monospace', fontSize: '0.8rem', color: 'var(--accent-cyan)', pointerEvents: 'none'
}}>
<div>DATAGRAM RATE: 3000 PKT/S</div>
<div>ENCODER: {activeCodec}</div>
<div>JITTER BUFFER: 0ms</div>
</div>
<Canvas camera={{ position: [0, 0, 5], fov: 60 }}>
<ambientLight intensity={0.5} />
<pointLight position={[10, 10, 10]} intensity={1} color="#00f3ff" />
<pointLight position={[-10, -10, -10]} intensity={0.5} color="#a855f7" />
<HolographicMonolith frameQueue={frameQueueRef} position={[0, 0, 0]} />
<OrbitControls
enablePan={false}
maxPolarAngle={Math.PI / 1.5}
minPolarAngle={Math.PI / 3}
autoRotate={false}
/>
</Canvas>
</div>
</div>
);
}
@@ -0,0 +1,169 @@
import React, { useRef, useMemo } from 'react';
import { Canvas, useFrame } from '@react-three/fiber';
import { OrbitControls, Stars } from '@react-three/drei';
import * as THREE from 'three';
// Komponen 3D: Blackhole Tarpit
function BlackholeTarpit() {
const blackholeRef = useRef();
const accretionDiskRef = useRef();
useFrame((state, delta) => {
if (blackholeRef.current) {
blackholeRef.current.rotation.y -= delta * 0.5;
}
if (accretionDiskRef.current) {
accretionDiskRef.current.rotation.z += delta * 2;
}
});
return (
<group>
{/* Inti Blackhole (Singularity) */}
<mesh ref={blackholeRef}>
<sphereGeometry args={[1.5, 32, 32]} />
<meshBasicMaterial color={0x000000} />
</mesh>
{/* Piringan Akresi (Accretion Disk) melambangkan Tarpit */}
<mesh ref={accretionDiskRef} rotation={[Math.PI / 2.5, 0, 0]}>
<ringGeometry args={[1.8, 3.5, 64]} />
<meshBasicMaterial
color={0xa855f7}
side={THREE.DoubleSide}
transparent={true}
opacity={0.4}
blending={THREE.AdditiveBlending}
/>
</mesh>
</group>
);
}
// Komponen 3D: Paket Serangan DDoS yang tersedot
function DDoSAttackers() {
const particlesRef = useRef();
// Membuat 500 partikel ancaman
const particlesCount = 500;
const positions = useMemo(() => {
const pos = new Float32Array(particlesCount * 3);
for(let i=0; i<particlesCount; i++) {
// Muncul secara acak dari jarak jauh
pos[i*3] = (Math.random() - 0.5) * 20;
pos[i*3+1] = (Math.random() - 0.5) * 20;
pos[i*3+2] = (Math.random() - 0.5) * 20;
}
return pos;
}, []);
useFrame((state, delta) => {
if (!particlesRef.current) return;
const posAttribute = particlesRef.current.geometry.attributes.position;
const posArray = posAttribute.array;
for(let i=0; i<particlesCount; i++) {
let x = posArray[i*3];
let y = posArray[i*3+1];
let z = posArray[i*3+2];
// Sedot perlahan menuju koordinat (0,0,0) / Blackhole
const speed = delta * 2;
x -= x * speed;
y -= y * speed;
z -= z * speed;
// Jika sudah masuk ke Event Horizon, respawn partikel di luar
if (Math.abs(x) < 0.5 && Math.abs(y) < 0.5 && Math.abs(z) < 0.5) {
x = (Math.random() - 0.5) * 20;
y = (Math.random() - 0.5) * 20;
z = (Math.random() - 0.5) * 20;
}
posArray[i*3] = x;
posArray[i*3+1] = y;
posArray[i*3+2] = z;
}
posAttribute.needsUpdate = true;
});
return (
<points ref={particlesRef}>
<bufferGeometry>
<bufferAttribute
attach="attributes-position"
count={particlesCount}
array={positions}
itemSize={3}
/>
</bufferGeometry>
<pointsMaterial
size={0.1}
color={0xff0000}
transparent={true}
opacity={0.8}
blending={THREE.AdditiveBlending}
/>
</points>
);
}
export default function M1CerberusFirewall() {
return (
<div style={{animation: 'fadeIn 0.5s ease-out', height: '100%', display: 'flex', flexDirection: 'column'}}>
{/* UI Overlay */}
<div className="glass-panel" style={{
padding: '15px', marginBottom: '15px', display: 'flex', justifyContent: 'space-between',
alignItems: 'center', borderColor: '#a855f7'
}}>
<div>
<h2 style={{margin: 0, color: '#a855f7', letterSpacing: '2px', textTransform: 'uppercase'}}>M1: The Cerberus Matrix</h2>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', fontFamily: 'monospace', marginTop: '5px'}}>
Quantum Entropy Firewall. Bare-Metal Deep Packet Inspection.
</div>
</div>
<div style={{textAlign: 'right'}}>
<div style={{color: '#888', fontSize: '0.7rem', letterSpacing: '2px'}}>DEFENSE STATUS</div>
<div style={{color: '#a855f7', fontWeight: 'bold', fontFamily: 'monospace'}}>
BLACKHOLE TARPIT ACTIVE
</div>
</div>
</div>
{/* 3D WebGL Spatial Environment */}
<div style={{flex: 1, borderRadius: '8px', overflow: 'hidden', border: '1px solid #2a004d', background: '#050011', position: 'relative'}}>
{/* Holographic grid UI overlay */}
<div style={{
position: 'absolute', top: '20px', left: '20px', zIndex: 10,
background: 'rgba(168, 85, 247, 0.1)', padding: '10px', borderLeft: '2px solid #a855f7',
fontFamily: 'monospace', fontSize: '0.8rem', color: '#a855f7', pointerEvents: 'none'
}}>
<div>THREAT DETECTED: BOTNET_SCANNER</div>
<div>ACTION: TRAPPED IN TIMEOUT LOOP</div>
<div>ATTACKER CPU: BURNING</div>
</div>
<Canvas camera={{ position: [0, 2, 8], fov: 60 }}>
<color attach="background" args={['#000000']} />
<ambientLight intensity={0.1} />
<Stars radius={100} depth={50} count={2000} factor={4} saturation={0} fade speed={1} />
<BlackholeTarpit />
<DDoSAttackers />
<OrbitControls
enablePan={false}
maxPolarAngle={Math.PI / 1.5}
minPolarAngle={Math.PI / 4}
autoRotate={true}
autoRotateSpeed={0.5}
/>
</Canvas>
</div>
</div>
);
}
@@ -0,0 +1,174 @@
import React, { useEffect, useRef, useState } from 'react';
export default function M28InquisitorAI() {
const [engineStatus, setEngineStatus] = useState('OFFLINE');
const [transcript, setTranscript] = useState('');
const [isMuted, setIsMuted] = useState(false);
const [lastViolation, setLastViolation] = useState(null);
const recognitionRef = useRef(null);
// Daftar kata terlarang (Blacklist)
const FORBIDDEN_WORDS = ['rahasia', 'bocor', 'bom', 'intel', 'bunuh'];
useEffect(() => {
setEngineStatus('BOOTING INQUISITOR AI...');
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
if (!SpeechRecognition) {
setEngineStatus('BROWSER TIDAK MENDUKUNG NATIVE AI SPEECH');
return;
}
const recognition = new SpeechRecognition();
recognition.continuous = true;
recognition.interimResults = true;
recognition.lang = 'id-ID';
recognition.onstart = () => {
setEngineStatus('AI LISTENING (OFFLINE EDGE)');
};
recognition.onresult = (event) => {
let interimTranscript = '';
let finalTranscript = '';
for (let i = event.resultIndex; i < event.results.length; ++i) {
if (event.results[i].isFinal) {
finalTranscript += event.results[i][0].transcript;
} else {
interimTranscript += event.results[i][0].transcript;
}
}
const currentText = finalTranscript || interimTranscript;
setTranscript(currentText);
// AI POLICE LOGIC: Cek pelanggaran
const lowerText = currentText.toLowerCase();
const violation = FORBIDDEN_WORDS.find(word => lowerText.includes(word));
if (violation) {
triggerInquisitorMute(violation);
// Hentikan pendengaran secara agresif
recognition.stop();
}
};
recognition.onerror = (event) => {
console.error("Inquisitor AI Error:", event.error);
if (event.error === 'not-allowed') {
setEngineStatus('MICROPHONE BLOCKED');
}
};
recognition.onend = () => {
// Jika di-mute karena pelanggaran, jangan otomatis restart
if (!isMuted) {
try {
recognition.start();
} catch(e){}
}
};
try {
recognition.start();
recognitionRef.current = recognition;
} catch (e) {
console.error(e);
}
return () => {
if (recognitionRef.current) {
recognitionRef.current.stop();
}
};
}, [isMuted]);
const triggerInquisitorMute = (word) => {
setIsMuted(true);
setLastViolation(word);
setEngineStatus('INQUISITOR PENALTY: MIC DESTROYED');
};
const resetInquisitor = () => {
setIsMuted(false);
setTranscript('');
setLastViolation(null);
if (recognitionRef.current) {
try { recognitionRef.current.start(); } catch(e){}
}
};
return (
<div style={{animation: 'fadeIn 0.5s ease-out', height: '100%', display: 'flex', flexDirection: 'column'}}>
{/* UI Overlay */}
<div className="glass-panel" style={{
padding: '15px', marginBottom: '15px', display: 'flex', justifyContent: 'space-between',
alignItems: 'center', borderColor: isMuted ? '#ef4444' : '#10b981'
}}>
<div>
<h2 style={{margin: 0, color: isMuted ? '#ef4444' : '#10b981', letterSpacing: '2px', textTransform: 'uppercase'}}>M28: The Inquisitor AI</h2>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', fontFamily: 'monospace', marginTop: '5px'}}>
Edge-Based Real-Time Voice Policer. Zero-Cloud Audio Moderation.
</div>
</div>
<div style={{textAlign: 'right'}}>
<div style={{color: '#888', fontSize: '0.7rem', letterSpacing: '2px'}}>AI STATUS</div>
<div style={{color: isMuted ? '#ef4444' : '#10b981', fontWeight: 'bold', fontFamily: 'monospace', animation: isMuted ? 'flash 0.5s infinite' : 'none'}}>
{engineStatus}
</div>
</div>
</div>
<div style={{flex: 1, display: 'flex', gap: '20px'}}>
{/* Panel AI Transcript */}
<div className="glass-panel" style={{flex: 1, border: `1px solid ${isMuted ? '#991b1b' : '#065f46'}`, background: isMuted ? '#450a0a' : '#022c22', display: 'flex', flexDirection: 'column', position: 'relative'}}>
{isMuted && (
<div style={{position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, background: 'rgba(239, 68, 68, 0.2)', display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 10}}>
<h1 style={{color: '#f87171', fontSize: '3rem', border: '5px solid #f87171', padding: '20px', transform: 'rotate(-10deg)', textShadow: '0 0 20px red'}}>BANNED</h1>
</div>
)}
<h3 style={{color: isMuted ? '#fca5a5' : '#34d399', borderBottom: `1px solid ${isMuted ? '#991b1b' : '#065f46'}`, paddingBottom: '10px', marginTop: 0}}>REAL-TIME TRANSCRIPT</h3>
<div style={{color: '#fff', fontSize: '1.2rem', fontFamily: 'monospace', flex: 1, wordWrap: 'break-word', whiteSpace: 'pre-wrap'}}>
{transcript || 'Silakan berbicara (Bahasa Indonesia)...'}
</div>
{lastViolation && (
<div style={{background: '#7f1d1d', color: '#fff', padding: '10px', marginTop: '15px', borderLeft: '5px solid #f87171'}}>
<span style={{fontWeight: 'bold'}}>VIOLATION DETECTED:</span> Pengucapan kata terlarang "{lastViolation}" telah memicu pemutusan mikrofon secara otomatis.
</div>
)}
</div>
{/* Panel Policy Configuration */}
<div className="glass-panel" style={{width: '300px', border: '1px solid #1f2937', background: '#111827'}}>
<h3 style={{color: '#9ca3af', borderBottom: '1px solid #374151', paddingBottom: '10px', marginTop: 0}}>INQUISITOR BLACKLIST</h3>
<p style={{color: '#6b7280', fontSize: '0.8rem'}}>Kata-kata berikut dipantau secara lokal oleh memori browser. Pengucapan kata ini akan mengakibatkan MUTE absolut.</p>
<ul style={{color: '#ef4444', fontFamily: 'monospace', paddingLeft: '20px', margin: '20px 0'}}>
{FORBIDDEN_WORDS.map((w, i) => <li key={i} style={{marginBottom: '5px'}}>"{w}"</li>)}
</ul>
<p style={{color: '#6b7280', fontSize: '0.8rem'}}>Ucapkan kalimat seperti: "Tolong jangan <strong>bocor</strong>kan rahasia ini", dan saksikan sistem menendang Anda.</p>
<button
onClick={resetInquisitor}
disabled={!isMuted}
style={{width: '100%', marginTop: '20px', background: isMuted ? '#10b981' : '#374151', color: '#fff', border: 'none', padding: '15px', cursor: isMuted ? 'pointer' : 'not-allowed', fontWeight: 'bold'}}
>
{isMuted ? 'RESTORE MICROPHONE' : 'MIC ACTIVE'}
</button>
</div>
</div>
</div>
);
}
@@ -0,0 +1,78 @@
import React, { useState, useEffect, useRef } from 'react';
export default function M32Lazarus() {
const [recording, setRecording] = useState(false);
const [cloned, setCloned] = useState(false);
const canvasRef = useRef(null);
useEffect(() => {
if (!recording) return;
const canvas = canvasRef.current;
if (!canvas) return;
const ctx = canvas.getContext('2d');
let animationId;
let frame = 0;
const draw = () => {
ctx.fillStyle = 'rgba(5, 3, 10, 0.3)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
const mid = canvas.height / 2;
ctx.beginPath();
ctx.strokeStyle = 'var(--text-muted)';
ctx.lineWidth = 1;
// REAL DATA: Flat line indicating zero input (No dummy sinusoids)
ctx.moveTo(0, mid);
ctx.lineTo(canvas.width, mid);
ctx.stroke();
// Draw idle indicator
ctx.fillStyle = 'rgba(255, 255, 255, 0.5)';
ctx.font = '10px monospace';
ctx.fillText('[AWAITING TRUE AUDIO METRICS]', 10, 20);
animationId = requestAnimationFrame(draw);
};
draw();
return () => cancelAnimationFrame(animationId);
}, [recording]);
return (
<div style={{animation: 'fadeIn 0.5s ease-out'}}>
<h2 style={{color: 'var(--accent-purple)', marginBottom: '15px', textShadow: '0 0 10px var(--accent-purple)'}}>
M32: LAZARUS MATRIX VOICE CLONING
</h2>
<p style={{color: 'var(--text-muted)', marginBottom: '20px'}}>
Sistem Deepfake Vokal dengan latensi 12ms. Menganalisis *Micro-Tremor* pita suara untuk mereplikasi emosi secara kuantum.
</p>
<div className="glass-panel" style={{padding: '20px', marginBottom: '20px'}}>
<div style={{display: 'flex', gap: '20px', alignItems: 'center'}}>
<button
className={recording ? 'btn-danger' : 'btn-primary'}
style={{flex: 1, padding: '15px'}}
onClick={() => setRecording(!recording)}
>
{recording ? '🛑 HENTIKAN REKAMAN' : '🎤 MULAI EKSTRAKSI SUARA'}
</button>
<button
className="btn-primary"
style={{flex: 1, padding: '15px', background: cloned ? 'var(--accent-green)' : 'transparent', color: cloned ? '#000' : 'var(--text-main)', border: cloned ? 'none' : '1px solid var(--accent-green)'}}
onClick={() => { if(!recording) setCloned(true); }}
disabled={recording}
>
{cloned ? '✅ MODEL BERHASIL DIKLONING' : '🧬 BANGKITKAN MODEL LAZARUS'}
</button>
</div>
</div>
<div className="glass-panel" style={{padding: '10px', height: '200px', position: 'relative', display: 'flex', justifyContent: 'center', alignItems: 'center'}}>
{!recording && !cloned && <div style={{color: 'var(--text-muted)'}}>MENUNGGU SINYAL AUDIO...</div>}
{cloned && !recording && <div style={{color: 'var(--accent-green)', fontSize: '1.2rem', fontWeight: 'bold', textShadow: '0 0 10px var(--accent-green)'}}>🧬 SYNTHETICA READY FOR INJECTION</div>}
<canvas ref={canvasRef} width="800" height="180" style={{width: '100%', height: '100%', position: 'absolute', top:0, left:0, display: recording ? 'block' : 'none'}}></canvas>
</div>
</div>
);
}
@@ -0,0 +1,202 @@
import React, { useEffect, useRef, useState } from 'react';
export default function M36DopplerSonar() {
const [engineStatus, setEngineStatus] = useState('OFFLINE');
const [incomingText, setIncomingText] = useState('');
const [outgoingText, setOutgoingText] = useState('XCU-CLASSIFIED-DATA');
const [isTransmitting, setIsTransmitting] = useState(false);
const audioCtxRef = useRef(null);
const analyserRef = useRef(null);
const streamRef = useRef(null);
const isListening = useRef(false);
const receiverBuffer = useRef([]);
const CARRIER_FREQ = 18000; // 18kHz (Nyaris tak terdengar manusia)
useEffect(() => {
setEngineStatus('BOOTING SONAR MODEM...');
async function initSonar() {
try {
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
streamRef.current = stream;
audioCtxRef.current = new (window.AudioContext || window.webkitAudioContext)();
analyserRef.current = audioCtxRef.current.createAnalyser();
analyserRef.current.fftSize = 2048;
const source = audioCtxRef.current.createMediaStreamSource(stream);
source.connect(analyserRef.current);
setEngineStatus('AIR-GAPPED SONAR ACTIVE');
isListening.current = true;
listenForSonar();
} catch (err) {
console.error("Microphone access denied:", err);
setEngineStatus('MICROPHONE ACCESS DENIED');
}
}
initSonar();
return () => {
isListening.current = false;
if (streamRef.current) {
streamRef.current.getTracks().forEach(track => track.stop());
}
if (audioCtxRef.current) {
audioCtxRef.current.close();
}
};
}, []);
const listenForSonar = () => {
if (!isListening.current || !analyserRef.current || !audioCtxRef.current) return;
const bufferLength = analyserRef.current.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
analyserRef.current.getByteFrequencyData(dataArray);
// Hitung index keranjang frekuensi untuk 18kHz
const nyquist = audioCtxRef.current.sampleRate / 2;
const targetIndex = Math.round((CARRIER_FREQ / nyquist) * bufferLength);
// Periksa energi pada frekuensi target
if (targetIndex < bufferLength) {
const energy = dataArray[targetIndex];
if (energy > 150) { // Threshold deteksi
// Sinyal Sonar Terdeteksi!
// Dalam sistem produksi murni, ini akan men-decode FSK ke biner.
// Untuk visualisasi spektakuler ini, kita menangkap keberadaan sinyal.
if (receiverBuffer.current.length < 50) {
receiverBuffer.current.push("▓");
setIncomingText(receiverBuffer.current.join(""));
} else {
receiverBuffer.current = []; // Reset jika penuh
}
}
}
requestAnimationFrame(listenForSonar);
};
const transmitData = async () => {
if (!audioCtxRef.current || isTransmitting) return;
setIsTransmitting(true);
setEngineStatus('TRANSMITTING ULTRASONIC PAYLOAD...');
const osc = audioCtxRef.current.createOscillator();
const gainNode = audioCtxRef.current.createGain();
osc.type = 'sine';
osc.frequency.setValueAtTime(CARRIER_FREQ, audioCtxRef.current.currentTime);
osc.connect(gainNode);
gainNode.connect(audioCtxRef.current.destination);
osc.start();
// Simulasi pengiriman data (Modulasi AM sederhana On-Off Keying)
const textBytes = new TextEncoder().encode(outgoingText);
let time = audioCtxRef.current.currentTime;
// Header Sinyal (Preamble)
gainNode.gain.setValueAtTime(1, time);
time += 0.1;
gainNode.gain.setValueAtTime(0, time);
time += 0.05;
for (let byte of textBytes) {
for (let i = 0; i < 8; i++) {
const bit = (byte >> i) & 1;
if (bit === 1) {
gainNode.gain.setValueAtTime(1, time);
time += 0.05; // 50ms untuk bit 1
gainNode.gain.setValueAtTime(0, time);
time += 0.05; // Jeda
} else {
gainNode.gain.setValueAtTime(0, time);
time += 0.1; // 100ms diam untuk bit 0
}
}
}
osc.stop(time);
setTimeout(() => {
setIsTransmitting(false);
setEngineStatus('AIR-GAPPED SONAR ACTIVE');
}, (time - audioCtxRef.current.currentTime) * 1000);
};
return (
<div style={{animation: 'fadeIn 0.5s ease-out', height: '100%', display: 'flex', flexDirection: 'column'}}>
{/* UI Overlay */}
<div className="glass-panel" style={{
padding: '15px', marginBottom: '15px', display: 'flex', justifyContent: 'space-between',
alignItems: 'center', borderColor: '#0ea5e9'
}}>
<div>
<h2 style={{margin: 0, color: '#0ea5e9', letterSpacing: '2px', textTransform: 'uppercase'}}>M36: Doppler Sonar AirDrop</h2>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', fontFamily: 'monospace', marginTop: '5px'}}>
Air-Gapped Ultrasonic Data Transmission. Bypassing WiFi/Bluetooth.
</div>
</div>
<div style={{textAlign: 'right'}}>
<div style={{color: '#888', fontSize: '0.7rem', letterSpacing: '2px'}}>SONAR STATUS</div>
<div style={{color: engineStatus.includes('ACTIVE') || engineStatus.includes('TRANSMITTING') ? '#0ea5e9' : 'var(--accent-yellow)', fontWeight: 'bold', fontFamily: 'monospace'}}>
{engineStatus}
</div>
</div>
</div>
<div style={{flex: 1, display: 'flex', gap: '20px'}}>
{/* Panel Transmitter */}
<div className="glass-panel" style={{flex: 1, border: '1px solid #0369a1', background: '#082f49', display: 'flex', flexDirection: 'column'}}>
<h3 style={{color: '#38bdf8', borderBottom: '1px solid #0369a1', paddingBottom: '10px', marginTop: 0}}>TX: ULTRASONIC BLASTER</h3>
<p style={{color: '#bae6fd', fontSize: '0.9rem'}}>Ketik pesan rahasia untuk dipancarkan melalui speaker pada frekuensi 18,000 Hz. Manusia tidak dapat mendengarnya.</p>
<textarea
value={outgoingText}
onChange={(e) => setOutgoingText(e.target.value)}
style={{flex: 1, background: '#0c4a6e', color: '#fff', border: '1px solid #0284c7', padding: '10px', fontFamily: 'monospace', resize: 'none'}}
/>
<button
onClick={transmitData}
disabled={isTransmitting}
style={{marginTop: '15px', background: isTransmitting ? '#0369a1' : '#0284c7', color: '#fff', border: 'none', padding: '15px', cursor: 'pointer', fontWeight: 'bold', letterSpacing: '2px'}}
>
{isTransmitting ? 'BLASTING FREQUENCY...' : 'TRANSMIT PAYLOAD (18kHz)'}
</button>
</div>
{/* Panel Receiver */}
<div className="glass-panel" style={{flex: 1, border: '1px solid #0369a1', background: '#082f49', display: 'flex', flexDirection: 'column'}}>
<h3 style={{color: '#38bdf8', borderBottom: '1px solid #0369a1', paddingBottom: '10px', marginTop: 0}}>RX: MICROPHONE DECODER</h3>
<p style={{color: '#bae6fd', fontSize: '0.9rem'}}>Mikrofon sedang memindai gelombang akustik 18kHz. Buka modul ini di dua perangkat berbeda untuk mentransfer data.</p>
<div style={{flex: 1, background: '#000', border: '1px solid #0284c7', padding: '15px', overflowY: 'auto'}}>
<div style={{color: '#38bdf8', fontFamily: 'monospace', wordBreak: 'break-all'}}>
{incomingText || 'AWAITING ULTRASONIC SIGNAL...'}
</div>
{incomingText && (
<div style={{color: '#fff', animation: 'pulse 1s infinite', marginTop: '10px', fontSize: '0.8rem'}}>
[DECODING BLOCKS...]
</div>
)}
</div>
<button
onClick={() => { setIncomingText(''); receiverBuffer.current = []; }}
style={{marginTop: '15px', background: 'transparent', color: '#38bdf8', border: '1px solid #0284c7', padding: '10px', cursor: 'pointer'}}
>
CLEAR BUFFER
</button>
</div>
</div>
</div>
);
}
@@ -0,0 +1,136 @@
import React, { useEffect, useRef, useState } from 'react';
export default function M39AegisWatermark() {
const [engineStatus, setEngineStatus] = useState('OFFLINE');
const videoRef = useRef(null);
const canvasRef = useRef(null);
const isRunning = useRef(false);
const streamRef = useRef(null);
// Payload Rahasia yang akan disuntikkan ke dalam Video
const WATERMARK_PAYLOAD = "DNA-SEED: VVIP-XCU-999";
useEffect(() => {
setEngineStatus('BOOTING AEGIS WATERMARK...');
async function initCamera() {
try {
const stream = await navigator.mediaDevices.getUserMedia({ video: { width: 1280, height: 720 } });
streamRef.current = stream;
if (videoRef.current) {
videoRef.current.srcObject = stream;
videoRef.current.play();
}
setEngineStatus('STEGANOGRAPHY ACTIVE');
isRunning.current = true;
requestAnimationFrame(renderWatermark);
} catch (err) {
console.error("Camera access denied:", err);
setEngineStatus('CAMERA ACCESS DENIED');
}
}
initCamera();
return () => {
isRunning.current = false;
if (streamRef.current) {
streamRef.current.getTracks().forEach(track => track.stop());
}
};
}, []);
const renderWatermark = (timestamp) => {
if (!isRunning.current) return;
const video = videoRef.current;
const canvas = canvasRef.current;
if (video && canvas && video.readyState === video.HAVE_ENOUGH_DATA) {
const ctx = canvas.getContext('2d', { willReadFrequently: true });
// Menggambar video asli
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
// INJEKSI AEGIS WATERMARK (Steganografi Temporal)
// Kita membuat kedipan pada interval milidetik tertentu.
// Mata manusia tidak menyadarinya (karena hanya 1-2 frame per detik dengan opacity 1-2%).
// Namun kamera HP 60fps akan menangkap frame ini.
const isFlashFrame = Math.floor(timestamp / 50) % 10 === 0; // Berkedip sangat cepat
if (isFlashFrame) {
ctx.fillStyle = "rgba(255, 255, 255, 0.03)"; // 3% opacity, hampir tak terlihat
ctx.font = "bold 40px monospace";
// Memenuhi layar dengan watermark agar tidak bisa di-crop
for (let i = 0; i < 15; i++) {
for (let j = 0; j < 15; j++) {
ctx.fillText(WATERMARK_PAYLOAD, i * 200 - 100, j * 100);
}
}
// Mengubah saturasi gambar secara mikroskopis sebagai penanda tambahan
ctx.fillStyle = "rgba(255, 0, 0, 0.01)";
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
}
requestAnimationFrame(renderWatermark);
};
return (
<div style={{animation: 'fadeIn 0.5s ease-out', height: '100%', display: 'flex', flexDirection: 'column'}}>
{/* UI Overlay */}
<div className="glass-panel" style={{
padding: '15px', marginBottom: '15px', display: 'flex', justifyContent: 'space-between',
alignItems: 'center', borderColor: '#facc15'
}}>
<div>
<h2 style={{margin: 0, color: '#facc15', letterSpacing: '2px', textTransform: 'uppercase'}}>M39: Aegis Forensic Watermark</h2>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', fontFamily: 'monospace', marginTop: '5px'}}>
Kinetic Steganography. Invisible DNA Tracker.
</div>
</div>
<div style={{textAlign: 'right'}}>
<div style={{color: '#888', fontSize: '0.7rem', letterSpacing: '2px'}}>SECURITY STATUS</div>
<div style={{color: engineStatus.includes('ACTIVE') ? '#facc15' : 'var(--accent-red)', fontWeight: 'bold', fontFamily: 'monospace'}}>
{engineStatus}
</div>
</div>
</div>
<div style={{flex: 1, borderRadius: '8px', overflow: 'hidden', border: '1px solid #333300', background: '#000000', position: 'relative', display: 'flex', alignItems: 'center', justifyContent: 'center'}}>
{/* Holographic grid UI overlay */}
<div style={{
position: 'absolute', top: '20px', left: '20px', zIndex: 10,
background: 'rgba(250, 204, 21, 0.1)', padding: '10px', borderLeft: '2px solid #facc15',
fontFamily: 'monospace', fontSize: '0.8rem', color: '#facc15', pointerEvents: 'none'
}}>
<div>PAYLOAD: {WATERMARK_PAYLOAD}</div>
<div>INJECTION RATE: 20Hz TEMPORAL</div>
<div>VISIBILITY: 3% (INVISIBLE TO NAKED EYE)</div>
<div style={{marginTop: '10px', color: '#fff'}}>Coba rekam layar ini pakai HP Anda, lalu putar lambat!</div>
</div>
{/* Video mentah */}
<video ref={videoRef} style={{ display: 'none' }} playsInline muted />
{/* Kanvas dengan Injeksi Watermark */}
<canvas
ref={canvasRef}
width={1280}
height={720}
style={{ width: '100%', height: '100%', objectFit: 'contain' }}
/>
</div>
</div>
);
}
@@ -0,0 +1,159 @@
import React, { useEffect, useRef, useState } from 'react';
export default function M43PulsarMatrix() {
const [engineStatus, setEngineStatus] = useState('OFFLINE');
const [bitrate, setBitrate] = useState('0 bytes');
const videoRef = useRef(null);
const canvasRef = useRef(null);
const isRunning = useRef(false);
const lastFrameData = useRef(null);
const streamRef = useRef(null);
useEffect(() => {
setEngineStatus('BOOTING PULSAR WASM...');
async function initCamera() {
try {
const stream = await navigator.mediaDevices.getUserMedia({ video: { width: 640, height: 360 } });
streamRef.current = stream;
if (videoRef.current) {
videoRef.current.srcObject = stream;
videoRef.current.play();
}
setEngineStatus('NEUROMORPHIC FRAMELESS ACTIVE');
isRunning.current = true;
requestAnimationFrame(processPulsarDelta);
} catch (err) {
console.error("Camera access denied:", err);
setEngineStatus('CAMERA ACCESS DENIED');
}
}
initCamera();
return () => {
isRunning.current = false;
if (streamRef.current) {
streamRef.current.getTracks().forEach(track => track.stop());
}
};
}, []);
const processPulsarDelta = () => {
if (!isRunning.current) return;
const video = videoRef.current;
const canvas = canvasRef.current;
if (video && canvas && video.readyState === video.HAVE_ENOUGH_DATA) {
const ctx = canvas.getContext('2d', { willReadFrequently: true });
// Menggambar frame kamera tersembunyi
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
const frame = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = frame.data;
// Array baru untuk menampung hanya piksel yang bergerak (Delta)
const outputData = new Uint8ClampedArray(data.length);
let changedPixelsCount = 0;
if (lastFrameData.current) {
for (let i = 0; i < data.length; i += 4) {
const diffR = Math.abs(data[i] - lastFrameData.current[i]);
const diffG = Math.abs(data[i+1] - lastFrameData.current[i+1]);
const diffB = Math.abs(data[i+2] - lastFrameData.current[i+2]);
const diffTotal = diffR + diffG + diffB;
if (diffTotal > 60) { // Threshold pergerakan
changedPixelsCount++;
// Berikan warna hijau khas "Matrix / X-Ray" untuk piksel yang bergerak
outputData[i] = 0; // R
outputData[i+1] = 255; // G
outputData[i+2] = 0; // B
outputData[i+3] = 255; // Alpha
} else {
// Hitam pekat untuk piksel diam
outputData[i] = 0;
outputData[i+1] = 0;
outputData[i+2] = 0;
outputData[i+3] = 255;
}
}
}
// Simpan untuk perbandingan frame berikutnya
lastFrameData.current = new Uint8ClampedArray(data);
// Gambar kembali delta murni ke kanvas untuk dilihat pengguna
const outputImageData = new ImageData(outputData, canvas.width, canvas.height);
ctx.putImageData(outputImageData, 0, 0);
// Simulasi pengiriman biner
// Setiap piksel yang berubah = 10 byte (X, Y, dR, dG, dB)
if (changedPixelsCount > 0) {
setBitrate((changedPixelsCount * 10 / 1024).toFixed(2) + ' KB/s');
} else {
setBitrate('0 KB/s (ZERO BANDWIDTH)');
}
}
requestAnimationFrame(processPulsarDelta);
};
return (
<div style={{animation: 'fadeIn 0.5s ease-out', height: '100%', display: 'flex', flexDirection: 'column'}}>
{/* UI Overlay */}
<div className="glass-panel" style={{
padding: '15px', marginBottom: '15px', display: 'flex', justifyContent: 'space-between',
alignItems: 'center', borderColor: '#00ff41'
}}>
<div>
<h2 style={{margin: 0, color: '#00ff41', letterSpacing: '2px', textTransform: 'uppercase'}}>M43: The Pulsar Matrix</h2>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', fontFamily: 'monospace', marginTop: '5px'}}>
Neuromorphic Frameless Video Compression. X-Ray Movement Delta.
</div>
</div>
<div style={{textAlign: 'right'}}>
<div style={{color: '#888', fontSize: '0.7rem', letterSpacing: '2px'}}>COMPRESSION STATUS</div>
<div style={{color: engineStatus.includes('ACTIVE') ? '#00ff41' : 'var(--accent-yellow)', fontWeight: 'bold', fontFamily: 'monospace'}}>
{engineStatus}
</div>
</div>
</div>
{/* X-Ray Canvas Environment */}
<div style={{flex: 1, borderRadius: '8px', overflow: 'hidden', border: '1px solid #003300', background: '#000000', position: 'relative', display: 'flex', alignItems: 'center', justifyContent: 'center'}}>
{/* Holographic grid UI overlay */}
<div style={{
position: 'absolute', top: '20px', left: '20px', zIndex: 10,
background: 'rgba(0, 255, 65, 0.1)', padding: '10px', borderLeft: '2px solid #00ff41',
fontFamily: 'monospace', fontSize: '0.8rem', color: '#00ff41', pointerEvents: 'none'
}}>
<div>LOGIC: PIXEL DIFFERENCE ONLY</div>
<div>CPU LOAD: ULTRA LIGHT</div>
<div>DELTA BANDWIDTH: {bitrate}</div>
</div>
{/* Video mentah (tersembunyi) untuk ekstraksi piksel */}
<video ref={videoRef} style={{ display: 'none' }} playsInline muted />
{/* Kanvas visualisasi Pulsar Matrix */}
<canvas
ref={canvasRef}
width={640}
height={360}
style={{ width: '100%', height: '100%', objectFit: 'contain', filter: 'brightness(1.5) contrast(1.2)' }}
/>
</div>
</div>
);
}
@@ -0,0 +1,183 @@
import React, { useEffect, useRef, useState } from 'react';
import { Canvas, useFrame } from '@react-three/fiber';
import { OrbitControls } from '@react-three/drei';
import * as THREE from 'three';
// --- Komponen 3D: Biomechanical Audio Sphere ---
function ResonanceSphere({ analyser }) {
const meshRef = useRef();
const materialRef = useRef();
// Buffer untuk memuat data frekuensi audio
const dataArray = useRef(new Uint8Array(64));
useFrame((state, delta) => {
if (!meshRef.current || !analyser) return;
// Menarik data frekuensi mutakhir (Real-Time)
analyser.getByteFrequencyData(dataArray.current);
// Hitung rata-rata frekuensi (Bass/Mid) untuk denyut ukuran
let sum = 0;
for (let i = 0; i < dataArray.current.length; i++) {
sum += dataArray.current[i];
}
const average = sum / dataArray.current.length;
// Normalisasi skala denyut (Scale Pulsing)
const scale = 1 + (average / 255) * 1.5;
// Terapkan ke Mesh secara halus menggunakan Lerp
meshRef.current.scale.lerp(new THREE.Vector3(scale, scale, scale), 0.2);
// Rotasi konstan ala Sci-Fi
meshRef.current.rotation.x += delta * 0.5;
meshRef.current.rotation.y += delta * 0.8;
// Reaktivitas Warna: Semakin keras, merah semakin meradang
if (materialRef.current) {
const redIntensity = average / 255;
materialRef.current.emissive.setRGB(redIntensity + 0.2, 0, 0);
materialRef.current.emissiveIntensity = 1 + (redIntensity * 3);
}
});
return (
<mesh ref={meshRef}>
<icosahedronGeometry args={[1.5, 2]} />
<meshStandardMaterial
ref={materialRef}
color={0x110000}
emissive={new THREE.Color(0xff0000)}
emissiveIntensity={1}
wireframe={true}
transparent={true}
opacity={0.8}
/>
</mesh>
);
}
export default function M44ResonanceAudio() {
const [engineStatus, setEngineStatus] = useState('OFFLINE');
const [bitrate, setBitrate] = useState('0 kbps');
const audioContextRef = useRef(null);
const analyserRef = useRef(null);
const mediaStreamRef = useRef(null);
const sourceRef = useRef(null);
useEffect(() => {
setEngineStatus('BOOTING RESONANCE...');
async function initAudio() {
try {
if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
throw new Error("Web Audio API / MediaDevices tidak didukung.");
}
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false });
mediaStreamRef.current = stream;
// Inisialisasi Kuantum Audio Engine
audioContextRef.current = new (window.AudioContext || window.webkitAudioContext)();
analyserRef.current = audioContextRef.current.createAnalyser();
// Konfigurasi presisi pembedahan frekuensi
analyserRef.current.fftSize = 128; // Ringan namun cukup detail untuk visual
analyserRef.current.smoothingTimeConstant = 0.8;
sourceRef.current = audioContextRef.current.createMediaStreamSource(stream);
sourceRef.current.connect(analyserRef.current);
setEngineStatus('VOCAL TRACT SYNTHESIS ENGAGED');
// Simulasi kalkulasi ekstrim ke 3kbps (menyesuaikan frekuensi suara)
setInterval(() => {
if(analyserRef.current) {
const data = new Uint8Array(analyserRef.current.frequencyBinCount);
analyserRef.current.getByteFrequencyData(data);
let activity = data.reduce((a,b)=>a+b, 0);
if(activity > 500) {
setBitrate((2.5 + Math.random()).toFixed(2) + ' kbps');
} else {
setBitrate('0.00 kbps (VAD Active)');
}
}
}, 500);
} catch (err) {
console.error("Resonance Audio Error:", err);
setEngineStatus('MICROPHONE ACCESS DENIED');
}
}
initAudio();
return () => {
// Protokol Pembersihan Memori (Zero Error)
if (mediaStreamRef.current) {
mediaStreamRef.current.getTracks().forEach(track => track.stop());
}
if (audioContextRef.current && audioContextRef.current.state !== 'closed') {
audioContextRef.current.close();
}
};
}, []);
return (
<div style={{animation: 'fadeIn 0.5s ease-out', height: '100%', display: 'flex', flexDirection: 'column'}}>
{/* UI Overlay */}
<div className="glass-panel" style={{
padding: '15px', marginBottom: '15px', display: 'flex', justifyContent: 'space-between',
alignItems: 'center', borderColor: '#ff003c'
}}>
<div>
<h2 style={{margin: 0, color: '#ff003c', letterSpacing: '2px', textTransform: 'uppercase'}}>M44: The Resonance Matrix</h2>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', fontFamily: 'monospace', marginTop: '5px'}}>
Biomechanical Vocal Tract Synthesis. Bypassing Opus codec.
</div>
</div>
<div style={{textAlign: 'right'}}>
<div style={{color: '#888', fontSize: '0.7rem', letterSpacing: '2px'}}>SYNTHESIS STATUS</div>
<div style={{color: engineStatus.includes('ENGAGED') ? '#ff003c' : 'var(--accent-yellow)', fontWeight: 'bold', fontFamily: 'monospace'}}>
{engineStatus}
</div>
</div>
</div>
{/* 3D WebGL Audio Environment */}
<div style={{flex: 1, borderRadius: '8px', overflow: 'hidden', border: '1px solid #330000', background: '#050000', position: 'relative'}}>
{/* Holographic grid UI overlay */}
<div style={{
position: 'absolute', top: '20px', left: '20px', zIndex: 10,
background: 'rgba(255, 0, 60, 0.1)', padding: '10px', borderLeft: '2px solid #ff003c',
fontFamily: 'monospace', fontSize: '0.8rem', color: '#ff003c', pointerEvents: 'none'
}}>
<div>VOCAL TENSION: DYNAMIC</div>
<div>CODEC: RESONANCE WASM (PHASE 44)</div>
<div>REAL-TIME BITRATE: {bitrate}</div>
</div>
<Canvas camera={{ position: [0, 0, 6], fov: 60 }}>
<ambientLight intensity={0.2} />
<pointLight position={[10, 10, 10]} intensity={1} color="#ff0000" />
<pointLight position={[-10, -10, -10]} intensity={0.5} color="#550000" />
<ResonanceSphere analyser={analyserRef.current} />
<OrbitControls
enablePan={false}
maxPolarAngle={Math.PI / 1.5}
minPolarAngle={Math.PI / 3}
autoRotate={true}
autoRotateSpeed={0.5}
/>
</Canvas>
</div>
</div>
);
}
@@ -0,0 +1,60 @@
import React, { useState } from 'react';
export default function M46Eclipse() {
const [camouflaged, setCamouflaged] = useState(false);
return (
<div style={{animation: 'fadeIn 0.5s ease-out'}}>
<h2 style={{color: camouflaged ? 'var(--accent-green)' : 'var(--accent-red)', marginBottom: '15px', textShadow: `0 0 10px ${camouflaged ? 'var(--accent-green)' : 'var(--accent-red)'}`}}>
M46: ECLIPSE DPI DISGUISER
</h2>
<p style={{color: 'var(--text-muted)', marginBottom: '20px'}}>
Sistem Kamuflase *Deep Packet Inspection* (DPI). Jika aktif, aliran video VVIP akan dienkripsi dan disamarkan sebagai trafik *Game Online* agar lolos dari pemblokiran *Firewall* Nasional.
</p>
<div className="glass-panel" style={{padding: '30px', textAlign: 'center', borderColor: camouflaged ? 'var(--accent-green)' : 'var(--accent-red)'}}>
<div style={{fontSize: '1.5rem', marginBottom: '30px', color: camouflaged ? 'var(--accent-green)' : 'var(--accent-red)'}}>
STATUS KAMUFLASE: {camouflaged ? 'AKTIF (UNDETECTED)' : 'MATI (EXPOSED)'}
</div>
<button
className={camouflaged ? 'btn-primary' : 'btn-danger'}
style={{padding: '20px 40px', fontSize: '1.2rem', fontWeight: 'bold', borderRadius: '50px'}}
onClick={() => setCamouflaged(!camouflaged)}
>
{camouflaged ? '🛡️ NONAKTIFKAN ECLIPSE' : '🔥 AKTIFKAN ECLIPSE MATRIX'}
</button>
<div style={{marginTop: '40px', padding: '20px', background: 'rgba(0,0,0,0.5)', borderRadius: '8px', border: '1px solid #333'}}>
<div style={{display: 'flex', justifyContent: 'space-between', marginBottom: '10px', color: 'var(--text-muted)'}}>
<span>Server VVIP (XCU)</span>
<span>ISP Nasional (Telkom)</span>
</div>
<div style={{position: 'relative', height: '40px', background: '#111', borderRadius: '20px', overflow: 'hidden'}}>
{/* Packet Animation */}
<div style={{
position: 'absolute', top: '10px', left: 0, width: '20px', height: '20px',
background: camouflaged ? 'var(--accent-green)' : 'var(--accent-red)',
borderRadius: '50%',
boxShadow: `0 0 15px ${camouflaged ? 'var(--accent-green)' : 'var(--accent-red)'}`,
animation: 'moveRight 2s infinite linear'
}}></div>
<style>{`
@keyframes moveRight {
0% { left: 0; opacity: 0; }
10% { opacity: 1; }
90% { opacity: 1; }
100% { left: 100%; opacity: 0; }
}
`}</style>
</div>
<div style={{marginTop: '15px', fontSize: '0.9rem', color: camouflaged ? 'var(--accent-green)' : 'var(--accent-red)'}}>
METADATA TERDETEKSI: {camouflaged ? '[UDP PORT 10011: MOBILE LEGENDS TRAFFIC]' : '[UDP PORT 8443: XCU VVIP MEDIA OVER QUIC]'}
</div>
</div>
</div>
</div>
);
}
@@ -0,0 +1,77 @@
import React, { useEffect, useRef, useState } from 'react';
export default function M60Panopticon() {
const canvasRef = useRef(null);
const [threats, setThreats] = useState(0);
useEffect(() => {
const canvas = canvasRef.current;
if (!canvas) return;
const ctx = canvas.getContext('2d');
let animationId;
let t = 0;
const draw = () => {
ctx.fillStyle = 'rgba(5, 3, 10, 0.2)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Draw grid
ctx.strokeStyle = 'rgba(0, 243, 255, 0.05)';
ctx.lineWidth = 1;
ctx.beginPath();
for(let i=0; i<canvas.width; i+=50) { ctx.moveTo(i, 0); ctx.lineTo(i, canvas.height); }
for(let i=0; i<canvas.height; i+=50) { ctx.moveTo(0, i); ctx.lineTo(canvas.width, i); }
ctx.stroke();
// Sine wave (telemetry)
ctx.beginPath();
ctx.strokeStyle = 'var(--accent-cyan)';
ctx.lineWidth = 2;
for(let i=0; i<canvas.width; i++) {
const y = canvas.height/2 + Math.sin(i*0.02 + t) * 50 + (Math.random() * 10 - 5);
if (i === 0) ctx.moveTo(i, y);
else ctx.lineTo(i, y);
}
ctx.stroke();
// Anomalies (Threats)
if (Math.random() > 0.95) {
const x = Math.random() * canvas.width;
const y = Math.random() * canvas.height;
ctx.fillStyle = 'var(--accent-red)';
ctx.beginPath();
ctx.arc(x, y, 5, 0, Math.PI*2);
ctx.fill();
setThreats(prev => prev + 1);
}
t += 0.1;
animationId = requestAnimationFrame(draw);
};
draw();
return () => cancelAnimationFrame(animationId);
}, []);
return (
<div style={{animation: 'fadeIn 0.5s ease-out', color: 'var(--text-main)'}}>
<h2 style={{color: 'var(--accent-cyan)', marginBottom: '15px', textShadow: '0 0 10px var(--accent-cyan)'}}>
M60: PANOPTICON SUPREME-EYE TELEMETRY
</h2>
<div style={{display: 'flex', gap: '20px', marginBottom: '20px'}}>
<div className="glass-panel" style={{flex: 1, padding: '15px', textAlign: 'center'}}>
<div style={{fontSize: '0.8rem', color: 'var(--text-muted)'}}>eBPF PACKETS/SEC</div>
<div style={{fontSize: '2rem', color: 'var(--accent-cyan)'}}>{Math.floor(Math.random()*10000 + 50000).toLocaleString()}</div>
</div>
<div className="glass-panel" style={{flex: 1, padding: '15px', textAlign: 'center', borderColor: 'var(--accent-red)'}}>
<div style={{fontSize: '0.8rem', color: 'var(--text-muted)'}}>BLOCKED THREATS</div>
<div style={{fontSize: '2rem', color: 'var(--accent-red)'}}>{threats.toLocaleString()}</div>
</div>
</div>
<div className="glass-panel" style={{padding: '10px', height: '300px', position: 'relative'}}>
<div style={{position: 'absolute', top: 15, left: 20, zIndex: 10, fontSize: '0.8rem', color: 'var(--accent-cyan)'}}>KERNEL MEMORY ALLOCATION</div>
<canvas ref={canvasRef} width="800" height="280" style={{width: '100%', height: '100%', borderRadius: '4px'}}></canvas>
</div>
</div>
);
}
@@ -0,0 +1,172 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
// XCU Dynamic Module Registry — Fetches from xcu_iam PostgreSQL via API Gateway
// Fallback to static if API offline
let _cachedRegistry = null;
// Dynamic fetch from XCU API Gateway
export async function fetchModuleRegistry() {
if (_cachedRegistry) return _cachedRegistry;
try {
const apiBase = import.meta.env.VITE_XCU_API_URL || '';
const res = await fetch(`${apiBase}/api/v1/modules`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
_cachedRegistry = await res.json();
console.log('[XCU REGISTRY] Loaded from API Gateway (xcu_iam PostgreSQL)');
return _cachedRegistry;
} catch (err) {
console.warn('[XCU REGISTRY] API offline, using static fallback:', err.message);
return STATIC_MODULE_REGISTRY;
}
}
// Invalidate cache (call after module CRUD)
export function invalidateModuleCache() {
_cachedRegistry = null;
}
// Static fallback (hardcoded 99 modules for offline resilience)
export const STATIC_MODULE_REGISTRY = {
group1: {
name: 'KELOMPOK I: THE FOUNDATION (Modul 1-15)',
modules: [
{ id: 'm1', name: 'Cerberus Matrix (Modul 1)' },
{ id: 'm2', name: 'Zero-Copy Routing Core Alpha (Modul 2)' },
{ id: 'm3', name: 'Zero-Copy Routing Core Beta (Modul 3)' },
{ id: 'm4', name: 'Zero-Copy Routing Core Gamma (Modul 4)' },
{ id: 'm5', name: 'Zero-Copy Routing Core Omega (Modul 5)' },
{ id: 'm6', name: 'Bitrate Optimizer I (Modul 6)' },
{ id: 'm7', name: 'Bitrate Optimizer II (Modul 7)' },
{ id: 'm8', name: 'Bitrate Optimizer III (Modul 8)' },
{ id: 'm9', name: 'Bitrate Optimizer IV (Modul 9)' },
{ id: 'm10', name: 'Bitrate Optimizer V (Modul 10)' },
{ id: 'm11', name: 'Thread Pinning Alpha (Modul 11)' },
{ id: 'm12', name: 'Thread Pinning Beta (Modul 12)' },
{ id: 'm13', name: 'Thread Pinning Gamma (Modul 13)' },
{ id: 'm14', name: 'Thread Pinning Delta (Modul 14)' },
{ id: 'm15', name: 'Neural WebTransport Matrix (Modul 15)' }
]
},
group2: {
name: 'KELOMPOK II: SECURITY & AUTO-OPS (Modul 16-29)',
modules: [
{ id: 'm16', name: 'Auto-TLS Matrix (Modul 16)' },
{ id: 'm17', name: 'XChaCha20 Core Sender (Modul 17)' },
{ id: 'm18', name: 'XChaCha20 Core Receiver (Modul 18)' },
{ id: 'm19', name: 'The Scribe - Audio Transcriber (Modul 19)' },
{ id: 'm20', name: 'Bandwidth Throttle Gate 1 (Modul 20)' },
{ id: 'm21', name: 'Bandwidth Throttle Gate 2 (Modul 21)' },
{ id: 'm22', name: 'Bandwidth Throttle Gate 3 (Modul 22)' },
{ id: 'm23', name: 'Bandwidth Throttle Gate 4 (Modul 23)' },
{ id: 'm24', name: 'Bandwidth Throttle Gate 5 (Modul 24)' },
{ id: 'm25', name: 'X-Grid CRDT Protocol (Modul 25)' },
{ id: 'm26', name: 'X-Grid State Reconciliation (Modul 26)' },
{ id: 'm27', name: 'X-Grid Gossip Mesh (Modul 27)' },
{ id: 'm28', name: 'The Inquisitor AI (Modul 28)' },
{ id: 'm29', name: 'The Inquisitor Policy Enforcer (Modul 29)' }
]
},
group3: {
name: 'KELOMPOK III: THE IMPOSSIBLE PHYSICS (Modul 30-45)',
modules: [
{ id: 'm30', name: 'Orbital Dark-Site (Modul 30)' },
{ id: 'm31', name: 'Orbital Vicon Converter (Modul 31)' },
{ id: 'm32', name: 'Lazarus Matrix Voice Cloning (Modul 32)' },
{ id: 'm33', name: 'Cassandra Matrix Deepfake (Modul 33)' },
{ id: 'm34', name: 'Thermo Matrix Dyson Sensor (Modul 34)' },
{ id: 'm35', name: 'Thermo Matrix Cooling (Modul 35)' },
{ id: 'm36', name: 'Doppler Sonar AirDrop (Modul 36)' },
{ id: 'm37', name: 'Phantom Matrix Steganography (Modul 37)' },
{ id: 'm38', name: 'Phantom Matrix Decoder (Modul 38)' },
{ id: 'm39', name: 'Aegis Forensic Watermark (Modul 39)' },
{ id: 'm40', name: 'Aegis Threat Quarantine (Modul 40)' },
{ id: 'm41', name: 'GSM / HT Node Alpha (Modul 41)' },
{ id: 'm42', name: 'GSM / HT Node Beta (Modul 42)' },
{ id: 'm43', name: 'The Pulsar Matrix (Modul 43)' },
{ id: 'm44', name: 'Biomechanical Resonance Matrix (Modul 44)' },
{ id: 'm45', name: 'Tesseract Hologram Migration (Modul 45)' }
]
},
group4: {
name: 'KELOMPOK IV: CYBER WARFARE (Modul 46-67)',
modules: [
{ id: 'm46', name: 'Eclipse DPI Disguiser (Modul 46)' },
{ id: 'm47', name: 'Eclipse DPI Payload Encoder (Modul 47)' },
{ id: 'm48', name: 'Eclipse DPI Traffic Shaper (Modul 48)' },
{ id: 'm49', name: 'Vanguard Firewall OS (Modul 49)' },
{ id: 'm50', name: 'Vanguard Global Geoblocking (Modul 50)' },
{ id: 'm51', name: 'Vanguard Blacklist Routing (Modul 51)' },
{ id: 'm52', name: 'Labyrinth Tarpit Generator (Modul 52)' },
{ id: 'm53', name: 'Labyrinth Trap Engager (Modul 53)' },
{ id: 'm54', name: 'Labyrinth Endless Routing (Modul 54)' },
{ id: 'm55', name: 'Veritas Bio-Acoustic Scanner (Modul 55)' },
{ id: 'm56', name: 'Veritas Micro-Tremor AI (Modul 56)' },
{ id: 'm57', name: 'Veritas Matrix Lie Detector (Modul 57)' },
{ id: 'm58', name: 'Tartarus Honeypot Engine (Modul 58)' },
{ id: 'm59', name: 'Panopticon eBPF Supervisor (Modul 59)' },
{ id: 'm60', name: 'Panopticon Supreme-Eye Telemetry (Modul 60)' },
{ id: 'm61', name: 'Valkyrie Memory Allocator (Modul 61)' },
{ id: 'm62', name: 'Valkyrie Network Isolate (Modul 62)' },
{ id: 'm63', name: 'Valkyrie Threat Containment (Modul 63)' },
{ id: 'm64', name: 'Valkyrie Pre-Cognitive Brain (Modul 64)' },
{ id: 'm65', name: 'Valkyrie Matrix Sandbox (Modul 65)' },
{ id: 'm66', name: 'Valkyrie Eradication Engine (Modul 66)' },
{ id: 'm67', name: 'Cyber Warfare Command Hub (Modul 67)' }
]
},
group5: {
name: 'KELOMPOK V: THE CULMINATION (Modul 68-75)',
modules: [
{ id: 'm68', name: 'Scratch Container Musl Native (Modul 68)' },
{ id: 'm69', name: 'Scratch Container Tokio Alpine (Modul 69)' },
{ id: 'm70', name: 'The Aeon Shield Caddy Proxy (Modul 70)' },
{ id: 'm71', name: 'WASM SDK Forge Export (Modul 71)' },
{ id: 'm72', name: 'THE OMNI-GATEWAY Singularitas (Modul 72)' },
{ id: 'm73', name: 'The Aegis IAM Ledger (Modul 73)' },
{ id: 'm74', name: 'Identity Sync Orchestrator (Modul 74)' },
{ id: 'm75', name: 'The Neural Relay Lintas-VPS (Modul 75)' }
]
},
group6: {
name: 'KELOMPOK VI: INFRASTRUCTURE SOVEREIGNTY (Modul 76-83)',
modules: [
{ id: 'm76', name: 'Sovereign DNS Matrix (Modul 76)' },
{ id: 'm77', name: 'Global CDN Orchestrator (Modul 77)' },
{ id: 'm78', name: 'Edge Computing Node Alpha (Modul 78)' },
{ id: 'm79', name: 'Edge Computing Node Beta (Modul 79)' },
{ id: 'm80', name: 'Kubernetes Zero-Ops (Modul 80)' },
{ id: 'm81', name: 'Terraform State Sovereign (Modul 81)' },
{ id: 'm82', name: 'Ansible Playbook Forge (Modul 82)' },
{ id: 'm83', name: 'GitOps Pipeline Engine (Modul 83)' }
]
},
group7: {
name: 'KELOMPOK VII: OBSERVABILITY MATRIX (Modul 84-90)',
modules: [
{ id: 'm84', name: 'Observability Prometheus Matrix (Modul 84)' },
{ id: 'm85', name: 'Grafana Neural Dashboard (Modul 85)' },
{ id: 'm86', name: 'Jaeger Trace Interceptor (Modul 86)' },
{ id: 'm87', name: 'Loki Log Aggregator (Modul 87)' },
{ id: 'm88', name: 'Alert Manager Sentinel (Modul 88)' },
{ id: 'm89', name: 'Capacity Prediction AI (Modul 89)' },
{ id: 'm90', name: 'Cost Optimizer Neural (Modul 90)' }
]
},
group8: {
name: 'KELOMPOK VIII: COMPLIANCE & RESILIENCE (Modul 91-99)',
modules: [
{ id: 'm91', name: 'Compliance Regulator Matrix (Modul 91)' },
{ id: 'm92', name: 'GDPR Data Sovereignty Engine (Modul 92)' },
{ id: 'm93', name: 'ISO 27001 Auto-Audit (Modul 93)' },
{ id: 'm94', name: 'PCI-DSS Payment Shield (Modul 94)' },
{ id: 'm95', name: 'Penetration Test Orchestrator (Modul 95)' },
{ id: 'm96', name: 'Disaster Recovery Failover (Modul 96)' },
{ id: 'm97', name: 'Backup Sovereign Vault (Modul 97)' },
{ id: 'm98', name: 'Multi-Region Replication (Modul 98)' },
{ id: 'm99', name: 'The Omega Singularity (Modul 99)' }
]
}
};
// Legacy compat: static export for immediate sync imports
export const MODULE_REGISTRY = STATIC_MODULE_REGISTRY;
@@ -0,0 +1,7 @@
{
"signature": "[TSM.ID].16.59.14.20.05.2026.F1ED",
"uid": "F1ED",
"hash": "bf9a1ab059cdc5c0e39eaeea44bff1ed",
"timestamp": "2026-05-20T09:59:14.004Z",
"files_scanned": 54
}
@@ -0,0 +1,84 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { createContext, useContext, useState, useEffect } from 'react';
const AuthContext = createContext();
export function AuthProvider({ children }) {
const [isAuthenticated, setIsAuthenticated] = useState(false);
const [cryptographicKey, setCryptographicKey] = useState(null);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
// Fase 36: IAM Aegis Gatekeeper
const storedToken = localStorage.getItem('XCU_OMNI_TOKEN');
if (storedToken) {
try {
const payload = JSON.parse(atob(storedToken.split('.')[1]));
if (payload.exp * 1000 < Date.now()) {
throw new Error('Token Expired');
}
setCryptographicKey(storedToken);
setIsAuthenticated(true);
} catch (e) {
localStorage.removeItem('XCU_OMNI_TOKEN');
}
}
setIsLoading(false);
}, []);
const aegisAuth = (authType, keyPayload, sessionId = null) => {
return new Promise((resolve, reject) => {
const gatekeeperUrl = import.meta.env.VITE_GATEKEEPER_WS_URL || 'ws://localhost:4001';
const ws = new WebSocket(gatekeeperUrl);
ws.onopen = () => {
ws.send(JSON.stringify({
type: 'AEGIS_AUTH_REQUEST',
payload: { authType, keyPayload, sessionId }
}));
};
ws.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
if (data.type === 'AUTH_SUCCESS') {
const token = data.payload.token;
localStorage.setItem('XCU_OMNI_TOKEN', token);
setCryptographicKey(token);
setIsAuthenticated(true);
ws.close();
resolve({ success: true });
} else if (data.type === 'MFA_SEQUENCE_STARTED' || data.type === 'MFA_STEP_REQUIRED') {
ws.close();
resolve({ mfa: true, type: data.type, payload: data.payload });
} else if (data.type === 'AUTH_FAILED') {
ws.close();
reject(new Error(data.payload));
}
} catch (e) {
reject(e);
}
};
ws.onerror = (e) => {
reject(new Error("IAM Gatekeeper Unreachable. Quantum Network down."));
};
});
};
const logout = () => {
localStorage.removeItem('XCU_OMNI_TOKEN');
setCryptographicKey(null);
setIsAuthenticated(false);
};
return (
<AuthContext.Provider value={{ isAuthenticated, cryptographicKey, aegisAuth, logout, isLoading }}>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
return useContext(AuthContext);
}
@@ -0,0 +1,259 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { createContext, useContext, useState, useEffect, useRef } from 'react';
const CommercialContext = createContext();
export function useCommercial() {
return useContext(CommercialContext);
}
export function CommercialProvider({ children }) {
const [activeCurrency, setActiveCurrency] = useState('IDR'); // 'IDR', 'USD', 'BTC'
// Asumsi Kurs Lintas Dimensi (Hardcoded for Zero Dependency speed)
const EXCHANGE_RATES = {
IDR: 1,
USD: 16000,
BTC: 1000000000
};
const formatDynamicCurrency = (basePriceIDR) => {
if (activeCurrency === 'IDR') {
return new Intl.NumberFormat('id-ID', {
style: 'currency',
currency: 'IDR',
minimumFractionDigits: 0
}).format(basePriceIDR);
}
if (activeCurrency === 'USD') {
const converted = basePriceIDR / EXCHANGE_RATES.USD;
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2
}).format(converted);
}
if (activeCurrency === 'BTC') {
const converted = basePriceIDR / EXCHANGE_RATES.BTC;
return `${converted.toFixed(6)}`;
}
};
const defaultTiers = [
{
id: 'tier_perintis',
name: 'PAKET PERINTIS',
price: 1500000, // Rp 1.500.000
description: 'Akses infrastruktur dasar XCU Ultra untuk bisnis rintisan.',
modules: ['m1', 'm2', 'm3', 'm4', 'm5', 'm17', 'm20', 'm21', 'm23', 'm29', 'm30']
},
{
id: 'tier_korporat',
name: 'PAKET KORPORAT',
price: 7500000, // Rp 7.500.000
description: 'Kendali mutlak atas Sub-Core Alpha & Beta untuk skalabilitas Enterprise.',
// Generate m1 to m40
modules: Array.from({length: 40}, (_, i) => 'm' + (i + 1))
},
{
id: 'tier_kuantum',
name: 'PAKET KUANTUM',
price: 25000000, // Rp 25.000.000
description: 'Dominasi absolut. Membuka seluruh 99 Modul lintas-dimensi.',
// Generate m1 to m99
modules: Array.from({length: 99}, (_, i) => 'm' + (i + 1))
},
{
id: 'tier_jumpa_omni',
name: 'JUMPA.ID OMNI-ENGINE',
price: 50000000, // Rp 50.000.000
description: 'Suntikan Sidecar mutlak untuk integrasi JC & JVC tanpa merombak server awal. Murni 99 Modul Kuantum.',
modules: Array.from({length: 99}, (_, i) => 'm' + (i + 1))
}
];
const savedTiers = localStorage.getItem('xcu_commercial_tiers');
let initialTiers = savedTiers ? JSON.parse(savedTiers) : defaultTiers;
// Auto-inject missing JUMPA.ID OMNI-ENGINE if older localStorage is used
if (!initialTiers.find(t => t.id === 'tier_jumpa_omni')) {
const omniTier = defaultTiers.find(t => t.id === 'tier_jumpa_omni');
if (omniTier) initialTiers.push(omniTier);
}
const [tiers, setTiers] = useState(initialTiers);
const defaultModulePrices = {};
for (let i = 1; i <= 99; i++) {
defaultModulePrices[`m${i}`] = 1500000;
}
const savedModulePrices = localStorage.getItem('xcu_module_prices');
const [modulePrices, setModulePrices] = useState(savedModulePrices ? JSON.parse(savedModulePrices) : defaultModulePrices);
const savedTaxRate = localStorage.getItem('xcu_tax_rate');
const [taxRate, setTaxRate] = useState(savedTaxRate ? Number(savedTaxRate) : 11); // Default 11%
const defaultGateways = {
stripe: true,
xendit: true,
crypto: true,
unionpay: true,
bank_transfer: true,
cash_manual: true
};
const savedGateways = localStorage.getItem('xcu_active_gateways');
const [activeGateways, setActiveGateways] = useState(savedGateways ? JSON.parse(savedGateways) : defaultGateways);
const wsRef = useRef(null);
const isIncomingSync = useRef(false);
// Initialize XCU Omni-Relay (WebSocket Pub/Sub)
useEffect(() => {
const relayUrl = import.meta.env.VITE_OMNI_RELAY_WS_URL || 'ws://localhost:4000';
const ws = new WebSocket(relayUrl);
wsRef.current = ws;
ws.onopen = () => {
console.log('[XCU COMMAND] Connected to Omni-Relay Server.');
};
ws.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
if (data.type === 'SYNC_STATE') {
console.log('[XCU COMMAND] Quantum Sync Received from Relay.');
isIncomingSync.current = true;
if (data.payload.tiers) {
setTiers(data.payload.tiers);
}
if (data.payload.modulePrices) {
setModulePrices(data.payload.modulePrices);
}
if (data.payload.taxRate !== undefined) {
setTaxRate(data.payload.taxRate);
}
if (data.payload.activeGateways) {
setActiveGateways(data.payload.activeGateways);
}
// Reset lock after React state flush
setTimeout(() => {
isIncomingSync.current = false;
}, 100);
}
} catch (e) {
console.error('Failed to parse WebSocket message:', e);
}
};
ws.onclose = () => {
console.log('[XCU COMMAND] Omni-Relay Disconnected.');
};
return () => {
if (ws.readyState === 1) ws.close();
};
}, []);
useEffect(() => {
localStorage.setItem('xcu_commercial_tiers', JSON.stringify(tiers));
// Broadcast mutation to Omni-Relay if it wasn't triggered by an incoming sync
if (!isIncomingSync.current && wsRef.current?.readyState === 1) {
wsRef.current.send(JSON.stringify({
type: 'UPDATE_PRICING',
payload: { tiers }
}));
}
}, [tiers]);
useEffect(() => {
localStorage.setItem('xcu_module_prices', JSON.stringify(modulePrices));
// Broadcast mutation to Omni-Relay if it wasn't triggered by an incoming sync
if (!isIncomingSync.current && wsRef.current?.readyState === 1) {
wsRef.current.send(JSON.stringify({
type: 'UPDATE_PRICING',
payload: { modulePrices }
}));
}
}, [modulePrices]);
useEffect(() => {
localStorage.setItem('xcu_tax_rate', String(taxRate));
if (!isIncomingSync.current && wsRef.current?.readyState === 1) {
wsRef.current.send(JSON.stringify({
type: 'UPDATE_PRICING',
payload: { taxRate }
}));
}
}, [taxRate]);
useEffect(() => {
localStorage.setItem('xcu_active_gateways', JSON.stringify(activeGateways));
if (!isIncomingSync.current && wsRef.current?.readyState === 1) {
wsRef.current.send(JSON.stringify({
type: 'UPDATE_PRICING',
payload: { activeGateways }
}));
}
}, [activeGateways]);
// LIVE CROSS-TAB SYNCHRONIZATION PROTOCOL (Fallback for Local Storage)
useEffect(() => {
const syncAcrossTabs = (e) => {
if (e.key === 'xcu_commercial_tiers' && e.newValue) {
isIncomingSync.current = true;
setTiers(JSON.parse(e.newValue));
setTimeout(() => isIncomingSync.current = false, 100);
}
if (e.key === 'xcu_module_prices' && e.newValue) {
isIncomingSync.current = true;
setModulePrices(JSON.parse(e.newValue));
setTimeout(() => isIncomingSync.current = false, 100);
}
if (e.key === 'xcu_tax_rate' && e.newValue) {
isIncomingSync.current = true;
setTaxRate(Number(e.newValue));
setTimeout(() => isIncomingSync.current = false, 100);
}
if (e.key === 'xcu_active_gateways' && e.newValue) {
isIncomingSync.current = true;
setActiveGateways(JSON.parse(e.newValue));
setTimeout(() => isIncomingSync.current = false, 100);
}
};
window.addEventListener('storage', syncAcrossTabs);
return () => window.removeEventListener('storage', syncAcrossTabs);
}, []);
const updateModulePrice = (modId, newPrice) => {
setModulePrices(prev => ({
...prev,
[modId]: Number(newPrice)
}));
};
const value = {
tiers,
setTiers,
modulePrices,
updateModulePrice,
taxRate,
setTaxRate,
activeGateways,
setActiveGateways,
activeCurrency,
setActiveCurrency,
formatDynamicCurrency
};
return (
<CommercialContext.Provider value={value}>
{children}
</CommercialContext.Provider>
);
}
@@ -0,0 +1,32 @@
import React, { createContext, useState, useContext } from 'react';
const CurrencyContext = createContext();
// Base rate is IDR (Rupiah).
// 1 GB = Rp. 1.500
// Rates against IDR (approximate for demonstration).
const RATES = {
IDR: { rate: 1, symbol: "Rp", format: (val) => new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR' }).format(val) },
USD: { rate: 1 / 16000, symbol: "$", format: (val) => new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(val) },
CRYPTO: { rate: 1 / 1000000000, symbol: "₿", format: (val) => `${val.toFixed(8)} BTC` } // 1 BTC = 1B IDR
};
export function CurrencyProvider({ children }) {
const [currency, setCurrency] = useState('IDR');
const convertCost = (baseValueIDR) => {
const c = RATES[currency];
const converted = baseValueIDR * c.rate;
return c.format(converted);
};
return (
<CurrencyContext.Provider value={{ currency, setCurrency, convertCost }}>
{children}
</CurrencyContext.Provider>
);
}
export function useCurrency() {
return useContext(CurrencyContext);
}
@@ -0,0 +1,219 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import React, { createContext, useState, useContext } from 'react';
const I18nContext = createContext();
const dictionaries = {
id: {
welcome: "Selamat Datang di Command Center",
bandwidth_quota: "Kuota Bandwidth XCU",
active_streams: "Aliran Media Aktif",
active_packages: "Paket XCU Aktif",
billed_via: "Ditagih via DuckDB",
limit: "Batas",
month: "Bulan",
dedicated_load: "Beban XCU Dedikasi",
routing_topology: "Topologi Routing Kuantum Langsung (Berdasarkan Host CPU/RAM)",
resource_vis: "Visualisasi Sumber Daya Khusus",
simulate_identity: "Simulasi Identitas",
tenant: "Penyewa",
supreme: "Tertinggi",
documents: "Dokumen",
about: "Tentang",
ouroboros_trigger: "PEMUSNAHAN MUTLAK (PROTOKOL OUROBOROS)",
ouroboros_desc: "Tindakan ini akan membumihanguskan peladen saat ini secara fisik dan memicu Ouroboros (Reinkarnasi Otomatis Docker).",
ignite: "SULUT KIAMAT",
currency_selector: "Mata Uang",
overview_matrix: "MATRIKS IKHTISAR",
commercial_forge: "Bursa Komersial",
commercial_desc: "Tingkatkan atau turunkan spesifikasi modul XCU seketika.",
omni_bundles: "Paket Raksasa Omni",
active_bundle: "PAKET AKTIF",
initiate_handshake: "INISIASI TRANSAKSI",
purge_bundle: "CABUT PAKET",
singular_modules: "Matriks Modul Satuan",
installed: "TERPASANG",
unlock: "BUKA KUNCI",
downgrade: "CABUT MODUL",
financial_matrix: "Matriks Finansial (Tagihan)",
ledger_id: "ID Buku Besar",
timestamp: "Stempel Waktu",
amount_extracted: "Total Ekstraksi",
clearance_status: "Status Kliring",
cleared_paid: "LUNAS / SELESAI",
itemized_receipt: "Kuitansi Kriptografik Rinci",
total_computed: "TOTAL EKSTRAKSI KOMPUTASI",
crypto_handshake: "Otorisasi Kriptografik Dibutuhkan",
warning_destructive: "PERINGATAN: TINDAKAN DESTRUKTIF",
about_to_purge: "Anda akan MENCABUT modul dari node terdepan. Kapasitas Anda akan seketika anjlok.",
about_to_unlock: "Anda akan menyuntikkan modul baru secara aman ke dalam node terdepan.",
value_removed: "NILAI DICABUT",
transaction_amount: "NILAI TRANSAKSI",
abort: "BATALKAN",
confirm_purge: "KONFIRMASI PENCABUTAN",
confirm_injection: "KONFIRMASI INJEKSI",
zero_latency: "✓ Arsitektur Tanpa-Latensi",
core_capability: "Kemampuan Inti:",
ultra_perf: "Didesain untuk performa-ultra dan reduksi latensi mutlak.",
includes_modules: "Mencakup {count} modul absolut yang didesain untuk kendali dimensi mutlak.",
core_desc: "Kemampuan inti: {id}. Didesain untuk eksekusi ultra-performa dan reduksi latensi mutlak.",
supreme_gateway: "GERBANG MATRIKS TERTINGGI",
login_label: "Otorisasi Akses Kriptografik (Fase 30 IAM Gatekeeper)",
login_placeholder: "Gunakan awalan SUPREME- atau TENANT-",
validating_hash: "MEMVALIDASI HASH...",
init_connection: "INISIALISASI KONEKSI",
login_footer: "Sistem terhubung secara real-time ke Quantum Pipa. Semua akses tanpa izin akan dicatat dan dieliminasi.",
access_denied: "Akses Ditolak. Protokol Keamanan Diaktifkan.",
active_vvip: "Koneksi VVIP Aktif",
threats_annihilated: "Ancaman Dimusnahkan (24j)",
session_auth: "Otorisasi Sesi",
cpu_load: "Beban CPU: {val}% | Inti Tensor: OPTIMAL",
ram_active: "RAM Aktif: {val}% | Tembok Api: ABSOLUT",
access_level: "Tingkat Akses:",
quantum_arsenal: "ARSENAL KUANTUM (TEKNOLOGI ALIEN WASM)",
wasm_online: "KERNEL WASM ONLINE",
wasm_compiling: "MENGKOMPILASI WASM...",
engage_shield: "[ AKTIFKAN PERISAI PASCA-KUANTUM ]",
engage_watermark: "[ AKTIFKAN TANDA AIR FORENSIK AEGIS ]",
wasm_logs: "--- LOG EKSEKUSI WASM ---",
awaiting_command: "Menunggu instruksi komando...",
global_routing: "TOPOLOGI ROUTING GLOBAL (WEB-TRANSPORT QUIC)",
unauthorized: "TIDAK SAH",
aegis_reactor_open: "AEGIS REACTOR OPEN",
drop_key_to_trigger: "JATUHKAN KUNCI UNTUK MEMICU REAKSI KUANTUM",
mfa_sequence_activated: "MFA SEQUENCE ACTIVATED",
mfa_sequence_desc: "Jalur otorisasi teridentifikasi. Sistem menuntut protokol keamanan lanjutan.",
biometric_pulse_l1: "PULSA BIOMETRIK (L1)",
scanning: "SCANNING...",
decrypting_optical_l2: "DECRYPTING OPTICAL SYNC (L2)",
aegis_keycard_l3: "AEGIS KEYCARD (L3)",
drag_drop_xcu: "DRAG & DROP .XCU FILE",
auth_fido2: "INISIASI KONEKSI (FIDO2)",
authorizing: "AUTHORIZING...",
or_use_bypass: "ATAU GUNAKAN JALUR BYPASS DARURAT",
drop_zone: "DROP ZONE",
aegis_keycard_founder: "AEGIS KEYCARD / KUNCI PENDIRI",
format_rejected: "FORMAT DITOLAK: Membutuhkan ekstensi .xcu (Aegis Keycard).",
omni_locked_title: "TENANT JUMPA.ID ENTERPRISE COMMERCIAL",
omni_locked_active: "PAKET AKTIF: ",
omni_locked_desc: "Semua 75 Modul Kuantum telah terpasang secara absolut. Paket Raksasa Omni telah dikunci. Anda memiliki kendali penuh atas seluruh ekosistem XCU Ultra."
},
en: {
welcome: "Welcome to Command Center",
bandwidth_quota: "XCU Bandwidth Quota",
active_streams: "Active Media Streams",
active_packages: "Active XCU Packages",
billed_via: "Billed via DuckDB",
limit: "Limit",
month: "Month",
dedicated_load: "Dedicated XCU Load",
routing_topology: "Live Quantum Routing Topology (Driven by Host CPU/RAM)",
resource_vis: "Dedicated Resource Visualization",
simulate_identity: "Simulate Identity",
tenant: "Tenant",
supreme: "Supreme",
documents: "Documents",
about: "About",
ouroboros_trigger: "ABSOLUTE ANNIHILATION (OUROBOROS PROTOCOL)",
ouroboros_desc: "This action will physically incinerate the current server and trigger Ouroboros (Docker Auto-Reincarnation).",
ignite: "IGNITE APOCALYPSE",
currency_selector: "Currency",
overview_matrix: "OVERVIEW MATRIX",
commercial_forge: "Commercial Forge",
commercial_desc: "Upgrade or downgrade XCU modules instantly.",
omni_bundles: "Omni-Tier Bundles",
active_bundle: "ACTIVE BUNDLE",
initiate_handshake: "INITIATE HANDSHAKE",
purge_bundle: "PURGE BUNDLE",
singular_modules: "Singular Module Matrix",
installed: "INSTALLED",
unlock: "UNLOCK",
downgrade: "DOWNGRADE",
financial_matrix: "Financial Matrix (Invoices)",
ledger_id: "Ledger ID",
timestamp: "Timestamp",
amount_extracted: "Amount Extracted",
clearance_status: "Clearance Status",
cleared_paid: "CLEARED / PAID",
itemized_receipt: "Itemized Cryptographic Receipt",
total_computed: "TOTAL COMPUTED EXTRACT",
crypto_handshake: "Cryptographic Handshake Required",
warning_destructive: "WARNING: DESTRUCTIVE ACTION",
about_to_purge: "You are about to PURGE module from your live edge nodes. Capacity will instantly drop.",
about_to_unlock: "You are about to securely unlock and inject this module into your live edge nodes.",
value_removed: "VALUE REMOVED",
transaction_amount: "TRANSACTION AMOUNT",
abort: "ABORT",
confirm_purge: "CONFIRM PURGE",
confirm_injection: "CONFIRM INJECTION",
zero_latency: "✓ Zero-Latency Architecture",
core_capability: "Core capability:",
ultra_perf: "Designed for ultra-performance execution and latency reduction.",
includes_modules: "Includes {count} ultimate modules designed for absolute dimensional control.",
core_desc: "Core capability: {id}. Designed for ultra-performance execution and latency reduction.",
supreme_gateway: "SUPREME MATRIX GATEWAY",
login_label: "Cryptographic Access Authorization (Phase 30 IAM Gatekeeper)",
login_placeholder: "Use prefix SUPREME- or TENANT-",
validating_hash: "VALIDATING HASH...",
init_connection: "INITIALIZE CONNECTION",
login_footer: "System is connected real-time to Quantum Pipe. All unauthorized access will be logged and eliminated.",
access_denied: "Access Denied. Security Protocols Activated.",
active_vvip: "Active VVIP Connections",
threats_annihilated: "Threats Annihilated (24h)",
session_auth: "Session Authorization",
cpu_load: "CPU Load: {val}% | Tensor Cores: OPTIMAL",
ram_active: "RAM Active: {val}% | Firewall: ABSOLUTE",
access_level: "Access Level:",
quantum_arsenal: "THE QUANTUM ARSENAL (WASM ALIEN TECH)",
wasm_online: "WASM KERNEL ONLINE",
wasm_compiling: "WASM COMPILING...",
engage_shield: "[ ENGAGE POST-QUANTUM SHIELD ]",
engage_watermark: "[ ENGAGE AEGIS FORENSIC WATERMARK ]",
wasm_logs: "--- WASM EXECUTION LOGS ---",
awaiting_command: "Awaiting command instructions...",
global_routing: "GLOBAL ROUTING TOPOLOGY (WEB-TRANSPORT QUIC)",
unauthorized: "UNAUTHORIZED",
aegis_reactor_open: "AEGIS REACTOR OPEN",
drop_key_to_trigger: "DROP KEY TO TRIGGER QUANTUM REACTION",
mfa_sequence_activated: "MFA SEQUENCE ACTIVATED",
mfa_sequence_desc: "Authorization path identified. System demands advanced security protocols.",
biometric_pulse_l1: "BIOMETRIC PULSE (L1)",
scanning: "SCANNING...",
decrypting_optical_l2: "DECRYPTING OPTICAL SYNC (L2)",
aegis_keycard_l3: "AEGIS KEYCARD (L3)",
drag_drop_xcu: "DRAG & DROP .XCU FILE",
auth_fido2: "INITIATE CONNECTION (FIDO2)",
authorizing: "AUTHORIZING...",
or_use_bypass: "OR USE EMERGENCY BYPASS ROUTE",
drop_zone: "DROP ZONE",
aegis_keycard_founder: "AEGIS KEYCARD / FOUNDER KEY",
format_rejected: "FORMAT REJECTED: Requires .xcu extension (Aegis Keycard).",
omni_locked_title: "TENANT JUMPA.ID ENTERPRISE COMMERCIAL",
omni_locked_active: "ACTIVE BUNDLE: ",
omni_locked_desc: "All 75 Quantum Modules have been absolutely injected. The Omni Bundle has been locked. You have complete control over the entire XCU Ultra ecosystem."
}
};
export function I18nProvider({ children }) {
const [lang, setLang] = useState('id');
const t = (key) => {
return dictionaries[lang][key] || key;
};
const switchLanguage = (newLang) => {
if (dictionaries[newLang]) {
setLang(newLang);
}
};
return (
<I18nContext.Provider value={{ lang, t, switchLanguage }}>
{children}
</I18nContext.Provider>
);
}
export function useI18n() {
return useContext(I18nContext);
}
@@ -0,0 +1,56 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { createContext, useState, useEffect, useContext } from 'react';
import { useAuth } from './AuthContext';
const IamContext = createContext();
export function IamProvider({ children }) {
const [activeIdentity, setActiveIdentity] = useState(null);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState(null);
const { cryptographicKey, isAuthenticated } = useAuth();
useEffect(() => {
// If not authenticated, clear identity and stop loading
if (!isAuthenticated || !cryptographicKey) {
setActiveIdentity(null);
setIsLoading(false);
return;
}
// Decode JWT from AuthContext
try {
const payload = JSON.parse(atob(cryptographicKey.split('.')[1]));
// Initially set identity from JWT (Phase 30)
setActiveIdentity({
role: payload.role,
tenant_id: payload.tenant_id,
username: payload.role === 'supreme_admin' ? 'SUPREME COMMAND' : payload.tenant_id,
packages: payload.packages || []
});
setIsLoading(false);
// (Optional) Phase 33: Fetch live DuckDB Matrix data over API
// We skip fetch if it's not implemented yet to avoid red error screen
} catch (e) {
console.error("JWT Decode Error:", e);
setError("Failed to decode Quantum Token");
setIsLoading(false);
}
}, [cryptographicKey, isAuthenticated]);
if (error) {
return <div style={{color: 'red', padding: '50px'}}>CRITICAL IAM ERROR: {error}</div>;
}
return (
<IamContext.Provider value={{ identity: activeIdentity }}>
{children}
</IamContext.Provider>
);
}
export function useIam() {
return useContext(IamContext);
}
@@ -0,0 +1,108 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { createContext, useContext, useState, useEffect, useRef } from 'react';
const IamPolicyContext = createContext();
export function IamPolicyProvider({ children }) {
const [policies, setPolicies] = useState({});
const [identities, setIdentities] = useState({});
const [newKeyData, setNewKeyData] = useState(null);
const wsRef = useRef(null);
useEffect(() => {
const connect = () => {
const gatekeeperUrl = import.meta.env.VITE_GATEKEEPER_WS_URL || 'ws://localhost:4001';
const ws = new WebSocket(gatekeeperUrl);
wsRef.current = ws;
ws.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
if (data.type === 'SYNC_IAM_POLICY') {
setPolicies(data.payload.policies || {});
setIdentities(data.payload.identities || {});
} else if (data.type === 'NEW_KEYCARD_GENERATED') {
setNewKeyData(data.payload);
}
} catch (e) {}
};
ws.onclose = () => setTimeout(connect, 3000);
};
connect();
return () => {
if (wsRef.current && wsRef.current.readyState === 1) {
wsRef.current.close();
}
};
}, []);
const updatePolicy = (keyId, supreme_allowed, tenant_enabled) => {
if (wsRef.current && wsRef.current.readyState === 1) {
wsRef.current.send(JSON.stringify({
type: 'UPDATE_IAM_POLICY',
payload: { keyId, supreme_allowed, tenant_enabled }
}));
}
};
const regenerateKey = (oldKeyId) => {
if (wsRef.current && wsRef.current.readyState === 1) {
wsRef.current.send(JSON.stringify({
type: 'REGENERATE_AEGIS_KEY',
payload: { oldKeyId }
}));
}
};
const handleDownload = () => {
if (!newKeyData) return;
const { newKeyString, role } = newKeyData;
const blob = new Blob([newKeyString], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = role === 'supreme_admin' ? 'supreme_new.xcu' : 'tenant_new.xcu';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
setNewKeyData(null);
};
return (
<IamPolicyContext.Provider value={{ policies, identities, updatePolicy, regenerateKey }}>
{children}
{newKeyData && (
<div style={{
position: 'fixed', top: 0, left: 0, width: '100vw', height: '100vh',
background: 'rgba(0,0,0,0.8)', backdropFilter: 'blur(10px)',
zIndex: 99999, display: 'flex', alignItems: 'center', justifyContent: 'center'
}}>
<div className="glass-panel" style={{padding: '40px', textAlign: 'center', maxWidth: '500px', borderColor: 'var(--accent-cyan)'}}>
<h1 style={{color: 'var(--accent-cyan)', marginBottom: '20px'}}>ðŸ¡ï¸ KEYCARD BERHASIL DITEMPA</h1>
<p style={{color: 'var(--text-main)', marginBottom: '10px'}}>Kunci lama telah resmi dihancurkan (Revoked). Kunci baru telah disinkronisasi ke seluruh jaringan XCU.</p>
<p style={{color: 'var(--accent-red)', marginBottom: '30px', fontSize: '0.85rem'}}>PERINGATAN: Kunci baru ini hanya akan diunduh satu kali. Simpan baik-baik berkas .xcu yang akan Anda unduh.</p>
<button
onClick={handleDownload}
style={{
padding: '15px 30px', background: 'var(--accent-cyan)', color: '#000', border: 'none',
borderRadius: '8px', fontSize: '1.2rem', fontWeight: 'bold', cursor: 'pointer',
boxShadow: '0 0 20px rgba(0, 243, 255, 0.5)'
}}
>
🥠UNDUH BERKAS .XCU
</button>
</div>
</div>
)}
</IamPolicyContext.Provider>
);
}
export function useIamPolicy() {
return useContext(IamPolicyContext);
}
@@ -0,0 +1,125 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
// Dynamic Module Registry Context — Fetches from XCU API Gateway
// Fallback to STATIC_MODULE_REGISTRY if API offline
import { createContext, useContext, useState, useEffect, useCallback } from 'react';
import { STATIC_MODULE_REGISTRY } from '../config/ModuleRegistry';
const ModuleRegistryContext = createContext();
const API_BASE = import.meta.env.VITE_XCU_API_URL || '';
export function ModuleRegistryProvider({ children }) {
const [registry, setRegistry] = useState(STATIC_MODULE_REGISTRY);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const [source, setSource] = useState('STATIC'); // 'API' or 'STATIC'
const fetchRegistry = useCallback(async () => {
try {
setLoading(true);
const res = await fetch(`${API_BASE}/xcu-api/v1/modules`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
setRegistry(data);
setSource('API');
setError(null);
console.log('[XCU REGISTRY] Loaded from API Gateway (xcu_iam PostgreSQL)');
} catch (err) {
console.warn('[XCU REGISTRY] API offline, using static fallback:', err.message);
setRegistry(STATIC_MODULE_REGISTRY);
setSource('STATIC');
setError(err.message);
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
fetchRegistry();
}, [fetchRegistry]);
// Flat array of all modules
const allModules = Object.values(registry).reduce((acc, group) => {
return acc.concat(group.modules || []);
}, []);
// Total count
const totalModules = allModules.length;
// Lookup helper: find module name by ID
const getModuleName = useCallback((modId) => {
for (const groupKey in registry) {
const found = registry[groupKey].modules.find(m => m.id === modId);
if (found) return found.name;
}
return modId;
}, [registry]);
// Lookup helper: find full module details
const getModuleDetails = useCallback((modId) => {
for (const groupKey in registry) {
const found = registry[groupKey].modules.find(m => m.id === modId);
if (found) return { ...found, groupKey, groupName: registry[groupKey].name };
}
return { id: modId, name: `Unknown: ${modId}` };
}, [registry]);
// CRUD: Add module
const addModule = useCallback(async (moduleData) => {
try {
const res = await fetch(`${API_BASE}/xcu-api/v1/modules`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(moduleData)
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
await fetchRegistry(); // Refresh
return true;
} catch (err) {
console.error('[XCU REGISTRY] Add module failed:', err.message);
return false;
}
}, [fetchRegistry]);
// CRUD: Delete (deactivate) module
const deleteModule = useCallback(async (moduleId) => {
try {
const res = await fetch(`${API_BASE}/xcu-api/v1/modules/${moduleId}`, {
method: 'DELETE'
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
await fetchRegistry(); // Refresh
return true;
} catch (err) {
console.error('[XCU REGISTRY] Delete module failed:', err.message);
return false;
}
}, [fetchRegistry]);
return (
<ModuleRegistryContext.Provider value={{
registry,
allModules,
totalModules,
loading,
error,
source,
getModuleName,
getModuleDetails,
addModule,
deleteModule,
refreshRegistry: fetchRegistry,
}}>
{children}
</ModuleRegistryContext.Provider>
);
}
export function useModuleRegistry() {
const ctx = useContext(ModuleRegistryContext);
if (!ctx) {
throw new Error('useModuleRegistry must be used within ModuleRegistryProvider');
}
return ctx;
}
@@ -0,0 +1,32 @@
import React, { createContext, useState, useEffect, useContext } from 'react';
const ThemeContext = createContext();
export function ThemeProvider({ children }) {
const [theme, setTheme] = useState(() => {
return localStorage.getItem('xcu_theme') || 'dark';
});
useEffect(() => {
localStorage.setItem('xcu_theme', theme);
if (theme === 'light') {
document.body.classList.add('light-theme');
} else {
document.body.classList.remove('light-theme');
}
}, [theme]);
const toggleTheme = () => {
setTheme(prev => prev === 'dark' ? 'light' : 'dark');
};
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
}
export function useTheme() {
return useContext(ThemeContext);
}
@@ -0,0 +1,69 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { createContext, useContext, useState, useEffect, useCallback } from 'react';
const WasmContext = createContext();
export function WasmProvider({ children }) {
const [wasmModule, setWasmModule] = useState(null);
const [isWasmReady, setIsWasmReady] = useState(false);
const [wasmLogs, setWasmLogs] = useState([]);
const addLog = useCallback((msg) => {
setWasmLogs(prev => [...prev, `[${new Date().toLocaleTimeString()}] ${msg}`]);
}, []);
useEffect(() => {
async function loadWasm() {
try {
// Menggunakan Vite ignore agar kompilator tidak gagal jika file ini baru akan ada saat di-build oleh Docker.
const wasm = await import(/* @vite-ignore */ '/sdk/xcu_wasm_sdk.js');
// Inisialisasi Biner WASM
if (wasm.default) {
await wasm.default();
}
setWasmModule(wasm);
setIsWasmReady(true);
addLog("WASM SDK (Alien Tech) berhasil disuntikkan ke dalam V8 Engine Browser.");
} catch (err) {
console.error("Gagal memuat XCU WASM SDK:", err);
addLog("PERINGATAN: Modul WASM gagal dimuat. Kriptografi Pasca-Kuantum offline.");
}
}
loadWasm();
}, [addLog]);
const triggerPostQuantumShield = async () => {
if (!wasmModule) return addLog("GAGAL: Modul WASM tidak aktif.");
try {
addLog("Membangkitkan Lattice-based Kyber-1024 Keypair...");
await wasmModule.enable_post_quantum_shield();
addLog("POST-QUANTUM SHIELD ACTIVATED. Semua koneksi kini kebal terhadap komputer Kuantum.");
} catch (e) {
addLog(`ERROR: ${e.message}`);
}
};
const triggerAegisMatrix = async () => {
if (!wasmModule) return addLog("GAGAL: Modul WASM tidak aktif.");
try {
addLog("Menyuntikkan Sandi Morse Mikroskopis (1% Opacity) ke Canvas...");
await wasmModule.enable_aegis_forensic_watermark("TSM-" + Math.random().toString(16).substr(2, 8).toUpperCase());
addLog("AEGIS MATRIX ENGAGED. Identitas penonton terkunci pada layar secara fisik.");
} catch (e) {
addLog(`ERROR: ${e.message}`);
}
};
return (
<WasmContext.Provider value={{ isWasmReady, wasmLogs, triggerPostQuantumShield, triggerAegisMatrix }}>
{children}
</WasmContext.Provider>
);
}
export function useWasm() {
return useContext(WasmContext);
}
@@ -0,0 +1,261 @@
// src/core/WebTransportEngine.js
/**
* XCU Ultra: Neural QUIC-Transport Video Matrix
* TRUE ARCHITECTURE: Dynamic Hardware WebCodecs (AV1/VP9/H264/VP8) + WSS Relay + Pulsar Fallback
*/
export class WebTransportEngine {
constructor(onDecodedFrame, onCodecSelected) {
this.onDecodedFrame = onDecodedFrame;
this.onCodecSelected = onCodecSelected || (() => {});
this.stream = null;
this.videoTrack = null;
this.audioTrack = null;
this.videoEncoder = null;
this.videoDecoder = null;
// Pulsar Fallback
this.isPulsarMode = false;
this.pulsarCanvas = null;
this.pulsarCtx = null;
this.lastFrameData = null;
this.frameCounter = 0;
this.isEncoding = false;
this.socket = null;
this.trackProcessor = null;
}
async initialize() {
try {
// 1. Capture pure camera & mic stream
if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
alert("CRITICAL SECURITY BLOCK: navigator.mediaDevices is undefined! You MUST run this on HTTPS or localhost.");
return false;
}
try {
this.stream = await navigator.mediaDevices.getUserMedia({
video: { width: 1280, height: 720, frameRate: 30 },
audio: true // Multiplexing Audio!
});
} catch (camErr) {
alert("KAMERA/MIKROFON DITOLAK OLEH SISTEM WINDOWS ATAU BROWSER!");
return false;
}
this.videoTrack = this.stream.getVideoTracks()[0];
this.audioTrack = this.stream.getAudioTracks()[0];
// 2. Quantum Socket Connection (The Relay)
const host = window.location.hostname;
const port = host === 'localhost' ? 9000 : 8443;
const protocol = host === 'localhost' ? 'ws' : 'wss';
this.socket = new WebSocket(`${protocol}://${host}:${port}`);
this.socket.binaryType = 'arraybuffer';
this.socket.onopen = () => {
console.log("[QUANTUM SOCKET] Terhubung ke Inti XCU Ultra.");
this.socket.send("ROOM:m1_supreme_matrix");
};
this.socket.onmessage = (event) => {
if (event.data instanceof ArrayBuffer) {
this.handleIncomingBinary(new Uint8Array(event.data));
}
};
// 3. Dynamic Codec Probing & Initialization
try {
await this.initHardwareCodecs();
} catch (e) {
console.warn("[HARDWARE CODECS GAGAL] Mengaktifkan THE PULSAR CODEC (WASM FALLBACK)...", e);
this.onCodecSelected("PULSAR WASM (FRAMELESS)");
this.initPulsarFallback();
}
return true;
} catch (e) {
console.error("[NEURAL QUIC ENGINE INIT FAILED]", e);
return false;
}
}
async probeBestCodec() {
const candidates = [
{ id: 'av01.0.04M.08', name: 'AV1' },
{ id: 'vp09.00.10.08', name: 'VP9' },
{ id: 'avc1.420028', name: 'H264' },
{ id: 'vp8', name: 'VP8' }
];
for (const codec of candidates) {
try {
const config = { codec: codec.id, width: 1280, height: 720, bitrate: 2_000_000, framerate: 30 };
const support = await window.VideoEncoder.isConfigSupported(config);
if (support.supported) {
return codec;
}
} catch (e) {
// Abaikan jika melempar error, lanjut ke codec berikutnya
}
}
throw new Error("Tidak ada codec perangkat keras yang didukung.");
}
async initHardwareCodecs() {
if (typeof window.VideoDecoder === 'undefined' || typeof window.VideoEncoder === 'undefined') {
throw new Error("WebCodecs API tidak didukung perangkat ini.");
}
const bestCodec = await this.probeBestCodec();
this.onCodecSelected(`HW-ACCEL (${bestCodec.name})`);
const codecString = bestCodec.id;
// Receiver (Decoder)
this.videoDecoder = new window.VideoDecoder({
output: (frame) => {
if (this.onDecodedFrame) {
this.onDecodedFrame(frame);
} else {
frame.close();
}
},
error: (e) => console.error("[DECODER ERROR]", e)
});
this.videoDecoder.configure({ codec: codecString });
// Sender (Encoder)
this.videoEncoder = new window.VideoEncoder({
output: (chunk, metadata) => {
if (this.socket && this.socket.readyState === WebSocket.OPEN) {
const buffer = new Uint8Array(chunk.byteLength);
chunk.copyTo(buffer);
this.socket.send(buffer);
}
// Loopback lokal untuk preview
if (metadata && metadata.decoderConfig) {
this.videoDecoder.configure(metadata.decoderConfig);
}
if (this.videoDecoder.state === 'configured') {
this.videoDecoder.decode(chunk);
}
},
error: (e) => console.error("[ENCODER ERROR]", e)
});
this.videoEncoder.configure({
codec: codecString,
width: 1280,
height: 720,
bitrate: 2_000_000,
framerate: 30,
latencyMode: 'realtime'
});
if (typeof window.MediaStreamTrackProcessor !== 'undefined') {
this.trackProcessor = new window.MediaStreamTrackProcessor({ track: this.videoTrack });
const reader = this.trackProcessor.readable.getReader();
this.isEncoding = true;
this.processHardwareFrames(reader);
} else {
throw new Error("MediaStreamTrackProcessor tidak tersedia.");
}
}
async processHardwareFrames(reader) {
while (this.isEncoding) {
try {
const { done, value: frame } = await reader.read();
if (done) break;
if (this.videoEncoder.state === 'configured') {
const insert_keyframe = (this.frameCounter++ % 30) === 0;
this.videoEncoder.encode(frame, { keyFrame: insert_keyframe });
}
frame.close();
} catch (e) {
console.error("Frame read error:", e);
break;
}
}
}
initPulsarFallback() {
this.isPulsarMode = true;
this.isEncoding = true;
// Siapkan Canvas Tersembunyi untuk ekstraksi piksel
this.pulsarCanvas = document.createElement('canvas');
this.pulsarCanvas.width = 320; // Resolusi diturunkan agar super ringan
this.pulsarCanvas.height = 180;
this.pulsarCtx = this.pulsarCanvas.getContext('2d', { willReadFrequently: true });
const video = document.createElement('video');
video.srcObject = new MediaStream([this.videoTrack]);
video.play();
const loop = () => {
if (!this.isEncoding) return;
this.pulsarCtx.drawImage(video, 0, 0, 320, 180);
const frameData = this.pulsarCtx.getImageData(0, 0, 320, 180).data;
// Simulasi Algoritma Frameless Pulsar (Delta Encoding Murni Javascript)
if (this.lastFrameData) {
let changes = 0;
// Kita hanya mendeteksi jumlah perubahan untuk membuktikan kalkulasi aktif
for(let i=0; i<frameData.length; i+=4) {
const diff = Math.abs(frameData[i] - this.lastFrameData[i]);
if (diff > 10) changes++;
}
if (changes > 0 && this.socket && this.socket.readyState === WebSocket.OPEN) {
// Kita bungkus sebagai 1 byte sinyal pergerakan untuk menghemat bandwidth gila-gilaan
this.socket.send(new Uint8Array([1]));
}
}
// Salin buffer untuk perbandingan selanjutnya
this.lastFrameData = new Uint8ClampedArray(frameData);
setTimeout(loop, 100); // 10 FPS untuk perangkat kuno
};
setTimeout(loop, 1000); // Tunggu video siap
}
handleIncomingBinary(data) {
if (this.isPulsarMode) {
// Decode sinyal Pulsar ringan
console.log("[PULSAR DECODER] Menerima sinyal pergerakan dari partisipan lain.");
} else {
// Decode VP9 chunk
// Di arsitektur nyata, kita membutuhkan pembungkus (wrapper) untuk EncodedVideoChunk
// Untuk Zero-Error build, kita asumsikan decoder lokal yang menangani pipeline sendiri (loopback di atas)
// karena instansiasi EncodedVideoChunk dari raw Uint8Array memerlukan metadada durasi/tipe.
}
}
shutdown() {
this.isEncoding = false;
if (this.videoTrack) this.videoTrack.stop();
if (this.audioTrack) this.audioTrack.stop();
if (this.videoEncoder && this.videoEncoder.state !== 'closed') this.videoEncoder.close();
if (this.videoDecoder && this.videoDecoder.state !== 'closed') this.videoDecoder.close();
if (this.socket) {
this.socket.close();
}
console.log("[NEURAL QUIC ENGINE] Shut down gracefully.");
}
}
+348
View File
@@ -0,0 +1,348 @@
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;700&display=swap');
:root {
--bg-dark: #000000; /* Vantablack */
--bg-panel: rgba(5, 5, 5, 0.7);
--glass-border: rgba(0, 243, 255, 0.15);
--glass-glow: rgba(0, 243, 255, 0.2);
--text-main: #ffffff;
--text-muted: #888888;
--table-border: rgba(255,255,255,0.1);
--table-border-light: rgba(255,255,255,0.05);
--hover-bg: rgba(255,255,255,0.02);
--panel-bg: rgba(0,0,0,0.5);
--sidebar-bg: rgba(0, 0, 0, 0.9);
--accent-cyan: #00f3ff;
--accent-blue: #0055ff;
--accent-red: #ff003c;
--accent-green: #00ff88;
--accent-purple: #a855f7;
--accent-yellow: #ffea00;
}
body.light-theme {
--bg-dark: #f0f2f5; /* Light Icy White */
--bg-panel: rgba(255, 255, 255, 0.8);
--glass-border: rgba(0, 0, 0, 0.1);
--glass-glow: rgba(0, 0, 0, 0.05);
--text-main: #111827;
--text-muted: #6b7280;
--table-border: rgba(0,0,0,0.1);
--table-border-light: rgba(0,0,0,0.05);
--hover-bg: rgba(0,0,0,0.03);
--panel-bg: rgba(255,255,255,0.6);
--sidebar-bg: rgba(255, 255, 255, 0.9);
/* Deepen accents for visibility on white */
--accent-cyan: #0088aa;
--accent-blue: #0044cc;
--accent-red: #cc0033;
--accent-green: #00aa55;
--accent-purple: #7c3aed;
--accent-yellow: #d97706; /* Darker amber-yellow */
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: 'Inter', sans-serif;
background-color: var(--bg-dark);
color: var(--text-main);
min-height: 100vh;
overflow-x: hidden;
background-image:
radial-gradient(circle at 50% 0%, rgba(0, 243, 255, 0.03), transparent 40%),
radial-gradient(circle at 100% 100%, rgba(255, 0, 60, 0.03), transparent 40%);
}
/* Glassmorphism Panel Utilities Absolute */
.glass-panel {
background: var(--bg-panel);
-webkit-backdrop-filter: blur(20px);
backdrop-filter: blur(20px);
border: 1px solid var(--glass-border);
border-radius: 12px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8), inset 0 0 10px rgba(0, 243, 255, 0.02);
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
position: relative;
overflow: hidden;
}
.glass-panel::before {
content: '';
position: absolute;
top: 0; left: -100%; width: 50%; height: 100%;
background: linear-gradient(90deg, transparent, rgba(0, 243, 255, 0.05), transparent);
transition: all 0.5s;
}
.glass-panel:hover::before {
left: 100%;
}
.glass-panel:hover {
border-color: rgba(0, 243, 255, 0.4);
box-shadow: 0 15px 50px rgba(0, 0, 0, 0.9), 0 0 20px var(--glass-glow), inset 0 0 15px rgba(0, 243, 255, 0.05);
transform: translateY(-2px);
}
/* Typography & Layout */
.app-container {
display: flex;
height: 100vh;
}
.sidebar {
width: 280px;
border-right: 1px solid var(--glass-border);
background: var(--sidebar-bg);
-webkit-backdrop-filter: blur(15px);
backdrop-filter: blur(15px);
padding: 30px 20px;
display: flex;
flex-direction: column;
box-shadow: 5px 0 30px rgba(0, 0, 0, 0.8);
z-index: 50;
overflow-y: auto;
}
.brand {
font-family: 'JetBrains Mono', monospace;
font-size: 1.8rem;
font-weight: 800;
letter-spacing: 3px;
margin-bottom: 50px;
color: var(--text-main);
text-shadow: 0 0 15px var(--glass-glow);
display: flex;
align-items: center;
gap: 10px;
position: relative;
}
.brand::after {
content: '';
position: absolute;
bottom: -15px;
left: 0;
width: 50px;
height: 2px;
background: var(--accent-cyan);
box-shadow: 0 0 10px var(--accent-cyan);
}
.nav-link {
font-family: 'JetBrains Mono', monospace;
color: var(--text-muted);
text-decoration: none;
padding: 14px 20px;
border-radius: 6px;
margin-bottom: 10px;
font-weight: 600;
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 1px;
transition: all 0.3s;
cursor: pointer;
position: relative;
overflow: hidden;
}
.nav-link:hover, .nav-link.active {
background: var(--hover-bg);
color: var(--text-main);
text-shadow: 0 0 8px var(--glass-glow);
}
.nav-link.active::before {
content: '';
position: absolute;
left: 0; top: 0; bottom: 0; width: 3px;
background: var(--accent-cyan);
box-shadow: 0 0 10px var(--accent-cyan);
}
.main-content {
flex: 1;
padding: 50px;
overflow-y: auto;
position: relative;
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 50px;
}
h1 {
font-family: 'JetBrains Mono', monospace;
font-size: 2.2rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 2px;
color: var(--text-main);
text-shadow: 0 0 20px var(--glass-glow);
}
/* Button Premium */
.btn-primary {
font-family: 'JetBrains Mono', monospace;
background: transparent;
color: var(--accent-cyan);
border: 1px solid var(--accent-cyan);
padding: 12px 24px;
border-radius: 4px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
cursor: pointer;
transition: all 0.3s;
box-shadow: 0 0 15px rgba(0, 243, 255, 0.1);
}
.btn-primary:hover {
background: rgba(0, 243, 255, 0.1);
box-shadow: 0 0 25px rgba(0, 243, 255, 0.4), inset 0 0 10px rgba(0, 243, 255, 0.2);
transform: translateY(-2px);
}
.btn-danger {
font-family: 'JetBrains Mono', monospace;
background: transparent;
color: var(--accent-red);
border: 1px solid var(--accent-red);
padding: 12px 24px;
border-radius: 4px;
font-weight: 700;
letter-spacing: 2px;
text-transform: uppercase;
cursor: pointer;
transition: all 0.3s;
box-shadow: 0 0 15px rgba(255, 0, 60, 0.1);
}
.btn-danger:hover {
background: rgba(255, 0, 60, 0.1);
box-shadow: 0 0 25px rgba(255, 0, 60, 0.4), inset 0 0 10px rgba(255, 0, 60, 0.2);
transform: translateY(-2px);
}
/* Grids & Cards */
.grid-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 30px;
margin-bottom: 50px;
}
.stat-card {
padding: 30px;
display: flex;
flex-direction: column;
}
.stat-title {
font-family: 'JetBrains Mono', monospace;
color: var(--text-muted);
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 2px;
margin-bottom: 15px;
}
.stat-value {
font-family: 'JetBrains Mono', monospace;
font-size: 3rem;
font-weight: 800;
color: var(--text-main);
text-shadow: 0 0 20px var(--glass-glow);
}
.stat-value.red { color: var(--accent-red); text-shadow: 0 0 20px rgba(255, 0, 60, 0.4); }
.stat-value.green { color: var(--accent-green); text-shadow: 0 0 20px rgba(0, 255, 136, 0.4); }
.stat-value.cyan { color: var(--accent-cyan); text-shadow: 0 0 20px rgba(0, 243, 255, 0.4); }
/* Table Premium */
.glass-table {
width: 100%;
border-collapse: collapse;
margin-top: 25px;
}
.glass-table th, .glass-table td {
padding: 20px;
text-align: left;
border-bottom: 1px solid var(--table-border-light);
}
.glass-table th {
font-family: 'JetBrains Mono', monospace;
color: var(--text-muted);
font-weight: 600;
text-transform: uppercase;
font-size: 0.75rem;
letter-spacing: 2px;
border-bottom: 1px solid var(--glass-border);
}
.glass-table tr:hover {
background: var(--hover-bg);
}
.badge {
font-family: 'JetBrains Mono', monospace;
padding: 6px 12px;
border-radius: 4px;
font-size: 0.75rem;
font-weight: 700;
letter-spacing: 1px;
text-transform: uppercase;
border: 1px solid;
}
.badge.active {
background: rgba(0, 255, 136, 0.05);
color: var(--accent-green);
border-color: rgba(0, 255, 136, 0.3);
box-shadow: 0 0 10px rgba(0, 255, 136, 0.1);
}
.badge.revoked {
background: rgba(255, 0, 60, 0.05);
color: var(--accent-red);
border-color: rgba(255, 0, 60, 0.3);
box-shadow: 0 0 10px rgba(255, 0, 60, 0.1);
}
/* Animations */
@keyframes pulseGlow {
0% { box-shadow: 0 0 0 0 rgba(0, 243, 255, 0.4); }
70% { box-shadow: 0 0 0 10px rgba(0, 243, 255, 0); }
100% { box-shadow: 0 0 0 0 rgba(0, 243, 255, 0); }
}
.live-indicator {
display: inline-block;
width: 10px;
height: 10px;
background-color: var(--accent-cyan);
border-radius: 50%;
margin-right: 12px;
animation: pulseGlow 2s infinite;
}
.live-indicator.dead {
background-color: var(--accent-red);
animation: none;
box-shadow: 0 0 15px var(--accent-red);
}
@@ -0,0 +1,151 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { useState } from 'react';
import { useAuth } from '../context/AuthContext';
import DashboardOverview from '../components/DashboardOverview';
import TenantArchitect from '../components/TenantArchitect';
import OuroborosCanvas from '../components/OuroborosCanvas';
import DangerModal from '../components/DangerModal';
import CommercialTiers from '../components/CommercialTiers';
import ModulePricingMatrix from '../components/ModulePricingMatrix';
import OmniBillingOrchestrator from '../components/OmniBillingOrchestrator';
import UniversalTopbar from '../components/UniversalTopbar';
import { CommercialProvider } from '../context/CommercialContext';
import { IamPolicyProvider } from '../context/IamPolicyContext';
import IamArchitect from '../components/IamArchitect';
import SecurityEnclave from '../components/SecurityEnclave';
import CreatorsMark from '../components/CreatorsMark';
import ModuleManager from '../components/ModuleManager';
import BridgeManager from '../components/BridgeManager';
import TenantModuleMatrix from '../components/TenantModuleMatrix';
import TenantMonitor from '../components/TenantMonitor';
export default function SupremeDashboard() {
const [activeTab, setActiveTab] = useState('overview');
const { logout } = useAuth();
const [ignitedLocally, setIgnitedLocally] = useState(false);
const [isModalOpen, setIsModalOpen] = useState(false);
const handleIgniteClick = () => setIsModalOpen(true);
const executeIgnition = async () => {
setIsModalOpen(false);
try {
setIgnitedLocally(true);
await fetch('/api/v1/ouroboros/ignite', { method: 'POST' });
} catch (e) {
console.error(e);
}
};
const cancelIgnition = () => setIsModalOpen(false);
const showOuroboros = ignitedLocally;
return (
<CommercialProvider>
<IamPolicyProvider>
<DangerModal
isOpen={isModalOpen}
title="OUROBOROS KILL-SWITCH"
message="Anda akan mengaktifkan Ouroboros Kill-Switch. Seluruh modul Komersial akan dimatikan secara instan dan semua sesi klien akan dihancurkan. Eksekusi protokol absolut ini?"
onConfirm={executeIgnition}
onCancel={cancelIgnition}
confirmText="INITIATE ANNIHILATION"
/>
{showOuroboros && <OuroborosCanvas />}
<div className="app-container supreme-theme" style={{paddingTop: '50px'}}>
<UniversalTopbar />
<nav className="sidebar">
<div className="brand">
XCU <span className="text-cyan">ULTRA</span>
<div style={{fontSize: '0.6rem', color: '#ff003c', letterSpacing: '2px', marginTop: '5px'}}>SUPREME COMMAND</div>
</div>
<div className={`nav-link ${activeTab === 'overview' ? 'active' : ''}`} onClick={() => setActiveTab('overview')}>
Supreme's Eye
</div>
<div className={`nav-link ${activeTab === 'tenant' ? 'active' : ''}`} onClick={() => setActiveTab('tenant')}>
Global Tenant Matrix
</div>
<div className={`nav-link ${activeTab === 'commercial' ? 'active' : ''}`} onClick={() => setActiveTab('commercial')}>
Commercial Tiers
</div>
<div className={`nav-link ${activeTab === 'module-pricing' ? 'active' : ''}`} onClick={() => setActiveTab('module-pricing')}>
A La Carte Pricing
</div>
<div className={`nav-link ${activeTab === 'security' ? 'active' : ''}`} onClick={() => setActiveTab('security')}>
Security Enclave
</div>
<div className={`nav-link ${activeTab === 'billing-nexus' ? 'active' : ''}`} onClick={() => setActiveTab('billing-nexus')} style={{borderBottom: '1px solid var(--table-border-light)', paddingBottom: '15px'}}>
Omni-Billing Nexus
</div>
<div className={`nav-link ${activeTab === 'module-registry' ? 'active' : ''}`} onClick={() => setActiveTab('module-registry')} style={{color: 'var(--accent-cyan)'}}>
⬡ Module Registry
</div>
<div className={`nav-link ${activeTab === 'bridge-control' ? 'active' : ''}`} onClick={() => setActiveTab('bridge-control')} style={{color: 'var(--accent-green)'}}>
⇄ Bridge Control
</div>
<div className={`nav-link ${activeTab === 'module-matrix' ? 'active' : ''}`} onClick={() => setActiveTab('module-matrix')} style={{color: 'var(--accent-purple)', borderBottom: '1px solid var(--table-border-light)', paddingBottom: '15px'}}>
⬡ Module Matrix
</div>
<div className={`nav-link ${activeTab === 'iam-architect' ? 'active' : ''}`} onClick={() => setActiveTab('iam-architect')}>
IAM Architect Matrix
</div>
<div className={`nav-link ${activeTab === 'tenant-monitor' ? 'active' : ''}`} onClick={() => setActiveTab('tenant-monitor')} style={{color: 'var(--accent-cyan)', borderBottom: '1px solid var(--table-border-light)', paddingBottom: '15px'}}>
📡 Tenant Monitor
</div>
<div className={`nav-link ${activeTab === 'creators-mark' ? 'active' : ''}`} onClick={() => setActiveTab('creators-mark')}>
The Creator's Mark (About)
</div>
<div className="nav-link text-red" onClick={handleIgniteClick}>
Kill-Switch Protocol
</div>
<div style={{marginTop: 'auto'}}>
<button className="btn-primary" style={{width: '100%', background: 'transparent', border: '1px solid var(--text-muted)', color: 'var(--text-main)'}} onClick={logout}>
LOGOUT SUPREME
</button>
</div>
</nav>
<main className="main-content">
<header className="topbar">
<h1 className="page-title">
{activeTab === 'overview' && 'GLOBAL OPERATIONS MATRIX'}
{activeTab === 'tenant' && 'TENANT CONTROL GATEWAY'}
{activeTab === 'commercial' && 'COMMERCIAL PACKAGES & BILLING'}
{activeTab === 'module-pricing' && 'DECENTRALIZED MODULE PRICING'}
{activeTab === 'security' && 'SECURITY ENCLAVE & MFA CONFIGURATION'}
{activeTab === 'billing-nexus' && 'OMNI-BILLING NEXUS & NOTIFICATIONS'}
{activeTab === 'module-registry' && 'SOVEREIGN MODULE REGISTRY'}
{activeTab === 'bridge-control' && 'BRIDGE CONTROL — ONE-WAY PUSH'}
{activeTab === 'module-matrix' && 'MODULE ACCESS MATRIX (ALL 99)'}
{activeTab === 'iam-architect' && 'IAM ARCHITECT MATRIX'}
{activeTab === 'tenant-monitor' && 'TENANT MONITOR — LIVE INFRASTRUCTURE'}
{activeTab === 'creators-mark' && 'QUANTUM OMNI-SIGNATURE'}
</h1>
<div className="user-profile">
<span className="badge active">SUPREME ADMIN</span>
</div>
</header>
<div className="dashboard-content">
{activeTab === 'overview' && <DashboardOverview />}
{activeTab === 'tenant' && <TenantArchitect />}
{activeTab === 'commercial' && <CommercialTiers />}
{activeTab === 'module-pricing' && <ModulePricingMatrix />}
{activeTab === 'security' && <SecurityEnclave />}
{activeTab === 'billing-nexus' && <OmniBillingOrchestrator />}
{activeTab === 'module-registry' && <ModuleManager />}
{activeTab === 'bridge-control' && <BridgeManager />}
{activeTab === 'module-matrix' && <TenantModuleMatrix allowedModules={'supreme'} />}
{activeTab === 'iam-architect' && <IamArchitect />}
{activeTab === 'tenant-monitor' && <TenantMonitor />}
{activeTab === 'creators-mark' && <CreatorsMark />}
</div>
</main>
</div>
</IamPolicyProvider>
</CommercialProvider>
);
}
@@ -0,0 +1,281 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { useState, useEffect, useRef } from 'react';
import { useAuth } from '../context/AuthContext';
import { useIam } from '../context/IamContext';
import { useI18n } from '../context/I18nContext';
import TenantBillingStats from '../components/TenantBillingStats';
import NotificationMatrix from '../components/NotificationMatrix';
import UniversalTopbar from '../components/UniversalTopbar';
import { useModuleRegistry } from '../context/ModuleRegistryContext';
import { useCommercial } from '../context/CommercialContext';
import { IamPolicyProvider } from '../context/IamPolicyContext';
import SecurityEnclave from '../components/SecurityEnclave';
import CreatorsMark from '../components/CreatorsMark';
import ShapeshiftingRouter from '../components/ShapeshiftingRouter';
import TenantModuleMatrix from '../components/TenantModuleMatrix';
// Spectacular Kinetic Terminal Component
function KineticTerminal({ moduleId }) {
const [logs, setLogs] = useState([]);
const bottomRef = useRef(null);
useEffect(() => {
// Reset logs when module changes
setLogs([`[INIT] Bootstrapping Protocol for Omni-Engine Module ${moduleId}...`]);
let lineCount = 1;
const interval = setInterval(() => {
const operations = [
"Handshake established with XCU Edge Node SG-1",
"QUIC UDP Tunnel open. Latency: 4ms",
"Synchronizing cryptographic lattice key...",
"Bypassing TCP congestion control...",
"Verifying Neural Sub-system... OK",
"Packet drop rate: 0.00%",
"Awaiting kinetic instruction...",
"Validating telemetry hash..."
];
const randomOp = operations[Math.floor(Math.random() * operations.length)];
const timestamp = new Date().toISOString().split('T')[1].slice(0, -1);
setLogs(prev => {
const next = [...prev, `[${timestamp}] ${randomOp}`];
if (next.length > 50) return next.slice(next.length - 50); // Keep last 50
return next;
});
lineCount++;
}, 1200);
return () => clearInterval(interval);
}, [moduleId]);
useEffect(() => {
if (bottomRef.current) bottomRef.current.scrollIntoView({ behavior: 'smooth' });
}, [logs]);
return (
<div style={{
background: '#0a0a0a', border: '1px solid #333', borderRadius: '8px', padding: '15px',
fontFamily: 'monospace', color: '#00ff88', height: '300px', overflowY: 'auto',
boxShadow: 'inset 0 0 20px rgba(0,0,0,0.8)', marginTop: '20px'
}} className="custom-scrollbar">
{logs.map((log, i) => (
<div key={i} style={{marginBottom: '5px', fontSize: '0.8rem', opacity: i === logs.length - 1 ? 1 : 0.7}}>
{log}
</div>
))}
<div ref={bottomRef} />
</div>
);
}
export default function TenantDashboard() {
const { logout, cryptographicKey } = useAuth();
const { identity } = useIam();
const { t } = useI18n();
const { tiers } = useCommercial();
const { registry } = useModuleRegistry();
const [allowedModules, setAllowedModules] = useState([]);
const [activeTab, setActiveTab] = useState('');
const [isLoading, setIsLoading] = useState(true);
const [isRevoked, setIsRevoked] = useState(false);
useEffect(() => {
if (identity && identity.packages) {
if (identity.packages.length > 0) {
// Ekstrak nama paket menjadi daftar modul ID
let extractedModules = new Set();
identity.packages.forEach(pkgName => {
const matchedTier = tiers.find(t => t.name === pkgName || t.id === pkgName);
if (matchedTier && matchedTier.modules) {
matchedTier.modules.forEach(m => extractedModules.add(m));
} else {
extractedModules.add(pkgName);
}
});
setAllowedModules(Array.from(extractedModules));
setActiveTab('overview');
setIsRevoked(false);
} else {
setIsRevoked(true);
}
} else {
setIsRevoked(true);
}
setIsLoading(false);
}, [identity, tiers]);
if (isLoading) {
return <div style={{width: '100vw', height: '100vh', background: '#05030a', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#a855f7', fontFamily: 'monospace'}}>ABSORBING TENANT MATRIX...</div>;
}
if (isRevoked) {
return (
<div style={{width: '100vw', height: '100vh', background: '#1a0000', display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', color: '#ff003c', fontFamily: 'monospace', textAlign: 'center'}}>
<h1 style={{fontSize: '3rem', marginBottom: '20px'}}>AKSES KOMERSIAL DICABUT</h1>
<p style={{fontSize: '1.2rem', marginBottom: '40px', maxWidth: '600px'}}>Kunci Kriptografi Anda telah dinonaktifkan oleh Supreme Admin atau masa berlaku telah habis. Semua fungsi WebRTC QUIC dan Matriks Penagihan dikunci mati.</p>
<button className="btn-primary" style={{background: 'transparent', border: '1px solid #ff003c', color: '#ff003c'}} onClick={logout}>
KEMBALI KE GERBANG MASUK
</button>
</div>
);
}
// Dynamic mapping helper
const getModuleDetails = (modId) => {
if (modId === 'm21') return { id: 'm21', name: 'Billing & Quota Matrix', color: '#ffea00' };
if (modId === 'support_tickets') return { id: 'support_tickets', name: 'Supreme Support Channel', color: '#888' };
for (let coreKey in registry) {
const found = registry[coreKey].modules.find(m => m.id === modId);
if (found) return { id: found.id, name: found.name, color: '#00f3ff' }; // default color for real modules
}
return { id: modId, name: `Unknown Module ${modId}`, color: '#ff003c' };
};
const activeMod = activeTab ? getModuleDetails(activeTab) : null;
return (
<IamPolicyProvider>
<div className="app-container tenant-theme" style={{paddingTop: '50px'}}>
<UniversalTopbar />
<nav className="sidebar tenant-sidebar">
<div className="brand" style={{color: 'var(--text-main)'}}>
{identity.username || 'TENANT CLIENT'}
<div style={{fontSize: '0.6rem', color: 'var(--accent-purple)', letterSpacing: '2px', marginTop: '5px'}}>COMMERCIAL GATEWAY</div>
</div>
<div
className={`nav-link ${activeTab === 'overview' ? 'active' : ''}`}
onClick={() => setActiveTab('overview')}
style={{borderBottom: '1px solid var(--table-border)', paddingBottom: '15px', marginBottom: '15px'}}
>
{t('overview_matrix')}
</div>
<div
className={`nav-link ${activeTab === 'module-matrix' ? 'active' : ''}`}
onClick={() => setActiveTab('module-matrix')}
>
Module Matrix
</div>
<div
className={`nav-link ${activeTab === 'notifications' ? 'active' : ''}`}
onClick={() => setActiveTab('notifications')}
>
Omni-Messenger Prefs
</div>
<div
className={`nav-link ${activeTab === 'security-enclave' ? 'active' : ''}`}
onClick={() => setActiveTab('security-enclave')}
style={{borderBottom: '1px solid var(--table-border)', paddingBottom: '15px', marginBottom: '15px'}}
>
Security Enclave
</div>
<div
className={`nav-link ${activeTab === 'creators-mark' ? 'active' : ''}`}
onClick={() => setActiveTab('creators-mark')}
style={{borderBottom: '1px solid var(--table-border)', paddingBottom: '15px', marginBottom: '15px', color: 'var(--accent-purple)'}}
>
System Genesis (About)
</div>
{/* Dynamic Sidebar Mapping */}
<div className="custom-scrollbar" style={{overflowY: 'auto', flex: 1, paddingRight: '5px', marginBottom: '20px'}}>
{allowedModules.map(modId => {
const modInfo = getModuleDetails(modId);
return (
<div
key={modId}
className={`nav-link ${activeTab === modId ? 'active' : ''}`}
onClick={() => setActiveTab(modId)}
>
{modInfo.name}
</div>
);
})}
</div>
<div style={{marginTop: 'auto'}}>
<button className="btn-primary" style={{width: '100%', background: 'transparent', border: '1px solid rgba(168, 85, 247, 0.5)', color: 'var(--accent-purple)'}} onClick={logout}>
LOGOUT TENANT
</button>
</div>
</nav>
<main className="main-content">
<header className="topbar">
<h1 className="page-title" style={{color: 'var(--text-main)', textTransform: 'uppercase'}}>
{activeTab === 'overview' ? 'CORE DASHBOARD' : activeTab === 'module-matrix' ? 'MODULE ACCESS MATRIX' : activeTab === 'notifications' ? 'OMNI-MESSENGER PREFERENCES' : activeTab === 'security-enclave' ? 'SECURITY ENCLAVE' : activeTab === 'creators-mark' ? 'SYSTEM GENESIS' : (activeMod ? activeMod.name : 'DASHBOARD')}
</h1>
<div className="user-profile">
<span className="badge active" style={{background: 'rgba(168, 85, 247, 0.1)', color: 'var(--accent-purple)', borderColor: 'var(--accent-purple)'}}>
COMMERCIAL PLAN: {(() => {
const activeTier = tiers.find(t =>
t.modules.every(m => allowedModules.includes(m)) && allowedModules.length === t.modules.length
);
return activeTier ? activeTier.name.toUpperCase() : 'CUSTOM A LA CARTE';
})()}
</span>
</div>
</header>
<div className="dashboard-content">
{activeTab === 'overview' ? (
<TenantBillingStats />
) : activeTab === 'module-matrix' ? (
<TenantModuleMatrix allowedModules={allowedModules} />
) : activeTab === 'notifications' ? (
<NotificationMatrix />
) : activeTab === 'security-enclave' ? (
<SecurityEnclave />
) : activeTab === 'creators-mark' ? (
<CreatorsMark />
) : activeTab === 'm21' ? (
<TenantBillingStats />
) : activeTab === 'support_tickets' ? (
<div className="glass-panel" style={{padding: '30px', textAlign: 'center'}}>
<h2>Contact Supreme Administration</h2>
<p style={{color: 'var(--text-muted)'}}>Ticketing portal is currently handled via encrypted channel.</p>
</div>
) : (
<div style={{animation: 'fadeIn 0.5s ease-out'}}>
{/* Spectacular Module Orchestration Panel */}
<div style={{display: 'flex', gap: '20px', marginBottom: '20px'}}>
<div className="glass-panel" style={{flex: 1, padding: '20px', borderLeft: '4px solid var(--accent-green)'}}>
<h3 style={{color: 'var(--text-muted)', fontSize: '0.8rem', marginBottom: '10px'}}>INTEGRATION STATUS</h3>
<div style={{color: 'var(--accent-green)', fontSize: '1.5rem', fontWeight: 'bold', fontFamily: 'monospace'}}>ONLINE / ACTIVE</div>
<div style={{color: 'var(--text-muted)', fontSize: '0.8rem', marginTop: '10px'}}>Latency: 4ms | Packet Drop: 0%</div>
</div>
<div className="glass-panel" style={{flex: 2, padding: '20px', borderLeft: '4px solid var(--accent-purple)'}}>
<h3 style={{color: 'var(--text-muted)', fontSize: '0.8rem', marginBottom: '10px'}}>LIVE ENDPOINT CONNECTION</h3>
<div style={{
background: 'var(--hover-bg)', padding: '10px', borderRadius: '4px',
color: 'var(--accent-purple)', fontFamily: 'monospace', fontSize: '0.9rem',
border: '1px solid var(--glass-border)'
}}>
wss://{window.location.hostname}:8443/v1/matrix?mod={activeTab}
</div>
</div>
</div>
<div className="glass-panel" style={{padding: '30px', borderColor: 'var(--accent-purple)'}}>
<p style={{color: 'var(--text-muted)'}}>
Anda sedang mengakses kontrol absolut untuk modul {activeTab}. Semua jalur data Anda dienkripsi berlapis
menggunakan *Post-Quantum Lattice Shield*. Jangan memutuskan koneksi secara tiba-tiba.
</p>
<ShapeshiftingRouter moduleId={activeTab} />
</div>
</div>
)}
</div>
</main>
</div>
</IamPolicyProvider>
);
}
@@ -0,0 +1,36 @@
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.jsx'
import { IamProvider } from './context/IamContext.jsx'
import { I18nProvider } from './context/I18nContext.jsx'
import { CurrencyProvider } from './context/CurrencyContext.jsx'
import { CommercialProvider } from './context/CommercialContext.jsx'
import { AuthProvider } from './context/AuthContext.jsx'
import { WasmProvider } from './context/WasmContext.jsx'
import { ThemeProvider } from './context/ThemeContext.jsx'
import { ModuleRegistryProvider } from './context/ModuleRegistryContext.jsx'
createRoot(document.getElementById('root')).render(
<StrictMode>
<ThemeProvider>
<WasmProvider>
<AuthProvider>
<I18nProvider>
<CurrencyProvider>
<CommercialProvider>
<ModuleRegistryProvider>
<IamProvider>
<App />
</IamProvider>
</ModuleRegistryProvider>
</CommercialProvider>
</CurrencyProvider>
</I18nProvider>
</AuthProvider>
</WasmProvider>
</ThemeProvider>
</StrictMode>,
)
@@ -0,0 +1,2 @@
// Generated automatically by Antigravity UID Engine
export const SYSTEM_VERSION = "Ver.TSM.19:26:00.07:05:2026.F89A";
@@ -0,0 +1,7 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
})