Something went wrong. Try again.
Monorepo for Aesthetic.Computer aesthetic.computer
Something went wrong. Try again.
6.2 kB ยท 204 lines
JavaScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205#!/usr/bin/env node/** * KidLisp.com Probe - Inspect and control kidlisp.com in Simple Browser via CDP * * Usage: * node kidlisp-probe.mjs # Show status * node kidlisp-probe.mjs eval <js> # Evaluate JS in kidlisp.com * node kidlisp-probe.mjs theme # Toggle theme * node kidlisp-probe.mjs clear # Clear editor * node kidlisp-probe.mjs set <code> # Set editor content */
import http from 'http';import WebSocket from 'ws';
const CDP_HOST = process.env.REMOTE_CONTAINERS === 'true' ? 'host.docker.internal' : 'localhost';
const PINK = '\x1b[95m';const CYAN = '\x1b[96m';const GREEN = '\x1b[92m';const YELLOW = '\x1b[93m';const RED = '\x1b[91m';const RESET = '\x1b[0m';const BOLD = '\x1b[1m';
async function findKidlispTarget() { const targets = await new Promise((resolve, reject) => { http.get({ hostname: CDP_HOST, port: 9222, path: '/json', headers: { 'Host': 'localhost' } }, (res) => { let data = ''; res.on('data', (chunk) => data += chunk); res.on('end', () => resolve(JSON.parse(data))); }).on('error', reject); }); return targets.find(t => t.url?.includes('kidlisp.com'));}
async function connectToKidlisp() { const target = await findKidlispTarget(); if (!target) { console.log(`${RED}โ kidlisp.com not open in Simple Browser${RESET}`); console.log(`${YELLOW}Tip: Open it with: open_simple_browser https://localhost:8888/kidlisp.com${RESET}`); process.exit(1); } let wsUrl = target.webSocketDebuggerUrl; wsUrl = wsUrl.replace('localhost', `${CDP_HOST}:9222`).replace(':9222:9222', ':9222'); const ws = new WebSocket(wsUrl); await new Promise((resolve, reject) => { ws.on('open', resolve); ws.on('error', reject); setTimeout(() => reject(new Error('Connection timeout')), 5000); }); return ws;}
async function evalInKidlisp(ws, expression) { return new Promise((resolve, reject) => { const id = Math.floor(Math.random() * 1000000); const handler = (data) => { const msg = JSON.parse(data); if (msg.id === id) { ws.off('message', handler); if (msg.error) { reject(new Error(msg.error.message)); } else if (msg.result?.exceptionDetails) { reject(new Error(msg.result.exceptionDetails.text)); } else { resolve(msg.result?.result?.value); } } }; ws.on('message', handler); ws.send(JSON.stringify({ id, method: 'Runtime.evaluate', params: { expression, returnByValue: true, awaitPromise: true } })); setTimeout(() => reject(new Error('Timeout')), 10000); });}
async function showStatus(ws) { const info = await evalInKidlisp(ws, `({ title: document.title, logoText: document.querySelector('.baby-colors')?.textContent, previewTitle: document.querySelector('#preview-title')?.textContent, consoleEntries: document.querySelectorAll('.console-entry').length, hasEditor: !!window.monaco, currentTheme: document.documentElement.getAttribute('data-theme') || 'auto', editorContent: window.monaco?.editor?.getModels()?.[0]?.getValue?.() || '(editor not loaded)', isPlaying: document.querySelector('#send-button')?.classList?.contains('playing') || false, connectivity: document.querySelector('.connectivity-dot')?.classList?.value || '' })`); console.log(`${CYAN}${BOLD}๐ KidLisp.com Status${RESET}`); console.log('โ'.repeat(50)); console.log(`${PINK}๐ Title:${RESET}`, info.title); console.log(`${PINK}๐จ Logo:${RESET}`, info.logoText); console.log(`${PINK}๐บ Preview:${RESET}`, info.previewTitle); console.log(`${PINK}๐ Console entries:${RESET}`, info.consoleEntries); console.log(`${PINK}โก Monaco loaded:${RESET}`, info.hasEditor ? `${GREEN}Yes${RESET}` : `${RED}No${RESET}`); console.log(`${PINK}๐ Theme:${RESET}`, info.currentTheme); console.log(`${PINK}โถ๏ธ Playing:${RESET}`, info.isPlaying ? `${GREEN}Yes${RESET}` : 'No'); console.log(`${PINK}๐ Connectivity:${RESET}`, info.connectivity); console.log(''); console.log(`${YELLOW}๐ Editor content:${RESET}`); console.log('โ'.repeat(50)); console.log(info.editorContent); console.log('โ'.repeat(50));}
async function toggleTheme(ws) { await evalInKidlisp(ws, ` const toggle = document.getElementById('theme-toggle'); toggle?.click(); document.documentElement.getAttribute('data-theme') || 'toggled' `); console.log(`${GREEN}โ
Theme toggled${RESET}`);}
async function clearEditor(ws) { await evalInKidlisp(ws, ` const model = window.monaco?.editor?.getModels()?.[0]; if (model) model.setValue(''); 'cleared' `); console.log(`${GREEN}โ
Editor cleared${RESET}`);}
async function setEditorContent(ws, content) { await evalInKidlisp(ws, ` const model = window.monaco?.editor?.getModels()?.[0]; if (model) model.setValue(${JSON.stringify(content)}); 'set' `); console.log(`${GREEN}โ
Editor content set${RESET}`);}
async function pressPlay(ws) { await evalInKidlisp(ws, ` document.getElementById('send-button')?.click(); 'clicked' `); console.log(`${GREEN}โ
Play button pressed${RESET}`);}
async function main() { const command = process.argv[2]; const args = process.argv.slice(3); try { const ws = await connectToKidlisp(); console.log(`${GREEN}๐ Connected to kidlisp.com${RESET}`); switch (command) { case 'eval': const result = await evalInKidlisp(ws, args.join(' ')); console.log(`${CYAN}Result:${RESET}`, result); break; case 'theme': await toggleTheme(ws); break; case 'clear': await clearEditor(ws); break; case 'set': await setEditorContent(ws, args.join(' ')); break; case 'play': await pressPlay(ws); break; default: await showStatus(ws); } ws.close(); } catch (error) { console.error(`${RED}โ Error: ${error.message}${RESET}`); process.exit(1); }}
main();