reachy-blocks / src /practice.ts
Claude
feat: block interpreter with Run/Stop, logic branches, and step budget
b0f6cf1 unverified
Raw
History Blame Contribute Delete
1.51 kB
// Practice mode: no robot, no auth — the on-screen puppet runs programs.
// Also the harness for e2e tests via the window.__reachy hooks.
import "./app/styles.css";
import type * as Blockly from "blockly";
import { bootApp, type App } from "./app/boot";
import type { CommandLog } from "./util/log";
import type { RobotAdapter } from "./robot/adapter";
import type { Runner } from "./interpreter/runner";
import { VirtualRobotAdapter } from "./robot/virtual";
import { makeEmotionSource, makeSoundSource } from "./emotions/sources";
declare global {
interface Window {
__reachy?: {
version: number;
robot: RobotAdapter;
log: CommandLog;
workspace: Blockly.WorkspaceSvg;
runner: Runner;
app: App;
loadProgram(state: object): void;
setRandom(fn: () => number): void;
};
}
}
const params = new URLSearchParams(window.location.search);
const theme = document.documentElement.getAttribute("data-theme") === "light" ? "light" : "dark";
const app = bootApp(document.getElementById("root")!, {
theme,
fresh: params.get("fresh") === "1",
attachRobot: (puppetHost, log) => new VirtualRobotAdapter(puppetHost, log),
emotions: makeEmotionSource({ stub: params.get("emotions") === "stub" }),
sounds: makeSoundSource(),
});
window.__reachy = {
version: 1,
robot: app.robot,
log: app.log,
workspace: app.workspace,
runner: app.runner,
app,
loadProgram: (state) => app.loadProgram(state),
setRandom: (fn) => app.setRandom(fn),
};