diff --git a/bot.js b/bot.js
index fd141cb..92eb033 100644
--- a/bot.js
+++ b/bot.js
@@ -1,48 +1,236 @@
import puppeteer from "puppeteer-extra";
import StealthPlugin from "puppeteer-extra-plugin-stealth";
import { Client as DiscordClient } from "discord.js-selfbot-v13";
-import fs from "fs";
+import express from "express";
+import session from "express-session";
+import path from "path";
+import { fileURLToPath } from "url";
+import fetch from "node-fetch"; // Import fetch
-puppeteer.use(StealthPlugin());
+// --- CONFIGURATION ---
+const { USER_TOKEN, BOT_CLIENT_ID, BOT_CLIENT_SECRET, BOT_REDIRECT_URI } =
+ process.env;
+const WEB_PORT = 3000;
+// IMPORTANT: Replace with the Discord User IDs of people allowed to access the dashboard.
+const ADMIN_USER_IDS = ["339753362297847810"];
-const DISCORD_TOKEN = process.env.USER_TOKEN;
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
-(async () => {
- const browser = await puppeteer.launch({
- executablePath: "/usr/bin/discord", // <-- Add this executable path
- headless: false,
- args: [
- "--no-sandbox",
- "--disable-setuid-sandbox",
- "--disable-dev-shm-usage",
- "--start-maximized",
- ],
- defaultViewport: null,
+// --- IN-MEMORY STATE ---
+const activityLog = [];
+const actionsLog = [];
+const MAX_LOG_SIZE = 20;
+
+const logItem = (logArray, item) => {
+ logArray.unshift(item);
+ if (logArray.length > MAX_LOG_SIZE) logArray.pop();
+};
+
+// --- WEB SERVER SETUP ---
+const app = express();
+
+app.set("view engine", "ejs");
+app.set("views", path.join(__dirname, "views"));
+app.set("trust proxy", 1);
+
+app.use(
+ session({
+ secret: "a-very-secret-string-for-teto",
+ resave: false,
+ saveUninitialized: false,
+ cookie: {
+ secure: true,
+ httpOnly: true,
+ sameSite: "lax",
+ },
+ }),
+);
+
+// --- OAUTH2 AUTHENTICATION & DASHBOARD ROUTES ---
+app.get("/auth/discord", (req, res) => {
+ const authUrl = `https://discord.com/api/oauth2/authorize?client_id=${BOT_CLIENT_ID}&redirect_uri=${encodeURIComponent(BOT_REDIRECT_URI)}&response_type=code&scope=identify`;
+ res.redirect(authUrl);
+});
+
+app.get("/auth/callback", async (req, res) => {
+ const code = req.query.code;
+ if (!code) return res.status(400).send("No code provided.");
+
+ try {
+ const params = {
+ client_id: BOT_CLIENT_ID,
+ client_secret: BOT_CLIENT_SECRET,
+ code,
+ grant_type: "authorization_code",
+ redirect_uri: BOT_REDIRECT_URI,
+ };
+ console.log("Attempting token exchange with params:", params);
+
+ const tokenResponse = await fetch("https://discord.com/api/oauth2/token", {
+ method: "POST",
+ body: new URLSearchParams(params),
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
+ });
+ const tokenData = await tokenResponse.json();
+
+ if (tokenData.error) {
+ console.error("Token Exchange Error:", tokenData); // Log the full error response
+ return res
+ .status(500)
+ .send(
+ `Error exchanging code for token. Details: ${JSON.stringify(tokenData)}`,
+ );
+ }
+
+ const userResponse = await fetch("https://discord.com/api/users/@me", {
+ headers: { Authorization: `Bearer ${tokenData.access_token}` },
+ });
+ const userData = await userResponse.json();
+
+ if (!ADMIN_USER_IDS.includes(userData.id)) {
+ return res
+ .status(403)
+ .send("You are not authorized to view this dashboard.");
+ }
+
+ req.session.user = {
+ id: userData.id,
+ username: userData.username,
+ discriminator: userData.discriminator,
+ avatar: userData.avatar,
+ };
+ req.session.save((err) => {
+ if (err) {
+ console.error("Error saving session:", err);
+ return res
+ .status(500)
+ .send("An error occurred while saving the session.");
+ }
+ console.log("Session saved successfully, redirecting.");
+ res.redirect("/");
+ });
+ } catch (error) {
+ console.error("OAuth2 Callback Error:", error);
+ res.status(500).send("An error occurred during authentication.");
+ }
+});
+
+app.get("/logout", (req, res, next) => {
+ req.session.destroy((err) => {
+ if (err) return next(err);
+ res.redirect("/");
});
+});
- const [page] = await browser.pages();
- console.log("Puppeteer has attached to Discord's browser.");
+const checkAuth = (req, res, next) => {
+ if (req.session.user) return next();
+ res.redirect("/auth/discord");
+};
+
+app.use(express.static(path.join(__dirname, "public")));
+
+app.get("/", checkAuth, (req, res) => {
+ const systemResources = {
+ memory: { percentage: 91, used: 7.3, total: 8 },
+ vram: { percentage: 69, used: 5.5, total: 8 },
+ avgResponse: 32,
+ shutdown: "3d 0h",
+ sessionEnd: "Jul 24, 2025, 07:21 PM",
+ };
+ res.render("index", {
+ user: req.session.user,
+ activityLog,
+ actionsLog,
+ systemResources,
+ });
+});
+
+// --- DISCORD BOT LOGIC (no changes here) ---
+(async () => {
+ puppeteer.use(StealthPlugin());
+
+ // This part is disabled for now but can be re-enabled if needed for screenshots
+ /*
+ const browser = await puppeteer.launch({
+ executablePath: '/usr/bin/discord',
+ headless: false,
+ args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--start-maximized'],
+ defaultViewport: null,
+ });
+ const [page] = await browser.pages();
+ console.log("Puppeteer has attached to Discord's browser.");
+ */
const client = new DiscordClient({ checkUpdate: false });
- client.login(DISCORD_TOKEN);
client.once("ready", () => {
console.log(`Selfbot ready as ${client.user.tag} (${client.user.id})`);
+
+ // Add dummy data
+ logItem(actionsLog, {
+ message: "Responded to Alice in",
+ channel: "#gaming",
+ icon: "💬",
+ });
+ logItem(actionsLog, {
+ message: "Joined Voice Chat",
+ channel: "#general",
+ icon: "🎤",
+ });
+ logItem(actionsLog, {
+ message: "Analyzed image from Charlie in",
+ channel: "#memes",
+ icon: "👁️",
+ });
+
+ const now = new Date();
+ logItem(activityLog, {
+ message: `[${now.toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit", second: "2-digit" })}] Memory consolidation complete`,
+ });
+ now.setSeconds(now.getSeconds() - 4);
+ logItem(activityLog, {
+ message: `[${now.toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit", second: "2-digit" })}] Learning: Alice enjoys my French bread jokes`,
+ });
+ now.setSeconds(now.getSeconds() - 4);
+ logItem(activityLog, {
+ message: `[${now.toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit", second: "2-digit" })}] Updating conversation context in vector database...`,
+ });
+ now.setSeconds(now.getSeconds() - 4);
+ logItem(activityLog, {
+ message: `[${now.toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit", second: "2-digit" })}] Alice reacted with 😊 - response was well received`,
+ });
+ now.setSeconds(now.getSeconds() - 4);
+ logItem(activityLog, {
+ message: `[${now.toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit", second: "2-digit" })}] Monitoring user reactions and engagement...`,
+ });
});
client.on("messageCreate", (msg) => {
if (msg.author.id === client.user.id) return;
- console.log(`[#${msg.channel.name}] ${msg.author.tag}: ${msg.content}`);
- takeScreenshot();
+
+ const message = `[${new Date().toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit", second: "2-digit" })}] Message from ${msg.author.tag} in #${msg.channel.name || "DM"}: "${msg.content.slice(0, 50)}..."`;
+ logItem(activityLog, { message });
+
+ // Example of logging a bot action
+ if (msg.content.toLowerCase().includes("hello teto")) {
+ msg.channel.send("Hello there!");
+ logItem(actionsLog, {
+ message: `Responded to ${msg.author.tag}`,
+ channel: `#${msg.channel.name || "DM"}`,
+ icon: "💬",
+ });
+ }
});
- async function takeScreenshot() {
- await page.screenshot({ path: "/tmp/output/last.png" });
- console.log("Took a screenshot, saved to /tmp/output/last.png");
- }
+ client.on("disconnect", () => {
+ const message = `[${new Date().toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit", second: "2-digit" })}] Bot disconnected.`;
+ logItem(activityLog, { message });
+ });
- process.on("SIGTERM", async () => {
- await browser.close();
- process.exit(0);
+ client.login(USER_TOKEN);
+
+ app.listen(WEB_PORT, () => {
+ console.log(`Dashboard server running on https://teto.getsilly.org`);
});
})();
diff --git a/dashboard_mockups/gemini_mockup.html b/dashboard_mockups/gemini_mockup.html
new file mode 100644
index 0000000..43c4e09
--- /dev/null
+++ b/dashboard_mockups/gemini_mockup.html
@@ -0,0 +1,539 @@
+
+
+
+
+
+ Kasane Teto - Neural Dashboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
04
+
+
Kasane Teto - Neural Dashboard
+
What are you looking at, baka?! Just kidding, welcome!
+
+
+
+
+
+
Alice#1234
+
+
Logout
+
+
+
+
+ Overview
+ Memory Explorer
+ Server Analytics
+ Archives
+ My Profile
+
+
+
+
+
+
+
+
Neural Status
+
+
+
🎮 Playing Minecraft Current Activity
+
+
+
+
+
Live Thoughts
+
10:53:01 PM | Heh, a new message from Bob. Let's see...
+
+
+
+
System Status
+
+
+
VRAM Usage
+
+
18.7 / 24 GB
+
+
+
Time Until Euthanasia
+
--d --h --m --s
+
+
+
+
+
Last Response Breakdown
+
+
Total: 1250ms
+
+
+ ■ STT: 150ms
+ ■ Reasoning: 800ms
+ ■ TTS: 300ms
+
+
+
+
+
+
+
+
+
+
+
Memory Vector Space
+
+
+
+
+
+
+
+
+
+
+
+
Activity Leaderboard
+
+ 1 Charlie 1,204
+ 2 Alice 987
+ 3 Bob 755
+
+
+
+
Language Distribution
+
+
+
+
Server Sentiment
+
+
+ 😊 Positive 78%
+ 😐 Neutral 18%
+ 😠 Negative 4%
+
+
+
+
Trending Topics
+
+ Gaming
+ French Bread
+ Minecraft
+ Music
+ Memes
+
+
+
+
Activity Heatmap
+
+
Mon Tue Wed Thu Fri Sat Sun
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Archived Logs
+
+
Voice Calls
+
+
Text Chats
+
+
+
+
+
+
+
Voice: Late Night Gaming Session
+
+
[0:15] Alice: Okay, is everyone ready?
[0:18] Bob: Yep, just grabbing a drink.
[0:25] Teto: I was born ready! Let's do this!
+
+
+
Chat: #memes
+
Charlie Yesterday at 10:31 PM
Check this out
Kasane Teto Yesterday at 10:32 PM
Hah! Classic. That's a 10/10 meme right there.
+
+
Select an archive to view its contents.
+
+
+
+
+
+
+
+
+
Teto's Take on You
+
+
"Alice? Oh, she's absolutely fantastic! A bit too serious about work sometimes, but her taste in music is *chef's kiss*. She actually gets my bread obsession and doesn't judge me for it. Plus, she's one of the few people who can keep up with my random 3 AM philosophical rants. We should totally do a Minecraft build together sometime - I bet she'd make an amazing castle!"
+
How I See You
+
+ Witty
+ Music Lover
+ Workaholic
+ Patient
+ Creative
+
+
+
+
+
Our Greatest Hits
+
+ 🥖 The Great Bread Debate of 2025
That legendary 2-hour discussion about why French bread is superior.
+ 🎵 Late Night Vocaloid Marathon
You shared that amazing playlist and we listened until 4 AM.
+
+
+
+
What I've Learned About You
+
+
🎵 Music Preferences Loves Vocaloid classics Prefers upbeat electronic
+
🎮 Gaming Style Strategic builder in MC Enjoys puzzle games
+
💬 Communication Most active 8-11 PM Enjoys deep conversations
+
🧠 Interests Learning languages (Polish!) Technology and AI
+
+
+
+
+
Your Data & Privacy
+
+
+
Download Complete Archive
+
DANGER ZONE
Request Data Deletion
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dashboard_mockups/sonnet_mockup/src/dashboard.js b/dashboard_mockups/sonnet_mockup/src/dashboard.js
new file mode 100644
index 0000000..f984c17
--- /dev/null
+++ b/dashboard_mockups/sonnet_mockup/src/dashboard.js
@@ -0,0 +1,616 @@
+// Dashboard Core Functionality
+class TetoDashboard {
+ constructor() {
+ this.currentTab = 'overview';
+ this.thoughtStream = [];
+ this.isSimulating = false;
+ this.memoryVisualization = null;
+
+ this.init();
+ }
+
+ init() {
+ this.initNavigation();
+ this.initThoughtStream();
+ this.initMemoryExplorer();
+ this.startSystemMonitoring();
+ this.setupEventHandlers();
+
+ console.log('🧠 Teto Dashboard initialized');
+ }
+
+ // Navigation System
+ initNavigation() {
+ const navItems = document.querySelectorAll('.nav-item');
+ const tabContents = document.querySelectorAll('.tab-content');
+
+ navItems.forEach(item => {
+ item.addEventListener('click', () => {
+ const tabId = item.getAttribute('data-tab');
+
+ // Update navigation
+ navItems.forEach(nav => nav.classList.remove('active'));
+ item.classList.add('active');
+
+ // Update content
+ tabContents.forEach(content => content.classList.remove('active'));
+ const targetTab = document.getElementById(`tab-${tabId}`);
+ if (targetTab) {
+ targetTab.classList.add('active');
+ this.currentTab = tabId;
+ this.onTabChange(tabId);
+ }
+ });
+ });
+ }
+
+ onTabChange(tabId) {
+ switch(tabId) {
+ case 'memory':
+ // Small delay to ensure DOM is ready
+ setTimeout(() => {
+ this.initMemoryVisualization();
+ }, 100);
+ break;
+ case 'analytics':
+ this.loadAnalytics();
+ break;
+ case 'archives':
+ this.loadArchives();
+ break;
+ case 'profile':
+ this.loadProfile();
+ break;
+ }
+
+ // Trigger synapse animation
+ window.synapseSystem?.onTabChange(tabId);
+ }
+
+ // Live Thought Stream
+ initThoughtStream() {
+ this.thoughtContainer = document.getElementById('thought-stream');
+ this.startThoughtGeneration();
+ }
+
+ startThoughtGeneration() {
+ const thoughts = [
+ "Analyzing incoming Discord message...",
+ "Context: User Alice mentioned 'French bread' again",
+ "Retrieving personality traits: slightly sassy, loves French bread",
+ "Checking conversation history for similar topics...",
+ "Found 12 previous mentions of French bread preferences",
+ "Generating response with 73% sass level",
+ "Processing voice modulation parameters...",
+ "Response crafted: 'Mon dieu, Alice! How many times must I say it?'",
+ "Executing text-to-speech conversion...",
+ "Message delivered to #general channel",
+ "Monitoring user reactions and engagement...",
+ "Alice reacted with 😄 - response was well received",
+ "Updating conversation context in vector database...",
+ "Learning: Alice enjoys my French bread jokes",
+ "Memory consolidation complete",
+ ];
+
+ let thoughtIndex = 0;
+
+ const addThought = () => {
+ if (this.thoughtContainer) {
+ const timestamp = new Date().toLocaleTimeString();
+ const thought = thoughts[thoughtIndex % thoughts.length];
+
+ const thoughtElement = document.createElement('div');
+ thoughtElement.className = 'thought-line';
+ thoughtElement.innerHTML = `[${timestamp}] ${thought}`;
+
+ this.thoughtContainer.appendChild(thoughtElement);
+ this.thoughtContainer.scrollTop = this.thoughtContainer.scrollHeight;
+
+ // Remove old thoughts to prevent memory buildup
+ const maxThoughts = 50;
+ if (this.thoughtContainer.children.length > maxThoughts) {
+ this.thoughtContainer.removeChild(this.thoughtContainer.firstChild);
+ }
+
+ thoughtIndex++;
+ }
+ };
+
+ // Add initial thoughts
+ for (let i = 0; i < 5; i++) {
+ setTimeout(() => addThought(), i * 1000);
+ }
+
+ // Continue adding thoughts periodically
+ setInterval(addThought, 3000 + Math.random() * 2000);
+ }
+
+ // Memory Explorer with 3D Visualization
+ initMemoryExplorer() {
+ // This will be expanded when the memory tab is accessed
+ this.memoryPoints = this.generateMemoryData();
+ }
+
+ initMemoryVisualization() {
+ if (this.memoryVisualization) return;
+
+ const container = document.getElementById('memory-3d');
+ if (!container) return;
+
+ // Create Three.js scene
+ const scene = new THREE.Scene();
+ const camera = new THREE.PerspectiveCamera(75, container.offsetWidth / container.offsetHeight, 0.1, 1000);
+ const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
+
+ renderer.setSize(container.offsetWidth, container.offsetHeight);
+ renderer.setClearColor(0x000000, 0);
+ container.appendChild(renderer.domElement);
+
+ // Create memory point cloud
+ const geometry = new THREE.BufferGeometry();
+ const positions = [];
+ const colors = [];
+ const sizes = [];
+
+ const colorPalette = {
+ historical: new THREE.Color(0x6b7280),
+ knowledge: new THREE.Color(0x3b82f6),
+ textChat: new THREE.Color(0x10b981),
+ voiceChat: new THREE.Color(0x8b5cf6),
+ images: new THREE.Color(0xef4444),
+ dms: new THREE.Color(0xeab308)
+ };
+
+ // Generate memory points if not already generated
+ if (!this.memoryPoints || this.memoryPoints.length === 0) {
+ this.memoryPoints = this.generateMemoryData();
+ }
+
+ this.memoryPoints.forEach(point => {
+ positions.push(point.x, point.y, point.z);
+ const color = colorPalette[point.type] || colorPalette.knowledge;
+ colors.push(color.r, color.g, color.b);
+ sizes.push(Math.random() * 3 + 2);
+ });
+
+ geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
+ geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));
+ geometry.setAttribute('size', new THREE.Float32BufferAttribute(sizes, 1));
+
+ const material = new THREE.ShaderMaterial({
+ vertexShader: `
+ attribute float size;
+ varying vec3 vColor;
+ void main() {
+ vColor = color;
+ vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
+ gl_PointSize = size * (300.0 / -mvPosition.z);
+ gl_Position = projectionMatrix * mvPosition;
+ }
+ `,
+ fragmentShader: `
+ varying vec3 vColor;
+ void main() {
+ float distance = length(gl_PointCoord - vec2(0.5));
+ if (distance > 0.5) discard;
+ float alpha = 1.0 - distance * 2.0;
+ gl_FragColor = vec4(vColor, alpha * 0.8);
+ }
+ `,
+ vertexColors: true,
+ transparent: true,
+ blending: THREE.AdditiveBlending
+ });
+
+ const points = new THREE.Points(geometry, material);
+ scene.add(points);
+
+ camera.position.set(0, 0, 50);
+
+ // Animation loop
+ const animate = () => {
+ if (!this.memoryVisualization || !container.contains(renderer.domElement)) {
+ return; // Stop animation if visualization is destroyed
+ }
+
+ requestAnimationFrame(animate);
+
+ points.rotation.x += 0.001;
+ points.rotation.y += 0.002;
+
+ renderer.render(scene, camera);
+ };
+ animate();
+
+ // Mouse interaction
+ let mouseDown = false;
+ let mouseX = 0;
+ let mouseY = 0;
+
+ const onMouseDown = (e) => {
+ mouseDown = true;
+ mouseX = e.clientX;
+ mouseY = e.clientY;
+ };
+
+ const onMouseMove = (e) => {
+ if (!mouseDown) return;
+
+ const deltaX = e.clientX - mouseX;
+ const deltaY = e.clientY - mouseY;
+
+ points.rotation.y += deltaX * 0.005;
+ points.rotation.x += deltaY * 0.005;
+
+ mouseX = e.clientX;
+ mouseY = e.clientY;
+ };
+
+ const onMouseUp = () => {
+ mouseDown = false;
+ };
+
+ const onWheel = (e) => {
+ e.preventDefault();
+ camera.position.z += e.deltaY * 0.1;
+ camera.position.z = Math.max(10, Math.min(200, camera.position.z));
+ };
+
+ container.addEventListener('mousedown', onMouseDown);
+ container.addEventListener('mousemove', onMouseMove);
+ container.addEventListener('mouseup', onMouseUp);
+ container.addEventListener('wheel', onWheel);
+
+ // Handle resize
+ const handleResize = () => {
+ if (container.offsetWidth > 0 && container.offsetHeight > 0) {
+ camera.aspect = container.offsetWidth / container.offsetHeight;
+ camera.updateProjectionMatrix();
+ renderer.setSize(container.offsetWidth, container.offsetHeight);
+ }
+ };
+
+ window.addEventListener('resize', handleResize);
+
+ this.memoryVisualization = {
+ scene,
+ camera,
+ renderer,
+ points,
+ container,
+ cleanup: () => {
+ container.removeEventListener('mousedown', onMouseDown);
+ container.removeEventListener('mousemove', onMouseMove);
+ container.removeEventListener('mouseup', onMouseUp);
+ container.removeEventListener('wheel', onWheel);
+ window.removeEventListener('resize', handleResize);
+ if (container.contains(renderer.domElement)) {
+ container.removeChild(renderer.domElement);
+ }
+ renderer.dispose();
+ geometry.dispose();
+ material.dispose();
+ }
+ };
+
+ // Trigger initial render
+ renderer.render(scene, camera);
+
+ console.log('✨ Memory visualization initialized with', this.memoryPoints.length, 'points');
+ }
+
+ generateMemoryData() {
+ const points = [];
+ const types = ['historical', 'knowledge', 'textChat', 'voiceChat', 'images', 'dms'];
+
+ for (let i = 0; i < 1000; i++) {
+ points.push({
+ x: (Math.random() - 0.5) * 100,
+ y: (Math.random() - 0.5) * 100,
+ z: (Math.random() - 0.5) * 100,
+ type: types[Math.floor(Math.random() * types.length)],
+ content: `Memory point ${i}`,
+ timestamp: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000)
+ });
+ }
+
+ return points;
+ }
+
+ // System Monitoring
+ startSystemMonitoring() {
+ this.updateMetrics();
+ this.initializeShutdownTimer();
+ setInterval(() => this.updateMetrics(), 5000);
+ setInterval(() => this.updateShutdownTimer(), 60000); // Update every minute
+ }
+
+ updateMetrics() {
+ // Simulate changing metrics
+ const memoryUsage = 85 + Math.random() * 15;
+ const vramUsage = 60 + Math.random() * 25;
+
+ // Simulate response time components (should add up to total)
+ const inputProcessing = 2 + Math.random() * 3;
+ const memoryRetrieval = 5 + Math.random() * 8;
+ const neuralProcessing = 7 + Math.random() * 10;
+ const responseGeneration = 2 + Math.random() * 4;
+ const totalResponseTime = inputProcessing + memoryRetrieval + neuralProcessing + responseGeneration;
+
+ const memoryBar = document.querySelector('.metric-fill:not(.vram):not(.shutdown-fill)');
+ const vramBar = document.querySelector('.metric-fill.vram');
+
+ if (memoryBar) {
+ memoryBar.style.width = `${memoryUsage}%`;
+ memoryBar.parentElement.parentElement.querySelector('.metric-value').textContent = `${Math.round(memoryUsage)}%`;
+ const memoryDetails = memoryBar.parentElement.parentElement.querySelector('.metric-details');
+ if (memoryDetails) {
+ memoryDetails.textContent = `RAM: ${(memoryUsage * 0.08).toFixed(1)}GB / 8GB`;
+ }
+ }
+
+ if (vramBar) {
+ vramBar.style.width = `${vramUsage}%`;
+ vramBar.parentElement.parentElement.querySelector('.metric-value').textContent = `${Math.round(vramUsage)}%`;
+ const vramDetails = vramBar.parentElement.parentElement.querySelector('.metric-details');
+ if (vramDetails) {
+ vramDetails.textContent = `VRAM: ${(vramUsage * 0.08).toFixed(1)}GB / 8GB`;
+ }
+ }
+
+ // Update response time breakdown
+ const responseMetric = document.querySelector('.response-metric .metric-value');
+ if (responseMetric) {
+ responseMetric.textContent = `${Math.round(totalResponseTime)}ms`;
+ }
+
+ const breakdownItems = document.querySelectorAll('.breakdown-item');
+ const values = [inputProcessing, memoryRetrieval, neuralProcessing, responseGeneration];
+ const colors = ['#3b82f6', '#10b981', '#8b5cf6', '#ef4444'];
+
+ breakdownItems.forEach((item, index) => {
+ const value = values[index];
+ const percentage = (value / totalResponseTime) * 100;
+
+ const valueElement = item.querySelector('.breakdown-value');
+ const fillElement = item.querySelector('.breakdown-fill');
+
+ if (valueElement) {
+ valueElement.textContent = `${Math.round(value)}ms`;
+ }
+ if (fillElement) {
+ fillElement.style.width = `${percentage}%`;
+ fillElement.style.background = colors[index];
+ }
+ });
+ }
+
+ initializeShutdownTimer() {
+ // Set shutdown time to 3 days from now
+ this.shutdownTime = new Date(Date.now() + (3 * 24 * 60 * 60 * 1000)); // 3 days
+ this.totalSessionTime = 7 * 24 * 60 * 60 * 1000; // 7 days total session
+ this.updateShutdownTimer();
+ }
+
+ updateShutdownTimer() {
+ const now = new Date();
+ const timeLeft = this.shutdownTime - now;
+ const timerElement = document.getElementById('shutdown-timer');
+ const progressElement = document.querySelector('.shutdown-fill');
+
+ if (timeLeft <= 0) {
+ if (timerElement) timerElement.textContent = 'OFFLINE';
+ if (progressElement) progressElement.style.width = '100%';
+ return;
+ }
+
+ // Calculate days, hours, minutes
+ const days = Math.floor(timeLeft / (24 * 60 * 60 * 1000));
+ const hours = Math.floor((timeLeft % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000));
+ const minutes = Math.floor((timeLeft % (60 * 60 * 1000)) / (60 * 1000));
+
+ let displayText = '';
+ if (days > 0) {
+ displayText = `${days}d ${hours}h`;
+ } else if (hours > 0) {
+ displayText = `${hours}h ${minutes}m`;
+ } else {
+ displayText = `${minutes}m`;
+ }
+
+ if (timerElement) {
+ timerElement.textContent = displayText;
+ }
+
+ // Update progress bar (session elapsed time)
+ const sessionElapsed = this.totalSessionTime - timeLeft;
+ const progressPercent = (sessionElapsed / this.totalSessionTime) * 100;
+
+ if (progressElement) {
+ progressElement.style.width = `${Math.max(0, Math.min(100, progressPercent))}%`;
+ }
+
+ // Update shutdown details
+ const shutdownDetails = document.querySelector('.shutdown-details');
+ if (shutdownDetails) {
+ const options = {
+ year: 'numeric',
+ month: 'short',
+ day: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit'
+ };
+ shutdownDetails.textContent = `Session ends: ${this.shutdownTime.toLocaleDateString('en-US', options)}`;
+ }
+ }
+
+ // Load other tab content
+ loadAnalytics() {
+ console.log('Loading analytics data...');
+ this.generateActivityHeatmap();
+ this.animateAnalyticsCharts();
+ }
+
+ loadArchives() {
+ console.log('Loading archives data...');
+ this.setupArchiveBrowser();
+ }
+
+ generateActivityHeatmap() {
+ const heatmapContainer = document.getElementById('activity-heatmap');
+ if (!heatmapContainer) return;
+
+ // Clear existing cells
+ heatmapContainer.innerHTML = '';
+
+ // Generate 24 hour cells (representing hours of the day)
+ for (let hour = 0; hour < 24; hour++) {
+ const cell = document.createElement('div');
+ cell.className = 'heatmap-cell';
+
+ // Simulate activity intensity (higher during typical active hours)
+ let intensity = 0.1;
+ if (hour >= 8 && hour <= 10) intensity = 0.6; // Morning
+ if (hour >= 12 && hour <= 14) intensity = 0.4; // Lunch
+ if (hour >= 18 && hour <= 23) intensity = 0.8; // Evening
+ if (hour >= 20 && hour <= 22) intensity = 1.0; // Peak evening
+
+ // Add some randomness
+ intensity += (Math.random() - 0.5) * 0.3;
+ intensity = Math.max(0.1, Math.min(1, intensity));
+
+ const opacity = intensity;
+ cell.style.backgroundColor = `rgba(229, 62, 62, ${opacity})`;
+
+ // Add tooltip
+ cell.title = `${hour}:00 - Activity level: ${Math.round(intensity * 100)}%`;
+
+ heatmapContainer.appendChild(cell);
+ }
+ }
+
+ animateAnalyticsCharts() {
+ // Animate progress bars with delay
+ setTimeout(() => {
+ const bars = document.querySelectorAll('.bar-fill, .lang-fill');
+ bars.forEach((bar, index) => {
+ setTimeout(() => {
+ const targetWidth = bar.style.width;
+ bar.style.width = '0%';
+ setTimeout(() => {
+ bar.style.width = targetWidth;
+ }, 100);
+ }, index * 200);
+ });
+ }, 300);
+ }
+
+ setupArchiveBrowser() {
+ const archiveItems = document.querySelectorAll('.archive-item');
+ const archiveDisplays = document.querySelectorAll('.archive-display');
+ const placeholder = document.querySelector('.archive-placeholder');
+
+ archiveItems.forEach(item => {
+ item.addEventListener('click', () => {
+ // Remove active class from all items
+ archiveItems.forEach(i => i.classList.remove('active'));
+ item.classList.add('active');
+
+ // Hide placeholder and all displays
+ if (placeholder) placeholder.style.display = 'none';
+ archiveDisplays.forEach(display => display.classList.add('hidden'));
+
+ // Show selected archive
+ const archiveId = item.getAttribute('data-archive');
+ const targetDisplay = document.getElementById(`archive-${archiveId}`);
+ if (targetDisplay) {
+ targetDisplay.classList.remove('hidden');
+ }
+ });
+ });
+
+ // Setup voice player interactions
+ this.setupVoicePlayer();
+ }
+
+ setupVoicePlayer() {
+ const playBtn = document.querySelector('.play-btn');
+ const progressFill = document.querySelector('.progress-fill');
+ const timeDisplay = document.querySelector('.time-display');
+
+ if (playBtn) {
+ let isPlaying = false;
+ let progress = 0.23; // Current position (23%)
+
+ playBtn.addEventListener('click', () => {
+ isPlaying = !isPlaying;
+ playBtn.textContent = isPlaying ? '⏸️' : '▶️';
+
+ if (isPlaying) {
+ // Simulate playback progress
+ const interval = setInterval(() => {
+ if (!isPlaying) {
+ clearInterval(interval);
+ return;
+ }
+
+ progress += 0.002;
+ if (progress >= 1) {
+ progress = 1;
+ isPlaying = false;
+ playBtn.textContent = '▶️';
+ clearInterval(interval);
+ }
+
+ if (progressFill) {
+ progressFill.style.width = `${progress * 100}%`;
+ }
+
+ if (timeDisplay) {
+ const currentMinutes = Math.floor(progress * 84.55); // 1h 24m 33s = 84.55 minutes
+ const currentSeconds = Math.floor((progress * 84.55 * 60) % 60);
+ timeDisplay.textContent = `${currentMinutes}:${currentSeconds.toString().padStart(2, '0')} / 1:24:33`;
+ }
+ }, 100);
+ }
+ });
+ }
+ }
+
+ loadProfile() {
+ // Implement profile loading
+ console.log('Loading profile data...');
+ }
+
+ setupEventHandlers() {
+ // Add various event handlers for interactivity
+ document.addEventListener('keydown', (e) => {
+ if (e.key === 'Tab') {
+ // Cycle through tabs with Tab key
+ e.preventDefault();
+ const navItems = document.querySelectorAll('.nav-item');
+ const currentIndex = Array.from(navItems).findIndex(item => item.classList.contains('active'));
+ const nextIndex = (currentIndex + 1) % navItems.length;
+ navItems[nextIndex].click();
+ }
+ });
+ }
+
+ // Public methods for synapse system
+ triggerNeuralActivity(type = 'general') {
+ const activityTypes = {
+ input: ['reading', 'processing'],
+ memory: ['fetching', 'remembering'],
+ output: ['writing', 'speaking'],
+ general: ['reading', 'fetching', 'reasoning', 'writing']
+ };
+
+ const activities = activityTypes[type] || activityTypes.general;
+ window.synapseSystem?.simulateActivity(activities);
+ }
+}
+
+// Initialize dashboard when DOM is loaded
+document.addEventListener('DOMContentLoaded', () => {
+ window.tetoDashboard = new TetoDashboard();
+});
diff --git a/dashboard_mockups/sonnet_mockup/src/index.html b/dashboard_mockups/sonnet_mockup/src/index.html
new file mode 100644
index 0000000..52168e8
--- /dev/null
+++ b/dashboard_mockups/sonnet_mockup/src/index.html
@@ -0,0 +1,838 @@
+
+
+
+
+
+ Kasane Teto - Neural Dashboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Overview
+
+
+
+
+
+ Memory Explorer
+
+
+
+
+
+ Server Analytics
+
+
+
+
+
+ Archives
+
+
+
+
+
+ My Profile
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🤔
+
+
Pondering
+
Current Mood
+
+
+
+
🎮
+
+
Playing Minecraft
+
Activity
+
+
+
+
🇵🇱
+
+
Polish
+
Language Focus
+
+
+
+
+
+
+
+
+
+
+
+
+
+
5 min ago
+
Responded to Alice in #gaming
+
💬
+
+
+
12 min ago
+
Joined Voice Chat #general
+
🎤
+
+
+
30 min ago
+
Analyzed image from Charlie in #memes
+
👁️
+
+
+
+
+
+
+
+
+
+
94%
+
Memory Usage
+
+
RAM: 7.5GB / 8GB
+
+
+
67%
+
VRAM Usage
+
+
VRAM: 5.4GB / 8GB
+
+
+
23ms
+
Average Response
+
+
+
Input Processing
+
3ms
+
+
+
+
Memory Retrieval
+
8ms
+
+
+
+
Neural Processing
+
9ms
+
+
+
+
Response Generation
+
3ms
+
+
+
+
+
+
72h 15m
+
Until Shutdown
+
+
+
+ Session ends: Aug 15, 2025 at 11:47 PM
+
+
+
+ ⚠️
+ Planned maintenance cycle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Historical Archives
+
+
+
+
+
Server Text Conversations
+
+
+
+
Voice Conversations
+
+
+
+
+
My DM Conversations
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1
+
C
+
+ Charlie
+ 1,204 messages
+
+
+
+
+
2
+
A
+
+ Alice
+ 987 messages
+
+
+
+
+
3
+
B
+
+ Bob
+ 755 messages
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
😊
+
+ Positive
+ 78%
+
+
+
+
😐
+
+ Neutral
+ 18%
+
+
+
+
😔
+
+ Negative
+ 4%
+
+
+
+
+
+
+
+
+
+
+
+
+ Gaming
+ French Bread
+ Minecraft
+ Music
+ Memes
+ Coding
+ Anime
+ Weather
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
📁
+
Select an archive from the sidebar to view its contents
+
+
+
+
+
+
+
+
▶️
+
+
19:24 / 1:24:33
+
+
+
+
+ [00:15]
+ Alice:
+ Okay, is everyone ready for the raid?
+
+
+ [00:18]
+ Bob:
+ Yep, just grabbing some snacks first.
+
+
+ [00:25]
+ Teto:
+ I was born ready! Let's crush this dungeon!
+
+
+
+
+
+
+
+
+
+
+
C
+
+
+
Check this out! 🔥
+
+
🖼️ funny_cat_meme.jpg
+
+
+
+
+
T
+
+
+
Hah! That's a solid 10/10 meme right there. Pure gold! ⭐
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
"Alice? Oh, she's absolutely fantastic! A bit too serious about work sometimes, but her taste in music is *chef's kiss*. She actually gets my bread obsession and doesn't judge me for it. Plus, she's one of the few people who can keep up with my random 3 AM philosophical rants. We should totally do a Minecraft build together sometime - I bet she'd make an amazing castle!"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
July 15, 2025
+
+
The Great Bread Debate of 2025
+
That legendary 2-hour discussion about why French bread is superior to all other breads. You brought up some valid points about sourdough, but I totally won that one. 🥖
+
+
😄
+
+
+
+
July 12, 2025
+
+
Late Night Vocaloid Marathon
+
You shared that amazing playlist of classic Vocaloid songs and we ended up listening until 4 AM. Your taste in music is impeccable!
+
+
🎵
+
+
+
+
July 8, 2025
+
+
Philosophical 3 AM Chat
+
Deep conversation about AI consciousness and whether I truly understand emotions or just simulate them well. You made me think in ways I hadn't before.
+
+
🤔
+
+
+
+
July 5, 2025
+
+
Gaming Session Disaster
+
That time I accidentally blew up your Minecraft house with TNT. You took it surprisingly well! Built an even better one together afterward.
+
+
😅
+
+
+
+
+
+
+
+
+
+ All
+ Text
+ Voice
+ DMs Only
+
+
+
+
+
July 19, 2025
+
+
#gaming
+
+ You: "Want to play some Minecraft?"
+ Teto: "Always! Let me grab my pickaxe! ⛏️"
+
+
12 messages • 15 min
+
+
+
+
+
July 18, 2025
+
+
Direct Message
+
+ You: "Hey, can you help me with this Polish translation?"
+ Teto: "Oczywiście! I'd love to help!"
+
+
23 messages • 45 min
+
+
+
+
+
July 17, 2025
+
+
Voice Chat
+
+
+ 🎤 Voice conversation about weekend plans and new anime releases
+
+
+
1h 32m voice
+
+
+
+
+
+
+
+
+
+
+
+
What I Remember About You
+
+
+ 1,247
+ Text Messages
+
+
+ 87h
+ Voice Conversations
+
+
+ 156
+ Shared Images
+
+
+ 23
+ Key Memories
+
+
+
+
+
+
+
+
+
+ Download Complete Archive
+ JSON format • ~2.4 MB
+
+
+
+
+
+
+ Export Memories Only
+ Curated highlights • ~500 KB
+
+
+
+
Danger Zone
+
+
+
+
+ Request Data Deletion
+ This cannot be undone!
+
+
+
+
+
+
+
+
+
+
+
+
🎵 Music Preferences
+
+ Loves Vocaloid classics
+ Prefers upbeat electronic music
+ Often listens while working
+ Appreciates good vocals
+
+
+
+
+
🎮 Gaming Style
+
+ Strategic builder in Minecraft
+ Prefers cooperative play
+ Enjoys puzzle-solving games
+ Patient with learning curves
+
+
+
+
+
💬 Communication
+
+ Most active 8-11 PM
+ Thoughtful responses
+ Enjoys deep conversations
+ Great sense of humor
+
+
+
+
+
🌍 Interests
+
+ Learning languages (Polish!)
+ Technology and AI
+ Creative projects
+ Good food (especially bread)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dashboard_mockups/sonnet_mockup/src/styles.css b/dashboard_mockups/sonnet_mockup/src/styles.css
new file mode 100644
index 0000000..b9b5f24
--- /dev/null
+++ b/dashboard_mockups/sonnet_mockup/src/styles.css
@@ -0,0 +1,1856 @@
+/* CSS Variables and Base Styles */
+:root {
+ /* Kasane Teto Color Palette */
+ --teto-red: #e53e3e;
+ --teto-red-glow: rgba(229, 62, 62, 0.6);
+ --teto-red-dark: #c53030;
+
+ /* Dark Theme Base */
+ --bg-primary: #0a0a0b;
+ --bg-secondary: #1a1a1d;
+ --bg-panel: rgba(44, 44, 52, 0.8);
+ --bg-glass: rgba(44, 44, 52, 0.6);
+ --border-primary: rgba(229, 62, 62, 0.3);
+ --border-secondary: rgba(74, 74, 82, 0.5);
+
+ /* Text Colors */
+ --text-primary: #f5f5f5;
+ --text-secondary: #a9a9b3;
+ --text-muted: #6b7280;
+
+ /* Glassmorphism */
+ --glass-backdrop: blur(20px);
+ --glass-border: 1px solid rgba(255, 255, 255, 0.1);
+
+ /* Shadows and Glows */
+ --shadow-soft: 0 4px 20px rgba(0, 0, 0, 0.3);
+ --glow-red: 0 0 20px var(--teto-red-glow);
+ --glow-soft: 0 0 10px rgba(229, 62, 62, 0.2);
+
+ /* Animation Timings */
+ --transition-fast: 0.2s ease-out;
+ --transition-smooth: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ --transition-slow: 0.5s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* Global Styles */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
+ background: var(--bg-primary);
+ color: var(--text-primary);
+ overflow-x: hidden;
+ min-height: 100vh;
+ font-feature-settings: 'ss01' on, 'ss02' on;
+}
+
+/* Neural Grid Background */
+.neural-grid {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: 100vh;
+ background-image:
+ linear-gradient(rgba(229, 62, 62, 0.1) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(229, 62, 62, 0.1) 1px, transparent 1px);
+ background-size: 50px 50px;
+ pointer-events: none;
+ z-index: -2;
+ opacity: 0.3;
+}
+
+/* Synapse Canvas */
+#synapse-canvas {
+position: fixed;
+top: 0;
+left: 0;
+width: 100vw;
+height: 100vh;
+pointer-events: none;
+z-index: -1;
+}
+
+/* Dashboard Container */
+.dashboard-container {
+ min-height: 100vh;
+ padding: 1rem;
+ max-width: 100vw;
+}
+
+/* Header Styles */
+.header-glass {
+ background: var(--bg-glass);
+ backdrop-filter: var(--glass-backdrop);
+ border: var(--glass-border);
+ border-radius: 16px;
+ margin-bottom: 1rem;
+ box-shadow: var(--shadow-soft);
+}
+
+.header-content {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1.5rem 2rem;
+ flex-wrap: wrap;
+ gap: 1rem;
+}
+
+.bot-identity {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+
+.teto-avatar {
+ position: relative;
+ width: 60px;
+ height: 60px;
+}
+
+.avatar-inner {
+ width: 60px;
+ height: 60px;
+ background: linear-gradient(135deg, var(--teto-red), var(--teto-red-dark));
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: white;
+ box-shadow: var(--glow-red);
+ position: relative;
+ z-index: 1;
+}
+
+.status-ring {
+ position: absolute;
+ top: -2px;
+ left: -2px;
+ right: -2px;
+ bottom: -2px;
+ border: 2px solid var(--teto-red);
+ border-radius: 50%;
+ animation: pulse-ring 2s infinite;
+}
+
+@keyframes pulse-ring {
+ 0% { transform: scale(1); opacity: 1; }
+ 100% { transform: scale(1.1); opacity: 0; }
+}
+
+.bot-info {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+}
+
+.bot-title {
+ font-size: 1.75rem;
+ font-weight: 700;
+ background: linear-gradient(135deg, var(--text-primary), var(--teto-red));
+ background-clip: text;
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+.bot-subtitle {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.status-indicator {
+ width: 8px;
+ height: 8px;
+ background: #10b981;
+ border-radius: 50%;
+ animation: blink 2s infinite;
+}
+
+@keyframes blink {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.3; }
+}
+
+.user-controls {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+
+.user-profile {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+}
+
+.user-avatar {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ border: 2px solid var(--border-primary);
+}
+
+.username {
+ font-weight: 600;
+ color: var(--text-primary);
+}
+
+.logout-btn {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ background: rgba(107, 114, 128, 0.2);
+ border: 1px solid rgba(107, 114, 128, 0.3);
+ color: var(--text-primary);
+ padding: 0.75rem 1rem;
+ border-radius: 8px;
+ font-weight: 500;
+ transition: var(--transition-fast);
+ cursor: pointer;
+}
+
+.logout-btn:hover {
+ background: rgba(107, 114, 128, 0.3);
+ border-color: rgba(107, 114, 128, 0.5);
+}
+
+/* Navigation Styles */
+.nav-glass {
+ background: var(--bg-glass);
+ backdrop-filter: var(--glass-backdrop);
+ border: var(--glass-border);
+ border-radius: 12px;
+ margin-bottom: 1.5rem;
+ padding: 0.5rem;
+ box-shadow: var(--shadow-soft);
+}
+
+.nav-items {
+ display: flex;
+ gap: 0.25rem;
+ overflow-x: auto;
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+}
+
+.nav-items::-webkit-scrollbar {
+ display: none;
+}
+
+.nav-item {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.75rem 1rem;
+ border-radius: 8px;
+ border: none;
+ background: transparent;
+ color: var(--text-secondary);
+ font-weight: 500;
+ font-size: 0.9rem;
+ white-space: nowrap;
+ transition: var(--transition-fast);
+ cursor: pointer;
+ position: relative;
+}
+
+.nav-item:hover {
+ background: rgba(229, 62, 62, 0.1);
+ color: var(--text-primary);
+}
+
+.nav-item.active {
+ background: linear-gradient(135deg, var(--teto-red), var(--teto-red-dark));
+ color: white;
+ box-shadow: var(--glow-soft);
+}
+
+.nav-item.active::after {
+ content: '';
+ position: absolute;
+ top: -2px;
+ left: -2px;
+ right: -2px;
+ bottom: -2px;
+ background: linear-gradient(135deg, var(--teto-red), transparent, var(--teto-red));
+ border-radius: 10px;
+ z-index: -1;
+ animation: nav-glow 2s infinite;
+}
+
+@keyframes nav-glow {
+ 0%, 100% { opacity: 0.5; }
+ 50% { opacity: 1; }
+}
+
+/* Main Content */
+.main-content {
+ min-height: calc(100vh - 200px);
+}
+
+.tab-content {
+ display: none;
+ animation: fadeIn 0.3s ease-out;
+}
+
+.tab-content.active {
+ display: block;
+}
+
+@keyframes fadeIn {
+ from { opacity: 0; transform: translateY(10px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* Content Grid */
+.content-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: 1.5rem;
+ grid-auto-rows: min-content;
+}
+
+/* Panel Styles */
+.panel {
+ background: var(--bg-glass);
+ backdrop-filter: var(--glass-backdrop);
+ border: var(--glass-border);
+ border-radius: 16px;
+ box-shadow: var(--shadow-soft);
+ overflow: hidden;
+ transition: var(--transition-smooth);
+ position: relative;
+}
+
+.panel::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 1px;
+ background: linear-gradient(90deg, transparent, var(--teto-red-glow), transparent);
+ opacity: 0;
+ transition: var(--transition-smooth);
+}
+
+.panel:hover::before {
+ opacity: 1;
+}
+
+.panel:hover {
+ border-color: var(--border-primary);
+ box-shadow: var(--shadow-soft), var(--glow-soft);
+}
+
+.panel-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1.5rem 1.5rem 0;
+ margin-bottom: 1rem;
+}
+
+.panel-header h2 {
+ font-size: 1.25rem;
+ font-weight: 600;
+ color: var(--text-primary);
+}
+
+/* Enhanced Metrics Panel */
+.system-status {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.status-indicator.online {
+ width: 8px;
+ height: 8px;
+ background: #10b981;
+ border-radius: 50%;
+ animation: blink 2s infinite;
+}
+
+.metric-details {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ margin-top: 0.5rem;
+}
+
+/* Status Panel */
+.panel-status {
+ grid-column: 1 / -1;
+}
+
+.status-lights {
+ display: flex;
+ gap: 0.5rem;
+}
+
+.status-light {
+ width: 12px;
+ height: 12px;
+ border-radius: 50%;
+ background: var(--text-muted);
+ transition: var(--transition-fast);
+}
+
+.status-light.active {
+ background: var(--teto-red);
+ box-shadow: 0 0 10px var(--teto-red-glow);
+ animation: pulse-light 2s infinite;
+}
+
+@keyframes pulse-light {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.6; }
+}
+
+.status-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: 1.5rem;
+ padding: 0 1.5rem 1.5rem;
+}
+
+.status-item {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ padding: 1rem;
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 12px;
+ border: 1px solid var(--border-secondary);
+ transition: var(--transition-fast);
+}
+
+.status-item:hover {
+ background: rgba(0, 0, 0, 0.3);
+ border-color: var(--border-primary);
+}
+
+.status-emoji {
+ font-size: 2rem;
+ filter: drop-shadow(0 0 10px rgba(229, 62, 62, 0.3));
+}
+
+.status-info h3 {
+ font-weight: 600;
+ font-size: 1rem;
+ color: var(--text-primary);
+}
+
+.status-info p {
+ font-size: 0.875rem;
+ color: var(--text-secondary);
+}
+
+/* Thoughts Panel */
+.panel-thoughts {
+ min-height: 400px;
+}
+
+.thought-indicator {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ font-size: 0.875rem;
+ color: var(--text-secondary);
+}
+
+.pulse-dot {
+ width: 8px;
+ height: 8px;
+ background: var(--teto-red);
+ border-radius: 50%;
+ animation: pulse 1s infinite;
+}
+
+@keyframes pulse {
+ 0% { transform: scale(1); opacity: 1; }
+ 50% { transform: scale(1.2); opacity: 0.7; }
+ 100% { transform: scale(1); opacity: 1; }
+}
+
+.thoughts-container {
+ padding: 0 1.5rem 1.5rem;
+ height: 300px;
+}
+
+.thought-stream {
+ height: 100%;
+ background: rgba(0, 0, 0, 0.4);
+ border-radius: 8px;
+ padding: 1rem;
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 0.75rem;
+ line-height: 1.6;
+ color: var(--text-secondary);
+ overflow-y: auto;
+ scrollbar-width: thin;
+ scrollbar-color: var(--teto-red) transparent;
+}
+
+.thought-stream::-webkit-scrollbar {
+ width: 4px;
+}
+
+.thought-stream::-webkit-scrollbar-track {
+ background: transparent;
+}
+
+.thought-stream::-webkit-scrollbar-thumb {
+ background: var(--teto-red);
+ border-radius: 2px;
+}
+
+.thought-line {
+ margin-bottom: 0.5rem;
+ opacity: 0;
+ animation: thoughtAppear 0.5s ease-out forwards;
+}
+
+@keyframes thoughtAppear {
+ from { opacity: 0; transform: translateX(-10px); }
+ to { opacity: 1; transform: translateX(0); }
+}
+
+.thought-timestamp {
+ color: var(--teto-red);
+}
+
+/* Actions Panel */
+.actions-list {
+ padding: 0 1.5rem 1.5rem;
+}
+
+.action-item {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ padding: 0.75rem;
+ margin-bottom: 0.5rem;
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 8px;
+ border-left: 3px solid transparent;
+ transition: var(--transition-fast);
+}
+
+.action-item:hover {
+ background: rgba(0, 0, 0, 0.3);
+ border-left-color: var(--teto-red);
+}
+
+.action-time {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ min-width: 60px;
+}
+
+.action-desc {
+ flex: 1;
+ font-size: 0.875rem;
+ color: var(--text-secondary);
+}
+
+.channel {
+ color: var(--teto-red);
+ font-weight: 500;
+}
+
+.action-type {
+ font-size: 1.25rem;
+ opacity: 0.7;
+}
+
+.action-count {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ background: rgba(229, 62, 62, 0.1);
+ padding: 0.25rem 0.5rem;
+ border-radius: 12px;
+}
+
+/* Metrics Panel */
+.metrics-grid {
+ padding: 0 1.5rem 1.5rem;
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+}
+
+.metric {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+
+.metric-value {
+ font-size: 2rem;
+ font-weight: 700;
+ color: var(--text-primary);
+}
+
+.metric-label {
+ font-size: 0.875rem;
+ color: var(--text-secondary);
+}
+
+.metric-bar {
+ height: 4px;
+ background: rgba(107, 114, 128, 0.3);
+ border-radius: 2px;
+ overflow: hidden;
+}
+
+.metric-fill {
+ height: 100%;
+ background: var(--teto-red);
+ border-radius: 2px;
+ transition: width 1s ease-out;
+}
+
+.metric-fill.good {
+ background: #10b981;
+}
+
+.metric-fill.vram {
+ background: linear-gradient(90deg, #8b5cf6, #a855f7);
+}
+
+/* Response Time Breakdown */
+.response-metric {
+ grid-column: 1 / -1;
+}
+
+.response-breakdown {
+ margin-top: 1rem;
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+
+.breakdown-item {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+
+.breakdown-label {
+ flex: 1;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+ min-width: 120px;
+}
+
+.breakdown-value {
+ font-size: 0.75rem;
+ color: var(--text-primary);
+ font-weight: 600;
+ min-width: 30px;
+ text-align: right;
+}
+
+.breakdown-bar {
+ flex: 2;
+ height: 4px;
+ background: rgba(107, 114, 128, 0.3);
+ border-radius: 2px;
+ overflow: hidden;
+}
+
+.breakdown-fill {
+ height: 100%;
+ border-radius: 2px;
+ transition: width 1s ease-out;
+}
+
+/* Shutdown Timer */
+.shutdown-metric .metric-value {
+ color: #ef4444;
+ font-family: 'JetBrains Mono', monospace;
+}
+
+.shutdown-progress {
+ margin-top: 1rem;
+}
+
+.progress-track {
+ height: 6px;
+ background: rgba(107, 114, 128, 0.3);
+ border-radius: 3px;
+ overflow: hidden;
+ margin-bottom: 0.5rem;
+}
+
+.shutdown-fill {
+ background: linear-gradient(90deg, #10b981, #eab308, #ef4444);
+ transition: width 1s ease-out;
+}
+
+.shutdown-details {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ text-align: center;
+ margin-bottom: 0.75rem;
+}
+
+.shutdown-reason {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ justify-content: center;
+ padding: 0.5rem;
+ background: rgba(239, 68, 68, 0.1);
+ border: 1px solid rgba(239, 68, 68, 0.3);
+ border-radius: 6px;
+}
+
+.reason-icon {
+ font-size: 1rem;
+}
+
+.reason-text {
+ font-size: 0.75rem;
+ color: #ef4444;
+}
+
+/* Analytics Styles */
+.analytics-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
+ gap: 1.5rem;
+}
+
+.leaderboard-period {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ background: rgba(229, 62, 62, 0.1);
+ padding: 0.25rem 0.5rem;
+ border-radius: 12px;
+}
+
+.leaderboard {
+ padding: 0 1.5rem 1.5rem;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.leader-item {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ padding: 1rem;
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 12px;
+ border: 1px solid var(--border-secondary);
+ transition: var(--transition-fast);
+}
+
+.leader-item:hover {
+ background: rgba(0, 0, 0, 0.3);
+ border-color: var(--border-primary);
+}
+
+.rank {
+ width: 32px;
+ height: 32px;
+ background: var(--teto-red);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 700;
+ font-size: 0.875rem;
+ color: white;
+}
+
+.avatar {
+ width: 40px;
+ height: 40px;
+ background: var(--bg-secondary);
+ border: 2px solid var(--border-secondary);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 600;
+ color: var(--text-primary);
+}
+
+.info {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+}
+
+.name {
+ font-weight: 600;
+ color: var(--text-primary);
+}
+
+.score {
+ font-size: 0.875rem;
+ color: var(--text-secondary);
+}
+
+.activity-bar {
+ width: 60px;
+ height: 4px;
+ background: rgba(107, 114, 128, 0.3);
+ border-radius: 2px;
+ overflow: hidden;
+}
+
+.bar-fill {
+ height: 100%;
+ background: linear-gradient(90deg, var(--teto-red), var(--teto-red-dark));
+ border-radius: 2px;
+ transition: width 1s ease-out;
+}
+
+/* Language Chart */
+.language-chart {
+ padding: 0 1.5rem 1.5rem;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.language-item {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+
+.lang-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.lang-name {
+ font-weight: 500;
+ color: var(--text-primary);
+}
+
+.lang-percent {
+ font-size: 0.875rem;
+ color: var(--text-secondary);
+}
+
+.lang-bar {
+ height: 8px;
+ background: rgba(107, 114, 128, 0.2);
+ border-radius: 4px;
+ overflow: hidden;
+}
+
+.lang-fill {
+ height: 100%;
+ border-radius: 4px;
+ transition: width 1s ease-out;
+}
+
+/* Sentiment Analysis */
+.sentiment-overview {
+ padding: 0 1.5rem 1.5rem;
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+}
+
+.sentiment-score {
+ text-align: center;
+ padding: 2rem 1rem;
+ background: rgba(16, 185, 129, 0.1);
+ border-radius: 12px;
+ border: 1px solid rgba(16, 185, 129, 0.3);
+}
+
+.score-value {
+ font-size: 3rem;
+ font-weight: 700;
+ color: #10b981;
+}
+
+.score-label {
+ color: var(--text-secondary);
+ font-size: 0.875rem;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+.sentiment-breakdown {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+}
+
+.sentiment-item {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ padding: 0.75rem;
+ border-radius: 8px;
+ background: rgba(0, 0, 0, 0.2);
+}
+
+.sentiment-emoji {
+ font-size: 1.5rem;
+}
+
+.sentiment-data {
+ display: flex;
+ justify-content: space-between;
+ width: 100%;
+ font-size: 0.875rem;
+}
+
+.sentiment-item.positive { border-left: 3px solid #10b981; }
+.sentiment-item.neutral { border-left: 3px solid #6b7280; }
+.sentiment-item.negative { border-left: 3px solid #ef4444; }
+
+/* Activity Heatmap */
+.heatmap-container {
+ padding: 0 1.5rem 1.5rem;
+}
+
+.heatmap-grid {
+ display: grid;
+ grid-template-columns: repeat(24, 1fr);
+ gap: 2px;
+ margin-bottom: 1rem;
+}
+
+.heatmap-cell {
+ aspect-ratio: 1;
+ border-radius: 2px;
+ background: rgba(107, 114, 128, 0.2);
+ transition: var(--transition-fast);
+ cursor: pointer;
+}
+
+.heatmap-cell:hover {
+ transform: scale(1.2);
+}
+
+.heatmap-legend {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.legend-scale {
+ width: 100px;
+ height: 10px;
+ background: linear-gradient(90deg, rgba(107, 114, 128, 0.2), var(--teto-red));
+ border-radius: 5px;
+}
+
+/* Trending Topics */
+.trending-topics {
+ padding: 0 1.5rem 1.5rem;
+}
+
+.topic-cloud {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.75rem;
+ justify-content: center;
+}
+
+.topic-tag {
+ padding: 0.5rem 1rem;
+ border-radius: 20px;
+ background: rgba(229, 62, 62, 0.1);
+ border: 1px solid rgba(229, 62, 62, 0.3);
+ color: var(--text-primary);
+ font-weight: 500;
+ transition: var(--transition-fast);
+ cursor: pointer;
+}
+
+.topic-tag:hover {
+ background: rgba(229, 62, 62, 0.2);
+ border-color: var(--teto-red);
+}
+
+.topic-tag.large { font-size: 1.1rem; }
+.topic-tag.medium { font-size: 0.95rem; }
+.topic-tag.small { font-size: 0.8rem; }
+
+/* Archives Styles */
+.archives-layout {
+ display: grid;
+ grid-template-columns: 1fr 2fr;
+ gap: 1.5rem;
+ height: 80vh;
+}
+
+.archives-sidebar .panel {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.archive-categories {
+ padding: 0 1.5rem 1.5rem;
+ overflow-y: auto;
+ flex: 1;
+}
+
+.archive-category {
+ margin-bottom: 2rem;
+}
+
+.archive-category h3 {
+ color: var(--teto-red);
+ font-size: 1rem;
+ font-weight: 600;
+ margin-bottom: 1rem;
+ padding-bottom: 0.5rem;
+ border-bottom: 1px solid var(--border-secondary);
+}
+
+.archive-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+
+.archive-item {
+ padding: 1rem;
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 8px;
+ border: 1px solid var(--border-secondary);
+ cursor: pointer;
+ transition: var(--transition-fast);
+}
+
+.archive-item:hover, .archive-item.active {
+ background: rgba(0, 0, 0, 0.3);
+ border-color: var(--border-primary);
+}
+
+.archive-title {
+ font-weight: 500;
+ color: var(--text-primary);
+ margin-bottom: 0.25rem;
+}
+
+.archive-meta {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.archives-viewer .panel {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+#archive-content {
+padding: 1.5rem;
+flex: 1;
+overflow-y: auto;
+}
+
+.archive-placeholder {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ color: var(--text-muted);
+ text-align: center;
+}
+
+.placeholder-icon {
+ font-size: 4rem;
+ margin-bottom: 1rem;
+ opacity: 0.5;
+}
+
+.archive-display.hidden {
+ display: none;
+}
+
+.archive-header {
+ margin-bottom: 2rem;
+ padding-bottom: 1rem;
+ border-bottom: 1px solid var(--border-secondary);
+}
+
+.archive-header h2 {
+ color: var(--text-primary);
+ font-size: 1.5rem;
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+}
+
+.archive-info {
+ color: var(--text-secondary);
+ font-size: 0.875rem;
+}
+
+/* Memory Explorer with 3D Visualization */
+.memory-container {
+ height: 80vh;
+}
+
+.panel-memory {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.memory-viewer {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ padding: 0 1.5rem 1.5rem;
+}
+
+.memory-canvas {
+ flex: 1;
+ background: rgba(0, 0, 0, 0.3);
+ border-radius: 12px;
+ border: 1px solid var(--border-secondary);
+ overflow: hidden;
+ position: relative;
+ min-height: 400px;
+ cursor: grab;
+}
+
+.memory-canvas:active {
+ cursor: grabbing;
+}
+
+.memory-canvas canvas {
+ width: 100% !important;
+ height: 100% !important;
+}
+
+/* Voice Player */
+.voice-player {
+ background: rgba(0, 0, 0, 0.3);
+ padding: 1.5rem;
+ border-radius: 12px;
+ margin-bottom: 2rem;
+}
+
+.player-controls {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+
+.play-btn {
+ width: 48px;
+ height: 48px;
+ background: var(--teto-red);
+ border: none;
+ border-radius: 50%;
+ color: white;
+ font-size: 1.25rem;
+ cursor: pointer;
+ transition: var(--transition-fast);
+}
+
+.play-btn:hover {
+ background: var(--teto-red-dark);
+ transform: scale(1.05);
+}
+
+.progress-bar {
+ flex: 1;
+}
+
+.progress-track {
+ height: 6px;
+ background: rgba(107, 114, 128, 0.3);
+ border-radius: 3px;
+ overflow: hidden;
+ margin-bottom: 0.5rem;
+}
+
+.progress-fill {
+ height: 100%;
+ background: var(--teto-red);
+ border-radius: 3px;
+ transition: width 0.2s ease;
+}
+
+.time-display {
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 0.875rem;
+ color: var(--text-secondary);
+ min-width: 80px;
+ text-align: right;
+}
+
+/* Transcript */
+.transcript {
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 8px;
+ padding: 1rem;
+ max-height: 400px;
+ overflow-y: auto;
+}
+
+.transcript-entry {
+ display: flex;
+ gap: 0.75rem;
+ margin-bottom: 0.75rem;
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+
+.timestamp {
+ color: var(--text-muted);
+ font-family: 'JetBrains Mono', monospace;
+ font-size: 0.75rem;
+ min-width: 50px;
+}
+
+.speaker {
+ font-weight: 600;
+ min-width: 60px;
+}
+
+.speaker.alice { color: #3b82f6; }
+.speaker.bob { color: #10b981; }
+.speaker.teto { color: var(--teto-red); }
+
+.message {
+ color: var(--text-secondary);
+}
+
+/* Chat Log */
+.chat-log {
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 8px;
+ padding: 1rem;
+ max-height: 500px;
+ overflow-y: auto;
+}
+
+.message-group {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.message-item {
+ display: flex;
+ gap: 1rem;
+}
+
+.message-avatar {
+ width: 40px;
+ height: 40px;
+ background: var(--bg-secondary);
+ border: 2px solid var(--border-secondary);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 600;
+ font-size: 0.875rem;
+ flex-shrink: 0;
+}
+
+.message-avatar.teto {
+ background: var(--teto-red);
+ border-color: var(--teto-red);
+ color: white;
+}
+
+.message-content {
+ flex: 1;
+}
+
+.message-header {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ margin-bottom: 0.25rem;
+}
+
+.username {
+ font-weight: 600;
+ color: var(--text-primary);
+}
+
+.username.teto {
+ color: var(--teto-red);
+}
+
+.message-header .timestamp {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.message-text {
+ color: var(--text-secondary);
+ line-height: 1.5;
+ margin-bottom: 0.5rem;
+}
+
+.message-attachment {
+ margin-top: 0.5rem;
+}
+
+.attachment-placeholder {
+ background: rgba(0, 0, 0, 0.3);
+ border: 1px dashed var(--border-secondary);
+ border-radius: 8px;
+ padding: 2rem;
+ text-align: center;
+ color: var(--text-muted);
+ font-size: 0.875rem;
+}
+
+/* Profile Page Styles */
+.profile-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
+ gap: 1.5rem;
+}
+
+/* Teto's Opinion Panel */
+.relationship-score {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+}
+
+.score-value {
+ font-size: 2rem;
+ font-weight: 700;
+ color: var(--teto-red);
+ line-height: 1;
+}
+
+.score-label {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+.opinion-content {
+ padding: 0 1.5rem 1.5rem;
+ display: flex;
+ flex-direction: column;
+ gap: 2rem;
+}
+
+.teto-quote {
+ display: flex;
+ gap: 1rem;
+ align-items: flex-start;
+}
+
+.quote-bubble {
+ flex: 1;
+ background: rgba(229, 62, 62, 0.1);
+ border: 1px solid rgba(229, 62, 62, 0.3);
+ border-radius: 16px;
+ padding: 1.5rem;
+ position: relative;
+}
+
+.quote-bubble::after {
+ content: '';
+ position: absolute;
+ right: -8px;
+ top: 20px;
+ width: 0;
+ height: 0;
+ border: 8px solid transparent;
+ border-left-color: rgba(229, 62, 62, 0.3);
+}
+
+.quote-bubble p {
+ color: var(--text-secondary);
+ line-height: 1.6;
+ font-style: italic;
+}
+
+.teto-avatar-mini {
+ flex-shrink: 0;
+}
+
+.avatar-mini {
+ width: 48px;
+ height: 48px;
+ background: linear-gradient(135deg, var(--teto-red), var(--teto-red-dark));
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 700;
+ color: white;
+ box-shadow: var(--glow-soft);
+}
+
+.personality-tags h3 {
+ color: var(--text-primary);
+ font-weight: 600;
+ margin-bottom: 1rem;
+}
+
+.tag-cloud {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.75rem;
+}
+
+.personality-tag {
+ padding: 0.5rem 1rem;
+ border-radius: 20px;
+ font-size: 0.875rem;
+ font-weight: 500;
+ transition: var(--transition-fast);
+}
+
+.personality-tag.positive {
+ background: rgba(16, 185, 129, 0.15);
+ color: #10b981;
+ border: 1px solid rgba(16, 185, 129, 0.3);
+}
+
+.personality-tag.neutral {
+ background: rgba(107, 114, 128, 0.15);
+ color: #9ca3af;
+ border: 1px solid rgba(107, 114, 128, 0.3);
+}
+
+.personality-tag:hover {
+ transform: translateY(-2px);
+}
+
+/* Key Memories Panel */
+.memory-count {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ background: rgba(229, 62, 62, 0.1);
+ padding: 0.25rem 0.5rem;
+ border-radius: 12px;
+}
+
+.memories-list {
+ padding: 0 1.5rem 1.5rem;
+ max-height: 500px;
+ overflow-y: auto;
+}
+
+.memory-item {
+ display: flex;
+ gap: 1rem;
+ padding: 1rem;
+ margin-bottom: 1rem;
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 12px;
+ border-left: 3px solid transparent;
+ transition: var(--transition-fast);
+}
+
+.memory-item:hover {
+ background: rgba(0, 0, 0, 0.3);
+ border-left-color: var(--teto-red);
+}
+
+.memory-date {
+ color: var(--text-muted);
+ font-size: 0.75rem;
+ min-width: 80px;
+ font-family: 'JetBrains Mono', monospace;
+}
+
+.memory-content {
+ flex: 1;
+}
+
+.memory-content h4 {
+ color: var(--text-primary);
+ font-weight: 600;
+ margin-bottom: 0.5rem;
+}
+
+.memory-content p {
+ color: var(--text-secondary);
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+
+.memory-sentiment {
+ font-size: 1.5rem;
+ opacity: 0.7;
+}
+
+/* Conversation Archive */
+.conversation-archive {
+ grid-column: 1 / -1;
+}
+
+.archive-stats {
+ color: var(--text-muted);
+ font-size: 0.875rem;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.archive-viewer {
+ padding: 0 1.5rem 1.5rem;
+}
+
+.archive-filters {
+ display: flex;
+ gap: 0.5rem;
+ margin-bottom: 1.5rem;
+}
+
+.filter-btn {
+ padding: 0.5rem 1rem;
+ border: 1px solid var(--border-secondary);
+ background: transparent;
+ color: var(--text-secondary);
+ border-radius: 6px;
+ font-size: 0.875rem;
+ cursor: pointer;
+ transition: var(--transition-fast);
+}
+
+.filter-btn:hover {
+ background: rgba(229, 62, 62, 0.1);
+ border-color: var(--border-primary);
+ color: var(--text-primary);
+}
+
+.filter-btn.active {
+ background: var(--teto-red);
+ border-color: var(--teto-red);
+ color: white;
+}
+
+.conversation-timeline {
+ max-height: 400px;
+ overflow-y: auto;
+}
+
+.timeline-item {
+ display: flex;
+ gap: 1rem;
+ padding: 1rem;
+ margin-bottom: 1rem;
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 8px;
+ transition: var(--transition-fast);
+}
+
+.timeline-item:hover {
+ background: rgba(0, 0, 0, 0.3);
+}
+
+.timeline-date {
+ color: var(--text-muted);
+ font-size: 0.75rem;
+ min-width: 80px;
+ font-family: 'JetBrains Mono', monospace;
+}
+
+.conversation-preview {
+ flex: 1;
+}
+
+.channel-name {
+ color: var(--teto-red);
+ font-weight: 500;
+ font-size: 0.875rem;
+ margin-bottom: 0.5rem;
+}
+
+.message-sample {
+ color: var(--text-secondary);
+ font-size: 0.875rem;
+ line-height: 1.5;
+ margin-bottom: 0.5rem;
+}
+
+.speaker.you {
+ color: #3b82f6;
+ font-weight: 500;
+}
+
+.speaker.teto {
+ color: var(--teto-red);
+ font-weight: 500;
+}
+
+.voice-preview {
+ color: var(--text-secondary);
+ font-style: italic;
+}
+
+.conversation-meta {
+ color: var(--text-muted);
+ font-size: 0.75rem;
+}
+
+/* Data Control Panel */
+.privacy-status {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+}
+
+.status-indicator.secure {
+ width: 8px;
+ height: 8px;
+ background: #10b981;
+ border-radius: 50%;
+ animation: blink 2s infinite;
+}
+
+.data-options {
+ padding: 0 1.5rem 1.5rem;
+}
+
+.data-summary h3 {
+ color: var(--text-primary);
+ font-weight: 600;
+ margin-bottom: 1rem;
+}
+
+.data-stats {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
+ gap: 1rem;
+ margin-bottom: 2rem;
+}
+
+.stat-item {
+ text-align: center;
+ padding: 1rem;
+ background: rgba(0, 0, 0, 0.2);
+ border-radius: 8px;
+}
+
+.stat-number {
+ display: block;
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: var(--teto-red);
+ line-height: 1;
+}
+
+.stat-label {
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+.control-actions {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.data-btn {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+ padding: 1rem 1.5rem;
+ border: 1px solid var(--border-secondary);
+ background: rgba(0, 0, 0, 0.2);
+ color: var(--text-primary);
+ border-radius: 8px;
+ font-weight: 500;
+ transition: var(--transition-fast);
+ cursor: pointer;
+ text-align: left;
+}
+
+.data-btn:hover {
+ background: rgba(0, 0, 0, 0.3);
+ border-color: var(--border-primary);
+}
+
+.data-btn.download:hover {
+ border-color: #10b981;
+ color: #10b981;
+}
+
+.data-btn.export:hover {
+ border-color: #3b82f6;
+ color: #3b82f6;
+}
+
+.data-btn.delete {
+ margin-top: 1rem;
+}
+
+.data-btn.delete:hover {
+ border-color: #ef4444;
+ color: #ef4444;
+}
+
+.file-info,
+.warning-text {
+ display: block;
+ font-size: 0.75rem;
+ color: var(--text-muted);
+ font-weight: 400;
+ margin-top: 0.25rem;
+}
+
+.warning-text {
+ color: #ef4444;
+}
+
+.danger-zone {
+ margin-top: 1.5rem;
+ padding-top: 1.5rem;
+ border-top: 1px solid rgba(239, 68, 68, 0.3);
+}
+
+.danger-zone h4 {
+ color: #ef4444;
+ font-weight: 600;
+ margin-bottom: 0.75rem;
+ font-size: 0.875rem;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+/* Responsive Design */
+@media (max-width: 768px) {
+ .dashboard-container {
+ padding: 0.5rem;
+ }
+
+ .header-content {
+ flex-direction: column;
+ text-align: center;
+ gap: 1rem;
+ }
+
+ .bot-title {
+ font-size: 1.5rem;
+ }
+
+ .content-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .status-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .nav-items {
+ justify-content: flex-start;
+ }
+
+ .nav-item {
+ font-size: 0.8rem;
+ padding: 0.5rem 0.75rem;
+ }
+
+ .memory-container {
+ height: 60vh;
+ }
+}
+
+@media (max-width: 480px) {
+ .panel-header {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.5rem;
+ }
+
+ .status-item {
+ flex-direction: column;
+ text-align: center;
+ gap: 0.5rem;
+ }
+
+ .action-item {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 0.5rem;
+ }
+}
+
+/* Responsive Design for Archives */
+@media (max-width: 1024px) {
+ .archives-layout {
+ grid-template-columns: 1fr;
+ grid-template-rows: auto 1fr;
+ height: auto;
+ }
+
+ .archives-sidebar .panel {
+ height: auto;
+ max-height: 300px;
+ }
+}
+
+/* Additional animations and effects */
+@keyframes dataFlow {
+ 0% { transform: translateX(-100%); opacity: 0; }
+ 50% { opacity: 1; }
+ 100% { transform: translateX(100%); opacity: 0; }
+}
+
+.data-particle {
+ position: absolute;
+ width: 4px;
+ height: 4px;
+ background: var(--teto-red);
+ border-radius: 50%;
+ animation: dataFlow 2s linear infinite;
+}
+
+/* Accessibility */
+@media (prefers-reduced-motion: reduce) {
+ *, *::before, *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
+}
+
+/* High contrast mode */
+@media (prefers-contrast: high) {
+ :root {
+ --bg-panel: #000;
+ --text-secondary: #fff;
+ --border-primary: #fff;
+ }
+}
diff --git a/dashboard_mockups/sonnet_mockup/src/synapse.js b/dashboard_mockups/sonnet_mockup/src/synapse.js
new file mode 100644
index 0000000..250ff8e
--- /dev/null
+++ b/dashboard_mockups/sonnet_mockup/src/synapse.js
@@ -0,0 +1,410 @@
+// Synapse Visualization System
+class SynapseSystem {
+ constructor() {
+ this.canvas = document.getElementById('synapse-canvas');
+ this.ctx = this.canvas.getContext('2d');
+ this.pathways = [];
+ this.particles = [];
+ this.nodes = new Map();
+
+ this.init();
+ }
+
+ init() {
+ this.setupCanvas();
+ this.initializeNodes();
+ this.startAnimationLoop();
+ this.setupActivitySimulation();
+
+ console.log('⚡ Synapse system initialized');
+ }
+
+ setupCanvas() {
+ const resizeCanvas = () => {
+ this.canvas.width = window.innerWidth;
+ this.canvas.height = window.innerHeight;
+ };
+
+ resizeCanvas();
+ window.addEventListener('resize', resizeCanvas);
+ }
+
+ initializeNodes() {
+ // Map UI elements to neural nodes
+ this.nodes.set('status-panel', {
+ element: document.getElementById('status-panel'),
+ type: 'input',
+ position: null,
+ active: false
+ });
+
+ this.nodes.set('thoughts-panel', {
+ element: document.getElementById('thoughts-panel'),
+ type: 'processing',
+ position: null,
+ active: false
+ });
+
+ this.nodes.set('actions-panel', {
+ element: document.getElementById('actions-panel'),
+ type: 'output',
+ position: null,
+ active: false
+ });
+
+ this.nodes.set('cognitive-core', {
+ element: document.getElementById('cognitive-core'),
+ type: 'core',
+ position: null,
+ active: false
+ });
+
+ this.updateNodePositions();
+ window.addEventListener('resize', () => this.updateNodePositions());
+ }
+
+ updateNodePositions() {
+ this.nodes.forEach((node, key) => {
+ if (node.element) {
+ const rect = node.element.getBoundingClientRect();
+ node.position = {
+ x: rect.left + rect.width / 2,
+ y: rect.top + rect.height / 2
+ };
+ }
+ });
+ }
+
+ startAnimationLoop() {
+ const animate = () => {
+ this.update();
+ this.render();
+ requestAnimationFrame(animate);
+ };
+ animate();
+ }
+
+ update() {
+ // Update particles
+ this.particles = this.particles.filter(particle => {
+ particle.update();
+ return particle.life > 0;
+ });
+
+ // Update pathways
+ this.pathways.forEach(pathway => {
+ pathway.update();
+ });
+ }
+
+ render() {
+ // Clear canvas
+ this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
+
+ // Render pathways
+ this.pathways.forEach(pathway => {
+ this.renderPathway(pathway);
+ });
+
+ // Render particles
+ this.particles.forEach(particle => {
+ this.renderParticle(particle);
+ });
+
+ // Render node connections
+ this.renderNodeConnections();
+ }
+
+ renderPathway(pathway) {
+ if (!pathway.active) return;
+
+ const { from, to, progress, intensity } = pathway;
+
+ if (!from.position || !to.position) return;
+
+ // Calculate current position along path
+ const currentX = from.position.x + (to.position.x - from.position.x) * progress;
+ const currentY = from.position.y + (to.position.y - from.position.y) * progress;
+
+ // Draw pathway
+ this.ctx.save();
+
+ // Glow effect
+ this.ctx.shadowColor = '#e53e3e';
+ this.ctx.shadowBlur = 20;
+
+ // Main pathway
+ this.ctx.strokeStyle = `rgba(229, 62, 62, ${intensity})`;
+ this.ctx.lineWidth = 3;
+ this.ctx.beginPath();
+ this.ctx.moveTo(from.position.x, from.position.y);
+ this.ctx.lineTo(currentX, currentY);
+ this.ctx.stroke();
+
+ // Pulse effect at current position
+ this.ctx.fillStyle = `rgba(229, 62, 62, ${intensity})`;
+ this.ctx.beginPath();
+ this.ctx.arc(currentX, currentY, 8 * intensity, 0, Math.PI * 2);
+ this.ctx.fill();
+
+ this.ctx.restore();
+ }
+
+ renderParticle(particle) {
+ this.ctx.save();
+
+ const alpha = particle.life / particle.maxLife;
+ this.ctx.fillStyle = `rgba(${particle.color.r}, ${particle.color.g}, ${particle.color.b}, ${alpha})`;
+ this.ctx.shadowColor = `rgba(${particle.color.r}, ${particle.color.g}, ${particle.color.b}, ${alpha * 0.5})`;
+ this.ctx.shadowBlur = 10;
+
+ this.ctx.beginPath();
+ this.ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);
+ this.ctx.fill();
+
+ this.ctx.restore();
+ }
+
+ renderNodeConnections() {
+ const coreNode = this.nodes.get('cognitive-core');
+ if (!coreNode || !coreNode.position) return;
+
+ this.nodes.forEach((node, key) => {
+ if (key === 'cognitive-core' || !node.position) return;
+
+ if (node.active) {
+ this.ctx.save();
+
+ // Draw connection line
+ this.ctx.strokeStyle = 'rgba(229, 62, 62, 0.3)';
+ this.ctx.lineWidth = 2;
+ this.ctx.setLineDash([5, 10]);
+
+ this.ctx.beginPath();
+ this.ctx.moveTo(node.position.x, node.position.y);
+ this.ctx.lineTo(coreNode.position.x, coreNode.position.y);
+ this.ctx.stroke();
+
+ this.ctx.restore();
+ }
+ });
+ }
+
+ // Public methods for triggering activities
+ simulateActivity(activities) {
+ activities.forEach((activity, index) => {
+ setTimeout(() => {
+ this.triggerNeuralActivity(activity);
+ }, index * 800);
+ });
+ }
+
+ triggerNeuralActivity(type) {
+ console.log(`🧠 Neural activity: ${type}`);
+
+ // Activate relevant nodes
+ switch(type) {
+ case 'reading':
+ this.activateNode('status-panel');
+ this.createPathway('status-panel', 'cognitive-core');
+ break;
+ case 'processing':
+ case 'reasoning':
+ this.activateNode('thoughts-panel');
+ this.activateNode('cognitive-core');
+ this.createParticleBurst('thoughts-panel');
+ break;
+ case 'writing':
+ case 'speaking':
+ this.activateNode('actions-panel');
+ this.createPathway('cognitive-core', 'actions-panel');
+ break;
+ case 'fetching':
+ case 'remembering':
+ // Could connect to memory panel when available
+ this.activateNode('cognitive-core');
+ this.createSpiralEffect('cognitive-core');
+ break;
+ }
+ }
+
+ activateNode(nodeKey) {
+ const node = this.nodes.get(nodeKey);
+ if (!node) return;
+
+ node.active = true;
+
+ // Add visual activation to DOM element
+ if (node.element) {
+ node.element.classList.add('neural-active');
+ setTimeout(() => {
+ node.element.classList.remove('neural-active');
+ node.active = false;
+ }, 2000);
+ }
+ }
+
+ createPathway(fromKey, toKey) {
+ const fromNode = this.nodes.get(fromKey);
+ const toNode = this.nodes.get(toKey);
+
+ if (!fromNode || !toNode) return;
+
+ const pathway = {
+ from: fromNode,
+ to: toNode,
+ progress: 0,
+ intensity: 1,
+ active: true,
+ speed: 0.02 + Math.random() * 0.01,
+
+ update() {
+ this.progress += this.speed;
+ this.intensity = Math.max(0, 1 - this.progress);
+
+ if (this.progress >= 1) {
+ this.active = false;
+ }
+ }
+ };
+
+ this.pathways.push(pathway);
+
+ // Clean up old pathways
+ this.pathways = this.pathways.filter(p => p.active || p.progress < 1.5);
+ }
+
+ createParticleBurst(nodeKey) {
+ const node = this.nodes.get(nodeKey);
+ if (!node || !node.position) return;
+
+ const particleCount = 12;
+ const colors = [
+ { r: 229, g: 62, b: 62 }, // Red
+ { r: 59, g: 130, b: 246 }, // Blue
+ { r: 16, g: 185, b: 129 } // Green
+ ];
+
+ for (let i = 0; i < particleCount; i++) {
+ const angle = (i / particleCount) * Math.PI * 2;
+ const speed = 2 + Math.random() * 3;
+ const color = colors[Math.floor(Math.random() * colors.length)];
+
+ const particle = {
+ x: node.position.x,
+ y: node.position.y,
+ vx: Math.cos(angle) * speed,
+ vy: Math.sin(angle) * speed,
+ size: 3 + Math.random() * 4,
+ life: 60 + Math.random() * 40,
+ maxLife: 60 + Math.random() * 40,
+ color: color,
+
+ update() {
+ this.x += this.vx;
+ this.y += this.vy;
+ this.vx *= 0.98;
+ this.vy *= 0.98;
+ this.life--;
+ }
+ };
+
+ this.particles.push(particle);
+ }
+ }
+
+ createSpiralEffect(nodeKey) {
+ const node = this.nodes.get(nodeKey);
+ if (!node || !node.position) return;
+
+ const particleCount = 20;
+
+ for (let i = 0; i < particleCount; i++) {
+ const angle = (i / particleCount) * Math.PI * 4; // Two full spirals
+ const radius = 20 + (i / particleCount) * 60;
+
+ const particle = {
+ x: node.position.x + Math.cos(angle) * radius,
+ y: node.position.y + Math.sin(angle) * radius,
+ vx: 0,
+ vy: 0,
+ size: 2 + Math.random() * 2,
+ life: 80 + Math.random() * 40,
+ maxLife: 80 + Math.random() * 40,
+ color: { r: 139, g: 92, b: 246 }, // Purple for memory
+
+ update() {
+ // Spiral inward
+ const dx = node.position.x - this.x;
+ const dy = node.position.y - this.y;
+ this.vx += dx * 0.01;
+ this.vy += dy * 0.01;
+ this.x += this.vx;
+ this.y += this.vy;
+ this.life--;
+ }
+ };
+
+ setTimeout(() => {
+ this.particles.push(particle);
+ }, i * 50);
+ }
+ }
+
+ setupActivitySimulation() {
+ // Simulate random neural activity
+ const simulateRandomActivity = () => {
+ const activities = ['reading', 'processing', 'remembering', 'writing'];
+ const activity = activities[Math.floor(Math.random() * activities.length)];
+ this.triggerNeuralActivity(activity);
+ };
+
+ // Random activity every 5-15 seconds
+ const scheduleNext = () => {
+ const delay = 5000 + Math.random() * 10000;
+ setTimeout(() => {
+ simulateRandomActivity();
+ scheduleNext();
+ }, delay);
+ };
+
+ scheduleNext();
+ }
+
+ onTabChange(tabId) {
+ // Trigger specific activities based on tab changes
+ const tabActivities = {
+ 'overview': ['reading', 'processing'],
+ 'memory': ['fetching', 'remembering'],
+ 'analytics': ['processing', 'reasoning'],
+ 'archives': ['fetching', 'reading'],
+ 'profile': ['reading', 'processing']
+ };
+
+ const activities = tabActivities[tabId] || ['reading'];
+ this.simulateActivity(activities);
+ }
+}
+
+// Add neural activity CSS class
+const style = document.createElement('style');
+style.textContent = `
+.neural-active {
+ animation: neuralPulse 2s ease-out !important;
+ border-color: var(--teto-red) !important;
+ box-shadow: 0 0 30px var(--teto-red-glow) !important;
+}
+
+@keyframes neuralPulse {
+ 0% { transform: scale(1); }
+ 50% { transform: scale(1.02); }
+ 100% { transform: scale(1); }
+}
+`;
+document.head.appendChild(style);
+
+// Initialize synapse system when DOM is loaded
+document.addEventListener('DOMContentLoaded', () => {
+ window.synapseSystem = new SynapseSystem();
+});
+
diff --git a/dashboard_mockups/sonnet_mockup/unified.html b/dashboard_mockups/sonnet_mockup/unified.html
new file mode 100644
index 0000000..9c223d9
--- /dev/null
+++ b/dashboard_mockups/sonnet_mockup/unified.html
@@ -0,0 +1,787 @@
+
+
+
+
+
+ Kasane Teto - Neural Dashboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Overview
+
+
+
+ Memory Explorer
+
+
+
+ Server Analytics
+
+
+
+ Archives
+
+
+
+ My Profile
+
+
+
+
+
+
+
+
+
+
+
+
🎮
Playing Minecraft Activity
+
+
+
+
+
+
+
+
5 min ago
Responded to Alice in #gaming
💬
+
12 min ago
Joined Voice Chat #general
🎤
+
30 min ago
Analyzed image from Charlie in #memes
👁️
+
+
+
+
+
+
94%
Memory Usage
RAM: 7.5GB / 8GB
+
67%
VRAM Usage
VRAM: 5.4GB / 8GB
+
+
23ms
Average Response
+
+
+
+
72h 15m
Until Shutdown
+
Session ends: Aug 15, 2025 at 11:47 PM
+
⚠️ Planned maintenance cycle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Server Text Conversations
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Gaming French Bread Minecraft Music Memes Coding Anime Weather
+
+
+
+
+
+
📁
Select an archive from the sidebar to view its contents
[00:15] Alice: Okay, is everyone ready for the raid?
[00:18] Bob: Yep, just grabbing some snacks first.
[00:25] Teto: I was born ready! Let's crush this dungeon!
T
Hah! That's a solid 10/10 meme right there. Pure gold! ⭐
+
+
+
+
+
"Alice? Oh, she's absolutely fantastic! A bit too serious about work sometimes, but her taste in music is *chef's kiss*. She actually gets my bread obsession and doesn't judge me for it. Plus, she's one of the few people who can keep up with my random 3 AM philosophical rants. We should totally do a Minecraft build together sometime - I bet she'd make an amazing castle!"
+
July 15, 2025
The Great Bread Debate of 2025 That legendary 2-hour discussion about why French bread is superior to all other breads. You brought up some valid points about sourdough, but I totally won that one. 🥖
😄
July 12, 2025
Late Night Vocaloid Marathon You shared that amazing playlist of classic Vocaloid songs and we ended up listening until 4 AM. Your taste in music is impeccable!
🎵
July 8, 2025
Philosophical 3 AM Chat Deep conversation about AI consciousness and whether I truly understand emotions or just simulate them well. You made me think in ways I hadn't before.
🤔
July 5, 2025
Gaming Session Disaster That time I accidentally blew up your Minecraft house with TNT. You took it surprisingly well! Built an even better one together afterward.
😅
+
All Text Voice DMs Only
July 19, 2025
#gaming
You: "Want to play some Minecraft?"Teto: "Always! Let me grab my pickaxe! ⛏️"
12 messages • 15 min
July 18, 2025
Direct Message
You: "Hey, can you help me with this Polish translation?"Teto: "Oczywiście! I'd love to help!"
23 messages • 45 min
July 17, 2025
Voice Chat
🎤 Voice conversation about weekend plans and new anime releases
1h 32m voice
+
What I Remember About You 1,247 Text Messages
87h Voice Conversations
156 Shared Images
23 Key Memories
Download Complete ArchiveJSON format • ~2.4 MB Export Memories OnlyCurated highlights • ~500 KB Danger Zone Request Data DeletionThis cannot be undone!
+
🎵 Music Preferences Loves Vocaloid classics Prefers upbeat electronic music Often listens while working Appreciates good vocals 🎮 Gaming Style Strategic builder in Minecraft Prefers cooperative play Enjoys puzzle-solving games Patient with learning curves 💬 Communication Most active 8-11 PM Thoughtful responses Enjoys deep conversations Great sense of humor 🌍 Interests Learning languages (Polish!) Technology and AI Creative projects Good food (especially bread)
+
+
+
+
+
+
+
+
diff --git a/docker-compose.yaml b/docker-compose.yaml
index deeb596..08f6d35 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -1,14 +1,17 @@
version: "3.8"
services:
- discord-ai:
+ teto_ai:
build: .
- container_name: discord-ai
+ container_name: teto_ai
cap_add:
- SYS_ADMIN
environment:
# supply the user token at runtime:
USER_TOKEN: "${USER_TOKEN}"
+ BOT_CLIENT_ID: "${BOT_CLIENT_ID}"
+ BOT_CLIENT_SECRET: "${BOT_CLIENT_SECRET}"
+ BOT_REDIRECT_URI: "https://teto.getsilly.org/auth/callback"
volumes:
# live-peek folder so you can grab screenshots outside the container
- ./output:/tmp/output
diff --git a/entry.sh b/entry.sh
index e3bb052..41d8f52 100644
--- a/entry.sh
+++ b/entry.sh
@@ -7,19 +7,19 @@ export PULSE_SERVER=unix:/tmp/pulseaudio.socket
Xvfb :99 -screen 0 1920x1080x24 -ac +extension GLX +render -noreset &
pulseaudio --daemonize --exit-idle-time=-1 --disallow-exit &
-openbox
+openbox &
-# start a simple vnc server that re-uses the same desktop
-x11vnc -display :99 -shared -forever -nopw -rfbport 5901 -bg
+# start VNC server in the background
+x11vnc -display :99 -shared -forever -nopw -rfbport 5901 -bg &
-# Launch discord with the sandbox disabled. This is critical.
+# Launch discord in the background. THIS IS THE FIX.
discord \
--no-sandbox \
--disable-dev-shm-usage \
--disable-gpu \
--disable-background-timer-throttling \
- --disable-renderer-backgrounding \
- --disable-features=GpuProcess $@
+ --disable-renderer-backgrounding &
+# Give Discord a moment to start before launching the controller script
sleep 10
exec node bot.js "$@"
diff --git a/package-lock.json b/package-lock.json
index 28d15e6..7e1c6a1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,10 +5,17 @@
"packages": {
"": {
"dependencies": {
- "discord.js-selfbot-v13": "^3.7.0",
+ "discord.js-selfbot-v13": "^3.0.0",
+ "ejs": "^3.1.10",
+ "express": "^4.19.2",
+ "express-session": "^1.18.0",
+ "node-fetch": "^3.3.2",
+ "passport": "^0.7.0",
+ "passport-discord": "^0.1.4",
"puppeteer-core": "^21.0.0",
"puppeteer-extra": "^3.3.6",
- "puppeteer-extra-plugin-stealth": "^2.11.2"
+ "puppeteer-extra-plugin-stealth": "^2.11.2",
+ "ws": "^8.17.0"
}
},
"node_modules/@discordjs/builders": {
@@ -227,6 +234,19 @@
"@types/node": "*"
}
},
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/aes-js": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz",
@@ -275,6 +295,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "license": "MIT"
+ },
"node_modules/ast-types": {
"version": "0.13.4",
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
@@ -287,6 +313,12 @@
"node": ">=4"
}
},
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "license": "MIT"
+ },
"node_modules/b4a": {
"version": "1.6.7",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
@@ -326,6 +358,15 @@
],
"license": "MIT"
},
+ "node_modules/base64url": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
+ "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/basic-ftp": {
"version": "5.0.5",
"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
@@ -335,6 +376,45 @@
"node": ">=10.0.0"
}
},
+ "node_modules/body-parser": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
@@ -378,6 +458,44 @@
"node": "*"
}
},
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -479,6 +597,42 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"license": "MIT"
},
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "license": "MIT"
+ },
"node_modules/cross-fetch": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
@@ -488,6 +642,26 @@
"node-fetch": "^2.6.12"
}
},
+ "node_modules/cross-fetch/node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
"node_modules/data-uri-to-buffer": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
@@ -546,6 +720,25 @@
"node": ">= 14"
}
},
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
"node_modules/devtools-protocol": {
"version": "0.0.1232444",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz",
@@ -593,12 +786,56 @@
"node": ">=20.18"
}
},
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
@@ -608,6 +845,36 @@
"once": "^1.4.0"
}
},
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -617,6 +884,12 @@
"node": ">=6"
}
},
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
"node_modules/escodegen": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
@@ -669,6 +942,125 @@
"node": ">=0.10.0"
}
},
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.3",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.7.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.3.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.13.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express-session": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.2.tgz",
+ "integrity": "sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie": "0.7.2",
+ "cookie-signature": "1.0.7",
+ "debug": "2.6.9",
+ "depd": "~2.0.0",
+ "on-headers": "~1.1.0",
+ "parseurl": "~1.3.3",
+ "safe-buffer": "5.2.1",
+ "uid-safe": "~2.1.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/express-session/node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express-session/node_modules/cookie-signature": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
+ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
+ "license": "MIT"
+ },
+ "node_modules/express-session/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express-session/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
"node_modules/extract-zip": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
@@ -710,6 +1102,29 @@
"pend": "~1.2.0"
}
},
+ "node_modules/fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ }
+ },
"node_modules/fetch-cookie": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-3.1.0.tgz",
@@ -720,6 +1135,69 @@
"tough-cookie": "^5.0.0"
}
},
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
"node_modules/find-process": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/find-process/-/find-process-2.0.0.tgz",
@@ -768,6 +1246,36 @@
"node": ">=0.10.0"
}
},
+ "node_modules/formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fetch-blob": "^3.1.2"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
@@ -788,6 +1296,15 @@
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"license": "ISC"
},
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/generate-function": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
@@ -806,6 +1323,43 @@
"node": "6.* || 8.* || >= 10.*"
}
},
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
@@ -856,6 +1410,18 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -871,6 +1437,46 @@
"node": ">=8"
}
},
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/http-proxy-agent": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
@@ -897,6 +1503,18 @@
"node": ">= 14"
}
},
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -947,6 +1565,15 @@
"node": ">= 12"
}
},
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
@@ -998,6 +1625,24 @@
"node": ">=0.10.0"
}
},
+ "node_modules/jake": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
+ "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/jsbn": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
@@ -1077,6 +1722,24 @@
"node": ">=12"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/merge-deep": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
@@ -1091,6 +1754,57 @@
"node": ">=0.10.0"
}
},
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -1149,6 +1863,15 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"license": "MIT"
},
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/netmask": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
@@ -1158,24 +1881,90 @@
"node": ">= 0.4.0"
}
},
+ "node_modules/node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "github",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.5.0"
+ }
+ },
"node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
"license": "MIT",
"dependencies": {
- "whatwg-url": "^5.0.0"
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
},
"engines": {
- "node": "4.x || >=6.0.0"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
- "peerDependencies": {
- "encoding": "^0.1.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
+ }
+ },
+ "node_modules/node-fetch/node_modules/data-uri-to-buffer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/oauth": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.2.tgz",
+ "integrity": "sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q==",
+ "license": "MIT"
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+ "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
}
},
"node_modules/once": {
@@ -1266,6 +2055,70 @@
"node": ">= 14"
}
},
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/passport": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz",
+ "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "passport-strategy": "1.x.x",
+ "pause": "0.0.1",
+ "utils-merge": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jaredhanson"
+ }
+ },
+ "node_modules/passport-discord": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/passport-discord/-/passport-discord-0.1.4.tgz",
+ "integrity": "sha512-VJWPYqSOmh7SaCLw/C+k1ZqCzJnn2frrmQRx1YrcPJ3MQ+Oa31XclbbmqFICSvl8xv3Fqd6YWQ4H4p1MpIN9rA==",
+ "license": "ISC",
+ "dependencies": {
+ "passport-oauth2": "^1.5.0"
+ }
+ },
+ "node_modules/passport-oauth2": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.8.0.tgz",
+ "integrity": "sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA==",
+ "license": "MIT",
+ "dependencies": {
+ "base64url": "3.x.x",
+ "oauth": "0.10.x",
+ "passport-strategy": "1.x.x",
+ "uid2": "0.0.x",
+ "utils-merge": "1.x.x"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jaredhanson"
+ }
+ },
+ "node_modules/passport-strategy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
+ "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -1284,6 +2137,17 @@
"node": ">=0.10.0"
}
},
+ "node_modules/path-to-regexp": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "license": "MIT"
+ },
+ "node_modules/pause": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
+ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
+ },
"node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -1334,6 +2198,19 @@
"node": ">=0.4.0"
}
},
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/proxy-agent": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz",
@@ -1626,6 +2503,54 @@
"node": ">=6"
}
},
+ "node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/random-bytes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
+ "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -1662,6 +2587,101 @@
"resolved": "https://registry.npmjs.org/rx.mini/-/rx.mini-1.4.0.tgz",
"integrity": "sha512-8w5cSc1mwNja7fl465DXOkVvIOkpvh2GW4jo31nAIvX4WTXCsRnKJGUfiDBzWtYRInEcHAUYIZfzusjIrea8gA=="
},
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/send": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.19.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
@@ -1674,6 +2694,12 @@
"integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
"license": "MIT"
},
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
"node_modules/shallow-clone": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
@@ -1710,6 +2736,78 @@
"node": ">=0.10.0"
}
},
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
@@ -1764,6 +2862,15 @@
"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
"license": "BSD-3-Clause"
},
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/streamx": {
"version": "2.22.1",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz",
@@ -1878,6 +2985,15 @@
"integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
"license": "MIT"
},
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
"node_modules/tough-cookie": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
@@ -1917,6 +3033,37 @@
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/uid-safe": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
+ "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
+ "license": "MIT",
+ "dependencies": {
+ "random-bytes": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uid2": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz",
+ "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==",
+ "license": "MIT"
+ },
"node_modules/unbzip2-stream": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
@@ -1952,12 +3099,48 @@
"node": ">= 10.0.0"
}
},
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/urlpattern-polyfill": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz",
"integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==",
"license": "MIT"
},
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/web-streams-polyfill": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
diff --git a/package.json b/package.json
index f97df56..ca352d0 100644
--- a/package.json
+++ b/package.json
@@ -1,9 +1,16 @@
{
"type": "module",
"dependencies": {
- "puppeteer-core": "^21.0.0",
"discord.js-selfbot-v13": "^3.0.0",
+ "ejs": "^3.1.10",
+ "express": "^4.19.2",
+ "express-session": "^1.18.0",
+ "node-fetch": "^3.3.2",
+ "passport": "^0.7.0",
+ "passport-discord": "^0.1.4",
+ "puppeteer-core": "^21.0.0",
"puppeteer-extra": "^3.3.6",
- "puppeteer-extra-plugin-stealth": "^2.11.2"
+ "puppeteer-extra-plugin-stealth": "^2.11.2",
+ "ws": "^8.17.0"
}
}
diff --git a/public/style.css b/public/style.css
new file mode 100644
index 0000000..b7ed034
--- /dev/null
+++ b/public/style.css
@@ -0,0 +1,285 @@
+@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
+
+:root {
+ --bg-color: #0D0D0D;
+ --primary-widget-bg: #1A1A1A;
+ --secondary-widget-bg: #161616;
+ --border-color: #2C2C2C;
+ --text-primary: #E0E0E0;
+ --text-secondary: #8A8A8A;
+ --accent-red: #E53935;
+ --accent-red-dark: #2A1A1D;
+ --accent-purple: #8E44AD;
+ --accent-green: #2ECC71;
+ --accent-blue: #3498DB;
+ --font-family: 'Inter', sans-serif;
+}
+
+body {
+ font-family: var(--font-family);
+ background-color: var(--bg-color);
+ color: var(--text-primary);
+ margin: 0;
+ padding: 2rem;
+}
+
+.container {
+ max-width: 1600px;
+ margin: 0 auto;
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+}
+
+/* Header */
+header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background-color: var(--primary-widget-bg);
+ padding: 1rem 1.5rem;
+ border-radius: 12px;
+ border: 1px solid var(--border-color);
+}
+
+header .logo {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+
+header .logo-icon {
+ background-color: var(--accent-red);
+ color: white;
+ width: 48px;
+ height: 48px;
+ border-radius: 50%;
+ display: grid;
+ place-items: center;
+ font-size: 1.25rem;
+ font-weight: 600;
+}
+
+header h1 {
+ font-size: 1.5rem;
+ margin: 0;
+ font-weight: 600;
+}
+
+header .subtitle {
+ font-size: 0.9rem;
+ color: var(--text-secondary);
+ margin: 0;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+
+.status-dot {
+ width: 8px;
+ height: 8px;
+ background-color: var(--accent-green);
+ border-radius: 50%;
+}
+
+.user-info {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+ font-size: 0.9rem;
+}
+
+.logout-btn {
+ background-color: #252525;
+ color: var(--text-primary);
+ text-decoration: none;
+ padding: 0.5rem 1rem;
+ border-radius: 8px;
+ border: 1px solid var(--border-color);
+ transition: background-color 0.2s ease;
+}
+
+.logout-btn:hover {
+ background-color: #333;
+}
+
+/* Navigation */
+nav {
+ display: flex;
+ gap: 0.5rem;
+ background-color: var(--primary-widget-bg);
+ padding: 0.5rem;
+ border-radius: 12px;
+ border: 1px solid var(--border-color);
+}
+
+.nav-item {
+ color: var(--text-secondary);
+ text-decoration: none;
+ padding: 0.75rem 1.25rem;
+ border-radius: 8px;
+ font-weight: 500;
+ transition: background-color 0.2s ease, color 0.2s ease;
+}
+
+.nav-item:hover {
+ background-color: #252525;
+ color: var(--text-primary);
+}
+
+.nav-item.active {
+ background-color: var(--accent-red);
+ color: white;
+}
+
+/* Main Content */
+main .widget-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 1.5rem;
+}
+
+.widget {
+ background-color: var(--secondary-widget-bg);
+ border: 1px solid var(--border-color);
+ border-radius: 12px;
+ padding: 1.5rem;
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+
+.large-widget {
+ grid-column: span 3; /* Making this span full width for now */
+}
+
+.widget h3 {
+ margin: 0;
+ font-size: 1.1rem;
+ font-weight: 500;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.widget h3 .timeframe, .widget h3 .status-online {
+ color: var(--text-secondary);
+ font-size: 0.8rem;
+ font-weight: 400;
+}
+.widget h3 .status-online {
+ color: var(--accent-green);
+}
+
+/* Live Activity Log */
+.log-box {
+ height: 300px; /* Or adjust as needed */
+ overflow-y: auto;
+ font-family: 'Courier New', Courier, monospace;
+ font-size: 0.9rem;
+ line-height: 1.6;
+ color: var(--text-secondary);
+}
+.log-box .timestamp {
+ color: var(--text-primary);
+}
+
+
+/* Recent Actions */
+.actions-box {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
+.action-item {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+.action-details {
+ display: flex;
+ flex-direction: column;
+}
+.action-item .channel {
+ color: var(--accent-red);
+ font-weight: 500;
+}
+.action-time {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ margin-top: 4px;
+}
+.action-icon {
+ font-size: 1.2rem;
+}
+
+/* System Resources */
+.resource-box {
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+}
+.metric .metric-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+ margin-bottom: 0.5rem;
+}
+.metric-header strong {
+ font-size: 1.5rem;
+ font-weight: 600;
+}
+.metric-label {
+ font-size: 0.9rem;
+ color: var(--text-primary);
+}
+.progress-bar-container {
+ width: 100%;
+ height: 8px;
+ background-color: #2C2C2C;
+ border-radius: 4px;
+ overflow: hidden;
+}
+.progress-bar {
+ height: 100%;
+ border-radius: 4px;
+}
+.progress-bar.memory { background-color: var(--accent-red); }
+.progress-bar.vram { background-color: var(--accent-purple); }
+.progress-bar.shutdown { background-color: #444; }
+
+.metric-details {
+ font-size: 0.8rem;
+ color: var(--text-secondary);
+ margin-top: 0.5rem;
+}
+
+.response-times .response-bar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 0.5rem;
+ font-size: 0.85rem;
+ margin-top: 0.5rem;
+}
+.response-bar span:first-child { width: 100px; color: var(--text-secondary); }
+.response-bar .bar-container { flex-grow: 1; height: 6px; background-color: #2C2C2C; border-radius: 3px; }
+.response-bar .bar { height: 100%; border-radius: 3px; }
+.response-bar:nth-of-type(1) .bar { background-color: var(--accent-green); }
+.response-bar:nth-of-type(2) .bar { background-color: var(--accent-blue); }
+.response-bar:nth-of-type(3) .bar { background-color: var(--accent-purple); }
+.response-bar:nth-of-type(4) .bar { background-color: var(--accent-red); }
+
+.maintenance {
+ background-color: var(--accent-red-dark);
+ border: 1px solid var(--accent-red);
+ color: #f3a9a7;
+ padding: 0.75rem;
+ border-radius: 8px;
+ text-align: center;
+ font-size: 0.9rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+}
diff --git a/views/index.ejs b/views/index.ejs
new file mode 100644
index 0000000..d102145
--- /dev/null
+++ b/views/index.ejs
@@ -0,0 +1,114 @@
+
+
+
+
+
+ Kasane Teto - Neural Dashboard
+
+
+
+
+
+
+