Operator tasks move from the Inbox into Tasks with the Waits on Operator filter. Review and commit asks carry the staged diff; a file whose old or new blob holds an armour line or a detection-pattern match, or every file when no pattern loads, ships only its path, status, mode and counts. The approval binds to the staged tree id from git write-tree, the encoded request body respects the hub limit, and the hub image ships every client module signed.py loads. Committed below the bar on the operator's word 2026-11-12 (no further per-bundle tests, one gate after the merge): the full hub suite and the W1 e2e never ran, two high MEDUSA rows (sandbox_paths.py FLOOR, permission_hook.py ask POST) wait for their acceptance. 🎯 Fix: 85 % 💥 Break: 12 % 💸 Cost: 30 % ⏱️ Time: 30 % 🛡️ Security: 50 % 🏆 Score: 100 🚦 Gate: ⛔ fix 85 % < 90, break 12 % > 5; security 50 % < 100: ask the operator before the commit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
64 lines
2.2 KiB
JavaScript
64 lines
2.2 KiB
JavaScript
document.getElementById("palette").addEventListener("click", (event) => {
|
|
if (event.target === event.currentTarget) {
|
|
closePalette();
|
|
}
|
|
});
|
|
document.getElementById("sheet").addEventListener("click", (event) => {
|
|
if (event.target === event.currentTarget) {
|
|
closeSheet();
|
|
}
|
|
});
|
|
popupDialog().addEventListener("click", (event) => {
|
|
if (event.target === event.currentTarget) {
|
|
closePopup();
|
|
}
|
|
});
|
|
document.getElementById("palette-open").addEventListener("click", openPalette);
|
|
document.getElementById("settings-open").addEventListener("click", settingsSheet);
|
|
document.getElementById("bubbles-toggle").addEventListener("click", toggleBubbles);
|
|
document.addEventListener("click", (event) => closeMenus(event.target instanceof Element ? event.target.closest("details.menu") : null));
|
|
document.addEventListener("fullscreenchange", () => {
|
|
if (!document.fullscreenElement) {
|
|
document.body.classList.remove("leitstand");
|
|
}
|
|
window.setTimeout(measure, 50);
|
|
});
|
|
document.addEventListener("pointerdown", context, {once: true});
|
|
document.addEventListener("keydown", context, {once: true});
|
|
document.addEventListener("pointerdown", unlock);
|
|
document.addEventListener("keydown", keyboard);
|
|
document.addEventListener("contextmenu", feedbackMenu);
|
|
document.addEventListener("selectionchange", feedbackButton);
|
|
document.addEventListener("visibilitychange", refresh);
|
|
window.addEventListener("hashchange", apply);
|
|
window.addEventListener("resize", measure);
|
|
window.addEventListener("resize", redrawSky);
|
|
window.addEventListener("resize", refresh3d);
|
|
window.addEventListener("resize", placePopup);
|
|
skyPanel();
|
|
radioSpot();
|
|
radio.element = radioElement();
|
|
drawSky();
|
|
musicButton();
|
|
syncBubbles();
|
|
syncMusic();
|
|
syncRadio();
|
|
timeBar();
|
|
notifyLabel();
|
|
announce();
|
|
measure();
|
|
apply();
|
|
drawTime();
|
|
motion.asOf = ui.asOf;
|
|
relayout(0);
|
|
window.setInterval(refresh, 10000);
|
|
window.setInterval(follow, 3000);
|
|
window.setInterval(() => relayout(MOVE), RELAYOUT);
|
|
window.setInterval(() => live() && drawSky(), 30000);
|
|
window.setInterval(syncRadio, 20000);
|
|
window.setInterval(() => {
|
|
if (tree.dom && !document.hidden) {
|
|
fetchTree();
|
|
}
|
|
}, 60000);
|